@munusshih/p5.export 0.1.0-beta.4 → 0.1.0-beta.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"p5.export.min.js","sources":["../src/utils/download.js","../src/utils/canvas.js","../src/utils/scale.js","../src/exporters/image.js","../node_modules/canvas2svg/canvas2svg.js","../src/exporters/pattern-plugin.js","../src/exporters/svg.js","../src/exporters/pdf.js","../node_modules/gifenc/dist/gifenc.esm.js","../src/exporters/gif.js","../src/recording/buffer.js","../node_modules/mp4-muxer/build/mp4-muxer.mjs","../node_modules/webm-muxer/build/webm-muxer.mjs","../src/recording/encoders.js","../src/recording/webp.js","../src/exporters/video.js","../src/exporters/geometry.js","../src/gui.js","../src/index.js"],"sourcesContent":["/**\n * Trigger a browser download for a Blob. The temporary anchor is removed\n * synchronously after click; the object URL is revoked on the next tick.\n *\n * @param {Blob} blob\n * @param {string} filename\n */\nexport function downloadBlob(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\n/**\n * Stamp a filename with the current timestamp when the user didn't supply\n * one. Format: `sketch-2026-05-10T12-34-56.png`.\n */\nexport function defaultFilename(ext, base = 'sketch') {\n const ts = new Date().toISOString().replace(/[:.]/g, '-').replace(/Z$/, '');\n return `${base}-${ts}.${ext}`;\n}\n\n/**\n * Append `.ext` if the user-supplied name doesn't already end in it.\n */\nexport function ensureExt(filename, ext) {\n const lower = filename.toLowerCase();\n return lower.endsWith('.' + ext.toLowerCase()) ? filename : `${filename}.${ext}`;\n}\n","/**\n * Resolve the underlying HTMLCanvasElement from a p5 instance, regardless of\n * whether the user is in global or instance mode and whether they passed in\n * a p5.Graphics object.\n *\n * @param {any} p p5 instance, p5.Graphics, or HTMLCanvasElement\n */\nexport function getCanvas(p) {\n if (!p) return getGlobalCanvas();\n if (p instanceof HTMLCanvasElement) return p;\n // p5.Graphics / p5 instance both expose .elt or .canvas\n if (p.canvas instanceof HTMLCanvasElement) return p.canvas;\n if (p.elt instanceof HTMLCanvasElement) return p.elt;\n // Fall through — try the global\n return getGlobalCanvas();\n}\n\nfunction getGlobalCanvas() {\n // In global mode, p5 stores the active canvas on the window-bound _renderer.\n // The safest cross-version path: query the DOM for the canvas p5 creates.\n const fromP5 = document.querySelector('canvas.p5Canvas');\n if (fromP5) return fromP5;\n // Last resort\n return document.querySelector('canvas');\n}\n\n/** True iff the active renderer is WebGL (so 2D-only exports should bail). */\nexport function isWebGL(p) {\n if (!p) return false;\n const r = p._renderer;\n if (!r) return false;\n // p5 2.0 stores a `drawingContext` getter that returns the WebGL ctx.\n const ctx = r.drawingContext;\n if (ctx && typeof ctx.fillRect !== 'function') return true;\n // p5 1.x also has `GL` on the renderer for WebGL.\n if (r.GL) return true;\n return false;\n}\n","import { getCanvas } from './canvas.js';\n\nconst RASTER_MIME = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n};\n\n/**\n * High-res raster export that REPLAYS the recorded drawing-context op log\n * onto an offscreen canvas at the target resolution. Because we replay\n * historical ops — not a single fresh draw() — accumulated state is\n * preserved at any scale: trails, fading overlays, layered alpha all\n * survive. Returns `null` if no recorder is installed (e.g. WebGL sketch\n * or the recorder hasn't started yet), letting the caller fall back to\n * the pixelDensity-redraw path.\n *\n * We scale the `setTransform` matrices by `scale / origPD` during replay\n * so paths, text, and stroke widths render at the higher resolution\n * instead of being upsampled bitmaps.\n *\n * @param {*} p p5 instance\n * @param {number} scale target pixelDensity (must be > origPD to be useful)\n * @param {'png'|'jpg'|'jpeg'|'webp'} format\n * @param {number} [quality]\n * @returns {Promise<Blob | null>}\n */\nexport async function highResViaReplay(p, scale, format, quality) {\n const rec = p && p._p5ExportSVGRecorder;\n if (!rec || !rec.ops || rec.ops.length === 0) return null;\n const canvas = getCanvas(p);\n if (!canvas) return null;\n\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n // Logical canvas size (what the user sees in CSS pixels).\n const logicalW = Math.max(1, Math.round(canvas.width / origPD));\n const logicalH = Math.max(1, Math.round(canvas.height / origPD));\n const targetW = logicalW * scale;\n const targetH = logicalH * scale;\n\n const off = document.createElement('canvas');\n off.width = targetW;\n off.height = targetH;\n const ctx = off.getContext('2d');\n if (!ctx) return null;\n\n // Recorded ops are in coordinate spaces shaped by p5's setTransform(pd,…)\n // each frame. Multiply those matrices by the ratio scale/origPD so the\n // same logical drawing lands at scale × the size on our larger canvas.\n const sf = scale / origPD;\n const ops = rec.ops;\n\n for (let i = 0; i < ops.length; i++) {\n const op = ops[i];\n try {\n if (op[0] === 0) {\n const name = op[1];\n if (name === 'setTransform') {\n const a = op[2];\n ctx.setTransform(a[0] * sf, a[1] * sf, a[2] * sf, a[3] * sf, a[4] * sf, a[5] * sf);\n } else {\n ctx[name](...op[2]);\n }\n } else {\n ctx[op[1]] = op[2];\n }\n } catch (_) {\n // Some ops (gradients, patterns, ImageBitmaps bound to the original\n // ctx) won't replay onto a fresh ctx. Skip rather than abort the\n // whole export — most sketches won't hit any of these.\n }\n }\n\n const mime = RASTER_MIME[format] || 'image/png';\n return new Promise((resolve, reject) => {\n off.toBlob(\n (b) => b ? resolve(b) : reject(new Error('[p5.export] toBlob returned null')),\n mime,\n quality\n );\n });\n}\n\n/**\n * Render the sketch at a different `pixelDensity` for the duration of an\n * async operation, then restore. This is the FALLBACK high-res path —\n * used when the op-replay path isn't available (no recorder, e.g. WebGL).\n * The sketch literally redraws into a 2×/3×/4× backing store, so paths,\n * text, and edges are rendered at the higher resolution.\n *\n * IMPORTANT: scales ≤ 1 are a NO-OP. We do not change pixelDensity, do not\n * call redraw(), and do not pause the loop — we just snapshot whatever the\n * canvas currently shows. This is what users want by default: a PNG that\n * looks like what's on the screen, including any accumulated state from\n * sketches that paint a semi-transparent overlay each frame to build up\n * trails. Resetting the pixel density would resize the backing store,\n * wipe those accumulated pixels, and replace them with a single fresh\n * frame — which is the bug you'd see as \"missing background and traces\".\n *\n * For upscales (scale > 1), the trade-off is real: the redraw resets the\n * canvas, so accumulated trails are lost. The user explicitly asked for\n * the higher-resolution render and accepts that.\n *\n * @template T\n * @param {*} p p5 instance\n * @param {number} scale 1 | 2 | 3 | 4 — interpreted as the target pixelDensity\n * @param {() => (Promise<T> | T)} fn\n * @returns {Promise<T>}\n */\nexport async function withPixelDensity(p, scale, fn) {\n // 1× or unspecified: snapshot the canvas as-is. Preserves trails.\n if (!scale || scale <= 1) return fn();\n\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n // Canvas is already at (or above) the requested density — no reason to\n // redraw and lose accumulated state.\n if (scale <= origPD) return fn();\n\n const wasLooping = typeof p.isLooping === 'function' ? p.isLooping() : true;\n if (wasLooping && typeof p.noLoop === 'function') p.noLoop();\n\n try {\n p.pixelDensity(scale);\n // p5.js 2.0's redraw() is async — await it so the canvas reflects the\n // higher-density render before we read pixels.\n if (typeof p.redraw === 'function') await p.redraw();\n await new Promise((r) => requestAnimationFrame(r));\n return await fn();\n } finally {\n p.pixelDensity(origPD);\n if (typeof p.redraw === 'function') await p.redraw();\n if (wasLooping && typeof p.loop === 'function') p.loop();\n }\n}\n","import { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { withPixelDensity, highResViaReplay } from '../utils/scale.js';\n\nconst MIME = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n};\n\n/**\n * Snapshot the current canvas to a Blob and return it. Does not trigger\n * a download.\n *\n * @param {any} p p5 instance (or omit for global mode)\n * @param {'png'|'jpg'|'webp'} format\n * @param {number} [quality] 0..1, applied to jpg/webp only\n * @returns {Promise<Blob>}\n */\nexport function canvasToBlob(p, format, quality) {\n const canvas = getCanvas(p);\n if (!canvas) return Promise.reject(new Error('[p5.export] no canvas found'));\n const mime = MIME[format];\n if (!mime) return Promise.reject(new Error(`[p5.export] unknown image format: ${format}`));\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => (blob ? resolve(blob) : reject(new Error('[p5.export] toBlob returned null'))),\n mime,\n quality\n );\n });\n}\n\n/**\n * Capture a snapshot at a target scale. Decision tree:\n *\n * scale unset / ≤ 1 → snapshot the live canvas (preserves trails)\n * scale ≤ origPD → snapshot the live canvas (already enough res)\n * scale > origPD AND recorder available\n * → REPLAY recorded ops onto an offscreen at\n * scale × logical size (preserves trails AND\n * renders sharp at the target resolution)\n * scale > origPD AND no recorder\n * → fallback: redraw via withPixelDensity (loses\n * trails, but at least gives true high-res\n * output for WebGL / pre-recorder sketches)\n */\nasync function snapshotAtScale(p, scale, format, quality) {\n if (!scale || scale <= 1) return canvasToBlob(p, format, quality);\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n if (scale <= origPD) return canvasToBlob(p, format, quality);\n\n // Try the trail-preserving op-replay path first.\n const replayed = await highResViaReplay(p, scale, format, quality);\n if (replayed) return replayed;\n\n // Fallback: re-render at higher pixelDensity. Trails lost.\n return withPixelDensity(p, scale, () => canvasToBlob(p, format, quality));\n}\n\nexport function attachImageExports(p5, fn) {\n /**\n * Save the current canvas as a PNG.\n * @param {string} [filename]\n * @param {{scale?: number}} [opts] scale = pixelDensity to render at (1..4)\n */\n fn.savePNG = async function (filename, opts = {}) {\n const blob = await snapshotAtScale(this, opts.scale, 'png');\n downloadBlob(blob, filename ? ensureExt(filename, 'png') : defaultFilename('png'));\n return blob;\n };\n\n /**\n * Save the current canvas as a JPEG.\n * @param {string} [filename]\n * @param {{scale?: number, quality?: number}} [opts] quality 0..1 (default 0.92)\n */\n fn.saveJPG = async function (filename, opts = {}) {\n const quality = opts.quality ?? 0.92;\n const blob = await snapshotAtScale(this, opts.scale, 'jpg', quality);\n downloadBlob(blob, filename ? ensureExt(filename, 'jpg') : defaultFilename('jpg'));\n return blob;\n };\n fn.saveJPEG = fn.saveJPG;\n\n /**\n * Save the current canvas as a WebP.\n * @param {string} [filename]\n * @param {{scale?: number, quality?: number}} [opts]\n */\n fn.saveWebP = async function (filename, opts = {}) {\n const quality = opts.quality ?? 0.92;\n const blob = await snapshotAtScale(this, opts.scale, 'webp', quality);\n downloadBlob(blob, filename ? ensureExt(filename, 'webp') : defaultFilename('webp'));\n return blob;\n };\n\n /**\n * Generic \"save image\" — picks the encoder from the format string.\n * @param {'png'|'jpg'|'webp'} format\n * @param {string} [filename]\n * @param {{scale?: number, quality?: number}} [opts]\n */\n fn.saveImage = async function (format, filename, opts = {}) {\n format = (format || 'png').toLowerCase();\n if (format === 'jpeg') format = 'jpg';\n const blob = await snapshotAtScale(this, opts.scale, format, opts.quality);\n downloadBlob(blob, filename ? ensureExt(filename, format) : defaultFilename(format));\n return blob;\n };\n}\n","/*!!\n * Canvas 2 Svg v1.0.15\n * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document.\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n * Author:\n * Kerry Liu\n *\n * Copyright (c) 2014 Gliffy Inc.\n */\n\n;(function() {\n \"use strict\";\n\n var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities;\n\n //helper function to format a string\n function format(str, args) {\n var keys = Object.keys(args), i;\n for (i=0; i<keys.length; i++) {\n str = str.replace(new RegExp(\"\\\\{\" + keys[i] + \"\\\\}\", \"gi\"), args[keys[i]]);\n }\n return str;\n }\n\n //helper function that generates a random string\n function randomString(holder) {\n var chars, randomstring, i;\n if (!holder) {\n throw new Error(\"cannot create a random attribute name for an undefined object\");\n }\n chars = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\";\n randomstring = \"\";\n do {\n randomstring = \"\";\n for (i = 0; i < 12; i++) {\n randomstring += chars[Math.floor(Math.random() * chars.length)];\n }\n } while (holder[randomstring]);\n return randomstring;\n }\n\n //helper function to map named to numbered entities\n function createNamedToNumberedLookup(items, radix) {\n var i, entity, lookup = {}, base10, base16;\n items = items.split(',');\n radix = radix || 10;\n // Map from named to numbered entities.\n for (i = 0; i < items.length; i += 2) {\n entity = '&' + items[i + 1] + ';';\n base10 = parseInt(items[i], radix);\n lookup[entity] = '&#'+base10+';';\n }\n //FF and IE need to create a regex from hex values ie &nbsp; == \\xa0\n lookup[\"\\\\xa0\"] = '&#160;';\n return lookup;\n }\n\n //helper function to map canvas-textAlign to svg-textAnchor\n function getTextAnchor(textAlign) {\n //TODO: support rtl languages\n var mapping = {\"left\":\"start\", \"right\":\"end\", \"center\":\"middle\", \"start\":\"start\", \"end\":\"end\"};\n return mapping[textAlign] || mapping.start;\n }\n\n //helper function to map canvas-textBaseline to svg-dominantBaseline\n function getDominantBaseline(textBaseline) {\n //INFO: not supported in all browsers\n var mapping = {\"alphabetic\": \"alphabetic\", \"hanging\": \"hanging\", \"top\":\"text-before-edge\", \"bottom\":\"text-after-edge\", \"middle\":\"central\"};\n return mapping[textBaseline] || mapping.alphabetic;\n }\n\n // Unpack entities lookup where the numbers are in radix 32 to reduce the size\n // entity mapping courtesy of tinymce\n namedEntities = createNamedToNumberedLookup(\n '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' +\n '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' +\n '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' +\n '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' +\n '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' +\n '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' +\n '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' +\n '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' +\n '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' +\n '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' +\n 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' +\n 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' +\n 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' +\n 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' +\n 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' +\n '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' +\n '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' +\n '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' +\n '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' +\n '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' +\n 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' +\n 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' +\n 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' +\n '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' +\n '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32);\n\n\n //Some basic mappings for attributes and default values.\n STYLES = {\n \"strokeStyle\":{\n svgAttr : \"stroke\", //corresponding svg attribute\n canvas : \"#000000\", //canvas default\n svg : \"none\", //svg default\n apply : \"stroke\" //apply on stroke() or fill()\n },\n \"fillStyle\":{\n svgAttr : \"fill\",\n canvas : \"#000000\",\n svg : null, //svg default is black, but we need to special case this to handle canvas stroke without fill\n apply : \"fill\"\n },\n \"lineCap\":{\n svgAttr : \"stroke-linecap\",\n canvas : \"butt\",\n svg : \"butt\",\n apply : \"stroke\"\n },\n \"lineJoin\":{\n svgAttr : \"stroke-linejoin\",\n canvas : \"miter\",\n svg : \"miter\",\n apply : \"stroke\"\n },\n \"miterLimit\":{\n svgAttr : \"stroke-miterlimit\",\n canvas : 10,\n svg : 4,\n apply : \"stroke\"\n },\n \"lineWidth\":{\n svgAttr : \"stroke-width\",\n canvas : 1,\n svg : 1,\n apply : \"stroke\"\n },\n \"globalAlpha\": {\n svgAttr : \"opacity\",\n canvas : 1,\n svg : 1,\n apply : \"fill stroke\"\n },\n \"font\":{\n //font converts to multiple svg attributes, there is custom logic for this\n canvas : \"10px sans-serif\"\n },\n \"shadowColor\":{\n canvas : \"#000000\"\n },\n \"shadowOffsetX\":{\n canvas : 0\n },\n \"shadowOffsetY\":{\n canvas : 0\n },\n \"shadowBlur\":{\n canvas : 0\n },\n \"textAlign\":{\n canvas : \"start\"\n },\n \"textBaseline\":{\n canvas : \"alphabetic\"\n }\n };\n\n /**\n *\n * @param gradientNode - reference to the gradient\n * @constructor\n */\n CanvasGradient = function(gradientNode, ctx) {\n this.__root = gradientNode;\n this.__ctx = ctx;\n };\n\n /**\n * Adds a color stop to the gradient root\n */\n CanvasGradient.prototype.addColorStop = function(offset, color) {\n var stop = this.__ctx.__createElement(\"stop\"), regex, matches;\n stop.setAttribute(\"offset\", offset);\n if(color.indexOf(\"rgba\") !== -1) {\n //separate alpha value, since webkit can't handle it\n regex = /rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?\\.?\\d*)\\s*\\)/gi;\n matches = regex.exec(color);\n stop.setAttribute(\"stop-color\", format(\"rgb({r},{g},{b})\", {r:matches[1], g:matches[2], b:matches[3]}));\n stop.setAttribute(\"stop-opacity\", matches[4]);\n } else {\n stop.setAttribute(\"stop-color\", color);\n }\n this.__root.appendChild(stop);\n };\n\n CanvasPattern = function(pattern, ctx) {\n this.__root = pattern;\n this.__ctx = ctx;\n };\n\n /**\n * The mock canvas context\n * @param o - options include:\n * width - width of your canvas (defaults to 500)\n * height - height of your canvas (defaults to 500)\n * enableMirroring - enables canvas mirroring (get image data) (defaults to false)\n * document - the document object (defaults to the current document)\n */\n ctx = function(o) {\n\n var defaultOptions = { width:500, height:500, enableMirroring : false}, options;\n\n //keep support for this way of calling C2S: new C2S(width,height)\n if(arguments.length > 1) {\n options = defaultOptions;\n options.width = arguments[0];\n options.height = arguments[1];\n } else if( !o ) {\n options = defaultOptions;\n } else {\n options = o;\n }\n\n if(!(this instanceof ctx)) {\n //did someone call this without new?\n return new ctx(options);\n }\n\n //setup options\n this.width = options.width || defaultOptions.width;\n this.height = options.height || defaultOptions.height;\n this.enableMirroring = options.enableMirroring !== undefined ? options.enableMirroring : defaultOptions.enableMirroring;\n\n this.canvas = this; ///point back to this instance!\n this.__document = options.document || document;\n this.__canvas = this.__document.createElement(\"canvas\");\n this.__ctx = this.__canvas.getContext(\"2d\");\n\n this.__setDefaultStyles();\n this.__stack = [this.__getStyleState()];\n this.__groupStack = [];\n\n //the root svg element\n this.__root = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n this.__root.setAttribute(\"version\", 1.1);\n this.__root.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n this.__root.setAttributeNS(\"http://www.w3.org/2000/xmlns/\", \"xmlns:xlink\", \"http://www.w3.org/1999/xlink\");\n this.__root.setAttribute(\"width\", this.width);\n this.__root.setAttribute(\"height\", this.height);\n\n //make sure we don't generate the same ids in defs\n this.__ids = {};\n\n //defs tag\n this.__defs = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n this.__root.appendChild(this.__defs);\n\n //also add a group child. the svg element can't use the transform attribute\n this.__currentElement = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n this.__root.appendChild(this.__currentElement);\n };\n\n\n /**\n * Creates the specified svg element\n * @private\n */\n ctx.prototype.__createElement = function (elementName, properties, resetFill) {\n if (typeof properties === \"undefined\") {\n properties = {};\n }\n\n var element = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", elementName),\n keys = Object.keys(properties), i, key;\n if(resetFill) {\n //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black.\n element.setAttribute(\"fill\", \"none\");\n element.setAttribute(\"stroke\", \"none\");\n }\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n element.setAttribute(key, properties[key]);\n }\n return element;\n };\n\n /**\n * Applies default canvas styles to the context\n * @private\n */\n ctx.prototype.__setDefaultStyles = function() {\n //default 2d canvas context properties see:http://www.w3.org/TR/2dcontext/\n var keys = Object.keys(STYLES), i, key;\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n this[key] = STYLES[key].canvas;\n }\n };\n\n /**\n * Applies styles on restore\n * @param styleState\n * @private\n */\n ctx.prototype.__applyStyleState = function(styleState) {\n var keys = Object.keys(styleState), i, key;\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n this[key] = styleState[key];\n }\n };\n\n /**\n * Gets the current style state\n * @return {Object}\n * @private\n */\n ctx.prototype.__getStyleState = function() {\n var i, styleState = {}, keys = Object.keys(STYLES), key;\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n styleState[key] = this[key];\n }\n return styleState;\n };\n\n /**\n * Apples the current styles to the current SVG element. On \"ctx.fill\" or \"ctx.stroke\"\n * @param type\n * @private\n */\n ctx.prototype.__applyStyleToCurrentElement = function(type) {\n var keys = Object.keys(STYLES), i, style, value, id, regex, matches;\n for(i=0; i<keys.length; i++) {\n style = STYLES[keys[i]];\n value = this[keys[i]];\n if(style.apply) {\n //is this a gradient or pattern?\n if(style.apply.indexOf(\"fill\")!==-1 && value instanceof CanvasPattern) {\n //pattern\n if(value.__ctx) {\n //copy over defs\n while(value.__ctx.__defs.childNodes.length) {\n id = value.__ctx.__defs.childNodes[0].getAttribute(\"id\");\n this.__ids[id] = id;\n this.__defs.appendChild(value.__ctx.__defs.childNodes[0]);\n }\n }\n this.__currentElement.setAttribute(\"fill\", format(\"url(#{id})\", {id:value.__root.getAttribute(\"id\")}));\n }\n else if(style.apply.indexOf(\"fill\")!==-1 && value instanceof CanvasGradient) {\n //gradient\n this.__currentElement.setAttribute(\"fill\", format(\"url(#{id})\", {id:value.__root.getAttribute(\"id\")}));\n } else if(style.apply.indexOf(type)!==-1 && style.svg !== value) {\n if((style.svgAttr === \"stroke\" || style.svgAttr === \"fill\") && value.indexOf(\"rgba\") !== -1) {\n //separate alpha value, since illustrator can't handle it\n regex = /rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?\\.?\\d*)\\s*\\)/gi;\n matches = regex.exec(value);\n this.__currentElement.setAttribute(style.svgAttr, format(\"rgb({r},{g},{b})\", {r:matches[1], g:matches[2], b:matches[3]}));\n this.__currentElement.setAttribute(style.svgAttr+\"-opacity\", matches[4]);\n } else {\n //otherwise only update attribute if right type, and not svg default\n this.__currentElement.setAttribute(style.svgAttr, value);\n }\n }\n }\n }\n\n };\n\n /**\n * Will return the closest group or svg node. May return the current element.\n * @private\n */\n ctx.prototype.__closestGroupOrSvg = function(node) {\n node = node || this.__currentElement;\n if(node.nodeName === \"g\" || node.nodeName === \"svg\") {\n return node;\n } else {\n return this.__closestGroupOrSvg(node.parentNode);\n }\n };\n\n /**\n * Returns the serialized value of the svg so far\n * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes.\n * If true, we attempt to find all named entities and encode it as a numeric entity.\n * @return serialized svg\n */\n ctx.prototype.getSerializedSvg = function(fixNamedEntities) {\n var serialized = new XMLSerializer().serializeToString(this.__root),\n keys, i, key, value, regexp, xmlns;\n\n //IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly\n xmlns = /xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg\".+xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg/gi;\n if(xmlns.test(serialized)) {\n serialized = serialized.replace('xmlns=\"http://www.w3.org/2000/svg','xmlns:xlink=\"http://www.w3.org/1999/xlink');\n }\n\n if(fixNamedEntities) {\n keys = Object.keys(namedEntities);\n //loop over each named entity and replace with the proper equivalent.\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n value = namedEntities[key];\n regexp = new RegExp(key, \"gi\");\n if(regexp.test(serialized)) {\n serialized = serialized.replace(regexp, value);\n }\n }\n }\n\n return serialized;\n };\n\n\n /**\n * Returns the root svg\n * @return\n */\n ctx.prototype.getSvg = function() {\n return this.__root;\n };\n /**\n * Will generate a group tag.\n */\n ctx.prototype.save = function() {\n var group = this.__createElement(\"g\"), parent = this.__closestGroupOrSvg();\n this.__groupStack.push(parent);\n parent.appendChild(group);\n this.__currentElement = group;\n this.__stack.push(this.__getStyleState());\n };\n /**\n * Sets current element to parent, or just root if already root\n */\n ctx.prototype.restore = function(){\n this.__currentElement = this.__groupStack.pop();\n var state = this.__stack.pop();\n this.__applyStyleState(state);\n\n };\n\n /**\n * Helper method to add transform\n * @private\n */\n ctx.prototype.__addTransform = function(t) {\n\n //if the current element has siblings, add another group\n var parent = this.__closestGroupOrSvg();\n if(parent.childNodes.length > 0) {\n var group = this.__createElement(\"g\");\n parent.appendChild(group);\n this.__currentElement = group;\n }\n\n var transform = this.__currentElement.getAttribute(\"transform\");\n if(transform) {\n transform += \" \";\n } else {\n transform = \"\";\n }\n transform += t;\n this.__currentElement.setAttribute(\"transform\", transform);\n };\n\n /**\n * scales the current element\n */\n ctx.prototype.scale = function(x, y) {\n if(y === undefined) {\n y = x;\n }\n this.__addTransform(format(\"scale({x},{y})\", {x:x, y:y}));\n };\n\n /**\n * rotates the current element\n */\n ctx.prototype.rotate = function(angle){\n var degrees = (angle * 180 / Math.PI);\n this.__addTransform(format(\"rotate({angle},{cx},{cy})\", {angle:degrees, cx:0, cy:0}));\n };\n\n /**\n * translates the current element\n */\n ctx.prototype.translate = function(x, y){\n this.__addTransform(format(\"translate({x},{y})\", {x:x,y:y}));\n };\n\n /**\n * applies a transform to the current element\n */\n ctx.prototype.transform = function(a, b, c, d, e, f){\n this.__addTransform(format(\"matrix({a},{b},{c},{d},{e},{f})\", {a:a, b:b, c:c, d:d, e:e, f:f}));\n };\n\n /**\n * Create a new Path Element\n */\n ctx.prototype.beginPath = function(){\n var path, parent;\n\n // Note that there is only one current default path, it is not part of the drawing state.\n // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path\n this.__currentDefaultPath = \"\";\n this.__currentPosition = {};\n\n path = this.__createElement(\"path\", {}, true);\n parent = this.__closestGroupOrSvg();\n parent.appendChild(path);\n this.__currentElement = path;\n };\n\n /**\n * Helper function to apply currentDefaultPath to current path element\n * @private\n */\n ctx.prototype.__applyCurrentDefaultPath = function() {\n if(this.__currentElement.nodeName === \"path\") {\n var d = this.__currentDefaultPath;\n this.__currentElement.setAttribute(\"d\", d);\n } else {\n throw new Error(\"Attempted to apply path command to node \" + this.__currentElement.nodeName);\n }\n };\n\n /**\n * Helper function to add path command\n * @private\n */\n ctx.prototype.__addPathCommand = function(command){\n this.__currentDefaultPath += \" \";\n this.__currentDefaultPath += command;\n };\n\n /**\n * Adds the move command to the current path element,\n * if the currentPathElement is not empty create a new path element\n */\n ctx.prototype.moveTo = function(x,y){\n if(this.__currentElement.nodeName !== \"path\") {\n this.beginPath();\n }\n\n // creates a new subpath with the given point\n this.__currentPosition = {x: x, y: y};\n this.__addPathCommand(format(\"M {x} {y}\", {x:x, y:y}));\n };\n\n /**\n * Closes the current path\n */\n ctx.prototype.closePath = function(){\n this.__addPathCommand(\"Z\");\n };\n\n /**\n * Adds a line to command\n */\n ctx.prototype.lineTo = function(x, y){\n this.__currentPosition = {x: x, y: y};\n if (this.__currentDefaultPath.indexOf('M') > -1) {\n this.__addPathCommand(format(\"L {x} {y}\", {x:x, y:y}));\n } else {\n this.__addPathCommand(format(\"M {x} {y}\", {x:x, y:y}));\n }\n };\n\n /**\n * Add a bezier command\n */\n ctx.prototype.bezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.__currentPosition = {x: x, y: y};\n this.__addPathCommand(format(\"C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}\",\n {cp1x:cp1x, cp1y:cp1y, cp2x:cp2x, cp2y:cp2y, x:x, y:y}));\n };\n\n /**\n * Adds a quadratic curve to command\n */\n ctx.prototype.quadraticCurveTo = function(cpx, cpy, x, y){\n this.__currentPosition = {x: x, y: y};\n this.__addPathCommand(format(\"Q {cpx} {cpy} {x} {y}\", {cpx:cpx, cpy:cpy, x:x, y:y}));\n };\n\n\n /**\n * Return a new normalized vector of given vector\n */\n var normalize = function(vector) {\n var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]);\n return [vector[0] / len, vector[1] / len];\n };\n\n /**\n * Adds the arcTo to the current path\n *\n * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto\n */\n ctx.prototype.arcTo = function(x1, y1, x2, y2, radius) {\n // Let the point (x0, y0) be the last point in the subpath.\n var x0 = this.__currentPosition && this.__currentPosition.x;\n var y0 = this.__currentPosition && this.__currentPosition.y;\n\n // First ensure there is a subpath for (x1, y1).\n if (typeof x0 == \"undefined\" || typeof y0 == \"undefined\") {\n return;\n }\n\n // Negative values for radius must cause the implementation to throw an IndexSizeError exception.\n if (radius < 0) {\n throw new Error(\"IndexSizeError: The radius provided (\" + radius + \") is negative.\");\n }\n\n // If the point (x0, y0) is equal to the point (x1, y1),\n // or if the point (x1, y1) is equal to the point (x2, y2),\n // or if the radius radius is zero,\n // then the method must add the point (x1, y1) to the subpath,\n // and connect that point to the previous point (x0, y0) by a straight line.\n if (((x0 === x1) && (y0 === y1))\n || ((x1 === x2) && (y1 === y2))\n || (radius === 0)) {\n this.lineTo(x1, y1);\n return;\n }\n\n // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line,\n // then the method must add the point (x1, y1) to the subpath,\n // and connect that point to the previous point (x0, y0) by a straight line.\n var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]);\n var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]);\n if (unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === unit_vec_p1_p0[1] * unit_vec_p1_p2[0]) {\n this.lineTo(x1, y1);\n return;\n }\n\n // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius,\n // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1),\n // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2).\n // The points at which this circle touches these two lines are called the start and end tangent points respectively.\n\n // note that both vectors are unit vectors, so the length is 1\n var cos = (unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + unit_vec_p1_p0[1] * unit_vec_p1_p2[1]);\n var theta = Math.acos(Math.abs(cos));\n\n // Calculate origin\n var unit_vec_p1_origin = normalize([\n unit_vec_p1_p0[0] + unit_vec_p1_p2[0],\n unit_vec_p1_p0[1] + unit_vec_p1_p2[1]\n ]);\n var len_p1_origin = radius / Math.sin(theta / 2);\n var x = x1 + len_p1_origin * unit_vec_p1_origin[0];\n var y = y1 + len_p1_origin * unit_vec_p1_origin[1];\n\n // Calculate start angle and end angle\n // rotate 90deg clockwise (note that y axis points to its down)\n var unit_vec_origin_start_tangent = [\n -unit_vec_p1_p0[1],\n unit_vec_p1_p0[0]\n ];\n // rotate 90deg counter clockwise (note that y axis points to its down)\n var unit_vec_origin_end_tangent = [\n unit_vec_p1_p2[1],\n -unit_vec_p1_p2[0]\n ];\n var getAngle = function(vector) {\n // get angle (clockwise) between vector and (1, 0)\n var x = vector[0];\n var y = vector[1];\n if (y >= 0) { // note that y axis points to its down\n return Math.acos(x);\n } else {\n return -Math.acos(x);\n }\n };\n var startAngle = getAngle(unit_vec_origin_start_tangent);\n var endAngle = getAngle(unit_vec_origin_end_tangent);\n\n // Connect the point (x0, y0) to the start tangent point by a straight line\n this.lineTo(x + unit_vec_origin_start_tangent[0] * radius,\n y + unit_vec_origin_start_tangent[1] * radius);\n\n // Connect the start tangent point to the end tangent point by arc\n // and adding the end tangent point to the subpath.\n this.arc(x, y, radius, startAngle, endAngle);\n };\n\n /**\n * Sets the stroke property on the current element\n */\n ctx.prototype.stroke = function(){\n if(this.__currentElement.nodeName === \"path\") {\n this.__currentElement.setAttribute(\"paint-order\", \"fill stroke markers\");\n }\n this.__applyCurrentDefaultPath();\n this.__applyStyleToCurrentElement(\"stroke\");\n };\n\n /**\n * Sets fill properties on the current element\n */\n ctx.prototype.fill = function(){\n if(this.__currentElement.nodeName === \"path\") {\n this.__currentElement.setAttribute(\"paint-order\", \"stroke fill markers\");\n }\n this.__applyCurrentDefaultPath();\n this.__applyStyleToCurrentElement(\"fill\");\n };\n\n /**\n * Adds a rectangle to the path.\n */\n ctx.prototype.rect = function(x, y, width, height){\n if(this.__currentElement.nodeName !== \"path\") {\n this.beginPath();\n }\n this.moveTo(x, y);\n this.lineTo(x+width, y);\n this.lineTo(x+width, y+height);\n this.lineTo(x, y+height);\n this.lineTo(x, y);\n this.closePath();\n };\n\n\n /**\n * adds a rectangle element\n */\n ctx.prototype.fillRect = function(x, y, width, height){\n var rect, parent;\n rect = this.__createElement(\"rect\", {\n x : x,\n y : y,\n width : width,\n height : height\n }, true);\n parent = this.__closestGroupOrSvg();\n parent.appendChild(rect);\n this.__currentElement = rect;\n this.__applyStyleToCurrentElement(\"fill\");\n };\n\n /**\n * Draws a rectangle with no fill\n * @param x\n * @param y\n * @param width\n * @param height\n */\n ctx.prototype.strokeRect = function(x, y, width, height){\n var rect, parent;\n rect = this.__createElement(\"rect\", {\n x : x,\n y : y,\n width : width,\n height : height\n }, true);\n parent = this.__closestGroupOrSvg();\n parent.appendChild(rect);\n this.__currentElement = rect;\n this.__applyStyleToCurrentElement(\"stroke\");\n };\n\n\n /**\n * \"Clears\" a canvas by just drawing a white rectangle in the current group.\n */\n ctx.prototype.clearRect = function(x, y, width, height) {\n var rect, parent = this.__closestGroupOrSvg();\n rect = this.__createElement(\"rect\", {\n x : x,\n y : y,\n width : width,\n height : height,\n fill : \"#FFFFFF\"\n }, true);\n parent.appendChild(rect);\n };\n\n /**\n * Adds a linear gradient to a defs tag.\n * Returns a canvas gradient object that has a reference to it's parent def\n */\n ctx.prototype.createLinearGradient = function(x1, y1, x2, y2){\n var grad = this.__createElement(\"linearGradient\", {\n id : randomString(this.__ids),\n x1 : x1+\"px\",\n x2 : x2+\"px\",\n y1 : y1+\"px\",\n y2 : y2+\"px\",\n \"gradientUnits\" : \"userSpaceOnUse\"\n }, false);\n this.__defs.appendChild(grad);\n return new CanvasGradient(grad, this);\n };\n\n /**\n * Adds a radial gradient to a defs tag.\n * Returns a canvas gradient object that has a reference to it's parent def\n */\n ctx.prototype.createRadialGradient = function(x0, y0, r0, x1, y1, r1){\n var grad = this.__createElement(\"radialGradient\", {\n id : randomString(this.__ids),\n cx : x1+\"px\",\n cy : y1+\"px\",\n r : r1+\"px\",\n fx : x0+\"px\",\n fy : y0+\"px\",\n \"gradientUnits\" : \"userSpaceOnUse\"\n }, false);\n this.__defs.appendChild(grad);\n return new CanvasGradient(grad, this);\n\n };\n\n /**\n * Parses the font string and returns svg mapping\n * @private\n */\n ctx.prototype.__parseFont = function() {\n var regex = /^\\s*(?=(?:(?:[-a-z]+\\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\\1|\\2|\\3)\\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\\d]+(?:\\%|in|[cem]m|ex|p[ctx]))(?:\\s*\\/\\s*(normal|[.\\d]+(?:\\%|in|[cem]m|ex|p[ctx])))?\\s*([-,\\\"\\sa-z]+?)\\s*$/i;\n var fontPart = regex.exec( this.font );\n var data = {\n style : fontPart[1] || 'normal',\n size : fontPart[4] || '10px',\n family : fontPart[6] || 'sans-serif',\n weight: fontPart[3] || 'normal',\n decoration : fontPart[2] || 'normal',\n href : null\n };\n\n //canvas doesn't support underline natively, but we can pass this attribute\n if(this.__fontUnderline === \"underline\") {\n data.decoration = \"underline\";\n }\n\n //canvas also doesn't support linking, but we can pass this as well\n if(this.__fontHref) {\n data.href = this.__fontHref;\n }\n\n return data;\n };\n\n /**\n * Helper to link text fragments\n * @param font\n * @param element\n * @return {*}\n * @private\n */\n ctx.prototype.__wrapTextLink = function(font, element) {\n if(font.href) {\n var a = this.__createElement(\"a\");\n a.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", font.href);\n a.appendChild(element);\n return a;\n }\n return element;\n };\n\n /**\n * Fills or strokes text\n * @param text\n * @param x\n * @param y\n * @param action - stroke or fill\n * @private\n */\n ctx.prototype.__applyText = function(text, x, y, action) {\n var font = this.__parseFont(),\n parent = this.__closestGroupOrSvg(),\n textElement = this.__createElement(\"text\", {\n \"font-family\" : font.family,\n \"font-size\" : font.size,\n \"font-style\" : font.style,\n \"font-weight\" : font.weight,\n \"text-decoration\" : font.decoration,\n \"x\" : x,\n \"y\" : y,\n \"text-anchor\": getTextAnchor(this.textAlign),\n \"dominant-baseline\": getDominantBaseline(this.textBaseline)\n }, true);\n\n textElement.appendChild(this.__document.createTextNode(text));\n this.__currentElement = textElement;\n this.__applyStyleToCurrentElement(action);\n parent.appendChild(this.__wrapTextLink(font,textElement));\n };\n\n /**\n * Creates a text element\n * @param text\n * @param x\n * @param y\n */\n ctx.prototype.fillText = function(text, x, y){\n this.__applyText(text, x, y, \"fill\");\n };\n\n /**\n * Strokes text\n * @param text\n * @param x\n * @param y\n */\n ctx.prototype.strokeText = function(text, x, y){\n this.__applyText(text, x, y, \"stroke\");\n };\n\n /**\n * No need to implement this for svg.\n * @param text\n * @return {TextMetrics}\n */\n ctx.prototype.measureText = function(text){\n this.__ctx.font = this.font;\n return this.__ctx.measureText(text);\n };\n\n /**\n * Arc command!\n */\n ctx.prototype.arc = function(x, y, radius, startAngle, endAngle, counterClockwise) {\n // in canvas no circle is drawn if no angle is provided.\n if (startAngle === endAngle) {\n return;\n }\n startAngle = startAngle % (2*Math.PI);\n endAngle = endAngle % (2*Math.PI);\n if(startAngle === endAngle) {\n //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle)\n endAngle = ((endAngle + (2*Math.PI)) - 0.001 * (counterClockwise ? -1 : 1)) % (2*Math.PI);\n }\n var endX = x+radius*Math.cos(endAngle),\n endY = y+radius*Math.sin(endAngle),\n startX = x+radius*Math.cos(startAngle),\n startY = y+radius*Math.sin(startAngle),\n sweepFlag = counterClockwise ? 0 : 1,\n largeArcFlag = 0,\n diff = endAngle - startAngle;\n\n // https://github.com/gliffy/canvas2svg/issues/4\n if(diff < 0) {\n diff += 2*Math.PI;\n }\n\n if(counterClockwise) {\n largeArcFlag = diff > Math.PI ? 0 : 1;\n } else {\n largeArcFlag = diff > Math.PI ? 1 : 0;\n }\n\n this.lineTo(startX, startY);\n this.__addPathCommand(format(\"A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}\",\n {rx:radius, ry:radius, xAxisRotation:0, largeArcFlag:largeArcFlag, sweepFlag:sweepFlag, endX:endX, endY:endY}));\n\n this.__currentPosition = {x: endX, y: endY};\n };\n\n /**\n * Generates a ClipPath from the clip command.\n */\n ctx.prototype.clip = function(){\n var group = this.__closestGroupOrSvg(),\n clipPath = this.__createElement(\"clipPath\"),\n id = randomString(this.__ids),\n newGroup = this.__createElement(\"g\");\n\n group.removeChild(this.__currentElement);\n clipPath.setAttribute(\"id\", id);\n clipPath.appendChild(this.__currentElement);\n\n this.__defs.appendChild(clipPath);\n\n //set the clip path to this group\n group.setAttribute(\"clip-path\", format(\"url(#{id})\", {id:id}));\n\n //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations\n // to this path\n group.appendChild(newGroup);\n\n this.__currentElement = newGroup;\n\n };\n\n /**\n * Draws a canvas, image or mock context to this canvas.\n * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support.\n * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage\n */\n ctx.prototype.drawImage = function(){\n //convert arguments to a real array\n var args = Array.prototype.slice.call(arguments),\n image=args[0],\n dx, dy, dw, dh, sx=0, sy=0, sw, sh, parent, svg, defs, group,\n currentElement, svgImage, canvas, context, id;\n\n if(args.length === 3) {\n dx = args[1];\n dy = args[2];\n sw = image.width;\n sh = image.height;\n dw = sw;\n dh = sh;\n } else if(args.length === 5) {\n dx = args[1];\n dy = args[2];\n dw = args[3];\n dh = args[4];\n sw = image.width;\n sh = image.height;\n } else if(args.length === 9) {\n sx = args[1];\n sy = args[2];\n sw = args[3];\n sh = args[4];\n dx = args[5];\n dy = args[6];\n dw = args[7];\n dh = args[8];\n } else {\n throw new Error(\"Inavlid number of arguments passed to drawImage: \" + arguments.length);\n }\n\n parent = this.__closestGroupOrSvg();\n currentElement = this.__currentElement;\n\n if(image instanceof ctx) {\n //canvas2svg mock canvas context. In the future we may want to clone nodes instead.\n //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context.\n svg = image.getSvg();\n defs = svg.childNodes[0];\n while(defs.childNodes.length) {\n id = defs.childNodes[0].getAttribute(\"id\");\n this.__ids[id] = id;\n this.__defs.appendChild(defs.childNodes[0]);\n }\n group = svg.childNodes[1];\n parent.appendChild(group);\n this.__currentElement = group;\n this.translate(dx, dy);\n this.__currentElement = currentElement;\n } else if(image.nodeName === \"CANVAS\" || image.nodeName === \"IMG\") {\n //canvas or image\n svgImage = this.__createElement(\"image\");\n svgImage.setAttribute(\"width\", dw);\n svgImage.setAttribute(\"height\", dh);\n svgImage.setAttribute(\"preserveAspectRatio\", \"none\");\n\n if(sx || sy || sw !== image.width || sh !== image.height) {\n //crop the image using a temporary canvas\n canvas = this.__document.createElement(\"canvas\");\n canvas.width = dw;\n canvas.height = dh;\n context = canvas.getContext(\"2d\");\n context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh);\n image = canvas;\n }\n\n svgImage.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\",\n image.nodeName === \"CANVAS\" ? image.toDataURL() : image.getAttribute(\"src\"));\n parent.appendChild(svgImage);\n this.__currentElement = svgImage;\n this.translate(dx, dy);\n this.__currentElement = currentElement;\n }\n };\n\n /**\n * Generates a pattern tag\n */\n ctx.prototype.createPattern = function(image, repetition){\n var pattern = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"pattern\"), id = randomString(this.__ids),\n img;\n pattern.setAttribute(\"id\", id);\n pattern.setAttribute(\"width\", image.width);\n pattern.setAttribute(\"height\", image.height);\n if(image.nodeName === \"CANVAS\" || image.nodeName === \"IMG\") {\n img = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\n img.setAttribute(\"width\", image.width);\n img.setAttribute(\"height\", image.height);\n img.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\",\n image.nodeName === \"CANVAS\" ? image.toDataURL() : image.getAttribute(\"src\"));\n pattern.appendChild(img);\n this.__defs.appendChild(pattern);\n } else if(image instanceof ctx) {\n pattern.appendChild(image.__root.childNodes[1]);\n this.__defs.appendChild(pattern);\n }\n return new CanvasPattern(pattern, this);\n };\n\n /**\n * Not yet implemented\n */\n ctx.prototype.drawFocusRing = function(){};\n ctx.prototype.createImageData = function(){};\n ctx.prototype.getImageData = function(){};\n ctx.prototype.putImageData = function(){};\n ctx.prototype.globalCompositeOperation = function(){};\n ctx.prototype.setTransform = function(){};\n\n //add options for alternative namespace\n if (typeof window === \"object\") {\n window.C2S = ctx;\n }\n\n // CommonJS/Browserify\n if (typeof module === \"object\" && typeof module.exports === \"object\") {\n module.exports = ctx;\n }\n\n}());\n","/**\n * p5.pattern (zenozeng/p5.pattern, the SYM380 fork) integration.\n *\n * p5.pattern's drawing functions all share a common shape:\n *\n * `<shape>Pattern(...args)` →\n * _disableColor(this); // transparent fill + no stroke\n * this.<shape>(...args); // invisible path\n * _patternControler.applyPattern(x, y, w, h)\n * // save + clip + many noise ops + restore\n *\n * Because the shape itself is transparent, our SVG export loses it entirely —\n * the only thing visible is the noise pattern, and the only way to capture\n * each call's UNIQUE color/angle gradient is to rasterize it.\n *\n * Strategy: BEFORE the original call we\n * (1) emit a synthetic vector op (type 3) for the shape itself, tagged\n * with a unique `patternId`, so the SVG export draws an editable\n * path/ellipse/polygon at the right place; and\n * (2) open a raster region tagged with the same `patternId` + the shape's\n * bounding box, so the SVG replay knows to allocate ITS OWN canvas\n * for this call, capture only that call's noise output, and emit a\n * per-call `<pattern>` element in `<defs>` referenced by url(#patternId).\n *\n * Result: each rectPattern/ellipsePattern/etc. in the source sketch becomes\n * one `<path fill=\"url(#…)\"/>` + one `<pattern>` in the SVG, with the pattern\n * holding the call's specific colorful gradient rather than a single shared\n * raster of every call combined.\n */\n\nconst TAU = Math.PI * 2;\n\n/** Monotonic counter for unique pattern IDs across a session. */\nlet patternIdCounter = 0;\nfunction nextPatternId() { return `p5ExportPattern_${++patternIdCounter}`; }\n\n/** Pick a representative color from the active gradient palette. Used as a\n * fallback fill for synthetic vectors when no raster pattern is available. */\nfunction pickPaletteColor(inst) {\n const pc = inst._patternControler;\n const palette = pc && Array.isArray(pc.colors) ? pc.colors : null;\n if (!palette || palette.length === 0) return '#888888';\n const c = palette[palette.length - 1];\n return typeof c === 'string' ? c : (c && typeof c.toString === 'function' ? c.toString() : '#888888');\n}\n\n/** Mirror p5.pattern's private _modeAdjust — return the rect-mode-adjusted bbox. */\nfunction modeAdjust(a, b, c, d, mode) {\n if (mode === 'corners') return { x: a, y: b, w: c - a, h: d - b };\n if (mode === 'radius') return { x: a - c, y: b - d, w: 2 * c, h: 2 * d };\n if (mode === 'center') return { x: a - c * 0.5, y: b - d * 0.5, w: c, h: d };\n return { x: a, y: b, w: c, h: d }; // corner\n}\n\nfunction readRectMode(inst) {\n return (inst._renderer && inst._renderer.states && inst._renderer.states.rectMode) || 'corner';\n}\nfunction readEllipseMode(inst) {\n return (inst._renderer && inst._renderer.states && inst._renderer.states.ellipseMode) || 'center';\n}\n\n/** Push a synthetic-vector op onto the SVG recorder. Op kind 3 = \"render\n * this onto c2s ONLY, never into a raster region, and don't touch canvas\". */\nfunction injectVector(inst, name, payload) {\n const rec = inst._p5ExportSVGRecorder;\n if (!rec) return;\n rec.ops.push([3, name, payload]);\n}\n\n/** Push a raster-region begin/end op carrying metadata. */\nfunction injectBeginRaster(inst, meta) {\n const rec = inst._p5ExportSVGRecorder;\n if (!rec) return;\n rec.ops.push([2, 'beginRaster', meta]);\n}\nfunction injectEndRaster(inst) {\n const rec = inst._p5ExportSVGRecorder;\n if (!rec) return;\n rec.ops.push([2, 'endRaster']);\n}\n\n/** Wrap one p5.pattern function. */\nfunction wrap(proto, name, computeShape) {\n const orig = proto[name];\n if (typeof orig !== 'function' || orig.__p5ExportWrapped) return;\n proto[name] = function (...args) {\n let patternId, shape;\n try {\n shape = computeShape(this, args);\n if (shape) {\n patternId = nextPatternId();\n const color = pickPaletteColor(this);\n injectVector(this, shape.kind, { ...shape, color, patternId });\n }\n } catch (_) { /* never block the user's call */ }\n const wrapping = !!this._p5ExportSVGRecorder && !!patternId && !!shape;\n if (wrapping) injectBeginRaster(this, { bbox: shape, patternId });\n try {\n return orig.apply(this, args);\n } finally {\n if (wrapping) injectEndRaster(this);\n }\n };\n proto[name].__p5ExportWrapped = true;\n}\n\n/** Names of every p5.pattern shape function we hook. */\nconst PATTERN_FN_NAMES = [\n 'rectPattern', 'squarePattern',\n 'ellipsePattern', 'circlePattern', 'arcPattern',\n 'trianglePattern', 'quadPattern'\n];\n\n/**\n * Install hooks on every p5.pattern *Pattern function. Idempotent. Returns\n * `true` if p5.pattern was detected and wrapped.\n *\n * IMPORTANT: in p5 2.0 global mode, p5 caches `bind(instance)` copies of\n * every prototype method onto `window` when the instance is constructed\n * (see `bindGlobal` in node_modules/p5/lib/p5.js). That happens BEFORE\n * `presetup` fires, so by the time we run, the global `rectPattern` etc.\n * are already bound to the ORIGINAL prototype methods. Patching the\n * prototype alone leaves those bound globals dangling — we ALSO have to\n * re-bind the window properties.\n */\nexport function wrapPatternPlugin(p5, p5Instance) {\n if (!p5 || !p5.prototype) return false;\n const proto = p5.prototype;\n if (typeof proto.rectPattern !== 'function') return false; // p5.pattern not loaded\n // Install the prototype-level wrap once. The window-global rebind below\n // runs EVERY time, because in p5 1.x global mode the `beforeSetup` hook\n // fires with `this=window` (not the instance), so the FIRST call to\n // wrapPatternPlugin can't reach the instance to perform the rebind. A\n // later call from our createCanvas wrap DOES have the instance and\n // needs to re-bind even though prototype hooks are already installed.\n const alreadyInstalled = !!proto.__p5ExportPatternHooksInstalled;\n if (!alreadyInstalled) proto.__p5ExportPatternHooksInstalled = true;\n\n // Bridge p5 2.0's renderer states → the underscore-prefixed properties\n // that p5.pattern (a p5 1.x plugin) reads directly on the renderer.\n //\n // Only install on p5 2.0+, detected by the presence of a `states` object\n // on the renderer instance (the p5 2.0 architecture). On p5 1.x the\n // underscore properties already exist as plain own/inherited fields on\n // the renderer — defining our own getter would shadow them and\n // overwrite their real values with `undefined`.\n if (p5Instance && p5Instance._renderer && p5Instance._renderer.states) {\n const Renderer = p5.Renderer || p5Instance._renderer.constructor;\n if (Renderer && Renderer.prototype && !Renderer.prototype.__p5ExportModeBridged) {\n Renderer.prototype.__p5ExportModeBridged = true;\n for (const k of ['rectMode', 'ellipseMode', 'imageMode', 'colorMode']) {\n Object.defineProperty(Renderer.prototype, '_' + k, {\n configurable: true,\n get() { return this.states && this.states[k]; },\n set(v) { if (this.states) this.states[k] = v; }\n });\n }\n }\n }\n\n if (!alreadyInstalled) {\n wrap(proto, 'rectPattern', (inst, a) => ({\n kind: 'rect', ...modeAdjust(a[0], a[1], a[2], a[3], readRectMode(inst))\n }));\n wrap(proto, 'squarePattern', (inst, a) => ({\n kind: 'rect', ...modeAdjust(a[0], a[1], a[2], a[2], readRectMode(inst))\n }));\n\n wrap(proto, 'ellipsePattern', (inst, a) => ({\n kind: 'ellipse', ...modeAdjust(a[0], a[1], a[2], a[3], readEllipseMode(inst))\n }));\n wrap(proto, 'circlePattern', (inst, a) => ({\n kind: 'ellipse', ...modeAdjust(a[0], a[1], a[2], a[2], readEllipseMode(inst))\n }));\n\n wrap(proto, 'arcPattern', (inst, a) => ({\n kind: 'ellipse', ...modeAdjust(a[0], a[1], a[2], a[3], readEllipseMode(inst))\n }));\n wrap(proto, 'trianglePattern', (inst, a) => {\n const xs = [a[0], a[2], a[4]], ys = [a[1], a[3], a[5]];\n const minX = Math.min(...xs), maxX = Math.max(...xs);\n const minY = Math.min(...ys), maxY = Math.max(...ys);\n return {\n kind: 'polygon',\n points: [[a[0], a[1]], [a[2], a[3]], [a[4], a[5]]],\n x: minX, y: minY, w: maxX - minX, h: maxY - minY\n };\n });\n wrap(proto, 'quadPattern', (inst, a) => {\n const xs = [a[0], a[2], a[4], a[6]], ys = [a[1], a[3], a[5], a[7]];\n const minX = Math.min(...xs), maxX = Math.max(...xs);\n const minY = Math.min(...ys), maxY = Math.max(...ys);\n return {\n kind: 'polygon',\n points: [[a[0], a[1]], [a[2], a[3]], [a[4], a[5]], [a[6], a[7]]],\n x: minX, y: minY, w: maxX - minX, h: maxY - minY\n };\n });\n }\n\n // Re-bind the window globals. p5 already cached bind(instance) copies of\n // the original (unwrapped) prototype methods on window at construction\n // time — overwrite those bindings so user-level global calls route\n // through our wrap. We use a GETTER (not a value) so the binding stays\n // canonical: every access to `window.rectPattern` resolves to the\n // current `p5.prototype.rectPattern` bound to the instance. This makes\n // the rebind survive p5 1.x's `friendlyBindGlobal` even if that fires\n // AFTER our hook, and lets a write `window.rectPattern = …` (from\n // user code or tests) silently no-op rather than silently un-hooking\n // the patterns. p5 2.0 doesn't need any of this — its bindGlobal runs\n // before user setup, after addons register — but a single, robust path\n // serves both versions.\n const instance =\n (p5Instance && p5Instance._isGlobal && p5Instance) ||\n (typeof window !== 'undefined' && window.p5 && window.p5.instance) ||\n null;\n if (instance && instance._isGlobal && typeof window !== 'undefined') {\n for (const name of PATTERN_FN_NAMES) {\n const protoFn = proto[name];\n if (typeof protoFn !== 'function') continue;\n try {\n // Snapshot the bound wrap once; reuse for every read.\n let boundFn = protoFn.bind(instance);\n Object.defineProperty(window, name, {\n configurable: true,\n enumerable: true,\n get() { return boundFn; },\n set(_v) { /* swallow — keep our hook in place */ }\n });\n } catch (_) { /* getter-only or otherwise locked — just ignore */ }\n }\n }\n\n return true;\n}\n\n/** Legacy shared-pattern ID, used as a fallback for user-invoked\n * beginRasterRegion() without bbox metadata. */\nexport const SHARED_RASTER_PATTERN_ID = 'p5ExportSharedRaster';\n\n/**\n * Render a recorded synthetic-vector op onto a canvas2svg context. Called\n * by replayToSVG when it encounters an op of type 3.\n *\n * Fill resolution:\n * - payload.patternId present → `url(#<patternId>)` (per-call SVG <pattern>\n * emitted in <defs> by the SVG replay loop).\n * - else if useSharedPattern → `url(#p5ExportSharedRaster)` (legacy mode).\n * - else → `payload.color` (a solid palette color).\n */\nexport function replaySyntheticVector(c2s, name, payload, useSharedPattern) {\n if (!payload || !c2s) return;\n const oldFill = c2s.fillStyle;\n if (payload.patternId) {\n c2s.fillStyle = `url(#${payload.patternId})`;\n } else if (useSharedPattern) {\n c2s.fillStyle = `url(#${SHARED_RASTER_PATTERN_ID})`;\n } else {\n c2s.fillStyle = payload.color || '#888';\n }\n try {\n if (name === 'rect') {\n c2s.beginPath();\n c2s.rect(payload.x, payload.y, payload.w, payload.h);\n c2s.fill();\n } else if (name === 'ellipse') {\n const rx = payload.w / 2, ry = payload.h / 2;\n const cx = payload.x + rx, cy = payload.y + ry;\n c2s.beginPath();\n c2s.ellipse(cx, cy, rx, ry, 0, 0, TAU);\n c2s.fill();\n } else if (name === 'polygon') {\n const pts = payload.points || [];\n if (pts.length >= 2) {\n c2s.beginPath();\n c2s.moveTo(pts[0][0], pts[0][1]);\n for (let i = 1; i < pts.length; i++) c2s.lineTo(pts[i][0], pts[i][1]);\n c2s.closePath();\n c2s.fill();\n }\n }\n } finally {\n c2s.fillStyle = oldFill;\n }\n}\n","import C2S from 'canvas2svg';\nimport { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { wrapPatternPlugin, replaySyntheticVector, SHARED_RASTER_PATTERN_ID } from './pattern-plugin.js';\n\n/**\n * SVG export for p5.js 2.0.\n *\n * Strategy: from postsetup onward, we install a Proxy in front of the\n * renderer's `drawingContext`. Every Canvas2D call (`fillRect`, `ellipse`,\n * `setTransform`, …) and every property write (`fillStyle = …`) gets\n * forwarded to the real context AND appended to an op log. When the user\n * calls `saveSVG()` we replay that log into a fresh canvas2svg recorder.\n *\n * The big win: trail/fade sketches that rely on accumulated canvas pixels\n * (e.g., `fill(20, 20, 22, 30); rect(0,0,w,h)`) come out of the export\n * looking just like the on-screen result, because every recorded\n * semi-transparent rect and every recorded circle is replayed in order.\n *\n * Caveats:\n * - P2D sketches only. WebGL falls back to raster-in-SVG.\n * - The op log grows unbounded. Call `clearSVGRecording()` to reset.\n * - CanvasGradient / CanvasPattern objects are tied to the real context\n * and won't replay cleanly on canvas2svg — those frames just get\n * skipped. Solid-color sketches are unaffected.\n */\n\n// canvas2svg 1.0.16 predates several Canvas2D additions p5 2.0 relies on.\n// Patch the missing/broken bits on first use.\nlet _c2sPatched = false;\nfunction patchC2S() {\n if (_c2sPatched) return;\n _c2sPatched = true;\n\n C2S.prototype.setTransform = function (a, b, c, d, e, f) {\n // Where the new transform group lives depends on whether we're inside\n // a save() scope:\n //\n // - At the SVG root (no save): append as a sibling under <svg> so a\n // long trail sketch (one resetMatrix per frame) doesn't ladder the\n // tree N levels deep. setTransforms become siblings — flat tree.\n //\n // - Inside a save() scope: append nested under the current group. p5's\n // `background()` is the canonical case — it does push(); resetMatrix();\n // fillRect(); pop();, all wrapped in save/restore. If setTransform\n // jumped to the root mid-scope, the fillRect group would end up as\n // a LATER root-level sibling and paint on top of every user draw\n // that follows the background's restore.\n const inScope = this.__groupStack && this.__groupStack.length > 0;\n const parent = inScope ? this.__closestGroupOrSvg() : this.__root;\n const group = this.__createElement('g');\n parent.appendChild(group);\n this.__currentElement = group;\n const isIdentity = a === 1 && b === 0 && c === 0 && d === 1 && e === 0 && f === 0;\n if (!isIdentity) {\n this.__currentElement.setAttribute('transform', `matrix(${a},${b},${c},${d},${e},${f})`);\n }\n };\n\n C2S.prototype.resetTransform = function () { this.setTransform(1, 0, 0, 1, 0, 0); };\n\n C2S.prototype.ellipse = function (x, y, rx, ry, rotation, startAngle, endAngle, ccw) {\n if (startAngle === endAngle) return;\n rotation = rotation || 0;\n const TAU = Math.PI * 2;\n startAngle = startAngle % TAU;\n endAngle = endAngle % TAU;\n if (startAngle === endAngle) {\n endAngle = ((endAngle + TAU) - 0.001 * (ccw ? -1 : 1)) % TAU;\n }\n const cosR = Math.cos(rotation), sinR = Math.sin(rotation);\n const toCanvas = (a) => {\n const lx = rx * Math.cos(a), ly = ry * Math.sin(a);\n return { x: x + lx * cosR - ly * sinR, y: y + lx * sinR + ly * cosR };\n };\n const start = toCanvas(startAngle);\n const end = toCanvas(endAngle);\n let diff = endAngle - startAngle;\n if (diff < 0) diff += TAU;\n const sweepFlag = ccw ? 0 : 1;\n const largeArcFlag = ccw ? (diff > Math.PI ? 0 : 1) : (diff > Math.PI ? 1 : 0);\n const rotDeg = rotation * 180 / Math.PI;\n\n this.lineTo(start.x, start.y);\n this.__addPathCommand(\n 'A ' + rx + ' ' + ry + ' ' + rotDeg + ' ' + largeArcFlag + ' ' + sweepFlag + ' ' + end.x + ' ' + end.y\n );\n this.__currentPosition = { x: end.x, y: end.y };\n };\n\n if (typeof C2S.prototype.roundRect !== 'function') {\n C2S.prototype.roundRect = function (x, y, w, h, radii) {\n let tl, tr, br, bl;\n if (typeof radii === 'number') tl = tr = br = bl = radii;\n else if (Array.isArray(radii)) {\n if (radii.length === 1) tl = tr = br = bl = radii[0];\n else if (radii.length === 2) { tl = br = radii[0]; tr = bl = radii[1]; }\n else { [tl, tr, br, bl] = [radii[0], radii[1], radii[2], radii[3] ?? radii[1]]; }\n } else tl = tr = br = bl = 0;\n const max = Math.min(Math.abs(w), Math.abs(h)) / 2;\n tl = Math.min(tl, max); tr = Math.min(tr, max); br = Math.min(br, max); bl = Math.min(bl, max);\n this.moveTo(x + tl, y);\n this.lineTo(x + w - tr, y);\n this.ellipse(x + w - tr, y + tr, tr, tr, 0, -Math.PI / 2, 0);\n this.lineTo(x + w, y + h - br);\n this.ellipse(x + w - br, y + h - br, br, br, 0, 0, Math.PI / 2);\n this.lineTo(x + bl, y + h);\n this.ellipse(x + bl, y + h - bl, bl, bl, 0, Math.PI / 2, Math.PI);\n this.lineTo(x, y + tl);\n this.ellipse(x + tl, y + tl, tl, tl, 0, Math.PI, Math.PI * 1.5);\n };\n }\n\n delete C2S.prototype.globalCompositeOperation;\n\n // Defense in depth: canvas2svg only knows how to split alpha out of\n // `rgba(...)` strings. p5.js 2.0 stringifies semi-transparent colors as\n // 8-digit hex (#RRGGBBAA), which would otherwise land as `fill=\"#1414161E\"`\n // and get rendered as fully opaque black by many viewers (Illustrator,\n // older browsers, anything pre-SVG2). My replay loop normalizes these,\n // but we also wrap canvas2svg's own style-apply method so any code path\n // that bypasses our loop still gets correct fill-opacity output.\n const origApply = C2S.prototype.__applyStyleToCurrentElement;\n const HEX8 = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\n const hexToRgba = (v) => {\n if (typeof v !== 'string') return v;\n const m = HEX8.exec(v);\n if (!m) return v;\n const a = Math.round((parseInt(m[4], 16) / 255) * 1000) / 1000;\n return `rgba(${parseInt(m[1], 16)},${parseInt(m[2], 16)},${parseInt(m[3], 16)},${a})`;\n };\n C2S.prototype.__applyStyleToCurrentElement = function (type) {\n const origFill = this.fillStyle;\n const origStroke = this.strokeStyle;\n if (typeof origFill === 'string') this.fillStyle = hexToRgba(origFill);\n if (typeof origStroke === 'string') this.strokeStyle = hexToRgba(origStroke);\n try {\n return origApply.call(this, type);\n } finally {\n // Restore the originals so the c2s caller's notion of the current\n // style isn't surprised by our temporary swap.\n this.fillStyle = origFill;\n this.strokeStyle = origStroke;\n }\n };\n}\n\n/**\n * Build a Proxy around the real context. Every method call and every\n * property write is forwarded AND logged. Reads pass through unchanged.\n *\n * Ops are stored as compact tuples `[kind, name, payload]`:\n * kind 0 = method call (payload = args array)\n * kind 1 = property set (payload = value)\n *\n * A sliding window of the last `maxFrames` frames is kept — older ops are\n * dropped at frame boundaries (tracked via the `predraw` lifecycle below).\n * This prevents the op log from growing unbounded on long sketches while\n * still preserving enough trail history to look right for fade sketches.\n * Tune via `fn.setSVGRecordingFrames(n)` or `window.p5ExportConfig.svgMaxFrames`.\n */\nconst DEFAULT_MAX_FRAMES = 60;\n\n// Style properties whose latest value MUST be preserved across trim\n// boundaries. Without this, sketches that set fillStyle once (and rely on\n// p5's _setFill cache to skip subsequent sets) would have their only\n// fillStyle SET op trimmed, leaving canvas2svg to fall back to default\n// black on every trail rect. Same risk for strokeStyle, lineWidth, etc.\nconst PRESERVED_STYLE_PROPS = new Set([\n 'fillStyle', 'strokeStyle', 'lineWidth', 'lineCap', 'lineJoin',\n 'miterLimit', 'globalAlpha', 'font', 'textAlign', 'textBaseline',\n 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'\n]);\n\n// Monotonic ID for SVG gradient/pattern definitions, shared across the\n// session. The actual gradient OBJECTS are mutable (addColorStop), so we\n// keep the parameters/stops in a side table rather than serializing them\n// into the op log; ops just reference the gradient by id.\nlet gradientIdCounter = 0;\nconst GRADIENT_BY_ID = new Map(); // id → { kind, args, stops, id }\nfunction nextGradientId() { return `p5ExportGrad_${++gradientIdCounter}`; }\n\nfunction makeRecorder(realCtx) {\n const ops = [];\n // frameStarts[i] is the index in `ops` where frame i begins.\n // We always keep the current frame's start as the last entry.\n const frameStarts = [0];\n const rec = {\n proxy: null,\n ops,\n maxFrames: DEFAULT_MAX_FRAMES,\n clear() {\n ops.length = 0;\n frameStarts.length = 1;\n frameStarts[0] = 0;\n },\n /**\n * Mark the boundary between two frames. Called from `predraw`. Trims\n * the oldest frame's ops if we've exceeded `maxFrames` — but before\n * each splice, captures the latest value of every preserved style\n * property in the dropped region and re-emits those at the start of\n * the kept region. That guarantees subsequent ops don't lose the\n * fillStyle/strokeStyle/etc. they implicitly depend on.\n */\n markFrameBoundary() {\n if (this.maxFrames === Infinity) {\n frameStarts.push(ops.length);\n return;\n }\n frameStarts.push(ops.length);\n // We allow up to maxFrames completed frames + 1 in-progress.\n while (frameStarts.length > this.maxFrames + 1) {\n const dropTo = frameStarts[1];\n if (dropTo > 0) {\n // Scan the about-to-be-dropped ops for the latest value of each\n // preserved style property — these define the canvas state that\n // the kept ops assume is \"already in place\".\n const lastValue = {};\n for (let i = 0; i < dropTo; i++) {\n const op = ops[i];\n if (op[0] === 1 && PRESERVED_STYLE_PROPS.has(op[1])) {\n lastValue[op[1]] = op[2];\n }\n }\n ops.splice(0, dropTo);\n const carry = [];\n for (const name in lastValue) carry.push([1, name, lastValue[name]]);\n if (carry.length) ops.unshift(...carry);\n // Adjust frameStarts: lost `dropTo` ops, gained `carry.length`.\n const delta = carry.length - dropTo;\n for (let i = 1; i < frameStarts.length; i++) frameStarts[i] += delta;\n }\n frameStarts.shift();\n }\n }\n };\n // Gradient/pattern factories return a CanvasGradient (mutable, addColorStop\n // is called later). We wrap them so we can record the stops as they're\n // added — otherwise the SVG replay has no way to recreate the gradient\n // (the live ctx's gradient object isn't transferable to canvas2svg).\n const GRADIENT_FACTORIES = new Set(['createLinearGradient', 'createRadialGradient', 'createConicGradient']);\n\n const wrapGradient = (grad, kind, args) => {\n if (!grad) return grad;\n const id = nextGradientId();\n const meta = { id, kind, args: Array.from(args), stops: [] };\n GRADIENT_BY_ID.set(id, meta);\n try { grad.__p5ExportGradId = id; } catch (_) { /* sealed object — fine */ }\n return new Proxy(grad, {\n get(t, p) {\n if (p === 'addColorStop' && typeof t[p] === 'function') {\n return function (offset, color) {\n meta.stops.push({ offset, color });\n return t[p].call(t, offset, color);\n };\n }\n const v = t[p];\n return typeof v === 'function' ? v.bind(t) : v;\n }\n });\n };\n\n rec.proxy = new Proxy(realCtx, {\n get(target, prop) {\n const v = target[prop];\n if (typeof v === 'function') {\n return function (...args) {\n ops.push([0, prop, args]);\n const result = v.apply(target, args);\n if (GRADIENT_FACTORIES.has(prop)) {\n return wrapGradient(result, prop, args);\n }\n return result;\n };\n }\n return v;\n },\n set(target, prop, value) {\n // For gradient/pattern values, store the gradient id (not the live\n // object) in the op log so the SVG replay can resolve it to an SVG\n // <linearGradient>/<radialGradient> in defs.\n if ((prop === 'fillStyle' || prop === 'strokeStyle') && value && typeof value === 'object') {\n const id = value.__p5ExportGradId;\n ops.push([1, prop, id ? { __p5ExportGradId: id } : value]);\n } else {\n ops.push([1, prop, value]);\n }\n target[prop] = value;\n return true;\n }\n });\n return rec;\n}\n\nfunction isP2DContext(ctx) {\n // 2D contexts have fillRect; WebGL ones don't.\n return !!(ctx && typeof ctx.fillRect === 'function');\n}\n\n/**\n * Install the recording Proxy on the active renderer. Shadow the\n * prototype getter on both the renderer and the p5 instance so p5's\n * internal drawing (and user-level `drawingContext` access) both pass\n * through the proxy.\n */\nfunction installRecorder(p) {\n if (!p || p._p5ExportSVGRecorder) return;\n const renderer = p._renderer;\n if (!renderer) return;\n const real = renderer.drawingContext;\n if (!isP2DContext(real)) return;\n\n const rec = makeRecorder(real);\n // Pick up a user-set default before any draw runs.\n const cfg = (typeof window !== 'undefined' && window.p5ExportConfig) || {};\n if (typeof cfg.svgMaxFrames === 'number') {\n rec.maxFrames = cfg.svgMaxFrames > 0 ? cfg.svgMaxFrames : Infinity;\n }\n p._p5ExportSVGRecorder = rec;\n const desc = { value: rec.proxy, configurable: true, writable: true, enumerable: true };\n Object.defineProperty(renderer, 'drawingContext', desc);\n Object.defineProperty(p, 'drawingContext', desc);\n}\n\n/**\n * canvas2svg only parses `rgba(r,g,b,a)` notation when splitting alpha into\n * a separate `*-opacity` attribute. p5.js 2.0, however, stringifies colors\n * with alpha as 8-digit hex (`#RRGGBBAA`). Without normalization, canvas2svg\n * writes the raw 8-digit hex into the SVG; many viewers (Illustrator, older\n * Inkscape, anything pre-SVG2) interpret that as opaque black, which\n * covers every frame underneath it and erases your trail history.\n */\nfunction normalizeColorForC2S(value) {\n if (typeof value !== 'string') return value;\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(value);\n if (!m) return value;\n const a = parseInt(m[4], 16) / 255;\n return `rgba(${parseInt(m[1], 16)},${parseInt(m[2], 16)},${parseInt(m[3], 16)},${a})`;\n}\n\n/**\n * Color string is fully opaque (alpha === 1).\n * - \"#RGB\", \"#RRGGBB\", \"rgb(...)\" — always opaque\n * - \"#RRGGBBAA\" — opaque iff AA === 0xff\n * - \"rgba(r,g,b,a)\" — opaque iff a >= 1\n * - everything else (named colors, gradients, patterns) — assume opaque\n */\nfunction isOpaqueColor(value) {\n if (typeof value !== 'string') return true;\n // 8-digit hex with explicit alpha\n let m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(value);\n if (m) return parseInt(m[4], 16) === 255;\n // rgba(...) with explicit alpha\n m = /^rgba\\(\\s*[^,]+,\\s*[^,]+,\\s*[^,]+,\\s*([\\d.]+)\\s*\\)$/i.exec(value);\n if (m) return parseFloat(m[1]) >= 1;\n // 4-digit hex with single alpha digit, e.g. \"#abcd\"\n m = /^#[0-9a-f]{3}([0-9a-f])$/i.exec(value);\n if (m) return parseInt(m[1], 16) === 15;\n return true;\n}\n\n/**\n * Find the index of the LAST canvas-clearing operation:\n * - `fillRect(0, 0, W, H)` with an opaque fillStyle, OR\n * - `clearRect(0, 0, W, H)` (always counts — `clear()` in p5).\n *\n * Anything drawn before that clear is invisible in the final composite, so\n * we can drop it. Returns -1 when no clear is in the log.\n */\nfunction findLastOpaqueClear(ops, logicalW, logicalH) {\n let lastClearIdx = -1;\n let curFill = '#000000'; // canvas2svg default\n const tolerance = 0.5;\n let inRaster = false;\n for (let i = 0; i < ops.length; i++) {\n const op = ops[i];\n // Skip ops inside an explicit raster region — those get rasterized at\n // replay time and shouldn't influence the vector clear-trim decision.\n if (op[0] === 2) {\n if (op[1] === 'beginRaster') inRaster = true;\n else if (op[1] === 'endRaster') inRaster = false;\n continue;\n }\n if (inRaster) continue;\n if (op[0] === 1 && op[1] === 'fillStyle') {\n curFill = op[2];\n } else if (op[0] === 0 && (op[1] === 'fillRect' || op[1] === 'clearRect')) {\n const args = op[2];\n const x = args[0], y = args[1], w = args[2], h = args[3];\n const coversCanvas =\n Math.abs(x) <= tolerance &&\n Math.abs(y) <= tolerance &&\n Math.abs(w - logicalW) <= tolerance &&\n Math.abs(h - logicalH) <= tolerance;\n if (coversCanvas && (op[1] === 'clearRect' || isOpaqueColor(curFill))) {\n lastClearIdx = i;\n }\n }\n }\n return lastClearIdx;\n}\n\nfunction replayToSVG(p) {\n patchC2S();\n const rec = p._p5ExportSVGRecorder;\n const w = p.width || 100;\n const h = p.height || 100;\n const c2s = new C2S(w, h);\n c2s.setTransform(1, 0, 0, 1, 0, 0);\n if (!rec) return c2s.getSerializedSvg();\n\n // canvas2svg can't accept a NATIVE CanvasGradient / CanvasPattern as\n // fillStyle (it has its own internal classes for those). For gradients\n // built via `drawingContext.createLinearGradient(…)` etc., the recorder\n // captures the gradient PARAMETERS + addColorStop history in\n // GRADIENT_BY_ID; we materialize them as real SVG `<linearGradient>` /\n // `<radialGradient>` elements in <defs> and reference them via\n // `fill=\"url(#id)\"`. Sketches that use a conic gradient — no SVG\n // equivalent until SVG2 — fall back to the most recent string color.\n let lastStringFill = '#000000';\n let lastStringStroke = '#000000';\n const emittedGradientIds = new Set();\n\n const xmlnsSVG = 'http://www.w3.org/2000/svg';\n\n const emitSvgGradient = (meta) => {\n if (!meta || emittedGradientIds.has(meta.id)) return true;\n const defs = c2s.__defs;\n const doc = c2s.__document;\n let el;\n if (meta.kind === 'createLinearGradient') {\n const [x0, y0, x1, y1] = meta.args;\n el = doc.createElementNS(xmlnsSVG, 'linearGradient');\n el.setAttribute('gradientUnits', 'userSpaceOnUse');\n el.setAttribute('x1', String(x0));\n el.setAttribute('y1', String(y0));\n el.setAttribute('x2', String(x1));\n el.setAttribute('y2', String(y1));\n } else if (meta.kind === 'createRadialGradient') {\n const [x0, y0, r0, x1, y1, r1] = meta.args;\n el = doc.createElementNS(xmlnsSVG, 'radialGradient');\n el.setAttribute('gradientUnits', 'userSpaceOnUse');\n el.setAttribute('fx', String(x0));\n el.setAttribute('fy', String(y0));\n el.setAttribute('fr', String(r0));\n el.setAttribute('cx', String(x1));\n el.setAttribute('cy', String(y1));\n el.setAttribute('r', String(r1));\n } else {\n // Conic gradient — no native SVG element yet. Caller falls back to\n // the last string color.\n return false;\n }\n el.setAttribute('id', meta.id);\n for (const s of meta.stops) {\n const stop = doc.createElementNS(xmlnsSVG, 'stop');\n stop.setAttribute('offset', String(s.offset));\n stop.setAttribute('stop-color', String(s.color));\n el.appendChild(stop);\n }\n defs.appendChild(el);\n emittedGradientIds.add(meta.id);\n return true;\n };\n\n // p5's resetMatrix records `setTransform(1,0,0,1,0,0)` followed by\n // `scale(pd, pd)` every frame. If we replay both verbatim onto a C2S\n // sized to LOGICAL dimensions, the `scale(pd, pd)` pushes everything off\n // the visible viewBox (drawings end up at coordinates pd× too large).\n // Cancel it out by scaling the recorded setTransform matrix by 1/pd —\n // the subsequent `scale(pd, pd)` then leaves the net matrix as identity,\n // so drawings land at logical coords. User-applied translate/rotate/scale\n // calls are recorded separately and replay unchanged.\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n const inv = 1 / origPD;\n\n // Freeze a SNAPSHOT of the op log before we start replaying. Otherwise a\n // sketch that keeps drawing while saveSVG() runs would mutate `rec.ops`\n // mid-loop — and worse, our own `markFrameBoundary` could shift earlier\n // ops out from under us, dropping synthetic-vector ops we already pointed\n // a `for`-loop index at.\n const ops = rec.ops.slice();\n // Skip ahead to the most recent opaque full-canvas clear if there is one\n // — every shape drawn before it would be completely covered by the\n // clear anyway, so replaying them just bloats the SVG. Common case: a\n // sketch with `background(r,g,b)` (no alpha) on every frame ends up\n // tens of MB of redundant paths (and 100k+ <path> elements that crash\n // SVG viewers) without this optimization.\n const clearIdx = findLastOpaqueClear(ops, w, h);\n let startIdx = 0;\n if (clearIdx > 0) {\n // p5's `background()` does `push(); resetMatrix(); fillStyle = X;\n // fillRect(0,0,W,H); pop();` — so the opaque fillRect lives inside a\n // save/restore pair. If we start replay AT the fillRect, we miss the\n // matching save, and the subsequent restore will underflow the\n // canvas2svg state stack. Walk backwards from clearIdx with depth\n // counting to find the save that opens the same scope, and start\n // replay there so the stack stays balanced.\n let depth = 0;\n let saveIdx = -1;\n for (let i = clearIdx - 1; i >= 0; i--) {\n if (ops[i][0] === 0) {\n if (ops[i][1] === 'restore') depth++;\n else if (ops[i][1] === 'save') {\n if (depth === 0) { saveIdx = i; break; }\n depth--;\n }\n }\n }\n startIdx = saveIdx >= 0 ? saveIdx : clearIdx;\n\n // Carry forward the latest style-state values from the dropped region\n // so subsequent ops don't lose the fillStyle / strokeStyle / etc. they\n // implicitly assume is \"still set\".\n const lastValue = {};\n for (let i = 0; i < startIdx; i++) {\n const op = ops[i];\n if (op[0] === 1 && PRESERVED_STYLE_PROPS.has(op[1])) {\n lastValue[op[1]] = op[2];\n }\n }\n for (const name in lastValue) {\n const v = lastValue[name];\n if (name === 'fillStyle' || name === 'strokeStyle') {\n if (typeof v === 'string') {\n if (name === 'fillStyle') lastStringFill = v;\n else lastStringStroke = v;\n c2s[name] = normalizeColorForC2S(v);\n } else {\n // Don't carry a native gradient over to c2s — fall back to the\n // current last-known-string for that channel.\n c2s[name] = name === 'fillStyle' ? lastStringFill : lastStringStroke;\n }\n } else {\n c2s[name] = v;\n }\n }\n }\n\n // Raster-region state. We support two modes:\n //\n // PER-REGION (preferred — pattern-plugin emits these):\n // beginRaster op carries `{ bbox, patternId }`. We reuse ONE full-\n // canvas offscreen, but CLEAR it on each region entry so it only\n // contains this region's pixels. On endRaster we crop to bbox,\n // toDataURL the slice, and emit a `<pattern id=\"patternId\" …>` into\n // <defs>. Each synthetic vector op references its own patternId as\n // fill — so each pattern call ends up with its own unique colorful\n // gradient swatch (the way p5.pattern actually paints, before our\n // flattening loses the per-call colors).\n //\n // LEGACY SHARED (user-invoked beginRasterRegion() with no bbox):\n // ONE accumulating canvas across every region; a single `<image>` at\n // the end of the SVG. Kept for backwards compat for hybrid sketches\n // that mark a region manually.\n const liveCanvas = getCanvas(p);\n const rasterW = liveCanvas ? liveCanvas.width : w * origPD;\n const rasterH = liveCanvas ? liveCanvas.height : h * origPD;\n\n let regionCanvas = null; // reused full-canvas, cleared per region\n let regionCtx = null;\n let activeRegion = null; // { bbox, patternId, hasContent } | null\n\n let sharedRasterCanvas = null;\n let sharedRasterCtx = null;\n let sharedRasterHasContent = false;\n\n const xmlns = 'http://www.w3.org/2000/svg';\n const xlink = 'http://www.w3.org/1999/xlink';\n\n const ensureRegionCanvas = () => {\n if (!regionCanvas) {\n regionCanvas = document.createElement('canvas');\n regionCanvas.width = rasterW;\n regionCanvas.height = rasterH;\n regionCtx = regionCanvas.getContext('2d');\n }\n // Clear and restore p5's per-frame pd transform.\n regionCtx.setTransform(1, 0, 0, 1, 0, 0);\n regionCtx.clearRect(0, 0, regionCanvas.width, regionCanvas.height);\n regionCtx.setTransform(origPD, 0, 0, origPD, 0, 0);\n };\n\n const ensureSharedRaster = () => {\n if (sharedRasterCanvas) return;\n sharedRasterCanvas = document.createElement('canvas');\n sharedRasterCanvas.width = rasterW;\n sharedRasterCanvas.height = rasterH;\n sharedRasterCtx = sharedRasterCanvas.getContext('2d');\n sharedRasterCtx.setTransform(origPD, 0, 0, origPD, 0, 0);\n };\n\n /** Crop the region canvas to bbox and emit a per-call `<pattern>` in <defs>. */\n const emitRegionPattern = (region) => {\n if (!region || !region.hasContent || !regionCanvas) return;\n const bb = region.bbox;\n if (!bb) return;\n // Clamp bbox to canvas bounds so partially-off-canvas shapes still work.\n const sx = Math.max(0, Math.floor(bb.x * origPD));\n const sy = Math.max(0, Math.floor(bb.y * origPD));\n const ex = Math.min(regionCanvas.width, Math.ceil((bb.x + bb.w) * origPD));\n const ey = Math.min(regionCanvas.height, Math.ceil((bb.y + bb.h) * origPD));\n const sw = ex - sx, sh = ey - sy;\n if (sw <= 0 || sh <= 0) return;\n\n let dataUrl;\n try {\n const slice = document.createElement('canvas');\n slice.width = sw; slice.height = sh;\n slice.getContext('2d').drawImage(regionCanvas, sx, sy, sw, sh, 0, 0, sw, sh);\n dataUrl = slice.toDataURL();\n } catch (_) { return; }\n\n const defs = c2s.__defs;\n const pat = c2s.__document.createElementNS(xmlns, 'pattern');\n pat.setAttribute('id', region.patternId);\n pat.setAttribute('patternUnits', 'userSpaceOnUse');\n pat.setAttribute('x', String(bb.x));\n pat.setAttribute('y', String(bb.y));\n pat.setAttribute('width', String(bb.w));\n pat.setAttribute('height', String(bb.h));\n const img = c2s.__document.createElementNS(xmlns, 'image');\n img.setAttribute('x', '0');\n img.setAttribute('y', '0');\n img.setAttribute('width', String(bb.w));\n img.setAttribute('height', String(bb.h));\n img.setAttributeNS(xlink, 'xlink:href', dataUrl);\n img.setAttribute('href', dataUrl);\n // `preserveAspectRatio=\"none\"` so the slice stretches to fit even when\n // the canvas-clipping math gave us a slightly different aspect than bbox.\n img.setAttribute('preserveAspectRatio', 'none');\n pat.appendChild(img);\n defs.appendChild(pat);\n };\n\n const emitSharedRaster = () => {\n if (!sharedRasterCanvas || !sharedRasterHasContent) return;\n try {\n const dataUrl = sharedRasterCanvas.toDataURL();\n // Emit BOTH a defs <pattern> (so legacy synthetic-vector code paths\n // that reference it still resolve) AND a free-standing <image> at\n // the SVG root, so user-invoked beginRasterRegion()/endRasterRegion()\n // produces a visible raster layer with no shapes referencing it.\n const defs = c2s.__defs;\n const pat = c2s.__document.createElementNS(xmlns, 'pattern');\n pat.setAttribute('id', SHARED_RASTER_PATTERN_ID);\n pat.setAttribute('patternUnits', 'userSpaceOnUse');\n pat.setAttribute('x', '0'); pat.setAttribute('y', '0');\n pat.setAttribute('width', String(w)); pat.setAttribute('height', String(h));\n const patImg = c2s.__document.createElementNS(xmlns, 'image');\n patImg.setAttribute('x', '0'); patImg.setAttribute('y', '0');\n patImg.setAttribute('width', String(w)); patImg.setAttribute('height', String(h));\n patImg.setAttributeNS(xlink, 'xlink:href', dataUrl);\n patImg.setAttribute('href', dataUrl);\n pat.appendChild(patImg);\n defs.appendChild(pat);\n // Free-standing image: appended at the SVG root so it renders ABOVE\n // every vector group. That matches the conceptual layering of a\n // user-marked raster region (an opaque overlay region).\n const rootImg = c2s.__document.createElementNS(xmlns, 'image');\n rootImg.setAttribute('x', '0'); rootImg.setAttribute('y', '0');\n rootImg.setAttribute('width', String(w)); rootImg.setAttribute('height', String(h));\n rootImg.setAttributeNS(xlink, 'xlink:href', dataUrl);\n rootImg.setAttribute('href', dataUrl);\n c2s.__root.appendChild(rootImg);\n } catch (_) { /* CORS-tainted or OOM */ }\n };\n let inRasterRegion = false;\n\n for (let i = startIdx; i < ops.length; i++) {\n const op = ops[i];\n\n // Raster-region markers.\n if (op[0] === 2) {\n if (op[1] === 'beginRaster') {\n const meta = op[2];\n if (meta && meta.bbox && meta.patternId) {\n ensureRegionCanvas();\n activeRegion = { bbox: meta.bbox, patternId: meta.patternId, hasContent: false };\n } else {\n ensureSharedRaster();\n activeRegion = null;\n }\n inRasterRegion = true;\n } else if (op[1] === 'endRaster') {\n if (activeRegion) {\n emitRegionPattern(activeRegion);\n activeRegion = null;\n }\n inRasterRegion = false;\n }\n continue;\n }\n\n // Synthetic vector op (from p5.pattern hooks etc.) — emit on c2s as a\n // shape filled with its own per-call <pattern> (or the shared/legacy\n // pattern, or a solid color, depending on payload).\n if (op[0] === 3) {\n // useSharedPattern: a legacy fallback for synthetic vectors that\n // don't carry their own per-call patternId (older builds; safe\n // no-op for current pattern-plugin output).\n try { replaySyntheticVector(c2s, op[1], op[2], true); } catch (_) {}\n continue;\n }\n\n const target = inRasterRegion\n ? (activeRegion ? regionCtx : sharedRasterCtx)\n : c2s;\n if (inRasterRegion && op[0] === 0) {\n if (activeRegion) activeRegion.hasContent = true;\n else sharedRasterHasContent = true;\n }\n\n try {\n if (op[0] === 0) {\n if (op[1] === 'setTransform') {\n const a = op[2];\n if (target === c2s) {\n // For canvas2svg we cancel out p5's setTransform-then-scale\n // pixel-density pair (see big comment above).\n target.setTransform(a[0] * inv, a[1] * inv, a[2] * inv, a[3] * inv, a[4] * inv, a[5] * inv);\n } else {\n // For the raster ctx, replay verbatim — it's a native Canvas2D\n // and we set up its matrix to mirror p5's actual rendering.\n target.setTransform(a[0], a[1], a[2], a[3], a[4], a[5]);\n }\n } else {\n const f = target[op[1]];\n if (typeof f === 'function') f.apply(target, op[2]);\n }\n } else {\n // Translate fillStyle / strokeStyle to rgba() if it's 8-digit hex.\n if (op[1] === 'fillStyle' || op[1] === 'strokeStyle') {\n const v = op[2];\n const isFill = op[1] === 'fillStyle';\n if (typeof v === 'string') {\n if (isFill) lastStringFill = v;\n else lastStringStroke = v;\n target[op[1]] = target === c2s ? normalizeColorForC2S(v) : v;\n } else if (v && typeof v === 'object' && v.__p5ExportGradId) {\n // Recorded gradient reference. Emit the SVG gradient in defs\n // (idempotent) and set fillStyle to `url(#id)` so the next\n // shape's fill picks up the real gradient.\n const meta = GRADIENT_BY_ID.get(v.__p5ExportGradId);\n const ok = target === c2s && emitSvgGradient(meta);\n if (ok) {\n target[op[1]] = `url(#${meta.id})`;\n } else if (target === c2s) {\n // Conic gradient or no metadata — fall back to last solid.\n target[op[1]] = isFill ? lastStringFill : lastStringStroke;\n }\n // For native targets (rasterCtx) we don't apply the recorded\n // gradient; that gradient was bound to the live ctx and can't\n // be transferred. The rasterized output may be slightly off in\n // gradient regions, but those regions are typically inside\n // explicit raster regions anyway.\n } else {\n // Unknown CanvasGradient (e.g., user-built without going through\n // our recorder proxy) or CanvasPattern — fall back to a solid.\n if (target === c2s) {\n target[op[1]] = isFill ? lastStringFill : lastStringStroke;\n } else {\n try { target[op[1]] = v; } catch (_) {}\n }\n }\n } else if (op[1] === 'globalCompositeOperation') {\n target[op[1]] = op[2];\n // canvas2svg has no SVG mapping for blend modes — stamp CSS\n // `mix-blend-mode` on the current group when writing vector. The\n // native canvas (raster path) honors the property directly.\n if (target === c2s) {\n const mode = op[2];\n const el = c2s.__currentElement;\n if (el && el.setAttribute && mode && mode !== 'source-over') {\n const existing = el.getAttribute('style') || '';\n if (existing.indexOf('mix-blend-mode') === -1) {\n const sep = existing && !existing.trim().endsWith(';') ? ';' : '';\n el.setAttribute('style', existing + sep + 'mix-blend-mode:' + mode);\n }\n }\n }\n } else {\n target[op[1]] = op[2];\n }\n }\n } catch (_) {\n // Skip ops the destination can't replay (gradients, patterns, ImageBitmaps, etc.).\n }\n }\n // Defensive: if the last op was beginRaster with no closing endRaster,\n // still emit whatever we captured so the SVG isn't missing patterns.\n if (activeRegion) emitRegionPattern(activeRegion);\n // Legacy: emit the single shared raster (if used) so old beginRasterRegion\n // calls without bbox metadata still render correctly.\n emitSharedRaster();\n return c2s.getSerializedSvg();\n}\n\nfunction rasterSVG(canvas) {\n const dataUrl = canvas.toDataURL('image/png');\n const w = canvas.width, h = canvas.height;\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\" viewBox=\"0 0 ${w} ${h}\"><image href=\"${dataUrl}\" width=\"${w}\" height=\"${h}\"/></svg>`;\n}\n\nexport function attachSVGExport(p5, fn, lifecycles) {\n /**\n * Save the current sketch as a true vector SVG, with all accumulated\n * draw history replayed onto canvas2svg.\n *\n * For WebGL sketches (no recording is possible), or when explicitly\n * requested via `{ raster: true }`, emit a valid `.svg` that embeds the\n * canvas as a PNG `<image>`.\n *\n * @param {string} [filename]\n * @param {{raster?: boolean}} [opts]\n */\n fn.saveSVG = function (filename, opts = {}) {\n let markup;\n const canRecord = !!this._p5ExportSVGRecorder;\n // Vector replay of an extremely deep op log (e.g., pattern-fill\n // sketches that draw millions of tiny shapes) produces a multi-hundred-\n // megabyte SVG that no viewer can open. Auto-fall-back to whole-canvas\n // raster above this threshold — but count only the ops that will\n // ACTUALLY be replayed as vector after the opaque-clear trim runs and\n // after raster regions are excluded. Otherwise sketches with an opaque\n // background (which keeps just one frame in the SVG) get falsely\n // flagged as \"too big\" based on the full multi-frame op log.\n // Threshold for falling back to raster on extreme op counts. 2M vector\n // ops keeps the door open for dense line-art sketches (mountain-style\n // hatching, particle clouds) while still catching pathological cases\n // that would balloon to gigabyte-scale SVGs. Callers can override with\n // `{ forceVector: true }` or `{ raster: true }` for explicit control.\n const HUGE_OPS_THRESHOLD = 2000000;\n let vectorOpCount = 0;\n if (canRecord) {\n // Snapshot so the count we measure here matches the one replayToSVG\n // will see (a live array could grow mid-iteration and lie about the\n // vector op count).\n const allOps = this._p5ExportSVGRecorder.ops.slice();\n const logicalW = this.width || 100;\n const logicalH = this.height || 100;\n const clearIdx = findLastOpaqueClear(allOps, logicalW, logicalH);\n // Walk backwards from clearIdx to find the matching save() — that's\n // the actual start of the kept-region in replayToSVG.\n let trimStart = 0;\n if (clearIdx > 0) {\n let depth = 0;\n for (let i = clearIdx - 1; i >= 0; i--) {\n if (allOps[i][0] === 0) {\n if (allOps[i][1] === 'restore') depth++;\n else if (allOps[i][1] === 'save') {\n if (depth === 0) { trimStart = i; break; }\n depth--;\n }\n }\n }\n }\n let inRaster = false;\n for (let i = trimStart; i < allOps.length; i++) {\n const op = allOps[i];\n if (op[0] === 2) {\n if (op[1] === 'beginRaster') inRaster = true;\n else if (op[1] === 'endRaster') inRaster = false;\n continue;\n }\n if (!inRaster) vectorOpCount++;\n }\n }\n const tooBigForVector =\n canRecord && !opts.forceVector && vectorOpCount > HUGE_OPS_THRESHOLD;\n\n // Before falling back to raster, BLOCK the download and ask the user\n // what to do (instead of silently producing a giant raster SVG).\n // `{ raster: true }` / `{ forceVector: true }` skip the prompt;\n // `{ silent: true }` keeps the legacy \"warn-and-fallback\" behavior.\n const willFallBackToRaster =\n !opts.raster && (!canRecord || tooBigForVector);\n\n if (willFallBackToRaster && !opts.silent && typeof window !== 'undefined' && typeof window.confirm === 'function') {\n const reason = tooBigForVector\n ? `This sketch produced ${vectorOpCount.toLocaleString()} vector ops — too many to render as vector SVG cleanly (viewers crash above ~250k paths).`\n : `This sketch's renderer (likely WEBGL) can't be captured as vector. SVG would only contain a single embedded PNG.`;\n const ok = window.confirm(\n `[p5.export] SVG export problem\\n\\n` +\n `${reason}\\n\\n` +\n `Click OK to export a raster-only SVG anyway (a single <image> tag) — useful for archival.\\n` +\n `Click Cancel to abort the download.\\n\\n` +\n `Tips:\\n` +\n ` • Wrap expensive draws in beginRasterRegion()/endRasterRegion() for hybrid output.\\n` +\n ` • saveSVG('out', { forceVector: true }) — force vector despite the size.\\n` +\n ` • saveSVG('out', { silent: true }) — never prompt; matches old behavior.`\n );\n if (!ok) {\n console.info('[p5.export] saveSVG cancelled by user');\n return null;\n }\n }\n\n if (opts.raster || !canRecord || tooBigForVector) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] saveSVG: no canvas found');\n if (tooBigForVector) {\n console.warn(`[p5.export] saveSVG: ${vectorOpCount.toLocaleString()} vector ops — falling back to raster.`);\n } else if (!canRecord && !opts.raster) {\n console.info('[p5.export] saveSVG: WebGL renderer detected — embedding canvas as raster <image> in SVG.');\n }\n markup = rasterSVG(canvas);\n } else {\n markup = replayToSVG(this);\n }\n const blob = new Blob([markup], { type: 'image/svg+xml' });\n downloadBlob(blob, filename ? ensureExt(filename, 'svg') : defaultFilename('svg'));\n return blob;\n };\n\n /** Return the current SVG markup as a string (no download). */\n fn.getSVG = function () {\n return this._p5ExportSVGRecorder ? replayToSVG(this) : '';\n };\n\n /**\n * Reset the SVG op log. Call this after, say, a transition so the next\n * `saveSVG()` only captures the new content. Frees memory too.\n */\n fn.clearSVGRecording = function () {\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.clear();\n };\n\n /**\n * Mark the start of a region whose draw operations should be RASTERIZED\n * (embedded as a single PNG `<image>`) instead of replayed as vector in\n * the SVG. Useful for hybrid output: cheap geometry stays as editable\n * paths while expensive pattern fills / noise textures / 1000-shape\n * builds become a single image. Pair with `endRasterRegion()`.\n *\n * Example:\n * function setup() {\n * createCanvas(800, 800);\n * beginRasterRegion();\n * rectPattern(0, 0, 800, 800); // p5.pattern noiseGrad — many ops\n * endRasterRegion();\n * // subsequent geometry stays vector\n * }\n */\n fn.beginRasterRegion = function () {\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.ops.push([2, 'beginRaster']);\n };\n fn.endRasterRegion = function () {\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.ops.push([2, 'endRaster']);\n };\n\n /**\n * Convenience helper: run a function inside a raster region.\n * `rasterize(() => { rectPattern(...); })` is shorthand for\n * `beginRasterRegion(); rectPattern(...); endRasterRegion();`.\n */\n fn.rasterize = function (fn) {\n this.beginRasterRegion();\n try { return fn.call(this); }\n finally { this.endRasterRegion(); }\n };\n\n /**\n * Configure how many of the most recent frames the SVG recorder keeps.\n * Pass `Infinity` or a negative number to disable the cap (not\n * recommended on long-running sketches — memory grows without bound).\n *\n * @param {number} n\n */\n fn.setSVGRecordingFrames = function (n) {\n if (!this._p5ExportSVGRecorder) return;\n if (n === Infinity || n < 0) {\n this._p5ExportSVGRecorder.maxFrames = Infinity;\n } else {\n this._p5ExportSVGRecorder.maxFrames = Math.max(1, Math.floor(n));\n }\n };\n\n // Install the recorder RIGHT AFTER createCanvas runs so the rest of the\n // user's setup() — including background(), pattern fills, and any other\n // drawing — gets captured too. The earlier postsetup-only install missed\n // setup's content entirely, leaving the SVG with only what draw() drew.\n // p5 calls createCanvas internally if the user doesn't, so this catches\n // every sketch.\n //\n // We ALSO call wrapPatternPlugin here — once the renderer exists we know\n // p5.pattern is loaded (if it ever will be) and we can re-bind window\n // globals immediately. Doing it here (instead of in a lifecycle hook)\n // makes the p5 1.x compatibility path work without relying on the order\n // in which registerMethod-style hooks fire vs. user setup().\n const origCreateCanvas = fn.createCanvas;\n if (typeof origCreateCanvas === 'function') {\n fn.createCanvas = function (...args) {\n const result = origCreateCanvas.apply(this, args);\n this._p5ExportSVGRecorder = null;\n installRecorder(this);\n try { wrapPatternPlugin(p5, this); } catch (_) { /* p5.pattern not loaded; fine */ }\n return result;\n };\n }\n\n if (lifecycles && typeof lifecycles === 'object') {\n // Hook p5.pattern's drawing functions BEFORE user setup runs, so when\n // the sketch calls rectPattern/ellipsePattern/etc. our wrappers emit a\n // synthetic vector op into the recorder alongside the rasterized noise.\n // p5.pattern's <script defer> has executed by presetup; the wrap is\n // idempotent so re-running is harmless.\n const prevPresetup = lifecycles.presetup;\n lifecycles.presetup = function () {\n if (typeof prevPresetup === 'function') prevPresetup.call(this);\n // Pass the instance so wrapPatternPlugin can also overwrite the\n // global-mode bound window functions p5 cached at construction time.\n try { wrapPatternPlugin(p5, this); } catch (_) { /* p5.pattern not loaded; fine */ }\n };\n\n // Belt-and-suspenders: also try installing in postsetup in case some\n // edge case bypassed our createCanvas wrapper (e.g., user assigning\n // the renderer directly).\n const prevSetup = lifecycles.postsetup;\n lifecycles.postsetup = function () {\n if (typeof prevSetup === 'function') prevSetup.call(this);\n installRecorder(this);\n };\n\n // Mark a frame boundary BEFORE each draw — trims the oldest frame once\n // we exceed the cap. Compose with any prior predraw hook.\n const prevPre = lifecycles.predraw;\n lifecycles.predraw = function () {\n if (typeof prevPre === 'function') prevPre.call(this);\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.markFrameBoundary();\n };\n }\n}\n","import { defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { withPixelDensity, highResViaReplay } from '../utils/scale.js';\n\nfunction blobToDataURL(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\n// jspdf is heavy (it ships html2canvas + dompurify). To keep the core\n// bundle slim — especially the UMD drop-in build — it's marked external\n// and loaded on first use, either from a pre-included global or via a\n// dynamic ESM import.\nlet _jsPDFPromise = null;\nfunction loadJsPDF() {\n if (_jsPDFPromise) return _jsPDFPromise;\n _jsPDFPromise = (async () => {\n if (typeof window !== 'undefined') {\n if (window.jspdf && window.jspdf.jsPDF) return window.jspdf.jsPDF;\n if (window.jsPDF) return window.jsPDF;\n }\n try {\n const mod = await import('jspdf');\n if (mod && mod.jsPDF) return mod.jsPDF;\n } catch (_) { /* fall through to the helpful error below */ }\n throw new Error(\n '[p5.export] savePDF requires jspdf. Install it (npm i jspdf) or include ' +\n '<script src=\"https://cdn.jsdelivr.net/npm/jspdf@2/dist/jspdf.umd.min.js\"></script> before your sketch.'\n );\n })();\n return _jsPDFPromise;\n}\n\n/**\n * PDF export. Embeds the rasterized canvas at its native pixel size on a\n * page that matches the canvas dimensions (in points, 1:1 with pixels —\n * keeps the math obvious for creative-coding output).\n */\nexport function attachPDFExport(p5, fn) {\n /**\n * Save the current canvas as a single-page PDF.\n *\n * @param {string} [filename]\n * @param {object} [opts]\n * @param {'p'|'l'|'portrait'|'landscape'} [opts.orientation]\n * @param {'pt'|'mm'|'cm'|'in'} [opts.unit='pt']\n * @param {[number, number]|string} [opts.format] jspdf page format (e.g. 'a4'); defaults to canvas size\n * @param {'png'|'jpeg'|'webp'} [opts.imageFormat='png']\n * @param {number} [opts.quality] for JPEG/WebP\n * @param {number} [opts.scale] 1..4 — render the embedded raster at higher pixelDensity\n */\n fn.savePDF = async function (filename, opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] savePDF: no canvas found');\n\n const jsPDF = await loadJsPDF();\n const imageFormat = (opts.imageFormat || 'png').toUpperCase();\n const mime = imageFormat === 'JPEG' ? 'image/jpeg'\n : imageFormat === 'WEBP' ? 'image/webp'\n : 'image/png';\n\n // The page is sized off the LOGICAL canvas dimensions, regardless of\n // scale — `scale` just bumps the embedded raster's pixel density so the\n // PDF prints crisper. Resolve the source dataURL via the same priority\n // ladder as the image exports: live canvas → op-replay (preserves\n // trails at high res) → withPixelDensity redraw fallback.\n const wLogical = canvas.width;\n const hLogical = canvas.height;\n const fmt = imageFormat === 'JPEG' ? 'jpg' : imageFormat === 'WEBP' ? 'webp' : 'png';\n const scale = opts.scale;\n let dataUrl;\n if (!scale || scale <= 1 || scale <= (this.pixelDensity ? this.pixelDensity() : 1)) {\n dataUrl = canvas.toDataURL(mime, opts.quality);\n } else {\n const replayed = await highResViaReplay(this, scale, fmt, opts.quality);\n if (replayed) {\n dataUrl = await blobToDataURL(replayed);\n } else {\n dataUrl = await withPixelDensity(this, scale, () => getCanvas(this).toDataURL(mime, opts.quality));\n }\n }\n\n const unit = opts.unit || 'pt';\n const orientation = opts.orientation || (wLogical >= hLogical ? 'l' : 'p');\n const format = opts.format || [wLogical, hLogical];\n\n const pdf = new jsPDF({ orientation, unit, format });\n const pageW = pdf.internal.pageSize.getWidth();\n const pageH = pdf.internal.pageSize.getHeight();\n\n // Fit-to-page while preserving aspect ratio.\n const fit = Math.min(pageW / wLogical, pageH / hLogical);\n const drawW = wLogical * fit;\n const drawH = hLogical * fit;\n const x = (pageW - drawW) / 2;\n const y = (pageH - drawH) / 2;\n\n pdf.addImage(dataUrl, imageFormat, x, y, drawW, drawH);\n pdf.save(filename ? ensureExt(filename, 'pdf') : defaultFilename('pdf'));\n return pdf;\n };\n}\n","var X={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 F(t=256){let e=0,s=new Uint8Array(t);return{get buffer(){return s.buffer},reset(){e=0},bytesView(){return s.subarray(0,e)},bytes(){return s.slice(0,e)},writeByte(r){n(e+1),s[e]=r,e++},writeBytes(r,o=0,i=r.length){n(e+i);for(let c=0;c<i;c++)s[e++]=r[c+o]},writeBytesView(r,o=0,i=r.byteLength){n(e+i),s.set(r.subarray(o,o+i),e),e+=i}};function n(r){var o=s.length;if(o>=r)return;var i=1024*1024;r=Math.max(r,o*(o<i?2:1.125)>>>0),o!=0&&(r=Math.max(r,256));let c=s;s=new Uint8Array(r),e>0&&s.set(c.subarray(0,e),0)}}var O=12,J=5003,lt=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function at(t,e,s,n,r=F(512),o=new Uint8Array(256),i=new Int32Array(J),c=new Int32Array(J)){let x=i.length,a=Math.max(2,n);o.fill(0),c.fill(0),i.fill(-1);let l=0,f=0,g=a+1,h=g,b=!1,w=h,_=(1<<w)-1,u=1<<g-1,k=u+1,B=u+2,p=0,A=s[0],z=0;for(let y=x;y<65536;y*=2)++z;z=8-z,r.writeByte(a),I(u);let d=s.length;for(let y=1;y<d;y++){t:{let m=s[y],v=(m<<O)+A,M=m<<z^A;if(i[M]===v){A=c[M];break t}let V=M===0?1:x-M;for(;i[M]>=0;)if(M-=V,M<0&&(M+=x),i[M]===v){A=c[M];break t}I(A),A=m,B<1<<O?(c[M]=B++,i[M]=v):(i.fill(-1),B=u+2,b=!0,I(u))}}return I(A),I(k),r.writeByte(0),r.bytesView();function I(y){for(l&=lt[f],f>0?l|=y<<f:l=y,f+=w;f>=8;)o[p++]=l&255,p>=254&&(r.writeByte(p),r.writeBytesView(o,0,p),p=0),l>>=8,f-=8;if((B>_||b)&&(b?(w=h,_=(1<<w)-1,b=!1):(++w,_=w===O?1<<w:(1<<w)-1)),y==k){for(;f>0;)o[p++]=l&255,p>=254&&(r.writeByte(p),r.writeBytesView(o,0,p),p=0),l>>=8,f-=8;p>0&&(r.writeByte(p),r.writeBytesView(o,0,p),p=0)}}}var $=at;function D(t,e,s){return t<<8&63488|e<<2&992|s>>3}function G(t,e,s,n){return t>>4|e&240|(s&240)<<4|(n&240)<<8}function j(t,e,s){return t>>4<<8|e&240|s>>4}function R(t,e,s){return t<e?e:t>s?s:t}function T(t){return t*t}function tt(t,e,s){var n=0,r=1e100;let o=t[e],i=o.cnt,c=o.ac,x=o.rc,a=o.gc,l=o.bc;for(var f=o.fw;f!=0;f=t[f].fw){let h=t[f],b=h.cnt,w=i*b/(i+b);if(!(w>=r)){var g=0;s&&(g+=w*T(h.ac-c),g>=r)||(g+=w*T(h.rc-x),!(g>=r)&&(g+=w*T(h.gc-a),!(g>=r)&&(g+=w*T(h.bc-l),!(g>=r)&&(r=g,n=f))))}}o.err=r,o.nn=n}function Q(){return{ac:0,rc:0,gc:0,bc:0,cnt:0,nn:0,fw:0,bk:0,tm:0,mtm:0,err:0}}function ut(t,e){let s=e===\"rgb444\"?4096:65536,n=new Array(s),r=t.length;if(e===\"rgba4444\")for(let o=0;o<r;++o){let i=t[o],c=i>>24&255,x=i>>16&255,a=i>>8&255,l=i&255,f=G(l,a,x,c),g=f in n?n[f]:n[f]=Q();g.rc+=l,g.gc+=a,g.bc+=x,g.ac+=c,g.cnt++}else if(e===\"rgb444\")for(let o=0;o<r;++o){let i=t[o],c=i>>16&255,x=i>>8&255,a=i&255,l=j(a,x,c),f=l in n?n[l]:n[l]=Q();f.rc+=a,f.gc+=x,f.bc+=c,f.cnt++}else for(let o=0;o<r;++o){let i=t[o],c=i>>16&255,x=i>>8&255,a=i&255,l=D(a,x,c),f=l in n?n[l]:n[l]=Q();f.rc+=a,f.gc+=x,f.bc+=c,f.cnt++}return n}function H(t,e,s={}){let{format:n=\"rgb565\",clearAlpha:r=!0,clearAlphaColor:o=0,clearAlphaThreshold:i=0,oneBitAlpha:c=!1}=s;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\");let x=new Uint32Array(t.buffer),a=s.useSqrt!==!1,l=n===\"rgba4444\",f=ut(x,n),g=f.length,h=g-1,b=new Uint32Array(g+1);for(var w=0,u=0;u<g;++u){let C=f[u];if(C!=null){var _=1/C.cnt;l&&(C.ac*=_),C.rc*=_,C.gc*=_,C.bc*=_,f[w++]=C}}T(e)/w<.022&&(a=!1);for(var u=0;u<w-1;++u)f[u].fw=u+1,f[u+1].bk=u,a&&(f[u].cnt=Math.sqrt(f[u].cnt));a&&(f[u].cnt=Math.sqrt(f[u].cnt));var k,B,p;for(u=0;u<w;++u){tt(f,u,!1);var A=f[u].err;for(B=++b[0];B>1&&(p=B>>1,!(f[k=b[p]].err<=A));B=p)b[B]=k;b[B]=u}var z=w-e;for(u=0;u<z;){for(var d;;){var I=b[1];if(d=f[I],d.tm>=d.mtm&&f[d.nn].mtm<=d.tm)break;d.mtm==h?I=b[1]=b[b[0]--]:(tt(f,I,!1),d.tm=u);var A=f[I].err;for(B=1;(p=B+B)<=b[0]&&(p<b[0]&&f[b[p]].err>f[b[p+1]].err&&p++,!(A<=f[k=b[p]].err));B=p)b[B]=k;b[B]=I}var y=f[d.nn],m=d.cnt,v=y.cnt,_=1/(m+v);l&&(d.ac=_*(m*d.ac+v*y.ac)),d.rc=_*(m*d.rc+v*y.rc),d.gc=_*(m*d.gc+v*y.gc),d.bc=_*(m*d.bc+v*y.bc),d.cnt+=y.cnt,d.mtm=++u,f[y.bk].fw=y.fw,f[y.fw].bk=y.bk,y.mtm=h}let M=[];var V=0;for(u=0;;++V){let L=R(Math.round(f[u].rc),0,255),C=R(Math.round(f[u].gc),0,255),Y=R(Math.round(f[u].bc),0,255),E=255;if(l){if(E=R(Math.round(f[u].ac),0,255),c){let st=typeof c==\"number\"?c:127;E=E<=st?0:255}r&&E<=i&&(L=C=Y=o,E=0)}let K=l?[L,C,Y,E]:[L,C,Y];if(xt(M,K)||M.push(K),(u=f[u].fw)==0)break}return M}function xt(t,e){for(let s=0;s<t.length;s++){let n=t[s],r=n[0]===e[0]&&n[1]===e[1]&&n[2]===e[2],o=n.length>=4&&e.length>=4?n[3]===e[3]:!0;if(r&&o)return!0}return!1}function U(t,e){var s=0,n;for(n=0;n<t.length;n++){let r=t[n]-e[n];s+=r*r}return s}function P(t,e){return e>1?Math.round(t/e)*e:t}function et(t,{roundRGB:e=5,roundAlpha:s=10,oneBitAlpha:n=null}={}){let r=new Uint32Array(t.buffer);for(let o=0;o<r.length;o++){let i=r[o],c=i>>24&255,x=i>>16&255,a=i>>8&255,l=i&255;if(c=P(c,s),n){let f=typeof n==\"number\"?n:127;c=c<=f?0:255}l=P(l,e),a=P(a,e),x=P(x,e),r[o]=c<<24|x<<16|a<<8|l<<0}}function nt(t,e,s=\"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\");let n=new Uint32Array(t.buffer),r=n.length,o=s===\"rgb444\"?4096:65536,i=new Uint8Array(r),c=new Array(o),x=s===\"rgba4444\";if(s===\"rgba4444\")for(let a=0;a<r;a++){let l=n[a],f=l>>24&255,g=l>>16&255,h=l>>8&255,b=l&255,w=G(b,h,g,f),_=w in c?c[w]:c[w]=gt(b,h,g,f,e);i[a]=_}else{let a=s===\"rgb444\"?j:D;for(let l=0;l<r;l++){let f=n[l],g=f>>16&255,h=f>>8&255,b=f&255,w=a(b,h,g),_=w in c?c[w]:c[w]=bt(b,h,g,e);i[l]=_}}return i}function gt(t,e,s,n,r){let o=0,i=1e100;for(let c=0;c<r.length;c++){let x=r[c],a=x[3],l=q(a-n);if(l>i)continue;let f=x[0];if(l+=q(f-t),l>i)continue;let g=x[1];if(l+=q(g-e),l>i)continue;let h=x[2];l+=q(h-s),!(l>i)&&(i=l,o=c)}return o}function bt(t,e,s,n){let r=0,o=1e100;for(let i=0;i<n.length;i++){let c=n[i],x=c[0],a=q(x-t);if(a>o)continue;let l=c[1];if(a+=q(l-e),a>o)continue;let f=c[2];a+=q(f-s),!(a>o)&&(o=a,r=i)}return r}function rt(t,e,s=5){if(!t.length||!e.length)return;let n=t.map(i=>i.slice(0,3)),r=s*s,o=t[0].length;for(let i=0;i<e.length;i++){let c=e[i];c.length<o?c=[c[0],c[1],c[2],255]:c.length>o?c=c.slice(0,3):c=c.slice();let x=N(n,c.slice(0,3),U),a=x[0],l=x[1];l>0&&l<=r&&(t[a]=c)}}function q(t){return t*t}function W(t,e,s=U){let n=Infinity,r=-1;for(let o=0;o<t.length;o++){let i=t[o],c=s(e,i);c<n&&(n=c,r=o)}return r}function N(t,e,s=U){let n=Infinity,r=-1;for(let o=0;o<t.length;o++){let i=t[o],c=s(e,i);c<n&&(n=c,r=o)}return[r,n]}function ot(t,e,s=U){return t[W(t,e,s)]}function ct(t={}){let{initialCapacity:e=4096,auto:s=!0}=t,n=F(e),r=5003,o=new Uint8Array(256),i=new Int32Array(r),c=new Int32Array(r),x=!1;return{reset(){n.reset(),x=!1},finish(){n.writeByte(X.trailer)},bytes(){return n.bytes()},bytesView(){return n.bytesView()},get buffer(){return n.buffer},get stream(){return n},writeHeader:a,writeFrame(l,f,g,h={}){let{transparent:b=!1,transparentIndex:w=0,delay:_=0,palette:u=null,repeat:k=0,colorDepth:B=8,dispose:p=-1}=h,A=!1;if(s?x||(A=!0,a(),x=!0):A=Boolean(h.first),f=Math.max(0,Math.floor(f)),g=Math.max(0,Math.floor(g)),A){if(!u)throw new Error(\"First frame must include a { palette } option\");pt(n,f,g,u,B),it(n,u),k>=0&&dt(n,k)}let z=Math.round(_/10);wt(n,p,z,b,w);let d=Boolean(u)&&!A;ht(n,f,g,d?u:null),d&&it(n,u),yt(n,l,f,g,B,o,i,c)}};function a(){ft(n,\"GIF89a\")}}function wt(t,e,s,n,r){t.writeByte(33),t.writeByte(249),t.writeByte(4),r<0&&(r=0,n=!1);var o,i;n?(o=1,i=2):(o=0,i=0),e>=0&&(i=e&7),i<<=2;let c=0;t.writeByte(0|i|c|o),S(t,s),t.writeByte(r||0),t.writeByte(0)}function pt(t,e,s,n,r=8){let o=1,i=0,c=Z(n.length)-1,x=o<<7|r-1<<4|i<<3|c,a=0,l=0;S(t,e),S(t,s),t.writeBytes([x,a,l])}function dt(t,e){t.writeByte(33),t.writeByte(255),t.writeByte(11),ft(t,\"NETSCAPE2.0\"),t.writeByte(3),t.writeByte(1),S(t,e),t.writeByte(0)}function it(t,e){let s=1<<Z(e.length);for(let n=0;n<s;n++){let r=[0,0,0];n<e.length&&(r=e[n]),t.writeByte(r[0]),t.writeByte(r[1]),t.writeByte(r[2])}}function ht(t,e,s,n){if(t.writeByte(44),S(t,0),S(t,0),S(t,e),S(t,s),n){let r=0,o=0,i=Z(n.length)-1;t.writeByte(128|r|o|0|i)}else t.writeByte(0)}function yt(t,e,s,n,r=8,o,i,c){$(s,n,e,r,t,o,i,c)}function S(t,e){t.writeByte(e&255),t.writeByte(e>>8&255)}function ft(t,e){for(var s=0;s<e.length;s++)t.writeByte(e.charCodeAt(s))}function Z(t){return Math.max(Math.ceil(Math.log2(t)),1)}var Bt=ct;export{ct as GIFEncoder,nt as applyPalette,Bt as default,ot as nearestColor,W as nearestColorIndex,N as nearestColorIndexWithDistance,et as prequantize,H as quantize,rt as snapColorsToPalette};\n//# sourceMappingURL=gifenc.esm.js.map\n","import { GIFEncoder, quantize, applyPalette } from 'gifenc';\nimport { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\n\n/**\n * GIF recorder. Captures one frame per p5 draw via the `postdraw` lifecycle.\n * gifenc runs synchronously per frame; for large/long recordings this can\n * slow the sketch, but it avoids the worker/blob plumbing that gif.js needs.\n */\nclass GIFRecorder {\n /**\n * @param {object} opts\n * @param {HTMLCanvasElement} opts.canvas\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration] seconds; if set, recorder auto-stops\n * @param {number} [opts.maxColors=256]\n * @param {string} [opts.filename]\n * @param {(p:number)=>void} [opts.onProgress] 0..1 during finalize\n */\n constructor(opts) {\n this.canvas = opts.canvas;\n this.fps = opts.fps ?? 30;\n this.duration = opts.duration;\n this.maxColors = opts.maxColors ?? 256;\n this.filename = opts.filename;\n this.onProgress = opts.onProgress || (() => {});\n this.frames = [];\n this.startTime = 0;\n this.active = false;\n this.framesRecorded = 0;\n }\n\n start() {\n if (this.active) return;\n this.frames = [];\n this.framesRecorded = 0;\n this.startTime = performance.now();\n this.active = true;\n this._nextFrameAt = this.startTime;\n }\n\n /** Called every draw frame; decides whether to grab a frame based on target fps. */\n tick() {\n if (!this.active) return;\n const now = performance.now();\n if (now < this._nextFrameAt) return;\n\n const ctx = this.canvas.getContext('2d', { willReadFrequently: true })\n || this.canvas.getContext('webgl2')\n || this.canvas.getContext('webgl');\n\n let data;\n if (ctx && ctx.getImageData) {\n data = ctx.getImageData(0, 0, this.canvas.width, this.canvas.height).data;\n } else {\n // WebGL: read pixels into a temporary 2d canvas. Slow but correct.\n const tmp = document.createElement('canvas');\n tmp.width = this.canvas.width;\n tmp.height = this.canvas.height;\n tmp.getContext('2d').drawImage(this.canvas, 0, 0);\n data = tmp.getContext('2d').getImageData(0, 0, tmp.width, tmp.height).data;\n }\n\n this.frames.push({\n data: new Uint8ClampedArray(data),\n width: this.canvas.width,\n height: this.canvas.height\n });\n this.framesRecorded++;\n this._nextFrameAt += 1000 / this.fps;\n\n if (this.duration && (now - this.startTime) >= this.duration * 1000) {\n this.stop();\n }\n }\n\n /** Stop capture and encode. Returns a Promise<Blob>. */\n async stop() {\n if (!this.active) return null;\n this.active = false;\n const blob = await this._encode();\n const name = this.filename ? ensureExt(this.filename, 'gif') : defaultFilename('gif');\n downloadBlob(blob, name);\n return blob;\n }\n\n /** Encode without downloading — useful when the caller wants the Blob directly. */\n async encode() {\n this.active = false;\n return this._encode();\n }\n\n async _encode() {\n const gif = GIFEncoder();\n const delay = Math.round(1000 / this.fps);\n const total = this.frames.length;\n for (let i = 0; i < total; i++) {\n const f = this.frames[i];\n const palette = quantize(f.data, this.maxColors);\n const index = applyPalette(f.data, palette);\n gif.writeFrame(index, f.width, f.height, { palette, delay });\n this.onProgress((i + 1) / total);\n // Yield occasionally so the UI doesn't freeze on long recordings.\n if (i % 4 === 3) await new Promise((r) => setTimeout(r, 0));\n }\n gif.finish();\n return new Blob([gif.bytes()], { type: 'image/gif' });\n }\n}\n\nexport function attachGIFRecorder(p5, fn, lifecycles) {\n /**\n * Start a GIF recording. Returns the recorder so the caller can poll\n * `framesRecorded` or call `stop()` manually.\n *\n * @param {object} [opts]\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration] seconds; auto-stops when reached\n * @param {number} [opts.maxColors=256]\n * @param {string} [opts.filename]\n * @param {(p:number)=>void} [opts.onProgress]\n */\n fn.recordGIF = function (opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] recordGIF: no canvas found');\n if (this._p5ExportGIF && this._p5ExportGIF.active) {\n throw new Error('[p5.export] a GIF recording is already in progress');\n }\n const rec = new GIFRecorder({ canvas, ...opts });\n rec.start();\n this._p5ExportGIF = rec;\n return rec;\n };\n\n /** Stop the active GIF recording and trigger download. */\n fn.stopGIF = function () {\n const rec = this._p5ExportGIF;\n if (!rec) return null;\n this._p5ExportGIF = null;\n return rec.stop();\n };\n\n // Hook into p5's draw lifecycle to capture frames. Compose with any\n // existing postdraw handler — we don't want to clobber another addon.\n if (lifecycles && typeof lifecycles === 'object') {\n const prev = lifecycles.postdraw;\n lifecycles.postdraw = function () {\n if (typeof prev === 'function') prev.call(this);\n if (this._p5ExportGIF && this._p5ExportGIF.active) this._p5ExportGIF.tick();\n };\n }\n}\n","/**\n * VideoBuffer — captures raw RGBA frames from the sketch canvas so the GUI\n * can offer \"record once, export to multiple formats\" instead of locking\n * the user into picking the codec up front.\n *\n * Memory cost is real: each frame is `width × height × 4` bytes. A 5-second\n * recording at 800×500 / 30 fps takes ~240 MB. The default `maxFrames` cap\n * keeps things from running away; the GUI exposes duration/fps so users\n * can stay within their machine's limits.\n */\nexport class VideoBuffer {\n /**\n * @param {object} opts\n * @param {HTMLCanvasElement} opts.canvas\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration] seconds; auto-stops when reached\n * @param {number} [opts.maxFrames=900] safety cap (default ≈ 30 s @ 30 fps)\n */\n constructor({ canvas, fps = 30, duration, maxFrames = 900 }) {\n this.canvas = canvas;\n this.fps = fps;\n this.duration = duration;\n this.maxFrames = maxFrames;\n this.width = canvas.width;\n this.height = canvas.height;\n this.frames = [];\n this.recording = false;\n this.startTime = 0;\n this._nextFrameAt = 0;\n }\n\n start() {\n this.frames = [];\n this.recording = true;\n this.startTime = performance.now();\n this._nextFrameAt = this.startTime;\n }\n\n /**\n * Pull one frame off the canvas if enough time has elapsed. Called every\n * `postdraw` via a lifecycle hook in video.js.\n */\n tick() {\n if (!this.recording) return;\n const now = performance.now();\n if (now < this._nextFrameAt) return;\n if (this.frames.length >= this.maxFrames) {\n this.stop();\n return;\n }\n\n let data;\n const ctx = this.canvas.getContext('2d', { willReadFrequently: true });\n if (ctx && typeof ctx.getImageData === 'function') {\n data = ctx.getImageData(0, 0, this.width, this.height).data;\n } else {\n // WebGL fallback: blit through a 2d canvas to read pixels.\n const tmp = document.createElement('canvas');\n tmp.width = this.width;\n tmp.height = this.height;\n const tctx = tmp.getContext('2d');\n tctx.drawImage(this.canvas, 0, 0);\n data = tctx.getImageData(0, 0, this.width, this.height).data;\n }\n this.frames.push(new Uint8ClampedArray(data));\n this._nextFrameAt += 1000 / this.fps;\n\n if (this.duration && (now - this.startTime) >= this.duration * 1000) {\n this.stop();\n }\n }\n\n stop() {\n this.recording = false;\n }\n\n clear() {\n this.frames = [];\n }\n\n get framesRecorded() {\n return this.frames.length;\n }\n\n /** Duration in seconds of what's been captured so far. */\n get capturedSeconds() {\n return this.frames.length / this.fps;\n }\n}\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateWrapper = (obj, member, setter, getter) => ({\n set _(value) {\n __privateSet(obj, member, value, setter);\n },\n get _() {\n return __privateGet(obj, member, getter);\n }\n});\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/misc.ts\nvar bytes = new Uint8Array(8);\nvar view = new DataView(bytes.buffer);\nvar u8 = (value) => {\n return [(value % 256 + 256) % 256];\n};\nvar u16 = (value) => {\n view.setUint16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar i16 = (value) => {\n view.setInt16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar u24 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[1], bytes[2], bytes[3]];\n};\nvar u32 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar i32 = (value) => {\n view.setInt32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar u64 = (value) => {\n view.setUint32(0, Math.floor(value / 2 ** 32), false);\n view.setUint32(4, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nvar fixed_8_8 = (value) => {\n view.setInt16(0, 2 ** 8 * value, false);\n return [bytes[0], bytes[1]];\n};\nvar fixed_16_16 = (value) => {\n view.setInt32(0, 2 ** 16 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar fixed_2_30 = (value) => {\n view.setInt32(0, 2 ** 30 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar ascii = (text, nullTerminated = false) => {\n let bytes2 = Array(text.length).fill(null).map((_, i) => text.charCodeAt(i));\n if (nullTerminated)\n bytes2.push(0);\n return bytes2;\n};\nvar last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nvar lastPresentedSample = (samples) => {\n let result = void 0;\n for (let sample of samples) {\n if (!result || sample.presentationTimestamp > result.presentationTimestamp) {\n result = sample;\n }\n }\n return result;\n};\nvar intoTimescale = (timeInSeconds, timescale, round = true) => {\n let value = timeInSeconds * timescale;\n return round ? Math.round(value) : value;\n};\nvar rotationMatrix = (rotationInDegrees) => {\n let theta = rotationInDegrees * (Math.PI / 180);\n let cosTheta = Math.cos(theta);\n let sinTheta = Math.sin(theta);\n return [\n cosTheta,\n sinTheta,\n 0,\n -sinTheta,\n cosTheta,\n 0,\n 0,\n 0,\n 1\n ];\n};\nvar IDENTITY_MATRIX = rotationMatrix(0);\nvar matrixToBytes = (matrix) => {\n return [\n fixed_16_16(matrix[0]),\n fixed_16_16(matrix[1]),\n fixed_2_30(matrix[2]),\n fixed_16_16(matrix[3]),\n fixed_16_16(matrix[4]),\n fixed_2_30(matrix[5]),\n fixed_16_16(matrix[6]),\n fixed_16_16(matrix[7]),\n fixed_2_30(matrix[8])\n ];\n};\nvar deepClone = (x) => {\n if (!x)\n return x;\n if (typeof x !== \"object\")\n return x;\n if (Array.isArray(x))\n return x.map(deepClone);\n return Object.fromEntries(Object.entries(x).map(([key, value]) => [key, deepClone(value)]));\n};\nvar isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\n\n// src/box.ts\nvar box = (type, contents, children) => ({\n type,\n contents: contents && new Uint8Array(contents.flat(10)),\n children\n});\nvar fullBox = (type, version, flags, contents, children) => box(\n type,\n [u8(version), u24(flags), contents ?? []],\n children\n);\nvar ftyp = (details) => {\n let minorVersion = 512;\n if (details.fragmented)\n return box(\"ftyp\", [\n ascii(\"iso5\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"iso5\"),\n ascii(\"iso6\"),\n ascii(\"mp41\")\n ]);\n return box(\"ftyp\", [\n ascii(\"isom\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"isom\"),\n details.holdsAvc ? ascii(\"avc1\") : [],\n ascii(\"mp41\")\n ]);\n};\nvar mdat = (reserveLargeSize) => ({ type: \"mdat\", largeSize: reserveLargeSize });\nvar free = (size) => ({ type: \"free\", size });\nvar moov = (tracks, creationTime, fragmented = false) => box(\"moov\", null, [\n mvhd(creationTime, tracks),\n ...tracks.map((x) => trak(x, creationTime)),\n fragmented ? mvex(tracks) : null\n]);\nvar mvhd = (creationTime, tracks) => {\n let duration = intoTimescale(Math.max(\n 0,\n ...tracks.filter((x) => x.samples.length > 0).map((x) => {\n const lastSample = lastPresentedSample(x.samples);\n return lastSample.presentationTimestamp + lastSample.duration;\n })\n ), GLOBAL_TIMESCALE);\n let nextTrackId = Math.max(...tracks.map((x) => x.id)) + 1;\n let needsU64 = !isU32(creationTime) || !isU32(duration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mvhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(GLOBAL_TIMESCALE),\n // Timescale\n u32OrU64(duration),\n // Duration\n fixed_16_16(1),\n // Preferred rate\n fixed_8_8(1),\n // Preferred volume\n Array(10).fill(0),\n // Reserved\n matrixToBytes(IDENTITY_MATRIX),\n // Matrix\n Array(24).fill(0),\n // Pre-defined\n u32(nextTrackId)\n // Next track ID\n ]);\n};\nvar trak = (track, creationTime) => box(\"trak\", null, [\n tkhd(track, creationTime),\n mdia(track, creationTime)\n]);\nvar tkhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let durationInGlobalTimescale = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n GLOBAL_TIMESCALE\n );\n let needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale);\n let u32OrU64 = needsU64 ? u64 : u32;\n let matrix;\n if (track.info.type === \"video\") {\n matrix = typeof track.info.rotation === \"number\" ? rotationMatrix(track.info.rotation) : track.info.rotation;\n } else {\n matrix = IDENTITY_MATRIX;\n }\n return fullBox(\"tkhd\", +needsU64, 3, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.id),\n // Track ID\n u32(0),\n // Reserved\n u32OrU64(durationInGlobalTimescale),\n // Duration\n Array(8).fill(0),\n // Reserved\n u16(0),\n // Layer\n u16(0),\n // Alternate group\n fixed_8_8(track.info.type === \"audio\" ? 1 : 0),\n // Volume\n u16(0),\n // Reserved\n matrixToBytes(matrix),\n // Matrix\n fixed_16_16(track.info.type === \"video\" ? track.info.width : 0),\n // Track width\n fixed_16_16(track.info.type === \"video\" ? track.info.height : 0)\n // Track height\n ]);\n};\nvar mdia = (track, creationTime) => box(\"mdia\", null, [\n mdhd(track, creationTime),\n hdlr(track.info.type === \"video\" ? \"vide\" : \"soun\"),\n minf(track)\n]);\nvar mdhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let localDuration = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n track.timescale\n );\n let needsU64 = !isU32(creationTime) || !isU32(localDuration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mdhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.timescale),\n // Timescale\n u32OrU64(localDuration),\n // Duration\n u16(21956),\n // Language (\"und\", undetermined)\n u16(0)\n // Quality\n ]);\n};\nvar hdlr = (componentSubtype) => fullBox(\"hdlr\", 0, 0, [\n ascii(\"mhlr\"),\n // Component type\n ascii(componentSubtype),\n // Component subtype\n u32(0),\n // Component manufacturer\n u32(0),\n // Component flags\n u32(0),\n // Component flags mask\n ascii(\"mp4-muxer-hdlr\", true)\n // Component name\n]);\nvar minf = (track) => box(\"minf\", null, [\n track.info.type === \"video\" ? vmhd() : smhd(),\n dinf(),\n stbl(track)\n]);\nvar vmhd = () => fullBox(\"vmhd\", 0, 1, [\n u16(0),\n // Graphics mode\n u16(0),\n // Opcolor R\n u16(0),\n // Opcolor G\n u16(0)\n // Opcolor B\n]);\nvar smhd = () => fullBox(\"smhd\", 0, 0, [\n u16(0),\n // Balance\n u16(0)\n // Reserved\n]);\nvar dinf = () => box(\"dinf\", null, [\n dref()\n]);\nvar dref = () => fullBox(\"dref\", 0, 0, [\n u32(1)\n // Entry count\n], [\n url()\n]);\nvar url = () => fullBox(\"url \", 0, 1);\nvar stbl = (track) => {\n const needsCtts = track.compositionTimeOffsetTable.length > 1 || track.compositionTimeOffsetTable.some((x) => x.sampleCompositionTimeOffset !== 0);\n return box(\"stbl\", null, [\n stsd(track),\n stts(track),\n stss(track),\n stsc(track),\n stsz(track),\n stco(track),\n needsCtts ? ctts(track) : null\n ]);\n};\nvar stsd = (track) => fullBox(\"stsd\", 0, 0, [\n u32(1)\n // Entry count\n], [\n track.info.type === \"video\" ? videoSampleDescription(\n VIDEO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n ) : soundSampleDescription(\n AUDIO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n )\n]);\nvar videoSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Pre-defined\n u16(0),\n // Reserved\n Array(12).fill(0),\n // Pre-defined\n u16(track.info.width),\n // Width\n u16(track.info.height),\n // Height\n u32(4718592),\n // Horizontal resolution\n u32(4718592),\n // Vertical resolution\n u32(0),\n // Reserved\n u16(1),\n // Frame count\n Array(32).fill(0),\n // Compressor name\n u16(24),\n // Depth\n i16(65535)\n // Pre-defined\n], [\n VIDEO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track),\n track.info.decoderConfig.colorSpace ? colr(track) : null\n]);\nvar COLOR_PRIMARIES_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // ITU-R BT.601 525 - SMPTE 170M\n};\nvar TRANSFER_CHARACTERISTICS_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"smpte170m\": 6,\n // SMPTE 170M\n \"iec61966-2-1\": 13\n // IEC 61966-2-1\n};\nvar MATRIX_COEFFICIENTS_MAP = {\n \"rgb\": 0,\n // Identity\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // SMPTE 170M\n};\nvar colr = (track) => box(\"colr\", [\n ascii(\"nclx\"),\n // Colour type\n u16(COLOR_PRIMARIES_MAP[track.info.decoderConfig.colorSpace.primaries]),\n // Colour primaries\n u16(TRANSFER_CHARACTERISTICS_MAP[track.info.decoderConfig.colorSpace.transfer]),\n // Transfer characteristics\n u16(MATRIX_COEFFICIENTS_MAP[track.info.decoderConfig.colorSpace.matrix]),\n // Matrix coefficients\n u8((track.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)\n // Full range flag\n]);\nvar avcC = (track) => track.info.decoderConfig && box(\"avcC\", [\n // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar hvcC = (track) => track.info.decoderConfig && box(\"hvcC\", [\n // For HEVC, description is a HEVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar vpcC = (track) => {\n if (!track.info.decoderConfig) {\n return null;\n }\n let decoderConfig = track.info.decoderConfig;\n if (!decoderConfig.colorSpace) {\n throw new Error(`'colorSpace' is required in the decoder config for VP9.`);\n }\n let parts = decoderConfig.codec.split(\".\");\n let profile = Number(parts[1]);\n let level = Number(parts[2]);\n let bitDepth = Number(parts[3]);\n let chromaSubsampling = 0;\n let thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + Number(decoderConfig.colorSpace.fullRange);\n let colourPrimaries = 2;\n let transferCharacteristics = 2;\n let matrixCoefficients = 2;\n return fullBox(\"vpcC\", 1, 0, [\n u8(profile),\n // Profile\n u8(level),\n // Level\n u8(thirdByte),\n // Bit depth, chroma subsampling, full range\n u8(colourPrimaries),\n // Colour primaries\n u8(transferCharacteristics),\n // Transfer characteristics\n u8(matrixCoefficients),\n // Matrix coefficients\n u16(0)\n // Codec initialization data size\n ]);\n};\nvar av1C = () => {\n let marker = 1;\n let version = 1;\n let firstByte = (marker << 7) + version;\n return box(\"av1C\", [\n firstByte,\n 0,\n 0,\n 0\n ]);\n};\nvar soundSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Version\n u16(0),\n // Revision level\n u32(0),\n // Vendor\n u16(track.info.numberOfChannels),\n // Number of channels\n u16(16),\n // Sample size (bits)\n u16(0),\n // Compression ID\n u16(0),\n // Packet size\n fixed_16_16(track.info.sampleRate)\n // Sample rate\n], [\n AUDIO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track)\n]);\nvar esds = (track) => {\n let description = new Uint8Array(track.info.decoderConfig.description);\n return fullBox(\"esds\", 0, 0, [\n // https://stackoverflow.com/a/54803118\n u32(58753152),\n // TAG(3) = Object Descriptor ([2])\n u8(32 + description.byteLength),\n // length of this OD (which includes the next 2 tags)\n u16(1),\n // ES_ID = 1\n u8(0),\n // flags etc = 0\n u32(75530368),\n // TAG(4) = ES Descriptor ([2]) embedded in above OD\n u8(18 + description.byteLength),\n // length of this ESD\n u8(64),\n // MPEG-4 Audio\n u8(21),\n // stream type(6bits)=5 audio, flags(2bits)=1\n u24(0),\n // 24bit buffer size\n u32(130071),\n // max bitrate\n u32(130071),\n // avg bitrate\n u32(92307584),\n // TAG(5) = ASC ([2],[3]) embedded in above OD\n u8(description.byteLength),\n // length\n ...description,\n u32(109084800),\n // TAG(6)\n u8(1),\n // length\n u8(2)\n // data\n ]);\n};\nvar dOps = (track) => {\n let preskip = 3840;\n let gain = 0;\n const description = track.info.decoderConfig?.description;\n if (description) {\n if (description.byteLength < 18) {\n throw new TypeError(\"Invalid decoder description provided for Opus; must be at least 18 bytes long.\");\n }\n const view2 = ArrayBuffer.isView(description) ? new DataView(description.buffer, description.byteOffset, description.byteLength) : new DataView(description);\n preskip = view2.getUint16(10, true);\n gain = view2.getInt16(14, true);\n }\n return box(\"dOps\", [\n u8(0),\n // Version\n u8(track.info.numberOfChannels),\n // OutputChannelCount\n u16(preskip),\n u32(track.info.sampleRate),\n // InputSampleRate\n fixed_8_8(gain),\n // OutputGain\n u8(0)\n // ChannelMappingFamily\n ]);\n};\nvar stts = (track) => {\n return fullBox(\"stts\", 0, 0, [\n u32(track.timeToSampleTable.length),\n // Number of entries\n track.timeToSampleTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleDelta)\n // Sample duration\n ])\n ]);\n};\nvar stss = (track) => {\n if (track.samples.every((x) => x.type === \"key\"))\n return null;\n let keySamples = [...track.samples.entries()].filter(([, sample]) => sample.type === \"key\");\n return fullBox(\"stss\", 0, 0, [\n u32(keySamples.length),\n // Number of entries\n keySamples.map(([index]) => u32(index + 1))\n // Sync sample table\n ]);\n};\nvar stsc = (track) => {\n return fullBox(\"stsc\", 0, 0, [\n u32(track.compactlyCodedChunkTable.length),\n // Number of entries\n track.compactlyCodedChunkTable.map((x) => [\n // Sample-to-chunk table\n u32(x.firstChunk),\n // First chunk\n u32(x.samplesPerChunk),\n // Samples per chunk\n u32(1)\n // Sample description index\n ])\n ]);\n};\nvar stsz = (track) => fullBox(\"stsz\", 0, 0, [\n u32(0),\n // Sample size (0 means non-constant size)\n u32(track.samples.length),\n // Number of entries\n track.samples.map((x) => u32(x.size))\n // Sample size table\n]);\nvar stco = (track) => {\n if (track.finalizedChunks.length > 0 && last(track.finalizedChunks).offset >= 2 ** 32) {\n return fullBox(\"co64\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u64(x.offset))\n // Chunk offset table\n ]);\n }\n return fullBox(\"stco\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u32(x.offset))\n // Chunk offset table\n ]);\n};\nvar ctts = (track) => {\n return fullBox(\"ctts\", 0, 0, [\n u32(track.compositionTimeOffsetTable.length),\n // Number of entries\n track.compositionTimeOffsetTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleCompositionTimeOffset)\n // Sample offset\n ])\n ]);\n};\nvar mvex = (tracks) => {\n return box(\"mvex\", null, tracks.map(trex));\n};\nvar trex = (track) => {\n return fullBox(\"trex\", 0, 0, [\n u32(track.id),\n // Track ID\n u32(1),\n // Default sample description index\n u32(0),\n // Default sample duration\n u32(0),\n // Default sample size\n u32(0)\n // Default sample flags\n ]);\n};\nvar moof = (sequenceNumber, tracks) => {\n return box(\"moof\", null, [\n mfhd(sequenceNumber),\n ...tracks.map(traf)\n ]);\n};\nvar mfhd = (sequenceNumber) => {\n return fullBox(\"mfhd\", 0, 0, [\n u32(sequenceNumber)\n // Sequence number\n ]);\n};\nvar fragmentSampleFlags = (sample) => {\n let byte1 = 0;\n let byte2 = 0;\n let byte3 = 0;\n let byte4 = 0;\n let sampleIsDifferenceSample = sample.type === \"delta\";\n byte2 |= +sampleIsDifferenceSample;\n if (sampleIsDifferenceSample) {\n byte1 |= 1;\n } else {\n byte1 |= 2;\n }\n return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;\n};\nvar traf = (track) => {\n return box(\"traf\", null, [\n tfhd(track),\n tfdt(track),\n trun(track)\n ]);\n};\nvar tfhd = (track) => {\n let tfFlags = 0;\n tfFlags |= 8;\n tfFlags |= 16;\n tfFlags |= 32;\n tfFlags |= 131072;\n let referenceSample = track.currentChunk.samples[1] ?? track.currentChunk.samples[0];\n let referenceSampleInfo = {\n duration: referenceSample.timescaleUnitsToNextSample,\n size: referenceSample.size,\n flags: fragmentSampleFlags(referenceSample)\n };\n return fullBox(\"tfhd\", 0, tfFlags, [\n u32(track.id),\n // Track ID\n u32(referenceSampleInfo.duration),\n // Default sample duration\n u32(referenceSampleInfo.size),\n // Default sample size\n u32(referenceSampleInfo.flags)\n // Default sample flags\n ]);\n};\nvar tfdt = (track) => {\n return fullBox(\"tfdt\", 1, 0, [\n u64(intoTimescale(track.currentChunk.startTimestamp, track.timescale))\n // Base Media Decode Time\n ]);\n};\nvar trun = (track) => {\n let allSampleDurations = track.currentChunk.samples.map((x) => x.timescaleUnitsToNextSample);\n let allSampleSizes = track.currentChunk.samples.map((x) => x.size);\n let allSampleFlags = track.currentChunk.samples.map(fragmentSampleFlags);\n let allSampleCompositionTimeOffsets = track.currentChunk.samples.map((x) => intoTimescale(x.presentationTimestamp - x.decodeTimestamp, track.timescale));\n let uniqueSampleDurations = new Set(allSampleDurations);\n let uniqueSampleSizes = new Set(allSampleSizes);\n let uniqueSampleFlags = new Set(allSampleFlags);\n let uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets);\n let firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1];\n let sampleDurationPresent = uniqueSampleDurations.size > 1;\n let sampleSizePresent = uniqueSampleSizes.size > 1;\n let sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1;\n let sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some((x) => x !== 0);\n let flags = 0;\n flags |= 1;\n flags |= 4 * +firstSampleFlagsPresent;\n flags |= 256 * +sampleDurationPresent;\n flags |= 512 * +sampleSizePresent;\n flags |= 1024 * +sampleFlagsPresent;\n flags |= 2048 * +sampleCompositionTimeOffsetsPresent;\n return fullBox(\"trun\", 1, flags, [\n u32(track.currentChunk.samples.length),\n // Sample count\n u32(track.currentChunk.offset - track.currentChunk.moofOffset || 0),\n // Data offset\n firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [],\n track.currentChunk.samples.map((_, i) => [\n sampleDurationPresent ? u32(allSampleDurations[i]) : [],\n // Sample duration\n sampleSizePresent ? u32(allSampleSizes[i]) : [],\n // Sample size\n sampleFlagsPresent ? u32(allSampleFlags[i]) : [],\n // Sample flags\n // Sample composition time offsets\n sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : []\n ])\n ]);\n};\nvar mfra = (tracks) => {\n return box(\"mfra\", null, [\n ...tracks.map(tfra),\n mfro()\n ]);\n};\nvar tfra = (track, trackIndex) => {\n let version = 1;\n return fullBox(\"tfra\", version, 0, [\n u32(track.id),\n // Track ID\n u32(63),\n // This specifies that traf number, trun number and sample number are 32-bit ints\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((chunk) => [\n u64(intoTimescale(chunk.startTimestamp, track.timescale)),\n // Time\n u64(chunk.moofOffset),\n // moof offset\n u32(trackIndex + 1),\n // traf number\n u32(1),\n // trun number\n u32(1)\n // Sample number\n ])\n ]);\n};\nvar mfro = () => {\n return fullBox(\"mfro\", 0, 0, [\n // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box\n // is known\n u32(0)\n // Size\n ]);\n};\nvar VIDEO_CODEC_TO_BOX_NAME = {\n \"avc\": \"avc1\",\n \"hevc\": \"hvc1\",\n \"vp9\": \"vp09\",\n \"av1\": \"av01\"\n};\nvar VIDEO_CODEC_TO_CONFIGURATION_BOX = {\n \"avc\": avcC,\n \"hevc\": hvcC,\n \"vp9\": vpcC,\n \"av1\": av1C\n};\nvar AUDIO_CODEC_TO_BOX_NAME = {\n \"aac\": \"mp4a\",\n \"opus\": \"Opus\"\n};\nvar AUDIO_CODEC_TO_CONFIGURATION_BOX = {\n \"aac\": esds,\n \"opus\": dOps\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView;\nvar Writer = class {\n constructor() {\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n /**\n * Stores the position from the start of the file to where boxes elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = /* @__PURE__ */ new WeakMap();\n }\n /** Sets the current position for future writes to a new one. */\n seek(newPos) {\n this.pos = newPos;\n }\n writeU32(value) {\n __privateGet(this, _helperView).setUint32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n }\n writeU64(value) {\n __privateGet(this, _helperView).setUint32(0, Math.floor(value / 2 ** 32), false);\n __privateGet(this, _helperView).setUint32(4, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 8));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n __privateGet(this, _helperView).setUint8(i % 8, text.charCodeAt(i));\n if (i % 8 === 7)\n this.write(__privateGet(this, _helper));\n }\n if (text.length % 8 !== 0) {\n this.write(__privateGet(this, _helper).subarray(0, text.length % 8));\n }\n }\n writeBox(box2) {\n this.offsets.set(box2, this.pos);\n if (box2.contents && !box2.children) {\n this.writeBoxHeader(box2, box2.size ?? box2.contents.byteLength + 8);\n this.write(box2.contents);\n } else {\n let startPos = this.pos;\n this.writeBoxHeader(box2, 0);\n if (box2.contents)\n this.write(box2.contents);\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n this.writeBox(child);\n }\n let endPos = this.pos;\n let size = box2.size ?? endPos - startPos;\n this.seek(startPos);\n this.writeBoxHeader(box2, size);\n this.seek(endPos);\n }\n }\n writeBoxHeader(box2, size) {\n this.writeU32(box2.largeSize ? 1 : size);\n this.writeAscii(box2.type);\n if (box2.largeSize)\n this.writeU64(size);\n }\n measureBoxHeader(box2) {\n return 8 + (box2.largeSize ? 8 : 0);\n }\n patchBox(box2) {\n let endPos = this.pos;\n this.seek(this.offsets.get(box2));\n this.writeBox(box2);\n this.seek(endPos);\n }\n measureBox(box2) {\n if (box2.contents && !box2.children) {\n let headerSize = this.measureBoxHeader(box2);\n return headerSize + box2.contents.byteLength;\n } else {\n let result = this.measureBoxHeader(box2);\n if (box2.contents)\n result += box2.contents.byteLength;\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n result += this.measureBox(child);\n }\n return result;\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\nvar _target, _buffer, _bytes, _maxPos, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateAdd(this, _maxPos, 0);\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n __privateSet(this, _maxPos, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_maxPos = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _target2, _sections, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _target2, void 0);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n /**\n * The data is divided up into fixed-size chunks, whose contents are first filled in RAM and then flushed out.\n * A chunk is flushed if all of its contents have been written.\n */\n __privateAdd(this, _chunks, []);\n __privateSet(this, _target2, target);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n __privateGet(this, _target2).options.onData?.(chunk.data, chunk.start);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_target2 = new WeakMap();\n_sections = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n __privateGet(this, _target2).options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }));\n }\n};\n\n// src/muxer.ts\nvar GLOBAL_TIMESCALE = 1e3;\nvar SUPPORTED_VIDEO_CODECS = [\"avc\", \"hevc\", \"vp9\", \"av1\"];\nvar SUPPORTED_AUDIO_CODECS = [\"aac\", \"opus\"];\nvar TIMESTAMP_OFFSET = 2082844800;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"cross-track-offset\"];\nvar _options, _writer, _ftypSize, _mdat, _videoTrack, _audioTrack, _creationTime, _finalizedChunks, _nextFragmentNumber, _videoSampleQueue, _audioSampleQueue, _finalized, _validateOptions, validateOptions_fn, _writeHeader, writeHeader_fn, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn, _prepareTracks, prepareTracks_fn, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn, _createSampleForTrack, createSampleForTrack_fn, _addSampleToTrack, addSampleToTrack_fn, _validateTimestamp, validateTimestamp_fn, _finalizeCurrentChunk, finalizeCurrentChunk_fn, _finalizeFragment, finalizeFragment_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _writeHeader);\n __privateAdd(this, _computeMoovSizeUpperBound);\n __privateAdd(this, _prepareTracks);\n // https://wiki.multimedia.cx/index.php/MPEG-4_Audio\n __privateAdd(this, _generateMpeg4AudioSpecificConfig);\n __privateAdd(this, _createSampleForTrack);\n __privateAdd(this, _addSampleToTrack);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _finalizeCurrentChunk);\n __privateAdd(this, _finalizeFragment);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _ftypSize, void 0);\n __privateAdd(this, _mdat, void 0);\n __privateAdd(this, _videoTrack, null);\n __privateAdd(this, _audioTrack, null);\n __privateAdd(this, _creationTime, Math.floor(Date.now() / 1e3) + TIMESTAMP_OFFSET);\n __privateAdd(this, _finalizedChunks, []);\n // Fields for fragmented MP4:\n __privateAdd(this, _nextFragmentNumber, 1);\n __privateAdd(this, _videoSampleQueue, []);\n __privateAdd(this, _audioSampleQueue, []);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n options.video = deepClone(options.video);\n options.audio = deepClone(options.audio);\n options.fastStart = deepClone(options.fastStart);\n this.target = options.target;\n __privateSet(this, _options, {\n firstTimestampBehavior: \"strict\",\n ...options\n });\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _prepareTracks, prepareTracks_fn).call(this);\n __privateMethod(this, _writeHeader, writeHeader_fn).call(this);\n }\n addVideoChunk(sample, meta, timestamp, compositionTimeOffset) {\n if (!(sample instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (sample) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunk's fourth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addVideoChunkRaw(\n data,\n sample.type,\n timestamp ?? sample.timestamp,\n sample.duration,\n meta,\n compositionTimeOffset\n );\n }\n addVideoChunkRaw(data, type, timestamp, duration, meta, compositionTimeOffset) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunkRaw's sixth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _videoTrack).samples.length === __privateGet(this, _options).fastStart.expectedVideoChunks) {\n throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedVideoChunks}).`);\n }\n let videoSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _videoTrack), data, type, timestamp, duration, meta, compositionTimeOffset);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _audioTrack)) {\n while (__privateGet(this, _audioSampleQueue).length > 0 && __privateGet(this, _audioSampleQueue)[0].decodeTimestamp <= videoSample.decodeTimestamp) {\n let audioSample = __privateGet(this, _audioSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n if (videoSample.decodeTimestamp <= __privateGet(this, _audioTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n } else {\n __privateGet(this, _videoSampleQueue).push(videoSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n }\n addAudioChunk(sample, meta, timestamp) {\n if (!(sample instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (sample) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addAudioChunkRaw(data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta);\n }\n addAudioChunkRaw(data, type, timestamp, duration, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _audioTrack).samples.length === __privateGet(this, _options).fastStart.expectedAudioChunks) {\n throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedAudioChunks}).`);\n }\n let audioSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _audioTrack), data, type, timestamp, duration, meta);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _videoTrack)) {\n while (__privateGet(this, _videoSampleQueue).length > 0 && __privateGet(this, _videoSampleQueue)[0].decodeTimestamp <= audioSample.decodeTimestamp) {\n let videoSample = __privateGet(this, _videoSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n if (audioSample.decodeTimestamp <= __privateGet(this, _videoTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n } else {\n __privateGet(this, _audioSampleQueue).push(audioSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n }\n /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n for (let videoSample of __privateGet(this, _videoSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n for (let audioSample of __privateGet(this, _audioSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this, false);\n } else {\n if (__privateGet(this, _videoTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _videoTrack));\n if (__privateGet(this, _audioTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _audioTrack));\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter(Boolean);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n let mdatSize;\n for (let i = 0; i < 2; i++) {\n let movieBox2 = moov(tracks, __privateGet(this, _creationTime));\n let movieBoxSize = __privateGet(this, _writer).measureBox(movieBox2);\n mdatSize = __privateGet(this, _writer).measureBox(__privateGet(this, _mdat));\n let currentChunkPos = __privateGet(this, _writer).pos + movieBoxSize + mdatSize;\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n chunk.offset = currentChunkPos;\n for (let { data } of chunk.samples) {\n currentChunkPos += data.byteLength;\n mdatSize += data.byteLength;\n }\n }\n if (currentChunkPos < 2 ** 32)\n break;\n if (mdatSize >= 2 ** 32)\n __privateGet(this, _mdat).largeSize = true;\n }\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n __privateGet(this, _writer).writeBox(movieBox);\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n for (let sample of chunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let startPos = __privateGet(this, _writer).pos;\n let mfraBox = mfra(tracks);\n __privateGet(this, _writer).writeBox(mfraBox);\n let mfraBoxSize = __privateGet(this, _writer).pos - startPos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos - 4);\n __privateGet(this, _writer).writeU32(mfraBoxSize);\n } else {\n let mdatPos = __privateGet(this, _writer).offsets.get(__privateGet(this, _mdat));\n let mdatSize = __privateGet(this, _writer).pos - mdatPos;\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _mdat).largeSize = mdatSize >= 2 ** 32;\n __privateGet(this, _writer).patchBox(__privateGet(this, _mdat));\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n __privateGet(this, _writer).seek(__privateGet(this, _ftypSize));\n __privateGet(this, _writer).writeBox(movieBox);\n let remainingBytes = mdatPos - __privateGet(this, _writer).pos;\n __privateGet(this, _writer).writeBox(free(remainingBytes));\n } else {\n __privateGet(this, _writer).writeBox(movieBox);\n }\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_ftypSize = new WeakMap();\n_mdat = new WeakMap();\n_videoTrack = new WeakMap();\n_audioTrack = new WeakMap();\n_creationTime = new WeakMap();\n_finalizedChunks = new WeakMap();\n_nextFragmentNumber = new WeakMap();\n_videoSampleQueue = new WeakMap();\n_audioSampleQueue = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (!SUPPORTED_VIDEO_CODECS.includes(options.video.codec)) {\n throw new TypeError(`Unsupported video codec: ${options.video.codec}`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n const videoRotation = options.video.rotation;\n if (typeof videoRotation === \"number\" && ![0, 90, 180, 270].includes(videoRotation)) {\n throw new TypeError(`Invalid video rotation: ${videoRotation}. Has to be 0, 90, 180 or 270.`);\n } else if (Array.isArray(videoRotation) && (videoRotation.length !== 9 || videoRotation.some((value) => typeof value !== \"number\"))) {\n throw new TypeError(`Invalid video transformation matrix: ${videoRotation.join()}`);\n }\n if (options.video.frameRate !== void 0 && (!Number.isInteger(options.video.frameRate) || options.video.frameRate <= 0)) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive integer.`\n );\n }\n }\n if (options.audio) {\n if (!SUPPORTED_AUDIO_CODECS.includes(options.audio.codec)) {\n throw new TypeError(`Unsupported audio codec: ${options.audio.codec}`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (typeof options.fastStart === \"object\") {\n if (options.video) {\n if (options.fastStart.expectedVideoChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedVideoChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedVideoChunks) || options.fastStart.expectedVideoChunks < 0) {\n throw new TypeError(`'expectedVideoChunks' must be a non-negative integer.`);\n }\n }\n if (options.audio) {\n if (options.fastStart.expectedAudioChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedAudioChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedAudioChunks) || options.fastStart.expectedAudioChunks < 0) {\n throw new TypeError(`'expectedAudioChunks' must be a non-negative integer.`);\n }\n }\n } else if (![false, \"in-memory\", \"fragmented\"].includes(options.fastStart)) {\n throw new TypeError(`'fastStart' option must be false, 'in-memory', 'fragmented' or an object.`);\n }\n if (options.minFragmentDuration !== void 0 && (!Number.isFinite(options.minFragmentDuration) || options.minFragmentDuration < 0)) {\n throw new TypeError(`'minFragmentDuration' must be a non-negative number.`);\n }\n};\n_writeHeader = new WeakSet();\nwriteHeader_fn = function() {\n __privateGet(this, _writer).writeBox(ftyp({\n holdsAvc: __privateGet(this, _options).video?.codec === \"avc\",\n fragmented: __privateGet(this, _options).fastStart === \"fragmented\"\n }));\n __privateSet(this, _ftypSize, __privateGet(this, _writer).pos);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n __privateSet(this, _mdat, mdat(false));\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n } else {\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n let moovSizeUpperBound = __privateMethod(this, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn).call(this);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos + moovSizeUpperBound);\n }\n __privateSet(this, _mdat, mdat(true));\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_computeMoovSizeUpperBound = new WeakSet();\ncomputeMoovSizeUpperBound_fn = function() {\n if (typeof __privateGet(this, _options).fastStart !== \"object\")\n return;\n let upperBound = 0;\n let sampleCounts = [\n __privateGet(this, _options).fastStart.expectedVideoChunks,\n __privateGet(this, _options).fastStart.expectedAudioChunks\n ];\n for (let n of sampleCounts) {\n if (!n)\n continue;\n upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += 8 * n;\n }\n upperBound += 4096;\n return upperBound;\n};\n_prepareTracks = new WeakSet();\nprepareTracks_fn = function() {\n if (__privateGet(this, _options).video) {\n __privateSet(this, _videoTrack, {\n id: 1,\n info: {\n type: \"video\",\n codec: __privateGet(this, _options).video.codec,\n width: __privateGet(this, _options).video.width,\n height: __privateGet(this, _options).video.height,\n rotation: __privateGet(this, _options).video.rotation ?? 0,\n decoderConfig: null\n },\n // The fallback contains many common frame rates as factors\n timescale: __privateGet(this, _options).video.frameRate ?? 57600,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioTrack, {\n id: __privateGet(this, _options).video ? 2 : 1,\n info: {\n type: \"audio\",\n codec: __privateGet(this, _options).audio.codec,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate,\n decoderConfig: null\n },\n timescale: __privateGet(this, _options).audio.sampleRate,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n if (__privateGet(this, _options).audio.codec === \"aac\") {\n let guessedCodecPrivate = __privateMethod(this, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn).call(\n this,\n 2,\n // Object type for AAC-LC, since it's the most common\n __privateGet(this, _options).audio.sampleRate,\n __privateGet(this, _options).audio.numberOfChannels\n );\n __privateGet(this, _audioTrack).info.decoderConfig = {\n codec: __privateGet(this, _options).audio.codec,\n description: guessedCodecPrivate,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate\n };\n }\n }\n};\n_generateMpeg4AudioSpecificConfig = new WeakSet();\ngenerateMpeg4AudioSpecificConfig_fn = function(objectType, sampleRate, numberOfChannels) {\n let frequencyIndices = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n let frequencyIndex = frequencyIndices.indexOf(sampleRate);\n let channelConfig = numberOfChannels;\n let configBits = \"\";\n configBits += objectType.toString(2).padStart(5, \"0\");\n configBits += frequencyIndex.toString(2).padStart(4, \"0\");\n if (frequencyIndex === 15)\n configBits += sampleRate.toString(2).padStart(24, \"0\");\n configBits += channelConfig.toString(2).padStart(4, \"0\");\n let paddingLength = Math.ceil(configBits.length / 8) * 8;\n configBits = configBits.padEnd(paddingLength, \"0\");\n let configBytes = new Uint8Array(configBits.length / 8);\n for (let i = 0; i < configBits.length; i += 8) {\n configBytes[i / 8] = parseInt(configBits.slice(i, i + 8), 2);\n }\n return configBytes;\n};\n_createSampleForTrack = new WeakSet();\ncreateSampleForTrack_fn = function(track, data, type, timestamp, duration, meta, compositionTimeOffset) {\n let presentationTimestampInSeconds = timestamp / 1e6;\n let decodeTimestampInSeconds = (timestamp - (compositionTimeOffset ?? 0)) / 1e6;\n let durationInSeconds = duration / 1e6;\n let adjusted = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, presentationTimestampInSeconds, decodeTimestampInSeconds, track);\n presentationTimestampInSeconds = adjusted.presentationTimestamp;\n decodeTimestampInSeconds = adjusted.decodeTimestamp;\n if (meta?.decoderConfig) {\n if (track.info.decoderConfig === null) {\n track.info.decoderConfig = meta.decoderConfig;\n } else {\n Object.assign(track.info.decoderConfig, meta.decoderConfig);\n }\n }\n let sample = {\n presentationTimestamp: presentationTimestampInSeconds,\n decodeTimestamp: decodeTimestampInSeconds,\n duration: durationInSeconds,\n data,\n size: data.byteLength,\n type,\n // Will be refined once the next sample comes in\n timescaleUnitsToNextSample: intoTimescale(durationInSeconds, track.timescale)\n };\n return sample;\n};\n_addSampleToTrack = new WeakSet();\naddSampleToTrack_fn = function(track, sample) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.samples.push(sample);\n }\n const sampleCompositionTimeOffset = intoTimescale(sample.presentationTimestamp - sample.decodeTimestamp, track.timescale);\n if (track.lastTimescaleUnits !== null) {\n let timescaleUnits = intoTimescale(sample.decodeTimestamp, track.timescale, false);\n let delta = Math.round(timescaleUnits - track.lastTimescaleUnits);\n track.lastTimescaleUnits += delta;\n track.lastSample.timescaleUnitsToNextSample = delta;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n let lastTableEntry = last(track.timeToSampleTable);\n if (lastTableEntry.sampleCount === 1) {\n lastTableEntry.sampleDelta = delta;\n lastTableEntry.sampleCount++;\n } else if (lastTableEntry.sampleDelta === delta) {\n lastTableEntry.sampleCount++;\n } else {\n lastTableEntry.sampleCount--;\n track.timeToSampleTable.push({\n sampleCount: 2,\n sampleDelta: delta\n });\n }\n const lastCompositionTimeOffsetTableEntry = last(track.compositionTimeOffsetTable);\n if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) {\n lastCompositionTimeOffsetTableEntry.sampleCount++;\n } else {\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n } else {\n track.lastTimescaleUnits = 0;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.timeToSampleTable.push({\n sampleCount: 1,\n sampleDelta: intoTimescale(sample.duration, track.timescale)\n });\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n track.lastSample = sample;\n let beginNewChunk = false;\n if (!track.currentChunk) {\n beginNewChunk = true;\n } else {\n let currentChunkDuration = sample.presentationTimestamp - track.currentChunk.startTimestamp;\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let mostImportantTrack = __privateGet(this, _videoTrack) ?? __privateGet(this, _audioTrack);\n const chunkDuration = __privateGet(this, _options).minFragmentDuration ?? 1;\n if (track === mostImportantTrack && sample.type === \"key\" && currentChunkDuration >= chunkDuration) {\n beginNewChunk = true;\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this);\n }\n } else {\n beginNewChunk = currentChunkDuration >= 0.5;\n }\n }\n if (beginNewChunk) {\n if (track.currentChunk) {\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, track);\n }\n track.currentChunk = {\n startTimestamp: sample.presentationTimestamp,\n samples: []\n };\n }\n track.currentChunk.samples.push(sample);\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(presentationTimestamp, decodeTimestamp, track) {\n const strictTimestampBehavior = __privateGet(this, _options).firstTimestampBehavior === \"strict\";\n const noLastDecodeTimestamp = track.lastDecodeTimestamp === -1;\n const timestampNonZero = decodeTimestamp !== 0;\n if (strictTimestampBehavior && noLastDecodeTimestamp && timestampNonZero) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received DTS=${decodeTimestamp}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\" || __privateGet(this, _options).firstTimestampBehavior === \"cross-track-offset\") {\n if (track.firstDecodeTimestamp === void 0) {\n track.firstDecodeTimestamp = decodeTimestamp;\n }\n let baseDecodeTimestamp;\n if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n baseDecodeTimestamp = track.firstDecodeTimestamp;\n } else {\n baseDecodeTimestamp = Math.min(\n __privateGet(this, _videoTrack)?.firstDecodeTimestamp ?? Infinity,\n __privateGet(this, _audioTrack)?.firstDecodeTimestamp ?? Infinity\n );\n }\n decodeTimestamp -= baseDecodeTimestamp;\n presentationTimestamp -= baseDecodeTimestamp;\n }\n if (decodeTimestamp < track.lastDecodeTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (DTS went from ${track.lastDecodeTimestamp * 1e6} to ${decodeTimestamp * 1e6}).`\n );\n }\n track.lastDecodeTimestamp = decodeTimestamp;\n return { presentationTimestamp, decodeTimestamp };\n};\n_finalizeCurrentChunk = new WeakSet();\nfinalizeCurrentChunk_fn = function(track) {\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n throw new Error(\"Can't finalize individual chunks if 'fastStart' is set to 'fragmented'.\");\n }\n if (!track.currentChunk)\n return;\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n if (track.compactlyCodedChunkTable.length === 0 || last(track.compactlyCodedChunkTable).samplesPerChunk !== track.currentChunk.samples.length) {\n track.compactlyCodedChunkTable.push({\n firstChunk: track.finalizedChunks.length,\n // 1-indexed\n samplesPerChunk: track.currentChunk.samples.length\n });\n }\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n track.currentChunk.offset = 0;\n return;\n }\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_finalizeFragment = new WeakSet();\nfinalizeFragment_fn = function(flushStreamingWriter = true) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n throw new Error(\"Can't finalize a fragment unless 'fastStart' is set to 'fragmented'.\");\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter((track) => track && track.currentChunk);\n if (tracks.length === 0)\n return;\n let fragmentNumber = __privateWrapper(this, _nextFragmentNumber)._++;\n if (fragmentNumber === 1) {\n let movieBox = moov(tracks, __privateGet(this, _creationTime), true);\n __privateGet(this, _writer).writeBox(movieBox);\n }\n let moofOffset = __privateGet(this, _writer).pos;\n let moofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(moofBox);\n {\n let mdatBox = mdat(false);\n let totalTrackSampleSize = 0;\n for (let track of tracks) {\n for (let sample of track.currentChunk.samples) {\n totalTrackSampleSize += sample.size;\n }\n }\n let mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n if (mdatSize >= 2 ** 32) {\n mdatBox.largeSize = true;\n mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n }\n mdatBox.size = mdatSize;\n __privateGet(this, _writer).writeBox(mdatBox);\n }\n for (let track of tracks) {\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n track.currentChunk.moofOffset = moofOffset;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(moofBox));\n let newMoofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(newMoofBox);\n __privateGet(this, _writer).seek(endPos);\n for (let track of tracks) {\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n track.currentChunk = null;\n }\n if (flushStreamingWriter) {\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget\n};\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/ebml.ts\nvar EBMLFloat32 = class {\n constructor(value) {\n this.value = value;\n }\n};\nvar EBMLFloat64 = class {\n constructor(value) {\n this.value = value;\n }\n};\nvar measureUnsignedInt = (value) => {\n if (value < 1 << 8) {\n return 1;\n } else if (value < 1 << 16) {\n return 2;\n } else if (value < 1 << 24) {\n return 3;\n } else if (value < 2 ** 32) {\n return 4;\n } else if (value < 2 ** 40) {\n return 5;\n } else {\n return 6;\n }\n};\nvar measureEBMLVarInt = (value) => {\n if (value < (1 << 7) - 1) {\n return 1;\n } else if (value < (1 << 14) - 1) {\n return 2;\n } else if (value < (1 << 21) - 1) {\n return 3;\n } else if (value < (1 << 28) - 1) {\n return 4;\n } else if (value < 2 ** 35 - 1) {\n return 5;\n } else if (value < 2 ** 42 - 1) {\n return 6;\n } else {\n throw new Error(\"EBML VINT size not supported \" + value);\n }\n};\n\n// src/misc.ts\nvar readBits = (bytes, start, end) => {\n let result = 0;\n for (let i = start; i < end; i++) {\n let byteIndex = Math.floor(i / 8);\n let byte = bytes[byteIndex];\n let bitIndex = 7 - (i & 7);\n let bit = (byte & 1 << bitIndex) >> bitIndex;\n result <<= 1;\n result |= bit;\n }\n return result;\n};\nvar writeBits = (bytes, start, end, value) => {\n for (let i = start; i < end; i++) {\n let byteIndex = Math.floor(i / 8);\n let byte = bytes[byteIndex];\n let bitIndex = 7 - (i & 7);\n byte &= ~(1 << bitIndex);\n byte |= (value & 1 << end - i - 1) >> end - i - 1 << bitIndex;\n bytes[byteIndex] = byte;\n }\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.onHeader && typeof options.onHeader !== \"function\") {\n throw new TypeError(\"options.onHeader, when provided, must be a function.\");\n }\n if (options.onCluster && typeof options.onCluster !== \"function\") {\n throw new TypeError(\"options.onCluster, when provided, must be a function.\");\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView, _writeByte, writeByte_fn, _writeFloat32, writeFloat32_fn, _writeFloat64, writeFloat64_fn, _writeUnsignedInt, writeUnsignedInt_fn, _writeString, writeString_fn;\nvar Writer = class {\n constructor() {\n __privateAdd(this, _writeByte);\n __privateAdd(this, _writeFloat32);\n __privateAdd(this, _writeFloat64);\n __privateAdd(this, _writeUnsignedInt);\n __privateAdd(this, _writeString);\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n this.offsets = /* @__PURE__ */ new WeakMap();\n this.dataOffsets = /* @__PURE__ */ new WeakMap();\n }\n seek(newPos) {\n this.pos = newPos;\n }\n writeEBMLVarInt(value, width = measureEBMLVarInt(value)) {\n let pos = 0;\n switch (width) {\n case 1:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 7 | value);\n break;\n case 2:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 6 | value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 3:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 5 | value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 4:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 4 | value >> 24);\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 5:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 3 | value / 2 ** 32 & 7);\n __privateGet(this, _helperView).setUint8(pos++, value >> 24);\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 6:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 2 | value / 2 ** 40 & 3);\n __privateGet(this, _helperView).setUint8(pos++, value / 2 ** 32 | 0);\n __privateGet(this, _helperView).setUint8(pos++, value >> 24);\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n default:\n throw new Error(\"Bad EBML VINT size \" + width);\n }\n this.write(__privateGet(this, _helper).subarray(0, pos));\n }\n writeEBML(data) {\n if (data === null)\n return;\n if (data instanceof Uint8Array) {\n this.write(data);\n } else if (Array.isArray(data)) {\n for (let elem of data) {\n this.writeEBML(elem);\n }\n } else {\n this.offsets.set(data, this.pos);\n __privateMethod(this, _writeUnsignedInt, writeUnsignedInt_fn).call(this, data.id);\n if (Array.isArray(data.data)) {\n let sizePos = this.pos;\n let sizeSize = data.size === -1 ? 1 : data.size ?? 4;\n if (data.size === -1) {\n __privateMethod(this, _writeByte, writeByte_fn).call(this, 255);\n } else {\n this.seek(this.pos + sizeSize);\n }\n let startPos = this.pos;\n this.dataOffsets.set(data, startPos);\n this.writeEBML(data.data);\n if (data.size !== -1) {\n let size = this.pos - startPos;\n let endPos = this.pos;\n this.seek(sizePos);\n this.writeEBMLVarInt(size, sizeSize);\n this.seek(endPos);\n }\n } else if (typeof data.data === \"number\") {\n let size = data.size ?? measureUnsignedInt(data.data);\n this.writeEBMLVarInt(size);\n __privateMethod(this, _writeUnsignedInt, writeUnsignedInt_fn).call(this, data.data, size);\n } else if (typeof data.data === \"string\") {\n this.writeEBMLVarInt(data.data.length);\n __privateMethod(this, _writeString, writeString_fn).call(this, data.data);\n } else if (data.data instanceof Uint8Array) {\n this.writeEBMLVarInt(data.data.byteLength, data.size);\n this.write(data.data);\n } else if (data.data instanceof EBMLFloat32) {\n this.writeEBMLVarInt(4);\n __privateMethod(this, _writeFloat32, writeFloat32_fn).call(this, data.data.value);\n } else if (data.data instanceof EBMLFloat64) {\n this.writeEBMLVarInt(8);\n __privateMethod(this, _writeFloat64, writeFloat64_fn).call(this, data.data.value);\n }\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\n_writeByte = new WeakSet();\nwriteByte_fn = function(value) {\n __privateGet(this, _helperView).setUint8(0, value);\n this.write(__privateGet(this, _helper).subarray(0, 1));\n};\n_writeFloat32 = new WeakSet();\nwriteFloat32_fn = function(value) {\n __privateGet(this, _helperView).setFloat32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n};\n_writeFloat64 = new WeakSet();\nwriteFloat64_fn = function(value) {\n __privateGet(this, _helperView).setFloat64(0, value, false);\n this.write(__privateGet(this, _helper));\n};\n_writeUnsignedInt = new WeakSet();\nwriteUnsignedInt_fn = function(value, width = measureUnsignedInt(value)) {\n let pos = 0;\n switch (width) {\n case 6:\n __privateGet(this, _helperView).setUint8(pos++, value / 2 ** 40 | 0);\n case 5:\n __privateGet(this, _helperView).setUint8(pos++, value / 2 ** 32 | 0);\n case 4:\n __privateGet(this, _helperView).setUint8(pos++, value >> 24);\n case 3:\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n case 2:\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n case 1:\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n default:\n throw new Error(\"Bad UINT size \" + width);\n }\n this.write(__privateGet(this, _helper).subarray(0, pos));\n};\n_writeString = new WeakSet();\nwriteString_fn = function(str) {\n this.write(new Uint8Array(str.split(\"\").map((x) => x.charCodeAt(0))));\n};\nvar _target, _buffer, _bytes, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, this.pos);\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar _trackingWrites, _trackedWrites, _trackedStart, _trackedEnd;\nvar BaseStreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n this.target = target;\n __privateAdd(this, _trackingWrites, false);\n __privateAdd(this, _trackedWrites, void 0);\n __privateAdd(this, _trackedStart, void 0);\n __privateAdd(this, _trackedEnd, void 0);\n }\n write(data) {\n if (!__privateGet(this, _trackingWrites))\n return;\n let pos = this.pos;\n if (pos < __privateGet(this, _trackedStart)) {\n if (pos + data.byteLength <= __privateGet(this, _trackedStart))\n return;\n data = data.subarray(__privateGet(this, _trackedStart) - pos);\n pos = 0;\n }\n let neededSize = pos + data.byteLength - __privateGet(this, _trackedStart);\n let newLength = __privateGet(this, _trackedWrites).byteLength;\n while (newLength < neededSize)\n newLength *= 2;\n if (newLength !== __privateGet(this, _trackedWrites).byteLength) {\n let copy = new Uint8Array(newLength);\n copy.set(__privateGet(this, _trackedWrites), 0);\n __privateSet(this, _trackedWrites, copy);\n }\n __privateGet(this, _trackedWrites).set(data, pos - __privateGet(this, _trackedStart));\n __privateSet(this, _trackedEnd, Math.max(__privateGet(this, _trackedEnd), pos + data.byteLength));\n }\n startTrackingWrites() {\n __privateSet(this, _trackingWrites, true);\n __privateSet(this, _trackedWrites, new Uint8Array(2 ** 10));\n __privateSet(this, _trackedStart, this.pos);\n __privateSet(this, _trackedEnd, this.pos);\n }\n getTrackedWrites() {\n if (!__privateGet(this, _trackingWrites)) {\n throw new Error(\"Can't get tracked writes since nothing was tracked.\");\n }\n let slice = __privateGet(this, _trackedWrites).subarray(0, __privateGet(this, _trackedEnd) - __privateGet(this, _trackedStart));\n let result = {\n data: slice,\n start: __privateGet(this, _trackedStart),\n end: __privateGet(this, _trackedEnd)\n };\n __privateSet(this, _trackedWrites, void 0);\n __privateSet(this, _trackingWrites, false);\n return result;\n }\n};\n_trackingWrites = new WeakMap();\n_trackedWrites = new WeakMap();\n_trackedStart = new WeakMap();\n_trackedEnd = new WeakMap();\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _sections, _lastFlushEnd, _ensureMonotonicity, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends BaseStreamTargetWriter {\n constructor(target, ensureMonotonicity) {\n super(target);\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _lastFlushEnd, 0);\n __privateAdd(this, _ensureMonotonicity, void 0);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n __privateAdd(this, _chunks, []);\n __privateSet(this, _ensureMonotonicity, ensureMonotonicity);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n super.write(data);\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n if (__privateGet(this, _ensureMonotonicity) && chunk.start < __privateGet(this, _lastFlushEnd)) {\n throw new Error(\"Internal error: Monotonicity violation.\");\n }\n this.target.options.onData?.(chunk.data, chunk.start);\n __privateSet(this, _lastFlushEnd, chunk.start + chunk.data.byteLength);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_sections = new WeakMap();\n_lastFlushEnd = new WeakMap();\n_ensureMonotonicity = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n if (__privateGet(this, _ensureMonotonicity) && chunk.start + section.start < __privateGet(this, _lastFlushEnd)) {\n throw new Error(\"Internal error: Monotonicity violation.\");\n }\n this.target.options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n __privateSet(this, _lastFlushEnd, chunk.start + section.end);\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target, ensureMonotonicity) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }), ensureMonotonicity);\n }\n};\n\n// src/muxer.ts\nvar VIDEO_TRACK_NUMBER = 1;\nvar AUDIO_TRACK_NUMBER = 2;\nvar SUBTITLE_TRACK_NUMBER = 3;\nvar VIDEO_TRACK_TYPE = 1;\nvar AUDIO_TRACK_TYPE = 2;\nvar SUBTITLE_TRACK_TYPE = 17;\nvar MAX_CHUNK_LENGTH_MS = 2 ** 15;\nvar CODEC_PRIVATE_MAX_SIZE = 2 ** 13;\nvar APP_NAME = \"https://github.com/Vanilagy/webm-muxer\";\nvar SEGMENT_SIZE_BYTES = 6;\nvar CLUSTER_SIZE_BYTES = 5;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"permissive\"];\nvar _options, _writer, _segment, _segmentInfo, _seekHead, _tracksElement, _segmentDuration, _colourElement, _videoCodecPrivate, _audioCodecPrivate, _subtitleCodecPrivate, _cues, _currentCluster, _currentClusterTimestamp, _duration, _videoChunkQueue, _audioChunkQueue, _subtitleChunkQueue, _firstVideoTimestamp, _firstAudioTimestamp, _lastVideoTimestamp, _lastAudioTimestamp, _lastSubtitleTimestamp, _colorSpace, _finalized, _validateOptions, validateOptions_fn, _createFileHeader, createFileHeader_fn, _writeEBMLHeader, writeEBMLHeader_fn, _createCodecPrivatePlaceholders, createCodecPrivatePlaceholders_fn, _createColourElement, createColourElement_fn, _createSeekHead, createSeekHead_fn, _createSegmentInfo, createSegmentInfo_fn, _createTracks, createTracks_fn, _createSegment, createSegment_fn, _createCues, createCues_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _segmentDataOffset, segmentDataOffset_get, _writeVideoDecoderConfig, writeVideoDecoderConfig_fn, _fixVP9ColorSpace, fixVP9ColorSpace_fn, _writeSubtitleChunks, writeSubtitleChunks_fn, _createInternalChunk, createInternalChunk_fn, _validateTimestamp, validateTimestamp_fn, _writeBlock, writeBlock_fn, _createCodecPrivateElement, createCodecPrivateElement_fn, _writeCodecPrivate, writeCodecPrivate_fn, _createNewCluster, createNewCluster_fn, _finalizeCurrentCluster, finalizeCurrentCluster_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _createFileHeader);\n __privateAdd(this, _writeEBMLHeader);\n __privateAdd(this, _createCodecPrivatePlaceholders);\n __privateAdd(this, _createColourElement);\n __privateAdd(this, _createSeekHead);\n __privateAdd(this, _createSegmentInfo);\n __privateAdd(this, _createTracks);\n __privateAdd(this, _createSegment);\n __privateAdd(this, _createCues);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _segmentDataOffset);\n __privateAdd(this, _writeVideoDecoderConfig);\n __privateAdd(this, _fixVP9ColorSpace);\n __privateAdd(this, _writeSubtitleChunks);\n __privateAdd(this, _createInternalChunk);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _writeBlock);\n __privateAdd(this, _createCodecPrivateElement);\n __privateAdd(this, _writeCodecPrivate);\n __privateAdd(this, _createNewCluster);\n __privateAdd(this, _finalizeCurrentCluster);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _segment, void 0);\n __privateAdd(this, _segmentInfo, void 0);\n __privateAdd(this, _seekHead, void 0);\n __privateAdd(this, _tracksElement, void 0);\n __privateAdd(this, _segmentDuration, void 0);\n __privateAdd(this, _colourElement, void 0);\n __privateAdd(this, _videoCodecPrivate, void 0);\n __privateAdd(this, _audioCodecPrivate, void 0);\n __privateAdd(this, _subtitleCodecPrivate, void 0);\n __privateAdd(this, _cues, void 0);\n __privateAdd(this, _currentCluster, void 0);\n __privateAdd(this, _currentClusterTimestamp, void 0);\n __privateAdd(this, _duration, 0);\n __privateAdd(this, _videoChunkQueue, []);\n __privateAdd(this, _audioChunkQueue, []);\n __privateAdd(this, _subtitleChunkQueue, []);\n __privateAdd(this, _firstVideoTimestamp, void 0);\n __privateAdd(this, _firstAudioTimestamp, void 0);\n __privateAdd(this, _lastVideoTimestamp, -1);\n __privateAdd(this, _lastAudioTimestamp, -1);\n __privateAdd(this, _lastSubtitleTimestamp, -1);\n __privateAdd(this, _colorSpace, void 0);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n __privateSet(this, _options, {\n type: \"webm\",\n firstTimestampBehavior: \"strict\",\n ...options\n });\n this.target = options.target;\n let ensureMonotonicity = !!__privateGet(this, _options).streaming;\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target, ensureMonotonicity));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target, ensureMonotonicity));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _createFileHeader, createFileHeader_fn).call(this);\n }\n addVideoChunk(chunk, meta, timestamp) {\n if (!(chunk instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (chunk) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n this.addVideoChunkRaw(data, chunk.type, timestamp ?? chunk.timestamp, meta);\n }\n addVideoChunkRaw(data, type, timestamp, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (__privateGet(this, _firstVideoTimestamp) === void 0)\n __privateSet(this, _firstVideoTimestamp, timestamp);\n if (meta)\n __privateMethod(this, _writeVideoDecoderConfig, writeVideoDecoderConfig_fn).call(this, meta);\n let videoChunk = __privateMethod(this, _createInternalChunk, createInternalChunk_fn).call(this, data, type, timestamp, VIDEO_TRACK_NUMBER);\n if (__privateGet(this, _options).video.codec === \"V_VP9\")\n __privateMethod(this, _fixVP9ColorSpace, fixVP9ColorSpace_fn).call(this, videoChunk);\n __privateSet(this, _lastVideoTimestamp, videoChunk.timestamp);\n while (__privateGet(this, _audioChunkQueue).length > 0 && __privateGet(this, _audioChunkQueue)[0].timestamp <= videoChunk.timestamp) {\n let audioChunk = __privateGet(this, _audioChunkQueue).shift();\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, audioChunk, false);\n }\n if (!__privateGet(this, _options).audio || videoChunk.timestamp <= __privateGet(this, _lastAudioTimestamp)) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, videoChunk, true);\n } else {\n __privateGet(this, _videoChunkQueue).push(videoChunk);\n }\n __privateMethod(this, _writeSubtitleChunks, writeSubtitleChunks_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n addAudioChunk(chunk, meta, timestamp) {\n if (!(chunk instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (chunk) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n this.addAudioChunkRaw(data, chunk.type, timestamp ?? chunk.timestamp, meta);\n }\n addAudioChunkRaw(data, type, timestamp, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (__privateGet(this, _firstAudioTimestamp) === void 0)\n __privateSet(this, _firstAudioTimestamp, timestamp);\n if (meta?.decoderConfig) {\n if (__privateGet(this, _options).streaming) {\n __privateSet(this, _audioCodecPrivate, __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, meta.decoderConfig.description));\n } else {\n __privateMethod(this, _writeCodecPrivate, writeCodecPrivate_fn).call(this, __privateGet(this, _audioCodecPrivate), meta.decoderConfig.description);\n }\n }\n let audioChunk = __privateMethod(this, _createInternalChunk, createInternalChunk_fn).call(this, data, type, timestamp, AUDIO_TRACK_NUMBER);\n __privateSet(this, _lastAudioTimestamp, audioChunk.timestamp);\n while (__privateGet(this, _videoChunkQueue).length > 0 && __privateGet(this, _videoChunkQueue)[0].timestamp <= audioChunk.timestamp) {\n let videoChunk = __privateGet(this, _videoChunkQueue).shift();\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, videoChunk, true);\n }\n if (!__privateGet(this, _options).video || audioChunk.timestamp <= __privateGet(this, _lastVideoTimestamp)) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, audioChunk, !__privateGet(this, _options).video);\n } else {\n __privateGet(this, _audioChunkQueue).push(audioChunk);\n }\n __privateMethod(this, _writeSubtitleChunks, writeSubtitleChunks_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n addSubtitleChunk(chunk, meta, timestamp) {\n if (typeof chunk !== \"object\" || !chunk) {\n throw new TypeError(\"addSubtitleChunk's first argument (chunk) must be an object.\");\n } else {\n if (!(chunk.body instanceof Uint8Array)) {\n throw new TypeError(\"body must be an instance of Uint8Array.\");\n }\n if (!Number.isFinite(chunk.timestamp) || chunk.timestamp < 0) {\n throw new TypeError(\"timestamp must be a non-negative real number.\");\n }\n if (!Number.isFinite(chunk.duration) || chunk.duration < 0) {\n throw new TypeError(\"duration must be a non-negative real number.\");\n }\n if (chunk.additions && !(chunk.additions instanceof Uint8Array)) {\n throw new TypeError(\"additions, when present, must be an instance of Uint8Array.\");\n }\n }\n if (typeof meta !== \"object\") {\n throw new TypeError(\"addSubtitleChunk's second argument (meta) must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).subtitles)\n throw new Error(\"No subtitle track declared.\");\n if (meta?.decoderConfig) {\n if (__privateGet(this, _options).streaming) {\n __privateSet(this, _subtitleCodecPrivate, __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, meta.decoderConfig.description));\n } else {\n __privateMethod(this, _writeCodecPrivate, writeCodecPrivate_fn).call(this, __privateGet(this, _subtitleCodecPrivate), meta.decoderConfig.description);\n }\n }\n let subtitleChunk = __privateMethod(this, _createInternalChunk, createInternalChunk_fn).call(this, chunk.body, \"key\", timestamp ?? chunk.timestamp, SUBTITLE_TRACK_NUMBER, chunk.duration, chunk.additions);\n __privateSet(this, _lastSubtitleTimestamp, subtitleChunk.timestamp);\n __privateGet(this, _subtitleChunkQueue).push(subtitleChunk);\n __privateMethod(this, _writeSubtitleChunks, writeSubtitleChunks_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n while (__privateGet(this, _videoChunkQueue).length > 0)\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, __privateGet(this, _videoChunkQueue).shift(), true);\n while (__privateGet(this, _audioChunkQueue).length > 0)\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, __privateGet(this, _audioChunkQueue).shift(), true);\n while (__privateGet(this, _subtitleChunkQueue).length > 0 && __privateGet(this, _subtitleChunkQueue)[0].timestamp <= __privateGet(this, _duration)) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, __privateGet(this, _subtitleChunkQueue).shift(), false);\n }\n if (__privateGet(this, _currentCluster)) {\n __privateMethod(this, _finalizeCurrentCluster, finalizeCurrentCluster_fn).call(this);\n }\n __privateGet(this, _writer).writeEBML(__privateGet(this, _cues));\n if (!__privateGet(this, _options).streaming) {\n let endPos = __privateGet(this, _writer).pos;\n let segmentSize = __privateGet(this, _writer).pos - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _segment)) + 4);\n __privateGet(this, _writer).writeEBMLVarInt(segmentSize, SEGMENT_SIZE_BYTES);\n __privateGet(this, _segmentDuration).data = new EBMLFloat64(__privateGet(this, _duration));\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _segmentDuration)));\n __privateGet(this, _writer).writeEBML(__privateGet(this, _segmentDuration));\n __privateGet(this, _seekHead).data[0].data[1].data = __privateGet(this, _writer).offsets.get(__privateGet(this, _cues)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _seekHead).data[1].data[1].data = __privateGet(this, _writer).offsets.get(__privateGet(this, _segmentInfo)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _seekHead).data[2].data[1].data = __privateGet(this, _writer).offsets.get(__privateGet(this, _tracksElement)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _seekHead)));\n __privateGet(this, _writer).writeEBML(__privateGet(this, _seekHead));\n __privateGet(this, _writer).seek(endPos);\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_segment = new WeakMap();\n_segmentInfo = new WeakMap();\n_seekHead = new WeakMap();\n_tracksElement = new WeakMap();\n_segmentDuration = new WeakMap();\n_colourElement = new WeakMap();\n_videoCodecPrivate = new WeakMap();\n_audioCodecPrivate = new WeakMap();\n_subtitleCodecPrivate = new WeakMap();\n_cues = new WeakMap();\n_currentCluster = new WeakMap();\n_currentClusterTimestamp = new WeakMap();\n_duration = new WeakMap();\n_videoChunkQueue = new WeakMap();\n_audioChunkQueue = new WeakMap();\n_subtitleChunkQueue = new WeakMap();\n_firstVideoTimestamp = new WeakMap();\n_firstAudioTimestamp = new WeakMap();\n_lastVideoTimestamp = new WeakMap();\n_lastAudioTimestamp = new WeakMap();\n_lastSubtitleTimestamp = new WeakMap();\n_colorSpace = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (typeof options.video.codec !== \"string\") {\n throw new TypeError(`Invalid video codec: ${options.video.codec}. Must be a string.`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n if (options.video.frameRate !== void 0) {\n if (!Number.isFinite(options.video.frameRate) || options.video.frameRate <= 0) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive number.`\n );\n }\n }\n if (options.video.alpha !== void 0 && typeof options.video.alpha !== \"boolean\") {\n throw new TypeError(`Invalid video alpha: ${options.video.alpha}. Must be a boolean.`);\n }\n }\n if (options.audio) {\n if (typeof options.audio.codec !== \"string\") {\n throw new TypeError(`Invalid audio codec: ${options.audio.codec}. Must be a string.`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n if (options.audio.bitDepth !== void 0) {\n if (!Number.isInteger(options.audio.bitDepth) || options.audio.bitDepth <= 0) {\n throw new TypeError(\n `Invalid audio bit depth: ${options.audio.bitDepth}. Must be a positive integer.`\n );\n }\n }\n }\n if (options.subtitles) {\n if (typeof options.subtitles.codec !== \"string\") {\n throw new TypeError(`Invalid subtitles codec: ${options.subtitles.codec}. Must be a string.`);\n }\n }\n if (options.type !== void 0 && ![\"webm\", \"matroska\"].includes(options.type)) {\n throw new TypeError(`Invalid type: ${options.type}. Must be 'webm' or 'matroska'.`);\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (options.streaming !== void 0 && typeof options.streaming !== \"boolean\") {\n throw new TypeError(`Invalid streaming option: ${options.streaming}. Must be a boolean.`);\n }\n};\n_createFileHeader = new WeakSet();\ncreateFileHeader_fn = function() {\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onHeader) {\n __privateGet(this, _writer).startTrackingWrites();\n }\n __privateMethod(this, _writeEBMLHeader, writeEBMLHeader_fn).call(this);\n if (!__privateGet(this, _options).streaming) {\n __privateMethod(this, _createSeekHead, createSeekHead_fn).call(this);\n }\n __privateMethod(this, _createSegmentInfo, createSegmentInfo_fn).call(this);\n __privateMethod(this, _createCodecPrivatePlaceholders, createCodecPrivatePlaceholders_fn).call(this);\n __privateMethod(this, _createColourElement, createColourElement_fn).call(this);\n if (!__privateGet(this, _options).streaming) {\n __privateMethod(this, _createTracks, createTracks_fn).call(this);\n __privateMethod(this, _createSegment, createSegment_fn).call(this);\n } else {\n }\n __privateMethod(this, _createCues, createCues_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_writeEBMLHeader = new WeakSet();\nwriteEBMLHeader_fn = function() {\n let ebmlHeader = { id: 440786851 /* EBML */, data: [\n { id: 17030 /* EBMLVersion */, data: 1 },\n { id: 17143 /* EBMLReadVersion */, data: 1 },\n { id: 17138 /* EBMLMaxIDLength */, data: 4 },\n { id: 17139 /* EBMLMaxSizeLength */, data: 8 },\n { id: 17026 /* DocType */, data: __privateGet(this, _options).type ?? \"webm\" },\n { id: 17031 /* DocTypeVersion */, data: 2 },\n { id: 17029 /* DocTypeReadVersion */, data: 2 }\n ] };\n __privateGet(this, _writer).writeEBML(ebmlHeader);\n};\n_createCodecPrivatePlaceholders = new WeakSet();\ncreateCodecPrivatePlaceholders_fn = function() {\n __privateSet(this, _videoCodecPrivate, { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n __privateSet(this, _audioCodecPrivate, { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n __privateSet(this, _subtitleCodecPrivate, { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n};\n_createColourElement = new WeakSet();\ncreateColourElement_fn = function() {\n __privateSet(this, _colourElement, { id: 21936 /* Colour */, data: [\n { id: 21937 /* MatrixCoefficients */, data: 2 },\n { id: 21946 /* TransferCharacteristics */, data: 2 },\n { id: 21947 /* Primaries */, data: 2 },\n { id: 21945 /* Range */, data: 0 }\n ] });\n};\n_createSeekHead = new WeakSet();\ncreateSeekHead_fn = function() {\n const kaxCues = new Uint8Array([28, 83, 187, 107]);\n const kaxInfo = new Uint8Array([21, 73, 169, 102]);\n const kaxTracks = new Uint8Array([22, 84, 174, 107]);\n let seekHead = { id: 290298740 /* SeekHead */, data: [\n { id: 19899 /* Seek */, data: [\n { id: 21419 /* SeekID */, data: kaxCues },\n { id: 21420 /* SeekPosition */, size: 5, data: 0 }\n ] },\n { id: 19899 /* Seek */, data: [\n { id: 21419 /* SeekID */, data: kaxInfo },\n { id: 21420 /* SeekPosition */, size: 5, data: 0 }\n ] },\n { id: 19899 /* Seek */, data: [\n { id: 21419 /* SeekID */, data: kaxTracks },\n { id: 21420 /* SeekPosition */, size: 5, data: 0 }\n ] }\n ] };\n __privateSet(this, _seekHead, seekHead);\n};\n_createSegmentInfo = new WeakSet();\ncreateSegmentInfo_fn = function() {\n let segmentDuration = { id: 17545 /* Duration */, data: new EBMLFloat64(0) };\n __privateSet(this, _segmentDuration, segmentDuration);\n let segmentInfo = { id: 357149030 /* Info */, data: [\n { id: 2807729 /* TimestampScale */, data: 1e6 },\n { id: 19840 /* MuxingApp */, data: APP_NAME },\n { id: 22337 /* WritingApp */, data: APP_NAME },\n !__privateGet(this, _options).streaming ? segmentDuration : null\n ] };\n __privateSet(this, _segmentInfo, segmentInfo);\n};\n_createTracks = new WeakSet();\ncreateTracks_fn = function() {\n let tracksElement = { id: 374648427 /* Tracks */, data: [] };\n __privateSet(this, _tracksElement, tracksElement);\n if (__privateGet(this, _options).video) {\n tracksElement.data.push({ id: 174 /* TrackEntry */, data: [\n { id: 215 /* TrackNumber */, data: VIDEO_TRACK_NUMBER },\n { id: 29637 /* TrackUID */, data: VIDEO_TRACK_NUMBER },\n { id: 131 /* TrackType */, data: VIDEO_TRACK_TYPE },\n { id: 134 /* CodecID */, data: __privateGet(this, _options).video.codec },\n __privateGet(this, _videoCodecPrivate),\n __privateGet(this, _options).video.frameRate ? { id: 2352003 /* DefaultDuration */, data: 1e9 / __privateGet(this, _options).video.frameRate } : null,\n { id: 224 /* Video */, data: [\n { id: 176 /* PixelWidth */, data: __privateGet(this, _options).video.width },\n { id: 186 /* PixelHeight */, data: __privateGet(this, _options).video.height },\n __privateGet(this, _options).video.alpha ? { id: 21440 /* AlphaMode */, data: 1 } : null,\n __privateGet(this, _colourElement)\n ] }\n ] });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioCodecPrivate, __privateGet(this, _options).streaming ? __privateGet(this, _audioCodecPrivate) || null : { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n tracksElement.data.push({ id: 174 /* TrackEntry */, data: [\n { id: 215 /* TrackNumber */, data: AUDIO_TRACK_NUMBER },\n { id: 29637 /* TrackUID */, data: AUDIO_TRACK_NUMBER },\n { id: 131 /* TrackType */, data: AUDIO_TRACK_TYPE },\n { id: 134 /* CodecID */, data: __privateGet(this, _options).audio.codec },\n __privateGet(this, _audioCodecPrivate),\n { id: 225 /* Audio */, data: [\n { id: 181 /* SamplingFrequency */, data: new EBMLFloat32(__privateGet(this, _options).audio.sampleRate) },\n { id: 159 /* Channels */, data: __privateGet(this, _options).audio.numberOfChannels },\n __privateGet(this, _options).audio.bitDepth ? { id: 25188 /* BitDepth */, data: __privateGet(this, _options).audio.bitDepth } : null\n ] }\n ] });\n }\n if (__privateGet(this, _options).subtitles) {\n tracksElement.data.push({ id: 174 /* TrackEntry */, data: [\n { id: 215 /* TrackNumber */, data: SUBTITLE_TRACK_NUMBER },\n { id: 29637 /* TrackUID */, data: SUBTITLE_TRACK_NUMBER },\n { id: 131 /* TrackType */, data: SUBTITLE_TRACK_TYPE },\n { id: 134 /* CodecID */, data: __privateGet(this, _options).subtitles.codec },\n __privateGet(this, _subtitleCodecPrivate)\n ] });\n }\n};\n_createSegment = new WeakSet();\ncreateSegment_fn = function() {\n let segment = {\n id: 408125543 /* Segment */,\n size: __privateGet(this, _options).streaming ? -1 : SEGMENT_SIZE_BYTES,\n data: [\n !__privateGet(this, _options).streaming ? __privateGet(this, _seekHead) : null,\n __privateGet(this, _segmentInfo),\n __privateGet(this, _tracksElement)\n ]\n };\n __privateSet(this, _segment, segment);\n __privateGet(this, _writer).writeEBML(segment);\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onHeader) {\n let { data, start } = __privateGet(this, _writer).getTrackedWrites();\n __privateGet(this, _writer).target.options.onHeader(data, start);\n }\n};\n_createCues = new WeakSet();\ncreateCues_fn = function() {\n __privateSet(this, _cues, { id: 475249515 /* Cues */, data: [] });\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_segmentDataOffset = new WeakSet();\nsegmentDataOffset_get = function() {\n return __privateGet(this, _writer).dataOffsets.get(__privateGet(this, _segment));\n};\n_writeVideoDecoderConfig = new WeakSet();\nwriteVideoDecoderConfig_fn = function(meta) {\n if (!meta.decoderConfig)\n return;\n if (meta.decoderConfig.colorSpace) {\n let colorSpace = meta.decoderConfig.colorSpace;\n __privateSet(this, _colorSpace, colorSpace);\n __privateGet(this, _colourElement).data = [\n { id: 21937 /* MatrixCoefficients */, data: {\n \"rgb\": 1,\n \"bt709\": 1,\n \"bt470bg\": 5,\n \"smpte170m\": 6\n }[colorSpace.matrix] },\n { id: 21946 /* TransferCharacteristics */, data: {\n \"bt709\": 1,\n \"smpte170m\": 6,\n \"iec61966-2-1\": 13\n }[colorSpace.transfer] },\n { id: 21947 /* Primaries */, data: {\n \"bt709\": 1,\n \"bt470bg\": 5,\n \"smpte170m\": 6\n }[colorSpace.primaries] },\n { id: 21945 /* Range */, data: [1, 2][Number(colorSpace.fullRange)] }\n ];\n if (!__privateGet(this, _options).streaming) {\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _colourElement)));\n __privateGet(this, _writer).writeEBML(__privateGet(this, _colourElement));\n __privateGet(this, _writer).seek(endPos);\n }\n }\n if (meta.decoderConfig.description) {\n if (__privateGet(this, _options).streaming) {\n __privateSet(this, _videoCodecPrivate, __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, meta.decoderConfig.description));\n } else {\n __privateMethod(this, _writeCodecPrivate, writeCodecPrivate_fn).call(this, __privateGet(this, _videoCodecPrivate), meta.decoderConfig.description);\n }\n }\n};\n_fixVP9ColorSpace = new WeakSet();\nfixVP9ColorSpace_fn = function(chunk) {\n if (chunk.type !== \"key\")\n return;\n if (!__privateGet(this, _colorSpace))\n return;\n let i = 0;\n if (readBits(chunk.data, 0, 2) !== 2)\n return;\n i += 2;\n let profile = (readBits(chunk.data, i + 1, i + 2) << 1) + readBits(chunk.data, i + 0, i + 1);\n i += 2;\n if (profile === 3)\n i++;\n let showExistingFrame = readBits(chunk.data, i + 0, i + 1);\n i++;\n if (showExistingFrame)\n return;\n let frameType = readBits(chunk.data, i + 0, i + 1);\n i++;\n if (frameType !== 0)\n return;\n i += 2;\n let syncCode = readBits(chunk.data, i + 0, i + 24);\n i += 24;\n if (syncCode !== 4817730)\n return;\n if (profile >= 2)\n i++;\n let colorSpaceID = {\n \"rgb\": 7,\n \"bt709\": 2,\n \"bt470bg\": 1,\n \"smpte170m\": 3\n }[__privateGet(this, _colorSpace).matrix];\n writeBits(chunk.data, i + 0, i + 3, colorSpaceID);\n};\n_writeSubtitleChunks = new WeakSet();\nwriteSubtitleChunks_fn = function() {\n let lastWrittenMediaTimestamp = Math.min(\n __privateGet(this, _options).video ? __privateGet(this, _lastVideoTimestamp) : Infinity,\n __privateGet(this, _options).audio ? __privateGet(this, _lastAudioTimestamp) : Infinity\n );\n let queue = __privateGet(this, _subtitleChunkQueue);\n while (queue.length > 0 && queue[0].timestamp <= lastWrittenMediaTimestamp) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, queue.shift(), !__privateGet(this, _options).video && !__privateGet(this, _options).audio);\n }\n};\n_createInternalChunk = new WeakSet();\ncreateInternalChunk_fn = function(data, type, timestamp, trackNumber, duration, additions) {\n let adjustedTimestamp = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, timestamp, trackNumber);\n let internalChunk = {\n data,\n additions,\n type,\n timestamp: adjustedTimestamp,\n duration,\n trackNumber\n };\n return internalChunk;\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(timestamp, trackNumber) {\n let lastTimestamp = trackNumber === VIDEO_TRACK_NUMBER ? __privateGet(this, _lastVideoTimestamp) : trackNumber === AUDIO_TRACK_NUMBER ? __privateGet(this, _lastAudioTimestamp) : __privateGet(this, _lastSubtitleTimestamp);\n if (trackNumber !== SUBTITLE_TRACK_NUMBER) {\n let firstTimestamp = trackNumber === VIDEO_TRACK_NUMBER ? __privateGet(this, _firstVideoTimestamp) : __privateGet(this, _firstAudioTimestamp);\n if (__privateGet(this, _options).firstTimestampBehavior === \"strict\" && lastTimestamp === -1 && timestamp !== 0) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received ${timestamp}). Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of the document, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\nIf you want to allow non-zero first timestamps, set firstTimestampBehavior: 'permissive'.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n timestamp -= firstTimestamp;\n }\n }\n if (timestamp < lastTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (went from ${lastTimestamp} to ${timestamp}).`\n );\n }\n if (timestamp < 0) {\n throw new Error(`Timestamps must be non-negative (received ${timestamp}).`);\n }\n return timestamp;\n};\n_writeBlock = new WeakSet();\nwriteBlock_fn = function(chunk, canCreateNewCluster) {\n if (__privateGet(this, _options).streaming && !__privateGet(this, _tracksElement)) {\n __privateMethod(this, _createTracks, createTracks_fn).call(this);\n __privateMethod(this, _createSegment, createSegment_fn).call(this);\n }\n let msTimestamp = Math.floor(chunk.timestamp / 1e3);\n let relativeTimestamp = msTimestamp - __privateGet(this, _currentClusterTimestamp);\n let shouldCreateNewClusterFromKeyFrame = canCreateNewCluster && chunk.type === \"key\" && relativeTimestamp >= 1e3;\n let clusterWouldBeTooLong = relativeTimestamp >= MAX_CHUNK_LENGTH_MS;\n if (!__privateGet(this, _currentCluster) || shouldCreateNewClusterFromKeyFrame || clusterWouldBeTooLong) {\n __privateMethod(this, _createNewCluster, createNewCluster_fn).call(this, msTimestamp);\n relativeTimestamp = 0;\n }\n if (relativeTimestamp < 0) {\n return;\n }\n let prelude = new Uint8Array(4);\n let view = new DataView(prelude.buffer);\n view.setUint8(0, 128 | chunk.trackNumber);\n view.setInt16(1, relativeTimestamp, false);\n if (chunk.duration === void 0 && !chunk.additions) {\n view.setUint8(3, Number(chunk.type === \"key\") << 7);\n let simpleBlock = { id: 163 /* SimpleBlock */, data: [\n prelude,\n chunk.data\n ] };\n __privateGet(this, _writer).writeEBML(simpleBlock);\n } else {\n let msDuration = Math.floor(chunk.duration / 1e3);\n let blockGroup = { id: 160 /* BlockGroup */, data: [\n { id: 161 /* Block */, data: [\n prelude,\n chunk.data\n ] },\n chunk.duration !== void 0 ? { id: 155 /* BlockDuration */, data: msDuration } : null,\n chunk.additions ? { id: 30113 /* BlockAdditions */, data: chunk.additions } : null\n ] };\n __privateGet(this, _writer).writeEBML(blockGroup);\n }\n __privateSet(this, _duration, Math.max(__privateGet(this, _duration), msTimestamp));\n};\n_createCodecPrivateElement = new WeakSet();\ncreateCodecPrivateElement_fn = function(data) {\n return { id: 25506 /* CodecPrivate */, size: 4, data: new Uint8Array(data) };\n};\n_writeCodecPrivate = new WeakSet();\nwriteCodecPrivate_fn = function(element, data) {\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(element));\n let codecPrivateElementSize = 2 + 4 + data.byteLength;\n let voidDataSize = CODEC_PRIVATE_MAX_SIZE - codecPrivateElementSize;\n if (voidDataSize < 0) {\n let newByteLength = data.byteLength + voidDataSize;\n if (data instanceof ArrayBuffer) {\n data = data.slice(0, newByteLength);\n } else {\n data = data.buffer.slice(0, newByteLength);\n }\n voidDataSize = 0;\n }\n element = [\n __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, data),\n { id: 236 /* Void */, size: 4, data: new Uint8Array(voidDataSize) }\n ];\n __privateGet(this, _writer).writeEBML(element);\n __privateGet(this, _writer).seek(endPos);\n};\n_createNewCluster = new WeakSet();\ncreateNewCluster_fn = function(timestamp) {\n if (__privateGet(this, _currentCluster)) {\n __privateMethod(this, _finalizeCurrentCluster, finalizeCurrentCluster_fn).call(this);\n }\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onCluster) {\n __privateGet(this, _writer).startTrackingWrites();\n }\n __privateSet(this, _currentCluster, {\n id: 524531317 /* Cluster */,\n size: __privateGet(this, _options).streaming ? -1 : CLUSTER_SIZE_BYTES,\n data: [\n { id: 231 /* Timestamp */, data: timestamp }\n ]\n });\n __privateGet(this, _writer).writeEBML(__privateGet(this, _currentCluster));\n __privateSet(this, _currentClusterTimestamp, timestamp);\n let clusterOffsetFromSegment = __privateGet(this, _writer).offsets.get(__privateGet(this, _currentCluster)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _cues).data.push({ id: 187 /* CuePoint */, data: [\n { id: 179 /* CueTime */, data: timestamp },\n __privateGet(this, _options).video ? { id: 183 /* CueTrackPositions */, data: [\n { id: 247 /* CueTrack */, data: VIDEO_TRACK_NUMBER },\n { id: 241 /* CueClusterPosition */, data: clusterOffsetFromSegment }\n ] } : null,\n __privateGet(this, _options).audio ? { id: 183 /* CueTrackPositions */, data: [\n { id: 247 /* CueTrack */, data: AUDIO_TRACK_NUMBER },\n { id: 241 /* CueClusterPosition */, data: clusterOffsetFromSegment }\n ] } : null\n ] });\n};\n_finalizeCurrentCluster = new WeakSet();\nfinalizeCurrentCluster_fn = function() {\n if (!__privateGet(this, _options).streaming) {\n let clusterSize = __privateGet(this, _writer).pos - __privateGet(this, _writer).dataOffsets.get(__privateGet(this, _currentCluster));\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _currentCluster)) + 4);\n __privateGet(this, _writer).writeEBMLVarInt(clusterSize, CLUSTER_SIZE_BYTES);\n __privateGet(this, _writer).seek(endPos);\n }\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onCluster) {\n let { data, start } = __privateGet(this, _writer).getTrackedWrites();\n __privateGet(this, _writer).target.options.onCluster(data, start, __privateGet(this, _currentClusterTimestamp));\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\n\n// src/subtitles.ts\nvar cueBlockHeaderRegex = /(?:(.+?)\\n)?((?:\\d{2}:)?\\d{2}:\\d{2}.\\d{3})\\s+-->\\s+((?:\\d{2}:)?\\d{2}:\\d{2}.\\d{3})/g;\nvar preambleStartRegex = /^WEBVTT.*?\\n{2}/;\nvar timestampRegex = /(?:(\\d{2}):)?(\\d{2}):(\\d{2}).(\\d{3})/;\nvar inlineTimestampRegex = /<(?:(\\d{2}):)?(\\d{2}):(\\d{2}).(\\d{3})>/g;\nvar textEncoder = new TextEncoder();\nvar _options2, _config, _preambleSeen, _preambleBytes, _preambleEmitted, _parseTimestamp, parseTimestamp_fn, _formatTimestamp, formatTimestamp_fn;\nvar SubtitleEncoder = class {\n constructor(options) {\n __privateAdd(this, _parseTimestamp);\n __privateAdd(this, _formatTimestamp);\n __privateAdd(this, _options2, void 0);\n __privateAdd(this, _config, void 0);\n __privateAdd(this, _preambleSeen, false);\n __privateAdd(this, _preambleBytes, void 0);\n __privateAdd(this, _preambleEmitted, false);\n __privateSet(this, _options2, options);\n }\n configure(config) {\n if (config.codec !== \"webvtt\") {\n throw new Error(\"Codec must be 'webvtt'.\");\n }\n __privateSet(this, _config, config);\n }\n encode(text) {\n if (!__privateGet(this, _config)) {\n throw new Error(\"Encoder not configured.\");\n }\n text = text.replace(\"\\r\\n\", \"\\n\").replace(\"\\r\", \"\\n\");\n cueBlockHeaderRegex.lastIndex = 0;\n let match;\n if (!__privateGet(this, _preambleSeen)) {\n if (!preambleStartRegex.test(text)) {\n let error = new Error(\"WebVTT preamble incorrect.\");\n __privateGet(this, _options2).error(error);\n throw error;\n }\n match = cueBlockHeaderRegex.exec(text);\n let preamble = text.slice(0, match?.index ?? text.length).trimEnd();\n if (!preamble) {\n let error = new Error(\"No WebVTT preamble provided.\");\n __privateGet(this, _options2).error(error);\n throw error;\n }\n __privateSet(this, _preambleBytes, textEncoder.encode(preamble));\n __privateSet(this, _preambleSeen, true);\n if (match) {\n text = text.slice(match.index);\n cueBlockHeaderRegex.lastIndex = 0;\n }\n }\n while (match = cueBlockHeaderRegex.exec(text)) {\n let notes = text.slice(0, match.index);\n let cueIdentifier = match[1] || \"\";\n let matchEnd = match.index + match[0].length;\n let bodyStart = text.indexOf(\"\\n\", matchEnd) + 1;\n let cueSettings = text.slice(matchEnd, bodyStart).trim();\n let bodyEnd = text.indexOf(\"\\n\\n\", matchEnd);\n if (bodyEnd === -1)\n bodyEnd = text.length;\n let startTime = __privateMethod(this, _parseTimestamp, parseTimestamp_fn).call(this, match[2]);\n let endTime = __privateMethod(this, _parseTimestamp, parseTimestamp_fn).call(this, match[3]);\n let duration = endTime - startTime;\n let body = text.slice(bodyStart, bodyEnd);\n let additions = `${cueSettings}\n${cueIdentifier}\n${notes}`;\n inlineTimestampRegex.lastIndex = 0;\n body = body.replace(inlineTimestampRegex, (match2) => {\n let time = __privateMethod(this, _parseTimestamp, parseTimestamp_fn).call(this, match2.slice(1, -1));\n let offsetTime = time - startTime;\n return `<${__privateMethod(this, _formatTimestamp, formatTimestamp_fn).call(this, offsetTime)}>`;\n });\n text = text.slice(bodyEnd).trimStart();\n cueBlockHeaderRegex.lastIndex = 0;\n let chunk = {\n body: textEncoder.encode(body),\n additions: additions.trim() === \"\" ? void 0 : textEncoder.encode(additions),\n timestamp: startTime * 1e3,\n duration: duration * 1e3\n };\n let meta = {};\n if (!__privateGet(this, _preambleEmitted)) {\n meta.decoderConfig = {\n description: __privateGet(this, _preambleBytes)\n };\n __privateSet(this, _preambleEmitted, true);\n }\n __privateGet(this, _options2).output(chunk, meta);\n }\n }\n};\n_options2 = new WeakMap();\n_config = new WeakMap();\n_preambleSeen = new WeakMap();\n_preambleBytes = new WeakMap();\n_preambleEmitted = new WeakMap();\n_parseTimestamp = new WeakSet();\nparseTimestamp_fn = function(string) {\n let match = timestampRegex.exec(string);\n if (!match)\n throw new Error(\"Expected match.\");\n return 60 * 60 * 1e3 * Number(match[1] || \"0\") + 60 * 1e3 * Number(match[2]) + 1e3 * Number(match[3]) + Number(match[4]);\n};\n_formatTimestamp = new WeakSet();\nformatTimestamp_fn = function(timestamp) {\n let hours = Math.floor(timestamp / (60 * 60 * 1e3));\n let minutes = Math.floor(timestamp % (60 * 60 * 1e3) / (60 * 1e3));\n let seconds = Math.floor(timestamp % (60 * 1e3) / 1e3);\n let milliseconds = timestamp % 1e3;\n return hours.toString().padStart(2, \"0\") + \":\" + minutes.toString().padStart(2, \"0\") + \":\" + seconds.toString().padStart(2, \"0\") + \".\" + milliseconds.toString().padStart(3, \"0\");\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget,\n SubtitleEncoder\n};\n","import { GIFEncoder, quantize, applyPalette } from 'gifenc';\nimport { Muxer as Mp4Muxer, ArrayBufferTarget as Mp4Target } from 'mp4-muxer';\nimport { Muxer as WebMMuxer, ArrayBufferTarget as WebMTarget } from 'webm-muxer';\n\n// -----------------------------------------------------------------------------\n// GIF\n// -----------------------------------------------------------------------------\n\n/**\n * Encode a VideoBuffer to a GIF Blob via gifenc. Runs on the main thread but\n * yields every few frames so the page stays responsive.\n *\n * @param {import('./buffer.js').VideoBuffer} buffer\n * @param {object} [opts]\n * @param {number} [opts.maxColors=256]\n * @param {(progress: number) => void} [opts.onProgress]\n */\nexport async function encodeGIF(buffer, opts = {}) {\n if (!buffer.frames.length) throw new Error('[p5.export] encodeGIF: no frames to encode');\n const gif = GIFEncoder();\n const delay = Math.round(1000 / buffer.fps);\n const maxColors = opts.maxColors ?? 256;\n const total = buffer.frames.length;\n\n for (let i = 0; i < total; i++) {\n const data = buffer.frames[i];\n const palette = quantize(data, maxColors);\n const index = applyPalette(data, palette);\n gif.writeFrame(index, buffer.width, buffer.height, { palette, delay });\n if (opts.onProgress) opts.onProgress((i + 1) / total);\n // Yield ~every 16 frames. Earlier we yielded every 4 frames which paid\n // a microtask round-trip 4× more often than needed. The encoder runs\n // on the main thread so the yields ARE needed for UI responsiveness,\n // just not on every handful of frames.\n if ((i & 15) === 15) await new Promise((r) => setTimeout(r, 0));\n }\n gif.finish();\n return new Blob([gif.bytes()], { type: 'image/gif' });\n}\n\n// -----------------------------------------------------------------------------\n// Video — WebCodecs path (fast, frame-by-frame) with MediaRecorder fallback\n// -----------------------------------------------------------------------------\n\n/**\n * True if the browser exposes the WebCodecs `VideoEncoder` and `VideoFrame`.\n * When it does, we encode each frame directly with hardware accel (usually\n * 5–20× faster than real-time MediaRecorder capture). When it doesn't, we\n * fall back to the legacy MediaRecorder path.\n */\nfunction hasWebCodecs() {\n return typeof window !== 'undefined'\n && typeof window.VideoEncoder === 'function'\n && typeof window.VideoFrame === 'function';\n}\n\n/**\n * Candidate codec strings, ranked by \"most compatible first\". We probe each\n * with `VideoEncoder.isConfigSupported` and pick the first the browser\n * accepts at the given width/height/fps.\n */\nconst WEB_CODEC_CANDIDATES = {\n mp4: [\n 'avc1.640028', // H.264 High @ 4.0 — most modern devices\n 'avc1.4d0028', // H.264 Main @ 4.0\n 'avc1.42001f', // H.264 Baseline 3.1 — broadest compat\n 'av01.0.04M.08' // AV1 fallback\n ],\n webm: [\n 'vp09.00.10.08', // VP9 Profile 0\n 'vp8',\n 'av01.0.04M.08'\n ]\n};\n\nconst MP4_CODEC_MAP = { avc1: 'avc', av01: 'av1', hvc1: 'hevc', hev1: 'hevc' };\nconst WEBM_CODEC_MAP = { vp09: 'V_VP9', vp9: 'V_VP9', vp8: 'V_VP8', av01: 'V_AV1' };\n\nfunction muxerCodec(format, codecString) {\n const prefix = codecString.split('.')[0].toLowerCase();\n return (format === 'mp4' ? MP4_CODEC_MAP : WEBM_CODEC_MAP)[prefix] || (format === 'mp4' ? 'avc' : 'V_VP9');\n}\n\nasync function pickWebCodec(format, { width, height, fps, bitrate }) {\n // Probe with the same hint we'd pass to configure(): prefer-hardware.\n // Retry without the hint before giving up — some Chromium builds reject\n // 'prefer-hardware' for codecs that only have a software path even though\n // the codec itself is supported. (We don't include latencyMode in the\n // probe; setting it on configure() has caused \"Encoder creation error\"\n // on some Apple Silicon builds, so it's now omitted.)\n for (const codec of WEB_CODEC_CANDIDATES[format] || []) {\n for (const hint of [{ hardwareAcceleration: 'prefer-hardware' }, {}]) {\n try {\n const r = await VideoEncoder.isConfigSupported({\n codec, width, height, bitrate, framerate: fps, ...hint\n });\n if (r && r.supported) return codec;\n } catch (_) { /* keep probing */ }\n }\n }\n return null;\n}\n\nasync function encodeVideoWebCodecs(buffer, opts) {\n const format = opts.format === 'mp4' ? 'mp4' : 'webm';\n const width = buffer.width;\n const height = buffer.height;\n const fps = buffer.fps;\n // Sensible default: ~0.2 bits/pixel/sec. Capped so very-large frames don't\n // request an absurd bitrate the encoder will reject.\n const bitrate = opts.bitsPerSecond\n ?? Math.min(40_000_000, Math.max(1_500_000, Math.round(width * height * fps * 0.2)));\n\n const codecString = await pickWebCodec(format, { width, height, fps, bitrate });\n if (!codecString) {\n throw new Error(`[p5.export] WebCodecs: no supported ${format.toUpperCase()} codec for ${width}×${height} @ ${fps}fps`);\n }\n\n const target = format === 'mp4' ? new Mp4Target() : new WebMTarget();\n const muxerCodecId = muxerCodec(format, codecString);\n const muxer = format === 'mp4'\n ? new Mp4Muxer({\n target,\n video: { codec: muxerCodecId, width, height, frameRate: fps },\n fastStart: 'in-memory'\n })\n : new WebMMuxer({\n target,\n video: { codec: muxerCodecId, width, height, frameRate: fps }\n });\n\n let firstError = null;\n const encoder = new VideoEncoder({\n output: (chunk, meta) => muxer.addVideoChunk(chunk, meta),\n error: (e) => { firstError = firstError || e; }\n });\n\n // Build a list of configs to try, from \"ideal\" to \"last resort\". configure()\n // itself is synchronous, but the encoder's actual creation is async — its\n // error fires via the `error` callback. So we configure, encode the first\n // frame, and if `firstError` was set we retry with the next config.\n const baseConfig = { codec: codecString, width, height, bitrate, framerate: fps };\n if (codecString.startsWith('avc1')) baseConfig.avc = { format: 'avc' };\n const configAttempts = [\n { ...baseConfig, hardwareAcceleration: 'prefer-hardware' },\n { ...baseConfig } // no hint at all\n ];\n\n let chosenConfig = null;\n for (const attempt of configAttempts) {\n try {\n encoder.configure(attempt);\n chosenConfig = attempt;\n break;\n } catch (_) { /* try next */ }\n }\n if (!chosenConfig) {\n throw new Error(`[p5.export] could not configure VideoEncoder for ${codecString}`);\n }\n\n const usPerFrame = 1_000_000 / fps;\n const total = buffer.frames.length;\n // Force a keyframe every ~2s so seeking remains snappy.\n const keyEvery = Math.max(1, Math.round(fps * 2));\n\n // The encoder is async — encode() queues frames and processes them on a\n // background thread. We push frames as fast as we can; backpressure is\n // managed via `encodeQueueSize` (only wait when the queue is actually\n // backed up). We also yield occasionally so progress callbacks get a\n // chance to repaint the GUI, but rarely enough that the encoder stays\n // saturated.\n const MAX_QUEUED = 16;\n for (let i = 0; i < total; i++) {\n if (firstError) throw firstError;\n while (encoder.encodeQueueSize > MAX_QUEUED) {\n await new Promise((r) => setTimeout(r, 0));\n if (firstError) throw firstError;\n }\n const frame = new VideoFrame(buffer.frames[i], {\n format: 'RGBA',\n codedWidth: width,\n codedHeight: height,\n timestamp: Math.round(i * usPerFrame),\n duration: Math.round(usPerFrame)\n });\n encoder.encode(frame, { keyFrame: i % keyEvery === 0 });\n frame.close();\n\n if (opts.onProgress) opts.onProgress((i + 1) / total);\n // Yield about every 32 frames so the progress callback repaints,\n // without paying for a microtask round-trip every iteration.\n if ((i & 31) === 31) await new Promise((r) => setTimeout(r, 0));\n }\n\n await encoder.flush();\n if (firstError) throw firstError;\n muxer.finalize();\n\n const blob = new Blob([target.buffer], {\n type: format === 'mp4' ? 'video/mp4' : 'video/webm'\n });\n blob.__ext = format;\n return blob;\n}\n\n// -----------------------------------------------------------------------------\n// MediaRecorder fallback — same approach as before, used only when WebCodecs\n// isn't available (older Safari, very old Chromium, etc.).\n// -----------------------------------------------------------------------------\n\nconst MR_MIME = {\n webm: ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm'],\n mp4: ['video/mp4;codecs=avc1', 'video/mp4;codecs=h264', 'video/mp4']\n};\n\nfunction pickMrMime(format) {\n const order = format === 'mp4'\n ? [...MR_MIME.mp4, ...MR_MIME.webm]\n : [...MR_MIME.webm, ...MR_MIME.mp4];\n for (const m of order) {\n if (typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported(m)) {\n return { mime: m, ext: m.startsWith('video/mp4') ? 'mp4' : 'webm' };\n }\n }\n return null;\n}\n\nfunction encodeVideoMediaRecorder(buffer, opts) {\n return new Promise((resolve, reject) => {\n const requested = opts.format || 'webm';\n const picked = pickMrMime(requested);\n if (!picked) return reject(new Error('[p5.export] MediaRecorder fallback: no supported mime'));\n if (requested === 'mp4' && picked.ext !== 'mp4') {\n console.warn('[p5.export] MP4 unsupported here — falling back to WebM.');\n }\n\n const tmp = document.createElement('canvas');\n tmp.width = buffer.width;\n tmp.height = buffer.height;\n const ctx = tmp.getContext('2d');\n\n const stream = tmp.captureStream(buffer.fps);\n const recOpts = { mimeType: picked.mime };\n if (opts.bitsPerSecond) recOpts.videoBitsPerSecond = opts.bitsPerSecond;\n const recorder = new MediaRecorder(stream, recOpts);\n const chunks = [];\n recorder.ondataavailable = (e) => { if (e.data && e.data.size) chunks.push(e.data); };\n recorder.onerror = (e) => reject(e.error || new Error('MediaRecorder error'));\n recorder.onstop = () => {\n stream.getTracks().forEach((t) => t.stop());\n const blob = new Blob(chunks, { type: picked.mime });\n blob.__ext = picked.ext;\n resolve(blob);\n };\n\n ctx.putImageData(new ImageData(buffer.frames[0], buffer.width, buffer.height), 0, 0);\n recorder.start();\n\n const interval = 1000 / buffer.fps;\n let i = 1;\n const tick = () => {\n if (i >= buffer.frames.length) {\n setTimeout(() => recorder.stop(), 100);\n return;\n }\n ctx.putImageData(new ImageData(buffer.frames[i], buffer.width, buffer.height), 0, 0);\n if (opts.onProgress) opts.onProgress((i + 1) / buffer.frames.length);\n i++;\n setTimeout(tick, interval);\n };\n setTimeout(tick, interval);\n });\n}\n\n/**\n * Encode a VideoBuffer to WebM or MP4. Prefers the WebCodecs path (frame-\n * by-frame, much faster than real-time); falls back to MediaRecorder when\n * the browser doesn't expose WebCodecs.\n *\n * @param {import('./buffer.js').VideoBuffer} buffer\n * @param {object} [opts]\n * @param {'webm'|'mp4'} [opts.format='webm']\n * @param {number} [opts.bitsPerSecond]\n * @param {(progress: number) => void} [opts.onProgress]\n */\nexport async function encodeVideo(buffer, opts = {}) {\n if (!buffer.frames.length) throw new Error('[p5.export] encodeVideo: no frames to encode');\n if (hasWebCodecs()) {\n const t0 = performance.now();\n try {\n const blob = await encodeVideoWebCodecs(buffer, opts);\n const ms = (performance.now() - t0) | 0;\n // Loud-enough log so users notice when WebCodecs IS working — useful\n // for confirming the fast path on their hardware.\n // eslint-disable-next-line no-console\n console.info(`[p5.export] WebCodecs encoded ${buffer.frames.length} frames in ${ms}ms (${(buffer.frames.length / (ms / 1000) | 0)} fps).`);\n return blob;\n } catch (err) {\n console.warn(\n '[p5.export] WebCodecs encode failed; falling back to MediaRecorder (real-time, much slower). ' +\n 'Cause:', err\n );\n }\n } else {\n console.info('[p5.export] WebCodecs not available in this browser; using MediaRecorder (real-time).');\n }\n return encodeVideoMediaRecorder(buffer, opts);\n}\n","/**\n * Animated WebP muxer.\n *\n * Why roll this ourselves: there's no `webp-muxer` on npm (unlike\n * mp4-muxer / webm-muxer), and WASM ports of libwebp are ~1 MB which\n * doubles the addon size. The WebP RIFF container is small enough to\n * assemble by hand — we just need actual VP8 frame data, which we get\n * for free by asking the browser to encode each frame as a single\n * WebP via `canvas.toBlob('image/webp')` and then slicing out the\n * inner VP8/VP8L chunk.\n *\n * Container layout we emit (per Google's animated WebP spec):\n * RIFF<size>WEBP\n * VP8X chunk (extended-format header, animation flag set)\n * ANIM chunk (background color, loop count)\n * ANMF * N (one per frame; each wraps a VP8 or VP8L chunk)\n *\n * Browser support note: `canvas.toBlob('image/webp')` is supported in\n * Chrome 23+, Firefox 65+, Safari 16+. Older Safari silently falls\n * back to PNG, which we detect and surface as a clear error so the\n * caller can pick a different format.\n */\n\n\n/**\n * Encode a VideoBuffer into animated WebP. Yields the resulting Blob.\n *\n * @param {{ frames: Uint8ClampedArray[], width: number, height: number, fps: number }} buffer\n * @param {object} [opts]\n * @param {number} [opts.quality=0.85] per-frame WebP quality 0..1\n * @param {number} [opts.loop=0] repeat count; 0 = infinite\n * @param {(progress: number) => void} [opts.onProgress]\n */\nexport async function encodeAnimatedWebP(buffer, opts = {}) {\n if (!buffer || !buffer.frames.length) {\n throw new Error('[p5.export] encodeAnimatedWebP: buffer has no frames');\n }\n const { width, height, fps, frames } = buffer;\n const quality = clamp01(opts.quality ?? 0.85);\n const loopCount = Math.max(0, opts.loop ?? 0);\n // ANMF stores duration in ms with 24 bits — plenty for normal video.\n const frameDurationMs = Math.max(1, Math.round(1000 / (fps || 30)));\n\n await assertWebPEncodingSupported(width, height);\n\n const scratch = document.createElement('canvas');\n scratch.width = width;\n scratch.height = height;\n const sctx = scratch.getContext('2d');\n const imageData = sctx.createImageData(width, height);\n\n const frameSubChunks = [];\n for (let i = 0; i < frames.length; i++) {\n imageData.data.set(frames[i]);\n sctx.putImageData(imageData, 0, 0);\n const blob = await canvasToWebPBlob(scratch, quality);\n const bytes = new Uint8Array(await blob.arrayBuffer());\n frameSubChunks.push(extractVP8(bytes));\n if (opts.onProgress) opts.onProgress((i + 1) / frames.length);\n }\n\n const inner = concat([\n makeChunk('VP8X', writeVP8X(width, height)),\n makeChunk('ANIM', writeANIM(loopCount)),\n ...frameSubChunks.map((sub) => makeChunk('ANMF', writeANMF(width, height, frameDurationMs, sub)))\n ]);\n\n // RIFF wrapper. The size field is everything AFTER the 8-byte RIFF\n // header (including the \"WEBP\" magic).\n const out = new Uint8Array(8 + 4 + inner.length);\n writeAscii(out, 0, 'RIFF');\n writeUint32LE(out, 4, 4 + inner.length);\n writeAscii(out, 8, 'WEBP');\n out.set(inner, 12);\n return new Blob([out], { type: 'image/webp' });\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nasync function assertWebPEncodingSupported(width, height) {\n const probe = document.createElement('canvas');\n probe.width = Math.min(8, width);\n probe.height = Math.min(8, height);\n const blob = await canvasToWebPBlob(probe, 0.9);\n if (!blob || blob.type !== 'image/webp') {\n throw new Error(\n '[p5.export] This browser doesn\\'t encode WebP from canvas — animated WebP export is unavailable. ' +\n 'Use MP4 or WebM instead, or try the latest Chrome/Firefox/Safari.'\n );\n }\n}\n\nfunction canvasToWebPBlob(canvas, quality) {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (b) => b ? resolve(b) : reject(new Error('canvas.toBlob returned null')),\n 'image/webp', quality\n );\n });\n}\n\n/**\n * Walk the RIFF chunks of a single-frame WebP and pull out the\n * VP8/VP8L chunk that carries the actual image data. Returns the\n * full chunk (id + size + payload), padded to even length per RIFF.\n */\nfunction extractVP8(bytes) {\n // RIFF<4> size<4> WEBP<4> = 12 bytes header\n let pos = 12;\n while (pos + 8 <= bytes.length) {\n const id = String.fromCharCode(bytes[pos], bytes[pos + 1], bytes[pos + 2], bytes[pos + 3]);\n const size = readUint32LE(bytes, pos + 4);\n const padded = size + (size & 1);\n if (id === 'VP8 ' || id === 'VP8L') {\n return bytes.slice(pos, pos + 8 + padded);\n }\n pos += 8 + padded;\n }\n throw new Error('[p5.export] no VP8/VP8L chunk found in encoded WebP frame');\n}\n\nfunction writeVP8X(width, height) {\n // 10 bytes: flags(1) + reserved(3) + canvasW-1(3) + canvasH-1(3)\n const buf = new Uint8Array(10);\n buf[0] = 0x02; // animation flag (bit 1). No alpha/ICC/EXIF flags.\n writeUint24LE(buf, 4, width - 1);\n writeUint24LE(buf, 7, height - 1);\n return buf;\n}\n\nfunction writeANIM(loopCount) {\n // 6 bytes: bgColor(4 BGRA) + loopCount(2)\n const buf = new Uint8Array(6);\n // Background = transparent black by default.\n writeUint16LE(buf, 4, loopCount);\n return buf;\n}\n\nfunction writeANMF(width, height, durationMs, subChunk) {\n // 16-byte header followed by the inner VP8/VP8L chunk.\n // frameX(3) frameY(3) frameW-1(3) frameH-1(3) duration(3) flags(1)\n const hdr = new Uint8Array(16);\n writeUint24LE(hdr, 6, width - 1);\n writeUint24LE(hdr, 9, height - 1);\n writeUint24LE(hdr, 12, durationMs);\n hdr[15] = 0x00; // blend with previous (default), do-not-dispose\n const out = new Uint8Array(hdr.length + subChunk.length);\n out.set(hdr, 0);\n out.set(subChunk, hdr.length);\n return out;\n}\n\nfunction makeChunk(id, payload) {\n // RIFF chunks: 4-byte id + 4-byte LE size + payload, padded to even.\n const padBytes = payload.length & 1;\n const out = new Uint8Array(8 + payload.length + padBytes);\n writeAscii(out, 0, id);\n writeUint32LE(out, 4, payload.length);\n out.set(payload, 8);\n // Pad byte is already zero (Uint8Array default).\n return out;\n}\n\nfunction concat(arrays) {\n let total = 0;\n for (const a of arrays) total += a.length;\n const out = new Uint8Array(total);\n let off = 0;\n for (const a of arrays) { out.set(a, off); off += a.length; }\n return out;\n}\n\nfunction writeAscii(buf, offset, str) {\n for (let i = 0; i < str.length; i++) buf[offset + i] = str.charCodeAt(i);\n}\n\nfunction writeUint16LE(buf, offset, v) {\n buf[offset] = v & 0xff;\n buf[offset + 1] = (v >> 8) & 0xff;\n}\nfunction writeUint24LE(buf, offset, v) {\n buf[offset] = v & 0xff;\n buf[offset + 1] = (v >> 8) & 0xff;\n buf[offset + 2] = (v >> 16) & 0xff;\n}\nfunction writeUint32LE(buf, offset, v) {\n buf[offset] = v & 0xff;\n buf[offset + 1] = (v >> 8) & 0xff;\n buf[offset + 2] = (v >> 16) & 0xff;\n buf[offset + 3] = (v >> 24) & 0xff;\n}\nfunction readUint32LE(buf, offset) {\n return (\n buf[offset] |\n (buf[offset + 1] << 8) |\n (buf[offset + 2] << 16) |\n ((buf[offset + 3] << 24) >>> 0)\n );\n}\nfunction clamp01(x) { return Math.max(0, Math.min(1, x)); }\n","import { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { VideoBuffer } from '../recording/buffer.js';\nimport { encodeGIF, encodeVideo } from '../recording/encoders.js';\nimport { encodeAnimatedWebP } from '../recording/webp.js';\n\nconst CANDIDATES = {\n webm: ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm'],\n mp4: ['video/mp4;codecs=avc1', 'video/mp4;codecs=h264', 'video/mp4']\n};\n\n/**\n * Pick the best MediaRecorder mime type for the requested container.\n * Falls back to WebM if MP4 isn't supported (Chromium on Linux/Windows, etc.).\n *\n * @param {'webm'|'mp4'} preferred\n * @returns {{mime: string, ext: 'webm'|'mp4'} | null}\n */\nfunction pickMime(preferred) {\n const order = preferred === 'mp4'\n ? [...CANDIDATES.mp4, ...CANDIDATES.webm]\n : [...CANDIDATES.webm, ...CANDIDATES.mp4];\n for (const mime of order) {\n if (typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported(mime)) {\n return { mime, ext: mime.startsWith('video/mp4') ? 'mp4' : 'webm' };\n }\n }\n return null;\n}\n\nclass VideoRecorder {\n /**\n * @param {object} opts\n * @param {HTMLCanvasElement} opts.canvas\n * @param {'webm'|'mp4'} [opts.format='webm']\n * @param {number} [opts.fps=60]\n * @param {number} [opts.bitsPerSecond]\n * @param {number} [opts.duration] seconds; auto-stop when reached\n * @param {string} [opts.filename]\n */\n constructor(opts) {\n const picked = pickMime(opts.format || 'webm');\n if (!picked) throw new Error('[p5.export] no supported MediaRecorder mime type found');\n\n this.ext = picked.ext;\n if (opts.format === 'mp4' && this.ext !== 'mp4') {\n console.warn('[p5.export] MP4 not supported by this browser — falling back to WebM');\n }\n\n this.stream = opts.canvas.captureStream(opts.fps || 60);\n const recOpts = { mimeType: picked.mime };\n if (opts.bitsPerSecond) recOpts.videoBitsPerSecond = opts.bitsPerSecond;\n this.recorder = new MediaRecorder(this.stream, recOpts);\n\n this.chunks = [];\n this.recorder.ondataavailable = (e) => {\n if (e.data && e.data.size) this.chunks.push(e.data);\n };\n\n this.filename = opts.filename;\n this.duration = opts.duration;\n this._mime = picked.mime;\n this._stopPromise = null;\n }\n\n start() {\n this.recorder.start();\n if (this.duration) {\n setTimeout(() => this.stop(), this.duration * 1000);\n }\n }\n\n /** Stop the recorder and resolve with a downloaded Blob. */\n stop() {\n if (this._stopPromise) return this._stopPromise;\n this._stopPromise = new Promise((resolve) => {\n this.recorder.onstop = () => {\n const blob = new Blob(this.chunks, { type: this._mime });\n const name = this.filename\n ? ensureExt(this.filename, this.ext)\n : defaultFilename(this.ext);\n downloadBlob(blob, name);\n // Stop tracks so the canvas isn't held captive.\n this.stream.getTracks().forEach((t) => t.stop());\n resolve(blob);\n };\n if (this.recorder.state !== 'inactive') this.recorder.stop();\n });\n return this._stopPromise;\n }\n\n get state() {\n return this.recorder.state; // 'inactive' | 'recording' | 'paused'\n }\n}\n\nexport function attachVideoRecorder(p5, fn, lifecycles) {\n /**\n * Start a video recording via MediaRecorder. Returns the recorder so the\n * caller can `stop()` manually or query `state`.\n *\n * @param {object} [opts]\n * @param {'webm'|'mp4'} [opts.format='webm']\n * @param {number} [opts.fps=60]\n * @param {number} [opts.bitsPerSecond]\n * @param {number} [opts.duration]\n * @param {string} [opts.filename]\n */\n fn.recordVideo = function (opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] recordVideo: no canvas found');\n if (this._p5ExportVideo && this._p5ExportVideo.state === 'recording') {\n throw new Error('[p5.export] a video recording is already in progress');\n }\n const rec = new VideoRecorder({ canvas, ...opts });\n rec.start();\n this._p5ExportVideo = rec;\n return rec;\n };\n\n /** Convenience aliases. */\n fn.recordWebM = function (opts = {}) { return fn.recordVideo.call(this, { ...opts, format: 'webm' }); };\n fn.recordMP4 = function (opts = {}) { return fn.recordVideo.call(this, { ...opts, format: 'mp4' }); };\n\n /** Stop the active video recording and download the result. */\n fn.stopVideo = function () {\n const rec = this._p5ExportVideo;\n if (!rec) return null;\n this._p5ExportVideo = null;\n return rec.stop();\n };\n\n // -------------------------------------------------------------------------\n // Buffered recording — \"record once, export to whatever format later\".\n // The GUI's Video tab is built on this. Frames are captured into a raw\n // RGBA buffer; encodeVideoBuffer() turns the buffer into GIF/WebM/MP4\n // on demand.\n // -------------------------------------------------------------------------\n\n /**\n * Create + start a video buffer that captures one frame per draw at the\n * target fps. Auto-stops when `duration` (seconds) is reached.\n *\n * When `opts.scale` is set (1..4), the sketch's pixelDensity is bumped\n * for the duration of the recording — frames are CAPTURED at the higher\n * resolution rather than upscaled afterward. The original density is\n * restored when the buffer stops (manually or via the duration cap).\n *\n * @param {object} [opts]\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration]\n * @param {number} [opts.maxFrames]\n * @param {number} [opts.scale] pixelDensity to render the recording at\n * @returns {VideoBuffer}\n */\n fn.createVideoBuffer = function (opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] createVideoBuffer: no canvas found');\n if (this._p5ExportBuffer && this._p5ExportBuffer.recording) {\n throw new Error('[p5.export] a video buffer is already recording');\n }\n\n // Bump pixelDensity BEFORE constructing the buffer so it reads the\n // resized canvas's width/height for its frame allocations.\n const p = this;\n const scale = opts.scale;\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n const needsScale = scale && scale > 0 && scale !== origPD;\n if (needsScale) {\n p.pixelDensity(scale);\n if (typeof p.redraw === 'function') p.redraw();\n }\n\n const buf = new VideoBuffer({ canvas, ...opts });\n\n // Wrap stop() so pixelDensity is restored whichever way the recording\n // ends — manual stop, auto-stop on duration, or hitting maxFrames.\n const origStop = buf.stop.bind(buf);\n let restored = !needsScale;\n buf.stop = function () {\n origStop();\n if (!restored) {\n restored = true;\n p.pixelDensity(origPD);\n if (typeof p.redraw === 'function') p.redraw();\n }\n };\n\n buf.start();\n this._p5ExportBuffer = buf;\n return buf;\n };\n\n /** Stop the active video buffer (if any). Returns it for inspection. */\n fn.stopVideoBuffer = function () {\n const buf = this._p5ExportBuffer;\n if (buf) buf.stop();\n return buf || null;\n };\n\n /**\n * Encode a recorded VideoBuffer to the requested format and trigger a\n * download. Re-callable: the same buffer can be exported to GIF, then\n * WebM, then MP4 without re-recording.\n *\n * @param {VideoBuffer} buffer\n * @param {object} [opts]\n * @param {'gif'|'webm'|'mp4'} [opts.format='webm']\n * @param {string} [opts.filename]\n * @param {number} [opts.maxColors] GIF only\n * @param {number} [opts.bitsPerSecond] video only\n * @param {(progress: number) => void} [opts.onProgress]\n */\n fn.exportVideoBuffer = async function (buffer, opts = {}) {\n if (!buffer || !buffer.frames.length) {\n throw new Error('[p5.export] exportVideoBuffer: buffer has no frames');\n }\n const format = (opts.format || 'webm').toLowerCase();\n let blob;\n let ext;\n if (format === 'gif') {\n blob = await encodeGIF(buffer, opts);\n ext = 'gif';\n } else if (format === 'webp') {\n blob = await encodeAnimatedWebP(buffer, opts);\n ext = 'webp';\n } else if (format === 'webm' || format === 'mp4') {\n blob = await encodeVideo(buffer, { ...opts, format });\n ext = blob.__ext || (format === 'mp4' ? 'mp4' : 'webm');\n } else {\n throw new Error(`[p5.export] unsupported video format: ${format}`);\n }\n const name = opts.filename ? ensureExt(opts.filename, ext) : defaultFilename(ext);\n downloadBlob(blob, name);\n return blob;\n };\n\n // Tick the active buffer once per draw frame. Compose with any prior hook.\n if (lifecycles && typeof lifecycles === 'object') {\n const prev = lifecycles.postdraw;\n lifecycles.postdraw = function () {\n if (typeof prev === 'function') prev.call(this);\n const buf = this._p5ExportBuffer;\n if (buf && buf.recording) buf.tick();\n };\n }\n}\n","/**\n * WebGL geometry exports — STL and OBJ — leaning entirely on the native\n * p5.Geometry methods (`saveStl` / `saveObj`) shipped with p5 2.0.\n *\n * Why \"lean\"? p5 already implements the encoders correctly; re-rolling\n * them would only diverge from upstream. Our value here is:\n * - surface them as top-level `saveSTL()` / `saveOBJ()` on the\n * instance (consistent with the rest of the addon's API);\n * - emit a clear error when called on a P2D sketch (no Geometry);\n * - accept either a Geometry directly OR a `buildGeometry`-callback\n * so users can describe the model inline without setting up scaffolding.\n *\n * Typical use:\n * // 1) Build geometry once and export it\n * const myModel = buildGeometry(() => sphere(50));\n * saveSTL(myModel, 'sphere.stl');\n *\n * // 2) Build + export in one call\n * saveSTL(() => { sphere(50); cone(20, 40); }, 'scene.stl');\n *\n * // 3) Same with binary STL (smaller file)\n * saveSTL(myModel, 'sphere.stl', { binary: true });\n */\nimport { isWebGL } from '../utils/canvas.js';\n\nfunction resolveGeometry(p, source) {\n // Already a Geometry-like object — has `vertices` + `faces` per p5 spec.\n if (source && Array.isArray(source.vertices) && Array.isArray(source.faces)) {\n return source;\n }\n // Build callback: use `buildGeometry` if available (p5 2.0).\n if (typeof source === 'function' && typeof p.buildGeometry === 'function') {\n return p.buildGeometry(source);\n }\n return null;\n}\n\nexport function attachGeometryExports(p5, fn) {\n /**\n * Export a `p5.Geometry` (or a `buildGeometry`-style callback) as STL.\n * Only useful in WEBGL mode — calling this on a P2D sketch with no\n * geometry argument throws.\n *\n * @param {p5.Geometry|(() => void)} source\n * @param {string} [filename]\n * @param {{ binary?: boolean }} [opts]\n */\n fn.saveSTL = function (source, filename, opts = {}) {\n const geom = resolveGeometry(this, source);\n if (!geom || typeof geom.saveStl !== 'function') {\n const hint = isWebGL(this)\n ? 'Pass a p5.Geometry (from buildGeometry / loadModel) or a buildGeometry-style callback.'\n : 'STL is a 3D format; this sketch is P2D. Use a WEBGL renderer (createCanvas(w, h, WEBGL)) and pass a p5.Geometry.';\n throw new Error('[p5.export] saveSTL: no exportable geometry. ' + hint);\n }\n const name = filename || 'sketch.stl';\n geom.saveStl(name, { binary: !!opts.binary });\n };\n\n /**\n * Export a `p5.Geometry` (or a `buildGeometry`-style callback) as OBJ.\n *\n * @param {p5.Geometry|(() => void)} source\n * @param {string} [filename]\n */\n fn.saveOBJ = function (source, filename) {\n const geom = resolveGeometry(this, source);\n if (!geom || typeof geom.saveObj !== 'function') {\n const hint = isWebGL(this)\n ? 'Pass a p5.Geometry (from buildGeometry / loadModel) or a buildGeometry-style callback.'\n : 'OBJ is a 3D format; this sketch is P2D. Use a WEBGL renderer and pass a p5.Geometry.';\n throw new Error('[p5.export] saveOBJ: no exportable geometry. ' + hint);\n }\n const name = filename || 'sketch.obj';\n geom.saveObj(name);\n };\n}\n","import css from './gui.css?inline';\nimport { isWebGL } from './utils/canvas.js';\n\n// Inject the GUI stylesheet on first import so the UMD drop-in needs no\n// CSS sidecar.\nlet _styleInjected = false;\nfunction injectStyles() {\n if (_styleInjected || typeof document === 'undefined') return;\n _styleInjected = true;\n const style = document.createElement('style');\n style.setAttribute('data-p5-export', '');\n style.textContent = css;\n document.head.appendChild(style);\n}\n\nconst IMAGE_FORMATS = [\n { value: 'png', label: 'PNG (image)' },\n { value: 'jpg', label: 'JPG (image)' },\n { value: 'webp', label: 'WebP (image)' },\n { value: 'svg', label: 'SVG (vector)' },\n { value: 'pdf', label: 'PDF (vector)' }\n];\nconst WEBGL_FORMATS = [\n { value: 'stl', label: 'STL (3D)' },\n { value: 'obj', label: 'OBJ (3D)' }\n];\nconst VIDEO_FORMATS = [\n { value: 'webm', label: 'WebM (video)' },\n { value: 'mp4', label: 'MP4 (video)' },\n { value: 'webp', label: 'WebP (animation)' },\n { value: 'gif', label: 'GIF (animation)' }\n];\nconst SCALE_OPTIONS = [\n { value: '1', label: '1×' },\n { value: '2', label: '2×' },\n { value: '3', label: '3×' },\n { value: '4', label: '4×' }\n];\nconst SCALE_APPLIES_TO_IMAGE = new Set(['png', 'jpg', 'webp', 'pdf']);\n\nconst PLAY_ICON = '<path d=\"M2 1.2 L9 5 L2 8.8 Z\" fill=\"currentColor\"/>';\nconst PAUSE_ICON = '<rect x=\"2\" y=\"1.5\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\"/>' +\n '<rect x=\"6\" y=\"1.5\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\"/>';\n\n// The whole panel as a single HTML template — far easier to scan than the\n// imperative `h()` calls we had before. Elements that JS needs to read\n// or mutate are tagged with `data-el=\"…\"` and pulled into `this.<name>`\n// in the constructor. Click handlers are wired via `data-action=\"…\"`.\nconst PANEL_HTML = `\n<div class=\"p5export-panel\">\n <div class=\"p5export-header\" data-el=\"header\">\n <span class=\"p5export-title\" data-el=\"title\">p5.export</span>\n <button class=\"p5export-toggle\" data-action=\"toggleCollapsed\" title=\"Collapse\">−</button>\n </div>\n\n <div class=\"p5export-tabs\">\n <button class=\"p5export-tab is-active\" data-tab=\"image\">Image</button>\n <button class=\"p5export-tab\" data-tab=\"video\">Video</button>\n </div>\n\n <div class=\"p5export-body\">\n <!-- IMAGE TAB ─────────────────────────────────────────────────── -->\n <div class=\"p5export-view\" data-view=\"image\">\n <div class=\"p5export-row\">\n <label>Format</label>\n <select class=\"p5export-select\" data-el=\"imageFormat\"></select>\n </div>\n <div class=\"p5export-row\" data-el=\"imageScaleRow\">\n <label>Scale</label>\n <select class=\"p5export-select\" data-el=\"imageScale\"></select>\n </div>\n <div class=\"p5export-row\">\n <label>Name</label>\n <input class=\"p5export-input\" type=\"text\" placeholder=\"filename\" data-el=\"imageFilename\">\n </div>\n <button class=\"p5export-btn\" data-action=\"saveImage\">Export</button>\n <div class=\"p5export-status\" data-el=\"imageStatus\" hidden></div>\n </div>\n\n <!-- VIDEO TAB ─────────────────────────────────────────────────── -->\n <div class=\"p5export-view\" data-view=\"video\" hidden>\n <div class=\"p5export-row\">\n <label>Format</label>\n <select class=\"p5export-select\" data-el=\"videoFormat\"></select>\n </div>\n <div class=\"p5export-row\">\n <label>Duration</label>\n <input class=\"p5export-input\" type=\"number\" min=\"0.5\" step=\"0.5\" value=\"3\" data-el=\"videoDuration\">\n </div>\n <div class=\"p5export-row\">\n <label>Name</label>\n <input class=\"p5export-input\" type=\"text\" placeholder=\"filename\" data-el=\"videoFilename\">\n </div>\n <div class=\"p5export-preview\" data-el=\"previewWrap\" hidden>\n <canvas class=\"p5export-preview-canvas\" data-el=\"previewCanvas\"></canvas>\n <div class=\"p5export-preview-controls\">\n <button class=\"p5export-play\" data-action=\"togglePreview\" title=\"Play / pause\">\n <svg viewBox=\"0 0 10 10\" data-el=\"playIcon\">${PLAY_ICON}</svg>\n </button>\n <input class=\"p5export-timeline\" type=\"range\" min=\"0\" max=\"0\" step=\"1\" value=\"0\" data-el=\"timeline\">\n <span class=\"p5export-time\" data-el=\"timeLabel\">0:00</span>\n </div>\n </div>\n <button class=\"p5export-btn\" data-action=\"videoPrimary\" data-el=\"videoPrimaryBtn\">Record</button>\n <button class=\"p5export-btn is-ghost\" data-action=\"resetVideo\" data-el=\"rerecordBtn\" hidden>Re-record</button>\n <div class=\"p5export-status\" data-el=\"recordedStatus\" hidden></div>\n </div>\n </div>\n</div>`.trim();\n\n/**\n * The export panel. Two tabs (Image / Video), both built from the\n * `PANEL_HTML` template above. The video tab has three states (idle,\n * recording, recorded) but renders into a single persistent layout —\n * only the primary button text + visibility of preview/rerecord change.\n */\nclass ExportPanel {\n constructor(p5Instance, opts = {}) {\n injectStyles();\n this.p = p5Instance;\n this.opts = opts;\n this.tab = 'image';\n this.videoState = 'idle'; // 'idle' | 'recording' | 'recorded' | 'encoding'\n this.buffer = null;\n this._statusTimer = null;\n\n // Parse the template once into a real DOM element.\n this.el = document.createRange()\n .createContextualFragment(PANEL_HTML)\n .firstElementChild;\n\n // Mirror every `data-el` node as a property on `this` so the rest of\n // the class can read/mutate them by name (`this.imageFormat`, etc.).\n for (const node of this.el.querySelectorAll('[data-el]')) {\n this[node.dataset.el] = node;\n }\n\n // Hook up declarative event wiring.\n for (const node of this.el.querySelectorAll('[data-action]')) {\n node.addEventListener('click', () => {\n const m = this[`_${node.dataset.action}`];\n if (typeof m === 'function') m.call(this);\n });\n }\n for (const node of this.el.querySelectorAll('[data-tab]')) {\n node.addEventListener('click', () => this._switchTab(node.dataset.tab));\n }\n\n this._populateOptions();\n this._wireExtras();\n\n if (this.opts.title) this.title.textContent = this.opts.title;\n if (this.opts.collapsed) this.el.classList.add('is-collapsed');\n (opts.parent || document.body).appendChild(this.el);\n this._wireDrag();\n }\n\n // ─── Bootstrapping helpers ─────────────────────────────────────────────\n\n _populateOptions() {\n const imageFormats = isWebGL(this.p) ? [...IMAGE_FORMATS, ...WEBGL_FORMATS] : IMAGE_FORMATS;\n this.imageFormat.innerHTML = optionsHTML(imageFormats);\n this.imageScale.innerHTML = optionsHTML(SCALE_OPTIONS);\n this.videoFormat.innerHTML = optionsHTML(VIDEO_FORMATS);\n\n if (this.opts.filename) {\n this.imageFilename.value = this.opts.filename;\n this.videoFilename.value = this.opts.filename;\n }\n }\n\n _wireExtras() {\n this.imageFormat.addEventListener('change', () => this._refreshImageScaleEnabled());\n this._refreshImageScaleEnabled();\n this.timeline.addEventListener('input', () => {\n this._pausePreview();\n this._previewFrame = Number(this.timeline.value);\n this._renderPreviewFrame();\n });\n }\n\n _toggleCollapsed() { this.el.classList.toggle('is-collapsed'); }\n\n _switchTab(tab) {\n this.tab = tab;\n for (const btn of this.el.querySelectorAll('[data-tab]')) {\n btn.classList.toggle('is-active', btn.dataset.tab === tab);\n }\n for (const view of this.el.querySelectorAll('[data-view]')) {\n view.toggleAttribute('hidden', view.dataset.view !== tab);\n }\n }\n\n // ─── Image tab ─────────────────────────────────────────────────────────\n\n /** Scale only applies to raster formats; grey it out for SVG. */\n _refreshImageScaleEnabled() {\n const enabled = SCALE_APPLIES_TO_IMAGE.has(this.imageFormat.value);\n this.imageScale.disabled = !enabled;\n this.imageScaleRow.style.opacity = enabled ? '' : '0.45';\n }\n\n async _saveImage() {\n const fmt = this.imageFormat.value;\n const name = this.imageFilename.value || undefined;\n const scale = Number(this.imageScale.value) || 1;\n const opts = SCALE_APPLIES_TO_IMAGE.has(fmt) ? { scale } : undefined;\n const tag = `${fmt.toUpperCase()}${opts && scale > 1 ? ` @ ${scale}×` : ''}`;\n this._setStatus(this.imageStatus, `Saving ${tag}…`);\n try {\n if (fmt === 'png') await this.p.savePNG(name, opts);\n else if (fmt === 'jpg') await this.p.saveJPG(name, opts);\n else if (fmt === 'webp') await this.p.saveWebP(name, opts);\n else if (fmt === 'svg') this.p.saveSVG(name);\n else if (fmt === 'pdf') await this.p.savePDF(name, opts);\n else if (fmt === 'stl' || fmt === 'obj') {\n this._setStatus(this.imageStatus,\n `${fmt.toUpperCase()} needs a p5.Geometry — call saveSTL(myGeometry) from your sketch.`,\n 'error');\n return;\n }\n this._setStatus(this.imageStatus, `Saved ${tag}.`, '', 2000);\n } catch (err) {\n console.error(err);\n this._setStatus(this.imageStatus, `Error: ${err.message}`, 'error');\n }\n }\n\n // ─── Video tab ─────────────────────────────────────────────────────────\n\n /** Cycle: idle → recording → recorded → encoding → recorded. */\n _videoPrimary() {\n if (this.videoState === 'idle') return this._startRecording();\n if (this.videoState === 'recording') return this._stopRecording();\n if (this.videoState === 'recorded') return this._export(this.videoFormat.value);\n }\n\n _startRecording() {\n const duration = Number(this.videoDuration.value) || undefined;\n try {\n this.buffer = this.p.createVideoBuffer({ duration, fps: 30, scale: 1 });\n } catch (err) {\n console.error(err);\n this._setStatus(this.recordedStatus, `Error: ${err.message}`, 'error');\n return;\n }\n this.videoState = 'recording';\n this._updateVideoState();\n\n const start = performance.now();\n this._statusTimer = setInterval(() => {\n const elapsed = (performance.now() - start) / 1000;\n const tail = duration ? ` / ${duration.toFixed(1)}s` : '';\n this._setStatus(this.recordedStatus,\n `Recording ${elapsed.toFixed(1)}s${tail} · ${this.buffer.framesRecorded} frames`);\n if (!this.buffer.recording) this._finishRecording();\n }, 100);\n }\n\n _stopRecording() {\n if (this.buffer) this.buffer.stop();\n this._finishRecording();\n }\n\n _finishRecording() {\n clearInterval(this._statusTimer);\n this._statusTimer = null;\n if (!this.buffer) return;\n this.videoState = 'recorded';\n this._setStatus(this.recordedStatus, '');\n this._initPreview();\n this._updateVideoState();\n }\n\n async _export(format) {\n if (!this.buffer) return;\n const name = this.videoFilename.value || undefined;\n const wasState = this.videoState;\n this.videoState = 'encoding';\n this._updateVideoState();\n this._setStatus(this.recordedStatus, `Encoding ${format.toUpperCase()}…`);\n try {\n await this.p.exportVideoBuffer(this.buffer, {\n format, filename: name,\n onProgress: (p) => this._setStatus(this.recordedStatus,\n `Encoding ${format.toUpperCase()}… ${Math.round(p * 100)}%`)\n });\n this._setStatus(this.recordedStatus, `Saved ${format.toUpperCase()}.`, '', 2000);\n } catch (err) {\n console.error(err);\n this._setStatus(this.recordedStatus, `Error: ${err.message}`, 'error');\n } finally {\n this.videoState = wasState;\n this._updateVideoState();\n }\n }\n\n _resetVideo() {\n this._pausePreview();\n if (this.buffer) this.buffer.clear();\n this.buffer = null;\n this._setStatus(this.recordedStatus, '');\n this.videoState = 'idle';\n this._updateVideoState();\n }\n\n /** Drive every video-tab visual difference from one place. */\n _updateVideoState() {\n const s = this.videoState;\n const hasRecording = s === 'recorded' || s === 'encoding';\n const formLocked = s === 'recording';\n\n this.videoFormat.disabled = formLocked;\n this.videoDuration.disabled = formLocked;\n this.videoFilename.disabled = formLocked;\n\n this.previewWrap.toggleAttribute('hidden', !hasRecording);\n this.rerecordBtn.toggleAttribute('hidden', !hasRecording);\n\n this.videoPrimaryBtn.className = 'p5export-btn' + (s === 'recording' ? ' is-danger' : '');\n this.videoPrimaryBtn.textContent =\n s === 'recording' ? 'Stop' :\n hasRecording ? 'Export' :\n 'Record';\n\n const encoding = s === 'encoding';\n this.videoPrimaryBtn.disabled = encoding;\n this.rerecordBtn.disabled = encoding;\n }\n\n // ─── Preview player ────────────────────────────────────────────────────\n\n _initPreview() {\n if (!this.buffer || !this.buffer.frames.length) return;\n const PREVIEW_MAX = 320;\n const srcW = this.buffer.width;\n const srcH = this.buffer.height;\n const scale = Math.min(1, PREVIEW_MAX / Math.max(srcW, srcH));\n this.previewCanvas.width = Math.max(1, Math.round(srcW * scale));\n this.previewCanvas.height = Math.max(1, Math.round(srcH * scale));\n this._previewCtx = this.previewCanvas.getContext('2d');\n this._previewSrc = document.createElement('canvas');\n this._previewSrc.width = srcW;\n this._previewSrc.height = srcH;\n this._previewSrcCtx = this._previewSrc.getContext('2d');\n this._previewImageData = this._previewSrcCtx.createImageData(srcW, srcH);\n this._previewFrame = 0;\n this._previewPlaying = false;\n this._previewRaf = null;\n this.timeline.min = '0';\n this.timeline.max = String(this.buffer.frames.length - 1);\n this.timeline.value = '0';\n this.playIcon.innerHTML = PLAY_ICON;\n this._renderPreviewFrame();\n }\n\n _renderPreviewFrame() {\n if (!this.buffer || !this._previewCtx) return;\n const idx = Math.max(0, Math.min(this.buffer.frames.length - 1, this._previewFrame));\n const frame = this.buffer.frames[idx];\n if (!frame) return;\n this._previewImageData.data.set(frame);\n this._previewSrcCtx.putImageData(this._previewImageData, 0, 0);\n this._previewCtx.clearRect(0, 0, this.previewCanvas.width, this.previewCanvas.height);\n this._previewCtx.drawImage(\n this._previewSrc,\n 0, 0, this._previewSrc.width, this._previewSrc.height,\n 0, 0, this.previewCanvas.width, this.previewCanvas.height\n );\n this.timeline.value = String(idx);\n const fps = this.buffer.fps || 30;\n // Decimal seconds — the M:SS format always rounded down by ~1 frame,\n // so a 3-second recording showed \"0:02\" at the slider's max. `0.0s`\n // → `3.0s` matches what the user actually recorded.\n this.timeLabel.textContent = `${(idx / fps).toFixed(1)}s`;\n }\n\n _togglePreview() {\n if (!this.buffer) return;\n if (this._previewPlaying) this._pausePreview();\n else this._playPreview();\n }\n\n _playPreview() {\n if (!this.buffer || !this.buffer.frames.length) return;\n this._previewPlaying = true;\n this.playIcon.innerHTML = PAUSE_ICON;\n const fps = this.buffer.fps || 30;\n const frameMs = 1000 / fps;\n let last = performance.now();\n const tick = (now) => {\n if (!this._previewPlaying) return;\n const elapsed = now - last;\n if (elapsed >= frameMs) {\n last = now - (elapsed % frameMs);\n this._previewFrame++;\n if (this._previewFrame >= this.buffer.frames.length) this._previewFrame = 0;\n this._renderPreviewFrame();\n }\n this._previewRaf = requestAnimationFrame(tick);\n };\n this._previewRaf = requestAnimationFrame(tick);\n }\n\n _pausePreview() {\n if (!this._previewPlaying) return;\n this._previewPlaying = false;\n if (this._previewRaf) cancelAnimationFrame(this._previewRaf);\n this._previewRaf = null;\n this.playIcon.innerHTML = PLAY_ICON;\n }\n\n // ─── Status helper ─────────────────────────────────────────────────────\n\n /**\n * Update a status element. Empty message → element hidden (so it\n * doesn't reserve vertical space). `kind === 'error'` paints it red;\n * any other value clears existing modifier classes.\n */\n _setStatus(el, msg, kind = '', clearAfter = 0) {\n el.textContent = msg || '';\n el.toggleAttribute('hidden', !msg);\n el.classList.toggle('is-error', kind === 'error');\n if (clearAfter && msg) {\n setTimeout(() => {\n if (el.textContent === msg) this._setStatus(el, '');\n }, clearAfter);\n }\n }\n\n // ─── Dragging ──────────────────────────────────────────────────────────\n\n _wireDrag() {\n let startX = 0, startY = 0, origX = 0, origY = 0, dragging = false;\n const onMove = (e) => {\n if (!dragging) return;\n this.el.style.left = (origX + e.clientX - startX) + 'px';\n this.el.style.top = (origY + e.clientY - startY) + 'px';\n };\n const onUp = () => { dragging = false; document.removeEventListener('mousemove', onMove); };\n this.header.addEventListener('mousedown', (e) => {\n if (e.target.closest('.p5export-toggle')) return;\n dragging = true;\n startX = e.clientX; startY = e.clientY;\n const r = this.el.getBoundingClientRect();\n origX = r.left; origY = r.top;\n this.el.style.left = origX + 'px';\n this.el.style.top = origY + 'px';\n this.el.style.right = 'auto';\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp, { once: true });\n });\n }\n\n destroy() {\n clearInterval(this._statusTimer);\n this._pausePreview();\n if (this.buffer) this.buffer.clear();\n this.el.remove();\n }\n}\n\nfunction optionsHTML(items) {\n return items.map((o) => `<option value=\"${o.value}\">${o.label}</option>`).join('');\n}\n\nexport function attachGUI(p5, fn, lifecycles) {\n /**\n * Mount the export GUI panel. Idempotent — returns the existing panel\n * with merged opts if one is already mounted.\n *\n * You usually don't need to call this; it auto-mounts after setup().\n */\n fn.createExportGUI = function (opts = {}) {\n if (this._p5ExportPanel) {\n Object.assign(this._p5ExportPanel.opts, opts);\n return this._p5ExportPanel;\n }\n const panel = new ExportPanel(this, opts);\n this._p5ExportPanel = panel;\n return panel;\n };\n\n fn.removeExportGUI = function () {\n if (this._p5ExportPanel) {\n this._p5ExportPanel.destroy();\n this._p5ExportPanel = null;\n }\n };\n\n // Auto-mount after setup() runs. Opt out with\n // `window.p5ExportConfig = { autoGUI: false }`\n // BEFORE the addon script loads.\n if (lifecycles && typeof lifecycles === 'object') {\n const prev = lifecycles.postsetup;\n lifecycles.postsetup = function () {\n if (typeof prev === 'function') prev.call(this);\n const cfg = (typeof window !== 'undefined' && window.p5ExportConfig) || {};\n if (cfg.autoGUI === false) return;\n if (this._p5ExportPanel) return;\n this.createExportGUI();\n };\n }\n}\n","/**\n * p5.export — a p5.js add-on for one-line exports to PNG, JPG, WebP, GIF,\n * MP4, WebM, SVG, and PDF, plus an optional floating GUI.\n *\n * p5.export does NOT ship its own p5. The page must load p5 (1.x or 2.x)\n * before this script — we auto-register against whatever `window.p5` is\n * present (using `registerAddon` on p5 2.0, `registerMethod` on p5 1.x).\n *\n * Usage (browser, drop-in):\n * <script src=\"https://cdn.jsdelivr.net/npm/p5@2/lib/p5.js\"></script>\n * <script src=\"p5.export.min.js\"></script>\n *\n * Usage (ES modules):\n * import 'p5'; // or whatever brings p5 onto window\n * import 'p5.export'; // auto-registers on window.p5\n * // or, to register manually against a specific p5 constructor:\n * import { register } from 'p5.export';\n * register(p5);\n */\n\nimport { attachImageExports } from './exporters/image.js';\nimport { attachSVGExport } from './exporters/svg.js';\nimport { attachPDFExport } from './exporters/pdf.js';\nimport { attachGIFRecorder } from './exporters/gif.js';\nimport { attachVideoRecorder } from './exporters/video.js';\nimport { attachGeometryExports } from './exporters/geometry.js';\nimport { attachGUI } from './gui.js';\nimport { downloadBlob } from './utils/download.js';\n\n/**\n * The addon function passed to p5.registerAddon. Adds export methods to\n * the p5 prototype (`fn`).\n *\n * @param {typeof import('p5').default} p5\n * @param {Record<string, any>} fn p5 prototype — methods added here appear on every sketch.\n * @param {Record<string, any>} lifecycles\n */\nexport function p5ExportAddon(p5, fn, lifecycles) {\n attachImageExports(p5, fn);\n attachSVGExport(p5, fn, lifecycles);\n attachPDFExport(p5, fn);\n attachGIFRecorder(p5, fn, lifecycles);\n attachVideoRecorder(p5, fn, lifecycles);\n attachGeometryExports(p5, fn);\n attachGUI(p5, fn, lifecycles);\n\n // p5 2.0 stopped attaching `random` / `randomSeed` / `noise` / `noiseSeed`\n // to `p5.Graphics.prototype` (they're only on `p5.prototype` now), but\n // many in-the-wild sketches still call `pg.random(width)` /\n // `pg.randomSeed(seed)` from p5 1.x. Bridge those by delegating to the\n // global p5 instance — calling pg.random uses the GLOBAL seed, which is\n // good enough for most sketches and avoids \"X is not a function\" errors\n // that would otherwise mask everything else.\n patchGraphicsRandom(p5);\n\n // Surface a tiny utility users sometimes want.\n fn.downloadBlob = function (blob, filename) {\n return downloadBlob(blob, filename);\n };\n}\n\nfunction patchGraphicsRandom(p5) {\n const G = p5 && p5.Graphics;\n if (!G || !G.prototype) return;\n if (G.prototype.__p5ExportGraphicsRandomPatched) return;\n const proto = p5.prototype;\n for (const name of ['random', 'randomSeed', 'noise', 'noiseSeed', 'randomGaussian']) {\n if (typeof G.prototype[name] === 'function') continue;\n if (typeof proto[name] !== 'function') continue;\n G.prototype[name] = function (...args) {\n const inst = (typeof window !== 'undefined' && window.p5 && window.p5.instance) || this;\n return proto[name].apply(inst, args);\n };\n }\n G.prototype.__p5ExportGraphicsRandomPatched = true;\n}\n\n/**\n * Best-effort install against p5 1.x — registerAddon doesn't exist there,\n * so we attach methods directly to `p5.prototype` and translate our\n * `lifecycles` object into p5 1.x's `registerMethod('pre' | 'post' | …)`.\n * Coverage is partial:\n * • image / video / GIF / PDF / GUI exports — work.\n * • SVG vector replay — works (the Proxy is installed when createCanvas\n * runs, which we wrap on the prototype).\n * • p5.pattern integration — works (hooks installed in our beforeSetup).\n *\n * If you hit a feature that doesn't behave, upgrade to p5 2.0 — that's the\n * primary supported version.\n */\nfunction registerP5OneX(p5Ctor) {\n if (!p5Ctor || !p5Ctor.prototype) return false;\n if (p5Ctor.prototype.__p5ExportInstalled) return true;\n p5Ctor.prototype.__p5ExportInstalled = true;\n // Translate the p5 2.0 lifecycles dict into p5 1.x registerMethod calls.\n const lifecycles = {};\n p5ExportAddon(p5Ctor, p5Ctor.prototype, lifecycles);\n const reg = (event, fn) =>\n typeof fn === 'function' && typeof p5Ctor.prototype.registerMethod === 'function' &&\n p5Ctor.prototype.registerMethod(event, fn);\n reg('beforeSetup', lifecycles.presetup);\n reg('afterSetup', lifecycles.postsetup);\n reg('pre', lifecycles.predraw);\n reg('post', lifecycles.postdraw);\n // The `afterSetup` registration above only reaches a p5 instance that is\n // constructed AFTER this point — p5 1.x snapshots `_registeredMethods`\n // from the prototype at construction time. When our <script> loads after\n // p5 has already instantiated its global sketch (the common case for a\n // drop-in include), that hook never fires and the GUI silently never\n // mounts. Mount it directly onto the already-running instance instead.\n scheduleP5OneXAutoGUI(p5Ctor);\n console.info('[p5.export] Registered against p5 1.x — vector SVG, image, GIF, video, PDF exports available. Use p5 2.0 for full feature parity.');\n return true;\n}\n\n/**\n * Resilient GUI auto-mount for the p5 1.x path. Polls for the running\n * global instance (`p5.instance`, set by p5 1.x in global mode) and mounts\n * the panel once setup has completed — covering the case where the\n * `afterSetup` lifecycle hook was registered too late to reach the\n * already-constructed instance. Idempotent with the lifecycle path:\n * `createExportGUI()` returns the existing panel if one is already up.\n */\nfunction scheduleP5OneXAutoGUI(p5Ctor) {\n if (typeof window === 'undefined') return;\n const start = Date.now();\n const id = setInterval(() => {\n // Opt-out, same flag the lifecycle path honors.\n const cfg = window.p5ExportConfig || {};\n if (cfg.autoGUI === false) { clearInterval(id); return; }\n const inst = p5Ctor && p5Ctor.instance;\n // Already mounted (by the lifecycle hook or a prior tick) — done.\n if (inst && inst._p5ExportPanel) { clearInterval(id); return; }\n // Wait until the sketch's setup() has finished so the canvas exists.\n if (inst && inst._setupDone && typeof inst.createExportGUI === 'function') {\n inst.createExportGUI();\n clearInterval(id);\n return;\n }\n // Give up quietly after 30s (e.g. instance-mode sketch with no global\n // instance, or a sketch that never finishes setup).\n if (Date.now() - start > 30000) clearInterval(id);\n }, 150);\n}\n\n/**\n * Register the addon against a given p5 constructor. Called automatically\n * for the global p5 when this module loads in a browser, but exposed for\n * users who instantiate p5 themselves.\n */\nexport function register(p5Ctor) {\n if (!p5Ctor) throw new Error('[p5.export] register() called with no p5 constructor');\n if (typeof p5Ctor.registerAddon === 'function') {\n p5Ctor.registerAddon(p5ExportAddon);\n return;\n }\n if (!registerP5OneX(p5Ctor)) {\n throw new Error('[p5.export] Could not register — no registerAddon and no prototype.registerMethod.');\n }\n}\n\n/**\n * Auto-register against window.p5 when used as a <script> include.\n *\n * Two timing realities to handle:\n * 1. Our <script> can run BEFORE the user's p5 CDN <script> — common when\n * the user injects us at the start of <head>. window.p5 isn't defined\n * yet, so a one-shot check would miss.\n * 2. Our <script> runs AFTER p5 — window.p5 is already populated.\n *\n * Solution: do an immediate check, plus listen for `p5Ready` (fired by\n * p5 2.0 just before global instantiation), plus a brief setInterval\n * fallback covering the gap between window.p5 being defined and the\n * `load` event when p5 instantiates. In every case we noop after the\n * first successful registration.\n */\nfunction tryAutoRegister() {\n if (typeof window === 'undefined' || !window.p5) return false;\n // Idempotency: registerP5OneX sets a flag on the prototype.\n if (window.p5.prototype && window.p5.prototype.__p5ExportInstalled) return true;\n // For 2.0 we tag the constructor since multiple addons may register.\n if (window.p5.__p5ExportAutoRegistered) return true;\n if (typeof window.p5.registerAddon === 'function') {\n window.p5.registerAddon(p5ExportAddon);\n window.p5.__p5ExportAutoRegistered = true;\n return true;\n }\n return registerP5OneX(window.p5);\n}\n\n/**\n * Best-effort auto-register for bundler / ESM usage.\n *\n * p5 2.x's ESM build never assigns `window.p5` (it only exports the\n * constructor and binds sketch methods to the window), so the\n * `window.p5` polling above can never see it under a bundler. As a\n * fallback we dynamically `import('p5')` — in a bundler this resolves to\n * the user's installed p5 (the same module instance, so no double\n * init), letting `import '@munusshih/p5.export'` auto-register without\n * the user wiring up `register()` by hand.\n *\n * This is safe under `<script>` usage too: it only runs when `window.p5`\n * never appears, and any resolution failure (p5 not installed, not a\n * module context) is swallowed. p5 2.x defers global instantiation\n * behind an async translator promise, so this import resolves and\n * registers well before the sketch is constructed. For guaranteed\n * ordering in a bundler, prefer the explicit `register(p5)` form.\n */\nfunction tryModuleAutoRegister() {\n if (typeof window === 'undefined') return;\n if (window.__p5ExportModuleTried) return;\n window.__p5ExportModuleTried = true;\n import(/* @vite-ignore */ 'p5')\n .then((mod) => {\n const p5Ctor = (mod && (mod.default || mod.p5)) || mod;\n if (!p5Ctor || (typeof p5Ctor !== 'function' && !p5Ctor.prototype)) return;\n // Don't double-register if a <script>-based path already handled it.\n if (p5Ctor.__p5ExportAutoRegistered) return;\n if (p5Ctor.prototype && p5Ctor.prototype.__p5ExportInstalled) return;\n register(p5Ctor);\n p5Ctor.__p5ExportAutoRegistered = true;\n })\n .catch(() => {\n /* p5 not resolvable as a module — fine, this path is opt-in. */\n });\n}\n\nif (typeof window !== 'undefined') {\n if (!tryAutoRegister()) {\n // p5 not on window yet — poll briefly to catch its definition. Most\n // browsers complete the next <script> tag within ~50ms; we poll for\n // 5s and stop on first success.\n const id = setInterval(() => {\n if (tryAutoRegister()) clearInterval(id);\n }, 10);\n setTimeout(() => clearInterval(id), 5000);\n // p5 2.0 dispatches `p5Ready` just before instantiation; catch the\n // last possible moment to be on the prototype.\n window.addEventListener('p5Ready', tryAutoRegister, { once: true });\n // Bundler / ESM path where window.p5 will never appear.\n tryModuleAutoRegister();\n }\n}\n\nexport default p5ExportAddon;\n"],"names":["downloadBlob","blob","filename","url","a","defaultFilename","ext","base","ts","ensureExt","getCanvas","p","getGlobalCanvas","fromP5","isWebGL","r","ctx","RASTER_MIME","highResViaReplay","scale","format","quality","rec","canvas","origPD","logicalW","logicalH","targetW","targetH","off","sf","ops","i","op","name","mime","resolve","reject","b","withPixelDensity","fn","wasLooping","MIME","canvasToBlob","snapshotAtScale","replayed","attachImageExports","p5","opts","STYLES","CanvasGradient","CanvasPattern","namedEntities","str","args","keys","randomString","holder","chars","randomstring","createNamedToNumberedLookup","items","radix","entity","lookup","base10","getTextAnchor","textAlign","mapping","getDominantBaseline","textBaseline","gradientNode","offset","color","stop","regex","matches","pattern","o","defaultOptions","options","elementName","properties","resetFill","element","key","styleState","type","style","value","id","node","fixNamedEntities","serialized","regexp","xmlns","group","parent","state","t","transform","x","y","angle","degrees","c","d","e","f","path","command","cp1x","cp1y","cp2x","cp2y","cpx","cpy","normalize","vector","len","x1","y1","x2","y2","radius","x0","y0","unit_vec_p1_p0","unit_vec_p1_p2","cos","theta","unit_vec_p1_origin","len_p1_origin","unit_vec_origin_start_tangent","unit_vec_origin_end_tangent","getAngle","startAngle","endAngle","width","height","rect","grad","r0","r1","fontPart","data","font","text","action","textElement","counterClockwise","endX","endY","startX","startY","sweepFlag","largeArcFlag","diff","clipPath","newGroup","image","dx","dy","dw","dh","sx","sy","sw","sh","svg","defs","currentElement","svgImage","context","repetition","img","module","TAU","patternIdCounter","nextPatternId","pickPaletteColor","inst","pc","palette","modeAdjust","mode","readRectMode","readEllipseMode","injectVector","payload","injectBeginRaster","meta","injectEndRaster","wrap","proto","computeShape","orig","patternId","shape","wrapping","PATTERN_FN_NAMES","wrapPatternPlugin","p5Instance","alreadyInstalled","Renderer","k","v","xs","ys","minX","maxX","minY","maxY","instance","protoFn","boundFn","_v","SHARED_RASTER_PATTERN_ID","replaySyntheticVector","c2s","useSharedPattern","oldFill","rx","ry","cx","cy","pts","_c2sPatched","patchC2S","C2S","rotation","ccw","cosR","sinR","toCanvas","lx","ly","start","end","rotDeg","w","h","radii","tl","tr","br","bl","max","origApply","HEX8","hexToRgba","m","origFill","origStroke","DEFAULT_MAX_FRAMES","PRESERVED_STYLE_PROPS","gradientIdCounter","GRADIENT_BY_ID","nextGradientId","makeRecorder","realCtx","frameStarts","dropTo","lastValue","carry","delta","GRADIENT_FACTORIES","wrapGradient","kind","target","prop","result","isP2DContext","installRecorder","renderer","real","cfg","desc","normalizeColorForC2S","isOpaqueColor","findLastOpaqueClear","lastClearIdx","curFill","tolerance","inRaster","replayToSVG","lastStringFill","lastStringStroke","emittedGradientIds","xmlnsSVG","emitSvgGradient","doc","el","s","inv","clearIdx","startIdx","depth","saveIdx","liveCanvas","rasterW","rasterH","regionCanvas","regionCtx","activeRegion","sharedRasterCanvas","sharedRasterCtx","sharedRasterHasContent","xlink","ensureRegionCanvas","ensureSharedRaster","emitRegionPattern","region","bb","ex","ey","dataUrl","slice","pat","emitSharedRaster","patImg","rootImg","inRasterRegion","isFill","existing","sep","rasterSVG","attachSVGExport","lifecycles","markup","canRecord","HUGE_OPS_THRESHOLD","vectorOpCount","allOps","trimStart","tooBigForVector","reason","n","origCreateCanvas","prevPresetup","prevSetup","prevPre","blobToDataURL","reader","_jsPDFPromise","loadJsPDF","mod","attachPDFExport","jsPDF","imageFormat","wLogical","hLogical","fmt","unit","orientation","pdf","pageW","pageH","fit","drawW","drawH","X","F","O","J","lt","at","l","g","_","u","B","A","z","I","M","V","$","D","G","j","R","T","tt","Q","ut","H","C","L","Y","E","K","xt","nt","gt","bt","q","ct","pt","it","dt","wt","ht","yt","ft","S","Z","GIFRecorder","now","tmp","gif","GIFEncoder","delay","total","quantize","index","applyPalette","attachGIFRecorder","prev","VideoBuffer","fps","duration","maxFrames","tctx","__accessCheck","obj","member","msg","__privateGet","getter","__privateAdd","__privateSet","setter","__privateWrapper","__privateMethod","method","bytes","view","u8","u16","i16","u24","u32","i32","u64","fixed_8_8","fixed_16_16","fixed_2_30","ascii","nullTerminated","bytes2","last","arr","lastPresentedSample","samples","sample","intoTimescale","timeInSeconds","timescale","round","rotationMatrix","rotationInDegrees","cosTheta","sinTheta","IDENTITY_MATRIX","matrixToBytes","matrix","deepClone","isU32","box","contents","children","fullBox","version","flags","ftyp","details","minorVersion","mdat","reserveLargeSize","free","size","moov","tracks","creationTime","fragmented","mvhd","trak","mvex","lastSample","GLOBAL_TIMESCALE","nextTrackId","needsU64","u32OrU64","track","tkhd","mdia","durationInGlobalTimescale","mdhd","hdlr","minf","localDuration","componentSubtype","vmhd","smhd","dinf","stbl","dref","needsCtts","stsd","stts","stss","stsc","stsz","stco","ctts","videoSampleDescription","VIDEO_CODEC_TO_BOX_NAME","soundSampleDescription","AUDIO_CODEC_TO_BOX_NAME","compressionType","VIDEO_CODEC_TO_CONFIGURATION_BOX","colr","COLOR_PRIMARIES_MAP","TRANSFER_CHARACTERISTICS_MAP","MATRIX_COEFFICIENTS_MAP","avcC","hvcC","vpcC","decoderConfig","parts","profile","level","thirdByte","av1C","firstByte","AUDIO_CODEC_TO_CONFIGURATION_BOX","esds","description","dOps","preskip","gain","_a","view2","keySamples","trex","moof","sequenceNumber","mfhd","traf","fragmentSampleFlags","byte1","byte2","byte3","byte4","sampleIsDifferenceSample","tfhd","tfdt","trun","tfFlags","referenceSample","referenceSampleInfo","allSampleDurations","allSampleSizes","allSampleFlags","allSampleCompositionTimeOffsets","uniqueSampleDurations","uniqueSampleSizes","uniqueSampleFlags","uniqueSampleCompositionTimeOffsets","firstSampleFlagsPresent","sampleDurationPresent","sampleSizePresent","sampleFlagsPresent","sampleCompositionTimeOffsetsPresent","mfra","tfra","mfro","trackIndex","chunk","Target","ArrayBufferTarget","StreamTarget","FileSystemWritableFileStreamTarget","stream","_helper","_helperView","Writer","newPos","box2","startPos","child","endPos","_target","_buffer","_bytes","_maxPos","_ensureSize","ensureSize_fn","ArrayBufferTargetWriter","newLength","newBuffer","newBytes","DEFAULT_CHUNK_SIZE","MAX_CHUNKS_AT_ONCE","_target2","_sections","_chunked","_chunkSize","_chunks","_writeDataIntoChunks","writeDataIntoChunks_fn","_insertSectionIntoChunk","insertSectionIntoChunk_fn","_createChunk","createChunk_fn","_flushChunks","flushChunks_fn","StreamTargetWriter","_b","chunks","sorted","lastChunk","section","position","chunkIndex","relativePosition","toWrite","low","high","mid","includesPosition","force","FileSystemWritableFileStreamTargetWriter","SUPPORTED_VIDEO_CODECS","SUPPORTED_AUDIO_CODECS","TIMESTAMP_OFFSET","FIRST_TIMESTAMP_BEHAVIORS","_options","_writer","_ftypSize","_mdat","_videoTrack","_audioTrack","_creationTime","_finalizedChunks","_nextFragmentNumber","_videoSampleQueue","_audioSampleQueue","_finalized","_validateOptions","validateOptions_fn","_writeHeader","writeHeader_fn","_computeMoovSizeUpperBound","computeMoovSizeUpperBound_fn","_prepareTracks","prepareTracks_fn","_generateMpeg4AudioSpecificConfig","generateMpeg4AudioSpecificConfig_fn","_createSampleForTrack","createSampleForTrack_fn","_addSampleToTrack","addSampleToTrack_fn","_validateTimestamp","validateTimestamp_fn","_finalizeCurrentChunk","finalizeCurrentChunk_fn","_finalizeFragment","finalizeFragment_fn","_maybeFlushStreamingTargetWriter","maybeFlushStreamingTargetWriter_fn","_ensureNotFinalized","ensureNotFinalized_fn","Muxer","timestamp","compositionTimeOffset","videoSample","audioSample","mdatSize","movieBox2","movieBoxSize","currentChunkPos","movieBox","mfraBox","mfraBoxSize","mdatPos","remainingBytes","videoRotation","moovSizeUpperBound","upperBound","sampleCounts","guessedCodecPrivate","objectType","sampleRate","numberOfChannels","frequencyIndex","channelConfig","configBits","paddingLength","configBytes","presentationTimestampInSeconds","decodeTimestampInSeconds","durationInSeconds","adjusted","sampleCompositionTimeOffset","timescaleUnits","lastTableEntry","lastCompositionTimeOffsetTableEntry","beginNewChunk","currentChunkDuration","mostImportantTrack","chunkDuration","presentationTimestamp","decodeTimestamp","strictTimestampBehavior","noLastDecodeTimestamp","baseDecodeTimestamp","flushStreamingWriter","fragmentNumber","moofOffset","moofBox","mdatBox","totalTrackSampleSize","newMoofBox","EBMLFloat32","EBMLFloat64","measureUnsignedInt","measureEBMLVarInt","readBits","byteIndex","byte","bitIndex","bit","writeBits","_writeByte","writeByte_fn","_writeFloat32","writeFloat32_fn","_writeFloat64","writeFloat64_fn","_writeUnsignedInt","writeUnsignedInt_fn","_writeString","writeString_fn","pos","elem","sizePos","sizeSize","_trackingWrites","_trackedWrites","_trackedStart","_trackedEnd","BaseStreamTargetWriter","neededSize","copy","_lastFlushEnd","_ensureMonotonicity","ensureMonotonicity","VIDEO_TRACK_NUMBER","AUDIO_TRACK_NUMBER","SUBTITLE_TRACK_NUMBER","VIDEO_TRACK_TYPE","AUDIO_TRACK_TYPE","SUBTITLE_TRACK_TYPE","MAX_CHUNK_LENGTH_MS","CODEC_PRIVATE_MAX_SIZE","APP_NAME","SEGMENT_SIZE_BYTES","CLUSTER_SIZE_BYTES","_segment","_segmentInfo","_seekHead","_tracksElement","_segmentDuration","_colourElement","_videoCodecPrivate","_audioCodecPrivate","_subtitleCodecPrivate","_cues","_currentCluster","_currentClusterTimestamp","_duration","_videoChunkQueue","_audioChunkQueue","_subtitleChunkQueue","_firstVideoTimestamp","_firstAudioTimestamp","_lastVideoTimestamp","_lastAudioTimestamp","_lastSubtitleTimestamp","_colorSpace","_createFileHeader","createFileHeader_fn","_writeEBMLHeader","writeEBMLHeader_fn","_createCodecPrivatePlaceholders","createCodecPrivatePlaceholders_fn","_createColourElement","createColourElement_fn","_createSeekHead","createSeekHead_fn","_createSegmentInfo","createSegmentInfo_fn","_createTracks","createTracks_fn","_createSegment","createSegment_fn","_createCues","createCues_fn","_segmentDataOffset","segmentDataOffset_get","_writeVideoDecoderConfig","writeVideoDecoderConfig_fn","_fixVP9ColorSpace","fixVP9ColorSpace_fn","_writeSubtitleChunks","writeSubtitleChunks_fn","_createInternalChunk","createInternalChunk_fn","_writeBlock","writeBlock_fn","_createCodecPrivateElement","createCodecPrivateElement_fn","_writeCodecPrivate","writeCodecPrivate_fn","_createNewCluster","createNewCluster_fn","_finalizeCurrentCluster","finalizeCurrentCluster_fn","videoChunk","audioChunk","subtitleChunk","segmentSize","ebmlHeader","kaxCues","kaxInfo","kaxTracks","segmentDuration","segmentInfo","tracksElement","segment","colorSpace","showExistingFrame","frameType","syncCode","colorSpaceID","lastWrittenMediaTimestamp","queue","trackNumber","additions","adjustedTimestamp","lastTimestamp","firstTimestamp","canCreateNewCluster","msTimestamp","relativeTimestamp","shouldCreateNewClusterFromKeyFrame","clusterWouldBeTooLong","prelude","simpleBlock","msDuration","blockGroup","codecPrivateElementSize","voidDataSize","newByteLength","clusterOffsetFromSegment","clusterSize","encodeGIF","buffer","maxColors","hasWebCodecs","WEB_CODEC_CANDIDATES","MP4_CODEC_MAP","WEBM_CODEC_MAP","muxerCodec","codecString","prefix","pickWebCodec","bitrate","codec","hint","encodeVideoWebCodecs","Mp4Target","WebMTarget","muxerCodecId","muxer","Mp4Muxer","WebMMuxer","firstError","encoder","baseConfig","configAttempts","chosenConfig","attempt","usPerFrame","keyEvery","MAX_QUEUED","frame","MR_MIME","pickMrMime","order","encodeVideoMediaRecorder","requested","picked","recOpts","recorder","interval","tick","encodeVideo","t0","ms","err","encodeAnimatedWebP","frames","clamp01","loopCount","frameDurationMs","assertWebPEncodingSupported","scratch","sctx","imageData","frameSubChunks","canvasToWebPBlob","extractVP8","inner","concat","makeChunk","writeVP8X","writeANIM","sub","writeANMF","out","writeAscii","writeUint32LE","probe","readUint32LE","padded","buf","writeUint24LE","writeUint16LE","durationMs","subChunk","hdr","padBytes","arrays","CANDIDATES","pickMime","preferred","VideoRecorder","attachVideoRecorder","needsScale","origStop","restored","resolveGeometry","source","attachGeometryExports","geom","_styleInjected","injectStyles","css","IMAGE_FORMATS","WEBGL_FORMATS","VIDEO_FORMATS","SCALE_OPTIONS","SCALE_APPLIES_TO_IMAGE","PLAY_ICON","PAUSE_ICON","PANEL_HTML","ExportPanel","imageFormats","optionsHTML","tab","btn","enabled","tag","elapsed","tail","wasState","hasRecording","formLocked","encoding","PREVIEW_MAX","srcW","srcH","idx","frameMs","clearAfter","origX","origY","dragging","onMove","onUp","attachGUI","panel","p5ExportAddon","patchGraphicsRandom","registerP5OneX","p5Ctor","reg","event","scheduleP5OneXAutoGUI","register","tryAutoRegister","tryModuleAutoRegister"],"mappings":"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","x_google_ignoreList":[4,8,11,12]}
1
+ {"version":3,"file":"p5.export.min.js","sources":["../src/utils/download.js","../src/utils/canvas.js","../src/utils/scale.js","../src/exporters/image.js","../node_modules/canvas2svg/canvas2svg.js","../src/exporters/pattern-plugin.js","../src/exporters/svg.js","../src/exporters/pdf.js","../node_modules/gifenc/dist/gifenc.esm.js","../src/exporters/gif.js","../src/recording/buffer.js","../node_modules/mp4-muxer/build/mp4-muxer.mjs","../node_modules/webm-muxer/build/webm-muxer.mjs","../src/recording/encoders.js","../src/recording/webp.js","../src/exporters/video.js","../src/exporters/geometry.js","../src/gui.js","../src/index.js"],"sourcesContent":["/**\n * Trigger a browser download for a Blob. The temporary anchor is removed\n * synchronously after click; the object URL is revoked on the next tick.\n *\n * @param {Blob} blob\n * @param {string} filename\n */\nexport function downloadBlob(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\n/**\n * Stamp a filename with the current timestamp when the user didn't supply\n * one. Format: `sketch-2026-05-10T12-34-56.png`.\n */\nexport function defaultFilename(ext, base = 'sketch') {\n const ts = new Date().toISOString().replace(/[:.]/g, '-').replace(/Z$/, '');\n return `${base}-${ts}.${ext}`;\n}\n\n/**\n * Append `.ext` if the user-supplied name doesn't already end in it.\n */\nexport function ensureExt(filename, ext) {\n const lower = filename.toLowerCase();\n return lower.endsWith('.' + ext.toLowerCase()) ? filename : `${filename}.${ext}`;\n}\n","/**\n * Resolve the underlying HTMLCanvasElement from a p5 instance, regardless of\n * whether the user is in global or instance mode and whether they passed in\n * a p5.Graphics object.\n *\n * @param {any} p p5 instance, p5.Graphics, or HTMLCanvasElement\n */\nexport function getCanvas(p) {\n if (!p) return getGlobalCanvas();\n if (p instanceof HTMLCanvasElement) return p;\n // p5.Graphics / p5 instance both expose .elt or .canvas\n if (p.canvas instanceof HTMLCanvasElement) return p.canvas;\n if (p.elt instanceof HTMLCanvasElement) return p.elt;\n // Fall through — try the global\n return getGlobalCanvas();\n}\n\nfunction getGlobalCanvas() {\n // In global mode, p5 stores the active canvas on the window-bound _renderer.\n // The safest cross-version path: query the DOM for the canvas p5 creates.\n const fromP5 = document.querySelector('canvas.p5Canvas');\n if (fromP5) return fromP5;\n // Last resort\n return document.querySelector('canvas');\n}\n\n/** True iff the active renderer is WebGL (so 2D-only exports should bail). */\nexport function isWebGL(p) {\n if (!p) return false;\n const r = p._renderer;\n if (!r) return false;\n // p5 2.0 stores a `drawingContext` getter that returns the WebGL ctx.\n const ctx = r.drawingContext;\n if (ctx && typeof ctx.fillRect !== 'function') return true;\n // p5 1.x also has `GL` on the renderer for WebGL.\n if (r.GL) return true;\n return false;\n}\n","import { getCanvas } from './canvas.js';\n\nconst RASTER_MIME = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n};\n\n/**\n * High-res raster export that REPLAYS the recorded drawing-context op log\n * onto an offscreen canvas at the target resolution. Because we replay\n * historical ops — not a single fresh draw() — accumulated state is\n * preserved at any scale: trails, fading overlays, layered alpha all\n * survive. Returns `null` if no recorder is installed (e.g. WebGL sketch\n * or the recorder hasn't started yet), letting the caller fall back to\n * the pixelDensity-redraw path.\n *\n * We scale the `setTransform` matrices by `scale / origPD` during replay\n * so paths, text, and stroke widths render at the higher resolution\n * instead of being upsampled bitmaps.\n *\n * @param {*} p p5 instance\n * @param {number} scale target pixelDensity (must be > origPD to be useful)\n * @param {'png'|'jpg'|'jpeg'|'webp'} format\n * @param {number} [quality]\n * @returns {Promise<Blob | null>}\n */\nexport async function highResViaReplay(p, scale, format, quality) {\n const rec = p && p._p5ExportSVGRecorder;\n if (!rec || !rec.ops || rec.ops.length === 0) return null;\n const canvas = getCanvas(p);\n if (!canvas) return null;\n\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n // Logical canvas size (what the user sees in CSS pixels).\n const logicalW = Math.max(1, Math.round(canvas.width / origPD));\n const logicalH = Math.max(1, Math.round(canvas.height / origPD));\n const targetW = logicalW * scale;\n const targetH = logicalH * scale;\n\n const off = document.createElement('canvas');\n off.width = targetW;\n off.height = targetH;\n const ctx = off.getContext('2d');\n if (!ctx) return null;\n\n // Recorded ops are in coordinate spaces shaped by p5's setTransform(pd,…)\n // each frame. Multiply those matrices by the ratio scale/origPD so the\n // same logical drawing lands at scale × the size on our larger canvas.\n const sf = scale / origPD;\n const ops = rec.ops;\n\n for (let i = 0; i < ops.length; i++) {\n const op = ops[i];\n try {\n if (op[0] === 0) {\n const name = op[1];\n if (name === 'setTransform') {\n const a = op[2];\n ctx.setTransform(a[0] * sf, a[1] * sf, a[2] * sf, a[3] * sf, a[4] * sf, a[5] * sf);\n } else {\n ctx[name](...op[2]);\n }\n } else {\n ctx[op[1]] = op[2];\n }\n } catch (_) {\n // Some ops (gradients, patterns, ImageBitmaps bound to the original\n // ctx) won't replay onto a fresh ctx. Skip rather than abort the\n // whole export — most sketches won't hit any of these.\n }\n }\n\n const mime = RASTER_MIME[format] || 'image/png';\n return new Promise((resolve, reject) => {\n off.toBlob(\n (b) => b ? resolve(b) : reject(new Error('[p5.export] toBlob returned null')),\n mime,\n quality\n );\n });\n}\n\n/**\n * Render the sketch at a different `pixelDensity` for the duration of an\n * async operation, then restore. This is the FALLBACK high-res path —\n * used when the op-replay path isn't available (no recorder, e.g. WebGL).\n * The sketch literally redraws into a 2×/3×/4× backing store, so paths,\n * text, and edges are rendered at the higher resolution.\n *\n * IMPORTANT: scales ≤ 1 are a NO-OP. We do not change pixelDensity, do not\n * call redraw(), and do not pause the loop — we just snapshot whatever the\n * canvas currently shows. This is what users want by default: a PNG that\n * looks like what's on the screen, including any accumulated state from\n * sketches that paint a semi-transparent overlay each frame to build up\n * trails. Resetting the pixel density would resize the backing store,\n * wipe those accumulated pixels, and replace them with a single fresh\n * frame — which is the bug you'd see as \"missing background and traces\".\n *\n * For upscales (scale > 1), the trade-off is real: the redraw resets the\n * canvas, so accumulated trails are lost. The user explicitly asked for\n * the higher-resolution render and accepts that.\n *\n * @template T\n * @param {*} p p5 instance\n * @param {number} scale 1 | 2 | 3 | 4 — interpreted as the target pixelDensity\n * @param {() => (Promise<T> | T)} fn\n * @returns {Promise<T>}\n */\nexport async function withPixelDensity(p, scale, fn) {\n // 1× or unspecified: snapshot the canvas as-is. Preserves trails.\n if (!scale || scale <= 1) return fn();\n\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n // Canvas is already at (or above) the requested density — no reason to\n // redraw and lose accumulated state.\n if (scale <= origPD) return fn();\n\n const wasLooping = typeof p.isLooping === 'function' ? p.isLooping() : true;\n if (wasLooping && typeof p.noLoop === 'function') p.noLoop();\n\n try {\n p.pixelDensity(scale);\n // p5.js 2.0's redraw() is async — await it so the canvas reflects the\n // higher-density render before we read pixels.\n if (typeof p.redraw === 'function') await p.redraw();\n await new Promise((r) => requestAnimationFrame(r));\n return await fn();\n } finally {\n p.pixelDensity(origPD);\n if (typeof p.redraw === 'function') await p.redraw();\n if (wasLooping && typeof p.loop === 'function') p.loop();\n }\n}\n","import { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { withPixelDensity, highResViaReplay } from '../utils/scale.js';\n\nconst MIME = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n webp: 'image/webp'\n};\n\n/**\n * Snapshot the current canvas to a Blob and return it. Does not trigger\n * a download.\n *\n * @param {any} p p5 instance (or omit for global mode)\n * @param {'png'|'jpg'|'webp'} format\n * @param {number} [quality] 0..1, applied to jpg/webp only\n * @returns {Promise<Blob>}\n */\nexport function canvasToBlob(p, format, quality) {\n const canvas = getCanvas(p);\n if (!canvas) return Promise.reject(new Error('[p5.export] no canvas found'));\n const mime = MIME[format];\n if (!mime) return Promise.reject(new Error(`[p5.export] unknown image format: ${format}`));\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => (blob ? resolve(blob) : reject(new Error('[p5.export] toBlob returned null'))),\n mime,\n quality\n );\n });\n}\n\n/**\n * Capture a snapshot at a target scale. Decision tree:\n *\n * scale unset / ≤ 1 → snapshot the live canvas (preserves trails)\n * scale ≤ origPD → snapshot the live canvas (already enough res)\n * scale > origPD AND recorder available\n * → REPLAY recorded ops onto an offscreen at\n * scale × logical size (preserves trails AND\n * renders sharp at the target resolution)\n * scale > origPD AND no recorder\n * → fallback: redraw via withPixelDensity (loses\n * trails, but at least gives true high-res\n * output for WebGL / pre-recorder sketches)\n */\nasync function snapshotAtScale(p, scale, format, quality) {\n if (!scale || scale <= 1) return canvasToBlob(p, format, quality);\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n if (scale <= origPD) return canvasToBlob(p, format, quality);\n\n // Try the trail-preserving op-replay path first.\n const replayed = await highResViaReplay(p, scale, format, quality);\n if (replayed) return replayed;\n\n // Fallback: re-render at higher pixelDensity. Trails lost.\n return withPixelDensity(p, scale, () => canvasToBlob(p, format, quality));\n}\n\nexport function attachImageExports(p5, fn) {\n /**\n * Save the current canvas as a PNG.\n * @param {string} [filename]\n * @param {{scale?: number}} [opts] scale = pixelDensity to render at (1..4)\n */\n fn.savePNG = async function (filename, opts = {}) {\n const blob = await snapshotAtScale(this, opts.scale, 'png');\n downloadBlob(blob, filename ? ensureExt(filename, 'png') : defaultFilename('png'));\n return blob;\n };\n\n /**\n * Save the current canvas as a JPEG.\n * @param {string} [filename]\n * @param {{scale?: number, quality?: number}} [opts] quality 0..1 (default 0.92)\n */\n fn.saveJPG = async function (filename, opts = {}) {\n const quality = opts.quality ?? 0.92;\n const blob = await snapshotAtScale(this, opts.scale, 'jpg', quality);\n downloadBlob(blob, filename ? ensureExt(filename, 'jpg') : defaultFilename('jpg'));\n return blob;\n };\n fn.saveJPEG = fn.saveJPG;\n\n /**\n * Save the current canvas as a WebP.\n * @param {string} [filename]\n * @param {{scale?: number, quality?: number}} [opts]\n */\n fn.saveWebP = async function (filename, opts = {}) {\n const quality = opts.quality ?? 0.92;\n const blob = await snapshotAtScale(this, opts.scale, 'webp', quality);\n downloadBlob(blob, filename ? ensureExt(filename, 'webp') : defaultFilename('webp'));\n return blob;\n };\n\n /**\n * Generic \"save image\" — picks the encoder from the format string.\n * @param {'png'|'jpg'|'webp'} format\n * @param {string} [filename]\n * @param {{scale?: number, quality?: number}} [opts]\n */\n fn.saveImage = async function (format, filename, opts = {}) {\n format = (format || 'png').toLowerCase();\n if (format === 'jpeg') format = 'jpg';\n const blob = await snapshotAtScale(this, opts.scale, format, opts.quality);\n downloadBlob(blob, filename ? ensureExt(filename, format) : defaultFilename(format));\n return blob;\n };\n}\n","/*!!\n * Canvas 2 Svg v1.0.15\n * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document.\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n * Author:\n * Kerry Liu\n *\n * Copyright (c) 2014 Gliffy Inc.\n */\n\n;(function() {\n \"use strict\";\n\n var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities;\n\n //helper function to format a string\n function format(str, args) {\n var keys = Object.keys(args), i;\n for (i=0; i<keys.length; i++) {\n str = str.replace(new RegExp(\"\\\\{\" + keys[i] + \"\\\\}\", \"gi\"), args[keys[i]]);\n }\n return str;\n }\n\n //helper function that generates a random string\n function randomString(holder) {\n var chars, randomstring, i;\n if (!holder) {\n throw new Error(\"cannot create a random attribute name for an undefined object\");\n }\n chars = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\";\n randomstring = \"\";\n do {\n randomstring = \"\";\n for (i = 0; i < 12; i++) {\n randomstring += chars[Math.floor(Math.random() * chars.length)];\n }\n } while (holder[randomstring]);\n return randomstring;\n }\n\n //helper function to map named to numbered entities\n function createNamedToNumberedLookup(items, radix) {\n var i, entity, lookup = {}, base10, base16;\n items = items.split(',');\n radix = radix || 10;\n // Map from named to numbered entities.\n for (i = 0; i < items.length; i += 2) {\n entity = '&' + items[i + 1] + ';';\n base10 = parseInt(items[i], radix);\n lookup[entity] = '&#'+base10+';';\n }\n //FF and IE need to create a regex from hex values ie &nbsp; == \\xa0\n lookup[\"\\\\xa0\"] = '&#160;';\n return lookup;\n }\n\n //helper function to map canvas-textAlign to svg-textAnchor\n function getTextAnchor(textAlign) {\n //TODO: support rtl languages\n var mapping = {\"left\":\"start\", \"right\":\"end\", \"center\":\"middle\", \"start\":\"start\", \"end\":\"end\"};\n return mapping[textAlign] || mapping.start;\n }\n\n //helper function to map canvas-textBaseline to svg-dominantBaseline\n function getDominantBaseline(textBaseline) {\n //INFO: not supported in all browsers\n var mapping = {\"alphabetic\": \"alphabetic\", \"hanging\": \"hanging\", \"top\":\"text-before-edge\", \"bottom\":\"text-after-edge\", \"middle\":\"central\"};\n return mapping[textBaseline] || mapping.alphabetic;\n }\n\n // Unpack entities lookup where the numbers are in radix 32 to reduce the size\n // entity mapping courtesy of tinymce\n namedEntities = createNamedToNumberedLookup(\n '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' +\n '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' +\n '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' +\n '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' +\n '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' +\n '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' +\n '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' +\n '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' +\n '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' +\n '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' +\n 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' +\n 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' +\n 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' +\n 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' +\n 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' +\n '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' +\n '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' +\n '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' +\n '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' +\n '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' +\n 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' +\n 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' +\n 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' +\n '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' +\n '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32);\n\n\n //Some basic mappings for attributes and default values.\n STYLES = {\n \"strokeStyle\":{\n svgAttr : \"stroke\", //corresponding svg attribute\n canvas : \"#000000\", //canvas default\n svg : \"none\", //svg default\n apply : \"stroke\" //apply on stroke() or fill()\n },\n \"fillStyle\":{\n svgAttr : \"fill\",\n canvas : \"#000000\",\n svg : null, //svg default is black, but we need to special case this to handle canvas stroke without fill\n apply : \"fill\"\n },\n \"lineCap\":{\n svgAttr : \"stroke-linecap\",\n canvas : \"butt\",\n svg : \"butt\",\n apply : \"stroke\"\n },\n \"lineJoin\":{\n svgAttr : \"stroke-linejoin\",\n canvas : \"miter\",\n svg : \"miter\",\n apply : \"stroke\"\n },\n \"miterLimit\":{\n svgAttr : \"stroke-miterlimit\",\n canvas : 10,\n svg : 4,\n apply : \"stroke\"\n },\n \"lineWidth\":{\n svgAttr : \"stroke-width\",\n canvas : 1,\n svg : 1,\n apply : \"stroke\"\n },\n \"globalAlpha\": {\n svgAttr : \"opacity\",\n canvas : 1,\n svg : 1,\n apply : \"fill stroke\"\n },\n \"font\":{\n //font converts to multiple svg attributes, there is custom logic for this\n canvas : \"10px sans-serif\"\n },\n \"shadowColor\":{\n canvas : \"#000000\"\n },\n \"shadowOffsetX\":{\n canvas : 0\n },\n \"shadowOffsetY\":{\n canvas : 0\n },\n \"shadowBlur\":{\n canvas : 0\n },\n \"textAlign\":{\n canvas : \"start\"\n },\n \"textBaseline\":{\n canvas : \"alphabetic\"\n }\n };\n\n /**\n *\n * @param gradientNode - reference to the gradient\n * @constructor\n */\n CanvasGradient = function(gradientNode, ctx) {\n this.__root = gradientNode;\n this.__ctx = ctx;\n };\n\n /**\n * Adds a color stop to the gradient root\n */\n CanvasGradient.prototype.addColorStop = function(offset, color) {\n var stop = this.__ctx.__createElement(\"stop\"), regex, matches;\n stop.setAttribute(\"offset\", offset);\n if(color.indexOf(\"rgba\") !== -1) {\n //separate alpha value, since webkit can't handle it\n regex = /rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?\\.?\\d*)\\s*\\)/gi;\n matches = regex.exec(color);\n stop.setAttribute(\"stop-color\", format(\"rgb({r},{g},{b})\", {r:matches[1], g:matches[2], b:matches[3]}));\n stop.setAttribute(\"stop-opacity\", matches[4]);\n } else {\n stop.setAttribute(\"stop-color\", color);\n }\n this.__root.appendChild(stop);\n };\n\n CanvasPattern = function(pattern, ctx) {\n this.__root = pattern;\n this.__ctx = ctx;\n };\n\n /**\n * The mock canvas context\n * @param o - options include:\n * width - width of your canvas (defaults to 500)\n * height - height of your canvas (defaults to 500)\n * enableMirroring - enables canvas mirroring (get image data) (defaults to false)\n * document - the document object (defaults to the current document)\n */\n ctx = function(o) {\n\n var defaultOptions = { width:500, height:500, enableMirroring : false}, options;\n\n //keep support for this way of calling C2S: new C2S(width,height)\n if(arguments.length > 1) {\n options = defaultOptions;\n options.width = arguments[0];\n options.height = arguments[1];\n } else if( !o ) {\n options = defaultOptions;\n } else {\n options = o;\n }\n\n if(!(this instanceof ctx)) {\n //did someone call this without new?\n return new ctx(options);\n }\n\n //setup options\n this.width = options.width || defaultOptions.width;\n this.height = options.height || defaultOptions.height;\n this.enableMirroring = options.enableMirroring !== undefined ? options.enableMirroring : defaultOptions.enableMirroring;\n\n this.canvas = this; ///point back to this instance!\n this.__document = options.document || document;\n this.__canvas = this.__document.createElement(\"canvas\");\n this.__ctx = this.__canvas.getContext(\"2d\");\n\n this.__setDefaultStyles();\n this.__stack = [this.__getStyleState()];\n this.__groupStack = [];\n\n //the root svg element\n this.__root = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n this.__root.setAttribute(\"version\", 1.1);\n this.__root.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n this.__root.setAttributeNS(\"http://www.w3.org/2000/xmlns/\", \"xmlns:xlink\", \"http://www.w3.org/1999/xlink\");\n this.__root.setAttribute(\"width\", this.width);\n this.__root.setAttribute(\"height\", this.height);\n\n //make sure we don't generate the same ids in defs\n this.__ids = {};\n\n //defs tag\n this.__defs = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n this.__root.appendChild(this.__defs);\n\n //also add a group child. the svg element can't use the transform attribute\n this.__currentElement = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n this.__root.appendChild(this.__currentElement);\n };\n\n\n /**\n * Creates the specified svg element\n * @private\n */\n ctx.prototype.__createElement = function (elementName, properties, resetFill) {\n if (typeof properties === \"undefined\") {\n properties = {};\n }\n\n var element = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", elementName),\n keys = Object.keys(properties), i, key;\n if(resetFill) {\n //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black.\n element.setAttribute(\"fill\", \"none\");\n element.setAttribute(\"stroke\", \"none\");\n }\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n element.setAttribute(key, properties[key]);\n }\n return element;\n };\n\n /**\n * Applies default canvas styles to the context\n * @private\n */\n ctx.prototype.__setDefaultStyles = function() {\n //default 2d canvas context properties see:http://www.w3.org/TR/2dcontext/\n var keys = Object.keys(STYLES), i, key;\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n this[key] = STYLES[key].canvas;\n }\n };\n\n /**\n * Applies styles on restore\n * @param styleState\n * @private\n */\n ctx.prototype.__applyStyleState = function(styleState) {\n var keys = Object.keys(styleState), i, key;\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n this[key] = styleState[key];\n }\n };\n\n /**\n * Gets the current style state\n * @return {Object}\n * @private\n */\n ctx.prototype.__getStyleState = function() {\n var i, styleState = {}, keys = Object.keys(STYLES), key;\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n styleState[key] = this[key];\n }\n return styleState;\n };\n\n /**\n * Apples the current styles to the current SVG element. On \"ctx.fill\" or \"ctx.stroke\"\n * @param type\n * @private\n */\n ctx.prototype.__applyStyleToCurrentElement = function(type) {\n var keys = Object.keys(STYLES), i, style, value, id, regex, matches;\n for(i=0; i<keys.length; i++) {\n style = STYLES[keys[i]];\n value = this[keys[i]];\n if(style.apply) {\n //is this a gradient or pattern?\n if(style.apply.indexOf(\"fill\")!==-1 && value instanceof CanvasPattern) {\n //pattern\n if(value.__ctx) {\n //copy over defs\n while(value.__ctx.__defs.childNodes.length) {\n id = value.__ctx.__defs.childNodes[0].getAttribute(\"id\");\n this.__ids[id] = id;\n this.__defs.appendChild(value.__ctx.__defs.childNodes[0]);\n }\n }\n this.__currentElement.setAttribute(\"fill\", format(\"url(#{id})\", {id:value.__root.getAttribute(\"id\")}));\n }\n else if(style.apply.indexOf(\"fill\")!==-1 && value instanceof CanvasGradient) {\n //gradient\n this.__currentElement.setAttribute(\"fill\", format(\"url(#{id})\", {id:value.__root.getAttribute(\"id\")}));\n } else if(style.apply.indexOf(type)!==-1 && style.svg !== value) {\n if((style.svgAttr === \"stroke\" || style.svgAttr === \"fill\") && value.indexOf(\"rgba\") !== -1) {\n //separate alpha value, since illustrator can't handle it\n regex = /rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d?\\.?\\d*)\\s*\\)/gi;\n matches = regex.exec(value);\n this.__currentElement.setAttribute(style.svgAttr, format(\"rgb({r},{g},{b})\", {r:matches[1], g:matches[2], b:matches[3]}));\n this.__currentElement.setAttribute(style.svgAttr+\"-opacity\", matches[4]);\n } else {\n //otherwise only update attribute if right type, and not svg default\n this.__currentElement.setAttribute(style.svgAttr, value);\n }\n }\n }\n }\n\n };\n\n /**\n * Will return the closest group or svg node. May return the current element.\n * @private\n */\n ctx.prototype.__closestGroupOrSvg = function(node) {\n node = node || this.__currentElement;\n if(node.nodeName === \"g\" || node.nodeName === \"svg\") {\n return node;\n } else {\n return this.__closestGroupOrSvg(node.parentNode);\n }\n };\n\n /**\n * Returns the serialized value of the svg so far\n * @param fixNamedEntities - Standalone SVG doesn't support named entities, which document.createTextNode encodes.\n * If true, we attempt to find all named entities and encode it as a numeric entity.\n * @return serialized svg\n */\n ctx.prototype.getSerializedSvg = function(fixNamedEntities) {\n var serialized = new XMLSerializer().serializeToString(this.__root),\n keys, i, key, value, regexp, xmlns;\n\n //IE search for a duplicate xmnls because they didn't implement setAttributeNS correctly\n xmlns = /xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg\".+xmlns=\"http:\\/\\/www\\.w3\\.org\\/2000\\/svg/gi;\n if(xmlns.test(serialized)) {\n serialized = serialized.replace('xmlns=\"http://www.w3.org/2000/svg','xmlns:xlink=\"http://www.w3.org/1999/xlink');\n }\n\n if(fixNamedEntities) {\n keys = Object.keys(namedEntities);\n //loop over each named entity and replace with the proper equivalent.\n for(i=0; i<keys.length; i++) {\n key = keys[i];\n value = namedEntities[key];\n regexp = new RegExp(key, \"gi\");\n if(regexp.test(serialized)) {\n serialized = serialized.replace(regexp, value);\n }\n }\n }\n\n return serialized;\n };\n\n\n /**\n * Returns the root svg\n * @return\n */\n ctx.prototype.getSvg = function() {\n return this.__root;\n };\n /**\n * Will generate a group tag.\n */\n ctx.prototype.save = function() {\n var group = this.__createElement(\"g\"), parent = this.__closestGroupOrSvg();\n this.__groupStack.push(parent);\n parent.appendChild(group);\n this.__currentElement = group;\n this.__stack.push(this.__getStyleState());\n };\n /**\n * Sets current element to parent, or just root if already root\n */\n ctx.prototype.restore = function(){\n this.__currentElement = this.__groupStack.pop();\n var state = this.__stack.pop();\n this.__applyStyleState(state);\n\n };\n\n /**\n * Helper method to add transform\n * @private\n */\n ctx.prototype.__addTransform = function(t) {\n\n //if the current element has siblings, add another group\n var parent = this.__closestGroupOrSvg();\n if(parent.childNodes.length > 0) {\n var group = this.__createElement(\"g\");\n parent.appendChild(group);\n this.__currentElement = group;\n }\n\n var transform = this.__currentElement.getAttribute(\"transform\");\n if(transform) {\n transform += \" \";\n } else {\n transform = \"\";\n }\n transform += t;\n this.__currentElement.setAttribute(\"transform\", transform);\n };\n\n /**\n * scales the current element\n */\n ctx.prototype.scale = function(x, y) {\n if(y === undefined) {\n y = x;\n }\n this.__addTransform(format(\"scale({x},{y})\", {x:x, y:y}));\n };\n\n /**\n * rotates the current element\n */\n ctx.prototype.rotate = function(angle){\n var degrees = (angle * 180 / Math.PI);\n this.__addTransform(format(\"rotate({angle},{cx},{cy})\", {angle:degrees, cx:0, cy:0}));\n };\n\n /**\n * translates the current element\n */\n ctx.prototype.translate = function(x, y){\n this.__addTransform(format(\"translate({x},{y})\", {x:x,y:y}));\n };\n\n /**\n * applies a transform to the current element\n */\n ctx.prototype.transform = function(a, b, c, d, e, f){\n this.__addTransform(format(\"matrix({a},{b},{c},{d},{e},{f})\", {a:a, b:b, c:c, d:d, e:e, f:f}));\n };\n\n /**\n * Create a new Path Element\n */\n ctx.prototype.beginPath = function(){\n var path, parent;\n\n // Note that there is only one current default path, it is not part of the drawing state.\n // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path\n this.__currentDefaultPath = \"\";\n this.__currentPosition = {};\n\n path = this.__createElement(\"path\", {}, true);\n parent = this.__closestGroupOrSvg();\n parent.appendChild(path);\n this.__currentElement = path;\n };\n\n /**\n * Helper function to apply currentDefaultPath to current path element\n * @private\n */\n ctx.prototype.__applyCurrentDefaultPath = function() {\n if(this.__currentElement.nodeName === \"path\") {\n var d = this.__currentDefaultPath;\n this.__currentElement.setAttribute(\"d\", d);\n } else {\n throw new Error(\"Attempted to apply path command to node \" + this.__currentElement.nodeName);\n }\n };\n\n /**\n * Helper function to add path command\n * @private\n */\n ctx.prototype.__addPathCommand = function(command){\n this.__currentDefaultPath += \" \";\n this.__currentDefaultPath += command;\n };\n\n /**\n * Adds the move command to the current path element,\n * if the currentPathElement is not empty create a new path element\n */\n ctx.prototype.moveTo = function(x,y){\n if(this.__currentElement.nodeName !== \"path\") {\n this.beginPath();\n }\n\n // creates a new subpath with the given point\n this.__currentPosition = {x: x, y: y};\n this.__addPathCommand(format(\"M {x} {y}\", {x:x, y:y}));\n };\n\n /**\n * Closes the current path\n */\n ctx.prototype.closePath = function(){\n this.__addPathCommand(\"Z\");\n };\n\n /**\n * Adds a line to command\n */\n ctx.prototype.lineTo = function(x, y){\n this.__currentPosition = {x: x, y: y};\n if (this.__currentDefaultPath.indexOf('M') > -1) {\n this.__addPathCommand(format(\"L {x} {y}\", {x:x, y:y}));\n } else {\n this.__addPathCommand(format(\"M {x} {y}\", {x:x, y:y}));\n }\n };\n\n /**\n * Add a bezier command\n */\n ctx.prototype.bezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) {\n this.__currentPosition = {x: x, y: y};\n this.__addPathCommand(format(\"C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}\",\n {cp1x:cp1x, cp1y:cp1y, cp2x:cp2x, cp2y:cp2y, x:x, y:y}));\n };\n\n /**\n * Adds a quadratic curve to command\n */\n ctx.prototype.quadraticCurveTo = function(cpx, cpy, x, y){\n this.__currentPosition = {x: x, y: y};\n this.__addPathCommand(format(\"Q {cpx} {cpy} {x} {y}\", {cpx:cpx, cpy:cpy, x:x, y:y}));\n };\n\n\n /**\n * Return a new normalized vector of given vector\n */\n var normalize = function(vector) {\n var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]);\n return [vector[0] / len, vector[1] / len];\n };\n\n /**\n * Adds the arcTo to the current path\n *\n * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto\n */\n ctx.prototype.arcTo = function(x1, y1, x2, y2, radius) {\n // Let the point (x0, y0) be the last point in the subpath.\n var x0 = this.__currentPosition && this.__currentPosition.x;\n var y0 = this.__currentPosition && this.__currentPosition.y;\n\n // First ensure there is a subpath for (x1, y1).\n if (typeof x0 == \"undefined\" || typeof y0 == \"undefined\") {\n return;\n }\n\n // Negative values for radius must cause the implementation to throw an IndexSizeError exception.\n if (radius < 0) {\n throw new Error(\"IndexSizeError: The radius provided (\" + radius + \") is negative.\");\n }\n\n // If the point (x0, y0) is equal to the point (x1, y1),\n // or if the point (x1, y1) is equal to the point (x2, y2),\n // or if the radius radius is zero,\n // then the method must add the point (x1, y1) to the subpath,\n // and connect that point to the previous point (x0, y0) by a straight line.\n if (((x0 === x1) && (y0 === y1))\n || ((x1 === x2) && (y1 === y2))\n || (radius === 0)) {\n this.lineTo(x1, y1);\n return;\n }\n\n // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line,\n // then the method must add the point (x1, y1) to the subpath,\n // and connect that point to the previous point (x0, y0) by a straight line.\n var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]);\n var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]);\n if (unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === unit_vec_p1_p0[1] * unit_vec_p1_p2[0]) {\n this.lineTo(x1, y1);\n return;\n }\n\n // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius,\n // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1),\n // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2).\n // The points at which this circle touches these two lines are called the start and end tangent points respectively.\n\n // note that both vectors are unit vectors, so the length is 1\n var cos = (unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + unit_vec_p1_p0[1] * unit_vec_p1_p2[1]);\n var theta = Math.acos(Math.abs(cos));\n\n // Calculate origin\n var unit_vec_p1_origin = normalize([\n unit_vec_p1_p0[0] + unit_vec_p1_p2[0],\n unit_vec_p1_p0[1] + unit_vec_p1_p2[1]\n ]);\n var len_p1_origin = radius / Math.sin(theta / 2);\n var x = x1 + len_p1_origin * unit_vec_p1_origin[0];\n var y = y1 + len_p1_origin * unit_vec_p1_origin[1];\n\n // Calculate start angle and end angle\n // rotate 90deg clockwise (note that y axis points to its down)\n var unit_vec_origin_start_tangent = [\n -unit_vec_p1_p0[1],\n unit_vec_p1_p0[0]\n ];\n // rotate 90deg counter clockwise (note that y axis points to its down)\n var unit_vec_origin_end_tangent = [\n unit_vec_p1_p2[1],\n -unit_vec_p1_p2[0]\n ];\n var getAngle = function(vector) {\n // get angle (clockwise) between vector and (1, 0)\n var x = vector[0];\n var y = vector[1];\n if (y >= 0) { // note that y axis points to its down\n return Math.acos(x);\n } else {\n return -Math.acos(x);\n }\n };\n var startAngle = getAngle(unit_vec_origin_start_tangent);\n var endAngle = getAngle(unit_vec_origin_end_tangent);\n\n // Connect the point (x0, y0) to the start tangent point by a straight line\n this.lineTo(x + unit_vec_origin_start_tangent[0] * radius,\n y + unit_vec_origin_start_tangent[1] * radius);\n\n // Connect the start tangent point to the end tangent point by arc\n // and adding the end tangent point to the subpath.\n this.arc(x, y, radius, startAngle, endAngle);\n };\n\n /**\n * Sets the stroke property on the current element\n */\n ctx.prototype.stroke = function(){\n if(this.__currentElement.nodeName === \"path\") {\n this.__currentElement.setAttribute(\"paint-order\", \"fill stroke markers\");\n }\n this.__applyCurrentDefaultPath();\n this.__applyStyleToCurrentElement(\"stroke\");\n };\n\n /**\n * Sets fill properties on the current element\n */\n ctx.prototype.fill = function(){\n if(this.__currentElement.nodeName === \"path\") {\n this.__currentElement.setAttribute(\"paint-order\", \"stroke fill markers\");\n }\n this.__applyCurrentDefaultPath();\n this.__applyStyleToCurrentElement(\"fill\");\n };\n\n /**\n * Adds a rectangle to the path.\n */\n ctx.prototype.rect = function(x, y, width, height){\n if(this.__currentElement.nodeName !== \"path\") {\n this.beginPath();\n }\n this.moveTo(x, y);\n this.lineTo(x+width, y);\n this.lineTo(x+width, y+height);\n this.lineTo(x, y+height);\n this.lineTo(x, y);\n this.closePath();\n };\n\n\n /**\n * adds a rectangle element\n */\n ctx.prototype.fillRect = function(x, y, width, height){\n var rect, parent;\n rect = this.__createElement(\"rect\", {\n x : x,\n y : y,\n width : width,\n height : height\n }, true);\n parent = this.__closestGroupOrSvg();\n parent.appendChild(rect);\n this.__currentElement = rect;\n this.__applyStyleToCurrentElement(\"fill\");\n };\n\n /**\n * Draws a rectangle with no fill\n * @param x\n * @param y\n * @param width\n * @param height\n */\n ctx.prototype.strokeRect = function(x, y, width, height){\n var rect, parent;\n rect = this.__createElement(\"rect\", {\n x : x,\n y : y,\n width : width,\n height : height\n }, true);\n parent = this.__closestGroupOrSvg();\n parent.appendChild(rect);\n this.__currentElement = rect;\n this.__applyStyleToCurrentElement(\"stroke\");\n };\n\n\n /**\n * \"Clears\" a canvas by just drawing a white rectangle in the current group.\n */\n ctx.prototype.clearRect = function(x, y, width, height) {\n var rect, parent = this.__closestGroupOrSvg();\n rect = this.__createElement(\"rect\", {\n x : x,\n y : y,\n width : width,\n height : height,\n fill : \"#FFFFFF\"\n }, true);\n parent.appendChild(rect);\n };\n\n /**\n * Adds a linear gradient to a defs tag.\n * Returns a canvas gradient object that has a reference to it's parent def\n */\n ctx.prototype.createLinearGradient = function(x1, y1, x2, y2){\n var grad = this.__createElement(\"linearGradient\", {\n id : randomString(this.__ids),\n x1 : x1+\"px\",\n x2 : x2+\"px\",\n y1 : y1+\"px\",\n y2 : y2+\"px\",\n \"gradientUnits\" : \"userSpaceOnUse\"\n }, false);\n this.__defs.appendChild(grad);\n return new CanvasGradient(grad, this);\n };\n\n /**\n * Adds a radial gradient to a defs tag.\n * Returns a canvas gradient object that has a reference to it's parent def\n */\n ctx.prototype.createRadialGradient = function(x0, y0, r0, x1, y1, r1){\n var grad = this.__createElement(\"radialGradient\", {\n id : randomString(this.__ids),\n cx : x1+\"px\",\n cy : y1+\"px\",\n r : r1+\"px\",\n fx : x0+\"px\",\n fy : y0+\"px\",\n \"gradientUnits\" : \"userSpaceOnUse\"\n }, false);\n this.__defs.appendChild(grad);\n return new CanvasGradient(grad, this);\n\n };\n\n /**\n * Parses the font string and returns svg mapping\n * @private\n */\n ctx.prototype.__parseFont = function() {\n var regex = /^\\s*(?=(?:(?:[-a-z]+\\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\\1|\\2|\\3)\\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\\d]+(?:\\%|in|[cem]m|ex|p[ctx]))(?:\\s*\\/\\s*(normal|[.\\d]+(?:\\%|in|[cem]m|ex|p[ctx])))?\\s*([-,\\\"\\sa-z]+?)\\s*$/i;\n var fontPart = regex.exec( this.font );\n var data = {\n style : fontPart[1] || 'normal',\n size : fontPart[4] || '10px',\n family : fontPart[6] || 'sans-serif',\n weight: fontPart[3] || 'normal',\n decoration : fontPart[2] || 'normal',\n href : null\n };\n\n //canvas doesn't support underline natively, but we can pass this attribute\n if(this.__fontUnderline === \"underline\") {\n data.decoration = \"underline\";\n }\n\n //canvas also doesn't support linking, but we can pass this as well\n if(this.__fontHref) {\n data.href = this.__fontHref;\n }\n\n return data;\n };\n\n /**\n * Helper to link text fragments\n * @param font\n * @param element\n * @return {*}\n * @private\n */\n ctx.prototype.__wrapTextLink = function(font, element) {\n if(font.href) {\n var a = this.__createElement(\"a\");\n a.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\", font.href);\n a.appendChild(element);\n return a;\n }\n return element;\n };\n\n /**\n * Fills or strokes text\n * @param text\n * @param x\n * @param y\n * @param action - stroke or fill\n * @private\n */\n ctx.prototype.__applyText = function(text, x, y, action) {\n var font = this.__parseFont(),\n parent = this.__closestGroupOrSvg(),\n textElement = this.__createElement(\"text\", {\n \"font-family\" : font.family,\n \"font-size\" : font.size,\n \"font-style\" : font.style,\n \"font-weight\" : font.weight,\n \"text-decoration\" : font.decoration,\n \"x\" : x,\n \"y\" : y,\n \"text-anchor\": getTextAnchor(this.textAlign),\n \"dominant-baseline\": getDominantBaseline(this.textBaseline)\n }, true);\n\n textElement.appendChild(this.__document.createTextNode(text));\n this.__currentElement = textElement;\n this.__applyStyleToCurrentElement(action);\n parent.appendChild(this.__wrapTextLink(font,textElement));\n };\n\n /**\n * Creates a text element\n * @param text\n * @param x\n * @param y\n */\n ctx.prototype.fillText = function(text, x, y){\n this.__applyText(text, x, y, \"fill\");\n };\n\n /**\n * Strokes text\n * @param text\n * @param x\n * @param y\n */\n ctx.prototype.strokeText = function(text, x, y){\n this.__applyText(text, x, y, \"stroke\");\n };\n\n /**\n * No need to implement this for svg.\n * @param text\n * @return {TextMetrics}\n */\n ctx.prototype.measureText = function(text){\n this.__ctx.font = this.font;\n return this.__ctx.measureText(text);\n };\n\n /**\n * Arc command!\n */\n ctx.prototype.arc = function(x, y, radius, startAngle, endAngle, counterClockwise) {\n // in canvas no circle is drawn if no angle is provided.\n if (startAngle === endAngle) {\n return;\n }\n startAngle = startAngle % (2*Math.PI);\n endAngle = endAngle % (2*Math.PI);\n if(startAngle === endAngle) {\n //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle)\n endAngle = ((endAngle + (2*Math.PI)) - 0.001 * (counterClockwise ? -1 : 1)) % (2*Math.PI);\n }\n var endX = x+radius*Math.cos(endAngle),\n endY = y+radius*Math.sin(endAngle),\n startX = x+radius*Math.cos(startAngle),\n startY = y+radius*Math.sin(startAngle),\n sweepFlag = counterClockwise ? 0 : 1,\n largeArcFlag = 0,\n diff = endAngle - startAngle;\n\n // https://github.com/gliffy/canvas2svg/issues/4\n if(diff < 0) {\n diff += 2*Math.PI;\n }\n\n if(counterClockwise) {\n largeArcFlag = diff > Math.PI ? 0 : 1;\n } else {\n largeArcFlag = diff > Math.PI ? 1 : 0;\n }\n\n this.lineTo(startX, startY);\n this.__addPathCommand(format(\"A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}\",\n {rx:radius, ry:radius, xAxisRotation:0, largeArcFlag:largeArcFlag, sweepFlag:sweepFlag, endX:endX, endY:endY}));\n\n this.__currentPosition = {x: endX, y: endY};\n };\n\n /**\n * Generates a ClipPath from the clip command.\n */\n ctx.prototype.clip = function(){\n var group = this.__closestGroupOrSvg(),\n clipPath = this.__createElement(\"clipPath\"),\n id = randomString(this.__ids),\n newGroup = this.__createElement(\"g\");\n\n group.removeChild(this.__currentElement);\n clipPath.setAttribute(\"id\", id);\n clipPath.appendChild(this.__currentElement);\n\n this.__defs.appendChild(clipPath);\n\n //set the clip path to this group\n group.setAttribute(\"clip-path\", format(\"url(#{id})\", {id:id}));\n\n //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations\n // to this path\n group.appendChild(newGroup);\n\n this.__currentElement = newGroup;\n\n };\n\n /**\n * Draws a canvas, image or mock context to this canvas.\n * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support.\n * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage\n */\n ctx.prototype.drawImage = function(){\n //convert arguments to a real array\n var args = Array.prototype.slice.call(arguments),\n image=args[0],\n dx, dy, dw, dh, sx=0, sy=0, sw, sh, parent, svg, defs, group,\n currentElement, svgImage, canvas, context, id;\n\n if(args.length === 3) {\n dx = args[1];\n dy = args[2];\n sw = image.width;\n sh = image.height;\n dw = sw;\n dh = sh;\n } else if(args.length === 5) {\n dx = args[1];\n dy = args[2];\n dw = args[3];\n dh = args[4];\n sw = image.width;\n sh = image.height;\n } else if(args.length === 9) {\n sx = args[1];\n sy = args[2];\n sw = args[3];\n sh = args[4];\n dx = args[5];\n dy = args[6];\n dw = args[7];\n dh = args[8];\n } else {\n throw new Error(\"Inavlid number of arguments passed to drawImage: \" + arguments.length);\n }\n\n parent = this.__closestGroupOrSvg();\n currentElement = this.__currentElement;\n\n if(image instanceof ctx) {\n //canvas2svg mock canvas context. In the future we may want to clone nodes instead.\n //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context.\n svg = image.getSvg();\n defs = svg.childNodes[0];\n while(defs.childNodes.length) {\n id = defs.childNodes[0].getAttribute(\"id\");\n this.__ids[id] = id;\n this.__defs.appendChild(defs.childNodes[0]);\n }\n group = svg.childNodes[1];\n parent.appendChild(group);\n this.__currentElement = group;\n this.translate(dx, dy);\n this.__currentElement = currentElement;\n } else if(image.nodeName === \"CANVAS\" || image.nodeName === \"IMG\") {\n //canvas or image\n svgImage = this.__createElement(\"image\");\n svgImage.setAttribute(\"width\", dw);\n svgImage.setAttribute(\"height\", dh);\n svgImage.setAttribute(\"preserveAspectRatio\", \"none\");\n\n if(sx || sy || sw !== image.width || sh !== image.height) {\n //crop the image using a temporary canvas\n canvas = this.__document.createElement(\"canvas\");\n canvas.width = dw;\n canvas.height = dh;\n context = canvas.getContext(\"2d\");\n context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh);\n image = canvas;\n }\n\n svgImage.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\",\n image.nodeName === \"CANVAS\" ? image.toDataURL() : image.getAttribute(\"src\"));\n parent.appendChild(svgImage);\n this.__currentElement = svgImage;\n this.translate(dx, dy);\n this.__currentElement = currentElement;\n }\n };\n\n /**\n * Generates a pattern tag\n */\n ctx.prototype.createPattern = function(image, repetition){\n var pattern = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"pattern\"), id = randomString(this.__ids),\n img;\n pattern.setAttribute(\"id\", id);\n pattern.setAttribute(\"width\", image.width);\n pattern.setAttribute(\"height\", image.height);\n if(image.nodeName === \"CANVAS\" || image.nodeName === \"IMG\") {\n img = this.__document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\n img.setAttribute(\"width\", image.width);\n img.setAttribute(\"height\", image.height);\n img.setAttributeNS(\"http://www.w3.org/1999/xlink\", \"xlink:href\",\n image.nodeName === \"CANVAS\" ? image.toDataURL() : image.getAttribute(\"src\"));\n pattern.appendChild(img);\n this.__defs.appendChild(pattern);\n } else if(image instanceof ctx) {\n pattern.appendChild(image.__root.childNodes[1]);\n this.__defs.appendChild(pattern);\n }\n return new CanvasPattern(pattern, this);\n };\n\n /**\n * Not yet implemented\n */\n ctx.prototype.drawFocusRing = function(){};\n ctx.prototype.createImageData = function(){};\n ctx.prototype.getImageData = function(){};\n ctx.prototype.putImageData = function(){};\n ctx.prototype.globalCompositeOperation = function(){};\n ctx.prototype.setTransform = function(){};\n\n //add options for alternative namespace\n if (typeof window === \"object\") {\n window.C2S = ctx;\n }\n\n // CommonJS/Browserify\n if (typeof module === \"object\" && typeof module.exports === \"object\") {\n module.exports = ctx;\n }\n\n}());\n","/**\n * p5.pattern (zenozeng/p5.pattern, the SYM380 fork) integration.\n *\n * p5.pattern's drawing functions all share a common shape:\n *\n * `<shape>Pattern(...args)` →\n * _disableColor(this); // transparent fill + no stroke\n * this.<shape>(...args); // invisible path\n * _patternControler.applyPattern(x, y, w, h)\n * // save + clip + many noise ops + restore\n *\n * Because the shape itself is transparent, our SVG export loses it entirely —\n * the only thing visible is the noise pattern, and the only way to capture\n * each call's UNIQUE color/angle gradient is to rasterize it.\n *\n * Strategy: BEFORE the original call we\n * (1) emit a synthetic vector op (type 3) for the shape itself, tagged\n * with a unique `patternId`, so the SVG export draws an editable\n * path/ellipse/polygon at the right place; and\n * (2) open a raster region tagged with the same `patternId` + the shape's\n * bounding box, so the SVG replay knows to allocate ITS OWN canvas\n * for this call, capture only that call's noise output, and emit a\n * per-call `<pattern>` element in `<defs>` referenced by url(#patternId).\n *\n * Result: each rectPattern/ellipsePattern/etc. in the source sketch becomes\n * one `<path fill=\"url(#…)\"/>` + one `<pattern>` in the SVG, with the pattern\n * holding the call's specific colorful gradient rather than a single shared\n * raster of every call combined.\n */\n\nconst TAU = Math.PI * 2;\n\n/** Monotonic counter for unique pattern IDs across a session. */\nlet patternIdCounter = 0;\nfunction nextPatternId() { return `p5ExportPattern_${++patternIdCounter}`; }\n\n/** Pick a representative color from the active gradient palette. Used as a\n * fallback fill for synthetic vectors when no raster pattern is available. */\nfunction pickPaletteColor(inst) {\n const pc = inst._patternControler;\n const palette = pc && Array.isArray(pc.colors) ? pc.colors : null;\n if (!palette || palette.length === 0) return '#888888';\n const c = palette[palette.length - 1];\n return typeof c === 'string' ? c : (c && typeof c.toString === 'function' ? c.toString() : '#888888');\n}\n\n/** Mirror p5.pattern's private _modeAdjust — return the rect-mode-adjusted bbox. */\nfunction modeAdjust(a, b, c, d, mode) {\n if (mode === 'corners') return { x: a, y: b, w: c - a, h: d - b };\n if (mode === 'radius') return { x: a - c, y: b - d, w: 2 * c, h: 2 * d };\n if (mode === 'center') return { x: a - c * 0.5, y: b - d * 0.5, w: c, h: d };\n return { x: a, y: b, w: c, h: d }; // corner\n}\n\nfunction readRectMode(inst) {\n return (inst._renderer && inst._renderer.states && inst._renderer.states.rectMode) || 'corner';\n}\nfunction readEllipseMode(inst) {\n return (inst._renderer && inst._renderer.states && inst._renderer.states.ellipseMode) || 'center';\n}\n\n/** Push a synthetic-vector op onto the SVG recorder. Op kind 3 = \"render\n * this onto c2s ONLY, never into a raster region, and don't touch canvas\". */\nfunction injectVector(inst, name, payload) {\n const rec = inst._p5ExportSVGRecorder;\n if (!rec) return;\n rec.ops.push([3, name, payload]);\n}\n\n/** Push a raster-region begin/end op carrying metadata. */\nfunction injectBeginRaster(inst, meta) {\n const rec = inst._p5ExportSVGRecorder;\n if (!rec) return;\n rec.ops.push([2, 'beginRaster', meta]);\n}\nfunction injectEndRaster(inst) {\n const rec = inst._p5ExportSVGRecorder;\n if (!rec) return;\n rec.ops.push([2, 'endRaster']);\n}\n\n/** Wrap one p5.pattern function. */\nfunction wrap(proto, name, computeShape) {\n const orig = proto[name];\n if (typeof orig !== 'function' || orig.__p5ExportWrapped) return;\n proto[name] = function (...args) {\n let patternId, shape;\n try {\n shape = computeShape(this, args);\n if (shape) {\n patternId = nextPatternId();\n const color = pickPaletteColor(this);\n injectVector(this, shape.kind, { ...shape, color, patternId });\n }\n } catch (_) { /* never block the user's call */ }\n const wrapping = !!this._p5ExportSVGRecorder && !!patternId && !!shape;\n if (wrapping) injectBeginRaster(this, { bbox: shape, patternId });\n try {\n return orig.apply(this, args);\n } finally {\n if (wrapping) injectEndRaster(this);\n }\n };\n proto[name].__p5ExportWrapped = true;\n}\n\n/** Names of every p5.pattern shape function we hook. */\nconst PATTERN_FN_NAMES = [\n 'rectPattern', 'squarePattern',\n 'ellipsePattern', 'circlePattern', 'arcPattern',\n 'trianglePattern', 'quadPattern'\n];\n\n/**\n * Install hooks on every p5.pattern *Pattern function. Idempotent. Returns\n * `true` if p5.pattern was detected and wrapped.\n *\n * IMPORTANT: in p5 2.0 global mode, p5 caches `bind(instance)` copies of\n * every prototype method onto `window` when the instance is constructed\n * (see `bindGlobal` in node_modules/p5/lib/p5.js). That happens BEFORE\n * `presetup` fires, so by the time we run, the global `rectPattern` etc.\n * are already bound to the ORIGINAL prototype methods. Patching the\n * prototype alone leaves those bound globals dangling — we ALSO have to\n * re-bind the window properties.\n */\nexport function wrapPatternPlugin(p5, p5Instance) {\n if (!p5 || !p5.prototype) return false;\n const proto = p5.prototype;\n if (typeof proto.rectPattern !== 'function') return false; // p5.pattern not loaded\n // Install the prototype-level wrap once. The window-global rebind below\n // runs EVERY time, because in p5 1.x global mode the `beforeSetup` hook\n // fires with `this=window` (not the instance), so the FIRST call to\n // wrapPatternPlugin can't reach the instance to perform the rebind. A\n // later call from our createCanvas wrap DOES have the instance and\n // needs to re-bind even though prototype hooks are already installed.\n const alreadyInstalled = !!proto.__p5ExportPatternHooksInstalled;\n if (!alreadyInstalled) proto.__p5ExportPatternHooksInstalled = true;\n\n // Bridge p5 2.0's renderer states → the underscore-prefixed properties\n // that p5.pattern (a p5 1.x plugin) reads directly on the renderer.\n //\n // Only install on p5 2.0+, detected by the presence of a `states` object\n // on the renderer instance (the p5 2.0 architecture). On p5 1.x the\n // underscore properties already exist as plain own/inherited fields on\n // the renderer — defining our own getter would shadow them and\n // overwrite their real values with `undefined`.\n if (p5Instance && p5Instance._renderer && p5Instance._renderer.states) {\n const Renderer = p5.Renderer || p5Instance._renderer.constructor;\n if (Renderer && Renderer.prototype && !Renderer.prototype.__p5ExportModeBridged) {\n Renderer.prototype.__p5ExportModeBridged = true;\n for (const k of ['rectMode', 'ellipseMode', 'imageMode', 'colorMode']) {\n Object.defineProperty(Renderer.prototype, '_' + k, {\n configurable: true,\n get() { return this.states && this.states[k]; },\n set(v) { if (this.states) this.states[k] = v; }\n });\n }\n }\n }\n\n if (!alreadyInstalled) {\n wrap(proto, 'rectPattern', (inst, a) => ({\n kind: 'rect', ...modeAdjust(a[0], a[1], a[2], a[3], readRectMode(inst))\n }));\n wrap(proto, 'squarePattern', (inst, a) => ({\n kind: 'rect', ...modeAdjust(a[0], a[1], a[2], a[2], readRectMode(inst))\n }));\n\n wrap(proto, 'ellipsePattern', (inst, a) => ({\n kind: 'ellipse', ...modeAdjust(a[0], a[1], a[2], a[3], readEllipseMode(inst))\n }));\n wrap(proto, 'circlePattern', (inst, a) => ({\n kind: 'ellipse', ...modeAdjust(a[0], a[1], a[2], a[2], readEllipseMode(inst))\n }));\n\n wrap(proto, 'arcPattern', (inst, a) => ({\n kind: 'ellipse', ...modeAdjust(a[0], a[1], a[2], a[3], readEllipseMode(inst))\n }));\n wrap(proto, 'trianglePattern', (inst, a) => {\n const xs = [a[0], a[2], a[4]], ys = [a[1], a[3], a[5]];\n const minX = Math.min(...xs), maxX = Math.max(...xs);\n const minY = Math.min(...ys), maxY = Math.max(...ys);\n return {\n kind: 'polygon',\n points: [[a[0], a[1]], [a[2], a[3]], [a[4], a[5]]],\n x: minX, y: minY, w: maxX - minX, h: maxY - minY\n };\n });\n wrap(proto, 'quadPattern', (inst, a) => {\n const xs = [a[0], a[2], a[4], a[6]], ys = [a[1], a[3], a[5], a[7]];\n const minX = Math.min(...xs), maxX = Math.max(...xs);\n const minY = Math.min(...ys), maxY = Math.max(...ys);\n return {\n kind: 'polygon',\n points: [[a[0], a[1]], [a[2], a[3]], [a[4], a[5]], [a[6], a[7]]],\n x: minX, y: minY, w: maxX - minX, h: maxY - minY\n };\n });\n }\n\n // Re-bind the window globals. p5 already cached bind(instance) copies of\n // the original (unwrapped) prototype methods on window at construction\n // time — overwrite those bindings so user-level global calls route\n // through our wrap. We use a GETTER (not a value) so the binding stays\n // canonical: every access to `window.rectPattern` resolves to the\n // current `p5.prototype.rectPattern` bound to the instance. This makes\n // the rebind survive p5 1.x's `friendlyBindGlobal` even if that fires\n // AFTER our hook, and lets a write `window.rectPattern = …` (from\n // user code or tests) silently no-op rather than silently un-hooking\n // the patterns. p5 2.0 doesn't need any of this — its bindGlobal runs\n // before user setup, after addons register — but a single, robust path\n // serves both versions.\n const instance =\n (p5Instance && p5Instance._isGlobal && p5Instance) ||\n (typeof window !== 'undefined' && window.p5 && window.p5.instance) ||\n null;\n if (instance && instance._isGlobal && typeof window !== 'undefined') {\n for (const name of PATTERN_FN_NAMES) {\n const protoFn = proto[name];\n if (typeof protoFn !== 'function') continue;\n try {\n // Snapshot the bound wrap once; reuse for every read.\n let boundFn = protoFn.bind(instance);\n Object.defineProperty(window, name, {\n configurable: true,\n enumerable: true,\n get() { return boundFn; },\n set(_v) { /* swallow — keep our hook in place */ }\n });\n } catch (_) { /* getter-only or otherwise locked — just ignore */ }\n }\n }\n\n return true;\n}\n\n/** Legacy shared-pattern ID, used as a fallback for user-invoked\n * beginRasterRegion() without bbox metadata. */\nexport const SHARED_RASTER_PATTERN_ID = 'p5ExportSharedRaster';\n\n/**\n * Render a recorded synthetic-vector op onto a canvas2svg context. Called\n * by replayToSVG when it encounters an op of type 3.\n *\n * Fill resolution:\n * - payload.patternId present → `url(#<patternId>)` (per-call SVG <pattern>\n * emitted in <defs> by the SVG replay loop).\n * - else if useSharedPattern → `url(#p5ExportSharedRaster)` (legacy mode).\n * - else → `payload.color` (a solid palette color).\n */\nexport function replaySyntheticVector(c2s, name, payload, useSharedPattern) {\n if (!payload || !c2s) return;\n const oldFill = c2s.fillStyle;\n if (payload.patternId) {\n c2s.fillStyle = `url(#${payload.patternId})`;\n } else if (useSharedPattern) {\n c2s.fillStyle = `url(#${SHARED_RASTER_PATTERN_ID})`;\n } else {\n c2s.fillStyle = payload.color || '#888';\n }\n try {\n if (name === 'rect') {\n c2s.beginPath();\n c2s.rect(payload.x, payload.y, payload.w, payload.h);\n c2s.fill();\n } else if (name === 'ellipse') {\n const rx = payload.w / 2, ry = payload.h / 2;\n const cx = payload.x + rx, cy = payload.y + ry;\n c2s.beginPath();\n c2s.ellipse(cx, cy, rx, ry, 0, 0, TAU);\n c2s.fill();\n } else if (name === 'polygon') {\n const pts = payload.points || [];\n if (pts.length >= 2) {\n c2s.beginPath();\n c2s.moveTo(pts[0][0], pts[0][1]);\n for (let i = 1; i < pts.length; i++) c2s.lineTo(pts[i][0], pts[i][1]);\n c2s.closePath();\n c2s.fill();\n }\n }\n } finally {\n c2s.fillStyle = oldFill;\n }\n}\n","import C2S from 'canvas2svg';\nimport { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { wrapPatternPlugin, replaySyntheticVector, SHARED_RASTER_PATTERN_ID } from './pattern-plugin.js';\n\n/**\n * SVG export for p5.js 2.0.\n *\n * Strategy: from postsetup onward, we install a Proxy in front of the\n * renderer's `drawingContext`. Every Canvas2D call (`fillRect`, `ellipse`,\n * `setTransform`, …) and every property write (`fillStyle = …`) gets\n * forwarded to the real context AND appended to an op log. When the user\n * calls `saveSVG()` we replay that log into a fresh canvas2svg recorder.\n *\n * The big win: trail/fade sketches that rely on accumulated canvas pixels\n * (e.g., `fill(20, 20, 22, 30); rect(0,0,w,h)`) come out of the export\n * looking just like the on-screen result, because every recorded\n * semi-transparent rect and every recorded circle is replayed in order.\n *\n * Caveats:\n * - P2D sketches only. WebGL falls back to raster-in-SVG.\n * - The op log grows unbounded. Call `clearSVGRecording()` to reset.\n * - CanvasGradient / CanvasPattern objects are tied to the real context\n * and won't replay cleanly on canvas2svg — those frames just get\n * skipped. Solid-color sketches are unaffected.\n */\n\n// canvas2svg 1.0.16 predates several Canvas2D additions p5 2.0 relies on.\n// Patch the missing/broken bits on first use.\nlet _c2sPatched = false;\nfunction patchC2S() {\n if (_c2sPatched) return;\n _c2sPatched = true;\n\n C2S.prototype.setTransform = function (a, b, c, d, e, f) {\n // Where the new transform group lives depends on whether we're inside\n // a save() scope:\n //\n // - At the SVG root (no save): append as a sibling under <svg> so a\n // long trail sketch (one resetMatrix per frame) doesn't ladder the\n // tree N levels deep. setTransforms become siblings — flat tree.\n //\n // - Inside a save() scope: append nested under the current group. p5's\n // `background()` is the canonical case — it does push(); resetMatrix();\n // fillRect(); pop();, all wrapped in save/restore. If setTransform\n // jumped to the root mid-scope, the fillRect group would end up as\n // a LATER root-level sibling and paint on top of every user draw\n // that follows the background's restore.\n const inScope = this.__groupStack && this.__groupStack.length > 0;\n const parent = inScope ? this.__closestGroupOrSvg() : this.__root;\n const group = this.__createElement('g');\n parent.appendChild(group);\n this.__currentElement = group;\n const isIdentity = a === 1 && b === 0 && c === 0 && d === 1 && e === 0 && f === 0;\n if (!isIdentity) {\n this.__currentElement.setAttribute('transform', `matrix(${a},${b},${c},${d},${e},${f})`);\n }\n };\n\n C2S.prototype.resetTransform = function () { this.setTransform(1, 0, 0, 1, 0, 0); };\n\n C2S.prototype.ellipse = function (x, y, rx, ry, rotation, startAngle, endAngle, ccw) {\n if (startAngle === endAngle) return;\n rotation = rotation || 0;\n const TAU = Math.PI * 2;\n startAngle = startAngle % TAU;\n endAngle = endAngle % TAU;\n if (startAngle === endAngle) {\n endAngle = ((endAngle + TAU) - 0.001 * (ccw ? -1 : 1)) % TAU;\n }\n const cosR = Math.cos(rotation), sinR = Math.sin(rotation);\n const toCanvas = (a) => {\n const lx = rx * Math.cos(a), ly = ry * Math.sin(a);\n return { x: x + lx * cosR - ly * sinR, y: y + lx * sinR + ly * cosR };\n };\n const start = toCanvas(startAngle);\n const end = toCanvas(endAngle);\n let diff = endAngle - startAngle;\n if (diff < 0) diff += TAU;\n const sweepFlag = ccw ? 0 : 1;\n const largeArcFlag = ccw ? (diff > Math.PI ? 0 : 1) : (diff > Math.PI ? 1 : 0);\n const rotDeg = rotation * 180 / Math.PI;\n\n this.lineTo(start.x, start.y);\n this.__addPathCommand(\n 'A ' + rx + ' ' + ry + ' ' + rotDeg + ' ' + largeArcFlag + ' ' + sweepFlag + ' ' + end.x + ' ' + end.y\n );\n this.__currentPosition = { x: end.x, y: end.y };\n };\n\n if (typeof C2S.prototype.roundRect !== 'function') {\n C2S.prototype.roundRect = function (x, y, w, h, radii) {\n let tl, tr, br, bl;\n if (typeof radii === 'number') tl = tr = br = bl = radii;\n else if (Array.isArray(radii)) {\n if (radii.length === 1) tl = tr = br = bl = radii[0];\n else if (radii.length === 2) { tl = br = radii[0]; tr = bl = radii[1]; }\n else { [tl, tr, br, bl] = [radii[0], radii[1], radii[2], radii[3] ?? radii[1]]; }\n } else tl = tr = br = bl = 0;\n const max = Math.min(Math.abs(w), Math.abs(h)) / 2;\n tl = Math.min(tl, max); tr = Math.min(tr, max); br = Math.min(br, max); bl = Math.min(bl, max);\n this.moveTo(x + tl, y);\n this.lineTo(x + w - tr, y);\n this.ellipse(x + w - tr, y + tr, tr, tr, 0, -Math.PI / 2, 0);\n this.lineTo(x + w, y + h - br);\n this.ellipse(x + w - br, y + h - br, br, br, 0, 0, Math.PI / 2);\n this.lineTo(x + bl, y + h);\n this.ellipse(x + bl, y + h - bl, bl, bl, 0, Math.PI / 2, Math.PI);\n this.lineTo(x, y + tl);\n this.ellipse(x + tl, y + tl, tl, tl, 0, Math.PI, Math.PI * 1.5);\n };\n }\n\n delete C2S.prototype.globalCompositeOperation;\n\n // Defense in depth: canvas2svg only knows how to split alpha out of\n // `rgba(...)` strings. p5.js 2.0 stringifies semi-transparent colors as\n // 8-digit hex (#RRGGBBAA), which would otherwise land as `fill=\"#1414161E\"`\n // and get rendered as fully opaque black by many viewers (Illustrator,\n // older browsers, anything pre-SVG2). My replay loop normalizes these,\n // but we also wrap canvas2svg's own style-apply method so any code path\n // that bypasses our loop still gets correct fill-opacity output.\n const origApply = C2S.prototype.__applyStyleToCurrentElement;\n const HEX8 = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;\n const hexToRgba = (v) => {\n if (typeof v !== 'string') return v;\n const m = HEX8.exec(v);\n if (!m) return v;\n const a = Math.round((parseInt(m[4], 16) / 255) * 1000) / 1000;\n return `rgba(${parseInt(m[1], 16)},${parseInt(m[2], 16)},${parseInt(m[3], 16)},${a})`;\n };\n C2S.prototype.__applyStyleToCurrentElement = function (type) {\n const origFill = this.fillStyle;\n const origStroke = this.strokeStyle;\n if (typeof origFill === 'string') this.fillStyle = hexToRgba(origFill);\n if (typeof origStroke === 'string') this.strokeStyle = hexToRgba(origStroke);\n try {\n return origApply.call(this, type);\n } finally {\n // Restore the originals so the c2s caller's notion of the current\n // style isn't surprised by our temporary swap.\n this.fillStyle = origFill;\n this.strokeStyle = origStroke;\n }\n };\n}\n\n/**\n * Build a Proxy around the real context. Every method call and every\n * property write is forwarded AND logged. Reads pass through unchanged.\n *\n * Ops are stored as compact tuples `[kind, name, payload]`:\n * kind 0 = method call (payload = args array)\n * kind 1 = property set (payload = value)\n *\n * A sliding window of the last `maxFrames` frames is kept — older ops are\n * dropped at frame boundaries (tracked via the `predraw` lifecycle below).\n * This prevents the op log from growing unbounded on long sketches while\n * still preserving enough trail history to look right for fade sketches.\n * Tune via `fn.setSVGRecordingFrames(n)` or `window.p5ExportConfig.svgMaxFrames`.\n */\nconst DEFAULT_MAX_FRAMES = 60;\n\n// Style properties whose latest value MUST be preserved across trim\n// boundaries. Without this, sketches that set fillStyle once (and rely on\n// p5's _setFill cache to skip subsequent sets) would have their only\n// fillStyle SET op trimmed, leaving canvas2svg to fall back to default\n// black on every trail rect. Same risk for strokeStyle, lineWidth, etc.\nconst PRESERVED_STYLE_PROPS = new Set([\n 'fillStyle', 'strokeStyle', 'lineWidth', 'lineCap', 'lineJoin',\n 'miterLimit', 'globalAlpha', 'font', 'textAlign', 'textBaseline',\n 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'\n]);\n\n// Monotonic ID for SVG gradient/pattern definitions, shared across the\n// session. The actual gradient OBJECTS are mutable (addColorStop), so we\n// keep the parameters/stops in a side table rather than serializing them\n// into the op log; ops just reference the gradient by id.\nlet gradientIdCounter = 0;\nconst GRADIENT_BY_ID = new Map(); // id → { kind, args, stops, id }\nfunction nextGradientId() { return `p5ExportGrad_${++gradientIdCounter}`; }\n\nfunction makeRecorder(realCtx) {\n const ops = [];\n // frameStarts[i] is the index in `ops` where frame i begins.\n // We always keep the current frame's start as the last entry.\n const frameStarts = [0];\n const rec = {\n proxy: null,\n ops,\n maxFrames: DEFAULT_MAX_FRAMES,\n clear() {\n ops.length = 0;\n frameStarts.length = 1;\n frameStarts[0] = 0;\n },\n /**\n * Mark the boundary between two frames. Called from `predraw`. Trims\n * the oldest frame's ops if we've exceeded `maxFrames` — but before\n * each splice, captures the latest value of every preserved style\n * property in the dropped region and re-emits those at the start of\n * the kept region. That guarantees subsequent ops don't lose the\n * fillStyle/strokeStyle/etc. they implicitly depend on.\n */\n markFrameBoundary() {\n if (this.maxFrames === Infinity) {\n frameStarts.push(ops.length);\n return;\n }\n frameStarts.push(ops.length);\n // We allow up to maxFrames completed frames + 1 in-progress.\n while (frameStarts.length > this.maxFrames + 1) {\n const dropTo = frameStarts[1];\n if (dropTo > 0) {\n // Scan the about-to-be-dropped ops for the latest value of each\n // preserved style property — these define the canvas state that\n // the kept ops assume is \"already in place\".\n const lastValue = {};\n for (let i = 0; i < dropTo; i++) {\n const op = ops[i];\n if (op[0] === 1 && PRESERVED_STYLE_PROPS.has(op[1])) {\n lastValue[op[1]] = op[2];\n }\n }\n ops.splice(0, dropTo);\n const carry = [];\n for (const name in lastValue) carry.push([1, name, lastValue[name]]);\n if (carry.length) ops.unshift(...carry);\n // Adjust frameStarts: lost `dropTo` ops, gained `carry.length`.\n const delta = carry.length - dropTo;\n for (let i = 1; i < frameStarts.length; i++) frameStarts[i] += delta;\n }\n frameStarts.shift();\n }\n }\n };\n // Gradient/pattern factories return a CanvasGradient (mutable, addColorStop\n // is called later). We wrap them so we can record the stops as they're\n // added — otherwise the SVG replay has no way to recreate the gradient\n // (the live ctx's gradient object isn't transferable to canvas2svg).\n const GRADIENT_FACTORIES = new Set(['createLinearGradient', 'createRadialGradient', 'createConicGradient']);\n\n const wrapGradient = (grad, kind, args) => {\n if (!grad) return grad;\n const id = nextGradientId();\n const meta = { id, kind, args: Array.from(args), stops: [] };\n GRADIENT_BY_ID.set(id, meta);\n try { grad.__p5ExportGradId = id; } catch (_) { /* sealed object — fine */ }\n return new Proxy(grad, {\n get(t, p) {\n // Escape hatch so the recorder can recover the genuine\n // CanvasGradient — the native `fillStyle`/`strokeStyle` setters\n // reject a Proxy (it fails their internal brand check), which\n // would silently drop every gradient fill.\n if (p === '__p5ExportRealGrad') return t;\n if (p === 'addColorStop' && typeof t[p] === 'function') {\n return function (offset, color) {\n meta.stops.push({ offset, color });\n return t[p].call(t, offset, color);\n };\n }\n const v = t[p];\n return typeof v === 'function' ? v.bind(t) : v;\n }\n });\n };\n\n rec.proxy = new Proxy(realCtx, {\n get(target, prop) {\n const v = target[prop];\n if (typeof v === 'function') {\n return function (...args) {\n ops.push([0, prop, args]);\n const result = v.apply(target, args);\n if (GRADIENT_FACTORIES.has(prop)) {\n return wrapGradient(result, prop, args);\n }\n return result;\n };\n }\n return v;\n },\n set(target, prop, value) {\n // For gradient/pattern values, store the gradient id (not the live\n // object) in the op log so the SVG replay can resolve it to an SVG\n // <linearGradient>/<radialGradient> in defs.\n if ((prop === 'fillStyle' || prop === 'strokeStyle') && value && typeof value === 'object') {\n const id = value.__p5ExportGradId;\n ops.push([1, prop, id ? { __p5ExportGradId: id } : value]);\n // Assign the genuine gradient (unwrapped from our recording\n // Proxy) — the native setter rejects the Proxy itself.\n target[prop] = value.__p5ExportRealGrad || value;\n } else {\n ops.push([1, prop, value]);\n target[prop] = value;\n }\n return true;\n }\n });\n return rec;\n}\n\nfunction isP2DContext(ctx) {\n // 2D contexts have fillRect; WebGL ones don't.\n return !!(ctx && typeof ctx.fillRect === 'function');\n}\n\n/**\n * Install the recording Proxy on the active renderer. Shadow the\n * prototype getter on both the renderer and the p5 instance so p5's\n * internal drawing (and user-level `drawingContext` access) both pass\n * through the proxy.\n */\nfunction installRecorder(p) {\n if (!p || p._p5ExportSVGRecorder) return;\n const renderer = p._renderer;\n if (!renderer) return;\n const real = renderer.drawingContext;\n if (!isP2DContext(real)) return;\n\n const rec = makeRecorder(real);\n // Pick up a user-set default before any draw runs.\n const cfg = (typeof window !== 'undefined' && window.p5ExportConfig) || {};\n if (typeof cfg.svgMaxFrames === 'number') {\n rec.maxFrames = cfg.svgMaxFrames > 0 ? cfg.svgMaxFrames : Infinity;\n }\n p._p5ExportSVGRecorder = rec;\n const desc = { value: rec.proxy, configurable: true, writable: true, enumerable: true };\n Object.defineProperty(renderer, 'drawingContext', desc);\n Object.defineProperty(p, 'drawingContext', desc);\n}\n\n/**\n * canvas2svg only parses `rgba(r,g,b,a)` notation when splitting alpha into\n * a separate `*-opacity` attribute. p5.js 2.0, however, stringifies colors\n * with alpha as 8-digit hex (`#RRGGBBAA`). Without normalization, canvas2svg\n * writes the raw 8-digit hex into the SVG; many viewers (Illustrator, older\n * Inkscape, anything pre-SVG2) interpret that as opaque black, which\n * covers every frame underneath it and erases your trail history.\n */\nfunction normalizeColorForC2S(value) {\n if (typeof value !== 'string') return value;\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(value);\n if (!m) return value;\n const a = parseInt(m[4], 16) / 255;\n return `rgba(${parseInt(m[1], 16)},${parseInt(m[2], 16)},${parseInt(m[3], 16)},${a})`;\n}\n\n/**\n * Color string is fully opaque (alpha === 1).\n * - \"#RGB\", \"#RRGGBB\", \"rgb(...)\" — always opaque\n * - \"#RRGGBBAA\" — opaque iff AA === 0xff\n * - \"rgba(r,g,b,a)\" — opaque iff a >= 1\n * - everything else (named colors, gradients, patterns) — assume opaque\n */\nfunction isOpaqueColor(value) {\n if (typeof value !== 'string') return true;\n // 8-digit hex with explicit alpha\n let m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(value);\n if (m) return parseInt(m[4], 16) === 255;\n // rgba(...) with explicit alpha\n m = /^rgba\\(\\s*[^,]+,\\s*[^,]+,\\s*[^,]+,\\s*([\\d.]+)\\s*\\)$/i.exec(value);\n if (m) return parseFloat(m[1]) >= 1;\n // 4-digit hex with single alpha digit, e.g. \"#abcd\"\n m = /^#[0-9a-f]{3}([0-9a-f])$/i.exec(value);\n if (m) return parseInt(m[1], 16) === 15;\n return true;\n}\n\n/**\n * Find the index of the LAST canvas-clearing operation:\n * - `fillRect(0, 0, W, H)` with an opaque fillStyle, OR\n * - `clearRect(0, 0, W, H)` (always counts — `clear()` in p5).\n *\n * Anything drawn before that clear is invisible in the final composite, so\n * we can drop it. Returns -1 when no clear is in the log.\n */\nfunction findLastOpaqueClear(ops, logicalW, logicalH) {\n let lastClearIdx = -1;\n let curFill = '#000000'; // canvas2svg default\n const tolerance = 0.5;\n let inRaster = false;\n for (let i = 0; i < ops.length; i++) {\n const op = ops[i];\n // Skip ops inside an explicit raster region — those get rasterized at\n // replay time and shouldn't influence the vector clear-trim decision.\n if (op[0] === 2) {\n if (op[1] === 'beginRaster') inRaster = true;\n else if (op[1] === 'endRaster') inRaster = false;\n continue;\n }\n if (inRaster) continue;\n if (op[0] === 1 && op[1] === 'fillStyle') {\n curFill = op[2];\n } else if (op[0] === 0 && (op[1] === 'fillRect' || op[1] === 'clearRect')) {\n const args = op[2];\n const x = args[0], y = args[1], w = args[2], h = args[3];\n const coversCanvas =\n Math.abs(x) <= tolerance &&\n Math.abs(y) <= tolerance &&\n Math.abs(w - logicalW) <= tolerance &&\n Math.abs(h - logicalH) <= tolerance;\n if (coversCanvas && (op[1] === 'clearRect' || isOpaqueColor(curFill))) {\n lastClearIdx = i;\n }\n }\n }\n return lastClearIdx;\n}\n\nfunction replayToSVG(p) {\n patchC2S();\n const rec = p._p5ExportSVGRecorder;\n const w = p.width || 100;\n const h = p.height || 100;\n const c2s = new C2S(w, h);\n c2s.setTransform(1, 0, 0, 1, 0, 0);\n if (!rec) return c2s.getSerializedSvg();\n\n // canvas2svg can't accept a NATIVE CanvasGradient / CanvasPattern as\n // fillStyle (it has its own internal classes for those). For gradients\n // built via `drawingContext.createLinearGradient(…)` etc., the recorder\n // captures the gradient PARAMETERS + addColorStop history in\n // GRADIENT_BY_ID; we materialize them as real SVG `<linearGradient>` /\n // `<radialGradient>` elements in <defs> and reference them via\n // `fill=\"url(#id)\"`. Sketches that use a conic gradient — no SVG\n // equivalent until SVG2 — fall back to the most recent string color.\n let lastStringFill = '#000000';\n let lastStringStroke = '#000000';\n const emittedGradientIds = new Set();\n\n const xmlnsSVG = 'http://www.w3.org/2000/svg';\n\n const emitSvgGradient = (meta) => {\n if (!meta || emittedGradientIds.has(meta.id)) return true;\n const defs = c2s.__defs;\n const doc = c2s.__document;\n let el;\n if (meta.kind === 'createLinearGradient') {\n const [x0, y0, x1, y1] = meta.args;\n el = doc.createElementNS(xmlnsSVG, 'linearGradient');\n el.setAttribute('gradientUnits', 'userSpaceOnUse');\n el.setAttribute('x1', String(x0));\n el.setAttribute('y1', String(y0));\n el.setAttribute('x2', String(x1));\n el.setAttribute('y2', String(y1));\n } else if (meta.kind === 'createRadialGradient') {\n const [x0, y0, r0, x1, y1, r1] = meta.args;\n el = doc.createElementNS(xmlnsSVG, 'radialGradient');\n el.setAttribute('gradientUnits', 'userSpaceOnUse');\n el.setAttribute('fx', String(x0));\n el.setAttribute('fy', String(y0));\n el.setAttribute('fr', String(r0));\n el.setAttribute('cx', String(x1));\n el.setAttribute('cy', String(y1));\n el.setAttribute('r', String(r1));\n } else {\n // Conic gradient — no native SVG element yet. Caller falls back to\n // the last string color.\n return false;\n }\n el.setAttribute('id', meta.id);\n for (const s of meta.stops) {\n const stop = doc.createElementNS(xmlnsSVG, 'stop');\n stop.setAttribute('offset', String(s.offset));\n stop.setAttribute('stop-color', String(s.color));\n el.appendChild(stop);\n }\n defs.appendChild(el);\n emittedGradientIds.add(meta.id);\n return true;\n };\n\n // p5's resetMatrix records `setTransform(1,0,0,1,0,0)` followed by\n // `scale(pd, pd)` every frame. If we replay both verbatim onto a C2S\n // sized to LOGICAL dimensions, the `scale(pd, pd)` pushes everything off\n // the visible viewBox (drawings end up at coordinates pd× too large).\n // Cancel it out by scaling the recorded setTransform matrix by 1/pd —\n // the subsequent `scale(pd, pd)` then leaves the net matrix as identity,\n // so drawings land at logical coords. User-applied translate/rotate/scale\n // calls are recorded separately and replay unchanged.\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n const inv = 1 / origPD;\n\n // Freeze a SNAPSHOT of the op log before we start replaying. Otherwise a\n // sketch that keeps drawing while saveSVG() runs would mutate `rec.ops`\n // mid-loop — and worse, our own `markFrameBoundary` could shift earlier\n // ops out from under us, dropping synthetic-vector ops we already pointed\n // a `for`-loop index at.\n const ops = rec.ops.slice();\n // Skip ahead to the most recent opaque full-canvas clear if there is one\n // — every shape drawn before it would be completely covered by the\n // clear anyway, so replaying them just bloats the SVG. Common case: a\n // sketch with `background(r,g,b)` (no alpha) on every frame ends up\n // tens of MB of redundant paths (and 100k+ <path> elements that crash\n // SVG viewers) without this optimization.\n const clearIdx = findLastOpaqueClear(ops, w, h);\n let startIdx = 0;\n if (clearIdx > 0) {\n // p5's `background()` does `push(); resetMatrix(); fillStyle = X;\n // fillRect(0,0,W,H); pop();` — so the opaque fillRect lives inside a\n // save/restore pair. If we start replay AT the fillRect, we miss the\n // matching save, and the subsequent restore will underflow the\n // canvas2svg state stack. Walk backwards from clearIdx with depth\n // counting to find the save that opens the same scope, and start\n // replay there so the stack stays balanced.\n let depth = 0;\n let saveIdx = -1;\n for (let i = clearIdx - 1; i >= 0; i--) {\n if (ops[i][0] === 0) {\n if (ops[i][1] === 'restore') depth++;\n else if (ops[i][1] === 'save') {\n if (depth === 0) { saveIdx = i; break; }\n depth--;\n }\n }\n }\n startIdx = saveIdx >= 0 ? saveIdx : clearIdx;\n\n // Carry forward the latest style-state values from the dropped region\n // so subsequent ops don't lose the fillStyle / strokeStyle / etc. they\n // implicitly assume is \"still set\".\n const lastValue = {};\n for (let i = 0; i < startIdx; i++) {\n const op = ops[i];\n if (op[0] === 1 && PRESERVED_STYLE_PROPS.has(op[1])) {\n lastValue[op[1]] = op[2];\n }\n }\n for (const name in lastValue) {\n const v = lastValue[name];\n if (name === 'fillStyle' || name === 'strokeStyle') {\n if (typeof v === 'string') {\n if (name === 'fillStyle') lastStringFill = v;\n else lastStringStroke = v;\n c2s[name] = normalizeColorForC2S(v);\n } else {\n // Don't carry a native gradient over to c2s — fall back to the\n // current last-known-string for that channel.\n c2s[name] = name === 'fillStyle' ? lastStringFill : lastStringStroke;\n }\n } else {\n c2s[name] = v;\n }\n }\n }\n\n // Raster-region state. We support two modes:\n //\n // PER-REGION (preferred — pattern-plugin emits these):\n // beginRaster op carries `{ bbox, patternId }`. We reuse ONE full-\n // canvas offscreen, but CLEAR it on each region entry so it only\n // contains this region's pixels. On endRaster we crop to bbox,\n // toDataURL the slice, and emit a `<pattern id=\"patternId\" …>` into\n // <defs>. Each synthetic vector op references its own patternId as\n // fill — so each pattern call ends up with its own unique colorful\n // gradient swatch (the way p5.pattern actually paints, before our\n // flattening loses the per-call colors).\n //\n // LEGACY SHARED (user-invoked beginRasterRegion() with no bbox):\n // ONE accumulating canvas across every region; a single `<image>` at\n // the end of the SVG. Kept for backwards compat for hybrid sketches\n // that mark a region manually.\n const liveCanvas = getCanvas(p);\n const rasterW = liveCanvas ? liveCanvas.width : w * origPD;\n const rasterH = liveCanvas ? liveCanvas.height : h * origPD;\n\n let regionCanvas = null; // reused full-canvas, cleared per region\n let regionCtx = null;\n let activeRegion = null; // { bbox, patternId, hasContent } | null\n\n let sharedRasterCanvas = null;\n let sharedRasterCtx = null;\n let sharedRasterHasContent = false;\n\n const xmlns = 'http://www.w3.org/2000/svg';\n const xlink = 'http://www.w3.org/1999/xlink';\n\n const ensureRegionCanvas = () => {\n if (!regionCanvas) {\n regionCanvas = document.createElement('canvas');\n regionCanvas.width = rasterW;\n regionCanvas.height = rasterH;\n regionCtx = regionCanvas.getContext('2d');\n }\n // Clear and restore p5's per-frame pd transform.\n regionCtx.setTransform(1, 0, 0, 1, 0, 0);\n regionCtx.clearRect(0, 0, regionCanvas.width, regionCanvas.height);\n regionCtx.setTransform(origPD, 0, 0, origPD, 0, 0);\n };\n\n const ensureSharedRaster = () => {\n if (sharedRasterCanvas) return;\n sharedRasterCanvas = document.createElement('canvas');\n sharedRasterCanvas.width = rasterW;\n sharedRasterCanvas.height = rasterH;\n sharedRasterCtx = sharedRasterCanvas.getContext('2d');\n sharedRasterCtx.setTransform(origPD, 0, 0, origPD, 0, 0);\n };\n\n /** Crop the region canvas to bbox and emit a per-call `<pattern>` in <defs>. */\n const emitRegionPattern = (region) => {\n if (!region || !region.hasContent || !regionCanvas) return;\n const bb = region.bbox;\n if (!bb) return;\n // Clamp bbox to canvas bounds so partially-off-canvas shapes still work.\n const sx = Math.max(0, Math.floor(bb.x * origPD));\n const sy = Math.max(0, Math.floor(bb.y * origPD));\n const ex = Math.min(regionCanvas.width, Math.ceil((bb.x + bb.w) * origPD));\n const ey = Math.min(regionCanvas.height, Math.ceil((bb.y + bb.h) * origPD));\n const sw = ex - sx, sh = ey - sy;\n if (sw <= 0 || sh <= 0) return;\n\n let dataUrl;\n try {\n const slice = document.createElement('canvas');\n slice.width = sw; slice.height = sh;\n slice.getContext('2d').drawImage(regionCanvas, sx, sy, sw, sh, 0, 0, sw, sh);\n dataUrl = slice.toDataURL();\n } catch (_) { return; }\n\n const defs = c2s.__defs;\n const pat = c2s.__document.createElementNS(xmlns, 'pattern');\n pat.setAttribute('id', region.patternId);\n pat.setAttribute('patternUnits', 'userSpaceOnUse');\n pat.setAttribute('x', String(bb.x));\n pat.setAttribute('y', String(bb.y));\n pat.setAttribute('width', String(bb.w));\n pat.setAttribute('height', String(bb.h));\n const img = c2s.__document.createElementNS(xmlns, 'image');\n img.setAttribute('x', '0');\n img.setAttribute('y', '0');\n img.setAttribute('width', String(bb.w));\n img.setAttribute('height', String(bb.h));\n img.setAttributeNS(xlink, 'xlink:href', dataUrl);\n img.setAttribute('href', dataUrl);\n // `preserveAspectRatio=\"none\"` so the slice stretches to fit even when\n // the canvas-clipping math gave us a slightly different aspect than bbox.\n img.setAttribute('preserveAspectRatio', 'none');\n pat.appendChild(img);\n defs.appendChild(pat);\n };\n\n const emitSharedRaster = () => {\n if (!sharedRasterCanvas || !sharedRasterHasContent) return;\n try {\n const dataUrl = sharedRasterCanvas.toDataURL();\n // Emit BOTH a defs <pattern> (so legacy synthetic-vector code paths\n // that reference it still resolve) AND a free-standing <image> at\n // the SVG root, so user-invoked beginRasterRegion()/endRasterRegion()\n // produces a visible raster layer with no shapes referencing it.\n const defs = c2s.__defs;\n const pat = c2s.__document.createElementNS(xmlns, 'pattern');\n pat.setAttribute('id', SHARED_RASTER_PATTERN_ID);\n pat.setAttribute('patternUnits', 'userSpaceOnUse');\n pat.setAttribute('x', '0'); pat.setAttribute('y', '0');\n pat.setAttribute('width', String(w)); pat.setAttribute('height', String(h));\n const patImg = c2s.__document.createElementNS(xmlns, 'image');\n patImg.setAttribute('x', '0'); patImg.setAttribute('y', '0');\n patImg.setAttribute('width', String(w)); patImg.setAttribute('height', String(h));\n patImg.setAttributeNS(xlink, 'xlink:href', dataUrl);\n patImg.setAttribute('href', dataUrl);\n pat.appendChild(patImg);\n defs.appendChild(pat);\n // Free-standing image: appended at the SVG root so it renders ABOVE\n // every vector group. That matches the conceptual layering of a\n // user-marked raster region (an opaque overlay region).\n const rootImg = c2s.__document.createElementNS(xmlns, 'image');\n rootImg.setAttribute('x', '0'); rootImg.setAttribute('y', '0');\n rootImg.setAttribute('width', String(w)); rootImg.setAttribute('height', String(h));\n rootImg.setAttributeNS(xlink, 'xlink:href', dataUrl);\n rootImg.setAttribute('href', dataUrl);\n c2s.__root.appendChild(rootImg);\n } catch (_) { /* CORS-tainted or OOM */ }\n };\n let inRasterRegion = false;\n\n for (let i = startIdx; i < ops.length; i++) {\n const op = ops[i];\n\n // Raster-region markers.\n if (op[0] === 2) {\n if (op[1] === 'beginRaster') {\n const meta = op[2];\n if (meta && meta.bbox && meta.patternId) {\n ensureRegionCanvas();\n activeRegion = { bbox: meta.bbox, patternId: meta.patternId, hasContent: false };\n } else {\n ensureSharedRaster();\n activeRegion = null;\n }\n inRasterRegion = true;\n } else if (op[1] === 'endRaster') {\n if (activeRegion) {\n emitRegionPattern(activeRegion);\n activeRegion = null;\n }\n inRasterRegion = false;\n }\n continue;\n }\n\n // Synthetic vector op (from p5.pattern hooks etc.) — emit on c2s as a\n // shape filled with its own per-call <pattern> (or the shared/legacy\n // pattern, or a solid color, depending on payload).\n if (op[0] === 3) {\n // useSharedPattern: a legacy fallback for synthetic vectors that\n // don't carry their own per-call patternId (older builds; safe\n // no-op for current pattern-plugin output).\n try { replaySyntheticVector(c2s, op[1], op[2], true); } catch (_) {}\n continue;\n }\n\n const target = inRasterRegion\n ? (activeRegion ? regionCtx : sharedRasterCtx)\n : c2s;\n if (inRasterRegion && op[0] === 0) {\n if (activeRegion) activeRegion.hasContent = true;\n else sharedRasterHasContent = true;\n }\n\n try {\n if (op[0] === 0) {\n if (op[1] === 'setTransform') {\n const a = op[2];\n if (target === c2s) {\n // For canvas2svg we cancel out p5's setTransform-then-scale\n // pixel-density pair (see big comment above).\n target.setTransform(a[0] * inv, a[1] * inv, a[2] * inv, a[3] * inv, a[4] * inv, a[5] * inv);\n } else {\n // For the raster ctx, replay verbatim — it's a native Canvas2D\n // and we set up its matrix to mirror p5's actual rendering.\n target.setTransform(a[0], a[1], a[2], a[3], a[4], a[5]);\n }\n } else {\n const f = target[op[1]];\n if (typeof f === 'function') f.apply(target, op[2]);\n }\n } else {\n // Translate fillStyle / strokeStyle to rgba() if it's 8-digit hex.\n if (op[1] === 'fillStyle' || op[1] === 'strokeStyle') {\n const v = op[2];\n const isFill = op[1] === 'fillStyle';\n if (typeof v === 'string') {\n if (isFill) lastStringFill = v;\n else lastStringStroke = v;\n target[op[1]] = target === c2s ? normalizeColorForC2S(v) : v;\n } else if (v && typeof v === 'object' && v.__p5ExportGradId) {\n // Recorded gradient reference. Emit the SVG gradient in defs\n // (idempotent) and set fillStyle to `url(#id)` so the next\n // shape's fill picks up the real gradient.\n const meta = GRADIENT_BY_ID.get(v.__p5ExportGradId);\n const ok = target === c2s && emitSvgGradient(meta);\n if (ok) {\n target[op[1]] = `url(#${meta.id})`;\n } else if (target === c2s) {\n // Conic gradient or no metadata — fall back to last solid.\n target[op[1]] = isFill ? lastStringFill : lastStringStroke;\n }\n // For native targets (rasterCtx) we don't apply the recorded\n // gradient; that gradient was bound to the live ctx and can't\n // be transferred. The rasterized output may be slightly off in\n // gradient regions, but those regions are typically inside\n // explicit raster regions anyway.\n } else {\n // Unknown CanvasGradient (e.g., user-built without going through\n // our recorder proxy) or CanvasPattern — fall back to a solid.\n if (target === c2s) {\n target[op[1]] = isFill ? lastStringFill : lastStringStroke;\n } else {\n try { target[op[1]] = v; } catch (_) {}\n }\n }\n } else if (op[1] === 'globalCompositeOperation') {\n target[op[1]] = op[2];\n // canvas2svg has no SVG mapping for blend modes — stamp CSS\n // `mix-blend-mode` on the current group when writing vector. The\n // native canvas (raster path) honors the property directly.\n if (target === c2s) {\n const mode = op[2];\n const el = c2s.__currentElement;\n if (el && el.setAttribute && mode && mode !== 'source-over') {\n const existing = el.getAttribute('style') || '';\n if (existing.indexOf('mix-blend-mode') === -1) {\n const sep = existing && !existing.trim().endsWith(';') ? ';' : '';\n el.setAttribute('style', existing + sep + 'mix-blend-mode:' + mode);\n }\n }\n }\n } else {\n target[op[1]] = op[2];\n }\n }\n } catch (_) {\n // Skip ops the destination can't replay (gradients, patterns, ImageBitmaps, etc.).\n }\n }\n // Defensive: if the last op was beginRaster with no closing endRaster,\n // still emit whatever we captured so the SVG isn't missing patterns.\n if (activeRegion) emitRegionPattern(activeRegion);\n // Legacy: emit the single shared raster (if used) so old beginRasterRegion\n // calls without bbox metadata still render correctly.\n emitSharedRaster();\n return c2s.getSerializedSvg();\n}\n\nfunction rasterSVG(canvas) {\n const dataUrl = canvas.toDataURL('image/png');\n const w = canvas.width, h = canvas.height;\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${w}\" height=\"${h}\" viewBox=\"0 0 ${w} ${h}\"><image href=\"${dataUrl}\" width=\"${w}\" height=\"${h}\"/></svg>`;\n}\n\nexport function attachSVGExport(p5, fn, lifecycles) {\n /**\n * Save the current sketch as a true vector SVG, with all accumulated\n * draw history replayed onto canvas2svg.\n *\n * For WebGL sketches (no recording is possible), or when explicitly\n * requested via `{ raster: true }`, emit a valid `.svg` that embeds the\n * canvas as a PNG `<image>`.\n *\n * @param {string} [filename]\n * @param {{raster?: boolean}} [opts]\n */\n fn.saveSVG = function (filename, opts = {}) {\n let markup;\n const canRecord = !!this._p5ExportSVGRecorder;\n // Vector replay of an extremely deep op log (e.g., pattern-fill\n // sketches that draw millions of tiny shapes) produces a multi-hundred-\n // megabyte SVG that no viewer can open. Auto-fall-back to whole-canvas\n // raster above this threshold — but count only the ops that will\n // ACTUALLY be replayed as vector after the opaque-clear trim runs and\n // after raster regions are excluded. Otherwise sketches with an opaque\n // background (which keeps just one frame in the SVG) get falsely\n // flagged as \"too big\" based on the full multi-frame op log.\n // Threshold for falling back to raster on extreme op counts. 2M vector\n // ops keeps the door open for dense line-art sketches (mountain-style\n // hatching, particle clouds) while still catching pathological cases\n // that would balloon to gigabyte-scale SVGs. Callers can override with\n // `{ forceVector: true }` or `{ raster: true }` for explicit control.\n const HUGE_OPS_THRESHOLD = 2000000;\n let vectorOpCount = 0;\n if (canRecord) {\n // Snapshot so the count we measure here matches the one replayToSVG\n // will see (a live array could grow mid-iteration and lie about the\n // vector op count).\n const allOps = this._p5ExportSVGRecorder.ops.slice();\n const logicalW = this.width || 100;\n const logicalH = this.height || 100;\n const clearIdx = findLastOpaqueClear(allOps, logicalW, logicalH);\n // Walk backwards from clearIdx to find the matching save() — that's\n // the actual start of the kept-region in replayToSVG.\n let trimStart = 0;\n if (clearIdx > 0) {\n let depth = 0;\n for (let i = clearIdx - 1; i >= 0; i--) {\n if (allOps[i][0] === 0) {\n if (allOps[i][1] === 'restore') depth++;\n else if (allOps[i][1] === 'save') {\n if (depth === 0) { trimStart = i; break; }\n depth--;\n }\n }\n }\n }\n let inRaster = false;\n for (let i = trimStart; i < allOps.length; i++) {\n const op = allOps[i];\n if (op[0] === 2) {\n if (op[1] === 'beginRaster') inRaster = true;\n else if (op[1] === 'endRaster') inRaster = false;\n continue;\n }\n if (!inRaster) vectorOpCount++;\n }\n }\n const tooBigForVector =\n canRecord && !opts.forceVector && vectorOpCount > HUGE_OPS_THRESHOLD;\n\n // Before falling back to raster, BLOCK the download and ask the user\n // what to do (instead of silently producing a giant raster SVG).\n // `{ raster: true }` / `{ forceVector: true }` skip the prompt;\n // `{ silent: true }` keeps the legacy \"warn-and-fallback\" behavior.\n const willFallBackToRaster =\n !opts.raster && (!canRecord || tooBigForVector);\n\n if (willFallBackToRaster && !opts.silent && typeof window !== 'undefined' && typeof window.confirm === 'function') {\n const reason = tooBigForVector\n ? `This sketch produced ${vectorOpCount.toLocaleString()} vector ops — too many to render as vector SVG cleanly (viewers crash above ~250k paths).`\n : `This sketch's renderer (likely WEBGL) can't be captured as vector. SVG would only contain a single embedded PNG.`;\n const ok = window.confirm(\n `[p5.export] SVG export problem\\n\\n` +\n `${reason}\\n\\n` +\n `Click OK to export a raster-only SVG anyway (a single <image> tag) — useful for archival.\\n` +\n `Click Cancel to abort the download.\\n\\n` +\n `Tips:\\n` +\n ` • Wrap expensive draws in beginRasterRegion()/endRasterRegion() for hybrid output.\\n` +\n ` • saveSVG('out', { forceVector: true }) — force vector despite the size.\\n` +\n ` • saveSVG('out', { silent: true }) — never prompt; matches old behavior.`\n );\n if (!ok) {\n console.info('[p5.export] saveSVG cancelled by user');\n return null;\n }\n }\n\n if (opts.raster || !canRecord || tooBigForVector) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] saveSVG: no canvas found');\n if (tooBigForVector) {\n console.warn(`[p5.export] saveSVG: ${vectorOpCount.toLocaleString()} vector ops — falling back to raster.`);\n } else if (!canRecord && !opts.raster) {\n console.info('[p5.export] saveSVG: WebGL renderer detected — embedding canvas as raster <image> in SVG.');\n }\n markup = rasterSVG(canvas);\n } else {\n markup = replayToSVG(this);\n }\n const blob = new Blob([markup], { type: 'image/svg+xml' });\n downloadBlob(blob, filename ? ensureExt(filename, 'svg') : defaultFilename('svg'));\n return blob;\n };\n\n /** Return the current SVG markup as a string (no download). */\n fn.getSVG = function () {\n return this._p5ExportSVGRecorder ? replayToSVG(this) : '';\n };\n\n /**\n * Reset the SVG op log. Call this after, say, a transition so the next\n * `saveSVG()` only captures the new content. Frees memory too.\n */\n fn.clearSVGRecording = function () {\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.clear();\n };\n\n /**\n * Mark the start of a region whose draw operations should be RASTERIZED\n * (embedded as a single PNG `<image>`) instead of replayed as vector in\n * the SVG. Useful for hybrid output: cheap geometry stays as editable\n * paths while expensive pattern fills / noise textures / 1000-shape\n * builds become a single image. Pair with `endRasterRegion()`.\n *\n * Example:\n * function setup() {\n * createCanvas(800, 800);\n * beginRasterRegion();\n * rectPattern(0, 0, 800, 800); // p5.pattern noiseGrad — many ops\n * endRasterRegion();\n * // subsequent geometry stays vector\n * }\n */\n fn.beginRasterRegion = function () {\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.ops.push([2, 'beginRaster']);\n };\n fn.endRasterRegion = function () {\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.ops.push([2, 'endRaster']);\n };\n\n /**\n * Convenience helper: run a function inside a raster region.\n * `rasterize(() => { rectPattern(...); })` is shorthand for\n * `beginRasterRegion(); rectPattern(...); endRasterRegion();`.\n */\n fn.rasterize = function (fn) {\n this.beginRasterRegion();\n try { return fn.call(this); }\n finally { this.endRasterRegion(); }\n };\n\n /**\n * Configure how many of the most recent frames the SVG recorder keeps.\n * Pass `Infinity` or a negative number to disable the cap (not\n * recommended on long-running sketches — memory grows without bound).\n *\n * @param {number} n\n */\n fn.setSVGRecordingFrames = function (n) {\n if (!this._p5ExportSVGRecorder) return;\n if (n === Infinity || n < 0) {\n this._p5ExportSVGRecorder.maxFrames = Infinity;\n } else {\n this._p5ExportSVGRecorder.maxFrames = Math.max(1, Math.floor(n));\n }\n };\n\n // Install the recorder RIGHT AFTER createCanvas runs so the rest of the\n // user's setup() — including background(), pattern fills, and any other\n // drawing — gets captured too. The earlier postsetup-only install missed\n // setup's content entirely, leaving the SVG with only what draw() drew.\n // p5 calls createCanvas internally if the user doesn't, so this catches\n // every sketch.\n //\n // We ALSO call wrapPatternPlugin here — once the renderer exists we know\n // p5.pattern is loaded (if it ever will be) and we can re-bind window\n // globals immediately. Doing it here (instead of in a lifecycle hook)\n // makes the p5 1.x compatibility path work without relying on the order\n // in which registerMethod-style hooks fire vs. user setup().\n const origCreateCanvas = fn.createCanvas;\n if (typeof origCreateCanvas === 'function') {\n fn.createCanvas = function (...args) {\n const result = origCreateCanvas.apply(this, args);\n this._p5ExportSVGRecorder = null;\n installRecorder(this);\n try { wrapPatternPlugin(p5, this); } catch (_) { /* p5.pattern not loaded; fine */ }\n return result;\n };\n }\n\n if (lifecycles && typeof lifecycles === 'object') {\n // Hook p5.pattern's drawing functions BEFORE user setup runs, so when\n // the sketch calls rectPattern/ellipsePattern/etc. our wrappers emit a\n // synthetic vector op into the recorder alongside the rasterized noise.\n // p5.pattern's <script defer> has executed by presetup; the wrap is\n // idempotent so re-running is harmless.\n const prevPresetup = lifecycles.presetup;\n lifecycles.presetup = function () {\n if (typeof prevPresetup === 'function') prevPresetup.call(this);\n // Pass the instance so wrapPatternPlugin can also overwrite the\n // global-mode bound window functions p5 cached at construction time.\n try { wrapPatternPlugin(p5, this); } catch (_) { /* p5.pattern not loaded; fine */ }\n };\n\n // Belt-and-suspenders: also try installing in postsetup in case some\n // edge case bypassed our createCanvas wrapper (e.g., user assigning\n // the renderer directly).\n const prevSetup = lifecycles.postsetup;\n lifecycles.postsetup = function () {\n if (typeof prevSetup === 'function') prevSetup.call(this);\n installRecorder(this);\n };\n\n // Mark a frame boundary BEFORE each draw — trims the oldest frame once\n // we exceed the cap. Compose with any prior predraw hook.\n const prevPre = lifecycles.predraw;\n lifecycles.predraw = function () {\n if (typeof prevPre === 'function') prevPre.call(this);\n if (this._p5ExportSVGRecorder) this._p5ExportSVGRecorder.markFrameBoundary();\n };\n }\n}\n","import { defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { withPixelDensity, highResViaReplay } from '../utils/scale.js';\n\nfunction blobToDataURL(blob) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\n// jspdf is heavy (it ships html2canvas + dompurify). To keep the core\n// bundle slim — especially the UMD drop-in build — it's marked external\n// and loaded on first use, either from a pre-included global or via a\n// dynamic ESM import.\nlet _jsPDFPromise = null;\nfunction loadJsPDF() {\n if (_jsPDFPromise) return _jsPDFPromise;\n _jsPDFPromise = (async () => {\n if (typeof window !== 'undefined') {\n if (window.jspdf && window.jspdf.jsPDF) return window.jspdf.jsPDF;\n if (window.jsPDF) return window.jsPDF;\n }\n try {\n const mod = await import('jspdf');\n if (mod && mod.jsPDF) return mod.jsPDF;\n } catch (_) { /* fall through to the helpful error below */ }\n throw new Error(\n '[p5.export] savePDF requires jspdf. Install it (npm i jspdf) or include ' +\n '<script src=\"https://cdn.jsdelivr.net/npm/jspdf@2/dist/jspdf.umd.min.js\"></script> before your sketch.'\n );\n })();\n return _jsPDFPromise;\n}\n\n/**\n * PDF export. Embeds the rasterized canvas at its native pixel size on a\n * page that matches the canvas dimensions (in points, 1:1 with pixels —\n * keeps the math obvious for creative-coding output).\n */\nexport function attachPDFExport(p5, fn) {\n /**\n * Save the current canvas as a single-page PDF.\n *\n * @param {string} [filename]\n * @param {object} [opts]\n * @param {'p'|'l'|'portrait'|'landscape'} [opts.orientation]\n * @param {'pt'|'mm'|'cm'|'in'} [opts.unit='pt']\n * @param {[number, number]|string} [opts.format] jspdf page format (e.g. 'a4'); defaults to canvas size\n * @param {'png'|'jpeg'|'webp'} [opts.imageFormat='png']\n * @param {number} [opts.quality] for JPEG/WebP\n * @param {number} [opts.scale] 1..4 — render the embedded raster at higher pixelDensity\n */\n fn.savePDF = async function (filename, opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] savePDF: no canvas found');\n\n const jsPDF = await loadJsPDF();\n const imageFormat = (opts.imageFormat || 'png').toUpperCase();\n const mime = imageFormat === 'JPEG' ? 'image/jpeg'\n : imageFormat === 'WEBP' ? 'image/webp'\n : 'image/png';\n\n // The page is sized off the LOGICAL canvas dimensions, regardless of\n // scale — `scale` just bumps the embedded raster's pixel density so the\n // PDF prints crisper. Resolve the source dataURL via the same priority\n // ladder as the image exports: live canvas → op-replay (preserves\n // trails at high res) → withPixelDensity redraw fallback.\n const wLogical = canvas.width;\n const hLogical = canvas.height;\n const fmt = imageFormat === 'JPEG' ? 'jpg' : imageFormat === 'WEBP' ? 'webp' : 'png';\n const scale = opts.scale;\n let dataUrl;\n if (!scale || scale <= 1 || scale <= (this.pixelDensity ? this.pixelDensity() : 1)) {\n dataUrl = canvas.toDataURL(mime, opts.quality);\n } else {\n const replayed = await highResViaReplay(this, scale, fmt, opts.quality);\n if (replayed) {\n dataUrl = await blobToDataURL(replayed);\n } else {\n dataUrl = await withPixelDensity(this, scale, () => getCanvas(this).toDataURL(mime, opts.quality));\n }\n }\n\n const unit = opts.unit || 'pt';\n const orientation = opts.orientation || (wLogical >= hLogical ? 'l' : 'p');\n const format = opts.format || [wLogical, hLogical];\n\n const pdf = new jsPDF({ orientation, unit, format });\n const pageW = pdf.internal.pageSize.getWidth();\n const pageH = pdf.internal.pageSize.getHeight();\n\n // Fit-to-page while preserving aspect ratio.\n const fit = Math.min(pageW / wLogical, pageH / hLogical);\n const drawW = wLogical * fit;\n const drawH = hLogical * fit;\n const x = (pageW - drawW) / 2;\n const y = (pageH - drawH) / 2;\n\n pdf.addImage(dataUrl, imageFormat, x, y, drawW, drawH);\n pdf.save(filename ? ensureExt(filename, 'pdf') : defaultFilename('pdf'));\n return pdf;\n };\n}\n","var X={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 F(t=256){let e=0,s=new Uint8Array(t);return{get buffer(){return s.buffer},reset(){e=0},bytesView(){return s.subarray(0,e)},bytes(){return s.slice(0,e)},writeByte(r){n(e+1),s[e]=r,e++},writeBytes(r,o=0,i=r.length){n(e+i);for(let c=0;c<i;c++)s[e++]=r[c+o]},writeBytesView(r,o=0,i=r.byteLength){n(e+i),s.set(r.subarray(o,o+i),e),e+=i}};function n(r){var o=s.length;if(o>=r)return;var i=1024*1024;r=Math.max(r,o*(o<i?2:1.125)>>>0),o!=0&&(r=Math.max(r,256));let c=s;s=new Uint8Array(r),e>0&&s.set(c.subarray(0,e),0)}}var O=12,J=5003,lt=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function at(t,e,s,n,r=F(512),o=new Uint8Array(256),i=new Int32Array(J),c=new Int32Array(J)){let x=i.length,a=Math.max(2,n);o.fill(0),c.fill(0),i.fill(-1);let l=0,f=0,g=a+1,h=g,b=!1,w=h,_=(1<<w)-1,u=1<<g-1,k=u+1,B=u+2,p=0,A=s[0],z=0;for(let y=x;y<65536;y*=2)++z;z=8-z,r.writeByte(a),I(u);let d=s.length;for(let y=1;y<d;y++){t:{let m=s[y],v=(m<<O)+A,M=m<<z^A;if(i[M]===v){A=c[M];break t}let V=M===0?1:x-M;for(;i[M]>=0;)if(M-=V,M<0&&(M+=x),i[M]===v){A=c[M];break t}I(A),A=m,B<1<<O?(c[M]=B++,i[M]=v):(i.fill(-1),B=u+2,b=!0,I(u))}}return I(A),I(k),r.writeByte(0),r.bytesView();function I(y){for(l&=lt[f],f>0?l|=y<<f:l=y,f+=w;f>=8;)o[p++]=l&255,p>=254&&(r.writeByte(p),r.writeBytesView(o,0,p),p=0),l>>=8,f-=8;if((B>_||b)&&(b?(w=h,_=(1<<w)-1,b=!1):(++w,_=w===O?1<<w:(1<<w)-1)),y==k){for(;f>0;)o[p++]=l&255,p>=254&&(r.writeByte(p),r.writeBytesView(o,0,p),p=0),l>>=8,f-=8;p>0&&(r.writeByte(p),r.writeBytesView(o,0,p),p=0)}}}var $=at;function D(t,e,s){return t<<8&63488|e<<2&992|s>>3}function G(t,e,s,n){return t>>4|e&240|(s&240)<<4|(n&240)<<8}function j(t,e,s){return t>>4<<8|e&240|s>>4}function R(t,e,s){return t<e?e:t>s?s:t}function T(t){return t*t}function tt(t,e,s){var n=0,r=1e100;let o=t[e],i=o.cnt,c=o.ac,x=o.rc,a=o.gc,l=o.bc;for(var f=o.fw;f!=0;f=t[f].fw){let h=t[f],b=h.cnt,w=i*b/(i+b);if(!(w>=r)){var g=0;s&&(g+=w*T(h.ac-c),g>=r)||(g+=w*T(h.rc-x),!(g>=r)&&(g+=w*T(h.gc-a),!(g>=r)&&(g+=w*T(h.bc-l),!(g>=r)&&(r=g,n=f))))}}o.err=r,o.nn=n}function Q(){return{ac:0,rc:0,gc:0,bc:0,cnt:0,nn:0,fw:0,bk:0,tm:0,mtm:0,err:0}}function ut(t,e){let s=e===\"rgb444\"?4096:65536,n=new Array(s),r=t.length;if(e===\"rgba4444\")for(let o=0;o<r;++o){let i=t[o],c=i>>24&255,x=i>>16&255,a=i>>8&255,l=i&255,f=G(l,a,x,c),g=f in n?n[f]:n[f]=Q();g.rc+=l,g.gc+=a,g.bc+=x,g.ac+=c,g.cnt++}else if(e===\"rgb444\")for(let o=0;o<r;++o){let i=t[o],c=i>>16&255,x=i>>8&255,a=i&255,l=j(a,x,c),f=l in n?n[l]:n[l]=Q();f.rc+=a,f.gc+=x,f.bc+=c,f.cnt++}else for(let o=0;o<r;++o){let i=t[o],c=i>>16&255,x=i>>8&255,a=i&255,l=D(a,x,c),f=l in n?n[l]:n[l]=Q();f.rc+=a,f.gc+=x,f.bc+=c,f.cnt++}return n}function H(t,e,s={}){let{format:n=\"rgb565\",clearAlpha:r=!0,clearAlphaColor:o=0,clearAlphaThreshold:i=0,oneBitAlpha:c=!1}=s;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\");let x=new Uint32Array(t.buffer),a=s.useSqrt!==!1,l=n===\"rgba4444\",f=ut(x,n),g=f.length,h=g-1,b=new Uint32Array(g+1);for(var w=0,u=0;u<g;++u){let C=f[u];if(C!=null){var _=1/C.cnt;l&&(C.ac*=_),C.rc*=_,C.gc*=_,C.bc*=_,f[w++]=C}}T(e)/w<.022&&(a=!1);for(var u=0;u<w-1;++u)f[u].fw=u+1,f[u+1].bk=u,a&&(f[u].cnt=Math.sqrt(f[u].cnt));a&&(f[u].cnt=Math.sqrt(f[u].cnt));var k,B,p;for(u=0;u<w;++u){tt(f,u,!1);var A=f[u].err;for(B=++b[0];B>1&&(p=B>>1,!(f[k=b[p]].err<=A));B=p)b[B]=k;b[B]=u}var z=w-e;for(u=0;u<z;){for(var d;;){var I=b[1];if(d=f[I],d.tm>=d.mtm&&f[d.nn].mtm<=d.tm)break;d.mtm==h?I=b[1]=b[b[0]--]:(tt(f,I,!1),d.tm=u);var A=f[I].err;for(B=1;(p=B+B)<=b[0]&&(p<b[0]&&f[b[p]].err>f[b[p+1]].err&&p++,!(A<=f[k=b[p]].err));B=p)b[B]=k;b[B]=I}var y=f[d.nn],m=d.cnt,v=y.cnt,_=1/(m+v);l&&(d.ac=_*(m*d.ac+v*y.ac)),d.rc=_*(m*d.rc+v*y.rc),d.gc=_*(m*d.gc+v*y.gc),d.bc=_*(m*d.bc+v*y.bc),d.cnt+=y.cnt,d.mtm=++u,f[y.bk].fw=y.fw,f[y.fw].bk=y.bk,y.mtm=h}let M=[];var V=0;for(u=0;;++V){let L=R(Math.round(f[u].rc),0,255),C=R(Math.round(f[u].gc),0,255),Y=R(Math.round(f[u].bc),0,255),E=255;if(l){if(E=R(Math.round(f[u].ac),0,255),c){let st=typeof c==\"number\"?c:127;E=E<=st?0:255}r&&E<=i&&(L=C=Y=o,E=0)}let K=l?[L,C,Y,E]:[L,C,Y];if(xt(M,K)||M.push(K),(u=f[u].fw)==0)break}return M}function xt(t,e){for(let s=0;s<t.length;s++){let n=t[s],r=n[0]===e[0]&&n[1]===e[1]&&n[2]===e[2],o=n.length>=4&&e.length>=4?n[3]===e[3]:!0;if(r&&o)return!0}return!1}function U(t,e){var s=0,n;for(n=0;n<t.length;n++){let r=t[n]-e[n];s+=r*r}return s}function P(t,e){return e>1?Math.round(t/e)*e:t}function et(t,{roundRGB:e=5,roundAlpha:s=10,oneBitAlpha:n=null}={}){let r=new Uint32Array(t.buffer);for(let o=0;o<r.length;o++){let i=r[o],c=i>>24&255,x=i>>16&255,a=i>>8&255,l=i&255;if(c=P(c,s),n){let f=typeof n==\"number\"?n:127;c=c<=f?0:255}l=P(l,e),a=P(a,e),x=P(x,e),r[o]=c<<24|x<<16|a<<8|l<<0}}function nt(t,e,s=\"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\");let n=new Uint32Array(t.buffer),r=n.length,o=s===\"rgb444\"?4096:65536,i=new Uint8Array(r),c=new Array(o),x=s===\"rgba4444\";if(s===\"rgba4444\")for(let a=0;a<r;a++){let l=n[a],f=l>>24&255,g=l>>16&255,h=l>>8&255,b=l&255,w=G(b,h,g,f),_=w in c?c[w]:c[w]=gt(b,h,g,f,e);i[a]=_}else{let a=s===\"rgb444\"?j:D;for(let l=0;l<r;l++){let f=n[l],g=f>>16&255,h=f>>8&255,b=f&255,w=a(b,h,g),_=w in c?c[w]:c[w]=bt(b,h,g,e);i[l]=_}}return i}function gt(t,e,s,n,r){let o=0,i=1e100;for(let c=0;c<r.length;c++){let x=r[c],a=x[3],l=q(a-n);if(l>i)continue;let f=x[0];if(l+=q(f-t),l>i)continue;let g=x[1];if(l+=q(g-e),l>i)continue;let h=x[2];l+=q(h-s),!(l>i)&&(i=l,o=c)}return o}function bt(t,e,s,n){let r=0,o=1e100;for(let i=0;i<n.length;i++){let c=n[i],x=c[0],a=q(x-t);if(a>o)continue;let l=c[1];if(a+=q(l-e),a>o)continue;let f=c[2];a+=q(f-s),!(a>o)&&(o=a,r=i)}return r}function rt(t,e,s=5){if(!t.length||!e.length)return;let n=t.map(i=>i.slice(0,3)),r=s*s,o=t[0].length;for(let i=0;i<e.length;i++){let c=e[i];c.length<o?c=[c[0],c[1],c[2],255]:c.length>o?c=c.slice(0,3):c=c.slice();let x=N(n,c.slice(0,3),U),a=x[0],l=x[1];l>0&&l<=r&&(t[a]=c)}}function q(t){return t*t}function W(t,e,s=U){let n=Infinity,r=-1;for(let o=0;o<t.length;o++){let i=t[o],c=s(e,i);c<n&&(n=c,r=o)}return r}function N(t,e,s=U){let n=Infinity,r=-1;for(let o=0;o<t.length;o++){let i=t[o],c=s(e,i);c<n&&(n=c,r=o)}return[r,n]}function ot(t,e,s=U){return t[W(t,e,s)]}function ct(t={}){let{initialCapacity:e=4096,auto:s=!0}=t,n=F(e),r=5003,o=new Uint8Array(256),i=new Int32Array(r),c=new Int32Array(r),x=!1;return{reset(){n.reset(),x=!1},finish(){n.writeByte(X.trailer)},bytes(){return n.bytes()},bytesView(){return n.bytesView()},get buffer(){return n.buffer},get stream(){return n},writeHeader:a,writeFrame(l,f,g,h={}){let{transparent:b=!1,transparentIndex:w=0,delay:_=0,palette:u=null,repeat:k=0,colorDepth:B=8,dispose:p=-1}=h,A=!1;if(s?x||(A=!0,a(),x=!0):A=Boolean(h.first),f=Math.max(0,Math.floor(f)),g=Math.max(0,Math.floor(g)),A){if(!u)throw new Error(\"First frame must include a { palette } option\");pt(n,f,g,u,B),it(n,u),k>=0&&dt(n,k)}let z=Math.round(_/10);wt(n,p,z,b,w);let d=Boolean(u)&&!A;ht(n,f,g,d?u:null),d&&it(n,u),yt(n,l,f,g,B,o,i,c)}};function a(){ft(n,\"GIF89a\")}}function wt(t,e,s,n,r){t.writeByte(33),t.writeByte(249),t.writeByte(4),r<0&&(r=0,n=!1);var o,i;n?(o=1,i=2):(o=0,i=0),e>=0&&(i=e&7),i<<=2;let c=0;t.writeByte(0|i|c|o),S(t,s),t.writeByte(r||0),t.writeByte(0)}function pt(t,e,s,n,r=8){let o=1,i=0,c=Z(n.length)-1,x=o<<7|r-1<<4|i<<3|c,a=0,l=0;S(t,e),S(t,s),t.writeBytes([x,a,l])}function dt(t,e){t.writeByte(33),t.writeByte(255),t.writeByte(11),ft(t,\"NETSCAPE2.0\"),t.writeByte(3),t.writeByte(1),S(t,e),t.writeByte(0)}function it(t,e){let s=1<<Z(e.length);for(let n=0;n<s;n++){let r=[0,0,0];n<e.length&&(r=e[n]),t.writeByte(r[0]),t.writeByte(r[1]),t.writeByte(r[2])}}function ht(t,e,s,n){if(t.writeByte(44),S(t,0),S(t,0),S(t,e),S(t,s),n){let r=0,o=0,i=Z(n.length)-1;t.writeByte(128|r|o|0|i)}else t.writeByte(0)}function yt(t,e,s,n,r=8,o,i,c){$(s,n,e,r,t,o,i,c)}function S(t,e){t.writeByte(e&255),t.writeByte(e>>8&255)}function ft(t,e){for(var s=0;s<e.length;s++)t.writeByte(e.charCodeAt(s))}function Z(t){return Math.max(Math.ceil(Math.log2(t)),1)}var Bt=ct;export{ct as GIFEncoder,nt as applyPalette,Bt as default,ot as nearestColor,W as nearestColorIndex,N as nearestColorIndexWithDistance,et as prequantize,H as quantize,rt as snapColorsToPalette};\n//# sourceMappingURL=gifenc.esm.js.map\n","import { GIFEncoder, quantize, applyPalette } from 'gifenc';\nimport { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\n\n/**\n * GIF recorder. Captures one frame per p5 draw via the `postdraw` lifecycle.\n * gifenc runs synchronously per frame; for large/long recordings this can\n * slow the sketch, but it avoids the worker/blob plumbing that gif.js needs.\n */\nclass GIFRecorder {\n /**\n * @param {object} opts\n * @param {HTMLCanvasElement} opts.canvas\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration] seconds; if set, recorder auto-stops\n * @param {number} [opts.maxColors=256]\n * @param {string} [opts.filename]\n * @param {(p:number)=>void} [opts.onProgress] 0..1 during finalize\n */\n constructor(opts) {\n this.canvas = opts.canvas;\n this.fps = opts.fps ?? 30;\n this.duration = opts.duration;\n this.maxColors = opts.maxColors ?? 256;\n this.filename = opts.filename;\n this.onProgress = opts.onProgress || (() => {});\n this.frames = [];\n this.startTime = 0;\n this.active = false;\n this.framesRecorded = 0;\n }\n\n start() {\n if (this.active) return;\n this.frames = [];\n this.framesRecorded = 0;\n this.startTime = performance.now();\n this.active = true;\n this._nextFrameAt = this.startTime;\n }\n\n /** Called every draw frame; decides whether to grab a frame based on target fps. */\n tick() {\n if (!this.active) return;\n const now = performance.now();\n if (now < this._nextFrameAt) return;\n\n const ctx = this.canvas.getContext('2d', { willReadFrequently: true })\n || this.canvas.getContext('webgl2')\n || this.canvas.getContext('webgl');\n\n let data;\n if (ctx && ctx.getImageData) {\n data = ctx.getImageData(0, 0, this.canvas.width, this.canvas.height).data;\n } else {\n // WebGL: read pixels into a temporary 2d canvas. Slow but correct.\n const tmp = document.createElement('canvas');\n tmp.width = this.canvas.width;\n tmp.height = this.canvas.height;\n tmp.getContext('2d').drawImage(this.canvas, 0, 0);\n data = tmp.getContext('2d').getImageData(0, 0, tmp.width, tmp.height).data;\n }\n\n this.frames.push({\n data: new Uint8ClampedArray(data),\n width: this.canvas.width,\n height: this.canvas.height\n });\n this.framesRecorded++;\n this._nextFrameAt += 1000 / this.fps;\n\n if (this.duration && (now - this.startTime) >= this.duration * 1000) {\n this.stop();\n }\n }\n\n /** Stop capture and encode. Returns a Promise<Blob>. */\n async stop() {\n if (!this.active) return null;\n this.active = false;\n const blob = await this._encode();\n const name = this.filename ? ensureExt(this.filename, 'gif') : defaultFilename('gif');\n downloadBlob(blob, name);\n return blob;\n }\n\n /** Encode without downloading — useful when the caller wants the Blob directly. */\n async encode() {\n this.active = false;\n return this._encode();\n }\n\n async _encode() {\n const gif = GIFEncoder();\n const delay = Math.round(1000 / this.fps);\n const total = this.frames.length;\n for (let i = 0; i < total; i++) {\n const f = this.frames[i];\n const palette = quantize(f.data, this.maxColors);\n const index = applyPalette(f.data, palette);\n gif.writeFrame(index, f.width, f.height, { palette, delay });\n this.onProgress((i + 1) / total);\n // Yield occasionally so the UI doesn't freeze on long recordings.\n if (i % 4 === 3) await new Promise((r) => setTimeout(r, 0));\n }\n gif.finish();\n return new Blob([gif.bytes()], { type: 'image/gif' });\n }\n}\n\nexport function attachGIFRecorder(p5, fn, lifecycles) {\n /**\n * Start a GIF recording. Returns the recorder so the caller can poll\n * `framesRecorded` or call `stop()` manually.\n *\n * @param {object} [opts]\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration] seconds; auto-stops when reached\n * @param {number} [opts.maxColors=256]\n * @param {string} [opts.filename]\n * @param {(p:number)=>void} [opts.onProgress]\n */\n fn.recordGIF = function (opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] recordGIF: no canvas found');\n if (this._p5ExportGIF && this._p5ExportGIF.active) {\n throw new Error('[p5.export] a GIF recording is already in progress');\n }\n const rec = new GIFRecorder({ canvas, ...opts });\n rec.start();\n this._p5ExportGIF = rec;\n return rec;\n };\n\n /** Stop the active GIF recording and trigger download. */\n fn.stopGIF = function () {\n const rec = this._p5ExportGIF;\n if (!rec) return null;\n this._p5ExportGIF = null;\n return rec.stop();\n };\n\n // Hook into p5's draw lifecycle to capture frames. Compose with any\n // existing postdraw handler — we don't want to clobber another addon.\n if (lifecycles && typeof lifecycles === 'object') {\n const prev = lifecycles.postdraw;\n lifecycles.postdraw = function () {\n if (typeof prev === 'function') prev.call(this);\n if (this._p5ExportGIF && this._p5ExportGIF.active) this._p5ExportGIF.tick();\n };\n }\n}\n","/**\n * VideoBuffer — captures raw RGBA frames from the sketch canvas so the GUI\n * can offer \"record once, export to multiple formats\" instead of locking\n * the user into picking the codec up front.\n *\n * Memory cost is real: each frame is `width × height × 4` bytes. A 5-second\n * recording at 800×500 / 30 fps takes ~240 MB. The default `maxFrames` cap\n * keeps things from running away; the GUI exposes duration/fps so users\n * can stay within their machine's limits.\n */\nexport class VideoBuffer {\n /**\n * @param {object} opts\n * @param {HTMLCanvasElement} opts.canvas\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration] seconds; auto-stops when reached\n * @param {number} [opts.maxFrames=900] safety cap (default ≈ 30 s @ 30 fps)\n */\n constructor({ canvas, fps = 30, duration, maxFrames = 900 }) {\n this.canvas = canvas;\n this.fps = fps;\n this.duration = duration;\n this.maxFrames = maxFrames;\n this.width = canvas.width;\n this.height = canvas.height;\n this.frames = [];\n this.recording = false;\n this.startTime = 0;\n this._nextFrameAt = 0;\n }\n\n start() {\n this.frames = [];\n this.recording = true;\n this.startTime = performance.now();\n this._nextFrameAt = this.startTime;\n }\n\n /**\n * Pull one frame off the canvas if enough time has elapsed. Called every\n * `postdraw` via a lifecycle hook in video.js.\n */\n tick() {\n if (!this.recording) return;\n const now = performance.now();\n if (now < this._nextFrameAt) return;\n if (this.frames.length >= this.maxFrames) {\n this.stop();\n return;\n }\n\n let data;\n const ctx = this.canvas.getContext('2d', { willReadFrequently: true });\n if (ctx && typeof ctx.getImageData === 'function') {\n data = ctx.getImageData(0, 0, this.width, this.height).data;\n } else {\n // WebGL fallback: blit through a 2d canvas to read pixels.\n const tmp = document.createElement('canvas');\n tmp.width = this.width;\n tmp.height = this.height;\n const tctx = tmp.getContext('2d');\n tctx.drawImage(this.canvas, 0, 0);\n data = tctx.getImageData(0, 0, this.width, this.height).data;\n }\n this.frames.push(new Uint8ClampedArray(data));\n this._nextFrameAt += 1000 / this.fps;\n\n if (this.duration && (now - this.startTime) >= this.duration * 1000) {\n this.stop();\n }\n }\n\n stop() {\n this.recording = false;\n }\n\n clear() {\n this.frames = [];\n }\n\n get framesRecorded() {\n return this.frames.length;\n }\n\n /** Duration in seconds of what's been captured so far. */\n get capturedSeconds() {\n return this.frames.length / this.fps;\n }\n}\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateWrapper = (obj, member, setter, getter) => ({\n set _(value) {\n __privateSet(obj, member, value, setter);\n },\n get _() {\n return __privateGet(obj, member, getter);\n }\n});\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/misc.ts\nvar bytes = new Uint8Array(8);\nvar view = new DataView(bytes.buffer);\nvar u8 = (value) => {\n return [(value % 256 + 256) % 256];\n};\nvar u16 = (value) => {\n view.setUint16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar i16 = (value) => {\n view.setInt16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar u24 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[1], bytes[2], bytes[3]];\n};\nvar u32 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar i32 = (value) => {\n view.setInt32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar u64 = (value) => {\n view.setUint32(0, Math.floor(value / 2 ** 32), false);\n view.setUint32(4, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nvar fixed_8_8 = (value) => {\n view.setInt16(0, 2 ** 8 * value, false);\n return [bytes[0], bytes[1]];\n};\nvar fixed_16_16 = (value) => {\n view.setInt32(0, 2 ** 16 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar fixed_2_30 = (value) => {\n view.setInt32(0, 2 ** 30 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar ascii = (text, nullTerminated = false) => {\n let bytes2 = Array(text.length).fill(null).map((_, i) => text.charCodeAt(i));\n if (nullTerminated)\n bytes2.push(0);\n return bytes2;\n};\nvar last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nvar lastPresentedSample = (samples) => {\n let result = void 0;\n for (let sample of samples) {\n if (!result || sample.presentationTimestamp > result.presentationTimestamp) {\n result = sample;\n }\n }\n return result;\n};\nvar intoTimescale = (timeInSeconds, timescale, round = true) => {\n let value = timeInSeconds * timescale;\n return round ? Math.round(value) : value;\n};\nvar rotationMatrix = (rotationInDegrees) => {\n let theta = rotationInDegrees * (Math.PI / 180);\n let cosTheta = Math.cos(theta);\n let sinTheta = Math.sin(theta);\n return [\n cosTheta,\n sinTheta,\n 0,\n -sinTheta,\n cosTheta,\n 0,\n 0,\n 0,\n 1\n ];\n};\nvar IDENTITY_MATRIX = rotationMatrix(0);\nvar matrixToBytes = (matrix) => {\n return [\n fixed_16_16(matrix[0]),\n fixed_16_16(matrix[1]),\n fixed_2_30(matrix[2]),\n fixed_16_16(matrix[3]),\n fixed_16_16(matrix[4]),\n fixed_2_30(matrix[5]),\n fixed_16_16(matrix[6]),\n fixed_16_16(matrix[7]),\n fixed_2_30(matrix[8])\n ];\n};\nvar deepClone = (x) => {\n if (!x)\n return x;\n if (typeof x !== \"object\")\n return x;\n if (Array.isArray(x))\n return x.map(deepClone);\n return Object.fromEntries(Object.entries(x).map(([key, value]) => [key, deepClone(value)]));\n};\nvar isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\n\n// src/box.ts\nvar box = (type, contents, children) => ({\n type,\n contents: contents && new Uint8Array(contents.flat(10)),\n children\n});\nvar fullBox = (type, version, flags, contents, children) => box(\n type,\n [u8(version), u24(flags), contents ?? []],\n children\n);\nvar ftyp = (details) => {\n let minorVersion = 512;\n if (details.fragmented)\n return box(\"ftyp\", [\n ascii(\"iso5\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"iso5\"),\n ascii(\"iso6\"),\n ascii(\"mp41\")\n ]);\n return box(\"ftyp\", [\n ascii(\"isom\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"isom\"),\n details.holdsAvc ? ascii(\"avc1\") : [],\n ascii(\"mp41\")\n ]);\n};\nvar mdat = (reserveLargeSize) => ({ type: \"mdat\", largeSize: reserveLargeSize });\nvar free = (size) => ({ type: \"free\", size });\nvar moov = (tracks, creationTime, fragmented = false) => box(\"moov\", null, [\n mvhd(creationTime, tracks),\n ...tracks.map((x) => trak(x, creationTime)),\n fragmented ? mvex(tracks) : null\n]);\nvar mvhd = (creationTime, tracks) => {\n let duration = intoTimescale(Math.max(\n 0,\n ...tracks.filter((x) => x.samples.length > 0).map((x) => {\n const lastSample = lastPresentedSample(x.samples);\n return lastSample.presentationTimestamp + lastSample.duration;\n })\n ), GLOBAL_TIMESCALE);\n let nextTrackId = Math.max(...tracks.map((x) => x.id)) + 1;\n let needsU64 = !isU32(creationTime) || !isU32(duration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mvhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(GLOBAL_TIMESCALE),\n // Timescale\n u32OrU64(duration),\n // Duration\n fixed_16_16(1),\n // Preferred rate\n fixed_8_8(1),\n // Preferred volume\n Array(10).fill(0),\n // Reserved\n matrixToBytes(IDENTITY_MATRIX),\n // Matrix\n Array(24).fill(0),\n // Pre-defined\n u32(nextTrackId)\n // Next track ID\n ]);\n};\nvar trak = (track, creationTime) => box(\"trak\", null, [\n tkhd(track, creationTime),\n mdia(track, creationTime)\n]);\nvar tkhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let durationInGlobalTimescale = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n GLOBAL_TIMESCALE\n );\n let needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale);\n let u32OrU64 = needsU64 ? u64 : u32;\n let matrix;\n if (track.info.type === \"video\") {\n matrix = typeof track.info.rotation === \"number\" ? rotationMatrix(track.info.rotation) : track.info.rotation;\n } else {\n matrix = IDENTITY_MATRIX;\n }\n return fullBox(\"tkhd\", +needsU64, 3, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.id),\n // Track ID\n u32(0),\n // Reserved\n u32OrU64(durationInGlobalTimescale),\n // Duration\n Array(8).fill(0),\n // Reserved\n u16(0),\n // Layer\n u16(0),\n // Alternate group\n fixed_8_8(track.info.type === \"audio\" ? 1 : 0),\n // Volume\n u16(0),\n // Reserved\n matrixToBytes(matrix),\n // Matrix\n fixed_16_16(track.info.type === \"video\" ? track.info.width : 0),\n // Track width\n fixed_16_16(track.info.type === \"video\" ? track.info.height : 0)\n // Track height\n ]);\n};\nvar mdia = (track, creationTime) => box(\"mdia\", null, [\n mdhd(track, creationTime),\n hdlr(track.info.type === \"video\" ? \"vide\" : \"soun\"),\n minf(track)\n]);\nvar mdhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let localDuration = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n track.timescale\n );\n let needsU64 = !isU32(creationTime) || !isU32(localDuration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mdhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.timescale),\n // Timescale\n u32OrU64(localDuration),\n // Duration\n u16(21956),\n // Language (\"und\", undetermined)\n u16(0)\n // Quality\n ]);\n};\nvar hdlr = (componentSubtype) => fullBox(\"hdlr\", 0, 0, [\n ascii(\"mhlr\"),\n // Component type\n ascii(componentSubtype),\n // Component subtype\n u32(0),\n // Component manufacturer\n u32(0),\n // Component flags\n u32(0),\n // Component flags mask\n ascii(\"mp4-muxer-hdlr\", true)\n // Component name\n]);\nvar minf = (track) => box(\"minf\", null, [\n track.info.type === \"video\" ? vmhd() : smhd(),\n dinf(),\n stbl(track)\n]);\nvar vmhd = () => fullBox(\"vmhd\", 0, 1, [\n u16(0),\n // Graphics mode\n u16(0),\n // Opcolor R\n u16(0),\n // Opcolor G\n u16(0)\n // Opcolor B\n]);\nvar smhd = () => fullBox(\"smhd\", 0, 0, [\n u16(0),\n // Balance\n u16(0)\n // Reserved\n]);\nvar dinf = () => box(\"dinf\", null, [\n dref()\n]);\nvar dref = () => fullBox(\"dref\", 0, 0, [\n u32(1)\n // Entry count\n], [\n url()\n]);\nvar url = () => fullBox(\"url \", 0, 1);\nvar stbl = (track) => {\n const needsCtts = track.compositionTimeOffsetTable.length > 1 || track.compositionTimeOffsetTable.some((x) => x.sampleCompositionTimeOffset !== 0);\n return box(\"stbl\", null, [\n stsd(track),\n stts(track),\n stss(track),\n stsc(track),\n stsz(track),\n stco(track),\n needsCtts ? ctts(track) : null\n ]);\n};\nvar stsd = (track) => fullBox(\"stsd\", 0, 0, [\n u32(1)\n // Entry count\n], [\n track.info.type === \"video\" ? videoSampleDescription(\n VIDEO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n ) : soundSampleDescription(\n AUDIO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n )\n]);\nvar videoSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Pre-defined\n u16(0),\n // Reserved\n Array(12).fill(0),\n // Pre-defined\n u16(track.info.width),\n // Width\n u16(track.info.height),\n // Height\n u32(4718592),\n // Horizontal resolution\n u32(4718592),\n // Vertical resolution\n u32(0),\n // Reserved\n u16(1),\n // Frame count\n Array(32).fill(0),\n // Compressor name\n u16(24),\n // Depth\n i16(65535)\n // Pre-defined\n], [\n VIDEO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track),\n track.info.decoderConfig.colorSpace ? colr(track) : null\n]);\nvar COLOR_PRIMARIES_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // ITU-R BT.601 525 - SMPTE 170M\n};\nvar TRANSFER_CHARACTERISTICS_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"smpte170m\": 6,\n // SMPTE 170M\n \"iec61966-2-1\": 13\n // IEC 61966-2-1\n};\nvar MATRIX_COEFFICIENTS_MAP = {\n \"rgb\": 0,\n // Identity\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // SMPTE 170M\n};\nvar colr = (track) => box(\"colr\", [\n ascii(\"nclx\"),\n // Colour type\n u16(COLOR_PRIMARIES_MAP[track.info.decoderConfig.colorSpace.primaries]),\n // Colour primaries\n u16(TRANSFER_CHARACTERISTICS_MAP[track.info.decoderConfig.colorSpace.transfer]),\n // Transfer characteristics\n u16(MATRIX_COEFFICIENTS_MAP[track.info.decoderConfig.colorSpace.matrix]),\n // Matrix coefficients\n u8((track.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)\n // Full range flag\n]);\nvar avcC = (track) => track.info.decoderConfig && box(\"avcC\", [\n // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar hvcC = (track) => track.info.decoderConfig && box(\"hvcC\", [\n // For HEVC, description is a HEVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar vpcC = (track) => {\n if (!track.info.decoderConfig) {\n return null;\n }\n let decoderConfig = track.info.decoderConfig;\n if (!decoderConfig.colorSpace) {\n throw new Error(`'colorSpace' is required in the decoder config for VP9.`);\n }\n let parts = decoderConfig.codec.split(\".\");\n let profile = Number(parts[1]);\n let level = Number(parts[2]);\n let bitDepth = Number(parts[3]);\n let chromaSubsampling = 0;\n let thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + Number(decoderConfig.colorSpace.fullRange);\n let colourPrimaries = 2;\n let transferCharacteristics = 2;\n let matrixCoefficients = 2;\n return fullBox(\"vpcC\", 1, 0, [\n u8(profile),\n // Profile\n u8(level),\n // Level\n u8(thirdByte),\n // Bit depth, chroma subsampling, full range\n u8(colourPrimaries),\n // Colour primaries\n u8(transferCharacteristics),\n // Transfer characteristics\n u8(matrixCoefficients),\n // Matrix coefficients\n u16(0)\n // Codec initialization data size\n ]);\n};\nvar av1C = () => {\n let marker = 1;\n let version = 1;\n let firstByte = (marker << 7) + version;\n return box(\"av1C\", [\n firstByte,\n 0,\n 0,\n 0\n ]);\n};\nvar soundSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Version\n u16(0),\n // Revision level\n u32(0),\n // Vendor\n u16(track.info.numberOfChannels),\n // Number of channels\n u16(16),\n // Sample size (bits)\n u16(0),\n // Compression ID\n u16(0),\n // Packet size\n fixed_16_16(track.info.sampleRate)\n // Sample rate\n], [\n AUDIO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track)\n]);\nvar esds = (track) => {\n let description = new Uint8Array(track.info.decoderConfig.description);\n return fullBox(\"esds\", 0, 0, [\n // https://stackoverflow.com/a/54803118\n u32(58753152),\n // TAG(3) = Object Descriptor ([2])\n u8(32 + description.byteLength),\n // length of this OD (which includes the next 2 tags)\n u16(1),\n // ES_ID = 1\n u8(0),\n // flags etc = 0\n u32(75530368),\n // TAG(4) = ES Descriptor ([2]) embedded in above OD\n u8(18 + description.byteLength),\n // length of this ESD\n u8(64),\n // MPEG-4 Audio\n u8(21),\n // stream type(6bits)=5 audio, flags(2bits)=1\n u24(0),\n // 24bit buffer size\n u32(130071),\n // max bitrate\n u32(130071),\n // avg bitrate\n u32(92307584),\n // TAG(5) = ASC ([2],[3]) embedded in above OD\n u8(description.byteLength),\n // length\n ...description,\n u32(109084800),\n // TAG(6)\n u8(1),\n // length\n u8(2)\n // data\n ]);\n};\nvar dOps = (track) => {\n let preskip = 3840;\n let gain = 0;\n const description = track.info.decoderConfig?.description;\n if (description) {\n if (description.byteLength < 18) {\n throw new TypeError(\"Invalid decoder description provided for Opus; must be at least 18 bytes long.\");\n }\n const view2 = ArrayBuffer.isView(description) ? new DataView(description.buffer, description.byteOffset, description.byteLength) : new DataView(description);\n preskip = view2.getUint16(10, true);\n gain = view2.getInt16(14, true);\n }\n return box(\"dOps\", [\n u8(0),\n // Version\n u8(track.info.numberOfChannels),\n // OutputChannelCount\n u16(preskip),\n u32(track.info.sampleRate),\n // InputSampleRate\n fixed_8_8(gain),\n // OutputGain\n u8(0)\n // ChannelMappingFamily\n ]);\n};\nvar stts = (track) => {\n return fullBox(\"stts\", 0, 0, [\n u32(track.timeToSampleTable.length),\n // Number of entries\n track.timeToSampleTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleDelta)\n // Sample duration\n ])\n ]);\n};\nvar stss = (track) => {\n if (track.samples.every((x) => x.type === \"key\"))\n return null;\n let keySamples = [...track.samples.entries()].filter(([, sample]) => sample.type === \"key\");\n return fullBox(\"stss\", 0, 0, [\n u32(keySamples.length),\n // Number of entries\n keySamples.map(([index]) => u32(index + 1))\n // Sync sample table\n ]);\n};\nvar stsc = (track) => {\n return fullBox(\"stsc\", 0, 0, [\n u32(track.compactlyCodedChunkTable.length),\n // Number of entries\n track.compactlyCodedChunkTable.map((x) => [\n // Sample-to-chunk table\n u32(x.firstChunk),\n // First chunk\n u32(x.samplesPerChunk),\n // Samples per chunk\n u32(1)\n // Sample description index\n ])\n ]);\n};\nvar stsz = (track) => fullBox(\"stsz\", 0, 0, [\n u32(0),\n // Sample size (0 means non-constant size)\n u32(track.samples.length),\n // Number of entries\n track.samples.map((x) => u32(x.size))\n // Sample size table\n]);\nvar stco = (track) => {\n if (track.finalizedChunks.length > 0 && last(track.finalizedChunks).offset >= 2 ** 32) {\n return fullBox(\"co64\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u64(x.offset))\n // Chunk offset table\n ]);\n }\n return fullBox(\"stco\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u32(x.offset))\n // Chunk offset table\n ]);\n};\nvar ctts = (track) => {\n return fullBox(\"ctts\", 0, 0, [\n u32(track.compositionTimeOffsetTable.length),\n // Number of entries\n track.compositionTimeOffsetTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleCompositionTimeOffset)\n // Sample offset\n ])\n ]);\n};\nvar mvex = (tracks) => {\n return box(\"mvex\", null, tracks.map(trex));\n};\nvar trex = (track) => {\n return fullBox(\"trex\", 0, 0, [\n u32(track.id),\n // Track ID\n u32(1),\n // Default sample description index\n u32(0),\n // Default sample duration\n u32(0),\n // Default sample size\n u32(0)\n // Default sample flags\n ]);\n};\nvar moof = (sequenceNumber, tracks) => {\n return box(\"moof\", null, [\n mfhd(sequenceNumber),\n ...tracks.map(traf)\n ]);\n};\nvar mfhd = (sequenceNumber) => {\n return fullBox(\"mfhd\", 0, 0, [\n u32(sequenceNumber)\n // Sequence number\n ]);\n};\nvar fragmentSampleFlags = (sample) => {\n let byte1 = 0;\n let byte2 = 0;\n let byte3 = 0;\n let byte4 = 0;\n let sampleIsDifferenceSample = sample.type === \"delta\";\n byte2 |= +sampleIsDifferenceSample;\n if (sampleIsDifferenceSample) {\n byte1 |= 1;\n } else {\n byte1 |= 2;\n }\n return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;\n};\nvar traf = (track) => {\n return box(\"traf\", null, [\n tfhd(track),\n tfdt(track),\n trun(track)\n ]);\n};\nvar tfhd = (track) => {\n let tfFlags = 0;\n tfFlags |= 8;\n tfFlags |= 16;\n tfFlags |= 32;\n tfFlags |= 131072;\n let referenceSample = track.currentChunk.samples[1] ?? track.currentChunk.samples[0];\n let referenceSampleInfo = {\n duration: referenceSample.timescaleUnitsToNextSample,\n size: referenceSample.size,\n flags: fragmentSampleFlags(referenceSample)\n };\n return fullBox(\"tfhd\", 0, tfFlags, [\n u32(track.id),\n // Track ID\n u32(referenceSampleInfo.duration),\n // Default sample duration\n u32(referenceSampleInfo.size),\n // Default sample size\n u32(referenceSampleInfo.flags)\n // Default sample flags\n ]);\n};\nvar tfdt = (track) => {\n return fullBox(\"tfdt\", 1, 0, [\n u64(intoTimescale(track.currentChunk.startTimestamp, track.timescale))\n // Base Media Decode Time\n ]);\n};\nvar trun = (track) => {\n let allSampleDurations = track.currentChunk.samples.map((x) => x.timescaleUnitsToNextSample);\n let allSampleSizes = track.currentChunk.samples.map((x) => x.size);\n let allSampleFlags = track.currentChunk.samples.map(fragmentSampleFlags);\n let allSampleCompositionTimeOffsets = track.currentChunk.samples.map((x) => intoTimescale(x.presentationTimestamp - x.decodeTimestamp, track.timescale));\n let uniqueSampleDurations = new Set(allSampleDurations);\n let uniqueSampleSizes = new Set(allSampleSizes);\n let uniqueSampleFlags = new Set(allSampleFlags);\n let uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets);\n let firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1];\n let sampleDurationPresent = uniqueSampleDurations.size > 1;\n let sampleSizePresent = uniqueSampleSizes.size > 1;\n let sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1;\n let sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some((x) => x !== 0);\n let flags = 0;\n flags |= 1;\n flags |= 4 * +firstSampleFlagsPresent;\n flags |= 256 * +sampleDurationPresent;\n flags |= 512 * +sampleSizePresent;\n flags |= 1024 * +sampleFlagsPresent;\n flags |= 2048 * +sampleCompositionTimeOffsetsPresent;\n return fullBox(\"trun\", 1, flags, [\n u32(track.currentChunk.samples.length),\n // Sample count\n u32(track.currentChunk.offset - track.currentChunk.moofOffset || 0),\n // Data offset\n firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [],\n track.currentChunk.samples.map((_, i) => [\n sampleDurationPresent ? u32(allSampleDurations[i]) : [],\n // Sample duration\n sampleSizePresent ? u32(allSampleSizes[i]) : [],\n // Sample size\n sampleFlagsPresent ? u32(allSampleFlags[i]) : [],\n // Sample flags\n // Sample composition time offsets\n sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : []\n ])\n ]);\n};\nvar mfra = (tracks) => {\n return box(\"mfra\", null, [\n ...tracks.map(tfra),\n mfro()\n ]);\n};\nvar tfra = (track, trackIndex) => {\n let version = 1;\n return fullBox(\"tfra\", version, 0, [\n u32(track.id),\n // Track ID\n u32(63),\n // This specifies that traf number, trun number and sample number are 32-bit ints\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((chunk) => [\n u64(intoTimescale(chunk.startTimestamp, track.timescale)),\n // Time\n u64(chunk.moofOffset),\n // moof offset\n u32(trackIndex + 1),\n // traf number\n u32(1),\n // trun number\n u32(1)\n // Sample number\n ])\n ]);\n};\nvar mfro = () => {\n return fullBox(\"mfro\", 0, 0, [\n // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box\n // is known\n u32(0)\n // Size\n ]);\n};\nvar VIDEO_CODEC_TO_BOX_NAME = {\n \"avc\": \"avc1\",\n \"hevc\": \"hvc1\",\n \"vp9\": \"vp09\",\n \"av1\": \"av01\"\n};\nvar VIDEO_CODEC_TO_CONFIGURATION_BOX = {\n \"avc\": avcC,\n \"hevc\": hvcC,\n \"vp9\": vpcC,\n \"av1\": av1C\n};\nvar AUDIO_CODEC_TO_BOX_NAME = {\n \"aac\": \"mp4a\",\n \"opus\": \"Opus\"\n};\nvar AUDIO_CODEC_TO_CONFIGURATION_BOX = {\n \"aac\": esds,\n \"opus\": dOps\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView;\nvar Writer = class {\n constructor() {\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n /**\n * Stores the position from the start of the file to where boxes elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = /* @__PURE__ */ new WeakMap();\n }\n /** Sets the current position for future writes to a new one. */\n seek(newPos) {\n this.pos = newPos;\n }\n writeU32(value) {\n __privateGet(this, _helperView).setUint32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n }\n writeU64(value) {\n __privateGet(this, _helperView).setUint32(0, Math.floor(value / 2 ** 32), false);\n __privateGet(this, _helperView).setUint32(4, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 8));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n __privateGet(this, _helperView).setUint8(i % 8, text.charCodeAt(i));\n if (i % 8 === 7)\n this.write(__privateGet(this, _helper));\n }\n if (text.length % 8 !== 0) {\n this.write(__privateGet(this, _helper).subarray(0, text.length % 8));\n }\n }\n writeBox(box2) {\n this.offsets.set(box2, this.pos);\n if (box2.contents && !box2.children) {\n this.writeBoxHeader(box2, box2.size ?? box2.contents.byteLength + 8);\n this.write(box2.contents);\n } else {\n let startPos = this.pos;\n this.writeBoxHeader(box2, 0);\n if (box2.contents)\n this.write(box2.contents);\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n this.writeBox(child);\n }\n let endPos = this.pos;\n let size = box2.size ?? endPos - startPos;\n this.seek(startPos);\n this.writeBoxHeader(box2, size);\n this.seek(endPos);\n }\n }\n writeBoxHeader(box2, size) {\n this.writeU32(box2.largeSize ? 1 : size);\n this.writeAscii(box2.type);\n if (box2.largeSize)\n this.writeU64(size);\n }\n measureBoxHeader(box2) {\n return 8 + (box2.largeSize ? 8 : 0);\n }\n patchBox(box2) {\n let endPos = this.pos;\n this.seek(this.offsets.get(box2));\n this.writeBox(box2);\n this.seek(endPos);\n }\n measureBox(box2) {\n if (box2.contents && !box2.children) {\n let headerSize = this.measureBoxHeader(box2);\n return headerSize + box2.contents.byteLength;\n } else {\n let result = this.measureBoxHeader(box2);\n if (box2.contents)\n result += box2.contents.byteLength;\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n result += this.measureBox(child);\n }\n return result;\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\nvar _target, _buffer, _bytes, _maxPos, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateAdd(this, _maxPos, 0);\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n __privateSet(this, _maxPos, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_maxPos = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _target2, _sections, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _target2, void 0);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n /**\n * The data is divided up into fixed-size chunks, whose contents are first filled in RAM and then flushed out.\n * A chunk is flushed if all of its contents have been written.\n */\n __privateAdd(this, _chunks, []);\n __privateSet(this, _target2, target);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n __privateGet(this, _target2).options.onData?.(chunk.data, chunk.start);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_target2 = new WeakMap();\n_sections = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n __privateGet(this, _target2).options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }));\n }\n};\n\n// src/muxer.ts\nvar GLOBAL_TIMESCALE = 1e3;\nvar SUPPORTED_VIDEO_CODECS = [\"avc\", \"hevc\", \"vp9\", \"av1\"];\nvar SUPPORTED_AUDIO_CODECS = [\"aac\", \"opus\"];\nvar TIMESTAMP_OFFSET = 2082844800;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"cross-track-offset\"];\nvar _options, _writer, _ftypSize, _mdat, _videoTrack, _audioTrack, _creationTime, _finalizedChunks, _nextFragmentNumber, _videoSampleQueue, _audioSampleQueue, _finalized, _validateOptions, validateOptions_fn, _writeHeader, writeHeader_fn, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn, _prepareTracks, prepareTracks_fn, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn, _createSampleForTrack, createSampleForTrack_fn, _addSampleToTrack, addSampleToTrack_fn, _validateTimestamp, validateTimestamp_fn, _finalizeCurrentChunk, finalizeCurrentChunk_fn, _finalizeFragment, finalizeFragment_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _writeHeader);\n __privateAdd(this, _computeMoovSizeUpperBound);\n __privateAdd(this, _prepareTracks);\n // https://wiki.multimedia.cx/index.php/MPEG-4_Audio\n __privateAdd(this, _generateMpeg4AudioSpecificConfig);\n __privateAdd(this, _createSampleForTrack);\n __privateAdd(this, _addSampleToTrack);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _finalizeCurrentChunk);\n __privateAdd(this, _finalizeFragment);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _ftypSize, void 0);\n __privateAdd(this, _mdat, void 0);\n __privateAdd(this, _videoTrack, null);\n __privateAdd(this, _audioTrack, null);\n __privateAdd(this, _creationTime, Math.floor(Date.now() / 1e3) + TIMESTAMP_OFFSET);\n __privateAdd(this, _finalizedChunks, []);\n // Fields for fragmented MP4:\n __privateAdd(this, _nextFragmentNumber, 1);\n __privateAdd(this, _videoSampleQueue, []);\n __privateAdd(this, _audioSampleQueue, []);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n options.video = deepClone(options.video);\n options.audio = deepClone(options.audio);\n options.fastStart = deepClone(options.fastStart);\n this.target = options.target;\n __privateSet(this, _options, {\n firstTimestampBehavior: \"strict\",\n ...options\n });\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _prepareTracks, prepareTracks_fn).call(this);\n __privateMethod(this, _writeHeader, writeHeader_fn).call(this);\n }\n addVideoChunk(sample, meta, timestamp, compositionTimeOffset) {\n if (!(sample instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (sample) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunk's fourth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addVideoChunkRaw(\n data,\n sample.type,\n timestamp ?? sample.timestamp,\n sample.duration,\n meta,\n compositionTimeOffset\n );\n }\n addVideoChunkRaw(data, type, timestamp, duration, meta, compositionTimeOffset) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunkRaw's sixth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _videoTrack).samples.length === __privateGet(this, _options).fastStart.expectedVideoChunks) {\n throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedVideoChunks}).`);\n }\n let videoSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _videoTrack), data, type, timestamp, duration, meta, compositionTimeOffset);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _audioTrack)) {\n while (__privateGet(this, _audioSampleQueue).length > 0 && __privateGet(this, _audioSampleQueue)[0].decodeTimestamp <= videoSample.decodeTimestamp) {\n let audioSample = __privateGet(this, _audioSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n if (videoSample.decodeTimestamp <= __privateGet(this, _audioTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n } else {\n __privateGet(this, _videoSampleQueue).push(videoSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n }\n addAudioChunk(sample, meta, timestamp) {\n if (!(sample instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (sample) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addAudioChunkRaw(data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta);\n }\n addAudioChunkRaw(data, type, timestamp, duration, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _audioTrack).samples.length === __privateGet(this, _options).fastStart.expectedAudioChunks) {\n throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedAudioChunks}).`);\n }\n let audioSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _audioTrack), data, type, timestamp, duration, meta);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _videoTrack)) {\n while (__privateGet(this, _videoSampleQueue).length > 0 && __privateGet(this, _videoSampleQueue)[0].decodeTimestamp <= audioSample.decodeTimestamp) {\n let videoSample = __privateGet(this, _videoSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n if (audioSample.decodeTimestamp <= __privateGet(this, _videoTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n } else {\n __privateGet(this, _audioSampleQueue).push(audioSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n }\n /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n for (let videoSample of __privateGet(this, _videoSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n for (let audioSample of __privateGet(this, _audioSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this, false);\n } else {\n if (__privateGet(this, _videoTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _videoTrack));\n if (__privateGet(this, _audioTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _audioTrack));\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter(Boolean);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n let mdatSize;\n for (let i = 0; i < 2; i++) {\n let movieBox2 = moov(tracks, __privateGet(this, _creationTime));\n let movieBoxSize = __privateGet(this, _writer).measureBox(movieBox2);\n mdatSize = __privateGet(this, _writer).measureBox(__privateGet(this, _mdat));\n let currentChunkPos = __privateGet(this, _writer).pos + movieBoxSize + mdatSize;\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n chunk.offset = currentChunkPos;\n for (let { data } of chunk.samples) {\n currentChunkPos += data.byteLength;\n mdatSize += data.byteLength;\n }\n }\n if (currentChunkPos < 2 ** 32)\n break;\n if (mdatSize >= 2 ** 32)\n __privateGet(this, _mdat).largeSize = true;\n }\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n __privateGet(this, _writer).writeBox(movieBox);\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n for (let sample of chunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let startPos = __privateGet(this, _writer).pos;\n let mfraBox = mfra(tracks);\n __privateGet(this, _writer).writeBox(mfraBox);\n let mfraBoxSize = __privateGet(this, _writer).pos - startPos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos - 4);\n __privateGet(this, _writer).writeU32(mfraBoxSize);\n } else {\n let mdatPos = __privateGet(this, _writer).offsets.get(__privateGet(this, _mdat));\n let mdatSize = __privateGet(this, _writer).pos - mdatPos;\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _mdat).largeSize = mdatSize >= 2 ** 32;\n __privateGet(this, _writer).patchBox(__privateGet(this, _mdat));\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n __privateGet(this, _writer).seek(__privateGet(this, _ftypSize));\n __privateGet(this, _writer).writeBox(movieBox);\n let remainingBytes = mdatPos - __privateGet(this, _writer).pos;\n __privateGet(this, _writer).writeBox(free(remainingBytes));\n } else {\n __privateGet(this, _writer).writeBox(movieBox);\n }\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_ftypSize = new WeakMap();\n_mdat = new WeakMap();\n_videoTrack = new WeakMap();\n_audioTrack = new WeakMap();\n_creationTime = new WeakMap();\n_finalizedChunks = new WeakMap();\n_nextFragmentNumber = new WeakMap();\n_videoSampleQueue = new WeakMap();\n_audioSampleQueue = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (!SUPPORTED_VIDEO_CODECS.includes(options.video.codec)) {\n throw new TypeError(`Unsupported video codec: ${options.video.codec}`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n const videoRotation = options.video.rotation;\n if (typeof videoRotation === \"number\" && ![0, 90, 180, 270].includes(videoRotation)) {\n throw new TypeError(`Invalid video rotation: ${videoRotation}. Has to be 0, 90, 180 or 270.`);\n } else if (Array.isArray(videoRotation) && (videoRotation.length !== 9 || videoRotation.some((value) => typeof value !== \"number\"))) {\n throw new TypeError(`Invalid video transformation matrix: ${videoRotation.join()}`);\n }\n if (options.video.frameRate !== void 0 && (!Number.isInteger(options.video.frameRate) || options.video.frameRate <= 0)) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive integer.`\n );\n }\n }\n if (options.audio) {\n if (!SUPPORTED_AUDIO_CODECS.includes(options.audio.codec)) {\n throw new TypeError(`Unsupported audio codec: ${options.audio.codec}`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (typeof options.fastStart === \"object\") {\n if (options.video) {\n if (options.fastStart.expectedVideoChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedVideoChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedVideoChunks) || options.fastStart.expectedVideoChunks < 0) {\n throw new TypeError(`'expectedVideoChunks' must be a non-negative integer.`);\n }\n }\n if (options.audio) {\n if (options.fastStart.expectedAudioChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedAudioChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedAudioChunks) || options.fastStart.expectedAudioChunks < 0) {\n throw new TypeError(`'expectedAudioChunks' must be a non-negative integer.`);\n }\n }\n } else if (![false, \"in-memory\", \"fragmented\"].includes(options.fastStart)) {\n throw new TypeError(`'fastStart' option must be false, 'in-memory', 'fragmented' or an object.`);\n }\n if (options.minFragmentDuration !== void 0 && (!Number.isFinite(options.minFragmentDuration) || options.minFragmentDuration < 0)) {\n throw new TypeError(`'minFragmentDuration' must be a non-negative number.`);\n }\n};\n_writeHeader = new WeakSet();\nwriteHeader_fn = function() {\n __privateGet(this, _writer).writeBox(ftyp({\n holdsAvc: __privateGet(this, _options).video?.codec === \"avc\",\n fragmented: __privateGet(this, _options).fastStart === \"fragmented\"\n }));\n __privateSet(this, _ftypSize, __privateGet(this, _writer).pos);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n __privateSet(this, _mdat, mdat(false));\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n } else {\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n let moovSizeUpperBound = __privateMethod(this, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn).call(this);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos + moovSizeUpperBound);\n }\n __privateSet(this, _mdat, mdat(true));\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_computeMoovSizeUpperBound = new WeakSet();\ncomputeMoovSizeUpperBound_fn = function() {\n if (typeof __privateGet(this, _options).fastStart !== \"object\")\n return;\n let upperBound = 0;\n let sampleCounts = [\n __privateGet(this, _options).fastStart.expectedVideoChunks,\n __privateGet(this, _options).fastStart.expectedAudioChunks\n ];\n for (let n of sampleCounts) {\n if (!n)\n continue;\n upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += 8 * n;\n }\n upperBound += 4096;\n return upperBound;\n};\n_prepareTracks = new WeakSet();\nprepareTracks_fn = function() {\n if (__privateGet(this, _options).video) {\n __privateSet(this, _videoTrack, {\n id: 1,\n info: {\n type: \"video\",\n codec: __privateGet(this, _options).video.codec,\n width: __privateGet(this, _options).video.width,\n height: __privateGet(this, _options).video.height,\n rotation: __privateGet(this, _options).video.rotation ?? 0,\n decoderConfig: null\n },\n // The fallback contains many common frame rates as factors\n timescale: __privateGet(this, _options).video.frameRate ?? 57600,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioTrack, {\n id: __privateGet(this, _options).video ? 2 : 1,\n info: {\n type: \"audio\",\n codec: __privateGet(this, _options).audio.codec,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate,\n decoderConfig: null\n },\n timescale: __privateGet(this, _options).audio.sampleRate,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n if (__privateGet(this, _options).audio.codec === \"aac\") {\n let guessedCodecPrivate = __privateMethod(this, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn).call(\n this,\n 2,\n // Object type for AAC-LC, since it's the most common\n __privateGet(this, _options).audio.sampleRate,\n __privateGet(this, _options).audio.numberOfChannels\n );\n __privateGet(this, _audioTrack).info.decoderConfig = {\n codec: __privateGet(this, _options).audio.codec,\n description: guessedCodecPrivate,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate\n };\n }\n }\n};\n_generateMpeg4AudioSpecificConfig = new WeakSet();\ngenerateMpeg4AudioSpecificConfig_fn = function(objectType, sampleRate, numberOfChannels) {\n let frequencyIndices = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n let frequencyIndex = frequencyIndices.indexOf(sampleRate);\n let channelConfig = numberOfChannels;\n let configBits = \"\";\n configBits += objectType.toString(2).padStart(5, \"0\");\n configBits += frequencyIndex.toString(2).padStart(4, \"0\");\n if (frequencyIndex === 15)\n configBits += sampleRate.toString(2).padStart(24, \"0\");\n configBits += channelConfig.toString(2).padStart(4, \"0\");\n let paddingLength = Math.ceil(configBits.length / 8) * 8;\n configBits = configBits.padEnd(paddingLength, \"0\");\n let configBytes = new Uint8Array(configBits.length / 8);\n for (let i = 0; i < configBits.length; i += 8) {\n configBytes[i / 8] = parseInt(configBits.slice(i, i + 8), 2);\n }\n return configBytes;\n};\n_createSampleForTrack = new WeakSet();\ncreateSampleForTrack_fn = function(track, data, type, timestamp, duration, meta, compositionTimeOffset) {\n let presentationTimestampInSeconds = timestamp / 1e6;\n let decodeTimestampInSeconds = (timestamp - (compositionTimeOffset ?? 0)) / 1e6;\n let durationInSeconds = duration / 1e6;\n let adjusted = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, presentationTimestampInSeconds, decodeTimestampInSeconds, track);\n presentationTimestampInSeconds = adjusted.presentationTimestamp;\n decodeTimestampInSeconds = adjusted.decodeTimestamp;\n if (meta?.decoderConfig) {\n if (track.info.decoderConfig === null) {\n track.info.decoderConfig = meta.decoderConfig;\n } else {\n Object.assign(track.info.decoderConfig, meta.decoderConfig);\n }\n }\n let sample = {\n presentationTimestamp: presentationTimestampInSeconds,\n decodeTimestamp: decodeTimestampInSeconds,\n duration: durationInSeconds,\n data,\n size: data.byteLength,\n type,\n // Will be refined once the next sample comes in\n timescaleUnitsToNextSample: intoTimescale(durationInSeconds, track.timescale)\n };\n return sample;\n};\n_addSampleToTrack = new WeakSet();\naddSampleToTrack_fn = function(track, sample) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.samples.push(sample);\n }\n const sampleCompositionTimeOffset = intoTimescale(sample.presentationTimestamp - sample.decodeTimestamp, track.timescale);\n if (track.lastTimescaleUnits !== null) {\n let timescaleUnits = intoTimescale(sample.decodeTimestamp, track.timescale, false);\n let delta = Math.round(timescaleUnits - track.lastTimescaleUnits);\n track.lastTimescaleUnits += delta;\n track.lastSample.timescaleUnitsToNextSample = delta;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n let lastTableEntry = last(track.timeToSampleTable);\n if (lastTableEntry.sampleCount === 1) {\n lastTableEntry.sampleDelta = delta;\n lastTableEntry.sampleCount++;\n } else if (lastTableEntry.sampleDelta === delta) {\n lastTableEntry.sampleCount++;\n } else {\n lastTableEntry.sampleCount--;\n track.timeToSampleTable.push({\n sampleCount: 2,\n sampleDelta: delta\n });\n }\n const lastCompositionTimeOffsetTableEntry = last(track.compositionTimeOffsetTable);\n if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) {\n lastCompositionTimeOffsetTableEntry.sampleCount++;\n } else {\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n } else {\n track.lastTimescaleUnits = 0;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.timeToSampleTable.push({\n sampleCount: 1,\n sampleDelta: intoTimescale(sample.duration, track.timescale)\n });\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n track.lastSample = sample;\n let beginNewChunk = false;\n if (!track.currentChunk) {\n beginNewChunk = true;\n } else {\n let currentChunkDuration = sample.presentationTimestamp - track.currentChunk.startTimestamp;\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let mostImportantTrack = __privateGet(this, _videoTrack) ?? __privateGet(this, _audioTrack);\n const chunkDuration = __privateGet(this, _options).minFragmentDuration ?? 1;\n if (track === mostImportantTrack && sample.type === \"key\" && currentChunkDuration >= chunkDuration) {\n beginNewChunk = true;\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this);\n }\n } else {\n beginNewChunk = currentChunkDuration >= 0.5;\n }\n }\n if (beginNewChunk) {\n if (track.currentChunk) {\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, track);\n }\n track.currentChunk = {\n startTimestamp: sample.presentationTimestamp,\n samples: []\n };\n }\n track.currentChunk.samples.push(sample);\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(presentationTimestamp, decodeTimestamp, track) {\n const strictTimestampBehavior = __privateGet(this, _options).firstTimestampBehavior === \"strict\";\n const noLastDecodeTimestamp = track.lastDecodeTimestamp === -1;\n const timestampNonZero = decodeTimestamp !== 0;\n if (strictTimestampBehavior && noLastDecodeTimestamp && timestampNonZero) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received DTS=${decodeTimestamp}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\" || __privateGet(this, _options).firstTimestampBehavior === \"cross-track-offset\") {\n if (track.firstDecodeTimestamp === void 0) {\n track.firstDecodeTimestamp = decodeTimestamp;\n }\n let baseDecodeTimestamp;\n if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n baseDecodeTimestamp = track.firstDecodeTimestamp;\n } else {\n baseDecodeTimestamp = Math.min(\n __privateGet(this, _videoTrack)?.firstDecodeTimestamp ?? Infinity,\n __privateGet(this, _audioTrack)?.firstDecodeTimestamp ?? Infinity\n );\n }\n decodeTimestamp -= baseDecodeTimestamp;\n presentationTimestamp -= baseDecodeTimestamp;\n }\n if (decodeTimestamp < track.lastDecodeTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (DTS went from ${track.lastDecodeTimestamp * 1e6} to ${decodeTimestamp * 1e6}).`\n );\n }\n track.lastDecodeTimestamp = decodeTimestamp;\n return { presentationTimestamp, decodeTimestamp };\n};\n_finalizeCurrentChunk = new WeakSet();\nfinalizeCurrentChunk_fn = function(track) {\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n throw new Error(\"Can't finalize individual chunks if 'fastStart' is set to 'fragmented'.\");\n }\n if (!track.currentChunk)\n return;\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n if (track.compactlyCodedChunkTable.length === 0 || last(track.compactlyCodedChunkTable).samplesPerChunk !== track.currentChunk.samples.length) {\n track.compactlyCodedChunkTable.push({\n firstChunk: track.finalizedChunks.length,\n // 1-indexed\n samplesPerChunk: track.currentChunk.samples.length\n });\n }\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n track.currentChunk.offset = 0;\n return;\n }\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_finalizeFragment = new WeakSet();\nfinalizeFragment_fn = function(flushStreamingWriter = true) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n throw new Error(\"Can't finalize a fragment unless 'fastStart' is set to 'fragmented'.\");\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter((track) => track && track.currentChunk);\n if (tracks.length === 0)\n return;\n let fragmentNumber = __privateWrapper(this, _nextFragmentNumber)._++;\n if (fragmentNumber === 1) {\n let movieBox = moov(tracks, __privateGet(this, _creationTime), true);\n __privateGet(this, _writer).writeBox(movieBox);\n }\n let moofOffset = __privateGet(this, _writer).pos;\n let moofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(moofBox);\n {\n let mdatBox = mdat(false);\n let totalTrackSampleSize = 0;\n for (let track of tracks) {\n for (let sample of track.currentChunk.samples) {\n totalTrackSampleSize += sample.size;\n }\n }\n let mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n if (mdatSize >= 2 ** 32) {\n mdatBox.largeSize = true;\n mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n }\n mdatBox.size = mdatSize;\n __privateGet(this, _writer).writeBox(mdatBox);\n }\n for (let track of tracks) {\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n track.currentChunk.moofOffset = moofOffset;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(moofBox));\n let newMoofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(newMoofBox);\n __privateGet(this, _writer).seek(endPos);\n for (let track of tracks) {\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n track.currentChunk = null;\n }\n if (flushStreamingWriter) {\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget\n};\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/ebml.ts\nvar EBMLFloat32 = class {\n constructor(value) {\n this.value = value;\n }\n};\nvar EBMLFloat64 = class {\n constructor(value) {\n this.value = value;\n }\n};\nvar measureUnsignedInt = (value) => {\n if (value < 1 << 8) {\n return 1;\n } else if (value < 1 << 16) {\n return 2;\n } else if (value < 1 << 24) {\n return 3;\n } else if (value < 2 ** 32) {\n return 4;\n } else if (value < 2 ** 40) {\n return 5;\n } else {\n return 6;\n }\n};\nvar measureEBMLVarInt = (value) => {\n if (value < (1 << 7) - 1) {\n return 1;\n } else if (value < (1 << 14) - 1) {\n return 2;\n } else if (value < (1 << 21) - 1) {\n return 3;\n } else if (value < (1 << 28) - 1) {\n return 4;\n } else if (value < 2 ** 35 - 1) {\n return 5;\n } else if (value < 2 ** 42 - 1) {\n return 6;\n } else {\n throw new Error(\"EBML VINT size not supported \" + value);\n }\n};\n\n// src/misc.ts\nvar readBits = (bytes, start, end) => {\n let result = 0;\n for (let i = start; i < end; i++) {\n let byteIndex = Math.floor(i / 8);\n let byte = bytes[byteIndex];\n let bitIndex = 7 - (i & 7);\n let bit = (byte & 1 << bitIndex) >> bitIndex;\n result <<= 1;\n result |= bit;\n }\n return result;\n};\nvar writeBits = (bytes, start, end, value) => {\n for (let i = start; i < end; i++) {\n let byteIndex = Math.floor(i / 8);\n let byte = bytes[byteIndex];\n let bitIndex = 7 - (i & 7);\n byte &= ~(1 << bitIndex);\n byte |= (value & 1 << end - i - 1) >> end - i - 1 << bitIndex;\n bytes[byteIndex] = byte;\n }\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.onHeader && typeof options.onHeader !== \"function\") {\n throw new TypeError(\"options.onHeader, when provided, must be a function.\");\n }\n if (options.onCluster && typeof options.onCluster !== \"function\") {\n throw new TypeError(\"options.onCluster, when provided, must be a function.\");\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView, _writeByte, writeByte_fn, _writeFloat32, writeFloat32_fn, _writeFloat64, writeFloat64_fn, _writeUnsignedInt, writeUnsignedInt_fn, _writeString, writeString_fn;\nvar Writer = class {\n constructor() {\n __privateAdd(this, _writeByte);\n __privateAdd(this, _writeFloat32);\n __privateAdd(this, _writeFloat64);\n __privateAdd(this, _writeUnsignedInt);\n __privateAdd(this, _writeString);\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n this.offsets = /* @__PURE__ */ new WeakMap();\n this.dataOffsets = /* @__PURE__ */ new WeakMap();\n }\n seek(newPos) {\n this.pos = newPos;\n }\n writeEBMLVarInt(value, width = measureEBMLVarInt(value)) {\n let pos = 0;\n switch (width) {\n case 1:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 7 | value);\n break;\n case 2:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 6 | value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 3:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 5 | value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 4:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 4 | value >> 24);\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 5:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 3 | value / 2 ** 32 & 7);\n __privateGet(this, _helperView).setUint8(pos++, value >> 24);\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n case 6:\n __privateGet(this, _helperView).setUint8(pos++, 1 << 2 | value / 2 ** 40 & 3);\n __privateGet(this, _helperView).setUint8(pos++, value / 2 ** 32 | 0);\n __privateGet(this, _helperView).setUint8(pos++, value >> 24);\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n default:\n throw new Error(\"Bad EBML VINT size \" + width);\n }\n this.write(__privateGet(this, _helper).subarray(0, pos));\n }\n writeEBML(data) {\n if (data === null)\n return;\n if (data instanceof Uint8Array) {\n this.write(data);\n } else if (Array.isArray(data)) {\n for (let elem of data) {\n this.writeEBML(elem);\n }\n } else {\n this.offsets.set(data, this.pos);\n __privateMethod(this, _writeUnsignedInt, writeUnsignedInt_fn).call(this, data.id);\n if (Array.isArray(data.data)) {\n let sizePos = this.pos;\n let sizeSize = data.size === -1 ? 1 : data.size ?? 4;\n if (data.size === -1) {\n __privateMethod(this, _writeByte, writeByte_fn).call(this, 255);\n } else {\n this.seek(this.pos + sizeSize);\n }\n let startPos = this.pos;\n this.dataOffsets.set(data, startPos);\n this.writeEBML(data.data);\n if (data.size !== -1) {\n let size = this.pos - startPos;\n let endPos = this.pos;\n this.seek(sizePos);\n this.writeEBMLVarInt(size, sizeSize);\n this.seek(endPos);\n }\n } else if (typeof data.data === \"number\") {\n let size = data.size ?? measureUnsignedInt(data.data);\n this.writeEBMLVarInt(size);\n __privateMethod(this, _writeUnsignedInt, writeUnsignedInt_fn).call(this, data.data, size);\n } else if (typeof data.data === \"string\") {\n this.writeEBMLVarInt(data.data.length);\n __privateMethod(this, _writeString, writeString_fn).call(this, data.data);\n } else if (data.data instanceof Uint8Array) {\n this.writeEBMLVarInt(data.data.byteLength, data.size);\n this.write(data.data);\n } else if (data.data instanceof EBMLFloat32) {\n this.writeEBMLVarInt(4);\n __privateMethod(this, _writeFloat32, writeFloat32_fn).call(this, data.data.value);\n } else if (data.data instanceof EBMLFloat64) {\n this.writeEBMLVarInt(8);\n __privateMethod(this, _writeFloat64, writeFloat64_fn).call(this, data.data.value);\n }\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\n_writeByte = new WeakSet();\nwriteByte_fn = function(value) {\n __privateGet(this, _helperView).setUint8(0, value);\n this.write(__privateGet(this, _helper).subarray(0, 1));\n};\n_writeFloat32 = new WeakSet();\nwriteFloat32_fn = function(value) {\n __privateGet(this, _helperView).setFloat32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n};\n_writeFloat64 = new WeakSet();\nwriteFloat64_fn = function(value) {\n __privateGet(this, _helperView).setFloat64(0, value, false);\n this.write(__privateGet(this, _helper));\n};\n_writeUnsignedInt = new WeakSet();\nwriteUnsignedInt_fn = function(value, width = measureUnsignedInt(value)) {\n let pos = 0;\n switch (width) {\n case 6:\n __privateGet(this, _helperView).setUint8(pos++, value / 2 ** 40 | 0);\n case 5:\n __privateGet(this, _helperView).setUint8(pos++, value / 2 ** 32 | 0);\n case 4:\n __privateGet(this, _helperView).setUint8(pos++, value >> 24);\n case 3:\n __privateGet(this, _helperView).setUint8(pos++, value >> 16);\n case 2:\n __privateGet(this, _helperView).setUint8(pos++, value >> 8);\n case 1:\n __privateGet(this, _helperView).setUint8(pos++, value);\n break;\n default:\n throw new Error(\"Bad UINT size \" + width);\n }\n this.write(__privateGet(this, _helper).subarray(0, pos));\n};\n_writeString = new WeakSet();\nwriteString_fn = function(str) {\n this.write(new Uint8Array(str.split(\"\").map((x) => x.charCodeAt(0))));\n};\nvar _target, _buffer, _bytes, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, this.pos);\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar _trackingWrites, _trackedWrites, _trackedStart, _trackedEnd;\nvar BaseStreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n this.target = target;\n __privateAdd(this, _trackingWrites, false);\n __privateAdd(this, _trackedWrites, void 0);\n __privateAdd(this, _trackedStart, void 0);\n __privateAdd(this, _trackedEnd, void 0);\n }\n write(data) {\n if (!__privateGet(this, _trackingWrites))\n return;\n let pos = this.pos;\n if (pos < __privateGet(this, _trackedStart)) {\n if (pos + data.byteLength <= __privateGet(this, _trackedStart))\n return;\n data = data.subarray(__privateGet(this, _trackedStart) - pos);\n pos = 0;\n }\n let neededSize = pos + data.byteLength - __privateGet(this, _trackedStart);\n let newLength = __privateGet(this, _trackedWrites).byteLength;\n while (newLength < neededSize)\n newLength *= 2;\n if (newLength !== __privateGet(this, _trackedWrites).byteLength) {\n let copy = new Uint8Array(newLength);\n copy.set(__privateGet(this, _trackedWrites), 0);\n __privateSet(this, _trackedWrites, copy);\n }\n __privateGet(this, _trackedWrites).set(data, pos - __privateGet(this, _trackedStart));\n __privateSet(this, _trackedEnd, Math.max(__privateGet(this, _trackedEnd), pos + data.byteLength));\n }\n startTrackingWrites() {\n __privateSet(this, _trackingWrites, true);\n __privateSet(this, _trackedWrites, new Uint8Array(2 ** 10));\n __privateSet(this, _trackedStart, this.pos);\n __privateSet(this, _trackedEnd, this.pos);\n }\n getTrackedWrites() {\n if (!__privateGet(this, _trackingWrites)) {\n throw new Error(\"Can't get tracked writes since nothing was tracked.\");\n }\n let slice = __privateGet(this, _trackedWrites).subarray(0, __privateGet(this, _trackedEnd) - __privateGet(this, _trackedStart));\n let result = {\n data: slice,\n start: __privateGet(this, _trackedStart),\n end: __privateGet(this, _trackedEnd)\n };\n __privateSet(this, _trackedWrites, void 0);\n __privateSet(this, _trackingWrites, false);\n return result;\n }\n};\n_trackingWrites = new WeakMap();\n_trackedWrites = new WeakMap();\n_trackedStart = new WeakMap();\n_trackedEnd = new WeakMap();\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _sections, _lastFlushEnd, _ensureMonotonicity, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends BaseStreamTargetWriter {\n constructor(target, ensureMonotonicity) {\n super(target);\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _lastFlushEnd, 0);\n __privateAdd(this, _ensureMonotonicity, void 0);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n __privateAdd(this, _chunks, []);\n __privateSet(this, _ensureMonotonicity, ensureMonotonicity);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n super.write(data);\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n if (__privateGet(this, _ensureMonotonicity) && chunk.start < __privateGet(this, _lastFlushEnd)) {\n throw new Error(\"Internal error: Monotonicity violation.\");\n }\n this.target.options.onData?.(chunk.data, chunk.start);\n __privateSet(this, _lastFlushEnd, chunk.start + chunk.data.byteLength);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_sections = new WeakMap();\n_lastFlushEnd = new WeakMap();\n_ensureMonotonicity = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n if (__privateGet(this, _ensureMonotonicity) && chunk.start + section.start < __privateGet(this, _lastFlushEnd)) {\n throw new Error(\"Internal error: Monotonicity violation.\");\n }\n this.target.options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n __privateSet(this, _lastFlushEnd, chunk.start + section.end);\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target, ensureMonotonicity) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }), ensureMonotonicity);\n }\n};\n\n// src/muxer.ts\nvar VIDEO_TRACK_NUMBER = 1;\nvar AUDIO_TRACK_NUMBER = 2;\nvar SUBTITLE_TRACK_NUMBER = 3;\nvar VIDEO_TRACK_TYPE = 1;\nvar AUDIO_TRACK_TYPE = 2;\nvar SUBTITLE_TRACK_TYPE = 17;\nvar MAX_CHUNK_LENGTH_MS = 2 ** 15;\nvar CODEC_PRIVATE_MAX_SIZE = 2 ** 13;\nvar APP_NAME = \"https://github.com/Vanilagy/webm-muxer\";\nvar SEGMENT_SIZE_BYTES = 6;\nvar CLUSTER_SIZE_BYTES = 5;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"permissive\"];\nvar _options, _writer, _segment, _segmentInfo, _seekHead, _tracksElement, _segmentDuration, _colourElement, _videoCodecPrivate, _audioCodecPrivate, _subtitleCodecPrivate, _cues, _currentCluster, _currentClusterTimestamp, _duration, _videoChunkQueue, _audioChunkQueue, _subtitleChunkQueue, _firstVideoTimestamp, _firstAudioTimestamp, _lastVideoTimestamp, _lastAudioTimestamp, _lastSubtitleTimestamp, _colorSpace, _finalized, _validateOptions, validateOptions_fn, _createFileHeader, createFileHeader_fn, _writeEBMLHeader, writeEBMLHeader_fn, _createCodecPrivatePlaceholders, createCodecPrivatePlaceholders_fn, _createColourElement, createColourElement_fn, _createSeekHead, createSeekHead_fn, _createSegmentInfo, createSegmentInfo_fn, _createTracks, createTracks_fn, _createSegment, createSegment_fn, _createCues, createCues_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _segmentDataOffset, segmentDataOffset_get, _writeVideoDecoderConfig, writeVideoDecoderConfig_fn, _fixVP9ColorSpace, fixVP9ColorSpace_fn, _writeSubtitleChunks, writeSubtitleChunks_fn, _createInternalChunk, createInternalChunk_fn, _validateTimestamp, validateTimestamp_fn, _writeBlock, writeBlock_fn, _createCodecPrivateElement, createCodecPrivateElement_fn, _writeCodecPrivate, writeCodecPrivate_fn, _createNewCluster, createNewCluster_fn, _finalizeCurrentCluster, finalizeCurrentCluster_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _createFileHeader);\n __privateAdd(this, _writeEBMLHeader);\n __privateAdd(this, _createCodecPrivatePlaceholders);\n __privateAdd(this, _createColourElement);\n __privateAdd(this, _createSeekHead);\n __privateAdd(this, _createSegmentInfo);\n __privateAdd(this, _createTracks);\n __privateAdd(this, _createSegment);\n __privateAdd(this, _createCues);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _segmentDataOffset);\n __privateAdd(this, _writeVideoDecoderConfig);\n __privateAdd(this, _fixVP9ColorSpace);\n __privateAdd(this, _writeSubtitleChunks);\n __privateAdd(this, _createInternalChunk);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _writeBlock);\n __privateAdd(this, _createCodecPrivateElement);\n __privateAdd(this, _writeCodecPrivate);\n __privateAdd(this, _createNewCluster);\n __privateAdd(this, _finalizeCurrentCluster);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _segment, void 0);\n __privateAdd(this, _segmentInfo, void 0);\n __privateAdd(this, _seekHead, void 0);\n __privateAdd(this, _tracksElement, void 0);\n __privateAdd(this, _segmentDuration, void 0);\n __privateAdd(this, _colourElement, void 0);\n __privateAdd(this, _videoCodecPrivate, void 0);\n __privateAdd(this, _audioCodecPrivate, void 0);\n __privateAdd(this, _subtitleCodecPrivate, void 0);\n __privateAdd(this, _cues, void 0);\n __privateAdd(this, _currentCluster, void 0);\n __privateAdd(this, _currentClusterTimestamp, void 0);\n __privateAdd(this, _duration, 0);\n __privateAdd(this, _videoChunkQueue, []);\n __privateAdd(this, _audioChunkQueue, []);\n __privateAdd(this, _subtitleChunkQueue, []);\n __privateAdd(this, _firstVideoTimestamp, void 0);\n __privateAdd(this, _firstAudioTimestamp, void 0);\n __privateAdd(this, _lastVideoTimestamp, -1);\n __privateAdd(this, _lastAudioTimestamp, -1);\n __privateAdd(this, _lastSubtitleTimestamp, -1);\n __privateAdd(this, _colorSpace, void 0);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n __privateSet(this, _options, {\n type: \"webm\",\n firstTimestampBehavior: \"strict\",\n ...options\n });\n this.target = options.target;\n let ensureMonotonicity = !!__privateGet(this, _options).streaming;\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target, ensureMonotonicity));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target, ensureMonotonicity));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _createFileHeader, createFileHeader_fn).call(this);\n }\n addVideoChunk(chunk, meta, timestamp) {\n if (!(chunk instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (chunk) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n this.addVideoChunkRaw(data, chunk.type, timestamp ?? chunk.timestamp, meta);\n }\n addVideoChunkRaw(data, type, timestamp, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (__privateGet(this, _firstVideoTimestamp) === void 0)\n __privateSet(this, _firstVideoTimestamp, timestamp);\n if (meta)\n __privateMethod(this, _writeVideoDecoderConfig, writeVideoDecoderConfig_fn).call(this, meta);\n let videoChunk = __privateMethod(this, _createInternalChunk, createInternalChunk_fn).call(this, data, type, timestamp, VIDEO_TRACK_NUMBER);\n if (__privateGet(this, _options).video.codec === \"V_VP9\")\n __privateMethod(this, _fixVP9ColorSpace, fixVP9ColorSpace_fn).call(this, videoChunk);\n __privateSet(this, _lastVideoTimestamp, videoChunk.timestamp);\n while (__privateGet(this, _audioChunkQueue).length > 0 && __privateGet(this, _audioChunkQueue)[0].timestamp <= videoChunk.timestamp) {\n let audioChunk = __privateGet(this, _audioChunkQueue).shift();\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, audioChunk, false);\n }\n if (!__privateGet(this, _options).audio || videoChunk.timestamp <= __privateGet(this, _lastAudioTimestamp)) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, videoChunk, true);\n } else {\n __privateGet(this, _videoChunkQueue).push(videoChunk);\n }\n __privateMethod(this, _writeSubtitleChunks, writeSubtitleChunks_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n addAudioChunk(chunk, meta, timestamp) {\n if (!(chunk instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (chunk) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n this.addAudioChunkRaw(data, chunk.type, timestamp ?? chunk.timestamp, meta);\n }\n addAudioChunkRaw(data, type, timestamp, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (__privateGet(this, _firstAudioTimestamp) === void 0)\n __privateSet(this, _firstAudioTimestamp, timestamp);\n if (meta?.decoderConfig) {\n if (__privateGet(this, _options).streaming) {\n __privateSet(this, _audioCodecPrivate, __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, meta.decoderConfig.description));\n } else {\n __privateMethod(this, _writeCodecPrivate, writeCodecPrivate_fn).call(this, __privateGet(this, _audioCodecPrivate), meta.decoderConfig.description);\n }\n }\n let audioChunk = __privateMethod(this, _createInternalChunk, createInternalChunk_fn).call(this, data, type, timestamp, AUDIO_TRACK_NUMBER);\n __privateSet(this, _lastAudioTimestamp, audioChunk.timestamp);\n while (__privateGet(this, _videoChunkQueue).length > 0 && __privateGet(this, _videoChunkQueue)[0].timestamp <= audioChunk.timestamp) {\n let videoChunk = __privateGet(this, _videoChunkQueue).shift();\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, videoChunk, true);\n }\n if (!__privateGet(this, _options).video || audioChunk.timestamp <= __privateGet(this, _lastVideoTimestamp)) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, audioChunk, !__privateGet(this, _options).video);\n } else {\n __privateGet(this, _audioChunkQueue).push(audioChunk);\n }\n __privateMethod(this, _writeSubtitleChunks, writeSubtitleChunks_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n addSubtitleChunk(chunk, meta, timestamp) {\n if (typeof chunk !== \"object\" || !chunk) {\n throw new TypeError(\"addSubtitleChunk's first argument (chunk) must be an object.\");\n } else {\n if (!(chunk.body instanceof Uint8Array)) {\n throw new TypeError(\"body must be an instance of Uint8Array.\");\n }\n if (!Number.isFinite(chunk.timestamp) || chunk.timestamp < 0) {\n throw new TypeError(\"timestamp must be a non-negative real number.\");\n }\n if (!Number.isFinite(chunk.duration) || chunk.duration < 0) {\n throw new TypeError(\"duration must be a non-negative real number.\");\n }\n if (chunk.additions && !(chunk.additions instanceof Uint8Array)) {\n throw new TypeError(\"additions, when present, must be an instance of Uint8Array.\");\n }\n }\n if (typeof meta !== \"object\") {\n throw new TypeError(\"addSubtitleChunk's second argument (meta) must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).subtitles)\n throw new Error(\"No subtitle track declared.\");\n if (meta?.decoderConfig) {\n if (__privateGet(this, _options).streaming) {\n __privateSet(this, _subtitleCodecPrivate, __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, meta.decoderConfig.description));\n } else {\n __privateMethod(this, _writeCodecPrivate, writeCodecPrivate_fn).call(this, __privateGet(this, _subtitleCodecPrivate), meta.decoderConfig.description);\n }\n }\n let subtitleChunk = __privateMethod(this, _createInternalChunk, createInternalChunk_fn).call(this, chunk.body, \"key\", timestamp ?? chunk.timestamp, SUBTITLE_TRACK_NUMBER, chunk.duration, chunk.additions);\n __privateSet(this, _lastSubtitleTimestamp, subtitleChunk.timestamp);\n __privateGet(this, _subtitleChunkQueue).push(subtitleChunk);\n __privateMethod(this, _writeSubtitleChunks, writeSubtitleChunks_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n while (__privateGet(this, _videoChunkQueue).length > 0)\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, __privateGet(this, _videoChunkQueue).shift(), true);\n while (__privateGet(this, _audioChunkQueue).length > 0)\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, __privateGet(this, _audioChunkQueue).shift(), true);\n while (__privateGet(this, _subtitleChunkQueue).length > 0 && __privateGet(this, _subtitleChunkQueue)[0].timestamp <= __privateGet(this, _duration)) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, __privateGet(this, _subtitleChunkQueue).shift(), false);\n }\n if (__privateGet(this, _currentCluster)) {\n __privateMethod(this, _finalizeCurrentCluster, finalizeCurrentCluster_fn).call(this);\n }\n __privateGet(this, _writer).writeEBML(__privateGet(this, _cues));\n if (!__privateGet(this, _options).streaming) {\n let endPos = __privateGet(this, _writer).pos;\n let segmentSize = __privateGet(this, _writer).pos - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _segment)) + 4);\n __privateGet(this, _writer).writeEBMLVarInt(segmentSize, SEGMENT_SIZE_BYTES);\n __privateGet(this, _segmentDuration).data = new EBMLFloat64(__privateGet(this, _duration));\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _segmentDuration)));\n __privateGet(this, _writer).writeEBML(__privateGet(this, _segmentDuration));\n __privateGet(this, _seekHead).data[0].data[1].data = __privateGet(this, _writer).offsets.get(__privateGet(this, _cues)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _seekHead).data[1].data[1].data = __privateGet(this, _writer).offsets.get(__privateGet(this, _segmentInfo)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _seekHead).data[2].data[1].data = __privateGet(this, _writer).offsets.get(__privateGet(this, _tracksElement)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _seekHead)));\n __privateGet(this, _writer).writeEBML(__privateGet(this, _seekHead));\n __privateGet(this, _writer).seek(endPos);\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_segment = new WeakMap();\n_segmentInfo = new WeakMap();\n_seekHead = new WeakMap();\n_tracksElement = new WeakMap();\n_segmentDuration = new WeakMap();\n_colourElement = new WeakMap();\n_videoCodecPrivate = new WeakMap();\n_audioCodecPrivate = new WeakMap();\n_subtitleCodecPrivate = new WeakMap();\n_cues = new WeakMap();\n_currentCluster = new WeakMap();\n_currentClusterTimestamp = new WeakMap();\n_duration = new WeakMap();\n_videoChunkQueue = new WeakMap();\n_audioChunkQueue = new WeakMap();\n_subtitleChunkQueue = new WeakMap();\n_firstVideoTimestamp = new WeakMap();\n_firstAudioTimestamp = new WeakMap();\n_lastVideoTimestamp = new WeakMap();\n_lastAudioTimestamp = new WeakMap();\n_lastSubtitleTimestamp = new WeakMap();\n_colorSpace = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (typeof options.video.codec !== \"string\") {\n throw new TypeError(`Invalid video codec: ${options.video.codec}. Must be a string.`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n if (options.video.frameRate !== void 0) {\n if (!Number.isFinite(options.video.frameRate) || options.video.frameRate <= 0) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive number.`\n );\n }\n }\n if (options.video.alpha !== void 0 && typeof options.video.alpha !== \"boolean\") {\n throw new TypeError(`Invalid video alpha: ${options.video.alpha}. Must be a boolean.`);\n }\n }\n if (options.audio) {\n if (typeof options.audio.codec !== \"string\") {\n throw new TypeError(`Invalid audio codec: ${options.audio.codec}. Must be a string.`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n if (options.audio.bitDepth !== void 0) {\n if (!Number.isInteger(options.audio.bitDepth) || options.audio.bitDepth <= 0) {\n throw new TypeError(\n `Invalid audio bit depth: ${options.audio.bitDepth}. Must be a positive integer.`\n );\n }\n }\n }\n if (options.subtitles) {\n if (typeof options.subtitles.codec !== \"string\") {\n throw new TypeError(`Invalid subtitles codec: ${options.subtitles.codec}. Must be a string.`);\n }\n }\n if (options.type !== void 0 && ![\"webm\", \"matroska\"].includes(options.type)) {\n throw new TypeError(`Invalid type: ${options.type}. Must be 'webm' or 'matroska'.`);\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (options.streaming !== void 0 && typeof options.streaming !== \"boolean\") {\n throw new TypeError(`Invalid streaming option: ${options.streaming}. Must be a boolean.`);\n }\n};\n_createFileHeader = new WeakSet();\ncreateFileHeader_fn = function() {\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onHeader) {\n __privateGet(this, _writer).startTrackingWrites();\n }\n __privateMethod(this, _writeEBMLHeader, writeEBMLHeader_fn).call(this);\n if (!__privateGet(this, _options).streaming) {\n __privateMethod(this, _createSeekHead, createSeekHead_fn).call(this);\n }\n __privateMethod(this, _createSegmentInfo, createSegmentInfo_fn).call(this);\n __privateMethod(this, _createCodecPrivatePlaceholders, createCodecPrivatePlaceholders_fn).call(this);\n __privateMethod(this, _createColourElement, createColourElement_fn).call(this);\n if (!__privateGet(this, _options).streaming) {\n __privateMethod(this, _createTracks, createTracks_fn).call(this);\n __privateMethod(this, _createSegment, createSegment_fn).call(this);\n } else {\n }\n __privateMethod(this, _createCues, createCues_fn).call(this);\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_writeEBMLHeader = new WeakSet();\nwriteEBMLHeader_fn = function() {\n let ebmlHeader = { id: 440786851 /* EBML */, data: [\n { id: 17030 /* EBMLVersion */, data: 1 },\n { id: 17143 /* EBMLReadVersion */, data: 1 },\n { id: 17138 /* EBMLMaxIDLength */, data: 4 },\n { id: 17139 /* EBMLMaxSizeLength */, data: 8 },\n { id: 17026 /* DocType */, data: __privateGet(this, _options).type ?? \"webm\" },\n { id: 17031 /* DocTypeVersion */, data: 2 },\n { id: 17029 /* DocTypeReadVersion */, data: 2 }\n ] };\n __privateGet(this, _writer).writeEBML(ebmlHeader);\n};\n_createCodecPrivatePlaceholders = new WeakSet();\ncreateCodecPrivatePlaceholders_fn = function() {\n __privateSet(this, _videoCodecPrivate, { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n __privateSet(this, _audioCodecPrivate, { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n __privateSet(this, _subtitleCodecPrivate, { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n};\n_createColourElement = new WeakSet();\ncreateColourElement_fn = function() {\n __privateSet(this, _colourElement, { id: 21936 /* Colour */, data: [\n { id: 21937 /* MatrixCoefficients */, data: 2 },\n { id: 21946 /* TransferCharacteristics */, data: 2 },\n { id: 21947 /* Primaries */, data: 2 },\n { id: 21945 /* Range */, data: 0 }\n ] });\n};\n_createSeekHead = new WeakSet();\ncreateSeekHead_fn = function() {\n const kaxCues = new Uint8Array([28, 83, 187, 107]);\n const kaxInfo = new Uint8Array([21, 73, 169, 102]);\n const kaxTracks = new Uint8Array([22, 84, 174, 107]);\n let seekHead = { id: 290298740 /* SeekHead */, data: [\n { id: 19899 /* Seek */, data: [\n { id: 21419 /* SeekID */, data: kaxCues },\n { id: 21420 /* SeekPosition */, size: 5, data: 0 }\n ] },\n { id: 19899 /* Seek */, data: [\n { id: 21419 /* SeekID */, data: kaxInfo },\n { id: 21420 /* SeekPosition */, size: 5, data: 0 }\n ] },\n { id: 19899 /* Seek */, data: [\n { id: 21419 /* SeekID */, data: kaxTracks },\n { id: 21420 /* SeekPosition */, size: 5, data: 0 }\n ] }\n ] };\n __privateSet(this, _seekHead, seekHead);\n};\n_createSegmentInfo = new WeakSet();\ncreateSegmentInfo_fn = function() {\n let segmentDuration = { id: 17545 /* Duration */, data: new EBMLFloat64(0) };\n __privateSet(this, _segmentDuration, segmentDuration);\n let segmentInfo = { id: 357149030 /* Info */, data: [\n { id: 2807729 /* TimestampScale */, data: 1e6 },\n { id: 19840 /* MuxingApp */, data: APP_NAME },\n { id: 22337 /* WritingApp */, data: APP_NAME },\n !__privateGet(this, _options).streaming ? segmentDuration : null\n ] };\n __privateSet(this, _segmentInfo, segmentInfo);\n};\n_createTracks = new WeakSet();\ncreateTracks_fn = function() {\n let tracksElement = { id: 374648427 /* Tracks */, data: [] };\n __privateSet(this, _tracksElement, tracksElement);\n if (__privateGet(this, _options).video) {\n tracksElement.data.push({ id: 174 /* TrackEntry */, data: [\n { id: 215 /* TrackNumber */, data: VIDEO_TRACK_NUMBER },\n { id: 29637 /* TrackUID */, data: VIDEO_TRACK_NUMBER },\n { id: 131 /* TrackType */, data: VIDEO_TRACK_TYPE },\n { id: 134 /* CodecID */, data: __privateGet(this, _options).video.codec },\n __privateGet(this, _videoCodecPrivate),\n __privateGet(this, _options).video.frameRate ? { id: 2352003 /* DefaultDuration */, data: 1e9 / __privateGet(this, _options).video.frameRate } : null,\n { id: 224 /* Video */, data: [\n { id: 176 /* PixelWidth */, data: __privateGet(this, _options).video.width },\n { id: 186 /* PixelHeight */, data: __privateGet(this, _options).video.height },\n __privateGet(this, _options).video.alpha ? { id: 21440 /* AlphaMode */, data: 1 } : null,\n __privateGet(this, _colourElement)\n ] }\n ] });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioCodecPrivate, __privateGet(this, _options).streaming ? __privateGet(this, _audioCodecPrivate) || null : { id: 236 /* Void */, size: 4, data: new Uint8Array(CODEC_PRIVATE_MAX_SIZE) });\n tracksElement.data.push({ id: 174 /* TrackEntry */, data: [\n { id: 215 /* TrackNumber */, data: AUDIO_TRACK_NUMBER },\n { id: 29637 /* TrackUID */, data: AUDIO_TRACK_NUMBER },\n { id: 131 /* TrackType */, data: AUDIO_TRACK_TYPE },\n { id: 134 /* CodecID */, data: __privateGet(this, _options).audio.codec },\n __privateGet(this, _audioCodecPrivate),\n { id: 225 /* Audio */, data: [\n { id: 181 /* SamplingFrequency */, data: new EBMLFloat32(__privateGet(this, _options).audio.sampleRate) },\n { id: 159 /* Channels */, data: __privateGet(this, _options).audio.numberOfChannels },\n __privateGet(this, _options).audio.bitDepth ? { id: 25188 /* BitDepth */, data: __privateGet(this, _options).audio.bitDepth } : null\n ] }\n ] });\n }\n if (__privateGet(this, _options).subtitles) {\n tracksElement.data.push({ id: 174 /* TrackEntry */, data: [\n { id: 215 /* TrackNumber */, data: SUBTITLE_TRACK_NUMBER },\n { id: 29637 /* TrackUID */, data: SUBTITLE_TRACK_NUMBER },\n { id: 131 /* TrackType */, data: SUBTITLE_TRACK_TYPE },\n { id: 134 /* CodecID */, data: __privateGet(this, _options).subtitles.codec },\n __privateGet(this, _subtitleCodecPrivate)\n ] });\n }\n};\n_createSegment = new WeakSet();\ncreateSegment_fn = function() {\n let segment = {\n id: 408125543 /* Segment */,\n size: __privateGet(this, _options).streaming ? -1 : SEGMENT_SIZE_BYTES,\n data: [\n !__privateGet(this, _options).streaming ? __privateGet(this, _seekHead) : null,\n __privateGet(this, _segmentInfo),\n __privateGet(this, _tracksElement)\n ]\n };\n __privateSet(this, _segment, segment);\n __privateGet(this, _writer).writeEBML(segment);\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onHeader) {\n let { data, start } = __privateGet(this, _writer).getTrackedWrites();\n __privateGet(this, _writer).target.options.onHeader(data, start);\n }\n};\n_createCues = new WeakSet();\ncreateCues_fn = function() {\n __privateSet(this, _cues, { id: 475249515 /* Cues */, data: [] });\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_segmentDataOffset = new WeakSet();\nsegmentDataOffset_get = function() {\n return __privateGet(this, _writer).dataOffsets.get(__privateGet(this, _segment));\n};\n_writeVideoDecoderConfig = new WeakSet();\nwriteVideoDecoderConfig_fn = function(meta) {\n if (!meta.decoderConfig)\n return;\n if (meta.decoderConfig.colorSpace) {\n let colorSpace = meta.decoderConfig.colorSpace;\n __privateSet(this, _colorSpace, colorSpace);\n __privateGet(this, _colourElement).data = [\n { id: 21937 /* MatrixCoefficients */, data: {\n \"rgb\": 1,\n \"bt709\": 1,\n \"bt470bg\": 5,\n \"smpte170m\": 6\n }[colorSpace.matrix] },\n { id: 21946 /* TransferCharacteristics */, data: {\n \"bt709\": 1,\n \"smpte170m\": 6,\n \"iec61966-2-1\": 13\n }[colorSpace.transfer] },\n { id: 21947 /* Primaries */, data: {\n \"bt709\": 1,\n \"bt470bg\": 5,\n \"smpte170m\": 6\n }[colorSpace.primaries] },\n { id: 21945 /* Range */, data: [1, 2][Number(colorSpace.fullRange)] }\n ];\n if (!__privateGet(this, _options).streaming) {\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _colourElement)));\n __privateGet(this, _writer).writeEBML(__privateGet(this, _colourElement));\n __privateGet(this, _writer).seek(endPos);\n }\n }\n if (meta.decoderConfig.description) {\n if (__privateGet(this, _options).streaming) {\n __privateSet(this, _videoCodecPrivate, __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, meta.decoderConfig.description));\n } else {\n __privateMethod(this, _writeCodecPrivate, writeCodecPrivate_fn).call(this, __privateGet(this, _videoCodecPrivate), meta.decoderConfig.description);\n }\n }\n};\n_fixVP9ColorSpace = new WeakSet();\nfixVP9ColorSpace_fn = function(chunk) {\n if (chunk.type !== \"key\")\n return;\n if (!__privateGet(this, _colorSpace))\n return;\n let i = 0;\n if (readBits(chunk.data, 0, 2) !== 2)\n return;\n i += 2;\n let profile = (readBits(chunk.data, i + 1, i + 2) << 1) + readBits(chunk.data, i + 0, i + 1);\n i += 2;\n if (profile === 3)\n i++;\n let showExistingFrame = readBits(chunk.data, i + 0, i + 1);\n i++;\n if (showExistingFrame)\n return;\n let frameType = readBits(chunk.data, i + 0, i + 1);\n i++;\n if (frameType !== 0)\n return;\n i += 2;\n let syncCode = readBits(chunk.data, i + 0, i + 24);\n i += 24;\n if (syncCode !== 4817730)\n return;\n if (profile >= 2)\n i++;\n let colorSpaceID = {\n \"rgb\": 7,\n \"bt709\": 2,\n \"bt470bg\": 1,\n \"smpte170m\": 3\n }[__privateGet(this, _colorSpace).matrix];\n writeBits(chunk.data, i + 0, i + 3, colorSpaceID);\n};\n_writeSubtitleChunks = new WeakSet();\nwriteSubtitleChunks_fn = function() {\n let lastWrittenMediaTimestamp = Math.min(\n __privateGet(this, _options).video ? __privateGet(this, _lastVideoTimestamp) : Infinity,\n __privateGet(this, _options).audio ? __privateGet(this, _lastAudioTimestamp) : Infinity\n );\n let queue = __privateGet(this, _subtitleChunkQueue);\n while (queue.length > 0 && queue[0].timestamp <= lastWrittenMediaTimestamp) {\n __privateMethod(this, _writeBlock, writeBlock_fn).call(this, queue.shift(), !__privateGet(this, _options).video && !__privateGet(this, _options).audio);\n }\n};\n_createInternalChunk = new WeakSet();\ncreateInternalChunk_fn = function(data, type, timestamp, trackNumber, duration, additions) {\n let adjustedTimestamp = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, timestamp, trackNumber);\n let internalChunk = {\n data,\n additions,\n type,\n timestamp: adjustedTimestamp,\n duration,\n trackNumber\n };\n return internalChunk;\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(timestamp, trackNumber) {\n let lastTimestamp = trackNumber === VIDEO_TRACK_NUMBER ? __privateGet(this, _lastVideoTimestamp) : trackNumber === AUDIO_TRACK_NUMBER ? __privateGet(this, _lastAudioTimestamp) : __privateGet(this, _lastSubtitleTimestamp);\n if (trackNumber !== SUBTITLE_TRACK_NUMBER) {\n let firstTimestamp = trackNumber === VIDEO_TRACK_NUMBER ? __privateGet(this, _firstVideoTimestamp) : __privateGet(this, _firstAudioTimestamp);\n if (__privateGet(this, _options).firstTimestampBehavior === \"strict\" && lastTimestamp === -1 && timestamp !== 0) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received ${timestamp}). Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of the document, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\nIf you want to allow non-zero first timestamps, set firstTimestampBehavior: 'permissive'.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n timestamp -= firstTimestamp;\n }\n }\n if (timestamp < lastTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (went from ${lastTimestamp} to ${timestamp}).`\n );\n }\n if (timestamp < 0) {\n throw new Error(`Timestamps must be non-negative (received ${timestamp}).`);\n }\n return timestamp;\n};\n_writeBlock = new WeakSet();\nwriteBlock_fn = function(chunk, canCreateNewCluster) {\n if (__privateGet(this, _options).streaming && !__privateGet(this, _tracksElement)) {\n __privateMethod(this, _createTracks, createTracks_fn).call(this);\n __privateMethod(this, _createSegment, createSegment_fn).call(this);\n }\n let msTimestamp = Math.floor(chunk.timestamp / 1e3);\n let relativeTimestamp = msTimestamp - __privateGet(this, _currentClusterTimestamp);\n let shouldCreateNewClusterFromKeyFrame = canCreateNewCluster && chunk.type === \"key\" && relativeTimestamp >= 1e3;\n let clusterWouldBeTooLong = relativeTimestamp >= MAX_CHUNK_LENGTH_MS;\n if (!__privateGet(this, _currentCluster) || shouldCreateNewClusterFromKeyFrame || clusterWouldBeTooLong) {\n __privateMethod(this, _createNewCluster, createNewCluster_fn).call(this, msTimestamp);\n relativeTimestamp = 0;\n }\n if (relativeTimestamp < 0) {\n return;\n }\n let prelude = new Uint8Array(4);\n let view = new DataView(prelude.buffer);\n view.setUint8(0, 128 | chunk.trackNumber);\n view.setInt16(1, relativeTimestamp, false);\n if (chunk.duration === void 0 && !chunk.additions) {\n view.setUint8(3, Number(chunk.type === \"key\") << 7);\n let simpleBlock = { id: 163 /* SimpleBlock */, data: [\n prelude,\n chunk.data\n ] };\n __privateGet(this, _writer).writeEBML(simpleBlock);\n } else {\n let msDuration = Math.floor(chunk.duration / 1e3);\n let blockGroup = { id: 160 /* BlockGroup */, data: [\n { id: 161 /* Block */, data: [\n prelude,\n chunk.data\n ] },\n chunk.duration !== void 0 ? { id: 155 /* BlockDuration */, data: msDuration } : null,\n chunk.additions ? { id: 30113 /* BlockAdditions */, data: chunk.additions } : null\n ] };\n __privateGet(this, _writer).writeEBML(blockGroup);\n }\n __privateSet(this, _duration, Math.max(__privateGet(this, _duration), msTimestamp));\n};\n_createCodecPrivateElement = new WeakSet();\ncreateCodecPrivateElement_fn = function(data) {\n return { id: 25506 /* CodecPrivate */, size: 4, data: new Uint8Array(data) };\n};\n_writeCodecPrivate = new WeakSet();\nwriteCodecPrivate_fn = function(element, data) {\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(element));\n let codecPrivateElementSize = 2 + 4 + data.byteLength;\n let voidDataSize = CODEC_PRIVATE_MAX_SIZE - codecPrivateElementSize;\n if (voidDataSize < 0) {\n let newByteLength = data.byteLength + voidDataSize;\n if (data instanceof ArrayBuffer) {\n data = data.slice(0, newByteLength);\n } else {\n data = data.buffer.slice(0, newByteLength);\n }\n voidDataSize = 0;\n }\n element = [\n __privateMethod(this, _createCodecPrivateElement, createCodecPrivateElement_fn).call(this, data),\n { id: 236 /* Void */, size: 4, data: new Uint8Array(voidDataSize) }\n ];\n __privateGet(this, _writer).writeEBML(element);\n __privateGet(this, _writer).seek(endPos);\n};\n_createNewCluster = new WeakSet();\ncreateNewCluster_fn = function(timestamp) {\n if (__privateGet(this, _currentCluster)) {\n __privateMethod(this, _finalizeCurrentCluster, finalizeCurrentCluster_fn).call(this);\n }\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onCluster) {\n __privateGet(this, _writer).startTrackingWrites();\n }\n __privateSet(this, _currentCluster, {\n id: 524531317 /* Cluster */,\n size: __privateGet(this, _options).streaming ? -1 : CLUSTER_SIZE_BYTES,\n data: [\n { id: 231 /* Timestamp */, data: timestamp }\n ]\n });\n __privateGet(this, _writer).writeEBML(__privateGet(this, _currentCluster));\n __privateSet(this, _currentClusterTimestamp, timestamp);\n let clusterOffsetFromSegment = __privateGet(this, _writer).offsets.get(__privateGet(this, _currentCluster)) - __privateGet(this, _segmentDataOffset, segmentDataOffset_get);\n __privateGet(this, _cues).data.push({ id: 187 /* CuePoint */, data: [\n { id: 179 /* CueTime */, data: timestamp },\n __privateGet(this, _options).video ? { id: 183 /* CueTrackPositions */, data: [\n { id: 247 /* CueTrack */, data: VIDEO_TRACK_NUMBER },\n { id: 241 /* CueClusterPosition */, data: clusterOffsetFromSegment }\n ] } : null,\n __privateGet(this, _options).audio ? { id: 183 /* CueTrackPositions */, data: [\n { id: 247 /* CueTrack */, data: AUDIO_TRACK_NUMBER },\n { id: 241 /* CueClusterPosition */, data: clusterOffsetFromSegment }\n ] } : null\n ] });\n};\n_finalizeCurrentCluster = new WeakSet();\nfinalizeCurrentCluster_fn = function() {\n if (!__privateGet(this, _options).streaming) {\n let clusterSize = __privateGet(this, _writer).pos - __privateGet(this, _writer).dataOffsets.get(__privateGet(this, _currentCluster));\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(__privateGet(this, _currentCluster)) + 4);\n __privateGet(this, _writer).writeEBMLVarInt(clusterSize, CLUSTER_SIZE_BYTES);\n __privateGet(this, _writer).seek(endPos);\n }\n if (__privateGet(this, _writer) instanceof BaseStreamTargetWriter && __privateGet(this, _writer).target.options.onCluster) {\n let { data, start } = __privateGet(this, _writer).getTrackedWrites();\n __privateGet(this, _writer).target.options.onCluster(data, start, __privateGet(this, _currentClusterTimestamp));\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\n\n// src/subtitles.ts\nvar cueBlockHeaderRegex = /(?:(.+?)\\n)?((?:\\d{2}:)?\\d{2}:\\d{2}.\\d{3})\\s+-->\\s+((?:\\d{2}:)?\\d{2}:\\d{2}.\\d{3})/g;\nvar preambleStartRegex = /^WEBVTT.*?\\n{2}/;\nvar timestampRegex = /(?:(\\d{2}):)?(\\d{2}):(\\d{2}).(\\d{3})/;\nvar inlineTimestampRegex = /<(?:(\\d{2}):)?(\\d{2}):(\\d{2}).(\\d{3})>/g;\nvar textEncoder = new TextEncoder();\nvar _options2, _config, _preambleSeen, _preambleBytes, _preambleEmitted, _parseTimestamp, parseTimestamp_fn, _formatTimestamp, formatTimestamp_fn;\nvar SubtitleEncoder = class {\n constructor(options) {\n __privateAdd(this, _parseTimestamp);\n __privateAdd(this, _formatTimestamp);\n __privateAdd(this, _options2, void 0);\n __privateAdd(this, _config, void 0);\n __privateAdd(this, _preambleSeen, false);\n __privateAdd(this, _preambleBytes, void 0);\n __privateAdd(this, _preambleEmitted, false);\n __privateSet(this, _options2, options);\n }\n configure(config) {\n if (config.codec !== \"webvtt\") {\n throw new Error(\"Codec must be 'webvtt'.\");\n }\n __privateSet(this, _config, config);\n }\n encode(text) {\n if (!__privateGet(this, _config)) {\n throw new Error(\"Encoder not configured.\");\n }\n text = text.replace(\"\\r\\n\", \"\\n\").replace(\"\\r\", \"\\n\");\n cueBlockHeaderRegex.lastIndex = 0;\n let match;\n if (!__privateGet(this, _preambleSeen)) {\n if (!preambleStartRegex.test(text)) {\n let error = new Error(\"WebVTT preamble incorrect.\");\n __privateGet(this, _options2).error(error);\n throw error;\n }\n match = cueBlockHeaderRegex.exec(text);\n let preamble = text.slice(0, match?.index ?? text.length).trimEnd();\n if (!preamble) {\n let error = new Error(\"No WebVTT preamble provided.\");\n __privateGet(this, _options2).error(error);\n throw error;\n }\n __privateSet(this, _preambleBytes, textEncoder.encode(preamble));\n __privateSet(this, _preambleSeen, true);\n if (match) {\n text = text.slice(match.index);\n cueBlockHeaderRegex.lastIndex = 0;\n }\n }\n while (match = cueBlockHeaderRegex.exec(text)) {\n let notes = text.slice(0, match.index);\n let cueIdentifier = match[1] || \"\";\n let matchEnd = match.index + match[0].length;\n let bodyStart = text.indexOf(\"\\n\", matchEnd) + 1;\n let cueSettings = text.slice(matchEnd, bodyStart).trim();\n let bodyEnd = text.indexOf(\"\\n\\n\", matchEnd);\n if (bodyEnd === -1)\n bodyEnd = text.length;\n let startTime = __privateMethod(this, _parseTimestamp, parseTimestamp_fn).call(this, match[2]);\n let endTime = __privateMethod(this, _parseTimestamp, parseTimestamp_fn).call(this, match[3]);\n let duration = endTime - startTime;\n let body = text.slice(bodyStart, bodyEnd);\n let additions = `${cueSettings}\n${cueIdentifier}\n${notes}`;\n inlineTimestampRegex.lastIndex = 0;\n body = body.replace(inlineTimestampRegex, (match2) => {\n let time = __privateMethod(this, _parseTimestamp, parseTimestamp_fn).call(this, match2.slice(1, -1));\n let offsetTime = time - startTime;\n return `<${__privateMethod(this, _formatTimestamp, formatTimestamp_fn).call(this, offsetTime)}>`;\n });\n text = text.slice(bodyEnd).trimStart();\n cueBlockHeaderRegex.lastIndex = 0;\n let chunk = {\n body: textEncoder.encode(body),\n additions: additions.trim() === \"\" ? void 0 : textEncoder.encode(additions),\n timestamp: startTime * 1e3,\n duration: duration * 1e3\n };\n let meta = {};\n if (!__privateGet(this, _preambleEmitted)) {\n meta.decoderConfig = {\n description: __privateGet(this, _preambleBytes)\n };\n __privateSet(this, _preambleEmitted, true);\n }\n __privateGet(this, _options2).output(chunk, meta);\n }\n }\n};\n_options2 = new WeakMap();\n_config = new WeakMap();\n_preambleSeen = new WeakMap();\n_preambleBytes = new WeakMap();\n_preambleEmitted = new WeakMap();\n_parseTimestamp = new WeakSet();\nparseTimestamp_fn = function(string) {\n let match = timestampRegex.exec(string);\n if (!match)\n throw new Error(\"Expected match.\");\n return 60 * 60 * 1e3 * Number(match[1] || \"0\") + 60 * 1e3 * Number(match[2]) + 1e3 * Number(match[3]) + Number(match[4]);\n};\n_formatTimestamp = new WeakSet();\nformatTimestamp_fn = function(timestamp) {\n let hours = Math.floor(timestamp / (60 * 60 * 1e3));\n let minutes = Math.floor(timestamp % (60 * 60 * 1e3) / (60 * 1e3));\n let seconds = Math.floor(timestamp % (60 * 1e3) / 1e3);\n let milliseconds = timestamp % 1e3;\n return hours.toString().padStart(2, \"0\") + \":\" + minutes.toString().padStart(2, \"0\") + \":\" + seconds.toString().padStart(2, \"0\") + \".\" + milliseconds.toString().padStart(3, \"0\");\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget,\n SubtitleEncoder\n};\n","import { GIFEncoder, quantize, applyPalette } from 'gifenc';\nimport { Muxer as Mp4Muxer, ArrayBufferTarget as Mp4Target } from 'mp4-muxer';\nimport { Muxer as WebMMuxer, ArrayBufferTarget as WebMTarget } from 'webm-muxer';\n\n// -----------------------------------------------------------------------------\n// GIF\n// -----------------------------------------------------------------------------\n\n/**\n * Encode a VideoBuffer to a GIF Blob via gifenc. Runs on the main thread but\n * yields every few frames so the page stays responsive.\n *\n * @param {import('./buffer.js').VideoBuffer} buffer\n * @param {object} [opts]\n * @param {number} [opts.maxColors=256]\n * @param {(progress: number) => void} [opts.onProgress]\n */\nexport async function encodeGIF(buffer, opts = {}) {\n if (!buffer.frames.length) throw new Error('[p5.export] encodeGIF: no frames to encode');\n const gif = GIFEncoder();\n const delay = Math.round(1000 / buffer.fps);\n const maxColors = opts.maxColors ?? 256;\n const total = buffer.frames.length;\n\n for (let i = 0; i < total; i++) {\n const data = buffer.frames[i];\n const palette = quantize(data, maxColors);\n const index = applyPalette(data, palette);\n gif.writeFrame(index, buffer.width, buffer.height, { palette, delay });\n if (opts.onProgress) opts.onProgress((i + 1) / total);\n // Yield ~every 16 frames. Earlier we yielded every 4 frames which paid\n // a microtask round-trip 4× more often than needed. The encoder runs\n // on the main thread so the yields ARE needed for UI responsiveness,\n // just not on every handful of frames.\n if ((i & 15) === 15) await new Promise((r) => setTimeout(r, 0));\n }\n gif.finish();\n return new Blob([gif.bytes()], { type: 'image/gif' });\n}\n\n// -----------------------------------------------------------------------------\n// Video — WebCodecs path (fast, frame-by-frame) with MediaRecorder fallback\n// -----------------------------------------------------------------------------\n\n/**\n * True if the browser exposes the WebCodecs `VideoEncoder` and `VideoFrame`.\n * When it does, we encode each frame directly with hardware accel (usually\n * 5–20× faster than real-time MediaRecorder capture). When it doesn't, we\n * fall back to the legacy MediaRecorder path.\n */\nfunction hasWebCodecs() {\n return typeof window !== 'undefined'\n && typeof window.VideoEncoder === 'function'\n && typeof window.VideoFrame === 'function';\n}\n\n/**\n * Candidate codec strings, ranked by \"most compatible first\". We probe each\n * with `VideoEncoder.isConfigSupported` and pick the first the browser\n * accepts at the given width/height/fps.\n */\nconst WEB_CODEC_CANDIDATES = {\n mp4: [\n 'avc1.640028', // H.264 High @ 4.0 — most modern devices\n 'avc1.4d0028', // H.264 Main @ 4.0\n 'avc1.42001f', // H.264 Baseline 3.1 — broadest compat\n 'av01.0.04M.08' // AV1 fallback\n ],\n webm: [\n 'vp09.00.10.08', // VP9 Profile 0\n 'vp8',\n 'av01.0.04M.08'\n ]\n};\n\nconst MP4_CODEC_MAP = { avc1: 'avc', av01: 'av1', hvc1: 'hevc', hev1: 'hevc' };\nconst WEBM_CODEC_MAP = { vp09: 'V_VP9', vp9: 'V_VP9', vp8: 'V_VP8', av01: 'V_AV1' };\n\nfunction muxerCodec(format, codecString) {\n const prefix = codecString.split('.')[0].toLowerCase();\n return (format === 'mp4' ? MP4_CODEC_MAP : WEBM_CODEC_MAP)[prefix] || (format === 'mp4' ? 'avc' : 'V_VP9');\n}\n\nasync function pickWebCodec(format, { width, height, fps, bitrate }) {\n // Probe with the same hint we'd pass to configure(): prefer-hardware.\n // Retry without the hint before giving up — some Chromium builds reject\n // 'prefer-hardware' for codecs that only have a software path even though\n // the codec itself is supported. (We don't include latencyMode in the\n // probe; setting it on configure() has caused \"Encoder creation error\"\n // on some Apple Silicon builds, so it's now omitted.)\n for (const codec of WEB_CODEC_CANDIDATES[format] || []) {\n for (const hint of [{ hardwareAcceleration: 'prefer-hardware' }, {}]) {\n try {\n const r = await VideoEncoder.isConfigSupported({\n codec, width, height, bitrate, framerate: fps, ...hint\n });\n if (r && r.supported) return codec;\n } catch (_) { /* keep probing */ }\n }\n }\n return null;\n}\n\nasync function encodeVideoWebCodecs(buffer, opts) {\n const format = opts.format === 'mp4' ? 'mp4' : 'webm';\n const width = buffer.width;\n const height = buffer.height;\n const fps = buffer.fps;\n // Sensible default: ~0.2 bits/pixel/sec. Capped so very-large frames don't\n // request an absurd bitrate the encoder will reject.\n const bitrate = opts.bitsPerSecond\n ?? Math.min(40_000_000, Math.max(1_500_000, Math.round(width * height * fps * 0.2)));\n\n const codecString = await pickWebCodec(format, { width, height, fps, bitrate });\n if (!codecString) {\n throw new Error(`[p5.export] WebCodecs: no supported ${format.toUpperCase()} codec for ${width}×${height} @ ${fps}fps`);\n }\n\n const target = format === 'mp4' ? new Mp4Target() : new WebMTarget();\n const muxerCodecId = muxerCodec(format, codecString);\n const muxer = format === 'mp4'\n ? new Mp4Muxer({\n target,\n video: { codec: muxerCodecId, width, height, frameRate: fps },\n fastStart: 'in-memory'\n })\n : new WebMMuxer({\n target,\n video: { codec: muxerCodecId, width, height, frameRate: fps }\n });\n\n let firstError = null;\n const encoder = new VideoEncoder({\n output: (chunk, meta) => muxer.addVideoChunk(chunk, meta),\n error: (e) => { firstError = firstError || e; }\n });\n\n // Build a list of configs to try, from \"ideal\" to \"last resort\". configure()\n // itself is synchronous, but the encoder's actual creation is async — its\n // error fires via the `error` callback. So we configure, encode the first\n // frame, and if `firstError` was set we retry with the next config.\n const baseConfig = { codec: codecString, width, height, bitrate, framerate: fps };\n if (codecString.startsWith('avc1')) baseConfig.avc = { format: 'avc' };\n const configAttempts = [\n { ...baseConfig, hardwareAcceleration: 'prefer-hardware' },\n { ...baseConfig } // no hint at all\n ];\n\n let chosenConfig = null;\n for (const attempt of configAttempts) {\n try {\n encoder.configure(attempt);\n chosenConfig = attempt;\n break;\n } catch (_) { /* try next */ }\n }\n if (!chosenConfig) {\n throw new Error(`[p5.export] could not configure VideoEncoder for ${codecString}`);\n }\n\n const usPerFrame = 1_000_000 / fps;\n const total = buffer.frames.length;\n // Force a keyframe every ~2s so seeking remains snappy.\n const keyEvery = Math.max(1, Math.round(fps * 2));\n\n // The encoder is async — encode() queues frames and processes them on a\n // background thread. We push frames as fast as we can; backpressure is\n // managed via `encodeQueueSize` (only wait when the queue is actually\n // backed up). We also yield occasionally so progress callbacks get a\n // chance to repaint the GUI, but rarely enough that the encoder stays\n // saturated.\n const MAX_QUEUED = 16;\n for (let i = 0; i < total; i++) {\n if (firstError) throw firstError;\n while (encoder.encodeQueueSize > MAX_QUEUED) {\n await new Promise((r) => setTimeout(r, 0));\n if (firstError) throw firstError;\n }\n const frame = new VideoFrame(buffer.frames[i], {\n format: 'RGBA',\n codedWidth: width,\n codedHeight: height,\n timestamp: Math.round(i * usPerFrame),\n duration: Math.round(usPerFrame)\n });\n encoder.encode(frame, { keyFrame: i % keyEvery === 0 });\n frame.close();\n\n if (opts.onProgress) opts.onProgress((i + 1) / total);\n // Yield about every 32 frames so the progress callback repaints,\n // without paying for a microtask round-trip every iteration.\n if ((i & 31) === 31) await new Promise((r) => setTimeout(r, 0));\n }\n\n await encoder.flush();\n if (firstError) throw firstError;\n muxer.finalize();\n\n const blob = new Blob([target.buffer], {\n type: format === 'mp4' ? 'video/mp4' : 'video/webm'\n });\n blob.__ext = format;\n return blob;\n}\n\n// -----------------------------------------------------------------------------\n// MediaRecorder fallback — same approach as before, used only when WebCodecs\n// isn't available (older Safari, very old Chromium, etc.).\n// -----------------------------------------------------------------------------\n\nconst MR_MIME = {\n webm: ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm'],\n mp4: ['video/mp4;codecs=avc1', 'video/mp4;codecs=h264', 'video/mp4']\n};\n\nfunction pickMrMime(format) {\n const order = format === 'mp4'\n ? [...MR_MIME.mp4, ...MR_MIME.webm]\n : [...MR_MIME.webm, ...MR_MIME.mp4];\n for (const m of order) {\n if (typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported(m)) {\n return { mime: m, ext: m.startsWith('video/mp4') ? 'mp4' : 'webm' };\n }\n }\n return null;\n}\n\nfunction encodeVideoMediaRecorder(buffer, opts) {\n return new Promise((resolve, reject) => {\n const requested = opts.format || 'webm';\n const picked = pickMrMime(requested);\n if (!picked) return reject(new Error('[p5.export] MediaRecorder fallback: no supported mime'));\n if (requested === 'mp4' && picked.ext !== 'mp4') {\n console.warn('[p5.export] MP4 unsupported here — falling back to WebM.');\n }\n\n const tmp = document.createElement('canvas');\n tmp.width = buffer.width;\n tmp.height = buffer.height;\n const ctx = tmp.getContext('2d');\n\n const stream = tmp.captureStream(buffer.fps);\n const recOpts = { mimeType: picked.mime };\n if (opts.bitsPerSecond) recOpts.videoBitsPerSecond = opts.bitsPerSecond;\n const recorder = new MediaRecorder(stream, recOpts);\n const chunks = [];\n recorder.ondataavailable = (e) => { if (e.data && e.data.size) chunks.push(e.data); };\n recorder.onerror = (e) => reject(e.error || new Error('MediaRecorder error'));\n recorder.onstop = () => {\n stream.getTracks().forEach((t) => t.stop());\n const blob = new Blob(chunks, { type: picked.mime });\n blob.__ext = picked.ext;\n resolve(blob);\n };\n\n ctx.putImageData(new ImageData(buffer.frames[0], buffer.width, buffer.height), 0, 0);\n recorder.start();\n\n const interval = 1000 / buffer.fps;\n let i = 1;\n const tick = () => {\n if (i >= buffer.frames.length) {\n setTimeout(() => recorder.stop(), 100);\n return;\n }\n ctx.putImageData(new ImageData(buffer.frames[i], buffer.width, buffer.height), 0, 0);\n if (opts.onProgress) opts.onProgress((i + 1) / buffer.frames.length);\n i++;\n setTimeout(tick, interval);\n };\n setTimeout(tick, interval);\n });\n}\n\n/**\n * Encode a VideoBuffer to WebM or MP4. Prefers the WebCodecs path (frame-\n * by-frame, much faster than real-time); falls back to MediaRecorder when\n * the browser doesn't expose WebCodecs.\n *\n * @param {import('./buffer.js').VideoBuffer} buffer\n * @param {object} [opts]\n * @param {'webm'|'mp4'} [opts.format='webm']\n * @param {number} [opts.bitsPerSecond]\n * @param {(progress: number) => void} [opts.onProgress]\n */\nexport async function encodeVideo(buffer, opts = {}) {\n if (!buffer.frames.length) throw new Error('[p5.export] encodeVideo: no frames to encode');\n if (hasWebCodecs()) {\n const t0 = performance.now();\n try {\n const blob = await encodeVideoWebCodecs(buffer, opts);\n const ms = (performance.now() - t0) | 0;\n // Loud-enough log so users notice when WebCodecs IS working — useful\n // for confirming the fast path on their hardware.\n // eslint-disable-next-line no-console\n console.info(`[p5.export] WebCodecs encoded ${buffer.frames.length} frames in ${ms}ms (${(buffer.frames.length / (ms / 1000) | 0)} fps).`);\n return blob;\n } catch (err) {\n console.warn(\n '[p5.export] WebCodecs encode failed; falling back to MediaRecorder (real-time, much slower). ' +\n 'Cause:', err\n );\n }\n } else {\n console.info('[p5.export] WebCodecs not available in this browser; using MediaRecorder (real-time).');\n }\n return encodeVideoMediaRecorder(buffer, opts);\n}\n","/**\n * Animated WebP muxer.\n *\n * Why roll this ourselves: there's no `webp-muxer` on npm (unlike\n * mp4-muxer / webm-muxer), and WASM ports of libwebp are ~1 MB which\n * doubles the addon size. The WebP RIFF container is small enough to\n * assemble by hand — we just need actual VP8 frame data, which we get\n * for free by asking the browser to encode each frame as a single\n * WebP via `canvas.toBlob('image/webp')` and then slicing out the\n * inner VP8/VP8L chunk.\n *\n * Container layout we emit (per Google's animated WebP spec):\n * RIFF<size>WEBP\n * VP8X chunk (extended-format header, animation flag set)\n * ANIM chunk (background color, loop count)\n * ANMF * N (one per frame; each wraps a VP8 or VP8L chunk)\n *\n * Browser support note: `canvas.toBlob('image/webp')` is supported in\n * Chrome 23+, Firefox 65+, Safari 16+. Older Safari silently falls\n * back to PNG, which we detect and surface as a clear error so the\n * caller can pick a different format.\n */\n\n\n/**\n * Encode a VideoBuffer into animated WebP. Yields the resulting Blob.\n *\n * @param {{ frames: Uint8ClampedArray[], width: number, height: number, fps: number }} buffer\n * @param {object} [opts]\n * @param {number} [opts.quality=0.85] per-frame WebP quality 0..1\n * @param {number} [opts.loop=0] repeat count; 0 = infinite\n * @param {(progress: number) => void} [opts.onProgress]\n */\nexport async function encodeAnimatedWebP(buffer, opts = {}) {\n if (!buffer || !buffer.frames.length) {\n throw new Error('[p5.export] encodeAnimatedWebP: buffer has no frames');\n }\n const { width, height, fps, frames } = buffer;\n const quality = clamp01(opts.quality ?? 0.85);\n const loopCount = Math.max(0, opts.loop ?? 0);\n // ANMF stores duration in ms with 24 bits — plenty for normal video.\n const frameDurationMs = Math.max(1, Math.round(1000 / (fps || 30)));\n\n await assertWebPEncodingSupported(width, height);\n\n const scratch = document.createElement('canvas');\n scratch.width = width;\n scratch.height = height;\n const sctx = scratch.getContext('2d');\n const imageData = sctx.createImageData(width, height);\n\n const frameSubChunks = [];\n for (let i = 0; i < frames.length; i++) {\n imageData.data.set(frames[i]);\n sctx.putImageData(imageData, 0, 0);\n const blob = await canvasToWebPBlob(scratch, quality);\n const bytes = new Uint8Array(await blob.arrayBuffer());\n frameSubChunks.push(extractVP8(bytes));\n if (opts.onProgress) opts.onProgress((i + 1) / frames.length);\n }\n\n const inner = concat([\n makeChunk('VP8X', writeVP8X(width, height)),\n makeChunk('ANIM', writeANIM(loopCount)),\n ...frameSubChunks.map((sub) => makeChunk('ANMF', writeANMF(width, height, frameDurationMs, sub)))\n ]);\n\n // RIFF wrapper. The size field is everything AFTER the 8-byte RIFF\n // header (including the \"WEBP\" magic).\n const out = new Uint8Array(8 + 4 + inner.length);\n writeAscii(out, 0, 'RIFF');\n writeUint32LE(out, 4, 4 + inner.length);\n writeAscii(out, 8, 'WEBP');\n out.set(inner, 12);\n return new Blob([out], { type: 'image/webp' });\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nasync function assertWebPEncodingSupported(width, height) {\n const probe = document.createElement('canvas');\n probe.width = Math.min(8, width);\n probe.height = Math.min(8, height);\n const blob = await canvasToWebPBlob(probe, 0.9);\n if (!blob || blob.type !== 'image/webp') {\n throw new Error(\n '[p5.export] This browser doesn\\'t encode WebP from canvas — animated WebP export is unavailable. ' +\n 'Use MP4 or WebM instead, or try the latest Chrome/Firefox/Safari.'\n );\n }\n}\n\nfunction canvasToWebPBlob(canvas, quality) {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (b) => b ? resolve(b) : reject(new Error('canvas.toBlob returned null')),\n 'image/webp', quality\n );\n });\n}\n\n/**\n * Walk the RIFF chunks of a single-frame WebP and pull out the\n * VP8/VP8L chunk that carries the actual image data. Returns the\n * full chunk (id + size + payload), padded to even length per RIFF.\n */\nfunction extractVP8(bytes) {\n // RIFF<4> size<4> WEBP<4> = 12 bytes header\n let pos = 12;\n while (pos + 8 <= bytes.length) {\n const id = String.fromCharCode(bytes[pos], bytes[pos + 1], bytes[pos + 2], bytes[pos + 3]);\n const size = readUint32LE(bytes, pos + 4);\n const padded = size + (size & 1);\n if (id === 'VP8 ' || id === 'VP8L') {\n return bytes.slice(pos, pos + 8 + padded);\n }\n pos += 8 + padded;\n }\n throw new Error('[p5.export] no VP8/VP8L chunk found in encoded WebP frame');\n}\n\nfunction writeVP8X(width, height) {\n // 10 bytes: flags(1) + reserved(3) + canvasW-1(3) + canvasH-1(3)\n const buf = new Uint8Array(10);\n buf[0] = 0x02; // animation flag (bit 1). No alpha/ICC/EXIF flags.\n writeUint24LE(buf, 4, width - 1);\n writeUint24LE(buf, 7, height - 1);\n return buf;\n}\n\nfunction writeANIM(loopCount) {\n // 6 bytes: bgColor(4 BGRA) + loopCount(2)\n const buf = new Uint8Array(6);\n // Background = transparent black by default.\n writeUint16LE(buf, 4, loopCount);\n return buf;\n}\n\nfunction writeANMF(width, height, durationMs, subChunk) {\n // 16-byte header followed by the inner VP8/VP8L chunk.\n // frameX(3) frameY(3) frameW-1(3) frameH-1(3) duration(3) flags(1)\n const hdr = new Uint8Array(16);\n writeUint24LE(hdr, 6, width - 1);\n writeUint24LE(hdr, 9, height - 1);\n writeUint24LE(hdr, 12, durationMs);\n hdr[15] = 0x00; // blend with previous (default), do-not-dispose\n const out = new Uint8Array(hdr.length + subChunk.length);\n out.set(hdr, 0);\n out.set(subChunk, hdr.length);\n return out;\n}\n\nfunction makeChunk(id, payload) {\n // RIFF chunks: 4-byte id + 4-byte LE size + payload, padded to even.\n const padBytes = payload.length & 1;\n const out = new Uint8Array(8 + payload.length + padBytes);\n writeAscii(out, 0, id);\n writeUint32LE(out, 4, payload.length);\n out.set(payload, 8);\n // Pad byte is already zero (Uint8Array default).\n return out;\n}\n\nfunction concat(arrays) {\n let total = 0;\n for (const a of arrays) total += a.length;\n const out = new Uint8Array(total);\n let off = 0;\n for (const a of arrays) { out.set(a, off); off += a.length; }\n return out;\n}\n\nfunction writeAscii(buf, offset, str) {\n for (let i = 0; i < str.length; i++) buf[offset + i] = str.charCodeAt(i);\n}\n\nfunction writeUint16LE(buf, offset, v) {\n buf[offset] = v & 0xff;\n buf[offset + 1] = (v >> 8) & 0xff;\n}\nfunction writeUint24LE(buf, offset, v) {\n buf[offset] = v & 0xff;\n buf[offset + 1] = (v >> 8) & 0xff;\n buf[offset + 2] = (v >> 16) & 0xff;\n}\nfunction writeUint32LE(buf, offset, v) {\n buf[offset] = v & 0xff;\n buf[offset + 1] = (v >> 8) & 0xff;\n buf[offset + 2] = (v >> 16) & 0xff;\n buf[offset + 3] = (v >> 24) & 0xff;\n}\nfunction readUint32LE(buf, offset) {\n return (\n buf[offset] |\n (buf[offset + 1] << 8) |\n (buf[offset + 2] << 16) |\n ((buf[offset + 3] << 24) >>> 0)\n );\n}\nfunction clamp01(x) { return Math.max(0, Math.min(1, x)); }\n","import { downloadBlob, defaultFilename, ensureExt } from '../utils/download.js';\nimport { getCanvas } from '../utils/canvas.js';\nimport { VideoBuffer } from '../recording/buffer.js';\nimport { encodeGIF, encodeVideo } from '../recording/encoders.js';\nimport { encodeAnimatedWebP } from '../recording/webp.js';\n\nconst CANDIDATES = {\n webm: ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm'],\n mp4: ['video/mp4;codecs=avc1', 'video/mp4;codecs=h264', 'video/mp4']\n};\n\n/**\n * Pick the best MediaRecorder mime type for the requested container.\n * Falls back to WebM if MP4 isn't supported (Chromium on Linux/Windows, etc.).\n *\n * @param {'webm'|'mp4'} preferred\n * @returns {{mime: string, ext: 'webm'|'mp4'} | null}\n */\nfunction pickMime(preferred) {\n const order = preferred === 'mp4'\n ? [...CANDIDATES.mp4, ...CANDIDATES.webm]\n : [...CANDIDATES.webm, ...CANDIDATES.mp4];\n for (const mime of order) {\n if (typeof MediaRecorder !== 'undefined' && MediaRecorder.isTypeSupported(mime)) {\n return { mime, ext: mime.startsWith('video/mp4') ? 'mp4' : 'webm' };\n }\n }\n return null;\n}\n\nclass VideoRecorder {\n /**\n * @param {object} opts\n * @param {HTMLCanvasElement} opts.canvas\n * @param {'webm'|'mp4'} [opts.format='webm']\n * @param {number} [opts.fps=60]\n * @param {number} [opts.bitsPerSecond]\n * @param {number} [opts.duration] seconds; auto-stop when reached\n * @param {string} [opts.filename]\n */\n constructor(opts) {\n const picked = pickMime(opts.format || 'webm');\n if (!picked) throw new Error('[p5.export] no supported MediaRecorder mime type found');\n\n this.ext = picked.ext;\n if (opts.format === 'mp4' && this.ext !== 'mp4') {\n console.warn('[p5.export] MP4 not supported by this browser — falling back to WebM');\n }\n\n this.stream = opts.canvas.captureStream(opts.fps || 60);\n const recOpts = { mimeType: picked.mime };\n if (opts.bitsPerSecond) recOpts.videoBitsPerSecond = opts.bitsPerSecond;\n this.recorder = new MediaRecorder(this.stream, recOpts);\n\n this.chunks = [];\n this.recorder.ondataavailable = (e) => {\n if (e.data && e.data.size) this.chunks.push(e.data);\n };\n\n this.filename = opts.filename;\n this.duration = opts.duration;\n this._mime = picked.mime;\n this._stopPromise = null;\n }\n\n start() {\n this.recorder.start();\n if (this.duration) {\n setTimeout(() => this.stop(), this.duration * 1000);\n }\n }\n\n /** Stop the recorder and resolve with a downloaded Blob. */\n stop() {\n if (this._stopPromise) return this._stopPromise;\n this._stopPromise = new Promise((resolve) => {\n this.recorder.onstop = () => {\n const blob = new Blob(this.chunks, { type: this._mime });\n const name = this.filename\n ? ensureExt(this.filename, this.ext)\n : defaultFilename(this.ext);\n downloadBlob(blob, name);\n // Stop tracks so the canvas isn't held captive.\n this.stream.getTracks().forEach((t) => t.stop());\n resolve(blob);\n };\n if (this.recorder.state !== 'inactive') this.recorder.stop();\n });\n return this._stopPromise;\n }\n\n get state() {\n return this.recorder.state; // 'inactive' | 'recording' | 'paused'\n }\n}\n\nexport function attachVideoRecorder(p5, fn, lifecycles) {\n /**\n * Start a video recording via MediaRecorder. Returns the recorder so the\n * caller can `stop()` manually or query `state`.\n *\n * @param {object} [opts]\n * @param {'webm'|'mp4'} [opts.format='webm']\n * @param {number} [opts.fps=60]\n * @param {number} [opts.bitsPerSecond]\n * @param {number} [opts.duration]\n * @param {string} [opts.filename]\n */\n fn.recordVideo = function (opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] recordVideo: no canvas found');\n if (this._p5ExportVideo && this._p5ExportVideo.state === 'recording') {\n throw new Error('[p5.export] a video recording is already in progress');\n }\n const rec = new VideoRecorder({ canvas, ...opts });\n rec.start();\n this._p5ExportVideo = rec;\n return rec;\n };\n\n /** Convenience aliases. */\n fn.recordWebM = function (opts = {}) { return fn.recordVideo.call(this, { ...opts, format: 'webm' }); };\n fn.recordMP4 = function (opts = {}) { return fn.recordVideo.call(this, { ...opts, format: 'mp4' }); };\n\n /** Stop the active video recording and download the result. */\n fn.stopVideo = function () {\n const rec = this._p5ExportVideo;\n if (!rec) return null;\n this._p5ExportVideo = null;\n return rec.stop();\n };\n\n // -------------------------------------------------------------------------\n // Buffered recording — \"record once, export to whatever format later\".\n // The GUI's Video tab is built on this. Frames are captured into a raw\n // RGBA buffer; encodeVideoBuffer() turns the buffer into GIF/WebM/MP4\n // on demand.\n // -------------------------------------------------------------------------\n\n /**\n * Create + start a video buffer that captures one frame per draw at the\n * target fps. Auto-stops when `duration` (seconds) is reached.\n *\n * When `opts.scale` is set (1..4), the sketch's pixelDensity is bumped\n * for the duration of the recording — frames are CAPTURED at the higher\n * resolution rather than upscaled afterward. The original density is\n * restored when the buffer stops (manually or via the duration cap).\n *\n * @param {object} [opts]\n * @param {number} [opts.fps=30]\n * @param {number} [opts.duration]\n * @param {number} [opts.maxFrames]\n * @param {number} [opts.scale] pixelDensity to render the recording at\n * @returns {VideoBuffer}\n */\n fn.createVideoBuffer = function (opts = {}) {\n const canvas = getCanvas(this);\n if (!canvas) throw new Error('[p5.export] createVideoBuffer: no canvas found');\n if (this._p5ExportBuffer && this._p5ExportBuffer.recording) {\n throw new Error('[p5.export] a video buffer is already recording');\n }\n\n // Bump pixelDensity BEFORE constructing the buffer so it reads the\n // resized canvas's width/height for its frame allocations.\n const p = this;\n const scale = opts.scale;\n const origPD = typeof p.pixelDensity === 'function' ? p.pixelDensity() : 1;\n const needsScale = scale && scale > 0 && scale !== origPD;\n if (needsScale) {\n p.pixelDensity(scale);\n if (typeof p.redraw === 'function') p.redraw();\n }\n\n const buf = new VideoBuffer({ canvas, ...opts });\n\n // Wrap stop() so pixelDensity is restored whichever way the recording\n // ends — manual stop, auto-stop on duration, or hitting maxFrames.\n const origStop = buf.stop.bind(buf);\n let restored = !needsScale;\n buf.stop = function () {\n origStop();\n if (!restored) {\n restored = true;\n p.pixelDensity(origPD);\n if (typeof p.redraw === 'function') p.redraw();\n }\n };\n\n buf.start();\n this._p5ExportBuffer = buf;\n return buf;\n };\n\n /** Stop the active video buffer (if any). Returns it for inspection. */\n fn.stopVideoBuffer = function () {\n const buf = this._p5ExportBuffer;\n if (buf) buf.stop();\n return buf || null;\n };\n\n /**\n * Encode a recorded VideoBuffer to the requested format and trigger a\n * download. Re-callable: the same buffer can be exported to GIF, then\n * WebM, then MP4 without re-recording.\n *\n * @param {VideoBuffer} buffer\n * @param {object} [opts]\n * @param {'gif'|'webm'|'mp4'} [opts.format='webm']\n * @param {string} [opts.filename]\n * @param {number} [opts.maxColors] GIF only\n * @param {number} [opts.bitsPerSecond] video only\n * @param {(progress: number) => void} [opts.onProgress]\n */\n fn.exportVideoBuffer = async function (buffer, opts = {}) {\n if (!buffer || !buffer.frames.length) {\n throw new Error('[p5.export] exportVideoBuffer: buffer has no frames');\n }\n const format = (opts.format || 'webm').toLowerCase();\n let blob;\n let ext;\n if (format === 'gif') {\n blob = await encodeGIF(buffer, opts);\n ext = 'gif';\n } else if (format === 'webp') {\n blob = await encodeAnimatedWebP(buffer, opts);\n ext = 'webp';\n } else if (format === 'webm' || format === 'mp4') {\n blob = await encodeVideo(buffer, { ...opts, format });\n ext = blob.__ext || (format === 'mp4' ? 'mp4' : 'webm');\n } else {\n throw new Error(`[p5.export] unsupported video format: ${format}`);\n }\n const name = opts.filename ? ensureExt(opts.filename, ext) : defaultFilename(ext);\n downloadBlob(blob, name);\n return blob;\n };\n\n // Tick the active buffer once per draw frame. Compose with any prior hook.\n if (lifecycles && typeof lifecycles === 'object') {\n const prev = lifecycles.postdraw;\n lifecycles.postdraw = function () {\n if (typeof prev === 'function') prev.call(this);\n const buf = this._p5ExportBuffer;\n if (buf && buf.recording) buf.tick();\n };\n }\n}\n","/**\n * WebGL geometry exports — STL and OBJ — leaning entirely on the native\n * p5.Geometry methods (`saveStl` / `saveObj`) shipped with p5 2.0.\n *\n * Why \"lean\"? p5 already implements the encoders correctly; re-rolling\n * them would only diverge from upstream. Our value here is:\n * - surface them as top-level `saveSTL()` / `saveOBJ()` on the\n * instance (consistent with the rest of the addon's API);\n * - emit a clear error when called on a P2D sketch (no Geometry);\n * - accept either a Geometry directly OR a `buildGeometry`-callback\n * so users can describe the model inline without setting up scaffolding.\n *\n * Typical use:\n * // 1) Build geometry once and export it\n * const myModel = buildGeometry(() => sphere(50));\n * saveSTL(myModel, 'sphere.stl');\n *\n * // 2) Build + export in one call\n * saveSTL(() => { sphere(50); cone(20, 40); }, 'scene.stl');\n *\n * // 3) Same with binary STL (smaller file)\n * saveSTL(myModel, 'sphere.stl', { binary: true });\n */\nimport { isWebGL } from '../utils/canvas.js';\n\nfunction resolveGeometry(p, source) {\n // Already a Geometry-like object — has `vertices` + `faces` per p5 spec.\n if (source && Array.isArray(source.vertices) && Array.isArray(source.faces)) {\n return source;\n }\n // Build callback: use `buildGeometry` if available (p5 2.0).\n if (typeof source === 'function' && typeof p.buildGeometry === 'function') {\n return p.buildGeometry(source);\n }\n return null;\n}\n\nexport function attachGeometryExports(p5, fn) {\n /**\n * Export a `p5.Geometry` (or a `buildGeometry`-style callback) as STL.\n * Only useful in WEBGL mode — calling this on a P2D sketch with no\n * geometry argument throws.\n *\n * @param {p5.Geometry|(() => void)} source\n * @param {string} [filename]\n * @param {{ binary?: boolean }} [opts]\n */\n fn.saveSTL = function (source, filename, opts = {}) {\n const geom = resolveGeometry(this, source);\n if (!geom || typeof geom.saveStl !== 'function') {\n const hint = isWebGL(this)\n ? 'Pass a p5.Geometry (from buildGeometry / loadModel) or a buildGeometry-style callback.'\n : 'STL is a 3D format; this sketch is P2D. Use a WEBGL renderer (createCanvas(w, h, WEBGL)) and pass a p5.Geometry.';\n throw new Error('[p5.export] saveSTL: no exportable geometry. ' + hint);\n }\n const name = filename || 'sketch.stl';\n geom.saveStl(name, { binary: !!opts.binary });\n };\n\n /**\n * Export a `p5.Geometry` (or a `buildGeometry`-style callback) as OBJ.\n *\n * @param {p5.Geometry|(() => void)} source\n * @param {string} [filename]\n */\n fn.saveOBJ = function (source, filename) {\n const geom = resolveGeometry(this, source);\n if (!geom || typeof geom.saveObj !== 'function') {\n const hint = isWebGL(this)\n ? 'Pass a p5.Geometry (from buildGeometry / loadModel) or a buildGeometry-style callback.'\n : 'OBJ is a 3D format; this sketch is P2D. Use a WEBGL renderer and pass a p5.Geometry.';\n throw new Error('[p5.export] saveOBJ: no exportable geometry. ' + hint);\n }\n const name = filename || 'sketch.obj';\n geom.saveObj(name);\n };\n}\n","import css from './gui.css?inline';\nimport { isWebGL } from './utils/canvas.js';\n\n// Inject the GUI stylesheet on first import so the UMD drop-in needs no\n// CSS sidecar.\nlet _styleInjected = false;\nfunction injectStyles() {\n if (_styleInjected || typeof document === 'undefined') return;\n _styleInjected = true;\n const style = document.createElement('style');\n style.setAttribute('data-p5-export', '');\n style.textContent = css;\n document.head.appendChild(style);\n}\n\nconst IMAGE_FORMATS = [\n { value: 'png', label: 'PNG (image)' },\n { value: 'jpg', label: 'JPG (image)' },\n { value: 'webp', label: 'WebP (image)' },\n { value: 'svg', label: 'SVG (vector)' },\n { value: 'pdf', label: 'PDF (vector)' }\n];\nconst WEBGL_FORMATS = [\n { value: 'stl', label: 'STL (3D)' },\n { value: 'obj', label: 'OBJ (3D)' }\n];\nconst VIDEO_FORMATS = [\n { value: 'webm', label: 'WebM (video)' },\n { value: 'mp4', label: 'MP4 (video)' },\n { value: 'webp', label: 'WebP (animation)' },\n { value: 'gif', label: 'GIF (animation)' }\n];\nconst SCALE_OPTIONS = [\n { value: '1', label: '1×' },\n { value: '2', label: '2×' },\n { value: '3', label: '3×' },\n { value: '4', label: '4×' }\n];\nconst SCALE_APPLIES_TO_IMAGE = new Set(['png', 'jpg', 'webp', 'pdf']);\n\nconst PLAY_ICON = '<path d=\"M2 1.2 L9 5 L2 8.8 Z\" fill=\"currentColor\"/>';\nconst PAUSE_ICON = '<rect x=\"2\" y=\"1.5\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\"/>' +\n '<rect x=\"6\" y=\"1.5\" width=\"2\" height=\"7\" rx=\"0.5\" fill=\"currentColor\"/>';\n\n// The whole panel as a single HTML template — far easier to scan than the\n// imperative `h()` calls we had before. Elements that JS needs to read\n// or mutate are tagged with `data-el=\"…\"` and pulled into `this.<name>`\n// in the constructor. Click handlers are wired via `data-action=\"…\"`.\nconst PANEL_HTML = `\n<div class=\"p5export-panel\">\n <div class=\"p5export-header\" data-el=\"header\">\n <span class=\"p5export-title\" data-el=\"title\">p5.export</span>\n <button class=\"p5export-toggle\" data-action=\"toggleCollapsed\" title=\"Collapse\">−</button>\n </div>\n\n <div class=\"p5export-tabs\">\n <button class=\"p5export-tab is-active\" data-tab=\"image\">Image</button>\n <button class=\"p5export-tab\" data-tab=\"video\">Video</button>\n </div>\n\n <div class=\"p5export-body\">\n <!-- IMAGE TAB ─────────────────────────────────────────────────── -->\n <div class=\"p5export-view\" data-view=\"image\">\n <div class=\"p5export-row\">\n <label>Format</label>\n <select class=\"p5export-select\" data-el=\"imageFormat\"></select>\n </div>\n <div class=\"p5export-row\" data-el=\"imageScaleRow\">\n <label>Scale</label>\n <select class=\"p5export-select\" data-el=\"imageScale\"></select>\n </div>\n <div class=\"p5export-row\">\n <label>Name</label>\n <input class=\"p5export-input\" type=\"text\" placeholder=\"filename\" data-el=\"imageFilename\">\n </div>\n <button class=\"p5export-btn\" data-action=\"saveImage\">Export</button>\n <div class=\"p5export-status\" data-el=\"imageStatus\" hidden></div>\n </div>\n\n <!-- VIDEO TAB ─────────────────────────────────────────────────── -->\n <div class=\"p5export-view\" data-view=\"video\" hidden>\n <div class=\"p5export-row\">\n <label>Format</label>\n <select class=\"p5export-select\" data-el=\"videoFormat\"></select>\n </div>\n <div class=\"p5export-row\">\n <label>Duration</label>\n <input class=\"p5export-input\" type=\"number\" min=\"0.5\" step=\"0.5\" value=\"3\" data-el=\"videoDuration\">\n </div>\n <div class=\"p5export-row\">\n <label>Name</label>\n <input class=\"p5export-input\" type=\"text\" placeholder=\"filename\" data-el=\"videoFilename\">\n </div>\n <div class=\"p5export-preview\" data-el=\"previewWrap\" hidden>\n <canvas class=\"p5export-preview-canvas\" data-el=\"previewCanvas\"></canvas>\n <div class=\"p5export-preview-controls\">\n <button class=\"p5export-play\" data-action=\"togglePreview\" title=\"Play / pause\">\n <svg viewBox=\"0 0 10 10\" data-el=\"playIcon\">${PLAY_ICON}</svg>\n </button>\n <input class=\"p5export-timeline\" type=\"range\" min=\"0\" max=\"0\" step=\"1\" value=\"0\" data-el=\"timeline\">\n <span class=\"p5export-time\" data-el=\"timeLabel\">0:00</span>\n </div>\n </div>\n <button class=\"p5export-btn\" data-action=\"videoPrimary\" data-el=\"videoPrimaryBtn\">Record</button>\n <button class=\"p5export-btn is-ghost\" data-action=\"resetVideo\" data-el=\"rerecordBtn\" hidden>Re-record</button>\n <div class=\"p5export-status\" data-el=\"recordedStatus\" hidden></div>\n </div>\n </div>\n</div>`.trim();\n\n/**\n * The export panel. Two tabs (Image / Video), both built from the\n * `PANEL_HTML` template above. The video tab has three states (idle,\n * recording, recorded) but renders into a single persistent layout —\n * only the primary button text + visibility of preview/rerecord change.\n */\nclass ExportPanel {\n constructor(p5Instance, opts = {}) {\n injectStyles();\n this.p = p5Instance;\n this.opts = opts;\n this.tab = 'image';\n this.videoState = 'idle'; // 'idle' | 'recording' | 'recorded' | 'encoding'\n this.buffer = null;\n this._statusTimer = null;\n\n // Parse the template once into a real DOM element.\n this.el = document.createRange()\n .createContextualFragment(PANEL_HTML)\n .firstElementChild;\n\n // Mirror every `data-el` node as a property on `this` so the rest of\n // the class can read/mutate them by name (`this.imageFormat`, etc.).\n for (const node of this.el.querySelectorAll('[data-el]')) {\n this[node.dataset.el] = node;\n }\n\n // Hook up declarative event wiring.\n for (const node of this.el.querySelectorAll('[data-action]')) {\n node.addEventListener('click', () => {\n const m = this[`_${node.dataset.action}`];\n if (typeof m === 'function') m.call(this);\n });\n }\n for (const node of this.el.querySelectorAll('[data-tab]')) {\n node.addEventListener('click', () => this._switchTab(node.dataset.tab));\n }\n\n this._populateOptions();\n this._wireExtras();\n\n if (this.opts.title) this.title.textContent = this.opts.title;\n if (this.opts.collapsed) this.el.classList.add('is-collapsed');\n (opts.parent || document.body).appendChild(this.el);\n this._wireDrag();\n }\n\n // ─── Bootstrapping helpers ─────────────────────────────────────────────\n\n _populateOptions() {\n const imageFormats = isWebGL(this.p) ? [...IMAGE_FORMATS, ...WEBGL_FORMATS] : IMAGE_FORMATS;\n this.imageFormat.innerHTML = optionsHTML(imageFormats);\n this.imageScale.innerHTML = optionsHTML(SCALE_OPTIONS);\n this.videoFormat.innerHTML = optionsHTML(VIDEO_FORMATS);\n\n if (this.opts.filename) {\n this.imageFilename.value = this.opts.filename;\n this.videoFilename.value = this.opts.filename;\n }\n }\n\n _wireExtras() {\n this.imageFormat.addEventListener('change', () => this._refreshImageScaleEnabled());\n this._refreshImageScaleEnabled();\n this.timeline.addEventListener('input', () => {\n this._pausePreview();\n this._previewFrame = Number(this.timeline.value);\n this._renderPreviewFrame();\n });\n }\n\n _toggleCollapsed() { this.el.classList.toggle('is-collapsed'); }\n\n _switchTab(tab) {\n this.tab = tab;\n for (const btn of this.el.querySelectorAll('[data-tab]')) {\n btn.classList.toggle('is-active', btn.dataset.tab === tab);\n }\n for (const view of this.el.querySelectorAll('[data-view]')) {\n view.toggleAttribute('hidden', view.dataset.view !== tab);\n }\n }\n\n // ─── Image tab ─────────────────────────────────────────────────────────\n\n /** Scale only applies to raster formats; grey it out for SVG. */\n _refreshImageScaleEnabled() {\n const enabled = SCALE_APPLIES_TO_IMAGE.has(this.imageFormat.value);\n this.imageScale.disabled = !enabled;\n this.imageScaleRow.style.opacity = enabled ? '' : '0.45';\n }\n\n async _saveImage() {\n const fmt = this.imageFormat.value;\n const name = this.imageFilename.value || undefined;\n const scale = Number(this.imageScale.value) || 1;\n const opts = SCALE_APPLIES_TO_IMAGE.has(fmt) ? { scale } : undefined;\n const tag = `${fmt.toUpperCase()}${opts && scale > 1 ? ` @ ${scale}×` : ''}`;\n this._setStatus(this.imageStatus, `Saving ${tag}…`);\n try {\n if (fmt === 'png') await this.p.savePNG(name, opts);\n else if (fmt === 'jpg') await this.p.saveJPG(name, opts);\n else if (fmt === 'webp') await this.p.saveWebP(name, opts);\n else if (fmt === 'svg') this.p.saveSVG(name);\n else if (fmt === 'pdf') await this.p.savePDF(name, opts);\n else if (fmt === 'stl' || fmt === 'obj') {\n this._setStatus(this.imageStatus,\n `${fmt.toUpperCase()} needs a p5.Geometry — call saveSTL(myGeometry) from your sketch.`,\n 'error');\n return;\n }\n this._setStatus(this.imageStatus, `Saved ${tag}.`, '', 2000);\n } catch (err) {\n console.error(err);\n this._setStatus(this.imageStatus, `Error: ${err.message}`, 'error');\n }\n }\n\n // ─── Video tab ─────────────────────────────────────────────────────────\n\n /** Cycle: idle → recording → recorded → encoding → recorded. */\n _videoPrimary() {\n if (this.videoState === 'idle') return this._startRecording();\n if (this.videoState === 'recording') return this._stopRecording();\n if (this.videoState === 'recorded') return this._export(this.videoFormat.value);\n }\n\n _startRecording() {\n const duration = Number(this.videoDuration.value) || undefined;\n try {\n this.buffer = this.p.createVideoBuffer({ duration, fps: 30, scale: 1 });\n } catch (err) {\n console.error(err);\n this._setStatus(this.recordedStatus, `Error: ${err.message}`, 'error');\n return;\n }\n this.videoState = 'recording';\n this._updateVideoState();\n\n const start = performance.now();\n this._statusTimer = setInterval(() => {\n const elapsed = (performance.now() - start) / 1000;\n const tail = duration ? ` / ${duration.toFixed(1)}s` : '';\n this._setStatus(this.recordedStatus,\n `Recording ${elapsed.toFixed(1)}s${tail} · ${this.buffer.framesRecorded} frames`);\n if (!this.buffer.recording) this._finishRecording();\n }, 100);\n }\n\n _stopRecording() {\n if (this.buffer) this.buffer.stop();\n this._finishRecording();\n }\n\n _finishRecording() {\n clearInterval(this._statusTimer);\n this._statusTimer = null;\n if (!this.buffer) return;\n this.videoState = 'recorded';\n this._setStatus(this.recordedStatus, '');\n this._initPreview();\n this._updateVideoState();\n }\n\n async _export(format) {\n if (!this.buffer) return;\n const name = this.videoFilename.value || undefined;\n const wasState = this.videoState;\n this.videoState = 'encoding';\n this._updateVideoState();\n this._setStatus(this.recordedStatus, `Encoding ${format.toUpperCase()}…`);\n try {\n await this.p.exportVideoBuffer(this.buffer, {\n format, filename: name,\n onProgress: (p) => this._setStatus(this.recordedStatus,\n `Encoding ${format.toUpperCase()}… ${Math.round(p * 100)}%`)\n });\n this._setStatus(this.recordedStatus, `Saved ${format.toUpperCase()}.`, '', 2000);\n } catch (err) {\n console.error(err);\n this._setStatus(this.recordedStatus, `Error: ${err.message}`, 'error');\n } finally {\n this.videoState = wasState;\n this._updateVideoState();\n }\n }\n\n _resetVideo() {\n this._pausePreview();\n if (this.buffer) this.buffer.clear();\n this.buffer = null;\n this._setStatus(this.recordedStatus, '');\n this.videoState = 'idle';\n this._updateVideoState();\n }\n\n /** Drive every video-tab visual difference from one place. */\n _updateVideoState() {\n const s = this.videoState;\n const hasRecording = s === 'recorded' || s === 'encoding';\n const formLocked = s === 'recording';\n\n this.videoFormat.disabled = formLocked;\n this.videoDuration.disabled = formLocked;\n this.videoFilename.disabled = formLocked;\n\n this.previewWrap.toggleAttribute('hidden', !hasRecording);\n this.rerecordBtn.toggleAttribute('hidden', !hasRecording);\n\n this.videoPrimaryBtn.className = 'p5export-btn' + (s === 'recording' ? ' is-danger' : '');\n this.videoPrimaryBtn.textContent =\n s === 'recording' ? 'Stop' :\n hasRecording ? 'Export' :\n 'Record';\n\n const encoding = s === 'encoding';\n this.videoPrimaryBtn.disabled = encoding;\n this.rerecordBtn.disabled = encoding;\n }\n\n // ─── Preview player ────────────────────────────────────────────────────\n\n _initPreview() {\n if (!this.buffer || !this.buffer.frames.length) return;\n const PREVIEW_MAX = 320;\n const srcW = this.buffer.width;\n const srcH = this.buffer.height;\n const scale = Math.min(1, PREVIEW_MAX / Math.max(srcW, srcH));\n this.previewCanvas.width = Math.max(1, Math.round(srcW * scale));\n this.previewCanvas.height = Math.max(1, Math.round(srcH * scale));\n this._previewCtx = this.previewCanvas.getContext('2d');\n this._previewSrc = document.createElement('canvas');\n this._previewSrc.width = srcW;\n this._previewSrc.height = srcH;\n this._previewSrcCtx = this._previewSrc.getContext('2d');\n this._previewImageData = this._previewSrcCtx.createImageData(srcW, srcH);\n this._previewFrame = 0;\n this._previewPlaying = false;\n this._previewRaf = null;\n this.timeline.min = '0';\n this.timeline.max = String(this.buffer.frames.length - 1);\n this.timeline.value = '0';\n this.playIcon.innerHTML = PLAY_ICON;\n this._renderPreviewFrame();\n }\n\n _renderPreviewFrame() {\n if (!this.buffer || !this._previewCtx) return;\n const idx = Math.max(0, Math.min(this.buffer.frames.length - 1, this._previewFrame));\n const frame = this.buffer.frames[idx];\n if (!frame) return;\n this._previewImageData.data.set(frame);\n this._previewSrcCtx.putImageData(this._previewImageData, 0, 0);\n this._previewCtx.clearRect(0, 0, this.previewCanvas.width, this.previewCanvas.height);\n this._previewCtx.drawImage(\n this._previewSrc,\n 0, 0, this._previewSrc.width, this._previewSrc.height,\n 0, 0, this.previewCanvas.width, this.previewCanvas.height\n );\n this.timeline.value = String(idx);\n const fps = this.buffer.fps || 30;\n // Decimal seconds — the M:SS format always rounded down by ~1 frame,\n // so a 3-second recording showed \"0:02\" at the slider's max. `0.0s`\n // → `3.0s` matches what the user actually recorded.\n this.timeLabel.textContent = `${(idx / fps).toFixed(1)}s`;\n }\n\n _togglePreview() {\n if (!this.buffer) return;\n if (this._previewPlaying) this._pausePreview();\n else this._playPreview();\n }\n\n _playPreview() {\n if (!this.buffer || !this.buffer.frames.length) return;\n this._previewPlaying = true;\n this.playIcon.innerHTML = PAUSE_ICON;\n const fps = this.buffer.fps || 30;\n const frameMs = 1000 / fps;\n let last = performance.now();\n const tick = (now) => {\n if (!this._previewPlaying) return;\n const elapsed = now - last;\n if (elapsed >= frameMs) {\n last = now - (elapsed % frameMs);\n this._previewFrame++;\n if (this._previewFrame >= this.buffer.frames.length) this._previewFrame = 0;\n this._renderPreviewFrame();\n }\n this._previewRaf = requestAnimationFrame(tick);\n };\n this._previewRaf = requestAnimationFrame(tick);\n }\n\n _pausePreview() {\n if (!this._previewPlaying) return;\n this._previewPlaying = false;\n if (this._previewRaf) cancelAnimationFrame(this._previewRaf);\n this._previewRaf = null;\n this.playIcon.innerHTML = PLAY_ICON;\n }\n\n // ─── Status helper ─────────────────────────────────────────────────────\n\n /**\n * Update a status element. Empty message → element hidden (so it\n * doesn't reserve vertical space). `kind === 'error'` paints it red;\n * any other value clears existing modifier classes.\n */\n _setStatus(el, msg, kind = '', clearAfter = 0) {\n el.textContent = msg || '';\n el.toggleAttribute('hidden', !msg);\n el.classList.toggle('is-error', kind === 'error');\n if (clearAfter && msg) {\n setTimeout(() => {\n if (el.textContent === msg) this._setStatus(el, '');\n }, clearAfter);\n }\n }\n\n // ─── Dragging ──────────────────────────────────────────────────────────\n\n _wireDrag() {\n let startX = 0, startY = 0, origX = 0, origY = 0, dragging = false;\n const onMove = (e) => {\n if (!dragging) return;\n this.el.style.left = (origX + e.clientX - startX) + 'px';\n this.el.style.top = (origY + e.clientY - startY) + 'px';\n };\n const onUp = () => { dragging = false; document.removeEventListener('mousemove', onMove); };\n this.header.addEventListener('mousedown', (e) => {\n if (e.target.closest('.p5export-toggle')) return;\n dragging = true;\n startX = e.clientX; startY = e.clientY;\n const r = this.el.getBoundingClientRect();\n origX = r.left; origY = r.top;\n this.el.style.left = origX + 'px';\n this.el.style.top = origY + 'px';\n this.el.style.right = 'auto';\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp, { once: true });\n });\n }\n\n destroy() {\n clearInterval(this._statusTimer);\n this._pausePreview();\n if (this.buffer) this.buffer.clear();\n this.el.remove();\n }\n}\n\nfunction optionsHTML(items) {\n return items.map((o) => `<option value=\"${o.value}\">${o.label}</option>`).join('');\n}\n\nexport function attachGUI(p5, fn, lifecycles) {\n /**\n * Mount the export GUI panel. Idempotent — returns the existing panel\n * with merged opts if one is already mounted.\n *\n * You usually don't need to call this; it auto-mounts after setup().\n */\n fn.createExportGUI = function (opts = {}) {\n if (this._p5ExportPanel) {\n Object.assign(this._p5ExportPanel.opts, opts);\n return this._p5ExportPanel;\n }\n const panel = new ExportPanel(this, opts);\n this._p5ExportPanel = panel;\n return panel;\n };\n\n fn.removeExportGUI = function () {\n if (this._p5ExportPanel) {\n this._p5ExportPanel.destroy();\n this._p5ExportPanel = null;\n }\n };\n\n // Auto-mount after setup() runs. Opt out with\n // `window.p5ExportConfig = { autoGUI: false }`\n // BEFORE the addon script loads.\n if (lifecycles && typeof lifecycles === 'object') {\n const prev = lifecycles.postsetup;\n lifecycles.postsetup = function () {\n if (typeof prev === 'function') prev.call(this);\n const cfg = (typeof window !== 'undefined' && window.p5ExportConfig) || {};\n if (cfg.autoGUI === false) return;\n if (this._p5ExportPanel) return;\n this.createExportGUI();\n };\n }\n}\n","/**\n * p5.export — a p5.js add-on for one-line exports to PNG, JPG, WebP, GIF,\n * MP4, WebM, SVG, and PDF, plus an optional floating GUI.\n *\n * p5.export does NOT ship its own p5. The page must load p5 (1.x or 2.x)\n * before this script — we auto-register against whatever `window.p5` is\n * present (using `registerAddon` on p5 2.0, `registerMethod` on p5 1.x).\n *\n * Usage (browser, drop-in):\n * <script src=\"https://cdn.jsdelivr.net/npm/p5@2/lib/p5.js\"></script>\n * <script src=\"p5.export.min.js\"></script>\n *\n * Usage (ES modules):\n * import 'p5'; // or whatever brings p5 onto window\n * import 'p5.export'; // auto-registers on window.p5\n * // or, to register manually against a specific p5 constructor:\n * import { register } from 'p5.export';\n * register(p5);\n */\n\nimport { attachImageExports } from './exporters/image.js';\nimport { attachSVGExport } from './exporters/svg.js';\nimport { attachPDFExport } from './exporters/pdf.js';\nimport { attachGIFRecorder } from './exporters/gif.js';\nimport { attachVideoRecorder } from './exporters/video.js';\nimport { attachGeometryExports } from './exporters/geometry.js';\nimport { attachGUI } from './gui.js';\nimport { downloadBlob } from './utils/download.js';\n\n/**\n * The addon function passed to p5.registerAddon. Adds export methods to\n * the p5 prototype (`fn`).\n *\n * @param {typeof import('p5').default} p5\n * @param {Record<string, any>} fn p5 prototype — methods added here appear on every sketch.\n * @param {Record<string, any>} lifecycles\n */\nexport function p5ExportAddon(p5, fn, lifecycles) {\n attachImageExports(p5, fn);\n attachSVGExport(p5, fn, lifecycles);\n attachPDFExport(p5, fn);\n attachGIFRecorder(p5, fn, lifecycles);\n attachVideoRecorder(p5, fn, lifecycles);\n attachGeometryExports(p5, fn);\n attachGUI(p5, fn, lifecycles);\n\n // p5 2.0 stopped attaching `random` / `randomSeed` / `noise` / `noiseSeed`\n // to `p5.Graphics.prototype` (they're only on `p5.prototype` now), but\n // many in-the-wild sketches still call `pg.random(width)` /\n // `pg.randomSeed(seed)` from p5 1.x. Bridge those by delegating to the\n // global p5 instance — calling pg.random uses the GLOBAL seed, which is\n // good enough for most sketches and avoids \"X is not a function\" errors\n // that would otherwise mask everything else.\n patchGraphicsRandom(p5);\n\n // Surface a tiny utility users sometimes want.\n fn.downloadBlob = function (blob, filename) {\n return downloadBlob(blob, filename);\n };\n}\n\nfunction patchGraphicsRandom(p5) {\n const G = p5 && p5.Graphics;\n if (!G || !G.prototype) return;\n if (G.prototype.__p5ExportGraphicsRandomPatched) return;\n const proto = p5.prototype;\n for (const name of ['random', 'randomSeed', 'noise', 'noiseSeed', 'randomGaussian']) {\n if (typeof G.prototype[name] === 'function') continue;\n if (typeof proto[name] !== 'function') continue;\n G.prototype[name] = function (...args) {\n const inst = (typeof window !== 'undefined' && window.p5 && window.p5.instance) || this;\n return proto[name].apply(inst, args);\n };\n }\n G.prototype.__p5ExportGraphicsRandomPatched = true;\n}\n\n/**\n * Best-effort install against p5 1.x — registerAddon doesn't exist there,\n * so we attach methods directly to `p5.prototype` and translate our\n * `lifecycles` object into p5 1.x's `registerMethod('pre' | 'post' | …)`.\n * Coverage is partial:\n * • image / video / GIF / PDF / GUI exports — work.\n * • SVG vector replay — works (the Proxy is installed when createCanvas\n * runs, which we wrap on the prototype).\n * • p5.pattern integration — works (hooks installed in our beforeSetup).\n *\n * If you hit a feature that doesn't behave, upgrade to p5 2.0 — that's the\n * primary supported version.\n */\nfunction registerP5OneX(p5Ctor) {\n if (!p5Ctor || !p5Ctor.prototype) return false;\n if (p5Ctor.prototype.__p5ExportInstalled) return true;\n p5Ctor.prototype.__p5ExportInstalled = true;\n // Translate the p5 2.0 lifecycles dict into p5 1.x registerMethod calls.\n const lifecycles = {};\n p5ExportAddon(p5Ctor, p5Ctor.prototype, lifecycles);\n const reg = (event, fn) =>\n typeof fn === 'function' && typeof p5Ctor.prototype.registerMethod === 'function' &&\n p5Ctor.prototype.registerMethod(event, fn);\n reg('beforeSetup', lifecycles.presetup);\n reg('afterSetup', lifecycles.postsetup);\n reg('pre', lifecycles.predraw);\n reg('post', lifecycles.postdraw);\n // The `afterSetup` registration above only reaches a p5 instance that is\n // constructed AFTER this point — p5 1.x snapshots `_registeredMethods`\n // from the prototype at construction time. When our <script> loads after\n // p5 has already instantiated its global sketch (the common case for a\n // drop-in include), that hook never fires and the GUI silently never\n // mounts. Mount it directly onto the already-running instance instead.\n scheduleP5OneXAutoGUI(p5Ctor);\n console.info('[p5.export] Registered against p5 1.x — vector SVG, image, GIF, video, PDF exports available. Use p5 2.0 for full feature parity.');\n return true;\n}\n\n/**\n * Resilient GUI auto-mount for the p5 1.x path. Polls for the running\n * global instance (`p5.instance`, set by p5 1.x in global mode) and mounts\n * the panel once setup has completed — covering the case where the\n * `afterSetup` lifecycle hook was registered too late to reach the\n * already-constructed instance. Idempotent with the lifecycle path:\n * `createExportGUI()` returns the existing panel if one is already up.\n */\nfunction scheduleP5OneXAutoGUI(p5Ctor) {\n if (typeof window === 'undefined') return;\n const start = Date.now();\n const id = setInterval(() => {\n // Opt-out, same flag the lifecycle path honors.\n const cfg = window.p5ExportConfig || {};\n if (cfg.autoGUI === false) { clearInterval(id); return; }\n const inst = p5Ctor && p5Ctor.instance;\n // Already mounted (by the lifecycle hook or a prior tick) — done.\n if (inst && inst._p5ExportPanel) { clearInterval(id); return; }\n // Wait until the sketch's setup() has finished so the canvas exists.\n if (inst && inst._setupDone && typeof inst.createExportGUI === 'function') {\n inst.createExportGUI();\n clearInterval(id);\n return;\n }\n // Give up quietly after 30s (e.g. instance-mode sketch with no global\n // instance, or a sketch that never finishes setup).\n if (Date.now() - start > 30000) clearInterval(id);\n }, 150);\n}\n\n/**\n * Register the addon against a given p5 constructor. Called automatically\n * for the global p5 when this module loads in a browser, but exposed for\n * users who instantiate p5 themselves.\n */\nexport function register(p5Ctor) {\n if (!p5Ctor) throw new Error('[p5.export] register() called with no p5 constructor');\n if (typeof p5Ctor.registerAddon === 'function') {\n p5Ctor.registerAddon(p5ExportAddon);\n return;\n }\n if (!registerP5OneX(p5Ctor)) {\n throw new Error('[p5.export] Could not register — no registerAddon and no prototype.registerMethod.');\n }\n}\n\n/**\n * Auto-register against window.p5 when used as a <script> include.\n *\n * Two timing realities to handle:\n * 1. Our <script> can run BEFORE the user's p5 CDN <script> — common when\n * the user injects us at the start of <head>. window.p5 isn't defined\n * yet, so a one-shot check would miss.\n * 2. Our <script> runs AFTER p5 — window.p5 is already populated.\n *\n * Solution: do an immediate check, plus listen for `p5Ready` (fired by\n * p5 2.0 just before global instantiation), plus a brief setInterval\n * fallback covering the gap between window.p5 being defined and the\n * `load` event when p5 instantiates. In every case we noop after the\n * first successful registration.\n */\nfunction tryAutoRegister() {\n if (typeof window === 'undefined' || !window.p5) return false;\n // Idempotency: registerP5OneX sets a flag on the prototype.\n if (window.p5.prototype && window.p5.prototype.__p5ExportInstalled) return true;\n // For 2.0 we tag the constructor since multiple addons may register.\n if (window.p5.__p5ExportAutoRegistered) return true;\n if (typeof window.p5.registerAddon === 'function') {\n window.p5.registerAddon(p5ExportAddon);\n window.p5.__p5ExportAutoRegistered = true;\n return true;\n }\n return registerP5OneX(window.p5);\n}\n\n/**\n * Best-effort auto-register for bundler / ESM usage.\n *\n * p5 2.x's ESM build never assigns `window.p5` (it only exports the\n * constructor and binds sketch methods to the window), so the\n * `window.p5` polling above can never see it under a bundler. As a\n * fallback we dynamically `import('p5')` — in a bundler this resolves to\n * the user's installed p5 (the same module instance, so no double\n * init), letting `import '@munusshih/p5.export'` auto-register without\n * the user wiring up `register()` by hand.\n *\n * This is safe under `<script>` usage too: it only runs when `window.p5`\n * never appears, and any resolution failure (p5 not installed, not a\n * module context) is swallowed. p5 2.x defers global instantiation\n * behind an async translator promise, so this import resolves and\n * registers well before the sketch is constructed. For guaranteed\n * ordering in a bundler, prefer the explicit `register(p5)` form.\n */\nfunction tryModuleAutoRegister() {\n if (typeof window === 'undefined') return;\n if (window.__p5ExportModuleTried) return;\n window.__p5ExportModuleTried = true;\n import(/* @vite-ignore */ 'p5')\n .then((mod) => {\n const p5Ctor = (mod && (mod.default || mod.p5)) || mod;\n if (!p5Ctor || (typeof p5Ctor !== 'function' && !p5Ctor.prototype)) return;\n // Don't double-register if a <script>-based path already handled it.\n if (p5Ctor.__p5ExportAutoRegistered) return;\n if (p5Ctor.prototype && p5Ctor.prototype.__p5ExportInstalled) return;\n register(p5Ctor);\n p5Ctor.__p5ExportAutoRegistered = true;\n })\n .catch(() => {\n /* p5 not resolvable as a module — fine, this path is opt-in. */\n });\n}\n\nif (typeof window !== 'undefined') {\n if (!tryAutoRegister()) {\n // p5 not on window yet — poll briefly to catch its definition. Most\n // browsers complete the next <script> tag within ~50ms; we poll for\n // 5s and stop on first success.\n const id = setInterval(() => {\n if (tryAutoRegister()) clearInterval(id);\n }, 10);\n setTimeout(() => clearInterval(id), 5000);\n // p5 2.0 dispatches `p5Ready` just before instantiation; catch the\n // last possible moment to be on the prototype.\n window.addEventListener('p5Ready', tryAutoRegister, { once: true });\n // Bundler / ESM path where window.p5 will never appear.\n tryModuleAutoRegister();\n }\n}\n\nexport default p5ExportAddon;\n"],"names":["downloadBlob","blob","filename","url","a","defaultFilename","ext","base","ts","ensureExt","getCanvas","p","getGlobalCanvas","fromP5","isWebGL","r","ctx","RASTER_MIME","highResViaReplay","scale","format","quality","rec","canvas","origPD","logicalW","logicalH","targetW","targetH","off","sf","ops","i","op","name","mime","resolve","reject","b","withPixelDensity","fn","wasLooping","MIME","canvasToBlob","snapshotAtScale","replayed","attachImageExports","p5","opts","STYLES","CanvasGradient","CanvasPattern","namedEntities","str","args","keys","randomString","holder","chars","randomstring","createNamedToNumberedLookup","items","radix","entity","lookup","base10","getTextAnchor","textAlign","mapping","getDominantBaseline","textBaseline","gradientNode","offset","color","stop","regex","matches","pattern","o","defaultOptions","options","elementName","properties","resetFill","element","key","styleState","type","style","value","id","node","fixNamedEntities","serialized","regexp","xmlns","group","parent","state","t","transform","x","y","angle","degrees","c","d","e","f","path","command","cp1x","cp1y","cp2x","cp2y","cpx","cpy","normalize","vector","len","x1","y1","x2","y2","radius","x0","y0","unit_vec_p1_p0","unit_vec_p1_p2","cos","theta","unit_vec_p1_origin","len_p1_origin","unit_vec_origin_start_tangent","unit_vec_origin_end_tangent","getAngle","startAngle","endAngle","width","height","rect","grad","r0","r1","fontPart","data","font","text","action","textElement","counterClockwise","endX","endY","startX","startY","sweepFlag","largeArcFlag","diff","clipPath","newGroup","image","dx","dy","dw","dh","sx","sy","sw","sh","svg","defs","currentElement","svgImage","context","repetition","img","module","TAU","patternIdCounter","nextPatternId","pickPaletteColor","inst","pc","palette","modeAdjust","mode","readRectMode","readEllipseMode","injectVector","payload","injectBeginRaster","meta","injectEndRaster","wrap","proto","computeShape","orig","patternId","shape","wrapping","PATTERN_FN_NAMES","wrapPatternPlugin","p5Instance","alreadyInstalled","Renderer","k","v","xs","ys","minX","maxX","minY","maxY","instance","protoFn","boundFn","_v","SHARED_RASTER_PATTERN_ID","replaySyntheticVector","c2s","useSharedPattern","oldFill","rx","ry","cx","cy","pts","_c2sPatched","patchC2S","C2S","rotation","ccw","cosR","sinR","toCanvas","lx","ly","start","end","rotDeg","w","h","radii","tl","tr","br","bl","max","origApply","HEX8","hexToRgba","m","origFill","origStroke","DEFAULT_MAX_FRAMES","PRESERVED_STYLE_PROPS","gradientIdCounter","GRADIENT_BY_ID","nextGradientId","makeRecorder","realCtx","frameStarts","dropTo","lastValue","carry","delta","GRADIENT_FACTORIES","wrapGradient","kind","target","prop","result","isP2DContext","installRecorder","renderer","real","cfg","desc","normalizeColorForC2S","isOpaqueColor","findLastOpaqueClear","lastClearIdx","curFill","tolerance","inRaster","replayToSVG","lastStringFill","lastStringStroke","emittedGradientIds","xmlnsSVG","emitSvgGradient","doc","el","s","inv","clearIdx","startIdx","depth","saveIdx","liveCanvas","rasterW","rasterH","regionCanvas","regionCtx","activeRegion","sharedRasterCanvas","sharedRasterCtx","sharedRasterHasContent","xlink","ensureRegionCanvas","ensureSharedRaster","emitRegionPattern","region","bb","ex","ey","dataUrl","slice","pat","emitSharedRaster","patImg","rootImg","inRasterRegion","isFill","existing","sep","rasterSVG","attachSVGExport","lifecycles","markup","canRecord","HUGE_OPS_THRESHOLD","vectorOpCount","allOps","trimStart","tooBigForVector","reason","n","origCreateCanvas","prevPresetup","prevSetup","prevPre","blobToDataURL","reader","_jsPDFPromise","loadJsPDF","mod","attachPDFExport","jsPDF","imageFormat","wLogical","hLogical","fmt","unit","orientation","pdf","pageW","pageH","fit","drawW","drawH","X","F","O","J","lt","at","l","g","_","u","B","A","z","I","M","V","$","D","G","j","R","T","tt","Q","ut","H","C","L","Y","E","K","xt","nt","gt","bt","q","ct","pt","it","dt","wt","ht","yt","ft","S","Z","GIFRecorder","now","tmp","gif","GIFEncoder","delay","total","quantize","index","applyPalette","attachGIFRecorder","prev","VideoBuffer","fps","duration","maxFrames","tctx","__accessCheck","obj","member","msg","__privateGet","getter","__privateAdd","__privateSet","setter","__privateWrapper","__privateMethod","method","bytes","view","u8","u16","i16","u24","u32","i32","u64","fixed_8_8","fixed_16_16","fixed_2_30","ascii","nullTerminated","bytes2","last","arr","lastPresentedSample","samples","sample","intoTimescale","timeInSeconds","timescale","round","rotationMatrix","rotationInDegrees","cosTheta","sinTheta","IDENTITY_MATRIX","matrixToBytes","matrix","deepClone","isU32","box","contents","children","fullBox","version","flags","ftyp","details","minorVersion","mdat","reserveLargeSize","free","size","moov","tracks","creationTime","fragmented","mvhd","trak","mvex","lastSample","GLOBAL_TIMESCALE","nextTrackId","needsU64","u32OrU64","track","tkhd","mdia","durationInGlobalTimescale","mdhd","hdlr","minf","localDuration","componentSubtype","vmhd","smhd","dinf","stbl","dref","needsCtts","stsd","stts","stss","stsc","stsz","stco","ctts","videoSampleDescription","VIDEO_CODEC_TO_BOX_NAME","soundSampleDescription","AUDIO_CODEC_TO_BOX_NAME","compressionType","VIDEO_CODEC_TO_CONFIGURATION_BOX","colr","COLOR_PRIMARIES_MAP","TRANSFER_CHARACTERISTICS_MAP","MATRIX_COEFFICIENTS_MAP","avcC","hvcC","vpcC","decoderConfig","parts","profile","level","thirdByte","av1C","firstByte","AUDIO_CODEC_TO_CONFIGURATION_BOX","esds","description","dOps","preskip","gain","_a","view2","keySamples","trex","moof","sequenceNumber","mfhd","traf","fragmentSampleFlags","byte1","byte2","byte3","byte4","sampleIsDifferenceSample","tfhd","tfdt","trun","tfFlags","referenceSample","referenceSampleInfo","allSampleDurations","allSampleSizes","allSampleFlags","allSampleCompositionTimeOffsets","uniqueSampleDurations","uniqueSampleSizes","uniqueSampleFlags","uniqueSampleCompositionTimeOffsets","firstSampleFlagsPresent","sampleDurationPresent","sampleSizePresent","sampleFlagsPresent","sampleCompositionTimeOffsetsPresent","mfra","tfra","mfro","trackIndex","chunk","Target","ArrayBufferTarget","StreamTarget","FileSystemWritableFileStreamTarget","stream","_helper","_helperView","Writer","newPos","box2","startPos","child","endPos","_target","_buffer","_bytes","_maxPos","_ensureSize","ensureSize_fn","ArrayBufferTargetWriter","newLength","newBuffer","newBytes","DEFAULT_CHUNK_SIZE","MAX_CHUNKS_AT_ONCE","_target2","_sections","_chunked","_chunkSize","_chunks","_writeDataIntoChunks","writeDataIntoChunks_fn","_insertSectionIntoChunk","insertSectionIntoChunk_fn","_createChunk","createChunk_fn","_flushChunks","flushChunks_fn","StreamTargetWriter","_b","chunks","sorted","lastChunk","section","position","chunkIndex","relativePosition","toWrite","low","high","mid","includesPosition","force","FileSystemWritableFileStreamTargetWriter","SUPPORTED_VIDEO_CODECS","SUPPORTED_AUDIO_CODECS","TIMESTAMP_OFFSET","FIRST_TIMESTAMP_BEHAVIORS","_options","_writer","_ftypSize","_mdat","_videoTrack","_audioTrack","_creationTime","_finalizedChunks","_nextFragmentNumber","_videoSampleQueue","_audioSampleQueue","_finalized","_validateOptions","validateOptions_fn","_writeHeader","writeHeader_fn","_computeMoovSizeUpperBound","computeMoovSizeUpperBound_fn","_prepareTracks","prepareTracks_fn","_generateMpeg4AudioSpecificConfig","generateMpeg4AudioSpecificConfig_fn","_createSampleForTrack","createSampleForTrack_fn","_addSampleToTrack","addSampleToTrack_fn","_validateTimestamp","validateTimestamp_fn","_finalizeCurrentChunk","finalizeCurrentChunk_fn","_finalizeFragment","finalizeFragment_fn","_maybeFlushStreamingTargetWriter","maybeFlushStreamingTargetWriter_fn","_ensureNotFinalized","ensureNotFinalized_fn","Muxer","timestamp","compositionTimeOffset","videoSample","audioSample","mdatSize","movieBox2","movieBoxSize","currentChunkPos","movieBox","mfraBox","mfraBoxSize","mdatPos","remainingBytes","videoRotation","moovSizeUpperBound","upperBound","sampleCounts","guessedCodecPrivate","objectType","sampleRate","numberOfChannels","frequencyIndex","channelConfig","configBits","paddingLength","configBytes","presentationTimestampInSeconds","decodeTimestampInSeconds","durationInSeconds","adjusted","sampleCompositionTimeOffset","timescaleUnits","lastTableEntry","lastCompositionTimeOffsetTableEntry","beginNewChunk","currentChunkDuration","mostImportantTrack","chunkDuration","presentationTimestamp","decodeTimestamp","strictTimestampBehavior","noLastDecodeTimestamp","baseDecodeTimestamp","flushStreamingWriter","fragmentNumber","moofOffset","moofBox","mdatBox","totalTrackSampleSize","newMoofBox","EBMLFloat32","EBMLFloat64","measureUnsignedInt","measureEBMLVarInt","readBits","byteIndex","byte","bitIndex","bit","writeBits","_writeByte","writeByte_fn","_writeFloat32","writeFloat32_fn","_writeFloat64","writeFloat64_fn","_writeUnsignedInt","writeUnsignedInt_fn","_writeString","writeString_fn","pos","elem","sizePos","sizeSize","_trackingWrites","_trackedWrites","_trackedStart","_trackedEnd","BaseStreamTargetWriter","neededSize","copy","_lastFlushEnd","_ensureMonotonicity","ensureMonotonicity","VIDEO_TRACK_NUMBER","AUDIO_TRACK_NUMBER","SUBTITLE_TRACK_NUMBER","VIDEO_TRACK_TYPE","AUDIO_TRACK_TYPE","SUBTITLE_TRACK_TYPE","MAX_CHUNK_LENGTH_MS","CODEC_PRIVATE_MAX_SIZE","APP_NAME","SEGMENT_SIZE_BYTES","CLUSTER_SIZE_BYTES","_segment","_segmentInfo","_seekHead","_tracksElement","_segmentDuration","_colourElement","_videoCodecPrivate","_audioCodecPrivate","_subtitleCodecPrivate","_cues","_currentCluster","_currentClusterTimestamp","_duration","_videoChunkQueue","_audioChunkQueue","_subtitleChunkQueue","_firstVideoTimestamp","_firstAudioTimestamp","_lastVideoTimestamp","_lastAudioTimestamp","_lastSubtitleTimestamp","_colorSpace","_createFileHeader","createFileHeader_fn","_writeEBMLHeader","writeEBMLHeader_fn","_createCodecPrivatePlaceholders","createCodecPrivatePlaceholders_fn","_createColourElement","createColourElement_fn","_createSeekHead","createSeekHead_fn","_createSegmentInfo","createSegmentInfo_fn","_createTracks","createTracks_fn","_createSegment","createSegment_fn","_createCues","createCues_fn","_segmentDataOffset","segmentDataOffset_get","_writeVideoDecoderConfig","writeVideoDecoderConfig_fn","_fixVP9ColorSpace","fixVP9ColorSpace_fn","_writeSubtitleChunks","writeSubtitleChunks_fn","_createInternalChunk","createInternalChunk_fn","_writeBlock","writeBlock_fn","_createCodecPrivateElement","createCodecPrivateElement_fn","_writeCodecPrivate","writeCodecPrivate_fn","_createNewCluster","createNewCluster_fn","_finalizeCurrentCluster","finalizeCurrentCluster_fn","videoChunk","audioChunk","subtitleChunk","segmentSize","ebmlHeader","kaxCues","kaxInfo","kaxTracks","segmentDuration","segmentInfo","tracksElement","segment","colorSpace","showExistingFrame","frameType","syncCode","colorSpaceID","lastWrittenMediaTimestamp","queue","trackNumber","additions","adjustedTimestamp","lastTimestamp","firstTimestamp","canCreateNewCluster","msTimestamp","relativeTimestamp","shouldCreateNewClusterFromKeyFrame","clusterWouldBeTooLong","prelude","simpleBlock","msDuration","blockGroup","codecPrivateElementSize","voidDataSize","newByteLength","clusterOffsetFromSegment","clusterSize","encodeGIF","buffer","maxColors","hasWebCodecs","WEB_CODEC_CANDIDATES","MP4_CODEC_MAP","WEBM_CODEC_MAP","muxerCodec","codecString","prefix","pickWebCodec","bitrate","codec","hint","encodeVideoWebCodecs","Mp4Target","WebMTarget","muxerCodecId","muxer","Mp4Muxer","WebMMuxer","firstError","encoder","baseConfig","configAttempts","chosenConfig","attempt","usPerFrame","keyEvery","MAX_QUEUED","frame","MR_MIME","pickMrMime","order","encodeVideoMediaRecorder","requested","picked","recOpts","recorder","interval","tick","encodeVideo","t0","ms","err","encodeAnimatedWebP","frames","clamp01","loopCount","frameDurationMs","assertWebPEncodingSupported","scratch","sctx","imageData","frameSubChunks","canvasToWebPBlob","extractVP8","inner","concat","makeChunk","writeVP8X","writeANIM","sub","writeANMF","out","writeAscii","writeUint32LE","probe","readUint32LE","padded","buf","writeUint24LE","writeUint16LE","durationMs","subChunk","hdr","padBytes","arrays","CANDIDATES","pickMime","preferred","VideoRecorder","attachVideoRecorder","needsScale","origStop","restored","resolveGeometry","source","attachGeometryExports","geom","_styleInjected","injectStyles","css","IMAGE_FORMATS","WEBGL_FORMATS","VIDEO_FORMATS","SCALE_OPTIONS","SCALE_APPLIES_TO_IMAGE","PLAY_ICON","PAUSE_ICON","PANEL_HTML","ExportPanel","imageFormats","optionsHTML","tab","btn","enabled","tag","elapsed","tail","wasState","hasRecording","formLocked","encoding","PREVIEW_MAX","srcW","srcH","idx","frameMs","clearAfter","origX","origY","dragging","onMove","onUp","attachGUI","panel","p5ExportAddon","patchGraphicsRandom","registerP5OneX","p5Ctor","reg","event","scheduleP5OneXAutoGUI","register","tryAutoRegister","tryModuleAutoRegister"],"mappings":"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","x_google_ignoreList":[4,8,11,12]}