From 378f85fdf74ccbf037ab3d55659449594ec3d3bd Mon Sep 17 00:00:00 2001 From: Stanislav Pankevich Date: Sun, 30 Nov 2025 13:17:31 +0100 Subject: [PATCH] feat(submodules/html2pdf): update to latest main While we are waiting for the next stable release, the intermediate release already shows good results with the most known bugs are already fixed. Planning to do an intermediate release with this main branch until we get a new stable release. --- html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js | 6 +++--- submodules/html2pdf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js b/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js index eee3b89..e8dd3c1 100644 --- a/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js +++ b/html2pdf4doc/html2pdf4doc_js/html2pdf4doc.min.js @@ -1,7 +1,7 @@ /*! Version: 0.3.0 */ -var HTML2PDF4DOC;(()=>{"use strict";var e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{init:()=>Dn});var i={};e.r(i),e.d(i,{log:()=>R,logGroup:()=>D,logGroupEnd:()=>v,strictAssert:()=>x});var n={};e.r(n),e.d(n,{isAfterContentFlowStart:()=>Z,isComplexTextBlock:()=>X,isContentFlowEnd:()=>J,isContentFlowStart:()=>Y,isFlexRow:()=>ge,isForcedPageBreak:()=>ne,isFullySPlitted:()=>de,isGrid:()=>se,isGridAutoFlowRow:()=>ce,isIMG:()=>$,isInline:()=>oe,isInlineBlock:()=>re,isLiNode:()=>z,isNeutral:()=>j,isNoBreak:()=>ee,isNoHanging:()=>te,isOBJECT:()=>W,isPRE:()=>he,isPageStartElement:()=>K,isSTYLE:()=>L,isSVG:()=>G,isSelectorMatching:()=>H,isSignificantTextNode:()=>I,isSlice:()=>ie,isSlough:()=>pe,isSyntheticTextWrapper:()=>Q,isTableLikeNode:()=>le,isTableNode:()=>ae,isWrappedTextGroup:()=>q,isWrappedTextLine:()=>U,isWrappedTextNode:()=>V});var o={};e.r(o),e.d(o,{insertStyle:()=>ue});var r={};e.r(r),e.d(r,{isFirstChildOfFirstChild:()=>fe,isLastChildOfLastChild:()=>me,isLineChanged:()=>be,isLineKept:()=>we,resolveFlowElement:()=>Me,setInitStyle:()=>Se});var s={};e.r(s),e.d(s,{getBottom:()=>Ee,getBottomWithMargin:()=>De,getContentHeightByProbe:()=>Ie,getEmptyNodeHeightByProbe:()=>Fe,getHeightWithMargin:()=>ve,getLineHeight:()=>ke,getMaxWidth:()=>xe,getNormalizedBottomWithMargin:()=>ye,getNormalizedTop:()=>Oe,getTableEmptyRowHeight:()=>Ne,getTableEntries:()=>He,getTableRowHeight:()=>Be,getTableRowShellHeightByTD:()=>Ae,getTop:()=>Te,getTopForPageStartCandidate:()=>Ce,getTopWithMargin:()=>Re});var l={};e.r(l),e.d(l,{create:()=>Le,createComplexTextBlock:()=>qe,createForcedPageBreak:()=>Ze,createNeutral:()=>$e,createNeutralBlock:()=>Ge,createPrintPageBreak:()=>Ue,createSignpost:()=>Je,createSliceWrapper:()=>Qe,createTable:()=>Xe,createTestNodeFrom:()=>Ke,createTextGroup:()=>je,createTextLine:()=>ze,createTextNodeWrapper:()=>We,createWithFlagNoBreak:()=>Ve,createWord:()=>Ye});var a={};e.r(a),e.d(a,{prepareSplittedNode:()=>nt,splitByWordsGreedyWithSpacesFilter:()=>it,splitTextByLinesGreedy:()=>et,splitTextByWordsGreedy:()=>tt});var h={};e.r(h),e.d(h,{markBottomCut:()=>_t,markCleanBottomCut:()=>pt,markCleanTopCut:()=>dt,markPageEndElement:()=>gt,markPageStartElement:()=>ht,markProcessed:()=>rt,markSliceCuts:()=>ft,markSliceCutsInRows:()=>mt,markTopCut:()=>ut,setFlagNoBreak:()=>st,setFlagNoHanging:()=>lt,setFlagSlice:()=>at,unmarkPageStartElement:()=>ct});var c={};e.r(c),e.d(c,{wrapNodeChildrenWithNeutralBlock:()=>bt});var g={};e.r(g),e.d(g,{copyNodeWidth:()=>Ct,estimateInlineImgGapBelow:()=>Tt,fitElementWithinBoundaries:()=>St,fitElementWithinHeight:()=>Mt,lockNodesWidths:()=>yt,lockTableWidths:()=>Ot,scaleCellsToHeight:()=>Pt});var d={};e.r(d),e.d(d,{findAllForcedPageBreakInside:()=>Nt,findBetterForcedPageStarter:()=>Dt,findBetterPageStart:()=>vt,findFirstChildParent:()=>Ft,findFirstChildParentFromPage:()=>Rt,findLastChildParent:()=>kt,findPreviousNonHangingsFromPage:()=>xt,findSuitableNonHangingPageStart:()=>Bt});var p={};e.r(p),e.d(p,{getFirstChildrenChain:()=>zt,getLastChildrenChain:()=>jt,getPreparedChildren:()=>Gt,getSplitChildren:()=>Wt});var u={};e.r(u),e.d(u,{isReplacedElement:()=>Qt,resolveReplacedElement:()=>ei});var _={};e.r(_),e.d(_,{cloneAndCleanOutsideRange:()=>ai,getSplitPoints:()=>ii,getSplitPointsPerCells:()=>ni,isFirstSliceEmpty:()=>li,normalizeContentCuts:()=>ri,sliceNodeBySplitPoints:()=>oi,sliceNodeContentBySplitPoints:()=>si});var f={};e.r(f),e.d(f,{shouldSkipFlowElement:()=>pi});var m={};e.r(m),e.d(m,{buildRowSlices:()=>_i,evaluateRowSplitPlacement:()=>mi,paginationBuildBalancedRowSlices:()=>fi,replaceCurrentRowsAfterRowSplit:()=>bi,sliceCellsBySplitPoints:()=>ui});var b={};e.r(b),e.d(b,{paginationApplyFullPageScaling:()=>Pi,paginationScaleCellsToHeight:()=>Si,paginationShouldScaleFullPage:()=>Mi});var w={};e.r(w),e.d(w,{applyRowSlicesToEntriesAfterRowSplit:()=>Ci,computeRowFlags:()=>Oi});var S={};e.r(S),e.d(S,{paginationRefreshRowsAfterSplit:()=>Ti,validateSplitterAdapter:()=>yi});var M={};e.r(M),e.d(M,{paginationComputeCellShellHeights:()=>Ei});var P={};e.r(P),e.d(P,{handleRowOverflow:()=>Ri,handleRowSplitFailure:()=>xi,scaleRowCellsToHeight:()=>vi});var C={};e.r(C),e.d(C,{absorbShortTrailingSliceIfFits:()=>ki,calculateFinalPartReclaimedHeight:()=>Fi});var O={};e.r(O),e.d(O,{paginationBuildRowEvaluationContext:()=>Ni,paginationCanAbsorbLastRow:()=>Ai});var y={};e.r(y),e.d(y,{paginationCalculateRowSplitBudget:()=>Gi,paginationHandleRowSlicesPlacement:()=>Ui,paginationProcessRowSplitResult:()=>ji,paginationResolveAlreadySlicedRow:()=>$i,paginationResolveOverflowingRow:()=>Ii,paginationResolveRowWithRowspan:()=>Li,paginationResolveSplittableRow:()=>Vi,paginationSplitRow:()=>Wi});const T={init:"[html2pdf]",root:"html2pdf-root",paperFlow:"html2pdf-paper-flow",contentFlow:"html2pdf-content-flow",overlayFlow:"html2pdf-overlay-flow",pageDivider:"html2pdf-page",pageStartMarker:"[html2pdf-page-start]",pageEndMarker:"[html2pdf-page-end]",contentFlowStart:"html2pdf-content-flow-start",contentFlowEnd:"html2pdf-content-flow-end",style:"[html2pdf-style]",frontpageTemplate:"[html2pdf-frontpage]",headerTemplate:"[html2pdf-header]",footerTemplate:"[html2pdf-footer]",frontpageElement:"html2pdf-frontpage",frontpageContent:"html2pdf-frontpage-content",headerContent:"html2pdf-header",footerContent:"html2pdf-footer",pageNumberRoot:"[html2pdf-page-number]",pageNumberCurrent:"[html2pdf-page-number-current]",pageNumberTotal:"[html2pdf-page-number-total]",pageChrome:"html2pdf-page-chrome",pageBodySpacer:"html2pdf-page-body-spacer",pageHeader:"html2pdf-page-header",pageFooter:"html2pdf-page-footer",printPageBreak:"html2pdf-print-page-break",runningSafety:"html2pdf-print-running",virtualPaper:"html2pdf-virtual-paper",virtualPaperTopMargin:"html2pdf-virtual-paper-margin-top",virtualPaperBottomMargin:"html2pdf-virtual-paper-margin-bottom",virtualPaperGap:"html2pdf-virtual-paper-gap",printIgnore:"[html2pdf-print-ignore]",printHide:"[html2pdf-print-hide]",neutral:"html2pdf-neutral",word:"html2pdf-word",textNode:"html2pdf-text-node",textLine:"html2pdf-text-line",textGroup:"html2pdf-text-group",complexTextBlock:"html2pdf-complex-text-block",printForcedPageBreak:"html2pdf-print-forced-page-break",split:"[html2pdf-split]",processed:"[html2pdf-processed]",flagNoBreak:"[html2pdf-flag-no-break]",flagNoHanging:"[html2pdf-flag-no-hanging]",flagSlice:"[html2pdf-flag-slice]",topCutPart:".html2pdf-top-cut",bottomCutPart:".html2pdf-bottom-cut",cleanTopCut:".html2pdf-clean-top-cut",cleanBottomCut:".html2pdf-clean-bottom-cut",tocPageNumber:"html2pdf-toc-page-number"},E="background:#eee;color:#888;padding: 0 1px 0 0;";function D(e,t="",i=!1){"boolean"==typeof t&&(i=t,t=""),!0===i?this._debug._&&console.groupCollapsed(`%c${e}`,t):this._debug._&&console.group(`%c${e}`,t)}function v(e){this._debug._&&console.log(`%c ā–² ${e} `,E),this._debug._&&console.groupEnd()}function R(e,...t){this._debug._&&console.log(`[${e}]`,...t)}function x(e,...t){this._assert&&console.assert(e,"ā›”",...t)}class F{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debug=t.debugMode?{...t.debugConfig.DOM}:{},this._assert=!!t.consoleAssert,Object.assign(this,i)}createElement(e){return this.document.createElement(e)}createDocumentFragment(){return this.document.createDocumentFragment()}cloneNode(e){return e?.cloneNode(!0)}cloneNodeWrapper(e){return e?.cloneNode(!1)}insertBefore(e,...t){const i=t.filter((e=>null!=e));e.before(...i)}insertAfter(e,...t){const i=t.filter((e=>null!=e));e.after(...i)}insertAtEnd(e,...t){const i=t.filter((e=>null!=e));e.append(...i)}insertAtStart(e,...t){const i=t.filter((e=>null!=e));e.prepend(...i)}insertInsteadOf(e,...t){this.insertBefore(e,...t),e.remove()}wrap(e,t){return e.before(t),t.append(e),t}moveContent(e,t){for(;e.firstChild;)t.append(e.firstChild);this.strictAssert(""===this.getInnerHTML(e))}moveRowContent(e,t){if(!e||!t)return void(this._debug._&&console.warn("moveRowContent(): sourceTR or targetTR is missing"));const i=this.getElementTagName(e),n=this.getElementTagName(t);this.strictAssert("TR"===i,`moveRowContent(): source is not TR, got ${i}`),this.strictAssert("TR"===n,`moveRowContent(): target is not TR, got ${n}`);const o=[...this.getChildren(e)],r=[...this.getChildren(t)];o.length!==r.length&&this._debug._&&console.warn(`moveRowContent(): cells count mismatch: ${o.length} (source) vs ${r.length} (target)`);const s=Math.min(o.length,r.length);for(let e=0;e0,"getAll(selectors), selectors:",e),1===e.length?[...this.getAllElements(e[0],t)]:[...e].flatMap((e=>[...this.getAllElements(e,t)]))}getElement(e,t=this.document){return this.strictAssert(e),t.querySelector(e)}getAllElements(e,t=this.document){return this.strictAssert(e),t.querySelectorAll(e)}getElementById(e,t=this.document){return t.getElementById(e)}getRightNeighbor(e){return e.nextElementSibling}getLeftNeighbor(e){return e.previousElementSibling}getParentNode(e){return e.parentElement}getNodeValue(e){return e.nodeValue}getLastElementChild(e){return e.lastElementChild}getFirstElementChild(e){return e.firstElementChild}getChildNodes(e){return e.childNodes}getChildren(e){return e.children}getElementOffsetParent(e){return e.offsetParent}getComputedStyle(e){return window.getComputedStyle(e)}getElementBCR(e){return e.getBoundingClientRect()}getElementOffsetLeft(e){return e?.offsetLeft}getElementOffsetHeight(e){return e?.offsetHeight}getElementOffsetWidth(e){return e?.offsetWidth}getElementOffsetTop(e){return e?.offsetTop}getElementOffsetBottom(e){return e?.offsetTop+e?.offsetHeight||void 0}getElementTagName(e){return e.tagName}getDataId(e){return e.dataset.id}getAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("getAttribute() must have 2 params"));const i=t.charAt(0);if("."!==i&&"#"!==i||this.log("getAttribute",`you're really sure ${t} is attribute selector?`),"["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return e.getAttribute(i)}e.getAttribute(t)}setAttribute(e,t,i){if(!e||!t)return void(this._debug._&&console.warn("setAttribute() must have 2 params"));const n=t.charAt(0);if("."!==n)if("#"!==n)if("["!==n)this.log("setAttribute",`you're really sure ${t} is a selector?`);else{this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);e.setAttribute(n,i||"")}else{const i=t.substring(1);e.id=i}else{const i=t.substring(1);e.classList.add(i)}}setStyles(e,t){Object.entries(t).forEach((([t,i])=>{Array.isArray(i)?this.setStyle(e,t,i[0],i[1]||""):this.setStyle(e,t,i)}))}setStyle(e,t,i,n=""){const o=this._toKebab(t);null==i||""===i?e.style.removeProperty(o):e.style.setProperty(o,String(i),n)}_toKebab=e=>{if(e.includes("-"))return e;const t=e.match(/^(webkit|moz|ms|o)(?=[A-Z])/);return t&&(e="-"+t[1]+"-"+e.slice(t[1].length)),e.replace(/[A-Z]/g,(e=>"-"+e.toLowerCase()))};addClasses(e,...t){e.classList.add(...t)}removeAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("removeAttribute() must have 2 params"));const i=t.charAt(0);if(this.strictAssert(i.match(/[a-zA-Z#\[\.]/),`removeAttribute() expects a valid selector, but received ${t}`),"."!==i)if("#"!==i)if("["!==i)e.removeAttribute(attr);else{this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);e.removeAttribute(i)}else{const i=t.substring(1);e.removeAttribute(i)}else{const i=t.substring(1);e.classList.remove(i)}}removeAllAttributes(e){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name)}removeClasses(e,...t){e.classList.remove(...t)}removeAllClasses(e){e.classList=""}removeAllStyles(e){e.style=""}getInnerHTML(e){if("string"==typeof e){const t=this.document.querySelector(e);return t?t.innerHTML:void 0}return e.innerHTML}setInnerHTML(e,t){if("string"==typeof e){const i=this.document.querySelector(e);i&&(i.innerHTML=t)}e.innerHTML=t}isDocumentBody(e){return"BODY"===e.tagName}isTextNode(e){return e.nodeType===Node.TEXT_NODE}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}hasClass(e,t){return e.classList.contains(t)}hasID(e,t){return e.id===t}hasAttribute(e,t){return e.hasAttribute(t)}}class k{constructor(e){this.config=e,this.charWidth="10px"}create(){return this._baseStyle()+this._testStyle()}_baseStyle(){return`\n\n@page {\n size: A4;\n /* 2 values: width then height */\n size: ${this.config.printWidth} ${this.config.printHeight};\n\n margin-left: ${this.config.printLeftMargin};\n margin-right: ${this.config.printRightMargin};\n margin-top: ${this.config.printTopMargin};\n /* margin-bottom: ${this.config.printBottomMargin}; */\n margin-bottom: 0; /* hack */\n}\n\n${T.root} {\n /* reset user styles */\n /* protection against unpredictability of margins */\n display: flow-root;\n\n /* for proper printable flow positioning */\n position: relative;\n\n /* to compensate for possible BG in the parent node */\n z-index: 1;\n\n /* set print styles: affects previews */\n margin: 0 auto;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n font-size: ${this.config.printFontSize};\n\n padding-bottom: calc(2 * ${this.config.virtualPagesGap});\n}\n\n${T.contentFlow} {\n display: block;\n}\n\n${T.paperFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: -1;\n /* affect only screen */\n padding-bottom: 100px;\n pointer-events: none;\n}\n\n${T.overlayFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: 2147483647;\n /* affect only screen */\n padding-bottom: 100px;\n pointer-events: none;\n}\n\n${T.contentFlowStart},\n${T.contentFlowEnd},\n${T.pageDivider} {\n display: block;\n /* to avoid the effect of margins of neighboring elements on the positioning of this marker: */\n overflow: auto;\n}\n\n${T.virtualPaper} {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(min-content, max-content) minmax(min-content, max-content) 1fr minmax(min-content, max-content) minmax(min-content, max-content);\n place-items: stretch stretch;\n place-content: stretch stretch;\n width: calc(${this.config.printWidth} - ${this.config.printLeftMargin} - ${this.config.printRightMargin});\n height: ${this.config.printHeight};\n font-size: ${this.config.printFontSize};\n}\n\n${T.virtualPaper}::before {\n position: absolute;\n content: '';\n width: ${this.config.printWidth};\n height: ${this.config.printHeight};\n left: -${this.config.printLeftMargin};\n background-color: #fff;\n box-shadow: rgba(0, 0, 0, 0.1) 2px 2px 12px 0px;\n z-index: -1;\n}\n\n${T.pageChrome} {\n display: block;\n pointer-events: none;\n}\n\n${T.pageFooter},\n${T.pageHeader} {\n display: block;\n position: relative;\n pointer-events: auto;\n}\n\n${T.pageFooter}::before,\n${T.pageHeader}::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n --paper-color: ${this.config.paperColor};\n background: var(--paper-color, white);\n}\n\n${T.pageFooter}::before {\n top: 2px; /* safe space for the last element's border */\n}\n\n${T.pageHeader}::before {\n bottom: 2px; /* safe space for the first element's border */\n}\n\n${T.headerContent},\n${T.footerContent} {\n display: block;\n font-size: small;\n}\n\n${T.headerContent} p,\n${T.footerContent} p {\n margin: 0;\n}\n\n${T.headerContent} {\n padding-bottom: ${this.config.headerMargin};\n /* padding-top: 1px; */\n /* Page numbers: */\n padding-top: 10px;\n}\n\n${T.footerContent} {\n padding-top: ${this.config.footerMargin};\n /* padding-bottom: 1px; */\n /* Page numbers: */\n min-height: 32px;\n}\n\n${T.tocPageNumber} {\n min-width: 3ch;\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n}\n\n${T.pageNumberRoot} {\n display: flex;\n column-gap: 2px;\n position: absolute;\n /* left: 100%; */\n right: 0;\n text-align: right;\n line-height: 1;\n}\n\n${T.headerContent} ${T.pageNumberRoot} {\n top: 0;\n}\n\n${T.footerContent} ${T.pageNumberRoot} {\n bottom: 0;\n}\n\n${T.runningSafety} {\n display: block;\n overflow: auto;\n}\n\n${T.virtualPaperTopMargin} {\n display: block;\n height: ${this.config.printTopMargin};\n}\n\n${T.virtualPaperBottomMargin} {\n display: block;\n height: ${this.config.printBottomMargin};\n}\n\n${T.virtualPaperGap} {\n display: block;\n padding-top: ${this.config.virtualPagesGap};\n}\n\n${T.pageBodySpacer} {\n display: block;\n pointer-events: none;\n}\n\n.null {\n display: inline;\n padding: 0;\n margin: 0;\n font: 0;\n color: transparent;\n line-height: 0;\n border: none;\n outline: none;\n background: none;\n background-color: transparent;\n}\n\n${T.word},\n${T.textNode},\n${T.textLine},\n${T.textGroup},\n${T.neutral},\n${T.neutral} span {\n display: inline;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n line-height: inherit;\n background: none;\n background-color: transparent;\n}\n\n${T.textGroup} {\n display: block;\n}\n\n/*${T.split} ${T.textGroup} {\n display: inline;\n}*/\n\n${T.complexTextBlock} > ${T.textLine} {\n /* Firefox and inconsistent values of offset top for inline element */\n display: inline-block;\n // TODO: it removes spaces between parts of the string, it should leave the text inline after processing.\n}\n\n${T.textGroup} ${T.textLine} {\n display: inline;\n}\n\n${T.complexTextBlock} {\n display: block;\n}\n\n${T.complexTextBlock} ${T.complexTextBlock} {\n display: inline;\n}\n\n${T.printPageBreak} {\n display: flow-root;\n}\n\n${T.printForcedPageBreak} {\n display: block;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n}\n\n@media print {\n ${T.root} {\n /* to prevent a blank last page */\n padding: 0;\n }\n\n ${T.overlayFlow},\n ${T.paperFlow} {\n padding-bottom: 0;\n }\n\n ${T.printIgnore} {\n display: contents !important;\n }\n\n ${T.printHide},\n ${T.paperFlow},\n ${T.virtualPaperTopMargin},\n ${T.virtualPaperBottomMargin},\n ${T.virtualPaperGap} {\n display: none !important;\n }\n\n ${T.pageChrome},\n ${T.frontpageElement},\n ${T.pageBodySpacer} {\n break-inside: avoid;\n }\n\n ${T.printPageBreak} {\n break-after: page;\n overflow: auto;\n }\n\n ${T.printForcedPageBreak} {\n /* JUST MANUAL! */\n /* break-after: page; */\n }\n\n ${T.flagNoBreak} {\n /*\n TODO: temporary commented!\n When splitting blocks, printPageBreak falls INTO this element,\n and in Firefox it causes a blank page.\n FIX the split of complex blocks and check in Firefox.\n */\n /* break-inside: avoid-page; */\n }\n}\n\n/* arrangement */\n${T.topCutPart} {\n margin-top: 0 !important;\n}\n${T.bottomCutPart} {\n margin-bottom: 0 !important;\n}\n${T.cleanTopCut} {\n margin-top: 0 !important;\n padding-top: 0 !important;\n border-top: none !important;\n}\n${T.cleanBottomCut} {\n margin-bottom: 0 !important;\n padding-bottom: 0 !important;\n border-bottom: none !important;\n}\n `}_testStyle(){return this.config.debugMode?`\n/* FOR TEST */\n@media screen {\n\n ${T.contentFlow} {\n background:repeating-linear-gradient(\n -45deg,\n rgba(222, 222, 222, .1),\n rgba(222, 222, 222, .1) 10px,\n rgba(222, 222, 222, .2) 10px,\n rgba(222, 222, 222, .2) 20px\n );\n }\n\n ${T.overlayFlow} {\n background:repeating-linear-gradient(\n 45deg,\n rgba(222, 222, 222, 0),\n rgba(222, 222, 222, 0) 18px,\n rgba(0, 166, 255, 0.05) 18px,\n rgba(0, 166, 255, 0.05) 20px\n );\n }\n\n ${T.virtualPaperGap} {\n background: #ff000020;\n }\n\n ${T.pageFooter},\n ${T.pageHeader} {\n background: #fff1ff99;\n }\n ${T.pageBodySpacer} {\n background: #ffee0020;\n }\n ${T.runningSafety} {\n background: #f200ff;\n outline: 0.1px dashed #f200ff88;\n }\n ${T.frontpageElement} {\n background: #00fcff20;\n }\n\n ${T.neutral} {\n background: #00ffee10;\n }\n\n ${T.textNode} {\n background: #00ff0010;\n }\n\n ${T.textGroup},\n ${T.textLine} {\n background: #0000ff08;\n }\n}\n `:""}}class B{constructor({config:e,DOM:t,node:n,selector:o}){this.success=!1,this._assert=!!e.consoleAssert,Object.assign(this,i),this.root,this.paperFlow,this.contentFlow,this.overlayFlow,this.frontpageTemplate,this.headerTemplate,this.footerTemplate,this._initialRoot,this._contentRoot,this._config=e,this._debug=e.debugMode?{...e.debugConfig.layout}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._customInitialRootSelector=e.initialRoot,this._defaultInitialRootSelector=o.init}create(){if(this._getTemplates(),this._insertStyle(),this._DOM.getElement(`style${this._selector.style}`)){if(this._createLayout(),this._DOM.getParentNode(this.root)!==this._initialRoot||this._DOM.getElementOffsetParent(this.paperFlow)!==this.root||this._DOM.getElementOffsetParent(this.contentFlow)!==this.root||this._DOM.getElementOffsetParent(this.overlayFlow)!==this.root)return this.strictAssert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),this.strictAssert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void this.strictAssert(this._DOM.getElementOffsetParent(this.contentFlow)===this.root,"Failed to insert the contentFlow element into the DOM.");this.success=!0}else console.error("Failed to add print styles into the DOM.")}_getTemplates(){this.strictAssert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),this.strictAssert(this._selector.headerTemplate,"headerTemplate selector is missing"),this.strictAssert(this._selector.footerTemplate,"footerTemplate selector is missing"),this.frontpageTemplate=this._DOM.getInnerHTML(this._selector.frontpageTemplate),this.headerTemplate=this._DOM.getInnerHTML(this._selector.headerTemplate),this.footerTemplate=this._DOM.getInnerHTML(this._selector.footerTemplate)}_insertStyle(){this._node.insertStyle(new k(this._config).create())}_createLayout(){this._getInitialRoot(),this._initialRoot?(this.log("create Layout","initial root:",this._initialRoot),this._createRoot(),this._createPaperFlow(),this._createContentFlow(),this._createOverlayFlow(),this._DOM.moveContent(this._initialRoot,this.contentFlow),this._DOM.insertAtEnd(this._initialRoot,this.root),this._DOM.insertAtEnd(this.root,this.paperFlow,this.overlayFlow,this.contentFlow),this._insertContentFlowStartAndEnd(this.contentFlow),this._ignoreUnprintableEnvironment(this.root)):console.error("Failed to initialize the root element.")}_insertContentFlowStartAndEnd(e){const t=this._node.create(this._selector.contentFlowStart),i=this._node.create(this._selector.contentFlowEnd);return this._DOM.insertAtStart(e,t),this._DOM.insertAtEnd(e,i),{contentFlowStart:t,contentFlowEnd:i}}_getInitialRoot(){let e=this._customInitialRootSelector?this._DOM.getElement(this._customInitialRootSelector):this._DOM.getElement(this._defaultInitialRootSelector);if(!e){if(!this._DOM.body)return void console.error("We expected to find the BODY tag.");e=this._DOM.body,console.warn(`The printable area is currently unspecified and encompasses the entire contents of the BODY tag. To restrict the printed content to a specific area, include ${this._defaultInitialRootSelector} in the root element of the desired printing area.`)}return this._initialRoot=e,e}_createRoot(){const e=this._node.create(this._selector.root);return this._DOM.setStyles(e,{visibility:"hidden"}),this.root=e,e}_createPaperFlow(){const e=this._node.create(this._selector.paperFlow);return this.paperFlow=e,e}_createOverlayFlow(){const e=this._node.create(this._selector.overlayFlow);return this.overlayFlow=e,e}_createContentFlow(){const e=this._node.create(this._selector.contentFlow);return this.contentFlow=e,e}_ignoreUnprintableEnvironment(e){if(e===this._DOM.body)return void this.strictAssert(!1,"misshapen root");let t=this._DOM.getParentNode(e);this._DOM.setAttribute(t,this._selector.printIgnore),this._DOM.getChildNodes(t).forEach((t=>{if(t!==e&&this._DOM.isElementNode(t))this._DOM.setAttribute(t,this._selector.printHide);else{if(!this._node.isSignificantTextNode(t))return;{const e=this._node.createTextNodeWrapper();this._DOM.wrap(t,e),this._DOM.setAttribute(e,this._selector.printHide)}}})),this._DOM.isDocumentBody(t)||this._ignoreUnprintableEnvironment(t)}}function N(e){return function(t){return t._config.debugMode&&t._debug[e]}}const A=N("selectors");function H(e,t){if(!e||!t)return void(A(this)&&console.warn("isSelectorMatching() must have 2 params","\n element: ",e,"\n selector: ",t));const i=t.charAt(0);if("."===i){const i=t.substring(1);return this._DOM.hasClass(e,i)}if("#"===i){const i=t.substring(1);return this._DOM.hasID(e,i)}if("["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return this._DOM.hasAttribute(e,i)}return this._DOM.getElementTagName(e)===t.toUpperCase()}function I(e){return!!this._DOM.isTextNode(e)&&this._DOM.getNodeValue(e).trim().length>0}function L(e){return"STYLE"===this._DOM.getElementTagName(e)}function $(e){return"IMG"===this._DOM.getElementTagName(e)}function G(e){return"svg"===this._DOM.getElementTagName(e)}function W(e){return"OBJECT"===this._DOM.getElementTagName(e)}function z(e){return"LI"===this._DOM.getElementTagName(e)}function j(e){return this.isSelectorMatching(e,this._selector.neutral)}function V(e){return this.isSelectorMatching(e,this._selector.textNode)}function U(e){return this.isSelectorMatching(e,this._selector.textLine)}function q(e){return this.isSelectorMatching(e,this._selector.textGroup)}function K(e){return this.isSelectorMatching(e,this._selector.pageStartMarker)}function Y(e){return this.isSelectorMatching(e,this._selector.contentFlowStart)}function Z(e){const t=this._DOM.getLeftNeighbor(e);return this.isSelectorMatching(t,this._selector.contentFlowStart)}function J(e){return this.isSelectorMatching(e,this._selector.contentFlowEnd)}function X(e){return this.isSelectorMatching(e,this._selector.complexTextBlock)}function Q(e){return this.isComplexTextBlock(e)||this.isWrappedTextNode(e)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)}function ee(e,t){return this.isSelectorMatching(e,this._selector.flagNoBreak)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)||this.isInlineBlock(e,t)||this.notSolved(e)}function te(e){return this.isSelectorMatching(e,this._selector.flagNoHanging)}function ie(e){return this.isSelectorMatching(e,this._selector.flagSlice)}function ne(e){return this.isSelectorMatching(e,this._selector.printForcedPageBreak)}function oe(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline"===i||"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function re(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function se(e,t){if(!(e instanceof HTMLElement))return;return"grid"===(t||this._DOM.getComputedStyle(e)).display}function le(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return"TABLE"!==this._DOM.getElementTagName(e)&&["table"].includes(i.display)}function ae(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return"TABLE"===this._DOM.getElementTagName(e)||["table"].includes(i.display)}function he(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return["block"].includes(i.display)&&["pre","pre-wrap","pre-line","break-spaces","nowrap"].includes(i.whiteSpace)}function ce(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),n=i.display,o=i.gridAutoFlow;return("grid"===n||"inline-grid"===n)&&"row"===o}function ge(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),n=i.display;if("flex"!==n&&"inline-flex"!==n)return!1;return(i.flexDirection||"").startsWith("row")}function de(e,t){const i=t||this._DOM.getComputedStyle(e);return this.isPRE(e,i)||this.isTableNode(e,i)||this.isTableLikeNode(e,i)||this.isGridAutoFlowRow(e,i)}function pe(e){return this._DOM.hasAttribute(e,"slough-node")}function ue(e,t=""){const i=this._DOM.getElement("head"),n=this._DOM.body;if(!i&&!n)return void console.error("Check the structure of your document. We didn`t find HEAD and BODY tags. HTML2PDF4DOC expects valid HTML.");const o=this.create("style",e);o?(this._DOM.setAttribute(o,this._selector.style,t),i?this._DOM.insertAtEnd(i,o):n?this._DOM.insertBefore(n,o):this.strictAssert(!1,"We expected to find the HEAD and BODY tags.")):console.error("Failed to create print styles")}const _e=N("positioning");function fe(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getFirstElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function me(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getParentNode(i)===t){let e=this._DOM.getRightNeighbor(i);for(;!this._DOM.getElementOffsetHeight(e)&&!this._DOM.getElementOffsetWidth(e);)if(e=this._DOM.getRightNeighbor(e),this.isContentFlowEnd(e))return!0;return this.isContentFlowEnd(e)}if(this._DOM.getLastElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function be(e,t){return this._DOM.getElementOffsetTop(t)-this._DOM.getElementOffsetBottom(e)>-2}function we(e,t){const i=this._DOM.getElementOffsetBottom(e),n=this._DOM.getElementOffsetTop(t),o=i-n,r=o>=2;return _e(this)&&console.group("isLineKept?"),_e(this)&&console.log("\n",r,"\n","\n currentBottom",i,[e],"\n nextTop",n,[t],"\n delta",o),_e(this)&&console.groupEnd("isLineKept?"),r}function Se(e,t,i){const n="[init-position]",o="[init-vertical-align]",r="relative",s=i||this._DOM.getComputedStyle(t),l=s.position,a=s.verticalAlign;if(e)l!=r&&(this._DOM.setStyles(t,{position:r}),this._DOM.setAttribute(t,n,l)),"top"!=a&&(this._DOM.setStyles(t,{"vertical-align":"top"}),this._DOM.setAttribute(t,o,a));else{const e=this._DOM.getAttribute(t,n),i=this._DOM.getAttribute(t,o);e&&(this._DOM.setStyles(t,{position:e}),this._DOM.removeAttribute(t,n)),i&&(this._DOM.setStyles(t,{"vertical-align":i}),this._DOM.removeAttribute(t,o))}}function Me(e,{prefer:t="self"}={}){if(!e)return null;const i=e=>"last"===t?this._DOM.getLastElementChild(e):"first"===t||"self"===t?this._DOM.getFirstElementChild(e):null,n=new Set;let o=e;for(;o&&!n.has(o);){n.add(o);if(this._DOM.getElementOffsetParent(o))return o;const e=this._DOM.getComputedStyle(o);if(!e)return null;const t=e.display,r=e.visibility,s=e.position;if("none"===t||"collapse"===r||"fixed"===s)return null;if("contents"!==t)return null;{const e=i.call(this,o);if(!e)return null;o=e}}return null}const Pe=N("getters");function Ce(e,t){return this.getTop(e,t)}function Oe(e,t,i){const n=i||this._DOM.getComputedStyle(t),o=parseFloat(n.paddingTop)||0;return this.getTop(e,t)-o}function ye(e,t,i){const n=i||this._DOM.getComputedStyle(t),o=parseFloat(n.paddingTop)||0;return this.getBottomWithMargin(e,t)-o}function Te(e,t=null,i=0){if(!e)return void(Pe(this)&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0));if(null===t)return this._DOM.getElementOffsetTop(e);if(!t)return void(Pe(this)&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0));const n=this._DOM.getElementOffsetParent(e);if(!n)return void(Pe(this)&&console.warn("Element has no offset parent.","\n element:",[e],"\n offsetParent:",n,"\n The function returned:",void 0));const o=this._DOM.getElementOffsetTop(e);return n===t?o+i:this.getTop(n,t,i+o)}function Ee(e,t=null){if(e){if(null===t)return this._DOM.getElementOffsetBottom(e);if(t)return this.getTop(e,t)+this._DOM.getElementOffsetHeight(e);Pe(this)&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0)}else Pe(this)&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0)}function De(e,t){if(!e)return;const i=this.getBottom(e,t);let n;const o=this.createNeutralBlock();this._DOM.insertAfter(e,o);const r=this.getTop(o,t);this._DOM.removeNode(o);if(r>=i)n=r;else{n=i+parseInt(this._DOM.getComputedStyle(e).marginBottom)}return n}function ve(e){const t=parseInt(this._DOM.getComputedStyle(e).marginTop),i=parseInt(this._DOM.getComputedStyle(e).marginBottom);return this._DOM.getElementOffsetHeight(e)+t+i}function Re(e,t){const i=parseInt(this._DOM.getComputedStyle(e).marginTop);return this.getTop(e,t)-i}function xe(e){const t=this.create();this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetWidth(t);return this._DOM.removeNode(t),i}function Fe(e,t="",i=!0){const n=this.create();i&&this._DOM.setStyles(n,{overflow:"auto"});const o=this._DOM.cloneNodeWrapper(e);this._DOM.setInnerHTML(o,t),this._DOM.insertAtEnd(n,o),this._DOM.insertBefore(e,n);const r=this._DOM.getElementOffsetHeight(n);return this._DOM.removeNode(n),r}function ke(e){const t=this.createNeutral();this._DOM.setInnerHTML(t,"!"),this._DOM.setStyles(t,{display:"block"}),this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetHeight(t);return this._DOM.removeNode(t),i}function Be(e,t=0){const i=this._DOM.getElementOffsetTop(e),n=this._DOM.cloneNode(e),o="!
".repeat(t);[...n.children].forEach((e=>this._DOM.setInnerHTML(e,o))),this._DOM.insertBefore(e,n);const r=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(n),r-i}function Ne(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e);this._DOM.insertBefore(e,i);const n=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(i),n-t}function Ae(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e),n=e.children.length,o=[...e.children];this._DOM.insertBefore(e,i);const r=[];for(let s=0;sthis._DOM.removeNode(e)))}return this._DOM.removeNode(i),r}function He(e){if(!(e instanceof HTMLElement)||"TABLE"!==e.tagName)throw new Error("Expected a element.");const t=[...e.children].reduce(((e,t)=>{const i=t.tagName;return"TBODY"===i?{...e,rows:[...e.rows,...t.children]}:"CAPTION"===i?(this.setFlagNoBreak(t),{...e,caption:t}):"COLGROUP"===i?(this.setFlagNoBreak(t),{...e,colgroup:t}):"THEAD"===i?(this.setFlagNoBreak(t),{...e,thead:t}):"TFOOT"===i?(this.setFlagNoBreak(t),{...e,tfoot:t}):"TR"===i?{...e,rows:[...e.rows,...t]}:(Pe(this)&&t&&console.warn("unexpected:",t),{...e,unexpected:[...e.unexpected,...t]})}),{caption:null,thead:null,tfoot:null,rows:[],unexpected:[]});return t.unexpected.length>0&&Pe(this)&&console.warn(`something unexpected is found in the table ${e}`),t}function Ie(e,t){const i=t||this._DOM.getComputedStyle(e),n=this.createNeutralBlock();this._DOM.setStyles(n,{display:"block",padding:"0",margin:"0",border:"0",height:"0",clear:"both",visibility:"hidden",contain:"layout"}),this._DOM.insertAtEnd(e,n);const o=this.getNormalizedTop(n,e,i);return this._DOM.removeNode(n),o}N("creators");function Le(e,t){let i;if(e){const t=e.charAt(0);if(t.match(/[#\[\.]/))i=this._DOM.createElement("div"),this._DOM.setAttribute(i,e);else{if(!t.match(/[a-zA-Z]/))return void this.strictAssert(!1,"Expected valid html selector ot tag name, but received:",e);i=this._DOM.createElement(e)}}else i=this._DOM.createElement("div");return t&&this._DOM.setInnerHTML(i,t),i}function $e(){return this.create(this._selector.neutral)}function Ge(){const e=this.createNeutral();return e.style.display="block",e.style.clear="both",e}function We(){return this.create(this._selector.textNode)}function ze(){return this.create(this._selector.textLine)}function je(){return this.create(this._selector.textGroup)}function Ve(e){const t=this.create(this._selector.flagNoBreak);return e&&this._DOM.setStyles(t,e),t}function Ue(){return this.create(this._selector.printPageBreak)}function qe(){return this.create(this._selector.complexTextBlock)}function Ke(e){const t=this._DOM.cloneNodeWrapper(e);return this._DOM.setAttribute(t,".test-node"),this._DOM.setStyles(t,{position:"absolute",background:"rgb(255 239 177)",width:this.getMaxWidth(e)+"px"}),t}function Ye(e,t){const i=this.create(this._selector.word);return this._DOM.setInnerHTML(i,e),i.dataset.index=t,i}function Ze(){return this.create(this._selector.printForcedPageBreak)}function Je(e,t){if(!t)return null;const i=this.create();return this._DOM.setStyles(i,{display:"flex",flexWrap:"nowrap",alignItems:"center",justifyContent:"center",textAlign:"center",fontSize:"8px",fontFamily:"sans-serif",letterSpacing:"1px",textTransform:"uppercase",height:t+"px"}),e&&this._DOM.setInnerHTML(i,e),this.setFlagNoBreak(i),i}function Xe({wrapper:e,caption:t,colgroup:i,thead:n,tfoot:o,tbody:r}){const s=e||this.create("table"),l=this.create("TBODY");return t&&this._DOM.insertAtEnd(s,t),i&&this._DOM.insertAtEnd(s,i),n&&this._DOM.insertAtEnd(s,n),r&&this._DOM.insertAtEnd(l,...r),this._DOM.insertAtEnd(s,l),o&&this._DOM.insertAtEnd(s,o),s}function Qe(e){const t=this._DOM.cloneNodeWrapper(e);return this.unmarkPageStartElement(t),this.setFlagNoBreak(t),t}N("splitters");function et(e){return e.split(/(?<=\n)/)}function tt(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).split(/(?<=\s|-)/)}function it(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).trim().split(/(?<=\s|-)/).filter((e=>" "!=e))}function nt(e){const t=e,i=this.splitTextByWordsGreedy(e),n=i.map((e=>{const t=this._DOM.createElement("span");return this._DOM.setInnerHTML(t,e+" "),t})),o=this.createTestNodeFrom(e);return this._DOM.insertAtEnd(o,...n),this._DOM.insertAtEnd(e,o),{splittedNode:t,nodeWords:i,nodeWordItems:n}}const ot=N("markers");function rt(e,t){this._markupDebugMode&&this._DOM.setAttribute(e,this._selector.processed,"šŸ·ļø "+t)}function st(e){this._DOM.setAttribute(e,this._selector.flagNoBreak)}function lt(e,t){this._DOM.setAttribute(e,this._selector.flagNoHanging,t)}function at(e){this._DOM.setAttribute(e,this._selector.flagSlice)}function ht(e,t){this._DOM.setAttribute(e,this._selector.pageStartMarker,t)}function ct(e){this._DOM.removeAttribute(e,this._selector.pageStartMarker)}function gt(e,t){this._DOM.setAttribute(e,this._selector.pageEndMarker,t)}function dt(e){ot(this)&&console.log("[mark ⊤ cut]",e),e&&this._DOM.setAttribute(e,this._selector.cleanTopCut)}function pt(e){ot(this)&&console.log("[mark ⊄ cut]",e),e&&this._DOM.setAttribute(e,this._selector.cleanBottomCut)}function ut(e){ot(this)&&console.log("[mark ⊤ cut]",e),e&&this._DOM.setAttribute(e,this._selector.topCutPart)}function _t(e){ot(this)&&console.log("[mark ⊄ cut]",e),e&&this._DOM.setAttribute(e,this._selector.bottomCutPart)}function ft(e){if(e&&e.length)if(1!==e.length)for(let t=0;t0,n=t0,o=t","color:blue",i),r=i,s=[...this._DOM.getChildren(i)]):Array.isArray(i)?(ot(this)&&console.log("%c[markSliceCutsInRows] It is an Array","color:blue",i),r=void 0,s=i):this.strictAssert(0,"we expected TR or an array of elements!"),!r&&!s.length){ot(this)&&console.log("%c[markSliceCutsInRows] There was no split","color:red",{rowWrapper:r,cellWrappers:s});break}n&&(r&&(ot(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊄",r),this.markTopCut(r)),s.forEach((e=>{ot(this)&&console.log("[markSliceCutsInRows] cell šŸ–ļø ⊄",e),this.markTopCut(e)}))),o&&(r&&(ot(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊤",r),this.markBottomCut(r)),s.forEach((e=>{ot(this)&&console.log("[markSliceCutsInRows] cell šŸ–ļø ⊤",e),this.markBottomCut(e)})))}else ot(this)&&console.log("%c[markSliceCutsInRows] The rows were not passed. Doing nothing.","color:red")}N("wrappers");function bt(e){const t=this._DOM.getChildren(e),i=this.createNeutralBlock();return this._DOM.insertAtStart(i,...t),this._DOM.insertAtStart(e,i),i}const wt=N("fitters");function St({element:e,height:t,width:i,vspace:n,hspace:o}){const r=n/t,s=o/i,l=ra&&(d||(d=this.wrapNodeChildrenWithNeutralBlock(s),g=this._DOM.getElementOffsetHeight(d)||g),this.fitElementWithinHeight(d,a),o=!0,wt(this)&&console.warn("šŸ’¢ scaleCellsToHeight: resized cell content",{cell:s,target:a}))}return o}function Ct(e,t){this._DOM.setStyles(e,{"box-sizing":"border-box",width:`${this._DOM.getElementOffsetWidth(t)}px`,"min-width":`${this._DOM.getElementOffsetWidth(t)}px`})}function Ot(e){this.copyNodeWidth(e,e),this._DOM.getAll("td",e).forEach((e=>this.copyNodeWidth(e,e)))}function yt(e){Array.isArray(e)&&e.forEach((e=>{e&&this.copyNodeWidth(e,e)}))}function Tt(e,t={}){const{descentRatio:i=.22,normalLH:n=1.2,safety:o=1}=t,r=getComputedStyle(e),s=parseFloat(r.fontSize)||0;let l;if("normal"!==r.lineHeight&&r.lineHeight){const e=parseFloat(r.lineHeight);l=Number.isFinite(e)?e:n*s}else l=n*s;const a=(Math.max(0,(l-s)/2)+i*s)*o;return Math.ceil(a)}const Et=N("pageBreaks");function Dt(e,t){let i=e;for(;;){const e=this.findFirstChildParent(i,t);if(e&&e!==i){i=e;continue}const n=Lt.call(this,i,"findBetterForcedPageStarter:left");if(!n||!this.isNoHanging(n))break;i=n}return i}function vt(e,t,i){Et(this)&&console.group("āž— findBetterPageStart");let n=!1,o=!1,r=!1;const s=this.getTop(t,i);Et(this)&&console.log("Start calculations:",{pageStart:e,lastPageStart:t,root:i,topLimit:s});const l=this.findFirstChildParentFromPage(e,s,i);let a;if(l)a=l;else{a=this.getTop(e,i)t?n:null}function Nt(e){return this._DOM.getAll(this._selector.printForcedPageBreak,e)}function At(e,t){let i=this._DOM.getParentNode(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getParentNode(i);return i}function Ht(e,t){let i=this._DOM.getFirstElementChild(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getRightNeighbor(i);return i}function It(e,t){let i=this._DOM.getLastElementChild(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getLeftNeighbor(i);return i}function Lt(e,t){let i=this._DOM.getLeftNeighbor(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getLeftNeighbor(i);return i}const $t=N("children");function Gt(e){$t(this)&&console.group("🚸 getPreparedChildren of",e);let t=[];if(this.isComplexTextBlock(e))t=[...this._DOM.getChildren(e)],$t(this)&&console.info("🚸 getPreparedChildren: return children for complexTextBlock",t);else{if(!Yt.call(this,e))return $t(this)&&console.info("🪲 getPreparedChildren: empty node, skip & return []",e),[];{$t(this)&&console.groupCollapsed("āš—ļøšŸšø distill children"),t=[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this.isSTYLE(t))return $t(this)&&console.info("🚸 (getPreparedChildren) ignore STYLE",[t]),e;if(this.isSignificantTextNode(t)){const i=this.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),$t(this)&&console.info("🚸 (getPreparedChildren) wrap and return TEXT NODE",[t]),e}if(this._DOM.isElementNode(t)){if(this.shouldSkipFlowElement(t,{context:"getPreparedChildren"}))return e;if(!this._DOM.getElementOffsetParent(t)){const i=this.getPreparedChildren(t);return i.length>0&&e.push(...i),$t(this)&&console.info("%c🚸 (getPreparedChildren) * no offset parent — unwrapped","color:green",i,[t]),e}return e.push(t),$t(this)&&console.info("🚸 (getPreparedChildren) * normal node",[t]),e}return $t(this)&&console.info("%c🚸 (getPreparedChildren) IGNORE whitespace / comment ...","color:red",[t]),e}),[]),$t(this)&&console.groupEnd("āš—ļøšŸšø distill children"),$t(this)&&console.info("🚸 distilled children",t);const i=Kt.call(this,t),n=this.isInline(e);i&&($t(this)&&console.info("🚸 isVerticalFlowDisrupted in children of element",[e]),n?($t(this)&&console.info("šŸŽ’šŸšø parent element is inline wrapper",[e]),t=[Ut.call(this,e)]):t=Vt.call(this,t))}}return $t(this)&&console.groupEnd("🚸 getPreparedChildren of"),$t(this)&&console.info("🚸 getPreparedChildren:",t),t}function Wt(e,t,i,n){let o=[];if(this.isNoBreak(e))return $t(this)&&console.info("🧔 isNoBreak",e),[];if(this.isComplexTextBlock(e))return $t(this)&&console.info("šŸ’š ComplexTextBlock",e),this._paragraph.split(e)||[];if(this.isWrappedTextNode(e))return $t(this)&&console.info("šŸ’š TextNode",e),this._paragraph.split(e)||[];if(!Yt.call(this,e))return $t(this)&&console.info("🪲 getSplitChildren: empty node, return []",e),[];const r=this._DOM.getComputedStyle(e);if(this.isTableLikeNode(e,r))$t(this)&&console.info("šŸ’š TABLE like",e),o=this._tableLike.split(e,t,i,n,r)||[];else if(this.isTableNode(e,r))$t(this)&&console.info("šŸ’š TABLE",e),o=this._table.split(e,t,i,n)||[];else if(this.isPRE(e,r))$t(this)&&console.info("šŸ’š PRE",e),o=this._pre.split(e,t,i,n,r)||[];else if(this.isFlexRow(e,r)){$t(this)&&console.info("🩷 Flex ROW",e);let t=this.getPreparedChildren(e);o=qt.call(this,t)}else this.isGridAutoFlowRow(e,r)?($t(this)&&console.info("šŸ’œ GRID"),o=this._grid.split(e,t,i,n)||[]):($t(this)&&console.info("šŸ’š found some node - use main this.getPreparedChildren() for:",e),o=this.getPreparedChildren(e));return o}function zt(e){const t=[];if(!e||!this||!this._DOM)return t;let i=e;for(;i;){let e=this._DOM.getFirstElementChild(i);for(;e&&this.shouldSkipFlowElement(e,{context:"getFirstChildren:firstChild"});)e=this._DOM.getRightNeighbor(e);if(!e)break;if(this.isSyntheticTextWrapper(e))break;t.push(e),i=e}return t}function jt(e){const t=[];if(!e||!this||!this._DOM)return t;let i=e;for(;i;){let e=this._DOM.getLastElementChild(i);for(;e&&this.shouldSkipFlowElement(e,{context:"getLastChildren:lastChild"});)e=this._DOM.getLeftNeighbor(e);if(!e)break;if(this.isSyntheticTextWrapper(e))break;t.push(e),i=e}return t}function Vt(e){let t=null;const i=[];return e.forEach((e=>{this.isInline(e)?(t||(t=Ut.call(this,e),i.push(t)),this._DOM.insertAtEnd(t,e)):(t=null,i.push(e))})),i}function Ut(e){const t=this.createComplexTextBlock();return this._DOM.wrap(e,t),t}function qt(e){const t=e.filter((e=>this._DOM.getElementOffsetHeight(e)>0));return t.length>0?t:e}function Kt(e){return e.some(((e,t,i)=>{const n=e,o=i[t+1];if(!o)return!1;return this._DOM.getElementOffsetBottom(n)>this._DOM.getElementOffsetTop(o)}))}function Yt(e){let t=e.firstChild;for(;t;){if(this._DOM.isElementNode(t)){if(!this.shouldSkipFlowElement(t,{context:"hasRenderableChild"}))return!0}else if(this.isSignificantTextNode(t))return!0;t=t.nextSibling}return!1}const Zt=N("media"),Jt=new Set(["IMG","SVG","OBJECT","EMBED","IFRAME","VIDEO","AUDIO","CANVAS"]);function Xt(e,t="self"){return"last"===t?this._DOM.getLastElementChild(e):this._DOM.getFirstElementChild(e)}function Qt(e){if(!e)return!1;const t=this._DOM.getElementTagName(e);if(!t)return!1;if("INPUT"===t){return"image"===(this._DOM.getAttribute(e,"type")||"").toLowerCase()}return Jt.has(t)}function ei(e,{prefer:t="self"}={}){if(!e)return null;const i=new Set;let n=e;for(;n&&!i.has(n);){if(i.add(n),this.isReplacedElement(n))return n;if("function"==typeof this.resolveFlowElement){const e=this.resolveFlowElement(n,{prefer:t});if(e&&e!==n){if(this.isReplacedElement(e))return e;n=e;continue}}const e=[...this._DOM.getChildren(n)].filter((e=>{const t=this._DOM.getComputedStyle(e)?.display;return"none"!==t}));if(1!==e.length)return Zt(this)&&console.info("🧭 resolveReplacedElement: branching or empty wrapper",n,e),null;n=Xt.call(this,n,t)||e[0]}return null}const ti=N("slicers");function ii({rootNode:e,rootComputedStyle:t,children:i,firstPartHeight:n,fullPageHeight:o,firstChild:r,points:s=[]}){if(!i.length)return ti(this)&&console.log("🧶 [getSplitPoints] %c has no children, early returns []","font-weight:bold",{rootNode:e}),[];const l=t=>{const i=this.findBetterPageStart(t,s.at(-1),e,e);return s.length||i!==r?(ti(this)&&console.log("%c 🧼🧼🧼🧼 push(point) in registerPoint()","color:violet",{point:i,points:s,firstChild:r},s.length),s.push(i),!1):(ti(this)&&console.log("%c !points.length && point === children[0] && children[1]","color:red"),ti(this)&&console.log("%c šŸ…¾ļø push(null) in registerPoint()","color:red"),s.push(null),!0)};ti(this)&&console.group("🧶 getSplitPoints"),ti(this)&&console.log("points.length",s.length);const a=t||this._DOM.getComputedStyle(e),h=new WeakMap,c=e=>{let t=h.get(e);return t||(t=Object.create(null),h.set(e,t)),t},g=t=>{if(!t)return NaN;const i=c(t);return"top"in i||(i.top=this.getNormalizedTop(t,e,a)),i.top},d=t=>{if(!t)return NaN;const i=c(t);return"bottomWithMargin"in i||(i.bottomWithMargin=this.getNormalizedBottomWithMargin(t,e,a)),i.bottomWithMargin},p=e=>{if(!e)return 0;const t=c(e);return"offsetHeight"in t||(t.offsetHeight=this._DOM.getElementOffsetHeight(e)),t.offsetHeight};this.setInitStyle(!0,e,a);let u=!1;const _=()=>(u||(u=!0,ti(this)&&console.groupEnd(`walking through ${i.length} children`),this.setInitStyle(!1,e,t),ti(this)&&console.groupEnd("getSplitPoints")),s);ti(this)&&console.group(`walking through ${i.length} children`,i);for(let t=0;th))if(ti(this)&&console.log("[getSplitPoints]",`next overtook the floater : (nextElementTop) ${b} > ${h}`,{currentElement:u},"does current overflow? let's check.",{isNextElementTopFinite:w}),(this.isSVG(u)||this.isIMG(u))&&ti(this)&&console.log("%cIMAGE","color:red;text-weight:bold"),S=d(u),S<=h){if(w){ti(this)&&console.log("[getSplitPoints]",`current fits: (currentElementBottom) ${S} <= ${h}, šŸŽ register nextElement as Point.`,{currentElement:u,nextElement:m});if(l(m))return ti(this)&&console.log("%cNULL CASE, return","color:red;text-weight:bold"),_();continue}ti(this)&&console.log("[getSplitPoints] nextElementTop not finite and current fits tail window",{currentElementBottom:S,floater:h,nextElement:m})}else ti(this)&&console.log(`šŸ”ŖšŸ„’ try to split overflowing current: (currentElementBottom > ) ${S} > ${h}`,{currentElement:u}),M=!0;if(!m){ti(this)&&console.log("%c[getSplitPoints] !nextElement","color:red"),ti(this)&&console.log("%c[getSplitPoints] * Try to split it. šŸ”ŖšŸ„’","color:blue"),S=S??d(u);let t=u;if(u.parentElement&&e.contains(u.parentElement)){let i=u.parentElement;for(;i&&e.contains(i)&&i!==e&&!this._DOM.getRightNeighbor(i);)t=i,i=i.parentElement}const i=t===u?S:d(t);if(i<=h){ti(this)&&console.log("%c šŸ• [getSplitPoints] !nextElement branch fits with container shell","color:violet",{currentElementBottom:S,containerBottom:i,floater:h,containerElement:t});continue}M=!0}if(!M)continue;let P=[];const C=this.getSplitChildren(u,n,o,e);if(C.length){if(P=ii.call(this,{rootNode:e,rootComputedStyle:a,children:C,firstPartHeight:n,fullPageHeight:o,firstChild:r,points:s}),0===P.length){const e=Math.max(n,o),t=p(u),i=t>e&&(!P.length||1===P.length&&null===P[0]);if(ti(this)&&console.log("room (Math.max)",e),i){if(ti(this)&&console.warn("%cāš ļø UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",u,`height: ${t}`),!s.length&&u===r)return ti(this)&&console.warn("šŸ…¾ļø (1) points.push(null) in isUnbreakableOversized"),s.push(null),_();if(m){if(l(m))return _()}}else if(l(u))return _()}}else{ti(this)&&console.log("šŸŽ currentElementChildren.length == 0");const e=p(u);if(e>c&&(!P.length||1===P.length&&null===P[0])){if(ti(this)&&console.warn("%cāš ļø UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",u,`height: ${e}`),ti(this)&&console.warn("šŸ…¾ļø (2) points.push(null) in isUnbreakableOversized"),!s.length&&u===r)return s.push(null),_();if(m){ti(this)&&console.warn("šŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļø registerPoint(nextElement)");if(l(m))return _()}}else{if(l(u))return _()}}}return _()}function ni(e,t,i,n,o){ti(this)&&console.group("[āœ–ļø] getSplitPointsPerCells");const r=e.map(((e,r)=>{ti(this)&&console.group(`(•) Split CELL.${r} in:`,o);let s=[];const l=i-(t[r]||0),a=n-(t[r]||0);let h=this.getSplitChildren(e,l,a,o);if(h.length){const t=h[0];ti(this)&&console.log("firstChild",t),s=this.getSplitPoints({rootNode:e,children:h,firstPartHeight:l,fullPageHeight:a,firstChild:t})}else ti(this)&&console.log(`(•) empty cell #${r}`);return ti(this)&&console.log(`(•) return splitPoints for CELL#${r}`,s),ti(this)&&console.groupEnd(),s})),s=r.some(li);ti(this)&&console.log("🧽🧽🧽🧽🧽🧽🧽 isFirstPartEmptyInAnyCell",s);let l=r,a=!1;if(s){l=e.map(((e,r)=>{ti(this)&&console.group(`(••) Split CELL.${r} in:`,o);const s=i-(t[r]||0),l=n-(t[r]||0),a=this.getSplitChildren(e,s,l,o),h=a[0];ti(this)&&console.log("firstChild",h);let c=[];return a.length&&(c=this.getSplitPoints({rootNode:e,children:a,firstPartHeight:l,fullPageHeight:l,firstChild:h})),ti(this)&&console.log(`(••) return splitPoints for CELL#${r}`,c),ti(this)&&console.groupEnd(),c})),ti(this)&&console.log("[••] splitPointsPerCell",l);for(let e=0;e0&&this.strictAssert(i.every((e=>null!==e)),"sliceNodeBySplitPoints: splitPoints contains null — sanitize upstream before slicing"),this.strictAssert(i.every((e=>!e||e.nodeType===Node.ELEMENT_NODE&&(t===e||t.contains(e)))),"sliceNodeBySplitPoints: split point is not an Element within rootNode");for(let e=0;e<=i.length;e++){const o=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,o,r);this.normalizeContentCuts({slice:s,top:null!==o,bottom:null!==r}),this._DOM.getChildNodes(s).length>0&&n.push(s)}return ti(this)&&console.log(n),ti(this)&&console.groupEnd(`šŸ”Ŗ (${e}) sliceNodeBySplitPoints`),n}function ri({slice:e,top:t=!1,bottom:i=!1}){if(e){if(t){const t=[...this.getFirstChildrenChain(e)];t.forEach((e=>this.markCleanTopCut(e))),ti(this)&&console.log("[normalizeContentCuts] topChain šŸ‘—",t)}if(i){const t=[...this.getLastChildrenChain(e)];t.forEach((e=>this.markCleanBottomCut(e))),ti(this)&&console.log("[normalizeContentCuts] bottomChain šŸ‘—",t)}}else ti(this)&&console.log("[normalizeContentCuts] no slice has been passed; return")}function si({index:e,rootNode:t,splitPoints:i}){ti(this)&&console.group(`šŸ”Ŗ (${e}) sliceNodeContentBySplitPoints`);const n=[];for(let e=0;e<=i.length;e++){const o=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,o,r);ti(this)&&console.log({slice:s});const l=this.createNeutralBlock();for(;s.firstChild;)l.appendChild(s.firstChild);l.childNodes.length>0&&n.push(l)}return ti(this)&&console.log(n),ti(this)&&console.groupEnd(`šŸ”Ŗ (${e}) sliceNodeContentBySplitPoints`),n}function li(e){return!!Array.isArray(e)&&(e.length>0&&null===e[0])}function ai(e,t,i){t&&t.setAttribute("split","start"),i&&i.setAttribute("split","end");let n=e.cloneNode(!0);if(t){let t=n.querySelector('[split="start"]'),i=t.previousElementSibling;for(;i;){let e=i;i=i.previousElementSibling,e.remove()}let o=t.parentElement;for(;o&&o!==e;){let e=o.previousElementSibling;for(;e;){let t=e;e=e.previousElementSibling,t.remove()}o=o.parentElement}t.removeAttribute("split")}if(i){let t=n.querySelector('[split="end"]'),i=t.nextElementSibling;for(;i;){let e=i;i=i.nextElementSibling,e.remove()}let o=t.parentElement;for(;o&&o!==e;){let e=o.nextElementSibling;for(;e;){let t=e;e=e.nextElementSibling,t.remove()}o=o.parentElement}t.remove()}return t&&t.removeAttribute("split"),i&&i.removeAttribute("split"),n}const hi=N("flowfilters"),ci="__html2pdfFlowFilter",gi=[{test:e=>"none"===e.display,cache:{reason:"display:none",message:"* display:none — skipped"}},{test:e=>"absolute"===e.position,cache:{reason:"position:absolute",message:"* position:absolute — skipped"}},{test:e=>"fixed"===e.position,cache:{reason:"position:fixed",message:"* position:fixed — skipped"}},{test:e=>"collapse"===e.visibility,cache:{reason:"visibility:collapse",message:"* visibility:collapse — skipped"}}];function di(e,t,i,n,{cached:o}={cached:!1}){if(!hi(e))return;const r=t?`(${t}) `:"",s=o?" (cached)":"";console.info(`🚸 ${r}${i.message}${s}`,[n])}function pi(e,{context:t="",computedStyle:i}={}){if(!(e&&this&&this._DOM&&this._DOM.isElementNode(e)))return!1;const n=e[ci];if(n)return di(this,t,n,e,{cached:!0}),!0;const o=i??this._DOM.getComputedStyle(e);if(!o)return!1;for(const i of gi)if(i.test(o))return e[ci]=i.cache,di(this,t,i.cache,e),!0;return!1}N("pagination");function ui({cells:e,splitPointsPerCell:t,sliceCell:i}){return t.map(((t,n)=>{const o=e[n];return i({cell:o,index:n,splitPoints:t})}))}function _i({originalRow:e,originalCells:t,slicedCellsPerOriginal:i,beginRow:n,cloneCellFallback:o,handleCell:r,finalizeRow:s}){const l=Math.max(...i.map((e=>e.length))),a=[];for(let h=0;h{const n=i[t][h]||o(e);r({context:l,cellClone:n,originalCell:e,cellIndex:t})})),a.push(s({context:l}))}return a}function fi({originalRow:e,originalCells:t,splitPointsPerCell:i,sliceCell:n,beginRow:o,cloneCellFallback:r,handleCell:s,finalizeRow:l}){if(!Array.isArray(i)||!i.length)return[];const a=this.sliceCellsBySplitPoints({cells:t,splitPointsPerCell:i,sliceCell:n});return this.buildRowSlices({originalRow:e,originalCells:t,slicedCellsPerOriginal:a,beginRow:o,cloneCellFallback:r,handleCell:s,finalizeRow:l})}function mi({usedRemainingWindow:e,isFirstPartEmpty:t,firstSliceTop:i,firstSliceBottom:n,pageBottom:o,epsilon:r=.5}){return{placeOnCurrentPage:e&&!t,remainingWindowSpace:Math.max(0,o-i),exceedsWindow:n>o+r}}function bi({currentRows:e,index:t,rowSlices:i}){return Array.isArray(e)?(e.splice(t,1,...i),e):[]}const wi=N("pagination");function Si({cells:e,targetHeight:t,shells:i}){return!!(Array.isArray(e)&&e.length&&t>0)&&this.scaleCellsToHeight(e,t,i)}function Mi({needsScalingInFullPage:e,cells:t}){return Boolean(e&&Array.isArray(t)&&t.length)}function Pi({needsScalingInFullPage:e,scaleCallback:t,payload:i}){if(!e)return!1;if("function"!=typeof t)return!1;const n=t(i||{});return!n&&this&&this._debug&&this._debug._&&wi(this)&&console.warn("[pagination.scaling] requested full-page scaling but callback reported no change",i),Boolean(n)}N("pagination");function Ci(e,t,i){e&&Array.isArray(e.rows)&&e.rows.splice(t,1,...i)}function Oi({rows:e,DOM:t,cellTagFilter:i,guardCallback:n}){if(!Array.isArray(e))return{};let o=!1,r=!1,s=!1,l=null;e.forEach((e=>{const n=Array.isArray(e)?e:Array.from(t.getChildren(e)||[]);null==l&&(l=n.length),n.length!==l&&(s=!0),n.forEach((e=>{const n=t.getElementTagName(e);if(!i||i(n,e)){const t=parseInt(e.getAttribute?.("rowspan"));Number.isFinite(t)&&t>1&&(o=!0);const i=parseInt(e.getAttribute?.("colspan"));Number.isFinite(i)&&i>1&&(r=!0)}}))}));const a={hasRowspan:o,hasColspan:r,inconsistentCells:s};return n?.(a),a}N("pagination");function yi(e){if(!e||"object"!=typeof e)throw new Error("splitter kernel adapter must be an object.");if(!e.rows||"object"!=typeof e.rows)throw new Error("splitter kernel adapter must expose a rows provider.");if("function"!=typeof e.rows.replaceRow)throw new Error("splitter kernel adapter rows.replaceRow must be a function.")}function Ti(e,{rowIndex:t,rowSlices:i}){yi(e);const n=Number.isFinite(t)?t:0,o=Array.isArray(i)?i:[],r=e.rows;r.replaceRow({rowIndex:n,rowSlices:o}),r.syncEntries?.({rowIndex:n,rowSlices:o});const s=e.guards?.getConfig?.({rowIndex:n,rowSlices:o})??r.getGuardConfig?.({rowIndex:n,rowSlices:o})??null;let l=null;if(s){const t={rows:s.rows,DOM:s.DOM||this._DOM,cellTagFilter:s.cellTagFilter,guardCallback:s.guardCallback};Array.isArray(t.rows)&&t.DOM&&(l=this.computeRowFlags(t),e.guards?.onFlags?.({flags:l,rowIndex:n,rowSlices:o}))}return e.metrics?.refresh?.({rowIndex:n,rowSlices:o,flags:l}),r.onRowsChanged?.({rowIndex:n,rowSlices:o,flags:l}),{flags:l}}N("pagination");function Ei({cells:e}){return Array.isArray(e)&&e.length?e.map((e=>{if(!e)return 0;const t=this._DOM.getComputedStyle(e),i=(parseFloat(t?.paddingTop)||0)+(parseFloat(t?.paddingBottom)||0)+(parseFloat(t?.borderTopWidth)||0)+(parseFloat(t?.borderBottomWidth)||0);return Number.isFinite(i)?Math.max(0,i):0})):[]}const Di=N("pagination");function vi({ownerLabel:e,DOM:t,row:i,targetHeight:n,cachedShells:o,getRowShellHeightsCallback:r,scaleCellsToHeightCallback:s}){if(e||Di(this)&&console.warn("[scaleRowCellsToHeight] šŸ‘¤ Owner wanted!",{owner:e}),!i)return Di(this)&&console.warn("[pagination.overflow] Missing row for scaling.",{owner:e}),!1;if("function"!=typeof s)return Di(this)&&console.warn("[pagination.overflow] scaleCellsToHeight callback is required.",{owner:e}),!1;const l=t,a=l&&"function"==typeof l.getChildren?l.getChildren(i):null;return s(a?[...a]:[],n,Array.isArray(o)?o:"function"==typeof r?r(i):[])}function Ri({ownerLabel:e,rowIndex:t,row:i,availableRowHeight:n,fullPageHeight:o,splitStartRowIndexes:r,reasonTail:s,reasonFull:l,registerPageStartCallback:a,scaleProblematicCellsCallback:h,debugLogger:c}){return e||Di(this)&&console.warn("[handleRowOverflow] šŸ‘¤ Owner wanted!",{owner:e}),Array.isArray(r)?"function"!=typeof a?(Di(this)&&console.warn("[pagination.overflow] registerPageStart callback is required.",{owner:e}),t):n!1),isSlice:o=(()=>!1)}=t,{handleRowWithRowspan:r=(()=>e.rowIndex),handleSplittableRow:s=(()=>e.rowIndex),handleAlreadySlicedRow:l=(()=>e.rowIndex)}=i,{row:a}=e;return n(a,e)?r({evaluation:e}):o(a,e)?l({evaluation:e}):s({evaluation:e})}function Li({evaluation:e,splitStartRowIndexes:t,fullPageHeight:i,resolveOverflow:n,debug:o,afterResolve:r}){const{rowIndex:s,tailWindowHeight:l}=e;Hi(this)&&console.log("%c āš ļø Row has ROWSPAN; use conservative fallback (no slicing)","color:DarkOrange; font-weight:bold");const a=n({rowIndex:s,evaluation:e,availableRowHeight:l,splitStartRowIndexes:t,fullPageHeight:i});return r?.({evaluation:e,tailWindowHeight:l,fullPageHeight:i,result:a}),a}function $i({evaluation:e,splitStartRowIndexes:t,resolveSplitFailure:i,fullPageHeight:n,debug:o}){const{rowIndex:r,row:s,tailWindowHeight:l,delta:a}=e;return Hi(this)&&console.log(`%c Row # ${r} is slice! but don't fit`,"color:DarkOrange; font-weight:bold",s),Hi(this)&&console.warn("%c SUPER BIG","background:red;color:white",a,{part:n}),i({evaluation:e,splitStartRowIndexes:t,availableRowHeight:l,fullPageHeight:n})}function Gi({tailWindowHeight:e,minMeaningfulRowSpace:t,fullPartHeight:i,debug:n}){return ethis.sliceNodeBySplitPoints({index:t,rootNode:e,splitPoints:i})),f=l.beginRow||(({originalRow:t,sliceIndex:i})=>{const n=this._DOM.cloneNodeWrapper(t);return r?.({rowWrapper:n,rowIndex:e,sliceIndex:i,originalRow:t}),{rowWrapper:n}}),m=l.cloneCellFallback||(e=>this._DOM.cloneNodeWrapper(e)),b=l.handleCell||(({context:e,cellClone:t})=>{this._DOM.insertAtEnd(e.rowWrapper,t)}),w=l.finalizeRow||(({context:e})=>e.rowWrapper),S=[];if(d.some((e=>Array.isArray(e)&&e.length))){const e=this.paginationBuildBalancedRowSlices({originalRow:t,originalCells:h,splitPointsPerCell:d,sliceCell:_,beginRow:f,cloneCellFallback:m,handleCell:b,finalizeRow:w});S.push(...e)}else Hi(this)&&console.log("šŸ”“ There is no Split");return S.length&&this.markSliceCutsInRows(S),o&&o._&&console.log("%c newRows \n","color:magenta; font-weight:bold",S),{newRows:S,isFirstPartEmptyInAnyTD:p,needsScalingInFullPage:u}}function zi({row:e,rowIndex:t,decorateRowSlice:i}){const n=Array.isArray(e),o=this;return{getParentContainer:()=>n?null:e,getOriginalCells:()=>n?[...e]:[...o._DOM.getChildren(e)],getShellHeights:({cells:t})=>n?[]:o.getTableRowShellHeightByTD(e),markOriginalRow:({cells:t})=>{n||o.setFlagSlice(e)},beginRow:({originalRow:e,sliceIndex:r})=>{if(n)return{cells:[]};const s=o._DOM.cloneNodeWrapper(e);return i?.({rowWrapper:s,rowIndex:t,sliceIndex:r,originalRow:e}),{rowWrapper:s}},cloneCellFallback:e=>o._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{n?(o.setFlagSlice(t),e.cells.push(t)):o._DOM.insertAtEnd(e.rowWrapper,t)},finalizeRow:({context:e})=>n?e.cells:e.rowWrapper}}function ji({evaluation:e,splitResult:t,splitStartRowIndexes:i,insufficientRemainingWindow:n,extraCapacity:o,fullPageHeight:r,debug:s,handlers:l={}}){const{newRows:a,isFirstPartEmptyInAnyTD:h,needsScalingInFullPage:c}=t||{},{rowIndex:g,row:d,isLastRow:p,tailWindowHeight:u}=e,{onReplaceRow:_,onAbsorbTail:f,onRefreshRows:m,onPlacement:b,onSplitFailure:w}=l;return Array.isArray(a)&&a.length?(_?.({evaluation:e,newRows:a}),p&&f?.({evaluation:e,newRows:a,extraCapacity:o}),m?.({evaluation:e,newRows:a,splitStartRowIndexes:i}),b?.({evaluation:e,newRows:a,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:h,needsScalingInFullPage:c,splitStartRowIndexes:i})??e.rowIndex):(Hi(this)&&console.log(`%c The row is not split. (ROW.${g})`,"color:orange",d),w?.({evaluation:e,splitStartRowIndexes:i,availableRowHeight:u,fullPageHeight:r})??e.rowIndex)}function Vi({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:n,minPartLines:o,debug:r,decorateRowSlice:s,onBudgetInfo:l,handlers:a={}}){if(!e||!e.row)return e?.rowIndex??0;const{row:h}=e,c=this.getTableRowHeight(h,o),g=this.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:c,fullPartHeight:n,debug:r});l?.({evaluation:e,firstPartHeight:g.firstPartHeight,fullPartHeight:n});const d=a.getRowSliceAdapter,p=d?.({evaluation:e,row:h,rowIndex:e.rowIndex,decorateRowSlice:s}),u=this.paginationSplitRow({rowIndex:e.rowIndex,row:h,firstPartHeight:g.firstPartHeight,fullPageHeight:n,debug:r,decorateRowSlice:s,rowAdapter:p});return this.paginationProcessRowSplitResult({evaluation:e,splitResult:u,splitStartRowIndexes:t,insufficientRemainingWindow:g.insufficientRemainingWindow,extraCapacity:i,fullPageHeight:n,debug:r,handlers:a})}function Ui({evaluation:e,table:t,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r,splitStartRowIndexes:s,pageBottom:l,fullPageHeight:a,debug:h,registerPageStartCallback:c,scaleProblematicSliceCallback:g,applyFullPageScalingCallback:d}){const{rowIndex:p}=e,u=Array.isArray(i)?i[0]:null;if(!u)return c?.({targetIndex:p,reason:"Row split produced empty first slice"}),p-1;const _=this.getTop(u,t),f=this.getBottom(u,t),m=this.evaluateRowSplitPlacement({usedRemainingWindow:!n,isFirstPartEmpty:o,firstSliceTop:_,firstSliceBottom:f,pageBottom:l,epsilon:0});return m.placeOnCurrentPage?(m.remainingWindowSpace>0&&g?.(u,m.remainingWindowSpace),c?.({targetIndex:p+1,reason:"Row split — next slice starts new page"})):(d?.({row:u,needsScalingInFullPage:r,fullPageHeight:a}),c?.({targetIndex:p,reason:"Empty first part — move row to next page"})),p-1}class qi{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.paragraph}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._minParagraphLeftLines=2,this._minParagraphDanglingLines=2,this._minParagraphBreakableLines=this._minParagraphLeftLines+this._minParagraphDanglingLines||2,Object.assign(this,i)}split(e){return this._splitComplexTextBlockIntoLines(e)}_estimateLineCount(e){return Math.ceil(this._DOM.getElementOffsetHeight(e)/this._node.getLineHeight(e))}_splitComplexTextBlockIntoLines(e){if(this._debug._&&console.group("_splitComplexTextBlockIntoLines",[e]),this._estimateLineCount(e){const t=this._node.getLineHeight(e),i=this._DOM.getElementOffsetHeight(e),n=this._DOM.getElementOffsetLeft(e),o=this._DOM.getElementOffsetTop(e);return{element:e,lines:Math.ceil(i/t),left:n,top:o,height:i,lineHeight:t,text:this._DOM.getInnerHTML(e)}}));this._debug._&&console.log("\n🚸 nodeChildren",[...t],"\n🚸 extendedChildrenArray",[...i]);const n=i.flatMap((e=>e.lines>1&&!this._node.isNoBreak(e.element)?this._breakItIntoLines(e.element):e.element));this._debug._&&console.log("\n🚸🚸🚸\n partiallyLinedChildren",[...n]);const o=n.reduce(((e,t,i,n)=>(e||(e=[]),"BR"===this._DOM.getElementTagName(t)?(e.at(-1).push(t),e.push([]),this._debug._&&console.log("br; push:",t),e):!e.length||this._node.isLineChanged(e.at(-1).at(-1),t)?(e.push([t]),this._debug._&&console.log("ā—¼ļø start new line:",t),e):0===e.at(-1).length||e.length&&this._node.isLineKept(e.at(-1).at(-1),t)?(this._debug._&&console.log("⬆ add to line:",t),e.at(-1).push(t),e):void this.strictAssert(!0,"groupedPartiallyLinedChildren: An unexpected case of splitting a complex paragraph into lines.","\nOn the element:",t))),[]);if(this._debug._&&console.log("🟔🟔🟔 groupedPartiallyLinedChildren \n",o.length,[...o]),o.length{let i;if(0==e.length)i=e[0],i.setAttribute("role","🚫"),this.strictAssert(0==e.length,"The string cannot be empty (_splitComplexTextBlockIntoLines)");else if(1==e.length)i=e[0];else{i=this._node.createTextGroup(),this._DOM.insertBefore(e[0],i),this._DOM.insertAtEnd(i,...e)}return i.dataset.child=t,i}));return this.logGroupEnd("OK _splitComplexTextBlockIntoLines"),this._DOM.setAttribute(e,this._selector.split),l}_breakItIntoLines(e){if(this._debug._&&console.group("_breakItIntoLines",[e]),this._node.isNoBreak(e))return this.logGroupEnd("isNoBreak"),e;if(this._node.isWrappedTextNode(e)){const t=this._breakWrappedTextNodeIntoLines(e);return this.logGroupEnd("TextNode newLines"),t}return this.logGroupEnd("(recursive _breakItIntoLines)"),this._processNestedInlineElements(e)}_processNestedInlineElements(e){this._debug._&&console.group("_processNestedInlineElements",[e]);const t=this._getNestedInlineChildren(e).flatMap((e=>this._estimateLineCount(e)>1?this._breakItIntoLines(e):e)),i=this._findNewLineStarts(t,e),n=i.map(((n,o)=>{const r=t[n],s=t[i[o+1]];return this._node.cloneAndCleanOutsideRange(e,r,s)}));return this._DOM.insertInsteadOf(e,...n),this.logGroupEnd("Nested Inline parts"),n}_getNestedInlineChildren(e){return[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this._node.isSignificantTextNode(t)){const i=this._node.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),e}if(!this._DOM.getElementOffsetParent(t)){const i=this._node.getPreparedChildren(t);return i.length>0&&e.push(...i),e}if(this._DOM.isElementNode(t)){return this._getNestedInlineChildren(t).forEach((t=>e.push(t))),e}}),[])}_makeWordsFromTextNode(e){const t=this._node.splitTextByWordsGreedy(e);this._debug._&&console.log("wordArray",t);const i=t.map(((e,t)=>this._node.createWord(e+"",t)));return this._debug._&&console.log("wrappedWordArray",i),{wordArray:t,wrappedWordArray:i}}_breakWrappedTextNodeIntoLines(e){e.classList.add("šŸ” _breakItIntoLines"),e.classList.add("🚫_must_be_removed");const{wordArray:t,wrappedWordArray:i}=this._makeWordsFromTextNode(e);this._DOM.setInnerHTML(e,""),this._DOM.insertAtEnd(e,...i);const n=this._findNewLineStarts(i,e),o=n.reduce(((i,o,r)=>{const s=this._node.createTextLine(),l=n[r],a=n[r+1],h=t.slice(l,a).join("")+"";return this._DOM.setInnerHTML(s,h),this._DOM.insertBefore(e,s),i.push(s),i}),[]);return e.remove(),o}_findNewLineStarts(e,t){const i=t.style.lineHeight;t.style.lineHeight=2;const n=e.reduce(((t,i,n)=>{const o=n>0?e[n-1].offsetTop:void 0,r=n>0?e[n-1].offsetHeight:void 0,s=i.offsetTop;return n>0&&o+r<=s&&t.push(n),t}),[0]);return t.style.lineHeight=i,n}}function Ki(e){if(e)return"function"==typeof e.getDebug?e.getDebug():e.debug}function Yi(e,t,i="unknown case"){if(!e||"function"!=typeof e.getSplitBottom||"function"!=typeof e.setSplitBottom)throw new Error("updateSplitBottom: adapter must expose getSplitBottom() and setSplitBottom().");const n=e.getSplitBottom();let o;if("number"==typeof t)o=t;else{if(!(t instanceof HTMLElement))throw new Error("updateSplitBottom: unexpected value type: "+typeof t);if("function"!=typeof e.computeSplitBottomForElement)throw new Error("updateSplitBottom: adapter must implement computeSplitBottomForElement(element).");o=e.computeSplitBottomForElement(t)}e.setSplitBottom(o);const r=function(e){return e?"function"==typeof e.getSplitBottomLog?e.getSplitBottomLog():e.splitBottomLog||null:null}(e);Array.isArray(r)&&r.push(o);const s=Ki(e);s&&s._&&console.log(`%cā™»ļø [${function(e){return e?.label||"šŸ‘¤ [paginator.label] element"}(e)}] update splitBottom (with ${t}) \n • ${i}`,"color: green; font-weight: bold","\n",n||"•••","->",o,r?`\n log: ${r}`:"")}function Zi(e,t,i,n="register page start"){const o=function(e){return e?"function"==typeof e.getRows?e.getRows()||[]:e.rows||[]:[]}(e),r=o.length,s=function(e){return!!e&&("function"==typeof e.shouldAssert?e.shouldAssert():Boolean(e.assert))}(e),l=Ki(e),a=Number.isInteger(t);if(s&&console.assert(a,`registerPageStartAt: index must be an integer, got: ${t}`),!a)return;if(s&&console.assert(r>0,"registerPageStartAt: no rows to register"),0===r)return;if(0===t)return l&&l._&&console.log("%c šŸ“ Row #0 forced to next page (no short first fragment)","color:green; font-weight:bold"),void((o[0]instanceof HTMLElement||"number"==typeof o[0])&&Yi(e,o[0],`${n} (index=0)`));let h=Math.max(1,Math.min(t,r-1));const c=i.at(-1);if(null!=c&&h<=c&&(h=c+1),h>=r)return void(l&&l._&&console.warn(`registerPageStartAt return: computed index (${h}) >= rowsLen (${r})`,"Last split index should not equal rows.length, or the original table will be empty."));i.push(h),l&&l._&&console.log(`%c šŸ“ Row # ${h} registered as page start`,"color:green; font-weight:bold");const g=o[h];(g instanceof HTMLElement||"number"==typeof g)&&Yi(e,g,n)}function Ji(e){return e._node.createSignpost("(table continued)",e._signpostHeight)}function Xi({owner:e=null,currentRows:t=[]}={}){return{owner:e,currentRows:Array.isArray(t)?t:[],parts:[]}}function Qi({entries:e,part:t,startIndex:i=null,endIndex:n=null,type:o="unknown",rows:r=[],meta:s}){if(!e||!t)return null;const l=function(e){if(e)return Array.isArray(e.parts)||(e.parts=[]),e.parts}(e);if(!l)return null;const a={part:t,type:o,startIndex:i,endIndex:n,rows:Array.isArray(r)?[...r]:[]};return s&&"object"==typeof s&&Object.keys(s).length&&(a.meta={...s}),l.push(a),a}class en{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.table}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._splitLabelHeightFromConfig=e.splitLabelHeight,this._initConstants(),Object.assign(this,i),this._resetCurrent()}split(e,t,i,n){this._setCurrent(e,t,i,n);const o=this._splitCurrentTable();return this._resetCurrent(),o}_initConstants(){this._signpostHeight=parseFloat(this._splitLabelHeightFromConfig)||0,this._minPartLines=2}_resetCurrent(){this._currentTable=void 0,this._currentFirstPageBottom=void 0,this._currentFullPageHeight=void 0,this._currentRoot=void 0,this._currentTableEntries=void 0,this._currentTableRecordedParts=void 0,this._currentTableDistributedRows=void 0,this._currentTableFirstPartContentBottom=void 0,this._currentTableFullPartContentHeight=void 0,this._currentTableTfootHeight=void 0,this._currentTableSplitBottom=void 0,this._logSplitBottom_=[],this._currentRowShellCache=void 0,this._currentOverflowHelpers=void 0,this._currentTableHasRowspan=void 0,this._currentTableHasColspan=void 0,this._currentTableInconsistentCells=void 0,this._currentTableHasUnexpectedChildren=void 0}_setCurrent(e,t,i,n){this._currentTable=e,this._currentFirstPageBottom=t,this._currentFullPageHeight=i,this._currentRoot=n,this._currentRowShellCache=new WeakMap,this._currentOverflowHelpers=this._composeOverflowHelpers()}_prepareCurrentTableForSplitting(){this._lockCurrentTableWidths(),this._collectCurrentTableEntries(),this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts=Xi({owner:this._currentTable,currentRows:this._currentTableDistributedRows}),this._currentTableEntries&&(this._currentTableEntries.recordedParts=this._currentTableRecordedParts),this._currentTable.__html2pdfRecordedParts=this._currentTableRecordedParts,this._analyzeCurrentTableStructure(),this._collectCurrentTableMetrics()}_lockCurrentTableWidths(){this._node.lockTableWidths(this._currentTable)}_splitCurrentTable(){this._prepareCurrentTableForSplitting(),this._setCurrentTableFirstSplitBottom(),this._debug._&&console.group("%cšŸ“Š _splitCurrentTable()","color:green; background:#eee; padding:3px","\n•",this._currentTableFirstPartContentBottom,"(1st bottom)","\n•",this._currentTableFullPartContentHeight,"(full part height)",{table:this._currentTable,rows:[...this._currentTableDistributedRows],rowCount:this._currentTableDistributedRows.length,entries:this._currentTableEntries,root:this._currentRoot});const e=this._resolveCurrentTableDistributedRowsInPlace();if(this._debug._&&console.log("šŸ“Š updated table rows",{rows_new:[...this._currentTableDistributedRows],rowCount_new:this._currentTableDistributedRows.length,splitStartRowIndexes:e}),!e.length)return this.logGroupEnd("[_splitCurrentTable]: there are no splits (!splitStartRowIndexes.length)"),[];let t=this._createTableSlices({splitPoints:e,table:this._currentTable,tableEntries:this._currentTableEntries});return this._node.markSliceCuts([this._currentTable,...t]),this._signpostHeight&&(t=this._extendTableSlices(t)),this._DOM.insertAfter(this._currentTable,...t),this._debug._&&console.log("tableSlices",t),this._debug._&&console.log("[table.split] recordedParts",this._currentTableRecordedParts?.parts),this.logGroupEnd("[_splitCurrentTable]"),[this._currentTable,...t]}_resolveCurrentTableDistributedRowsInPlace(){let e=[];for(let t=0;tNumber.isInteger(e)&&e>0&&e<=this._currentTableDistributedRows.length)),"splitStartRowIndexes contains invalid indexes"),this.strictAssert(e.every(((e,t,i)=>0===t||e>i[t-1])),"splitStartRowIndexes must be strictly ascending and without duplicates"),this.strictAssert(e.at(-1)!==this._currentTableDistributedRows.length,"Last split index should not equal rows.length, or the original table will be empty."),e}_evaluateAndResolveRow(e,t){const i=e,n=this._currentTableDistributedRows.length;this._debug._&&console.groupCollapsed(`šŸ”² %c Check the Row # ${i} (from ${n})`,"");const o=this._node.paginationBuildRowEvaluationContext({rows:this._currentTableDistributedRows,rowIndex:e,table:this._currentTable,splitBottom:this._currentTableSplitBottom});if(!o?.row)return console.warn("[table.split] Missing row during evaluation.",{rowIndex:e}),this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),e;if(this._debug._){const e=o.fitsCurrentWindow,t=e?"green":"orange",i=e?"<=":">";console.log(`%cšŸ“ does row fit? %c ${e} %c :: ${o.nextMarker} ${i} ${this._currentTableSplitBottom} %c(Ī”=${o.delta})`,"",`font-weight:bold;color:${t};`,"",`color:${t};`)}if(this._debug._&&console.info({row:o.row,rows:[...this._currentTableDistributedRows]}),o.fitsCurrentWindow)return this._debug._&&console.log(`%c āœ“ Row # ${e}: PASS`,"color:green"),this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),e;const r=this._node.calculateFinalPartReclaimedHeight({signpostHeight:this._signpostHeight,tfootHeight:this._currentTableTfootHeight});if(this._node.paginationCanAbsorbLastRow({evaluation:o,extraCapacity:r,splitBottom:this._currentTableSplitBottom,debug:this._debug}))return this._debug._&&console.log("🫟 last-row-fits-without-bottom-signpost: skip split"),this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),e;const s=this._resolveOverflowingRow({evaluation:o,splitStartRowIndexes:t,extraCapacity:r});return this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),s}_resolveOverflowingRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:e=>this._rowHasSpan(e),isSlice:e=>this._node.isSlice(e)},handlers:{handleRowWithRowspan:()=>this._node.paginationResolveRowWithRowspan({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,resolveOverflow:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:"Row with ROWSPAN — move to next page",reasonFull:"Row with ROWSPAN — scaled TDs to full page",branch:"rowspan"}),debug:this._debug,afterResolve:({tailWindowHeight:e,fullPageHeight:t})=>{this._debug._&&e>=t&&console.warn("[table.fallback] ROWSPAN row required full-page scaling to fit.")}}),handleSplittableRow:()=>this._resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}),handleAlreadySlicedRow:()=>this._node.paginationResolveAlreadySlicedRow({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,resolveSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:"Slice doesn't fit tail — move to next page",reasonFull:"Scaled TD content to fit full page",branch:"alreadySliced"})})}})}_resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){const{rowIndex:n}=e;this._debug._&&console.group(`%c šŸ”³ Try to split the ROW ${n} %c (from ${this._currentTableDistributedRows.length})`,"color:magenta;","");const o=this._node.paginationResolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:this._currentTableFullPartContentHeight,minPartLines:this._minPartLines,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{this._DOM.setAttribute(e,`.splitted_row_${t}_part_${i}`)},onBudgetInfo:({evaluation:e,firstPartHeight:t,fullPartHeight:i})=>{this._debug._&&console.info({currRowTop:e.rowTop,"• splitBottom":this._currentTableSplitBottom,"• is row sliced?":!1,"remaining page space":e.tailWindowHeight,"first part height":t,"full part height":i})},handlers:{onReplaceRow:({evaluation:e,newRows:t})=>{this._replaceRowInDOM(e.row,t)},onAbsorbTail:({newRows:e,extraCapacity:t})=>{this._node.absorbShortTrailingSliceIfFits({slices:e,extraCapacity:t,ownerLabel:"table",debug:this._debug})},onRefreshRows:({evaluation:e,newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentTable,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentTableSplitBottom,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>{t>0&&(this._debug._&&console.log("āš–ļø scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))},applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{row:e,targetHeight:i},scaleCallback:({row:e,targetHeight:t})=>(this._debug._&&console.log("āš–ļø scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:"Split failed — move row to next page",reasonFull:"Scaled TDs to fit full-page",branch:"splitFailure"})}});return this.logGroupEnd(`šŸ”³ Try to split the ROW ${n} (from ${this._currentTableDistributedRows.length})`),o}_collectCurrentTableEntries(){this._currentTableEntries=this._node.getTableEntries(this._currentTable)}_rowHasSpan(e){const t=[...this._DOM.getChildren(e)];for(const e of t){const t=this._DOM.getElementTagName(e);if("TD"!==t&&"TH"!==t)continue;const i=parseInt(e.getAttribute("rowspan"));if(Number.isFinite(i)&&i>1)return!0}return!1}_collectCurrentTableMetrics(){const e=this._node.getEmptyNodeHeightByProbe(this._currentTable,'',!1),t=this._node.getTopForPageStartCandidate(this._currentTable,this._currentRoot),i=(this._node.getTopWithMargin(this._currentTable,this._currentRoot),this._DOM.getElementOffsetHeight(this._currentTableEntries.caption)||0),n=this._DOM.getElementOffsetTop(this._currentTableDistributedRows[0],this._currentTable)-i||0;this._currentTableTfootHeight=this._DOM.getElementOffsetHeight(this._currentTableEntries.tfoot)||0,this._currentTableFirstPartContentBottom=this._currentFirstPageBottom-t-e-this._signpostHeight,this._currentTableFullPartContentHeight=this._currentFullPageHeight-i-n-this._currentTableTfootHeight-e-2*this._signpostHeight}_getDistributedRows(e){return[...e.rows,...e.tfoot?[e.tfoot]:[]]}_updateCurrentTableDistributedRows(){this._currentTableDistributedRows=this._getDistributedRows(this._currentTableEntries)}_analyzeCurrentTableStructure(){this._currentTableEntries;const e=this._currentTableDistributedRows||[],t=this._node.computeRowFlags({rows:e,DOM:this._DOM,cellTagFilter:(e,t)=>"TFOOT"!==this._DOM.getElementTagName(t.parentNode)&&("TD"===e||"TH"===e)});this._currentTableHasRowspan=t.hasRowspan,this._currentTableHasColspan=t.hasColspan,this._currentTableInconsistentCells=t.inconsistentCells,this._debug._&&(t.hasRowspan&&console.warn("[table.guard] ROWSPAN detected — slicing not implemented; applying conservative fallback.",{table:this._currentTable}),t.hasColspan&&console.warn("[table.guard] COLSPAN present — handled within-row slicing; monitor results.",{table:this._currentTable}),t.inconsistentCells&&console.warn("[table.guard] Inconsistent cell counts across rows — results may vary.",{table:this._currentTable}))}_updateCurrentTableEntriesAfterSplit(e,t){this._currentTableEntries.rows.splice(e,1,...t)}_setCurrentTableFirstSplitBottom(){this._node.getTop(this._currentTableDistributedRows[0],this._currentTable)>this._currentTableSplitBottom?(this._updateCurrentTableSplitBottom(this._currentTableFullPartContentHeight,"SPECIAL CASE: start immediately from the full height of the page"),this._debug._&&console.log("The Row 0 goes to the 2nd page")):this._updateCurrentTableSplitBottom(this._currentTableFirstPartContentBottom,"start with a short first part")}_getPaginatorAdapter(){return{label:"table",getSplitBottom:()=>this._currentTableSplitBottom,setSplitBottom:e=>{this._currentTableSplitBottom=e},computeSplitBottomForElement:e=>this._node.getTop(e,this._currentTable)+this._currentTableFullPartContentHeight,getRows:()=>this._currentTableDistributedRows,shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._logSplitBottom_}}_getSplitterAdapter(){const e=()=>({rows:this._currentTableDistributedRows||[],DOM:this._DOM,cellTagFilter:(e,t)=>{const i=t?.parentNode;return"TFOOT"!==(i?this._DOM.getElementTagName(i):void 0)&&("TD"===e||"TH"===e)}});return{label:"table",rows:{getCurrentRows:()=>this._currentTableDistributedRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{this._node.applyRowSlicesToEntriesAfterRowSplit(this._currentTableEntries,e,t)},syncEntries:()=>{this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)},getGuardConfig:e,onRowsChanged:()=>{this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)}},guards:{getConfig:e,onFlags:({flags:e})=>{e&&(this._currentTableHasRowspan=Boolean(e.hasRowspan),this._currentTableHasColspan=Boolean(e.hasColspan),this._currentTableInconsistentCells=Boolean(e.inconsistentCells))}}}}_updateCurrentTableSplitBottom(e,t="unknown case"){Yi(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Zi(this._getPaginatorAdapter(),e,t,i)}_composeOverflowHelpers(){const e=this._node.scaleCellsToHeight.bind(this._node),t=this._getRowShellHeights.bind(this),i={ownerLabel:"table",registerPageStartCallback:this._registerPageStartAt.bind(this),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0,scaleProblematicCellsCallback:(i,n,o)=>this._node.scaleRowCellsToHeight({ownerLabel:"table",DOM:this._DOM,row:i,targetHeight:n,cachedShells:o,getRowShellHeightsCallback:t,scaleCellsToHeightCallback:e})};return this._currentOverflowHelpers=i,i}_scaleProblematicCellsToHeight(e,t,i){return(this._currentOverflowHelpers||this._composeOverflowHelpers()).scaleProblematicCellsCallback(e,t,i)}_forwardOverflowFallback({rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:o,reasonTail:r,reasonFull:s,branch:l}){const a=this._currentOverflowHelpers||this._composeOverflowHelpers(),h={ownerLabel:`table:${l}`,rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:o,reasonTail:r,reasonFull:s,registerPageStartCallback:a.registerPageStartCallback,scaleProblematicCellsCallback:a.scaleProblematicCellsCallback,debugLogger:a.debugLogger};return this._debug._&&console.log(`%c[table.overflow] branch=${l} rowIndex=${e} tail=${i} full=${n}`,"color:orange; font-weight:bold",{reasonTail:r,reasonFull:s}),"splitFailure"===l?this._node.handleRowSplitFailure(h):this._node.handleRowOverflow(h)}_getRowShellHeights(e){if(!this._currentRowShellCache)return this._node.getTableRowShellHeightByTD(e);if(this._currentRowShellCache.has(e))return this._currentRowShellCache.get(e);const t=this._node.getTableRowShellHeightByTD(e);return this._currentRowShellCache.set(e,t),t}_createTableSlice({startId:e,endId:t,table:i,tableEntries:n}){this._debug._&&console.group(`[CREATE Table Slice] range: [${e}, ${t})`),this.strictAssert(Number.isInteger(e)&&(Number.isInteger(t)||t===1/0),`[createTableSlice] invalid bounds: startId=${e}, endId=${t}`);const o=n&&n.rows?n.rows.length:0;this.strictAssert(o>=0,`createTableSlice: invalid rows length: ${o}`),this.strictAssert(e>0&&t>0&&ethis._createTableSlice({startId:e,endId:n===o.length-1?1/0:o[n+1],table:t,tableEntries:i})))}_extendTableSlices(e){return e.reduce(((e,t,i,n)=>{const o=0===i,r=i===n.length-1;return o&&e.push(this._createBottomSignpost()),e.push(this._node.createForcedPageBreak()),e.push(this._createTopSignpost()),e.push(t),!r&&e.push(this._createBottomSignpost()),e}),[])}_createTopSignpost(){return this._node.createSignpost("(table continued)",this._signpostHeight)}_createBottomSignpost(){return this._node.createSignpost("(table continues on the next page)",this._signpostHeight)}_replaceRowInDOM(e,t){this._debug._&&this._DOM.setAttribute(e,".🚫_must_be_removed"),this._DOM.insertInsteadOf(e,...t)}_createAndInsertTableSlice({startId:e,endId:t,table:i,tableEntries:n}){const o=this._normalizeSliceAdapterPayload(function(e,{startId:t,endId:i,table:n,tableEntries:o}){e.strictAssert(Number.isInteger(t)&&Number.isInteger(i),`createAndInsertTableSlice: non-integer bounds: startId=${t}, endId=${i}`);const r=o&&o.rows?o.rows.length:0;e.strictAssert(r>=0,`createAndInsertTableSlice: invalid rows length: ${r}`),e.strictAssert(t>=0&&i>=0&&t({rowIndex:e+i,row:t,cells:Array.from(this._DOM.getChildren(t)||[])}))):[];if(r.length){const i={...o.meta||{},signpostTop:o.signposts?.top??null,signpostBottom:o.signposts?.bottom??null};this._recordTablePart(o.mainPart,{startId:e,endId:t,type:"slice",rows:s,meta:i})}return r}_createAndInsertTableFinalSlice({table:e,startId:t=0}){const i=Array.isArray(this._currentTableDistributedRows)?this._currentTableDistributedRows.length:0,n=this._normalizeSliceAdapterPayload(function(e,{table:t}){e._node.markTopCut(t),e._node.setFlagNoBreak(t);const i=[],n=e._node.createForcedPageBreak();i.push(n);const o=Ji(e);return o&&(e._node.setFlagNoBreak(o),i.push(o)),e._DOM.insertBefore(t,...i),i.push(t),{nodes:i,mainPart:t,signposts:{top:o,bottom:null}}}(this,{table:e}),{startId:t,endId:i,type:"final"}),o=n.mainPart,r=Array.isArray(this._currentTableDistributedRows)?this._currentTableDistributedRows.slice(t).map(((e,i)=>({rowIndex:t+i,row:e,cells:Array.from(this._DOM.getChildren(e)||[])}))):[],s={...n.meta||{},signpostTop:n.signposts?.top??null,signpostBottom:n.signposts?.bottom??null};return this._recordTablePart(o,{startId:t,endId:i,type:"final",rows:r,meta:s}),n.nodes}_normalizeSliceAdapterPayload(e,{startId:t=null,endId:i=null,type:n="slice"}={}){const o=`[table.slice:${n}] rows [${t??"null"}:${i??"null"}]`;this.strictAssert(e,`${o} builder returned no result`);const r=e=>e&&"object"==typeof e&&1===e.nodeType;let s=null;Array.isArray(e)?s={nodes:e}:r(e)?s={nodes:[e],mainPart:e}:"object"==typeof e?s=e:this.strictAssert(!1,`${o} unsupported builder payload: ${e}`);let l=Array.isArray(s.nodes)?[...s.nodes]:[];!l.length&&r(s.mainPart)&&(l=[s.mainPart]),this.strictAssert(l.length>0,`${o} builder produced empty nodes array`);const a=[];l.forEach(((e,t)=>{e?a.push(e):console.warn(`${o} dropped empty node at index ${t}`)})),this.strictAssert(a.length>0,`${o} builder produced only empty nodes`);const h=s.mainPart??a[0];return this.strictAssert(r(h),`${o} missing main part element`),{nodes:a,mainPart:h,signposts:{top:s.signposts?.top??null,bottom:s.signposts?.bottom??null},meta:s.meta}}_recordTablePart(e,t={}){const i=this._currentTableRecordedParts;if(!i||!e)return null;const{startId:n=null,endId:o=null,type:r="unknown",rows:s=[],meta:l}=t||{};return Qi({entries:i,part:e,startIndex:n,endIndex:o,type:r,rows:s,meta:l})}}class tn{constructor({config:e,DOM:t,node:i,selector:n}){this._debug=e.debugMode?{...e.debugConfig.tableLike}:{},this._DOM=t,this._selector=n,this._node=i,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,n,o){const r=o||this._DOM.getComputedStyle(e);this._debug._&&console.log("root",n);const s=this._node.getPreparedChildren(e),l=this._node.getTop(e,n),a=this._node.getEmptyNodeHeightByProbe(e),h=i-a;let c=s,g=0,d=[],p=t-l-a;const u=r.position;"relative"!=u&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tp&&(t&&d.push(t),t&&(g+=1),p=t?this._node.getTop(i,e)+h:h)}if(this._DOM.setStyles(e,{position:u}),!d.length)return this._debug._&&console.log("splitters.length",d.length),[];d.push(null);const _=d.map(((t,i,n)=>{const o=this._node.createSliceWrapper(e),r=n[i-1]||0,s=t||n[n.length];return this._DOM.insertAtEnd(o,...c.slice(r,s)),o}));return this._node.markSliceCuts(_),this._DOM.replaceNodeContentsWith(e,..._),this._DOM.removeAllClasses(e),this._DOM.removeAllStyles(e),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),_}}class nn{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.grid}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=o,this._node=n,this._resetCurrent(),this._minBreakableGridRows=1,this._minGridRowContentLines=2,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,n,o){this._resetCurrent(),this._debug._&&console.group("%c split Grid Node","background:#00FFFF",e);const r=this._node.getPreparedChildren(e);this._node.lockNodesWidths(r);const s=o||this._getComputedStyleCached(e);if(!r.length)return this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];this._node.setInitStyle(!0,e,s);const l=this._scanGridLayout(e,s);if(!l.safe)return this._debug._&&console.warn("[grid.split] skip unsafe layout",l),this._debug._&&console.warn("[grid.split] Unsupported grid layout detected; keeping original grid intact.",l),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];const a=[];let h=!1,c=!1;const g=new Set;let d=null,p=null,u=null;r.forEach((t=>{const i=this._getComputedStyleCached(t),n=parseInt(i.gridRowStart,10),o=Number.isFinite(n),r=this._node.getTop(t,e),s=this._node.getBottom(t,e);let l=!1;l=!a.length||(o&&null!=d?n!==d:null!=u?r>=u-.5:null==p||Math.abs(r-p)>.5),l?(a.push([t]),d=o?n:null,p=r,u=s):(a[a.length-1].push(t),o&&null==d&&(d=n),(null==p||ru)&&(u=s));const _=i.gridRowEnd||"",f=i.gridColumnEnd||"";h=h||_.includes("span"),c=c||f.includes("span"),o&&g.add(n)}));const _=g.size>0&&Math.max(...g)>a.length;if(_)return this._debug._&&console.warn("[grid.split]","Unsupported implicit row gap detected; keeping grid unsplit.",{hasImplicitRowGaps:_}),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];if(h||c)return this._debug._&&console.warn("[grid.split]","Grid contains row/column spans; using fallback (move row to next page).",{hasRowSpan:h,hasColumnSpan:c}),this._debug._&&console.groupEnd(),this._fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:s});this.log("grid.split","currentRows:",a);const f=this._node.getTop(e,n),m=this._node.getEmptyNodeHeightByProbe(e),b=t-f-m,w=i-m;if(this.log("grid.split",{firstPartHeight:b,fullPagePartHeight:w}),this._currentGridNode=e,this._currentGridRows=a,this._currentGridFullPartHeight=w,this._currentGridSplitLog=[],this._currentGridEntries=Xi({owner:e,currentRows:a}),this._currentGridRecordedParts=this._currentGridEntries,this._currentGridNode.__html2pdfRecordedParts=this._currentGridRecordedParts,this._currentGridShellCache=new WeakMap,a.length0?Math.floor(t):1;let o=0;return()=>{if(o+=1,o<=n)return;const t={label:e,iterations:o,limit:n};throw i&&console.assert(!1,`\n\n ā›” [${e}] ā™¾ļø loop guard triggered`,t),new Error(`\n ā›” [${e}] ā™¾ļø loop guard triggered`)}}({label:"grid.split",limit:Math.max(1,6*(a.length||1)),assert:this._assert});this._updateCurrentGridSplitBottom(b,"start with initial window");for(let t=0;tthis._buildGridSplit({startId:n[i-1]||0,endId:t,node:e,entries:M}))).filter(Boolean).map((e=>e.part)),this._createAndInsertGridFinalSlice({node:e,entries:M,startId:C})];return this.log("grid.split",{splitStartRowIndexes:S,splits:O,recordedParts:this._currentGridRecordedParts?.parts}),this._node.setInitStyle(!1,e,s),this._resetCurrent(),this.logGroupEnd("split Grid Node"),O}_fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:t}){return this._node.setInitStyle(!1,e,t),this._resetCurrent(),[]}_resetCurrent(){this._currentGridNode=void 0,this._currentGridRows=void 0,this._currentGridEntries=void 0,this._currentGridRecordedParts=void 0,this._currentGridSplitBottom=void 0,this._currentGridFullPartHeight=void 0,this._currentGridSplitLog=void 0,this._currentGridRowFlags=void 0,this._currentGridShellCache=void 0,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap}_getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t}){return{getRowSliceAdapter:({row:t})=>this._createGridRowSliceAdapter({row:t,rowIndex:e.rowIndex}),onReplaceRow:({newRows:t})=>{this._removeOriginalGridRowCells(e.row),this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onAbsorbTail:()=>{},onRefreshRows:({newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentGridNode,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentGridSplitBottom,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>this._scaleGridCellsToHeight(e,t),applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{cells:e,targetHeight:i},scaleCallback:({cells:e,targetHeight:t})=>this._scaleGridCellsToHeight(e,t)})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n,branch:"splitFailure"})}}_forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n=this._currentGridFullPartHeight,branch:o,reasonTail:r,reasonFull:s}){const l=this._composeGridOverflowHelpers(),a={ownerLabel:`grid:${o}`,gridNode:this._currentGridNode,evaluation:e,rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:r||("splitFailure"===o?"Grid split failed — move row to next page":"Grid slice overflow — move row to next page"),reasonFull:s||("splitFailure"===o?"Grid split failed — scaled cells to full page":"Grid slice overflow — scaled cells to full page"),registerPageStartCallback:l.registerPageStartCallback,scaleProblematicCellsCallback:l.scaleProblematicCellsCallback,debugLogger:l.debugLogger};return this._debug._&&console.log("[grid.overflow]",o,a),"splitFailure"===o?this._node.handleRowSplitFailure(a):this._node.handleRowOverflow(a)}_buildGridRowEvaluation({rows:e,rowIndex:t,gridNode:i,splitBottom:n}){if(!Array.isArray(e))return null;const o=e[t];if(!o)return null;const r=Array.isArray(o)?new Array(o.length):null,s=this._getRowTop(o,i,r),l=this._getRowBottom(o,i,r),a=e[t+1],h=a?this._getRowTop(a,i):l,c=h-n;return{rowIndex:t,row:o,rowTop:s,rowBottom:l,nextMarker:h,delta:c,tailWindowHeight:n-s,isLastRow:!a,fitsCurrentWindow:c<=0,cellStyles:r}}_composeGridOverflowHelpers(){const e=this._registerPageStartAt.bind(this);this._scaleGridCellsToHeight.bind(this);return{registerPageStartCallback:e,scaleProblematicCellsCallback:(e,t)=>!!Array.isArray(e)&&this._scaleGridCellsToHeight(e,t),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0}}_resolveGridOverflowingRow({evaluation:e,splitStartRowIndexes:t}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:()=>!1,isSlice:e=>this._isGridRowSlice(e)},handlers:{handleRowWithRowspan:()=>(this._debug._&&console.warn("[grid.split] ROWSPAN guard triggered unexpectedly.",{evaluation:e}),this._registerPageStartAt(e.rowIndex,t,"Grid ROWSPAN fallback — move row to next page"),e.rowIndex-1),handleSplittableRow:()=>this._resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}),handleAlreadySlicedRow:()=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,branch:"alreadySliced"})}})}_resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}){const{rowIndex:i}=e;this._debug._&&console.group("%c[grid.split] Stage5 — splittable row","color:#0080ff",{rowIndex:i,row:e.row,tailWindowHeight:e.tailWindowHeight});const n=this._estimateGridRowMeaningfulSpace({row:e.row,cellStyles:e.cellStyles,minContentLines:this._minGridRowContentLines});if(!(n>0))return console.warn("[grid.metrics] Meaningful row space is unavailable; falling back to overflow handler."),this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:e.tailWindowHeight,fullPageHeight:this._currentGridFullPartHeight,branch:"metricsMissing",reasonTail:"Grid row metrics missing — move row to next page",reasonFull:"Grid row metrics missing — scaled cells to full page"});const o=this._node.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:n,fullPartHeight:this._currentGridFullPartHeight,debug:this._debug}),r=this._node.paginationSplitRow({rowIndex:i,row:e.row,firstPartHeight:o.firstPartHeight,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{e instanceof HTMLElement&&this._DOM.setAttribute(e,`.grid_row_${t}_part_${i}`)},rowAdapter:this._createGridRowSliceAdapter({row:e.row,rowIndex:i,cellStyles:e.cellStyles})}),s=this._node.paginationProcessRowSplitResult({evaluation:e,splitResult:r,splitStartRowIndexes:t,insufficientRemainingWindow:o.insufficientRemainingWindow,extraCapacity:0,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,handlers:this._getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t})});return this.logGroupEnd("[grid.split] Stage5 — splittable row"),s}_createGridRowSliceAdapter({row:e,rowIndex:t,cellStyles:i}){if(!Array.isArray(e))return null;const n=this._currentGridNode,o=e[0]||null,r=this;return{getParentContainer:()=>n,getOriginalCells:()=>[...e],getShellHeights:()=>r._getGridShellHeights(e,i),markOriginalRow:({cells:e})=>{e.forEach((e=>r._node.setFlagSlice(e)))},beginRow:()=>({fragment:r._DOM.createDocumentFragment(),cells:[]}),cloneCellFallback:e=>r._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{r._node.setFlagSlice(t),e.fragment.append(t),e.cells.push(t)},finalizeRow:({context:e})=>(o&&r._DOM.insertBefore(o,e.fragment),e.cells)}}_removeOriginalGridRowCells(e){Array.isArray(e)&&e.forEach((e=>{e instanceof HTMLElement&&this._DOM.removeNode(e)}))}_isGridRowSlice(e){if(Array.isArray(e)){const t=e.find((e=>e instanceof HTMLElement));return!!t&&this._node.isSlice(t)}return!!e&&this._node.isSlice(e)}_getPaginatorAdapter(){return{label:"grid",getSplitBottom:()=>this._currentGridSplitBottom,setSplitBottom:e=>{this._currentGridSplitBottom=e},computeSplitBottomForElement:e=>e&&this._currentGridNode?this._node.getTop(e,this._currentGridNode)+(this._currentGridFullPartHeight||0):this._currentGridSplitBottom||0,getRows:()=>Array.isArray(this._currentGridRows)?this._currentGridRows.map((e=>{if(!e)return null;if(e instanceof HTMLElement)return e;if(Array.isArray(e)){const t=e.find((e=>e instanceof HTMLElement));if(t)return t;const i=this._getRowTop(e,this._currentGridNode);return Number.isFinite(i)?i:null}const t=this._getRowTop(e,this._currentGridNode);return Number.isFinite(t)?t:null})):[],shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._currentGridSplitLog}}_getSplitterAdapter(){return{label:"grid",rows:{getCurrentRows:()=>this._currentGridRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{Array.isArray(this._currentGridRows)&&this._node.replaceCurrentRowsAfterRowSplit({currentRows:this._currentGridRows,index:e,rowSlices:t})},syncEntries:()=>{this._currentGridEntries&&(this._currentGridEntries.currentRows=this._currentGridRows),this._currentGridRecordedParts&&(this._currentGridRecordedParts.currentRows=this._currentGridRows)},getGuardConfig:()=>({rows:this._currentGridRows||[],DOM:this._DOM})},guards:{onFlags:({flags:e})=>{this._currentGridRowFlags=e}}}}_updateCurrentGridSplitBottom(e,t="unknown case"){Yi(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Zi(this._getPaginatorAdapter(),e,t,i)}_scaleGridCellsToHeight(e,t){if(!(Array.isArray(e)&&e.length&&t>0))return!1;const i=this._getGridShellHeights(e),n=this._debug._?e.map((e=>this._DOM.getElementOffsetHeight(e))):null,o=this._node.paginationScaleCellsToHeight({cells:e,targetHeight:t,shells:i});if(this._debug._){const r=e.map((e=>this._DOM.getElementOffsetHeight(e)));console.log("[grid.scaleCells] target:",t,"shells:",i,"before:",n,"after:",r,"scaled:",o)}return o}_buildGridSplit({startId:e,endId:t,node:i,entries:n}){const o=n?.currentRows||this._currentGridRows||[];if(e===t)return this._debug._&&console.warn("[grid.split] _buildGridSplit: skip empty slice request",e,t),this.strictAssert(!1,"[grid.split] _buildGridSplit: empty slice encountered"),null;if(this._debug._){const i=o.slice(e,t);console.log(`=> [grid.split] _buildGridSplit: slice rows [${e}, ${t})`,i)}const r=this._createAndInsertGridSlice({startId:e,endId:t,node:i,entries:n}),s=this._collectGridTelemetryRows(o,e,t);return this._recordGridPart(r,{startId:e,endId:t,type:"slice",rows:s}),{part:r,telemetryRows:s}}_createAndInsertGridSlice({startId:e,endId:t,node:i,entries:n}){return function(e,{startId:t,endId:i,node:n,entries:o,fallbackCurrentRows:r}){const s=e._DOM.cloneNodeWrapper(n);e._node.copyNodeWidth(s,n),e._node.setFlagNoBreak(s),t&&e._node.markTopCut(s),e._node.markBottomCut(s),n.before(s);const l=o?.currentRows||r||[],a=e&&e._DOM&&"function"==typeof e._DOM.isElementNode?e._DOM.isElementNode.bind(e._DOM):null,h=l.slice(t,i).flat().map((e=>{if(!e)return null;if(a&&a(e))return e;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return e;const t=e.element;if(t){if(a&&a(t))return t;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return t}return null})).filter(Boolean);return e._DOM.insertAtEnd(s,...h),s}(this,{startId:e,endId:t,node:i,entries:n})}_createAndInsertGridFinalSlice({node:e,entries:t,startId:i}){const n=function(e,{node:t,entries:i}){return e._node.markTopCut(t),e._node.setFlagNoBreak(t),t}(this,{node:e,entries:t}),o=t?.currentRows||this._currentGridRows||[],r=this._collectGridTelemetryRows(o,i);return this._recordGridPart(n,{startId:i,endId:o.length,type:"final",rows:r}),n}_collectGridTelemetryRows(e,t,i){if(!Array.isArray(e))return[];return e.slice(t,"number"==typeof i?i:void 0).map(((e,i)=>{const n=Array.isArray(e)?[...e]:[e];return{rowIndex:t+i,row:e,cells:n}}))}_recordGridPart(e,t={}){const i=this._currentGridRecordedParts;if(!i||!e)return null;const{startId:n=null,endId:o=null,type:r="unknown",rows:s=[],meta:l}=t||{};return Qi({entries:i,part:e,startIndex:n,endIndex:o,type:r,rows:s,meta:l})}_estimateGridRowMeaningfulSpace({row:e,cellStyles:t=null,minContentLines:i=this._minGridRowContentLines}){if(!Array.isArray(e)||0===e.length)return console.warn("[grid.metrics] Row payload missing while estimating split budget."),null;const n=this._getGridShellHeights(e,t),o=Array.isArray(t)?t:null,r=Math.max(1,i);let s=0;return e.forEach(((e,t)=>{if(!(e instanceof HTMLElement))return void console.warn("[grid.metrics] Unexpected non-element cell in row; ignoring during split budget calculation.",{cell:e,index:t});let i=o?o[t]:null;i||(i=this._getComputedStyleCached(e),o&&(o[t]=i));const l=this._resolveGridCellLineHeight({cell:e,style:i}),a=(n?.[t]||0)+l*r;s=Math.max(s,a)})),s>0?s:(console.warn("[grid.metrics] Failed to measure meaningful row space."),null)}_resolveGridCellLineHeight({cell:e,style:t}){const i=this._gridCellLineHeightCache,n=i?.get(e);if(n>0)return n;t||(console.warn("[grid.metrics] style not passed for _resolveGridCellLineHeight",{cell:e}),t=this._getComputedStyleCached(e));let o=parseFloat(t?.lineHeight);if(o>0)return i?.set(e,o),o;const r=parseFloat(t?.fontSize);if(Number.isFinite(r)&&r>0){const t=1.2*r;return i?.set(e,t),t}if(o=this._node.getLineHeight(e),o>0)return i?.set(e,o),o;return i?.set(e,16),16}_getGridShellHeights(e,t=null){if(this._currentGridShellCache||(this._currentGridShellCache=new WeakMap),this._currentGridShellCache.has(e))return this._currentGridShellCache.get(e);const i=Array.isArray(e)?e:[e].filter(Boolean),n=this._computeGridCellShellHeights(i,t);return this._currentGridShellCache.set(e,n),n}_getComputedStyleCached(e){if(!e)return console.warn("[grid.split] the element was not passed to _getComputedStyleCached"),null;const t=this._gridComputedStyleCache;if(!t)return this._DOM.getComputedStyle(e);const i=t.get(e);if(i)return i;const n=this._DOM.getComputedStyle(e);return t.set(e,n),n}_computeGridCellShellHeights(e,t=null){return Array.isArray(e)&&e.length?e.map(((e,i)=>{if(!e)return 0;let n=null;t?(n=t[i],n||(n=this._getComputedStyleCached(e),t[i]=n)):n=this._getComputedStyleCached(e);const o=parseFloat(n?.paddingTop)||0,r=parseFloat(n?.paddingBottom)||0,s=parseFloat(n?.borderTopWidth)||0,l=parseFloat(n?.borderBottomWidth)||0,a=parseFloat(n?.marginTop)||0,h=parseFloat(n?.marginBottom)||0,c=o+r+s+l,g=Math.max(0,a)+Math.max(0,h),d=this._DOM.getElementOffsetHeight(e)||0;let p=0;if("function"==typeof this._node.getContentHeightByProbe)try{const t=this._node.getContentHeightByProbe(e,n);Number.isFinite(t)&&t>=0&&(p=t)}catch(e){}p>0&&!(p>d)||(p=Math.max(0,d-c));let u=d-p;return Number.isFinite(u)||(u=c),u=Math.max(u,c),Math.max(0,u+g)})):[]}_getRowTop(e,t,i=null){if(Array.isArray(e)){let i=1/0;return e.forEach((e=>{const n=this._node.getTop(e,t);Number.isFinite(n)&&(i=Math.min(i,n))})),i===1/0?0:i}return e&&this._node.getTop(e,t)||0}_getRowBottom(e,t,i=null){if(Array.isArray(e)){let n=-1/0;return e.forEach(((e,o)=>{const r=this._node.getBottom(e,t);let s=null;i?(s=i[o],!s&&e&&(s=this._getComputedStyleCached(e),i[o]=s)):e&&(s=this._getComputedStyleCached(e));const l=r+(s&&parseFloat(s.marginBottom)||0);Number.isFinite(l)&&(n=Math.max(n,l))})),n===-1/0?0:n}if(e){const i=this._node.getBottom(e,t)||0,n=this._getComputedStyleCached(e);return i+(parseFloat(n?.marginBottom)||0)}return 0}_scanGridLayout(e,t){const i=t.gridAutoFlow||"";if(!i.startsWith("row"))return{safe:!1,reason:`grid-auto-flow=${i}`};if(i.includes("dense"))return{safe:!1,reason:"grid-auto-flow dense not supported yet"};if("none"!==(t.gridTemplateAreas||"none"))return{safe:!1,reason:"grid-template-areas present"};const n=t.gridTemplateColumns||"",o=t.gridTemplateRows||"",r=e=>e.includes("subgrid")||e.includes("auto-fit")||e.includes("auto-fill")||e.includes("fit-content");if(r(n)||r(o))return{safe:!1,reason:"complex track sizing (subgrid/auto-fit/fit-content)"};return/\[.*?\]/.test(n)||/\[.*?\]/.test(o)?{safe:!1,reason:"named grid lines detected"}:{safe:!0}}}const on="background:#999;color:#FFF;padding: 0 4px;";class rn{constructor({config:e,DOM:t,node:i,selector:n}){this._debug=e.debugMode?{...e.debugConfig.pre}:{},this._DOM=t,this._selector=n,this._node=i,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,n,o){const r=o||this._DOM.getComputedStyle(e),s=["%c_splitPreNode\n","color:white"];this._debug._&&console.group("%c_splitPreNode","background:cyan"),this._debug._&&console.log(...s,"node",e,{pageBottom:t,fullPageHeight:i});const l=e=>isNaN(parseFloat(e))?0:Math.ceil(parseFloat(e)),a=(l(r.marginTop),l(r.marginBottom),l(r.paddingTop)),h=l(r.paddingBottom),c=l(r.borderTopWidth),g=l(r.borderBottomWidth),d=l(r.lineHeight),p=this._node.getTop(e,n),u=a+h+c+g;if(this._DOM.getElementOffsetHeight(e)1)return this._debug._&&console.log("%c END _splitPreNode TODO!",on),[];{if(this._DOM.isElementNode(_[0])){const e=_[0];return this._debug._&&console.warn("is Element Node",e),this._debug._&&console.log("%c END _splitPreNode ???????",on),[]}this._node.isWrappedTextNode(_[0])&&this._debug._&&console.warn(`is TEXT Node: ${_[0]}`);const n=_[0].wholeText,o=this._node.splitTextByLinesGreedy(n);if(o.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t}));this._debug._&&console.log("linesFromNode",h),this._DOM.replaceNodeContentsWith(e,...h);const d=0,f=d+c,m=d+g;let b=t-p-m-u; +var HTML2PDF4DOC;(()=>{"use strict";var e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{init:()=>Dn});var i={};e.r(i),e.d(i,{log:()=>R,logGroup:()=>D,logGroupEnd:()=>v,strictAssert:()=>x});var n={};e.r(n),e.d(n,{isAfterContentFlowStart:()=>Z,isComplexTextBlock:()=>X,isContentFlowEnd:()=>J,isContentFlowStart:()=>Y,isFlexRow:()=>ge,isForcedPageBreak:()=>ne,isFullySPlitted:()=>de,isGrid:()=>se,isGridAutoFlowRow:()=>ce,isIMG:()=>$,isInline:()=>oe,isInlineBlock:()=>re,isLiNode:()=>j,isNeutral:()=>z,isNoBreak:()=>ee,isNoHanging:()=>te,isOBJECT:()=>W,isPRE:()=>he,isPageStartElement:()=>K,isSTYLE:()=>L,isSVG:()=>G,isSelectorMatching:()=>H,isSignificantTextNode:()=>I,isSlice:()=>ie,isSlough:()=>pe,isSyntheticTextWrapper:()=>Q,isTableLikeNode:()=>le,isTableNode:()=>ae,isWrappedTextGroup:()=>q,isWrappedTextLine:()=>U,isWrappedTextNode:()=>V});var o={};e.r(o),e.d(o,{insertStyle:()=>ue});var r={};e.r(r),e.d(r,{isFirstChildOfFirstChild:()=>fe,isLastChildOfLastChild:()=>me,isLineChanged:()=>be,isLineKept:()=>we,resolveFlowElement:()=>Me,setInitStyle:()=>Se});var s={};e.r(s),e.d(s,{getBottom:()=>Ee,getBottomWithMargin:()=>De,getContentHeightByProbe:()=>Ie,getEmptyNodeHeightByProbe:()=>Fe,getHeightWithMargin:()=>ve,getLineHeight:()=>Be,getMaxWidth:()=>xe,getNormalizedBottomWithMargin:()=>Oe,getNormalizedTop:()=>ye,getTableEmptyRowHeight:()=>Ne,getTableEntries:()=>He,getTableRowHeight:()=>ke,getTableRowShellHeightByTD:()=>Ae,getTop:()=>Te,getTopForPageStartCandidate:()=>Ce,getTopWithMargin:()=>Re});var l={};e.r(l),e.d(l,{create:()=>Le,createComplexTextBlock:()=>qe,createForcedPageBreak:()=>Ze,createNeutral:()=>$e,createNeutralBlock:()=>Ge,createPrintPageBreak:()=>Ue,createSignpost:()=>Je,createSliceWrapper:()=>Qe,createTable:()=>Xe,createTestNodeFrom:()=>Ke,createTextGroup:()=>ze,createTextLine:()=>je,createTextNodeWrapper:()=>We,createWithFlagNoBreak:()=>Ve,createWord:()=>Ye});var a={};e.r(a),e.d(a,{prepareSplittedNode:()=>nt,splitByWordsGreedyWithSpacesFilter:()=>it,splitTextByLinesGreedy:()=>et,splitTextByWordsGreedy:()=>tt});var h={};e.r(h),e.d(h,{markBottomCut:()=>_t,markCleanBottomCut:()=>pt,markCleanTopCut:()=>dt,markPageEndElement:()=>gt,markPageStartElement:()=>ht,markProcessed:()=>rt,markSliceCuts:()=>ft,markSliceCutsInRows:()=>mt,markTopCut:()=>ut,setFlagNoBreak:()=>st,setFlagNoHanging:()=>lt,setFlagSlice:()=>at,unmarkPageStartElement:()=>ct});var c={};e.r(c),e.d(c,{wrapNodeChildrenWithNeutralBlock:()=>bt});var g={};e.r(g),e.d(g,{copyNodeWidth:()=>Ct,estimateInlineImgGapBelow:()=>Tt,fitElementWithinBoundaries:()=>St,fitElementWithinHeight:()=>Mt,lockNodesWidths:()=>Ot,lockTableWidths:()=>yt,scaleCellsToHeight:()=>Pt});var d={};e.r(d),e.d(d,{findAllForcedPageBreakInside:()=>Nt,findBetterForcedPageStarter:()=>Dt,findBetterPageStart:()=>vt,findFirstChildParent:()=>Ft,findFirstChildParentFromPage:()=>Rt,findLastChildParent:()=>Bt,findPreviousNonHangingsFromPage:()=>xt,findSuitableNonHangingPageStart:()=>kt});var p={};e.r(p),e.d(p,{getFirstChildrenChain:()=>jt,getLastChildrenChain:()=>zt,getPreparedChildren:()=>Gt,getSplitChildren:()=>Wt});var u={};e.r(u),e.d(u,{isReplacedElement:()=>Qt,resolveReplacedElement:()=>ei});var _={};e.r(_),e.d(_,{cloneAndCleanOutsideRange:()=>ai,getSplitPoints:()=>ii,getSplitPointsPerCells:()=>ni,isFirstSliceEmpty:()=>li,normalizeContentCuts:()=>ri,sliceNodeBySplitPoints:()=>oi,sliceNodeContentBySplitPoints:()=>si});var f={};e.r(f),e.d(f,{shouldSkipFlowElement:()=>pi});var m={};e.r(m),e.d(m,{buildRowSlices:()=>_i,evaluateRowSplitPlacement:()=>mi,paginationBuildBalancedRowSlices:()=>fi,replaceCurrentRowsAfterRowSplit:()=>bi,sliceCellsBySplitPoints:()=>ui});var b={};e.r(b),e.d(b,{paginationApplyFullPageScaling:()=>Pi,paginationScaleCellsToHeight:()=>Si,paginationShouldScaleFullPage:()=>Mi});var w={};e.r(w),e.d(w,{applyRowSlicesToEntriesAfterRowSplit:()=>Ci,computeRowFlags:()=>yi});var S={};e.r(S),e.d(S,{paginationRefreshRowsAfterSplit:()=>Ti,validateSplitterAdapter:()=>Oi});var M={};e.r(M),e.d(M,{paginationComputeCellShellHeights:()=>Ei});var P={};e.r(P),e.d(P,{handleRowOverflow:()=>Ri,handleRowSplitFailure:()=>xi,scaleRowCellsToHeight:()=>vi});var C={};e.r(C),e.d(C,{absorbShortTrailingSliceIfFits:()=>Bi,calculateFinalPartReclaimedHeight:()=>Fi});var y={};e.r(y),e.d(y,{paginationBuildRowEvaluationContext:()=>Ni,paginationCanAbsorbLastRow:()=>Ai});var O={};e.r(O),e.d(O,{paginationCalculateRowSplitBudget:()=>Gi,paginationHandleRowSlicesPlacement:()=>Ui,paginationProcessRowSplitResult:()=>zi,paginationResolveAlreadySlicedRow:()=>$i,paginationResolveOverflowingRow:()=>Ii,paginationResolveRowWithRowspan:()=>Li,paginationResolveSplittableRow:()=>Vi,paginationSplitRow:()=>Wi});const T={init:"[html2pdf]",root:"html2pdf-root",paperFlow:"html2pdf-paper-flow",contentFlow:"html2pdf-content-flow",overlayFlow:"html2pdf-overlay-flow",pageDivider:"html2pdf-page",pageStartMarker:"[html2pdf-page-start]",pageEndMarker:"[html2pdf-page-end]",contentFlowStart:"html2pdf-content-flow-start",contentFlowEnd:"html2pdf-content-flow-end",style:"[html2pdf-style]",frontpageTemplate:"[html2pdf-frontpage]",headerTemplate:"[html2pdf-header]",footerTemplate:"[html2pdf-footer]",frontpageElement:"html2pdf-frontpage",frontpageContent:"html2pdf-frontpage-content",headerContent:"html2pdf-header",footerContent:"html2pdf-footer",pageNumberRoot:"[html2pdf-page-number]",pageNumberCurrent:"[html2pdf-page-number-current]",pageNumberTotal:"[html2pdf-page-number-total]",pageChrome:"html2pdf-page-chrome",pageBodySpacer:"html2pdf-page-body-spacer",pageHeader:"html2pdf-page-header",pageFooter:"html2pdf-page-footer",printPageBreak:"html2pdf-print-page-break",runningSafety:"html2pdf-print-running",virtualPaper:"html2pdf-virtual-paper",virtualPaperTopMargin:"html2pdf-virtual-paper-margin-top",virtualPaperBottomMargin:"html2pdf-virtual-paper-margin-bottom",virtualPaperGap:"html2pdf-virtual-paper-gap",printIgnore:"[html2pdf-print-ignore]",printHide:"[html2pdf-print-hide]",neutral:"html2pdf-neutral",word:"html2pdf-word",textNode:"html2pdf-text-node",textLine:"html2pdf-text-line",textGroup:"html2pdf-text-group",complexTextBlock:"html2pdf-complex-text-block",printForcedPageBreak:"html2pdf-print-forced-page-break",split:"[html2pdf-split]",processed:"[html2pdf-processed]",flagNoBreak:"[html2pdf-flag-no-break]",flagNoHanging:"[html2pdf-flag-no-hanging]",flagSlice:"[html2pdf-flag-slice]",topCutPart:".html2pdf-top-cut",bottomCutPart:".html2pdf-bottom-cut",cleanTopCut:".html2pdf-clean-top-cut",cleanBottomCut:".html2pdf-clean-bottom-cut",tocPageNumber:"html2pdf-toc-page-number"},E="background:#eee;color:#888;padding: 0 1px 0 0;";function D(e,t="",i=!1){"boolean"==typeof t&&(i=t,t=""),!0===i?this._debug._&&console.groupCollapsed(`%c${e}`,t):this._debug._&&console.group(`%c${e}`,t)}function v(e){this._debug._&&console.log(`%c ā–² ${e} `,E),this._debug._&&console.groupEnd()}function R(e,...t){this._debug._&&console.log(`[${e}]`,...t)}function x(e,...t){this._assert&&console.assert(e,"ā›”",...t)}class F{constructor({DOM:e,config:t}){this.document=e,this.body=e.body,this._debug=t.debugMode?{...t.debugConfig.DOM}:{},this._assert=!!t.consoleAssert,Object.assign(this,i)}createElement(e){return this.document.createElement(e)}createDocumentFragment(){return this.document.createDocumentFragment()}cloneNode(e){return e?.cloneNode(!0)}cloneNodeWrapper(e){return e?.cloneNode(!1)}insertBefore(e,...t){const i=t.filter((e=>null!=e));e.before(...i)}insertAfter(e,...t){const i=t.filter((e=>null!=e));e.after(...i)}insertAtEnd(e,...t){const i=t.filter((e=>null!=e));e.append(...i)}insertAtStart(e,...t){const i=t.filter((e=>null!=e));e.prepend(...i)}insertInsteadOf(e,...t){this.insertBefore(e,...t),e.remove()}wrap(e,t){return e.before(t),t.append(e),t}moveContent(e,t){for(;e.firstChild;)t.append(e.firstChild);this.strictAssert(""===this.getInnerHTML(e))}moveRowContent(e,t){if(!e||!t)return void(this._debug._&&console.warn("moveRowContent(): sourceTR or targetTR is missing"));const i=this.getElementTagName(e),n=this.getElementTagName(t);this.strictAssert("TR"===i,`moveRowContent(): source is not TR, got ${i}`),this.strictAssert("TR"===n,`moveRowContent(): target is not TR, got ${n}`);const o=[...this.getChildren(e)],r=[...this.getChildren(t)];o.length!==r.length&&this._debug._&&console.warn(`moveRowContent(): cells count mismatch: ${o.length} (source) vs ${r.length} (target)`);const s=Math.min(o.length,r.length);for(let e=0;e0,"getAll(selectors), selectors:",e),1===e.length?[...this.getAllElements(e[0],t)]:[...e].flatMap((e=>[...this.getAllElements(e,t)]))}getElement(e,t=this.document){return this.strictAssert(e),t.querySelector(e)}getAllElements(e,t=this.document){return this.strictAssert(e),t.querySelectorAll(e)}getElementById(e,t=this.document){return t.getElementById(e)}getRightNeighbor(e){return e.nextElementSibling}getLeftNeighbor(e){return e.previousElementSibling}getParentNode(e){return e.parentElement}getNodeValue(e){return e.nodeValue}getLastElementChild(e){return e.lastElementChild}getFirstElementChild(e){return e.firstElementChild}getChildNodes(e){return e.childNodes}getChildren(e){return e.children}getElementOffsetParent(e){return e.offsetParent}getComputedStyle(e){return window.getComputedStyle(e)}getElementBCR(e){return e.getBoundingClientRect()}getElementOffsetLeft(e){return e?.offsetLeft}getElementOffsetHeight(e){return e?.offsetHeight}getElementOffsetWidth(e){return e?.offsetWidth}getElementOffsetTop(e){return e?.offsetTop}getElementOffsetBottom(e){return e?.offsetTop+e?.offsetHeight||void 0}getElementTagName(e){return e.tagName}getDataId(e){return e.dataset.id}getAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("getAttribute() must have 2 params"));const i=t.charAt(0);if("."!==i&&"#"!==i||this.log("getAttribute",`you're really sure ${t} is attribute selector?`),"["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return e.getAttribute(i)}e.getAttribute(t)}setAttribute(e,t,i){if(!e||!t)return void(this._debug._&&console.warn("setAttribute() must have 2 params"));const n=t.charAt(0);if("."!==n)if("#"!==n)if("["!==n)this.log("setAttribute",`you're really sure ${t} is a selector?`);else{this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const n=t.substring(1,t.length-1);e.setAttribute(n,i||"")}else{const i=t.substring(1);e.id=i}else{const i=t.substring(1);e.classList.add(i)}}setStyles(e,t){Object.entries(t).forEach((([t,i])=>{Array.isArray(i)?this.setStyle(e,t,i[0],i[1]||""):this.setStyle(e,t,i)}))}setStyle(e,t,i,n=""){const o=this._toKebab(t);null==i||""===i?e.style.removeProperty(o):e.style.setProperty(o,String(i),n)}_toKebab=e=>{if(e.includes("-"))return e;const t=e.match(/^(webkit|moz|ms|o)(?=[A-Z])/);return t&&(e="-"+t[1]+"-"+e.slice(t[1].length)),e.replace(/[A-Z]/g,(e=>"-"+e.toLowerCase()))};addClasses(e,...t){e.classList.add(...t)}removeAttribute(e,t){if(!e||!t)return void(this._debug._&&console.warn("removeAttribute() must have 2 params"));const i=t.charAt(0);if(this.strictAssert(i.match(/[a-zA-Z#\[\.]/),`removeAttribute() expects a valid selector, but received ${t}`),"."!==i)if("#"!==i)if("["!==i)e.removeAttribute(attr);else{this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);e.removeAttribute(i)}else{const i=t.substring(1);e.removeAttribute(i)}else{const i=t.substring(1);e.classList.remove(i)}}removeAllAttributes(e){for(;e.attributes.length>0;)e.removeAttribute(e.attributes[0].name)}removeClasses(e,...t){e.classList.remove(...t)}removeAllClasses(e){e.classList=""}removeAllStyles(e){e.style=""}getInnerHTML(e){if("string"==typeof e){const t=this.document.querySelector(e);return t?t.innerHTML:void 0}return e.innerHTML}setInnerHTML(e,t){if("string"==typeof e){const i=this.document.querySelector(e);i&&(i.innerHTML=t)}e.innerHTML=t}isDocumentBody(e){return"BODY"===e.tagName}isTextNode(e){return e.nodeType===Node.TEXT_NODE}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}hasClass(e,t){return e.classList.contains(t)}hasID(e,t){return e.id===t}hasAttribute(e,t){return e.hasAttribute(t)}}class B{constructor(e){this.config=e,this._printWidth=parseFloat(this.config.paperWidth),this._printLeft=parseFloat(this.config.printLeftMargin),this._printRight=parseFloat(this.config.printRightMargin),this._printContentWidth=this._printWidth-this._printLeft-this._printRight+"px",this._flowPreviewPaddingBottom="100px",this._chromeBorderSafeSpace="2px",this._ensureBFC="display: flow-root",this.charWidth="10px"}create(){return this._pageRule()+this._layoutStyles().screen+this._layoutStyles().print+this._chromeStyles().screen+this._chromeStyles().print+this._serviceElementsStyle().screen+this._serviceElementsStyle().print+this._cutEdgeStyle()+(this.config.debugMode?this._testScreenOnlyStyle():"")}_pageRule(){return`@page {\n size: A4;\n size: ${`${this.config.paperWidth} ${this.config.paperHeight}`};\n margin-left: ${this.config.printLeftMargin};\n margin-right: ${this.config.printRightMargin};\n margin-top: ${this.config.printTopMargin};\n margin-bottom: 0;\n}`}_layoutStyles(){return{screen:`\n${T.root} {\n --paper-color: ${this.config.paperColor};\n display: flow-root;\n position: relative;\n z-index: 1;\n width: ${this._printContentWidth};\n margin: 0 auto;\n font-size: ${this.config.printFontSize};\n padding-bottom: ${this._flowPreviewPaddingBottom};\n}\n\n${T.contentFlow} {\n display: block;\n}\n\n${T.paperFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: -1;\n padding-bottom: ${this._flowPreviewPaddingBottom};\n pointer-events: none;\n}\n\n${T.overlayFlow} {\n display: block;\n position: absolute;\n width: 100%;\n z-index: 2147483647;\n padding-bottom: ${this._flowPreviewPaddingBottom};\n pointer-events: none;\n}\n\n${T.virtualPaper} {\n display: grid;\n grid-template-columns: 1fr;\n grid-template-rows: minmax(min-content, max-content) minmax(min-content, max-content) 1fr minmax(min-content, max-content) minmax(min-content, max-content);\n place-items: stretch stretch;\n place-content: stretch stretch;\n width: ${this._printContentWidth};\n height: ${this.config.paperHeight};\n font-size: ${this.config.printFontSize};\n}\n\n${T.virtualPaper}::before {\n position: absolute;\n content: '';\n width: ${this.config.paperWidth};\n height: ${this.config.paperHeight};\n left: -${this.config.printLeftMargin};\n background: var(--paper-color, white);\n box-shadow: rgba(0, 0, 0, 0.1) 2px 2px 12px 0px;\n z-index: -1;\n}\n\n${T.pageChrome} {\n display: block;\n pointer-events: none;\n}\n\n${T.pageBodySpacer} {\n display: block;\n pointer-events: none;\n}\n\n${T.pageFooter},\n${T.pageHeader} {\n display: block;\n position: relative;\n pointer-events: auto;\n}\n\n${T.pageFooter}::before,\n${T.pageHeader}::before {\n content: '';\n position: absolute;\n inset: 0;\n z-index: -1;\n background: var(--paper-color, white);\n}\n\n${T.pageFooter}::before {\n top: ${this._chromeBorderSafeSpace};\n}\n\n${T.pageHeader}::before {\n bottom: ${this._chromeBorderSafeSpace};\n}\n\n${T.virtualPaperTopMargin} {\n display: block;\n height: ${this.config.printTopMargin};\n}\n\n${T.virtualPaperBottomMargin} {\n display: block;\n height: ${this.config.printBottomMargin};\n}\n\n${T.virtualPaperGap} {\n display: block;\n padding-top: ${this.config.virtualPagesGap};\n}\n\n${T.contentFlowStart},\n${T.contentFlowEnd},\n${T.pageDivider},\n${T.runningSafety} {\n ${this._ensureBFC};\n}\n `,print:`\n@media print {\n\n ${T.root},\n ${T.overlayFlow},\n ${T.paperFlow} {\n padding: 0;\n }\n\n ${T.paperFlow},\n ${T.printHide} {\n display: none !important;\n }\n\n ${T.printIgnore} {\n display: contents !important;\n }\n\n ${T.virtualPaperTopMargin},\n ${T.virtualPaperBottomMargin},\n ${T.virtualPaperGap} {\n display: none !important;\n }\n\n ${T.pageChrome},\n ${T.frontpageElement},\n ${T.pageBodySpacer} {\n break-inside: avoid;\n }\n}\n `}}_chromeStyles(){return{screen:`\n${T.headerContent},\n${T.footerContent} {\n display: block;\n font-size: small;\n}\n\n${T.headerContent} p,\n${T.footerContent} p {\n margin: 0;\n}\n\n${T.headerContent} {\n padding-bottom: ${this.config.headerMargin};\n padding-top: 10px; /* for page numbers */\n}\n\n${T.footerContent} {\n padding-top: ${this.config.footerMargin};\n min-height: 32px; /* for page numbers */\n}\n\n${T.tocPageNumber} {\n min-width: 3ch;\n display: flex;\n justify-content: flex-end;\n align-items: baseline;\n}\n\n${T.pageNumberRoot} {\n display: flex;\n column-gap: 2px;\n position: absolute;\n right: 0;\n text-align: right;\n line-height: 1;\n}\n\n${T.headerContent} ${T.pageNumberRoot} {\n top: 0;\n}\n\n${T.footerContent} ${T.pageNumberRoot} {\n bottom: 0;\n}\n `,print:""}}_cutEdgeStyle(){return`\n${T.topCutPart} {\n margin-top: 0 !important;\n}\n${T.bottomCutPart} {\n margin-bottom: 0 !important;\n}\n${T.cleanTopCut} {\n margin-top: 0 !important;\n padding-top: 0 !important;\n border-top: none !important;\n}\n${T.cleanBottomCut} {\n margin-bottom: 0 !important;\n padding-bottom: 0 !important;\n border-bottom: none !important;\n}\n `}_serviceElementsStyle(){const e="display: inline";return{screen:`\n.null {\n display: inline;\n padding: 0;\n margin: 0;\n font: 0;\n color: transparent;\n line-height: 0;\n border: none;\n outline: none;\n background: none;\n background-color: transparent;\n}\n\n${T.word},\n${T.textNode},\n${T.textLine},\n${T.textGroup},\n${T.neutral},\n${T.neutral} span {\n display: inline;\n padding: 0;\n margin: 0;\n font: inherit;\n color: inherit;\n line-height: inherit;\n background: none;\n background-color: transparent;\n}\n\n${T.textGroup} {\n display: block;\n}\n\n${T.textLine} {\n display: inline-block;\n}\n\n${T.textGroup} ${T.textLine} {\n ${e};\n}\n\n${T.complexTextBlock} {\n display: block;\n}\n\n${T.complexTextBlock} ${T.complexTextBlock} {\n ${e};\n}\n\n${T.printPageBreak} {\n ${this._ensureBFC};\n}\n\n${T.printForcedPageBreak} {\n display: block;\n visibility: hidden;\n height: 0;\n overflow: hidden;\n}\n `,print:`\n@media print {\n\n ${T.printPageBreak} {\n break-after: page;\n }\n\n ${T.textLine} {\n ${e};\n }\n}\n `}}_testScreenOnlyStyle(){return`\n/* DEBUG PREVIEW */\n@media screen {\n\n ${T.contentFlow} {\n background:repeating-linear-gradient(\n -45deg,\n rgba(222, 222, 222, .1),\n rgba(222, 222, 222, .1) 10px,\n rgba(222, 222, 222, .2) 10px,\n rgba(222, 222, 222, .2) 20px\n );\n }\n\n ${T.overlayFlow} {\n background:repeating-linear-gradient(\n 45deg,\n rgba(222, 222, 222, 0),\n rgba(222, 222, 222, 0) 18px,\n rgba(0, 166, 255, 0.05) 18px,\n rgba(0, 166, 255, 0.05) 20px\n );\n }\n\n ${T.virtualPaperGap} {\n background: #ff000020;\n }\n\n ${T.pageFooter},\n ${T.pageHeader} {\n background: #fff1ff99;\n }\n ${T.pageBodySpacer} {\n background: #ffee0020;\n }\n ${T.runningSafety} {\n background: #f200ff;\n outline: 0.1px dashed #f200ff88;\n }\n ${T.frontpageElement} {\n background: #00fcff20;\n }\n\n ${T.neutral} {\n background: #00ffee10;\n }\n\n ${T.textNode} {\n background: #00ff0010;\n }\n\n ${T.textGroup},\n ${T.textLine} {\n background: #0000ff08;\n }\n}\n `}}class k{constructor({config:e,DOM:t,node:n,selector:o}){this.success=!1,this._assert=!!e.consoleAssert,Object.assign(this,i),this.root,this.paperFlow,this.contentFlow,this.overlayFlow,this.frontpageTemplate,this.headerTemplate,this.footerTemplate,this._initialRoot,this._contentRoot,this._config=e,this._debug=e.debugMode?{...e.debugConfig.layout}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._customInitialRootSelector=e.initialRoot,this._defaultInitialRootSelector=o.init}create(){if(this._getTemplates(),this._insertStyle(),this._DOM.getElement(`style${this._selector.style}`)){if(this._createLayout(),this._DOM.getParentNode(this.root)!==this._initialRoot||this._DOM.getElementOffsetParent(this.paperFlow)!==this.root||this._DOM.getElementOffsetParent(this.contentFlow)!==this.root||this._DOM.getElementOffsetParent(this.overlayFlow)!==this.root)return this.strictAssert(this._DOM.getParentNode(this.root)===this._initialRoot,"Failed to insert the layout root into the DOM."),this.strictAssert(this._DOM.getElementOffsetParent(this.paperFlow)===this.root,"Failed to insert the paperFlow element into the DOM."),void this.strictAssert(this._DOM.getElementOffsetParent(this.contentFlow)===this.root,"Failed to insert the contentFlow element into the DOM.");this.success=!0}else console.error("Failed to add print styles into the DOM.")}_getTemplates(){this.strictAssert(this._selector.frontpageTemplate,"frontpageTemplate selector is missing"),this.strictAssert(this._selector.headerTemplate,"headerTemplate selector is missing"),this.strictAssert(this._selector.footerTemplate,"footerTemplate selector is missing"),this.frontpageTemplate=this._DOM.getInnerHTML(this._selector.frontpageTemplate),this.headerTemplate=this._DOM.getInnerHTML(this._selector.headerTemplate),this.footerTemplate=this._DOM.getInnerHTML(this._selector.footerTemplate)}_insertStyle(){this._node.insertStyle(new B(this._config).create())}_createLayout(){this._getInitialRoot(),this._initialRoot?(this.log("create Layout","initial root:",this._initialRoot),this._createRoot(),this._createPaperFlow(),this._createContentFlow(),this._createOverlayFlow(),this._DOM.moveContent(this._initialRoot,this.contentFlow),this._DOM.insertAtEnd(this._initialRoot,this.root),this._DOM.insertAtEnd(this.root,this.paperFlow,this.overlayFlow,this.contentFlow),this._insertContentFlowStartAndEnd(this.contentFlow),this._ignoreUnprintableEnvironment(this.root)):console.error("Failed to initialize the root element.")}_insertContentFlowStartAndEnd(e){const t=this._node.create(this._selector.contentFlowStart),i=this._node.create(this._selector.contentFlowEnd);return this._DOM.insertAtStart(e,t),this._DOM.insertAtEnd(e,i),{contentFlowStart:t,contentFlowEnd:i}}_getInitialRoot(){let e=this._customInitialRootSelector?this._DOM.getElement(this._customInitialRootSelector):this._DOM.getElement(this._defaultInitialRootSelector);if(!e){if(!this._DOM.body)return void console.error("We expected to find the BODY tag.");e=this._DOM.body,console.warn(`The printable area is currently unspecified and encompasses the entire contents of the BODY tag. To restrict the printed content to a specific area, include ${this._defaultInitialRootSelector} in the root element of the desired printing area.`)}return this._initialRoot=e,e}_createRoot(){const e=this._node.create(this._selector.root);return this._DOM.setStyles(e,{visibility:"hidden"}),this.root=e,e}_createPaperFlow(){const e=this._node.create(this._selector.paperFlow);return this.paperFlow=e,e}_createOverlayFlow(){const e=this._node.create(this._selector.overlayFlow);return this.overlayFlow=e,e}_createContentFlow(){const e=this._node.create(this._selector.contentFlow);return this.contentFlow=e,e}_ignoreUnprintableEnvironment(e){if(e===this._DOM.body)return void this.strictAssert(!1,"misshapen root");let t=this._DOM.getParentNode(e);this._DOM.setAttribute(t,this._selector.printIgnore),this._DOM.getChildNodes(t).forEach((t=>{if(t!==e&&this._DOM.isElementNode(t))this._DOM.setAttribute(t,this._selector.printHide);else{if(!this._node.isSignificantTextNode(t))return;{const e=this._node.createTextNodeWrapper();this._DOM.wrap(t,e),this._DOM.setAttribute(e,this._selector.printHide)}}})),this._DOM.isDocumentBody(t)||this._ignoreUnprintableEnvironment(t)}}function N(e){return function(t){return t._config.debugMode&&t._debug[e]}}const A=N("selectors");function H(e,t){if(!e||!t)return void(A(this)&&console.warn("isSelectorMatching() must have 2 params","\n element: ",e,"\n selector: ",t));const i=t.charAt(0);if("."===i){const i=t.substring(1);return this._DOM.hasClass(e,i)}if("#"===i){const i=t.substring(1);return this._DOM.hasID(e,i)}if("["===i){this.strictAssert("]"===t.at(-1),`the ${t} selector is not OK.`);const i=t.substring(1,t.length-1);return this._DOM.hasAttribute(e,i)}return this._DOM.getElementTagName(e)===t.toUpperCase()}function I(e){return!!this._DOM.isTextNode(e)&&this._DOM.getNodeValue(e).trim().length>0}function L(e){return"STYLE"===this._DOM.getElementTagName(e)}function $(e){return"IMG"===this._DOM.getElementTagName(e)}function G(e){return"svg"===this._DOM.getElementTagName(e)}function W(e){return"OBJECT"===this._DOM.getElementTagName(e)}function j(e){return"LI"===this._DOM.getElementTagName(e)}function z(e){return this.isSelectorMatching(e,this._selector.neutral)}function V(e){return this.isSelectorMatching(e,this._selector.textNode)}function U(e){return this.isSelectorMatching(e,this._selector.textLine)}function q(e){return this.isSelectorMatching(e,this._selector.textGroup)}function K(e){return this.isSelectorMatching(e,this._selector.pageStartMarker)}function Y(e){return this.isSelectorMatching(e,this._selector.contentFlowStart)}function Z(e){const t=this._DOM.getLeftNeighbor(e);return this.isSelectorMatching(t,this._selector.contentFlowStart)}function J(e){return this.isSelectorMatching(e,this._selector.contentFlowEnd)}function X(e){return this.isSelectorMatching(e,this._selector.complexTextBlock)}function Q(e){return this.isComplexTextBlock(e)||this.isWrappedTextNode(e)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)}function ee(e,t){return this.isSelectorMatching(e,this._selector.flagNoBreak)||this.isWrappedTextLine(e)||this.isWrappedTextGroup(e)||this.isInlineBlock(e,t)||this.notSolved(e)}function te(e){return this.isSelectorMatching(e,this._selector.flagNoHanging)}function ie(e){return this.isSelectorMatching(e,this._selector.flagSlice)}function ne(e){return this.isSelectorMatching(e,this._selector.printForcedPageBreak)}function oe(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline"===i||"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function re(e,t){if(!(e instanceof HTMLElement))return;const i=(t||this._DOM.getComputedStyle(e)).display;return"inline-block"===i||"inline-table"===i||"inline-flex"===i||"inline-grid"===i}function se(e,t){if(!(e instanceof HTMLElement))return;return"grid"===(t||this._DOM.getComputedStyle(e)).display}function le(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return"TABLE"!==this._DOM.getElementTagName(e)&&["table"].includes(i.display)}function ae(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return"TABLE"===this._DOM.getElementTagName(e)||["table"].includes(i.display)}function he(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e);return["block"].includes(i.display)&&["pre","pre-wrap","pre-line","break-spaces","nowrap"].includes(i.whiteSpace)}function ce(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),n=i.display,o=i.gridAutoFlow;return("grid"===n||"inline-grid"===n)&&"row"===o}function ge(e,t){if(!(e instanceof HTMLElement))return;const i=t||this._DOM.getComputedStyle(e),n=i.display;if("flex"!==n&&"inline-flex"!==n)return!1;return(i.flexDirection||"").startsWith("row")}function de(e,t){const i=t||this._DOM.getComputedStyle(e);return this.isPRE(e,i)||this.isTableNode(e,i)||this.isTableLikeNode(e,i)||this.isGridAutoFlowRow(e,i)}function pe(e){return this._DOM.hasAttribute(e,"slough-node")}function ue(e,t=""){const i=this._DOM.getElement("head"),n=this._DOM.body;if(!i&&!n)return void console.error("Check the structure of your document. We didn`t find HEAD and BODY tags. HTML2PDF4DOC expects valid HTML.");const o=this.create("style",e);o?(this._DOM.setAttribute(o,this._selector.style,t),i?this._DOM.insertAtEnd(i,o):n?this._DOM.insertBefore(n,o):this.strictAssert(!1,"We expected to find the HEAD and BODY tags.")):console.error("Failed to create print styles")}const _e=N("positioning");function fe(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getFirstElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function me(e,t){if(!e||!this._DOM.getParentNode(e))return!1;let i=e;for(;this._DOM.getParentNode(i)&&i!==t;){if(this._DOM.getParentNode(i)===t){let e=this._DOM.getRightNeighbor(i);for(;!this._DOM.getElementOffsetHeight(e)&&!this._DOM.getElementOffsetWidth(e);)if(e=this._DOM.getRightNeighbor(e),this.isContentFlowEnd(e))return!0;return this.isContentFlowEnd(e)}if(this._DOM.getLastElementChild(this._DOM.getParentNode(i))!==i)return!1;i=this._DOM.getParentNode(i)}return i===t}function be(e,t){return this._DOM.getElementOffsetTop(t)-this._DOM.getElementOffsetBottom(e)>-2}function we(e,t){const i=this._DOM.getElementOffsetBottom(e),n=this._DOM.getElementOffsetTop(t),o=i-n,r=o>=2;return _e(this)&&console.group("isLineKept?"),_e(this)&&console.log("\n",r,"\n","\n currentBottom",i,[e],"\n nextTop",n,[t],"\n delta",o),_e(this)&&console.groupEnd("isLineKept?"),r}function Se(e,t,i){const n="[init-position]",o="[init-vertical-align]",r="relative",s=i||this._DOM.getComputedStyle(t),l=s.position,a=s.verticalAlign;if(e)l!=r&&(this._DOM.setStyles(t,{position:r}),this._DOM.setAttribute(t,n,l)),"top"!=a&&(this._DOM.setStyles(t,{"vertical-align":"top"}),this._DOM.setAttribute(t,o,a));else{const e=this._DOM.getAttribute(t,n),i=this._DOM.getAttribute(t,o);e&&(this._DOM.setStyles(t,{position:e}),this._DOM.removeAttribute(t,n)),i&&(this._DOM.setStyles(t,{"vertical-align":i}),this._DOM.removeAttribute(t,o))}}function Me(e,{prefer:t="self"}={}){if(!e)return null;const i=e=>"last"===t?this._DOM.getLastElementChild(e):"first"===t||"self"===t?this._DOM.getFirstElementChild(e):null,n=new Set;let o=e;for(;o&&!n.has(o);){n.add(o);if(this._DOM.getElementOffsetParent(o))return o;const e=this._DOM.getComputedStyle(o);if(!e)return null;const t=e.display,r=e.visibility,s=e.position;if("none"===t||"collapse"===r||"fixed"===s)return null;if("contents"!==t)return null;{const e=i.call(this,o);if(!e)return null;o=e}}return null}const Pe=N("getters");function Ce(e,t){return this.getTop(e,t)}function ye(e,t,i){const n=i||this._DOM.getComputedStyle(t),o=parseFloat(n.paddingTop)||0;return this.getTop(e,t)-o}function Oe(e,t,i){const n=i||this._DOM.getComputedStyle(t),o=parseFloat(n.paddingTop)||0;return this.getBottomWithMargin(e,t)-o}function Te(e,t=null,i=0){if(!e)return void(Pe(this)&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0));if(null===t)return this._DOM.getElementOffsetTop(e);if(!t)return void(Pe(this)&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0));const n=this._DOM.getElementOffsetParent(e);if(!n)return void(Pe(this)&&console.warn("Element has no offset parent.","\n element:",[e],"\n offsetParent:",n,"\n The function returned:",void 0));const o=this._DOM.getElementOffsetTop(e);return n===t?o+i:this.getTop(n,t,i+o)}function Ee(e,t=null){if(e){if(null===t)return this._DOM.getElementOffsetBottom(e);if(t)return this.getTop(e,t)+this._DOM.getElementOffsetHeight(e);Pe(this)&&console.warn("root must be provided, but was received:",t,"\nThe function returned:",void 0)}else Pe(this)&&console.warn("element must be provided, but was received:",e,"\nThe function returned:",void 0)}function De(e,t){if(!e)return;const i=this.getBottom(e,t);let n;const o=this.createNeutralBlock();this._DOM.insertAfter(e,o);const r=this.getTop(o,t);this._DOM.removeNode(o);if(r>=i)n=r;else{n=i+parseInt(this._DOM.getComputedStyle(e).marginBottom)}return n}function ve(e){const t=parseInt(this._DOM.getComputedStyle(e).marginTop),i=parseInt(this._DOM.getComputedStyle(e).marginBottom);return this._DOM.getElementOffsetHeight(e)+t+i}function Re(e,t){const i=parseInt(this._DOM.getComputedStyle(e).marginTop);return this.getTop(e,t)-i}function xe(e){const t=this.create();this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetWidth(t);return this._DOM.removeNode(t),i}function Fe(e,t="",i=!0){const n=this.create();i&&this._DOM.setStyles(n,{overflow:"auto"});const o=this._DOM.cloneNodeWrapper(e);this._DOM.setInnerHTML(o,t),this._DOM.insertAtEnd(n,o),this._DOM.insertBefore(e,n);const r=this._DOM.getElementOffsetHeight(n);return this._DOM.removeNode(n),r}function Be(e){const t=this.createNeutral();this._DOM.setInnerHTML(t,"!"),this._DOM.setStyles(t,{display:"block"}),this._DOM.insertAtEnd(e,t);const i=this._DOM.getElementOffsetHeight(t);return this._DOM.removeNode(t),i}function ke(e,t=0){const i=this._DOM.getElementOffsetTop(e),n=this._DOM.cloneNode(e),o="!
".repeat(t);[...n.children].forEach((e=>this._DOM.setInnerHTML(e,o))),this._DOM.insertBefore(e,n);const r=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(n),r-i}function Ne(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e);this._DOM.insertBefore(e,i);const n=this._DOM.getElementOffsetTop(e);return this._DOM.removeNode(i),n-t}function Ae(e){const t=this._DOM.getElementOffsetTop(e),i=this._DOM.cloneNodeWrapper(e),n=e.children.length,o=[...e.children];this._DOM.insertBefore(e,i);const r=[];for(let s=0;sthis._DOM.removeNode(e)))}return this._DOM.removeNode(i),r}function He(e){if(!(e instanceof HTMLElement)||"TABLE"!==e.tagName)throw new Error("Expected a
element.");const t=[...e.children].reduce(((e,t)=>{const i=t.tagName;return"TBODY"===i?{...e,rows:[...e.rows,...t.children]}:"CAPTION"===i?(this.setFlagNoBreak(t),{...e,caption:t}):"COLGROUP"===i?(this.setFlagNoBreak(t),{...e,colgroup:t}):"THEAD"===i?(this.setFlagNoBreak(t),{...e,thead:t}):"TFOOT"===i?(this.setFlagNoBreak(t),{...e,tfoot:t}):"TR"===i?{...e,rows:[...e.rows,...t]}:(Pe(this)&&t&&console.warn("unexpected:",t),{...e,unexpected:[...e.unexpected,...t]})}),{caption:null,thead:null,tfoot:null,rows:[],unexpected:[]});return t.unexpected.length>0&&Pe(this)&&console.warn(`something unexpected is found in the table ${e}`),t}function Ie(e,t){const i=t||this._DOM.getComputedStyle(e),n=this.createNeutralBlock();this._DOM.setStyles(n,{display:"block",padding:"0",margin:"0",border:"0",height:"0",clear:"both",visibility:"hidden",contain:"layout"}),this._DOM.insertAtEnd(e,n);const o=this.getNormalizedTop(n,e,i);return this._DOM.removeNode(n),o}N("creators");function Le(e,t){let i;if(e){const t=e.charAt(0);if(t.match(/[#\[\.]/))i=this._DOM.createElement("div"),this._DOM.setAttribute(i,e);else{if(!t.match(/[a-zA-Z]/))return void this.strictAssert(!1,"Expected valid html selector ot tag name, but received:",e);i=this._DOM.createElement(e)}}else i=this._DOM.createElement("div");return t&&this._DOM.setInnerHTML(i,t),i}function $e(){return this.create(this._selector.neutral)}function Ge(){const e=this.createNeutral();return e.style.display="block",e.style.clear="both",e}function We(){return this.create(this._selector.textNode)}function je(){return this.create(this._selector.textLine)}function ze(){return this.create(this._selector.textGroup)}function Ve(e){const t=this.create(this._selector.flagNoBreak);return e&&this._DOM.setStyles(t,e),t}function Ue(){return this.create(this._selector.printPageBreak)}function qe(){return this.create(this._selector.complexTextBlock)}function Ke(e){const t=this._DOM.cloneNodeWrapper(e);return this._DOM.setAttribute(t,".test-node"),this._DOM.setStyles(t,{position:"absolute",background:"rgb(255 239 177)",width:this.getMaxWidth(e)+"px"}),t}function Ye(e,t){const i=this.create(this._selector.word);return this._DOM.setInnerHTML(i,e),i.dataset.index=t,i}function Ze(){return this.create(this._selector.printForcedPageBreak)}function Je(e,t){if(!t)return null;const i=this.create();return this._DOM.setStyles(i,{display:"flex",flexWrap:"nowrap",alignItems:"center",justifyContent:"center",textAlign:"center",fontSize:"8px",fontFamily:"sans-serif",letterSpacing:"1px",textTransform:"uppercase",height:t+"px"}),e&&this._DOM.setInnerHTML(i,e),this.setFlagNoBreak(i),i}function Xe({wrapper:e,caption:t,colgroup:i,thead:n,tfoot:o,tbody:r}){const s=e||this.create("table"),l=this.create("TBODY");return t&&this._DOM.insertAtEnd(s,t),i&&this._DOM.insertAtEnd(s,i),n&&this._DOM.insertAtEnd(s,n),r&&this._DOM.insertAtEnd(l,...r),this._DOM.insertAtEnd(s,l),o&&this._DOM.insertAtEnd(s,o),s}function Qe(e){const t=this._DOM.cloneNodeWrapper(e);return this.unmarkPageStartElement(t),this.setFlagNoBreak(t),t}N("splitters");function et(e){return e.split(/(?<=\n)/)}function tt(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).split(/(?<=\s|-)/)}function it(e){return(this._DOM.getNodeValue(e)||this._DOM.getInnerHTML(e)).trim().split(/(?<=\s|-)/).filter((e=>" "!=e))}function nt(e){const t=e,i=this.splitTextByWordsGreedy(e),n=i.map((e=>{const t=this._DOM.createElement("span");return this._DOM.setInnerHTML(t,e+" "),t})),o=this.createTestNodeFrom(e);return this._DOM.insertAtEnd(o,...n),this._DOM.insertAtEnd(e,o),{splittedNode:t,nodeWords:i,nodeWordItems:n}}const ot=N("markers");function rt(e,t){this._markupDebugMode&&this._DOM.setAttribute(e,this._selector.processed,"šŸ·ļø "+t)}function st(e){this._DOM.setAttribute(e,this._selector.flagNoBreak)}function lt(e,t){this._DOM.setAttribute(e,this._selector.flagNoHanging,t)}function at(e){this._DOM.setAttribute(e,this._selector.flagSlice)}function ht(e,t){this._DOM.setAttribute(e,this._selector.pageStartMarker,t)}function ct(e){this._DOM.removeAttribute(e,this._selector.pageStartMarker)}function gt(e,t){this._DOM.setAttribute(e,this._selector.pageEndMarker,t)}function dt(e){ot(this)&&console.log("[mark ⊤ cut]",e),e&&this._DOM.setAttribute(e,this._selector.cleanTopCut)}function pt(e){ot(this)&&console.log("[mark ⊄ cut]",e),e&&this._DOM.setAttribute(e,this._selector.cleanBottomCut)}function ut(e){ot(this)&&console.log("[mark ⊤ cut]",e),e&&this._DOM.setAttribute(e,this._selector.topCutPart)}function _t(e){ot(this)&&console.log("[mark ⊄ cut]",e),e&&this._DOM.setAttribute(e,this._selector.bottomCutPart)}function ft(e){if(e&&e.length)if(1!==e.length)for(let t=0;t0,n=t0,o=t","color:blue",i),r=i,s=[...this._DOM.getChildren(i)]):Array.isArray(i)?(ot(this)&&console.log("%c[markSliceCutsInRows] It is an Array","color:blue",i),r=void 0,s=i):this.strictAssert(0,"we expected TR or an array of elements!"),!r&&!s.length){ot(this)&&console.log("%c[markSliceCutsInRows] There was no split","color:red",{rowWrapper:r,cellWrappers:s});break}n&&(r&&(ot(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊄",r),this.markTopCut(r)),s.forEach((e=>{ot(this)&&console.log("[markSliceCutsInRows] cell šŸ–ļø ⊄",e),this.markTopCut(e)}))),o&&(r&&(ot(this)&&console.log("[markSliceCutsInRows] rowWrapper ⊤",r),this.markBottomCut(r)),s.forEach((e=>{ot(this)&&console.log("[markSliceCutsInRows] cell šŸ–ļø ⊤",e),this.markBottomCut(e)})))}else ot(this)&&console.log("%c[markSliceCutsInRows] The rows were not passed. Doing nothing.","color:red")}N("wrappers");function bt(e){const t=this._DOM.getChildren(e),i=this.createNeutralBlock();return this._DOM.insertAtStart(i,...t),this._DOM.insertAtStart(e,i),i}const wt=N("fitters");function St({element:e,height:t,width:i,vspace:n,hspace:o}){const r=n/t,s=o/i,l=ra&&(d||(d=this.wrapNodeChildrenWithNeutralBlock(s),g=this._DOM.getElementOffsetHeight(d)||g),this.fitElementWithinHeight(d,a),o=!0,wt(this)&&console.warn("šŸ’¢ scaleCellsToHeight: resized cell content",{cell:s,target:a}))}return o}function Ct(e,t){this._DOM.setStyles(e,{"box-sizing":"border-box",width:`${this._DOM.getElementOffsetWidth(t)}px`,"min-width":`${this._DOM.getElementOffsetWidth(t)}px`})}function yt(e){this.copyNodeWidth(e,e),this._DOM.getAll("td",e).forEach((e=>this.copyNodeWidth(e,e)))}function Ot(e){Array.isArray(e)&&e.forEach((e=>{e&&this.copyNodeWidth(e,e)}))}function Tt(e,t={}){const{descentRatio:i=.22,normalLH:n=1.2,safety:o=1}=t,r=getComputedStyle(e),s=parseFloat(r.fontSize)||0;let l;if("normal"!==r.lineHeight&&r.lineHeight){const e=parseFloat(r.lineHeight);l=Number.isFinite(e)?e:n*s}else l=n*s;const a=(Math.max(0,(l-s)/2)+i*s)*o;return Math.ceil(a)}const Et=N("pageBreaks");function Dt(e,t){let i=e;for(;;){const e=this.findFirstChildParent(i,t);if(e&&e!==i){i=e;continue}const n=Lt.call(this,i,"findBetterForcedPageStarter:left");if(!n||!this.isNoHanging(n))break;i=n}return i}function vt(e,t,i){Et(this)&&console.group("āž— findBetterPageStart");let n=!1,o=!1,r=!1;const s=this.getTop(t,i);Et(this)&&console.log("Start calculations:",{pageStart:e,lastPageStart:t,root:i,topLimit:s});const l=this.findFirstChildParentFromPage(e,s,i);let a;if(l)a=l;else{a=this.getTop(e,i)t?n:null}function Nt(e){return this._DOM.getAll(this._selector.printForcedPageBreak,e)}function At(e,t){let i=this._DOM.getParentNode(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getParentNode(i);return i}function Ht(e,t){let i=this._DOM.getFirstElementChild(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getRightNeighbor(i);return i}function It(e,t){let i=this._DOM.getLastElementChild(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getLeftNeighbor(i);return i}function Lt(e,t){let i=this._DOM.getLeftNeighbor(e);for(;i&&this.shouldSkipFlowElement(i,{context:t});)i=this._DOM.getLeftNeighbor(i);return i}const $t=N("children");function Gt(e){$t(this)&&console.group("🚸 getPreparedChildren of",e);let t=[];if(this.isComplexTextBlock(e))t=[...this._DOM.getChildren(e)],$t(this)&&console.info("🚸 getPreparedChildren: return children for complexTextBlock",t);else{if(!Yt.call(this,e))return $t(this)&&console.info("🪲 getPreparedChildren: empty node, skip & return []",e),[];{$t(this)&&console.groupCollapsed("āš—ļøšŸšø distill children"),t=[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this.isSTYLE(t))return $t(this)&&console.info("🚸 (getPreparedChildren) ignore STYLE",[t]),e;if(this.isSignificantTextNode(t)){const i=this.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),$t(this)&&console.info("🚸 (getPreparedChildren) wrap and return TEXT NODE",[t]),e}if(this._DOM.isElementNode(t)){if(this.shouldSkipFlowElement(t,{context:"getPreparedChildren"}))return e;if(!this._DOM.getElementOffsetParent(t)){const i=this.getPreparedChildren(t);return i.length>0&&e.push(...i),$t(this)&&console.info("%c🚸 (getPreparedChildren) * no offset parent — unwrapped","color:green",i,[t]),e}return e.push(t),$t(this)&&console.info("🚸 (getPreparedChildren) * normal node",[t]),e}return $t(this)&&console.info("%c🚸 (getPreparedChildren) IGNORE whitespace / comment ...","color:red",[t]),e}),[]),$t(this)&&console.groupEnd("āš—ļøšŸšø distill children"),$t(this)&&console.info("🚸 distilled children",t);const i=Kt.call(this,t),n=this.isInline(e);i&&($t(this)&&console.info("🚸 isVerticalFlowDisrupted in children of element",[e]),n?($t(this)&&console.info("šŸŽ’šŸšø parent element is inline wrapper",[e]),t=[Ut.call(this,e)]):t=Vt.call(this,t))}}return $t(this)&&console.groupEnd("🚸 getPreparedChildren of"),$t(this)&&console.info("🚸 getPreparedChildren:",t),t}function Wt(e,t,i,n){let o=[];if(this.isNoBreak(e))return $t(this)&&console.info("🧔 isNoBreak",e),[];if(this.isComplexTextBlock(e))return $t(this)&&console.info("šŸ’š ComplexTextBlock",e),this._paragraph.split(e)||[];if(this.isWrappedTextNode(e))return $t(this)&&console.info("šŸ’š TextNode",e),this._paragraph.split(e)||[];if(!Yt.call(this,e))return $t(this)&&console.info("🪲 getSplitChildren: empty node, return []",e),[];const r=this._DOM.getComputedStyle(e);if(this.isTableLikeNode(e,r))$t(this)&&console.info("šŸ’š TABLE like",e),o=this._tableLike.split(e,t,i,n,r)||[];else if(this.isTableNode(e,r))$t(this)&&console.info("šŸ’š TABLE",e),o=this._table.split(e,t,i,n)||[];else if(this.isPRE(e,r))$t(this)&&console.info("šŸ’š PRE",e),o=this._pre.split(e,t,i,n,r)||[];else if(this.isFlexRow(e,r)){$t(this)&&console.info("🩷 Flex ROW",e);let t=this.getPreparedChildren(e);o=qt.call(this,t)}else this.isGridAutoFlowRow(e,r)?($t(this)&&console.info("šŸ’œ GRID"),o=this._grid.split(e,t,i,n)||[]):($t(this)&&console.info("šŸ’š found some node - use main this.getPreparedChildren() for:",e),o=this.getPreparedChildren(e));return o}function jt(e){const t=[];if(!e||!this||!this._DOM)return t;let i=e;for(;i;){let e=this._DOM.getFirstElementChild(i);for(;e&&this.shouldSkipFlowElement(e,{context:"getFirstChildren:firstChild"});)e=this._DOM.getRightNeighbor(e);if(!e)break;if(this.isSyntheticTextWrapper(e))break;t.push(e),i=e}return t}function zt(e){const t=[];if(!e||!this||!this._DOM)return t;let i=e;for(;i;){let e=this._DOM.getLastElementChild(i);for(;e&&this.shouldSkipFlowElement(e,{context:"getLastChildren:lastChild"});)e=this._DOM.getLeftNeighbor(e);if(!e)break;if(this.isSyntheticTextWrapper(e))break;t.push(e),i=e}return t}function Vt(e){let t=null;const i=[];return e.forEach((e=>{this.isInline(e)?(t||(t=Ut.call(this,e),i.push(t)),this._DOM.insertAtEnd(t,e)):(t=null,i.push(e))})),i}function Ut(e){const t=this.createComplexTextBlock();return this._DOM.wrap(e,t),t}function qt(e){const t=e.filter((e=>this._DOM.getElementOffsetHeight(e)>0));return t.length>0?t:e}function Kt(e){return e.some(((e,t,i)=>{const n=e,o=i[t+1];if(!o)return!1;return this._DOM.getElementOffsetBottom(n)>this._DOM.getElementOffsetTop(o)}))}function Yt(e){let t=e.firstChild;for(;t;){if(this._DOM.isElementNode(t)){if(!this.shouldSkipFlowElement(t,{context:"hasRenderableChild"}))return!0}else if(this.isSignificantTextNode(t))return!0;t=t.nextSibling}return!1}const Zt=N("media"),Jt=new Set(["IMG","SVG","OBJECT","EMBED","IFRAME","VIDEO","AUDIO","CANVAS"]);function Xt(e,t="self"){return"last"===t?this._DOM.getLastElementChild(e):this._DOM.getFirstElementChild(e)}function Qt(e){if(!e)return!1;const t=this._DOM.getElementTagName(e);if(!t)return!1;if("INPUT"===t){return"image"===(this._DOM.getAttribute(e,"type")||"").toLowerCase()}return Jt.has(t)}function ei(e,{prefer:t="self"}={}){if(!e)return null;const i=new Set;let n=e;for(;n&&!i.has(n);){if(i.add(n),this.isReplacedElement(n))return n;if("function"==typeof this.resolveFlowElement){const e=this.resolveFlowElement(n,{prefer:t});if(e&&e!==n){if(this.isReplacedElement(e))return e;n=e;continue}}const e=[...this._DOM.getChildren(n)].filter((e=>{const t=this._DOM.getComputedStyle(e)?.display;return"none"!==t}));if(1!==e.length)return Zt(this)&&console.info("🧭 resolveReplacedElement: branching or empty wrapper",n,e),null;n=Xt.call(this,n,t)||e[0]}return null}const ti=N("slicers");function ii({rootNode:e,rootComputedStyle:t,children:i,firstPartHeight:n,fullPageHeight:o,firstChild:r,points:s=[]}){if(!i.length)return ti(this)&&console.log("🧶 [getSplitPoints] %c has no children, early returns []","font-weight:bold",{rootNode:e}),[];const l=t=>{const i=this.findBetterPageStart(t,s.at(-1),e,e);return s.length||i!==r?(ti(this)&&console.log("%c 🧼🧼🧼🧼 push(point) in registerPoint()","color:violet",{point:i,points:s,firstChild:r},s.length),s.push(i),!1):(ti(this)&&console.log("%c !points.length && point === children[0] && children[1]","color:red"),ti(this)&&console.log("%c šŸ…¾ļø push(null) in registerPoint()","color:red"),s.push(null),!0)};ti(this)&&console.group("🧶 getSplitPoints"),ti(this)&&console.log("points.length",s.length);const a=t||this._DOM.getComputedStyle(e),h=new WeakMap,c=e=>{let t=h.get(e);return t||(t=Object.create(null),h.set(e,t)),t},g=t=>{if(!t)return NaN;const i=c(t);return"top"in i||(i.top=this.getNormalizedTop(t,e,a)),i.top},d=t=>{if(!t)return NaN;const i=c(t);return"bottomWithMargin"in i||(i.bottomWithMargin=this.getNormalizedBottomWithMargin(t,e,a)),i.bottomWithMargin},p=e=>{if(!e)return 0;const t=c(e);return"offsetHeight"in t||(t.offsetHeight=this._DOM.getElementOffsetHeight(e)),t.offsetHeight};this.setInitStyle(!0,e,a);let u=!1;const _=()=>(u||(u=!0,ti(this)&&console.groupEnd(`walking through ${i.length} children`),this.setInitStyle(!1,e,t),ti(this)&&console.groupEnd("getSplitPoints")),s);ti(this)&&console.group(`walking through ${i.length} children`,i);for(let t=0;th))if(ti(this)&&console.log("[getSplitPoints]",`next overtook the floater : (nextElementTop) ${b} > ${h}`,{currentElement:u},"does current overflow? let's check.",{isNextElementTopFinite:w}),(this.isSVG(u)||this.isIMG(u))&&ti(this)&&console.log("%cIMAGE","color:red;text-weight:bold"),S=d(u),S<=h){if(w){ti(this)&&console.log("[getSplitPoints]",`current fits: (currentElementBottom) ${S} <= ${h}, šŸŽ register nextElement as Point.`,{currentElement:u,nextElement:m});if(l(m))return ti(this)&&console.log("%cNULL CASE, return","color:red;text-weight:bold"),_();continue}ti(this)&&console.log("[getSplitPoints] nextElementTop not finite and current fits tail window",{currentElementBottom:S,floater:h,nextElement:m})}else ti(this)&&console.log(`šŸ”ŖšŸ„’ try to split overflowing current: (currentElementBottom > ) ${S} > ${h}`,{currentElement:u}),M=!0;if(!m){ti(this)&&console.log("%c[getSplitPoints] !nextElement","color:red"),ti(this)&&console.log("%c[getSplitPoints] * Try to split it. šŸ”ŖšŸ„’","color:blue"),S=S??d(u);let t=u;if(u.parentElement&&e.contains(u.parentElement)){let i=u.parentElement;for(;i&&e.contains(i)&&i!==e&&!this._DOM.getRightNeighbor(i);)t=i,i=i.parentElement}const i=t===u?S:d(t);if(i<=h){ti(this)&&console.log("%c šŸ• [getSplitPoints] !nextElement branch fits with container shell","color:violet",{currentElementBottom:S,containerBottom:i,floater:h,containerElement:t});continue}M=!0}if(!M)continue;let P=[];const C=this.getSplitChildren(u,n,o,e);if(C.length){if(P=ii.call(this,{rootNode:e,rootComputedStyle:a,children:C,firstPartHeight:n,fullPageHeight:o,firstChild:r,points:s}),0===P.length){const e=Math.max(n,o),t=p(u),i=t>e&&(!P.length||1===P.length&&null===P[0]);if(ti(this)&&console.log("room (Math.max)",e),i){if(ti(this)&&console.warn("%cāš ļø UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",u,`height: ${t}`),!s.length&&u===r)return ti(this)&&console.warn("šŸ…¾ļø (1) points.push(null) in isUnbreakableOversized"),s.push(null),_();if(m){if(l(m))return _()}}else if(l(u))return _()}}else{ti(this)&&console.log("šŸŽ currentElementChildren.length == 0");const e=p(u);if(e>c&&(!P.length||1===P.length&&null===P[0])){if(ti(this)&&console.warn("%cāš ļø UNSPLITTABLE OVERSIZED ELEMENT — SCALE IT","color:white; background:red; font-weight:bold;",u,`height: ${e}`),ti(this)&&console.warn("šŸ…¾ļø (2) points.push(null) in isUnbreakableOversized"),!s.length&&u===r)return s.push(null),_();if(m){ti(this)&&console.warn("šŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļøšŸ…¾ļø registerPoint(nextElement)");if(l(m))return _()}}else{if(l(u))return _()}}}return _()}function ni(e,t,i,n,o){ti(this)&&console.group("[āœ–ļø] getSplitPointsPerCells");const r=e.map(((e,r)=>{ti(this)&&console.group(`(•) Split CELL.${r} in:`,o);let s=[];const l=i-(t[r]||0),a=n-(t[r]||0);let h=this.getSplitChildren(e,l,a,o);if(h.length){const t=h[0];ti(this)&&console.log("firstChild",t),s=this.getSplitPoints({rootNode:e,children:h,firstPartHeight:l,fullPageHeight:a,firstChild:t})}else ti(this)&&console.log(`(•) empty cell #${r}`);return ti(this)&&console.log(`(•) return splitPoints for CELL#${r}`,s),ti(this)&&console.groupEnd(),s})),s=r.some(li);ti(this)&&console.log("🧽🧽🧽🧽🧽🧽🧽 isFirstPartEmptyInAnyCell",s);let l=r,a=!1;if(s){l=e.map(((e,r)=>{ti(this)&&console.group(`(••) Split CELL.${r} in:`,o);const s=i-(t[r]||0),l=n-(t[r]||0),a=this.getSplitChildren(e,s,l,o),h=a[0];ti(this)&&console.log("firstChild",h);let c=[];return a.length&&(c=this.getSplitPoints({rootNode:e,children:a,firstPartHeight:l,fullPageHeight:l,firstChild:h})),ti(this)&&console.log(`(••) return splitPoints for CELL#${r}`,c),ti(this)&&console.groupEnd(),c})),ti(this)&&console.log("[••] splitPointsPerCell",l);for(let e=0;e0&&this.strictAssert(i.every((e=>null!==e)),"sliceNodeBySplitPoints: splitPoints contains null — sanitize upstream before slicing"),this.strictAssert(i.every((e=>!e||e.nodeType===Node.ELEMENT_NODE&&(t===e||t.contains(e)))),"sliceNodeBySplitPoints: split point is not an Element within rootNode");for(let e=0;e<=i.length;e++){const o=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,o,r);this.normalizeContentCuts({slice:s,top:null!==o,bottom:null!==r}),this._DOM.getChildNodes(s).length>0&&n.push(s)}return ti(this)&&console.log(n),ti(this)&&console.groupEnd(`šŸ”Ŗ (${e}) sliceNodeBySplitPoints`),n}function ri({slice:e,top:t=!1,bottom:i=!1}){if(e){if(t){const t=[...this.getFirstChildrenChain(e)];t.forEach((e=>this.markCleanTopCut(e))),ti(this)&&console.log("[normalizeContentCuts] topChain šŸ‘—",t)}if(i){const t=[...this.getLastChildrenChain(e)];t.forEach((e=>this.markCleanBottomCut(e))),ti(this)&&console.log("[normalizeContentCuts] bottomChain šŸ‘—",t)}}else ti(this)&&console.log("[normalizeContentCuts] no slice has been passed; return")}function si({index:e,rootNode:t,splitPoints:i}){ti(this)&&console.group(`šŸ”Ŗ (${e}) sliceNodeContentBySplitPoints`);const n=[];for(let e=0;e<=i.length;e++){const o=i[e-1]??null,r=i[e]??null,s=this.cloneAndCleanOutsideRange(t,o,r);ti(this)&&console.log({slice:s});const l=this.createNeutralBlock();for(;s.firstChild;)l.appendChild(s.firstChild);l.childNodes.length>0&&n.push(l)}return ti(this)&&console.log(n),ti(this)&&console.groupEnd(`šŸ”Ŗ (${e}) sliceNodeContentBySplitPoints`),n}function li(e){return!!Array.isArray(e)&&(e.length>0&&null===e[0])}function ai(e,t,i){t&&t.setAttribute("split","start"),i&&i.setAttribute("split","end");let n=e.cloneNode(!0);if(t){let t=n.querySelector('[split="start"]'),i=t.previousElementSibling;for(;i;){let e=i;i=i.previousElementSibling,e.remove()}let o=t.parentElement;for(;o&&o!==e;){let e=o.previousElementSibling;for(;e;){let t=e;e=e.previousElementSibling,t.remove()}o=o.parentElement}t.removeAttribute("split")}if(i){let t=n.querySelector('[split="end"]'),i=t.nextElementSibling;for(;i;){let e=i;i=i.nextElementSibling,e.remove()}let o=t.parentElement;for(;o&&o!==e;){let e=o.nextElementSibling;for(;e;){let t=e;e=e.nextElementSibling,t.remove()}o=o.parentElement}t.remove()}return t&&t.removeAttribute("split"),i&&i.removeAttribute("split"),n}const hi=N("flowfilters"),ci="__html2pdfFlowFilter",gi=[{test:e=>"none"===e.display,cache:{reason:"display:none",message:"* display:none — skipped"}},{test:e=>"absolute"===e.position,cache:{reason:"position:absolute",message:"* position:absolute — skipped"}},{test:e=>"fixed"===e.position,cache:{reason:"position:fixed",message:"* position:fixed — skipped"}},{test:e=>"collapse"===e.visibility,cache:{reason:"visibility:collapse",message:"* visibility:collapse — skipped"}}];function di(e,t,i,n,{cached:o}={cached:!1}){if(!hi(e))return;const r=t?`(${t}) `:"",s=o?" (cached)":"";console.info(`🚸 ${r}${i.message}${s}`,[n])}function pi(e,{context:t="",computedStyle:i}={}){if(!(e&&this&&this._DOM&&this._DOM.isElementNode(e)))return!1;const n=e[ci];if(n)return di(this,t,n,e,{cached:!0}),!0;const o=i??this._DOM.getComputedStyle(e);if(!o)return!1;for(const i of gi)if(i.test(o))return e[ci]=i.cache,di(this,t,i.cache,e),!0;return!1}N("pagination");function ui({cells:e,splitPointsPerCell:t,sliceCell:i}){return t.map(((t,n)=>{const o=e[n];return i({cell:o,index:n,splitPoints:t})}))}function _i({originalRow:e,originalCells:t,slicedCellsPerOriginal:i,beginRow:n,cloneCellFallback:o,handleCell:r,finalizeRow:s}){const l=Math.max(...i.map((e=>e.length))),a=[];for(let h=0;h{const n=i[t][h]||o(e);r({context:l,cellClone:n,originalCell:e,cellIndex:t})})),a.push(s({context:l}))}return a}function fi({originalRow:e,originalCells:t,splitPointsPerCell:i,sliceCell:n,beginRow:o,cloneCellFallback:r,handleCell:s,finalizeRow:l}){if(!Array.isArray(i)||!i.length)return[];const a=this.sliceCellsBySplitPoints({cells:t,splitPointsPerCell:i,sliceCell:n});return this.buildRowSlices({originalRow:e,originalCells:t,slicedCellsPerOriginal:a,beginRow:o,cloneCellFallback:r,handleCell:s,finalizeRow:l})}function mi({usedRemainingWindow:e,isFirstPartEmpty:t,firstSliceTop:i,firstSliceBottom:n,pageBottom:o,epsilon:r=.5}){return{placeOnCurrentPage:e&&!t,remainingWindowSpace:Math.max(0,o-i),exceedsWindow:n>o+r}}function bi({currentRows:e,index:t,rowSlices:i}){return Array.isArray(e)?(e.splice(t,1,...i),e):[]}const wi=N("pagination");function Si({cells:e,targetHeight:t,shells:i}){return!!(Array.isArray(e)&&e.length&&t>0)&&this.scaleCellsToHeight(e,t,i)}function Mi({needsScalingInFullPage:e,cells:t}){return Boolean(e&&Array.isArray(t)&&t.length)}function Pi({needsScalingInFullPage:e,scaleCallback:t,payload:i}){if(!e)return!1;if("function"!=typeof t)return!1;const n=t(i||{});return!n&&this&&this._debug&&this._debug._&&wi(this)&&console.warn("[pagination.scaling] requested full-page scaling but callback reported no change",i),Boolean(n)}N("pagination");function Ci(e,t,i){e&&Array.isArray(e.rows)&&e.rows.splice(t,1,...i)}function yi({rows:e,DOM:t,cellTagFilter:i,guardCallback:n}){if(!Array.isArray(e))return{};let o=!1,r=!1,s=!1,l=null;e.forEach((e=>{const n=Array.isArray(e)?e:Array.from(t.getChildren(e)||[]);null==l&&(l=n.length),n.length!==l&&(s=!0),n.forEach((e=>{const n=t.getElementTagName(e);if(!i||i(n,e)){const t=parseInt(e.getAttribute?.("rowspan"));Number.isFinite(t)&&t>1&&(o=!0);const i=parseInt(e.getAttribute?.("colspan"));Number.isFinite(i)&&i>1&&(r=!0)}}))}));const a={hasRowspan:o,hasColspan:r,inconsistentCells:s};return n?.(a),a}N("pagination");function Oi(e){if(!e||"object"!=typeof e)throw new Error("splitter kernel adapter must be an object.");if(!e.rows||"object"!=typeof e.rows)throw new Error("splitter kernel adapter must expose a rows provider.");if("function"!=typeof e.rows.replaceRow)throw new Error("splitter kernel adapter rows.replaceRow must be a function.")}function Ti(e,{rowIndex:t,rowSlices:i}){Oi(e);const n=Number.isFinite(t)?t:0,o=Array.isArray(i)?i:[],r=e.rows;r.replaceRow({rowIndex:n,rowSlices:o}),r.syncEntries?.({rowIndex:n,rowSlices:o});const s=e.guards?.getConfig?.({rowIndex:n,rowSlices:o})??r.getGuardConfig?.({rowIndex:n,rowSlices:o})??null;let l=null;if(s){const t={rows:s.rows,DOM:s.DOM||this._DOM,cellTagFilter:s.cellTagFilter,guardCallback:s.guardCallback};Array.isArray(t.rows)&&t.DOM&&(l=this.computeRowFlags(t),e.guards?.onFlags?.({flags:l,rowIndex:n,rowSlices:o}))}return e.metrics?.refresh?.({rowIndex:n,rowSlices:o,flags:l}),r.onRowsChanged?.({rowIndex:n,rowSlices:o,flags:l}),{flags:l}}N("pagination");function Ei({cells:e}){return Array.isArray(e)&&e.length?e.map((e=>{if(!e)return 0;const t=this._DOM.getComputedStyle(e),i=(parseFloat(t?.paddingTop)||0)+(parseFloat(t?.paddingBottom)||0)+(parseFloat(t?.borderTopWidth)||0)+(parseFloat(t?.borderBottomWidth)||0);return Number.isFinite(i)?Math.max(0,i):0})):[]}const Di=N("pagination");function vi({ownerLabel:e,DOM:t,row:i,targetHeight:n,cachedShells:o,getRowShellHeightsCallback:r,scaleCellsToHeightCallback:s}){if(e||Di(this)&&console.warn("[scaleRowCellsToHeight] šŸ‘¤ Owner wanted!",{owner:e}),!i)return Di(this)&&console.warn("[pagination.overflow] Missing row for scaling.",{owner:e}),!1;if("function"!=typeof s)return Di(this)&&console.warn("[pagination.overflow] scaleCellsToHeight callback is required.",{owner:e}),!1;const l=t,a=l&&"function"==typeof l.getChildren?l.getChildren(i):null;return s(a?[...a]:[],n,Array.isArray(o)?o:"function"==typeof r?r(i):[])}function Ri({ownerLabel:e,rowIndex:t,row:i,availableRowHeight:n,fullPageHeight:o,splitStartRowIndexes:r,reasonTail:s,reasonFull:l,registerPageStartCallback:a,scaleProblematicCellsCallback:h,debugLogger:c}){return e||Di(this)&&console.warn("[handleRowOverflow] šŸ‘¤ Owner wanted!",{owner:e}),Array.isArray(r)?"function"!=typeof a?(Di(this)&&console.warn("[pagination.overflow] registerPageStart callback is required.",{owner:e}),t):n!1),isSlice:o=(()=>!1)}=t,{handleRowWithRowspan:r=(()=>e.rowIndex),handleSplittableRow:s=(()=>e.rowIndex),handleAlreadySlicedRow:l=(()=>e.rowIndex)}=i,{row:a}=e;return n(a,e)?r({evaluation:e}):o(a,e)?l({evaluation:e}):s({evaluation:e})}function Li({evaluation:e,splitStartRowIndexes:t,fullPageHeight:i,resolveOverflow:n,debug:o,afterResolve:r}){const{rowIndex:s,tailWindowHeight:l}=e;Hi(this)&&console.log("%c āš ļø Row has ROWSPAN; use conservative fallback (no slicing)","color:DarkOrange; font-weight:bold");const a=n({rowIndex:s,evaluation:e,availableRowHeight:l,splitStartRowIndexes:t,fullPageHeight:i});return r?.({evaluation:e,tailWindowHeight:l,fullPageHeight:i,result:a}),a}function $i({evaluation:e,splitStartRowIndexes:t,resolveSplitFailure:i,fullPageHeight:n,debug:o}){const{rowIndex:r,row:s,tailWindowHeight:l,delta:a}=e;return Hi(this)&&console.log(`%c Row # ${r} is slice! but don't fit`,"color:DarkOrange; font-weight:bold",s),Hi(this)&&console.warn("%c SUPER BIG","background:red;color:white",a,{part:n}),i({evaluation:e,splitStartRowIndexes:t,availableRowHeight:l,fullPageHeight:n})}function Gi({tailWindowHeight:e,minMeaningfulRowSpace:t,fullPartHeight:i,debug:n}){return ethis.sliceNodeBySplitPoints({index:t,rootNode:e,splitPoints:i})),f=l.beginRow||(({originalRow:t,sliceIndex:i})=>{const n=this._DOM.cloneNodeWrapper(t);return r?.({rowWrapper:n,rowIndex:e,sliceIndex:i,originalRow:t}),{rowWrapper:n}}),m=l.cloneCellFallback||(e=>this._DOM.cloneNodeWrapper(e)),b=l.handleCell||(({context:e,cellClone:t})=>{this._DOM.insertAtEnd(e.rowWrapper,t)}),w=l.finalizeRow||(({context:e})=>e.rowWrapper),S=[];if(d.some((e=>Array.isArray(e)&&e.length))){const e=this.paginationBuildBalancedRowSlices({originalRow:t,originalCells:h,splitPointsPerCell:d,sliceCell:_,beginRow:f,cloneCellFallback:m,handleCell:b,finalizeRow:w});S.push(...e)}else Hi(this)&&console.log("šŸ”“ There is no Split");return S.length&&this.markSliceCutsInRows(S),o&&o._&&console.log("%c newRows \n","color:magenta; font-weight:bold",S),{newRows:S,isFirstPartEmptyInAnyTD:p,needsScalingInFullPage:u}}function ji({row:e,rowIndex:t,decorateRowSlice:i}){const n=Array.isArray(e),o=this;return{getParentContainer:()=>n?null:e,getOriginalCells:()=>n?[...e]:[...o._DOM.getChildren(e)],getShellHeights:({cells:t})=>n?[]:o.getTableRowShellHeightByTD(e),markOriginalRow:({cells:t})=>{n||o.setFlagSlice(e)},beginRow:({originalRow:e,sliceIndex:r})=>{if(n)return{cells:[]};const s=o._DOM.cloneNodeWrapper(e);return i?.({rowWrapper:s,rowIndex:t,sliceIndex:r,originalRow:e}),{rowWrapper:s}},cloneCellFallback:e=>o._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{n?(o.setFlagSlice(t),e.cells.push(t)):o._DOM.insertAtEnd(e.rowWrapper,t)},finalizeRow:({context:e})=>n?e.cells:e.rowWrapper}}function zi({evaluation:e,splitResult:t,splitStartRowIndexes:i,insufficientRemainingWindow:n,extraCapacity:o,fullPageHeight:r,debug:s,handlers:l={}}){const{newRows:a,isFirstPartEmptyInAnyTD:h,needsScalingInFullPage:c}=t||{},{rowIndex:g,row:d,isLastRow:p,tailWindowHeight:u}=e,{onReplaceRow:_,onAbsorbTail:f,onRefreshRows:m,onPlacement:b,onSplitFailure:w}=l;return Array.isArray(a)&&a.length?(_?.({evaluation:e,newRows:a}),p&&f?.({evaluation:e,newRows:a,extraCapacity:o}),m?.({evaluation:e,newRows:a,splitStartRowIndexes:i}),b?.({evaluation:e,newRows:a,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:h,needsScalingInFullPage:c,splitStartRowIndexes:i})??e.rowIndex):(Hi(this)&&console.log(`%c The row is not split. (ROW.${g})`,"color:orange",d),w?.({evaluation:e,splitStartRowIndexes:i,availableRowHeight:u,fullPageHeight:r})??e.rowIndex)}function Vi({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:n,minPartLines:o,debug:r,decorateRowSlice:s,onBudgetInfo:l,handlers:a={}}){if(!e||!e.row)return e?.rowIndex??0;const{row:h}=e,c=this.getTableRowHeight(h,o),g=this.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:c,fullPartHeight:n,debug:r});l?.({evaluation:e,firstPartHeight:g.firstPartHeight,fullPartHeight:n});const d=a.getRowSliceAdapter,p=d?.({evaluation:e,row:h,rowIndex:e.rowIndex,decorateRowSlice:s}),u=this.paginationSplitRow({rowIndex:e.rowIndex,row:h,firstPartHeight:g.firstPartHeight,fullPageHeight:n,debug:r,decorateRowSlice:s,rowAdapter:p});return this.paginationProcessRowSplitResult({evaluation:e,splitResult:u,splitStartRowIndexes:t,insufficientRemainingWindow:g.insufficientRemainingWindow,extraCapacity:i,fullPageHeight:n,debug:r,handlers:a})}function Ui({evaluation:e,table:t,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r,splitStartRowIndexes:s,pageBottom:l,fullPageHeight:a,debug:h,registerPageStartCallback:c,scaleProblematicSliceCallback:g,applyFullPageScalingCallback:d}){const{rowIndex:p}=e,u=Array.isArray(i)?i[0]:null;if(!u)return c?.({targetIndex:p,reason:"Row split produced empty first slice"}),p-1;const _=this.getTop(u,t),f=this.getBottom(u,t),m=this.evaluateRowSplitPlacement({usedRemainingWindow:!n,isFirstPartEmpty:o,firstSliceTop:_,firstSliceBottom:f,pageBottom:l,epsilon:0});return m.placeOnCurrentPage?(m.remainingWindowSpace>0&&g?.(u,m.remainingWindowSpace),c?.({targetIndex:p+1,reason:"Row split — next slice starts new page"})):(d?.({row:u,needsScalingInFullPage:r,fullPageHeight:a}),c?.({targetIndex:p,reason:"Empty first part — move row to next page"})),p-1}class qi{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.paragraph}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._minParagraphLeftLines=2,this._minParagraphDanglingLines=2,this._minParagraphBreakableLines=this._minParagraphLeftLines+this._minParagraphDanglingLines||2,Object.assign(this,i)}split(e){return this._splitComplexTextBlockIntoLines(e)}_estimateLineCount(e){return Math.ceil(this._DOM.getElementOffsetHeight(e)/this._node.getLineHeight(e))}_splitComplexTextBlockIntoLines(e){if(this._debug._&&console.group("_splitComplexTextBlockIntoLines",[e]),this._estimateLineCount(e){const t=this._node.getLineHeight(e),i=this._DOM.getElementOffsetHeight(e),n=this._DOM.getElementOffsetLeft(e),o=this._DOM.getElementOffsetTop(e);return{element:e,lines:Math.ceil(i/t),left:n,top:o,height:i,lineHeight:t,text:this._DOM.getInnerHTML(e)}}));this._debug._&&console.log("\n🚸 nodeChildren",[...t],"\n🚸 extendedChildrenArray",[...i]);const n=i.flatMap((e=>e.lines>1&&!this._node.isNoBreak(e.element)?this._breakItIntoLines(e.element):e.element));this._debug._&&console.log("\n🚸🚸🚸\n partiallyLinedChildren",[...n]);const o=n.reduce(((e,t,i,n)=>(e||(e=[]),"BR"===this._DOM.getElementTagName(t)?(e.at(-1).push(t),e.push([]),this._debug._&&console.log("br; push:",t),e):!e.length||this._node.isLineChanged(e.at(-1).at(-1),t)?(e.push([t]),this._debug._&&console.log("ā—¼ļø start new line:",t),e):0===e.at(-1).length||e.length&&this._node.isLineKept(e.at(-1).at(-1),t)?(this._debug._&&console.log("⬆ add to line:",t),e.at(-1).push(t),e):void this.strictAssert(!0,"groupedPartiallyLinedChildren: An unexpected case of splitting a complex paragraph into lines.","\nOn the element:",t))),[]);if(this._debug._&&console.log("🟔🟔🟔 groupedPartiallyLinedChildren \n",o.length,[...o]),o.length{let i;if(0==e.length)i=e[0],i.setAttribute("role","🚫"),this.strictAssert(0==e.length,"The string cannot be empty (_splitComplexTextBlockIntoLines)");else if(1==e.length)i=e[0];else{i=this._node.createTextGroup(),this._DOM.insertBefore(e[0],i),this._DOM.insertAtEnd(i,...e)}return i.dataset.child=t,i}));return this.logGroupEnd("OK _splitComplexTextBlockIntoLines"),this._DOM.setAttribute(e,this._selector.split),l}_breakItIntoLines(e){if(this._debug._&&console.group("_breakItIntoLines",[e]),this._node.isNoBreak(e))return this.logGroupEnd("isNoBreak"),e;if(this._node.isWrappedTextNode(e)){const t=this._breakWrappedTextNodeIntoLines(e);return this.logGroupEnd("TextNode newLines"),t}return this.logGroupEnd("(recursive _breakItIntoLines)"),this._processNestedInlineElements(e)}_processNestedInlineElements(e){this._debug._&&console.group("_processNestedInlineElements",[e]);const t=this._getNestedInlineChildren(e).flatMap((e=>this._estimateLineCount(e)>1?this._breakItIntoLines(e):e)),i=this._findNewLineStarts(t,e),n=i.map(((n,o)=>{const r=t[n],s=t[i[o+1]];return this._node.cloneAndCleanOutsideRange(e,r,s)}));return this._DOM.insertInsteadOf(e,...n),this.logGroupEnd("Nested Inline parts"),n}_getNestedInlineChildren(e){return[...this._DOM.getChildNodes(e)].reduce(((e,t)=>{if(this._node.isSignificantTextNode(t)){const i=this._node.createTextNodeWrapper();return this._DOM.wrap(t,i),e.push(i),e}if(!this._DOM.getElementOffsetParent(t)){const i=this._node.getPreparedChildren(t);return i.length>0&&e.push(...i),e}if(this._DOM.isElementNode(t)){return this._getNestedInlineChildren(t).forEach((t=>e.push(t))),e}}),[])}_makeWordsFromTextNode(e){const t=this._node.splitTextByWordsGreedy(e);this._debug._&&console.log("wordArray",t);const i=t.map(((e,t)=>this._node.createWord(e+"",t)));return this._debug._&&console.log("wrappedWordArray",i),{wordArray:t,wrappedWordArray:i}}_breakWrappedTextNodeIntoLines(e){e.classList.add("šŸ” _breakItIntoLines"),e.classList.add("🚫_must_be_removed");const{wordArray:t,wrappedWordArray:i}=this._makeWordsFromTextNode(e);this._DOM.setInnerHTML(e,""),this._DOM.insertAtEnd(e,...i);const n=this._findNewLineStarts(i,e),o=n.reduce(((i,o,r)=>{const s=this._node.createTextLine(),l=n[r],a=n[r+1],h=t.slice(l,a).join("")+"";return this._DOM.setInnerHTML(s,h),this._DOM.insertBefore(e,s),i.push(s),i}),[]);return e.remove(),o}_findNewLineStarts(e,t){const i=t.style.lineHeight;t.style.lineHeight=2;const n=e.reduce(((t,i,n)=>{const o=n>0?e[n-1].offsetTop:void 0,r=n>0?e[n-1].offsetHeight:void 0,s=i.offsetTop;return n>0&&o+r<=s&&t.push(n),t}),[0]);return t.style.lineHeight=i,n}}function Ki(e){if(e)return"function"==typeof e.getDebug?e.getDebug():e.debug}function Yi(e,t,i="unknown case"){if(!e||"function"!=typeof e.getSplitBottom||"function"!=typeof e.setSplitBottom)throw new Error("updateSplitBottom: adapter must expose getSplitBottom() and setSplitBottom().");const n=e.getSplitBottom();let o;if("number"==typeof t)o=t;else{if(!(t instanceof HTMLElement))throw new Error("updateSplitBottom: unexpected value type: "+typeof t);if("function"!=typeof e.computeSplitBottomForElement)throw new Error("updateSplitBottom: adapter must implement computeSplitBottomForElement(element).");o=e.computeSplitBottomForElement(t)}e.setSplitBottom(o);const r=function(e){return e?"function"==typeof e.getSplitBottomLog?e.getSplitBottomLog():e.splitBottomLog||null:null}(e);Array.isArray(r)&&r.push(o);const s=Ki(e);s&&s._&&console.log(`%cā™»ļø [${function(e){return e?.label||"šŸ‘¤ [paginator.label] element"}(e)}] update splitBottom (with ${t}) \n • ${i}`,"color: green; font-weight: bold","\n",n||"•••","->",o,r?`\n log: ${r}`:"")}function Zi(e,t,i,n="register page start"){const o=function(e){return e?"function"==typeof e.getRows?e.getRows()||[]:e.rows||[]:[]}(e),r=o.length,s=function(e){return!!e&&("function"==typeof e.shouldAssert?e.shouldAssert():Boolean(e.assert))}(e),l=Ki(e),a=Number.isInteger(t);if(s&&console.assert(a,`registerPageStartAt: index must be an integer, got: ${t}`),!a)return;if(s&&console.assert(r>0,"registerPageStartAt: no rows to register"),0===r)return;if(0===t)return l&&l._&&console.log("%c šŸ“ Row #0 forced to next page (no short first fragment)","color:green; font-weight:bold"),void((o[0]instanceof HTMLElement||"number"==typeof o[0])&&Yi(e,o[0],`${n} (index=0)`));let h=Math.max(1,Math.min(t,r-1));const c=i.at(-1);if(null!=c&&h<=c&&(h=c+1),h>=r)return void(l&&l._&&console.warn(`registerPageStartAt return: computed index (${h}) >= rowsLen (${r})`,"Last split index should not equal rows.length, or the original table will be empty."));i.push(h),l&&l._&&console.log(`%c šŸ“ Row # ${h} registered as page start`,"color:green; font-weight:bold");const g=o[h];(g instanceof HTMLElement||"number"==typeof g)&&Yi(e,g,n)}function Ji(e){return e._node.createSignpost("(table continued)",e._signpostHeight)}function Xi({owner:e=null,currentRows:t=[]}={}){return{owner:e,currentRows:Array.isArray(t)?t:[],parts:[]}}function Qi({entries:e,part:t,startIndex:i=null,endIndex:n=null,type:o="unknown",rows:r=[],meta:s}){if(!e||!t)return null;const l=function(e){if(e)return Array.isArray(e.parts)||(e.parts=[]),e.parts}(e);if(!l)return null;const a={part:t,type:o,startIndex:i,endIndex:n,rows:Array.isArray(r)?[...r]:[]};return s&&"object"==typeof s&&Object.keys(s).length&&(a.meta={...s}),l.push(a),a}class en{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.table}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._selector=o,this._node=n,this._splitLabelHeightFromConfig=e.splitLabelHeight,this._initConstants(),Object.assign(this,i),this._resetCurrent()}split(e,t,i,n){this._setCurrent(e,t,i,n);const o=this._splitCurrentTable();return this._resetCurrent(),o}_initConstants(){this._signpostHeight=parseFloat(this._splitLabelHeightFromConfig)||0,this._minPartLines=2}_resetCurrent(){this._currentTable=void 0,this._currentFirstPageBottom=void 0,this._currentFullPageHeight=void 0,this._currentRoot=void 0,this._currentTableEntries=void 0,this._currentTableRecordedParts=void 0,this._currentTableDistributedRows=void 0,this._currentTableFirstPartContentBottom=void 0,this._currentTableFullPartContentHeight=void 0,this._currentTableTfootHeight=void 0,this._currentTableSplitBottom=void 0,this._logSplitBottom_=[],this._currentRowShellCache=void 0,this._currentOverflowHelpers=void 0,this._currentTableHasRowspan=void 0,this._currentTableHasColspan=void 0,this._currentTableInconsistentCells=void 0,this._currentTableHasUnexpectedChildren=void 0}_setCurrent(e,t,i,n){this._currentTable=e,this._currentFirstPageBottom=t,this._currentFullPageHeight=i,this._currentRoot=n,this._currentRowShellCache=new WeakMap,this._currentOverflowHelpers=this._composeOverflowHelpers()}_prepareCurrentTableForSplitting(){this._lockCurrentTableWidths(),this._collectCurrentTableEntries(),this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts=Xi({owner:this._currentTable,currentRows:this._currentTableDistributedRows}),this._currentTableEntries&&(this._currentTableEntries.recordedParts=this._currentTableRecordedParts),this._currentTable.__html2pdfRecordedParts=this._currentTableRecordedParts,this._analyzeCurrentTableStructure(),this._collectCurrentTableMetrics()}_lockCurrentTableWidths(){this._node.lockTableWidths(this._currentTable)}_splitCurrentTable(){this._prepareCurrentTableForSplitting(),this._setCurrentTableFirstSplitBottom(),this._debug._&&console.group("%cšŸ“Š _splitCurrentTable()","color:green; background:#eee; padding:3px","\n•",this._currentTableFirstPartContentBottom,"(1st bottom)","\n•",this._currentTableFullPartContentHeight,"(full part height)",{table:this._currentTable,rows:[...this._currentTableDistributedRows],rowCount:this._currentTableDistributedRows.length,entries:this._currentTableEntries,root:this._currentRoot});const e=this._resolveCurrentTableDistributedRowsInPlace();if(this._debug._&&console.log("šŸ“Š updated table rows",{rows_new:[...this._currentTableDistributedRows],rowCount_new:this._currentTableDistributedRows.length,splitStartRowIndexes:e}),!e.length)return this.logGroupEnd("[_splitCurrentTable]: there are no splits (!splitStartRowIndexes.length)"),[];let t=this._createTableSlices({splitPoints:e,table:this._currentTable,tableEntries:this._currentTableEntries});return this._node.markSliceCuts([this._currentTable,...t]),this._signpostHeight&&(t=this._extendTableSlices(t)),this._DOM.insertAfter(this._currentTable,...t),this._debug._&&console.log("tableSlices",t),this._debug._&&console.log("[table.split] recordedParts",this._currentTableRecordedParts?.parts),this.logGroupEnd("[_splitCurrentTable]"),[this._currentTable,...t]}_resolveCurrentTableDistributedRowsInPlace(){let e=[];for(let t=0;tNumber.isInteger(e)&&e>0&&e<=this._currentTableDistributedRows.length)),"splitStartRowIndexes contains invalid indexes"),this.strictAssert(e.every(((e,t,i)=>0===t||e>i[t-1])),"splitStartRowIndexes must be strictly ascending and without duplicates"),this.strictAssert(e.at(-1)!==this._currentTableDistributedRows.length,"Last split index should not equal rows.length, or the original table will be empty."),e}_evaluateAndResolveRow(e,t){const i=e,n=this._currentTableDistributedRows.length;this._debug._&&console.groupCollapsed(`šŸ”² %c Check the Row # ${i} (from ${n})`,"");const o=this._node.paginationBuildRowEvaluationContext({rows:this._currentTableDistributedRows,rowIndex:e,table:this._currentTable,splitBottom:this._currentTableSplitBottom});if(!o?.row)return console.warn("[table.split] Missing row during evaluation.",{rowIndex:e}),this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),e;if(this._debug._){const e=o.fitsCurrentWindow,t=e?"green":"orange",i=e?"<=":">";console.log(`%cšŸ“ does row fit? %c ${e} %c :: ${o.nextMarker} ${i} ${this._currentTableSplitBottom} %c(Ī”=${o.delta})`,"",`font-weight:bold;color:${t};`,"",`color:${t};`)}if(this._debug._&&console.info({row:o.row,rows:[...this._currentTableDistributedRows]}),o.fitsCurrentWindow)return this._debug._&&console.log(`%c āœ“ Row # ${e}: PASS`,"color:green"),this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),e;const r=this._node.calculateFinalPartReclaimedHeight({signpostHeight:this._signpostHeight,tfootHeight:this._currentTableTfootHeight});if(this._node.paginationCanAbsorbLastRow({evaluation:o,extraCapacity:r,splitBottom:this._currentTableSplitBottom,debug:this._debug}))return this._debug._&&console.log("🫟 last-row-fits-without-bottom-signpost: skip split"),this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),e;const s=this._resolveOverflowingRow({evaluation:o,splitStartRowIndexes:t,extraCapacity:r});return this.logGroupEnd(`Row # ${i} (from ${n}) is checked`),s}_resolveOverflowingRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:e=>this._rowHasSpan(e),isSlice:e=>this._node.isSlice(e)},handlers:{handleRowWithRowspan:()=>this._node.paginationResolveRowWithRowspan({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,resolveOverflow:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:"Row with ROWSPAN — move to next page",reasonFull:"Row with ROWSPAN — scaled TDs to full page",branch:"rowspan"}),debug:this._debug,afterResolve:({tailWindowHeight:e,fullPageHeight:t})=>{this._debug._&&e>=t&&console.warn("[table.fallback] ROWSPAN row required full-page scaling to fit.")}}),handleSplittableRow:()=>this._resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}),handleAlreadySlicedRow:()=>this._node.paginationResolveAlreadySlicedRow({evaluation:e,splitStartRowIndexes:t,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,resolveSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:"Slice doesn't fit tail — move to next page",reasonFull:"Scaled TD content to fit full page",branch:"alreadySliced"})})}})}_resolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i}){const{rowIndex:n}=e;this._debug._&&console.group(`%c šŸ”³ Try to split the ROW ${n} %c (from ${this._currentTableDistributedRows.length})`,"color:magenta;","");const o=this._node.paginationResolveSplittableRow({evaluation:e,splitStartRowIndexes:t,extraCapacity:i,fullPageHeight:this._currentTableFullPartContentHeight,minPartLines:this._minPartLines,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{this._DOM.setAttribute(e,`.splitted_row_${t}_part_${i}`)},onBudgetInfo:({evaluation:e,firstPartHeight:t,fullPartHeight:i})=>{this._debug._&&console.info({currRowTop:e.rowTop,"• splitBottom":this._currentTableSplitBottom,"• is row sliced?":!1,"remaining page space":e.tailWindowHeight,"first part height":t,"full part height":i})},handlers:{onReplaceRow:({evaluation:e,newRows:t})=>{this._replaceRowInDOM(e.row,t)},onAbsorbTail:({newRows:e,extraCapacity:t})=>{this._node.absorbShortTrailingSliceIfFits({slices:e,extraCapacity:t,ownerLabel:"table",debug:this._debug})},onRefreshRows:({evaluation:e,newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentTable,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentTableSplitBottom,fullPageHeight:this._currentTableFullPartContentHeight,debug:this._debug,registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>{t>0&&(this._debug._&&console.log("āš–ļø scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))},applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{row:e,targetHeight:i},scaleCallback:({row:e,targetHeight:t})=>(this._debug._&&console.log("āš–ļø scaleProblematicCellsToHeight"),this._scaleProblematicCellsToHeight(e,t,this._getRowShellHeights(e)))})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardOverflowFallback({rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:"Split failed — move row to next page",reasonFull:"Scaled TDs to fit full-page",branch:"splitFailure"})}});return this.logGroupEnd(`šŸ”³ Try to split the ROW ${n} (from ${this._currentTableDistributedRows.length})`),o}_collectCurrentTableEntries(){this._currentTableEntries=this._node.getTableEntries(this._currentTable)}_rowHasSpan(e){const t=[...this._DOM.getChildren(e)];for(const e of t){const t=this._DOM.getElementTagName(e);if("TD"!==t&&"TH"!==t)continue;const i=parseInt(e.getAttribute("rowspan"));if(Number.isFinite(i)&&i>1)return!0}return!1}_collectCurrentTableMetrics(){const e=this._node.getEmptyNodeHeightByProbe(this._currentTable,'',!1),t=this._node.getTopForPageStartCandidate(this._currentTable,this._currentRoot),i=(this._node.getTopWithMargin(this._currentTable,this._currentRoot),this._DOM.getElementOffsetHeight(this._currentTableEntries.caption)||0),n=this._DOM.getElementOffsetTop(this._currentTableDistributedRows[0],this._currentTable)-i||0;this._currentTableTfootHeight=this._DOM.getElementOffsetHeight(this._currentTableEntries.tfoot)||0,this._currentTableFirstPartContentBottom=this._currentFirstPageBottom-t-e-this._signpostHeight,this._currentTableFullPartContentHeight=this._currentFullPageHeight-i-n-this._currentTableTfootHeight-e-2*this._signpostHeight}_getDistributedRows(e){return[...e.rows,...e.tfoot?[e.tfoot]:[]]}_updateCurrentTableDistributedRows(){this._currentTableDistributedRows=this._getDistributedRows(this._currentTableEntries)}_analyzeCurrentTableStructure(){this._currentTableEntries;const e=this._currentTableDistributedRows||[],t=this._node.computeRowFlags({rows:e,DOM:this._DOM,cellTagFilter:(e,t)=>"TFOOT"!==this._DOM.getElementTagName(t.parentNode)&&("TD"===e||"TH"===e)});this._currentTableHasRowspan=t.hasRowspan,this._currentTableHasColspan=t.hasColspan,this._currentTableInconsistentCells=t.inconsistentCells,this._debug._&&(t.hasRowspan&&console.warn("[table.guard] ROWSPAN detected — slicing not implemented; applying conservative fallback.",{table:this._currentTable}),t.hasColspan&&console.warn("[table.guard] COLSPAN present — handled within-row slicing; monitor results.",{table:this._currentTable}),t.inconsistentCells&&console.warn("[table.guard] Inconsistent cell counts across rows — results may vary.",{table:this._currentTable}))}_updateCurrentTableEntriesAfterSplit(e,t){this._currentTableEntries.rows.splice(e,1,...t)}_setCurrentTableFirstSplitBottom(){this._node.getTop(this._currentTableDistributedRows[0],this._currentTable)>this._currentTableSplitBottom?(this._updateCurrentTableSplitBottom(this._currentTableFullPartContentHeight,"SPECIAL CASE: start immediately from the full height of the page"),this._debug._&&console.log("The Row 0 goes to the 2nd page")):this._updateCurrentTableSplitBottom(this._currentTableFirstPartContentBottom,"start with a short first part")}_getPaginatorAdapter(){return{label:"table",getSplitBottom:()=>this._currentTableSplitBottom,setSplitBottom:e=>{this._currentTableSplitBottom=e},computeSplitBottomForElement:e=>this._node.getTop(e,this._currentTable)+this._currentTableFullPartContentHeight,getRows:()=>this._currentTableDistributedRows,shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._logSplitBottom_}}_getSplitterAdapter(){const e=()=>({rows:this._currentTableDistributedRows||[],DOM:this._DOM,cellTagFilter:(e,t)=>{const i=t?.parentNode;return"TFOOT"!==(i?this._DOM.getElementTagName(i):void 0)&&("TD"===e||"TH"===e)}});return{label:"table",rows:{getCurrentRows:()=>this._currentTableDistributedRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{this._node.applyRowSlicesToEntriesAfterRowSplit(this._currentTableEntries,e,t)},syncEntries:()=>{this._updateCurrentTableDistributedRows(),this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)},getGuardConfig:e,onRowsChanged:()=>{this._currentTableRecordedParts&&(this._currentTableRecordedParts.currentRows=this._currentTableDistributedRows)}},guards:{getConfig:e,onFlags:({flags:e})=>{e&&(this._currentTableHasRowspan=Boolean(e.hasRowspan),this._currentTableHasColspan=Boolean(e.hasColspan),this._currentTableInconsistentCells=Boolean(e.inconsistentCells))}}}}_updateCurrentTableSplitBottom(e,t="unknown case"){Yi(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Zi(this._getPaginatorAdapter(),e,t,i)}_composeOverflowHelpers(){const e=this._node.scaleCellsToHeight.bind(this._node),t=this._getRowShellHeights.bind(this),i={ownerLabel:"table",registerPageStartCallback:this._registerPageStartAt.bind(this),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0,scaleProblematicCellsCallback:(i,n,o)=>this._node.scaleRowCellsToHeight({ownerLabel:"table",DOM:this._DOM,row:i,targetHeight:n,cachedShells:o,getRowShellHeightsCallback:t,scaleCellsToHeightCallback:e})};return this._currentOverflowHelpers=i,i}_scaleProblematicCellsToHeight(e,t,i){return(this._currentOverflowHelpers||this._composeOverflowHelpers()).scaleProblematicCellsCallback(e,t,i)}_forwardOverflowFallback({rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:o,reasonTail:r,reasonFull:s,branch:l}){const a=this._currentOverflowHelpers||this._composeOverflowHelpers(),h={ownerLabel:`table:${l}`,rowIndex:e,row:t,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:o,reasonTail:r,reasonFull:s,registerPageStartCallback:a.registerPageStartCallback,scaleProblematicCellsCallback:a.scaleProblematicCellsCallback,debugLogger:a.debugLogger};return this._debug._&&console.log(`%c[table.overflow] branch=${l} rowIndex=${e} tail=${i} full=${n}`,"color:orange; font-weight:bold",{reasonTail:r,reasonFull:s}),"splitFailure"===l?this._node.handleRowSplitFailure(h):this._node.handleRowOverflow(h)}_getRowShellHeights(e){if(!this._currentRowShellCache)return this._node.getTableRowShellHeightByTD(e);if(this._currentRowShellCache.has(e))return this._currentRowShellCache.get(e);const t=this._node.getTableRowShellHeightByTD(e);return this._currentRowShellCache.set(e,t),t}_createTableSlice({startId:e,endId:t,table:i,tableEntries:n}){this._debug._&&console.group(`[CREATE Table Slice] range: [${e}, ${t})`),this.strictAssert(Number.isInteger(e)&&(Number.isInteger(t)||t===1/0),`[createTableSlice] invalid bounds: startId=${e}, endId=${t}`);const o=n&&n.rows?n.rows.length:0;this.strictAssert(o>=0,`createTableSlice: invalid rows length: ${o}`),this.strictAssert(e>0&&t>0&&ethis._createTableSlice({startId:e,endId:n===o.length-1?1/0:o[n+1],table:t,tableEntries:i})))}_extendTableSlices(e){return e.reduce(((e,t,i,n)=>{const o=0===i,r=i===n.length-1;return o&&e.push(this._createBottomSignpost()),e.push(this._node.createForcedPageBreak()),e.push(this._createTopSignpost()),e.push(t),!r&&e.push(this._createBottomSignpost()),e}),[])}_createTopSignpost(){return this._node.createSignpost("(table continued)",this._signpostHeight)}_createBottomSignpost(){return this._node.createSignpost("(table continues on the next page)",this._signpostHeight)}_replaceRowInDOM(e,t){this._debug._&&this._DOM.setAttribute(e,".🚫_must_be_removed"),this._DOM.insertInsteadOf(e,...t)}_createAndInsertTableSlice({startId:e,endId:t,table:i,tableEntries:n}){const o=this._normalizeSliceAdapterPayload(function(e,{startId:t,endId:i,table:n,tableEntries:o}){e.strictAssert(Number.isInteger(t)&&Number.isInteger(i),`createAndInsertTableSlice: non-integer bounds: startId=${t}, endId=${i}`);const r=o&&o.rows?o.rows.length:0;e.strictAssert(r>=0,`createAndInsertTableSlice: invalid rows length: ${r}`),e.strictAssert(t>=0&&i>=0&&t({rowIndex:e+i,row:t,cells:Array.from(this._DOM.getChildren(t)||[])}))):[];if(r.length){const i={...o.meta||{},signpostTop:o.signposts?.top??null,signpostBottom:o.signposts?.bottom??null};this._recordTablePart(o.mainPart,{startId:e,endId:t,type:"slice",rows:s,meta:i})}return r}_createAndInsertTableFinalSlice({table:e,startId:t=0}){const i=Array.isArray(this._currentTableDistributedRows)?this._currentTableDistributedRows.length:0,n=this._normalizeSliceAdapterPayload(function(e,{table:t}){e._node.markTopCut(t),e._node.setFlagNoBreak(t);const i=[],n=e._node.createForcedPageBreak();i.push(n);const o=Ji(e);return o&&(e._node.setFlagNoBreak(o),i.push(o)),e._DOM.insertBefore(t,...i),i.push(t),{nodes:i,mainPart:t,signposts:{top:o,bottom:null}}}(this,{table:e}),{startId:t,endId:i,type:"final"}),o=n.mainPart,r=Array.isArray(this._currentTableDistributedRows)?this._currentTableDistributedRows.slice(t).map(((e,i)=>({rowIndex:t+i,row:e,cells:Array.from(this._DOM.getChildren(e)||[])}))):[],s={...n.meta||{},signpostTop:n.signposts?.top??null,signpostBottom:n.signposts?.bottom??null};return this._recordTablePart(o,{startId:t,endId:i,type:"final",rows:r,meta:s}),n.nodes}_normalizeSliceAdapterPayload(e,{startId:t=null,endId:i=null,type:n="slice"}={}){const o=`[table.slice:${n}] rows [${t??"null"}:${i??"null"}]`;this.strictAssert(e,`${o} builder returned no result`);const r=e=>e&&"object"==typeof e&&1===e.nodeType;let s=null;Array.isArray(e)?s={nodes:e}:r(e)?s={nodes:[e],mainPart:e}:"object"==typeof e?s=e:this.strictAssert(!1,`${o} unsupported builder payload: ${e}`);let l=Array.isArray(s.nodes)?[...s.nodes]:[];!l.length&&r(s.mainPart)&&(l=[s.mainPart]),this.strictAssert(l.length>0,`${o} builder produced empty nodes array`);const a=[];l.forEach(((e,t)=>{e?a.push(e):console.warn(`${o} dropped empty node at index ${t}`)})),this.strictAssert(a.length>0,`${o} builder produced only empty nodes`);const h=s.mainPart??a[0];return this.strictAssert(r(h),`${o} missing main part element`),{nodes:a,mainPart:h,signposts:{top:s.signposts?.top??null,bottom:s.signposts?.bottom??null},meta:s.meta}}_recordTablePart(e,t={}){const i=this._currentTableRecordedParts;if(!i||!e)return null;const{startId:n=null,endId:o=null,type:r="unknown",rows:s=[],meta:l}=t||{};return Qi({entries:i,part:e,startIndex:n,endIndex:o,type:r,rows:s,meta:l})}}class tn{constructor({config:e,DOM:t,node:i,selector:n}){this._debug=e.debugMode?{...e.debugConfig.tableLike}:{},this._DOM=t,this._selector=n,this._node=i,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,n,o){const r=o||this._DOM.getComputedStyle(e);this._debug._&&console.log("root",n);const s=this._node.getPreparedChildren(e),l=this._node.getTop(e,n),a=this._node.getEmptyNodeHeightByProbe(e),h=i-a;let c=s,g=0,d=[],p=t-l-a;const u=r.position;"relative"!=u&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tp&&(t&&d.push(t),t&&(g+=1),p=t?this._node.getTop(i,e)+h:h)}if(this._DOM.setStyles(e,{position:u}),!d.length)return this._debug._&&console.log("splitters.length",d.length),[];d.push(null);const _=d.map(((t,i,n)=>{const o=this._node.createSliceWrapper(e),r=n[i-1]||0,s=t||n[n.length];return this._DOM.insertAtEnd(o,...c.slice(r,s)),o}));return this._node.markSliceCuts(_),this._DOM.replaceNodeContentsWith(e,..._),this._DOM.removeAllClasses(e),this._DOM.removeAllStyles(e),this._DOM.setStyles(e,{display:"contents"}),this._DOM.setAttribute(e,"[slough-node]",""),_}}class nn{constructor({config:e,DOM:t,node:n,selector:o}){this._debug=e.debugMode?{...e.debugConfig.grid}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=o,this._node=n,this._resetCurrent(),this._minBreakableGridRows=1,this._minGridRowContentLines=2,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,n,o){this._resetCurrent(),this._debug._&&console.group("%c split Grid Node","background:#00FFFF",e);const r=this._node.getPreparedChildren(e);this._node.lockNodesWidths(r);const s=o||this._getComputedStyleCached(e);if(!r.length)return this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];this._node.setInitStyle(!0,e,s);const l=this._scanGridLayout(e,s);if(!l.safe)return this._debug._&&console.warn("[grid.split] skip unsafe layout",l),this._debug._&&console.warn("[grid.split] Unsupported grid layout detected; keeping original grid intact.",l),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];const a=[];let h=!1,c=!1;const g=new Set;let d=null,p=null,u=null;r.forEach((t=>{const i=this._getComputedStyleCached(t),n=parseInt(i.gridRowStart,10),o=Number.isFinite(n),r=this._node.getTop(t,e),s=this._node.getBottom(t,e);let l=!1;l=!a.length||(o&&null!=d?n!==d:null!=u?r>=u-.5:null==p||Math.abs(r-p)>.5),l?(a.push([t]),d=o?n:null,p=r,u=s):(a[a.length-1].push(t),o&&null==d&&(d=n),(null==p||ru)&&(u=s));const _=i.gridRowEnd||"",f=i.gridColumnEnd||"";h=h||_.includes("span"),c=c||f.includes("span"),o&&g.add(n)}));const _=g.size>0&&Math.max(...g)>a.length;if(_)return this._debug._&&console.warn("[grid.split]","Unsupported implicit row gap detected; keeping grid unsplit.",{hasImplicitRowGaps:_}),this._node.setInitStyle(!1,e,s),this._debug._&&console.groupEnd(),[];if(h||c)return this._debug._&&console.warn("[grid.split]","Grid contains row/column spans; using fallback (move row to next page).",{hasRowSpan:h,hasColumnSpan:c}),this._debug._&&console.groupEnd(),this._fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:s});this.log("grid.split","currentRows:",a);const f=this._node.getTop(e,n),m=this._node.getEmptyNodeHeightByProbe(e),b=t-f-m,w=i-m;if(this.log("grid.split",{firstPartHeight:b,fullPagePartHeight:w}),this._currentGridNode=e,this._currentGridRows=a,this._currentGridFullPartHeight=w,this._currentGridSplitLog=[],this._currentGridEntries=Xi({owner:e,currentRows:a}),this._currentGridRecordedParts=this._currentGridEntries,this._currentGridNode.__html2pdfRecordedParts=this._currentGridRecordedParts,this._currentGridShellCache=new WeakMap,a.length0?Math.floor(t):1;let o=0;return()=>{if(o+=1,o<=n)return;const t={label:e,iterations:o,limit:n};throw i&&console.assert(!1,`\n\n ā›” [${e}] ā™¾ļø loop guard triggered`,t),new Error(`\n ā›” [${e}] ā™¾ļø loop guard triggered`)}}({label:"grid.split",limit:Math.max(1,6*(a.length||1)),assert:this._assert});this._updateCurrentGridSplitBottom(b,"start with initial window");for(let t=0;tthis._buildGridSplit({startId:n[i-1]||0,endId:t,node:e,entries:M}))).filter(Boolean).map((e=>e.part)),this._createAndInsertGridFinalSlice({node:e,entries:M,startId:C})];return this.log("grid.split",{splitStartRowIndexes:S,splits:y,recordedParts:this._currentGridRecordedParts?.parts}),this._node.setInitStyle(!1,e,s),this._resetCurrent(),this.logGroupEnd("split Grid Node"),y}_fallbackMoveGridToNextPage({gridNode:e,nodeComputedStyle:t}){return this._node.setInitStyle(!1,e,t),this._resetCurrent(),[]}_resetCurrent(){this._currentGridNode=void 0,this._currentGridRows=void 0,this._currentGridEntries=void 0,this._currentGridRecordedParts=void 0,this._currentGridSplitBottom=void 0,this._currentGridFullPartHeight=void 0,this._currentGridSplitLog=void 0,this._currentGridRowFlags=void 0,this._currentGridShellCache=void 0,this._gridCellLineHeightCache=new WeakMap,this._gridComputedStyleCache=new WeakMap}_getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t}){return{getRowSliceAdapter:({row:t})=>this._createGridRowSliceAdapter({row:t,rowIndex:e.rowIndex}),onReplaceRow:({newRows:t})=>{this._removeOriginalGridRowCells(e.row),this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onAbsorbTail:()=>{},onRefreshRows:({newRows:t})=>{this._node.paginationRefreshRowsAfterSplit(this._getSplitterAdapter(),{rowIndex:e.rowIndex,rowSlices:t})},onPlacement:({evaluation:e,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r})=>this._node.paginationHandleRowSlicesPlacement({evaluation:e,table:this._currentGridNode,newRows:i,insufficientRemainingWindow:n,isFirstPartEmptyInAnyTD:o,needsScalingInFullPage:r,splitStartRowIndexes:t,pageBottom:this._currentGridSplitBottom,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,registerPageStartCallback:({targetIndex:e,reason:i})=>this._registerPageStartAt(e,t,i),scaleProblematicSliceCallback:(e,t)=>this._scaleGridCellsToHeight(e,t),applyFullPageScalingCallback:({row:e,needsScalingInFullPage:t,fullPageHeight:i})=>{this._node.paginationApplyFullPageScaling({needsScalingInFullPage:t&&Boolean(e),payload:{cells:e,targetHeight:i},scaleCallback:({cells:e,targetHeight:t})=>this._scaleGridCellsToHeight(e,t)})}}),onSplitFailure:({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n})=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n,branch:"splitFailure"})}}_forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:i,fullPageHeight:n=this._currentGridFullPartHeight,branch:o,reasonTail:r,reasonFull:s}){const l=this._composeGridOverflowHelpers(),a={ownerLabel:`grid:${o}`,gridNode:this._currentGridNode,evaluation:e,rowIndex:e.rowIndex,row:e.row,availableRowHeight:i,fullPageHeight:n,splitStartRowIndexes:t,reasonTail:r||("splitFailure"===o?"Grid split failed — move row to next page":"Grid slice overflow — move row to next page"),reasonFull:s||("splitFailure"===o?"Grid split failed — scaled cells to full page":"Grid slice overflow — scaled cells to full page"),registerPageStartCallback:l.registerPageStartCallback,scaleProblematicCellsCallback:l.scaleProblematicCellsCallback,debugLogger:l.debugLogger};return this._debug._&&console.log("[grid.overflow]",o,a),"splitFailure"===o?this._node.handleRowSplitFailure(a):this._node.handleRowOverflow(a)}_buildGridRowEvaluation({rows:e,rowIndex:t,gridNode:i,splitBottom:n}){if(!Array.isArray(e))return null;const o=e[t];if(!o)return null;const r=Array.isArray(o)?new Array(o.length):null,s=this._getRowTop(o,i,r),l=this._getRowBottom(o,i,r),a=e[t+1],h=a?this._getRowTop(a,i):l,c=h-n;return{rowIndex:t,row:o,rowTop:s,rowBottom:l,nextMarker:h,delta:c,tailWindowHeight:n-s,isLastRow:!a,fitsCurrentWindow:c<=0,cellStyles:r}}_composeGridOverflowHelpers(){const e=this._registerPageStartAt.bind(this);this._scaleGridCellsToHeight.bind(this);return{registerPageStartCallback:e,scaleProblematicCellsCallback:(e,t)=>!!Array.isArray(e)&&this._scaleGridCellsToHeight(e,t),debugLogger:this._debug&&this._debug._?(e,t)=>console.log(e,t):void 0}}_resolveGridOverflowingRow({evaluation:e,splitStartRowIndexes:t}){return this._node.paginationResolveOverflowingRow({evaluation:e,utils:{rowHasSpan:()=>!1,isSlice:e=>this._isGridRowSlice(e)},handlers:{handleRowWithRowspan:()=>(this._debug._&&console.warn("[grid.split] ROWSPAN guard triggered unexpectedly.",{evaluation:e}),this._registerPageStartAt(e.rowIndex,t,"Grid ROWSPAN fallback — move row to next page"),e.rowIndex-1),handleSplittableRow:()=>this._resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}),handleAlreadySlicedRow:()=>this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,branch:"alreadySliced"})}})}_resolveGridSplittableRow({evaluation:e,splitStartRowIndexes:t}){const{rowIndex:i}=e;this._debug._&&console.group("%c[grid.split] Stage5 — splittable row","color:#0080ff",{rowIndex:i,row:e.row,tailWindowHeight:e.tailWindowHeight});const n=this._estimateGridRowMeaningfulSpace({row:e.row,cellStyles:e.cellStyles,minContentLines:this._minGridRowContentLines});if(!(n>0))return console.warn("[grid.metrics] Meaningful row space is unavailable; falling back to overflow handler."),this._forwardGridOverflowFallback({evaluation:e,splitStartRowIndexes:t,availableRowHeight:e.tailWindowHeight,fullPageHeight:this._currentGridFullPartHeight,branch:"metricsMissing",reasonTail:"Grid row metrics missing — move row to next page",reasonFull:"Grid row metrics missing — scaled cells to full page"});const o=this._node.paginationCalculateRowSplitBudget({tailWindowHeight:e.tailWindowHeight,minMeaningfulRowSpace:n,fullPartHeight:this._currentGridFullPartHeight,debug:this._debug}),r=this._node.paginationSplitRow({rowIndex:i,row:e.row,firstPartHeight:o.firstPartHeight,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,decorateRowSlice:({rowWrapper:e,rowIndex:t,sliceIndex:i})=>{e instanceof HTMLElement&&this._DOM.setAttribute(e,`.grid_row_${t}_part_${i}`)},rowAdapter:this._createGridRowSliceAdapter({row:e.row,rowIndex:i,cellStyles:e.cellStyles})}),s=this._node.paginationProcessRowSplitResult({evaluation:e,splitResult:r,splitStartRowIndexes:t,insufficientRemainingWindow:o.insufficientRemainingWindow,extraCapacity:0,fullPageHeight:this._currentGridFullPartHeight,debug:this._debug,handlers:this._getGridSplittableHandlers({evaluation:e,splitStartRowIndexes:t})});return this.logGroupEnd("[grid.split] Stage5 — splittable row"),s}_createGridRowSliceAdapter({row:e,rowIndex:t,cellStyles:i}){if(!Array.isArray(e))return null;const n=this._currentGridNode,o=e[0]||null,r=this;return{getParentContainer:()=>n,getOriginalCells:()=>[...e],getShellHeights:()=>r._getGridShellHeights(e,i),markOriginalRow:({cells:e})=>{e.forEach((e=>r._node.setFlagSlice(e)))},beginRow:()=>({fragment:r._DOM.createDocumentFragment(),cells:[]}),cloneCellFallback:e=>r._DOM.cloneNodeWrapper(e),handleCell:({context:e,cellClone:t})=>{r._node.setFlagSlice(t),e.fragment.append(t),e.cells.push(t)},finalizeRow:({context:e})=>(o&&r._DOM.insertBefore(o,e.fragment),e.cells)}}_removeOriginalGridRowCells(e){Array.isArray(e)&&e.forEach((e=>{e instanceof HTMLElement&&this._DOM.removeNode(e)}))}_isGridRowSlice(e){if(Array.isArray(e)){const t=e.find((e=>e instanceof HTMLElement));return!!t&&this._node.isSlice(t)}return!!e&&this._node.isSlice(e)}_getPaginatorAdapter(){return{label:"grid",getSplitBottom:()=>this._currentGridSplitBottom,setSplitBottom:e=>{this._currentGridSplitBottom=e},computeSplitBottomForElement:e=>e&&this._currentGridNode?this._node.getTop(e,this._currentGridNode)+(this._currentGridFullPartHeight||0):this._currentGridSplitBottom||0,getRows:()=>Array.isArray(this._currentGridRows)?this._currentGridRows.map((e=>{if(!e)return null;if(e instanceof HTMLElement)return e;if(Array.isArray(e)){const t=e.find((e=>e instanceof HTMLElement));if(t)return t;const i=this._getRowTop(e,this._currentGridNode);return Number.isFinite(i)?i:null}const t=this._getRowTop(e,this._currentGridNode);return Number.isFinite(t)?t:null})):[],shouldAssert:()=>this._assert,getDebug:()=>this._debug,getSplitBottomLog:()=>this._currentGridSplitLog}}_getSplitterAdapter(){return{label:"grid",rows:{getCurrentRows:()=>this._currentGridRows||[],replaceRow:({rowIndex:e,rowSlices:t})=>{Array.isArray(this._currentGridRows)&&this._node.replaceCurrentRowsAfterRowSplit({currentRows:this._currentGridRows,index:e,rowSlices:t})},syncEntries:()=>{this._currentGridEntries&&(this._currentGridEntries.currentRows=this._currentGridRows),this._currentGridRecordedParts&&(this._currentGridRecordedParts.currentRows=this._currentGridRows)},getGuardConfig:()=>({rows:this._currentGridRows||[],DOM:this._DOM})},guards:{onFlags:({flags:e})=>{this._currentGridRowFlags=e}}}}_updateCurrentGridSplitBottom(e,t="unknown case"){Yi(this._getPaginatorAdapter(),e,t)}_registerPageStartAt(e,t,i="register page start"){Zi(this._getPaginatorAdapter(),e,t,i)}_scaleGridCellsToHeight(e,t){if(!(Array.isArray(e)&&e.length&&t>0))return!1;const i=this._getGridShellHeights(e),n=this._debug._?e.map((e=>this._DOM.getElementOffsetHeight(e))):null,o=this._node.paginationScaleCellsToHeight({cells:e,targetHeight:t,shells:i});if(this._debug._){const r=e.map((e=>this._DOM.getElementOffsetHeight(e)));console.log("[grid.scaleCells] target:",t,"shells:",i,"before:",n,"after:",r,"scaled:",o)}return o}_buildGridSplit({startId:e,endId:t,node:i,entries:n}){const o=n?.currentRows||this._currentGridRows||[];if(e===t)return this._debug._&&console.warn("[grid.split] _buildGridSplit: skip empty slice request",e,t),this.strictAssert(!1,"[grid.split] _buildGridSplit: empty slice encountered"),null;if(this._debug._){const i=o.slice(e,t);console.log(`=> [grid.split] _buildGridSplit: slice rows [${e}, ${t})`,i)}const r=this._createAndInsertGridSlice({startId:e,endId:t,node:i,entries:n}),s=this._collectGridTelemetryRows(o,e,t);return this._recordGridPart(r,{startId:e,endId:t,type:"slice",rows:s}),{part:r,telemetryRows:s}}_createAndInsertGridSlice({startId:e,endId:t,node:i,entries:n}){return function(e,{startId:t,endId:i,node:n,entries:o,fallbackCurrentRows:r}){const s=e._DOM.cloneNodeWrapper(n);e._node.copyNodeWidth(s,n),e._node.setFlagNoBreak(s),t&&e._node.markTopCut(s),e._node.markBottomCut(s),n.before(s);const l=o?.currentRows||r||[],a=e&&e._DOM&&"function"==typeof e._DOM.isElementNode?e._DOM.isElementNode.bind(e._DOM):null,h=l.slice(t,i).flat().map((e=>{if(!e)return null;if(a&&a(e))return e;if("undefined"!=typeof HTMLElement&&e instanceof HTMLElement)return e;const t=e.element;if(t){if(a&&a(t))return t;if("undefined"!=typeof HTMLElement&&t instanceof HTMLElement)return t}return null})).filter(Boolean);return e._DOM.insertAtEnd(s,...h),s}(this,{startId:e,endId:t,node:i,entries:n})}_createAndInsertGridFinalSlice({node:e,entries:t,startId:i}){const n=function(e,{node:t,entries:i}){return e._node.markTopCut(t),e._node.setFlagNoBreak(t),t}(this,{node:e,entries:t}),o=t?.currentRows||this._currentGridRows||[],r=this._collectGridTelemetryRows(o,i);return this._recordGridPart(n,{startId:i,endId:o.length,type:"final",rows:r}),n}_collectGridTelemetryRows(e,t,i){if(!Array.isArray(e))return[];return e.slice(t,"number"==typeof i?i:void 0).map(((e,i)=>{const n=Array.isArray(e)?[...e]:[e];return{rowIndex:t+i,row:e,cells:n}}))}_recordGridPart(e,t={}){const i=this._currentGridRecordedParts;if(!i||!e)return null;const{startId:n=null,endId:o=null,type:r="unknown",rows:s=[],meta:l}=t||{};return Qi({entries:i,part:e,startIndex:n,endIndex:o,type:r,rows:s,meta:l})}_estimateGridRowMeaningfulSpace({row:e,cellStyles:t=null,minContentLines:i=this._minGridRowContentLines}){if(!Array.isArray(e)||0===e.length)return console.warn("[grid.metrics] Row payload missing while estimating split budget."),null;const n=this._getGridShellHeights(e,t),o=Array.isArray(t)?t:null,r=Math.max(1,i);let s=0;return e.forEach(((e,t)=>{if(!(e instanceof HTMLElement))return void console.warn("[grid.metrics] Unexpected non-element cell in row; ignoring during split budget calculation.",{cell:e,index:t});let i=o?o[t]:null;i||(i=this._getComputedStyleCached(e),o&&(o[t]=i));const l=this._resolveGridCellLineHeight({cell:e,style:i}),a=(n?.[t]||0)+l*r;s=Math.max(s,a)})),s>0?s:(console.warn("[grid.metrics] Failed to measure meaningful row space."),null)}_resolveGridCellLineHeight({cell:e,style:t}){const i=this._gridCellLineHeightCache,n=i?.get(e);if(n>0)return n;t||(console.warn("[grid.metrics] style not passed for _resolveGridCellLineHeight",{cell:e}),t=this._getComputedStyleCached(e));let o=parseFloat(t?.lineHeight);if(o>0)return i?.set(e,o),o;const r=parseFloat(t?.fontSize);if(Number.isFinite(r)&&r>0){const t=1.2*r;return i?.set(e,t),t}if(o=this._node.getLineHeight(e),o>0)return i?.set(e,o),o;return i?.set(e,16),16}_getGridShellHeights(e,t=null){if(this._currentGridShellCache||(this._currentGridShellCache=new WeakMap),this._currentGridShellCache.has(e))return this._currentGridShellCache.get(e);const i=Array.isArray(e)?e:[e].filter(Boolean),n=this._computeGridCellShellHeights(i,t);return this._currentGridShellCache.set(e,n),n}_getComputedStyleCached(e){if(!e)return console.warn("[grid.split] the element was not passed to _getComputedStyleCached"),null;const t=this._gridComputedStyleCache;if(!t)return this._DOM.getComputedStyle(e);const i=t.get(e);if(i)return i;const n=this._DOM.getComputedStyle(e);return t.set(e,n),n}_computeGridCellShellHeights(e,t=null){return Array.isArray(e)&&e.length?e.map(((e,i)=>{if(!e)return 0;let n=null;t?(n=t[i],n||(n=this._getComputedStyleCached(e),t[i]=n)):n=this._getComputedStyleCached(e);const o=parseFloat(n?.paddingTop)||0,r=parseFloat(n?.paddingBottom)||0,s=parseFloat(n?.borderTopWidth)||0,l=parseFloat(n?.borderBottomWidth)||0,a=parseFloat(n?.marginTop)||0,h=parseFloat(n?.marginBottom)||0,c=o+r+s+l,g=Math.max(0,a)+Math.max(0,h),d=this._DOM.getElementOffsetHeight(e)||0;let p=0;if("function"==typeof this._node.getContentHeightByProbe)try{const t=this._node.getContentHeightByProbe(e,n);Number.isFinite(t)&&t>=0&&(p=t)}catch(e){}p>0&&!(p>d)||(p=Math.max(0,d-c));let u=d-p;return Number.isFinite(u)||(u=c),u=Math.max(u,c),Math.max(0,u+g)})):[]}_getRowTop(e,t,i=null){if(Array.isArray(e)){let i=1/0;return e.forEach((e=>{const n=this._node.getTop(e,t);Number.isFinite(n)&&(i=Math.min(i,n))})),i===1/0?0:i}return e&&this._node.getTop(e,t)||0}_getRowBottom(e,t,i=null){if(Array.isArray(e)){let n=-1/0;return e.forEach(((e,o)=>{const r=this._node.getBottom(e,t);let s=null;i?(s=i[o],!s&&e&&(s=this._getComputedStyleCached(e),i[o]=s)):e&&(s=this._getComputedStyleCached(e));const l=r+(s&&parseFloat(s.marginBottom)||0);Number.isFinite(l)&&(n=Math.max(n,l))})),n===-1/0?0:n}if(e){const i=this._node.getBottom(e,t)||0,n=this._getComputedStyleCached(e);return i+(parseFloat(n?.marginBottom)||0)}return 0}_scanGridLayout(e,t){const i=t.gridAutoFlow||"";if(!i.startsWith("row"))return{safe:!1,reason:`grid-auto-flow=${i}`};if(i.includes("dense"))return{safe:!1,reason:"grid-auto-flow dense not supported yet"};if("none"!==(t.gridTemplateAreas||"none"))return{safe:!1,reason:"grid-template-areas present"};const n=t.gridTemplateColumns||"",o=t.gridTemplateRows||"",r=e=>e.includes("subgrid")||e.includes("auto-fit")||e.includes("auto-fill")||e.includes("fit-content");if(r(n)||r(o))return{safe:!1,reason:"complex track sizing (subgrid/auto-fit/fit-content)"};return/\[.*?\]/.test(n)||/\[.*?\]/.test(o)?{safe:!1,reason:"named grid lines detected"}:{safe:!0}}}const on="background:#999;color:#FFF;padding: 0 4px;";class rn{constructor({config:e,DOM:t,node:i,selector:n}){this._debug=e.debugMode?{...e.debugConfig.pre}:{},this._DOM=t,this._selector=n,this._node=i,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0}split(e,t,i,n,o){const r=o||this._DOM.getComputedStyle(e),s=["%c_splitPreNode\n","color:white"];this._debug._&&console.group("%c_splitPreNode","background:cyan"),this._debug._&&console.log(...s,"node",e,{pageBottom:t,fullPageHeight:i});const l=e=>isNaN(parseFloat(e))?0:Math.ceil(parseFloat(e)),a=(l(r.marginTop),l(r.marginBottom),l(r.paddingTop)),h=l(r.paddingBottom),c=l(r.borderTopWidth),g=l(r.borderBottomWidth),d=l(r.lineHeight),p=this._node.getTop(e,n),u=a+h+c+g;if(this._DOM.getElementOffsetHeight(e)1)return this._debug._&&console.log("%c END _splitPreNode TODO!",on),[];{if(this._DOM.isElementNode(_[0])){const e=_[0];return this._debug._&&console.warn("is Element Node",e),this._debug._&&console.log("%c END _splitPreNode ???????",on),[]}this._node.isWrappedTextNode(_[0])&&this._debug._&&console.warn(`is TEXT Node: ${_[0]}`);const n=_[0].wholeText,o=this._node.splitTextByLinesGreedy(n);if(o.length{const t=this._node.createWithFlagNoBreak();return this._DOM.setInnerHTML(t,e),t}));this._debug._&&console.log("linesFromNode",h),this._DOM.replaceNodeContentsWith(e,...h);const d=0,f=d+c,m=d+g;let b=t-p-m-u; //! For firstPartSpace we need all margins & preWrapperHeight. //! For firstPartSpaceForSPlitting we only need selected amendments. -const w=i-u-f;this._debug._&&console.log({pageBottom:t,nodeTop:p,preWrapperHeight:u,topCutLineAmend:f,bottomCutLineAmend:m,fullPageHeight:i},{firstPartSpace:b,fullPageSpace:w});let S=0,M=[],P=b;const C=r.position;"relative"!=C&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tP&&(this._debug._&&console.log(`start a new page: currentBottom (${n}) > floater(${P})`,i),t&&M.push(t),t&&(S+=1),P=t?this._node.getTop(i,e)+w:w)}if(this._DOM.setStyles(e,{position:C}),!M.length)return this._debug._&&console.log("%c END _splitPreNode NO SPLIITERS",on),[];this._debug._&&console.log(...s,"splitters",M);const O=M.map(((t,i,n)=>{const o=this._node.createSliceWrapper(e),r=t,s=i===n.length-1?1/0:n[i+1],l=h.slice(r,s);return this._DOM.insertAtEnd(o,...l),o}));return this._node.markSliceCuts([e,...O]),this._debug._&&console.log(...s,"newPreElementsArray",O),this._DOM.insertAfter(e,...O),this._debug._&&console.log("%c END _splitPreNode",on),this._debug._&&console.groupEnd(),[e,...O]}}}class sn{constructor({config:e,DOM:t,selector:T}){this._config=e,this._DOM=t,this._selector=T,this._debug=e.debugMode?{...e.debugConfig.node}:{},this._assert=!!e.consoleAssert,this._markupDebugMode=this._config.markupDebugMode,Object.assign(this,i),Object.assign(this,n),Object.assign(this,o),Object.assign(this,r),Object.assign(this,s),Object.assign(this,l),Object.assign(this,a),Object.assign(this,h),Object.assign(this,c),Object.assign(this,g),Object.assign(this,d),Object.assign(this,p),Object.assign(this,u),Object.assign(this,_),Object.assign(this,f),Object.assign(this,m),Object.assign(this,b),Object.assign(this,w),Object.assign(this,S),Object.assign(this,M),Object.assign(this,P),Object.assign(this,C),Object.assign(this,O),Object.assign(this,y),this._paragraph=new qi({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._pre=new rn({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._table=new en({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._grid=new nn({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._tableLike=new tn({config:this._config,DOM:this._DOM,selector:this._selector,node:this})}clearTemplates(e){this._DOM.getAll("template",e).forEach((e=>this._DOM.removeNode(e)))}notSolved(e){this._DOM.getElementTagName(e);return!1}}function ln(e){return e?.length?e?.split(/\s+/).filter(Boolean):[]}const an="#66CC00",hn=`color: ${an};font-weight:bold`,cn=`border:1px solid ${an};background:#EEEEEE;color:${an};`,gn="background:#999;color:#FFF;padding: 0 4px;";class dn{constructor({config:e,DOM:t,node:n,selector:o,layout:r,referenceWidth:s,referenceHeight:l}){Object.assign(this,i),this._debug=e.debugMode?{...e.debugConfig.pages}:{},this._assert=!!e.consoleAssert,this._selector=o,this._node=n,this._noHangingSelectors=ln(e.noHangingSelectors),this._pageBreakBeforeSelectors=ln(e.pageBreakBeforeSelectors),this._pageBreakAfterSelectors=ln(e.pageBreakAfterSelectors),this._forcedPageBreakSelectors=ln(e.forcedPageBreakSelectors),this._noBreakSelectors=ln(e.noBreakSelectors),this._garbageSelectors=ln(e.garbageSelectors),this._DOM=t,this._root=r.root,this._contentFlow=r.contentFlow,this._referenceWidth=s,this._referenceHeight=l,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0,this._commonLineHeight=this._node.getLineHeight(this._root),this._minimumBreakableHeight=this._commonLineHeight*this._minBreakableLines,this.pages=[]}calculate(){return this._removeGarbageElements(),this._prepareNoHangingElements(),this._prepareForcedPageBreakElements(),this._prepareNoBreakElements(),this._calculate(),this._debug._&&console.log("%c āœ” Pages.calculate()",cn,this.pages),this.pages}_removeGarbageElements(){if(this._garbageSelectors.length){this._DOM.getAll(this._garbageSelectors,this._contentFlow).forEach((e=>{this._DOM.removeNode(e)}))}}_prepareNoHangingElements(){if(this._noHangingSelectors.length){this._DOM.getAll(this._noHangingSelectors,this._contentFlow).forEach((e=>{this._node.setFlagNoHanging(e);const t=this._node.findLastChildParent(e,this._contentFlow);t&&this._node.setFlagNoHanging(t,"parent")}))}}_prepareNoBreakElements(){if(this._noBreakSelectors.length){this._DOM.getAll(this._noBreakSelectors,this._contentFlow).forEach((e=>this._node.setFlagNoBreak(e)))}}_prepareForcedPageBreakElements(){const e=this._pageBreakBeforeSelectors.length?this._DOM.getAll(this._pageBreakBeforeSelectors,this._contentFlow):[],t=this._pageBreakAfterSelectors.length?this._DOM.getAll(this._pageBreakAfterSelectors,this._contentFlow):[],i=this._DOM.getAll(this._forcedPageBreakSelectors,this._contentFlow);if(e.length){const t=e[0],i=this._node.findFirstChildParent(t,this._contentFlow)||t;this._node.isAfterContentFlowStart(i)&&e.shift()}if(t.length){const e=t.at(-1),i=this._node.findLastChildParent(e,this._contentFlow)||e,n=this._DOM.getRightNeighbor(i);this._node.isContentFlowEnd(n)&&t.pop()}e.length&&e.forEach((e=>{const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._DOM.insertBefore(t,this._node.createForcedPageBreak())})),i&&i.forEach((e=>{if(!this._node.isForcedPageBreak(e)){const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._DOM.insertBefore(t,this._node.createForcedPageBreak())}})),t.length&&t.forEach((e=>{const t=this._node.findLastChildParent(e,this._contentFlow);t&&(e=t),this._node.isForcedPageBreak(e.nextElementSibling)||this._DOM.insertAfter(e,this._node.createForcedPageBreak())}))}_registerFirstPage(){this._registerPageStart({element:this._DOM.getElement(this._selector.contentFlowStart,this._contentFlow),context:"register First Page"})}_isContentFlowShort(){const e=this._DOM.getElement(this._selector.contentFlowEnd,this._contentFlow),t=this._node.getBottom(e,this._root),i=tthis._registerPageStart({element:e,context:"All Forced Page Break Inside _contentFlow"})))}_calculate(){if(this._debug._&&console.groupCollapsed("•• init data ••"),this._debug._&&console.log("this._referenceHeight",this._referenceHeight,"\n","this._noHangingSelectors",this._noHangingSelectors,"\n","this._pageBreakBeforeSelectors",this._pageBreakBeforeSelectors,"\n","this._pageBreakAfterSelectors",this._pageBreakAfterSelectors,"\n","this._forcedPageBreakSelectors",this._forcedPageBreakSelectors,"\n","this._noBreakSelectors",this._noBreakSelectors),this._debug._&&console.groupEnd("•• init data ••"),this._registerFirstPage(),this._isContentFlowShort())return void this._resolveForcedPBInsideContentFlow();const e=this._node.getPreparedChildren(this._contentFlow);this._debug._&&console.groupCollapsed("%c🚸 children(contentFlow)",cn),this._debug._&&console.log(e),this._debug._&&console.groupEnd("%c🚸 children(contentFlow)",cn),this._parseNodes({array:e})}_registerPageStart({element:e,improveResult:t=!1,type:i="current",context:n=""}){if(this._debug._registerPageStart&&console.log("%cšŸ“","background:yellow;font-weight:bold","\n improveResult:",t,"\n passed pageStart:",e,"\n context:",n),"next"===i&&this._node.isContentFlowEnd(e))return void(this._debug._parseNode&&console.log("šŸ [registerAsPageStart] reaches the ContentFlowEnd element}. SKIP registering.",e));if(this._node.isPageStartElement(e))return void(this._debug._registerPageStart&&console.warn("🚨 [_registerPageStart] pageStart candidate is already PageStartElement, return",e));let o=e;t&&(this._debug._registerPageStart&&console.log("[_registerPageStart] improve result:"),o=this._node.findBetterPageStart(o,this.pages.at(-1)?.pageStart,this._root)),this._DOM.getElementOffsetParent(o)||this._debug._registerPageStart&&console.warn("🚨 pageStart has no offsetParent. Check the caller.",o);const r=this._node.getTopForPageStartCandidate(o,this._root),s=r+this._referenceHeight,l=this._DOM.getLeftNeighbor(o);this.pages.push({pageStart:o,pageBottom:s,pageTop:r,prevPageEnd:l}),this._node.markPageStartElement(o,this.pages.length),this._debug._registerPageStart&&console.log(`%cšŸ“register page ${this.pages.length}`,"background:yellow;font-weight:bold","\n improved result:",t,"\n pageTop:",r,"\n pageBottom:",s,"\n pageStart:",o)}_parseNodes({previous:e,next:t,array:i,arrayTopParent:n,arrayBottomParent:o}){this._debug._parseNodes&&console.log("šŸ”µ _parseNodes",{array:i,arrayTopParent:n,arrayBottomParent:o});for(let r=0;r"),"šŸ“„",this.pages.length,{currentElement:n}),this._debug._parseNode&&console.log({previousElement:i,currentElement:n,nextElement:o,isFirstChild:e,isLastChild:t,arrayTopParent:r,arrayBottomParent:s}),!o)return this._node.markProcessed(n,"content-flow-end"),this._debug._parseNode&&console.log("%c END _parseNode (!nextElement)",gn),void(this._debug._parseNode&&console.groupEnd());const a=this._node.getBottom(n,this._root),h=s?this._node.getBottom(s,this._root):void 0;let c=h;const g=this._node.getTop(n,this._root);if(void 0!==h&&h-a>=this._referenceHeight){if(c=void 0,this._debug._parseNode&&console.log("🪁 Tail: We got a tail from the lower shells of the last child. Giving up our ā€œlast childā€ rule here and will try to insert a page break at the end of some parent. ",{arrayParentBottomEdge:h,currentParentBottomEdge:c,currentElementBottom:a,pageBottom:this.pages.at(-1).pageBottom},{currentElement:n,arrayBottomParent:s}),a<=this.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom <= this.pages.at(-1).pageBottom");const e=[];let t=n;for(this._debug._parseNode&&console.log("🪁 Tail: currentElement",n);t&&t!==s;)e.push({element:t,bottom:this._node.getBottom(t,this._root)}),t=t.parentElement;if(t!==s)throw new Error('"bottom" parent not found in the ancestor chain');e.push({element:s,bottom:h}),this._debug._parseNode&&console.log("🪁 Tail: _parents",e),this._debug._parseNode&&console.log("🪁 Tail: current PageBottom",this.pages.at(-1).pageBottom);for(let t=0;tthis.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: _parents[i].bottom > this.pages.at(-1).pageBottom",e[t].bottom,">",this.pages.at(-1).pageBottom,e[t].element);const i=this._node.createNeutral();if(i.classList.add("service"),this._DOM.insertAtEnd(e[t].element,i),this._registerPageStart({element:i,context:"_isTailLongerThanPage"}),this._debug._parseNode&&console.log("_registerPageStart",i),this._node.markProcessed(i,"node is ForcedPageBreak"),this._debug._parseNode&&console.log(this.pages.at(-1).pageBottom,h),!(h>this.pages.at(-1).pageBottom))return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",gn),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.log("🧧 • arrayParentBottomEdge > this.pages.at(-1).pageBottom")}return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",gn),void(this._debug._parseNode&&console.groupEnd())}this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom > this.pages.at(-1).pageBottom","DOING NOTHING")} +const w=i-u-f;this._debug._&&console.log({pageBottom:t,nodeTop:p,preWrapperHeight:u,topCutLineAmend:f,bottomCutLineAmend:m,fullPageHeight:i},{firstPartSpace:b,fullPageSpace:w});let S=0,M=[],P=b;const C=r.position;"relative"!=C&&this._DOM.setStyles(e,{position:"relative"});for(let t=0;tP&&(this._debug._&&console.log(`start a new page: currentBottom (${n}) > floater(${P})`,i),t&&M.push(t),t&&(S+=1),P=t?this._node.getTop(i,e)+w:w)}if(this._DOM.setStyles(e,{position:C}),!M.length)return this._debug._&&console.log("%c END _splitPreNode NO SPLIITERS",on),[];this._debug._&&console.log(...s,"splitters",M);const y=M.map(((t,i,n)=>{const o=this._node.createSliceWrapper(e),r=t,s=i===n.length-1?1/0:n[i+1],l=h.slice(r,s);return this._DOM.insertAtEnd(o,...l),o}));return this._node.markSliceCuts([e,...y]),this._debug._&&console.log(...s,"newPreElementsArray",y),this._DOM.insertAfter(e,...y),this._debug._&&console.log("%c END _splitPreNode",on),this._debug._&&console.groupEnd(),[e,...y]}}}class sn{constructor({config:e,DOM:t,selector:T}){this._config=e,this._DOM=t,this._selector=T,this._debug=e.debugMode?{...e.debugConfig.node}:{},this._assert=!!e.consoleAssert,this._markupDebugMode=this._config.markupDebugMode,Object.assign(this,i),Object.assign(this,n),Object.assign(this,o),Object.assign(this,r),Object.assign(this,s),Object.assign(this,l),Object.assign(this,a),Object.assign(this,h),Object.assign(this,c),Object.assign(this,g),Object.assign(this,d),Object.assign(this,p),Object.assign(this,u),Object.assign(this,_),Object.assign(this,f),Object.assign(this,m),Object.assign(this,b),Object.assign(this,w),Object.assign(this,S),Object.assign(this,M),Object.assign(this,P),Object.assign(this,C),Object.assign(this,y),Object.assign(this,O),this._paragraph=new qi({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._pre=new rn({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._table=new en({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._grid=new nn({config:this._config,DOM:this._DOM,selector:this._selector,node:this}),this._tableLike=new tn({config:this._config,DOM:this._DOM,selector:this._selector,node:this})}clearTemplates(e){this._DOM.getAll("template",e).forEach((e=>this._DOM.removeNode(e)))}notSolved(e){this._DOM.getElementTagName(e);return!1}}function ln(e){return e?.length?e?.split(/\s+/).filter(Boolean):[]}const an="#66CC00",hn=`color: ${an};font-weight:bold`,cn=`border:1px solid ${an};background:#EEEEEE;color:${an};`,gn="background:#999;color:#FFF;padding: 0 4px;";class dn{constructor({config:e,DOM:t,node:n,selector:o,layout:r,referenceWidth:s,referenceHeight:l}){Object.assign(this,i),this._debug=e.debugMode?{...e.debugConfig.pages}:{},this._assert=!!e.consoleAssert,this._selector=o,this._node=n,this._noHangingSelectors=ln(e.noHangingSelectors),this._pageBreakBeforeSelectors=ln(e.pageBreakBeforeSelectors),this._pageBreakAfterSelectors=ln(e.pageBreakAfterSelectors),this._forcedPageBreakSelectors=ln(e.forcedPageBreakSelectors),this._noBreakSelectors=ln(e.noBreakSelectors),this._garbageSelectors=ln(e.garbageSelectors),this._DOM=t,this._root=r.root,this._contentFlow=r.contentFlow,this._referenceWidth=s,this._referenceHeight=l,this._minLeftLines=2,this._minDanglingLines=2,this._minBreakableLines=this._minLeftLines+this._minDanglingLines,this._minLeftRows=1,this._minDanglingRows=1,this._minBreakableRows=1,this._minPreFirstBlockLines=3,this._minPreLastBlockLines=3,this._minPreBreakableLines=this._minPreFirstBlockLines+this._minPreLastBlockLines,this._minBreakableGridRows=4,this._imageReductionRatio=.8,this._signpostHeight=parseFloat(e.splitLabelHeight)||0,this._commonLineHeight=this._node.getLineHeight(this._root),this._minimumBreakableHeight=this._commonLineHeight*this._minBreakableLines,this.pages=[]}calculate(){return this._removeGarbageElements(),this._prepareNoHangingElements(),this._prepareForcedPageBreakElements(),this._prepareNoBreakElements(),this._calculate(),this._debug._&&console.log("%c āœ” Pages.calculate()",cn,this.pages),this.pages}_removeGarbageElements(){if(this._garbageSelectors.length){this._DOM.getAll(this._garbageSelectors,this._contentFlow).forEach((e=>{this._DOM.removeNode(e)}))}}_prepareNoHangingElements(){if(this._noHangingSelectors.length){this._DOM.getAll(this._noHangingSelectors,this._contentFlow).forEach((e=>{this._node.setFlagNoHanging(e);const t=this._node.findLastChildParent(e,this._contentFlow);t&&this._node.setFlagNoHanging(t,"parent")}))}}_prepareNoBreakElements(){if(this._noBreakSelectors.length){this._DOM.getAll(this._noBreakSelectors,this._contentFlow).forEach((e=>this._node.setFlagNoBreak(e)))}}_prepareForcedPageBreakElements(){const e=this._pageBreakBeforeSelectors.length?this._DOM.getAll(this._pageBreakBeforeSelectors,this._contentFlow):[],t=this._pageBreakAfterSelectors.length?this._DOM.getAll(this._pageBreakAfterSelectors,this._contentFlow):[],i=this._DOM.getAll(this._forcedPageBreakSelectors,this._contentFlow);if(e.length){const t=e[0],i=this._node.findFirstChildParent(t,this._contentFlow)||t;this._node.isAfterContentFlowStart(i)&&e.shift()}if(t.length){const e=t.at(-1),i=this._node.findLastChildParent(e,this._contentFlow)||e,n=this._DOM.getRightNeighbor(i);this._node.isContentFlowEnd(n)&&t.pop()}e.length&&e.forEach((e=>{const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._DOM.insertBefore(t,this._node.createForcedPageBreak())})),i&&i.forEach((e=>{if(!this._node.isForcedPageBreak(e)){const t=this._node.findBetterForcedPageStarter(e,this._contentFlow);t&&this._DOM.insertBefore(t,this._node.createForcedPageBreak())}})),t.length&&t.forEach((e=>{const t=this._node.findLastChildParent(e,this._contentFlow);t&&(e=t),this._node.isForcedPageBreak(e.nextElementSibling)||this._DOM.insertAfter(e,this._node.createForcedPageBreak())}))}_registerFirstPage(){this._registerPageStart({element:this._DOM.getElement(this._selector.contentFlowStart,this._contentFlow),context:"register First Page"})}_isContentFlowShort(){const e=this._DOM.getElement(this._selector.contentFlowEnd,this._contentFlow),t=this._node.getBottom(e,this._root),i=tthis._registerPageStart({element:e,context:"All Forced Page Break Inside _contentFlow"})))}_calculate(){if(this._debug._&&console.groupCollapsed("•• init data ••"),this._debug._&&console.log("this._referenceHeight",this._referenceHeight,"\n","this._noHangingSelectors",this._noHangingSelectors,"\n","this._pageBreakBeforeSelectors",this._pageBreakBeforeSelectors,"\n","this._pageBreakAfterSelectors",this._pageBreakAfterSelectors,"\n","this._forcedPageBreakSelectors",this._forcedPageBreakSelectors,"\n","this._noBreakSelectors",this._noBreakSelectors),this._debug._&&console.groupEnd("•• init data ••"),this._registerFirstPage(),this._isContentFlowShort())return void this._resolveForcedPBInsideContentFlow();const e=this._node.getPreparedChildren(this._contentFlow);this._debug._&&console.groupCollapsed("%c🚸 children(contentFlow)",cn),this._debug._&&console.log(e),this._debug._&&console.groupEnd("%c🚸 children(contentFlow)",cn),this._parseNodes({array:e})}_registerPageStart({element:e,improveResult:t=!1,type:i="current",context:n=""}){if(this._debug._registerPageStart&&console.log("%cšŸ“","background:yellow;font-weight:bold","\n improveResult:",t,"\n passed pageStart:",e,"\n context:",n),"next"===i&&this._node.isContentFlowEnd(e))return void(this._debug._parseNode&&console.log("šŸ [registerAsPageStart] reaches the ContentFlowEnd element}. SKIP registering.",e));if(this._node.isPageStartElement(e))return void(this._debug._registerPageStart&&console.warn("🚨 [_registerPageStart] pageStart candidate is already PageStartElement, return",e));let o=e;t&&(this._debug._registerPageStart&&console.log("[_registerPageStart] improve result:"),o=this._node.findBetterPageStart(o,this.pages.at(-1)?.pageStart,this._root)),this._DOM.getElementOffsetParent(o)||this._debug._registerPageStart&&console.warn("🚨 pageStart has no offsetParent. Check the caller.",o);const r=this._node.getTopForPageStartCandidate(o,this._root),s=r+this._referenceHeight,l=this._DOM.getLeftNeighbor(o);this.pages.push({pageStart:o,pageBottom:s,pageTop:r,prevPageEnd:l}),this._node.markPageStartElement(o,this.pages.length),this._debug._registerPageStart&&console.log(`%cšŸ“register page ${this.pages.length}`,"background:yellow;font-weight:bold","\n improved result:",t,"\n pageTop:",r,"\n pageBottom:",s,"\n pageStart:",o)}_parseNodes({previous:e,next:t,array:i,arrayTopParent:n,arrayBottomParent:o}){this._debug._parseNodes&&console.log("šŸ”µ _parseNodes",{array:i,arrayTopParent:n,arrayBottomParent:o});for(let r=0;r"),"šŸ“„",this.pages.length,{currentElement:n}),this._debug._parseNode&&console.log({previousElement:i,currentElement:n,nextElement:o,isFirstChild:e,isLastChild:t,arrayTopParent:r,arrayBottomParent:s}),!o)return this._node.markProcessed(n,"content-flow-end"),this._debug._parseNode&&console.log("%c END _parseNode (!nextElement)",gn),void(this._debug._parseNode&&console.groupEnd());const a=this._node.getBottom(n,this._root),h=s?this._node.getBottom(s,this._root):void 0;let c=h;const g=this._node.getTop(n,this._root);if(void 0!==h&&h-a>=this._referenceHeight){if(c=void 0,this._debug._parseNode&&console.log("🪁 Tail: We got a tail from the lower shells of the last child. Giving up our ā€œlast childā€ rule here and will try to insert a page break at the end of some parent. ",{arrayParentBottomEdge:h,currentParentBottomEdge:c,currentElementBottom:a,pageBottom:this.pages.at(-1).pageBottom},{currentElement:n,arrayBottomParent:s}),a<=this.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom <= this.pages.at(-1).pageBottom");const e=[];let t=n;for(this._debug._parseNode&&console.log("🪁 Tail: currentElement",n);t&&t!==s;)e.push({element:t,bottom:this._node.getBottom(t,this._root)}),t=t.parentElement;if(t!==s)throw new Error('"bottom" parent not found in the ancestor chain');e.push({element:s,bottom:h}),this._debug._parseNode&&console.log("🪁 Tail: _parents",e),this._debug._parseNode&&console.log("🪁 Tail: current PageBottom",this.pages.at(-1).pageBottom);for(let t=0;tthis.pages.at(-1).pageBottom){this._debug._parseNode&&console.log("🪁 Tail: _parents[i].bottom > this.pages.at(-1).pageBottom",e[t].bottom,">",this.pages.at(-1).pageBottom,e[t].element);const i=this._node.createNeutral();if(i.classList.add("service"),this._DOM.insertAtEnd(e[t].element,i),this._registerPageStart({element:i,context:"_isTailLongerThanPage"}),this._debug._parseNode&&console.log("_registerPageStart",i),this._node.markProcessed(i,"node is ForcedPageBreak"),this._debug._parseNode&&console.log(this.pages.at(-1).pageBottom,h),!(h>this.pages.at(-1).pageBottom))return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",gn),void(this._debug._parseNode&&console.groupEnd());this._debug._&&console.log("🧧 • arrayParentBottomEdge > this.pages.at(-1).pageBottom")}return this._debug._parseNode&&console.log("%c END _parseNode (bottom Tail of parents)",gn),void(this._debug._parseNode&&console.groupEnd())}this._debug._parseNode&&console.log("🪁 Tail: currentElementBottom > this.pages.at(-1).pageBottom","DOING NOTHING")} //! currentParentBottomEdge is refreshed right before, so descendants see live parent boundaries. -const d=c??a;if(this._debug._parseNode&&console.log("[_parseNode]",{currentBlockBottom:d,currentParentBottomEdge:c,currentElementBottom:a}),this.pages.at(-1).pageStart===n&&(this._node.isNoBreak(n)||d<=this.pages.at(-1).pageBottom))return this._node.markProcessed(n,"node is already registered and fits in the page"),this._debug._parseNode&&console.log("%c END _parseNode (node is already registered and fits in the next page)",gn),void(this._debug._parseNode&&console.groupEnd());if(g>=this.pages.at(-1).pageBottom&&a-g){const t=e&&Boolean(r)?this._node.getTopForPageStartCandidate(r,this._root):void 0,i=Boolean(t)&&g-t>=this._referenceHeight;if(i)this._debug._parseNode&&console.log("🪁 beginning Tail",{parentTop:t,currentParentBottomEdge:c,currentElementTop:g,pageBottom:this.pages.at(-1).pageBottom},{currentElement:n,arrayTopParent:r});else{const e=this._DOM.getComputedStyle(n)?.display||"";if(e.includes("inline")||"contents"===e)return this._debug._parseNode&&console.log("šŸ§… current in thin wrapper"),this._registerPageStart({element:n,improveResult:!0,context:"šŸ§… current in thin wrapper"}),this._debug._parseNode&&console.log("%c END _parseNode (registered new page start)",gn),void(this._debug._parseNode&&console.groupEnd())}this._registerPageStart({element:n,improveResult:!i,context:"currentElementTop >= this.pages.at(-1).pageBottom"})}if(this._node.isForcedPageBreak(n))return this._registerPageStart({element:n,context:"currentElement is ForcedPageBreak"}),this._node.markProcessed(n,"node is ForcedPageBreak"),this._debug._parseNode&&console.log("%c END _parseNode (isForcedPageBreak)",gn),void(this._debug._parseNode&&console.groupEnd());this.strictAssert(this._DOM.getElementOffsetParent(n),"it is expected that the element has an offset parent",n);const p=this._node.getTop(o,this._root);if(this._debug._parseNode&&console.log(...l,"• pageBottom",this.pages.at(-1).pageBottom,"\n","• nextElementTop",p),p<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("nextElementTop <= this.pages.at(-1).pageBottom",p,"<=",this.pages.at(-1).pageBottom),this._node.markProcessed(n,"node fits"),this._node.findAllForcedPageBreakInside(n).forEach((e=>{this._node.markProcessed(e,"node is ForcedPageBreak (inside a node that fits)"),this._registerPageStart({element:e,context:"All Forced Page Break Inside currentElement"})})),this._debug._parseNode&&console.log("%c END _parseNode (node pass)",gn),void(this._debug._parseNode&&console.groupEnd());{if(this._debug._parseNode&&console.log("nextElementTop > this.pages.at(-1).pageBottom",p,">",this.pages.at(-1).pageBottom),d<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("currentBlockBottom <= this.pages.at(-1).pageBottom",d,"<=",this.pages.at(-1).pageBottom,"\n register nextElement as pageStart"),this._node.isNoHanging(n)?(this._debug._parseNode&&console.log("currentElement fits / last, and _isNoHanging => move it to the next page"),this._node.markProcessed(n,"it fits & last & _isNoHanging => move it to the next page"),this._registerPageStart({element:n,improveResult:!0,context:"currentElement is NoHanging"}),this._debug._parseNode&&console.log("%c END _parseNode (isNoHanging)",gn),void(this._debug._parseNode&&console.groupEnd())):(this._registerPageStart({element:o,type:"next",context:"currentBlockBottom <= PgBtt && nextElementTop > PgBtt"}),this._node.markProcessed(n,"fits, its bottom falls exactly on the cut"),this._node.markProcessed(o,"starts new page, its top is exactly on the cut"),this._debug._parseNode&&console.log("%c END _parseNode (currentElement fits, register the next element)",gn),void(this._debug._parseNode&&console.groupEnd()));const t=this._node.resolveReplacedElement(n,{prefer:"first"});if(t){const i=this._node.isSVG(t),s=i?this._node.createSignpost(t):t,l=this._node.getTop(s,this._root),a=e&&r?this._node.getTop(r,this._root):void 0,g=r||this._DOM.getParentNode(s),d=this._node.estimateInlineImgGapBelow(g);let p=this.pages.at(-1).pageBottom-l-d;p-=h?h-this._node.getBottom(s,this._root):0;let u=this._referenceHeight-d-(void 0!==a?l-a:0);const _=this._DOM.getElementOffsetHeight(s),f=this._DOM.getElementOffsetWidth(s);if(this._debug._parseNode&&console.log("šŸ–¼ļøšŸ–¼ļøšŸ–¼ļøšŸ–¼ļøšŸ–¼ļøšŸ–¼ļø (if mediaElement)",t,{_imageParent:g,arrayTopParent:r,arrayParentBottomEdge:h,availableImageNodeSpace:p,currentParentBottomEdge:c,currentElement:n,currentImage:s,currentImageHeight:_,currentImageWidth:f,isSvgMedia:i,imgGapBelow:d,parentTopForImage:a}),f>this._referenceWidth&&this._debug._parseNode&&console.warn("%c IMAGE is too wide","color: red"),_this._imageReductionRatio)return this._debug._parseNode&&console.log("Register next elements; šŸ–¼ļøšŸ–¼ļøšŸ–¼ļø IMG RESIZE to availableImageNodeSpace:",p,n),this._node.markProcessed(n,`IMG with ratio ${m}, and next starts on next`),this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:p,hspace:this._referenceWidth}),this._registerPageStart({element:o,type:"next",context:"current IMG was RESIZED to availableImageNodeSpace"}),this._debug._parseNode&&console.log("%c END _parseNode šŸ–¼ļø IMG scaled",gn),void(this._debug._parseNode&&console.groupEnd());this._node.markProcessed(n,"IMG starts on next");const b=i?s:t;return this._registerPageStart({element:b,improveResult:!0,context:"move IMG it to next page"}),this._debug._parseNode&&console.log("šŸ–¼ļø register Page Start",n),_>u&&(this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:u,hspace:this._referenceWidth}),this._node.markProcessed(n,"IMG starts on next and resized"),this._debug._parseNode&&console.log("šŸ–¼ļø ..and fit it to full page",n)),this._debug._parseNode&&console.log("%c END",gn),void(this._debug._parseNode&&console.groupEnd())}if(n.style.height){this._debug._parseNode&&console.log("🄁 currentElement has HEIGHT",n.style.height);const e=this.pages.at(-1).pageBottom-g,t=p-g,i=e/t,r=this._referenceHeight/t;return this._debug._parseNode&&console.log("\n🄁 currentElementTop",g,"\n🄁 pageBottom",this.pages.at(-1).pageBottom,"\n🄁 availableSpace",e,"\n🄁 currentElementContextualHeight",t,"\n🄁 availableSpaceFactor",i,"\n🄁 fullPageFactor",r),this.strictAssert(i<1),i>.8?(this._debug._parseNode&&console.log("🄁 availableSpaceFactor > 0.8: ",i),this._DOM.setStyles(n,{transform:`scale(${i})`,"transform-origin":"top center"}),this._registerPageStart({element:o,type:"next",context:"IMMEDIATELY scale currentElement to the remaining space; availableSpaceFactor > 0.8; currentElement.style.height"}),this._node.markProcessed(n,"processed as a image, has been scaled down within 20%, the next one starts a new page"),this._node.markProcessed(o,"the previous one was scaled down within 20%, and this one starts a new page."),this._debug._parseNode&&console.log("%c END _parseNode (has height & scale)",gn),void(this._debug._parseNode&&console.groupEnd())):(r<1&&(this._debug._parseNode&&console.log("🄁 fullPageFactor < 1: ",r),this._node.markProcessed(n,"processed as a image, has been scaled down, and starts new page"),this._DOM.setStyles(n,{transform:`scale(${r})`,"transform-origin":"top center"})),this._debug._parseNode&&console.log("🄁 _registerPageStart",n),this._registerPageStart({element:n,improveResult:!0,context:'has height & processed "as a image", has been scaled down, and starts new page'}),this._node.markProcessed(n,"processed as a image, starts new page"),this._debug._parseNode&&console.log("%c END _parseNode (has height & put on next page)",gn),void(this._debug._parseNode&&console.groupEnd()))}if(this._debug._parseNode&&console.log("split or not? \n","currentBlockBottom",d),this._debug._parseNode&&console.log("currentParentBottomEdge || currentElementBottom",{currentParentBottomEdge:c,currentElementBottom:a},"currentBlockBottom > this.pages.at(-1).pageBottom",d,">",this.pages.at(-1).pageBottom),this._DOM.getElementOffsetHeight(n) this.pages.at(-1).pageBottom"}),this._node.markProcessed(n,"starts new page, #fewLines"),this._debug._parseNode&&console.log("%c END _parseNode #fewLines",gn),void(this._debug._parseNode&&console.groupEnd());const u=this._node.getSplitChildren(n,this.pages.at(-1).pageBottom,this._referenceHeight,this._root);this._debug._parseNode&&console.log("try to break it and loop the children:",u);if(u.length){const e=r||n,t=s||n,l=this._node.isFullySPlitted(n)||this._node.isSlough(n);this._debug._parseNode&&console.log({isFullySPlittedParent:l,arrayTopParent:r}),this._parseNodes({array:u,previous:i,next:o,arrayTopParent:l?void 0:e,arrayBottomParent:l?void 0:t}),this._node.markProcessed(n,"getSplitChildren and _parseNodes")}else this._debug._parseNode&&console.log(...l,"_registerPageStart (from _parseNode): \n",n),this._registerPageStart({element:n,improveResult:!0,context:"does not fit, has no children, register it (or parents if improved)"}),this._node.markProcessed(n,"doesn't fit, has no children, register it or parents")}this._debug._parseNode&&console.log("%c END _parseNode [•••]",gn,{currentElement:n}),this._debug._parseNode&&console.groupEnd()}}class pn{constructor({config:e,DOM:t,node:i,selector:n,layout:o}){this._debug=e.debugMode?{...e.debugConfig.paper}:{},this._DOM=t,this._selector=n,this._node=i,this._frontpageTemplate=o.frontpageTemplate,this._headerTemplate=o.headerTemplate,this._footerTemplate=o.footerTemplate,this._pageChromeSelector=n?.pageChrome||".pageChrome",this._pageBodySpacerSelector=n?.pageBodySpacer||".pageBodySpacer",this._pageHeaderSelector=n?.pageHeader||".pageHeader",this._pageFooterSelector=n?.pageFooter||".pageFooter",this._headerContentSelector=n?.headerContent||".headerContent",this._footerContentSelector=n?.footerContent||".footerContent",this._frontpageElementSelector=n?.frontpageElement||".frontpageElement",this._frontpageContentSelector=n?.frontpageContent||".frontpageContent",this._virtualPaperSelector=n?.virtualPaper||".virtualPaper",this._virtualPaperTopMarginSelector=n?.virtualPaperTopMargin||".virtualPaperTopMargin",this._virtualPaperBottomMarginSelector=n?.virtualPaperBottomMargin||".virtualPaperBottomMargin",this._pageNumberRootSelector=n?.pageNumberRoot||void 0,this._pageNumberCurrentSelector=n?.pageNumberCurrent||void 0,this._pageNumberTotalSelector=n?.pageNumberTotal||void 0,this._paperHeight,this._frontpageFactor,this.headerHeight,this.footerHeight,this.bodyHeight,this.bodyWidth,this._calculatePaperParams()}createPageChrome({pageNumber:e,pageCount:t}){const i=this._node.create(this._pageChromeSelector),n=this._composePageElements({pageNumber:e,pageCount:t});return this._DOM.insertAtEnd(i,n),i}_composePageElements({pageNumber:e,pageCount:t}){const i=this._DOM.createDocumentFragment(),n=this._createPageBodySpacer(this.bodyHeight),o=this._createPageHeader(this._headerTemplate),r=this._createPageFooter(this._footerTemplate);return this._DOM.insertAtEnd(i,this.createVirtualTopMargin(),o,n,r,this.createVirtualBottomMargin()),e&&t&&(this._setPageNumber(o,e,t),this._setPageNumber(r,e,t)),i}createFrontpage(){if(!this._frontpageTemplate)return void(this._debug&&console.warn("[paper • createFrontpage()] called without a template"));const e=this._node.create(this._frontpageElementSelector);this._DOM.setStyles(e,{height:this.bodyHeight+"px",display:"inline-block",width:"100%","vertical-align":"top"});const t=this._createFrontpageContent(this._frontpageTemplate,this._frontpageFactor);return this._DOM.setStyles(t,{display:"flow-root","transform-origin":"top center",height:"100%"}),this._DOM.insertAtStart(e,t),e}createVirtualTopMargin(){return this._node.create(this._virtualPaperTopMarginSelector)}createVirtualBottomMargin(){return this._node.create(this._virtualPaperBottomMarginSelector)}createVirtualPaper(e){const t=this._node.create(this._virtualPaperSelector);return e&&this._DOM.insertAtEnd(t,this.createVirtualTopMargin(),e,this.createVirtualBottomMargin()),t}_createFrontpageContent(e,t){const i=this._node.create(this._frontpageContentSelector);return e&&this._DOM.setInnerHTML(i,e),t&&this._DOM.setStyles(i,{transform:`scale(${t})`}),i}_createPageBodySpacer(e,t){const i=this._node.create(this._pageBodySpacerSelector);return this._DOM.setStyles(i,{height:e+"px"}),t&&this._DOM.insertAtEnd(i,t),i}_createPageHeader(e){const t=this._node.create(this._pageHeaderSelector);if(e){const i=this._node.create(this._headerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_createPageFooter(e){const t=this._node.create(this._pageFooterSelector);if(e){const i=this._node.create(this._footerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_setPageNumber(e,t,i){const n=this._pageNumberRootSelector?this._DOM.getElement(this._pageNumberRootSelector,e):this._pageNumberRootSelector;if(n){const e=this._DOM.getElement(this._pageNumberCurrentSelector,n),o=this._DOM.getElement(this._pageNumberTotalSelector,n);this._DOM.setInnerHTML(e,t),this._DOM.setInnerHTML(o,i)}}_calculatePaperParams(){const e=this._createPageBodySpacer(),t=this._createPageHeader(this._headerTemplate),i=this._createPageFooter(this._footerTemplate),n=this._node.create(this._virtualPaperSelector);this._DOM.insertAtEnd(n,this.createVirtualTopMargin(),t,e,i,this.createVirtualBottomMargin());const o=this._node.create("#workbench");this._DOM.setStyles(o,{position:"absolute",left:"-3000px"}),this._DOM.insertAtEnd(o,n),this._DOM.insertAtStart(this._DOM.body,o);const r=this._DOM.getElementBCR(n).height,s=this._DOM.getElementOffsetHeight(t)||0,l=this._DOM.getElementOffsetHeight(i)||0,a=this._DOM.getElementOffsetHeight(e),h=this._DOM.getElementOffsetWidth(e),c=this._createFrontpageContent(this._frontpageTemplate);this._DOM.insertAtStart(e,c);const g=this._DOM.getElementOffsetHeight(e),d=g>a?a/g:1;this._DOM.removeNode(o),s>.2*r&&console.warn("It seems that your custom header is too high"),l>.15*r&&console.warn("It seems that your custom footer is too high"),d<1&&console.warn("It seems that your frontpage content is too large. We made it smaller to fit on the page. Check out how it looks! It might make sense to fix this with styles or reduce the text amount."),this._paperHeight=r,this.headerHeight=s,this.footerHeight=l,this.bodyHeight=a,this.bodyWidth=h,this._frontpageFactor=d}}class un{constructor({config:e,DOM:t,selector:n,node:o,pages:r,layout:s,paper:l}){this._config=e,this._debug=e.debugMode?{...e.debugConfig.preview}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=n,this._node=o,this._virtualPaperGapSelector=n.virtualPaperGap,this._runningSafetySelector=n.runningSafety,this._printPageBreakSelector=n.printPageBreak,this._pageDivider=n.pageDivider,this._virtualPaper=n.virtualPaper,this._virtualPaperTopMargin=n.virtualPaperTopMargin,this._pageBodySpacer=n.pageBodySpacer,this._pages=r,this._root=s.root,this._contentFlow=s.contentFlow,this._paperFlow=s.paperFlow,this._overlayFlow=s.overlayFlow,this._paper=l,this._hasFrontPage=!!s.frontpageTemplate}create(){this._processFrontPage(),this._processPages(),(!0===this._config.mask||"true"===this._config.mask)&&this._addMask(),this._makeRootVisible()}_addMask(){const e=parseInt(this._config.virtualPagesGap),t=parseInt(this._config.printHeight),i=parseInt(this._config.printTopMargin),n=parseInt(this._config.printBottomMargin),o=parseInt(this._config.headerMargin),r=parseInt(this._config.footerMargin),s=this._paper.headerHeight,l=this._paper.footerHeight,a=this._paper.bodyHeight,h=s?Math.ceil(o/2):0,c=l?Math.ceil(r/2):0,g=s-h,d=l-c,p=a+h+c,u=i+g,_=t+e;this.strictAssert(t===p+g+i+d+n,"Paper size calculation params do not match");const f=function({maskStep:e,maskWindow:t,maskFirstShift:i}){return`\n -webkit-mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% ${e}px;\n mask-size: 100% ${e}px;\n -webkit-mask-position: 100% ${i}px;\n mask-position: 100% ${i}px;\n -webkit-mask-repeat: repeat-y;\n mask-repeat: repeat-y;\n -webkit-mask-origin: border-box;\n mask-origin: border-box;\n `}({maskFirstShift:u,maskStep:_,maskWindow:p}),m=`\n @media screen {\n ${this._selector.contentFlow} {\n ${f}\n }\n }\n @media print {\n ${this._selector.root}::after {\n /* Safety placeholder for the bottom margin of the paper.\n Remove if the margins at the bottom of the page are replaced with padding.\n Placed under the footer.\n */\n --paper-color: ${this._config.paperColor};\n background: var(--paper-color, white);\n content: '';\n position: fixed;\n pointer-events: none;\n z-index: 11;\n inset: 0;\n top: unset;\n height: ${n+l}px;\n }\n }`;this._node.insertStyle(m,"mask")}_makeRootVisible(){this._DOM.setStyles(this._root,{visibility:"visible"})}_processFrontPage(){if(this._hasFrontPage){const e=this._paper.createFrontpage();this._DOM.insertAtStart(this._contentFlow,e),this._pages.unshift({pageStart:e})}}_processPages(){for(let e=0;e0&&this._debug._&&console.warn(`[preview] There is no page end element before ${e}. Perhaps it's a 'beginningTail'.`),t?this._DOM.setStyles(t,{"margin-top":["0","important"]}):this.strictAssert(0,"[preview] [_preventPageOverflow] current page First Element do not pass! page:",e)}_createPageBreaker(e,t){const i=this._node.create(this._pageDivider);return this._DOM.setAttribute(i,"[page]",`${e+1}`),t&&this._paper.footerHeight&&this._DOM.setStyles(i,{marginTop:this._paper.footerHeight+"px"}),this._paper.headerHeight&&this._DOM.setStyles(i,{paddingBottom:this._paper.headerHeight+"px"}),i}_updatePageStartElementAttrValue(e,t){this._hasFrontPage&&this._node.markPageStartElement(e,`${t+1}`)}_insertPaper(e,t,i){i?this._DOM.insertAtEnd(e,i,t):this._DOM.insertAtEnd(e,t)}_createVirtualPaperGap(){return this._node.create(this._virtualPaperGapSelector)}_createVirtualPaperTopMargin(){return this._paper.createVirtualTopMargin()}_createVirtualPaperBottomMargin(){return this._paper.createVirtualBottomMargin()}_insertFrontpageSpacer(e,t){const i=this._node.create();return this._DOM.setStyles(i,{paddingBottom:t+"px"}),this._DOM.setAttribute(i,".printFrontpageSpacer"),this._DOM.insertAtStart(e,i),i}_insertHeaderSpacer(e,t){const i=this._DOM.createDocumentFragment(),n=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(i,this._createVirtualPaperTopMargin(),n),this._DOM.insertAtEnd(e,i)}_insertFooterSpacer(e,t,i,n){const o=this._DOM.createDocumentFragment(),r=this._createVirtualPaperGap(),s=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(o,s,this._createVirtualPaperBottomMargin(),this._node.create(this._printPageBreakSelector),r),this._DOM.insertAtStart(e,o),this._balanceFooter(s,r,i,n)}_balanceFooter(e,t,i,n){const o=this._node.getTop(i,this._root),r=this._node.getTop(n,this._root),s=this._node.getTop(t,this._root);this.strictAssert(r==o,"balancers in paper layers are misaligned",{balancingFooter:e,contentSeparator:t,pageSeparator:i,paperSeparator:n});const l=o-s;this._debug._&&console.log({balancingFooter:e,contentSeparatorTop:s,paperSeparatorTop:r,pageSeparatorTop:o}),this._DOM.setStyles(e,{"margin-bottom":l+"px"}),this.strictAssert(l>=0,`balancer is negative: ${l} < 0`,t)}}class _n{constructor({config:e,DOM:t,selector:i,node:n,layout:o}){this._globalDebugMode=e.debugMode,this._debug=e.debugMode?{...e.debugConfig.toc}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._node=n,this._tocPageNumberSelector=e.tocPageNumberSelector,this._root=o.root,this._contentFlow=o.contentFlow,this._pageDividerSelector=i.pageDivider}render(){this._globalDebugMode&&console.time("Processing TOC"),this._debug._&&console.log(`\nšŸ“‘ TOC: I am here!\n\ntocPageNumberSelector:\n • ${this._tocPageNumberSelector}\n pageDividerSelector:\n • ${this._pageDividerSelector}\n `);const e=this._DOM.getAll(this._tocPageNumberSelector,this._contentFlow);if(this._debug._&&console.log("šŸ“‘ tocPageNumberBoxes",e.length),!e.length)return void(this._debug._&&console.log("šŸ“‘ no valid toc"));const t=this._DOM.getAll(this._pageDividerSelector,this._contentFlow).reduce(((e,t,i)=>{const n=this._node.getTop(t,this._root)-1,o=this._DOM.getAttribute(t,"[page]");return e[n]=o,e}),{});this._debug._&&console.log("šŸ“‘ dataFromPagesMarkers",t);const i=e.reduce(((e,t)=>{const i=this._DOM.getDataId(t),n=this._DOM.getElementById(i),o=this._node.getTop(n,this._root);return e[o]={box:t,id:i,targetTop:o},e}),{});this._debug._&&console.log("šŸ“‘ dataFromTOC",i);const n={...t,...i};let o=0;this._debug._&&console.groupCollapsed("Processing obj");for(const e in n){const t=n[e];this._debug._&&console.log(`Processing ${e}: ${t}`),"string"==typeof t?o=t:(t.page=o,this._DOM.setInnerHTML(t.box,o))}this._debug._&&console.groupEnd("Processing obj"),this._debug._&&console.log("šŸ“‘ tocObject",n),this._globalDebugMode&&console.timeEnd("Processing TOC")}}class fn{constructor({config:e,DOM:t,selector:n,node:o,layout:r}){this._config=e,this._selector=n,this._DOM=t,this._node=o,this._layout=r,this._root=r.root,this._assert=!!e.consoleAssert,Object.assign(this,i)}init(){this._config.debugMode&&console.log("šŸ™ i am Validator!");const e=`${this._selector.paperFlow} ${this._selector.virtualPaperGap}`,t=`${this._selector.contentFlow} ${this._selector.virtualPaperGap}`,i=[...this._DOM.getAllElements(e)],n=[...this._DOM.getAllElements(t)],o=i.map((e=>this._node.getTop(e))),r=n.map((e=>this._node.getTop(e,this._root))),s=o.reduce(((e,t,i)=>(t!==r[i]&&e.push(i+1),e)),[]);this.strictAssert(!s.length,"Problems with preview generation on the following pages: ",s)}}const mn="border:1px dashed #cccccc;background:#ffffff;color:#cccccc;";class bn{constructor(e){this._debugMode=e.debugMode,this._preloader,this._preloaderTarget=document.querySelector(e.preloaderTarget)||document.body,this._preloaderBackground=e.preloaderBackground||"white"}create(){this._debugMode&&console.groupCollapsed("%c Preloader ",mn),this._insertStyle(),this._preloader=document.createElement("div"),this._preloader.classList.add("lds-dual-ring"),this._preloaderTarget.append(this._preloader),this._debugMode&&console.groupEnd("%c Preloader ",mn)}remove(){if(!this._preloader)return;let e=1;const t=setInterval((()=>{e<=.1&&(clearInterval(t),this._preloader.remove()),this._preloader.style.opacity=e,e-=.1*e}),50);this._debugMode&&console.log("%c Preloader removed ",mn)}_insertStyle(){const e=document.querySelector("head"),t=document.createElement("style");t.append(document.createTextNode(this._css())),t.setAttribute("data-preloader-style",""),e.append(t)}_css(){return`\n /* PRELOADER */\n .lds-dual-ring {\n position: absolute;\n z-index: 99999;\n top: 0; left: 0; bottom: 0; right: 0;\n background: ${this._preloaderBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n }\n /*\n .lds-dual-ring:after {\n content: " ";\n display: block;\n width: 64px;\n height: 64px;\n margin: 8px;\n border-radius: 50%;\n border: 6px solid #eee;\n border-color: #eee transparent #eee transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n }\n @keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n */\n `}}class wn{constructor(e){this._debugMode=e.debugMode}run(){let e=[...document.querySelectorAll("object")];this._debugMode&&console.log(e);let t=[];return e.forEach((e=>{const i=new Promise((t=>{e.addEventListener("load",(i=>{this._debugMode&&console.log("ā° EVENT: object load",e.clientHeight,e.clientWidth,e),t()}))}));t.push(i)})),Promise.all(t)}}const Sn=e=>!0===e||"true"===e;function Mn(e){const t=Array.isArray(e)?[]:{};return Object.entries(e).forEach((([e,i])=>{t[e]=!i||"object"!=typeof i||Mn(i)})),t}const Pn={DOM:{_:!1},layout:{_:!1},pages:{_:!1,_parseNode:!1,_parseNodes:!1,_registerPageStart:!1},paper:{_:!1},preview:{_:!1},toc:{_:!1},node:{_:!1,children:!1,creators:!1,flowFilters:!1,fitters:!1,getters:!1,markers:!1,pageBreaks:!1,positioning:!1,selectors:!1,slicers:!1,splitters:!1,wrappers:!1,pagination:!1},paragraph:{_:!1},grid:{_:!1},pre:{_:!1},table:{_:!1},tableLike:{_:!1},testSignals:{forcedModeLog:!1}};function Cn(e){const t=function(e){let t={debugMode:!1,forcedDebugMode:!1,consoleAssert:!1,markupDebugMode:!1,preloader:!1,preloaderTarget:"",preloaderBackground:"",mask:!0,noHangingSelectors:"",forcedPageBreakSelectors:"",pageBreakBeforeSelectors:"",pageBreakAfterSelectors:"",noBreakSelectors:"",tocPageNumberSelector:"html2pdf-toc-page-number",printLeftMargin:"21mm",printRightMargin:"21mm",printTopMargin:"12mm",printBottomMargin:"12mm",printFontSize:"12pt",paperColor:"white",printWidth:"210mm",printHeight:"297mm",headerMargin:"16px",footerMargin:"16px",virtualPagesGap:"16px",splitLabelHeight:"24px"};const i={printWidth:"210mm",printHeight:"297mm"},n={printWidth:"148.5mm",printHeight:"210mm"};switch((e=function(e){const t={...e};for(const e in t){const i=t[e];if("string"==typeof i){const n=i.toLowerCase();"true"===n||"1"===n?t[e]=!0:"false"!==n&&"0"!==n&&""!==n||(t[e]=!1)}}return t}(e)).printPaperSize){case"A5":case"a5":t={...t,...n};break;default:t={...t,...i}}t={...t,initialRoot:T.init,tocPageNumberSelector:T.tocPageNumber,...e},console.info("[HTML2PDF4DOC] Config:",t);const o={printLeftMargin:t.printLeftMargin,printRightMargin:t.printRightMargin,printTopMargin:t.printTopMargin,printBottomMargin:t.printBottomMargin,printFontSize:t.printFontSize,printWidth:t.printWidth,printHeight:t.printHeight,headerMargin:t.headerMargin,footerMargin:t.footerMargin,virtualPagesGap:t.virtualPagesGap},r=document.createElement("div");return r.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(r),Object.entries(o).forEach((([e,t])=>{r.style.width=t,o[e]=`${Math.trunc(r.getBoundingClientRect().width)}px`})),r.remove(),t={...t,...o},t.noHangingSelectors=t.noHangingSelectors+" H1 H2 H3 H4 H5 H6",t.forcedPageBreakSelectors=t.forcedPageBreakSelectors+" "+T.printForcedPageBreak,t.debugMode&&console.info("Config with converted units:",t),t}(e);t.forcedDebugMode&&(t.debugMode=!0,t.consoleAssert=!0,t.markupDebugMode=!0);const i=t.forcedDebugMode?Mn(Pn):Pn;return{...t,debugConfig:i}}const On="color:Gray;border:1px solid;";console.info("[HTML2PDF4DOC] Version:","0.3.0");const yn=document.currentScript.dataset,Tn=new class{constructor(e){this.params=e,this.forcedDebugMode=Sn(e.forcedDebugMode),this.debugMode=Sn(e.debugMode)||this.forcedDebugMode,this.preloader=e.preloader,this.selector=T,this.config}async render(){console.time("[HTML2PDF4DOC] Total time"),this.debugMode&&console.log("šŸ document.readyState",document.readyState),document.addEventListener("readystatechange",(e=>{this.debugMode&&console.log("šŸ readystatechange",document.readyState)})),this.debugMode&&console.time("ā±ļø await DOMContentLoaded time"),await new Promise((e=>{window.addEventListener("DOMContentLoaded",(t=>{this.debugMode&&console.log("ā° EVENT: DOMContentLoaded"),e()}))})),this.debugMode&&console.timeEnd("ā±ļø await DOMContentLoaded time"),this.debugMode&&console.time("ā±ļø create Preloader time");const e=new bn(this.params);"true"===this.preloader&&e.create(),this.debugMode&&console.timeEnd("ā±ļø create Preloader time"),this.debugMode&&console.time("ā±ļø Config time"),this.debugMode&&console.groupCollapsed("%c config ",On+"color:LightGray"),this.config=Cn(this.params),this.debugMode&&console.groupEnd(),this.debugMode&&console.info("āš™ļø Current config with debugConfig:",this.config),this.debugMode&&console.timeEnd("ā±ļø Config time"),this.config.debugConfig.testSignals.forcedModeLog&&console.info("[HTML2PDF4DOC] šŸ› ļø Forced debug mode is active."),this.config.consoleAssert&&console.info("[HTML2PDF4DOC] 🧧 Assertions enabled."),this.debugMode&&console.time("ā±ļø DOM helpers init time");const t=new F({DOM:window.document,config:this.config});this.debugMode&&console.timeEnd("ā±ļø DOM helpers init time"),this.debugMode&&console.time("ā±ļø node helpers init time");const i=new sn({config:this.config,DOM:t,selector:this.selector});this.debugMode&&console.timeEnd("ā±ļø node helpers init time"),this.debugMode&&console.time("ā±ļø await window load time"),await new Promise((e=>{window.addEventListener("load",(t=>{this.debugMode&&console.log("ā° EVENT: window load"),e()}))})),this.debugMode&&console.timeEnd("ā±ļø await window load time"),this.debugMode&&console.time("ā±ļø Layout time"),this.debugMode&&console.groupCollapsed("%c Layout ",On);const n=new B({config:this.config,DOM:t,selector:this.selector,node:i});if(n.create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Layout time"),!n.success)return void(this.debugMode&&console.error("Failed to create layout.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.info("%c calculate Paper params ",On),this.debugMode&&console.time("ā±ļø Paper time");const o=new pn({config:this.config,DOM:t,selector:this.selector,node:i,layout:n});if(this.debugMode&&console.timeEnd("ā±ļø Paper time"),!o||!o.bodyHeight||!o.bodyWidth)return void(this.debugMode&&console.error("Failed to create paper calculations.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.time("ā±ļø Preprocess time"),this.debugMode&&console.groupCollapsed("%c Preprocess ",On),await new wn(this.config).run(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Preprocess time"),this.debugMode&&console.time("ā±ļø Pages time"),this.debugMode&&console.group("%c Pages ",On);const r=new dn({config:this.config,DOM:t,selector:this.selector,node:i,layout:n,referenceHeight:o.bodyHeight,referenceWidth:o.bodyWidth}).calculate();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Pages time"),this.debugMode&&console.time("ā±ļø Preview time"),this.debugMode&&console.groupCollapsed("%c Preview ",On),new un({config:this.config,DOM:t,selector:this.selector,node:i,layout:n,paper:o,pages:r}).create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Preview time"),this.debugMode&&console.time("ā±ļø Toc time"),new _n({config:this.config,DOM:t,selector:this.selector,node:i,layout:n}).render(),this.debugMode&&console.timeEnd("ā±ļø Toc time"),this.debugMode&&console.time("ā±ļø Validator time"),new fn({config:this.config,DOM:t,selector:this.selector,node:i,layout:n}).init(),this.debugMode&&console.timeEnd("ā±ļø Validator time"),t.setAttribute(n.root,"[success]"),t.setAttribute(n.root,"[pages]",r.length),e.remove(),console.info("[HTML2PDF4DOC] Page count:",r.length),console.timeEnd("[HTML2PDF4DOC] Total time")}}(yn),En="manual"===yn.init;function Dn(){En&&Tn.render()}En&&console.info("HTML2PDF4DOC in manual initialization mode"),!En&&Tn.render(),HTML2PDF4DOC=t})(); \ No newline at end of file +const d=c??a;if(this._debug._parseNode&&console.log("[_parseNode]",{currentBlockBottom:d,currentParentBottomEdge:c,currentElementBottom:a}),this.pages.at(-1).pageStart===n&&(this._node.isNoBreak(n)||d<=this.pages.at(-1).pageBottom))return this._node.markProcessed(n,"node is already registered and fits in the page"),this._debug._parseNode&&console.log("%c END _parseNode (node is already registered and fits in the next page)",gn),void(this._debug._parseNode&&console.groupEnd());if(g>=this.pages.at(-1).pageBottom&&a-g){const t=e&&Boolean(r)?this._node.getTopForPageStartCandidate(r,this._root):void 0,i=Boolean(t)&&g-t>=this._referenceHeight;if(i)this._debug._parseNode&&console.log("🪁 beginning Tail",{parentTop:t,currentParentBottomEdge:c,currentElementTop:g,pageBottom:this.pages.at(-1).pageBottom},{currentElement:n,arrayTopParent:r});else{const e=this._DOM.getComputedStyle(n)?.display||"";if(e.includes("inline")||"contents"===e)return this._debug._parseNode&&console.log("šŸ§… current in thin wrapper"),this._registerPageStart({element:n,improveResult:!0,context:"šŸ§… current in thin wrapper"}),this._debug._parseNode&&console.log("%c END _parseNode (registered new page start)",gn),void(this._debug._parseNode&&console.groupEnd())}this._registerPageStart({element:n,improveResult:!i,context:"currentElementTop >= this.pages.at(-1).pageBottom"})}if(this._node.isForcedPageBreak(n))return this._registerPageStart({element:n,context:"currentElement is ForcedPageBreak"}),this._node.markProcessed(n,"node is ForcedPageBreak"),this._debug._parseNode&&console.log("%c END _parseNode (isForcedPageBreak)",gn),void(this._debug._parseNode&&console.groupEnd());this.strictAssert(this._DOM.getElementOffsetParent(n),"it is expected that the element has an offset parent",n);const p=this._node.getTop(o,this._root);if(this._debug._parseNode&&console.log(...l,"• pageBottom",this.pages.at(-1).pageBottom,"\n","• nextElementTop",p),p<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("nextElementTop <= this.pages.at(-1).pageBottom",p,"<=",this.pages.at(-1).pageBottom),this._node.markProcessed(n,"node fits"),this._node.findAllForcedPageBreakInside(n).forEach((e=>{this._node.markProcessed(e,"node is ForcedPageBreak (inside a node that fits)"),this._registerPageStart({element:e,context:"All Forced Page Break Inside currentElement"})})),this._debug._parseNode&&console.log("%c END _parseNode (node pass)",gn),void(this._debug._parseNode&&console.groupEnd());{if(this._debug._parseNode&&console.log("nextElementTop > this.pages.at(-1).pageBottom",p,">",this.pages.at(-1).pageBottom),d<=this.pages.at(-1).pageBottom)return this._debug._parseNode&&console.log("currentBlockBottom <= this.pages.at(-1).pageBottom",d,"<=",this.pages.at(-1).pageBottom,"\n register nextElement as pageStart"),this._node.isNoHanging(n)?(this._debug._parseNode&&console.log("currentElement fits / last, and _isNoHanging => move it to the next page"),this._node.markProcessed(n,"it fits & last & _isNoHanging => move it to the next page"),this._registerPageStart({element:n,improveResult:!0,context:"currentElement is NoHanging"}),this._debug._parseNode&&console.log("%c END _parseNode (isNoHanging)",gn),void(this._debug._parseNode&&console.groupEnd())):(this._registerPageStart({element:o,type:"next",context:"currentBlockBottom <= PgBtt && nextElementTop > PgBtt"}),this._node.markProcessed(n,"fits, its bottom falls exactly on the cut"),this._node.markProcessed(o,"starts new page, its top is exactly on the cut"),this._debug._parseNode&&console.log("%c END _parseNode (currentElement fits, register the next element)",gn),void(this._debug._parseNode&&console.groupEnd()));const t=this._node.resolveReplacedElement(n,{prefer:"first"});if(t){const i=this._node.isSVG(t),s=i?this._node.createSignpost(t):t,l=this._node.getTop(s,this._root),a=e&&r?this._node.getTop(r,this._root):void 0,g=r||this._DOM.getParentNode(s),d=this._node.estimateInlineImgGapBelow(g);let p=this.pages.at(-1).pageBottom-l-d;p-=h?h-this._node.getBottom(s,this._root):0;let u=this._referenceHeight-d-(void 0!==a?l-a:0);const _=this._DOM.getElementOffsetHeight(s),f=this._DOM.getElementOffsetWidth(s);if(this._debug._parseNode&&console.log("šŸ–¼ļøšŸ–¼ļøšŸ–¼ļøšŸ–¼ļøšŸ–¼ļøšŸ–¼ļø (if mediaElement)",t,{_imageParent:g,arrayTopParent:r,arrayParentBottomEdge:h,availableImageNodeSpace:p,currentParentBottomEdge:c,currentElement:n,currentImage:s,currentImageHeight:_,currentImageWidth:f,isSvgMedia:i,imgGapBelow:d,parentTopForImage:a}),f>this._referenceWidth&&this._debug._parseNode&&console.warn("%c IMAGE is too wide","color: red"),_this._imageReductionRatio)return this._debug._parseNode&&console.log("Register next elements; šŸ–¼ļøšŸ–¼ļøšŸ–¼ļø IMG RESIZE to availableImageNodeSpace:",p,n),this._node.markProcessed(n,`IMG with ratio ${m}, and next starts on next`),this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:p,hspace:this._referenceWidth}),this._registerPageStart({element:o,type:"next",context:"current IMG was RESIZED to availableImageNodeSpace"}),this._debug._parseNode&&console.log("%c END _parseNode šŸ–¼ļø IMG scaled",gn),void(this._debug._parseNode&&console.groupEnd());this._node.markProcessed(n,"IMG starts on next");const b=i?s:t;return this._registerPageStart({element:b,improveResult:!0,context:"move IMG it to next page"}),this._debug._parseNode&&console.log("šŸ–¼ļø register Page Start",n),_>u&&(this._node.fitElementWithinBoundaries({element:t,height:_,width:f,vspace:u,hspace:this._referenceWidth}),this._node.markProcessed(n,"IMG starts on next and resized"),this._debug._parseNode&&console.log("šŸ–¼ļø ..and fit it to full page",n)),this._debug._parseNode&&console.log("%c END",gn),void(this._debug._parseNode&&console.groupEnd())}if(n.style.height){this._debug._parseNode&&console.log("🄁 currentElement has HEIGHT",n.style.height);const e=this.pages.at(-1).pageBottom-g,t=p-g,i=e/t,r=this._referenceHeight/t;return this._debug._parseNode&&console.log("\n🄁 currentElementTop",g,"\n🄁 pageBottom",this.pages.at(-1).pageBottom,"\n🄁 availableSpace",e,"\n🄁 currentElementContextualHeight",t,"\n🄁 availableSpaceFactor",i,"\n🄁 fullPageFactor",r),this.strictAssert(i<1),i>.8?(this._debug._parseNode&&console.log("🄁 availableSpaceFactor > 0.8: ",i),this._DOM.setStyles(n,{transform:`scale(${i})`,"transform-origin":"top center"}),this._registerPageStart({element:o,type:"next",context:"IMMEDIATELY scale currentElement to the remaining space; availableSpaceFactor > 0.8; currentElement.style.height"}),this._node.markProcessed(n,"processed as a image, has been scaled down within 20%, the next one starts a new page"),this._node.markProcessed(o,"the previous one was scaled down within 20%, and this one starts a new page."),this._debug._parseNode&&console.log("%c END _parseNode (has height & scale)",gn),void(this._debug._parseNode&&console.groupEnd())):(r<1&&(this._debug._parseNode&&console.log("🄁 fullPageFactor < 1: ",r),this._node.markProcessed(n,"processed as a image, has been scaled down, and starts new page"),this._DOM.setStyles(n,{transform:`scale(${r})`,"transform-origin":"top center"})),this._debug._parseNode&&console.log("🄁 _registerPageStart",n),this._registerPageStart({element:n,improveResult:!0,context:'has height & processed "as a image", has been scaled down, and starts new page'}),this._node.markProcessed(n,"processed as a image, starts new page"),this._debug._parseNode&&console.log("%c END _parseNode (has height & put on next page)",gn),void(this._debug._parseNode&&console.groupEnd()))}if(this._debug._parseNode&&console.log("split or not? \n","currentBlockBottom",d),this._debug._parseNode&&console.log("currentParentBottomEdge || currentElementBottom",{currentParentBottomEdge:c,currentElementBottom:a},"currentBlockBottom > this.pages.at(-1).pageBottom",d,">",this.pages.at(-1).pageBottom),this._DOM.getElementOffsetHeight(n) this.pages.at(-1).pageBottom"}),this._node.markProcessed(n,"starts new page, #fewLines"),this._debug._parseNode&&console.log("%c END _parseNode #fewLines",gn),void(this._debug._parseNode&&console.groupEnd());const u=this._node.getSplitChildren(n,this.pages.at(-1).pageBottom,this._referenceHeight,this._root);this._debug._parseNode&&console.log("try to break it and loop the children:",u);if(u.length){const e=r||n,t=s||n,l=this._node.isFullySPlitted(n)||this._node.isSlough(n);this._debug._parseNode&&console.log({isFullySPlittedParent:l,arrayTopParent:r}),this._parseNodes({array:u,previous:i,next:o,arrayTopParent:l?void 0:e,arrayBottomParent:l?void 0:t}),this._node.markProcessed(n,"getSplitChildren and _parseNodes")}else this._debug._parseNode&&console.log(...l,"_registerPageStart (from _parseNode): \n",n),this._registerPageStart({element:n,improveResult:!0,context:"does not fit, has no children, register it (or parents if improved)"}),this._node.markProcessed(n,"doesn't fit, has no children, register it or parents")}this._debug._parseNode&&console.log("%c END _parseNode [•••]",gn,{currentElement:n}),this._debug._parseNode&&console.groupEnd()}}class pn{constructor({config:e,DOM:t,node:i,selector:n,layout:o}){this._debug=e.debugMode?{...e.debugConfig.paper}:{},this._DOM=t,this._selector=n,this._node=i,this._frontpageTemplate=o.frontpageTemplate,this._headerTemplate=o.headerTemplate,this._footerTemplate=o.footerTemplate,this._pageChromeSelector=n?.pageChrome||".pageChrome",this._pageBodySpacerSelector=n?.pageBodySpacer||".pageBodySpacer",this._pageHeaderSelector=n?.pageHeader||".pageHeader",this._pageFooterSelector=n?.pageFooter||".pageFooter",this._headerContentSelector=n?.headerContent||".headerContent",this._footerContentSelector=n?.footerContent||".footerContent",this._frontpageElementSelector=n?.frontpageElement||".frontpageElement",this._frontpageContentSelector=n?.frontpageContent||".frontpageContent",this._virtualPaperSelector=n?.virtualPaper||".virtualPaper",this._virtualPaperTopMarginSelector=n?.virtualPaperTopMargin||".virtualPaperTopMargin",this._virtualPaperBottomMarginSelector=n?.virtualPaperBottomMargin||".virtualPaperBottomMargin",this._pageNumberRootSelector=n?.pageNumberRoot||void 0,this._pageNumberCurrentSelector=n?.pageNumberCurrent||void 0,this._pageNumberTotalSelector=n?.pageNumberTotal||void 0,this._paperHeight,this._frontpageFactor,this.headerHeight,this.footerHeight,this.bodyHeight,this.bodyWidth,this._calculatePaperParams()}createPageChrome({pageNumber:e,pageCount:t}){const i=this._node.create(this._pageChromeSelector),n=this._composePageElements({pageNumber:e,pageCount:t});return this._DOM.insertAtEnd(i,n),i}_composePageElements({pageNumber:e,pageCount:t}){const i=this._DOM.createDocumentFragment(),n=this._createPageBodySpacer(this.bodyHeight),o=this._createPageHeader(this._headerTemplate),r=this._createPageFooter(this._footerTemplate);return this._DOM.insertAtEnd(i,this.createVirtualTopMargin(),o,n,r,this.createVirtualBottomMargin()),e&&t&&(this._setPageNumber(o,e,t),this._setPageNumber(r,e,t)),i}createFrontpage(){if(!this._frontpageTemplate)return void(this._debug&&console.warn("[paper • createFrontpage()] called without a template"));const e=this._node.create(this._frontpageElementSelector);this._DOM.setStyles(e,{height:this.bodyHeight+"px",display:"inline-block",width:"100%","vertical-align":"top"});const t=this._createFrontpageContent(this._frontpageTemplate,this._frontpageFactor);return this._DOM.setStyles(t,{display:"flow-root","transform-origin":"top center",height:"100%"}),this._DOM.insertAtStart(e,t),e}createVirtualTopMargin(){return this._node.create(this._virtualPaperTopMarginSelector)}createVirtualBottomMargin(){return this._node.create(this._virtualPaperBottomMarginSelector)}createVirtualPaper(e){const t=this._node.create(this._virtualPaperSelector);return e&&this._DOM.insertAtEnd(t,this.createVirtualTopMargin(),e,this.createVirtualBottomMargin()),t}_createFrontpageContent(e,t){const i=this._node.create(this._frontpageContentSelector);return e&&this._DOM.setInnerHTML(i,e),t&&this._DOM.setStyles(i,{transform:`scale(${t})`}),i}_createPageBodySpacer(e,t){const i=this._node.create(this._pageBodySpacerSelector);return this._DOM.setStyles(i,{height:e+"px"}),t&&this._DOM.insertAtEnd(i,t),i}_createPageHeader(e){const t=this._node.create(this._pageHeaderSelector);if(e){const i=this._node.create(this._headerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_createPageFooter(e){const t=this._node.create(this._pageFooterSelector);if(e){const i=this._node.create(this._footerContentSelector);this._DOM.setInnerHTML(i,e),this._DOM.insertAtEnd(t,i)}return t}_setPageNumber(e,t,i){const n=this._pageNumberRootSelector?this._DOM.getElement(this._pageNumberRootSelector,e):this._pageNumberRootSelector;if(n){const e=this._DOM.getElement(this._pageNumberCurrentSelector,n),o=this._DOM.getElement(this._pageNumberTotalSelector,n);this._DOM.setInnerHTML(e,t),this._DOM.setInnerHTML(o,i)}}_calculatePaperParams(){const e=this._createPageBodySpacer(),t=this._createPageHeader(this._headerTemplate),i=this._createPageFooter(this._footerTemplate),n=this._node.create(this._virtualPaperSelector);this._DOM.insertAtEnd(n,this.createVirtualTopMargin(),t,e,i,this.createVirtualBottomMargin());const o=this._node.create("#workbench");this._DOM.setStyles(o,{position:"absolute",left:"-3000px"}),this._DOM.insertAtEnd(o,n),this._DOM.insertAtStart(this._DOM.body,o);const r=this._DOM.getElementBCR(n).height,s=this._DOM.getElementOffsetHeight(t)||0,l=this._DOM.getElementOffsetHeight(i)||0,a=this._DOM.getElementOffsetHeight(e),h=this._DOM.getElementOffsetWidth(e),c=this._createFrontpageContent(this._frontpageTemplate);this._DOM.insertAtStart(e,c);const g=this._DOM.getElementOffsetHeight(e),d=g>a?a/g:1;this._DOM.removeNode(o),s>.2*r&&console.warn("It seems that your custom header is too high"),l>.15*r&&console.warn("It seems that your custom footer is too high"),d<1&&console.warn("It seems that your frontpage content is too large. We made it smaller to fit on the page. Check out how it looks! It might make sense to fix this with styles or reduce the text amount."),this._paperHeight=r,this.headerHeight=s,this.footerHeight=l,this.bodyHeight=a,this.bodyWidth=h,this._frontpageFactor=d}}class un{constructor({config:e,DOM:t,selector:n,node:o,pages:r,layout:s,paper:l}){this._config=e,this._debug=e.debugMode?{...e.debugConfig.preview}:{},this._assert=!!e.consoleAssert,Object.assign(this,i),this._DOM=t,this._selector=n,this._node=o,this._virtualPaperGapSelector=n.virtualPaperGap,this._runningSafetySelector=n.runningSafety,this._printPageBreakSelector=n.printPageBreak,this._pageDivider=n.pageDivider,this._virtualPaper=n.virtualPaper,this._virtualPaperTopMargin=n.virtualPaperTopMargin,this._pageBodySpacer=n.pageBodySpacer,this._pages=r,this._root=s.root,this._contentFlow=s.contentFlow,this._paperFlow=s.paperFlow,this._overlayFlow=s.overlayFlow,this._paper=l,this._hasFrontPage=!!s.frontpageTemplate}create(){this._processFrontPage(),this._processPages(),(!0===this._config.mask||"true"===this._config.mask)&&this._addMask(),this._makeRootVisible()}_addMask(){const e=parseInt(this._config.virtualPagesGap),t=parseInt(this._config.paperHeight),i=parseInt(this._config.printTopMargin),n=parseInt(this._config.printBottomMargin),o=parseInt(this._config.headerMargin),r=parseInt(this._config.footerMargin),s=this._paper.headerHeight,l=this._paper.footerHeight,a=this._paper.bodyHeight,h=s?Math.ceil(o/2):0,c=l?Math.ceil(r/2):0,g=s-h,d=l-c,p=a+h+c,u=i+g,_=t+e;this.strictAssert(t===p+g+i+d+n,"Paper size calculation params do not match");const f=function({maskStep:e,maskWindow:t,maskFirstShift:i}){return`\n -webkit-mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n mask-image: linear-gradient(\n black 0,\n black ${t}px,\n transparent ${t}px,\n transparent ${e}px\n );\n -webkit-mask-repeat: no-repeat;\n mask-repeat: no-repeat;\n -webkit-mask-size: 100% ${e}px;\n mask-size: 100% ${e}px;\n -webkit-mask-position: 100% ${i}px;\n mask-position: 100% ${i}px;\n -webkit-mask-repeat: repeat-y;\n mask-repeat: repeat-y;\n -webkit-mask-origin: border-box;\n mask-origin: border-box;\n `}({maskFirstShift:u,maskStep:_,maskWindow:p}),m=`\n @media screen {\n ${this._selector.contentFlow} {\n ${f}\n }\n }\n @media print {\n ${this._selector.root}::after {\n /* Safety placeholder for the bottom margin of the paper.\n Remove if the margins at the bottom of the page are replaced with padding.\n Placed under the footer.\n */\n --paper-color: ${this._config.paperColor};\n background: var(--paper-color, white);\n content: '';\n position: fixed;\n pointer-events: none;\n z-index: 11;\n inset: 0;\n top: unset;\n height: ${n+l}px;\n }\n }`;this._node.insertStyle(m,"mask")}_makeRootVisible(){this._DOM.setStyles(this._root,{visibility:"visible"})}_processFrontPage(){if(this._hasFrontPage){const e=this._paper.createFrontpage();this._DOM.insertAtStart(this._contentFlow,e),this._pages.unshift({pageStart:e})}}_processPages(){for(let e=0;e0&&this._debug._&&console.warn(`[preview] There is no page end element before ${e}. Perhaps it's a 'beginningTail'.`),t?this._DOM.setStyles(t,{"margin-top":["0","important"]}):this.strictAssert(0,"[preview] [_preventPageOverflow] current page First Element do not pass! page:",e)}_createPageBreaker(e,t){const i=this._node.create(this._pageDivider);return this._DOM.setAttribute(i,"[page]",`${e+1}`),t&&this._paper.footerHeight&&this._DOM.setStyles(i,{marginTop:this._paper.footerHeight+"px"}),this._paper.headerHeight&&this._DOM.setStyles(i,{paddingBottom:this._paper.headerHeight+"px"}),i}_updatePageStartElementAttrValue(e,t){this._hasFrontPage&&this._node.markPageStartElement(e,`${t+1}`)}_insertPaper(e,t,i){i?this._DOM.insertAtEnd(e,i,t):this._DOM.insertAtEnd(e,t)}_createVirtualPaperGap(){return this._node.create(this._virtualPaperGapSelector)}_createVirtualPaperTopMargin(){return this._paper.createVirtualTopMargin()}_createVirtualPaperBottomMargin(){return this._paper.createVirtualBottomMargin()}_insertFrontpageSpacer(e,t){const i=this._node.create();return this._DOM.setStyles(i,{paddingBottom:t+"px"}),this._DOM.setAttribute(i,".printFrontpageSpacer"),this._DOM.insertAtStart(e,i),i}_insertHeaderSpacer(e,t){const i=this._DOM.createDocumentFragment(),n=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(i,this._createVirtualPaperTopMargin(),n),this._DOM.insertAtEnd(e,i)}_insertFooterSpacer({target:e,footerHeight:t,pageSeparator:i,paperSeparator:n,pageIndex:o}){const r=this._DOM.createDocumentFragment(),s=this._createVirtualPaperGap(),l=this._node.create(this._runningSafetySelector);this._DOM.insertAtEnd(r,l,this._createVirtualPaperBottomMargin(),this._node.create(this._printPageBreakSelector),s),this._DOM.insertAtStart(e,r),this._balanceFooter({balancingFooter:l,contentSeparator:s,pageSeparator:i,paperSeparator:n,pageIndex:o})}_balanceFooter({balancingFooter:e,contentSeparator:t,pageSeparator:i,paperSeparator:n,pageIndex:o}){const r=this._node.getTop(i,this._root),s=this._node.getTop(n,this._root),l=this._node.getTop(t,this._root);this.strictAssert(s==r,"balancers in paper layers are misaligned",{pageIndex:o,balancingFooter:e,contentSeparator:t,pageSeparator:i,paperSeparator:n});const a=r-l;this._debug._&&console.log({balancingFooter:e,contentSeparatorTop:l,paperSeparatorTop:s,pageSeparatorTop:r}),this._DOM.setStyles(e,{"margin-bottom":a+"px"}),this.strictAssert(a>=0,`[pages: ${o}-${o+1}] balancer is negative: ${a} < 0`,t)}}class _n{constructor({config:e,DOM:t,selector:i,node:n,layout:o}){this._globalDebugMode=e.debugMode,this._debug=e.debugMode?{...e.debugConfig.toc}:{},this._assert=!!e.consoleAssert,this._DOM=t,this._node=n,this._tocPageNumberSelector=e.tocPageNumberSelector,this._root=o.root,this._contentFlow=o.contentFlow,this._pageDividerSelector=i.pageDivider}render(){this._globalDebugMode&&console.time("Processing TOC"),this._debug._&&console.log(`\nšŸ“‘ TOC: I am here!\n\ntocPageNumberSelector:\n • ${this._tocPageNumberSelector}\n pageDividerSelector:\n • ${this._pageDividerSelector}\n `);const e=this._DOM.getAll(this._tocPageNumberSelector,this._contentFlow);if(this._debug._&&console.log("šŸ“‘ tocPageNumberBoxes",e.length),!e.length)return void(this._debug._&&console.log("šŸ“‘ no valid toc"));const t=this._DOM.getAll(this._pageDividerSelector,this._contentFlow).reduce(((e,t,i)=>{const n=this._node.getTop(t,this._root)-1,o=this._DOM.getAttribute(t,"[page]");return e[n]=o,e}),{});this._debug._&&console.log("šŸ“‘ dataFromPagesMarkers",t);const i=e.reduce(((e,t)=>{const i=this._DOM.getDataId(t),n=this._DOM.getElementById(i),o=this._node.getTop(n,this._root);return e[o]={box:t,id:i,targetTop:o},e}),{});this._debug._&&console.log("šŸ“‘ dataFromTOC",i);const n={...t,...i};let o=0;this._debug._&&console.groupCollapsed("Processing obj");for(const e in n){const t=n[e];this._debug._&&console.log(`Processing ${e}: ${t}`),"string"==typeof t?o=t:(t.page=o,this._DOM.setInnerHTML(t.box,o))}this._debug._&&console.groupEnd("Processing obj"),this._debug._&&console.log("šŸ“‘ tocObject",n),this._globalDebugMode&&console.timeEnd("Processing TOC")}}class fn{constructor({config:e,DOM:t,selector:n,node:o,layout:r}){this._config=e,this._selector=n,this._DOM=t,this._node=o,this._layout=r,this._root=r.root,this._assert=!!e.consoleAssert,Object.assign(this,i)}init(){this._config.debugMode&&console.log("šŸ™ i am Validator!");const e=`${this._selector.paperFlow} ${this._selector.virtualPaperGap}`,t=`${this._selector.contentFlow} ${this._selector.virtualPaperGap}`,i=[...this._DOM.getAllElements(e)],n=[...this._DOM.getAllElements(t)],o=i.map((e=>this._node.getTop(e))),r=n.map((e=>this._node.getTop(e,this._root))),s=o.reduce(((e,t,i)=>(t!==r[i]&&e.push(i+1),e)),[]);this.strictAssert(!s.length,"Problems with preview generation on the following pages: ",s)}}const mn="border:1px dashed #cccccc;background:#ffffff;color:#cccccc;";class bn{constructor(e){this._debugMode=e.debugMode,this._preloader,this._preloaderTarget=this._resolveTarget(e)||document.body,this._preloaderBackground=e.preloaderBackground||"white"}create(){this._debugMode&&console.groupCollapsed("%c Preloader ",mn),this._insertStyle(),this._preloader=document.createElement("div"),this._preloader.classList.add("lds-dual-ring"),this._preloaderTarget.append(this._preloader),this._debugMode&&console.groupEnd("%c Preloader ",mn)}remove(){if(!this._preloader)return;let e=1;const t=setInterval((()=>{e<=.1&&(clearInterval(t),this._preloader.remove()),this._preloader.style.opacity=e,e-=.1*e}),50);this._debugMode&&console.log("%c Preloader removed ",mn)}_insertStyle(){const e=document.querySelector("head"),t=document.createElement("style");t.append(document.createTextNode(this._css())),t.setAttribute("data-preloader-style",""),e.append(t)}_css(){return`\n /* PRELOADER */\n .lds-dual-ring {\n position: absolute;\n z-index: 99999;\n top: 0; left: 0; bottom: 0; right: 0;\n background: ${this._preloaderBackground};\n display: flex;\n justify-content: center;\n align-items: center;\n }\n /*\n .lds-dual-ring:after {\n content: " ";\n display: block;\n width: 64px;\n height: 64px;\n margin: 8px;\n border-radius: 50%;\n border: 6px solid #eee;\n border-color: #eee transparent #eee transparent;\n animation: lds-dual-ring 1.2s linear infinite;\n }\n @keyframes lds-dual-ring {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n }\n */\n `}_resolveTarget(e){const t=(e.preloaderTarget||"").trim();return t&&document.querySelector(t)}}class wn{constructor(e){this._debugMode=e.debugMode}run(){let e=[...document.querySelectorAll("object")];this._debugMode&&console.log(e);let t=[];return e.forEach((e=>{const i=new Promise((t=>{e.addEventListener("load",(i=>{this._debugMode&&console.log("ā° EVENT: object load",e.clientHeight,e.clientWidth,e),t()}))}));t.push(i)})),Promise.all(t)}}const Sn=e=>!0===e||"true"===e;function Mn(e){const t=Array.isArray(e)?[]:{};return Object.entries(e).forEach((([e,i])=>{t[e]=!i||"object"!=typeof i||Mn(i)})),t}const Pn={DOM:{_:!1},layout:{_:!1},pages:{_:!1,_parseNode:!1,_parseNodes:!1,_registerPageStart:!1},paper:{_:!1},preview:{_:!1},toc:{_:!1},node:{_:!1,children:!1,creators:!1,flowFilters:!1,fitters:!1,getters:!1,markers:!1,pageBreaks:!1,positioning:!1,selectors:!1,slicers:!1,splitters:!1,wrappers:!1,pagination:!1},paragraph:{_:!1},grid:{_:!1},pre:{_:!1},table:{_:!1},tableLike:{_:!1},testSignals:{forcedModeLog:!1}};function Cn(e){const t=function(e){let t={debugMode:!1,forcedDebugMode:!1,consoleAssert:!1,markupDebugMode:!1,preloader:!1,preloaderTarget:"",preloaderBackground:"",mask:!0,noHangingSelectors:"",forcedPageBreakSelectors:"",pageBreakBeforeSelectors:"",pageBreakAfterSelectors:"",noBreakSelectors:"",tocPageNumberSelector:"html2pdf-toc-page-number",printLeftMargin:"21mm",printRightMargin:"21mm",printTopMargin:"12mm",printBottomMargin:"12mm",printFontSize:"12pt",paperColor:"white",paperWidth:"210mm",paperHeight:"297mm",headerMargin:"16px",footerMargin:"16px",virtualPagesGap:"16px",splitLabelHeight:"24px"};const i={paperWidth:"210mm",paperHeight:"297mm"},n={paperWidth:"148.5mm",paperHeight:"210mm"};switch((e=function(e){const t={...e};for(const e in t){const i=t[e];if("string"==typeof i){const n=i.toLowerCase();"true"===n||"1"===n?t[e]=!0:"false"!==n&&"0"!==n&&""!==n||(t[e]=!1)}}return t}(e)).printPaperSize){case"A5":case"a5":t={...t,...n};break;default:t={...t,...i}}t={...t,initialRoot:T.init,tocPageNumberSelector:T.tocPageNumber,...e},console.info("[HTML2PDF4DOC] Config:",t);const o={printLeftMargin:t.printLeftMargin,printRightMargin:t.printRightMargin,printTopMargin:t.printTopMargin,printBottomMargin:t.printBottomMargin,printFontSize:t.printFontSize,paperWidth:t.paperWidth,paperHeight:t.paperHeight,headerMargin:t.headerMargin,footerMargin:t.footerMargin,virtualPagesGap:t.virtualPagesGap},r=document.createElement("div");return r.style="\n position:absolute;\n z-index:1000;\n left: 200%;\n ",document.body.append(r),Object.entries(o).forEach((([e,t])=>{r.style.width=t,o[e]=`${Math.trunc(r.getBoundingClientRect().width)}px`})),r.remove(),t={...t,...o},t.noHangingSelectors=t.noHangingSelectors+" H1 H2 H3 H4 H5 H6",t.forcedPageBreakSelectors=t.forcedPageBreakSelectors+" "+T.printForcedPageBreak,t.debugMode&&console.info("Config with converted units:",t),t}(e);t.forcedDebugMode&&(t.debugMode=!0,t.consoleAssert=!0,t.markupDebugMode=!0);const i=t.forcedDebugMode?Mn(Pn):Pn;return{...t,debugConfig:i}}const yn="color:Gray;border:1px solid;";console.info("[HTML2PDF4DOC] Version:","0.3.0");const On=document.currentScript.dataset,Tn=new class{constructor(e){this.params=function(e={}){const t={...e};return[["printWidth","paperWidth"],["printHeight","paperHeight"]].forEach((([e,i])=>{Object.prototype.hasOwnProperty.call(t,e)&&(console.warn(`[HTML2PDF4DOC] Config option "${e}" is deprecated. Use "${i}" instead.`),Object.prototype.hasOwnProperty.call(t,i)||(t[i]=t[e]),delete t[e])})),t}(e),this.forcedDebugMode=Sn(e.forcedDebugMode),this.debugMode=Sn(e.debugMode)||this.forcedDebugMode,this.preloader=e.preloader,this.selector=T,this.config}async render(){console.time("[HTML2PDF4DOC] Total time"),this.debugMode&&console.log("šŸ document.readyState",document.readyState),document.addEventListener("readystatechange",(e=>{this.debugMode&&console.log("šŸ readystatechange",document.readyState)})),this.debugMode&&console.time("ā±ļø await DOMContentLoaded time"),await new Promise((e=>{window.addEventListener("DOMContentLoaded",(t=>{this.debugMode&&console.log("ā° EVENT: DOMContentLoaded"),e()}))})),this.debugMode&&console.timeEnd("ā±ļø await DOMContentLoaded time"),this.debugMode&&console.time("ā±ļø create Preloader time");const e=new bn(this.params);"true"===this.preloader&&e.create(),this.debugMode&&console.timeEnd("ā±ļø create Preloader time"),this.debugMode&&console.time("ā±ļø Config time"),this.debugMode&&console.groupCollapsed("%c config ",yn+"color:LightGray"),this.config=Cn(this.params),this.debugMode&&console.groupEnd(),this.debugMode&&console.info("āš™ļø Current config with debugConfig:",this.config),this.debugMode&&console.timeEnd("ā±ļø Config time"),this.config.debugConfig.testSignals.forcedModeLog&&console.info("[HTML2PDF4DOC] šŸ› ļø Forced debug mode is active."),this.config.consoleAssert&&console.info("[HTML2PDF4DOC] 🧧 Assertions enabled."),this.debugMode&&console.time("ā±ļø DOM helpers init time");const t=new F({DOM:window.document,config:this.config});this.debugMode&&console.timeEnd("ā±ļø DOM helpers init time"),this.debugMode&&console.time("ā±ļø node helpers init time");const i=new sn({config:this.config,DOM:t,selector:this.selector});this.debugMode&&console.timeEnd("ā±ļø node helpers init time"),this.debugMode&&console.time("ā±ļø await window load time"),await new Promise((e=>{window.addEventListener("load",(t=>{this.debugMode&&console.log("ā° EVENT: window load"),e()}))})),this.debugMode&&console.timeEnd("ā±ļø await window load time"),this.debugMode&&console.time("ā±ļø Layout time"),this.debugMode&&console.groupCollapsed("%c Layout ",yn);const n=new k({config:this.config,DOM:t,selector:this.selector,node:i});if(n.create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Layout time"),!n.success)return void(this.debugMode&&console.error("Failed to create layout.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.info("%c calculate Paper params ",yn),this.debugMode&&console.time("ā±ļø Paper time");const o=new pn({config:this.config,DOM:t,selector:this.selector,node:i,layout:n});if(this.debugMode&&console.timeEnd("ā±ļø Paper time"),!o||!o.bodyHeight||!o.bodyWidth)return void(this.debugMode&&console.error("Failed to create paper calculations.\n\nWe have to interrupt the process of creating PDF preview."));this.debugMode&&console.time("ā±ļø Preprocess time"),this.debugMode&&console.groupCollapsed("%c Preprocess ",yn),await new wn(this.config).run(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Preprocess time"),this.debugMode&&console.time("ā±ļø Pages time"),this.debugMode&&console.group("%c Pages ",yn);const r=new dn({config:this.config,DOM:t,selector:this.selector,node:i,layout:n,referenceHeight:o.bodyHeight,referenceWidth:o.bodyWidth}).calculate();this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Pages time"),this.debugMode&&console.time("ā±ļø Preview time"),this.debugMode&&console.groupCollapsed("%c Preview ",yn),new un({config:this.config,DOM:t,selector:this.selector,node:i,layout:n,paper:o,pages:r}).create(),this.debugMode&&console.groupEnd(),this.debugMode&&console.timeEnd("ā±ļø Preview time"),this.debugMode&&console.time("ā±ļø Toc time"),new _n({config:this.config,DOM:t,selector:this.selector,node:i,layout:n}).render(),this.debugMode&&console.timeEnd("ā±ļø Toc time"),this.debugMode&&console.time("ā±ļø Validator time"),new fn({config:this.config,DOM:t,selector:this.selector,node:i,layout:n}).init(),this.debugMode&&console.timeEnd("ā±ļø Validator time"),t.setAttribute(n.root,"[success]"),t.setAttribute(n.root,"[pages]",r.length),e.remove(),console.info("[HTML2PDF4DOC] Page count:",r.length),console.timeEnd("[HTML2PDF4DOC] Total time")}}(On),En="manual"===On.init;function Dn(){En&&Tn.render()}En&&console.info("HTML2PDF4DOC in manual initialization mode"),!En&&Tn.render(),HTML2PDF4DOC=t})(); \ No newline at end of file diff --git a/submodules/html2pdf b/submodules/html2pdf index db03a4b..51527ae 160000 --- a/submodules/html2pdf +++ b/submodules/html2pdf @@ -1 +1 @@ -Subproject commit db03a4b77ddcad7839ad4fb1f1c6ea777f0f4fb9 +Subproject commit 51527ae256c789b429e9b90f68da13d5fd184458