textmode.export.js 1.6.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.md +88 -159
  2. package/dist/textmode.export.esm.js +1 -6090
  3. package/dist/textmode.export.umd.js +1 -68
  4. package/dist/types/augmentations/index.d.ts +0 -1
  5. package/dist/types/augmentations/textmode.d.ts +0 -1
  6. package/dist/types/exporters/base/CharacterResolver.d.ts +0 -1
  7. package/dist/types/exporters/base/DataExtractor.d.ts +0 -1
  8. package/dist/types/exporters/base/FileHandler.d.ts +0 -1
  9. package/dist/types/exporters/base/FramePreparation.d.ts +10 -0
  10. package/dist/types/exporters/base/LayerTarget.d.ts +4 -3
  11. package/dist/types/exporters/base/index.d.ts +1 -1
  12. package/dist/types/exporters/gif/GIFEncoderWorker.d.ts +1 -0
  13. package/dist/types/exporters/gif/GIFExporter.d.ts +7 -26
  14. package/dist/types/exporters/gif/GIFRecorder.d.ts +2 -3
  15. package/dist/types/exporters/gif/GIFWorkerClient.d.ts +15 -0
  16. package/dist/types/exporters/gif/index.d.ts +0 -1
  17. package/dist/types/exporters/gif/types.d.ts +19 -1
  18. package/dist/types/exporters/image/ImageExporter.d.ts +2 -1
  19. package/dist/types/exporters/image/index.d.ts +0 -1
  20. package/dist/types/exporters/image/types.d.ts +2 -1
  21. package/dist/types/exporters/json/JSONDataExtractor.d.ts +0 -1
  22. package/dist/types/exporters/json/JSONExporter.d.ts +0 -1
  23. package/dist/types/exporters/json/index.d.ts +0 -1
  24. package/dist/types/exporters/json/types.d.ts +8 -1
  25. package/dist/types/exporters/svg/SVGContentGenerator.d.ts +0 -1
  26. package/dist/types/exporters/svg/SVGDataExtractor.d.ts +0 -1
  27. package/dist/types/exporters/svg/SVGExporter.d.ts +0 -1
  28. package/dist/types/exporters/svg/SVGPathGenerator.d.ts +0 -1
  29. package/dist/types/exporters/svg/index.d.ts +0 -1
  30. package/dist/types/exporters/svg/types.d.ts +2 -1
  31. package/dist/types/exporters/txt/TXTExporter.d.ts +0 -1
  32. package/dist/types/exporters/txt/index.d.ts +0 -1
  33. package/dist/types/exporters/txt/types.d.ts +2 -1
  34. package/dist/types/exporters/video/VideoExporter.d.ts +4 -4
  35. package/dist/types/exporters/video/VideoFrameDriver.d.ts +3 -3
  36. package/dist/types/exporters/video/VideoRecorder.d.ts +0 -1
  37. package/dist/types/exporters/video/errors.d.ts +0 -1
  38. package/dist/types/exporters/video/index.d.ts +0 -1
  39. package/dist/types/exporters/video/types.d.ts +34 -6
  40. package/dist/types/exporters/video/withAbortableTimeout.d.ts +0 -1
  41. package/dist/types/index.d.ts +15 -31
  42. package/dist/types/overlay/blades/Blade.d.ts +0 -1
  43. package/dist/types/overlay/blades/GIFBlade.d.ts +0 -1
  44. package/dist/types/overlay/blades/ImageBlade.d.ts +0 -1
  45. package/dist/types/overlay/blades/JSONBlade.d.ts +0 -1
  46. package/dist/types/overlay/blades/RecordingBlade.d.ts +0 -1
  47. package/dist/types/overlay/blades/SVGBlade.d.ts +0 -1
  48. package/dist/types/overlay/blades/TextBlade.d.ts +0 -1
  49. package/dist/types/overlay/blades/VideoBlade.d.ts +0 -1
  50. package/dist/types/overlay/blades/index.d.ts +0 -1
  51. package/dist/types/overlay/components/actions/Button.d.ts +0 -1
  52. package/dist/types/overlay/components/base/Component.d.ts +0 -1
  53. package/dist/types/overlay/components/base/Container.d.ts +0 -1
  54. package/dist/types/overlay/components/base/Field.d.ts +0 -1
  55. package/dist/types/overlay/components/display/Header.d.ts +0 -1
  56. package/dist/types/overlay/components/display/StatusDisplay.d.ts +0 -1
  57. package/dist/types/overlay/components/inputs/CheckboxInput.d.ts +0 -1
  58. package/dist/types/overlay/components/inputs/LayerTargetSelect.d.ts +0 -1
  59. package/dist/types/overlay/components/inputs/NumberInput.d.ts +0 -1
  60. package/dist/types/overlay/components/inputs/SelectInput.d.ts +0 -1
  61. package/dist/types/overlay/components/inputs/TextInput.d.ts +0 -1
  62. package/dist/types/overlay/config/DefaultsStore.d.ts +0 -1
  63. package/dist/types/overlay/config/ExportDefaults.d.ts +0 -1
  64. package/dist/types/overlay/core/EventBus.d.ts +0 -1
  65. package/dist/types/overlay/core/OverlayController.d.ts +0 -1
  66. package/dist/types/overlay/core/StateManager.d.ts +0 -1
  67. package/dist/types/overlay/formatRegistry.d.ts +0 -1
  68. package/dist/types/overlay/index.d.ts +0 -1
  69. package/dist/types/overlay/models/FormatDefinition.d.ts +0 -1
  70. package/dist/types/overlay/models/OverlayEvents.d.ts +0 -1
  71. package/dist/types/overlay/models/OverlayState.d.ts +0 -1
  72. package/dist/types/overlay/services/ClipboardService.d.ts +0 -1
  73. package/dist/types/overlay/services/ExportService.d.ts +0 -1
  74. package/dist/types/overlay/services/OverlayPositionStorage.d.ts +0 -1
  75. package/dist/types/overlay/services/PositionService.d.ts +0 -1
  76. package/dist/types/overlay/types.d.ts +0 -1
  77. package/dist/types/overlay/utils/classes.d.ts +0 -1
  78. package/dist/types/types.d.ts +109 -23
  79. package/dist/types/utils/pixels.d.ts +0 -1
  80. package/package.json +47 -61
  81. package/dist/types/augmentations/index.d.ts.map +0 -1
  82. package/dist/types/augmentations/textmode.d.ts.map +0 -1
  83. package/dist/types/augmentations/textmode.test.d.ts +0 -2
  84. package/dist/types/augmentations/textmode.test.d.ts.map +0 -1
  85. package/dist/types/exporters/base/CharacterResolver.d.ts.map +0 -1
  86. package/dist/types/exporters/base/DataExtractor.d.ts.map +0 -1
  87. package/dist/types/exporters/base/FileHandler.d.ts.map +0 -1
  88. package/dist/types/exporters/base/LayerTarget.d.ts.map +0 -1
  89. package/dist/types/exporters/base/index.d.ts.map +0 -1
  90. package/dist/types/exporters/gif/GIFExporter.d.ts.map +0 -1
  91. package/dist/types/exporters/gif/GIFRecorder.d.ts.map +0 -1
  92. package/dist/types/exporters/gif/index.d.ts.map +0 -1
  93. package/dist/types/exporters/gif/types.d.ts.map +0 -1
  94. package/dist/types/exporters/image/ImageExporter.d.ts.map +0 -1
  95. package/dist/types/exporters/image/index.d.ts.map +0 -1
  96. package/dist/types/exporters/image/types.d.ts.map +0 -1
  97. package/dist/types/exporters/json/JSONDataExtractor.d.ts.map +0 -1
  98. package/dist/types/exporters/json/JSONExporter.d.ts.map +0 -1
  99. package/dist/types/exporters/json/JSONExporter.test.d.ts +0 -2
  100. package/dist/types/exporters/json/JSONExporter.test.d.ts.map +0 -1
  101. package/dist/types/exporters/json/index.d.ts.map +0 -1
  102. package/dist/types/exporters/json/types.d.ts.map +0 -1
  103. package/dist/types/exporters/svg/SVGContentGenerator.d.ts.map +0 -1
  104. package/dist/types/exporters/svg/SVGDataExtractor.d.ts.map +0 -1
  105. package/dist/types/exporters/svg/SVGExporter.d.ts.map +0 -1
  106. package/dist/types/exporters/svg/SVGExporter.test.d.ts +0 -2
  107. package/dist/types/exporters/svg/SVGExporter.test.d.ts.map +0 -1
  108. package/dist/types/exporters/svg/SVGPathGenerator.d.ts.map +0 -1
  109. package/dist/types/exporters/svg/index.d.ts.map +0 -1
  110. package/dist/types/exporters/svg/types.d.ts.map +0 -1
  111. package/dist/types/exporters/txt/TXTExporter.d.ts.map +0 -1
  112. package/dist/types/exporters/txt/TXTExporter.test.d.ts +0 -2
  113. package/dist/types/exporters/txt/TXTExporter.test.d.ts.map +0 -1
  114. package/dist/types/exporters/txt/index.d.ts.map +0 -1
  115. package/dist/types/exporters/txt/types.d.ts.map +0 -1
  116. package/dist/types/exporters/video/VideoExporter.d.ts.map +0 -1
  117. package/dist/types/exporters/video/VideoExporter.test.d.ts +0 -2
  118. package/dist/types/exporters/video/VideoExporter.test.d.ts.map +0 -1
  119. package/dist/types/exporters/video/VideoFrameDriver.d.ts.map +0 -1
  120. package/dist/types/exporters/video/VideoFrameDriver.test.d.ts +0 -2
  121. package/dist/types/exporters/video/VideoFrameDriver.test.d.ts.map +0 -1
  122. package/dist/types/exporters/video/VideoRecorder.d.ts.map +0 -1
  123. package/dist/types/exporters/video/VideoRecorder.test.d.ts +0 -2
  124. package/dist/types/exporters/video/VideoRecorder.test.d.ts.map +0 -1
  125. package/dist/types/exporters/video/errors.d.ts.map +0 -1
  126. package/dist/types/exporters/video/index.d.ts.map +0 -1
  127. package/dist/types/exporters/video/types.d.ts.map +0 -1
  128. package/dist/types/exporters/video/withAbortableTimeout.d.ts.map +0 -1
  129. package/dist/types/index.d.ts.map +0 -1
  130. package/dist/types/overlay/blades/Blade.d.ts.map +0 -1
  131. package/dist/types/overlay/blades/GIFBlade.d.ts.map +0 -1
  132. package/dist/types/overlay/blades/ImageBlade.d.ts.map +0 -1
  133. package/dist/types/overlay/blades/JSONBlade.d.ts.map +0 -1
  134. package/dist/types/overlay/blades/RecordingBlade.d.ts.map +0 -1
  135. package/dist/types/overlay/blades/SVGBlade.d.ts.map +0 -1
  136. package/dist/types/overlay/blades/TextBlade.d.ts.map +0 -1
  137. package/dist/types/overlay/blades/VideoBlade.d.ts.map +0 -1
  138. package/dist/types/overlay/blades/index.d.ts.map +0 -1
  139. package/dist/types/overlay/components/actions/Button.d.ts.map +0 -1
  140. package/dist/types/overlay/components/base/Component.d.ts.map +0 -1
  141. package/dist/types/overlay/components/base/Container.d.ts.map +0 -1
  142. package/dist/types/overlay/components/base/Field.d.ts.map +0 -1
  143. package/dist/types/overlay/components/display/Header.d.ts.map +0 -1
  144. package/dist/types/overlay/components/display/StatusDisplay.d.ts.map +0 -1
  145. package/dist/types/overlay/components/inputs/CheckboxInput.d.ts.map +0 -1
  146. package/dist/types/overlay/components/inputs/LayerTargetSelect.d.ts.map +0 -1
  147. package/dist/types/overlay/components/inputs/NumberInput.d.ts.map +0 -1
  148. package/dist/types/overlay/components/inputs/RangeInput.d.ts +0 -35
  149. package/dist/types/overlay/components/inputs/RangeInput.d.ts.map +0 -1
  150. package/dist/types/overlay/components/inputs/SelectInput.d.ts.map +0 -1
  151. package/dist/types/overlay/components/inputs/TextInput.d.ts.map +0 -1
  152. package/dist/types/overlay/config/DefaultsStore.d.ts.map +0 -1
  153. package/dist/types/overlay/config/DefaultsStore.test.d.ts +0 -2
  154. package/dist/types/overlay/config/DefaultsStore.test.d.ts.map +0 -1
  155. package/dist/types/overlay/config/ExportDefaults.d.ts.map +0 -1
  156. package/dist/types/overlay/config/ExportDefaults.test.d.ts +0 -2
  157. package/dist/types/overlay/config/ExportDefaults.test.d.ts.map +0 -1
  158. package/dist/types/overlay/core/EventBus.d.ts.map +0 -1
  159. package/dist/types/overlay/core/OverlayController.d.ts.map +0 -1
  160. package/dist/types/overlay/core/OverlayController.test.d.ts +0 -2
  161. package/dist/types/overlay/core/OverlayController.test.d.ts.map +0 -1
  162. package/dist/types/overlay/core/StateManager.d.ts.map +0 -1
  163. package/dist/types/overlay/formatRegistry.d.ts.map +0 -1
  164. package/dist/types/overlay/formatRegistry.test.d.ts +0 -2
  165. package/dist/types/overlay/formatRegistry.test.d.ts.map +0 -1
  166. package/dist/types/overlay/index.d.ts.map +0 -1
  167. package/dist/types/overlay/models/FormatDefinition.d.ts.map +0 -1
  168. package/dist/types/overlay/models/OverlayEvents.d.ts.map +0 -1
  169. package/dist/types/overlay/models/OverlayState.d.ts.map +0 -1
  170. package/dist/types/overlay/services/ClipboardService.d.ts.map +0 -1
  171. package/dist/types/overlay/services/ExportService.d.ts.map +0 -1
  172. package/dist/types/overlay/services/OverlayPositionStorage.d.ts.map +0 -1
  173. package/dist/types/overlay/services/PositionService.d.ts.map +0 -1
  174. package/dist/types/overlay/services/PositionService.test.d.ts +0 -2
  175. package/dist/types/overlay/services/PositionService.test.d.ts.map +0 -1
  176. package/dist/types/overlay/types.d.ts.map +0 -1
  177. package/dist/types/overlay/utils/classes.d.ts.map +0 -1
  178. package/dist/types/types.d.ts.map +0 -1
  179. package/dist/types/utils/pixels.d.ts.map +0 -1
  180. package/dist/types/version.d.ts +0 -2
  181. package/dist/types/version.d.ts.map +0 -1
@@ -1,68 +1 @@
1
- (function(ot,Y){typeof exports=="object"&&typeof module<"u"?Y(exports):typeof define=="function"&&define.amd?define(["exports"],Y):Y((ot=typeof globalThis<"u"?globalThis:ot||self).TextmodeExport={})})(this,function(ot){"use strict";var In=Object.defineProperty;var An=(ot,Y,nt)=>Y in ot?In(ot,Y,{enumerable:!0,configurable:!0,writable:!0,value:nt}):ot[Y]=nt;var g=(ot,Y,nt)=>An(ot,typeof Y!="symbol"?Y+"":Y,nt);class Y{$extractFramebufferData(t){return{characterPixels:t.readPixels(0),primaryColorPixels:t.readPixels(1),secondaryColorPixels:t.readPixels(2)}}$getEncodedCharacterValue(t,e){return t[e]+(t[e+1]<<8)}$getCharacterIndex(t,e){return this.$getEncodedCharacterValue(t,e)}$extractCellTransform(t,e){const r=t[e+2],a=t[e+3]/255;return{isInverted:!!(1&r),flipHorizontal:!!(2&r),flipVertical:!!(4&r),rotation:Math.round(360*a*100)/100}}}class nt{$downloadFile(t,e){try{const r=this._sanitizeFilename(e),a=URL.createObjectURL(t),s=document.createElement("a");s.href=a,s.download=r,s.style.display="none",s.rel="noopener",document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(a)}catch(r){console.error("[textmode-export] Failed to download file:",r)}}_sanitizeFilename(t){if(!t)return this._generateDefaultFilename();const e=t.trim();return e?e.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g,"_").replace(/_{2,}/g,"_").replace(/^_+|_+$/g,"").substring(0,255)||this._generateDefaultFilename():this._generateDefaultFilename()}_generateDefaultFilename(){return`textmode-export-${new Date().toISOString().slice(0,19).replace(/:/g,"-")}`}}const li=new WeakMap;function da(i){return Math.round(255*i[0])+(Math.round(255*i[1])<<8)}function ke(i,t){let e=li.get(i);if(!e){e=new Map;for(const r of i.characters)e.set(da(r.color),r);li.set(i,e)}return e.get(t)}function hi(i,t){const e=i==="base"?"Base layer":`Layer ${Number.parseInt(i.replace("layer-",""),10)}`;return t._visible===!1?`${e} (hidden)`:e}function ui(i){return[{id:"base",layer:i.layers.base},...i.layers.all.map((t,e)=>({id:`layer-${e+1}`,layer:t}))].map(({id:t,layer:e})=>({id:t,label:hi(t,e),layer:e}))}function ie(i,t){const e=t??i.layers.base,r=(function(n,l){if(l===n.layers.base)return"base";const c=n.layers.all.indexOf(l);if(c>=0)return`layer-${c+1}`;throw new Error("[textmode-export] Cannot export a layer that is not managed by this Textmodifier instance.")})(i,e),a=e.grid,s=e.font,o=e.drawFramebuffer;if(!a||!o)throw new Error("[textmode-export] Cannot export an uninitialized layer.");return{id:r,label:hi(r,e),layer:e,grid:a,font:s,drawFramebuffer:o}}function re(i,t){return{r:i[t],g:i[t+1],b:i[t+2],a:i[t+3]}}class la extends Y{_calculateCellPosition(t,e,r){return{x:t,y:e,cellX:t*r.cellWidth,cellY:e*r.cellHeight}}$extractSVGCellData(t,e){const r=[];let a=0;for(let s=0;s<e.rows;s++)for(let o=0;o<e.cols;o++){const n=4*a,l=this.$getEncodedCharacterValue(t.characterPixels,n);let c=re(t.primaryColorPixels,n),d=re(t.secondaryColorPixels,n);const h=this.$extractCellTransform(t.characterPixels,n);if(h.isInverted){const u=c;c=d,d=u}const m=this._calculateCellPosition(o,s,e);r.push({encodedGlyphSlot:l,primaryColor:c,secondaryColor:d,transform:h,position:m}),a++}return r}}class ha{_createGlyphPath(t,e,r,a,s){const o=s/t.head.unitsPerEm;return{getBoundingBox:()=>({x1:r+e.xMin*o,y1:a+-e.yMax*o,x2:r+e.xMax*o,y2:a+-e.yMin*o}),toSVG:()=>this._glyphToSVGPath(e,r,a,o)}}_glyphToSVGPath(t,e,r,a){if(!t||!t.xs)return"";const{xs:s,ys:o,endPts:n,flags:l}=t;if(!(s&&o&&n&&l))return"";let c="",d=0;for(let h=0;h<n.length;h++){const m=n[h];if(!(m<d)){if(m>=d){const u=e+s[d]*a,p=r-o[d]*a;c+=`M${u.toFixed(2)},${p.toFixed(2)}`;let f=d+1;for(;f<=m;)if(1&l[f]){const b=e+s[f]*a,y=r-o[f]*a;c+=`L${b.toFixed(2)},${y.toFixed(2)}`,f++}else{const b=e+s[f]*a,y=r-o[f]*a,_=f+1>m?d:f+1;if(1&l[_]){const T=e+s[_]*a,S=r-o[_]*a;c+=`Q${b.toFixed(2)},${y.toFixed(2)} ${T.toFixed(2)},${S.toFixed(2)}`,f=_+1}else{const T=(b+(e+s[_]*a))/2,S=(y+(r-o[_]*a))/2;c+=`Q${b.toFixed(2)},${y.toFixed(2)} ${T.toFixed(2)},${S.toFixed(2)}`,f=_}}c+="Z"}d=m+1}}return c}$generatePositionedCharacterPath(t,e,r,a,s,o,n,l){if(!l)return null;const c=e.font,d=n/c.head.unitsPerEm,h=r+(s-l.advanceWidth*d)/2,m=a+c.hhea.ascender*d;return this._createGlyphPath(c,l,h,m,n).toSVG()||null}}class ua{constructor(){g(this,"_pathGenerator");this._pathGenerator=new ha}$generateSVGHeader(t){const{width:e,height:r}=t;return`<?xml version="1.0" encoding="UTF-8"?><svg width="${e}" height="${r}" viewBox="0 0 ${e} ${r}" xmlns="http://www.w3.org/2000/svg"><title>textmode.js sketch</title>`}$generateSVGFooter(){return"</g></svg>"}_generateTransformAttribute(t,e){const{transform:r,position:a}=t;if(!r.flipHorizontal&&!r.flipVertical&&!r.rotation)return"";const s=a.cellX+e.cellWidth/2,o=a.cellY+e.cellHeight/2,n=[];if(r.flipHorizontal||r.flipVertical){const l=r.flipHorizontal?-1:1,c=r.flipVertical?-1:1;n.push(`translate(${s} ${o})scale(${l} ${c})translate(${-s} ${-o})`)}return r.rotation&&n.push(`rotate(${r.rotation} ${s} ${o})`),` transform="${n.join(" ")}"`}_generateCellBackground(t,e,r){if(!r.includeBackgroundRectangles||t.secondaryColor.a===0)return"";const{position:a}=t,{r:s,g:o,b:n,a:l}=t.secondaryColor,c=`rgba(${s},${o},${n},${l/255})`;return r.drawMode==="stroke"?`<rect x="${a.cellX}" y="${a.cellY}" width="${e.cellWidth}" height="${e.cellHeight}" stroke="${c}" fill="none" stroke-width="${r.strokeWidth}"/>`:`<rect x="${a.cellX}" y="${a.cellY}" width="${e.cellWidth}" height="${e.cellHeight}" fill="${c}"/>`}_generateCharacterPath(t,e,r,a){const s=ke(r,t.encodedGlyphSlot);if(!s)return"";const o=this._pathGenerator.$generatePositionedCharacterPath(s.character,r,t.position.cellX,t.position.cellY,e.cellWidth,e.cellHeight,r.fontSize,s.glyphData);if(!o)return"";const{r:n,g:l,b:c,a:d}=t.primaryColor,h=`rgba(${n},${l},${c},${d/255})`;return a.drawMode==="stroke"?`<path d="${o}" stroke="${h}" stroke-width="${a.strokeWidth}" fill="none"/>`:`<path d="${o}" fill="${h}"/>`}$generateCellContent(t,e,r,a){const s=[],o=this._generateCellBackground(t,e,a);o&&s.push(o);const n=this._generateCharacterPath(t,e,r,a);if(n){const l=this._generateTransformAttribute(t,e);s.push(l?`<g${l}>${n}</g>`:n)}return s.join("")}$generateSVGContent(t,e,r,a){const s=[this.$generateSVGHeader(e),'<g id="ascii-cells">'];for(const o of t)s.push(this.$generateCellContent(o,e,r,a));return s.push(this.$generateSVGFooter()),s.join("")}$optimizeSVGContent(t){return t.replace(/\s+/g," ").replace(/> </g,"><")}}class mi{_applyDefaultOptions(t){return{includeBackgroundRectangles:t.includeBackgroundRectangles??!0,drawMode:t.drawMode??"fill",strokeWidth:t.strokeWidth??1,filename:t.filename,layer:t.layer}}$generateSVG(t,e={}){const r=new la,a=new ua,s=this._applyDefaultOptions(e),o=ie(t,s.layer),n=r.$extractSVGCellData(r.$extractFramebufferData(o.drawFramebuffer),o.grid),l=a.$generateSVGContent(n,o.grid,o.font,s);return a.$optimizeSVGContent(l)}$saveSVG(t,e={}){new nt().$downloadFile(new Blob([this.$generateSVG(t,e)],{type:"image/svg+xml;charset=utf-8"}),e.filename)}}const Te={png:"image/png",jpg:"image/jpeg",webp:"image/webp"},ma=".png",pa=".jpg",fa=".webp";class pi{_applyDefaultOptions(t){return{format:t.format??"png",scale:Math.abs(t.scale??1),filename:t.filename}}_validateOptions(t){if(!(t.format in Te))throw new Error(`Saving '${t.format}' files is not supported`)}async $generateImageBlob(t,e){const r=t,a=document.createElement("canvas"),s=a.getContext("2d"),o=Math.round(r.width*e.scale),n=Math.round(r.height*e.scale);return a.width=o,a.height=n,s.imageSmoothingEnabled=!1,s.clearRect(0,0,o,n),s.drawImage(r,0,0,r.width,r.height,0,0,o,n),await new Promise((l,c)=>{a.toBlob(d=>{d?l(d):c(new Error(`Failed to generate ${e.format.toUpperCase()} blob`))},Te[e.format])})}async $saveImage(t,e={}){const r=this._applyDefaultOptions(e);this._validateOptions(r);const a=await this.$generateImageBlob(t,r);new nt().$downloadFile(a,r.filename)}async $copyImageToClipboard(t,e={}){if(typeof navigator>"u"||!navigator.clipboard||typeof navigator.clipboard.write!="function")throw new Error("Clipboard API is not available in this environment");const r=this._applyDefaultOptions(e);this._validateOptions(r);const a=await this.$generateImageBlob(t,r),s=new ClipboardItem({[Te[r.format]]:a});await navigator.clipboard.write([s])}}class fi{_applyDefaultOptions(t){return{preserveTrailingSpaces:t.preserveTrailingSpaces??!1,emptyCharacter:t.emptyCharacter??" ",filename:t.filename,layer:t.layer}}_createTXTContent(t,e){var l;const r=new Y,a=ie(t,e.layer),s=r.$extractFramebufferData(a.drawFramebuffer),o=[];let n=0;for(let c=0;c<a.grid.rows;c++){let d="";for(let h=0;h<a.grid.cols;h++){const m=4*n,u=r.$getEncodedCharacterValue(s.characterPixels,m);d+=((l=ke(a.font,u))==null?void 0:l.character)||e.emptyCharacter,n++}e.preserveTrailingSpaces||(d=d.trimEnd()),o.push(d)}return o.join(`
2
- `)}$generateTXT(t,e={}){return this._createTXTContent(t,this._applyDefaultOptions(e))}$saveTXT(t,e={}){const r=this._applyDefaultOptions(e),a=this._createTXTContent(t,r),s=new Blob([a],{type:"text/plain;charset=utf-8"});new nt().$downloadFile(s,r.filename)}}class ga{constructor(){g(this,"_canvas");g(this,"_ctx")}async $record(t,e,r,a){const s=Math.max(1,Math.round(e.frameRate)),o=Math.round(1e3/s),n=Math.max(1,Math.round(e.frameCount));return await new Promise((l,c)=>{const d=[];let h,m=0,u=!1;const p=()=>{h&&(h(),h=void 0)},f=y=>{u||(u=!0,p(),l(y))},b=()=>{if(m>=n)f(d);else try{const y=e.scale,_=Math.max(1,Math.round(t.width*y)),T=Math.max(1,Math.round(t.height*y));this._canvas||(this._canvas=document.createElement("canvas")),this._canvas.width===_&&this._canvas.height===T||(this._canvas.width=_,this._canvas.height=T),this._ctx||(this._ctx=this._canvas.getContext("2d"));const S=this._ctx;S.imageSmoothingEnabled=!1,S.clearRect(0,0,_,T),S.drawImage(t,0,0,t.width,t.height,0,0,_,T);const A={imageData:S.getImageData(0,0,_,T),width:_,height:T,delayMs:o};d.push(A),m+=1,a==null||a({state:"recording",frameIndex:m,totalFrames:n}),m>=n&&f(d)}catch(y){(_=>{if(u)return;u=!0,p();const T=_ instanceof Error?_.message:"GIF recording failed";a==null||a({state:"error",message:T}),c(_ instanceof Error?_:new Error(String(_)))})(y)}};h=r(()=>{b()}),a==null||a({state:"recording",frameIndex:0,totalFrames:n})})}}var gi,ae,wi=Object.defineProperty,wa=(gi=i=>{function t(h,m,u){return .29889531*h+.58662247*m+.11448223*u}function e(h,m,u){return .59597799*h-.2741761*m-.32180189*u}function r(h,m,u){return .21147017*h-.52261711*m+.31114694*u}function a(h,m){let u=h[0]-m[0],p=h[1]-m[1],f=h[2]-m[2],b=s(h)-s(m);return u*u*.5053+p*p*.299+f*f*.1957+b*b}function s(h){return h[3]!=null?h[3]:255}function o(h,m){return Math.sqrt(a(h,m))}function n(h,m){let[u,p,f]=h,[b,y,_]=m,T=t(u,p,f)-t(b,y,_),S=e(u,p,f)-e(b,y,_),A=r(u,p,f)-r(b,y,_),E=s(h)-s(m);return T*T*.5053+S*S*.299+A*A*.1957+E*E}function l(h,m){return Math.sqrt(n(h,m))}function c(h,m){var u,p=0;for(u=0;u<h.length;u++){let f=h[u]-m[u];p+=f*f}return p}function d(h,m){return Math.sqrt(c(h,m))}wi(i,"__esModule",{value:!0}),((h,m)=>{for(var u in m)wi(h,u,{get:m[u],enumerable:!0})})(i,{colorDifferenceRGBToYIQ:()=>l,colorDifferenceRGBToYIQSquared:()=>n,colorDifferenceYIQ:()=>o,colorDifferenceYIQSquared:()=>a,euclideanDistance:()=>d,euclideanDistanceSquared:()=>c})},()=>(ae||gi((ae={exports:{}}).exports,ae),ae.exports)),ba=59;function bi(i=256){let t=0,e=new Uint8Array(i);return{get buffer(){return e.buffer},reset(){t=0},bytesView:()=>e.subarray(0,t),bytes:()=>e.slice(0,t),writeByte(a){r(t+1),e[t]=a,t++},writeBytes(a,s=0,o=a.length){r(t+o);for(let n=0;n<o;n++)e[t++]=a[n+s]},writeBytesView(a,s=0,o=a.byteLength){r(t+o),e.set(a.subarray(s,s+o),t),t+=o}};function r(a){var s=e.length;if(s>=a)return;a=Math.max(a,s*(s<1048576?2:1.125)>>>0),s!=0&&(a=Math.max(a,256));let o=e;e=new Uint8Array(a),t>0&&e.set(o.subarray(0,t),0)}}var ya=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],va=function(i,t,e,r,a,s,o,n){a=a||bi(512),s=s||new Uint8Array(256),o=o||new Int32Array(5003),n=n||new Int32Array(5003);let l=o.length,c=Math.max(2,r);s.fill(0),n.fill(0),I();let d=0,h=0,m=c+1,u=m,p=!1,f=u,b=L(f),y=1<<m-1,_=y+1,T=y+2,S=0,A=e[0],E=0;for(let M=l;M<65536;M*=2)++E;E=8-E,a.writeByte(c),U(y);for(let M=1;M<e.length;M++)D(e[M]);return U(A),U(_),a.writeByte(0),a.bytesView();function C(M){s[S++]=M,S>=254&&V()}function I(){o.fill(-1)}function D(M){let j=(M<<12)+A,O=M<<E^A;if(o[O]===j)A=n[O];else{if(o[O]>=0){let Q=O===0?1:l-O;do if(O-=Q,O<0&&(O+=l),o[O]===j)return void(A=n[O]);while(o[O]>=0)}U(A),A=M,T<4096?(n[O]=T++,o[O]=j):(I(),T=y+2,p=!0,U(y))}}function V(){S>0&&(a.writeByte(S),a.writeBytesView(s,0,S),S=0)}function L(M){return(1<<M)-1}function U(M){for(d&=ya[h],h>0?d|=M<<h:d=M,h+=f;h>=8;)C(255&d),d>>=8,h-=8;if((T>b||p)&&(p?(f=u,b=L(f),p=!1):(++f,b=f==12?4096:L(f))),M==_){for(;h>0;)C(255&d),d>>=8,h-=8;V()}}};function yi(i,t,e){return i<<8&63488|t<<2&992|e>>3&31}function vi(i,t,e,r){return i>>4|240&t|(240&e)<<4|(240&r)<<8}function xi(i,t,e){return i>>4<<8|t>>4<<4|e>>4}function se(i,t,e){return i<t?t:i>e?e:i}function oe(i){return i*i}function _i(i,t,e){for(var r=0,a=1e100,s=i[t],o=s.cnt,n=(s.ac,s.rc),l=s.gc,c=s.bc,d=s.fw;d!=0;d=i[d].fw){var h=i[d].cnt,m=o*h/(o+h);if(!(m>=a)){var u=0;!((u+=m*oe(i[d].rc-n))>=a)&&!((u+=m*oe(i[d].gc-l))>=a)&&!((u+=m*oe(i[d].bc-c))>=a)&&(a=u,r=d)}}s.err=a,s.nn=r}function Ce(){return{ac:0,rc:0,gc:0,bc:0,cnt:0,nn:0,fw:0,bk:0,tm:0,mtm:0,err:0}}function xa(i,t,e){let{format:r="rgb565",clearAlpha:a=!0,clearAlphaColor:s=0,clearAlphaThreshold:o=0,oneBitAlpha:n=!1}=e||{},l=e.useSqrt!==!1,c=r==="rgba4444",d=(function(M,j){let O=new Array(j==="rgb444"?4096:65536),Q=M.length;if(j==="rgba4444")for(let q=0;q<Q;++q){let K=M[q],H=K>>24&255,tt=K>>16&255,bt=K>>8&255,st=255&K,X=vi(st,bt,tt,H),Ct=X in O?O[X]:O[X]=Ce();Ct.rc+=st,Ct.gc+=bt,Ct.bc+=tt,Ct.ac+=H,Ct.cnt++}else if(j==="rgb444")for(let q=0;q<Q;++q){let K=M[q],H=K>>16&255,tt=K>>8&255,bt=255&K,st=xi(bt,tt,H),X=st in O?O[st]:O[st]=Ce();X.rc+=bt,X.gc+=tt,X.bc+=H,X.cnt++}else for(let q=0;q<Q;++q){let K=M[q],H=K>>16&255,tt=K>>8&255,bt=255&K,st=yi(bt,tt,H),X=st in O?O[st]:O[st]=Ce();X.rc+=bt,X.gc+=tt,X.bc+=H,X.cnt++}return O})(i,r),h=d.length,m=h-1,u=new Uint32Array(h+1);for(var p=0,f=0;f<d.length;++f){let M=d[f];if(M!=null){var b=1/M.cnt;c&&(M.ac*=b),M.rc*=b,M.gc*=b,M.bc*=b,d[p++]=M}}for(oe(t)/p<.022&&(l=!1),f=0;f<p-1;++f)d[f].fw=f+1,d[f+1].bk=f,l&&(d[f].cnt=Math.sqrt(d[f].cnt));var y,_,T;for(l&&(d[f].cnt=Math.sqrt(d[f].cnt)),f=0;f<p;++f){_i(d,f);var S=d[f].err;for(_=++u[0];_>1&&!(d[y=u[T=_>>1]].err<=S);_=T)u[_]=y;u[_]=f}var A=p-t;for(f=0;f<A;){for(var E;;){var C=u[1];if((E=d[C]).tm>=E.mtm&&d[E.nn].mtm<=E.tm)break;for(E.mtm==m?C=u[1]=u[u[0]--]:(_i(d,C),E.tm=f),S=d[C].err,_=1;(T=_+_)<=u[0]&&(T<u[0]&&d[u[T]].err>d[u[T+1]].err&&T++,!(S<=d[y=u[T]].err));_=T)u[_]=y;u[_]=C}var I=d[E.nn],D=E.cnt,V=I.cnt;b=1/(D+V),c&&(E.ac=b*(D*E.ac+V*I.ac)),E.rc=b*(D*E.rc+V*I.rc),E.gc=b*(D*E.gc+V*I.gc),E.bc=b*(D*E.bc+V*I.bc),E.cnt+=I.cnt,E.mtm=++f,d[I.bk].fw=I.fw,d[I.fw].bk=I.bk,I.mtm=m}let L=[];var U=0;for(f=0;;++U){let M=se(Math.round(d[f].rc),0,255),j=se(Math.round(d[f].gc),0,255),O=se(Math.round(d[f].bc),0,255),Q=255;c&&(Q=se(Math.round(d[f].ac),0,255),n&&(Q=Q<=(typeof n=="number"?n:127)?0:255),a&&Q<=o&&(M=j=O=s,Q=0));let q=c?[M,j,O,Q]:[M,j,O];if(_a(L,q)||L.push(q),(f=d[f].fw)==0)break}return L}function _a(i,t){for(let e=0;e<i.length;e++){let r=i[e],a=r[0]===t[0]&&r[1]===t[1]&&r[2]===t[2],s=!(r.length>=4&&t.length>=4)||r[3]===t[3];if(a&&s)return!0}return!1}function ka(i,t,e){let r=(e=e||"rgb565")==="rgb444"?4096:65536,a=new Uint8Array(i.length),s=new Array(r);if(e==="rgba4444")for(let o=0;o<i.length;o++){let n,l=i[o],c=l>>24&255,d=l>>16&255,h=l>>8&255,m=255&l,u=vi(m,h,d,c);s[u]!=null?n=s[u]:(n=Ta(m,h,d,c,t),s[u]=n),a[o]=n}else for(let o=0;o<i.length;o++){let n,l=i[o],c=l>>16&255,d=l>>8&255,h=255&l,m=e==="rgb444"?xi(h,d,c):yi(h,d,c);s[m]!=null?n=s[m]:(n=Ca(h,d,c,t),s[m]=n),a[o]=n}return a}function Ta(i,t,e,r,a){let s=0,o=1e100;for(let n=0;n<a.length;n++){let l=a[n],c=l[0],d=l[1],h=l[2],m=It(l[3]-r);m>o||(m+=It(c-i),!(m>o)&&(m+=It(d-t),!(m>o)&&(m+=It(h-e),!(m>o)&&(o=m,s=n))))}return s}function Ca(i,t,e,r){let a=0,s=1e100;for(let o=0;o<r.length;o++){let n=r[o],l=n[0],c=n[1],d=n[2],h=It(l-i);h>s||(h+=It(c-t),!(h>s)&&(h+=It(d-e),!(h>s)&&(s=h,a=o)))}return a}function It(i){return i*i}function Ea(i={}){let{initialCapacity:t=4096,auto:e=!0}=i,r=bi(t),a=new Uint8Array(256),s=new Int32Array(5003),o=new Int32Array(5003),n=!1;return{reset(){r.reset(),n=!1},finish(){r.writeByte(ba)},bytes:()=>r.bytes(),bytesView:()=>r.bytesView(),get buffer(){return r.buffer},get stream(){return r},writeHeader:l,writeFrame(c,d,h,m={}){let{transparent:u=!1,transparentIndex:p=0,delay:f=0,palette:b=null,repeat:y=0,colorDepth:_=8,dispose:T=-1}=m,S=!1;if(e?n||(S=!0,l(),n=!0):S=!!m.first,d=Math.max(0,Math.floor(d)),h=Math.max(0,Math.floor(h)),S){if(!b)throw new Error("First frame must include a { palette } option");(function(C,I,D,V,L=8){let U=1,M=0,j=Ee(V.length)-1,O=U<<7|L-1<<4|M<<3|j;Et(C,I),Et(C,D),C.writeBytes([O,0,0])})(r,d,h,b,_),ki(r,b),y>=0&&(function(C,I){C.writeByte(33),C.writeByte(255),C.writeByte(11),Ti(C,"NETSCAPE2.0"),C.writeByte(3),C.writeByte(1),Et(C,I),C.writeByte(0)})(r,y)}let A=Math.round(f/10);(function(C,I,D,V,L){var U,M;C.writeByte(33),C.writeByte(249),C.writeByte(4),L<0&&(L=0,V=!1),V?(U=1,M=2):(U=0,M=0),I>=0&&(M=7&I),M<<=2,C.writeByte(0|M|0|U),Et(C,D),C.writeByte(L||0),C.writeByte(0)})(r,T,A,u,p);let E=!!b&&!S;(function(C,I,D,V){if(C.writeByte(44),Et(C,0),Et(C,0),Et(C,I),Et(C,D),V){let L=0,U=0,M=Ee(V.length)-1;C.writeByte(128|L|U|M)}else C.writeByte(0)})(r,d,h,E?b:null),E&&ki(r,b),(function(C,I,D,V,L=8,U,M,j){va(D,V,I,L,C,U,M,j)})(r,c,d,h,_,a,s,o)}};function l(){Ti(r,"GIF89a")}}function ki(i,t){let e=1<<Ee(t.length);for(let r=0;r<e;r++){let a=[0,0,0];r<t.length&&(a=t[r]),i.writeByte(a[0]),i.writeByte(a[1]),i.writeByte(a[2])}}function Et(i,t){i.writeByte(255&t),i.writeByte(t>>8&255)}function Ti(i,t){for(var e=0;e<t.length;e++)i.writeByte(t.charCodeAt(e))}function Ee(i){return Math.max(Math.ceil(Math.log2(i)),1)}wa();class Sa{constructor(t,e){g(this,"_recorder");g(this,"_textmodifier");g(this,"_registerPostDrawHook");this._recorder=new ga,this._textmodifier=t,this._registerPostDrawHook=e}async $saveGIF(t={}){const e=this._textmodifier.canvas,r=this._applyDefaultOptions(t),a=t.onProgress;try{const s=await this._recorder.$record(e,r,this._registerPostDrawHook,a),o=Ea(),{repeat:n}=t;for(let d=0;d<s.length;d++){const h=s[d],{width:m,height:u,imageData:p,delayMs:f}=h,b=new Uint32Array(p.data.buffer),y=xa(b,256,{}),_=ka(b,y);o.writeFrame(_,m,u,{palette:y,delay:f,repeat:d===0?n:-1}),d%2!=0&&d!==s.length-1||(a==null||a({state:"encoding",frameIndex:d+1,totalFrames:s.length}),await new Promise(T=>setTimeout(T,0)))}o.finish();const l=o.bytes(),c=l.buffer.slice(l.byteOffset,l.byteOffset+l.byteLength);new nt().$downloadFile(new Blob([c],{type:"image/gif"}),r.filename),a==null||a({state:"completed",totalFrames:r.frameCount})}catch(s){throw a==null||a({state:"error",message:s instanceof Error?s.message:"GIF export failed"}),s}}_applyDefaultOptions(t){const e=Math.abs(Math.round(t.frameCount??300)),r=Math.abs(t.frameRate??60),a=Math.abs(t.scale??1),s=Math.max(-1,Math.round(t.repeat??0));return{filename:t.filename,frameCount:e,frameRate:r,scale:a,repeat:s}}}class St extends Error{constructor(e,r,a){super(r);g(this,"code");g(this,"cause");this.name="VideoExportError",this.code=e,this.cause=a}}function Ot(){return new St("VIDEO_EXPORT_ABORTED","Video export was cancelled.")}function ne(i,t,e,r){return new Promise((a,s)=>{if(e!=null&&e.aborted)return void s(Ot());let o=!1;const n=setTimeout(()=>l(()=>s((function(d,h){return new St("VIDEO_EXPORT_TIMEOUT",d,h)})(t))),r),l=d=>{o||(o=!0,clearTimeout(n),e==null||e.removeEventListener("abort",c),d())},c=()=>l(()=>s(Ot()));e==null||e.addEventListener("abort",c,{once:!0}),i.then(d=>l(()=>a(d)),d=>l(()=>s(d)))})}class Ba{constructor(t,e,r,a){g(this,"canvas");g(this,"_textmodifier");g(this,"_registerPostDrawHook");g(this,"_context");g(this,"_sourceCanvas");g(this,"_pendingFrame",null);g(this,"_syntheticFrameCount",0);g(this,"_syntheticMillis",0);this._textmodifier=t,this._registerPostDrawHook=e,this._sourceCanvas=t.canvas,this.canvas=this._createStagingCanvas(r,a);const s=this.canvas.getContext("2d");if(!s)throw new Error("Video export requires a 2D canvas context for staging frames.");s.imageSmoothingEnabled=!1,this._context=s}async $render(t){var p;const e=this._textmodifier,r=Math.max(1,Math.round(t.frameCount)),a=Math.max(1,Math.round(t.frameRate)),s=1e3/a,o=e.isLooping(),n=e.frameCount,l=e.millis,c="secs"in e,d=e.secs,h=this._captureMethodSnapshots(),m=this._capturePropertySnapshots(),u=this._registerPostDrawHook(()=>{this._capturePendingFrame()});try{e.noLoop(),this._syntheticFrameCount=n,this._syntheticMillis=l,this._shadowTimingProperties(c),this._shadowTimingMethods(a,s),this._shadowResizeCanvas();for(let f=0;f<r;f++)this._throwIfAborted(t.signal),this._syntheticFrameCount=n+f+1,this._syntheticMillis=1e3*f/a,await this._renderOneFrame(f,t.signal),this._throwIfAborted(t.signal),await t.onFrame({frameIndex:f,canvas:this.canvas})}finally{u(),(p=this._pendingFrame)==null||p.reject(new Error("Video export frame rendering was interrupted.")),this._pendingFrame=null,this._restoreProperties(m),this._restoreMethods(h),e.frameCount=n,e.millis=l,c&&d!==void 0&&(e.secs=d),o?e.loop():e.noLoop()}}_renderOneFrame(t,e){if(this._pendingFrame)throw new Error("A video export frame is already pending.");const r=this._textmodifier;return ne(new Promise((a,s)=>{this._pendingFrame={frameIndex:t,resolve:a,reject:s};try{r.redraw(1)}catch(o){this._pendingFrame=null,s(o)}}),`Video export frame ${t+1} did not render within 30000ms.`,e,3e4).catch(a=>{var s;throw((s=this._pendingFrame)==null?void 0:s.frameIndex)===t&&(this._pendingFrame=null),a})}_capturePendingFrame(){const t=this._pendingFrame;if(t)try{this._context.clearRect(0,0,this.canvas.width,this.canvas.height),this._context.drawImage(this._sourceCanvas,0,0,this._sourceCanvas.width,this._sourceCanvas.height,0,0,this.canvas.width,this.canvas.height),this._pendingFrame=null,t.resolve()}catch(e){this._pendingFrame=null,t.reject(e)}}_createStagingCanvas(t,e){const r=document.createElement("canvas");return r.width=Math.max(1,Math.round(t)),r.height=Math.max(1,Math.round(e)),r}_captureMethodSnapshots(){return["deltaTime","frameRate","resizeCanvas"].map(t=>({key:t,hadOwnProperty:Object.prototype.hasOwnProperty.call(this._textmodifier,t),value:this._textmodifier[t]}))}_capturePropertySnapshots(){return["frameCount","millis","secs"].map(t=>({key:t,hadOwnProperty:Object.prototype.hasOwnProperty.call(this._textmodifier,t),descriptor:Object.getOwnPropertyDescriptor(this._textmodifier,t)}))}_shadowTimingProperties(t){Object.defineProperty(this._textmodifier,"frameCount",{configurable:!0,enumerable:!0,get:()=>this._syntheticFrameCount,set:e=>{this._syntheticFrameCount=e}}),Object.defineProperty(this._textmodifier,"millis",{configurable:!0,enumerable:!0,get:()=>this._syntheticMillis,set:e=>{this._syntheticMillis=e}}),t&&Object.defineProperty(this._textmodifier,"secs",{configurable:!0,enumerable:!0,get:()=>this._syntheticMillis/1e3,set:e=>{this._syntheticMillis=1e3*e}})}_shadowTimingMethods(t,e){const r=this._textmodifier,a=r.frameRate;r.deltaTime=()=>e,r.frameRate=function(s){return s===void 0?t:a.call(this,s)}}_shadowResizeCanvas(){this._textmodifier.resizeCanvas=()=>{}}_restoreMethods(t){const e=this._textmodifier;for(const r of t)r.hadOwnProperty?e[r.key]=r.value:delete e[r.key]}_restoreProperties(t){for(const e of t)e.hadOwnProperty&&e.descriptor?Object.defineProperty(this._textmodifier,e.key,e.descriptor):delete this._textmodifier[e.key]}_throwIfAborted(t){if(t!=null&&t.aborted)throw Ot()}}function w(i){if(!i)throw new Error("Assertion failed.")}const Ci=i=>{const t=(i%360+360)%360;if(t===0||t===90||t===180||t===270)return t;throw new Error(`Invalid rotation ${i}.`)},ft=i=>i&&i[i.length-1],Bt=i=>i>=0&&i<2**32,k=i=>{let t=0;for(;i.readBits(1)===0&&t<32;)t++;if(t>=32)throw new Error("Invalid exponential-Golomb code.");return(1<<t)-1+i.readBits(t)},yt=i=>{const t=k(i);return 1&t?t+1>>1:-(t>>1)},Z=i=>i.constructor===Uint8Array?i:ArrayBuffer.isView(i)?new Uint8Array(i.buffer,i.byteOffset,i.byteLength):new Uint8Array(i),Ei=i=>i.constructor===DataView?i:ArrayBuffer.isView(i)?new DataView(i.buffer,i.byteOffset,i.byteLength):new DataView(i),J=new TextEncoder,Ht={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},Nt={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},jt={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},Si=i=>!!(i&&i.primaries&&i.transfer&&i.matrix&&i.fullRange!==void 0),Se=i=>i instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&i instanceof SharedArrayBuffer||ArrayBuffer.isView(i);class Bi{constructor(){this.currentPromise=Promise.resolve(),this.pending=0}async acquire(){let t;const e=new Promise(a=>{let s=!1;t=()=>{s||(a(),this.pending--,s=!0)}}),r=this.currentPromise;return this.currentPromise=e,this.pending++,await r,t}}const Pi=(i,t,e)=>{let r=0,a=i.length-1,s=-1;for(;r<=a;){const o=r+(a-r+1)/2|0;e(i[o])<=t?(s=o,r=o+1):a=o-1}return s},Be=()=>{let i,t;return{promise:new Promise((e,r)=>{i=e,t=r}),resolve:i,reject:t}},Wt=i=>{throw new Error(`Unexpected value: ${i}`)},Pa=(i,t,e)=>i.getUint8(t)<<16|i.getUint8(t+1)<<8|i.getUint8(t+2),Ma=(i,t,e,r)=>{e>>>=0,e&=16777215,i.setUint8(t,e>>>16&255),i.setUint8(t+1,e>>>8&255),i.setUint8(t+2,255&e)},Mi=(i,t)=>Math.round(i/t)*t,Ii=(i,t)=>Math.round(i*t)/t,Ai=(i,t)=>Math.floor(i*t)/t,Ia=/^[a-z]{3}$/,Ut=1e6*(1+Number.EPSILON);class Aa{constructor(){this.currentPromise=Promise.resolve()}call(t){return this.currentPromise=this.currentPromise.then(t)}}let Pe=null;const Fi=()=>{var i;return Pe!==null?Pe:Pe=typeof navigator<"u"&&((i=navigator.userAgent)==null?void 0:i.includes("Firefox"))};let Me=null;const Fa=()=>{var i;return Me!==null?Me:Me=!(typeof navigator>"u"||!((i=navigator.vendor)!=null&&i.includes("Google Inc"))&&!/Chrome/.test(navigator.userAgent))};let Ie=null;const Da=()=>{if(Ie!==null)return Ie;if(typeof navigator>"u")return null;const i=/\bChrome\/(\d+)/.exec(navigator.userAgent);return i?Ie=Number(i[1]):null},Ae=function*(i){for(const t in i){const e=i[t];e!==void 0&&(yield{key:t,value:e})}},Ra=i=>{switch(i.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},Va=(i,t)=>{if(i.length!==t.length)return!1;for(let e=0;e<i.length;e++)if(i[e]!==t[e])return!1;return!0},Fe=i=>{w(Number.isInteger(i.num)),w(Number.isInteger(i.den)),w(i.den!==0);let t=Math.abs(i.num),e=Math.abs(i.den);for(;e!==0;){const a=t%e;t=e,e=a}const r=t||1;return{num:i.num/r,den:i.den/r}},Di=(i,t)=>{if(typeof i!="object"||!i)throw new TypeError(`${t} must be an object.`);if(!Number.isInteger(i.left)||i.left<0)throw new TypeError(`${t}.left must be a non-negative integer.`);if(!Number.isInteger(i.top)||i.top<0)throw new TypeError(`${t}.top must be a non-negative integer.`);if(!Number.isInteger(i.width)||i.width<0)throw new TypeError(`${t}.width must be a non-negative integer.`);if(!Number.isInteger(i.height)||i.height<0)throw new TypeError(`${t}.height must be a non-negative integer.`)},Ri=i=>Array.isArray(i)?i:[i];class Vi{constructor(){this._listeners=new Map}on(t,e,r){this._listeners.has(t)||this._listeners.set(t,new Set);const a={fn:e,once:(r==null?void 0:r.once)??!1};return this._listeners.get(t).add(a),()=>{var s;(s=this._listeners.get(t))==null||s.delete(a)}}_emit(...t){const[e,r]=t,a=this._listeners.get(e);if(a)for(const s of a){try{s.fn(r)}catch(o){console.error(o)}s.once&&a.delete(s)}}}const La=i=>i!==null&&typeof i=="object"&&Object.getPrototypeOf(i)===Object.prototype&&Object.values(i).every(t=>typeof t=="string");class Li{constructor(t,e){if(this.data=t,this.mimeType=e,!(t instanceof Uint8Array))throw new TypeError("data must be a Uint8Array.");if(typeof e!="string")throw new TypeError("mimeType must be a string.")}}class Oi{constructor(t,e,r,a){if(this.data=t,this.mimeType=e,this.name=r,this.description=a,!(t instanceof Uint8Array))throw new TypeError("data must be a Uint8Array.");if(e!==void 0&&typeof e!="string")throw new TypeError("mimeType, when provided, must be a string.");if(r!==void 0&&typeof r!="string")throw new TypeError("name, when provided, must be a string.");if(a!==void 0&&typeof a!="string")throw new TypeError("description, when provided, must be a string.")}}class G{constructor(t){this.bytes=t,this.pos=0}seekToByte(t){this.pos=8*t}readBit(){const t=Math.floor(this.pos/8),e=this.bytes[t]??0,r=7-(7&this.pos),a=(e&1<<r)>>r;return this.pos++,a}readBits(t){if(t===1)return this.readBit();let e=0;for(let r=0;r<t;r++)e<<=1,e|=this.readBit();return e}writeBits(t,e){const r=this.pos+t;for(let a=this.pos;a<r;a++){const s=Math.floor(a/8);let o=this.bytes[s];const n=7-(7&a);o&=~(1<<n),o|=(e&1<<r-a-1)>>r-a-1<<n,this.bytes[s]=o}this.pos=r}readAlignedByte(){if(this.pos%8!=0)throw new Error("Bitstream is not byte-aligned.");const t=this.pos/8,e=this.bytes[t]??0;return this.pos+=8,e}skipBits(t){this.pos+=t}getBitsLeft(){return 8*this.bytes.length-this.pos}clone(){const t=new G(this.bytes);return t.pos=this.pos,t}}const De=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],Re=[-1,1,2,3,4,5,6,8],Wi=i=>{let t=De.indexOf(i.sampleRate),e=null;t===-1&&(t=15,e=i.sampleRate);const r=Re.indexOf(i.numberOfChannels);if(r===-1)throw new TypeError(`Unsupported number of channels: ${i.numberOfChannels}`);let a=13;i.objectType>=32&&(a+=6),t===15&&(a+=24);const s=Math.ceil(a/8),o=new Uint8Array(s),n=new G(o);return i.objectType<32?n.writeBits(5,i.objectType):(n.writeBits(5,31),n.writeBits(6,i.objectType-32)),n.writeBits(4,t),t===15&&n.writeBits(24,e),n.writeBits(4,r),o},ct=["avc","hevc","vp9","av1","vp8"],vt=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],ce=["aac","opus","mp3","vorbis","flac","ac3","eac3"],qt=[...ce,...vt],At=["webvtt"],de=[{maxMacroblocks:99,maxBitrate:64e3,maxDpbMbs:396,level:10},{maxMacroblocks:396,maxBitrate:192e3,maxDpbMbs:900,level:11},{maxMacroblocks:396,maxBitrate:384e3,maxDpbMbs:2376,level:12},{maxMacroblocks:396,maxBitrate:768e3,maxDpbMbs:2376,level:13},{maxMacroblocks:396,maxBitrate:2e6,maxDpbMbs:2376,level:20},{maxMacroblocks:792,maxBitrate:4e6,maxDpbMbs:4752,level:21},{maxMacroblocks:1620,maxBitrate:4e6,maxDpbMbs:8100,level:22},{maxMacroblocks:1620,maxBitrate:1e7,maxDpbMbs:8100,level:30},{maxMacroblocks:3600,maxBitrate:14e6,maxDpbMbs:18e3,level:31},{maxMacroblocks:5120,maxBitrate:2e7,maxDpbMbs:20480,level:32},{maxMacroblocks:8192,maxBitrate:2e7,maxDpbMbs:32768,level:40},{maxMacroblocks:8192,maxBitrate:5e7,maxDpbMbs:32768,level:41},{maxMacroblocks:8704,maxBitrate:5e7,maxDpbMbs:34816,level:42},{maxMacroblocks:22080,maxBitrate:135e6,maxDpbMbs:110400,level:50},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:51},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:52},{maxMacroblocks:139264,maxBitrate:24e7,maxDpbMbs:696320,level:60},{maxMacroblocks:139264,maxBitrate:48e7,maxDpbMbs:696320,level:61},{maxMacroblocks:139264,maxBitrate:8e8,maxDpbMbs:696320,level:62}],Ui=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:35651584,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:35651584,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:35651584,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:35651584,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:186}],$i=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:35651584,maxBitrate:18e7,level:60},{maxPictureSize:35651584,maxBitrate:24e7,level:61},{maxPictureSize:35651584,maxBitrate:48e7,level:62}],zi=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:35651584,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:35651584,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:35651584,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:35651584,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:35651584,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:35651584,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:19}],Oa=(i,t,e,r)=>{if(i==="avc"){const s=Math.ceil(t/16)*Math.ceil(e/16),o=de.find(l=>s<=l.maxMacroblocks&&r<=l.maxBitrate)??ft(de),n=o?o.level:0;return`avc1.${"64".padStart(2,"0")}00${n.toString(16).padStart(2,"0")}`}if(i==="hevc"){const n=t*e,l=Ui.find(d=>n<=d.maxPictureSize&&r<=d.maxBitrate)??ft(Ui);return`hev1.1.6.${l.tier}${l.level}.B0`}if(i==="vp8")return"vp8";if(i==="vp9"){const a=t*e;return`vp09.00.${($i.find(o=>a<=o.maxPictureSize&&r<=o.maxBitrate)??ft($i)).level.toString().padStart(2,"0")}.08`}if(i==="av1"){const s=t*e,o=zi.find(l=>s<=l.maxPictureSize&&r<=l.maxBitrate)??ft(zi);return`av01.0.${o.level.toString().padStart(2,"0")}${o.tier}.08`}throw new TypeError(`Unhandled codec '${i}'.`)},Wa=i=>{const t=i.split(".");return[1,1,Number(t[1]),2,1,Number(t[2]),3,1,Number(t[3]),4,1,t[4]?Number(t[4]):1]},Hi=i=>{const t=i.split("."),e=Number(t[1]),r=t[2];return[129,(e<<5)+Number(r.slice(0,-1)),((r.slice(-1)==="H"?1:0)<<7)+((Number(t[3])===8?0:1)<<6)+0+((t[4]?Number(t[4]):0)<<4)+((t[5]?Number(t[5][0]):1)<<3)+((t[5]?Number(t[5][1]):1)<<2)+(t[5]?Number(t[5][2]):0),0]},Ni=/^pcm-([usf])(\d+)(be)?$/,Ft=i=>{if(w(vt.includes(i)),i==="ulaw")return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if(i==="alaw")return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};const t=Ni.exec(i);let e;return w(t),e=t[1]==="u"?"unsigned":t[1]==="s"?"signed":"float",{dataType:e,sampleSize:Number(t[2])/8,littleEndian:t[3]!=="be",silentValue:i==="pcm-u8"?128:0}},Ua=["avc1","avc3","hev1","hvc1","vp8","vp09","av01"],$a=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,za=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,Ha=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,Na=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,ji=i=>{if(!i)throw new TypeError("Video chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Video chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Video chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Video chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!Ua.some(t=>i.decoderConfig.codec.startsWith(t)))throw new TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the Mediabunny Codec Registry.");if(!Number.isInteger(i.decoderConfig.codedWidth)||i.decoderConfig.codedWidth<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(i.decoderConfig.codedHeight)||i.decoderConfig.codedHeight<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(i.decoderConfig.displayAspectWidth!==void 0&&(!Number.isInteger(i.decoderConfig.displayAspectWidth)||i.decoderConfig.displayAspectWidth<=0))throw new TypeError("Video chunk metadata decoder configuration displayAspectWidth, when defined, must be a positive integer.");if(i.decoderConfig.displayAspectHeight!==void 0&&(!Number.isInteger(i.decoderConfig.displayAspectHeight)||i.decoderConfig.displayAspectHeight<=0))throw new TypeError("Video chunk metadata decoder configuration displayAspectHeight, when defined, must be a positive integer.");if(i.decoderConfig.displayAspectWidth!==void 0!=(i.decoderConfig.displayAspectHeight!==void 0))throw new TypeError("Video chunk metadata decoder configuration must specify both displayAspectWidth and displayAspectHeight, or neither.");if(i.decoderConfig.description!==void 0&&!Se(i.decoderConfig.description))throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.colorSpace!==void 0){const{colorSpace:t}=i.decoderConfig;if(typeof t!="object")throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");const e=Object.keys(Ht);if(t.primaries!=null&&!e.includes(t.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${e.join(", ")}.`);const r=Object.keys(Nt);if(t.transfer!=null&&!r.includes(t.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);const a=Object.keys(jt);if(t.matrix!=null&&!a.includes(t.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${a.join(", ")}.`);if(t.fullRange!=null&&typeof t.fullRange!="boolean")throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(i.decoderConfig.codec.startsWith("avc1")||i.decoderConfig.codec.startsWith("avc3")){if(!$a.test(i.decoderConfig.codec))throw new TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(i.decoderConfig.codec.startsWith("hev1")||i.decoderConfig.codec.startsWith("hvc1")){if(!za.test(i.decoderConfig.codec))throw new TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(i.decoderConfig.codec.startsWith("vp8")){if(i.decoderConfig.codec!=="vp8")throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(i.decoderConfig.codec.startsWith("vp09")){if(!Ha.test(i.decoderConfig.codec))throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(i.decoderConfig.codec.startsWith("av01")&&!Na.test(i.decoderConfig.codec))throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')},ja=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm","ac-3","ec-3"],qi=i=>{if(!i)throw new TypeError("Audio chunk metadata must be provided.");if(typeof i!="object")throw new TypeError("Audio chunk metadata must be an object.");if(!i.decoderConfig)throw new TypeError("Audio chunk metadata must include a decoder configuration.");if(typeof i.decoderConfig!="object")throw new TypeError("Audio chunk metadata decoder configuration must be an object.");if(typeof i.decoderConfig.codec!="string")throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!ja.some(t=>i.decoderConfig.codec.startsWith(t)))throw new TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the Mediabunny Codec Registry.");if(!Number.isInteger(i.decoderConfig.sampleRate)||i.decoderConfig.sampleRate<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(i.decoderConfig.numberOfChannels)||i.decoderConfig.numberOfChannels<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(i.decoderConfig.description!==void 0&&!Se(i.decoderConfig.description))throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(i.decoderConfig.codec.startsWith("mp4a")&&i.decoderConfig.codec!=="mp4a.69"&&i.decoderConfig.codec!=="mp4a.6B"&&i.decoderConfig.codec!=="mp4a.6b"){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(i.decoderConfig.codec))throw new TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.")}else if(i.decoderConfig.codec.startsWith("mp3")||i.decoderConfig.codec.startsWith("mp4a")){if(i.decoderConfig.codec!=="mp3"&&i.decoderConfig.codec!=="mp4a.69"&&i.decoderConfig.codec!=="mp4a.6B"&&i.decoderConfig.codec!=="mp4a.6b")throw new TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(i.decoderConfig.codec.startsWith("opus")){if(i.decoderConfig.codec!=="opus")throw new TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(i.decoderConfig.description&&i.decoderConfig.description.byteLength<18)throw new TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(i.decoderConfig.codec.startsWith("vorbis")){if(i.decoderConfig.codec!=="vorbis")throw new TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!i.decoderConfig.description)throw new TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(i.decoderConfig.codec.startsWith("flac")){if(i.decoderConfig.codec!=="flac")throw new TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!i.decoderConfig.description||i.decoderConfig.description.byteLength<42)throw new TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if(i.decoderConfig.codec.startsWith("ac-3")||i.decoderConfig.codec.startsWith("ac3")){if(i.decoderConfig.codec!=="ac-3")throw new TypeError('Audio chunk metadata decoder configuration codec string for AC-3 must be "ac-3".')}else if(i.decoderConfig.codec.startsWith("ec-3")||i.decoderConfig.codec.startsWith("eac3")){if(i.decoderConfig.codec!=="ec-3")throw new TypeError('Audio chunk metadata decoder configuration codec string for EC-3 must be "ec-3".')}else if((i.decoderConfig.codec.startsWith("pcm")||i.decoderConfig.codec.startsWith("ulaw")||i.decoderConfig.codec.startsWith("alaw"))&&!vt.includes(i.decoderConfig.codec))throw new TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${vt.join(", ")}).`)},Gi=i=>{if(!i)throw new TypeError("Subtitle metadata must be provided.");if(typeof i!="object")throw new TypeError("Subtitle metadata must be an object.");if(!i.config)throw new TypeError("Subtitle metadata must include a config object.");if(typeof i.config!="object")throw new TypeError("Subtitle metadata config must be an object.");if(typeof i.config.description!="string")throw new TypeError("Subtitle metadata config description must be a string.")},qa=[48e3,44100,32e3],Ga=[24e3,22050,16e3];var xt,et;(function(i){i[i.NON_IDR_SLICE=1]="NON_IDR_SLICE",i[i.SLICE_DPA=2]="SLICE_DPA",i[i.SLICE_DPB=3]="SLICE_DPB",i[i.SLICE_DPC=4]="SLICE_DPC",i[i.IDR=5]="IDR",i[i.SEI=6]="SEI",i[i.SPS=7]="SPS",i[i.PPS=8]="PPS",i[i.AUD=9]="AUD",i[i.SPS_EXT=13]="SPS_EXT"})(xt||(xt={})),(function(i){i[i.RASL_N=8]="RASL_N",i[i.RASL_R=9]="RASL_R",i[i.BLA_W_LP=16]="BLA_W_LP",i[i.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",i[i.VPS_NUT=32]="VPS_NUT",i[i.SPS_NUT=33]="SPS_NUT",i[i.PPS_NUT=34]="PPS_NUT",i[i.AUD_NUT=35]="AUD_NUT",i[i.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",i[i.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT"})(et||(et={}));const Gt=function*(i){let t=0,e=-1;for(;t<i.length-2;){const r=i.indexOf(0,t);if(r===-1||r>=i.length-2)break;t=r;let a=0;t+3<i.length&&i[t+1]===0&&i[t+2]===0&&i[t+3]===1?a=4:i[t+1]===0&&i[t+2]===1&&(a=3),a!==0?(e!==-1&&t>e&&(yield{offset:e,length:t-e}),e=t+a,t=e):t++}e!==-1&&e<i.length&&(yield{offset:e,length:i.length-e})},Xi=function*(i,t){let e=0;const r=new DataView(i.buffer,i.byteOffset,i.byteLength);for(;e+t<=i.length;){let a;t===1?a=r.getUint8(e):t===2?a=r.getUint16(e,!1):t===3?a=Pa(r,e):(w(t===4),a=r.getUint32(e,!1)),e+=t,yield{offset:e,length:a},e+=a}},Qi=i=>31&i,le=i=>{const t=[],e=i.length;for(let r=0;r<e;r++)r+2<e&&i[r]===0&&i[r+1]===0&&i[r+2]===3?(t.push(0,0),r+=2):t.push(i[r]);return new Uint8Array(t)},Yi={1:{num:1,den:1},2:{num:12,den:11},3:{num:10,den:11},4:{num:16,den:11},5:{num:40,den:33},6:{num:24,den:11},7:{num:20,den:11},8:{num:32,den:11},9:{num:80,den:33},10:{num:18,den:11},11:{num:15,den:11},12:{num:64,den:33},13:{num:160,den:99},14:{num:4,den:3},15:{num:3,den:2},16:{num:2,den:1}},Xa=i=>{try{const t=new G(le(i));if(t.skipBits(1),t.skipBits(2),t.readBits(5)!==7)return null;const e=t.readAlignedByte(),r=t.readAlignedByte(),a=t.readAlignedByte();k(t);let s=1,o=0,n=0,l=0;if((e===100||e===110||e===122||e===244||e===44||e===83||e===86||e===118||e===128)&&(s=k(t),s===3&&(l=t.readBits(1)),o=k(t),n=k(t),t.skipBits(1),t.readBits(1))){for(let I=0;I<(s!==3?8:12);I++)if(t.readBits(1)){const D=I<6?16:64;let V=8,L=8;for(let U=0;U<D;U++)L!==0&&(L=(V+yt(t)+256)%256),V=L===0?V:L}}k(t);const c=k(t);if(c===0)k(t);else if(c===1){t.skipBits(1),yt(t),yt(t);const I=k(t);for(let D=0;D<I;D++)yt(t)}k(t),t.skipBits(1);const d=k(t),h=k(t),m=16*(d+1),u=16*(h+1);let p=m,f=u;const b=t.readBits(1);if(b||t.skipBits(1),t.skipBits(1),t.readBits(1)){const I=k(t),D=k(t),V=k(t),L=k(t);let U,M;(l===0?s:0)===0?(U=1,M=2-b):(U=s===3?1:2,M=(s===1?2:1)*(2-b)),p-=U*(I+D),f-=M*(V+L)}let y=2,_=2,T=2,S=0,A={num:1,den:1},E=null,C=null;if(t.readBits(1)){if(t.readBits(1)){const V=t.readBits(8);if(V===255)A={num:t.readBits(16),den:t.readBits(16)};else{const L=Yi[V];L&&(A=L)}}t.readBits(1)&&t.skipBits(1),t.readBits(1)&&(t.skipBits(3),S=t.readBits(1),t.readBits(1)&&(y=t.readBits(8),_=t.readBits(8),T=t.readBits(8))),t.readBits(1)&&(k(t),k(t)),t.readBits(1)&&(t.skipBits(32),t.skipBits(32),t.skipBits(1));const I=t.readBits(1);I&&Ki(t);const D=t.readBits(1);D&&Ki(t),(I||D)&&t.skipBits(1),t.skipBits(1),t.readBits(1)&&(t.skipBits(1),k(t),k(t),k(t),k(t),E=k(t),C=k(t))}if(E===null)if(w(C===null),e!==44&&e!==86&&e!==100&&e!==110&&e!==122&&e!==244||!(16&r)){const I=d+1,D=(2-b)*(h+1),V=de.find(U=>U.level>=a)??ft(de),L=Math.min(Math.floor(V.maxDpbMbs/(I*D)),16);E=L,C=L}else E=0,C=0;return w(C!==null),{profileIdc:e,constraintFlags:r,levelIdc:a,frameMbsOnlyFlag:b,chromaFormatIdc:s,bitDepthLumaMinus8:o,bitDepthChromaMinus8:n,codedWidth:m,codedHeight:u,displayWidth:p,displayHeight:f,pixelAspectRatio:A,colourPrimaries:y,matrixCoefficients:T,transferCharacteristics:_,fullRangeFlag:S,numReorderFrames:E,maxDecFrameBuffering:C}}catch(t){return console.error("Error parsing AVC SPS:",t),null}},Ki=i=>{const t=k(i);i.skipBits(4),i.skipBits(4);for(let e=0;e<=t;e++)k(i),k(i),i.skipBits(1);i.skipBits(5),i.skipBits(5),i.skipBits(5),i.skipBits(5)},Ve=i=>i>>1&63,Qa=i=>{try{const t=[],e=[],r=[],a=[];for(const l of Gt(i)){const c=i.subarray(l.offset,l.offset+l.length),d=Ve(c[0]);d===et.VPS_NUT?t.push(c):d===et.SPS_NUT?e.push(c):d===et.PPS_NUT?r.push(c):d!==et.PREFIX_SEI_NUT&&d!==et.SUFFIX_SEI_NUT||a.push(c)}if(e.length===0||r.length===0)return null;const s=(l=>{try{const c=new G(le(l));c.skipBits(16),c.readBits(4);const d=c.readBits(3),h=c.readBits(1),{general_profile_space:m,general_tier_flag:u,general_profile_idc:p,general_profile_compatibility_flags:f,general_constraint_indicator_flags:b,general_level_idc:y}=Ya(c,d);k(c);const _=k(c);let T=0;_===3&&(T=c.readBits(1));const S=k(c),A=k(c);let E=S,C=A;if(c.readBits(1)){const H=k(c),tt=k(c),bt=k(c),st=k(c);let X=1,Ct=1;const ca=T===0?_:0;ca===1?(X=2,Ct=2):ca===2&&(X=2,Ct=1),E-=(H+tt)*X,C-=(bt+st)*Ct}const I=k(c),D=k(c);k(c);const V=c.readBits(1);let L=0;for(let H=V?0:d;H<=d;H++)k(c),L=k(c),k(c);k(c),k(c),k(c),k(c),k(c),k(c),c.readBits(1)&&c.readBits(1)&&Ka(c),c.skipBits(1),c.skipBits(1),c.readBits(1)&&(c.skipBits(4),c.skipBits(4),k(c),k(c),c.skipBits(1));const U=k(c);if(Ja(c,U),c.readBits(1)){const H=k(c);for(let tt=0;tt<H;tt++)k(c),c.skipBits(1)}c.skipBits(1),c.skipBits(1);let M=2,j=2,O=2,Q=0,q=0,K={num:1,den:1};if(c.readBits(1)){const H=ts(c,d);K=H.pixelAspectRatio,M=H.colourPrimaries,j=H.transferCharacteristics,O=H.matrixCoefficients,Q=H.fullRangeFlag,q=H.minSpatialSegmentationIdc}return{displayWidth:E,displayHeight:C,pixelAspectRatio:K,colourPrimaries:M,transferCharacteristics:j,matrixCoefficients:O,fullRangeFlag:Q,maxDecFrameBuffering:L+1,spsMaxSubLayersMinus1:d,spsTemporalIdNestingFlag:h,generalProfileSpace:m,generalTierFlag:u,generalProfileIdc:p,generalProfileCompatibilityFlags:f,generalConstraintIndicatorFlags:b,generalLevelIdc:y,chromaFormatIdc:_,bitDepthLumaMinus8:I,bitDepthChromaMinus8:D,minSpatialSegmentationIdc:q}}catch(c){return console.error("Error parsing HEVC SPS:",c),null}})(e[0]);if(!s)return null;let o=0;if(r.length>0){const l=r[0],c=new G(le(l));c.skipBits(16),k(c),k(c),c.skipBits(1),c.skipBits(1),c.skipBits(3),c.skipBits(1),c.skipBits(1),k(c),k(c),yt(c),c.skipBits(1),c.skipBits(1),c.readBits(1)&&k(c),yt(c),yt(c),c.skipBits(1),c.skipBits(1),c.skipBits(1),c.skipBits(1);const d=c.readBits(1),h=c.readBits(1);o=d||h?d&&!h?2:!d&&h?3:0:0}const n=[...t.length?[{arrayCompleteness:1,nalUnitType:et.VPS_NUT,nalUnits:t}]:[],...e.length?[{arrayCompleteness:1,nalUnitType:et.SPS_NUT,nalUnits:e}]:[],...r.length?[{arrayCompleteness:1,nalUnitType:et.PPS_NUT,nalUnits:r}]:[],...a.length?[{arrayCompleteness:1,nalUnitType:Ve(a[0][0]),nalUnits:a}]:[]];return{configurationVersion:1,generalProfileSpace:s.generalProfileSpace,generalTierFlag:s.generalTierFlag,generalProfileIdc:s.generalProfileIdc,generalProfileCompatibilityFlags:s.generalProfileCompatibilityFlags,generalConstraintIndicatorFlags:s.generalConstraintIndicatorFlags,generalLevelIdc:s.generalLevelIdc,minSpatialSegmentationIdc:s.minSpatialSegmentationIdc,parallelismType:o,chromaFormatIdc:s.chromaFormatIdc,bitDepthLumaMinus8:s.bitDepthLumaMinus8,bitDepthChromaMinus8:s.bitDepthChromaMinus8,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:s.spsMaxSubLayersMinus1+1,temporalIdNested:s.spsTemporalIdNestingFlag,lengthSizeMinusOne:3,arrays:n}}catch(t){return console.error("Error building HEVC Decoder Configuration Record:",t),null}},Ya=(i,t)=>{const e=i.readBits(2),r=i.readBits(1),a=i.readBits(5);let s=0;for(let d=0;d<32;d++)s=s<<1|i.readBits(1);const o=new Uint8Array(6);for(let d=0;d<6;d++)o[d]=i.readBits(8);const n=i.readBits(8),l=[],c=[];for(let d=0;d<t;d++)l.push(i.readBits(1)),c.push(i.readBits(1));if(t>0)for(let d=t;d<8;d++)i.skipBits(2);for(let d=0;d<t;d++)l[d]&&i.skipBits(88),c[d]&&i.skipBits(8);return{general_profile_space:e,general_tier_flag:r,general_profile_idc:a,general_profile_compatibility_flags:s,general_constraint_indicator_flags:o,general_level_idc:n}},Ka=i=>{for(let t=0;t<4;t++)for(let e=0;e<(t===3?2:6);e++)if(i.readBits(1)){const r=Math.min(64,1<<4+(t<<1));t>1&&yt(i);for(let a=0;a<r;a++)yt(i)}else k(i)},Ja=(i,t)=>{const e=[];for(let r=0;r<t;r++)e[r]=Za(i,r,t,e)},Za=(i,t,e,r)=>{let a=0,s=0,o=0;if(t!==0&&(s=i.readBits(1)),s){t===e?o=t-(k(i)+1):o=t-1,i.readBits(1),k(i);const n=r[o]??0;for(let l=0;l<=n;l++)i.readBits(1)||i.readBits(1);a=r[o]}else{const n=k(i),l=k(i);for(let c=0;c<n;c++)k(i),i.readBits(1);for(let c=0;c<l;c++)k(i),i.readBits(1);a=n+l}return a},ts=(i,t)=>{let e=2,r=2,a=2,s=0,o=0,n={num:1,den:1};if(i.readBits(1)){const l=i.readBits(8);if(l===255)n={num:i.readBits(16),den:i.readBits(16)};else{const c=Yi[l];c&&(n=c)}}return i.readBits(1)&&i.readBits(1),i.readBits(1)&&(i.readBits(3),s=i.readBits(1),i.readBits(1)&&(e=i.readBits(8),r=i.readBits(8),a=i.readBits(8))),i.readBits(1)&&(k(i),k(i)),i.readBits(1),i.readBits(1),i.readBits(1),i.readBits(1)&&(k(i),k(i),k(i),k(i)),i.readBits(1)&&(i.readBits(32),i.readBits(32),i.readBits(1)&&k(i),i.readBits(1)&&es(i,!0,t)),i.readBits(1)&&(i.readBits(1),i.readBits(1),i.readBits(1),o=k(i),k(i),k(i),k(i),k(i)),{pixelAspectRatio:n,colourPrimaries:e,transferCharacteristics:r,matrixCoefficients:a,fullRangeFlag:s,minSpatialSegmentationIdc:o}},es=(i,t,e)=>{let r=!1,a=!1,s=!1;r=i.readBits(1)===1,a=i.readBits(1)===1,(r||a)&&(s=i.readBits(1)===1,s&&(i.readBits(8),i.readBits(5),i.readBits(1),i.readBits(5)),i.readBits(4),i.readBits(4),s&&i.readBits(4),i.readBits(5),i.readBits(5),i.readBits(5));for(let o=0;o<=e;o++){let n=!0;i.readBits(1)===1||(n=i.readBits(1)===1);let l=!1;n?k(i):l=i.readBits(1)===1;let c=1;l||(c=k(i)+1),r&&Ji(i,c,s),a&&Ji(i,c,s)}},Ji=(i,t,e)=>{for(let r=0;r<t;r++)k(i),k(i),e&&(k(i),k(i)),i.readBits(1)};var Zi;(function(i){i[i.audAllowed=0]="audAllowed",i[i.beforeFirstVcl=1]="beforeFirstVcl",i[i.afterFirstVcl=2]="afterFirstVcl",i[i.eoBitstreamAllowed=3]="eoBitstreamAllowed",i[i.noMoreDataAllowed=4]="noMoreDataAllowed"})(Zi||(Zi={}));const tr=i=>{const t=Ei(i),e=t.getUint8(9),r=t.getUint16(10,!0),a=t.getUint32(12,!0),s=t.getInt16(16,!0),o=t.getUint8(18);let n=null;return o&&(n=i.subarray(19,21+e)),{outputChannelCount:e,preSkip:r,inputSampleRate:a,outputGain:s,channelMappingFamily:o,channelMappingTable:n}},is=(i,t,e)=>{switch(i){case"avc":for(const r of((a,s)=>{if(s.description){const o=3&Z(s.description)[4];return Xi(a,o+1)}return Gt(a)})(e,t)){const a=e[r.offset],s=Qi(a);if(s>=xt.NON_IDR_SLICE&&s<=xt.SLICE_DPC)return"delta";if(s===xt.IDR)return"key";if(s===xt.SEI&&(!Fa()||Da()>=144)){const o=e.subarray(r.offset,r.offset+r.length),n=le(o);let l=1;do{let c=0;for(;;){const h=n[l++];if(h===void 0||(c+=h,h<255))break}let d=0;for(;;){const h=n[l++];if(h===void 0||(d+=h,h<255))break}if(c===6){const h=new G(n);h.pos=8*l;const m=k(h),u=h.readBits(1);if(m===0&&u===1)return"key"}l+=d}while(l<n.length-1)}}return"delta";case"hevc":for(const r of((a,s)=>{if(s.description){const o=3&Z(s.description)[21];return Xi(a,o+1)}return Gt(a)})(e,t)){const a=Ve(e[r.offset]);if(a<et.BLA_W_LP)return"delta";if(a<=et.RSV_IRAP_VCL23)return"key"}return"delta";case"vp8":return(1&e[0])===0?"key":"delta";case"vp9":{const r=new G(e);if(r.readBits(2)!==2)return null;const a=r.readBits(1);return(r.readBits(1)<<1)+a===3&&r.skipBits(1),r.readBits(1)?null:r.readBits(1)===0?"key":"delta"}case"av1":{let r=!1;for(const{type:a,data:s}of(function*(o){const n=new G(o),l=()=>{let c=0;for(let d=0;d<8;d++){const h=n.readAlignedByte();if(c|=(127&h)<<7*d,!(128&h))break;if(d===7&&128&h)return null}return c>=2**32-1?null:c};for(;n.getBitsLeft()>=8;){n.skipBits(1);const c=n.readBits(4),d=n.readBits(1),h=n.readBits(1);let m;if(n.skipBits(1),d&&n.skipBits(8),h){const u=l();if(u===null)return;m=u}else m=Math.floor(n.getBitsLeft()/8);w(n.pos%8==0),yield{type:c,data:o.subarray(n.pos/8,n.pos/8+m)},n.skipBits(8*m)}})(e))if(a===1){const o=new G(s);o.skipBits(4),r=!!o.readBits(1)}else if(a===3||a===6||a===7){if(r)return"key";const o=new G(s);return o.readBits(1)?null:o.readBits(2)===0?"key":"delta"}return null}default:Wt(i),w(!1)}};var er;(function(i){i[i.STREAMINFO=0]="STREAMINFO",i[i.VORBIS_COMMENT=4]="VORBIS_COMMENT",i[i.PICTURE=6]="PICTURE"})(er||(er={}));const rs=[1,2,3,6],ir=new Uint8Array(0);class Xt{constructor(t,e,r,a,s=-1,o,n){if(this.data=t,this.type=e,this.timestamp=r,this.duration=a,this.sequenceNumber=s,t===ir&&o===void 0)throw new Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(o===void 0&&(o=t.byteLength),!(t instanceof Uint8Array))throw new TypeError("data must be a Uint8Array.");if(e!=="key"&&e!=="delta")throw new TypeError('type must be either "key" or "delta".');if(!Number.isFinite(r))throw new TypeError("timestamp must be a number.");if(!Number.isFinite(a)||a<0)throw new TypeError("duration must be a non-negative number.");if(!Number.isFinite(s))throw new TypeError("sequenceNumber must be a number.");if(!Number.isInteger(o)||o<0)throw new TypeError("byteLength must be a non-negative integer.");if(n!==void 0&&(typeof n!="object"||!n))throw new TypeError("sideData, when provided, must be an object.");if((n==null?void 0:n.alpha)!==void 0&&!(n.alpha instanceof Uint8Array))throw new TypeError("sideData.alpha, when provided, must be a Uint8Array.");if((n==null?void 0:n.alphaByteLength)!==void 0&&(!Number.isInteger(n.alphaByteLength)||n.alphaByteLength<0))throw new TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=o,this.sideData=n??{},this.sideData.alpha&&this.sideData.alphaByteLength===void 0&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===ir}get microsecondTimestamp(){return Math.trunc(Ut*this.timestamp)}get microsecondDuration(){return Math.trunc(Ut*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw new TypeError("Metadata-only packets cannot be converted to a video chunk.");if(typeof EncodedVideoChunk>"u")throw new Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(t=this.type){if(!this.sideData.alpha)throw new TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw new TypeError("Metadata-only packets cannot be converted to a video chunk.");if(typeof EncodedVideoChunk>"u")throw new Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:t,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw new TypeError("Metadata-only packets cannot be converted to an audio chunk.");if(typeof EncodedAudioChunk>"u")throw new Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(t,e){if(!(t instanceof EncodedVideoChunk||t instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");const r=new Uint8Array(t.byteLength);return t.copyTo(r),new Xt(r,t.type,t.timestamp/1e6,(t.duration??0)/1e6,void 0,void 0,e)}clone(t){if(t!==void 0&&(typeof t!="object"||t===null))throw new TypeError("options, when provided, must be an object.");if((t==null?void 0:t.data)!==void 0&&!(t.data instanceof Uint8Array))throw new TypeError("options.data, when provided, must be a Uint8Array.");if((t==null?void 0:t.type)!==void 0&&t.type!=="key"&&t.type!=="delta")throw new TypeError('options.type, when provided, must be either "key" or "delta".');if((t==null?void 0:t.timestamp)!==void 0&&!Number.isFinite(t.timestamp))throw new TypeError("options.timestamp, when provided, must be a number.");if((t==null?void 0:t.duration)!==void 0&&!Number.isFinite(t.duration))throw new TypeError("options.duration, when provided, must be a number.");if((t==null?void 0:t.sequenceNumber)!==void 0&&!Number.isFinite(t.sequenceNumber))throw new TypeError("options.sequenceNumber, when provided, must be a number.");if((t==null?void 0:t.sideData)!==void 0&&(typeof t.sideData!="object"||t.sideData===null))throw new TypeError("options.sideData, when provided, must be an object.");return new Xt((t==null?void 0:t.data)??this.data,(t==null?void 0:t.type)??this.type,(t==null?void 0:t.timestamp)??this.timestamp,(t==null?void 0:t.duration)??this.duration,(t==null?void 0:t.sequenceNumber)??this.sequenceNumber,this.byteLength,(t==null?void 0:t.sideData)??this.sideData)}}class Le{constructor(t){this.value=t}}class Oe{constructor(t){this.value=t}}class rr{constructor(t){this.value=t}}class Pt{constructor(t){this.value=t}}var v;(function(i){i[i.EBML=440786851]="EBML",i[i.EBMLVersion=17030]="EBMLVersion",i[i.EBMLReadVersion=17143]="EBMLReadVersion",i[i.EBMLMaxIDLength=17138]="EBMLMaxIDLength",i[i.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",i[i.DocType=17026]="DocType",i[i.DocTypeVersion=17031]="DocTypeVersion",i[i.DocTypeReadVersion=17029]="DocTypeReadVersion",i[i.Void=236]="Void",i[i.Segment=408125543]="Segment",i[i.SeekHead=290298740]="SeekHead",i[i.Seek=19899]="Seek",i[i.SeekID=21419]="SeekID",i[i.SeekPosition=21420]="SeekPosition",i[i.Duration=17545]="Duration",i[i.Info=357149030]="Info",i[i.TimestampScale=2807729]="TimestampScale",i[i.MuxingApp=19840]="MuxingApp",i[i.WritingApp=22337]="WritingApp",i[i.Tracks=374648427]="Tracks",i[i.TrackEntry=174]="TrackEntry",i[i.TrackNumber=215]="TrackNumber",i[i.TrackUID=29637]="TrackUID",i[i.TrackType=131]="TrackType",i[i.FlagEnabled=185]="FlagEnabled",i[i.FlagDefault=136]="FlagDefault",i[i.FlagForced=21930]="FlagForced",i[i.FlagOriginal=21934]="FlagOriginal",i[i.FlagHearingImpaired=21931]="FlagHearingImpaired",i[i.FlagVisualImpaired=21932]="FlagVisualImpaired",i[i.FlagCommentary=21935]="FlagCommentary",i[i.FlagLacing=156]="FlagLacing",i[i.Name=21358]="Name",i[i.Language=2274716]="Language",i[i.LanguageBCP47=2274717]="LanguageBCP47",i[i.CodecID=134]="CodecID",i[i.CodecPrivate=25506]="CodecPrivate",i[i.CodecDelay=22186]="CodecDelay",i[i.SeekPreRoll=22203]="SeekPreRoll",i[i.DefaultDuration=2352003]="DefaultDuration",i[i.Video=224]="Video",i[i.PixelWidth=176]="PixelWidth",i[i.PixelHeight=186]="PixelHeight",i[i.DisplayWidth=21680]="DisplayWidth",i[i.DisplayHeight=21690]="DisplayHeight",i[i.DisplayUnit=21682]="DisplayUnit",i[i.AlphaMode=21440]="AlphaMode",i[i.Audio=225]="Audio",i[i.SamplingFrequency=181]="SamplingFrequency",i[i.Channels=159]="Channels",i[i.BitDepth=25188]="BitDepth",i[i.SimpleBlock=163]="SimpleBlock",i[i.BlockGroup=160]="BlockGroup",i[i.Block=161]="Block",i[i.BlockAdditions=30113]="BlockAdditions",i[i.BlockMore=166]="BlockMore",i[i.BlockAdditional=165]="BlockAdditional",i[i.BlockAddID=238]="BlockAddID",i[i.BlockDuration=155]="BlockDuration",i[i.ReferenceBlock=251]="ReferenceBlock",i[i.Cluster=524531317]="Cluster",i[i.Timestamp=231]="Timestamp",i[i.Cues=475249515]="Cues",i[i.CuePoint=187]="CuePoint",i[i.CueTime=179]="CueTime",i[i.CueTrackPositions=183]="CueTrackPositions",i[i.CueTrack=247]="CueTrack",i[i.CueClusterPosition=241]="CueClusterPosition",i[i.Colour=21936]="Colour",i[i.MatrixCoefficients=21937]="MatrixCoefficients",i[i.TransferCharacteristics=21946]="TransferCharacteristics",i[i.Primaries=21947]="Primaries",i[i.Range=21945]="Range",i[i.Projection=30320]="Projection",i[i.ProjectionType=30321]="ProjectionType",i[i.ProjectionPoseRoll=30325]="ProjectionPoseRoll",i[i.Attachments=423732329]="Attachments",i[i.AttachedFile=24999]="AttachedFile",i[i.FileDescription=18046]="FileDescription",i[i.FileName=18030]="FileName",i[i.FileMediaType=18016]="FileMediaType",i[i.FileData=18012]="FileData",i[i.FileUID=18094]="FileUID",i[i.Chapters=272869232]="Chapters",i[i.Tags=307544935]="Tags",i[i.Tag=29555]="Tag",i[i.Targets=25536]="Targets",i[i.TargetTypeValue=26826]="TargetTypeValue",i[i.TargetType=25546]="TargetType",i[i.TagTrackUID=25541]="TagTrackUID",i[i.TagEditionUID=25545]="TagEditionUID",i[i.TagChapterUID=25540]="TagChapterUID",i[i.TagAttachmentUID=25542]="TagAttachmentUID",i[i.SimpleTag=26568]="SimpleTag",i[i.TagName=17827]="TagName",i[i.TagLanguage=17530]="TagLanguage",i[i.TagString=17543]="TagString",i[i.TagBinary=17541]="TagBinary",i[i.ContentEncodings=28032]="ContentEncodings",i[i.ContentEncoding=25152]="ContentEncoding",i[i.ContentEncodingOrder=20529]="ContentEncodingOrder",i[i.ContentEncodingScope=20530]="ContentEncodingScope",i[i.ContentCompression=20532]="ContentCompression",i[i.ContentCompAlgo=16980]="ContentCompAlgo",i[i.ContentCompSettings=16981]="ContentCompSettings",i[i.ContentEncryption=20533]="ContentEncryption"})(v||(v={}));const ar=i=>i<256?1:i<65536?2:i<1<<24?3:i<2**32?4:i<2**40?5:6,sr=i=>i<256n?1:i<65536n?2:i<1n<<24n?3:i<1n<<32n?4:i<1n<<40n?5:i<1n<<48n?6:i<1n<<56n?7:8,or=i=>i>=-64&&i<64?1:i>=-8192&&i<8192?2:i>=-1048576&&i<1<<20?3:i>=-134217728&&i<1<<27?4:i>=-17179869184&&i<2**34?5:6;class as{constructor(t){this.writer=t,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(t){this.helperView.setUint8(0,t),this.writer.write(this.helper.subarray(0,1))}writeFloat32(t){this.helperView.setFloat32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(t){this.helperView.setFloat64(0,t,!1),this.writer.write(this.helper)}writeUnsignedInt(t,e=ar(t)){let r=0;switch(e){case 6:this.helperView.setUint8(r++,t/2**40|0);case 5:this.helperView.setUint8(r++,t/2**32|0);case 4:this.helperView.setUint8(r++,t>>24);case 3:this.helperView.setUint8(r++,t>>16);case 2:this.helperView.setUint8(r++,t>>8);case 1:this.helperView.setUint8(r++,t);break;default:throw new Error("Bad unsigned int size "+e)}this.writer.write(this.helper.subarray(0,r))}writeUnsignedBigInt(t,e=sr(t)){let r=0;for(let a=e-1;a>=0;a--)this.helperView.setUint8(r++,Number(t>>BigInt(8*a)&0xffn));this.writer.write(this.helper.subarray(0,r))}writeSignedInt(t,e=or(t)){t<0&&(t+=2**(8*e)),this.writeUnsignedInt(t,e)}writeVarInt(t,e=(r=>{if(r<127)return 1;if(r<16383)return 2;if(r<2097151)return 3;if(r<268435455)return 4;if(r<2**35-1)return 5;if(r<2**42-1)return 6;throw new Error("EBML varint size not supported "+r)})(t)){let r=0;switch(e){case 1:this.helperView.setUint8(r++,128|t);break;case 2:this.helperView.setUint8(r++,64|t>>8),this.helperView.setUint8(r++,t);break;case 3:this.helperView.setUint8(r++,32|t>>16),this.helperView.setUint8(r++,t>>8),this.helperView.setUint8(r++,t);break;case 4:this.helperView.setUint8(r++,16|t>>24),this.helperView.setUint8(r++,t>>16),this.helperView.setUint8(r++,t>>8),this.helperView.setUint8(r++,t);break;case 5:this.helperView.setUint8(r++,8|t/2**32&7),this.helperView.setUint8(r++,t>>24),this.helperView.setUint8(r++,t>>16),this.helperView.setUint8(r++,t>>8),this.helperView.setUint8(r++,t);break;case 6:this.helperView.setUint8(r++,4|t/2**40&3),this.helperView.setUint8(r++,t/2**32|0),this.helperView.setUint8(r++,t>>24),this.helperView.setUint8(r++,t>>16),this.helperView.setUint8(r++,t>>8),this.helperView.setUint8(r++,t);break;default:throw new Error("Bad EBML varint size "+e)}this.writer.write(this.helper.subarray(0,r))}writeAsciiString(t){this.writer.write(new Uint8Array(t.split("").map(e=>e.charCodeAt(0))))}writeEBML(t){if(t!==null)if(t instanceof Uint8Array)this.writer.write(t);else if(Array.isArray(t))for(const e of t)this.writeEBML(e);else if(this.offsets.set(t,this.writer.getPos()),this.writeUnsignedInt(t.id),Array.isArray(t.data)){const e=this.writer.getPos(),r=t.size===-1?1:t.size??4;t.size===-1?this.writeByte(255):this.writer.seek(this.writer.getPos()+r);const a=this.writer.getPos();if(this.dataOffsets.set(t,a),this.writeEBML(t.data),t.size!==-1){const s=this.writer.getPos()-a,o=this.writer.getPos();this.writer.seek(e),this.writeVarInt(s,r),this.writer.seek(o)}}else if(typeof t.data=="number"){const e=t.size??ar(t.data);this.writeVarInt(e),this.writeUnsignedInt(t.data,e)}else if(typeof t.data=="bigint"){const e=t.size??sr(t.data);this.writeVarInt(e),this.writeUnsignedBigInt(t.data,e)}else if(typeof t.data=="string")this.writeVarInt(t.data.length),this.writeAsciiString(t.data);else if(t.data instanceof Uint8Array)this.writeVarInt(t.data.byteLength,t.size),this.writer.write(t.data);else if(t.data instanceof Le)this.writeVarInt(4),this.writeFloat32(t.data.value);else if(t.data instanceof Oe)this.writeVarInt(8),this.writeFloat64(t.data.value);else if(t.data instanceof rr){const e=t.size??or(t.data.value);this.writeVarInt(e),this.writeSignedInt(t.data.value,e)}else if(t.data instanceof Pt){const e=J.encode(t.data.value);this.writeVarInt(e.length),this.writer.write(e)}else Wt(t.data)}}const ss={avc:"V_MPEG4/ISO/AVC",hevc:"V_MPEGH/ISO/HEVC",vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1",aac:"A_AAC",mp3:"A_MPEG/L3",opus:"A_OPUS",vorbis:"A_VORBIS",flac:"A_FLAC",ac3:"A_AC3",eac3:"A_EAC3","pcm-u8":"A_PCM/INT/LIT","pcm-s16":"A_PCM/INT/LIT","pcm-s16be":"A_PCM/INT/BIG","pcm-s24":"A_PCM/INT/LIT","pcm-s24be":"A_PCM/INT/BIG","pcm-s32":"A_PCM/INT/LIT","pcm-s32be":"A_PCM/INT/BIG","pcm-f32":"A_PCM/FLOAT/IEEE","pcm-f64":"A_PCM/FLOAT/IEEE",webvtt:"S_TEXT/WEBVTT"},he=i=>{const t=i.filePos,e=gs(i,9),r=new G(e);if(r.readBits(12)!==4095||(r.skipBits(1),r.readBits(2)!==0))return null;const a=r.readBits(1),s=r.readBits(2)+1,o=r.readBits(4);if(o===15)return null;r.skipBits(1);const n=r.readBits(3);if(n===0)throw new Error("ADTS frames with channel configuration 0 are not supported.");r.skipBits(1),r.skipBits(1),r.skipBits(1),r.skipBits(1);const l=r.readBits(13);r.skipBits(11);const c=r.readBits(2)+1;if(c!==1)throw new Error("ADTS frames with more than one AAC frame are not supported.");let d=null;return a===1?i.filePos-=2:d=r.readBits(16),{objectType:s,samplingFrequencyIndex:o,channelConfiguration:n,frameLength:l,numberOfAacFrames:c,crcCheck:d,startPos:t}};var os=function(i,t,e){if(t!=null){if(typeof t!="object"&&typeof t!="function")throw new TypeError("Object expected.");var r,a;if(e){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(r===void 0){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose],e&&(a=r)}if(typeof r!="function")throw new TypeError("Object not disposable.");a&&(r=function(){try{a.call(this)}catch(s){return Promise.reject(s)}}),i.stack.push({value:t,dispose:r,async:e})}else e&&i.stack.push({async:!0});return t},ns=(function(i){return function(t){function e(s){t.error=t.hasError?new i(s,t.error,"An error was suppressed during disposal."):s,t.hasError=!0}var r,a=0;return(function s(){for(;r=t.stack.pop();)try{if(!r.async&&a===1)return a=0,t.stack.push(r),Promise.resolve().then(s);if(r.dispose){var o=r.dispose.call(r.value);if(r.async)return a|=2,Promise.resolve(o).then(s,function(n){return e(n),s()})}else a|=1}catch(n){e(n)}if(a===1)return t.hasError?Promise.reject(t.error):Promise.resolve();if(t.hasError)throw t.error})()}})(typeof SuppressedError=="function"?SuppressedError:function(i,t,e){var r=new Error(e);return r.name="SuppressedError",r.error=i,r.suppressed=t,r});Symbol.dispose??(Symbol.dispose=Symbol("Symbol.dispose"));let nr=-1/0,cr=-1/0,Dt=null;typeof FinalizationRegistry<"u"&&(Dt=new FinalizationRegistry(i=>{const t=performance.now();i.type==="video"?(t-nr>=1e3&&(console.error("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),nr=t),typeof VideoFrame<"u"&&i.data instanceof VideoFrame&&i.data.close()):(t-cr>=1e3&&(console.error("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),cr=t),typeof AudioData<"u"&&i.data instanceof AudioData&&i.data.close())}));class Rt{constructor(){this._referenceCount=0,this._lastAllocationBuffer=null}}const We=["I420","I420P10","I420P12","I420A","I420AP10","I420AP12","I422","I422P10","I422P12","I422A","I422AP10","I422AP12","I444","I444P10","I444P12","I444A","I444AP10","I444AP12","NV12","RGBA","RGBX","BGRA","BGRX"],cs=new Set(We);class it{get codedWidth(){return this.visibleRect.width}get codedHeight(){return this.visibleRect.height}get displayWidth(){return this.rotation%180==0?this.squarePixelWidth:this.squarePixelHeight}get displayHeight(){return this.rotation%180==0?this.squarePixelHeight:this.squarePixelWidth}get microsecondTimestamp(){return Math.trunc(Ut*this.timestamp)}get microsecondDuration(){return Math.trunc(Ut*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(t,e){var r,a,s,o,n,l,c,d;if(this._closed=!1,t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer||ArrayBuffer.isView(t)){if(!e||typeof e!="object")throw new TypeError("init must be an object.");if(e.format===void 0||!cs.has(e.format))throw new TypeError("init.format must be one of: "+We.join(", "));if(!Number.isInteger(e.codedWidth)||e.codedWidth<=0)throw new TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(e.codedHeight)||e.codedHeight<=0)throw new TypeError("init.codedHeight must be a positive integer.");if(e.rotation!==void 0&&![0,90,180,270].includes(e.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(e.timestamp))throw new TypeError("init.timestamp must be a number.");if(e.duration!==void 0&&(!Number.isFinite(e.duration)||e.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");if(e.layout!==void 0){if(!Array.isArray(e.layout))throw new TypeError("init.layout, when provided, must be an array.");for(const m of e.layout){if(!m||typeof m!="object"||Array.isArray(m))throw new TypeError("Each entry in init.layout must be an object.");if(!Number.isInteger(m.offset)||m.offset<0)throw new TypeError("plane.offset must be a non-negative integer.");if(!Number.isInteger(m.stride)||m.stride<0)throw new TypeError("plane.stride must be a non-negative integer.")}}if(e.visibleRect!==void 0&&Di(e.visibleRect,"init.visibleRect"),e.displayWidth!==void 0&&(!Number.isInteger(e.displayWidth)||e.displayWidth<=0))throw new TypeError("init.displayWidth, when provided, must be a positive integer.");if(e.displayHeight!==void 0&&(!Number.isInteger(e.displayHeight)||e.displayHeight<=0))throw new TypeError("init.displayHeight, when provided, must be a positive integer.");if(e.displayWidth!==void 0!=(e.displayHeight!==void 0))throw new TypeError("init.displayWidth and init.displayHeight must be either both provided or both omitted.");this._data=Z(t).slice(),this._layout=e.layout??hs(e.format,e.codedWidth,e.codedHeight),this.format=e.format,this.rotation=e.rotation??0,this.timestamp=e.timestamp,this.duration=e.duration??0;let h=e.colorSpace??null;h===null&&(h=this.format==="RGBA"||this.format==="RGBX"||this.format==="BGRA"||this.format==="BGRX"?{primaries:"bt709",transfer:"iec61966-2-1",matrix:"rgb",fullRange:!0}:{primaries:"bt709",transfer:"bt709",matrix:"bt709",fullRange:!1}),this.colorSpace=new Ue(h),this.visibleRect={left:((r=e.visibleRect)==null?void 0:r.left)??0,top:((a=e.visibleRect)==null?void 0:a.top)??0,width:((s=e.visibleRect)==null?void 0:s.width)??e.codedWidth,height:((o=e.visibleRect)==null?void 0:o.height)??e.codedHeight},e.displayWidth!==void 0?(this.squarePixelWidth=this.rotation%180==0?e.displayWidth:e.displayHeight,this.squarePixelHeight=this.rotation%180==0?e.displayHeight:e.displayWidth):(this.squarePixelWidth=this.visibleRect.width,this.squarePixelHeight=this.visibleRect.height)}else if(typeof VideoFrame<"u"&&t instanceof VideoFrame){if((e==null?void 0:e.rotation)!==void 0&&![0,90,180,270].includes(e.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if((e==null?void 0:e.timestamp)!==void 0&&!Number.isFinite(e==null?void 0:e.timestamp))throw new TypeError("init.timestamp, when provided, must be a number.");if((e==null?void 0:e.duration)!==void 0&&(!Number.isFinite(e.duration)||e.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");(e==null?void 0:e.visibleRect)!==void 0&&Di(e.visibleRect,"init.visibleRect"),this._data=t,this._layout=null,this.format=t.format,this.visibleRect={left:((n=t.visibleRect)==null?void 0:n.x)??0,top:((l=t.visibleRect)==null?void 0:l.y)??0,width:((c=t.visibleRect)==null?void 0:c.width)??t.codedWidth,height:((d=t.visibleRect)==null?void 0:d.height)??t.codedHeight},this.rotation=(e==null?void 0:e.rotation)??0,this.squarePixelWidth=t.displayWidth,this.squarePixelHeight=t.displayHeight,this.timestamp=(e==null?void 0:e.timestamp)??t.timestamp/1e6,this.duration=(e==null?void 0:e.duration)??(t.duration??0)/1e6,this.colorSpace=new Ue(t.colorSpace)}else if(typeof HTMLImageElement<"u"&&t instanceof HTMLImageElement||typeof SVGImageElement<"u"&&t instanceof SVGImageElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap||typeof HTMLVideoElement<"u"&&t instanceof HTMLVideoElement||typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&t instanceof OffscreenCanvas){if(!e||typeof e!="object")throw new TypeError("init must be an object.");if(e.rotation!==void 0&&![0,90,180,270].includes(e.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(e.timestamp))throw new TypeError("init.timestamp must be a number.");if(e.duration!==void 0&&(!Number.isFinite(e.duration)||e.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");if(typeof VideoFrame<"u")return new it(new VideoFrame(t,{timestamp:Math.trunc(e.timestamp*Ut),duration:Math.trunc((e.duration??0)*Ut)||void 0}),e);let h=0,m=0;if("naturalWidth"in t?(h=t.naturalWidth,m=t.naturalHeight):"videoWidth"in t?(h=t.videoWidth,m=t.videoHeight):"width"in t&&(h=Number(t.width),m=Number(t.height)),!h||!m)throw new TypeError("Could not determine dimensions.");const u=new OffscreenCanvas(h,m),p=u.getContext("2d",{alpha:Fi(),willReadFrequently:!0});w(p),p.drawImage(t,0,0),this._data=u,this._layout=null,this.format="RGBX",this.visibleRect={left:0,top:0,width:h,height:m},this.squarePixelWidth=h,this.squarePixelHeight=m,this.rotation=e.rotation??0,this.timestamp=e.timestamp,this.duration=e.duration??0,this.colorSpace=new Ue({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else{if(!(t instanceof Rt))throw new TypeError("Invalid data type: Must be a BufferSource, CanvasImageSource, or VideoSampleResource.");if(!e||typeof e!="object")throw new TypeError("init must be an object.");if(e.rotation!==void 0&&![0,90,180,270].includes(e.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(e.timestamp))throw new TypeError("init.timestamp must be a number.");if(e.duration!==void 0&&(!Number.isFinite(e.duration)||e.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");if(this._data=t,t._referenceCount++,this.format=t.getFormat(),this.format!==null&&!We.includes(this.format))throw new TypeError("getFormat() must return a VideoSamplePixelFormat or null.");if(this.visibleRect={left:0,top:0,width:t.getCodedWidth(),height:t.getCodedHeight()},!Number.isInteger(this.visibleRect.width)||this.visibleRect.width<=0)throw new TypeError("getCodedWidth() must return a positive integer.");if(!Number.isInteger(this.visibleRect.height)||this.visibleRect.height<=0)throw new TypeError("getCodedHeight() must return a positive integer.");if(this.squarePixelWidth=t.getSquarePixelWidth(),!Number.isInteger(this.squarePixelWidth)||this.squarePixelWidth<=0)throw new TypeError("getSquarePixelWidth() must return a positive integer.");if(this.squarePixelHeight=t.getSquarePixelHeight(),!Number.isInteger(this.squarePixelHeight)||this.squarePixelHeight<=0)throw new TypeError("getSquarePixelHeight() must return a positive integer.");this.rotation=e.rotation??0,this.timestamp=e.timestamp,this.duration=e.duration??0,this.colorSpace=t.getColorSpace()}this.pixelAspectRatio=Fe({num:this.squarePixelWidth*this.codedHeight,den:this.squarePixelHeight*this.codedWidth}),Dt==null||Dt.register(this,{type:"video",data:this._data},this)}clone(){if(this._closed)throw new Error("VideoSample is closed.");return w(this._data!==null),this._data instanceof Rt?new it(this._data,{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):Yt(this._data)?new it(this._data.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation}):this._data instanceof Uint8Array?(w(this._layout),new it(this._data,{format:this.format,layout:this._layout,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation,visibleRect:this.visibleRect,displayWidth:this.displayWidth,displayHeight:this.displayHeight})):new it(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation,visibleRect:this.visibleRect,displayWidth:this.displayWidth,displayHeight:this.displayHeight})}close(){this._closed||(Dt==null||Dt.unregister(this),this._data instanceof Rt?(this._data._referenceCount--,this._data._referenceCount===0&&this._data.close()):Yt(this._data)?this._data.close():this._data=null,this._closed=!0)}allocationSize(t={}){if(hr(t),this._closed)throw new Error("VideoSample is closed.");if((t.format??this.format)==null)throw new Error("Cannot get allocation size when format is null.");return Yt(this._data)?this._data.allocationSize(t):ur(this,t).allocationSize}async copyTo(t,e={}){if(!Se(t))throw new TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(hr(e),this._closed)throw new Error("VideoSample is closed.");if((e.format??this.format)==null)throw new Error("Cannot copy video sample data when format is null.");if(w(this._data!==null),Yt(this._data))return this._data.copyTo(t,e);if(e.format&&!["RGBA","RGBX","BGRA","BGRX"].includes(this.format)&&["RGBA","RGBX","BGRA","BGRX"].includes(e.format)){if(!(this._data instanceof Rt)){if(typeof VideoFrame>"u")throw new Error("For this sample, converting from a non-RGB to an RGB format requires VideoFrame to be defined.");const c=this.toVideoFrame(),d=await c.copyTo(t,e);return c.close(),d}{const c={stack:[],error:void 0,hasError:!1};try{const d=os(c,await this._data.toRgbSample({timestamp:this.timestamp,duration:this.duration,rotation:this.rotation},e.colorSpace??"srgb"),!1);if(!(d instanceof it))throw new TypeError("toRgbSample() must return a VideoSample.");if(!["RGBA","RGBX","BGRA","BGRX"].includes(d.format))throw new Error(`Sample returned by toRgbSample was expected to have an RGB format, got '${d.format}' instead.`);return await d.copyTo(t,e)}catch(d){c.error=d,c.hasError=!0}finally{ns(c)}}}const r=ur(this,e);w(this.format);const a=Z(t);if(a.byteLength<r.allocationSize)throw new TypeError(`Destination buffer too small. Required: ${r.allocationSize}, Available: ${a.byteLength}`);const s=ue(this.format);let o;if(this._data instanceof Rt){let c=this._data.getDataPlanes();if(c instanceof Promise&&(c=await c),!Array.isArray(c)||c.some(d=>!(d.data instanceof Uint8Array)||!Number.isInteger(d.stride)||d.stride<0))throw new TypeError('getDataPlanes() must return an array of objects with a Uint8Array "data" property and a non-negative integer "stride" property.');o=c}else if(this._data instanceof Uint8Array)w(this._layout),w(this._layout.length===s.length),o=this._layout.map((c,d)=>{const h=Math.ceil(this.codedHeight/s[d].heightDivisor);return{data:this._data.subarray(c.offset,c.offset+c.stride*h),stride:c.stride}});else{const c=this._data.getContext("2d");w(c);const d=c.getImageData(0,0,this.codedWidth,this.codedHeight);o=[{data:Z(d.data),stride:4*this.codedWidth}]}const n=[],l=s.length;for(let c=0;c<l;c++){const d=r.computedLayouts[c],h=o[c].stride,m=o[c].data;let u=d.sourceTop*h;u+=d.sourceLeftBytes;let p=d.destinationOffset;const f=d.sourceWidthBytes,b={offset:p,stride:d.destinationStride};for(let y=0;y<d.sourceHeight;y++){if(u+f>m.byteLength)throw new Error("Source buffer OOB read.");if(p+f>a.byteLength)throw new Error("Destination buffer OOB write.");const _=m.subarray(u,u+f);a.set(_,p),u+=h,p+=d.destinationStride}n.push(b)}if(e.format!==void 0){const c=this.format.startsWith("RGB")!==e.format.startsWith("RGB"),d=this.format.includes("X")&&e.format.includes("A");if(c||d)for(let h=0;h<r.allocationSize;h+=4){if(c){const m=a[h],u=a[h+2];a[h]=u,a[h+2]=m}d&&(a[h+3]=255)}}return n}toVideoFrame(){if(this._closed)throw new Error("VideoSample is closed.");if(w(this._data!==null),this._data instanceof Rt){if(this.format===null)throw new Error("Cannot convert a VideoSampleResource-backed VideoSample to VideoFrame if format is null.");const t=this._data.getDataPlanes();if(t instanceof Promise)throw new Error("Cannot convert a VideoSampleResource-backed VideoSample to VideoFrame if getDataPlanes() returns a promise.");const e=t.reduce((o,n)=>o+n.data.byteLength,0),r=new Uint8Array(e);let a=0;const s=[];for(const o of t)r.set(o.data,a),s.push(a),a+=o.data.byteLength;return new VideoFrame(r,{format:this.format,layout:t.map((o,n)=>({offset:s[n],stride:o.stride})),codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration,colorSpace:this.colorSpace,displayWidth:this.squarePixelWidth,displayHeight:this.squarePixelHeight})}return Yt(this._data)?new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this._data instanceof Uint8Array?new VideoFrame(this._data,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace,displayWidth:this.squarePixelWidth,displayHeight:this.squarePixelHeight}):new VideoFrame(this._data,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(t,e,r,a,s,o,n,l,c){let d=0,h=0,m=this.displayWidth,u=this.displayHeight,p=0,f=0,b=this.displayWidth,y=this.displayHeight;if(o!==void 0?(d=e,h=r,m=a,u=s,p=o,f=n,l!==void 0?(b=l,y=c):(b=m,y=u)):(p=e,f=r,a!==void 0&&(b=a,y=s)),!(typeof CanvasRenderingContext2D<"u"&&t instanceof CanvasRenderingContext2D||typeof OffscreenCanvasRenderingContext2D<"u"&&t instanceof OffscreenCanvasRenderingContext2D))throw new TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(d))throw new TypeError("sx must be a number.");if(!Number.isFinite(h))throw new TypeError("sy must be a number.");if(!Number.isFinite(m)||m<0)throw new TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(u)||u<0)throw new TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(p))throw new TypeError("dx must be a number.");if(!Number.isFinite(f))throw new TypeError("dy must be a number.");if(!Number.isFinite(b)||b<0)throw new TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(y)||y<0)throw new TypeError("dHeight must be a non-negative number.");if(this._closed)throw new Error("VideoSample is closed.");({sx:d,sy:h,sWidth:m,sHeight:u}=this._rotateSourceRegion(d,h,m,u,this.rotation));const _=this.toCanvasImageSource();t.save();const T=p+b/2,S=f+y/2;t.translate(T,S),t.rotate(this.rotation*Math.PI/180);const A=this.rotation%180==0?1:b/y;t.scale(1/A,A),t.drawImage(_,d,h,m,u,-b/2,-y/2,b,y),t.restore()}drawWithFit(t,e){var _,T,S,A;if(!(typeof CanvasRenderingContext2D<"u"&&t instanceof CanvasRenderingContext2D||typeof OffscreenCanvasRenderingContext2D<"u"&&t instanceof OffscreenCanvasRenderingContext2D))throw new TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!e||typeof e!="object")throw new TypeError("options must be an object.");if(!["fill","contain","cover"].includes(e.fit))throw new TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(e.rotation!==void 0&&![0,90,180,270].includes(e.rotation))throw new TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");e.crop!==void 0&&$e(e.crop,"options.");const r=t.canvas.width,a=t.canvas.height,s=e.rotation??this.rotation,[o,n]=s%180==0?[this.squarePixelWidth,this.squarePixelHeight]:[this.squarePixelHeight,this.squarePixelWidth];let l,c,d,h,m=e.crop;m&&(m=lr(m,o,n));const{sx:u,sy:p,sWidth:f,sHeight:b}=this._rotateSourceRegion(((_=e.crop)==null?void 0:_.left)??0,((T=e.crop)==null?void 0:T.top)??0,((S=e.crop)==null?void 0:S.width)??o,((A=e.crop)==null?void 0:A.height)??n,s);if(e.fit==="fill")l=0,c=0,d=r,h=a;else{const[E,C]=e.crop?[e.crop.width,e.crop.height]:[o,n],I=e.fit==="contain"?Math.min(r/E,a/C):Math.max(r/E,a/C);d=E*I,h=C*I,l=(r-d)/2,c=(a-h)/2}t.save();const y=s%180==0?1:d/h;t.translate(r/2,a/2),t.rotate(s*Math.PI/180),t.scale(1/y,y),t.translate(-r/2,-a/2),t.drawImage(this.toCanvasImageSource(),u,p,f,b,l,c,d,h),t.restore()}_rotateSourceRegion(t,e,r,a,s){return s===90?[t,e,r,a]=[e,this.squarePixelHeight-t-r,a,r]:s===180?[t,e]=[this.squarePixelWidth-t-r,this.squarePixelHeight-e-a]:s===270&&([t,e,r,a]=[this.squarePixelWidth-e-a,t,a,r]),{sx:t,sy:e,sWidth:r,sHeight:a}}toCanvasImageSource(){if(this._closed)throw new Error("VideoSample is closed.");if(w(this._data!==null),this._data instanceof Rt||this._data instanceof Uint8Array){const t=this.toVideoFrame();return queueMicrotask(()=>t.close()),t}return this._data}async transform(t){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.width!==void 0&&(!Number.isInteger(t.width)||t.width<=0))throw new TypeError("options.width, when provided, must be a positive integer.");if(t.height!==void 0&&(!Number.isInteger(t.height)||t.height<=0))throw new TypeError("options.height, when provided, must be a positive integer.");if(t.roundDimensionsTo!==void 0&&(!Number.isInteger(t.roundDimensionsTo)||t.roundDimensionsTo<=0))throw new TypeError("options.roundDimensionsTo, when provided, must be a positive integer.");if(t.fit!==void 0&&!["fill","contain","cover"].includes(t.fit))throw new TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(t.width!==void 0&&t.height!==void 0&&t.fit===void 0)throw new TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(t.rotate!==void 0&&![0,90,180,270].includes(t.rotate))throw new TypeError("options.rotate, when provided, must be 0, 90, 180 or 270.");if(t.crop!==void 0&&$e(t.crop,"options."),t.alpha!==void 0&&!["keep","discard"].includes(t.alpha))throw new TypeError("options.alpha, when provided, must be 'keep' or 'discard'.");const e=Ci(this.rotation+(t.rotate??0)),[r,a]=e%180==0?[this.squarePixelWidth,this.squarePixelHeight]:[this.squarePixelHeight,this.squarePixelWidth];let s=t.crop;s&&(s=lr(s,r,a));const o=s?s.width:r,n=s?s.height:a,l=o/n;let c,d;t.width!==void 0&&t.height===void 0?(c=t.width,d=c/l):t.width===void 0&&t.height!==void 0?(d=t.height,c=d*l):t.width!==void 0&&t.height!==void 0?(c=t.width,d=t.height):(c=o,d=n),c=Mi(c,t.roundDimensionsTo??1),d=Mi(d,t.roundDimensionsTo??1);const h={width:c,height:d,fit:t.fit??"fill",rotation:e,crop:s??{left:0,top:0,width:r,height:a},alpha:t.alpha??"keep"};for(const f of ds){let b=f(this,h);if(b instanceof Promise&&(b=await b),b!==null)return b}let m=null,u=!1;for(const f of Qt)if(f.canvas.width===h.width&&f.canvas.height===h.height){m=f.canvas,f.age=dr++;break}if(m===null){if(typeof OffscreenCanvas<"u")m=new OffscreenCanvas(h.width,h.height);else{if(typeof window>"u"||typeof document>"u")throw new Error("Cannot transform VideoSamples in this environment. Either run in an environment with OffscreenCanvas or HTMLCanvasElement, or supply a custom VideoSample transformer using registerVideoSampleTransformer().");m=document.createElement("canvas"),m.width=h.width,m.height=h.height}u=!0,Qt.length>=ls&&Qt.splice(((f,b)=>{let y=-1,_=1/0;for(let T=0;T<f.length;T++){const S=b(f[T]);S<_&&(_=S,y=T)}return y})(Qt,f=>f.age),1),Qt.push({canvas:m,age:dr++})}const p=m.getContext("2d",{alpha:!0});return w(p),h.alpha==="discard"?(p.fillStyle="black",p.fillRect(0,0,h.width,h.height)):u||p.clearRect(0,0,h.width,h.height),this.drawWithFit(p,{fit:h.fit,rotation:h.rotation,crop:h.crop}),new it(m,{timestamp:this.timestamp,duration:this.duration,rotation:0})}setRotation(t){if(![0,90,180,270].includes(t))throw new TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=t}setTimestamp(t){if(!Number.isFinite(t))throw new TypeError("newTimestamp must be a number.");this.timestamp=t}setDuration(t){if(!Number.isFinite(t)||t<0)throw new TypeError("newDuration must be a non-negative number.");this.duration=t}[Symbol.dispose](){this.close()}}const ds=[],ls=3,Qt=[];let dr=0;class Ue{constructor(t){if(t!==void 0){if(!t||typeof t!="object")throw new TypeError("init.colorSpace, when provided, must be an object.");const e=Object.keys(Ht);if(t.primaries!=null&&!e.includes(t.primaries))throw new TypeError(`init.colorSpace.primaries, when provided, must be one of ${e.join(", ")}.`);const r=Object.keys(Nt);if(t.transfer!=null&&!r.includes(t.transfer))throw new TypeError(`init.colorSpace.transfer, when provided, must be one of ${r.join(", ")}.`);const a=Object.keys(jt);if(t.matrix!=null&&!a.includes(t.matrix))throw new TypeError(`init.colorSpace.matrix, when provided, must be one of ${a.join(", ")}.`);if(t.fullRange!=null&&typeof t.fullRange!="boolean")throw new TypeError("init.colorSpace.fullRange, when provided, must be a boolean.")}this.primaries=(t==null?void 0:t.primaries)??null,this.transfer=(t==null?void 0:t.transfer)??null,this.matrix=(t==null?void 0:t.matrix)??null,this.fullRange=(t==null?void 0:t.fullRange)??null}toJSON(){return{primaries:this.primaries,transfer:this.transfer,matrix:this.matrix,fullRange:this.fullRange}}}const Yt=i=>typeof VideoFrame<"u"&&i instanceof VideoFrame,lr=(i,t,e)=>{const r=Math.min(i.left,t),a=Math.min(i.top,e),s=Math.min(i.width,t-r),o=Math.min(i.height,e-a);return w(s>=0),w(o>=0),{left:r,top:a,width:s,height:o}},$e=(i,t)=>{if(!i||typeof i!="object")throw new TypeError(t+"crop, when provided, must be an object.");if(!Number.isInteger(i.left)||i.left<0)throw new TypeError(t+"crop.left must be a non-negative integer.");if(!Number.isInteger(i.top)||i.top<0)throw new TypeError(t+"crop.top must be a non-negative integer.");if(!Number.isInteger(i.width)||i.width<0)throw new TypeError(t+"crop.width must be a non-negative integer.");if(!Number.isInteger(i.height)||i.height<0)throw new TypeError(t+"crop.height must be a non-negative integer.")},hr=i=>{if(!i||typeof i!="object")throw new TypeError("options must be an object.");if(i.colorSpace!==void 0&&!["display-p3","srgb"].includes(i.colorSpace))throw new TypeError("options.colorSpace, when provided, must be 'display-p3' or 'srgb'.");if(i.format!==void 0&&typeof i.format!="string")throw new TypeError("options.format, when provided, must be a string.");if(i.layout!==void 0){if(!Array.isArray(i.layout))throw new TypeError("options.layout, when provided, must be an array.");for(const t of i.layout){if(!t||typeof t!="object")throw new TypeError("Each entry in options.layout must be an object.");if(!Number.isInteger(t.offset)||t.offset<0)throw new TypeError("plane.offset must be a non-negative integer.");if(!Number.isInteger(t.stride)||t.stride<0)throw new TypeError("plane.stride must be a non-negative integer.")}}if(i.rect!==void 0){if(!i.rect||typeof i.rect!="object")throw new TypeError("options.rect, when provided, must be an object.");if(i.rect.x!==void 0&&(!Number.isInteger(i.rect.x)||i.rect.x<0))throw new TypeError("options.rect.x, when provided, must be a non-negative integer.");if(i.rect.y!==void 0&&(!Number.isInteger(i.rect.y)||i.rect.y<0))throw new TypeError("options.rect.y, when provided, must be a non-negative integer.");if(i.rect.width!==void 0&&(!Number.isInteger(i.rect.width)||i.rect.width<0))throw new TypeError("options.rect.width, when provided, must be a non-negative integer.");if(i.rect.height!==void 0&&(!Number.isInteger(i.rect.height)||i.rect.height<0))throw new TypeError("options.rect.height, when provided, must be a non-negative integer.")}},hs=(i,t,e)=>{const r=ue(i),a=[];let s=0;for(const o of r){const n=Math.ceil(t/o.widthDivisor),l=Math.ceil(e/o.heightDivisor),c=n*o.sampleBytes,d=c*l;a.push({offset:s,stride:c}),s+=d}return a},ue=i=>{const t=(e,r,a,s,o)=>{const n=[{sampleBytes:e,widthDivisor:1,heightDivisor:1},{sampleBytes:r,widthDivisor:a,heightDivisor:s},{sampleBytes:r,widthDivisor:a,heightDivisor:s}];return o&&n.push({sampleBytes:e,widthDivisor:1,heightDivisor:1}),n};switch(i){case"I420":return t(1,1,2,2,!1);case"I420P10":case"I420P12":return t(2,2,2,2,!1);case"I420A":return t(1,1,2,2,!0);case"I420AP10":case"I420AP12":return t(2,2,2,2,!0);case"I422":return t(1,1,2,1,!1);case"I422P10":case"I422P12":return t(2,2,2,1,!1);case"I422A":return t(1,1,2,1,!0);case"I422AP10":case"I422AP12":return t(2,2,2,1,!0);case"I444":return t(1,1,1,1,!1);case"I444P10":case"I444P12":return t(2,2,1,1,!1);case"I444A":return t(1,1,1,1,!0);case"I444AP10":case"I444AP12":return t(2,2,1,1,!0);case"NV12":return[{sampleBytes:1,widthDivisor:1,heightDivisor:1},{sampleBytes:2,widthDivisor:2,heightDivisor:2}];case"RGBA":case"RGBX":case"BGRA":case"BGRX":return[{sampleBytes:4,widthDivisor:1,heightDivisor:1}];default:Wt(i),w(!1)}},ur=(i,t)=>{const e={left:0,top:0,width:i.codedWidth,height:i.codedHeight},r=t.rect,a=us(e,r,i.codedWidth,i.codedHeight,i.format),s=t.layout;let o;if(t.format&&t.format!==i.format){if(!["RGBA","RGBX","BGRA","BGRX"].includes(t.format))throw new Error("NotSupportedError: Invalid destination format.");o=t.format}else o=i.format;return ps(a,o,s)},us=(i,t,e,r,a)=>{const s={...i};if(t!==void 0){if(t.width===0||t.height===0)throw new TypeError("visibleRect dimensions cannot be zero.");if((t.x||0)+(t.width||0)>e)throw new TypeError("visibleRect exceeds codedWidth.");if((t.y||0)+(t.height||0)>r)throw new TypeError("visibleRect exceeds codedHeight.");s.x=t.x||0,s.y=t.y||0,s.width=t.width||0,s.height=t.height||0}if(!ms(a,s))throw new TypeError("visibleRect alignment is invalid for the format.");return s},ms=(i,t)=>{if(i===null)return!0;const e=ue(i);for(let r=0;r<e.length;r++){const a=e[r],s=a.widthDivisor,o=a.heightDivisor;if((t.x||0)%s!==0||(t.y||0)%o!==0)return!1}return!0},ps=(i,t,e)=>{const r=ue(t),a=r.length;if(e!==void 0&&e.length!==a)throw new TypeError(`Layout must have ${a} planes.`);let s=0;const o=[],n=[];for(let l=0;l<a;l++){const c=r[l],d=c.sampleBytes,h=c.widthDivisor,m=c.heightDivisor,u={destinationOffset:0,destinationStride:0,sourceTop:0,sourceHeight:0,sourceLeftBytes:0,sourceWidthBytes:0};if(u.sourceTop=Math.ceil(Math.trunc(i.y||0)/m),u.sourceHeight=Math.ceil(Math.trunc(i.height||0)/m),u.sourceLeftBytes=Math.floor(Math.trunc(i.x||0)/h)*d,u.sourceWidthBytes=Math.floor(Math.trunc(i.width||0)/h)*d,e!==void 0){const f=e[l];if(f.stride<u.sourceWidthBytes)throw new TypeError(`Stride for plane ${l} is too small.`);u.destinationOffset=f.offset,u.destinationStride=f.stride}else u.destinationOffset=s,u.destinationStride=u.sourceWidthBytes;const p=u.destinationStride*u.sourceHeight+u.destinationOffset;if(p>4294967295)throw new TypeError("Allocation size exceeds limit.");n.push(p),s=Math.max(s,p);for(let f=0;f<l;f++){const b=o[f];if(!(n[l]<=b.destinationOffset||n[f]<=u.destinationOffset))throw new TypeError("Planes overlap.")}o.push(u)}return{allocationSize:s,computedLayouts:o}},mr=new Map,pr=(i,t)=>{if(!t||typeof t!="object")throw new TypeError("Encoding options must be an object.");if(t.alpha!==void 0&&!["discard","keep"].includes(t.alpha))throw new TypeError("options.alpha, when provided, must be 'discard' or 'keep'.");if(t.bitrateMode!==void 0&&!["constant","variable"].includes(t.bitrateMode))throw new TypeError("bitrateMode, when provided, must be 'constant' or 'variable'.");if(t.latencyMode!==void 0&&!["quality","realtime"].includes(t.latencyMode))throw new TypeError("latencyMode, when provided, must be 'quality' or 'realtime'.");if(t.fullCodecString!==void 0&&typeof t.fullCodecString!="string")throw new TypeError("fullCodecString, when provided, must be a string.");if(t.fullCodecString!==void 0&&((e=t.fullCodecString).startsWith("avc1")||e.startsWith("avc3")?"avc":e.startsWith("hev1")||e.startsWith("hvc1")?"hevc":e==="vp8"?"vp8":e.startsWith("vp09")?"vp9":e.startsWith("av01")?"av1":e==="mp3"||e==="mp4a.69"||e==="mp4a.6B"||e==="mp4a.6b"||e==="mp4a.40.34"?"mp3":e.startsWith("mp4a.40.")||e==="mp4a.67"?"aac":e==="opus"?"opus":e==="vorbis"?"vorbis":e==="flac"?"flac":e==="ac-3"||e==="ac3"?"ac3":e==="ec-3"||e==="eac3"?"eac3":e==="ulaw"?"ulaw":e==="alaw"?"alaw":Ni.test(e)?e:e==="webvtt"?"webvtt":null)!==i)throw new TypeError(`fullCodecString, when provided, must be a string that matches the specified codec (${i}).`);var e;if(t.hardwareAcceleration!==void 0&&!["no-preference","prefer-hardware","prefer-software"].includes(t.hardwareAcceleration))throw new TypeError("hardwareAcceleration, when provided, must be 'no-preference', 'prefer-hardware' or 'prefer-software'.");if(t.scalabilityMode!==void 0&&typeof t.scalabilityMode!="string")throw new TypeError("scalabilityMode, when provided, must be a string.");if(t.contentHint!==void 0&&typeof t.contentHint!="string")throw new TypeError("contentHint, when provided, must be a string.")},fr=i=>{const t=i.bitrate instanceof ze?i.bitrate._toVideoBitrate(i.codec,i.width,i.height):i.bitrate;return{codec:i.fullCodecString??Oa(i.codec,i.width,i.height,t),width:i.width,height:i.height,displayWidth:i.squarePixelWidth,displayHeight:i.squarePixelHeight,bitrate:t,bitrateMode:i.bitrateMode,alpha:i.alpha??"discard",framerate:i.framerate,latencyMode:i.latencyMode,hardwareAcceleration:i.hardwareAcceleration,scalabilityMode:i.scalabilityMode,contentHint:i.contentHint,...(e=i.codec,e==="avc"?{avc:{format:"avc"}}:e==="hevc"?{hevc:{format:"hevc"}}:{})};var e};class ze{constructor(t){this._factor=t}_toVideoBitrate(t,e,r){const a=e*r,s=3e6*Math.pow(a/2073600,.95)*{avc:1,hevc:.6,vp9:.6,av1:.4,vp8:1.2}[t]*this._factor;return 1e3*Math.ceil(s/1e3)}_toAudioBitrate(t){if(vt.includes(t)||t==="flac")return;const e={aac:128e3,opus:64e3,mp3:16e4,vorbis:64e3,ac3:384e3,eac3:192e3}[t];if(!e)throw new Error(`Unhandled codec: ${t}`);let r=e*this._factor;return t==="aac"?r=[96e3,128e3,16e4,192e3].reduce((a,s)=>Math.abs(s-r)<Math.abs(a-r)?s:a):t==="opus"||t==="vorbis"?r=Math.max(6e3,r):t==="mp3"&&(r=[8e3,16e3,24e3,32e3,4e4,48e3,64e3,8e4,96e3,112e3,128e3,16e4,192e3,224e3,256e3,32e4].reduce((a,s)=>Math.abs(s-r)<Math.abs(a-r)?s:a)),1e3*Math.round(r/1e3)}}const fs=async(i,t={})=>{const{width:e=1280,height:r=720,bitrate:a=1e6,...s}=t;if(!ct.includes(i))return!1;if(!Number.isInteger(e)||e<=0)throw new TypeError("width must be a positive integer.");if(!Number.isInteger(r)||r<=0)throw new TypeError("height must be a positive integer.");if(!(a instanceof ze)&&(!Number.isInteger(a)||a<=0))throw new TypeError("bitrate must be a positive integer or a quality.");pr(i,s);const o=fr({codec:i,width:e,height:r,bitrate:a,framerate:void 0,...s,alpha:"discard"}),n=JSON.stringify(o),l=mr.get(n);if(l)return l;const c=(async()=>gr.some(d=>d.supports(i,o))?!0:typeof VideoEncoder>"u"||(e%2==1||r%2==1)&&(i==="avc"||i==="hevc")?!1:!!(await VideoEncoder.isConfigSupported(o)).supported&&(!Fi()||new Promise(async d=>{try{const h=new VideoEncoder({output:()=>{},error:()=>d(!1)});h.configure(o);const m=new Uint8Array(e*r*4),u=new VideoFrame(m,{format:"RGBA",codedWidth:e,codedHeight:r,timestamp:0});h.encode(u),u.close(),await h.flush(),d(!0)}catch{d(!1)}})))();return mr.set(n,c),c},gr=[];class Vt{constructor(t,e,r,a,s){this.bytes=t,this.view=e,this.offset=r,this.start=a,this.end=s,this.bufferPos=a-r}static tempFromBytes(t){return new Vt(t,Ei(t),0,0,t.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(t){this.bufferPos=t-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(t){this.bufferPos+=t}slice(t,e=this.end-t){if(t<this.start||t+e>this.end)throw new RangeError("Slicing outside of original slice.");return new Vt(this.bytes,this.view,this.offset,t,t+e)}}const gs=(i,t)=>{((r,a)=>{if(r.filePos<r.start||r.filePos+a>r.end)throw new RangeError(`Tried reading [${r.filePos}, ${r.filePos+a}), but slice is [${r.start}, ${r.end}). This is likely an internal error, please report it alongside the file that caused it.`)})(i,t);const e=i.bytes.subarray(i.bufferPos,i.bufferPos+t);return i.bufferPos+=t,e};class wr{constructor(t){this.mutex=new Bi,this.trackTimestampInfo=new WeakMap,this.output=t}onTrackClose(t){}validateTimestamp(t,e,r){if(e<0)throw new Error(`Timestamps must be non-negative (got ${e}s).`);let a=this.trackTimestampInfo.get(t);if(a){if(r&&(a.maxTimestampBeforeLastKeyPacket=a.maxTimestamp),a.maxTimestampBeforeLastKeyPacket!==null&&e<a.maxTimestampBeforeLastKeyPacket)throw new Error(`Timestamps cannot be smaller than the largest timestamp of the previous GOP (a GOP begins with a key packet and ends right before the next key packet). Got ${e}s, but largest timestamp is ${a.maxTimestampBeforeLastKeyPacket}s.`);a.maxTimestamp=Math.max(a.maxTimestamp,e)}else{if(!r)throw new Error("First packet must be a key packet.");a={maxTimestamp:e,maxTimestampBeforeLastKeyPacket:null},this.trackTimestampInfo.set(t,a)}}}const me=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,ws=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,br=i=>{const t=Math.floor(i/36e5),e=Math.floor(i%36e5/6e4),r=Math.floor(i%6e4/1e3),a=i%1e3;return t.toString().padStart(2,"0")+":"+e.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+a.toString().padStart(3,"0")};class pe{constructor(t){this.writer=t,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap}writeU32(t){this.helperView.setUint32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(t){this.helperView.setUint32(0,Math.floor(t/2**32),!1),this.helperView.setUint32(4,t,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(t){for(let e=0;e<t.length;e++)this.helperView.setUint8(e%8,t.charCodeAt(e)),e%8==7&&this.writer.write(this.helper);t.length%8!=0&&this.writer.write(this.helper.subarray(0,t.length%8))}writeBox(t){if(this.offsets.set(t,this.writer.getPos()),t.contents&&!t.children)this.writeBoxHeader(t,t.size??t.contents.byteLength+8),this.writer.write(t.contents);else{const e=this.writer.getPos();if(this.writeBoxHeader(t,0),t.contents&&this.writer.write(t.contents),t.children)for(const s of t.children)s&&this.writeBox(s);const r=this.writer.getPos(),a=t.size??r-e;this.writer.seek(e),this.writeBoxHeader(t,a),this.writer.seek(r)}}writeBoxHeader(t,e){this.writeU32(t.largeSize?1:e),this.writeAscii(t.type),t.largeSize&&this.writeU64(e)}measureBoxHeader(t){return 8+(t.largeSize?8:0)}patchBox(t){const e=this.offsets.get(t);w(e!==void 0);const r=this.writer.getPos();this.writer.seek(e),this.writeBox(t),this.writer.seek(r)}measureBox(t){if(t.contents&&!t.children)return this.measureBoxHeader(t)+t.contents.byteLength;{let e=this.measureBoxHeader(t);if(t.contents&&(e+=t.contents.byteLength),t.children)for(const r of t.children)r&&(e+=this.measureBox(r));return e}}}const F=new Uint8Array(8),rt=new DataView(F.buffer),z=i=>[(i%256+256)%256],P=i=>(rt.setUint16(0,i,!1),[F[0],F[1]]),He=i=>(rt.setInt16(0,i,!1),[F[0],F[1]]),yr=i=>(rt.setUint32(0,i,!1),[F[1],F[2],F[3]]),x=i=>(rt.setUint32(0,i,!1),[F[0],F[1],F[2],F[3]]),_t=i=>(rt.setInt32(0,i,!1),[F[0],F[1],F[2],F[3]]),gt=i=>(rt.setUint32(0,Math.floor(i/2**32),!1),rt.setUint32(4,i,!1),[F[0],F[1],F[2],F[3],F[4],F[5],F[6],F[7]]),bs=i=>(rt.setInt32(0,Math.floor(i/2**32),!1),rt.setUint32(4,i,!1),[F[0],F[1],F[2],F[3],F[4],F[5],F[6],F[7]]),vr=i=>(rt.setInt16(0,256*i,!1),[F[0],F[1]]),dt=i=>(rt.setInt32(0,65536*i,!1),[F[0],F[1],F[2],F[3]]),Ne=i=>(rt.setInt32(0,2**30*i,!1),[F[0],F[1],F[2],F[3]]),je=(i,t)=>{const e=[];let r=i;do{let a=127&r;r>>=7,e.length>0&&(a|=128),e.push(a)}while(r>0||t);return e.reverse()},W=(i,t=!1)=>{const e=Array(i.length).fill(null).map((r,a)=>i.charCodeAt(a));return t&&e.push(0),e},xr=i=>{const t=i*(Math.PI/180),e=Math.round(Math.cos(t)),r=Math.round(Math.sin(t));return[e,r,0,-r,e,0,0,0,1]},_r=xr(0),kr=i=>[dt(i[0]),dt(i[1]),Ne(i[2]),dt(i[3]),dt(i[4]),Ne(i[5]),dt(i[6]),dt(i[7]),Ne(i[8])],B=(i,t,e)=>({type:i,contents:t&&new Uint8Array(t.flat(10)),children:e}),R=(i,t,e,r,a)=>B(i,[z(t),yr(e),r??[]],a),Tr=()=>B("styp",[W("iso5"),x(0),W("iso5"),W("iso6"),W("mp41"),W("cmfc"),W("dash")]),Cr=(i,t)=>{let e=i.maxWrittenEndTimestamp-i.minWrittenTimestamp;return Number.isFinite(e)||(e=0),R("sidx",1,0,[x(1),x(ht),gt($(i.minWrittenTimestamp,ht)),gt(0),P(0),P(1),x(2147483647&t),x($(e,ht)),x(0)])},fe=i=>({type:"mdat",largeSize:i}),Kt=i=>B("moov",void 0,[ys(i.creationTime,i.trackDatas),...i.trackDatas.map(t=>vs(t,i.creationTime)),i.isFragmented?eo(i.trackDatas):null,po(i)]),ys=(i,t)=>{const e=Math.max(0,...t.map(o=>$(ge(o),ht)+$(o.startTimestampOffset??0,ht))),r=Math.max(0,...t.map(o=>o.track.id))+1,a=!Bt(i)||!Bt(e),s=a?gt:x;return R("mvhd",+a,0,[s(i),s(i),x(ht),s(e),dt(1),vr(1),Array(10).fill(0),kr(_r),Array(24).fill(0),x(r)])},ge=i=>{if(i.samples.length===0)return 0;let t=1/0,e=-1/0;for(let r=0;r<i.samples.length;r++){const a=i.samples[r];a.timestamp<t&&(t=a.timestamp),a.timestamp+a.duration>e&&(e=a.timestamp+a.duration)}return t===1/0?0:e-t},vs=(i,t)=>{const e=To(i),r=i.startTimestampOffset!==null&&i.startTimestampOffset>0;return B("trak",void 0,[xs(i,t),r?_s(i,i.startTimestampOffset):null,ks(i,t),e.name!==void 0?B("udta",void 0,[B("name",[...J.encode(e.name)])]):null])},xs=(i,t)=>{var n;const e=$(ge(i),ht)+$(i.startTimestampOffset??0,ht),r=!Bt(t)||!Bt(e),a=r?gt:x;let s;if(i.type==="video"){const l=i.track.metadata.rotation;s=xr(l??0)}else s=_r;let o=2;return((n=i.track.metadata.disposition)==null?void 0:n.default)!==!1&&(o|=1),R("tkhd",+r,o,[a(t),a(t),x(i.track.id),x(0),a(e),Array(8).fill(0),P(0),P(i.track.id),vr(i.type==="audio"?1:0),P(0),kr(s),dt(i.type==="video"?i.info.width:0),dt(i.type==="video"?i.info.height:0)])},_s=(i,t)=>{const e=$(t,ht),r=$(ge(i),ht),a=!Bt(e)||!Bt(r),s=a?gt:x,o=a?bs:_t;return B("edts",void 0,[R("elst",a?1:0,0,[x(2),s(e),o(-1),dt(1),s(r),o(0),dt(1)])])},ks=(i,t)=>B("mdia",void 0,[Ts(i,t),qe(!0,Cs[i.type],Es[i.type]),Ss(i)]),Ts=(i,t)=>{const e=$(ge(i),i.timescale),r=!Bt(t)||!Bt(e),a=r?gt:x;return R("mdhd",+r,0,[a(t),a(t),x(i.timescale),a(e),P(Ar(i.track.metadata.languageCode??"und")),P(0)])},Cs={video:"vide",audio:"soun",subtitle:"text"},Es={video:"MediabunnyVideoHandler",audio:"MediabunnySoundHandler",subtitle:"MediabunnyTextHandler"},qe=(i,t,e,r="\0\0\0\0")=>R("hdlr",0,0,[i?W("mhlr"):x(0),W(t),W(r),x(0),x(0),W(e,!0)]),Ss=i=>B("minf",void 0,[Bs[i.type](),Ps(),As(i)]),Bs={video:()=>R("vmhd",0,1,[P(0),P(0),P(0),P(0)]),audio:()=>R("smhd",0,0,[P(0),P(0)]),subtitle:()=>R("nmhd",0,0)},Ps=()=>B("dinf",void 0,[Ms()]),Ms=()=>R("dref",0,0,[x(1)],[Is()]),Is=()=>R("url ",0,1),As=i=>{const t=i.compositionTimeOffsetTable.length>1||i.compositionTimeOffsetTable.some(e=>e.sampleCompositionTimeOffset!==0);return B("stbl",void 0,[Fs(i),Xs(i),t?Zs(i):null,t?to(i):null,Ys(i),Ks(i),Js(i),Qs(i)])},Fs=i=>{let t;if(i.type==="video")t=Ds(bo(i.track.source._codec,i.info.decoderConfig.codec),i);else if(i.type==="audio"){const e=Ir(i.track.source._codec,i.muxer.isQuickTime);w(e),t=Ls(e,i)}else i.type==="subtitle"&&(t=Gs(xo[i.track.source._codec],i));return w(t),R("stsd",0,0,[x(1)],[t])},Ds=(i,t)=>B(i,[Array(6).fill(0),P(1),P(0),P(0),Array(12).fill(0),P(t.info.width),P(t.info.height),x(4718592),x(4718592),x(0),P(1),Array(32).fill(0),P(24),He(65535)],[yo[t.track.source._codec](t),Rs(t),Si(t.info.decoderConfig.colorSpace)?Vs(t):null]),Rs=i=>i.info.pixelAspectRatio.num===i.info.pixelAspectRatio.den?null:B("pasp",[x(i.info.pixelAspectRatio.num),x(i.info.pixelAspectRatio.den)]),Vs=i=>B("colr",[W("nclx"),P(Ht[i.info.decoderConfig.colorSpace.primaries]),P(Nt[i.info.decoderConfig.colorSpace.transfer]),P(jt[i.info.decoderConfig.colorSpace.matrix]),z((i.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),Er=i=>{var c,d,h,m;if(!i.info.decoderConfig)return null;const t=i.info.decoderConfig,e=t.codec.split("."),r=Number(e[1]),a=Number(e[2]),s=(Number(e[3])<<4)+((e[4]?Number(e[4]):1)<<1)+(e[8]?Number(e[8]):Number(((c=t.colorSpace)==null?void 0:c.fullRange)??0)),o=e[5]?Number(e[5]):(d=t.colorSpace)!=null&&d.primaries?Ht[t.colorSpace.primaries]:2,n=e[6]?Number(e[6]):(h=t.colorSpace)!=null&&h.transfer?Nt[t.colorSpace.transfer]:2,l=e[7]?Number(e[7]):(m=t.colorSpace)!=null&&m.matrix?jt[t.colorSpace.matrix]:2;return R("vpcC",1,0,[z(r),z(a),z(s),z(o),z(n),z(l),P(0)])},Ls=(i,t)=>{var o;let e,r=0,a=16;const s=vt.includes(t.track.source._codec);if(s){const n=t.track.source._codec,{sampleSize:l}=Ft(n);a=8*l,a>16&&(r=1)}if(t.muxer.isQuickTime&&(r=1),r===0)e=[Array(6).fill(0),P(1),P(r),P(0),x(0),P(t.info.numberOfChannels),P(a),P(0),P(0),P(t.info.sampleRate<65536?t.info.sampleRate:0),P(0)];else{const n=s?0:-2;e=[Array(6).fill(0),P(1),P(r),P(0),x(0),P(t.info.numberOfChannels),P(Math.min(a,16)),He(n),P(0),P(t.info.sampleRate<65536?t.info.sampleRate:0),P(0),s?[x(1),x(a/8),x(t.info.numberOfChannels*a/8)]:[x(0),x(0),x(0)],x(2)]}return B(i,e,[((o=vo(t.track.source._codec,t.muxer.isQuickTime))==null?void 0:o(t))??null])},Os=i=>{let t;switch(i.track.source._codec){case"aac":t=64;break;case"mp3":t=107;break;case"vorbis":t=221;break;default:throw new Error(`Unhandled audio codec: ${i.track.source._codec}`)}let e=[...z(t),...z(21),...yr(0),...x(0),...x(0)];if(i.info.decoderConfig.description){const r=Z(i.info.decoderConfig.description);e=[...e,...z(5),...je(r.byteLength),...r]}return e=[...P(1),...z(0),...z(4),...je(e.length),...e,...z(6),...z(1),...z(2)],e=[...z(3),...je(e.length),...e],R("esds",0,0,e)},Ws=i=>B("wave",void 0,[Us(i),$s(i),B("\0\0\0\0")]),Us=i=>B("frma",[W(Ir(i.track.source._codec,i.muxer.isQuickTime))]),$s=i=>{const{littleEndian:t}=Ft(i.track.source._codec);return B("enda",[P(+t)])},zs=i=>{var l;let t=i.info.numberOfChannels,e=3840,r=i.info.sampleRate,a=0,s=0,o=new Uint8Array(0);const n=(l=i.info.decoderConfig)==null?void 0:l.description;if(n){w(n.byteLength>=18);const c=Z(n),d=tr(c);t=d.outputChannelCount,e=d.preSkip,r=d.inputSampleRate,a=d.outputGain,s=d.channelMappingFamily,d.channelMappingTable&&(o=d.channelMappingTable)}return B("dOps",[z(0),z(t),P(e),x(r),He(a),z(s),...o])},Hs=i=>{var r;const t=(r=i.info.decoderConfig)==null?void 0:r.description;w(t);const e=Z(t);return R("dfLa",0,0,[...e.subarray(4)])},Ns=i=>{const{littleEndian:t,sampleSize:e}=Ft(i.track.source._codec);return R("pcmC",0,0,[z(+t),z(8*e)])},js=i=>{const t=(a=>{if(a.length<7||a[0]!==11||a[1]!==119)return null;const s=new G(a);s.skipBits(16),s.skipBits(16);const o=s.readBits(2);if(o===3)return null;const n=s.readBits(6),l=s.readBits(5);if(l>8)return null;const c=s.readBits(3),d=s.readBits(3);return 1&d&&d!==1&&s.skipBits(2),4&d&&s.skipBits(2),d===2&&s.skipBits(2),{fscod:o,bsid:l,bsmod:c,acmod:d,lfeon:s.readBits(1),bitRateCode:Math.floor(n/2)}})(i.info.firstPacket.data);if(!t)throw new Error("Couldn't extract AC-3 frame info from the audio packet. Ensure the packets contain valid AC-3 sync frames (as specified in ETSI TS 102 366).");const e=new Uint8Array(3),r=new G(e);return r.writeBits(2,t.fscod),r.writeBits(5,t.bsid),r.writeBits(3,t.bsmod),r.writeBits(3,t.acmod),r.writeBits(1,t.lfeon),r.writeBits(5,t.bitRateCode),r.writeBits(5,0),B("dac3",[...e])},qs=i=>{const t=(o=>{if(o.length<6||o[0]!==11||o[1]!==119)return null;const n=new G(o);n.skipBits(16);const l=n.readBits(2);if(n.skipBits(3),l!==0&&l!==2)return null;const c=n.readBits(11),d=n.readBits(2);let h,m=0;d===3?(m=n.readBits(2),h=3):h=n.readBits(2);const u=n.readBits(3),p=n.readBits(1),f=n.readBits(5);if(f<11||f>16)return null;const b=rs[h];let y;return y=d<3?qa[d]/1e3:Ga[m]/1e3,{dataRate:Math.round((c+1)*y/(16*b)),substreams:[{fscod:d,fscod2:m,bsid:f,bsmod:0,acmod:u,lfeon:p,numDepSub:0,chanLoc:0}]}})(i.info.firstPacket.data);if(!t)throw new Error("Couldn't extract E-AC-3 frame info from the audio packet. Ensure the packets contain valid E-AC-3 sync frames (as specified in ETSI TS 102 366).");let e=16;for(const o of t.substreams)e+=23,o.numDepSub>0?e+=9:e+=1;const r=Math.ceil(e/8),a=new Uint8Array(r),s=new G(a);s.writeBits(13,t.dataRate),s.writeBits(3,t.substreams.length-1);for(const o of t.substreams)s.writeBits(2,o.fscod),s.writeBits(5,o.bsid),s.writeBits(1,0),s.writeBits(1,0),s.writeBits(3,o.bsmod),s.writeBits(3,o.acmod),s.writeBits(1,o.lfeon),s.writeBits(3,0),s.writeBits(4,o.numDepSub),o.numDepSub>0?s.writeBits(9,o.chanLoc):s.writeBits(1,0);return B("dec3",[...a])},Gs=(i,t)=>B(i,[Array(6).fill(0),P(1)],[_o[t.track.source._codec](t)]),Xs=i=>R("stts",0,0,[x(i.timeToSampleTable.length),i.timeToSampleTable.map(t=>[x(t.sampleCount),x(t.sampleDelta)])]),Qs=i=>{if(i.samples.every(e=>e.type==="key"))return null;const t=[...i.samples.entries()].filter(([,e])=>e.type==="key");return R("stss",0,0,[x(t.length),t.map(([e])=>x(e+1))])},Ys=i=>R("stsc",0,0,[x(i.compactlyCodedChunkTable.length),i.compactlyCodedChunkTable.map(t=>[x(t.firstChunk),x(t.samplesPerChunk),x(1)])]),Ks=i=>{if(i.type==="audio"&&i.info.requiresPcmTransformation){const{sampleSize:t}=Ft(i.track.source._codec);return R("stsz",0,0,[x(t*i.info.numberOfChannels),x(i.samples.reduce((e,r)=>e+$(r.duration,i.timescale),0))])}return R("stsz",0,0,[x(0),x(i.samples.length),i.samples.map(t=>x(t.size))])},Js=i=>i.finalizedChunks.length>0&&ft(i.finalizedChunks).offset>=2**32?R("co64",0,0,[x(i.finalizedChunks.length),i.finalizedChunks.map(t=>gt(t.offset))]):R("stco",0,0,[x(i.finalizedChunks.length),i.finalizedChunks.map(t=>x(t.offset))]),Zs=i=>R("ctts",1,0,[x(i.compositionTimeOffsetTable.length),i.compositionTimeOffsetTable.map(t=>[x(t.sampleCount),_t(t.sampleCompositionTimeOffset)])]),to=i=>{let t=1/0,e=-1/0,r=1/0,a=-1/0;w(i.compositionTimeOffsetTable.length>0),w(i.samples.length>0);for(let o=0;o<i.compositionTimeOffsetTable.length;o++){const n=i.compositionTimeOffsetTable[o];t=Math.min(t,n.sampleCompositionTimeOffset),e=Math.max(e,n.sampleCompositionTimeOffset)}for(let o=0;o<i.samples.length;o++){const n=i.samples[o];r=Math.min(r,$(n.timestamp,i.timescale)),a=Math.max(a,$(n.timestamp+n.duration,i.timescale))}const s=Math.max(-t,0);return a>=2**31?null:R("cslg",0,0,[_t(s),_t(t),_t(e),_t(r),_t(a)])},eo=i=>B("mvex",void 0,i.map(io)),io=i=>R("trex",0,0,[x(i.track.id),x(1),x(0),x(0),x(0)]),Sr=(i,t)=>B("moof",void 0,[ro(i),...t.map(ao)]),ro=i=>R("mfhd",0,0,[x(i)]),Br=i=>{let t=0,e=0;const r=i.type==="delta";return e|=+r,t|=r?1:2,t<<24|e<<16},ao=i=>B("traf",void 0,[so(i),oo(i),no(i)]),so=i=>{w(i.currentChunk);let t=0;t|=8,t|=16,t|=32,t|=131072;const e=i.currentChunk.samples[1]??i.currentChunk.samples[0],r={duration:e.timescaleUnitsToNextSample,size:e.size,flags:Br(e)};return R("tfhd",0,131128,[x(i.track.id),x(r.duration),x(r.size),x(r.flags)])},oo=i=>(w(i.currentChunk),R("tfdt",1,0,[gt($(i.currentChunk.startTimestamp,i.timescale))])),no=i=>{w(i.currentChunk);const t=i.currentChunk.samples.map(f=>f.timescaleUnitsToNextSample),e=i.currentChunk.samples.map(f=>f.size),r=i.currentChunk.samples.map(Br),a=i.currentChunk.samples.map(f=>$(f.timestamp-f.decodeTimestamp,i.timescale)),s=new Set(t),o=new Set(e),n=new Set(r),l=new Set(a),c=n.size===2&&r[0]!==r[1],d=s.size>1,h=o.size>1,m=!c&&n.size>1,u=l.size>1||[...l].some(f=>f!==0);let p=0;return p|=1,p|=4*+c,p|=256*+d,p|=512*+h,p|=1024*+m,p|=2048*+u,R("trun",1,p,[x(i.currentChunk.samples.length),x(i.currentChunk.offset-i.currentChunk.moofOffset||0),c?x(r[0]):[],i.currentChunk.samples.map((f,b)=>[d?x(t[b]):[],h?x(e[b]):[],m?x(r[b]):[],u?_t(a[b]):[]])])},co=(i,t)=>R("tfra",1,0,[x(i.track.id),x(63),x(i.finalizedChunks.length),i.finalizedChunks.map(e=>[gt($(e.samples[0].timestamp,i.timescale)),gt(e.moofOffset),x(t+1),x(1),x(1)])]),lo=()=>R("mfro",0,0,[x(0)]),ho=()=>B("vtte"),uo=(i,t,e,r,a)=>B("vttc",void 0,[a!==null?B("vsid",[_t(a)]):null,e!==null?B("iden",[...J.encode(e)]):null,t!==null?B("ctim",[...J.encode(br(t))]):null,r!==null?B("sttg",[...J.encode(r)]):null,B("payl",[...J.encode(i)])]),mo=i=>B("vtta",[...J.encode(i)]),po=i=>{const t=[],e=i.format._options.metadataFormat??"auto",r=i.output._metadataTags;if(e==="mdir"||e==="auto"&&!i.isQuickTime){const a=go(r);a&&t.push(a)}else if(e==="mdta"){const a=wo(r);a&&t.push(a)}else(e==="udta"||e==="auto"&&i.isQuickTime)&&fo(t,i.output._metadataTags);return t.length===0?null:B("udta",void 0,t)},fo=(i,t)=>{for(const{key:e,value:r}of Ae(t))switch(e){case"title":i.push(wt("©nam",r));break;case"description":i.push(wt("©des",r));break;case"artist":i.push(wt("©ART",r));break;case"album":i.push(wt("©alb",r));break;case"albumArtist":i.push(wt("albr",r));break;case"genre":i.push(wt("©gen",r));break;case"date":i.push(wt("©day",r.toISOString().slice(0,10)));break;case"comment":i.push(wt("©cmt",r));break;case"lyrics":i.push(wt("©lyr",r));break;case"raw":case"discNumber":case"discsTotal":case"trackNumber":case"tracksTotal":case"images":break;default:Wt(e)}if(t.raw)for(const e in t.raw){const r=t.raw[e];r==null||e.length!==4||i.some(a=>a.type===e)||(typeof r=="string"?i.push(wt(e,r)):r instanceof Uint8Array&&i.push(B(e,Array.from(r))))}},wt=(i,t)=>{const e=J.encode(t);return B(i,[P(e.length),P(Ar("und")),Array.from(e)])},Pr={"image/jpeg":13,"image/png":14,"image/bmp":27},Mr=(i,t)=>{const e=[];for(const{key:r,value:a}of Ae(i))switch(r){case"title":e.push({key:t?"title":"©nam",value:lt(a)});break;case"description":e.push({key:t?"description":"©des",value:lt(a)});break;case"artist":e.push({key:t?"artist":"©ART",value:lt(a)});break;case"album":e.push({key:t?"album":"©alb",value:lt(a)});break;case"albumArtist":e.push({key:t?"album_artist":"aART",value:lt(a)});break;case"comment":e.push({key:t?"comment":"©cmt",value:lt(a)});break;case"genre":e.push({key:t?"genre":"©gen",value:lt(a)});break;case"lyrics":e.push({key:t?"lyrics":"©lyr",value:lt(a)});break;case"date":e.push({key:t?"date":"©day",value:lt(a.toISOString().slice(0,10))});break;case"images":for(const s of a)s.kind==="coverFront"&&e.push({key:"covr",value:B("data",[x(Pr[s.mimeType]??0),x(0),Array.from(s.data)])});break;case"trackNumber":if(t){const s=i.tracksTotal!==void 0?`${a}/${i.tracksTotal}`:a.toString();e.push({key:"track",value:lt(s)})}else e.push({key:"trkn",value:B("data",[x(0),x(0),P(0),P(a),P(i.tracksTotal??0),P(0)])});break;case"discNumber":t||e.push({key:"disc",value:B("data",[x(0),x(0),P(0),P(a),P(i.discsTotal??0),P(0)])});break;case"tracksTotal":case"discsTotal":case"raw":break;default:Wt(r)}if(i.raw)for(const r in i.raw){const a=i.raw[r];a==null||!t&&r.length!==4||e.some(s=>s.key===r)||(typeof a=="string"?e.push({key:r,value:lt(a)}):a instanceof Uint8Array?e.push({key:r,value:B("data",[x(0),x(0),Array.from(a)])}):a instanceof Li&&e.push({key:r,value:B("data",[x(Pr[a.mimeType]??0),x(0),Array.from(a.data)])}))}return e},go=i=>{const t=Mr(i,!1);return t.length===0?null:R("meta",0,0,void 0,[qe(!1,"mdir","","appl"),B("ilst",void 0,t.map(e=>B(e.key,void 0,[e.value])))])},wo=i=>{const t=Mr(i,!0);return t.length===0?null:B("meta",void 0,[qe(!1,"mdta",""),R("keys",0,0,[x(t.length)],t.map(e=>B("mdta",[...J.encode(e.key)]))),B("ilst",void 0,t.map((e,r)=>{const a=String.fromCharCode(...x(r+1));return B(a,void 0,[e.value])}))])},lt=i=>B("data",[x(1),x(0),...J.encode(i)]),bo=(i,t)=>{switch(i){case"avc":return t.startsWith("avc3")?"avc3":"avc1";case"hevc":return"hvc1";case"vp8":return"vp08";case"vp9":return"vp09";case"av1":return"av01"}},yo={avc:i=>i.info.decoderConfig&&B("avcC",[...Z(i.info.decoderConfig.description)]),hevc:i=>i.info.decoderConfig&&B("hvcC",[...Z(i.info.decoderConfig.description)]),vp8:Er,vp9:Er,av1:i=>B("av1C",Hi(i.info.decoderConfig.codec))},Ir=(i,t)=>{switch(i){case"aac":case"mp3":case"vorbis":return"mp4a";case"opus":return"Opus";case"flac":return"fLaC";case"ulaw":return"ulaw";case"alaw":return"alaw";case"pcm-u8":return"raw ";case"pcm-s8":return"sowt";case"ac3":return"ac-3";case"eac3":return"ec-3"}if(t)switch(i){case"pcm-s16":return"sowt";case"pcm-s16be":return"twos";case"pcm-s24":case"pcm-s24be":return"in24";case"pcm-s32":case"pcm-s32be":return"in32";case"pcm-f32":case"pcm-f32be":return"fl32";case"pcm-f64":case"pcm-f64be":return"fl64"}else switch(i){case"pcm-s16":case"pcm-s16be":case"pcm-s24":case"pcm-s24be":case"pcm-s32":case"pcm-s32be":return"ipcm";case"pcm-f32":case"pcm-f32be":case"pcm-f64":case"pcm-f64be":return"fpcm"}},vo=(i,t)=>{switch(i){case"aac":case"mp3":case"vorbis":return Os;case"opus":return zs;case"flac":return Hs;case"ac3":return js;case"eac3":return qs}if(t)switch(i){case"pcm-s24":case"pcm-s24be":case"pcm-s32":case"pcm-s32be":case"pcm-f32":case"pcm-f32be":case"pcm-f64":case"pcm-f64be":return Ws}else switch(i){case"pcm-s16":case"pcm-s16be":case"pcm-s24":case"pcm-s24be":case"pcm-s32":case"pcm-s32be":case"pcm-f32":case"pcm-f32be":case"pcm-f64":case"pcm-f64be":return Ns}return null},xo={webvtt:"wvtt"},_o={webvtt:i=>B("vttC",[...J.encode(i.info.config.description)])},Ar=i=>{w(i.length===3);let t=0;for(let e=0;e<3;e++)t<<=5,t+=i.charCodeAt(e)-96;return t};class Ge{constructor(t,e){if(this.finalized=!1,this.started=!1,this.pos=0,this.trackedWrites=null,this.trackedStart=-1,this.trackedEnd=-1,t._writerAcquired)throw new Error("Can't have multiple Writers for the same Target.");this.target=t,t._setMonotonicity(e),t._writerAcquired=!0}start(){w(!this.started),this.target._start(),this.started=!0}write(t){w(this.started&&!this.finalized),this.maybeTrackWrites(t),this.target._write(t,this.pos),this.pos+=t.byteLength}seek(t){this.pos=t}getPos(){return this.pos}async flush(){return w(this.started&&!this.finalized),this.target._flush()}async finalize(){w(this.started&&!this.finalized),await this.target._finalize(),this.finalized=!0}maybeTrackWrites(t){if(!this.trackedWrites)return;let e=this.getPos();if(e<this.trackedStart){if(e+t.byteLength<=this.trackedStart)return;t=t.subarray(this.trackedStart-e),e=0}const r=e+t.byteLength-this.trackedStart;let a=this.trackedWrites.byteLength;for(;a<r;)a*=2;if(a!==this.trackedWrites.byteLength){const s=new Uint8Array(a);s.set(this.trackedWrites,0),this.trackedWrites=s}this.trackedWrites.set(t,e-this.trackedStart),this.trackedEnd=Math.max(this.trackedEnd,e+t.byteLength)}startTrackingWrites(){this.trackedWrites=new Uint8Array(1024),this.trackedStart=this.getPos(),this.trackedEnd=this.trackedStart}stopTrackingWrites(){if(!this.trackedWrites)throw new Error("Internal error: Can't get tracked writes since nothing was tracked.");const t={data:this.trackedWrites.subarray(0,this.trackedEnd-this.trackedStart),start:this.trackedStart,end:this.trackedEnd};return this.trackedWrites=null,t}}class kt extends Vi{constructor(){super(...arguments),this._writerAcquired=!1,this._monotonicity=null,this.onwrite=null}_setMonotonicity(t){this._monotonicity!==!1&&(this._monotonicity=t)}_dispatchWrite(t,e){var r;(r=this.onwrite)==null||r.call(this,t,e),this._emit("write",{start:t,end:e})}slice(t){if(!Number.isInteger(t)||t<0)throw new TypeError("offset must be a non-negative integer.");return new ko(this,t)}}const Xe=65536,Fr=2**32;class we extends kt{constructor(t={}){if(super(),this.buffer=null,this._maxPos=0,!t||typeof t!="object")throw new TypeError("BufferTarget options, when provided, must be an object.");if(t.onFinalize!==void 0&&typeof t.onFinalize!="function")throw new TypeError("options.onFinalize, when provided, must be a function.");if(this._options=t,this._supportsResize="resize"in new ArrayBuffer(0),this._supportsResize)try{this._buffer=new ArrayBuffer(Xe,{maxByteLength:Fr})}catch{this._buffer=new ArrayBuffer(Xe),this._supportsResize=!1}else this._buffer=new ArrayBuffer(Xe);this._bytes=new Uint8Array(this._buffer)}_ensureSize(t){let e=this._buffer.byteLength;for(;e<t;)e*=2;if(e!==this._buffer.byteLength){if(e>Fr)throw new Error("ArrayBuffer exceeded maximum size of 4294967296 bytes. Please consider using another target.");if(this._supportsResize)this._buffer.resize(e);else{const r=new ArrayBuffer(e),a=new Uint8Array(r);a.set(this._bytes,0),this._buffer=r,this._bytes=a}}}_start(){}_write(t,e){this._ensureSize(e+t.byteLength),this._bytes.set(t,e),this._maxPos=Math.max(this._maxPos,e+t.byteLength),this._dispatchWrite(e,e+t.byteLength)}async _flush(){}async _finalize(){this.buffer=this._buffer.slice(0,this._maxPos),this._options.onFinalize&&await this._options.onFinalize(this.buffer),this._emit("finalized")}async _close(){}_getSlice(t,e){return this._bytes.slice(t,e)}}class ko extends kt{constructor(t,e){super(),this._baseTarget=t,this._offset=e}_start(){}_write(t,e){this._baseTarget._write(t,this._offset+e),this._dispatchWrite(e,e+t.byteLength)}_flush(){return this._baseTarget._flush()}async _finalize(){this._emit("finalized")}async _close(){}_setMonotonicity(t){super._setMonotonicity(t),this._baseTarget._setMonotonicity(t)}}class Qe{constructor(t,e){if(this.rootPath=t,this.getTarget=e,typeof t!="string")throw new TypeError("rootPath must be a string.");if(typeof e!="function")throw new TypeError("getTarget must be a function.")}}const ht=57600,To=i=>{const t={},e=i.track;return e.metadata.name!==void 0&&(t.name=e.metadata.name),t},$=(i,t,e=!0)=>{const r=i*t;return e?Math.round(r):r};class Co extends wr{constructor(t,e){super(t),this.writer=null,this.boxWriter=null,this.initWriter=null,this.initBoxWriter=null,this.auxTarget=new we,this.auxWriter=new Ge(this.auxTarget,!1),this.auxBoxWriter=new pe(this.auxWriter),this.mdat=null,this.ftypSize=null,this.trackDatas=[],this.allTracksKnown=Be(),this.creationTime=Math.floor(Date.now()/1e3)+2082844800,this.finalizedChunks=[],this.nextFragmentNumber=1,this.maxWrittenTimestamp=-1/0,this.minWrittenTimestamp=1/0,this.maxWrittenEndTimestamp=-1/0,this.segmentHeaderSize=null,this.format=e,this.isQuickTime=e instanceof Wr,this.isCmaf=e instanceof Or,this.minimumFragmentDuration=e._options.minimumFragmentDuration??(e instanceof Or?1/0:1)}async start(){var r;const t=await this.mutex.acquire();if(this.isCmaf?(this.fastStart="fragmented",this.isFragmented=!0):(this.writer=await this.output._getRootWriter(a=>this.format._options.fastStart!==void 0?this.format._options.fastStart==="fragmented":a instanceof we),this.boxWriter=new pe(this.writer),this.fastStart=this.format._options.fastStart??(this.writer.target instanceof we&&"in-memory"),this.isFragmented=this.fastStart==="fragmented"),this.isCmaf){if(!this.output._hasInitTarget())throw new Error("CMAF outputs require the initTarget field in OutputOptions to be set; the init segment will be written to it.");const a=await this.output._getInitTarget(),s=new Ge(a,!0);s.start(),this.initWriter=s,this.initBoxWriter=new pe(s)}const e=this.output._tracks.some(a=>a.isVideoTrack()&&a.source._codec==="avc");{const a=this.initBoxWriter??this.boxWriter;if(w(a),this.format._options.onFtyp&&a.writer.startTrackingWrites(),a.writeBox((s=>s.isQuickTime?B("ftyp",[W("qt "),x(512),W("qt ")]):s.fragmented?s.cmaf?B("ftyp",[W("iso5"),x(512),W("iso5"),W("iso6"),W("mp41"),W("cmfc"),W("dash")]):B("ftyp",[W("iso5"),x(512),W("iso5"),W("iso6"),W("mp41")]):B("ftyp",[W("isom"),x(512),W("isom"),s.holdsAvc?W("avc1"):[],W("mp41")]))({isQuickTime:this.isQuickTime,holdsAvc:e,fragmented:this.isFragmented,cmaf:this.isCmaf})),this.format._options.onFtyp){const{data:s,start:o}=a.writer.stopTrackingWrites();this.format._options.onFtyp(s,o)}this.ftypSize=a.writer.getPos(),this.isCmaf&&await this.initWriter.flush()}if(this.fastStart!=="in-memory")if(this.fastStart==="reserve"){for(const a of this.output._tracks)if(a.metadata.maximumPacketCount===void 0)throw new Error("All tracks must specify maximumPacketCount in their metadata when using fastStart: 'reserve'.")}else this.isFragmented||(w(this.writer),w(this.boxWriter),this.format._options.onMdat&&this.writer.startTrackingWrites(),this.mdat=fe(!0),this.boxWriter.writeBox(this.mdat));await((r=this.writer)==null?void 0:r.flush()),t()}allTracksAreKnown(){for(const t of this.output._tracks)if(!t.source._closed&&!this.trackDatas.some(e=>e.track===t))return!1;return!0}async getMimeType(){await this.allTracksKnown.promise;const t=this.trackDatas.map(e=>e.type==="video"||e.type==="audio"?e.info.decoderConfig.codec:{webvtt:"wvtt"}[e.track.source._codec]);return(e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isQuickTime?"quicktime":"mp4");return e.codecStrings.length>0&&(r+=`; codecs="${[...new Set(e.codecStrings)].join(", ")}"`),r})({isQuickTime:this.isQuickTime,hasVideo:this.trackDatas.some(e=>e.type==="video"),hasAudio:this.trackDatas.some(e=>e.type==="audio"),codecStrings:t})}getVideoTrackData(t,e,r){const a=this.trackDatas.find(m=>m.track===t);if(a)return a;ji(r),w(r),w(r.decoderConfig);const s={...r.decoderConfig};w(s.codedWidth!==void 0),w(s.codedHeight!==void 0);let o=!1;if(t.source._codec!=="avc"||s.description){if(t.source._codec==="hevc"&&!s.description){const m=Qa(e.data);if(!m)throw new Error("Couldn't extract an HEVCDecoderConfigurationRecord from the HEVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.265) when not providing a description, or provide a description (must be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in HEVC format.");s.description=(u=>{const p=[];p.push(u.configurationVersion),p.push((3&u.generalProfileSpace)<<6|(1&u.generalTierFlag)<<5|31&u.generalProfileIdc),p.push(u.generalProfileCompatibilityFlags>>>24&255),p.push(u.generalProfileCompatibilityFlags>>>16&255),p.push(u.generalProfileCompatibilityFlags>>>8&255),p.push(255&u.generalProfileCompatibilityFlags),p.push(...u.generalConstraintIndicatorFlags),p.push(255&u.generalLevelIdc),p.push(240|u.minSpatialSegmentationIdc>>8&15),p.push(255&u.minSpatialSegmentationIdc),p.push(252|3&u.parallelismType),p.push(252|3&u.chromaFormatIdc),p.push(248|7&u.bitDepthLumaMinus8),p.push(248|7&u.bitDepthChromaMinus8),p.push(u.avgFrameRate>>8&255),p.push(255&u.avgFrameRate),p.push((3&u.constantFrameRate)<<6|(7&u.numTemporalLayers)<<3|(1&u.temporalIdNested)<<2|3&u.lengthSizeMinusOne),p.push(255&u.arrays.length);for(const f of u.arrays){p.push((1&f.arrayCompleteness)<<7|63&f.nalUnitType),p.push(f.nalUnits.length>>8&255),p.push(255&f.nalUnits.length);for(const b of f.nalUnits){p.push(b.length>>8&255),p.push(255&b.length);for(let y=0;y<b.length;y++)p.push(b[y])}}return new Uint8Array(p)})(m),o=!0}}else{const m=(u=>{try{const p=[],f=[],b=[];for(const S of Gt(u)){const A=u.subarray(S.offset,S.offset+S.length),E=Qi(A[0]);E===xt.SPS?p.push(A):E===xt.PPS?f.push(A):E===xt.SPS_EXT&&b.push(A)}if(p.length===0||f.length===0)return null;const y=p[0],_=Xa(y);w(_!==null);const T=_.profileIdc===100||_.profileIdc===110||_.profileIdc===122||_.profileIdc===144;return{configurationVersion:1,avcProfileIndication:_.profileIdc,profileCompatibility:_.constraintFlags,avcLevelIndication:_.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:p,pictureParameterSets:f,chromaFormat:T?_.chromaFormatIdc:null,bitDepthLumaMinus8:T?_.bitDepthLumaMinus8:null,bitDepthChromaMinus8:T?_.bitDepthChromaMinus8:null,sequenceParameterSetExt:T?b:null}}catch(p){return console.error("Error building AVC Decoder Configuration Record:",p),null}})(e.data);if(!m)throw new Error("Couldn't extract an AVCDecoderConfigurationRecord from the AVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.264) when not providing a description, or provide a description (must be an AVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in AVCC format.");s.description=(u=>{const p=[];p.push(u.configurationVersion),p.push(u.avcProfileIndication),p.push(u.profileCompatibility),p.push(u.avcLevelIndication),p.push(252|3&u.lengthSizeMinusOne),p.push(224|31&u.sequenceParameterSets.length);for(const f of u.sequenceParameterSets){const b=f.byteLength;p.push(b>>8),p.push(255&b);for(let y=0;y<b;y++)p.push(f[y])}p.push(u.pictureParameterSets.length);for(const f of u.pictureParameterSets){const b=f.byteLength;p.push(b>>8),p.push(255&b);for(let y=0;y<b;y++)p.push(f[y])}if(u.avcProfileIndication===100||u.avcProfileIndication===110||u.avcProfileIndication===122||u.avcProfileIndication===144){w(u.chromaFormat!==null),w(u.bitDepthLumaMinus8!==null),w(u.bitDepthChromaMinus8!==null),w(u.sequenceParameterSetExt!==null),p.push(252|3&u.chromaFormat),p.push(248|7&u.bitDepthLumaMinus8),p.push(248|7&u.bitDepthChromaMinus8),p.push(u.sequenceParameterSetExt.length);for(const f of u.sequenceParameterSetExt){const b=f.byteLength;p.push(b>>8),p.push(255&b);for(let y=0;y<b;y++)p.push(f[y])}}return new Uint8Array(p)})(m),o=!0}const n=((m,u)=>{const p=m<0?-1:1;let f=0,b=1,y=1,_=0,T=m=Math.abs(m);for(;;){const S=Math.floor(T),A=S*y+f,E=S*_+b;if(E>u)return{num:p*y,den:_};if(f=y,b=_,y=A,_=E,T=1/(T-S),!isFinite(T))break}return{num:p*y,den:_}})(1/(t.metadata.frameRate??ht),1e6).den,l=s.displayAspectWidth,c=s.displayAspectHeight,d=l===void 0||c===void 0?{num:1,den:1}:Fe({num:l*s.codedHeight,den:c*s.codedWidth}),h={muxer:this,track:t,type:"video",info:{width:s.codedWidth,height:s.codedHeight,pixelAspectRatio:d,decoderConfig:s,requiresAnnexBTransformation:o},timescale:n,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,startTimestampOffset:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],closed:!1};return this.trackDatas.push(h),this.trackDatas.sort((m,u)=>m.track.id-u.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),h}getAudioTrackData(t,e,r){const a=this.trackDatas.find(l=>l.track===t);if(a)return a;qi(r),w(r),w(r.decoderConfig);const s={...r.decoderConfig};let o=!1;if(t.source._codec==="aac"&&!s.description){const l=he(Vt.tempFromBytes(e.data));if(!l)throw new Error("Couldn't parse ADTS header from the AAC packet. Make sure the packets are in ADTS format (as specified in ISO 13818-7) when not providing a description, or provide a description (must be an AudioSpecificConfig as specified in ISO 14496-3) and ensure the packets are raw AAC data.");const c=De[l.samplingFrequencyIndex],d=Re[l.channelConfiguration];if(c===void 0||d===void 0)throw new Error("Invalid ADTS frame header.");s.description=Wi({objectType:l.objectType,sampleRate:c,numberOfChannels:d}),o=!0}const n={muxer:this,track:t,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:s,requiresPcmTransformation:!this.isFragmented&&vt.includes(t.source._codec),expectedNextPcmPacketTimestamp:null,requiresAdtsStripping:o,firstPacket:e},timescale:s.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,startTimestampOffset:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],closed:!1};return this.trackDatas.push(n),this.trackDatas.sort((l,c)=>l.track.id-c.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),n}getSubtitleTrackData(t,e){const r=this.trackDatas.find(s=>s.track===t);if(r)return r;Gi(e),w(e),w(e.config);const a={muxer:this,track:t,type:"subtitle",info:{config:e.config},timescale:1e3,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,startTimestampOffset:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],closed:!1,lastCueEndTimestamp:0,cueQueue:[],nextSourceId:0,cueToSourceId:new WeakMap};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),a}async addEncodedVideoPacket(t,e,r){const a=await this.mutex.acquire();try{const s=this.getVideoTrackData(t,e,r);let o=e.data;if(s.info.requiresAnnexBTransformation){const l=[...Gt(o)].map(c=>o.subarray(c.offset,c.offset+c.length));if(l.length===0)throw new Error("Failed to transform packet data. Make sure all packets are provided in Annex B format, as specified in ITU-T-REC-H.264 and ITU-T-REC-H.265.");o=((c,d)=>{const h=c.reduce((p,f)=>p+d+f.byteLength,0),m=new Uint8Array(h);let u=0;for(const p of c){const f=new DataView(m.buffer,m.byteOffset,m.byteLength);switch(d){case 1:f.setUint8(u,p.byteLength);break;case 2:f.setUint16(u,p.byteLength,!1);break;case 3:Ma(f,u,p.byteLength);break;case 4:f.setUint32(u,p.byteLength,!1)}u+=d,m.set(p,u),u+=p.byteLength}return m})(l,4)}this.validateTimestamp(s.track,e.timestamp,e.type==="key");const n=this.createSampleForTrack(s,o,e.timestamp,e.duration,e.type);await this.registerSample(s,n)}finally{a()}}async addEncodedAudioPacket(t,e,r){const a=await this.mutex.acquire();try{const s=this.getAudioTrackData(t,e,r);let o=e.data;if(s.info.requiresAdtsStripping){const d=he(Vt.tempFromBytes(o));if(!d)throw new Error("Expected ADTS frame, didn't get one.");const h=d.crcCheck===null?7:9;o=o.subarray(h)}this.validateTimestamp(s.track,e.timestamp,e.type==="key");let n=e.timestamp,l=e.duration;if(s.info.requiresPcmTransformation){const d=Ft(s.info.decoderConfig.codec).sampleSize*s.info.numberOfChannels;if(l=o.byteLength/d/s.info.sampleRate,s.info.expectedNextPcmPacketTimestamp!==null){const h=n-s.info.expectedNextPcmPacketTimestamp;if(h<.01)n=s.info.expectedNextPcmPacketTimestamp;else{const m=await this.padWithSilence(s,s.info.expectedNextPcmPacketTimestamp,h);n=s.info.expectedNextPcmPacketTimestamp+m}}s.info.expectedNextPcmPacketTimestamp=n+l}const c=this.createSampleForTrack(s,o,n,l,e.type);await this.registerSample(s,c)}finally{a()}}async padWithSilence(t,e,r){const a=$(r,t.timescale);if(r=a/t.timescale,a>0){const{sampleSize:s,silentValue:o}=Ft(t.info.decoderConfig.codec),n=a*t.info.numberOfChannels,l=new Uint8Array(s*n).fill(o),c=this.createSampleForTrack(t,new Uint8Array(l.buffer),e,r,"key");await this.registerSample(t,c)}return r}async addSubtitleCue(t,e,r){const a=await this.mutex.acquire();try{const s=this.getSubtitleTrackData(t,r);this.validateTimestamp(s.track,e.timestamp,!0),t.source._codec==="webvtt"&&(s.cueQueue.push(e),await this.processWebVTTCues(s,e.timestamp))}finally{a()}}async processWebVTTCues(t,e){for(;t.cueQueue.length>0;){const r=new Set([]);for(const c of t.cueQueue)w(c.timestamp<=e),w(t.lastCueEndTimestamp<=c.timestamp+c.duration),r.add(Math.max(c.timestamp,t.lastCueEndTimestamp)),r.add(c.timestamp+c.duration);const a=[...r].sort((c,d)=>c-d),s=a[0],o=a[1]??s;if(e<o)break;if(t.lastCueEndTimestamp<s){this.auxWriter.seek(0);const c=ho();this.auxBoxWriter.writeBox(c);const d=this.auxTarget._getSlice(0,this.auxWriter.getPos()),h=this.createSampleForTrack(t,d,t.lastCueEndTimestamp,s-t.lastCueEndTimestamp,"key");await this.registerSample(t,h),t.lastCueEndTimestamp=s}this.auxWriter.seek(0);for(let c=0;c<t.cueQueue.length;c++){const d=t.cueQueue[c];if(d.timestamp>=o)break;me.lastIndex=0;const h=me.test(d.text),m=d.timestamp+d.duration;let u=t.cueToSourceId.get(d);if(u===void 0&&o<m&&(u=t.nextSourceId++,t.cueToSourceId.set(d,u)),d.notes){const f=mo(d.notes);this.auxBoxWriter.writeBox(f)}const p=uo(d.text,h?s:null,d.identifier??null,d.settings??null,u??null);this.auxBoxWriter.writeBox(p),m===o&&t.cueQueue.splice(c--,1)}const n=this.auxTarget._getSlice(0,this.auxWriter.getPos()),l=this.createSampleForTrack(t,n,s,o-s,"key");await this.registerSample(t,l),t.lastCueEndTimestamp=o}}createSampleForTrack(t,e,r,a,s){return{timestamp:r,decodeTimestamp:r,duration:a,data:e,size:e.byteLength,type:s,timescaleUnitsToNextSample:$(a,t.timescale)}}processTimestamps(t,e){if(t.timestampProcessingQueue.length===0)return;if(t.type==="audio"&&t.info.requiresPcmTransformation){this.isFragmented||(t.startTimestampOffset??(t.startTimestampOffset=t.timestampProcessingQueue[0].timestamp));let a=0;for(let s=0;s<t.timestampProcessingQueue.length;s++){const o=t.timestampProcessingQueue[s];a+=$(o.duration,t.timescale)}return t.timeToSampleTable.length===0?t.timeToSampleTable.push({sampleCount:a,sampleDelta:1}):ft(t.timeToSampleTable).sampleCount+=a,void(t.timestampProcessingQueue.length=0)}const r=t.timestampProcessingQueue.map(a=>a.timestamp).sort((a,s)=>a-s);this.isFragmented||(t.startTimestampOffset??(t.startTimestampOffset=r[0]));for(let a=0;a<t.timestampProcessingQueue.length;a++){const s=t.timestampProcessingQueue[a];s.decodeTimestamp=r[a];const o=$(s.timestamp-s.decodeTimestamp,t.timescale),n=$(s.duration,t.timescale);if(t.lastTimescaleUnits!==null){w(t.lastSample);const l=$(s.decodeTimestamp,t.timescale,!1),c=Math.round(l-t.lastTimescaleUnits);if(w(c>=0),t.lastTimescaleUnits+=c,t.lastSample.timescaleUnitsToNextSample=c,!this.isFragmented){let d=ft(t.timeToSampleTable);if(w(d),d.sampleCount===1){d.sampleDelta=c;const m=t.timeToSampleTable[t.timeToSampleTable.length-2];m&&m.sampleDelta===c&&(m.sampleCount++,t.timeToSampleTable.pop(),d=m)}else d.sampleDelta!==c&&(d.sampleCount--,t.timeToSampleTable.push(d={sampleCount:1,sampleDelta:c}));d.sampleDelta===n?d.sampleCount++:t.timeToSampleTable.push({sampleCount:1,sampleDelta:n});const h=ft(t.compositionTimeOffsetTable);w(h),h.sampleCompositionTimeOffset===o?h.sampleCount++:t.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:o})}}else t.lastTimescaleUnits=$(s.decodeTimestamp,t.timescale,!1),this.isFragmented||(t.timeToSampleTable.push({sampleCount:1,sampleDelta:n}),t.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:o}));t.lastSample=s}if(t.timestampProcessingQueue.length=0,w(t.lastSample),w(t.lastTimescaleUnits!==null),e!==void 0&&t.lastSample.timescaleUnitsToNextSample===0){w(e.type==="key");const a=$(e.timestamp,t.timescale,!1),s=Math.round(a-t.lastTimescaleUnits);t.lastSample.timescaleUnitsToNextSample=s}}async registerSample(t,e){e.type==="key"&&this.processTimestamps(t,e),t.timestampProcessingQueue.push(e),this.isFragmented?(t.sampleQueue.push(e),await this.interleaveSamples()):this.fastStart==="reserve"?await this.registerSampleFastStartReserve(t,e):await this.addSampleToTrack(t,e)}async addSampleToTrack(t,e){if(!this.isFragmented&&(t.samples.push(e),this.fastStart==="reserve")){const a=t.track.metadata.maximumPacketCount;if(w(a!==void 0),t.samples.length>a)throw new Error(`Track #${t.track.id} has already reached the maximum packet count (${a}). Either add less packets or increase the maximum packet count.`)}let r=!1;if(t.currentChunk){t.currentChunk.startTimestamp=Math.min(t.currentChunk.startTimestamp,e.timestamp);const a=e.timestamp-t.currentChunk.startTimestamp;if(this.isFragmented){const s=this.trackDatas.every(o=>{if(t===o)return e.type==="key";const n=o.sampleQueue[0];return n?n.type==="key":o.closed});a>=this.minimumFragmentDuration&&s&&e.timestamp>this.maxWrittenTimestamp&&(r=!0,await this.finalizeFragment())}else r=a>=.5}else r=!0;r&&(t.currentChunk&&await this.finalizeCurrentChunk(t),t.currentChunk={startTimestamp:e.timestamp,samples:[],offset:null,moofOffset:null}),w(t.currentChunk),t.currentChunk.samples.push(e),this.isFragmented&&(this.maxWrittenTimestamp=Math.max(this.maxWrittenTimestamp,e.timestamp),this.maxWrittenEndTimestamp=Math.max(this.maxWrittenEndTimestamp,e.timestamp+e.duration),this.minWrittenTimestamp=Math.min(this.minWrittenTimestamp,e.timestamp))}async finalizeCurrentChunk(t){if(w(!this.isFragmented),w(this.writer),!t.currentChunk)return;t.finalizedChunks.push(t.currentChunk),this.finalizedChunks.push(t.currentChunk);let e=t.currentChunk.samples.length;if(t.type==="audio"&&t.info.requiresPcmTransformation&&(e=t.currentChunk.samples.reduce((r,a)=>r+$(a.duration,t.timescale),0)),t.compactlyCodedChunkTable.length!==0&&ft(t.compactlyCodedChunkTable).samplesPerChunk===e||t.compactlyCodedChunkTable.push({firstChunk:t.finalizedChunks.length,samplesPerChunk:e}),this.fastStart!=="in-memory"){t.currentChunk.offset=this.writer.getPos();for(const r of t.currentChunk.samples)w(r.data),this.writer.write(r.data),r.data=null;await this.writer.flush()}else t.currentChunk.offset=0}async interleaveSamples(t=!1){if(w(this.isFragmented),t||this.allTracksAreKnown())t:for(;;){let e=null,r=1/0;for(const s of this.trackDatas){if(!t&&s.sampleQueue.length===0&&!s.closed)break t;s.sampleQueue.length>0&&s.sampleQueue[0].timestamp<r&&(e=s,r=s.sampleQueue[0].timestamp)}if(!e)break;const a=e.sampleQueue.shift();await this.addSampleToTrack(e,a)}}async finalizeFragment(t=!this.isCmaf){w(this.isFragmented);const e=this.nextFragmentNumber++;if(e===1){const u=this.initBoxWriter??this.boxWriter;w(u),this.format._options.onMoov&&u.writer.startTrackingWrites();const p=Kt(this);if(u.writeBox(p),this.format._options.onMoov){const{data:f,start:b}=u.writer.stopTrackingWrites();this.format._options.onMoov(f,b)}if(this.isCmaf){w(this.initWriter),await this.initWriter.flush(),await this.initWriter.finalize(),this.writer=await this.output._getRootWriter(!0),this.boxWriter=new pe(this.writer);const f=this.boxWriter.measureBox(Tr()),b=this.boxWriter.measureBox(Cr(this,0));this.segmentHeaderSize=f+b,this.writer.seek(this.segmentHeaderSize)}}w(this.writer),w(this.boxWriter);const r=this.trackDatas.filter(u=>u.currentChunk),a=Sr(e,r),s=this.writer.getPos(),o=s+this.boxWriter.measureBox(a);let n=o+8,l=1/0;for(const u of r){u.currentChunk.offset=n,u.currentChunk.moofOffset=s;for(const p of u.currentChunk.samples)n+=p.size;l=Math.min(l,u.currentChunk.startTimestamp)}const c=n-o,d=c>=2**32;if(d)for(const u of r)u.currentChunk.offset+=8;this.format._options.onMoof&&this.writer.startTrackingWrites();const h=Sr(e,r);if(this.boxWriter.writeBox(h),this.format._options.onMoof){const{data:u,start:p}=this.writer.stopTrackingWrites();this.format._options.onMoof(u,p,l)}w(this.writer.getPos()===o),this.format._options.onMdat&&this.writer.startTrackingWrites();const m=fe(d);m.size=c,this.boxWriter.writeBox(m),this.writer.seek(o+(d?16:8));for(const u of r)for(const p of u.currentChunk.samples)this.writer.write(p.data),p.data=null;if(this.format._options.onMdat){const{data:u,start:p}=this.writer.stopTrackingWrites();this.format._options.onMdat(u,p)}for(const u of r)u.finalizedChunks.push(u.currentChunk),this.finalizedChunks.push(u.currentChunk),u.currentChunk=null;t&&await this.writer.flush()}async registerSampleFastStartReserve(t,e){if(w(this.writer),w(this.boxWriter),this.allTracksAreKnown()){if(!this.mdat){const r=Kt(this),a=this.boxWriter.measureBox(r)+this.computeSampleTableSizeUpperBound()+4096;w(this.ftypSize!==null),this.writer.seek(this.ftypSize+a),this.format._options.onMdat&&this.writer.startTrackingWrites(),this.mdat=fe(!0),this.boxWriter.writeBox(this.mdat);for(const s of this.trackDatas){for(const o of s.sampleQueue)await this.addSampleToTrack(s,o);s.sampleQueue.length=0}}await this.addSampleToTrack(t,e)}else t.sampleQueue.push(e)}computeSampleTableSizeUpperBound(){w(this.fastStart==="reserve");let t=0;for(const e of this.trackDatas){const r=e.track.metadata.maximumPacketCount;w(r!==void 0),t+=8*Math.ceil(2/3*r),t+=4*r,t+=8*Math.ceil(2/3*r),t+=12*Math.ceil(2/3*r),t+=4*r,t+=8*r}return t}async onTrackClose(t){const e=await this.mutex.acquire(),r=this.trackDatas.find(a=>a.track===t);r&&(r.closed=!0,r.type==="subtitle"&&t.source._codec==="webvtt"&&await this.processWebVTTCues(r,1/0),this.processTimestamps(r)),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),this.isFragmented&&await this.interleaveSamples(),e()}async finalize(){const t=await this.mutex.acquire();this.allTracksKnown.resolve();for(const r of this.trackDatas)r.closed=!0,r.type==="subtitle"&&r.track.source._codec==="webvtt"&&await this.processWebVTTCues(r,1/0),this.processTimestamps(r);if(this.isFragmented)await this.interleaveSamples(!0),await this.finalizeFragment(!1);else for(const r of this.trackDatas){await this.finalizeCurrentChunk(r),w(r.startTimestampOffset!==null);for(let a=0;a<r.samples.length;a++){const s=r.samples[a];s.timestamp-=r.startTimestampOffset,s.decodeTimestamp-=r.startTimestampOffset}}if(w(this.writer),w(this.boxWriter),this.fastStart==="in-memory"){let r;this.mdat=fe(!1);for(let s=0;s<2;s++){const o=Kt(this),n=this.boxWriter.measureBox(o);r=this.boxWriter.measureBox(this.mdat);let l=this.writer.getPos()+n+r;for(const c of this.finalizedChunks){c.offset=l;for(const{data:d}of c.samples)w(d),l+=d.byteLength,r+=d.byteLength}if(l<2**32)break;r>=2**32&&(this.mdat.largeSize=!0)}this.format._options.onMoov&&this.writer.startTrackingWrites();const a=Kt(this);if(this.boxWriter.writeBox(a),this.format._options.onMoov){const{data:s,start:o}=this.writer.stopTrackingWrites();this.format._options.onMoov(s,o)}this.format._options.onMdat&&this.writer.startTrackingWrites(),this.mdat.size=r,this.boxWriter.writeBox(this.mdat);for(const s of this.finalizedChunks)for(const o of s.samples)w(o.data),this.writer.write(o.data),o.data=null;if(this.format._options.onMdat){const{data:s,start:o}=this.writer.stopTrackingWrites();this.format._options.onMdat(s,o)}}else if(this.isFragmented)if(this.isCmaf){const r=this.segmentHeaderSize!==null?this.writer.getPos()-this.segmentHeaderSize:0;this.writer.seek(0),this.boxWriter.writeBox(Tr()),this.boxWriter.writeBox(Cr(this,r))}else{const r=this.writer.getPos(),a=(e=this.trackDatas,B("mfra",void 0,[...e.map(co),lo()]));this.boxWriter.writeBox(a);const s=this.writer.getPos()-r;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(s)}else{w(this.mdat);const r=this.boxWriter.offsets.get(this.mdat);w(r!==void 0);const a=this.writer.getPos()-r;if(this.mdat.size=a,this.mdat.largeSize=a>=2**32,this.boxWriter.patchBox(this.mdat),this.format._options.onMdat){const{data:o,start:n}=this.writer.stopTrackingWrites();this.format._options.onMdat(o,n)}const s=Kt(this);if(this.fastStart==="reserve"){w(this.ftypSize!==null),this.writer.seek(this.ftypSize),this.format._options.onMoov&&this.writer.startTrackingWrites(),this.boxWriter.writeBox(s);const o=this.boxWriter.offsets.get(this.mdat)-this.writer.getPos();this.boxWriter.writeBox({type:"free",size:o})}else this.format._options.onMoov&&this.writer.startTrackingWrites(),this.boxWriter.writeBox(s);if(this.format._options.onMoov){const{data:o,start:n}=this.writer.stopTrackingWrites();this.format._options.onMoov(o,n)}}var e;t()}}const Dr="Mediabunny",Eo={video:1,audio:2,subtitle:17};class So extends wr{constructor(t,e){super(t),this.trackDatas=[],this.allTracksKnown=Be(),this.segment=null,this.segmentInfo=null,this.seekHead=null,this.tracksElement=null,this.tagsElement=null,this.attachmentsElement=null,this.segmentDuration=null,this.cues=null,this.currentCluster=null,this.currentClusterStartMsTimestamp=null,this.currentClusterMaxMsTimestamp=null,this.trackDatasInCurrentCluster=new Map,this.startTimestamp=1/0,this.endTimestamp=-1/0,this.format=e}async start(){const t=await this.mutex.acquire();this.writer=await this.output._getRootWriter(!!this.format._options.appendOnly),this.ebmlWriter=new as(this.writer),this.writeEBMLHeader(),this.createSegmentInfo(),this.createCues(),await this.writer.flush(),t()}writeEBMLHeader(){this.format._options.onEbmlHeader&&this.writer.startTrackingWrites();const t={id:v.EBML,data:[{id:v.EBMLVersion,data:1},{id:v.EBMLReadVersion,data:1},{id:v.EBMLMaxIDLength,data:4},{id:v.EBMLMaxSizeLength,data:8},{id:v.DocType,data:this.format instanceof ye?"webm":"matroska"},{id:v.DocTypeVersion,data:2},{id:v.DocTypeReadVersion,data:2}]};if(this.ebmlWriter.writeEBML(t),this.format._options.onEbmlHeader){const{data:e,start:r}=this.writer.stopTrackingWrites();this.format._options.onEbmlHeader(e,r)}}maybeCreateSeekHead(t){if(this.format._options.appendOnly)return;const e=new Uint8Array([28,83,187,107]),r=new Uint8Array([21,73,169,102]),a=new Uint8Array([22,84,174,107]),s=new Uint8Array([25,65,164,105]),o=new Uint8Array([18,84,195,103]),n={id:v.SeekHead,data:[{id:v.Seek,data:[{id:v.SeekID,data:e},{id:v.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.cues)-this.segmentDataOffset:0}]},{id:v.Seek,data:[{id:v.SeekID,data:r},{id:v.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.segmentInfo)-this.segmentDataOffset:0}]},{id:v.Seek,data:[{id:v.SeekID,data:a},{id:v.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.tracksElement)-this.segmentDataOffset:0}]},this.attachmentsElement?{id:v.Seek,data:[{id:v.SeekID,data:s},{id:v.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.attachmentsElement)-this.segmentDataOffset:0}]}:null,this.tagsElement?{id:v.Seek,data:[{id:v.SeekID,data:o},{id:v.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.tagsElement)-this.segmentDataOffset:0}]}:null]};this.seekHead=n}createSegmentInfo(){const t={id:v.Duration,data:new Oe(0)};this.segmentDuration=t;const e={id:v.Info,data:[{id:v.TimestampScale,data:1e6},{id:v.MuxingApp,data:Dr},{id:v.WritingApp,data:Dr},this.format._options.appendOnly?null:t]};this.segmentInfo=e}createTracks(){var e,r,a,s,o,n;const t={id:v.Tracks,data:[]};this.tracksElement=t;for(const l of this.trackDatas){const c=ss[l.track.source._codec];w(c);let d=0;if(l.type==="audio"&&l.track.source._codec==="opus"){d=8e7;const h=l.info.decoderConfig.description;if(h){const m=Z(h),u=tr(m);d=Math.round(u.preSkip/48e3*1e9)}}t.data.push({id:v.TrackEntry,data:[{id:v.TrackNumber,data:l.track.id},{id:v.TrackUID,data:l.track.id},{id:v.TrackType,data:Eo[l.type]},((e=l.track.metadata.disposition)==null?void 0:e.default)===!1?{id:v.FlagDefault,data:0}:null,(r=l.track.metadata.disposition)!=null&&r.forced?{id:v.FlagForced,data:1}:null,(a=l.track.metadata.disposition)!=null&&a.hearingImpaired?{id:v.FlagHearingImpaired,data:1}:null,(s=l.track.metadata.disposition)!=null&&s.visuallyImpaired?{id:v.FlagVisualImpaired,data:1}:null,(o=l.track.metadata.disposition)!=null&&o.original?{id:v.FlagOriginal,data:1}:null,(n=l.track.metadata.disposition)!=null&&n.commentary?{id:v.FlagCommentary,data:1}:null,{id:v.FlagLacing,data:0},{id:v.Language,data:l.track.metadata.languageCode??"und"},{id:v.CodecID,data:c},{id:v.CodecDelay,data:0},{id:v.SeekPreRoll,data:d},l.track.metadata.name!==void 0?{id:v.Name,data:new Pt(l.track.metadata.name)}:null,l.type==="video"?this.videoSpecificTrackInfo(l):null,l.type==="audio"?this.audioSpecificTrackInfo(l):null,l.type==="subtitle"?this.subtitleSpecificTrackInfo(l):null]})}}videoSpecificTrackInfo(t){const{frameRate:e,rotation:r}=t.track.metadata,a=[t.info.decoderConfig.description?{id:v.CodecPrivate,data:Z(t.info.decoderConfig.description)}:null,e?{id:v.DefaultDuration,data:1e9/e}:null],s=r?Ci(-r):0,o=!!t.info.aspectRatio&&t.info.aspectRatio.num*t.info.height!==t.info.aspectRatio.den*t.info.width,n=t.info.decoderConfig.colorSpace,l={id:v.Video,data:[{id:v.PixelWidth,data:t.info.width},{id:v.PixelHeight,data:t.info.height},o?{id:v.DisplayWidth,data:t.info.aspectRatio.num}:null,o?{id:v.DisplayHeight,data:t.info.aspectRatio.den}:null,o?{id:v.DisplayUnit,data:3}:null,t.info.alphaMode?{id:v.AlphaMode,data:1}:null,Si(n)?{id:v.Colour,data:[{id:v.MatrixCoefficients,data:jt[n.matrix]},{id:v.TransferCharacteristics,data:Nt[n.transfer]},{id:v.Primaries,data:Ht[n.primaries]},{id:v.Range,data:n.fullRange?2:1}]}:null,s?{id:v.Projection,data:[{id:v.ProjectionType,data:0},{id:v.ProjectionPoseRoll,data:new Le((s+180)%360-180)}]}:null]};return a.push(l),a}audioSpecificTrackInfo(t){const e=vt.includes(t.track.source._codec)?Ft(t.track.source._codec):null;return[t.info.decoderConfig.description?{id:v.CodecPrivate,data:Z(t.info.decoderConfig.description)}:null,{id:v.Audio,data:[{id:v.SamplingFrequency,data:new Le(t.info.sampleRate)},{id:v.Channels,data:t.info.numberOfChannels},e?{id:v.BitDepth,data:8*e.sampleSize}:null]}]}subtitleSpecificTrackInfo(t){return[{id:v.CodecPrivate,data:J.encode(t.info.config.description)}]}maybeCreateTags(){const t=[],e=(s,o)=>{t.push({id:v.SimpleTag,data:[{id:v.TagName,data:new Pt(s)},typeof o=="string"?{id:v.TagString,data:new Pt(o)}:{id:v.TagBinary,data:o}]})},r=this.output._metadataTags,a=new Set;for(const{key:s,value:o}of Ae(r))switch(s){case"title":e("TITLE",o),a.add("TITLE");break;case"description":e("DESCRIPTION",o),a.add("DESCRIPTION");break;case"artist":e("ARTIST",o),a.add("ARTIST");break;case"album":e("ALBUM",o),a.add("ALBUM");break;case"albumArtist":e("ALBUM_ARTIST",o),a.add("ALBUM_ARTIST");break;case"genre":e("GENRE",o),a.add("GENRE");break;case"comment":e("COMMENT",o),a.add("COMMENT");break;case"lyrics":e("LYRICS",o),a.add("LYRICS");break;case"date":e("DATE",o.toISOString().slice(0,10)),a.add("DATE");break;case"trackNumber":e("PART_NUMBER",r.tracksTotal!==void 0?`${o}/${r.tracksTotal}`:o.toString()),a.add("PART_NUMBER");break;case"discNumber":e("DISC",r.discsTotal!==void 0?`${o}/${r.discsTotal}`:o.toString()),a.add("DISC");break;case"tracksTotal":case"discsTotal":case"images":case"raw":break;default:Wt(s)}if(r.raw)for(const s in r.raw){const o=r.raw[s];o==null||a.has(s)||(typeof o=="string"||o instanceof Uint8Array)&&e(s,o)}t.length!==0&&(this.tagsElement={id:v.Tags,data:[{id:v.Tag,data:[{id:v.Targets,data:[{id:v.TargetTypeValue,data:50},{id:v.TargetType,data:"MOVIE"}]},...t]}]})}maybeCreateAttachments(){const t=this.output._metadataTags,e=[],r=new Set,a=t.images??[];for(const s of a){let o,n=s.name;for(n===void 0&&(n=(s.kind==="coverFront"?"cover":s.kind==="coverBack"?"back":"image")+(Ra(s.mimeType)??""));;){o=0n;for(let l=0;l<8;l++)o<<=8n,o|=BigInt(Math.floor(256*Math.random()));if(o!==0n&&!r.has(o))break}r.add(o),e.push({id:v.AttachedFile,data:[s.description!==void 0?{id:v.FileDescription,data:new Pt(s.description)}:null,{id:v.FileName,data:new Pt(n)},{id:v.FileMediaType,data:s.mimeType},{id:v.FileData,data:s.data},{id:v.FileUID,data:o}]})}for(const[s,o]of Object.entries(t.raw??{}))o instanceof Oi&&/^\d+$/.test(s)&&(a.find(n=>n.mimeType===o.mimeType&&Va(n.data,o.data))||e.push({id:v.AttachedFile,data:[o.description!==void 0?{id:v.FileDescription,data:new Pt(o.description)}:null,{id:v.FileName,data:new Pt(o.name??"")},{id:v.FileMediaType,data:o.mimeType??""},{id:v.FileData,data:o.data},{id:v.FileUID,data:BigInt(s)}]}));e.length!==0&&(this.attachmentsElement={id:v.Attachments,data:e})}createSegment(){this.createTracks(),this.maybeCreateTags(),this.maybeCreateAttachments(),this.maybeCreateSeekHead(!1);const t={id:v.Segment,size:this.format._options.appendOnly?-1:6,data:[this.seekHead,this.segmentInfo,this.tracksElement,this.attachmentsElement,this.tagsElement]};if(this.segment=t,this.format._options.onSegmentHeader&&this.writer.startTrackingWrites(),this.ebmlWriter.writeEBML(t),this.format._options.onSegmentHeader){const{data:e,start:r}=this.writer.stopTrackingWrites();this.format._options.onSegmentHeader(e,r)}}createCues(){this.cues={id:v.Cues,data:[]}}get segmentDataOffset(){return w(this.segment),this.ebmlWriter.dataOffsets.get(this.segment)}allTracksAreKnown(){for(const t of this.output._tracks)if(!t.source._closed&&!this.trackDatas.some(e=>e.track===t))return!1;return!0}async getMimeType(){await this.allTracksKnown.promise;const t=this.trackDatas.map(e=>e.type==="video"||e.type==="audio"?e.info.decoderConfig.codec:{webvtt:"wvtt"}[e.track.source._codec]);return(e=>{let r=(e.hasVideo?"video/":e.hasAudio?"audio/":"application/")+(e.isWebM?"webm":"x-matroska");return e.codecStrings.length>0&&(r+=`; codecs="${[...new Set(e.codecStrings.filter(Boolean))].join(", ")}"`),r})({isWebM:this.format instanceof ye,hasVideo:this.trackDatas.some(e=>e.type==="video"),hasAudio:this.trackDatas.some(e=>e.type==="audio"),codecStrings:t})}getVideoTrackData(t,e,r){const a=this.trackDatas.find(c=>c.track===t);if(a)return a;ji(r),w(r),w(r.decoderConfig),w(r.decoderConfig.codedWidth!==void 0),w(r.decoderConfig.codedHeight!==void 0);const s=r.decoderConfig.displayAspectWidth,o=r.decoderConfig.displayAspectHeight,n=s===void 0||o===void 0?null:Fe({num:s,den:o}),l={track:t,type:"video",info:{width:r.decoderConfig.codedWidth,height:r.decoderConfig.codedHeight,aspectRatio:n,decoderConfig:r.decoderConfig,alphaMode:!!e.sideData.alpha},chunkQueue:[],lastWrittenMsTimestamp:null,closed:!1};return t.source._codec==="vp9"?l.info.decoderConfig={...l.info.decoderConfig,description:new Uint8Array(Wa(l.info.decoderConfig.codec))}:t.source._codec==="av1"&&(l.info.decoderConfig={...l.info.decoderConfig,description:new Uint8Array(Hi(l.info.decoderConfig.codec))}),this.trackDatas.push(l),this.trackDatas.sort((c,d)=>c.track.id-d.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),l}getAudioTrackData(t,e,r){const a=this.trackDatas.find(l=>l.track===t);if(a)return a;qi(r),w(r),w(r.decoderConfig);const s={...r.decoderConfig};let o=!1;if(t.source._codec==="aac"&&!s.description){const l=he(Vt.tempFromBytes(e.data));if(!l)throw new Error("Couldn't parse ADTS header from the AAC packet. Make sure the packets are in ADTS format (as specified in ISO 13818-7) when not providing a description, or provide a description (must be an AudioSpecificConfig as specified in ISO 14496-3) and ensure the packets are raw AAC data.");const c=De[l.samplingFrequencyIndex],d=Re[l.channelConfiguration];if(c===void 0||d===void 0)throw new Error("Invalid ADTS frame header.");s.description=Wi({objectType:l.objectType,sampleRate:c,numberOfChannels:d}),o=!0}const n={track:t,type:"audio",info:{numberOfChannels:r.decoderConfig.numberOfChannels,sampleRate:r.decoderConfig.sampleRate,decoderConfig:s,requiresAdtsStripping:o},chunkQueue:[],lastWrittenMsTimestamp:null,closed:!1};return this.trackDatas.push(n),this.trackDatas.sort((l,c)=>l.track.id-c.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),n}getSubtitleTrackData(t,e){const r=this.trackDatas.find(s=>s.track===t);if(r)return r;Gi(e),w(e),w(e.config);const a={track:t,type:"subtitle",info:{config:e.config},chunkQueue:[],lastWrittenMsTimestamp:null,closed:!1};return this.trackDatas.push(a),this.trackDatas.sort((s,o)=>s.track.id-o.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),a}async addEncodedVideoPacket(t,e,r){const a=await this.mutex.acquire();try{const s=this.getVideoTrackData(t,e,r),o=e.type==="key";this.validateTimestamp(s.track,e.timestamp,o);let n=e.timestamp,l=e.duration;t.metadata.frameRate!==void 0&&(n=Ii(n,t.metadata.frameRate),l=Ii(l,t.metadata.frameRate));const c=s.info.alphaMode?e.sideData.alpha??null:null,d=this.createInternalChunk(e.data,n,l,e.type,c);t.source._codec==="vp9"&&this.fixVP9ColorSpace(s,d),s.chunkQueue.push(d),await this.interleaveChunks()}finally{a()}}async addEncodedAudioPacket(t,e,r){const a=await this.mutex.acquire();try{const s=this.getAudioTrackData(t,e,r);let o=e.data;if(s.info.requiresAdtsStripping){const c=he(Vt.tempFromBytes(o));if(!c)throw new Error("Expected ADTS frame, didn't get one.");const d=c.crcCheck===null?7:9;o=o.subarray(d)}const n=e.type==="key";this.validateTimestamp(s.track,e.timestamp,n);const l=this.createInternalChunk(o,e.timestamp,e.duration,e.type);s.chunkQueue.push(l),await this.interleaveChunks()}finally{a()}}async addSubtitleCue(t,e,r){const a=await this.mutex.acquire();try{const s=this.getSubtitleTrackData(t,r);this.validateTimestamp(s.track,e.timestamp,!0);let o=e.text;const n=Math.round(1e3*e.timestamp);me.lastIndex=0,o=o.replace(me,h=>{const m=(u=>{const p=ws.exec(u);if(!p)throw new Error("Expected match.");return 36e5*Number(p[1]||"0")+6e4*Number(p[2])+1e3*Number(p[3])+Number(p[4])})(h.slice(1,-1));return`<${br(m-n)}>`});const l=J.encode(o),c=`${e.settings??""}
3
- ${e.identifier??""}
4
- ${e.notes??""}`,d=this.createInternalChunk(l,e.timestamp,e.duration,"key",c.trim()?J.encode(c):null);s.chunkQueue.push(d),await this.interleaveChunks()}finally{a()}}async interleaveChunks(t=!1){if(t||this.allTracksAreKnown()){t:for(;;){let e=null,r=1/0;for(const s of this.trackDatas){if(!t&&s.chunkQueue.length===0&&!s.closed)break t;s.chunkQueue.length>0&&s.chunkQueue[0].timestamp<r&&(e=s,r=s.chunkQueue[0].timestamp)}if(!e)break;const a=e.chunkQueue.shift();this.writeBlock(e,a)}t||await this.writer.flush()}}fixVP9ColorSpace(t,e){if(e.type!=="key"||!t.info.decoderConfig.colorSpace||!t.info.decoderConfig.colorSpace.matrix)return;const r=new G(e.data);r.skipBits(2);const a=r.readBits(1),s=(r.readBits(1)<<1)+a;if(s===3&&r.skipBits(1),r.readBits(1)||r.readBits(1)!==0||(r.skipBits(2),r.readBits(24)!==4817730))return;s>=2&&r.skipBits(1);const o={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[t.info.decoderConfig.colorSpace.matrix];((n,l,c,d)=>{for(let h=l;h<c;h++){const m=Math.floor(h/8);let u=n[m];const p=7-(7&h);u&=~(1<<p),u|=(d&1<<c-h-1)>>c-h-1<<p,n[m]=u}})(e.data,r.pos,r.pos+3,o)}createInternalChunk(t,e,r,a,s=null){return{data:t,type:a,timestamp:e,duration:r,additions:s}}writeBlock(t,e){this.segment||this.createSegment();const r=Math.round(1e3*e.timestamp),a=this.trackDatas.every(d=>{if(t===d)return e.type==="key";const h=d.chunkQueue[0];return h?h.type==="key":d.closed});let s=!1;if(this.currentCluster){w(this.currentClusterStartMsTimestamp!==null),w(this.currentClusterMaxMsTimestamp!==null);const d=r-this.currentClusterStartMsTimestamp;s=a&&r>this.currentClusterMaxMsTimestamp&&d>=1e3*(this.format._options.minimumClusterDuration??1)||d>32767}else s=!0;s&&this.createNewCluster(r);const o=r-this.currentClusterStartMsTimestamp;if(o<-32768)return;const n=new Uint8Array(4),l=new DataView(n.buffer);l.setUint8(0,128|t.track.id),l.setInt16(1,o,!1);const c=Math.round(1e3*e.duration);if(e.additions){const d={id:v.BlockGroup,data:[{id:v.Block,data:[n,e.data]},e.type==="delta"?{id:v.ReferenceBlock,data:new rr(t.lastWrittenMsTimestamp-r)}:null,e.additions?{id:v.BlockAdditions,data:[{id:v.BlockMore,data:[{id:v.BlockAddID,data:1},{id:v.BlockAdditional,data:e.additions}]}]}:null,c>0?{id:v.BlockDuration,data:c}:null]};this.ebmlWriter.writeEBML(d)}else{l.setUint8(3,+(e.type==="key")<<7);const d={id:v.SimpleBlock,data:[n,e.data]};this.ebmlWriter.writeEBML(d)}this.startTimestamp=Math.min(this.startTimestamp,r),this.endTimestamp=Math.max(this.endTimestamp,r+c),t.lastWrittenMsTimestamp=r,this.trackDatasInCurrentCluster.has(t)||this.trackDatasInCurrentCluster.set(t,{firstMsTimestamp:r}),this.currentClusterMaxMsTimestamp=Math.max(this.currentClusterMaxMsTimestamp,r)}createNewCluster(t){this.currentCluster&&this.finalizeCurrentCluster(),this.format._options.onCluster&&this.writer.startTrackingWrites(),this.currentCluster={id:v.Cluster,size:this.format._options.appendOnly?-1:5,data:[{id:v.Timestamp,data:t}]},this.ebmlWriter.writeEBML(this.currentCluster),this.currentClusterStartMsTimestamp=t,this.currentClusterMaxMsTimestamp=t,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){if(w(this.currentCluster),!this.format._options.appendOnly){const a=this.writer.getPos()-this.ebmlWriter.dataOffsets.get(this.currentCluster),s=this.writer.getPos();this.writer.seek(this.ebmlWriter.offsets.get(this.currentCluster)+4),this.ebmlWriter.writeVarInt(a,5),this.writer.seek(s)}if(this.format._options.onCluster){w(this.currentClusterStartMsTimestamp!==null);const{data:a,start:s}=this.writer.stopTrackingWrites();this.format._options.onCluster(a,s,this.currentClusterStartMsTimestamp/1e3)}const t=this.ebmlWriter.offsets.get(this.currentCluster)-this.segmentDataOffset,e=new Map;for(const[a,{firstMsTimestamp:s}]of this.trackDatasInCurrentCluster)e.has(s)||e.set(s,[]),e.get(s).push(a);const r=[...e.entries()].sort((a,s)=>a[0]-s[0]);for(const[a,s]of r)w(this.cues),this.cues.data.push({id:v.CuePoint,data:[{id:v.CueTime,data:a},...s.map(o=>({id:v.CueTrackPositions,data:[{id:v.CueTrack,data:o.track.id},{id:v.CueClusterPosition,data:t}]}))]})}async onTrackClose(t){const e=await this.mutex.acquire(),r=this.trackDatas.find(a=>a.track===t);r&&(r.closed=!0),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),await this.interleaveChunks(),e()}async finalize(){const t=await this.mutex.acquire();this.allTracksKnown.resolve();for(const e of this.trackDatas)e.closed=!0;if(this.segment||this.createSegment(),await this.interleaveChunks(!0),this.currentCluster&&this.finalizeCurrentCluster(),w(this.cues),this.ebmlWriter.writeEBML(this.cues),!this.format._options.appendOnly){const e=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.ebmlWriter.offsets.get(this.segment)+4),this.ebmlWriter.writeVarInt(e,6);const r=this.startTimestamp===1/0?0:this.endTimestamp-this.startTimestamp;this.segmentDuration.data=new Oe(r),this.writer.seek(this.ebmlWriter.offsets.get(this.segmentDuration)),this.ebmlWriter.writeEBML(this.segmentDuration),w(this.seekHead),this.writer.seek(this.ebmlWriter.offsets.get(this.seekHead)),this.maybeCreateSeekHead(!0),this.ebmlWriter.writeEBML(this.seekHead)}t()}}class Ye{constructor(){this._connectedTrack=null,this._closingPromise=null,this._closed=!1}_ensureValidAdd(){if(!this._connectedTrack)throw new Error("Source is not connected to an output track.");if(this._connectedTrack.output.state==="canceled")throw new Error("Output has been canceled.");if(this._connectedTrack.output.state==="finalizing"||this._connectedTrack.output.state==="finalized")throw new Error("Output has been finalized.");if(this._connectedTrack.output.state==="pending")throw new Error("Output has not started.");if(this._closed)throw new Error("Source is closed.")}async _start(){}async _flushAndClose(t){}close(){if(this._closingPromise)return;const t=this._connectedTrack;if(!t)throw new Error("Cannot call close without connecting the source to an output track.");if(t.output.state==="pending")throw new Error("Cannot call close before output has been started.");this._closingPromise=(async()=>{await this._flushAndClose(!1),this._closed=!0,t.output.state!=="finalizing"&&t.output.state!=="finalized"&&t.output._muxer.onTrackClose(t)})()}async _flushOrWaitForOngoingClose(t){return this._closingPromise??(this._closingPromise=(async()=>{await this._flushAndClose(t),this._closed=!0})())}}class Rr extends Ye{constructor(t){if(super(),this._connectedTrack=null,!ct.includes(t))throw new TypeError(`Invalid video codec '${t}'. Must be one of: ${ct.join(", ")}.`);this._codec=t}}const Vr=(i,t)=>{if(i.metadata.hasOnlyKeyPackets&&t.type!=="key")throw new Error("Cannot add non-key packets to a hasOnlyKeyPackets video track.")};class Bo{constructor(t,e){this.source=t,this.encodingConfig=e,this.ensureEncoderPromise=null,this.encoderInitialized=!1,this.encoder=null,this.muxer=null,this.lastMultipleOfKeyFrameInterval=-1,this.emittedEncoderPackets=0,this.codedWidth=null,this.codedHeight=null,this.outputWidth=null,this.outputHeight=null,this.frameRateLastSample=null,this.frameRateLastTimestamp=null,this.frameRateLastEndTimestamp=null,this.preciseTimings=[],this.customEncoder=null,this.customEncoderCallSerializer=new Aa,this.customEncoderQueueSize=0,this.alphaEncoder=null,this.splitter=null,this.splitterCreationFailed=!1,this.alphaFrameQueue=[],this.error=null,this.lastMuxerPromise=Promise.resolve()}async add(t,e,r){var s,o,n,l,c,d,h,m,u,p,f,b;const a=t;try{this.checkForEncoderError(),this.source._ensureValidAdd();const y=this.encodingConfig,_=y.sizeChangeBehavior??"deny";let T=!1;if(this.codedWidth!==null&&this.codedHeight!==null){if((t.codedWidth!==this.codedWidth||t.codedHeight!==this.codedHeight)&&(T=!0,_==="deny"))throw new Error(`Video sample size must remain constant. Expected ${this.codedWidth}x${this.codedHeight}, got ${t.codedWidth}x${t.codedHeight}. To allow the sample size to change over time, set \`sizeChangeBehavior\` to a value other than 'deny' in the encoding options.`)}else this.codedWidth=t.codedWidth,this.codedHeight=t.codedHeight;if(((s=y.transform)==null?void 0:s.width)!==void 0||((o=y.transform)==null?void 0:o.height)!==void 0||((n=y.transform)==null?void 0:n.rotate)!==void 0||((l=y.transform)==null?void 0:l.crop)!==void 0||((c=y.transform)==null?void 0:c.force)===!0||T&&_!=="passThrough"){let E=(d=y.transform)==null?void 0:d.width,C=(h=y.transform)==null?void 0:h.height,I=((m=y.transform)==null?void 0:m.fit)??"fill";T&&_!=="passThrough"&&(w(this.outputWidth),w(this.outputHeight),w(_!=="deny"),E=this.outputWidth,C=this.outputHeight,I=_);const D=await t.transform({width:E,height:C,roundDimensionsTo:2,crop:(u=y.transform)==null?void 0:u.crop,rotate:(p=y.transform)==null?void 0:p.rotate,fit:I,alpha:y.alpha});this.outputWidth!==null&&this.outputHeight!==null||(this.outputWidth=D.displayWidth,this.outputHeight=D.displayHeight),e&&t.close(),t=D,e=!0}else this.outputWidth!==null&&this.outputHeight!==null||(this.outputWidth=t.codedWidth,this.outputHeight=t.codedHeight);const A=(f=y.transform)==null?void 0:f.frameRate;if(A!==void 0){const E=t.timestamp+t.duration,C=Ai(t.timestamp,A);if(this.frameRateLastSample!==null){if(C<=this.frameRateLastTimestamp)return this.frameRateLastSample.close(),this.frameRateLastSample=t.clone(),void(this.frameRateLastEndTimestamp=E);await this.padFrameRate(C,r)}t===a&&(t=t.clone(),e=!0),t.setTimestamp(C),t.setDuration(1/A),(b=this.frameRateLastSample)==null||b.close(),this.frameRateLastSample=t.clone(),this.frameRateLastTimestamp=C,this.frameRateLastEndTimestamp=E}await this.processAndEncode(t,r)}finally{e&&t.close()}}async processAndEncode(t,e){var s;const r=this.encodingConfig;let a;if((s=r.transform)!=null&&s.process){let o=r.transform.process(t);if(o instanceof Promise&&(o=await o),o===null)return;Array.isArray(o)||(o=[o]),a=o.map(n=>n instanceof it?n:typeof VideoFrame<"u"&&n instanceof VideoFrame?new it(n):new it(n,{timestamp:t.timestamp,duration:t.duration}))}else a=[t];try{for(const o of a){this.encoderInitialized||(this.ensureEncoderPromise||this.ensureEncoder(o),this.encoderInitialized||await this.ensureEncoderPromise),w(this.encoderInitialized);const n=this.encodingConfig.keyFrameInterval??2,l=Math.floor(o.timestamp/n),c={...e,keyFrame:(e==null?void 0:e.keyFrame)||n===0||l!==this.lastMultipleOfKeyFrameInterval};if(this.lastMultipleOfKeyFrameInterval=l,this.customEncoder){this.customEncoderQueueSize++;const d=o.clone(),h=this.customEncoderCallSerializer.call(()=>this.customEncoder.encode(d,c)).then(()=>this.customEncoderQueueSize--).catch(m=>this.error??(this.error=m)).finally(()=>{d.close()});this.customEncoderQueueSize>=4&&await h}else{w(this.encoder);const d=o.toVideoFrame(),h=Pi(this.preciseTimings,d.timestamp,u=>u.microsecondTimestamp),m=h!==-1?this.preciseTimings[h]:null;if(m&&m.microsecondTimestamp===d.timestamp?(m.timestamp!==o.timestamp&&(m.timestampIsValid=!1),m.duration!==o.duration&&(m.durationIsValid=!1)):(this.preciseTimings.splice(h+1,0,{microsecondTimestamp:d.timestamp,timestamp:o.timestamp,duration:o.duration,timestampIsValid:!0,durationIsValid:!0}),this.preciseTimings.length>128&&this.preciseTimings.shift()),this.alphaEncoder)if(d.format&&!d.format.includes("A")||this.splitterCreationFailed)this.alphaFrameQueue.push(null),this.encoder.encode(d,c),d.close();else{const u=d.displayWidth,p=d.displayHeight;this.splitter||(this.splitter=new be(u,p));const{colorFrame:f,alphaFrame:b}=await this.splitter.update(d);this.alphaFrameQueue.push(b),this.encoder.encode(f,c),f.close()}else this.encoder.encode(d,c),d.close();this.encoder.encodeQueueSize>=4&&await new Promise(u=>this.encoder.addEventListener("dequeue",u,{once:!0}))}await this.lastMuxerPromise}}finally{for(const o of a)o!==t&&o.close()}}async padFrameRate(t,e){const r=this.encodingConfig.transform.frameRate;w(this.frameRateLastSample);const a=Math.round((t-this.frameRateLastTimestamp)*r);for(let s=1;s<a;s++){const o=this.frameRateLastSample.clone();o.setTimestamp(this.frameRateLastTimestamp+s/r),o.setDuration(1/r),await this.processAndEncode(o,e),o.close()}}ensureEncoder(t){this.ensureEncoderPromise=(async()=>{var a,s,o;const e=fr({...this.encodingConfig,width:t.codedWidth,height:t.codedHeight,squarePixelWidth:t.squarePixelWidth,squarePixelHeight:t.squarePixelHeight,framerate:(a=this.source._connectedTrack)==null?void 0:a.metadata.frameRate});(o=(s=this.encodingConfig).onEncoderConfig)==null||o.call(s,e);const r=gr.find(n=>n.supports(this.encodingConfig.codec,e));if(r)this.customEncoder=new r,this.customEncoder.codec=this.encodingConfig.codec,this.customEncoder.config=e,this.customEncoder.onPacket=(n,l)=>{var c,d;if(!(n instanceof Xt))throw new TypeError("The first argument passed to onPacket must be an EncodedPacket.");if(l!==void 0&&(!l||typeof l!="object"))throw new TypeError("The second argument passed to onPacket must be an object or undefined.");Vr(this.source._connectedTrack,n),(d=(c=this.encodingConfig).onEncodedPacket)==null||d.call(c,n,l),this.lastMuxerPromise=this.muxer.addEncodedVideoPacket(this.source._connectedTrack,n,l).catch(h=>{this.error??(this.error=h)})},await this.customEncoder.init();else{if(typeof VideoEncoder>"u")throw new Error("VideoEncoder is not supported by this browser.");if(e.alpha="discard",this.encodingConfig.alpha==="keep"&&(e.latencyMode="quality"),(e.width%2==1||e.height%2==1)&&(this.encodingConfig.codec==="avc"||this.encodingConfig.codec==="hevc"))throw new Error(`The dimensions ${e.width}x${e.height} are not supported for codec '${this.encodingConfig.codec}'; both width and height must be even numbers. Make sure to round your dimensions to the nearest even number.`);if(!(await VideoEncoder.isConfigSupported(e)).supported)throw new Error(`This specific encoder configuration (${e.codec}, ${e.bitrate} bps, ${e.width}x${e.height}, hardware acceleration: ${e.hardwareAcceleration??"no-preference"}) is not supported by this browser. Consider using another codec or changing your video parameters.`);const n=[],l=[];let c=0,d=0;const h=(u,p,f)=>{var A,E;const b={};if(p){const C=new Uint8Array(p.byteLength);p.copyTo(C),b.alpha=C}let y=Xt.fromEncodedChunk(u,b);const _=Pi(this.preciseTimings,u.timestamp,C=>C.microsecondTimestamp),T=_!==-1?this.preciseTimings[_]:null;let S=null;this.emittedEncoderPackets===0&&y.type==="delta"&&(f!=null&&f.decoderConfig)&&(S=is(this.encodingConfig.codec,f.decoderConfig,y.data)),(T&&T.microsecondTimestamp===u.timestamp||S!==null)&&(y=y.clone({timestamp:T!=null&&T.timestampIsValid?T.timestamp:void 0,duration:T!=null&&T.durationIsValid?T.duration:void 0,type:S??void 0})),Vr(this.source._connectedTrack,y),(E=(A=this.encodingConfig).onEncodedPacket)==null||E.call(A,y,f),this.lastMuxerPromise=this.muxer.addEncodedVideoPacket(this.source._connectedTrack,y,f).catch(C=>{this.error??(this.error=C)}),this.emittedEncoderPackets++},m=new Error("Encoding error").stack;if(this.encoder=new VideoEncoder({output:(u,p)=>{if(!this.alphaEncoder)return void h(u,null,p);const f=this.alphaFrameQueue.shift();w(f!==void 0),f?(this.alphaEncoder.encode(f,{keyFrame:u.type==="key"}),d++,f.close(),n.push({chunk:u,meta:p})):d===0?h(u,null,p):(l.push(c+d),n.push({chunk:u,meta:p}))},error:u=>{u.stack=m,this.error??(this.error=u)}}),this.encoder.configure(e),this.encodingConfig.alpha==="keep"){const u=new Error("Encoding error").stack;this.alphaEncoder=new VideoEncoder({output:(p,f)=>{d--;const b=n.shift();for(w(b!==void 0),h(b.chunk,p,b.meta),c++;l.length>0&&l[0]===c;){l.shift();const y=n.shift();w(y!==void 0),h(y.chunk,null,y.meta)}},error:p=>{p.stack=u,this.error??(this.error=p)}}),this.alphaEncoder.configure(e)}}w(this.source._connectedTrack),this.muxer=this.source._connectedTrack.output._muxer,this.encoderInitialized=!0})()}async flushAndClose(t){var e,r,a;if(t||this.checkForEncoderError(),!t&&this.frameRateLastSample){const s=this.encodingConfig.transform.frameRate,o=Ai(this.frameRateLastEndTimestamp,s);await this.padFrameRate(o)}(e=this.frameRateLastSample)==null||e.close(),this.frameRateLastSample=null,this.customEncoder?(t||this.customEncoderCallSerializer.call(()=>this.customEncoder.flush()),await this.customEncoderCallSerializer.call(()=>this.customEncoder.close())):this.encoder&&(t||(await this.encoder.flush(),await((r=this.alphaEncoder)==null?void 0:r.flush())),this.encoder.state!=="closed"&&this.encoder.close(),this.alphaEncoder&&this.alphaEncoder.state!=="closed"&&this.alphaEncoder.close(),this.alphaFrameQueue.forEach(s=>s==null?void 0:s.close()),(a=this.splitter)==null||a.close()),t||this.checkForEncoderError()}getQueueSize(){var t;return this.customEncoder?this.customEncoderQueueSize:((t=this.encoder)==null?void 0:t.encodeQueueSize)??0}checkForEncoderError(){if(this.error)throw this.error}}let Lr=!1;class be{constructor(t,e){this.canvas=null,this.gl=null,this.colorProgram=null,this.alphaProgram=null,this.vao=null,this.sourceTexture=null,this.alphaResolutionLocation=null,this.worker=null,this.pendingRequests=new Map,this.nextRequestId=0;const r=typeof OffscreenCanvas<"u"||typeof document<"u"&&typeof document.createElement=="function";if(!be.forceCpu&&r&&!Lr)try{typeof OffscreenCanvas<"u"?this.canvas=new OffscreenCanvas(t,e):(this.canvas=document.createElement("canvas"),this.canvas.width=t,this.canvas.height=e);const a=this.canvas.getContext("webgl2",{alpha:!0});if(!a)throw new Error("Couldn't acquire WebGL 2 context.");this.gl=a,this.colorProgram=this.createColorProgram(),this.alphaProgram=this.createAlphaProgram(),this.vao=this.createVAO(),this.sourceTexture=this.createTexture(),this.alphaResolutionLocation=this.gl.getUniformLocation(this.alphaProgram,"u_resolution"),this.gl.useProgram(this.colorProgram),this.gl.uniform1i(this.gl.getUniformLocation(this.colorProgram,"u_sourceTexture"),0),this.gl.useProgram(this.alphaProgram),this.gl.uniform1i(this.gl.getUniformLocation(this.alphaProgram,"u_sourceTexture"),0)}catch(a){this.gl=null,this.canvas=null,Lr=!0,console.warn("Falling back to CPU for color/alpha splitting.",a)}}async update(t){return this.gl?this.updateGpu(t):this.updateCpu(t)}updateGpu(t){w(this.gl),w(this.canvas),t.displayWidth===this.canvas.width&&t.displayHeight===this.canvas.height||(this.canvas.width=t.displayWidth,this.canvas.height=t.displayHeight),this.gl.activeTexture(this.gl.TEXTURE0),this.gl.bindTexture(this.gl.TEXTURE_2D,this.sourceTexture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,t);const e=this.runColorProgram(t),r=this.runAlphaProgram(t);return t.close(),{colorFrame:e,alphaFrame:r}}createVertexShader(){return w(this.gl),this.createShader(this.gl.VERTEX_SHADER,`#version 300 es
5
- in vec2 a_position;
6
- in vec2 a_texCoord;
7
- out vec2 v_texCoord;
8
-
9
- void main() {
10
- gl_Position = vec4(a_position, 0.0, 1.0);
11
- v_texCoord = a_texCoord;
12
- }
13
- `)}createColorProgram(){w(this.gl);const t=this.createVertexShader(),e=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es
14
- precision highp float;
15
-
16
- uniform sampler2D u_sourceTexture;
17
- in vec2 v_texCoord;
18
- out vec4 fragColor;
19
-
20
- void main() {
21
- vec4 source = texture(u_sourceTexture, v_texCoord);
22
- fragColor = vec4(source.rgb, 1.0);
23
- }
24
- `),r=this.gl.createProgram();return this.gl.attachShader(r,t),this.gl.attachShader(r,e),this.gl.linkProgram(r),r}createAlphaProgram(){w(this.gl);const t=this.createVertexShader(),e=this.createShader(this.gl.FRAGMENT_SHADER,`#version 300 es
25
- precision highp float;
26
-
27
- uniform sampler2D u_sourceTexture;
28
- uniform vec2 u_resolution; // The width and height of the canvas
29
- in vec2 v_texCoord;
30
- out vec4 fragColor;
31
-
32
- // This function determines the value for a single byte in the YUV stream
33
- float getByteValue(float byteOffset) {
34
- float width = u_resolution.x;
35
- float height = u_resolution.y;
36
-
37
- float yPlaneSize = width * height;
38
-
39
- if (byteOffset < yPlaneSize) {
40
- // This byte is in the luma plane. Find the corresponding pixel coordinates to sample from
41
- float y = floor(byteOffset / width);
42
- float x = mod(byteOffset, width);
43
-
44
- // Add 0.5 to sample the center of the texel
45
- vec2 sampleCoord = (vec2(x, y) + 0.5) / u_resolution;
46
-
47
- // The luma value is the alpha from the source texture
48
- return texture(u_sourceTexture, sampleCoord).a;
49
- } else {
50
- // Write a fixed value for chroma and beyond
51
- return 128.0 / 255.0;
52
- }
53
- }
54
-
55
- void main() {
56
- // Each fragment writes 4 bytes (R, G, B, A)
57
- float pixelIndex = floor(gl_FragCoord.y) * u_resolution.x + floor(gl_FragCoord.x);
58
- float baseByteOffset = pixelIndex * 4.0;
59
-
60
- vec4 result;
61
- for (int i = 0; i < 4; i++) {
62
- float currentByteOffset = baseByteOffset + float(i);
63
- result[i] = getByteValue(currentByteOffset);
64
- }
65
-
66
- fragColor = result;
67
- }
68
- `),r=this.gl.createProgram();return this.gl.attachShader(r,t),this.gl.attachShader(r,e),this.gl.linkProgram(r),r}createShader(t,e){w(this.gl);const r=this.gl.createShader(t);return this.gl.shaderSource(r,e),this.gl.compileShader(r),this.gl.getShaderParameter(r,this.gl.COMPILE_STATUS)||console.error("Shader compile error:",this.gl.getShaderInfoLog(r)),r}createVAO(){w(this.gl),w(this.colorProgram);const t=this.gl.createVertexArray();this.gl.bindVertexArray(t);const e=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),r=this.gl.createBuffer();this.gl.bindBuffer(this.gl.ARRAY_BUFFER,r),this.gl.bufferData(this.gl.ARRAY_BUFFER,e,this.gl.STATIC_DRAW);const a=this.gl.getAttribLocation(this.colorProgram,"a_position"),s=this.gl.getAttribLocation(this.colorProgram,"a_texCoord");return this.gl.enableVertexAttribArray(a),this.gl.vertexAttribPointer(a,2,this.gl.FLOAT,!1,16,0),this.gl.enableVertexAttribArray(s),this.gl.vertexAttribPointer(s,2,this.gl.FLOAT,!1,16,8),t}createTexture(){w(this.gl);const t=this.gl.createTexture();return this.gl.bindTexture(this.gl.TEXTURE_2D,t),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),t}runColorProgram(t){return w(this.gl),w(this.canvas),this.gl.useProgram(this.colorProgram),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4),new VideoFrame(this.canvas,{timestamp:t.timestamp,duration:t.duration??void 0,alpha:"discard"})}runAlphaProgram(t){w(this.gl),w(this.canvas),this.gl.useProgram(this.alphaProgram),this.gl.uniform2f(this.alphaResolutionLocation,this.canvas.width,this.canvas.height),this.gl.viewport(0,0,this.canvas.width,this.canvas.height),this.gl.clear(this.gl.COLOR_BUFFER_BIT),this.gl.bindVertexArray(this.vao),this.gl.drawArrays(this.gl.TRIANGLE_STRIP,0,4);const{width:e,height:r}=this.canvas,a=e*r+2*(Math.ceil(e/2)*Math.ceil(r/2)),s=Math.ceil(a/(4*e));let o=new Uint8Array(4*e*s);this.gl.readPixels(0,0,e,s,this.gl.RGBA,this.gl.UNSIGNED_BYTE,o),o=o.subarray(0,a),w(o[e*r]===128),w(o[o.length-1]===128);const n={format:"I420",codedWidth:e,codedHeight:r,timestamp:t.timestamp,duration:t.duration??void 0,transfer:[o.buffer]};return new VideoFrame(o,n)}updateCpu(t){if(!this.worker){const a=new Blob([`(${Po.toString()})()`],{type:"application/javascript"}),s=URL.createObjectURL(a);this.worker=new Worker(s),URL.revokeObjectURL(s),this.worker.addEventListener("message",o=>{const n=o.data,l=this.pendingRequests.get(n.id);l&&(this.pendingRequests.delete(n.id),"error"in n?l.reject(new Error(n.error)):l.resolve({colorFrame:n.colorFrame,alphaFrame:n.alphaFrame}))}),this.worker.addEventListener("error",o=>{const n=new Error(o.message||"Color/alpha splitter worker error.");for(const l of this.pendingRequests.values())l.reject(n);this.pendingRequests.clear()})}const e=this.nextRequestId++,r=Be();return this.pendingRequests.set(e,r),this.worker.postMessage({id:e,sourceFrame:t},{transfer:[t]}),r.promise}close(){var e,r,a;(r=(e=this.gl)==null?void 0:e.getExtension("WEBGL_lose_context"))==null||r.loseContext(),this.gl=null,this.canvas=null,(a=this.worker)==null||a.terminate(),this.worker=null;const t=new Error("Color/alpha splitter closed.");for(const s of this.pendingRequests.values())s.reject(t);this.pendingRequests.clear()}}be.forceCpu=!0;const Po=()=>{let i=null,t=Promise.resolve();self.addEventListener("message",s=>{const{id:o,sourceFrame:n}=s.data;t=t.then(async()=>{try{const{colorFrame:l,alphaFrame:c}=await e(n);self.postMessage({id:o,colorFrame:l,alphaFrame:c},{transfer:[l,c]})}catch(l){self.postMessage({id:o,error:l.message})}finally{n.close()}})});const e=async s=>{const o=s.format;if(!o)throw new Error("CPU color/alpha splitting requires a known VideoFrame format.");const n=s.codedWidth,l=s.codedHeight,c=s.allocationSize();if(i&&i.byteLength===c||(i=new Uint8Array(c)),await s.copyTo(i),o==="RGBA"||o==="BGRA")return r(i,n,l,o,s);if(o==="I420A"||o==="I420AP10"||o==="I420AP12"||o==="I422A"||o==="I422AP10"||o==="I422AP12"||o==="I444A"||o==="I444AP10"||o==="I444AP12")return a(i,n,l,o,s);throw new Error(`CPU color/alpha splitting does not support format '${o}'.`)},r=(s,o,n,l,c)=>{const d=o*n,h=Math.ceil(o/2),m=Math.ceil(n/2),u=new Uint8Array(d+h*m*2);for(let b=0,y=3;b<d;b++,y+=4)u[b]=s[y];u.fill(128,d);const p=new VideoFrame(s,{format:l==="RGBA"?"RGBX":"BGRX",codedWidth:o,codedHeight:n,timestamp:c.timestamp,duration:c.duration??void 0}),f={format:"I420",codedWidth:o,codedHeight:n,timestamp:c.timestamp,duration:c.duration??void 0,transfer:[u.buffer]};return{colorFrame:p,alphaFrame:new VideoFrame(u,f)}},a=(s,o,n,l,c)=>{const d=l.includes("P10"),h=l.includes("P12"),m=d||h?2:1;let u,p;l.startsWith("I420")?(u=Math.ceil(o/2),p=Math.ceil(n/2)):l.startsWith("I422")?(u=Math.ceil(o/2),p=n):(u=o,p=n);const f=o*n,b=f*m,y=f*m+2*(u*p*m),_=l.replace("A",""),T=Math.ceil(o/2)*Math.ceil(n/2),S=new Uint8Array(b+2*(T*m)),A=y;S.set(s.subarray(A,A+b),0);const E=b,C=d?512:h?2048:128;m===1?S.fill(C,E):new Uint16Array(S.buffer,E,2*T).fill(C);const I=d?"I420P10":h?"I420P12":"I420",D=new VideoFrame(s.subarray(0,y),{format:_,codedWidth:o,codedHeight:n,timestamp:c.timestamp,duration:c.duration??void 0}),V={format:I,codedWidth:o,codedHeight:n,timestamp:c.timestamp,duration:c.duration??void 0,transfer:[S.buffer]};return{colorFrame:D,alphaFrame:new VideoFrame(S,V)}}};class Mo extends Rr{constructor(t,e){if(!(typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&t instanceof OffscreenCanvas))throw new TypeError("canvas must be an HTMLCanvasElement or OffscreenCanvas.");(r=>{if(!r||typeof r!="object")throw new TypeError("Encoding config must be an object.");if(!ct.includes(r.codec))throw new TypeError(`Invalid video codec '${r.codec}'. Must be one of: ${ct.join(", ")}.`);if(!(r.bitrate instanceof ze)&&(!Number.isInteger(r.bitrate)||r.bitrate<=0))throw new TypeError("config.bitrate must be a positive integer or a quality.");if(r.keyFrameInterval!==void 0&&(!Number.isFinite(r.keyFrameInterval)||r.keyFrameInterval<0))throw new TypeError("config.keyFrameInterval, when provided, must be a non-negative number.");if(r.sizeChangeBehavior!==void 0&&!["deny","passThrough","fill","contain","cover"].includes(r.sizeChangeBehavior))throw new TypeError("config.sizeChangeBehavior, when provided, must be 'deny', 'passThrough', 'fill', 'contain' or 'cover'.");if(r.transform!==void 0){if(typeof r.transform!="object"||!r.transform)throw new TypeError("config.transform, when provided, must be an object.");if(r.transform.width!==void 0&&(!Number.isInteger(r.transform.width)||r.transform.width<=0))throw new TypeError("config.transform.width, when provided, must be a positive integer.");if(r.transform.height!==void 0&&(!Number.isInteger(r.transform.height)||r.transform.height<=0))throw new TypeError("config.transform.height, when provided, must be a positive integer.");if(r.transform.fit!==void 0&&!["fill","contain","cover"].includes(r.transform.fit))throw new TypeError('config.transform.fit, when provided, must be one of "fill", "contain", or "cover".');if(r.transform.width!==void 0&&r.transform.height!==void 0&&r.transform.fit===void 0&&!["fill","contain","cover"].includes(r.sizeChangeBehavior))throw new TypeError("When both config.transform.width and config.transform.height are provided, config.transform.fit must also be provided.");if(r.transform.fit!==void 0&&["fill","contain","cover"].includes(r.sizeChangeBehavior)&&r.transform.fit!==r.sizeChangeBehavior)throw new TypeError("config.transform.fit, when provided, cannot differ from config.sizeChangeBehavior when config.sizeChangeBehavior is 'fill', 'contain' or 'cover', as sizeChangeBehavior already determines the fitting algorithm.");if(r.transform.rotate!==void 0&&![0,90,180,270].includes(r.transform.rotate))throw new TypeError("config.transform.rotate, when provided, must be 0, 90, 180 or 270.");if(r.transform.crop!==void 0&&$e(r.transform.crop,"config.transform."),r.transform.process!==void 0&&typeof r.transform.process!="function")throw new TypeError("config.transform.process, when provided, must be a function.");if(r.transform.frameRate!==void 0&&(!Number.isFinite(r.transform.frameRate)||r.transform.frameRate<=0))throw new TypeError("config.transform.frameRate, when provided, must be a finite positive number.");if(r.transform.force!==void 0&&typeof r.transform.force!="boolean")throw new TypeError("config.transform.force, when provided, must be a boolean.")}if(r.onEncodedPacket!==void 0&&typeof r.onEncodedPacket!="function")throw new TypeError("config.onEncodedPacket, when provided, must be a function.");if(r.onEncoderConfig!==void 0&&typeof r.onEncoderConfig!="function")throw new TypeError("config.onEncoderConfig, when provided, must be a function.");pr(r.codec,r)})(e),super(e.codec),this._encoder=new Bo(this,e),this._canvas=t}add(t,e=0,r){if(!Number.isFinite(t)||t<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(e)||e<0)throw new TypeError("duration must be a non-negative number.");const a=new it(this._canvas,{timestamp:t,duration:e});return this._encoder.add(a,!0,r)}_flushAndClose(t){return this._encoder.flushAndClose(t)}}class Io extends Ye{constructor(t){if(super(),this._connectedTrack=null,!qt.includes(t))throw new TypeError(`Invalid audio codec '${t}'. Must be one of: ${qt.join(", ")}.`);this._codec=t}}class Ao extends Ye{constructor(t){if(super(),this._connectedTrack=null,!At.includes(t))throw new TypeError(`Invalid subtitle codec '${t}'. Must be one of: ${At.join(", ")}.`);this._codec=t}}class Ke{getSupportedVideoCodecs(){return this.getSupportedCodecs().filter(t=>ct.includes(t))}getSupportedAudioCodecs(){return this.getSupportedCodecs().filter(t=>qt.includes(t))}getSupportedSubtitleCodecs(){return this.getSupportedCodecs().filter(t=>At.includes(t))}_codecUnsupportedHint(t){return""}}class Je extends Ke{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.fastStart!==void 0&&![!1,"in-memory","reserve","fragmented"].includes(t.fastStart))throw new TypeError("options.fastStart, when provided, must be false, 'in-memory', 'reserve', or 'fragmented'.");if(t.minimumFragmentDuration!==void 0&&(!Number.isFinite(t.minimumFragmentDuration)||t.minimumFragmentDuration<0))throw new TypeError("options.minimumFragmentDuration, when provided, must be a non-negative number.");if(t.onFtyp!==void 0&&typeof t.onFtyp!="function")throw new TypeError("options.onFtyp, when provided, must be a function.");if(t.onMoov!==void 0&&typeof t.onMoov!="function")throw new TypeError("options.onMoov, when provided, must be a function.");if(t.onMdat!==void 0&&typeof t.onMdat!="function")throw new TypeError("options.onMdat, when provided, must be a function.");if(t.onMoof!==void 0&&typeof t.onMoof!="function")throw new TypeError("options.onMoof, when provided, must be a function.");if(t.metadataFormat!==void 0&&!["mdir","mdta","udta","auto"].includes(t.metadataFormat))throw new TypeError("options.metadataFormat, when provided, must be either 'auto', 'mdir', 'mdta', or 'udta'.");super(),this._options=t}getSupportedTrackCounts(){return{video:{min:0,max:4294967295},audio:{min:0,max:4294967295},subtitle:{min:0,max:4294967295},total:{min:1,max:4294967295}}}get supportsVideoRotationMetadata(){return!0}get supportsTimestampedMediaData(){return!0}_createMuxer(t){return new Co(t,this)}}class Ze extends Je{constructor(t){super(t)}get _name(){return"MP4"}get fileExtension(){return".mp4"}get mimeType(){return"video/mp4"}getSupportedCodecs(){return[...ct,...ce,"pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be",...At]}_codecUnsupportedHint(t){return new Wr().getSupportedCodecs().includes(t)?" Switching to MOV will grant support for this codec.":""}}class Or extends Je{constructor(t){super(t)}get _name(){return"CMAF"}get fileExtension(){return".m4s"}get mimeType(){return"video/mp4"}getSupportedCodecs(){return[...ct,...ce,"pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be",...At]}}class Wr extends Je{constructor(t){super(t)}get _name(){return"MOV"}get fileExtension(){return".mov"}get mimeType(){return"video/quicktime"}getSupportedCodecs(){return[...ct,...qt]}_codecUnsupportedHint(t){return new Ze().getSupportedCodecs().includes(t)?" Switching to MP4 will grant support for this codec.":""}}class Ur extends Ke{constructor(t={}){if(!t||typeof t!="object")throw new TypeError("options must be an object.");if(t.appendOnly!==void 0&&typeof t.appendOnly!="boolean")throw new TypeError("options.appendOnly, when provided, must be a boolean.");if(t.minimumClusterDuration!==void 0&&(!Number.isFinite(t.minimumClusterDuration)||t.minimumClusterDuration<0))throw new TypeError("options.minimumClusterDuration, when provided, must be a non-negative number.");if(t.onEbmlHeader!==void 0&&typeof t.onEbmlHeader!="function")throw new TypeError("options.onEbmlHeader, when provided, must be a function.");if(t.onSegmentHeader!==void 0&&typeof t.onSegmentHeader!="function")throw new TypeError("options.onHeader, when provided, must be a function.");if(t.onCluster!==void 0&&typeof t.onCluster!="function")throw new TypeError("options.onCluster, when provided, must be a function.");super(),this._options=t}_createMuxer(t){return new So(t,this)}get _name(){return"Matroska"}getSupportedTrackCounts(){return{video:{min:0,max:127},audio:{min:0,max:127},subtitle:{min:0,max:127},total:{min:1,max:127}}}get fileExtension(){return".mkv"}get mimeType(){return"video/x-matroska"}getSupportedCodecs(){return[...ct,...ce,...vt.filter(t=>!["pcm-s8","pcm-f32be","pcm-f64be","ulaw","alaw"].includes(t)),...At]}get supportsVideoRotationMetadata(){return!1}get supportsTimestampedMediaData(){return!0}}class ye extends Ur{constructor(t){super(t)}getSupportedCodecs(){return[...ct.filter(t=>["vp8","vp9","av1"].includes(t)),...qt.filter(t=>["opus","vorbis"].includes(t)),...At]}get _name(){return"WebM"}get fileExtension(){return".webm"}get mimeType(){return"video/webm"}_codecUnsupportedHint(t){return new Ur().getSupportedCodecs().includes(t)?" Switching to MKV will grant support for this codec.":""}}const Fo=["video","audio","subtitle"];class Jt{constructor(t,e,r,a,s){this.id=t,this.output=e,this.type=r,this.source=a,this.metadata=s}isVideoTrack(){return this.type==="video"}isAudioTrack(){return this.type==="audio"}isSubtitleTrack(){return this.type==="subtitle"}canBePairedWith(t){if(!(t instanceof Jt))throw new TypeError("other must be an OutputTrack.");if(this===t)return!1;const e=Ri(this.metadata.group),r=Ri(t.metadata.group);for(const a of e)if(this.type!==t.type&&r.some(s=>a===s)||r.some(s=>a._pairedGroups.has(s)))return!0;return!1}}class Do extends Jt{constructor(t,e,r,a){super(t,e,"video",r,a)}}class Ro extends Jt{constructor(t,e,r,a){super(t,e,"audio",r,a)}}class Vo extends Jt{constructor(t,e,r,a){super(t,e,"subtitle",r,a)}}class Zt{constructor(){this._pairedGroups=new Set}pairWith(t){if(!(t instanceof Zt))throw new TypeError("other must be an OutputTrackGroup.");if(this===t)throw new TypeError("Cannot pair a group with itself.");this._pairedGroups.add(t),t._pairedGroups.add(this)}}const ti=i=>{if(!i||typeof i!="object")throw new TypeError("metadata must be an object.");if(i.languageCode!==void 0&&(t=i.languageCode,!Ia.test(t)))throw new TypeError("metadata.languageCode, when provided, must be a three-letter, ISO 639-2/T language code.");var t;if(i.name!==void 0&&typeof i.name!="string")throw new TypeError("metadata.name, when provided, must be a string.");if(i.disposition!==void 0&&(e=>{if(!e||typeof e!="object")throw new TypeError("disposition must be an object.");if(e.default!==void 0&&typeof e.default!="boolean")throw new TypeError("disposition.default must be a boolean.");if(e.primary!==void 0&&typeof e.primary!="boolean")throw new TypeError("disposition.primary must be a boolean.");if(e.forced!==void 0&&typeof e.forced!="boolean")throw new TypeError("disposition.forced must be a boolean.");if(e.original!==void 0&&typeof e.original!="boolean")throw new TypeError("disposition.original must be a boolean.");if(e.commentary!==void 0&&typeof e.commentary!="boolean")throw new TypeError("disposition.commentary must be a boolean.");if(e.hearingImpaired!==void 0&&typeof e.hearingImpaired!="boolean")throw new TypeError("disposition.hearingImpaired must be a boolean.");if(e.visuallyImpaired!==void 0&&typeof e.visuallyImpaired!="boolean")throw new TypeError("disposition.visuallyImpaired must be a boolean.")})(i.disposition),i.maximumPacketCount!==void 0&&(!Number.isInteger(i.maximumPacketCount)||i.maximumPacketCount<0))throw new TypeError("metadata.maximumPacketCount, when provided, must be a non-negative integer.");if(i.group!==void 0&&!(i.group instanceof Zt)&&(!Array.isArray(i.group)||i.group.some(e=>!(e instanceof Zt))))throw new TypeError("metadata.group, when provided, must be an OutputTrackGroup instance or an array of OutputTrackGroup instances.")};class Lo extends Vi{get target(){const t="Output.target cannot be used when using PathedTarget with an async callback. Use the 'target' event instead.";if(this._rootTargetPromise)throw new TypeError(t);const e=this._getRootTarget();if(e instanceof Promise)throw new TypeError(t);return e}constructor(t){if(super(),this.state="pending",this.defaultTrackGroup=new Zt,this._onFinalize=null,this._unfinalizedTargets=new Set,this._rootWriterPromise=null,this._tracks=[],this._startPromise=null,this._cancelPromise=null,this._finalizePromise=null,this._mutex=new Bi,this._metadataTags={},this._rootTarget=null,this._rootTargetPromise=null,this._firstMediaStreamTimestamp=null,!t||typeof t!="object")throw new TypeError("options must be an object.");if(!(t.format instanceof Ke))throw new TypeError("options.format must be an OutputFormat.");if(!(t.target instanceof kt||t.target instanceof Qe))throw new TypeError("options.target must be a Target or a PathedTarget.");if(t.target instanceof kt&&this._rememberTarget(t.target),t.initTarget!==void 0&&!(t.initTarget instanceof kt)&&typeof t.initTarget!="function")throw new Error("options.initTarget, when provided, must be a Target or a function that returns or resolves to a Target.");if(t.onFinalize!==void 0&&typeof t.onFinalize!="function")throw new TypeError("options.onFinalize, when provided, must be a function.");this.format=t.format,this._target=t.target,this._onFinalize=t.onFinalize??null,this._initTarget=t.initTarget??null,this._initTarget instanceof kt&&this._rememberTarget(this._initTarget),this._muxer=t.format._createMuxer(this)}_getTargetValidated(t){w(this._target instanceof Qe);const e=this._target.getTarget(t),r=a=>{if(!(a instanceof kt))throw new TypeError("getTarget must return a Target.");return a};return e instanceof Promise?e.then(r):r(e)}async _getTarget(t){w(this._target instanceof Qe);const e=await this._getTargetValidated(t);return this._emit("target",{target:e,request:t,isRoot:t.isRoot}),this.state==="canceled"?await e._close():this._rememberTarget(e),e}_rememberTarget(t){this._unfinalizedTargets.add(t),t.on("finalized",()=>this._unfinalizedTargets.delete(t),{once:!0})}async _getInitTarget(){if(w(this._initTarget!==null),this._initTarget instanceof kt)return this._initTarget;const t=await this._initTarget();return this.state==="canceled"?await t._close():this._rememberTarget(t),t}_hasInitTarget(){return this._initTarget!==null}_getRootTarget(){if(this._rootTarget)return this._rootTarget;if(this._rootTargetPromise)return this._rootTargetPromise;if(this._target instanceof kt)return this._emit("target",{target:this._target,request:null,isRoot:!0}),this._rootTarget=this._target,this._target;const t={path:this._target.rootPath,isRoot:!0,mimeType:this.format.mimeType},e=this._getTargetValidated(t),r=a=>(this.state==="canceled"?a._close():this._rememberTarget(a),this._emit("target",{target:a,request:t,isRoot:!0}),this._rootTarget=a,a);return e instanceof Promise?this._rootTargetPromise=e.then(r):r(e)}_getRootWriter(t){return this._rootWriterPromise??(this._rootWriterPromise=(async()=>{const e=await this._getRootTarget(),r=new Ge(e,typeof t=="boolean"?t:t(e));return r.start(),r})())}addVideoTrack(t,e={}){if(!(t instanceof Rr))throw new TypeError("source must be a VideoSource.");if(ti(e),e.rotation!==void 0&&![0,90,180,270].includes(e.rotation))throw new TypeError(`Invalid video rotation: ${e.rotation}. Has to be 0, 90, 180 or 270.`);if(!this.format.supportsVideoRotationMetadata&&e.rotation)throw new Error(`${this.format._name} does not support video rotation metadata.`);if(e.frameRate!==void 0&&(!Number.isFinite(e.frameRate)||e.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${e.frameRate}. Must be a positive number.`);const r={...e};return r.group??(r.group=this.defaultTrackGroup),this._addTrack(new Do(this._tracks.length+1,this,t,r))}addAudioTrack(t,e={}){if(!(t instanceof Io))throw new TypeError("source must be an AudioSource.");ti(e);const r={...e};return r.group??(r.group=this.defaultTrackGroup),this._addTrack(new Ro(this._tracks.length+1,this,t,r))}addSubtitleTrack(t,e={}){if(!(t instanceof Ao))throw new TypeError("source must be a SubtitleSource.");ti(e);const r={...e};return r.group??(r.group=this.defaultTrackGroup),this._addTrack(new Vo(this._tracks.length+1,this,t,r))}setMetadataTags(t){if((e=>{if(!e||typeof e!="object")throw new TypeError("tags must be an object.");if(e.title!==void 0&&typeof e.title!="string")throw new TypeError("tags.title, when provided, must be a string.");if(e.description!==void 0&&typeof e.description!="string")throw new TypeError("tags.description, when provided, must be a string.");if(e.artist!==void 0&&typeof e.artist!="string")throw new TypeError("tags.artist, when provided, must be a string.");if(e.album!==void 0&&typeof e.album!="string")throw new TypeError("tags.album, when provided, must be a string.");if(e.albumArtist!==void 0&&typeof e.albumArtist!="string")throw new TypeError("tags.albumArtist, when provided, must be a string.");if(e.trackNumber!==void 0&&(!Number.isInteger(e.trackNumber)||e.trackNumber<=0))throw new TypeError("tags.trackNumber, when provided, must be a positive integer.");if(e.tracksTotal!==void 0&&(!Number.isInteger(e.tracksTotal)||e.tracksTotal<=0))throw new TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(e.discNumber!==void 0&&(!Number.isInteger(e.discNumber)||e.discNumber<=0))throw new TypeError("tags.discNumber, when provided, must be a positive integer.");if(e.discsTotal!==void 0&&(!Number.isInteger(e.discsTotal)||e.discsTotal<=0))throw new TypeError("tags.discsTotal, when provided, must be a positive integer.");if(e.genre!==void 0&&typeof e.genre!="string")throw new TypeError("tags.genre, when provided, must be a string.");if(e.date!==void 0&&(!(e.date instanceof Date)||Number.isNaN(e.date.getTime())))throw new TypeError("tags.date, when provided, must be a valid Date.");if(e.lyrics!==void 0&&typeof e.lyrics!="string")throw new TypeError("tags.lyrics, when provided, must be a string.");if(e.images!==void 0){if(!Array.isArray(e.images))throw new TypeError("tags.images, when provided, must be an array.");for(const r of e.images){if(!r||typeof r!="object")throw new TypeError("Each image in tags.images must be an object.");if(!(r.data instanceof Uint8Array))throw new TypeError("Each image.data must be a Uint8Array.");if(typeof r.mimeType!="string")throw new TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(r.kind))throw new TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(e.comment!==void 0&&typeof e.comment!="string")throw new TypeError("tags.comment, when provided, must be a string.");if(e.raw!==void 0){if(!e.raw||typeof e.raw!="object")throw new TypeError("tags.raw, when provided, must be an object.");for(const r of Object.values(e.raw))if(!(r===null||typeof r=="string"||r instanceof Uint8Array||r instanceof Li||r instanceof Oi||La(r)))throw new TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, Record<string, string>, or null.")}})(t),this.state!=="pending")throw new Error("Cannot set metadata tags after output has been started or canceled.");this._metadataTags=t}_addTrack(t){if(this.state!=="pending")throw new Error("Cannot add track after output has been started or canceled.");if(t.source._connectedTrack)throw new Error("Source is already used for a track.");const e=this.format.getSupportedTrackCounts(),r=this._tracks.reduce((o,n)=>o+(n.type===t.type?1:0),0),a=e[t.type].max;if(r===a)throw new Error(a===0?`${this.format._name} does not support ${t.type} tracks.`:`${this.format._name} does not support more than ${a} ${t.type} track`+(a===1?"":"s")+".");const s=e.total.max;if(this._tracks.length===s)throw new Error(`${this.format._name} does not support more than ${s} tracks`+(s===1?"":"s")+" in total.");if(t.isVideoTrack()){const o=this.format.getSupportedVideoCodecs();if(o.length===0)throw new Error(`${this.format._name} does not support video tracks.`+this.format._codecUnsupportedHint(t.source._codec));if(!o.includes(t.source._codec))throw new Error(`Codec '${t.source._codec}' cannot be contained within ${this.format._name}. Supported video codecs are: ${o.map(n=>`'${n}'`).join(", ")}.`+this.format._codecUnsupportedHint(t.source._codec))}else if(t.isAudioTrack()){const o=this.format.getSupportedAudioCodecs();if(o.length===0)throw new Error(`${this.format._name} does not support audio tracks.`+this.format._codecUnsupportedHint(t.source._codec));if(!o.includes(t.source._codec))throw new Error(`Codec '${t.source._codec}' cannot be contained within ${this.format._name}. Supported audio codecs are: ${o.map(n=>`'${n}'`).join(", ")}.`+this.format._codecUnsupportedHint(t.source._codec))}else if(t.isSubtitleTrack()){const o=this.format.getSupportedSubtitleCodecs();if(o.length===0)throw new Error(`${this.format._name} does not support subtitle tracks.`+this.format._codecUnsupportedHint(t.source._codec));if(!o.includes(t.source._codec))throw new Error(`Codec '${t.source._codec}' cannot be contained within ${this.format._name}. Supported subtitle codecs are: ${o.map(n=>`'${n}'`).join(", ")}.`+this.format._codecUnsupportedHint(t.source._codec))}return this._tracks.push(t),t.source._connectedTrack=t,t}async start(){const t=this.format.getSupportedTrackCounts();for(const r of Fo){const a=this._tracks.reduce((o,n)=>o+(n.type===r?1:0),0),s=t[r].min;if(a<s)throw new Error(s===t[r].max?`${this.format._name} requires exactly ${s} ${r} track${s===1?"":"s"}.`:`${this.format._name} requires at least ${s} ${r} track${s===1?"":"s"}.`)}const e=t.total.min;if(this._tracks.length<e)throw new Error(e===t.total.max?`${this.format._name} requires exactly ${e} track`+(e===1?"":"s")+".":`${this.format._name} requires at least ${e} track`+(e===1?"":"s")+".");if(this.state==="canceled")throw new Error("Output has been canceled.");return this._startPromise?(console.warn("Output has already been started."),this._startPromise):this._startPromise=(async()=>{this.state="started";const r=await this._mutex.acquire();try{await this._muxer.start();const a=this._tracks.map(s=>s.source._start());await Promise.all(a)}finally{r()}})()}getMimeType(){return this._muxer.getMimeType()}async cancel(){return this._cancelPromise?(console.warn("Output has already been canceled."),this._cancelPromise):this.state!=="finalizing"&&this.state!=="finalized"?this._cancelPromise=(async()=>{this.state="canceled";const t=await this._mutex.acquire();try{const e=this._tracks.map(r=>r.source._flushOrWaitForOngoingClose(!0));await Promise.all(e),await Promise.all([...this._unfinalizedTargets].map(r=>r._close())),this._unfinalizedTargets.clear()}finally{t()}})():void(this.state==="finalized"&&console.warn("Output has already been finalized."))}async finalize(){if(this.state==="pending")throw new Error("Cannot finalize before starting.");if(this.state==="canceled")throw new Error("Cannot finalize after canceling.");return this._finalizePromise?(console.warn("Output has already been finalized."),this._finalizePromise):this._finalizePromise=(async()=>{this.state="finalizing";const t=await this._mutex.acquire();try{const e=this._tracks.map(r=>r.source._flushOrWaitForOngoingClose(!1));if(await Promise.all(e),await this._muxer.finalize(),this._rootWriterPromise){const r=await this._rootWriterPromise;r.finalized||(await r.flush(),await r.finalize())}this._onFinalize&&await this._onFinalize(),this.state="finalized"}finally{t()}})()}}const Oo=["vp9","vp8"],Wo=["avc"];class Uo{constructor(t,e,r){g(this,"_pending",[]);this._source=t,this._plan=e,this._timeoutMs=r}get pendingCount(){return this._pending.length}enqueue(t){let e;try{e=Promise.resolve(this._source.add(t/this._plan.frameRate,1/this._plan.frameRate))}catch(r){e=Promise.reject(r)}e.catch(()=>{}),this._pending.push(e)}async drainOne(t){if(this._pending.length===0)return;const e=await ne(Promise.race(this._pending.map((r,a)=>r.then(()=>({index:a,error:null}),s=>({index:a,error:s})))),`Video encoder did not drain within ${this._timeoutMs}ms.`,t,this._timeoutMs);if(this._pending.splice(e.index,1),e.error)throw e.error}async drainAll(t,e){for(;this._pending.length>0;)await this.drainOne(t),e()}}class $o{async $record(t,e,r){this._throwIfAborted(t.signal),this._assertWebCodecsAvailable();const a=await this._createEncodingPlan(t);this._log(t,"video export plan",a),this._emitProgress(r,"recording","probing",0,a.frameCount);const s=a.format==="mp4"?new Ze:new ye,o=new we,n=new Lo({format:s,target:o}),l=n,c=new Mo(e.canvas,{codec:a.codec,bitrate:a.bitrate,alpha:a.transparent?"keep":"discard",bitrateMode:a.bitrateMode,latencyMode:a.latencyMode,hardwareAcceleration:a.hardwareAcceleration,keyFrameInterval:a.keyFrameInterval,sizeChangeBehavior:"deny"}),d=new Uo(c,a,3e4);n.addVideoTrack(c);try{if(await ne(n.start(),"Video output did not start within 30000ms.",t.signal,3e4),await e.$render({frameCount:a.frameCount,frameRate:a.frameRate,signal:t.signal,onFrame:async({frameIndex:h})=>{this._throwIfAborted(t.signal),d.enqueue(h),this._emitProgress(r,"recording","capturing",h+1,a.frameCount),await this._drainIfNeeded(d,r,a,h+1,t.signal),this._shouldYieldAfterCaptureFrame(h,a.frameCount)&&await this._yieldToBrowser(t.signal)}}),this._throwIfAborted(t.signal),await this._drainEncodes(d,r,a,t.signal),this._emitProgress(r,"encoding","finalizing",a.frameCount,a.frameCount),await ne(n.finalize(),"Video output did not finalize within 30000ms.",t.signal,3e4),this._emitProgress(r,"completed","finalizing",a.frameCount,a.frameCount),!o.buffer)throw new St("VIDEO_EXPORT_FAILED","Video encoder finalized without producing data.");return new Blob([o.buffer],{type:a.mimeType})}catch(h){try{await l.cancel()}catch{}const m=this._normalizeError(h);throw r==null||r({state:"error",message:m.message}),m}}async _drainIfNeeded(t,e,r,a,s){t.pendingCount<4||(await t.drainOne(s),this._emitProgress(e,"recording","draining",a,r.frameCount))}async _drainEncodes(t,e,r,a){await t.drainAll(a,()=>{this._throwIfAborted(a),this._emitProgress(e,"encoding","draining",r.frameCount,r.frameCount)})}_shouldYieldAfterCaptureFrame(t,e){const r=t+1;return r<e&&r%4==0}_yieldToBrowser(t){return new Promise((e,r)=>{if(t!=null&&t.aborted)return void r(Ot());let a=null,s=null,o=!1;const n=d=>{o||(o=!0,a!==null&&typeof globalThis.cancelAnimationFrame=="function"&&globalThis.cancelAnimationFrame(a),s!==null&&clearTimeout(s),t==null||t.removeEventListener("abort",l),d())},l=()=>n(()=>r(Ot())),c=()=>n(e);t==null||t.addEventListener("abort",l,{once:!0}),typeof globalThis.requestAnimationFrame!="function"?s=setTimeout(c,0):a=globalThis.requestAnimationFrame(()=>{a=null,s=setTimeout(c,0)})})}async _createEncodingPlan(t){if(t.format==="mp4"&&t.transparent)throw new St("VIDEO_TRANSPARENCY_UNSUPPORTED","MP4/H.264 export does not support portable alpha. Use saveVideo({ format: 'webm', transparent: true }) instead.");const e=Math.max(1,Math.round(t.width)),r=Math.max(1,Math.round(t.height)),a=this._resolveBitrate(t.bitrate,e,r,t.frameRate),s=t.format==="mp4"?new Ze:new ye,o=t.format==="mp4"?Wo:Oo,n=s.getSupportedVideoCodecs().filter(c=>o.includes(c)),l=await(async(c,d)=>{for(const h of c)if(await fs(h,d))return h;return null})(n,{width:e,height:r,bitrate:a});if(!l){const c=o.join(" or ");throw new St("VIDEO_CODEC_UNSUPPORTED",`This browser cannot encode ${c} at ${e}x${r}. Try a browser/device with native WebCodecs encoding support or reduce the export dimensions.`)}return{format:t.format,extension:t.format==="mp4"?".mp4":".webm",mimeType:s.mimeType,codec:l,bitrate:a,bitrateMode:t.bitrateMode,latencyMode:t.latencyMode,hardwareAcceleration:t.hardwareAcceleration,keyFrameInterval:t.keyFrameInterval,frameRate:t.frameRate,frameCount:t.frameCount,width:e,height:r,transparent:t.transparent}}_assertWebCodecsAvailable(){const t=globalThis;if(typeof t.VideoEncoder!="function"||typeof t.VideoFrame!="function")throw new St("VIDEO_EXPORT_UNSUPPORTED","Video export requires native WebCodecs VideoEncoder and VideoFrame support. This browser cannot produce deterministic video exports without a native encoder.")}_resolveBitrate(t,e,r,a){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return Math.round(t);const s=typeof t=="string"?t:"medium",o=e*r,n=Math.max(.5,a/60),l=s==="high"?6:s==="low"?1.5:3;return Math.max(25e4,Math.round(o*n*l))}_throwIfAborted(t){if(t!=null&&t.aborted)throw Ot()}_emitProgress(t,e,r,a,s){t==null||t({state:e,phase:r,frameIndex:a,frame:a,totalFrames:s,progress:s>0?a/s:0})}_normalizeError(t){return t instanceof St?t:new St("VIDEO_EXPORT_FAILED",t instanceof Error?t.message:"Video export failed.",t)}_log(t,...e){t.debugLogging&&console.debug("[textmode-export]",...e)}}class zo{constructor(t,e){g(this,"_recorder");g(this,"_textmodifier");g(this,"_registerPostDrawHook");this._recorder=new $o,this._textmodifier=t,this._registerPostDrawHook=e}async $saveVideo(t={}){await this._saveVideo(t.format??"mp4",t)}async _saveVideo(t,e){var s;const r=this._applyDefaultOptions(t,e),a=new Ba(this._textmodifier,this._registerPostDrawHook,r.width,r.height);try{const o=await this._recorder.$record(r,a,e.onProgress);new nt().$downloadFile(o,this._withExtension(r.filename,`.${t}`))}catch(o){throw(s=e.onProgress)==null||s.call(e,{state:"error",message:o instanceof Error?o.message:`${t.toUpperCase()} export failed`}),o}}_applyDefaultOptions(t,e){const r=this._positiveInteger(e.frameRate,60),a=this._positiveInteger(e.frameCount,300),s=this._positiveNumber(e.pixelDensity,1),o=this._currentPixelDensity(),n=Math.max(1,Math.round(this._textmodifier.canvas.width/o*s)),l=Math.max(1,Math.round(this._textmodifier.canvas.height/o*s));return{filename:e.filename,format:t,frameRate:r,frameCount:a,bitrate:this._bitrate(e.bitrate),bitrateMode:this._bitrateMode(e.bitrateMode),latencyMode:this._latencyMode(e.latencyMode),hardwareAcceleration:this._hardwareAcceleration(e.hardwareAcceleration),keyFrameInterval:this._keyFrameInterval(e.keyFrameInterval),pixelDensity:s,width:n,height:l,transparent:!!e.transparent,debugLogging:!!e.debugLogging,signal:e.signal}}_positiveInteger(t,e){return Number.isFinite(t)?Math.max(1,Math.round(Math.abs(t))):e}_positiveNumber(t,e){return Number.isFinite(t)?Math.max(Number.EPSILON,Math.abs(t)):e}_bitrate(t){return typeof t=="number"&&Number.isFinite(t)&&t>0||t==="low"||t==="medium"||t==="high"?t:"medium"}_bitrateMode(t){return t==="constant"||t==="variable"?t:"variable"}_latencyMode(t){return t==="quality"||t==="realtime"?t:"quality"}_hardwareAcceleration(t){return t==="prefer-hardware"||t==="prefer-software"||t==="no-preference"?t:"no-preference"}_keyFrameInterval(t){return Number.isFinite(t)?Math.max(0,Math.abs(t)):2}_currentPixelDensity(){var r;const t=this._textmodifier,e=(r=t.pixelDensity)==null?void 0:r.call(t);return typeof e=="number"&&Number.isFinite(e)&&e>0?e:1}_withExtension(t,e){if(!t)return;const r=t.trim();return r?r.toLowerCase().endsWith(e)?r:`${r}${e}`:void 0}}class Ho extends Y{$extractCellData(t){var n;const e=this.$extractFramebufferData(t.drawFramebuffer),r=[],a=t.grid,s=t.font;let o=0;for(let l=0;l<a.rows;l++)for(let c=0;c<a.cols;c++){const d=4*o,h=this.$getEncodedCharacterValue(e.characterPixels,d),m=this.$extractCellTransform(e.characterPixels,d),u=((n=ke(s,h))==null?void 0:n.character)??" ";r.push({x:c,y:l,character:u,foreground:re(e.primaryColorPixels,d),background:re(e.secondaryColorPixels,d),transform:{invert:m.isInverted,flipX:m.flipHorizontal,flipY:m.flipVertical,rotation:m.rotation}}),o++}return r}}const $r="1.2.1",zr="textmode.document",Hr="2.0.0";class ei{_applyDefaultOptions(t){return{target:t.target??"selected",pretty:t.pretty??!0,colorMode:t.colorMode??"hex",includeMetadata:t.includeMetadata??!0,filename:t.filename,layer:t.layer}}_createMetadata(t){return t.includeMetadata?{createdAt:new Date().toISOString(),generator:{name:"textmode.export.js",version:$r}}:void 0}_formatColor(t,e){return e==="rgba"?{...t}:`#${[t.r,t.g,t.b,t.a].map(r=>r.toString(16).padStart(2,"0")).join("")}`}_createObjectRowsCells(t,e,r,a){const s=[];for(let o=0;o<r;o++){const n=o*e,l=t.slice(n,n+e).map(c=>({x:c.x,y:c.y,character:c.character,foreground:this._formatColor(c.foreground,a),background:this._formatColor(c.background,a),transform:{...c.transform}}));s.push(l)}return{encoding:"object-rows-v1",rows:s}}_createLayerGrid(t){return{cols:t.grid.cols,rows:t.grid.rows,cellWidth:t.grid.cellWidth,cellHeight:t.grid.cellHeight}}_createLayerCells(t,e){const r=new Ho().$extractCellData(t);return this._createObjectRowsCells(r,t.grid.cols,t.grid.rows,e.colorMode)}_createStackLayer(t,e){return{id:t.id,visible:t.visible,opacity:t.opacity,blendMode:t.blendMode,offsetX:t.offsetX,offsetY:t.offsetY,rotationZ:t.rotationZ,grid:this._createLayerGrid(t),cells:this._createLayerCells(t,e)}}$generateJSONData(t,e={}){const r=this._applyDefaultOptions(e),a=this._createMetadata(r);if(r.target==="all"){const o=(function(l){return[l.layers.base,...l.layers.all].map(c=>{const d=c;return{...ie(l,c),visible:d._visible??!0,opacity:d._opacity??1,blendMode:d._blendMode??"normal",offsetX:d._offsetX??0,offsetY:d._offsetY??0,rotationZ:d._rotation??0}})})(t),n=o[0].grid;return{format:zr,formatVersion:Hr,target:"all",...a?{metadata:a}:{},canvas:{width:n.width,height:n.height},layers:o.map(l=>this._createStackLayer(l,r))}}const s=ie(t,r.layer);return{format:zr,formatVersion:Hr,target:"selected",...a?{metadata:a}:{},canvas:{width:s.grid.width,height:s.grid.height},grid:this._createLayerGrid(s),layer:{id:s.id,cells:this._createLayerCells(s,r)}}}$generateJSONString(t,e={}){const r=this._applyDefaultOptions(e),a=this.$generateJSONData(t,r),s=typeof r.pretty=="number"?r.pretty:r.pretty?2:0;return JSON.stringify(a,null,s)}$saveJSON(t,e={}){const r=this._applyDefaultOptions(e);new nt().$downloadFile(new Blob([this.$generateJSONString(t,r)],{type:"application/json;charset=utf-8"}),r.filename)}}const No="textmode-export-overlay",ut="textmode-export-overlay__stack",ii="textmode-export-overlay__stack--dense",Nr="textmode-export-overlay__stack--compact",jr="textmode-export-overlay__section",jo="textmode-export-overlay__header",qo="textmode-export-overlay__header-title-row",Go="textmode-export-overlay__header-identity",Xo="textmode-export-overlay__header-links",Qo="textmode-export-overlay__grab-handle",ri="textmode-export-overlay--dragging",Yo="textmode-export-overlay__row",qr="textmode-export-overlay__label",Gr="textmode-export-overlay__field",Xr="textmode-export-overlay__field--compact",Qr="textmode-export-overlay__field--dense",Yr="textmode-export-overlay__field--full",Kr="textmode-export-overlay__field--channel",Jr="textmode-export-overlay__input",Ko="textmode-export-overlay__checkbox",Zr="textmode-export-overlay__muted",Jo="textmode-export-overlay__status",Zo="textmode-export-overlay__status--gif",tn="textmode-export-overlay__status--video",en="textmode-export-overlay__status-title",rn="textmode-export-overlay__status-value",an="textmode-export-overlay__divider",sn="textmode-export-overlay__title",on="textmode-export-overlay__button",ai="textmode-export-overlay__button--primary",si="textmode-export-overlay__button--secondary",ta="textmode-export-overlay__button--full",nn="textmode-export-overlay__support-link",cn="textmode-export-overlay__support-icon",ea="textmode-export-overlay__link-icon";class mt{constructor(){g(this,"element");g(this,"mounted",!1);g(this,"destroyed",!1)}mount(t){if(this.destroyed)throw new Error("Cannot mount a destroyed component");if(this.mounted)return;const e=this.render();t.appendChild(e),this.element=e,this.onMount(),this.mounted=!0}unmount(){this.mounted&&this.element&&(this._onUnmount(),this.element.remove(),this.element=void 0,this.mounted=!1)}destroy(){this.destroyed||(this.unmount(),this._onDestroy(),this.destroyed=!0)}update(t){this.mounted&&this.onUpdate(t)}onMount(){}_onUnmount(){}_onDestroy(){}onUpdate(t){}get root(){if(!this.element)throw new Error("Component is not mounted yet");return this.element}isMounted(){return this.mounted}}const zt=class zt extends mt{constructor(){super(...arguments);g(this,"_dragHandle")}get dragHandleElement(){if(!this._dragHandle)throw new Error("Header drag handle is not mounted yet");return this._dragHandle}render(){this._dragHandle=void 0;const e=document.createElement("div");e.classList.add(ut,ii,jo);const r=document.createElement("div");r.classList.add(qo);const a=document.createElement("div");a.classList.add(Go);const s=this._createButton("Move export overlay",Qo,[{d:"M9 5h.01"},{d:"M15 5h.01"},{d:"M9 12h.01"},{d:"M15 12h.01"},{d:"M9 19h.01"},{d:"M15 19h.01"}]);this._dragHandle=s;const o=document.createElement("strong");o.textContent="textmode.export.js",o.classList.add(sn);const n=document.createElement("div");n.classList.add(Xo);const l=this._createLink("https://github.com/humanbydefinition/textmode.export.js","View repository on GitHub",ea,[{d:"M0 0h24v24H0z",fill:"none",stroke:"none"},{d:"M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5"}]),c=this._createLink("https://code.textmode.art/docs/support","Support textmode.export.js",cn,[{d:"M0 0h24v24H0z",fill:"none",stroke:"none"},{d:"M3 14c.83 .642 2.077 1.017 3.5 1c1.423 .017 2.67 -.358 3.5 -1c.83 -.642 2.077 -1.017 3.5 -1c1.423 -.017 2.67 .358 3.5 1"},{d:"M8 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2"},{d:"M12 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2"},{d:"M3 10h14v5a6 6 0 0 1 -6 6h-2a6 6 0 0 1 -6 -6v-5z"},{d:"M16.746 16.726a3 3 0 1 0 .252 -5.555"}]);n.appendChild(l),n.appendChild(c),a.appendChild(s),a.appendChild(o),r.appendChild(a),r.appendChild(n);const d=document.createElement("div");return d.classList.add(an),e.appendChild(r),e.appendChild(d),e}_createButton(e,r,a){const s=document.createElement("button");return s.type="button",s.classList.add(r),s.setAttribute("aria-label",e),s.title=e,s.appendChild(this._createIcon(ea,a)),s}_createLink(e,r,a,s){const o=document.createElement("a");return o.href=e,o.target="_blank",o.rel="noopener noreferrer",o.classList.add(nn),o.setAttribute("aria-label",r),o.appendChild(this._createIcon(a,s)),o}_createIcon(e,r){const a=document.createElementNS(zt._iconNamespace,"svg");a.setAttribute("xmlns",zt._iconNamespace),a.setAttribute("width","18"),a.setAttribute("height","18"),a.setAttribute("viewBox","0 0 24 24"),a.setAttribute("fill","none"),a.setAttribute("stroke","currentColor"),a.setAttribute("stroke-width","2"),a.setAttribute("stroke-linecap","round"),a.setAttribute("stroke-linejoin","round"),a.classList.add(e);for(const s of r){const o=document.createElementNS(zt._iconNamespace,"path");for(const[n,l]of Object.entries(s))o.setAttribute(n,l);a.appendChild(o)}return a}};g(zt,"_iconNamespace","http://www.w3.org/2000/svg");let oi=zt;class N extends mt{constructor(e){super();g(this,"props");this.props=e}render(){const e=document.createElement("div");e.classList.add(Gr),this.applyVariant(e,this.props.variant);const r=document.createElement("label");if(r.classList.add(qr),r.textContent=this.props.label,this.props.labelFor&&(r.htmlFor=this.props.labelFor),e.appendChild(r),this.props.description){const a=document.createElement("span");a.classList.add(Zr),a.textContent=this.props.description,e.appendChild(a)}return e}attachControl(e){this.root.appendChild(e)}update(e){this.props=e,super.update(e)}onUpdate(e){const r=this.root;for(;r.firstChild;)r.removeChild(r.firstChild);this.props=e,r.classList.add(Gr),this.applyVariant(r,e.variant);const a=document.createElement("label");if(a.classList.add(qr),a.textContent=e.label,e.labelFor&&(a.htmlFor=e.labelFor),r.appendChild(a),e.description){const s=document.createElement("span");s.classList.add(Zr),s.textContent=e.description,r.appendChild(s)}}applyVariant(e,r){switch(e.classList.remove(Xr,Qr,Yr,Kr),r){case"compact":e.classList.add(Xr);break;case"dense":e.classList.add(Qr);break;case"full":e.classList.add(Yr);break;case"channel":e.classList.add(Kr)}}}class pt extends mt{constructor(e){super();g(this,"props");g(this,"select");g(this,"handleChange",()=>{this.props.defaultValue=this.select.value});this.props=e}render(){return this.select=document.createElement("select"),this.select.classList.add(Jr),this.props.id&&(this.select.id=this.props.id),this.populateOptions(),this.select.addEventListener("change",this.handleChange),this.select}get selectElement(){return this.select}get value(){return this.select.value}set value(e){this.select&&(this.select.value=e),this.props.defaultValue=e}_onUnmount(){this.select.removeEventListener("change",this.handleChange)}onUpdate(e){this.props=e,this.populateOptions(),e.defaultValue&&(this.select.value=e.defaultValue)}update(e){this.props={...this.props,...e},this.select&&(e.id&&(this.select.id=e.id),e.options&&this.populateOptions(),e.defaultValue!==void 0&&(this.select.value=e.defaultValue))}populateOptions(){if(this.select){this.select.innerHTML="";for(const e of this.props.options){const r=document.createElement("option");r.value=e.value,r.textContent=e.label,this.select.appendChild(r)}this.props.defaultValue&&(this.select.value=this.props.defaultValue)}}}class ia extends mt{constructor(e){super();g(this,"props");g(this,"button");this.props=e}render(){return this.button=document.createElement("button"),this.button.type="button",this.button.textContent=this.props.label,this.button.classList.add(on),this.props.variant==="secondary"?this.button.classList.add(si):this.button.classList.add(ai),this.props.fullWidth&&this.button.classList.add(ta),this.button.disabled=!!this.props.disabled,this.button}get buttonElement(){return this.button}setLabel(e){this.props.label=e,this.button.textContent=e}setDisabled(e){this.props.disabled=e,this.button.disabled=e}onUpdate(e){this.props=e,this.button.textContent=e.label,this.button.disabled=!!e.disabled,e.variant==="secondary"?(this.button.classList.add(si),this.button.classList.remove(ai)):(this.button.classList.add(ai),this.button.classList.remove(si)),this.button.classList.toggle(ta,!!e.fullWidth)}}class dn{constructor(){g(this,"_listeners",{})}_getPool(t){const e=this._listeners[t];if(e)return e;const r=new Set;return this._listeners[t]=r,r}$on(t,e){const r=this._getPool(t);return r.add(e),()=>{r.delete(e),r.size===0&&delete this._listeners[t]}}$emit(t,e){const r=this._listeners[t];if(r)for(const a of[...r])try{a(e)}catch(s){console.error("[textmode-export] Event handler failed",s)}}$clear(){for(const t of Object.keys(this._listeners))delete this._listeners[t]}}class ln{constructor(t){g(this,"_state");g(this,"_listeners",new Set);this._state=t}get snapshot(){return Object.freeze({...this._state})}$set(t){const e=Object.keys(t);if(e.length===0)return;let r=!1;for(const s of e)if(this._state[s]!==t[s]){r=!0;break}if(!r)return;this._state=Object.assign({},this._state,t);const a=this.snapshot;for(const s of[...this._listeners])try{s(a)}catch(o){console.error("[textmode-export] State listener failed",o)}}$subscribe(t){return this._listeners.add(t),t(this.snapshot),()=>{this._listeners.delete(t)}}$reset(t){this._state=t;const e=this.snapshot;for(const r of[...this._listeners])r(e)}}const hn=new Set(["txt","json","svg","image"]);class un{constructor(t){g(this,"api");this.api=t}async $copy(t,e){switch(t){case"txt":{const r=this.api.toString(e);await navigator.clipboard.writeText(r);break}case"json":{const r=this.api.toJSONString(e);await navigator.clipboard.writeText(r);break}case"svg":{const r=this.api.toSVG(e);await navigator.clipboard.writeText(r);break}case"image":await this.api.copyCanvas(e);break;default:throw new Error(`Clipboard not supported for ${t}`)}}static isClipboardFormat(t){return hn.has(t)}}const mn={txt:(i,t)=>Promise.resolve(i.saveStrings(t)),json:(i,t)=>Promise.resolve(i.saveJSON(t)),image:(i,t)=>i.saveCanvas(t),svg:(i,t)=>Promise.resolve(i.saveSVG(t)),gif:(i,t,e)=>{const r={...t,onProgress:e.onGIFProgress};return i.saveGIF(r)},video:(i,t,e)=>{const r={...t,onProgress:e.onVideoProgress};return i.saveVideo(r)}};class pn{constructor(t,e){g(this,"api");g(this,"events");this.api=t,this.events=e}async $requestExport(t,e,r={}){this.events.$emit("export:request",{format:t});try{const a={onGIFProgress:r.onGIFProgress?s=>{var o;(o=r.onGIFProgress)==null||o.call(r,s),this.events.$emit("export:progress",{format:t,progress:s})}:t==="gif"?s=>this.events.$emit("export:progress",{format:t,progress:s}):void 0,onVideoProgress:r.onVideoProgress?s=>{var o;(o=r.onVideoProgress)==null||o.call(r,s),this.events.$emit("export:progress",{format:t,progress:s})}:t==="video"?s=>this.events.$emit("export:progress",{format:t,progress:s}):void 0};await mn[t](this.api,e,a),this.events.$emit("export:success",{format:t})}catch(a){throw this.events.$emit("export:error",{format:t,error:a}),a}}}const ve=i=>typeof i=="number"&&Number.isFinite(i)&&Math.abs(i)<=1e5;class fn{constructor(t="textmode.export.overlay.position.v1"){g(this,"key");this.key=t}load(){try{const t=window.localStorage.getItem(this.key);if(!t)return;const e=JSON.parse(t);return e.version!==1||!ve(e.offsetX)||!ve(e.offsetY)?void 0:{version:1,offsetX:e.offsetX,offsetY:e.offsetY}}catch{return}}save(t,e){if(ve(t)&&ve(e))try{const r={version:1,offsetX:t,offsetY:e};window.localStorage.setItem(this.key,JSON.stringify(r))}catch{}}clear(){try{window.localStorage.removeItem(this.key)}catch{}}}class gn{constructor(t,e,r=e,a=new fn){g(this,"modifier");g(this,"host");g(this,"surface");g(this,"storage");g(this,"animationFrameId",null);g(this,"handleUpdate");g(this,"bound",!1);g(this,"dragHandle");g(this,"dragState");g(this,"position");g(this,"renderedOffset");g(this,"handlePointerDown",t=>this.onPointerDown(t));g(this,"handlePointerMove",t=>this.onPointerMove(t));g(this,"handlePointerUp",t=>this.onPointerUp(t));g(this,"handleKeyDown",t=>this.onKeyDown(t));this.modifier=t,this.host=e,this.surface=r,this.storage=a,this.handleUpdate=()=>this.scheduleUpdate();const s=this.storage.load();this.position=s?{mode:"custom",offsetX:s.offsetX,offsetY:s.offsetY}:{mode:"auto",offsetX:8,offsetY:8},this.renderedOffset={offsetX:this.position.offsetX,offsetY:this.position.offsetY}}getPosition(){return Object.freeze({...this.position})}setPosition(t,e={}){Number.isFinite(t.offsetX)&&Number.isFinite(t.offsetY)&&(this.position={mode:"custom",offsetX:t.offsetX,offsetY:t.offsetY},this.scheduleUpdate(),(e.persist??1)&&this.storage.save(this.position.offsetX,this.position.offsetY))}resetPosition(){this.position={mode:"auto",offsetX:8,offsetY:8},this.storage.clear(),this.scheduleUpdate()}scheduleUpdate(){this.animationFrameId!==null&&cancelAnimationFrame(this.animationFrameId),this.animationFrameId=requestAnimationFrame(()=>this.update())}bind(){this.bound||(window.addEventListener("resize",this.handleUpdate),window.addEventListener("scroll",this.handleUpdate,!0),this.bound=!0,this.handleUpdate())}attachDragHandle(t){this.dragHandle!==t&&(this.detachDragHandle(),this.dragHandle=t,t.addEventListener("pointerdown",this.handlePointerDown),t.addEventListener("keydown",this.handleKeyDown))}detachDragHandle(){this.dragHandle&&(this.dragHandle.removeEventListener("pointerdown",this.handlePointerDown),this.dragHandle.removeEventListener("keydown",this.handleKeyDown),this.dragHandle.removeEventListener("pointermove",this.handlePointerMove),this.dragHandle.removeEventListener("pointerup",this.handlePointerUp),this.dragHandle.removeEventListener("pointercancel",this.handlePointerUp),this.dragHandle=void 0,this.dragState=void 0,this.surface.classList.remove(ri))}onPointerDown(t){var e,r;if(t.button===0&&this.dragHandle){t.preventDefault(),this.dragState={pointerId:t.pointerId,startClientX:t.clientX,startClientY:t.clientY,startOffsetX:this.renderedOffset.offsetX,startOffsetY:this.renderedOffset.offsetY},this.surface.classList.add(ri),this.dragHandle.addEventListener("pointermove",this.handlePointerMove),this.dragHandle.addEventListener("pointerup",this.handlePointerUp),this.dragHandle.addEventListener("pointercancel",this.handlePointerUp);try{(r=(e=this.dragHandle).setPointerCapture)==null||r.call(e,t.pointerId)}catch{}}}onPointerMove(t){this.dragState&&t.pointerId===this.dragState.pointerId&&(t.preventDefault(),this.setPosition({offsetX:this.dragState.startOffsetX+t.clientX-this.dragState.startClientX,offsetY:this.dragState.startOffsetY+t.clientY-this.dragState.startClientY},{persist:!1}))}onPointerUp(t){var e,r,a,s;if(this.dragState&&t.pointerId===this.dragState.pointerId&&this.dragHandle){t.preventDefault(),this.dragHandle.removeEventListener("pointermove",this.handlePointerMove),this.dragHandle.removeEventListener("pointerup",this.handlePointerUp),this.dragHandle.removeEventListener("pointercancel",this.handlePointerUp);try{(r=(e=this.dragHandle).hasPointerCapture)!=null&&r.call(e,t.pointerId)&&((s=(a=this.dragHandle).releasePointerCapture)==null||s.call(a,t.pointerId))}catch{}this.surface.classList.remove(ri),this.dragState=void 0,this.position.mode==="custom"&&this.storage.save(this.position.offsetX,this.position.offsetY)}}onKeyDown(t){const e=t.shiftKey?32:8,r=this.renderedOffset;switch(t.key){case"ArrowUp":t.preventDefault(),this.setPosition({offsetX:r.offsetX,offsetY:r.offsetY-e});break;case"ArrowDown":t.preventDefault(),this.setPosition({offsetX:r.offsetX,offsetY:r.offsetY+e});break;case"ArrowLeft":t.preventDefault(),this.setPosition({offsetX:r.offsetX-e,offsetY:r.offsetY});break;case"ArrowRight":t.preventDefault(),this.setPosition({offsetX:r.offsetX+e,offsetY:r.offsetY});break;case"Home":t.preventDefault(),this.resetPosition()}}update(){if(this.animationFrameId=null,this.host.style.display==="none")return;const t=this.modifier.canvas.getBoundingClientRect(),e=this.clampToViewport(t,this.position.offsetX,this.position.offsetY);this.host.style.top=`${t.top+window.scrollY+e.offsetY}px`,this.host.style.left=`${t.left+window.scrollX+e.offsetX}px`,this.renderedOffset=e}clampToViewport(t,e,r){const a=this.surface.getBoundingClientRect(),s=a.width||this.host.getBoundingClientRect().width||0,o=a.height||this.host.getBoundingClientRect().height||0,n=Math.max(8,window.innerWidth-s-8),l=Math.max(8,window.innerHeight-o-8),c=this.clamp(t.left+e,8,n),d=this.clamp(t.top+r,8,l);return{offsetX:c-t.left,offsetY:d-t.top}}clamp(t,e,r){return Math.min(Math.max(t,e),r)}dispose(){this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.bound&&(window.removeEventListener("resize",this.handleUpdate),window.removeEventListener("scroll",this.handleUpdate,!0),this.bound=!1),this.detachDragHandle()}}class $t extends mt{constructor(e,r){super();g(this,"capabilities");g(this,"_config");g(this,"_managedComponents",new Set);this._config=e,this.capabilities={clipboard:e.supportsClipboard,layerTarget:!!e.layerTargetProvider,recording:!1,...r}}_manageComponent(e){return this._managedComponents.add(e),e}_onUnmount(){for(const e of this._managedComponents)e.unmount()}_onDestroy(){for(const e of this._managedComponents)e.destroy();this._managedComponents.clear()}}class te extends mt{constructor(e){super();g(this,"props");g(this,"checkbox");g(this,"labelElement");g(this,"handleChange",()=>{this.props.defaultChecked=this.checkbox.checked});this.props=e}render(){this.labelElement=document.createElement("label"),this.labelElement.classList.add(Ko),this.checkbox=document.createElement("input"),this.checkbox.type="checkbox",this.props.id&&(this.checkbox.id=this.props.id),this.checkbox.checked=!!this.props.defaultChecked,this.checkbox.addEventListener("change",this.handleChange);const e=document.createElement("span");return e.textContent=this.props.label,this.labelElement.htmlFor=this.props.id??"",this.labelElement.appendChild(this.checkbox),this.labelElement.appendChild(e),this.labelElement}get inputElement(){return this.checkbox}get checked(){return this.checkbox.checked}set checked(e){this.checkbox.checked=e}_onUnmount(){this.checkbox.removeEventListener("change",this.handleChange)}onUpdate(e){this.props=e,e.id&&(this.checkbox.id=e.id,this.labelElement.htmlFor=e.id),this.checkbox.checked=!!e.defaultChecked,this.labelElement.lastElementChild&&(this.labelElement.lastElementChild.textContent=e.label)}}class wn extends mt{constructor(e){super();g(this,"props");g(this,"input");g(this,"handleInput",()=>{this.props.defaultValue=this.input.value});this.props=e}render(){return this.input=document.createElement("input"),this.input.type="text",this.input.classList.add(Jr),this.props.id&&(this.input.id=this.props.id),this.props.maxLength!==void 0&&(this.input.maxLength=this.props.maxLength),this.props.defaultValue!==void 0&&(this.input.value=this.props.defaultValue),this.input.addEventListener("input",this.handleInput),this.input}get inputElement(){return this.input}get value(){return this.input.value}set value(e){this.input.value=e}_onUnmount(){this.input.removeEventListener("input",this.handleInput)}onUpdate(e){this.props=e,e.id&&(this.input.id=e.id),e.maxLength!==void 0&&(this.input.maxLength=e.maxLength),e.defaultValue!==void 0&&(this.input.value=e.defaultValue)}}class ni extends mt{constructor(e){super();g(this,"provider");g(this,"field");g(this,"select");this.provider=e.provider,this.field=new N({label:"layer",labelFor:e.id,variant:"full"}),this.select=new pt({id:e.id,options:[],defaultValue:e.provider.getDefaultId()})}render(){const e=document.createElement("div");return this.field.mount(e),this.refresh(),this.select.mount(this.field.root),e}get layer(){const e=this.provider.getLayerById(this.select.value);if(e)return e;const r=this.provider.getDefaultId();return this.select.value=r,this.provider.getLayerById(r)}setDisabled(e){this.select.selectElement.disabled=e}refresh(){const e=this.provider.getOptions(),r=this.select.isMounted()?this.select.value:this.provider.getDefaultId(),a=e.some(s=>s.id===r)?r:this.provider.getDefaultId();this.select.update({options:e.map(s=>({value:s.id,label:s.label})),defaultValue:a}),this.select.value=a}_onUnmount(){this.select.unmount(),this.field.unmount()}_onDestroy(){this.select.destroy(),this.field.destroy()}}class bn extends $t{constructor(e){super(e);g(this,"layerTarget");g(this,"trailingSpaces",this._manageComponent(new te({label:"preserve trailing spaces",defaultChecked:!1})));g(this,"emptyCharacter",this._manageComponent(new wn({id:"textmode-export-empty-character",defaultValue:" ",maxLength:1})));e.layerTargetProvider&&(this.layerTarget=this._manageComponent(new ni({id:"textmode-export-txt-layer",provider:e.layerTargetProvider})))}render(){var a;const e=document.createElement("div");e.classList.add(ut),(a=this.layerTarget)==null||a.mount(e),this.trailingSpaces.mount(e);const r=new N({label:"empty character",labelFor:"textmode-export-empty-character",variant:"full"});return r.mount(e),this.emptyCharacter.mount(r.root),e}getOptions(){var a;const e=this._config.defaultOptions,r=this.emptyCharacter.value||e.emptyCharacter;return{layer:(a=this.layerTarget)==null?void 0:a.layer,preserveTrailingSpaces:this.trailingSpaces.checked,emptyCharacter:r}}setDefaults(e){Object.assign(this._config.defaultOptions,e),this.reset()}reset(){this.applyDefaults()}validate(){return this.emptyCharacter.value.length<=1}refreshLayerTargets(){var e;(e=this.layerTarget)==null||e.refresh()}applyDefaults(){const e=this._config.defaultOptions;this.trailingSpaces.checked=e.preserveTrailingSpaces??!1,this.emptyCharacter.value=e.emptyCharacter??" "}}class yn extends $t{constructor(e){super(e);g(this,"layerTarget");g(this,"layerTargetContainer");g(this,"target",this._manageComponent(new pt({id:"textmode-export-json-target",options:[{value:"selected",label:"selected layer"},{value:"all",label:"all layers"}],defaultValue:"selected"})));g(this,"prettyPrint",this._manageComponent(new te({id:"textmode-export-json-pretty",label:"pretty print",defaultChecked:!0})));g(this,"includeMetadata",this._manageComponent(new te({id:"textmode-export-json-metadata",label:"include metadata",defaultChecked:!0})));g(this,"colorMode",this._manageComponent(new pt({id:"textmode-export-json-color-mode",options:[{value:"hex",label:"hex"},{value:"rgba",label:"rgba"}],defaultValue:"hex"})));e.layerTargetProvider&&(this.layerTarget=this._manageComponent(new ni({id:"textmode-export-json-layer",provider:e.layerTargetProvider})))}render(){const e=document.createElement("div");e.classList.add(ut);const r=new N({label:"target",labelFor:"textmode-export-json-target",variant:"full"});r.mount(e),this.target.mount(r.root),this.target.selectElement.addEventListener("change",()=>this.updateLayerTargetVisibility()),this.layerTarget&&(this.layerTargetContainer=document.createElement("div"),this.layerTarget.mount(this.layerTargetContainer),e.appendChild(this.layerTargetContainer)),this.prettyPrint.mount(e),this.includeMetadata.mount(e);const a=new N({label:"color mode",labelFor:"textmode-export-json-color-mode",variant:"full"});return a.mount(e),this.colorMode.mount(a.root),this.updateLayerTargetVisibility(),e}getOptions(){var r;const e=this.target.value;return{target:e,layer:e==="selected"?(r=this.layerTarget)==null?void 0:r.layer:void 0,pretty:this.prettyPrint.checked,includeMetadata:this.includeMetadata.checked,colorMode:this.colorMode.value}}setDefaults(e){Object.assign(this._config.defaultOptions,e),this.reset()}reset(){this.applyDefaults()}validate(){return!0}refreshLayerTargets(){var e;(e=this.layerTarget)==null||e.refresh()}applyDefaults(){const e=this._config.defaultOptions;this.target.value=e.target??"selected",this.prettyPrint.checked=typeof e.pretty=="number"?e.pretty>0:e.pretty??!0,this.includeMetadata.checked=e.includeMetadata??!0,this.colorMode.value=e.colorMode??"hex",this.updateLayerTargetVisibility()}updateLayerTargetVisibility(){var r;const e=this.target.value==="selected";this.layerTargetContainer&&(this.layerTargetContainer.style.display=e?"":"none"),(r=this.layerTarget)==null||r.setDisabled(!e)}}const ee="textmode-export-number-input",vn=`${ee}__field`,xn=`${ee}__controls`,_n=`${ee}__control`,ra=`${ee}__display`,xe=`${ra}--visible`,aa=i=>{const t=document.createElement("button");return t.type="button",t.className=_n,t.textContent=i>0?"▲":"▼",t};class Tt extends mt{constructor(e){super();g(this,"props");g(this,"input");g(this,"display");g(this,"incrementButton");g(this,"decrementButton");g(this,"suppressClickAfterPointer",new WeakMap);g(this,"holdTimeoutId");g(this,"holdIntervalId");g(this,"activePointerId");g(this,"disabledObserver");this.props=e}render(){const e=document.createElement("div");e.className=ee,this.input=document.createElement("input"),this.input.type="number",this.input.value=this.props.defaultValue,Object.assign(this.input,this.props.attributes),this.input.className=vn,this.display=document.createElement("div"),this.display.className=ra;const r=document.createElement("div");return r.className=xn,this.incrementButton=aa(1),this.decrementButton=aa(-1),r.appendChild(this.incrementButton),r.appendChild(this.decrementButton),e.appendChild(this.input),e.appendChild(this.display),e.appendChild(r),this.bindStepControls(),this.bindHoldBehavior(),this.bindInputListeners(),this.observeDisabledState(e),this.updateDisplay(),e}get inputElement(){return this.input}get value(){return this.input.value}set value(e){this.input.value=e,this.updateDisplay()}refresh(){this.updateDisplay()}_onDestroy(){var e;this.clearHoldTimers(),(e=this.disabledObserver)==null||e.disconnect()}bindStepControls(){const e=o=>()=>{if(this.input.disabled)return;const n=this.input.value,l=this.input.getAttribute("step");if(l&&l!=="any")o>0?this.input.stepUp():this.input.stepDown();else{const d=o>0?1:-1,h=Number.parseFloat(this.input.value||"0"),m=Number.isFinite(h)?h+d:d;this.input.value=String(m)}var c;this.input.value!==n&&((c=this.input).dispatchEvent(new Event("input",{bubbles:!0})),c.dispatchEvent(new Event("change",{bubbles:!0}))),this.updateDisplay(),this.input.focus({preventScroll:!0})},r=e(1),a=e(-1),s=(o,n)=>l=>{if(this.suppressClickAfterPointer.get(o))return this.suppressClickAfterPointer.set(o,!1),void l.preventDefault();n()};this.incrementButton.addEventListener("click",s(this.incrementButton,r)),this.decrementButton.addEventListener("click",s(this.decrementButton,a))}bindHoldBehavior(){const e=(r,a)=>{const s=a>0?()=>this.incrementButton.click():()=>this.decrementButton.click();r.addEventListener("pointerdown",l=>{if(l.button===0){l.preventDefault(),this.suppressClickAfterPointer.set(r,!0),this.activePointerId=l.pointerId;try{r.setPointerCapture(l.pointerId)}catch{}s(),this.holdTimeoutId=window.setTimeout(()=>{this.holdIntervalId=window.setInterval(s,80)},380)}});const o=()=>{if(this.activePointerId!==void 0){try{r.releasePointerCapture(this.activePointerId)}catch{}this.activePointerId=void 0}},n=()=>{this.clearHoldTimers(),o()};r.addEventListener("pointerup",n),r.addEventListener("pointerleave",n),r.addEventListener("pointercancel",n)};e(this.incrementButton,1),e(this.decrementButton,-1)}bindInputListeners(){const e=()=>{this.props.defaultValue=this.input.value,this.updateDisplay()};this.input.addEventListener("input",e),this.input.addEventListener("change",e)}observeDisabledState(e){const r=()=>{const a=this.input.disabled;this.incrementButton.disabled=a,this.decrementButton.disabled=a,e.classList.toggle("is-disabled",a),a?(this.display.classList.remove(xe),this.input.style.removeProperty("color"),this.input.style.removeProperty("caretColor")):this.updateDisplay()};typeof MutationObserver<"u"&&(this.disabledObserver=new MutationObserver(r),this.disabledObserver.observe(this.input,{attributes:!0,attributeFilter:["disabled"]})),r()}updateDisplay(){const e=this.props.formatDisplay;if(!e)return this.display.textContent="",this.display.classList.remove(xe),this.input.style.removeProperty("color"),void this.input.style.removeProperty("caretColor");const r=this.input.value,a=Number.parseFloat(r),s=e(Number.isFinite(a)?a:Number.NaN,r,this.input);s?(this.display.textContent=s,this.display.classList.add(xe),this.input.style.color="transparent",this.input.style.caretColor="#f8fafc"):(this.display.textContent="",this.display.classList.remove(xe),this.input.style.removeProperty("color"),this.input.style.removeProperty("caretColor"))}clearHoldTimers(){this.holdTimeoutId!==void 0&&(window.clearTimeout(this.holdTimeoutId),this.holdTimeoutId=void 0),this.holdIntervalId!==void 0&&(window.clearInterval(this.holdIntervalId),this.holdIntervalId=void 0)}}class Mt extends mt{constructor(e="stack",r=[]){super();g(this,"variant");g(this,"additionalClasses");this.variant=e,this.additionalClasses=r}render(){const e=document.createElement("div"),r=[this.variant==="stack"?ut:void 0,this.variant==="stackDense"?ii:void 0,this.variant==="stackCompact"?Nr:void 0,this.variant==="row"?Yo:void 0,this.variant==="section"?jr:void 0,...this.additionalClasses].filter(Boolean);return e.classList.add(...r),e}}class kn extends $t{constructor(e){super(e);g(this,"formatSelect",this._manageComponent(new pt({id:"textmode-export-image-format",options:[{value:"png",label:`PNG (${ma})`},{value:"jpg",label:`JPG (${pa})`},{value:"webp",label:`WEBP (${fa})`}],defaultValue:"png"})));g(this,"scaleInput",this._manageComponent(new Tt({defaultValue:"1",attributes:{min:"0.1",step:"0.1"}})))}render(){const e=document.createElement("div");e.classList.add(ut);const r=new Mt("row");r.mount(e);const a=new N({label:"image format",labelFor:"textmode-export-image-format",variant:"compact"});a.mount(r.root),this.formatSelect.mount(a.root);const s=new N({label:"scale",labelFor:"textmode-export-image-scale",variant:"dense"});return s.mount(r.root),this.scaleInput.mount(s.root),this.scaleInput.inputElement.id="textmode-export-image-scale",e}getOptions(){var r;const e=Number.parseFloat(this.scaleInput.value);return{format:this.formatSelect.value,scale:Number.isFinite(e)?e:((r=this._config.defaultOptions)==null?void 0:r.scale)??1}}setDefaults(e){Object.assign(this._config.defaultOptions,e),this.reset()}reset(){this.applyDefaults(),this.scaleInput.refresh()}validate(){const e=Number.parseFloat(this.scaleInput.value);return Number.isFinite(e)&&e>0}applyDefaults(){const e=this._config.defaultOptions;this.formatSelect.value=e.format??"png",this.scaleInput.value=String(e.scale??1)}}class Tn extends $t{constructor(e){super(e);g(this,"layerTarget");g(this,"includeBackground",this._manageComponent(new te({id:"textmode-export-svg-include-backgrounds",label:"include cell backgrounds",defaultChecked:!0})));g(this,"drawMode",this._manageComponent(new pt({id:"textmode-export-svg-draw-mode",options:[{value:"fill",label:"fill"},{value:"stroke",label:"stroke"}],defaultValue:"fill"})));g(this,"strokeWidth",this._manageComponent(new Tt({defaultValue:"1",attributes:{min:"0",step:"0.1"}})));e.layerTargetProvider&&(this.layerTarget=this._manageComponent(new ni({id:"textmode-export-svg-layer",provider:e.layerTargetProvider})))}render(){var o;const e=document.createElement("div");e.classList.add(ut),(o=this.layerTarget)==null||o.mount(e),this.includeBackground.mount(e);const r=new Mt("row");r.mount(e);const a=new N({label:"draw mode",labelFor:"textmode-export-svg-draw-mode",variant:"compact"});a.mount(r.root),this.drawMode.mount(a.root);const s=new N({label:"stroke width",labelFor:"textmode-export-svg-stroke-width",variant:"compact"});return s.mount(r.root),this.strokeWidth.mount(s.root),this.strokeWidth.inputElement.id="textmode-export-svg-stroke-width",this.drawMode.selectElement.addEventListener("change",()=>this.updateStrokeControls()),this.updateStrokeControls(),e}getOptions(){var e;return{layer:(e=this.layerTarget)==null?void 0:e.layer,includeBackgroundRectangles:this.includeBackground.checked,drawMode:this.drawMode.value,strokeWidth:Number.parseFloat(this.strokeWidth.value)}}setDefaults(e){Object.assign(this._config.defaultOptions,e),this.reset()}reset(){this.applyDefaults(),this.updateStrokeControls()}validate(){const e=Number.parseFloat(this.strokeWidth.value);return this.drawMode.value!=="stroke"||Number.isFinite(e)&&e>=0}refreshLayerTargets(){var e;(e=this.layerTarget)==null||e.refresh()}updateStrokeControls(){const e=this.drawMode.value==="stroke";this.strokeWidth.inputElement.disabled=!e,this.strokeWidth.refresh()}applyDefaults(){const e=this._config.defaultOptions;this.includeBackground.checked=e.includeBackgroundRectangles??!0,this.drawMode.value=e.drawMode??"fill",this.strokeWidth.value=String(e.strokeWidth??1),this.strokeWidth.refresh()}}const sa={neutral:"textmode-export-overlay__status-value--neutral",active:"textmode-export-overlay__status-value--active",alert:"textmode-export-overlay__status-value--alert"};class oa extends mt{constructor(e){super();g(this,"props");g(this,"container");g(this,"messageElement");this.props=e}render(){this.container=document.createElement("div"),this.container.classList.add(Jo),this.props.context==="gif"?this.container.classList.add(Zo):this.props.context==="video"&&this.container.classList.add(tn);const e=document.createElement("span");return e.classList.add(en),e.textContent=this.props.title,this.messageElement=document.createElement("span"),this.messageElement.classList.add(rn),this.messageElement.textContent=this.props.message,this.applyVariant(this.props.variant??"neutral"),this.container.appendChild(e),this.container.appendChild(this.messageElement),this.container}setMessage(e,r="neutral"){this.messageElement.textContent=e,this.applyVariant(r)}onUpdate(e){this.props=e,this.setMessage(e.message,e.variant??"neutral")}applyVariant(e){this.messageElement.classList.remove(...Object.values(sa)),this.messageElement.classList.add(sa[e])}}class Cn extends $t{constructor(e){super(e,{recording:!0});g(this,"frameCountInput",this._manageComponent(new Tt({defaultValue:"300",attributes:{min:"1",max:"600",step:"1"}})));g(this,"frameRateInput",this._manageComponent(new Tt({defaultValue:"60",attributes:{min:"1",max:"60",step:"1"}})));g(this,"scaleInput",this._manageComponent(new Tt({defaultValue:"1",attributes:{min:"0.1",max:"8",step:"0.1"}})));g(this,"repeatInput",this._manageComponent(new Tt({defaultValue:"0",attributes:{min:"0",max:"50",step:"1"},formatDisplay:(e,r)=>Number.isFinite(e)?e===0?"∞":null:r.trim()===""?null:r})));g(this,"status",this._manageComponent(new oa({title:"status",message:"ready to record",variant:"neutral",context:"gif"})));g(this,"recordingState","idle")}render(){const e=document.createElement("div");e.classList.add(ut);const r=new Mt("row");r.mount(e);const a=new N({label:"number of frames",labelFor:"textmode-export-gif-frame-count",variant:"dense"});a.mount(r.root),this.frameCountInput.mount(a.root),this.frameCountInput.inputElement.id="textmode-export-gif-frame-count";const s=new N({label:"frame rate (fps)",labelFor:"textmode-export-gif-frame-rate",variant:"dense"});s.mount(r.root),this.frameRateInput.mount(s.root),this.frameRateInput.inputElement.id="textmode-export-gif-frame-rate";const o=new Mt("row");o.mount(e);const n=new N({label:"scale",labelFor:"textmode-export-gif-scale",variant:"dense"});n.mount(o.root),this.scaleInput.mount(n.root),this.scaleInput.inputElement.id="textmode-export-gif-scale";const l=new N({label:"loop count",labelFor:"textmode-export-gif-repeat",variant:"dense"});return l.mount(o.root),this.repeatInput.mount(l.root),this.repeatInput.inputElement.id="textmode-export-gif-repeat",this.status.mount(e),e}getOptions(){const e=this._config.defaultOptions;return{frameCount:this.safeParseInt(this.frameCountInput.value,e.frameCount??300),frameRate:this.safeParseInt(this.frameRateInput.value,e.frameRate??60),scale:this.safeParseFloat(this.scaleInput.value,e.scale??1),repeat:this.safeParseInt(this.repeatInput.value,e.repeat??0)}}setDefaults(e){Object.assign(this._config.defaultOptions,e),this.reset()}reset(){this.recordingState="idle",this.applyDefaults(),this.setRecordingState("idle")}validate(){const e=Number.parseInt(this.frameCountInput.value,10),r=Number.parseInt(this.frameRateInput.value,10),a=Number.parseFloat(this.scaleInput.value);return Number.isFinite(e)&&e>0&&Number.isFinite(r)&&r>0&&Number.isFinite(a)&&a>0}isRecording(){return this.recordingState==="recording"||this.recordingState==="encoding"}setRecordingState(e,r){this.recordingState=e;const a=e==="recording"||e==="encoding";switch(this.frameCountInput.inputElement.disabled=a,this.frameRateInput.inputElement.disabled=a,this.scaleInput.inputElement.disabled=a,this.repeatInput.inputElement.disabled=a,e){case"recording":if(r!=null&&r.totalFrames){const s=r.frameIndex??0;this.status.setMessage(`recording ${s}/${r.totalFrames}`,"active")}else this.status.setMessage("recording…","active");break;case"encoding":if(r!=null&&r.totalFrames){const s=r.frameIndex??0;this.status.setMessage(`encoding ${s}/${r.totalFrames}`,"active")}else this.status.setMessage("encoding…","active");break;case"completed":this.status.setMessage("GIF saved successfully","active");break;case"error":this.status.setMessage((r==null?void 0:r.message)??"failed to export GIF","alert");break;default:this.status.setMessage("ready to record","neutral")}}handleProgress(e){if(e.state!=="recording"&&e.state!=="encoding"||!e.totalFrames)e.state==="completed"?this.status.setMessage("GIF saved successfully","active"):e.state==="error"&&this.status.setMessage(e.message??"failed to export GIF","alert");else{const r=e.state==="recording"?"recording":"encoding";this.status.setMessage(`${r} ${e.frameIndex??0}/${e.totalFrames}`,"active")}}applyDefaults(){const e=this._config.defaultOptions;this.frameCountInput.value=String(e.frameCount??300),this.frameRateInput.value=String(e.frameRate??60),this.scaleInput.value=String(e.scale??1),this.repeatInput.value=String(e.repeat??0),this.frameCountInput.refresh(),this.frameRateInput.refresh(),this.scaleInput.refresh(),this.repeatInput.refresh()}safeParseInt(e,r){const a=Number.parseInt(e,10);return Number.isFinite(a)?a:r}safeParseFloat(e,r){const a=Number.parseFloat(e);return Number.isFinite(a)?a:r}}class En extends $t{constructor(e){super(e,{recording:!0});g(this,"formatSelect",this._manageComponent(new pt({id:"textmode-export-video-format",options:[{value:"mp4",label:"MP4/H.264 (.mp4)"},{value:"webm",label:"WebM (.webm)"}],defaultValue:"mp4"})));g(this,"bitrateSelect",this._manageComponent(new pt({id:"textmode-export-video-bitrate",options:[{value:"low",label:"low"},{value:"medium",label:"medium"},{value:"high",label:"high"}],defaultValue:"medium"})));g(this,"frameRateInput",this._manageComponent(new Tt({defaultValue:"60",attributes:{min:String(1),max:String(60),step:"1"},formatDisplay:e=>Number.isFinite(e)?`${e} fps`:null})));g(this,"frameCountInput",this._manageComponent(new Tt({defaultValue:"480",attributes:{min:String(1),max:String(3600),step:"1"}})));g(this,"bitrateModeSelect",this._manageComponent(new pt({id:"textmode-export-video-bitrate-mode",options:[{value:"variable",label:"variable"},{value:"constant",label:"constant"}],defaultValue:"variable"})));g(this,"latencyModeSelect",this._manageComponent(new pt({id:"textmode-export-video-latency-mode",options:[{value:"quality",label:"quality"},{value:"realtime",label:"realtime"}],defaultValue:"quality"})));g(this,"hardwareAccelerationSelect",this._manageComponent(new pt({id:"textmode-export-video-hardware-acceleration",options:[{value:"no-preference",label:"no preference"},{value:"prefer-hardware",label:"prefer hardware"},{value:"prefer-software",label:"prefer software"}],defaultValue:"no-preference"})));g(this,"keyFrameIntervalInput",this._manageComponent(new Tt({defaultValue:"2",attributes:{min:"0",step:"0.25"},formatDisplay:e=>Number.isFinite(e)?`${e}s`:null})));g(this,"transparencyInput",this._manageComponent(new te({id:"textmode-export-video-transparent",label:"preserve transparency",defaultChecked:!1})));g(this,"status",this._manageComponent(new oa({title:"status",message:"ready to record",variant:"neutral",context:"video"})));g(this,"recordingState","idle");g(this,"handleFormatChange",()=>{this.syncTransparencyAvailability()})}render(){const e=document.createElement("div");e.classList.add(ut);const r=new Mt("row");r.mount(e);const a=new N({label:"video format",labelFor:"textmode-export-video-format",variant:"compact"});a.mount(r.root),this.formatSelect.mount(a.root);const s=new N({label:"bitrate preset",labelFor:"textmode-export-video-bitrate",variant:"compact"});s.mount(r.root),this.bitrateSelect.mount(s.root);const o=new Mt("row");o.mount(e);const n=new N({label:"number of frames",labelFor:"textmode-export-video-frame-count",variant:"compact"});n.mount(o.root),this.frameCountInput.mount(n.root),this.frameCountInput.inputElement.id="textmode-export-video-frame-count";const l=new N({label:"frame rate (fps)",labelFor:"textmode-export-video-frame-rate",variant:"compact"});l.mount(o.root),this.frameRateInput.mount(l.root),this.frameRateInput.inputElement.id="textmode-export-video-frame-rate";const c=new Mt("row");c.mount(e);const d=new N({label:"bitrate mode",labelFor:"textmode-export-video-bitrate-mode",variant:"compact"});d.mount(c.root),this.bitrateModeSelect.mount(d.root);const h=new N({label:"encoder mode",labelFor:"textmode-export-video-latency-mode",variant:"compact"});h.mount(c.root),this.latencyModeSelect.mount(h.root);const m=new Mt("row");m.mount(e);const u=new N({label:"hardware",labelFor:"textmode-export-video-hardware-acceleration",variant:"compact"});u.mount(m.root),this.hardwareAccelerationSelect.mount(u.root);const p=new N({label:"keyframe interval",labelFor:"textmode-export-video-keyframe-interval",variant:"compact"});return p.mount(m.root),this.keyFrameIntervalInput.mount(p.root),this.keyFrameIntervalInput.inputElement.id="textmode-export-video-keyframe-interval",this.transparencyInput.mount(e),this.formatSelect.selectElement.addEventListener("change",this.handleFormatChange),this.syncTransparencyAvailability(),this.status.mount(e),e}getOptions(){const e=this._config.defaultOptions,r=Number.parseInt(this.frameCountInput.value,10),a=Number.parseFloat(this.frameRateInput.value),s=Number.parseFloat(this.keyFrameIntervalInput.value),o=this.formatSelect.value,n={format:o,bitrate:this.bitrateSelect.value,bitrateMode:this.bitrateModeSelect.value,latencyMode:this.latencyModeSelect.value,hardwareAcceleration:this.hardwareAccelerationSelect.value,keyFrameInterval:Number.isFinite(s)?s:e.keyFrameInterval??2,frameCount:Number.isFinite(r)?r:e.frameCount??480,frameRate:Number.isFinite(a)?a:e.frameRate??60};return o==="webm"&&(n.transparent=this.transparencyInput.checked),n}setDefaults(e){Object.assign(this._config.defaultOptions,e),this.reset()}reset(){this.recordingState="idle",this.applyDefaults(),this.status.setMessage("ready to record","neutral")}validate(){const e=Number.parseInt(this.frameCountInput.value,10),r=Number.parseFloat(this.frameRateInput.value),a=Number.parseFloat(this.keyFrameIntervalInput.value);return Number.isFinite(e)&&e>=1&&Number.isFinite(r)&&r>=1&&Number.isFinite(a)&&a>=0}isRecording(){return this.recordingState==="recording"||this.recordingState==="encoding"}setRecordingState(e,r){this.recordingState=e;const a=e==="recording"||e==="encoding";this.formatSelect.selectElement.disabled=a,this.bitrateSelect.selectElement.disabled=a,this.frameCountInput.inputElement.disabled=a,this.frameRateInput.inputElement.disabled=a,this.bitrateModeSelect.selectElement.disabled=a,this.latencyModeSelect.selectElement.disabled=a,this.hardwareAccelerationSelect.selectElement.disabled=a,this.keyFrameIntervalInput.inputElement.disabled=a,this.transparencyInput.inputElement.disabled=a||this.formatSelect.value!=="webm",this.syncStatus(e,r)}handleProgress(e){this.syncStatus(e.state,e)}syncStatus(e,r){switch(e){case"recording":{const a=(r==null?void 0:r.frameIndex)??0,s=(r==null?void 0:r.totalFrames)??this.resolvePlannedFrameCount();if(s){const o=Math.min(Math.max(0,Math.round(a)),s);this.status.setMessage(`recording ${o}/${s} frames`,"active")}else this.status.setMessage(`recording ${Math.max(0,Math.round(a))} frames`,"active");break}case"encoding":this.status.setMessage("finalizing video","active");break;case"completed":this.status.setMessage("saved to disk","active");break;case"error":this.status.setMessage(r!=null&&r.message?`error: ${r.message}`:"recording failed","alert");break;default:this.status.setMessage("ready to record","neutral")}}resolvePlannedFrameCount(){const e=Number.parseInt(this.frameCountInput.value,10);return Number.isFinite(e)&&e>0?Math.round(e):void 0}applyDefaults(){const e=this._config.defaultOptions;this.formatSelect.value=e.format??"mp4",this.bitrateSelect.value=this.resolveBitratePreset(e.bitrate),this.frameCountInput.value=String(e.frameCount??480),this.frameRateInput.value=String(e.frameRate??60),this.bitrateModeSelect.value=e.bitrateMode??"variable",this.latencyModeSelect.value=e.latencyMode??"quality",this.hardwareAccelerationSelect.value=e.hardwareAcceleration??"no-preference",this.keyFrameIntervalInput.value=String(e.keyFrameInterval??2),this.transparencyInput.checked=!!e.transparent,this.frameCountInput.refresh(),this.frameRateInput.refresh(),this.keyFrameIntervalInput.refresh(),this.syncTransparencyAvailability()}resolveBitratePreset(e){return e==="low"||e==="medium"||e==="high"?e:"medium"}syncTransparencyAvailability(){if(!this.transparencyInput.isMounted())return;const e=this.formatSelect.value==="webm";this.transparencyInput.root.style.display=e?"":"none",this.transparencyInput.inputElement.disabled=!e||this.isRecording(),e||(this.transparencyInput.checked=!1)}}function _e(i){return i.capabilities.recording}class Sn{constructor(t,e,r,a){g(this,"_textmodifier");g(this,"_defaultsStore");g(this,"_state");g(this,"_events");g(this,"_exportService");g(this,"_clipboardService");g(this,"_definitions");g(this,"_formats",new Map);g(this,"_eventUnsubscribers",[]);g(this,"_shadowHost");g(this,"_shadowRoot");g(this,"_overlayElement");g(this,"_optionsContainer");g(this,"_copyButtonContainer");g(this,"_positionService");g(this,"_header",new oi);g(this,"_formatField",new N({label:"export format",labelFor:"textmode-export-format",variant:"full"}));g(this,"_formatSelect",new pt({id:"textmode-export-format",options:[]}));g(this,"_exportButton",new ia({label:"download file",fullWidth:!0,variant:"primary"}));g(this,"_copyButton",new ia({label:"copy to clipboard",fullWidth:!0,variant:"primary"}));g(this,"_currentFormat");g(this,"_currentBlade");g(this,"_handleFormatSelectChange",()=>{this._handleFormatChange(this._formatSelect.value)});g(this,"_handleExportClickSafe",()=>{this._handleExportClick().catch(t=>{console.error("[textmode-export] Export failed",t)})});g(this,"_handleCopyClickSafe",()=>{this._handleCopyClick().catch(t=>{console.error("[textmode-export] Copy failed",t)})});this._textmodifier=t,this._defaultsStore=r;const s=this._resolveInitialFormat(r.current.format,a);this._state=new ln((o=>({format:o,isBusy:!1}))(s)),this._events=new dn,this._exportService=new pn(e,this._events),this._clipboardService=new un(e),this._definitions=a,this._currentFormat=s,this._initializeFormatMap(),this._registerEventHandlers()}$mount(){this._createOverlay(),this._renderStaticContent(),this._positionService=new gn(this._textmodifier,this._shadowHost,this._overlayElement),this._positionService.attachDragHandle(this._header.dragHandleElement),this._positionService.bind(),this._switchFormat(this._currentFormat)}show(){var t;this._shadowHost&&(this.refreshLayerTargets(),this._shadowHost.style.display="",(t=this._positionService)==null||t.scheduleUpdate())}hide(){this._shadowHost&&(this._shadowHost.style.display="none")}toggle(){this.isVisible()?this.hide():this.show()}isVisible(){return!!this._shadowHost&&this._shadowHost.style.display!=="none"}refreshLayerTargets(){this._currentBlade&&this._currentBlade.blade.capabilities.layerTarget&&this._currentBlade.blade.refreshLayerTargets()}resetPosition(){this._positionService.resetPosition()}getPosition(){return this._positionService.getPosition()}setPosition(t){this._positionService.setPosition(t)}setDefaults(t){t.format&&this._assertKnownFormat(t.format),this._defaultsStore.merge(t),this._resetAffectedBlades(this._getFormatKeys(t)),t.format&&this._handleFormatChange(t.format)}getDefaults(){return this._defaultsStore.current}resetDefaults(t){this._defaultsStore.reset(t),t!=="format"?(this._resetAffectedBlades(t?[t]:void 0),t||this._handleFormatChange(this._defaultsStore.current.format)):this._handleFormatChange(this._defaultsStore.current.format)}$dispose(){var t,e;this._formatSelect.isMounted()&&this._formatSelect.selectElement.removeEventListener("change",this._handleFormatSelectChange),this._exportButton.isMounted()&&this._exportButton.buttonElement.removeEventListener("click",this._handleExportClickSafe),this._copyButton.isMounted()&&this._copyButton.buttonElement.removeEventListener("click",this._handleCopyClickSafe);for(const r of this._eventUnsubscribers)r();this._eventUnsubscribers.length=0,this._events.$clear();for(const r of this._formats.values())r.blade.destroy();this._formats.clear(),this._currentBlade=void 0,(t=this._shadowHost)!=null&&t.isConnected&&this._shadowHost.remove(),(e=this._positionService)==null||e.dispose()}_resetAffectedBlades(t){const e=new Set(t??this._formats.keys());for(const[r,a]of this._formats)e.has(r)&&(a.blade.isMounted()?(a.blade.reset(),a.needsReset=!1):a.needsReset=!0)}_initializeFormatMap(){for(const t of this._definitions){const e=t.createBlade();this._formats.set(t.format,{definition:t,blade:e,initialized:!1,needsReset:!1})}}_resolveInitialFormat(t,e){var r;return e.some(a=>a.format===t)?t:((r=e[0])==null?void 0:r.format)??t}_getFormatKeys(t){return this._definitions.map(e=>e.format).filter(e=>t[e]!==void 0)}_assertKnownFormat(t){if(!this._formats.has(t))throw new Error(`Unknown export format: ${t}`)}_createOverlay(){this._shadowHost=document.createElement("div"),this._shadowHost.dataset.plugin="textmode-export-overlay-host",this._shadowHost.style.cssText="position: absolute; top: 0; left: 0; pointer-events: none; z-index: 2147483647;",this._shadowRoot=this._shadowHost.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent=`@layer textmode-export-overlay{.textmode-export-overlay{--overlay-bg: rgba(20, 20, 20, .8);--overlay-surface: rgba(40, 40, 40, .9);--overlay-border: rgba(255, 255, 255, .14);--overlay-border-strong: rgba(255, 255, 255, .2);--overlay-border-focus: rgba(160, 160, 160, .6);--overlay-focus-shadow: 0 0 0 1px rgba(140, 140, 140, .28);--overlay-text: #ffffff;--overlay-muted: rgba(200, 200, 200, .74);--overlay-radius: .75rem;--overlay-stack-gap: .55rem;position:absolute;top:0;left:0;display:flex;flex-direction:column;gap:var(--overlay-stack-gap);min-width:236px;max-width:236px;padding:.65rem .8rem;background:var(--overlay-bg);color:var(--overlay-text);border-radius:var(--overlay-radius);border:1px solid var(--overlay-border);box-shadow:0 12px 28px #0000004d;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:.82rem;line-height:1.35;pointer-events:auto;z-index:2147483647}.textmode-export-overlay *{box-sizing:border-box}.textmode-export-overlay__header{display:flex;flex-direction:column;gap:.4rem}.textmode-export-overlay__header-title-row{display:flex;align-items:center;justify-content:space-between;gap:.4rem}.textmode-export-overlay__header-identity{display:inline-flex;align-items:center;gap:.35rem;min-width:0}.textmode-export-overlay__header-links{display:inline-flex;align-items:center;gap:.3rem;flex:0 0 auto}.textmode-export-overlay__grab-handle{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:1.45rem;height:1.45rem;padding:0;border-radius:.45rem;border:1px solid transparent;color:#d7d7d7b8;background:transparent;cursor:grab;line-height:0;touch-action:none;transition:background .18s ease,color .18s ease,border-color .18s ease}.textmode-export-overlay__grab-handle:hover{color:#fff;background:#5a5a5a4d;border-color:#c8c8c824}.textmode-export-overlay__grab-handle:focus-visible{outline:none;border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow)}.textmode-export-overlay--dragging,.textmode-export-overlay--dragging .textmode-export-overlay__grab-handle{cursor:grabbing}.textmode-export-overlay__support-link{display:inline-flex;align-items:center;justify-content:center;padding:.2rem;border-radius:.45rem;border:1px solid transparent;color:#d7d7d7d1;background:transparent;text-decoration:none;line-height:0;transition:background .18s ease,color .18s ease,transform .18s ease,border-color .18s ease}.textmode-export-overlay__support-link:hover{color:#fff;background:#5a5a5a4d;border-color:#c8c8c824}.textmode-export-overlay__support-link:focus-visible{outline:none;border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow)}.textmode-export-overlay__support-icon,.textmode-export-overlay__link-icon{display:block;width:1rem;height:1rem}.textmode-export-overlay__stack{display:flex;flex-direction:column;gap:var(--overlay-stack-gap)}.textmode-export-overlay__stack--dense{gap:.3rem}.textmode-export-overlay__stack--compact{gap:.45rem}.textmode-export-overlay__section{display:flex;flex-direction:column;gap:.4rem}.textmode-export-overlay__title{font-size:.92rem;font-weight:600;white-space:nowrap}.textmode-export-overlay__divider{width:100%;height:1px;background:#ffffff29;margin-top:.25rem}.textmode-export-overlay__label{font-weight:500;opacity:.9}.textmode-export-overlay__checkbox{display:flex;align-items:center;gap:.5rem}.textmode-export-overlay__checkbox input[type=checkbox]{width:1rem;height:1rem;accent-color:rgba(100,100,100,.9)}.textmode-export-overlay__row{display:flex;gap:.6rem;flex-wrap:wrap;align-items:flex-start;width:100%}.textmode-export-overlay__field{display:flex;flex-direction:column;gap:.3rem;flex:1 1 120px;min-width:120px}.textmode-export-overlay__field--compact{flex:1 1 100px;min-width:100px}.textmode-export-overlay__field--dense{flex:1 1 90px;min-width:90px}.textmode-export-overlay__field--channel{flex:1 1 0;min-width:0}.textmode-export-overlay__field--full{width:100%;flex:1 1 100%}.textmode-export-overlay__input,.textmode-export-overlay select.textmode-export-overlay__input,.textmode-export-overlay input.textmode-export-overlay__input{width:100%;padding:.35rem .5rem;border-radius:.4rem;border:1px solid var(--overlay-border-strong);background:var(--overlay-surface);color:var(--overlay-text);font:inherit;line-height:1.35;transition:border-color .18s ease,box-shadow .18s ease,background .18s ease}.textmode-export-overlay select.textmode-export-overlay__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='rgba(200, 200, 200, 0.74)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .5rem center;background-size:1rem;padding-right:2rem}.textmode-export-overlay__input:focus{outline:none;border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow);background:#2d2f42eb}.textmode-export-overlay__input::placeholder{color:var(--overlay-muted);opacity:.7}.textmode-export-overlay__muted{font-size:.75rem;opacity:.7;display:block}.textmode-export-overlay__button{display:inline-flex;align-items:center;justify-content:center;gap:.35rem;border-radius:.45rem;border:none;font-weight:600;padding:.45rem .7rem;cursor:pointer;transition:background .2s ease,transform .2s ease,box-shadow .2s ease}.textmode-export-overlay__button--primary{background:#505050;color:#fff}.textmode-export-overlay__button--secondary{background:#606060;color:#fff}.textmode-export-overlay__button--full{width:100%}.textmode-export-overlay__button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 7px 18px #00000073}.textmode-export-overlay__button--primary:hover:not(:disabled){background:#404040}.textmode-export-overlay__button--secondary:hover:not(:disabled){background:#4a4a4a}.textmode-export-overlay__button:disabled{cursor:default;opacity:.55;transform:none;box-shadow:none}.textmode-export-overlay__status{display:flex;flex-direction:column;gap:.25rem;padding:.45rem .55rem;border-radius:.45rem;border:1px solid rgba(110,110,110,.22);background:#4646462e}.textmode-export-overlay__status--gif{background:#5050501f;border-color:#78787840}.textmode-export-overlay__status--video{background:#4646461f;border-color:#6e6e6e40}.textmode-export-overlay__status-title{font-weight:600;font-size:.75rem;opacity:.85;text-transform:uppercase;letter-spacing:.04em}.textmode-export-overlay__status-value{font-size:.82rem;color:#dedede;transition:color .18s ease}.textmode-export-overlay__status-value--neutral{color:#cfcfcf}.textmode-export-overlay__status-value--active{color:#f5f5f5}.textmode-export-overlay__status-value--alert{color:#b8b8b8}.textmode-export-number-input,.textmode-export-overlay .textmode-export-number-input{display:flex;align-items:stretch;width:100%;background:var(--overlay-surface);border:1px solid var(--overlay-border-strong);border-radius:.4rem;overflow:hidden;transition:border-color .18s ease,box-shadow .18s ease,background .18s ease;position:relative}.textmode-export-number-input:focus-within{border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow)}.textmode-export-number-input.is-disabled{opacity:.55}.textmode-export-number-input__field{flex:1 1 auto;min-width:0;border:none;background:transparent;color:var(--overlay-text);font:inherit;padding:.35rem .5rem;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.textmode-export-number-input__field::-webkit-outer-spin-button,.textmode-export-number-input__field::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.textmode-export-number-input__field:focus{outline:none}.textmode-export-number-input__controls{display:flex;flex-direction:column;border-left:1px solid rgba(255,255,255,.12);min-width:1.6rem}.textmode-export-number-input__control{display:flex;align-items:center;justify-content:center;width:100%;flex:1;border:none;background:#32323299;color:#d0d0d0;font-size:.68rem;line-height:1;cursor:pointer;transition:background .15s ease,color .15s ease;padding:0}.textmode-export-number-input__control:hover:not(:disabled){background:#5a5a5ad9;color:#fff}.textmode-export-number-input__control:disabled{cursor:default;opacity:.4;background:#28282880;color:#c8c8c866}.textmode-export-number-input:focus-within .textmode-export-number-input__control{background:#3c3c3cbf;color:#e8e8e8}.textmode-export-number-input__display{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;padding:.4rem .55rem;pointer-events:none;color:#f8fafc;opacity:0;transition:opacity .14s ease}.textmode-export-number-input__display--visible{opacity:1}.textmode-export-range-input{position:relative;width:100%}.textmode-export-range-input.is-disabled{opacity:.55}.textmode-export-range-input__field{width:100%;height:1.4rem;padding:0;margin:0;background:transparent;cursor:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none}.textmode-export-range-input__field::-webkit-slider-thumb{width:12px;height:12px;margin-top:-3.5px;-webkit-appearance:none;border-radius:50%;background:#a0a0a0;border:2px solid #303030;box-shadow:0 0 0 2px #00000059}.textmode-export-range-input__field::-webkit-slider-runnable-track{height:5px;border-radius:999px;background:linear-gradient(90deg,#8c8c8cd9,#646464a6)}.textmode-export-range-input__field::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:#a0a0a0;border:2px solid #303030;margin-top:-3.5px}.textmode-export-range-input__field::-moz-range-track{height:5px;border-radius:999px;background:linear-gradient(90deg,#8c8c8cd9,#646464a6)}.textmode-export-range-input__tooltip{position:absolute;top:-1.5rem;left:0;transform:translate(-50%);padding:.2rem .35rem;border-radius:.35rem;background:#1e1e1ee0;color:#f8fafc;font-size:.68rem;line-height:1;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .15s ease}.textmode-export-range-input__tooltip--visible{opacity:1}}`,this._shadowRoot.appendChild(t),this._overlayElement=document.createElement("div"),this._overlayElement.dataset.plugin="textmode-export-overlay",this._overlayElement.classList.add(No,ut),this._shadowRoot.appendChild(this._overlayElement),document.body.appendChild(this._shadowHost)}_renderStaticContent(){this._header.mount(this._overlayElement);const t=document.createElement("div");t.classList.add(jr),this._overlayElement.appendChild(t),this._formatField.mount(t),this._prepareFormatOptions(),this._formatSelect.mount(this._formatField.root),this._formatSelect.selectElement.addEventListener("change",this._handleFormatSelectChange),this._optionsContainer=document.createElement("div"),this._optionsContainer.classList.add(ut,Nr),this._overlayElement.appendChild(this._optionsContainer),this._exportButton.mount(this._overlayElement),this._exportButton.buttonElement.addEventListener("click",this._handleExportClickSafe),this._copyButtonContainer=document.createElement("div"),this._copyButtonContainer.classList.add(ut,ii),this._overlayElement.appendChild(this._copyButtonContainer),this._copyButton.mount(this._copyButtonContainer),this._copyButton.buttonElement.dataset.defaultLabel="copy to clipboard",this._copyButton.buttonElement.addEventListener("click",this._handleCopyClickSafe)}_prepareFormatOptions(){const t=this._definitions.map(e=>({value:e.format,label:e.label}));this._formatSelect.update({options:t,defaultValue:this._currentFormat})}_registerEventHandlers(){this._eventUnsubscribers.push(this._events.$on("export:request",({format:t})=>{t===this._currentFormat&&(this._state.$set({isBusy:!0,error:void 0}),this._updateExportButton())}),this._events.$on("export:success",({format:t})=>{if(t===this._currentFormat){const e={isBusy:!1};t==="gif"&&(e.gifProgress=void 0),t==="video"&&(e.videoProgress=void 0),this._state.$set(e),this._updateExportButton()}}),this._events.$on("export:error",({format:t,error:e})=>{t===this._currentFormat&&(this._state.$set({isBusy:!1,error:e}),this._updateExportButton())}),this._events.$on("export:progress",({format:t,progress:e})=>{var r,a;if(e){if(t==="gif"){const s=e;this._state.$set({gifProgress:s}),((r=this._currentBlade)==null?void 0:r.definition.format)==="gif"&&_e(this._currentBlade.blade)&&this._currentBlade.blade.handleProgress(s)}else if(t==="video"){const s=e;this._state.$set({videoProgress:s}),((a=this._currentBlade)==null?void 0:a.definition.format)==="video"&&_e(this._currentBlade.blade)&&this._currentBlade.blade.handleProgress(s)}this._updateExportButton()}}))}_handleFormatChange(t){this._currentFormat=t,this._state.$set({format:t}),this._switchFormat(t),this._events.$emit("format:change",{format:t})}_switchFormat(t){var r;const e=this._formats.get(t);if(!e)throw new Error(`Unknown export format: ${t}`);this._currentBlade&&this._currentBlade.blade.unmount(),this._optionsContainer.innerHTML="",e.blade.mount(this._optionsContainer),e.initialized&&!e.needsReset||(e.blade.reset(),e.initialized=!0,e.needsReset=!1),this._currentBlade=e,this._formatSelect.value=t,this.refreshLayerTargets(),this._updateCopyButtonState(),this._updateExportButton(),(r=this._positionService)==null||r.scheduleUpdate()}_updateCopyButtonState(){var e;const t=((e=this._currentBlade)==null?void 0:e.definition.supportsClipboard)??!1;this._copyButtonContainer.style.display=t?"flex":"none",this._copyButton.setDisabled(!t)}async _handleExportClick(){if(!this._currentBlade)return;const t=this._currentBlade.definition.format,e=this._currentBlade.blade.getOptions();if(this._currentBlade.blade.validate()){if(_e(this._currentBlade.blade)){const r=this._currentBlade.blade;if(r.isRecording())return;r.setRecordingState("recording");try{await this._exportService.$requestExport(t,e,{onGIFProgress:a=>{r.setRecordingState(a.state,a)},onVideoProgress:a=>{r.setRecordingState(a.state,a)}})}catch(a){throw r.setRecordingState("error"),a}return void window.setTimeout(()=>{r.setRecordingState("idle"),this._updateExportButton()},1600)}this._exportButton.setDisabled(!0),this._exportButton.setLabel("exporting…");try{await this._exportService.$requestExport(t,e)}finally{this._exportButton.setDisabled(!1),this._exportButton.setLabel("download file")}}else console.warn("[textmode-export] Export options failed validation")}async _handleCopyClick(){if(!this._currentBlade||!this._currentBlade.definition.supportsClipboard)return;const t=this._currentBlade.definition.format,e=this._currentBlade.blade.getOptions(),r=this._copyButton.buttonElement.dataset.defaultLabel??"copy to clipboard";this._copyButton.setDisabled(!0),this._copyButton.setLabel("copying…");try{switch(t){case"txt":await this._clipboardService.$copy("txt",e);break;case"json":await this._clipboardService.$copy("json",e);break;case"svg":await this._clipboardService.$copy("svg",e);break;case"image":await this._clipboardService.$copy("image",e);break;default:return}this._copyButton.setLabel("copied!")}catch(a){console.error("[textmode-export] Failed to copy to clipboard",a),this._copyButton.setLabel("copy failed!")}finally{window.setTimeout(()=>{this._copyButton.setLabel(r),this._copyButton.setDisabled(!1)},1200)}}_updateExportButton(){if(!this._currentBlade)return;const t=this._currentBlade.definition.format;if(_e(this._currentBlade.blade)){const r=this._currentBlade.blade,a=t==="gif"?this._state.snapshot.gifProgress:this._state.snapshot.videoProgress;if(r.isRecording())if(this._exportButton.setDisabled(!0),a==null?void 0:a.totalFrames){const s=a.frameIndex??0,o=a.state==="encoding"?"encoding":"recording";this._exportButton.setLabel(t==="gif"?`${o} ${s}/${a.totalFrames}`:`recording ${s}/${a.totalFrames} frames`)}else this._exportButton.setLabel((a==null?void 0:a.state)==="encoding"?"encoding…":"recording…");else this._exportButton.setDisabled(!1),this._exportButton.setLabel("start recording");return}const e=this._state.snapshot.isBusy;this._exportButton.setDisabled(e),this._exportButton.setLabel(e?"exporting…":"download file")}}const Lt=Object.freeze({format:"txt",txt:Object.freeze({preserveTrailingSpaces:!1,emptyCharacter:" "}),json:Object.freeze({target:"selected",pretty:!0,includeMetadata:!0,colorMode:"hex"}),image:Object.freeze({format:"png",scale:1}),svg:Object.freeze({includeBackgroundRectangles:!0,drawMode:"fill",strokeWidth:1}),gif:Object.freeze({frameCount:300,frameRate:60,scale:1,repeat:0}),video:Object.freeze({format:"mp4",frameCount:480,frameRate:60,bitrate:"medium",bitrateMode:"variable",latencyMode:"quality",hardwareAcceleration:"no-preference",keyFrameInterval:2,transparent:!1})});function ci(){return{format:Lt.format,txt:{...Lt.txt},json:{...Lt.json},image:{...Lt.image},svg:{...Lt.svg},gif:{...Lt.gif},video:{...Lt.video}}}function at(i,t){for(const e of Object.keys(i))delete i[e];Object.assign(i,t)}class Bn{constructor(){g(this,"_defaults");this._defaults=ci()}get current(){return this.snapshot()}snapshot(){return{format:(t=this._defaults).format,txt:{...t.txt},json:{...t.json},image:{...t.image},svg:{...t.svg},gif:{...t.gif},video:{...t.video}};var t}get(t){return this._defaults[t]}merge(t){t.format&&(this._defaults.format=t.format),t.txt&&Object.assign(this._defaults.txt,t.txt),t.json&&Object.assign(this._defaults.json,t.json),t.image&&Object.assign(this._defaults.image,t.image),t.svg&&Object.assign(this._defaults.svg,t.svg),t.gif&&Object.assign(this._defaults.gif,t.gif),t.video&&Object.assign(this._defaults.video,t.video)}reset(t){const e=ci();if(!t)return this._defaults.format=e.format,at(this._defaults.txt,e.txt),at(this._defaults.json,e.json),at(this._defaults.image,e.image),at(this._defaults.svg,e.svg),at(this._defaults.gif,e.gif),void at(this._defaults.video,e.video);switch(t){case"format":this._defaults.format=e.format;break;case"txt":at(this._defaults.txt,e.txt);break;case"json":at(this._defaults.json,e.json);break;case"image":at(this._defaults.image,e.image);break;case"svg":at(this._defaults.svg,e.svg);break;case"gif":at(this._defaults.gif,e.gif);break;case"video":at(this._defaults.video,e.video)}}}function Pn(i,t=(()=>{const e=ci();return r=>e[r]})()){return[{format:"txt",label:"plain text (.txt)",supportsClipboard:!0,createBlade:()=>new bn({format:"txt",label:"plain text (.txt)",supportsClipboard:!0,defaultOptions:t("txt"),layerTargetProvider:i})},{format:"json",label:"document data (.json)",supportsClipboard:!0,createBlade:()=>new yn({format:"json",label:"document data (.json)",supportsClipboard:!0,defaultOptions:t("json"),layerTargetProvider:i})},{format:"image",label:"image (.png / .jpg / .webp)",supportsClipboard:!0,createBlade:()=>new kn({format:"image",label:"image (.png / .jpg / .webp)",supportsClipboard:!0,defaultOptions:t("image")})},{format:"svg",label:"vector (.svg)",supportsClipboard:!0,createBlade:()=>new Tn({format:"svg",label:"vector (.svg)",supportsClipboard:!0,defaultOptions:t("svg"),layerTargetProvider:i})},{format:"gif",label:"animated GIF (.gif)",supportsClipboard:!1,createBlade:()=>new Cn({format:"gif",label:"animated GIF (.gif)",supportsClipboard:!1,defaultOptions:t("gif")})},{format:"video",label:"video (.webm / .mp4)",supportsClipboard:!1,createBlade:()=>new En({format:"video",label:"video (.webm / .mp4)",supportsClipboard:!1,defaultOptions:t("video")})}]}const di=new WeakMap,Mn=["exportOverlay","saveCanvas","copyCanvas","saveSVG","saveStrings","toSVG","toString","toJSON","toJSONString","saveJSON","saveGIF","saveVideo"],na={name:"textmode.export",version:$r,async install(i,t){const e={saveCanvas:async(o={})=>new pi().$saveImage(i.canvas,o),copyCanvas:async(o={})=>new pi().$copyImageToClipboard(i.canvas,o),saveSVG:(o={})=>{new mi().$saveSVG(i,o)},saveStrings:(o={})=>{new fi().$saveTXT(i,o)},toSVG:(o={})=>new mi().$generateSVG(i,o),toString:(o={})=>new fi().$generateTXT(i,o),toJSON:(o={})=>new ei().$generateJSONData(i,o),toJSONString:(o={})=>new ei().$generateJSONString(i,o),saveJSON:(o={})=>{new ei().$saveJSON(i,o)},saveGIF:async(o={})=>new Sa(i,t.registerPostDrawHook).$saveGIF(o),saveVideo:async(o={})=>new zo(i,t.registerPostDrawHook).$saveVideo(o)},r=(function(o,n,l){const c=new Bn,d=Pn(l,m=>c.get(m)),h=new Sn(o,n,c,d);return h.$mount(),h})(i,e,(function(o){return{getOptions:()=>ui(o),getLayerById:n=>{var l;return(l=ui(o).find(c=>c.id===n))==null?void 0:l.layer},getDefaultId:()=>"base"}})(i));t.registerPostDrawHook(()=>{r.isVisible()&&r.refreshLayerTargets()});const a={show:()=>r.show(),hide:()=>r.hide(),toggle:()=>r.toggle(),isVisible:()=>r.isVisible(),resetPosition:()=>r.resetPosition(),getPosition:()=>r.getPosition(),setPosition:o=>r.setPosition(o),setDefaults:o=>r.setDefaults(o),getDefaults:()=>r.getDefaults(),resetDefaults:o=>r.resetDefaults(o)},s={...e,exportOverlay:a};Object.assign(i,s),di.set(i,r)},async uninstall(i){const t=di.get(i);t==null||t.$dispose(),di.delete(i);for(const e of Mn)delete i[e]}};typeof window<"u"&&(window.ExportPlugin=na),ot.ExportPlugin=na,Object.defineProperty(ot,Symbol.toStringTag,{value:"Module"})});
1
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("textmode.js")):"function"==typeof define&&define.amd?define(["exports","textmode.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).TextmodeExport={},t.textmode)}(this,function(t,e){Object.defineProperty(t,Symbol.toStringTag,{value:"Module"});Object.create,Object.defineProperty,Object.getOwnPropertyDescriptor,Object.getOwnPropertyNames,Object.getPrototypeOf,Object.prototype.hasOwnProperty;var i=(t,e)=>()=>(e||(t((e={exports:{}}).exports,e),t=null),e.exports),r=class{$extractFramebufferData(t){return{characterPixels:t.readPixels(0),primaryColorPixels:t.readPixels(1),secondaryColorPixels:t.readPixels(2)}}$getEncodedCharacterValue(t,e){return t[e]+(t[e+1]<<8)}$getCharacterIndex(t,e){return this.$getEncodedCharacterValue(t,e)}$extractCellTransform(t,e){const i=t[e+2],r=t[e+3]/255;return{isInverted:!!(1&i),flipHorizontal:!!(2&i),flipVertical:!!(4&i),rotation:Math.round(360*r*100)/100}}},n=class{$downloadFile(t,e){try{const i=this.t(e),r=URL.createObjectURL(t),n=document.createElement("a");n.href=r,n.download=i,n.style.display="none",n.rel="noopener",document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(r)}catch(i){console.error("[textmode-export] Failed to download file:",i)}}t(t){if(!t)return this.i();const e=t.trim();return e&&e.replace(/[<>:"/\\|?*]/g,"_").replace(/\s+/g,"_").replace(/_{2,}/g,"_").replace(/^_+|_+$/g,"").substring(0,255)||this.i()}i(){return`textmode-export-${(new Date).toISOString().slice(0,19).replace(/:/g,"-")}`}},o=new WeakMap;function s(t){return Math.round(255*t[0])+(Math.round(255*t[1])<<8)}function a(t,e){let i=o.get(t);if(!i){i=new Map;for(const e of t.characters)i.set(s(e.color),e);o.set(t,i)}return i.get(e)}function h(t,e){const i="base"===t?"Base layer":`Layer ${Number.parseInt(t.replace("layer-",""),10)}`;return!1===e.o?`${i} (hidden)`:i}function c(t){return[{id:"base",layer:t.layers.base},...t.layers.all.map((t,e)=>({id:`layer-${e+1}`,layer:t}))].map(({id:t,layer:e})=>({id:t,label:h(t,e),layer:e}))}function l(t,e){const i=e??t.layers.base,r=function(t,e){if(e===t.layers.base)return"base";const i=t.layers.all.indexOf(e);if(i>=0)return`layer-${i+1}`;throw new Error("[textmode-export] Cannot export a layer that is not managed by this Textmodifier instance.")}(t,i),n=i.grid,o=i.font,s=i.drawFramebuffer;if(!n||!s)throw new Error("[textmode-export] Cannot export an uninitialized layer.");return{id:r,label:h(r,i),layer:i,grid:n,font:o,drawFramebuffer:s}}function d(t,e){return{r:t[e],g:t[e+1],b:t[e+2],a:t[e+3]}}var u=class extends r{h(t,e,i){return{x:t,y:e,cellX:t*i.cellWidth,cellY:e*i.cellHeight}}$extractSVGCellData(t,e){const i=[];let r=0;for(let n=0;n<e.rows;n++)for(let o=0;o<e.cols;o++){const s=4*r,a=this.$getEncodedCharacterValue(t.characterPixels,s);let h=d(t.primaryColorPixels,s),c=d(t.secondaryColorPixels,s);const l=this.$extractCellTransform(t.characterPixels,s);if(l.isInverted){const t=h;h=c,c=t}const u=this.h(o,n,e);i.push({encodedGlyphSlot:a,primaryColor:h,secondaryColor:c,transform:l,position:u}),r++}return i}},f=class{l(t,e,i,r,n){const o=n/t.head.unitsPerEm;return{getBoundingBox:()=>({x1:i+e.xMin*o,y1:r+-e.yMax*o,x2:i+e.xMax*o,y2:r+-e.yMin*o}),toSVG:()=>this.u(e,i,r,o)}}u(t,e,i,r){if(!t||!t.xs)return"";const{xs:n,ys:o,endPts:s,flags:a}=t;if(!(n&&o&&s&&a))return"";let h="",c=0;for(let l=0;l<s.length;l++){const t=s[l];if(!(t<c)){if(t>=c){const s=e+n[c]*r,l=i-o[c]*r;h+=`M${s.toFixed(2)},${l.toFixed(2)}`;let d=c+1;for(;d<=t;)if(1&a[d]){const t=e+n[d]*r,s=i-o[d]*r;h+=`L${t.toFixed(2)},${s.toFixed(2)}`,d++}else{const s=e+n[d]*r,l=i-o[d]*r,u=d+1>t?c:d+1;if(1&a[u]){const t=e+n[u]*r,a=i-o[u]*r;h+=`Q${s.toFixed(2)},${l.toFixed(2)} ${t.toFixed(2)},${a.toFixed(2)}`,d=u+1}else{const t=(s+(e+n[u]*r))/2,a=(l+(i-o[u]*r))/2;h+=`Q${s.toFixed(2)},${l.toFixed(2)} ${t.toFixed(2)},${a.toFixed(2)}`,d=u}}h+="Z"}c=t+1}}return h}$generatePositionedCharacterPath(t,e,i,r,n,o,s,a){if(!a)return null;const h=e.font,c=s/h.head.unitsPerEm,l=i+(n-a.advanceWidth*c)/2,d=r+h.hhea.ascender*c;return this.l(h,a,l,d,s).toSVG()||null}},p=class{p;constructor(){this.p=new f}$generateSVGHeader(t){const{width:e,height:i}=t;return`<?xml version="1.0" encoding="UTF-8"?><svg width="${e}" height="${i}" viewBox="0 0 ${e} ${i}" xmlns="http://www.w3.org/2000/svg"><title>textmode.js sketch</title>`}$generateSVGFooter(){return"</g></svg>"}m(t,e){const{transform:i,position:r}=t;if(!i.flipHorizontal&&!i.flipVertical&&!i.rotation)return"";const n=r.cellX+e.cellWidth/2,o=r.cellY+e.cellHeight/2,s=[];if(i.flipHorizontal||i.flipVertical){const t=i.flipHorizontal?-1:1,e=i.flipVertical?-1:1;s.push(`translate(${n} ${o})scale(${t} ${e})translate(${-n} ${-o})`)}return i.rotation&&s.push(`rotate(${i.rotation} ${n} ${o})`),` transform="${s.join(" ")}"`}v(t,e,i){if(!i.includeBackgroundRectangles||0===t.secondaryColor.a)return"";const{position:r}=t,{r:n,g:o,b:s,a}=t.secondaryColor,h=`rgba(${n},${o},${s},${a/255})`;return"stroke"===i.drawMode?`<rect x="${r.cellX}" y="${r.cellY}" width="${e.cellWidth}" height="${e.cellHeight}" stroke="${h}" fill="none" stroke-width="${i.strokeWidth}"/>`:`<rect x="${r.cellX}" y="${r.cellY}" width="${e.cellWidth}" height="${e.cellHeight}" fill="${h}"/>`}k(t,e,i,r){const n=a(i,t.encodedGlyphSlot);if(!n)return"";const o=this.p.$generatePositionedCharacterPath(n.character,i,t.position.cellX,t.position.cellY,e.cellWidth,e.cellHeight,i.fontSize,n.glyphData);if(!o)return"";const{r:s,g:h,b:c,a:l}=t.primaryColor,d=`rgba(${s},${h},${c},${l/255})`;return"stroke"===r.drawMode?`<path d="${o}" stroke="${d}" stroke-width="${r.strokeWidth}" fill="none"/>`:`<path d="${o}" fill="${d}"/>`}$generateCellContent(t,e,i,r){const n=[],o=this.v(t,e,r);o&&n.push(o);const s=this.k(t,e,i,r);if(s){const i=this.m(t,e);n.push(i?`<g${i}>${s}</g>`:s)}return n.join("")}$generateSVGContent(t,e,i,r){const n=[this.$generateSVGHeader(e),'<g id="ascii-cells">'];for(const o of t)n.push(this.$generateCellContent(o,e,i,r));return n.push(this.$generateSVGFooter()),n.join("")}$optimizeSVGContent(t){return t.replace(/\s+/g," ").replace(/> </g,"><")}},m=class{T(t){return{includeBackgroundRectangles:t.includeBackgroundRectangles??!0,drawMode:t.drawMode??"fill",strokeWidth:t.strokeWidth??1,filename:t.filename,layer:t.layer}}$generateSVG(t,e={}){const i=new u,r=new p,n=this.T(e),o=l(t,n.layer),s=i.$extractSVGCellData(i.$extractFramebufferData(o.drawFramebuffer),o.grid),a=r.$generateSVGContent(s,o.grid,o.font,n);return r.$optimizeSVGContent(a)}$saveSVG(t,e={}){(new n).$downloadFile(new Blob([this.$generateSVG(t,e)],{type:"image/svg+xml;charset=utf-8"}),e.filename)}},w={png:"image/png",jpg:"image/jpeg",webp:"image/webp"},b=class{T(t){return{format:t.format??"png",scale:Math.abs(t.scale??1),filename:t.filename}}M(t){if(!(t.format in w))throw new Error(`Saving '${t.format}' files is not supported`)}async $generateImageBlob(t,e){const i=t,r=document.createElement("canvas"),n=r.getContext("2d"),o=Math.round(i.width*e.scale),s=Math.round(i.height*e.scale);return r.width=o,r.height=s,n.imageSmoothingEnabled=!1,n.clearRect(0,0,o,s),n.drawImage(i,0,0,i.width,i.height,0,0,o,s),await new Promise((t,i)=>{r.toBlob(r=>{r?t(r):i(new Error(`Failed to generate ${e.format.toUpperCase()} blob`))},w[e.format])})}async $saveImage(t,e={}){const i=this.T(e);this.M(i);const r=await this.$toImageBlob(t,e);(new n).$downloadFile(r,i.filename)}async $toImageBlob(t,e={}){const i=this.T(e);return this.M(i),this.$generateImageBlob(t,i)}async $copyImageToClipboard(t,e={}){if("undefined"==typeof navigator||!navigator.clipboard||"function"!=typeof navigator.clipboard.write)throw new Error("Clipboard API is not available in this environment");const i=this.T(e);this.M(i);const r=await this.$generateImageBlob(t,i),n=new ClipboardItem({[w[i.format]]:r});await navigator.clipboard.write([n])}},y=class{T(t){return{preserveTrailingSpaces:t.preserveTrailingSpaces??!1,emptyCharacter:t.emptyCharacter??" ",filename:t.filename,layer:t.layer}}_(t,e){const i=new r,n=l(t,e.layer),o=i.$extractFramebufferData(n.drawFramebuffer),s=[];let h=0;for(let r=0;r<n.grid.rows;r++){let t="";for(let r=0;r<n.grid.cols;r++){const r=4*h,s=i.$getEncodedCharacterValue(o.characterPixels,r);t+=a(n.font,s)?.character||e.emptyCharacter,h++}e.preserveTrailingSpaces||(t=t.trimEnd()),s.push(t)}return s.join("\n")}$generateTXT(t,e={}){return this._(t,this.T(e))}$saveTXT(t,e={}){const i=this.T(e),r=this._(t,i),o=new Blob([r],{type:"text/plain;charset=utf-8"});(new n).$downloadFile(o,i.filename)}},v=i(t=>{var e=Object.defineProperty;e(t,"__esModule",{value:!0}),((t,i)=>{for(var r in i)e(t,r,{get:i[r],enumerable:!0})})(t,{GIFEncoder:()=>_,applyPalette:()=>y,default:()=>P,nearestColor:()=>M,nearestColorIndex:()=>k,nearestColorIndexWithDistance:()=>T,prequantize:()=>b,quantize:()=>f,snapColorsToPalette:()=>x});var i={signature:"GIF",version:"89a",trailer:59,extensionIntroducer:33,applicationExtensionLabel:255,graphicControlExtensionLabel:249,imageSeparator:44,signatureSize:3,versionSize:3,globalColorTableFlagMask:128,colorResolutionMask:112,sortFlagMask:8,globalColorTableSizeMask:7,applicationIdentifierSize:8,applicationAuthCodeSize:3,disposalMethodMask:28,userInputFlagMask:2,transparentColorFlagMask:1,localColorTableFlagMask:128,interlaceFlagMask:64,idSortFlagMask:32,localColorTableSizeMask:7};function r(t=256){let e=0,i=new Uint8Array(t);return{get buffer(){return i.buffer},reset(){e=0},bytesView:()=>i.subarray(0,e),bytes:()=>i.slice(0,e),writeByte(t){r(e+1),i[e]=t,e++},writeBytes(t,n=0,o=t.length){r(e+o);for(let r=0;r<o;r++)i[e++]=t[r+n]},writeBytesView(t,n=0,o=t.byteLength){r(e+o),i.set(t.subarray(n,n+o),e),e+=o}};function r(t){var r=i.length;if(r>=t)return;t=Math.max(t,r*(r<1048576?2:1.125)>>>0),0!=r&&(t=Math.max(t,256));const n=i;i=new Uint8Array(t),e>0&&i.set(n.subarray(0,e),0)}}var n=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],o=function(t,e,i,o,s=r(512),a=new Uint8Array(256),h=new Int32Array(5003),c=new Int32Array(5003)){const l=h.length,d=Math.max(2,o);a.fill(0),c.fill(0),h.fill(-1);let u=0,f=0;const p=d+1,m=p;let w=!1,b=m,y=(1<<b)-1;const v=1<<p-1,g=v+1;let x=v+2,E=0,k=i[0],T=0;for(let r=l;r<65536;r*=2)++T;T=8-T,s.writeByte(d),_(v);const M=i.length;for(let r=1;r<M;r++)t:{const t=i[r],e=(t<<12)+k;let n=t<<T^k;if(h[n]===e){k=c[n];break t}const o=0===n?1:l-n;for(;h[n]>=0;)if(n-=o,n<0&&(n+=l),h[n]===e){k=c[n];break t}_(k),k=t,x<4096?(c[n]=x++,h[n]=e):(h.fill(-1),x=v+2,w=!0,_(v))}return _(k),_(g),s.writeByte(0),s.bytesView();function _(t){for(u&=n[f],f>0?u|=t<<f:u=t,f+=b;f>=8;)a[E++]=255&u,E>=254&&(s.writeByte(E),s.writeBytesView(a,0,E),E=0),u>>=8,f-=8;if((x>y||w)&&(w?(b=m,y=(1<<b)-1,w=!1):(++b,y=12===b?1<<b:(1<<b)-1)),t==g){for(;f>0;)a[E++]=255&u,E>=254&&(s.writeByte(E),s.writeBytesView(a,0,E),E=0),u>>=8,f-=8;E>0&&(s.writeByte(E),s.writeBytesView(a,0,E),E=0)}}};function s(t,e,i){return t<<8&63488|e<<2&992|i>>3}function a(t,e,i,r){return t>>4|240&e|(240&i)<<4|(240&r)<<8}function h(t,e,i){return t>>4<<8|240&e|i>>4}function c(t,e,i){return t<e?e:t>i?i:t}function l(t){return t*t}function d(t,e,i){var r=0,n=1e100;const o=t[e],s=o.cnt,a=o.ac,h=o.rc,c=o.gc,d=o.bc;for(var u=o.fw;0!=u;u=t[u].fw){const e=t[u],o=e.cnt,p=s*o/(s+o);if(!(p>=n)){var f=0;i&&(f+=p*l(e.ac-a))>=n||(f+=p*l(e.rc-h))>=n||(f+=p*l(e.gc-c))>=n||(f+=p*l(e.bc-d))>=n||(n=f,r=u)}}o.err=n,o.nn=r}function u(){return{ac:0,rc:0,gc:0,bc:0,cnt:0,nn:0,fw:0,bk:0,tm:0,mtm:0,err:0}}function f(t,e,i={}){const{format:r="rgb565",clearAlpha:n=!0,clearAlphaColor:o=0,clearAlphaThreshold:f=0,oneBitAlpha:m=!1}=i;if(!t||!t.buffer)throw new Error("quantize() expected RGBA Uint8Array data");if(!(t instanceof Uint8Array||t instanceof Uint8ClampedArray))throw new Error("quantize() expected RGBA Uint8Array data");const w=new Uint32Array(t.buffer);let b=!1!==i.useSqrt;const y="rgba4444"===r,v=function(t,e){const i=new Array("rgb444"===e?4096:65536),r=t.length;if("rgba4444"===e)for(let n=0;n<r;++n){const e=t[n],r=e>>24&255,o=e>>16&255,s=e>>8&255,h=255&e,c=a(h,s,o,r);let l=c in i?i[c]:i[c]=u();l.rc+=h,l.gc+=s,l.bc+=o,l.ac+=r,l.cnt++}else if("rgb444"===e)for(let n=0;n<r;++n){const e=t[n],r=e>>16&255,o=e>>8&255,s=255&e,a=h(s,o,r);let c=a in i?i[a]:i[a]=u();c.rc+=s,c.gc+=o,c.bc+=r,c.cnt++}else for(let n=0;n<r;++n){const e=t[n],r=e>>16&255,o=e>>8&255,a=255&e,h=s(a,o,r);let c=h in i?i[h]:i[h]=u();c.rc+=a,c.gc+=o,c.bc+=r,c.cnt++}return i}(w,r),g=v.length,x=g-1,E=new Uint32Array(g+1);for(var k=0,T=0;T<g;++T){const t=v[T];if(null!=t){var M=1/t.cnt;y&&(t.ac*=M),t.rc*=M,t.gc*=M,t.bc*=M,v[k++]=t}}var _,C,A;for(l(e)/k<.022&&(b=!1),T=0;T<k-1;++T)v[T].fw=T+1,v[T+1].bk=T,b&&(v[T].cnt=Math.sqrt(v[T].cnt));for(b&&(v[T].cnt=Math.sqrt(v[T].cnt)),T=0;T<k;++T){d(v,T,!1);var S=v[T].err;for(C=++E[0];C>1&&!(v[_=E[A=C>>1]].err<=S);C=A)E[C]=_;E[C]=T}var B=k-e;for(T=0;T<B;){for(var P;;){var I=E[1];if((P=v[I]).tm>=P.mtm&&v[P.nn].mtm<=P.tm)break;for(P.mtm==x?I=E[1]=E[E[0]--]:(d(v,I,!1),P.tm=T),S=v[I].err,C=1;(A=C+C)<=E[0]&&(A<E[0]&&v[E[A]].err>v[E[A+1]].err&&A++,!(S<=v[_=E[A]].err));C=A)E[C]=_;E[C]=I}var F=v[P.nn],V=P.cnt,$=F.cnt;M=1/(V+$),y&&(P.ac=M*(V*P.ac+$*F.ac)),P.rc=M*(V*P.rc+$*F.rc),P.gc=M*(V*P.gc+$*F.gc),P.bc=M*(V*P.bc+$*F.bc),P.cnt+=F.cnt,P.mtm=++T,v[F.bk].fw=F.fw,v[F.fw].bk=F.bk,F.mtm=x}let U=[];var N=0;for(T=0;;++N){let t=c(Math.round(v[T].rc),0,255),e=c(Math.round(v[T].gc),0,255),i=c(Math.round(v[T].bc),0,255),r=255;y&&(r=c(Math.round(v[T].ac),0,255),m&&(r=r<=("number"==typeof m?m:127)?0:255),n&&r<=f&&(t=e=i=o,r=0));const s=y?[t,e,i,r]:[t,e,i];if(p(U,s)||U.push(s),0==(T=v[T].fw))break}return U}function p(t,e){for(let i=0;i<t.length;i++){const r=t[i];let n=r[0]===e[0]&&r[1]===e[1]&&r[2]===e[2],o=!(r.length>=4&&e.length>=4)||r[3]===e[3];if(n&&o)return!0}return!1}function m(t,e){var i,r=0;for(i=0;i<t.length;i++){const n=t[i]-e[i];r+=n*n}return r}function w(t,e){return e>1?Math.round(t/e)*e:t}function b(t,{roundRGB:e=5,roundAlpha:i=10,oneBitAlpha:r=null}={}){const n=new Uint32Array(t.buffer);for(let o=0;o<n.length;o++){const t=n[o];let s=t>>24&255,a=t>>16&255,h=t>>8&255,c=255&t;s=w(s,i),r&&(s=s<=("number"==typeof r?r:127)?0:255),c=w(c,e),h=w(h,e),a=w(a,e),n[o]=s<<24|a<<16|h<<8|c}}function y(t,e,i="rgb565"){if(!t||!t.buffer)throw new Error("quantize() expected RGBA Uint8Array data");if(!(t instanceof Uint8Array||t instanceof Uint8ClampedArray))throw new Error("quantize() expected RGBA Uint8Array data");if(e.length>256)throw new Error("applyPalette() only works with 256 colors or less");const r=new Uint32Array(t.buffer),n=r.length,o="rgb444"===i?4096:65536,c=new Uint8Array(n),l=new Array(o);if("rgba4444"===i)for(let s=0;s<n;s++){const t=r[s],i=t>>24&255,n=t>>16&255,o=t>>8&255,h=255&t,d=a(h,o,n,i);c[s]=d in l?l[d]:l[d]=v(h,o,n,i,e)}else{const t="rgb444"===i?h:s;for(let i=0;i<n;i++){const n=r[i],o=n>>16&255,s=n>>8&255,a=255&n,h=t(a,s,o);c[i]=h in l?l[h]:l[h]=g(a,s,o,e)}}return c}function v(t,e,i,r,n){let o=0,s=1e100;for(let a=0;a<n.length;a++){const h=n[a];let c=E(h[3]-r);c>s||(c+=E(h[0]-t),c>s||(c+=E(h[1]-e),c>s||(c+=E(h[2]-i),c>s||(s=c,o=a))))}return o}function g(t,e,i,r){let n=0,o=1e100;for(let s=0;s<r.length;s++){const a=r[s];let h=E(a[0]-t);h>o||(h+=E(a[1]-e),h>o||(h+=E(a[2]-i),h>o||(o=h,n=s)))}return n}function x(t,e,i=5){if(!t.length||!e.length)return;const r=t.map(t=>t.slice(0,3)),n=i*i,o=t[0].length;for(let s=0;s<e.length;s++){let i=e[s];i=i.length<o?[i[0],i[1],i[2],255]:i.length>o?i.slice(0,3):i.slice();const a=T(r,i.slice(0,3),m),h=a[0],c=a[1];c>0&&c<=n&&(t[h]=i)}}function E(t){return t*t}function k(t,e,i=m){let r=1/0,n=-1;for(let o=0;o<t.length;o++){const s=i(e,t[o]);s<r&&(r=s,n=o)}return n}function T(t,e,i=m){let r=1/0,n=-1;for(let o=0;o<t.length;o++){const s=i(e,t[o]);s<r&&(r=s,n=o)}return[n,r]}function M(t,e,i=m){return t[k(t,e,i)]}function _(t={}){const{initialCapacity:e=4096,auto:n=!0}=t,s=r(e),a=new Uint8Array(256),h=new Int32Array(5003),c=new Int32Array(5003);let l=!1;return{reset(){s.reset(),l=!1},finish(){s.writeByte(i.trailer)},bytes:()=>s.bytes(),bytesView:()=>s.bytesView(),get buffer(){return s.buffer},get stream(){return s},writeHeader:d,writeFrame(t,e,i,r={}){const{transparent:u=!1,transparentIndex:f=0,delay:p=0,palette:m=null,repeat:w=0,colorDepth:b=8,dispose:y=-1}=r;let v=!1;if(n?l||(v=!0,d(),l=!0):v=Boolean(r.first),e=Math.max(0,Math.floor(e)),i=Math.max(0,Math.floor(i)),v){if(!m)throw new Error("First frame must include a { palette } option");!function(t,e,i,r,n=8){const o=n-1<<4|128|B(r.length)-1;A(t,e),A(t,i),t.writeBytes([o,0,0])}(s,e,i,m,b),C(s,m),w>=0&&function(t,e){t.writeByte(33),t.writeByte(255),t.writeByte(11),S(t,"NETSCAPE2.0"),t.writeByte(3),t.writeByte(1),A(t,e),t.writeByte(0)}(s,w)}const g=Math.round(p/10);!function(t,e,i,r,n){var o,s;t.writeByte(33),t.writeByte(249),t.writeByte(4),n<0&&(n=0,r=!1),r?(o=1,s=2):(o=0,s=0),e>=0&&(s=7&e),s<<=2,t.writeByte(0|s|o),A(t,i),t.writeByte(n||0),t.writeByte(0)}(s,y,g,u,f);const x=Boolean(m)&&!v;!function(t,e,i,r){if(t.writeByte(44),A(t,0),A(t,0),A(t,e),A(t,i),r){const e=B(r.length)-1;t.writeByte(128|e)}else t.writeByte(0)}(s,e,i,x?m:null),x&&C(s,m),function(t,e,i,r,n=8,s,a,h){o(i,r,e,n,t,s,a,h)}(s,t,e,i,b,a,h,c)}};function d(){S(s,"GIF89a")}}function C(t,e){const i=1<<B(e.length);for(let r=0;r<i;r++){let i=[0,0,0];r<e.length&&(i=e[r]),t.writeByte(i[0]),t.writeByte(i[1]),t.writeByte(i[2])}}function A(t,e){t.writeByte(255&e),t.writeByte(e>>8&255)}function S(t,e){for(var i=0;i<e.length;i++)t.writeByte(e.charCodeAt(i))}function B(t){return Math.max(Math.ceil(Math.log2(t)),1)}var P=_}),g=class extends Error{code;cause;constructor(t,e,i){super(e),this.name="VideoExportError",this.code=t,this.cause=i}};function x(){return new g("VIDEO_EXPORT_ABORTED","Video export was cancelled.")}function E(t,e,i,r){return new Promise((n,o)=>{if(i?.aborted)return void o(x());let s=!1;const a=setTimeout(()=>h(()=>o(function(t){return new g("VIDEO_EXPORT_TIMEOUT",t,void 0)}(e))),r),h=t=>{s||(s=!0,clearTimeout(a),i?.removeEventListener("abort",c),t())},c=()=>h(()=>o(x()));i?.addEventListener("abort",c,{once:!0}),t.then(t=>h(()=>n(t)),t=>h(()=>o(t)))})}var k=class{canvas;C;A;S;B;P=null;I=0;F=0;constructor(t,e,i,r){this.C=t,this.A=e,this.B=t.canvas,this.canvas=this.V(i,r);const n=this.canvas.getContext("2d");if(!n)throw new Error("Video export requires a 2D canvas context for staging frames.");n.imageSmoothingEnabled=!1,this.S=n}async $render(t){const e=this.C,i=Math.max(1,Math.round(t.frameCount)),r=Math.max(1,Math.round(t.frameRate)),n=1e3/r,o=e.isLooping(),s=e.frameCount,a=e.millis,h="secs"in e,c=e.secs,l=this.$(),d=this.U(),u=this.A(()=>{this.N()});try{e.noLoop(),this.I=s,this.F=a,this.R(h),this.D(r,n),this.O();for(let e=0;e<i;e++)this.j(t.signal),this.I=s+e+1,this.F=1e3*e/r,await(t.prepareFrame?.({frameIndex:e,frameCount:i,timeSeconds:e/r,frameRate:r,signal:t.signal})),this.j(t.signal),await this.G(e,t.signal),this.j(t.signal),await t.onFrame({frameIndex:e,canvas:this.canvas})}finally{u(),this.P?.reject(new Error("Video export frame rendering was interrupted.")),this.P=null,this.H(d),this.L(l),e.frameCount=s,e.millis=a,h&&void 0!==c&&(e.secs=c),o?e.loop():e.noLoop()}}G(t,e){if(this.P)throw new Error("A video export frame is already pending.");const i=this.C;return E(new Promise((e,r)=>{this.P={frameIndex:t,resolve:e,reject:r};try{i.redraw(1)}catch(n){this.P=null,r(n)}}),`Video export frame ${t+1} did not render within 30000ms.`,e,3e4).catch(e=>{throw this.P?.frameIndex===t&&(this.P=null),e})}N(){const t=this.P;if(t)try{this.S.clearRect(0,0,this.canvas.width,this.canvas.height),this.S.drawImage(this.B,0,0,this.B.width,this.B.height,0,0,this.canvas.width,this.canvas.height),this.P=null,t.resolve()}catch(e){this.P=null,t.reject(e)}}V(t,e){const i=document.createElement("canvas");return i.width=Math.max(1,Math.round(t)),i.height=Math.max(1,Math.round(e)),i}$(){return["deltaTime","frameRate","resizeCanvas"].map(t=>({key:t,hadOwnProperty:Object.prototype.hasOwnProperty.call(this.C,t),value:this.C[t]}))}U(){return["frameCount","millis","secs"].map(t=>({key:t,hadOwnProperty:Object.prototype.hasOwnProperty.call(this.C,t),descriptor:Object.getOwnPropertyDescriptor(this.C,t)}))}R(t){Object.defineProperty(this.C,"frameCount",{configurable:!0,enumerable:!0,get:()=>this.I,set:t=>{this.I=t}}),Object.defineProperty(this.C,"millis",{configurable:!0,enumerable:!0,get:()=>this.F,set:t=>{this.F=t}}),t&&Object.defineProperty(this.C,"secs",{configurable:!0,enumerable:!0,get:()=>this.F/1e3,set:t=>{this.F=1e3*t}})}D(t,e){const i=this.C,r=i.frameRate;i.deltaTime=()=>e,i.frameRate=function(e){return void 0===e?t:r.call(this,e)}}O(){this.C.resizeCanvas=()=>{}}L(t){const e=this.C;for(const i of t)i.hadOwnProperty?e[i.key]=i.value:delete e[i.key]}H(t){for(const e of t)e.hadOwnProperty&&e.descriptor?Object.defineProperty(this.C,e.key,e.descriptor):delete this.C[e.key]}j(t){if(t?.aborted)throw x()}},T='(function() {\n\tvar r = ((t, r) => () => (r || (t((r = { exports: {} }).exports, r), t = null), r.exports))((t) => {\n\t\tvar r = Object.defineProperty;\n\t\tr(t, "__esModule", { value: !0 }), ((t, e) => {\n\t\t\tfor (var n in e) r(t, n, {\n\t\t\t\tget: e[n],\n\t\t\t\tenumerable: !0\n\t\t\t});\n\t\t})(t, {\n\t\t\tGIFEncoder: () => I,\n\t\t\tapplyPalette: () => b,\n\t\t\tdefault: () => x,\n\t\t\tnearestColor: () => C,\n\t\t\tnearestColorIndex: () => k,\n\t\t\tnearestColorIndexWithDistance: () => U,\n\t\t\tprequantize: () => A,\n\t\t\tquantize: () => y,\n\t\t\tsnapColorsToPalette: () => v\n\t\t});\n\t\tvar e = {\n\t\t\tsignature: "GIF",\n\t\t\tversion: "89a",\n\t\t\ttrailer: 59,\n\t\t\textensionIntroducer: 33,\n\t\t\tapplicationExtensionLabel: 255,\n\t\t\tgraphicControlExtensionLabel: 249,\n\t\t\timageSeparator: 44,\n\t\t\tsignatureSize: 3,\n\t\t\tversionSize: 3,\n\t\t\tglobalColorTableFlagMask: 128,\n\t\t\tcolorResolutionMask: 112,\n\t\t\tsortFlagMask: 8,\n\t\t\tglobalColorTableSizeMask: 7,\n\t\t\tapplicationIdentifierSize: 8,\n\t\t\tapplicationAuthCodeSize: 3,\n\t\t\tdisposalMethodMask: 28,\n\t\t\tuserInputFlagMask: 2,\n\t\t\ttransparentColorFlagMask: 1,\n\t\t\tlocalColorTableFlagMask: 128,\n\t\t\tinterlaceFlagMask: 64,\n\t\t\tidSortFlagMask: 32,\n\t\t\tlocalColorTableSizeMask: 7\n\t\t};\n\t\tfunction n(t = 256) {\n\t\t\tlet r = 0, e = new Uint8Array(t);\n\t\t\treturn {\n\t\t\t\tget buffer() {\n\t\t\t\t\treturn e.buffer;\n\t\t\t\t},\n\t\t\t\treset() {\n\t\t\t\t\tr = 0;\n\t\t\t\t},\n\t\t\t\tbytesView: () => e.subarray(0, r),\n\t\t\t\tbytes: () => e.slice(0, r),\n\t\t\t\twriteByte(t) {\n\t\t\t\t\tn(r + 1), e[r] = t, r++;\n\t\t\t\t},\n\t\t\t\twriteBytes(t, o = 0, a = t.length) {\n\t\t\t\t\tn(r + a);\n\t\t\t\t\tfor (let n = 0; n < a; n++) e[r++] = t[n + o];\n\t\t\t\t},\n\t\t\t\twriteBytesView(t, o = 0, a = t.byteLength) {\n\t\t\t\t\tn(r + a), e.set(t.subarray(o, o + a), r), r += a;\n\t\t\t\t}\n\t\t\t};\n\t\t\tfunction n(t) {\n\t\t\t\tvar n = e.length;\n\t\t\t\tif (n >= t) return;\n\t\t\t\tt = Math.max(t, n * (n < 1048576 ? 2 : 1.125) >>> 0), 0 != n && (t = Math.max(t, 256));\n\t\t\t\tconst o = e;\n\t\t\t\te = new Uint8Array(t), r > 0 && e.set(o.subarray(0, r), 0);\n\t\t\t}\n\t\t}\n\t\tvar o = [\n\t\t\t0,\n\t\t\t1,\n\t\t\t3,\n\t\t\t7,\n\t\t\t15,\n\t\t\t31,\n\t\t\t63,\n\t\t\t127,\n\t\t\t255,\n\t\t\t511,\n\t\t\t1023,\n\t\t\t2047,\n\t\t\t4095,\n\t\t\t8191,\n\t\t\t16383,\n\t\t\t32767,\n\t\t\t65535\n\t\t], a = function(t, r, e, a, i = n(512), l = /* @__PURE__ */ new Uint8Array(256), c = /* @__PURE__ */ new Int32Array(5003), f = /* @__PURE__ */ new Int32Array(5003)) {\n\t\t\tconst s = c.length, u = Math.max(2, a);\n\t\t\tl.fill(0), f.fill(0), c.fill(-1);\n\t\t\tlet p = 0, y = 0;\n\t\t\tconst h = u + 1, w = h;\n\t\t\tlet d = !1, A = w, b = (1 << A) - 1;\n\t\t\tconst M = 1 << h - 1, g = M + 1;\n\t\t\tlet v = M + 2, m = 0, k = e[0], U = 0;\n\t\t\tfor (let n = s; n < 65536; n *= 2) ++U;\n\t\t\tU = 8 - U, i.writeByte(u), I(M);\n\t\t\tconst C = e.length;\n\t\t\tfor (let n = 1; n < C; n++) t: {\n\t\t\t\tconst t = e[n], r = (t << 12) + k;\n\t\t\t\tlet o = t << U ^ k;\n\t\t\t\tif (c[o] === r) {\n\t\t\t\t\tk = f[o];\n\t\t\t\t\tbreak t;\n\t\t\t\t}\n\t\t\t\tconst a = 0 === o ? 1 : s - o;\n\t\t\t\tfor (; c[o] >= 0;) if (o -= a, o < 0 && (o += s), c[o] === r) {\n\t\t\t\t\tk = f[o];\n\t\t\t\t\tbreak t;\n\t\t\t\t}\n\t\t\t\tI(k), k = t, v < 4096 ? (f[o] = v++, c[o] = r) : (c.fill(-1), v = M + 2, d = !0, I(M));\n\t\t\t}\n\t\t\treturn I(k), I(g), i.writeByte(0), i.bytesView();\n\t\t\tfunction I(t) {\n\t\t\t\tfor (p &= o[y], y > 0 ? p |= t << y : p = t, y += A; y >= 8;) l[m++] = 255 & p, m >= 254 && (i.writeByte(m), i.writeBytesView(l, 0, m), m = 0), p >>= 8, y -= 8;\n\t\t\t\tif ((v > b || d) && (d ? (A = w, b = (1 << A) - 1, d = !1) : (++A, b = 12 === A ? 1 << A : (1 << A) - 1)), t == g) {\n\t\t\t\t\tfor (; y > 0;) l[m++] = 255 & p, m >= 254 && (i.writeByte(m), i.writeBytesView(l, 0, m), m = 0), p >>= 8, y -= 8;\n\t\t\t\t\tm > 0 && (i.writeByte(m), i.writeBytesView(l, 0, m), m = 0);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tfunction i(t, r, e) {\n\t\t\treturn t << 8 & 63488 | r << 2 & 992 | e >> 3;\n\t\t}\n\t\tfunction l(t, r, e, n) {\n\t\t\treturn t >> 4 | 240 & r | (240 & e) << 4 | (240 & n) << 8;\n\t\t}\n\t\tfunction c(t, r, e) {\n\t\t\treturn t >> 4 << 8 | 240 & r | e >> 4;\n\t\t}\n\t\tfunction f(t, r, e) {\n\t\t\treturn t < r ? r : t > e ? e : t;\n\t\t}\n\t\tfunction s(t) {\n\t\t\treturn t * t;\n\t\t}\n\t\tfunction u(t, r, e) {\n\t\t\tvar n = 0, o = 1e100;\n\t\t\tconst a = t[r], i = a.cnt, l = a.ac, c = a.rc, f = a.gc, u = a.bc;\n\t\t\tfor (var p = a.fw; 0 != p; p = t[p].fw) {\n\t\t\t\tconst r = t[p], a = r.cnt, h = i * a / (i + a);\n\t\t\t\tif (!(h >= o)) {\n\t\t\t\t\tvar y = 0;\n\t\t\t\t\te && (y += h * s(r.ac - l)) >= o || (y += h * s(r.rc - c)) >= o || (y += h * s(r.gc - f)) >= o || (y += h * s(r.bc - u)) >= o || (o = y, n = p);\n\t\t\t\t}\n\t\t\t}\n\t\t\ta.err = o, a.nn = n;\n\t\t}\n\t\tfunction p() {\n\t\t\treturn {\n\t\t\t\tac: 0,\n\t\t\t\trc: 0,\n\t\t\t\tgc: 0,\n\t\t\t\tbc: 0,\n\t\t\t\tcnt: 0,\n\t\t\t\tnn: 0,\n\t\t\t\tfw: 0,\n\t\t\t\tbk: 0,\n\t\t\t\ttm: 0,\n\t\t\t\tmtm: 0,\n\t\t\t\terr: 0\n\t\t\t};\n\t\t}\n\t\tfunction y(t, r, e = {}) {\n\t\t\tconst { format: n = "rgb565", clearAlpha: o = !0, clearAlphaColor: a = 0, clearAlphaThreshold: y = 0, oneBitAlpha: w = !1 } = e;\n\t\t\tif (!t || !t.buffer) throw new Error("quantize() expected RGBA Uint8Array data");\n\t\t\tif (!(t instanceof Uint8Array || t instanceof Uint8ClampedArray)) throw new Error("quantize() expected RGBA Uint8Array data");\n\t\t\tconst d = new Uint32Array(t.buffer);\n\t\t\tlet A = !1 !== e.useSqrt;\n\t\t\tconst b = "rgba4444" === n, M = function(t, r) {\n\t\t\t\tconst e = new Array("rgb444" === r ? 4096 : 65536), n = t.length;\n\t\t\t\tif ("rgba4444" === r) for (let o = 0; o < n; ++o) {\n\t\t\t\t\tconst r = t[o], n = r >> 24 & 255, a = r >> 16 & 255, i = r >> 8 & 255, c = 255 & r, f = l(c, i, a, n);\n\t\t\t\t\tlet s = f in e ? e[f] : e[f] = p();\n\t\t\t\t\ts.rc += c, s.gc += i, s.bc += a, s.ac += n, s.cnt++;\n\t\t\t\t}\n\t\t\t\telse if ("rgb444" === r) for (let o = 0; o < n; ++o) {\n\t\t\t\t\tconst r = t[o], n = r >> 16 & 255, a = r >> 8 & 255, i = 255 & r, l = c(i, a, n);\n\t\t\t\t\tlet f = l in e ? e[l] : e[l] = p();\n\t\t\t\t\tf.rc += i, f.gc += a, f.bc += n, f.cnt++;\n\t\t\t\t}\n\t\t\t\telse for (let o = 0; o < n; ++o) {\n\t\t\t\t\tconst r = t[o], n = r >> 16 & 255, a = r >> 8 & 255, l = 255 & r, c = i(l, a, n);\n\t\t\t\t\tlet f = c in e ? e[c] : e[c] = p();\n\t\t\t\t\tf.rc += l, f.gc += a, f.bc += n, f.cnt++;\n\t\t\t\t}\n\t\t\t\treturn e;\n\t\t\t}(d, n), g = M.length, v = g - 1, m = new Uint32Array(g + 1);\n\t\t\tfor (var k = 0, U = 0; U < g; ++U) {\n\t\t\t\tconst t = M[U];\n\t\t\t\tif (null != t) {\n\t\t\t\t\tvar C = 1 / t.cnt;\n\t\t\t\t\tb && (t.ac *= C), t.rc *= C, t.gc *= C, t.bc *= C, M[k++] = t;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar I, F, z;\n\t\t\tfor (s(r) / k < .022 && (A = !1), U = 0; U < k - 1; ++U) M[U].fw = U + 1, M[U + 1].bk = U, A && (M[U].cnt = Math.sqrt(M[U].cnt));\n\t\t\tfor (A && (M[U].cnt = Math.sqrt(M[U].cnt)), U = 0; U < k; ++U) {\n\t\t\t\tu(M, U, !1);\n\t\t\t\tvar B = M[U].err;\n\t\t\t\tfor (F = ++m[0]; F > 1 && !(M[I = m[z = F >> 1]].err <= B); F = z) m[F] = I;\n\t\t\t\tm[F] = U;\n\t\t\t}\n\t\t\tvar E = k - r;\n\t\t\tfor (U = 0; U < E;) {\n\t\t\t\tfor (var x;;) {\n\t\t\t\t\tvar G = m[1];\n\t\t\t\t\tif ((x = M[G]).tm >= x.mtm && M[x.nn].mtm <= x.tm) break;\n\t\t\t\t\tfor (x.mtm == v ? G = m[1] = m[m[0]--] : (u(M, G, !1), x.tm = U), B = M[G].err, F = 1; (z = F + F) <= m[0] && (z < m[0] && M[m[z]].err > M[m[z + 1]].err && z++, !(B <= M[I = m[z]].err)); F = z) m[F] = I;\n\t\t\t\t\tm[F] = G;\n\t\t\t\t}\n\t\t\t\tvar S = M[x.nn], T = x.cnt, q = S.cnt;\n\t\t\t\tC = 1 / (T + q), b && (x.ac = C * (T * x.ac + q * S.ac)), x.rc = C * (T * x.rc + q * S.rc), x.gc = C * (T * x.gc + q * S.gc), x.bc = C * (T * x.bc + q * S.bc), x.cnt += S.cnt, x.mtm = ++U, M[S.bk].fw = S.fw, M[S.fw].bk = S.bk, S.mtm = v;\n\t\t\t}\n\t\t\tlet R = [];\n\t\t\tvar P = 0;\n\t\t\tfor (U = 0;; ++P) {\n\t\t\t\tlet t = f(Math.round(M[U].rc), 0, 255), r = f(Math.round(M[U].gc), 0, 255), e = f(Math.round(M[U].bc), 0, 255), n = 255;\n\t\t\t\tb && (n = f(Math.round(M[U].ac), 0, 255), w && (n = n <= ("number" == typeof w ? w : 127) ? 0 : 255), o && n <= y && (t = r = e = a, n = 0));\n\t\t\t\tconst i = b ? [\n\t\t\t\t\tt,\n\t\t\t\t\tr,\n\t\t\t\t\te,\n\t\t\t\t\tn\n\t\t\t\t] : [\n\t\t\t\t\tt,\n\t\t\t\t\tr,\n\t\t\t\t\te\n\t\t\t\t];\n\t\t\t\tif (h(R, i) || R.push(i), 0 == (U = M[U].fw)) break;\n\t\t\t}\n\t\t\treturn R;\n\t\t}\n\t\tfunction h(t, r) {\n\t\t\tfor (let e = 0; e < t.length; e++) {\n\t\t\t\tconst n = t[e];\n\t\t\t\tlet o = n[0] === r[0] && n[1] === r[1] && n[2] === r[2], a = !(n.length >= 4 && r.length >= 4) || n[3] === r[3];\n\t\t\t\tif (o && a) return !0;\n\t\t\t}\n\t\t\treturn !1;\n\t\t}\n\t\tfunction w(t, r) {\n\t\t\tvar e, n = 0;\n\t\t\tfor (e = 0; e < t.length; e++) {\n\t\t\t\tconst o = t[e] - r[e];\n\t\t\t\tn += o * o;\n\t\t\t}\n\t\t\treturn n;\n\t\t}\n\t\tfunction d(t, r) {\n\t\t\treturn r > 1 ? Math.round(t / r) * r : t;\n\t\t}\n\t\tfunction A(t, { roundRGB: r = 5, roundAlpha: e = 10, oneBitAlpha: n = null } = {}) {\n\t\t\tconst o = new Uint32Array(t.buffer);\n\t\t\tfor (let a = 0; a < o.length; a++) {\n\t\t\t\tconst t = o[a];\n\t\t\t\tlet i = t >> 24 & 255, l = t >> 16 & 255, c = t >> 8 & 255, f = 255 & t;\n\t\t\t\ti = d(i, e), n && (i = i <= ("number" == typeof n ? n : 127) ? 0 : 255), f = d(f, r), c = d(c, r), l = d(l, r), o[a] = i << 24 | l << 16 | c << 8 | f;\n\t\t\t}\n\t\t}\n\t\tfunction b(t, r, e = "rgb565") {\n\t\t\tif (!t || !t.buffer) throw new Error("quantize() expected RGBA Uint8Array data");\n\t\t\tif (!(t instanceof Uint8Array || t instanceof Uint8ClampedArray)) throw new Error("quantize() expected RGBA Uint8Array data");\n\t\t\tif (r.length > 256) throw new Error("applyPalette() only works with 256 colors or less");\n\t\t\tconst n = new Uint32Array(t.buffer), o = n.length, a = "rgb444" === e ? 4096 : 65536, f = new Uint8Array(o), s = new Array(a);\n\t\t\tif ("rgba4444" === e) for (let i = 0; i < o; i++) {\n\t\t\t\tconst t = n[i], e = t >> 24 & 255, o = t >> 16 & 255, a = t >> 8 & 255, c = 255 & t, u = l(c, a, o, e);\n\t\t\t\tf[i] = u in s ? s[u] : s[u] = M(c, a, o, e, r);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst t = "rgb444" === e ? c : i;\n\t\t\t\tfor (let e = 0; e < o; e++) {\n\t\t\t\t\tconst o = n[e], a = o >> 16 & 255, i = o >> 8 & 255, l = 255 & o, c = t(l, i, a);\n\t\t\t\t\tf[e] = c in s ? s[c] : s[c] = g(l, i, a, r);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn f;\n\t\t}\n\t\tfunction M(t, r, e, n, o) {\n\t\t\tlet a = 0, i = 1e100;\n\t\t\tfor (let l = 0; l < o.length; l++) {\n\t\t\t\tconst c = o[l];\n\t\t\t\tlet f = m(c[3] - n);\n\t\t\t\tf > i || (f += m(c[0] - t), f > i || (f += m(c[1] - r), f > i || (f += m(c[2] - e), f > i || (i = f, a = l))));\n\t\t\t}\n\t\t\treturn a;\n\t\t}\n\t\tfunction g(t, r, e, n) {\n\t\t\tlet o = 0, a = 1e100;\n\t\t\tfor (let i = 0; i < n.length; i++) {\n\t\t\t\tconst l = n[i];\n\t\t\t\tlet c = m(l[0] - t);\n\t\t\t\tc > a || (c += m(l[1] - r), c > a || (c += m(l[2] - e), c > a || (a = c, o = i)));\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t\tfunction v(t, r, e = 5) {\n\t\t\tif (!t.length || !r.length) return;\n\t\t\tconst n = t.map((t) => t.slice(0, 3)), o = e * e, a = t[0].length;\n\t\t\tfor (let i = 0; i < r.length; i++) {\n\t\t\t\tlet e = r[i];\n\t\t\t\te = e.length < a ? [\n\t\t\t\t\te[0],\n\t\t\t\t\te[1],\n\t\t\t\t\te[2],\n\t\t\t\t\t255\n\t\t\t\t] : e.length > a ? e.slice(0, 3) : e.slice();\n\t\t\t\tconst l = U(n, e.slice(0, 3), w), c = l[0], f = l[1];\n\t\t\t\tf > 0 && f <= o && (t[c] = e);\n\t\t\t}\n\t\t}\n\t\tfunction m(t) {\n\t\t\treturn t * t;\n\t\t}\n\t\tfunction k(t, r, e = w) {\n\t\t\tlet n = Infinity, o = -1;\n\t\t\tfor (let a = 0; a < t.length; a++) {\n\t\t\t\tconst i = e(r, t[a]);\n\t\t\t\ti < n && (n = i, o = a);\n\t\t\t}\n\t\t\treturn o;\n\t\t}\n\t\tfunction U(t, r, e = w) {\n\t\t\tlet n = Infinity, o = -1;\n\t\t\tfor (let a = 0; a < t.length; a++) {\n\t\t\t\tconst i = e(r, t[a]);\n\t\t\t\ti < n && (n = i, o = a);\n\t\t\t}\n\t\t\treturn [o, n];\n\t\t}\n\t\tfunction C(t, r, e = w) {\n\t\t\treturn t[k(t, r, e)];\n\t\t}\n\t\tfunction I(t = {}) {\n\t\t\tconst { initialCapacity: r = 4096, auto: o = !0 } = t, i = n(r), l = /* @__PURE__ */ new Uint8Array(256), c = /* @__PURE__ */ new Int32Array(5003), f = /* @__PURE__ */ new Int32Array(5003);\n\t\t\tlet s = !1;\n\t\t\treturn {\n\t\t\t\treset() {\n\t\t\t\t\ti.reset(), s = !1;\n\t\t\t\t},\n\t\t\t\tfinish() {\n\t\t\t\t\ti.writeByte(e.trailer);\n\t\t\t\t},\n\t\t\t\tbytes: () => i.bytes(),\n\t\t\t\tbytesView: () => i.bytesView(),\n\t\t\t\tget buffer() {\n\t\t\t\t\treturn i.buffer;\n\t\t\t\t},\n\t\t\t\tget stream() {\n\t\t\t\t\treturn i;\n\t\t\t\t},\n\t\t\t\twriteHeader: u,\n\t\t\t\twriteFrame(t, r, e, n = {}) {\n\t\t\t\t\tconst { transparent: p = !1, transparentIndex: y = 0, delay: h = 0, palette: w = null, repeat: d = 0, colorDepth: A = 8, dispose: b = -1 } = n;\n\t\t\t\t\tlet M = !1;\n\t\t\t\t\tif (o ? s || (M = !0, u(), s = !0) : M = Boolean(n.first), r = Math.max(0, Math.floor(r)), e = Math.max(0, Math.floor(e)), M) {\n\t\t\t\t\t\tif (!w) throw new Error("First frame must include a { palette } option");\n\t\t\t\t\t\t(function(t, r, e, n, o = 8) {\n\t\t\t\t\t\t\tconst a = o - 1 << 4 | 128 | E(n.length) - 1;\n\t\t\t\t\t\t\tz(t, r), z(t, e), t.writeBytes([\n\t\t\t\t\t\t\t\ta,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0\n\t\t\t\t\t\t\t]);\n\t\t\t\t\t\t})(i, r, e, w, A), F(i, w), d >= 0 && function(t, r) {\n\t\t\t\t\t\t\tt.writeByte(33), t.writeByte(255), t.writeByte(11), B(t, "NETSCAPE2.0"), t.writeByte(3), t.writeByte(1), z(t, r), t.writeByte(0);\n\t\t\t\t\t\t}(i, d);\n\t\t\t\t\t}\n\t\t\t\t\tconst g = Math.round(h / 10);\n\t\t\t\t\t(function(t, r, e, n, o) {\n\t\t\t\t\t\tvar a, i;\n\t\t\t\t\t\tt.writeByte(33), t.writeByte(249), t.writeByte(4), o < 0 && (o = 0, n = !1), n ? (a = 1, i = 2) : (a = 0, i = 0), r >= 0 && (i = 7 & r), i <<= 2, t.writeByte(0 | i | a), z(t, e), t.writeByte(o || 0), t.writeByte(0);\n\t\t\t\t\t})(i, b, g, p, y);\n\t\t\t\t\tconst v = Boolean(w) && !M;\n\t\t\t\t\t(function(t, r, e, n) {\n\t\t\t\t\t\tif (t.writeByte(44), z(t, 0), z(t, 0), z(t, r), z(t, e), n) {\n\t\t\t\t\t\t\tconst r = E(n.length) - 1;\n\t\t\t\t\t\t\tt.writeByte(128 | r);\n\t\t\t\t\t\t} else t.writeByte(0);\n\t\t\t\t\t})(i, r, e, v ? w : null), v && F(i, w), function(t, r, e, n, o = 8, i, l, c) {\n\t\t\t\t\t\ta(e, n, r, o, t, i, l, c);\n\t\t\t\t\t}(i, t, r, e, A, l, c, f);\n\t\t\t\t}\n\t\t\t};\n\t\t\tfunction u() {\n\t\t\t\tB(i, "GIF89a");\n\t\t\t}\n\t\t}\n\t\tfunction F(t, r) {\n\t\t\tconst e = 1 << E(r.length);\n\t\t\tfor (let n = 0; n < e; n++) {\n\t\t\t\tlet e = [\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\t0\n\t\t\t\t];\n\t\t\t\tn < r.length && (e = r[n]), t.writeByte(e[0]), t.writeByte(e[1]), t.writeByte(e[2]);\n\t\t\t}\n\t\t}\n\t\tfunction z(t, r) {\n\t\t\tt.writeByte(255 & r), t.writeByte(r >> 8 & 255);\n\t\t}\n\t\tfunction B(t, r) {\n\t\t\tfor (var e = 0; e < r.length; e++) t.writeByte(r.charCodeAt(e));\n\t\t}\n\t\tfunction E(t) {\n\t\t\treturn Math.max(Math.ceil(Math.log2(t)), 1);\n\t\t}\n\t\tvar x = I;\n\t})();\n\tconst e = (0, r.GIFEncoder)();\n\tlet n = 1, o = 1, a = 16, i = 0;\n\tconst l = self;\n\tl.addEventListener("message", (t) => {\n\t\tconst c = t.data;\n\t\ttry {\n\t\t\tif ("init" === c.type) return n = c.width ?? n, o = c.height ?? o, a = c.delay ?? a, i = c.repeat ?? i, void l.postMessage({\n\t\t\t\tid: c.id,\n\t\t\t\ttype: "ready"\n\t\t\t});\n\t\t\tif ("frame" === c.type && c.buffer) {\n\t\t\t\tconst t = new Uint8ClampedArray(c.buffer), f = (0, r.quantize)(t, 256, {}), s = (0, r.applyPalette)(t, f);\n\t\t\t\te.writeFrame(s, n, o, {\n\t\t\t\t\tpalette: f,\n\t\t\t\t\tdelay: a,\n\t\t\t\t\trepeat: 0 === c.frameIndex ? i : -1\n\t\t\t\t}), l.postMessage({\n\t\t\t\t\tid: c.id,\n\t\t\t\t\ttype: "frame-complete"\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ("finish" === c.type) {\n\t\t\t\te.finish();\n\t\t\t\tconst t = e.bytes(), r = t.buffer.slice(t.byteOffset, t.byteOffset + t.byteLength);\n\t\t\t\tl.postMessage({\n\t\t\t\t\tid: c.id,\n\t\t\t\t\ttype: "complete",\n\t\t\t\t\tbuffer: r\n\t\t\t\t}, [r]);\n\t\t\t}\n\t\t} catch (f) {\n\t\t\tl.postMessage({\n\t\t\t\tid: c.id,\n\t\t\t\ttype: "error",\n\t\t\t\tmessage: f instanceof Error ? f.message : "GIF worker failed"\n\t\t\t});\n\t\t}\n\t});\n})();\n',M="undefined"!=typeof self&&self.Blob&&new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);",T],{type:"text/javascript;charset=utf-8"});function _(t){let e;try{if(e=M&&(self.URL||self.webkitURL).createObjectURL(M),!e)throw"";const i=new Worker(e,{name:t?.name});return i.addEventListener("error",()=>{(self.URL||self.webkitURL).revokeObjectURL(e)}),i}catch(i){return new Worker("data:text/javascript;charset=utf-8,"+encodeURIComponent(T),{name:t?.name})}}var C=class{W;q=new Map;X;Y=0;J=!1;constructor(t,e,i,r,n){this.W=new _,this.W.addEventListener("message",this.K),this.W.addEventListener("error",this.Z),n?.addEventListener("abort",this.dispose,{once:!0}),this.X=this.tt({type:"init",width:t,height:e,delay:Math.round(1e3/i),repeat:r})}async encodeFrame(t,e){await this.X,await this.tt({type:"frame",buffer:t,frameIndex:e},[t])}async finish(){await this.X;const t=await this.tt({type:"finish"});if(!t.buffer)throw new Error("GIF worker returned no encoded output.");return t.buffer}dispose=()=>{if(!this.J){this.J=!0,this.W.terminate();for(const t of this.q.values())t.reject(new DOMException("GIF export was cancelled.","AbortError"));this.q.clear()}};tt(t,e=[]){if(this.J)return Promise.reject(new DOMException("GIF export was cancelled.","AbortError"));const i=++this.Y;return new Promise((r,n)=>{this.q.set(i,{resolve:r,reject:n}),this.W.postMessage({...t,id:i},e)})}K=t=>{const e=t.data,i=this.q.get(e.id);i&&(this.q.delete(e.id),"error"!==e.type?i.resolve(e):i.reject(new Error(e.message??"GIF worker failed")))};Z=t=>{const e=new Error(t.message||"GIF worker failed");for(const i of this.q.values())i.reject(e);this.q.clear()}},A=v(),S=class{C;A;constructor(t,e){this.C=t,this.A=e}async $saveGIF(t={}){const e=await this.$generateGIFBlob(t);(new n).$downloadFile(e,t.filename)}async $generateGIFBlob(t={}){const e=this.T(t),i=this.C.canvas,r=Math.max(1,Math.round(i.width*e.scale)),n=Math.max(1,Math.round(i.height*e.scale)),o=new k(this.C,this.A,r,n),s=o.canvas.getContext("2d",{willReadFrequently:!0});if(!s)throw new Error("GIF export requires a 2D canvas context.");const a="undefined"==typeof Worker?(0,A.GIFEncoder)():null,h="undefined"==typeof Worker?null:new C(r,n,e.frameRate,e.repeat,e.signal);try{let i;if(this.j(e.signal),await o.$render({frameCount:e.frameCount,frameRate:e.frameRate,signal:e.signal,prepareFrame:e.prepareFrame,onFrame:async({frameIndex:i,canvas:r})=>{this.j(e.signal);const n=s.getImageData(0,0,r.width,r.height);if(h)await h.encodeFrame(n.data.buffer,i);else if(a){const t=n.data,o=(0,A.quantize)(t,256,{}),s=(0,A.applyPalette)(t,o);a.writeFrame(s,r.width,r.height,{palette:o,delay:Math.round(1e3/e.frameRate),repeat:0===i?e.repeat:-1})}t.onProgress?.({state:"encoding",frameIndex:i+1,totalFrames:e.frameCount}),(i+1)%2==0&&await this.et(e.signal)}}),this.j(e.signal),h)i=await h.finish();else{if(!a)throw new Error("No GIF encoder is available.");{a.finish();const t=a.bytes();i=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}}return t.onProgress?.({state:"completed",totalFrames:e.frameCount}),new Blob([i],{type:"image/gif"})}catch(c){throw t.onProgress?.({state:"error",message:c instanceof Error?c.message:"GIF export failed"}),c}finally{h?.dispose()}}T(t){return{filename:t.filename,frameCount:Math.max(1,Math.abs(Math.round(t.frameCount??300))),frameRate:Math.max(1,Math.abs(t.frameRate??60)),scale:Math.max(Number.EPSILON,Math.abs(t.scale??1)),repeat:Math.max(-1,Math.round(t.repeat??0)),signal:t.signal,prepareFrame:t.prepareFrame}}j(t){if(t?.aborted)throw new DOMException("GIF export was cancelled.","AbortError")}et(t){return new Promise((e,i)=>{t?.aborted?i(new DOMException("GIF export was cancelled.","AbortError")):setTimeout(e,0)})}};function B(t){if(!t)throw new Error("Assertion failed.")}var P,I=t=>{const e=(t%360+360)%360;if(0===e||90===e||180===e||270===e)return e;throw new Error(`Invalid rotation ${t}.`)},F=t=>t&&t[t.length-1],V=t=>t>=0&&t<2**32,$=t=>{let e=0;for(;0===t.readBits(1)&&e<32;)e++;if(e>=32)throw new Error("Invalid exponential-Golomb code.");return(1<<e)-1+t.readBits(e)},U=t=>{const e=$(t);return 1&e?e+1>>1:-(e>>1)},N=t=>t.constructor===Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),R=t=>t.constructor===DataView?t:ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t),D=new TextEncoder,O={bt709:1,bt470bg:5,smpte170m:6,bt2020:9,smpte432:12},z={bt709:1,smpte170m:6,linear:8,"iec61966-2-1":13,pq:16,hlg:18},j={rgb:0,bt709:1,bt470bg:5,smpte170m:6,"bt2020-ncl":9},G=t=>!!(t&&t.primaries&&t.transfer&&t.matrix&&void 0!==t.fullRange),H=t=>t instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&t instanceof SharedArrayBuffer||ArrayBuffer.isView(t),L=class{constructor(){this.currentPromise=Promise.resolve(),this.pending=0}async acquire(){let t;const e=new Promise(e=>{let i=!1;t=()=>{i||(e(),this.pending--,i=!0)}}),i=this.currentPromise;return this.currentPromise=e,this.pending++,await i,t}},W=(t,e,i)=>{let r=0,n=t.length-1,o=-1;for(;r<=n;){const s=r+(n-r+1)/2|0;i(t[s])<=e?(o=s,r=s+1):n=s-1}return o},q=()=>{let t,e;return{promise:new Promise((i,r)=>{t=i,e=r}),resolve:t,reject:e}},X=t=>{throw new Error(`Unexpected value: ${t}`)},Y=(t,e,i)=>{const r=t.getUint8(e),n=t.getUint8(e+1),o=t.getUint8(e+2);return i?r|n<<8|o<<16:r<<16|n<<8|o},J=(t,e)=>Math.round(t/e)*e,Q=(t,e)=>Math.round(t*e)/e,K=(t,e)=>Math.floor(t*e)/e,Z=/^[a-z]{3}$/,tt=1e6*(1+Number.EPSILON),et=class{constructor(){this.currentPromise=Promise.resolve()}call(t){return this.currentPromise=this.currentPromise.then(t)}},it=null,rt=()=>null!==it?it:it="undefined"!=typeof navigator&&navigator.userAgent?.includes("Firefox"),nt=null,ot=()=>null!==nt?nt:nt=!("undefined"==typeof navigator||!navigator.vendor?.includes("Google Inc")&&!/Chrome/.test(navigator.userAgent)),st=null,at=()=>{if(null!==st)return st;if("undefined"==typeof navigator)return null;const t=/\bChrome\/(\d+)/.exec(navigator.userAgent);return t?st=Number(t[1]):null},ht=function*(t){for(const e in t){const i=t[e];void 0!==i&&(yield{key:e,value:i})}},ct=t=>{switch(t.toLowerCase()){case"image/jpeg":case"image/jpg":return".jpg";case"image/png":return".png";case"image/gif":return".gif";case"image/webp":return".webp";case"image/bmp":return".bmp";case"image/svg+xml":return".svg";case"image/tiff":return".tiff";case"image/avif":return".avif";case"image/x-icon":case"image/vnd.microsoft.icon":return".ico";default:return null}},lt=(t,e)=>{if(t.length!==e.length)return!1;for(let i=0;i<t.length;i++)if(t[i]!==e[i])return!1;return!0},dt=t=>{B(Number.isInteger(t.num)),B(Number.isInteger(t.den)),B(0!==t.den);let e=Math.abs(t.num),i=Math.abs(t.den);for(;0!==i;){const t=e%i;e=i,i=t}const r=e||1;return{num:t.num/r,den:t.den/r}},ut=(t,e)=>{if("object"!=typeof t||!t)throw new TypeError(`${e} must be an object.`);if(!Number.isInteger(t.left)||t.left<0)throw new TypeError(`${e}.left must be a non-negative integer.`);if(!Number.isInteger(t.top)||t.top<0)throw new TypeError(`${e}.top must be a non-negative integer.`);if(!Number.isInteger(t.width)||t.width<0)throw new TypeError(`${e}.width must be a non-negative integer.`);if(!Number.isInteger(t.height)||t.height<0)throw new TypeError(`${e}.height must be a non-negative integer.`)},ft=t=>Array.isArray(t)?t:[t],pt=class{constructor(){this.it=new Map}on(t,e,i){this.it.has(t)||this.it.set(t,new Set);const r={fn:e,once:i?.once??!1};return this.it.get(t).add(r),()=>{this.it.get(t)?.delete(r)}}rt(...t){const[e,i]=t,r=this.it.get(e);if(r)for(const o of r){try{o.fn(i)}catch(n){console.error(n)}o.once&&r.delete(o)}}},mt=t=>null!==t&&"object"==typeof t&&Object.getPrototypeOf(t)===Object.prototype&&Object.values(t).every(t=>"string"==typeof t);!function(t){t[t.Silent=0]="Silent",t[t.Errors=1]="Errors",t[t.Warnings=2]="Warnings",t[t.Info=3]="Info"}(P||(P={}));var wt=class t{constructor(){}static get level(){return t.nt}static set level(e){if(e!==P.Silent&&e!==P.Errors&&e!==P.Warnings&&e!==P.Info)throw new TypeError("Invalid log level. Use one of the values of the LogLevel enum.");t.nt=e}static get ot(){return t.st??=new pt}static on(e,i,r){return t.ot.on(e,i,r)}static ht(...e){t.ot.rt("error",e),t.nt>=P.Errors&&console.error(...e)}static ct(...e){t.ot.rt("warn",e),t.nt>=P.Warnings&&console.warn(...e)}static lt(...e){t.ot.rt("info",e),t.nt>=P.Info&&console.info(...e)}};wt.nt=P.Info,wt.st=null;var bt,yt,vt=class{constructor(t,e){if(this.data=t,this.mimeType=e,!(t instanceof Uint8Array))throw new TypeError("data must be a Uint8Array.");if("string"!=typeof e)throw new TypeError("mimeType must be a string.")}},gt=class{constructor(t,e,i,r){if(this.data=t,this.mimeType=e,this.name=i,this.description=r,!(t instanceof Uint8Array))throw new TypeError("data must be a Uint8Array.");if(void 0!==e&&"string"!=typeof e)throw new TypeError("mimeType, when provided, must be a string.");if(void 0!==i&&"string"!=typeof i)throw new TypeError("name, when provided, must be a string.");if(void 0!==r&&"string"!=typeof r)throw new TypeError("description, when provided, must be a string.")}},xt=class t{constructor(t){this.bytes=t,this.pos=0}seekToByte(t){this.pos=8*t}readBit(){const t=Math.floor(this.pos/8),e=this.bytes[t]??0,i=7-(7&this.pos),r=(e&1<<i)>>i;return this.pos++,r}readBits(t){if(1===t)return this.readBit();let e=0;for(let i=0;i<t;i++)e<<=1,e|=this.readBit();return e}writeBits(t,e){const i=this.pos+t;for(let r=this.pos;r<i;r++){const t=Math.floor(r/8);let n=this.bytes[t];const o=7-(7&r);n&=~(1<<o),n|=(e&1<<i-r-1)>>i-r-1<<o,this.bytes[t]=n}this.pos=i}readAlignedByte(){if(this.pos%8!=0)throw new Error("Bitstream is not byte-aligned.");const t=this.pos/8,e=this.bytes[t]??0;return this.pos+=8,e}skipBits(t){this.pos+=t}getBitsLeft(){return 8*this.bytes.length-this.pos}clone(){const e=new t(this.bytes);return e.pos=this.pos,e}},Et=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],kt=[-1,1,2,3,4,5,6,8],Tt=t=>{let e=Et.indexOf(t.sampleRate),i=null;-1===e&&(e=15,i=t.sampleRate);const r=kt.indexOf(t.numberOfChannels);if(-1===r)throw new TypeError(`Unsupported number of channels: ${t.numberOfChannels}`);let n=13;t.objectType>=32&&(n+=6),15===e&&(n+=24);const o=Math.ceil(n/8),s=new Uint8Array(o),a=new xt(s);return t.objectType<32?a.writeBits(5,t.objectType):(a.writeBits(5,31),a.writeBits(6,t.objectType-32)),a.writeBits(4,e),15===e&&a.writeBits(24,i),a.writeBits(4,r),s},Mt=["avc","hevc","vp9","av1","vp8","prores"],_t=["pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be","pcm-u8","pcm-s8","ulaw","alaw"],Ct=["aac","opus","mp3","vorbis","flac","ac3","eac3"],At=[...Ct,..._t],St=["webvtt"],Bt=[{maxMacroblocks:99,maxBitrate:64e3,maxDpbMbs:396,level:10},{maxMacroblocks:396,maxBitrate:192e3,maxDpbMbs:900,level:11},{maxMacroblocks:396,maxBitrate:384e3,maxDpbMbs:2376,level:12},{maxMacroblocks:396,maxBitrate:768e3,maxDpbMbs:2376,level:13},{maxMacroblocks:396,maxBitrate:2e6,maxDpbMbs:2376,level:20},{maxMacroblocks:792,maxBitrate:4e6,maxDpbMbs:4752,level:21},{maxMacroblocks:1620,maxBitrate:4e6,maxDpbMbs:8100,level:22},{maxMacroblocks:1620,maxBitrate:1e7,maxDpbMbs:8100,level:30},{maxMacroblocks:3600,maxBitrate:14e6,maxDpbMbs:18e3,level:31},{maxMacroblocks:5120,maxBitrate:2e7,maxDpbMbs:20480,level:32},{maxMacroblocks:8192,maxBitrate:2e7,maxDpbMbs:32768,level:40},{maxMacroblocks:8192,maxBitrate:5e7,maxDpbMbs:32768,level:41},{maxMacroblocks:8704,maxBitrate:5e7,maxDpbMbs:34816,level:42},{maxMacroblocks:22080,maxBitrate:135e6,maxDpbMbs:110400,level:50},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:51},{maxMacroblocks:36864,maxBitrate:24e7,maxDpbMbs:184320,level:52},{maxMacroblocks:139264,maxBitrate:24e7,maxDpbMbs:696320,level:60},{maxMacroblocks:139264,maxBitrate:48e7,maxDpbMbs:696320,level:61},{maxMacroblocks:139264,maxBitrate:8e8,maxDpbMbs:696320,level:62}],Pt=[{maxPictureSize:36864,maxBitrate:128e3,tier:"L",level:30},{maxPictureSize:122880,maxBitrate:15e5,tier:"L",level:60},{maxPictureSize:245760,maxBitrate:3e6,tier:"L",level:63},{maxPictureSize:552960,maxBitrate:6e6,tier:"L",level:90},{maxPictureSize:983040,maxBitrate:1e7,tier:"L",level:93},{maxPictureSize:2228224,maxBitrate:12e6,tier:"L",level:120},{maxPictureSize:2228224,maxBitrate:3e7,tier:"H",level:120},{maxPictureSize:2228224,maxBitrate:2e7,tier:"L",level:123},{maxPictureSize:2228224,maxBitrate:5e7,tier:"H",level:123},{maxPictureSize:8912896,maxBitrate:25e6,tier:"L",level:150},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:150},{maxPictureSize:8912896,maxBitrate:4e7,tier:"L",level:153},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:153},{maxPictureSize:8912896,maxBitrate:6e7,tier:"L",level:156},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:156},{maxPictureSize:35651584,maxBitrate:6e7,tier:"L",level:180},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:180},{maxPictureSize:35651584,maxBitrate:12e7,tier:"L",level:183},{maxPictureSize:35651584,maxBitrate:48e7,tier:"H",level:183},{maxPictureSize:35651584,maxBitrate:24e7,tier:"L",level:186},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:186}],It=[{maxPictureSize:36864,maxBitrate:2e5,level:10},{maxPictureSize:73728,maxBitrate:8e5,level:11},{maxPictureSize:122880,maxBitrate:18e5,level:20},{maxPictureSize:245760,maxBitrate:36e5,level:21},{maxPictureSize:552960,maxBitrate:72e5,level:30},{maxPictureSize:983040,maxBitrate:12e6,level:31},{maxPictureSize:2228224,maxBitrate:18e6,level:40},{maxPictureSize:2228224,maxBitrate:3e7,level:41},{maxPictureSize:8912896,maxBitrate:6e7,level:50},{maxPictureSize:8912896,maxBitrate:12e7,level:51},{maxPictureSize:8912896,maxBitrate:18e7,level:52},{maxPictureSize:35651584,maxBitrate:18e7,level:60},{maxPictureSize:35651584,maxBitrate:24e7,level:61},{maxPictureSize:35651584,maxBitrate:48e7,level:62}],Ft=[{maxPictureSize:147456,maxBitrate:15e5,tier:"M",level:0},{maxPictureSize:278784,maxBitrate:3e6,tier:"M",level:1},{maxPictureSize:665856,maxBitrate:6e6,tier:"M",level:4},{maxPictureSize:1065024,maxBitrate:1e7,tier:"M",level:5},{maxPictureSize:2359296,maxBitrate:12e6,tier:"M",level:8},{maxPictureSize:2359296,maxBitrate:3e7,tier:"H",level:8},{maxPictureSize:2359296,maxBitrate:2e7,tier:"M",level:9},{maxPictureSize:2359296,maxBitrate:5e7,tier:"H",level:9},{maxPictureSize:8912896,maxBitrate:3e7,tier:"M",level:12},{maxPictureSize:8912896,maxBitrate:1e8,tier:"H",level:12},{maxPictureSize:8912896,maxBitrate:4e7,tier:"M",level:13},{maxPictureSize:8912896,maxBitrate:16e7,tier:"H",level:13},{maxPictureSize:8912896,maxBitrate:6e7,tier:"M",level:14},{maxPictureSize:8912896,maxBitrate:24e7,tier:"H",level:14},{maxPictureSize:35651584,maxBitrate:6e7,tier:"M",level:15},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:15},{maxPictureSize:35651584,maxBitrate:6e7,tier:"M",level:16},{maxPictureSize:35651584,maxBitrate:24e7,tier:"H",level:16},{maxPictureSize:35651584,maxBitrate:1e8,tier:"M",level:17},{maxPictureSize:35651584,maxBitrate:48e7,tier:"H",level:17},{maxPictureSize:35651584,maxBitrate:16e7,tier:"M",level:18},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:18},{maxPictureSize:35651584,maxBitrate:16e7,tier:"M",level:19},{maxPictureSize:35651584,maxBitrate:8e8,tier:"H",level:19}],Vt=["ap4x","ap4h","apch","apcn","apcs","apco"],$t=[{fourCc:"apco",bitrate:45e6,alpha:!1},{fourCc:"apcs",bitrate:102e6,alpha:!1},{fourCc:"apcn",bitrate:147e6,alpha:!1},{fourCc:"apch",bitrate:22e7,alpha:!1},{fourCc:"ap4h",bitrate:33e7,alpha:!0},{fourCc:"ap4x",bitrate:5e8,alpha:!0}],Ut=(t,e,i,r,n)=>{if("avc"===t){const t=100,n=Math.ceil(e/16)*Math.ceil(i/16),o=Bt.find(t=>n<=t.maxMacroblocks&&r<=t.maxBitrate)??F(Bt),s=o?o.level:0;return`avc1.${t.toString(16).padStart(2,"0")}00${s.toString(16).padStart(2,"0")}`}if("hevc"===t){const t="",n=1,o="6",s=e*i,a=Pt.find(t=>s<=t.maxPictureSize&&r<=t.maxBitrate)??F(Pt);return`hev1.${t}${n}.${o}.${a.tier}${a.level}.B0`}if("vp8"===t)return"vp8";if("vp9"===t){const t=e*i;return`vp09.00.${(It.find(e=>t<=e.maxPictureSize&&r<=e.maxBitrate)??F(It)).level.toString().padStart(2,"0")}.08`}if("av1"===t){const t=0,n=e*i,o=Ft.find(t=>n<=t.maxPictureSize&&r<=t.maxBitrate)??F(Ft);return`av01.${t}.${o.level.toString().padStart(2,"0")}${o.tier}.08`}if("prores"===t){const t=Math.pow(e*i/2073600,.95),o=$t.filter(t=>t.alpha===n);let s=o[0].fourCc,a=1/0;for(const{fourCc:e,bitrate:i}of o){const n=Math.abs(i*t-r);n<a&&(a=n,s=e)}return s}throw X(t),new TypeError(`Unhandled codec '${String(t)}'.`)},Nt=t=>{const e=t.split("."),i=Number(e[1]),r=e[2];return[129,(i<<5)+Number(r.slice(0,-1)),(("H"===r.slice(-1)?1:0)<<7)+((8===Number(e[3])?0:1)<<6)+0+((e[4]?Number(e[4]):0)<<4)+((e[5]?Number(e[5][0]):1)<<3)+((e[5]?Number(e[5][1]):1)<<2)+(e[5]?Number(e[5][2]):0),0]},Rt=/^pcm-([usf])(\d+)(be)?$/,Dt=t=>{if(B(_t.includes(t)),"ulaw"===t)return{dataType:"ulaw",sampleSize:1,littleEndian:!0,silentValue:255};if("alaw"===t)return{dataType:"alaw",sampleSize:1,littleEndian:!0,silentValue:213};const e=Rt.exec(t);let i;return B(e),i="u"===e[1]?"unsigned":"s"===e[1]?"signed":"float",{dataType:i,sampleSize:Number(e[2])/8,littleEndian:"be"!==e[3],silentValue:"pcm-u8"===t?128:0}},Ot=["avc1","avc3","hev1","hvc1","vp8","vp09","av01",...Vt],zt=/^(avc1|avc3)\.[0-9a-fA-F]{6}$/,jt=/^(hev1|hvc1)\.(?:[ABC]?\d+)\.[0-9a-fA-F]{1,8}\.[LH]\d+(?:\.[0-9a-fA-F]{1,2}){0,6}$/,Gt=/^vp09(?:\.\d{2}){3}(?:(?:\.\d{2}){5})?$/,Ht=/^av01\.\d\.\d{2}[MH]\.\d{2}(?:\.\d\.\d{3}\.\d{2}\.\d{2}\.\d{2}\.\d)?$/,Lt=t=>{if(!t)throw new TypeError("Video chunk metadata must be provided.");if("object"!=typeof t)throw new TypeError("Video chunk metadata must be an object.");if(!t.decoderConfig)throw new TypeError("Video chunk metadata must include a decoder configuration.");if("object"!=typeof t.decoderConfig)throw new TypeError("Video chunk metadata decoder configuration must be an object.");if("string"!=typeof t.decoderConfig.codec)throw new TypeError("Video chunk metadata decoder configuration must specify a codec string.");if(!Ot.some(e=>t.decoderConfig.codec.startsWith(e)))throw new TypeError("Video chunk metadata decoder configuration codec string must be a valid video codec string as specified in the Mediabunny Codec Registry.");if(!Number.isInteger(t.decoderConfig.codedWidth)||t.decoderConfig.codedWidth<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedWidth (positive integer).");if(!Number.isInteger(t.decoderConfig.codedHeight)||t.decoderConfig.codedHeight<=0)throw new TypeError("Video chunk metadata decoder configuration must specify a valid codedHeight (positive integer).");if(void 0!==t.decoderConfig.displayAspectWidth&&(!Number.isInteger(t.decoderConfig.displayAspectWidth)||t.decoderConfig.displayAspectWidth<=0))throw new TypeError("Video chunk metadata decoder configuration displayAspectWidth, when defined, must be a positive integer.");if(void 0!==t.decoderConfig.displayAspectHeight&&(!Number.isInteger(t.decoderConfig.displayAspectHeight)||t.decoderConfig.displayAspectHeight<=0))throw new TypeError("Video chunk metadata decoder configuration displayAspectHeight, when defined, must be a positive integer.");if(void 0!==t.decoderConfig.displayAspectWidth!=(void 0!==t.decoderConfig.displayAspectHeight))throw new TypeError("Video chunk metadata decoder configuration must specify both displayAspectWidth and displayAspectHeight, or neither.");if(void 0!==t.decoderConfig.description&&!H(t.decoderConfig.description))throw new TypeError("Video chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(void 0!==t.decoderConfig.colorSpace){const{colorSpace:e}=t.decoderConfig;if("object"!=typeof e)throw new TypeError("Video chunk metadata decoder configuration colorSpace, when provided, must be an object.");const i=Object.keys(O);if(null!=e.primaries&&!i.includes(e.primaries))throw new TypeError(`Video chunk metadata decoder configuration colorSpace primaries, when defined, must be one of ${i.join(", ")}.`);const r=Object.keys(z);if(null!=e.transfer&&!r.includes(e.transfer))throw new TypeError(`Video chunk metadata decoder configuration colorSpace transfer, when defined, must be one of ${r.join(", ")}.`);const n=Object.keys(j);if(null!=e.matrix&&!n.includes(e.matrix))throw new TypeError(`Video chunk metadata decoder configuration colorSpace matrix, when defined, must be one of ${n.join(", ")}.`);if(null!=e.fullRange&&"boolean"!=typeof e.fullRange)throw new TypeError("Video chunk metadata decoder configuration colorSpace fullRange, when defined, must be a boolean.")}if(t.decoderConfig.codec.startsWith("avc1")||t.decoderConfig.codec.startsWith("avc3")){if(!zt.test(t.decoderConfig.codec))throw new TypeError("Video chunk metadata decoder configuration codec string for AVC must be a valid AVC codec string as specified in Section 3.4 of RFC 6381.")}else if(t.decoderConfig.codec.startsWith("hev1")||t.decoderConfig.codec.startsWith("hvc1")){if(!jt.test(t.decoderConfig.codec))throw new TypeError("Video chunk metadata decoder configuration codec string for HEVC must be a valid HEVC codec string as specified in Section E.3 of ISO 14496-15.")}else if(t.decoderConfig.codec.startsWith("vp8")){if("vp8"!==t.decoderConfig.codec)throw new TypeError('Video chunk metadata decoder configuration codec string for VP8 must be "vp8".')}else if(t.decoderConfig.codec.startsWith("vp09")){if(!Gt.test(t.decoderConfig.codec))throw new TypeError('Video chunk metadata decoder configuration codec string for VP9 must be a valid VP9 codec string as specified in Section "Codecs Parameter String" of https://www.webmproject.org/vp9/mp4/.')}else if(t.decoderConfig.codec.startsWith("av01")){if(!Ht.test(t.decoderConfig.codec))throw new TypeError('Video chunk metadata decoder configuration codec string for AV1 must be a valid AV1 codec string as specified in Section "Codecs Parameter String" of https://aomediacodec.github.io/av1-isobmff/.')}else if(Vt.some(e=>t.decoderConfig.codec.startsWith(e))&&!Vt.some(e=>t.decoderConfig.codec===e))throw new TypeError(`Video chunk metadata decoder configuration codec string for ProRes must be one of the valid ProRes four-character codes: ${Vt.join(", ")}.`)},Wt=["mp4a","mp3","opus","vorbis","flac","ulaw","alaw","pcm","ac-3","ec-3"],qt=t=>{if(!t)throw new TypeError("Audio chunk metadata must be provided.");if("object"!=typeof t)throw new TypeError("Audio chunk metadata must be an object.");if(!t.decoderConfig)throw new TypeError("Audio chunk metadata must include a decoder configuration.");if("object"!=typeof t.decoderConfig)throw new TypeError("Audio chunk metadata decoder configuration must be an object.");if("string"!=typeof t.decoderConfig.codec)throw new TypeError("Audio chunk metadata decoder configuration must specify a codec string.");if(!Wt.some(e=>t.decoderConfig.codec.startsWith(e)))throw new TypeError("Audio chunk metadata decoder configuration codec string must be a valid audio codec string as specified in the Mediabunny Codec Registry.");if(!Number.isInteger(t.decoderConfig.sampleRate)||t.decoderConfig.sampleRate<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid sampleRate (positive integer).");if(!Number.isInteger(t.decoderConfig.numberOfChannels)||t.decoderConfig.numberOfChannels<=0)throw new TypeError("Audio chunk metadata decoder configuration must specify a valid numberOfChannels (positive integer).");if(void 0!==t.decoderConfig.description&&!H(t.decoderConfig.description))throw new TypeError("Audio chunk metadata decoder configuration description, when defined, must be an ArrayBuffer or an ArrayBuffer view.");if(t.decoderConfig.codec.startsWith("mp4a")&&"mp4a.69"!==t.decoderConfig.codec&&"mp4a.6B"!==t.decoderConfig.codec&&"mp4a.6b"!==t.decoderConfig.codec){if(!["mp4a.40.2","mp4a.40.02","mp4a.40.5","mp4a.40.05","mp4a.40.29","mp4a.67"].includes(t.decoderConfig.codec))throw new TypeError("Audio chunk metadata decoder configuration codec string for AAC must be a valid AAC codec string as specified in https://www.w3.org/TR/webcodecs-aac-codec-registration/.")}else if(t.decoderConfig.codec.startsWith("mp3")||t.decoderConfig.codec.startsWith("mp4a")){if("mp3"!==t.decoderConfig.codec&&"mp4a.69"!==t.decoderConfig.codec&&"mp4a.6B"!==t.decoderConfig.codec&&"mp4a.6b"!==t.decoderConfig.codec)throw new TypeError('Audio chunk metadata decoder configuration codec string for MP3 must be "mp3", "mp4a.69" or "mp4a.6B".')}else if(t.decoderConfig.codec.startsWith("opus")){if("opus"!==t.decoderConfig.codec)throw new TypeError('Audio chunk metadata decoder configuration codec string for Opus must be "opus".');if(t.decoderConfig.description&&t.decoderConfig.description.byteLength<18)throw new TypeError("Audio chunk metadata decoder configuration description, when specified, is expected to be an Identification Header as specified in Section 5.1 of RFC 7845.")}else if(t.decoderConfig.codec.startsWith("vorbis")){if("vorbis"!==t.decoderConfig.codec)throw new TypeError('Audio chunk metadata decoder configuration codec string for Vorbis must be "vorbis".');if(!t.decoderConfig.description)throw new TypeError("Audio chunk metadata decoder configuration for Vorbis must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-vorbis-codec-registration/.")}else if(t.decoderConfig.codec.startsWith("flac")){if("flac"!==t.decoderConfig.codec)throw new TypeError('Audio chunk metadata decoder configuration codec string for FLAC must be "flac".');if(!t.decoderConfig.description||t.decoderConfig.description.byteLength<42)throw new TypeError("Audio chunk metadata decoder configuration for FLAC must include a description, which is expected to adhere to the format described in https://www.w3.org/TR/webcodecs-flac-codec-registration/.")}else if(t.decoderConfig.codec.startsWith("ac-3")||t.decoderConfig.codec.startsWith("ac3")){if("ac-3"!==t.decoderConfig.codec)throw new TypeError('Audio chunk metadata decoder configuration codec string for AC-3 must be "ac-3".')}else if(t.decoderConfig.codec.startsWith("ec-3")||t.decoderConfig.codec.startsWith("eac3")){if("ec-3"!==t.decoderConfig.codec)throw new TypeError('Audio chunk metadata decoder configuration codec string for EC-3 must be "ec-3".')}else if((t.decoderConfig.codec.startsWith("pcm")||t.decoderConfig.codec.startsWith("ulaw")||t.decoderConfig.codec.startsWith("alaw"))&&!_t.includes(t.decoderConfig.codec))throw new TypeError(`Audio chunk metadata decoder configuration codec string for PCM must be one of the supported PCM codecs (${_t.join(", ")}).`)},Xt=t=>{if(!t)throw new TypeError("Subtitle metadata must be provided.");if("object"!=typeof t)throw new TypeError("Subtitle metadata must be an object.");if(!t.config)throw new TypeError("Subtitle metadata must include a config object.");if("object"!=typeof t.config)throw new TypeError("Subtitle metadata config must be an object.");if("string"!=typeof t.config.description)throw new TypeError("Subtitle metadata config description must be a string.")},Yt=[48e3,44100,32e3],Jt=[24e3,22050,16e3];!function(t){t[t.NON_IDR_SLICE=1]="NON_IDR_SLICE",t[t.SLICE_DPA=2]="SLICE_DPA",t[t.SLICE_DPB=3]="SLICE_DPB",t[t.SLICE_DPC=4]="SLICE_DPC",t[t.IDR=5]="IDR",t[t.SEI=6]="SEI",t[t.SPS=7]="SPS",t[t.PPS=8]="PPS",t[t.AUD=9]="AUD",t[t.SPS_EXT=13]="SPS_EXT"}(bt||(bt={})),function(t){t[t.RASL_N=8]="RASL_N",t[t.RASL_R=9]="RASL_R",t[t.BLA_W_LP=16]="BLA_W_LP",t[t.RSV_IRAP_VCL23=23]="RSV_IRAP_VCL23",t[t.VPS_NUT=32]="VPS_NUT",t[t.SPS_NUT=33]="SPS_NUT",t[t.PPS_NUT=34]="PPS_NUT",t[t.AUD_NUT=35]="AUD_NUT",t[t.PREFIX_SEI_NUT=39]="PREFIX_SEI_NUT",t[t.SUFFIX_SEI_NUT=40]="SUFFIX_SEI_NUT"}(yt||(yt={}));var Qt,Kt=function*(t){let e=0,i=-1;for(;e<t.length-2;){const r=t.indexOf(0,e);if(-1===r||r>=t.length-2)break;e=r;let n=0;e+3<t.length&&0===t[e+1]&&0===t[e+2]&&1===t[e+3]?n=4:0===t[e+1]&&1===t[e+2]&&(n=3),0!==n?(-1!==i&&e>i&&(yield{offset:i,length:e-i}),i=e+n,e=i):e++}-1!==i&&i<t.length&&(yield{offset:i,length:t.length-i})},Zt=function*(t,e){let i=0;const r=new DataView(t.buffer,t.byteOffset,t.byteLength);for(;i+e<=t.length;){let t;1===e?t=r.getUint8(i):2===e?t=r.getUint16(i,!1):3===e?t=Y(r,i,!1):(B(4===e),t=r.getUint32(i,!1)),i+=e,yield{offset:i,length:t},i+=t}},te=t=>31&t,ee=t=>{const e=[],i=t.length;for(let r=0;r<i;r++)r+2<i&&0===t[r]&&0===t[r+1]&&3===t[r+2]?(e.push(0,0),r+=2):e.push(t[r]);return new Uint8Array(e)},ie=(new Uint8Array([0,0,0,1]),{1:{num:1,den:1},2:{num:12,den:11},3:{num:10,den:11},4:{num:16,den:11},5:{num:40,den:33},6:{num:24,den:11},7:{num:20,den:11},8:{num:32,den:11},9:{num:80,den:33},10:{num:18,den:11},11:{num:15,den:11},12:{num:64,den:33},13:{num:160,den:99},14:{num:4,den:3},15:{num:3,den:2},16:{num:2,den:1}}),re=t=>{const e=$(t);t.skipBits(4),t.skipBits(4);for(let i=0;i<=e;i++)$(t),$(t),t.skipBits(1);t.skipBits(5),t.skipBits(5),t.skipBits(5),t.skipBits(5)},ne=t=>t>>1&63,oe=(t,e)=>{const i=t.readBits(2),r=t.readBits(1),n=t.readBits(5);let o=0;for(let l=0;l<32;l++)o=o<<1|t.readBits(1);const s=new Uint8Array(6);for(let l=0;l<6;l++)s[l]=t.readBits(8);const a=t.readBits(8),h=[],c=[];for(let l=0;l<e;l++)h.push(t.readBits(1)),c.push(t.readBits(1));if(e>0)for(let l=e;l<8;l++)t.skipBits(2);for(let l=0;l<e;l++)h[l]&&t.skipBits(88),c[l]&&t.skipBits(8);return{general_profile_space:i,general_tier_flag:r,general_profile_idc:n,general_profile_compatibility_flags:o,general_constraint_indicator_flags:s,general_level_idc:a}},se=t=>{for(let e=0;e<4;e++)for(let i=0;i<(3===e?2:6);i++)if(t.readBits(1)){const i=Math.min(64,1<<4+(e<<1));e>1&&U(t);for(let e=0;e<i;e++)U(t)}else $(t)},ae=(t,e)=>{const i=[];for(let r=0;r<e;r++)i[r]=he(t,r,e,i)},he=(t,e,i,r)=>{let n=0,o=0,s=0;if(0!==e&&(o=t.readBits(1)),o){s=e===i?e-($(t)+1):e-1,t.readBits(1),$(t);const o=r[s]??0;for(let e=0;e<=o;e++)t.readBits(1)||t.readBits(1);n=r[s]}else{const e=$(t),i=$(t);for(let r=0;r<e;r++)$(t),t.readBits(1);for(let r=0;r<i;r++)$(t),t.readBits(1);n=e+i}return n},ce=(t,e)=>{let i=2,r=2,n=2,o=0,s=0,a={num:1,den:1};if(t.readBits(1)){const e=t.readBits(8);if(255===e)a={num:t.readBits(16),den:t.readBits(16)};else{const t=ie[e];t&&(a=t)}}return t.readBits(1)&&t.readBits(1),t.readBits(1)&&(t.readBits(3),o=t.readBits(1),t.readBits(1)&&(i=t.readBits(8),r=t.readBits(8),n=t.readBits(8))),t.readBits(1)&&($(t),$(t)),t.readBits(1),t.readBits(1),t.readBits(1),t.readBits(1)&&($(t),$(t),$(t),$(t)),t.readBits(1)&&(t.readBits(32),t.readBits(32),t.readBits(1)&&$(t),t.readBits(1)&&le(t,!0,e)),t.readBits(1)&&(t.readBits(1),t.readBits(1),t.readBits(1),s=$(t),$(t),$(t),$(t),$(t)),{pixelAspectRatio:a,colourPrimaries:i,transferCharacteristics:r,matrixCoefficients:n,fullRangeFlag:o,minSpatialSegmentationIdc:s}},le=(t,e,i)=>{let r=!1,n=!1,o=!1;e&&(r=1===t.readBits(1),n=1===t.readBits(1),(r||n)&&(o=1===t.readBits(1),o&&(t.readBits(8),t.readBits(5),t.readBits(1),t.readBits(5)),t.readBits(4),t.readBits(4),o&&t.readBits(4),t.readBits(5),t.readBits(5),t.readBits(5)));for(let s=0;s<=i;s++){let e=!0;1===t.readBits(1)||(e=1===t.readBits(1));let i=!1;e?$(t):i=1===t.readBits(1);let s=1;i||(s=$(t)+1),r&&de(t,s,o),n&&de(t,s,o)}},de=(t,e,i)=>{for(let r=0;r<e;r++)$(t),$(t),i&&($(t),$(t)),t.readBits(1)};!function(t){t[t.audAllowed=0]="audAllowed",t[t.beforeFirstVcl=1]="beforeFirstVcl",t[t.afterFirstVcl=2]="afterFirstVcl",t[t.eoBitstreamAllowed=3]="eoBitstreamAllowed",t[t.noMoreDataAllowed=4]="noMoreDataAllowed"}(Qt||(Qt={}));var ue,fe=t=>{const e=R(t),i=e.getUint8(9),r=e.getUint16(10,!0),n=e.getUint32(12,!0),o=e.getInt16(16,!0),s=e.getUint8(18);let a=null;return s&&(a=t.subarray(19,21+i)),{outputChannelCount:i,preSkip:r,inputSampleRate:n,outputGain:o,channelMappingFamily:s,channelMappingTable:a}};!function(t){t[t.STREAMINFO=0]="STREAMINFO",t[t.VORBIS_COMMENT=4]="VORBIS_COMMENT",t[t.PICTURE=6]="PICTURE"}(ue||(ue={})),new Uint8Array([5,4,65,67,45,51]),new Uint8Array([5,4,69,65,67,51]);var pe,me=[1,2,3,6],we=new Uint8Array(0),be=class t{constructor(t,e,i,r,n=-1,o,s){if(this.data=t,this.type=e,this.timestamp=i,this.duration=r,this.sequenceNumber=n,t===we&&void 0===o)throw new Error("Internal error: byteLength must be explicitly provided when constructing metadata-only packets.");if(void 0===o&&(o=t.byteLength),!(t instanceof Uint8Array))throw new TypeError("data must be a Uint8Array.");if("key"!==e&&"delta"!==e)throw new TypeError('type must be either "key" or "delta".');if(!Number.isFinite(i))throw new TypeError("timestamp must be a number.");if(!Number.isFinite(r)||r<0)throw new TypeError("duration must be a non-negative number.");if(!Number.isFinite(n))throw new TypeError("sequenceNumber must be a number.");if(!Number.isInteger(o)||o<0)throw new TypeError("byteLength must be a non-negative integer.");if(void 0!==s&&("object"!=typeof s||!s))throw new TypeError("sideData, when provided, must be an object.");if(void 0!==s?.alpha&&!(s.alpha instanceof Uint8Array))throw new TypeError("sideData.alpha, when provided, must be a Uint8Array.");if(void 0!==s?.alphaByteLength&&(!Number.isInteger(s.alphaByteLength)||s.alphaByteLength<0))throw new TypeError("sideData.alphaByteLength, when provided, must be a non-negative integer.");this.byteLength=o,this.sideData=s??{},this.sideData.alpha&&void 0===this.sideData.alphaByteLength&&(this.sideData.alphaByteLength=this.sideData.alpha.byteLength)}get isMetadataOnly(){return this.data===we}get microsecondTimestamp(){return Math.trunc(tt*this.timestamp)}get microsecondDuration(){return Math.trunc(tt*this.duration)}toEncodedVideoChunk(){if(this.isMetadataOnly)throw new TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw new Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}alphaToEncodedVideoChunk(t=this.type){if(!this.sideData.alpha)throw new TypeError("This packet does not contain alpha side data.");if(this.isMetadataOnly)throw new TypeError("Metadata-only packets cannot be converted to a video chunk.");if("undefined"==typeof EncodedVideoChunk)throw new Error("Your browser does not support EncodedVideoChunk.");return new EncodedVideoChunk({data:this.sideData.alpha,type:t,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}toEncodedAudioChunk(){if(this.isMetadataOnly)throw new TypeError("Metadata-only packets cannot be converted to an audio chunk.");if("undefined"==typeof EncodedAudioChunk)throw new Error("Your browser does not support EncodedAudioChunk.");return new EncodedAudioChunk({data:this.data,type:this.type,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration})}static fromEncodedChunk(e,i){if(!(e instanceof EncodedVideoChunk||e instanceof EncodedAudioChunk))throw new TypeError("chunk must be an EncodedVideoChunk or EncodedAudioChunk.");const r=new Uint8Array(e.byteLength);return e.copyTo(r),new t(r,e.type,e.timestamp/1e6,(e.duration??0)/1e6,void 0,void 0,i)}clone(e){if(void 0!==e&&("object"!=typeof e||null===e))throw new TypeError("options, when provided, must be an object.");if(void 0!==e?.data&&!(e.data instanceof Uint8Array))throw new TypeError("options.data, when provided, must be a Uint8Array.");if(void 0!==e?.type&&"key"!==e.type&&"delta"!==e.type)throw new TypeError('options.type, when provided, must be either "key" or "delta".');if(void 0!==e?.timestamp&&!Number.isFinite(e.timestamp))throw new TypeError("options.timestamp, when provided, must be a number.");if(void 0!==e?.duration&&!Number.isFinite(e.duration))throw new TypeError("options.duration, when provided, must be a number.");if(void 0!==e?.sequenceNumber&&!Number.isFinite(e.sequenceNumber))throw new TypeError("options.sequenceNumber, when provided, must be a number.");if(void 0!==e?.sideData&&("object"!=typeof e.sideData||null===e.sideData))throw new TypeError("options.sideData, when provided, must be an object.");return new t(e?.data??this.data,e?.type??this.type,e?.timestamp??this.timestamp,e?.duration??this.duration,e?.sequenceNumber??this.sequenceNumber,this.byteLength,e?.sideData??this.sideData)}},ye=class{constructor(t){this.value=t}},ve=class{constructor(t){this.value=t}},ge=class{constructor(t){this.value=t}},xe=class{constructor(t){this.value=t}};!function(t){t[t.EBML=440786851]="EBML",t[t.EBMLVersion=17030]="EBMLVersion",t[t.EBMLReadVersion=17143]="EBMLReadVersion",t[t.EBMLMaxIDLength=17138]="EBMLMaxIDLength",t[t.EBMLMaxSizeLength=17139]="EBMLMaxSizeLength",t[t.DocType=17026]="DocType",t[t.DocTypeVersion=17031]="DocTypeVersion",t[t.DocTypeReadVersion=17029]="DocTypeReadVersion",t[t.Void=236]="Void",t[t.Segment=408125543]="Segment",t[t.SeekHead=290298740]="SeekHead",t[t.Seek=19899]="Seek",t[t.SeekID=21419]="SeekID",t[t.SeekPosition=21420]="SeekPosition",t[t.Duration=17545]="Duration",t[t.Info=357149030]="Info",t[t.TimestampScale=2807729]="TimestampScale",t[t.MuxingApp=19840]="MuxingApp",t[t.WritingApp=22337]="WritingApp",t[t.Tracks=374648427]="Tracks",t[t.TrackEntry=174]="TrackEntry",t[t.TrackNumber=215]="TrackNumber",t[t.TrackUID=29637]="TrackUID",t[t.TrackType=131]="TrackType",t[t.FlagEnabled=185]="FlagEnabled",t[t.FlagDefault=136]="FlagDefault",t[t.FlagForced=21930]="FlagForced",t[t.FlagOriginal=21934]="FlagOriginal",t[t.FlagHearingImpaired=21931]="FlagHearingImpaired",t[t.FlagVisualImpaired=21932]="FlagVisualImpaired",t[t.FlagCommentary=21935]="FlagCommentary",t[t.FlagLacing=156]="FlagLacing",t[t.Name=21358]="Name",t[t.Language=2274716]="Language",t[t.LanguageBCP47=2274717]="LanguageBCP47",t[t.CodecID=134]="CodecID",t[t.CodecPrivate=25506]="CodecPrivate",t[t.CodecDelay=22186]="CodecDelay",t[t.SeekPreRoll=22203]="SeekPreRoll",t[t.DefaultDuration=2352003]="DefaultDuration",t[t.Video=224]="Video",t[t.PixelWidth=176]="PixelWidth",t[t.PixelHeight=186]="PixelHeight",t[t.DisplayWidth=21680]="DisplayWidth",t[t.DisplayHeight=21690]="DisplayHeight",t[t.DisplayUnit=21682]="DisplayUnit",t[t.AlphaMode=21440]="AlphaMode",t[t.Audio=225]="Audio",t[t.SamplingFrequency=181]="SamplingFrequency",t[t.Channels=159]="Channels",t[t.BitDepth=25188]="BitDepth",t[t.SimpleBlock=163]="SimpleBlock",t[t.BlockGroup=160]="BlockGroup",t[t.Block=161]="Block",t[t.BlockAdditions=30113]="BlockAdditions",t[t.BlockMore=166]="BlockMore",t[t.BlockAdditional=165]="BlockAdditional",t[t.BlockAddID=238]="BlockAddID",t[t.BlockDuration=155]="BlockDuration",t[t.ReferenceBlock=251]="ReferenceBlock",t[t.Cluster=524531317]="Cluster",t[t.Timestamp=231]="Timestamp",t[t.Cues=475249515]="Cues",t[t.CuePoint=187]="CuePoint",t[t.CueTime=179]="CueTime",t[t.CueTrackPositions=183]="CueTrackPositions",t[t.CueTrack=247]="CueTrack",t[t.CueClusterPosition=241]="CueClusterPosition",t[t.Colour=21936]="Colour",t[t.MatrixCoefficients=21937]="MatrixCoefficients",t[t.TransferCharacteristics=21946]="TransferCharacteristics",t[t.Primaries=21947]="Primaries",t[t.Range=21945]="Range",t[t.Projection=30320]="Projection",t[t.ProjectionType=30321]="ProjectionType",t[t.ProjectionPoseRoll=30325]="ProjectionPoseRoll",t[t.Attachments=423732329]="Attachments",t[t.AttachedFile=24999]="AttachedFile",t[t.FileDescription=18046]="FileDescription",t[t.FileName=18030]="FileName",t[t.FileMediaType=18016]="FileMediaType",t[t.FileData=18012]="FileData",t[t.FileUID=18094]="FileUID",t[t.Chapters=272869232]="Chapters",t[t.Tags=307544935]="Tags",t[t.Tag=29555]="Tag",t[t.Targets=25536]="Targets",t[t.TargetTypeValue=26826]="TargetTypeValue",t[t.TargetType=25546]="TargetType",t[t.TagTrackUID=25541]="TagTrackUID",t[t.TagEditionUID=25545]="TagEditionUID",t[t.TagChapterUID=25540]="TagChapterUID",t[t.TagAttachmentUID=25542]="TagAttachmentUID",t[t.SimpleTag=26568]="SimpleTag",t[t.TagName=17827]="TagName",t[t.TagLanguage=17530]="TagLanguage",t[t.TagString=17543]="TagString",t[t.TagBinary=17541]="TagBinary",t[t.ContentEncodings=28032]="ContentEncodings",t[t.ContentEncoding=25152]="ContentEncoding",t[t.ContentEncodingOrder=20529]="ContentEncodingOrder",t[t.ContentEncodingScope=20530]="ContentEncodingScope",t[t.ContentCompression=20532]="ContentCompression",t[t.ContentCompAlgo=16980]="ContentCompAlgo",t[t.ContentCompSettings=16981]="ContentCompSettings",t[t.ContentEncryption=20533]="ContentEncryption"}(pe||(pe={})),pe.EBML,pe.Segment,pe.SeekHead,pe.Info,pe.Cluster,pe.Tracks,pe.Cues,pe.Attachments,pe.Chapters,pe.Tags;var Ee=t=>t<256?1:t<65536?2:t<1<<24?3:t<2**32?4:t<2**40?5:6,ke=t=>t<256n?1:t<65536n?2:t<1n<<24n?3:t<1n<<32n?4:t<1n<<40n?5:t<1n<<48n?6:t<1n<<56n?7:8,Te=t=>t>=-64&&t<64?1:t>=-8192&&t<8192?2:t>=-1048576&&t<1<<20?3:t>=-134217728&&t<1<<27?4:t>=-(2**34)&&t<2**34?5:6,Me=class{constructor(t){this.writer=t,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap,this.dataOffsets=new WeakMap}writeByte(t){this.helperView.setUint8(0,t),this.writer.write(this.helper.subarray(0,1))}writeFloat32(t){this.helperView.setFloat32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeFloat64(t){this.helperView.setFloat64(0,t,!1),this.writer.write(this.helper)}writeUnsignedInt(t,e=Ee(t)){let i=0;switch(e){case 6:this.helperView.setUint8(i++,t/2**40|0);case 5:this.helperView.setUint8(i++,t/2**32|0);case 4:this.helperView.setUint8(i++,t>>24);case 3:this.helperView.setUint8(i++,t>>16);case 2:this.helperView.setUint8(i++,t>>8);case 1:this.helperView.setUint8(i++,t);break;default:throw new Error("Bad unsigned int size "+e)}this.writer.write(this.helper.subarray(0,i))}writeUnsignedBigInt(t,e=ke(t)){let i=0;for(let r=e-1;r>=0;r--)this.helperView.setUint8(i++,Number(t>>BigInt(8*r)&255n));this.writer.write(this.helper.subarray(0,i))}writeSignedInt(t,e=Te(t)){t<0&&(t+=2**(8*e)),this.writeUnsignedInt(t,e)}writeVarInt(t,e=(t=>{if(t<127)return 1;if(t<16383)return 2;if(t<2097151)return 3;if(t<268435455)return 4;if(t<2**35-1)return 5;if(t<2**42-1)return 6;throw new Error("EBML varint size not supported "+t)})(t)){let i=0;switch(e){case 1:this.helperView.setUint8(i++,128|t);break;case 2:this.helperView.setUint8(i++,64|t>>8),this.helperView.setUint8(i++,t);break;case 3:this.helperView.setUint8(i++,32|t>>16),this.helperView.setUint8(i++,t>>8),this.helperView.setUint8(i++,t);break;case 4:this.helperView.setUint8(i++,16|t>>24),this.helperView.setUint8(i++,t>>16),this.helperView.setUint8(i++,t>>8),this.helperView.setUint8(i++,t);break;case 5:this.helperView.setUint8(i++,8|t/2**32&7),this.helperView.setUint8(i++,t>>24),this.helperView.setUint8(i++,t>>16),this.helperView.setUint8(i++,t>>8),this.helperView.setUint8(i++,t);break;case 6:this.helperView.setUint8(i++,4|t/2**40&3),this.helperView.setUint8(i++,t/2**32|0),this.helperView.setUint8(i++,t>>24),this.helperView.setUint8(i++,t>>16),this.helperView.setUint8(i++,t>>8),this.helperView.setUint8(i++,t);break;default:throw new Error("Bad EBML varint size "+e)}this.writer.write(this.helper.subarray(0,i))}writeAsciiString(t){this.writer.write(new Uint8Array(t.split("").map(t=>t.charCodeAt(0))))}writeEBML(t){if(null!==t)if(t instanceof Uint8Array)this.writer.write(t);else if(Array.isArray(t))for(const e of t)this.writeEBML(e);else if(this.offsets.set(t,this.writer.getPos()),this.writeUnsignedInt(t.id),Array.isArray(t.data)){const e=this.writer.getPos(),i=-1===t.size?1:t.size??4;-1===t.size?this.writeByte(255):this.writer.seek(this.writer.getPos()+i);const r=this.writer.getPos();if(this.dataOffsets.set(t,r),this.writeEBML(t.data),-1!==t.size){const t=this.writer.getPos()-r,n=this.writer.getPos();this.writer.seek(e),this.writeVarInt(t,i),this.writer.seek(n)}}else if("number"==typeof t.data){const e=t.size??Ee(t.data);this.writeVarInt(e),this.writeUnsignedInt(t.data,e)}else if("bigint"==typeof t.data){const e=t.size??ke(t.data);this.writeVarInt(e),this.writeUnsignedBigInt(t.data,e)}else if("string"==typeof t.data)this.writeVarInt(t.data.length),this.writeAsciiString(t.data);else if(t.data instanceof Uint8Array)this.writeVarInt(t.data.byteLength,t.size),this.writer.write(t.data);else if(t.data instanceof ye)this.writeVarInt(4),this.writeFloat32(t.data.value);else if(t.data instanceof ve)this.writeVarInt(8),this.writeFloat64(t.data.value);else if(t.data instanceof ge){const e=t.size??Te(t.data.value);this.writeVarInt(e),this.writeSignedInt(t.data.value,e)}else if(t.data instanceof xe){const e=D.encode(t.data.value);this.writeVarInt(e.length),this.writer.write(e)}else X(t.data)}},_e={avc:"V_MPEG4/ISO/AVC",hevc:"V_MPEGH/ISO/HEVC",vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1",prores:"V_PRORES",aac:"A_AAC",mp3:"A_MPEG/L3",opus:"A_OPUS",vorbis:"A_VORBIS",flac:"A_FLAC",ac3:"A_AC3",eac3:"A_EAC3","pcm-u8":"A_PCM/INT/LIT","pcm-s16":"A_PCM/INT/LIT","pcm-s16be":"A_PCM/INT/BIG","pcm-s24":"A_PCM/INT/LIT","pcm-s24be":"A_PCM/INT/BIG","pcm-s32":"A_PCM/INT/LIT","pcm-s32be":"A_PCM/INT/BIG","pcm-f32":"A_PCM/FLOAT/IEEE","pcm-f64":"A_PCM/FLOAT/IEEE",webvtt:"S_TEXT/WEBVTT"},Ce=t=>{const e=t.filePos,i=new xt(oi(t,9));if(4095!==i.readBits(12))return null;if(i.skipBits(1),0!==i.readBits(2))return null;const r=i.readBits(1),n=i.readBits(2)+1,o=i.readBits(4);if(15===o)return null;i.skipBits(1);const s=i.readBits(3);if(0===s)throw new Error("ADTS frames with channel configuration 0 are not supported.");i.skipBits(1),i.skipBits(1),i.skipBits(1),i.skipBits(1);const a=i.readBits(13);i.skipBits(11);const h=i.readBits(2)+1;if(1!==h)throw new Error("ADTS frames with more than one AAC frame are not supported.");let c=null;return 1===r?t.filePos-=2:c=i.readBits(16),{objectType:n,samplingFrequencyIndex:o,channelConfiguration:s,frameLength:a,numberOfAacFrames:h,crcCheck:c,startPos:e}},Ae=i((t,e)=>{e.exports={}}),Se=function(t){return function(e){function i(i){e.error=e.hasError?new t(i,e.error,"An error was suppressed during disposal."):i,e.hasError=!0}var r,n=0;return function t(){for(;r=e.stack.pop();)try{if(!r.async&&1===n)return n=0,e.stack.push(r),Promise.resolve().then(t);if(r.dispose){var o=r.dispose.call(r.value);if(r.async)return n|=2,Promise.resolve(o).then(t,function(e){return i(e),t()})}else n|=1}catch(s){i(s)}if(1===n)return e.hasError?Promise.reject(e.error):Promise.resolve();if(e.hasError)throw e.error}()}}("function"==typeof SuppressedError?SuppressedError:function(t,e,i){var r=new Error(i);return r.name="SuppressedError",r.error=t,r.suppressed=e,r});Symbol.dispose??=Symbol("Symbol.dispose");var Be=-1/0,Pe=-1/0,Ie=null;"undefined"!=typeof FinalizationRegistry&&(Ie=new FinalizationRegistry(t=>{const e=performance.now();"video"===t.type?(e-Be>=1e3&&(wt.ht("A VideoSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your VideoSamples as soon as you're done using them."),Be=e),"undefined"!=typeof VideoFrame&&t.data instanceof VideoFrame&&t.data.close()):(e-Pe>=1e3&&(wt.ht("An AudioSample was garbage collected without first being closed. For proper resource management, make sure to call close() on all your AudioSamples as soon as you're done using them."),Pe=e),"undefined"!=typeof AudioData&&t.data instanceof AudioData&&t.data.close())}));var Fe=class{constructor(){this.dt=0,this.ut=null}},Ve=["I420","I420P10","I420P12","I420A","I420AP10","I420AP12","I422","I422P10","I422P12","I422A","I422AP10","I422AP12","I444","I444P10","I444P12","I444A","I444AP10","I444AP12","NV12","RGBA","RGBX","BGRA","BGRX"],$e=new Set(Ve),Ue=class t{get codedWidth(){return this.visibleRect.width}get codedHeight(){return this.visibleRect.height}get displayWidth(){return this.rotation%180==0?this.squarePixelWidth:this.squarePixelHeight}get displayHeight(){return this.rotation%180==0?this.squarePixelHeight:this.squarePixelWidth}get microsecondTimestamp(){return Math.trunc(tt*this.timestamp)}get microsecondDuration(){return Math.trunc(tt*this.duration)}get hasAlpha(){return this.format&&this.format.includes("A")}constructor(e,i){if(this.ft=!1,e instanceof ArrayBuffer||"undefined"!=typeof SharedArrayBuffer&&e instanceof SharedArrayBuffer||ArrayBuffer.isView(e)){if(!i||"object"!=typeof i)throw new TypeError("init must be an object.");if(void 0===i.format||!$e.has(i.format))throw new TypeError("init.format must be one of: "+Ve.join(", "));if(!Number.isInteger(i.codedWidth)||i.codedWidth<=0)throw new TypeError("init.codedWidth must be a positive integer.");if(!Number.isInteger(i.codedHeight)||i.codedHeight<=0)throw new TypeError("init.codedHeight must be a positive integer.");if(void 0!==i.rotation&&![0,90,180,270].includes(i.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(i.timestamp))throw new TypeError("init.timestamp must be a number.");if(void 0!==i.duration&&(!Number.isFinite(i.duration)||i.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");if(void 0!==i.layout){if(!Array.isArray(i.layout))throw new TypeError("init.layout, when provided, must be an array.");for(const t of i.layout){if(!t||"object"!=typeof t||Array.isArray(t))throw new TypeError("Each entry in init.layout must be an object.");if(!Number.isInteger(t.offset)||t.offset<0)throw new TypeError("plane.offset must be a non-negative integer.");if(!Number.isInteger(t.stride)||t.stride<0)throw new TypeError("plane.stride must be a non-negative integer.")}}if(void 0!==i.visibleRect&&ut(i.visibleRect,"init.visibleRect"),void 0!==i.displayWidth&&(!Number.isInteger(i.displayWidth)||i.displayWidth<=0))throw new TypeError("init.displayWidth, when provided, must be a positive integer.");if(void 0!==i.displayHeight&&(!Number.isInteger(i.displayHeight)||i.displayHeight<=0))throw new TypeError("init.displayHeight, when provided, must be a positive integer.");if(void 0!==i.displayWidth!=(void 0!==i.displayHeight))throw new TypeError("init.displayWidth and init.displayHeight must be either both provided or both omitted.");this.format=i.format,this.rotation=i.rotation??0,this.timestamp=i.timestamp,this.duration=i.duration??0;const t=i.layout??We(i.format,i.codedWidth,i.codedHeight);let r=i.colorSpace??null;null===r&&(r="RGBA"===this.format||"RGBX"===this.format||"BGRA"===this.format||"BGRX"===this.format?{primaries:"bt709",transfer:"iec61966-2-1",matrix:"rgb",fullRange:!0}:{primaries:"bt709",transfer:"bt709",matrix:"bt709",fullRange:!1}),this.visibleRect={left:i.visibleRect?.left??0,top:i.visibleRect?.top??0,width:i.visibleRect?.width??i.codedWidth,height:i.visibleRect?.height??i.codedHeight},void 0!==i.displayWidth?(this.squarePixelWidth=this.rotation%180==0?i.displayWidth:i.displayHeight,this.squarePixelHeight=this.rotation%180==0?i.displayHeight:i.displayWidth):(this.squarePixelWidth=this.visibleRect.width,this.squarePixelHeight=this.visibleRect.height),this.wt=i.bt?N(e):N(e).slice(),this.yt=t,this.colorSpace=new ze(r)}else if("undefined"!=typeof VideoFrame&&e instanceof VideoFrame){if(void 0!==i?.rotation&&![0,90,180,270].includes(i.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(void 0!==i?.timestamp&&!Number.isFinite(i?.timestamp))throw new TypeError("init.timestamp, when provided, must be a number.");if(void 0!==i?.duration&&(!Number.isFinite(i.duration)||i.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");void 0!==i?.visibleRect&&ut(i.visibleRect,"init.visibleRect"),this.wt=e,this.yt=null,this.format=e.format,this.visibleRect={left:e.visibleRect?.x??0,top:e.visibleRect?.y??0,width:e.visibleRect?.width??e.codedWidth,height:e.visibleRect?.height??e.codedHeight},this.rotation=i?.rotation??0,this.squarePixelWidth=e.displayWidth,this.squarePixelHeight=e.displayHeight,this.timestamp=i?.timestamp??e.timestamp/1e6,this.duration=i?.duration??(e.duration??0)/1e6,this.colorSpace=new ze(e.colorSpace)}else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof SVGImageElement&&e instanceof SVGImageElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas){if(!i||"object"!=typeof i)throw new TypeError("init must be an object.");if(void 0!==i.rotation&&![0,90,180,270].includes(i.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(i.timestamp))throw new TypeError("init.timestamp must be a number.");if(void 0!==i.duration&&(!Number.isFinite(i.duration)||i.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");if("undefined"!=typeof VideoFrame)return new t(new VideoFrame(e,{timestamp:Math.trunc(i.timestamp*tt),duration:Math.trunc((i.duration??0)*tt)||void 0}),i);let r=0,n=0;if("naturalWidth"in e?(r=e.naturalWidth,n=e.naturalHeight):"videoWidth"in e?(r=e.videoWidth,n=e.videoHeight):"width"in e&&(r=Number(e.width),n=Number(e.height)),!r||!n)throw new TypeError("Could not determine dimensions.");const o=new OffscreenCanvas(r,n),s=o.getContext("2d",{alpha:rt(),willReadFrequently:!0});if(!s)throw new Error("OffscreenCanvas must have support for the '2d' context in order to create a VideoSample from this data.");s.drawImage(e,0,0),this.wt=o,this.yt=null,this.format="RGBX",this.visibleRect={left:0,top:0,width:r,height:n},this.squarePixelWidth=r,this.squarePixelHeight=n,this.rotation=i.rotation??0,this.timestamp=i.timestamp,this.duration=i.duration??0,this.colorSpace=new ze({matrix:"rgb",primaries:"bt709",transfer:"iec61966-2-1",fullRange:!0})}else{if(!(e instanceof Fe))throw new TypeError("Invalid data type: Must be a BufferSource, CanvasImageSource, or VideoSampleResource.");if(!i||"object"!=typeof i)throw new TypeError("init must be an object.");if(void 0!==i.rotation&&![0,90,180,270].includes(i.rotation))throw new TypeError("init.rotation, when provided, must be 0, 90, 180, or 270.");if(!Number.isFinite(i.timestamp))throw new TypeError("init.timestamp must be a number.");if(void 0!==i.duration&&(!Number.isFinite(i.duration)||i.duration<0))throw new TypeError("init.duration, when provided, must be a non-negative number.");if(this.wt=e,e.dt++,this.format=e.getFormat(),null!==this.format&&!Ve.includes(this.format))throw new TypeError("getFormat() must return a VideoSamplePixelFormat or null.");if(this.visibleRect={left:0,top:0,width:e.getCodedWidth(),height:e.getCodedHeight()},!Number.isInteger(this.visibleRect.width)||this.visibleRect.width<=0)throw new TypeError("getCodedWidth() must return a positive integer.");if(!Number.isInteger(this.visibleRect.height)||this.visibleRect.height<=0)throw new TypeError("getCodedHeight() must return a positive integer.");if(this.squarePixelWidth=e.getSquarePixelWidth(),!Number.isInteger(this.squarePixelWidth)||this.squarePixelWidth<=0)throw new TypeError("getSquarePixelWidth() must return a positive integer.");if(this.squarePixelHeight=e.getSquarePixelHeight(),!Number.isInteger(this.squarePixelHeight)||this.squarePixelHeight<=0)throw new TypeError("getSquarePixelHeight() must return a positive integer.");this.rotation=i.rotation??0,this.timestamp=i.timestamp,this.duration=i.duration??0,this.colorSpace=e.getColorSpace()}this.encodeOptions=i?.encodeOptions??{},this.pixelAspectRatio=dt({num:this.squarePixelWidth*this.codedHeight,den:this.squarePixelHeight*this.codedWidth}),Ie?.register(this,{type:"video",data:this.wt},this)}clone(){if(this.ft)throw new Error("VideoSample is closed.");return B(null!==this.wt),this.wt instanceof Fe?new t(this.wt,{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation,encodeOptions:this.encodeOptions}):je(this.wt)?new t(this.wt.clone(),{timestamp:this.timestamp,duration:this.duration,rotation:this.rotation,encodeOptions:this.encodeOptions}):this.wt instanceof Uint8Array?(B(this.yt),new t(this.wt,{format:this.format,layout:this.yt,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation,visibleRect:this.visibleRect,displayWidth:this.displayWidth,displayHeight:this.displayHeight,encodeOptions:this.encodeOptions,bt:!0})):new t(this.wt,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.timestamp,duration:this.duration,colorSpace:this.colorSpace,rotation:this.rotation,visibleRect:this.visibleRect,displayWidth:this.displayWidth,displayHeight:this.displayHeight,encodeOptions:this.encodeOptions})}close(){this.ft||(Ie?.unregister(this),this.wt instanceof Fe?(this.wt.dt--,0===this.wt.dt&&this.wt.close()):je(this.wt)?this.wt.close():this.wt=null,this.ft=!0)}allocationSize(t={}){if(Le(t),this.ft)throw new Error("VideoSample is closed.");if(null==(t.format??this.format))throw new Error("Cannot get allocation size when format is null.");return je(this.wt)?this.wt.allocationSize(t):Xe(this,t).allocationSize}async copyTo(e,i={}){if(!H(e))throw new TypeError("destination must be an ArrayBuffer or an ArrayBuffer view.");if(Le(i),this.ft)throw new Error("VideoSample is closed.");if(null==(i.format??this.format))throw new Error("Cannot copy video sample data when format is null.");if(B(null!==this.wt),je(this.wt))return this.wt.copyTo(e,i);if(i.format&&!["RGBA","RGBX","BGRA","BGRX"].includes(this.format)&&["RGBA","RGBX","BGRA","BGRX"].includes(i.format)){if(!(this.wt instanceof Fe)){if("undefined"==typeof VideoFrame)throw new Error("For this sample, converting from a non-RGB to an RGB format requires VideoFrame to be defined.");const t=this.toVideoFrame(),r=await t.copyTo(e,i);return t.close(),r}{const r={stack:[],error:void 0,hasError:!1};try{const n=function(t,e,i){if(null!=e){if("object"!=typeof e&&"function"!=typeof e)throw new TypeError("Object expected.");var r,n;if(i){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");r=e[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");r=e[Symbol.dispose],i&&(n=r)}if("function"!=typeof r)throw new TypeError("Object not disposable.");n&&(r=function(){try{n.call(this)}catch(t){return Promise.reject(t)}}),t.stack.push({value:e,dispose:r,async:i})}else i&&t.stack.push({async:!0});return e}(r,await this.wt.toRgbSample({timestamp:this.timestamp,duration:this.duration,rotation:this.rotation},i.colorSpace??"srgb"),!1);if(!(n instanceof t))throw new TypeError("toRgbSample() must return a VideoSample.");if(!["RGBA","RGBX","BGRA","BGRX"].includes(n.format))throw new Error(`Sample returned by toRgbSample was expected to have an RGB format, got '${n.format}' instead.`);return await n.copyTo(e,i)}catch(c){r.error=c,r.hasError=!0}finally{Se(r)}}}const r=Xe(this,i);B(this.format);const n=N(e);if(n.byteLength<r.allocationSize)throw new TypeError(`Destination buffer too small. Required: ${r.allocationSize}, Available: ${n.byteLength}`);const o=qe(this.format);let s;if(this.wt instanceof Fe){let t=this.wt.getDataPlanes();if(t instanceof Promise&&(t=await t),!Array.isArray(t)||t.some(t=>!(t.data instanceof Uint8Array)||!Number.isInteger(t.stride)||t.stride<0))throw new TypeError('getDataPlanes() must return an array of objects with a Uint8Array "data" property and a non-negative integer "stride" property.');s=t}else if(this.wt instanceof Uint8Array)B(this.yt),B(this.yt.length===o.length),s=this.yt.map((t,e)=>{const i=Math.ceil(this.codedHeight/o[e].heightDivisor);return{data:this.wt.subarray(t.offset,t.offset+t.stride*i),stride:t.stride}});else{const t=this.wt.getContext("2d");B(t),s=[{data:N(t.getImageData(0,0,this.codedWidth,this.codedHeight).data),stride:4*this.codedWidth}]}const a=[],h=o.length;for(let t=0;t<h;t++){const e=r.computedLayouts[t],i=s[t].stride,o=s[t].data;let h=e.sourceTop*i;h+=e.sourceLeftBytes;let c=e.destinationOffset;const l=e.sourceWidthBytes,d={offset:c,stride:e.destinationStride};for(let t=0;t<e.sourceHeight;t++){if(h+l>o.byteLength)throw new Error("Source buffer OOB read.");if(c+l>n.byteLength)throw new Error("Destination buffer OOB write.");const t=o.subarray(h,h+l);n.set(t,c),h+=i,c+=e.destinationStride}a.push(d)}if(void 0!==i.format){const t=this.format.startsWith("RGB")!==i.format.startsWith("RGB"),e=this.format.includes("X")&&i.format.includes("A");if(t||e)for(let i=0;i<r.allocationSize;i+=4){if(t){const t=n[i];n[i]=n[i+2],n[i+2]=t}e&&(n[i+3]=255)}}return a}toVideoFrame(){if(this.ft)throw new Error("VideoSample is closed.");if(B(null!==this.wt),this.wt instanceof Fe){if(null===this.format)throw new Error("Cannot convert a VideoSampleResource-backed VideoSample to VideoFrame if format is null.");const t=this.wt.getDataPlanes();if(t instanceof Promise)throw new Error("Cannot convert a VideoSampleResource-backed VideoSample to VideoFrame if getDataPlanes() returns a promise.");const e=t.reduce((t,e)=>t+e.data.byteLength,0),i=new Uint8Array(e);let r=0;const n=[];for(const o of t)i.set(o.data,r),n.push(r),r+=o.data.byteLength;return new VideoFrame(i,{format:this.format,layout:t.map((t,e)=>({offset:n[e],stride:t.stride})),codedWidth:this.codedWidth,codedHeight:this.codedHeight,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration,colorSpace:this.colorSpace,visibleRect:this.visibleRect,displayWidth:this.squarePixelWidth,displayHeight:this.squarePixelHeight})}return je(this.wt)?new VideoFrame(this.wt,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0}):this.wt instanceof Uint8Array?(B(this.yt),new VideoFrame(this.wt,{format:this.format,codedWidth:this.codedWidth,codedHeight:this.codedHeight,layout:this.yt,timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0,colorSpace:this.colorSpace,visibleRect:this.visibleRect,displayWidth:this.squarePixelWidth,displayHeight:this.squarePixelHeight})):new VideoFrame(this.wt,{timestamp:this.microsecondTimestamp,duration:this.microsecondDuration||void 0})}draw(t,e,i,r,n,o,s,a,h){let c=0,l=0,d=this.displayWidth,u=this.displayHeight,f=0,p=0,m=this.displayWidth,w=this.displayHeight;if(void 0!==o?(c=e,l=i,d=r,u=n,f=o,p=s,void 0!==a?(m=a,w=h):(m=d,w=u)):(f=e,p=i,void 0!==r&&(m=r,w=n)),!("undefined"!=typeof CanvasRenderingContext2D&&t instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&t instanceof OffscreenCanvasRenderingContext2D))throw new TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!Number.isFinite(c))throw new TypeError("sx must be a number.");if(!Number.isFinite(l))throw new TypeError("sy must be a number.");if(!Number.isFinite(d)||d<0)throw new TypeError("sWidth must be a non-negative number.");if(!Number.isFinite(u)||u<0)throw new TypeError("sHeight must be a non-negative number.");if(!Number.isFinite(f))throw new TypeError("dx must be a number.");if(!Number.isFinite(p))throw new TypeError("dy must be a number.");if(!Number.isFinite(m)||m<0)throw new TypeError("dWidth must be a non-negative number.");if(!Number.isFinite(w)||w<0)throw new TypeError("dHeight must be a non-negative number.");if(this.ft)throw new Error("VideoSample is closed.");({sx:c,sy:l,sWidth:d,sHeight:u}=this.vt(c,l,d,u,this.rotation));const b=this.toCanvasImageSource();t.save();const y=f+m/2,v=p+w/2;t.translate(y,v),t.rotate(this.rotation*Math.PI/180);const g=this.rotation%180==0?1:m/w;t.scale(1/g,g),t.drawImage(b,c,l,d,u,-m/2,-w/2,m,w),t.restore()}drawWithFit(t,e){if(!("undefined"!=typeof CanvasRenderingContext2D&&t instanceof CanvasRenderingContext2D||"undefined"!=typeof OffscreenCanvasRenderingContext2D&&t instanceof OffscreenCanvasRenderingContext2D))throw new TypeError("context must be a CanvasRenderingContext2D or OffscreenCanvasRenderingContext2D.");if(!e||"object"!=typeof e)throw new TypeError("options must be an object.");if(!["fill","contain","cover"].includes(e.fit))throw new TypeError("options.fit must be 'fill', 'contain', or 'cover'.");if(void 0!==e.rotation&&![0,90,180,270].includes(e.rotation))throw new TypeError("options.rotation, when provided, must be 0, 90, 180, or 270.");void 0!==e.crop&&He(e.crop,"options.");const i=t.canvas.width,r=t.canvas.height,n=e.rotation??this.rotation,[o,s]=n%180==0?[this.squarePixelWidth,this.squarePixelHeight]:[this.squarePixelHeight,this.squarePixelWidth];let a,h,c,l,d=e.crop;d&&(d=Ge(d,o,s));const{sx:u,sy:f,sWidth:p,sHeight:m}=this.vt(e.crop?.left??0,e.crop?.top??0,e.crop?.width??o,e.crop?.height??s,n);if("fill"===e.fit)a=0,h=0,c=i,l=r;else{const[t,n]=e.crop?[e.crop.width,e.crop.height]:[o,s],d="contain"===e.fit?Math.min(i/t,r/n):Math.max(i/t,r/n);c=t*d,l=n*d,a=(i-c)/2,h=(r-l)/2}t.save();const w=n%180==0?1:c/l;t.translate(i/2,r/2),t.rotate(n*Math.PI/180),t.scale(1/w,w),t.translate(-i/2,-r/2),t.drawImage(this.toCanvasImageSource(),u,f,p,m,a,h,c,l),t.restore()}vt(t,e,i,r,n){return 90===n?[t,e,i,r]=[e,this.squarePixelHeight-t-i,r,i]:180===n?[t,e]=[this.squarePixelWidth-t-i,this.squarePixelHeight-e-r]:270===n&&([t,e,i,r]=[this.squarePixelWidth-e-r,t,r,i]),{sx:t,sy:e,sWidth:i,sHeight:r}}toCanvasImageSource(){if(this.ft)throw new Error("VideoSample is closed.");if(B(null!==this.wt),this.wt instanceof Fe||this.wt instanceof Uint8Array){const t=this.toVideoFrame();return queueMicrotask(()=>t.close()),t}return this.wt}async transform(e){if(!e||"object"!=typeof e)throw new TypeError("options must be an object.");if(void 0!==e.width&&(!Number.isInteger(e.width)||e.width<=0))throw new TypeError("options.width, when provided, must be a positive integer.");if(void 0!==e.height&&(!Number.isInteger(e.height)||e.height<=0))throw new TypeError("options.height, when provided, must be a positive integer.");if(void 0!==e.roundDimensionsTo&&(!Number.isInteger(e.roundDimensionsTo)||e.roundDimensionsTo<=0))throw new TypeError("options.roundDimensionsTo, when provided, must be a positive integer.");if(void 0!==e.fit&&!["fill","contain","cover"].includes(e.fit))throw new TypeError('options.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==e.width&&void 0!==e.height&&void 0===e.fit)throw new TypeError("When both options.width and options.height are provided, options.fit must also be provided.");if(void 0!==e.rotate&&![0,90,180,270].includes(e.rotate))throw new TypeError("options.rotate, when provided, must be 0, 90, 180 or 270.");if(void 0!==e.crop&&He(e.crop,"options."),void 0!==e.alpha&&!["keep","discard"].includes(e.alpha))throw new TypeError("options.alpha, when provided, must be 'keep' or 'discard'.");const i=I(this.rotation+(e.rotate??0)),[r,n]=i%180==0?[this.squarePixelWidth,this.squarePixelHeight]:[this.squarePixelHeight,this.squarePixelWidth];let o=e.crop;o&&(o=Ge(o,r,n));const s=o?o.width:r,a=o?o.height:n,h=s/a;let c,l;void 0!==e.width&&void 0===e.height?(c=e.width,l=c/h):void 0===e.width&&void 0!==e.height?(l=e.height,c=l*h):void 0!==e.width&&void 0!==e.height?(c=e.width,l=e.height):(c=s,l=a),c=J(c,e.roundDimensionsTo??1),l=J(l,e.roundDimensionsTo??1);const d={width:c,height:l,fit:e.fit??"fill",rotation:i,crop:o??{left:0,top:0,width:r,height:n},alpha:e.alpha??"keep"};for(const t of Ne){let e=t(this,d);if(e instanceof Promise&&(e=await e),null!==e)return e}let u=null,f=!1;for(const t of De)if(t.canvas.width===d.width&&t.canvas.height===d.height){u=t.canvas,t.age=Oe++;break}if(null===u){if("undefined"!=typeof OffscreenCanvas)u=new OffscreenCanvas(d.width,d.height);else{if("undefined"==typeof window||"undefined"==typeof document)throw new Error("Cannot transform VideoSamples in this environment. Either run in an environment with OffscreenCanvas or HTMLCanvasElement, or supply a custom VideoSample transformer using registerVideoSampleTransformer().");u=document.createElement("canvas"),u.width=d.width,u.height=d.height}f=!0,De.length>=Re&&De.splice(((t,e)=>{let i=-1,r=1/0;for(let n=0;n<t.length;n++){const o=e(t[n]);o<r&&(r=o,i=n)}return i})(De,t=>t.age),1),De.push({canvas:u,age:Oe++})}const p=u.getContext("2d",{alpha:!0});if(!p)throw new Error("The '2d' canvas context is required to transform VideoSamples. Register a custom transformer using registerVideoSampleTransformer to work around this limitation.");return"discard"===d.alpha?(p.fillStyle="black",p.fillRect(0,0,d.width,d.height)):f||p.clearRect(0,0,d.width,d.height),this.drawWithFit(p,{fit:d.fit,rotation:d.rotation,crop:d.crop}),new t(u,{timestamp:this.timestamp,duration:this.duration,rotation:0})}setRotation(t){if(![0,90,180,270].includes(t))throw new TypeError("newRotation must be 0, 90, 180, or 270.");this.rotation=t}setTimestamp(t){if(!Number.isFinite(t))throw new TypeError("newTimestamp must be a number.");this.timestamp=t}setDuration(t){if(!Number.isFinite(t)||t<0)throw new TypeError("newDuration must be a non-negative number.");this.duration=t}setEncodeOptions(t){if(!t||"object"!=typeof t)throw new TypeError("newEncodeOptions must be an object.");this.encodeOptions=t}[Symbol.dispose](){this.close()}},Ne=[],Re=3,De=[],Oe=0,ze=class{constructor(t){if(void 0!==t){if(!t||"object"!=typeof t)throw new TypeError("init.colorSpace, when provided, must be an object.");const e=Object.keys(O);if(null!=t.primaries&&!e.includes(t.primaries))throw new TypeError(`init.colorSpace.primaries, when provided, must be one of ${e.join(", ")}.`);const i=Object.keys(z);if(null!=t.transfer&&!i.includes(t.transfer))throw new TypeError(`init.colorSpace.transfer, when provided, must be one of ${i.join(", ")}.`);const r=Object.keys(j);if(null!=t.matrix&&!r.includes(t.matrix))throw new TypeError(`init.colorSpace.matrix, when provided, must be one of ${r.join(", ")}.`);if(null!=t.fullRange&&"boolean"!=typeof t.fullRange)throw new TypeError("init.colorSpace.fullRange, when provided, must be a boolean.")}this.primaries=t?.primaries??null,this.transfer=t?.transfer??null,this.matrix=t?.matrix??null,this.fullRange=t?.fullRange??null}toJSON(){return{primaries:this.primaries,transfer:this.transfer,matrix:this.matrix,fullRange:this.fullRange}}},je=t=>"undefined"!=typeof VideoFrame&&t instanceof VideoFrame,Ge=(t,e,i)=>{const r=Math.min(t.left,e),n=Math.min(t.top,i),o=Math.min(t.width,e-r),s=Math.min(t.height,i-n);return B(o>=0),B(s>=0),{left:r,top:n,width:o,height:s}},He=(t,e)=>{if(!t||"object"!=typeof t)throw new TypeError(e+"crop, when provided, must be an object.");if(!Number.isInteger(t.left)||t.left<0)throw new TypeError(e+"crop.left must be a non-negative integer.");if(!Number.isInteger(t.top)||t.top<0)throw new TypeError(e+"crop.top must be a non-negative integer.");if(!Number.isInteger(t.width)||t.width<0)throw new TypeError(e+"crop.width must be a non-negative integer.");if(!Number.isInteger(t.height)||t.height<0)throw new TypeError(e+"crop.height must be a non-negative integer.")},Le=t=>{if(!t||"object"!=typeof t)throw new TypeError("options must be an object.");if(void 0!==t.colorSpace&&!["display-p3","srgb"].includes(t.colorSpace))throw new TypeError("options.colorSpace, when provided, must be 'display-p3' or 'srgb'.");if(void 0!==t.format&&"string"!=typeof t.format)throw new TypeError("options.format, when provided, must be a string.");if(void 0!==t.layout){if(!Array.isArray(t.layout))throw new TypeError("options.layout, when provided, must be an array.");for(const e of t.layout){if(!e||"object"!=typeof e)throw new TypeError("Each entry in options.layout must be an object.");if(!Number.isInteger(e.offset)||e.offset<0)throw new TypeError("plane.offset must be a non-negative integer.");if(!Number.isInteger(e.stride)||e.stride<0)throw new TypeError("plane.stride must be a non-negative integer.")}}if(void 0!==t.rect){if(!t.rect||"object"!=typeof t.rect)throw new TypeError("options.rect, when provided, must be an object.");if(void 0!==t.rect.x&&(!Number.isInteger(t.rect.x)||t.rect.x<0))throw new TypeError("options.rect.x, when provided, must be a non-negative integer.");if(void 0!==t.rect.y&&(!Number.isInteger(t.rect.y)||t.rect.y<0))throw new TypeError("options.rect.y, when provided, must be a non-negative integer.");if(void 0!==t.rect.width&&(!Number.isInteger(t.rect.width)||t.rect.width<0))throw new TypeError("options.rect.width, when provided, must be a non-negative integer.");if(void 0!==t.rect.height&&(!Number.isInteger(t.rect.height)||t.rect.height<0))throw new TypeError("options.rect.height, when provided, must be a non-negative integer.")}},We=(t,e,i)=>{const r=qe(t),n=[];let o=0;for(const s of r){const t=Math.ceil(e/s.widthDivisor),r=Math.ceil(i/s.heightDivisor),a=t*s.sampleBytes,h=a*r;n.push({offset:o,stride:a}),o+=h}return n},qe=t=>{const e=(t,e,i,r,n)=>{const o=[{sampleBytes:t,widthDivisor:1,heightDivisor:1},{sampleBytes:e,widthDivisor:i,heightDivisor:r},{sampleBytes:e,widthDivisor:i,heightDivisor:r}];return n&&o.push({sampleBytes:t,widthDivisor:1,heightDivisor:1}),o};switch(t){case"I420":return e(1,1,2,2,!1);case"I420P10":case"I420P12":return e(2,2,2,2,!1);case"I420A":return e(1,1,2,2,!0);case"I420AP10":case"I420AP12":return e(2,2,2,2,!0);case"I422":return e(1,1,2,1,!1);case"I422P10":case"I422P12":return e(2,2,2,1,!1);case"I422A":return e(1,1,2,1,!0);case"I422AP10":case"I422AP12":return e(2,2,2,1,!0);case"I444":return e(1,1,1,1,!1);case"I444P10":case"I444P12":return e(2,2,1,1,!1);case"I444A":return e(1,1,1,1,!0);case"I444AP10":case"I444AP12":return e(2,2,1,1,!0);case"NV12":return[{sampleBytes:1,widthDivisor:1,heightDivisor:1},{sampleBytes:2,widthDivisor:2,heightDivisor:2}];case"RGBA":case"RGBX":case"BGRA":case"BGRX":return[{sampleBytes:4,widthDivisor:1,heightDivisor:1}];default:X(t),B(!1)}},Xe=(t,e)=>{const i={left:0,top:0,width:t.codedWidth,height:t.codedHeight},r=e.rect,n=Ye(i,r,t.codedWidth,t.codedHeight,t.format),o=e.layout;let s;if(e.format&&e.format!==t.format){if(!["RGBA","RGBX","BGRA","BGRX"].includes(e.format))throw new Error("NotSupportedError: Invalid destination format.");s=e.format}else s=t.format;return Qe(n,s,o)},Ye=(t,e,i,r,n)=>{const o={...t};if(void 0!==e){if(0===e.width||0===e.height)throw new TypeError("visibleRect dimensions cannot be zero.");if((e.x||0)+(e.width||0)>i)throw new TypeError("visibleRect exceeds codedWidth.");if((e.y||0)+(e.height||0)>r)throw new TypeError("visibleRect exceeds codedHeight.");o.x=e.x||0,o.y=e.y||0,o.width=e.width||0,o.height=e.height||0}if(!Je(n,o))throw new TypeError("visibleRect alignment is invalid for the format.");return o},Je=(t,e)=>{if(null===t)return!0;const i=qe(t);for(let r=0;r<i.length;r++){const t=i[r],n=t.widthDivisor,o=t.heightDivisor;if((e.x||0)%n!==0)return!1;if((e.y||0)%o!==0)return!1}return!0},Qe=(t,e,i)=>{const r=qe(e),n=r.length;if(void 0!==i&&i.length!==n)throw new TypeError(`Layout must have ${n} planes.`);let o=0;const s=[],a=[];for(let h=0;h<n;h++){const e=r[h],n=e.sampleBytes,c=e.widthDivisor,l=e.heightDivisor,d={destinationOffset:0,destinationStride:0,sourceTop:0,sourceHeight:0,sourceLeftBytes:0,sourceWidthBytes:0};if(d.sourceTop=Math.ceil(Math.trunc(t.y||0)/l),d.sourceHeight=Math.ceil(Math.trunc(t.height||0)/l),d.sourceLeftBytes=Math.floor(Math.trunc(t.x||0)/c)*n,d.sourceWidthBytes=Math.floor(Math.trunc(t.width||0)/c)*n,void 0!==i){const t=i[h];if(t.stride<d.sourceWidthBytes)throw new TypeError(`Stride for plane ${h} is too small.`);d.destinationOffset=t.offset,d.destinationStride=t.stride}else d.destinationOffset=o,d.destinationStride=d.sourceWidthBytes;const u=d.destinationStride*d.sourceHeight+d.destinationOffset;if(u>4294967295)throw new TypeError("Allocation size exceeds limit.");a.push(u),o=Math.max(o,u);for(let t=0;t<h;t++){const e=s[t];if(!(a[h]<=e.destinationOffset||a[t]<=d.destinationOffset))throw new TypeError("Planes overlap.")}s.push(d)}return{allocationSize:o,computedLayouts:s}},Ke=new Map,Ze=(t,e)=>{if(!e||"object"!=typeof e)throw new TypeError("Encoding options must be an object.");if(void 0!==e.alpha&&!["discard","keep"].includes(e.alpha))throw new TypeError("options.alpha, when provided, must be 'discard' or 'keep'.");if(void 0!==e.bitrateMode&&!["constant","variable"].includes(e.bitrateMode))throw new TypeError("bitrateMode, when provided, must be 'constant' or 'variable'.");if(void 0!==e.latencyMode&&!["quality","realtime"].includes(e.latencyMode))throw new TypeError("latencyMode, when provided, must be 'quality' or 'realtime'.");if(void 0!==e.fullCodecString&&"string"!=typeof e.fullCodecString)throw new TypeError("fullCodecString, when provided, must be a string.");if(void 0!==e.fullCodecString&&((i=e.fullCodecString).startsWith("avc1")||i.startsWith("avc3")?"avc":i.startsWith("hev1")||i.startsWith("hvc1")?"hevc":"vp8"===i?"vp8":i.startsWith("vp09")?"vp9":i.startsWith("av01")?"av1":Vt.includes(i)?"prores":"mp3"===i||"mp4a.69"===i||"mp4a.6B"===i||"mp4a.6b"===i||"mp4a.40.34"===i?"mp3":i.startsWith("mp4a.40.")||"mp4a.67"===i?"aac":"opus"===i?"opus":"vorbis"===i?"vorbis":"flac"===i?"flac":"ac-3"===i||"ac3"===i?"ac3":"ec-3"===i||"eac3"===i?"eac3":"ulaw"===i?"ulaw":"alaw"===i?"alaw":Rt.test(i)?i:"webvtt"===i?"webvtt":null)!==t)throw new TypeError(`fullCodecString, when provided, must be a string that matches the specified codec (${t}).`);var i;if(void 0!==e.hardwareAcceleration&&!["no-preference","prefer-hardware","prefer-software"].includes(e.hardwareAcceleration))throw new TypeError("hardwareAcceleration, when provided, must be 'no-preference', 'prefer-hardware' or 'prefer-software'.");if(void 0!==e.scalabilityMode&&"string"!=typeof e.scalabilityMode)throw new TypeError("scalabilityMode, when provided, must be a string.");if(void 0!==e.contentHint&&"string"!=typeof e.contentHint)throw new TypeError("contentHint, when provided, must be a string.")},ti=t=>{const e=t.bitrate instanceof ei?t.bitrate.gt(t.codec,t.width,t.height):t.bitrate;return{codec:t.fullCodecString??Ut(t.codec,t.width,t.height,e,"keep"===t.alpha),width:t.width,height:t.height,displayWidth:t.squarePixelWidth,displayHeight:t.squarePixelHeight,bitrate:e,bitrateMode:t.bitrateMode,alpha:t.alpha??"discard",framerate:t.framerate,latencyMode:t.latencyMode,hardwareAcceleration:t.hardwareAcceleration,scalabilityMode:t.scalabilityMode,contentHint:t.contentHint,...(i=t.codec,"avc"===i?{avc:{format:"avc"}}:"hevc"===i?{hevc:{format:"hevc"}}:{})};var i},ei=class{constructor(t){this.xt=t}gt(t,e,i){const r=e*i,n=3e6*Math.pow(r/2073600,.95)*{avc:1,hevc:.6,vp9:.6,av1:.4,vp8:1.2,prores:73.33333333333333}[t]*this.xt;return 1e3*Math.ceil(n/1e3)}Et(t){if(_t.includes(t)||"flac"===t)return;const e={aac:128e3,opus:64e3,mp3:16e4,vorbis:64e3,ac3:384e3,eac3:192e3}[t];if(!e)throw new Error(`Unhandled codec: ${t}`);let i=e*this.xt;return"aac"===t?i=[96e3,128e3,16e4,192e3].reduce((t,e)=>Math.abs(e-i)<Math.abs(t-i)?e:t):"opus"===t||"vorbis"===t?i=Math.max(6e3,i):"mp3"===t&&(i=[8e3,16e3,24e3,32e3,4e4,48e3,64e3,8e4,96e3,112e3,128e3,16e4,192e3,224e3,256e3,32e4].reduce((t,e)=>Math.abs(e-i)<Math.abs(t-i)?e:t)),1e3*Math.round(i/1e3)}},ii=async(t,e={})=>{const{width:i=1280,height:r=720,bitrate:n=1e6,...o}=e;if(!Mt.includes(t))return!1;if(!Number.isInteger(i)||i<=0)throw new TypeError("width must be a positive integer.");if(!Number.isInteger(r)||r<=0)throw new TypeError("height must be a positive integer.");if(!(n instanceof ei)&&(!Number.isInteger(n)||n<=0))throw new TypeError("bitrate must be a positive integer or a quality.");Ze(t,o);const s=ti({codec:t,width:i,height:r,bitrate:n,framerate:void 0,...o,alpha:"discard"}),a=JSON.stringify(s),h=Ke.get(a);if(h)return h;const c=(async()=>!!ri.some(e=>e.supports(t,s))||"undefined"!=typeof VideoEncoder&&(i%2!=1&&r%2!=1||"avc"!==t&&"hevc"!==t)&&!!(await VideoEncoder.isConfigSupported(s)).supported&&(!rt()||new Promise(async t=>{try{const e=new VideoEncoder({output:()=>{},error:()=>t(!1)});e.configure(s);const n=new Uint8Array(i*r*4),o=new VideoFrame(n,{format:"RGBA",codedWidth:i,codedHeight:r,timestamp:0});e.encode(o),o.close(),await e.flush(),t(!0)}catch{t(!1)}})))();return Ke.set(a,c),c},ri=[],ni=class t{constructor(t,e,i,r,n){this.bytes=t,this.view=e,this.offset=i,this.start=r,this.end=n,this.bufferPos=r-i}static tempFromBytes(e){return new t(e,R(e),0,0,e.length)}get length(){return this.end-this.start}get filePos(){return this.offset+this.bufferPos}set filePos(t){this.bufferPos=t-this.offset}get remainingLength(){return Math.max(this.end-this.filePos,0)}skip(t){this.bufferPos+=t}slice(e,i=this.end-e){if(e<this.start||e+i>this.end)throw new RangeError("Slicing outside of original slice.");return new t(this.bytes,this.view,this.offset,e,e+i)}},oi=(t,e)=>{((t,e)=>{if(t.filePos<t.start||t.filePos+e>t.end)throw new RangeError(`Tried reading [${t.filePos}, ${t.filePos+e}), but slice is [${t.start}, ${t.end}). This is likely an internal error, please report it alongside the file that caused it.`)})(t,e);const i=t.bytes.subarray(t.bufferPos,t.bufferPos+e);return t.bufferPos+=e,i},si=class{constructor(t){this.mutex=new L,this.trackTimestampInfo=new WeakMap,this.output=t}onTrackClose(t){}validateTimestamp(t,e,i){if(e<0)throw new Error(`Timestamps must be non-negative (got ${e}s).`);let r=this.trackTimestampInfo.get(t);if(r){if(i&&(r.maxTimestampBeforeLastKeyPacket=r.maxTimestamp),null!==r.maxTimestampBeforeLastKeyPacket&&e<r.maxTimestampBeforeLastKeyPacket)throw new Error(`Timestamps cannot be smaller than the largest timestamp of the previous GOP (a GOP begins with a key packet and ends right before the next key packet). Got ${e}s, but largest timestamp is ${r.maxTimestampBeforeLastKeyPacket}s.`);r.maxTimestamp=Math.max(r.maxTimestamp,e)}else{if(!i)throw new Error("First packet must be a key packet.");r={maxTimestamp:e,maxTimestampBeforeLastKeyPacket:null},this.trackTimestampInfo.set(t,r)}}},ai=/<(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})>/g,hi=/(?:(\d{2}):)?(\d{2}):(\d{2}).(\d{3})/,ci=t=>{const e=Math.floor(t/36e5),i=Math.floor(t%36e5/6e4),r=Math.floor(t%6e4/1e3),n=t%1e3;return e.toString().padStart(2,"0")+":"+i.toString().padStart(2,"0")+":"+r.toString().padStart(2,"0")+"."+n.toString().padStart(3,"0")},li=class{constructor(t){this.writer=t,this.helper=new Uint8Array(8),this.helperView=new DataView(this.helper.buffer),this.offsets=new WeakMap}writeU32(t){this.helperView.setUint32(0,t,!1),this.writer.write(this.helper.subarray(0,4))}writeU64(t){this.helperView.setUint32(0,Math.floor(t/2**32),!1),this.helperView.setUint32(4,t,!1),this.writer.write(this.helper.subarray(0,8))}writeAscii(t){for(let e=0;e<t.length;e++)this.helperView.setUint8(e%8,t.charCodeAt(e)),e%8==7&&this.writer.write(this.helper);t.length%8!=0&&this.writer.write(this.helper.subarray(0,t.length%8))}writeBox(t){if(this.offsets.set(t,this.writer.getPos()),t.contents&&!t.children)this.writeBoxHeader(t,t.size??t.contents.byteLength+8),this.writer.write(t.contents);else{const e=this.writer.getPos();if(this.writeBoxHeader(t,0),t.contents&&this.writer.write(t.contents),t.children)for(const n of t.children)n&&this.writeBox(n);const i=this.writer.getPos(),r=t.size??i-e;this.writer.seek(e),this.writeBoxHeader(t,r),this.writer.seek(i)}}writeBoxHeader(t,e){this.writeU32(t.largeSize?1:e),this.writeAscii(t.type),t.largeSize&&this.writeU64(e)}measureBoxHeader(t){return 8+(t.largeSize?8:0)}patchBox(t){const e=this.offsets.get(t);B(void 0!==e);const i=this.writer.getPos();this.writer.seek(e),this.writeBox(t),this.writer.seek(i)}measureBox(t){if(t.contents&&!t.children)return this.measureBoxHeader(t)+t.contents.byteLength;{let e=this.measureBoxHeader(t);if(t.contents&&(e+=t.contents.byteLength),t.children)for(const i of t.children)i&&(e+=this.measureBox(i));return e}}},di=new Uint8Array(8),ui=new DataView(di.buffer),fi=t=>[(t%256+256)%256],pi=t=>(ui.setUint16(0,t,!1),[di[0],di[1]]),mi=t=>(ui.setInt16(0,t,!1),[di[0],di[1]]),wi=t=>(ui.setUint32(0,t,!1),[di[1],di[2],di[3]]),bi=t=>(ui.setUint32(0,t,!1),[di[0],di[1],di[2],di[3]]),yi=t=>(ui.setInt32(0,t,!1),[di[0],di[1],di[2],di[3]]),vi=t=>(ui.setUint32(0,Math.floor(t/2**32),!1),ui.setUint32(4,t,!1),[di[0],di[1],di[2],di[3],di[4],di[5],di[6],di[7]]),gi=t=>(ui.setInt32(0,Math.floor(t/2**32),!1),ui.setUint32(4,t,!1),[di[0],di[1],di[2],di[3],di[4],di[5],di[6],di[7]]),xi=t=>(ui.setInt16(0,256*t,!1),[di[0],di[1]]),Ei=t=>(ui.setInt32(0,65536*t,!1),[di[0],di[1],di[2],di[3]]),ki=t=>(ui.setInt32(0,2**30*t,!1),[di[0],di[1],di[2],di[3]]),Ti=(t,e)=>{const i=[];let r=t;do{let t=127&r;r>>=7,i.length>0&&(t|=128),i.push(t),void 0!==e&&e--}while(r>0||e);return i.reverse()},Mi=(t,e=!1)=>{const i=Array(t.length).fill(null).map((e,i)=>t.charCodeAt(i));return e&&i.push(0),i},_i=t=>{const e=t*(Math.PI/180),i=Math.round(Math.cos(e)),r=Math.round(Math.sin(e));return[i,r,0,-r,i,0,0,0,1]},Ci=_i(0),Ai=t=>[Ei(t[0]),Ei(t[1]),ki(t[2]),Ei(t[3]),Ei(t[4]),ki(t[5]),Ei(t[6]),Ei(t[7]),ki(t[8])],Si=(t,e,i)=>({type:t,contents:e&&new Uint8Array(e.flat(10)),children:i}),Bi=(t,e,i,r,n)=>Si(t,[fi(e),wi(i),r??[]],n),Pi=()=>Si("styp",[Mi("iso5"),bi(0),Mi("iso5"),Mi("iso6"),Mi("mp41"),Mi("cmfc"),Mi("dash")]),Ii=(t,e)=>{let i=t.maxWrittenEndTimestamp-t.minWrittenTimestamp;return Number.isFinite(i)||(i=0),Bi("sidx",1,0,[bi(1),bi(en),vi(nn(t.minWrittenTimestamp,en)),vi(0),pi(0),pi(1),bi(2147483647&e),bi(nn(i,en)),bi(0)])},Fi=t=>({type:"mdat",largeSize:t}),Vi=t=>Si("moov",void 0,[$i(t.creationTime,t.trackDatas),...t.trackDatas.map(e=>Ni(e,t.creationTime)),t.isFragmented?gr(t.trackDatas):null,Fr(t)]),$i=(t,e)=>{const i=Math.max(0,...e.map(t=>nn(Ui(t),en)+nn(t.startTimestampOffset??0,en))),r=Math.max(0,...e.map(t=>t.track.id))+1,n=!V(t)||!V(i),o=n?vi:bi;return Bi("mvhd",+n,0,[o(t),o(t),bi(en),o(i),Ei(1),xi(1),Array(10).fill(0),Ai(Ci),Array(24).fill(0),bi(r)])},Ui=t=>{if(0===t.samples.length)return 0;let e=1/0,i=-1/0;for(let r=0;r<t.samples.length;r++){const n=t.samples[r];n.timestamp<e&&(e=n.timestamp),n.timestamp+n.duration>i&&(i=n.timestamp+n.duration)}return e===1/0?0:i-e},Ni=(t,e)=>{const i=rn(t),r=null!==t.startTimestampOffset&&t.startTimestampOffset>0;return Si("trak",void 0,[Ri(t,e),r?Di(t,t.startTimestampOffset):null,Oi(t,e),void 0!==i.name?Si("udta",void 0,[Si("name",[...D.encode(i.name)])]):null])},Ri=(t,e)=>{const i=nn(Ui(t),en)+nn(t.startTimestampOffset??0,en),r=!V(e)||!V(i),n=r?vi:bi;let o;if("video"===t.type){const e=t.track.metadata.rotation;o=_i(e??0)}else o=Ci;let s=2;return!1!==t.track.metadata.disposition?.default&&(s|=1),Bi("tkhd",+r,s,[n(e),n(e),bi(t.track.id),bi(0),n(i),Array(8).fill(0),pi(0),pi(t.track.id),xi("audio"===t.type?1:0),pi(0),Ai(o),Ei("video"===t.type?t.info.width:0),Ei("video"===t.type?t.info.height:0)])},Di=(t,e)=>{const i=nn(e,en),r=nn(Ui(t),en),n=!V(i)||!V(r),o=n?vi:bi,s=n?gi:yi;return Si("edts",void 0,[Bi("elst",n?1:0,0,[bi(2),o(i),s(-1),Ei(1),o(r),s(0),Ei(1)])])},Oi=(t,e)=>Si("mdia",void 0,[zi(t,e),Hi(!0,ji[t.type],Gi[t.type]),Li(t)]),zi=(t,e)=>{const i=nn(Ui(t),t.timescale),r=!V(e)||!V(i),n=r?vi:bi;return Bi("mdhd",+r,0,[n(e),n(e),bi(t.timescale),n(i),pi(qr(t.track.metadata.languageCode??"und")),pi(0)])},ji={video:"vide",audio:"soun",subtitle:"text"},Gi={video:"MediabunnyVideoHandler",audio:"MediabunnySoundHandler",subtitle:"MediabunnyTextHandler"},Hi=(t,e,i,r="\0\0\0\0")=>Bi("hdlr",0,0,[t?Mi("mhlr"):bi(0),Mi(e),Mi(r),bi(0),bi(0),Mi(i,!0)]),Li=t=>Si("minf",void 0,[Wi[t.type](),qi(),Ji(t)]),Wi={video:()=>Bi("vmhd",0,1,[pi(0),pi(0),pi(0),pi(0)]),audio:()=>Bi("smhd",0,0,[pi(0),pi(0)]),subtitle:()=>Bi("nmhd",0,0)},qi=()=>Si("dinf",void 0,[Xi()]),Xi=()=>Bi("dref",0,0,[bi(1)],[Yi()]),Yi=()=>Bi("url ",0,1),Ji=t=>{const e=t.compositionTimeOffsetTable.length>1||t.compositionTimeOffsetTable.some(t=>0!==t.sampleCompositionTimeOffset);return Si("stbl",void 0,[Qi(t),fr(t),e?yr(t):null,e?vr(t):null,mr(t),wr(t),br(t),pr(t)])},Qi=t=>{let e;if("video"===t.type)e=Ki(zr(t.track.source.kt,t.info.decoderConfig.codec),t);else if("audio"===t.type){const i=Gr(t.track.source.kt,t.muxer.isQuickTime);B(i),e=ir(i,t)}else"subtitle"===t.type&&(e=ur(Lr[t.track.source.kt],t));return B(e),Bi("stsd",0,0,[bi(1)],[e])},Ki=(t,e)=>Si(t,[Array(6).fill(0),pi(1),pi(0),pi(0),Array(12).fill(0),pi(e.info.width),pi(e.info.height),bi(4718592),bi(4718592),bi(0),pi(1),Array(32).fill(0),pi(24),mi(65535)],[jr[e.track.source.kt]?.(e)??null,Zi(e),G(e.info.decoderConfig.colorSpace)?tr(e):null]),Zi=t=>t.info.pixelAspectRatio.num===t.info.pixelAspectRatio.den?null:Si("pasp",[bi(t.info.pixelAspectRatio.num),bi(t.info.pixelAspectRatio.den)]),tr=t=>Si("colr",[Mi(t.muxer.isQuickTime?"nclc":"nclx"),pi(O[t.info.decoderConfig.colorSpace.primaries]),pi(z[t.info.decoderConfig.colorSpace.transfer]),pi(j[t.info.decoderConfig.colorSpace.matrix]),t.muxer.isQuickTime?[]:fi((t.info.decoderConfig.colorSpace.fullRange?1:0)<<7)]),er=t=>{if(!t.info.decoderConfig)return null;const e=t.info.decoderConfig,i=e.codec.split("."),r=Number(i[1]),n=Number(i[2]),o=(Number(i[3])<<4)+((i[4]?Number(i[4]):1)<<1)+(i[8]?Number(i[8]):Number(e.colorSpace?.fullRange??0)),s=i[5]?Number(i[5]):e.colorSpace?.primaries?O[e.colorSpace.primaries]:2,a=i[6]?Number(i[6]):e.colorSpace?.transfer?z[e.colorSpace.transfer]:2,h=i[7]?Number(i[7]):e.colorSpace?.matrix?j[e.colorSpace.matrix]:2;return Bi("vpcC",1,0,[fi(r),fi(n),fi(o),fi(s),fi(a),fi(h),pi(0)])},ir=(t,e)=>{let i,r=0,n=16;const o=_t.includes(e.track.source.kt);if(o){const t=e.track.source.kt,{sampleSize:i}=Dt(t);n=8*i,n>16&&(r=1)}if(e.muxer.isQuickTime&&(r=1),0===r)i=[Array(6).fill(0),pi(1),pi(r),pi(0),bi(0),pi(e.info.numberOfChannels),pi(n),pi(0),pi(0),pi(e.info.sampleRate<65536?e.info.sampleRate:0),pi(0)];else{const t=o?0:-2;i=[Array(6).fill(0),pi(1),pi(r),pi(0),bi(0),pi(e.info.numberOfChannels),pi(Math.min(n,16)),mi(t),pi(0),pi(e.info.sampleRate<65536?e.info.sampleRate:0),pi(0),o?[bi(1),bi(n/8),bi(e.info.numberOfChannels*n/8)]:[bi(0),bi(0),bi(0)],bi(2)]}return Si(t,i,[Hr(e.track.source.kt,e.muxer.isQuickTime)?.(e)??null])},rr=t=>{let e;switch(t.track.source.kt){case"aac":e=64;break;case"mp3":e=107;break;case"vorbis":e=221;break;default:throw new Error(`Unhandled audio codec: ${t.track.source.kt}`)}let i=[...fi(e),...fi(21),...wi(0),...bi(0),...bi(0)];if(t.info.decoderConfig.description){const e=N(t.info.decoderConfig.description);i=[...i,...fi(5),...Ti(e.byteLength),...e]}return i=[...pi(1),...fi(0),...fi(4),...Ti(i.length),...i,...fi(6),...fi(1),...fi(2)],i=[...fi(3),...Ti(i.length),...i],Bi("esds",0,0,i)},nr=t=>Si("wave",void 0,[or(t),sr(t),Si("\0\0\0\0")]),or=t=>Si("frma",[Mi(Gr(t.track.source.kt,t.muxer.isQuickTime))]),sr=t=>{const{littleEndian:e}=Dt(t.track.source.kt);return Si("enda",[pi(+e)])},ar=t=>{let e=t.info.numberOfChannels,i=3840,r=t.info.sampleRate,n=0,o=0,s=new Uint8Array(0);const a=t.info.decoderConfig?.description;if(a){B(a.byteLength>=18);const t=fe(N(a));e=t.outputChannelCount,i=t.preSkip,r=t.inputSampleRate,n=t.outputGain,o=t.channelMappingFamily,t.channelMappingTable&&(s=t.channelMappingTable)}return Si("dOps",[fi(0),fi(e),pi(i),bi(r),mi(n),fi(o),...s])},hr=t=>{const e=t.info.decoderConfig?.description;B(e);const i=N(e);return Bi("dfLa",0,0,[...i.subarray(4)])},cr=t=>{const{littleEndian:e,sampleSize:i}=Dt(t.track.source.kt);return Bi("pcmC",0,0,[fi(+e),fi(8*i)])},lr=t=>{const e=(t=>{if(t.length<7)return null;if(11!==t[0]||119!==t[1])return null;const e=new xt(t);e.skipBits(16),e.skipBits(16);const i=e.readBits(2);if(3===i)return null;const r=e.readBits(6),n=e.readBits(5);if(n>8)return null;const o=e.readBits(3),s=e.readBits(3);return 1&s&&1!==s&&e.skipBits(2),4&s&&e.skipBits(2),2===s&&e.skipBits(2),{fscod:i,bsid:n,bsmod:o,acmod:s,lfeon:e.readBits(1),bitRateCode:Math.floor(r/2)}})(t.info.firstPacket.data);if(!e)throw new Error("Couldn't extract AC-3 frame info from the audio packet. Ensure the packets contain valid AC-3 sync frames (as specified in ETSI TS 102 366).");const i=new Uint8Array(3),r=new xt(i);return r.writeBits(2,e.fscod),r.writeBits(5,e.bsid),r.writeBits(3,e.bsmod),r.writeBits(3,e.acmod),r.writeBits(1,e.lfeon),r.writeBits(5,e.bitRateCode),r.writeBits(5,0),Si("dac3",[...i])},dr=t=>{const e=(t=>{if(t.length<6)return null;if(11!==t[0]||119!==t[1])return null;const e=new xt(t);e.skipBits(16);const i=e.readBits(2);if(e.skipBits(3),0!==i&&2!==i)return null;const r=e.readBits(11),n=e.readBits(2);let o,s=0;3===n?(s=e.readBits(2),o=3):o=e.readBits(2);const a=e.readBits(3),h=e.readBits(1),c=e.readBits(5);if(c<11||c>16)return null;const l=me[o];let d;return d=n<3?Yt[n]/1e3:Jt[s]/1e3,{dataRate:Math.round((r+1)*d/(16*l)),substreams:[{fscod:n,fscod2:s,bsid:c,bsmod:0,acmod:a,lfeon:h,numDepSub:0,chanLoc:0}]}})(t.info.firstPacket.data);if(!e)throw new Error("Couldn't extract E-AC-3 frame info from the audio packet. Ensure the packets contain valid E-AC-3 sync frames (as specified in ETSI TS 102 366).");let i=16;for(const s of e.substreams)i+=23,s.numDepSub>0?i+=9:i+=1;const r=Math.ceil(i/8),n=new Uint8Array(r),o=new xt(n);o.writeBits(13,e.dataRate),o.writeBits(3,e.substreams.length-1);for(const s of e.substreams)o.writeBits(2,s.fscod),o.writeBits(5,s.bsid),o.writeBits(1,0),o.writeBits(1,0),o.writeBits(3,s.bsmod),o.writeBits(3,s.acmod),o.writeBits(1,s.lfeon),o.writeBits(3,0),o.writeBits(4,s.numDepSub),s.numDepSub>0?o.writeBits(9,s.chanLoc):o.writeBits(1,0);return Si("dec3",[...n])},ur=(t,e)=>Si(t,[Array(6).fill(0),pi(1)],[Wr[e.track.source.kt](e)]),fr=t=>Bi("stts",0,0,[bi(t.timeToSampleTable.length),t.timeToSampleTable.map(t=>[bi(t.sampleCount),bi(t.sampleDelta)])]),pr=t=>{if(t.samples.every(t=>"key"===t.type))return null;const e=[...t.samples.entries()].filter(([,t])=>"key"===t.type);return Bi("stss",0,0,[bi(e.length),e.map(([t])=>bi(t+1))])},mr=t=>Bi("stsc",0,0,[bi(t.compactlyCodedChunkTable.length),t.compactlyCodedChunkTable.map(t=>[bi(t.firstChunk),bi(t.samplesPerChunk),bi(1)])]),wr=t=>{if("audio"===t.type&&t.info.requiresPcmTransformation){const{sampleSize:e}=Dt(t.track.source.kt);return Bi("stsz",0,0,[bi(e*t.info.numberOfChannels),bi(t.samples.reduce((e,i)=>e+nn(i.duration,t.timescale),0))])}return Bi("stsz",0,0,[bi(0),bi(t.samples.length),t.samples.map(t=>bi(t.size))])},br=t=>t.finalizedChunks.length>0&&F(t.finalizedChunks).offset>=2**32?Bi("co64",0,0,[bi(t.finalizedChunks.length),t.finalizedChunks.map(t=>vi(t.offset))]):Bi("stco",0,0,[bi(t.finalizedChunks.length),t.finalizedChunks.map(t=>bi(t.offset))]),yr=t=>Bi("ctts",1,0,[bi(t.compositionTimeOffsetTable.length),t.compositionTimeOffsetTable.map(t=>[bi(t.sampleCount),yi(t.sampleCompositionTimeOffset)])]),vr=t=>{let e=1/0,i=-1/0,r=1/0,n=-1/0;B(t.compositionTimeOffsetTable.length>0),B(t.samples.length>0);for(let s=0;s<t.compositionTimeOffsetTable.length;s++){const r=t.compositionTimeOffsetTable[s];e=Math.min(e,r.sampleCompositionTimeOffset),i=Math.max(i,r.sampleCompositionTimeOffset)}for(let s=0;s<t.samples.length;s++){const e=t.samples[s];r=Math.min(r,nn(e.timestamp,t.timescale)),n=Math.max(n,nn(e.timestamp+e.duration,t.timescale))}const o=Math.max(-e,0);return n>=2**31?null:Bi("cslg",0,0,[yi(o),yi(e),yi(i),yi(r),yi(n)])},gr=t=>Si("mvex",void 0,t.map(xr)),xr=t=>Bi("trex",0,0,[bi(t.track.id),bi(1),bi(0),bi(0),bi(0)]),Er=(t,e)=>Si("moof",void 0,[kr(t),...e.map(Mr)]),kr=t=>Bi("mfhd",0,0,[bi(t)]),Tr=t=>{let e=0,i=0;const r="delta"===t.type;return i|=+r,e|=r?1:2,e<<24|i<<16},Mr=t=>Si("traf",void 0,[_r(t),Cr(t),Ar(t)]),_r=t=>{B(t.currentChunk);let e=0;e|=8,e|=16,e|=32,e|=131072;const i=t.currentChunk.samples[1]??t.currentChunk.samples[0],r={duration:i.timescaleUnitsToNextSample,size:i.size,flags:Tr(i)};return Bi("tfhd",0,131128,[bi(t.track.id),bi(r.duration),bi(r.size),bi(r.flags)])},Cr=t=>(B(t.currentChunk),Bi("tfdt",1,0,[vi(nn(t.currentChunk.startTimestamp,t.timescale))])),Ar=t=>{B(t.currentChunk);const e=t.currentChunk.samples.map(t=>t.timescaleUnitsToNextSample),i=t.currentChunk.samples.map(t=>t.size),r=t.currentChunk.samples.map(Tr),n=t.currentChunk.samples.map(e=>nn(e.timestamp-e.decodeTimestamp,t.timescale)),o=new Set(e),s=new Set(i),a=new Set(r),h=new Set(n),c=2===a.size&&r[0]!==r[1],l=o.size>1,d=s.size>1,u=!c&&a.size>1,f=h.size>1||[...h].some(t=>0!==t);let p=0;return p|=1,p|=4*+c,p|=256*+l,p|=512*+d,p|=1024*+u,p|=2048*+f,Bi("trun",1,p,[bi(t.currentChunk.samples.length),bi(t.currentChunk.offset-t.currentChunk.moofOffset||0),c?bi(r[0]):[],t.currentChunk.samples.map((t,o)=>[l?bi(e[o]):[],d?bi(i[o]):[],u?bi(r[o]):[],f?yi(n[o]):[]])])},Sr=(t,e)=>Bi("tfra",1,0,[bi(t.track.id),bi(63),bi(t.finalizedChunks.length),t.finalizedChunks.map(i=>[vi(nn(i.samples[0].timestamp,t.timescale)),vi(i.moofOffset),bi(e+1),bi(1),bi(1)])]),Br=()=>Si("vtte"),Pr=(t,e,i,r,n)=>Si("vttc",void 0,[null!==n?Si("vsid",[yi(n)]):null,null!==i?Si("iden",[...D.encode(i)]):null,null!==e?Si("ctim",[...D.encode(ci(e))]):null,null!==r?Si("sttg",[...D.encode(r)]):null,Si("payl",[...D.encode(t)])]),Ir=t=>Si("vtta",[...D.encode(t)]),Fr=t=>{const e=[],i=t.format.Tt.metadataFormat??"auto",r=t.output.Mt;if("mdir"===i||"auto"===i&&!t.isQuickTime){const t=Rr(r);t&&e.push(t)}else if("mdta"===i){const t=Dr(r);t&&e.push(t)}else("udta"===i||"auto"===i&&t.isQuickTime)&&Vr(e,t.output.Mt);return 0===e.length?null:Si("udta",void 0,e)},Vr=(t,e)=>{for(const{key:i,value:r}of ht(e))switch(i){case"title":t.push($r("©nam",r));break;case"description":t.push($r("©des",r));break;case"artist":t.push($r("©ART",r));break;case"album":t.push($r("©alb",r));break;case"albumArtist":t.push($r("albr",r));break;case"genre":t.push($r("©gen",r));break;case"date":t.push($r("©day",r.toISOString().slice(0,10)));break;case"comment":t.push($r("©cmt",r));break;case"lyrics":t.push($r("©lyr",r));break;case"raw":case"discNumber":case"discsTotal":case"trackNumber":case"tracksTotal":case"images":break;default:X(i)}if(e.raw)for(const i in e.raw){const r=e.raw[i];null==r||4!==i.length||t.some(t=>t.type===i)||("string"==typeof r?t.push($r(i,r)):r instanceof Uint8Array&&t.push(Si(i,Array.from(r))))}},$r=(t,e)=>{const i=D.encode(e);return Si(t,[pi(i.length),pi(qr("und")),Array.from(i)])},Ur={"image/jpeg":13,"image/png":14,"image/bmp":27},Nr=(t,e)=>{const i=[];for(const{key:r,value:n}of ht(t))switch(r){case"title":i.push({key:e?"title":"©nam",value:Or(n)});break;case"description":i.push({key:e?"description":"©des",value:Or(n)});break;case"artist":i.push({key:e?"artist":"©ART",value:Or(n)});break;case"album":i.push({key:e?"album":"©alb",value:Or(n)});break;case"albumArtist":i.push({key:e?"album_artist":"aART",value:Or(n)});break;case"comment":i.push({key:e?"comment":"©cmt",value:Or(n)});break;case"genre":i.push({key:e?"genre":"©gen",value:Or(n)});break;case"lyrics":i.push({key:e?"lyrics":"©lyr",value:Or(n)});break;case"date":i.push({key:e?"date":"©day",value:Or(n.toISOString().slice(0,10))});break;case"images":for(const t of n)"coverFront"===t.kind&&i.push({key:"covr",value:Si("data",[bi(Ur[t.mimeType]??0),bi(0),Array.from(t.data)])});break;case"trackNumber":if(e){const e=void 0!==t.tracksTotal?`${n}/${t.tracksTotal}`:n.toString();i.push({key:"track",value:Or(e)})}else i.push({key:"trkn",value:Si("data",[bi(0),bi(0),pi(0),pi(n),pi(t.tracksTotal??0),pi(0)])});break;case"discNumber":e||i.push({key:"disc",value:Si("data",[bi(0),bi(0),pi(0),pi(n),pi(t.discsTotal??0),pi(0)])});break;case"tracksTotal":case"discsTotal":case"raw":break;default:X(r)}if(t.raw)for(const r in t.raw){const n=t.raw[r];null==n||!e&&4!==r.length||i.some(t=>t.key===r)||("string"==typeof n?i.push({key:r,value:Or(n)}):n instanceof Uint8Array?i.push({key:r,value:Si("data",[bi(0),bi(0),Array.from(n)])}):n instanceof vt&&i.push({key:r,value:Si("data",[bi(Ur[n.mimeType]??0),bi(0),Array.from(n.data)])}))}return i},Rr=t=>{const e=Nr(t,!1);return 0===e.length?null:Bi("meta",0,0,void 0,[Hi(!1,"mdir","","appl"),Si("ilst",void 0,e.map(t=>Si(t.key,void 0,[t.value])))])},Dr=t=>{const e=Nr(t,!0);return 0===e.length?null:Si("meta",void 0,[Hi(!1,"mdta",""),Bi("keys",0,0,[bi(e.length)],e.map(t=>Si("mdta",[...D.encode(t.key)]))),Si("ilst",void 0,e.map((t,e)=>{const i=String.fromCharCode(...bi(e+1));return Si(i,void 0,[t.value])}))])},Or=t=>Si("data",[bi(1),bi(0),...D.encode(t)]),zr=(t,e)=>{switch(t){case"avc":return e.startsWith("avc3")?"avc3":"avc1";case"hevc":return"hvc1";case"vp8":return"vp08";case"vp9":return"vp09";case"av1":return"av01";case"prores":return e}},jr={avc:t=>t.info.decoderConfig&&Si("avcC",[...N(t.info.decoderConfig.description)]),hevc:t=>t.info.decoderConfig&&Si("hvcC",[...N(t.info.decoderConfig.description)]),vp8:er,vp9:er,av1:t=>Si("av1C",Nt(t.info.decoderConfig.codec)),prores:null},Gr=(t,e)=>{switch(t){case"aac":case"mp3":case"vorbis":return"mp4a";case"opus":return"Opus";case"flac":return"fLaC";case"ulaw":return"ulaw";case"alaw":return"alaw";case"pcm-u8":return"raw ";case"pcm-s8":return"sowt";case"ac3":return"ac-3";case"eac3":return"ec-3"}if(e)switch(t){case"pcm-s16":return"sowt";case"pcm-s16be":return"twos";case"pcm-s24":case"pcm-s24be":return"in24";case"pcm-s32":case"pcm-s32be":return"in32";case"pcm-f32":case"pcm-f32be":return"fl32";case"pcm-f64":case"pcm-f64be":return"fl64"}else switch(t){case"pcm-s16":case"pcm-s16be":case"pcm-s24":case"pcm-s24be":case"pcm-s32":case"pcm-s32be":return"ipcm";case"pcm-f32":case"pcm-f32be":case"pcm-f64":case"pcm-f64be":return"fpcm"}},Hr=(t,e)=>{switch(t){case"aac":case"mp3":case"vorbis":return rr;case"opus":return ar;case"flac":return hr;case"ac3":return lr;case"eac3":return dr}if(e)switch(t){case"pcm-s24":case"pcm-s24be":case"pcm-s32":case"pcm-s32be":case"pcm-f32":case"pcm-f32be":case"pcm-f64":case"pcm-f64be":return nr}else switch(t){case"pcm-s16":case"pcm-s16be":case"pcm-s24":case"pcm-s24be":case"pcm-s32":case"pcm-s32be":case"pcm-f32":case"pcm-f32be":case"pcm-f64":case"pcm-f64be":return cr}return null},Lr={webvtt:"wvtt"},Wr={webvtt:t=>Si("vttC",[...D.encode(t.info.config.description)])},qr=t=>{B(3===t.length);let e=0;for(let i=0;i<3;i++)e<<=5,e+=t.charCodeAt(i)-96;return e},Xr=class{constructor(t,e){if(this.finalized=!1,this.started=!1,this.pos=0,this.trackedWrites=null,this.trackedStart=-1,this.trackedEnd=-1,t._t)throw new Error("Can't have multiple Writers for the same Target.");this.target=t,t.Ct(e),t._t=!0}start(){B(!this.started),this.target.At(),this.started=!0}write(t){B(this.started&&!this.finalized),this.maybeTrackWrites(t),this.target.St(t,this.pos),this.pos+=t.byteLength}seek(t){this.pos=t}getPos(){return this.pos}async flush(){return B(this.started&&!this.finalized),this.target.Bt()}async finalize(){B(this.started&&!this.finalized),await this.target.Pt(),this.finalized=!0}maybeTrackWrites(t){if(!this.trackedWrites)return;let e=this.getPos();if(e<this.trackedStart){if(e+t.byteLength<=this.trackedStart)return;t=t.subarray(this.trackedStart-e),e=0}const i=e+t.byteLength-this.trackedStart;let r=this.trackedWrites.byteLength;for(;r<i;)r*=2;if(r!==this.trackedWrites.byteLength){const t=new Uint8Array(r);t.set(this.trackedWrites,0),this.trackedWrites=t}this.trackedWrites.set(t,e-this.trackedStart),this.trackedEnd=Math.max(this.trackedEnd,e+t.byteLength)}startTrackingWrites(){this.trackedWrites=new Uint8Array(1024),this.trackedStart=this.getPos(),this.trackedEnd=this.trackedStart}stopTrackingWrites(){if(!this.trackedWrites)throw new Error("Internal error: Can't get tracked writes since nothing was tracked.");const t={data:this.trackedWrites.subarray(0,this.trackedEnd-this.trackedStart),start:this.trackedStart,end:this.trackedEnd};return this.trackedWrites=null,t}},Yr=(Ae(),class extends pt{constructor(){super(...arguments),this._t=!1,this.It=null,this.onwrite=null}Ct(t){!1!==this.It&&(this.It=t)}Ft(t,e){this.onwrite?.(t,e),this.rt("write",{start:t,end:e})}slice(t){if(!Number.isInteger(t)||t<0)throw new TypeError("offset must be a non-negative integer.");return new Zr(this,t)}}),Jr=65536,Qr=2**32,Kr=class extends Yr{constructor(t={}){if(super(),this.buffer=null,this.Vt=0,!t||"object"!=typeof t)throw new TypeError("BufferTarget options, when provided, must be an object.");if(void 0!==t.onFinalize&&"function"!=typeof t.onFinalize)throw new TypeError("options.onFinalize, when provided, must be a function.");if(this.Tt=t,this.$t="resize"in new ArrayBuffer(0),this.$t)try{this.Ut=new ArrayBuffer(Jr,{maxByteLength:Qr})}catch{this.Ut=new ArrayBuffer(Jr),this.$t=!1}else this.Ut=new ArrayBuffer(Jr);this.Nt=new Uint8Array(this.Ut)}Rt(t){let e=this.Ut.byteLength;for(;e<t;)e*=2;if(e!==this.Ut.byteLength){if(e>Qr)throw new Error("ArrayBuffer exceeded maximum size of 4294967296 bytes. Please consider using another target.");if(this.$t)this.Ut.resize(e);else{const t=new ArrayBuffer(e),i=new Uint8Array(t);i.set(this.Nt,0),this.Ut=t,this.Nt=i}}}At(){}St(t,e){this.Rt(e+t.byteLength),this.Nt.set(t,e),this.Vt=Math.max(this.Vt,e+t.byteLength),this.Ft(e,e+t.byteLength)}async Bt(){}async Pt(){this.buffer=this.Ut.slice(0,this.Vt),this.Tt.onFinalize&&await this.Tt.onFinalize(this.buffer),this.rt("finalized")}async Dt(){}Ot(t,e){return this.Nt.slice(t,e)}},Zr=class extends Yr{constructor(t,e){super(),this.zt=t,this.jt=e}At(){}St(t,e){this.zt.St(t,this.jt+e),this.Ft(e,e+t.byteLength)}Bt(){return this.zt.Bt()}async Pt(){this.rt("finalized")}async Dt(){}Ct(t){super.Ct(t),this.zt.Ct(t)}},tn=class{constructor(t,e){if(this.rootPath=t,this.getTarget=e,"string"!=typeof t)throw new TypeError("rootPath must be a string.");if("function"!=typeof e)throw new TypeError("getTarget must be a function.")}},en=57600,rn=t=>{const e={},i=t.track;return void 0!==i.metadata.name&&(e.name=i.metadata.name),e},nn=(t,e,i=!0)=>{const r=t*e;return i?Math.round(r):r},on=class extends si{constructor(t,e){super(t),this.writer=null,this.boxWriter=null,this.initWriter=null,this.initBoxWriter=null,this.auxTarget=new Kr,this.auxWriter=new Xr(this.auxTarget,!1),this.auxBoxWriter=new li(this.auxWriter),this.mdat=null,this.ftypSize=null,this.trackDatas=[],this.allTracksKnown=q(),this.creationTime=Math.floor(Date.now()/1e3)+2082844800,this.finalizedChunks=[],this.nextFragmentNumber=1,this.maxWrittenTimestamp=-1/0,this.minWrittenTimestamp=1/0,this.maxWrittenEndTimestamp=-1/0,this.segmentHeaderSize=null,this.format=e,this.isQuickTime=e instanceof kn,this.isCmaf=e instanceof En,this.minimumFragmentDuration=e.Tt.minimumFragmentDuration??(e instanceof En?1/0:1),this.auxWriter.start()}async start(){const t=await this.mutex.acquire();if(this.isCmaf?(this.fastStart="fragmented",this.isFragmented=!0):(this.writer=await this.output.Gt(t=>void 0!==this.format.Tt.fastStart?"fragmented"===this.format.Tt.fastStart:t instanceof Kr),this.boxWriter=new li(this.writer),this.fastStart=this.format.Tt.fastStart??(this.writer.target instanceof Kr&&"in-memory"),this.isFragmented="fragmented"===this.fastStart),this.isCmaf){if(!this.output.Ht())throw new Error("CMAF outputs require the initTarget field in OutputOptions to be set; the init segment will be written to it.");const t=new Xr(await this.output.Lt(),!0);t.start(),this.initWriter=t,this.initBoxWriter=new li(t)}const e=this.output.tracks.some(t=>t.isVideoTrack()&&"avc"===t.source.kt);{const t=this.initBoxWriter??this.boxWriter;if(B(t),this.format.Tt.onFtyp&&t.writer.startTrackingWrites(),t.writeBox((t=>{const e=512;return Si("ftyp",t.isQuickTime?[Mi("qt "),bi(e),Mi("qt ")]:t.fragmented?t.cmaf?[Mi("iso5"),bi(e),Mi("iso5"),Mi("iso6"),Mi("mp41"),Mi("cmfc"),Mi("dash")]:[Mi("iso5"),bi(e),Mi("iso5"),Mi("iso6"),Mi("mp41")]:[Mi("isom"),bi(e),Mi("isom"),t.holdsAvc?Mi("avc1"):[],Mi("mp41")])})({isQuickTime:this.isQuickTime,holdsAvc:e,fragmented:this.isFragmented,cmaf:this.isCmaf})),this.format.Tt.onFtyp){const{data:e,start:i}=t.writer.stopTrackingWrites();this.format.Tt.onFtyp(e,i)}this.ftypSize=t.writer.getPos(),this.isCmaf&&await this.initWriter.flush()}if("in-memory"===this.fastStart);else if("reserve"===this.fastStart){for(const i of this.output.tracks)if(void 0===i.metadata.maximumPacketCount)throw new Error("All tracks must specify maximumPacketCount in their metadata when using fastStart: 'reserve'.")}else this.isFragmented||(B(this.writer),B(this.boxWriter),this.format.Tt.onMdat&&this.writer.startTrackingWrites(),this.mdat=Fi(!0),this.boxWriter.writeBox(this.mdat));await(this.writer?.flush()),t()}allTracksAreKnown(){for(const t of this.output.tracks)if(!t.source.ft&&!this.trackDatas.some(e=>e.track===t))return!1;return!0}async getMimeType(){await this.allTracksKnown.promise;const t=this.trackDatas.map(t=>"video"===t.type||"audio"===t.type?t.info.decoderConfig.codec:{webvtt:"wvtt"}[t.track.source.kt]);return(t=>{let e=(t.hasVideo?"video/":t.hasAudio?"audio/":"application/")+(t.isQuickTime?"quicktime":"mp4");return t.codecStrings.length>0&&(e+=`; codecs="${[...new Set(t.codecStrings)].join(", ")}"`),e})({isQuickTime:this.isQuickTime,hasVideo:this.trackDatas.some(t=>"video"===t.type),hasAudio:this.trackDatas.some(t=>"audio"===t.type),codecStrings:t})}getVideoTrackData(t,e,i){const r=this.trackDatas.find(e=>e.track===t);if(r)return r;Lt(i),B(i),B(i.decoderConfig);const n={...i.decoderConfig};B(void 0!==n.codedWidth),B(void 0!==n.codedHeight);let o=!1;if("avc"!==t.source.kt||n.description){if("hevc"===t.source.kt&&!n.description){const t=(t=>{try{const e=[],i=[],r=[],n=[];for(const h of Kt(t)){const o=t.subarray(h.offset,h.offset+h.length),s=ne(o[0]);s===yt.VPS_NUT?e.push(o):s===yt.SPS_NUT?i.push(o):s===yt.PPS_NUT?r.push(o):s!==yt.PREFIX_SEI_NUT&&s!==yt.SUFFIX_SEI_NUT||n.push(o)}if(0===i.length||0===r.length)return null;const o=(t=>{try{const e=new xt(ee(t));e.skipBits(16),e.readBits(4);const i=e.readBits(3),r=e.readBits(1),{general_profile_space:n,general_tier_flag:o,general_profile_idc:s,general_profile_compatibility_flags:a,general_constraint_indicator_flags:h,general_level_idc:c}=oe(e,i);$(e);const l=$(e);let d=0;3===l&&(d=e.readBits(1));const u=$(e),f=$(e);let p=u,m=f;if(e.readBits(1)){const t=$(e),i=$(e),r=$(e),n=$(e);let o=1,s=1;const a=0===d?l:0;1===a?(o=2,s=2):2===a&&(o=2,s=1),p-=(t+i)*o,m-=(r+n)*s}const w=$(e),b=$(e);$(e);const y=e.readBits(1)?0:i;let v=0;for(let t=y;t<=i;t++)$(e),v=$(e),$(e);$(e),$(e),$(e),$(e),$(e),$(e),e.readBits(1)&&e.readBits(1)&&se(e),e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(4),e.skipBits(4),$(e),$(e),e.skipBits(1));const g=$(e);if(ae(e,g),e.readBits(1)){const t=$(e);for(let i=0;i<t;i++)$(e),e.skipBits(1)}e.skipBits(1),e.skipBits(1);let x=2,E=2,k=2,T=0,M=0,_={num:1,den:1};if(e.readBits(1)){const t=ce(e,i);_=t.pixelAspectRatio,x=t.colourPrimaries,E=t.transferCharacteristics,k=t.matrixCoefficients,T=t.fullRangeFlag,M=t.minSpatialSegmentationIdc}return{displayWidth:p,displayHeight:m,pixelAspectRatio:_,colourPrimaries:x,transferCharacteristics:E,matrixCoefficients:k,fullRangeFlag:T,maxDecFrameBuffering:v+1,spsMaxSubLayersMinus1:i,spsTemporalIdNestingFlag:r,generalProfileSpace:n,generalTierFlag:o,generalProfileIdc:s,generalProfileCompatibilityFlags:a,generalConstraintIndicatorFlags:h,generalLevelIdc:c,chromaFormatIdc:l,bitDepthLumaMinus8:w,bitDepthChromaMinus8:b,minSpatialSegmentationIdc:M}}catch(e){return wt.ht("Error parsing HEVC SPS:",e),null}})(i[0]);if(!o)return null;let s=0;if(r.length>0){const t=r[0],e=new xt(ee(t));e.skipBits(16),$(e),$(e),e.skipBits(1),e.skipBits(1),e.skipBits(3),e.skipBits(1),e.skipBits(1),$(e),$(e),U(e),e.skipBits(1),e.skipBits(1),e.readBits(1)&&$(e),U(e),U(e),e.skipBits(1),e.skipBits(1),e.skipBits(1),e.skipBits(1);const i=e.readBits(1),n=e.readBits(1);s=i||n?i&&!n?2:!i&&n?3:0:0}const a=[...e.length?[{arrayCompleteness:1,nalUnitType:yt.VPS_NUT,nalUnits:e}]:[],...i.length?[{arrayCompleteness:1,nalUnitType:yt.SPS_NUT,nalUnits:i}]:[],...r.length?[{arrayCompleteness:1,nalUnitType:yt.PPS_NUT,nalUnits:r}]:[],...n.length?[{arrayCompleteness:1,nalUnitType:ne(n[0][0]),nalUnits:n}]:[]];return{configurationVersion:1,generalProfileSpace:o.generalProfileSpace,generalTierFlag:o.generalTierFlag,generalProfileIdc:o.generalProfileIdc,generalProfileCompatibilityFlags:o.generalProfileCompatibilityFlags,generalConstraintIndicatorFlags:o.generalConstraintIndicatorFlags,generalLevelIdc:o.generalLevelIdc,minSpatialSegmentationIdc:o.minSpatialSegmentationIdc,parallelismType:s,chromaFormatIdc:o.chromaFormatIdc,bitDepthLumaMinus8:o.bitDepthLumaMinus8,bitDepthChromaMinus8:o.bitDepthChromaMinus8,avgFrameRate:0,constantFrameRate:0,numTemporalLayers:o.spsMaxSubLayersMinus1+1,temporalIdNested:o.spsTemporalIdNestingFlag,lengthSizeMinusOne:3,arrays:a}}catch(e){return wt.ht("Error building HEVC Decoder Configuration Record:",e),null}})(e.data);if(!t)throw new Error("Couldn't extract an HEVCDecoderConfigurationRecord from the HEVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.265) when not providing a description, or provide a description (must be an HEVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in HEVC format.");n.description=(t=>{const e=[];e.push(t.configurationVersion),e.push((3&t.generalProfileSpace)<<6|(1&t.generalTierFlag)<<5|31&t.generalProfileIdc),e.push(t.generalProfileCompatibilityFlags>>>24&255),e.push(t.generalProfileCompatibilityFlags>>>16&255),e.push(t.generalProfileCompatibilityFlags>>>8&255),e.push(255&t.generalProfileCompatibilityFlags),e.push(...t.generalConstraintIndicatorFlags),e.push(255&t.generalLevelIdc),e.push(240|t.minSpatialSegmentationIdc>>8&15),e.push(255&t.minSpatialSegmentationIdc),e.push(252|3&t.parallelismType),e.push(252|3&t.chromaFormatIdc),e.push(248|7&t.bitDepthLumaMinus8),e.push(248|7&t.bitDepthChromaMinus8),e.push(t.avgFrameRate>>8&255),e.push(255&t.avgFrameRate),e.push((3&t.constantFrameRate)<<6|(7&t.numTemporalLayers)<<3|(1&t.temporalIdNested)<<2|3&t.lengthSizeMinusOne),e.push(255&t.arrays.length);for(const i of t.arrays){e.push((1&i.arrayCompleteness)<<7|63&i.nalUnitType),e.push(i.nalUnits.length>>8&255),e.push(255&i.nalUnits.length);for(const t of i.nalUnits){e.push(t.length>>8&255),e.push(255&t.length);for(let i=0;i<t.length;i++)e.push(t[i])}}return new Uint8Array(e)})(t),o=!0}}else{const t=(t=>{try{const e=[],i=[],r=[];for(const s of Kt(t)){const n=t.subarray(s.offset,s.offset+s.length),o=te(n[0]);o===bt.SPS?e.push(n):o===bt.PPS?i.push(n):o===bt.SPS_EXT&&r.push(n)}if(0===e.length)return null;if(0===i.length)return null;const n=(t=>{try{const e=new xt(ee(t));if(e.skipBits(1),e.skipBits(2),7!==e.readBits(5))return null;const i=e.readAlignedByte(),r=e.readAlignedByte(),n=e.readAlignedByte();$(e);let o=1,s=0,a=0,h=0;if((100===i||110===i||122===i||244===i||44===i||83===i||86===i||118===i||128===i)&&(o=$(e),3===o&&(h=e.readBits(1)),s=$(e),a=$(e),e.skipBits(1),e.readBits(1)))for(let t=0;t<(3!==o?8:12);t++)if(e.readBits(1)){const i=t<6?16:64;let r=8,n=8;for(let t=0;t<i;t++)0!==n&&(n=(r+U(e)+256)%256),r=0===n?r:n}$(e);const c=$(e);if(0===c)$(e);else if(1===c){e.skipBits(1),U(e),U(e);const t=$(e);for(let i=0;i<t;i++)U(e)}$(e),e.skipBits(1);const l=$(e),d=$(e),u=16*(l+1),f=16*(d+1);let p=u,m=f;const w=e.readBits(1);if(w||e.skipBits(1),e.skipBits(1),e.readBits(1)){const t=$(e),i=$(e),r=$(e),n=$(e);let s,a;0===(0===h?o:0)?(s=1,a=2-w):(s=3===o?1:2,a=(1===o?2:1)*(2-w)),p-=s*(t+i),m-=a*(r+n)}let b=2,y=2,v=2,g=0,x={num:1,den:1},E=null,k=null;if(e.readBits(1)){if(e.readBits(1)){const t=e.readBits(8);if(255===t)x={num:e.readBits(16),den:e.readBits(16)};else{const e=ie[t];e&&(x=e)}}e.readBits(1)&&e.skipBits(1),e.readBits(1)&&(e.skipBits(3),g=e.readBits(1),e.readBits(1)&&(b=e.readBits(8),y=e.readBits(8),v=e.readBits(8))),e.readBits(1)&&($(e),$(e)),e.readBits(1)&&(e.skipBits(32),e.skipBits(32),e.skipBits(1));const t=e.readBits(1);t&&re(e);const i=e.readBits(1);i&&re(e),(t||i)&&e.skipBits(1),e.skipBits(1),e.readBits(1)&&(e.skipBits(1),$(e),$(e),$(e),$(e),E=$(e),k=$(e))}if(null===E)if(B(null===k),(44===i||86===i||100===i||110===i||122===i||244===i)&&16&r)E=0,k=0;else{const t=l+1,e=(2-w)*(d+1),i=Bt.find(t=>t.level>=n)??F(Bt),r=Math.min(Math.floor(i.maxDpbMbs/(t*e)),16);E=r,k=r}return B(null!==k),{profileIdc:i,constraintFlags:r,levelIdc:n,frameMbsOnlyFlag:w,chromaFormatIdc:o,bitDepthLumaMinus8:s,bitDepthChromaMinus8:a,codedWidth:u,codedHeight:f,displayWidth:p,displayHeight:m,pixelAspectRatio:x,colourPrimaries:b,matrixCoefficients:v,transferCharacteristics:y,fullRangeFlag:g,numReorderFrames:E,maxDecFrameBuffering:k}}catch(e){return wt.ht("Error parsing AVC SPS:",e),null}})(e[0]);B(null!==n);const o=100===n.profileIdc||110===n.profileIdc||122===n.profileIdc||144===n.profileIdc;return{configurationVersion:1,avcProfileIndication:n.profileIdc,profileCompatibility:n.constraintFlags,avcLevelIndication:n.levelIdc,lengthSizeMinusOne:3,sequenceParameterSets:e,pictureParameterSets:i,chromaFormat:o?n.chromaFormatIdc:null,bitDepthLumaMinus8:o?n.bitDepthLumaMinus8:null,bitDepthChromaMinus8:o?n.bitDepthChromaMinus8:null,sequenceParameterSetExt:o?r:null}}catch(e){return wt.ht("Error building AVC Decoder Configuration Record:",e),null}})(e.data);if(!t)throw new Error("Couldn't extract an AVCDecoderConfigurationRecord from the AVC packet. Make sure the packets are in Annex B format (as specified in ITU-T-REC-H.264) when not providing a description, or provide a description (must be an AVCDecoderConfigurationRecord as specified in ISO 14496-15) and ensure the packets are in AVCC format.");n.description=(t=>{const e=[];e.push(t.configurationVersion),e.push(t.avcProfileIndication),e.push(t.profileCompatibility),e.push(t.avcLevelIndication),e.push(252|3&t.lengthSizeMinusOne),e.push(224|31&t.sequenceParameterSets.length);for(const i of t.sequenceParameterSets){const t=i.byteLength;e.push(t>>8),e.push(255&t);for(let r=0;r<t;r++)e.push(i[r])}e.push(t.pictureParameterSets.length);for(const i of t.pictureParameterSets){const t=i.byteLength;e.push(t>>8),e.push(255&t);for(let r=0;r<t;r++)e.push(i[r])}if(100===t.avcProfileIndication||110===t.avcProfileIndication||122===t.avcProfileIndication||144===t.avcProfileIndication){B(null!==t.chromaFormat),B(null!==t.bitDepthLumaMinus8),B(null!==t.bitDepthChromaMinus8),B(null!==t.sequenceParameterSetExt),e.push(252|3&t.chromaFormat),e.push(248|7&t.bitDepthLumaMinus8),e.push(248|7&t.bitDepthChromaMinus8),e.push(t.sequenceParameterSetExt.length);for(const i of t.sequenceParameterSetExt){const t=i.byteLength;e.push(t>>8),e.push(255&t);for(let r=0;r<t;r++)e.push(i[r])}}return new Uint8Array(e)})(t),o=!0}const s=(t=>{const e=t<0?-1:1;let i=0,r=1,n=1,o=0,s=t=Math.abs(t);for(;;){const t=Math.floor(s),a=t*n+i,h=t*o+r;if(h>1e6)return{num:e*n,den:o};if(i=n,r=o,n=a,o=h,s=1/(s-t),!isFinite(s))break}return{num:e*n,den:o}})(1/(t.metadata.frameRate??57600)).den,a=n.displayAspectWidth,h=n.displayAspectHeight,c=void 0===a||void 0===h?{num:1,den:1}:dt({num:a*n.codedHeight,den:h*n.codedWidth}),l={muxer:this,track:t,type:"video",info:{width:n.codedWidth,height:n.codedHeight,pixelAspectRatio:c,decoderConfig:n,requiresAnnexBTransformation:o},timescale:s,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,startTimestampOffset:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],closed:!1};return this.trackDatas.push(l),this.trackDatas.sort((t,e)=>t.track.id-e.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),l}getAudioTrackData(t,e,i){const r=this.trackDatas.find(e=>e.track===t);if(r)return r;qt(i),B(i),B(i.decoderConfig);const n={...i.decoderConfig};let o=!1;if("aac"===t.source.kt&&!n.description){const t=Ce(ni.tempFromBytes(e.data));if(!t)throw new Error("Couldn't parse ADTS header from the AAC packet. Make sure the packets are in ADTS format (as specified in ISO 13818-7) when not providing a description, or provide a description (must be an AudioSpecificConfig as specified in ISO 14496-3) and ensure the packets are raw AAC data.");const i=Et[t.samplingFrequencyIndex],r=kt[t.channelConfiguration];if(void 0===i||void 0===r)throw new Error("Invalid ADTS frame header.");n.description=Tt({objectType:t.objectType,sampleRate:i,numberOfChannels:r}),o=!0}const s={muxer:this,track:t,type:"audio",info:{numberOfChannels:i.decoderConfig.numberOfChannels,sampleRate:i.decoderConfig.sampleRate,decoderConfig:n,requiresPcmTransformation:!this.isFragmented&&_t.includes(t.source.kt),expectedNextPcmPacketTimestamp:null,requiresAdtsStripping:o,firstPacket:e},timescale:n.sampleRate,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,startTimestampOffset:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],closed:!1};return this.trackDatas.push(s),this.trackDatas.sort((t,e)=>t.track.id-e.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),s}getSubtitleTrackData(t,e){const i=this.trackDatas.find(e=>e.track===t);if(i)return i;Xt(e),B(e),B(e.config);const r={muxer:this,track:t,type:"subtitle",info:{config:e.config},timescale:1e3,samples:[],sampleQueue:[],timestampProcessingQueue:[],timeToSampleTable:[],compositionTimeOffsetTable:[],lastTimescaleUnits:null,lastSample:null,startTimestampOffset:null,finalizedChunks:[],currentChunk:null,compactlyCodedChunkTable:[],closed:!1,lastCueEndTimestamp:0,cueQueue:[],nextSourceId:0,cueToSourceId:new WeakMap};return this.trackDatas.push(r),this.trackDatas.sort((t,e)=>t.track.id-e.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),r}async addEncodedVideoPacket(t,e,i){const r=await this.mutex.acquire();try{const r=this.getVideoTrackData(t,e,i);let n=e.data;if(r.info.requiresAnnexBTransformation){const t=[...Kt(n)].map(t=>n.subarray(t.offset,t.offset+t.length));if(0===t.length)throw new Error("Failed to transform packet data. Make sure all packets are provided in Annex B format, as specified in ITU-T-REC-H.264 and ITU-T-REC-H.265.");n=(t=>{const e=t.reduce((t,e)=>t+4+e.byteLength,0),i=new Uint8Array(e);let r=0;for(const n of t){const t=new DataView(i.buffer,i.byteOffset,i.byteLength);t.setUint32(r,n.byteLength,!1),r+=4,i.set(n,r),r+=n.byteLength}return i})(t)}this.validateTimestamp(r.track,e.timestamp,"key"===e.type);const o=this.createSampleForTrack(r,n,e.timestamp,e.duration,e.type);await this.registerSample(r,o)}finally{r()}}async addEncodedAudioPacket(t,e,i){const r=await this.mutex.acquire();try{const r=this.getAudioTrackData(t,e,i);let n=e.data;if(r.info.requiresAdtsStripping){const t=Ce(ni.tempFromBytes(n));if(!t)throw new Error("Expected ADTS frame, didn't get one.");const e=null===t.crcCheck?7:9;n=n.subarray(e)}this.validateTimestamp(r.track,e.timestamp,"key"===e.type);let o=e.timestamp,s=e.duration;if(r.info.requiresPcmTransformation){const t=Dt(r.info.decoderConfig.codec).sampleSize*r.info.numberOfChannels;if(s=n.byteLength/t/r.info.sampleRate,null!==r.info.expectedNextPcmPacketTimestamp){const t=o-r.info.expectedNextPcmPacketTimestamp;if(t<.01)o=r.info.expectedNextPcmPacketTimestamp;else{const e=await this.padWithSilence(r,r.info.expectedNextPcmPacketTimestamp,t);o=r.info.expectedNextPcmPacketTimestamp+e}}r.info.expectedNextPcmPacketTimestamp=o+s}const a=this.createSampleForTrack(r,n,o,s,e.type);await this.registerSample(r,a)}finally{r()}}async padWithSilence(t,e,i){const r=nn(i,t.timescale);if(i=r/t.timescale,r>0){const{sampleSize:n,silentValue:o}=Dt(t.info.decoderConfig.codec),s=r*t.info.numberOfChannels,a=new Uint8Array(n*s).fill(o),h=this.createSampleForTrack(t,new Uint8Array(a.buffer),e,i,"key");await this.registerSample(t,h)}return i}async addSubtitleCue(t,e,i){const r=await this.mutex.acquire();try{const r=this.getSubtitleTrackData(t,i);this.validateTimestamp(r.track,e.timestamp,!0),"webvtt"===t.source.kt&&(r.cueQueue.push(e),await this.processWebVTTCues(r,e.timestamp))}finally{r()}}async processWebVTTCues(t,e){for(;t.cueQueue.length>0;){const i=new Set([]);for(const h of t.cueQueue)B(h.timestamp<=e),B(t.lastCueEndTimestamp<=h.timestamp+h.duration),i.add(Math.max(h.timestamp,t.lastCueEndTimestamp)),i.add(h.timestamp+h.duration);const r=[...i].sort((t,e)=>t-e),n=r[0],o=r[1]??n;if(e<o)break;if(t.lastCueEndTimestamp<n){this.auxWriter.seek(0);const e=Br();this.auxBoxWriter.writeBox(e);const i=this.auxTarget.Ot(0,this.auxWriter.getPos()),r=this.createSampleForTrack(t,i,t.lastCueEndTimestamp,n-t.lastCueEndTimestamp,"key");await this.registerSample(t,r),t.lastCueEndTimestamp=n}this.auxWriter.seek(0);for(let e=0;e<t.cueQueue.length;e++){const i=t.cueQueue[e];if(i.timestamp>=o)break;ai.lastIndex=0;const r=ai.test(i.text),s=i.timestamp+i.duration;let a=t.cueToSourceId.get(i);if(void 0===a&&o<s&&(a=t.nextSourceId++,t.cueToSourceId.set(i,a)),i.notes){const t=Ir(i.notes);this.auxBoxWriter.writeBox(t)}const h=Pr(i.text,r?n:null,i.identifier??null,i.settings??null,a??null);this.auxBoxWriter.writeBox(h),s===o&&t.cueQueue.splice(e--,1)}const s=this.auxTarget.Ot(0,this.auxWriter.getPos()),a=this.createSampleForTrack(t,s,n,o-n,"key");await this.registerSample(t,a),t.lastCueEndTimestamp=o}}createSampleForTrack(t,e,i,r,n){return{timestamp:i,decodeTimestamp:i,duration:r,data:e,size:e.byteLength,type:n,timescaleUnitsToNextSample:nn(r,t.timescale)}}processTimestamps(t,e){if(0===t.timestampProcessingQueue.length)return;if("audio"===t.type&&t.info.requiresPcmTransformation){this.isFragmented||(t.startTimestampOffset??=t.timestampProcessingQueue[0].timestamp);let e=0;for(let i=0;i<t.timestampProcessingQueue.length;i++){const r=t.timestampProcessingQueue[i];e+=nn(r.duration,t.timescale)}return 0===t.timeToSampleTable.length?t.timeToSampleTable.push({sampleCount:e,sampleDelta:1}):F(t.timeToSampleTable).sampleCount+=e,void(t.timestampProcessingQueue.length=0)}const i=t.timestampProcessingQueue.map(t=>t.timestamp).sort((t,e)=>t-e);this.isFragmented||(t.startTimestampOffset??=i[0]);for(let r=0;r<t.timestampProcessingQueue.length;r++){const e=t.timestampProcessingQueue[r];e.decodeTimestamp=i[r];const n=nn(e.timestamp-e.decodeTimestamp,t.timescale),o=nn(e.duration,t.timescale);if(null!==t.lastTimescaleUnits){B(t.lastSample);const i=nn(e.decodeTimestamp,t.timescale,!1),r=Math.round(i-t.lastTimescaleUnits);if(B(r>=0),t.lastTimescaleUnits+=r,t.lastSample.timescaleUnitsToNextSample=r,!this.isFragmented){let e=F(t.timeToSampleTable);if(B(e),1===e.sampleCount){e.sampleDelta=r;const i=t.timeToSampleTable[t.timeToSampleTable.length-2];i&&i.sampleDelta===r&&(i.sampleCount++,t.timeToSampleTable.pop(),e=i)}else e.sampleDelta!==r&&(e.sampleCount--,t.timeToSampleTable.push(e={sampleCount:1,sampleDelta:r}));e.sampleDelta===o?e.sampleCount++:t.timeToSampleTable.push({sampleCount:1,sampleDelta:o});const i=F(t.compositionTimeOffsetTable);B(i),i.sampleCompositionTimeOffset===n?i.sampleCount++:t.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:n})}}else t.lastTimescaleUnits=nn(e.decodeTimestamp,t.timescale,!1),this.isFragmented||(t.timeToSampleTable.push({sampleCount:1,sampleDelta:o}),t.compositionTimeOffsetTable.push({sampleCount:1,sampleCompositionTimeOffset:n}));t.lastSample=e}if(t.timestampProcessingQueue.length=0,B(t.lastSample),B(null!==t.lastTimescaleUnits),void 0!==e&&0===t.lastSample.timescaleUnitsToNextSample){B("key"===e.type);const i=nn(e.timestamp,t.timescale,!1),r=Math.round(i-t.lastTimescaleUnits);t.lastSample.timescaleUnitsToNextSample=r}}async registerSample(t,e){"key"===e.type&&this.processTimestamps(t,e),t.timestampProcessingQueue.push(e),this.isFragmented?(t.sampleQueue.push(e),await this.interleaveSamples()):"reserve"===this.fastStart?await this.registerSampleFastStartReserve(t,e):await this.addSampleToTrack(t,e)}async addSampleToTrack(t,e){if(!this.isFragmented&&(t.samples.push(e),"reserve"===this.fastStart)){const e=t.track.metadata.maximumPacketCount;if(B(void 0!==e),t.samples.length>e)throw new Error(`Track #${t.track.id} has already reached the maximum packet count (${e}). Either add less packets or increase the maximum packet count.`)}let i=!1;if(t.currentChunk){t.currentChunk.startTimestamp=Math.min(t.currentChunk.startTimestamp,e.timestamp);const r=e.timestamp-t.currentChunk.startTimestamp;if(this.isFragmented){const n=this.trackDatas.every(i=>{if(t===i)return"key"===e.type;const r=i.sampleQueue[0];return r?"key"===r.type:i.closed});r>=this.minimumFragmentDuration&&n&&e.timestamp>this.maxWrittenTimestamp&&(i=!0,await this.finalizeFragment())}else i=r>=.5}else i=!0;i&&(t.currentChunk&&await this.finalizeCurrentChunk(t),t.currentChunk={startTimestamp:e.timestamp,samples:[],offset:null,moofOffset:null}),B(t.currentChunk),t.currentChunk.samples.push(e),this.isFragmented&&(this.maxWrittenTimestamp=Math.max(this.maxWrittenTimestamp,e.timestamp),this.maxWrittenEndTimestamp=Math.max(this.maxWrittenEndTimestamp,e.timestamp+e.duration),this.minWrittenTimestamp=Math.min(this.minWrittenTimestamp,e.timestamp))}async finalizeCurrentChunk(t){if(B(!this.isFragmented),B(this.writer),!t.currentChunk)return;t.finalizedChunks.push(t.currentChunk),this.finalizedChunks.push(t.currentChunk);let e=t.currentChunk.samples.length;if("audio"===t.type&&t.info.requiresPcmTransformation&&(e=t.currentChunk.samples.reduce((e,i)=>e+nn(i.duration,t.timescale),0)),0!==t.compactlyCodedChunkTable.length&&F(t.compactlyCodedChunkTable).samplesPerChunk===e||t.compactlyCodedChunkTable.push({firstChunk:t.finalizedChunks.length,samplesPerChunk:e}),"in-memory"!==this.fastStart){t.currentChunk.offset=this.writer.getPos();for(const e of t.currentChunk.samples)B(e.data),this.writer.write(e.data),e.data=null;await this.writer.flush()}else t.currentChunk.offset=0}async interleaveSamples(t=!1){if(B(this.isFragmented),t||this.allTracksAreKnown())t:for(;;){let e=null,i=1/0;for(const n of this.trackDatas){if(!t&&0===n.sampleQueue.length&&!n.closed)break t;n.sampleQueue.length>0&&n.sampleQueue[0].timestamp<i&&(e=n,i=n.sampleQueue[0].timestamp)}if(!e)break;const r=e.sampleQueue.shift();await this.addSampleToTrack(e,r)}}async finalizeFragment(t=!this.isCmaf){B(this.isFragmented);const e=this.nextFragmentNumber++;if(1===e){const t=this.initBoxWriter??this.boxWriter;B(t),this.format.Tt.onMoov&&t.writer.startTrackingWrites(),this.ensureOneEnabledTrack();const e=Vi(this);if(t.writeBox(e),this.format.Tt.onMoov){const{data:e,start:i}=t.writer.stopTrackingWrites();this.format.Tt.onMoov(e,i)}if(this.isCmaf){B(this.initWriter),await this.initWriter.flush(),await this.initWriter.finalize(),this.writer=await this.output.Gt(!0),this.boxWriter=new li(this.writer);const t=this.boxWriter.measureBox(Pi()),e=this.boxWriter.measureBox(Ii(this,0));this.segmentHeaderSize=t+e,this.writer.seek(this.segmentHeaderSize)}}B(this.writer),B(this.boxWriter);const i=this.trackDatas.filter(t=>t.currentChunk),r=Er(e,i),n=this.writer.getPos(),o=n+this.boxWriter.measureBox(r);let s=o+8,a=1/0;for(const u of i){u.currentChunk.offset=s,u.currentChunk.moofOffset=n;for(const t of u.currentChunk.samples)s+=t.size;a=Math.min(a,u.currentChunk.startTimestamp)}const h=s-o,c=h>=2**32;if(c)for(const u of i)u.currentChunk.offset+=8;this.format.Tt.onMoof&&this.writer.startTrackingWrites();const l=Er(e,i);if(this.boxWriter.writeBox(l),this.format.Tt.onMoof){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onMoof(t,e,a)}B(this.writer.getPos()===o),this.format.Tt.onMdat&&this.writer.startTrackingWrites();const d=Fi(c);d.size=h,this.boxWriter.writeBox(d),this.writer.seek(o+(c?16:8));for(const u of i)for(const t of u.currentChunk.samples)this.writer.write(t.data),t.data=null;if(this.format.Tt.onMdat){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onMdat(t,e)}for(const u of i)u.finalizedChunks.push(u.currentChunk),this.finalizedChunks.push(u.currentChunk),u.currentChunk=null;t&&await this.writer.flush()}async registerSampleFastStartReserve(t,e){if(B(this.writer),B(this.boxWriter),this.allTracksAreKnown()){if(!this.mdat){this.ensureOneEnabledTrack();const t=Vi(this),e=this.boxWriter.measureBox(t)+this.computeSampleTableSizeUpperBound()+4096;B(null!==this.ftypSize),this.writer.seek(this.ftypSize+e),this.format.Tt.onMdat&&this.writer.startTrackingWrites(),this.mdat=Fi(!0),this.boxWriter.writeBox(this.mdat);for(const i of this.trackDatas){for(const t of i.sampleQueue)await this.addSampleToTrack(i,t);i.sampleQueue.length=0}}await this.addSampleToTrack(t,e)}else t.sampleQueue.push(e)}computeSampleTableSizeUpperBound(){B("reserve"===this.fastStart);let t=0;for(const e of this.trackDatas){const i=e.track.metadata.maximumPacketCount;B(void 0!==i),t+=8*Math.ceil(2/3*i),t+=4*i,t+=8*Math.ceil(2/3*i),t+=12*Math.ceil(2/3*i),t+=4*i,t+=8*i}return t}async onTrackClose(t){const e=await this.mutex.acquire(),i=this.trackDatas.find(e=>e.track===t);i&&(i.closed=!0,"subtitle"===i.type&&"webvtt"===t.source.kt&&await this.processWebVTTCues(i,1/0),this.processTimestamps(i)),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),this.isFragmented&&await this.interleaveSamples(),e()}ensureOneEnabledTrack(){for(const t of["video","audio","subtitle"]){const e=this.trackDatas.filter(e=>e.type===t);if(0!==e.length&&!e.some(t=>!1!==t.track.metadata.disposition?.default)){const t=e[0];t.track.metadata.disposition={...t.track.metadata.disposition,default:!0}}}}async finalize(){const t=await this.mutex.acquire();this.allTracksKnown.resolve(),this.ensureOneEnabledTrack();for(const i of this.trackDatas)i.closed=!0,"subtitle"===i.type&&"webvtt"===i.track.source.kt&&await this.processWebVTTCues(i,1/0),this.processTimestamps(i);if(this.isFragmented)await this.interleaveSamples(!0),await this.finalizeFragment(!1);else for(const i of this.trackDatas){await this.finalizeCurrentChunk(i),B(null!==i.startTimestampOffset);for(let t=0;t<i.samples.length;t++){const e=i.samples[t];e.timestamp-=i.startTimestampOffset,e.decodeTimestamp-=i.startTimestampOffset}}if(B(this.writer),B(this.boxWriter),"in-memory"===this.fastStart){let t;this.mdat=Fi(!1);for(let i=0;i<2;i++){const e=Vi(this),i=this.boxWriter.measureBox(e);t=this.boxWriter.measureBox(this.mdat);let r=this.writer.getPos()+i+t;for(const n of this.finalizedChunks){n.offset=r;for(const{data:e}of n.samples)B(e),r+=e.byteLength,t+=e.byteLength}if(r<2**32)break;t>=2**32&&(this.mdat.largeSize=!0)}this.format.Tt.onMoov&&this.writer.startTrackingWrites();const e=Vi(this);if(this.boxWriter.writeBox(e),this.format.Tt.onMoov){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onMoov(t,e)}this.format.Tt.onMdat&&this.writer.startTrackingWrites(),this.mdat.size=t,this.boxWriter.writeBox(this.mdat);for(const i of this.finalizedChunks)for(const t of i.samples)B(t.data),this.writer.write(t.data),t.data=null;if(this.format.Tt.onMdat){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onMdat(t,e)}}else if(this.isFragmented)if(this.isCmaf){const t=null!==this.segmentHeaderSize?this.writer.getPos()-this.segmentHeaderSize:0;this.writer.seek(0),this.boxWriter.writeBox(Pi()),this.boxWriter.writeBox(Ii(this,t))}else{const t=this.writer.getPos(),i=(e=this.trackDatas,Si("mfra",void 0,[...e.map(Sr),Bi("mfro",0,0,[bi(0)])]));this.boxWriter.writeBox(i);const r=this.writer.getPos()-t;this.writer.seek(this.writer.getPos()-4),this.boxWriter.writeU32(r)}else{B(this.mdat);const t=this.boxWriter.offsets.get(this.mdat);B(void 0!==t);const e=this.writer.getPos()-t;if(this.mdat.size=e,this.mdat.largeSize=e>=2**32,this.boxWriter.patchBox(this.mdat),this.format.Tt.onMdat){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onMdat(t,e)}const i=Vi(this);if("reserve"===this.fastStart){B(null!==this.ftypSize),this.writer.seek(this.ftypSize),this.format.Tt.onMoov&&this.writer.startTrackingWrites(),this.boxWriter.writeBox(i);const t=this.boxWriter.offsets.get(this.mdat)-this.writer.getPos();this.boxWriter.writeBox({type:"free",size:t})}else this.format.Tt.onMoov&&this.writer.startTrackingWrites(),this.boxWriter.writeBox(i);if(this.format.Tt.onMoov){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onMoov(t,e)}}var e;t()}},sn="Mediabunny",an={video:1,audio:2,subtitle:17},hn=class extends si{constructor(t,e){super(t),this.trackDatas=[],this.allTracksKnown=q(),this.segment=null,this.segmentInfo=null,this.seekHead=null,this.tracksElement=null,this.tagsElement=null,this.attachmentsElement=null,this.segmentDuration=null,this.cues=null,this.currentCluster=null,this.currentClusterStartMsTimestamp=null,this.currentClusterMaxMsTimestamp=null,this.trackDatasInCurrentCluster=new Map,this.startTimestamp=1/0,this.endTimestamp=-1/0,this.format=e}async start(){const t=await this.mutex.acquire();this.writer=await this.output.Gt(!!this.format.Tt.appendOnly),this.ebmlWriter=new Me(this.writer),this.writeEBMLHeader(),this.createSegmentInfo(),this.createCues(),await this.writer.flush(),t()}writeEBMLHeader(){this.format.Tt.onEbmlHeader&&this.writer.startTrackingWrites();const t={id:pe.EBML,data:[{id:pe.EBMLVersion,data:1},{id:pe.EBMLReadVersion,data:1},{id:pe.EBMLMaxIDLength,data:4},{id:pe.EBMLMaxSizeLength,data:8},{id:pe.DocType,data:this.format instanceof Mn?"webm":"matroska"},{id:pe.DocTypeVersion,data:2},{id:pe.DocTypeReadVersion,data:2}]};if(this.ebmlWriter.writeEBML(t),this.format.Tt.onEbmlHeader){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onEbmlHeader(t,e)}}maybeCreateSeekHead(t){if(this.format.Tt.appendOnly)return;const e=new Uint8Array([28,83,187,107]),i=new Uint8Array([21,73,169,102]),r=new Uint8Array([22,84,174,107]),n=new Uint8Array([25,65,164,105]),o=new Uint8Array([18,84,195,103]),s={id:pe.SeekHead,data:[{id:pe.Seek,data:[{id:pe.SeekID,data:e},{id:pe.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.cues)-this.segmentDataOffset:0}]},{id:pe.Seek,data:[{id:pe.SeekID,data:i},{id:pe.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.segmentInfo)-this.segmentDataOffset:0}]},{id:pe.Seek,data:[{id:pe.SeekID,data:r},{id:pe.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.tracksElement)-this.segmentDataOffset:0}]},this.attachmentsElement?{id:pe.Seek,data:[{id:pe.SeekID,data:n},{id:pe.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.attachmentsElement)-this.segmentDataOffset:0}]}:null,this.tagsElement?{id:pe.Seek,data:[{id:pe.SeekID,data:o},{id:pe.SeekPosition,size:5,data:t?this.ebmlWriter.offsets.get(this.tagsElement)-this.segmentDataOffset:0}]}:null]};this.seekHead=s}createSegmentInfo(){const t={id:pe.Duration,data:new ve(0)};this.segmentDuration=t;const e={id:pe.Info,data:[{id:pe.TimestampScale,data:1e6},{id:pe.MuxingApp,data:sn},{id:pe.WritingApp,data:sn},this.format.Tt.appendOnly?null:t]};this.segmentInfo=e}createTracks(){const t={id:pe.Tracks,data:[]};this.tracksElement=t;for(const e of this.trackDatas){const i=_e[e.track.source.kt];B(i);let r=0;if("audio"===e.type&&"opus"===e.track.source.kt){r=8e7;const t=e.info.decoderConfig.description;if(t){const e=fe(N(t));r=Math.round(e.preSkip/48e3*1e9)}}t.data.push({id:pe.TrackEntry,data:[{id:pe.TrackNumber,data:e.track.id},{id:pe.TrackUID,data:e.track.id},{id:pe.TrackType,data:an[e.type]},!1===e.track.metadata.disposition?.default?{id:pe.FlagDefault,data:0}:null,e.track.metadata.disposition?.forced?{id:pe.FlagForced,data:1}:null,e.track.metadata.disposition?.hearingImpaired?{id:pe.FlagHearingImpaired,data:1}:null,e.track.metadata.disposition?.visuallyImpaired?{id:pe.FlagVisualImpaired,data:1}:null,e.track.metadata.disposition?.original?{id:pe.FlagOriginal,data:1}:null,e.track.metadata.disposition?.commentary?{id:pe.FlagCommentary,data:1}:null,{id:pe.FlagLacing,data:0},{id:pe.Language,data:e.track.metadata.languageCode??"und"},{id:pe.CodecID,data:i},e.codecPrivate?{id:pe.CodecPrivate,data:N(e.codecPrivate)}:null,{id:pe.CodecDelay,data:0},{id:pe.SeekPreRoll,data:r},void 0!==e.track.metadata.name?{id:pe.Name,data:new xe(e.track.metadata.name)}:null,"video"===e.type?this.videoSpecificTrackInfo(e):null,"audio"===e.type?this.audioSpecificTrackInfo(e):null,"subtitle"===e.type?this.subtitleSpecificTrackInfo(e):null]})}}videoSpecificTrackInfo(t){const{frameRate:e,rotation:i}=t.track.metadata,r=[e?{id:pe.DefaultDuration,data:1e9/e}:null],n=i?I(-i):0,o=!!t.info.aspectRatio&&t.info.aspectRatio.num*t.info.height!==t.info.aspectRatio.den*t.info.width,s=t.info.decoderConfig.colorSpace,a={id:pe.Video,data:[{id:pe.PixelWidth,data:t.info.width},{id:pe.PixelHeight,data:t.info.height},o?{id:pe.DisplayWidth,data:t.info.aspectRatio.num}:null,o?{id:pe.DisplayHeight,data:t.info.aspectRatio.den}:null,o?{id:pe.DisplayUnit,data:3}:null,t.info.alphaMode?{id:pe.AlphaMode,data:1}:null,G(s)?{id:pe.Colour,data:[{id:pe.MatrixCoefficients,data:j[s.matrix]},{id:pe.TransferCharacteristics,data:z[s.transfer]},{id:pe.Primaries,data:O[s.primaries]},{id:pe.Range,data:s.fullRange?2:1}]}:null,n?{id:pe.Projection,data:[{id:pe.ProjectionType,data:0},{id:pe.ProjectionPoseRoll,data:new ye((n+180)%360-180)}]}:null]};return r.push(a),r}audioSpecificTrackInfo(t){const e=_t.includes(t.track.source.kt)?Dt(t.track.source.kt):null;return[{id:pe.Audio,data:[{id:pe.SamplingFrequency,data:new ye(t.info.sampleRate)},{id:pe.Channels,data:t.info.numberOfChannels},e?{id:pe.BitDepth,data:8*e.sampleSize}:null]}]}subtitleSpecificTrackInfo(t){return[]}maybeCreateTags(){const t=[],e=(e,i)=>{t.push({id:pe.SimpleTag,data:[{id:pe.TagName,data:new xe(e)},"string"==typeof i?{id:pe.TagString,data:new xe(i)}:{id:pe.TagBinary,data:i}]})},i=this.output.Mt,r=new Set;for(const{key:n,value:o}of ht(i))switch(n){case"title":e("TITLE",o),r.add("TITLE");break;case"description":e("DESCRIPTION",o),r.add("DESCRIPTION");break;case"artist":e("ARTIST",o),r.add("ARTIST");break;case"album":e("ALBUM",o),r.add("ALBUM");break;case"albumArtist":e("ALBUM_ARTIST",o),r.add("ALBUM_ARTIST");break;case"genre":e("GENRE",o),r.add("GENRE");break;case"comment":e("COMMENT",o),r.add("COMMENT");break;case"lyrics":e("LYRICS",o),r.add("LYRICS");break;case"date":e("DATE",o.toISOString().slice(0,10)),r.add("DATE");break;case"trackNumber":e("PART_NUMBER",void 0!==i.tracksTotal?`${o}/${i.tracksTotal}`:o.toString()),r.add("PART_NUMBER");break;case"discNumber":e("DISC",void 0!==i.discsTotal?`${o}/${i.discsTotal}`:o.toString()),r.add("DISC");break;case"tracksTotal":case"discsTotal":case"images":case"raw":break;default:X(n)}if(i.raw)for(const n in i.raw){const t=i.raw[n];null==t||r.has(n)||("string"==typeof t||t instanceof Uint8Array)&&e(n,t)}0!==t.length&&(this.tagsElement={id:pe.Tags,data:[{id:pe.Tag,data:[{id:pe.Targets,data:[{id:pe.TargetTypeValue,data:50},{id:pe.TargetType,data:"MOVIE"}]},...t]}]})}maybeCreateAttachments(){const t=this.output.Mt,e=[],i=new Set,r=t.images??[];for(const n of r){let t,r=n.name;for(void 0===r&&(r=("coverFront"===n.kind?"cover":"coverBack"===n.kind?"back":"image")+(ct(n.mimeType)??""));;){t=0n;for(let e=0;e<8;e++)t<<=8n,t|=BigInt(Math.floor(256*Math.random()));if(0n!==t&&!i.has(t))break}i.add(t),e.push({id:pe.AttachedFile,data:[void 0!==n.description?{id:pe.FileDescription,data:new xe(n.description)}:null,{id:pe.FileName,data:new xe(r)},{id:pe.FileMediaType,data:n.mimeType},{id:pe.FileData,data:n.data},{id:pe.FileUID,data:t}]})}for(const[n,o]of Object.entries(t.raw??{}))o instanceof gt&&/^\d+$/.test(n)&&(r.find(t=>t.mimeType===o.mimeType&&lt(t.data,o.data))||e.push({id:pe.AttachedFile,data:[void 0!==o.description?{id:pe.FileDescription,data:new xe(o.description)}:null,{id:pe.FileName,data:new xe(o.name??"")},{id:pe.FileMediaType,data:o.mimeType??""},{id:pe.FileData,data:o.data},{id:pe.FileUID,data:BigInt(n)}]}));0!==e.length&&(this.attachmentsElement={id:pe.Attachments,data:e})}createSegment(){this.createTracks(),this.maybeCreateTags(),this.maybeCreateAttachments(),this.maybeCreateSeekHead(!1);const t={id:pe.Segment,size:this.format.Tt.appendOnly?-1:6,data:[this.seekHead,this.segmentInfo,this.tracksElement,this.attachmentsElement,this.tagsElement]};if(this.segment=t,this.format.Tt.onSegmentHeader&&this.writer.startTrackingWrites(),this.ebmlWriter.writeEBML(t),this.format.Tt.onSegmentHeader){const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onSegmentHeader(t,e)}}createCues(){this.cues={id:pe.Cues,data:[]}}get segmentDataOffset(){return B(this.segment),this.ebmlWriter.dataOffsets.get(this.segment)}allTracksAreKnown(){for(const t of this.output.tracks)if(!t.source.ft&&!this.trackDatas.some(e=>e.track===t))return!1;return!0}async getMimeType(){await this.allTracksKnown.promise;const t=this.trackDatas.map(t=>"video"===t.type||"audio"===t.type?t.info.decoderConfig.codec:{webvtt:"wvtt"}[t.track.source.kt]);return(t=>{let e=(t.hasVideo?"video/":t.hasAudio?"audio/":"application/")+(t.isWebM?"webm":"x-matroska");return t.codecStrings.length>0&&(e+=`; codecs="${[...new Set(t.codecStrings.filter(Boolean))].join(", ")}"`),e})({isWebM:this.format instanceof Mn,hasVideo:this.trackDatas.some(t=>"video"===t.type),hasAudio:this.trackDatas.some(t=>"audio"===t.type),codecStrings:t})}getVideoTrackData(t,e,i){const r=this.trackDatas.find(e=>e.track===t);if(r)return r;Lt(i),B(i),B(i.decoderConfig),B(void 0!==i.decoderConfig.codedWidth),B(void 0!==i.decoderConfig.codedHeight);const n=i.decoderConfig.displayAspectWidth,o=i.decoderConfig.displayAspectHeight,s=void 0===n||void 0===o?null:dt({num:n,den:o}),a={track:t,type:"video",info:{width:i.decoderConfig.codedWidth,height:i.decoderConfig.codedHeight,aspectRatio:s,decoderConfig:i.decoderConfig,alphaMode:!!e.sideData.alpha},chunkQueue:[],lastWrittenMsTimestamp:null,codecPrivate:i.decoderConfig.description??null,closed:!1};return"vp9"===t.source.kt?a.codecPrivate=new Uint8Array((t=>{const e=t.split(".");return[1,1,Number(e[1]),2,1,Number(e[2]),3,1,Number(e[3]),4,1,e[4]?Number(e[4]):1]})(a.info.decoderConfig.codec)):"av1"===t.source.kt?a.codecPrivate=new Uint8Array(Nt(a.info.decoderConfig.codec)):"prores"===t.source.kt&&(a.codecPrivate=D.encode(i.decoderConfig.codec)),this.trackDatas.push(a),this.trackDatas.sort((t,e)=>t.track.id-e.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),a}getAudioTrackData(t,e,i){const r=this.trackDatas.find(e=>e.track===t);if(r)return r;qt(i),B(i),B(i.decoderConfig);const n={...i.decoderConfig};let o=!1;if("aac"===t.source.kt&&!n.description){const t=Ce(ni.tempFromBytes(e.data));if(!t)throw new Error("Couldn't parse ADTS header from the AAC packet. Make sure the packets are in ADTS format (as specified in ISO 13818-7) when not providing a description, or provide a description (must be an AudioSpecificConfig as specified in ISO 14496-3) and ensure the packets are raw AAC data.");const i=Et[t.samplingFrequencyIndex],r=kt[t.channelConfiguration];if(void 0===i||void 0===r)throw new Error("Invalid ADTS frame header.");n.description=Tt({objectType:t.objectType,sampleRate:i,numberOfChannels:r}),o=!0}const s={track:t,type:"audio",info:{numberOfChannels:i.decoderConfig.numberOfChannels,sampleRate:i.decoderConfig.sampleRate,decoderConfig:n,requiresAdtsStripping:o},chunkQueue:[],lastWrittenMsTimestamp:null,codecPrivate:n.description??null,closed:!1};return this.trackDatas.push(s),this.trackDatas.sort((t,e)=>t.track.id-e.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),s}getSubtitleTrackData(t,e){const i=this.trackDatas.find(e=>e.track===t);if(i)return i;Xt(e),B(e),B(e.config);const r={track:t,type:"subtitle",info:{config:e.config},chunkQueue:[],lastWrittenMsTimestamp:null,codecPrivate:D.encode(e.config.description),closed:!1};return this.trackDatas.push(r),this.trackDatas.sort((t,e)=>t.track.id-e.track.id),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),r}async addEncodedVideoPacket(t,e,i){const r=await this.mutex.acquire();try{const r=this.getVideoTrackData(t,e,i);let n=e.data;if("prores"===t.source.kt){if(n.byteLength<8)throw new Error("ProRes packet too small, expected at least 8 bytes.");n=n.subarray(8)}const o="key"===e.type;this.validateTimestamp(r.track,e.timestamp,o);let s=e.timestamp,a=e.duration;void 0!==t.metadata.frameRate&&(s=Q(s,t.metadata.frameRate),a=Q(a,t.metadata.frameRate));const h=r.info.alphaMode?e.sideData.alpha??null:null,c=this.createInternalChunk(n,s,a,e.type,h);"vp9"===t.source.kt&&this.fixVP9ColorSpace(r,c),r.chunkQueue.push(c),await this.interleaveChunks()}finally{r()}}async addEncodedAudioPacket(t,e,i){const r=await this.mutex.acquire();try{const r=this.getAudioTrackData(t,e,i);let n=e.data;if(r.info.requiresAdtsStripping){const t=Ce(ni.tempFromBytes(n));if(!t)throw new Error("Expected ADTS frame, didn't get one.");const e=null===t.crcCheck?7:9;n=n.subarray(e)}const o="key"===e.type;this.validateTimestamp(r.track,e.timestamp,o);const s=this.createInternalChunk(n,e.timestamp,e.duration,e.type);r.chunkQueue.push(s),await this.interleaveChunks()}finally{r()}}async addSubtitleCue(t,e,i){const r=await this.mutex.acquire();try{const r=this.getSubtitleTrackData(t,i);this.validateTimestamp(r.track,e.timestamp,!0);let n=e.text;const o=Math.round(1e3*e.timestamp);ai.lastIndex=0,n=n.replace(ai,t=>`<${ci((t=>{const e=hi.exec(t);if(!e)throw new Error("Expected match.");return 36e5*Number(e[1]||"0")+6e4*Number(e[2])+1e3*Number(e[3])+Number(e[4])})(t.slice(1,-1))-o)}>`);const s=D.encode(n),a=`${e.settings??""}\n${e.identifier??""}\n${e.notes??""}`,h=this.createInternalChunk(s,e.timestamp,e.duration,"key",a.trim()?D.encode(a):null);r.chunkQueue.push(h),await this.interleaveChunks()}finally{r()}}async interleaveChunks(t=!1){if(t||this.allTracksAreKnown()){t:for(;;){let e=null,i=1/0;for(const n of this.trackDatas){if(!t&&0===n.chunkQueue.length&&!n.closed)break t;n.chunkQueue.length>0&&n.chunkQueue[0].timestamp<i&&(e=n,i=n.chunkQueue[0].timestamp)}if(!e)break;const r=e.chunkQueue.shift();this.writeBlock(e,r)}t||await this.writer.flush()}}fixVP9ColorSpace(t,e){if("key"!==e.type)return;if(!t.info.decoderConfig.colorSpace||!t.info.decoderConfig.colorSpace.matrix)return;const i=new xt(e.data);i.skipBits(2);const r=i.readBits(1),n=(i.readBits(1)<<1)+r;if(3===n&&i.skipBits(1),i.readBits(1))return;if(0!==i.readBits(1))return;if(i.skipBits(2),4817730!==i.readBits(24))return;n>=2&&i.skipBits(1);const o={rgb:7,bt709:2,bt470bg:1,smpte170m:3}[t.info.decoderConfig.colorSpace.matrix];((t,e,i,r)=>{for(let n=e;n<i;n++){const e=Math.floor(n/8);let o=t[e];const s=7-(7&n);o&=~(1<<s),o|=(r&1<<i-n-1)>>i-n-1<<s,t[e]=o}})(e.data,i.pos,i.pos+3,o)}createInternalChunk(t,e,i,r,n=null){return{data:t,type:r,timestamp:e,duration:i,additions:n}}writeBlock(t,e){this.segment||this.createSegment();const i=Math.round(1e3*e.timestamp),r=this.trackDatas.every(i=>{if(t===i)return"key"===e.type;const r=i.chunkQueue[0];return r?"key"===r.type:i.closed});let n=!1;if(this.currentCluster){B(null!==this.currentClusterStartMsTimestamp),B(null!==this.currentClusterMaxMsTimestamp);const t=i-this.currentClusterStartMsTimestamp;n=r&&i>this.currentClusterMaxMsTimestamp&&t>=1e3*(this.format.Tt.minimumClusterDuration??1)||t>32767}else n=!0;n&&this.createNewCluster(i);const o=i-this.currentClusterStartMsTimestamp;if(o<-32768)return;const s=new Uint8Array(4),a=new DataView(s.buffer);a.setUint8(0,128|t.track.id),a.setInt16(1,o,!1);const h=Math.round(1e3*e.duration);if(e.additions||"subtitle"===t.type){const r={id:pe.BlockGroup,data:[{id:pe.Block,data:[s,e.data]},"delta"===e.type?{id:pe.ReferenceBlock,data:new ge(t.lastWrittenMsTimestamp-i)}:null,e.additions?{id:pe.BlockAdditions,data:[{id:pe.BlockMore,data:[{id:pe.BlockAddID,data:1},{id:pe.BlockAdditional,data:e.additions}]}]}:null,h>0?{id:pe.BlockDuration,data:h}:null]};this.ebmlWriter.writeEBML(r)}else{a.setUint8(3,Number("key"===e.type)<<7);const t={id:pe.SimpleBlock,data:[s,e.data]};this.ebmlWriter.writeEBML(t)}this.startTimestamp=Math.min(this.startTimestamp,i),this.endTimestamp=Math.max(this.endTimestamp,i+h),t.lastWrittenMsTimestamp=i,this.trackDatasInCurrentCluster.has(t)||this.trackDatasInCurrentCluster.set(t,{firstMsTimestamp:i}),this.currentClusterMaxMsTimestamp=Math.max(this.currentClusterMaxMsTimestamp,i)}createNewCluster(t){this.currentCluster&&this.finalizeCurrentCluster(),this.format.Tt.onCluster&&this.writer.startTrackingWrites(),this.currentCluster={id:pe.Cluster,size:this.format.Tt.appendOnly?-1:5,data:[{id:pe.Timestamp,data:t}]},this.ebmlWriter.writeEBML(this.currentCluster),this.currentClusterStartMsTimestamp=t,this.currentClusterMaxMsTimestamp=t,this.trackDatasInCurrentCluster.clear()}finalizeCurrentCluster(){if(B(this.currentCluster),!this.format.Tt.appendOnly){const t=this.writer.getPos()-this.ebmlWriter.dataOffsets.get(this.currentCluster),e=this.writer.getPos();this.writer.seek(this.ebmlWriter.offsets.get(this.currentCluster)+4),this.ebmlWriter.writeVarInt(t,5),this.writer.seek(e)}if(this.format.Tt.onCluster){B(null!==this.currentClusterStartMsTimestamp);const{data:t,start:e}=this.writer.stopTrackingWrites();this.format.Tt.onCluster(t,e,this.currentClusterStartMsTimestamp/1e3)}const t=this.ebmlWriter.offsets.get(this.currentCluster)-this.segmentDataOffset,e=new Map;for(const[r,{firstMsTimestamp:n}]of this.trackDatasInCurrentCluster)e.has(n)||e.set(n,[]),e.get(n).push(r);const i=[...e.entries()].sort((t,e)=>t[0]-e[0]);for(const[r,n]of i)B(this.cues),this.cues.data.push({id:pe.CuePoint,data:[{id:pe.CueTime,data:r},...n.map(e=>({id:pe.CueTrackPositions,data:[{id:pe.CueTrack,data:e.track.id},{id:pe.CueClusterPosition,data:t}]}))]})}async onTrackClose(t){const e=await this.mutex.acquire(),i=this.trackDatas.find(e=>e.track===t);i&&(i.closed=!0),this.allTracksAreKnown()&&this.allTracksKnown.resolve(),await this.interleaveChunks(),e()}async finalize(){const t=await this.mutex.acquire();this.allTracksKnown.resolve();for(const e of this.trackDatas)e.closed=!0;if(this.segment||this.createSegment(),await this.interleaveChunks(!0),this.currentCluster&&this.finalizeCurrentCluster(),B(this.cues),this.ebmlWriter.writeEBML(this.cues),!this.format.Tt.appendOnly){const t=this.writer.getPos()-this.segmentDataOffset;this.writer.seek(this.ebmlWriter.offsets.get(this.segment)+4),this.ebmlWriter.writeVarInt(t,6);const e=this.startTimestamp===1/0?0:this.endTimestamp-this.startTimestamp;this.segmentDuration.data=new ve(e),this.writer.seek(this.ebmlWriter.offsets.get(this.segmentDuration)),this.ebmlWriter.writeEBML(this.segmentDuration),B(this.seekHead),this.writer.seek(this.ebmlWriter.offsets.get(this.seekHead)),this.maybeCreateSeekHead(!0),this.ebmlWriter.writeEBML(this.seekHead)}t()}},cn=class{constructor(){this.Wt=null,this.qt=null,this.ft=!1}Xt(){if(!this.Wt)throw new Error("Source is not connected to an output track.");if("canceled"===this.Wt.output.state)throw new Error("Output has been canceled.");if("finalizing"===this.Wt.output.state||"finalized"===this.Wt.output.state)throw new Error("Output has been finalized.");if("pending"===this.Wt.output.state)throw new Error("Output has not started.");if(this.ft)throw new Error("Source is closed.")}async At(){}async Yt(t){}close(){if(this.qt)return;const t=this.Wt;if(!t)throw new Error("Cannot call close without connecting the source to an output track.");if("pending"===t.output.state)throw new Error("Cannot call close before output has been started.");this.qt=(async()=>{await this.Yt(!1),this.ft=!0,"finalizing"!==t.output.state&&"finalized"!==t.output.state&&t.output.Jt.onTrackClose(t)})()}async Qt(t){return this.qt??=(async()=>{await this.Yt(t),this.ft=!0})()}},ln=class extends cn{constructor(t){if(super(),this.Wt=null,!Mt.includes(t))throw new TypeError(`Invalid video codec '${t}'. Must be one of: ${Mt.join(", ")}.`);this.kt=t}},dn=(t,e)=>{if(t.metadata.hasOnlyKeyPackets&&"key"!==e.type)throw new Error("Cannot add non-key packets to a hasOnlyKeyPackets video track.")},un=class{setError(t){this.errorSet||(this.error=t,this.errorSet=!0)}constructor(t,e){this.source=t,this.encodingConfig=e,this.ensureEncoderPromise=null,this.encoderInitialized=!1,this.encoder=null,this.muxer=null,this.lastMultipleOfKeyFrameInterval=-1,this.emittedEncoderPackets=0,this.codedWidth=null,this.codedHeight=null,this.outputWidth=null,this.outputHeight=null,this.frameRateLastSample=null,this.frameRateLastTimestamp=null,this.frameRateLastEndTimestamp=null,this.preciseTimings=[],this.customEncoder=null,this.customEncoderCallSerializer=new et,this.customEncoderQueueSize=0,this.alphaEncoder=null,this.splitter=null,this.splitterCreationFailed=!1,this.alphaFrameQueue=[],this.error=null,this.errorSet=!1,this.lastMuxerPromise=Promise.resolve(),this.closed=!1}async add(t,e,i){const r=t;try{this.checkForEncoderError(),this.source.Xt();const n=this.encodingConfig,o=n.sizeChangeBehavior??"deny";let s=!1;if(null!==this.codedWidth&&null!==this.codedHeight){if((t.codedWidth!==this.codedWidth||t.codedHeight!==this.codedHeight)&&(s=!0,"deny"===o))throw new Error(`Video sample size must remain constant. Expected ${this.codedWidth}x${this.codedHeight}, got ${t.codedWidth}x${t.codedHeight}. To allow the sample size to change over time, set \`sizeChangeBehavior\` to a value other than 'deny' in the encoding options.`)}else this.codedWidth=t.codedWidth,this.codedHeight=t.codedHeight;if(void 0!==n.transform?.width||void 0!==n.transform?.height||void 0!==n.transform?.rotate||void 0!==n.transform?.crop||!0===n.transform?.force||s&&"passThrough"!==o){let i=n.transform?.width,r=n.transform?.height,a=n.transform?.fit??"fill";s&&"passThrough"!==o&&(B(this.outputWidth),B(this.outputHeight),B("deny"!==o),i=this.outputWidth,r=this.outputHeight,a=o);const h=await t.transform({width:i,height:r,roundDimensionsTo:2,crop:n.transform?.crop,rotate:n.transform?.rotate,fit:a,alpha:n.alpha});null!==this.outputWidth&&null!==this.outputHeight||(this.outputWidth=h.displayWidth,this.outputHeight=h.displayHeight),e&&t.close(),t=h,e=!0}else null!==this.outputWidth&&null!==this.outputHeight||(this.outputWidth=t.codedWidth,this.outputHeight=t.codedHeight);const a=n.transform?.frameRate;if(void 0!==a){const n=t.timestamp+t.duration,o=K(t.timestamp,a);if(null!==this.frameRateLastSample){if(o<=this.frameRateLastTimestamp)return this.frameRateLastSample.close(),this.frameRateLastSample=t.clone(),void(this.frameRateLastEndTimestamp=n);await this.padFrameRate(o,i)}t===r&&(t=t.clone(),e=!0),t.setTimestamp(o),t.setDuration(1/a),this.frameRateLastSample?.close(),this.frameRateLastSample=t.clone(),this.frameRateLastTimestamp=o,this.frameRateLastEndTimestamp=n}await this.processAndEncode(t,i)}finally{e&&t.close()}}async processAndEncode(t,e){const i=this.encodingConfig;let r;if(i.transform?.process){let e=i.transform.process(t);if(e instanceof Promise&&(e=await e),null===e)return;Array.isArray(e)||(e=[e]),r=e.map(e=>e instanceof Ue?e:"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?new Ue(e):new Ue(e,{timestamp:t.timestamp,duration:t.duration}))}else r=[t];try{for(const t of r){if(this.encoderInitialized||(this.ensureEncoderPromise||this.ensureEncoder(t),this.encoderInitialized||await this.ensureEncoderPromise),B(this.encoderInitialized),this.closed)break;const i=this.encodingConfig.keyFrameInterval??2,r=Math.floor(t.timestamp/i),n={...t.encodeOptions,...e},o={...n,keyFrame:void 0!==n.keyFrame?n.keyFrame:0===i||r!==this.lastMultipleOfKeyFrameInterval};if(this.lastMultipleOfKeyFrameInterval=r,this.encodingConfig.onEncodedSample?.(t),this.customEncoder){this.customEncoderQueueSize++;const e=t.clone(),i=this.customEncoderCallSerializer.call(()=>this.customEncoder.encode(e,o)).catch(t=>this.setError(t)).finally(()=>{this.customEncoderQueueSize--,e.close()});this.customEncoderQueueSize>=4&&await i}else{B(this.encoder);const e=t.toVideoFrame(),i=W(this.preciseTimings,e.timestamp,t=>t.microsecondTimestamp),r=-1!==i?this.preciseTimings[i]:null;if(r&&r.microsecondTimestamp===e.timestamp?(r.timestamp!==t.timestamp&&(r.timestampIsValid=!1),r.duration!==t.duration&&(r.durationIsValid=!1)):(this.preciseTimings.splice(i+1,0,{microsecondTimestamp:e.timestamp,timestamp:t.timestamp,duration:t.duration,timestampIsValid:!0,durationIsValid:!0}),this.preciseTimings.length>128&&this.preciseTimings.shift()),this.alphaEncoder)if(e.format&&!e.format.includes("A")||this.splitterCreationFailed)this.alphaFrameQueue.push(null),this.encoder.encode(e,o),e.close();else{this.splitter||(this.splitter=new pn);const{colorFrame:t,alphaFrame:i}=await this.splitter.split(e);this.alphaFrameQueue.push(i),this.encoder.encode(t,o),t.close()}else this.encoder.encode(e,o),e.close();this.encoder.encodeQueueSize>=4&&await new Promise(t=>this.encoder.addEventListener("dequeue",t,{once:!0}))}await this.lastMuxerPromise}}finally{for(const e of r)e!==t&&e.close()}}async padFrameRate(t,e){const i=this.encodingConfig.transform.frameRate;B(this.frameRateLastSample);const r=Math.round((t-this.frameRateLastTimestamp)*i);for(let n=1;n<r;n++){const t=this.frameRateLastSample.clone();t.setTimestamp(this.frameRateLastTimestamp+n/i),t.setDuration(1/i),await this.processAndEncode(t,e),t.close()}}ensureEncoder(t){this.ensureEncoderPromise=(async()=>{const e=ti({...this.encodingConfig,width:t.codedWidth,height:t.codedHeight,squarePixelWidth:t.squarePixelWidth,squarePixelHeight:t.squarePixelHeight,framerate:this.source.Wt?.metadata.frameRate});this.encodingConfig.onEncoderConfig?.(e);const i=ri.find(t=>t.supports(this.encodingConfig.codec,e));if(i)this.customEncoder=new i,this.customEncoder.codec=this.encodingConfig.codec,this.customEncoder.config=e,this.customEncoder.onPacket=(t,e)=>{if(!(t instanceof be))throw new TypeError("The first argument passed to onPacket must be an EncodedPacket.");if(void 0!==e&&(!e||"object"!=typeof e))throw new TypeError("The second argument passed to onPacket must be an object or undefined.");dn(this.source.Wt,t),this.encodingConfig.onEncodedPacket?.(t,e),this.lastMuxerPromise=this.muxer.addEncodedVideoPacket(this.source.Wt,t,e).catch(t=>{this.setError(t)})},this.customEncoder.onError=t=>{this.setError(t)},await this.customEncoder.init();else{if("undefined"==typeof VideoEncoder)throw new Error("VideoEncoder is not supported by this browser.");if(e.alpha="discard","keep"===this.encodingConfig.alpha&&(e.latencyMode="quality"),!(e.width%2!=1&&e.height%2!=1||"avc"!==this.encodingConfig.codec&&"hevc"!==this.encodingConfig.codec))throw new Error(`The dimensions ${e.width}x${e.height} are not supported for codec '${this.encodingConfig.codec}'; both width and height must be even numbers. Make sure to round your dimensions to the nearest even number.`);if(!(await VideoEncoder.isConfigSupported(e)).supported)throw new Error(`This specific encoder configuration (${e.codec}, ${e.bitrate} bps, ${e.width}x${e.height}, hardware acceleration: ${e.hardwareAcceleration??"no-preference"}) is not supported by this browser. Consider using another codec or changing your video parameters.`);const t=[],i=[];let r=0,n=0;const o=(t,e,i)=>{const r={};if(e){const t=new Uint8Array(e.byteLength);e.copyTo(t),r.alpha=t}let n=be.fromEncodedChunk(t,r);const o=W(this.preciseTimings,t.timestamp,t=>t.microsecondTimestamp),s=-1!==o?this.preciseTimings[o]:null;let a=null;0===this.emittedEncoderPackets&&"delta"===n.type&&i?.decoderConfig&&(a=((t,e,i)=>{switch(t){case"avc":for(const t of((t,e)=>{if(e.description){const i=1+(3&N(e.description)[4]);return Zt(t,i)}return Kt(t)})(i,e)){const e=i[t.offset],r=te(e);if(r>=bt.NON_IDR_SLICE&&r<=bt.SLICE_DPC)return"delta";if(r===bt.IDR)return"key";if(r===bt.SEI&&(!ot()||at()>=144)){const e=i.subarray(t.offset,t.offset+t.length),r=ee(e);let n=1;do{let t=0;for(;;){const e=r[n++];if(void 0===e)break;if(t+=e,e<255)break}let e=0;for(;;){const t=r[n++];if(void 0===t)break;if(e+=t,t<255)break}if(6===t){const t=new xt(r);t.pos=8*n;const e=$(t),i=t.readBits(1);if(0===e&&1===i)return"key"}n+=e}while(n<r.length-1)}}return"delta";case"hevc":for(const t of((t,e)=>{if(e.description){const i=1+(3&N(e.description)[21]);return Zt(t,i)}return Kt(t)})(i,e)){const e=ne(i[t.offset]);if(e<yt.BLA_W_LP)return"delta";if(e<=yt.RSV_IRAP_VCL23)return"key"}return"delta";case"vp8":return 1&i[0]?"delta":"key";case"vp9":{const t=new xt(i);if(2!==t.readBits(2))return null;const e=t.readBits(1);return(t.readBits(1)<<1)+e===3&&t.skipBits(1),t.readBits(1)?null:0===t.readBits(1)?"key":"delta"}case"av1":{let t=!1;for(const{type:e,data:r}of function*(t){const e=new xt(t),i=()=>{let t=0;for(let i=0;i<8;i++){const r=e.readAlignedByte();if(t|=(127&r)<<7*i,!(128&r))break;if(7===i&&128&r)return null}return t>=2**32-1?null:t};for(;e.getBitsLeft()>=8;){e.skipBits(1);const r=e.readBits(4),n=e.readBits(1),o=e.readBits(1);let s;if(e.skipBits(1),n&&e.skipBits(8),o){const t=i();if(null===t)return;s=t}else s=Math.floor(e.getBitsLeft()/8);B(e.pos%8==0),yield{type:r,data:t.subarray(e.pos/8,e.pos/8+s)},e.skipBits(8*s)}}(i))if(1===e){const e=new xt(r);e.skipBits(4),t=!!e.readBits(1)}else if(3===e||6===e||7===e){if(t)return"key";const e=new xt(r);return e.readBits(1)?null:0===e.readBits(2)?"key":"delta"}return null}case"prores":return"key";default:X(t),B(!1)}})(this.encodingConfig.codec,i.decoderConfig,n.data)),(s&&s.microsecondTimestamp===t.timestamp||null!==a)&&(n=n.clone({timestamp:s?.timestampIsValid?s.timestamp:void 0,duration:s?.durationIsValid?s.duration:void 0,type:a??void 0})),dn(this.source.Wt,n),this.encodingConfig.onEncodedPacket?.(n,i),this.lastMuxerPromise=this.muxer.addEncodedVideoPacket(this.source.Wt,n,i).catch(t=>{this.setError(t)}),this.emittedEncoderPackets++},s=new Error("Encoding error").stack;if(this.encoder=new VideoEncoder({output:(e,s)=>{if(!this.alphaEncoder)return void o(e,null,s);const a=this.alphaFrameQueue.shift();B(void 0!==a),a?(this.alphaEncoder.encode(a,{keyFrame:"key"===e.type}),n++,a.close(),t.push({chunk:e,meta:s})):0===n?o(e,null,s):(i.push(r+n),t.push({chunk:e,meta:s}))},error:t=>{t.stack=s,this.setError(t)}}),this.encoder.configure(e),"keep"===this.encodingConfig.alpha){const s=new Error("Encoding error").stack;this.alphaEncoder=new VideoEncoder({output:(e,s)=>{n--;const a=t.shift();for(B(void 0!==a),o(a.chunk,e,a.meta),r++;i.length>0&&i[0]===r;){i.shift();const e=t.shift();B(void 0!==e),o(e.chunk,null,e.meta)}},error:t=>{t.stack=s,this.setError(t)}}),this.alphaEncoder.configure(e)}}B(this.source.Wt),this.muxer=this.source.Wt.output.Jt,this.encoderInitialized=!0})()}async flushAndClose(t){if(t||this.checkForEncoderError(),!t&&this.frameRateLastSample){const t=this.encodingConfig.transform.frameRate,e=K(this.frameRateLastEndTimestamp,t);await this.padFrameRate(e)}this.closed=!0,this.frameRateLastSample?.close(),this.frameRateLastSample=null,this.customEncoder?(t||this.customEncoderCallSerializer.call(()=>this.customEncoder.flush()),await this.customEncoderCallSerializer.call(()=>this.customEncoder.close())):this.encoder&&(t||(await this.encoder.flush(),await(this.alphaEncoder?.flush()),await new Promise(t=>setTimeout(t,25))),"closed"!==this.encoder.state&&this.encoder.close(),this.alphaEncoder&&"closed"!==this.alphaEncoder.state&&this.alphaEncoder.close(),this.alphaFrameQueue.forEach(t=>t?.close()),this.splitter?.close()),t||this.checkForEncoderError()}getQueueSize(){return this.customEncoder?this.customEncoderQueueSize:this.encoder?.encodeQueueSize??0}checkForEncoderError(){if(this.errorSet)throw this.error}},fn=null,pn=class{constructor(){this.worker=null,this.pendingRequests=new Map,this.nextRequestId=0}split(t){if(!this.worker){if(!fn){const t=new Blob([`(${mn.toString()})()`],{type:"application/javascript"});fn=URL.createObjectURL(t)}this.worker=new Worker(fn),this.worker.addEventListener("message",t=>{const e=t.data,i=this.pendingRequests.get(e.id);i&&(this.pendingRequests.delete(e.id),"error"in e?i.reject(new Error(e.error)):i.resolve({colorFrame:e.colorFrame,alphaFrame:e.alphaFrame}))}),this.worker.addEventListener("error",t=>{const e=new Error(t.message||"Color/alpha splitter worker error.");for(const i of this.pendingRequests.values())i.reject(e);this.pendingRequests.clear()})}const e=this.nextRequestId++,i=q();return this.pendingRequests.set(e,i),this.worker.postMessage({id:e,sourceFrame:t},{transfer:[t]}),i.promise}close(){this.worker?.terminate(),this.worker=null;const t=new Error("Color/alpha splitter closed.");for(const e of this.pendingRequests.values())e.reject(t);this.pendingRequests.clear()}},mn=()=>{let t=null,e=Promise.resolve();self.addEventListener("message",t=>{const{id:r,sourceFrame:n}=t.data;e=e.then(async()=>{try{const{colorFrame:t,alphaFrame:e}=await i(n);self.postMessage({id:r,colorFrame:t,alphaFrame:e},{transfer:[t,e]})}catch(t){self.postMessage({id:r,error:t.message})}finally{n.close()}})});const i=async e=>{const i=e.format;if(!i)throw new Error("CPU color/alpha splitting requires a known VideoFrame format.");const o=e.allocationSize();if(t&&t.byteLength===o||(t=new Uint8Array(o)),await e.copyTo(t),"RGBA"===i||"BGRA"===i)return r(t,i,e);if("I420A"===i||"I420AP10"===i||"I420AP12"===i||"I422A"===i||"I422AP10"===i||"I422AP12"===i||"I444A"===i||"I444AP10"===i||"I444AP12"===i)return n(t,i,e);throw new Error(`CPU color/alpha splitting does not support format '${i}'.`)},r=(t,e,i)=>{const r=i.visibleRect?.width??i.codedWidth,n=i.visibleRect?.height??i.codedHeight,o=r*n,s=o+Math.ceil(r/2)*Math.ceil(n/2)*2,a=new Uint8Array(s);for(let l=0,d=3;l<o;l++,d+=4)a[l]=t[d];a.fill(128,o);const h=new VideoFrame(t,{format:"RGBA"===e?"RGBX":"BGRX",codedWidth:r,codedHeight:n,timestamp:i.timestamp,duration:i.duration??void 0}),c={format:"I420",codedWidth:r,codedHeight:n,timestamp:i.timestamp,duration:i.duration??void 0,transfer:[a.buffer]};return{colorFrame:h,alphaFrame:new VideoFrame(a,c)}},n=(t,e,i)=>{const r=i.visibleRect?.width??i.codedWidth,n=i.visibleRect?.height??i.codedHeight,o=e.includes("P10"),s=e.includes("P12"),a=o||s?2:1;let h,c;e.startsWith("I420")?(h=Math.ceil(r/2),c=Math.ceil(n/2)):e.startsWith("I422")?(h=Math.ceil(r/2),c=n):(h=r,c=n);const l=r*n,d=l*a,u=l*a+h*c*a*2,f=e.replace("A",""),p=Math.ceil(r/2)*Math.ceil(n/2),m=new Uint8Array(d+p*a*2),w=u;m.set(t.subarray(w,w+d),0);const b=d,y=o?512:s?2048:128;1===a?m.fill(y,b):new Uint16Array(m.buffer,b,2*p).fill(y);const v=o?"I420P10":s?"I420P12":"I420",g=new VideoFrame(t.subarray(0,u),{format:f,codedWidth:r,codedHeight:n,timestamp:i.timestamp,duration:i.duration??void 0}),x={format:v,codedWidth:r,codedHeight:n,timestamp:i.timestamp,duration:i.duration??void 0,transfer:[m.buffer]};return{colorFrame:g,alphaFrame:new VideoFrame(m,x)}}},wn=class extends ln{constructor(t,e){if(!("undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas))throw new TypeError("canvas must be an HTMLCanvasElement or OffscreenCanvas.");(t=>{if(!t||"object"!=typeof t)throw new TypeError("Encoding config must be an object.");if(!Mt.includes(t.codec))throw new TypeError(`Invalid video codec '${t.codec}'. Must be one of: ${Mt.join(", ")}.`);if(!(t.bitrate instanceof ei)&&(!Number.isInteger(t.bitrate)||t.bitrate<=0))throw new TypeError("config.bitrate must be a positive integer or a quality.");if(void 0!==t.keyFrameInterval&&(!Number.isFinite(t.keyFrameInterval)||t.keyFrameInterval<0))throw new TypeError("config.keyFrameInterval, when provided, must be a non-negative number.");if(void 0!==t.sizeChangeBehavior&&!["deny","passThrough","fill","contain","cover"].includes(t.sizeChangeBehavior))throw new TypeError("config.sizeChangeBehavior, when provided, must be 'deny', 'passThrough', 'fill', 'contain' or 'cover'.");if(void 0!==t.transform){if("object"!=typeof t.transform||!t.transform)throw new TypeError("config.transform, when provided, must be an object.");if(void 0!==t.transform.width&&(!Number.isInteger(t.transform.width)||t.transform.width<=0))throw new TypeError("config.transform.width, when provided, must be a positive integer.");if(void 0!==t.transform.height&&(!Number.isInteger(t.transform.height)||t.transform.height<=0))throw new TypeError("config.transform.height, when provided, must be a positive integer.");if(void 0!==t.transform.fit&&!["fill","contain","cover"].includes(t.transform.fit))throw new TypeError('config.transform.fit, when provided, must be one of "fill", "contain", or "cover".');if(void 0!==t.transform.width&&void 0!==t.transform.height&&void 0===t.transform.fit&&!["fill","contain","cover"].includes(t.sizeChangeBehavior))throw new TypeError("When both config.transform.width and config.transform.height are provided, config.transform.fit must also be provided.");if(void 0!==t.transform.fit&&["fill","contain","cover"].includes(t.sizeChangeBehavior)&&t.transform.fit!==t.sizeChangeBehavior)throw new TypeError("config.transform.fit, when provided, cannot differ from config.sizeChangeBehavior when config.sizeChangeBehavior is 'fill', 'contain' or 'cover', as sizeChangeBehavior already determines the fitting algorithm.");if(void 0!==t.transform.rotate&&![0,90,180,270].includes(t.transform.rotate))throw new TypeError("config.transform.rotate, when provided, must be 0, 90, 180 or 270.");if(void 0!==t.transform.crop&&He(t.transform.crop,"config.transform."),void 0!==t.transform.process&&"function"!=typeof t.transform.process)throw new TypeError("config.transform.process, when provided, must be a function.");if(void 0!==t.transform.frameRate&&(!Number.isFinite(t.transform.frameRate)||t.transform.frameRate<=0))throw new TypeError("config.transform.frameRate, when provided, must be a finite positive number.");if(void 0!==t.transform.force&&"boolean"!=typeof t.transform.force)throw new TypeError("config.transform.force, when provided, must be a boolean.")}if(void 0!==t.onEncodedPacket&&"function"!=typeof t.onEncodedPacket)throw new TypeError("config.onEncodedPacket, when provided, must be a function.");if(void 0!==t.onEncoderConfig&&"function"!=typeof t.onEncoderConfig)throw new TypeError("config.onEncoderConfig, when provided, must be a function.");if(void 0!==t.onEncodedSample&&"function"!=typeof t.onEncodedSample)throw new TypeError("config.onEncodedSample, when provided, must be a function.");Ze(t.codec,t)})(e),super(e.codec),this.Kt=new un(this,e),this.Zt=t}add(t,e=0,i){if(!Number.isFinite(t)||t<0)throw new TypeError("timestamp must be a non-negative number.");if(!Number.isFinite(e)||e<0)throw new TypeError("duration must be a non-negative number.");const r=new Ue(this.Zt,{timestamp:t,duration:e});return this.Kt.add(r,!0,i)}Yt(t){return this.Kt.flushAndClose(t)}},bn=class extends cn{constructor(t){if(super(),this.Wt=null,!At.includes(t))throw new TypeError(`Invalid audio codec '${t}'. Must be one of: ${At.join(", ")}.`);this.kt=t}},yn=class extends cn{constructor(t){if(super(),this.Wt=null,!St.includes(t))throw new TypeError(`Invalid subtitle codec '${t}'. Must be one of: ${St.join(", ")}.`);this.kt=t}},vn=class{getSupportedVideoCodecs(){return this.getSupportedCodecs().filter(t=>Mt.includes(t))}getSupportedAudioCodecs(){return this.getSupportedCodecs().filter(t=>At.includes(t))}getSupportedSubtitleCodecs(){return this.getSupportedCodecs().filter(t=>St.includes(t))}te(t){return""}},gn=class extends vn{constructor(t={}){if(!t||"object"!=typeof t)throw new TypeError("options must be an object.");if(void 0!==t.fastStart&&![!1,"in-memory","reserve","fragmented"].includes(t.fastStart))throw new TypeError("options.fastStart, when provided, must be false, 'in-memory', 'reserve', or 'fragmented'.");if(void 0!==t.minimumFragmentDuration&&(!Number.isFinite(t.minimumFragmentDuration)||t.minimumFragmentDuration<0))throw new TypeError("options.minimumFragmentDuration, when provided, must be a non-negative number.");if(void 0!==t.onFtyp&&"function"!=typeof t.onFtyp)throw new TypeError("options.onFtyp, when provided, must be a function.");if(void 0!==t.onMoov&&"function"!=typeof t.onMoov)throw new TypeError("options.onMoov, when provided, must be a function.");if(void 0!==t.onMdat&&"function"!=typeof t.onMdat)throw new TypeError("options.onMdat, when provided, must be a function.");if(void 0!==t.onMoof&&"function"!=typeof t.onMoof)throw new TypeError("options.onMoof, when provided, must be a function.");if(void 0!==t.metadataFormat&&!["mdir","mdta","udta","auto"].includes(t.metadataFormat))throw new TypeError("options.metadataFormat, when provided, must be either 'auto', 'mdir', 'mdta', or 'udta'.");super(),this.Tt=t}getSupportedTrackCounts(){const t=2**32-1;return{video:{min:0,max:t},audio:{min:0,max:t},subtitle:{min:0,max:t},total:{min:1,max:t}}}get supportsVideoRotationMetadata(){return!0}get supportsTimestampedMediaData(){return!0}ee(t){return new on(t,this)}},xn=class extends gn{constructor(t){super(t)}get ie(){return"MP4"}get fileExtension(){return".mp4"}get mimeType(){return"video/mp4"}getSupportedCodecs(){return[...Mt,...Ct,"pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be",...St]}te(t){return(new kn).getSupportedCodecs().includes(t)?" Switching to MOV will grant support for this codec.":""}},En=class extends gn{constructor(t){super(t)}get ie(){return"CMAF"}get fileExtension(){return".m4s"}get mimeType(){return"video/mp4"}getSupportedCodecs(){return[...Mt,...Ct,"pcm-s16","pcm-s16be","pcm-s24","pcm-s24be","pcm-s32","pcm-s32be","pcm-f32","pcm-f32be","pcm-f64","pcm-f64be",...St]}},kn=class extends gn{constructor(t){super(t)}get ie(){return"MOV"}get fileExtension(){return".mov"}get mimeType(){return"video/quicktime"}getSupportedCodecs(){return[...Mt,...At]}te(t){return(new xn).getSupportedCodecs().includes(t)?" Switching to MP4 will grant support for this codec.":""}},Tn=class extends vn{constructor(t={}){if(!t||"object"!=typeof t)throw new TypeError("options must be an object.");if(void 0!==t.appendOnly&&"boolean"!=typeof t.appendOnly)throw new TypeError("options.appendOnly, when provided, must be a boolean.");if(void 0!==t.minimumClusterDuration&&(!Number.isFinite(t.minimumClusterDuration)||t.minimumClusterDuration<0))throw new TypeError("options.minimumClusterDuration, when provided, must be a non-negative number.");if(void 0!==t.onEbmlHeader&&"function"!=typeof t.onEbmlHeader)throw new TypeError("options.onEbmlHeader, when provided, must be a function.");if(void 0!==t.onSegmentHeader&&"function"!=typeof t.onSegmentHeader)throw new TypeError("options.onHeader, when provided, must be a function.");if(void 0!==t.onCluster&&"function"!=typeof t.onCluster)throw new TypeError("options.onCluster, when provided, must be a function.");super(),this.Tt=t}ee(t){return new hn(t,this)}get ie(){return"Matroska"}getSupportedTrackCounts(){const t=127;return{video:{min:0,max:t},audio:{min:0,max:t},subtitle:{min:0,max:t},total:{min:1,max:t}}}get fileExtension(){return".mkv"}get mimeType(){return"video/x-matroska"}getSupportedCodecs(){return[...Mt,...Ct,..._t.filter(t=>!["pcm-s8","pcm-f32be","pcm-f64be","ulaw","alaw"].includes(t)),...St]}get supportsVideoRotationMetadata(){return!1}get supportsTimestampedMediaData(){return!0}},Mn=class extends Tn{constructor(t){super(t)}getSupportedCodecs(){return[...Mt.filter(t=>["vp8","vp9","av1"].includes(t)),...At.filter(t=>["opus","vorbis"].includes(t)),...St]}get ie(){return"WebM"}get fileExtension(){return".webm"}get mimeType(){return"video/webm"}te(t){return(new Tn).getSupportedCodecs().includes(t)?" Switching to MKV will grant support for this codec.":""}},_n=["video","audio","subtitle"],Cn=class t{constructor(t,e,i,r,n){this.id=t,this.output=e,this.type=i,this.source=r,this.metadata=n}isVideoTrack(){return"video"===this.type}isAudioTrack(){return"audio"===this.type}isSubtitleTrack(){return"subtitle"===this.type}canBePairedWith(e){if(!(e instanceof t))throw new TypeError("other must be an OutputTrack.");if(this===e)return!1;const i=ft(this.metadata.group),r=ft(e.metadata.group);for(const t of i){if(this.type!==e.type&&r.some(e=>t===e))return!0;if(r.some(e=>t.re.has(e)))return!0}return!1}},An=class extends Cn{constructor(t,e,i,r){super(t,e,"video",i,r)}},Sn=class extends Cn{constructor(t,e,i,r){super(t,e,"audio",i,r)}},Bn=class extends Cn{constructor(t,e,i,r){super(t,e,"subtitle",i,r)}},Pn=class t{constructor(){this.re=new Set}pairWith(e){if(!(e instanceof t))throw new TypeError("other must be an OutputTrackGroup.");if(this===e)throw new TypeError("Cannot pair a group with itself.");this.re.add(e),e.re.add(this)}},In=t=>{if(!t||"object"!=typeof t)throw new TypeError("metadata must be an object.");if(void 0!==t.languageCode&&(e=t.languageCode,!Z.test(e)))throw new TypeError("metadata.languageCode, when provided, must be a three-letter, ISO 639-2/T language code.");var e;if(void 0!==t.name&&"string"!=typeof t.name)throw new TypeError("metadata.name, when provided, must be a string.");if(void 0!==t.disposition&&(t=>{if(!t||"object"!=typeof t)throw new TypeError("disposition must be an object.");if(void 0!==t.default&&"boolean"!=typeof t.default)throw new TypeError("disposition.default must be a boolean.");if(void 0!==t.primary&&"boolean"!=typeof t.primary)throw new TypeError("disposition.primary must be a boolean.");if(void 0!==t.forced&&"boolean"!=typeof t.forced)throw new TypeError("disposition.forced must be a boolean.");if(void 0!==t.original&&"boolean"!=typeof t.original)throw new TypeError("disposition.original must be a boolean.");if(void 0!==t.commentary&&"boolean"!=typeof t.commentary)throw new TypeError("disposition.commentary must be a boolean.");if(void 0!==t.hearingImpaired&&"boolean"!=typeof t.hearingImpaired)throw new TypeError("disposition.hearingImpaired must be a boolean.");if(void 0!==t.visuallyImpaired&&"boolean"!=typeof t.visuallyImpaired)throw new TypeError("disposition.visuallyImpaired must be a boolean.")})(t.disposition),void 0!==t.maximumPacketCount&&(!Number.isInteger(t.maximumPacketCount)||t.maximumPacketCount<0))throw new TypeError("metadata.maximumPacketCount, when provided, must be a non-negative integer.");if(void 0!==t.group&&!(t.group instanceof Pn)&&(!Array.isArray(t.group)||t.group.some(t=>!(t instanceof Pn))))throw new TypeError("metadata.group, when provided, must be an OutputTrackGroup instance or an array of OutputTrackGroup instances.")},Fn=class extends pt{get target(){const t="Output.target cannot be used when using PathedTarget with an async callback. Use the 'target' event instead.";if(this.ne)throw new TypeError(t);const e=this.oe();if(e instanceof Promise)throw new TypeError(t);return e}constructor(t){if(super(),this.state="pending",this.defaultTrackGroup=new Pn,this.tracks=[],this.se=null,this.ae=new Set,this.he=null,this.ce=null,this.le=null,this.de=null,this.ue=new L,this.Mt={},this.fe=null,this.ne=null,this.pe=null,!t||"object"!=typeof t)throw new TypeError("options must be an object.");if(!(t.format instanceof vn))throw new TypeError("options.format must be an OutputFormat.");if(!(t.target instanceof Yr||t.target instanceof tn))throw new TypeError("options.target must be a Target or a PathedTarget.");if(t.target instanceof Yr&&this.me(t.target),void 0!==t.initTarget&&!(t.initTarget instanceof Yr)&&"function"!=typeof t.initTarget)throw new Error("options.initTarget, when provided, must be a Target or a function that returns or resolves to a Target.");if(void 0!==t.onFinalize&&"function"!=typeof t.onFinalize)throw new TypeError("options.onFinalize, when provided, must be a function.");this.format=t.format,this.we=t.target,this.se=t.onFinalize??null,this.be=t.initTarget??null,this.be instanceof Yr&&this.me(this.be),this.Jt=t.format.ee(this)}ye(t){B(this.we instanceof tn);const e=this.we.getTarget(t),i=t=>{if(!(t instanceof Yr))throw new TypeError("getTarget must return a Target.");return t};return e instanceof Promise?e.then(i):i(e)}async ve(t){B(this.we instanceof tn);const e=await this.ye(t);return this.rt("target",{target:e,request:t,isRoot:t.isRoot}),"canceled"===this.state?await e.Dt():this.me(e),e}me(t){this.ae.add(t),t.on("finalized",()=>this.ae.delete(t),{once:!0})}async Lt(){if(B(null!==this.be),this.be instanceof Yr)return this.be;const t=await this.be();return"canceled"===this.state?await t.Dt():this.me(t),t}Ht(){return null!==this.be}oe(){if(this.fe)return this.fe;if(this.ne)return this.ne;if(this.we instanceof Yr)return this.rt("target",{target:this.we,request:null,isRoot:!0}),this.fe=this.we,this.we;const t={path:this.we.rootPath,isRoot:!0,mimeType:this.format.mimeType},e=this.ye(t),i=e=>("canceled"===this.state?e.Dt():this.me(e),this.rt("target",{target:e,request:t,isRoot:!0}),this.fe=e,e);return e instanceof Promise?this.ne=e.then(i):i(e)}Gt(t){return this.he??=(async()=>{const e=await this.oe(),i=new Xr(e,"boolean"==typeof t?t:t(e));return i.start(),i})()}addVideoTrack(t,e={}){if(!(t instanceof ln))throw new TypeError("source must be a VideoSource.");if(In(e),void 0!==e.rotation&&![0,90,180,270].includes(e.rotation))throw new TypeError(`Invalid video rotation: ${e.rotation}. Has to be 0, 90, 180 or 270.`);if(!this.format.supportsVideoRotationMetadata&&e.rotation)throw new Error(`${this.format.ie} does not support video rotation metadata.`);if(void 0!==e.frameRate&&(!Number.isFinite(e.frameRate)||e.frameRate<=0))throw new TypeError(`Invalid video frame rate: ${e.frameRate}. Must be a positive number.`);const i={...e};return i.group??=this.defaultTrackGroup,this.ge(new An(this.tracks.length+1,this,t,i))}addAudioTrack(t,e={}){if(!(t instanceof bn))throw new TypeError("source must be an AudioSource.");In(e);const i={...e};return i.group??=this.defaultTrackGroup,this.ge(new Sn(this.tracks.length+1,this,t,i))}addSubtitleTrack(t,e={}){if(!(t instanceof yn))throw new TypeError("source must be a SubtitleSource.");In(e);const i={...e};return i.group??=this.defaultTrackGroup,this.ge(new Bn(this.tracks.length+1,this,t,i))}setMetadataTags(t){if((t=>{if(!t||"object"!=typeof t)throw new TypeError("tags must be an object.");if(void 0!==t.title&&"string"!=typeof t.title)throw new TypeError("tags.title, when provided, must be a string.");if(void 0!==t.description&&"string"!=typeof t.description)throw new TypeError("tags.description, when provided, must be a string.");if(void 0!==t.artist&&"string"!=typeof t.artist)throw new TypeError("tags.artist, when provided, must be a string.");if(void 0!==t.album&&"string"!=typeof t.album)throw new TypeError("tags.album, when provided, must be a string.");if(void 0!==t.albumArtist&&"string"!=typeof t.albumArtist)throw new TypeError("tags.albumArtist, when provided, must be a string.");if(void 0!==t.trackNumber&&(!Number.isInteger(t.trackNumber)||t.trackNumber<=0))throw new TypeError("tags.trackNumber, when provided, must be a positive integer.");if(void 0!==t.tracksTotal&&(!Number.isInteger(t.tracksTotal)||t.tracksTotal<=0))throw new TypeError("tags.tracksTotal, when provided, must be a positive integer.");if(void 0!==t.discNumber&&(!Number.isInteger(t.discNumber)||t.discNumber<=0))throw new TypeError("tags.discNumber, when provided, must be a positive integer.");if(void 0!==t.discsTotal&&(!Number.isInteger(t.discsTotal)||t.discsTotal<=0))throw new TypeError("tags.discsTotal, when provided, must be a positive integer.");if(void 0!==t.genre&&"string"!=typeof t.genre)throw new TypeError("tags.genre, when provided, must be a string.");if(void 0!==t.date&&(!(t.date instanceof Date)||Number.isNaN(t.date.getTime())))throw new TypeError("tags.date, when provided, must be a valid Date.");if(void 0!==t.lyrics&&"string"!=typeof t.lyrics)throw new TypeError("tags.lyrics, when provided, must be a string.");if(void 0!==t.images){if(!Array.isArray(t.images))throw new TypeError("tags.images, when provided, must be an array.");for(const e of t.images){if(!e||"object"!=typeof e)throw new TypeError("Each image in tags.images must be an object.");if(!(e.data instanceof Uint8Array))throw new TypeError("Each image.data must be a Uint8Array.");if("string"!=typeof e.mimeType)throw new TypeError("Each image.mimeType must be a string.");if(!["coverFront","coverBack","unknown"].includes(e.kind))throw new TypeError("Each image.kind must be 'coverFront', 'coverBack', or 'unknown'.")}}if(void 0!==t.comment&&"string"!=typeof t.comment)throw new TypeError("tags.comment, when provided, must be a string.");if(void 0!==t.raw){if(!t.raw||"object"!=typeof t.raw)throw new TypeError("tags.raw, when provided, must be an object.");for(const e of Object.values(t.raw))if(!(null===e||"string"==typeof e||e instanceof Uint8Array||e instanceof vt||e instanceof gt||mt(e)))throw new TypeError("Each value in tags.raw must be a string, Uint8Array, RichImageData, AttachedFile, Record<string, string>, or null.")}})(t),"pending"!==this.state)throw new Error("Cannot set metadata tags after output has been started or canceled.");this.Mt=t}ge(t){if("pending"!==this.state)throw new Error("Cannot add track after output has been started or canceled.");if(t.source.Wt)throw new Error("Source is already used for a track.");const e=this.format.getSupportedTrackCounts(),i=this.tracks.reduce((e,i)=>e+(i.type===t.type?1:0),0),r=e[t.type].max;if(i===r)throw new Error(0===r?`${this.format.ie} does not support ${t.type} tracks.`:`${this.format.ie} does not support more than ${r} ${t.type} track${1===r?"":"s"}.`);const n=e.total.max;if(this.tracks.length===n)throw new Error(`${this.format.ie} does not support more than ${n} tracks${1===n?"":"s"} in total.`);if(t.isVideoTrack()){const e=this.format.getSupportedVideoCodecs();if(0===e.length)throw new Error(`${this.format.ie} does not support video tracks.`+this.format.te(t.source.kt));if(!e.includes(t.source.kt))throw new Error(`Codec '${t.source.kt}' cannot be contained within ${this.format.ie}. Supported video codecs are: ${e.map(t=>`'${t}'`).join(", ")}.`+this.format.te(t.source.kt))}else if(t.isAudioTrack()){const e=this.format.getSupportedAudioCodecs();if(0===e.length)throw new Error(`${this.format.ie} does not support audio tracks.`+this.format.te(t.source.kt));if(!e.includes(t.source.kt))throw new Error(`Codec '${t.source.kt}' cannot be contained within ${this.format.ie}. Supported audio codecs are: ${e.map(t=>`'${t}'`).join(", ")}.`+this.format.te(t.source.kt))}else if(t.isSubtitleTrack()){const e=this.format.getSupportedSubtitleCodecs();if(0===e.length)throw new Error(`${this.format.ie} does not support subtitle tracks.`+this.format.te(t.source.kt));if(!e.includes(t.source.kt))throw new Error(`Codec '${t.source.kt}' cannot be contained within ${this.format.ie}. Supported subtitle codecs are: ${e.map(t=>`'${t}'`).join(", ")}.`+this.format.te(t.source.kt))}return this.tracks.push(t),t.source.Wt=t,t}hasEnoughTracks(){const t=this.format.getSupportedTrackCounts();for(const i of _n)if(this.tracks.reduce((t,e)=>t+(e.type===i?1:0),0)<t[i].min)return!1;const e=t.total.min;return!(this.tracks.length<e)}async start(){const t=this.format.getSupportedTrackCounts();for(const i of _n){const e=this.tracks.reduce((t,e)=>t+(e.type===i?1:0),0),r=t[i].min;if(e<r)throw new Error(r===t[i].max?`${this.format.ie} requires exactly ${r} ${i} track${1===r?"":"s"}.`:`${this.format.ie} requires at least ${r} ${i} track${1===r?"":"s"}.`)}const e=t.total.min;if(this.tracks.length<e)throw new Error(e===t.total.max?`${this.format.ie} requires exactly ${e} track${1===e?"":"s"}.`:`${this.format.ie} requires at least ${e} track${1===e?"":"s"}.`);if("canceled"===this.state)throw new Error("Output has been canceled.");return this.ce?(wt.ct("Output has already been started."),this.ce):this.ce=(async()=>{this.state="started";const t=await this.ue.acquire();try{await this.Jt.start();const t=this.tracks.map(t=>t.source.At());await Promise.all(t)}finally{t()}})()}getMimeType(){return this.Jt.getMimeType()}async cancel(){return this.le?(wt.ct("Output has already been canceled."),this.le):"finalizing"!==this.state&&"finalized"!==this.state?this.le=(async()=>{this.state="canceled";const t=await this.ue.acquire();try{const t=this.tracks.map(t=>t.source.Qt(!0));await Promise.all(t),await Promise.all([...this.ae].map(t=>t.Dt())),this.ae.clear()}finally{t()}})():void("finalized"===this.state&&wt.ct("Output has already been finalized."))}async finalize(){if("pending"===this.state)throw new Error("Cannot finalize before starting.");if("canceled"===this.state)throw new Error("Cannot finalize after canceling.");return this.de?(wt.ct("Output has already been finalized."),this.de):this.de=(async()=>{this.state="finalizing";const t=await this.ue.acquire();try{const t=this.tracks.map(t=>t.source.Qt(!1));if(await Promise.all(t),await this.Jt.finalize(),this.he){const t=await this.he;t.finalized||(await t.flush(),await t.finalize())}this.se&&await this.se(),this.state="finalized"}finally{t()}})()}},Vn=["vp9","vp8"],$n=["avc"],Un=class{xe;Ee;ke;q=[];constructor(t,e,i){this.xe=t,this.Ee=e,this.ke=i}get pendingCount(){return this.q.length}enqueue(t){let e;try{e=Promise.resolve(this.xe.add(t/this.Ee.frameRate,1/this.Ee.frameRate))}catch(i){e=Promise.reject(i)}e.catch(()=>{}),this.q.push(e)}async drainOne(t){if(0===this.q.length)return;const e=await E(Promise.race(this.q.map((t,e)=>t.then(()=>({index:e,error:null}),t=>({index:e,error:t})))),`Video encoder did not drain within ${this.ke}ms.`,t,this.ke);if(this.q.splice(e.index,1),e.error)throw e.error}async drainAll(t,e){for(;this.q.length>0;)await this.drainOne(t),e()}},Nn=class{async $record(t,e,i){this.j(t.signal),this.Te();const r=await this.Me(t);this._e(t,"video export plan",r),this.Ce(i,"recording","probing",0,r.frameCount);const n="mp4"===r.format?new xn:new Mn,o=new Kr,s=new Fn({format:n,target:o}),a=s,h=new wn(e.canvas,{codec:r.codec,bitrate:r.bitrate,alpha:r.transparent?"keep":"discard",bitrateMode:r.bitrateMode,latencyMode:r.latencyMode,hardwareAcceleration:r.hardwareAcceleration,keyFrameInterval:r.keyFrameInterval,sizeChangeBehavior:"deny"}),c=new Un(h,r,3e4);s.addVideoTrack(h);try{if(await E(s.start(),"Video output did not start within 30000ms.",t.signal,3e4),await e.$render({frameCount:r.frameCount,frameRate:r.frameRate,signal:t.signal,prepareFrame:t.prepareFrame,onFrame:async({frameIndex:e})=>{this.j(t.signal),c.enqueue(e),this.Ce(i,"recording","capturing",e+1,r.frameCount),await this.Ae(c,i,r,e+1,t.signal),this.Se(e,r.frameCount)&&await this.et(t.signal)}}),this.j(t.signal),await this.Be(c,i,r,t.signal),this.Ce(i,"encoding","finalizing",r.frameCount,r.frameCount),await E(s.finalize(),"Video output did not finalize within 30000ms.",t.signal,3e4),this.Ce(i,"completed","finalizing",r.frameCount,r.frameCount),!o.buffer)throw new g("VIDEO_EXPORT_FAILED","Video encoder finalized without producing data.");return new Blob([o.buffer],{type:r.mimeType})}catch(l){try{await a.cancel()}catch{}const t=this.Pe(l);throw i?.({state:"error",message:t.message}),t}}async Ae(t,e,i,r,n){t.pendingCount<4||(await t.drainOne(n),this.Ce(e,"recording","draining",r,i.frameCount))}async Be(t,e,i,r){await t.drainAll(r,()=>{this.j(r),this.Ce(e,"encoding","draining",i.frameCount,i.frameCount)})}Se(t,e){const i=t+1;return i<e&&i%4==0}et(t){return new Promise((e,i)=>{if(t?.aborted)return void i(x());let r=null,n=null,o=!1;const s=e=>{o||(o=!0,null!==r&&"function"==typeof globalThis.cancelAnimationFrame&&globalThis.cancelAnimationFrame(r),null!==n&&clearTimeout(n),t?.removeEventListener("abort",a),e())},a=()=>s(()=>i(x())),h=()=>s(e);t?.addEventListener("abort",a,{once:!0}),"function"!=typeof globalThis.requestAnimationFrame?n=setTimeout(h,0):r=globalThis.requestAnimationFrame(()=>{r=null,n=setTimeout(h,0)})})}async Me(t){if("mp4"===t.format&&t.transparent)throw new g("VIDEO_TRANSPARENCY_UNSUPPORTED","MP4/H.264 export does not support portable alpha. Use saveVideo({ format: 'webm', transparent: true }) instead.");const e=Math.max(1,Math.round(t.width)),i=Math.max(1,Math.round(t.height)),r=this.Ie(t.bitrate,e,i),n="mp4"===t.format?new xn:new Mn,o="mp4"===t.format?$n:Vn,s=await(async(t,e)=>{for(const i of t)if(await ii(i,e))return i;return null})(n.getSupportedVideoCodecs().filter(t=>o.includes(t)),{width:e,height:i,bitrate:r});if(!s)throw new g("VIDEO_CODEC_UNSUPPORTED",`This browser cannot encode ${o.join(" or ")} at ${e}x${i}. Try a browser/device with native WebCodecs encoding support or reduce the export dimensions.`);return{format:t.format,extension:"mp4"===t.format?".mp4":".webm",mimeType:n.mimeType,codec:s,bitrate:r,bitrateMode:t.bitrateMode,latencyMode:t.latencyMode,hardwareAcceleration:t.hardwareAcceleration,keyFrameInterval:t.keyFrameInterval,frameRate:t.frameRate,frameCount:t.frameCount,width:e,height:i,transparent:t.transparent}}Te(){const t=globalThis;if("function"!=typeof t.VideoEncoder||"function"!=typeof t.VideoFrame)throw new g("VIDEO_EXPORT_UNSUPPORTED","Video export requires native WebCodecs VideoEncoder and VideoFrame support. This browser cannot produce deterministic video exports without a native encoder.")}Ie(t,e,i){if("number"==typeof t&&Number.isFinite(t)&&t>0)return Math.round(t);const r="string"==typeof t?t:"medium",n=Math.max(1,e)*Math.max(1,i);return Math.max(25e4,Math.round(n*("high"===r?6:"low"===r?1.5:3)))}j(t){if(t?.aborted)throw x()}Ce(t,e,i,r,n){t?.({state:e,phase:i,frameIndex:r,frame:r,totalFrames:n,progress:n>0?r/n:0})}Pe(t){return t instanceof g?t:new g("VIDEO_EXPORT_FAILED",t instanceof Error?t.message:"Video export failed.",t)}_e(t,...e){t.debugLogging&&console.debug("[textmode-export]",...e)}},Rn=class{Fe;C;A;constructor(t,e){this.Fe=new Nn,this.C=t,this.A=e}async $saveVideo(t={}){const e=t.format??"mp4",i=await this.$generateVideoBlob(t);(new n).$downloadFile(i,this.Ve(t.filename,`.${e}`))}async $generateVideoBlob(t={}){const e=t.format??"mp4",i=this.T(e,t),r=new k(this.C,this.A,i.width,i.height);try{return await this.Fe.$record(i,r,t.onProgress)}catch(n){throw t.onProgress?.({state:"error",message:n instanceof Error?n.message:`${e.toUpperCase()} export failed`}),n}}T(t,e){const i=this.$e(e.frameRate,60),r=this.$e(e.frameCount,300),n=this.Ue(e.pixelDensity,1),o=this.Ne(),s=Math.max(1,Math.round(this.C.canvas.width/o*n)),a=Math.max(1,Math.round(this.C.canvas.height/o*n));return{filename:e.filename,format:t,frameRate:i,frameCount:r,bitrate:this.Re(e.bitrate),bitrateMode:this.De(e.bitrateMode),latencyMode:this.Oe(e.latencyMode),hardwareAcceleration:this.ze(e.hardwareAcceleration),keyFrameInterval:this.je(e.keyFrameInterval),pixelDensity:n,width:s,height:a,transparent:Boolean(e.transparent),debugLogging:Boolean(e.debugLogging),signal:e.signal,prepareFrame:e.prepareFrame}}$e(t,e){return Number.isFinite(t)?Math.max(1,Math.round(Math.abs(t))):e}Ue(t,e){return Number.isFinite(t)?Math.max(Number.EPSILON,Math.abs(t)):e}Re(t){return"number"==typeof t&&Number.isFinite(t)&&t>0||"low"===t||"medium"===t||"high"===t?t:"medium"}De(t){return"constant"===t||"variable"===t?t:"variable"}Oe(t){return"quality"===t||"realtime"===t?t:"quality"}ze(t){return"prefer-hardware"===t||"prefer-software"===t||"no-preference"===t?t:"no-preference"}je(t){return Number.isFinite(t)?Math.max(0,Math.abs(t)):2}Ne(){const t=this.C.pixelDensity?.();return"number"==typeof t&&Number.isFinite(t)&&t>0?t:1}Ve(t,e){if(!t)return;const i=t.trim();return i?i.toLowerCase().endsWith(e)?i:`${i}${e}`:void 0}},Dn=class extends r{$extractCellData(t){const e=this.$extractFramebufferData(t.drawFramebuffer),i=[],r=t.grid,n=t.font;let o=0;for(let s=0;s<r.rows;s++)for(let t=0;t<r.cols;t++){const r=4*o,h=this.$getEncodedCharacterValue(e.characterPixels,r),c=this.$extractCellTransform(e.characterPixels,r),l=a(n,h)?.character??" ";i.push({x:t,y:s,character:l,foreground:d(e.primaryColorPixels,r),background:d(e.secondaryColorPixels,r),transform:{invert:c.isInverted,flipX:c.flipHorizontal,flipY:c.flipVertical,rotation:c.rotation}}),o++}return i}},On="1.7.1",zn="textmode.document",jn="2.0.0",Gn={[e.LayerBlendMode.NORMAL]:"normal",[e.LayerBlendMode.ADDITIVE]:"additive",[e.LayerBlendMode.MULTIPLY]:"multiply",[e.LayerBlendMode.SCREEN]:"screen",[e.LayerBlendMode.SUBTRACT]:"subtract",[e.LayerBlendMode.DARKEN]:"darken",[e.LayerBlendMode.LIGHTEN]:"lighten",[e.LayerBlendMode.OVERLAY]:"overlay",[e.LayerBlendMode.SOFT_LIGHT]:"softLight",[e.LayerBlendMode.HARD_LIGHT]:"hardLight",[e.LayerBlendMode.COLOR_DODGE]:"colorDodge",[e.LayerBlendMode.COLOR_BURN]:"colorBurn",[e.LayerBlendMode.DIFFERENCE]:"difference",[e.LayerBlendMode.EXCLUSION]:"exclusion"},Hn=class{T(t){return{target:t.target??"selected",pretty:t.pretty??!0,colorMode:t.colorMode??"hex",includeMetadata:t.includeMetadata??!0,filename:t.filename,layer:t.layer}}Ge(t){return t.includeMetadata?{createdAt:(new Date).toISOString(),generator:{name:"textmode.export.js",version:On}}:void 0}He(t,e){return"rgba"===e?{...t}:`#${[t.r,t.g,t.b,t.a].map(t=>t.toString(16).padStart(2,"0")).join("")}`}Le(t,e,i,r){const n=[];for(let o=0;o<i;o++){const i=o*e,s=t.slice(i,i+e).map(t=>({x:t.x,y:t.y,character:t.character,foreground:this.He(t.foreground,r),background:this.He(t.background,r),transform:{...t.transform}}));n.push(s)}return{encoding:"object-rows-v1",rows:n}}We(t){return{cols:t.grid.cols,rows:t.grid.rows,cellWidth:t.grid.cellWidth,cellHeight:t.grid.cellHeight}}qe(t,e){const i=(new Dn).$extractCellData(t);return this.Le(i,t.grid.cols,t.grid.rows,e.colorMode)}Xe(t,e){return{id:t.id,visible:t.visible,opacity:t.opacity,blendMode:Gn[t.blendMode],offsetX:t.offsetX,offsetY:t.offsetY,rotationZ:t.rotationZ,grid:this.We(t),cells:this.qe(t,e)}}$generateJSONData(t,i={}){const r=this.T(i),n=this.Ge(r);if("all"===r.target){const i=function(t){return[t.layers.base,...t.layers.all].map(i=>{const r=i;return{...l(t,i),visible:r.o??!0,opacity:r.Ye??1,blendMode:r.Je??e.LayerBlendMode.NORMAL,offsetX:r.Qe??0,offsetY:r.Ke??0,rotationZ:r.Ze??0}})}(t),o=i[0].grid;return{format:zn,formatVersion:jn,target:"all",...n?{metadata:n}:{},canvas:{width:o.width,height:o.height},layers:i.map(t=>this.Xe(t,r))}}const o=l(t,r.layer);return{format:zn,formatVersion:jn,target:"selected",...n?{metadata:n}:{},canvas:{width:o.grid.width,height:o.grid.height},grid:this.We(o),layer:{id:o.id,cells:this.qe(o,r)}}}$generateJSONString(t,e={}){const i=this.T(e),r=this.$generateJSONData(t,i),n="number"==typeof i.pretty?i.pretty:i.pretty?2:0;return JSON.stringify(r,null,n)}$saveJSON(t,e={}){const i=this.T(e);(new n).$downloadFile(new Blob([this.$generateJSONString(t,i)],{type:"application/json;charset=utf-8"}),i.filename)}},Ln="textmode-export-overlay__stack",Wn="textmode-export-overlay__stack--dense",qn="textmode-export-overlay__stack--compact",Xn="textmode-export-overlay__section",Yn="textmode-export-overlay--dragging",Jn="textmode-export-overlay__label",Qn="textmode-export-overlay__field",Kn="textmode-export-overlay__field--compact",Zn="textmode-export-overlay__field--dense",to="textmode-export-overlay__field--full",eo="textmode-export-overlay__field--channel",io="textmode-export-overlay__input",ro="textmode-export-overlay__muted",no="textmode-export-overlay__button--primary",oo="textmode-export-overlay__button--secondary",so="textmode-export-overlay__button--full",ao="textmode-export-overlay__link-icon",ho=class{element;mounted=!1;destroyed=!1;mount(t){if(this.destroyed)throw new Error("Cannot mount a destroyed component");if(this.mounted)return;const e=this.render();t.appendChild(e),this.element=e,this.onMount(),this.mounted=!0}unmount(){this.mounted&&this.element&&(this.ti(),this.element.remove(),this.element=void 0,this.mounted=!1)}destroy(){this.destroyed||(this.unmount(),this.ei(),this.destroyed=!0)}update(t){this.mounted&&this.onUpdate(t)}onMount(){}ti(){}ei(){}onUpdate(t){}get root(){if(!this.element)throw new Error("Component is not mounted yet");return this.element}isMounted(){return this.mounted}},co=class t extends ho{static ii="http://www.w3.org/2000/svg";ri;get dragHandleElement(){if(!this.ri)throw new Error("Header drag handle is not mounted yet");return this.ri}render(){this.ri=void 0;const t=document.createElement("div");t.classList.add(Ln,Wn,"textmode-export-overlay__header");const e=document.createElement("div");e.classList.add("textmode-export-overlay__header-title-row");const i=document.createElement("div");i.classList.add("textmode-export-overlay__header-identity");const r=this.ni("Move export overlay","textmode-export-overlay__grab-handle",[{d:"M9 5h.01"},{d:"M15 5h.01"},{d:"M9 12h.01"},{d:"M15 12h.01"},{d:"M9 19h.01"},{d:"M15 19h.01"}]);this.ri=r;const n=document.createElement("strong");n.textContent="textmode.export.js",n.classList.add("textmode-export-overlay__title");const o=document.createElement("div");o.classList.add("textmode-export-overlay__header-links");const s=this.oi("https://github.com/humanbydefinition/textmode.export.js","View repository on GitHub",ao,[{d:"M0 0h24v24H0z",fill:"none",stroke:"none"},{d:"M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5"}]),a=this.oi("https://code.textmode.art/docs/support","Support textmode.export.js","textmode-export-overlay__support-icon",[{d:"M0 0h24v24H0z",fill:"none",stroke:"none"},{d:"M3 14c.83 .642 2.077 1.017 3.5 1c1.423 .017 2.67 -.358 3.5 -1c.83 -.642 2.077 -1.017 3.5 -1c1.423 -.017 2.67 .358 3.5 1"},{d:"M8 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2"},{d:"M12 3a2.4 2.4 0 0 0 -1 2a2.4 2.4 0 0 0 1 2"},{d:"M3 10h14v5a6 6 0 0 1 -6 6h-2a6 6 0 0 1 -6 -6v-5z"},{d:"M16.746 16.726a3 3 0 1 0 .252 -5.555"}]);o.appendChild(s),o.appendChild(a),i.appendChild(r),i.appendChild(n),e.appendChild(i),e.appendChild(o);const h=document.createElement("div");return h.classList.add("textmode-export-overlay__divider"),t.appendChild(e),t.appendChild(h),t}ni(t,e,i){const r=document.createElement("button");return r.type="button",r.classList.add(e),r.setAttribute("aria-label",t),r.title=t,r.appendChild(this.si(ao,i)),r}oi(t,e,i,r){const n=document.createElement("a");return n.href=t,n.target="_blank",n.rel="noopener noreferrer",n.classList.add("textmode-export-overlay__support-link"),n.setAttribute("aria-label",e),n.appendChild(this.si(i,r)),n}si(e,i){const r=document.createElementNS(t.ii,"svg");r.setAttribute("xmlns",t.ii),r.setAttribute("width","18"),r.setAttribute("height","18"),r.setAttribute("viewBox","0 0 24 24"),r.setAttribute("fill","none"),r.setAttribute("stroke","currentColor"),r.setAttribute("stroke-width","2"),r.setAttribute("stroke-linecap","round"),r.setAttribute("stroke-linejoin","round"),r.classList.add(e);for(const n of i){const e=document.createElementNS(t.ii,"path");for(const[t,i]of Object.entries(n))e.setAttribute(t,i);r.appendChild(e)}return r}},lo=class extends ho{props;constructor(t){super(),this.props=t}render(){const t=document.createElement("div");t.classList.add(Qn),this.applyVariant(t,this.props.variant);const e=document.createElement("label");if(e.classList.add(Jn),e.textContent=this.props.label,this.props.labelFor&&(e.htmlFor=this.props.labelFor),t.appendChild(e),this.props.description){const e=document.createElement("span");e.classList.add(ro),e.textContent=this.props.description,t.appendChild(e)}return t}attachControl(t){this.root.appendChild(t)}update(t){this.props=t,super.update(t)}onUpdate(t){const e=this.root;for(;e.firstChild;)e.removeChild(e.firstChild);this.props=t,e.classList.add(Qn),this.applyVariant(e,t.variant);const i=document.createElement("label");if(i.classList.add(Jn),i.textContent=t.label,t.labelFor&&(i.htmlFor=t.labelFor),e.appendChild(i),t.description){const i=document.createElement("span");i.classList.add(ro),i.textContent=t.description,e.appendChild(i)}}applyVariant(t,e){switch(t.classList.remove(Kn,Zn,to,eo),e){case"compact":t.classList.add(Kn);break;case"dense":t.classList.add(Zn);break;case"full":t.classList.add(to);break;case"channel":t.classList.add(eo)}}},uo=class extends ho{props;select;handleChange=()=>{this.props.defaultValue=this.select.value};constructor(t){super(),this.props=t}render(){return this.select=document.createElement("select"),this.select.classList.add(io),this.props.id&&(this.select.id=this.props.id),this.populateOptions(),this.select.addEventListener("change",this.handleChange),this.select}get selectElement(){return this.select}get value(){return this.select.value}set value(t){this.select&&(this.select.value=t),this.props.defaultValue=t}ti(){this.select.removeEventListener("change",this.handleChange)}onUpdate(t){this.props=t,this.populateOptions(),t.defaultValue&&(this.select.value=t.defaultValue)}update(t){this.props={...this.props,...t},this.select&&(t.id&&(this.select.id=t.id),t.options&&this.populateOptions(),void 0!==t.defaultValue&&(this.select.value=t.defaultValue))}populateOptions(){if(this.select){this.select.innerHTML="";for(const t of this.props.options){const e=document.createElement("option");e.value=t.value,e.textContent=t.label,this.select.appendChild(e)}this.props.defaultValue&&(this.select.value=this.props.defaultValue)}}},fo=class extends ho{props;button;constructor(t){super(),this.props=t}render(){return this.button=document.createElement("button"),this.button.type="button",this.button.textContent=this.props.label,this.button.classList.add("textmode-export-overlay__button"),"secondary"===this.props.variant?this.button.classList.add(oo):this.button.classList.add(no),this.props.fullWidth&&this.button.classList.add(so),this.button.disabled=Boolean(this.props.disabled),this.button}get buttonElement(){return this.button}setLabel(t){this.props.label=t,this.button.textContent=t}setDisabled(t){this.props.disabled=t,this.button.disabled=t}onUpdate(t){this.props=t,this.button.textContent=t.label,this.button.disabled=Boolean(t.disabled),"secondary"===t.variant?(this.button.classList.add(oo),this.button.classList.remove(no)):(this.button.classList.add(no),this.button.classList.remove(oo)),this.button.classList.toggle(so,Boolean(t.fullWidth))}},po=class{it={};ai(t){const e=this.it[t];if(e)return e;const i=new Set;return this.it[t]=i,i}$on(t,e){const i=this.ai(t);return i.add(e),()=>{i.delete(e),0===i.size&&delete this.it[t]}}$emit(t,e){const i=this.it[t];if(i)for(const n of[...i])try{n(e)}catch(r){console.error("[textmode-export] Event handler failed",r)}}$clear(){for(const t of Object.keys(this.it))delete this.it[t]}},mo=class{hi;it=new Set;constructor(t){this.hi=t}get snapshot(){return Object.freeze({...this.hi})}$set(t){const e=Object.keys(t);if(0===e.length)return;let i=!1;for(const o of e)if(this.hi[o]!==t[o]){i=!0;break}if(!i)return;this.hi=Object.assign({},this.hi,t);const r=this.snapshot;for(const o of[...this.it])try{o(r)}catch(n){console.error("[textmode-export] State listener failed",n)}}$subscribe(t){return this.it.add(t),t(this.snapshot),()=>{this.it.delete(t)}}$reset(t){this.hi=t;const e=this.snapshot;for(const i of[...this.it])i(e)}},wo=new Set(["txt","json","svg","image"]),bo=class{api;constructor(t){this.api=t}async $copy(t,e){switch(t){case"txt":{const t=this.api.toString(e);await navigator.clipboard.writeText(t);break}case"json":{const t=this.api.toJSONString(e);await navigator.clipboard.writeText(t);break}case"svg":{const t=this.api.toSVG(e);await navigator.clipboard.writeText(t);break}case"image":await this.api.copyCanvas(e);break;default:throw new Error(`Clipboard not supported for ${t}`)}}static isClipboardFormat(t){return wo.has(t)}},yo={txt:(t,e)=>Promise.resolve(t.saveStrings(e)),json:(t,e)=>Promise.resolve(t.saveJSON(e)),image:(t,e)=>t.saveCanvas(e),svg:(t,e)=>Promise.resolve(t.saveSVG(e)),gif:(t,e,i)=>{const r={...e,onProgress:i.onGIFProgress};return t.saveGIF(r)},video:(t,e,i)=>{const r={...e,onProgress:i.onVideoProgress};return t.saveVideo(r)}},vo=class{api;events;constructor(t,e){this.api=t,this.events=e}async $requestExport(t,e,i={}){this.events.$emit("export:request",{format:t});try{const r={onGIFProgress:i.onGIFProgress?e=>{i.onGIFProgress?.(e),this.events.$emit("export:progress",{format:t,progress:e})}:"gif"===t?e=>this.events.$emit("export:progress",{format:t,progress:e}):void 0,onVideoProgress:i.onVideoProgress?e=>{i.onVideoProgress?.(e),this.events.$emit("export:progress",{format:t,progress:e})}:"video"===t?e=>this.events.$emit("export:progress",{format:t,progress:e}):void 0};await yo[t](this.api,e,r),this.events.$emit("export:success",{format:t})}catch(r){throw this.events.$emit("export:error",{format:t,error:r}),r}}},go=t=>"number"==typeof t&&Number.isFinite(t)&&Math.abs(t)<=1e5,xo=class{key;constructor(t="textmode.export.overlay.position.v1"){this.key=t}load(){try{const t=window.localStorage.getItem(this.key);if(!t)return;const e=JSON.parse(t);if(1!==e.version||!go(e.offsetX)||!go(e.offsetY))return;return{version:1,offsetX:e.offsetX,offsetY:e.offsetY}}catch{return}}save(t,e){if(go(t)&&go(e))try{const i={version:1,offsetX:t,offsetY:e};window.localStorage.setItem(this.key,JSON.stringify(i))}catch{}}clear(){try{window.localStorage.removeItem(this.key)}catch{}}},Eo=class{modifier;host;surface;storage;animationFrameId=null;handleUpdate;bound=!1;dragHandle;dragState;position;renderedOffset;handlePointerDown=t=>this.onPointerDown(t);handlePointerMove=t=>this.onPointerMove(t);handlePointerUp=t=>this.onPointerUp(t);handleKeyDown=t=>this.onKeyDown(t);constructor(t,e,i=e,r=new xo){this.modifier=t,this.host=e,this.surface=i,this.storage=r,this.handleUpdate=()=>this.scheduleUpdate();const n=this.storage.load();this.position=n?{mode:"custom",offsetX:n.offsetX,offsetY:n.offsetY}:{mode:"auto",offsetX:8,offsetY:8},this.renderedOffset={offsetX:this.position.offsetX,offsetY:this.position.offsetY}}getPosition(){return Object.freeze({...this.position})}setPosition(t,e={}){Number.isFinite(t.offsetX)&&Number.isFinite(t.offsetY)&&(this.position={mode:"custom",offsetX:t.offsetX,offsetY:t.offsetY},this.scheduleUpdate(),(e.persist??1)&&this.storage.save(this.position.offsetX,this.position.offsetY))}resetPosition(){this.position={mode:"auto",offsetX:8,offsetY:8},this.storage.clear(),this.scheduleUpdate()}scheduleUpdate(){null!==this.animationFrameId&&cancelAnimationFrame(this.animationFrameId),this.animationFrameId=requestAnimationFrame(()=>this.update())}bind(){this.bound||(window.addEventListener("resize",this.handleUpdate),window.addEventListener("scroll",this.handleUpdate,!0),this.bound=!0,this.handleUpdate())}attachDragHandle(t){this.dragHandle!==t&&(this.detachDragHandle(),this.dragHandle=t,t.addEventListener("pointerdown",this.handlePointerDown),t.addEventListener("keydown",this.handleKeyDown))}detachDragHandle(){this.dragHandle&&(this.dragHandle.removeEventListener("pointerdown",this.handlePointerDown),this.dragHandle.removeEventListener("keydown",this.handleKeyDown),this.dragHandle.removeEventListener("pointermove",this.handlePointerMove),this.dragHandle.removeEventListener("pointerup",this.handlePointerUp),this.dragHandle.removeEventListener("pointercancel",this.handlePointerUp),this.dragHandle=void 0,this.dragState=void 0,this.surface.classList.remove(Yn))}onPointerDown(t){if(0===t.button&&this.dragHandle){t.preventDefault(),this.dragState={pointerId:t.pointerId,startClientX:t.clientX,startClientY:t.clientY,startOffsetX:this.renderedOffset.offsetX,startOffsetY:this.renderedOffset.offsetY},this.surface.classList.add(Yn),this.dragHandle.addEventListener("pointermove",this.handlePointerMove),this.dragHandle.addEventListener("pointerup",this.handlePointerUp),this.dragHandle.addEventListener("pointercancel",this.handlePointerUp);try{this.dragHandle.setPointerCapture?.(t.pointerId)}catch{}}}onPointerMove(t){this.dragState&&t.pointerId===this.dragState.pointerId&&(t.preventDefault(),this.setPosition({offsetX:this.dragState.startOffsetX+t.clientX-this.dragState.startClientX,offsetY:this.dragState.startOffsetY+t.clientY-this.dragState.startClientY},{persist:!1}))}onPointerUp(t){if(this.dragState&&t.pointerId===this.dragState.pointerId&&this.dragHandle){t.preventDefault(),this.dragHandle.removeEventListener("pointermove",this.handlePointerMove),this.dragHandle.removeEventListener("pointerup",this.handlePointerUp),this.dragHandle.removeEventListener("pointercancel",this.handlePointerUp);try{this.dragHandle.hasPointerCapture?.(t.pointerId)&&this.dragHandle.releasePointerCapture?.(t.pointerId)}catch{}this.surface.classList.remove(Yn),this.dragState=void 0,"custom"===this.position.mode&&this.storage.save(this.position.offsetX,this.position.offsetY)}}onKeyDown(t){const e=t.shiftKey?32:8,i=this.renderedOffset;switch(t.key){case"ArrowUp":t.preventDefault(),this.setPosition({offsetX:i.offsetX,offsetY:i.offsetY-e});break;case"ArrowDown":t.preventDefault(),this.setPosition({offsetX:i.offsetX,offsetY:i.offsetY+e});break;case"ArrowLeft":t.preventDefault(),this.setPosition({offsetX:i.offsetX-e,offsetY:i.offsetY});break;case"ArrowRight":t.preventDefault(),this.setPosition({offsetX:i.offsetX+e,offsetY:i.offsetY});break;case"Home":t.preventDefault(),this.resetPosition()}}update(){if(this.animationFrameId=null,"none"===this.host.style.display)return;const t=this.modifier.canvas.getBoundingClientRect(),e=this.clampToViewport(t,this.position.offsetX,this.position.offsetY);this.host.style.top=`${t.top+window.scrollY+e.offsetY}px`,this.host.style.left=`${t.left+window.scrollX+e.offsetX}px`,this.renderedOffset=e}clampToViewport(t,e,i){const r=this.surface.getBoundingClientRect(),n=r.width||this.host.getBoundingClientRect().width||0,o=r.height||this.host.getBoundingClientRect().height||0,s=Math.max(8,window.innerWidth-n-8),a=Math.max(8,window.innerHeight-o-8),h=this.clamp(t.left+e,8,s),c=this.clamp(t.top+i,8,a);return{offsetX:h-t.left,offsetY:c-t.top}}clamp(t,e,i){return Math.min(Math.max(t,e),i)}dispose(){null!==this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null),this.bound&&(window.removeEventListener("resize",this.handleUpdate),window.removeEventListener("scroll",this.handleUpdate,!0),this.bound=!1),this.detachDragHandle()}},ko=class extends ho{capabilities;ci;li=new Set;constructor(t,e){super(),this.ci=t,this.capabilities={clipboard:t.supportsClipboard,layerTarget:!!t.layerTargetProvider,recording:!1,...e}}di(t){return this.li.add(t),t}ti(){for(const t of this.li)t.unmount()}ei(){for(const t of this.li)t.destroy();this.li.clear()}},To=class extends ho{props;checkbox;labelElement;handleChange=()=>{this.props.defaultChecked=this.checkbox.checked};constructor(t){super(),this.props=t}render(){this.labelElement=document.createElement("label"),this.labelElement.classList.add("textmode-export-overlay__checkbox"),this.checkbox=document.createElement("input"),this.checkbox.type="checkbox",this.props.id&&(this.checkbox.id=this.props.id),this.checkbox.checked=Boolean(this.props.defaultChecked),this.checkbox.addEventListener("change",this.handleChange);const t=document.createElement("span");return t.textContent=this.props.label,this.labelElement.htmlFor=this.props.id??"",this.labelElement.appendChild(this.checkbox),this.labelElement.appendChild(t),this.labelElement}get inputElement(){return this.checkbox}get checked(){return this.checkbox.checked}set checked(t){this.checkbox.checked=t}ti(){this.checkbox.removeEventListener("change",this.handleChange)}onUpdate(t){this.props=t,t.id&&(this.checkbox.id=t.id,this.labelElement.htmlFor=t.id),this.checkbox.checked=Boolean(t.defaultChecked),this.labelElement.lastElementChild&&(this.labelElement.lastElementChild.textContent=t.label)}},Mo=class extends ho{props;input;handleInput=()=>{this.props.defaultValue=this.input.value};constructor(t){super(),this.props=t}render(){return this.input=document.createElement("input"),this.input.type="text",this.input.classList.add(io),this.props.id&&(this.input.id=this.props.id),void 0!==this.props.maxLength&&(this.input.maxLength=this.props.maxLength),void 0!==this.props.defaultValue&&(this.input.value=this.props.defaultValue),this.input.addEventListener("input",this.handleInput),this.input}get inputElement(){return this.input}get value(){return this.input.value}set value(t){this.input.value=t}ti(){this.input.removeEventListener("input",this.handleInput)}onUpdate(t){this.props=t,t.id&&(this.input.id=t.id),void 0!==t.maxLength&&(this.input.maxLength=t.maxLength),void 0!==t.defaultValue&&(this.input.value=t.defaultValue)}},_o=class extends ho{provider;field;select;constructor(t){super(),this.provider=t.provider,this.field=new lo({label:"layer",labelFor:t.id,variant:"full"}),this.select=new uo({id:t.id,options:[],defaultValue:t.provider.getDefaultId()})}render(){const t=document.createElement("div");return this.field.mount(t),this.refresh(),this.select.mount(this.field.root),t}get layer(){const t=this.provider.getLayerById(this.select.value);if(t)return t;const e=this.provider.getDefaultId();return this.select.value=e,this.provider.getLayerById(e)}setDisabled(t){this.select.selectElement.disabled=t}refresh(){const t=this.provider.getOptions(),e=this.select.isMounted()?this.select.value:this.provider.getDefaultId(),i=t.some(t=>t.id===e)?e:this.provider.getDefaultId();this.select.update({options:t.map(t=>({value:t.id,label:t.label})),defaultValue:i}),this.select.value=i}ti(){this.select.unmount(),this.field.unmount()}ei(){this.select.destroy(),this.field.destroy()}},Co=class extends ko{layerTarget;trailingSpaces=this.di(new To({label:"preserve trailing spaces",defaultChecked:!1}));emptyCharacter=this.di(new Mo({id:"textmode-export-empty-character",defaultValue:" ",maxLength:1}));constructor(t){super(t),t.layerTargetProvider&&(this.layerTarget=this.di(new _o({id:"textmode-export-txt-layer",provider:t.layerTargetProvider})))}render(){const t=document.createElement("div");t.classList.add(Ln),this.layerTarget?.mount(t),this.trailingSpaces.mount(t);const e=new lo({label:"empty character",labelFor:"textmode-export-empty-character",variant:"full"});return e.mount(t),this.emptyCharacter.mount(e.root),t}getOptions(){const t=this.ci.defaultOptions,e=this.emptyCharacter.value||t.emptyCharacter;return{layer:this.layerTarget?.layer,preserveTrailingSpaces:this.trailingSpaces.checked,emptyCharacter:e}}setDefaults(t){Object.assign(this.ci.defaultOptions,t),this.reset()}reset(){this.applyDefaults()}validate(){return this.emptyCharacter.value.length<=1}refreshLayerTargets(){this.layerTarget?.refresh()}applyDefaults(){const t=this.ci.defaultOptions;this.trailingSpaces.checked=t.preserveTrailingSpaces??!1,this.emptyCharacter.value=t.emptyCharacter??" "}},Ao=class extends ko{layerTarget;layerTargetContainer;target=this.di(new uo({id:"textmode-export-json-target",options:[{value:"selected",label:"selected layer"},{value:"all",label:"all layers"}],defaultValue:"selected"}));prettyPrint=this.di(new To({id:"textmode-export-json-pretty",label:"pretty print",defaultChecked:!0}));includeMetadata=this.di(new To({id:"textmode-export-json-metadata",label:"include metadata",defaultChecked:!0}));colorMode=this.di(new uo({id:"textmode-export-json-color-mode",options:[{value:"hex",label:"hex"},{value:"rgba",label:"rgba"}],defaultValue:"hex"}));constructor(t){super(t),t.layerTargetProvider&&(this.layerTarget=this.di(new _o({id:"textmode-export-json-layer",provider:t.layerTargetProvider})))}render(){const t=document.createElement("div");t.classList.add(Ln);const e=new lo({label:"target",labelFor:"textmode-export-json-target",variant:"full"});e.mount(t),this.target.mount(e.root),this.target.selectElement.addEventListener("change",()=>this.updateLayerTargetVisibility()),this.layerTarget&&(this.layerTargetContainer=document.createElement("div"),this.layerTarget.mount(this.layerTargetContainer),t.appendChild(this.layerTargetContainer)),this.prettyPrint.mount(t),this.includeMetadata.mount(t);const i=new lo({label:"color mode",labelFor:"textmode-export-json-color-mode",variant:"full"});return i.mount(t),this.colorMode.mount(i.root),this.updateLayerTargetVisibility(),t}getOptions(){const t=this.target.value;return{target:t,layer:"selected"===t?this.layerTarget?.layer:void 0,pretty:this.prettyPrint.checked,includeMetadata:this.includeMetadata.checked,colorMode:this.colorMode.value}}setDefaults(t){Object.assign(this.ci.defaultOptions,t),this.reset()}reset(){this.applyDefaults()}validate(){return!0}refreshLayerTargets(){this.layerTarget?.refresh()}applyDefaults(){const t=this.ci.defaultOptions;this.target.value=t.target??"selected",this.prettyPrint.checked="number"==typeof t.pretty?t.pretty>0:t.pretty??!0,this.includeMetadata.checked=t.includeMetadata??!0,this.colorMode.value=t.colorMode??"hex",this.updateLayerTargetVisibility()}updateLayerTargetVisibility(){const t="selected"===this.target.value;this.layerTargetContainer&&(this.layerTargetContainer.style.display=t?"":"none"),this.layerTarget?.setDisabled(!t)}},So="textmode-export-number-input",Bo=`${So}__field`,Po=`${So}__controls`,Io=`${So}__control`,Fo=`${So}__display`,Vo=`${Fo}--visible`,$o=t=>{const e=document.createElement("button");return e.type="button",e.className=Io,e.textContent=t>0?"▲":"▼",e},Uo=class extends ho{props;input;display;incrementButton;decrementButton;suppressClickAfterPointer=new WeakMap;holdTimeoutId;holdIntervalId;activePointerId;disabledObserver;constructor(t){super(),this.props=t}render(){const t=document.createElement("div");t.className=So,this.input=document.createElement("input"),this.input.type="number",this.input.value=this.props.defaultValue,Object.assign(this.input,this.props.attributes),this.input.className=Bo,this.display=document.createElement("div"),this.display.className=Fo;const e=document.createElement("div");return e.className=Po,this.incrementButton=$o(1),this.decrementButton=$o(-1),e.appendChild(this.incrementButton),e.appendChild(this.decrementButton),t.appendChild(this.input),t.appendChild(this.display),t.appendChild(e),this.bindStepControls(),this.bindHoldBehavior(),this.bindInputListeners(),this.observeDisabledState(t),this.updateDisplay(),t}get inputElement(){return this.input}get value(){return this.input.value}set value(t){this.input.value=t,this.updateDisplay()}refresh(){this.updateDisplay()}ei(){this.clearHoldTimers(),this.disabledObserver?.disconnect()}bindStepControls(){const t=t=>()=>{if(this.input.disabled)return;const e=this.input.value,i=this.input.getAttribute("step");if(i&&"any"!==i)t>0?this.input.stepUp():this.input.stepDown();else{const e=t>0?1:-1,i=Number.parseFloat(this.input.value||"0"),r=Number.isFinite(i)?i+e:e;this.input.value=String(r)}var r;this.input.value!==e&&((r=this.input).dispatchEvent(new Event("input",{bubbles:!0})),r.dispatchEvent(new Event("change",{bubbles:!0}))),this.updateDisplay(),this.input.focus({preventScroll:!0})},e=t(1),i=t(-1),r=(t,e)=>i=>{if(this.suppressClickAfterPointer.get(t))return this.suppressClickAfterPointer.set(t,!1),void i.preventDefault();e()};this.incrementButton.addEventListener("click",r(this.incrementButton,e)),this.decrementButton.addEventListener("click",r(this.decrementButton,i))}bindHoldBehavior(){const t=(t,e)=>{const i=e>0?()=>this.incrementButton.click():()=>this.decrementButton.click();t.addEventListener("pointerdown",e=>{if(0===e.button){e.preventDefault(),this.suppressClickAfterPointer.set(t,!0),this.activePointerId=e.pointerId;try{t.setPointerCapture(e.pointerId)}catch{}i(),this.holdTimeoutId=window.setTimeout(()=>{this.holdIntervalId=window.setInterval(i,80)},380)}});const r=()=>{if(void 0!==this.activePointerId){try{t.releasePointerCapture(this.activePointerId)}catch{}this.activePointerId=void 0}},n=()=>{this.clearHoldTimers(),r()};t.addEventListener("pointerup",n),t.addEventListener("pointerleave",n),t.addEventListener("pointercancel",n)};t(this.incrementButton,1),t(this.decrementButton,-1)}bindInputListeners(){const t=()=>{this.props.defaultValue=this.input.value,this.updateDisplay()};this.input.addEventListener("input",t),this.input.addEventListener("change",t)}observeDisabledState(t){const e=()=>{const e=this.input.disabled;this.incrementButton.disabled=e,this.decrementButton.disabled=e,t.classList.toggle("is-disabled",e),e?(this.display.classList.remove(Vo),this.input.style.removeProperty("color"),this.input.style.removeProperty("caretColor")):this.updateDisplay()};"undefined"!=typeof MutationObserver&&(this.disabledObserver=new MutationObserver(e),this.disabledObserver.observe(this.input,{attributes:!0,attributeFilter:["disabled"]})),e()}updateDisplay(){const t=this.props.formatDisplay;if(!t)return this.display.textContent="",this.display.classList.remove(Vo),this.input.style.removeProperty("color"),void this.input.style.removeProperty("caretColor");const e=this.input.value,i=Number.parseFloat(e),r=t(Number.isFinite(i)?i:NaN,e,this.input);r?(this.display.textContent=r,this.display.classList.add(Vo),this.input.style.color="transparent",this.input.style.caretColor="#f8fafc"):(this.display.textContent="",this.display.classList.remove(Vo),this.input.style.removeProperty("color"),this.input.style.removeProperty("caretColor"))}clearHoldTimers(){void 0!==this.holdTimeoutId&&(window.clearTimeout(this.holdTimeoutId),this.holdTimeoutId=void 0),void 0!==this.holdIntervalId&&(window.clearInterval(this.holdIntervalId),this.holdIntervalId=void 0)}},No=class extends ho{variant;additionalClasses;constructor(t="stack",e=[]){super(),this.variant=t,this.additionalClasses=e}render(){const t=document.createElement("div"),e=["stack"===this.variant?Ln:void 0,"stackDense"===this.variant?Wn:void 0,"stackCompact"===this.variant?qn:void 0,"row"===this.variant?"textmode-export-overlay__row":void 0,"section"===this.variant?Xn:void 0,...this.additionalClasses].filter(Boolean);return t.classList.add(...e),t}},Ro=class extends ko{formatSelect=this.di(new uo({id:"textmode-export-image-format",options:[{value:"png",label:"PNG (.png)"},{value:"jpg",label:"JPG (.jpg)"},{value:"webp",label:"WEBP (.webp)"}],defaultValue:"png"}));scaleInput=this.di(new Uo({defaultValue:"1",attributes:{min:"0.1",step:"0.1"}}));constructor(t){super(t)}render(){const t=document.createElement("div");t.classList.add(Ln);const e=new No("row");e.mount(t);const i=new lo({label:"image format",labelFor:"textmode-export-image-format",variant:"compact"});i.mount(e.root),this.formatSelect.mount(i.root);const r=new lo({label:"scale",labelFor:"textmode-export-image-scale",variant:"dense"});return r.mount(e.root),this.scaleInput.mount(r.root),this.scaleInput.inputElement.id="textmode-export-image-scale",t}getOptions(){const t=Number.parseFloat(this.scaleInput.value);return{format:this.formatSelect.value,scale:Number.isFinite(t)?t:this.ci.defaultOptions?.scale??1}}setDefaults(t){Object.assign(this.ci.defaultOptions,t),this.reset()}reset(){this.applyDefaults(),this.scaleInput.refresh()}validate(){const t=Number.parseFloat(this.scaleInput.value);return Number.isFinite(t)&&t>0}applyDefaults(){const t=this.ci.defaultOptions;this.formatSelect.value=t.format??"png",this.scaleInput.value=String(t.scale??1)}},Do=class extends ko{layerTarget;includeBackground=this.di(new To({id:"textmode-export-svg-include-backgrounds",label:"include cell backgrounds",defaultChecked:!0}));drawMode=this.di(new uo({id:"textmode-export-svg-draw-mode",options:[{value:"fill",label:"fill"},{value:"stroke",label:"stroke"}],defaultValue:"fill"}));strokeWidth=this.di(new Uo({defaultValue:"1",attributes:{min:"0",step:"0.1"}}));constructor(t){super(t),t.layerTargetProvider&&(this.layerTarget=this.di(new _o({id:"textmode-export-svg-layer",provider:t.layerTargetProvider})))}render(){const t=document.createElement("div");t.classList.add(Ln),this.layerTarget?.mount(t),this.includeBackground.mount(t);const e=new No("row");e.mount(t);const i=new lo({label:"draw mode",labelFor:"textmode-export-svg-draw-mode",variant:"compact"});i.mount(e.root),this.drawMode.mount(i.root);const r=new lo({label:"stroke width",labelFor:"textmode-export-svg-stroke-width",variant:"compact"});return r.mount(e.root),this.strokeWidth.mount(r.root),this.strokeWidth.inputElement.id="textmode-export-svg-stroke-width",this.drawMode.selectElement.addEventListener("change",()=>this.updateStrokeControls()),this.updateStrokeControls(),t}getOptions(){return{layer:this.layerTarget?.layer,includeBackgroundRectangles:this.includeBackground.checked,drawMode:this.drawMode.value,strokeWidth:Number.parseFloat(this.strokeWidth.value)}}setDefaults(t){Object.assign(this.ci.defaultOptions,t),this.reset()}reset(){this.applyDefaults(),this.updateStrokeControls()}validate(){const t=Number.parseFloat(this.strokeWidth.value);return"stroke"!==this.drawMode.value||Number.isFinite(t)&&t>=0}refreshLayerTargets(){this.layerTarget?.refresh()}updateStrokeControls(){const t="stroke"===this.drawMode.value;this.strokeWidth.inputElement.disabled=!t,this.strokeWidth.refresh()}applyDefaults(){const t=this.ci.defaultOptions;this.includeBackground.checked=t.includeBackgroundRectangles??!0,this.drawMode.value=t.drawMode??"fill",this.strokeWidth.value=String(t.strokeWidth??1),this.strokeWidth.refresh()}},Oo={neutral:"textmode-export-overlay__status-value--neutral",active:"textmode-export-overlay__status-value--active",alert:"textmode-export-overlay__status-value--alert"},zo=class extends ho{props;container;messageElement;constructor(t){super(),this.props=t}render(){this.container=document.createElement("div"),this.container.classList.add("textmode-export-overlay__status"),"gif"===this.props.context?this.container.classList.add("textmode-export-overlay__status--gif"):"video"===this.props.context&&this.container.classList.add("textmode-export-overlay__status--video");const t=document.createElement("span");return t.classList.add("textmode-export-overlay__status-title"),t.textContent=this.props.title,this.messageElement=document.createElement("span"),this.messageElement.classList.add("textmode-export-overlay__status-value"),this.messageElement.textContent=this.props.message,this.applyVariant(this.props.variant??"neutral"),this.container.appendChild(t),this.container.appendChild(this.messageElement),this.container}setMessage(t,e="neutral"){this.messageElement.textContent=t,this.applyVariant(e)}onUpdate(t){this.props=t,this.setMessage(t.message,t.variant??"neutral")}applyVariant(t){this.messageElement.classList.remove(...Object.values(Oo)),this.messageElement.classList.add(Oo[t])}},jo=class extends ko{frameCountInput=this.di(new Uo({defaultValue:"300",attributes:{min:"1",max:"600",step:"1"}}));frameRateInput=this.di(new Uo({defaultValue:"60",attributes:{min:"1",max:"60",step:"1"}}));scaleInput=this.di(new Uo({defaultValue:"1",attributes:{min:"0.1",max:"8",step:"0.1"}}));repeatInput=this.di(new Uo({defaultValue:"0",attributes:{min:"0",max:"50",step:"1"},formatDisplay:(t,e)=>Number.isFinite(t)?0===t?"∞":null:""===e.trim()?null:e}));status=this.di(new zo({title:"status",message:"ready to record",variant:"neutral",context:"gif"}));recordingState="idle";constructor(t){super(t,{recording:!0})}render(){const t=document.createElement("div");t.classList.add(Ln);const e=new No("row");e.mount(t);const i=new lo({label:"number of frames",labelFor:"textmode-export-gif-frame-count",variant:"dense"});i.mount(e.root),this.frameCountInput.mount(i.root),this.frameCountInput.inputElement.id="textmode-export-gif-frame-count";const r=new lo({label:"frame rate (fps)",labelFor:"textmode-export-gif-frame-rate",variant:"dense"});r.mount(e.root),this.frameRateInput.mount(r.root),this.frameRateInput.inputElement.id="textmode-export-gif-frame-rate";const n=new No("row");n.mount(t);const o=new lo({label:"scale",labelFor:"textmode-export-gif-scale",variant:"dense"});o.mount(n.root),this.scaleInput.mount(o.root),this.scaleInput.inputElement.id="textmode-export-gif-scale";const s=new lo({label:"loop count",labelFor:"textmode-export-gif-repeat",variant:"dense"});return s.mount(n.root),this.repeatInput.mount(s.root),this.repeatInput.inputElement.id="textmode-export-gif-repeat",this.status.mount(t),t}getOptions(){const t=this.ci.defaultOptions;return{frameCount:this.safeParseInt(this.frameCountInput.value,t.frameCount??300),frameRate:this.safeParseInt(this.frameRateInput.value,t.frameRate??60),scale:this.safeParseFloat(this.scaleInput.value,t.scale??1),repeat:this.safeParseInt(this.repeatInput.value,t.repeat??0)}}setDefaults(t){Object.assign(this.ci.defaultOptions,t),this.reset()}reset(){this.recordingState="idle",this.applyDefaults(),this.setRecordingState("idle")}validate(){const t=Number.parseInt(this.frameCountInput.value,10),e=Number.parseInt(this.frameRateInput.value,10),i=Number.parseFloat(this.scaleInput.value);return Number.isFinite(t)&&t>0&&Number.isFinite(e)&&e>0&&Number.isFinite(i)&&i>0}isRecording(){return"recording"===this.recordingState||"encoding"===this.recordingState}setRecordingState(t,e){this.recordingState=t;const i="recording"===t||"encoding"===t;switch(this.frameCountInput.inputElement.disabled=i,this.frameRateInput.inputElement.disabled=i,this.scaleInput.inputElement.disabled=i,this.repeatInput.inputElement.disabled=i,t){case"recording":if(e?.totalFrames){const t=e.frameIndex??0;this.status.setMessage(`recording ${t}/${e.totalFrames}`,"active")}else this.status.setMessage("recording…","active");break;case"encoding":if(e?.totalFrames){const t=e.frameIndex??0;this.status.setMessage(`encoding ${t}/${e.totalFrames}`,"active")}else this.status.setMessage("encoding…","active");break;case"completed":this.status.setMessage("GIF saved successfully","active");break;case"error":this.status.setMessage(e?.message??"failed to export GIF","alert");break;default:this.status.setMessage("ready to record","neutral")}}handleProgress(t){if("recording"!==t.state&&"encoding"!==t.state||!t.totalFrames)"completed"===t.state?this.status.setMessage("GIF saved successfully","active"):"error"===t.state&&this.status.setMessage(t.message??"failed to export GIF","alert");else{const e="recording"===t.state?"recording":"encoding";this.status.setMessage(`${e} ${t.frameIndex??0}/${t.totalFrames}`,"active")}}applyDefaults(){const t=this.ci.defaultOptions;this.frameCountInput.value=String(t.frameCount??300),this.frameRateInput.value=String(t.frameRate??60),this.scaleInput.value=String(t.scale??1),this.repeatInput.value=String(t.repeat??0),this.frameCountInput.refresh(),this.frameRateInput.refresh(),this.scaleInput.refresh(),this.repeatInput.refresh()}safeParseInt(t,e){const i=Number.parseInt(t,10);return Number.isFinite(i)?i:e}safeParseFloat(t,e){const i=Number.parseFloat(t);return Number.isFinite(i)?i:e}},Go=class extends ko{formatSelect=this.di(new uo({id:"textmode-export-video-format",options:[{value:"mp4",label:"MP4/H.264 (.mp4)"},{value:"webm",label:"WebM (.webm)"}],defaultValue:"mp4"}));bitrateSelect=this.di(new uo({id:"textmode-export-video-bitrate",options:[{value:"low",label:"low"},{value:"medium",label:"medium"},{value:"high",label:"high"}],defaultValue:"medium"}));frameRateInput=this.di(new Uo({defaultValue:"60",attributes:{min:String(1),max:String(60),step:"1"},formatDisplay:t=>Number.isFinite(t)?`${t} fps`:null}));frameCountInput=this.di(new Uo({defaultValue:"480",attributes:{min:String(1),max:String(3600),step:"1"}}));bitrateModeSelect=this.di(new uo({id:"textmode-export-video-bitrate-mode",options:[{value:"variable",label:"variable"},{value:"constant",label:"constant"}],defaultValue:"variable"}));latencyModeSelect=this.di(new uo({id:"textmode-export-video-latency-mode",options:[{value:"quality",label:"quality"},{value:"realtime",label:"realtime"}],defaultValue:"quality"}));hardwareAccelerationSelect=this.di(new uo({id:"textmode-export-video-hardware-acceleration",options:[{value:"no-preference",label:"no preference"},{value:"prefer-hardware",label:"prefer hardware"},{value:"prefer-software",label:"prefer software"}],defaultValue:"no-preference"}));keyFrameIntervalInput=this.di(new Uo({defaultValue:"2",attributes:{min:"0",step:"0.25"},formatDisplay:t=>Number.isFinite(t)?`${t}s`:null}));transparencyInput=this.di(new To({id:"textmode-export-video-transparent",label:"preserve transparency",defaultChecked:!1}));status=this.di(new zo({title:"status",message:"ready to record",variant:"neutral",context:"video"}));recordingState="idle";constructor(t){super(t,{recording:!0})}render(){const t=document.createElement("div");t.classList.add(Ln);const e=new No("row");e.mount(t);const i=new lo({label:"video format",labelFor:"textmode-export-video-format",variant:"compact"});i.mount(e.root),this.formatSelect.mount(i.root);const r=new lo({label:"bitrate preset",labelFor:"textmode-export-video-bitrate",variant:"compact"});r.mount(e.root),this.bitrateSelect.mount(r.root);const n=new No("row");n.mount(t);const o=new lo({label:"number of frames",labelFor:"textmode-export-video-frame-count",variant:"compact"});o.mount(n.root),this.frameCountInput.mount(o.root),this.frameCountInput.inputElement.id="textmode-export-video-frame-count";const s=new lo({label:"frame rate (fps)",labelFor:"textmode-export-video-frame-rate",variant:"compact"});s.mount(n.root),this.frameRateInput.mount(s.root),this.frameRateInput.inputElement.id="textmode-export-video-frame-rate";const a=new No("row");a.mount(t);const h=new lo({label:"bitrate mode",labelFor:"textmode-export-video-bitrate-mode",variant:"compact"});h.mount(a.root),this.bitrateModeSelect.mount(h.root);const c=new lo({label:"encoder mode",labelFor:"textmode-export-video-latency-mode",variant:"compact"});c.mount(a.root),this.latencyModeSelect.mount(c.root);const l=new No("row");l.mount(t);const d=new lo({label:"hardware",labelFor:"textmode-export-video-hardware-acceleration",variant:"compact"});d.mount(l.root),this.hardwareAccelerationSelect.mount(d.root);const u=new lo({label:"keyframe interval",labelFor:"textmode-export-video-keyframe-interval",variant:"compact"});return u.mount(l.root),this.keyFrameIntervalInput.mount(u.root),this.keyFrameIntervalInput.inputElement.id="textmode-export-video-keyframe-interval",this.transparencyInput.mount(t),this.formatSelect.selectElement.addEventListener("change",this.handleFormatChange),this.syncTransparencyAvailability(),this.status.mount(t),t}getOptions(){const t=this.ci.defaultOptions,e=Number.parseInt(this.frameCountInput.value,10),i=Number.parseFloat(this.frameRateInput.value),r=Number.parseFloat(this.keyFrameIntervalInput.value),n=this.formatSelect.value,o={format:n,bitrate:this.bitrateSelect.value,bitrateMode:this.bitrateModeSelect.value,latencyMode:this.latencyModeSelect.value,hardwareAcceleration:this.hardwareAccelerationSelect.value,keyFrameInterval:Number.isFinite(r)?r:t.keyFrameInterval??2,frameCount:Number.isFinite(e)?e:t.frameCount??480,frameRate:Number.isFinite(i)?i:t.frameRate??60};return"webm"===n&&(o.transparent=this.transparencyInput.checked),o}setDefaults(t){Object.assign(this.ci.defaultOptions,t),this.reset()}reset(){this.recordingState="idle",this.applyDefaults(),this.status.setMessage("ready to record","neutral")}validate(){const t=Number.parseInt(this.frameCountInput.value,10),e=Number.parseFloat(this.frameRateInput.value),i=Number.parseFloat(this.keyFrameIntervalInput.value);return Number.isFinite(t)&&t>=1&&Number.isFinite(e)&&e>=1&&Number.isFinite(i)&&i>=0}isRecording(){return"recording"===this.recordingState||"encoding"===this.recordingState}setRecordingState(t,e){this.recordingState=t;const i="recording"===t||"encoding"===t;this.formatSelect.selectElement.disabled=i,this.bitrateSelect.selectElement.disabled=i,this.frameCountInput.inputElement.disabled=i,this.frameRateInput.inputElement.disabled=i,this.bitrateModeSelect.selectElement.disabled=i,this.latencyModeSelect.selectElement.disabled=i,this.hardwareAccelerationSelect.selectElement.disabled=i,this.keyFrameIntervalInput.inputElement.disabled=i,this.transparencyInput.inputElement.disabled=i||"webm"!==this.formatSelect.value,this.syncStatus(t,e)}handleProgress(t){this.syncStatus(t.state,t)}syncStatus(t,e){switch(t){case"recording":{const t=e?.frameIndex??0,i=e?.totalFrames??this.resolvePlannedFrameCount();if(i){const e=Math.min(Math.max(0,Math.round(t)),i);this.status.setMessage(`recording ${e}/${i} frames`,"active")}else this.status.setMessage(`recording ${Math.max(0,Math.round(t))} frames`,"active");break}case"encoding":this.status.setMessage("finalizing video","active");break;case"completed":this.status.setMessage("saved to disk","active");break;case"error":this.status.setMessage(e?.message?`error: ${e.message}`:"recording failed","alert");break;default:this.status.setMessage("ready to record","neutral")}}resolvePlannedFrameCount(){const t=Number.parseInt(this.frameCountInput.value,10);return Number.isFinite(t)&&t>0?Math.round(t):void 0}applyDefaults(){const t=this.ci.defaultOptions;this.formatSelect.value=t.format??"mp4",this.bitrateSelect.value=this.resolveBitratePreset(t.bitrate),this.frameCountInput.value=String(t.frameCount??480),this.frameRateInput.value=String(t.frameRate??60),this.bitrateModeSelect.value=t.bitrateMode??"variable",this.latencyModeSelect.value=t.latencyMode??"quality",this.hardwareAccelerationSelect.value=t.hardwareAcceleration??"no-preference",this.keyFrameIntervalInput.value=String(t.keyFrameInterval??2),this.transparencyInput.checked=Boolean(t.transparent),this.frameCountInput.refresh(),this.frameRateInput.refresh(),this.keyFrameIntervalInput.refresh(),this.syncTransparencyAvailability()}resolveBitratePreset(t){return"low"===t||"medium"===t||"high"===t?t:"medium"}handleFormatChange=()=>{this.syncTransparencyAvailability()};syncTransparencyAvailability(){if(!this.transparencyInput.isMounted())return;const t="webm"===this.formatSelect.value;this.transparencyInput.root.style.display=t?"":"none",this.transparencyInput.inputElement.disabled=!t||this.isRecording(),t||(this.transparencyInput.checked=!1)}};function Ho(t){return t.capabilities.recording}var Lo=Object.freeze({format:"txt",txt:Object.freeze({preserveTrailingSpaces:!1,emptyCharacter:" "}),json:Object.freeze({target:"selected",pretty:!0,includeMetadata:!0,colorMode:"hex"}),image:Object.freeze({format:"png",scale:1}),svg:Object.freeze({includeBackgroundRectangles:!0,drawMode:"fill",strokeWidth:1}),gif:Object.freeze({frameCount:300,frameRate:60,scale:1,repeat:0}),video:Object.freeze({format:"mp4",frameCount:480,frameRate:60,bitrate:"medium",bitrateMode:"variable",latencyMode:"quality",hardwareAcceleration:"no-preference",keyFrameInterval:2,transparent:!1})});function Wo(){return{format:Lo.format,txt:{...Lo.txt},json:{...Lo.json},image:{...Lo.image},svg:{...Lo.svg},gif:{...Lo.gif},video:{...Lo.video}}}function qo(t,e){for(const i of Object.keys(t))delete t[i];Object.assign(t,e)}var Xo=class{ui;constructor(){this.ui=Wo()}get current(){return this.snapshot()}snapshot(){return{format:(t=this.ui).format,txt:{...t.txt},json:{...t.json},image:{...t.image},svg:{...t.svg},gif:{...t.gif},video:{...t.video}};var t}get(t){return this.ui[t]}merge(t){t.format&&(this.ui.format=t.format),t.txt&&Object.assign(this.ui.txt,t.txt),t.json&&Object.assign(this.ui.json,t.json),t.image&&Object.assign(this.ui.image,t.image),t.svg&&Object.assign(this.ui.svg,t.svg),t.gif&&Object.assign(this.ui.gif,t.gif),t.video&&Object.assign(this.ui.video,t.video)}reset(t){const e=Wo();if(!t)return this.ui.format=e.format,qo(this.ui.txt,e.txt),qo(this.ui.json,e.json),qo(this.ui.image,e.image),qo(this.ui.svg,e.svg),qo(this.ui.gif,e.gif),void qo(this.ui.video,e.video);switch(t){case"format":this.ui.format=e.format;break;case"txt":qo(this.ui.txt,e.txt);break;case"json":qo(this.ui.json,e.json);break;case"image":qo(this.ui.image,e.image);break;case"svg":qo(this.ui.svg,e.svg);break;case"gif":qo(this.ui.gif,e.gif);break;case"video":qo(this.ui.video,e.video)}}},Yo=class{C;fi;hi;pi;mi;wi;bi;yi=new Map;gi=[];xi;Ei;ki;Ti;Mi;_i;Ci=new co;Ai=new lo({label:"export format",labelFor:"textmode-export-format",variant:"full"});Si=new uo({id:"textmode-export-format",options:[]});Bi=new fo({label:"download file",fullWidth:!0,variant:"primary"});Pi=new fo({label:"copy to clipboard",fullWidth:!0,variant:"primary"});Ii;Fi;Vi=()=>{this.$i(this.Si.value)};Ui=()=>{this.Ni().catch(t=>{console.error("[textmode-export] Export failed",t)})};Ri=()=>{this.Di().catch(t=>{console.error("[textmode-export] Copy failed",t)})};constructor(t,e,i,r){this.C=t,this.fi=i;const n=this.Oi(i.current.format,r);this.hi=new mo((t=>({format:t,isBusy:!1}))(n)),this.pi=new po,this.mi=new vo(e,this.pi),this.wi=new bo(e),this.bi=r,this.Ii=n,this.zi(),this.ji()}$mount(){this.Gi(),this.Hi(),this._i=new Eo(this.C,this.xi,this.ki),this._i.attachDragHandle(this.Ci.dragHandleElement),this._i.bind(),this.Li(this.Ii)}show(){this.xi&&(this.refreshLayerTargets(),this.xi.style.display="",this._i?.scheduleUpdate())}hide(){this.xi&&(this.xi.style.display="none")}toggle(){this.isVisible()?this.hide():this.show()}isVisible(){return!!this.xi&&"none"!==this.xi.style.display}refreshLayerTargets(){this.Fi&&this.Fi.blade.capabilities.layerTarget&&this.Fi.blade.refreshLayerTargets()}resetPosition(){this._i.resetPosition()}getPosition(){return this._i.getPosition()}setPosition(t){this._i.setPosition(t)}setDefaults(t){t.format&&this.Wi(t.format),this.fi.merge(t),this.qi(this.Xi(t)),t.format&&this.$i(t.format)}getDefaults(){return this.fi.current}resetDefaults(t){this.fi.reset(t),"format"!==t?(this.qi(t?[t]:void 0),t||this.$i(this.fi.current.format)):this.$i(this.fi.current.format)}$dispose(){this.Si.isMounted()&&this.Si.selectElement.removeEventListener("change",this.Vi),this.Bi.isMounted()&&this.Bi.buttonElement.removeEventListener("click",this.Ui),this.Pi.isMounted()&&this.Pi.buttonElement.removeEventListener("click",this.Ri);for(const t of this.gi)t();this.gi.length=0,this.pi.$clear();for(const t of this.yi.values())t.blade.destroy();this.yi.clear(),this.Fi=void 0,this.xi?.isConnected&&this.xi.remove(),this._i?.dispose()}qi(t){const e=new Set(t??this.yi.keys());for(const[i,r]of this.yi)e.has(i)&&(r.blade.isMounted()?(r.blade.reset(),r.needsReset=!1):r.needsReset=!0)}zi(){for(const t of this.bi){const e=t.createBlade();this.yi.set(t.format,{definition:t,blade:e,initialized:!1,needsReset:!1})}}Oi(t,e){return e.some(e=>e.format===t)?t:e[0]?.format??t}Xi(t){return this.bi.map(t=>t.format).filter(e=>void 0!==t[e])}Wi(t){if(!this.yi.has(t))throw new Error(`Unknown export format: ${t}`)}Gi(){this.xi=document.createElement("div"),this.xi.dataset.plugin="textmode-export-overlay-host",this.xi.style.cssText="position: absolute; top: 0; left: 0; pointer-events: none; z-index: 2147483647;",this.Ei=this.xi.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent="@layer textmode-export-overlay{.textmode-export-overlay{--overlay-bg:#141414cc;--overlay-surface:#282828e6;--overlay-border:#ffffff24;--overlay-border-strong:#fff3;--overlay-border-focus:#a0a0a099;--overlay-focus-shadow:0 0 0 1px #8c8c8c47;--overlay-text:#fff;--overlay-muted:#c8c8c8bd;--overlay-radius:.75rem;--overlay-stack-gap:.55rem;gap:var(--overlay-stack-gap);background:var(--overlay-bg);min-width:236px;max-width:236px;color:var(--overlay-text);border-radius:var(--overlay-radius);border:1px solid var(--overlay-border);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);pointer-events:auto;z-index:2147483647;flex-direction:column;padding:.65rem .8rem;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:.82rem;line-height:1.35;display:flex;position:absolute;top:0;left:0;box-shadow:0 12px 28px #0000004d}.textmode-export-overlay *{box-sizing:border-box}.textmode-export-overlay__header{flex-direction:column;gap:.4rem;display:flex}.textmode-export-overlay__header-title-row{justify-content:space-between;align-items:center;gap:.4rem;display:flex}.textmode-export-overlay__header-identity{align-items:center;gap:.35rem;min-width:0;display:inline-flex}.textmode-export-overlay__header-links{flex:none;align-items:center;gap:.3rem;display:inline-flex}.textmode-export-overlay__grab-handle{color:#d7d7d7b8;cursor:grab;touch-action:none;background:0 0;border:1px solid #0000;border-radius:.45rem;flex:none;justify-content:center;align-items:center;width:1.45rem;height:1.45rem;padding:0;line-height:0;transition:background .18s,color .18s,border-color .18s;display:inline-flex}.textmode-export-overlay__grab-handle:hover{color:#fff;background:#5a5a5a4d;border-color:#c8c8c824}.textmode-export-overlay__grab-handle:focus-visible{border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow);outline:none}.textmode-export-overlay--dragging,.textmode-export-overlay--dragging .textmode-export-overlay__grab-handle{cursor:grabbing}.textmode-export-overlay__support-link{color:#d7d7d7d1;background:0 0;border:1px solid #0000;border-radius:.45rem;justify-content:center;align-items:center;padding:.2rem;line-height:0;text-decoration:none;transition:background .18s,color .18s,transform .18s,border-color .18s;display:inline-flex}.textmode-export-overlay__support-link:hover{color:#fff;background:#5a5a5a4d;border-color:#c8c8c824}.textmode-export-overlay__support-link:focus-visible{border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow);outline:none}.textmode-export-overlay__support-icon,.textmode-export-overlay__link-icon{width:1rem;height:1rem;display:block}.textmode-export-overlay__stack{gap:var(--overlay-stack-gap);flex-direction:column;display:flex}.textmode-export-overlay__stack--dense{gap:.3rem}.textmode-export-overlay__stack--compact{gap:.45rem}.textmode-export-overlay__section{flex-direction:column;gap:.4rem;display:flex}.textmode-export-overlay__title{white-space:nowrap;font-size:.92rem;font-weight:600}.textmode-export-overlay__divider{background:#ffffff29;width:100%;height:1px;margin-top:.25rem}.textmode-export-overlay__label{opacity:.9;font-weight:500}.textmode-export-overlay__checkbox{align-items:center;gap:.5rem;display:flex}.textmode-export-overlay__checkbox input[type=checkbox]{accent-color:#646464e6;width:1rem;height:1rem}.textmode-export-overlay__row{flex-wrap:wrap;align-items:flex-start;gap:.6rem;width:100%;display:flex}.textmode-export-overlay__field{flex-direction:column;flex:120px;gap:.3rem;min-width:120px;display:flex}.textmode-export-overlay__field--compact{flex:100px;min-width:100px}.textmode-export-overlay__field--dense{flex:90px;min-width:90px}.textmode-export-overlay__field--channel{flex:1 1 0;min-width:0}.textmode-export-overlay__field--full{flex:100%;width:100%}.textmode-export-overlay__input,.textmode-export-overlay select.textmode-export-overlay__input,.textmode-export-overlay input.textmode-export-overlay__input{border:1px solid var(--overlay-border-strong);background:var(--overlay-surface);width:100%;color:var(--overlay-text);font:inherit;border-radius:.4rem;padding:.35rem .5rem;line-height:1.35;transition:border-color .18s,box-shadow .18s,background .18s}.textmode-export-overlay select.textmode-export-overlay__input{appearance:none;background-image:url(\"data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='rgba(200, 200, 200, 0.74)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e\");background-position:right .5rem center;background-repeat:no-repeat;background-size:1rem;padding-right:2rem}.textmode-export-overlay__input:focus{border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow);background:#2d2f42eb;outline:none}.textmode-export-overlay__input::placeholder{color:var(--overlay-muted);opacity:.7}.textmode-export-overlay__muted{opacity:.7;font-size:.75rem;display:block}.textmode-export-overlay__button{cursor:pointer;border:none;border-radius:.45rem;justify-content:center;align-items:center;gap:.35rem;padding:.45rem .7rem;font-weight:600;transition:background .2s,transform .2s,box-shadow .2s;display:inline-flex}.textmode-export-overlay__button--primary{color:#fff;background:#505050}.textmode-export-overlay__button--secondary{color:#fff;background:#606060}.textmode-export-overlay__button--full{width:100%}.textmode-export-overlay__button:hover:not(:disabled){transform:translateY(-1px);box-shadow:0 7px 18px #00000073}.textmode-export-overlay__button--primary:hover:not(:disabled){background:#404040}.textmode-export-overlay__button--secondary:hover:not(:disabled){background:#4a4a4a}.textmode-export-overlay__button:disabled{cursor:default;opacity:.55;box-shadow:none;transform:none}.textmode-export-overlay__status{background:#4646462e;border:1px solid #6e6e6e38;border-radius:.45rem;flex-direction:column;gap:.25rem;padding:.45rem .55rem;display:flex}.textmode-export-overlay__status--gif{background:#5050501f;border-color:#78787840}.textmode-export-overlay__status--video{background:#4646461f;border-color:#6e6e6e40}.textmode-export-overlay__status-title{opacity:.85;text-transform:uppercase;letter-spacing:.04em;font-size:.75rem;font-weight:600}.textmode-export-overlay__status-value{color:#dedede;font-size:.82rem;transition:color .18s}.textmode-export-overlay__status-value--neutral{color:#cfcfcf}.textmode-export-overlay__status-value--active{color:#f5f5f5}.textmode-export-overlay__status-value--alert{color:#b8b8b8}.textmode-export-number-input,.textmode-export-overlay .textmode-export-number-input{background:var(--overlay-surface);border:1px solid var(--overlay-border-strong);border-radius:.4rem;align-items:stretch;width:100%;transition:border-color .18s,box-shadow .18s,background .18s;display:flex;position:relative;overflow:hidden}.textmode-export-number-input:focus-within{border-color:var(--overlay-border-focus);box-shadow:var(--overlay-focus-shadow)}.textmode-export-number-input.is-disabled{opacity:.55}.textmode-export-number-input__field{min-width:0;color:var(--overlay-text);font:inherit;appearance:textfield;background:0 0;border:none;flex:auto;padding:.35rem .5rem}.textmode-export-number-input__field::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.textmode-export-number-input__field::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.textmode-export-number-input__field:focus{outline:none}.textmode-export-number-input__controls{border-left:1px solid #ffffff1f;flex-direction:column;min-width:1.6rem;display:flex}.textmode-export-number-input__control{color:#d0d0d0;cursor:pointer;background:#32323299;border:none;flex:1;justify-content:center;align-items:center;width:100%;padding:0;font-size:.68rem;line-height:1;transition:background .15s,color .15s;display:flex}.textmode-export-number-input__control:hover:not(:disabled){color:#fff;background:#5a5a5ad9}.textmode-export-number-input__control:disabled{cursor:default;opacity:.4;color:#c8c8c866;background:#28282880}.textmode-export-number-input:focus-within .textmode-export-number-input__control{color:#e8e8e8;background:#3c3c3cbf}.textmode-export-number-input__display{pointer-events:none;color:#f8fafc;opacity:0;align-items:center;padding:.4rem .55rem;transition:opacity .14s;display:flex;position:absolute;inset:0}.textmode-export-number-input__display--visible{opacity:1}}",this.Ei.appendChild(t),this.ki=document.createElement("div"),this.ki.dataset.plugin="textmode-export-overlay",this.ki.classList.add("textmode-export-overlay",Ln),this.Ei.appendChild(this.ki),document.body.appendChild(this.xi)}Hi(){this.Ci.mount(this.ki);const t=document.createElement("div");t.classList.add(Xn),this.ki.appendChild(t),this.Ai.mount(t),this.Yi(),this.Si.mount(this.Ai.root),this.Si.selectElement.addEventListener("change",this.Vi),this.Ti=document.createElement("div"),this.Ti.classList.add(Ln,qn),this.ki.appendChild(this.Ti),this.Bi.mount(this.ki),this.Bi.buttonElement.addEventListener("click",this.Ui),this.Mi=document.createElement("div"),this.Mi.classList.add(Ln,Wn),this.ki.appendChild(this.Mi),this.Pi.mount(this.Mi),this.Pi.buttonElement.dataset.defaultLabel="copy to clipboard",this.Pi.buttonElement.addEventListener("click",this.Ri)}Yi(){const t=this.bi.map(t=>({value:t.format,label:t.label}));this.Si.update({options:t,defaultValue:this.Ii})}ji(){this.gi.push(this.pi.$on("export:request",({format:t})=>{t===this.Ii&&(this.hi.$set({isBusy:!0,error:void 0}),this.Ji())}),this.pi.$on("export:success",({format:t})=>{if(t===this.Ii){const e={isBusy:!1};"gif"===t&&(e.gifProgress=void 0),"video"===t&&(e.videoProgress=void 0),this.hi.$set(e),this.Ji()}}),this.pi.$on("export:error",({format:t,error:e})=>{t===this.Ii&&(this.hi.$set({isBusy:!1,error:e}),this.Ji())}),this.pi.$on("export:progress",({format:t,progress:e})=>{if(e){if("gif"===t){const t=e;this.hi.$set({gifProgress:t}),"gif"===this.Fi?.definition.format&&Ho(this.Fi.blade)&&this.Fi.blade.handleProgress(t)}else if("video"===t){const t=e;this.hi.$set({videoProgress:t}),"video"===this.Fi?.definition.format&&Ho(this.Fi.blade)&&this.Fi.blade.handleProgress(t)}this.Ji()}}))}$i(t){this.Ii=t,this.hi.$set({format:t}),this.Li(t),this.pi.$emit("format:change",{format:t})}Li(t){const e=this.yi.get(t);if(!e)throw new Error(`Unknown export format: ${t}`);this.Fi&&this.Fi.blade.unmount(),this.Ti.innerHTML="",e.blade.mount(this.Ti),e.initialized&&!e.needsReset||(e.blade.reset(),e.initialized=!0,e.needsReset=!1),this.Fi=e,this.Si.value=t,this.refreshLayerTargets(),this.Qi(),this.Ji(),this._i?.scheduleUpdate()}Qi(){const t=this.Fi?.definition.supportsClipboard??!1;this.Mi.style.display=t?"flex":"none",this.Pi.setDisabled(!t)}async Ni(){if(!this.Fi)return;const t=this.Fi.definition.format,e=this.Fi.blade.getOptions();if(this.Fi.blade.validate()){if(Ho(this.Fi.blade)){const r=this.Fi.blade;if(r.isRecording())return;r.setRecordingState("recording");try{await this.mi.$requestExport(t,e,{onGIFProgress:t=>{r.setRecordingState(t.state,t)},onVideoProgress:t=>{r.setRecordingState(t.state,t)}})}catch(i){throw r.setRecordingState("error"),i}return void window.setTimeout(()=>{r.setRecordingState("idle"),this.Ji()},1600)}this.Bi.setDisabled(!0),this.Bi.setLabel("exporting…");try{await this.mi.$requestExport(t,e)}finally{this.Bi.setDisabled(!1),this.Bi.setLabel("download file")}}else console.warn("[textmode-export] Export options failed validation")}async Di(){if(!this.Fi||!this.Fi.definition.supportsClipboard)return;const t=this.Fi.definition.format,e=this.Fi.blade.getOptions(),i=this.Pi.buttonElement.dataset.defaultLabel??"copy to clipboard";this.Pi.setDisabled(!0),this.Pi.setLabel("copying…");try{switch(t){case"txt":await this.wi.$copy("txt",e);break;case"json":await this.wi.$copy("json",e);break;case"svg":await this.wi.$copy("svg",e);break;case"image":await this.wi.$copy("image",e);break;default:return}this.Pi.setLabel("copied!")}catch(r){console.error("[textmode-export] Failed to copy to clipboard",r),this.Pi.setLabel("copy failed!")}finally{window.setTimeout(()=>{this.Pi.setLabel(i),this.Pi.setDisabled(!1)},1200)}}Ji(){if(!this.Fi)return;const t=this.Fi.definition.format;if(Ho(this.Fi.blade)){const e=this.Fi.blade,i="gif"===t?this.hi.snapshot.gifProgress:this.hi.snapshot.videoProgress;if(e.isRecording())if(this.Bi.setDisabled(!0),i?.totalFrames){const e=i.frameIndex??0,r="encoding"===i.state?"encoding":"recording";this.Bi.setLabel("gif"===t?`${r} ${e}/${i.totalFrames}`:`recording ${e}/${i.totalFrames} frames`)}else this.Bi.setLabel("encoding"===i?.state?"encoding…":"recording…");else this.Bi.setDisabled(!1),this.Bi.setLabel("start recording");return}const e=this.hi.snapshot.isBusy;this.Bi.setDisabled(e),this.Bi.setLabel(e?"exporting…":"download file")}};var Jo=new WeakMap,Qo=["saveCanvas","toImageBlob","copyCanvas","saveSVG","saveStrings","toSVG","toString","toJSON","toJSONString","saveJSON","saveGIF","toGIFBlob","saveVideo","toVideoBlob"],Ko={name:"textmode.export",version:On,install(t,e){const i=t=>e.on("postDraw",t),r={saveCanvas:async(e={})=>(new b).$saveImage(t.canvas,e),copyCanvas:async(e={})=>(new b).$copyImageToClipboard(t.canvas,e),toImageBlob:async(e={})=>(new b).$toImageBlob(t.canvas,e),saveSVG:(e={})=>{(new m).$saveSVG(t,e)},saveStrings:(e={})=>{(new y).$saveTXT(t,e)},toSVG:(e={})=>(new m).$generateSVG(t,e),toString:(e={})=>(new y).$generateTXT(t,e),toJSON:(e={})=>(new Hn).$generateJSONData(t,e),toJSONString:(e={})=>(new Hn).$generateJSONString(t,e),saveJSON:(e={})=>{(new Hn).$saveJSON(t,e)},saveGIF:async(e={})=>new S(t,i).$saveGIF(e),toGIFBlob:async(e={})=>new S(t,i).$generateGIFBlob(e),saveVideo:async(e={})=>new Rn(t,i).$saveVideo(e),toVideoBlob:async(e={})=>new Rn(t,i).$generateVideoBlob(e)},n=function(t,e,i){const r=new Xo,n=new Yo(t,e,r,function(t,e=(()=>{const t=Wo();return e=>t[e]})()){return[{format:"txt",label:"plain text (.txt)",supportsClipboard:!0,createBlade:()=>new Co({format:"txt",label:"plain text (.txt)",supportsClipboard:!0,defaultOptions:e("txt"),layerTargetProvider:t})},{format:"json",label:"document data (.json)",supportsClipboard:!0,createBlade:()=>new Ao({format:"json",label:"document data (.json)",supportsClipboard:!0,defaultOptions:e("json"),layerTargetProvider:t})},{format:"image",label:"image (.png / .jpg / .webp)",supportsClipboard:!0,createBlade:()=>new Ro({format:"image",label:"image (.png / .jpg / .webp)",supportsClipboard:!0,defaultOptions:e("image")})},{format:"svg",label:"vector (.svg)",supportsClipboard:!0,createBlade:()=>new Do({format:"svg",label:"vector (.svg)",supportsClipboard:!0,defaultOptions:e("svg"),layerTargetProvider:t})},{format:"gif",label:"animated GIF (.gif)",supportsClipboard:!1,createBlade:()=>new jo({format:"gif",label:"animated GIF (.gif)",supportsClipboard:!1,defaultOptions:e("gif")})},{format:"video",label:"video (.webm / .mp4)",supportsClipboard:!1,createBlade:()=>new Go({format:"video",label:"video (.webm / .mp4)",supportsClipboard:!1,defaultOptions:e("video")})}]}(i,t=>r.get(t)));return n.$mount(),n}(t,r,function(t){return{getOptions:()=>c(t),getLayerById:e=>c(t).find(t=>t.id===e)?.layer,getDefaultId:()=>"base"}}(t)),o=i(()=>{n.isVisible()&&n.refreshLayerTargets()}),s={show:()=>n.show(),hide:()=>n.hide(),toggle:()=>n.toggle(),isVisible:()=>n.isVisible(),resetPosition:()=>n.resetPosition(),getPosition:()=>n.getPosition(),setPosition:t=>n.setPosition(t),setDefaults:t=>n.setDefaults(t),getDefaults:()=>n.getDefaults(),resetDefaults:t=>n.resetDefaults(t)};for(const a of Qo)e.defineExtension("textmodifier",a,{value:r[a]});e.defineExtension("textmodifier","exportOverlay",{get:()=>s}),Jo.set(t,{disposeOverlay:()=>{o(),n.$dispose()}})},uninstall(t){Jo.get(t)?.disposeOverlay(),Jo.delete(t)}};"undefined"!=typeof window&&(window.ExportPlugin=Ko),t.ExportPlugin=Ko});