@readium/navigator 2.5.5 → 2.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +367 -323
- package/dist/index.umd.cjs +14 -14
- package/package.json +1 -1
- package/src/epub/EpubNavigator.ts +34 -15
- package/src/epub/frame/FrameManager.ts +3 -0
- package/src/epub/fxl/FXLFrameManager.ts +3 -0
- package/src/webpub/WebPubNavigator.ts +18 -5
- package/types/src/epub/EpubNavigator.d.ts +1 -0
- package/types/src/webpub/WebPubNavigator.d.ts +1 -0
package/dist/index.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(_,me){typeof exports=="object"&&typeof module<"u"?me(exports):typeof define=="function"&&define.amd?define(["exports"],me):(_=typeof globalThis<"u"?globalThis:_||self,me(_.navigator={}))})(this,(function(_){"use strict";var ae;const w=class w{constructor(e){this.uri=e}static deserialize(e){if(!(!e||typeof e!="string"))return new w(e)}serialize(){return this.uri}get isWCAGLevelA(){return this===w.EPUB_A11Y_10_WCAG_20_A||this===w.EPUB_A11Y_11_WCAG_20_A||this===w.EPUB_A11Y_11_WCAG_21_A||this===w.EPUB_A11Y_11_WCAG_22_A}get isWCAGLevelAA(){return this===w.EPUB_A11Y_10_WCAG_20_AA||this===w.EPUB_A11Y_11_WCAG_20_AA||this===w.EPUB_A11Y_11_WCAG_21_AA||this===w.EPUB_A11Y_11_WCAG_22_AA}get isWCAGLevelAAA(){return this===w.EPUB_A11Y_10_WCAG_20_AAA||this===w.EPUB_A11Y_11_WCAG_20_AAA||this===w.EPUB_A11Y_11_WCAG_21_AAA||this===w.EPUB_A11Y_11_WCAG_22_AAA}};w.EPUB_A11Y_10_WCAG_20_A=new w("http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-a"),w.EPUB_A11Y_10_WCAG_20_AA=new w("http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-aa"),w.EPUB_A11Y_10_WCAG_20_AAA=new w("http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-aaa"),w.EPUB_A11Y_11_WCAG_20_A=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.0-a"),w.EPUB_A11Y_11_WCAG_20_AA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.0-aa"),w.EPUB_A11Y_11_WCAG_20_AAA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.0-aaa"),w.EPUB_A11Y_11_WCAG_21_A=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.1-a"),w.EPUB_A11Y_11_WCAG_21_AA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.1-aa"),w.EPUB_A11Y_11_WCAG_21_AAA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.1-aaa"),w.EPUB_A11Y_11_WCAG_22_A=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.2-a"),w.EPUB_A11Y_11_WCAG_22_AA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.2-aa"),w.EPUB_A11Y_11_WCAG_22_AAA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.2-aaa");let me=w;const E=class E{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new E(e)}serialize(){return this.value}};E.AUDITORY=new E("auditory"),E.CHART_ON_VISUAL=new E("chartOnVisual"),E.CHEM_ON_VISUAL=new E("chemOnVisual"),E.COLOR_DEPENDENT=new E("colorDependent"),E.DIAGRAM_ON_VISUAL=new E("diagramOnVisual"),E.MATH_ON_VISUAL=new E("mathOnVisual"),E.MUSIC_ON_VISUAL=new E("musicOnVisual"),E.TACTILE=new E("tactile"),E.TEXT_ON_VISUAL=new E("textOnVisual"),E.TEXTUAL=new E("textual"),E.VISUAL=new E("visual");let fn=E;const H=class H{constructor(e){if(typeof e=="string"){if(!H.VALID_MODES.has(e.toLowerCase()))return;this.value=e.toLowerCase()}else{const t=e.filter(n=>H.VALID_MODES.has(n.toLowerCase()));if(t.length===0)return;this.value=Array.from(new Set(t))}}static deserialize(e){if(!e)return;if(typeof e=="string")return new H(e);if(!Array.isArray(e))return;const t=e.filter(n=>n?H.VALID_MODES.has(n.toLowerCase()):!1);if(t.length!==0)return new H(t)}serialize(){return this.value}};H.VALID_MODES=new Set(["auditory","tactile","textual","visual"]),H.AUDITORY=new H("auditory"),H.TACTILE=new H("tactile"),H.TEXTUAL=new H("textual"),H.VISUAL=new H("visual");let yn=H;const y=class y{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new y(e)}serialize(){return this.value}};y.NONE=new y("none"),y.ANNOTATIONS=new y("annotations"),y.ARIA=new y("ARIA"),y.INDEX=new y("index"),y.PAGE_BREAK_MARKERS=new y("pageBreakMarkers"),y.PAGE_NAVIGATION=new y("pageNavigation"),y.PRINT_PAGE_NUMBERS=new y("printPageNumbers"),y.READING_ORDER=new y("readingOrder"),y.STRUCTURAL_NAVIGATION=new y("structuralNavigation"),y.TABLE_OF_CONTENTS=new y("tableOfContents"),y.TAGGED_PDF=new y("taggedPDF"),y.ALTERNATIVE_TEXT=new y("alternativeText"),y.AUDIO_DESCRIPTION=new y("audioDescription"),y.CAPTIONS=new y("captions"),y.CLOSED_CAPTIONS=new y("closedCaptions"),y.DESCRIBED_MATH=new y("describedMath"),y.LONG_DESCRIPTION=new y("longDescription"),y.OPEN_CAPTIONS=new y("openCaptions"),y.SIGN_LANGUAGE=new y("signLanguage"),y.TRANSCRIPT=new y("transcript"),y.DISPLAY_TRANSFORMABILITY=new y("displayTransformability"),y.SYNCHRONIZED_AUDIO_TEXT=new y("synchronizedAudioText"),y.TIMING_CONTROL=new y("timingControl"),y.UNLOCKED=new y("unlocked"),y.CHEM_ML=new y("ChemML"),y.LATEX=new y("latex"),y.LATEX_CHEMISTRY=new y("latex-chemistry"),y.MATH_ML=new y("MathML"),y.MATH_ML_CHEMISTRY=new y("MathML-chemistry"),y.TTS_MARKUP=new y("ttsMarkup"),y.HIGH_CONTRAST_AUDIO=new y("highContrastAudio"),y.HIGH_CONTRAST_DISPLAY=new y("highContrastDisplay"),y.LARGE_PRINT=new y("largePrint"),y.BRAILLE=new y("braille"),y.TACTILE_GRAPHIC=new y("tactileGraphic"),y.TACTILE_OBJECT=new y("tactileObject"),y.FULL_RUBY_ANNOTATIONS=new y("fullRubyAnnotations"),y.HORIZONTAL_WRITING=new y("horizontalWriting"),y.RUBY_ANNOTATIONS=new y("rubyAnnotations"),y.VERTICAL_WRITING=new y("verticalWriting"),y.WITH_ADDITIONAL_WORD_SEGMENTATION=new y("withAdditionalWordSegmentation"),y.WITHOUT_ADDITIONAL_WORD_SEGMENTATION=new y("withoutAdditionalWordSegmentation");let Ze=y;const x=class x{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new x(e)}serialize(){return this.value}};x.FLASHING=new x("flashing"),x.NO_FLASHING_HAZARD=new x("noFlashingHazard"),x.UNKNOWN_FLASHING_HAZARD=new x("unknownFlashingHazard"),x.MOTION_SIMULATION=new x("motionSimulation"),x.NO_MOTION_SIMULATION_HAZARD=new x("noMotionSimulationHazard"),x.UNKNOWN_MOTION_SIMULATION_HAZARD=new x("unknownMotionSimulationHazard"),x.SOUND=new x("sound"),x.NO_SOUND_HAZARD=new x("noSoundHazard"),x.UNKNOWN_SOUND_HAZARD=new x("unknownSoundHazard"),x.UNKNOWN=new x("unknown"),x.NONE=new x("none");let _n=x;const F=class F{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new F(e)}serialize(){return this.value}};F.NONE=new F("none"),F.DOCUMENTED=new F("documented"),F.LEGAL=new F("legal"),F.TEMPORARY=new F("temporary"),F.TECHNICAL=new F("technical"),F.EAA_DISPROPORTIONATE_BURDEN=new F("eaa-disproportionate-burden"),F.EAA_FUNDAMENTAL_ALTERATION=new F("eaa-fundamental-alteration"),F.EAA_MICROENTERPRISE=new F("eaa-microenterprise"),F.EAA_TECHNICAL_IMPOSSIBILITY=new F("eaa-technical-impossibility"),F.EAA_TEMPORARY=new F("eaa-temporary");let Sn=F;const bn=["en","ar","da","fr","it","pt_PT","sv"],io={publication:JSON.parse(`{"format":{"audiobook":"Audiobook","audiobookJSON":"Audiobook Manifest","cbz":"Comic Book Archive","divina":"Divina Publication","divinaJSON":"Divina Publication Manifest","epub":"EPUB","lcpa":"LCP Protected Audiobook","lcpdf":"LCP Protected PDF","lcpl":"LCP License Document","pdf":"PDF","rwp":"Readium Web Publication","rwpm":"Readium Web Publication Manifest","zab":"Audiobook Archive","zip":"ZIP Archive"},"kind":{"audiobook_one":"audiobook","audiobook_other":"audiobooks","book_one":"book","book_other":"books","comic_one":"comic","comic_other":"comics","document_one":"document","document_other":"documents"},"metadata":{"accessibility":{"display-guide":{"accessibility-summary":{"no-metadata":"No information is available","publisher-contact":"For more information about the accessibility of this product, please contact the publisher: ","title":"Accessibility summary"},"additional-accessibility-information":{"aria":{"compact":"ARIA roles included","descriptive":"Content is enhanced with ARIA roles to optimize organization and facilitate navigation"},"audio-descriptions":"Audio descriptions","braille":"Braille","color-not-sole-means-of-conveying-information":"Color is not the sole means of conveying information","dyslexia-readability":"Dyslexia readability","full-ruby-annotations":"Full ruby annotations","high-contrast-between-foreground-and-background-audio":"High contrast between foreground and background audio","high-contrast-between-text-and-background":"High contrast between foreground text and background","large-print":"Large print","page-breaks":{"compact":"Page breaks included","descriptive":"Page breaks included from the original print source"},"ruby-annotations":"Some Ruby annotations","sign-language":"Sign language","tactile-graphics":{"compact":"Tactile graphics included","descriptive":"Tactile graphics have been integrated to facilitate access to visual elements for blind people"},"tactile-objects":"Tactile 3D objects","text-to-speech-hinting":"Text-to-speech hinting provided","title":"Additional accessibility information","ultra-high-contrast-between-text-and-background":"Ultra high contrast between text and background","visible-page-numbering":"Visible page numbering","without-background-sounds":"Without background sounds"},"conformance":{"a":{"compact":"This publication meets minimum accessibility standards","descriptive":"The publication contains a conformance statement that it meets the EPUB Accessibility and WCAG 2 Level A standard"},"aa":{"compact":"This publication meets accepted accessibility standards","descriptive":"The publication contains a conformance statement that it meets the EPUB Accessibility and WCAG 2 Level AA standard"},"aaa":{"compact":"This publication exceeds accepted accessibility standards","descriptive":"The publication contains a conformance statement that it meets the EPUB Accessibility and WCAG 2 Level AAA standard"},"certifier":"The publication was certified by ","certifier-credentials":"The certifier's credential is ","details":{"certification-info":"The publication was certified on ","certifier-report":"For more information refer to the certifier's report","claim":"This publication claims to meet","epub-accessibility-1-0":"EPUB Accessibility 1.0","epub-accessibility-1-1":"EPUB Accessibility 1.1","level-a":"Level A","level-aa":"Level AA","level-aaa":"Level AAA","wcag-2-0":{"compact":"WCAG 2.0","descriptive":"Web Content Accessibility Guidelines (WCAG) 2.0"},"wcag-2-1":{"compact":"WCAG 2.1","descriptive":"Web Content Accessibility Guidelines (WCAG) 2.1"},"wcag-2-2":{"compact":"WCAG 2.2","descriptive":"Web Content Accessibility Guidelines (WCAG) 2.2"}},"details-title":"Detailed conformance information","no":"No information is available","title":"Conformance","unknown-standard":"Conformance to accepted standards for accessibility of this publication cannot be determined"},"hazards":{"flashing":{"compact":"Flashing content","descriptive":"The publication contains flashing content that can cause photosensitive seizures"},"flashing-none":{"compact":"No flashing hazards","descriptive":"The publication does not contain flashing content that can cause photosensitive seizures"},"flashing-unknown":{"compact":"Flashing hazards not known","descriptive":"The presence of flashing content that can cause photosensitive seizures could not be determined"},"motion":{"compact":"Motion simulation","descriptive":"The publication contains motion simulations that can cause motion sickness"},"motion-none":{"compact":"No motion simulation hazards","descriptive":"The publication does not contain motion simulations that can cause motion sickness"},"motion-unknown":{"compact":"Motion simulation hazards not known","descriptive":"The presence of motion simulations that can cause motion sickness could not be determined"},"no-metadata":"No information is available","none":{"compact":"No hazards","descriptive":"The publication contains no hazards"},"sound":{"compact":"Sounds","descriptive":"The publication contains sounds that can cause sensitivity issues"},"sound-none":{"compact":"No sound hazards","descriptive":"The publication does not contain sounds that can cause sensitivity issues"},"sound-unknown":{"compact":"Sound hazards not known","descriptive":"The presence of sounds that can cause sensitivity issues could not be determined"},"title":"Hazards","unknown":"The presence of hazards is unknown"},"legal-considerations":{"exempt":{"compact":"Claims an accessibility exemption in some jurisdictions","descriptive":"This publication claims an accessibility exemption in some jurisdictions"},"no-metadata":"No information is available","title":"Legal considerations"},"navigation":{"index":{"compact":"Index","descriptive":"Index with links to referenced entries"},"no-metadata":"No information is available","page-navigation":{"compact":"Go to page","descriptive":"Page list to go to pages from the print source version"},"structural":{"compact":"Headings","descriptive":"Elements such as headings, tables, etc for structured navigation"},"title":"Navigation","toc":{"compact":"Table of contents","descriptive":"Table of contents to all chapters of the text via links"}},"rich-content":{"accessible-chemistry-as-latex":{"compact":"Chemical formulas in LaTeX","descriptive":"Chemical formulas in accessible format (LaTeX)"},"accessible-chemistry-as-mathml":{"compact":"Chemical formulas in MathML","descriptive":"Chemical formulas in accessible format (MathML)"},"accessible-math-as-latex":{"compact":"Math as LaTeX","descriptive":"Math formulas in accessible format (LaTeX)"},"accessible-math-described":"Text descriptions of math are provided","closed-captions":{"compact":"Videos have closed captions","descriptive":"Videos included in publications have closed captions"},"extended-descriptions":"Information-rich images are described by extended descriptions","math-as-mathml":{"compact":"Math as MathML","descriptive":"Math formulas in accessible format (MathML)"},"open-captions":{"compact":"Videos have open captions","descriptive":"Videos included in publications have open captions"},"title":"Rich content","transcript":"Transcript(s) provided","unknown":"No information is available"},"ways-of-reading":{"nonvisual-reading":{"alt-text":{"compact":"Has alternative text","descriptive":"Has alternative text descriptions for images"},"no-metadata":"No information about nonvisual reading is available","none":{"compact":"Not readable in read aloud or dynamic braille","descriptive":"The content is not readable as read aloud speech or dynamic braille"},"not-fully":{"compact":"Not fully readable in read aloud or dynamic braille","descriptive":"Not all of the content will be readable as read aloud speech or dynamic braille"},"readable":{"compact":"Readable in read aloud or dynamic braille","descriptive":"All content can be read as read aloud speech or dynamic braille"}},"prerecorded-audio":{"complementary":{"compact":"Prerecorded audio clips","descriptive":"Prerecorded audio clips are embedded in the content"},"no-metadata":"No information about prerecorded audio is available","only":{"compact":"Prerecorded audio only","descriptive":"Audiobook with no text alternative"},"synchronized":{"compact":"Prerecorded audio synchronized with text","descriptive":"All the content is available as prerecorded audio synchronized with text"}},"title":"Ways of reading","visual-adjustments":{"modifiable":{"compact":"Appearance can be modified","descriptive":"Appearance of the text and page layout can be modified according to the capabilities of the reading system (font family and font size, spaces between paragraphs, sentences, words, and letters, as well as color of background and text)"},"unknown":"No information about appearance modifiability is available","unmodifiable":{"compact":"Appearance cannot be modified","descriptive":"Text and page layout cannot be modified as the reading experience is close to a print version, but reading systems can still provide zooming options"}}}}},"altIdentifier_one":"alternate identifier","altIdentifier_other":"alternate identifiers","artist_one":"artist","artist_other":"artists","author_one":"author","author_other":"authors","collection_one":"editorial collection","collection_other":"editorial collections","colorist_one":"colorist","colorist_other":"colorists","contributor_one":"contributor","contributor_other":"contributors","description":"description","duration":"duration","editor_one":"editor","editor_other":"editors","identifier_one":"identifier","identifier_other":"identifiers","illustrator_one":"illustrator","illustrator_other":"illustrators","imprint_one":"imprint","imprint_other":"imprints","inker_one":"inker","inker_other":"inkers","language_one":"language","language_other":"languages","letterer_one":"letterer","letterer_other":"letterers","modified":"modification date","narrator_one":"narrator","narrator_other":"narrators","numberOfPages":"print length","penciler_one":"penciler","penciler_other":"pencilers","published":"publication date","publisher_one":"publisher","publisher_other":"publishers","series_one":"series","series_other":"series","subject_one":"subject","subject_other":"subjects","subtitle":"subtitle","title":"title","translator_one":"translator","translator_other":"translators"}}`)},vn={fr:()=>Promise.resolve().then(()=>Wr),ar:()=>Promise.resolve().then(()=>Br),da:()=>Promise.resolve().then(()=>jr),it:()=>Promise.resolve().then(()=>Gr),pt_PT:()=>Promise.resolve().then(()=>Vr),sv:()=>Promise.resolve().then(()=>$r)},wn=io?.publication?.metadata?.accessibility?.["display-guide"]||{};class pe{constructor(){this.currentLocaleCode="en",this.locale=wn,this.loadedLocales={},this.loadedLocales.en=wn}static getInstance(){return pe.instance||(pe.instance=new pe),pe.instance}async loadLocale(e){if(!bn.includes(e))return console.warn(`Locale '${e}' is not enabled`),!1;if(e in this.loadedLocales)return!0;try{if(!(e in vn))return console.warn(`Locale file not found for: ${e}`),!1;const i=(await vn[e]()).default?.publication?.metadata?.accessibility?.["display-guide"];return i?(this.loadedLocales[e]=i,!0):(console.warn(`No accessibility strings found in locale ${e}`),!1)}catch(t){return console.warn(`Failed to load locale ${e}:`,t),!1}}registerLocale(e,t){if(!e||typeof e!="string")throw new Error("Locale code must be a non-empty string");this.loadedLocales[e]=t}async setLocale(e){return e in this.loadedLocales||await this.loadLocale(e),e in this.loadedLocales?(this.locale=this.loadedLocales[e],this.currentLocaleCode=e,!0):(console.warn(`Locale '${e}' is not available`),!1)}getCurrentLocale(){return this.currentLocaleCode}getAvailableLocales(){return bn}getNestedValue(e,t){const n=t.split(".");let i=e;for(const o of n){if(i==null)return;i=i[o]}return i}getString(e){let t=this.getNestedValue(this.locale,e);return t===void 0&&this.currentLocaleCode!=="en"&&(t=this.getNestedValue(this.loadedLocales.en,e)),t!==void 0?typeof t=="string"?{compact:t,descriptive:t}:t:(console.warn(`Missing localization for key: ${e}`),{compact:"",descriptive:""})}}pe.getInstance();var S=(r=>(r.reflowable="reflowable",r.fixed="fixed",r.scrolled="scrolled",r))(S||{});class yt{constructor(e){this.algorithm=e.algorithm,this.compression=e.compression,this.originalLength=e.originalLength,this.profile=e.profile,this.scheme=e.scheme}static deserialize(e){if(e&&e.algorithm)return new yt({algorithm:e.algorithm,compression:e.compression,originalLength:e.originalLength,profile:e.profile,scheme:e.scheme})}serialize(){const e={algorithm:this.algorithm};return this.compression!==void 0&&(e.compression=this.compression),this.originalLength!==void 0&&(e.originalLength=this.originalLength),this.profile!==void 0&&(e.profile=this.profile),this.scheme!==void 0&&(e.scheme=this.scheme),e}}var K=(r=>(r.left="left",r.right="right",r.center="center",r))(K||{});let X=class gn{constructor(e){this.otherProperties=e}get page(){return this.otherProperties.page}static deserialize(e){if(e)return new gn(e)}serialize(){return this.otherProperties}add(e){const t=Object.assign({},this.otherProperties);for(const n in e)t[n]=e[n];return new gn(t)}};Object.defineProperty(X.prototype,"encryption",{get:function(){return yt.deserialize(this.otherProperties.encrypted)}});function oo(r){return r&&Array.isArray(r)?r:void 0}function Rn(r){return r&&typeof r=="string"?[r]:oo(r)}function Pn(r){return typeof r=="string"?new Date(r):void 0}function Qe(r){return isNaN(r)?void 0:r}function G(r){return Qe(r)!==void 0&&Math.sign(r)>=0?r:void 0}function ro(r){const e=new Array;return r.forEach(t=>e.push(t)),e}class g{constructor(e){let t,n,i=e.mediaType.replace(/\s/g,"").split(";");const o=i[0].split("/");if(o.length===2){if(t=o[0].toLowerCase().trim(),n=o[1].toLowerCase().trim(),t.length===0||n.length===0)throw new Error("Invalid media type")}else throw new Error("Invalid media type");const a={};for(let m=1;m<i.length;m++){const f=i[m].split("=");if(f.length===2){const d=f[0].toLocaleLowerCase(),p=d==="charset"?f[1].toUpperCase():f[1];a[d]=p}}const s={},l=Object.keys(a);l.sort((m,f)=>m.localeCompare(f)),l.forEach(m=>s[m]=a[m]);let c="";for(const m in s){const f=s[m];c+=`;${m}=${f}`}const h=`${t}/${n}${c}`,u=s.encoding;this.string=h,this.type=t,this.subtype=n,this.parameters=s,this.encoding=u,this.name=e.name,this.fileExtension=e.fileExtension}static parse(e){return new g(e)}get structuredSyntaxSuffix(){const e=this.subtype.split("+");return e.length>1?`+${e[e.length-1]}`:void 0}get charset(){return this.parameters.charset}contains(e){const t=typeof e=="string"?g.parse({mediaType:e}):e;if(!((this.type==="*"||this.type===t.type)&&(this.subtype==="*"||this.subtype===t.subtype)))return!1;const n=new Set(Object.entries(this.parameters).map(([o,a])=>`${o}=${a}`)),i=new Set(Object.entries(t.parameters).map(([o,a])=>`${o}=${a}`));for(const o of Array.from(n.values()))if(!i.has(o))return!1;return!0}matches(e){const t=typeof e=="string"?g.parse({mediaType:e}):e;return this.contains(t)||t.contains(this)}matchesAny(...e){for(const t of e)if(this.matches(t))return!0;return!1}equals(e){return this.string===e.string}get isZIP(){return this.matchesAny(g.ZIP,g.LCP_PROTECTED_AUDIOBOOK,g.LCP_PROTECTED_PDF)||this.structuredSyntaxSuffix==="+zip"}get isJSON(){return this.matchesAny(g.JSON)||this.structuredSyntaxSuffix==="+json"}get isOPDS(){return this.matchesAny(g.OPDS1,g.OPDS1_ENTRY,g.OPDS2,g.OPDS2_PUBLICATION,g.OPDS_AUTHENTICATION)||this.structuredSyntaxSuffix==="+json"}get isHTML(){return this.matchesAny(g.HTML,g.XHTML)}get isBitmap(){return this.matchesAny(g.AVIF,g.BMP,g.GIF,g.JPEG,g.PNG,g.TIFF,g.WEBP)}get isAudio(){return this.type==="audio"}get isVideo(){return this.type==="video"}get isRWPM(){return this.matchesAny(g.READIUM_AUDIOBOOK_MANIFEST,g.DIVINA_MANIFEST,g.READIUM_WEBPUB_MANIFEST)}get isPublication(){return this.matchesAny(g.READIUM_AUDIOBOOK,g.READIUM_AUDIOBOOK_MANIFEST,g.CBZ,g.DIVINA,g.DIVINA_MANIFEST,g.EPUB,g.LCP_PROTECTED_AUDIOBOOK,g.LCP_PROTECTED_PDF,g.LPF,g.PDF,g.W3C_WPUB_MANIFEST,g.READIUM_WEBPUB,g.READIUM_WEBPUB_MANIFEST,g.ZAB)}static get AAC(){return g.parse({mediaType:"audio/aac",fileExtension:"aac"})}static get ACSM(){return g.parse({mediaType:"application/vnd.adobe.adept+xml",name:"Adobe Content Server Message",fileExtension:"acsm"})}static get AIFF(){return g.parse({mediaType:"audio/aiff",fileExtension:"aiff"})}static get AVI(){return g.parse({mediaType:"video/x-msvideo",fileExtension:"avi"})}static get AVIF(){return g.parse({mediaType:"image/avif",fileExtension:"avif"})}static get BINARY(){return g.parse({mediaType:"application/octet-stream"})}static get BMP(){return g.parse({mediaType:"image/bmp",fileExtension:"bmp"})}static get CBZ(){return g.parse({mediaType:"application/vnd.comicbook+zip",name:"Comic Book Archive",fileExtension:"cbz"})}static get CSS(){return g.parse({mediaType:"text/css",fileExtension:"css"})}static get DIVINA(){return g.parse({mediaType:"application/divina+zip",name:"Digital Visual Narratives",fileExtension:"divina"})}static get DIVINA_MANIFEST(){return g.parse({mediaType:"application/divina+json",name:"Digital Visual Narratives",fileExtension:"json"})}static get EPUB(){return g.parse({mediaType:"application/epub+zip",name:"EPUB",fileExtension:"epub"})}static get GIF(){return g.parse({mediaType:"image/gif",fileExtension:"gif"})}static get GZ(){return g.parse({mediaType:"application/gzip",fileExtension:"gz"})}static get HTML(){return g.parse({mediaType:"text/html",fileExtension:"html"})}static get JAVASCRIPT(){return g.parse({mediaType:"text/javascript",fileExtension:"js"})}static get JPEG(){return g.parse({mediaType:"image/jpeg",fileExtension:"jpeg"})}static get JSON(){return g.parse({mediaType:"application/json"})}static get LCP_LICENSE_DOCUMENT(){return g.parse({mediaType:"application/vnd.readium.lcp.license.v1.0+json",name:"LCP License",fileExtension:"lcpl"})}static get LCP_PROTECTED_AUDIOBOOK(){return g.parse({mediaType:"application/audiobook+lcp",name:"LCP Protected Audiobook",fileExtension:"lcpa"})}static get LCP_PROTECTED_PDF(){return g.parse({mediaType:"application/pdf+lcp",name:"LCP Protected PDF",fileExtension:"lcpdf"})}static get LCP_STATUS_DOCUMENT(){return g.parse({mediaType:"application/vnd.readium.license.status.v1.0+json"})}static get LPF(){return g.parse({mediaType:"application/lpf+zip",fileExtension:"lpf"})}static get MP3(){return g.parse({mediaType:"audio/mpeg",fileExtension:"mp3"})}static get MPEG(){return g.parse({mediaType:"video/mpeg",fileExtension:"mpeg"})}static get NCX(){return g.parse({mediaType:"application/x-dtbncx+xml",fileExtension:"ncx"})}static get OGG(){return g.parse({mediaType:"audio/ogg",fileExtension:"oga"})}static get OGV(){return g.parse({mediaType:"video/ogg",fileExtension:"ogv"})}static get OPDS1(){return g.parse({mediaType:"application/atom+xml;profile=opds-catalog"})}static get OPDS1_ENTRY(){return g.parse({mediaType:"application/atom+xml;type=entry;profile=opds-catalog"})}static get OPDS2(){return g.parse({mediaType:"application/opds+json"})}static get OPDS2_PUBLICATION(){return g.parse({mediaType:"application/opds-publication+json"})}static get OPDS_AUTHENTICATION(){return g.parse({mediaType:"application/opds-authentication+json"})}static get OPUS(){return g.parse({mediaType:"audio/opus",fileExtension:"opus"})}static get OTF(){return g.parse({mediaType:"font/otf",fileExtension:"otf"})}static get PDF(){return g.parse({mediaType:"application/pdf",name:"PDF",fileExtension:"pdf"})}static get PNG(){return g.parse({mediaType:"image/png",fileExtension:"png"})}static get READIUM_AUDIOBOOK(){return g.parse({mediaType:"application/audiobook+zip",name:"Readium Audiobook",fileExtension:"audiobook"})}static get READIUM_AUDIOBOOK_MANIFEST(){return g.parse({mediaType:"application/audiobook+json",name:"Readium Audiobook",fileExtension:"json"})}static get READIUM_CONTENT_DOCUMENT(){return g.parse({mediaType:"application/vnd.readium.content+json",name:"Readium Content Document",fileExtension:"json"})}static get READIUM_GUIDED_NAVIGATION_DOCUMENT(){return g.parse({mediaType:"application/guided-navigation+json",name:"Readium Guided Navigation Document",fileExtension:"json"})}static get READIUM_POSITION_LIST(){return g.parse({mediaType:"application/vnd.readium.position-list+json",name:"Readium Position List",fileExtension:"json"})}static get READIUM_WEBPUB(){return g.parse({mediaType:"application/webpub+zip",name:"Readium Web Publication",fileExtension:"webpub"})}static get READIUM_WEBPUB_MANIFEST(){return g.parse({mediaType:"application/webpub+json",name:"Readium Web Publication",fileExtension:"json"})}static get SMIL(){return g.parse({mediaType:"application/smil+xml",fileExtension:"smil"})}static get SVG(){return g.parse({mediaType:"image/svg+xml",fileExtension:"svg"})}static get TEXT(){return g.parse({mediaType:"text/plain",fileExtension:"txt"})}static get TIFF(){return g.parse({mediaType:"image/tiff",fileExtension:"tiff"})}static get TTF(){return g.parse({mediaType:"font/ttf",fileExtension:"ttf"})}static get W3C_WPUB_MANIFEST(){return g.parse({mediaType:"application/x.readium.w3c.wpub+json",name:"Web Publication",fileExtension:"json"})}static get WAV(){return g.parse({mediaType:"audio/wav",fileExtension:"wav"})}static get WEBM_AUDIO(){return g.parse({mediaType:"audio/webm",fileExtension:"webm"})}static get WEBM_VIDEO(){return g.parse({mediaType:"video/webm",fileExtension:"webm"})}static get WEBP(){return g.parse({mediaType:"image/webp",fileExtension:"webp"})}static get WOFF(){return g.parse({mediaType:"font/woff",fileExtension:"woff"})}static get WOFF2(){return g.parse({mediaType:"font/woff2",fileExtension:"woff2"})}static get XHTML(){return g.parse({mediaType:"application/xhtml+xml",fileExtension:"xhtml"})}static get XML(){return g.parse({mediaType:"application/xml",fileExtension:"xml"})}static get ZAB(){return g.parse({mediaType:"application/x.readium.zab+zip",name:"Zipped Audio Book",fileExtension:"zab"})}static get ZIP(){return g.parse({mediaType:"application/zip",fileExtension:"zip"})}}class Cn{constructor(e){this.uri=e,this.parameters=this.getParameters(e)}getParameters(e){const t=/\{\??([^}]+)\}/g,n=e.match(t);return n?new Set(n.join(",").replace(t,"$1").split(",").map(i=>i.trim())):new Set}expand(e){const t=i=>i.split(",").map(o=>{const a=e[o];return a?encodeURIComponent(a):""}).join(","),n=i=>"?"+i.split(",").map(o=>{const a=o.split("=")[0],s=e[a];return s?`${a}=${encodeURIComponent(s)}`:""}).join("&");return this.uri.replace(/\{(\??)([^}]+)\}/g,(...i)=>i[1]?n(i[2]):t(i[2]))}}class C{constructor(e){this.fragments=e.fragments?e.fragments:new Array,this.progression=e.progression,this.totalProgression=e.totalProgression,this.position=e.position,this.otherLocations=e.otherLocations}static deserialize(e){if(!e)return;const t=Qe(e.progression),n=Qe(e.totalProgression),i=Qe(e.position),o=new Map,a=new Set(["fragment","fragments","progression","totalProgression","position"]);return Object.entries(e).forEach(([s,l])=>{a.has(s)||o.set(s,l)}),new C({fragments:Rn(e.fragments||e.fragment),progression:t!==void 0&&t>=0&&t<=1?t:void 0,totalProgression:n!==void 0&&n>=0&&n<=1?n:void 0,position:i!==void 0&&i>0?i:void 0,otherLocations:o.size===0?void 0:o})}serialize(){const e={};return this.fragments&&(e.fragments=this.fragments),this.progression!==void 0&&(e.progression=this.progression),this.totalProgression!==void 0&&(e.totalProgression=this.totalProgression),this.position!==void 0&&(e.position=this.position),this.otherLocations&&this.otherLocations.forEach((t,n)=>e[n]=t),e}}class oe{constructor(e){this.after=e.after,this.before=e.before,this.highlight=e.highlight}static deserialize(e){if(e)return new oe({after:e.after,before:e.before,highlight:e.highlight})}serialize(){const e={};return this.after!==void 0&&(e.after=this.after),this.before!==void 0&&(e.before=this.before),this.highlight!==void 0&&(e.highlight=this.highlight),e}}class N{constructor(e){this.href=e.href,this.type=e.type,this.title=e.title,this.locations=e.locations?e.locations:new C({}),this.text=e.text}static deserialize(e){if(e&&e.href&&e.type)return new N({href:e.href,type:e.type,title:e.title,locations:C.deserialize(e.locations),text:oe.deserialize(e.text)})}serialize(){const e={href:this.href,type:this.type};return this.title!==void 0&&(e.title=this.title),this.locations&&(e.locations=this.locations.serialize()),this.text&&(e.text=this.text.serialize()),e}copyWithLocations(e){return new N({href:this.href,type:this.type,title:this.title,text:this.text,locations:new C({...this.locations,...e})})}}class V{constructor(e){this.href=e.href,this.templated=e.templated,this.type=e.type,this.title=e.title,this.rels=e.rels,this.properties=e.properties,this.height=e.height,this.width=e.width,this.size=e.size,this.duration=e.duration,this.bitrate=e.bitrate,this.languages=e.languages,this.alternates=e.alternates,this.children=e.children}static deserialize(e){if(!(!e||typeof e.href!="string"))return new V({href:e.href,templated:e.templated,type:e.type,title:e.title,rels:e.rel?Array.isArray(e.rel)?new Set(e.rel):new Set([e.rel]):void 0,properties:X.deserialize(e.properties),height:G(e.height),width:G(e.width),size:G(e.size),duration:G(e.duration),bitrate:G(e.bitrate),languages:Rn(e.language),alternates:et.deserialize(e.alternate),children:et.deserialize(e.children)})}serialize(){const e={href:this.href};return this.templated!==void 0&&(e.templated=this.templated),this.type!==void 0&&(e.type=this.type),this.title!==void 0&&(e.title=this.title),this.rels&&(e.rel=ro(this.rels)),this.properties&&(e.properties=this.properties.serialize()),this.height!==void 0&&(e.height=this.height),this.width!==void 0&&(e.width=this.width),this.size!==void 0&&(e.size=this.size),this.duration!==void 0&&(e.duration=this.duration),this.bitrate!==void 0&&(e.bitrate=this.bitrate),this.languages&&(e.language=this.languages),this.alternates&&(e.alternate=this.alternates.serialize()),this.children&&(e.children=this.children.serialize()),e}get mediaType(){return this.type!==void 0?g.parse({mediaType:this.type}):g.BINARY}toURL(e){const t=this.href.replace(/^(\/)/,"");if(t.length===0)return;let n=e||"/";return n.startsWith("/")&&(n="file://"+n),new URL(t,n).href.replace(/^(file:\/\/)/,"")}get templateParameters(){return this.templated?new Cn(this.href).parameters:new Set}expandTemplate(e){return new V({href:new Cn(this.href).expand(e),templated:!1})}addProperties(e){const t=V.deserialize(this.serialize());return t.properties=t.properties?t.properties?.add(e):new X(e),t}get locator(){let e=this.href.split("#");return new N({href:e.length>0&&e[0]!==void 0?e[0]:this.href,type:this.type??"",title:this.title,locations:new C({fragments:e.length>1&&e[1]!==void 0?[e[1]]:[]})})}}class et{constructor(e){this.items=e}static deserialize(e){if(e&&Array.isArray(e))return new et(e.map(t=>V.deserialize(t)).filter(t=>t!==void 0))}serialize(){return this.items.map(e=>e.serialize())}findWithRel(e){const t=n=>n.rels&&n.rels.has(e);return this.items.find(t)}filterByRel(e){const t=n=>n.rels&&n.rels.has(e);return this.items.filter(t)}findWithHref(e){const t=n=>n.href===e;return this.items.find(t)}findIndexWithHref(e){const t=n=>n.href===e;return this.items.findIndex(t)}findWithMediaType(e){const t=n=>n.mediaType.matches(e);return this.items.find(t)}filterByMediaType(e){const t=n=>n.mediaType.matches(e);return this.items.filter(t)}filterByMediaTypes(e){const t=n=>{for(const i of e)if(n.mediaType.matches(i))return!0;return!1};return this.items.filter(t)}everyIsAudio(){const e=t=>t.mediaType.isAudio;return this.items.length>0&&this.items.every(e)}everyIsBitmap(){const e=t=>t.mediaType.isBitmap;return this.items.length>0&&this.items.every(e)}everyIsHTML(){const e=t=>t.mediaType.isHTML;return this.items.length>0&&this.items.every(e)}everyIsVideo(){const e=t=>t.mediaType.isVideo;return this.items.length>0&&this.items.every(e)}everyMatchesMediaType(e){return Array.isArray(e)?this.items.length>0&&this.items.every(t=>{for(const n of e)return t.mediaType.matches(n);return!1}):this.items.length>0&&this.items.every(t=>t.mediaType.matches(e))}filterLinksHasType(){return this.items.filter(e=>e.type)}}var kn=(r=>(r.EPUB="https://readium.org/webpub-manifest/profiles/epub",r.AUDIOBOOK="https://readium.org/webpub-manifest/profiles/audiobook",r.DIVINA="https://readium.org/webpub-manifest/profiles/divina",r.PDF="https://readium.org/webpub-manifest/profiles/pdf",r))(kn||{}),M=(r=>(r.ltr="ltr",r.rtl="rtl",r))(M||{});X.prototype.getContains=function(){return new Set(this.otherProperties.contains||[])};class tt{constructor(e){this.cssSelector=e.cssSelector,this.textNodeIndex=e.textNodeIndex,this.charOffset=e.charOffset}static deserialize(e){if(!(e&&e.cssSelector))return;let t=G(e.textNodeIndex);if(t===void 0)return;let n=G(e.charOffset);return n===void 0&&(n=G(e.offset)),new tt({cssSelector:e.cssSelector,textNodeIndex:t,charOffset:n})}serialize(){const e={cssSelector:this.cssSelector,textNodeIndex:this.textNodeIndex};return this.charOffset!==void 0&&(e.charOffset=this.charOffset),e}}class _t{constructor(e){this.start=e.start,this.end=e.end}static deserialize(e){if(!e)return;let t=tt.deserialize(e.start);if(t)return new _t({start:t,end:tt.deserialize(e.end)})}serialize(){const e={start:this.start.serialize()};return this.end&&(e.end=this.end.serialize()),e}}C.prototype.getCssSelector=function(){return this.otherLocations?.get("cssSelector")},C.prototype.getPartialCfi=function(){return this.otherLocations?.get("partialCfi")},C.prototype.getDomRange=function(){return _t.deserialize(this.otherLocations?.get("domRange"))},C.prototype.fragmentParameters=function(){return new Map(this.fragments.map(r=>r.startsWith("#")?r.slice(1):r).join("&").split("&").filter(r=>!r.startsWith("#")).map(r=>r.split("=")).filter(r=>r.length===2).map(r=>[r[0].trim().toLowerCase(),r[1].trim()]))},C.prototype.htmlId=function(){if(!this.fragments.length)return;let r=this.fragments.find(e=>e.length&&!e.includes("="));if(!r){const e=this.fragmentParameters();e.has("id")?r=e.get("id"):e.has("name")&&(r=e.get("name"))}return r?.startsWith("#")?r.slice(1):r},C.prototype.page=function(){const r=parseInt(this.fragmentParameters().get("page"));if(!isNaN(r)&&r>=0)return r},C.prototype.time=function(){const r=parseInt(this.fragmentParameters().get("t"));if(!isNaN(r))return r},C.prototype.space=function(){const r=this.fragmentParameters();if(!r.has("xywh"))return;const e=r.get("xywh").split(",").map(t=>parseInt(t));if(e.length===4&&!e.some(isNaN))return e};class St{constructor(e){this.currency=e.currency,this.value=e.value}static deserialize(e){if(!e)return;let t=e.currency;if(!(t&&typeof t=="string"&&t.length>0))return;let n=G(e.value);if(n!==void 0)return new St({currency:t,value:n})}serialize(){return{currency:this.currency,value:this.value}}}class ze{constructor(e){this.type=e.type,this.children=e.children}static deserialize(e){if(e&&e.type)return new ze({type:e.type,children:ze.deserializeArray(e.children)})}static deserializeArray(e){if(Array.isArray(e))return e.map(t=>ze.deserialize(t)).filter(t=>t!==void 0)}serialize(){const e={type:this.type};return this.children&&(e.children=this.children.map(t=>t.serialize())),e}}class bt{constructor(e){this.total=e.total,this.position=e.position}static deserialize(e){if(e)return new bt({total:G(e.total),position:G(e.position)})}serialize(){const e={};return this.total!==void 0&&(e.total=this.total),this.position!==void 0&&(e.position=this.position),e}}class vt{constructor(e){this.total=e.total,this.available=e.available}static deserialize(e){if(e)return new vt({total:G(e.total),available:G(e.available)})}serialize(){const e={};return this.total!==void 0&&(e.total=this.total),this.available!==void 0&&(e.available=this.available),e}}class wt{constructor(e){this.state=e.state,this.since=e.since,this.until=e.until}static deserialize(e){if(e&&e.state)return new wt({state:e.state,since:Pn(e.since),until:Pn(e.until)})}serialize(){const e={state:this.state};return this.since!==void 0&&(e.since=this.since.toISOString()),this.until!==void 0&&(e.until=this.until.toISOString()),e}}X.prototype.getNumberOfItems=function(){return G(this.otherProperties.numberOfItems)},X.prototype.getPrice=function(){return St.deserialize(this.otherProperties.price)},X.prototype.getIndirectAcquisitions=function(){const r=this.otherProperties.indirectAcquisition;if(r&&Array.isArray(r))return r.map(e=>ze.deserialize(e)).filter(e=>e!==void 0)},X.prototype.getHolds=function(){return bt.deserialize(this.otherProperties.holds)},X.prototype.getCopies=function(){return vt.deserialize(this.otherProperties.copies)},X.prototype.getAvailability=function(){return wt.deserialize(this.otherProperties.availability)},X.prototype.getAuthenticate=function(){return V.deserialize(this.otherProperties.authenticate)};const ao="CssSelectorGenerator";function En(r="unknown problem",...e){console.warn(`${ao}: ${r}`,...e)}function so(r){return r instanceof RegExp}function lo(r){return r.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".+")}function co(r){const e=r.map(t=>{if(so(t))return n=>t.test(n);if(typeof t=="function")return n=>{const i=t(n);return typeof i!="boolean"?(En("pattern matcher function invalid","Provided pattern matching function does not return boolean. It's result will be ignored.",t),!1):i};if(typeof t=="string"){const n=new RegExp("^"+lo(t)+"$");return i=>n.test(i)}return En("pattern matcher invalid","Pattern matching only accepts strings, regular expressions and/or functions. This item is invalid and will be ignored.",t),()=>!1});return t=>e.some(n=>n(t))}co(["class","id","ng-*"]);const ho=Math.pow(2,32),xn=()=>Math.round(Math.random()*ho).toString(36),Rt=()=>`${Math.round(performance.now())}-${xn()}-${xn()}`,ge=1;class uo{constructor(e){this.destination=null,this.registrar=new Map,this.origin="",this.channelId="",this.receiver=this.receive.bind(this),this.preLog=[],this.wnd=e,e.addEventListener("message",this.receiver)}receive(e){if(e.source===null)throw Error("Event source is null");if(typeof e.data!="object")return;const t=e.data;if(!(!("_readium"in t)||!t._readium||t._readium<=0)){if(t.key==="_ping"){if(!this.destination){if(this.destination=e.source,this.origin=e.origin,this.channelId=t._channel,t._readium!==ge){t._readium>ge?this.send("error",`received comms version ${t._readium} higher than ${ge}`):this.send("error",`received comms version ${t._readium} lower than ${ge}`),this.destination=null,this.origin="",this.channelId="";return}this.send("_pong",void 0),this.preLog.forEach(n=>this.send("log",n)),this.preLog=[]}return}else if(this.channelId){if(t._channel!==this.channelId||e.origin!==this.origin)return}else return;this.handle(t)}}handle(e){const t=this.registrar.get(e.key);if(!t||t.length===0){e.strict&&this.send("_unhandled",e);return}t.forEach(n=>n.cb(e.data,i=>{this.send("_ack",i,e.id)}))}register(e,t,n){Array.isArray(e)||(e=[e]),e.forEach(i=>{const o=this.registrar.get(i);if(o&&o.length>=0){if(o.find(s=>s.module===t))throw new Error(`Trying to register another callback for combination of event ${i} and module ${t}`);o.push({cb:n,module:t}),this.registrar.set(i,o)}else this.registrar.set(i,[{cb:n,module:t}])})}unregister(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{const i=this.registrar.get(n);!i||i.length===0||i.splice(i.findIndex(o=>o.module===t),1)})}unregisterAll(e){this.registrar.forEach((t,n)=>this.registrar.set(n,t.filter(i=>i.module!==e)))}log(...e){this.destination?this.send("log",e):this.preLog.push(e)}get ready(){return!!this.destination}destroy(){this.destination=null,this.channelId="",this.preLog=[],this.registrar.clear(),this.wnd.removeEventListener("message",this.receiver)}send(e,t,n=void 0,i=[]){if(!this.destination)throw Error("Attempted to send comms message before destination has been initialized");const o={_readium:ge,_channel:this.channelId,id:n??Rt(),key:e,data:t};try{this.destination.postMessage(o,{targetOrigin:this.origin,transfer:i})}catch(a){if(i.length>0)throw a;this.destination.postMessage(o,this.origin,i)}}}class fe{}function Fn(r){return r.split("").reverse().join("")}function mo(r,e,t){const n=Fn(e);return t.map(i=>{const o=Math.max(0,i.end-e.length-i.errors),a=Fn(r.slice(o,i.end));return{start:Ln(a,n,i.errors).reduce((l,c)=>i.end-c.end<l?i.end-c.end:l,i.end),end:i.end,errors:i.errors}})}function Pt(r){return(r|-r)>>31&1}function zn(r,e,t,n){let i=r.P[t],o=r.M[t];const a=n>>>31,s=e[t]|a,l=s|o,c=(s&i)+i^i|s;let h=o|~(c|i),u=i&c;const m=Pt(h&r.lastRowMask[t])-Pt(u&r.lastRowMask[t]);return h<<=1,u<<=1,u|=a,h|=Pt(n)-a,i=u|~(l|h),o=h&l,r.P[t]=i,r.M[t]=o,m}function Ln(r,e,t){if(e.length===0)return[];t=Math.min(t,e.length);const n=[],i=32,o=Math.ceil(e.length/i)-1,a={P:new Uint32Array(o+1),M:new Uint32Array(o+1),lastRowMask:new Uint32Array(o+1)};a.lastRowMask.fill(1<<31),a.lastRowMask[o]=1<<(e.length-1)%i;const s=new Uint32Array(o+1),l=new Map,c=[];for(let m=0;m<256;m++)c.push(s);for(let m=0;m<e.length;m+=1){const f=e.charCodeAt(m);if(l.has(f))continue;const d=new Uint32Array(o+1);l.set(f,d),f<c.length&&(c[f]=d);for(let p=0;p<=o;p+=1){d[p]=0;for(let b=0;b<i;b+=1){const P=p*i+b;if(P>=e.length)continue;e.charCodeAt(P)===f&&(d[p]|=1<<b)}}}let h=Math.max(0,Math.ceil(t/i)-1);const u=new Uint32Array(o+1);for(let m=0;m<=h;m+=1)u[m]=(m+1)*i;u[o]=e.length;for(let m=0;m<=h;m+=1)a.P[m]=-1,a.M[m]=0;for(let m=0;m<r.length;m+=1){const f=r.charCodeAt(m);let d;f<c.length?d=c[f]:(d=l.get(f),typeof d>"u"&&(d=s));let p=0;for(let b=0;b<=h;b+=1)p=zn(a,d,b,p),u[b]+=p;if(u[h]-p<=t&&h<o&&(d[h+1]&1||p<0)){h+=1,a.P[h]=-1,a.M[h]=0;let b;if(h===o){const P=e.length%i;b=P===0?i:P}else b=i;u[h]=u[h-1]+b-p+zn(a,d,h,p)}else for(;h>0&&u[h]>=t+i;)h-=1;h===o&&u[h]<=t&&(u[h]<t&&n.splice(0,n.length),n.push({start:-1,end:m+1,errors:u[h]}),t=u[h])}return n}function po(r,e,t){const n=Ln(r,e,t);return mo(r,e,n)}function On(r,e,t){let n=0;const i=[];for(;n!==-1;)n=r.indexOf(e,n),n!==-1&&(i.push({start:n,end:n+e.length,errors:0}),n+=1);return i.length>0?i:po(r,e,t)}function An(r,e){return e.length===0||r.length===0?0:1-On(r,e,e.length)[0].errors/e.length}function go(r,e,t={}){if(e.length===0)return null;const n=Math.min(256,e.length/2),i=On(r,e,n);if(i.length===0)return null;const o=s=>{const m=1-s.errors/e.length,f=t.prefix?An(r.slice(Math.max(0,s.start-t.prefix.length),s.start),t.prefix):1,d=t.suffix?An(r.slice(s.end,s.end+t.suffix.length),t.suffix):1;let p=1;return typeof t.hint=="number"&&(p=1-Math.abs(s.start-t.hint)/r.length),(50*m+20*f+20*d+2*p)/92},a=i.map(s=>({start:s.start,end:s.end,score:o(s)}));return a.sort((s,l)=>l.score-s.score),a[0]}function Ct(r,e,t){const n=t===1?e:e-1;if(r.charAt(n).trim()!=="")return e;let i,o;if(t===2?(i=r.substring(0,e),o=i.trimEnd()):(i=r.substring(e),o=i.trimStart()),!o.length)return-1;const a=i.length-o.length;return t===2?e-a:e+a}function Un(r,e){const t=r.commonAncestorContainer.ownerDocument.createNodeIterator(r.commonAncestorContainer,NodeFilter.SHOW_TEXT),n=e===1?r.startContainer:r.endContainer,i=e===1?r.endContainer:r.startContainer;let o=t.nextNode();for(;o&&o!==n;)o=t.nextNode();e===2&&(o=t.previousNode());let a=-1;const s=()=>{if(o=e===1?t.nextNode():t.previousNode(),o){const l=o.textContent,c=e===1?0:l.length;a=Ct(l,c,e)}};for(;o&&a===-1&&o!==i;)s();if(o&&a>=0)return{node:o,offset:a};throw new RangeError("No text nodes with non-whitespace text found in range")}function fo(r){if(!r.toString().trim().length)throw new RangeError("Range contains no non-whitespace text");if(r.startContainer.nodeType!==Node.TEXT_NODE)throw new RangeError("Range startContainer is not a text node");if(r.endContainer.nodeType!==Node.TEXT_NODE)throw new RangeError("Range endContainer is not a text node");const e=r.cloneRange();let t=!1,n=!1;const i={start:Ct(r.startContainer.textContent,r.startOffset,1),end:Ct(r.endContainer.textContent,r.endOffset,2)};if(i.start>=0&&(e.setStart(r.startContainer,i.start),t=!0),i.end>0&&(e.setEnd(r.endContainer,i.end),n=!0),t&&n)return e;if(!t){const{node:o,offset:a}=Un(e,1);o&&a>=0&&e.setStart(o,a)}if(!n){const{node:o,offset:a}=Un(e,2);o&&a>0&&e.setEnd(o,a)}return e}function Tn(r){switch(r.nodeType){case Node.ELEMENT_NODE:case Node.TEXT_NODE:return r.textContent?.length??0;default:return 0}}function Nn(r){let e=r.previousSibling,t=0;for(;e;)t+=Tn(e),e=e.previousSibling;return t}function Mn(r,...e){let t=e.shift();const n=r.ownerDocument.createNodeIterator(r,NodeFilter.SHOW_TEXT),i=[];let o=n.nextNode(),a,s=0;for(;t!==void 0&&o;)a=o,s+a.data.length>t?(i.push({node:a,offset:t-s}),t=e.shift()):(o=n.nextNode(),s+=a.data.length);for(;t!==void 0&&a&&s===t;)i.push({node:a,offset:a.data.length}),t=e.shift();if(t!==void 0)throw new RangeError("Offset exceeds text length");return i}class q{constructor(e,t){if(t<0)throw new Error("Offset is invalid");this.element=e,this.offset=t}relativeTo(e){if(!e.contains(this.element))throw new Error("Parent is not an ancestor of current element");let t=this.element,n=this.offset;for(;t!==e;)n+=Nn(t),t=t.parentElement;return new q(t,n)}resolve(e={}){try{return Mn(this.element,this.offset)[0]}catch(t){if(this.offset===0&&e.direction!==void 0){const n=document.createTreeWalker(this.element.getRootNode(),NodeFilter.SHOW_TEXT);n.currentNode=this.element;const i=e.direction===1,o=i?n.nextNode():n.previousNode();if(!o)throw t;return{node:o,offset:i?0:o.data.length}}else throw t}}static fromCharOffset(e,t){switch(e.nodeType){case Node.TEXT_NODE:return q.fromPoint(e,t);case Node.ELEMENT_NODE:return new q(e,t);default:throw new Error("Node is not an element or text node")}}static fromPoint(e,t){switch(e.nodeType){case Node.TEXT_NODE:{if(t<0||t>e.data.length)throw new Error("Text node offset is out of range");if(!e.parentElement)throw new Error("Text node has no parent");const n=Nn(e)+t;return new q(e.parentElement,n)}case Node.ELEMENT_NODE:{if(t<0||t>e.childNodes.length)throw new Error("Child node offset is out of range");let n=0;for(let i=0;i<t;i++)n+=Tn(e.childNodes[i]);return new q(e,n)}default:throw new Error("Point is not in an element or text node")}}}class re{constructor(e,t){this.start=e,this.end=t}relativeTo(e){return new re(this.start.relativeTo(e),this.end.relativeTo(e))}toRange(){let e,t;this.start.element===this.end.element&&this.start.offset<=this.end.offset?[e,t]=Mn(this.start.element,this.start.offset,this.end.offset):(e=this.start.resolve({direction:1}),t=this.end.resolve({direction:2}));const n=new Range;return n.setStart(e.node,e.offset),n.setEnd(t.node,t.offset),n}static fromRange(e){const t=q.fromPoint(e.startContainer,e.startOffset),n=q.fromPoint(e.endContainer,e.endOffset);return new re(t,n)}static fromOffsets(e,t,n){return new re(new q(e,t),new q(e,n))}static trimmedRange(e){return fo(re.fromRange(e).toRange())}}class nt{constructor(e,t,n){this.root=e,this.start=t,this.end=n}static fromRange(e,t){const n=re.fromRange(t).relativeTo(e);return new nt(e,n.start.offset,n.end.offset)}static fromSelector(e,t){return new nt(e,t.start,t.end)}toSelector(){return{type:"TextPositionSelector",start:this.start,end:this.end}}toRange(){return re.fromOffsets(this.root,this.start,this.end).toRange()}}class it{constructor(e,t,n={}){this.root=e,this.exact=t,this.context=n}static fromRange(e,t){const n=e.textContent,i=re.fromRange(t).relativeTo(e),o=i.start.offset,a=i.end.offset,s=32;return new it(e,n.slice(o,a),{prefix:n.slice(Math.max(0,o-s),o),suffix:n.slice(a,Math.min(n.length,a+s))})}static fromSelector(e,t){const{prefix:n,suffix:i}=t;return new it(e,t.exact,{prefix:n,suffix:i})}toSelector(){return{type:"TextQuoteSelector",exact:this.exact,prefix:this.context.prefix,suffix:this.context.suffix}}toRange(e={}){return this.toPositionAnchor(e).toRange()}toPositionAnchor(e={}){const t=this.root.textContent,n=go(t,this.exact,{...this.context,hint:e.hint});if(!n)throw new Error("Quote not found");return new nt(this.root,n.start,n.end)}}function yo(r){const e=r.tagName.toUpperCase();return e==="IMG"||e==="VIDEO"||e==="AUDIO"||e==="IFRAME"||e==="OBJECT"||e==="EMBED"||e==="CANVAS"}function Le(r,e){try{const t=e.locations,n=e.text;if(n&&n.highlight){let i;t&&t.getCssSelector()&&(i=r.querySelector(t.getCssSelector())),i||(i=r.body);const o=new it(i,n.highlight,{prefix:n.before,suffix:n.after});try{return o.toRange()}catch{return console.warn("Quote not found:",o),null}}if(t){let i=null;if(!i&&t.getCssSelector()&&(i=r.querySelector(t.getCssSelector())),!i&&t.fragments){for(const o of t.fragments)if(i=r.getElementById(o),i)break}if(i){const o=r.createRange();return i.childNodes.length===0||yo(i)?(o.selectNode(i),o):(o.setStartBefore(i),o.setEndAfter(i),o)}}}catch(t){console.error(t)}return null}function _o(r,e){let t=r.getClientRects();t.length||r.commonAncestorContainer.nodeType===Node.ELEMENT_NODE&&(t=r.commonAncestorContainer.getClientRects());const n=1,i=[];for(const c of t)i.push({bottom:c.bottom,height:c.height,left:c.left,right:c.right,top:c.top,width:c.width});const o=In(i,n),a=bo(o,n),s=Hn(a),l=4;for(let c=s.length-1;c>=0;c--){const h=s[c];if(!(h.width*h.height>l))if(s.length>1)s.splice(c,1);else break}return s}function In(r,e,t){for(let n=0;n<r.length;n++)for(let i=n+1;i<r.length;i++){const o=r[n],a=r[i];if(o===a)continue;const s=$(o.top,a.top,e)&&$(o.bottom,a.bottom,e),l=$(o.left,a.left,e)&&$(o.right,a.right,e);if(s&&!l&&Wn(o,a,e)){const u=r.filter(f=>f!==o&&f!==a),m=So(o,a);return u.push(m),In(u,e)}}return r}function So(r,e){const t=Math.min(r.left,e.left),n=Math.max(r.right,e.right),i=Math.min(r.top,e.top),o=Math.max(r.bottom,e.bottom);return{bottom:o,height:o-i,left:t,right:n,top:i,width:n-t}}function bo(r,e){const t=new Set(r);for(const n of r){if(!(n.width>1&&n.height>1)){t.delete(n);continue}for(const o of r)if(n!==o&&t.has(o)&&vo(o,n,e)){t.delete(n);break}}return Array.from(t)}function vo(r,e,t){return ot(r,e.left,e.top,t)&&ot(r,e.right,e.top,t)&&ot(r,e.left,e.bottom,t)&&ot(r,e.right,e.bottom,t)}function ot(r,e,t,n){return(r.left<e||$(r.left,e,n))&&(r.right>e||$(r.right,e,n))&&(r.top<t||$(r.top,t,n))&&(r.bottom>t||$(r.bottom,t,n))}function Hn(r){for(let e=0;e<r.length;e++)for(let t=e+1;t<r.length;t++){const n=r[e],i=r[t];if(n!==i&&Wn(n,i,-1)){let o=[],a;const s=Dn(n,i);if(s.length===1)o=s,a=n;else{const c=Dn(i,n);s.length<c.length?(o=s,a=n):(o=c,a=i)}const l=r.filter(c=>c!==a);return Array.prototype.push.apply(l,o),Hn(l)}}return r}function Dn(r,e){const t=wo(e,r);if(t.height===0||t.width===0)return[r];const n=[];{const i={bottom:r.bottom,height:0,left:r.left,right:t.left,top:r.top,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}{const i={bottom:t.top,height:0,left:t.left,right:t.right,top:r.top,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}{const i={bottom:r.bottom,height:0,left:t.left,right:t.right,top:t.bottom,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}{const i={bottom:r.bottom,height:0,left:t.right,right:r.right,top:r.top,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}return n}function wo(r,e){const t=Math.max(r.left,e.left),n=Math.min(r.right,e.right),i=Math.max(r.top,e.top),o=Math.min(r.bottom,e.bottom);return{bottom:o,height:Math.max(0,o-i),left:t,right:n,top:i,width:Math.max(0,n-t)}}function Wn(r,e,t){return(r.left<e.right||t>=0&&$(r.left,e.right,t))&&(e.left<r.right||t>=0&&$(e.left,r.right,t))&&(r.top<e.bottom||t>=0&&$(r.top,e.bottom,t))&&(e.top<r.bottom||t>=0&&$(e.top,r.bottom,t))}function $(r,e,t){return Math.abs(r-e)<=t}function kt(r){const e={},t=r.document.documentElement.style;for(const n in r.document.documentElement.style)Object.hasOwn(t,n)&&!Number.isNaN(Number.parseInt(n))&&(e[t[n]]=t.getPropertyValue(t[n]));return e}function Bn(r,e){const t=kt(r);Object.keys(t).forEach(n=>{e.hasOwnProperty(n)||rt(r,n)}),Object.entries(e).forEach(([n,i])=>{t[n]!==i&&Oe(r,n,i)})}function Et(r,e){return r.document.documentElement.style.getPropertyValue(e)}function Oe(r,e,t){r.document.documentElement.style.setProperty(e,t)}function rt(r,e){r.document.documentElement.style.removeProperty(e)}let at=null,xt=null,Ae=0;const ye={r:255,g:255,b:255,a:1},_e=new Map,Ro=()=>{if(!at)if(typeof OffscreenCanvas<"u")at=new OffscreenCanvas(5,5),xt=at.getContext("2d",{willReadFrequently:!0,desynchronized:!0});else{const r=document.createElement("canvas");r.width=5,r.height=5,at=r,xt=r.getContext("2d",{willReadFrequently:!0,desynchronized:!0})}return xt},Po=r=>{if(!r)return!0;const e=r.trim().toLowerCase();return e.startsWith("var(")||["transparent","currentcolor","inherit","initial","revert","unset","revert-layer"].includes(e)?!0:["linear-gradient","radial-gradient","conic-gradient","repeating-linear-gradient","repeating-radial-gradient","repeating-conic-gradient"].some(i=>e.includes(i))},st=(r,e)=>{console.warn(`[Decorator] Could not parse color: "${r}". ${e} Falling back to ${JSON.stringify(ye)} to compute contrast. Please use a CSS color value that can be computed to RGB(A).`)},Ft=(r,e=null)=>{const t=e?`${r}|${e}`:r,n=_e.get(t);if(n!==void 0)return n??ye;if(Po(r))return st(r,"Unsupported color format or special value."),_e.set(t,null),ye;const i=Ro();if(!i)return st(r,"Could not get canvas context."),_e.set(t,null),ye;try{Ae===0&&i.clearRect(0,0,5,5);const o=Ae%5,a=Math.floor(Ae/5);i.clearRect(o,a,1,1),e&&(i.fillStyle=e,i.fillRect(o,a,1,1)),i.fillStyle=r,i.fillRect(o,a,1,1);const s=i.getImageData(o,a,1,1);Ae=(Ae+1)%25;const[l,c,h,u]=s.data;if(u===0)return st(r,"Fully transparent color."),_e.set(t,null),ye;const m={r:l,g:c,b:h,a:u/255};return _e.set(t,m),m}catch(o){return st(r,`Error: ${o instanceof Error?o.message:String(o)}`),_e.set(t,null),ye}},zt=r=>{const e=r/255;return e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)},jn=r=>{const e=zt(r.r),t=zt(r.g),n=zt(r.b);return .2126*e+.7152*t+.0722*n},Gn=(r,e)=>{const t=typeof r=="string"?Ft(r):r,n=typeof e=="string"?Ft(e):e,i=jn(t),o=jn(n),a=Math.max(i,o),s=Math.min(i,o);return(a+.05)/(s+.05)},Lt=(r,e=null)=>{const t=Ft(r,e),n=Gn(t,{r:255,g:255,b:255,a:1}),i=Gn(t,{r:0,g:0,b:0,a:1});return n>i},Co=(r,e=null)=>Lt(r,e)?"white":"black",Vn="#FFFF00",ko=()=>"Highlight"in window,$n=["IMG","IMAGE","AUDIO","VIDEO","SVG"];class Eo{constructor(e,t,n,i){this.wnd=e,this.comms=t,this.id=n,this.name=i,this.items=[],this.lastItemId=0,this.container=void 0,this.activateable=!1,this.experimentalHighlights=!1,this.currentRender=0,ko()&&(this.experimentalHighlights=!0,this.notTextFlag=new Map)}get activeable(){return this.activateable}set activeable(e){this.activateable=e}add(e){const t=`${this.id}-${this.lastItemId++}`,n=Le(this.wnd.document,e.locator);if(!n){this.comms.log("Can't locate DOM range for decoration",e);return}const i=n.commonAncestorContainer;i.nodeType!==Node.TEXT_NODE&&this.experimentalHighlights&&($n.includes(i.nodeName.toUpperCase())&&this.notTextFlag?.set(t,!0),n.cloneContents().querySelector($n.join(", ").toLowerCase())&&this.notTextFlag?.set(t,!0),(i.textContent?.trim()||"").length===0&&this.notTextFlag?.set(t,!0));const o={decoration:e,id:t,range:n};this.items.push(o),this.layout(o),this.renderLayout([o])}remove(e){const t=this.items.findIndex(i=>i.decoration.id===e);if(t<0)return;const n=this.items[t];this.items.splice(t,1),n.clickableElements=void 0,n.container&&(n.container.remove(),n.container=void 0),this.experimentalHighlights&&!this.notTextFlag?.has(n.id)&&this.wnd.CSS.highlights.get(this.id)?.delete(n.range),this.notTextFlag?.delete(n.id)}update(e){this.remove(e.id),this.add(e)}clear(){this.clearContainer(),this.items.length=0,this.notTextFlag?.clear()}requestLayout(){this.wnd.cancelAnimationFrame(this.currentRender),this.clearContainer(),this.items.forEach(e=>this.layout(e)),this.renderLayout(this.items)}experimentalLayout(e){const[t,n]=this.requireContainer(!0);n.add(e.range);const i=Et(this.wnd,"--USER__backgroundColor")||this.wnd.getComputedStyle(this.wnd.document.documentElement).getPropertyValue("background-color"),o=e.decoration?.style?.tint??Vn;t.innerHTML=`
|
|
1
|
+
(function(_,pe){typeof exports=="object"&&typeof module<"u"?pe(exports):typeof define=="function"&&define.amd?define(["exports"],pe):(_=typeof globalThis<"u"?globalThis:_||self,pe(_.navigator={}))})(this,(function(_){"use strict";var ae;const w=class w{constructor(e){this.uri=e}static deserialize(e){if(!(!e||typeof e!="string"))return new w(e)}serialize(){return this.uri}get isWCAGLevelA(){return this===w.EPUB_A11Y_10_WCAG_20_A||this===w.EPUB_A11Y_11_WCAG_20_A||this===w.EPUB_A11Y_11_WCAG_21_A||this===w.EPUB_A11Y_11_WCAG_22_A}get isWCAGLevelAA(){return this===w.EPUB_A11Y_10_WCAG_20_AA||this===w.EPUB_A11Y_11_WCAG_20_AA||this===w.EPUB_A11Y_11_WCAG_21_AA||this===w.EPUB_A11Y_11_WCAG_22_AA}get isWCAGLevelAAA(){return this===w.EPUB_A11Y_10_WCAG_20_AAA||this===w.EPUB_A11Y_11_WCAG_20_AAA||this===w.EPUB_A11Y_11_WCAG_21_AAA||this===w.EPUB_A11Y_11_WCAG_22_AAA}};w.EPUB_A11Y_10_WCAG_20_A=new w("http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-a"),w.EPUB_A11Y_10_WCAG_20_AA=new w("http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-aa"),w.EPUB_A11Y_10_WCAG_20_AAA=new w("http://www.idpf.org/epub/a11y/accessibility-20170105.html#wcag-aaa"),w.EPUB_A11Y_11_WCAG_20_A=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.0-a"),w.EPUB_A11Y_11_WCAG_20_AA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.0-aa"),w.EPUB_A11Y_11_WCAG_20_AAA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.0-aaa"),w.EPUB_A11Y_11_WCAG_21_A=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.1-a"),w.EPUB_A11Y_11_WCAG_21_AA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.1-aa"),w.EPUB_A11Y_11_WCAG_21_AAA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.1-aaa"),w.EPUB_A11Y_11_WCAG_22_A=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.2-a"),w.EPUB_A11Y_11_WCAG_22_AA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.2-aa"),w.EPUB_A11Y_11_WCAG_22_AAA=new w("https://www.w3.org/TR/epub-a11y-11#wcag-2.2-aaa");let pe=w;const E=class E{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new E(e)}serialize(){return this.value}};E.AUDITORY=new E("auditory"),E.CHART_ON_VISUAL=new E("chartOnVisual"),E.CHEM_ON_VISUAL=new E("chemOnVisual"),E.COLOR_DEPENDENT=new E("colorDependent"),E.DIAGRAM_ON_VISUAL=new E("diagramOnVisual"),E.MATH_ON_VISUAL=new E("mathOnVisual"),E.MUSIC_ON_VISUAL=new E("musicOnVisual"),E.TACTILE=new E("tactile"),E.TEXT_ON_VISUAL=new E("textOnVisual"),E.TEXTUAL=new E("textual"),E.VISUAL=new E("visual");let fn=E;const H=class H{constructor(e){if(typeof e=="string"){if(!H.VALID_MODES.has(e.toLowerCase()))return;this.value=e.toLowerCase()}else{const t=e.filter(n=>H.VALID_MODES.has(n.toLowerCase()));if(t.length===0)return;this.value=Array.from(new Set(t))}}static deserialize(e){if(!e)return;if(typeof e=="string")return new H(e);if(!Array.isArray(e))return;const t=e.filter(n=>n?H.VALID_MODES.has(n.toLowerCase()):!1);if(t.length!==0)return new H(t)}serialize(){return this.value}};H.VALID_MODES=new Set(["auditory","tactile","textual","visual"]),H.AUDITORY=new H("auditory"),H.TACTILE=new H("tactile"),H.TEXTUAL=new H("textual"),H.VISUAL=new H("visual");let yn=H;const y=class y{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new y(e)}serialize(){return this.value}};y.NONE=new y("none"),y.ANNOTATIONS=new y("annotations"),y.ARIA=new y("ARIA"),y.INDEX=new y("index"),y.PAGE_BREAK_MARKERS=new y("pageBreakMarkers"),y.PAGE_NAVIGATION=new y("pageNavigation"),y.PRINT_PAGE_NUMBERS=new y("printPageNumbers"),y.READING_ORDER=new y("readingOrder"),y.STRUCTURAL_NAVIGATION=new y("structuralNavigation"),y.TABLE_OF_CONTENTS=new y("tableOfContents"),y.TAGGED_PDF=new y("taggedPDF"),y.ALTERNATIVE_TEXT=new y("alternativeText"),y.AUDIO_DESCRIPTION=new y("audioDescription"),y.CAPTIONS=new y("captions"),y.CLOSED_CAPTIONS=new y("closedCaptions"),y.DESCRIBED_MATH=new y("describedMath"),y.LONG_DESCRIPTION=new y("longDescription"),y.OPEN_CAPTIONS=new y("openCaptions"),y.SIGN_LANGUAGE=new y("signLanguage"),y.TRANSCRIPT=new y("transcript"),y.DISPLAY_TRANSFORMABILITY=new y("displayTransformability"),y.SYNCHRONIZED_AUDIO_TEXT=new y("synchronizedAudioText"),y.TIMING_CONTROL=new y("timingControl"),y.UNLOCKED=new y("unlocked"),y.CHEM_ML=new y("ChemML"),y.LATEX=new y("latex"),y.LATEX_CHEMISTRY=new y("latex-chemistry"),y.MATH_ML=new y("MathML"),y.MATH_ML_CHEMISTRY=new y("MathML-chemistry"),y.TTS_MARKUP=new y("ttsMarkup"),y.HIGH_CONTRAST_AUDIO=new y("highContrastAudio"),y.HIGH_CONTRAST_DISPLAY=new y("highContrastDisplay"),y.LARGE_PRINT=new y("largePrint"),y.BRAILLE=new y("braille"),y.TACTILE_GRAPHIC=new y("tactileGraphic"),y.TACTILE_OBJECT=new y("tactileObject"),y.FULL_RUBY_ANNOTATIONS=new y("fullRubyAnnotations"),y.HORIZONTAL_WRITING=new y("horizontalWriting"),y.RUBY_ANNOTATIONS=new y("rubyAnnotations"),y.VERTICAL_WRITING=new y("verticalWriting"),y.WITH_ADDITIONAL_WORD_SEGMENTATION=new y("withAdditionalWordSegmentation"),y.WITHOUT_ADDITIONAL_WORD_SEGMENTATION=new y("withoutAdditionalWordSegmentation");let Ze=y;const x=class x{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new x(e)}serialize(){return this.value}};x.FLASHING=new x("flashing"),x.NO_FLASHING_HAZARD=new x("noFlashingHazard"),x.UNKNOWN_FLASHING_HAZARD=new x("unknownFlashingHazard"),x.MOTION_SIMULATION=new x("motionSimulation"),x.NO_MOTION_SIMULATION_HAZARD=new x("noMotionSimulationHazard"),x.UNKNOWN_MOTION_SIMULATION_HAZARD=new x("unknownMotionSimulationHazard"),x.SOUND=new x("sound"),x.NO_SOUND_HAZARD=new x("noSoundHazard"),x.UNKNOWN_SOUND_HAZARD=new x("unknownSoundHazard"),x.UNKNOWN=new x("unknown"),x.NONE=new x("none");let _n=x;const F=class F{constructor(e){this.value=e}static deserialize(e){if(!(!e||typeof e!="string"))return new F(e)}serialize(){return this.value}};F.NONE=new F("none"),F.DOCUMENTED=new F("documented"),F.LEGAL=new F("legal"),F.TEMPORARY=new F("temporary"),F.TECHNICAL=new F("technical"),F.EAA_DISPROPORTIONATE_BURDEN=new F("eaa-disproportionate-burden"),F.EAA_FUNDAMENTAL_ALTERATION=new F("eaa-fundamental-alteration"),F.EAA_MICROENTERPRISE=new F("eaa-microenterprise"),F.EAA_TECHNICAL_IMPOSSIBILITY=new F("eaa-technical-impossibility"),F.EAA_TEMPORARY=new F("eaa-temporary");let Sn=F;const bn=["en","ar","da","fr","it","pt_PT","sv"],io={publication:JSON.parse(`{"format":{"audiobook":"Audiobook","audiobookJSON":"Audiobook Manifest","cbz":"Comic Book Archive","divina":"Divina Publication","divinaJSON":"Divina Publication Manifest","epub":"EPUB","lcpa":"LCP Protected Audiobook","lcpdf":"LCP Protected PDF","lcpl":"LCP License Document","pdf":"PDF","rwp":"Readium Web Publication","rwpm":"Readium Web Publication Manifest","zab":"Audiobook Archive","zip":"ZIP Archive"},"kind":{"audiobook_one":"audiobook","audiobook_other":"audiobooks","book_one":"book","book_other":"books","comic_one":"comic","comic_other":"comics","document_one":"document","document_other":"documents"},"metadata":{"accessibility":{"display-guide":{"accessibility-summary":{"no-metadata":"No information is available","publisher-contact":"For more information about the accessibility of this product, please contact the publisher: ","title":"Accessibility summary"},"additional-accessibility-information":{"aria":{"compact":"ARIA roles included","descriptive":"Content is enhanced with ARIA roles to optimize organization and facilitate navigation"},"audio-descriptions":"Audio descriptions","braille":"Braille","color-not-sole-means-of-conveying-information":"Color is not the sole means of conveying information","dyslexia-readability":"Dyslexia readability","full-ruby-annotations":"Full ruby annotations","high-contrast-between-foreground-and-background-audio":"High contrast between foreground and background audio","high-contrast-between-text-and-background":"High contrast between foreground text and background","large-print":"Large print","page-breaks":{"compact":"Page breaks included","descriptive":"Page breaks included from the original print source"},"ruby-annotations":"Some Ruby annotations","sign-language":"Sign language","tactile-graphics":{"compact":"Tactile graphics included","descriptive":"Tactile graphics have been integrated to facilitate access to visual elements for blind people"},"tactile-objects":"Tactile 3D objects","text-to-speech-hinting":"Text-to-speech hinting provided","title":"Additional accessibility information","ultra-high-contrast-between-text-and-background":"Ultra high contrast between text and background","visible-page-numbering":"Visible page numbering","without-background-sounds":"Without background sounds"},"conformance":{"a":{"compact":"This publication meets minimum accessibility standards","descriptive":"The publication contains a conformance statement that it meets the EPUB Accessibility and WCAG 2 Level A standard"},"aa":{"compact":"This publication meets accepted accessibility standards","descriptive":"The publication contains a conformance statement that it meets the EPUB Accessibility and WCAG 2 Level AA standard"},"aaa":{"compact":"This publication exceeds accepted accessibility standards","descriptive":"The publication contains a conformance statement that it meets the EPUB Accessibility and WCAG 2 Level AAA standard"},"certifier":"The publication was certified by ","certifier-credentials":"The certifier's credential is ","details":{"certification-info":"The publication was certified on ","certifier-report":"For more information refer to the certifier's report","claim":"This publication claims to meet","epub-accessibility-1-0":"EPUB Accessibility 1.0","epub-accessibility-1-1":"EPUB Accessibility 1.1","level-a":"Level A","level-aa":"Level AA","level-aaa":"Level AAA","wcag-2-0":{"compact":"WCAG 2.0","descriptive":"Web Content Accessibility Guidelines (WCAG) 2.0"},"wcag-2-1":{"compact":"WCAG 2.1","descriptive":"Web Content Accessibility Guidelines (WCAG) 2.1"},"wcag-2-2":{"compact":"WCAG 2.2","descriptive":"Web Content Accessibility Guidelines (WCAG) 2.2"}},"details-title":"Detailed conformance information","no":"No information is available","title":"Conformance","unknown-standard":"Conformance to accepted standards for accessibility of this publication cannot be determined"},"hazards":{"flashing":{"compact":"Flashing content","descriptive":"The publication contains flashing content that can cause photosensitive seizures"},"flashing-none":{"compact":"No flashing hazards","descriptive":"The publication does not contain flashing content that can cause photosensitive seizures"},"flashing-unknown":{"compact":"Flashing hazards not known","descriptive":"The presence of flashing content that can cause photosensitive seizures could not be determined"},"motion":{"compact":"Motion simulation","descriptive":"The publication contains motion simulations that can cause motion sickness"},"motion-none":{"compact":"No motion simulation hazards","descriptive":"The publication does not contain motion simulations that can cause motion sickness"},"motion-unknown":{"compact":"Motion simulation hazards not known","descriptive":"The presence of motion simulations that can cause motion sickness could not be determined"},"no-metadata":"No information is available","none":{"compact":"No hazards","descriptive":"The publication contains no hazards"},"sound":{"compact":"Sounds","descriptive":"The publication contains sounds that can cause sensitivity issues"},"sound-none":{"compact":"No sound hazards","descriptive":"The publication does not contain sounds that can cause sensitivity issues"},"sound-unknown":{"compact":"Sound hazards not known","descriptive":"The presence of sounds that can cause sensitivity issues could not be determined"},"title":"Hazards","unknown":"The presence of hazards is unknown"},"legal-considerations":{"exempt":{"compact":"Claims an accessibility exemption in some jurisdictions","descriptive":"This publication claims an accessibility exemption in some jurisdictions"},"no-metadata":"No information is available","title":"Legal considerations"},"navigation":{"index":{"compact":"Index","descriptive":"Index with links to referenced entries"},"no-metadata":"No information is available","page-navigation":{"compact":"Go to page","descriptive":"Page list to go to pages from the print source version"},"structural":{"compact":"Headings","descriptive":"Elements such as headings, tables, etc for structured navigation"},"title":"Navigation","toc":{"compact":"Table of contents","descriptive":"Table of contents to all chapters of the text via links"}},"rich-content":{"accessible-chemistry-as-latex":{"compact":"Chemical formulas in LaTeX","descriptive":"Chemical formulas in accessible format (LaTeX)"},"accessible-chemistry-as-mathml":{"compact":"Chemical formulas in MathML","descriptive":"Chemical formulas in accessible format (MathML)"},"accessible-math-as-latex":{"compact":"Math as LaTeX","descriptive":"Math formulas in accessible format (LaTeX)"},"accessible-math-described":"Text descriptions of math are provided","closed-captions":{"compact":"Videos have closed captions","descriptive":"Videos included in publications have closed captions"},"extended-descriptions":"Information-rich images are described by extended descriptions","math-as-mathml":{"compact":"Math as MathML","descriptive":"Math formulas in accessible format (MathML)"},"open-captions":{"compact":"Videos have open captions","descriptive":"Videos included in publications have open captions"},"title":"Rich content","transcript":"Transcript(s) provided","unknown":"No information is available"},"ways-of-reading":{"nonvisual-reading":{"alt-text":{"compact":"Has alternative text","descriptive":"Has alternative text descriptions for images"},"no-metadata":"No information about nonvisual reading is available","none":{"compact":"Not readable in read aloud or dynamic braille","descriptive":"The content is not readable as read aloud speech or dynamic braille"},"not-fully":{"compact":"Not fully readable in read aloud or dynamic braille","descriptive":"Not all of the content will be readable as read aloud speech or dynamic braille"},"readable":{"compact":"Readable in read aloud or dynamic braille","descriptive":"All content can be read as read aloud speech or dynamic braille"}},"prerecorded-audio":{"complementary":{"compact":"Prerecorded audio clips","descriptive":"Prerecorded audio clips are embedded in the content"},"no-metadata":"No information about prerecorded audio is available","only":{"compact":"Prerecorded audio only","descriptive":"Audiobook with no text alternative"},"synchronized":{"compact":"Prerecorded audio synchronized with text","descriptive":"All the content is available as prerecorded audio synchronized with text"}},"title":"Ways of reading","visual-adjustments":{"modifiable":{"compact":"Appearance can be modified","descriptive":"Appearance of the text and page layout can be modified according to the capabilities of the reading system (font family and font size, spaces between paragraphs, sentences, words, and letters, as well as color of background and text)"},"unknown":"No information about appearance modifiability is available","unmodifiable":{"compact":"Appearance cannot be modified","descriptive":"Text and page layout cannot be modified as the reading experience is close to a print version, but reading systems can still provide zooming options"}}}}},"altIdentifier_one":"alternate identifier","altIdentifier_other":"alternate identifiers","artist_one":"artist","artist_other":"artists","author_one":"author","author_other":"authors","collection_one":"editorial collection","collection_other":"editorial collections","colorist_one":"colorist","colorist_other":"colorists","contributor_one":"contributor","contributor_other":"contributors","description":"description","duration":"duration","editor_one":"editor","editor_other":"editors","identifier_one":"identifier","identifier_other":"identifiers","illustrator_one":"illustrator","illustrator_other":"illustrators","imprint_one":"imprint","imprint_other":"imprints","inker_one":"inker","inker_other":"inkers","language_one":"language","language_other":"languages","letterer_one":"letterer","letterer_other":"letterers","modified":"modification date","narrator_one":"narrator","narrator_other":"narrators","numberOfPages":"print length","penciler_one":"penciler","penciler_other":"pencilers","published":"publication date","publisher_one":"publisher","publisher_other":"publishers","series_one":"series","series_other":"series","subject_one":"subject","subject_other":"subjects","subtitle":"subtitle","title":"title","translator_one":"translator","translator_other":"translators"}}`)},vn={fr:()=>Promise.resolve().then(()=>Wr),ar:()=>Promise.resolve().then(()=>Br),da:()=>Promise.resolve().then(()=>jr),it:()=>Promise.resolve().then(()=>Gr),pt_PT:()=>Promise.resolve().then(()=>Vr),sv:()=>Promise.resolve().then(()=>$r)},wn=io?.publication?.metadata?.accessibility?.["display-guide"]||{};class ge{constructor(){this.currentLocaleCode="en",this.locale=wn,this.loadedLocales={},this.loadedLocales.en=wn}static getInstance(){return ge.instance||(ge.instance=new ge),ge.instance}async loadLocale(e){if(!bn.includes(e))return console.warn(`Locale '${e}' is not enabled`),!1;if(e in this.loadedLocales)return!0;try{if(!(e in vn))return console.warn(`Locale file not found for: ${e}`),!1;const i=(await vn[e]()).default?.publication?.metadata?.accessibility?.["display-guide"];return i?(this.loadedLocales[e]=i,!0):(console.warn(`No accessibility strings found in locale ${e}`),!1)}catch(t){return console.warn(`Failed to load locale ${e}:`,t),!1}}registerLocale(e,t){if(!e||typeof e!="string")throw new Error("Locale code must be a non-empty string");this.loadedLocales[e]=t}async setLocale(e){return e in this.loadedLocales||await this.loadLocale(e),e in this.loadedLocales?(this.locale=this.loadedLocales[e],this.currentLocaleCode=e,!0):(console.warn(`Locale '${e}' is not available`),!1)}getCurrentLocale(){return this.currentLocaleCode}getAvailableLocales(){return bn}getNestedValue(e,t){const n=t.split(".");let i=e;for(const o of n){if(i==null)return;i=i[o]}return i}getString(e){let t=this.getNestedValue(this.locale,e);return t===void 0&&this.currentLocaleCode!=="en"&&(t=this.getNestedValue(this.loadedLocales.en,e)),t!==void 0?typeof t=="string"?{compact:t,descriptive:t}:t:(console.warn(`Missing localization for key: ${e}`),{compact:"",descriptive:""})}}ge.getInstance();var S=(r=>(r.reflowable="reflowable",r.fixed="fixed",r.scrolled="scrolled",r))(S||{});class yt{constructor(e){this.algorithm=e.algorithm,this.compression=e.compression,this.originalLength=e.originalLength,this.profile=e.profile,this.scheme=e.scheme}static deserialize(e){if(e&&e.algorithm)return new yt({algorithm:e.algorithm,compression:e.compression,originalLength:e.originalLength,profile:e.profile,scheme:e.scheme})}serialize(){const e={algorithm:this.algorithm};return this.compression!==void 0&&(e.compression=this.compression),this.originalLength!==void 0&&(e.originalLength=this.originalLength),this.profile!==void 0&&(e.profile=this.profile),this.scheme!==void 0&&(e.scheme=this.scheme),e}}var K=(r=>(r.left="left",r.right="right",r.center="center",r))(K||{});let X=class gn{constructor(e){this.otherProperties=e}get page(){return this.otherProperties.page}static deserialize(e){if(e)return new gn(e)}serialize(){return this.otherProperties}add(e){const t=Object.assign({},this.otherProperties);for(const n in e)t[n]=e[n];return new gn(t)}};Object.defineProperty(X.prototype,"encryption",{get:function(){return yt.deserialize(this.otherProperties.encrypted)}});function oo(r){return r&&Array.isArray(r)?r:void 0}function Rn(r){return r&&typeof r=="string"?[r]:oo(r)}function Pn(r){return typeof r=="string"?new Date(r):void 0}function Qe(r){return isNaN(r)?void 0:r}function G(r){return Qe(r)!==void 0&&Math.sign(r)>=0?r:void 0}function ro(r){const e=new Array;return r.forEach(t=>e.push(t)),e}class g{constructor(e){let t,n,i=e.mediaType.replace(/\s/g,"").split(";");const o=i[0].split("/");if(o.length===2){if(t=o[0].toLowerCase().trim(),n=o[1].toLowerCase().trim(),t.length===0||n.length===0)throw new Error("Invalid media type")}else throw new Error("Invalid media type");const a={};for(let m=1;m<i.length;m++){const f=i[m].split("=");if(f.length===2){const d=f[0].toLocaleLowerCase(),p=d==="charset"?f[1].toUpperCase():f[1];a[d]=p}}const s={},l=Object.keys(a);l.sort((m,f)=>m.localeCompare(f)),l.forEach(m=>s[m]=a[m]);let c="";for(const m in s){const f=s[m];c+=`;${m}=${f}`}const h=`${t}/${n}${c}`,u=s.encoding;this.string=h,this.type=t,this.subtype=n,this.parameters=s,this.encoding=u,this.name=e.name,this.fileExtension=e.fileExtension}static parse(e){return new g(e)}get structuredSyntaxSuffix(){const e=this.subtype.split("+");return e.length>1?`+${e[e.length-1]}`:void 0}get charset(){return this.parameters.charset}contains(e){const t=typeof e=="string"?g.parse({mediaType:e}):e;if(!((this.type==="*"||this.type===t.type)&&(this.subtype==="*"||this.subtype===t.subtype)))return!1;const n=new Set(Object.entries(this.parameters).map(([o,a])=>`${o}=${a}`)),i=new Set(Object.entries(t.parameters).map(([o,a])=>`${o}=${a}`));for(const o of Array.from(n.values()))if(!i.has(o))return!1;return!0}matches(e){const t=typeof e=="string"?g.parse({mediaType:e}):e;return this.contains(t)||t.contains(this)}matchesAny(...e){for(const t of e)if(this.matches(t))return!0;return!1}equals(e){return this.string===e.string}get isZIP(){return this.matchesAny(g.ZIP,g.LCP_PROTECTED_AUDIOBOOK,g.LCP_PROTECTED_PDF)||this.structuredSyntaxSuffix==="+zip"}get isJSON(){return this.matchesAny(g.JSON)||this.structuredSyntaxSuffix==="+json"}get isOPDS(){return this.matchesAny(g.OPDS1,g.OPDS1_ENTRY,g.OPDS2,g.OPDS2_PUBLICATION,g.OPDS_AUTHENTICATION)||this.structuredSyntaxSuffix==="+json"}get isHTML(){return this.matchesAny(g.HTML,g.XHTML)}get isBitmap(){return this.matchesAny(g.AVIF,g.BMP,g.GIF,g.JPEG,g.PNG,g.TIFF,g.WEBP)}get isAudio(){return this.type==="audio"}get isVideo(){return this.type==="video"}get isRWPM(){return this.matchesAny(g.READIUM_AUDIOBOOK_MANIFEST,g.DIVINA_MANIFEST,g.READIUM_WEBPUB_MANIFEST)}get isPublication(){return this.matchesAny(g.READIUM_AUDIOBOOK,g.READIUM_AUDIOBOOK_MANIFEST,g.CBZ,g.DIVINA,g.DIVINA_MANIFEST,g.EPUB,g.LCP_PROTECTED_AUDIOBOOK,g.LCP_PROTECTED_PDF,g.LPF,g.PDF,g.W3C_WPUB_MANIFEST,g.READIUM_WEBPUB,g.READIUM_WEBPUB_MANIFEST,g.ZAB)}static get AAC(){return g.parse({mediaType:"audio/aac",fileExtension:"aac"})}static get ACSM(){return g.parse({mediaType:"application/vnd.adobe.adept+xml",name:"Adobe Content Server Message",fileExtension:"acsm"})}static get AIFF(){return g.parse({mediaType:"audio/aiff",fileExtension:"aiff"})}static get AVI(){return g.parse({mediaType:"video/x-msvideo",fileExtension:"avi"})}static get AVIF(){return g.parse({mediaType:"image/avif",fileExtension:"avif"})}static get BINARY(){return g.parse({mediaType:"application/octet-stream"})}static get BMP(){return g.parse({mediaType:"image/bmp",fileExtension:"bmp"})}static get CBZ(){return g.parse({mediaType:"application/vnd.comicbook+zip",name:"Comic Book Archive",fileExtension:"cbz"})}static get CSS(){return g.parse({mediaType:"text/css",fileExtension:"css"})}static get DIVINA(){return g.parse({mediaType:"application/divina+zip",name:"Digital Visual Narratives",fileExtension:"divina"})}static get DIVINA_MANIFEST(){return g.parse({mediaType:"application/divina+json",name:"Digital Visual Narratives",fileExtension:"json"})}static get EPUB(){return g.parse({mediaType:"application/epub+zip",name:"EPUB",fileExtension:"epub"})}static get GIF(){return g.parse({mediaType:"image/gif",fileExtension:"gif"})}static get GZ(){return g.parse({mediaType:"application/gzip",fileExtension:"gz"})}static get HTML(){return g.parse({mediaType:"text/html",fileExtension:"html"})}static get JAVASCRIPT(){return g.parse({mediaType:"text/javascript",fileExtension:"js"})}static get JPEG(){return g.parse({mediaType:"image/jpeg",fileExtension:"jpeg"})}static get JSON(){return g.parse({mediaType:"application/json"})}static get LCP_LICENSE_DOCUMENT(){return g.parse({mediaType:"application/vnd.readium.lcp.license.v1.0+json",name:"LCP License",fileExtension:"lcpl"})}static get LCP_PROTECTED_AUDIOBOOK(){return g.parse({mediaType:"application/audiobook+lcp",name:"LCP Protected Audiobook",fileExtension:"lcpa"})}static get LCP_PROTECTED_PDF(){return g.parse({mediaType:"application/pdf+lcp",name:"LCP Protected PDF",fileExtension:"lcpdf"})}static get LCP_STATUS_DOCUMENT(){return g.parse({mediaType:"application/vnd.readium.license.status.v1.0+json"})}static get LPF(){return g.parse({mediaType:"application/lpf+zip",fileExtension:"lpf"})}static get MP3(){return g.parse({mediaType:"audio/mpeg",fileExtension:"mp3"})}static get MPEG(){return g.parse({mediaType:"video/mpeg",fileExtension:"mpeg"})}static get NCX(){return g.parse({mediaType:"application/x-dtbncx+xml",fileExtension:"ncx"})}static get OGG(){return g.parse({mediaType:"audio/ogg",fileExtension:"oga"})}static get OGV(){return g.parse({mediaType:"video/ogg",fileExtension:"ogv"})}static get OPDS1(){return g.parse({mediaType:"application/atom+xml;profile=opds-catalog"})}static get OPDS1_ENTRY(){return g.parse({mediaType:"application/atom+xml;type=entry;profile=opds-catalog"})}static get OPDS2(){return g.parse({mediaType:"application/opds+json"})}static get OPDS2_PUBLICATION(){return g.parse({mediaType:"application/opds-publication+json"})}static get OPDS_AUTHENTICATION(){return g.parse({mediaType:"application/opds-authentication+json"})}static get OPUS(){return g.parse({mediaType:"audio/opus",fileExtension:"opus"})}static get OTF(){return g.parse({mediaType:"font/otf",fileExtension:"otf"})}static get PDF(){return g.parse({mediaType:"application/pdf",name:"PDF",fileExtension:"pdf"})}static get PNG(){return g.parse({mediaType:"image/png",fileExtension:"png"})}static get READIUM_AUDIOBOOK(){return g.parse({mediaType:"application/audiobook+zip",name:"Readium Audiobook",fileExtension:"audiobook"})}static get READIUM_AUDIOBOOK_MANIFEST(){return g.parse({mediaType:"application/audiobook+json",name:"Readium Audiobook",fileExtension:"json"})}static get READIUM_CONTENT_DOCUMENT(){return g.parse({mediaType:"application/vnd.readium.content+json",name:"Readium Content Document",fileExtension:"json"})}static get READIUM_GUIDED_NAVIGATION_DOCUMENT(){return g.parse({mediaType:"application/guided-navigation+json",name:"Readium Guided Navigation Document",fileExtension:"json"})}static get READIUM_POSITION_LIST(){return g.parse({mediaType:"application/vnd.readium.position-list+json",name:"Readium Position List",fileExtension:"json"})}static get READIUM_WEBPUB(){return g.parse({mediaType:"application/webpub+zip",name:"Readium Web Publication",fileExtension:"webpub"})}static get READIUM_WEBPUB_MANIFEST(){return g.parse({mediaType:"application/webpub+json",name:"Readium Web Publication",fileExtension:"json"})}static get SMIL(){return g.parse({mediaType:"application/smil+xml",fileExtension:"smil"})}static get SVG(){return g.parse({mediaType:"image/svg+xml",fileExtension:"svg"})}static get TEXT(){return g.parse({mediaType:"text/plain",fileExtension:"txt"})}static get TIFF(){return g.parse({mediaType:"image/tiff",fileExtension:"tiff"})}static get TTF(){return g.parse({mediaType:"font/ttf",fileExtension:"ttf"})}static get W3C_WPUB_MANIFEST(){return g.parse({mediaType:"application/x.readium.w3c.wpub+json",name:"Web Publication",fileExtension:"json"})}static get WAV(){return g.parse({mediaType:"audio/wav",fileExtension:"wav"})}static get WEBM_AUDIO(){return g.parse({mediaType:"audio/webm",fileExtension:"webm"})}static get WEBM_VIDEO(){return g.parse({mediaType:"video/webm",fileExtension:"webm"})}static get WEBP(){return g.parse({mediaType:"image/webp",fileExtension:"webp"})}static get WOFF(){return g.parse({mediaType:"font/woff",fileExtension:"woff"})}static get WOFF2(){return g.parse({mediaType:"font/woff2",fileExtension:"woff2"})}static get XHTML(){return g.parse({mediaType:"application/xhtml+xml",fileExtension:"xhtml"})}static get XML(){return g.parse({mediaType:"application/xml",fileExtension:"xml"})}static get ZAB(){return g.parse({mediaType:"application/x.readium.zab+zip",name:"Zipped Audio Book",fileExtension:"zab"})}static get ZIP(){return g.parse({mediaType:"application/zip",fileExtension:"zip"})}}class Cn{constructor(e){this.uri=e,this.parameters=this.getParameters(e)}getParameters(e){const t=/\{\??([^}]+)\}/g,n=e.match(t);return n?new Set(n.join(",").replace(t,"$1").split(",").map(i=>i.trim())):new Set}expand(e){const t=i=>i.split(",").map(o=>{const a=e[o];return a?encodeURIComponent(a):""}).join(","),n=i=>"?"+i.split(",").map(o=>{const a=o.split("=")[0],s=e[a];return s?`${a}=${encodeURIComponent(s)}`:""}).join("&");return this.uri.replace(/\{(\??)([^}]+)\}/g,(...i)=>i[1]?n(i[2]):t(i[2]))}}class C{constructor(e){this.fragments=e.fragments?e.fragments:new Array,this.progression=e.progression,this.totalProgression=e.totalProgression,this.position=e.position,this.otherLocations=e.otherLocations}static deserialize(e){if(!e)return;const t=Qe(e.progression),n=Qe(e.totalProgression),i=Qe(e.position),o=new Map,a=new Set(["fragment","fragments","progression","totalProgression","position"]);return Object.entries(e).forEach(([s,l])=>{a.has(s)||o.set(s,l)}),new C({fragments:Rn(e.fragments||e.fragment),progression:t!==void 0&&t>=0&&t<=1?t:void 0,totalProgression:n!==void 0&&n>=0&&n<=1?n:void 0,position:i!==void 0&&i>0?i:void 0,otherLocations:o.size===0?void 0:o})}serialize(){const e={};return this.fragments&&(e.fragments=this.fragments),this.progression!==void 0&&(e.progression=this.progression),this.totalProgression!==void 0&&(e.totalProgression=this.totalProgression),this.position!==void 0&&(e.position=this.position),this.otherLocations&&this.otherLocations.forEach((t,n)=>e[n]=t),e}}class oe{constructor(e){this.after=e.after,this.before=e.before,this.highlight=e.highlight}static deserialize(e){if(e)return new oe({after:e.after,before:e.before,highlight:e.highlight})}serialize(){const e={};return this.after!==void 0&&(e.after=this.after),this.before!==void 0&&(e.before=this.before),this.highlight!==void 0&&(e.highlight=this.highlight),e}}class N{constructor(e){this.href=e.href,this.type=e.type,this.title=e.title,this.locations=e.locations?e.locations:new C({}),this.text=e.text}static deserialize(e){if(e&&e.href&&e.type)return new N({href:e.href,type:e.type,title:e.title,locations:C.deserialize(e.locations),text:oe.deserialize(e.text)})}serialize(){const e={href:this.href,type:this.type};return this.title!==void 0&&(e.title=this.title),this.locations&&(e.locations=this.locations.serialize()),this.text&&(e.text=this.text.serialize()),e}copyWithLocations(e){return new N({href:this.href,type:this.type,title:this.title,text:this.text,locations:new C({...this.locations,...e})})}}class V{constructor(e){this.href=e.href,this.templated=e.templated,this.type=e.type,this.title=e.title,this.rels=e.rels,this.properties=e.properties,this.height=e.height,this.width=e.width,this.size=e.size,this.duration=e.duration,this.bitrate=e.bitrate,this.languages=e.languages,this.alternates=e.alternates,this.children=e.children}static deserialize(e){if(!(!e||typeof e.href!="string"))return new V({href:e.href,templated:e.templated,type:e.type,title:e.title,rels:e.rel?Array.isArray(e.rel)?new Set(e.rel):new Set([e.rel]):void 0,properties:X.deserialize(e.properties),height:G(e.height),width:G(e.width),size:G(e.size),duration:G(e.duration),bitrate:G(e.bitrate),languages:Rn(e.language),alternates:et.deserialize(e.alternate),children:et.deserialize(e.children)})}serialize(){const e={href:this.href};return this.templated!==void 0&&(e.templated=this.templated),this.type!==void 0&&(e.type=this.type),this.title!==void 0&&(e.title=this.title),this.rels&&(e.rel=ro(this.rels)),this.properties&&(e.properties=this.properties.serialize()),this.height!==void 0&&(e.height=this.height),this.width!==void 0&&(e.width=this.width),this.size!==void 0&&(e.size=this.size),this.duration!==void 0&&(e.duration=this.duration),this.bitrate!==void 0&&(e.bitrate=this.bitrate),this.languages&&(e.language=this.languages),this.alternates&&(e.alternate=this.alternates.serialize()),this.children&&(e.children=this.children.serialize()),e}get mediaType(){return this.type!==void 0?g.parse({mediaType:this.type}):g.BINARY}toURL(e){const t=this.href.replace(/^(\/)/,"");if(t.length===0)return;let n=e||"/";return n.startsWith("/")&&(n="file://"+n),new URL(t,n).href.replace(/^(file:\/\/)/,"")}get templateParameters(){return this.templated?new Cn(this.href).parameters:new Set}expandTemplate(e){return new V({href:new Cn(this.href).expand(e),templated:!1})}addProperties(e){const t=V.deserialize(this.serialize());return t.properties=t.properties?t.properties?.add(e):new X(e),t}get locator(){let e=this.href.split("#");return new N({href:e.length>0&&e[0]!==void 0?e[0]:this.href,type:this.type??"",title:this.title,locations:new C({fragments:e.length>1&&e[1]!==void 0?[e[1]]:[]})})}}class et{constructor(e){this.items=e}static deserialize(e){if(e&&Array.isArray(e))return new et(e.map(t=>V.deserialize(t)).filter(t=>t!==void 0))}serialize(){return this.items.map(e=>e.serialize())}findWithRel(e){const t=n=>n.rels&&n.rels.has(e);return this.items.find(t)}filterByRel(e){const t=n=>n.rels&&n.rels.has(e);return this.items.filter(t)}findWithHref(e){const t=n=>n.href===e;return this.items.find(t)}findIndexWithHref(e){const t=n=>n.href===e;return this.items.findIndex(t)}findWithMediaType(e){const t=n=>n.mediaType.matches(e);return this.items.find(t)}filterByMediaType(e){const t=n=>n.mediaType.matches(e);return this.items.filter(t)}filterByMediaTypes(e){const t=n=>{for(const i of e)if(n.mediaType.matches(i))return!0;return!1};return this.items.filter(t)}everyIsAudio(){const e=t=>t.mediaType.isAudio;return this.items.length>0&&this.items.every(e)}everyIsBitmap(){const e=t=>t.mediaType.isBitmap;return this.items.length>0&&this.items.every(e)}everyIsHTML(){const e=t=>t.mediaType.isHTML;return this.items.length>0&&this.items.every(e)}everyIsVideo(){const e=t=>t.mediaType.isVideo;return this.items.length>0&&this.items.every(e)}everyMatchesMediaType(e){return Array.isArray(e)?this.items.length>0&&this.items.every(t=>{for(const n of e)return t.mediaType.matches(n);return!1}):this.items.length>0&&this.items.every(t=>t.mediaType.matches(e))}filterLinksHasType(){return this.items.filter(e=>e.type)}}var kn=(r=>(r.EPUB="https://readium.org/webpub-manifest/profiles/epub",r.AUDIOBOOK="https://readium.org/webpub-manifest/profiles/audiobook",r.DIVINA="https://readium.org/webpub-manifest/profiles/divina",r.PDF="https://readium.org/webpub-manifest/profiles/pdf",r))(kn||{}),M=(r=>(r.ltr="ltr",r.rtl="rtl",r))(M||{});X.prototype.getContains=function(){return new Set(this.otherProperties.contains||[])};class tt{constructor(e){this.cssSelector=e.cssSelector,this.textNodeIndex=e.textNodeIndex,this.charOffset=e.charOffset}static deserialize(e){if(!(e&&e.cssSelector))return;let t=G(e.textNodeIndex);if(t===void 0)return;let n=G(e.charOffset);return n===void 0&&(n=G(e.offset)),new tt({cssSelector:e.cssSelector,textNodeIndex:t,charOffset:n})}serialize(){const e={cssSelector:this.cssSelector,textNodeIndex:this.textNodeIndex};return this.charOffset!==void 0&&(e.charOffset=this.charOffset),e}}class _t{constructor(e){this.start=e.start,this.end=e.end}static deserialize(e){if(!e)return;let t=tt.deserialize(e.start);if(t)return new _t({start:t,end:tt.deserialize(e.end)})}serialize(){const e={start:this.start.serialize()};return this.end&&(e.end=this.end.serialize()),e}}C.prototype.getCssSelector=function(){return this.otherLocations?.get("cssSelector")},C.prototype.getPartialCfi=function(){return this.otherLocations?.get("partialCfi")},C.prototype.getDomRange=function(){return _t.deserialize(this.otherLocations?.get("domRange"))},C.prototype.fragmentParameters=function(){return new Map(this.fragments.map(r=>r.startsWith("#")?r.slice(1):r).join("&").split("&").filter(r=>!r.startsWith("#")).map(r=>r.split("=")).filter(r=>r.length===2).map(r=>[r[0].trim().toLowerCase(),r[1].trim()]))},C.prototype.htmlId=function(){if(!this.fragments.length)return;let r=this.fragments.find(e=>e.length&&!e.includes("="));if(!r){const e=this.fragmentParameters();e.has("id")?r=e.get("id"):e.has("name")&&(r=e.get("name"))}return r?.startsWith("#")?r.slice(1):r},C.prototype.page=function(){const r=parseInt(this.fragmentParameters().get("page"));if(!isNaN(r)&&r>=0)return r},C.prototype.time=function(){const r=parseInt(this.fragmentParameters().get("t"));if(!isNaN(r))return r},C.prototype.space=function(){const r=this.fragmentParameters();if(!r.has("xywh"))return;const e=r.get("xywh").split(",").map(t=>parseInt(t));if(e.length===4&&!e.some(isNaN))return e};class St{constructor(e){this.currency=e.currency,this.value=e.value}static deserialize(e){if(!e)return;let t=e.currency;if(!(t&&typeof t=="string"&&t.length>0))return;let n=G(e.value);if(n!==void 0)return new St({currency:t,value:n})}serialize(){return{currency:this.currency,value:this.value}}}class ze{constructor(e){this.type=e.type,this.children=e.children}static deserialize(e){if(e&&e.type)return new ze({type:e.type,children:ze.deserializeArray(e.children)})}static deserializeArray(e){if(Array.isArray(e))return e.map(t=>ze.deserialize(t)).filter(t=>t!==void 0)}serialize(){const e={type:this.type};return this.children&&(e.children=this.children.map(t=>t.serialize())),e}}class bt{constructor(e){this.total=e.total,this.position=e.position}static deserialize(e){if(e)return new bt({total:G(e.total),position:G(e.position)})}serialize(){const e={};return this.total!==void 0&&(e.total=this.total),this.position!==void 0&&(e.position=this.position),e}}class vt{constructor(e){this.total=e.total,this.available=e.available}static deserialize(e){if(e)return new vt({total:G(e.total),available:G(e.available)})}serialize(){const e={};return this.total!==void 0&&(e.total=this.total),this.available!==void 0&&(e.available=this.available),e}}class wt{constructor(e){this.state=e.state,this.since=e.since,this.until=e.until}static deserialize(e){if(e&&e.state)return new wt({state:e.state,since:Pn(e.since),until:Pn(e.until)})}serialize(){const e={state:this.state};return this.since!==void 0&&(e.since=this.since.toISOString()),this.until!==void 0&&(e.until=this.until.toISOString()),e}}X.prototype.getNumberOfItems=function(){return G(this.otherProperties.numberOfItems)},X.prototype.getPrice=function(){return St.deserialize(this.otherProperties.price)},X.prototype.getIndirectAcquisitions=function(){const r=this.otherProperties.indirectAcquisition;if(r&&Array.isArray(r))return r.map(e=>ze.deserialize(e)).filter(e=>e!==void 0)},X.prototype.getHolds=function(){return bt.deserialize(this.otherProperties.holds)},X.prototype.getCopies=function(){return vt.deserialize(this.otherProperties.copies)},X.prototype.getAvailability=function(){return wt.deserialize(this.otherProperties.availability)},X.prototype.getAuthenticate=function(){return V.deserialize(this.otherProperties.authenticate)};const ao="CssSelectorGenerator";function En(r="unknown problem",...e){console.warn(`${ao}: ${r}`,...e)}function so(r){return r instanceof RegExp}function lo(r){return r.replace(/[|\\{}()[\]^$+?.]/g,"\\$&").replace(/\*/g,".+")}function co(r){const e=r.map(t=>{if(so(t))return n=>t.test(n);if(typeof t=="function")return n=>{const i=t(n);return typeof i!="boolean"?(En("pattern matcher function invalid","Provided pattern matching function does not return boolean. It's result will be ignored.",t),!1):i};if(typeof t=="string"){const n=new RegExp("^"+lo(t)+"$");return i=>n.test(i)}return En("pattern matcher invalid","Pattern matching only accepts strings, regular expressions and/or functions. This item is invalid and will be ignored.",t),()=>!1});return t=>e.some(n=>n(t))}co(["class","id","ng-*"]);const ho=Math.pow(2,32),xn=()=>Math.round(Math.random()*ho).toString(36),Rt=()=>`${Math.round(performance.now())}-${xn()}-${xn()}`,fe=1;class uo{constructor(e){this.destination=null,this.registrar=new Map,this.origin="",this.channelId="",this.receiver=this.receive.bind(this),this.preLog=[],this.wnd=e,e.addEventListener("message",this.receiver)}receive(e){if(e.source===null)throw Error("Event source is null");if(typeof e.data!="object")return;const t=e.data;if(!(!("_readium"in t)||!t._readium||t._readium<=0)){if(t.key==="_ping"){if(!this.destination){if(this.destination=e.source,this.origin=e.origin,this.channelId=t._channel,t._readium!==fe){t._readium>fe?this.send("error",`received comms version ${t._readium} higher than ${fe}`):this.send("error",`received comms version ${t._readium} lower than ${fe}`),this.destination=null,this.origin="",this.channelId="";return}this.send("_pong",void 0),this.preLog.forEach(n=>this.send("log",n)),this.preLog=[]}return}else if(this.channelId){if(t._channel!==this.channelId||e.origin!==this.origin)return}else return;this.handle(t)}}handle(e){const t=this.registrar.get(e.key);if(!t||t.length===0){e.strict&&this.send("_unhandled",e);return}t.forEach(n=>n.cb(e.data,i=>{this.send("_ack",i,e.id)}))}register(e,t,n){Array.isArray(e)||(e=[e]),e.forEach(i=>{const o=this.registrar.get(i);if(o&&o.length>=0){if(o.find(s=>s.module===t))throw new Error(`Trying to register another callback for combination of event ${i} and module ${t}`);o.push({cb:n,module:t}),this.registrar.set(i,o)}else this.registrar.set(i,[{cb:n,module:t}])})}unregister(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{const i=this.registrar.get(n);!i||i.length===0||i.splice(i.findIndex(o=>o.module===t),1)})}unregisterAll(e){this.registrar.forEach((t,n)=>this.registrar.set(n,t.filter(i=>i.module!==e)))}log(...e){this.destination?this.send("log",e):this.preLog.push(e)}get ready(){return!!this.destination}destroy(){this.destination=null,this.channelId="",this.preLog=[],this.registrar.clear(),this.wnd.removeEventListener("message",this.receiver)}send(e,t,n=void 0,i=[]){if(!this.destination)throw Error("Attempted to send comms message before destination has been initialized");const o={_readium:fe,_channel:this.channelId,id:n??Rt(),key:e,data:t};try{this.destination.postMessage(o,{targetOrigin:this.origin,transfer:i})}catch(a){if(i.length>0)throw a;this.destination.postMessage(o,this.origin,i)}}}class ye{}function Fn(r){return r.split("").reverse().join("")}function mo(r,e,t){const n=Fn(e);return t.map(i=>{const o=Math.max(0,i.end-e.length-i.errors),a=Fn(r.slice(o,i.end));return{start:Ln(a,n,i.errors).reduce((l,c)=>i.end-c.end<l?i.end-c.end:l,i.end),end:i.end,errors:i.errors}})}function Pt(r){return(r|-r)>>31&1}function zn(r,e,t,n){let i=r.P[t],o=r.M[t];const a=n>>>31,s=e[t]|a,l=s|o,c=(s&i)+i^i|s;let h=o|~(c|i),u=i&c;const m=Pt(h&r.lastRowMask[t])-Pt(u&r.lastRowMask[t]);return h<<=1,u<<=1,u|=a,h|=Pt(n)-a,i=u|~(l|h),o=h&l,r.P[t]=i,r.M[t]=o,m}function Ln(r,e,t){if(e.length===0)return[];t=Math.min(t,e.length);const n=[],i=32,o=Math.ceil(e.length/i)-1,a={P:new Uint32Array(o+1),M:new Uint32Array(o+1),lastRowMask:new Uint32Array(o+1)};a.lastRowMask.fill(1<<31),a.lastRowMask[o]=1<<(e.length-1)%i;const s=new Uint32Array(o+1),l=new Map,c=[];for(let m=0;m<256;m++)c.push(s);for(let m=0;m<e.length;m+=1){const f=e.charCodeAt(m);if(l.has(f))continue;const d=new Uint32Array(o+1);l.set(f,d),f<c.length&&(c[f]=d);for(let p=0;p<=o;p+=1){d[p]=0;for(let b=0;b<i;b+=1){const P=p*i+b;if(P>=e.length)continue;e.charCodeAt(P)===f&&(d[p]|=1<<b)}}}let h=Math.max(0,Math.ceil(t/i)-1);const u=new Uint32Array(o+1);for(let m=0;m<=h;m+=1)u[m]=(m+1)*i;u[o]=e.length;for(let m=0;m<=h;m+=1)a.P[m]=-1,a.M[m]=0;for(let m=0;m<r.length;m+=1){const f=r.charCodeAt(m);let d;f<c.length?d=c[f]:(d=l.get(f),typeof d>"u"&&(d=s));let p=0;for(let b=0;b<=h;b+=1)p=zn(a,d,b,p),u[b]+=p;if(u[h]-p<=t&&h<o&&(d[h+1]&1||p<0)){h+=1,a.P[h]=-1,a.M[h]=0;let b;if(h===o){const P=e.length%i;b=P===0?i:P}else b=i;u[h]=u[h-1]+b-p+zn(a,d,h,p)}else for(;h>0&&u[h]>=t+i;)h-=1;h===o&&u[h]<=t&&(u[h]<t&&n.splice(0,n.length),n.push({start:-1,end:m+1,errors:u[h]}),t=u[h])}return n}function po(r,e,t){const n=Ln(r,e,t);return mo(r,e,n)}function On(r,e,t){let n=0;const i=[];for(;n!==-1;)n=r.indexOf(e,n),n!==-1&&(i.push({start:n,end:n+e.length,errors:0}),n+=1);return i.length>0?i:po(r,e,t)}function An(r,e){return e.length===0||r.length===0?0:1-On(r,e,e.length)[0].errors/e.length}function go(r,e,t={}){if(e.length===0)return null;const n=Math.min(256,e.length/2),i=On(r,e,n);if(i.length===0)return null;const o=s=>{const m=1-s.errors/e.length,f=t.prefix?An(r.slice(Math.max(0,s.start-t.prefix.length),s.start),t.prefix):1,d=t.suffix?An(r.slice(s.end,s.end+t.suffix.length),t.suffix):1;let p=1;return typeof t.hint=="number"&&(p=1-Math.abs(s.start-t.hint)/r.length),(50*m+20*f+20*d+2*p)/92},a=i.map(s=>({start:s.start,end:s.end,score:o(s)}));return a.sort((s,l)=>l.score-s.score),a[0]}function Ct(r,e,t){const n=t===1?e:e-1;if(r.charAt(n).trim()!=="")return e;let i,o;if(t===2?(i=r.substring(0,e),o=i.trimEnd()):(i=r.substring(e),o=i.trimStart()),!o.length)return-1;const a=i.length-o.length;return t===2?e-a:e+a}function Un(r,e){const t=r.commonAncestorContainer.ownerDocument.createNodeIterator(r.commonAncestorContainer,NodeFilter.SHOW_TEXT),n=e===1?r.startContainer:r.endContainer,i=e===1?r.endContainer:r.startContainer;let o=t.nextNode();for(;o&&o!==n;)o=t.nextNode();e===2&&(o=t.previousNode());let a=-1;const s=()=>{if(o=e===1?t.nextNode():t.previousNode(),o){const l=o.textContent,c=e===1?0:l.length;a=Ct(l,c,e)}};for(;o&&a===-1&&o!==i;)s();if(o&&a>=0)return{node:o,offset:a};throw new RangeError("No text nodes with non-whitespace text found in range")}function fo(r){if(!r.toString().trim().length)throw new RangeError("Range contains no non-whitespace text");if(r.startContainer.nodeType!==Node.TEXT_NODE)throw new RangeError("Range startContainer is not a text node");if(r.endContainer.nodeType!==Node.TEXT_NODE)throw new RangeError("Range endContainer is not a text node");const e=r.cloneRange();let t=!1,n=!1;const i={start:Ct(r.startContainer.textContent,r.startOffset,1),end:Ct(r.endContainer.textContent,r.endOffset,2)};if(i.start>=0&&(e.setStart(r.startContainer,i.start),t=!0),i.end>0&&(e.setEnd(r.endContainer,i.end),n=!0),t&&n)return e;if(!t){const{node:o,offset:a}=Un(e,1);o&&a>=0&&e.setStart(o,a)}if(!n){const{node:o,offset:a}=Un(e,2);o&&a>0&&e.setEnd(o,a)}return e}function Tn(r){switch(r.nodeType){case Node.ELEMENT_NODE:case Node.TEXT_NODE:return r.textContent?.length??0;default:return 0}}function Nn(r){let e=r.previousSibling,t=0;for(;e;)t+=Tn(e),e=e.previousSibling;return t}function Mn(r,...e){let t=e.shift();const n=r.ownerDocument.createNodeIterator(r,NodeFilter.SHOW_TEXT),i=[];let o=n.nextNode(),a,s=0;for(;t!==void 0&&o;)a=o,s+a.data.length>t?(i.push({node:a,offset:t-s}),t=e.shift()):(o=n.nextNode(),s+=a.data.length);for(;t!==void 0&&a&&s===t;)i.push({node:a,offset:a.data.length}),t=e.shift();if(t!==void 0)throw new RangeError("Offset exceeds text length");return i}class q{constructor(e,t){if(t<0)throw new Error("Offset is invalid");this.element=e,this.offset=t}relativeTo(e){if(!e.contains(this.element))throw new Error("Parent is not an ancestor of current element");let t=this.element,n=this.offset;for(;t!==e;)n+=Nn(t),t=t.parentElement;return new q(t,n)}resolve(e={}){try{return Mn(this.element,this.offset)[0]}catch(t){if(this.offset===0&&e.direction!==void 0){const n=document.createTreeWalker(this.element.getRootNode(),NodeFilter.SHOW_TEXT);n.currentNode=this.element;const i=e.direction===1,o=i?n.nextNode():n.previousNode();if(!o)throw t;return{node:o,offset:i?0:o.data.length}}else throw t}}static fromCharOffset(e,t){switch(e.nodeType){case Node.TEXT_NODE:return q.fromPoint(e,t);case Node.ELEMENT_NODE:return new q(e,t);default:throw new Error("Node is not an element or text node")}}static fromPoint(e,t){switch(e.nodeType){case Node.TEXT_NODE:{if(t<0||t>e.data.length)throw new Error("Text node offset is out of range");if(!e.parentElement)throw new Error("Text node has no parent");const n=Nn(e)+t;return new q(e.parentElement,n)}case Node.ELEMENT_NODE:{if(t<0||t>e.childNodes.length)throw new Error("Child node offset is out of range");let n=0;for(let i=0;i<t;i++)n+=Tn(e.childNodes[i]);return new q(e,n)}default:throw new Error("Point is not in an element or text node")}}}class re{constructor(e,t){this.start=e,this.end=t}relativeTo(e){return new re(this.start.relativeTo(e),this.end.relativeTo(e))}toRange(){let e,t;this.start.element===this.end.element&&this.start.offset<=this.end.offset?[e,t]=Mn(this.start.element,this.start.offset,this.end.offset):(e=this.start.resolve({direction:1}),t=this.end.resolve({direction:2}));const n=new Range;return n.setStart(e.node,e.offset),n.setEnd(t.node,t.offset),n}static fromRange(e){const t=q.fromPoint(e.startContainer,e.startOffset),n=q.fromPoint(e.endContainer,e.endOffset);return new re(t,n)}static fromOffsets(e,t,n){return new re(new q(e,t),new q(e,n))}static trimmedRange(e){return fo(re.fromRange(e).toRange())}}class nt{constructor(e,t,n){this.root=e,this.start=t,this.end=n}static fromRange(e,t){const n=re.fromRange(t).relativeTo(e);return new nt(e,n.start.offset,n.end.offset)}static fromSelector(e,t){return new nt(e,t.start,t.end)}toSelector(){return{type:"TextPositionSelector",start:this.start,end:this.end}}toRange(){return re.fromOffsets(this.root,this.start,this.end).toRange()}}class it{constructor(e,t,n={}){this.root=e,this.exact=t,this.context=n}static fromRange(e,t){const n=e.textContent,i=re.fromRange(t).relativeTo(e),o=i.start.offset,a=i.end.offset,s=32;return new it(e,n.slice(o,a),{prefix:n.slice(Math.max(0,o-s),o),suffix:n.slice(a,Math.min(n.length,a+s))})}static fromSelector(e,t){const{prefix:n,suffix:i}=t;return new it(e,t.exact,{prefix:n,suffix:i})}toSelector(){return{type:"TextQuoteSelector",exact:this.exact,prefix:this.context.prefix,suffix:this.context.suffix}}toRange(e={}){return this.toPositionAnchor(e).toRange()}toPositionAnchor(e={}){const t=this.root.textContent,n=go(t,this.exact,{...this.context,hint:e.hint});if(!n)throw new Error("Quote not found");return new nt(this.root,n.start,n.end)}}function yo(r){const e=r.tagName.toUpperCase();return e==="IMG"||e==="VIDEO"||e==="AUDIO"||e==="IFRAME"||e==="OBJECT"||e==="EMBED"||e==="CANVAS"}function Le(r,e){try{const t=e.locations,n=e.text;if(n&&n.highlight){let i;t&&t.getCssSelector()&&(i=r.querySelector(t.getCssSelector())),i||(i=r.body);const o=new it(i,n.highlight,{prefix:n.before,suffix:n.after});try{return o.toRange()}catch{return console.warn("Quote not found:",o),null}}if(t){let i=null;if(!i&&t.getCssSelector()&&(i=r.querySelector(t.getCssSelector())),!i&&t.fragments){for(const o of t.fragments)if(i=r.getElementById(o),i)break}if(i){const o=r.createRange();return i.childNodes.length===0||yo(i)?(o.selectNode(i),o):(o.setStartBefore(i),o.setEndAfter(i),o)}}}catch(t){console.error(t)}return null}function _o(r,e){let t=r.getClientRects();t.length||r.commonAncestorContainer.nodeType===Node.ELEMENT_NODE&&(t=r.commonAncestorContainer.getClientRects());const n=1,i=[];for(const c of t)i.push({bottom:c.bottom,height:c.height,left:c.left,right:c.right,top:c.top,width:c.width});const o=In(i,n),a=bo(o,n),s=Hn(a),l=4;for(let c=s.length-1;c>=0;c--){const h=s[c];if(!(h.width*h.height>l))if(s.length>1)s.splice(c,1);else break}return s}function In(r,e,t){for(let n=0;n<r.length;n++)for(let i=n+1;i<r.length;i++){const o=r[n],a=r[i];if(o===a)continue;const s=$(o.top,a.top,e)&&$(o.bottom,a.bottom,e),l=$(o.left,a.left,e)&&$(o.right,a.right,e);if(s&&!l&&Wn(o,a,e)){const u=r.filter(f=>f!==o&&f!==a),m=So(o,a);return u.push(m),In(u,e)}}return r}function So(r,e){const t=Math.min(r.left,e.left),n=Math.max(r.right,e.right),i=Math.min(r.top,e.top),o=Math.max(r.bottom,e.bottom);return{bottom:o,height:o-i,left:t,right:n,top:i,width:n-t}}function bo(r,e){const t=new Set(r);for(const n of r){if(!(n.width>1&&n.height>1)){t.delete(n);continue}for(const o of r)if(n!==o&&t.has(o)&&vo(o,n,e)){t.delete(n);break}}return Array.from(t)}function vo(r,e,t){return ot(r,e.left,e.top,t)&&ot(r,e.right,e.top,t)&&ot(r,e.left,e.bottom,t)&&ot(r,e.right,e.bottom,t)}function ot(r,e,t,n){return(r.left<e||$(r.left,e,n))&&(r.right>e||$(r.right,e,n))&&(r.top<t||$(r.top,t,n))&&(r.bottom>t||$(r.bottom,t,n))}function Hn(r){for(let e=0;e<r.length;e++)for(let t=e+1;t<r.length;t++){const n=r[e],i=r[t];if(n!==i&&Wn(n,i,-1)){let o=[],a;const s=Dn(n,i);if(s.length===1)o=s,a=n;else{const c=Dn(i,n);s.length<c.length?(o=s,a=n):(o=c,a=i)}const l=r.filter(c=>c!==a);return Array.prototype.push.apply(l,o),Hn(l)}}return r}function Dn(r,e){const t=wo(e,r);if(t.height===0||t.width===0)return[r];const n=[];{const i={bottom:r.bottom,height:0,left:r.left,right:t.left,top:r.top,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}{const i={bottom:t.top,height:0,left:t.left,right:t.right,top:r.top,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}{const i={bottom:r.bottom,height:0,left:t.left,right:t.right,top:t.bottom,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}{const i={bottom:r.bottom,height:0,left:t.right,right:r.right,top:r.top,width:0};i.width=i.right-i.left,i.height=i.bottom-i.top,i.height!==0&&i.width!==0&&n.push(i)}return n}function wo(r,e){const t=Math.max(r.left,e.left),n=Math.min(r.right,e.right),i=Math.max(r.top,e.top),o=Math.min(r.bottom,e.bottom);return{bottom:o,height:Math.max(0,o-i),left:t,right:n,top:i,width:Math.max(0,n-t)}}function Wn(r,e,t){return(r.left<e.right||t>=0&&$(r.left,e.right,t))&&(e.left<r.right||t>=0&&$(e.left,r.right,t))&&(r.top<e.bottom||t>=0&&$(r.top,e.bottom,t))&&(e.top<r.bottom||t>=0&&$(e.top,r.bottom,t))}function $(r,e,t){return Math.abs(r-e)<=t}function kt(r){const e={},t=r.document.documentElement.style;for(const n in r.document.documentElement.style)Object.hasOwn(t,n)&&!Number.isNaN(Number.parseInt(n))&&(e[t[n]]=t.getPropertyValue(t[n]));return e}function Bn(r,e){const t=kt(r);Object.keys(t).forEach(n=>{e.hasOwnProperty(n)||rt(r,n)}),Object.entries(e).forEach(([n,i])=>{t[n]!==i&&Oe(r,n,i)})}function Et(r,e){return r.document.documentElement.style.getPropertyValue(e)}function Oe(r,e,t){r.document.documentElement.style.setProperty(e,t)}function rt(r,e){r.document.documentElement.style.removeProperty(e)}let at=null,xt=null,Ae=0;const _e={r:255,g:255,b:255,a:1},Se=new Map,Ro=()=>{if(!at)if(typeof OffscreenCanvas<"u")at=new OffscreenCanvas(5,5),xt=at.getContext("2d",{willReadFrequently:!0,desynchronized:!0});else{const r=document.createElement("canvas");r.width=5,r.height=5,at=r,xt=r.getContext("2d",{willReadFrequently:!0,desynchronized:!0})}return xt},Po=r=>{if(!r)return!0;const e=r.trim().toLowerCase();return e.startsWith("var(")||["transparent","currentcolor","inherit","initial","revert","unset","revert-layer"].includes(e)?!0:["linear-gradient","radial-gradient","conic-gradient","repeating-linear-gradient","repeating-radial-gradient","repeating-conic-gradient"].some(i=>e.includes(i))},st=(r,e)=>{console.warn(`[Decorator] Could not parse color: "${r}". ${e} Falling back to ${JSON.stringify(_e)} to compute contrast. Please use a CSS color value that can be computed to RGB(A).`)},Ft=(r,e=null)=>{const t=e?`${r}|${e}`:r,n=Se.get(t);if(n!==void 0)return n??_e;if(Po(r))return st(r,"Unsupported color format or special value."),Se.set(t,null),_e;const i=Ro();if(!i)return st(r,"Could not get canvas context."),Se.set(t,null),_e;try{Ae===0&&i.clearRect(0,0,5,5);const o=Ae%5,a=Math.floor(Ae/5);i.clearRect(o,a,1,1),e&&(i.fillStyle=e,i.fillRect(o,a,1,1)),i.fillStyle=r,i.fillRect(o,a,1,1);const s=i.getImageData(o,a,1,1);Ae=(Ae+1)%25;const[l,c,h,u]=s.data;if(u===0)return st(r,"Fully transparent color."),Se.set(t,null),_e;const m={r:l,g:c,b:h,a:u/255};return Se.set(t,m),m}catch(o){return st(r,`Error: ${o instanceof Error?o.message:String(o)}`),Se.set(t,null),_e}},zt=r=>{const e=r/255;return e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)},jn=r=>{const e=zt(r.r),t=zt(r.g),n=zt(r.b);return .2126*e+.7152*t+.0722*n},Gn=(r,e)=>{const t=typeof r=="string"?Ft(r):r,n=typeof e=="string"?Ft(e):e,i=jn(t),o=jn(n),a=Math.max(i,o),s=Math.min(i,o);return(a+.05)/(s+.05)},Lt=(r,e=null)=>{const t=Ft(r,e),n=Gn(t,{r:255,g:255,b:255,a:1}),i=Gn(t,{r:0,g:0,b:0,a:1});return n>i},Co=(r,e=null)=>Lt(r,e)?"white":"black",Vn="#FFFF00",ko=()=>"Highlight"in window,$n=["IMG","IMAGE","AUDIO","VIDEO","SVG"];class Eo{constructor(e,t,n,i){this.wnd=e,this.comms=t,this.id=n,this.name=i,this.items=[],this.lastItemId=0,this.container=void 0,this.activateable=!1,this.experimentalHighlights=!1,this.currentRender=0,ko()&&(this.experimentalHighlights=!0,this.notTextFlag=new Map)}get activeable(){return this.activateable}set activeable(e){this.activateable=e}add(e){const t=`${this.id}-${this.lastItemId++}`,n=Le(this.wnd.document,e.locator);if(!n){this.comms.log("Can't locate DOM range for decoration",e);return}const i=n.commonAncestorContainer;i.nodeType!==Node.TEXT_NODE&&this.experimentalHighlights&&($n.includes(i.nodeName.toUpperCase())&&this.notTextFlag?.set(t,!0),n.cloneContents().querySelector($n.join(", ").toLowerCase())&&this.notTextFlag?.set(t,!0),(i.textContent?.trim()||"").length===0&&this.notTextFlag?.set(t,!0));const o={decoration:e,id:t,range:n};this.items.push(o),this.layout(o),this.renderLayout([o])}remove(e){const t=this.items.findIndex(i=>i.decoration.id===e);if(t<0)return;const n=this.items[t];this.items.splice(t,1),n.clickableElements=void 0,n.container&&(n.container.remove(),n.container=void 0),this.experimentalHighlights&&!this.notTextFlag?.has(n.id)&&this.wnd.CSS.highlights.get(this.id)?.delete(n.range),this.notTextFlag?.delete(n.id)}update(e){this.remove(e.id),this.add(e)}clear(){this.clearContainer(),this.items.length=0,this.notTextFlag?.clear()}requestLayout(){this.wnd.cancelAnimationFrame(this.currentRender),this.clearContainer(),this.items.forEach(e=>this.layout(e)),this.renderLayout(this.items)}experimentalLayout(e){const[t,n]=this.requireContainer(!0);n.add(e.range);const i=Et(this.wnd,"--USER__backgroundColor")||this.wnd.getComputedStyle(this.wnd.document.documentElement).getPropertyValue("background-color"),o=e.decoration?.style?.tint??Vn;t.innerHTML=`
|
|
2
2
|
::highlight(${this.id}) {
|
|
3
3
|
color: ${Co(o,i)};
|
|
4
4
|
background-color: ${o};
|
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
style="${[`background-color: ${e.decoration?.style?.tint??Vn} !important`,`mix-blend-mode: ${m?"exclusion":"multiply"} !important`,"opacity: 1 !important","box-sizing: border-box !important"].join("; ")}"
|
|
10
10
|
>
|
|
11
11
|
</div>
|
|
12
|
-
`.trim();const f=u.content.firstElementChild;if(e.decoration?.style?.layout==="bounds"){const d=f.cloneNode(!0);d.style.setProperty("pointer-events","none"),c(d,h,h),t.append(d)}else{let d=_o(e.range);d=d.sort((p,b)=>p.top<b.top?-1:p.top>b.top?1:0);for(let p of d){const b=f.cloneNode(!0);b.style.setProperty("pointer-events","none"),c(b,p,h),t.append(b)}}e.container=t,e.clickableElements=Array.from(t.querySelectorAll("[data-activable='1']")),e.clickableElements.length||(e.clickableElements=Array.from(t.children))}renderLayout(e){this.wnd.cancelAnimationFrame(this.currentRender),this.currentRender=this.wnd.requestAnimationFrame(()=>{if(e=e.filter(n=>!this.experimentalHighlights||!!this.notTextFlag?.has(n.id)),!e||e.length===0)return;this.requireContainer().append(...e.map(n=>n.container).filter(n=>!!n))})}requireContainer(e=!1){if(e){let t;this.wnd.document.getElementById(`${this.id}-style`)?t=this.wnd.document.getElementById(`${this.id}-style`):(t=this.wnd.document.createElement("style"),t.dataset.readium="true",t.id=`${this.id}-style`,this.wnd.document.head.appendChild(t));let n;return this.wnd.CSS.highlights.has(this.id)?n=this.wnd.CSS.highlights.get(this.id):(n=new this.wnd.Highlight,this.wnd.CSS.highlights.set(this.id,n)),[t,n]}return this.container||(this.container=this.wnd.document.createElement("div"),this.container.setAttribute("id",this.id),this.container.dataset.group=this.name,this.container.dataset.readium="true",this.container.style.setProperty("pointer-events","none"),this.container.style.display="contents",this.wnd.document.body.append(this.container)),this.container}getCurrentDarkMode(){return Et(this.wnd,"--USER__appearance")==="readium-night-on"||Lt(Et(this.wnd,"--USER__backgroundColor"))||Lt(this.wnd.getComputedStyle(this.wnd.document.documentElement).getPropertyValue("background-color"))}clearContainer(){this.experimentalHighlights&&this.wnd.CSS.highlights.delete(this.id),this.container&&(this.container.remove(),this.container=void 0)}}const Ye=class Ye extends
|
|
12
|
+
`.trim();const f=u.content.firstElementChild;if(e.decoration?.style?.layout==="bounds"){const d=f.cloneNode(!0);d.style.setProperty("pointer-events","none"),c(d,h,h),t.append(d)}else{let d=_o(e.range);d=d.sort((p,b)=>p.top<b.top?-1:p.top>b.top?1:0);for(let p of d){const b=f.cloneNode(!0);b.style.setProperty("pointer-events","none"),c(b,p,h),t.append(b)}}e.container=t,e.clickableElements=Array.from(t.querySelectorAll("[data-activable='1']")),e.clickableElements.length||(e.clickableElements=Array.from(t.children))}renderLayout(e){this.wnd.cancelAnimationFrame(this.currentRender),this.currentRender=this.wnd.requestAnimationFrame(()=>{if(e=e.filter(n=>!this.experimentalHighlights||!!this.notTextFlag?.has(n.id)),!e||e.length===0)return;this.requireContainer().append(...e.map(n=>n.container).filter(n=>!!n))})}requireContainer(e=!1){if(e){let t;this.wnd.document.getElementById(`${this.id}-style`)?t=this.wnd.document.getElementById(`${this.id}-style`):(t=this.wnd.document.createElement("style"),t.dataset.readium="true",t.id=`${this.id}-style`,this.wnd.document.head.appendChild(t));let n;return this.wnd.CSS.highlights.has(this.id)?n=this.wnd.CSS.highlights.get(this.id):(n=new this.wnd.Highlight,this.wnd.CSS.highlights.set(this.id,n)),[t,n]}return this.container||(this.container=this.wnd.document.createElement("div"),this.container.setAttribute("id",this.id),this.container.dataset.group=this.name,this.container.dataset.readium="true",this.container.style.setProperty("pointer-events","none"),this.container.style.display="contents",this.wnd.document.body.append(this.container)),this.container}getCurrentDarkMode(){return Et(this.wnd,"--USER__appearance")==="readium-night-on"||Lt(Et(this.wnd,"--USER__backgroundColor"))||Lt(this.wnd.getComputedStyle(this.wnd.document.documentElement).getPropertyValue("background-color"))}clearContainer(){this.experimentalHighlights&&this.wnd.CSS.highlights.delete(this.id),this.container&&(this.container.remove(),this.container=void 0)}}const Ye=class Ye extends ye{constructor(){super(...arguments),this.resizeFrame=0,this.lastGroupId=0,this.groups=new Map,this.handleResizer=this.handleResize.bind(this)}cleanup(){this.groups.forEach(e=>e.clear()),this.groups.clear()}updateHighlightStyles(){this.groups.forEach(e=>{e.requestLayout()})}extractCustomProperty(e,t){if(!e)return null;const n=e.match(new RegExp(`${t}:\\s*([^;]+)`));return n?n[1].trim():null}handleResize(){this.wnd.clearTimeout(this.resizeFrame),this.resizeFrame=this.wnd.setTimeout(()=>{this.groups.forEach(e=>{e.experimentalHighlights||e.requestLayout()})},50)}mount(e,t){return this.wnd=e,t.register("decorate",Ye.moduleName,(n,i)=>{const o=n;o.decoration&&o.decoration.locator&&(o.decoration.locator=N.deserialize(o.decoration.locator)),this.groups.has(o.group)||this.groups.set(o.group,new Eo(e,t,`readium-decoration-${this.lastGroupId++}`,o.group));const a=this.groups.get(o.group);switch(o.action){case"add":a?.add(o.decoration);break;case"remove":a?.remove(o.decoration.id);break;case"clear":a?.clear();break;case"update":a?.update(o.decoration);break}i(!0)}),this.resizeObserver=new ResizeObserver(()=>e.requestAnimationFrame(()=>this.handleResize())),this.resizeObserver.observe(e.document.body),e.addEventListener("orientationchange",this.handleResizer),e.addEventListener("resize",this.handleResizer),this.backgroundObserver=new MutationObserver(n=>{n.some(o=>{if(o.type==="attributes"&&o.attributeName==="style"){const a=o.target,s=o.oldValue,l=a.getAttribute("style"),c=this.extractCustomProperty(s,"--USER__appearance"),h=this.extractCustomProperty(l,"--USER__appearance"),u=this.extractCustomProperty(s,"--USER__backgroundColor"),m=this.extractCustomProperty(l,"--USER__backgroundColor");return c!==h||u!==m}return!1})&&this.updateHighlightStyles()}),this.backgroundObserver.observe(e.document.documentElement,{attributes:!0,attributeFilter:["style"],attributeOldValue:!0,subtree:!0}),t.log("Decorator Mounted"),!0}unmount(e,t){return e.removeEventListener("orientationchange",this.handleResizer),e.removeEventListener("resize",this.handleResizer),t.unregisterAll(Ye.moduleName),this.resizeObserver.disconnect(),this.backgroundObserver.disconnect(),this.cleanup(),t.log("Decorator Unmounted"),!0}};Ye.moduleName="decorator";let Ot=Ye;const Kn="readium-snapper-style",qe=class qe extends ye{constructor(){super(...arguments),this.protected=!1}buildStyles(){return`
|
|
13
13
|
html, body {
|
|
14
14
|
touch-action: manipulation;
|
|
15
15
|
user-select: ${this.protected?"none":"auto"};
|
|
16
|
-
}`}mount(e,t){const n=e.document.createElement("style");return n.dataset.readium="true",n.id=Kn,n.textContent=this.buildStyles(),e.document.head.appendChild(n),t.register("protect",qe.moduleName,(i,o)=>{this.protected=!0,n.textContent=this.buildStyles(),o(!0)}),t.register("unprotect",qe.moduleName,(i,o)=>{this.protected=!1,n.textContent=this.buildStyles(),o(!0)}),t.log("Snapper Mounted"),!0}unmount(e,t){return e.document.getElementById(Kn)?.remove(),t.log("Snapper Unmounted"),!0}};qe.moduleName="snapper";let Se=qe;function xo(r){return(r.document.documentElement.dir||r.document.body.dir).toLowerCase()==="rtl"}function Fo(r){return(r.getComputedStyle(r.document.documentElement).writingMode||r.getComputedStyle(r.document.body).writingMode)==="vertical-lr"}function Xn(r){return parseInt(r.getComputedStyle(r.document.documentElement).getPropertyValue("column-count"))}function Yn(r){const e=getComputedStyle(r),t=parseFloat(e.paddingTop||"0"),n=parseFloat(e.paddingBottom||"0");return r.clientHeight-t-n}function qn(r){const e=Xn(r);if(!e)return!1;const t=r.document.querySelectorAll("div[id^='readium-virtual-page']");for(const c of t)c.remove();const n=t.length,i=r.document.scrollingElement.scrollWidth,o=r.visualViewport.width,s=Math.round(i/o*e)%e,l=e===1||s===0?0:e-s;if(l>0)for(let c=0;c<l;c++){const h=r.document.createElement("div");h.setAttribute("id",`readium-virtual-page-${c}`),h.dataset.readium="true",CSS.supports("break-before","column")?h.style.breakBefore="column":(CSS.supports("break-inside","avoid-column")&&(h.style.breakInside="avoid-column"),h.style.height=Yn(r.document.documentElement)+"px"),h.innerHTML="​",r.document.body.appendChild(h)}return n!==l}function At(r){const e=r.document.createElement("style");e.appendChild(r.document.createTextNode("*{}")),r.document.body.appendChild(e),r.document.body.removeChild(e)}function zo(r){return r<.5?2*r*r:-1+(4-2*r)*r}function z(r){const e=r.getSelection();e&&e.removeAllRanges()}const Lo=["a","area","audio","button","canvas","details","input","label","option","select","submit","textarea","video"],Oo=["dialog","radiogroup","radio","menu","menuitem"];function Ut(r){return Ao(r)?null:Jn(r)?r:r.parentElement?Ut(r.parentElement):null}function Ao(r){return r?r.closest("[inert]")!==null||r.hasAttribute("disabled"):!0}function Jn(r){return r?r.role&&Oo.includes(r.role)||r.tabIndex>=0?!0:Lo.includes(r.nodeName.toLowerCase())||r.hasAttribute("contenteditable")&&r.getAttribute("contenteditable")?.toLowerCase()!=="false":!1}function lt(r,e){const t=Zn(r,r.document.body,e),n=r._readium_cssSelectorGenerator.getCssSelector(t,{selectors:["tag","id","class","nthchild","nthoftype","attribute"]});return new N({href:"#",type:"application/xhtml+xml",locations:new C({otherLocations:new Map([["cssSelector",n]])}),text:new oe({highlight:t.textContent||void 0})})}function Zn(r,e,t){for(var n=0;n<e.children.length;n++){const i=e.children[n];if(!No(i)&&Uo(r,i,t))return To(r,i)?i:Zn(r,i,t)}return e}function Uo(r,e,t){if(e===document.body||e===document.documentElement)return!0;if(!document||!document.documentElement||!document.body)return!1;const n=e.getBoundingClientRect();return t?n.bottom>0&&n.top<r.innerHeight:n.right>0&&n.left<r.innerWidth}function To(r,e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=r.innerHeight&&t.right<=r.innerWidth}function No(r){const e=getComputedStyle(r);if(e){const t=e.getPropertyValue("display");if(t!="block"&&t!="list-item"||e.getPropertyValue("opacity")==="0")return!0}return!1}const Mo={maxVelocity:200,minVariance:.01,historySize:20,minDirectionChanges:.2,maxConsistentScrolls:15},Tt={maxVelocity:200,minVariance:1e-5,historySize:100,minDirectionChanges:.1,maxConsistentScrolls:20},Qn={maxSelectionsPerSecond:500,minVariance:50,historySize:20},Io={enabled:!0,maxSelectionPercent:.1,minThreshold:100,absoluteMaxChars:5e3,historySize:20};class ct{constructor(e={}){this.history=[],this.consistentScrollCount=0,this.options={...Mo,...e}}analyze(e,t,n){if(n<=0)return!1;const i=Math.abs(t)/n,o=Date.now();if(this.history.push({timestamp:o,direction:e,velocity:i,distance:Math.abs(t)}),this.history=this.history.filter(p=>o-p.timestamp<2e3).slice(-(this.options.historySize||20)),this.history.length<3)return!1;if(i>this.options.maxVelocity)return this.resetAfterDetection(),!0;const a=this.history.map(p=>p.velocity),s=this.history.map(p=>p.distance),l=a.reduce((p,b)=>p+b,0)/a.length,c=s.reduce((p,b)=>p+b,0)/s.length,h=a.reduce((p,b)=>p+Math.pow(b-l,2),0)/a.length,u=s.reduce((p,b)=>p+Math.pow(b-c,2),0)/s.length;if(h<this.options.minVariance&&u<c*.1){if(this.consistentScrollCount++,this.consistentScrollCount>=(this.options.maxConsistentScrolls||10))return this.resetAfterDetection(),!0}else this.consistentScrollCount=Math.max(0,this.consistentScrollCount-1);let m=0,f=this.history[0].direction;for(let p=1;p<this.history.length;p++)this.history[p].direction!==f&&(m++,f=this.history[p].direction);return m/this.history.length>(this.options.minDirectionChanges||.3)?(this.resetAfterDetection(),!0):!1}resetAfterDetection(){this.history=this.history.slice(-3),this.consistentScrollCount=0}clear(){this.history=[],this.consistentScrollCount=0}}const ei="readium-column-snapper-style",Ho=200,D=class D extends Se{constructor(){super(...arguments),this.isSnapProtectionEnabled=!1,this.patternAnalyzer=null,this.lastTurnTime=0,this.rtl=!1,this.shakeTimeout=0,this.snappingCancelled=!1,this.alreadyScrollLeft=0,this.overscroll=0,this.cachedScrollWidth=0,this.touchState=0,this.startingX=void 0,this.endingX=void 0,this.onTouchStarter=this.onTouchStart.bind(this),this.onTouchEnder=this.onTouchEnd.bind(this),this.onWidthChanger=this.onWidthChange.bind(this),this.onTouchMover=this.onTouchMove.bind(this)}doc(){return this.wnd.document.scrollingElement}scrollOffset(){const e=this.doc().scrollLeft;return e!==0?e:this.alreadyScrollLeft}snapOffset(e){const t=e+(this.rtl?-1:1);return t-t%this.wnd.innerWidth}snapNormOffset(e){const t=e+1;return t-t%this.wnd.innerWidth}normScroll(){const e=this.doc().scrollLeft||this.alreadyScrollLeft;return this.rtl?Math.abs(e):Math.max(0,this.wnd.scrollX>0?this.wnd.scrollX:e)}reportProgress(){const e=this.cachedScrollWidth,t=this.wnd.innerWidth,n=this.normScroll(),i=Math.max(1,e-t),o=Math.max(0,Math.min(1,n/i)),a=Math.max(0,Math.min(1,(n+t)/e));this.comms.send("progress",{start:o,end:a})}shake(){if(this.overscroll!==0||this.shakeTimeout!==0)return;const e=this.doc(),t=this.normScroll()<5,n=this.rtl?t?"readium-bounce-r":"readium-bounce-l":"readium-bounce-r";e.classList.add(n);const i=this.scrollOffset();this.shakeTimeout=this.wnd.setTimeout(()=>{e.classList.remove(n),this.shakeTimeout=0,this.doc().scrollLeft=i},150)}takeOverSnap(){this.snappingCancelled=!0,this.clearTouches();const e=this.doc();this.overscroll=e.style.transform?.length>12?parseFloat(e.style.transform.slice(12).split("px")[0]):0}snapCurrentOffset(e=!1,t=!1){const n=this.doc(),i=Xn(this.wnd),o=this.cachedScrollWidth-this.wnd.innerWidth,a=Math.min(Math.max(0,this.normScroll()),o),s=this.dragOffset(),l=this.rtl?-s:s,c=this.wnd.innerWidth/3*(l>0?2:1),h=Math.min(o,Math.max(0,this.snapNormOffset(a+c))),u=this.rtl?-h:h,m=this.rtl?-a:a,f=u>m?"right":"left";if(this.checkSuspiciousSnap(f,Math.abs(u-m)),e&&u!==m){this.snappingCancelled=!1;const d=(A,Q,xe,Fe)=>xe>Fe?Q:A+(Q-A)*zo(xe/Fe),p=Ho*i;let b;const P=A=>{if(this.snappingCancelled)return;b||(b=A);const Q=A-b,xe=d(this.overscroll,0,Q,p),Fe=d(m,u,Q,p);n.scrollLeft=Fe,this.overscroll!==0&&(n.style.transform=`translate3d(${-xe}px, 0px, 0px)`),Q<p?this.wnd.requestAnimationFrame(P):(this.clearTouches(),n.style.removeProperty("transform"),n.scrollLeft=u,t||this.reportProgress())};this.wnd.requestAnimationFrame(P)}else n.style.removeProperty("transform"),this.wnd.requestAnimationFrame(()=>{n.scrollLeft=u,this.clearTouches(),t||this.reportProgress()})}dragOffset(){return(this.startingX??0)-(this.endingX??0)}clearTouches(){this.startingX=void 0,this.endingX=void 0,this.overscroll=0}onTouchStart(e){switch(e.stopPropagation(),this.takeOverSnap(),e.touches.length){case 1:break;case 2:this.onTouchEnd(e);return;default:{this.onTouchEnd(e),this.comms.send("tap_more",e.touches.length);return}}this.startingX=e.touches[0].clientX,this.alreadyScrollLeft=this.doc().scrollLeft,this.touchState=1}onTouchEnd(e){if(this.touchState===2){const t=this.dragOffset(),n=this.normScroll(),i=this.cachedScrollWidth-this.wnd.innerWidth,o=this.rtl?-t:t;this.cachedScrollWidth<=this.wnd.innerWidth?(this.reportProgress(),o>5&&this.comms.send("no_more",void 0),o<-5&&this.comms.send("no_less",void 0)):n<5&&o<5?(this.alreadyScrollLeft=0,this.comms.send("no_less",void 0)):i-n<5&&o>5&&(this.alreadyScrollLeft=this.rtl?-i:i,this.comms.send("no_more",void 0)),this.snapCurrentOffset(!0),this.comms.send("swipe",t)}this.touchState=0}onWidthChange(){this.cachedScrollWidth=this.doc().scrollWidth,this.comms.ready&&this.snapCurrentOffset()}onTouchMove(e){if(this.touchState===0)return;this.touchState===1&&(this.touchState=2,z(this.wnd)),this.endingX=e.touches[0].clientX;const t=this.dragOffset(),n=this.alreadyScrollLeft+t,i=this.rtl?-(this.cachedScrollWidth-this.wnd.innerWidth):0,o=this.rtl?0:this.cachedScrollWidth-this.wnd.innerWidth;n<i?(this.overscroll=n,this.doc().style.transform=`translate3d(${-this.overscroll}px, 0px, 0px)`):n>o?(this.overscroll=n,this.doc().style.transform=`translate3d(${-n}px, 0px, 0px)`):(this.overscroll=0,this.doc().style.removeProperty("transform"),this.doc().scrollLeft=n)}enableSnapProtection(){this.patternAnalyzer||(this.patternAnalyzer=new ct({maxVelocity:this.wnd.innerWidth,minVariance:.1,historySize:5,maxConsistentScrolls:3,minDirectionChanges:.3}),this.isSnapProtectionEnabled=!0,this.comms?.log("Snap protection enabled"))}checkSuspiciousSnap(e,t){if(!this.isSnapProtectionEnabled||!this.patternAnalyzer)return;const n=Date.now(),i=n-(this.lastTurnTime||n);this.lastTurnTime=n,this.patternAnalyzer.analyze(e,t,i)&&this.comms?.send("content_protection",{type:"suspicious_snapping",timestamp:Date.now(),event:null})}mount(e,t){if(this.wnd=e,this.comms=t,this.rtl=xo(e),!super.mount(e,t))return!1;e.navigator.epubReadingSystem&&(e.navigator.epubReadingSystem.layoutStyle="paginated");const n=e.document.createElement("style");n.dataset.readium="true",n.id=ei,n.textContent=`
|
|
16
|
+
}`}mount(e,t){const n=e.document.createElement("style");return n.dataset.readium="true",n.id=Kn,n.textContent=this.buildStyles(),e.document.head.appendChild(n),t.register("protect",qe.moduleName,(i,o)=>{this.protected=!0,n.textContent=this.buildStyles(),o(!0)}),t.register("unprotect",qe.moduleName,(i,o)=>{this.protected=!1,n.textContent=this.buildStyles(),o(!0)}),t.log("Snapper Mounted"),!0}unmount(e,t){return e.document.getElementById(Kn)?.remove(),t.log("Snapper Unmounted"),!0}};qe.moduleName="snapper";let be=qe;function xo(r){return(r.document.documentElement.dir||r.document.body.dir).toLowerCase()==="rtl"}function Fo(r){return(r.getComputedStyle(r.document.documentElement).writingMode||r.getComputedStyle(r.document.body).writingMode)==="vertical-lr"}function Xn(r){return parseInt(r.getComputedStyle(r.document.documentElement).getPropertyValue("column-count"))}function Yn(r){const e=getComputedStyle(r),t=parseFloat(e.paddingTop||"0"),n=parseFloat(e.paddingBottom||"0");return r.clientHeight-t-n}function qn(r){const e=Xn(r);if(!e)return!1;const t=r.document.querySelectorAll("div[id^='readium-virtual-page']");for(const c of t)c.remove();const n=t.length,i=r.document.scrollingElement.scrollWidth,o=r.visualViewport.width,s=Math.round(i/o*e)%e,l=e===1||s===0?0:e-s;if(l>0)for(let c=0;c<l;c++){const h=r.document.createElement("div");h.setAttribute("id",`readium-virtual-page-${c}`),h.dataset.readium="true",CSS.supports("break-before","column")?h.style.breakBefore="column":(CSS.supports("break-inside","avoid-column")&&(h.style.breakInside="avoid-column"),h.style.height=Yn(r.document.documentElement)+"px"),h.innerHTML="​",r.document.body.appendChild(h)}return n!==l}function At(r){const e=r.document.createElement("style");e.appendChild(r.document.createTextNode("*{}")),r.document.body.appendChild(e),r.document.body.removeChild(e)}function zo(r){return r<.5?2*r*r:-1+(4-2*r)*r}function z(r){const e=r.getSelection();e&&e.removeAllRanges()}const Lo=["a","area","audio","button","canvas","details","input","label","option","select","submit","textarea","video"],Oo=["dialog","radiogroup","radio","menu","menuitem"];function Ut(r){return Ao(r)?null:Jn(r)?r:r.parentElement?Ut(r.parentElement):null}function Ao(r){return r?r.closest("[inert]")!==null||r.hasAttribute("disabled"):!0}function Jn(r){return r?r.role&&Oo.includes(r.role)?!0:r.tagName.toLowerCase()==="iframe"?!1:r.tabIndex>=0?!0:Lo.includes(r.nodeName.toLowerCase())||r.hasAttribute("contenteditable")&&r.getAttribute("contenteditable")?.toLowerCase()!=="false":!1}function lt(r,e){const t=Zn(r,r.document.body,e),n=r._readium_cssSelectorGenerator.getCssSelector(t,{selectors:["tag","id","class","nthchild","nthoftype","attribute"]});return new N({href:"#",type:"application/xhtml+xml",locations:new C({otherLocations:new Map([["cssSelector",n]])}),text:new oe({highlight:t.textContent||void 0})})}function Zn(r,e,t){for(var n=0;n<e.children.length;n++){const i=e.children[n];if(!No(i)&&Uo(r,i,t))return To(r,i)?i:Zn(r,i,t)}return e}function Uo(r,e,t){if(e===document.body||e===document.documentElement)return!0;if(!document||!document.documentElement||!document.body)return!1;const n=e.getBoundingClientRect();return t?n.bottom>0&&n.top<r.innerHeight:n.right>0&&n.left<r.innerWidth}function To(r,e){const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=r.innerHeight&&t.right<=r.innerWidth}function No(r){const e=getComputedStyle(r);if(e){const t=e.getPropertyValue("display");if(t!="block"&&t!="list-item"||e.getPropertyValue("opacity")==="0")return!0}return!1}const Mo={maxVelocity:200,minVariance:.01,historySize:20,minDirectionChanges:.2,maxConsistentScrolls:15},Tt={maxVelocity:200,minVariance:1e-5,historySize:100,minDirectionChanges:.1,maxConsistentScrolls:20},Qn={maxSelectionsPerSecond:500,minVariance:50,historySize:20},Io={enabled:!0,maxSelectionPercent:.1,minThreshold:100,absoluteMaxChars:5e3,historySize:20};class ct{constructor(e={}){this.history=[],this.consistentScrollCount=0,this.options={...Mo,...e}}analyze(e,t,n){if(n<=0)return!1;const i=Math.abs(t)/n,o=Date.now();if(this.history.push({timestamp:o,direction:e,velocity:i,distance:Math.abs(t)}),this.history=this.history.filter(p=>o-p.timestamp<2e3).slice(-(this.options.historySize||20)),this.history.length<3)return!1;if(i>this.options.maxVelocity)return this.resetAfterDetection(),!0;const a=this.history.map(p=>p.velocity),s=this.history.map(p=>p.distance),l=a.reduce((p,b)=>p+b,0)/a.length,c=s.reduce((p,b)=>p+b,0)/s.length,h=a.reduce((p,b)=>p+Math.pow(b-l,2),0)/a.length,u=s.reduce((p,b)=>p+Math.pow(b-c,2),0)/s.length;if(h<this.options.minVariance&&u<c*.1){if(this.consistentScrollCount++,this.consistentScrollCount>=(this.options.maxConsistentScrolls||10))return this.resetAfterDetection(),!0}else this.consistentScrollCount=Math.max(0,this.consistentScrollCount-1);let m=0,f=this.history[0].direction;for(let p=1;p<this.history.length;p++)this.history[p].direction!==f&&(m++,f=this.history[p].direction);return m/this.history.length>(this.options.minDirectionChanges||.3)?(this.resetAfterDetection(),!0):!1}resetAfterDetection(){this.history=this.history.slice(-3),this.consistentScrollCount=0}clear(){this.history=[],this.consistentScrollCount=0}}const ei="readium-column-snapper-style",Ho=200,D=class D extends be{constructor(){super(...arguments),this.isSnapProtectionEnabled=!1,this.patternAnalyzer=null,this.lastTurnTime=0,this.rtl=!1,this.shakeTimeout=0,this.snappingCancelled=!1,this.alreadyScrollLeft=0,this.overscroll=0,this.cachedScrollWidth=0,this.touchState=0,this.startingX=void 0,this.endingX=void 0,this.onTouchStarter=this.onTouchStart.bind(this),this.onTouchEnder=this.onTouchEnd.bind(this),this.onWidthChanger=this.onWidthChange.bind(this),this.onTouchMover=this.onTouchMove.bind(this)}doc(){return this.wnd.document.scrollingElement}scrollOffset(){const e=this.doc().scrollLeft;return e!==0?e:this.alreadyScrollLeft}snapOffset(e){const t=e+(this.rtl?-1:1);return t-t%this.wnd.innerWidth}snapNormOffset(e){const t=e+1;return t-t%this.wnd.innerWidth}normScroll(){const e=this.doc().scrollLeft||this.alreadyScrollLeft;return this.rtl?Math.abs(e):Math.max(0,this.wnd.scrollX>0?this.wnd.scrollX:e)}reportProgress(){const e=this.cachedScrollWidth,t=this.wnd.innerWidth,n=this.normScroll(),i=Math.max(1,e-t),o=Math.max(0,Math.min(1,n/i)),a=Math.max(0,Math.min(1,(n+t)/e));this.comms.send("progress",{start:o,end:a})}shake(){if(this.overscroll!==0||this.shakeTimeout!==0)return;const e=this.doc(),t=this.normScroll()<5,n=this.rtl?t?"readium-bounce-r":"readium-bounce-l":"readium-bounce-r";e.classList.add(n);const i=this.scrollOffset();this.shakeTimeout=this.wnd.setTimeout(()=>{e.classList.remove(n),this.shakeTimeout=0,this.doc().scrollLeft=i},150)}takeOverSnap(){this.snappingCancelled=!0,this.clearTouches();const e=this.doc();this.overscroll=e.style.transform?.length>12?parseFloat(e.style.transform.slice(12).split("px")[0]):0}snapCurrentOffset(e=!1,t=!1){const n=this.doc(),i=Xn(this.wnd),o=this.cachedScrollWidth-this.wnd.innerWidth,a=Math.min(Math.max(0,this.normScroll()),o),s=this.dragOffset(),l=this.rtl?-s:s,c=this.wnd.innerWidth/3*(l>0?2:1),h=Math.min(o,Math.max(0,this.snapNormOffset(a+c))),u=this.rtl?-h:h,m=this.rtl?-a:a,f=u>m?"right":"left";if(this.checkSuspiciousSnap(f,Math.abs(u-m)),e&&u!==m){this.snappingCancelled=!1;const d=(A,Q,xe,Fe)=>xe>Fe?Q:A+(Q-A)*zo(xe/Fe),p=Ho*i;let b;const P=A=>{if(this.snappingCancelled)return;b||(b=A);const Q=A-b,xe=d(this.overscroll,0,Q,p),Fe=d(m,u,Q,p);n.scrollLeft=Fe,this.overscroll!==0&&(n.style.transform=`translate3d(${-xe}px, 0px, 0px)`),Q<p?this.wnd.requestAnimationFrame(P):(this.clearTouches(),n.style.removeProperty("transform"),n.scrollLeft=u,t||this.reportProgress())};this.wnd.requestAnimationFrame(P)}else n.style.removeProperty("transform"),this.wnd.requestAnimationFrame(()=>{n.scrollLeft=u,this.clearTouches(),t||this.reportProgress()})}dragOffset(){return(this.startingX??0)-(this.endingX??0)}clearTouches(){this.startingX=void 0,this.endingX=void 0,this.overscroll=0}onTouchStart(e){switch(e.stopPropagation(),this.takeOverSnap(),e.touches.length){case 1:break;case 2:this.onTouchEnd(e);return;default:{this.onTouchEnd(e),this.comms.send("tap_more",e.touches.length);return}}this.startingX=e.touches[0].clientX,this.alreadyScrollLeft=this.doc().scrollLeft,this.touchState=1}onTouchEnd(e){if(this.touchState===2){const t=this.dragOffset(),n=this.normScroll(),i=this.cachedScrollWidth-this.wnd.innerWidth,o=this.rtl?-t:t;this.cachedScrollWidth<=this.wnd.innerWidth?(this.reportProgress(),o>5&&this.comms.send("no_more",void 0),o<-5&&this.comms.send("no_less",void 0)):n<5&&o<5?(this.alreadyScrollLeft=0,this.comms.send("no_less",void 0)):i-n<5&&o>5&&(this.alreadyScrollLeft=this.rtl?-i:i,this.comms.send("no_more",void 0)),this.snapCurrentOffset(!0),this.comms.send("swipe",t)}this.touchState=0}onWidthChange(){this.cachedScrollWidth=this.doc().scrollWidth,this.comms.ready&&this.snapCurrentOffset()}onTouchMove(e){if(this.touchState===0)return;this.touchState===1&&(this.touchState=2,z(this.wnd)),this.endingX=e.touches[0].clientX;const t=this.dragOffset(),n=this.alreadyScrollLeft+t,i=this.rtl?-(this.cachedScrollWidth-this.wnd.innerWidth):0,o=this.rtl?0:this.cachedScrollWidth-this.wnd.innerWidth;n<i?(this.overscroll=n,this.doc().style.transform=`translate3d(${-this.overscroll}px, 0px, 0px)`):n>o?(this.overscroll=n,this.doc().style.transform=`translate3d(${-n}px, 0px, 0px)`):(this.overscroll=0,this.doc().style.removeProperty("transform"),this.doc().scrollLeft=n)}enableSnapProtection(){this.patternAnalyzer||(this.patternAnalyzer=new ct({maxVelocity:this.wnd.innerWidth,minVariance:.1,historySize:5,maxConsistentScrolls:3,minDirectionChanges:.3}),this.isSnapProtectionEnabled=!0,this.comms?.log("Snap protection enabled"))}checkSuspiciousSnap(e,t){if(!this.isSnapProtectionEnabled||!this.patternAnalyzer)return;const n=Date.now(),i=n-(this.lastTurnTime||n);this.lastTurnTime=n,this.patternAnalyzer.analyze(e,t,i)&&this.comms?.send("content_protection",{type:"suspicious_snapping",timestamp:Date.now(),event:null})}mount(e,t){if(this.wnd=e,this.comms=t,this.rtl=xo(e),!super.mount(e,t))return!1;e.navigator.epubReadingSystem&&(e.navigator.epubReadingSystem.layoutStyle="paginated");const n=e.document.createElement("style");n.dataset.readium="true",n.id=ei,n.textContent=`
|
|
17
17
|
@keyframes readium-bounce-l-animation {
|
|
18
18
|
0%, 100% {transform: translate3d(0, 0, 0);}
|
|
19
19
|
50% {transform: translate3d(-50px, 0, 0);}
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
body::-webkit-scrollbar {
|
|
48
48
|
display: none; /* for Chrome, Safari, and Opera */
|
|
49
49
|
}
|
|
50
|
-
`,e.document.head.appendChild(n),this.resizeObserver=new ResizeObserver(()=>{e.requestAnimationFrame(()=>{e&&qn(e)}),this.onWidthChange()}),this.resizeObserver.observe(e.document.body),this.mutationObserver=new MutationObserver(a=>{for(const s of a)if(s.target===this.wnd.document.documentElement){const l=s.oldValue,c=s.target.getAttribute("style"),h=/transform\s*:\s*([^;]+)/,u=l?.match(h),m=c?.match(h);(!u&&!m||u&&!m||u&&m&&u[1]!==m[1])&&(e.requestAnimationFrame(()=>{e&&qn(e)}),this.onWidthChange())}else e.requestAnimationFrame(()=>this.cachedScrollWidth=this.doc().scrollWidth)}),e.frameElement&&this.mutationObserver.observe(e.frameElement,{attributes:!0,attributeFilter:["style"]}),this.mutationObserver.observe(e.document,{attributes:!0,attributeFilter:["style"]}),this.mutationObserver.observe(e.document.documentElement,{attributes:!0,attributeFilter:["style"]}),t.register("scroll_protection",D.moduleName,(a,s)=>{this.enableSnapProtection(),s(!0)});const i=a=>{const s=this.doc().scrollLeft;return this.doc().scrollLeft=this.snapOffset(a),s!==this.doc().scrollLeft},o=a=>{const s=this.doc().scrollLeft,l=this.snapNormOffset(Math.max(0,Math.min(this.cachedScrollWidth-e.innerWidth,a)));return this.doc().scrollLeft=-l,s!==this.doc().scrollLeft};return e.addEventListener("orientationchange",this.onWidthChanger),e.addEventListener("resize",this.onWidthChanger),e.requestAnimationFrame(()=>this.cachedScrollWidth=this.doc().scrollWidth),t.register("go_progression",D.moduleName,(a,s)=>{const l=a;if(l<0||l>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),s(!1);return}this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;const h=(this.cachedScrollWidth-e.innerWidth)*l;this.rtl?this.doc().scrollLeft=-this.snapNormOffset(h):this.doc().scrollLeft=this.snapOffset(h),this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_id",D.moduleName,(a,s)=>{const l=e.document.getElementById(a);if(!l){s(!1);return}this.wnd.requestAnimationFrame(()=>{this.rtl?this.doc().scrollLeft=-this.snapNormOffset(l.getBoundingClientRect().left+e.scrollX):this.doc().scrollLeft=this.snapOffset(l.getBoundingClientRect().left+e.scrollX),this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_text",D.moduleName,(a,s)=>{let l;Array.isArray(a)&&(a.length>1&&(l=a[1]),a=a[0]);const c=oe.deserialize(a),h=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:c,locations:l?new C({otherLocations:new Map([["cssSelector",l]])}):void 0}));if(!h){s(!1);return}this.wnd.requestAnimationFrame(()=>{this.rtl?this.doc().scrollLeft=-this.snapNormOffset(h.getBoundingClientRect().left+e.scrollX):this.doc().scrollLeft=this.snapOffset(h.getBoundingClientRect().left+e.scrollX),this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_end",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;let l;if(this.rtl?l=-this.snapNormOffset(this.cachedScrollWidth-e.innerWidth):l=this.snapOffset(this.cachedScrollWidth),this.doc().scrollLeft===l)return s(!1);this.doc().scrollLeft=l,this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_start",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{if(this.doc().scrollLeft===0)return s(!1);this.doc().scrollLeft=0,this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_prev",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;let l;this.rtl?l=o(this.normScroll()-e.innerWidth):l=i(e.scrollX-e.innerWidth),this.reportProgress(),l&&(z(this.wnd),this.checkSuspiciousSnap("left",this.wnd.innerWidth)),s(l)})}),t.register("go_next",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;let l;this.rtl?l=o(this.normScroll()+e.innerWidth):l=i(e.scrollX+e.innerWidth),this.reportProgress(),l&&(z(this.wnd),this.checkSuspiciousSnap("right",this.wnd.innerWidth)),s(l)})}),t.register("unfocus",D.moduleName,(a,s)=>{this.snappingCancelled=!0,z(this.wnd),s(!0)}),t.register("shake",D.moduleName,(a,s)=>{this.shake(),s(!0)}),t.register("focus",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth,this.snapCurrentOffset(!1,!0),this.reportProgress(),s(!0)})}),t.register("first_visible_locator",D.moduleName,(a,s)=>{const l=lt(e,!1);this.comms.send("first_visible_locator",l.serialize()),s(!0)}),e.addEventListener("touchstart",this.onTouchStarter,{passive:!0}),e.addEventListener("touchend",this.onTouchEnder,{passive:!0}),e.addEventListener("touchmove",this.onTouchMover,{passive:!0}),e.document.addEventListener("touchstart",()=>{}),t.log("ColumnSnapper Mounted"),!0}unmount(e,t){return this.snappingCancelled=!0,t.unregisterAll(D.moduleName),this.resizeObserver.disconnect(),this.mutationObserver.disconnect(),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isSnapProtectionEnabled=!1),e.removeEventListener("touchstart",this.onTouchStarter),e.removeEventListener("touchend",this.onTouchEnder),e.removeEventListener("touchmove",this.onTouchMover),e.removeEventListener("orientationchange",this.onWidthChanger),e.removeEventListener("resize",this.onWidthChanger),e.document.getElementById(ei)?.remove(),t.log("ColumnSnapper Unmounted"),super.unmount(e,t)}};D.moduleName="column_snapper";let Nt=D;const ti="readium-scroll-snapper-style",W=class W extends
|
|
50
|
+
`,e.document.head.appendChild(n),this.resizeObserver=new ResizeObserver(()=>{e.requestAnimationFrame(()=>{e&&qn(e)}),this.onWidthChange()}),this.resizeObserver.observe(e.document.body),this.mutationObserver=new MutationObserver(a=>{for(const s of a)if(s.target===this.wnd.document.documentElement){const l=s.oldValue,c=s.target.getAttribute("style"),h=/transform\s*:\s*([^;]+)/,u=l?.match(h),m=c?.match(h);(!u&&!m||u&&!m||u&&m&&u[1]!==m[1])&&(e.requestAnimationFrame(()=>{e&&qn(e)}),this.onWidthChange())}else e.requestAnimationFrame(()=>this.cachedScrollWidth=this.doc().scrollWidth)}),e.frameElement&&this.mutationObserver.observe(e.frameElement,{attributes:!0,attributeFilter:["style"]}),this.mutationObserver.observe(e.document,{attributes:!0,attributeFilter:["style"]}),this.mutationObserver.observe(e.document.documentElement,{attributes:!0,attributeFilter:["style"]}),t.register("scroll_protection",D.moduleName,(a,s)=>{this.enableSnapProtection(),s(!0)});const i=a=>{const s=this.doc().scrollLeft;return this.doc().scrollLeft=this.snapOffset(a),s!==this.doc().scrollLeft},o=a=>{const s=this.doc().scrollLeft,l=this.snapNormOffset(Math.max(0,Math.min(this.cachedScrollWidth-e.innerWidth,a)));return this.doc().scrollLeft=-l,s!==this.doc().scrollLeft};return e.addEventListener("orientationchange",this.onWidthChanger),e.addEventListener("resize",this.onWidthChanger),e.requestAnimationFrame(()=>this.cachedScrollWidth=this.doc().scrollWidth),t.register("go_progression",D.moduleName,(a,s)=>{const l=a;if(l<0||l>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),s(!1);return}this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;const h=(this.cachedScrollWidth-e.innerWidth)*l;this.rtl?this.doc().scrollLeft=-this.snapNormOffset(h):this.doc().scrollLeft=this.snapOffset(h),this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_id",D.moduleName,(a,s)=>{const l=e.document.getElementById(a);if(!l){s(!1);return}this.wnd.requestAnimationFrame(()=>{this.rtl?this.doc().scrollLeft=-this.snapNormOffset(l.getBoundingClientRect().left+e.scrollX):this.doc().scrollLeft=this.snapOffset(l.getBoundingClientRect().left+e.scrollX),this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_text",D.moduleName,(a,s)=>{let l;Array.isArray(a)&&(a.length>1&&(l=a[1]),a=a[0]);const c=oe.deserialize(a),h=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:c,locations:l?new C({otherLocations:new Map([["cssSelector",l]])}):void 0}));if(!h){s(!1);return}this.wnd.requestAnimationFrame(()=>{this.rtl?this.doc().scrollLeft=-this.snapNormOffset(h.getBoundingClientRect().left+e.scrollX):this.doc().scrollLeft=this.snapOffset(h.getBoundingClientRect().left+e.scrollX),this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_end",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;let l;if(this.rtl?l=-this.snapNormOffset(this.cachedScrollWidth-e.innerWidth):l=this.snapOffset(this.cachedScrollWidth),this.doc().scrollLeft===l)return s(!1);this.doc().scrollLeft=l,this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_start",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{if(this.doc().scrollLeft===0)return s(!1);this.doc().scrollLeft=0,this.reportProgress(),z(this.wnd),s(!0)})}),t.register("go_prev",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;let l;this.rtl?l=o(this.normScroll()-e.innerWidth):l=i(e.scrollX-e.innerWidth),this.reportProgress(),l&&(z(this.wnd),this.checkSuspiciousSnap("left",this.wnd.innerWidth)),s(l)})}),t.register("go_next",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth;let l;this.rtl?l=o(this.normScroll()+e.innerWidth):l=i(e.scrollX+e.innerWidth),this.reportProgress(),l&&(z(this.wnd),this.checkSuspiciousSnap("right",this.wnd.innerWidth)),s(l)})}),t.register("unfocus",D.moduleName,(a,s)=>{this.snappingCancelled=!0,z(this.wnd),s(!0)}),t.register("shake",D.moduleName,(a,s)=>{this.shake(),s(!0)}),t.register("focus",D.moduleName,(a,s)=>{this.wnd.requestAnimationFrame(()=>{this.cachedScrollWidth=this.doc().scrollWidth,this.snapCurrentOffset(!1,!0),this.reportProgress(),s(!0)})}),t.register("first_visible_locator",D.moduleName,(a,s)=>{const l=lt(e,!1);this.comms.send("first_visible_locator",l.serialize()),s(!0)}),e.addEventListener("touchstart",this.onTouchStarter,{passive:!0}),e.addEventListener("touchend",this.onTouchEnder,{passive:!0}),e.addEventListener("touchmove",this.onTouchMover,{passive:!0}),e.document.addEventListener("touchstart",()=>{}),t.log("ColumnSnapper Mounted"),!0}unmount(e,t){return this.snappingCancelled=!0,t.unregisterAll(D.moduleName),this.resizeObserver.disconnect(),this.mutationObserver.disconnect(),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isSnapProtectionEnabled=!1),e.removeEventListener("touchstart",this.onTouchStarter),e.removeEventListener("touchend",this.onTouchEnder),e.removeEventListener("touchmove",this.onTouchMover),e.removeEventListener("orientationchange",this.onWidthChanger),e.removeEventListener("resize",this.onWidthChanger),e.document.getElementById(ei)?.remove(),t.log("ColumnSnapper Unmounted"),super.unmount(e,t)}};D.moduleName="column_snapper";let Nt=D;const ti="readium-scroll-snapper-style",W=class W extends be{constructor(){super(...arguments),this.patternAnalyzer=null,this.lastScrollTime=0,this.isScrollProtectionEnabled=!1,this.initialScrollHandled=!1,this.isScrolling=!1,this.lastScrollTop=0,this.isResizing=!1,this.resizeDebounce=null,this.handleScroll=e=>{if(this.comms.ready&&!this.isResizing){if(!this.initialScrollHandled){this.lastScrollTop=this.doc().scrollTop,this.initialScrollHandled=!0,this.reportProgress();return}this.isScrolling||(this.isScrolling=!0,this.wnd.requestAnimationFrame(()=>{this.reportProgress();const t=this.doc().scrollTop,n=t-this.lastScrollTop;if(this.lastScrollTop=t,this.isScrollProtectionEnabled&&Math.abs(n)>5){const i=Date.now(),o=i-(this.lastScrollTime||i);if(this.patternAnalyzer&&this.patternAnalyzer.analyze(n>0?"down":"up",Math.abs(n),o)){const s=e.target&&"tagName"in e.target?{tagName:e.target.tagName}:null;this.comms?.send("content_protection",{type:"suspicious_scrolling",timestamp:Date.now(),scrollDelta:n,scrollDirection:n>0?"down":"up",targetElement:s})}this.lastScrollTime=i}this.comms.send("scroll",n),this.isScrolling=!1}))}}}doc(){return this.wnd.document.scrollingElement}reportProgress(){if(!this.comms.ready)return;const e=Math.ceil(this.doc().scrollTop),t=this.doc().scrollHeight,n=this.wnd.innerHeight,i=Math.max(0,Math.min(1,e/t)),o=Math.max(0,Math.min(1,(e+n)/t));this.comms.send("progress",{start:i,end:o})}enableScrollProtection(){this.patternAnalyzer||(this.patternAnalyzer=new ct(Tt),this.isScrollProtectionEnabled=!0,this.comms?.log("Scroll protection enabled"))}mount(e,t){this.wnd=e,this.comms=t,this.initialScrollHandled=!1,this.lastScrollTop=0,this.isResizing=!1,this.resizeDebounce&&(this.wnd.clearTimeout(this.resizeDebounce),this.resizeDebounce=null),e.navigator.epubReadingSystem&&(e.navigator.epubReadingSystem.layoutStyle="scrolling");const n=e.document.createElement("style");return n.dataset.readium="true",n.id=ti,n.textContent=`
|
|
51
51
|
* {
|
|
52
52
|
scrollbar-width: none; /* for Firefox */
|
|
53
53
|
}
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
body::-webkit-scrollbar {
|
|
56
56
|
display: none; /* for Chrome, Safari, and Opera */
|
|
57
57
|
}
|
|
58
|
-
`,e.document.head.appendChild(n),this.resizeObserver=new ResizeObserver(()=>{this.resizeDebounce&&this.wnd.clearTimeout(this.resizeDebounce),this.isResizing=!0,this.resizeDebounce=this.wnd.setTimeout(()=>{this.isResizing=!1,this.resizeDebounce=null,this.reportProgress()},50)}),this.resizeObserver.observe(e.document.body),e.addEventListener("scroll",this.handleScroll,{passive:!0}),t.register("force_webkit_recalc",W.moduleName,()=>{At(this.wnd);const i=this.doc().scrollTop;i>1?this.doc().scrollTop=i-1:this.doc().scrollTop=i+1,this.doc().scrollTop=i}),t.register("go_progression",W.moduleName,(i,o)=>{const a=i;if(a<0||a>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=this.doc().offsetHeight*a,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_id",W.moduleName,(i,o)=>{const a=e.document.getElementById(i);if(!a){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=a.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_text",W.moduleName,(i,o)=>{let a;Array.isArray(i)&&(i.length>1&&(a=i[1]),i=i[0]);const s=oe.deserialize(i),l=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:s,locations:a?new C({otherLocations:new Map([["cssSelector",a]])}):void 0}));if(!l){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=l.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_start",W.moduleName,(i,o)=>{if(this.doc().scrollTop===0)return o(!1);this.doc().scrollTop=0,this.reportProgress(),o(!0)}),t.register("go_end",W.moduleName,(i,o)=>{if(this.doc().scrollTop===this.doc().scrollHeight-this.doc().offsetHeight)return o(!1);this.doc().scrollTop=this.doc().scrollHeight-this.doc().offsetHeight,this.reportProgress(),o(!0)}),t.register("unfocus",W.moduleName,(i,o)=>{z(this.wnd),o(!0)}),t.register("scroll_protection",W.moduleName,(i,o)=>{this.enableScrollProtection(),o(!0)}),t.register(["go_next","go_prev"],W.moduleName,(i,o)=>o(!1)),t.register("focus",W.moduleName,(i,o)=>{this.reportProgress(),o(!0)}),t.register("first_visible_locator",W.moduleName,(i,o)=>{const a=lt(e,!0);this.comms.send("first_visible_locator",a.serialize()),o(!0)}),t.log("ScrollSnapper Mounted"),!0}unmount(e,t){return t.unregisterAll(W.moduleName),this.resizeObserver.disconnect(),this.handleScroll&&e.removeEventListener("scroll",this.handleScroll),e.document.getElementById(ti)?.remove(),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isScrollProtectionEnabled=!1),t.log("ScrollSnapper Unmounted"),!0}};W.moduleName="scroll_snapper";let Mt=W;const B=class B extends Se{constructor(){super(...arguments),this.patternAnalyzer=null,this.lastScrollTime=0,this.isScrollProtectionEnabled=!1,this.initialScrollHandled=!1,this.isScrolling=!1,this.lastScrollTop=0,this.isResizing=!1,this.resizeDebounce=null,this.handleScroll=e=>{if(this.comms.ready&&!this.isResizing){if(!this.initialScrollHandled){this.lastScrollTop=this.doc().scrollTop,this.initialScrollHandled=!0,this.reportProgress();return}this.isScrolling||(this.isScrolling=!0,this.wnd.requestAnimationFrame(()=>{this.reportProgress();const t=this.doc().scrollTop,n=t-this.lastScrollTop;if(this.lastScrollTop=t,this.isScrollProtectionEnabled&&Math.abs(n)>5){const i=Date.now(),o=i-(this.lastScrollTime||i);if(this.patternAnalyzer&&this.patternAnalyzer.analyze(n>0?"down":"up",Math.abs(n),o)){const s=e.target&&"tagName"in e.target?{tagName:e.target.tagName}:null;this.comms?.send("content_protection",{type:"suspicious_scrolling",timestamp:Date.now(),scrollDelta:n,scrollDirection:n>0?"down":"up",targetElement:s})}this.lastScrollTime=i}this.comms.send("scroll",n),this.isScrolling=!1}))}}}doc(){return this.wnd.document.scrollingElement}reportProgress(){if(!this.comms.ready)return;const e=Math.ceil(this.doc().scrollTop),t=this.doc().scrollHeight,n=this.wnd.innerHeight,i=Math.max(0,Math.min(1,e/t)),o=Math.max(0,Math.min(1,(e+n)/t));this.comms.send("progress",{start:i,end:o})}enableScrollProtection(){this.patternAnalyzer||(this.patternAnalyzer=new ct(Tt),this.isScrollProtectionEnabled=!0,this.comms?.log("Scroll protection enabled"))}mount(e,t){return this.wnd=e,this.comms=t,this.initialScrollHandled=!1,this.lastScrollTop=0,this.isResizing=!1,this.resizeDebounce&&(this.wnd.clearTimeout(this.resizeDebounce),this.resizeDebounce=null),this.resizeObserver=new ResizeObserver(()=>{this.resizeDebounce&&this.wnd.clearTimeout(this.resizeDebounce),this.isResizing=!0,this.resizeDebounce=this.wnd.setTimeout(()=>{this.isResizing=!1,this.resizeDebounce=null,this.reportProgress()},50)}),this.resizeObserver.observe(e.document.body),e.addEventListener("scroll",this.handleScroll,{passive:!0}),t.register("force_webkit_recalc",B.moduleName,()=>{At(this.wnd);const n=this.doc().scrollTop;n>1?this.doc().scrollTop=n-1:this.doc().scrollTop=n+1,this.doc().scrollTop=n}),t.register("go_progression",B.moduleName,(n,i)=>{const o=n;if(o<0||o>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),i(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=this.doc().offsetHeight*o,this.reportProgress(),z(this.wnd),i(!0)})}),t.register("go_id",B.moduleName,(n,i)=>{const o=e.document.getElementById(n);if(!o){i(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=o.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),i(!0)})}),t.register("go_text",B.moduleName,(n,i)=>{let o;Array.isArray(n)&&(n.length>1&&(o=n[1]),n=n[0]);const a=oe.deserialize(n),s=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:a,locations:o?new C({otherLocations:new Map([["cssSelector",o]])}):void 0}));if(!s){i(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=s.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),i(!0)})}),t.register("go_start",B.moduleName,(n,i)=>{if(this.doc().scrollTop===0)return i(!1);this.doc().scrollTop=0,this.reportProgress(),i(!0)}),t.register("go_end",B.moduleName,(n,i)=>{if(this.doc().scrollTop===this.doc().scrollHeight-this.doc().offsetHeight)return i(!1);this.doc().scrollTop=this.doc().scrollHeight-this.doc().offsetHeight,this.reportProgress(),i(!0)}),t.register("unfocus",B.moduleName,(n,i)=>{z(this.wnd),i(!0)}),t.register("scroll_protection",B.moduleName,(n,i)=>{this.enableScrollProtection(),i(!0)}),t.register(["go_next","go_prev"],B.moduleName,(n,i)=>i(!1)),t.register("focus",B.moduleName,(n,i)=>{this.reportProgress(),i(!0)}),t.register("first_visible_locator",B.moduleName,(n,i)=>{const o=lt(e,!0);t.send("first_visible_locator",o.serialize()),i(!0)}),t.log("WebPubSnapper Mounted"),!0}unmount(e,t){return t.unregisterAll(B.moduleName),this.resizeObserver.disconnect(),this.handleScroll&&e.removeEventListener("scroll",this.handleScroll),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isScrollProtectionEnabled=!1),t.log("WebPubSnapper Unmounted"),!0}};B.moduleName="webpub_snapper";let It=B;class Do{constructor(e,t){this.window=e,this.copyHistory=[],this.lastSelectionLength=0,this.lastSelectionTime=0,this.options=t}cleanupOldHistory(e){this.copyHistory=this.copyHistory.filter(n=>e-n.timestamp<1e4),this.copyHistory.length>this.options.historySize&&(this.copyHistory=this.copyHistory.slice(-this.options.historySize))}isSuspiciousPattern(e){return this.copyHistory.length<3?!1:this.copyHistory.filter(i=>e-i.timestamp<2e3).length>=3?!0:this.copyHistory.slice().sort((i,o)=>i.timestamp-o.timestamp).every((i,o,a)=>o===0?!0:i.length>a[o-1].length*1.5)}shouldAllowCopy(e){if(!this.options.enabled)return!0;const t=this.window.getSelection();if(!t)return!0;const i=t.toString().length,o=this.window.document.body.innerText.length,a=Date.now();if(this.cleanupOldHistory(a),i<this.options.minThreshold)return this.copyHistory.push({timestamp:a,length:i,wasBlocked:!1}),!0;const l=a-this.lastSelectionTime<100&&i>this.lastSelectionLength*1.5,c=Math.min(o*this.options.maxSelectionPercent,this.options.absoluteMaxChars),h=this.isSuspiciousPattern(a),u=i>c||l||h;return this.copyHistory.push({timestamp:a,length:i,wasBlocked:u}),u?(e?.preventDefault(),!1):(this.lastSelectionLength=i,this.lastSelectionTime=a,!0)}destroy(){this.lastSelectionLength=0,this.lastSelectionTime=0,this.copyHistory=[],this.options.enabled=!1}}class Wo{constructor(e=Qn){this.options=e,this.events=[],this.selectionStartTime=0,this.lastSelectionTime=0,this.lastSelectionPosition=0,this.selectionPatterns=[],this.lastSelectedText=""}analyze(e){if(!e)return this.clear(),!1;const t=e.toString();if(t.length===0)return this.clear(),!1;if(e.type!=="Range"||!e.rangeCount)return!1;const n=Date.now();if(t.length<=50||t===this.lastSelectedText)return!1;if(this.selectionStartTime===0)return this.selectionStartTime=n,this.lastSelectedText=t,!1;if(n-this.selectionStartTime<500)return!1;n-this.lastSelectionTime>1e3&&(this.lastSelectionTime=n),this.selectionStartTime===0&&(this.selectionStartTime=n),this.lastSelectedText=t;const o=this.analyzeSelectionPattern(e,n);return this.cleanup(n),o}analyzeSelectionPattern(e,t){if(!e.rangeCount)return!1;const n=e.getRangeAt(0),i=n.toString(),o=(t-this.selectionStartTime)/1e3;if(i.length/Math.max(1,o)>this.options.maxSelectionsPerSecond)return!0;const s=n.startOffset,l=Math.abs(s-this.lastSelectionPosition);return this.selectionPatterns.push(l),this.selectionPatterns.length>this.options.historySize&&(this.selectionPatterns.shift(),this.calculateVariance(this.selectionPatterns)<this.options.minVariance)?!0:(this.lastSelectionPosition=s,!1)}calculateVariance(e){if(e.length===0)return 0;const t=e.reduce((n,i)=>n+i,0)/e.length;return e.reduce((n,i)=>n+Math.pow(i-t,2),0)/e.length}cleanup(e){this.events=this.events.filter(t=>e-t.timestamp<=1e3)}clear(){this.events=[],this.selectionStartTime=0,this.lastSelectionTime=0,this.lastSelectionPosition=0,this.selectionPatterns=[],this.lastSelectedText=""}}class ni{match(e,t){for(const n of t)if(this.matchesCombo(e,n))return!0;return!1}matchesCombo(e,t){return e.keyCode===t.keyCode&&this.matchesModifier(e.ctrlKey,t.ctrl)&&this.matchesModifier(e.shiftKey,t.shift)&&this.matchesModifier(e.altKey,t.alt)&&this.matchesModifier(e.metaKey,t.meta)}matchesModifier(e,t){return t===void 0?!e:e===t}createKeyHandler(e,t){return n=>{this.match(n,e)&&(n.preventDefault(),n.stopPropagation(),t(n))}}createActivityEvent(e,t,n,i){let o,a;if(i){const s=i.getSelection(),l=s?.toString()||"",h=(l&&s?.rangeCount?s.getRangeAt(0)?.getClientRects():null)?.[0];h&&l&&(o={text:l,x:h.x,y:h.y,width:h.width,height:h.height});const u=i.document.activeElement;u&&u!==i.document.body&&(a=Ut(u)?.outerHTML)}return{type:t,timestamp:Date.now(),key:e.key,code:e.code,keyCode:e.keyCode,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,metaKey:e.metaKey,targetFrameSrc:n,selectedText:o,interactiveElement:a}}createKeyboardHandlers(e,t,n,i){const o=[];return t.forEach(a=>{o.push(...a.keyCombos.map(s=>({...s,handler:l=>{const c=a.type,h=this.createActivityEvent(l,c,e,i);n(h)}})))}),o}createUnifiedHandler(e,t,n,i){const o=this.createKeyboardHandlers(e,t,n,i);return a=>{for(const s of o)if(this.match(a,[s])){const l=s.suppressOnInteractiveElement;if(l){const c=(i?.document??document).activeElement;if(Array.isArray(l)?l.some(h=>c?.matches(h)):Jn(c))return}a.preventDefault(),a.stopPropagation(),s.handler(a);return}}}}const Ee=class Ee extends fe{constructor(){super(...arguments),this.configApplied=!1,this.cleanupCallbacks=[],this.pointerMoved=!1,this.isContextMenuEnabled=!1,this.isDragAndDropEnabled=!1,this.isSelectionMonitoringEnabled=!1,this.isBulkCopyProtectionEnabled=!1,this.selectionAnalyzer=null,this.currentSelection=null,this.bulkCopyProtector=null,this.keyManager=new ni,this.keyDownHandler=null,this.preventBulkCopy=e=>{if(!this.isBulkCopyProtectionEnabled||!this.bulkCopyProtector)return!0;if(!this.bulkCopyProtector.shouldAllowCopy(e)){e.preventDefault();const t=this.wnd.getSelection(),n=t?.toString()||"",o=(n?t?.getRangeAt(0)?.getClientRects():null)?.[0],a={type:"bulk_copy",timestamp:Date.now(),clipboardTypes:e.clipboardData?.types?[...e.clipboardData.types]:[],selectedText:o?{text:n,x:o.x,y:o.y,width:o.width,height:o.height}:void 0,selectionLength:n.length,targetFrameSrc:this.wnd.location.href};return this.comms?.send("content_protection",a),!1}return!0},this.handleSelection=e=>{if(!this.isSelectionMonitoringEnabled||!this.wnd||!this.selectionAnalyzer)return;const t=this.wnd.getSelection();if(t){if(this.currentSelection=t.toString(),this.selectionAnalyzer.analyze(t)&&this.currentSelection){const i=this.wnd.getSelection(),o=i?.toString()||"",s=(o&&i?.rangeCount?i.getRangeAt(0)?.getClientRects():null)?.[0],l={type:"suspicious_selection",timestamp:Date.now(),selectionLength:o.length,selectedText:{text:o,x:s?.x??0,y:s?.y??0,width:s?.width??0,height:s?.height??0},eventType:e?.type||"selectionchange",targetFrameSrc:this.wnd.location.href};this.comms?.send("content_protection",l)}}else this.currentSelection=null},this.onDragOver=e=>{this.isDragAndDropEnabled&&(e.preventDefault(),e.stopPropagation())},this.onDragStart=e=>{if(this.isDragAndDropEnabled){e.preventDefault();const t={type:"drag_detected",timestamp:Date.now(),dataTransferTypes:e.dataTransfer?.types?[...e.dataTransfer.types]:[],targetFrameSrc:this.wnd.location.href};return this.comms?.send("content_protection",t),!1}else return!0},this.onDrop=e=>{if(this.isDragAndDropEnabled){e.preventDefault();const t=e.dataTransfer,n={type:"drop_detected",timestamp:Date.now(),dataTransferTypes:t?.types?[...t.types]:[],fileCount:t?.files?.length||0,targetFrameSrc:this.wnd.location.href};return this.comms?.send("content_protection",n),!1}else return!0},this.onContext=e=>{if(this.isContextMenuEnabled){e.preventDefault();const t=this.wnd.getSelection(),n=t?.toString()||"",o=(n&&t?.rangeCount?t.getRangeAt(0)?.getClientRects():null)?.[0],a={timestamp:Date.now(),clientX:e.clientX,clientY:e.clientY,...o&&{selectedText:{text:n,x:o.x,y:o.y,width:o.width,height:o.height}},targetFrameSrc:this.wnd.location.href};this.comms?.send("context_menu",a)}},this.onPointerUp=this.onPointUp.bind(this),this.onPointerMove=this.onPointMove.bind(this),this.onPointerDown=this.onPointDown.bind(this),this.onClicker=this.onClick.bind(this)}addContextMenuPrevention(){this.isContextMenuEnabled||!this.wnd||(this.wnd.document.addEventListener("contextmenu",this.onContext),this.isContextMenuEnabled=!0)}removeContextMenuPrevention(){!this.isContextMenuEnabled||!this.wnd||(this.wnd.document.removeEventListener("contextmenu",this.onContext),this.isContextMenuEnabled=!1)}addDragAndDropPrevention(){this.isDragAndDropEnabled||!this.wnd||(this.wnd.document.addEventListener("dragstart",this.onDragStart),this.wnd.document.addEventListener("dragover",this.onDragOver),this.wnd.document.addEventListener("drop",this.onDrop),this.isDragAndDropEnabled=!0)}removeDragAndDropPrevention(){!this.isDragAndDropEnabled||!this.wnd||(this.wnd.document.removeEventListener("dragstart",this.onDragStart),this.wnd.document.removeEventListener("dragover",this.onDragOver),this.wnd.document.removeEventListener("drop",this.onDrop),this.isDragAndDropEnabled=!1)}enableKeyboardPeripherals(e=[]){this.disableKeyboardPeripherals();const t=n=>{this.comms?.send("keyboard_peripherals",n)};this.keyDownHandler=this.keyManager.createUnifiedHandler(this.wnd.location.href,e,t,this.wnd),this.wnd&&this.wnd.document.addEventListener("keydown",this.keyDownHandler,{capture:!0})}disableKeyboardPeripherals(){this.wnd&&this.keyDownHandler&&(this.wnd.document.removeEventListener("keydown",this.keyDownHandler,{capture:!0}),this.keyDownHandler=null)}addBulkCopyProtection(e={}){if(this.isBulkCopyProtectionEnabled||!this.wnd)return;const t=Io,n=e?{...t,...e}:t;this.bulkCopyProtector=new Do(this.wnd,n),this.wnd.document.addEventListener("copy",this.preventBulkCopy,!0),this.wnd.document.addEventListener("cut",this.preventBulkCopy,!0),this.isBulkCopyProtectionEnabled=!0}removeBulkCopyProtection(){!this.isBulkCopyProtectionEnabled||!this.wnd||(this.wnd.document.removeEventListener("copy",this.preventBulkCopy,!0),this.wnd.document.removeEventListener("cut",this.preventBulkCopy,!0),this.bulkCopyProtector?.destroy(),this.bulkCopyProtector=null,this.isBulkCopyProtectionEnabled=!1)}addSelectionMonitoring(e){if(this.isSelectionMonitoringEnabled||!this.wnd)return;const t=e||Qn;this.selectionAnalyzer=new Wo(t),this.wnd.document.addEventListener("selectionchange",this.handleSelection),this.isSelectionMonitoringEnabled=!0}removeSelectionMonitoring(){!this.isSelectionMonitoringEnabled||!this.wnd||(this.wnd.document.removeEventListener("selectionchange",this.handleSelection),this.selectionAnalyzer?.clear(),this.selectionAnalyzer=null,this.isSelectionMonitoringEnabled=!1)}onPointUp(e){const t=this.wnd.getSelection();if(t&&t.toString()?.length>0){const i=t.getRangeAt(0)?.getClientRects();if(!i||i.length===0)return;const o=i[0],a={text:t.toString(),x:o.x,y:o.y,width:o.width,height:o.height,targetFrameSrc:this.wnd?.location?.href};this.comms.send("text_selected",a)}if(this.pointerMoved){this.pointerMoved=!1;return}if(!t?.isCollapsed||!e.isPrimary)return;const n=this.wnd.devicePixelRatio;e.preventDefault(),this.comms.send(e.pointerType==="touch"?"tap":"click",{defaultPrevented:e.defaultPrevented,x:e.clientX*n,y:e.clientY*n,targetFrameSrc:this.wnd.location.href,targetElement:e.target.outerHTML,interactiveElement:Ut(e.target)?.outerHTML,cssSelector:this.wnd._readium_cssSelectorGenerator.getCssSelector(e.target)}),this.pointerMoved=!1}onPointMove(e){if(e.movementY!==void 0&&e.movementX!==void 0){(Math.abs(e.movementX)>1||Math.abs(e.movementY)>1)&&(this.pointerMoved=!0);return}this.pointerMoved=!0}onPointDown(){this.pointerMoved=!1}onClick(e){if(e.preventDefault(),!e.isTrusted){const t=new PointerEvent("pointerup",{isPrimary:!0,pointerType:"mouse",clientX:e.clientX,clientY:e.clientY});Object.defineProperty(t,"target",{writable:!1,value:e.target}),Object.defineProperty(t,"defaultPrevented",{writable:!1,value:e.defaultPrevented}),this.onPointUp(t)}}registerProtectionHandlers(){this.comms?.register("peripherals_protection",Ee.moduleName,(e,t)=>{const n=e;if(!this.configApplied){if(this.configApplied=!0,n.monitorSelection){const i=typeof n.monitorSelection=="boolean"?void 0:n.monitorSelection;this.addSelectionMonitoring(i),this.comms?.log("Selection monitoring enabled")}typeof n.protectCopy=="object"?(this.addBulkCopyProtection({enabled:!0,...n.protectCopy}),this.comms?.log("Copy protection enabled (limited)")):n.protectCopy===!0&&(this.addBulkCopyProtection({enabled:!0,maxSelectionPercent:0,minThreshold:0,absoluteMaxChars:0}),this.comms?.log("Copy protection enabled")),n.disableContextMenu&&(this.addContextMenuPrevention(),this.comms?.log("Context menu protection enabled")),n.disableDragAndDrop&&(this.addDragAndDropPrevention(),this.comms?.log("Drag and drop protection enabled"))}t(!0)}),this.comms?.register("keyboard_peripherals",Ee.moduleName,(e,t)=>{const n=e;n&&n.length>0&&(this.enableKeyboardPeripherals(n),this.comms?.log(`Keyboard peripherals enabled: ${n.map(i=>i.type).join(", ")}`)),t(!0)})}mount(e,t){return this.wnd=e,this.comms=t,this.registerProtectionHandlers(),e.document.addEventListener("pointerdown",this.onPointerDown),e.document.addEventListener("pointerup",this.onPointerUp),e.document.addEventListener("pointermove",this.onPointerMove),e.document.addEventListener("click",this.onClicker),t.log("Peripherals Mounted"),!0}unmount(e,t){return this.removeBulkCopyProtection(),this.removeSelectionMonitoring(),this.removeContextMenuPrevention(),this.removeDragAndDropPrevention(),this.disableKeyboardPeripherals(),this.cleanupCallbacks.forEach(n=>n()),this.cleanupCallbacks=[],e.document.removeEventListener("pointerdown",this.onPointerDown),e.document.removeEventListener("pointerup",this.onPointerUp),e.document.removeEventListener("pointermove",this.onPointerMove),e.document.removeEventListener("click",this.onClicker),t.unregisterAll(Ee.moduleName),this.configApplied=!1,t.log("Peripherals Unmounted"),!0}};Ee.moduleName="peripherals";let Ht=Ee;const Je=class Je extends fe{constructor(){super(...arguments),this.mediaPlayingCount=0,this.allAnimations=new Set}wndOnErr(e){this.comms?.send("error",{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno})}unblock(e){for(e._readium_blockEvents=!1;e._readium_blockedEvents?.length>0;){const t=e._readium_blockedEvents.shift();switch(t[0]){case 0:Reflect.apply(t[1],t[2],t[3]);break;case 1:const n=t[1],i=t[2];e.removeEventListener(n.type,e._readium_eventBlocker,!0);const o=new Event(n.type,{bubbles:n.bubbles,cancelable:n.cancelable});i?i.dispatchEvent(o):e.dispatchEvent(o);break}}}onMediaPlayEvent(){this.mediaPlayingCount++,this.comms?.send("media_play",this.mediaPlayingCount)}onMediaPauseEvent(){this.mediaPlayingCount>0&&this.mediaPlayingCount--,this.comms?.send("media_pause",this.mediaPlayingCount)}pauseAllMedia(e){const t=e.document.querySelectorAll("audio,video");for(let n=0;n<t.length;n++)t[n].pause()}mount(e,t){this.comms=t,e.addEventListener("error",this.wndOnErr,!1),Reflect.defineProperty(e.navigator,"epubReadingSystem",{value:{name:"readium-ts-toolkit",version:"2.5.5",hasFeature:(i,o="")=>{switch(i){case"dom-manipulation":return!0;case"layout-changes":return!0;case"touch-events":return!0;case"mouse-events":return!0;case"keyboard-events":return!0;case"spine-scripting":return!0;case"embedded-web-content":return!0;default:return!1}}},writable:!1}),"getAnimations"in e.document&&e.document.getAnimations().forEach(i=>{i.cancel(),this.allAnimations.add(i)}),t.register("activate",Je.moduleName,(i,o)=>{this.allAnimations.forEach(a=>{a.cancel(),a.play()}),o(!0)}),t.register("unfocus",Je.moduleName,(i,o)=>{this.pauseAllMedia(e),this.allAnimations.forEach(a=>a.pause()),o(!0)});const n=e.document.querySelectorAll("audio,video");for(let i=0;i<n.length;i++){const o=n[i];o.addEventListener("play",this.onMediaPlayEvent,{passive:!0}),o.addEventListener("pause",this.onMediaPauseEvent,{passive:!0})}return t.log("Setup Mounted"),!0}unmount(e,t){return e.removeEventListener("error",this.wndOnErr),e.removeEventListener("play",this.onMediaPlayEvent),e.removeEventListener("pause",this.onMediaPauseEvent),this.allAnimations.forEach(n=>n.cancel()),this.allAnimations.clear(),t.log("Setup Unmounted"),!0}};Je.moduleName="setup";let ht=Je;const ii="readium-viewport",ne=class ne extends ht{onViewportWidthChanged(e){const t=e.target;Oe(t,"--RS__viewportWidth",`${t.innerWidth}px`)}mount(e,t){if(!super.mount(e,t))return!1;const n=e.document.createElement("meta");return n.dataset.readium="true",n.setAttribute("name","viewport"),n.setAttribute("id",ii),n.setAttribute("content","width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no"),e.document.head.appendChild(n),e.addEventListener("orientationchange",this.onViewportWidthChanged),e.addEventListener("resize",this.onViewportWidthChanged),this.onViewportWidthChanged({target:e}),t.register("get_properties",ne.moduleName,(i,o)=>{kt(e),o(!0)}),t.register("update_properties",ne.moduleName,(i,o)=>{i["--RS__viewportWidth"]=`${e.innerWidth}px`,Bn(e,i),o(!0)}),t.register("set_property",ne.moduleName,(i,o)=>{const a=i;Oe(e,a[0],a[1]),o(!0)}),t.register("remove_property",ne.moduleName,(i,o)=>{rt(e,i),o(!0)}),t.register("activate",ne.moduleName,(i,o)=>{this.unblock(e),o(!0)}),t.log("ReflowableSetup Mounted"),!0}unmount(e,t){return t.unregisterAll(ne.moduleName),e.document.head.querySelector(`#${ii}`)?.remove(),e.removeEventListener("orientationchange",this.onViewportWidthChanged),t.log("ReflowableSetup Unmounted"),super.unmount(e,t)}};ne.moduleName="reflowable_setup";let Dt=ne;const oi="readium-fixed-style",Z=class Z extends ht{mount(e,t){if(!super.mount(e,t))return!1;e.navigator.epubReadingSystem&&(e.navigator.epubReadingSystem.layoutStyle="paginated");const n=e.document.createElement("style");return n.id=oi,n.dataset.readium="true",n.textContent=`
|
|
58
|
+
`,e.document.head.appendChild(n),this.resizeObserver=new ResizeObserver(()=>{this.resizeDebounce&&this.wnd.clearTimeout(this.resizeDebounce),this.isResizing=!0,this.resizeDebounce=this.wnd.setTimeout(()=>{this.isResizing=!1,this.resizeDebounce=null,this.reportProgress()},50)}),this.resizeObserver.observe(e.document.body),e.addEventListener("scroll",this.handleScroll,{passive:!0}),t.register("force_webkit_recalc",W.moduleName,()=>{At(this.wnd);const i=this.doc().scrollTop;i>1?this.doc().scrollTop=i-1:this.doc().scrollTop=i+1,this.doc().scrollTop=i}),t.register("go_progression",W.moduleName,(i,o)=>{const a=i;if(a<0||a>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=this.doc().offsetHeight*a,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_id",W.moduleName,(i,o)=>{const a=e.document.getElementById(i);if(!a){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=a.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_text",W.moduleName,(i,o)=>{let a;Array.isArray(i)&&(i.length>1&&(a=i[1]),i=i[0]);const s=oe.deserialize(i),l=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:s,locations:a?new C({otherLocations:new Map([["cssSelector",a]])}):void 0}));if(!l){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=l.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_start",W.moduleName,(i,o)=>{if(this.doc().scrollTop===0)return o(!1);this.doc().scrollTop=0,this.reportProgress(),o(!0)}),t.register("go_end",W.moduleName,(i,o)=>{if(this.doc().scrollTop===this.doc().scrollHeight-this.doc().offsetHeight)return o(!1);this.doc().scrollTop=this.doc().scrollHeight-this.doc().offsetHeight,this.reportProgress(),o(!0)}),t.register("unfocus",W.moduleName,(i,o)=>{z(this.wnd),o(!0)}),t.register("scroll_protection",W.moduleName,(i,o)=>{this.enableScrollProtection(),o(!0)}),t.register(["go_next","go_prev"],W.moduleName,(i,o)=>o(!1)),t.register("focus",W.moduleName,(i,o)=>{this.reportProgress(),o(!0)}),t.register("first_visible_locator",W.moduleName,(i,o)=>{const a=lt(e,!0);this.comms.send("first_visible_locator",a.serialize()),o(!0)}),t.log("ScrollSnapper Mounted"),!0}unmount(e,t){return t.unregisterAll(W.moduleName),this.resizeObserver.disconnect(),this.handleScroll&&e.removeEventListener("scroll",this.handleScroll),e.document.getElementById(ti)?.remove(),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isScrollProtectionEnabled=!1),t.log("ScrollSnapper Unmounted"),!0}};W.moduleName="scroll_snapper";let Mt=W;const B=class B extends be{constructor(){super(...arguments),this.patternAnalyzer=null,this.lastScrollTime=0,this.isScrollProtectionEnabled=!1,this.initialScrollHandled=!1,this.isScrolling=!1,this.lastScrollTop=0,this.isResizing=!1,this.resizeDebounce=null,this.handleScroll=e=>{if(this.comms.ready&&!this.isResizing){if(!this.initialScrollHandled){this.lastScrollTop=this.doc().scrollTop,this.initialScrollHandled=!0,this.reportProgress();return}this.isScrolling||(this.isScrolling=!0,this.wnd.requestAnimationFrame(()=>{this.reportProgress();const t=this.doc().scrollTop,n=t-this.lastScrollTop;if(this.lastScrollTop=t,this.isScrollProtectionEnabled&&Math.abs(n)>5){const i=Date.now(),o=i-(this.lastScrollTime||i);if(this.patternAnalyzer&&this.patternAnalyzer.analyze(n>0?"down":"up",Math.abs(n),o)){const s=e.target&&"tagName"in e.target?{tagName:e.target.tagName}:null;this.comms?.send("content_protection",{type:"suspicious_scrolling",timestamp:Date.now(),scrollDelta:n,scrollDirection:n>0?"down":"up",targetElement:s})}this.lastScrollTime=i}this.comms.send("scroll",n),this.isScrolling=!1}))}}}doc(){return this.wnd.document.scrollingElement}reportProgress(){if(!this.comms.ready)return;const e=Math.ceil(this.doc().scrollTop),t=this.doc().scrollHeight,n=this.wnd.innerHeight,i=Math.max(0,Math.min(1,e/t)),o=Math.max(0,Math.min(1,(e+n)/t));this.comms.send("progress",{start:i,end:o})}enableScrollProtection(){this.patternAnalyzer||(this.patternAnalyzer=new ct(Tt),this.isScrollProtectionEnabled=!0,this.comms?.log("Scroll protection enabled"))}mount(e,t){return this.wnd=e,this.comms=t,this.initialScrollHandled=!1,this.lastScrollTop=0,this.isResizing=!1,this.resizeDebounce&&(this.wnd.clearTimeout(this.resizeDebounce),this.resizeDebounce=null),this.resizeObserver=new ResizeObserver(()=>{this.resizeDebounce&&this.wnd.clearTimeout(this.resizeDebounce),this.isResizing=!0,this.resizeDebounce=this.wnd.setTimeout(()=>{this.isResizing=!1,this.resizeDebounce=null,this.reportProgress()},50)}),this.resizeObserver.observe(e.document.body),e.addEventListener("scroll",this.handleScroll,{passive:!0}),t.register("force_webkit_recalc",B.moduleName,()=>{At(this.wnd);const n=this.doc().scrollTop;n>1?this.doc().scrollTop=n-1:this.doc().scrollTop=n+1,this.doc().scrollTop=n}),t.register("go_progression",B.moduleName,(n,i)=>{const o=n;if(o<0||o>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),i(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=this.doc().offsetHeight*o,this.reportProgress(),z(this.wnd),i(!0)})}),t.register("go_id",B.moduleName,(n,i)=>{const o=e.document.getElementById(n);if(!o){i(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=o.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),i(!0)})}),t.register("go_text",B.moduleName,(n,i)=>{let o;Array.isArray(n)&&(n.length>1&&(o=n[1]),n=n[0]);const a=oe.deserialize(n),s=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:a,locations:o?new C({otherLocations:new Map([["cssSelector",o]])}):void 0}));if(!s){i(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollTop=s.getBoundingClientRect().top+e.scrollY-e.innerHeight/2,this.reportProgress(),z(this.wnd),i(!0)})}),t.register("go_start",B.moduleName,(n,i)=>{if(this.doc().scrollTop===0)return i(!1);this.doc().scrollTop=0,this.reportProgress(),i(!0)}),t.register("go_end",B.moduleName,(n,i)=>{if(this.doc().scrollTop===this.doc().scrollHeight-this.doc().offsetHeight)return i(!1);this.doc().scrollTop=this.doc().scrollHeight-this.doc().offsetHeight,this.reportProgress(),i(!0)}),t.register("unfocus",B.moduleName,(n,i)=>{z(this.wnd),i(!0)}),t.register("scroll_protection",B.moduleName,(n,i)=>{this.enableScrollProtection(),i(!0)}),t.register(["go_next","go_prev"],B.moduleName,(n,i)=>i(!1)),t.register("focus",B.moduleName,(n,i)=>{this.reportProgress(),i(!0)}),t.register("first_visible_locator",B.moduleName,(n,i)=>{const o=lt(e,!0);t.send("first_visible_locator",o.serialize()),i(!0)}),t.log("WebPubSnapper Mounted"),!0}unmount(e,t){return t.unregisterAll(B.moduleName),this.resizeObserver.disconnect(),this.handleScroll&&e.removeEventListener("scroll",this.handleScroll),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isScrollProtectionEnabled=!1),t.log("WebPubSnapper Unmounted"),!0}};B.moduleName="webpub_snapper";let It=B;class Do{constructor(e,t){this.window=e,this.copyHistory=[],this.lastSelectionLength=0,this.lastSelectionTime=0,this.options=t}cleanupOldHistory(e){this.copyHistory=this.copyHistory.filter(n=>e-n.timestamp<1e4),this.copyHistory.length>this.options.historySize&&(this.copyHistory=this.copyHistory.slice(-this.options.historySize))}isSuspiciousPattern(e){return this.copyHistory.length<3?!1:this.copyHistory.filter(i=>e-i.timestamp<2e3).length>=3?!0:this.copyHistory.slice().sort((i,o)=>i.timestamp-o.timestamp).every((i,o,a)=>o===0?!0:i.length>a[o-1].length*1.5)}shouldAllowCopy(e){if(!this.options.enabled)return!0;const t=this.window.getSelection();if(!t)return!0;const i=t.toString().length,o=this.window.document.body.innerText.length,a=Date.now();if(this.cleanupOldHistory(a),i<this.options.minThreshold)return this.copyHistory.push({timestamp:a,length:i,wasBlocked:!1}),!0;const l=a-this.lastSelectionTime<100&&i>this.lastSelectionLength*1.5,c=Math.min(o*this.options.maxSelectionPercent,this.options.absoluteMaxChars),h=this.isSuspiciousPattern(a),u=i>c||l||h;return this.copyHistory.push({timestamp:a,length:i,wasBlocked:u}),u?(e?.preventDefault(),!1):(this.lastSelectionLength=i,this.lastSelectionTime=a,!0)}destroy(){this.lastSelectionLength=0,this.lastSelectionTime=0,this.copyHistory=[],this.options.enabled=!1}}class Wo{constructor(e=Qn){this.options=e,this.events=[],this.selectionStartTime=0,this.lastSelectionTime=0,this.lastSelectionPosition=0,this.selectionPatterns=[],this.lastSelectedText=""}analyze(e){if(!e)return this.clear(),!1;const t=e.toString();if(t.length===0)return this.clear(),!1;if(e.type!=="Range"||!e.rangeCount)return!1;const n=Date.now();if(t.length<=50||t===this.lastSelectedText)return!1;if(this.selectionStartTime===0)return this.selectionStartTime=n,this.lastSelectedText=t,!1;if(n-this.selectionStartTime<500)return!1;n-this.lastSelectionTime>1e3&&(this.lastSelectionTime=n),this.selectionStartTime===0&&(this.selectionStartTime=n),this.lastSelectedText=t;const o=this.analyzeSelectionPattern(e,n);return this.cleanup(n),o}analyzeSelectionPattern(e,t){if(!e.rangeCount)return!1;const n=e.getRangeAt(0),i=n.toString(),o=(t-this.selectionStartTime)/1e3;if(i.length/Math.max(1,o)>this.options.maxSelectionsPerSecond)return!0;const s=n.startOffset,l=Math.abs(s-this.lastSelectionPosition);return this.selectionPatterns.push(l),this.selectionPatterns.length>this.options.historySize&&(this.selectionPatterns.shift(),this.calculateVariance(this.selectionPatterns)<this.options.minVariance)?!0:(this.lastSelectionPosition=s,!1)}calculateVariance(e){if(e.length===0)return 0;const t=e.reduce((n,i)=>n+i,0)/e.length;return e.reduce((n,i)=>n+Math.pow(i-t,2),0)/e.length}cleanup(e){this.events=this.events.filter(t=>e-t.timestamp<=1e3)}clear(){this.events=[],this.selectionStartTime=0,this.lastSelectionTime=0,this.lastSelectionPosition=0,this.selectionPatterns=[],this.lastSelectedText=""}}class ni{match(e,t){for(const n of t)if(this.matchesCombo(e,n))return!0;return!1}matchesCombo(e,t){return e.keyCode===t.keyCode&&this.matchesModifier(e.ctrlKey,t.ctrl)&&this.matchesModifier(e.shiftKey,t.shift)&&this.matchesModifier(e.altKey,t.alt)&&this.matchesModifier(e.metaKey,t.meta)}matchesModifier(e,t){return t===void 0?!e:e===t}createKeyHandler(e,t){return n=>{this.match(n,e)&&(n.preventDefault(),n.stopPropagation(),t(n))}}createActivityEvent(e,t,n,i){let o,a;if(i){const s=i.getSelection(),l=s?.toString()||"",h=(l&&s?.rangeCount?s.getRangeAt(0)?.getClientRects():null)?.[0];h&&l&&(o={text:l,x:h.x,y:h.y,width:h.width,height:h.height});const u=i.document.activeElement;u&&u!==i.document.body&&(a=Ut(u)?.outerHTML)}return{type:t,timestamp:Date.now(),key:e.key,code:e.code,keyCode:e.keyCode,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,metaKey:e.metaKey,targetFrameSrc:n,selectedText:o,interactiveElement:a}}createKeyboardHandlers(e,t,n,i){const o=[];return t.forEach(a=>{o.push(...a.keyCombos.map(s=>({...s,handler:l=>{const c=a.type,h=this.createActivityEvent(l,c,e,i);n(h)}})))}),o}createUnifiedHandler(e,t,n,i){const o=this.createKeyboardHandlers(e,t,n,i);return a=>{for(const s of o)if(this.match(a,[s])){const l=s.suppressOnInteractiveElement;if(l){const c=(i?.document??document).activeElement;if(Array.isArray(l)?l.some(h=>c?.matches(h)):Jn(c))return}a.preventDefault(),a.stopPropagation(),s.handler(a);return}}}}const me=class me extends ye{constructor(){super(...arguments),this.configApplied=!1,this.cleanupCallbacks=[],this.pointerMoved=!1,this.isContextMenuEnabled=!1,this.isDragAndDropEnabled=!1,this.isSelectionMonitoringEnabled=!1,this.isBulkCopyProtectionEnabled=!1,this.selectionAnalyzer=null,this.currentSelection=null,this.bulkCopyProtector=null,this.keyManager=new ni,this.keyDownHandler=null,this.preventBulkCopy=e=>{if(!this.isBulkCopyProtectionEnabled||!this.bulkCopyProtector)return!0;if(!this.bulkCopyProtector.shouldAllowCopy(e)){e.preventDefault();const t=this.wnd.getSelection(),n=t?.toString()||"",o=(n?t?.getRangeAt(0)?.getClientRects():null)?.[0],a={type:"bulk_copy",timestamp:Date.now(),clipboardTypes:e.clipboardData?.types?[...e.clipboardData.types]:[],selectedText:o?{text:n,x:o.x,y:o.y,width:o.width,height:o.height}:void 0,selectionLength:n.length,targetFrameSrc:this.wnd.location.href};return this.comms?.send("content_protection",a),!1}return!0},this.handleSelection=e=>{if(!this.isSelectionMonitoringEnabled||!this.wnd||!this.selectionAnalyzer)return;const t=this.wnd.getSelection();if(t){if(this.currentSelection=t.toString(),this.selectionAnalyzer.analyze(t)&&this.currentSelection){const i=this.wnd.getSelection(),o=i?.toString()||"",s=(o&&i?.rangeCount?i.getRangeAt(0)?.getClientRects():null)?.[0],l={type:"suspicious_selection",timestamp:Date.now(),selectionLength:o.length,selectedText:{text:o,x:s?.x??0,y:s?.y??0,width:s?.width??0,height:s?.height??0},eventType:e?.type||"selectionchange",targetFrameSrc:this.wnd.location.href};this.comms?.send("content_protection",l)}}else this.currentSelection=null},this.onDragOver=e=>{this.isDragAndDropEnabled&&(e.preventDefault(),e.stopPropagation())},this.onDragStart=e=>{if(this.isDragAndDropEnabled){e.preventDefault();const t={type:"drag_detected",timestamp:Date.now(),dataTransferTypes:e.dataTransfer?.types?[...e.dataTransfer.types]:[],targetFrameSrc:this.wnd.location.href};return this.comms?.send("content_protection",t),!1}else return!0},this.onDrop=e=>{if(this.isDragAndDropEnabled){e.preventDefault();const t=e.dataTransfer,n={type:"drop_detected",timestamp:Date.now(),dataTransferTypes:t?.types?[...t.types]:[],fileCount:t?.files?.length||0,targetFrameSrc:this.wnd.location.href};return this.comms?.send("content_protection",n),!1}else return!0},this.onContext=e=>{if(this.isContextMenuEnabled){e.preventDefault();const t=this.wnd.getSelection(),n=t?.toString()||"",o=(n&&t?.rangeCount?t.getRangeAt(0)?.getClientRects():null)?.[0],a={timestamp:Date.now(),clientX:e.clientX,clientY:e.clientY,...o&&{selectedText:{text:n,x:o.x,y:o.y,width:o.width,height:o.height}},targetFrameSrc:this.wnd.location.href};this.comms?.send("context_menu",a)}},this.onPointerUp=this.onPointUp.bind(this),this.onPointerMove=this.onPointMove.bind(this),this.onPointerDown=this.onPointDown.bind(this),this.onClicker=this.onClick.bind(this)}addContextMenuPrevention(){this.isContextMenuEnabled||!this.wnd||(this.wnd.document.addEventListener("contextmenu",this.onContext),this.isContextMenuEnabled=!0)}removeContextMenuPrevention(){!this.isContextMenuEnabled||!this.wnd||(this.wnd.document.removeEventListener("contextmenu",this.onContext),this.isContextMenuEnabled=!1)}addDragAndDropPrevention(){this.isDragAndDropEnabled||!this.wnd||(this.wnd.document.addEventListener("dragstart",this.onDragStart),this.wnd.document.addEventListener("dragover",this.onDragOver),this.wnd.document.addEventListener("drop",this.onDrop),this.isDragAndDropEnabled=!0)}removeDragAndDropPrevention(){!this.isDragAndDropEnabled||!this.wnd||(this.wnd.document.removeEventListener("dragstart",this.onDragStart),this.wnd.document.removeEventListener("dragover",this.onDragOver),this.wnd.document.removeEventListener("drop",this.onDrop),this.isDragAndDropEnabled=!1)}enableKeyboardPeripherals(e=[]){this.disableKeyboardPeripherals();const t=n=>{this.comms?.send("keyboard_peripherals",n)};this.keyDownHandler=this.keyManager.createUnifiedHandler(this.wnd.location.href,e,t,this.wnd),this.wnd&&this.wnd.document.addEventListener("keydown",this.keyDownHandler,{capture:!0})}disableKeyboardPeripherals(){this.wnd&&this.keyDownHandler&&(this.wnd.document.removeEventListener("keydown",this.keyDownHandler,{capture:!0}),this.keyDownHandler=null)}addBulkCopyProtection(e={}){if(this.isBulkCopyProtectionEnabled||!this.wnd)return;const t=Io,n=e?{...t,...e}:t;this.bulkCopyProtector=new Do(this.wnd,n),this.wnd.document.addEventListener("copy",this.preventBulkCopy,!0),this.wnd.document.addEventListener("cut",this.preventBulkCopy,!0),this.isBulkCopyProtectionEnabled=!0}removeBulkCopyProtection(){!this.isBulkCopyProtectionEnabled||!this.wnd||(this.wnd.document.removeEventListener("copy",this.preventBulkCopy,!0),this.wnd.document.removeEventListener("cut",this.preventBulkCopy,!0),this.bulkCopyProtector?.destroy(),this.bulkCopyProtector=null,this.isBulkCopyProtectionEnabled=!1)}addSelectionMonitoring(e){if(this.isSelectionMonitoringEnabled||!this.wnd)return;const t=e||Qn;this.selectionAnalyzer=new Wo(t),this.wnd.document.addEventListener("selectionchange",this.handleSelection),this.isSelectionMonitoringEnabled=!0}removeSelectionMonitoring(){!this.isSelectionMonitoringEnabled||!this.wnd||(this.wnd.document.removeEventListener("selectionchange",this.handleSelection),this.selectionAnalyzer?.clear(),this.selectionAnalyzer=null,this.isSelectionMonitoringEnabled=!1)}onPointUp(e){const t=this.wnd.getSelection();if(t&&t.toString()?.length>0){const i=t.getRangeAt(0)?.getClientRects();if(!i||i.length===0)return;const o=i[0],a={text:t.toString(),x:o.x,y:o.y,width:o.width,height:o.height,targetFrameSrc:this.wnd?.location?.href};this.comms.send("text_selected",a)}if(this.pointerMoved){this.pointerMoved=!1;return}if(!t?.isCollapsed||!e.isPrimary)return;const n=this.wnd.devicePixelRatio;e.preventDefault(),this.comms.send(e.pointerType==="touch"?"tap":"click",{defaultPrevented:e.defaultPrevented,x:e.clientX*n,y:e.clientY*n,targetFrameSrc:this.wnd.location.href,targetElement:e.target.outerHTML,interactiveElement:Ut(e.target)?.outerHTML,cssSelector:this.wnd._readium_cssSelectorGenerator.getCssSelector(e.target)}),this.pointerMoved=!1}onPointMove(e){if(e.movementY!==void 0&&e.movementX!==void 0){(Math.abs(e.movementX)>1||Math.abs(e.movementY)>1)&&(this.pointerMoved=!0);return}this.pointerMoved=!0}onPointDown(){this.pointerMoved=!1}onClick(e){if(e.preventDefault(),!e.isTrusted){const t=new PointerEvent("pointerup",{isPrimary:!0,pointerType:"mouse",clientX:e.clientX,clientY:e.clientY});Object.defineProperty(t,"target",{writable:!1,value:e.target}),Object.defineProperty(t,"defaultPrevented",{writable:!1,value:e.defaultPrevented}),this.onPointUp(t)}}registerProtectionHandlers(){this.comms?.register("peripherals_protection",me.moduleName,(e,t)=>{const n=e;if(!this.configApplied){if(this.configApplied=!0,n.monitorSelection){const i=typeof n.monitorSelection=="boolean"?void 0:n.monitorSelection;this.addSelectionMonitoring(i),this.comms?.log("Selection monitoring enabled")}typeof n.protectCopy=="object"?(this.addBulkCopyProtection({enabled:!0,...n.protectCopy}),this.comms?.log("Copy protection enabled (limited)")):n.protectCopy===!0&&(this.addBulkCopyProtection({enabled:!0,maxSelectionPercent:0,minThreshold:0,absoluteMaxChars:0}),this.comms?.log("Copy protection enabled")),n.disableContextMenu&&(this.addContextMenuPrevention(),this.comms?.log("Context menu protection enabled")),n.disableDragAndDrop&&(this.addDragAndDropPrevention(),this.comms?.log("Drag and drop protection enabled"))}t(!0)}),this.comms?.register("unfocus",me.moduleName,(e,t)=>{this.disableKeyboardPeripherals(),t(!0)}),this.comms?.register("keyboard_peripherals",me.moduleName,(e,t)=>{const n=e;n&&n.length>0&&(this.enableKeyboardPeripherals(n),this.comms?.log(`Keyboard peripherals enabled: ${n.map(i=>i.type).join(", ")}`)),t(!0)})}mount(e,t){return this.wnd=e,this.comms=t,this.registerProtectionHandlers(),e.document.addEventListener("pointerdown",this.onPointerDown),e.document.addEventListener("pointerup",this.onPointerUp),e.document.addEventListener("pointermove",this.onPointerMove),e.document.addEventListener("click",this.onClicker),t.log("Peripherals Mounted"),!0}unmount(e,t){return this.removeBulkCopyProtection(),this.removeSelectionMonitoring(),this.removeContextMenuPrevention(),this.removeDragAndDropPrevention(),this.disableKeyboardPeripherals(),this.cleanupCallbacks.forEach(n=>n()),this.cleanupCallbacks=[],e.document.removeEventListener("pointerdown",this.onPointerDown),e.document.removeEventListener("pointerup",this.onPointerUp),e.document.removeEventListener("pointermove",this.onPointerMove),e.document.removeEventListener("click",this.onClicker),t.unregisterAll(me.moduleName),this.configApplied=!1,t.log("Peripherals Unmounted"),!0}};me.moduleName="peripherals";let Ht=me;const Je=class Je extends ye{constructor(){super(...arguments),this.mediaPlayingCount=0,this.allAnimations=new Set}wndOnErr(e){this.comms?.send("error",{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno})}unblock(e){for(e._readium_blockEvents=!1;e._readium_blockedEvents?.length>0;){const t=e._readium_blockedEvents.shift();switch(t[0]){case 0:Reflect.apply(t[1],t[2],t[3]);break;case 1:const n=t[1],i=t[2];e.removeEventListener(n.type,e._readium_eventBlocker,!0);const o=new Event(n.type,{bubbles:n.bubbles,cancelable:n.cancelable});i?i.dispatchEvent(o):e.dispatchEvent(o);break}}}onMediaPlayEvent(){this.mediaPlayingCount++,this.comms?.send("media_play",this.mediaPlayingCount)}onMediaPauseEvent(){this.mediaPlayingCount>0&&this.mediaPlayingCount--,this.comms?.send("media_pause",this.mediaPlayingCount)}pauseAllMedia(e){const t=e.document.querySelectorAll("audio,video");for(let n=0;n<t.length;n++)t[n].pause()}mount(e,t){this.comms=t,e.addEventListener("error",this.wndOnErr,!1),Reflect.defineProperty(e.navigator,"epubReadingSystem",{value:{name:"readium-ts-toolkit",version:"2.5.6",hasFeature:(i,o="")=>{switch(i){case"dom-manipulation":return!0;case"layout-changes":return!0;case"touch-events":return!0;case"mouse-events":return!0;case"keyboard-events":return!0;case"spine-scripting":return!0;case"embedded-web-content":return!0;default:return!1}}},writable:!1}),"getAnimations"in e.document&&e.document.getAnimations().forEach(i=>{i.cancel(),this.allAnimations.add(i)}),t.register("activate",Je.moduleName,(i,o)=>{this.allAnimations.forEach(a=>{a.cancel(),a.play()}),o(!0)}),t.register("unfocus",Je.moduleName,(i,o)=>{this.pauseAllMedia(e),this.allAnimations.forEach(a=>a.pause()),o(!0)});const n=e.document.querySelectorAll("audio,video");for(let i=0;i<n.length;i++){const o=n[i];o.addEventListener("play",this.onMediaPlayEvent,{passive:!0}),o.addEventListener("pause",this.onMediaPauseEvent,{passive:!0})}return t.log("Setup Mounted"),!0}unmount(e,t){return e.removeEventListener("error",this.wndOnErr),e.removeEventListener("play",this.onMediaPlayEvent),e.removeEventListener("pause",this.onMediaPauseEvent),this.allAnimations.forEach(n=>n.cancel()),this.allAnimations.clear(),t.log("Setup Unmounted"),!0}};Je.moduleName="setup";let ht=Je;const ii="readium-viewport",ne=class ne extends ht{onViewportWidthChanged(e){const t=e.target;Oe(t,"--RS__viewportWidth",`${t.innerWidth}px`)}mount(e,t){if(!super.mount(e,t))return!1;const n=e.document.createElement("meta");return n.dataset.readium="true",n.setAttribute("name","viewport"),n.setAttribute("id",ii),n.setAttribute("content","width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no"),e.document.head.appendChild(n),e.addEventListener("orientationchange",this.onViewportWidthChanged),e.addEventListener("resize",this.onViewportWidthChanged),this.onViewportWidthChanged({target:e}),t.register("get_properties",ne.moduleName,(i,o)=>{kt(e),o(!0)}),t.register("update_properties",ne.moduleName,(i,o)=>{i["--RS__viewportWidth"]=`${e.innerWidth}px`,Bn(e,i),o(!0)}),t.register("set_property",ne.moduleName,(i,o)=>{const a=i;Oe(e,a[0],a[1]),o(!0)}),t.register("remove_property",ne.moduleName,(i,o)=>{rt(e,i),o(!0)}),t.register("activate",ne.moduleName,(i,o)=>{this.unblock(e),o(!0)}),t.log("ReflowableSetup Mounted"),!0}unmount(e,t){return t.unregisterAll(ne.moduleName),e.document.head.querySelector(`#${ii}`)?.remove(),e.removeEventListener("orientationchange",this.onViewportWidthChanged),t.log("ReflowableSetup Unmounted"),super.unmount(e,t)}};ne.moduleName="reflowable_setup";let Dt=ne;const oi="readium-fixed-style",Z=class Z extends ht{mount(e,t){if(!super.mount(e,t))return!1;e.navigator.epubReadingSystem&&(e.navigator.epubReadingSystem.layoutStyle="paginated");const n=e.document.createElement("style");return n.id=oi,n.dataset.readium="true",n.textContent=`
|
|
59
59
|
html, body {
|
|
60
60
|
text-size-adjust: none;
|
|
61
61
|
-ms-text-size-adjust: none;
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
min-height: 100%;
|
|
68
68
|
|
|
69
69
|
/*cursor: var() TODO*/
|
|
70
|
-
}`,e.document.head.appendChild(n),t.register("set_property",Z.moduleName,(i,o)=>{const a=i;Oe(e,a[0],a[1]),o(!0)}),t.register("remove_property",Z.moduleName,(i,o)=>{rt(e,i),o(!0)}),t.register("first_visible_locator",Z.moduleName,(i,o)=>o(!1)),t.register("unfocus",Z.moduleName,(i,o)=>{z(e),o(!0)}),t.register(["focus","go_next","go_prev","go_id","go_end","go_start","go_text","go_progression"],Z.moduleName,(i,o)=>o(!0)),t.register("activate",Z.moduleName,(i,o)=>{this.unblock(e),o(!0)}),t.log("FixedSetup Mounted"),!0}unmount(e,t){return t.unregisterAll(Z.moduleName),e.document.getElementById(oi)?.remove(),t.log("FixedSetup Unmounted"),super.unmount(e,t)}};Z.moduleName="fixed_setup";let Wt=Z;const ie=class ie extends
|
|
70
|
+
}`,e.document.head.appendChild(n),t.register("set_property",Z.moduleName,(i,o)=>{const a=i;Oe(e,a[0],a[1]),o(!0)}),t.register("remove_property",Z.moduleName,(i,o)=>{rt(e,i),o(!0)}),t.register("first_visible_locator",Z.moduleName,(i,o)=>o(!1)),t.register("unfocus",Z.moduleName,(i,o)=>{z(e),o(!0)}),t.register(["focus","go_next","go_prev","go_id","go_end","go_start","go_text","go_progression"],Z.moduleName,(i,o)=>o(!0)),t.register("activate",Z.moduleName,(i,o)=>{this.unblock(e),o(!0)}),t.log("FixedSetup Mounted"),!0}unmount(e,t){return t.unregisterAll(Z.moduleName),e.document.getElementById(oi)?.remove(),t.log("FixedSetup Unmounted"),super.unmount(e,t)}};Z.moduleName="fixed_setup";let Wt=Z;const ie=class ie extends ye{wndOnErr(e){this.comms?.send("error",{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno})}mount(e,t){return this.comms=t,e.addEventListener("error",this.wndOnErr,!1),t.register("get_properties",ie.moduleName,(n,i)=>{kt(e),i(!0)}),t.register("update_properties",ie.moduleName,(n,i)=>{Bn(e,n),i(!0)}),t.register("set_property",ie.moduleName,(n,i)=>{const o=n;Oe(e,o[0],o[1]),i(!0)}),t.register("remove_property",ie.moduleName,(n,i)=>{rt(e,n),i(!0)}),t.register("activate",ie.moduleName,(n,i)=>{i(!0)}),t.log("WebPubSetup Mounted"),!0}unmount(e,t){return t.unregisterAll(ie.moduleName),e.removeEventListener("error",this.wndOnErr),t.log("WebPubSetup Unmounted"),!0}};ie.moduleName="webpub_setup";let Bt=ie,Bo=(ae=class extends ye{constructor(){super(...arguments),this.styleElement=null,this.beforePrintHandler=null,this.configApplied=!1}setupPrintProtection(e,t){if(!t.disable)return;const n=e.document.createElement("style");n.textContent=`
|
|
71
71
|
@media print {
|
|
72
72
|
body * {
|
|
73
73
|
display: none !important;
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
transform: translateY(-50%);
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
`,e.document.head.appendChild(n),this.styleElement=n,this.beforePrintHandler=i=>(i.preventDefault(),!1),e.addEventListener("beforeprint",this.beforePrintHandler)}registerPrintHandlers(){this.comms?.register("print_protection",ae.moduleName,e=>{const t=e;return this.configApplied||(this.configApplied=!0,this.setupPrintProtection(this.wnd,t),this.comms?.log("Print protection configuration applied")),!0})}mount(e,t){return this.wnd=e,this.comms=t,this.registerPrintHandlers(),!0}unmount(e,t){return this.beforePrintHandler&&(e.removeEventListener("beforeprint",this.beforePrintHandler),this.beforePrintHandler=null),this.styleElement?.parentNode&&(this.styleElement.parentNode.removeChild(this.styleElement),this.styleElement=null),this.comms?.unregisterAll(ae.moduleName),this.configApplied=!1,!0}},ae.moduleName="print_protection",ae);const ri="readium-cjk-vertical-snapper-style",j=class j extends
|
|
84
|
+
`,e.document.head.appendChild(n),this.styleElement=n,this.beforePrintHandler=i=>(i.preventDefault(),!1),e.addEventListener("beforeprint",this.beforePrintHandler)}registerPrintHandlers(){this.comms?.register("print_protection",ae.moduleName,e=>{const t=e;return this.configApplied||(this.configApplied=!0,this.setupPrintProtection(this.wnd,t),this.comms?.log("Print protection configuration applied")),!0})}mount(e,t){return this.wnd=e,this.comms=t,this.registerPrintHandlers(),!0}unmount(e,t){return this.beforePrintHandler&&(e.removeEventListener("beforeprint",this.beforePrintHandler),this.beforePrintHandler=null),this.styleElement?.parentNode&&(this.styleElement.parentNode.removeChild(this.styleElement),this.styleElement=null),this.comms?.unregisterAll(ae.moduleName),this.configApplied=!1,!0}},ae.moduleName="print_protection",ae);const ri="readium-cjk-vertical-snapper-style",j=class j extends be{constructor(){super(...arguments),this.patternAnalyzer=null,this.lastScrollTime=0,this.isScrollProtectionEnabled=!1,this.initialScrollHandled=!1,this.isScrolling=!1,this.lastScrollLeft=0,this.isResizing=!1,this.resizeDebounce=null,this.verticalLR=!1,this.handleScroll=e=>{if(this.comms.ready&&!this.isResizing){if(!this.initialScrollHandled){this.lastScrollLeft=Math.abs(this.doc().scrollLeft),this.initialScrollHandled=!0,this.reportProgress();return}this.isScrolling||(this.isScrolling=!0,this.wnd.requestAnimationFrame(()=>{this.reportProgress();const t=Math.abs(this.doc().scrollLeft),n=t-this.lastScrollLeft;if(this.lastScrollLeft=t,this.isScrollProtectionEnabled&&Math.abs(n)>5){const i=Date.now(),o=i-(this.lastScrollTime||i);if(this.patternAnalyzer&&this.patternAnalyzer.analyze(n>0?"down":"up",Math.abs(n),o)){const s=e.target&&"tagName"in e.target?{tagName:e.target.tagName}:null;this.comms?.send("content_protection",{type:"suspicious_scrolling",timestamp:Date.now(),scrollDelta:n,scrollDirection:n>0?"left":"right",targetElement:s})}this.lastScrollTime=i}this.comms.send("scroll",n),this.isScrolling=!1}))}}}doc(){return this.wnd.document.scrollingElement}scrollable(){return Math.max(0,this.doc().scrollWidth-this.wnd.innerWidth)}reportProgress(){if(!this.comms.ready)return;const e=this.doc().scrollWidth,t=this.wnd.innerWidth,n=Math.max(1,e-t),i=Math.abs(this.doc().scrollLeft),o=Math.max(0,Math.min(1,i/n)),a=Math.max(0,Math.min(1,(i+t)/e));this.comms.send("progress",{start:o,end:a})}enableScrollProtection(){this.patternAnalyzer||(this.patternAnalyzer=new ct(Tt),this.isScrollProtectionEnabled=!0,this.comms?.log("Scroll protection enabled"))}mount(e,t){this.wnd=e,this.comms=t,this.initialScrollHandled=!1,this.lastScrollLeft=0,this.isResizing=!1,this.verticalLR=Fo(e),this.resizeDebounce&&(this.wnd.clearTimeout(this.resizeDebounce),this.resizeDebounce=null),e.navigator.epubReadingSystem&&(e.navigator.epubReadingSystem.layoutStyle="scrolling");const n=e.document.createElement("style");return n.dataset.readium="true",n.id=ri,n.textContent=`
|
|
85
85
|
* {
|
|
86
86
|
scrollbar-width: none;
|
|
87
87
|
}
|
|
@@ -92,8 +92,8 @@
|
|
|
92
92
|
overflow-x: auto !important;
|
|
93
93
|
overflow-y: hidden !important;
|
|
94
94
|
}
|
|
95
|
-
`,e.document.head.appendChild(n),this.resizeObserver=new ResizeObserver(()=>{this.resizeDebounce&&this.wnd.clearTimeout(this.resizeDebounce),this.isResizing=!0,this.resizeDebounce=this.wnd.setTimeout(()=>{this.isResizing=!1,this.resizeDebounce=null,this.reportProgress()},50)}),this.resizeObserver.observe(e.document.body),e.addEventListener("scroll",this.handleScroll,{passive:!0}),t.register("force_webkit_recalc",j.moduleName,()=>{At(this.wnd);const i=this.doc().scrollLeft;this.verticalLR?this.doc().scrollLeft=i>1?i-1:i+1:this.doc().scrollLeft=i<-1?i+1:i-1,this.doc().scrollLeft=i}),t.register("go_progression",j.moduleName,(i,o)=>{const a=i;if(a<0||a>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),o(!1);return}this.wnd.requestAnimationFrame(()=>{const s=this.scrollable()*a;this.doc().scrollLeft=this.verticalLR?s:-s,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_id",j.moduleName,(i,o)=>{const a=e.document.getElementById(i);if(!a){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollLeft+=a.getBoundingClientRect().left-e.innerWidth/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_text",j.moduleName,(i,o)=>{let a;Array.isArray(i)&&(i.length>1&&(a=i[1]),i=i[0]);const s=oe.deserialize(i),l=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:s,locations:a?new C({otherLocations:new Map([["cssSelector",a]])}):void 0}));if(!l){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollLeft+=l.getBoundingClientRect().left-e.innerWidth/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_start",j.moduleName,(i,o)=>{if(this.doc().scrollLeft===0)return o(!1);this.doc().scrollLeft=0,this.reportProgress(),o(!0)}),t.register("go_end",j.moduleName,(i,o)=>{if(Math.abs(this.doc().scrollLeft)===this.scrollable())return o(!1);this.doc().scrollLeft=this.verticalLR?this.scrollable():-this.scrollable(),this.reportProgress(),o(!0)}),t.register(["go_next","go_prev"],j.moduleName,(i,o)=>o(!1)),t.register("unfocus",j.moduleName,(i,o)=>{z(this.wnd),o(!0)}),t.register("scroll_protection",j.moduleName,(i,o)=>{this.enableScrollProtection(),o(!0)}),t.register("focus",j.moduleName,(i,o)=>{this.reportProgress(),o(!0)}),t.register("first_visible_locator",j.moduleName,(i,o)=>{const a=lt(e,!0);this.comms.send("first_visible_locator",a.serialize()),o(!0)}),t.log("CJKVerticalSnapper Mounted"),!0}unmount(e,t){return t.unregisterAll(j.moduleName),this.resizeObserver.disconnect(),this.handleScroll&&e.removeEventListener("scroll",this.handleScroll),e.document.getElementById(ri)?.remove(),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isScrollProtectionEnabled=!1),t.log("CJKVerticalSnapper Unmounted"),!0}};j.moduleName="cjk_vertical_snapper";let jt=j;const jo=["fixed_setup","decorator","peripherals","print_protection"],Go=["reflowable_setup","decorator","peripherals","column_snapper","scroll_snapper","cjk_vertical_snapper","print_protection"],Vo=["webpub_setup","webpub_snapper","decorator","peripherals","print_protection"],Gt=new Map([Wt,Dt,Bt,It,Ht,Ot,Nt,Mt,jt,Bo].map(r=>[r.moduleName,r]));class
|
|
96
|
-
`:"";let a=e.documentElement.outerHTML;return i+a}}const qo=1e4;class ve{constructor(e,t){this.registry=new Map,this._ready=!1,this.listenerBuffer=[],this.handler=this.handle.bind(this),this.wnd=e,this.origin=t;try{this.channelId=window.crypto.randomUUID()}catch{this.channelId=Rt()}this.gc=setInterval(()=>{this.registry.forEach((n,i)=>{performance.now()-n.time>qo&&(console.warn(i,"event for",n.key,"was never handled!"),this.registry.delete(i))})},5e3),window.addEventListener("message",this.handler),this.send("_ping",void 0)}set listener(e){this.listenerBuffer.length>0&&this.listenerBuffer.forEach(t=>e(t[0],t[1])),this.listenerBuffer=[],this._listener=e}clearListener(){typeof this._listener=="function"&&(this._listener=void 0)}halt(){this._ready=!1,window.removeEventListener("message",this.handler),clearInterval(this.gc),this._listener=void 0,this.registry.clear()}resume(){window.addEventListener("message",this.handler),this._ready=!0}handle(e){const t=e.data;if(!t._readium){console.warn("Ignoring",t);return}if(t._channel===this.channelId)switch(t.key){case"_ack":{if(!t.id)return;const n=this.registry.get(t.id);if(!n)return;this.registry.delete(t.id),n.cb(!!t.data);return}case"_pong":this._ready=!0;default:{if(!this.ready)return;typeof this._listener=="function"?this._listener(t.key,t.data):this.listenerBuffer.push([t.key,t.data])}}}get ready(){return this._ready}send(e,t,n,i=!1,o=[]){const a=Rt();return n&&this.registry.set(a,{cb:n,time:performance.now(),key:e}),this.wnd.postMessage({_readium:ge,_channel:this.channelId,id:a,data:t,key:e,strict:i},"/",o),a}}const Jo={oldStyleTf:"'Iowan Old Style', Sitka, 'Sitka Text', Palatino, 'Book Antiqua', 'URW Palladio L', P052, serif"},Zo=16,li=Jo.oldStyleTf;class we{constructor(e){this._optimalLineLength=null,this._canvas=document.createElement("canvas"),this._optimalChars=e.optimalChars,this._minChars=e.minChars,this._maxChars=e.maxChars,this._baseFontSize=e.baseFontSize||Zo,this._fontFace=e.fontFace||li,this._sample=e.sample||null,this._padding=e.padding??0,this._letterSpacing=e.letterSpacing?Math.round(e.letterSpacing*this._baseFontSize):0,this._wordSpacing=e.wordSpacing?Math.round(e.wordSpacing*this._baseFontSize):0,this._isCJK=e.isCJK||!1,this._getRelative=e.getRelative||!1,this._minDivider=this._minChars&&this._minChars<this._optimalChars?this._optimalChars/this._minChars:this._minChars===null?null:1,this._maxMultiplier=this._maxChars&&this._maxChars>this._optimalChars?this._maxChars/this._optimalChars:this._maxChars===null?null:1,this._approximatedWordSpaces=we.approximateWordSpaces(this._optimalChars,this._sample)}updateMultipliers(){this._minDivider=this._minChars&&this._minChars<this._optimalChars?this._optimalChars/this._minChars:this._minChars===null?null:1,this._maxMultiplier=this._maxChars&&this._maxChars>this._optimalChars?this._maxChars/this._optimalChars:this._maxChars===null?null:1}update(e){e.optimalChars&&(this._optimalChars=e.optimalChars),e.minChars!==void 0&&(this._minChars=e.minChars),e.maxChars!==void 0&&(this._maxChars=e.maxChars),e.baseFontSize&&(this._baseFontSize=e.baseFontSize),e.fontFace!==void 0&&(this._fontFace=e.fontFace||li),e.letterSpacing&&(this._letterSpacing=e.letterSpacing),e.wordSpacing&&(this._wordSpacing=e.wordSpacing),e.isCJK!=null&&(this._isCJK=e.isCJK),e.padding!==void 0&&(this._padding=e.padding??0),e.getRelative&&(this._getRelative=e.getRelative),e.sample&&(this._sample=e.sample,this._approximatedWordSpaces=we.approximateWordSpaces(this._optimalChars,this._sample)),this.updateMultipliers(),this._optimalLineLength=this.getOptimalLineLength()}get baseFontSize(){return this._baseFontSize}get minimalLineLength(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),this._minDivider!==null?Math.round(this._optimalLineLength/this._minDivider+this._padding)/(this._getRelative?this._baseFontSize:1):null}get maximalLineLength(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),this._maxMultiplier!==null?Math.round(this._optimalLineLength*this._maxMultiplier+this._padding)/(this._getRelative?this._baseFontSize:1):null}get optimalLineLength(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),Math.round(this._optimalLineLength+this._padding)/(this._getRelative?this._baseFontSize:1)}get all(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),{min:this.minimalLineLength,max:this.maximalLineLength,optimal:this.optimalLineLength,baseFontSize:this._baseFontSize}}static approximateWordSpaces(e,t){let n=0;if(t&&t.length>=e){const i=t.match(/([\s]+)/gi);n=(i?i.length:0)*(e/t.length)}return n}getLineLengthFallback(){const e=this._letterSpacing*(this._optimalChars-1),t=this._wordSpacing*this._approximatedWordSpaces;return this._optimalChars*(this._baseFontSize*.5)+e+t}getOptimalLineLength(){if(this._fontFace){if(typeof this._fontFace=="string")return this.measureText(this._fontFace);{const e=new FontFace(this._fontFace.name,`url(${this._fontFace.url})`);e.load().then(()=>(document.fonts.add(e),this.measureText(e.family)),t=>{})}}return this.getLineLengthFallback()}measureText(e){const t=this._canvas.getContext("2d");if(t&&e){let n=this._isCJK?"水".repeat(this._optimalChars):"0".repeat(this._optimalChars);if(t.font=`${this._baseFontSize}px ${e}`,this._sample&&this._sample.length>=this._optimalChars&&(n=this._sample.slice(0,this._optimalChars)),Object.hasOwn(t,"letterSpacing")&&Object.hasOwn(t,"wordSpacing"))return t.letterSpacing=this._letterSpacing.toString()+"px",t.wordSpacing=this._wordSpacing.toString()+"px",t.measureText(n).width;{const i=this._letterSpacing*(this._optimalChars-1),o=this._wordSpacing*we.approximateWordSpaces(this._optimalChars,this._sample);return t.measureText(n).width+i+o}}else return this.getLineLengthFallback()}}const ci=()=>typeof navigator>"u"?"":navigator.userAgent||"",hi=()=>typeof navigator>"u"?void 0:navigator.userAgentData||void 0;class di{constructor(){const e=hi(),t=ci(),n=o=>(typeof o=="string"||typeof o=="number")&&o?String(o).replace(/_/g,".").split(".").map(a=>parseInt(a)||0):[],i=(o="")=>{if(!o)return[];const a=new RegExp("^.*"+o+"[ :\\/]?(\\d+([\\._]\\d+)*).*$");return a.test(t)?n(t.replace(a,"$1")):[]};this.OS=(o=>(/(macOS|Mac OS X)/.test(t)?(/\(iP(hone|od touch);/.test(t)&&(o.iOS=i("CPU (?:iPhone )?OS ")),/\(iPad;/.test(t)?o.iOS=o.iPadOS=i("CPU (?:iPhone )?OS "):/(macOS|Mac OS X) \d/.test(t)&&(document.ontouchend!==void 0?o.iOS=o.iPadOS=i():o.macOS=i("(?:macOS|Mac OS X) "))):/Windows( NT)? \d/.test(t)?o.Windows=(a=>a[0]!==6||!a[1]?a:a[1]===1?[7]:a[1]===2?[8]:[8,1])(i("Windows(?: NT)?")):/Android \d/.test(t)?o.Android=i("Android"):/CrOS/.test(t)?o.ChromeOS=i():/X11;/.test(t)&&(o.Linux=i()),o))({}),e&&e.getHighEntropyValues(["architecture","model","platform","platformVersion","uaFullVersion"]).then(o=>(a=>{const s=o.platform,l=o.platformVersion;if(!(!s||!l)){if(/^i(OS|P(hone|od touch))$/.test(s))a.iOS=n(l);else if(/^iPad(OS)?$/.test(s))a.iOS=a.iPadOS=n(l);else if(/^(macOS|(Mac )?OS X|Mac(Intel)?)$/.test(s))document.ontouchend!==void 0?a.iOS=a.iPadOS=n():a.macOS=n(l);else if(/^(Microsoft )?Windows$/.test(s))a.Windows=n(l);else if(/^(Google )?Android$/.test(s))a.Android=n(l);else if(/^((Google )?Chrome OS|CrOS)$/.test(s))a.ChromeOS=n(l);else if(/^(Linux|Ubuntu|X11)$/.test(s))a.Linux=n(l);else return;Object.keys(this.OS).forEach(c=>delete this.OS[c]),Object.assign(this.OS,a)}})({})),this.UA=(o=>{let a=!1;if(e&&Array.isArray(e.brands)){const s=e.brands.reduce((l,c)=>(l[c.brand]=[c.version*1],l),{});s["Google Chrome"]?(a=!0,o.Blink=o.Chromium=s.Chromium||[],o.Chrome=s["Google Chrome"]):s["Microsoft Edge"]?(a=!0,o.Blink=o.Chromium=s.Chromium||[],o.Edge=s["Microsoft Edge"]):s.Opera&&(a=!0,o.Blink=o.Chromium=s.Chromium||[],o.Opera=s.Opera)}return a||(/ Gecko\/\d/.test(t)?(o.Gecko=i("rv"),/ Waterfox\/\d/.test(t)?o.Waterfox=i("Waterfox"):/ Firefox\/\d/.test(t)&&(o.Firefox=i("Firefox"))):/ Edge\/\d/.test(t)?(o.EdgeHTML=i("Edge"),o.Edge=o.EdgeHTML):/ Chrom(ium|e)\/\d/.test(t)?(o.Blink=o.Chromium=(s=>s[0]?s:i("Chrome"))(i("Chromium")),/ EdgA?\/\d/.test(t)?o.Edge=(s=>s[0]?s:i("Edg"))(i("EdgA")):/ OPR\/\d/.test(t)?o.Opera=i("OPR"):/ Vivaldi\/\d/.test(t)?o.Vivaldi=i("Vivaldi"):/ Silk\/\d/.test(t)?o.Silk=i("Silk"):/ UCBrowser\/\d/.test(t)?o.UCBrowser=i("UCBrowser"):/ Phoebe\/\d/.test(t)?o.Phoebe=i("Phoebe"):o.Chrome=(s=>s[0]?s:o.Chromium)(i("Chrome"))):/ AppleWebKit\/\d/.test(t)?(o.WebKit=i("AppleWebKit"),/ CriOS \d/.test(t)?o.Chrome=i("CriOS"):/ FxiOS \d/.test(t)?o.Firefox=i("FxiOS"):/ EdgiOS\/\d/.test(t)?o.Edge=i("EdgiOS"):/ Version\/\d/.test(t)&&(o.Safari=i("Version"))):/ Trident\/\d/.test(t)&&(o.Trident=i("Trident"),o.InternetExplorer=(s=>s[0]?s:i("MSIE"))(i("rv")))),/[\[; ]FB(AN|_IAB)\//.test(t)&&(o.Facebook=i("FBAV")),/ Line\/\d/.test(t)&&(o.LINE=i("Line")),o})({}),this.Env={get:()=>[this.OS,this.UA].reduce((o,a)=>{for(const s in a)a[s]&&o.push(s);return o},[])}}}class Qo extends di{get iOSRequest(){const e=hi(),t=ci();if(this.OS.iOS&&!this.OS.iPadOS)return"mobile";if(this.OS.iPadOS)return/\(iPad;/.test(t)||e&&/^iPad(OS)?$/.test(e.platform)?"mobile":"desktop"}}const Y=new di,L=new Qo;function se(r){const e=r.languages?.[0]?.toLowerCase(),t=r.readingProgression;if(e){if(e.startsWith("zh")||e.startsWith("ja")||e.startsWith("ko"))return t===M.rtl?"cjk-vertical":"cjk-horizontal";if(e.startsWith("mn-mong"))return"mongolian-vertical";if(e.startsWith("ar")||e.startsWith("fa")||e.startsWith("he"))return"rtl"}return"ltr"}class Kt{constructor(e,t){this.config=e,this.onUpdate=t,this.unsubs=[],this.conditionValues=new Map}setup(){let e=!0;this.config.forEach(t=>t.keyCombos.forEach(n=>{if(n.condition){const i=n.condition.subscribe(o=>{this.conditionValues.set(n,o),e||this.onUpdate(this.buildSerializable())});this.unsubs.push(i)}})),e=!1,this.onUpdate(this.buildSerializable())}buildSerializable(){return this.config.map(e=>({...e,keyCombos:e.keyCombos.filter(t=>!t.condition||this.conditionValues.get(t)===!0).map(({condition:t,...n})=>n)})).filter(e=>e.keyCombos.length>0)}destroy(){this.unsubs.forEach(e=>e()),this.unsubs=[],this.conditionValues.clear()}}class ui{constructor(e,t={},n=[]){this.hidden=!0,this.destroyed=!1,this.currModules=[],this.frame=document.createElement("iframe"),this.frame.classList.add("readium-navigator-iframe"),this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.position="absolute",this.frame.style.pointerEvents="none",this.frame.style.transition="visibility 0s, opacity 0.1s linear",this.frame.style.backgroundColor="#FFFFFF",this.source=e,this.contentProtectionConfig={...t},this.keyboardPeripheralsConfig=[...n]}async load(e=[]){return new Promise((t,n)=>{if(this.loader){const i=this.frame.contentWindow;if([...this.currModules].sort().join("|")===[...e].sort().join("|")){try{t(i)}catch{}return}this.comms?.halt(),this.loader.destroy(),this.loader=new be(i,e),this.currModules=e,this.comms=void 0;try{t(i)}catch{}return}this.frame.onload=()=>{const i=this.frame.contentWindow;this.loader=new be(i,e),this.currModules=e;try{t(i)}catch{}},this.frame.onerror=i=>{try{n(i)}catch{}},this.frame.contentWindow.location.replace(this.source)})}applyContentProtection(){this.comms||this.comms.resume(),this.comms.send("peripherals_protection",this.contentProtectionConfig),this.keyboardPeripheralsConfig&&this.keyboardPeripheralsConfig.length>0&&(this.conditionBridge?.destroy(),this.conditionBridge=new Kt(this.keyboardPeripheralsConfig,e=>{e.length>0&&this.comms.send("keyboard_peripherals",e)}),this.conditionBridge.setup()),this.contentProtectionConfig.monitorScrollingExperimental&&this.comms.send("scroll_protection",{}),this.contentProtectionConfig.protectPrinting?.disable&&this.comms.send("print_protection",this.contentProtectionConfig.protectPrinting)}async destroy(){this.conditionBridge?.destroy(),await this.hide(),this.loader?.destroy(),this.frame.remove(),this.destroyed=!0}async hide(){if(!this.destroyed){if(this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.pointerEvents="none",this.hidden=!0,this.frame.parentElement)return this.comms===void 0||!this.comms.ready?void 0:new Promise((e,t)=>{this.comms?.send("unfocus",void 0,n=>{this.comms?.halt(),e()})});this.comms?.halt()}}async show(e){if(this.destroyed)throw Error("Trying to show frame when it doesn't exist");if(!this.frame.parentElement)throw Error("Trying to show frame that is not attached to the DOM");return this.comms?this.comms.resume():this.comms=new ve(this.frame.contentWindow,this.source),new Promise((t,n)=>{this.comms?.send("activate",void 0,()=>{this.comms?.send("focus",void 0,()=>{this.applyContentProtection();const i=()=>{this.frame.style.removeProperty("visibility"),this.frame.style.removeProperty("aria-hidden"),this.frame.style.removeProperty("opacity"),this.frame.style.removeProperty("pointer-events"),this.hidden=!1,Y.UA.WebKit&&this.comms?.send("force_webkit_recalc",void 0),t()};e!==void 0?this.comms?.send("go_progression",e,i):i()})})})}setCSSProperties(e){this.destroyed||!this.frame.contentWindow||(this.hidden&&(this.comms?this.comms?.resume():this.comms=new ve(this.frame.contentWindow,this.source)),this.comms?.send("update_properties",e),this.hidden&&this.comms?.halt())}get iframe(){if(this.destroyed)throw Error("Trying to use frame when it doesn't exist");return this.frame}get realSize(){if(this.destroyed)throw Error("Trying to use frame client rect when it doesn't exist");return this.frame.getBoundingClientRect()}get window(){if(this.destroyed||!this.frame.contentWindow)throw Error("Trying to use frame window when it doesn't exist");return this.frame.contentWindow}get msg(){return this.comms}get ldr(){return this.loader}}class mi{constructor(e,t,n,i={},o=[]){this.pool=new Map,this.blobs=new Map,this.inprogress=new Map,this.pendingUpdates=new Map,this.injector=null,this.container=e,this.currentCssProperties=t,this.injector=n,this.contentProtectionConfig=i,this.keyboardPeripheralsConfig=[...o]}async destroy(){let e=this.inprogress.values(),t=e.next();const n=[];for(;t.value;)n.push(t.value),t=e.next();n.length>0&&await Promise.allSettled(n),this.inprogress.clear();let i=this.pool.values(),o=i.next();for(;o.value;)await o.value.destroy(),o=i.next();this.pool.clear(),this.blobs.forEach(a=>{this.injector?.releaseBlobUrl?.(a),URL.revokeObjectURL(a)}),this.blobs.clear(),this.injector?.dispose(),this.container.childNodes.forEach(a=>{(a.nodeType===Node.ELEMENT_NODE||a.nodeType===Node.TEXT_NODE)&&a.remove()})}async update(e,t,n){const i=e.readingOrder.items;let o=i.findIndex(l=>l.href===t.href);if(o<0)throw Error(`Locator not found in reading order: ${t.href}`);const a=i[o].href;this.inprogress.has(a)&&await this.inprogress.get(a);const s=new Promise(async(l,c)=>{const h=[],u=[];e.readingOrder.items.forEach((d,p)=>{p!==o&&p!==o-1&&p!==o+1&&(h.includes(d.href)||h.push(d.href)),p===o&&(u.includes(d.href)||u.push(d.href))}),h.forEach(async d=>{u.includes(d)||this.pool.has(d)&&(await this.pool.get(d)?.destroy(),this.pool.delete(d))}),this.currentBaseURL!==void 0&&e.baseURL!==this.currentBaseURL&&(this.blobs.forEach(d=>{this.injector?.releaseBlobUrl?.(d),URL.revokeObjectURL(d)}),this.blobs.clear()),this.currentBaseURL=e.baseURL;const m=async d=>{if(this.pendingUpdates.has(d)&&this.pendingUpdates.get(d)?.inPool===!1){const P=this.blobs.get(d);P&&(this.injector?.releaseBlobUrl?.(P),URL.revokeObjectURL(P),this.blobs.delete(d),this.pendingUpdates.delete(d))}if(this.pool.has(d)){const P=this.pool.get(d);if(!this.blobs.has(d))await P.destroy(),this.pool.delete(d),this.pendingUpdates.delete(d);else{await P.load(n);return}}const p=e.readingOrder.findWithHref(d);if(!p)return;if(!this.blobs.has(d)){const A=await new si(e,this.currentBaseURL||"",p,{cssProperties:this.currentCssProperties,injector:this.injector}).build();this.blobs.set(d,A)}const b=new ui(this.blobs.get(d),this.contentProtectionConfig,this.keyboardPeripheralsConfig);d!==a&&await b.hide(),this.container.appendChild(b.iframe),await b.load(n),this.pool.set(d,b)};try{await Promise.all(u.map(d=>m(d)))}catch(d){c(d)}const f=this.pool.get(a);f?.source!==this._currentFrame?.source&&(await this._currentFrame?.hide(),f&&await f.load(n),f&&await f.show(t.locations.progression),this._currentFrame=f),l()});this.inprogress.set(a,s),await s,this.inprogress.delete(a)}setCSSProperties(e){if(!((n,i)=>{const o=Object.keys(n),a=Object.keys(i);if(o.length!==a.length)return!1;for(const s of o)if(n[s]!==i[s])return!1;return!0})(this.currentCssProperties||{},e)){this.currentCssProperties=e,this.pool.forEach(n=>{n.setCSSProperties(e)});for(const n of this.blobs.keys())this.pendingUpdates.set(n,{inPool:this.pool.has(n)})}}get currentFrames(){return[this._currentFrame]}get currentBounds(){const e={x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0,toJSON(){return this}};return this.currentFrames.forEach(t=>{if(!t)return;const n=t.realSize;e.x=Math.min(e.x,n.x),e.y=Math.min(e.y,n.y),e.width+=n.width,e.height=Math.max(e.height,n.height),e.top=Math.min(e.top,n.top),e.right=Math.min(e.right,n.right),e.bottom=Math.min(e.bottom,n.bottom),e.left=Math.min(e.left,n.left)}),e}}var Xt,pi;function er(){if(pi)return Xt;pi=1;function r(i){if(typeof i!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(i))}function e(i,o){for(var a="",s=0,l=-1,c=0,h,u=0;u<=i.length;++u){if(u<i.length)h=i.charCodeAt(u);else{if(h===47)break;h=47}if(h===47){if(!(l===u-1||c===1))if(l!==u-1&&c===2){if(a.length<2||s!==2||a.charCodeAt(a.length-1)!==46||a.charCodeAt(a.length-2)!==46){if(a.length>2){var m=a.lastIndexOf("/");if(m!==a.length-1){m===-1?(a="",s=0):(a=a.slice(0,m),s=a.length-1-a.lastIndexOf("/")),l=u,c=0;continue}}else if(a.length===2||a.length===1){a="",s=0,l=u,c=0;continue}}o&&(a.length>0?a+="/..":a="..",s=2)}else a.length>0?a+="/"+i.slice(l+1,u):a=i.slice(l+1,u),s=u-l-1;l=u,c=0}else h===46&&c!==-1?++c:c=-1}return a}function t(i,o){var a=o.dir||o.root,s=o.base||(o.name||"")+(o.ext||"");return a?a===o.root?a+s:a+i+s:s}var n={resolve:function(){for(var o="",a=!1,s,l=arguments.length-1;l>=-1&&!a;l--){var c;l>=0?c=arguments[l]:(s===void 0&&(s=process.cwd()),c=s),r(c),c.length!==0&&(o=c+"/"+o,a=c.charCodeAt(0)===47)}return o=e(o,!a),a?o.length>0?"/"+o:"/":o.length>0?o:"."},normalize:function(o){if(r(o),o.length===0)return".";var a=o.charCodeAt(0)===47,s=o.charCodeAt(o.length-1)===47;return o=e(o,!a),o.length===0&&!a&&(o="."),o.length>0&&s&&(o+="/"),a?"/"+o:o},isAbsolute:function(o){return r(o),o.length>0&&o.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var o,a=0;a<arguments.length;++a){var s=arguments[a];r(s),s.length>0&&(o===void 0?o=s:o+="/"+s)}return o===void 0?".":n.normalize(o)},relative:function(o,a){if(r(o),r(a),o===a||(o=n.resolve(o),a=n.resolve(a),o===a))return"";for(var s=1;s<o.length&&o.charCodeAt(s)===47;++s);for(var l=o.length,c=l-s,h=1;h<a.length&&a.charCodeAt(h)===47;++h);for(var u=a.length,m=u-h,f=c<m?c:m,d=-1,p=0;p<=f;++p){if(p===f){if(m>f){if(a.charCodeAt(h+p)===47)return a.slice(h+p+1);if(p===0)return a.slice(h+p)}else c>f&&(o.charCodeAt(s+p)===47?d=p:p===0&&(d=0));break}var b=o.charCodeAt(s+p),P=a.charCodeAt(h+p);if(b!==P)break;b===47&&(d=p)}var A="";for(p=s+d+1;p<=l;++p)(p===l||o.charCodeAt(p)===47)&&(A.length===0?A+="..":A+="/..");return A.length>0?A+a.slice(h+d):(h+=d,a.charCodeAt(h)===47&&++h,a.slice(h))},_makeLong:function(o){return o},dirname:function(o){if(r(o),o.length===0)return".";for(var a=o.charCodeAt(0),s=a===47,l=-1,c=!0,h=o.length-1;h>=1;--h)if(a=o.charCodeAt(h),a===47){if(!c){l=h;break}}else c=!1;return l===-1?s?"/":".":s&&l===1?"//":o.slice(0,l)},basename:function(o,a){if(a!==void 0&&typeof a!="string")throw new TypeError('"ext" argument must be a string');r(o);var s=0,l=-1,c=!0,h;if(a!==void 0&&a.length>0&&a.length<=o.length){if(a.length===o.length&&a===o)return"";var u=a.length-1,m=-1;for(h=o.length-1;h>=0;--h){var f=o.charCodeAt(h);if(f===47){if(!c){s=h+1;break}}else m===-1&&(c=!1,m=h+1),u>=0&&(f===a.charCodeAt(u)?--u===-1&&(l=h):(u=-1,l=m))}return s===l?l=m:l===-1&&(l=o.length),o.slice(s,l)}else{for(h=o.length-1;h>=0;--h)if(o.charCodeAt(h)===47){if(!c){s=h+1;break}}else l===-1&&(c=!1,l=h+1);return l===-1?"":o.slice(s,l)}},extname:function(o){r(o);for(var a=-1,s=0,l=-1,c=!0,h=0,u=o.length-1;u>=0;--u){var m=o.charCodeAt(u);if(m===47){if(!c){s=u+1;break}continue}l===-1&&(c=!1,l=u+1),m===46?a===-1?a=u:h!==1&&(h=1):a!==-1&&(h=-1)}return a===-1||l===-1||h===0||h===1&&a===l-1&&a===s+1?"":o.slice(a,l)},format:function(o){if(o===null||typeof o!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof o);return t("/",o)},parse:function(o){r(o);var a={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return a;var s=o.charCodeAt(0),l=s===47,c;l?(a.root="/",c=1):c=0;for(var h=-1,u=0,m=-1,f=!0,d=o.length-1,p=0;d>=c;--d){if(s=o.charCodeAt(d),s===47){if(!f){u=d+1;break}continue}m===-1&&(f=!1,m=d+1),s===46?h===-1?h=d:p!==1&&(p=1):h!==-1&&(p=-1)}return h===-1||m===-1||p===0||p===1&&h===m-1&&h===u+1?m!==-1&&(u===0&&l?a.base=a.name=o.slice(1,m):a.base=a.name=o.slice(u,m)):(u===0&&l?(a.name=o.slice(1,h),a.base=o.slice(1,m)):(a.name=o.slice(u,h),a.base=o.slice(u,m)),a.ext=o.slice(h,m)),u>0?a.dir=o.slice(0,u-1):l&&(a.dir="/"),a},sep:"/",delimiter:":",win32:null,posix:null};return n.posix=n,Xt=n,Xt}var dt=er();const tr={experimentalHeaderFiltering:{description:"Attempts to filter out paragraphs that are implicitly headings or part of headers",scope:"RS",value:"readium-experimentalHeaderFiltering-on"},experimentalZoom:{description:"Attempts to filter out elements that are sized using viewport units and should not be scaled directly e.g. tables, images, iframes, etc.",scope:"RS",value:"readium-experimentalZoom-on"}},nr={ltr:{disabled:[],added:[]},rtl:{disabled:["bodyHyphens","a11yNormalize","letterSpacing"],added:[]},"cjk-horizontal":{disabled:["textAlign","bodyHyphens","a11yNormalize","ligatures","paraIndent","wordSpacing"],added:["noRuby"]},"cjk-vertical":{disabled:["colCount","textAlign","bodyHyphens","a11yNormalize","ligatures","paraIndent","wordSpacing"],added:["noRuby"]}},ir={latin:{baseFontFamily:"var(--RS__oldStyleTf)",lineHeightCompensation:1},am:{baseFontFamily:"Kefa, Nyala, Roboto, Noto, 'Noto Sans Ethiopic', serif",lineHeightCompensation:1.167},ar:{baseFontFamily:"'Geeza Pro', 'Arabic Typesetting', Roboto, Noto, 'Noto Naskh Arabic', 'Times New Roman', serif"},bn:{baseFontFamily:"'Kohinoor Bangla', 'Bangla Sangam MN', Vrinda, Roboto, Noto, 'Noto Sans Bengali', sans-serif",lineHeightCompensation:1.067},bo:{baseFontFamily:"Kailasa, 'Microsoft Himalaya', Roboto, Noto, 'Noto Sans Tibetan', sans-serif"},chr:{baseFontFamily:"'Plantagenet Cherokee', Roboto, Noto, 'Noto Sans Cherokee'",lineHeightCompensation:1.167},fa:{baseFontFamily:"'Geeza Pro', 'Arabic Typesetting', Roboto, Noto, 'Noto Naskh Arabic', 'Times New Roman', serif"},gu:{baseFontFamily:"'Gujarati Sangam MN', 'Nirmala UI', Shruti, Roboto, Noto, 'Noto Sans Gujarati', sans-serif",lineHeightCompensation:1.167},he:{baseFontFamily:"'New Peninim MT', 'Arial Hebrew', Gisha, 'Times New Roman', Roboto, Noto, 'Noto Sans Hebrew', sans-serif",lineHeightCompensation:1.1},hi:{baseFontFamily:"'Kohinoor Devanagari', 'Devanagari Sangam MN', Kokila, 'Nirmala UI', Roboto, Noto, 'Noto Sans Devanagari', sans-serif",lineHeightCompensation:1.1},hy:{baseFontFamily:"Mshtakan, Sylfaen, Roboto, Noto, 'Noto Serif Armenian', serif"},iu:{baseFontFamily:"'Euphemia UCAS', Euphemia, Roboto, Noto, 'Noto Sans Canadian Aboriginal', sans-serif"},ja:{baseFontFamily:"YuGothic, 'Hiragino Maru Gothic ProN', 'Hiragino Sans', 'Yu Gothic UI', 'Meiryo UI', 'MS Gothic', Roboto, Noto, 'Noto Sans CJK JP', sans-serif",lineHeightCompensation:1.167},km:{baseFontFamily:"'Khmer Sangam MN', 'Leelawadee UI', 'Khmer UI', Roboto, Noto, 'Noto Sans Khmer', sans-serif",lineHeightCompensation:1.067},kn:{baseFontFamily:"'Kannada Sangam MN', 'Nirmala UI', Tunga, Roboto, Noto, 'Noto Sans Kannada', sans-serif",lineHeightCompensation:1.1},ko:{baseFontFamily:"'Nanum Gothic', 'Apple SD Gothic Neo', 'Malgun Gothic', Roboto, Noto, 'Noto Sans CJK KR', sans-serif",lineHeightCompensation:1.167},lo:{baseFontFamily:"'Lao Sangam MN', 'Leelawadee UI', 'Lao UI', Roboto, Noto, 'Noto Sans Lao', sans-serif"},ml:{baseFontFamily:"'Malayalam Sangam MN', 'Nirmala UI', Kartika, Roboto, Noto, 'Noto Sans Malayalam', sans-serif",lineHeightCompensation:1.067},or:{baseFontFamily:"'Oriya Sangam MN', 'Nirmala UI', Kalinga, Roboto, Noto, 'Noto Sans Oriya', sans-serif",lineHeightCompensation:1.167},pa:{baseFontFamily:"'Gurmukhi MN', 'Nirmala UI', Kartika, Roboto, Noto, 'Noto Sans Gurmukhi', sans-serif",lineHeightCompensation:1.1},si:{baseFontFamily:"'Sinhala Sangam MN', 'Nirmala UI', 'Iskoola Pota', Roboto, Noto, 'Noto Sans Sinhala', sans-serif",lineHeightCompensation:1.167},ta:{baseFontFamily:"'Tamil Sangam MN', 'Nirmala UI', Latha, Roboto, Noto, 'Noto Sans Tamil', sans-serif",lineHeightCompensation:1.067},te:{baseFontFamily:"'Kohinoor Telugu', 'Telugu Sangam MN', 'Nirmala UI', Gautami, Roboto, Noto, 'Noto Sans Telugu', sans-serif"},th:{baseFontFamily:"Thonburi, 'Leelawadee UI', 'Cordia New', Roboto, Noto, 'Noto Sans Thai', sans-serif",lineHeightCompensation:1.067},zh:{baseFontFamily:"'方体', 'PingFang SC', '黑体', 'Heiti SC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK SC', sans-serif",lineHeightCompensation:1.167},"zh-Hant":{baseFontFamily:"'方體', 'PingFang TC', '黑體', 'Heiti TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK TC', sans-serif",lineHeightCompensation:1.167},"zh-TW":{baseFontFamily:"'方體', 'PingFang TC', '黑體', 'Heiti TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK TC', sans-serif",lineHeightCompensation:1.167},"zh-HK":{baseFontFamily:"'方體', 'PingFang HK', '方體', 'PingFang TC', '黑體', 'Heiti TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK TC', sans-serif",lineHeightCompensation:1.167}},ut=tr,or=nr,rr=ir;var J=(r=>(r.start="start",r.left="left",r.right="right",r.justify="justify",r))(J||{});const le={range:[0,100],step:1},Ue={range:[.7,4],step:.05},ee={range:[100,1e3],step:100},Te={range:[50,250],step:10},Ne={range:[0,1],step:.125},Me={range:[1,2.5],step:.1},ce={range:[20,100],step:1},Ie={range:[0,3],step:.25},He={range:[0,3],step:.25},De={range:[0,2],step:.125},We={range:[.7,4],step:.05},Be={range:[0,1],step:.1},je={range:[.5,4],step:.1},te={range:[5,60],step:5};class Ge{constructor(){}toFlag(e){return`readium-${e}-on`}toUnitless(e){return e.toString()}toPercentage(e,t=!1){return t||e>0&&e<=1?`${Math.round(e*100)}%`:`${e}%`}toVw(e){const t=Math.round(e*100);return`${Math.min(t,100)}vw`}toVh(e){const t=Math.round(e*100);return`${Math.min(t,100)}vh`}toPx(e){return`${e}px`}toRem(e){return`${e}rem`}}class Yt extends Ge{constructor(e){super(),this.a11yNormalize=e.a11yNormalize??null,this.bodyHyphens=e.bodyHyphens??null,this.fontFamily=e.fontFamily??null,this.fontWeight=e.fontWeight??null,this.iOSPatch=e.iOSPatch??null,this.iPadOSPatch=e.iPadOSPatch??null,this.letterSpacing=e.letterSpacing??null,this.ligatures=e.ligatures??null,this.lineHeight=e.lineHeight??null,this.noRuby=e.noRuby??null,this.paraIndent=e.paraIndent??null,this.paraSpacing=e.paraSpacing??null,this.textAlign=e.textAlign??null,this.wordSpacing=e.wordSpacing??null,this.zoom=e.zoom??null}toCSSProperties(){const e={};return this.a11yNormalize&&(e["--USER__a11yNormalize"]=this.toFlag("a11y")),this.bodyHyphens&&(e["--USER__bodyHyphens"]=this.bodyHyphens),this.fontFamily&&(e["--USER__fontFamily"]=this.fontFamily),this.fontWeight!=null&&(e["--USER__fontWeight"]=this.toUnitless(this.fontWeight)),this.iOSPatch&&(e["--USER__iOSPatch"]=this.toFlag("iOSPatch")),this.iPadOSPatch&&(e["--USER__iPadOSPatch"]=this.toFlag("iPadOSPatch")),this.letterSpacing!=null&&(e["--USER__letterSpacing"]=this.toRem(this.letterSpacing)),this.ligatures&&(e["--USER__ligatures"]=this.ligatures),this.lineHeight!=null&&(e["--USER__lineHeight"]=this.toUnitless(this.lineHeight)),this.noRuby&&(e["--USER__noRuby"]=this.toFlag("noRuby")),this.paraIndent!=null&&(e["--USER__paraIndent"]=this.toRem(this.paraIndent)),this.paraSpacing!=null&&(e["--USER__paraSpacing"]=this.toRem(this.paraSpacing)),this.textAlign&&(e["--USER__textAlign"]=this.textAlign),this.wordSpacing!=null&&(e["--USER__wordSpacing"]=this.toRem(this.wordSpacing)),this.zoom!==null&&(e["--USER__zoom"]=this.toPercentage(this.zoom,!0)),e}}class gi extends Ge{constructor(e){super(),this.experiments=e.experiments??null}toCSSProperties(){const e={};return this.experiments&&this.experiments.forEach(t=>{e["--RS__"+t]=ut[t].value}),e}}class fi{constructor(e){this.rsProperties=e.rsProperties,this.userProperties=e.userProperties}update(e){e.experiments&&(this.rsProperties.experiments=e.experiments);const t={a11yNormalize:e.textNormalization,bodyHyphens:typeof e.hyphens!="boolean"?null:e.hyphens?"auto":"none",fontFamily:e.fontFamily,fontWeight:e.fontWeight,iOSPatch:e.iOSPatch,iPadOSPatch:e.iPadOSPatch,letterSpacing:e.letterSpacing,ligatures:typeof e.ligatures!="boolean"?null:e.ligatures?"common-ligatures":"none",lineHeight:e.lineHeight,noRuby:e.noRuby,paraIndent:e.paragraphIndent,paraSpacing:e.paragraphSpacing,textAlign:e.textAlign,wordSpacing:e.wordSpacing,zoom:e.zoom};this.userProperties=new Yt(t)}}function yi(r,e){return r==null||e==null||r<=e?r:void 0}function _i(r,e){return r==null||e==null||r>=e?r:void 0}function I(r){return typeof r=="string"?r:r===null?null:void 0}function R(r){return typeof r=="boolean"||r==null?r:void 0}function Ve(r,e){if(r!==void 0)return r===null?null:e[r]!==void 0?r:void 0}function he(r){return typeof r=="boolean"||typeof r=="number"&&r>=0?r:r===null?null:void 0}function v(r){if(r!==void 0)return r===null?null:r<0?void 0:r}function T(r,e){if(r===void 0)return;if(r===null)return null;const t=Math.min(...e),n=Math.max(...e);return r>=t&&r<=n?r:void 0}function mt(r,e){return r===void 0?e:r}function qt(r){if(r!==void 0)return r===null?null:r.filter(e=>e in ut)}class Re{constructor(e={}){this.fontFamily=I(e.fontFamily),this.fontWeight=T(e.fontWeight,ee.range),this.hyphens=R(e.hyphens),this.iOSPatch=R(e.iOSPatch),this.iPadOSPatch=R(e.iPadOSPatch),this.letterSpacing=v(e.letterSpacing),this.ligatures=R(e.ligatures),this.lineHeight=v(e.lineHeight),this.noRuby=R(e.noRuby),this.paragraphIndent=v(e.paragraphIndent),this.paragraphSpacing=v(e.paragraphSpacing),this.textAlign=Ve(e.textAlign,J),this.textNormalization=R(e.textNormalization),this.wordSpacing=v(e.wordSpacing),this.zoom=T(e.zoom,We.range)}static serialize(e){const{...t}=e;return JSON.stringify(t)}static deserialize(e){try{const t=JSON.parse(e);return new Re(t)}catch(t){return console.error("Failed to deserialize preferences:",t),null}}merging(e){const t={...this};for(const n of Object.keys(e))e[n]!==void 0&&(t[n]=e[n]);return new Re(t)}}class Si{constructor(e){this.fontFamily=I(e.fontFamily)||null,this.fontWeight=T(e.fontWeight,ee.range)||null,this.hyphens=R(e.hyphens)??null,this.iOSPatch=e.iOSPatch===!1?!1:(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile",this.iPadOSPatch=e.iPadOSPatch===!1?!1:L.OS.iPadOS&&L.iOSRequest==="desktop",this.letterSpacing=v(e.letterSpacing)||null,this.ligatures=R(e.ligatures)??null,this.lineHeight=v(e.lineHeight)||null,this.noRuby=R(e.noRuby)??!1,this.paragraphIndent=v(e.paragraphIndent)??null,this.paragraphSpacing=v(e.paragraphSpacing)??null,this.textAlign=Ve(e.textAlign,J)||null,this.textNormalization=R(e.textNormalization)??!1,this.wordSpacing=v(e.wordSpacing)||null,this.zoom=T(e.zoom,We.range)||1,this.experiments=qt(e.experiments)??null}}class Jt{constructor(e,t,n){this.fontFamily=null,this.fontWeight=null,this.hyphens=null,this.iOSPatch=null,this.iPadOSPatch=null,this.letterSpacing=null,this.ligatures=null,this.lineHeight=null,this.noRuby=null,this.paragraphIndent=null,this.paragraphSpacing=null,this.textAlign=null,this.textNormalization=null,this.wordSpacing=null,n&&(this.fontFamily=e.fontFamily||t.fontFamily||null,this.fontWeight=e.fontWeight!==void 0?e.fontWeight:t.fontWeight!==void 0?t.fontWeight:null,this.hyphens=typeof e.hyphens=="boolean"?e.hyphens:t.hyphens??null,this.iOSPatch=e.iOSPatch===!1?!1:e.iOSPatch===!0?(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile":t.iOSPatch,this.iPadOSPatch=e.iPadOSPatch===!1?!1:e.iPadOSPatch===!0?L.OS.iPadOS&&L.iOSRequest==="desktop":t.iPadOSPatch,this.letterSpacing=e.letterSpacing!==void 0?e.letterSpacing:t.letterSpacing!==void 0?t.letterSpacing:null,this.ligatures=typeof e.ligatures=="boolean"?e.ligatures:t.ligatures??null,this.lineHeight=e.lineHeight!==void 0?e.lineHeight:t.lineHeight!==void 0?t.lineHeight:null,this.noRuby=typeof e.noRuby=="boolean"?e.noRuby:t.noRuby??null,this.paragraphIndent=e.paragraphIndent!==void 0?e.paragraphIndent:t.paragraphIndent!==void 0?t.paragraphIndent:null,this.paragraphSpacing=e.paragraphSpacing!==void 0?e.paragraphSpacing:t.paragraphSpacing!==void 0?t.paragraphSpacing:null,this.textAlign=e.textAlign||t.textAlign||null,this.textNormalization=typeof e.textNormalization=="boolean"?e.textNormalization:t.textNormalization??null,this.wordSpacing=e.wordSpacing!==void 0?e.wordSpacing:t.wordSpacing!==void 0?t.wordSpacing:null),this.zoom=e.zoom!==void 0?e.zoom:t.zoom!==void 0?t.zoom:null,this.experiments=t.experiments||null}}class U{constructor({initialValue:e=null,effectiveValue:t,isEffective:n,onChange:i}){this._value=e,this._effectiveValue=t,this._isEffective=n,this._onChange=i}set value(e){this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}clear(){this._value=null}}class O extends U{set value(e){this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}clear(){this._value=null}toggle(){this._value=!this._value,this._onChange(this._value)}}class Zt extends U{constructor({initialValue:e=null,effectiveValue:t,isEffective:n,onChange:i,supportedValues:o}){super({initialValue:e,effectiveValue:t,isEffective:n,onChange:i}),this._supportedValues=o}set value(e){if(e&&!this._supportedValues.includes(e))throw new Error(`Value '${String(e)}' is not in the supported values for this preference.`);this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}get supportedValues(){return this._supportedValues}clear(){this._value=null}}class k extends U{constructor({initialValue:e=null,effectiveValue:t,isEffective:n,onChange:i,supportedRange:o,step:a}){super({initialValue:e,effectiveValue:t,isEffective:n,onChange:i}),this._supportedRange=o,this._step=a,this._decimals=this._step.toString().includes(".")?this._step.toString().split(".")[1].length:0}set value(e){if(e&&(e<this._supportedRange[0]||e>this._supportedRange[1]))throw new Error(`Value '${String(e)}' is out of the supported range for this preference.`);this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}get supportedRange(){return this._supportedRange}get step(){return this._step}increment(){this._value&&this._value<this._supportedRange[1]&&(this._value=Math.min(Math.round((this._value+this._step)*10**this._decimals)/10**this._decimals,this._supportedRange[1]),this._onChange(this._value))}decrement(){this._value&&this._value>this._supportedRange[0]&&(this._value=Math.max(Math.round((this._value-this._step)*10**this._decimals)/10**this._decimals,this._supportedRange[0]),this._onChange(this._value))}format(e){return e.toString()}clear(){this._value=null}}class Qt{constructor(e,t,n){this.preferences=e,this.settings=t,this.metadata=n}clear(){this.preferences=new Re({})}updatePreference(e,t){this.preferences[e]=t}get isDisplayTransformable(){return this.metadata?.accessibility?.feature?.some(e=>e.value===Ze.DISPLAY_TRANSFORMABILITY.value)??!1}get fontFamily(){return new U({initialValue:this.preferences.fontFamily,effectiveValue:this.settings.fontFamily||null,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("fontFamily",e??null)}})}get fontWeight(){return new k({initialValue:this.preferences.fontWeight,effectiveValue:this.settings.fontWeight||400,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("fontWeight",e??null)},supportedRange:ee.range,step:ee.step})}get hyphens(){return new O({initialValue:this.preferences.hyphens,effectiveValue:this.settings.hyphens||!1,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("hyphens",e??null)}})}get iOSPatch(){return new O({initialValue:this.preferences.iOSPatch,effectiveValue:this.settings.iOSPatch||!1,isEffective:!0,onChange:e=>{this.updatePreference("iOSPatch",e??null)}})}get iPadOSPatch(){return new O({initialValue:this.preferences.iPadOSPatch,effectiveValue:this.settings.iPadOSPatch||!1,isEffective:!0,onChange:e=>{this.updatePreference("iPadOSPatch",e??null)}})}get letterSpacing(){return new k({initialValue:this.preferences.letterSpacing,effectiveValue:this.settings.letterSpacing||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("letterSpacing",e??null)},supportedRange:Ne.range,step:Ne.step})}get ligatures(){return new O({initialValue:this.preferences.ligatures,effectiveValue:this.settings.ligatures||!0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("ligatures",e??null)}})}get lineHeight(){return new k({initialValue:this.preferences.lineHeight,effectiveValue:this.settings.lineHeight,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("lineHeight",e??null)},supportedRange:Me.range,step:Me.step})}get noRuby(){return new O({initialValue:this.preferences.noRuby,effectiveValue:this.settings.noRuby||!1,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("noRuby",e??null)}})}get paragraphIndent(){return new k({initialValue:this.preferences.paragraphIndent,effectiveValue:this.settings.paragraphIndent||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("paragraphIndent",e??null)},supportedRange:Ie.range,step:Ie.step})}get paragraphSpacing(){return new k({initialValue:this.preferences.paragraphSpacing,effectiveValue:this.settings.paragraphSpacing||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("paragraphSpacing",e??null)},supportedRange:He.range,step:He.step})}get textAlign(){return new Zt({initialValue:this.preferences.textAlign,effectiveValue:this.settings.textAlign||J.start,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("textAlign",e??null)},supportedValues:Object.values(J)})}get textNormalization(){return new O({initialValue:this.preferences.textNormalization,effectiveValue:this.settings.textNormalization||!1,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("textNormalization",e??null)}})}get wordSpacing(){return new k({initialValue:this.preferences.wordSpacing,effectiveValue:this.settings.wordSpacing||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("wordSpacing",e??null)},supportedRange:De.range,step:De.step})}get zoom(){return new k({initialValue:this.preferences.zoom,effectiveValue:this.settings.zoom||1,isEffective:CSS.supports("zoom","1")??!1,onChange:e=>{this.updatePreference("zoom",e??null)},supportedRange:We.range,step:We.step})}}const bi=r=>{if("blob"in r&&r.blob.type)return r.blob.type;if(r.as==="script")return"text/javascript";if(r.as==="link"&&"url"in r){const e=r.url.toLowerCase();if(e.endsWith(".css"))return"text/css";if([".js",".mjs",".cjs"].some(t=>e.endsWith(t)))return"text/javascript"}},vi=(r,e)=>{e.attributes&&Object.entries(e.attributes).forEach(([t,n])=>{t==="type"||t==="rel"||t==="href"||t==="src"||n!=null&&(typeof n=="boolean"?n&&r.setAttribute(t,""):r.setAttribute(t,n))})},ar=(r,e,t)=>{const n=r.createElement("script");n.dataset.readium="true",e.id&&(n.id=e.id);const i=e.type||bi(e);return i&&(n.type=i),vi(n,e),n.src=t,n},wi=(r,e,t)=>{const n=r.createElement("link");n.dataset.readium="true",e.id&&(n.id=e.id),e.rel&&(n.rel=e.rel);const i=e.type||bi(e);return i&&(n.type=i),vi(n,e),n.href=t,n};class en{constructor(e){this.blobStore=new Map,this.createdBlobUrls=new Set,this.allowedDomains=[],this.injectableIdCounter=0,this.allowedDomains=(e.allowedDomains||[]).map(t=>{try{return new URL(t),t}catch{throw new Error(`Invalid allowed domain: "${t}". Must be a valid URL (e.g., "https://fonts.googleapis.com").`)}}),this.rules=e.rules.map(t=>{const n={...t};return t.prepend&&(n.prepend=t.prepend.map(i=>({...i,id:i.id||`injectable-${this.injectableIdCounter++}`})).reverse()),t.append&&(n.append=t.append.map(i=>({...i,id:i.id||`injectable-${this.injectableIdCounter++}`}))),n})}dispose(){for(const e of this.createdBlobUrls)try{URL.revokeObjectURL(e)}catch(t){console.warn("Failed to revoke blob URL:",e,t)}this.createdBlobUrls.clear()}getAllowedDomains(){return[...this.allowedDomains]}async injectForDocument(e,t){for(const n of this.rules)this.matchesRule(n,t)&&await this.applyRule(e,n)}matchesRule(e,t){const n=t.href;return e.resources.some(i=>i instanceof RegExp?i.test(n):n===i)}async getOrCreateBlobUrl(e){const t=e.id;if(this.blobStore.has(t)){const n=this.blobStore.get(t);return n.refCount++,n.url}if("blob"in e){const n=URL.createObjectURL(e.blob);return this.blobStore.set(t,{url:n,refCount:1}),this.createdBlobUrls.add(n),n}throw new Error("Resource must have a blob property")}async releaseBlobUrl(e){if(!this.createdBlobUrls.has(e))return;const t=Array.from(this.blobStore.values()).find(n=>n.url===e);if(t&&(t.refCount--,t.refCount<=0)){URL.revokeObjectURL(e),this.createdBlobUrls.delete(e);for(const[n,i]of this.blobStore.entries())if(i.url===e){this.blobStore.delete(n);break}}}async getResourceUrl(e,t){if("url"in e){const n=new URL(e.url,t.baseURI).toString();if(!this.isValidUrl(n,t))throw new Error(`Invalid URL: Only HTTPS, data:, blob:, or localhost HTTP URLs are allowed. Got: ${e.url}`);return n}else return this.getOrCreateBlobUrl(e)}createPreloadLink(e,t,n){if(t.as!=="link"||t.rel!=="preload")return;const i={...t,rel:"preload",attributes:{...t.attributes,as:t.as}},o=wi(e,i,n);e.head.appendChild(o)}createElement(e,t,n){if(t.as==="script")return ar(e,t,n);if(t.as==="link")return wi(e,t,n);throw new Error(`Unsupported element type: ${t.as}`)}async applyRule(e,t){const n=[],i=t.prepend?t.prepend.filter(a=>!a.condition||a.condition(e)):[],o=t.append?t.append.filter(a=>!a.condition||a.condition(e)):[];try{for(const a of i)await this.processInjectable(a,e,n,"prepend");for(const a of o)await this.processInjectable(a,e,n,"append")}catch(a){for(const{element:s,url:l}of n)try{s.remove(),await this.releaseBlobUrl(l)}catch(c){console.error("Error during cleanup:",c)}throw a}}async processInjectable(e,t,n,i){const o=e.target==="body"?t.body:t.head;if(!o)return;let a=null;try{if(a=await this.getResourceUrl(e,t),e.rel==="preload"&&"url"in e)this.createPreloadLink(t,e,a);else{const s=this.createElement(t,e,a);n.push({element:s,url:a}),i==="prepend"?o.prepend(s):o.append(s)}}catch(s){throw console.error("Failed to process resource:",s),a&&"blob"in e&&await this.releaseBlobUrl(a),s}}isValidUrl(e,t){try{const n=new URL(e,t.baseURI);if(n.protocol==="data:"||n.protocol==="blob:"&&this.createdBlobUrls.has(e))return!0;if(this.allowedDomains.length>0){const i=n.origin;return this.allowedDomains.some(o=>{const a=new URL(o).origin;return i===a})}return!1}catch{return!1}}}const Pe=r=>r.replace(/\/\/.*/g,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\n/g,"").replace(/\s+/g," "),$e=r=>r.replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g,"").replace(/ {2,}/g," "),sr=`/*!
|
|
95
|
+
`,e.document.head.appendChild(n),this.resizeObserver=new ResizeObserver(()=>{this.resizeDebounce&&this.wnd.clearTimeout(this.resizeDebounce),this.isResizing=!0,this.resizeDebounce=this.wnd.setTimeout(()=>{this.isResizing=!1,this.resizeDebounce=null,this.reportProgress()},50)}),this.resizeObserver.observe(e.document.body),e.addEventListener("scroll",this.handleScroll,{passive:!0}),t.register("force_webkit_recalc",j.moduleName,()=>{At(this.wnd);const i=this.doc().scrollLeft;this.verticalLR?this.doc().scrollLeft=i>1?i-1:i+1:this.doc().scrollLeft=i<-1?i+1:i-1,this.doc().scrollLeft=i}),t.register("go_progression",j.moduleName,(i,o)=>{const a=i;if(a<0||a>1){t.send("error",{message:"go_progression must be given a position from 0.0 to 1.0"}),o(!1);return}this.wnd.requestAnimationFrame(()=>{const s=this.scrollable()*a;this.doc().scrollLeft=this.verticalLR?s:-s,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_id",j.moduleName,(i,o)=>{const a=e.document.getElementById(i);if(!a){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollLeft+=a.getBoundingClientRect().left-e.innerWidth/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_text",j.moduleName,(i,o)=>{let a;Array.isArray(i)&&(i.length>1&&(a=i[1]),i=i[0]);const s=oe.deserialize(i),l=Le(this.wnd.document,new N({href:e.location.href,type:"text/html",text:s,locations:a?new C({otherLocations:new Map([["cssSelector",a]])}):void 0}));if(!l){o(!1);return}this.wnd.requestAnimationFrame(()=>{this.doc().scrollLeft+=l.getBoundingClientRect().left-e.innerWidth/2,this.reportProgress(),z(this.wnd),o(!0)})}),t.register("go_start",j.moduleName,(i,o)=>{if(this.doc().scrollLeft===0)return o(!1);this.doc().scrollLeft=0,this.reportProgress(),o(!0)}),t.register("go_end",j.moduleName,(i,o)=>{if(Math.abs(this.doc().scrollLeft)===this.scrollable())return o(!1);this.doc().scrollLeft=this.verticalLR?this.scrollable():-this.scrollable(),this.reportProgress(),o(!0)}),t.register(["go_next","go_prev"],j.moduleName,(i,o)=>o(!1)),t.register("unfocus",j.moduleName,(i,o)=>{z(this.wnd),o(!0)}),t.register("scroll_protection",j.moduleName,(i,o)=>{this.enableScrollProtection(),o(!0)}),t.register("focus",j.moduleName,(i,o)=>{this.reportProgress(),o(!0)}),t.register("first_visible_locator",j.moduleName,(i,o)=>{const a=lt(e,!0);this.comms.send("first_visible_locator",a.serialize()),o(!0)}),t.log("CJKVerticalSnapper Mounted"),!0}unmount(e,t){return t.unregisterAll(j.moduleName),this.resizeObserver.disconnect(),this.handleScroll&&e.removeEventListener("scroll",this.handleScroll),e.document.getElementById(ri)?.remove(),this.patternAnalyzer&&(this.patternAnalyzer.clear(),this.patternAnalyzer=null,this.isScrollProtectionEnabled=!1),t.log("CJKVerticalSnapper Unmounted"),!0}};j.moduleName="cjk_vertical_snapper";let jt=j;const jo=["fixed_setup","decorator","peripherals","print_protection"],Go=["reflowable_setup","decorator","peripherals","column_snapper","scroll_snapper","cjk_vertical_snapper","print_protection"],Vo=["webpub_setup","webpub_snapper","decorator","peripherals","print_protection"],Gt=new Map([Wt,Dt,Bt,It,Ht,Ot,Nt,Mt,jt,Bo].map(r=>[r.moduleName,r]));class ve{constructor(e=window,t=[]){this.loadedModules=[],this.wnd=e,this.comms=new uo(e);const n=[...new Set(t)];if(n.length){if(typeof e>"u")throw Error("Loader is not in a web browser");e.parent!==e&&this.comms.log("Loader is probably in a frame"),this.loadedModules=n.map(i=>{const o=this.loadModule(i);if(o)return o.mount(this.wnd,this.comms),o}).filter(i=>i!==void 0)}}loadModule(e){const t=Gt.get(e);return t===void 0?(this.comms.log(`Module "${name}" does not exist in the library`),t):new t}addModule(e){const t=this.loadModule(e);return!t||!t.mount(this.wnd,this.comms)?!1:(this.loadedModules.push(t),!0)}removeModule(e){const t=Gt.get(e);if(t===void 0)return this.comms.log(`Module "${e}" does not exist in the library`),!1;const n=this.loadedModules.findIndex(i=>i instanceof t);return n<0?!1:(this.loadedModules[n].unmount(this.wnd,this.comms),this.loadedModules.splice(n,1),!0)}destroy(){this.comms.destroy(),this.loadedModules.forEach(e=>e.unmount(this.wnd,this.comms)),this.loadedModules=[]}}const $o={type:"developer_tools",keyCombos:[{keyCode:73,meta:!0,alt:!0},{keyCode:73,ctrl:!0,shift:!0},{keyCode:74,meta:!0,alt:!0},{keyCode:74,ctrl:!0,shift:!0},{keyCode:85,meta:!0,alt:!0},{keyCode:67,meta:!0,alt:!0},{keyCode:67,meta:!0,shift:!0},{keyCode:67,ctrl:!0,shift:!0},{keyCode:65,meta:!0,alt:!0},{keyCode:84,meta:!0,shift:!0,alt:!0},{keyCode:67,shift:!0,alt:!0},{keyCode:123},{keyCode:123,shift:!0},{keyCode:123,ctrl:!0,shift:!0},{keyCode:123,meta:!0,alt:!0}]},Ko={type:"select_all",keyCombos:[{keyCode:65,meta:!0},{keyCode:65,ctrl:!0}]},Xo={type:"print",keyCombos:[{keyCode:80,meta:!0},{keyCode:80,ctrl:!0},{keyCode:80,meta:!0,shift:!0},{keyCode:80,ctrl:!0,shift:!0},{keyCode:80,meta:!0,alt:!0},{keyCode:80,ctrl:!0,alt:!0}]},Yo={type:"save",keyCombos:[{keyCode:83,meta:!0},{keyCode:83,ctrl:!0}]};class Vt{mergeKeyboardPeripherals(e,t=[]){const n=[],i=t.filter(o=>!["developer_tools","select_all","print","save"].includes(o.type));e.disableSelectAll&&n.push(Ko),e.disableSave&&n.push(Yo),e.monitorDevTools&&n.push($o),e.protectPrinting?.disable&&n.push(Xo);for(const o of i){const a=o.keyCombos.filter(s=>!n.some(l=>l.keyCombos.some(c=>s.keyCode===c.keyCode&&s.ctrl===c.ctrl&&s.shift===c.shift&&s.alt===c.alt&&s.meta===c.meta)));a.length>0&&n.push({...o,keyCombos:a})}return n}}class $t extends Vt{goLeft(e=!1,t){this.readingProgression===M.ltr?this.goBackward(e,t):this.readingProgression===M.rtl&&this.goForward(e,t)}goRight(e=!1,t){this.readingProgression===M.ltr?this.goForward(e,t):this.readingProgression===M.rtl&&this.goBackward(e,t)}}class ai extends Vt{}class si{constructor(e,t,n,i){this.injector=null,this.pub=e,this.item=n,this.burl=n.toURL(t)||"",this.cssProperties=i.cssProperties,this.injector=i.injector??null}async build(){if(!this.item.mediaType.isHTML)throw new Error(`Unsupported media type for WebPub: ${this.item.mediaType.string}`);return await this.buildHtmlFrame()}async buildHtmlFrame(){const e=await this.pub.get(this.item).readAsString();if(!e)throw new Error(`Failed reading item ${this.item.href}`);const t=new DOMParser().parseFromString(e,this.item.mediaType.string),n=t.querySelector("parsererror");if(n){const i=n.querySelector("div");throw new Error(`Failed parsing item ${this.item.href}: ${i?.textContent||n.textContent}`)}return this.injector&&await this.injector.injectForDocument(t,this.item),this.finalizeDOM(t,this.burl,this.item.mediaType,e,this.cssProperties)}setProperties(e,t){for(const n in e){const i=e[n];i&&t.documentElement.style.setProperty(n,i)}}finalizeDOM(e,t,n,i,o){if(!e)return"";if(o&&this.setProperties(o,e),e.body.querySelectorAll("img").forEach(s=>{s.setAttribute("fetchpriority","high")}),t!==void 0){const s=e.createElement("base");s.href=t,s.dataset.readium="true",e.head.firstChild.before(s)}let a;return n.string==="application/xhtml+xml"?a=new XMLSerializer().serializeToString(e):a=this.serializeAsHTML(e,i||""),URL.createObjectURL(new Blob([a],{type:n.isHTML?n.string:"application/xhtml+xml"}))}serializeAsHTML(e,t){const n=t.match(/<!DOCTYPE[^>]*>/i),i=n?n[0]+`
|
|
96
|
+
`:"";let a=e.documentElement.outerHTML;return i+a}}const qo=1e4;class we{constructor(e,t){this.registry=new Map,this._ready=!1,this.listenerBuffer=[],this.handler=this.handle.bind(this),this.wnd=e,this.origin=t;try{this.channelId=window.crypto.randomUUID()}catch{this.channelId=Rt()}this.gc=setInterval(()=>{this.registry.forEach((n,i)=>{performance.now()-n.time>qo&&(console.warn(i,"event for",n.key,"was never handled!"),this.registry.delete(i))})},5e3),window.addEventListener("message",this.handler),this.send("_ping",void 0)}set listener(e){this.listenerBuffer.length>0&&this.listenerBuffer.forEach(t=>e(t[0],t[1])),this.listenerBuffer=[],this._listener=e}clearListener(){typeof this._listener=="function"&&(this._listener=void 0)}halt(){this._ready=!1,window.removeEventListener("message",this.handler),clearInterval(this.gc),this._listener=void 0,this.registry.clear()}resume(){window.addEventListener("message",this.handler),this._ready=!0}handle(e){const t=e.data;if(!t._readium){console.warn("Ignoring",t);return}if(t._channel===this.channelId)switch(t.key){case"_ack":{if(!t.id)return;const n=this.registry.get(t.id);if(!n)return;this.registry.delete(t.id),n.cb(!!t.data);return}case"_pong":this._ready=!0;default:{if(!this.ready)return;typeof this._listener=="function"?this._listener(t.key,t.data):this.listenerBuffer.push([t.key,t.data])}}}get ready(){return this._ready}send(e,t,n,i=!1,o=[]){const a=Rt();return n&&this.registry.set(a,{cb:n,time:performance.now(),key:e}),this.wnd.postMessage({_readium:fe,_channel:this.channelId,id:a,data:t,key:e,strict:i},"/",o),a}}const Jo={oldStyleTf:"'Iowan Old Style', Sitka, 'Sitka Text', Palatino, 'Book Antiqua', 'URW Palladio L', P052, serif"},Zo=16,li=Jo.oldStyleTf;class Re{constructor(e){this._optimalLineLength=null,this._canvas=document.createElement("canvas"),this._optimalChars=e.optimalChars,this._minChars=e.minChars,this._maxChars=e.maxChars,this._baseFontSize=e.baseFontSize||Zo,this._fontFace=e.fontFace||li,this._sample=e.sample||null,this._padding=e.padding??0,this._letterSpacing=e.letterSpacing?Math.round(e.letterSpacing*this._baseFontSize):0,this._wordSpacing=e.wordSpacing?Math.round(e.wordSpacing*this._baseFontSize):0,this._isCJK=e.isCJK||!1,this._getRelative=e.getRelative||!1,this._minDivider=this._minChars&&this._minChars<this._optimalChars?this._optimalChars/this._minChars:this._minChars===null?null:1,this._maxMultiplier=this._maxChars&&this._maxChars>this._optimalChars?this._maxChars/this._optimalChars:this._maxChars===null?null:1,this._approximatedWordSpaces=Re.approximateWordSpaces(this._optimalChars,this._sample)}updateMultipliers(){this._minDivider=this._minChars&&this._minChars<this._optimalChars?this._optimalChars/this._minChars:this._minChars===null?null:1,this._maxMultiplier=this._maxChars&&this._maxChars>this._optimalChars?this._maxChars/this._optimalChars:this._maxChars===null?null:1}update(e){e.optimalChars&&(this._optimalChars=e.optimalChars),e.minChars!==void 0&&(this._minChars=e.minChars),e.maxChars!==void 0&&(this._maxChars=e.maxChars),e.baseFontSize&&(this._baseFontSize=e.baseFontSize),e.fontFace!==void 0&&(this._fontFace=e.fontFace||li),e.letterSpacing&&(this._letterSpacing=e.letterSpacing),e.wordSpacing&&(this._wordSpacing=e.wordSpacing),e.isCJK!=null&&(this._isCJK=e.isCJK),e.padding!==void 0&&(this._padding=e.padding??0),e.getRelative&&(this._getRelative=e.getRelative),e.sample&&(this._sample=e.sample,this._approximatedWordSpaces=Re.approximateWordSpaces(this._optimalChars,this._sample)),this.updateMultipliers(),this._optimalLineLength=this.getOptimalLineLength()}get baseFontSize(){return this._baseFontSize}get minimalLineLength(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),this._minDivider!==null?Math.round(this._optimalLineLength/this._minDivider+this._padding)/(this._getRelative?this._baseFontSize:1):null}get maximalLineLength(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),this._maxMultiplier!==null?Math.round(this._optimalLineLength*this._maxMultiplier+this._padding)/(this._getRelative?this._baseFontSize:1):null}get optimalLineLength(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),Math.round(this._optimalLineLength+this._padding)/(this._getRelative?this._baseFontSize:1)}get all(){return this._optimalLineLength||(this._optimalLineLength=this.getOptimalLineLength()),{min:this.minimalLineLength,max:this.maximalLineLength,optimal:this.optimalLineLength,baseFontSize:this._baseFontSize}}static approximateWordSpaces(e,t){let n=0;if(t&&t.length>=e){const i=t.match(/([\s]+)/gi);n=(i?i.length:0)*(e/t.length)}return n}getLineLengthFallback(){const e=this._letterSpacing*(this._optimalChars-1),t=this._wordSpacing*this._approximatedWordSpaces;return this._optimalChars*(this._baseFontSize*.5)+e+t}getOptimalLineLength(){if(this._fontFace){if(typeof this._fontFace=="string")return this.measureText(this._fontFace);{const e=new FontFace(this._fontFace.name,`url(${this._fontFace.url})`);e.load().then(()=>(document.fonts.add(e),this.measureText(e.family)),t=>{})}}return this.getLineLengthFallback()}measureText(e){const t=this._canvas.getContext("2d");if(t&&e){let n=this._isCJK?"水".repeat(this._optimalChars):"0".repeat(this._optimalChars);if(t.font=`${this._baseFontSize}px ${e}`,this._sample&&this._sample.length>=this._optimalChars&&(n=this._sample.slice(0,this._optimalChars)),Object.hasOwn(t,"letterSpacing")&&Object.hasOwn(t,"wordSpacing"))return t.letterSpacing=this._letterSpacing.toString()+"px",t.wordSpacing=this._wordSpacing.toString()+"px",t.measureText(n).width;{const i=this._letterSpacing*(this._optimalChars-1),o=this._wordSpacing*Re.approximateWordSpaces(this._optimalChars,this._sample);return t.measureText(n).width+i+o}}else return this.getLineLengthFallback()}}const ci=()=>typeof navigator>"u"?"":navigator.userAgent||"",hi=()=>typeof navigator>"u"?void 0:navigator.userAgentData||void 0;class di{constructor(){const e=hi(),t=ci(),n=o=>(typeof o=="string"||typeof o=="number")&&o?String(o).replace(/_/g,".").split(".").map(a=>parseInt(a)||0):[],i=(o="")=>{if(!o)return[];const a=new RegExp("^.*"+o+"[ :\\/]?(\\d+([\\._]\\d+)*).*$");return a.test(t)?n(t.replace(a,"$1")):[]};this.OS=(o=>(/(macOS|Mac OS X)/.test(t)?(/\(iP(hone|od touch);/.test(t)&&(o.iOS=i("CPU (?:iPhone )?OS ")),/\(iPad;/.test(t)?o.iOS=o.iPadOS=i("CPU (?:iPhone )?OS "):/(macOS|Mac OS X) \d/.test(t)&&(document.ontouchend!==void 0?o.iOS=o.iPadOS=i():o.macOS=i("(?:macOS|Mac OS X) "))):/Windows( NT)? \d/.test(t)?o.Windows=(a=>a[0]!==6||!a[1]?a:a[1]===1?[7]:a[1]===2?[8]:[8,1])(i("Windows(?: NT)?")):/Android \d/.test(t)?o.Android=i("Android"):/CrOS/.test(t)?o.ChromeOS=i():/X11;/.test(t)&&(o.Linux=i()),o))({}),e&&e.getHighEntropyValues(["architecture","model","platform","platformVersion","uaFullVersion"]).then(o=>(a=>{const s=o.platform,l=o.platformVersion;if(!(!s||!l)){if(/^i(OS|P(hone|od touch))$/.test(s))a.iOS=n(l);else if(/^iPad(OS)?$/.test(s))a.iOS=a.iPadOS=n(l);else if(/^(macOS|(Mac )?OS X|Mac(Intel)?)$/.test(s))document.ontouchend!==void 0?a.iOS=a.iPadOS=n():a.macOS=n(l);else if(/^(Microsoft )?Windows$/.test(s))a.Windows=n(l);else if(/^(Google )?Android$/.test(s))a.Android=n(l);else if(/^((Google )?Chrome OS|CrOS)$/.test(s))a.ChromeOS=n(l);else if(/^(Linux|Ubuntu|X11)$/.test(s))a.Linux=n(l);else return;Object.keys(this.OS).forEach(c=>delete this.OS[c]),Object.assign(this.OS,a)}})({})),this.UA=(o=>{let a=!1;if(e&&Array.isArray(e.brands)){const s=e.brands.reduce((l,c)=>(l[c.brand]=[c.version*1],l),{});s["Google Chrome"]?(a=!0,o.Blink=o.Chromium=s.Chromium||[],o.Chrome=s["Google Chrome"]):s["Microsoft Edge"]?(a=!0,o.Blink=o.Chromium=s.Chromium||[],o.Edge=s["Microsoft Edge"]):s.Opera&&(a=!0,o.Blink=o.Chromium=s.Chromium||[],o.Opera=s.Opera)}return a||(/ Gecko\/\d/.test(t)?(o.Gecko=i("rv"),/ Waterfox\/\d/.test(t)?o.Waterfox=i("Waterfox"):/ Firefox\/\d/.test(t)&&(o.Firefox=i("Firefox"))):/ Edge\/\d/.test(t)?(o.EdgeHTML=i("Edge"),o.Edge=o.EdgeHTML):/ Chrom(ium|e)\/\d/.test(t)?(o.Blink=o.Chromium=(s=>s[0]?s:i("Chrome"))(i("Chromium")),/ EdgA?\/\d/.test(t)?o.Edge=(s=>s[0]?s:i("Edg"))(i("EdgA")):/ OPR\/\d/.test(t)?o.Opera=i("OPR"):/ Vivaldi\/\d/.test(t)?o.Vivaldi=i("Vivaldi"):/ Silk\/\d/.test(t)?o.Silk=i("Silk"):/ UCBrowser\/\d/.test(t)?o.UCBrowser=i("UCBrowser"):/ Phoebe\/\d/.test(t)?o.Phoebe=i("Phoebe"):o.Chrome=(s=>s[0]?s:o.Chromium)(i("Chrome"))):/ AppleWebKit\/\d/.test(t)?(o.WebKit=i("AppleWebKit"),/ CriOS \d/.test(t)?o.Chrome=i("CriOS"):/ FxiOS \d/.test(t)?o.Firefox=i("FxiOS"):/ EdgiOS\/\d/.test(t)?o.Edge=i("EdgiOS"):/ Version\/\d/.test(t)&&(o.Safari=i("Version"))):/ Trident\/\d/.test(t)&&(o.Trident=i("Trident"),o.InternetExplorer=(s=>s[0]?s:i("MSIE"))(i("rv")))),/[\[; ]FB(AN|_IAB)\//.test(t)&&(o.Facebook=i("FBAV")),/ Line\/\d/.test(t)&&(o.LINE=i("Line")),o})({}),this.Env={get:()=>[this.OS,this.UA].reduce((o,a)=>{for(const s in a)a[s]&&o.push(s);return o},[])}}}class Qo extends di{get iOSRequest(){const e=hi(),t=ci();if(this.OS.iOS&&!this.OS.iPadOS)return"mobile";if(this.OS.iPadOS)return/\(iPad;/.test(t)||e&&/^iPad(OS)?$/.test(e.platform)?"mobile":"desktop"}}const Y=new di,L=new Qo;function se(r){const e=r.languages?.[0]?.toLowerCase(),t=r.readingProgression;if(e){if(e.startsWith("zh")||e.startsWith("ja")||e.startsWith("ko"))return t===M.rtl?"cjk-vertical":"cjk-horizontal";if(e.startsWith("mn-mong"))return"mongolian-vertical";if(e.startsWith("ar")||e.startsWith("fa")||e.startsWith("he"))return"rtl"}return"ltr"}class Kt{constructor(e,t){this.config=e,this.onUpdate=t,this.unsubs=[],this.conditionValues=new Map}setup(){let e=!0;this.config.forEach(t=>t.keyCombos.forEach(n=>{if(n.condition){const i=n.condition.subscribe(o=>{this.conditionValues.set(n,o),e||this.onUpdate(this.buildSerializable())});this.unsubs.push(i)}})),e=!1,this.onUpdate(this.buildSerializable())}buildSerializable(){return this.config.map(e=>({...e,keyCombos:e.keyCombos.filter(t=>!t.condition||this.conditionValues.get(t)===!0).map(({condition:t,...n})=>n)})).filter(e=>e.keyCombos.length>0)}destroy(){this.unsubs.forEach(e=>e()),this.unsubs=[],this.conditionValues.clear()}}class ui{constructor(e,t={},n=[]){this.hidden=!0,this.destroyed=!1,this.currModules=[],this.frame=document.createElement("iframe"),this.frame.classList.add("readium-navigator-iframe"),this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.position="absolute",this.frame.style.pointerEvents="none",this.frame.style.transition="visibility 0s, opacity 0.1s linear",this.frame.style.backgroundColor="#FFFFFF",this.source=e,this.contentProtectionConfig={...t},this.keyboardPeripheralsConfig=[...n]}async load(e=[]){return new Promise((t,n)=>{if(this.loader){const i=this.frame.contentWindow;if([...this.currModules].sort().join("|")===[...e].sort().join("|")){try{t(i)}catch{}return}this.comms?.halt(),this.loader.destroy(),this.loader=new ve(i,e),this.currModules=e,this.comms=void 0;try{t(i)}catch{}return}this.frame.onload=()=>{const i=this.frame.contentWindow;this.loader=new ve(i,e),this.currModules=e;try{t(i)}catch{}},this.frame.onerror=i=>{try{n(i)}catch{}},this.frame.contentWindow.location.replace(this.source)})}applyContentProtection(){this.comms||this.comms.resume(),this.comms.send("peripherals_protection",this.contentProtectionConfig),this.keyboardPeripheralsConfig&&this.keyboardPeripheralsConfig.length>0&&(this.conditionBridge?.destroy(),this.conditionBridge=new Kt(this.keyboardPeripheralsConfig,e=>{e.length>0&&this.comms.send("keyboard_peripherals",e)}),this.conditionBridge.setup()),this.contentProtectionConfig.monitorScrollingExperimental&&this.comms.send("scroll_protection",{}),this.contentProtectionConfig.protectPrinting?.disable&&this.comms.send("print_protection",this.contentProtectionConfig.protectPrinting)}async destroy(){this.conditionBridge?.destroy(),await this.hide(),this.loader?.destroy(),this.frame.remove(),this.destroyed=!0}async hide(){if(!this.destroyed){if(this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.pointerEvents="none",this.hidden=!0,this.frame.parentElement)return this.comms===void 0||!this.comms.ready?void 0:new Promise((e,t)=>{this.comms?.send("unfocus",void 0,n=>{this.comms?.halt(),e()})});this.comms?.halt()}}async show(e){if(this.destroyed)throw Error("Trying to show frame when it doesn't exist");if(!this.frame.parentElement)throw Error("Trying to show frame that is not attached to the DOM");return this.comms?this.comms.resume():this.comms=new we(this.frame.contentWindow,this.source),new Promise((t,n)=>{this.comms?.send("activate",void 0,()=>{this.comms?.send("focus",void 0,()=>{this.applyContentProtection();const i=()=>{this.frame.style.removeProperty("visibility"),this.frame.style.removeProperty("aria-hidden"),this.frame.style.removeProperty("opacity"),this.frame.style.removeProperty("pointer-events"),this.hidden=!1,Y.UA.WebKit&&this.comms?.send("force_webkit_recalc",void 0),t()};e!==void 0?this.comms?.send("go_progression",e,i):i()})})})}setCSSProperties(e){this.destroyed||!this.frame.contentWindow||(this.hidden&&(this.comms?this.comms?.resume():this.comms=new we(this.frame.contentWindow,this.source)),this.comms?.send("update_properties",e),this.hidden&&this.comms?.halt())}get iframe(){if(this.destroyed)throw Error("Trying to use frame when it doesn't exist");return this.frame}get realSize(){if(this.destroyed)throw Error("Trying to use frame client rect when it doesn't exist");return this.frame.getBoundingClientRect()}get window(){if(this.destroyed||!this.frame.contentWindow)throw Error("Trying to use frame window when it doesn't exist");return this.frame.contentWindow}get msg(){return this.comms}get ldr(){return this.loader}}class mi{constructor(e,t,n,i={},o=[]){this.pool=new Map,this.blobs=new Map,this.inprogress=new Map,this.pendingUpdates=new Map,this.injector=null,this.container=e,this.currentCssProperties=t,this.injector=n,this.contentProtectionConfig=i,this.keyboardPeripheralsConfig=[...o]}async destroy(){let e=this.inprogress.values(),t=e.next();const n=[];for(;t.value;)n.push(t.value),t=e.next();n.length>0&&await Promise.allSettled(n),this.inprogress.clear();let i=this.pool.values(),o=i.next();for(;o.value;)await o.value.destroy(),o=i.next();this.pool.clear(),this.blobs.forEach(a=>{this.injector?.releaseBlobUrl?.(a),URL.revokeObjectURL(a)}),this.blobs.clear(),this.injector?.dispose(),this.container.childNodes.forEach(a=>{(a.nodeType===Node.ELEMENT_NODE||a.nodeType===Node.TEXT_NODE)&&a.remove()})}async update(e,t,n){const i=e.readingOrder.items;let o=i.findIndex(l=>l.href===t.href);if(o<0)throw Error(`Locator not found in reading order: ${t.href}`);const a=i[o].href;this.inprogress.has(a)&&await this.inprogress.get(a);const s=new Promise(async(l,c)=>{const h=[],u=[];e.readingOrder.items.forEach((d,p)=>{p!==o&&p!==o-1&&p!==o+1&&(h.includes(d.href)||h.push(d.href)),p===o&&(u.includes(d.href)||u.push(d.href))}),h.forEach(async d=>{u.includes(d)||this.pool.has(d)&&(await this.pool.get(d)?.destroy(),this.pool.delete(d))}),this.currentBaseURL!==void 0&&e.baseURL!==this.currentBaseURL&&(this.blobs.forEach(d=>{this.injector?.releaseBlobUrl?.(d),URL.revokeObjectURL(d)}),this.blobs.clear()),this.currentBaseURL=e.baseURL;const m=async d=>{if(this.pendingUpdates.has(d)&&this.pendingUpdates.get(d)?.inPool===!1){const P=this.blobs.get(d);P&&(this.injector?.releaseBlobUrl?.(P),URL.revokeObjectURL(P),this.blobs.delete(d),this.pendingUpdates.delete(d))}if(this.pool.has(d)){const P=this.pool.get(d);if(!this.blobs.has(d))await P.destroy(),this.pool.delete(d),this.pendingUpdates.delete(d);else{await P.load(n);return}}const p=e.readingOrder.findWithHref(d);if(!p)return;if(!this.blobs.has(d)){const A=await new si(e,this.currentBaseURL||"",p,{cssProperties:this.currentCssProperties,injector:this.injector}).build();this.blobs.set(d,A)}const b=new ui(this.blobs.get(d),this.contentProtectionConfig,this.keyboardPeripheralsConfig);d!==a&&await b.hide(),this.container.appendChild(b.iframe),await b.load(n),this.pool.set(d,b)};try{await Promise.all(u.map(d=>m(d)))}catch(d){c(d)}const f=this.pool.get(a);f?.source!==this._currentFrame?.source&&(await this._currentFrame?.hide(),f&&await f.load(n),f&&await f.show(t.locations.progression),this._currentFrame=f),l()});this.inprogress.set(a,s),await s,this.inprogress.delete(a)}setCSSProperties(e){if(!((n,i)=>{const o=Object.keys(n),a=Object.keys(i);if(o.length!==a.length)return!1;for(const s of o)if(n[s]!==i[s])return!1;return!0})(this.currentCssProperties||{},e)){this.currentCssProperties=e,this.pool.forEach(n=>{n.setCSSProperties(e)});for(const n of this.blobs.keys())this.pendingUpdates.set(n,{inPool:this.pool.has(n)})}}get currentFrames(){return[this._currentFrame]}get currentBounds(){const e={x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0,toJSON(){return this}};return this.currentFrames.forEach(t=>{if(!t)return;const n=t.realSize;e.x=Math.min(e.x,n.x),e.y=Math.min(e.y,n.y),e.width+=n.width,e.height=Math.max(e.height,n.height),e.top=Math.min(e.top,n.top),e.right=Math.min(e.right,n.right),e.bottom=Math.min(e.bottom,n.bottom),e.left=Math.min(e.left,n.left)}),e}}var Xt,pi;function er(){if(pi)return Xt;pi=1;function r(i){if(typeof i!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(i))}function e(i,o){for(var a="",s=0,l=-1,c=0,h,u=0;u<=i.length;++u){if(u<i.length)h=i.charCodeAt(u);else{if(h===47)break;h=47}if(h===47){if(!(l===u-1||c===1))if(l!==u-1&&c===2){if(a.length<2||s!==2||a.charCodeAt(a.length-1)!==46||a.charCodeAt(a.length-2)!==46){if(a.length>2){var m=a.lastIndexOf("/");if(m!==a.length-1){m===-1?(a="",s=0):(a=a.slice(0,m),s=a.length-1-a.lastIndexOf("/")),l=u,c=0;continue}}else if(a.length===2||a.length===1){a="",s=0,l=u,c=0;continue}}o&&(a.length>0?a+="/..":a="..",s=2)}else a.length>0?a+="/"+i.slice(l+1,u):a=i.slice(l+1,u),s=u-l-1;l=u,c=0}else h===46&&c!==-1?++c:c=-1}return a}function t(i,o){var a=o.dir||o.root,s=o.base||(o.name||"")+(o.ext||"");return a?a===o.root?a+s:a+i+s:s}var n={resolve:function(){for(var o="",a=!1,s,l=arguments.length-1;l>=-1&&!a;l--){var c;l>=0?c=arguments[l]:(s===void 0&&(s=process.cwd()),c=s),r(c),c.length!==0&&(o=c+"/"+o,a=c.charCodeAt(0)===47)}return o=e(o,!a),a?o.length>0?"/"+o:"/":o.length>0?o:"."},normalize:function(o){if(r(o),o.length===0)return".";var a=o.charCodeAt(0)===47,s=o.charCodeAt(o.length-1)===47;return o=e(o,!a),o.length===0&&!a&&(o="."),o.length>0&&s&&(o+="/"),a?"/"+o:o},isAbsolute:function(o){return r(o),o.length>0&&o.charCodeAt(0)===47},join:function(){if(arguments.length===0)return".";for(var o,a=0;a<arguments.length;++a){var s=arguments[a];r(s),s.length>0&&(o===void 0?o=s:o+="/"+s)}return o===void 0?".":n.normalize(o)},relative:function(o,a){if(r(o),r(a),o===a||(o=n.resolve(o),a=n.resolve(a),o===a))return"";for(var s=1;s<o.length&&o.charCodeAt(s)===47;++s);for(var l=o.length,c=l-s,h=1;h<a.length&&a.charCodeAt(h)===47;++h);for(var u=a.length,m=u-h,f=c<m?c:m,d=-1,p=0;p<=f;++p){if(p===f){if(m>f){if(a.charCodeAt(h+p)===47)return a.slice(h+p+1);if(p===0)return a.slice(h+p)}else c>f&&(o.charCodeAt(s+p)===47?d=p:p===0&&(d=0));break}var b=o.charCodeAt(s+p),P=a.charCodeAt(h+p);if(b!==P)break;b===47&&(d=p)}var A="";for(p=s+d+1;p<=l;++p)(p===l||o.charCodeAt(p)===47)&&(A.length===0?A+="..":A+="/..");return A.length>0?A+a.slice(h+d):(h+=d,a.charCodeAt(h)===47&&++h,a.slice(h))},_makeLong:function(o){return o},dirname:function(o){if(r(o),o.length===0)return".";for(var a=o.charCodeAt(0),s=a===47,l=-1,c=!0,h=o.length-1;h>=1;--h)if(a=o.charCodeAt(h),a===47){if(!c){l=h;break}}else c=!1;return l===-1?s?"/":".":s&&l===1?"//":o.slice(0,l)},basename:function(o,a){if(a!==void 0&&typeof a!="string")throw new TypeError('"ext" argument must be a string');r(o);var s=0,l=-1,c=!0,h;if(a!==void 0&&a.length>0&&a.length<=o.length){if(a.length===o.length&&a===o)return"";var u=a.length-1,m=-1;for(h=o.length-1;h>=0;--h){var f=o.charCodeAt(h);if(f===47){if(!c){s=h+1;break}}else m===-1&&(c=!1,m=h+1),u>=0&&(f===a.charCodeAt(u)?--u===-1&&(l=h):(u=-1,l=m))}return s===l?l=m:l===-1&&(l=o.length),o.slice(s,l)}else{for(h=o.length-1;h>=0;--h)if(o.charCodeAt(h)===47){if(!c){s=h+1;break}}else l===-1&&(c=!1,l=h+1);return l===-1?"":o.slice(s,l)}},extname:function(o){r(o);for(var a=-1,s=0,l=-1,c=!0,h=0,u=o.length-1;u>=0;--u){var m=o.charCodeAt(u);if(m===47){if(!c){s=u+1;break}continue}l===-1&&(c=!1,l=u+1),m===46?a===-1?a=u:h!==1&&(h=1):a!==-1&&(h=-1)}return a===-1||l===-1||h===0||h===1&&a===l-1&&a===s+1?"":o.slice(a,l)},format:function(o){if(o===null||typeof o!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof o);return t("/",o)},parse:function(o){r(o);var a={root:"",dir:"",base:"",ext:"",name:""};if(o.length===0)return a;var s=o.charCodeAt(0),l=s===47,c;l?(a.root="/",c=1):c=0;for(var h=-1,u=0,m=-1,f=!0,d=o.length-1,p=0;d>=c;--d){if(s=o.charCodeAt(d),s===47){if(!f){u=d+1;break}continue}m===-1&&(f=!1,m=d+1),s===46?h===-1?h=d:p!==1&&(p=1):h!==-1&&(p=-1)}return h===-1||m===-1||p===0||p===1&&h===m-1&&h===u+1?m!==-1&&(u===0&&l?a.base=a.name=o.slice(1,m):a.base=a.name=o.slice(u,m)):(u===0&&l?(a.name=o.slice(1,h),a.base=o.slice(1,m)):(a.name=o.slice(u,h),a.base=o.slice(u,m)),a.ext=o.slice(h,m)),u>0?a.dir=o.slice(0,u-1):l&&(a.dir="/"),a},sep:"/",delimiter:":",win32:null,posix:null};return n.posix=n,Xt=n,Xt}var dt=er();const tr={experimentalHeaderFiltering:{description:"Attempts to filter out paragraphs that are implicitly headings or part of headers",scope:"RS",value:"readium-experimentalHeaderFiltering-on"},experimentalZoom:{description:"Attempts to filter out elements that are sized using viewport units and should not be scaled directly e.g. tables, images, iframes, etc.",scope:"RS",value:"readium-experimentalZoom-on"}},nr={ltr:{disabled:[],added:[]},rtl:{disabled:["bodyHyphens","a11yNormalize","letterSpacing"],added:[]},"cjk-horizontal":{disabled:["textAlign","bodyHyphens","a11yNormalize","ligatures","paraIndent","wordSpacing"],added:["noRuby"]},"cjk-vertical":{disabled:["colCount","textAlign","bodyHyphens","a11yNormalize","ligatures","paraIndent","wordSpacing"],added:["noRuby"]}},ir={latin:{baseFontFamily:"var(--RS__oldStyleTf)",lineHeightCompensation:1},am:{baseFontFamily:"Kefa, Nyala, Roboto, Noto, 'Noto Sans Ethiopic', serif",lineHeightCompensation:1.167},ar:{baseFontFamily:"'Geeza Pro', 'Arabic Typesetting', Roboto, Noto, 'Noto Naskh Arabic', 'Times New Roman', serif"},bn:{baseFontFamily:"'Kohinoor Bangla', 'Bangla Sangam MN', Vrinda, Roboto, Noto, 'Noto Sans Bengali', sans-serif",lineHeightCompensation:1.067},bo:{baseFontFamily:"Kailasa, 'Microsoft Himalaya', Roboto, Noto, 'Noto Sans Tibetan', sans-serif"},chr:{baseFontFamily:"'Plantagenet Cherokee', Roboto, Noto, 'Noto Sans Cherokee'",lineHeightCompensation:1.167},fa:{baseFontFamily:"'Geeza Pro', 'Arabic Typesetting', Roboto, Noto, 'Noto Naskh Arabic', 'Times New Roman', serif"},gu:{baseFontFamily:"'Gujarati Sangam MN', 'Nirmala UI', Shruti, Roboto, Noto, 'Noto Sans Gujarati', sans-serif",lineHeightCompensation:1.167},he:{baseFontFamily:"'New Peninim MT', 'Arial Hebrew', Gisha, 'Times New Roman', Roboto, Noto, 'Noto Sans Hebrew', sans-serif",lineHeightCompensation:1.1},hi:{baseFontFamily:"'Kohinoor Devanagari', 'Devanagari Sangam MN', Kokila, 'Nirmala UI', Roboto, Noto, 'Noto Sans Devanagari', sans-serif",lineHeightCompensation:1.1},hy:{baseFontFamily:"Mshtakan, Sylfaen, Roboto, Noto, 'Noto Serif Armenian', serif"},iu:{baseFontFamily:"'Euphemia UCAS', Euphemia, Roboto, Noto, 'Noto Sans Canadian Aboriginal', sans-serif"},ja:{baseFontFamily:"YuGothic, 'Hiragino Maru Gothic ProN', 'Hiragino Sans', 'Yu Gothic UI', 'Meiryo UI', 'MS Gothic', Roboto, Noto, 'Noto Sans CJK JP', sans-serif",lineHeightCompensation:1.167},km:{baseFontFamily:"'Khmer Sangam MN', 'Leelawadee UI', 'Khmer UI', Roboto, Noto, 'Noto Sans Khmer', sans-serif",lineHeightCompensation:1.067},kn:{baseFontFamily:"'Kannada Sangam MN', 'Nirmala UI', Tunga, Roboto, Noto, 'Noto Sans Kannada', sans-serif",lineHeightCompensation:1.1},ko:{baseFontFamily:"'Nanum Gothic', 'Apple SD Gothic Neo', 'Malgun Gothic', Roboto, Noto, 'Noto Sans CJK KR', sans-serif",lineHeightCompensation:1.167},lo:{baseFontFamily:"'Lao Sangam MN', 'Leelawadee UI', 'Lao UI', Roboto, Noto, 'Noto Sans Lao', sans-serif"},ml:{baseFontFamily:"'Malayalam Sangam MN', 'Nirmala UI', Kartika, Roboto, Noto, 'Noto Sans Malayalam', sans-serif",lineHeightCompensation:1.067},or:{baseFontFamily:"'Oriya Sangam MN', 'Nirmala UI', Kalinga, Roboto, Noto, 'Noto Sans Oriya', sans-serif",lineHeightCompensation:1.167},pa:{baseFontFamily:"'Gurmukhi MN', 'Nirmala UI', Kartika, Roboto, Noto, 'Noto Sans Gurmukhi', sans-serif",lineHeightCompensation:1.1},si:{baseFontFamily:"'Sinhala Sangam MN', 'Nirmala UI', 'Iskoola Pota', Roboto, Noto, 'Noto Sans Sinhala', sans-serif",lineHeightCompensation:1.167},ta:{baseFontFamily:"'Tamil Sangam MN', 'Nirmala UI', Latha, Roboto, Noto, 'Noto Sans Tamil', sans-serif",lineHeightCompensation:1.067},te:{baseFontFamily:"'Kohinoor Telugu', 'Telugu Sangam MN', 'Nirmala UI', Gautami, Roboto, Noto, 'Noto Sans Telugu', sans-serif"},th:{baseFontFamily:"Thonburi, 'Leelawadee UI', 'Cordia New', Roboto, Noto, 'Noto Sans Thai', sans-serif",lineHeightCompensation:1.067},zh:{baseFontFamily:"'方体', 'PingFang SC', '黑体', 'Heiti SC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK SC', sans-serif",lineHeightCompensation:1.167},"zh-Hant":{baseFontFamily:"'方體', 'PingFang TC', '黑體', 'Heiti TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK TC', sans-serif",lineHeightCompensation:1.167},"zh-TW":{baseFontFamily:"'方體', 'PingFang TC', '黑體', 'Heiti TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK TC', sans-serif",lineHeightCompensation:1.167},"zh-HK":{baseFontFamily:"'方體', 'PingFang HK', '方體', 'PingFang TC', '黑體', 'Heiti TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', Roboto, Noto, 'Noto Sans CJK TC', sans-serif",lineHeightCompensation:1.167}},ut=tr,or=nr,rr=ir;var J=(r=>(r.start="start",r.left="left",r.right="right",r.justify="justify",r))(J||{});const le={range:[0,100],step:1},Ue={range:[.7,4],step:.05},ee={range:[100,1e3],step:100},Te={range:[50,250],step:10},Ne={range:[0,1],step:.125},Me={range:[1,2.5],step:.1},ce={range:[20,100],step:1},Ie={range:[0,3],step:.25},He={range:[0,3],step:.25},De={range:[0,2],step:.125},We={range:[.7,4],step:.05},Be={range:[0,1],step:.1},je={range:[.5,4],step:.1},te={range:[5,60],step:5};class Ge{constructor(){}toFlag(e){return`readium-${e}-on`}toUnitless(e){return e.toString()}toPercentage(e,t=!1){return t||e>0&&e<=1?`${Math.round(e*100)}%`:`${e}%`}toVw(e){const t=Math.round(e*100);return`${Math.min(t,100)}vw`}toVh(e){const t=Math.round(e*100);return`${Math.min(t,100)}vh`}toPx(e){return`${e}px`}toRem(e){return`${e}rem`}}class Yt extends Ge{constructor(e){super(),this.a11yNormalize=e.a11yNormalize??null,this.bodyHyphens=e.bodyHyphens??null,this.fontFamily=e.fontFamily??null,this.fontWeight=e.fontWeight??null,this.iOSPatch=e.iOSPatch??null,this.iPadOSPatch=e.iPadOSPatch??null,this.letterSpacing=e.letterSpacing??null,this.ligatures=e.ligatures??null,this.lineHeight=e.lineHeight??null,this.noRuby=e.noRuby??null,this.paraIndent=e.paraIndent??null,this.paraSpacing=e.paraSpacing??null,this.textAlign=e.textAlign??null,this.wordSpacing=e.wordSpacing??null,this.zoom=e.zoom??null}toCSSProperties(){const e={};return this.a11yNormalize&&(e["--USER__a11yNormalize"]=this.toFlag("a11y")),this.bodyHyphens&&(e["--USER__bodyHyphens"]=this.bodyHyphens),this.fontFamily&&(e["--USER__fontFamily"]=this.fontFamily),this.fontWeight!=null&&(e["--USER__fontWeight"]=this.toUnitless(this.fontWeight)),this.iOSPatch&&(e["--USER__iOSPatch"]=this.toFlag("iOSPatch")),this.iPadOSPatch&&(e["--USER__iPadOSPatch"]=this.toFlag("iPadOSPatch")),this.letterSpacing!=null&&(e["--USER__letterSpacing"]=this.toRem(this.letterSpacing)),this.ligatures&&(e["--USER__ligatures"]=this.ligatures),this.lineHeight!=null&&(e["--USER__lineHeight"]=this.toUnitless(this.lineHeight)),this.noRuby&&(e["--USER__noRuby"]=this.toFlag("noRuby")),this.paraIndent!=null&&(e["--USER__paraIndent"]=this.toRem(this.paraIndent)),this.paraSpacing!=null&&(e["--USER__paraSpacing"]=this.toRem(this.paraSpacing)),this.textAlign&&(e["--USER__textAlign"]=this.textAlign),this.wordSpacing!=null&&(e["--USER__wordSpacing"]=this.toRem(this.wordSpacing)),this.zoom!==null&&(e["--USER__zoom"]=this.toPercentage(this.zoom,!0)),e}}class gi extends Ge{constructor(e){super(),this.experiments=e.experiments??null}toCSSProperties(){const e={};return this.experiments&&this.experiments.forEach(t=>{e["--RS__"+t]=ut[t].value}),e}}class fi{constructor(e){this.rsProperties=e.rsProperties,this.userProperties=e.userProperties}update(e){e.experiments&&(this.rsProperties.experiments=e.experiments);const t={a11yNormalize:e.textNormalization,bodyHyphens:typeof e.hyphens!="boolean"?null:e.hyphens?"auto":"none",fontFamily:e.fontFamily,fontWeight:e.fontWeight,iOSPatch:e.iOSPatch,iPadOSPatch:e.iPadOSPatch,letterSpacing:e.letterSpacing,ligatures:typeof e.ligatures!="boolean"?null:e.ligatures?"common-ligatures":"none",lineHeight:e.lineHeight,noRuby:e.noRuby,paraIndent:e.paragraphIndent,paraSpacing:e.paragraphSpacing,textAlign:e.textAlign,wordSpacing:e.wordSpacing,zoom:e.zoom};this.userProperties=new Yt(t)}}function yi(r,e){return r==null||e==null||r<=e?r:void 0}function _i(r,e){return r==null||e==null||r>=e?r:void 0}function I(r){return typeof r=="string"?r:r===null?null:void 0}function R(r){return typeof r=="boolean"||r==null?r:void 0}function Ve(r,e){if(r!==void 0)return r===null?null:e[r]!==void 0?r:void 0}function he(r){return typeof r=="boolean"||typeof r=="number"&&r>=0?r:r===null?null:void 0}function v(r){if(r!==void 0)return r===null?null:r<0?void 0:r}function T(r,e){if(r===void 0)return;if(r===null)return null;const t=Math.min(...e),n=Math.max(...e);return r>=t&&r<=n?r:void 0}function mt(r,e){return r===void 0?e:r}function qt(r){if(r!==void 0)return r===null?null:r.filter(e=>e in ut)}class Pe{constructor(e={}){this.fontFamily=I(e.fontFamily),this.fontWeight=T(e.fontWeight,ee.range),this.hyphens=R(e.hyphens),this.iOSPatch=R(e.iOSPatch),this.iPadOSPatch=R(e.iPadOSPatch),this.letterSpacing=v(e.letterSpacing),this.ligatures=R(e.ligatures),this.lineHeight=v(e.lineHeight),this.noRuby=R(e.noRuby),this.paragraphIndent=v(e.paragraphIndent),this.paragraphSpacing=v(e.paragraphSpacing),this.textAlign=Ve(e.textAlign,J),this.textNormalization=R(e.textNormalization),this.wordSpacing=v(e.wordSpacing),this.zoom=T(e.zoom,We.range)}static serialize(e){const{...t}=e;return JSON.stringify(t)}static deserialize(e){try{const t=JSON.parse(e);return new Pe(t)}catch(t){return console.error("Failed to deserialize preferences:",t),null}}merging(e){const t={...this};for(const n of Object.keys(e))e[n]!==void 0&&(t[n]=e[n]);return new Pe(t)}}class Si{constructor(e){this.fontFamily=I(e.fontFamily)||null,this.fontWeight=T(e.fontWeight,ee.range)||null,this.hyphens=R(e.hyphens)??null,this.iOSPatch=e.iOSPatch===!1?!1:(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile",this.iPadOSPatch=e.iPadOSPatch===!1?!1:L.OS.iPadOS&&L.iOSRequest==="desktop",this.letterSpacing=v(e.letterSpacing)||null,this.ligatures=R(e.ligatures)??null,this.lineHeight=v(e.lineHeight)||null,this.noRuby=R(e.noRuby)??!1,this.paragraphIndent=v(e.paragraphIndent)??null,this.paragraphSpacing=v(e.paragraphSpacing)??null,this.textAlign=Ve(e.textAlign,J)||null,this.textNormalization=R(e.textNormalization)??!1,this.wordSpacing=v(e.wordSpacing)||null,this.zoom=T(e.zoom,We.range)||1,this.experiments=qt(e.experiments)??null}}class Jt{constructor(e,t,n){this.fontFamily=null,this.fontWeight=null,this.hyphens=null,this.iOSPatch=null,this.iPadOSPatch=null,this.letterSpacing=null,this.ligatures=null,this.lineHeight=null,this.noRuby=null,this.paragraphIndent=null,this.paragraphSpacing=null,this.textAlign=null,this.textNormalization=null,this.wordSpacing=null,n&&(this.fontFamily=e.fontFamily||t.fontFamily||null,this.fontWeight=e.fontWeight!==void 0?e.fontWeight:t.fontWeight!==void 0?t.fontWeight:null,this.hyphens=typeof e.hyphens=="boolean"?e.hyphens:t.hyphens??null,this.iOSPatch=e.iOSPatch===!1?!1:e.iOSPatch===!0?(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile":t.iOSPatch,this.iPadOSPatch=e.iPadOSPatch===!1?!1:e.iPadOSPatch===!0?L.OS.iPadOS&&L.iOSRequest==="desktop":t.iPadOSPatch,this.letterSpacing=e.letterSpacing!==void 0?e.letterSpacing:t.letterSpacing!==void 0?t.letterSpacing:null,this.ligatures=typeof e.ligatures=="boolean"?e.ligatures:t.ligatures??null,this.lineHeight=e.lineHeight!==void 0?e.lineHeight:t.lineHeight!==void 0?t.lineHeight:null,this.noRuby=typeof e.noRuby=="boolean"?e.noRuby:t.noRuby??null,this.paragraphIndent=e.paragraphIndent!==void 0?e.paragraphIndent:t.paragraphIndent!==void 0?t.paragraphIndent:null,this.paragraphSpacing=e.paragraphSpacing!==void 0?e.paragraphSpacing:t.paragraphSpacing!==void 0?t.paragraphSpacing:null,this.textAlign=e.textAlign||t.textAlign||null,this.textNormalization=typeof e.textNormalization=="boolean"?e.textNormalization:t.textNormalization??null,this.wordSpacing=e.wordSpacing!==void 0?e.wordSpacing:t.wordSpacing!==void 0?t.wordSpacing:null),this.zoom=e.zoom!==void 0?e.zoom:t.zoom!==void 0?t.zoom:null,this.experiments=t.experiments||null}}class U{constructor({initialValue:e=null,effectiveValue:t,isEffective:n,onChange:i}){this._value=e,this._effectiveValue=t,this._isEffective=n,this._onChange=i}set value(e){this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}clear(){this._value=null}}class O extends U{set value(e){this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}clear(){this._value=null}toggle(){this._value=!this._value,this._onChange(this._value)}}class Zt extends U{constructor({initialValue:e=null,effectiveValue:t,isEffective:n,onChange:i,supportedValues:o}){super({initialValue:e,effectiveValue:t,isEffective:n,onChange:i}),this._supportedValues=o}set value(e){if(e&&!this._supportedValues.includes(e))throw new Error(`Value '${String(e)}' is not in the supported values for this preference.`);this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}get supportedValues(){return this._supportedValues}clear(){this._value=null}}class k extends U{constructor({initialValue:e=null,effectiveValue:t,isEffective:n,onChange:i,supportedRange:o,step:a}){super({initialValue:e,effectiveValue:t,isEffective:n,onChange:i}),this._supportedRange=o,this._step=a,this._decimals=this._step.toString().includes(".")?this._step.toString().split(".")[1].length:0}set value(e){if(e&&(e<this._supportedRange[0]||e>this._supportedRange[1]))throw new Error(`Value '${String(e)}' is out of the supported range for this preference.`);this._value=e,this._onChange(this._value)}get value(){return this._value}get effectiveValue(){return this._effectiveValue}get isEffective(){return this._isEffective}get supportedRange(){return this._supportedRange}get step(){return this._step}increment(){this._value&&this._value<this._supportedRange[1]&&(this._value=Math.min(Math.round((this._value+this._step)*10**this._decimals)/10**this._decimals,this._supportedRange[1]),this._onChange(this._value))}decrement(){this._value&&this._value>this._supportedRange[0]&&(this._value=Math.max(Math.round((this._value-this._step)*10**this._decimals)/10**this._decimals,this._supportedRange[0]),this._onChange(this._value))}format(e){return e.toString()}clear(){this._value=null}}class Qt{constructor(e,t,n){this.preferences=e,this.settings=t,this.metadata=n}clear(){this.preferences=new Pe({})}updatePreference(e,t){this.preferences[e]=t}get isDisplayTransformable(){return this.metadata?.accessibility?.feature?.some(e=>e.value===Ze.DISPLAY_TRANSFORMABILITY.value)??!1}get fontFamily(){return new U({initialValue:this.preferences.fontFamily,effectiveValue:this.settings.fontFamily||null,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("fontFamily",e??null)}})}get fontWeight(){return new k({initialValue:this.preferences.fontWeight,effectiveValue:this.settings.fontWeight||400,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("fontWeight",e??null)},supportedRange:ee.range,step:ee.step})}get hyphens(){return new O({initialValue:this.preferences.hyphens,effectiveValue:this.settings.hyphens||!1,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("hyphens",e??null)}})}get iOSPatch(){return new O({initialValue:this.preferences.iOSPatch,effectiveValue:this.settings.iOSPatch||!1,isEffective:!0,onChange:e=>{this.updatePreference("iOSPatch",e??null)}})}get iPadOSPatch(){return new O({initialValue:this.preferences.iPadOSPatch,effectiveValue:this.settings.iPadOSPatch||!1,isEffective:!0,onChange:e=>{this.updatePreference("iPadOSPatch",e??null)}})}get letterSpacing(){return new k({initialValue:this.preferences.letterSpacing,effectiveValue:this.settings.letterSpacing||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("letterSpacing",e??null)},supportedRange:Ne.range,step:Ne.step})}get ligatures(){return new O({initialValue:this.preferences.ligatures,effectiveValue:this.settings.ligatures||!0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("ligatures",e??null)}})}get lineHeight(){return new k({initialValue:this.preferences.lineHeight,effectiveValue:this.settings.lineHeight,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("lineHeight",e??null)},supportedRange:Me.range,step:Me.step})}get noRuby(){return new O({initialValue:this.preferences.noRuby,effectiveValue:this.settings.noRuby||!1,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("noRuby",e??null)}})}get paragraphIndent(){return new k({initialValue:this.preferences.paragraphIndent,effectiveValue:this.settings.paragraphIndent||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("paragraphIndent",e??null)},supportedRange:Ie.range,step:Ie.step})}get paragraphSpacing(){return new k({initialValue:this.preferences.paragraphSpacing,effectiveValue:this.settings.paragraphSpacing||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("paragraphSpacing",e??null)},supportedRange:He.range,step:He.step})}get textAlign(){return new Zt({initialValue:this.preferences.textAlign,effectiveValue:this.settings.textAlign||J.start,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("textAlign",e??null)},supportedValues:Object.values(J)})}get textNormalization(){return new O({initialValue:this.preferences.textNormalization,effectiveValue:this.settings.textNormalization||!1,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("textNormalization",e??null)}})}get wordSpacing(){return new k({initialValue:this.preferences.wordSpacing,effectiveValue:this.settings.wordSpacing||0,isEffective:this.isDisplayTransformable,onChange:e=>{this.updatePreference("wordSpacing",e??null)},supportedRange:De.range,step:De.step})}get zoom(){return new k({initialValue:this.preferences.zoom,effectiveValue:this.settings.zoom||1,isEffective:CSS.supports("zoom","1")??!1,onChange:e=>{this.updatePreference("zoom",e??null)},supportedRange:We.range,step:We.step})}}const bi=r=>{if("blob"in r&&r.blob.type)return r.blob.type;if(r.as==="script")return"text/javascript";if(r.as==="link"&&"url"in r){const e=r.url.toLowerCase();if(e.endsWith(".css"))return"text/css";if([".js",".mjs",".cjs"].some(t=>e.endsWith(t)))return"text/javascript"}},vi=(r,e)=>{e.attributes&&Object.entries(e.attributes).forEach(([t,n])=>{t==="type"||t==="rel"||t==="href"||t==="src"||n!=null&&(typeof n=="boolean"?n&&r.setAttribute(t,""):r.setAttribute(t,n))})},ar=(r,e,t)=>{const n=r.createElement("script");n.dataset.readium="true",e.id&&(n.id=e.id);const i=e.type||bi(e);return i&&(n.type=i),vi(n,e),n.src=t,n},wi=(r,e,t)=>{const n=r.createElement("link");n.dataset.readium="true",e.id&&(n.id=e.id),e.rel&&(n.rel=e.rel);const i=e.type||bi(e);return i&&(n.type=i),vi(n,e),n.href=t,n};class en{constructor(e){this.blobStore=new Map,this.createdBlobUrls=new Set,this.allowedDomains=[],this.injectableIdCounter=0,this.allowedDomains=(e.allowedDomains||[]).map(t=>{try{return new URL(t),t}catch{throw new Error(`Invalid allowed domain: "${t}". Must be a valid URL (e.g., "https://fonts.googleapis.com").`)}}),this.rules=e.rules.map(t=>{const n={...t};return t.prepend&&(n.prepend=t.prepend.map(i=>({...i,id:i.id||`injectable-${this.injectableIdCounter++}`})).reverse()),t.append&&(n.append=t.append.map(i=>({...i,id:i.id||`injectable-${this.injectableIdCounter++}`}))),n})}dispose(){for(const e of this.createdBlobUrls)try{URL.revokeObjectURL(e)}catch(t){console.warn("Failed to revoke blob URL:",e,t)}this.createdBlobUrls.clear()}getAllowedDomains(){return[...this.allowedDomains]}async injectForDocument(e,t){for(const n of this.rules)this.matchesRule(n,t)&&await this.applyRule(e,n)}matchesRule(e,t){const n=t.href;return e.resources.some(i=>i instanceof RegExp?i.test(n):n===i)}async getOrCreateBlobUrl(e){const t=e.id;if(this.blobStore.has(t)){const n=this.blobStore.get(t);return n.refCount++,n.url}if("blob"in e){const n=URL.createObjectURL(e.blob);return this.blobStore.set(t,{url:n,refCount:1}),this.createdBlobUrls.add(n),n}throw new Error("Resource must have a blob property")}async releaseBlobUrl(e){if(!this.createdBlobUrls.has(e))return;const t=Array.from(this.blobStore.values()).find(n=>n.url===e);if(t&&(t.refCount--,t.refCount<=0)){URL.revokeObjectURL(e),this.createdBlobUrls.delete(e);for(const[n,i]of this.blobStore.entries())if(i.url===e){this.blobStore.delete(n);break}}}async getResourceUrl(e,t){if("url"in e){const n=new URL(e.url,t.baseURI).toString();if(!this.isValidUrl(n,t))throw new Error(`Invalid URL: Only HTTPS, data:, blob:, or localhost HTTP URLs are allowed. Got: ${e.url}`);return n}else return this.getOrCreateBlobUrl(e)}createPreloadLink(e,t,n){if(t.as!=="link"||t.rel!=="preload")return;const i={...t,rel:"preload",attributes:{...t.attributes,as:t.as}},o=wi(e,i,n);e.head.appendChild(o)}createElement(e,t,n){if(t.as==="script")return ar(e,t,n);if(t.as==="link")return wi(e,t,n);throw new Error(`Unsupported element type: ${t.as}`)}async applyRule(e,t){const n=[],i=t.prepend?t.prepend.filter(a=>!a.condition||a.condition(e)):[],o=t.append?t.append.filter(a=>!a.condition||a.condition(e)):[];try{for(const a of i)await this.processInjectable(a,e,n,"prepend");for(const a of o)await this.processInjectable(a,e,n,"append")}catch(a){for(const{element:s,url:l}of n)try{s.remove(),await this.releaseBlobUrl(l)}catch(c){console.error("Error during cleanup:",c)}throw a}}async processInjectable(e,t,n,i){const o=e.target==="body"?t.body:t.head;if(!o)return;let a=null;try{if(a=await this.getResourceUrl(e,t),e.rel==="preload"&&"url"in e)this.createPreloadLink(t,e,a);else{const s=this.createElement(t,e,a);n.push({element:s,url:a}),i==="prepend"?o.prepend(s):o.append(s)}}catch(s){throw console.error("Failed to process resource:",s),a&&"blob"in e&&await this.releaseBlobUrl(a),s}}isValidUrl(e,t){try{const n=new URL(e,t.baseURI);if(n.protocol==="data:"||n.protocol==="blob:"&&this.createdBlobUrls.has(e))return!0;if(this.allowedDomains.length>0){const i=n.origin;return this.allowedDomains.some(o=>{const a=new URL(o).origin;return i===a})}return!1}catch{return!1}}}const Ce=r=>r.replace(/\/\/.*/g,"").replace(/\/\*[\s\S]*?\*\//g,"").replace(/\n/g,"").replace(/\s+/g," "),$e=r=>r.replace(/\/\*(?:(?!\*\/)[\s\S])*\*\/|[\r\n\t]+/g,"").replace(/ {2,}/g," "),sr=`/*!
|
|
97
97
|
* Readium CSS v.2.0.5
|
|
98
98
|
* Copyright (c) 2017–2026. Readium Foundation. All rights reserved.
|
|
99
99
|
* Use of this source code is governed by a BSD-style license which is detailed in the
|
|
@@ -383,7 +383,7 @@ window._readium_eventBlocker = null;
|
|
|
383
383
|
}
|
|
384
384
|
});
|
|
385
385
|
})();
|
|
386
|
-
`;function cr(r){const e=r.filter(o=>o.mediaType.isHTML).map(o=>o.href),t=e.length>0?e:[/\.html$/,/\.xhtml$/,/\/$/],n=[{id:"css-selector-generator",as:"script",target:"head",blob:new Blob([
|
|
386
|
+
`;function cr(r){const e=r.filter(o=>o.mediaType.isHTML).map(o=>o.href),t=e.length>0?e:[/\.html$/,/\.xhtml$/,/\/$/],n=[{id:"css-selector-generator",as:"script",target:"head",blob:new Blob([Ce(Ri)],{type:"text/javascript"})},{id:"webpub-execution",as:"script",target:"head",blob:new Blob([Ce(lr)],{type:"text/javascript"})}],i=[{id:"onload-proxy",as:"script",target:"head",blob:new Blob([Ce(Pi)],{type:"text/javascript"}),condition:o=>!!(o.querySelector("script")||o.querySelector("body[onload]:not(body[onload=''])"))},{id:"readium-css-webpub",as:"link",target:"head",blob:new Blob([$e(sr)],{type:"text/css"}),rel:"stylesheet"}];return[{resources:t,prepend:n,append:i}]}class hr{constructor(e){if(this.detectedTools=new Set,!e.onDetected)throw new Error("onDetected callback is required");this.options=e,this.setupDetection()}isAutomationToolPresent(){const e=window;return e.domAutomation||e.domAutomationController?"Selenium":navigator.webdriver===!0?"Puppeteer/Playwright":e.__webdriver_evaluate||e.__selenium_evaluate?"Chrome Automation":e.callPhantom||e._phantom?"PhantomJS":e.__nightmare?"Nightmare":e.$testCafe?"TestCafe":null}setupDetection(){const e=this.isAutomationToolPresent();if(e){this.handleDetected(e);return}this.observer=new MutationObserver(()=>{const t=this.isAutomationToolPresent();t&&!this.detectedTools.has(t)&&this.handleDetected(t)}),this.observer.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0}),window.addEventListener("unload",()=>this.destroy())}handleDetected(e){this.detectedTools.add(e),this.options.onDetected?.(e)}destroy(){this.observer?.disconnect(),this.observer=void 0,this.detectedTools.clear()}}let dr=0;function ur(){return++dr}const mr=`
|
|
387
387
|
onmessage = function(event) {
|
|
388
388
|
var action = event.data;
|
|
389
389
|
var startTime = performance.now()
|
|
@@ -408,10 +408,10 @@ onmessage = function(event) {
|
|
|
408
408
|
transform: translateY(-50%);
|
|
409
409
|
}
|
|
410
410
|
}
|
|
411
|
-
`,document.head.appendChild(t),this.styleElement=t,this.beforePrintHandler=n=>(n.preventDefault(),this.onPrintAttempt?.(),!1),window.addEventListener("beforeprint",this.beforePrintHandler)}destroy(){this.beforePrintHandler&&(window.removeEventListener("beforeprint",this.beforePrintHandler),this.beforePrintHandler=null),this.styleElement?.parentNode&&(this.styleElement.parentNode.removeChild(this.styleElement),this.styleElement=null)}}class br{constructor(e={}){this.onContextMenuBlocked=e.onContextMenuBlocked,this.contextMenuHandler=this.handleContextMenu.bind(this),document.addEventListener("contextmenu",this.contextMenuHandler,!0),window.addEventListener("unload",()=>this.destroy())}handleContextMenu(e){e.preventDefault(),e.stopPropagation();const t={type:"context_menu",timestamp:Date.now(),clientX:e.clientX,clientY:e.clientY,targetFrameSrc:""};return this.onContextMenuBlocked&&this.onContextMenuBlocked(t),!1}destroy(){this.contextMenuHandler&&(document.removeEventListener("contextmenu",this.contextMenuHandler,!0),this.contextMenuHandler=void 0)}}const de="readium:navigator:suspiciousActivity";class nn{dispatchSuspiciousActivity(e,t){const n=new CustomEvent(de,{detail:{type:e,timestamp:Date.now(),...t}});window.dispatchEvent(n)}constructor(e={}){e.monitorDevTools&&(this.devToolsDetector=new yr({onDetected:()=>{this.dispatchSuspiciousActivity("developer_tools",{targetFrameSrc:"",key:"",code:"",keyCode:-1,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1})}})),e.checkAutomation&&(this.automationDetector=new hr({onDetected:t=>{this.dispatchSuspiciousActivity("automation_detected",{tool:t})}})),e.checkIFrameEmbedding&&(this.iframeEmbeddingDetector=new _r({onDetected:t=>{this.dispatchSuspiciousActivity("iframe_embedding_detected",{isCrossOrigin:t})}})),e.protectPrinting?.disable&&(this.printProtector=new Sr({...e.protectPrinting,onPrintAttempt:()=>{this.dispatchSuspiciousActivity("print",{})}})),e.disableContextMenu&&(this.contextMenuProtector=new br({onContextMenuBlocked:t=>{this.dispatchSuspiciousActivity("context_menu",t)}}))}destroy(){this.automationDetector?.destroy(),this.devToolsDetector?.destroy(),this.iframeEmbeddingDetector?.destroy(),this.printProtector?.destroy(),this.contextMenuProtector?.destroy()}}const ue="readium:navigator:keyboardPeripheral";class on{constructor(e={}){this.keyManager=new ni,this.setupKeyboardPeripherals(e.keyboardPeripherals||[])}setupKeyboardPeripherals(e){if(e.length>0){const t=n=>{const i=new CustomEvent(ue,{detail:n});window.dispatchEvent(i)};this.keydownHandler=this.keyManager.createUnifiedHandler("",e,t),this.keydownHandler&&document.addEventListener("keydown",this.keydownHandler,!0)}window.addEventListener("unload",()=>this.destroy())}destroy(){this.keydownHandler&&(document.removeEventListener("keydown",this.keydownHandler,!0),this.keydownHandler=void 0)}}const vr=r=>({frameLoaded:r.frameLoaded||(()=>{}),positionChanged:r.positionChanged||(()=>{}),tap:r.tap||(()=>!1),click:r.click||(()=>!1),zoom:r.zoom||(()=>{}),scroll:r.scroll||(()=>{}),customEvent:r.customEvent||(()=>{}),handleLocator:r.handleLocator||(()=>!1),textSelected:r.textSelected||(()=>{}),contentProtection:r.contentProtection||(()=>{}),contextMenu:r.contextMenu||(()=>{}),peripheral:r.peripheral||(()=>{})});class Ei extends $t{constructor(e,t,n,i=void 0,o={preferences:{},defaults:{}}){super(),this.currentIndex=0,this._preferencesEditor=null,this._injector=null,this._navigatorProtector=null,this._keyboardPeripheralsManager=null,this._suspiciousActivityListener=null,this._keyboardPeripheralListener=null,this.webViewport={readingOrder:[],progressions:new Map,positions:null},this.pub=t,this.container=e,this.listeners=vr(n),this._preferences=new Re(o.preferences),this._defaults=new Si(o.defaults),this._settings=new Jt(this._preferences,this._defaults,this.hasDisplayTransformability),this._css=new fi({rsProperties:new gi({experiments:this._settings.experiments||null}),userProperties:new Yt({zoom:this._settings.zoom})});const a=cr(t.readingOrder.items),s=o.injectables||{rules:[],allowedDomains:[]};if(this._injector=new en({rules:[...a,...s.rules],allowedDomains:s.allowedDomains}),this._contentProtection=o.contentProtection||{},this._keyboardPeripherals=this.mergeKeyboardPeripherals(this._contentProtection,o.keyboardPeripherals||[]),(this._contentProtection.disableContextMenu||this._contentProtection.checkAutomation||this._contentProtection.checkIFrameEmbedding||this._contentProtection.monitorDevTools||this._contentProtection.protectPrinting?.disable)&&(this._navigatorProtector=new nn(this._contentProtection),this._suspiciousActivityListener=l=>{const{type:c,...h}=l.detail;c==="context_menu"?this.listeners.contextMenu(h):this.listeners.contentProtection(c,h)},window.addEventListener(de,this._suspiciousActivityListener)),this._keyboardPeripherals.length>0&&(this._keyboardPeripheralsManager=new on({keyboardPeripherals:this._keyboardPeripherals}),this._keyboardPeripheralListener=l=>{const c=l.detail;this.listeners.peripheral(c)},window.addEventListener(ue,this._keyboardPeripheralListener)),i&&typeof i.copyWithLocations=="function"){this.currentLocation=i;const l=this.pub.readingOrder.findIndexWithHref(i.href);l>=0&&(this.currentIndex=l)}else this.currentLocation=this.createCurrentLocator()}async load(){await this.updateCSS(!1);const e=this.compileCSSProperties(this._css);this.framePool=new mi(this.container,e,this._injector,this._contentProtection,this._keyboardPeripherals),await this.apply()}get settings(){return Object.freeze({...this._settings})}get preferencesEditor(){return this._preferencesEditor===null&&(this._preferencesEditor=new Qt(this._preferences,this.settings,this.pub.metadata)),this._preferencesEditor}async submitPreferences(e){this._preferences=this._preferences.merging(e),await this.applyPreferences()}async applyPreferences(){this._settings=new Jt(this._preferences,this._defaults,this.hasDisplayTransformability),this._preferencesEditor!==null&&(this._preferencesEditor=new Qt(this._preferences,this.settings,this.pub.metadata)),await this.updateCSS(!0)}async updateCSS(e){this._css.update(this._settings),e&&await this.commitCSS(this._css)}compileCSSProperties(e){const t={};for(const[n,i]of Object.entries(e.rsProperties.toCSSProperties()))t[n]=i;for(const[n,i]of Object.entries(e.userProperties.toCSSProperties()))t[n]=i;return t}async commitCSS(e){const t=this.compileCSSProperties(e);this.framePool.setCSSProperties(t)}get _cframes(){return this.framePool.currentFrames}get hasDisplayTransformability(){return this.pub.metadata?.accessibility?.feature?.some(e=>e.value===Ze.DISPLAY_TRANSFORMABILITY.value)??!1}eventListener(e,t){switch(e){case"_pong":this.listeners.frameLoaded(this.framePool.currentFrames[0].iframe.contentWindow),this.listeners.positionChanged(this.currentLocation);break;case"first_visible_locator":const n=N.deserialize(t);if(!n)break;this.currentLocation=new N({href:this.currentLocation.href,type:this.currentLocation.type,title:this.currentLocation.title,locations:n?.locations,text:n?.text}),this.listeners.positionChanged(this.currentLocation);break;case"text_selected":this.listeners.textSelected(t);break;case"click":case"tap":const i=t;if(i.interactiveElement){const l=new DOMParser().parseFromString(i.interactiveElement,"text/html").body.children[0];if(l.nodeType===l.ELEMENT_NODE&&l.nodeName==="A"&&l.hasAttribute("href")){const c=l.attributes.getNamedItem("href")?.value;if(c.startsWith("#"))this.go(this.currentLocation.copyWithLocations({fragments:[c.substring(1)]}),!1,()=>{});else if(c.startsWith("mailto:")||c.startsWith("tel:"))this.listeners.handleLocator(new V({href:c}).locator);else try{let h;if(c.startsWith("http://")||c.startsWith("https://"))h=c;else if(this.currentLocation.href.startsWith("http://")||this.currentLocation.href.startsWith("https://")){const m=new URL(this.currentLocation.href);h=new URL(c,m).href}else h=dt.join(dt.dirname(this.currentLocation.href),c);const u=this.pub.readingOrder.findWithHref(h);u?this.goLink(u,!1,()=>{}):(console.warn(`Internal link not found in readingOrder: ${h}`),this.listeners.handleLocator(new V({href:c}).locator))}catch(h){console.warn(`Couldn't resolve internal link for ${c}: ${h}`),this.listeners.handleLocator(new V({href:c}).locator)}}else console.log("Clicked on",l)}else if(e==="click"?this.listeners.click(i):this.listeners.tap(i))break;break;case"scroll":this.listeners.scroll(t);break;case"zoom":this.listeners.zoom(t);break;case"progress":this.syncLocation(t);break;case"content_protection":const o=t;this.listeners.contentProtection(o.type,o);break;case"context_menu":this.listeners.contextMenu(t);break;case"keyboard_peripherals":const a=t,s={...a,interactiveElement:void 0};a.interactiveElement&&(s.interactiveElement=new DOMParser().parseFromString(a.interactiveElement,"text/html").body.children[0]),this.listeners.peripheral(s);break;case"log":console.log(this.framePool.currentFrames[0]?.source?.split("/")[3],...t);break;default:this.listeners.customEvent(e,t);break}}determineModules(){const e=Vo.slice(),t=se(this.pub.metadata);return t==="cjk-vertical"||t==="mongolian-vertical"?e.map(n=>n==="webpub_snapper"?"cjk_vertical_snapper":n):e}attachListener(){this.framePool.currentFrames[0]?.msg&&(this.framePool.currentFrames[0].msg.listener=(e,t)=>{this.eventListener(e,t)})}async apply(){if(await this.framePool.update(this.pub,this.currentLocation,this.determineModules()),this.attachListener(),this.pub.readingOrder.findIndexWithHref(this.currentLocation.href)<0)throw Error("Link for "+this.currentLocation.href+" not found!")}async destroy(){this._suspiciousActivityListener&&window.removeEventListener(de,this._suspiciousActivityListener),this._keyboardPeripheralListener&&window.removeEventListener(ue,this._keyboardPeripheralListener),this._navigatorProtector?.destroy(),this._keyboardPeripheralsManager?.destroy(),await this.framePool?.destroy()}async changeResource(e){if(e===0)return!1;const t=this.pub.readingOrder.findIndexWithHref(this.currentLocation.href),n=Math.max(0,Math.min(this.pub.readingOrder.items.length-1,t+e));return n===t?!1:(this.currentIndex=n,this.currentLocation=this.createCurrentLocator(),await this.apply(),!0)}updateViewport(e){this.webViewport.readingOrder=[],this.webViewport.progressions.clear(),this.webViewport.positions=null,this.currentLocation&&(this.webViewport.readingOrder.push(this.currentLocation.href),this.webViewport.progressions.set(this.currentLocation.href,e),this.currentLocation.locations?.position!==void 0&&(this.webViewport.positions=[this.currentLocation.locations.position]))}async syncLocation(e){const t=e;this.currentLocation&&(this.currentLocation=this.currentLocation.copyWithLocations({progression:t.start})),this.updateViewport(t),this.listeners.positionChanged(this.currentLocation),await this.framePool.update(this.pub,this.currentLocation,this.determineModules())}goBackward(e,t){this.changeResource(-1).then(n=>{t(n)})}goForward(e,t){this.changeResource(1).then(n=>{t(n)})}get currentLocator(){return this.currentLocation}get viewport(){return this.webViewport}get isScrollStart(){const e=this.viewport.readingOrder[0];return this.viewport.progressions.get(e)?.start===0}get isScrollEnd(){const e=this.viewport.readingOrder[this.viewport.readingOrder.length-1];return this.viewport.progressions.get(e)?.end===1}get canGoBackward(){const e=this.pub.readingOrder.items[0]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.start===0)}get canGoForward(){const e=this.pub.readingOrder.items[this.pub.readingOrder.items.length-1]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.end===1)}get readingProgression(){return this.pub.metadata.effectiveReadingProgression}get publication(){return this.pub}async loadLocator(e,t){let n=!1,i=typeof e.locations.getCssSelector=="function"&&e.locations.getCssSelector();if(e.text?.highlight?n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_text",i?[e.text?.serialize(),i]:e.text?.serialize(),h=>l(h))}):i&&(n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_text",["",i],h=>l(h))})),n){t(n);return}const o=typeof e.locations.htmlId=="function"&&e.locations.htmlId();if(o&&(n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_id",o,h=>l(h))})),n){t(n);return}const a=e?.locations?.progression;a&&a>0?n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_progression",a,h=>l(h))}):n=!0,t(n)}go(e,t,n){const i=e.href.split("#")[0];if(!this.pub.readingOrder.findWithHref(i))return n(this.listeners.handleLocator(e));const a=this.pub.readingOrder.findIndexWithHref(i);a>=0&&(this.currentIndex=a),this.currentLocation=this.createCurrentLocator(),this.apply().then(()=>this.loadLocator(e,s=>n(s))).then(()=>{this.attachListener()})}goLink(e,t,n){return this.go(e.locator,t,n)}createCurrentLocator(){const t=this.pub.readingOrder.items[this.currentIndex];if(!t)throw new Error("No current resource available");const i=this.currentLocation&&this.currentLocation.href===t.href&&this.currentLocation.locations.progression?this.currentLocation.locations.progression:0;return this.pub.manifest.locatorFromLink(t)||new N({href:t.href,type:t.type||"text/html",locations:new C({fragments:[],progression:i,position:this.currentIndex+1})})}}const wr=Ei,Rr=r=>{const e=r.join(" ");return["upgrade-insecure-requests",`default-src ${e} blob:`,"connect-src 'none'",`script-src ${e} blob: 'unsafe-inline'`,`style-src ${e} blob: 'unsafe-inline'`,`img-src ${e} blob: data:`,`font-src ${e} blob: data:`,`object-src ${e} blob:`,`child-src ${e}`,"form-action 'none'"].join("; ")};class xi{constructor(e,t,n,i){this.injector=null,this.pub=e,this.item=n,this.burl=n.toURL(t)||"",this.cssProperties=i.cssProperties,this.injector=i.injector??null}async build(e=!1){if(this.item.mediaType.isHTML)return await this.buildHtmlFrame(e);if(this.item.mediaType.isBitmap||this.item.mediaType.equals(g.SVG))return this.buildImageFrame();throw Error("Unsupported frame mediatype "+this.item.mediaType.string)}async buildHtmlFrame(e=!1){const t=await this.pub.get(this.item).readAsString();if(!t)throw new Error(`Failed reading item ${this.item.href}`);const n=new DOMParser().parseFromString(t,this.item.mediaType.string),i=n.querySelector("parsererror");if(i){const o=i.querySelector("div");throw new Error(`Failed parsing item ${this.item.href}: ${o?.textContent||i.textContent}`)}return this.injector&&await this.injector.injectForDocument(n,this.item),this.finalizeDOM(n,this.pub.baseURL,this.burl,this.item.mediaType,e,this.cssProperties)}buildImageFrame(){const e=document.implementation.createHTMLDocument(this.item.title||this.item.href),t=document.createElement("img");return t.src=this.burl||"",t.alt=this.item.title||"",t.decoding="async",e.body.appendChild(t),this.finalizeDOM(e,this.pub.baseURL,this.burl,this.item.mediaType,!0)}setProperties(e,t){for(const n in e){const i=e[n];i&&t.documentElement.style.setProperty(n,i)}}finalizeDOM(e,t,n,i,o=!1,a){if(!e)return"";const s=this.injector?.getAllowedDomains?.()||[],l=[...new Set([...t?[t]:[],...s])].filter(Boolean);if(a&&!o&&this.setProperties(a,e),e.body.querySelectorAll("img").forEach(u=>{u.setAttribute("fetchpriority","high")}),i.isHTML&&this.pub.metadata.languages?.[0]){const u=this.pub.metadata.languages[0];if(i===g.XHTML){const m=e.documentElement.lang||e.documentElement.getAttribute("xml:lang"),f=e.body.lang||e.body.getAttribute("xml:lang");f&&!m?(e.documentElement.lang=f,e.documentElement.setAttribute("xml:lang",f),e.body.removeAttribute("xml:lang"),e.body.removeAttribute("lang")):m||(e.documentElement.lang=u,e.documentElement.setAttribute("xml:lang",u))}else i===g.HTML&&!e.documentElement.lang&&(e.documentElement.lang=u)}if(se(this.pub.metadata)==="rtl"&&!e.documentElement.dir&&!e.body.dir&&(e.documentElement.dir=M.rtl),n!==void 0){const u=e.createElement("base");u.href=n,u.dataset.readium="true",e.head.firstChild.before(u)}const h=e.createElement("meta");return h.httpEquiv="Content-Security-Policy",h.content=Rr(l),h.dataset.readium="true",e.head.firstChild.before(h),URL.createObjectURL(new Blob([new XMLSerializer().serializeToString(e)],{type:i.isHTML?i.string:"application/xhtml+xml"}))}}class rn{constructor(e,t={},n=[]){this.hidden=!0,this.destroyed=!1,this.currModules=[],this.frame=document.createElement("iframe"),this.frame.sandbox.value="allow-same-origin allow-scripts",this.frame.classList.add("readium-navigator-iframe"),this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.position="absolute",this.frame.style.pointerEvents="none",this.frame.style.transition="visibility 0s, opacity 0.1s linear",this.source=e,this.contentProtectionConfig={...t},this.keyboardPeripheralsConfig=[...n]}async load(e){return new Promise((t,n)=>{if(this.loader){const i=this.frame.contentWindow;if([...this.currModules].sort().join("|")===[...e].sort().join("|")){try{t(i)}catch{}return}this.comms?.halt(),this.loader.destroy(),this.loader=new be(i,e),this.currModules=e,this.comms=void 0;try{t(i)}catch{}return}this.frame.onload=()=>{const i=this.frame.contentWindow;this.loader=new be(i,e),this.currModules=e;try{t(i)}catch{}},this.frame.onerror=i=>{try{n(i)}catch{}},this.frame.contentWindow.location.replace(this.source)})}applyContentProtection(){this.comms||this.comms.resume(),this.comms.send("peripherals_protection",this.contentProtectionConfig),this.keyboardPeripheralsConfig&&this.keyboardPeripheralsConfig.length>0&&(this.conditionBridge?.destroy(),this.conditionBridge=new Kt(this.keyboardPeripheralsConfig,e=>{e.length>0&&this.comms.send("keyboard_peripherals",e)}),this.conditionBridge.setup()),this.contentProtectionConfig.monitorScrollingExperimental&&this.comms.send("scroll_protection",{}),this.contentProtectionConfig.protectPrinting?.disable&&this.comms.send("print_protection",this.contentProtectionConfig.protectPrinting)}async destroy(){this.conditionBridge?.destroy(),await this.hide(),this.loader?.destroy(),this.frame.remove(),this.destroyed=!0}async hide(){if(!this.destroyed){if(this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.pointerEvents="none",this.hidden=!0,this.frame.parentElement)return this.comms===void 0||!this.comms.ready?void 0:new Promise((e,t)=>{this.comms?.send("unfocus",void 0,n=>{this.comms?.halt(),e()})});this.comms?.halt()}}async show(e){if(this.destroyed)throw Error("Trying to show frame when it doesn't exist");if(!this.frame.parentElement)throw Error("Trying to show frame that is not attached to the DOM");return this.comms?this.comms.resume():this.comms=new ve(this.frame.contentWindow,this.source),new Promise((t,n)=>{this.comms?.send("activate",void 0,()=>{this.comms?.send("focus",void 0,()=>{this.applyContentProtection();const i=()=>{this.frame.style.removeProperty("visibility"),this.frame.style.removeProperty("aria-hidden"),this.frame.style.removeProperty("opacity"),this.frame.style.removeProperty("pointer-events"),this.hidden=!1,Y.UA.WebKit&&this.comms?.send("force_webkit_recalc",void 0),t()};e!==void 0?this.comms?.send("go_progression",e,i):i()})})})}setCSSProperties(e){this.destroyed||!this.frame.contentWindow||(this.hidden&&(this.comms?this.comms?.resume():this.comms=new ve(this.frame.contentWindow,this.source)),this.comms?.send("update_properties",e),this.hidden&&this.comms?.halt())}get iframe(){if(this.destroyed)throw Error("Trying to use frame when it doesn't exist");return this.frame}get realSize(){if(this.destroyed)throw Error("Trying to use frame client rect when it doesn't exist");return this.frame.getBoundingClientRect()}get isDestroyed(){return this.destroyed}get window(){if(this.destroyed||!this.frame.contentWindow)throw Error("Trying to use frame window when it doesn't exist");return this.frame.contentWindow}get atLeft(){return this.window.scrollX<5}get atRight(){return this.window.scrollX>this.window.document.scrollingElement.scrollWidth-this.window.innerWidth-5}get msg(){return this.comms}get ldr(){return this.loader}}const Fi=5,zi=3;class Li{constructor(e,t,n,i,o,a){this.pool=new Map,this.blobs=new Map,this.inprogress=new Map,this.pendingUpdates=new Map,this.injector=null,this.container=e,this.positions=t,this.currentCssProperties=n,this.injector=i??null,this.contentProtectionConfig=o||{},this.keyboardPeripheralsConfig=a||[]}async destroy(){let e=this.inprogress.values(),t=e.next();const n=[];for(;t.value;)n.push(t.value),t=e.next();n.length>0&&await Promise.allSettled(n),this.inprogress.clear();let i=this.pool.values(),o=i.next();for(;o.value;)await o.value.destroy(),o=i.next();this.pool.clear(),this.blobs.forEach(a=>{this.injector?.releaseBlobUrl?.(a),URL.revokeObjectURL(a)}),this.injector?.dispose(),this.container.childNodes.forEach(a=>{(a.nodeType===Node.ELEMENT_NODE||a.nodeType===Node.TEXT_NODE)&&a.remove()})}async update(e,t,n,i=!1){let o=this.positions.findIndex(l=>l.locations.position===t.locations.position);if(o<0)throw Error(`Locator not found in position list: ${t.locations.position} > ${this.positions.reduce((l,c)=>c.locations.position||0>l?c.locations.position||0:l,0)}`);const a=this.positions[o].href;this.inprogress.has(a)&&await this.inprogress.get(a);const s=new Promise(async(l,c)=>{const h=[],u=[];this.positions.forEach((d,p)=>{(p>o+Fi||p<o-Fi)&&(h.includes(d.href)||h.push(d.href)),p<o+zi&&p>o-zi&&(u.includes(d.href)||u.push(d.href))}),h.forEach(async d=>{u.includes(d)||this.pool.has(d)&&(await this.pool.get(d)?.destroy(),this.pool.delete(d),this.pendingUpdates.has(d)&&this.pendingUpdates.set(d,{inPool:!1}))}),this.currentBaseURL!==void 0&&e.baseURL!==this.currentBaseURL&&(this.blobs.forEach(d=>{this.injector?.releaseBlobUrl?.(d),URL.revokeObjectURL(d)}),this.blobs.clear()),this.currentBaseURL=e.baseURL;const m=async d=>{if(i&&(this.blobs.forEach(P=>{this.injector?.releaseBlobUrl?.(P),URL.revokeObjectURL(P)}),this.blobs.clear(),this.pendingUpdates.clear()),this.pendingUpdates.has(d)&&this.pendingUpdates.get(d)?.inPool===!1){const P=this.blobs.get(d);P&&(this.injector?.releaseBlobUrl?.(P),URL.revokeObjectURL(P),this.blobs.delete(d),this.pendingUpdates.delete(d))}if(this.pool.has(d)){const P=this.pool.get(d);if(!this.blobs.has(d))await P.destroy(),this.pool.delete(d),this.pendingUpdates.delete(d);else{await P.load(n);return}}const p=e.readingOrder.findWithHref(d);if(!p)return;if(!this.blobs.has(d)){const A=await new xi(e,this.currentBaseURL||"",p,{cssProperties:this.currentCssProperties,injector:this.injector}).build();this.blobs.set(d,A)}const b=new rn(this.blobs.get(d),this.contentProtectionConfig,this.keyboardPeripheralsConfig);d!==a&&await b.hide(),this.container.appendChild(b.iframe),await b.load(n),this.pool.set(d,b)};try{await Promise.all(u.map(d=>m(d)))}catch(d){c(d)}const f=this.pool.get(a);(f?.source!==this._currentFrame?.source||i)&&(await this._currentFrame?.hide(),f&&await f.load(n),f&&await f.show(t.locations.progression),this._currentFrame=f),l()});this.inprogress.set(a,s),await s,this.inprogress.delete(a)}setCSSProperties(e){if(!((n,i)=>{const o=Object.keys(n),a=Object.keys(i);if(o.length!==a.length)return!1;for(const s of o)if(n[s]!==i[s])return!1;return!0})(this.currentCssProperties||{},e)){this.currentCssProperties=e,this.pool.forEach(n=>{n.setCSSProperties(e)});for(const n of this.blobs.keys())this.pendingUpdates.set(n,{inPool:this.pool.has(n)})}}get currentFrames(){return[this._currentFrame]}get currentBounds(){const e={x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0,toJSON(){return this}};return this.currentFrames.forEach(t=>{if(!t)return;const n=t.realSize;e.x=Math.min(e.x,n.x),e.y=Math.min(e.y,n.y),e.width+=n.width,e.height=Math.max(e.height,n.height),e.top=Math.min(e.top,n.top),e.right=Math.min(e.right,n.right),e.bottom=Math.min(e.bottom,n.bottom),e.left=Math.min(e.left,n.left)}),e}}class Oi{constructor(e,t,n,i={},o=[]){this.currModules=[],this.cachedPage=void 0,this.peripherals=e,this.debugHref=n,this.contentProtectionConfig={...i},this.keyboardPeripheralsConfig=[...o],this.frame=document.createElement("iframe"),this.frame.sandbox.value="allow-same-origin allow-scripts",this.frame.classList.add("readium-navigator-iframe"),this.frame.classList.add("blank"),this.frame.scrolling="no",this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.display="none",this.frame.style.position="absolute",this.frame.style.pointerEvents="none",this.frame.style.transformOrigin="0 0",this.frame.style.transform="scale(1)",this.frame.style.background="#fff",this.frame.style.touchAction="none",this.frame.dataset.originalHref=n,this.source="about:blank",this.wrapper=document.createElement("div"),this.wrapper.style.position="relative",this.wrapper.style.float=this.wrapper.style.cssFloat=t===M.rtl?"right":"left",this.wrapper.appendChild(this.frame)}async load(e,t){return this.source===t&&this.loadPromise&&[...this.currModules].sort().join("|")===[...e].sort().join("|")?this.loadPromise:(this.loaded&&this.source!==t&&this.window.stop(),this.source=t,this.loadPromise=new Promise((n,i)=>{if(this.loader&&this.loaded){const o=this.frame.contentWindow;if([...this.currModules].sort().join("|")===[...e].sort().join("|")){try{n(o),this.loadPromise=void 0}catch{}return}this.comms?.halt(),this.loader.destroy(),this.loader=new be(o,e),this.currModules=e,this.comms=void 0;try{n(o),this.loadPromise=void 0}catch{}return}this.frame.addEventListener("load",()=>{const o=this.frame.contentWindow;this.loader=new be(o,e),this.currModules=e,this.peripherals.observe(this.wrapper),this.peripherals.observe(o);try{n(o)}catch{}},{once:!0}),this.frame.addEventListener("error",o=>{try{i(o.error),this.loadPromise=void 0}catch{}},{once:!0}),this.frame.style.removeProperty("display"),this.frame.contentWindow.location.replace(this.source)}),this.loadPromise)}loadPageSize(){const e=this.frame.contentWindow,t=e.document.head.querySelector("meta[name=viewport]");if(t){const n=/(\w+) *= *([^\s,]+)/g;let i,o=0,a=0;for(;i=n.exec(t.content);)i[1]==="width"?o=Number.parseFloat(i[2]):i[1]==="height"&&(a=Number.parseFloat(i[2]));if(o>0&&a>0)return{width:o,height:a}}return{width:e.document.body.scrollWidth,height:e.document.body.scrollHeight}}update(e){if(!this.loaded)return;const t=this.loadPageSize();this.frame.style.height=`${t.height}px`,this.frame.style.width=`${t.width}px`;const n=Math.min(this.wrapper.clientWidth/t.width,this.wrapper.clientHeight/t.height);this.frame.style.transform=`scale(${n})`;const i=this.frame.getBoundingClientRect(),o=this.wrapper.clientHeight-i.height;if(this.frame.style.top=`${o/2}px`,e===K.left){const a=this.wrapper.clientWidth-i.width;this.frame.style.left=`${a}px`}else if(e===K.center){const a=this.wrapper.clientWidth-i.width;this.frame.style.left=`${a/2}px`}else this.frame.style.left="0px";this.frame.style.removeProperty("visibility"),this.frame.style.removeProperty("aria-hidden"),this.frame.style.removeProperty("pointer-events"),this.frame.classList.remove("blank"),this.frame.classList.add("loaded")}async destroy(){this.conditionBridge?.destroy(),await this.unfocus(),this.loader?.destroy(),this.wrapper.remove()}async unload(){if(this.loaded)return this.deselect(),this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.pointerEvents="none",this.frame.classList.add("blank"),this.frame.classList.remove("loaded"),this.comms?.halt(),this.loader?.destroy(),this.comms=void 0,this.frame.blur(),new Promise((e,t)=>{this.frame.addEventListener("load",()=>{try{this.showPromise=void 0,e()}catch{}},{once:!0}),this.frame.addEventListener("error",n=>{try{this.showPromise=void 0,t(n.error)}catch{}},{once:!0}),this.source="about:blank",this.frame.contentWindow.location.replace("about:blank"),this.frame.style.display="none"})}deselect(){this.frame.contentWindow?.getSelection()?.removeAllRanges()}async unfocus(){if(this.frame.parentElement)return this.comms===void 0?void 0:new Promise((e,t)=>{this.comms?.send("unfocus",void 0,n=>{this.comms?.halt(),this.showPromise=void 0,e()})});this.comms?.halt()}applyContentProtection(){this.comms||this.comms.resume(),this.comms.send("peripherals_protection",this.contentProtectionConfig),this.keyboardPeripheralsConfig&&this.keyboardPeripheralsConfig.length>0&&(this.conditionBridge?.destroy(),this.conditionBridge=new Kt(this.keyboardPeripheralsConfig,e=>{e.length>0&&this.comms.send("keyboard_peripherals",e)}),this.conditionBridge.setup()),this.contentProtectionConfig.protectPrinting?.disable&&this.comms.send("print_protection",this.contentProtectionConfig.protectPrinting)}async show(e){if(!this.frame.parentElement){console.warn("Trying to show frame that is not attached to the DOM");return}if(!this.loaded){this.showPromise=void 0;return}return this.showPromise?(this.cachedPage!==e&&(this.update(e),this.cachedPage=e),this.showPromise):(this.cachedPage=e,this.comms?this.comms.resume():this.comms=new ve(this.frame.contentWindow,this.source),this.showPromise=new Promise((t,n)=>{this.comms.send("focus",void 0,i=>{this.update(this.cachedPage),this.applyContentProtection(),t()})}),this.showPromise)}async activate(){return new Promise((e,t)=>{if(!this.comms)return e();this.comms?.send("activate",void 0,()=>{e()})})}get element(){return this.wrapper}get iframe(){return this.frame}get realSize(){return this.frame.getBoundingClientRect()}get loaded(){return this.frame.contentWindow&&this.frame.contentWindow.location.href!=="about:blank"}set width(e){const t=`${e}%`;this.wrapper.style.width!==t&&(this.wrapper.style.width=t)}set height(e){const t=`${e}px`;this.wrapper.style.height!==t&&(this.wrapper.style.height=t)}get window(){if(!this.frame.contentWindow)throw Error("Trying to use frame window when it doesn't exist");return this.frame.contentWindow}get atLeft(){return this.window.scrollX<5}get atRight(){return this.window.scrollX>this.window.document.scrollingElement.scrollWidth-this.window.innerWidth-5}get msg(){return this.comms}get ldr(){return this.loader}}var Ai=(r=>(r[r.Left=0]="Left",r[r.Center=1]="Center",r[r.Right=2]="Right",r))(Ai||{}),Ui=(r=>(r[r.Top=0]="Top",r[r.Middle=1]="Middle",r[r.Bottom=2]="Bottom",r))(Ui||{});class Ti{constructor(){this.outerWidth=0,this.outerHeight=0,this.HTML=document.documentElement,this.Head=document.head,this.Body=document.body}refreshOuterPixels(e){Y.OS.iOS||(this.outerHeight=window.outerHeight-window.innerHeight,Y.OS.Android&&Y.UA.Chrome&&window.screen.height>window.innerHeight&&(this.outerHeight=(window.screen.height-window.innerHeight)/1.5),this.outerWidth=window.outerWidth-window.innerWidth)}getBibiEventCoord(e,t=0){const n={X:0,Y:0};return/^touch/.test(e.type)?(n.X=e.touches[t].screenX,n.Y=e.touches[t].screenY):(n.X=e.screenX,n.Y=e.screenY),(e.target.ownerDocument?.documentElement||e.target.documentElement)===this.HTML&&(n.X-=this.HTML.scrollLeft+this.Body.scrollLeft,n.Y-=this.HTML.scrollTop+this.Body.scrollTop),n.X-=this.outerWidth,n.Y-=this.outerHeight,n}getTouchDistance(e){if(e.touches.length!==2)return 0;const t=e.touches[0].screenX-this.outerWidth,n=e.touches[0].screenY-this.outerHeight,i=e.touches[1].screenX-this.outerWidth,o=e.touches[1].screenY-this.outerHeight;return Math.sqrt(Math.pow(i-t,2)+Math.pow(o-n,2))}getTouchCenter(e){if(e.touches.length!==2)return null;const t=this.HTML.scrollLeft+this.Body.scrollLeft,n=this.HTML.scrollTop+this.Body.scrollTop,i=e.touches[0].screenX-this.outerWidth-t,o=e.touches[0].screenY-this.outerHeight-n,a=e.touches[1].screenX-this.outerWidth-t,s=e.touches[1].screenY-this.outerHeight-n;return{X:(i+a)/2,Y:(o+s)/2}}getBibiEvent(e){if(!e)return{Coord:null,Division:null,Ratio:null,Target:null};const t=this.getBibiEventCoord(e);let n=.3;const i={X:t.X/window.innerWidth,Y:t.Y/window.innerHeight};let o,a,s,l;s=o=n,l=a=1-n;const c={X:null,Y:null};return i.X<s?c.X=0:l<i.X?c.X=2:c.X=1,i.Y<o?c.Y=0:a<i.Y?c.Y=2:c.Y=1,{Target:e.target,Coord:t,Ratio:i,Division:c}}}class Pr{constructor(){this._DOM={show:!1,pinchTarget:document.createElement("div"),touch1:document.createElement("div"),touch2:document.createElement("div"),center:document.createElement("div"),stats:document.createElement("div")},this._DOM.show=!0,this._DOM.pinchTarget.style.zIndex=this._DOM.stats.style.zIndex=this._DOM.center.style.zIndex=this._DOM.touch1.style.zIndex=this._DOM.touch2.style.zIndex="100000",this._DOM.pinchTarget.style.position=this._DOM.stats.style.position=this._DOM.center.style.position=this._DOM.touch1.style.position=this._DOM.touch2.style.position="absolute",this._DOM.pinchTarget.style.borderRadius=this._DOM.center.style.borderRadius=this._DOM.touch1.style.borderRadius=this._DOM.touch2.style.borderRadius="50%",this._DOM.pinchTarget.style.pointerEvents=this._DOM.stats.style.pointerEvents=this._DOM.center.style.pointerEvents=this._DOM.touch1.style.pointerEvents=this._DOM.touch2.style.pointerEvents="none",this._DOM.pinchTarget.style.display=this._DOM.center.style.display=this._DOM.touch1.style.display=this._DOM.touch2.style.display="none",this._DOM.pinchTarget.style.paddingTop=this._DOM.center.style.paddingTop="10px",this._DOM.pinchTarget.style.width=this._DOM.pinchTarget.style.height=this._DOM.center.style.width=this._DOM.center.style.height="10px",this._DOM.pinchTarget.style.backgroundColor="green",this._DOM.center.style.backgroundColor="red",this._DOM.touch1.style.backgroundColor=this._DOM.touch2.style.backgroundColor="blue",this._DOM.touch1.style.height=this._DOM.touch2.style.height="20px",this._DOM.touch1.style.width=this._DOM.touch2.style.width="20px",this._DOM.touch1.style.paddingTop=this._DOM.touch2.style.paddingTop="20px",this._DOM.touch1.textContent="1",this._DOM.touch2.textContent="2",this._DOM.stats.style.padding="20px",this._DOM.stats.style.backgroundColor="rgba(0,0,0,0.5)",this._DOM.stats.style.color="white",this._DOM.stats.textContent="[stats]",document.body.appendChild(this._DOM.stats),document.body.appendChild(this._DOM.center),document.body.appendChild(this._DOM.touch1),document.body.appendChild(this._DOM.touch2),document.body.appendChild(this._DOM.pinchTarget)}get show(){return this.DOM.show}get DOM(){return this._DOM}}const Ni=6,an=1.02,Mi=50;class Ii{constructor(e,t=!1){this.dragState=0,this.minimumMoved=!1,this.pan={startX:0,endX:0,startY:0,overscrollX:0,overscrollY:0,letItGo:!1,preventClick:!1,translateX:0,translateY:0,touchID:0},this.pinch={startDistance:0,startScale:0,target:{X:0,Y:0},touchN:0,startTranslate:{X:0,Y:0}},this._scale=1,this.scaleDebouncer=0,this.frameBounds=null,this.debugger=null,this.btouchstartHandler=this.touchstartHandler.bind(this),this.btouchendHandler=this.touchendHandler.bind(this),this.btouchmoveHandler=this.touchmoveHandler.bind(this),this.bdblclickHandler=this.dblclickHandler.bind(this),this.bmousedownHandler=this.mousedownHandler.bind(this),this.bmouseupHandler=this.mouseupHandler.bind(this),this.bmousemoveHandler=this.mousemoveHandler.bind(this),this.moveFrame=0,this.manager=e,this.coordinator=new Ti,this.attachEvents(),t&&(this.debugger=new Pr)}get scale(){return this._scale}set scale(e){isNaN(e)&&(e=1),window.clearTimeout(this.scaleDebouncer),this.scaleDebouncer=window.setTimeout(()=>{this.dragState===0&&this.scale<an&&(this.pan.translateX=0,this.pan.translateY=0,this.clearPan(),this.manager.updateBookStyle()),this.manager.listener("zoom",e)},100),this._scale=e}attachEvents(){this.observe(this.manager.spineElement),this.pan={startX:0,startY:0,endX:0,overscrollX:0,overscrollY:0,letItGo:!1,preventClick:!1,translateX:0,translateY:0,touchID:0},this.pinch={startDistance:0,startScale:0,target:{X:0,Y:0},startTranslate:{X:0,Y:0},touchN:0}}clearPan(){this.pan.letItGo=!1,this.pan.touchID=0,this.pan.endX=0,this.pan.overscrollX=0,this.pan.overscrollY=0}clearPinch(){this.pinch={startDistance:0,startScale:this.pinch.startScale,target:{X:0,Y:0},touchN:0,startTranslate:{X:0,Y:0}}}observe(e){e.addEventListener("touchstart",this.btouchstartHandler),e.addEventListener("touchend",this.btouchendHandler),e.addEventListener("touchmove",this.btouchmoveHandler,{passive:!0}),e.addEventListener("dblclick",this.bdblclickHandler,{passive:!0}),e.addEventListener("mousedown",this.bmousedownHandler),e.addEventListener("mouseup",this.bmouseupHandler),e.addEventListener("mousemove",this.bmousemoveHandler)}clickHandler(e){}touchstartHandler(e){if(["TEXTAREA","OPTION","INPUT","SELECT"].indexOf(e.target.nodeName)!==-1)return;switch(e.stopPropagation(),this.frameBounds=this.manager.currentBounds,this.coordinator.refreshOuterPixels(this.frameBounds),e.touches.length){case 3:return;case 2:{e.preventDefault(),this.pinch.startDistance=this.coordinator.getTouchDistance(e);const i=this.startTouch(e);this.pan.startX=i.X,this.pan.startY=i.Y,this.dragState=2,this.manager.updateBookStyle(!0),this.isScaled?(this.pinch.target.X-=this.pan.translateX*(this.pinch.startScale/this.scale),this.pinch.target.Y-=this.pan.translateY*(this.pinch.startScale/this.scale),this.pinch.target={X:0,Y:0},this.pinch.startScale=1/this.scale):(this.pinch.target={X:0,Y:0},this.pinch.startScale=this.scale),this.pinch.startTranslate={X:this.pan.translateX,Y:this.pan.translateY},this.debugger?.show&&(this.debugger.DOM.touch2.style.display="",this.debugger.DOM.center.style.display="",this.debugger.DOM.pinchTarget.style.display="");return}case 1:this.pan.touchID=e.touches[0].identifier,this.debugger?.show&&(this.debugger.DOM.touch1.style.display="");default:this.dragState<1&&(this.dragState=1),this.manager.updateBookStyle(!0)}this.manager.updateSpineStyle(!1);const n=this.startTouch(e);this.pan.startX=n.X,this.pan.startY=n.Y}startTouch(e){const t=this.coordinator.getTouchCenter(e)||this.coordinator.getBibiEventCoord(e);return{X:t.X-this.manager.width/2-this.pan.translateX*this.scale+this.manager.width/2,Y:t.Y-this.manager.height/2-this.pan.translateY*this.scale+this.manager.height/2}}touchendHandler(e){if(e.stopPropagation(),!e.touches||e.touches.length===0)this.pan.endX&&!this.isScaled?(this.pinch.touchN&&(this.pan.endX=this.pan.startX),this.updateAfterDrag()):!this.pinch.touchN&&Math.abs(this.pan.overscrollX)>Mi&&Math.abs(this.pan.overscrollY)<Mi/2&&(this.pan.startX=0,this.pan.endX=-this.pan.overscrollX,this.updateAfterDrag()),this.dragState=0,this.minimumMoved=!1,this.clearPinch(),this.debugger?.show&&(this.debugger.DOM.center.style.display="none",this.debugger.DOM.touch1.style.display="none",this.debugger.DOM.touch2.style.display="none");else if(e.touches.length===1){this.dragState=1,e.touches[0].identifier!==this.pan.touchID&&(this.pan.touchID=e.touches[0].identifier),this.debugger?.show&&(this.debugger.DOM.center.style.display="none",this.debugger.DOM.touch2.style.display="none",this.debugger.DOM.pinchTarget.style.display="none");const t=this.startTouch(e);this.pan.startX=t.X,this.pan.startY=t.Y}window.setTimeout(()=>{this.manager.updateBookStyle(!0),this.dragState===0&&(this.scale<an&&(this.pan.translateX=0,this.pan.translateY=0),this.clearPan()),this.manager.updateBookStyle(!0)},50)}touchmoveHandler(e){e.stopPropagation();const t=this.coordinator.getBibiEventCoord(e);Math.abs(this.pan.startY-t.Y)+Math.abs(this.pan.startX-t.X)>5&&(this.minimumMoved||(this.manager.deselect(),this.minimumMoved=!0),this.dragState<1&&(this.dragState=1));const n=this.coordinator?.getTouchDistance(e);let i=!1;const o=this.scale;if(this.dragState===2&&n){if(this.pinch.touchN++,this.pinch.touchN<4)return;let a=n/this.pinch.startDistance*this.scale;a>=Ni&&(a=Ni),a<=an&&(a=1),this.scale=a,this.pinch.startDistance=n,i=!0}if(this.pan.letItGo===!1&&(this.pan.letItGo=Math.abs(this.pan.startY-t.Y)<Math.abs(this.pan.startX-t.X)),this.debugger?.show&&(this.debugger.DOM.touch1.style.top=`${t.Y-10}px`,this.debugger.DOM.touch1.style.left=`${t.X-10}px`,this.debugger.DOM.touch1.innerText=`${t.X.toFixed(2)},${t.Y.toFixed(2)}`),this.dragState>0&&this.isScaled||this.dragState>1){if(this.dragState===1){const l={X:t.X-this.manager.width/2,Y:t.Y-this.manager.height/2};this.pan.translateX=(l.X-(this.pan.startX-this.manager.width/2))*1/this.scale,this.pan.translateY=(l.Y-(this.pan.startY-this.manager.height/2))*1/this.scale}else if(this.dragState===2){const l=this.coordinator.getTouchCenter(e);if(this.debugger?.show){this.debugger.DOM.center.style.top=`${l.Y-5}px`,this.debugger.DOM.center.style.left=`${l.X-5}px`,this.debugger.DOM.center.innerText=`${l.X.toFixed(2)},${l.Y.toFixed(2)}`;const f=this.coordinator.getBibiEventCoord(e,1);this.debugger.DOM.touch2.style.top=`${f.Y-10}px`,this.debugger.DOM.touch2.style.left=`${f.X-10}px`,this.debugger.DOM.touch2.innerText=`${f.X.toFixed(2)},${f.Y.toFixed(2)}`}l.X-=this.manager.width/2,l.Y-=this.manager.height/2;let c=-l.X/o;c+=l.X/this.scale,this.pinch.target.X+=c,l.X+=this.pinch.target.X*this.scale/this.pinch.startScale;let h=-l.Y/o;h+=l.Y/this.scale,this.pinch.target.Y+=h,l.Y+=this.pinch.target.Y*this.scale/this.pinch.startScale;let u=(l.X-(this.pan.startX-this.manager.width/2))*1/this.scale,m=(l.Y-(this.pan.startY-this.manager.height/2))*1/this.scale;this.pan.translateX=u,this.pan.translateY=m,this.debugger?.show&&(this.debugger.DOM.pinchTarget.style.left=`${this.pinch.target.X*this.scale/this.pinch.startScale-5+this.manager.width/2}px`,this.debugger.DOM.pinchTarget.style.top=`${this.pinch.target.Y*this.scale/this.pinch.startScale-5+this.manager.height/2}px`,this.debugger.DOM.pinchTarget.innerText=`${(this.pinch.target.X*this.scale/this.pinch.startScale).toFixed(2)},${(this.pinch.target.Y*this.scale/this.pinch.startScale).toFixed(2)}`)}const a=this.frameBounds.width/6,s=this.frameBounds.height/6;this.pan.translateX<-a&&(this.pan.overscrollX=-(a+this.pan.translateX),this.pan.translateX=-a),this.pan.translateY<-s&&(this.pan.overscrollY=-(s+this.pan.translateY),this.pan.translateY=-s),this.pan.translateX>a&&(this.pan.overscrollX=a-this.pan.translateX,this.pan.translateX=a),this.pan.translateY>s&&(this.pan.overscrollY=s-this.pan.translateY,this.pan.translateY=s),i=!0,this.debugger?.show&&(this.debugger.DOM.stats.innerText=`TX: ${this.pan.translateX.toFixed(2)}
|
|
411
|
+
`,document.head.appendChild(t),this.styleElement=t,this.beforePrintHandler=n=>(n.preventDefault(),this.onPrintAttempt?.(),!1),window.addEventListener("beforeprint",this.beforePrintHandler)}destroy(){this.beforePrintHandler&&(window.removeEventListener("beforeprint",this.beforePrintHandler),this.beforePrintHandler=null),this.styleElement?.parentNode&&(this.styleElement.parentNode.removeChild(this.styleElement),this.styleElement=null)}}class br{constructor(e={}){this.onContextMenuBlocked=e.onContextMenuBlocked,this.contextMenuHandler=this.handleContextMenu.bind(this),document.addEventListener("contextmenu",this.contextMenuHandler,!0),window.addEventListener("unload",()=>this.destroy())}handleContextMenu(e){e.preventDefault(),e.stopPropagation();const t={type:"context_menu",timestamp:Date.now(),clientX:e.clientX,clientY:e.clientY,targetFrameSrc:""};return this.onContextMenuBlocked&&this.onContextMenuBlocked(t),!1}destroy(){this.contextMenuHandler&&(document.removeEventListener("contextmenu",this.contextMenuHandler,!0),this.contextMenuHandler=void 0)}}const de="readium:navigator:suspiciousActivity";class nn{dispatchSuspiciousActivity(e,t){const n=new CustomEvent(de,{detail:{type:e,timestamp:Date.now(),...t}});window.dispatchEvent(n)}constructor(e={}){e.monitorDevTools&&(this.devToolsDetector=new yr({onDetected:()=>{this.dispatchSuspiciousActivity("developer_tools",{targetFrameSrc:"",key:"",code:"",keyCode:-1,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1})}})),e.checkAutomation&&(this.automationDetector=new hr({onDetected:t=>{this.dispatchSuspiciousActivity("automation_detected",{tool:t})}})),e.checkIFrameEmbedding&&(this.iframeEmbeddingDetector=new _r({onDetected:t=>{this.dispatchSuspiciousActivity("iframe_embedding_detected",{isCrossOrigin:t})}})),e.protectPrinting?.disable&&(this.printProtector=new Sr({...e.protectPrinting,onPrintAttempt:()=>{this.dispatchSuspiciousActivity("print",{})}})),e.disableContextMenu&&(this.contextMenuProtector=new br({onContextMenuBlocked:t=>{this.dispatchSuspiciousActivity("context_menu",t)}}))}destroy(){this.automationDetector?.destroy(),this.devToolsDetector?.destroy(),this.iframeEmbeddingDetector?.destroy(),this.printProtector?.destroy(),this.contextMenuProtector?.destroy()}}const ue="readium:navigator:keyboardPeripheral";class on{constructor(e={}){this.keyManager=new ni,this.setupKeyboardPeripherals(e.keyboardPeripherals||[])}setupKeyboardPeripherals(e){if(e.length>0){const t=n=>{const i=new CustomEvent(ue,{detail:n});window.dispatchEvent(i)};this.keydownHandler=this.keyManager.createUnifiedHandler("",e,t),this.keydownHandler&&document.addEventListener("keydown",this.keydownHandler,!0)}window.addEventListener("unload",()=>this.destroy())}destroy(){this.keydownHandler&&(document.removeEventListener("keydown",this.keydownHandler,!0),this.keydownHandler=void 0)}}const vr=r=>({frameLoaded:r.frameLoaded||(()=>{}),positionChanged:r.positionChanged||(()=>{}),tap:r.tap||(()=>!1),click:r.click||(()=>!1),zoom:r.zoom||(()=>{}),scroll:r.scroll||(()=>{}),customEvent:r.customEvent||(()=>{}),handleLocator:r.handleLocator||(()=>!1),textSelected:r.textSelected||(()=>{}),contentProtection:r.contentProtection||(()=>{}),contextMenu:r.contextMenu||(()=>{}),peripheral:r.peripheral||(()=>{})});class Ei extends $t{constructor(e,t,n,i=void 0,o={preferences:{},defaults:{}}){super(),this.currentIndex=0,this._preferencesEditor=null,this._injector=null,this._isNavigating=!1,this._navigatorProtector=null,this._keyboardPeripheralsManager=null,this._suspiciousActivityListener=null,this._keyboardPeripheralListener=null,this.webViewport={readingOrder:[],progressions:new Map,positions:null},this.pub=t,this.container=e,this.listeners=vr(n),this._preferences=new Pe(o.preferences),this._defaults=new Si(o.defaults),this._settings=new Jt(this._preferences,this._defaults,this.hasDisplayTransformability),this._css=new fi({rsProperties:new gi({experiments:this._settings.experiments||null}),userProperties:new Yt({zoom:this._settings.zoom})});const a=cr(t.readingOrder.items),s=o.injectables||{rules:[],allowedDomains:[]};if(this._injector=new en({rules:[...a,...s.rules],allowedDomains:s.allowedDomains}),this._contentProtection=o.contentProtection||{},this._keyboardPeripherals=this.mergeKeyboardPeripherals(this._contentProtection,o.keyboardPeripherals||[]),(this._contentProtection.disableContextMenu||this._contentProtection.checkAutomation||this._contentProtection.checkIFrameEmbedding||this._contentProtection.monitorDevTools||this._contentProtection.protectPrinting?.disable)&&(this._navigatorProtector=new nn(this._contentProtection),this._suspiciousActivityListener=l=>{const{type:c,...h}=l.detail;c==="context_menu"?this.listeners.contextMenu(h):this.listeners.contentProtection(c,h)},window.addEventListener(de,this._suspiciousActivityListener)),this._keyboardPeripherals.length>0&&(this._keyboardPeripheralsManager=new on({keyboardPeripherals:this._keyboardPeripherals}),this._keyboardPeripheralListener=l=>{const c=l.detail;this.listeners.peripheral(c)},window.addEventListener(ue,this._keyboardPeripheralListener)),i&&typeof i.copyWithLocations=="function"){this.currentLocation=i;const l=this.pub.readingOrder.findIndexWithHref(i.href);l>=0&&(this.currentIndex=l)}else this.currentLocation=this.createCurrentLocator()}async load(){await this.updateCSS(!1);const e=this.compileCSSProperties(this._css);this.framePool=new mi(this.container,e,this._injector,this._contentProtection,this._keyboardPeripherals),await this.apply()}get settings(){return Object.freeze({...this._settings})}get preferencesEditor(){return this._preferencesEditor===null&&(this._preferencesEditor=new Qt(this._preferences,this.settings,this.pub.metadata)),this._preferencesEditor}async submitPreferences(e){this._preferences=this._preferences.merging(e),await this.applyPreferences()}async applyPreferences(){this._settings=new Jt(this._preferences,this._defaults,this.hasDisplayTransformability),this._preferencesEditor!==null&&(this._preferencesEditor=new Qt(this._preferences,this.settings,this.pub.metadata)),await this.updateCSS(!0)}async updateCSS(e){this._css.update(this._settings),e&&await this.commitCSS(this._css)}compileCSSProperties(e){const t={};for(const[n,i]of Object.entries(e.rsProperties.toCSSProperties()))t[n]=i;for(const[n,i]of Object.entries(e.userProperties.toCSSProperties()))t[n]=i;return t}async commitCSS(e){const t=this.compileCSSProperties(e);this.framePool.setCSSProperties(t)}get _cframes(){return this.framePool.currentFrames}get hasDisplayTransformability(){return this.pub.metadata?.accessibility?.feature?.some(e=>e.value===Ze.DISPLAY_TRANSFORMABILITY.value)??!1}eventListener(e,t){switch(e){case"_pong":this.listeners.frameLoaded(this.framePool.currentFrames[0].iframe.contentWindow),this.listeners.positionChanged(this.currentLocation);break;case"first_visible_locator":const n=N.deserialize(t);if(!n)break;this.currentLocation=new N({href:this.currentLocation.href,type:this.currentLocation.type,title:this.currentLocation.title,locations:n?.locations,text:n?.text}),this.listeners.positionChanged(this.currentLocation);break;case"text_selected":this.listeners.textSelected(t);break;case"click":case"tap":const i=t;if(i.interactiveElement){const l=new DOMParser().parseFromString(i.interactiveElement,"text/html").body.children[0];if(l.nodeType===l.ELEMENT_NODE&&l.nodeName==="A"&&l.hasAttribute("href")){const c=l.attributes.getNamedItem("href")?.value;if(c.startsWith("#"))this.go(this.currentLocation.copyWithLocations({fragments:[c.substring(1)]}),!1,()=>{});else if(c.startsWith("mailto:")||c.startsWith("tel:"))this.listeners.handleLocator(new V({href:c}).locator);else try{let h;if(c.startsWith("http://")||c.startsWith("https://"))h=c;else if(this.currentLocation.href.startsWith("http://")||this.currentLocation.href.startsWith("https://")){const m=new URL(this.currentLocation.href);h=new URL(c,m).href}else h=dt.join(dt.dirname(this.currentLocation.href),c);const u=this.pub.readingOrder.findWithHref(h);u?this.goLink(u,!1,()=>{}):(console.warn(`Internal link not found in readingOrder: ${h}`),this.listeners.handleLocator(new V({href:c}).locator))}catch(h){console.warn(`Couldn't resolve internal link for ${c}: ${h}`),this.listeners.handleLocator(new V({href:c}).locator)}}else console.log("Clicked on",l)}else if(e==="click"?this.listeners.click(i):this.listeners.tap(i))break;break;case"scroll":this.listeners.scroll(t);break;case"zoom":this.listeners.zoom(t);break;case"progress":this.syncLocation(t);break;case"content_protection":const o=t;this.listeners.contentProtection(o.type,o);break;case"context_menu":this.listeners.contextMenu(t);break;case"keyboard_peripherals":const a=t,s={...a,interactiveElement:void 0};a.interactiveElement&&(s.interactiveElement=new DOMParser().parseFromString(a.interactiveElement,"text/html").body.children[0]),this.listeners.peripheral(s);break;case"log":console.log(this.framePool.currentFrames[0]?.source?.split("/")[3],...t);break;default:this.listeners.customEvent(e,t);break}}determineModules(){const e=Vo.slice(),t=se(this.pub.metadata);return t==="cjk-vertical"||t==="mongolian-vertical"?e.map(n=>n==="webpub_snapper"?"cjk_vertical_snapper":n):e}attachListener(){this.framePool.currentFrames[0]?.msg&&(this.framePool.currentFrames[0].msg.listener=(e,t)=>{this.eventListener(e,t)})}async apply(){if(await this.framePool.update(this.pub,this.currentLocation,this.determineModules()),this.attachListener(),this.pub.readingOrder.findIndexWithHref(this.currentLocation.href)<0)throw Error("Link for "+this.currentLocation.href+" not found!")}async destroy(){this._suspiciousActivityListener&&window.removeEventListener(de,this._suspiciousActivityListener),this._keyboardPeripheralListener&&window.removeEventListener(ue,this._keyboardPeripheralListener),this._navigatorProtector?.destroy(),this._keyboardPeripheralsManager?.destroy(),await this.framePool?.destroy()}async changeResource(e){if(e===0)return!1;const t=this.pub.readingOrder.findIndexWithHref(this.currentLocation.href),n=Math.max(0,Math.min(this.pub.readingOrder.items.length-1,t+e));return n===t?!1:(this.currentIndex=n,this.currentLocation=this.createCurrentLocator(),await this.apply(),!0)}updateViewport(e){this.webViewport.readingOrder=[],this.webViewport.progressions.clear(),this.webViewport.positions=null,this.currentLocation&&(this.webViewport.readingOrder.push(this.currentLocation.href),this.webViewport.progressions.set(this.currentLocation.href,e),this.currentLocation.locations?.position!==void 0&&(this.webViewport.positions=[this.currentLocation.locations.position]))}async syncLocation(e){const t=e;this.currentLocation&&(this.currentLocation=this.currentLocation.copyWithLocations({progression:t.start})),this.updateViewport(t),this.listeners.positionChanged(this.currentLocation),await this.framePool.update(this.pub,this.currentLocation,this.determineModules())}goBackward(e,t){if(this._isNavigating){t(!1);return}this._isNavigating=!0,this.changeResource(-1).then(n=>{this._isNavigating=!1,t(n)})}goForward(e,t){if(this._isNavigating){t(!1);return}this._isNavigating=!0,this.changeResource(1).then(n=>{this._isNavigating=!1,t(n)})}get currentLocator(){return this.currentLocation}get viewport(){return this.webViewport}get isScrollStart(){const e=this.viewport.readingOrder[0];return this.viewport.progressions.get(e)?.start===0}get isScrollEnd(){const e=this.viewport.readingOrder[this.viewport.readingOrder.length-1];return this.viewport.progressions.get(e)?.end===1}get canGoBackward(){const e=this.pub.readingOrder.items[0]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.start===0)}get canGoForward(){const e=this.pub.readingOrder.items[this.pub.readingOrder.items.length-1]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.end===1)}get readingProgression(){return this.pub.metadata.effectiveReadingProgression}get publication(){return this.pub}async loadLocator(e,t){let n=!1,i=typeof e.locations.getCssSelector=="function"&&e.locations.getCssSelector();if(e.text?.highlight?n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_text",i?[e.text?.serialize(),i]:e.text?.serialize(),h=>l(h))}):i&&(n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_text",["",i],h=>l(h))})),n){t(n);return}const o=typeof e.locations.htmlId=="function"&&e.locations.htmlId();if(o&&(n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_id",o,h=>l(h))})),n){t(n);return}const a=e?.locations?.progression;a&&a>0?n=await new Promise((l,c)=>{this.framePool.currentFrames[0].msg.send("go_progression",a,h=>l(h))}):n=!0,t(n)}go(e,t,n){const i=e.href.split("#")[0];if(!this.pub.readingOrder.findWithHref(i))return n(this.listeners.handleLocator(e));const a=this.pub.readingOrder.findIndexWithHref(i);if(a>=0&&(this.currentIndex=a),this._isNavigating){n(!1);return}this._isNavigating=!0,this.currentLocation=this.createCurrentLocator(),this.apply().then(()=>this.loadLocator(e,s=>{this._isNavigating=!1,n(s)})).then(()=>{this.attachListener()})}goLink(e,t,n){return this.go(e.locator,t,n)}createCurrentLocator(){const t=this.pub.readingOrder.items[this.currentIndex];if(!t)throw new Error("No current resource available");const i=this.currentLocation&&this.currentLocation.href===t.href&&this.currentLocation.locations.progression?this.currentLocation.locations.progression:0;return this.pub.manifest.locatorFromLink(t)||new N({href:t.href,type:t.type||"text/html",locations:new C({fragments:[],progression:i,position:this.currentIndex+1})})}}const wr=Ei,Rr=r=>{const e=r.join(" ");return["upgrade-insecure-requests",`default-src ${e} blob:`,"connect-src 'none'",`script-src ${e} blob: 'unsafe-inline'`,`style-src ${e} blob: 'unsafe-inline'`,`img-src ${e} blob: data:`,`font-src ${e} blob: data:`,`object-src ${e} blob:`,`child-src ${e}`,"form-action 'none'"].join("; ")};class xi{constructor(e,t,n,i){this.injector=null,this.pub=e,this.item=n,this.burl=n.toURL(t)||"",this.cssProperties=i.cssProperties,this.injector=i.injector??null}async build(e=!1){if(this.item.mediaType.isHTML)return await this.buildHtmlFrame(e);if(this.item.mediaType.isBitmap||this.item.mediaType.equals(g.SVG))return this.buildImageFrame();throw Error("Unsupported frame mediatype "+this.item.mediaType.string)}async buildHtmlFrame(e=!1){const t=await this.pub.get(this.item).readAsString();if(!t)throw new Error(`Failed reading item ${this.item.href}`);const n=new DOMParser().parseFromString(t,this.item.mediaType.string),i=n.querySelector("parsererror");if(i){const o=i.querySelector("div");throw new Error(`Failed parsing item ${this.item.href}: ${o?.textContent||i.textContent}`)}return this.injector&&await this.injector.injectForDocument(n,this.item),this.finalizeDOM(n,this.pub.baseURL,this.burl,this.item.mediaType,e,this.cssProperties)}buildImageFrame(){const e=document.implementation.createHTMLDocument(this.item.title||this.item.href),t=document.createElement("img");return t.src=this.burl||"",t.alt=this.item.title||"",t.decoding="async",e.body.appendChild(t),this.finalizeDOM(e,this.pub.baseURL,this.burl,this.item.mediaType,!0)}setProperties(e,t){for(const n in e){const i=e[n];i&&t.documentElement.style.setProperty(n,i)}}finalizeDOM(e,t,n,i,o=!1,a){if(!e)return"";const s=this.injector?.getAllowedDomains?.()||[],l=[...new Set([...t?[t]:[],...s])].filter(Boolean);if(a&&!o&&this.setProperties(a,e),e.body.querySelectorAll("img").forEach(u=>{u.setAttribute("fetchpriority","high")}),i.isHTML&&this.pub.metadata.languages?.[0]){const u=this.pub.metadata.languages[0];if(i===g.XHTML){const m=e.documentElement.lang||e.documentElement.getAttribute("xml:lang"),f=e.body.lang||e.body.getAttribute("xml:lang");f&&!m?(e.documentElement.lang=f,e.documentElement.setAttribute("xml:lang",f),e.body.removeAttribute("xml:lang"),e.body.removeAttribute("lang")):m||(e.documentElement.lang=u,e.documentElement.setAttribute("xml:lang",u))}else i===g.HTML&&!e.documentElement.lang&&(e.documentElement.lang=u)}if(se(this.pub.metadata)==="rtl"&&!e.documentElement.dir&&!e.body.dir&&(e.documentElement.dir=M.rtl),n!==void 0){const u=e.createElement("base");u.href=n,u.dataset.readium="true",e.head.firstChild.before(u)}const h=e.createElement("meta");return h.httpEquiv="Content-Security-Policy",h.content=Rr(l),h.dataset.readium="true",e.head.firstChild.before(h),URL.createObjectURL(new Blob([new XMLSerializer().serializeToString(e)],{type:i.isHTML?i.string:"application/xhtml+xml"}))}}class rn{constructor(e,t={},n=[]){this.hidden=!0,this.destroyed=!1,this.currModules=[],this.frame=document.createElement("iframe"),this.frame.sandbox.value="allow-same-origin allow-scripts",this.frame.classList.add("readium-navigator-iframe"),this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.position="absolute",this.frame.style.pointerEvents="none",this.frame.style.transition="visibility 0s, opacity 0.1s linear",this.source=e,this.contentProtectionConfig={...t},this.keyboardPeripheralsConfig=[...n]}async load(e){return new Promise((t,n)=>{if(this.loader){const i=this.frame.contentWindow;if([...this.currModules].sort().join("|")===[...e].sort().join("|")){try{t(i)}catch{}return}this.comms?.halt(),this.loader.destroy(),this.loader=new ve(i,e),this.currModules=e,this.comms=void 0;try{t(i)}catch{}return}this.frame.onload=()=>{const i=this.frame.contentWindow;this.loader=new ve(i,e),this.currModules=e;try{t(i)}catch{}},this.frame.onerror=i=>{try{n(i)}catch{}},this.frame.contentWindow.location.replace(this.source)})}applyContentProtection(){this.comms||this.comms.resume(),this.comms.send("peripherals_protection",this.contentProtectionConfig),this.keyboardPeripheralsConfig&&this.keyboardPeripheralsConfig.length>0&&(this.conditionBridge?.destroy(),this.conditionBridge=new Kt(this.keyboardPeripheralsConfig,e=>{e.length>0&&this.comms.send("keyboard_peripherals",e)}),this.conditionBridge.setup()),this.contentProtectionConfig.monitorScrollingExperimental&&this.comms.send("scroll_protection",{}),this.contentProtectionConfig.protectPrinting?.disable&&this.comms.send("print_protection",this.contentProtectionConfig.protectPrinting)}async destroy(){this.conditionBridge?.destroy(),await this.hide(),this.loader?.destroy(),this.frame.remove(),this.destroyed=!0}async hide(){if(!this.destroyed){if(this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.opacity="0",this.frame.style.pointerEvents="none",this.hidden=!0,this.frame.blur(),this.frame.parentElement)return this.comms===void 0||!this.comms.ready?void 0:new Promise((e,t)=>{this.comms?.send("unfocus",void 0,n=>{this.comms?.halt(),e()})});this.comms?.halt()}}async show(e){if(this.destroyed)throw Error("Trying to show frame when it doesn't exist");if(!this.frame.parentElement)throw Error("Trying to show frame that is not attached to the DOM");return this.comms?this.comms.resume():this.comms=new we(this.frame.contentWindow,this.source),new Promise((t,n)=>{this.comms?.send("activate",void 0,()=>{this.comms?.send("focus",void 0,()=>{this.applyContentProtection();const i=()=>{this.frame.style.removeProperty("visibility"),this.frame.style.removeProperty("aria-hidden"),this.frame.style.removeProperty("opacity"),this.frame.style.removeProperty("pointer-events"),this.hidden=!1,Y.UA.WebKit&&this.comms?.send("force_webkit_recalc",void 0),t()};e!==void 0?this.comms?.send("go_progression",e,i):i()})})})}setCSSProperties(e){this.destroyed||!this.frame.contentWindow||(this.hidden&&(this.comms?this.comms?.resume():this.comms=new we(this.frame.contentWindow,this.source)),this.comms?.send("update_properties",e),this.hidden&&this.comms?.halt())}get iframe(){if(this.destroyed)throw Error("Trying to use frame when it doesn't exist");return this.frame}get realSize(){if(this.destroyed)throw Error("Trying to use frame client rect when it doesn't exist");return this.frame.getBoundingClientRect()}get isDestroyed(){return this.destroyed}get window(){if(this.destroyed||!this.frame.contentWindow)throw Error("Trying to use frame window when it doesn't exist");return this.frame.contentWindow}get atLeft(){return this.window.scrollX<5}get atRight(){return this.window.scrollX>this.window.document.scrollingElement.scrollWidth-this.window.innerWidth-5}get msg(){return this.comms}get ldr(){return this.loader}}const Fi=5,zi=3;class Li{constructor(e,t,n,i,o,a){this.pool=new Map,this.blobs=new Map,this.inprogress=new Map,this.pendingUpdates=new Map,this.injector=null,this.container=e,this.positions=t,this.currentCssProperties=n,this.injector=i??null,this.contentProtectionConfig=o||{},this.keyboardPeripheralsConfig=a||[]}async destroy(){let e=this.inprogress.values(),t=e.next();const n=[];for(;t.value;)n.push(t.value),t=e.next();n.length>0&&await Promise.allSettled(n),this.inprogress.clear();let i=this.pool.values(),o=i.next();for(;o.value;)await o.value.destroy(),o=i.next();this.pool.clear(),this.blobs.forEach(a=>{this.injector?.releaseBlobUrl?.(a),URL.revokeObjectURL(a)}),this.injector?.dispose(),this.container.childNodes.forEach(a=>{(a.nodeType===Node.ELEMENT_NODE||a.nodeType===Node.TEXT_NODE)&&a.remove()})}async update(e,t,n,i=!1){let o=this.positions.findIndex(l=>l.locations.position===t.locations.position);if(o<0)throw Error(`Locator not found in position list: ${t.locations.position} > ${this.positions.reduce((l,c)=>c.locations.position||0>l?c.locations.position||0:l,0)}`);const a=this.positions[o].href;this.inprogress.has(a)&&await this.inprogress.get(a);const s=new Promise(async(l,c)=>{const h=[],u=[];this.positions.forEach((d,p)=>{(p>o+Fi||p<o-Fi)&&(h.includes(d.href)||h.push(d.href)),p<o+zi&&p>o-zi&&(u.includes(d.href)||u.push(d.href))}),h.forEach(async d=>{u.includes(d)||this.pool.has(d)&&(await this.pool.get(d)?.destroy(),this.pool.delete(d),this.pendingUpdates.has(d)&&this.pendingUpdates.set(d,{inPool:!1}))}),this.currentBaseURL!==void 0&&e.baseURL!==this.currentBaseURL&&(this.blobs.forEach(d=>{this.injector?.releaseBlobUrl?.(d),URL.revokeObjectURL(d)}),this.blobs.clear()),this.currentBaseURL=e.baseURL;const m=async d=>{if(i&&(this.blobs.forEach(P=>{this.injector?.releaseBlobUrl?.(P),URL.revokeObjectURL(P)}),this.blobs.clear(),this.pendingUpdates.clear()),this.pendingUpdates.has(d)&&this.pendingUpdates.get(d)?.inPool===!1){const P=this.blobs.get(d);P&&(this.injector?.releaseBlobUrl?.(P),URL.revokeObjectURL(P),this.blobs.delete(d),this.pendingUpdates.delete(d))}if(this.pool.has(d)){const P=this.pool.get(d);if(!this.blobs.has(d))await P.destroy(),this.pool.delete(d),this.pendingUpdates.delete(d);else{await P.load(n);return}}const p=e.readingOrder.findWithHref(d);if(!p)return;if(!this.blobs.has(d)){const A=await new xi(e,this.currentBaseURL||"",p,{cssProperties:this.currentCssProperties,injector:this.injector}).build();this.blobs.set(d,A)}const b=new rn(this.blobs.get(d),this.contentProtectionConfig,this.keyboardPeripheralsConfig);d!==a&&await b.hide(),this.container.appendChild(b.iframe),await b.load(n),this.pool.set(d,b)};try{await Promise.all(u.map(d=>m(d)))}catch(d){c(d)}const f=this.pool.get(a);(f?.source!==this._currentFrame?.source||i)&&(await this._currentFrame?.hide(),f&&await f.load(n),f&&await f.show(t.locations.progression),this._currentFrame=f),l()});this.inprogress.set(a,s),await s,this.inprogress.delete(a)}setCSSProperties(e){if(!((n,i)=>{const o=Object.keys(n),a=Object.keys(i);if(o.length!==a.length)return!1;for(const s of o)if(n[s]!==i[s])return!1;return!0})(this.currentCssProperties||{},e)){this.currentCssProperties=e,this.pool.forEach(n=>{n.setCSSProperties(e)});for(const n of this.blobs.keys())this.pendingUpdates.set(n,{inPool:this.pool.has(n)})}}get currentFrames(){return[this._currentFrame]}get currentBounds(){const e={x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0,toJSON(){return this}};return this.currentFrames.forEach(t=>{if(!t)return;const n=t.realSize;e.x=Math.min(e.x,n.x),e.y=Math.min(e.y,n.y),e.width+=n.width,e.height=Math.max(e.height,n.height),e.top=Math.min(e.top,n.top),e.right=Math.min(e.right,n.right),e.bottom=Math.min(e.bottom,n.bottom),e.left=Math.min(e.left,n.left)}),e}}class Oi{constructor(e,t,n,i={},o=[]){this.currModules=[],this.cachedPage=void 0,this.peripherals=e,this.debugHref=n,this.contentProtectionConfig={...i},this.keyboardPeripheralsConfig=[...o],this.frame=document.createElement("iframe"),this.frame.sandbox.value="allow-same-origin allow-scripts",this.frame.classList.add("readium-navigator-iframe"),this.frame.classList.add("blank"),this.frame.scrolling="no",this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.display="none",this.frame.style.position="absolute",this.frame.style.pointerEvents="none",this.frame.style.transformOrigin="0 0",this.frame.style.transform="scale(1)",this.frame.style.background="#fff",this.frame.style.touchAction="none",this.frame.dataset.originalHref=n,this.source="about:blank",this.wrapper=document.createElement("div"),this.wrapper.style.position="relative",this.wrapper.style.float=this.wrapper.style.cssFloat=t===M.rtl?"right":"left",this.wrapper.appendChild(this.frame)}async load(e,t){return this.source===t&&this.loadPromise&&[...this.currModules].sort().join("|")===[...e].sort().join("|")?this.loadPromise:(this.loaded&&this.source!==t&&this.window.stop(),this.source=t,this.loadPromise=new Promise((n,i)=>{if(this.loader&&this.loaded){const o=this.frame.contentWindow;if([...this.currModules].sort().join("|")===[...e].sort().join("|")){try{n(o),this.loadPromise=void 0}catch{}return}this.comms?.halt(),this.loader.destroy(),this.loader=new ve(o,e),this.currModules=e,this.comms=void 0;try{n(o),this.loadPromise=void 0}catch{}return}this.frame.addEventListener("load",()=>{const o=this.frame.contentWindow;this.loader=new ve(o,e),this.currModules=e,this.peripherals.observe(this.wrapper),this.peripherals.observe(o);try{n(o)}catch{}},{once:!0}),this.frame.addEventListener("error",o=>{try{i(o.error),this.loadPromise=void 0}catch{}},{once:!0}),this.frame.style.removeProperty("display"),this.frame.contentWindow.location.replace(this.source)}),this.loadPromise)}loadPageSize(){const e=this.frame.contentWindow,t=e.document.head.querySelector("meta[name=viewport]");if(t){const n=/(\w+) *= *([^\s,]+)/g;let i,o=0,a=0;for(;i=n.exec(t.content);)i[1]==="width"?o=Number.parseFloat(i[2]):i[1]==="height"&&(a=Number.parseFloat(i[2]));if(o>0&&a>0)return{width:o,height:a}}return{width:e.document.body.scrollWidth,height:e.document.body.scrollHeight}}update(e){if(!this.loaded)return;const t=this.loadPageSize();this.frame.style.height=`${t.height}px`,this.frame.style.width=`${t.width}px`;const n=Math.min(this.wrapper.clientWidth/t.width,this.wrapper.clientHeight/t.height);this.frame.style.transform=`scale(${n})`;const i=this.frame.getBoundingClientRect(),o=this.wrapper.clientHeight-i.height;if(this.frame.style.top=`${o/2}px`,e===K.left){const a=this.wrapper.clientWidth-i.width;this.frame.style.left=`${a}px`}else if(e===K.center){const a=this.wrapper.clientWidth-i.width;this.frame.style.left=`${a/2}px`}else this.frame.style.left="0px";this.frame.style.removeProperty("visibility"),this.frame.style.removeProperty("aria-hidden"),this.frame.style.removeProperty("pointer-events"),this.frame.classList.remove("blank"),this.frame.classList.add("loaded")}async destroy(){this.conditionBridge?.destroy(),await this.unfocus(),this.loader?.destroy(),this.wrapper.remove()}async unload(){if(this.loaded)return this.deselect(),this.frame.style.visibility="hidden",this.frame.style.setProperty("aria-hidden","true"),this.frame.style.pointerEvents="none",this.frame.classList.add("blank"),this.frame.classList.remove("loaded"),this.comms?.halt(),this.loader?.destroy(),this.comms=void 0,this.frame.blur(),new Promise((e,t)=>{this.frame.addEventListener("load",()=>{try{this.showPromise=void 0,e()}catch{}},{once:!0}),this.frame.addEventListener("error",n=>{try{this.showPromise=void 0,t(n.error)}catch{}},{once:!0}),this.source="about:blank",this.frame.contentWindow.location.replace("about:blank"),this.frame.style.display="none"})}deselect(){this.frame.contentWindow?.getSelection()?.removeAllRanges()}async unfocus(){if(this.frame.parentElement)return this.comms===void 0?void 0:(this.frame.blur(),new Promise((e,t)=>{this.comms?.send("unfocus",void 0,n=>{this.comms?.halt(),this.showPromise=void 0,e()})}));this.comms?.halt()}applyContentProtection(){this.comms||this.comms.resume(),this.comms.send("peripherals_protection",this.contentProtectionConfig),this.keyboardPeripheralsConfig&&this.keyboardPeripheralsConfig.length>0&&(this.conditionBridge?.destroy(),this.conditionBridge=new Kt(this.keyboardPeripheralsConfig,e=>{e.length>0&&this.comms.send("keyboard_peripherals",e)}),this.conditionBridge.setup()),this.contentProtectionConfig.protectPrinting?.disable&&this.comms.send("print_protection",this.contentProtectionConfig.protectPrinting)}async show(e){if(!this.frame.parentElement){console.warn("Trying to show frame that is not attached to the DOM");return}if(!this.loaded){this.showPromise=void 0;return}return this.showPromise?(this.cachedPage!==e&&(this.update(e),this.cachedPage=e),this.showPromise):(this.cachedPage=e,this.comms?this.comms.resume():this.comms=new we(this.frame.contentWindow,this.source),this.showPromise=new Promise((t,n)=>{this.comms.send("focus",void 0,i=>{this.update(this.cachedPage),this.applyContentProtection(),t()})}),this.showPromise)}async activate(){return new Promise((e,t)=>{if(!this.comms)return e();this.comms?.send("activate",void 0,()=>{e()})})}get element(){return this.wrapper}get iframe(){return this.frame}get realSize(){return this.frame.getBoundingClientRect()}get loaded(){return this.frame.contentWindow&&this.frame.contentWindow.location.href!=="about:blank"}set width(e){const t=`${e}%`;this.wrapper.style.width!==t&&(this.wrapper.style.width=t)}set height(e){const t=`${e}px`;this.wrapper.style.height!==t&&(this.wrapper.style.height=t)}get window(){if(!this.frame.contentWindow)throw Error("Trying to use frame window when it doesn't exist");return this.frame.contentWindow}get atLeft(){return this.window.scrollX<5}get atRight(){return this.window.scrollX>this.window.document.scrollingElement.scrollWidth-this.window.innerWidth-5}get msg(){return this.comms}get ldr(){return this.loader}}var Ai=(r=>(r[r.Left=0]="Left",r[r.Center=1]="Center",r[r.Right=2]="Right",r))(Ai||{}),Ui=(r=>(r[r.Top=0]="Top",r[r.Middle=1]="Middle",r[r.Bottom=2]="Bottom",r))(Ui||{});class Ti{constructor(){this.outerWidth=0,this.outerHeight=0,this.HTML=document.documentElement,this.Head=document.head,this.Body=document.body}refreshOuterPixels(e){Y.OS.iOS||(this.outerHeight=window.outerHeight-window.innerHeight,Y.OS.Android&&Y.UA.Chrome&&window.screen.height>window.innerHeight&&(this.outerHeight=(window.screen.height-window.innerHeight)/1.5),this.outerWidth=window.outerWidth-window.innerWidth)}getBibiEventCoord(e,t=0){const n={X:0,Y:0};return/^touch/.test(e.type)?(n.X=e.touches[t].screenX,n.Y=e.touches[t].screenY):(n.X=e.screenX,n.Y=e.screenY),(e.target.ownerDocument?.documentElement||e.target.documentElement)===this.HTML&&(n.X-=this.HTML.scrollLeft+this.Body.scrollLeft,n.Y-=this.HTML.scrollTop+this.Body.scrollTop),n.X-=this.outerWidth,n.Y-=this.outerHeight,n}getTouchDistance(e){if(e.touches.length!==2)return 0;const t=e.touches[0].screenX-this.outerWidth,n=e.touches[0].screenY-this.outerHeight,i=e.touches[1].screenX-this.outerWidth,o=e.touches[1].screenY-this.outerHeight;return Math.sqrt(Math.pow(i-t,2)+Math.pow(o-n,2))}getTouchCenter(e){if(e.touches.length!==2)return null;const t=this.HTML.scrollLeft+this.Body.scrollLeft,n=this.HTML.scrollTop+this.Body.scrollTop,i=e.touches[0].screenX-this.outerWidth-t,o=e.touches[0].screenY-this.outerHeight-n,a=e.touches[1].screenX-this.outerWidth-t,s=e.touches[1].screenY-this.outerHeight-n;return{X:(i+a)/2,Y:(o+s)/2}}getBibiEvent(e){if(!e)return{Coord:null,Division:null,Ratio:null,Target:null};const t=this.getBibiEventCoord(e);let n=.3;const i={X:t.X/window.innerWidth,Y:t.Y/window.innerHeight};let o,a,s,l;s=o=n,l=a=1-n;const c={X:null,Y:null};return i.X<s?c.X=0:l<i.X?c.X=2:c.X=1,i.Y<o?c.Y=0:a<i.Y?c.Y=2:c.Y=1,{Target:e.target,Coord:t,Ratio:i,Division:c}}}class Pr{constructor(){this._DOM={show:!1,pinchTarget:document.createElement("div"),touch1:document.createElement("div"),touch2:document.createElement("div"),center:document.createElement("div"),stats:document.createElement("div")},this._DOM.show=!0,this._DOM.pinchTarget.style.zIndex=this._DOM.stats.style.zIndex=this._DOM.center.style.zIndex=this._DOM.touch1.style.zIndex=this._DOM.touch2.style.zIndex="100000",this._DOM.pinchTarget.style.position=this._DOM.stats.style.position=this._DOM.center.style.position=this._DOM.touch1.style.position=this._DOM.touch2.style.position="absolute",this._DOM.pinchTarget.style.borderRadius=this._DOM.center.style.borderRadius=this._DOM.touch1.style.borderRadius=this._DOM.touch2.style.borderRadius="50%",this._DOM.pinchTarget.style.pointerEvents=this._DOM.stats.style.pointerEvents=this._DOM.center.style.pointerEvents=this._DOM.touch1.style.pointerEvents=this._DOM.touch2.style.pointerEvents="none",this._DOM.pinchTarget.style.display=this._DOM.center.style.display=this._DOM.touch1.style.display=this._DOM.touch2.style.display="none",this._DOM.pinchTarget.style.paddingTop=this._DOM.center.style.paddingTop="10px",this._DOM.pinchTarget.style.width=this._DOM.pinchTarget.style.height=this._DOM.center.style.width=this._DOM.center.style.height="10px",this._DOM.pinchTarget.style.backgroundColor="green",this._DOM.center.style.backgroundColor="red",this._DOM.touch1.style.backgroundColor=this._DOM.touch2.style.backgroundColor="blue",this._DOM.touch1.style.height=this._DOM.touch2.style.height="20px",this._DOM.touch1.style.width=this._DOM.touch2.style.width="20px",this._DOM.touch1.style.paddingTop=this._DOM.touch2.style.paddingTop="20px",this._DOM.touch1.textContent="1",this._DOM.touch2.textContent="2",this._DOM.stats.style.padding="20px",this._DOM.stats.style.backgroundColor="rgba(0,0,0,0.5)",this._DOM.stats.style.color="white",this._DOM.stats.textContent="[stats]",document.body.appendChild(this._DOM.stats),document.body.appendChild(this._DOM.center),document.body.appendChild(this._DOM.touch1),document.body.appendChild(this._DOM.touch2),document.body.appendChild(this._DOM.pinchTarget)}get show(){return this.DOM.show}get DOM(){return this._DOM}}const Ni=6,an=1.02,Mi=50;class Ii{constructor(e,t=!1){this.dragState=0,this.minimumMoved=!1,this.pan={startX:0,endX:0,startY:0,overscrollX:0,overscrollY:0,letItGo:!1,preventClick:!1,translateX:0,translateY:0,touchID:0},this.pinch={startDistance:0,startScale:0,target:{X:0,Y:0},touchN:0,startTranslate:{X:0,Y:0}},this._scale=1,this.scaleDebouncer=0,this.frameBounds=null,this.debugger=null,this.btouchstartHandler=this.touchstartHandler.bind(this),this.btouchendHandler=this.touchendHandler.bind(this),this.btouchmoveHandler=this.touchmoveHandler.bind(this),this.bdblclickHandler=this.dblclickHandler.bind(this),this.bmousedownHandler=this.mousedownHandler.bind(this),this.bmouseupHandler=this.mouseupHandler.bind(this),this.bmousemoveHandler=this.mousemoveHandler.bind(this),this.moveFrame=0,this.manager=e,this.coordinator=new Ti,this.attachEvents(),t&&(this.debugger=new Pr)}get scale(){return this._scale}set scale(e){isNaN(e)&&(e=1),window.clearTimeout(this.scaleDebouncer),this.scaleDebouncer=window.setTimeout(()=>{this.dragState===0&&this.scale<an&&(this.pan.translateX=0,this.pan.translateY=0,this.clearPan(),this.manager.updateBookStyle()),this.manager.listener("zoom",e)},100),this._scale=e}attachEvents(){this.observe(this.manager.spineElement),this.pan={startX:0,startY:0,endX:0,overscrollX:0,overscrollY:0,letItGo:!1,preventClick:!1,translateX:0,translateY:0,touchID:0},this.pinch={startDistance:0,startScale:0,target:{X:0,Y:0},startTranslate:{X:0,Y:0},touchN:0}}clearPan(){this.pan.letItGo=!1,this.pan.touchID=0,this.pan.endX=0,this.pan.overscrollX=0,this.pan.overscrollY=0}clearPinch(){this.pinch={startDistance:0,startScale:this.pinch.startScale,target:{X:0,Y:0},touchN:0,startTranslate:{X:0,Y:0}}}observe(e){e.addEventListener("touchstart",this.btouchstartHandler),e.addEventListener("touchend",this.btouchendHandler),e.addEventListener("touchmove",this.btouchmoveHandler,{passive:!0}),e.addEventListener("dblclick",this.bdblclickHandler,{passive:!0}),e.addEventListener("mousedown",this.bmousedownHandler),e.addEventListener("mouseup",this.bmouseupHandler),e.addEventListener("mousemove",this.bmousemoveHandler)}clickHandler(e){}touchstartHandler(e){if(["TEXTAREA","OPTION","INPUT","SELECT"].indexOf(e.target.nodeName)!==-1)return;switch(e.stopPropagation(),this.frameBounds=this.manager.currentBounds,this.coordinator.refreshOuterPixels(this.frameBounds),e.touches.length){case 3:return;case 2:{e.preventDefault(),this.pinch.startDistance=this.coordinator.getTouchDistance(e);const i=this.startTouch(e);this.pan.startX=i.X,this.pan.startY=i.Y,this.dragState=2,this.manager.updateBookStyle(!0),this.isScaled?(this.pinch.target.X-=this.pan.translateX*(this.pinch.startScale/this.scale),this.pinch.target.Y-=this.pan.translateY*(this.pinch.startScale/this.scale),this.pinch.target={X:0,Y:0},this.pinch.startScale=1/this.scale):(this.pinch.target={X:0,Y:0},this.pinch.startScale=this.scale),this.pinch.startTranslate={X:this.pan.translateX,Y:this.pan.translateY},this.debugger?.show&&(this.debugger.DOM.touch2.style.display="",this.debugger.DOM.center.style.display="",this.debugger.DOM.pinchTarget.style.display="");return}case 1:this.pan.touchID=e.touches[0].identifier,this.debugger?.show&&(this.debugger.DOM.touch1.style.display="");default:this.dragState<1&&(this.dragState=1),this.manager.updateBookStyle(!0)}this.manager.updateSpineStyle(!1);const n=this.startTouch(e);this.pan.startX=n.X,this.pan.startY=n.Y}startTouch(e){const t=this.coordinator.getTouchCenter(e)||this.coordinator.getBibiEventCoord(e);return{X:t.X-this.manager.width/2-this.pan.translateX*this.scale+this.manager.width/2,Y:t.Y-this.manager.height/2-this.pan.translateY*this.scale+this.manager.height/2}}touchendHandler(e){if(e.stopPropagation(),!e.touches||e.touches.length===0)this.pan.endX&&!this.isScaled?(this.pinch.touchN&&(this.pan.endX=this.pan.startX),this.updateAfterDrag()):!this.pinch.touchN&&Math.abs(this.pan.overscrollX)>Mi&&Math.abs(this.pan.overscrollY)<Mi/2&&(this.pan.startX=0,this.pan.endX=-this.pan.overscrollX,this.updateAfterDrag()),this.dragState=0,this.minimumMoved=!1,this.clearPinch(),this.debugger?.show&&(this.debugger.DOM.center.style.display="none",this.debugger.DOM.touch1.style.display="none",this.debugger.DOM.touch2.style.display="none");else if(e.touches.length===1){this.dragState=1,e.touches[0].identifier!==this.pan.touchID&&(this.pan.touchID=e.touches[0].identifier),this.debugger?.show&&(this.debugger.DOM.center.style.display="none",this.debugger.DOM.touch2.style.display="none",this.debugger.DOM.pinchTarget.style.display="none");const t=this.startTouch(e);this.pan.startX=t.X,this.pan.startY=t.Y}window.setTimeout(()=>{this.manager.updateBookStyle(!0),this.dragState===0&&(this.scale<an&&(this.pan.translateX=0,this.pan.translateY=0),this.clearPan()),this.manager.updateBookStyle(!0)},50)}touchmoveHandler(e){e.stopPropagation();const t=this.coordinator.getBibiEventCoord(e);Math.abs(this.pan.startY-t.Y)+Math.abs(this.pan.startX-t.X)>5&&(this.minimumMoved||(this.manager.deselect(),this.minimumMoved=!0),this.dragState<1&&(this.dragState=1));const n=this.coordinator?.getTouchDistance(e);let i=!1;const o=this.scale;if(this.dragState===2&&n){if(this.pinch.touchN++,this.pinch.touchN<4)return;let a=n/this.pinch.startDistance*this.scale;a>=Ni&&(a=Ni),a<=an&&(a=1),this.scale=a,this.pinch.startDistance=n,i=!0}if(this.pan.letItGo===!1&&(this.pan.letItGo=Math.abs(this.pan.startY-t.Y)<Math.abs(this.pan.startX-t.X)),this.debugger?.show&&(this.debugger.DOM.touch1.style.top=`${t.Y-10}px`,this.debugger.DOM.touch1.style.left=`${t.X-10}px`,this.debugger.DOM.touch1.innerText=`${t.X.toFixed(2)},${t.Y.toFixed(2)}`),this.dragState>0&&this.isScaled||this.dragState>1){if(this.dragState===1){const l={X:t.X-this.manager.width/2,Y:t.Y-this.manager.height/2};this.pan.translateX=(l.X-(this.pan.startX-this.manager.width/2))*1/this.scale,this.pan.translateY=(l.Y-(this.pan.startY-this.manager.height/2))*1/this.scale}else if(this.dragState===2){const l=this.coordinator.getTouchCenter(e);if(this.debugger?.show){this.debugger.DOM.center.style.top=`${l.Y-5}px`,this.debugger.DOM.center.style.left=`${l.X-5}px`,this.debugger.DOM.center.innerText=`${l.X.toFixed(2)},${l.Y.toFixed(2)}`;const f=this.coordinator.getBibiEventCoord(e,1);this.debugger.DOM.touch2.style.top=`${f.Y-10}px`,this.debugger.DOM.touch2.style.left=`${f.X-10}px`,this.debugger.DOM.touch2.innerText=`${f.X.toFixed(2)},${f.Y.toFixed(2)}`}l.X-=this.manager.width/2,l.Y-=this.manager.height/2;let c=-l.X/o;c+=l.X/this.scale,this.pinch.target.X+=c,l.X+=this.pinch.target.X*this.scale/this.pinch.startScale;let h=-l.Y/o;h+=l.Y/this.scale,this.pinch.target.Y+=h,l.Y+=this.pinch.target.Y*this.scale/this.pinch.startScale;let u=(l.X-(this.pan.startX-this.manager.width/2))*1/this.scale,m=(l.Y-(this.pan.startY-this.manager.height/2))*1/this.scale;this.pan.translateX=u,this.pan.translateY=m,this.debugger?.show&&(this.debugger.DOM.pinchTarget.style.left=`${this.pinch.target.X*this.scale/this.pinch.startScale-5+this.manager.width/2}px`,this.debugger.DOM.pinchTarget.style.top=`${this.pinch.target.Y*this.scale/this.pinch.startScale-5+this.manager.height/2}px`,this.debugger.DOM.pinchTarget.innerText=`${(this.pinch.target.X*this.scale/this.pinch.startScale).toFixed(2)},${(this.pinch.target.Y*this.scale/this.pinch.startScale).toFixed(2)}`)}const a=this.frameBounds.width/6,s=this.frameBounds.height/6;this.pan.translateX<-a&&(this.pan.overscrollX=-(a+this.pan.translateX),this.pan.translateX=-a),this.pan.translateY<-s&&(this.pan.overscrollY=-(s+this.pan.translateY),this.pan.translateY=-s),this.pan.translateX>a&&(this.pan.overscrollX=a-this.pan.translateX,this.pan.translateX=a),this.pan.translateY>s&&(this.pan.overscrollY=s-this.pan.translateY,this.pan.translateY=s),i=!0,this.debugger?.show&&(this.debugger.DOM.stats.innerText=`TX: ${this.pan.translateX.toFixed(2)}
|
|
412
412
|
TY: ${this.pan.translateY.toFixed(2)}
|
|
413
413
|
Zoom: ${this.scale.toFixed(2)}
|
|
414
|
-
Overscroll: ${this.pan.overscrollX.toFixed(2)},${this.pan.overscrollY.toFixed(2)}`)}if(i){this.manager.updateBookStyle();return}if(this.dragState>0&&this.pan.letItGo){this.pan.endX=t.X;const s=this.manager.currentSlide*(this.manager.width/this.manager.perPage),l=this.pan.endX-this.pan.startX,c=this.manager.rtl?s+l:s-l;cancelAnimationFrame(this.moveFrame),this.moveFrame=requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.manager.spineElement.style.transform=`translate3d(${(this.manager.rtl?1:-1)*c}px, 0, 0)`})})}}dblclickHandler(e){clearTimeout(this.dtimer),this.pdblclick=!0,this.dtimer=window.setTimeout(()=>this.pdblclick=!1,200),!this.disableDblClick&&this.isScaled&&(this.scale=1)}get isScaled(){return this.scale>1}addTouch(e){e.touches=[{pageX:e.pageX,pageY:e.pageY}]}mousedownHandler(e){this.isScaled&&(this.addTouch(e),this.touchstartHandler(e))}mouseupHandler(e){this.isScaled&&this.touchendHandler(e)}mousemoveHandler(e){this.isScaled&&e.buttons>0&&(e.preventDefault(),this.addTouch(e),this.touchmoveHandler(e))}updateAfterDrag(){const e=(this.manager.rtl?-1:1)*(this.pan.endX-this.pan.startX),t=Math.abs(e);e>0&&t>this.manager.threshold&&this.manager.slength>this.manager.perPage?this.manager.listener("no_less",void 0):e<0&&t>this.manager.threshold&&this.manager.slength>this.manager.perPage&&this.manager.listener("no_more",void 0),this.manager.slideToCurrent(!0,!0)}}var gt=(r=>(r.auto="auto",r.landscape="landscape",r.portrait="portrait",r))(gt||{}),ft=(r=>(r.auto="auto",r.both="both",r.none="none",r.landscape="landscape",r))(ft||{});class Hi{constructor(e){this.shift=!0,this.spreads=[],this.nLandscape=0,this.index(e),this.testShift(e),console.log(`Indexed ${this.spreads.length} spreads for ${e.readingOrder.items.length} items`)}index(e,t=!1){this.nLandscape=0,e.readingOrder.items.forEach((n,i)=>{t||(e.readingOrder.items[i]=n.addProperties({number:i+1,isImage:n.type?.indexOf("image/")===0}));const o=n.properties?.otherProperties.orientation==="landscape";(!n.properties?.page||t)&&(n.properties=n.properties?.add({page:o?"center":((this.shift?0:1)+i-this.nLandscape)%2?e.metadata.readingProgression===M.rtl?"right":"left":e.metadata.readingProgression===M.rtl?"left":"right"})),(o||n.properties?.otherProperties.addBlank)&&this.nLandscape++}),t&&(this.spreads=[]),this.buildSpreads(e.readingOrder)}testShift(e){let t=!1;this.spreads.forEach((n,i)=>{if(n.length>1)return;const o=n[0],a=o.properties?.otherProperties.orientation;i===0&&(a==="landscape"||a!=="portrait"&&((o.width||0)>(o.height||0)||o.properties?.otherProperties.spread==="both"))&&(this.shift=!1),t&&o.properties?.page===K.center&&this.spreads[i-1][0].addProperties({addBlank:!0}),a==="portrait"&&o.properties?.page!=="center"&&o.properties?.otherProperties.number>1?t=!0:t=!1}),this.shift||this.index(e,!0)}buildSpreads(e){let t=[];e.items.forEach((n,i)=>{!i&&this.shift?this.spreads.push([n]):n.properties?.page===K.center?(t.length>0&&this.spreads.push(t),this.spreads.push([n]),t=[]):t.length>=2?(this.spreads.push(t),t=[n]):t.push(n)}),t.length>0&&this.spreads.push(t)}currentSpread(e,t){return this.spreads[Math.min(Math.floor(e/t),this.spreads.length-1)]}findByLink(e){return this.spreads.find(t=>t.includes(e))||void 0}}const Di=8,Wi=5,Cr=300,kr=15e3,Er=250,xr=150,Fr=500;class Bi{constructor(e,t,n,i,o,a){if(this.pool=new Map,this.blobs=new Map,this.inprogress=new Map,this.delayedShow=new Map,this.delayedTimeout=new Map,this.previousFrames=[],this.injector=null,this.width=0,this.height=0,this.transform="",this.currentSlide=0,this.spread=!0,this.orientationInternal=-1,this.container=e,this.positions=t,this.pub=n,this.injector=i??null,this.contentProtectionConfig=o||{},this.keyboardPeripheralsConfig=a||[],this.spreadPresentation=n.metadata.otherMetadata?.spread||ft.auto,this.pub.metadata.effectiveReadingProgression!==M.rtl&&this.pub.metadata.effectiveReadingProgression!==M.ltr)throw Error("Unsupported reading progression for EPUB");this.spreader=new Hi(this.pub),this.containerHeightCached=e.clientHeight,this.bookElement=document.createElement("div"),this.bookElement.ariaLabel="Book",this.bookElement.tabIndex=-1,this.updateBookStyle(!0),this.spineElement=document.createElement("div"),this.spineElement.ariaLabel="Spine",this.bookElement.appendChild(this.spineElement),this.container.appendChild(this.bookElement),this.updateSpineStyle(!0),this.peripherals=new Ii(this),this.pub.readingOrder.items.forEach(s=>{const l=new Oi(this.peripherals,this.pub.metadata.effectiveReadingProgression,s.href,this.contentProtectionConfig,this.keyboardPeripheralsConfig);this.spineElement.appendChild(l.element),this.pool.set(s.href,l),l.width=100/this.length*(s.properties?.otherProperties.orientation===gt.landscape||s.properties?.otherProperties.addBlank?this.perPage:1),l.height=this.height})}set listener(e){this._listener=e}get listener(){return this._listener}get doNotDisturb(){return this.peripherals.pan.touchID>0}resizeHandler(e=!0,t=!0){this.currentSlide+this.perPage>this.length&&(this.currentSlide=this.length<=this.perPage?0:this.length-1),this.containerHeightCached=this.container.clientHeight,this.orientationInternal=-1,this.updateSpineStyle(!0),e&&(this.currentSlide=this.reAlign(),this.slideToCurrent(!t,t)),clearTimeout(this.resizeTimeout),this.resizeTimeout=window.setTimeout(()=>{this.pool.forEach((n,i)=>{let o=this.pub.readingOrder.items.findIndex(l=>l.href===i);const a=this.pub.readingOrder.items[o];if(n.width=100/this.length*(a.properties?.otherProperties.orientation===gt.landscape||a.properties?.otherProperties.addBlank?this.perPage:1),n.height=this.height,!n.loaded)return;const s=this.spreader.findByLink(a);n.update(this.spreadPosition(s,a))})},Er)}updateDimensions(){this.width=this.bookElement.clientWidth,this.height=this.bookElement.clientHeight}get rtl(){return this.pub.metadata.effectiveReadingProgression===M.rtl}get single(){return!this.spread||this.portrait}get perPage(){return this.spread&&!this.portrait?2:1}get threshold(){return 50}get portrait(){return this.spreadPresentation===ft.none?!0:(this.orientationInternal===-1&&(this.orientationInternal=this.containerHeightCached>this.container.clientWidth?1:0),this.orientationInternal===1)}updateSpineStyle(e,t=!0){let n="0";this.updateDimensions(),this.perPage>1&&(n=`${this.width/2}px`);const i={transition:e?`all ${t?xr:Fr}ms ease-out`:"all 0ms ease-out",marginRight:this.rtl?n:"0",marginLeft:this.rtl?"0":n,width:`${this.width/this.perPage*this.length}px`,transform:this.transform,contain:"content"};Object.assign(this.spineElement.style,i)}updateBookStyle(e=!1){if(e){const t={overflow:"hidden",direction:this.pub.metadata.effectiveReadingProgression,cursor:"",height:"100%",width:"100%",position:"relative",outline:"none",transition:this.peripherals?.dragState?"none":"transform .15s ease-in-out",touchAction:"none"};Object.assign(this.bookElement.style,t)}this.bookElement.style.transform=`scale(${this.peripherals?.scale||1})`+(this.peripherals?` translate3d(${this.peripherals.pan.translateX}px, ${this.peripherals.pan.translateY}px, 0px)`:"")}goTo(e){if(this.slength<=this.perPage)return;e=this.reAlign(e);const t=this.currentSlide;this.currentSlide=Math.min(Math.max(e,0),this.length-1),t!==this.currentSlide&&this.slideToCurrent(!1)}onChange(){this.peripherals.scale=1,this.updateBookStyle()}get offset(){return(this.rtl?1:-1)*this.currentSlide*(this.width/this.perPage)}get length(){if(this.single)return this.slength;const e=this.slength+this.nLandscape;return this.shift&&e%2===0?e+1:e}get slength(){return this.pub.readingOrder.items.length||0}get shift(){return this.spreader.shift}get nLandscape(){return this.spreader.nLandscape}setPerPage(e){e===null?this.spread=!0:e===1?this.spread=!1:this.spread=!0,requestAnimationFrame(()=>this.resizeHandler(!0))}slideToCurrent(e,t=!0){if(this.updateDimensions(),e)requestAnimationFrame(()=>{requestAnimationFrame(()=>{const n=`translate3d(${this.offset}px, 0, 0)`;this.spineElement.style.transform!==n&&(this.transform=n,this.updateSpineStyle(!0,t),this.deselect())})});else{const n=`translate3d(${this.offset}px, 0, 0)`;if(this.spineElement.style.transform===n)return;this.transform=n,this.updateSpineStyle(!1),this.deselect()}}bounce(e=!1){requestAnimationFrame(()=>{this.transform=`translate3d(${this.offset+50*(e?1:-1)}px, 0, 0)`,this.updateSpineStyle(!0,!0),setTimeout(()=>{this.transform=`translate3d(${this.offset}px, 0, 0)`,this.updateSpineStyle(!0,!0)},100)})}next(e=1){if(this.slength<=this.perPage)return!1;const t=this.currentSlide;return this.currentSlide=Math.min(this.currentSlide+e,this.length-1),this.perPage>1&&this.currentSlide%2&&this.currentSlide--,this.currentSlide===t&&(this.currentSlide+1,this.length),t!==this.currentSlide?(this.slideToCurrent(!0),this.onChange(),!0):(this.bounce(this.rtl),!1)}prev(e=1){if(this.slength<=this.perPage)return!1;const t=this.currentSlide;return this.currentSlide=Math.max(this.currentSlide-e,0),this.perPage>1&&this.currentSlide%2&&this.currentSlide++,t!==this.currentSlide?(this.slideToCurrent(!0),this.onChange(),!0):(this.bounce(!this.rtl),!1)}get ownerWindow(){return this.container.ownerDocument.defaultView||window}async destroy(){let e=this.inprogress.values(),t=e.next();const n=[];for(;t.value;)n.push(t.value),t=e.next();n.length>0&&await Promise.allSettled(n),this.inprogress.clear();let i=this.pool.values(),o=i.next();for(;o.value;)await o.value.destroy(),o=i.next();this.pool.clear(),this.blobs.forEach(a=>URL.revokeObjectURL(a)),this.injector?.dispose(),this.container.childNodes.forEach(a=>{(a.nodeType===Node.ELEMENT_NODE||a.nodeType===Node.TEXT_NODE)&&a.remove()})}makeSpread(e){return this.perPage<2?[this.pub.readingOrder.items[e]]:this.spreader.currentSpread(e,this.perPage)}reAlign(e=this.currentSlide){return e%2&&!this.single&&e++,e}spreadPosition(e,t){return this.perPage<2||e.length<2?K.center:t.href===e[0].href?this.rtl?K.right:K.left:this.rtl?K.left:K.right}async waitForItem(e){if(this.inprogress.has(e)&&await this.inprogress.get(e),this.delayedShow.has(e)){const t=this.delayedTimeout.get(e);t>0?clearTimeout(t):await this.delayedShow.get(e),this.delayedTimeout.set(e,0),this.delayedShow.delete(e)}}async cancelShowing(e){if(this.delayedShow.has(e)){const t=this.delayedTimeout.get(e);t>0&&clearTimeout(t),this.delayedShow.delete(e)}}async update(e,t,n,i=!1){let o=this.pub.readingOrder.items.findIndex(l=>l.href===t.href);if(o<0)throw Error("Href not found in reading order");this.currentSlide!==o&&(this.currentSlide=this.reAlign(o),this.slideToCurrent(!0));const a=this.makeSpread(this.currentSlide);this.perPage>1&&o++;for(const l of a)await this.waitForItem(l.href);const s=new Promise(async(l,c)=>{const h=[],u=[];this.positions.forEach((d,p)=>{(p>o+Di||p<o-Di)&&(h.includes(d.href)||h.push(d.href)),p<o+Wi&&p>o-Wi&&(u.includes(d.href)||u.push(d.href))}),h.forEach(async d=>{u.includes(d)||this.pool.has(d)&&(this.cancelShowing(d),await this.pool.get(d)?.unload())}),this.currentBaseURL!==void 0&&e.baseURL!==this.currentBaseURL&&(this.blobs.forEach(d=>URL.revokeObjectURL(d)),this.blobs.clear()),this.currentBaseURL=e.baseURL;const m=async d=>{const p=e.readingOrder.findIndexWithHref(d),b=e.readingOrder.items[p];if(b){if(!this.blobs.has(d)){const A=await new xi(e,this.currentBaseURL||"",b,{injector:this.injector}).build(!0);this.blobs.set(d,A)}this.delayedShow.has(d)||this.delayedShow.set(d,new Promise((P,A)=>{let Q=!1;const xe=window.setTimeout(async()=>{this.delayedTimeout.set(d,0);const Fe=this.makeSpread(this.reAlign(p)),aa=this.spreadPosition(Fe,b),no=this.pool.get(d);await no.load(n,this.blobs.get(d)),this.peripherals.isScaled||await no.show(aa),this.delayedShow.delete(d),Q=!0,P()},Cr);setTimeout(()=>{!Q&&this.delayedShow.has(d)&&A(`Offscreen load timeout: ${d}`)},kr),this.delayedTimeout.set(d,xe)}))}};try{await Promise.all(u.map(d=>m(d)))}catch(d){c(d)}const f=[];for(const d of a){const p=this.pool.get(d.href),b=this.blobs.get(d.href);b&&(this.cancelShowing(d.href),await p.load(n,b),await p.show(this.spreadPosition(a,d)),this.previousFrames.push(p),await p.activate(),f.push(p))}for(;this.previousFrames.length>0;){const d=this.previousFrames.shift();d&&!f.includes(d)&&await d.unfocus()}this.previousFrames=f,l()});for(const l of a)this.inprogress.set(l.href,s);await s;for(const l of a)this.inprogress.delete(l.href)}get currentFrames(){if(this.perPage<2){const t=this.pub.readingOrder.items[this.currentSlide];return[this.pool.get(t.href)]}return this.spreader.currentSpread(this.currentSlide,this.perPage).map(t=>this.pool.get(t.href))}get currentBounds(){const e={x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0,toJSON(){return this}};return this.currentFrames.forEach(t=>{if(!t)return;const n=t.realSize;e.x=Math.min(e.x,n.x),e.y=Math.min(e.y,n.y),e.width+=n.width,e.height=Math.max(e.height,n.height),e.top=Math.min(e.top,n.top),e.right=Math.min(e.right,n.right),e.bottom=Math.min(e.bottom,n.bottom),e.left=Math.min(e.left,n.left)}),e}get viewport(){const e={readingOrder:[],progressions:new Map,positions:null};return(this.perPage<2?[this.pub.readingOrder.items[this.currentSlide]]:this.spreader.currentSpread(this.currentSlide,this.perPage)).forEach(n=>{e.readingOrder.push(n.href),e.progressions.set(n.href,{start:0,end:1})}),e.positions=this.getCurrentNumbers(),e}getCurrentNumbers(){if(this.perPage<2)return[this.pub.readingOrder.items[this.currentSlide].properties?.otherProperties.number];const e=this.spreader.currentSpread(this.currentSlide,this.perPage);return e.length>1?[e[0].properties?.otherProperties.number,e[e.length-1].properties?.otherProperties.number]:[e[0].properties?.otherProperties.number]}deselect(){this.currentFrames?.forEach(e=>e?.deselect())}}class Ce{constructor(e={}){this.backgroundColor=I(e.backgroundColor),this.blendFilter=R(e.blendFilter),this.constraint=v(e.constraint),this.columnCount=v(e.columnCount),this.darkenFilter=he(e.darkenFilter),this.deprecatedFontSize=R(e.deprecatedFontSize),this.fontFamily=I(e.fontFamily),this.fontSize=T(e.fontSize,Ue.range),this.fontSizeNormalize=R(e.fontSizeNormalize),this.fontOpticalSizing=R(e.fontOpticalSizing),this.fontWeight=T(e.fontWeight,ee.range),this.fontWidth=T(e.fontWidth,Te.range),this.hyphens=R(e.hyphens),this.invertFilter=he(e.invertFilter),this.invertGaijiFilter=he(e.invertGaijiFilter),this.iOSPatch=R(e.iOSPatch),this.iPadOSPatch=R(e.iPadOSPatch),this.letterSpacing=v(e.letterSpacing),this.ligatures=R(e.ligatures),this.lineHeight=v(e.lineHeight),this.linkColor=I(e.linkColor),this.noRuby=R(e.noRuby),this.pageGutter=v(e.pageGutter),this.paragraphIndent=v(e.paragraphIndent),this.paragraphSpacing=v(e.paragraphSpacing),this.scroll=R(e.scroll),this.scrollPaddingTop=v(e.scrollPaddingTop),this.scrollPaddingBottom=v(e.scrollPaddingBottom),this.scrollPaddingLeft=v(e.scrollPaddingLeft),this.scrollPaddingRight=v(e.scrollPaddingRight),this.selectionBackgroundColor=I(e.selectionBackgroundColor),this.selectionTextColor=I(e.selectionTextColor),this.textAlign=Ve(e.textAlign,J),this.textColor=I(e.textColor),this.textNormalization=R(e.textNormalization),this.visitedColor=I(e.visitedColor),this.wordSpacing=v(e.wordSpacing),this.optimalLineLength=v(e.optimalLineLength),this.maximalLineLength=v(e.maximalLineLength),this.minimalLineLength=v(e.minimalLineLength)}static serialize(e){const{...t}=e;return JSON.stringify(t)}static deserialize(e){try{const t=JSON.parse(e);return new Ce(t)}catch(t){return console.error("Failed to deserialize preferences:",t),null}}merging(e){const t={...this};for(const n of Object.keys(e))e[n]!==void 0&&(n!=="maximalLineLength"||e[n]===null||e[n]>=(e.optimalLineLength??t.optimalLineLength??65))&&(n!=="minimalLineLength"||e[n]===null||e[n]<=(e.optimalLineLength??t.optimalLineLength??65))&&(t[n]=e[n]);return new Ce(t)}}class ji{constructor(e){this.backgroundColor=I(e.backgroundColor)||null,this.blendFilter=R(e.blendFilter)??!1,this.constraint=v(e.constraint)||0,this.columnCount=v(e.columnCount)||null,this.darkenFilter=he(e.darkenFilter)??!1,this.deprecatedFontSize=R(e.deprecatedFontSize),(this.deprecatedFontSize===!1||this.deprecatedFontSize===null)&&(this.deprecatedFontSize=!CSS.supports("zoom","1")),this.fontFamily=I(e.fontFamily)||null,this.fontSize=T(e.fontSize,Ue.range)||1,this.fontSizeNormalize=R(e.fontSizeNormalize)??!1,this.fontOpticalSizing=R(e.fontOpticalSizing)??null,this.fontWeight=T(e.fontWeight,ee.range)||null,this.fontWidth=T(e.fontWidth,Te.range)||null,this.hyphens=R(e.hyphens)??null,this.invertFilter=he(e.invertFilter)??!1,this.invertGaijiFilter=he(e.invertGaijiFilter)??!1,this.iOSPatch=e.iOSPatch===!1?!1:(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile",this.iPadOSPatch=e.iPadOSPatch===!1?!1:L.OS.iPadOS&&L.iOSRequest==="desktop",this.letterSpacing=v(e.letterSpacing)||null,this.ligatures=R(e.ligatures)??null,this.lineHeight=v(e.lineHeight)||null,this.linkColor=I(e.linkColor)||null,this.noRuby=R(e.noRuby)??!1,this.pageGutter=mt(v(e.pageGutter),20),this.paragraphIndent=v(e.paragraphIndent)??null,this.paragraphSpacing=v(e.paragraphSpacing)??null,this.scroll=R(e.scroll)??!1,this.scrollPaddingTop=v(e.scrollPaddingTop)??null,this.scrollPaddingBottom=v(e.scrollPaddingBottom)??null,this.scrollPaddingLeft=v(e.scrollPaddingLeft)??null,this.scrollPaddingRight=v(e.scrollPaddingRight)??null,this.selectionBackgroundColor=I(e.selectionBackgroundColor)||null,this.selectionTextColor=I(e.selectionTextColor)||null,this.textAlign=Ve(e.textAlign,J)||null,this.textColor=I(e.textColor)||null,this.textNormalization=R(e.textNormalization)??!1,this.visitedColor=I(e.visitedColor)||null,this.wordSpacing=v(e.wordSpacing)||null,this.optimalLineLength=v(e.optimalLineLength)||65,this.maximalLineLength=mt(_i(e.maximalLineLength,this.optimalLineLength),80),this.minimalLineLength=mt(yi(e.minimalLineLength,this.optimalLineLength),40),this.experiments=qt(e.experiments)||null}}const ke={backgroundColor:"#FFFFFF",textColor:"#121212",linkColor:"#0000EE",visitedColor:"#551A8B",selectionBackgroundColor:"#b4d8fe",selectionTextColor:"inherit"};class sn{constructor(e,t,n){this.preferences=e,this.settings=t,this.metadata=n,this.layout=this.metadata?.effectiveLayout||S.reflowable}clear(){this.preferences=new Ce({optimalLineLength:65})}updatePreference(e,t){this.preferences[e]=t}get backgroundColor(){return new U({initialValue:this.preferences.backgroundColor,effectiveValue:this.settings.backgroundColor||ke.backgroundColor,isEffective:this.preferences.backgroundColor!==null,onChange:e=>{this.updatePreference("backgroundColor",e??null)}})}get blendFilter(){return new O({initialValue:this.preferences.blendFilter,effectiveValue:this.settings.blendFilter||!1,isEffective:this.preferences.blendFilter!==null,onChange:e=>{this.updatePreference("blendFilter",e??null)}})}get columnCount(){return new U({initialValue:this.preferences.columnCount,effectiveValue:this.settings.columnCount||null,isEffective:this.layout!==S.fixed&&!this.settings.scroll,onChange:e=>{this.updatePreference("columnCount",e??null)}})}get constraint(){return new U({initialValue:this.preferences.constraint,effectiveValue:this.preferences.constraint||0,isEffective:!0,onChange:e=>{this.updatePreference("constraint",e??null)}})}get darkenFilter(){return new k({initialValue:typeof this.preferences.darkenFilter=="boolean"?100:this.preferences.darkenFilter,effectiveValue:typeof this.settings.darkenFilter=="boolean"?100:this.settings.darkenFilter||0,isEffective:this.settings.darkenFilter!==null,onChange:e=>{this.updatePreference("darkenFilter",e??null)},supportedRange:le.range,step:le.step})}get deprecatedFontSize(){return new O({initialValue:this.preferences.deprecatedFontSize,effectiveValue:CSS.supports("zoom","1")?this.settings.deprecatedFontSize||!1:!0,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("deprecatedFontSize",e??null)}})}get fontFamily(){return new U({initialValue:this.preferences.fontFamily,effectiveValue:this.settings.fontFamily||null,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("fontFamily",e??null)}})}get fontSize(){return new k({initialValue:this.preferences.fontSize,effectiveValue:this.settings.fontSize||1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("fontSize",e??null)},supportedRange:Ue.range,step:Ue.step})}get fontSizeNormalize(){return new O({initialValue:this.preferences.fontSizeNormalize,effectiveValue:this.settings.fontSizeNormalize||!1,isEffective:this.layout!==S.fixed&&this.preferences.fontSizeNormalize!==null,onChange:e=>{this.updatePreference("fontSizeNormalize",e??null)}})}get fontOpticalSizing(){return new O({initialValue:this.preferences.fontOpticalSizing,effectiveValue:this.settings.fontOpticalSizing||!0,isEffective:this.layout!==S.fixed&&this.preferences.fontOpticalSizing!==null,onChange:e=>{this.updatePreference("fontOpticalSizing",e??null)}})}get fontWeight(){return new k({initialValue:this.preferences.fontWeight,effectiveValue:this.settings.fontWeight||400,isEffective:this.layout!==S.fixed&&this.preferences.fontWeight!==null,onChange:e=>{this.updatePreference("fontWeight",e??null)},supportedRange:ee.range,step:ee.step})}get fontWidth(){return new k({initialValue:this.preferences.fontWidth,effectiveValue:this.settings.fontWidth||100,isEffective:this.layout!==S.fixed&&this.preferences.fontWidth!==null,onChange:e=>{this.updatePreference("fontWidth",e??null)},supportedRange:Te.range,step:Te.step})}get hyphens(){return new O({initialValue:this.preferences.hyphens,effectiveValue:this.settings.hyphens||!1,isEffective:this.layout!==S.fixed&&this.metadata?.effectiveReadingProgression===M.ltr&&this.preferences.hyphens!==null,onChange:e=>{this.updatePreference("hyphens",e??null)}})}get invertFilter(){return new k({initialValue:typeof this.preferences.invertFilter=="boolean"?100:this.preferences.invertFilter,effectiveValue:typeof this.settings.invertFilter=="boolean"?100:this.settings.invertFilter||0,isEffective:this.settings.invertFilter!==null,onChange:e=>{this.updatePreference("invertFilter",e??null)},supportedRange:le.range,step:le.step})}get invertGaijiFilter(){return new k({initialValue:typeof this.preferences.invertGaijiFilter=="boolean"?100:this.preferences.invertGaijiFilter,effectiveValue:typeof this.settings.invertGaijiFilter=="boolean"?100:this.settings.invertGaijiFilter||0,isEffective:this.preferences.invertGaijiFilter!==null,onChange:e=>{this.updatePreference("invertGaijiFilter",e??null)},supportedRange:le.range,step:le.step})}get iOSPatch(){return new O({initialValue:this.preferences.iOSPatch,effectiveValue:this.settings.iOSPatch||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("iOSPatch",e??null)}})}get iPadOSPatch(){return new O({initialValue:this.preferences.iPadOSPatch,effectiveValue:this.settings.iPadOSPatch||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("iPadOSPatch",e??null)}})}get letterSpacing(){return new k({initialValue:this.preferences.letterSpacing,effectiveValue:this.settings.letterSpacing||0,isEffective:this.layout!==S.fixed&&this.preferences.letterSpacing!==null,onChange:e=>{this.updatePreference("letterSpacing",e??null)},supportedRange:Ne.range,step:Ne.step})}get ligatures(){return new O({initialValue:this.preferences.ligatures,effectiveValue:this.settings.ligatures||!0,isEffective:(()=>{if(this.preferences.ligatures===null||this.layout===S.fixed)return!1;const e=this.metadata?.languages?.[0]?.toLowerCase();return!(e&&["zh","ja","ko","mn-mong"].some(t=>e.startsWith(t)))})(),onChange:e=>{this.updatePreference("ligatures",e??null)}})}get lineHeight(){return new k({initialValue:this.preferences.lineHeight,effectiveValue:this.settings.lineHeight,isEffective:this.layout!==S.fixed&&this.preferences.lineHeight!==null,onChange:e=>{this.updatePreference("lineHeight",e??null)},supportedRange:Me.range,step:Me.step})}get linkColor(){return new U({initialValue:this.preferences.linkColor,effectiveValue:this.settings.linkColor||ke.linkColor,isEffective:this.layout!==S.fixed&&this.preferences.linkColor!==null,onChange:e=>{this.updatePreference("linkColor",e??null)}})}get maximalLineLength(){return new k({initialValue:this.preferences.maximalLineLength,effectiveValue:this.settings.maximalLineLength,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("maximalLineLength",e)},supportedRange:ce.range,step:ce.step})}get minimalLineLength(){return new k({initialValue:this.preferences.minimalLineLength,effectiveValue:this.settings.minimalLineLength,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("minimalLineLength",e)},supportedRange:ce.range,step:ce.step})}get noRuby(){return new O({initialValue:this.preferences.noRuby,effectiveValue:this.settings.noRuby||!1,isEffective:this.layout!==S.fixed&&this.metadata?.languages?.includes("ja")||!1,onChange:e=>{this.updatePreference("noRuby",e??null)}})}get optimalLineLength(){return new k({initialValue:this.preferences.optimalLineLength,effectiveValue:this.settings.optimalLineLength,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("optimalLineLength",e)},supportedRange:ce.range,step:ce.step})}get pageGutter(){return new U({initialValue:this.preferences.pageGutter,effectiveValue:this.settings.pageGutter,isEffective:this.layout!==S.fixed&&!this.settings.scroll,onChange:e=>{this.updatePreference("pageGutter",e??null)}})}get paragraphIndent(){return new k({initialValue:this.preferences.paragraphIndent,effectiveValue:this.settings.paragraphIndent||0,isEffective:this.layout!==S.fixed&&this.preferences.paragraphIndent!==null,onChange:e=>{this.updatePreference("paragraphIndent",e??null)},supportedRange:Ie.range,step:Ie.step})}get paragraphSpacing(){return new k({initialValue:this.preferences.paragraphSpacing,effectiveValue:this.settings.paragraphSpacing||0,isEffective:this.layout!==S.fixed&&this.preferences.paragraphSpacing!==null,onChange:e=>{this.updatePreference("paragraphSpacing",e??null)},supportedRange:He.range,step:He.step})}get scroll(){return new O({initialValue:this.preferences.scroll,effectiveValue:this.settings.scroll||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("scroll",e??null)}})}get scrollPaddingTop(){return new U({initialValue:this.preferences.scrollPaddingTop,effectiveValue:this.settings.scrollPaddingTop||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingTop!==null,onChange:e=>{this.updatePreference("scrollPaddingTop",e??null)}})}get scrollPaddingBottom(){return new U({initialValue:this.preferences.scrollPaddingBottom,effectiveValue:this.settings.scrollPaddingBottom||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingBottom!==null,onChange:e=>{this.updatePreference("scrollPaddingBottom",e??null)}})}get scrollPaddingLeft(){return new U({initialValue:this.preferences.scrollPaddingLeft,effectiveValue:this.settings.scrollPaddingLeft||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingLeft!==null,onChange:e=>{this.updatePreference("scrollPaddingLeft",e??null)}})}get scrollPaddingRight(){return new U({initialValue:this.preferences.scrollPaddingRight,effectiveValue:this.settings.scrollPaddingRight||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingRight!==null,onChange:e=>{this.updatePreference("scrollPaddingRight",e??null)}})}get selectionBackgroundColor(){return new U({initialValue:this.preferences.selectionBackgroundColor,effectiveValue:this.settings.selectionBackgroundColor||ke.selectionBackgroundColor,isEffective:this.layout!==S.fixed&&this.preferences.selectionBackgroundColor!==null,onChange:e=>{this.updatePreference("selectionBackgroundColor",e??null)}})}get selectionTextColor(){return new U({initialValue:this.preferences.selectionTextColor,effectiveValue:this.settings.selectionTextColor||ke.selectionTextColor,isEffective:this.layout!==S.fixed&&this.preferences.selectionTextColor!==null,onChange:e=>{this.updatePreference("selectionTextColor",e??null)}})}get textAlign(){return new Zt({initialValue:this.preferences.textAlign,effectiveValue:this.settings.textAlign||J.start,isEffective:this.layout!==S.fixed&&this.preferences.textAlign!==null,onChange:e=>{this.updatePreference("textAlign",e??null)},supportedValues:Object.values(J)})}get textColor(){return new U({initialValue:this.preferences.textColor,effectiveValue:this.settings.textColor||ke.textColor,isEffective:this.layout!==S.fixed&&this.preferences.textColor!==null,onChange:e=>{this.updatePreference("textColor",e??null)}})}get textNormalization(){return new O({initialValue:this.preferences.textNormalization,effectiveValue:this.settings.textNormalization||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("textNormalization",e??null)}})}get visitedColor(){return new U({initialValue:this.preferences.visitedColor,effectiveValue:this.settings.visitedColor||ke.visitedColor,isEffective:this.layout!==S.fixed&&this.preferences.visitedColor!==null,onChange:e=>{this.updatePreference("visitedColor",e??null)}})}get wordSpacing(){return new k({initialValue:this.preferences.wordSpacing,effectiveValue:this.settings.wordSpacing||0,isEffective:this.layout!==S.fixed&&this.preferences.wordSpacing!==null,onChange:e=>{this.updatePreference("wordSpacing",e??null)},supportedRange:De.range,step:De.step})}}class ln{constructor(e,t){this.backgroundColor=e.backgroundColor||t.backgroundColor||null,this.blendFilter=typeof e.blendFilter=="boolean"?e.blendFilter:t.blendFilter??null,this.columnCount=e.columnCount!==void 0?e.columnCount:t.columnCount!==void 0?t.columnCount:null,this.constraint=e.constraint||t.constraint,this.darkenFilter=typeof e.darkenFilter=="boolean"?e.darkenFilter:t.darkenFilter??null,this.deprecatedFontSize=typeof e.deprecatedFontSize=="boolean"?e.deprecatedFontSize:t.deprecatedFontSize??null,this.fontFamily=e.fontFamily||t.fontFamily||null,this.fontSize=e.fontSize!==void 0?e.fontSize:t.fontSize!==void 0?t.fontSize:null,this.fontSizeNormalize=typeof e.fontSizeNormalize=="boolean"?e.fontSizeNormalize:t.fontSizeNormalize??null,this.fontOpticalSizing=typeof e.fontOpticalSizing=="boolean"?e.fontOpticalSizing:t.fontOpticalSizing??null,this.fontWeight=e.fontWeight!==void 0?e.fontWeight:t.fontWeight!==void 0?t.fontWeight:null,this.fontWidth=e.fontWidth!==void 0?e.fontWidth:t.fontWidth!==void 0?t.fontWidth:null,this.hyphens=typeof e.hyphens=="boolean"?e.hyphens:t.hyphens??null,this.invertFilter=typeof e.invertFilter=="boolean"?e.invertFilter:t.invertFilter??null,this.invertGaijiFilter=typeof e.invertGaijiFilter=="boolean"?e.invertGaijiFilter:t.invertGaijiFilter??null,this.iOSPatch=this.deprecatedFontSize||e.iOSPatch===!1?!1:e.iOSPatch===!0?(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile":t.iOSPatch,this.iPadOSPatch=this.deprecatedFontSize||e.iPadOSPatch===!1?!1:e.iPadOSPatch===!0?L.OS.iPadOS&&L.iOSRequest==="desktop":t.iPadOSPatch,this.letterSpacing=e.letterSpacing!==void 0?e.letterSpacing:t.letterSpacing!==void 0?t.letterSpacing:null,this.ligatures=typeof e.ligatures=="boolean"?e.ligatures:t.ligatures??null,this.lineHeight=e.lineHeight!==void 0?e.lineHeight:t.lineHeight!==void 0?t.lineHeight:null,this.linkColor=e.linkColor||t.linkColor||null,this.maximalLineLength=e.maximalLineLength===null?null:e.maximalLineLength||t.maximalLineLength||null,this.minimalLineLength=e.minimalLineLength===null?null:e.minimalLineLength||t.minimalLineLength||null,this.noRuby=typeof e.noRuby=="boolean"?e.noRuby:t.noRuby??null,this.optimalLineLength=e.optimalLineLength||t.optimalLineLength,this.pageGutter=e.pageGutter!==void 0?e.pageGutter:t.pageGutter!==void 0?t.pageGutter:null,this.paragraphIndent=e.paragraphIndent!==void 0?e.paragraphIndent:t.paragraphIndent!==void 0?t.paragraphIndent:null,this.paragraphSpacing=e.paragraphSpacing!==void 0?e.paragraphSpacing:t.paragraphSpacing!==void 0?t.paragraphSpacing:null,this.scroll=typeof e.scroll=="boolean"?e.scroll:t.scroll??null,this.scrollPaddingTop=e.scrollPaddingTop!==void 0?e.scrollPaddingTop:t.scrollPaddingTop!==void 0?t.scrollPaddingTop:null,this.scrollPaddingBottom=e.scrollPaddingBottom!==void 0?e.scrollPaddingBottom:t.scrollPaddingBottom!==void 0?t.scrollPaddingBottom:null,this.scrollPaddingLeft=e.scrollPaddingLeft!==void 0?e.scrollPaddingLeft:t.scrollPaddingLeft!==void 0?t.scrollPaddingLeft:null,this.scrollPaddingRight=e.scrollPaddingRight!==void 0?e.scrollPaddingRight:t.scrollPaddingRight!==void 0?t.scrollPaddingRight:null,this.selectionBackgroundColor=e.selectionBackgroundColor||t.selectionBackgroundColor||null,this.selectionTextColor=e.selectionTextColor||t.selectionTextColor||null,this.textAlign=e.textAlign||t.textAlign||null,this.textColor=e.textColor||t.textColor||null,this.textNormalization=typeof e.textNormalization=="boolean"?e.textNormalization:t.textNormalization??null,this.visitedColor=e.visitedColor||t.visitedColor||null,this.wordSpacing=e.wordSpacing!==void 0?e.wordSpacing:t.wordSpacing!==void 0?t.wordSpacing:null,this.experiments=t.experiments||null}}function Ke(r){const e=getComputedStyle(r),t=parseFloat(e.paddingLeft||"0"),n=parseFloat(e.paddingRight||"0");return r.clientWidth-t-n}function zr(r){const e=getComputedStyle(r),t=parseFloat(e.paddingTop||"0"),n=parseFloat(e.paddingBottom||"0");return r.clientHeight-t-n}class cn extends Ge{constructor(e){super(),this.a11yNormalize=e.a11yNormalize??null,this.backgroundColor=e.backgroundColor??null,this.blendFilter=e.blendFilter??null,this.bodyHyphens=e.bodyHyphens??null,this.colCount=e.colCount??null,this.darkenFilter=e.darkenFilter??null,this.deprecatedFontSize=e.deprecatedFontSize??null,this.fontFamily=e.fontFamily??null,this.fontOpticalSizing=e.fontOpticalSizing??null,this.fontSize=e.fontSize??null,this.fontSizeNormalize=e.fontSizeNormalize??null,this.fontWeight=e.fontWeight??null,this.fontWidth=e.fontWidth??null,this.invertFilter=e.invertFilter??null,this.invertGaijiFilter=e.invertGaijiFilter??null,this.iOSPatch=e.iOSPatch??null,this.iPadOSPatch=e.iPadOSPatch??null,this.letterSpacing=e.letterSpacing??null,this.ligatures=e.ligatures??null,this.lineHeight=e.lineHeight??null,this.lineLength=e.lineLength??null,this.linkColor=e.linkColor??null,this.noRuby=e.noRuby??null,this.paraIndent=e.paraIndent??null,this.paraSpacing=e.paraSpacing??null,this.selectionBackgroundColor=e.selectionBackgroundColor??null,this.selectionTextColor=e.selectionTextColor??null,this.textAlign=e.textAlign??null,this.textColor=e.textColor??null,this.view=e.view??null,this.visitedColor=e.visitedColor??null,this.wordSpacing=e.wordSpacing??null}toCSSProperties(){const e={};return this.a11yNormalize&&(e["--USER__a11yNormalize"]=this.toFlag("a11y")),this.backgroundColor&&(e["--USER__backgroundColor"]=this.backgroundColor),this.blendFilter&&(e["--USER__blendFilter"]=this.toFlag("blend")),this.bodyHyphens&&(e["--USER__bodyHyphens"]=this.bodyHyphens),this.colCount&&(e["--USER__colCount"]=this.toUnitless(this.colCount)),this.darkenFilter===!0?e["--USER__darkenFilter"]=this.toFlag("darken"):typeof this.darkenFilter=="number"&&(e["--USER__darkenFilter"]=this.toPercentage(this.darkenFilter)),this.deprecatedFontSize&&(e["--USER__fontSizeImplementation"]=this.toFlag("deprecatedFontSize")),this.fontFamily&&(e["--USER__fontFamily"]=this.fontFamily),this.fontOpticalSizing!=null&&(e["--USER__fontOpticalSizing"]=this.fontOpticalSizing),this.fontSize!=null&&(e["--USER__fontSize"]=this.toPercentage(this.fontSize,!0)),this.fontSizeNormalize&&(e["--USER__fontSizeNormalize"]=this.toFlag("normalize")),this.fontWeight!=null&&(e["--USER__fontWeight"]=this.toUnitless(this.fontWeight)),this.fontWidth!=null&&(e["--USER__fontWidth"]=typeof this.fontWidth=="string"?this.fontWidth:this.toUnitless(this.fontWidth)),this.invertFilter===!0?e["--USER__invertFilter"]=this.toFlag("invert"):typeof this.invertFilter=="number"&&(e["--USER__invertFilter"]=this.toPercentage(this.invertFilter)),this.invertGaijiFilter===!0?e["--USER__invertGaiji"]=this.toFlag("invertGaiji"):typeof this.invertGaijiFilter=="number"&&(e["--USER__invertGaiji"]=this.toPercentage(this.invertGaijiFilter)),this.iOSPatch&&(e["--USER__iOSPatch"]=this.toFlag("iOSPatch")),this.iPadOSPatch&&(e["--USER__iPadOSPatch"]=this.toFlag("iPadOSPatch")),this.letterSpacing!=null&&(e["--USER__letterSpacing"]=this.toRem(this.letterSpacing)),this.ligatures&&(e["--USER__ligatures"]=this.ligatures),this.lineHeight!=null&&(e["--USER__lineHeight"]=this.toUnitless(this.lineHeight)),this.lineLength!=null&&(e["--USER__lineLength"]=this.toPx(this.lineLength)),this.linkColor&&(e["--USER__linkColor"]=this.linkColor),this.noRuby&&(e["--USER__noRuby"]=this.toFlag("noRuby")),this.paraIndent!=null&&(e["--USER__paraIndent"]=this.toRem(this.paraIndent)),this.paraSpacing!=null&&(e["--USER__paraSpacing"]=this.toRem(this.paraSpacing)),this.selectionBackgroundColor&&(e["--USER__selectionBackgroundColor"]=this.selectionBackgroundColor),this.selectionTextColor&&(e["--USER__selectionTextColor"]=this.selectionTextColor),this.textAlign&&(e["--USER__textAlign"]=this.textAlign),this.textColor&&(e["--USER__textColor"]=this.textColor),this.view&&(e["--USER__view"]=this.toFlag(this.view)),this.visitedColor&&(e["--USER__visitedColor"]=this.visitedColor),this.wordSpacing!=null&&(e["--USER__wordSpacing"]=this.toRem(this.wordSpacing)),e}}class Gi extends Ge{constructor(e){super(),this.backgroundColor=e.backgroundColor??null,this.baseFontFamily=e.baseFontFamily??null,this.baseFontSize=e.baseFontSize??null,this.baseLineHeight=e.baseLineHeight??null,this.boxSizingMedia=e.boxSizingMedia??null,this.boxSizingTable=e.boxSizingTable??null,this.colWidth=e.colWidth??null,this.colCount=e.colCount??null,this.colGap=e.colGap??null,this.codeFontFamily=e.codeFontFamily??null,this.compFontFamily=e.compFontFamily??null,this.defaultLineLength=e.defaultLineLength??null,this.flowSpacing=e.flowSpacing??null,this.humanistTf=e.humanistTf??null,this.linkColor=e.linkColor??null,this.maxMediaWidth=e.maxMediaWidth??null,this.maxMediaHeight=e.maxMediaHeight??null,this.modernTf=e.modernTf??null,this.monospaceTf=e.monospaceTf??null,this.noOverflow=e.noOverflow??null,this.noVerticalPagination=e.noVerticalPagination??null,this.oldStyleTf=e.oldStyleTf??null,this.pageGutter=e.pageGutter??null,this.paraIndent=e.paraIndent??null,this.paraSpacing=e.paraSpacing??null,this.primaryColor=e.primaryColor??null,this.scrollPaddingBottom=e.scrollPaddingBottom??null,this.scrollPaddingLeft=e.scrollPaddingLeft??null,this.scrollPaddingRight=e.scrollPaddingRight??null,this.scrollPaddingTop=e.scrollPaddingTop??null,this.sansSerifJa=e.sansSerifJa??null,this.sansSerifJaV=e.sansSerifJaV??null,this.sansTf=e.sansTf??null,this.secondaryColor=e.secondaryColor??null,this.selectionBackgroundColor=e.selectionBackgroundColor??null,this.selectionTextColor=e.selectionTextColor??null,this.serifJa=e.serifJa??null,this.serifJaV=e.serifJaV??null,this.textColor=e.textColor??null,this.typeScale=e.typeScale??null,this.visitedColor=e.visitedColor??null,this.experiments=e.experiments??null}toCSSProperties(){const e={};return this.backgroundColor&&(e["--RS__backgroundColor"]=this.backgroundColor),this.baseFontFamily&&(e["--RS__baseFontFamily"]=this.baseFontFamily),this.baseFontSize!=null&&(e["--RS__baseFontSize"]=this.toRem(this.baseFontSize)),this.baseLineHeight!=null&&(e["--RS__baseLineHeight"]=this.toUnitless(this.baseLineHeight)),this.boxSizingMedia&&(e["--RS__boxSizingMedia"]=this.boxSizingMedia),this.boxSizingTable&&(e["--RS__boxSizingTable"]=this.boxSizingTable),this.colWidth!=null&&(e["--RS__colWidth"]=this.colWidth),this.colCount!=null&&(e["--RS__colCount"]=this.toUnitless(this.colCount)),this.colGap!=null&&(e["--RS__colGap"]=this.toPx(this.colGap)),this.codeFontFamily&&(e["--RS__codeFontFamily"]=this.codeFontFamily),this.compFontFamily&&(e["--RS__compFontFamily"]=this.compFontFamily),this.defaultLineLength!=null&&(e["--RS__defaultLineLength"]=this.toPx(this.defaultLineLength)),this.flowSpacing!=null&&(e["--RS__flowSpacing"]=this.toRem(this.flowSpacing)),this.humanistTf&&(e["--RS__humanistTf"]=this.humanistTf),this.linkColor&&(e["--RS__linkColor"]=this.linkColor),this.maxMediaWidth&&(e["--RS__maxMediaWidth"]=this.toVw(this.maxMediaWidth)),this.maxMediaHeight&&(e["--RS__maxMediaHeight"]=this.toVh(this.maxMediaHeight)),this.modernTf&&(e["--RS__modernTf"]=this.modernTf),this.monospaceTf&&(e["--RS__monospaceTf"]=this.monospaceTf),this.noOverflow&&(e["--RS__disableOverflow"]=this.toFlag("noOverflow")),this.noVerticalPagination&&(e["--RS__disablePagination"]=this.toFlag("noVerticalPagination")),this.oldStyleTf&&(e["--RS__oldStyleTf"]=this.oldStyleTf),this.pageGutter!=null&&(e["--RS__pageGutter"]=this.toPx(this.pageGutter)),this.paraIndent!=null&&(e["--RS__paraIndent"]=this.toRem(this.paraIndent)),this.paraSpacing!=null&&(e["--RS__paraSpacing"]=this.toRem(this.paraSpacing)),this.primaryColor&&(e["--RS__primaryColor"]=this.primaryColor),this.sansSerifJa&&(e["--RS__sans-serif-ja"]=this.sansSerifJa),this.sansSerifJaV&&(e["--RS__sans-serif-ja-v"]=this.sansSerifJaV),this.sansTf&&(e["--RS__sansTf"]=this.sansTf),this.scrollPaddingBottom!=null&&(e["--RS__scrollPaddingBottom"]=this.toPx(this.scrollPaddingBottom)),this.scrollPaddingLeft!=null&&(e["--RS__scrollPaddingLeft"]=this.toPx(this.scrollPaddingLeft)),this.scrollPaddingRight!=null&&(e["--RS__scrollPaddingRight"]=this.toPx(this.scrollPaddingRight)),this.scrollPaddingTop!=null&&(e["--RS__scrollPaddingTop"]=this.toPx(this.scrollPaddingTop)),this.secondaryColor&&(e["--RS__secondaryColor"]=this.secondaryColor),this.selectionBackgroundColor&&(e["--RS__selectionBackgroundColor"]=this.selectionBackgroundColor),this.selectionTextColor&&(e["--RS__selectionTextColor"]=this.selectionTextColor),this.serifJa&&(e["--RS__serif-ja"]=this.serifJa),this.serifJaV&&(e["--RS__serif-ja-v"]=this.serifJaV),this.textColor&&(e["--RS__textColor"]=this.textColor),this.typeScale&&(e["--RS__typeScale"]=this.toUnitless(this.typeScale)),this.visitedColor&&(e["--RS__visitedColor"]=this.visitedColor),this.experiments&&this.experiments.forEach(t=>{e["--RS__"+t]=ut[t].value}),e}}class Vi{constructor(e){this.rsProperties=e.rsProperties,this.userProperties=e.userProperties,this.lineLengths=e.lineLengths,this.container=e.container,this.containerParent=e.container.parentElement||document.documentElement,this.constraint=e.constraint,this.isCJKVertical=e.isCJKVertical??!1,this.cachedColCount=e.userProperties.colCount,this.effectiveContainerWidth=Ke(this.containerParent)}update(e){this.cachedColCount=e.columnCount,e.constraint!==this.constraint&&(this.constraint=e.constraint),e.pageGutter!==this.rsProperties.pageGutter&&(this.rsProperties.pageGutter=e.pageGutter),e.scrollPaddingBottom!==this.rsProperties.scrollPaddingBottom&&(this.rsProperties.scrollPaddingBottom=e.scrollPaddingBottom),e.scrollPaddingLeft!==this.rsProperties.scrollPaddingLeft&&(this.rsProperties.scrollPaddingLeft=e.scrollPaddingLeft),e.scrollPaddingRight!==this.rsProperties.scrollPaddingRight&&(this.rsProperties.scrollPaddingRight=e.scrollPaddingRight),e.scrollPaddingTop!==this.rsProperties.scrollPaddingTop&&(this.rsProperties.scrollPaddingTop=e.scrollPaddingTop),e.experiments!==this.rsProperties.experiments&&(this.rsProperties.experiments=e.experiments),this.lineLengths.update({fontFace:e.fontFamily,letterSpacing:e.letterSpacing,padding:e.scroll?(e.scrollPaddingLeft||0)+(e.scrollPaddingRight||0):(e.pageGutter||0)*2,wordSpacing:e.wordSpacing,optimalChars:e.optimalLineLength,minChars:e.minimalLineLength,maxChars:e.maximalLineLength});const t=this.updateLayout(e.fontSize,e.deprecatedFontSize||e.iOSPatch,e.scroll,e.columnCount);t?.effectiveContainerWidth&&(this.effectiveContainerWidth=t?.effectiveContainerWidth);const n={a11yNormalize:e.textNormalization,backgroundColor:e.backgroundColor,blendFilter:e.blendFilter,bodyHyphens:typeof e.hyphens!="boolean"?null:e.hyphens?"auto":"none",colCount:t?.colCount,darkenFilter:e.darkenFilter,deprecatedFontSize:e.deprecatedFontSize,fontFamily:e.fontFamily,fontOpticalSizing:typeof e.fontOpticalSizing!="boolean"?null:e.fontOpticalSizing?"auto":"none",fontSize:e.fontSize,fontSizeNormalize:e.fontSizeNormalize,fontWeight:e.fontWeight,fontWidth:e.fontWidth,invertFilter:e.invertFilter,invertGaijiFilter:e.invertGaijiFilter,iOSPatch:e.iOSPatch,iPadOSPatch:e.iPadOSPatch,letterSpacing:e.letterSpacing,ligatures:typeof e.ligatures!="boolean"?null:e.ligatures?"common-ligatures":"none",lineHeight:e.lineHeight,lineLength:t?.effectiveLineLength,linkColor:e.linkColor,noRuby:e.noRuby,paraIndent:e.paragraphIndent,paraSpacing:e.paragraphSpacing,selectionBackgroundColor:e.selectionBackgroundColor,selectionTextColor:e.selectionTextColor,textAlign:e.textAlign,textColor:e.textColor,view:typeof e.scroll!="boolean"?null:e.scroll?"scroll":"paged",visitedColor:e.visitedColor,wordSpacing:e.wordSpacing};this.userProperties=new cn(n)}updateLayout(e,t,n,i){return this.isCJKVertical?this.computeCJKVerticalLength(e,t):n??this.userProperties.view==="scroll"?this.computeScrollLength(e,t):this.paginate(e,t,i)}getCompensatedMetrics(e,t){const n=e||this.userProperties.fontSize||1,i=n<1?1/n:t?n:1;return{zoomFactor:n,zoomCompensation:i,optimal:Math.round(this.lineLengths.optimalLineLength)*n,minimal:this.lineLengths.minimalLineLength!==null?Math.round(this.lineLengths.minimalLineLength*n):null,maximal:this.lineLengths.maximalLineLength!==null?Math.round(this.lineLengths.maximalLineLength*n):null}}paginate(e,t,n){const i=Math.round(Ke(this.containerParent)-this.constraint),o=this.getCompensatedMetrics(e,t),{zoomCompensation:a,optimal:s,minimal:l,maximal:c}=o,h=()=>i>=s&&c!==null?Math.min(Math.round(c*a),i):i;let u=1,m=i;if(n===void 0)return{colCount:void 0,effectiveContainerWidth:m,effectiveLineLength:Math.round(m/u*a)};if(n===null)if(i>=s&&c!==null){u=Math.floor(i/s);const f=Math.round(u*(c*a));m=Math.min(f,i)}else m=h();else if(n>1){const f=Math.round(n*(l!==null?l:s));if(i>=f)if(u=n,c===null)m=i;else{const d=Math.round(u*(c*a));m=Math.min(d,i)}else if(l!==null&&i<Math.round(n*l))if(u=Math.floor(i/l),u<=1)u=1,m=h();else{const d=Math.round(u*(s*a));m=Math.min(d,i)}else{u=n;const d=Math.round(u*(s*a));m=Math.min(d,i)}}else u=1,m=h();return{colCount:u,effectiveContainerWidth:m,effectiveLineLength:Math.round(m/u/(e&&e>=1?e:1)*a)}}computeCJKVerticalLength(e,t){const n=Math.round(Ke(this.containerParent)-this.constraint),i=Math.round(zr(this.containerParent)),o=this.getCompensatedMetrics(e,t),a=o.maximal!==null?Math.min(Math.round(o.maximal*o.zoomCompensation),i):i;return{colCount:void 0,effectiveContainerWidth:n,effectiveLineLength:a}}computeScrollLength(e,t){const n=Math.round(Ke(this.containerParent)-this.constraint),i=this.getCompensatedMetrics(e&&(e<1||t)?e:1,t),o=i.zoomCompensation,a=i.optimal,s=i.maximal;let l,c=n,h=Math.round(a*o);if(s===null)h=n;else{const u=Math.min(Math.round(s*o),n);h=t?u:Math.round(u*o)}return{colCount:l,effectiveContainerWidth:c,effectiveLineLength:h}}setContainerWidth(){this.container.style.width=`${this.effectiveContainerWidth}px`}resizeHandler(){const e=this.updateLayout(this.userProperties.fontSize,this.userProperties.deprecatedFontSize||this.userProperties.iOSPatch,this.userProperties.view==="scroll",this.cachedColCount);this.userProperties.colCount=e.colCount,this.userProperties.lineLength=e.effectiveLineLength,this.effectiveContainerWidth=e.effectiveContainerWidth,this.container.style.width=`${this.effectiveContainerWidth}px`}}const Lr=`// Note: we aren't blocking some of the events right now to try and be as nonintrusive as possible.
|
|
414
|
+
Overscroll: ${this.pan.overscrollX.toFixed(2)},${this.pan.overscrollY.toFixed(2)}`)}if(i){this.manager.updateBookStyle();return}if(this.dragState>0&&this.pan.letItGo){this.pan.endX=t.X;const s=this.manager.currentSlide*(this.manager.width/this.manager.perPage),l=this.pan.endX-this.pan.startX,c=this.manager.rtl?s+l:s-l;cancelAnimationFrame(this.moveFrame),this.moveFrame=requestAnimationFrame(()=>{requestAnimationFrame(()=>{this.manager.spineElement.style.transform=`translate3d(${(this.manager.rtl?1:-1)*c}px, 0, 0)`})})}}dblclickHandler(e){clearTimeout(this.dtimer),this.pdblclick=!0,this.dtimer=window.setTimeout(()=>this.pdblclick=!1,200),!this.disableDblClick&&this.isScaled&&(this.scale=1)}get isScaled(){return this.scale>1}addTouch(e){e.touches=[{pageX:e.pageX,pageY:e.pageY}]}mousedownHandler(e){this.isScaled&&(this.addTouch(e),this.touchstartHandler(e))}mouseupHandler(e){this.isScaled&&this.touchendHandler(e)}mousemoveHandler(e){this.isScaled&&e.buttons>0&&(e.preventDefault(),this.addTouch(e),this.touchmoveHandler(e))}updateAfterDrag(){const e=(this.manager.rtl?-1:1)*(this.pan.endX-this.pan.startX),t=Math.abs(e);e>0&&t>this.manager.threshold&&this.manager.slength>this.manager.perPage?this.manager.listener("no_less",void 0):e<0&&t>this.manager.threshold&&this.manager.slength>this.manager.perPage&&this.manager.listener("no_more",void 0),this.manager.slideToCurrent(!0,!0)}}var gt=(r=>(r.auto="auto",r.landscape="landscape",r.portrait="portrait",r))(gt||{}),ft=(r=>(r.auto="auto",r.both="both",r.none="none",r.landscape="landscape",r))(ft||{});class Hi{constructor(e){this.shift=!0,this.spreads=[],this.nLandscape=0,this.index(e),this.testShift(e),console.log(`Indexed ${this.spreads.length} spreads for ${e.readingOrder.items.length} items`)}index(e,t=!1){this.nLandscape=0,e.readingOrder.items.forEach((n,i)=>{t||(e.readingOrder.items[i]=n.addProperties({number:i+1,isImage:n.type?.indexOf("image/")===0}));const o=n.properties?.otherProperties.orientation==="landscape";(!n.properties?.page||t)&&(n.properties=n.properties?.add({page:o?"center":((this.shift?0:1)+i-this.nLandscape)%2?e.metadata.readingProgression===M.rtl?"right":"left":e.metadata.readingProgression===M.rtl?"left":"right"})),(o||n.properties?.otherProperties.addBlank)&&this.nLandscape++}),t&&(this.spreads=[]),this.buildSpreads(e.readingOrder)}testShift(e){let t=!1;this.spreads.forEach((n,i)=>{if(n.length>1)return;const o=n[0],a=o.properties?.otherProperties.orientation;i===0&&(a==="landscape"||a!=="portrait"&&((o.width||0)>(o.height||0)||o.properties?.otherProperties.spread==="both"))&&(this.shift=!1),t&&o.properties?.page===K.center&&this.spreads[i-1][0].addProperties({addBlank:!0}),a==="portrait"&&o.properties?.page!=="center"&&o.properties?.otherProperties.number>1?t=!0:t=!1}),this.shift||this.index(e,!0)}buildSpreads(e){let t=[];e.items.forEach((n,i)=>{!i&&this.shift?this.spreads.push([n]):n.properties?.page===K.center?(t.length>0&&this.spreads.push(t),this.spreads.push([n]),t=[]):t.length>=2?(this.spreads.push(t),t=[n]):t.push(n)}),t.length>0&&this.spreads.push(t)}currentSpread(e,t){return this.spreads[Math.min(Math.floor(e/t),this.spreads.length-1)]}findByLink(e){return this.spreads.find(t=>t.includes(e))||void 0}}const Di=8,Wi=5,Cr=300,kr=15e3,Er=250,xr=150,Fr=500;class Bi{constructor(e,t,n,i,o,a){if(this.pool=new Map,this.blobs=new Map,this.inprogress=new Map,this.delayedShow=new Map,this.delayedTimeout=new Map,this.previousFrames=[],this.injector=null,this.width=0,this.height=0,this.transform="",this.currentSlide=0,this.spread=!0,this.orientationInternal=-1,this.container=e,this.positions=t,this.pub=n,this.injector=i??null,this.contentProtectionConfig=o||{},this.keyboardPeripheralsConfig=a||[],this.spreadPresentation=n.metadata.otherMetadata?.spread||ft.auto,this.pub.metadata.effectiveReadingProgression!==M.rtl&&this.pub.metadata.effectiveReadingProgression!==M.ltr)throw Error("Unsupported reading progression for EPUB");this.spreader=new Hi(this.pub),this.containerHeightCached=e.clientHeight,this.bookElement=document.createElement("div"),this.bookElement.ariaLabel="Book",this.bookElement.tabIndex=-1,this.updateBookStyle(!0),this.spineElement=document.createElement("div"),this.spineElement.ariaLabel="Spine",this.bookElement.appendChild(this.spineElement),this.container.appendChild(this.bookElement),this.updateSpineStyle(!0),this.peripherals=new Ii(this),this.pub.readingOrder.items.forEach(s=>{const l=new Oi(this.peripherals,this.pub.metadata.effectiveReadingProgression,s.href,this.contentProtectionConfig,this.keyboardPeripheralsConfig);this.spineElement.appendChild(l.element),this.pool.set(s.href,l),l.width=100/this.length*(s.properties?.otherProperties.orientation===gt.landscape||s.properties?.otherProperties.addBlank?this.perPage:1),l.height=this.height})}set listener(e){this._listener=e}get listener(){return this._listener}get doNotDisturb(){return this.peripherals.pan.touchID>0}resizeHandler(e=!0,t=!0){this.currentSlide+this.perPage>this.length&&(this.currentSlide=this.length<=this.perPage?0:this.length-1),this.containerHeightCached=this.container.clientHeight,this.orientationInternal=-1,this.updateSpineStyle(!0),e&&(this.currentSlide=this.reAlign(),this.slideToCurrent(!t,t)),clearTimeout(this.resizeTimeout),this.resizeTimeout=window.setTimeout(()=>{this.pool.forEach((n,i)=>{let o=this.pub.readingOrder.items.findIndex(l=>l.href===i);const a=this.pub.readingOrder.items[o];if(n.width=100/this.length*(a.properties?.otherProperties.orientation===gt.landscape||a.properties?.otherProperties.addBlank?this.perPage:1),n.height=this.height,!n.loaded)return;const s=this.spreader.findByLink(a);n.update(this.spreadPosition(s,a))})},Er)}updateDimensions(){this.width=this.bookElement.clientWidth,this.height=this.bookElement.clientHeight}get rtl(){return this.pub.metadata.effectiveReadingProgression===M.rtl}get single(){return!this.spread||this.portrait}get perPage(){return this.spread&&!this.portrait?2:1}get threshold(){return 50}get portrait(){return this.spreadPresentation===ft.none?!0:(this.orientationInternal===-1&&(this.orientationInternal=this.containerHeightCached>this.container.clientWidth?1:0),this.orientationInternal===1)}updateSpineStyle(e,t=!0){let n="0";this.updateDimensions(),this.perPage>1&&(n=`${this.width/2}px`);const i={transition:e?`all ${t?xr:Fr}ms ease-out`:"all 0ms ease-out",marginRight:this.rtl?n:"0",marginLeft:this.rtl?"0":n,width:`${this.width/this.perPage*this.length}px`,transform:this.transform,contain:"content"};Object.assign(this.spineElement.style,i)}updateBookStyle(e=!1){if(e){const t={overflow:"hidden",direction:this.pub.metadata.effectiveReadingProgression,cursor:"",height:"100%",width:"100%",position:"relative",outline:"none",transition:this.peripherals?.dragState?"none":"transform .15s ease-in-out",touchAction:"none"};Object.assign(this.bookElement.style,t)}this.bookElement.style.transform=`scale(${this.peripherals?.scale||1})`+(this.peripherals?` translate3d(${this.peripherals.pan.translateX}px, ${this.peripherals.pan.translateY}px, 0px)`:"")}goTo(e){if(this.slength<=this.perPage)return;e=this.reAlign(e);const t=this.currentSlide;this.currentSlide=Math.min(Math.max(e,0),this.length-1),t!==this.currentSlide&&this.slideToCurrent(!1)}onChange(){this.peripherals.scale=1,this.updateBookStyle()}get offset(){return(this.rtl?1:-1)*this.currentSlide*(this.width/this.perPage)}get length(){if(this.single)return this.slength;const e=this.slength+this.nLandscape;return this.shift&&e%2===0?e+1:e}get slength(){return this.pub.readingOrder.items.length||0}get shift(){return this.spreader.shift}get nLandscape(){return this.spreader.nLandscape}setPerPage(e){e===null?this.spread=!0:e===1?this.spread=!1:this.spread=!0,requestAnimationFrame(()=>this.resizeHandler(!0))}slideToCurrent(e,t=!0){if(this.updateDimensions(),e)requestAnimationFrame(()=>{requestAnimationFrame(()=>{const n=`translate3d(${this.offset}px, 0, 0)`;this.spineElement.style.transform!==n&&(this.transform=n,this.updateSpineStyle(!0,t),this.deselect())})});else{const n=`translate3d(${this.offset}px, 0, 0)`;if(this.spineElement.style.transform===n)return;this.transform=n,this.updateSpineStyle(!1),this.deselect()}}bounce(e=!1){requestAnimationFrame(()=>{this.transform=`translate3d(${this.offset+50*(e?1:-1)}px, 0, 0)`,this.updateSpineStyle(!0,!0),setTimeout(()=>{this.transform=`translate3d(${this.offset}px, 0, 0)`,this.updateSpineStyle(!0,!0)},100)})}next(e=1){if(this.slength<=this.perPage)return!1;const t=this.currentSlide;return this.currentSlide=Math.min(this.currentSlide+e,this.length-1),this.perPage>1&&this.currentSlide%2&&this.currentSlide--,this.currentSlide===t&&(this.currentSlide+1,this.length),t!==this.currentSlide?(this.slideToCurrent(!0),this.onChange(),!0):(this.bounce(this.rtl),!1)}prev(e=1){if(this.slength<=this.perPage)return!1;const t=this.currentSlide;return this.currentSlide=Math.max(this.currentSlide-e,0),this.perPage>1&&this.currentSlide%2&&this.currentSlide++,t!==this.currentSlide?(this.slideToCurrent(!0),this.onChange(),!0):(this.bounce(!this.rtl),!1)}get ownerWindow(){return this.container.ownerDocument.defaultView||window}async destroy(){let e=this.inprogress.values(),t=e.next();const n=[];for(;t.value;)n.push(t.value),t=e.next();n.length>0&&await Promise.allSettled(n),this.inprogress.clear();let i=this.pool.values(),o=i.next();for(;o.value;)await o.value.destroy(),o=i.next();this.pool.clear(),this.blobs.forEach(a=>URL.revokeObjectURL(a)),this.injector?.dispose(),this.container.childNodes.forEach(a=>{(a.nodeType===Node.ELEMENT_NODE||a.nodeType===Node.TEXT_NODE)&&a.remove()})}makeSpread(e){return this.perPage<2?[this.pub.readingOrder.items[e]]:this.spreader.currentSpread(e,this.perPage)}reAlign(e=this.currentSlide){return e%2&&!this.single&&e++,e}spreadPosition(e,t){return this.perPage<2||e.length<2?K.center:t.href===e[0].href?this.rtl?K.right:K.left:this.rtl?K.left:K.right}async waitForItem(e){if(this.inprogress.has(e)&&await this.inprogress.get(e),this.delayedShow.has(e)){const t=this.delayedTimeout.get(e);t>0?clearTimeout(t):await this.delayedShow.get(e),this.delayedTimeout.set(e,0),this.delayedShow.delete(e)}}async cancelShowing(e){if(this.delayedShow.has(e)){const t=this.delayedTimeout.get(e);t>0&&clearTimeout(t),this.delayedShow.delete(e)}}async update(e,t,n,i=!1){let o=this.pub.readingOrder.items.findIndex(l=>l.href===t.href);if(o<0)throw Error("Href not found in reading order");this.currentSlide!==o&&(this.currentSlide=this.reAlign(o),this.slideToCurrent(!0));const a=this.makeSpread(this.currentSlide);this.perPage>1&&o++;for(const l of a)await this.waitForItem(l.href);const s=new Promise(async(l,c)=>{const h=[],u=[];this.positions.forEach((d,p)=>{(p>o+Di||p<o-Di)&&(h.includes(d.href)||h.push(d.href)),p<o+Wi&&p>o-Wi&&(u.includes(d.href)||u.push(d.href))}),h.forEach(async d=>{u.includes(d)||this.pool.has(d)&&(this.cancelShowing(d),await this.pool.get(d)?.unload())}),this.currentBaseURL!==void 0&&e.baseURL!==this.currentBaseURL&&(this.blobs.forEach(d=>URL.revokeObjectURL(d)),this.blobs.clear()),this.currentBaseURL=e.baseURL;const m=async d=>{const p=e.readingOrder.findIndexWithHref(d),b=e.readingOrder.items[p];if(b){if(!this.blobs.has(d)){const A=await new xi(e,this.currentBaseURL||"",b,{injector:this.injector}).build(!0);this.blobs.set(d,A)}this.delayedShow.has(d)||this.delayedShow.set(d,new Promise((P,A)=>{let Q=!1;const xe=window.setTimeout(async()=>{this.delayedTimeout.set(d,0);const Fe=this.makeSpread(this.reAlign(p)),aa=this.spreadPosition(Fe,b),no=this.pool.get(d);await no.load(n,this.blobs.get(d)),this.peripherals.isScaled||await no.show(aa),this.delayedShow.delete(d),Q=!0,P()},Cr);setTimeout(()=>{!Q&&this.delayedShow.has(d)&&A(`Offscreen load timeout: ${d}`)},kr),this.delayedTimeout.set(d,xe)}))}};try{await Promise.all(u.map(d=>m(d)))}catch(d){c(d)}const f=[];for(const d of a){const p=this.pool.get(d.href),b=this.blobs.get(d.href);b&&(this.cancelShowing(d.href),await p.load(n,b),await p.show(this.spreadPosition(a,d)),this.previousFrames.push(p),await p.activate(),f.push(p))}for(;this.previousFrames.length>0;){const d=this.previousFrames.shift();d&&!f.includes(d)&&await d.unfocus()}this.previousFrames=f,l()});for(const l of a)this.inprogress.set(l.href,s);await s;for(const l of a)this.inprogress.delete(l.href)}get currentFrames(){if(this.perPage<2){const t=this.pub.readingOrder.items[this.currentSlide];return[this.pool.get(t.href)]}return this.spreader.currentSpread(this.currentSlide,this.perPage).map(t=>this.pool.get(t.href))}get currentBounds(){const e={x:0,y:0,width:0,height:0,top:0,right:0,bottom:0,left:0,toJSON(){return this}};return this.currentFrames.forEach(t=>{if(!t)return;const n=t.realSize;e.x=Math.min(e.x,n.x),e.y=Math.min(e.y,n.y),e.width+=n.width,e.height=Math.max(e.height,n.height),e.top=Math.min(e.top,n.top),e.right=Math.min(e.right,n.right),e.bottom=Math.min(e.bottom,n.bottom),e.left=Math.min(e.left,n.left)}),e}get viewport(){const e={readingOrder:[],progressions:new Map,positions:null};return(this.perPage<2?[this.pub.readingOrder.items[this.currentSlide]]:this.spreader.currentSpread(this.currentSlide,this.perPage)).forEach(n=>{e.readingOrder.push(n.href),e.progressions.set(n.href,{start:0,end:1})}),e.positions=this.getCurrentNumbers(),e}getCurrentNumbers(){if(this.perPage<2)return[this.pub.readingOrder.items[this.currentSlide].properties?.otherProperties.number];const e=this.spreader.currentSpread(this.currentSlide,this.perPage);return e.length>1?[e[0].properties?.otherProperties.number,e[e.length-1].properties?.otherProperties.number]:[e[0].properties?.otherProperties.number]}deselect(){this.currentFrames?.forEach(e=>e?.deselect())}}class ke{constructor(e={}){this.backgroundColor=I(e.backgroundColor),this.blendFilter=R(e.blendFilter),this.constraint=v(e.constraint),this.columnCount=v(e.columnCount),this.darkenFilter=he(e.darkenFilter),this.deprecatedFontSize=R(e.deprecatedFontSize),this.fontFamily=I(e.fontFamily),this.fontSize=T(e.fontSize,Ue.range),this.fontSizeNormalize=R(e.fontSizeNormalize),this.fontOpticalSizing=R(e.fontOpticalSizing),this.fontWeight=T(e.fontWeight,ee.range),this.fontWidth=T(e.fontWidth,Te.range),this.hyphens=R(e.hyphens),this.invertFilter=he(e.invertFilter),this.invertGaijiFilter=he(e.invertGaijiFilter),this.iOSPatch=R(e.iOSPatch),this.iPadOSPatch=R(e.iPadOSPatch),this.letterSpacing=v(e.letterSpacing),this.ligatures=R(e.ligatures),this.lineHeight=v(e.lineHeight),this.linkColor=I(e.linkColor),this.noRuby=R(e.noRuby),this.pageGutter=v(e.pageGutter),this.paragraphIndent=v(e.paragraphIndent),this.paragraphSpacing=v(e.paragraphSpacing),this.scroll=R(e.scroll),this.scrollPaddingTop=v(e.scrollPaddingTop),this.scrollPaddingBottom=v(e.scrollPaddingBottom),this.scrollPaddingLeft=v(e.scrollPaddingLeft),this.scrollPaddingRight=v(e.scrollPaddingRight),this.selectionBackgroundColor=I(e.selectionBackgroundColor),this.selectionTextColor=I(e.selectionTextColor),this.textAlign=Ve(e.textAlign,J),this.textColor=I(e.textColor),this.textNormalization=R(e.textNormalization),this.visitedColor=I(e.visitedColor),this.wordSpacing=v(e.wordSpacing),this.optimalLineLength=v(e.optimalLineLength),this.maximalLineLength=v(e.maximalLineLength),this.minimalLineLength=v(e.minimalLineLength)}static serialize(e){const{...t}=e;return JSON.stringify(t)}static deserialize(e){try{const t=JSON.parse(e);return new ke(t)}catch(t){return console.error("Failed to deserialize preferences:",t),null}}merging(e){const t={...this};for(const n of Object.keys(e))e[n]!==void 0&&(n!=="maximalLineLength"||e[n]===null||e[n]>=(e.optimalLineLength??t.optimalLineLength??65))&&(n!=="minimalLineLength"||e[n]===null||e[n]<=(e.optimalLineLength??t.optimalLineLength??65))&&(t[n]=e[n]);return new ke(t)}}class ji{constructor(e){this.backgroundColor=I(e.backgroundColor)||null,this.blendFilter=R(e.blendFilter)??!1,this.constraint=v(e.constraint)||0,this.columnCount=v(e.columnCount)||null,this.darkenFilter=he(e.darkenFilter)??!1,this.deprecatedFontSize=R(e.deprecatedFontSize),(this.deprecatedFontSize===!1||this.deprecatedFontSize===null)&&(this.deprecatedFontSize=!CSS.supports("zoom","1")),this.fontFamily=I(e.fontFamily)||null,this.fontSize=T(e.fontSize,Ue.range)||1,this.fontSizeNormalize=R(e.fontSizeNormalize)??!1,this.fontOpticalSizing=R(e.fontOpticalSizing)??null,this.fontWeight=T(e.fontWeight,ee.range)||null,this.fontWidth=T(e.fontWidth,Te.range)||null,this.hyphens=R(e.hyphens)??null,this.invertFilter=he(e.invertFilter)??!1,this.invertGaijiFilter=he(e.invertGaijiFilter)??!1,this.iOSPatch=e.iOSPatch===!1?!1:(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile",this.iPadOSPatch=e.iPadOSPatch===!1?!1:L.OS.iPadOS&&L.iOSRequest==="desktop",this.letterSpacing=v(e.letterSpacing)||null,this.ligatures=R(e.ligatures)??null,this.lineHeight=v(e.lineHeight)||null,this.linkColor=I(e.linkColor)||null,this.noRuby=R(e.noRuby)??!1,this.pageGutter=mt(v(e.pageGutter),20),this.paragraphIndent=v(e.paragraphIndent)??null,this.paragraphSpacing=v(e.paragraphSpacing)??null,this.scroll=R(e.scroll)??!1,this.scrollPaddingTop=v(e.scrollPaddingTop)??null,this.scrollPaddingBottom=v(e.scrollPaddingBottom)??null,this.scrollPaddingLeft=v(e.scrollPaddingLeft)??null,this.scrollPaddingRight=v(e.scrollPaddingRight)??null,this.selectionBackgroundColor=I(e.selectionBackgroundColor)||null,this.selectionTextColor=I(e.selectionTextColor)||null,this.textAlign=Ve(e.textAlign,J)||null,this.textColor=I(e.textColor)||null,this.textNormalization=R(e.textNormalization)??!1,this.visitedColor=I(e.visitedColor)||null,this.wordSpacing=v(e.wordSpacing)||null,this.optimalLineLength=v(e.optimalLineLength)||65,this.maximalLineLength=mt(_i(e.maximalLineLength,this.optimalLineLength),80),this.minimalLineLength=mt(yi(e.minimalLineLength,this.optimalLineLength),40),this.experiments=qt(e.experiments)||null}}const Ee={backgroundColor:"#FFFFFF",textColor:"#121212",linkColor:"#0000EE",visitedColor:"#551A8B",selectionBackgroundColor:"#b4d8fe",selectionTextColor:"inherit"};class sn{constructor(e,t,n){this.preferences=e,this.settings=t,this.metadata=n,this.layout=this.metadata?.effectiveLayout||S.reflowable}clear(){this.preferences=new ke({optimalLineLength:65})}updatePreference(e,t){this.preferences[e]=t}get backgroundColor(){return new U({initialValue:this.preferences.backgroundColor,effectiveValue:this.settings.backgroundColor||Ee.backgroundColor,isEffective:this.preferences.backgroundColor!==null,onChange:e=>{this.updatePreference("backgroundColor",e??null)}})}get blendFilter(){return new O({initialValue:this.preferences.blendFilter,effectiveValue:this.settings.blendFilter||!1,isEffective:this.preferences.blendFilter!==null,onChange:e=>{this.updatePreference("blendFilter",e??null)}})}get columnCount(){return new U({initialValue:this.preferences.columnCount,effectiveValue:this.settings.columnCount||null,isEffective:this.layout!==S.fixed&&!this.settings.scroll,onChange:e=>{this.updatePreference("columnCount",e??null)}})}get constraint(){return new U({initialValue:this.preferences.constraint,effectiveValue:this.preferences.constraint||0,isEffective:!0,onChange:e=>{this.updatePreference("constraint",e??null)}})}get darkenFilter(){return new k({initialValue:typeof this.preferences.darkenFilter=="boolean"?100:this.preferences.darkenFilter,effectiveValue:typeof this.settings.darkenFilter=="boolean"?100:this.settings.darkenFilter||0,isEffective:this.settings.darkenFilter!==null,onChange:e=>{this.updatePreference("darkenFilter",e??null)},supportedRange:le.range,step:le.step})}get deprecatedFontSize(){return new O({initialValue:this.preferences.deprecatedFontSize,effectiveValue:CSS.supports("zoom","1")?this.settings.deprecatedFontSize||!1:!0,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("deprecatedFontSize",e??null)}})}get fontFamily(){return new U({initialValue:this.preferences.fontFamily,effectiveValue:this.settings.fontFamily||null,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("fontFamily",e??null)}})}get fontSize(){return new k({initialValue:this.preferences.fontSize,effectiveValue:this.settings.fontSize||1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("fontSize",e??null)},supportedRange:Ue.range,step:Ue.step})}get fontSizeNormalize(){return new O({initialValue:this.preferences.fontSizeNormalize,effectiveValue:this.settings.fontSizeNormalize||!1,isEffective:this.layout!==S.fixed&&this.preferences.fontSizeNormalize!==null,onChange:e=>{this.updatePreference("fontSizeNormalize",e??null)}})}get fontOpticalSizing(){return new O({initialValue:this.preferences.fontOpticalSizing,effectiveValue:this.settings.fontOpticalSizing||!0,isEffective:this.layout!==S.fixed&&this.preferences.fontOpticalSizing!==null,onChange:e=>{this.updatePreference("fontOpticalSizing",e??null)}})}get fontWeight(){return new k({initialValue:this.preferences.fontWeight,effectiveValue:this.settings.fontWeight||400,isEffective:this.layout!==S.fixed&&this.preferences.fontWeight!==null,onChange:e=>{this.updatePreference("fontWeight",e??null)},supportedRange:ee.range,step:ee.step})}get fontWidth(){return new k({initialValue:this.preferences.fontWidth,effectiveValue:this.settings.fontWidth||100,isEffective:this.layout!==S.fixed&&this.preferences.fontWidth!==null,onChange:e=>{this.updatePreference("fontWidth",e??null)},supportedRange:Te.range,step:Te.step})}get hyphens(){return new O({initialValue:this.preferences.hyphens,effectiveValue:this.settings.hyphens||!1,isEffective:this.layout!==S.fixed&&this.metadata?.effectiveReadingProgression===M.ltr&&this.preferences.hyphens!==null,onChange:e=>{this.updatePreference("hyphens",e??null)}})}get invertFilter(){return new k({initialValue:typeof this.preferences.invertFilter=="boolean"?100:this.preferences.invertFilter,effectiveValue:typeof this.settings.invertFilter=="boolean"?100:this.settings.invertFilter||0,isEffective:this.settings.invertFilter!==null,onChange:e=>{this.updatePreference("invertFilter",e??null)},supportedRange:le.range,step:le.step})}get invertGaijiFilter(){return new k({initialValue:typeof this.preferences.invertGaijiFilter=="boolean"?100:this.preferences.invertGaijiFilter,effectiveValue:typeof this.settings.invertGaijiFilter=="boolean"?100:this.settings.invertGaijiFilter||0,isEffective:this.preferences.invertGaijiFilter!==null,onChange:e=>{this.updatePreference("invertGaijiFilter",e??null)},supportedRange:le.range,step:le.step})}get iOSPatch(){return new O({initialValue:this.preferences.iOSPatch,effectiveValue:this.settings.iOSPatch||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("iOSPatch",e??null)}})}get iPadOSPatch(){return new O({initialValue:this.preferences.iPadOSPatch,effectiveValue:this.settings.iPadOSPatch||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("iPadOSPatch",e??null)}})}get letterSpacing(){return new k({initialValue:this.preferences.letterSpacing,effectiveValue:this.settings.letterSpacing||0,isEffective:this.layout!==S.fixed&&this.preferences.letterSpacing!==null,onChange:e=>{this.updatePreference("letterSpacing",e??null)},supportedRange:Ne.range,step:Ne.step})}get ligatures(){return new O({initialValue:this.preferences.ligatures,effectiveValue:this.settings.ligatures||!0,isEffective:(()=>{if(this.preferences.ligatures===null||this.layout===S.fixed)return!1;const e=this.metadata?.languages?.[0]?.toLowerCase();return!(e&&["zh","ja","ko","mn-mong"].some(t=>e.startsWith(t)))})(),onChange:e=>{this.updatePreference("ligatures",e??null)}})}get lineHeight(){return new k({initialValue:this.preferences.lineHeight,effectiveValue:this.settings.lineHeight,isEffective:this.layout!==S.fixed&&this.preferences.lineHeight!==null,onChange:e=>{this.updatePreference("lineHeight",e??null)},supportedRange:Me.range,step:Me.step})}get linkColor(){return new U({initialValue:this.preferences.linkColor,effectiveValue:this.settings.linkColor||Ee.linkColor,isEffective:this.layout!==S.fixed&&this.preferences.linkColor!==null,onChange:e=>{this.updatePreference("linkColor",e??null)}})}get maximalLineLength(){return new k({initialValue:this.preferences.maximalLineLength,effectiveValue:this.settings.maximalLineLength,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("maximalLineLength",e)},supportedRange:ce.range,step:ce.step})}get minimalLineLength(){return new k({initialValue:this.preferences.minimalLineLength,effectiveValue:this.settings.minimalLineLength,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("minimalLineLength",e)},supportedRange:ce.range,step:ce.step})}get noRuby(){return new O({initialValue:this.preferences.noRuby,effectiveValue:this.settings.noRuby||!1,isEffective:this.layout!==S.fixed&&this.metadata?.languages?.includes("ja")||!1,onChange:e=>{this.updatePreference("noRuby",e??null)}})}get optimalLineLength(){return new k({initialValue:this.preferences.optimalLineLength,effectiveValue:this.settings.optimalLineLength,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("optimalLineLength",e)},supportedRange:ce.range,step:ce.step})}get pageGutter(){return new U({initialValue:this.preferences.pageGutter,effectiveValue:this.settings.pageGutter,isEffective:this.layout!==S.fixed&&!this.settings.scroll,onChange:e=>{this.updatePreference("pageGutter",e??null)}})}get paragraphIndent(){return new k({initialValue:this.preferences.paragraphIndent,effectiveValue:this.settings.paragraphIndent||0,isEffective:this.layout!==S.fixed&&this.preferences.paragraphIndent!==null,onChange:e=>{this.updatePreference("paragraphIndent",e??null)},supportedRange:Ie.range,step:Ie.step})}get paragraphSpacing(){return new k({initialValue:this.preferences.paragraphSpacing,effectiveValue:this.settings.paragraphSpacing||0,isEffective:this.layout!==S.fixed&&this.preferences.paragraphSpacing!==null,onChange:e=>{this.updatePreference("paragraphSpacing",e??null)},supportedRange:He.range,step:He.step})}get scroll(){return new O({initialValue:this.preferences.scroll,effectiveValue:this.settings.scroll||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("scroll",e??null)}})}get scrollPaddingTop(){return new U({initialValue:this.preferences.scrollPaddingTop,effectiveValue:this.settings.scrollPaddingTop||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingTop!==null,onChange:e=>{this.updatePreference("scrollPaddingTop",e??null)}})}get scrollPaddingBottom(){return new U({initialValue:this.preferences.scrollPaddingBottom,effectiveValue:this.settings.scrollPaddingBottom||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingBottom!==null,onChange:e=>{this.updatePreference("scrollPaddingBottom",e??null)}})}get scrollPaddingLeft(){return new U({initialValue:this.preferences.scrollPaddingLeft,effectiveValue:this.settings.scrollPaddingLeft||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingLeft!==null,onChange:e=>{this.updatePreference("scrollPaddingLeft",e??null)}})}get scrollPaddingRight(){return new U({initialValue:this.preferences.scrollPaddingRight,effectiveValue:this.settings.scrollPaddingRight||0,isEffective:this.layout!==S.fixed&&!!this.settings.scroll&&this.preferences.scrollPaddingRight!==null,onChange:e=>{this.updatePreference("scrollPaddingRight",e??null)}})}get selectionBackgroundColor(){return new U({initialValue:this.preferences.selectionBackgroundColor,effectiveValue:this.settings.selectionBackgroundColor||Ee.selectionBackgroundColor,isEffective:this.layout!==S.fixed&&this.preferences.selectionBackgroundColor!==null,onChange:e=>{this.updatePreference("selectionBackgroundColor",e??null)}})}get selectionTextColor(){return new U({initialValue:this.preferences.selectionTextColor,effectiveValue:this.settings.selectionTextColor||Ee.selectionTextColor,isEffective:this.layout!==S.fixed&&this.preferences.selectionTextColor!==null,onChange:e=>{this.updatePreference("selectionTextColor",e??null)}})}get textAlign(){return new Zt({initialValue:this.preferences.textAlign,effectiveValue:this.settings.textAlign||J.start,isEffective:this.layout!==S.fixed&&this.preferences.textAlign!==null,onChange:e=>{this.updatePreference("textAlign",e??null)},supportedValues:Object.values(J)})}get textColor(){return new U({initialValue:this.preferences.textColor,effectiveValue:this.settings.textColor||Ee.textColor,isEffective:this.layout!==S.fixed&&this.preferences.textColor!==null,onChange:e=>{this.updatePreference("textColor",e??null)}})}get textNormalization(){return new O({initialValue:this.preferences.textNormalization,effectiveValue:this.settings.textNormalization||!1,isEffective:this.layout!==S.fixed,onChange:e=>{this.updatePreference("textNormalization",e??null)}})}get visitedColor(){return new U({initialValue:this.preferences.visitedColor,effectiveValue:this.settings.visitedColor||Ee.visitedColor,isEffective:this.layout!==S.fixed&&this.preferences.visitedColor!==null,onChange:e=>{this.updatePreference("visitedColor",e??null)}})}get wordSpacing(){return new k({initialValue:this.preferences.wordSpacing,effectiveValue:this.settings.wordSpacing||0,isEffective:this.layout!==S.fixed&&this.preferences.wordSpacing!==null,onChange:e=>{this.updatePreference("wordSpacing",e??null)},supportedRange:De.range,step:De.step})}}class ln{constructor(e,t){this.backgroundColor=e.backgroundColor||t.backgroundColor||null,this.blendFilter=typeof e.blendFilter=="boolean"?e.blendFilter:t.blendFilter??null,this.columnCount=e.columnCount!==void 0?e.columnCount:t.columnCount!==void 0?t.columnCount:null,this.constraint=e.constraint||t.constraint,this.darkenFilter=typeof e.darkenFilter=="boolean"?e.darkenFilter:t.darkenFilter??null,this.deprecatedFontSize=typeof e.deprecatedFontSize=="boolean"?e.deprecatedFontSize:t.deprecatedFontSize??null,this.fontFamily=e.fontFamily||t.fontFamily||null,this.fontSize=e.fontSize!==void 0?e.fontSize:t.fontSize!==void 0?t.fontSize:null,this.fontSizeNormalize=typeof e.fontSizeNormalize=="boolean"?e.fontSizeNormalize:t.fontSizeNormalize??null,this.fontOpticalSizing=typeof e.fontOpticalSizing=="boolean"?e.fontOpticalSizing:t.fontOpticalSizing??null,this.fontWeight=e.fontWeight!==void 0?e.fontWeight:t.fontWeight!==void 0?t.fontWeight:null,this.fontWidth=e.fontWidth!==void 0?e.fontWidth:t.fontWidth!==void 0?t.fontWidth:null,this.hyphens=typeof e.hyphens=="boolean"?e.hyphens:t.hyphens??null,this.invertFilter=typeof e.invertFilter=="boolean"?e.invertFilter:t.invertFilter??null,this.invertGaijiFilter=typeof e.invertGaijiFilter=="boolean"?e.invertGaijiFilter:t.invertGaijiFilter??null,this.iOSPatch=this.deprecatedFontSize||e.iOSPatch===!1?!1:e.iOSPatch===!0?(L.OS.iOS||L.OS.iPadOS)&&L.iOSRequest==="mobile":t.iOSPatch,this.iPadOSPatch=this.deprecatedFontSize||e.iPadOSPatch===!1?!1:e.iPadOSPatch===!0?L.OS.iPadOS&&L.iOSRequest==="desktop":t.iPadOSPatch,this.letterSpacing=e.letterSpacing!==void 0?e.letterSpacing:t.letterSpacing!==void 0?t.letterSpacing:null,this.ligatures=typeof e.ligatures=="boolean"?e.ligatures:t.ligatures??null,this.lineHeight=e.lineHeight!==void 0?e.lineHeight:t.lineHeight!==void 0?t.lineHeight:null,this.linkColor=e.linkColor||t.linkColor||null,this.maximalLineLength=e.maximalLineLength===null?null:e.maximalLineLength||t.maximalLineLength||null,this.minimalLineLength=e.minimalLineLength===null?null:e.minimalLineLength||t.minimalLineLength||null,this.noRuby=typeof e.noRuby=="boolean"?e.noRuby:t.noRuby??null,this.optimalLineLength=e.optimalLineLength||t.optimalLineLength,this.pageGutter=e.pageGutter!==void 0?e.pageGutter:t.pageGutter!==void 0?t.pageGutter:null,this.paragraphIndent=e.paragraphIndent!==void 0?e.paragraphIndent:t.paragraphIndent!==void 0?t.paragraphIndent:null,this.paragraphSpacing=e.paragraphSpacing!==void 0?e.paragraphSpacing:t.paragraphSpacing!==void 0?t.paragraphSpacing:null,this.scroll=typeof e.scroll=="boolean"?e.scroll:t.scroll??null,this.scrollPaddingTop=e.scrollPaddingTop!==void 0?e.scrollPaddingTop:t.scrollPaddingTop!==void 0?t.scrollPaddingTop:null,this.scrollPaddingBottom=e.scrollPaddingBottom!==void 0?e.scrollPaddingBottom:t.scrollPaddingBottom!==void 0?t.scrollPaddingBottom:null,this.scrollPaddingLeft=e.scrollPaddingLeft!==void 0?e.scrollPaddingLeft:t.scrollPaddingLeft!==void 0?t.scrollPaddingLeft:null,this.scrollPaddingRight=e.scrollPaddingRight!==void 0?e.scrollPaddingRight:t.scrollPaddingRight!==void 0?t.scrollPaddingRight:null,this.selectionBackgroundColor=e.selectionBackgroundColor||t.selectionBackgroundColor||null,this.selectionTextColor=e.selectionTextColor||t.selectionTextColor||null,this.textAlign=e.textAlign||t.textAlign||null,this.textColor=e.textColor||t.textColor||null,this.textNormalization=typeof e.textNormalization=="boolean"?e.textNormalization:t.textNormalization??null,this.visitedColor=e.visitedColor||t.visitedColor||null,this.wordSpacing=e.wordSpacing!==void 0?e.wordSpacing:t.wordSpacing!==void 0?t.wordSpacing:null,this.experiments=t.experiments||null}}function Ke(r){const e=getComputedStyle(r),t=parseFloat(e.paddingLeft||"0"),n=parseFloat(e.paddingRight||"0");return r.clientWidth-t-n}function zr(r){const e=getComputedStyle(r),t=parseFloat(e.paddingTop||"0"),n=parseFloat(e.paddingBottom||"0");return r.clientHeight-t-n}class cn extends Ge{constructor(e){super(),this.a11yNormalize=e.a11yNormalize??null,this.backgroundColor=e.backgroundColor??null,this.blendFilter=e.blendFilter??null,this.bodyHyphens=e.bodyHyphens??null,this.colCount=e.colCount??null,this.darkenFilter=e.darkenFilter??null,this.deprecatedFontSize=e.deprecatedFontSize??null,this.fontFamily=e.fontFamily??null,this.fontOpticalSizing=e.fontOpticalSizing??null,this.fontSize=e.fontSize??null,this.fontSizeNormalize=e.fontSizeNormalize??null,this.fontWeight=e.fontWeight??null,this.fontWidth=e.fontWidth??null,this.invertFilter=e.invertFilter??null,this.invertGaijiFilter=e.invertGaijiFilter??null,this.iOSPatch=e.iOSPatch??null,this.iPadOSPatch=e.iPadOSPatch??null,this.letterSpacing=e.letterSpacing??null,this.ligatures=e.ligatures??null,this.lineHeight=e.lineHeight??null,this.lineLength=e.lineLength??null,this.linkColor=e.linkColor??null,this.noRuby=e.noRuby??null,this.paraIndent=e.paraIndent??null,this.paraSpacing=e.paraSpacing??null,this.selectionBackgroundColor=e.selectionBackgroundColor??null,this.selectionTextColor=e.selectionTextColor??null,this.textAlign=e.textAlign??null,this.textColor=e.textColor??null,this.view=e.view??null,this.visitedColor=e.visitedColor??null,this.wordSpacing=e.wordSpacing??null}toCSSProperties(){const e={};return this.a11yNormalize&&(e["--USER__a11yNormalize"]=this.toFlag("a11y")),this.backgroundColor&&(e["--USER__backgroundColor"]=this.backgroundColor),this.blendFilter&&(e["--USER__blendFilter"]=this.toFlag("blend")),this.bodyHyphens&&(e["--USER__bodyHyphens"]=this.bodyHyphens),this.colCount&&(e["--USER__colCount"]=this.toUnitless(this.colCount)),this.darkenFilter===!0?e["--USER__darkenFilter"]=this.toFlag("darken"):typeof this.darkenFilter=="number"&&(e["--USER__darkenFilter"]=this.toPercentage(this.darkenFilter)),this.deprecatedFontSize&&(e["--USER__fontSizeImplementation"]=this.toFlag("deprecatedFontSize")),this.fontFamily&&(e["--USER__fontFamily"]=this.fontFamily),this.fontOpticalSizing!=null&&(e["--USER__fontOpticalSizing"]=this.fontOpticalSizing),this.fontSize!=null&&(e["--USER__fontSize"]=this.toPercentage(this.fontSize,!0)),this.fontSizeNormalize&&(e["--USER__fontSizeNormalize"]=this.toFlag("normalize")),this.fontWeight!=null&&(e["--USER__fontWeight"]=this.toUnitless(this.fontWeight)),this.fontWidth!=null&&(e["--USER__fontWidth"]=typeof this.fontWidth=="string"?this.fontWidth:this.toUnitless(this.fontWidth)),this.invertFilter===!0?e["--USER__invertFilter"]=this.toFlag("invert"):typeof this.invertFilter=="number"&&(e["--USER__invertFilter"]=this.toPercentage(this.invertFilter)),this.invertGaijiFilter===!0?e["--USER__invertGaiji"]=this.toFlag("invertGaiji"):typeof this.invertGaijiFilter=="number"&&(e["--USER__invertGaiji"]=this.toPercentage(this.invertGaijiFilter)),this.iOSPatch&&(e["--USER__iOSPatch"]=this.toFlag("iOSPatch")),this.iPadOSPatch&&(e["--USER__iPadOSPatch"]=this.toFlag("iPadOSPatch")),this.letterSpacing!=null&&(e["--USER__letterSpacing"]=this.toRem(this.letterSpacing)),this.ligatures&&(e["--USER__ligatures"]=this.ligatures),this.lineHeight!=null&&(e["--USER__lineHeight"]=this.toUnitless(this.lineHeight)),this.lineLength!=null&&(e["--USER__lineLength"]=this.toPx(this.lineLength)),this.linkColor&&(e["--USER__linkColor"]=this.linkColor),this.noRuby&&(e["--USER__noRuby"]=this.toFlag("noRuby")),this.paraIndent!=null&&(e["--USER__paraIndent"]=this.toRem(this.paraIndent)),this.paraSpacing!=null&&(e["--USER__paraSpacing"]=this.toRem(this.paraSpacing)),this.selectionBackgroundColor&&(e["--USER__selectionBackgroundColor"]=this.selectionBackgroundColor),this.selectionTextColor&&(e["--USER__selectionTextColor"]=this.selectionTextColor),this.textAlign&&(e["--USER__textAlign"]=this.textAlign),this.textColor&&(e["--USER__textColor"]=this.textColor),this.view&&(e["--USER__view"]=this.toFlag(this.view)),this.visitedColor&&(e["--USER__visitedColor"]=this.visitedColor),this.wordSpacing!=null&&(e["--USER__wordSpacing"]=this.toRem(this.wordSpacing)),e}}class Gi extends Ge{constructor(e){super(),this.backgroundColor=e.backgroundColor??null,this.baseFontFamily=e.baseFontFamily??null,this.baseFontSize=e.baseFontSize??null,this.baseLineHeight=e.baseLineHeight??null,this.boxSizingMedia=e.boxSizingMedia??null,this.boxSizingTable=e.boxSizingTable??null,this.colWidth=e.colWidth??null,this.colCount=e.colCount??null,this.colGap=e.colGap??null,this.codeFontFamily=e.codeFontFamily??null,this.compFontFamily=e.compFontFamily??null,this.defaultLineLength=e.defaultLineLength??null,this.flowSpacing=e.flowSpacing??null,this.humanistTf=e.humanistTf??null,this.linkColor=e.linkColor??null,this.maxMediaWidth=e.maxMediaWidth??null,this.maxMediaHeight=e.maxMediaHeight??null,this.modernTf=e.modernTf??null,this.monospaceTf=e.monospaceTf??null,this.noOverflow=e.noOverflow??null,this.noVerticalPagination=e.noVerticalPagination??null,this.oldStyleTf=e.oldStyleTf??null,this.pageGutter=e.pageGutter??null,this.paraIndent=e.paraIndent??null,this.paraSpacing=e.paraSpacing??null,this.primaryColor=e.primaryColor??null,this.scrollPaddingBottom=e.scrollPaddingBottom??null,this.scrollPaddingLeft=e.scrollPaddingLeft??null,this.scrollPaddingRight=e.scrollPaddingRight??null,this.scrollPaddingTop=e.scrollPaddingTop??null,this.sansSerifJa=e.sansSerifJa??null,this.sansSerifJaV=e.sansSerifJaV??null,this.sansTf=e.sansTf??null,this.secondaryColor=e.secondaryColor??null,this.selectionBackgroundColor=e.selectionBackgroundColor??null,this.selectionTextColor=e.selectionTextColor??null,this.serifJa=e.serifJa??null,this.serifJaV=e.serifJaV??null,this.textColor=e.textColor??null,this.typeScale=e.typeScale??null,this.visitedColor=e.visitedColor??null,this.experiments=e.experiments??null}toCSSProperties(){const e={};return this.backgroundColor&&(e["--RS__backgroundColor"]=this.backgroundColor),this.baseFontFamily&&(e["--RS__baseFontFamily"]=this.baseFontFamily),this.baseFontSize!=null&&(e["--RS__baseFontSize"]=this.toRem(this.baseFontSize)),this.baseLineHeight!=null&&(e["--RS__baseLineHeight"]=this.toUnitless(this.baseLineHeight)),this.boxSizingMedia&&(e["--RS__boxSizingMedia"]=this.boxSizingMedia),this.boxSizingTable&&(e["--RS__boxSizingTable"]=this.boxSizingTable),this.colWidth!=null&&(e["--RS__colWidth"]=this.colWidth),this.colCount!=null&&(e["--RS__colCount"]=this.toUnitless(this.colCount)),this.colGap!=null&&(e["--RS__colGap"]=this.toPx(this.colGap)),this.codeFontFamily&&(e["--RS__codeFontFamily"]=this.codeFontFamily),this.compFontFamily&&(e["--RS__compFontFamily"]=this.compFontFamily),this.defaultLineLength!=null&&(e["--RS__defaultLineLength"]=this.toPx(this.defaultLineLength)),this.flowSpacing!=null&&(e["--RS__flowSpacing"]=this.toRem(this.flowSpacing)),this.humanistTf&&(e["--RS__humanistTf"]=this.humanistTf),this.linkColor&&(e["--RS__linkColor"]=this.linkColor),this.maxMediaWidth&&(e["--RS__maxMediaWidth"]=this.toVw(this.maxMediaWidth)),this.maxMediaHeight&&(e["--RS__maxMediaHeight"]=this.toVh(this.maxMediaHeight)),this.modernTf&&(e["--RS__modernTf"]=this.modernTf),this.monospaceTf&&(e["--RS__monospaceTf"]=this.monospaceTf),this.noOverflow&&(e["--RS__disableOverflow"]=this.toFlag("noOverflow")),this.noVerticalPagination&&(e["--RS__disablePagination"]=this.toFlag("noVerticalPagination")),this.oldStyleTf&&(e["--RS__oldStyleTf"]=this.oldStyleTf),this.pageGutter!=null&&(e["--RS__pageGutter"]=this.toPx(this.pageGutter)),this.paraIndent!=null&&(e["--RS__paraIndent"]=this.toRem(this.paraIndent)),this.paraSpacing!=null&&(e["--RS__paraSpacing"]=this.toRem(this.paraSpacing)),this.primaryColor&&(e["--RS__primaryColor"]=this.primaryColor),this.sansSerifJa&&(e["--RS__sans-serif-ja"]=this.sansSerifJa),this.sansSerifJaV&&(e["--RS__sans-serif-ja-v"]=this.sansSerifJaV),this.sansTf&&(e["--RS__sansTf"]=this.sansTf),this.scrollPaddingBottom!=null&&(e["--RS__scrollPaddingBottom"]=this.toPx(this.scrollPaddingBottom)),this.scrollPaddingLeft!=null&&(e["--RS__scrollPaddingLeft"]=this.toPx(this.scrollPaddingLeft)),this.scrollPaddingRight!=null&&(e["--RS__scrollPaddingRight"]=this.toPx(this.scrollPaddingRight)),this.scrollPaddingTop!=null&&(e["--RS__scrollPaddingTop"]=this.toPx(this.scrollPaddingTop)),this.secondaryColor&&(e["--RS__secondaryColor"]=this.secondaryColor),this.selectionBackgroundColor&&(e["--RS__selectionBackgroundColor"]=this.selectionBackgroundColor),this.selectionTextColor&&(e["--RS__selectionTextColor"]=this.selectionTextColor),this.serifJa&&(e["--RS__serif-ja"]=this.serifJa),this.serifJaV&&(e["--RS__serif-ja-v"]=this.serifJaV),this.textColor&&(e["--RS__textColor"]=this.textColor),this.typeScale&&(e["--RS__typeScale"]=this.toUnitless(this.typeScale)),this.visitedColor&&(e["--RS__visitedColor"]=this.visitedColor),this.experiments&&this.experiments.forEach(t=>{e["--RS__"+t]=ut[t].value}),e}}class Vi{constructor(e){this.rsProperties=e.rsProperties,this.userProperties=e.userProperties,this.lineLengths=e.lineLengths,this.container=e.container,this.containerParent=e.container.parentElement||document.documentElement,this.constraint=e.constraint,this.isCJKVertical=e.isCJKVertical??!1,this.cachedColCount=e.userProperties.colCount,this.effectiveContainerWidth=Ke(this.containerParent)}update(e){this.cachedColCount=e.columnCount,e.constraint!==this.constraint&&(this.constraint=e.constraint),e.pageGutter!==this.rsProperties.pageGutter&&(this.rsProperties.pageGutter=e.pageGutter),e.scrollPaddingBottom!==this.rsProperties.scrollPaddingBottom&&(this.rsProperties.scrollPaddingBottom=e.scrollPaddingBottom),e.scrollPaddingLeft!==this.rsProperties.scrollPaddingLeft&&(this.rsProperties.scrollPaddingLeft=e.scrollPaddingLeft),e.scrollPaddingRight!==this.rsProperties.scrollPaddingRight&&(this.rsProperties.scrollPaddingRight=e.scrollPaddingRight),e.scrollPaddingTop!==this.rsProperties.scrollPaddingTop&&(this.rsProperties.scrollPaddingTop=e.scrollPaddingTop),e.experiments!==this.rsProperties.experiments&&(this.rsProperties.experiments=e.experiments),this.lineLengths.update({fontFace:e.fontFamily,letterSpacing:e.letterSpacing,padding:e.scroll?(e.scrollPaddingLeft||0)+(e.scrollPaddingRight||0):(e.pageGutter||0)*2,wordSpacing:e.wordSpacing,optimalChars:e.optimalLineLength,minChars:e.minimalLineLength,maxChars:e.maximalLineLength});const t=this.updateLayout(e.fontSize,e.deprecatedFontSize||e.iOSPatch,e.scroll,e.columnCount);t?.effectiveContainerWidth&&(this.effectiveContainerWidth=t?.effectiveContainerWidth);const n={a11yNormalize:e.textNormalization,backgroundColor:e.backgroundColor,blendFilter:e.blendFilter,bodyHyphens:typeof e.hyphens!="boolean"?null:e.hyphens?"auto":"none",colCount:t?.colCount,darkenFilter:e.darkenFilter,deprecatedFontSize:e.deprecatedFontSize,fontFamily:e.fontFamily,fontOpticalSizing:typeof e.fontOpticalSizing!="boolean"?null:e.fontOpticalSizing?"auto":"none",fontSize:e.fontSize,fontSizeNormalize:e.fontSizeNormalize,fontWeight:e.fontWeight,fontWidth:e.fontWidth,invertFilter:e.invertFilter,invertGaijiFilter:e.invertGaijiFilter,iOSPatch:e.iOSPatch,iPadOSPatch:e.iPadOSPatch,letterSpacing:e.letterSpacing,ligatures:typeof e.ligatures!="boolean"?null:e.ligatures?"common-ligatures":"none",lineHeight:e.lineHeight,lineLength:t?.effectiveLineLength,linkColor:e.linkColor,noRuby:e.noRuby,paraIndent:e.paragraphIndent,paraSpacing:e.paragraphSpacing,selectionBackgroundColor:e.selectionBackgroundColor,selectionTextColor:e.selectionTextColor,textAlign:e.textAlign,textColor:e.textColor,view:typeof e.scroll!="boolean"?null:e.scroll?"scroll":"paged",visitedColor:e.visitedColor,wordSpacing:e.wordSpacing};this.userProperties=new cn(n)}updateLayout(e,t,n,i){return this.isCJKVertical?this.computeCJKVerticalLength(e,t):n??this.userProperties.view==="scroll"?this.computeScrollLength(e,t):this.paginate(e,t,i)}getCompensatedMetrics(e,t){const n=e||this.userProperties.fontSize||1,i=n<1?1/n:t?n:1;return{zoomFactor:n,zoomCompensation:i,optimal:Math.round(this.lineLengths.optimalLineLength)*n,minimal:this.lineLengths.minimalLineLength!==null?Math.round(this.lineLengths.minimalLineLength*n):null,maximal:this.lineLengths.maximalLineLength!==null?Math.round(this.lineLengths.maximalLineLength*n):null}}paginate(e,t,n){const i=Math.round(Ke(this.containerParent)-this.constraint),o=this.getCompensatedMetrics(e,t),{zoomCompensation:a,optimal:s,minimal:l,maximal:c}=o,h=()=>i>=s&&c!==null?Math.min(Math.round(c*a),i):i;let u=1,m=i;if(n===void 0)return{colCount:void 0,effectiveContainerWidth:m,effectiveLineLength:Math.round(m/u*a)};if(n===null)if(i>=s&&c!==null){u=Math.floor(i/s);const f=Math.round(u*(c*a));m=Math.min(f,i)}else m=h();else if(n>1){const f=Math.round(n*(l!==null?l:s));if(i>=f)if(u=n,c===null)m=i;else{const d=Math.round(u*(c*a));m=Math.min(d,i)}else if(l!==null&&i<Math.round(n*l))if(u=Math.floor(i/l),u<=1)u=1,m=h();else{const d=Math.round(u*(s*a));m=Math.min(d,i)}else{u=n;const d=Math.round(u*(s*a));m=Math.min(d,i)}}else u=1,m=h();return{colCount:u,effectiveContainerWidth:m,effectiveLineLength:Math.round(m/u/(e&&e>=1?e:1)*a)}}computeCJKVerticalLength(e,t){const n=Math.round(Ke(this.containerParent)-this.constraint),i=Math.round(zr(this.containerParent)),o=this.getCompensatedMetrics(e,t),a=o.maximal!==null?Math.min(Math.round(o.maximal*o.zoomCompensation),i):i;return{colCount:void 0,effectiveContainerWidth:n,effectiveLineLength:a}}computeScrollLength(e,t){const n=Math.round(Ke(this.containerParent)-this.constraint),i=this.getCompensatedMetrics(e&&(e<1||t)?e:1,t),o=i.zoomCompensation,a=i.optimal,s=i.maximal;let l,c=n,h=Math.round(a*o);if(s===null)h=n;else{const u=Math.min(Math.round(s*o),n);h=t?u:Math.round(u*o)}return{colCount:l,effectiveContainerWidth:c,effectiveLineLength:h}}setContainerWidth(){this.container.style.width=`${this.effectiveContainerWidth}px`}resizeHandler(){const e=this.updateLayout(this.userProperties.fontSize,this.userProperties.deprecatedFontSize||this.userProperties.iOSPatch,this.userProperties.view==="scroll",this.cachedColCount);this.userProperties.colCount=e.colCount,this.userProperties.lineLength=e.effectiveLineLength,this.effectiveContainerWidth=e.effectiveContainerWidth,this.container.style.width=`${this.effectiveContainerWidth}px`}}const Lr=`// Note: we aren't blocking some of the events right now to try and be as nonintrusive as possible.
|
|
415
415
|
// For a more comprehensive implementation, see https://github.com/hackademix/noscript/blob/3a83c0e4a506f175e38b0342dad50cdca3eae836/src/content/syncFetchPolicy.js#L142
|
|
416
416
|
// The snippet of code at the beginning of this source is an attempt at defence against JS using persistent storage
|
|
417
417
|
(function() {
|
|
@@ -476,7 +476,7 @@ Overscroll: ${this.pan.overscrollX.toFixed(2)},${this.pan.overscrollY.toFixed(2)
|
|
|
476
476
|
window.addEventListener("DOMContentLoaded", window._readium_eventBlocker, true);
|
|
477
477
|
window.addEventListener("load", window._readium_eventBlocker, true);
|
|
478
478
|
})();
|
|
479
|
-
`;async function Or(r,e){const t=r.effectiveLayout===S.fixed,n=e.filter(s=>s.mediaType.isHTML).map(s=>s.href),i=n.length>0?n:[/\.xhtml$/,/\.html$/],o=[{id:"css-selector-generator",as:"script",target:"head",blob:new Blob([Pe(Ri)],{type:"text/javascript"})},{id:"execution-prevention",as:"script",target:"head",blob:new Blob([Pe(Lr)],{type:"text/javascript"}),condition:s=>!!(s.querySelector("script")||s.querySelector("body[onload]:not(body[onload=''])"))}],a=[{id:"onload-proxy",as:"script",target:"head",blob:new Blob([Pe(Pi)],{type:"text/javascript"}),condition:s=>!!(s.querySelector("script")||s.querySelector("body[onload]:not(body[onload=''])"))}];if(!t){const s=se(r);let l,c,h;switch(s){case"rtl":{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>Kr),Promise.resolve().then(()=>Xr),Promise.resolve().then(()=>Yr)]);l=u.default,c=m.default,h=f.default;break}case"cjk-horizontal":{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>qr),Promise.resolve().then(()=>Jr),Promise.resolve().then(()=>Zr)]);l=u.default,c=m.default,h=f.default;break}case"cjk-vertical":case"mongolian-vertical":{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>Qr),Promise.resolve().then(()=>ea),Promise.resolve().then(()=>ta)]);l=u.default,c=m.default,h=f.default;break}default:{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>na),Promise.resolve().then(()=>ia),Promise.resolve().then(()=>oa)]);l=u.default,c=m.default,h=f.default;break}}if(o.unshift({id:"readium-css-before",as:"link",target:"head",blob:new Blob([$e(l)],{type:"text/css"}),rel:"stylesheet"}),a.unshift({id:"readium-css-default",as:"link",target:"head",blob:new Blob([$e(c)],{type:"text/css"}),rel:"stylesheet",condition:u=>!(u.querySelector("link[rel='stylesheet']")||u.querySelector("style")||u.querySelector("[style]:not([style=''])"))},{id:"readium-css-after",as:"link",target:"head",blob:new Blob([$e(h)],{type:"text/css"}),rel:"stylesheet"}),(s==="cjk-horizontal"||s==="cjk-vertical")&&(r.description==="ebpaj-guide-1.0"||r.otherMetadata?.["ebpaj:guide-version"]!==void 0)){const{default:m}=await Promise.resolve().then(()=>ra);a.push({id:"readium-css-ebpaj",as:"link",target:"head",blob:new Blob([$e(m)],{type:"text/css"}),rel:"stylesheet"})}}return[{resources:i,prepend:o,append:a}]}const Ar=r=>({frameLoaded:r.frameLoaded||(()=>{}),positionChanged:r.positionChanged||(()=>{}),tap:r.tap||(()=>!1),click:r.click||(()=>!1),zoom:r.zoom||(()=>{}),miscPointer:r.miscPointer||(()=>{}),scroll:r.scroll||(()=>{}),customEvent:r.customEvent||(()=>{}),handleLocator:r.handleLocator||(()=>!1),textSelected:r.textSelected||(()=>{}),contentProtection:r.contentProtection||(()=>{}),contextMenu:r.contextMenu||(()=>{}),peripheral:r.peripheral||(()=>{})});class hn extends $t{constructor(e,t,n,i=[],o=void 0,a={preferences:{},defaults:{}}){super(),this._preferencesEditor=null,this._injector=null,this._navigatorProtector=null,this._keyboardPeripheralsManager=null,this._suspiciousActivityListener=null,this._keyboardPeripheralListener=null,this.reflowViewport={readingOrder:[],progressions:new Map,positions:null},this.pub=t,this.container=e,this.listeners=Ar(n),this.currentLocation=o,i.length&&(this.positions=i),this._preferences=new Ce(a.preferences),this._defaults=new ji(a.defaults),this._settings=new ln(this._preferences,this._defaults);const s=se(t.metadata),l=s==="cjk-horizontal",c=s==="cjk-vertical",u=c||s==="mongolian-vertical",m=l||c;this._css=new Vi({rsProperties:new Gi({noVerticalPagination:u||void 0}),userProperties:new cn({}),lineLengths:new we({optimalChars:this._settings.optimalLineLength,minChars:this._settings.minimalLineLength,maxChars:this._settings.maximalLineLength,padding:this._settings.scroll?(this._settings.scrollPaddingLeft||0)+(this._settings.scrollPaddingRight||0):(this._settings.pageGutter||0)*2,fontFace:this._settings.fontFamily,letterSpacing:this._settings.letterSpacing,wordSpacing:this._settings.wordSpacing,isCJK:m}),container:e,constraint:this._settings.constraint,isCJKVertical:u}),this._layout=hn.determineLayout(t,!!this._settings.scroll),this.currentProgression=t.metadata.effectiveReadingProgression,this._injectablesConfig=a.injectables||{rules:[],allowedDomains:[]},this._readiumRulesPromise=Or(t.metadata,t.readingOrder.items),this._contentProtection=a.contentProtection||{},this._keyboardPeripherals=this.mergeKeyboardPeripherals(this._contentProtection,a.keyboardPeripherals||[]),(this._contentProtection.disableContextMenu||this._contentProtection.checkAutomation||this._contentProtection.checkIFrameEmbedding||this._contentProtection.monitorDevTools||this._contentProtection.protectPrinting?.disable)&&(this._navigatorProtector=new nn(this._contentProtection),this._suspiciousActivityListener=f=>{const{type:d,...p}=f.detail;d==="context_menu"?this.listeners.contextMenu(p):this.listeners.contentProtection(d,p)},window.addEventListener(de,this._suspiciousActivityListener)),this._keyboardPeripherals.length>0&&(this._keyboardPeripheralsManager=new on({keyboardPeripherals:this._keyboardPeripherals}),this._keyboardPeripheralListener=f=>{const d=f.detail;this.listeners.peripheral(d)},window.addEventListener(ue,this._keyboardPeripheralListener)),this.resizeObserver=new ResizeObserver(()=>this.ownerWindow.requestAnimationFrame(async()=>await this.resizeHandler())),this.resizeObserver.observe(this.container.parentElement||document.documentElement)}static determineLayout(e,t){const n=e.metadata.effectiveLayout;if(n===S.fixed||e.metadata.otherMetadata&&"http://openmangaformat.org/schema/1.0#version"in e.metadata.otherMetadata||e.metadata?.conformsTo?.includes(kn.DIVINA))return S.fixed;if(n===S.scrolled)return S.scrolled;const i=se(e.metadata);return i==="cjk-vertical"||i==="mongolian-vertical"||n===S.reflowable&&t?S.scrolled:S.reflowable}async load(){if(this.positions?.length||(this.positions=await this.pub.positionsFromManifest()),!this._injector){const e=await this._readiumRulesPromise;this._injector=new en({rules:[...e,...this._injectablesConfig.rules],allowedDomains:this._injectablesConfig.allowedDomains})}if(this._layout===S.fixed)this.framePool=new Bi(this.container,this.positions,this.pub,this._injector,this._contentProtection,this._keyboardPeripherals),this.framePool.listener=(e,t)=>{this.eventListener(e,t)};else{await this.updateCSS(!1);const e=this.compileCSSProperties(this._css);this.framePool=new Li(this.container,this.positions,e,this._injector,this._contentProtection,this._keyboardPeripherals)}this.currentLocation===void 0&&(this.currentLocation=this.positions[0]),await this.resizeHandler(),await this.apply()}get settings(){if(this._layout===S.fixed)return Object.freeze({...this._settings});{const e=this._css.userProperties.colCount||this._css.rsProperties.colCount||this._settings.columnCount;return Object.freeze({...this._settings,columnCount:e})}}get preferencesEditor(){return this._preferencesEditor===null&&(this._preferencesEditor=new sn(this._preferences,this.settings,this.pub.metadata)),this._preferencesEditor}async submitPreferences(e){this._preferences=this._preferences.merging(e),await this.applyPreferences()}async applyPreferences(){const e=this._settings;this._settings=new ln(this._preferences,this._defaults),this._preferencesEditor!==null&&(this._preferencesEditor=new sn(this._preferences,this.settings,this.pub.metadata)),this._layout===S.fixed?this.handleFXLPrefs(e,this._settings):await this.updateCSS(!0)}handleFXLPrefs(e,t){e.columnCount!==t.columnCount&&this.framePool.setPerPage(t.columnCount)}async updateCSS(e){this._css.update(this._settings),e&&await this.commitCSS(this._css)}compileCSSProperties(e){const t={};for(const[n,i]of Object.entries(e.rsProperties.toCSSProperties()))t[n]=i;for(const[n,i]of Object.entries(e.userProperties.toCSSProperties()))t[n]=i;return t}async commitCSS(e){if(!this.framePool)return;const t=this.compileCSSProperties(e);this.framePool.setCSSProperties(t),this._css.userProperties.view==="paged"&&this._layout===S.scrolled?await this.setLayout(S.reflowable):this._css.userProperties.view==="scroll"&&this._layout===S.reflowable&&await this.setLayout(S.scrolled),this._css.setContainerWidth()}async resizeHandler(){const e=this.container.parentElement||document.documentElement;if(this._layout===S.fixed){if(this.container.style.width=`${Ke(e)-this._settings.constraint}px`,!this.framePool)return;this.framePool.resizeHandler()}else{const t=this._css.userProperties.colCount,n=this._css.userProperties.lineLength;this._css.resizeHandler(),(this._css.userProperties.view!=="scroll"&&t!==this._css.userProperties.colCount||n!==this._css.userProperties.lineLength)&&await this.commitCSS(this._css)}}get layout(){return this._layout}get ownerWindow(){return this.container.ownerDocument.defaultView||window}get _cframes(){return(this.framePool?.currentFrames??[]).filter(e=>!(e instanceof rn&&e.isDestroyed))}get pool(){return this.framePool}eventListener(e,t){switch(e){case"_pong":this.listeners.frameLoaded(this._cframes[0].iframe.contentWindow),this.listeners.positionChanged(this.currentLocation);break;case"first_visible_locator":const n=N.deserialize(t);if(!n)break;this.currentLocation=new N({href:this.currentLocation.href,type:this.currentLocation.type,title:this.currentLocation.title,locations:n?.locations,text:n?.text}),this.listeners.positionChanged(this.currentLocation);break;case"text_selected":this.listeners.textSelected(t);break;case"click":case"tap":const i=t;if(i.interactiveElement){const l=new DOMParser().parseFromString(i.interactiveElement,"text/html").body.children[0];if(l.nodeType===l.ELEMENT_NODE&&l.nodeName==="A"&&l.hasAttribute("href")){const c=l.attributes.getNamedItem("href")?.value;if(c.startsWith("#"))this.go(this.currentLocation.copyWithLocations({fragments:[c.substring(1)]}),!1,()=>{});else if(c.startsWith("http://")||c.startsWith("https://")||c.startsWith("mailto:")||c.startsWith("tel:"))this.listeners.handleLocator(new V({href:c}).locator);else try{this.goLink(new V({href:dt.join(dt.dirname(this.currentLocation.href),c)}),!1,()=>{})}catch(h){console.warn(`Couldn't go to link for ${c}: ${h}`),this.listeners.handleLocator(new V({href:c}).locator)}}else console.log("Clicked on",l)}else{if(this._layout===S.fixed&&this.framePool.doNotDisturb&&(i.doNotDisturb=!0),this._layout===S.fixed&&(this.currentProgression===M.rtl||this.currentProgression===M.ltr)&&this.framePool.currentFrames.length>1){const h=this.framePool.currentFrames;i.targetFrameSrc===h[this.currentProgression===M.rtl?0:1]?.source&&(i.x+=(h[this.currentProgression===M.rtl?1:0]?.iframe.contentWindow?.innerWidth??0)*window.devicePixelRatio)}if(e==="click"?this.listeners.click(i):this.listeners.tap(i))break;const c=(this._cframes.length===2?this._cframes[0].window.innerWidth+this._cframes[1].window.innerWidth:this._cframes[0].window.innerWidth)*window.devicePixelRatio/4;i.x>=c&&i.x<=c*3&&this.listeners.miscPointer(1),i.x<c?this.goLeft(!1,()=>{}):i.x>c*3&&this.goRight(!1,()=>{})}break;case"tap_more":this.listeners.miscPointer(t);break;case"no_more":this.changeResource(1);break;case"no_less":this.changeResource(-1);break;case"swipe":break;case"scroll":this.listeners.scroll(t);break;case"zoom":this.listeners.zoom(t);break;case"progress":this.syncLocation(t);break;case"content_protection":const o=t;this.listeners.contentProtection(o.type,o);break;case"context_menu":this.listeners.contextMenu(t);break;case"keyboard_peripherals":const a=t,s={...a,interactiveElement:void 0};a.interactiveElement&&(s.interactiveElement=new DOMParser().parseFromString(a.interactiveElement,"text/html").body.children[0]),this.listeners.peripheral(s);break;case"log":console.log(this._cframes[0]?.source?.split("/")[3],...t);break;default:this.listeners.customEvent(e,t);break}}determineModules(){let e=Array.from(Gt.keys());if(this._layout===S.fixed)return e.filter(i=>jo.includes(i));e=e.filter(i=>Go.includes(i));const t=se(this.pub.metadata);if(t==="cjk-vertical"||t==="mongolian-vertical")return e.filter(i=>i!=="column_snapper"&&i!=="scroll_snapper");const n=e;return this._layout===S.scrolled?e=n.filter(i=>i!=="column_snapper"&&i!=="cjk_vertical_snapper"):e=n.filter(i=>i!=="scroll_snapper"&&i!=="cjk_vertical_snapper"),e}attachListener(){const e=this._cframes.filter(t=>!!t);if(e.length===0)throw Error("no cframe to attach listener to");e.forEach(t=>{t.msg&&(t.msg.listener=(n,i)=>{this.eventListener(n,i)})})}async apply(){if(await this.framePool.update(this.pub,this.currentLocator,this.determineModules()),this.attachListener(),this.pub.readingOrder.findIndexWithHref(this.currentLocation.href)<0)throw Error("Link for "+this.currentLocation.href+" not found!")}async destroy(){this._suspiciousActivityListener&&window.removeEventListener(de,this._suspiciousActivityListener),this._keyboardPeripheralListener&&window.removeEventListener(ue,this._keyboardPeripheralListener),this._navigatorProtector?.destroy(),this._keyboardPeripheralsManager?.destroy(),await this.framePool?.destroy()}async changeResource(e){if(e===0)return!1;if(this._layout===S.fixed){const i=this.framePool,o=i.viewport.positions[0];if(e===1){if(!i.next(i.perPage))return!1}else if(e===-1){if(!i.prev(i.perPage))return!1}else throw Error("Invalid relative value for FXL");const a=i.viewport.positions[0];if(o>a){for(let s=this.positions.length-1;s>=0;s--)if(this.positions[s].href===this.pub.readingOrder.items[a-1].href){this.currentLocation=this.positions[s].copyWithLocations({progression:.999999999999});break}}else if(o<a){for(let s=0;s<this.positions.length;s++)if(this.positions[s].href===this.pub.readingOrder.items[a-1].href){this.currentLocation=this.positions[s];break}}return await this.apply(),this.listeners.positionChanged(this.currentLocation),!0}const t=this.pub.readingOrder.findIndexWithHref(this.currentLocation.href),n=Math.max(0,Math.min(this.pub.readingOrder.items.length-1,t+e));if(n===t)return this._cframes[0]?.msg?.send("shake",void 0,async i=>{}),!1;if(t>n){for(let i=this.positions.length-1;i>=0;i--)if(this.positions[i].href===this.pub.readingOrder.items[n].href){this.currentLocation=this.positions[i].copyWithLocations({progression:.999999999999});break}}else for(let i=0;i<this.positions.length;i++)if(this.positions[i].href===this.pub.readingOrder.items[n].href){this.currentLocation=this.positions[i];break}return await this.apply(),!0}findLastPositionInProgressionRange(e,t){const n=e.findLastIndex(i=>{const o=i.locations.progression;return!!(o&&o>t.start&&o<=t.end)});return n!==-1?e[n]:void 0}findNearestPositions(e){const t=this.positions.filter(a=>a.href===this.currentLocation.href);let n=this.currentLocation,i;const o=t.findLastIndex(a=>(a.locations.progression??0)<=e.start);if(o!==-1){n=t[o];const a=t.slice(o+1);i=this.findLastPositionInProgressionRange(a,e)}return{first:n,last:i}}updateViewport(e){this.reflowViewport.readingOrder=[],this.reflowViewport.progressions.clear(),this.reflowViewport.positions=null,this.currentLocation&&(this.reflowViewport.readingOrder.push(this.currentLocation.href),this.reflowViewport.progressions.set(this.currentLocation.href,e),this.currentLocation.locations?.position!==void 0&&(this.reflowViewport.positions=[this.currentLocation.locations.position],this.lastLocationInView?.locations?.position!==void 0&&this.reflowViewport.positions.push(this.lastLocationInView.locations.position)))}async syncLocation(e){const t=e,n=this.findNearestPositions(t);this.currentLocation=n.first.copyWithLocations({progression:t.start}),this.lastLocationInView=n.last,this.updateViewport(t),this.listeners.positionChanged(this.currentLocation),await this.framePool.update(this.pub,this.currentLocation,this.determineModules())}goBackward(e,t){this._layout===S.fixed?(this.changeResource(-1),t(!0)):this._cframes[0]?.msg?.send("go_prev",void 0,async n=>{t(n?!0:await this.changeResource(-1))})}goForward(e,t){this._layout===S.fixed?(this.changeResource(1),t(!0)):this._cframes[0]?.msg?.send("go_next",void 0,async n=>{t(n?!0:await this.changeResource(1))})}get currentLocator(){return this.currentLocation}get viewport(){return this._layout===S.fixed?this.framePool?this.framePool.viewport:{readingOrder:[],progressions:new Map,positions:null}:this.reflowViewport}get isScrollStart(){const e=this.viewport.readingOrder[0];return this.viewport.progressions.get(e)?.start===0}get isScrollEnd(){const e=this.viewport.readingOrder[this.viewport.readingOrder.length-1];return this.viewport.progressions.get(e)?.end===1}get canGoBackward(){const e=this.pub.readingOrder.items[0]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.start===0)}get canGoForward(){const e=this.pub.readingOrder.items[this.pub.readingOrder.items.length-1]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.end===1)}get readingProgression(){return this.currentProgression}async setLayout(e){this._layout!==e&&(this._layout=e,await this.framePool.update(this.pub,this.currentLocator,this.determineModules(),!0),this.attachListener())}get publication(){return this.pub}async loadLocator(e,t){let n=!1,i=typeof e.locations.getCssSelector=="function"&&e.locations.getCssSelector();if(e.text?.highlight?n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_text",i?[e.text?.serialize(),i]:e.text?.serialize(),h=>l(h))}):i&&(n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_text",["",i],h=>l(h))})),n){t(n);return}const o=typeof e.locations.htmlId=="function"&&e.locations.htmlId();if(o&&(n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_id",o,h=>l(h))})),n){t(n);return}const a=e?.locations?.progression;a&&a>0?n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_progression",a,h=>l(h))}):n=!0,t(n)}go(e,t,n){const i=e.href.split("#")[0];let o=this.pub.readingOrder.findWithHref(i);if(!o)return n(this.listeners.handleLocator(e));this.currentLocation=this.positions.find(a=>a.href===o.href),this.apply().then(()=>this.loadLocator(e,a=>n(a))).then(()=>{this.attachListener()})}goLink(e,t,n){return this.go(e.locator,t,n)}}const Ur=`// PreservePitchProcessor.js
|
|
479
|
+
`;async function Or(r,e){const t=r.effectiveLayout===S.fixed,n=e.filter(s=>s.mediaType.isHTML).map(s=>s.href),i=n.length>0?n:[/\.xhtml$/,/\.html$/],o=[{id:"css-selector-generator",as:"script",target:"head",blob:new Blob([Ce(Ri)],{type:"text/javascript"})},{id:"execution-prevention",as:"script",target:"head",blob:new Blob([Ce(Lr)],{type:"text/javascript"}),condition:s=>!!(s.querySelector("script")||s.querySelector("body[onload]:not(body[onload=''])"))}],a=[{id:"onload-proxy",as:"script",target:"head",blob:new Blob([Ce(Pi)],{type:"text/javascript"}),condition:s=>!!(s.querySelector("script")||s.querySelector("body[onload]:not(body[onload=''])"))}];if(!t){const s=se(r);let l,c,h;switch(s){case"rtl":{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>Kr),Promise.resolve().then(()=>Xr),Promise.resolve().then(()=>Yr)]);l=u.default,c=m.default,h=f.default;break}case"cjk-horizontal":{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>qr),Promise.resolve().then(()=>Jr),Promise.resolve().then(()=>Zr)]);l=u.default,c=m.default,h=f.default;break}case"cjk-vertical":case"mongolian-vertical":{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>Qr),Promise.resolve().then(()=>ea),Promise.resolve().then(()=>ta)]);l=u.default,c=m.default,h=f.default;break}default:{const[u,m,f]=await Promise.all([Promise.resolve().then(()=>na),Promise.resolve().then(()=>ia),Promise.resolve().then(()=>oa)]);l=u.default,c=m.default,h=f.default;break}}if(o.unshift({id:"readium-css-before",as:"link",target:"head",blob:new Blob([$e(l)],{type:"text/css"}),rel:"stylesheet"}),a.unshift({id:"readium-css-default",as:"link",target:"head",blob:new Blob([$e(c)],{type:"text/css"}),rel:"stylesheet",condition:u=>!(u.querySelector("link[rel='stylesheet']")||u.querySelector("style")||u.querySelector("[style]:not([style=''])"))},{id:"readium-css-after",as:"link",target:"head",blob:new Blob([$e(h)],{type:"text/css"}),rel:"stylesheet"}),(s==="cjk-horizontal"||s==="cjk-vertical")&&(r.description==="ebpaj-guide-1.0"||r.otherMetadata?.["ebpaj:guide-version"]!==void 0)){const{default:m}=await Promise.resolve().then(()=>ra);a.push({id:"readium-css-ebpaj",as:"link",target:"head",blob:new Blob([$e(m)],{type:"text/css"}),rel:"stylesheet"})}}return[{resources:i,prepend:o,append:a}]}const Ar=r=>({frameLoaded:r.frameLoaded||(()=>{}),positionChanged:r.positionChanged||(()=>{}),tap:r.tap||(()=>!1),click:r.click||(()=>!1),zoom:r.zoom||(()=>{}),miscPointer:r.miscPointer||(()=>{}),scroll:r.scroll||(()=>{}),customEvent:r.customEvent||(()=>{}),handleLocator:r.handleLocator||(()=>!1),textSelected:r.textSelected||(()=>{}),contentProtection:r.contentProtection||(()=>{}),contextMenu:r.contextMenu||(()=>{}),peripheral:r.peripheral||(()=>{})});class hn extends $t{constructor(e,t,n,i=[],o=void 0,a={preferences:{},defaults:{}}){super(),this._preferencesEditor=null,this._injector=null,this._isNavigating=!1,this._navigatorProtector=null,this._keyboardPeripheralsManager=null,this._suspiciousActivityListener=null,this._keyboardPeripheralListener=null,this.reflowViewport={readingOrder:[],progressions:new Map,positions:null},this.pub=t,this.container=e,this.listeners=Ar(n),this.currentLocation=o,i.length&&(this.positions=i),this._preferences=new ke(a.preferences),this._defaults=new ji(a.defaults),this._settings=new ln(this._preferences,this._defaults);const s=se(t.metadata),l=s==="cjk-horizontal",c=s==="cjk-vertical",u=c||s==="mongolian-vertical",m=l||c;this._css=new Vi({rsProperties:new Gi({noVerticalPagination:u||void 0}),userProperties:new cn({}),lineLengths:new Re({optimalChars:this._settings.optimalLineLength,minChars:this._settings.minimalLineLength,maxChars:this._settings.maximalLineLength,padding:this._settings.scroll?(this._settings.scrollPaddingLeft||0)+(this._settings.scrollPaddingRight||0):(this._settings.pageGutter||0)*2,fontFace:this._settings.fontFamily,letterSpacing:this._settings.letterSpacing,wordSpacing:this._settings.wordSpacing,isCJK:m}),container:e,constraint:this._settings.constraint,isCJKVertical:u}),this._layout=hn.determineLayout(t,!!this._settings.scroll),this.currentProgression=t.metadata.effectiveReadingProgression,this._injectablesConfig=a.injectables||{rules:[],allowedDomains:[]},this._readiumRulesPromise=Or(t.metadata,t.readingOrder.items),this._contentProtection=a.contentProtection||{},this._keyboardPeripherals=this.mergeKeyboardPeripherals(this._contentProtection,a.keyboardPeripherals||[]),(this._contentProtection.disableContextMenu||this._contentProtection.checkAutomation||this._contentProtection.checkIFrameEmbedding||this._contentProtection.monitorDevTools||this._contentProtection.protectPrinting?.disable)&&(this._navigatorProtector=new nn(this._contentProtection),this._suspiciousActivityListener=f=>{const{type:d,...p}=f.detail;d==="context_menu"?this.listeners.contextMenu(p):this.listeners.contentProtection(d,p)},window.addEventListener(de,this._suspiciousActivityListener)),this._keyboardPeripherals.length>0&&(this._keyboardPeripheralsManager=new on({keyboardPeripherals:this._keyboardPeripherals}),this._keyboardPeripheralListener=f=>{const d=f.detail;this.listeners.peripheral(d)},window.addEventListener(ue,this._keyboardPeripheralListener)),this.resizeObserver=new ResizeObserver(()=>this.ownerWindow.requestAnimationFrame(async()=>await this.resizeHandler())),this.resizeObserver.observe(this.container.parentElement||document.documentElement)}static determineLayout(e,t){const n=e.metadata.effectiveLayout;if(n===S.fixed||e.metadata.otherMetadata&&"http://openmangaformat.org/schema/1.0#version"in e.metadata.otherMetadata||e.metadata?.conformsTo?.includes(kn.DIVINA))return S.fixed;if(n===S.scrolled)return S.scrolled;const i=se(e.metadata);return i==="cjk-vertical"||i==="mongolian-vertical"||n===S.reflowable&&t?S.scrolled:S.reflowable}async load(){if(this.positions?.length||(this.positions=await this.pub.positionsFromManifest()),!this._injector){const e=await this._readiumRulesPromise;this._injector=new en({rules:[...e,...this._injectablesConfig.rules],allowedDomains:this._injectablesConfig.allowedDomains})}if(this._layout===S.fixed)this.framePool=new Bi(this.container,this.positions,this.pub,this._injector,this._contentProtection,this._keyboardPeripherals),this.framePool.listener=(e,t)=>{this.eventListener(e,t)};else{await this.updateCSS(!1);const e=this.compileCSSProperties(this._css);this.framePool=new Li(this.container,this.positions,e,this._injector,this._contentProtection,this._keyboardPeripherals)}this.currentLocation===void 0&&(this.currentLocation=this.positions[0]),await this.resizeHandler(),await this.apply()}get settings(){if(this._layout===S.fixed)return Object.freeze({...this._settings});{const e=this._css.userProperties.colCount||this._css.rsProperties.colCount||this._settings.columnCount;return Object.freeze({...this._settings,columnCount:e})}}get preferencesEditor(){return this._preferencesEditor===null&&(this._preferencesEditor=new sn(this._preferences,this.settings,this.pub.metadata)),this._preferencesEditor}async submitPreferences(e){this._preferences=this._preferences.merging(e),await this.applyPreferences()}async applyPreferences(){const e=this._settings;this._settings=new ln(this._preferences,this._defaults),this._preferencesEditor!==null&&(this._preferencesEditor=new sn(this._preferences,this.settings,this.pub.metadata)),this._layout===S.fixed?this.handleFXLPrefs(e,this._settings):await this.updateCSS(!0)}handleFXLPrefs(e,t){e.columnCount!==t.columnCount&&this.framePool.setPerPage(t.columnCount)}async updateCSS(e){this._css.update(this._settings),e&&await this.commitCSS(this._css)}compileCSSProperties(e){const t={};for(const[n,i]of Object.entries(e.rsProperties.toCSSProperties()))t[n]=i;for(const[n,i]of Object.entries(e.userProperties.toCSSProperties()))t[n]=i;return t}async commitCSS(e){if(!this.framePool)return;const t=this.compileCSSProperties(e);this.framePool.setCSSProperties(t),this._css.userProperties.view==="paged"&&this._layout===S.scrolled?await this.setLayout(S.reflowable):this._css.userProperties.view==="scroll"&&this._layout===S.reflowable&&await this.setLayout(S.scrolled),this._css.setContainerWidth()}async resizeHandler(){const e=this.container.parentElement||document.documentElement;if(this._layout===S.fixed){if(this.container.style.width=`${Ke(e)-this._settings.constraint}px`,!this.framePool)return;this.framePool.resizeHandler()}else{const t=this._css.userProperties.colCount,n=this._css.userProperties.lineLength;this._css.resizeHandler(),(this._css.userProperties.view!=="scroll"&&t!==this._css.userProperties.colCount||n!==this._css.userProperties.lineLength)&&await this.commitCSS(this._css)}}get layout(){return this._layout}get ownerWindow(){return this.container.ownerDocument.defaultView||window}get _cframes(){return(this.framePool?.currentFrames??[]).filter(e=>!(e instanceof rn&&e.isDestroyed))}get pool(){return this.framePool}eventListener(e,t){switch(e){case"_pong":this.listeners.frameLoaded(this._cframes[0].iframe.contentWindow),this.listeners.positionChanged(this.currentLocation);break;case"first_visible_locator":const n=N.deserialize(t);if(!n)break;this.currentLocation=new N({href:this.currentLocation.href,type:this.currentLocation.type,title:this.currentLocation.title,locations:n?.locations,text:n?.text}),this.listeners.positionChanged(this.currentLocation);break;case"text_selected":this.listeners.textSelected(t);break;case"click":case"tap":const i=t;if(i.interactiveElement){const l=new DOMParser().parseFromString(i.interactiveElement,"text/html").body.children[0];if(l.nodeType===l.ELEMENT_NODE&&l.nodeName==="A"&&l.hasAttribute("href")){const c=l.attributes.getNamedItem("href")?.value;if(c.startsWith("#"))this.go(this.currentLocation.copyWithLocations({fragments:[c.substring(1)]}),!1,()=>{});else if(c.startsWith("http://")||c.startsWith("https://")||c.startsWith("mailto:")||c.startsWith("tel:"))this.listeners.handleLocator(new V({href:c}).locator);else try{this.goLink(new V({href:dt.join(dt.dirname(this.currentLocation.href),c)}),!1,()=>{})}catch(h){console.warn(`Couldn't go to link for ${c}: ${h}`),this.listeners.handleLocator(new V({href:c}).locator)}}else console.log("Clicked on",l)}else{if(this._layout===S.fixed&&this.framePool.doNotDisturb&&(i.doNotDisturb=!0),this._layout===S.fixed&&(this.currentProgression===M.rtl||this.currentProgression===M.ltr)&&this.framePool.currentFrames.length>1){const h=this.framePool.currentFrames;i.targetFrameSrc===h[this.currentProgression===M.rtl?0:1]?.source&&(i.x+=(h[this.currentProgression===M.rtl?1:0]?.iframe.contentWindow?.innerWidth??0)*window.devicePixelRatio)}if(e==="click"?this.listeners.click(i):this.listeners.tap(i))break;const c=(this._cframes.length===2?this._cframes[0].window.innerWidth+this._cframes[1].window.innerWidth:this._cframes[0].window.innerWidth)*window.devicePixelRatio/4;i.x>=c&&i.x<=c*3&&this.listeners.miscPointer(1),i.x<c?this.goLeft(!1,()=>{}):i.x>c*3&&this.goRight(!1,()=>{})}break;case"tap_more":this.listeners.miscPointer(t);break;case"no_more":this.changeResource(1);break;case"no_less":this.changeResource(-1);break;case"swipe":break;case"scroll":this.listeners.scroll(t);break;case"zoom":this.listeners.zoom(t);break;case"progress":this.syncLocation(t);break;case"content_protection":const o=t;this.listeners.contentProtection(o.type,o);break;case"context_menu":this.listeners.contextMenu(t);break;case"keyboard_peripherals":const a=t,s={...a,interactiveElement:void 0};a.interactiveElement&&(s.interactiveElement=new DOMParser().parseFromString(a.interactiveElement,"text/html").body.children[0]),this.listeners.peripheral(s);break;case"log":console.log(this._cframes[0]?.source?.split("/")[3],...t);break;default:this.listeners.customEvent(e,t);break}}determineModules(){let e=Array.from(Gt.keys());if(this._layout===S.fixed)return e.filter(i=>jo.includes(i));e=e.filter(i=>Go.includes(i));const t=se(this.pub.metadata);if(t==="cjk-vertical"||t==="mongolian-vertical")return e.filter(i=>i!=="column_snapper"&&i!=="scroll_snapper");const n=e;return this._layout===S.scrolled?e=n.filter(i=>i!=="column_snapper"&&i!=="cjk_vertical_snapper"):e=n.filter(i=>i!=="scroll_snapper"&&i!=="cjk_vertical_snapper"),e}attachListener(){const e=this._cframes.filter(t=>!!t);if(e.length===0)throw Error("no cframe to attach listener to");e.forEach(t=>{t.msg&&(t.msg.listener=(n,i)=>{this.eventListener(n,i)})})}async apply(){if(await this.framePool.update(this.pub,this.currentLocator,this.determineModules()),this.attachListener(),this.pub.readingOrder.findIndexWithHref(this.currentLocation.href)<0)throw Error("Link for "+this.currentLocation.href+" not found!")}async destroy(){this._suspiciousActivityListener&&window.removeEventListener(de,this._suspiciousActivityListener),this._keyboardPeripheralListener&&window.removeEventListener(ue,this._keyboardPeripheralListener),this._navigatorProtector?.destroy(),this._keyboardPeripheralsManager?.destroy(),await this.framePool?.destroy()}async changeResource(e){if(e===0)return!1;if(this._layout===S.fixed){const i=this.framePool,o=i.viewport.positions[0];if(e===1){if(!i.next(i.perPage))return!1}else if(e===-1){if(!i.prev(i.perPage))return!1}else throw Error("Invalid relative value for FXL");const a=i.viewport.positions[0];if(o>a){for(let s=this.positions.length-1;s>=0;s--)if(this.positions[s].href===this.pub.readingOrder.items[a-1].href){this.currentLocation=this.positions[s].copyWithLocations({progression:.999999999999});break}}else if(o<a){for(let s=0;s<this.positions.length;s++)if(this.positions[s].href===this.pub.readingOrder.items[a-1].href){this.currentLocation=this.positions[s];break}}return await this.apply(),this.listeners.positionChanged(this.currentLocation),!0}const t=this.pub.readingOrder.findIndexWithHref(this.currentLocation.href),n=Math.max(0,Math.min(this.pub.readingOrder.items.length-1,t+e));if(n===t)return this._cframes[0]?.msg?.send("shake",void 0,async i=>{}),!1;if(t>n){for(let i=this.positions.length-1;i>=0;i--)if(this.positions[i].href===this.pub.readingOrder.items[n].href){this.currentLocation=this.positions[i].copyWithLocations({progression:.999999999999});break}}else for(let i=0;i<this.positions.length;i++)if(this.positions[i].href===this.pub.readingOrder.items[n].href){this.currentLocation=this.positions[i];break}return await this.apply(),!0}findLastPositionInProgressionRange(e,t){const n=e.findLastIndex(i=>{const o=i.locations.progression;return!!(o&&o>t.start&&o<=t.end)});return n!==-1?e[n]:void 0}findNearestPositions(e){const t=this.positions.filter(a=>a.href===this.currentLocation.href);let n=this.currentLocation,i;const o=t.findLastIndex(a=>(a.locations.progression??0)<=e.start);if(o!==-1){n=t[o];const a=t.slice(o+1);i=this.findLastPositionInProgressionRange(a,e)}return{first:n,last:i}}updateViewport(e){this.reflowViewport.readingOrder=[],this.reflowViewport.progressions.clear(),this.reflowViewport.positions=null,this.currentLocation&&(this.reflowViewport.readingOrder.push(this.currentLocation.href),this.reflowViewport.progressions.set(this.currentLocation.href,e),this.currentLocation.locations?.position!==void 0&&(this.reflowViewport.positions=[this.currentLocation.locations.position],this.lastLocationInView?.locations?.position!==void 0&&this.reflowViewport.positions.push(this.lastLocationInView.locations.position)))}async syncLocation(e){const t=e,n=this.findNearestPositions(t);this.currentLocation=n.first.copyWithLocations({progression:t.start}),this.lastLocationInView=n.last,this.updateViewport(t),this.listeners.positionChanged(this.currentLocation),await this.framePool.update(this.pub,this.currentLocation,this.determineModules())}goBackward(e,t){if(this._isNavigating){t(!1);return}this._isNavigating=!0,this._layout===S.fixed?this.changeResource(-1).then(n=>{this._isNavigating=!1,t(n)}):this._cframes[0]?.msg?.send("go_prev",void 0,async n=>{if(n)this._isNavigating=!1,t(!0);else{const i=await this.changeResource(-1);this._isNavigating=!1,t(i)}})}goForward(e,t){if(this._isNavigating){t(!1);return}this._isNavigating=!0,this._layout===S.fixed?this.changeResource(1).then(n=>{this._isNavigating=!1,t(n)}):this._cframes[0]?.msg?.send("go_next",void 0,async n=>{if(n)this._isNavigating=!1,t(!0);else{const i=await this.changeResource(1);this._isNavigating=!1,t(i)}})}get currentLocator(){return this.currentLocation}get viewport(){return this._layout===S.fixed?this.framePool?this.framePool.viewport:{readingOrder:[],progressions:new Map,positions:null}:this.reflowViewport}get isScrollStart(){const e=this.viewport.readingOrder[0];return this.viewport.progressions.get(e)?.start===0}get isScrollEnd(){const e=this.viewport.readingOrder[this.viewport.readingOrder.length-1];return this.viewport.progressions.get(e)?.end===1}get canGoBackward(){const e=this.pub.readingOrder.items[0]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.start===0)}get canGoForward(){const e=this.pub.readingOrder.items[this.pub.readingOrder.items.length-1]?.href;return!(this.viewport.progressions.has(e)&&this.viewport.progressions.get(e)?.end===1)}get readingProgression(){return this.currentProgression}async setLayout(e){this._layout!==e&&(this._layout=e,await this.framePool.update(this.pub,this.currentLocator,this.determineModules(),!0),this.attachListener())}get publication(){return this.pub}async loadLocator(e,t){let n=!1,i=typeof e.locations.getCssSelector=="function"&&e.locations.getCssSelector();if(e.text?.highlight?n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_text",i?[e.text?.serialize(),i]:e.text?.serialize(),h=>l(h))}):i&&(n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_text",["",i],h=>l(h))})),n){t(n);return}const o=typeof e.locations.htmlId=="function"&&e.locations.htmlId();if(o&&(n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_id",o,h=>l(h))})),n){t(n);return}const a=e?.locations?.progression;a&&a>0?n=await new Promise((l,c)=>{this._cframes[0].msg.send("go_progression",a,h=>l(h))}):n=!0,t(n)}go(e,t,n){const i=e.href.split("#")[0];let o=this.pub.readingOrder.findWithHref(i);if(!o)return n(this.listeners.handleLocator(e));if(this._isNavigating){n(!1);return}this._isNavigating=!0,this.currentLocation=this.positions.find(a=>a.href===o.href),this.apply().then(()=>this.loadLocator(e,a=>{this._isNavigating=!1,n(a)})).then(()=>{this.attachListener()})}goLink(e,t,n){return this.go(e.locator,t,n)}}const Ur=`// PreservePitchProcessor.js
|
|
480
480
|
// AudioWorklet processor for pitch preservation via pitch shifting.
|
|
481
481
|
//
|
|
482
482
|
// Architecture:
|
|
@@ -5611,4 +5611,4 @@ body{
|
|
|
5611
5611
|
local("YuGothic-Medium"), local("YuGothic"), /* 游ゴシック体(macOS) */
|
|
5612
5612
|
local("Yu Gothic Medium"), local("Yu Gothic"), /* 游ゴシック(Windows) "Yu Gothic" is a fallback. */
|
|
5613
5613
|
local("BIZ UDGothic"); /* BIZ UDゴシック */
|
|
5614
|
-
}`},Symbol.toStringTag,{value:"Module"}));_.AudioDefaults=Ki,_.AudioNavigator=Dr,_.AudioPreferences=Xe,_.AudioPreferencesEditor=mn,_.AudioSettings=un,_.BooleanPreference=O,_.EnumPreference=Zt,_.EpubDefaults=ji,_.EpubNavigator=hn,_.EpubPreferences=
|
|
5614
|
+
}`},Symbol.toStringTag,{value:"Module"}));_.AudioDefaults=Ki,_.AudioNavigator=Dr,_.AudioPreferences=Xe,_.AudioPreferencesEditor=mn,_.AudioSettings=un,_.BooleanPreference=O,_.EnumPreference=Zt,_.EpubDefaults=ji,_.EpubNavigator=hn,_.EpubPreferences=ke,_.EpubPreferencesEditor=sn,_.EpubSettings=ln,_.ExperimentalWebPubNavigator=wr,_.FXLCoordinator=Ti,_.FXLFrameManager=Oi,_.FXLFramePoolManager=Bi,_.FXLPeripherals=Ii,_.FXLSpreader=Hi,_.FrameComms=we,_.FrameManager=rn,_.FramePoolManager=Li,_.HorizontalThird=Ai,_.Injector=en,_.LineLengths=Re,_.MediaNavigator=ai,_.Navigator=Vt,_.Orientation=gt,_.Preference=U,_.Properties=Ge,_.RSProperties=Gi,_.RangePreference=k,_.ReadiumCSS=Vi,_.Spread=ft,_.TextAlignment=J,_.UserProperties=cn,_.VerticalThird=Ui,_.VisualNavigator=$t,_.WebAudioEngine=$i,_.WebPubBlobBuilder=si,_.WebPubCSS=fi,_.WebPubDefaults=Si,_.WebPubFrameManager=ui,_.WebPubFramePoolManager=mi,_.WebPubNavigator=Ei,_.WebPubPreferences=Pe,_.WebPubPreferencesEditor=Qt,_.WebPubSettings=Jt,_.WebRSProperties=gi,_.WebUserProperties=Yt,_.ensureBoolean=R,_.ensureEnumValue=Ve,_.ensureExperiment=qt,_.ensureFilter=he,_.ensureLessThanOrEqual=yi,_.ensureMoreThanOrEqual=_i,_.ensureNonNegative=v,_.ensureString=I,_.ensureValueInRange=T,_.experiments=ut,_.filterRangeConfig=le,_.fontSizeRangeConfig=Ue,_.fontWeightRangeConfig=ee,_.fontWidthRangeConfig=Te,_.getScriptMode=se,_.i18n=rr,_.letterSpacingRangeConfig=Ne,_.lineHeightRangeConfig=Me,_.lineLengthRangeConfig=ce,_.paragraphIndentRangeConfig=Ie,_.paragraphSpacingRangeConfig=He,_.playbackRateRangeConfig=je,_.sML=Y,_.sMLWithRequest=L,_.settings=or,_.skipIntervalRangeConfig=te,_.volumeRangeConfig=Be,_.withFallback=mt,_.wordSpacingRangeConfig=De,_.zoomRangeConfig=We,Object.defineProperty(_,Symbol.toStringTag,{value:"Module"})}));
|