/**
 * @licstart The following is the entire license notice for the
 * Javascript code in this page
 *
 * Copyright 2020 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
 */
!function webpackUniversalModuleDefinition(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("pdfjs-dist/build/pdf",[],t):"object"==typeof exports?exports["pdfjs-dist/build/pdf"]=t():e["pdfjs-dist/build/pdf"]=e.pdfjsLib=t()}(this,(function(){return function(e){var t={};function __w_pdfjs_require__(r){if(t[r])return t[r].exports;var n=t[r]={i:r,l:!1,exports:{}};e[r].call(n.exports,n,n.exports,__w_pdfjs_require__);n.l=!0;return n.exports}__w_pdfjs_require__.m=e;__w_pdfjs_require__.c=t;__w_pdfjs_require__.d=function(e,t,r){__w_pdfjs_require__.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})};__w_pdfjs_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"});Object.defineProperty(e,"__esModule",{value:!0})};__w_pdfjs_require__.t=function(e,t){1&t&&(e=__w_pdfjs_require__(e));if(8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);__w_pdfjs_require__.r(r);Object.defineProperty(r,"default",{enumerable:!0,value:e});if(2&t&&"string"!=typeof e)for(var n in e)__w_pdfjs_require__.d(r,n,function(t){return e[t]}.bind(null,n));return r};__w_pdfjs_require__.n=function(e){var t=e&&e.__esModule?function getDefault(){return e.default}:function getModuleExports(){return e};__w_pdfjs_require__.d(t,"a",t);return t};__w_pdfjs_require__.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};__w_pdfjs_require__.p="";return __w_pdfjs_require__(__w_pdfjs_require__.s=0)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});Object.defineProperty(t,"addLinkAttributes",{enumerable:!0,get:function(){return n.addLinkAttributes}});Object.defineProperty(t,"getFilenameFromUrl",{enumerable:!0,get:function(){return n.getFilenameFromUrl}});Object.defineProperty(t,"LinkTarget",{enumerable:!0,get:function(){return n.LinkTarget}});Object.defineProperty(t,"loadScript",{enumerable:!0,get:function(){return n.loadScript}});Object.defineProperty(t,"PDFDateString",{enumerable:!0,get:function(){return n.PDFDateString}});Object.defineProperty(t,"RenderingCancelledException",{enumerable:!0,get:function(){return n.RenderingCancelledException}});Object.defineProperty(t,"build",{enumerable:!0,get:function(){return s.build}});Object.defineProperty(t,"getDocument",{enumerable:!0,get:function(){return s.getDocument}});Object.defineProperty(t,"LoopbackPort",{enumerable:!0,get:function(){return s.LoopbackPort}});Object.defineProperty(t,"PDFDataRangeTransport",{enumerable:!0,get:function(){return s.PDFDataRangeTransport}});Object.defineProperty(t,"PDFWorker",{enumerable:!0,get:function(){return s.PDFWorker}});Object.defineProperty(t,"version",{enumerable:!0,get:function(){return s.version}});Object.defineProperty(t,"CMapCompressionType",{enumerable:!0,get:function(){return a.CMapCompressionType}});Object.defineProperty(t,"createObjectURL",{enumerable:!0,get:function(){return a.createObjectURL}});Object.defineProperty(t,"createPromiseCapability",{enumerable:!0,get:function(){return a.createPromiseCapability}});Object.defineProperty(t,"createValidAbsoluteUrl",{enumerable:!0,get:function(){return a.createValidAbsoluteUrl}});Object.defineProperty(t,"InvalidPDFException",{enumerable:!0,get:function(){return a.InvalidPDFException}});Object.defineProperty(t,"MissingPDFException",{enumerable:!0,get:function(){return a.MissingPDFException}});Object.defineProperty(t,"OPS",{enumerable:!0,get:function(){return a.OPS}});Object.defineProperty(t,"PasswordResponses",{enumerable:!0,get:function(){return a.PasswordResponses}});Object.defineProperty(t,"PermissionFlag",{enumerable:!0,get:function(){return a.PermissionFlag}});Object.defineProperty(t,"removeNullCharacters",{enumerable:!0,get:function(){return a.removeNullCharacters}});Object.defineProperty(t,"shadow",{enumerable:!0,get:function(){return a.shadow}});Object.defineProperty(t,"UnexpectedResponseException",{enumerable:!0,get:function(){return a.UnexpectedResponseException}});Object.defineProperty(t,"UNSUPPORTED_FEATURES",{enumerable:!0,get:function(){return a.UNSUPPORTED_FEATURES}});Object.defineProperty(t,"Util",{enumerable:!0,get:function(){return a.Util}});Object.defineProperty(t,"VerbosityLevel",{enumerable:!0,get:function(){return a.VerbosityLevel}});Object.defineProperty(t,"AnnotationLayer",{enumerable:!0,get:function(){return i.AnnotationLayer}});Object.defineProperty(t,"apiCompatibilityParams",{enumerable:!0,get:function(){return o.apiCompatibilityParams}});Object.defineProperty(t,"GlobalWorkerOptions",{enumerable:!0,get:function(){return l.GlobalWorkerOptions}});Object.defineProperty(t,"renderTextLayer",{enumerable:!0,get:function(){return c.renderTextLayer}});Object.defineProperty(t,"SVGGraphics",{enumerable:!0,get:function(){return h.SVGGraphics}});var n=r(1),s=r(5),a=r(2),i=r(19),o=r(9),l=r(12),c=r(20),h=r(21);{const{isNodeJS:e}=r(4);if(e){const e=r(22).PDFNodeStream;(0,s.setPDFNetworkStreamFactory)(t=>new e(t))}else{const e=r(25).PDFNetworkStream;let t;(0,n.isFetchSupported)()&&(t=r(26).PDFFetchStream);(0,s.setPDFNetworkStreamFactory)(r=>t&&(0,n.isValidFetchUrl)(r.url)?new t(r):new e(r))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.addLinkAttributes=function addLinkAttributes(e,{url:t,target:r,rel:s,enabled:i=!0}={}){(0,n.assert)(t&&"string"==typeof t,'addLinkAttributes: A valid "url" parameter must provided.');const o=(0,n.removeNullCharacters)(t);if(i)e.href=e.title=o;else{e.href="";e.title="Disabled: "+o;e.onclick=()=>!1}let l="";switch(r){case a.NONE:break;case a.SELF:l="_self";break;case a.BLANK:l="_blank";break;case a.PARENT:l="_parent";break;case a.TOP:l="_top"}e.target=l;e.rel="string"==typeof s?s:"noopener noreferrer nofollow"};t.getFilenameFromUrl=function getFilenameFromUrl(e){const t=e.indexOf("#"),r=e.indexOf("?"),n=Math.min(t>0?t:e.length,r>0?r:e.length);return e.substring(e.lastIndexOf("/",n)+1,n)};t.isFetchSupported=isFetchSupported;t.isValidFetchUrl=isValidFetchUrl;t.loadScript=function loadScript(e){return new Promise((t,r)=>{const n=document.createElement("script");n.src=e;n.onload=t;n.onerror=function(){r(new Error("Cannot load script at: "+n.src))};(document.head||document.documentElement).appendChild(n)})};t.deprecated=function deprecated(e){console.log("Deprecated API usage: "+e)};t.PDFDateString=t.StatTimer=t.DOMSVGFactory=t.DOMCMapReaderFactory=t.BaseCMapReaderFactory=t.DOMCanvasFactory=t.BaseCanvasFactory=t.DEFAULT_LINK_REL=t.LinkTarget=t.RenderingCancelledException=t.PageViewport=void 0;var n=r(2);t.DEFAULT_LINK_REL="noopener noreferrer nofollow";const s="http://www.w3.org/2000/svg";class BaseCanvasFactory{constructor(){this.constructor===BaseCanvasFactory&&(0,n.unreachable)("Cannot initialize BaseCanvasFactory.")}create(e,t){(0,n.unreachable)("Abstract method `create` called.")}reset(e,t,r){if(!e.canvas)throw new Error("Canvas is not specified");if(t<=0||r<=0)throw new Error("Invalid canvas size");e.canvas.width=t;e.canvas.height=r}destroy(e){if(!e.canvas)throw new Error("Canvas is not specified");e.canvas.width=0;e.canvas.height=0;e.canvas=null;e.context=null}}t.BaseCanvasFactory=BaseCanvasFactory;t.DOMCanvasFactory=class DOMCanvasFactory extends BaseCanvasFactory{constructor({ownerDocument:e=globalThis.document}={}){super();this._document=e}create(e,t){if(e<=0||t<=0)throw new Error("Invalid canvas size");const r=this._document.createElement("canvas"),n=r.getContext("2d");r.width=e;r.height=t;return{canvas:r,context:n}}};class BaseCMapReaderFactory{constructor({baseUrl:e=null,isCompressed:t=!1}){this.constructor===BaseCMapReaderFactory&&(0,n.unreachable)("Cannot initialize BaseCMapReaderFactory.");this.baseUrl=e;this.isCompressed=t}async fetch({name:e}){if(!this.baseUrl)throw new Error('The CMap "baseUrl" parameter must be specified, ensure that the "cMapUrl" and "cMapPacked" API parameters are provided.');if(!e)throw new Error("CMap name must be specified.");const t=this.baseUrl+e+(this.isCompressed?".bcmap":""),r=this.isCompressed?n.CMapCompressionType.BINARY:n.CMapCompressionType.NONE;return this._fetchData(t,r).catch(e=>{throw new Error(`Unable to load ${this.isCompressed?"binary ":""}CMap at: ${t}`)})}_fetchData(e,t){(0,n.unreachable)("Abstract method `_fetchData` called.")}}t.BaseCMapReaderFactory=BaseCMapReaderFactory;t.DOMCMapReaderFactory=class DOMCMapReaderFactory extends BaseCMapReaderFactory{_fetchData(e,t){return isFetchSupported()&&isValidFetchUrl(e,document.baseURI)?fetch(e).then(async e=>{if(!e.ok)throw new Error(e.statusText);let r;r=this.isCompressed?new Uint8Array(await e.arrayBuffer()):(0,n.stringToBytes)(await e.text());return{cMapData:r,compressionType:t}}):new Promise((r,s)=>{const a=new XMLHttpRequest;a.open("GET",e,!0);this.isCompressed&&(a.responseType="arraybuffer");a.onreadystatechange=()=>{if(a.readyState===XMLHttpRequest.DONE){if(200===a.status||0===a.status){let e;this.isCompressed&&a.response?e=new Uint8Array(a.response):!this.isCompressed&&a.responseText&&(e=(0,n.stringToBytes)(a.responseText));if(e){r({cMapData:e,compressionType:t});return}}s(new Error(a.statusText))}};a.send(null)})}};t.DOMSVGFactory=class DOMSVGFactory{create(e,t){(0,n.assert)(e>0&&t>0,"Invalid SVG dimensions");const r=document.createElementNS(s,"svg:svg");r.setAttribute("version","1.1");r.setAttribute("width",e+"px");r.setAttribute("height",t+"px");r.setAttribute("preserveAspectRatio","none");r.setAttribute("viewBox","0 0 "+e+" "+t);return r}createElement(e){(0,n.assert)("string"==typeof e,"Invalid SVG element type");return document.createElementNS(s,e)}};class PageViewport{constructor({viewBox:e,scale:t,rotation:r,offsetX:n=0,offsetY:s=0,dontFlip:a=!1}){this.viewBox=e;this.scale=t;this.rotation=r;this.offsetX=n;this.offsetY=s;const i=(e[2]+e[0])/2,o=(e[3]+e[1])/2;let l,c,h,d,u,p,f,g;switch(r=(r%=360)<0?r+360:r){case 180:l=-1;c=0;h=0;d=1;break;case 90:l=0;c=1;h=1;d=0;break;case 270:l=0;c=-1;h=-1;d=0;break;case 0:l=1;c=0;h=0;d=-1;break;default:throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.")}if(a){h=-h;d=-d}if(0===l){u=Math.abs(o-e[1])*t+n;p=Math.abs(i-e[0])*t+s;f=Math.abs(e[3]-e[1])*t;g=Math.abs(e[2]-e[0])*t}else{u=Math.abs(i-e[0])*t+n;p=Math.abs(o-e[1])*t+s;f=Math.abs(e[2]-e[0])*t;g=Math.abs(e[3]-e[1])*t}this.transform=[l*t,c*t,h*t,d*t,u-l*t*i-h*t*o,p-c*t*i-d*t*o];this.width=f;this.height=g}clone({scale:e=this.scale,rotation:t=this.rotation,offsetX:r=this.offsetX,offsetY:n=this.offsetY,dontFlip:s=!1}={}){return new PageViewport({viewBox:this.viewBox.slice(),scale:e,rotation:t,offsetX:r,offsetY:n,dontFlip:s})}convertToViewportPoint(e,t){return n.Util.applyTransform([e,t],this.transform)}convertToViewportRectangle(e){const t=n.Util.applyTransform([e[0],e[1]],this.transform),r=n.Util.applyTransform([e[2],e[3]],this.transform);return[t[0],t[1],r[0],r[1]]}convertToPdfPoint(e,t){return n.Util.applyInverseTransform([e,t],this.transform)}}t.PageViewport=PageViewport;class RenderingCancelledException extends n.BaseException{constructor(e,t){super(e);this.type=t}}t.RenderingCancelledException=RenderingCancelledException;const a={NONE:0,SELF:1,BLANK:2,PARENT:3,TOP:4};t.LinkTarget=a;t.StatTimer=class StatTimer{constructor(){this.started=Object.create(null);this.times=[]}time(e){e in this.started&&(0,n.warn)("Timer is already running for "+e);this.started[e]=Date.now()}timeEnd(e){e in this.started||(0,n.warn)("Timer has not been started for "+e);this.times.push({name:e,start:this.started[e],end:Date.now()});delete this.started[e]}toString(){const e=[];let t=0;for(const e of this.times){const r=e.name;r.length>t&&(t=r.length)}for(const r of this.times){const n=r.end-r.start;e.push(`${r.name.padEnd(t)} ${n}ms\n`)}return e.join("")}};function isFetchSupported(){return"undefined"!=typeof fetch&&"undefined"!=typeof Response&&"body"in Response.prototype&&"undefined"!=typeof ReadableStream}function isValidFetchUrl(e,t){try{const{protocol:r}=t?new URL(e,t):new URL(e);return"http:"===r||"https:"===r}catch(e){return!1}}let i;t.PDFDateString=class PDFDateString{static toDateObject(e){if(!e||!(0,n.isString)(e))return null;i||(i=new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?"));const t=i.exec(e);if(!t)return null;const r=parseInt(t[1],10);let s=parseInt(t[2],10);s=s>=1&&s<=12?s-1:0;let a=parseInt(t[3],10);a=a>=1&&a<=31?a:1;let o=parseInt(t[4],10);o=o>=0&&o<=23?o:0;let l=parseInt(t[5],10);l=l>=0&&l<=59?l:0;let c=parseInt(t[6],10);c=c>=0&&c<=59?c:0;const h=t[7]||"Z";let d=parseInt(t[8],10);d=d>=0&&d<=23?d:0;let u=parseInt(t[9],10)||0;u=u>=0&&u<=59?u:0;if("-"===h){o+=d;l+=u}else if("+"===h){o-=d;l-=u}return new Date(Date.UTC(r,s,a,o,l,c))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.arrayByteLength=arrayByteLength;t.arraysToBytes=function arraysToBytes(e){const t=e.length;if(1===t&&e[0]instanceof Uint8Array)return e[0];let r=0;for(let n=0;n<t;n++)r+=arrayByteLength(e[n]);let n=0;const s=new Uint8Array(r);for(let r=0;r<t;r++){let t=e[r];t instanceof Uint8Array||(t="string"==typeof t?stringToBytes(t):new Uint8Array(t));const a=t.byteLength;s.set(t,n);n+=a}return s};t.assert=assert;t.bytesToString=function bytesToString(e){assert(null!==e&&"object"==typeof e&&void 0!==e.length,"Invalid argument for bytesToString");const t=e.length;if(t<8192)return String.fromCharCode.apply(null,e);const r=[];for(let n=0;n<t;n+=8192){const s=Math.min(n+8192,t),a=e.subarray(n,s);r.push(String.fromCharCode.apply(null,a))}return r.join("")};t.createPromiseCapability=function createPromiseCapability(){const e=Object.create(null);let t=!1;Object.defineProperty(e,"settled",{get:()=>t});e.promise=new Promise((function(r,n){e.resolve=function(e){t=!0;r(e)};e.reject=function(e){t=!0;n(e)}}));return e};t.escapeString=function escapeString(e){return e.replace(/([\(\)\\])/g,"\\$1")};t.getModificationDate=function getModificationDate(e=new Date(Date.now())){return[e.getUTCFullYear().toString(),(e.getUTCMonth()+1).toString().padStart(2,"0"),(e.getUTCDate()+1).toString().padStart(2,"0"),e.getUTCHours().toString().padStart(2,"0"),e.getUTCMinutes().toString().padStart(2,"0"),e.getUTCSeconds().toString().padStart(2,"0")].join("")};t.getVerbosityLevel=function getVerbosityLevel(){return s};t.info=function info(e){s>=n.INFOS&&console.log("Info: "+e)};t.isArrayBuffer=function isArrayBuffer(e){return"object"==typeof e&&null!==e&&void 0!==e.byteLength};t.isArrayEqual=function isArrayEqual(e,t){if(e.length!==t.length)return!1;return e.every((function(e,r){return e===t[r]}))};t.isBool=function isBool(e){return"boolean"==typeof e};t.isNum=function isNum(e){return"number"==typeof e};t.isString=function isString(e){return"string"==typeof e};t.isSameOrigin=function isSameOrigin(e,t){let r;try{r=new URL(e);if(!r.origin||"null"===r.origin)return!1}catch(e){return!1}const n=new URL(t,r);return r.origin===n.origin};t.createValidAbsoluteUrl=function createValidAbsoluteUrl(e,t){if(!e)return null;try{const r=t?new URL(e,t):new URL(e);if(function _isValidProtocol(e){if(!e)return!1;switch(e.protocol){case"http:":case"https:":case"ftp:":case"mailto:":case"tel:":return!0;default:return!1}}(r))return r}catch(e){}return null};t.removeNullCharacters=function removeNullCharacters(e){if("string"!=typeof e){warn("The argument for removeNullCharacters must be a string.");return e}return e.replace(i,"")};t.setVerbosityLevel=function setVerbosityLevel(e){Number.isInteger(e)&&(s=e)};t.shadow=shadow;t.string32=function string32(e){return String.fromCharCode(e>>24&255,e>>16&255,e>>8&255,255&e)};t.stringToBytes=stringToBytes;t.stringToPDFString=function stringToPDFString(e){const t=e.length,r=[];if("þ"===e[0]&&"ÿ"===e[1])for(let n=2;n<t;n+=2)r.push(String.fromCharCode(e.charCodeAt(n)<<8|e.charCodeAt(n+1)));else if("ÿ"===e[0]&&"þ"===e[1])for(let n=2;n<t;n+=2)r.push(String.fromCharCode(e.charCodeAt(n+1)<<8|e.charCodeAt(n)));else for(let n=0;n<t;++n){const t=h[e.charCodeAt(n)];r.push(t?String.fromCharCode(t):e.charAt(n))}return r.join("")};t.stringToUTF8String=function stringToUTF8String(e){return decodeURIComponent(escape(e))};t.utf8StringToString=function utf8StringToString(e){return unescape(encodeURIComponent(e))};t.warn=warn;t.unreachable=unreachable;t.IsEvalSupportedCached=t.IsLittleEndianCached=t.createObjectURL=t.FormatError=t.Util=t.UnknownErrorException=t.UnexpectedResponseException=t.TextRenderingMode=t.StreamType=t.PermissionFlag=t.PasswordResponses=t.PasswordException=t.MissingPDFException=t.InvalidPDFException=t.AbortException=t.CMapCompressionType=t.ImageKind=t.FontType=t.AnnotationType=t.AnnotationStateModelType=t.AnnotationReviewState=t.AnnotationReplyType=t.AnnotationMarkedState=t.AnnotationFlag=t.AnnotationFieldFlag=t.AnnotationBorderStyleType=t.UNSUPPORTED_FEATURES=t.VerbosityLevel=t.OPS=t.IDENTITY_MATRIX=t.FONT_IDENTITY_MATRIX=t.BaseException=void 0;r(3);t.IDENTITY_MATRIX=[1,0,0,1,0,0];t.FONT_IDENTITY_MATRIX=[.001,0,0,.001,0,0];t.PermissionFlag={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048};t.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};t.ImageKind={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};t.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};t.AnnotationStateModelType={MARKED:"Marked",REVIEW:"Review"};t.AnnotationMarkedState={MARKED:"Marked",UNMARKED:"Unmarked"};t.AnnotationReviewState={ACCEPTED:"Accepted",REJECTED:"Rejected",CANCELLED:"Cancelled",COMPLETED:"Completed",NONE:"None"};t.AnnotationReplyType={GROUP:"Group",REPLY:"R"};t.AnnotationFlag={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512};t.AnnotationFieldFlag={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864};t.AnnotationBorderStyleType={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5};t.StreamType={UNKNOWN:"UNKNOWN",FLATE:"FLATE",LZW:"LZW",DCT:"DCT",JPX:"JPX",JBIG:"JBIG",A85:"A85",AHX:"AHX",CCF:"CCF",RLX:"RLX"};t.FontType={UNKNOWN:"UNKNOWN",TYPE1:"TYPE1",TYPE1C:"TYPE1C",CIDFONTTYPE0:"CIDFONTTYPE0",CIDFONTTYPE0C:"CIDFONTTYPE0C",TRUETYPE:"TRUETYPE",CIDFONTTYPE2:"CIDFONTTYPE2",TYPE3:"TYPE3",OPENTYPE:"OPENTYPE",TYPE0:"TYPE0",MMTYPE1:"MMTYPE1"};const n={ERRORS:0,WARNINGS:1,INFOS:5};t.VerbosityLevel=n;t.CMapCompressionType={NONE:0,BINARY:1,STREAM:2};t.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,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};t.UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font",errorTilingPattern:"errorTilingPattern",errorExtGState:"errorExtGState",errorXObject:"errorXObject",errorFontLoadType3:"errorFontLoadType3",errorFontState:"errorFontState",errorFontMissing:"errorFontMissing",errorFontTranslate:"errorFontTranslate",errorColorSpace:"errorColorSpace",errorOperatorList:"errorOperatorList",errorFontToUnicode:"errorFontToUnicode",errorFontLoadNative:"errorFontLoadNative",errorFontGetPath:"errorFontGetPath",errorMarkedContent:"errorMarkedContent"};t.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};let s=n.WARNINGS;function warn(e){s>=n.WARNINGS&&console.log("Warning: "+e)}function unreachable(e){throw new Error(e)}function assert(e,t){e||unreachable(t)}function shadow(e,t,r){Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!1});return r}const a=function BaseExceptionClosure(){function BaseException(e){this.constructor===BaseException&&unreachable("Cannot initialize BaseException.");this.message=e;this.name=this.constructor.name}BaseException.prototype=new Error;BaseException.constructor=BaseException;return BaseException}();t.BaseException=a;t.PasswordException=class PasswordException extends a{constructor(e,t){super(e);this.code=t}};t.UnknownErrorException=class UnknownErrorException extends a{constructor(e,t){super(e);this.details=t}};t.InvalidPDFException=class InvalidPDFException extends a{};t.MissingPDFException=class MissingPDFException extends a{};t.UnexpectedResponseException=class UnexpectedResponseException extends a{constructor(e,t){super(e);this.status=t}};t.FormatError=class FormatError extends a{};t.AbortException=class AbortException extends a{};const i=/\x00/g;function stringToBytes(e){assert("string"==typeof e,"Invalid argument for stringToBytes");const t=e.length,r=new Uint8Array(t);for(let n=0;n<t;++n)r[n]=255&e.charCodeAt(n);return r}function arrayByteLength(e){if(void 0!==e.length)return e.length;assert(void 0!==e.byteLength,"arrayByteLength - invalid argument.");return e.byteLength}const o={get value(){return shadow(this,"value",function isLittleEndian(){const e=new Uint8Array(4);e[0]=1;return 1===new Uint32Array(e.buffer,0,1)[0]}())}};t.IsLittleEndianCached=o;const l={get value(){return shadow(this,"value",function isEvalSupported(){try{new Function("");return!0}catch(e){return!1}}())}};t.IsEvalSupportedCached=l;const c=["rgb(",0,",",0,",",0,")"];class Util{static makeCssRgb(e,t,r){c[1]=e;c[3]=t;c[5]=r;return c.join("")}static transform(e,t){return[e[0]*t[0]+e[2]*t[1],e[1]*t[0]+e[3]*t[1],e[0]*t[2]+e[2]*t[3],e[1]*t[2]+e[3]*t[3],e[0]*t[4]+e[2]*t[5]+e[4],e[1]*t[4]+e[3]*t[5]+e[5]]}static applyTransform(e,t){return[e[0]*t[0]+e[1]*t[2]+t[4],e[0]*t[1]+e[1]*t[3]+t[5]]}static applyInverseTransform(e,t){const r=t[0]*t[3]-t[1]*t[2];return[(e[0]*t[3]-e[1]*t[2]+t[2]*t[5]-t[4]*t[3])/r,(-e[0]*t[1]+e[1]*t[0]+t[4]*t[1]-t[5]*t[0])/r]}static getAxialAlignedBoundingBox(e,t){const r=Util.applyTransform(e,t),n=Util.applyTransform(e.slice(2,4),t),s=Util.applyTransform([e[0],e[3]],t),a=Util.applyTransform([e[2],e[1]],t);return[Math.min(r[0],n[0],s[0],a[0]),Math.min(r[1],n[1],s[1],a[1]),Math.max(r[0],n[0],s[0],a[0]),Math.max(r[1],n[1],s[1],a[1])]}static inverseTransform(e){const t=e[0]*e[3]-e[1]*e[2];return[e[3]/t,-e[1]/t,-e[2]/t,e[0]/t,(e[2]*e[5]-e[4]*e[3])/t,(e[4]*e[1]-e[5]*e[0])/t]}static apply3dTransform(e,t){return[e[0]*t[0]+e[1]*t[1]+e[2]*t[2],e[3]*t[0]+e[4]*t[1]+e[5]*t[2],e[6]*t[0]+e[7]*t[1]+e[8]*t[2]]}static singularValueDecompose2dScale(e){const t=[e[0],e[2],e[1],e[3]],r=e[0]*t[0]+e[1]*t[2],n=e[0]*t[1]+e[1]*t[3],s=e[2]*t[0]+e[3]*t[2],a=e[2]*t[1]+e[3]*t[3],i=(r+a)/2,o=Math.sqrt((r+a)*(r+a)-4*(r*a-s*n))/2,l=i+o||1,c=i-o||1;return[Math.sqrt(l),Math.sqrt(c)]}static normalizeRect(e){const t=e.slice(0);if(e[0]>e[2]){t[0]=e[2];t[2]=e[0]}if(e[1]>e[3]){t[1]=e[3];t[3]=e[1]}return t}static intersect(e,t){function compare(e,t){return e-t}const r=[e[0],e[2],t[0],t[2]].sort(compare),n=[e[1],e[3],t[1],t[3]].sort(compare),s=[];e=Util.normalizeRect(e);t=Util.normalizeRect(t);if(!(r[0]===e[0]&&r[1]===t[0]||r[0]===t[0]&&r[1]===e[0]))return null;s[0]=r[1];s[2]=r[2];if(!(n[0]===e[1]&&n[1]===t[1]||n[0]===t[1]&&n[1]===e[1]))return null;s[1]=n[1];s[3]=n[2];return s}}t.Util=Util;const h=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];const d=function createObjectURLClosure(){const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return function createObjectURL(t,r,n=!1){if(!n&&URL.createObjectURL){const e=new Blob([t],{type:r});return URL.createObjectURL(e)}let s=`data:${r};base64,`;for(let r=0,n=t.length;r<n;r+=3){const a=255&t[r],i=255&t[r+1],o=255&t[r+2];s+=e[a>>2]+e[(3&a)<<4|i>>4]+e[r+1<n?(15&i)<<2|o>>6:64]+e[r+2<n?63&o:64]}return s}}();t.createObjectURL=d},function(e,t,r){"use strict";r(4)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.isNodeJS=void 0;const n=!("object"!=typeof process||process+""!="[object process]"||process.versions.nw||process.versions.electron&&process.type&&"browser"!==process.type);t.isNodeJS=n},function(module,exports,__w_pdfjs_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.getDocument=getDocument;exports.setPDFNetworkStreamFactory=setPDFNetworkStreamFactory;exports.build=exports.version=exports.PDFPageProxy=exports.PDFDocumentProxy=exports.PDFWorker=exports.PDFDataRangeTransport=exports.LoopbackPort=void 0;var _util=__w_pdfjs_require__(2),_display_utils=__w_pdfjs_require__(1),_font_loader=__w_pdfjs_require__(6),_node_utils=__w_pdfjs_require__(7),_annotation_storage=__w_pdfjs_require__(8),_api_compatibility=__w_pdfjs_require__(9),_canvas=__w_pdfjs_require__(10),_worker_options=__w_pdfjs_require__(12),_is_node=__w_pdfjs_require__(4),_message_handler=__w_pdfjs_require__(13),_metadata=__w_pdfjs_require__(14),_optional_content_config=__w_pdfjs_require__(16),_transport_stream=__w_pdfjs_require__(17),_webgl=__w_pdfjs_require__(18);const DEFAULT_RANGE_CHUNK_SIZE=65536,RENDERING_CANCELLED_TIMEOUT=100,DefaultCanvasFactory=_is_node.isNodeJS?_node_utils.NodeCanvasFactory:_display_utils.DOMCanvasFactory,DefaultCMapReaderFactory=_is_node.isNodeJS?_node_utils.NodeCMapReaderFactory:_display_utils.DOMCMapReaderFactory;let createPDFNetworkStream;function setPDFNetworkStreamFactory(e){createPDFNetworkStream=e}function getDocument(e){const t=new PDFDocumentLoadingTask;let r;if("string"==typeof e)r={url:e};else if((0,_util.isArrayBuffer)(e))r={data:e};else if(e instanceof PDFDataRangeTransport)r={range:e};else{if("object"!=typeof e)throw new Error("Invalid parameter in getDocument, need either Uint8Array, string or a parameter object");if(!e.url&&!e.data&&!e.range)throw new Error("Invalid parameter object: need either .data, .range or .url");r=e}const n=Object.create(null);let s=null,a=null;for(const e in r)if("url"!==e||"undefined"==typeof window)if("range"!==e)if("worker"!==e)if("data"!==e||r[e]instanceof Uint8Array)n[e]=r[e];else{const t=r[e];if("string"==typeof t)n[e]=(0,_util.stringToBytes)(t);else if("object"!=typeof t||null===t||isNaN(t.length)){if(!(0,_util.isArrayBuffer)(t))throw new Error("Invalid PDF binary data: either typed array, string or array-like object is expected in the data property.");n[e]=new Uint8Array(t)}else n[e]=new Uint8Array(t)}else a=r[e];else s=r[e];else n[e]=new URL(r[e],window.location).href;n.rangeChunkSize=n.rangeChunkSize||DEFAULT_RANGE_CHUNK_SIZE;n.CMapReaderFactory=n.CMapReaderFactory||DefaultCMapReaderFactory;n.ignoreErrors=!0!==n.stopAtErrors;n.fontExtraProperties=!0===n.fontExtraProperties;n.pdfBug=!0===n.pdfBug;Number.isInteger(n.maxImageSize)||(n.maxImageSize=-1);"boolean"!=typeof n.isEvalSupported&&(n.isEvalSupported=!0);"boolean"!=typeof n.disableFontFace&&(n.disableFontFace=_api_compatibility.apiCompatibilityParams.disableFontFace||!1);void 0===n.ownerDocument&&(n.ownerDocument=globalThis.document);"boolean"!=typeof n.disableRange&&(n.disableRange=!1);"boolean"!=typeof n.disableStream&&(n.disableStream=!1);"boolean"!=typeof n.disableAutoFetch&&(n.disableAutoFetch=!1);(0,_util.setVerbosityLevel)(n.verbosity);if(!a){const e={verbosity:n.verbosity,port:_worker_options.GlobalWorkerOptions.workerPort};a=e.port?PDFWorker.fromPort(e):new PDFWorker(e);t._worker=a}const i=t.docId;a.promise.then((function(){if(t.destroyed)throw new Error("Loading aborted");const e=_fetchDocument(a,n,s,i),r=new Promise((function(e){let t;s?t=new _transport_stream.PDFDataTransportStream({length:n.length,initialData:n.initialData,progressiveDone:n.progressiveDone,disableRange:n.disableRange,disableStream:n.disableStream},s):n.data||(t=createPDFNetworkStream({url:n.url,length:n.length,httpHeaders:n.httpHeaders,withCredentials:n.withCredentials,rangeChunkSize:n.rangeChunkSize,disableRange:n.disableRange,disableStream:n.disableStream}));e(t)}));return Promise.all([e,r]).then((function([e,r]){if(t.destroyed)throw new Error("Loading aborted");const s=new _message_handler.MessageHandler(i,e,a.port);s.postMessageTransfers=a.postMessageTransfers;const o=new WorkerTransport(s,t,r,n);t._transport=o;s.send("Ready",null)}))})).catch(t._capability.reject);return t}function _fetchDocument(e,t,r,n){if(e.destroyed)return Promise.reject(new Error("Worker was destroyed"));if(r){t.length=r.length;t.initialData=r.initialData;t.progressiveDone=r.progressiveDone}return e.messageHandler.sendWithPromise("GetDocRequest",{docId:n,apiVersion:"2.6.347",source:{data:t.data,url:t.url,password:t.password,disableAutoFetch:t.disableAutoFetch,rangeChunkSize:t.rangeChunkSize,length:t.length},maxImageSize:t.maxImageSize,disableFontFace:t.disableFontFace,postMessageTransfers:e.postMessageTransfers,docBaseUrl:t.docBaseUrl,ignoreErrors:t.ignoreErrors,isEvalSupported:t.isEvalSupported,fontExtraProperties:t.fontExtraProperties}).then((function(t){if(e.destroyed)throw new Error("Worker was destroyed");return t}))}const PDFDocumentLoadingTask=function PDFDocumentLoadingTaskClosure(){let e=0;return class PDFDocumentLoadingTask{constructor(){this._capability=(0,_util.createPromiseCapability)();this._transport=null;this._worker=null;this.docId="d"+e++;this.destroyed=!1;this.onPassword=null;this.onProgress=null;this.onUnsupportedFeature=null}get promise(){return this._capability.promise}destroy(){this.destroyed=!0;return(this._transport?this._transport.destroy():Promise.resolve()).then(()=>{this._transport=null;if(this._worker){this._worker.destroy();this._worker=null}})}}}();class PDFDataRangeTransport{constructor(e,t,r=!1){this.length=e;this.initialData=t;this.progressiveDone=r;this._rangeListeners=[];this._progressListeners=[];this._progressiveReadListeners=[];this._progressiveDoneListeners=[];this._readyCapability=(0,_util.createPromiseCapability)()}addRangeListener(e){this._rangeListeners.push(e)}addProgressListener(e){this._progressListeners.push(e)}addProgressiveReadListener(e){this._progressiveReadListeners.push(e)}addProgressiveDoneListener(e){this._progressiveDoneListeners.push(e)}onDataRange(e,t){for(const r of this._rangeListeners)r(e,t)}onDataProgress(e,t){this._readyCapability.promise.then(()=>{for(const r of this._progressListeners)r(e,t)})}onDataProgressiveRead(e){this._readyCapability.promise.then(()=>{for(const t of this._progressiveReadListeners)t(e)})}onDataProgressiveDone(){this._readyCapability.promise.then(()=>{for(const e of this._progressiveDoneListeners)e()})}transportReady(){this._readyCapability.resolve()}requestDataRange(e,t){(0,_util.unreachable)("Abstract method PDFDataRangeTransport.requestDataRange")}abort(){}}exports.PDFDataRangeTransport=PDFDataRangeTransport;class PDFDocumentProxy{constructor(e,t){this._pdfInfo=e;this._transport=t}get annotationStorage(){return(0,_util.shadow)(this,"annotationStorage",new _annotation_storage.AnnotationStorage)}get numPages(){return this._pdfInfo.numPages}get fingerprint(){return this._pdfInfo.fingerprint}getPage(e){return this._transport.getPage(e)}getPageIndex(e){return this._transport.getPageIndex(e)}getDestinations(){return this._transport.getDestinations()}getDestination(e){return this._transport.getDestination(e)}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()}getJavaScript(){return this._transport.getJavaScript()}getOutline(){return this._transport.getOutline()}getOptionalContentConfig(){return this._transport.getOptionalContentConfig()}getPermissions(){return this._transport.getPermissions()}getMetadata(){return this._transport.getMetadata()}getData(){return this._transport.getData()}getDownloadInfo(){return this._transport.downloadInfoCapability.promise}getStats(){return this._transport.getStats()}cleanup(){return this._transport.startCleanup()}destroy(){return this.loadingTask.destroy()}get loadingParams(){return this._transport.loadingParams}get loadingTask(){return this._transport.loadingTask}saveDocument(e){return this._transport.saveDocument(e)}}exports.PDFDocumentProxy=PDFDocumentProxy;class PDFPageProxy{constructor(e,t,r,n,s=!1){this._pageIndex=e;this._pageInfo=t;this._ownerDocument=n;this._transport=r;this._stats=s?new _display_utils.StatTimer:null;this._pdfBug=s;this.commonObjs=r.commonObjs;this.objs=new PDFObjects;this.cleanupAfterRender=!1;this.pendingCleanup=!1;this._intentStates=new Map;this.destroyed=!1}get pageNumber(){return this._pageIndex+1}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:e,rotation:t=this.rotate,offsetX:r=0,offsetY:n=0,dontFlip:s=!1}={}){return new _display_utils.PageViewport({viewBox:this.view,scale:e,rotation:t,offsetX:r,offsetY:n,dontFlip:s})}getAnnotations({intent:e=null}={}){if(!this.annotationsPromise||this.annotationsIntent!==e){this.annotationsPromise=this._transport.getAnnotations(this._pageIndex,e);this.annotationsIntent=e}return this.annotationsPromise}render({canvasContext:e,viewport:t,intent:r="display",enableWebGL:n=!1,renderInteractiveForms:s=!1,transform:a=null,imageLayer:i=null,canvasFactory:o=null,background:l=null,annotationStorage:c=null,optionalContentConfigPromise:h=null}){this._stats&&this._stats.time("Overall");const d="print"===r?"print":"display";this.pendingCleanup=!1;h||(h=this._transport.getOptionalContentConfig());let u=this._intentStates.get(d);if(!u){u=Object.create(null);this._intentStates.set(d,u)}if(u.streamReaderCancelTimeout){clearTimeout(u.streamReaderCancelTimeout);u.streamReaderCancelTimeout=null}const p=o||new DefaultCanvasFactory({ownerDocument:this._ownerDocument}),f=new _webgl.WebGLContext({enable:n});if(!u.displayReadyCapability){u.displayReadyCapability=(0,_util.createPromiseCapability)();u.operatorList={fnArray:[],argsArray:[],lastChunk:!1};this._stats&&this._stats.time("Page Request");this._pumpOperatorList({pageIndex:this._pageIndex,intent:d,renderInteractiveForms:!0===s,annotationStorage:c&&c.getAll()||null})}const complete=e=>{const t=u.renderTasks.indexOf(g);t>=0&&u.renderTasks.splice(t,1);(this.cleanupAfterRender||"print"===d)&&(this.pendingCleanup=!0);this._tryCleanup();if(e){g.capability.reject(e);this._abortOperatorList({intentState:u,reason:e})}else g.capability.resolve();if(this._stats){this._stats.timeEnd("Rendering");this._stats.timeEnd("Overall")}},g=new InternalRenderTask({callback:complete,params:{canvasContext:e,viewport:t,transform:a,imageLayer:i,background:l},objs:this.objs,commonObjs:this.commonObjs,operatorList:u.operatorList,pageIndex:this._pageIndex,canvasFactory:p,webGLContext:f,useRequestAnimationFrame:"print"!==d,pdfBug:this._pdfBug});u.renderTasks||(u.renderTasks=[]);u.renderTasks.push(g);const m=g.task;Promise.all([u.displayReadyCapability.promise,h]).then(([e,t])=>{if(this.pendingCleanup)complete();else{this._stats&&this._stats.time("Rendering");g.initializeGraphics({transparency:e,optionalContentConfig:t});g.operatorListChanged()}}).catch(complete);return m}getOperatorList(){let e,t=this._intentStates.get("oplist");if(!t){t=Object.create(null);this._intentStates.set("oplist",t)}if(!t.opListReadCapability){e=Object.create(null);e.operatorListChanged=function operatorListChanged(){if(t.operatorList.lastChunk){t.opListReadCapability.resolve(t.operatorList);const r=t.renderTasks.indexOf(e);r>=0&&t.renderTasks.splice(r,1)}};t.opListReadCapability=(0,_util.createPromiseCapability)();t.renderTasks=[];t.renderTasks.push(e);t.operatorList={fnArray:[],argsArray:[],lastChunk:!1};this._stats&&this._stats.time("Page Request");this._pumpOperatorList({pageIndex:this._pageIndex,intent:"oplist"})}return t.opListReadCapability.promise}streamTextContent({normalizeWhitespace:e=!1,disableCombineTextItems:t=!1}={}){return this._transport.messageHandler.sendWithStream("GetTextContent",{pageIndex:this._pageIndex,normalizeWhitespace:!0===e,combineTextItems:!0!==t},{highWaterMark:100,size:e=>e.items.length})}getTextContent(e={}){const t=this.streamTextContent(e);return new Promise((function(e,r){const n=t.getReader(),s={items:[],styles:Object.create(null)};!function pump(){n.read().then((function({value:t,done:r}){if(r)e(s);else{Object.assign(s.styles,t.styles);s.items.push(...t.items);pump()}}),r)}()}))}_destroy(){this.destroyed=!0;this._transport.pageCache[this._pageIndex]=null;const e=[];for(const[t,r]of this._intentStates){this._abortOperatorList({intentState:r,reason:new Error("Page was destroyed."),force:!0});if("oplist"!==t)for(const t of r.renderTasks){e.push(t.completed);t.cancel()}}this.objs.clear();this.annotationsPromise=null;this.pendingCleanup=!1;return Promise.all(e)}cleanup(e=!1){this.pendingCleanup=!0;return this._tryCleanup(e)}_tryCleanup(e=!1){if(!this.pendingCleanup)return!1;for(const{renderTasks:e,operatorList:t}of this._intentStates.values())if(0!==e.length||!t.lastChunk)return!1;this._intentStates.clear();this.objs.clear();this.annotationsPromise=null;e&&this._stats&&(this._stats=new _display_utils.StatTimer);this.pendingCleanup=!1;return!0}_startRenderPage(e,t){const r=this._intentStates.get(t);if(r){this._stats&&this._stats.timeEnd("Page Request");r.displayReadyCapability&&r.displayReadyCapability.resolve(e)}}_renderPageChunk(e,t){for(let r=0,n=e.length;r<n;r++){t.operatorList.fnArray.push(e.fnArray[r]);t.operatorList.argsArray.push(e.argsArray[r])}t.operatorList.lastChunk=e.lastChunk;for(let e=0;e<t.renderTasks.length;e++)t.renderTasks[e].operatorListChanged();e.lastChunk&&this._tryCleanup()}_pumpOperatorList(e){(0,_util.assert)(e.intent,'PDFPageProxy._pumpOperatorList: Expected "intent" argument.');const t=this._transport.messageHandler.sendWithStream("GetOperatorList",e).getReader(),r=this._intentStates.get(e.intent);r.streamReader=t;const pump=()=>{t.read().then(({value:e,done:t})=>{if(t)r.streamReader=null;else if(!this._transport.destroyed){this._renderPageChunk(e,r);pump()}},e=>{r.streamReader=null;if(!this._transport.destroyed){if(r.operatorList){r.operatorList.lastChunk=!0;for(let e=0;e<r.renderTasks.length;e++)r.renderTasks[e].operatorListChanged();this._tryCleanup()}if(r.displayReadyCapability)r.displayReadyCapability.reject(e);else{if(!r.opListReadCapability)throw e;r.opListReadCapability.reject(e)}}})};pump()}_abortOperatorList({intentState:e,reason:t,force:r=!1}){(0,_util.assert)(t instanceof Error||"object"==typeof t&&null!==t,'PDFPageProxy._abortOperatorList: Expected "reason" argument.');if(e.streamReader){if(!r){if(0!==e.renderTasks.length)return;if(t instanceof _display_utils.RenderingCancelledException){e.streamReaderCancelTimeout=setTimeout(()=>{this._abortOperatorList({intentState:e,reason:t,force:!0});e.streamReaderCancelTimeout=null},RENDERING_CANCELLED_TIMEOUT);return}}e.streamReader.cancel(new _util.AbortException(t&&t.message));e.streamReader=null;if(!this._transport.destroyed){for(const[t,r]of this._intentStates)if(r===e){this._intentStates.delete(t);break}this.cleanup()}}}get stats(){return this._stats}}exports.PDFPageProxy=PDFPageProxy;class LoopbackPort{constructor(e=!0){this._listeners=[];this._defer=e;this._deferred=Promise.resolve(void 0)}postMessage(e,t){if(!this._defer){this._listeners.forEach(t=>{t.call(this,{data:e})});return}const r=new WeakMap,n={data:function cloneValue(e){if("object"!=typeof e||null===e)return e;if(r.has(e))return r.get(e);let n,s;if((n=e.buffer)&&(0,_util.isArrayBuffer)(n)){s=t&&t.includes(n)?new e.constructor(n,e.byteOffset,e.byteLength):new e.constructor(e);r.set(e,s);return s}s=Array.isArray(e)?[]:{};r.set(e,s);for(const t in e){let r,n=e;for(;!(r=Object.getOwnPropertyDescriptor(n,t));)n=Object.getPrototypeOf(n);if(void 0!==r.value)if("function"!=typeof r.value)s[t]=cloneValue(r.value);else if(e.hasOwnProperty&&e.hasOwnProperty(t))throw new Error("LoopbackPort.postMessage - cannot clone: "+e[t])}return s}(e)};this._deferred.then(()=>{this._listeners.forEach(e=>{e.call(this,n)})})}addEventListener(e,t){this._listeners.push(t)}removeEventListener(e,t){const r=this._listeners.indexOf(t);this._listeners.splice(r,1)}terminate(){this._listeners.length=0}}exports.LoopbackPort=LoopbackPort;const PDFWorker=function PDFWorkerClosure(){const pdfWorkerPorts=new WeakMap;let isWorkerDisabled=!1,fallbackWorkerSrc,nextFakeWorkerId=0,fakeWorkerCapability;if(_is_node.isNodeJS&&"function"==typeof require){isWorkerDisabled=!0;fallbackWorkerSrc="./pdf.worker.js"}else if("object"==typeof document&&"currentScript"in document){const e=document.currentScript&&document.currentScript.src;e&&(fallbackWorkerSrc=e.replace(/(\.(?:min\.)?js)(\?.*)?$/i,".worker$1$2"))}function getWorkerSrc(){if(_worker_options.GlobalWorkerOptions.workerSrc)return _worker_options.GlobalWorkerOptions.workerSrc;if(void 0!==fallbackWorkerSrc){_is_node.isNodeJS||(0,_display_utils.deprecated)('No "GlobalWorkerOptions.workerSrc" specified.');return fallbackWorkerSrc}throw new Error('No "GlobalWorkerOptions.workerSrc" specified.')}function getMainThreadWorkerMessageHandler(){let e;try{e=globalThis.pdfjsWorker&&globalThis.pdfjsWorker.WorkerMessageHandler}catch(e){}return e||null}function setupFakeWorkerGlobal(){if(fakeWorkerCapability)return fakeWorkerCapability.promise;fakeWorkerCapability=(0,_util.createPromiseCapability)();const loader=async function(){const mainWorkerMessageHandler=getMainThreadWorkerMessageHandler();if(mainWorkerMessageHandler)return mainWorkerMessageHandler;if(_is_node.isNodeJS&&"function"==typeof require){const worker=eval("require")(getWorkerSrc());return worker.WorkerMessageHandler}await(0,_display_utils.loadScript)(getWorkerSrc());return window.pdfjsWorker.WorkerMessageHandler};loader().then(fakeWorkerCapability.resolve,fakeWorkerCapability.reject);return fakeWorkerCapability.promise}function createCDNWrapper(e){const t="importScripts('"+e+"');";return URL.createObjectURL(new Blob([t]))}class PDFWorker{constructor({name:e=null,port:t=null,verbosity:r=(0,_util.getVerbosityLevel)()}={}){if(t&&pdfWorkerPorts.has(t))throw new Error("Cannot use more than one PDFWorker per port");this.name=e;this.destroyed=!1;this.postMessageTransfers=!0;this.verbosity=r;this._readyCapability=(0,_util.createPromiseCapability)();this._port=null;this._webWorker=null;this._messageHandler=null;if(t){pdfWorkerPorts.set(t,this);this._initializeFromPort(t)}else this._initialize()}get promise(){return this._readyCapability.promise}get port(){return this._port}get messageHandler(){return this._messageHandler}_initializeFromPort(e){this._port=e;this._messageHandler=new _message_handler.MessageHandler("main","worker",e);this._messageHandler.on("ready",(function(){}));this._readyCapability.resolve()}_initialize(){if("undefined"!=typeof Worker&&!isWorkerDisabled&&!getMainThreadWorkerMessageHandler()){let e=getWorkerSrc();try{(0,_util.isSameOrigin)(window.location.href,e)||(e=createCDNWrapper(new URL(e,window.location).href));const t=new Worker(e),r=new _message_handler.MessageHandler("main","worker",t),terminateEarly=()=>{t.removeEventListener("error",onWorkerError);r.destroy();t.terminate();this.destroyed?this._readyCapability.reject(new Error("Worker was destroyed")):this._setupFakeWorker()},onWorkerError=()=>{this._webWorker||terminateEarly()};t.addEventListener("error",onWorkerError);r.on("test",e=>{t.removeEventListener("error",onWorkerError);if(this.destroyed)terminateEarly();else if(e){this._messageHandler=r;this._port=t;this._webWorker=t;e.supportTransfers||(this.postMessageTransfers=!1);this._readyCapability.resolve();r.send("configure",{verbosity:this.verbosity})}else{this._setupFakeWorker();r.destroy();t.terminate()}});r.on("ready",e=>{t.removeEventListener("error",onWorkerError);if(this.destroyed)terminateEarly();else try{sendTest()}catch(e){this._setupFakeWorker()}});const sendTest=()=>{const e=new Uint8Array([this.postMessageTransfers?255:0]);try{r.send("test",e,[e.buffer])}catch(t){(0,_util.warn)("Cannot use postMessage transfers.");e[0]=0;r.send("test",e)}};sendTest();return}catch(e){(0,_util.info)("The worker has been disabled.")}}this._setupFakeWorker()}_setupFakeWorker(){if(!isWorkerDisabled){(0,_util.warn)("Setting up fake worker.");isWorkerDisabled=!0}setupFakeWorkerGlobal().then(e=>{if(this.destroyed){this._readyCapability.reject(new Error("Worker was destroyed"));return}const t=new LoopbackPort;this._port=t;const r="fake"+nextFakeWorkerId++,n=new _message_handler.MessageHandler(r+"_worker",r,t);e.setup(n,t);const s=new _message_handler.MessageHandler(r,r+"_worker",t);this._messageHandler=s;this._readyCapability.resolve();s.send("configure",{verbosity:this.verbosity})}).catch(e=>{this._readyCapability.reject(new Error(`Setting up fake worker failed: "${e.message}".`))})}destroy(){this.destroyed=!0;if(this._webWorker){this._webWorker.terminate();this._webWorker=null}pdfWorkerPorts.delete(this._port);this._port=null;if(this._messageHandler){this._messageHandler.destroy();this._messageHandler=null}}static fromPort(e){if(!e||!e.port)throw new Error("PDFWorker.fromPort - invalid method signature.");return pdfWorkerPorts.has(e.port)?pdfWorkerPorts.get(e.port):new PDFWorker(e)}static getWorkerSrc(){return getWorkerSrc()}}return PDFWorker}();exports.PDFWorker=PDFWorker;class WorkerTransport{constructor(e,t,r,n){this.messageHandler=e;this.loadingTask=t;this.commonObjs=new PDFObjects;this.fontLoader=new _font_loader.FontLoader({docId:t.docId,onUnsupportedFeature:this._onUnsupportedFeature.bind(this),ownerDocument:n.ownerDocument});this._params=n;this.CMapReaderFactory=new n.CMapReaderFactory({baseUrl:n.cMapUrl,isCompressed:n.cMapPacked});this.destroyed=!1;this.destroyCapability=null;this._passwordCapability=null;this._networkStream=r;this._fullReader=null;this._lastProgress=null;this.pageCache=[];this.pagePromises=[];this.downloadInfoCapability=(0,_util.createPromiseCapability)();this.setupMessageHandler()}destroy(){if(this.destroyCapability)return this.destroyCapability.promise;this.destroyed=!0;this.destroyCapability=(0,_util.createPromiseCapability)();this._passwordCapability&&this._passwordCapability.reject(new Error("Worker was destroyed during onPassword callback"));const e=[];this.pageCache.forEach((function(t){t&&e.push(t._destroy())}));this.pageCache.length=0;this.pagePromises.length=0;const t=this.messageHandler.sendWithPromise("Terminate",null);e.push(t);Promise.all(e).then(()=>{this.fontLoader.clear();this._networkStream&&this._networkStream.cancelAllRequests(new _util.AbortException("Worker was terminated."));if(this.messageHandler){this.messageHandler.destroy();this.messageHandler=null}this.destroyCapability.resolve()},this.destroyCapability.reject);return this.destroyCapability.promise}setupMessageHandler(){const{messageHandler:e,loadingTask:t}=this;e.on("GetReader",(e,t)=>{(0,_util.assert)(this._networkStream,"GetReader - no `IPDFStream` instance available.");this._fullReader=this._networkStream.getFullReader();this._fullReader.onProgress=e=>{this._lastProgress={loaded:e.loaded,total:e.total}};t.onPull=()=>{this._fullReader.read().then((function({value:e,done:r}){if(r)t.close();else{(0,_util.assert)((0,_util.isArrayBuffer)(e),"GetReader - expected an ArrayBuffer.");t.enqueue(new Uint8Array(e),1,[e])}})).catch(e=>{t.error(e)})};t.onCancel=e=>{this._fullReader.cancel(e);t.ready.catch(e=>{if(!this.destroyed)throw e})}});e.on("ReaderHeadersReady",e=>{const r=(0,_util.createPromiseCapability)(),n=this._fullReader;n.headersReady.then(()=>{if(!n.isStreamingSupported||!n.isRangeSupported){this._lastProgress&&t.onProgress&&t.onProgress(this._lastProgress);n.onProgress=e=>{t.onProgress&&t.onProgress({loaded:e.loaded,total:e.total})}}r.resolve({isStreamingSupported:n.isStreamingSupported,isRangeSupported:n.isRangeSupported,contentLength:n.contentLength})},r.reject);return r.promise});e.on("GetRangeReader",(e,t)=>{(0,_util.assert)(this._networkStream,"GetRangeReader - no `IPDFStream` instance available.");const r=this._networkStream.getRangeReader(e.begin,e.end);if(r){t.onPull=()=>{r.read().then((function({value:e,done:r}){if(r)t.close();else{(0,_util.assert)((0,_util.isArrayBuffer)(e),"GetRangeReader - expected an ArrayBuffer.");t.enqueue(new Uint8Array(e),1,[e])}})).catch(e=>{t.error(e)})};t.onCancel=e=>{r.cancel(e);t.ready.catch(e=>{if(!this.destroyed)throw e})}}else t.close()});e.on("GetDoc",({pdfInfo:e})=>{this._numPages=e.numPages;t._capability.resolve(new PDFDocumentProxy(e,this))});e.on("DocException",(function(e){let r;switch(e.name){case"PasswordException":r=new _util.PasswordException(e.message,e.code);break;case"InvalidPDFException":r=new _util.InvalidPDFException(e.message);break;case"MissingPDFException":r=new _util.MissingPDFException(e.message);break;case"UnexpectedResponseException":r=new _util.UnexpectedResponseException(e.message,e.status);break;case"UnknownErrorException":r=new _util.UnknownErrorException(e.message,e.details)}if(!(r instanceof Error)){const e="DocException - expected a valid Error.";(0,_util.warn)(e)}t._capability.reject(r)}));e.on("PasswordRequest",e=>{this._passwordCapability=(0,_util.createPromiseCapability)();if(t.onPassword){const updatePassword=e=>{this._passwordCapability.resolve({password:e})};try{t.onPassword(updatePassword,e.code)}catch(e){this._passwordCapability.reject(e)}}else this._passwordCapability.reject(new _util.PasswordException(e.message,e.code));return this._passwordCapability.promise});e.on("DataLoaded",e=>{t.onProgress&&t.onProgress({loaded:e.length,total:e.length});this.downloadInfoCapability.resolve(e)});e.on("StartRenderPage",e=>{if(this.destroyed)return;this.pageCache[e.pageIndex]._startRenderPage(e.transparency,e.intent)});e.on("commonobj",t=>{if(this.destroyed)return;const[r,n,s]=t;if(!this.commonObjs.has(r))switch(n){case"Font":const t=this._params;if("error"in s){const e=s.error;(0,_util.warn)("Error during font loading: "+e);this.commonObjs.resolve(r,e);break}let a=null;t.pdfBug&&globalThis.FontInspector&&globalThis.FontInspector.enabled&&(a={registerFont(e,t){globalThis.FontInspector.fontAdded(e,t)}});const i=new _font_loader.FontFaceObject(s,{isEvalSupported:t.isEvalSupported,disableFontFace:t.disableFontFace,ignoreErrors:t.ignoreErrors,onUnsupportedFeature:this._onUnsupportedFeature.bind(this),fontRegistry:a});this.fontLoader.bind(i).catch(t=>e.sendWithPromise("FontFallback",{id:r})).finally(()=>{!t.fontExtraProperties&&i.data&&(i.data=null);this.commonObjs.resolve(r,i)});break;case"FontPath":case"Image":this.commonObjs.resolve(r,s);break;default:throw new Error("Got unknown common object type "+n)}});e.on("obj",e=>{if(this.destroyed)return;const[t,r,n,s]=e,a=this.pageCache[r];if(!a.objs.has(t))switch(n){case"Image":a.objs.resolve(t,s);const e=8e6;s&&"data"in s&&s.data.length>e&&(a.cleanupAfterRender=!0);break;default:throw new Error("Got unknown object type "+n)}});e.on("DocProgress",e=>{this.destroyed||t.onProgress&&t.onProgress({loaded:e.loaded,total:e.total})});e.on("UnsupportedFeature",this._onUnsupportedFeature.bind(this));e.on("FetchBuiltInCMap",(e,t)=>{if(this.destroyed){t.error(new Error("Worker was destroyed"));return}let r=!1;t.onPull=()=>{if(r)t.close();else{r=!0;this.CMapReaderFactory.fetch(e).then((function(e){t.enqueue(e,1,[e.cMapData.buffer])})).catch((function(e){t.error(e)}))}}})}_onUnsupportedFeature({featureId:e}){this.destroyed||this.loadingTask.onUnsupportedFeature&&this.loadingTask.onUnsupportedFeature(e)}getData(){return this.messageHandler.sendWithPromise("GetData",null)}getPage(e){if(!Number.isInteger(e)||e<=0||e>this._numPages)return Promise.reject(new Error("Invalid page request"));const t=e-1;if(t in this.pagePromises)return this.pagePromises[t];const r=this.messageHandler.sendWithPromise("GetPage",{pageIndex:t}).then(e=>{if(this.destroyed)throw new Error("Transport destroyed");const r=new PDFPageProxy(t,e,this,this._params.ownerDocument,this._params.pdfBug);this.pageCache[t]=r;return r});this.pagePromises[t]=r;return r}getPageIndex(e){return this.messageHandler.sendWithPromise("GetPageIndex",{ref:e}).catch((function(e){return Promise.reject(new Error(e))}))}getAnnotations(e,t){return this.messageHandler.sendWithPromise("GetAnnotations",{pageIndex:e,intent:t})}saveDocument(e){return this.messageHandler.sendWithPromise("SaveDocument",{numPages:this._numPages,annotationStorage:e&&e.getAll()||null,filename:this._fullReader?this._fullReader.filename:null}).finally(()=>{e&&e.resetModified()})}getDestinations(){return this.messageHandler.sendWithPromise("GetDestinations",null)}getDestination(e){return"string"!=typeof e?Promise.reject(new Error("Invalid destination request.")):this.messageHandler.sendWithPromise("GetDestination",{id:e})}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)}getJavaScript(){return this.messageHandler.sendWithPromise("GetJavaScript",null)}getOutline(){return this.messageHandler.sendWithPromise("GetOutline",null)}getOptionalContentConfig(){return this.messageHandler.sendWithPromise("GetOptionalContentConfig",null).then(e=>new _optional_content_config.OptionalContentConfig(e))}getPermissions(){return this.messageHandler.sendWithPromise("GetPermissions",null)}getMetadata(){return this.messageHandler.sendWithPromise("GetMetadata",null).then(e=>({info:e[0],metadata:e[1]?new _metadata.Metadata(e[1]):null,contentDispositionFilename:this._fullReader?this._fullReader.filename:null}))}getStats(){return this.messageHandler.sendWithPromise("GetStats",null)}startCleanup(){return this.messageHandler.sendWithPromise("Cleanup",null).then(()=>{for(let e=0,t=this.pageCache.length;e<t;e++){const t=this.pageCache[e];if(t){if(!t.cleanup())throw new Error(`startCleanup: Page ${e+1} is currently rendering.`)}}this.commonObjs.clear();this.fontLoader.clear()})}get loadingParams(){const e=this._params;return(0,_util.shadow)(this,"loadingParams",{disableAutoFetch:e.disableAutoFetch,disableFontFace:e.disableFontFace})}}class PDFObjects{constructor(){this._objs=Object.create(null)}_ensureObj(e){return this._objs[e]?this._objs[e]:this._objs[e]={capability:(0,_util.createPromiseCapability)(),data:null,resolved:!1}}get(e,t=null){if(t){this._ensureObj(e).capability.promise.then(t);return null}const r=this._objs[e];if(!r||!r.resolved)throw new Error(`Requesting object that isn't resolved yet ${e}.`);return r.data}has(e){const t=this._objs[e];return!!t&&t.resolved}resolve(e,t){const r=this._ensureObj(e);r.resolved=!0;r.data=t;r.capability.resolve(t)}clear(){this._objs=Object.create(null)}}class RenderTask{constructor(e){this._internalRenderTask=e;this.onContinue=null}get promise(){return this._internalRenderTask.capability.promise}cancel(){this._internalRenderTask.cancel()}}const InternalRenderTask=function InternalRenderTaskClosure(){const e=new WeakSet;return class InternalRenderTask{constructor({callback:e,params:t,objs:r,commonObjs:n,operatorList:s,pageIndex:a,canvasFactory:i,webGLContext:o,useRequestAnimationFrame:l=!1,pdfBug:c=!1}){this.callback=e;this.params=t;this.objs=r;this.commonObjs=n;this.operatorListIdx=null;this.operatorList=s;this._pageIndex=a;this.canvasFactory=i;this.webGLContext=o;this._pdfBug=c;this.running=!1;this.graphicsReadyCallback=null;this.graphicsReady=!1;this._useRequestAnimationFrame=!0===l&&"undefined"!=typeof window;this.cancelled=!1;this.capability=(0,_util.createPromiseCapability)();this.task=new RenderTask(this);this._continueBound=this._continue.bind(this);this._scheduleNextBound=this._scheduleNext.bind(this);this._nextBound=this._next.bind(this);this._canvas=t.canvasContext.canvas}get completed(){return this.capability.promise.catch((function(){}))}initializeGraphics({transparency:t=!1,optionalContentConfig:r}){if(this.cancelled)return;if(this._canvas){if(e.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.");e.add(this._canvas)}if(this._pdfBug&&globalThis.StepperManager&&globalThis.StepperManager.enabled){this.stepper=globalThis.StepperManager.create(this._pageIndex);this.stepper.init(this.operatorList);this.stepper.nextBreakPoint=this.stepper.getNextBreakPoint()}const{canvasContext:n,viewport:s,transform:a,imageLayer:i,background:o}=this.params;this.gfx=new _canvas.CanvasGraphics(n,this.commonObjs,this.objs,this.canvasFactory,this.webGLContext,i,r);this.gfx.beginDrawing({transform:a,viewport:s,transparency:t,background:o});this.operatorListIdx=0;this.graphicsReady=!0;this.graphicsReadyCallback&&this.graphicsReadyCallback()}cancel(t=null){this.running=!1;this.cancelled=!0;this.gfx&&this.gfx.endDrawing();this._canvas&&e.delete(this._canvas);this.callback(t||new _display_utils.RenderingCancelledException("Rendering cancelled, page "+(this._pageIndex+1),"canvas"))}operatorListChanged(){if(this.graphicsReady){this.stepper&&this.stepper.updateOperatorList(this.operatorList);this.running||this._continue()}else this.graphicsReadyCallback||(this.graphicsReadyCallback=this._continueBound)}_continue(){this.running=!0;this.cancelled||(this.task.onContinue?this.task.onContinue(this._scheduleNextBound):this._scheduleNext())}_scheduleNext(){this._useRequestAnimationFrame?window.requestAnimationFrame(()=>{this._nextBound().catch(this.cancel.bind(this))}):Promise.resolve().then(this._nextBound).catch(this.cancel.bind(this))}async _next(){if(!this.cancelled){this.operatorListIdx=this.gfx.executeOperatorList(this.operatorList,this.operatorListIdx,this._continueBound,this.stepper);if(this.operatorListIdx===this.operatorList.argsArray.length){this.running=!1;if(this.operatorList.lastChunk){this.gfx.endDrawing();this._canvas&&e.delete(this._canvas);this.callback()}}}}}}(),version="2.6.347";exports.version=version;const build="3be9c65f";exports.build=build},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.FontLoader=t.FontFaceObject=void 0;var n=r(2);class BaseFontLoader{constructor({docId:e,onUnsupportedFeature:t,ownerDocument:r=globalThis.document}){this.constructor===BaseFontLoader&&(0,n.unreachable)("Cannot initialize BaseFontLoader.");this.docId=e;this._onUnsupportedFeature=t;this._document=r;this.nativeFontFaces=[];this.styleElement=null}addNativeFontFace(e){this.nativeFontFaces.push(e);this._document.fonts.add(e)}insertRule(e){let t=this.styleElement;if(!t){t=this.styleElement=this._document.createElement("style");t.id="PDFJS_FONT_STYLE_TAG_"+this.docId;this._document.documentElement.getElementsByTagName("head")[0].appendChild(t)}const r=t.sheet;r.insertRule(e,r.cssRules.length)}clear(){this.nativeFontFaces.forEach(e=>{this._document.fonts.delete(e)});this.nativeFontFaces.length=0;if(this.styleElement){this.styleElement.remove();this.styleElement=null}}async bind(e){if(e.attached||e.missingFile)return;e.attached=!0;if(this.isFontLoadingAPISupported){const t=e.createNativeFontFace();if(t){this.addNativeFontFace(t);try{await t.loaded}catch(r){this._onUnsupportedFeature({featureId:n.UNSUPPORTED_FEATURES.errorFontLoadNative});(0,n.warn)(`Failed to load font '${t.family}': '${r}'.`);e.disableFontFace=!0;throw r}}return}const t=e.createFontFaceRule();if(t){this.insertRule(t);if(this.isSyncFontLoadingSupported)return;await new Promise(r=>{const n=this._queueLoadingCallback(r);this._prepareFontLoadEvent([t],[e],n)})}}_queueLoadingCallback(e){(0,n.unreachable)("Abstract method `_queueLoadingCallback`.")}get isFontLoadingAPISupported(){const e=void 0!==this._document&&!!this._document.fonts;return(0,n.shadow)(this,"isFontLoadingAPISupported",e)}get isSyncFontLoadingSupported(){(0,n.unreachable)("Abstract method `isSyncFontLoadingSupported`.")}get _loadTestFont(){(0,n.unreachable)("Abstract method `_loadTestFont`.")}_prepareFontLoadEvent(e,t,r){(0,n.unreachable)("Abstract method `_prepareFontLoadEvent`.")}}let s;t.FontLoader=s;t.FontLoader=s=class GenericFontLoader extends BaseFontLoader{constructor(e){super(e);this.loadingContext={requests:[],nextRequestId:0};this.loadTestFontId=0}get isSyncFontLoadingSupported(){let e=!1;if("undefined"==typeof navigator)e=!0;else{const t=/Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(navigator.userAgent);t&&t[1]>=14&&(e=!0)}return(0,n.shadow)(this,"isSyncFontLoadingSupported",e)}_queueLoadingCallback(e){const t=this.loadingContext,r={id:"pdfjs-font-loading-"+t.nextRequestId++,done:!1,complete:function completeRequest(){(0,n.assert)(!r.done,"completeRequest() cannot be called twice.");r.done=!0;for(;t.requests.length>0&&t.requests[0].done;){const e=t.requests.shift();setTimeout(e.callback,0)}},callback:e};t.requests.push(r);return r}get _loadTestFont(){return(0,n.shadow)(this,"_loadTestFont",atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA=="))}_prepareFontLoadEvent(e,t,r){function int32(e,t){return e.charCodeAt(t)<<24|e.charCodeAt(t+1)<<16|e.charCodeAt(t+2)<<8|255&e.charCodeAt(t+3)}function spliceString(e,t,r,n){return e.substring(0,t)+n+e.substring(t+r)}let s,a;const i=this._document.createElement("canvas");i.width=1;i.height=1;const o=i.getContext("2d");let l=0;const c=`lt${Date.now()}${this.loadTestFontId++}`;let h=this._loadTestFont;h=spliceString(h,976,c.length,c);let d=int32(h,16);for(s=0,a=c.length-3;s<a;s+=4)d=d-1482184792+int32(c,s)|0;s<c.length&&(d=d-1482184792+int32(c+"XXX",s)|0);h=spliceString(h,16,4,(0,n.string32)(d));const u=`@font-face {font-family:"${c}";src:${`url(data:font/opentype;base64,${btoa(h)});`}}`;this.insertRule(u);const p=[];for(s=0,a=t.length;s<a;s++)p.push(t[s].loadedName);p.push(c);const f=this._document.createElement("div");f.style.visibility="hidden";f.style.width=f.style.height="10px";f.style.position="absolute";f.style.top=f.style.left="0px";for(s=0,a=p.length;s<a;++s){const e=this._document.createElement("span");e.textContent="Hi";e.style.fontFamily=p[s];f.appendChild(e)}this._document.body.appendChild(f);!function isFontReady(e,t){l++;if(l>30){(0,n.warn)("Load test font never loaded.");t();return}o.font="30px "+e;o.fillText(".",0,20);o.getImageData(0,0,1,1).data[3]>0?t():setTimeout(isFontReady.bind(null,e,t))}(c,()=>{this._document.body.removeChild(f);r.complete()})}};t.FontFaceObject=class FontFaceObject{constructor(e,{isEvalSupported:t=!0,disableFontFace:r=!1,ignoreErrors:n=!1,onUnsupportedFeature:s=null,fontRegistry:a=null}){this.compiledGlyphs=Object.create(null);for(const t in e)this[t]=e[t];this.isEvalSupported=!1!==t;this.disableFontFace=!0===r;this.ignoreErrors=!0===n;this._onUnsupportedFeature=s;this.fontRegistry=a}createNativeFontFace(){if(!this.data||this.disableFontFace)return null;const e=new FontFace(this.loadedName,this.data,{});this.fontRegistry&&this.fontRegistry.registerFont(this);return e}createFontFaceRule(){if(!this.data||this.disableFontFace)return null;const e=(0,n.bytesToString)(new Uint8Array(this.data)),t=`url(data:${this.mimetype};base64,${btoa(e)});`,r=`@font-face {font-family:"${this.loadedName}";src:${t}}`;this.fontRegistry&&this.fontRegistry.registerFont(this,t);return r}getPathGenerator(e,t){if(void 0!==this.compiledGlyphs[t])return this.compiledGlyphs[t];let r,s;try{r=e.get(this.loadedName+"_path_"+t)}catch(e){if(!this.ignoreErrors)throw e;this._onUnsupportedFeature&&this._onUnsupportedFeature({featureId:n.UNSUPPORTED_FEATURES.errorFontGetPath});(0,n.warn)(`getPathGenerator - ignoring character: "${e}".`);return this.compiledGlyphs[t]=function(e,t){}}if(this.isEvalSupported&&n.IsEvalSupportedCached.value){let e,n="";for(let t=0,a=r.length;t<a;t++){s=r[t];e=void 0!==s.args?s.args.join(","):"";n+="c."+s.cmd+"("+e+");\n"}return this.compiledGlyphs[t]=new Function("c","size",n)}return this.compiledGlyphs[t]=function(e,t){for(let n=0,a=r.length;n<a;n++){s=r[n];"scale"===s.cmd&&(s.args=[t,-t]);e[s.cmd].apply(e,s.args)}}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.NodeCMapReaderFactory=t.NodeCanvasFactory=void 0;var n=r(1),s=r(4),a=r(2);let i=class{constructor(){(0,a.unreachable)("Not implemented: NodeCanvasFactory")}};t.NodeCanvasFactory=i;let o=class{constructor(){(0,a.unreachable)("Not implemented: NodeCMapReaderFactory")}};t.NodeCMapReaderFactory=o;if(s.isNodeJS){t.NodeCanvasFactory=i=class extends n.BaseCanvasFactory{create(e,t){if(e<=0||t<=0)throw new Error("Invalid canvas size");const r=require("canvas").createCanvas(e,t);return{canvas:r,context:r.getContext("2d")}}};t.NodeCMapReaderFactory=o=class extends n.BaseCMapReaderFactory{_fetchData(e,t){return new Promise((r,n)=>{require("fs").readFile(e,(e,s)=>{!e&&s?r({cMapData:new Uint8Array(s),compressionType:t}):n(new Error(e))})})}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.AnnotationStorage=void 0;t.AnnotationStorage=class AnnotationStorage{constructor(){this._storage=new Map;this._modified=!1;this.onSetModified=null;this.onResetModified=null}getOrCreateValue(e,t){if(this._storage.has(e))return this._storage.get(e);this._storage.set(e,t);return t}setValue(e,t){this._storage.get(e)!==t&&this._setModified();this._storage.set(e,t)}getAll(){return 0===this._storage.size?null:Object.fromEntries(this._storage)}get size(){return this._storage.size}_setModified(){if(!this._modified){this._modified=!0;"function"==typeof this.onSetModified&&this.onSetModified()}}resetModified(){if(this._modified){this._modified=!1;"function"==typeof this.onResetModified&&this.onResetModified()}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.apiCompatibilityParams=void 0;var n=r(4);const s=Object.create(null);!function checkFontFace(){n.isNodeJS&&(s.disableFontFace=!0)}();const a=Object.freeze(s);t.apiCompatibilityParams=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.CanvasGraphics=void 0;var n=r(2),s=r(11);function addContextCurrentTransform(e){if(!e.mozCurrentTransform){e._originalSave=e.save;e._originalRestore=e.restore;e._originalRotate=e.rotate;e._originalScale=e.scale;e._originalTranslate=e.translate;e._originalTransform=e.transform;e._originalSetTransform=e.setTransform;e._transformMatrix=e._transformMatrix||[1,0,0,1,0,0];e._transformStack=[];Object.defineProperty(e,"mozCurrentTransform",{get:function getCurrentTransform(){return this._transformMatrix}});Object.defineProperty(e,"mozCurrentTransformInverse",{get:function getCurrentTransformInverse(){var e=this._transformMatrix,t=e[0],r=e[1],n=e[2],s=e[3],a=e[4],i=e[5],o=t*s-r*n,l=r*n-t*s;return[s/o,r/l,n/l,t/o,(s*a-n*i)/l,(r*a-t*i)/o]}});e.save=function ctxSave(){var e=this._transformMatrix;this._transformStack.push(e);this._transformMatrix=e.slice(0,6);this._originalSave()};e.restore=function ctxRestore(){var e=this._transformStack.pop();if(e){this._transformMatrix=e;this._originalRestore()}};e.translate=function ctxTranslate(e,t){var r=this._transformMatrix;r[4]=r[0]*e+r[2]*t+r[4];r[5]=r[1]*e+r[3]*t+r[5];this._originalTranslate(e,t)};e.scale=function ctxScale(e,t){var r=this._transformMatrix;r[0]=r[0]*e;r[1]=r[1]*e;r[2]=r[2]*t;r[3]=r[3]*t;this._originalScale(e,t)};e.transform=function ctxTransform(t,r,n,s,a,i){var o=this._transformMatrix;this._transformMatrix=[o[0]*t+o[2]*r,o[1]*t+o[3]*r,o[0]*n+o[2]*s,o[1]*n+o[3]*s,o[0]*a+o[2]*i+o[4],o[1]*a+o[3]*i+o[5]];e._originalTransform(t,r,n,s,a,i)};e.setTransform=function ctxSetTransform(t,r,n,s,a,i){this._transformMatrix=[t,r,n,s,a,i];e._originalSetTransform(t,r,n,s,a,i)};e.rotate=function ctxRotate(e){var t=Math.cos(e),r=Math.sin(e),n=this._transformMatrix;this._transformMatrix=[n[0]*t+n[2]*r,n[1]*t+n[3]*r,n[0]*-r+n[2]*t,n[1]*-r+n[3]*t,n[4],n[5]];this._originalRotate(e)}}}var a=function CachedCanvasesClosure(){function CachedCanvases(e){this.canvasFactory=e;this.cache=Object.create(null)}CachedCanvases.prototype={getCanvas:function CachedCanvases_getCanvas(e,t,r,n){var s;if(void 0!==this.cache[e]){s=this.cache[e];this.canvasFactory.reset(s,t,r);s.context.setTransform(1,0,0,1,0,0)}else{s=this.canvasFactory.create(t,r);this.cache[e]=s}n&&addContextCurrentTransform(s.context);return s},clear(){for(var e in this.cache){var t=this.cache[e];this.canvasFactory.destroy(t);delete this.cache[e]}}};return CachedCanvases}();var i=function CanvasExtraStateClosure(){function CanvasExtraState(){this.alphaIsShape=!1;this.fontSize=0;this.fontSizeScale=1;this.textMatrix=n.IDENTITY_MATRIX;this.textMatrixScale=1;this.fontMatrix=n.FONT_IDENTITY_MATRIX;this.leading=0;this.x=0;this.y=0;this.lineX=0;this.lineY=0;this.charSpacing=0;this.wordSpacing=0;this.textHScale=1;this.textRenderingMode=n.TextRenderingMode.FILL;this.textRise=0;this.fillColor="#000000";this.strokeColor="#000000";this.patternFill=!1;this.fillAlpha=1;this.strokeAlpha=1;this.lineWidth=1;this.activeSMask=null;this.resumeSMaskCtx=null;this.transferMaps=null}CanvasExtraState.prototype={clone:function CanvasExtraState_clone(){return Object.create(this)},setCurrentPoint:function CanvasExtraState_setCurrentPoint(e,t){this.x=e;this.y=t}};return CanvasExtraState}(),o=function CanvasGraphicsClosure(){function CanvasGraphics(e,t,r,n,s,o,l){this.ctx=e;this.current=new i;this.stateStack=[];this.pendingClip=null;this.pendingEOFill=!1;this.res=null;this.xobjs=null;this.commonObjs=t;this.objs=r;this.canvasFactory=n;this.webGLContext=s;this.imageLayer=o;this.groupStack=[];this.processingType3=null;this.baseTransform=null;this.baseTransformStack=[];this.groupLevel=0;this.smaskStack=[];this.smaskCounter=0;this.tempSMask=null;this.contentVisible=!0;this.markedContentStack=[];this.optionalContentConfig=l;this.cachedCanvases=new a(this.canvasFactory);e&&addContextCurrentTransform(e);this._cachedGetSinglePixelWidth=null}function putBinaryImageData(e,t,r=null){if("undefined"!=typeof ImageData&&t instanceof ImageData){e.putImageData(t,0,0);return}var s,a,i,o,l,c=t.height,h=t.width,d=c%16,u=(c-d)/16,p=0===d?u:u+1,f=e.createImageData(h,16),g=0,m=t.data,_=f.data;let A,b,y,v;if(r)switch(r.length){case 1:A=r[0];b=r[0];y=r[0];v=r[0];break;case 4:A=r[0];b=r[1];y=r[2];v=r[3]}if(t.kind===n.ImageKind.GRAYSCALE_1BPP){var C=m.byteLength,S=new Uint32Array(_.buffer,0,_.byteLength>>2),x=S.length,P=h+7>>3,k=4294967295,R=n.IsLittleEndianCached.value?4278190080:255;v&&255===v[0]&&0===v[255]&&([k,R]=[R,k]);for(a=0;a<p;a++){o=a<u?16:d;s=0;for(i=0;i<o;i++){var w=C-g;let e=0;for(var T=w>P?h:8*w-7,E=-8&T,F=0,L=0;e<E;e+=8){L=m[g++];S[s++]=128&L?k:R;S[s++]=64&L?k:R;S[s++]=32&L?k:R;S[s++]=16&L?k:R;S[s++]=8&L?k:R;S[s++]=4&L?k:R;S[s++]=2&L?k:R;S[s++]=1&L?k:R}for(;e<T;e++){if(0===F){L=m[g++];F=128}S[s++]=L&F?k:R;F>>=1}}for(;s<x;)S[s++]=0;e.putImageData(f,0,16*a)}}else if(t.kind===n.ImageKind.RGBA_32BPP){const t=!!(A||b||y);i=0;l=16*h*4;for(a=0;a<u;a++){_.set(m.subarray(g,g+l));g+=l;if(t)for(let e=0;e<l;e+=4){A&&(_[e+0]=A[_[e+0]]);b&&(_[e+1]=b[_[e+1]]);y&&(_[e+2]=y[_[e+2]])}e.putImageData(f,0,i);i+=16}if(a<p){l=h*d*4;_.set(m.subarray(g,g+l));if(t)for(let e=0;e<l;e+=4){A&&(_[e+0]=A[_[e+0]]);b&&(_[e+1]=b[_[e+1]]);y&&(_[e+2]=y[_[e+2]])}e.putImageData(f,0,i)}}else{if(t.kind!==n.ImageKind.RGB_24BPP)throw new Error("bad image kind: "+t.kind);{const t=!!(A||b||y);l=h*(o=16);for(a=0;a<p;a++){a>=u&&(l=h*(o=d));s=0;for(i=l;i--;){_[s++]=m[g++];_[s++]=m[g++];_[s++]=m[g++];_[s++]=255}if(t)for(let e=0;e<s;e+=4){A&&(_[e+0]=A[_[e+0]]);b&&(_[e+1]=b[_[e+1]]);y&&(_[e+2]=y[_[e+2]])}e.putImageData(f,0,16*a)}}}}function putBinaryImageMask(e,t){for(var r=t.height,n=t.width,s=r%16,a=(r-s)/16,i=0===s?a:a+1,o=e.createImageData(n,16),l=0,c=t.data,h=o.data,d=0;d<i;d++){for(var u=d<a?16:s,p=3,f=0;f<u;f++)for(var g=0,m=0;m<n;m++){if(!g){var _=c[l++];g=128}h[p]=_&g?0:255;p+=4;g>>=1}e.putImageData(o,0,16*d)}}function copyCtxState(e,t){for(var r=["strokeStyle","fillStyle","fillRule","globalAlpha","lineWidth","lineCap","lineJoin","miterLimit","globalCompositeOperation","font"],n=0,s=r.length;n<s;n++){var a=r[n];void 0!==e[a]&&(t[a]=e[a])}if(void 0!==e.setLineDash){t.setLineDash(e.getLineDash());t.lineDashOffset=e.lineDashOffset}}function resetCtxToDefault(e){e.strokeStyle="#000000";e.fillStyle="#000000";e.fillRule="nonzero";e.globalAlpha=1;e.lineWidth=1;e.lineCap="butt";e.lineJoin="miter";e.miterLimit=10;e.globalCompositeOperation="source-over";e.font="10px sans-serif";if(void 0!==e.setLineDash){e.setLineDash([]);e.lineDashOffset=0}}function composeSMaskBackdrop(e,t,r,n){for(var s=e.length,a=3;a<s;a+=4){var i=e[a];if(0===i){e[a-3]=t;e[a-2]=r;e[a-1]=n}else if(i<255){var o=255-i;e[a-3]=e[a-3]*i+t*o>>8;e[a-2]=e[a-2]*i+r*o>>8;e[a-1]=e[a-1]*i+n*o>>8}}}function composeSMaskAlpha(e,t,r){for(var n=e.length,s=3;s<n;s+=4){var a=r?r[e[s]]:e[s];t[s]=t[s]*a*(1/255)|0}}function composeSMaskLuminosity(e,t,r){for(var n=e.length,s=3;s<n;s+=4){var a=77*e[s-3]+152*e[s-2]+28*e[s-1];t[s]=r?t[s]*r[a>>8]>>8:t[s]*a>>16}}function composeSMask(e,t,r,n){var s=t.canvas,a=t.context;e.setTransform(t.scaleX,0,0,t.scaleY,t.offsetX,t.offsetY);var i=t.backdrop||null;if(t.transferMap||!n.isEnabled){!function genericComposeSMask(e,t,r,n,s,a,i){var o,l=!!a,c=l?a[0]:0,h=l?a[1]:0,d=l?a[2]:0;o="Luminosity"===s?composeSMaskLuminosity:composeSMaskAlpha;for(var u=Math.min(n,Math.ceil(1048576/r)),p=0;p<n;p+=u){var f=Math.min(u,n-p),g=e.getImageData(0,p,r,f),m=t.getImageData(0,p,r,f);l&&composeSMaskBackdrop(g.data,c,h,d);o(g.data,m.data,i);e.putImageData(m,0,p)}}(a,r,s.width,s.height,t.subtype,i,t.transferMap);e.drawImage(s,0,0)}else{const a=n.composeSMask({layer:r.canvas,mask:s,properties:{subtype:t.subtype,backdrop:i}});e.setTransform(1,0,0,1,0,0);e.drawImage(a,t.offsetX,t.offsetY)}}var e=["butt","round","square"],t=["miter","round","bevel"],r={},o={};CanvasGraphics.prototype={beginDrawing({transform:e,viewport:t,transparency:r=!1,background:n=null}){var s=this.ctx.canvas.width,a=this.ctx.canvas.height;this.ctx.save();this.ctx.fillStyle=n||"rgb(255, 255, 255)";this.ctx.fillRect(0,0,s,a);this.ctx.restore();if(r){var i=this.cachedCanvases.getCanvas("transparent",s,a,!0);this.compositeCtx=this.ctx;this.transparentCanvas=i.canvas;this.ctx=i.context;this.ctx.save();this.ctx.transform.apply(this.ctx,this.compositeCtx.mozCurrentTransform)}this.ctx.save();resetCtxToDefault(this.ctx);e&&this.ctx.transform.apply(this.ctx,e);this.ctx.transform.apply(this.ctx,t.transform);this.baseTransform=this.ctx.mozCurrentTransform.slice();this.imageLayer&&this.imageLayer.beginLayout()},executeOperatorList:function CanvasGraphics_executeOperatorList(e,t,r,s){var a=e.argsArray,i=e.fnArray,o=t||0,l=a.length;if(l===o)return o;for(var c,h=l-o>10&&"function"==typeof r,d=h?Date.now()+15:0,u=0,p=this.commonObjs,f=this.objs;;){if(void 0!==s&&o===s.nextBreakPoint){s.breakIt(o,r);return o}if((c=i[o])!==n.OPS.dependency)this[c].apply(this,a[o]);else for(const e of a[o]){const t=e.startsWith("g_")?p:f;if(!t.has(e)){t.get(e,r);return o}}if(++o===l)return o;if(h&&++u>10){if(Date.now()>d){r();return o}u=0}}},endDrawing:function CanvasGraphics_endDrawing(){null!==this.current.activeSMask&&this.endSMaskGroup();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.transparentCanvas=null}this.cachedCanvases.clear();this.webGLContext.clear();this.imageLayer&&this.imageLayer.endLayout()},setLineWidth:function CanvasGraphics_setLineWidth(e){this.current.lineWidth=e;this.ctx.lineWidth=e},setLineCap:function CanvasGraphics_setLineCap(t){this.ctx.lineCap=e[t]},setLineJoin:function CanvasGraphics_setLineJoin(e){this.ctx.lineJoin=t[e]},setMiterLimit:function CanvasGraphics_setMiterLimit(e){this.ctx.miterLimit=e},setDash:function CanvasGraphics_setDash(e,t){var r=this.ctx;if(void 0!==r.setLineDash){r.setLineDash(e);r.lineDashOffset=t}},setRenderingIntent(e){},setFlatness(e){},setGState:function CanvasGraphics_setGState(e){for(var t=0,r=e.length;t<r;t++){var n=e[t],s=n[0],a=n[1];switch(s){case"LW":this.setLineWidth(a);break;case"LC":this.setLineCap(a);break;case"LJ":this.setLineJoin(a);break;case"ML":this.setMiterLimit(a);break;case"D":this.setDash(a[0],a[1]);break;case"RI":this.setRenderingIntent(a);break;case"FL":this.setFlatness(a);break;case"Font":this.setFont(a[0],a[1]);break;case"CA":this.current.strokeAlpha=n[1];break;case"ca":this.current.fillAlpha=n[1];this.ctx.globalAlpha=n[1];break;case"BM":this.ctx.globalCompositeOperation=a;break;case"SMask":this.current.activeSMask&&(this.stateStack.length>0&&this.stateStack[this.stateStack.length-1].activeSMask===this.current.activeSMask?this.suspendSMaskGroup():this.endSMaskGroup());this.current.activeSMask=a?this.tempSMask:null;this.current.activeSMask&&this.beginSMaskGroup();this.tempSMask=null;break;case"TR":this.current.transferMaps=a}}},beginSMaskGroup:function CanvasGraphics_beginSMaskGroup(){var e=this.current.activeSMask,t=e.canvas.width,r=e.canvas.height,n="smaskGroupAt"+this.groupLevel,s=this.cachedCanvases.getCanvas(n,t,r,!0),a=this.ctx,i=a.mozCurrentTransform;this.ctx.save();var o=s.context;o.scale(1/e.scaleX,1/e.scaleY);o.translate(-e.offsetX,-e.offsetY);o.transform.apply(o,i);e.startTransformInverse=o.mozCurrentTransformInverse;copyCtxState(a,o);this.ctx=o;this.setGState([["BM","source-over"],["ca",1],["CA",1]]);this.groupStack.push(a);this.groupLevel++},suspendSMaskGroup:function CanvasGraphics_endSMaskGroup(){var e=this.ctx;this.groupLevel--;this.ctx=this.groupStack.pop();composeSMask(this.ctx,this.current.activeSMask,e,this.webGLContext);this.ctx.restore();this.ctx.save();copyCtxState(e,this.ctx);this.current.resumeSMaskCtx=e;var t=n.Util.transform(this.current.activeSMask.startTransformInverse,e.mozCurrentTransform);this.ctx.transform.apply(this.ctx,t);e.save();e.setTransform(1,0,0,1,0,0);e.clearRect(0,0,e.canvas.width,e.canvas.height);e.restore()},resumeSMaskGroup:function CanvasGraphics_endSMaskGroup(){var e=this.current.resumeSMaskCtx,t=this.ctx;this.ctx=e;this.groupStack.push(t);this.groupLevel++},endSMaskGroup:function CanvasGraphics_endSMaskGroup(){var e=this.ctx;this.groupLevel--;this.ctx=this.groupStack.pop();composeSMask(this.ctx,this.current.activeSMask,e,this.webGLContext);this.ctx.restore();copyCtxState(e,this.ctx);var t=n.Util.transform(this.current.activeSMask.startTransformInverse,e.mozCurrentTransform);this.ctx.transform.apply(this.ctx,t)},save:function CanvasGraphics_save(){this.ctx.save();var e=this.current;this.stateStack.push(e);this.current=e.clone();this.current.resumeSMaskCtx=null},restore:function CanvasGraphics_restore(){this.current.resumeSMaskCtx&&this.resumeSMaskGroup();null===this.current.activeSMask||0!==this.stateStack.length&&this.stateStack[this.stateStack.length-1].activeSMask===this.current.activeSMask||this.endSMaskGroup();if(0!==this.stateStack.length){this.current=this.stateStack.pop();this.ctx.restore();this.pendingClip=null;this._cachedGetSinglePixelWidth=null}},transform:function CanvasGraphics_transform(e,t,r,n,s,a){this.ctx.transform(e,t,r,n,s,a);this._cachedGetSinglePixelWidth=null},constructPath:function CanvasGraphics_constructPath(e,t){for(var r=this.ctx,s=this.current,a=s.x,i=s.y,o=0,l=0,c=e.length;o<c;o++)switch(0|e[o]){case n.OPS.rectangle:a=t[l++];i=t[l++];var h=t[l++],d=t[l++];0===h&&r.lineWidth<this.getSinglePixelWidth()&&(h=this.getSinglePixelWidth());0===d&&r.lineWidth<this.getSinglePixelWidth()&&(d=this.getSinglePixelWidth());var u=a+h,p=i+d;r.moveTo(a,i);r.lineTo(u,i);r.lineTo(u,p);r.lineTo(a,p);r.lineTo(a,i);r.closePath();break;case n.OPS.moveTo:a=t[l++];i=t[l++];r.moveTo(a,i);break;case n.OPS.lineTo:a=t[l++];i=t[l++];r.lineTo(a,i);break;case n.OPS.curveTo:a=t[l+4];i=t[l+5];r.bezierCurveTo(t[l],t[l+1],t[l+2],t[l+3],a,i);l+=6;break;case n.OPS.curveTo2:r.bezierCurveTo(a,i,t[l],t[l+1],t[l+2],t[l+3]);a=t[l+2];i=t[l+3];l+=4;break;case n.OPS.curveTo3:a=t[l+2];i=t[l+3];r.bezierCurveTo(t[l],t[l+1],a,i,a,i);l+=4;break;case n.OPS.closePath:r.closePath()}s.setCurrentPoint(a,i)},closePath:function CanvasGraphics_closePath(){this.ctx.closePath()},stroke:function CanvasGraphics_stroke(e){e=void 0===e||e;var t=this.ctx,r=this.current.strokeColor;t.globalAlpha=this.current.strokeAlpha;if(this.contentVisible)if(r&&r.hasOwnProperty("type")&&"Pattern"===r.type){t.save();const e=t.mozCurrentTransform,s=n.Util.singularValueDecompose2dScale(e)[0];t.strokeStyle=r.getPattern(t,this);t.lineWidth=Math.max(.65*this.getSinglePixelWidth(),this.current.lineWidth*s);t.stroke();t.restore()}else{t.lineWidth=Math.max(.65*this.getSinglePixelWidth(),this.current.lineWidth);t.stroke()}e&&this.consumePath();t.globalAlpha=this.current.fillAlpha},closeStroke:function CanvasGraphics_closeStroke(){this.closePath();this.stroke()},fill:function CanvasGraphics_fill(e){e=void 0===e||e;var t=this.ctx,r=this.current.fillColor,n=!1;if(this.current.patternFill){t.save();this.baseTransform&&t.setTransform.apply(t,this.baseTransform);t.fillStyle=r.getPattern(t,this);n=!0}if(this.contentVisible)if(this.pendingEOFill){t.fill("evenodd");this.pendingEOFill=!1}else t.fill();n&&t.restore();e&&this.consumePath()},eoFill:function CanvasGraphics_eoFill(){this.pendingEOFill=!0;this.fill()},fillStroke:function CanvasGraphics_fillStroke(){this.fill(!1);this.stroke(!1);this.consumePath()},eoFillStroke:function CanvasGraphics_eoFillStroke(){this.pendingEOFill=!0;this.fillStroke()},closeFillStroke:function CanvasGraphics_closeFillStroke(){this.closePath();this.fillStroke()},closeEOFillStroke:function CanvasGraphics_closeEOFillStroke(){this.pendingEOFill=!0;this.closePath();this.fillStroke()},endPath:function CanvasGraphics_endPath(){this.consumePath()},clip:function CanvasGraphics_clip(){this.pendingClip=r},eoClip:function CanvasGraphics_eoClip(){this.pendingClip=o},beginText:function CanvasGraphics_beginText(){this.current.textMatrix=n.IDENTITY_MATRIX;this.current.textMatrixScale=1;this.current.x=this.current.lineX=0;this.current.y=this.current.lineY=0},endText:function CanvasGraphics_endText(){var e=this.pendingTextPaths,t=this.ctx;if(void 0!==e){t.save();t.beginPath();for(var r=0;r<e.length;r++){var n=e[r];t.setTransform.apply(t,n.transform);t.translate(n.x,n.y);n.addToPath(t,n.fontSize)}t.restore();t.clip();t.beginPath();delete this.pendingTextPaths}else t.beginPath()},setCharSpacing:function CanvasGraphics_setCharSpacing(e){this.current.charSpacing=e},setWordSpacing:function CanvasGraphics_setWordSpacing(e){this.current.wordSpacing=e},setHScale:function CanvasGraphics_setHScale(e){this.current.textHScale=e/100},setLeading:function CanvasGraphics_setLeading(e){this.current.leading=-e},setFont:function CanvasGraphics_setFont(e,t){var r=this.commonObjs.get(e),s=this.current;if(!r)throw new Error("Can't find font for "+e);s.fontMatrix=r.fontMatrix?r.fontMatrix:n.FONT_IDENTITY_MATRIX;0!==s.fontMatrix[0]&&0!==s.fontMatrix[3]||(0,n.warn)("Invalid font matrix for font "+e);if(t<0){t=-t;s.fontDirection=-1}else s.fontDirection=1;this.current.font=r;this.current.fontSize=t;if(r.isType3Font)return;var a=r.loadedName||"sans-serif";let i="normal";r.black?i="900":r.bold&&(i="bold");var o=r.italic?"italic":"normal",l=`"${a}", ${r.fallbackName}`;let c=t;t<16?c=16:t>100&&(c=100);this.current.fontSizeScale=t/c;this.ctx.font=`${o} ${i} ${c}px ${l}`},setTextRenderingMode:function CanvasGraphics_setTextRenderingMode(e){this.current.textRenderingMode=e},setTextRise:function CanvasGraphics_setTextRise(e){this.current.textRise=e},moveText:function CanvasGraphics_moveText(e,t){this.current.x=this.current.lineX+=e;this.current.y=this.current.lineY+=t},setLeadingMoveText:function CanvasGraphics_setLeadingMoveText(e,t){this.setLeading(-t);this.moveText(e,t)},setTextMatrix:function CanvasGraphics_setTextMatrix(e,t,r,n,s,a){this.current.textMatrix=[e,t,r,n,s,a];this.current.textMatrixScale=Math.sqrt(e*e+t*t);this.current.x=this.current.lineX=0;this.current.y=this.current.lineY=0},nextLine:function CanvasGraphics_nextLine(){this.moveText(0,this.current.leading)},paintChar(e,t,r,s){var a=this.ctx,i=this.current,o=i.font,l=i.textRenderingMode,c=i.fontSize/i.fontSizeScale,h=l&n.TextRenderingMode.FILL_STROKE_MASK,d=!!(l&n.TextRenderingMode.ADD_TO_PATH_FLAG);const u=i.patternFill&&!o.missingFile;var p;(o.disableFontFace||d||u)&&(p=o.getPathGenerator(this.commonObjs,e));if(o.disableFontFace||u){a.save();a.translate(t,r);a.beginPath();p(a,c);s&&a.setTransform.apply(a,s);h!==n.TextRenderingMode.FILL&&h!==n.TextRenderingMode.FILL_STROKE||a.fill();h!==n.TextRenderingMode.STROKE&&h!==n.TextRenderingMode.FILL_STROKE||a.stroke();a.restore()}else{h!==n.TextRenderingMode.FILL&&h!==n.TextRenderingMode.FILL_STROKE||a.fillText(e,t,r);h!==n.TextRenderingMode.STROKE&&h!==n.TextRenderingMode.FILL_STROKE||a.strokeText(e,t,r)}if(d){(this.pendingTextPaths||(this.pendingTextPaths=[])).push({transform:a.mozCurrentTransform,x:t,y:r,fontSize:c,addToPath:p})}},get isFontSubpixelAAEnabled(){const{context:e}=this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled",10,10);e.scale(1.5,1);e.fillText("I",0,10);for(var t=e.getImageData(0,0,10,10).data,r=!1,s=3;s<t.length;s+=4)if(t[s]>0&&t[s]<255){r=!0;break}return(0,n.shadow)(this,"isFontSubpixelAAEnabled",r)},showText:function CanvasGraphics_showText(e){var t=this.current,r=t.font;if(r.isType3Font)return this.showType3Text(e);var s=t.fontSize;if(0===s)return;var a=this.ctx,i=t.fontSizeScale,o=t.charSpacing,l=t.wordSpacing,c=t.fontDirection,h=t.textHScale*c,d=e.length,u=r.vertical,p=u?1:-1,f=r.defaultVMetrics,g=s*t.fontMatrix[0],m=t.textRenderingMode===n.TextRenderingMode.FILL&&!r.disableFontFace&&!t.patternFill;a.save();let _;if(t.patternFill){a.save();const e=t.fillColor.getPattern(a,this);_=a.mozCurrentTransform;a.restore();a.fillStyle=e}a.transform.apply(a,t.textMatrix);a.translate(t.x,t.y+t.textRise);c>0?a.scale(h,-1):a.scale(h,1);var A=t.lineWidth,b=t.textMatrixScale;if(0===b||0===A){var y=t.textRenderingMode&n.TextRenderingMode.FILL_STROKE_MASK;if(y===n.TextRenderingMode.STROKE||y===n.TextRenderingMode.FILL_STROKE){this._cachedGetSinglePixelWidth=null;A=.65*this.getSinglePixelWidth()}}else A/=b;if(1!==i){a.scale(i,i);A/=i}a.lineWidth=A;var v,C=0;for(v=0;v<d;++v){var S=e[v];if((0,n.isNum)(S))C+=p*S*s/1e3;else{var x,P,k,R,w=!1,T=(S.isSpace?l:0)+o,E=S.fontChar,F=S.accent,L=S.width;if(u){var M,D,O;M=S.vmetric||f;D=-(D=S.vmetric?M[1]:.5*L)*g;O=M[2]*g;L=M?-M[0]:L;x=D/i;P=(C+O)/i}else{x=C/i;P=0}if(r.remeasure&&L>0){var I=1e3*a.measureText(E).width/s*i;if(L<I&&this.isFontSubpixelAAEnabled){var N=L/I;w=!0;a.save();a.scale(N,1);x/=N}else L!==I&&(x+=(L-I)/2e3*s/i)}if(this.contentVisible&&(S.isInFont||r.missingFile))if(m&&!F)a.fillText(E,x,P);else{this.paintChar(E,x,P,_);if(F){k=x+s*F.offset.x/i;R=P-s*F.offset.y/i;this.paintChar(F.fontChar,k,R,_)}}C+=u?L*g-T*c:L*g+T*c;w&&a.restore()}}u?t.y-=C:t.x+=C*h;a.restore()},showType3Text:function CanvasGraphics_showType3Text(e){var t,r,s,a,i=this.ctx,o=this.current,l=o.font,c=o.fontSize,h=o.fontDirection,d=l.vertical?1:-1,u=o.charSpacing,p=o.wordSpacing,f=o.textHScale*h,g=o.fontMatrix||n.FONT_IDENTITY_MATRIX,m=e.length;if(!(o.textRenderingMode===n.TextRenderingMode.INVISIBLE)&&0!==c){this._cachedGetSinglePixelWidth=null;i.save();i.transform.apply(i,o.textMatrix);i.translate(o.x,o.y);i.scale(f,h);for(t=0;t<m;++t){r=e[t];if((0,n.isNum)(r)){a=d*r*c/1e3;this.ctx.translate(a,0);o.x+=a*f}else{var _=(r.isSpace?p:0)+u,A=l.charProcOperatorList[r.operatorListId];if(A){if(this.contentVisible){this.processingType3=r;this.save();i.scale(c,c);i.transform.apply(i,g);this.executeOperatorList(A);this.restore()}s=n.Util.applyTransform([r.width,0],g)[0]*c+_;i.translate(s,0);o.x+=s*f}else(0,n.warn)(`Type3 character "${r.operatorListId}" is not available.`)}}i.restore();this.processingType3=null}},setCharWidth:function CanvasGraphics_setCharWidth(e,t){},setCharWidthAndBounds:function CanvasGraphics_setCharWidthAndBounds(e,t,r,n,s,a){this.ctx.rect(r,n,s-r,a-n);this.clip();this.endPath()},getColorN_Pattern:function CanvasGraphics_getColorN_Pattern(e){var t;if("TilingPattern"===e[0]){var r=e[1],n=this.baseTransform||this.ctx.mozCurrentTransform.slice(),a={createCanvasGraphics:e=>new CanvasGraphics(e,this.commonObjs,this.objs,this.canvasFactory,this.webGLContext)};t=new s.TilingPattern(e,r,this.ctx,a,n)}else t=(0,s.getShadingPatternFromIR)(e);return t},setStrokeColorN:function CanvasGraphics_setStrokeColorN(){this.current.strokeColor=this.getColorN_Pattern(arguments)},setFillColorN:function CanvasGraphics_setFillColorN(){this.current.fillColor=this.getColorN_Pattern(arguments);this.current.patternFill=!0},setStrokeRGBColor:function CanvasGraphics_setStrokeRGBColor(e,t,r){var s=n.Util.makeCssRgb(e,t,r);this.ctx.strokeStyle=s;this.current.strokeColor=s},setFillRGBColor:function CanvasGraphics_setFillRGBColor(e,t,r){var s=n.Util.makeCssRgb(e,t,r);this.ctx.fillStyle=s;this.current.fillColor=s;this.current.patternFill=!1},shadingFill:function CanvasGraphics_shadingFill(e){if(this.contentVisible){var t=this.ctx;this.save();var r=(0,s.getShadingPatternFromIR)(e);t.fillStyle=r.getPattern(t,this,!0);var a=t.mozCurrentTransformInverse;if(a){var i=t.canvas,o=i.width,l=i.height,c=n.Util.applyTransform([0,0],a),h=n.Util.applyTransform([0,l],a),d=n.Util.applyTransform([o,0],a),u=n.Util.applyTransform([o,l],a),p=Math.min(c[0],h[0],d[0],u[0]),f=Math.min(c[1],h[1],d[1],u[1]),g=Math.max(c[0],h[0],d[0],u[0]),m=Math.max(c[1],h[1],d[1],u[1]);this.ctx.fillRect(p,f,g-p,m-f)}else this.ctx.fillRect(-1e10,-1e10,2e10,2e10);this.restore()}},beginInlineImage:function CanvasGraphics_beginInlineImage(){(0,n.unreachable)("Should not call beginInlineImage")},beginImageData:function CanvasGraphics_beginImageData(){(0,n.unreachable)("Should not call beginImageData")},paintFormXObjectBegin:function CanvasGraphics_paintFormXObjectBegin(e,t){if(this.contentVisible){this.save();this.baseTransformStack.push(this.baseTransform);Array.isArray(e)&&6===e.length&&this.transform.apply(this,e);this.baseTransform=this.ctx.mozCurrentTransform;if(t){var r=t[2]-t[0],n=t[3]-t[1];this.ctx.rect(t[0],t[1],r,n);this.clip();this.endPath()}}},paintFormXObjectEnd:function CanvasGraphics_paintFormXObjectEnd(){if(this.contentVisible){this.restore();this.baseTransform=this.baseTransformStack.pop()}},beginGroup:function CanvasGraphics_beginGroup(e){if(this.contentVisible){this.save();var t=this.ctx;e.isolated||(0,n.info)("TODO: Support non-isolated groups.");e.knockout&&(0,n.warn)("Knockout groups not supported.");var r=t.mozCurrentTransform;e.matrix&&t.transform.apply(t,e.matrix);if(!e.bbox)throw new Error("Bounding box is required.");var s=n.Util.getAxialAlignedBoundingBox(e.bbox,t.mozCurrentTransform),a=[0,0,t.canvas.width,t.canvas.height];s=n.Util.intersect(s,a)||[0,0,0,0];var i=Math.floor(s[0]),o=Math.floor(s[1]),l=Math.max(Math.ceil(s[2])-i,1),c=Math.max(Math.ceil(s[3])-o,1),h=1,d=1;if(l>4096){h=l/4096;l=4096}if(c>4096){d=c/4096;c=4096}var u="groupAt"+this.groupLevel;e.smask&&(u+="_smask_"+this.smaskCounter++%2);var p=this.cachedCanvases.getCanvas(u,l,c,!0),f=p.context;f.scale(1/h,1/d);f.translate(-i,-o);f.transform.apply(f,r);if(e.smask)this.smaskStack.push({canvas:p.canvas,context:f,offsetX:i,offsetY:o,scaleX:h,scaleY:d,subtype:e.smask.subtype,backdrop:e.smask.backdrop,transferMap:e.smask.transferMap||null,startTransformInverse:null});else{t.setTransform(1,0,0,1,0,0);t.translate(i,o);t.scale(h,d)}copyCtxState(t,f);this.ctx=f;this.setGState([["BM","source-over"],["ca",1],["CA",1]]);this.groupStack.push(t);this.groupLevel++;this.current.activeSMask=null}},endGroup:function CanvasGraphics_endGroup(e){if(this.contentVisible){this.groupLevel--;var t=this.ctx;this.ctx=this.groupStack.pop();void 0!==this.ctx.imageSmoothingEnabled?this.ctx.imageSmoothingEnabled=!1:this.ctx.mozImageSmoothingEnabled=!1;e.smask?this.tempSMask=this.smaskStack.pop():this.ctx.drawImage(t.canvas,0,0);this.restore()}},beginAnnotations:function CanvasGraphics_beginAnnotations(){this.save();this.baseTransform&&this.ctx.setTransform.apply(this.ctx,this.baseTransform)},endAnnotations:function CanvasGraphics_endAnnotations(){this.restore()},beginAnnotation:function CanvasGraphics_beginAnnotation(e,t,r){this.save();resetCtxToDefault(this.ctx);this.current=new i;if(Array.isArray(e)&&4===e.length){var n=e[2]-e[0],s=e[3]-e[1];this.ctx.rect(e[0],e[1],n,s);this.clip();this.endPath()}this.transform.apply(this,t);this.transform.apply(this,r)},endAnnotation:function CanvasGraphics_endAnnotation(){this.restore()},paintImageMaskXObject:function CanvasGraphics_paintImageMaskXObject(e){if(this.contentVisible){var t=this.ctx,r=e.width,n=e.height,s=this.current.fillColor,a=this.current.patternFill,i=this.processingType3;i&&void 0===i.compiled&&(i.compiled=r<=1e3&&n<=1e3?function compileType3Glyph(e){var t,r,n,s,a=e.width,i=e.height,o=a+1,l=new Uint8Array(o*(i+1)),c=new Uint8Array([0,2,4,0,1,0,5,4,8,10,0,8,0,2,1,0]),h=a+7&-8,d=e.data,u=new Uint8Array(h*i),p=0;for(t=0,s=d.length;t<s;t++)for(var f=128,g=d[t];f>0;){u[p++]=g&f?0:255;f>>=1}var m=0;if(0!==u[p=0]){l[0]=1;++m}for(r=1;r<a;r++){if(u[p]!==u[p+1]){l[r]=u[p]?2:1;++m}p++}if(0!==u[p]){l[r]=2;++m}for(t=1;t<i;t++){n=t*o;if(u[(p=t*h)-h]!==u[p]){l[n]=u[p]?1:8;++m}var _=(u[p]?4:0)+(u[p-h]?8:0);for(r=1;r<a;r++){if(c[_=(_>>2)+(u[p+1]?4:0)+(u[p-h+1]?8:0)]){l[n+r]=c[_];++m}p++}if(u[p-h]!==u[p]){l[n+r]=u[p]?2:4;++m}if(m>1e3)return null}n=t*o;if(0!==u[p=h*(i-1)]){l[n]=8;++m}for(r=1;r<a;r++){if(u[p]!==u[p+1]){l[n+r]=u[p]?4:8;++m}p++}if(0!==u[p]){l[n+r]=4;++m}if(m>1e3)return null;var A=new Int32Array([0,o,-1,0,-o,0,0,0,1]),b=[];for(t=0;m&&t<=i;t++){for(var y=t*o,v=y+a;y<v&&!l[y];)y++;if(y!==v){var C,S=[y%o,t],x=l[y],P=y;do{var k=A[x];do{y+=k}while(!l[y]);if(5!==(C=l[y])&&10!==C){x=C;l[y]=0}else{x=C&51*x>>4;l[y]&=x>>2|x<<2}S.push(y%o);S.push(y/o|0);l[y]||--m}while(P!==y);b.push(S);--t}}return function(e){e.save();e.scale(1/a,-1/i);e.translate(0,-i);e.beginPath();for(let r=0,n=b.length;r<n;r++){var t=b[r];e.moveTo(t[0],t[1]);for(let r=2,n=t.length;r<n;r+=2)e.lineTo(t[r],t[r+1])}e.fill();e.beginPath();e.restore()}}({data:e.data,width:r,height:n}):null);if(i&&i.compiled)i.compiled(t);else{var o=this.cachedCanvases.getCanvas("maskCanvas",r,n),l=o.context;l.save();putBinaryImageMask(l,e);l.globalCompositeOperation="source-in";l.fillStyle=a?s.getPattern(l,this):s;l.fillRect(0,0,r,n);l.restore();this.paintInlineImageXObject(o.canvas)}}},paintImageMaskXObjectRepeat(e,t,r=0,n=0,s,a){if(this.contentVisible){var i=e.width,o=e.height,l=this.current.fillColor,c=this.current.patternFill,h=this.cachedCanvases.getCanvas("maskCanvas",i,o),d=h.context;d.save();putBinaryImageMask(d,e);d.globalCompositeOperation="source-in";d.fillStyle=c?l.getPattern(d,this):l;d.fillRect(0,0,i,o);d.restore();for(var u=this.ctx,p=0,f=a.length;p<f;p+=2){u.save();u.transform(t,r,n,s,a[p],a[p+1]);u.scale(1,-1);u.drawImage(h.canvas,0,0,i,o,0,-1,1,1);u.restore()}}},paintImageMaskXObjectGroup:function CanvasGraphics_paintImageMaskXObjectGroup(e){if(this.contentVisible)for(var t=this.ctx,r=this.current.fillColor,n=this.current.patternFill,s=0,a=e.length;s<a;s++){var i=e[s],o=i.width,l=i.height,c=this.cachedCanvases.getCanvas("maskCanvas",o,l),h=c.context;h.save();putBinaryImageMask(h,i);h.globalCompositeOperation="source-in";h.fillStyle=n?r.getPattern(h,this):r;h.fillRect(0,0,o,l);h.restore();t.save();t.transform.apply(t,i.transform);t.scale(1,-1);t.drawImage(c.canvas,0,0,o,l,0,-1,1,1);t.restore()}},paintImageXObject:function CanvasGraphics_paintImageXObject(e){if(!this.contentVisible)return;const t=e.startsWith("g_")?this.commonObjs.get(e):this.objs.get(e);t?this.paintInlineImageXObject(t):(0,n.warn)("Dependent image isn't ready yet")},paintImageXObjectRepeat:function CanvasGraphics_paintImageXObjectRepeat(e,t,r,s){if(!this.contentVisible)return;const a=e.startsWith("g_")?this.commonObjs.get(e):this.objs.get(e);if(a){for(var i=a.width,o=a.height,l=[],c=0,h=s.length;c<h;c+=2)l.push({transform:[t,0,0,r,s[c],s[c+1]],x:0,y:0,w:i,h:o});this.paintInlineImageXObjectGroup(a,l)}else(0,n.warn)("Dependent image isn't ready yet")},paintInlineImageXObject:function CanvasGraphics_paintInlineImageXObject(e){if(this.contentVisible){var t=e.width,r=e.height,n=this.ctx;this.save();n.scale(1/t,-1/r);var s,a,i=n.mozCurrentTransformInverse,o=i[0],l=i[1],c=Math.max(Math.sqrt(o*o+l*l),1),h=i[2],d=i[3],u=Math.max(Math.sqrt(h*h+d*d),1);if("function"==typeof HTMLElement&&e instanceof HTMLElement||!e.data)s=e;else{var p=(a=this.cachedCanvases.getCanvas("inlineImage",t,r)).context;putBinaryImageData(p,e,this.current.transferMaps);s=a.canvas}for(var f=t,g=r,m="prescale1";c>2&&f>1||u>2&&g>1;){var _=f,A=g;c>2&&f>1&&(c/=f/(_=Math.ceil(f/2)));u>2&&g>1&&(u/=g/(A=Math.ceil(g/2)));(p=(a=this.cachedCanvases.getCanvas(m,_,A)).context).clearRect(0,0,_,A);p.drawImage(s,0,0,f,g,0,0,_,A);s=a.canvas;f=_;g=A;m="prescale1"===m?"prescale2":"prescale1"}n.drawImage(s,0,0,f,g,0,-r,t,r);if(this.imageLayer){var b=this.getCanvasPosition(0,-r);this.imageLayer.appendImage({imgData:e,left:b[0],top:b[1],width:t/i[0],height:r/i[3]})}this.restore()}},paintInlineImageXObjectGroup:function CanvasGraphics_paintInlineImageXObjectGroup(e,t){if(this.contentVisible){var r=this.ctx,n=e.width,s=e.height,a=this.cachedCanvases.getCanvas("inlineImage",n,s);putBinaryImageData(a.context,e,this.current.transferMaps);for(var i=0,o=t.length;i<o;i++){var l=t[i];r.save();r.transform.apply(r,l.transform);r.scale(1,-1);r.drawImage(a.canvas,l.x,l.y,l.w,l.h,0,-1,1,1);if(this.imageLayer){var c=this.getCanvasPosition(l.x,l.y);this.imageLayer.appendImage({imgData:e,left:c[0],top:c[1],width:n,height:s})}r.restore()}}},paintSolidColorImageMask:function CanvasGraphics_paintSolidColorImageMask(){this.contentVisible&&this.ctx.fillRect(0,0,1,1)},markPoint:function CanvasGraphics_markPoint(e){},markPointProps:function CanvasGraphics_markPointProps(e,t){},beginMarkedContent:function CanvasGraphics_beginMarkedContent(e){this.markedContentStack.push({visible:!0})},beginMarkedContentProps:function CanvasGraphics_beginMarkedContentProps(e,t){"OC"===e?this.markedContentStack.push({visible:this.optionalContentConfig.isVisible(t)}):this.markedContentStack.push({visible:!0});this.contentVisible=this.isContentVisible()},endMarkedContent:function CanvasGraphics_endMarkedContent(){this.markedContentStack.pop();this.contentVisible=this.isContentVisible()},beginCompat:function CanvasGraphics_beginCompat(){},endCompat:function CanvasGraphics_endCompat(){},consumePath:function CanvasGraphics_consumePath(){var e=this.ctx;if(this.pendingClip){this.pendingClip===o?e.clip("evenodd"):e.clip();this.pendingClip=null}e.beginPath()},getSinglePixelWidth(e){if(null===this._cachedGetSinglePixelWidth){const e=this.ctx.mozCurrentTransformInverse;this._cachedGetSinglePixelWidth=Math.sqrt(Math.max(e[0]*e[0]+e[1]*e[1],e[2]*e[2]+e[3]*e[3]))}return this._cachedGetSinglePixelWidth},getCanvasPosition:function CanvasGraphics_getCanvasPosition(e,t){var r=this.ctx.mozCurrentTransform;return[r[0]*e+r[2]*t+r[4],r[1]*e+r[3]*t+r[5]]},isContentVisible:function CanvasGraphics_isContentVisible(){for(let e=this.markedContentStack.length-1;e>=0;e--)if(!this.markedContentStack[e].visible)return!1;return!0}};for(var l in n.OPS)CanvasGraphics.prototype[n.OPS[l]]=CanvasGraphics.prototype[l];return CanvasGraphics}();t.CanvasGraphics=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.getShadingPatternFromIR=function getShadingPatternFromIR(e){var t=s[e[0]];if(!t)throw new Error("Unknown IR type: "+e[0]);return t.fromIR(e)};t.TilingPattern=void 0;var n=r(2),s={};function applyBoundingBox(e,t){if(!t||"undefined"==typeof Path2D)return;const r=t[2]-t[0],n=t[3]-t[1],s=new Path2D;s.rect(t[0],t[1],r,n);e.clip(s)}s.RadialAxial={fromIR:function RadialAxial_fromIR(e){var t=e[1],r=e[2],n=e[3],s=e[4],a=e[5],i=e[6],o=e[7];return{type:"Pattern",getPattern:function RadialAxial_getPattern(e){applyBoundingBox(e,r);var l;"axial"===t?l=e.createLinearGradient(s[0],s[1],a[0],a[1]):"radial"===t&&(l=e.createRadialGradient(s[0],s[1],i,a[0],a[1],o));for(var c=0,h=n.length;c<h;++c){var d=n[c];l.addColorStop(d[0],d[1])}return l}}}};var a=function createMeshCanvasClosure(){function drawTriangle(e,t,r,n,s,a,i,o){var l,c=t.coords,h=t.colors,d=e.data,u=4*e.width;if(c[r+1]>c[n+1]){l=r;r=n;n=l;l=a;a=i;i=l}if(c[n+1]>c[s+1]){l=n;n=s;s=l;l=i;i=o;o=l}if(c[r+1]>c[n+1]){l=r;r=n;n=l;l=a;a=i;i=l}var p=(c[r]+t.offsetX)*t.scaleX,f=(c[r+1]+t.offsetY)*t.scaleY,g=(c[n]+t.offsetX)*t.scaleX,m=(c[n+1]+t.offsetY)*t.scaleY,_=(c[s]+t.offsetX)*t.scaleX,A=(c[s+1]+t.offsetY)*t.scaleY;if(!(f>=A))for(var b,y,v,C,S,x,P,k,R=h[a],w=h[a+1],T=h[a+2],E=h[i],F=h[i+1],L=h[i+2],M=h[o],D=h[o+1],O=h[o+2],I=Math.round(f),N=Math.round(A),j=I;j<=N;j++){if(j<m){let e;e=j<f?0:f===m?1:(f-j)/(f-m);b=p-(p-g)*e;y=R-(R-E)*e;v=w-(w-F)*e;C=T-(T-L)*e}else{let e;e=j>A?1:m===A?0:(m-j)/(m-A);b=g-(g-_)*e;y=E-(E-M)*e;v=F-(F-D)*e;C=L-(L-O)*e}let e;e=j<f?0:j>A?1:(f-j)/(f-A);S=p-(p-_)*e;x=R-(R-M)*e;P=w-(w-D)*e;k=T-(T-O)*e;for(var G=Math.round(Math.min(b,S)),U=Math.round(Math.max(b,S)),W=u*j+4*G,q=G;q<=U;q++){e=(b-q)/(b-S);e<0?e=0:e>1&&(e=1);d[W++]=y-(y-x)*e|0;d[W++]=v-(v-P)*e|0;d[W++]=C-(C-k)*e|0;d[W++]=255}}}function drawFigure(e,t,r){var n,s,a=t.coords,i=t.colors;switch(t.type){case"lattice":var o=t.verticesPerRow,l=Math.floor(a.length/o)-1,c=o-1;for(n=0;n<l;n++)for(var h=n*o,d=0;d<c;d++,h++){drawTriangle(e,r,a[h],a[h+1],a[h+o],i[h],i[h+1],i[h+o]);drawTriangle(e,r,a[h+o+1],a[h+1],a[h+o],i[h+o+1],i[h+1],i[h+o])}break;case"triangles":for(n=0,s=a.length;n<s;n+=3)drawTriangle(e,r,a[n],a[n+1],a[n+2],i[n],i[n+1],i[n+2]);break;default:throw new Error("illegal figure")}}return function createMeshCanvas(e,t,r,n,s,a,i,o){var l,c,h,d,u=Math.floor(e[0]),p=Math.floor(e[1]),f=Math.ceil(e[2])-u,g=Math.ceil(e[3])-p,m=Math.min(Math.ceil(Math.abs(f*t[0]*1.1)),3e3),_=Math.min(Math.ceil(Math.abs(g*t[1]*1.1)),3e3),A=f/m,b=g/_,y={coords:r,colors:n,offsetX:-u,offsetY:-p,scaleX:1/A,scaleY:1/b},v=m+4,C=_+4;if(o.isEnabled){l=o.drawFigures({width:m,height:_,backgroundColor:a,figures:s,context:y});(c=i.getCanvas("mesh",v,C,!1)).context.drawImage(l,2,2);l=c.canvas}else{var S=(c=i.getCanvas("mesh",v,C,!1)).context,x=S.createImageData(m,_);if(a){var P=x.data;for(h=0,d=P.length;h<d;h+=4){P[h]=a[0];P[h+1]=a[1];P[h+2]=a[2];P[h+3]=255}}for(h=0;h<s.length;h++)drawFigure(x,s[h],y);S.putImageData(x,2,2);l=c.canvas}return{canvas:l,offsetX:u-2*A,offsetY:p-2*b,scaleX:A,scaleY:b}}}();s.Mesh={fromIR:function Mesh_fromIR(e){var t=e[2],r=e[3],s=e[4],i=e[5],o=e[6],l=e[7],c=e[8];return{type:"Pattern",getPattern:function Mesh_getPattern(e,h,d){applyBoundingBox(e,l);var u;if(d)u=n.Util.singularValueDecompose2dScale(e.mozCurrentTransform);else{u=n.Util.singularValueDecompose2dScale(h.baseTransform);if(o){var p=n.Util.singularValueDecompose2dScale(o);u=[u[0]*p[0],u[1]*p[1]]}}var f=a(i,u,t,r,s,d?null:c,h.cachedCanvases,h.webGLContext);if(!d){e.setTransform.apply(e,h.baseTransform);o&&e.transform.apply(e,o)}e.translate(f.offsetX,f.offsetY);e.scale(f.scaleX,f.scaleY);return e.createPattern(f.canvas,"no-repeat")}}}};s.Dummy={fromIR:function Dummy_fromIR(){return{type:"Pattern",getPattern:function Dummy_fromIR_getPattern(){return"hotpink"}}}};var i=function TilingPatternClosure(){var e=1,t=2;function TilingPattern(e,t,r,n,s){this.operatorList=e[2];this.matrix=e[3]||[1,0,0,1,0,0];this.bbox=e[4];this.xstep=e[5];this.ystep=e[6];this.paintType=e[7];this.tilingType=e[8];this.color=t;this.canvasGraphicsFactory=n;this.baseTransform=s;this.type="Pattern";this.ctx=r}TilingPattern.prototype={createPatternCanvas:function TilinPattern_createPatternCanvas(e){var t=this.operatorList,r=this.bbox,s=this.xstep,a=this.ystep,i=this.paintType,o=this.tilingType,l=this.color,c=this.canvasGraphicsFactory;(0,n.info)("TilingType: "+o);var h=r[0],d=r[1],u=r[2],p=r[3],f=n.Util.singularValueDecompose2dScale(this.matrix),g=n.Util.singularValueDecompose2dScale(this.baseTransform),m=[f[0]*g[0],f[1]*g[1]],_=this.getSizeAndScale(s,this.ctx.canvas.width,m[0]),A=this.getSizeAndScale(a,this.ctx.canvas.height,m[1]),b=e.cachedCanvases.getCanvas("pattern",_.size,A.size,!0),y=b.context,v=c.createCanvasGraphics(y);v.groupLevel=e.groupLevel;this.setFillAndStrokeStyleToContext(v,i,l);v.transform(_.scale,0,0,A.scale,0,0);v.transform(1,0,0,1,-h,-d);this.clipBbox(v,r,h,d,u,p);v.executeOperatorList(t);this.ctx.transform(1,0,0,1,h,d);this.ctx.scale(1/_.scale,1/A.scale);return b.canvas},getSizeAndScale:function TilingPattern_getSizeAndScale(e,t,r){e=Math.abs(e);var n=Math.max(3e3,t),s=Math.ceil(e*r);s>=n?s=n:r=s/e;return{scale:r,size:s}},clipBbox:function clipBbox(e,t,r,n,s,a){if(Array.isArray(t)&&4===t.length){var i=s-r,o=a-n;e.ctx.rect(r,n,i,o);e.clip();e.endPath()}},setFillAndStrokeStyleToContext:function setFillAndStrokeStyleToContext(r,s,a){const i=r.ctx,o=r.current;switch(s){case e:var l=this.ctx;i.fillStyle=l.fillStyle;i.strokeStyle=l.strokeStyle;o.fillColor=l.fillStyle;o.strokeColor=l.strokeStyle;break;case t:var c=n.Util.makeCssRgb(a[0],a[1],a[2]);i.fillStyle=c;i.strokeStyle=c;o.fillColor=c;o.strokeColor=c;break;default:throw new n.FormatError("Unsupported paint type: "+s)}},getPattern:function TilingPattern_getPattern(e,t){(e=this.ctx).setTransform.apply(e,this.baseTransform);e.transform.apply(e,this.matrix);var r=this.createPatternCanvas(t);return e.createPattern(r,"repeat")}};return TilingPattern}();t.TilingPattern=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.GlobalWorkerOptions=void 0;const n=Object.create(null);t.GlobalWorkerOptions=n;n.workerPort=void 0===n.workerPort?null:n.workerPort;n.workerSrc=void 0===n.workerSrc?"":n.workerSrc},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.MessageHandler=void 0;var n=r(2);const s=1,a=2,i=1,o=2,l=3,c=4,h=5,d=6,u=7,p=8;function wrapReason(e){if("object"!=typeof e||null===e)return e;switch(e.name){case"AbortException":return new n.AbortException(e.message);case"MissingPDFException":return new n.MissingPDFException(e.message);case"UnexpectedResponseException":return new n.UnexpectedResponseException(e.message,e.status);case"UnknownErrorException":return new n.UnknownErrorException(e.message,e.details);default:return new n.UnknownErrorException(e.message,e.toString())}}t.MessageHandler=class MessageHandler{constructor(e,t,r){this.sourceName=e;this.targetName=t;this.comObj=r;this.callbackId=1;this.streamId=1;this.postMessageTransfers=!0;this.streamSinks=Object.create(null);this.streamControllers=Object.create(null);this.callbackCapabilities=Object.create(null);this.actionHandler=Object.create(null);this._onComObjOnMessage=e=>{const t=e.data;if(t.targetName!==this.sourceName)return;if(t.stream){this._processStreamMessage(t);return}if(t.callback){const e=t.callbackId,r=this.callbackCapabilities[e];if(!r)throw new Error("Cannot resolve callback "+e);delete this.callbackCapabilities[e];if(t.callback===s)r.resolve(t.data);else{if(t.callback!==a)throw new Error("Unexpected callback case");r.reject(wrapReason(t.reason))}return}const n=this.actionHandler[t.action];if(!n)throw new Error("Unknown action from worker: "+t.action);if(t.callbackId){const e=this.sourceName,i=t.sourceName;new Promise((function(e){e(n(t.data))})).then((function(n){r.postMessage({sourceName:e,targetName:i,callback:s,callbackId:t.callbackId,data:n})}),(function(n){r.postMessage({sourceName:e,targetName:i,callback:a,callbackId:t.callbackId,reason:wrapReason(n)})}))}else t.streamId?this._createStreamSink(t):n(t.data)};r.addEventListener("message",this._onComObjOnMessage)}on(e,t){const r=this.actionHandler;if(r[e])throw new Error(`There is already an actionName called "${e}"`);r[e]=t}send(e,t,r){this._postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,data:t},r)}sendWithPromise(e,t,r){const s=this.callbackId++,a=(0,n.createPromiseCapability)();this.callbackCapabilities[s]=a;try{this._postMessage({sourceName:this.sourceName,targetName:this.targetName,action:e,callbackId:s,data:t},r)}catch(e){a.reject(e)}return a.promise}sendWithStream(e,t,r,s){const a=this.streamId++,o=this.sourceName,l=this.targetName,c=this.comObj;return new ReadableStream({start:r=>{const i=(0,n.createPromiseCapability)();this.streamControllers[a]={controller:r,startCall:i,pullCall:null,cancelCall:null,isClosed:!1};this._postMessage({sourceName:o,targetName:l,action:e,streamId:a,data:t,desiredSize:r.desiredSize},s);return i.promise},pull:e=>{const t=(0,n.createPromiseCapability)();this.streamControllers[a].pullCall=t;c.postMessage({sourceName:o,targetName:l,stream:d,streamId:a,desiredSize:e.desiredSize});return t.promise},cancel:e=>{(0,n.assert)(e instanceof Error,"cancel must have a valid reason");const t=(0,n.createPromiseCapability)();this.streamControllers[a].cancelCall=t;this.streamControllers[a].isClosed=!0;c.postMessage({sourceName:o,targetName:l,stream:i,streamId:a,reason:wrapReason(e)});return t.promise}},r)}_createStreamSink(e){const t=this,r=this.actionHandler[e.action],s=e.streamId,a=this.sourceName,i=e.sourceName,o=this.comObj,d={enqueue(e,r=1,o){if(this.isCancelled)return;const l=this.desiredSize;this.desiredSize-=r;if(l>0&&this.desiredSize<=0){this.sinkCapability=(0,n.createPromiseCapability)();this.ready=this.sinkCapability.promise}t._postMessage({sourceName:a,targetName:i,stream:c,streamId:s,chunk:e},o)},close(){if(!this.isCancelled){this.isCancelled=!0;o.postMessage({sourceName:a,targetName:i,stream:l,streamId:s});delete t.streamSinks[s]}},error(e){(0,n.assert)(e instanceof Error,"error must have a valid reason");if(!this.isCancelled){this.isCancelled=!0;o.postMessage({sourceName:a,targetName:i,stream:h,streamId:s,reason:wrapReason(e)})}},sinkCapability:(0,n.createPromiseCapability)(),onPull:null,onCancel:null,isCancelled:!1,desiredSize:e.desiredSize,ready:null};d.sinkCapability.resolve();d.ready=d.sinkCapability.promise;this.streamSinks[s]=d;new Promise((function(t){t(r(e.data,d))})).then((function(){o.postMessage({sourceName:a,targetName:i,stream:p,streamId:s,success:!0})}),(function(e){o.postMessage({sourceName:a,targetName:i,stream:p,streamId:s,reason:wrapReason(e)})}))}_processStreamMessage(e){const t=e.streamId,r=this.sourceName,s=e.sourceName,a=this.comObj;switch(e.stream){case p:e.success?this.streamControllers[t].startCall.resolve():this.streamControllers[t].startCall.reject(wrapReason(e.reason));break;case u:e.success?this.streamControllers[t].pullCall.resolve():this.streamControllers[t].pullCall.reject(wrapReason(e.reason));break;case d:if(!this.streamSinks[t]){a.postMessage({sourceName:r,targetName:s,stream:u,streamId:t,success:!0});break}this.streamSinks[t].desiredSize<=0&&e.desiredSize>0&&this.streamSinks[t].sinkCapability.resolve();this.streamSinks[t].desiredSize=e.desiredSize;const{onPull:f}=this.streamSinks[e.streamId];new Promise((function(e){e(f&&f())})).then((function(){a.postMessage({sourceName:r,targetName:s,stream:u,streamId:t,success:!0})}),(function(e){a.postMessage({sourceName:r,targetName:s,stream:u,streamId:t,reason:wrapReason(e)})}));break;case c:(0,n.assert)(this.streamControllers[t],"enqueue should have stream controller");if(this.streamControllers[t].isClosed)break;this.streamControllers[t].controller.enqueue(e.chunk);break;case l:(0,n.assert)(this.streamControllers[t],"close should have stream controller");if(this.streamControllers[t].isClosed)break;this.streamControllers[t].isClosed=!0;this.streamControllers[t].controller.close();this._deleteStreamController(t);break;case h:(0,n.assert)(this.streamControllers[t],"error should have stream controller");this.streamControllers[t].controller.error(wrapReason(e.reason));this._deleteStreamController(t);break;case o:e.success?this.streamControllers[t].cancelCall.resolve():this.streamControllers[t].cancelCall.reject(wrapReason(e.reason));this._deleteStreamController(t);break;case i:if(!this.streamSinks[t])break;const{onCancel:g}=this.streamSinks[e.streamId];new Promise((function(t){t(g&&g(wrapReason(e.reason)))})).then((function(){a.postMessage({sourceName:r,targetName:s,stream:o,streamId:t,success:!0})}),(function(e){a.postMessage({sourceName:r,targetName:s,stream:o,streamId:t,reason:wrapReason(e)})}));this.streamSinks[t].sinkCapability.reject(wrapReason(e.reason));this.streamSinks[t].isCancelled=!0;delete this.streamSinks[t];break;default:throw new Error("Unexpected stream case")}}async _deleteStreamController(e){await Promise.allSettled([this.streamControllers[e].startCall,this.streamControllers[e].pullCall,this.streamControllers[e].cancelCall].map((function(e){return e&&e.promise})));delete this.streamControllers[e]}_postMessage(e,t){t&&this.postMessageTransfers?this.comObj.postMessage(e,t):this.comObj.postMessage(e)}destroy(){this.comObj.removeEventListener("message",this._onComObjOnMessage)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.Metadata=void 0;var n=r(2),s=r(15);t.Metadata=class Metadata{constructor(e){(0,n.assert)("string"==typeof e,"Metadata: input is not a string");e=this._repair(e);const t=(new s.SimpleXMLParser).parseFromString(e);this._metadataMap=new Map;t&&this._parse(t)}_repair(e){return e.replace(/^[^<]+/,"").replace(/>\\376\\377([^<]+)/g,(function(e,t){const r=t.replace(/\\([0-3])([0-7])([0-7])/g,(function(e,t,r,n){return String.fromCharCode(64*t+8*r+1*n)})).replace(/&(amp|apos|gt|lt|quot);/g,(function(e,t){switch(t){case"amp":return"&";case"apos":return"'";case"gt":return">";case"lt":return"<";case"quot":return'"'}throw new Error(`_repair: ${t} isn't defined.`)}));let n="";for(let e=0,t=r.length;e<t;e+=2){const t=256*r.charCodeAt(e)+r.charCodeAt(e+1);n+=t>=32&&t<127&&60!==t&&62!==t&&38!==t?String.fromCharCode(t):"&#x"+(65536+t).toString(16).substring(1)+";"}return">"+n}))}_parse(e){let t=e.documentElement;if("rdf:rdf"!==t.nodeName.toLowerCase()){t=t.firstChild;for(;t&&"rdf:rdf"!==t.nodeName.toLowerCase();)t=t.nextSibling}const r=t?t.nodeName.toLowerCase():null;if(!t||"rdf:rdf"!==r||!t.hasChildNodes())return;const n=t.childNodes;for(let e=0,t=n.length;e<t;e++){const t=n[e];if("rdf:description"===t.nodeName.toLowerCase())for(let e=0,r=t.childNodes.length;e<r;e++)if("#text"!==t.childNodes[e].nodeName.toLowerCase()){const r=t.childNodes[e],n=r.nodeName.toLowerCase();this._metadataMap.set(n,r.textContent.trim())}}}get(e){return this._metadataMap.has(e)?this._metadataMap.get(e):null}getAll(){return Object.fromEntries(this._metadataMap)}has(e){return this._metadataMap.has(e)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.SimpleXMLParser=void 0;const n=0,s=-2,a=-3,i=-4,o=-5,l=-6,c=-9;function isWhitespace(e,t){const r=e[t];return" "===r||"\n"===r||"\r"===r||"\t"===r}class SimpleDOMNode{constructor(e,t){this.nodeName=e;this.nodeValue=t;Object.defineProperty(this,"parentNode",{value:null,writable:!0})}get firstChild(){return this.childNodes&&this.childNodes[0]}get nextSibling(){const e=this.parentNode.childNodes;if(!e)return;const t=e.indexOf(this);return-1!==t?e[t+1]:void 0}get textContent(){return this.childNodes?this.childNodes.map((function(e){return e.textContent})).join(""):this.nodeValue||""}hasChildNodes(){return this.childNodes&&this.childNodes.length>0}}t.SimpleXMLParser=class SimpleXMLParser extends class XMLParserBase{_resolveEntities(e){return e.replace(/&([^;]+);/g,(e,t)=>{if("#x"===t.substring(0,2))return String.fromCharCode(parseInt(t.substring(2),16));if("#"===t.substring(0,1))return String.fromCharCode(parseInt(t.substring(1),10));switch(t){case"lt":return"<";case"gt":return">";case"amp":return"&";case"quot":return'"'}return this.onResolveEntity(t)})}_parseContent(e,t){const r=[];let n=t;function skipWs(){for(;n<e.length&&isWhitespace(e,n);)++n}for(;n<e.length&&!isWhitespace(e,n)&&">"!==e[n]&&"/"!==e[n];)++n;const s=e.substring(t,n);skipWs();for(;n<e.length&&">"!==e[n]&&"/"!==e[n]&&"?"!==e[n];){skipWs();let t="",s="";for(;n<e.length&&!isWhitespace(e,n)&&"="!==e[n];){t+=e[n];++n}skipWs();if("="!==e[n])return null;++n;skipWs();const a=e[n];if('"'!==a&&"'"!==a)return null;const i=e.indexOf(a,++n);if(i<0)return null;s=e.substring(n,i);r.push({name:t,value:this._resolveEntities(s)});n=i+1;skipWs()}return{name:s,attributes:r,parsed:n-t}}_parseProcessingInstruction(e,t){let r=t;for(;r<e.length&&!isWhitespace(e,r)&&">"!==e[r]&&"/"!==e[r];)++r;const n=e.substring(t,r);!function skipWs(){for(;r<e.length&&isWhitespace(e,r);)++r}();const s=r;for(;r<e.length&&("?"!==e[r]||">"!==e[r+1]);)++r;return{name:n,value:e.substring(s,r),parsed:r-t}}parseXml(e){let t=0;for(;t<e.length;){let r=t;if("<"===e[t]){++r;let t;switch(e[r]){case"/":++r;t=e.indexOf(">",r);if(t<0){this.onError(c);return}this.onEndElement(e.substring(r,t));r=t+1;break;case"?":++r;const n=this._parseProcessingInstruction(e,r);if("?>"!==e.substring(r+n.parsed,r+n.parsed+2)){this.onError(a);return}this.onPi(n.name,n.value);r+=n.parsed+2;break;case"!":if("--"===e.substring(r+1,r+3)){t=e.indexOf("--\x3e",r+3);if(t<0){this.onError(o);return}this.onComment(e.substring(r+3,t));r=t+3}else if("[CDATA["===e.substring(r+1,r+8)){t=e.indexOf("]]>",r+8);if(t<0){this.onError(s);return}this.onCdata(e.substring(r+8,t));r=t+3}else{if("DOCTYPE"!==e.substring(r+1,r+8)){this.onError(l);return}{const n=e.indexOf("[",r+8);let s=!1;t=e.indexOf(">",r+8);if(t<0){this.onError(i);return}if(n>0&&t>n){t=e.indexOf("]>",r+8);if(t<0){this.onError(i);return}s=!0}const a=e.substring(r+8,t+(s?1:0));this.onDoctype(a);r=t+(s?2:1)}}break;default:const h=this._parseContent(e,r);if(null===h){this.onError(l);return}let d=!1;if("/>"===e.substring(r+h.parsed,r+h.parsed+2))d=!0;else if(">"!==e.substring(r+h.parsed,r+h.parsed+1)){this.onError(c);return}this.onBeginElement(h.name,h.attributes,d);r+=h.parsed+(d?2:1)}}else{for(;r<e.length&&"<"!==e[r];)r++;const n=e.substring(t,r);this.onText(this._resolveEntities(n))}t=r}}onResolveEntity(e){return`&${e};`}onPi(e,t){}onComment(e){}onCdata(e){}onDoctype(e){}onText(e){}onBeginElement(e,t,r){}onEndElement(e){}onError(e){}}{constructor(){super();this._currentFragment=null;this._stack=null;this._errorCode=n}parseFromString(e){this._currentFragment=[];this._stack=[];this._errorCode=n;this.parseXml(e);if(this._errorCode!==n)return;const[t]=this._currentFragment;return t?{documentElement:t}:void 0}onResolveEntity(e){switch(e){case"apos":return"'"}return super.onResolveEntity(e)}onText(e){if(function isWhitespaceString(e){for(let t=0,r=e.length;t<r;t++)if(!isWhitespace(e,t))return!1;return!0}(e))return;const t=new SimpleDOMNode("#text",e);this._currentFragment.push(t)}onCdata(e){const t=new SimpleDOMNode("#text",e);this._currentFragment.push(t)}onBeginElement(e,t,r){const n=new SimpleDOMNode(e);n.childNodes=[];this._currentFragment.push(n);if(!r){this._stack.push(this._currentFragment);this._currentFragment=n.childNodes}}onEndElement(e){this._currentFragment=this._stack.pop()||[];const t=this._currentFragment[this._currentFragment.length-1];if(t)for(let e=0,r=t.childNodes.length;e<r;e++)t.childNodes[e].parentNode=t}onError(e){this._errorCode=e}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.OptionalContentConfig=void 0;var n=r(2);class OptionalContentGroup{constructor(e,t){this.visible=!0;this.name=e;this.intent=t}}t.OptionalContentConfig=class OptionalContentConfig{constructor(e){this.name=null;this.creator=null;this._order=null;this._groups=new Map;if(null!==e){this.name=e.name;this.creator=e.creator;this._order=e.order;for(const t of e.groups)this._groups.set(t.id,new OptionalContentGroup(t.name,t.intent));if("OFF"===e.baseState)for(const e of this._groups)e.visible=!1;for(const t of e.on)this._groups.get(t).visible=!0;for(const t of e.off)this._groups.get(t).visible=!1}}isVisible(e){if("OCG"===e.type){if(!this._groups.has(e.id)){(0,n.warn)("Optional content group not found: "+e.id);return!0}return this._groups.get(e.id).visible}if("OCMD"===e.type){e.expression&&(0,n.warn)("Visibility expression not supported yet.");if(!e.policy||"AnyOn"===e.policy){for(const t of e.ids){if(!this._groups.has(t)){(0,n.warn)("Optional content group not found: "+t);return!0}if(this._groups.get(t).visible)return!0}return!1}if("AllOn"===e.policy){for(const t of e.ids){if(!this._groups.has(t)){(0,n.warn)("Optional content group not found: "+t);return!0}if(!this._groups.get(t).visible)return!1}return!0}if("AnyOff"===e.policy){for(const t of e.ids){if(!this._groups.has(t)){(0,n.warn)("Optional content group not found: "+t);return!0}if(!this._groups.get(t).visible)return!0}return!1}if("AllOff"===e.policy){for(const t of e.ids){if(!this._groups.has(t)){(0,n.warn)("Optional content group not found: "+t);return!0}if(this._groups.get(t).visible)return!1}return!0}(0,n.warn)(`Unknown optional content policy ${e.policy}.`);return!0}(0,n.warn)(`Unknown group type ${e.type}.`);return!0}setVisibility(e,t=!0){this._groups.has(e)?this._groups.get(e).visible=!!t:(0,n.warn)("Optional content group not found: "+e)}getOrder(){return this._groups.size?this._order?this._order.slice():Array.from(this._groups.keys()):null}getGroups(){return this._groups.size?Object.fromEntries(this._groups):null}getGroup(e){return this._groups.get(e)||null}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PDFDataTransportStream=void 0;var n=r(2);t.PDFDataTransportStream=class PDFDataTransportStream{constructor(e,t){(0,n.assert)(t,'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.');this._queuedChunks=[];this._progressiveDone=e.progressiveDone||!1;const r=e.initialData;if(r&&r.length>0){const e=new Uint8Array(r).buffer;this._queuedChunks.push(e)}this._pdfDataRangeTransport=t;this._isStreamingSupported=!e.disableStream;this._isRangeSupported=!e.disableRange;this._contentLength=e.length;this._fullRequestReader=null;this._rangeReaders=[];this._pdfDataRangeTransport.addRangeListener((e,t)=>{this._onReceiveData({begin:e,chunk:t})});this._pdfDataRangeTransport.addProgressListener((e,t)=>{this._onProgress({loaded:e,total:t})});this._pdfDataRangeTransport.addProgressiveReadListener(e=>{this._onReceiveData({chunk:e})});this._pdfDataRangeTransport.addProgressiveDoneListener(()=>{this._onProgressiveDone()});this._pdfDataRangeTransport.transportReady()}_onReceiveData(e){const t=new Uint8Array(e.chunk).buffer;if(void 0===e.begin)this._fullRequestReader?this._fullRequestReader._enqueue(t):this._queuedChunks.push(t);else{const r=this._rangeReaders.some((function(r){if(r._begin!==e.begin)return!1;r._enqueue(t);return!0}));(0,n.assert)(r,"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.")}}get _progressiveDataLength(){return this._fullRequestReader?this._fullRequestReader._loaded:0}_onProgress(e){if(void 0===e.total){const t=this._rangeReaders[0];t&&t.onProgress&&t.onProgress({loaded:e.loaded})}else{const t=this._fullRequestReader;t&&t.onProgress&&t.onProgress({loaded:e.loaded,total:e.total})}}_onProgressiveDone(){this._fullRequestReader&&this._fullRequestReader.progressiveDone();this._progressiveDone=!0}_removeRangeReader(e){const t=this._rangeReaders.indexOf(e);t>=0&&this._rangeReaders.splice(t,1)}getFullReader(){(0,n.assert)(!this._fullRequestReader,"PDFDataTransportStream.getFullReader can only be called once.");const e=this._queuedChunks;this._queuedChunks=null;return new PDFDataTransportStreamReader(this,e,this._progressiveDone)}getRangeReader(e,t){if(t<=this._progressiveDataLength)return null;const r=new PDFDataTransportStreamRangeReader(this,e,t);this._pdfDataRangeTransport.requestDataRange(e,t);this._rangeReaders.push(r);return r}cancelAllRequests(e){this._fullRequestReader&&this._fullRequestReader.cancel(e);this._rangeReaders.slice(0).forEach((function(t){t.cancel(e)}));this._pdfDataRangeTransport.abort()}};class PDFDataTransportStreamReader{constructor(e,t,r=!1){this._stream=e;this._done=r||!1;this._filename=null;this._queuedChunks=t||[];this._loaded=0;for(const e of this._queuedChunks)this._loaded+=e.byteLength;this._requests=[];this._headersReady=Promise.resolve();e._fullRequestReader=this;this.onProgress=null}_enqueue(e){if(!this._done){if(this._requests.length>0){this._requests.shift().resolve({value:e,done:!1})}else this._queuedChunks.push(e);this._loaded+=e.byteLength}}get headersReady(){return this._headersReady}get filename(){return this._filename}get isRangeSupported(){return this._stream._isRangeSupported}get isStreamingSupported(){return this._stream._isStreamingSupported}get contentLength(){return this._stream._contentLength}async read(){if(this._queuedChunks.length>0){return{value:this._queuedChunks.shift(),done:!1}}if(this._done)return{value:void 0,done:!0};const e=(0,n.createPromiseCapability)();this._requests.push(e);return e.promise}cancel(e){this._done=!0;this._requests.forEach((function(e){e.resolve({value:void 0,done:!0})}));this._requests=[]}progressiveDone(){this._done||(this._done=!0)}}class PDFDataTransportStreamRangeReader{constructor(e,t,r){this._stream=e;this._begin=t;this._end=r;this._queuedChunk=null;this._requests=[];this._done=!1;this.onProgress=null}_enqueue(e){if(!this._done){if(0===this._requests.length)this._queuedChunk=e;else{this._requests.shift().resolve({value:e,done:!1});this._requests.forEach((function(e){e.resolve({value:void 0,done:!0})}));this._requests=[]}this._done=!0;this._stream._removeRangeReader(this)}}get isStreamingSupported(){return!1}async read(){if(this._queuedChunk){const e=this._queuedChunk;this._queuedChunk=null;return{value:e,done:!1}}if(this._done)return{value:void 0,done:!0};const e=(0,n.createPromiseCapability)();this._requests.push(e);return e.promise}cancel(e){this._done=!0;this._requests.forEach((function(e){e.resolve({value:void 0,done:!0})}));this._requests=[];this._stream._removeRangeReader(this)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.WebGLContext=void 0;var n=r(2);t.WebGLContext=class WebGLContext{constructor({enable:e=!1}){this._enabled=!0===e}get isEnabled(){let e=this._enabled;e&&(e=s.tryInitGL());return(0,n.shadow)(this,"isEnabled",e)}composeSMask({layer:e,mask:t,properties:r}){return s.composeSMask(e,t,r)}drawFigures({width:e,height:t,backgroundColor:r,figures:n,context:a}){return s.drawFigures(e,t,r,n,a)}clear(){s.cleanup()}};var s=function WebGLUtilsClosure(){function loadShader(e,t,r){var n=e.createShader(r);e.shaderSource(n,t);e.compileShader(n);if(!e.getShaderParameter(n,e.COMPILE_STATUS)){var s=e.getShaderInfoLog(n);throw new Error("Error during shader compilation: "+s)}return n}function createVertexShader(e,t){return loadShader(e,t,e.VERTEX_SHADER)}function createFragmentShader(e,t){return loadShader(e,t,e.FRAGMENT_SHADER)}function createProgram(e,t){for(var r=e.createProgram(),n=0,s=t.length;n<s;++n)e.attachShader(r,t[n]);e.linkProgram(r);if(!e.getProgramParameter(r,e.LINK_STATUS)){var a=e.getProgramInfoLog(r);throw new Error("Error during program linking: "+a)}return r}function createTexture(e,t,r){e.activeTexture(r);var n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST);e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t);return n}var e,t;function generateGL(){if(!e){t=document.createElement("canvas");e=t.getContext("webgl",{premultipliedalpha:!1})}}var r=null;var n=null;return{tryInitGL(){try{generateGL();return!!e}catch(e){}return!1},composeSMask:function composeSMask(n,s,a){var i=n.width,o=n.height;r||function initSmaskGL(){var n,s;generateGL();n=t;t=null;s=e;e=null;var a=createProgram(s,[createVertexShader(s,"  attribute vec2 a_position;                                      attribute vec2 a_texCoord;                                                                                                      uniform vec2 u_resolution;                                                                                                      varying vec2 v_texCoord;                                                                                                        void main() {                                                     vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0;       gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);                                                                              v_texCoord = a_texCoord;                                      }                                                             "),createFragmentShader(s,"  precision mediump float;                                                                                                        uniform vec4 u_backdrop;                                        uniform int u_subtype;                                          uniform sampler2D u_image;                                      uniform sampler2D u_mask;                                                                                                       varying vec2 v_texCoord;                                                                                                        void main() {                                                     vec4 imageColor = texture2D(u_image, v_texCoord);               vec4 maskColor = texture2D(u_mask, v_texCoord);                 if (u_backdrop.a > 0.0) {                                         maskColor.rgb = maskColor.rgb * maskColor.a +                                   u_backdrop.rgb * (1.0 - maskColor.a);         }                                                               float lum;                                                      if (u_subtype == 0) {                                             lum = maskColor.a;                                            } else {                                                          lum = maskColor.r * 0.3 + maskColor.g * 0.59 +                        maskColor.b * 0.11;                                     }                                                               imageColor.a *= lum;                                            imageColor.rgb *= imageColor.a;                                 gl_FragColor = imageColor;                                    }                                                             ")]);s.useProgram(a);var i={};i.gl=s;i.canvas=n;i.resolutionLocation=s.getUniformLocation(a,"u_resolution");i.positionLocation=s.getAttribLocation(a,"a_position");i.backdropLocation=s.getUniformLocation(a,"u_backdrop");i.subtypeLocation=s.getUniformLocation(a,"u_subtype");var o=s.getAttribLocation(a,"a_texCoord"),l=s.getUniformLocation(a,"u_image"),c=s.getUniformLocation(a,"u_mask"),h=s.createBuffer();s.bindBuffer(s.ARRAY_BUFFER,h);s.bufferData(s.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),s.STATIC_DRAW);s.enableVertexAttribArray(o);s.vertexAttribPointer(o,2,s.FLOAT,!1,0,0);s.uniform1i(l,0);s.uniform1i(c,1);r=i}();var l=r,c=l.canvas,h=l.gl;c.width=i;c.height=o;h.viewport(0,0,h.drawingBufferWidth,h.drawingBufferHeight);h.uniform2f(l.resolutionLocation,i,o);a.backdrop?h.uniform4f(l.resolutionLocation,a.backdrop[0],a.backdrop[1],a.backdrop[2],1):h.uniform4f(l.resolutionLocation,0,0,0,0);h.uniform1i(l.subtypeLocation,"Luminosity"===a.subtype?1:0);var d=createTexture(h,n,h.TEXTURE0),u=createTexture(h,s,h.TEXTURE1),p=h.createBuffer();h.bindBuffer(h.ARRAY_BUFFER,p);h.bufferData(h.ARRAY_BUFFER,new Float32Array([0,0,i,0,0,o,0,o,i,0,i,o]),h.STATIC_DRAW);h.enableVertexAttribArray(l.positionLocation);h.vertexAttribPointer(l.positionLocation,2,h.FLOAT,!1,0,0);h.clearColor(0,0,0,0);h.enable(h.BLEND);h.blendFunc(h.ONE,h.ONE_MINUS_SRC_ALPHA);h.clear(h.COLOR_BUFFER_BIT);h.drawArrays(h.TRIANGLES,0,6);h.flush();h.deleteTexture(d);h.deleteTexture(u);h.deleteBuffer(p);return c},drawFigures:function drawFigures(r,s,a,i,o){n||function initFiguresGL(){var r,s;generateGL();r=t;t=null;s=e;e=null;var a=createProgram(s,[createVertexShader(s,"  attribute vec2 a_position;                                      attribute vec3 a_color;                                                                                                         uniform vec2 u_resolution;                                      uniform vec2 u_scale;                                           uniform vec2 u_offset;                                                                                                          varying vec4 v_color;                                                                                                           void main() {                                                     vec2 position = (a_position + u_offset) * u_scale;              vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0;         gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);                                                                              v_color = vec4(a_color / 255.0, 1.0);                         }                                                             "),createFragmentShader(s,"  precision mediump float;                                                                                                        varying vec4 v_color;                                                                                                           void main() {                                                     gl_FragColor = v_color;                                       }                                                             ")]);s.useProgram(a);var i={};i.gl=s;i.canvas=r;i.resolutionLocation=s.getUniformLocation(a,"u_resolution");i.scaleLocation=s.getUniformLocation(a,"u_scale");i.offsetLocation=s.getUniformLocation(a,"u_offset");i.positionLocation=s.getAttribLocation(a,"a_position");i.colorLocation=s.getAttribLocation(a,"a_color");n=i}();var l=n,c=l.canvas,h=l.gl;c.width=r;c.height=s;h.viewport(0,0,h.drawingBufferWidth,h.drawingBufferHeight);h.uniform2f(l.resolutionLocation,r,s);var d,u,p,f=0;for(d=0,u=i.length;d<u;d++)switch(i[d].type){case"lattice":f+=((p=i[d].coords.length/i[d].verticesPerRow|0)-1)*(i[d].verticesPerRow-1)*6;break;case"triangles":f+=i[d].coords.length}var g=new Float32Array(2*f),m=new Uint8Array(3*f),_=o.coords,A=o.colors,b=0,y=0;for(d=0,u=i.length;d<u;d++){var v=i[d],C=v.coords,S=v.colors;switch(v.type){case"lattice":var x=v.verticesPerRow;p=C.length/x|0;for(var P=1;P<p;P++)for(var k=P*x+1,R=1;R<x;R++,k++){g[b]=_[C[k-x-1]];g[b+1]=_[C[k-x-1]+1];g[b+2]=_[C[k-x]];g[b+3]=_[C[k-x]+1];g[b+4]=_[C[k-1]];g[b+5]=_[C[k-1]+1];m[y]=A[S[k-x-1]];m[y+1]=A[S[k-x-1]+1];m[y+2]=A[S[k-x-1]+2];m[y+3]=A[S[k-x]];m[y+4]=A[S[k-x]+1];m[y+5]=A[S[k-x]+2];m[y+6]=A[S[k-1]];m[y+7]=A[S[k-1]+1];m[y+8]=A[S[k-1]+2];g[b+6]=g[b+2];g[b+7]=g[b+3];g[b+8]=g[b+4];g[b+9]=g[b+5];g[b+10]=_[C[k]];g[b+11]=_[C[k]+1];m[y+9]=m[y+3];m[y+10]=m[y+4];m[y+11]=m[y+5];m[y+12]=m[y+6];m[y+13]=m[y+7];m[y+14]=m[y+8];m[y+15]=A[S[k]];m[y+16]=A[S[k]+1];m[y+17]=A[S[k]+2];b+=12;y+=18}break;case"triangles":for(var w=0,T=C.length;w<T;w++){g[b]=_[C[w]];g[b+1]=_[C[w]+1];m[y]=A[S[w]];m[y+1]=A[S[w]+1];m[y+2]=A[S[w]+2];b+=2;y+=3}}}a?h.clearColor(a[0]/255,a[1]/255,a[2]/255,1):h.clearColor(0,0,0,0);h.clear(h.COLOR_BUFFER_BIT);var E=h.createBuffer();h.bindBuffer(h.ARRAY_BUFFER,E);h.bufferData(h.ARRAY_BUFFER,g,h.STATIC_DRAW);h.enableVertexAttribArray(l.positionLocation);h.vertexAttribPointer(l.positionLocation,2,h.FLOAT,!1,0,0);var F=h.createBuffer();h.bindBuffer(h.ARRAY_BUFFER,F);h.bufferData(h.ARRAY_BUFFER,m,h.STATIC_DRAW);h.enableVertexAttribArray(l.colorLocation);h.vertexAttribPointer(l.colorLocation,3,h.UNSIGNED_BYTE,!1,0,0);h.uniform2f(l.scaleLocation,o.scaleX,o.scaleY);h.uniform2f(l.offsetLocation,o.offsetX,o.offsetY);h.drawArrays(h.TRIANGLES,0,f);h.flush();h.deleteBuffer(E);h.deleteBuffer(F);return c},cleanup(){if(r&&r.canvas){r.canvas.width=0;r.canvas.height=0}if(n&&n.canvas){n.canvas.width=0;n.canvas.height=0}r=null;n=null}}}()},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.AnnotationLayer=void 0;var n=r(1),s=r(2),a=r(8);class AnnotationElementFactory{static create(e){switch(e.data.annotationType){case s.AnnotationType.LINK:return new LinkAnnotationElement(e);case s.AnnotationType.TEXT:return new TextAnnotationElement(e);case s.AnnotationType.WIDGET:switch(e.data.fieldType){case"Tx":return new TextWidgetAnnotationElement(e);case"Btn":return e.data.radioButton?new RadioButtonWidgetAnnotationElement(e):e.data.checkBox?new CheckboxWidgetAnnotationElement(e):new PushButtonWidgetAnnotationElement(e);case"Ch":return new ChoiceWidgetAnnotationElement(e)}return new WidgetAnnotationElement(e);case s.AnnotationType.POPUP:return new PopupAnnotationElement(e);case s.AnnotationType.FREETEXT:return new FreeTextAnnotationElement(e);case s.AnnotationType.LINE:return new LineAnnotationElement(e);case s.AnnotationType.SQUARE:return new SquareAnnotationElement(e);case s.AnnotationType.CIRCLE:return new CircleAnnotationElement(e);case s.AnnotationType.POLYLINE:return new PolylineAnnotationElement(e);case s.AnnotationType.CARET:return new CaretAnnotationElement(e);case s.AnnotationType.INK:return new InkAnnotationElement(e);case s.AnnotationType.POLYGON:return new PolygonAnnotationElement(e);case s.AnnotationType.HIGHLIGHT:return new HighlightAnnotationElement(e);case s.AnnotationType.UNDERLINE:return new UnderlineAnnotationElement(e);case s.AnnotationType.SQUIGGLY:return new SquigglyAnnotationElement(e);case s.AnnotationType.STRIKEOUT:return new StrikeOutAnnotationElement(e);case s.AnnotationType.STAMP:return new StampAnnotationElement(e);case s.AnnotationType.FILEATTACHMENT:return new FileAttachmentAnnotationElement(e);default:return new AnnotationElement(e)}}}class AnnotationElement{constructor(e,t=!1,r=!1){this.isRenderable=t;this.data=e.data;this.layer=e.layer;this.page=e.page;this.viewport=e.viewport;this.linkService=e.linkService;this.downloadManager=e.downloadManager;this.imageResourcesPath=e.imageResourcesPath;this.renderInteractiveForms=e.renderInteractiveForms;this.svgFactory=e.svgFactory;this.annotationStorage=e.annotationStorage;t&&(this.container=this._createContainer(r))}_createContainer(e=!1){const t=this.data,r=this.page,n=this.viewport,a=document.createElement("section");let i=t.rect[2]-t.rect[0],o=t.rect[3]-t.rect[1];a.setAttribute("data-annotation-id",t.id);const l=s.Util.normalizeRect([t.rect[0],r.view[3]-t.rect[1]+r.view[1],t.rect[2],r.view[3]-t.rect[3]+r.view[1]]);a.style.transform=`matrix(${n.transform.join(",")})`;a.style.transformOrigin=`-${l[0]}px -${l[1]}px`;if(!e&&t.borderStyle.width>0){a.style.borderWidth=t.borderStyle.width+"px";if(t.borderStyle.style!==s.AnnotationBorderStyleType.UNDERLINE){i-=2*t.borderStyle.width;o-=2*t.borderStyle.width}const e=t.borderStyle.horizontalCornerRadius,r=t.borderStyle.verticalCornerRadius;if(e>0||r>0){const t=`${e}px / ${r}px`;a.style.borderRadius=t}switch(t.borderStyle.style){case s.AnnotationBorderStyleType.SOLID:a.style.borderStyle="solid";break;case s.AnnotationBorderStyleType.DASHED:a.style.borderStyle="dashed";break;case s.AnnotationBorderStyleType.BEVELED:(0,s.warn)("Unimplemented border style: beveled");break;case s.AnnotationBorderStyleType.INSET:(0,s.warn)("Unimplemented border style: inset");break;case s.AnnotationBorderStyleType.UNDERLINE:a.style.borderBottomStyle="solid"}t.color?a.style.borderColor=s.Util.makeCssRgb(0|t.color[0],0|t.color[1],0|t.color[2]):a.style.borderWidth=0}a.style.left=l[0]+"px";a.style.top=l[1]+"px";a.style.width=i+"px";a.style.height=o+"px";return a}_createPopup(e,t,r){if(!t){(t=document.createElement("div")).style.height=e.style.height;t.style.width=e.style.width;e.appendChild(t)}const n=new PopupElement({container:e,trigger:t,color:r.color,title:r.title,modificationDate:r.modificationDate,contents:r.contents,hideWrapper:!0}).render();n.style.left=e.style.width;e.appendChild(n)}render(){(0,s.unreachable)("Abstract method `AnnotationElement.render` called")}}class LinkAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.url||e.data.dest||e.data.action))}render(){this.container.className="linkAnnotation";const{data:e,linkService:t}=this,r=document.createElement("a");e.url?(0,n.addLinkAttributes)(r,{url:e.url,target:e.newWindow?n.LinkTarget.BLANK:t.externalLinkTarget,rel:t.externalLinkRel,enabled:t.externalLinkEnabled}):e.action?this._bindNamedAction(r,e.action):this._bindLink(r,e.dest);this.container.appendChild(r);return this.container}_bindLink(e,t){e.href=this.linkService.getDestinationHash(t);e.onclick=()=>{t&&this.linkService.navigateTo(t);return!1};t&&(e.className="internalLink")}_bindNamedAction(e,t){e.href=this.linkService.getAnchorUrl("");e.onclick=()=>{this.linkService.executeNamedAction(t);return!1};e.className="internalLink"}}class TextAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents))}render(){this.container.className="textAnnotation";const e=document.createElement("img");e.style.height=this.container.style.height;e.style.width=this.container.style.width;e.src=this.imageResourcesPath+"annotation-"+this.data.name.toLowerCase()+".svg";e.alt="[{{type}} Annotation]";e.dataset.l10nId="text_annotation_type";e.dataset.l10nArgs=JSON.stringify({type:this.data.name});this.data.hasPopup||this._createPopup(this.container,e,this.data);this.container.appendChild(e);return this.container}}class WidgetAnnotationElement extends AnnotationElement{render(){return this.container}}class TextWidgetAnnotationElement extends WidgetAnnotationElement{constructor(e){super(e,e.renderInteractiveForms||!e.data.hasAppearance&&!!e.data.fieldValue)}render(){const e=["left","center","right"],t=this.annotationStorage,r=this.data.id;this.container.className="textWidgetAnnotation";let n=null;if(this.renderInteractiveForms){const e=t.getOrCreateValue(r,this.data.fieldValue);if(this.data.multiLine){n=document.createElement("textarea");n.textContent=e}else{n=document.createElement("input");n.type="text";n.setAttribute("value",e)}n.addEventListener("input",(function(e){t.setValue(r,e.target.value)}));n.disabled=this.data.readOnly;n.name=this.data.fieldName;null!==this.data.maxLen&&(n.maxLength=this.data.maxLen);if(this.data.comb){const e=(this.data.rect[2]-this.data.rect[0])/this.data.maxLen;n.classList.add("comb");n.style.letterSpacing=`calc(${e}px - 1ch)`}}else{n=document.createElement("div");n.textContent=this.data.fieldValue;n.style.verticalAlign="middle";n.style.display="table-cell";let e=null;this.data.fontRefName&&this.page.commonObjs.has(this.data.fontRefName)&&(e=this.page.commonObjs.get(this.data.fontRefName));this._setTextStyle(n,e)}null!==this.data.textAlignment&&(n.style.textAlign=e[this.data.textAlignment]);this.container.appendChild(n);return this.container}_setTextStyle(e,t){const r=e.style;r.fontSize=this.data.fontSize+"px";r.direction=this.data.fontDirection<0?"rtl":"ltr";if(!t)return;let n="normal";t.black?n="900":t.bold&&(n="bold");r.fontWeight=n;r.fontStyle=t.italic?"italic":"normal";const s=t.loadedName?`"${t.loadedName}", `:"",a=t.fallbackName||"Helvetica, sans-serif";r.fontFamily=s+a}}class CheckboxWidgetAnnotationElement extends WidgetAnnotationElement{constructor(e){super(e,e.renderInteractiveForms)}render(){const e=this.annotationStorage,t=this.data,r=t.id,n=e.getOrCreateValue(r,t.fieldValue&&"Off"!==t.fieldValue);this.container.className="buttonWidgetAnnotation checkBox";const s=document.createElement("input");s.disabled=t.readOnly;s.type="checkbox";s.name=this.data.fieldName;n&&s.setAttribute("checked",!0);s.addEventListener("change",(function(t){e.setValue(r,t.target.checked)}));this.container.appendChild(s);return this.container}}class RadioButtonWidgetAnnotationElement extends WidgetAnnotationElement{constructor(e){super(e,e.renderInteractiveForms)}render(){this.container.className="buttonWidgetAnnotation radioButton";const e=this.annotationStorage,t=this.data,r=t.id,n=e.getOrCreateValue(r,t.fieldValue===t.buttonValue),s=document.createElement("input");s.disabled=t.readOnly;s.type="radio";s.name=t.fieldName;n&&s.setAttribute("checked",!0);s.addEventListener("change",(function(t){const n=t.target.name;for(const r of document.getElementsByName(n))r!==t.target&&e.setValue(r.parentNode.getAttribute("data-annotation-id"),!1);e.setValue(r,t.target.checked)}));this.container.appendChild(s);return this.container}}class PushButtonWidgetAnnotationElement extends LinkAnnotationElement{render(){const e=super.render();e.className="buttonWidgetAnnotation pushButton";return e}}class ChoiceWidgetAnnotationElement extends WidgetAnnotationElement{constructor(e){super(e,e.renderInteractiveForms)}render(){this.container.className="choiceWidgetAnnotation";const e=this.annotationStorage,t=this.data.id;e.getOrCreateValue(t,this.data.fieldValue.length>0?this.data.fieldValue[0]:null);const r=document.createElement("select");r.disabled=this.data.readOnly;r.name=this.data.fieldName;if(!this.data.combo){r.size=this.data.options.length;this.data.multiSelect&&(r.multiple=!0)}for(const e of this.data.options){const t=document.createElement("option");t.textContent=e.displayValue;t.value=e.exportValue;this.data.fieldValue.includes(e.exportValue)&&t.setAttribute("selected",!0);r.appendChild(t)}r.addEventListener("input",(function(r){const n=r.target.options,s=n[n.selectedIndex].value;e.setValue(t,s)}));this.container.appendChild(r);return this.container}}class PopupAnnotationElement extends AnnotationElement{constructor(e){super(e,!(!e.data.title&&!e.data.contents))}render(){this.container.className="popupAnnotation";if(["Line","Square","Circle","PolyLine","Polygon","Ink"].includes(this.data.parentType))return this.container;const e=`[data-annotation-id="${this.data.parentId}"]`,t=this.layer.querySelector(e);if(!t)return this.container;const r=new PopupElement({container:this.container,trigger:t,color:this.data.color,title:this.data.title,modificationDate:this.data.modificationDate,contents:this.data.contents}),n=parseFloat(t.style.left),s=parseFloat(t.style.width);this.container.style.transformOrigin=`-${n+s}px -${t.style.top}`;this.container.style.left=n+s+"px";this.container.appendChild(r.render());return this.container}}class PopupElement{constructor(e){this.container=e.container;this.trigger=e.trigger;this.color=e.color;this.title=e.title;this.modificationDate=e.modificationDate;this.contents=e.contents;this.hideWrapper=e.hideWrapper||!1;this.pinned=!1}render(){const e=document.createElement("div");e.className="popupWrapper";this.hideElement=this.hideWrapper?e:this.container;this.hideElement.setAttribute("hidden",!0);const t=document.createElement("div");t.className="popup";const r=this.color;if(r){const e=.7*(255-r[0])+r[0],n=.7*(255-r[1])+r[1],a=.7*(255-r[2])+r[2];t.style.backgroundColor=s.Util.makeCssRgb(0|e,0|n,0|a)}const a=document.createElement("h1");a.textContent=this.title;t.appendChild(a);const i=n.PDFDateString.toDateObject(this.modificationDate);if(i){const e=document.createElement("span");e.textContent="{{date}}, {{time}}";e.dataset.l10nId="annotation_date_string";e.dataset.l10nArgs=JSON.stringify({date:i.toLocaleDateString(),time:i.toLocaleTimeString()});t.appendChild(e)}const o=this._formatContents(this.contents);t.appendChild(o);this.trigger.addEventListener("click",this._toggle.bind(this));this.trigger.addEventListener("mouseover",this._show.bind(this,!1));this.trigger.addEventListener("mouseout",this._hide.bind(this,!1));t.addEventListener("click",this._hide.bind(this,!0));e.appendChild(t);return e}_formatContents(e){const t=document.createElement("p"),r=e.split(/(?:\r\n?|\n)/);for(let e=0,n=r.length;e<n;++e){const s=r[e];t.appendChild(document.createTextNode(s));e<n-1&&t.appendChild(document.createElement("br"))}return t}_toggle(){this.pinned?this._hide(!0):this._show(!0)}_show(e=!1){e&&(this.pinned=!0);if(this.hideElement.hasAttribute("hidden")){this.hideElement.removeAttribute("hidden");this.container.style.zIndex+=1}}_hide(e=!0){e&&(this.pinned=!1);if(!this.hideElement.hasAttribute("hidden")&&!this.pinned){this.hideElement.setAttribute("hidden",!0);this.container.style.zIndex-=1}}}class FreeTextAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="freeTextAnnotation";this.data.hasPopup||this._createPopup(this.container,null,this.data);return this.container}}class LineAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="lineAnnotation";const e=this.data,t=e.rect[2]-e.rect[0],r=e.rect[3]-e.rect[1],n=this.svgFactory.create(t,r),s=this.svgFactory.createElement("svg:line");s.setAttribute("x1",e.rect[2]-e.lineCoordinates[0]);s.setAttribute("y1",e.rect[3]-e.lineCoordinates[1]);s.setAttribute("x2",e.rect[2]-e.lineCoordinates[2]);s.setAttribute("y2",e.rect[3]-e.lineCoordinates[3]);s.setAttribute("stroke-width",e.borderStyle.width||1);s.setAttribute("stroke","transparent");n.appendChild(s);this.container.append(n);this._createPopup(this.container,s,e);return this.container}}class SquareAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="squareAnnotation";const e=this.data,t=e.rect[2]-e.rect[0],r=e.rect[3]-e.rect[1],n=this.svgFactory.create(t,r),s=e.borderStyle.width,a=this.svgFactory.createElement("svg:rect");a.setAttribute("x",s/2);a.setAttribute("y",s/2);a.setAttribute("width",t-s);a.setAttribute("height",r-s);a.setAttribute("stroke-width",s||1);a.setAttribute("stroke","transparent");a.setAttribute("fill","none");n.appendChild(a);this.container.append(n);this._createPopup(this.container,a,e);return this.container}}class CircleAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="circleAnnotation";const e=this.data,t=e.rect[2]-e.rect[0],r=e.rect[3]-e.rect[1],n=this.svgFactory.create(t,r),s=e.borderStyle.width,a=this.svgFactory.createElement("svg:ellipse");a.setAttribute("cx",t/2);a.setAttribute("cy",r/2);a.setAttribute("rx",t/2-s/2);a.setAttribute("ry",r/2-s/2);a.setAttribute("stroke-width",s||1);a.setAttribute("stroke","transparent");a.setAttribute("fill","none");n.appendChild(a);this.container.append(n);this._createPopup(this.container,a,e);return this.container}}class PolylineAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0);this.containerClassName="polylineAnnotation";this.svgElementName="svg:polyline"}render(){this.container.className=this.containerClassName;const e=this.data,t=e.rect[2]-e.rect[0],r=e.rect[3]-e.rect[1],n=this.svgFactory.create(t,r);let s=[];for(const t of e.vertices){const r=t.x-e.rect[0],n=e.rect[3]-t.y;s.push(r+","+n)}s=s.join(" ");const a=this.svgFactory.createElement(this.svgElementName);a.setAttribute("points",s);a.setAttribute("stroke-width",e.borderStyle.width||1);a.setAttribute("stroke","transparent");a.setAttribute("fill","none");n.appendChild(a);this.container.append(n);this._createPopup(this.container,a,e);return this.container}}class PolygonAnnotationElement extends PolylineAnnotationElement{constructor(e){super(e);this.containerClassName="polygonAnnotation";this.svgElementName="svg:polygon"}}class CaretAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="caretAnnotation";this.data.hasPopup||this._createPopup(this.container,null,this.data);return this.container}}class InkAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0);this.containerClassName="inkAnnotation";this.svgElementName="svg:polyline"}render(){this.container.className=this.containerClassName;const e=this.data,t=e.rect[2]-e.rect[0],r=e.rect[3]-e.rect[1],n=this.svgFactory.create(t,r);for(const t of e.inkLists){let r=[];for(const n of t){const t=n.x-e.rect[0],s=e.rect[3]-n.y;r.push(`${t},${s}`)}r=r.join(" ");const s=this.svgFactory.createElement(this.svgElementName);s.setAttribute("points",r);s.setAttribute("stroke-width",e.borderStyle.width||1);s.setAttribute("stroke","transparent");s.setAttribute("fill","none");this._createPopup(this.container,s,e);n.appendChild(s)}this.container.append(n);return this.container}}class HighlightAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="highlightAnnotation";this.data.hasPopup||this._createPopup(this.container,null,this.data);return this.container}}class UnderlineAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="underlineAnnotation";this.data.hasPopup||this._createPopup(this.container,null,this.data);return this.container}}class SquigglyAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="squigglyAnnotation";this.data.hasPopup||this._createPopup(this.container,null,this.data);return this.container}}class StrikeOutAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="strikeoutAnnotation";this.data.hasPopup||this._createPopup(this.container,null,this.data);return this.container}}class StampAnnotationElement extends AnnotationElement{constructor(e){super(e,!!(e.data.hasPopup||e.data.title||e.data.contents),!0)}render(){this.container.className="stampAnnotation";this.data.hasPopup||this._createPopup(this.container,null,this.data);return this.container}}class FileAttachmentAnnotationElement extends AnnotationElement{constructor(e){super(e,!0);const{filename:t,content:r}=this.data.file;this.filename=(0,n.getFilenameFromUrl)(t);this.content=r;this.linkService.eventBus&&this.linkService.eventBus.dispatch("fileattachmentannotation",{source:this,id:(0,s.stringToPDFString)(t),filename:t,content:r})}render(){this.container.className="fileAttachmentAnnotation";const e=document.createElement("div");e.style.height=this.container.style.height;e.style.width=this.container.style.width;e.addEventListener("dblclick",this._download.bind(this));this.data.hasPopup||!this.data.title&&!this.data.contents||this._createPopup(this.container,e,this.data);this.container.appendChild(e);return this.container}_download(){this.downloadManager?this.downloadManager.downloadData(this.content,this.filename,""):(0,s.warn)("Download cannot be started due to unavailable download manager")}}t.AnnotationLayer=class AnnotationLayer{static render(e){const t=[],r=[];for(const n of e.annotations)n&&(n.annotationType!==s.AnnotationType.POPUP?t.push(n):r.push(n));r.length&&t.push(...r);for(const r of t){const t=AnnotationElementFactory.create({data:r,layer:e.div,page:e.page,viewport:e.viewport,linkService:e.linkService,downloadManager:e.downloadManager,imageResourcesPath:e.imageResourcesPath||"",renderInteractiveForms:"boolean"!=typeof e.renderInteractiveForms||e.renderInteractiveForms,svgFactory:new n.DOMSVGFactory,annotationStorage:e.annotationStorage||new a.AnnotationStorage});t.isRenderable&&e.div.appendChild(t.render())}}static update(e){for(const t of e.annotations){const r=e.div.querySelector(`[data-annotation-id="${t.id}"]`);r&&(r.style.transform=`matrix(${e.viewport.transform.join(",")})`)}e.div.removeAttribute("hidden")}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.renderTextLayer=void 0;var n=r(2),s=function renderTextLayerClosure(){var e=/\S/;function appendText(t,r,s){var a=document.createElement("span"),i={angle:0,canvasWidth:0,isWhitespace:!1,originalTransform:null,paddingBottom:0,paddingLeft:0,paddingRight:0,paddingTop:0,scale:1};t._textDivs.push(a);if(function isAllWhitespace(t){return!e.test(t)}(r.str)){i.isWhitespace=!0;t._textDivProperties.set(a,i);return}var o=n.Util.transform(t._viewport.transform,r.transform),l=Math.atan2(o[1],o[0]),c=s[r.fontName];c.vertical&&(l+=Math.PI/2);var h=Math.sqrt(o[2]*o[2]+o[3]*o[3]),d=h;c.ascent?d=c.ascent*d:c.descent&&(d=(1+c.descent)*d);let u,p;if(0===l){u=o[4];p=o[5]-d}else{u=o[4]+d*Math.sin(l);p=o[5]-d*Math.cos(l)}a.style.left=u+"px";a.style.top=p+"px";a.style.fontSize=h+"px";a.style.fontFamily=c.fontFamily;a.textContent=r.str;t._fontInspectorEnabled&&(a.dataset.fontName=r.fontName);0!==l&&(i.angle=l*(180/Math.PI));let f=!1;if(r.str.length>1)f=!0;else if(r.transform[0]!==r.transform[3]){const e=Math.abs(r.transform[0]),t=Math.abs(r.transform[3]);e!==t&&Math.max(e,t)/Math.min(e,t)>1.5&&(f=!0)}f&&(c.vertical?i.canvasWidth=r.height*t._viewport.scale:i.canvasWidth=r.width*t._viewport.scale);t._textDivProperties.set(a,i);t._textContentStream&&t._layoutText(a);if(t._enhanceTextSelection){var g=1,m=0;if(0!==l){g=Math.cos(l);m=Math.sin(l)}var _,A,b=(c.vertical?r.height:r.width)*t._viewport.scale,y=h;if(0!==l){_=[g,m,-m,g,u,p];A=n.Util.getAxialAlignedBoundingBox([0,0,b,y],_)}else A=[u,p,u+b,p+y];t._bounds.push({left:A[0],top:A[1],right:A[2],bottom:A[3],div:a,size:[b,y],m:_})}}function render(e){if(!e._canceled){var t=e._textDivs,r=e._capability,n=t.length;if(n>1e5){e._renderingDone=!0;r.resolve()}else{if(!e._textContentStream)for(var s=0;s<n;s++)e._layoutText(t[s]);e._renderingDone=!0;r.resolve()}}}function findPositiveMin(e,t,r){let n=0;for(let s=0;s<r;s++){const r=e[t++];r>0&&(n=n?Math.min(r,n):r)}return n}function expand(e){for(var t=e._bounds,r=e._viewport,s=function expandBounds(e,t,r){var n=r.map((function(e,t){return{x1:e.left,y1:e.top,x2:e.right,y2:e.bottom,index:t,x1New:void 0,x2New:void 0}}));expandBoundsLTR(e,n);var s=new Array(r.length);n.forEach((function(e){var t=e.index;s[t]={left:e.x1New,top:0,right:e.x2New,bottom:0}}));r.map((function(t,r){var a=s[r],i=n[r];i.x1=t.top;i.y1=e-a.right;i.x2=t.bottom;i.y2=e-a.left;i.index=r;i.x1New=void 0;i.x2New=void 0}));expandBoundsLTR(t,n);n.forEach((function(e){var t=e.index;s[t].top=e.x1New;s[t].bottom=e.x2New}));return s}(r.width,r.height,t),a=0;a<s.length;a++){var i=t[a].div,o=e._textDivProperties.get(i);if(0!==o.angle){var l=s[a],c=t[a],h=c.m,d=h[0],u=h[1],p=[[0,0],[0,c.size[1]],[c.size[0],0],c.size],f=new Float64Array(64);p.forEach((function(e,t){var r=n.Util.applyTransform(e,h);f[t+0]=d&&(l.left-r[0])/d;f[t+4]=u&&(l.top-r[1])/u;f[t+8]=d&&(l.right-r[0])/d;f[t+12]=u&&(l.bottom-r[1])/u;f[t+16]=u&&(l.left-r[0])/-u;f[t+20]=d&&(l.top-r[1])/d;f[t+24]=u&&(l.right-r[0])/-u;f[t+28]=d&&(l.bottom-r[1])/d;f[t+32]=d&&(l.left-r[0])/-d;f[t+36]=u&&(l.top-r[1])/-u;f[t+40]=d&&(l.right-r[0])/-d;f[t+44]=u&&(l.bottom-r[1])/-u;f[t+48]=u&&(l.left-r[0])/u;f[t+52]=d&&(l.top-r[1])/-d;f[t+56]=u&&(l.right-r[0])/u;f[t+60]=d&&(l.bottom-r[1])/-d}));var g=1+Math.min(Math.abs(d),Math.abs(u));o.paddingLeft=findPositiveMin(f,32,16)/g;o.paddingTop=findPositiveMin(f,48,16)/g;o.paddingRight=findPositiveMin(f,0,16)/g;o.paddingBottom=findPositiveMin(f,16,16)/g;e._textDivProperties.set(i,o)}else{o.paddingLeft=t[a].left-s[a].left;o.paddingTop=t[a].top-s[a].top;o.paddingRight=s[a].right-t[a].right;o.paddingBottom=s[a].bottom-t[a].bottom;e._textDivProperties.set(i,o)}}}function expandBoundsLTR(e,t){t.sort((function(e,t){return e.x1-t.x1||e.index-t.index}));var r=[{start:-1/0,end:1/0,boundary:{x1:-1/0,y1:-1/0,x2:0,y2:1/0,index:-1,x1New:0,x2New:0}}];t.forEach((function(e){for(var t=0;t<r.length&&r[t].end<=e.y1;)t++;for(var n,s,a=r.length-1;a>=0&&r[a].start>=e.y2;)a--;var i,o,l=-1/0;for(i=t;i<=a;i++){var c;(c=(s=(n=r[i]).boundary).x2>e.x1?s.index>e.index?s.x1New:e.x1:void 0===s.x2New?(s.x2+e.x1)/2:s.x2New)>l&&(l=c)}e.x1New=l;for(i=t;i<=a;i++)void 0===(s=(n=r[i]).boundary).x2New?s.x2>e.x1?s.index>e.index&&(s.x2New=s.x2):s.x2New=l:s.x2New>l&&(s.x2New=Math.max(l,s.x2));var h=[],d=null;for(i=t;i<=a;i++){var u=(s=(n=r[i]).boundary).x2>e.x2?s:e;if(d===u)h[h.length-1].end=n.end;else{h.push({start:n.start,end:n.end,boundary:u});d=u}}if(r[t].start<e.y1){h[0].start=e.y1;h.unshift({start:r[t].start,end:e.y1,boundary:r[t].boundary})}if(e.y2<r[a].end){h[h.length-1].end=e.y2;h.push({start:e.y2,end:r[a].end,boundary:r[a].boundary})}for(i=t;i<=a;i++)if(void 0===(s=(n=r[i]).boundary).x2New){var p=!1;for(o=t-1;!p&&o>=0&&r[o].start>=s.y1;o--)p=r[o].boundary===s;for(o=a+1;!p&&o<r.length&&r[o].end<=s.y2;o++)p=r[o].boundary===s;for(o=0;!p&&o<h.length;o++)p=h[o].boundary===s;p||(s.x2New=l)}Array.prototype.splice.apply(r,[t,a-t+1].concat(h))}));r.forEach((function(t){var r=t.boundary;void 0===r.x2New&&(r.x2New=Math.max(e,r.x2))}))}function TextLayerRenderTask({textContent:e,textContentStream:t,container:r,viewport:s,textDivs:a,textContentItemsStr:i,enhanceTextSelection:o}){this._textContent=e;this._textContentStream=t;this._container=r;this._document=r.ownerDocument;this._viewport=s;this._textDivs=a||[];this._textContentItemsStr=i||[];this._enhanceTextSelection=!!o;this._fontInspectorEnabled=!(!globalThis.FontInspector||!globalThis.FontInspector.enabled);this._reader=null;this._layoutTextLastFontSize=null;this._layoutTextLastFontFamily=null;this._layoutTextCtx=null;this._textDivProperties=new WeakMap;this._renderingDone=!1;this._canceled=!1;this._capability=(0,n.createPromiseCapability)();this._renderTimer=null;this._bounds=[];this._capability.promise.finally(()=>{if(this._layoutTextCtx){this._layoutTextCtx.canvas.width=0;this._layoutTextCtx.canvas.height=0;this._layoutTextCtx=null}}).catch(()=>{})}TextLayerRenderTask.prototype={get promise(){return this._capability.promise},cancel:function TextLayer_cancel(){this._canceled=!0;if(this._reader){this._reader.cancel(new n.AbortException("TextLayer task cancelled."));this._reader=null}if(null!==this._renderTimer){clearTimeout(this._renderTimer);this._renderTimer=null}this._capability.reject(new Error("TextLayer task cancelled."))},_processItems(e,t){for(let r=0,n=e.length;r<n;r++){this._textContentItemsStr.push(e[r].str);appendText(this,e[r],t)}},_layoutText(e){const t=this._textDivProperties.get(e);if(t.isWhitespace)return;let r="";if(0!==t.canvasWidth){const{fontSize:n,fontFamily:s}=e.style;if(n!==this._layoutTextLastFontSize||s!==this._layoutTextLastFontFamily){this._layoutTextCtx.font=`${n} ${s}`;this._layoutTextLastFontSize=n;this._layoutTextLastFontFamily=s}const{width:a}=this._layoutTextCtx.measureText(e.textContent);if(a>0){t.scale=t.canvasWidth/a;r=`scaleX(${t.scale})`}}0!==t.angle&&(r=`rotate(${t.angle}deg) ${r}`);if(r.length>0){this._enhanceTextSelection&&(t.originalTransform=r);e.style.transform=r}this._textDivProperties.set(e,t);this._container.appendChild(e)},_render:function TextLayer_render(e){const t=(0,n.createPromiseCapability)();let r=Object.create(null);const s=this._document.createElement("canvas");s.mozOpaque=!0;this._layoutTextCtx=s.getContext("2d",{alpha:!1});if(this._textContent){const e=this._textContent.items,r=this._textContent.styles;this._processItems(e,r);t.resolve()}else{if(!this._textContentStream)throw new Error('Neither "textContent" nor "textContentStream" parameters specified.');{const pump=()=>{this._reader.read().then(({value:e,done:n})=>{if(n)t.resolve();else{Object.assign(r,e.styles);this._processItems(e.items,r);pump()}},t.reject)};this._reader=this._textContentStream.getReader();pump()}}t.promise.then(()=>{r=null;e?this._renderTimer=setTimeout(()=>{render(this);this._renderTimer=null},e):render(this)},this._capability.reject)},expandTextDivs:function TextLayer_expandTextDivs(e){if(!this._enhanceTextSelection||!this._renderingDone)return;if(null!==this._bounds){expand(this);this._bounds=null}const t=[],r=[];for(var n=0,s=this._textDivs.length;n<s;n++){const s=this._textDivs[n],a=this._textDivProperties.get(s);if(!a.isWhitespace)if(e){t.length=0;r.length=0;a.originalTransform&&t.push(a.originalTransform);if(a.paddingTop>0){r.push(a.paddingTop+"px");t.push(`translateY(${-a.paddingTop}px)`)}else r.push(0);a.paddingRight>0?r.push(a.paddingRight/a.scale+"px"):r.push(0);a.paddingBottom>0?r.push(a.paddingBottom+"px"):r.push(0);if(a.paddingLeft>0){r.push(a.paddingLeft/a.scale+"px");t.push(`translateX(${-a.paddingLeft/a.scale}px)`)}else r.push(0);s.style.padding=r.join(" ");t.length&&(s.style.transform=t.join(" "))}else{s.style.padding=null;s.style.transform=a.originalTransform}}}};return function renderTextLayer(e){var t=new TextLayerRenderTask({textContent:e.textContent,textContentStream:e.textContentStream,container:e.container,viewport:e.viewport,textDivs:e.textDivs,textContentItemsStr:e.textContentItemsStr,enhanceTextSelection:e.enhanceTextSelection});t._render(e.timeout);return t}}();t.renderTextLayer=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.SVGGraphics=void 0;var n=r(2),s=r(1),a=r(4);let SVGGraphics=function(){throw new Error("Not implemented: SVGGraphics")};t.SVGGraphics=SVGGraphics;{const e={fontStyle:"normal",fontWeight:"normal",fillColor:"#000000"},r="http://www.w3.org/XML/1998/namespace",i="http://www.w3.org/1999/xlink",o=["butt","round","square"],l=["miter","round","bevel"],c=function(){const e=new Uint8Array([137,80,78,71,13,10,26,10]),t=new Int32Array(256);for(let e=0;e<256;e++){let r=e;for(let e=0;e<8;e++)r=1&r?3988292384^r>>1&2147483647:r>>1&2147483647;t[e]=r}function writePngChunk(e,r,n,s){let a=s;const i=r.length;n[a]=i>>24&255;n[a+1]=i>>16&255;n[a+2]=i>>8&255;n[a+3]=255&i;a+=4;n[a]=255&e.charCodeAt(0);n[a+1]=255&e.charCodeAt(1);n[a+2]=255&e.charCodeAt(2);n[a+3]=255&e.charCodeAt(3);a+=4;n.set(r,a);a+=r.length;const o=function crc32(e,r,n){let s=-1;for(let a=r;a<n;a++){const r=255&(s^e[a]);s=s>>>8^t[r]}return-1^s}(n,s+4,a);n[a]=o>>24&255;n[a+1]=o>>16&255;n[a+2]=o>>8&255;n[a+3]=255&o}function deflateSyncUncompressed(e){let t=e.length;const r=Math.ceil(t/65535),n=new Uint8Array(2+t+5*r+4);let s=0;n[s++]=120;n[s++]=156;let a=0;for(;t>65535;){n[s++]=0;n[s++]=255;n[s++]=255;n[s++]=0;n[s++]=0;n.set(e.subarray(a,a+65535),s);s+=65535;a+=65535;t-=65535}n[s++]=1;n[s++]=255&t;n[s++]=t>>8&255;n[s++]=255&~t;n[s++]=(65535&~t)>>8&255;n.set(e.subarray(a),s);s+=e.length-a;const i=function adler32(e,t,r){let n=1,s=0;for(let a=t;a<r;++a){n=(n+(255&e[a]))%65521;s=(s+n)%65521}return s<<16|n}(e,0,e.length);n[s++]=i>>24&255;n[s++]=i>>16&255;n[s++]=i>>8&255;n[s++]=255&i;return n}function encode(t,r,s,i){const o=t.width,l=t.height;let c,h,d;const u=t.data;switch(r){case n.ImageKind.GRAYSCALE_1BPP:h=0;c=1;d=o+7>>3;break;case n.ImageKind.RGB_24BPP:h=2;c=8;d=3*o;break;case n.ImageKind.RGBA_32BPP:h=6;c=8;d=4*o;break;default:throw new Error("invalid format")}const p=new Uint8Array((1+d)*l);let f=0,g=0;for(let e=0;e<l;++e){p[f++]=0;p.set(u.subarray(g,g+d),f);g+=d;f+=d}if(r===n.ImageKind.GRAYSCALE_1BPP&&i){f=0;for(let e=0;e<l;e++){f++;for(let e=0;e<d;e++)p[f++]^=255}}const m=new Uint8Array([o>>24&255,o>>16&255,o>>8&255,255&o,l>>24&255,l>>16&255,l>>8&255,255&l,c,h,0,0,0]),_=function deflateSync(e){if(!a.isNodeJS)return deflateSyncUncompressed(e);try{let t;t=parseInt(process.versions.node)>=8?e:Buffer.from(e);const r=require("zlib").deflateSync(t,{level:9});return r instanceof Uint8Array?r:new Uint8Array(r)}catch(e){(0,n.warn)("Not compressing PNG because zlib.deflateSync is unavailable: "+e)}return deflateSyncUncompressed(e)}(p),A=e.length+36+m.length+_.length,b=new Uint8Array(A);let y=0;b.set(e,y);y+=e.length;writePngChunk("IHDR",m,b,y);y+=12+m.length;writePngChunk("IDATA",_,b,y);y+=12+_.length;writePngChunk("IEND",new Uint8Array(0),b,y);return(0,n.createObjectURL)(b,"image/png",s)}return function convertImgDataToPng(e,t,r){return encode(e,void 0===e.kind?n.ImageKind.GRAYSCALE_1BPP:e.kind,t,r)}}();class SVGExtraState{constructor(){this.fontSizeScale=1;this.fontWeight=e.fontWeight;this.fontSize=0;this.textMatrix=n.IDENTITY_MATRIX;this.fontMatrix=n.FONT_IDENTITY_MATRIX;this.leading=0;this.textRenderingMode=n.TextRenderingMode.FILL;this.textMatrixScale=1;this.x=0;this.y=0;this.lineX=0;this.lineY=0;this.charSpacing=0;this.wordSpacing=0;this.textHScale=1;this.textRise=0;this.fillColor=e.fillColor;this.strokeColor="#000000";this.fillAlpha=1;this.strokeAlpha=1;this.lineWidth=1;this.lineJoin="";this.lineCap="";this.miterLimit=0;this.dashArray=[];this.dashPhase=0;this.dependencies=[];this.activeClipUrl=null;this.clipGroup=null;this.maskId=""}clone(){return Object.create(this)}setCurrentPoint(e,t){this.x=e;this.y=t}}function pf(e){if(Number.isInteger(e))return e.toString();const t=e.toFixed(10);let r=t.length-1;if("0"!==t[r])return t;do{r--}while("0"===t[r]);return t.substring(0,"."===t[r]?r:r+1)}function pm(e){if(0===e[4]&&0===e[5]){if(0===e[1]&&0===e[2])return 1===e[0]&&1===e[3]?"":`scale(${pf(e[0])} ${pf(e[3])})`;if(e[0]===e[3]&&e[1]===-e[2]){return`rotate(${pf(180*Math.acos(e[0])/Math.PI)})`}}else if(1===e[0]&&0===e[1]&&0===e[2]&&1===e[3])return`translate(${pf(e[4])} ${pf(e[5])})`;return`matrix(${pf(e[0])} ${pf(e[1])} ${pf(e[2])} ${pf(e[3])} ${pf(e[4])} `+pf(e[5])+")"}let h=0,d=0,u=0;t.SVGGraphics=SVGGraphics=class SVGGraphics{constructor(e,t,r=!1){this.svgFactory=new s.DOMSVGFactory;this.current=new SVGExtraState;this.transformMatrix=n.IDENTITY_MATRIX;this.transformStack=[];this.extraStack=[];this.commonObjs=e;this.objs=t;this.pendingClip=null;this.pendingEOFill=!1;this.embedFonts=!1;this.embeddedFonts=Object.create(null);this.cssStyle=null;this.forceDataSchema=!!r;this._operatorIdMapping=[];for(const e in n.OPS)this._operatorIdMapping[n.OPS[e]]=e}save(){this.transformStack.push(this.transformMatrix);const e=this.current;this.extraStack.push(e);this.current=e.clone()}restore(){this.transformMatrix=this.transformStack.pop();this.current=this.extraStack.pop();this.pendingClip=null;this.tgrp=null}group(e){this.save();this.executeOpTree(e);this.restore()}loadDependencies(e){const t=e.fnArray,r=e.argsArray;for(let e=0,s=t.length;e<s;e++)if(t[e]===n.OPS.dependency)for(const t of r[e]){const e=t.startsWith("g_")?this.commonObjs:this.objs,r=new Promise(r=>{e.get(t,r)});this.current.dependencies.push(r)}return Promise.all(this.current.dependencies)}transform(e,t,r,s,a,i){const o=[e,t,r,s,a,i];this.transformMatrix=n.Util.transform(this.transformMatrix,o);this.tgrp=null}getSVG(e,t){this.viewport=t;const r=this._initialize(t);return this.loadDependencies(e).then(()=>{this.transformMatrix=n.IDENTITY_MATRIX;this.executeOpTree(this.convertOpList(e));return r})}convertOpList(e){const t=this._operatorIdMapping,r=e.argsArray,n=e.fnArray,s=[];for(let e=0,a=n.length;e<a;e++){const a=n[e];s.push({fnId:a,fn:t[a],args:r[e]})}return function opListToTree(e){let t=[];const r=[];for(const n of e)if("save"!==n.fn)"restore"===n.fn?t=r.pop():t.push(n);else{t.push({fnId:92,fn:"group",items:[]});r.push(t);t=t[t.length-1].items}return t}(s)}executeOpTree(e){for(const t of e){const e=t.fn,r=t.fnId,s=t.args;switch(0|r){case n.OPS.beginText:this.beginText();break;case n.OPS.dependency:break;case n.OPS.setLeading:this.setLeading(s);break;case n.OPS.setLeadingMoveText:this.setLeadingMoveText(s[0],s[1]);break;case n.OPS.setFont:this.setFont(s);break;case n.OPS.showText:case n.OPS.showSpacedText:this.showText(s[0]);break;case n.OPS.endText:this.endText();break;case n.OPS.moveText:this.moveText(s[0],s[1]);break;case n.OPS.setCharSpacing:this.setCharSpacing(s[0]);break;case n.OPS.setWordSpacing:this.setWordSpacing(s[0]);break;case n.OPS.setHScale:this.setHScale(s[0]);break;case n.OPS.setTextMatrix:this.setTextMatrix(s[0],s[1],s[2],s[3],s[4],s[5]);break;case n.OPS.setTextRise:this.setTextRise(s[0]);break;case n.OPS.setTextRenderingMode:this.setTextRenderingMode(s[0]);break;case n.OPS.setLineWidth:this.setLineWidth(s[0]);break;case n.OPS.setLineJoin:this.setLineJoin(s[0]);break;case n.OPS.setLineCap:this.setLineCap(s[0]);break;case n.OPS.setMiterLimit:this.setMiterLimit(s[0]);break;case n.OPS.setFillRGBColor:this.setFillRGBColor(s[0],s[1],s[2]);break;case n.OPS.setStrokeRGBColor:this.setStrokeRGBColor(s[0],s[1],s[2]);break;case n.OPS.setStrokeColorN:this.setStrokeColorN(s);break;case n.OPS.setFillColorN:this.setFillColorN(s);break;case n.OPS.shadingFill:this.shadingFill(s[0]);break;case n.OPS.setDash:this.setDash(s[0],s[1]);break;case n.OPS.setRenderingIntent:this.setRenderingIntent(s[0]);break;case n.OPS.setFlatness:this.setFlatness(s[0]);break;case n.OPS.setGState:this.setGState(s[0]);break;case n.OPS.fill:this.fill();break;case n.OPS.eoFill:this.eoFill();break;case n.OPS.stroke:this.stroke();break;case n.OPS.fillStroke:this.fillStroke();break;case n.OPS.eoFillStroke:this.eoFillStroke();break;case n.OPS.clip:this.clip("nonzero");break;case n.OPS.eoClip:this.clip("evenodd");break;case n.OPS.paintSolidColorImageMask:this.paintSolidColorImageMask();break;case n.OPS.paintImageXObject:this.paintImageXObject(s[0]);break;case n.OPS.paintInlineImageXObject:this.paintInlineImageXObject(s[0]);break;case n.OPS.paintImageMaskXObject:this.paintImageMaskXObject(s[0]);break;case n.OPS.paintFormXObjectBegin:this.paintFormXObjectBegin(s[0],s[1]);break;case n.OPS.paintFormXObjectEnd:this.paintFormXObjectEnd();break;case n.OPS.closePath:this.closePath();break;case n.OPS.closeStroke:this.closeStroke();break;case n.OPS.closeFillStroke:this.closeFillStroke();break;case n.OPS.closeEOFillStroke:this.closeEOFillStroke();break;case n.OPS.nextLine:this.nextLine();break;case n.OPS.transform:this.transform(s[0],s[1],s[2],s[3],s[4],s[5]);break;case n.OPS.constructPath:this.constructPath(s[0],s[1]);break;case n.OPS.endPath:this.endPath();break;case 92:this.group(t.items);break;default:(0,n.warn)("Unimplemented operator "+e)}}}setWordSpacing(e){this.current.wordSpacing=e}setCharSpacing(e){this.current.charSpacing=e}nextLine(){this.moveText(0,this.current.leading)}setTextMatrix(e,t,r,n,s,a){const i=this.current;i.textMatrix=i.lineMatrix=[e,t,r,n,s,a];i.textMatrixScale=Math.sqrt(e*e+t*t);i.x=i.lineX=0;i.y=i.lineY=0;i.xcoords=[];i.ycoords=[];i.tspan=this.svgFactory.createElement("svg:tspan");i.tspan.setAttributeNS(null,"font-family",i.fontFamily);i.tspan.setAttributeNS(null,"font-size",pf(i.fontSize)+"px");i.tspan.setAttributeNS(null,"y",pf(-i.y));i.txtElement=this.svgFactory.createElement("svg:text");i.txtElement.appendChild(i.tspan)}beginText(){const e=this.current;e.x=e.lineX=0;e.y=e.lineY=0;e.textMatrix=n.IDENTITY_MATRIX;e.lineMatrix=n.IDENTITY_MATRIX;e.textMatrixScale=1;e.tspan=this.svgFactory.createElement("svg:tspan");e.txtElement=this.svgFactory.createElement("svg:text");e.txtgrp=this.svgFactory.createElement("svg:g");e.xcoords=[];e.ycoords=[]}moveText(e,t){const r=this.current;r.x=r.lineX+=e;r.y=r.lineY+=t;r.xcoords=[];r.ycoords=[];r.tspan=this.svgFactory.createElement("svg:tspan");r.tspan.setAttributeNS(null,"font-family",r.fontFamily);r.tspan.setAttributeNS(null,"font-size",pf(r.fontSize)+"px");r.tspan.setAttributeNS(null,"y",pf(-r.y))}showText(t){const s=this.current,a=s.font,i=s.fontSize;if(0===i)return;const o=s.fontSizeScale,l=s.charSpacing,c=s.wordSpacing,h=s.fontDirection,d=s.textHScale*h,u=a.vertical,p=u?1:-1,f=a.defaultVMetrics,g=i*s.fontMatrix[0];let m=0;for(const e of t){if(null===e){m+=h*c;continue}if((0,n.isNum)(e)){m+=p*e*i/1e3;continue}const t=(e.isSpace?c:0)+l,r=e.fontChar;let d,_,A,b=e.width;if(u){let t;const r=e.vmetric||f;t=e.vmetric?r[1]:.5*b;t=-t*g;const n=r[2]*g;b=r?-r[0]:b;d=t/o;_=(m+n)/o}else{d=m/o;_=0}if(e.isInFont||a.missingFile){s.xcoords.push(s.x+d);u&&s.ycoords.push(-s.y+_);s.tspan.textContent+=r}A=u?b*g-t*h:b*g+t*h;m+=A}s.tspan.setAttributeNS(null,"x",s.xcoords.map(pf).join(" "));u?s.tspan.setAttributeNS(null,"y",s.ycoords.map(pf).join(" ")):s.tspan.setAttributeNS(null,"y",pf(-s.y));u?s.y-=m:s.x+=m*d;s.tspan.setAttributeNS(null,"font-family",s.fontFamily);s.tspan.setAttributeNS(null,"font-size",pf(s.fontSize)+"px");s.fontStyle!==e.fontStyle&&s.tspan.setAttributeNS(null,"font-style",s.fontStyle);s.fontWeight!==e.fontWeight&&s.tspan.setAttributeNS(null,"font-weight",s.fontWeight);const _=s.textRenderingMode&n.TextRenderingMode.FILL_STROKE_MASK;if(_===n.TextRenderingMode.FILL||_===n.TextRenderingMode.FILL_STROKE){s.fillColor!==e.fillColor&&s.tspan.setAttributeNS(null,"fill",s.fillColor);s.fillAlpha<1&&s.tspan.setAttributeNS(null,"fill-opacity",s.fillAlpha)}else s.textRenderingMode===n.TextRenderingMode.ADD_TO_PATH?s.tspan.setAttributeNS(null,"fill","transparent"):s.tspan.setAttributeNS(null,"fill","none");if(_===n.TextRenderingMode.STROKE||_===n.TextRenderingMode.FILL_STROKE){const e=1/(s.textMatrixScale||1);this._setStrokeAttributes(s.tspan,e)}let A=s.textMatrix;if(0!==s.textRise){A=A.slice();A[5]+=s.textRise}s.txtElement.setAttributeNS(null,"transform",`${pm(A)} scale(${pf(d)}, -1)`);s.txtElement.setAttributeNS(r,"xml:space","preserve");s.txtElement.appendChild(s.tspan);s.txtgrp.appendChild(s.txtElement);this._ensureTransformGroup().appendChild(s.txtElement)}setLeadingMoveText(e,t){this.setLeading(-t);this.moveText(e,t)}addFontStyle(e){if(!e.data)throw new Error('addFontStyle: No font data available, ensure that the "fontExtraProperties" API parameter is set.');if(!this.cssStyle){this.cssStyle=this.svgFactory.createElement("svg:style");this.cssStyle.setAttributeNS(null,"type","text/css");this.defs.appendChild(this.cssStyle)}const t=(0,n.createObjectURL)(e.data,e.mimetype,this.forceDataSchema);this.cssStyle.textContent+=`@font-face { font-family: "${e.loadedName}"; src: url(${t}); }\n`}setFont(e){const t=this.current,r=this.commonObjs.get(e[0]);let s=e[1];t.font=r;if(this.embedFonts&&!r.missingFile&&!this.embeddedFonts[r.loadedName]){this.addFontStyle(r);this.embeddedFonts[r.loadedName]=r}t.fontMatrix=r.fontMatrix?r.fontMatrix:n.FONT_IDENTITY_MATRIX;let a="normal";r.black?a="900":r.bold&&(a="bold");const i=r.italic?"italic":"normal";if(s<0){s=-s;t.fontDirection=-1}else t.fontDirection=1;t.fontSize=s;t.fontFamily=r.loadedName;t.fontWeight=a;t.fontStyle=i;t.tspan=this.svgFactory.createElement("svg:tspan");t.tspan.setAttributeNS(null,"y",pf(-t.y));t.xcoords=[];t.ycoords=[]}endText(){const e=this.current;if(e.textRenderingMode&n.TextRenderingMode.ADD_TO_PATH_FLAG&&e.txtElement&&e.txtElement.hasChildNodes()){e.element=e.txtElement;this.clip("nonzero");this.endPath()}}setLineWidth(e){e>0&&(this.current.lineWidth=e)}setLineCap(e){this.current.lineCap=o[e]}setLineJoin(e){this.current.lineJoin=l[e]}setMiterLimit(e){this.current.miterLimit=e}setStrokeAlpha(e){this.current.strokeAlpha=e}setStrokeRGBColor(e,t,r){this.current.strokeColor=n.Util.makeCssRgb(e,t,r)}setFillAlpha(e){this.current.fillAlpha=e}setFillRGBColor(e,t,r){this.current.fillColor=n.Util.makeCssRgb(e,t,r);this.current.tspan=this.svgFactory.createElement("svg:tspan");this.current.xcoords=[];this.current.ycoords=[]}setStrokeColorN(e){this.current.strokeColor=this._makeColorN_Pattern(e)}setFillColorN(e){this.current.fillColor=this._makeColorN_Pattern(e)}shadingFill(e){const t=this.viewport.width,r=this.viewport.height,s=n.Util.inverseTransform(this.transformMatrix),a=n.Util.applyTransform([0,0],s),i=n.Util.applyTransform([0,r],s),o=n.Util.applyTransform([t,0],s),l=n.Util.applyTransform([t,r],s),c=Math.min(a[0],i[0],o[0],l[0]),h=Math.min(a[1],i[1],o[1],l[1]),d=Math.max(a[0],i[0],o[0],l[0]),u=Math.max(a[1],i[1],o[1],l[1]),p=this.svgFactory.createElement("svg:rect");p.setAttributeNS(null,"x",c);p.setAttributeNS(null,"y",h);p.setAttributeNS(null,"width",d-c);p.setAttributeNS(null,"height",u-h);p.setAttributeNS(null,"fill",this._makeShadingPattern(e));this.current.fillAlpha<1&&p.setAttributeNS(null,"fill-opacity",this.current.fillAlpha);this._ensureTransformGroup().appendChild(p)}_makeColorN_Pattern(e){return"TilingPattern"===e[0]?this._makeTilingPattern(e):this._makeShadingPattern(e)}_makeTilingPattern(e){const t=e[1],r=e[2],s=e[3]||n.IDENTITY_MATRIX,[a,i,o,l]=e[4],c=e[5],h=e[6],d=e[7],p="shading"+u++,[f,g]=n.Util.applyTransform([a,i],s),[m,_]=n.Util.applyTransform([o,l],s),[A,b]=n.Util.singularValueDecompose2dScale(s),y=c*A,v=h*b,C=this.svgFactory.createElement("svg:pattern");C.setAttributeNS(null,"id",p);C.setAttributeNS(null,"patternUnits","userSpaceOnUse");C.setAttributeNS(null,"width",y);C.setAttributeNS(null,"height",v);C.setAttributeNS(null,"x",""+f);C.setAttributeNS(null,"y",""+g);const S=this.svg,x=this.transformMatrix,P=this.current.fillColor,k=this.current.strokeColor,R=this.svgFactory.create(m-f,_-g);this.svg=R;this.transformMatrix=s;if(2===d){const e=n.Util.makeCssRgb(...t);this.current.fillColor=e;this.current.strokeColor=e}this.executeOpTree(this.convertOpList(r));this.svg=S;this.transformMatrix=x;this.current.fillColor=P;this.current.strokeColor=k;C.appendChild(R.childNodes[0]);this.defs.appendChild(C);return`url(#${p})`}_makeShadingPattern(e){switch(e[0]){case"RadialAxial":const t="shading"+u++,r=e[3];let s;switch(e[1]){case"axial":const r=e[4],n=e[5];s=this.svgFactory.createElement("svg:linearGradient");s.setAttributeNS(null,"id",t);s.setAttributeNS(null,"gradientUnits","userSpaceOnUse");s.setAttributeNS(null,"x1",r[0]);s.setAttributeNS(null,"y1",r[1]);s.setAttributeNS(null,"x2",n[0]);s.setAttributeNS(null,"y2",n[1]);break;case"radial":const a=e[4],i=e[5],o=e[6],l=e[7];s=this.svgFactory.createElement("svg:radialGradient");s.setAttributeNS(null,"id",t);s.setAttributeNS(null,"gradientUnits","userSpaceOnUse");s.setAttributeNS(null,"cx",i[0]);s.setAttributeNS(null,"cy",i[1]);s.setAttributeNS(null,"r",l);s.setAttributeNS(null,"fx",a[0]);s.setAttributeNS(null,"fy",a[1]);s.setAttributeNS(null,"fr",o);break;default:throw new Error("Unknown RadialAxial type: "+e[1])}for(const e of r){const t=this.svgFactory.createElement("svg:stop");t.setAttributeNS(null,"offset",e[0]);t.setAttributeNS(null,"stop-color",e[1]);s.appendChild(t)}this.defs.appendChild(s);return`url(#${t})`;case"Mesh":(0,n.warn)("Unimplemented pattern Mesh");return null;case"Dummy":return"hotpink";default:throw new Error("Unknown IR type: "+e[0])}}setDash(e,t){this.current.dashArray=e;this.current.dashPhase=t}constructPath(e,t){const r=this.current;let s=r.x,a=r.y,i=[],o=0;for(const r of e)switch(0|r){case n.OPS.rectangle:s=t[o++];a=t[o++];const e=s+t[o++],r=a+t[o++];i.push("M",pf(s),pf(a),"L",pf(e),pf(a),"L",pf(e),pf(r),"L",pf(s),pf(r),"Z");break;case n.OPS.moveTo:s=t[o++];a=t[o++];i.push("M",pf(s),pf(a));break;case n.OPS.lineTo:s=t[o++];a=t[o++];i.push("L",pf(s),pf(a));break;case n.OPS.curveTo:s=t[o+4];a=t[o+5];i.push("C",pf(t[o]),pf(t[o+1]),pf(t[o+2]),pf(t[o+3]),pf(s),pf(a));o+=6;break;case n.OPS.curveTo2:i.push("C",pf(s),pf(a),pf(t[o]),pf(t[o+1]),pf(t[o+2]),pf(t[o+3]));s=t[o+2];a=t[o+3];o+=4;break;case n.OPS.curveTo3:s=t[o+2];a=t[o+3];i.push("C",pf(t[o]),pf(t[o+1]),pf(s),pf(a),pf(s),pf(a));o+=4;break;case n.OPS.closePath:i.push("Z")}i=i.join(" ");if(r.path&&e.length>0&&e[0]!==n.OPS.rectangle&&e[0]!==n.OPS.moveTo)i=r.path.getAttributeNS(null,"d")+i;else{r.path=this.svgFactory.createElement("svg:path");this._ensureTransformGroup().appendChild(r.path)}r.path.setAttributeNS(null,"d",i);r.path.setAttributeNS(null,"fill","none");r.element=r.path;r.setCurrentPoint(s,a)}endPath(){const e=this.current;e.path=null;if(!this.pendingClip)return;if(!e.element){this.pendingClip=null;return}const t="clippath"+h++,r=this.svgFactory.createElement("svg:clipPath");r.setAttributeNS(null,"id",t);r.setAttributeNS(null,"transform",pm(this.transformMatrix));const n=e.element.cloneNode(!0);"evenodd"===this.pendingClip?n.setAttributeNS(null,"clip-rule","evenodd"):n.setAttributeNS(null,"clip-rule","nonzero");this.pendingClip=null;r.appendChild(n);this.defs.appendChild(r);if(e.activeClipUrl){e.clipGroup=null;this.extraStack.forEach((function(e){e.clipGroup=null}));r.setAttributeNS(null,"clip-path",e.activeClipUrl)}e.activeClipUrl=`url(#${t})`;this.tgrp=null}clip(e){this.pendingClip=e}closePath(){const e=this.current;if(e.path){const t=e.path.getAttributeNS(null,"d")+"Z";e.path.setAttributeNS(null,"d",t)}}setLeading(e){this.current.leading=-e}setTextRise(e){this.current.textRise=e}setTextRenderingMode(e){this.current.textRenderingMode=e}setHScale(e){this.current.textHScale=e/100}setRenderingIntent(e){}setFlatness(e){}setGState(e){for(const[t,r]of e)switch(t){case"LW":this.setLineWidth(r);break;case"LC":this.setLineCap(r);break;case"LJ":this.setLineJoin(r);break;case"ML":this.setMiterLimit(r);break;case"D":this.setDash(r[0],r[1]);break;case"RI":this.setRenderingIntent(r);break;case"FL":this.setFlatness(r);break;case"Font":this.setFont(r);break;case"CA":this.setStrokeAlpha(r);break;case"ca":this.setFillAlpha(r);break;default:(0,n.warn)("Unimplemented graphic state operator "+t)}}fill(){const e=this.current;if(e.element){e.element.setAttributeNS(null,"fill",e.fillColor);e.element.setAttributeNS(null,"fill-opacity",e.fillAlpha);this.endPath()}}stroke(){const e=this.current;if(e.element){this._setStrokeAttributes(e.element);e.element.setAttributeNS(null,"fill","none");this.endPath()}}_setStrokeAttributes(e,t=1){const r=this.current;let n=r.dashArray;1!==t&&n.length>0&&(n=n.map((function(e){return t*e})));e.setAttributeNS(null,"stroke",r.strokeColor);e.setAttributeNS(null,"stroke-opacity",r.strokeAlpha);e.setAttributeNS(null,"stroke-miterlimit",pf(r.miterLimit));e.setAttributeNS(null,"stroke-linecap",r.lineCap);e.setAttributeNS(null,"stroke-linejoin",r.lineJoin);e.setAttributeNS(null,"stroke-width",pf(t*r.lineWidth)+"px");e.setAttributeNS(null,"stroke-dasharray",n.map(pf).join(" "));e.setAttributeNS(null,"stroke-dashoffset",pf(t*r.dashPhase)+"px")}eoFill(){this.current.element&&this.current.element.setAttributeNS(null,"fill-rule","evenodd");this.fill()}fillStroke(){this.stroke();this.fill()}eoFillStroke(){this.current.element&&this.current.element.setAttributeNS(null,"fill-rule","evenodd");this.fillStroke()}closeStroke(){this.closePath();this.stroke()}closeFillStroke(){this.closePath();this.fillStroke()}closeEOFillStroke(){this.closePath();this.eoFillStroke()}paintSolidColorImageMask(){const e=this.svgFactory.createElement("svg:rect");e.setAttributeNS(null,"x","0");e.setAttributeNS(null,"y","0");e.setAttributeNS(null,"width","1px");e.setAttributeNS(null,"height","1px");e.setAttributeNS(null,"fill",this.current.fillColor);this._ensureTransformGroup().appendChild(e)}paintImageXObject(e){const t=e.startsWith("g_")?this.commonObjs.get(e):this.objs.get(e);t?this.paintInlineImageXObject(t):(0,n.warn)(`Dependent image with object ID ${e} is not ready yet`)}paintInlineImageXObject(e,t){const r=e.width,n=e.height,s=c(e,this.forceDataSchema,!!t),a=this.svgFactory.createElement("svg:rect");a.setAttributeNS(null,"x","0");a.setAttributeNS(null,"y","0");a.setAttributeNS(null,"width",pf(r));a.setAttributeNS(null,"height",pf(n));this.current.element=a;this.clip("nonzero");const o=this.svgFactory.createElement("svg:image");o.setAttributeNS(i,"xlink:href",s);o.setAttributeNS(null,"x","0");o.setAttributeNS(null,"y",pf(-n));o.setAttributeNS(null,"width",pf(r)+"px");o.setAttributeNS(null,"height",pf(n)+"px");o.setAttributeNS(null,"transform",`scale(${pf(1/r)} ${pf(-1/n)})`);t?t.appendChild(o):this._ensureTransformGroup().appendChild(o)}paintImageMaskXObject(e){const t=this.current,r=e.width,n=e.height,s=t.fillColor;t.maskId="mask"+d++;const a=this.svgFactory.createElement("svg:mask");a.setAttributeNS(null,"id",t.maskId);const i=this.svgFactory.createElement("svg:rect");i.setAttributeNS(null,"x","0");i.setAttributeNS(null,"y","0");i.setAttributeNS(null,"width",pf(r));i.setAttributeNS(null,"height",pf(n));i.setAttributeNS(null,"fill",s);i.setAttributeNS(null,"mask",`url(#${t.maskId})`);this.defs.appendChild(a);this._ensureTransformGroup().appendChild(i);this.paintInlineImageXObject(e,a)}paintFormXObjectBegin(e,t){Array.isArray(e)&&6===e.length&&this.transform(e[0],e[1],e[2],e[3],e[4],e[5]);if(t){const e=t[2]-t[0],r=t[3]-t[1],n=this.svgFactory.createElement("svg:rect");n.setAttributeNS(null,"x",t[0]);n.setAttributeNS(null,"y",t[1]);n.setAttributeNS(null,"width",pf(e));n.setAttributeNS(null,"height",pf(r));this.current.element=n;this.clip("nonzero");this.endPath()}}paintFormXObjectEnd(){}_initialize(e){const t=this.svgFactory.create(e.width,e.height),r=this.svgFactory.createElement("svg:defs");t.appendChild(r);this.defs=r;const n=this.svgFactory.createElement("svg:g");n.setAttributeNS(null,"transform",pm(e.transform));t.appendChild(n);this.svg=n;return t}_ensureClipGroup(){if(!this.current.clipGroup){const e=this.svgFactory.createElement("svg:g");e.setAttributeNS(null,"clip-path",this.current.activeClipUrl);this.svg.appendChild(e);this.current.clipGroup=e}return this.current.clipGroup}_ensureTransformGroup(){if(!this.tgrp){this.tgrp=this.svgFactory.createElement("svg:g");this.tgrp.setAttributeNS(null,"transform",pm(this.transformMatrix));this.current.activeClipUrl?this._ensureClipGroup().appendChild(this.tgrp):this.svg.appendChild(this.tgrp)}return this.tgrp}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PDFNodeStream=void 0;var n=r(2),s=r(23);const a=require("fs"),i=require("http"),o=require("https"),l=require("url"),c=/^file:\/\/\/[a-zA-Z]:\//;t.PDFNodeStream=class PDFNodeStream{constructor(e){this.source=e;this.url=function parseUrl(e){const t=l.parse(e);if("file:"===t.protocol||t.host)return t;if(/^[a-z]:[/\\]/i.test(e))return l.parse("file:///"+e);t.host||(t.protocol="file:");return t}(e.url);this.isHttp="http:"===this.url.protocol||"https:"===this.url.protocol;this.isFsUrl="file:"===this.url.protocol;this.httpHeaders=this.isHttp&&e.httpHeaders||{};this._fullRequestReader=null;this._rangeRequestReaders=[]}get _progressiveDataLength(){return this._fullRequestReader?this._fullRequestReader._loaded:0}getFullReader(){(0,n.assert)(!this._fullRequestReader,"PDFNodeStream.getFullReader can only be called once.");this._fullRequestReader=this.isFsUrl?new PDFNodeStreamFsFullReader(this):new PDFNodeStreamFullReader(this);return this._fullRequestReader}getRangeReader(e,t){if(t<=this._progressiveDataLength)return null;const r=this.isFsUrl?new PDFNodeStreamFsRangeReader(this,e,t):new PDFNodeStreamRangeReader(this,e,t);this._rangeRequestReaders.push(r);return r}cancelAllRequests(e){this._fullRequestReader&&this._fullRequestReader.cancel(e);this._rangeRequestReaders.slice(0).forEach((function(t){t.cancel(e)}))}};class BaseFullReader{constructor(e){this._url=e.url;this._done=!1;this._storedError=null;this.onProgress=null;const t=e.source;this._contentLength=t.length;this._loaded=0;this._filename=null;this._disableRange=t.disableRange||!1;this._rangeChunkSize=t.rangeChunkSize;this._rangeChunkSize||this._disableRange||(this._disableRange=!0);this._isStreamingSupported=!t.disableStream;this._isRangeSupported=!t.disableRange;this._readableStream=null;this._readCapability=(0,n.createPromiseCapability)();this._headersCapability=(0,n.createPromiseCapability)()}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(){await this._readCapability.promise;if(this._done)return{value:void 0,done:!0};if(this._storedError)throw this._storedError;const e=this._readableStream.read();if(null===e){this._readCapability=(0,n.createPromiseCapability)();return this.read()}this._loaded+=e.length;this.onProgress&&this.onProgress({loaded:this._loaded,total:this._contentLength});return{value:new Uint8Array(e).buffer,done:!1}}cancel(e){this._readableStream?this._readableStream.destroy(e):this._error(e)}_error(e){this._storedError=e;this._readCapability.resolve()}_setReadableStream(e){this._readableStream=e;e.on("readable",()=>{this._readCapability.resolve()});e.on("end",()=>{e.destroy();this._done=!0;this._readCapability.resolve()});e.on("error",e=>{this._error(e)});!this._isStreamingSupported&&this._isRangeSupported&&this._error(new n.AbortException("streaming is disabled"));this._storedError&&this._readableStream.destroy(this._storedError)}}class BaseRangeReader{constructor(e){this._url=e.url;this._done=!1;this._storedError=null;this.onProgress=null;this._loaded=0;this._readableStream=null;this._readCapability=(0,n.createPromiseCapability)();const t=e.source;this._isStreamingSupported=!t.disableStream}get isStreamingSupported(){return this._isStreamingSupported}async read(){await this._readCapability.promise;if(this._done)return{value:void 0,done:!0};if(this._storedError)throw this._storedError;const e=this._readableStream.read();if(null===e){this._readCapability=(0,n.createPromiseCapability)();return this.read()}this._loaded+=e.length;this.onProgress&&this.onProgress({loaded:this._loaded});return{value:new Uint8Array(e).buffer,done:!1}}cancel(e){this._readableStream?this._readableStream.destroy(e):this._error(e)}_error(e){this._storedError=e;this._readCapability.resolve()}_setReadableStream(e){this._readableStream=e;e.on("readable",()=>{this._readCapability.resolve()});e.on("end",()=>{e.destroy();this._done=!0;this._readCapability.resolve()});e.on("error",e=>{this._error(e)});this._storedError&&this._readableStream.destroy(this._storedError)}}function createRequestOptions(e,t){return{protocol:e.protocol,auth:e.auth,host:e.hostname,port:e.port,path:e.path,method:"GET",headers:t}}class PDFNodeStreamFullReader extends BaseFullReader{constructor(e){super(e);const handleResponse=t=>{if(404===t.statusCode){const e=new n.MissingPDFException(`Missing PDF "${this._url}".`);this._storedError=e;this._headersCapability.reject(e);return}this._headersCapability.resolve();this._setReadableStream(t);const getResponseHeader=e=>this._readableStream.headers[e.toLowerCase()],{allowRangeRequests:r,suggestedLength:a}=(0,s.validateRangeRequestCapabilities)({getResponseHeader:getResponseHeader,isHttp:e.isHttp,rangeChunkSize:this._rangeChunkSize,disableRange:this._disableRange});this._isRangeSupported=r;this._contentLength=a||this._contentLength;this._filename=(0,s.extractFilenameFromHeader)(getResponseHeader)};this._request=null;"http:"===this._url.protocol?this._request=i.request(createRequestOptions(this._url,e.httpHeaders),handleResponse):this._request=o.request(createRequestOptions(this._url,e.httpHeaders),handleResponse);this._request.on("error",e=>{this._storedError=e;this._headersCapability.reject(e)});this._request.end()}}class PDFNodeStreamRangeReader extends BaseRangeReader{constructor(e,t,r){super(e);this._httpHeaders={};for(const t in e.httpHeaders){const r=e.httpHeaders[t];void 0!==r&&(this._httpHeaders[t]=r)}this._httpHeaders.Range=`bytes=${t}-${r-1}`;const handleResponse=e=>{if(404!==e.statusCode)this._setReadableStream(e);else{const e=new n.MissingPDFException(`Missing PDF "${this._url}".`);this._storedError=e}};this._request=null;"http:"===this._url.protocol?this._request=i.request(createRequestOptions(this._url,this._httpHeaders),handleResponse):this._request=o.request(createRequestOptions(this._url,this._httpHeaders),handleResponse);this._request.on("error",e=>{this._storedError=e});this._request.end()}}class PDFNodeStreamFsFullReader extends BaseFullReader{constructor(e){super(e);let t=decodeURIComponent(this._url.path);c.test(this._url.href)&&(t=t.replace(/^\//,""));a.lstat(t,(e,r)=>{if(e){"ENOENT"===e.code&&(e=new n.MissingPDFException(`Missing PDF "${t}".`));this._storedError=e;this._headersCapability.reject(e)}else{this._contentLength=r.size;this._setReadableStream(a.createReadStream(t));this._headersCapability.resolve()}})}}class PDFNodeStreamFsRangeReader extends BaseRangeReader{constructor(e,t,r){super(e);let n=decodeURIComponent(this._url.path);c.test(this._url.href)&&(n=n.replace(/^\//,""));this._setReadableStream(a.createReadStream(n,{start:t,end:r-1}))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.createResponseStatusError=function createResponseStatusError(e,t){if(404===e||0===e&&t.startsWith("file:"))return new n.MissingPDFException('Missing PDF "'+t+'".');return new n.UnexpectedResponseException("Unexpected server response ("+e+') while retrieving PDF "'+t+'".',e)};t.extractFilenameFromHeader=function extractFilenameFromHeader(e){const t=e("Content-Disposition");if(t){let e=(0,s.getFilenameFromContentDispositionHeader)(t);if(e.includes("%"))try{e=decodeURIComponent(e)}catch(e){}if(/\.pdf$/i.test(e))return e}return null};t.validateRangeRequestCapabilities=function validateRangeRequestCapabilities({getResponseHeader:e,isHttp:t,rangeChunkSize:r,disableRange:s}){(0,n.assert)(r>0,"Range chunk size must be larger than zero");const a={allowRangeRequests:!1,suggestedLength:void 0},i=parseInt(e("Content-Length"),10);if(!Number.isInteger(i))return a;a.suggestedLength=i;if(i<=2*r)return a;if(s||!t)return a;if("bytes"!==e("Accept-Ranges"))return a;if("identity"!==(e("Content-Encoding")||"identity"))return a;a.allowRangeRequests=!0;return a};t.validateResponseStatus=function validateResponseStatus(e){return 200===e||206===e};var n=r(2),s=r(24)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.getFilenameFromContentDispositionHeader=function getFilenameFromContentDispositionHeader(e){let t=!0,r=toParamRegExp("filename\\*","i").exec(e);if(r){r=r[1];let e=rfc2616unquote(r);e=unescape(e);e=rfc5987decode(e);e=rfc2047decode(e);return fixupEncoding(e)}r=function rfc2231getparam(e){const t=[];let r;const n=toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)","ig");for(;null!==(r=n.exec(e));){let[,e,n,s]=r;e=parseInt(e,10);if(e in t){if(0===e)break}else t[e]=[n,s]}const s=[];for(let e=0;e<t.length&&e in t;++e){let[r,n]=t[e];n=rfc2616unquote(n);if(r){n=unescape(n);0===e&&(n=rfc5987decode(n))}s.push(n)}return s.join("")}(e);if(r){return fixupEncoding(rfc2047decode(r))}r=toParamRegExp("filename","i").exec(e);if(r){r=r[1];let e=rfc2616unquote(r);e=rfc2047decode(e);return fixupEncoding(e)}function toParamRegExp(e,t){return new RegExp("(?:^|;)\\s*"+e+'\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)',t)}function textdecode(e,r){if(e){if(!/^[\x00-\xFF]+$/.test(r))return r;try{const n=new TextDecoder(e,{fatal:!0}),s=Array.from(r,(function(e){return 255&e.charCodeAt(0)}));r=n.decode(new Uint8Array(s));t=!1}catch(n){if(/^utf-?8$/i.test(e))try{r=decodeURIComponent(escape(r));t=!1}catch(e){}}}return r}function fixupEncoding(e){if(t&&/[\x80-\xff]/.test(e)){e=textdecode("utf-8",e);t&&(e=textdecode("iso-8859-1",e))}return e}function rfc2616unquote(e){if(e.startsWith('"')){const t=e.slice(1).split('\\"');for(let e=0;e<t.length;++e){const r=t[e].indexOf('"');if(-1!==r){t[e]=t[e].slice(0,r);t.length=e+1}t[e]=t[e].replace(/\\(.)/g,"$1")}e=t.join('"')}return e}function rfc5987decode(e){const t=e.indexOf("'");if(-1===t)return e;return textdecode(e.slice(0,t),e.slice(t+1).replace(/^[^']*'/,""))}function rfc2047decode(e){return!e.startsWith("=?")||/[\x00-\x19\x80-\xff]/.test(e)?e:e.replace(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g,(function(e,t,r,n){if("q"===r||"Q"===r)return textdecode(t,n=(n=n.replace(/_/g," ")).replace(/=([0-9a-fA-F]{2})/g,(function(e,t){return String.fromCharCode(parseInt(t,16))})));try{n=atob(n)}catch(e){}return textdecode(t,n)}))}return""}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PDFNetworkStream=void 0;var n=r(2),s=r(23);class NetworkManager{constructor(e,t){this.url=e;t=t||{};this.isHttp=/^https?:/i.test(e);this.httpHeaders=this.isHttp&&t.httpHeaders||{};this.withCredentials=t.withCredentials||!1;this.getXhr=t.getXhr||function NetworkManager_getXhr(){return new XMLHttpRequest};this.currXhrId=0;this.pendingRequests=Object.create(null)}requestRange(e,t,r){const n={begin:e,end:t};for(const e in r)n[e]=r[e];return this.request(n)}requestFull(e){return this.request(e)}request(e){const t=this.getXhr(),r=this.currXhrId++,n=this.pendingRequests[r]={xhr:t};t.open("GET",this.url);t.withCredentials=this.withCredentials;for(const e in this.httpHeaders){const r=this.httpHeaders[e];void 0!==r&&t.setRequestHeader(e,r)}if(this.isHttp&&"begin"in e&&"end"in e){t.setRequestHeader("Range",`bytes=${e.begin}-${e.end-1}`);n.expectedStatus=206}else n.expectedStatus=200;t.responseType="arraybuffer";e.onError&&(t.onerror=function(r){e.onError(t.status)});t.onreadystatechange=this.onStateChange.bind(this,r);t.onprogress=this.onProgress.bind(this,r);n.onHeadersReceived=e.onHeadersReceived;n.onDone=e.onDone;n.onError=e.onError;n.onProgress=e.onProgress;t.send(null);return r}onProgress(e,t){const r=this.pendingRequests[e];r&&r.onProgress&&r.onProgress(t)}onStateChange(e,t){const r=this.pendingRequests[e];if(!r)return;const s=r.xhr;if(s.readyState>=2&&r.onHeadersReceived){r.onHeadersReceived();delete r.onHeadersReceived}if(4!==s.readyState)return;if(!(e in this.pendingRequests))return;delete this.pendingRequests[e];if(0===s.status&&this.isHttp){r.onError&&r.onError(s.status);return}const a=s.status||200;if(!(200===a&&206===r.expectedStatus)&&a!==r.expectedStatus){r.onError&&r.onError(s.status);return}const i=function getArrayBuffer(e){const t=e.response;return"string"!=typeof t?t:(0,n.stringToBytes)(t).buffer}(s);if(206===a){const e=s.getResponseHeader("Content-Range"),t=/bytes (\d+)-(\d+)\/(\d+)/.exec(e);r.onDone({begin:parseInt(t[1],10),chunk:i})}else i?r.onDone({begin:0,chunk:i}):r.onError&&r.onError(s.status)}getRequestXhr(e){return this.pendingRequests[e].xhr}isPendingRequest(e){return e in this.pendingRequests}abortRequest(e){const t=this.pendingRequests[e].xhr;delete this.pendingRequests[e];t.abort()}}t.PDFNetworkStream=class PDFNetworkStream{constructor(e){this._source=e;this._manager=new NetworkManager(e.url,{httpHeaders:e.httpHeaders,withCredentials:e.withCredentials});this._rangeChunkSize=e.rangeChunkSize;this._fullRequestReader=null;this._rangeRequestReaders=[]}_onRangeRequestReaderClosed(e){const t=this._rangeRequestReaders.indexOf(e);t>=0&&this._rangeRequestReaders.splice(t,1)}getFullReader(){(0,n.assert)(!this._fullRequestReader,"PDFNetworkStream.getFullReader can only be called once.");this._fullRequestReader=new PDFNetworkStreamFullRequestReader(this._manager,this._source);return this._fullRequestReader}getRangeReader(e,t){const r=new PDFNetworkStreamRangeRequestReader(this._manager,e,t);r.onClosed=this._onRangeRequestReaderClosed.bind(this);this._rangeRequestReaders.push(r);return r}cancelAllRequests(e){this._fullRequestReader&&this._fullRequestReader.cancel(e);this._rangeRequestReaders.slice(0).forEach((function(t){t.cancel(e)}))}};class PDFNetworkStreamFullRequestReader{constructor(e,t){this._manager=e;const r={onHeadersReceived:this._onHeadersReceived.bind(this),onDone:this._onDone.bind(this),onError:this._onError.bind(this),onProgress:this._onProgress.bind(this)};this._url=t.url;this._fullRequestId=e.requestFull(r);this._headersReceivedCapability=(0,n.createPromiseCapability)();this._disableRange=t.disableRange||!1;this._contentLength=t.length;this._rangeChunkSize=t.rangeChunkSize;this._rangeChunkSize||this._disableRange||(this._disableRange=!0);this._isStreamingSupported=!1;this._isRangeSupported=!1;this._cachedChunks=[];this._requests=[];this._done=!1;this._storedError=void 0;this._filename=null;this.onProgress=null}_onHeadersReceived(){const e=this._fullRequestId,t=this._manager.getRequestXhr(e),getResponseHeader=e=>t.getResponseHeader(e),{allowRangeRequests:r,suggestedLength:n}=(0,s.validateRangeRequestCapabilities)({getResponseHeader:getResponseHeader,isHttp:this._manager.isHttp,rangeChunkSize:this._rangeChunkSize,disableRange:this._disableRange});r&&(this._isRangeSupported=!0);this._contentLength=n||this._contentLength;this._filename=(0,s.extractFilenameFromHeader)(getResponseHeader);this._isRangeSupported&&this._manager.abortRequest(e);this._headersReceivedCapability.resolve()}_onDone(e){if(e)if(this._requests.length>0){this._requests.shift().resolve({value:e.chunk,done:!1})}else this._cachedChunks.push(e.chunk);this._done=!0;if(!(this._cachedChunks.length>0)){this._requests.forEach((function(e){e.resolve({value:void 0,done:!0})}));this._requests=[]}}_onError(e){const t=this._url,r=(0,s.createResponseStatusError)(e,t);this._storedError=r;this._headersReceivedCapability.reject(r);this._requests.forEach((function(e){e.reject(r)}));this._requests=[];this._cachedChunks=[]}_onProgress(e){this.onProgress&&this.onProgress({loaded:e.loaded,total:e.lengthComputable?e.total:this._contentLength})}get filename(){return this._filename}get isRangeSupported(){return this._isRangeSupported}get isStreamingSupported(){return this._isStreamingSupported}get contentLength(){return this._contentLength}get headersReady(){return this._headersReceivedCapability.promise}async read(){if(this._storedError)throw this._storedError;if(this._cachedChunks.length>0){return{value:this._cachedChunks.shift(),done:!1}}if(this._done)return{value:void 0,done:!0};const e=(0,n.createPromiseCapability)();this._requests.push(e);return e.promise}cancel(e){this._done=!0;this._headersReceivedCapability.reject(e);this._requests.forEach((function(e){e.resolve({value:void 0,done:!0})}));this._requests=[];this._manager.isPendingRequest(this._fullRequestId)&&this._manager.abortRequest(this._fullRequestId);this._fullRequestReader=null}}class PDFNetworkStreamRangeRequestReader{constructor(e,t,r){this._manager=e;const n={onDone:this._onDone.bind(this),onProgress:this._onProgress.bind(this)};this._requestId=e.requestRange(t,r,n);this._requests=[];this._queuedChunk=null;this._done=!1;this.onProgress=null;this.onClosed=null}_close(){this.onClosed&&this.onClosed(this)}_onDone(e){const t=e.chunk;if(this._requests.length>0){this._requests.shift().resolve({value:t,done:!1})}else this._queuedChunk=t;this._done=!0;this._requests.forEach((function(e){e.resolve({value:void 0,done:!0})}));this._requests=[];this._close()}_onProgress(e){!this.isStreamingSupported&&this.onProgress&&this.onProgress({loaded:e.loaded})}get isStreamingSupported(){return!1}async read(){if(null!==this._queuedChunk){const e=this._queuedChunk;this._queuedChunk=null;return{value:e,done:!1}}if(this._done)return{value:void 0,done:!0};const e=(0,n.createPromiseCapability)();this._requests.push(e);return e.promise}cancel(e){this._done=!0;this._requests.forEach((function(e){e.resolve({value:void 0,done:!0})}));this._requests=[];this._manager.isPendingRequest(this._requestId)&&this._manager.abortRequest(this._requestId);this._close()}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.PDFFetchStream=void 0;var n=r(2),s=r(23);function createFetchOptions(e,t,r){return{method:"GET",headers:e,signal:r&&r.signal,mode:"cors",credentials:t?"include":"same-origin",redirect:"follow"}}function createHeaders(e){const t=new Headers;for(const r in e){const n=e[r];void 0!==n&&t.append(r,n)}return t}t.PDFFetchStream=class PDFFetchStream{constructor(e){this.source=e;this.isHttp=/^https?:/i.test(e.url);this.httpHeaders=this.isHttp&&e.httpHeaders||{};this._fullRequestReader=null;this._rangeRequestReaders=[]}get _progressiveDataLength(){return this._fullRequestReader?this._fullRequestReader._loaded:0}getFullReader(){(0,n.assert)(!this._fullRequestReader,"PDFFetchStream.getFullReader can only be called once.");this._fullRequestReader=new PDFFetchStreamReader(this);return this._fullRequestReader}getRangeReader(e,t){if(t<=this._progressiveDataLength)return null;const r=new PDFFetchStreamRangeReader(this,e,t);this._rangeRequestReaders.push(r);return r}cancelAllRequests(e){this._fullRequestReader&&this._fullRequestReader.cancel(e);this._rangeRequestReaders.slice(0).forEach((function(t){t.cancel(e)}))}};class PDFFetchStreamReader{constructor(e){this._stream=e;this._reader=null;this._loaded=0;this._filename=null;const t=e.source;this._withCredentials=t.withCredentials||!1;this._contentLength=t.length;this._headersCapability=(0,n.createPromiseCapability)();this._disableRange=t.disableRange||!1;this._rangeChunkSize=t.rangeChunkSize;this._rangeChunkSize||this._disableRange||(this._disableRange=!0);"undefined"!=typeof AbortController&&(this._abortController=new AbortController);this._isStreamingSupported=!t.disableStream;this._isRangeSupported=!t.disableRange;this._headers=createHeaders(this._stream.httpHeaders);const r=t.url;fetch(r,createFetchOptions(this._headers,this._withCredentials,this._abortController)).then(e=>{if(!(0,s.validateResponseStatus)(e.status))throw(0,s.createResponseStatusError)(e.status,r);this._reader=e.body.getReader();this._headersCapability.resolve();const getResponseHeader=t=>e.headers.get(t),{allowRangeRequests:t,suggestedLength:a}=(0,s.validateRangeRequestCapabilities)({getResponseHeader:getResponseHeader,isHttp:this._stream.isHttp,rangeChunkSize:this._rangeChunkSize,disableRange:this._disableRange});this._isRangeSupported=t;this._contentLength=a||this._contentLength;this._filename=(0,s.extractFilenameFromHeader)(getResponseHeader);!this._isStreamingSupported&&this._isRangeSupported&&this.cancel(new n.AbortException("Streaming is disabled."))}).catch(this._headersCapability.reject);this.onProgress=null}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(){await this._headersCapability.promise;const{value:e,done:t}=await this._reader.read();if(t)return{value:e,done:t};this._loaded+=e.byteLength;this.onProgress&&this.onProgress({loaded:this._loaded,total:this._contentLength});return{value:new Uint8Array(e).buffer,done:!1}}cancel(e){this._reader&&this._reader.cancel(e);this._abortController&&this._abortController.abort()}}class PDFFetchStreamRangeReader{constructor(e,t,r){this._stream=e;this._reader=null;this._loaded=0;const a=e.source;this._withCredentials=a.withCredentials||!1;this._readCapability=(0,n.createPromiseCapability)();this._isStreamingSupported=!a.disableStream;"undefined"!=typeof AbortController&&(this._abortController=new AbortController);this._headers=createHeaders(this._stream.httpHeaders);this._headers.append("Range",`bytes=${t}-${r-1}`);const i=a.url;fetch(i,createFetchOptions(this._headers,this._withCredentials,this._abortController)).then(e=>{if(!(0,s.validateResponseStatus)(e.status))throw(0,s.createResponseStatusError)(e.status,i);this._readCapability.resolve();this._reader=e.body.getReader()}).catch(e=>{if(!e||"AbortError"!==e.name)throw e});this.onProgress=null}get isStreamingSupported(){return this._isStreamingSupported}async read(){await this._readCapability.promise;const{value:e,done:t}=await this._reader.read();if(t)return{value:e,done:t};this._loaded+=e.byteLength;this.onProgress&&this.onProgress({loaded:this._loaded});return{value:new Uint8Array(e).buffer,done:!1}}cancel(e){this._reader&&this._reader.cancel(e);this._abortController&&this._abortController.abort()}}}])}));