@vibeframe/mcp-server 0.49.1 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +2669 -430
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -6867,6 +6867,8 @@ function buildClipElements(state) {
6867
6867
  return `<div id="${clip.id}" class="clip" style="z-index:${zIndex};"><video id="${clip.id}-media" src="${relAsset(source3.url)}" style="width:100%;height:100%;object-fit:cover;" muted playsinline></video></div>`;
6868
6868
  case "audio":
6869
6869
  return `<audio id="${clip.id}-media" src="${relAsset(source3.url)}"></audio><div id="${clip.id}" class="clip" style="z-index:${zIndex};background:#111;"></div>`;
6870
+ case "lottie":
6871
+ return `<div id="${clip.id}" class="clip" style="z-index:${zIndex};"><dotlottie-wc src="${relAsset(source3.url)}" autoplay loop style="width:100%;height:100%;"></dotlottie-wc></div>`;
6870
6872
  default:
6871
6873
  return `<!-- unsupported source type: ${source3.type} for clip ${clip.id} -->`;
6872
6874
  }
@@ -6988,7 +6990,13 @@ function generateCompositionHtml(state) {
6988
6990
  const mediaDecls = buildMediaDeclarations(state);
6989
6991
  const clipData = buildClipRuntimeData(state);
6990
6992
  const duration = state.project.duration;
6993
+ const hasLottie = state.sources.some((s) => s.type === "lottie");
6991
6994
  const script = RUNTIME_SCRIPT.replace("/*CLIPS_JSON*/[]", JSON.stringify(clipData)).replace("/*DURATION*/0", String(duration)).replace("/*MEDIA_JSON*/[]", JSON.stringify(mediaDecls));
6995
+ const lottieRuntime = hasLottie ? `<script type="module">
6996
+ import { setWasmUrl } from "/vendor/dotlottie-wc/index.js";
6997
+ setWasmUrl("/vendor/dotlottie-player.wasm");
6998
+ </script>
6999
+ ` : "";
6992
7000
  return `<!DOCTYPE html>
6993
7001
  <html><head>
6994
7002
  <meta charset="utf-8">
@@ -6996,7 +7004,7 @@ function generateCompositionHtml(state) {
6996
7004
  html, body { margin: 0; width: ${width}px; height: ${height}px; overflow: hidden; background: #000; }
6997
7005
  .clip { position: absolute; inset: 0; display: none; }
6998
7006
  </style>
6999
- </head><body>
7007
+ ${lottieRuntime}</head><body>
7000
7008
  ${clipMarkup}
7001
7009
  <script>
7002
7010
  ${script}
@@ -7018,9 +7026,10 @@ __export(project_builder_exports, {
7018
7026
  buildTempProject: () => buildTempProject,
7019
7027
  resolveSourceUrl: () => resolveSourceUrl
7020
7028
  });
7021
- import { mkdtemp, mkdir, copyFile, writeFile as writeFile2, rm } from "node:fs/promises";
7029
+ import { mkdtemp, mkdir, copyFile, writeFile as writeFile2, rm, readdir } from "node:fs/promises";
7022
7030
  import { existsSync } from "node:fs";
7023
7031
  import { tmpdir } from "node:os";
7032
+ import { createRequire } from "node:module";
7024
7033
  import * as path from "node:path";
7025
7034
  async function buildTempProject(state, projectFileDir) {
7026
7035
  const dir = await mkdtemp(path.join(tmpdir(), "vibeframe-hf-"));
@@ -7037,6 +7046,9 @@ async function buildTempProject(state, projectFileDir) {
7037
7046
  await copyFile(resolved, dest);
7038
7047
  copied.set(source3.id, dest);
7039
7048
  }
7049
+ if (state.sources.some((s) => s.type === "lottie")) {
7050
+ await copyLottieRuntime(dir);
7051
+ }
7040
7052
  const html = generateCompositionHtml(state);
7041
7053
  await writeFile2(path.join(dir, "index.html"), html, "utf-8");
7042
7054
  return {
@@ -7044,6 +7056,21 @@ async function buildTempProject(state, projectFileDir) {
7044
7056
  cleanup: () => rm(dir, { recursive: true, force: true })
7045
7057
  };
7046
7058
  }
7059
+ async function copyLottieRuntime(tempDir) {
7060
+ const require2 = createRequire(import.meta.url);
7061
+ const wcPkgPath = require2.resolve("@lottiefiles/dotlottie-wc/package.json");
7062
+ const wcDistDir = path.join(path.dirname(wcPkgPath), "dist");
7063
+ const webEntry = require2.resolve("@lottiefiles/dotlottie-web");
7064
+ const wasmSrc = path.join(path.dirname(webEntry), "dotlottie-player.wasm");
7065
+ const vendorDir = path.join(tempDir, "vendor");
7066
+ const wcDest = path.join(vendorDir, "dotlottie-wc");
7067
+ await mkdir(wcDest, { recursive: true });
7068
+ for (const file of await readdir(wcDistDir)) {
7069
+ if (file.endsWith(".map") || file.endsWith(".d.ts")) continue;
7070
+ await copyFile(path.join(wcDistDir, file), path.join(wcDest, file));
7071
+ }
7072
+ await copyFile(wasmSrc, path.join(vendorDir, "dotlottie-player.wasm"));
7073
+ }
7047
7074
  function resolveSourceUrl(url, baseDir) {
7048
7075
  if (url.startsWith("file://")) return url.slice(7);
7049
7076
  if (path.isAbsolute(url)) return url;
@@ -8616,12 +8643,12 @@ ${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`;
8616
8643
  }
8617
8644
  return result;
8618
8645
  }
8619
- function convertOutputFiles({ path: path33, contents, hash }) {
8646
+ function convertOutputFiles({ path: path33, contents, hash: hash2 }) {
8620
8647
  let text = null;
8621
8648
  return {
8622
8649
  path: path33,
8623
8650
  contents,
8624
- hash,
8651
+ hash: hash2,
8625
8652
  get text() {
8626
8653
  const binary = this.contents;
8627
8654
  if (text === null || binary !== contents) {
@@ -18089,12 +18116,12 @@ var require_common = __commonJS({
18089
18116
  createDebug.skips = [];
18090
18117
  createDebug.formatters = {};
18091
18118
  function selectColor(namespace) {
18092
- let hash = 0;
18119
+ let hash2 = 0;
18093
18120
  for (let i = 0; i < namespace.length; i++) {
18094
- hash = (hash << 5) - hash + namespace.charCodeAt(i);
18095
- hash |= 0;
18121
+ hash2 = (hash2 << 5) - hash2 + namespace.charCodeAt(i);
18122
+ hash2 |= 0;
18096
18123
  }
18097
- return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
18124
+ return createDebug.colors[Math.abs(hash2) % createDebug.colors.length];
18098
18125
  }
18099
18126
  createDebug.selectColor = selectColor;
18100
18127
  function createDebug(namespace) {
@@ -68004,25 +68031,25 @@ var require_data = __commonJS({
68004
68031
  var notmodified_1 = __importDefault3(require_notmodified());
68005
68032
  var debug7 = (0, debug_1.default)("get-uri:data");
68006
68033
  var DataReadable = class extends stream_1.Readable {
68007
- constructor(hash, buf) {
68034
+ constructor(hash2, buf) {
68008
68035
  super();
68009
68036
  this.push(buf);
68010
68037
  this.push(null);
68011
- this.hash = hash;
68038
+ this.hash = hash2;
68012
68039
  }
68013
68040
  };
68014
68041
  var data = async ({ href: uri }, { cache } = {}) => {
68015
68042
  const shasum = (0, crypto_1.createHash)("sha1");
68016
68043
  shasum.update(uri);
68017
- const hash = shasum.digest("hex");
68018
- debug7('generated SHA1 hash for "data:" URI: %o', hash);
68019
- if (cache?.hash === hash) {
68020
- debug7("got matching cache SHA1 hash: %o", hash);
68044
+ const hash2 = shasum.digest("hex");
68045
+ debug7('generated SHA1 hash for "data:" URI: %o', hash2);
68046
+ if (cache?.hash === hash2) {
68047
+ debug7("got matching cache SHA1 hash: %o", hash2);
68021
68048
  throw new notmodified_1.default();
68022
68049
  } else {
68023
68050
  debug7('creating Readable stream from "data:" URI buffer');
68024
68051
  const { buffer } = (0, data_uri_to_buffer_1.dataUriToBuffer)(uri);
68025
- return new DataReadable(hash, Buffer.from(buffer));
68052
+ return new DataReadable(hash2, Buffer.from(buffer));
68026
68053
  }
68027
68054
  };
68028
68055
  exports.data = data;
@@ -89270,14 +89297,14 @@ var require_dist10 = __commonJS({
89270
89297
  (0, quickjs_emscripten_1.getQuickJS)(),
89271
89298
  this.loadPacFile()
89272
89299
  ]);
89273
- const hash = crypto3.createHash("sha1").update(code).digest("hex");
89274
- if (this.resolver && this.resolverHash === hash) {
89300
+ const hash2 = crypto3.createHash("sha1").update(code).digest("hex");
89301
+ if (this.resolver && this.resolverHash === hash2) {
89275
89302
  debug7("Same sha1 hash for code - contents have not changed, reusing previous proxy resolver");
89276
89303
  return this.resolver;
89277
89304
  }
89278
89305
  debug7("Creating new proxy resolver instance");
89279
89306
  this.resolver = (0, pac_resolver_1.createPacResolver)(qjs, code, this.opts);
89280
- this.resolverHash = hash;
89307
+ this.resolverHash = hash2;
89281
89308
  return this.resolver;
89282
89309
  } catch (err) {
89283
89310
  if (this.resolver && err.code === "ENOTMODIFIED") {
@@ -95672,7 +95699,7 @@ var require_tar_fs = __commonJS({
95672
95699
  // ../../node_modules/.pnpm/@puppeteer+browsers@2.13.0/node_modules/@puppeteer/browsers/lib/esm/fileUtil.js
95673
95700
  import { spawnSync, spawn } from "node:child_process";
95674
95701
  import { createReadStream } from "node:fs";
95675
- import { mkdir as mkdir2, readdir } from "node:fs/promises";
95702
+ import { mkdir as mkdir2, readdir as readdir2 } from "node:fs/promises";
95676
95703
  import * as path8 from "node:path";
95677
95704
  import { Stream } from "node:stream";
95678
95705
  async function unpackArchive(archivePath, folderPath) {
@@ -95774,7 +95801,7 @@ async function installDMG(dmgPath, folderPath) {
95774
95801
  }
95775
95802
  const mountPath = volumes[0];
95776
95803
  try {
95777
- const fileNames = await readdir(mountPath);
95804
+ const fileNames = await readdir2(mountPath);
95778
95805
  const appName = fileNames.find((item) => {
95779
95806
  return typeof item === "string" && item.endsWith(".app");
95780
95807
  });
@@ -96394,18 +96421,18 @@ var init_cliui = __esm({
96394
96421
  });
96395
96422
 
96396
96423
  // ../../node_modules/.pnpm/escalade@3.2.0/node_modules/escalade/sync/index.mjs
96397
- import { dirname, resolve as resolve6 } from "path";
96424
+ import { dirname as dirname2, resolve as resolve6 } from "path";
96398
96425
  import { readdirSync, statSync } from "fs";
96399
96426
  function sync_default(start, callback) {
96400
96427
  let dir = resolve6(".", start);
96401
96428
  let tmp, stats = statSync(dir);
96402
96429
  if (!stats.isDirectory()) {
96403
- dir = dirname(dir);
96430
+ dir = dirname2(dir);
96404
96431
  }
96405
96432
  while (true) {
96406
96433
  tmp = callback(dir, readdirSync(dir));
96407
96434
  if (tmp) return resolve6(dir, tmp);
96408
- dir = dirname(tmp = dir);
96435
+ dir = dirname2(tmp = dir);
96409
96436
  if (tmp === dir) break;
96410
96437
  }
96411
96438
  }
@@ -97667,7 +97694,7 @@ import { notStrictEqual, strictEqual } from "assert";
97667
97694
  import { inspect } from "util";
97668
97695
  import { readFileSync as readFileSync4 } from "fs";
97669
97696
  import { fileURLToPath } from "url";
97670
- import { basename as basename2, dirname as dirname2, extname, relative as relative2, resolve as resolve9 } from "path";
97697
+ import { basename as basename2, dirname as dirname3, extname, relative as relative2, resolve as resolve9 } from "path";
97671
97698
  var REQUIRE_ERROR, REQUIRE_DIRECTORY_ERROR, __dirname2, mainFilename, esm_default;
97672
97699
  var init_esm2 = __esm({
97673
97700
  "../../node_modules/.pnpm/yargs@17.7.2/node_modules/yargs/lib/platform-shims/esm.mjs"() {
@@ -97705,7 +97732,7 @@ var init_esm2 = __esm({
97705
97732
  Parser: lib_default,
97706
97733
  path: {
97707
97734
  basename: basename2,
97708
- dirname: dirname2,
97735
+ dirname: dirname3,
97709
97736
  extname,
97710
97737
  relative: relative2,
97711
97738
  resolve: resolve9
@@ -102785,7 +102812,7 @@ var init_PuppeteerNode = __esm({
102785
102812
  import { spawn as spawn2, spawnSync as spawnSync3 } from "node:child_process";
102786
102813
  import fs5 from "node:fs";
102787
102814
  import os9 from "node:os";
102788
- import { dirname as dirname3 } from "node:path";
102815
+ import { dirname as dirname4 } from "node:path";
102789
102816
  import { PassThrough } from "node:stream";
102790
102817
  var import_debug6, __runInitializers23, __esDecorate23, __setFunctionName6, CRF_VALUE, DEFAULT_FPS, debugFfmpeg, ScreenRecorder;
102791
102818
  var init_ScreenRecorder = __esm({
@@ -102904,7 +102931,7 @@ var init_ScreenRecorder = __esm({
102904
102931
  filters2.push(formatArgs.splice(vf, 2).at(-1) ?? "");
102905
102932
  }
102906
102933
  if (path15) {
102907
- fs5.mkdirSync(dirname3(path15), { recursive: overwrite });
102934
+ fs5.mkdirSync(dirname4(path15), { recursive: overwrite });
102908
102935
  }
102909
102936
  this.#process = spawn2(
102910
102937
  ffmpegPath,
@@ -110016,16 +110043,16 @@ var require_typescript2 = __commonJS({
110016
110043
  }
110017
110044
  const set = {
110018
110045
  has(element) {
110019
- const hash = getHashCode(element);
110020
- if (!multiMap.has(hash)) return false;
110021
- const candidates = multiMap.get(hash);
110046
+ const hash2 = getHashCode(element);
110047
+ if (!multiMap.has(hash2)) return false;
110048
+ const candidates = multiMap.get(hash2);
110022
110049
  if (isArray5(candidates)) return contains(candidates, element, equals);
110023
110050
  return equals(candidates, element);
110024
110051
  },
110025
110052
  add(element) {
110026
- const hash = getHashCode(element);
110027
- if (multiMap.has(hash)) {
110028
- const values = multiMap.get(hash);
110053
+ const hash2 = getHashCode(element);
110054
+ if (multiMap.has(hash2)) {
110055
+ const values = multiMap.get(hash2);
110029
110056
  if (isArray5(values)) {
110030
110057
  if (!contains(values, element, equals)) {
110031
110058
  values.push(element);
@@ -110034,27 +110061,27 @@ var require_typescript2 = __commonJS({
110034
110061
  } else {
110035
110062
  const value = values;
110036
110063
  if (!equals(value, element)) {
110037
- multiMap.set(hash, [value, element]);
110064
+ multiMap.set(hash2, [value, element]);
110038
110065
  size++;
110039
110066
  }
110040
110067
  }
110041
110068
  } else {
110042
- multiMap.set(hash, element);
110069
+ multiMap.set(hash2, element);
110043
110070
  size++;
110044
110071
  }
110045
110072
  return this;
110046
110073
  },
110047
110074
  delete(element) {
110048
- const hash = getHashCode(element);
110049
- if (!multiMap.has(hash)) return false;
110050
- const candidates = multiMap.get(hash);
110075
+ const hash2 = getHashCode(element);
110076
+ if (!multiMap.has(hash2)) return false;
110077
+ const candidates = multiMap.get(hash2);
110051
110078
  if (isArray5(candidates)) {
110052
110079
  for (let i = 0; i < candidates.length; i++) {
110053
110080
  if (equals(candidates[i], element)) {
110054
110081
  if (candidates.length === 1) {
110055
- multiMap.delete(hash);
110082
+ multiMap.delete(hash2);
110056
110083
  } else if (candidates.length === 2) {
110057
- multiMap.set(hash, candidates[1 - i]);
110084
+ multiMap.set(hash2, candidates[1 - i]);
110058
110085
  } else {
110059
110086
  unorderedRemoveItemAt(candidates, i);
110060
110087
  }
@@ -110065,7 +110092,7 @@ var require_typescript2 = __commonJS({
110065
110092
  } else {
110066
110093
  const candidate = candidates;
110067
110094
  if (equals(candidate, element)) {
110068
- multiMap.delete(hash);
110095
+ multiMap.delete(hash2);
110069
110096
  size--;
110070
110097
  return true;
110071
110098
  }
@@ -115731,9 +115758,9 @@ ${lanes.join("\n")}
115731
115758
  }
115732
115759
  }
115733
115760
  function createSHA256Hash(data) {
115734
- const hash = _crypto.createHash("sha256");
115735
- hash.update(data);
115736
- return hash.digest("hex");
115761
+ const hash2 = _crypto.createHash("sha256");
115762
+ hash2.update(data);
115763
+ return hash2.digest("hex");
115737
115764
  }
115738
115765
  }
115739
115766
  let sys2;
@@ -318920,7 +318947,7 @@ var init_puppeteer2 = __esm({
318920
318947
  }
318921
318948
  });
318922
318949
 
318923
- // ../../node_modules/.pnpm/@hyperframes+producer@0.4.4_typescript@5.9.3/node_modules/@hyperframes/producer/dist/index.js
318950
+ // ../../node_modules/.pnpm/@hyperframes+producer@0.4.10_typescript@5.9.3/node_modules/@hyperframes/producer/dist/index.js
318924
318951
  var dist_exports = {};
318925
318952
  __export(dist_exports, {
318926
318953
  DEFAULT_CONFIG: () => DEFAULT_CONFIG,
@@ -318971,7 +318998,7 @@ import os42 from "node:os";
318971
318998
  import readline3 from "node:readline";
318972
318999
  import { spawnSync as spawnSync4, spawn as spawn3 } from "node:child_process";
318973
319000
  import { createReadStream as createReadStream2 } from "node:fs";
318974
- import { mkdir as mkdir4, readdir as readdir2 } from "node:fs/promises";
319001
+ import { mkdir as mkdir4, readdir as readdir3 } from "node:fs/promises";
318975
319002
  import * as path72 from "node:path";
318976
319003
  import { Stream as Stream2 } from "node:stream";
318977
319004
  import assert22 from "node:assert";
@@ -318980,7 +319007,7 @@ import { existsSync as existsSync4, readFileSync as readFileSync5 } from "node:f
318980
319007
  import { mkdir as mkdir22, unlink as unlink3 } from "node:fs/promises";
318981
319008
  import os52 from "node:os";
318982
319009
  import path82 from "node:path";
318983
- import { dirname as dirname4, resolve as resolve22 } from "path";
319010
+ import { dirname as dirname5, resolve as resolve22 } from "path";
318984
319011
  import { readdirSync as readdirSync2, statSync as statSync3 } from "fs";
318985
319012
  import { format as format3 } from "util";
318986
319013
  import { normalize as normalize2, resolve as resolve32 } from "path";
@@ -319018,6 +319045,7 @@ import {
319018
319045
  mkdirSync as mkdirSync10,
319019
319046
  rmSync as rmSync3,
319020
319047
  readFileSync as readFileSync9,
319048
+ readdirSync as readdirSync6,
319021
319049
  writeFileSync as writeFileSync4,
319022
319050
  copyFileSync as copyFileSync2,
319023
319051
  appendFileSync
@@ -319027,10 +319055,10 @@ import { join as join32 } from "path";
319027
319055
  import { homedir as homedir2 } from "os";
319028
319056
  import { existsSync as existsSync42, mkdirSync, writeFileSync } from "fs";
319029
319057
  import { join as join52 } from "path";
319030
- import { join as join42, resolve as resolve62, dirname as dirname42 } from "path";
319058
+ import { posix } from "path";
319031
319059
  import { spawn as spawn5 } from "child_process";
319032
319060
  import { copyFileSync, existsSync as existsSync5, mkdirSync as mkdirSync2, readdirSync as readdirSync3, statSync as statSync32, writeFileSync as writeFileSync2 } from "fs";
319033
- import { join as join6, dirname as dirname5 } from "path";
319061
+ import { join as join6, dirname as dirname52 } from "path";
319034
319062
  import { spawn as spawn32 } from "child_process";
319035
319063
  import { spawn as spawn4 } from "child_process";
319036
319064
  import { spawn as spawn6 } from "child_process";
@@ -319057,7 +319085,8 @@ import { Http2ServerRequest as Http2ServerRequest2 } from "http2";
319057
319085
  import { Http2ServerRequest } from "http2";
319058
319086
  import { Readable as Readable2 } from "stream";
319059
319087
  import crypto2 from "crypto";
319060
- import { join as join14, dirname as dirname10, resolve as resolve92 } from "path";
319088
+ import { inflateSync } from "zlib";
319089
+ import { join as join15, dirname as dirname10, resolve as resolve102 } from "path";
319061
319090
  import { randomUUID } from "crypto";
319062
319091
  import { freemem as freemem2 } from "os";
319063
319092
  import { fileURLToPath as fileURLToPath3 } from "url";
@@ -319068,10 +319097,11 @@ import { existsSync as existsSync11, readFileSync as readFileSync52 } from "node
319068
319097
  import { dirname as dirname8, resolve as resolve72 } from "node:path";
319069
319098
  import { fileURLToPath as fileURLToPath22 } from "node:url";
319070
319099
  import { readFileSync as readFileSync8, existsSync as existsSync14, mkdirSync as mkdirSync9 } from "fs";
319071
- import { join as join13, dirname as dirname9, resolve as resolve82 } from "path";
319100
+ import { join as join14, dirname as dirname9, resolve as resolve92 } from "path";
319101
+ import { resolve as resolve82, basename as basename22, join as join12, relative as relative22, isAbsolute as isAbsolute22 } from "node:path";
319072
319102
  import { existsSync as existsSync13, mkdirSync as mkdirSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync3 } from "node:fs";
319073
319103
  import { homedir as homedir22 } from "node:os";
319074
- import { join as join12 } from "node:path";
319104
+ import { join as join13 } from "node:path";
319075
319105
  import {
319076
319106
  existsSync as existsSync17,
319077
319107
  mkdirSync as mkdirSync11,
@@ -319086,8 +319116,7 @@ import { tmpdir as tmpdir22 } from "node:os";
319086
319116
  import { parseArgs } from "node:util";
319087
319117
  import crypto22 from "node:crypto";
319088
319118
  import { existsSync as existsSync16, readFileSync as readFileSync10, statSync as statSync6 } from "node:fs";
319089
- import { resolve as resolve102, join as join15 } from "node:path";
319090
- import { resolve as resolve11, basename as basename22, join as join16 } from "node:path";
319119
+ import { resolve as resolve11, join as join16 } from "node:path";
319091
319120
  function __extends3(d, b) {
319092
319121
  if (typeof b !== "function" && b !== null)
319093
319122
  throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
@@ -323570,7 +323599,7 @@ async function installDMG2(dmgPath, folderPath) {
323570
323599
  }
323571
323600
  const mountPath = volumes[0];
323572
323601
  try {
323573
- const fileNames = await readdir2(mountPath);
323602
+ const fileNames = await readdir3(mountPath);
323574
323603
  const appName = fileNames.find((item) => {
323575
323604
  return typeof item === "string" && item.endsWith(".app");
323576
323605
  });
@@ -323930,12 +323959,12 @@ function sync_default2(start, callback) {
323930
323959
  let dir = resolve22(".", start);
323931
323960
  let tmp, stats = statSync3(dir);
323932
323961
  if (!stats.isDirectory()) {
323933
- dir = dirname4(dir);
323962
+ dir = dirname5(dir);
323934
323963
  }
323935
323964
  while (true) {
323936
323965
  tmp = callback(dir, readdirSync2(dir));
323937
323966
  if (tmp) return resolve22(dir, tmp);
323938
- dir = dirname4(tmp = dir);
323967
+ dir = dirname5(tmp = dir);
323939
323968
  if (tmp === dir) break;
323940
323969
  }
323941
323970
  }
@@ -326021,10 +326050,10 @@ function compareDocumentPosition(nodeA, nodeB) {
326021
326050
  function uniqueSort(nodes) {
326022
326051
  nodes = nodes.filter((node, i, arr) => !arr.includes(node, i + 1));
326023
326052
  nodes.sort((a, b) => {
326024
- const relative22 = compareDocumentPosition(a, b);
326025
- if (relative22 & DocumentPosition.PRECEDING) {
326053
+ const relative32 = compareDocumentPosition(a, b);
326054
+ if (relative32 & DocumentPosition.PRECEDING) {
326026
326055
  return -1;
326027
- } else if (relative22 & DocumentPosition.FOLLOWING) {
326056
+ } else if (relative32 & DocumentPosition.FOLLOWING) {
326028
326057
  return 1;
326029
326058
  }
326030
326059
  return 0;
@@ -326738,6 +326767,12 @@ function resolveConfig(overrides) {
326738
326767
  "FFMPEG_STREAMING_TIMEOUT_MS",
326739
326768
  DEFAULT_CONFIG.ffmpegStreamingTimeout
326740
326769
  ),
326770
+ hdr: (() => {
326771
+ const raw2 = env22("PRODUCER_HDR_TRANSFER");
326772
+ if (raw2 === "hlg" || raw2 === "pq") return { transfer: raw2 };
326773
+ return void 0;
326774
+ })(),
326775
+ hdrAutoDetect: envBool("PRODUCER_HDR_AUTO_DETECT", DEFAULT_CONFIG.hdrAutoDetect),
326741
326776
  audioGain: envNum("PRODUCER_AUDIO_GAIN", DEFAULT_CONFIG.audioGain),
326742
326777
  frameDataUriCacheLimit: Math.max(
326743
326778
  32,
@@ -326913,7 +326948,8 @@ function buildChromeArgs(options, config22) {
326913
326948
  "--font-render-hinting=none",
326914
326949
  "--force-color-profile=srgb",
326915
326950
  `--window-size=${options.width},${options.height}`,
326916
- // Remotion perf flags — prevent Chrome from throttling background tabs/timers
326951
+ // Prevent Chrome from throttling background tabs/timers — critical when the
326952
+ // page is offscreen during headless capture
326917
326953
  "--disable-background-timer-throttling",
326918
326954
  "--disable-backgrounding-occluded-windows",
326919
326955
  "--disable-renderer-backgrounding",
@@ -327643,6 +327679,81 @@ async function pageScreenshotCapture(page, options) {
327643
327679
  });
327644
327680
  return Buffer.from(result.data, "base64");
327645
327681
  }
327682
+ async function initTransparentBackground(page) {
327683
+ const client = await getCdpSession(page);
327684
+ await client.send("Emulation.setDefaultBackgroundColorOverride", {
327685
+ color: { r: 0, g: 0, b: 0, a: 0 }
327686
+ });
327687
+ await page.evaluate((styleId) => {
327688
+ if (document.getElementById(styleId)) return;
327689
+ const style = document.createElement("style");
327690
+ style.id = styleId;
327691
+ style.textContent = "html,body,[data-composition-id]{background:transparent !important;background-color:transparent !important;background-image:none !important;}";
327692
+ document.head.appendChild(style);
327693
+ }, TRANSPARENT_BG_STYLE_ID);
327694
+ }
327695
+ async function captureAlphaPng(page, width, height) {
327696
+ const client = await getCdpSession(page);
327697
+ const result = await client.send("Page.captureScreenshot", {
327698
+ format: "png",
327699
+ fromSurface: true,
327700
+ captureBeyondViewport: false,
327701
+ optimizeForSpeed: false,
327702
+ // must be false to preserve alpha
327703
+ clip: { x: 0, y: 0, width, height, scale: 1 }
327704
+ });
327705
+ return Buffer.from(result.data, "base64");
327706
+ }
327707
+ async function applyDomLayerMask(page, showIds, extraHideIds) {
327708
+ await page.evaluate(
327709
+ (args) => {
327710
+ const existing = document.getElementById(args.styleId);
327711
+ if (existing) existing.remove();
327712
+ const showSelectors = [];
327713
+ for (const id of args.show) {
327714
+ const escaped = CSS.escape(id);
327715
+ showSelectors.push(`#${escaped}`, `#${escaped} *`);
327716
+ const renderEscaped = CSS.escape(`__render_frame_${id}__`);
327717
+ showSelectors.push(`#${renderEscaped}`, `#${renderEscaped} *`);
327718
+ }
327719
+ const massHideRule = "body *{visibility:hidden !important;}";
327720
+ const showRule = showSelectors.length === 0 ? "" : `${showSelectors.join(",")}{visibility:visible !important;}`;
327721
+ const style = document.createElement("style");
327722
+ style.id = args.styleId;
327723
+ style.textContent = `${massHideRule}
327724
+ ${showRule}`;
327725
+ document.head.appendChild(style);
327726
+ for (const id of args.hide) {
327727
+ const el = document.getElementById(id);
327728
+ if (el) {
327729
+ el.style.setProperty("visibility", "hidden", "important");
327730
+ }
327731
+ const img = document.getElementById(`__render_frame_${id}__`);
327732
+ if (img) {
327733
+ img.style.setProperty("visibility", "hidden", "important");
327734
+ }
327735
+ }
327736
+ },
327737
+ { show: showIds, hide: extraHideIds, styleId: DOM_LAYER_MASK_STYLE_ID }
327738
+ );
327739
+ }
327740
+ async function removeDomLayerMask(page, extraHideIds) {
327741
+ await page.evaluate(
327742
+ (args) => {
327743
+ const style = document.getElementById(args.styleId);
327744
+ if (style) style.remove();
327745
+ for (const id of args.hide) {
327746
+ const el = document.getElementById(id);
327747
+ if (el) {
327748
+ el.style.removeProperty("visibility");
327749
+ }
327750
+ const img = document.getElementById(`__render_frame_${id}__`);
327751
+ if (img) img.style.removeProperty("visibility");
327752
+ }
327753
+ },
327754
+ { hide: extraHideIds, styleId: DOM_LAYER_MASK_STYLE_ID }
327755
+ );
327756
+ }
327646
327757
  async function injectVideoFramesBatch(page, updates) {
327647
327758
  if (updates.length === 0) return;
327648
327759
  await page.evaluate(
@@ -327664,16 +327775,7 @@ async function injectVideoFramesBatch(page, updates) {
327664
327775
  video.parentNode?.insertBefore(img, video.nextSibling);
327665
327776
  }
327666
327777
  if (!img) continue;
327667
- if (!sourceIsStatic) {
327668
- img.style.position = computedStyle.position;
327669
- img.style.width = computedStyle.width;
327670
- img.style.height = computedStyle.height;
327671
- img.style.top = computedStyle.top;
327672
- img.style.left = computedStyle.left;
327673
- img.style.right = computedStyle.right;
327674
- img.style.bottom = computedStyle.bottom;
327675
- img.style.inset = computedStyle.inset;
327676
- } else {
327778
+ {
327677
327779
  const videoRect = video.getBoundingClientRect();
327678
327780
  const offsetLeft = Number.isFinite(video.offsetLeft) ? video.offsetLeft : 0;
327679
327781
  const offsetTop = Number.isFinite(video.offsetTop) ? video.offsetTop : 0;
@@ -327692,6 +327794,7 @@ async function injectVideoFramesBatch(page, updates) {
327692
327794
  img.style.objectPosition = computedStyle.objectPosition;
327693
327795
  img.style.zIndex = computedStyle.zIndex;
327694
327796
  for (const property of visualProperties) {
327797
+ if (property === "opacity") continue;
327695
327798
  if (sourceIsStatic && (property === "top" || property === "left" || property === "right" || property === "bottom" || property === "inset")) {
327696
327799
  continue;
327697
327800
  }
@@ -327724,14 +327827,22 @@ async function syncVideoFrameVisibility(page, activeVideoIds) {
327724
327827
  const active = new Set(ids);
327725
327828
  const videos = Array.from(document.querySelectorAll("video[data-start]"));
327726
327829
  for (const video of videos) {
327727
- if (active.has(video.id)) continue;
327728
- video.style.removeProperty("display");
327729
- video.style.setProperty("visibility", "hidden", "important");
327730
- video.style.setProperty("opacity", "0", "important");
327731
- video.style.setProperty("pointer-events", "none", "important");
327732
327830
  const img = video.nextElementSibling;
327733
- if (img && img.classList.contains("__render_frame__")) {
327734
- img.style.visibility = "hidden";
327831
+ const hasImg = img && img.classList.contains("__render_frame__");
327832
+ if (active.has(video.id)) {
327833
+ video.style.setProperty("visibility", "hidden", "important");
327834
+ video.style.setProperty("pointer-events", "none", "important");
327835
+ if (hasImg) {
327836
+ img.style.visibility = "visible";
327837
+ }
327838
+ } else {
327839
+ video.style.removeProperty("display");
327840
+ video.style.setProperty("visibility", "hidden", "important");
327841
+ video.style.setProperty("opacity", "0", "important");
327842
+ video.style.setProperty("pointer-events", "none", "important");
327843
+ if (hasImg) {
327844
+ img.style.visibility = "hidden";
327845
+ }
327735
327846
  }
327736
327847
  }
327737
327848
  }, activeVideoIds);
@@ -327804,6 +327915,15 @@ function isFontResourceError(type, text, locationUrl) {
327804
327915
  `${locationUrl} ${text}`
327805
327916
  );
327806
327917
  }
327918
+ async function pollPageExpression(page, expression, timeoutMs, intervalMs = 100) {
327919
+ const deadline = Date.now() + timeoutMs;
327920
+ while (Date.now() < deadline) {
327921
+ const ready = Boolean(await page.evaluate(expression));
327922
+ if (ready) return true;
327923
+ await new Promise((resolve132) => setTimeout(resolve132, intervalMs));
327924
+ }
327925
+ return Boolean(await page.evaluate(expression));
327926
+ }
327807
327927
  async function initializeSession(session) {
327808
327928
  const { page, serverUrl } = session;
327809
327929
  page.on("console", (msg) => {
@@ -327833,14 +327953,26 @@ async function initializeSession(session) {
327833
327953
  if (session.captureMode === "screenshot") {
327834
327954
  await page.goto(url, { waitUntil: "domcontentloaded", timeout: 6e4 });
327835
327955
  const pageReadyTimeout2 = session.config?.playerReadyTimeout ?? DEFAULT_CONFIG.playerReadyTimeout;
327836
- await page.waitForFunction(
327956
+ const pageReady2 = await pollPageExpression(
327957
+ page,
327837
327958
  `!!(window.__hf && typeof window.__hf.seek === "function" && window.__hf.duration > 0)`,
327838
- { timeout: pageReadyTimeout2 }
327959
+ pageReadyTimeout2
327839
327960
  );
327840
- await page.waitForFunction(
327961
+ if (!pageReady2) {
327962
+ throw new Error(
327963
+ `[FrameCapture] window.__hf not ready after ${pageReadyTimeout2}ms. Page must expose window.__hf = { duration, seek }.`
327964
+ );
327965
+ }
327966
+ const videosReady = await pollPageExpression(
327967
+ page,
327841
327968
  `document.querySelectorAll("video").length === 0 || Array.from(document.querySelectorAll("video")).every(v => v.readyState >= 1)`,
327842
- { timeout: pageReadyTimeout2 }
327969
+ pageReadyTimeout2
327843
327970
  );
327971
+ if (!videosReady) {
327972
+ throw new Error(
327973
+ `[FrameCapture] video metadata not ready after ${pageReadyTimeout2}ms. Video elements must load metadata before capture starts.`
327974
+ );
327975
+ }
327844
327976
  await page.evaluate(`document.fonts?.ready`);
327845
327977
  session.isInitialized = true;
327846
327978
  return;
@@ -328144,7 +328276,7 @@ async function runFfmpeg(args, opts) {
328144
328276
  });
328145
328277
  });
328146
328278
  }
328147
- function getEncoderPreset(quality, format32 = "mp4") {
328279
+ function getEncoderPreset(quality, format32 = "mp4", hdr) {
328148
328280
  const base = ENCODER_PRESETS[quality];
328149
328281
  if (format32 === "webm") {
328150
328282
  return {
@@ -328162,6 +328294,15 @@ function getEncoderPreset(quality, format32 = "mp4") {
328162
328294
  pixelFormat: "yuva444p10le"
328163
328295
  };
328164
328296
  }
328297
+ if (hdr) {
328298
+ return {
328299
+ preset: base.preset === "ultrafast" ? "fast" : base.preset,
328300
+ quality: base.quality,
328301
+ codec: "h265",
328302
+ pixelFormat: "yuv420p10le",
328303
+ hdr
328304
+ };
328305
+ }
328165
328306
  return { ...base, pixelFormat: "yuv420p" };
328166
328307
  }
328167
328308
  function buildEncoderArgs(options, inputArgs, outputPath, gpuEncoder = null) {
@@ -328219,6 +328360,9 @@ function buildEncoderArgs(options, inputArgs, outputPath, gpuEncoder = null) {
328219
328360
  args.push(xParamsFlag, `aq-mode=3:aq-strength=0.8:deblock=1,1:${colorParams}`);
328220
328361
  }
328221
328362
  }
328363
+ if (codec === "h265") {
328364
+ args.push("-tag:v", "hvc1");
328365
+ }
328222
328366
  } else if (codec === "vp9") {
328223
328367
  args.push("-c:v", "libvpx-vp9", "-b:v", bitrate || "0", "-crf", String(quality));
328224
328368
  args.push("-deadline", preset === "ultrafast" ? "realtime" : "good");
@@ -328261,7 +328405,7 @@ function buildEncoderArgs(options, inputArgs, outputPath, gpuEncoder = null) {
328261
328405
  }
328262
328406
  async function encodeFramesFromDir(framesDir, framePattern, outputPath, options, signal, config22) {
328263
328407
  const startTime = Date.now();
328264
- const outputDir = dirname5(outputPath);
328408
+ const outputDir = dirname52(outputPath);
328265
328409
  if (!existsSync5(outputDir)) mkdirSync2(outputDir, { recursive: true });
328266
328410
  const files = readdirSync3(framesDir).filter((f) => f.match(/\.(jpg|jpeg|png)$/i));
328267
328411
  const frameCount = files.length;
@@ -328360,7 +328504,7 @@ async function encodeFramesChunkedConcat(framesDir, framePattern, outputPath, op
328360
328504
  }
328361
328505
  const chunkSize = Math.max(30, Math.floor(chunkSizeFrames));
328362
328506
  const chunkCount = Math.ceil(files.length / chunkSize);
328363
- const chunkDir = join6(dirname5(outputPath), "chunk-encode");
328507
+ const chunkDir = join6(dirname52(outputPath), "chunk-encode");
328364
328508
  if (!existsSync5(chunkDir)) mkdirSync2(chunkDir, { recursive: true });
328365
328509
  const chunkPaths = [];
328366
328510
  for (let i = 0; i < chunkCount; i++) {
@@ -328467,7 +328611,7 @@ async function encodeFramesChunkedConcat(framesDir, framePattern, outputPath, op
328467
328611
  };
328468
328612
  }
328469
328613
  async function muxVideoWithAudio(videoPath, audioPath, outputPath, signal, config22) {
328470
- const outputDir = dirname5(outputPath);
328614
+ const outputDir = dirname52(outputPath);
328471
328615
  if (!existsSync5(outputDir)) mkdirSync2(outputDir, { recursive: true });
328472
328616
  const isWebm = outputPath.endsWith(".webm");
328473
328617
  const isMov = outputPath.endsWith(".mov");
@@ -328520,31 +328664,75 @@ async function applyFaststart(inputPath, outputPath, signal, config22) {
328520
328664
  error: !result.success ? result.exitCode !== null ? `FFmpeg exited with code ${result.exitCode}` : `[FFmpeg] ${result.stderr}` : void 0
328521
328665
  };
328522
328666
  }
328667
+ function isHdrColorSpace(cs) {
328668
+ if (!cs) return false;
328669
+ return cs.colorPrimaries.includes("bt2020") || cs.colorSpace.includes("bt2020") || cs.colorTransfer === "smpte2084" || cs.colorTransfer === "arib-std-b67";
328670
+ }
328671
+ function detectTransfer(cs) {
328672
+ if (cs?.colorTransfer === "smpte2084") return "pq";
328673
+ return "hlg";
328674
+ }
328675
+ function getHdrEncoderColorParams(transfer, mastering = DEFAULT_HDR10_MASTERING) {
328676
+ const colorTrc = transfer === "pq" ? "smpte2084" : "arib-std-b67";
328677
+ const tagging = `colorprim=bt2020:transfer=${colorTrc}:colormatrix=bt2020nc`;
328678
+ const metadata = `master-display=${mastering.masterDisplay}:max-cll=${mastering.maxCll}`;
328679
+ return {
328680
+ colorPrimaries: "bt2020",
328681
+ colorTrc,
328682
+ colorspace: "bt2020nc",
328683
+ pixelFormat: "yuv420p10le",
328684
+ x265ColorParams: `${tagging}:${metadata}`,
328685
+ mastering
328686
+ };
328687
+ }
328688
+ function analyzeCompositionHdr(colorSpaces) {
328689
+ let hasPq = false;
328690
+ let hasHdr = false;
328691
+ for (const cs of colorSpaces) {
328692
+ if (!isHdrColorSpace(cs)) continue;
328693
+ hasHdr = true;
328694
+ if (cs?.colorTransfer === "smpte2084") hasPq = true;
328695
+ }
328696
+ if (!hasHdr) return { hasHdr: false, dominantTransfer: null };
328697
+ const dominantTransfer = hasPq ? "pq" : "hlg";
328698
+ return { hasHdr: true, dominantTransfer };
328699
+ }
328523
328700
  function createFrameReorderBuffer(startFrame, endFrame) {
328524
- let nextFrame = startFrame;
328525
- let waiters = [];
328526
- const resolveWaiters = () => {
328527
- for (const waiter of waiters.slice()) {
328528
- if (waiter.frame === nextFrame) {
328529
- waiter.resolve();
328530
- waiters = waiters.filter((w) => w !== waiter);
328531
- }
328701
+ let cursor = startFrame;
328702
+ const pending = /* @__PURE__ */ new Map();
328703
+ const enqueueAt = (frame, resolve132) => {
328704
+ const list2 = pending.get(frame);
328705
+ if (list2 === void 0) {
328706
+ pending.set(frame, [resolve132]);
328707
+ } else {
328708
+ list2.push(resolve132);
328532
328709
  }
328533
328710
  };
328534
- return {
328535
- waitForFrame: (frame) => new Promise((resolve132) => {
328536
- waiters.push({ frame, resolve: resolve132 });
328537
- resolveWaiters();
328538
- }),
328539
- advanceTo: (frame) => {
328540
- nextFrame = frame;
328541
- resolveWaiters();
328542
- },
328543
- waitForAllDone: () => new Promise((resolve132) => {
328544
- waiters.push({ frame: endFrame, resolve: resolve132 });
328545
- resolveWaiters();
328546
- })
328711
+ const flushAt = (frame) => {
328712
+ const list2 = pending.get(frame);
328713
+ if (list2 === void 0) return;
328714
+ pending.delete(frame);
328715
+ for (const resolve132 of list2) resolve132();
328716
+ };
328717
+ const waitForFrame = (frame) => new Promise((resolve132) => {
328718
+ if (frame === cursor) {
328719
+ resolve132();
328720
+ return;
328721
+ }
328722
+ enqueueAt(frame, resolve132);
328723
+ });
328724
+ const advanceTo = (frame) => {
328725
+ cursor = frame;
328726
+ flushAt(frame);
328547
328727
  };
328728
+ const waitForAllDone = () => new Promise((resolve132) => {
328729
+ if (cursor >= endFrame) {
328730
+ resolve132();
328731
+ return;
328732
+ }
328733
+ enqueueAt(endFrame, resolve132);
328734
+ });
328735
+ return { waitForFrame, advanceTo, waitForAllDone };
328548
328736
  }
328549
328737
  function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
328550
328738
  const {
@@ -328557,19 +328745,36 @@ function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
328557
328745
  useGpu = false,
328558
328746
  imageFormat = "jpeg"
328559
328747
  } = options;
328560
- const inputCodec = imageFormat === "png" ? "png" : "mjpeg";
328561
- const args = [
328562
- "-f",
328563
- "image2pipe",
328564
- "-vcodec",
328565
- inputCodec,
328566
- "-framerate",
328567
- String(fps),
328568
- "-i",
328569
- "-",
328570
- "-r",
328571
- String(fps)
328572
- ];
328748
+ const args = [];
328749
+ if (options.rawInputFormat) {
328750
+ const hdrTransfer = options.hdr?.transfer;
328751
+ const inputColorTrc = hdrTransfer === "pq" ? "smpte2084" : hdrTransfer === "hlg" ? "arib-std-b67" : void 0;
328752
+ args.push(
328753
+ "-f",
328754
+ "rawvideo",
328755
+ "-pix_fmt",
328756
+ options.rawInputFormat,
328757
+ "-s",
328758
+ `${options.width}x${options.height}`,
328759
+ "-framerate",
328760
+ String(fps)
328761
+ );
328762
+ if (inputColorTrc) {
328763
+ args.push(
328764
+ "-color_primaries",
328765
+ "bt2020",
328766
+ "-color_trc",
328767
+ inputColorTrc,
328768
+ "-colorspace",
328769
+ "bt2020nc"
328770
+ );
328771
+ }
328772
+ args.push("-i", "-");
328773
+ } else {
328774
+ const inputCodec = imageFormat === "png" ? "png" : "mjpeg";
328775
+ args.push("-f", "image2pipe", "-vcodec", inputCodec, "-framerate", String(fps), "-i", "-");
328776
+ }
328777
+ args.push("-r", String(fps));
328573
328778
  const shouldUseGpu = useGpu && gpuEncoder !== null;
328574
328779
  if (codec === "h264" || codec === "h265") {
328575
328780
  if (shouldUseGpu) {
@@ -328607,12 +328812,15 @@ function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
328607
328812
  if (bitrate) args.push("-b:v", bitrate);
328608
328813
  else args.push("-crf", String(quality));
328609
328814
  const xParamsFlag = codec === "h264" ? "-x264-params" : "-x265-params";
328610
- const colorParams = "colorprim=bt709:transfer=bt709:colormatrix=bt709";
328815
+ const colorParams = options.rawInputFormat && options.hdr ? getHdrEncoderColorParams(options.hdr.transfer).x265ColorParams : "colorprim=bt709:transfer=bt709:colormatrix=bt709";
328611
328816
  if (preset === "ultrafast") {
328612
328817
  args.push(xParamsFlag, `aq-mode=3:${colorParams}`);
328613
328818
  } else {
328614
328819
  args.push(xParamsFlag, `aq-mode=3:aq-strength=0.8:deblock=1,1:${colorParams}`);
328615
328820
  }
328821
+ if (codec === "h265") {
328822
+ args.push("-tag:v", "hvc1");
328823
+ }
328616
328824
  }
328617
328825
  } else if (codec === "vp9") {
328618
328826
  args.push("-c:v", "libvpx-vp9", "-b:v", bitrate || "0", "-crf", String(quality));
@@ -328628,17 +328836,31 @@ function buildStreamingArgs(options, outputPath, gpuEncoder = null) {
328628
328836
  return [...args, "-y", outputPath];
328629
328837
  }
328630
328838
  if (codec === "h264" || codec === "h265") {
328631
- args.push(
328632
- "-colorspace:v",
328633
- "bt709",
328634
- "-color_primaries:v",
328635
- "bt709",
328636
- "-color_trc:v",
328637
- "bt709",
328638
- "-color_range",
328639
- "tv"
328640
- );
328641
- if (gpuEncoder === "vaapi") {
328839
+ if (options.rawInputFormat && options.hdr) {
328840
+ args.push(
328841
+ "-colorspace:v",
328842
+ "bt2020nc",
328843
+ "-color_primaries:v",
328844
+ "bt2020",
328845
+ "-color_trc:v",
328846
+ options.hdr.transfer === "pq" ? "smpte2084" : "arib-std-b67",
328847
+ "-color_range",
328848
+ "tv"
328849
+ );
328850
+ } else {
328851
+ args.push(
328852
+ "-colorspace:v",
328853
+ "bt709",
328854
+ "-color_primaries:v",
328855
+ "bt709",
328856
+ "-color_trc:v",
328857
+ "bt709",
328858
+ "-color_range",
328859
+ "tv"
328860
+ );
328861
+ }
328862
+ if (options.rawInputFormat) {
328863
+ } else if (gpuEncoder === "vaapi") {
328642
328864
  const vfIdx = args.indexOf("-vf");
328643
328865
  if (vfIdx !== -1) {
328644
328866
  args[vfIdx + 1] = `scale=in_range=pc:out_range=tv,${args[vfIdx + 1]}`;
@@ -328708,14 +328930,16 @@ Process error: ${err.message}`;
328708
328930
  if (exitStatus !== "running" || !ffmpeg.stdin || ffmpeg.stdin.destroyed) {
328709
328931
  return false;
328710
328932
  }
328711
- return ffmpeg.stdin.write(buffer);
328933
+ const copy = Buffer.from(buffer);
328934
+ return ffmpeg.stdin.write(copy);
328712
328935
  },
328713
328936
  close: async () => {
328714
328937
  clearTimeout(timer22);
328715
328938
  if (signal) signal.removeEventListener("abort", onAbort);
328716
- if (ffmpeg.stdin && !ffmpeg.stdin.destroyed) {
328939
+ const stdin = ffmpeg.stdin;
328940
+ if (stdin && !stdin.destroyed) {
328717
328941
  await new Promise((resolve132) => {
328718
- ffmpeg.stdin.end(() => resolve132());
328942
+ stdin.end(() => resolve132());
328719
328943
  });
328720
328944
  }
328721
328945
  await exitPromise;
@@ -328809,6 +329033,10 @@ async function extractVideoMetadata(filePath) {
328809
329033
  const avgFps = parseFrameRate(videoStream.avg_frame_rate);
328810
329034
  const fps = avgFps || rFps;
328811
329035
  const isVFR = rFps > 0 && avgFps > 0 && Math.abs(rFps - avgFps) / Math.max(rFps, avgFps) > 0.1;
329036
+ const colorTransfer = videoStream.color_transfer || "";
329037
+ const colorPrimaries = videoStream.color_primaries || "";
329038
+ const colorSpaceVal = videoStream.color_space || "";
329039
+ const hasColorInfo = !!(colorTransfer || colorPrimaries || colorSpaceVal);
328812
329040
  return {
328813
329041
  durationSeconds: output22.format.duration ? parseFloat(output22.format.duration) : 0,
328814
329042
  width: videoStream.width || 0,
@@ -328816,7 +329044,8 @@ async function extractVideoMetadata(filePath) {
328816
329044
  fps,
328817
329045
  videoCodec: videoStream.codec_name || "unknown",
328818
329046
  hasAudio: output22.streams.some((s) => s.codec_type === "audio"),
328819
- isVFR
329047
+ isVFR,
329048
+ colorSpace: hasColorInfo ? { colorTransfer, colorPrimaries, colorSpace: colorSpaceVal } : null
328820
329049
  };
328821
329050
  })();
328822
329051
  videoMetadataCache.set(filePath, probePromise);
@@ -328911,10 +329140,10 @@ async function analyzeKeyframeIntervalsUncached(filePath) {
328911
329140
  };
328912
329141
  }
328913
329142
  function getFilenameFromUrl(url) {
328914
- const hash = createHash("md5").update(url).digest("hex").slice(0, 12);
329143
+ const hash2 = createHash("md5").update(url).digest("hex").slice(0, 12);
328915
329144
  const urlObj = new URL(url);
328916
329145
  const ext = extname22(urlObj.pathname) || ".mp4";
328917
- return `download_${hash}${ext}`;
329146
+ return `download_${hash2}${ext}`;
328918
329147
  }
328919
329148
  async function downloadToTemp(url, destDir, timeoutMs = 3e5) {
328920
329149
  const cachedPath = downloadPathCache.get(url);
@@ -329012,18 +329241,20 @@ async function extractVideoFramesRange(videoPath, videoId, startTime, duration,
329012
329241
  const metadata = await extractVideoMetadata(videoPath);
329013
329242
  const framePattern = `frame_%05d.${format32}`;
329014
329243
  const outputPattern = join8(videoOutputDir, framePattern);
329015
- const args = [
329016
- "-ss",
329017
- String(startTime),
329018
- "-i",
329019
- videoPath,
329020
- "-t",
329021
- String(duration),
329022
- "-vf",
329023
- `fps=${fps}`,
329024
- "-q:v",
329025
- format32 === "jpg" ? String(Math.ceil((100 - quality) / 3)) : "0"
329026
- ];
329244
+ const isHdr = isHdrColorSpace(metadata.colorSpace);
329245
+ const isMacOS = process.platform === "darwin";
329246
+ const args = [];
329247
+ if (isHdr && isMacOS) {
329248
+ args.push("-hwaccel", "videotoolbox");
329249
+ }
329250
+ args.push("-ss", String(startTime), "-i", videoPath, "-t", String(duration));
329251
+ const vfFilters = [];
329252
+ if (isHdr && isMacOS) {
329253
+ vfFilters.push("format=nv12");
329254
+ }
329255
+ vfFilters.push(`fps=${fps}`);
329256
+ args.push("-vf", vfFilters.join(","));
329257
+ args.push("-q:v", format32 === "jpg" ? String(Math.ceil((100 - quality) / 3)) : "0");
329027
329258
  if (format32 === "png") args.push("-compression_level", "6");
329028
329259
  args.push("-y", outputPattern);
329029
329260
  return new Promise((resolve132, reject) => {
@@ -329083,30 +329314,100 @@ async function extractVideoFramesRange(videoPath, videoId, startTime, duration,
329083
329314
  });
329084
329315
  });
329085
329316
  }
329317
+ async function convertSdrToHdr(inputPath, outputPath, signal, config22) {
329318
+ const timeout22 = config22?.ffmpegProcessTimeout ?? DEFAULT_CONFIG.ffmpegProcessTimeout;
329319
+ const args = [
329320
+ "-i",
329321
+ inputPath,
329322
+ "-vf",
329323
+ "colorspace=all=bt2020:iall=bt709:range=tv",
329324
+ "-color_primaries",
329325
+ "bt2020",
329326
+ "-color_trc",
329327
+ "arib-std-b67",
329328
+ "-colorspace",
329329
+ "bt2020nc",
329330
+ "-c:v",
329331
+ "libx264",
329332
+ "-preset",
329333
+ "fast",
329334
+ "-crf",
329335
+ "16",
329336
+ "-c:a",
329337
+ "copy",
329338
+ "-y",
329339
+ outputPath
329340
+ ];
329341
+ const result = await runFfmpeg(args, { signal, timeout: timeout22 });
329342
+ if (!result.success) {
329343
+ throw new Error(
329344
+ `SDR\u2192HDR conversion failed (exit ${result.exitCode}): ${result.stderr.slice(-300)}`
329345
+ );
329346
+ }
329347
+ }
329086
329348
  async function extractAllVideoFrames(videos, baseDir, options, signal, config22, compiledDir) {
329087
329349
  const startTime = Date.now();
329088
329350
  const extracted = [];
329089
329351
  const errors = [];
329090
329352
  let totalFramesExtracted = 0;
329353
+ const resolvedVideos = [];
329354
+ for (const video of videos) {
329355
+ if (signal?.aborted) break;
329356
+ try {
329357
+ let videoPath = video.src;
329358
+ if (!videoPath.startsWith("/") && !isHttpUrl(videoPath)) {
329359
+ const fromCompiled = compiledDir ? join8(compiledDir, videoPath) : null;
329360
+ videoPath = fromCompiled && existsSync8(fromCompiled) ? fromCompiled : join8(baseDir, videoPath);
329361
+ }
329362
+ if (isHttpUrl(videoPath)) {
329363
+ const downloadDir = join8(options.outputDir, "_downloads");
329364
+ mkdirSync5(downloadDir, { recursive: true });
329365
+ videoPath = await downloadToTemp(videoPath, downloadDir);
329366
+ }
329367
+ if (!existsSync8(videoPath)) {
329368
+ errors.push({ videoId: video.id, error: `Video file not found: ${videoPath}` });
329369
+ continue;
329370
+ }
329371
+ resolvedVideos.push({ video, videoPath });
329372
+ } catch (err) {
329373
+ errors.push({ videoId: video.id, error: err instanceof Error ? err.message : String(err) });
329374
+ }
329375
+ }
329376
+ const videoColorSpaces = await Promise.all(
329377
+ resolvedVideos.map(async ({ videoPath }) => {
329378
+ const metadata = await extractVideoMetadata(videoPath);
329379
+ return metadata.colorSpace;
329380
+ })
329381
+ );
329382
+ const hasAnyHdr = videoColorSpaces.some(isHdrColorSpace);
329383
+ if (hasAnyHdr) {
329384
+ const convertDir = join8(options.outputDir, "_hdr_normalized");
329385
+ mkdirSync5(convertDir, { recursive: true });
329386
+ for (let i = 0; i < resolvedVideos.length; i++) {
329387
+ if (signal?.aborted) break;
329388
+ const cs = videoColorSpaces[i] ?? null;
329389
+ if (!isHdrColorSpace(cs)) {
329390
+ const entry = resolvedVideos[i];
329391
+ if (!entry) continue;
329392
+ const convertedPath = join8(convertDir, `${entry.video.id}_hdr.mp4`);
329393
+ try {
329394
+ await convertSdrToHdr(entry.videoPath, convertedPath, signal, config22);
329395
+ entry.videoPath = convertedPath;
329396
+ } catch (err) {
329397
+ errors.push({
329398
+ videoId: entry.video.id,
329399
+ error: `SDR\u2192HDR conversion failed: ${err instanceof Error ? err.message : String(err)}`
329400
+ });
329401
+ }
329402
+ }
329403
+ }
329404
+ }
329091
329405
  const results = await Promise.all(
329092
- videos.map(async (video) => {
329406
+ resolvedVideos.map(async ({ video, videoPath }) => {
329093
329407
  if (signal?.aborted) {
329094
329408
  throw new Error("Video frame extraction cancelled");
329095
329409
  }
329096
329410
  try {
329097
- let videoPath = video.src;
329098
- if (!videoPath.startsWith("/") && !isHttpUrl(videoPath)) {
329099
- const fromCompiled = compiledDir ? join8(compiledDir, videoPath) : null;
329100
- videoPath = fromCompiled && existsSync8(fromCompiled) ? fromCompiled : join8(baseDir, videoPath);
329101
- }
329102
- if (isHttpUrl(videoPath)) {
329103
- const downloadDir = join8(options.outputDir, "_downloads");
329104
- mkdirSync5(downloadDir, { recursive: true });
329105
- videoPath = await downloadToTemp(videoPath, downloadDir);
329106
- }
329107
- if (!existsSync8(videoPath)) {
329108
- return { error: { videoId: video.id, error: `Video file not found: ${videoPath}` } };
329109
- }
329110
329411
  let videoDuration = video.end - video.start;
329111
329412
  if (!Number.isFinite(videoDuration) || videoDuration <= 0) {
329112
329413
  const metadata = await extractVideoMetadata(videoPath);
@@ -329246,6 +329547,142 @@ function createVideoFrameInjector(frameLookup, config22) {
329246
329547
  }
329247
329548
  };
329248
329549
  }
329550
+ async function queryElementStacking(page, nativeHdrVideoIds) {
329551
+ const hdrIds = Array.from(nativeHdrVideoIds);
329552
+ return page.evaluate((hdrIdList) => {
329553
+ const hdrSet = new Set(hdrIdList);
329554
+ const elements = document.querySelectorAll("[data-start]");
329555
+ const results = [];
329556
+ function getEffectiveZIndex(node) {
329557
+ let current = node;
329558
+ while (current) {
329559
+ const cs = window.getComputedStyle(current);
329560
+ const pos = cs.position;
329561
+ const z = parseInt(cs.zIndex);
329562
+ if (!Number.isNaN(z) && pos !== "static") return z;
329563
+ current = current.parentElement;
329564
+ }
329565
+ return 0;
329566
+ }
329567
+ function getEffectiveBorderRadius(node) {
329568
+ function resolveRadius(value, el) {
329569
+ if (value.includes("%")) {
329570
+ const pct = parseFloat(value) / 100;
329571
+ const htmlEl = el;
329572
+ const w = htmlEl.offsetWidth || 0;
329573
+ const h = htmlEl.offsetHeight || 0;
329574
+ return pct * Math.min(w, h);
329575
+ }
329576
+ return parseFloat(value) || 0;
329577
+ }
329578
+ const selfCs = window.getComputedStyle(node);
329579
+ const selfRadii = [
329580
+ resolveRadius(selfCs.borderTopLeftRadius, node),
329581
+ resolveRadius(selfCs.borderTopRightRadius, node),
329582
+ resolveRadius(selfCs.borderBottomRightRadius, node),
329583
+ resolveRadius(selfCs.borderBottomLeftRadius, node)
329584
+ ];
329585
+ if (selfRadii[0] > 0 || selfRadii[1] > 0 || selfRadii[2] > 0 || selfRadii[3] > 0) {
329586
+ return selfRadii;
329587
+ }
329588
+ let current = node.parentElement;
329589
+ while (current) {
329590
+ const cs = window.getComputedStyle(current);
329591
+ if (cs.overflow !== "visible") {
329592
+ const tl = resolveRadius(cs.borderTopLeftRadius, current);
329593
+ const tr = resolveRadius(cs.borderTopRightRadius, current);
329594
+ const brr = resolveRadius(cs.borderBottomRightRadius, current);
329595
+ const bl = resolveRadius(cs.borderBottomLeftRadius, current);
329596
+ if (tl > 0 || tr > 0 || brr > 0 || bl > 0) {
329597
+ return [tl, tr, brr, bl];
329598
+ }
329599
+ }
329600
+ current = current.parentElement;
329601
+ }
329602
+ return [0, 0, 0, 0];
329603
+ }
329604
+ function getEffectiveOpacity(node) {
329605
+ let opacity = 1;
329606
+ let current = node;
329607
+ while (current) {
329608
+ const cs = window.getComputedStyle(current);
329609
+ const val = parseFloat(cs.opacity);
329610
+ opacity *= Number.isNaN(val) ? 1 : val;
329611
+ current = current.parentElement;
329612
+ }
329613
+ return opacity;
329614
+ }
329615
+ function getViewportMatrix(node) {
329616
+ const chain = [];
329617
+ let current = node;
329618
+ while (current instanceof HTMLElement) {
329619
+ chain.push(current);
329620
+ const next = current.offsetParent ?? current.parentElement;
329621
+ if (next === current) break;
329622
+ current = next;
329623
+ }
329624
+ let mat = new DOMMatrix();
329625
+ for (let i = chain.length - 1; i >= 0; i--) {
329626
+ const htmlEl = chain[i];
329627
+ if (!htmlEl) continue;
329628
+ mat = mat.translate(htmlEl.offsetLeft, htmlEl.offsetTop);
329629
+ const cs = window.getComputedStyle(htmlEl);
329630
+ if (cs.transform && cs.transform !== "none") {
329631
+ const origin = cs.transformOrigin.split(" ");
329632
+ const ox = resolveLength(origin[0] ?? "0", htmlEl.offsetWidth);
329633
+ const oy = resolveLength(origin[1] ?? "0", htmlEl.offsetHeight);
329634
+ try {
329635
+ const t = new DOMMatrix(cs.transform);
329636
+ if (Number.isFinite(t.a) && Number.isFinite(t.b) && Number.isFinite(t.c) && Number.isFinite(t.d) && Number.isFinite(t.e) && Number.isFinite(t.f)) {
329637
+ mat = mat.translate(ox, oy).multiply(t).translate(-ox, -oy);
329638
+ }
329639
+ } catch {
329640
+ }
329641
+ }
329642
+ }
329643
+ return mat.toString();
329644
+ }
329645
+ function resolveLength(value, basis) {
329646
+ if (value.endsWith("%")) {
329647
+ const pct = parseFloat(value) / 100;
329648
+ return Number.isFinite(pct) ? pct * basis : 0;
329649
+ }
329650
+ const n = parseFloat(value);
329651
+ return Number.isFinite(n) ? n : 0;
329652
+ }
329653
+ for (const el of elements) {
329654
+ const id = el.id;
329655
+ if (!id) continue;
329656
+ const rect = el.getBoundingClientRect();
329657
+ const style = window.getComputedStyle(el);
329658
+ const zIndex = getEffectiveZIndex(el);
329659
+ const isHdrEl = hdrSet.has(id);
329660
+ const opacityStartNode = isHdrEl ? el.parentElement : el;
329661
+ const opacity = opacityStartNode ? getEffectiveOpacity(opacityStartNode) : 1;
329662
+ const visible = style.visibility !== "hidden" && style.display !== "none" && rect.width > 0 && rect.height > 0;
329663
+ const htmlEl = el instanceof HTMLElement ? el : null;
329664
+ results.push({
329665
+ id,
329666
+ zIndex,
329667
+ x: Math.round(rect.x),
329668
+ y: Math.round(rect.y),
329669
+ width: Math.round(rect.width),
329670
+ height: Math.round(rect.height),
329671
+ layoutWidth: htmlEl?.offsetWidth || Math.round(rect.width),
329672
+ layoutHeight: htmlEl?.offsetHeight || Math.round(rect.height),
329673
+ opacity,
329674
+ visible,
329675
+ isHdr: hdrSet.has(id),
329676
+ // For HDR elements, use the full accumulated viewport matrix so the
329677
+ // affine blit can apply rotation/scale/translate properly. For DOM
329678
+ // elements, the element-level transform is sufficient for reference.
329679
+ transform: isHdrEl ? getViewportMatrix(el) : style.transform || "none",
329680
+ borderRadius: isHdrEl ? getEffectiveBorderRadius(el) : [0, 0, 0, 0]
329681
+ });
329682
+ }
329683
+ return results;
329684
+ }, hdrIds);
329685
+ }
329249
329686
  function parseAudioElements(html) {
329250
329687
  const elements = [];
329251
329688
  const { document: document22 } = parseHTML(html);
@@ -329905,6 +330342,530 @@ function writeFromReadableStream(stream2, writable) {
329905
330342
  }
329906
330343
  return writeFromReadableStreamDefaultReader(stream2.getReader(), writable);
329907
330344
  }
330345
+ function paeth(a, b, c) {
330346
+ const p = a + b - c;
330347
+ const pa = Math.abs(p - a);
330348
+ const pb = Math.abs(p - b);
330349
+ const pc = Math.abs(p - c);
330350
+ if (pa <= pb && pa <= pc) return a;
330351
+ if (pb <= pc) return b;
330352
+ return c;
330353
+ }
330354
+ function decodePngRaw(buf, caller) {
330355
+ if (buf[0] !== 137 || buf[1] !== 80 || buf[2] !== 78 || buf[3] !== 71 || buf[4] !== 13 || buf[5] !== 10 || buf[6] !== 26 || buf[7] !== 10) {
330356
+ throw new Error(`${caller}: not a PNG file`);
330357
+ }
330358
+ let pos = 8;
330359
+ let width = 0;
330360
+ let height = 0;
330361
+ let bitDepth = 0;
330362
+ let colorType = 0;
330363
+ let interlace = 0;
330364
+ let sawIhdr = false;
330365
+ const idatChunks = [];
330366
+ while (pos + 12 <= buf.length) {
330367
+ const chunkLen = buf.readUInt32BE(pos);
330368
+ const chunkType = buf.toString("ascii", pos + 4, pos + 8);
330369
+ const chunkData = buf.subarray(pos + 8, pos + 8 + chunkLen);
330370
+ if (chunkType === "IHDR") {
330371
+ width = chunkData.readUInt32BE(0);
330372
+ height = chunkData.readUInt32BE(4);
330373
+ bitDepth = chunkData[8] ?? 0;
330374
+ colorType = chunkData[9] ?? 0;
330375
+ interlace = chunkData[12] ?? 0;
330376
+ sawIhdr = true;
330377
+ } else if (chunkType === "IDAT") {
330378
+ idatChunks.push(Buffer.from(chunkData));
330379
+ } else if (chunkType === "IEND") {
330380
+ break;
330381
+ }
330382
+ pos += 12 + chunkLen;
330383
+ }
330384
+ if (!sawIhdr) {
330385
+ throw new Error(`${caller}: PNG missing IHDR chunk`);
330386
+ }
330387
+ if (colorType !== 2 && colorType !== 6) {
330388
+ throw new Error(`${caller}: unsupported color type ${colorType} (expected 2=RGB or 6=RGBA)`);
330389
+ }
330390
+ if (interlace !== 0) {
330391
+ throw new Error(
330392
+ `${caller}: Adam7-interlaced PNGs are not supported (interlace method ${interlace})`
330393
+ );
330394
+ }
330395
+ const channels = colorType === 6 ? 4 : 3;
330396
+ const bpp = channels * (bitDepth / 8);
330397
+ const stride = width * bpp;
330398
+ const compressed = Buffer.concat(idatChunks);
330399
+ const decompressed = inflateSync(compressed);
330400
+ const rawPixels = Buffer.allocUnsafe(height * stride);
330401
+ const prevRow = new Uint8Array(stride);
330402
+ const currRow = new Uint8Array(stride);
330403
+ let srcPos = 0;
330404
+ for (let y = 0; y < height; y++) {
330405
+ const filterType = decompressed[srcPos++] ?? 0;
330406
+ const rawRow = decompressed.subarray(srcPos, srcPos + stride);
330407
+ srcPos += stride;
330408
+ switch (filterType) {
330409
+ case 0:
330410
+ currRow.set(rawRow);
330411
+ break;
330412
+ case 1:
330413
+ for (let x = 0; x < stride; x++) {
330414
+ currRow[x] = (rawRow[x] ?? 0) + (x >= bpp ? currRow[x - bpp] ?? 0 : 0) & 255;
330415
+ }
330416
+ break;
330417
+ case 2:
330418
+ for (let x = 0; x < stride; x++) {
330419
+ currRow[x] = (rawRow[x] ?? 0) + (prevRow[x] ?? 0) & 255;
330420
+ }
330421
+ break;
330422
+ case 3:
330423
+ for (let x = 0; x < stride; x++) {
330424
+ const left22 = x >= bpp ? currRow[x - bpp] ?? 0 : 0;
330425
+ const up = prevRow[x] ?? 0;
330426
+ currRow[x] = (rawRow[x] ?? 0) + Math.floor((left22 + up) / 2) & 255;
330427
+ }
330428
+ break;
330429
+ case 4:
330430
+ for (let x = 0; x < stride; x++) {
330431
+ const left22 = x >= bpp ? currRow[x - bpp] ?? 0 : 0;
330432
+ const up = prevRow[x] ?? 0;
330433
+ const upLeft = x >= bpp ? prevRow[x - bpp] ?? 0 : 0;
330434
+ currRow[x] = (rawRow[x] ?? 0) + paeth(left22, up, upLeft) & 255;
330435
+ }
330436
+ break;
330437
+ default:
330438
+ throw new Error(`${caller}: unknown filter type ${filterType} at row ${y}`);
330439
+ }
330440
+ rawPixels.set(currRow, y * stride);
330441
+ prevRow.set(currRow);
330442
+ }
330443
+ return { width, height, bitDepth, colorType, rawPixels };
330444
+ }
330445
+ function decodePng(buf) {
330446
+ const { width, height, bitDepth, colorType, rawPixels } = decodePngRaw(buf, "decodePng");
330447
+ if (bitDepth !== 8) {
330448
+ throw new Error(`decodePng: unsupported bit depth ${bitDepth} (expected 8)`);
330449
+ }
330450
+ const output22 = new Uint8Array(width * height * 4);
330451
+ if (colorType === 6) {
330452
+ output22.set(rawPixels);
330453
+ } else {
330454
+ for (let i = 0; i < width * height; i++) {
330455
+ output22[i * 4 + 0] = rawPixels[i * 3 + 0] ?? 0;
330456
+ output22[i * 4 + 1] = rawPixels[i * 3 + 1] ?? 0;
330457
+ output22[i * 4 + 2] = rawPixels[i * 3 + 2] ?? 0;
330458
+ output22[i * 4 + 3] = 255;
330459
+ }
330460
+ }
330461
+ return { width, height, data: output22 };
330462
+ }
330463
+ function decodePngToRgb48le(buf) {
330464
+ const { width, height, bitDepth, colorType, rawPixels } = decodePngRaw(buf, "decodePngToRgb48le");
330465
+ if (bitDepth !== 16) {
330466
+ throw new Error(`decodePngToRgb48le: unsupported bit depth ${bitDepth} (expected 16)`);
330467
+ }
330468
+ const bpp = colorType === 6 ? 8 : 6;
330469
+ const output22 = Buffer.allocUnsafe(width * height * 6);
330470
+ for (let y = 0; y < height; y++) {
330471
+ const dstBase = y * width * 6;
330472
+ const srcRowBase = y * width * bpp;
330473
+ for (let x = 0; x < width; x++) {
330474
+ const srcBase = srcRowBase + x * bpp;
330475
+ output22[dstBase + x * 6 + 0] = rawPixels[srcBase + 1] ?? 0;
330476
+ output22[dstBase + x * 6 + 1] = rawPixels[srcBase + 0] ?? 0;
330477
+ output22[dstBase + x * 6 + 2] = rawPixels[srcBase + 3] ?? 0;
330478
+ output22[dstBase + x * 6 + 3] = rawPixels[srcBase + 2] ?? 0;
330479
+ output22[dstBase + x * 6 + 4] = rawPixels[srcBase + 5] ?? 0;
330480
+ output22[dstBase + x * 6 + 5] = rawPixels[srcBase + 4] ?? 0;
330481
+ }
330482
+ }
330483
+ return { width, height, data: output22 };
330484
+ }
330485
+ function buildSrgbToHdrLut(transfer) {
330486
+ const lut = new Uint16Array(256);
330487
+ const hlgA = 0.17883277;
330488
+ const hlgB = 1 - 4 * hlgA;
330489
+ const hlgC = 0.5 - hlgA * Math.log(4 * hlgA);
330490
+ const pqM1 = 0.1593017578125;
330491
+ const pqM2 = 78.84375;
330492
+ const pqC1 = 0.8359375;
330493
+ const pqC2 = 18.8515625;
330494
+ const pqC3 = 18.6875;
330495
+ const pqMaxNits = 1e4;
330496
+ const sdrNits = 203;
330497
+ for (let i = 0; i < 256; i++) {
330498
+ const v = i / 255;
330499
+ const linear = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
330500
+ let signal;
330501
+ if (transfer === "hlg") {
330502
+ signal = linear <= 1 / 12 ? Math.sqrt(3 * linear) : hlgA * Math.log(12 * linear - hlgB) + hlgC;
330503
+ } else {
330504
+ const Lp = Math.max(0, linear * sdrNits / pqMaxNits);
330505
+ const Lm1 = Math.pow(Lp, pqM1);
330506
+ signal = Math.pow((pqC1 + pqC2 * Lm1) / (1 + pqC3 * Lm1), pqM2);
330507
+ }
330508
+ lut[i] = Math.min(65535, Math.round(signal * 65535));
330509
+ }
330510
+ return lut;
330511
+ }
330512
+ function getSrgbToHdrLut(transfer) {
330513
+ return transfer === "pq" ? SRGB_TO_PQ : SRGB_TO_HLG;
330514
+ }
330515
+ function blitRgba8OverRgb48le(domRgba, canvas, width, height, transfer = "hlg") {
330516
+ const pixelCount = width * height;
330517
+ const lut = getSrgbToHdrLut(transfer);
330518
+ for (let i = 0; i < pixelCount; i++) {
330519
+ const da = domRgba[i * 4 + 3] ?? 0;
330520
+ if (da === 0) {
330521
+ continue;
330522
+ } else if (da === 255) {
330523
+ const r16 = lut[domRgba[i * 4 + 0] ?? 0] ?? 0;
330524
+ const g16 = lut[domRgba[i * 4 + 1] ?? 0] ?? 0;
330525
+ const b16 = lut[domRgba[i * 4 + 2] ?? 0] ?? 0;
330526
+ canvas.writeUInt16LE(r16, i * 6);
330527
+ canvas.writeUInt16LE(g16, i * 6 + 2);
330528
+ canvas.writeUInt16LE(b16, i * 6 + 4);
330529
+ } else {
330530
+ const alpha = da / 255;
330531
+ const invAlpha = 1 - alpha;
330532
+ const hdrR = (canvas[i * 6 + 0] ?? 0) | (canvas[i * 6 + 1] ?? 0) << 8;
330533
+ const hdrG = (canvas[i * 6 + 2] ?? 0) | (canvas[i * 6 + 3] ?? 0) << 8;
330534
+ const hdrB = (canvas[i * 6 + 4] ?? 0) | (canvas[i * 6 + 5] ?? 0) << 8;
330535
+ const domR = lut[domRgba[i * 4 + 0] ?? 0] ?? 0;
330536
+ const domG = lut[domRgba[i * 4 + 1] ?? 0] ?? 0;
330537
+ const domB = lut[domRgba[i * 4 + 2] ?? 0] ?? 0;
330538
+ canvas.writeUInt16LE(Math.round(domR * alpha + hdrR * invAlpha), i * 6);
330539
+ canvas.writeUInt16LE(Math.round(domG * alpha + hdrG * invAlpha), i * 6 + 2);
330540
+ canvas.writeUInt16LE(Math.round(domB * alpha + hdrB * invAlpha), i * 6 + 4);
330541
+ }
330542
+ }
330543
+ }
330544
+ function cornerAlpha(px, py, cx, cy, r) {
330545
+ const dx = px - cx;
330546
+ const dy = py - cy;
330547
+ const dist = Math.sqrt(dx * dx + dy * dy);
330548
+ if (dist > r + 0.5) return 0;
330549
+ if (dist > r - 0.5) return r + 0.5 - dist;
330550
+ return 1;
330551
+ }
330552
+ function roundedRectAlpha(px, py, w, h, radii) {
330553
+ const [tl, tr, br, bl] = radii;
330554
+ if (px < tl && py < tl) return cornerAlpha(px, py, tl, tl, tl);
330555
+ if (px >= w - tr && py < tr) return cornerAlpha(px, py, w - tr, tr, tr);
330556
+ if (px >= w - br && py >= h - br) return cornerAlpha(px, py, w - br, h - br, br);
330557
+ if (px < bl && py >= h - bl) return cornerAlpha(px, py, bl, h - bl, bl);
330558
+ return 1;
330559
+ }
330560
+ function blitRgb48leRegion(canvas, source22, dx, dy, sw, sh, canvasWidth, canvasHeight, opacity, borderRadius) {
330561
+ if (sw <= 0 || sh <= 0) return;
330562
+ const op = opacity ?? 1;
330563
+ const x0 = Math.max(0, dx);
330564
+ const y0 = Math.max(0, dy);
330565
+ const x1 = Math.min(canvasWidth, dx + sw);
330566
+ const y1 = Math.min(canvasHeight, dy + sh);
330567
+ if (x0 >= x1 || y0 >= y1) return;
330568
+ const clippedW = x1 - x0;
330569
+ const srcOffsetX = x0 - dx;
330570
+ const srcOffsetY = y0 - dy;
330571
+ const hasMask = borderRadius !== void 0;
330572
+ if (op >= 0.999 && !hasMask) {
330573
+ for (let y = 0; y < y1 - y0; y++) {
330574
+ const srcRowOff = ((srcOffsetY + y) * sw + srcOffsetX) * 6;
330575
+ const dstRowOff = ((y0 + y) * canvasWidth + x0) * 6;
330576
+ source22.copy(canvas, dstRowOff, srcRowOff, srcRowOff + clippedW * 6);
330577
+ }
330578
+ } else {
330579
+ for (let y = 0; y < y1 - y0; y++) {
330580
+ for (let x = 0; x < clippedW; x++) {
330581
+ let effectiveOp = op;
330582
+ if (hasMask) {
330583
+ const ma = roundedRectAlpha(srcOffsetX + x, srcOffsetY + y, sw, sh, borderRadius);
330584
+ if (ma <= 0) continue;
330585
+ effectiveOp *= ma;
330586
+ }
330587
+ const srcOff = ((srcOffsetY + y) * sw + srcOffsetX + x) * 6;
330588
+ const dstOff = ((y0 + y) * canvasWidth + x0 + x) * 6;
330589
+ if (effectiveOp >= 0.999) {
330590
+ source22.copy(canvas, dstOff, srcOff, srcOff + 6);
330591
+ } else {
330592
+ const invEff = 1 - effectiveOp;
330593
+ const sr = source22.readUInt16LE(srcOff);
330594
+ const sg = source22.readUInt16LE(srcOff + 2);
330595
+ const sb = source22.readUInt16LE(srcOff + 4);
330596
+ const dr = canvas.readUInt16LE(dstOff);
330597
+ const dg = canvas.readUInt16LE(dstOff + 2);
330598
+ const db = canvas.readUInt16LE(dstOff + 4);
330599
+ canvas.writeUInt16LE(Math.round(sr * effectiveOp + dr * invEff), dstOff);
330600
+ canvas.writeUInt16LE(Math.round(sg * effectiveOp + dg * invEff), dstOff + 2);
330601
+ canvas.writeUInt16LE(Math.round(sb * effectiveOp + db * invEff), dstOff + 4);
330602
+ }
330603
+ }
330604
+ }
330605
+ }
330606
+ }
330607
+ function blitRgb48leAffine(canvas, source22, matrix, srcW, srcH, canvasW, canvasH, opacity, borderRadius) {
330608
+ const a = matrix[0];
330609
+ const b = matrix[1];
330610
+ const c = matrix[2];
330611
+ const d = matrix[3];
330612
+ const tx = matrix[4];
330613
+ const ty = matrix[5];
330614
+ if (a === void 0 || b === void 0 || c === void 0 || d === void 0 || tx === void 0 || ty === void 0)
330615
+ return;
330616
+ const det = a * d - b * c;
330617
+ if (Math.abs(det) < 1e-10) return;
330618
+ const invA = d / det;
330619
+ const invB = -b / det;
330620
+ const invC = -c / det;
330621
+ const invD = a / det;
330622
+ const invTx = -(invA * tx + invC * ty);
330623
+ const invTy = -(invB * tx + invD * ty);
330624
+ const op = opacity ?? 1;
330625
+ const hasMask = borderRadius !== void 0;
330626
+ const corners = [
330627
+ [tx, ty],
330628
+ [a * srcW + tx, b * srcW + ty],
330629
+ [c * srcH + tx, d * srcH + ty],
330630
+ [a * srcW + c * srcH + tx, b * srcW + d * srcH + ty]
330631
+ ];
330632
+ let minX = canvasW, maxX = 0, minY = canvasH, maxY = 0;
330633
+ for (const corner of corners) {
330634
+ const cx = corner[0] ?? 0;
330635
+ const cy = corner[1] ?? 0;
330636
+ if (cx < minX) minX = cx;
330637
+ if (cx > maxX) maxX = cx;
330638
+ if (cy < minY) minY = cy;
330639
+ if (cy > maxY) maxY = cy;
330640
+ }
330641
+ const startX = Math.max(0, Math.floor(minX));
330642
+ const endX = Math.min(canvasW, Math.ceil(maxX));
330643
+ const startY = Math.max(0, Math.floor(minY));
330644
+ const endY = Math.min(canvasH, Math.ceil(maxY));
330645
+ for (let dy = startY; dy < endY; dy++) {
330646
+ for (let dx = startX; dx < endX; dx++) {
330647
+ const sx = invA * dx + invC * dy + invTx;
330648
+ const sy = invB * dx + invD * dy + invTy;
330649
+ if (sx < 0 || sy < 0 || sx >= srcW || sy >= srcH) continue;
330650
+ let effectiveOp = op;
330651
+ if (hasMask) {
330652
+ const ma = roundedRectAlpha(sx, sy, srcW, srcH, borderRadius);
330653
+ if (ma <= 0) continue;
330654
+ effectiveOp *= ma;
330655
+ }
330656
+ const x0 = Math.floor(sx);
330657
+ const y0 = Math.floor(sy);
330658
+ const fx = sx - x0;
330659
+ const fy = sy - y0;
330660
+ const x1 = Math.min(x0 + 1, srcW - 1);
330661
+ const y1 = Math.min(y0 + 1, srcH - 1);
330662
+ const off00 = (y0 * srcW + x0) * 6;
330663
+ const off10 = (y0 * srcW + x1) * 6;
330664
+ const off01 = (y1 * srcW + x0) * 6;
330665
+ const off11 = (y1 * srcW + x1) * 6;
330666
+ const w00 = (1 - fx) * (1 - fy);
330667
+ const w10 = fx * (1 - fy);
330668
+ const w01 = (1 - fx) * fy;
330669
+ const w11 = fx * fy;
330670
+ const sr = source22.readUInt16LE(off00) * w00 + source22.readUInt16LE(off10) * w10 + source22.readUInt16LE(off01) * w01 + source22.readUInt16LE(off11) * w11;
330671
+ const sg = source22.readUInt16LE(off00 + 2) * w00 + source22.readUInt16LE(off10 + 2) * w10 + source22.readUInt16LE(off01 + 2) * w01 + source22.readUInt16LE(off11 + 2) * w11;
330672
+ const sb = source22.readUInt16LE(off00 + 4) * w00 + source22.readUInt16LE(off10 + 4) * w10 + source22.readUInt16LE(off01 + 4) * w01 + source22.readUInt16LE(off11 + 4) * w11;
330673
+ const dstOff = (dy * canvasW + dx) * 6;
330674
+ if (effectiveOp >= 0.999) {
330675
+ canvas.writeUInt16LE(Math.round(sr), dstOff);
330676
+ canvas.writeUInt16LE(Math.round(sg), dstOff + 2);
330677
+ canvas.writeUInt16LE(Math.round(sb), dstOff + 4);
330678
+ } else {
330679
+ const invEff = 1 - effectiveOp;
330680
+ const dr = canvas.readUInt16LE(dstOff);
330681
+ const dg = canvas.readUInt16LE(dstOff + 2);
330682
+ const db = canvas.readUInt16LE(dstOff + 4);
330683
+ canvas.writeUInt16LE(Math.round(sr * effectiveOp + dr * invEff), dstOff);
330684
+ canvas.writeUInt16LE(Math.round(sg * effectiveOp + dg * invEff), dstOff + 2);
330685
+ canvas.writeUInt16LE(Math.round(sb * effectiveOp + db * invEff), dstOff + 4);
330686
+ }
330687
+ }
330688
+ }
330689
+ }
330690
+ function parseTransformMatrix(css) {
330691
+ if (!css || css === "none") return null;
330692
+ const match2 = css.match(
330693
+ /^matrix\(\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,]+),\s*([^,)]+)\s*\)$/
330694
+ );
330695
+ if (!match2) return null;
330696
+ const values = match2.slice(1, 7).map(Number);
330697
+ if (!values.every(Number.isFinite)) return null;
330698
+ return values;
330699
+ }
330700
+ function groupIntoLayers(elements) {
330701
+ const sorted = [...elements].sort((a, b) => a.zIndex - b.zIndex);
330702
+ const layers = [];
330703
+ for (const el of sorted) {
330704
+ if (el.isHdr) {
330705
+ layers.push({ type: "hdr", element: el });
330706
+ } else {
330707
+ const last22 = layers[layers.length - 1];
330708
+ if (last22 && last22.type === "dom") {
330709
+ last22.elementIds.push(el.id);
330710
+ } else {
330711
+ layers.push({ type: "dom", elementIds: [el.id] });
330712
+ }
330713
+ }
330714
+ }
330715
+ return layers;
330716
+ }
330717
+ function pqEotf(signal) {
330718
+ const sp = Math.pow(Math.max(0, signal), 1 / PQ_M2);
330719
+ const num = Math.max(sp - PQ_C1, 0);
330720
+ const den = PQ_C2 - PQ_C3 * sp;
330721
+ return den > 0 ? Math.pow(num / den, 1 / PQ_M1) : 0;
330722
+ }
330723
+ function pqOetf(linear) {
330724
+ const lp = Math.pow(Math.max(0, linear), PQ_M1);
330725
+ return Math.pow((PQ_C1 + PQ_C2 * lp) / (1 + PQ_C3 * lp), PQ_M2);
330726
+ }
330727
+ function hlgEotf(signal) {
330728
+ const a = 0.17883277;
330729
+ const b = 1 - 4 * a;
330730
+ const c = 0.5 - a * Math.log(4 * a);
330731
+ if (signal <= 0.5) {
330732
+ return signal * signal / 3;
330733
+ }
330734
+ return (Math.exp((signal - c) / a) + b) / 12;
330735
+ }
330736
+ function hlgOetf(linear) {
330737
+ const a = 0.17883277;
330738
+ const b = 1 - 4 * a;
330739
+ const c = 0.5 - a * Math.log(4 * a);
330740
+ if (linear <= 1 / 12) {
330741
+ return Math.sqrt(3 * linear);
330742
+ }
330743
+ return a * Math.log(12 * linear - b) + c;
330744
+ }
330745
+ function buildLut(fn) {
330746
+ const lut = new Uint16Array(65536);
330747
+ for (let i = 0; i < 65536; i++) {
330748
+ lut[i] = Math.round(fn(i / 65535) * 65535);
330749
+ }
330750
+ return lut;
330751
+ }
330752
+ function hlgSceneToPqDisplay(sceneLinear) {
330753
+ const displayNits = HLG_OOTF_LW * Math.pow(Math.max(0, sceneLinear), HLG_OOTF_GAMMA);
330754
+ return displayNits / 1e4;
330755
+ }
330756
+ function pqDisplayToHlgScene(displayNormalized) {
330757
+ const displayNits = displayNormalized * 1e4;
330758
+ return Math.pow(Math.max(0, displayNits / HLG_OOTF_LW), 1 / HLG_OOTF_GAMMA);
330759
+ }
330760
+ function getHlgToPqLut() {
330761
+ if (!hlgToPqLut) hlgToPqLut = buildLut((v) => pqOetf(hlgSceneToPqDisplay(hlgEotf(v))));
330762
+ return hlgToPqLut;
330763
+ }
330764
+ function getPqToHlgLut() {
330765
+ if (!pqToHlgLut) pqToHlgLut = buildLut((v) => hlgOetf(pqDisplayToHlgScene(pqEotf(v))));
330766
+ return pqToHlgLut;
330767
+ }
330768
+ function convertTransfer(buf, from22, to) {
330769
+ if (from22 === to) return;
330770
+ const lut = from22 === "hlg" ? getHlgToPqLut() : getPqToHlgLut();
330771
+ const len = buf.length / 2;
330772
+ for (let i = 0; i < len; i++) {
330773
+ const off = i * 2;
330774
+ buf.writeUInt16LE(lut[buf.readUInt16LE(off)] ?? 0, off);
330775
+ }
330776
+ }
330777
+ function sampleRgb48le(buf, u, v, w, h) {
330778
+ const uc = Math.max(0, Math.min(1, u));
330779
+ const vc = Math.max(0, Math.min(1, v));
330780
+ const sx = uc * (w - 1);
330781
+ const sy = vc * (h - 1);
330782
+ const x0 = Math.floor(sx);
330783
+ const y0 = Math.floor(sy);
330784
+ const x1 = Math.min(x0 + 1, w - 1);
330785
+ const y1 = Math.min(y0 + 1, h - 1);
330786
+ const fx = sx - x0;
330787
+ const fy = sy - y0;
330788
+ const w00 = (1 - fx) * (1 - fy);
330789
+ const w10 = fx * (1 - fy);
330790
+ const w01 = (1 - fx) * fy;
330791
+ const w11 = fx * fy;
330792
+ const off00 = (y0 * w + x0) * 6;
330793
+ const off10 = (y0 * w + x1) * 6;
330794
+ const off01 = (y1 * w + x0) * 6;
330795
+ const off11 = (y1 * w + x1) * 6;
330796
+ const r = Math.round(
330797
+ buf.readUInt16LE(off00) * w00 + buf.readUInt16LE(off10) * w10 + buf.readUInt16LE(off01) * w01 + buf.readUInt16LE(off11) * w11
330798
+ );
330799
+ const g = Math.round(
330800
+ buf.readUInt16LE(off00 + 2) * w00 + buf.readUInt16LE(off10 + 2) * w10 + buf.readUInt16LE(off01 + 2) * w01 + buf.readUInt16LE(off11 + 2) * w11
330801
+ );
330802
+ const b = Math.round(
330803
+ buf.readUInt16LE(off00 + 4) * w00 + buf.readUInt16LE(off10 + 4) * w10 + buf.readUInt16LE(off01 + 4) * w01 + buf.readUInt16LE(off11 + 4) * w11
330804
+ );
330805
+ return [r, g, b];
330806
+ }
330807
+ function mix16(a, b, t) {
330808
+ return Math.round(a * (1 - t) + b * t);
330809
+ }
330810
+ function clamp16(v) {
330811
+ return Math.max(0, Math.min(65535, v));
330812
+ }
330813
+ function smoothstep(edge0, edge1, x) {
330814
+ const t = Math.max(0, Math.min(1, (x - edge0) / (edge1 - edge0)));
330815
+ return t * t * (3 - 2 * t);
330816
+ }
330817
+ function hash(x, y) {
330818
+ return (Math.sin(x * 127.1 + y * 311.7) * 43758.5453 % 1 + 1) % 1;
330819
+ }
330820
+ function vnoise(px, py) {
330821
+ const ix = Math.floor(px);
330822
+ const iy = Math.floor(py);
330823
+ let fx = px - ix;
330824
+ let fy = py - iy;
330825
+ fx = fx * fx * fx * (fx * (fx * 6 - 15) + 10);
330826
+ fy = fy * fy * fy * (fy * (fy * 6 - 15) + 10);
330827
+ const h00 = hash(ix, iy);
330828
+ const h10 = hash(ix + 1, iy);
330829
+ const h01 = hash(ix, iy + 1);
330830
+ const h11 = hash(ix + 1, iy + 1);
330831
+ return h00 * (1 - fx) * (1 - fy) + h10 * fx * (1 - fy) + h01 * (1 - fx) * fy + h11 * fx * fy;
330832
+ }
330833
+ function fbm(px, py) {
330834
+ let value = 0;
330835
+ let amplitude = 0.5;
330836
+ let x = px;
330837
+ let y = py;
330838
+ for (let i = 0; i < 5; i++) {
330839
+ value += amplitude * vnoise(x, y);
330840
+ const nx = ROT_A * x - ROT_B * y;
330841
+ const ny = ROT_B * x + ROT_A * y;
330842
+ x = nx * 2.02;
330843
+ y = ny * 2.02;
330844
+ amplitude *= 0.5;
330845
+ }
330846
+ return value;
330847
+ }
330848
+ function glitchRand(x, y) {
330849
+ return (Math.sin(x * 12.9898 + y * 78.233) * 43758.5453 % 1 + 1) % 1;
330850
+ }
330851
+ function aces(x) {
330852
+ return Math.max(0, Math.min(1, x * (2.51 * x + 0.03) / (x * (2.43 * x + 0.59) + 0.14)));
330853
+ }
330854
+ function ridged(px, py) {
330855
+ let value = 0;
330856
+ let amplitude = 0.5;
330857
+ let x = px;
330858
+ let y = py;
330859
+ for (let i = 0; i < 5; i++) {
330860
+ value += amplitude * Math.abs(vnoise(x, y) * 2 - 1);
330861
+ const nx = ROT_A * x - ROT_B * y;
330862
+ const ny = ROT_B * x + ROT_A * y;
330863
+ x = nx * 2.02;
330864
+ y = ny * 2.02;
330865
+ amplitude *= 0.5;
330866
+ }
330867
+ return value;
330868
+ }
329908
330869
  function resolveHyperframeManifestPath() {
329909
330870
  if (process.env.PRODUCER_HYPERFRAME_MANIFEST_PATH) {
329910
330871
  return process.env.PRODUCER_HYPERFRAME_MANIFEST_PATH;
@@ -330017,8 +330978,22 @@ function injectScriptsIntoHtml(html, headScripts, bodyScripts, stripEmbedded) {
330017
330978
  }
330018
330979
  return html;
330019
330980
  }
330981
+ function injectScriptsAtHeadStart(html, scripts) {
330982
+ if (scripts.length === 0) return html;
330983
+ const headTags = scripts.map((src) => `<script>${src}</script>`).join("\n");
330984
+ if (html.includes("<head")) {
330985
+ return html.replace(/<head\b[^>]*>/i, (match2) => `${match2}
330986
+ ${headTags}`);
330987
+ }
330988
+ if (html.includes("<body")) {
330989
+ return html.replace("<body", () => `${headTags}
330990
+ <body`);
330991
+ }
330992
+ return headTags + "\n" + html;
330993
+ }
330020
330994
  function createFileServer2(options) {
330021
330995
  const { projectDir, compiledDir, port = 0, stripEmbeddedRuntime = true } = options;
330996
+ const preHeadScripts = [HF_EARLY_STUB, ...options.preHeadScripts ?? []];
330022
330997
  const headScripts = options.headScripts ?? [getVerifiedHyperframeRuntimeSource()];
330023
330998
  const bodyScripts = options.bodyScripts ?? [RENDER_MODE_SCRIPT, HF_BRIDGE_SCRIPT];
330024
330999
  const app = new Hono2();
@@ -330042,7 +331017,11 @@ function createFileServer2(options) {
330042
331017
  if (ext === ".html") {
330043
331018
  const rawHtml = readFileSync6(filePath, "utf-8");
330044
331019
  const isIndex = relativePath === "index.html";
330045
- const html = isIndex ? injectScriptsIntoHtml(rawHtml, headScripts, bodyScripts, stripEmbeddedRuntime) : rawHtml;
331020
+ let html = rawHtml;
331021
+ if (preHeadScripts.length > 0) {
331022
+ html = injectScriptsAtHeadStart(html, preHeadScripts);
331023
+ }
331024
+ html = isIndex ? injectScriptsIntoHtml(html, headScripts, bodyScripts, stripEmbeddedRuntime) : html;
330046
331025
  return c.text(html, 200, { "Content-Type": contentType });
330047
331026
  }
330048
331027
  const content = readFileSync6(filePath);
@@ -330070,6 +331049,30 @@ function createFileServer2(options) {
330070
331049
  });
330071
331050
  });
330072
331051
  }
331052
+ function isPathInside(childPath, parentPath) {
331053
+ const absChild = resolve82(childPath);
331054
+ const absParent = resolve82(parentPath);
331055
+ if (absChild === absParent) return true;
331056
+ const rel = relative22(absParent, absChild);
331057
+ return rel !== "" && !rel.startsWith("..") && !isAbsolute22(rel);
331058
+ }
331059
+ function toExternalAssetKey(absPath) {
331060
+ if (absPath.startsWith("hf-ext/")) return absPath;
331061
+ let normalised = absPath.replace(/\\/g, "/");
331062
+ normalised = normalised.replace(/^\/\/\?\/UNC\//i, "//");
331063
+ normalised = normalised.replace(/^\/\/\?\//, "");
331064
+ normalised = normalised.replace(/^\/\/([^/]+)\//, "unc/$1/");
331065
+ normalised = normalised.replace(/^\/+/, "");
331066
+ normalised = normalised.replace(/^([A-Za-z]):\/?/, "$1/");
331067
+ return "hf-ext/" + normalised;
331068
+ }
331069
+ function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
331070
+ const absoluteProjectDir = resolve82(projectDir);
331071
+ const projectName = basename22(absoluteProjectDir);
331072
+ const resolvedOutputPath = outputPath ?? join12(rendersDir, `${projectName}.mp4`);
331073
+ const absoluteOutputPath = resolve82(resolvedOutputPath);
331074
+ return { absoluteProjectDir, absoluteOutputPath };
331075
+ }
330073
331076
  function normalizeFamilyName(family) {
330074
331077
  return family.trim().replace(/^['"]|['"]$/g, "").trim().toLowerCase();
330075
331078
  }
@@ -330180,14 +331183,14 @@ function fontSlug(familyName) {
330180
331183
  return familyName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
330181
331184
  }
330182
331185
  function fontCacheDir(slug) {
330183
- const dir = join12(GOOGLE_FONTS_CACHE_DIR, slug);
331186
+ const dir = join13(GOOGLE_FONTS_CACHE_DIR, slug);
330184
331187
  if (!existsSync13(dir)) {
330185
331188
  mkdirSync8(dir, { recursive: true });
330186
331189
  }
330187
331190
  return dir;
330188
331191
  }
330189
331192
  function cachedWoff2Path(slug, weight, style) {
330190
- return join12(fontCacheDir(slug), `${weight}-${style}.woff2`);
331193
+ return join13(fontCacheDir(slug), `${weight}-${style}.woff2`);
330191
331194
  }
330192
331195
  async function fetchGoogleFont(familyName) {
330193
331196
  const slug = fontSlug(familyName);
@@ -330277,6 +331280,36 @@ function dedupeElementsById(elements) {
330277
331280
  }
330278
331281
  return Array.from(deduped.values());
330279
331282
  }
331283
+ function stripJsComments(source22) {
331284
+ return source22.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "");
331285
+ }
331286
+ function detectRenderModeHints(html) {
331287
+ const reasons = [];
331288
+ const { document: document22 } = parseHTML(html);
331289
+ if (document22.querySelector("iframe")) {
331290
+ reasons.push({
331291
+ code: "iframe",
331292
+ message: "Detected <iframe> in the composition DOM. Nested iframe animation is routed through screenshot capture mode for compatibility."
331293
+ });
331294
+ }
331295
+ let scriptMatch;
331296
+ const scriptPattern = new RegExp(INLINE_SCRIPT_PATTERN.source, INLINE_SCRIPT_PATTERN.flags);
331297
+ while ((scriptMatch = scriptPattern.exec(html)) !== null) {
331298
+ const attrs = scriptMatch[1] || "";
331299
+ if (/\bsrc\s*=/i.test(attrs)) continue;
331300
+ const content = stripJsComments(scriptMatch[2] || "");
331301
+ if (!/requestAnimationFrame\s*\(/.test(content)) continue;
331302
+ reasons.push({
331303
+ code: "requestAnimationFrame",
331304
+ message: "Detected raw requestAnimationFrame() in an inline script. This render is routed through screenshot capture mode with virtual time enabled."
331305
+ });
331306
+ break;
331307
+ }
331308
+ return {
331309
+ recommendScreenshot: reasons.length > 0,
331310
+ reasons
331311
+ };
331312
+ }
330280
331313
  async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagName19) {
330281
331314
  let filePath = src;
330282
331315
  if (isHttpUrl(src)) {
@@ -330287,7 +331320,7 @@ async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagNa
330287
331320
  return { duration: 0, resolvedPath: src };
330288
331321
  }
330289
331322
  } else if (!filePath.startsWith("/")) {
330290
- filePath = join13(baseDir, filePath);
331323
+ filePath = join14(baseDir, filePath);
330291
331324
  }
330292
331325
  if (!existsSync14(filePath)) {
330293
331326
  return { duration: 0, resolvedPath: filePath };
@@ -330353,7 +331386,7 @@ async function parseSubCompositions(html, projectDir, downloadDir, parentOffset
330353
331386
  const elEnd = elEndRaw ? parseFloat(elEndRaw) : Infinity;
330354
331387
  const absoluteStart = parentOffset + elStart;
330355
331388
  const absoluteEnd = Math.min(parentEnd, isFinite(elEnd) ? parentOffset + elEnd : Infinity);
330356
- const filePath = resolve82(projectDir, srcPath);
331389
+ const filePath = resolve92(projectDir, srcPath);
330357
331390
  if (visited.has(filePath)) {
330358
331391
  continue;
330359
331392
  }
@@ -330553,7 +331586,7 @@ function inlineSubCompositions(html, subCompositions, projectDir) {
330553
331586
  if (!srcPath) continue;
330554
331587
  let compHtml = subCompositions.get(srcPath) || null;
330555
331588
  if (!compHtml) {
330556
- const filePath = resolve82(projectDir, srcPath);
331589
+ const filePath = resolve92(projectDir, srcPath);
330557
331590
  if (existsSync14(filePath)) {
330558
331591
  compHtml = readFileSync8(filePath, "utf-8");
330559
331592
  }
@@ -330766,7 +331799,7 @@ ${safeText}
330766
331799
  return result;
330767
331800
  }
330768
331801
  function collectExternalAssets(html, projectDir) {
330769
- const absProjectDir = resolve82(projectDir);
331802
+ const absProjectDir = resolve92(projectDir);
330770
331803
  const externalAssets = /* @__PURE__ */ new Map();
330771
331804
  const CSS_URL_RE2 = /\burl\(\s*(["']?)([^)"']+)\1\s*\)/g;
330772
331805
  function processPath(rawPath) {
@@ -330774,12 +331807,12 @@ function collectExternalAssets(html, projectDir) {
330774
331807
  if (!trimmed || trimmed.startsWith("/") || trimmed.startsWith("http://") || trimmed.startsWith("https://") || trimmed.startsWith("//") || trimmed.startsWith("data:") || trimmed.startsWith("#")) {
330775
331808
  return null;
330776
331809
  }
330777
- const absPath = resolve82(absProjectDir, trimmed);
330778
- if (absPath.startsWith(absProjectDir + "/") || absPath === absProjectDir) {
331810
+ const absPath = resolve92(absProjectDir, trimmed);
331811
+ if (isPathInside(absPath, absProjectDir)) {
330779
331812
  return null;
330780
331813
  }
330781
331814
  if (!existsSync14(absPath)) return null;
330782
- const safeKey = "hf-ext/" + absPath.replace(/^\//, "");
331815
+ const safeKey = toExternalAssetKey(absPath);
330783
331816
  externalAssets.set(safeKey, absPath);
330784
331817
  return safeKey;
330785
331818
  }
@@ -330840,6 +331873,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
330840
331873
  /(<(?:video|audio)\b[^>]*?)\s+preload\s*=\s*["']none["']/gi,
330841
331874
  "$1"
330842
331875
  );
331876
+ const renderModeHints = detectRenderModeHints(sanitizedHtml);
330843
331877
  const coalescedHtml = await injectDeterministicFontFaces(
330844
331878
  coalesceHeadStylesAndBodyScripts(promoteCssImportsToLinkTags(sanitizedHtml))
330845
331879
  );
@@ -330851,7 +331885,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
330851
331885
  const audios = dedupeElementsById([...mainAudios, ...subAudios]);
330852
331886
  for (const video of videos) {
330853
331887
  if (isHttpUrl(video.src)) continue;
330854
- const videoPath = resolve82(projectDir, video.src);
331888
+ const videoPath = resolve92(projectDir, video.src);
330855
331889
  const reencode = `ffmpeg -i "${video.src}" -c:v libx264 -r 30 -g 30 -keyint_min 30 -movflags +faststart -c:a copy output.mp4`;
330856
331890
  Promise.all([analyzeKeyframeIntervals(videoPath), extractVideoMetadata(videoPath)]).then(([analysis, metadata]) => {
330857
331891
  if (analysis.isProblematic) {
@@ -330883,7 +331917,8 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
330883
331917
  externalAssets,
330884
331918
  width,
330885
331919
  height,
330886
- staticDuration
331920
+ staticDuration,
331921
+ renderModeHints
330887
331922
  };
330888
331923
  }
330889
331924
  async function discoverMediaFromBrowser(page) {
@@ -330977,7 +332012,8 @@ async function recompileWithResolutions(compiled, resolutions, projectDir, downl
330977
332012
  subCompositions,
330978
332013
  videos,
330979
332014
  audios,
330980
- unresolvedCompositions: remaining
332015
+ unresolvedCompositions: remaining,
332016
+ renderModeHints: compiled.renderModeHints
330981
332017
  };
330982
332018
  }
330983
332019
  function createConsoleLogger(level = "info") {
@@ -331016,6 +332052,22 @@ async function safeCleanup(label, fn, log2 = defaultLogger) {
331016
332052
  });
331017
332053
  }
331018
332054
  }
332055
+ function getMaxFrameIndex(frameDir) {
332056
+ const cached = frameDirMaxIndexCache.get(frameDir);
332057
+ if (cached !== void 0) return cached;
332058
+ let max = 0;
332059
+ try {
332060
+ for (const name of readdirSync6(frameDir)) {
332061
+ const m = FRAME_FILENAME_RE.exec(name);
332062
+ if (!m) continue;
332063
+ const n = Number(m[1]);
332064
+ if (Number.isFinite(n) && n > max) max = n;
332065
+ }
332066
+ } catch {
332067
+ }
332068
+ frameDirMaxIndexCache.set(frameDir, max);
332069
+ return max;
332070
+ }
331019
332071
  function updateJobStatus(job, status, stage, progress, onProgress) {
331020
332072
  job.status = status;
331021
332073
  job.currentStage = stage;
@@ -331059,17 +332111,17 @@ function installDebugLogger(logPath, log2 = defaultLogger) {
331059
332111
  };
331060
332112
  }
331061
332113
  function writeCompiledArtifacts(compiled, workDir, includeSummary) {
331062
- const compileDir = join14(workDir, "compiled");
332114
+ const compileDir = join15(workDir, "compiled");
331063
332115
  mkdirSync10(compileDir, { recursive: true });
331064
- writeFileSync4(join14(compileDir, "index.html"), compiled.html, "utf-8");
332116
+ writeFileSync4(join15(compileDir, "index.html"), compiled.html, "utf-8");
331065
332117
  for (const [srcPath, html] of compiled.subCompositions) {
331066
- const outPath = join14(compileDir, srcPath);
332118
+ const outPath = join15(compileDir, srcPath);
331067
332119
  mkdirSync10(dirname10(outPath), { recursive: true });
331068
332120
  writeFileSync4(outPath, html, "utf-8");
331069
332121
  }
331070
332122
  for (const [relativePath, absolutePath] of compiled.externalAssets) {
331071
- const outPath = resolve92(join14(compileDir, relativePath));
331072
- if (!outPath.startsWith(compileDir + "/")) {
332123
+ const outPath = resolve102(join15(compileDir, relativePath));
332124
+ if (!isPathInside(outPath, compileDir)) {
331073
332125
  console.warn(`[Render] Skipping external asset with unsafe path: ${relativePath}`);
331074
332126
  continue;
331075
332127
  }
@@ -331095,9 +332147,75 @@ function writeCompiledArtifacts(compiled, workDir, includeSummary) {
331095
332147
  end: a.end,
331096
332148
  mediaStart: a.mediaStart
331097
332149
  })),
331098
- subCompositions: Array.from(compiled.subCompositions.keys())
332150
+ subCompositions: Array.from(compiled.subCompositions.keys()),
332151
+ renderModeHints: compiled.renderModeHints
331099
332152
  };
331100
- writeFileSync4(join14(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
332153
+ writeFileSync4(join15(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
332154
+ }
332155
+ }
332156
+ function applyRenderModeHints(cfg, compiled, log2 = defaultLogger) {
332157
+ if (cfg.forceScreenshot || !compiled.renderModeHints.recommendScreenshot) return;
332158
+ cfg.forceScreenshot = true;
332159
+ log2.warn("Auto-selected screenshot capture mode for render compatibility", {
332160
+ reasonCodes: compiled.renderModeHints.reasons.map((reason) => reason.code),
332161
+ reasons: compiled.renderModeHints.reasons.map((reason) => reason.message)
332162
+ });
332163
+ }
332164
+ function blitHdrVideoLayer(canvas, el, time, fps, hdrFrameDirs, hdrStartTimes, width, height, log2, sourceTransfer, targetTransfer) {
332165
+ const frameDir = hdrFrameDirs.get(el.id);
332166
+ const startTime = hdrStartTimes.get(el.id);
332167
+ if (!frameDir || startTime === void 0) {
332168
+ return;
332169
+ }
332170
+ const videoFrameIndex = Math.round((time - startTime) * fps) + 1;
332171
+ if (videoFrameIndex < 1) return;
332172
+ const maxIndex = getMaxFrameIndex(frameDir);
332173
+ const effectiveIndex = maxIndex > 0 ? Math.min(videoFrameIndex, maxIndex) : videoFrameIndex;
332174
+ const framePath = join15(frameDir, `frame_${String(effectiveIndex).padStart(4, "0")}.png`);
332175
+ if (!existsSync15(framePath)) {
332176
+ return;
332177
+ }
332178
+ try {
332179
+ const { data: hdrRgb, width: srcW, height: srcH } = decodePngToRgb48le(readFileSync9(framePath));
332180
+ if (sourceTransfer && targetTransfer && sourceTransfer !== targetTransfer) {
332181
+ convertTransfer(hdrRgb, sourceTransfer, targetTransfer);
332182
+ }
332183
+ const viewportMatrix = parseTransformMatrix(el.transform);
332184
+ const br = el.borderRadius;
332185
+ const hasBorderRadius = br[0] > 0 || br[1] > 0 || br[2] > 0 || br[3] > 0;
332186
+ const borderRadiusParam = hasBorderRadius ? br : void 0;
332187
+ if (viewportMatrix) {
332188
+ blitRgb48leAffine(
332189
+ canvas,
332190
+ hdrRgb,
332191
+ viewportMatrix,
332192
+ srcW,
332193
+ srcH,
332194
+ width,
332195
+ height,
332196
+ el.opacity < 0.999 ? el.opacity : void 0,
332197
+ borderRadiusParam
332198
+ );
332199
+ } else {
332200
+ blitRgb48leRegion(
332201
+ canvas,
332202
+ hdrRgb,
332203
+ el.x,
332204
+ el.y,
332205
+ srcW,
332206
+ srcH,
332207
+ width,
332208
+ height,
332209
+ el.opacity < 0.999 ? el.opacity : void 0,
332210
+ borderRadiusParam
332211
+ );
332212
+ }
332213
+ } catch (err) {
332214
+ if (log2) {
332215
+ log2.debug(`HDR blit failed for ${el.id}`, {
332216
+ error: err instanceof Error ? err.message : String(err)
332217
+ });
332218
+ }
331101
332219
  }
331102
332220
  }
331103
332221
  function createRenderJob(config22) {
@@ -331141,9 +332259,9 @@ function extractStandaloneEntryFromIndex(indexHtml, entryFile) {
331141
332259
  }
331142
332260
  async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSignal) {
331143
332261
  const moduleDir = dirname10(fileURLToPath3(import.meta.url));
331144
- const producerRoot = process.env.PRODUCER_RENDERS_DIR ? resolve92(process.env.PRODUCER_RENDERS_DIR, "..") : resolve92(moduleDir, "../..");
331145
- const debugDir = join14(producerRoot, ".debug");
331146
- const workDir = job.config.debug ? join14(debugDir, job.id) : join14(dirname10(outputPath), `work-${job.id}`);
332262
+ const producerRoot = process.env.PRODUCER_RENDERS_DIR ? resolve102(process.env.PRODUCER_RENDERS_DIR, "..") : resolve102(moduleDir, "../..");
332263
+ const debugDir = join15(producerRoot, ".debug");
332264
+ const workDir = job.config.debug ? join15(debugDir, job.id) : join15(dirname10(outputPath), `work-${job.id}`);
331147
332265
  const pipelineStart = Date.now();
331148
332266
  const log2 = job.config.logger ?? defaultLogger;
331149
332267
  let fileServer = null;
@@ -331151,7 +332269,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331151
332269
  let lastBrowserConsole = [];
331152
332270
  let restoreLogger = null;
331153
332271
  const perfStages = {};
331154
- const perfOutputPath = join14(workDir, "perf-summary.json");
332272
+ const perfOutputPath = join15(workDir, "perf-summary.json");
331155
332273
  const cfg = { ...job.config.producerConfig ?? resolveConfig() };
331156
332274
  const outputFormat = job.config.format ?? "mp4";
331157
332275
  const isWebm = outputFormat === "webm";
@@ -331173,19 +332291,19 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331173
332291
  assertNotAborted();
331174
332292
  if (!existsSync15(workDir)) mkdirSync10(workDir, { recursive: true });
331175
332293
  if (job.config.debug) {
331176
- const logPath = join14(workDir, "render.log");
332294
+ const logPath = join15(workDir, "render.log");
331177
332295
  restoreLogger = installDebugLogger(logPath, log2);
331178
332296
  }
331179
332297
  const entryFile = job.config.entryFile || "index.html";
331180
- let htmlPath = join14(projectDir, entryFile);
332298
+ let htmlPath = join15(projectDir, entryFile);
331181
332299
  if (!existsSync15(htmlPath)) {
331182
332300
  throw new Error(`Entry file not found: ${htmlPath}`);
331183
332301
  }
331184
332302
  assertNotAborted();
331185
332303
  const rawEntry = readFileSync9(htmlPath, "utf-8");
331186
332304
  if (entryFile !== "index.html" && rawEntry.trimStart().startsWith("<template")) {
331187
- const wrapperPath = join14(workDir, "standalone-entry.html");
331188
- const projectIndexPath = join14(projectDir, "index.html");
332305
+ const wrapperPath = join15(workDir, "standalone-entry.html");
332306
+ const projectIndexPath = join15(projectDir, "index.html");
331189
332307
  if (!existsSync15(projectIndexPath)) {
331190
332308
  throw new Error(
331191
332309
  `Template entry file "${entryFile}" requires a project index.html to extract its render shell.`
@@ -331209,9 +332327,10 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331209
332327
  const stage1Start = Date.now();
331210
332328
  updateJobStatus(job, "preprocessing", "Compiling composition", 5, onProgress);
331211
332329
  const compileStart = Date.now();
331212
- let compiled = await compileForRender(projectDir, htmlPath, join14(workDir, "downloads"));
332330
+ let compiled = await compileForRender(projectDir, htmlPath, join15(workDir, "downloads"));
331213
332331
  assertNotAborted();
331214
332332
  perfStages.compileOnlyMs = Date.now() - compileStart;
332333
+ applyRenderModeHints(cfg, compiled, log2);
331215
332334
  writeCompiledArtifacts(compiled, workDir, Boolean(job.config.debug));
331216
332335
  log2.info("Compiled composition metadata", {
331217
332336
  entryFile,
@@ -331219,7 +332338,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331219
332338
  width: compiled.width,
331220
332339
  height: compiled.height,
331221
332340
  videoCount: compiled.videos.length,
331222
- audioCount: compiled.audios.length
332341
+ audioCount: compiled.audios.length,
332342
+ renderModeHints: compiled.renderModeHints
331223
332343
  });
331224
332344
  const composition = {
331225
332345
  duration: compiled.staticDuration,
@@ -331238,8 +332358,9 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331238
332358
  reasons.push(`${compiled.unresolvedCompositions.length} unresolved composition(s)`);
331239
332359
  fileServer = await createFileServer2({
331240
332360
  projectDir,
331241
- compiledDir: join14(workDir, "compiled"),
331242
- port: 0
332361
+ compiledDir: join15(workDir, "compiled"),
332362
+ port: 0,
332363
+ preHeadScripts: [VIRTUAL_TIME_SHIM]
331243
332364
  });
331244
332365
  assertNotAborted();
331245
332366
  const captureOpts = {
@@ -331251,7 +332372,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331251
332372
  };
331252
332373
  probeSession = await createCaptureSession(
331253
332374
  fileServer.url,
331254
- join14(workDir, "probe"),
332375
+ join15(workDir, "probe"),
331255
332376
  captureOpts,
331256
332377
  null,
331257
332378
  cfg
@@ -331283,7 +332404,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331283
332404
  compiled,
331284
332405
  resolutions,
331285
332406
  projectDir,
331286
- join14(workDir, "downloads")
332407
+ join15(workDir, "downloads")
331287
332408
  );
331288
332409
  assertNotAborted();
331289
332410
  composition.videos = compiled.videos;
@@ -331367,6 +332488,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331367
332488
  perfStages.browserProbeMs = Date.now() - probeStart;
331368
332489
  job.duration = composition.duration;
331369
332490
  job.totalFrames = Math.ceil(composition.duration * job.config.fps);
332491
+ const totalFrames = job.totalFrames;
331370
332492
  if (job.duration <= 0) {
331371
332493
  const diagnostics = [];
331372
332494
  try {
@@ -331395,7 +332517,10 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331395
332517
  }
331396
332518
  }
331397
332519
  }
331398
- } catch {
332520
+ } catch (err) {
332521
+ log2.warn("Failed to gather browser diagnostics for zero-duration composition", {
332522
+ error: err instanceof Error ? err.message : String(err)
332523
+ });
331399
332524
  diagnostics.push("(Could not gather browser diagnostics \u2014 page may have crashed)");
331400
332525
  }
331401
332526
  const hint = diagnostics.length > 0 ? "\n\nDiagnostics:\n - " + diagnostics.join("\n - ") : "\n\nCheck that GSAP timelines are registered on window.__timelines.";
@@ -331418,12 +332543,32 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331418
332543
  const stage2Start = Date.now();
331419
332544
  updateJobStatus(job, "preprocessing", "Extracting video frames", 10, onProgress);
331420
332545
  let frameLookup = null;
331421
- const compiledDir = join14(workDir, "compiled");
332546
+ const compiledDir = join15(workDir, "compiled");
332547
+ let extractionResult = null;
332548
+ const nativeHdrVideoIds = /* @__PURE__ */ new Set();
332549
+ const videoTransfers = /* @__PURE__ */ new Map();
332550
+ if (job.config.hdr && composition.videos.length > 0) {
332551
+ await Promise.all(
332552
+ composition.videos.map(async (v) => {
332553
+ let videoPath = v.src;
332554
+ if (!videoPath.startsWith("/")) {
332555
+ const fromCompiled = existsSync15(join15(compiledDir, videoPath)) ? join15(compiledDir, videoPath) : join15(projectDir, videoPath);
332556
+ videoPath = fromCompiled;
332557
+ }
332558
+ if (!existsSync15(videoPath)) return;
332559
+ const meta = await extractVideoMetadata(videoPath);
332560
+ if (isHdrColorSpace(meta.colorSpace)) {
332561
+ nativeHdrVideoIds.add(v.id);
332562
+ videoTransfers.set(v.id, detectTransfer(meta.colorSpace));
332563
+ }
332564
+ })
332565
+ );
332566
+ }
331422
332567
  if (composition.videos.length > 0) {
331423
- const extractionResult = await extractAllVideoFrames(
332568
+ extractionResult = await extractAllVideoFrames(
331424
332569
  composition.videos,
331425
332570
  projectDir,
331426
- { fps: job.config.fps, outputDir: join14(workDir, "video-frames") },
332571
+ { fps: job.config.fps, outputDir: join15(workDir, "video-frames") },
331427
332572
  abortSignal,
331428
332573
  void 0,
331429
332574
  compiledDir
@@ -331455,15 +332600,38 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331455
332600
  } else {
331456
332601
  perfStages.videoExtractMs = Date.now() - stage2Start;
331457
332602
  }
332603
+ let effectiveHdr;
332604
+ if (job.config.hdr && frameLookup) {
332605
+ const colorSpaces = (extractionResult?.extracted ?? []).map((ext) => ext.metadata.colorSpace);
332606
+ const info = analyzeCompositionHdr(colorSpaces);
332607
+ if (info.hasHdr && info.dominantTransfer) {
332608
+ effectiveHdr = { transfer: info.dominantTransfer };
332609
+ }
332610
+ }
332611
+ if (job.config.hdr && !effectiveHdr && nativeHdrVideoIds.size > 0) {
332612
+ const firstTransfer = videoTransfers.values().next().value;
332613
+ if (firstTransfer) {
332614
+ effectiveHdr = { transfer: firstTransfer };
332615
+ }
332616
+ }
332617
+ if (effectiveHdr && outputFormat !== "mp4") {
332618
+ log2.info(`[Render] HDR source detected but format is ${outputFormat} \u2014 using SDR`);
332619
+ effectiveHdr = void 0;
332620
+ }
332621
+ if (effectiveHdr) {
332622
+ log2.info(
332623
+ `[Render] HDR source detected \u2014 output: ${effectiveHdr.transfer.toUpperCase()} (BT.2020, 10-bit H.265)`
332624
+ );
332625
+ }
331458
332626
  const stage3Start = Date.now();
331459
332627
  updateJobStatus(job, "preprocessing", "Processing audio tracks", 20, onProgress);
331460
- const audioOutputPath = join14(workDir, "audio.aac");
332628
+ const audioOutputPath = join15(workDir, "audio.aac");
331461
332629
  let hasAudio = false;
331462
332630
  if (composition.audios.length > 0) {
331463
332631
  const audioResult = await processCompositionAudio(
331464
332632
  composition.audios,
331465
332633
  projectDir,
331466
- join14(workDir, "audio-work"),
332634
+ join15(workDir, "audio-work"),
331467
332635
  audioOutputPath,
331468
332636
  job.duration,
331469
332637
  abortSignal,
@@ -331481,12 +332649,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331481
332649
  if (!fileServer) {
331482
332650
  fileServer = await createFileServer2({
331483
332651
  projectDir,
331484
- compiledDir: join14(workDir, "compiled"),
331485
- port: 0
332652
+ compiledDir: join15(workDir, "compiled"),
332653
+ port: 0,
332654
+ preHeadScripts: [VIRTUAL_TIME_SHIM]
331486
332655
  });
331487
332656
  assertNotAborted();
331488
332657
  }
331489
- const framesDir = join14(workDir, "captured-frames");
332658
+ const framesDir = join15(workDir, "captured-frames");
331490
332659
  if (!existsSync15(framesDir)) mkdirSync10(framesDir, { recursive: true });
331491
332660
  const captureOptions = {
331492
332661
  width,
@@ -331495,222 +332664,655 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331495
332664
  format: needsAlpha ? "png" : "jpeg",
331496
332665
  quality: needsAlpha ? void 0 : job.config.quality === "draft" ? 80 : 95
331497
332666
  };
331498
- const workerCount = calculateOptimalWorkers(job.totalFrames, job.config.workers, cfg);
332667
+ const workerCount = calculateOptimalWorkers(totalFrames, job.config.workers, cfg);
331499
332668
  const FORMAT_EXT = { mp4: ".mp4", webm: ".webm", mov: ".mov" };
331500
332669
  const videoExt = FORMAT_EXT[outputFormat] ?? ".mp4";
331501
- const videoOnlyPath = join14(workDir, `video-only${videoExt}`);
331502
- const preset = getEncoderPreset(job.config.quality, outputFormat);
331503
- const effectiveQuality = job.config.crf ?? preset.quality;
331504
- const effectiveBitrate = job.config.videoBitrate;
331505
- const baseEncoderOpts = {
331506
- fps: job.config.fps,
331507
- width,
331508
- height,
331509
- codec: preset.codec,
331510
- preset: preset.preset,
331511
- quality: effectiveQuality,
331512
- bitrate: effectiveBitrate,
331513
- pixelFormat: preset.pixelFormat,
331514
- useGpu: job.config.useGpu
331515
- };
332670
+ const videoOnlyPath = join15(workDir, `video-only${videoExt}`);
332671
+ const hasHdrContent = effectiveHdr && nativeHdrVideoIds.size > 0;
332672
+ const encoderHdr = hasHdrContent ? effectiveHdr : void 0;
332673
+ const preset = getEncoderPreset(job.config.quality, outputFormat, encoderHdr);
331516
332674
  job.framesRendered = 0;
331517
- let streamingEncoder = null;
331518
- if (enableStreamingEncode) {
331519
- streamingEncoder = await spawnStreamingEncoder(
332675
+ if (hasHdrContent) {
332676
+ log2.info("[Render] HDR layered composite: z-ordered DOM + native HLG video layers");
332677
+ const hdrVideoIds = composition.videos.filter((v) => nativeHdrVideoIds.has(v.id)).map((v) => v.id);
332678
+ const hdrVideoSrcPaths = /* @__PURE__ */ new Map();
332679
+ for (const v of composition.videos) {
332680
+ if (!hdrVideoIds.includes(v.id)) continue;
332681
+ let srcPath = v.src;
332682
+ if (!srcPath.startsWith("/")) {
332683
+ const fromCompiled = join15(compiledDir, srcPath);
332684
+ srcPath = existsSync15(fromCompiled) ? fromCompiled : join15(projectDir, srcPath);
332685
+ }
332686
+ hdrVideoSrcPaths.set(v.id, srcPath);
332687
+ }
332688
+ if (!fileServer) throw new Error("fileServer must be initialized before HDR compositing");
332689
+ const domSession = await createCaptureSession(
332690
+ fileServer.url,
332691
+ framesDir,
332692
+ captureOptions,
332693
+ createVideoFrameInjector(frameLookup),
332694
+ cfg
332695
+ );
332696
+ await initializeSession(domSession);
332697
+ assertNotAborted();
332698
+ lastBrowserConsole = domSession.browserConsoleBuffer;
332699
+ await initTransparentBackground(domSession.page);
332700
+ const transitionMeta = await domSession.page.evaluate(() => {
332701
+ return window.__hf?.transitions ?? [];
332702
+ });
332703
+ const sceneElements = await domSession.page.evaluate(() => {
332704
+ const scenes = document.querySelectorAll(".scene");
332705
+ const map22 = {};
332706
+ for (const scene of scenes) {
332707
+ const els = scene.querySelectorAll("[data-start]");
332708
+ map22[scene.id] = Array.from(els).map((e) => e.id);
332709
+ }
332710
+ return map22;
332711
+ });
332712
+ const transitionRanges = transitionMeta.map((t) => ({
332713
+ ...t,
332714
+ startFrame: Math.floor(t.time * job.config.fps),
332715
+ endFrame: Math.ceil((t.time + t.duration) * job.config.fps)
332716
+ }));
332717
+ if (transitionRanges.length > 0) {
332718
+ log2.info("[Render] Detected shader transitions for HDR compositing", {
332719
+ count: transitionRanges.length,
332720
+ transitions: transitionRanges.map((t) => ({
332721
+ shader: t.shader,
332722
+ from: t.fromScene,
332723
+ to: t.toScene,
332724
+ frames: `${t.startFrame}-${t.endFrame}`
332725
+ }))
332726
+ });
332727
+ }
332728
+ const hdrEncoder = await spawnStreamingEncoder(
331520
332729
  videoOnlyPath,
331521
332730
  {
331522
- ...baseEncoderOpts,
331523
- imageFormat: captureOptions.format || "jpeg"
332731
+ fps: job.config.fps,
332732
+ width,
332733
+ height,
332734
+ codec: preset.codec,
332735
+ preset: preset.preset,
332736
+ quality: preset.quality,
332737
+ pixelFormat: preset.pixelFormat,
332738
+ hdr: preset.hdr,
332739
+ rawInputFormat: "rgb48le"
331524
332740
  },
331525
- abortSignal
332741
+ abortSignal,
332742
+ { ffmpegStreamingTimeout: 36e5 }
331526
332743
  );
331527
332744
  assertNotAborted();
331528
- }
331529
- if (enableStreamingEncode && streamingEncoder) {
331530
- const reorderBuffer = createFrameReorderBuffer(0, job.totalFrames);
331531
- const currentEncoder = streamingEncoder;
331532
- if (workerCount > 1) {
331533
- const tasks = distributeFrames(job.totalFrames, workerCount, workDir);
331534
- const onFrameBuffer = async (frameIndex, buffer) => {
331535
- await reorderBuffer.waitForFrame(frameIndex);
331536
- currentEncoder.writeFrame(buffer);
331537
- reorderBuffer.advanceTo(frameIndex + 1);
331538
- };
331539
- await executeParallelCapture(
331540
- fileServer.url,
331541
- workDir,
331542
- tasks,
331543
- captureOptions,
331544
- () => createVideoFrameInjector(frameLookup),
331545
- abortSignal,
331546
- (progress) => {
331547
- job.framesRendered = progress.capturedFrames;
331548
- const frameProgress = progress.capturedFrames / progress.totalFrames;
331549
- const progressPct = 25 + frameProgress * 55;
331550
- if (progress.capturedFrames % 30 === 0 || progress.capturedFrames === progress.totalFrames) {
331551
- updateJobStatus(
331552
- job,
331553
- "rendering",
331554
- `Streaming frame ${progress.capturedFrames}/${progress.totalFrames} (${workerCount} workers)`,
331555
- Math.round(progressPct),
331556
- onProgress
331557
- );
331558
- }
331559
- },
331560
- onFrameBuffer,
331561
- cfg
331562
- );
331563
- if (probeSession) {
331564
- lastBrowserConsole = probeSession.browserConsoleBuffer;
331565
- await closeCaptureSession(probeSession);
331566
- probeSession = null;
332745
+ const hdrExtractionDims = /* @__PURE__ */ new Map();
332746
+ const hdrVideoStartTimes = /* @__PURE__ */ new Map();
332747
+ for (const v of composition.videos) {
332748
+ if (hdrVideoIds.includes(v.id)) {
332749
+ hdrVideoStartTimes.set(v.id, v.start);
331567
332750
  }
331568
- } else {
331569
- const videoInjector = createVideoFrameInjector(frameLookup);
331570
- const session = probeSession ?? await createCaptureSession(
331571
- fileServer.url,
331572
- framesDir,
331573
- captureOptions,
331574
- videoInjector,
331575
- cfg
331576
- );
331577
- if (probeSession) {
331578
- prepareCaptureSessionForReuse(session, framesDir, videoInjector);
331579
- probeSession = null;
332751
+ }
332752
+ const uniqueStartTimes = [...new Set(hdrVideoStartTimes.values())].sort((a, b) => a - b);
332753
+ for (const seekTime of uniqueStartTimes) {
332754
+ await domSession.page.evaluate((t) => {
332755
+ if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
332756
+ }, seekTime);
332757
+ if (domSession.onBeforeCapture) {
332758
+ await domSession.onBeforeCapture(domSession.page, seekTime);
331580
332759
  }
331581
- try {
331582
- if (!session.isInitialized) {
331583
- await initializeSession(session);
332760
+ const stacking = await queryElementStacking(domSession.page, nativeHdrVideoIds);
332761
+ for (const el of stacking) {
332762
+ if (el.isHdr && el.layoutWidth > 0 && el.layoutHeight > 0 && !hdrExtractionDims.has(el.id)) {
332763
+ hdrExtractionDims.set(el.id, { width: el.layoutWidth, height: el.layoutHeight });
331584
332764
  }
332765
+ }
332766
+ }
332767
+ const hdrFrameDirs = /* @__PURE__ */ new Map();
332768
+ for (const [videoId, srcPath] of hdrVideoSrcPaths) {
332769
+ const video = composition.videos.find((v) => v.id === videoId);
332770
+ if (!video) continue;
332771
+ const frameDir = join15(framesDir, `hdr_${videoId}`);
332772
+ mkdirSync10(frameDir, { recursive: true });
332773
+ const duration = video.end - video.start;
332774
+ const dims = hdrExtractionDims.get(videoId) ?? { width, height };
332775
+ const ffmpegArgs = [
332776
+ "-ss",
332777
+ String(video.mediaStart),
332778
+ "-i",
332779
+ srcPath,
332780
+ "-t",
332781
+ String(duration),
332782
+ "-r",
332783
+ String(job.config.fps),
332784
+ "-vf",
332785
+ `scale=${dims.width}:${dims.height}:force_original_aspect_ratio=increase,crop=${dims.width}:${dims.height}`,
332786
+ "-pix_fmt",
332787
+ "rgb48le",
332788
+ "-c:v",
332789
+ "png",
332790
+ "-y",
332791
+ join15(frameDir, "frame_%04d.png")
332792
+ ];
332793
+ const result = await runFfmpeg(ffmpegArgs, { signal: abortSignal });
332794
+ if (!result.success) {
332795
+ log2.warn("HDR frame pre-extraction failed; loop will fill with black", {
332796
+ videoId,
332797
+ srcPath,
332798
+ stderr: result.stderr.slice(-400)
332799
+ });
332800
+ }
332801
+ hdrFrameDirs.set(videoId, frameDir);
332802
+ }
332803
+ assertNotAborted();
332804
+ try {
332805
+ let countNonZeroAlpha2 = function(rgba) {
332806
+ let n = 0;
332807
+ for (let p = 3; p < rgba.length; p += 4) {
332808
+ if (rgba[p] !== 0) n++;
332809
+ }
332810
+ return n;
332811
+ }, countNonZeroRgb482 = function(buf) {
332812
+ let n = 0;
332813
+ for (let p = 0; p < buf.length; p += 6) {
332814
+ if (buf[p] !== 0 || buf[p + 1] !== 0 || buf[p + 2] !== 0) n++;
332815
+ }
332816
+ return n;
332817
+ };
332818
+ var countNonZeroAlpha = countNonZeroAlpha2, countNonZeroRgb48 = countNonZeroRgb482;
332819
+ const beforeCaptureHook = domSession.onBeforeCapture;
332820
+ const cleanedUpVideos = /* @__PURE__ */ new Set();
332821
+ const hdrVideoEndTimes = /* @__PURE__ */ new Map();
332822
+ for (const v of composition.videos) {
332823
+ if (hdrFrameDirs.has(v.id)) {
332824
+ hdrVideoEndTimes.set(v.id, v.end);
332825
+ }
332826
+ }
332827
+ const debugDumpEnabled = process.env.KEEP_TEMP === "1";
332828
+ const debugDumpDir = debugDumpEnabled ? join15(framesDir, "debug-composite") : null;
332829
+ if (debugDumpDir && !existsSync15(debugDumpDir)) {
332830
+ mkdirSync10(debugDumpDir, { recursive: true });
332831
+ }
332832
+ async function compositeToBuffer(canvas, time, fullStacking, elementFilter, debugFrameIndex = -1) {
332833
+ const filteredStacking = elementFilter ? fullStacking.filter((e) => elementFilter.has(e.id)) : fullStacking;
332834
+ const layers = groupIntoLayers(filteredStacking);
332835
+ const shouldLog = debugDumpEnabled && debugFrameIndex >= 0;
332836
+ if (shouldLog) {
332837
+ log2.info("[diag] compositeToBuffer plan", {
332838
+ frame: debugFrameIndex,
332839
+ time: time.toFixed(3),
332840
+ filterSize: elementFilter?.size,
332841
+ fullStackingCount: fullStacking.length,
332842
+ filteredCount: filteredStacking.length,
332843
+ layerCount: layers.length,
332844
+ layers: layers.map(
332845
+ (l) => l.type === "hdr" ? {
332846
+ type: "hdr",
332847
+ id: l.element.id,
332848
+ z: l.element.zIndex,
332849
+ visible: l.element.visible,
332850
+ opacity: l.element.opacity,
332851
+ bounds: `${Math.round(l.element.x)},${Math.round(l.element.y)} ${Math.round(l.element.width)}x${Math.round(l.element.height)}`
332852
+ } : { type: "dom", ids: l.elementIds }
332853
+ )
332854
+ });
332855
+ }
332856
+ for (let layerIdx = 0; layerIdx < layers.length; layerIdx++) {
332857
+ const layer = layers[layerIdx];
332858
+ if (layer.type === "hdr") {
332859
+ const before2 = shouldLog ? countNonZeroRgb482(canvas) : 0;
332860
+ blitHdrVideoLayer(
332861
+ canvas,
332862
+ layer.element,
332863
+ time,
332864
+ job.config.fps,
332865
+ hdrFrameDirs,
332866
+ hdrVideoStartTimes,
332867
+ width,
332868
+ height,
332869
+ log2,
332870
+ videoTransfers.get(layer.element.id),
332871
+ effectiveHdr?.transfer
332872
+ );
332873
+ if (shouldLog) {
332874
+ const after2 = countNonZeroRgb482(canvas);
332875
+ const frameDir = hdrFrameDirs.get(layer.element.id);
332876
+ const startTime = hdrVideoStartTimes.get(layer.element.id) ?? 0;
332877
+ const localTime = time - startTime;
332878
+ const frameNum = Math.floor(localTime * job.config.fps) + 1;
332879
+ const expectedFrame = frameDir ? join15(frameDir, `frame_${String(frameNum).padStart(4, "0")}.png`) : null;
332880
+ log2.info("[diag] hdr layer blit", {
332881
+ frame: debugFrameIndex,
332882
+ layerIdx,
332883
+ id: layer.element.id,
332884
+ pixelsAdded: after2 - before2,
332885
+ totalNonZero: after2,
332886
+ startTime,
332887
+ localTime: localTime.toFixed(3),
332888
+ hdrFrameNum: frameNum,
332889
+ expectedFrame,
332890
+ expectedFrameExists: expectedFrame ? existsSync15(expectedFrame) : false
332891
+ });
332892
+ }
332893
+ } else {
332894
+ const allElementIds = fullStacking.map((e) => e.id);
332895
+ const layerIds = new Set(layer.elementIds);
332896
+ const hideIds = allElementIds.filter((id) => !layerIds.has(id));
332897
+ await domSession.page.evaluate((t) => {
332898
+ if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
332899
+ }, time);
332900
+ if (beforeCaptureHook) {
332901
+ await beforeCaptureHook(domSession.page, time);
332902
+ }
332903
+ await applyDomLayerMask(domSession.page, layer.elementIds, hideIds);
332904
+ const domPng = await captureAlphaPng(domSession.page, width, height);
332905
+ await removeDomLayerMask(domSession.page, hideIds);
332906
+ try {
332907
+ const { data: domRgba } = decodePng(domPng);
332908
+ if (!effectiveHdr) {
332909
+ throw new Error(
332910
+ "Invariant violation: effectiveHdr is undefined inside HDR layer branch"
332911
+ );
332912
+ }
332913
+ const before2 = shouldLog ? countNonZeroRgb482(canvas) : 0;
332914
+ const alphaPixels = shouldLog ? countNonZeroAlpha2(domRgba) : 0;
332915
+ blitRgba8OverRgb48le(domRgba, canvas, width, height, effectiveHdr.transfer);
332916
+ if (shouldLog && debugDumpDir) {
332917
+ const after2 = countNonZeroRgb482(canvas);
332918
+ const dumpName = `frame_${String(debugFrameIndex).padStart(4, "0")}_layer_${String(layerIdx).padStart(2, "0")}_dom.png`;
332919
+ const dumpPath = join15(debugDumpDir, dumpName);
332920
+ writeFileSync4(dumpPath, domPng);
332921
+ log2.info("[diag] dom layer blit", {
332922
+ frame: debugFrameIndex,
332923
+ layerIdx,
332924
+ layerIds: layer.elementIds,
332925
+ hideCount: hideIds.length,
332926
+ pngBytes: domPng.length,
332927
+ alphaPixels,
332928
+ pixelsAdded: after2 - before2,
332929
+ totalNonZero: after2,
332930
+ dumpPath
332931
+ });
332932
+ }
332933
+ } catch (err) {
332934
+ log2.warn("DOM layer decode/blit failed; skipping overlay", {
332935
+ layerIds: layer.elementIds,
332936
+ error: err instanceof Error ? err.message : String(err)
332937
+ });
332938
+ }
332939
+ }
332940
+ }
332941
+ if (shouldLog && debugDumpDir) {
332942
+ const finalNonZero = countNonZeroRgb482(canvas);
332943
+ log2.info("[diag] compositeToBuffer end", {
332944
+ frame: debugFrameIndex,
332945
+ finalNonZeroPixels: finalNonZero,
332946
+ totalPixels: width * height,
332947
+ coverage: (finalNonZero / (width * height) * 100).toFixed(1) + "%"
332948
+ });
332949
+ }
332950
+ }
332951
+ const bufSize = width * height * 6;
332952
+ const hasTransitions = transitionRanges.length > 0;
332953
+ const transBufferA = hasTransitions ? Buffer.alloc(bufSize) : null;
332954
+ const transBufferB = hasTransitions ? Buffer.alloc(bufSize) : null;
332955
+ const transOutput = hasTransitions ? Buffer.alloc(bufSize) : null;
332956
+ const normalCanvas = Buffer.alloc(bufSize);
332957
+ for (let i = 0; i < totalFrames; i++) {
331585
332958
  assertNotAborted();
331586
- lastBrowserConsole = session.browserConsoleBuffer;
331587
- for (let i = 0; i < job.totalFrames; i++) {
331588
- assertNotAborted();
331589
- const time = i / job.config.fps;
331590
- const { buffer } = await captureFrameToBuffer(session, i, time);
331591
- await reorderBuffer.waitForFrame(i);
331592
- currentEncoder.writeFrame(buffer);
331593
- reorderBuffer.advanceTo(i + 1);
331594
- job.framesRendered = i + 1;
331595
- const frameProgress = (i + 1) / job.totalFrames;
331596
- const progress = 25 + frameProgress * 55;
332959
+ const time = i / job.config.fps;
332960
+ await domSession.page.evaluate((t) => {
332961
+ if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
332962
+ }, time);
332963
+ if (beforeCaptureHook) {
332964
+ await beforeCaptureHook(domSession.page, time);
332965
+ }
332966
+ const stackingInfo = await queryElementStacking(domSession.page, nativeHdrVideoIds);
332967
+ const activeTransition = transitionRanges.find(
332968
+ (t) => i >= t.startFrame && i <= t.endFrame
332969
+ );
332970
+ if (i % 30 === 0) {
332971
+ const hdrEl = stackingInfo.find((e) => e.isHdr);
332972
+ log2.debug("[Render] HDR layer composite frame", {
332973
+ frame: i,
332974
+ time: time.toFixed(2),
332975
+ hdrElement: hdrEl ? { z: hdrEl.zIndex, visible: hdrEl.visible, width: hdrEl.width } : null,
332976
+ stackingCount: stackingInfo.length,
332977
+ activeTransition: activeTransition?.shader
332978
+ });
332979
+ }
332980
+ if (activeTransition && transBufferA && transBufferB && transOutput) {
332981
+ const progress = activeTransition.endFrame === activeTransition.startFrame ? 1 : (i - activeTransition.startFrame) / (activeTransition.endFrame - activeTransition.startFrame);
332982
+ const sceneAIds = new Set(sceneElements[activeTransition.fromScene] ?? []);
332983
+ const sceneBIds = new Set(sceneElements[activeTransition.toScene] ?? []);
332984
+ transBufferA.fill(0);
332985
+ transBufferB.fill(0);
332986
+ for (const [sceneBuf, sceneIds] of [
332987
+ [transBufferA, sceneAIds],
332988
+ [transBufferB, sceneBIds]
332989
+ ]) {
332990
+ await domSession.page.evaluate((t) => {
332991
+ if (window.__hf && typeof window.__hf.seek === "function") window.__hf.seek(t);
332992
+ }, time);
332993
+ if (beforeCaptureHook) {
332994
+ await beforeCaptureHook(domSession.page, time);
332995
+ }
332996
+ for (const el of stackingInfo) {
332997
+ if (!el.isHdr || !sceneIds.has(el.id)) continue;
332998
+ blitHdrVideoLayer(
332999
+ sceneBuf,
333000
+ el,
333001
+ time,
333002
+ job.config.fps,
333003
+ hdrFrameDirs,
333004
+ hdrVideoStartTimes,
333005
+ width,
333006
+ height,
333007
+ log2,
333008
+ videoTransfers.get(el.id),
333009
+ effectiveHdr?.transfer
333010
+ );
333011
+ }
333012
+ const showIds = Array.from(sceneIds);
333013
+ const hideIds = stackingInfo.map((e) => e.id).filter((id) => !sceneIds.has(id) || nativeHdrVideoIds.has(id));
333014
+ await applyDomLayerMask(domSession.page, showIds, hideIds);
333015
+ const domPng = await captureAlphaPng(domSession.page, width, height);
333016
+ await removeDomLayerMask(domSession.page, hideIds);
333017
+ try {
333018
+ const { data: domRgba } = decodePng(domPng);
333019
+ if (!effectiveHdr) {
333020
+ throw new Error(
333021
+ "Invariant violation: effectiveHdr is undefined inside hasHdrVideo branch"
333022
+ );
333023
+ }
333024
+ blitRgba8OverRgb48le(
333025
+ domRgba,
333026
+ sceneBuf,
333027
+ width,
333028
+ height,
333029
+ effectiveHdr.transfer
333030
+ );
333031
+ } catch (err) {
333032
+ log2.warn("DOM layer decode/blit failed; skipping overlay for transition scene", {
333033
+ frameIndex: i,
333034
+ sceneIds: Array.from(sceneIds),
333035
+ error: err instanceof Error ? err.message : String(err)
333036
+ });
333037
+ }
333038
+ }
333039
+ const transitionFn = TRANSITIONS[activeTransition.shader] ?? crossfade;
333040
+ transitionFn(transBufferA, transBufferB, transOutput, width, height, progress);
333041
+ hdrEncoder.writeFrame(transOutput);
333042
+ } else {
333043
+ normalCanvas.fill(0);
333044
+ await compositeToBuffer(normalCanvas, time, stackingInfo, void 0, i);
333045
+ if (debugDumpEnabled && debugDumpDir && i % 30 === 0) {
333046
+ const previewPath = join15(
333047
+ debugDumpDir,
333048
+ `frame_${String(i).padStart(4, "0")}_final_rgb48le.bin`
333049
+ );
333050
+ writeFileSync4(previewPath, normalCanvas);
333051
+ }
333052
+ hdrEncoder.writeFrame(normalCanvas);
333053
+ }
333054
+ if (process.env.KEEP_TEMP !== "1") {
333055
+ for (const [videoId, endTime] of hdrVideoEndTimes) {
333056
+ if (time > endTime && !cleanedUpVideos.has(videoId)) {
333057
+ const stillNeeded = activeTransition && (sceneElements[activeTransition.fromScene]?.includes(videoId) || sceneElements[activeTransition.toScene]?.includes(videoId));
333058
+ if (!stillNeeded) {
333059
+ const frameDir = hdrFrameDirs.get(videoId);
333060
+ if (frameDir) {
333061
+ try {
333062
+ rmSync3(frameDir, { recursive: true, force: true });
333063
+ } catch (err) {
333064
+ log2.warn("Failed to clean up HDR frame directory", {
333065
+ videoId,
333066
+ frameDir,
333067
+ error: err instanceof Error ? err.message : String(err)
333068
+ });
333069
+ }
333070
+ }
333071
+ cleanedUpVideos.add(videoId);
333072
+ }
333073
+ }
333074
+ }
333075
+ }
333076
+ job.framesRendered = i + 1;
333077
+ if ((i + 1) % 10 === 0 || i + 1 === totalFrames) {
333078
+ const frameProgress = (i + 1) / totalFrames;
331597
333079
  updateJobStatus(
331598
333080
  job,
331599
333081
  "rendering",
331600
- `Streaming frame ${i + 1}/${job.totalFrames}`,
331601
- Math.round(progress),
333082
+ `HDR composite frame ${i + 1}/${job.totalFrames}`,
333083
+ Math.round(25 + frameProgress * 55),
331602
333084
  onProgress
331603
333085
  );
331604
333086
  }
331605
- } finally {
331606
- lastBrowserConsole = session.browserConsoleBuffer;
331607
- await closeCaptureSession(session);
331608
333087
  }
333088
+ } finally {
333089
+ lastBrowserConsole = domSession.browserConsoleBuffer;
333090
+ await closeCaptureSession(domSession);
331609
333091
  }
331610
- const encodeResult = await currentEncoder.close();
333092
+ const hdrEncodeResult = await hdrEncoder.close();
331611
333093
  assertNotAborted();
331612
- if (!encodeResult.success) {
331613
- throw new Error(`Streaming encode failed: ${encodeResult.error}`);
333094
+ if (!hdrEncodeResult.success) {
333095
+ throw new Error(`HDR encode failed: ${hdrEncodeResult.error}`);
331614
333096
  }
331615
333097
  perfStages.captureMs = Date.now() - stage4Start;
331616
- perfStages.encodeMs = encodeResult.durationMs;
333098
+ perfStages.encodeMs = hdrEncodeResult.durationMs;
331617
333099
  } else {
331618
- if (workerCount > 1) {
331619
- const tasks = distributeFrames(job.totalFrames, workerCount, workDir);
331620
- await executeParallelCapture(
331621
- fileServer.url,
331622
- workDir,
331623
- tasks,
331624
- captureOptions,
331625
- () => createVideoFrameInjector(frameLookup),
331626
- abortSignal,
331627
- (progress) => {
331628
- job.framesRendered = progress.capturedFrames;
331629
- const frameProgress = progress.capturedFrames / progress.totalFrames;
331630
- const progressPct = 25 + frameProgress * 45;
331631
- if (progress.capturedFrames % 30 === 0 || progress.capturedFrames === progress.totalFrames) {
333100
+ let streamingEncoder = null;
333101
+ if (enableStreamingEncode) {
333102
+ streamingEncoder = await spawnStreamingEncoder(
333103
+ videoOnlyPath,
333104
+ {
333105
+ fps: job.config.fps,
333106
+ width,
333107
+ height,
333108
+ codec: preset.codec,
333109
+ preset: preset.preset,
333110
+ quality: preset.quality,
333111
+ pixelFormat: preset.pixelFormat,
333112
+ useGpu: job.config.useGpu,
333113
+ imageFormat: captureOptions.format || "jpeg",
333114
+ hdr: preset.hdr
333115
+ },
333116
+ abortSignal
333117
+ );
333118
+ assertNotAborted();
333119
+ }
333120
+ if (enableStreamingEncode && streamingEncoder) {
333121
+ const reorderBuffer = createFrameReorderBuffer(0, totalFrames);
333122
+ const currentEncoder = streamingEncoder;
333123
+ if (workerCount > 1) {
333124
+ const tasks = distributeFrames(job.totalFrames, workerCount, workDir);
333125
+ const onFrameBuffer = async (frameIndex, buffer) => {
333126
+ await reorderBuffer.waitForFrame(frameIndex);
333127
+ currentEncoder.writeFrame(buffer);
333128
+ reorderBuffer.advanceTo(frameIndex + 1);
333129
+ };
333130
+ await executeParallelCapture(
333131
+ fileServer.url,
333132
+ workDir,
333133
+ tasks,
333134
+ captureOptions,
333135
+ () => createVideoFrameInjector(frameLookup),
333136
+ abortSignal,
333137
+ (progress) => {
333138
+ job.framesRendered = progress.capturedFrames;
333139
+ const frameProgress = progress.capturedFrames / progress.totalFrames;
333140
+ const progressPct = 25 + frameProgress * 55;
333141
+ if (progress.capturedFrames % 30 === 0 || progress.capturedFrames === progress.totalFrames) {
333142
+ updateJobStatus(
333143
+ job,
333144
+ "rendering",
333145
+ `Streaming frame ${progress.capturedFrames}/${progress.totalFrames} (${workerCount} workers)`,
333146
+ Math.round(progressPct),
333147
+ onProgress
333148
+ );
333149
+ }
333150
+ },
333151
+ onFrameBuffer,
333152
+ cfg
333153
+ );
333154
+ if (probeSession) {
333155
+ lastBrowserConsole = probeSession.browserConsoleBuffer;
333156
+ await closeCaptureSession(probeSession);
333157
+ probeSession = null;
333158
+ }
333159
+ } else {
333160
+ const videoInjector = createVideoFrameInjector(frameLookup);
333161
+ const session = probeSession ?? await createCaptureSession(
333162
+ fileServer.url,
333163
+ framesDir,
333164
+ captureOptions,
333165
+ videoInjector,
333166
+ cfg
333167
+ );
333168
+ if (probeSession) {
333169
+ prepareCaptureSessionForReuse(session, framesDir, videoInjector);
333170
+ probeSession = null;
333171
+ }
333172
+ try {
333173
+ if (!session.isInitialized) {
333174
+ await initializeSession(session);
333175
+ }
333176
+ assertNotAborted();
333177
+ lastBrowserConsole = session.browserConsoleBuffer;
333178
+ for (let i = 0; i < totalFrames; i++) {
333179
+ assertNotAborted();
333180
+ const time = i / job.config.fps;
333181
+ const { buffer } = await captureFrameToBuffer(session, i, time);
333182
+ await reorderBuffer.waitForFrame(i);
333183
+ currentEncoder.writeFrame(buffer);
333184
+ reorderBuffer.advanceTo(i + 1);
333185
+ job.framesRendered = i + 1;
333186
+ const frameProgress = (i + 1) / totalFrames;
333187
+ const progress = 25 + frameProgress * 55;
331632
333188
  updateJobStatus(
331633
333189
  job,
331634
333190
  "rendering",
331635
- `Capturing frame ${progress.capturedFrames}/${progress.totalFrames} (${workerCount} workers)`,
331636
- Math.round(progressPct),
333191
+ `Streaming frame ${i + 1}/${job.totalFrames}`,
333192
+ Math.round(progress),
331637
333193
  onProgress
331638
333194
  );
331639
333195
  }
331640
- },
331641
- void 0,
331642
- cfg
331643
- );
331644
- await mergeWorkerFrames(workDir, tasks, framesDir);
331645
- if (probeSession) {
331646
- lastBrowserConsole = probeSession.browserConsoleBuffer;
331647
- await closeCaptureSession(probeSession);
331648
- probeSession = null;
333196
+ } finally {
333197
+ lastBrowserConsole = session.browserConsoleBuffer;
333198
+ await closeCaptureSession(session);
333199
+ }
331649
333200
  }
331650
- } else {
331651
- const videoInjector = createVideoFrameInjector(frameLookup);
331652
- const session = probeSession ?? await createCaptureSession(
331653
- fileServer.url,
331654
- framesDir,
331655
- captureOptions,
331656
- videoInjector,
331657
- cfg
331658
- );
331659
- if (probeSession) {
331660
- prepareCaptureSessionForReuse(session, framesDir, videoInjector);
331661
- probeSession = null;
333201
+ const encodeResult = await currentEncoder.close();
333202
+ assertNotAborted();
333203
+ if (!encodeResult.success) {
333204
+ throw new Error(`Streaming encode failed: ${encodeResult.error}`);
331662
333205
  }
331663
- try {
331664
- if (!session.isInitialized) {
331665
- await initializeSession(session);
333206
+ perfStages.captureMs = Date.now() - stage4Start;
333207
+ perfStages.encodeMs = encodeResult.durationMs;
333208
+ } else {
333209
+ if (workerCount > 1) {
333210
+ const tasks = distributeFrames(job.totalFrames, workerCount, workDir);
333211
+ await executeParallelCapture(
333212
+ fileServer.url,
333213
+ workDir,
333214
+ tasks,
333215
+ captureOptions,
333216
+ () => createVideoFrameInjector(frameLookup),
333217
+ abortSignal,
333218
+ (progress) => {
333219
+ job.framesRendered = progress.capturedFrames;
333220
+ const frameProgress = progress.capturedFrames / progress.totalFrames;
333221
+ const progressPct = 25 + frameProgress * 45;
333222
+ if (progress.capturedFrames % 30 === 0 || progress.capturedFrames === progress.totalFrames) {
333223
+ updateJobStatus(
333224
+ job,
333225
+ "rendering",
333226
+ `Capturing frame ${progress.capturedFrames}/${progress.totalFrames} (${workerCount} workers)`,
333227
+ Math.round(progressPct),
333228
+ onProgress
333229
+ );
333230
+ }
333231
+ },
333232
+ void 0,
333233
+ cfg
333234
+ );
333235
+ await mergeWorkerFrames(workDir, tasks, framesDir);
333236
+ if (probeSession) {
333237
+ lastBrowserConsole = probeSession.browserConsoleBuffer;
333238
+ await closeCaptureSession(probeSession);
333239
+ probeSession = null;
331666
333240
  }
331667
- assertNotAborted();
331668
- lastBrowserConsole = session.browserConsoleBuffer;
331669
- for (let i = 0; i < job.totalFrames; i++) {
333241
+ } else {
333242
+ const videoInjector = createVideoFrameInjector(frameLookup);
333243
+ const session = probeSession ?? await createCaptureSession(
333244
+ fileServer.url,
333245
+ framesDir,
333246
+ captureOptions,
333247
+ videoInjector,
333248
+ cfg
333249
+ );
333250
+ if (probeSession) {
333251
+ prepareCaptureSessionForReuse(session, framesDir, videoInjector);
333252
+ probeSession = null;
333253
+ }
333254
+ try {
333255
+ if (!session.isInitialized) {
333256
+ await initializeSession(session);
333257
+ }
331670
333258
  assertNotAborted();
331671
- const time = i / job.config.fps;
331672
- await captureFrame(session, i, time);
331673
- job.framesRendered = i + 1;
331674
- const frameProgress = (i + 1) / job.totalFrames;
331675
- const progress = 25 + frameProgress * 45;
331676
- updateJobStatus(
331677
- job,
331678
- "rendering",
331679
- `Capturing frame ${i + 1}/${job.totalFrames}`,
331680
- Math.round(progress),
331681
- onProgress
331682
- );
333259
+ lastBrowserConsole = session.browserConsoleBuffer;
333260
+ for (let i = 0; i < job.totalFrames; i++) {
333261
+ assertNotAborted();
333262
+ const time = i / job.config.fps;
333263
+ await captureFrame(session, i, time);
333264
+ job.framesRendered = i + 1;
333265
+ const frameProgress = (i + 1) / job.totalFrames;
333266
+ const progress = 25 + frameProgress * 45;
333267
+ updateJobStatus(
333268
+ job,
333269
+ "rendering",
333270
+ `Capturing frame ${i + 1}/${job.totalFrames}`,
333271
+ Math.round(progress),
333272
+ onProgress
333273
+ );
333274
+ }
333275
+ } finally {
333276
+ lastBrowserConsole = session.browserConsoleBuffer;
333277
+ await closeCaptureSession(session);
331683
333278
  }
331684
- } finally {
331685
- lastBrowserConsole = session.browserConsoleBuffer;
331686
- await closeCaptureSession(session);
331687
333279
  }
333280
+ perfStages.captureMs = Date.now() - stage4Start;
333281
+ const stage5Start = Date.now();
333282
+ updateJobStatus(job, "encoding", "Encoding video", 75, onProgress);
333283
+ const frameExt = needsAlpha ? "png" : "jpg";
333284
+ const framePattern = `frame_%06d.${frameExt}`;
333285
+ const encoderOpts = {
333286
+ fps: job.config.fps,
333287
+ width,
333288
+ height,
333289
+ codec: preset.codec,
333290
+ preset: preset.preset,
333291
+ quality: preset.quality,
333292
+ pixelFormat: preset.pixelFormat,
333293
+ useGpu: job.config.useGpu,
333294
+ hdr: preset.hdr
333295
+ };
333296
+ const encodeResult = enableChunkedEncode ? await encodeFramesChunkedConcat(
333297
+ framesDir,
333298
+ framePattern,
333299
+ videoOnlyPath,
333300
+ encoderOpts,
333301
+ chunkedEncodeSize,
333302
+ abortSignal
333303
+ ) : await encodeFramesFromDir(
333304
+ framesDir,
333305
+ framePattern,
333306
+ videoOnlyPath,
333307
+ encoderOpts,
333308
+ abortSignal
333309
+ );
333310
+ assertNotAborted();
333311
+ if (!encodeResult.success) {
333312
+ throw new Error(`Encoding failed: ${encodeResult.error}`);
333313
+ }
333314
+ perfStages.encodeMs = Date.now() - stage5Start;
331688
333315
  }
331689
- perfStages.captureMs = Date.now() - stage4Start;
331690
- const stage5Start = Date.now();
331691
- updateJobStatus(job, "encoding", "Encoding video", 75, onProgress);
331692
- const frameExt = needsAlpha ? "png" : "jpg";
331693
- const framePattern = `frame_%06d.${frameExt}`;
331694
- const encoderOpts = baseEncoderOpts;
331695
- const encodeResult = enableChunkedEncode ? await encodeFramesChunkedConcat(
331696
- framesDir,
331697
- framePattern,
331698
- videoOnlyPath,
331699
- encoderOpts,
331700
- chunkedEncodeSize,
331701
- abortSignal
331702
- ) : await encodeFramesFromDir(
331703
- framesDir,
331704
- framePattern,
331705
- videoOnlyPath,
331706
- encoderOpts,
331707
- abortSignal
331708
- );
331709
- assertNotAborted();
331710
- if (!encodeResult.success) {
331711
- throw new Error(`Encoding failed: ${encodeResult.error}`);
331712
- }
331713
- perfStages.encodeMs = Date.now() - stage5Start;
331714
333316
  }
331715
333317
  if (probeSession !== null) {
331716
333318
  const remainingProbeSession = probeSession;
@@ -331754,12 +333356,12 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331754
333356
  chunkedEncode: enableChunkedEncode,
331755
333357
  chunkSizeFrames: enableChunkedEncode ? chunkedEncodeSize : null,
331756
333358
  compositionDurationSeconds: composition.duration,
331757
- totalFrames: job.totalFrames,
333359
+ totalFrames,
331758
333360
  resolution: { width, height },
331759
333361
  videoCount: composition.videos.length,
331760
333362
  audioCount: composition.audios.length,
331761
333363
  stages: perfStages,
331762
- captureAvgMs: job.totalFrames > 0 ? Math.round((perfStages.captureMs ?? 0) / job.totalFrames) : void 0
333364
+ captureAvgMs: totalFrames > 0 ? Math.round((perfStages.captureMs ?? 0) / totalFrames) : void 0
331763
333365
  };
331764
333366
  job.perfSummary = perfSummary;
331765
333367
  if (job.config.debug) {
@@ -331774,9 +333376,11 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
331774
333376
  }
331775
333377
  if (job.config.debug) {
331776
333378
  if (existsSync15(outputPath)) {
331777
- const debugOutput = join14(workDir, `output${videoExt}`);
333379
+ const debugOutput = join15(workDir, `output${videoExt}`);
331778
333380
  copyFileSync2(outputPath, debugOutput);
331779
333381
  }
333382
+ } else if (process.env.KEEP_TEMP === "1") {
333383
+ log2.info("KEEP_TEMP=1 \u2014 leaving workDir on disk for inspection", { workDir });
331780
333384
  } else {
331781
333385
  await safeCleanup(
331782
333386
  "remove workDir",
@@ -331892,7 +333496,7 @@ function pickEntryFile(files, preferredEntryFile) {
331892
333496
  return null;
331893
333497
  }
331894
333498
  function readProjectEntryFile(projectDir, preferredEntryFile) {
331895
- const absProjectDir = resolve102(projectDir);
333499
+ const absProjectDir = resolve11(projectDir);
331896
333500
  if (!existsSync16(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
331897
333501
  return { error: `Project directory not found: ${absProjectDir}` };
331898
333502
  }
@@ -331900,7 +333504,7 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
331900
333504
  (value) => typeof value === "string" && value.trim().length > 0
331901
333505
  );
331902
333506
  for (const entryFile of entryCandidates) {
331903
- const absoluteEntryPath = resolve102(absProjectDir, entryFile);
333507
+ const absoluteEntryPath = resolve11(absProjectDir, entryFile);
331904
333508
  if (!absoluteEntryPath.startsWith(absProjectDir)) {
331905
333509
  return { error: `Entry file must stay inside project directory: ${entryFile}` };
331906
333510
  }
@@ -331913,7 +333517,7 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
331913
333517
  }
331914
333518
  }
331915
333519
  return {
331916
- error: `No HTML entry file found in project directory: ${join15(absProjectDir, preferredEntryFile || "index.html")}`
333520
+ error: `No HTML entry file found in project directory: ${join16(absProjectDir, preferredEntryFile || "index.html")}`
331917
333521
  };
331918
333522
  }
331919
333523
  function prepareHyperframeLintBody(body) {
@@ -331952,13 +333556,6 @@ function prepareHyperframeLintBody(body) {
331952
333556
  function runHyperframeLint(prepared) {
331953
333557
  return lintHyperframeHtml(prepared.html, { filePath: prepared.entryFile });
331954
333558
  }
331955
- function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
331956
- const absoluteProjectDir = resolve11(projectDir);
331957
- const projectName = basename22(absoluteProjectDir);
331958
- const resolvedOutputPath = outputPath ?? join16(rendersDir, `${projectName}.mp4`);
331959
- const absoluteOutputPath = resolve11(resolvedOutputPath);
331960
- return { absoluteProjectDir, absoluteOutputPath };
331961
- }
331962
333559
  function parseRenderOptions(body) {
331963
333560
  const fps = [24, 30, 60].includes(body.fps) ? body.fps : 30;
331964
333561
  const quality = ["draft", "standard", "high"].includes(body.quality) ? body.quality : "high";
@@ -332399,9 +333996,9 @@ function startServer(options = {}) {
332399
333996
  process.on("SIGINT", () => shutdown("SIGINT"));
332400
333997
  return server3;
332401
333998
  }
332402
- var import_esbuild, __create2, __defProp2, __getOwnPropDesc2, __getOwnPropNames2, __getProtoOf2, __hasOwnProp2, __require2, __esm2, __commonJS2, __export2, __copyProps2, __toESM2, __toCommonJS2, require_boolbase, require_types3, require_parse3, require_stringify2, require_commonjs, require_StyleSheet, require_CSSRule, require_CSSStyleRule, require_CSSStyleSheet, require_MediaList, require_CSSImportRule, require_CSSGroupingRule, require_CSSConditionRule, require_CSSMediaRule, require_CSSSupportsRule, require_CSSFontFaceRule, require_CSSHostRule, require_CSSKeyframeRule, require_CSSKeyframesRule, require_CSSValue, require_CSSValueExpression, require_MatcherList, require_CSSDocumentRule, require_parse22, require_CSSStyleDeclaration, require_clone, require_lib3, require_canvas_shim, require_canvas, extendStatics3, UnsubscriptionError2, Subscription2, EMPTY_SUBSCRIPTION2, config2, timeoutProvider2, COMPLETE_NOTIFICATION2, context2, Subscriber2, _bind2, ConsumerObserver2, SafeSubscriber2, EMPTY_OBSERVER2, observable2, Observable2, OperatorSubscriber2, ObjectUnsubscribedError2, Subject2, AnonymousSubject2, dateTimestampProvider2, ReplaySubject2, Action2, intervalProvider2, AsyncAction2, Scheduler2, AsyncScheduler2, asyncScheduler2, async2, EMPTY2, isArrayLike2, iterator2, EmptyError2, isArray22, isArray222, getPrototypeOf2, objectProto2, getKeys2, nodeEventEmitterMethods2, eventTargetMethods2, jqueryMethods2, NEVER2, isArray32, init_rxjs2, init_mitt3, disposeSymbol2, asyncDisposeSymbol2, DisposableStackPolyfill2, DisposableStack2, AsyncDisposableStackPolyfill2, AsyncDisposableStack2, SuppressedErrorPolyfill2, SuppressedError22, init_disposable2, EventEmitter4, init_EventEmitter2, isNode2, environment2, init_environment2, assert3, init_assert2, init_encoding2, packageVersion3, init_version2, require_ms2, require_common5, require_browser2, require_has_flag2, require_supports_color2, require_node4, require_src2, debugModule2, debug6, capturedLogs2, captureLogs2, init_Debug2, PuppeteerError2, TimeoutError3, TouchError2, ProtocolError2, UnsupportedOperation2, TargetCloseError2, ConnectionClosedError2, init_Errors2, paperFormats2, init_PDFOptions2, debugError2, DEFAULT_VIEWPORT2, SOURCE_URL2, PuppeteerURL2, withSourcePuppeteerURLIfNone2, getSourcePuppeteerURLIfAvailable2, isString2, isNumber3, isPlainObject2, isRegExp2, isDate2, VALID_DIALOG_TYPES2, UTILITY_WORLD_NAME2, SOURCE_URL_REGEX2, NETWORK_IDLE_TIME2, unitToPixels2, init_util4, WEB_PERMISSION_TO_PROTOCOL_PERMISSION2, Browser4, init_Browser5, Deferred2, init_Deferred2, Mutex2, init_Mutex2, BrowserContext2, init_BrowserContext4, CDPSessionEvent2, CDPSession2, init_CDPSession3, DeviceRequestPrompt2, init_DeviceRequestPrompt4, Dialog2, init_Dialog4, AsyncIterableUtil2, init_AsyncIterableUtil2, _isElementHandle2, init_ElementHandleSymbol2, init_ErrorLike2, createdFunctions2, createFunction2, interpolateFunction2, init_Function2, __addDisposableResource21, __disposeResources21, DEFAULT_BATCH_SIZE2, init_HandleIterator2, LazyArg2, init_LazyArg2, __addDisposableResource22, __disposeResources22, QueryHandler2, init_QueryHandler2, isKnownAttribute2, ATTRIBUTE_REGEXP2, parseARIASelector2, ARIAQueryHandler2, init_AriaQueryHandler2, CSSQueryHandler2, init_CSSQueryHandler2, source2, init_injected2, ScriptInjector2, scriptInjector2, init_ScriptInjector2, CustomQueryHandlerRegistry2, customQueryHandlers2, init_CustomQueryHandler2, PierceQueryHandler2, init_PierceQueryHandler2, PQueryHandler2, init_PQueryHandler2, TOKENS2, TRIM_TOKENS2, getArgumentPatternByType2, STRING_PATTERN2, ESCAPE_PATTERN2, init_parsel_js2, ESCAPE_REGEXP2, unquote2, init_PSelectorParser2, TextQueryHandler2, init_TextQueryHandler2, XPathQueryHandler2, init_XPathQueryHandler2, BUILTIN_QUERY_HANDLERS2, QUERY_SEPARATORS2, init_GetQueryHandler2, __addDisposableResource32, __disposeResources32, instances2, bubbleHandlers2, bubbleInitializer2, init_decorators2, __runInitializers24, __esDecorate24, __addDisposableResource42, __disposeResources42, JSHandle2, init_JSHandle4, __addDisposableResource52, __disposeResources52, LocatorEvent2, Locator2, FunctionLocator2, DelegatedLocator2, FilteredLocator2, MappedLocator2, NodeLocator2, RaceLocator2, RETRY_DELAY2, init_locators2, __runInitializers25, __esDecorate25, __addDisposableResource62, __disposeResources62, __setFunctionName7, ElementHandle2, init_ElementHandle4, __runInitializers32, __esDecorate32, __addDisposableResource72, __disposeResources72, FrameEvent2, throwIfDetached2, Frame2, init_Frame4, DEFAULT_INTERCEPT_RESOLUTION_PRIORITY2, HTTPRequest2, InterceptResolutionAction2, STATUS_TEXTS2, errorReasons2, init_HTTPRequest4, HTTPResponse2, init_HTTPResponse4, init_incremental_id_generator2, Keyboard2, MouseButton2, Mouse2, Touchscreen2, init_Input4, DEFAULT_TIMEOUT2, TimeoutSettings2, init_TimeoutSettings2, __runInitializers42, __esDecorate42, __addDisposableResource82, __disposeResources82, Page2, supportedMetrics3, init_Page4, WaitTask2, TaskManager2, init_WaitTask2, Realm3, init_Realm4, TargetType2, Target2, init_Target4, WebWorker2, init_WebWorker4, init_api2, __addDisposableResource92, __disposeResources92, Accessibility2, AXNode2, init_Accessibility2, __addDisposableResource102, __disposeResources102, Binding2, init_Binding2, CdpBluetoothEmulation2, init_BluetoothEmulation3, ConsoleMessage2, init_ConsoleMessage2, FileChooser2, init_FileChooser2, NetworkManagerEvent2, init_NetworkManagerEvents2, CallbackRegistry2, Callback2, init_CallbackRegistry2, CdpCDPSession2, init_CdpSession2, debugProtocolSend3, debugProtocolReceive3, Connection2, init_Connection3, Coverage2, JSCoverage2, CSSCoverage2, init_Coverage2, CdpDialog2, init_Dialog22, __runInitializers52, __esDecorate52, __setFunctionName22, EmulatedState2, EmulationManager2, init_EmulationManager2, CdpPreloadScript2, init_CdpPreloadScript2, CdpDeviceRequestPrompt2, CdpDeviceRequestPromptManager2, init_DeviceRequestPrompt22, getErrorDetails2, CDP_BINDING_PREFIX2, init_utils2, CdpJSHandle2, init_JSHandle22, __runInitializers62, __esDecorate62, NON_ELEMENT_NODE_ROLES2, CdpElementHandle2, init_ElementHandle22, __addDisposableResource112, __disposeResources112, ariaQuerySelectorBinding2, ariaQuerySelectorAllBinding2, ExecutionContext2, rewriteError22, init_ExecutionContext2, FrameManagerEvent2, init_FrameManagerEvents2, IsolatedWorld2, init_IsolatedWorld2, MAIN_WORLD2, PUPPETEER_WORLD2, init_IsolatedWorlds2, puppeteerToProtocolLifecycle2, LifecycleWatcher2, init_LifecycleWatcher2, __runInitializers72, __esDecorate72, CdpFrame2, init_Frame22, FrameTree2, init_FrameTree2, CdpHTTPRequest2, init_HTTPRequest22, SecurityDetails2, init_SecurityDetails2, CdpHTTPResponse2, init_HTTPResponse22, NetworkEventManager2, init_NetworkEventManager2, NetworkManager2, init_NetworkManager2, TIME_FOR_WAITING_FOR_SWAP2, FrameManager2, init_FrameManager2, _keyDefinitions2, init_USKeyboardLayout2, CdpKeyboard2, getFlag2, getButtonFromPressedButtons2, CdpMouse2, CdpTouchHandle2, CdpTouchscreen2, init_Input22, Tracing2, init_Tracing2, CdpWebWorker2, init_WebWorker22, __addDisposableResource122, __disposeResources122, CdpPage2, supportedMetrics22, init_Page22, __addDisposableResource132, __disposeResources132, CdpBrowserContext2, init_BrowserContext22, InitializationStatus2, CdpTarget2, PageTarget2, DevToolsTarget2, WorkerTarget2, OtherTarget2, init_Target22, TargetManager2, init_TargetManager2, CdpBrowser2, init_Browser22, init_BrowserConnector4, tabTargetInfo2, pageTargetInfo2, ExtensionTransport2, init_ExtensionTransport2, PredefinedNetworkConditions2, init_PredefinedNetworkConditions2, init_TargetManageEvents2, init_cdp2, BrowserWebSocketTransport_exports2, BrowserWebSocketTransport2, init_BrowserWebSocketTransport2, knownDevices2, knownDevicesByName2, KnownDevices2, init_Device2, mitt_exports2, init_mitt22, require_EventEmitter2, require_log2, require_ProcessingQueue2, require_cdp2, require_chromium_bidi2, require_webdriver_bidi2, require_ErrorResponse2, require_webdriver_bidi_permissions2, require_webdriver_bidi_bluetooth2, require_webdriver_bidi_nav_speculation2, require_webdriver_bidi_ua_client_hints2, require_protocol2, require_BidiNoOpParser2, require_BrowserProcessor2, require_CdpProcessor2, require_BrowsingContextProcessor2, require_EmulationProcessor2, require_assert2, require_graphemeTools2, require_InputSource2, require_keyUtils2, require_USKeyboardLayout2, require_ActionDispatcher2, require_Mutex2, require_InputState2, require_InputStateManager2, require_InputProcessor2, require_base644, require_NetworkUtils2, require_NetworkProcessor2, require_PermissionsProcessor2, require_uuid2, require_ChannelProxy2, require_PreloadScript2, require_ScriptProcessor2, require_SessionProcessor2, require_StorageProcessor2, require_WebExtensionProcessor2, require_OutgoingMessage2, require_CommandProcessor2, require_BluetoothProcessor2, require_ContextConfig2, require_ContextConfigStorage2, require_UserContextStorage2, require_Deferred2, require_time2, require_unitConversions2, require_SharedId2, require_Realm2, require_WindowRealm2, require_urlHelpers2, require_NavigationTracker2, require_BrowsingContextImpl2, require_WorkerRealm2, require_logHelper2, require_LogManager2, require_CollectorsStorage2, require_DefaultMap2, require_NetworkRequest2, require_NetworkStorage2, require_CdpTarget2, require_CdpTargetManager2, require_BrowsingContextStorage2, require_PreloadScriptStorage2, require_RealmStorage2, require_Buffer2, require_IdWrapper2, require_events2, require_SubscriptionManager2, require_EventManager2, require_SpeculationProcessor2, require_BidiServer2, require_BidiMapper2, BidiCdpSession2, init_CDPSession22, debugProtocolSend22, debugProtocolReceive22, BidiConnection2, init_Connection22, BidiMapper2, bidiServerLogger2, CdpConnectionAdapter2, CDPClientAdapter2, NoOpTransport2, init_BidiOverCdp2, BidiBluetoothEmulation2, init_BluetoothEmulation22, BidiDeviceRequestPromptManager2, BidiDeviceRequestPrompt2, init_DeviceRequestPrompt32, __runInitializers82, __esDecorate82, Navigation2, init_Navigation2, __runInitializers92, __esDecorate92, _a32, Realm22, WindowRealm2, DedicatedWorkerRealm2, SharedWorkerRealm2, init_Realm22, __runInitializers102, __esDecorate102, Request22, init_Request2, __runInitializers112, __esDecorate112, UserPrompt2, init_UserPrompt2, __runInitializers122, __esDecorate122, BrowsingContext2, init_BrowsingContext2, __runInitializers132, __esDecorate132, UserContext2, init_UserContext2, BidiDeserializer2, init_Deserializer2, BidiJSHandle2, init_JSHandle32, __runInitializers142, __esDecorate142, __addDisposableResource142, __disposeResources142, BidiElementHandle2, init_ElementHandle32, BidiDialog2, init_Dialog32, __addDisposableResource152, __disposeResources152, ExposableFunction2, init_ExposedFunction2, __runInitializers152, __esDecorate152, BidiHTTPResponse2, init_HTTPResponse32, _a4, requests2, BidiHTTPRequest2, init_HTTPRequest32, UnserializableError2, BidiSerializer2, init_Serializer2, init_util22, __addDisposableResource162, __disposeResources162, BidiRealm2, BidiFrameRealm2, BidiWorkerRealm2, init_Realm32, BidiWebWorker2, init_WebWorker32, __runInitializers162, __esDecorate162, __setFunctionName32, BidiFrame2, init_Frame32, SourceActionsType2, ActionType2, getBidiKeyValue2, BidiKeyboard2, getBidiButton2, BidiMouse2, BidiTouchHandle2, BidiTouchscreen2, init_Input32, __esDecorate172, __runInitializers172, __addDisposableResource172, __disposeResources172, BidiPage2, CDP_SPECIFIC_PREFIX2, init_Page32, BidiBrowserTarget2, BidiPageTarget2, BidiFrameTarget2, BidiWorkerTarget2, init_Target32, __esDecorate182, __runInitializers182, __addDisposableResource182, __disposeResources182, BidiBrowserContext2, init_BrowserContext32, __runInitializers192, __esDecorate192, __addDisposableResource192, __disposeResources192, Browser22, init_Browser32, __runInitializers202, __esDecorate202, Session2, init_Session2, __esDecorate212, __runInitializers212, __setFunctionName42, BidiBrowser2, init_Browser42, bidi_exports2, init_bidi2, init_BrowserConnector22, require_constants7, require_buffer_util2, require_limiter2, require_permessage_deflate2, require_validation2, require_receiver2, require_sender2, require_event_target2, require_extension2, require_websocket2, require_stream2, require_subprotocol2, require_websocket_server2, import_stream4, import_receiver2, import_sender2, import_websocket2, import_websocket_server2, wrapper_default2, init_wrapper2, NodeWebSocketTransport_exports2, NodeWebSocketTransport2, init_NodeWebSocketTransport2, Browser32, BrowserPlatform2, BrowserTag2, ChromeReleaseChannel2, init_types2, require_constants22, require_debug3, require_re2, require_parse_options2, require_identifiers2, require_semver3, require_parse32, require_valid3, require_clean2, require_inc2, require_diff2, require_major2, require_minor2, require_patch2, require_prerelease2, require_compare2, require_rcompare2, require_compare_loose2, require_compare_build2, require_sort2, require_rsort2, require_gt2, require_lt2, require_eq2, require_neq2, require_gte2, require_lte2, require_cmp2, require_coerce2, require_lrucache2, require_range2, require_comparator2, require_satisfies2, require_to_comparators2, require_max_satisfying2, require_min_satisfying2, require_min_version2, require_valid22, require_outside2, require_gtr2, require_ltr2, require_intersects2, require_simplify2, require_subset2, require_semver22, require_lru_cache2, require_helpers4, require_dist13, require_proxy_from_env2, require_dist22, require_parse_proxy_response2, require_dist32, require_utils3, require_smartbuffer2, require_constants32, require_util6, require_common22, require_constants42, require_address_error2, require_ipv42, require_constants52, require_helpers22, require_regular_expressions2, require_ipv62, require_ip_address2, require_helpers32, require_receivebuffer2, require_socksclient2, require_build3, require_dist42, require_common32, require_node22, require_notmodified2, require_data2, require_notfound2, require_file2, require_parseControlResponse2, require_FtpContext2, require_FileInfo2, require_parseListDOS2, require_parseListUnix2, require_parseListMLSD2, require_parseList2, require_ProgressTracker2, require_StringWriter2, require_netUtils2, require_transfer2, require_Client2, require_StringEncoding2, require_dist52, require_ftp2, require_http_error2, require_http2, require_https2, require_dist62, require_estraverse2, require_ast2, require_code2, require_keyword3, require_utils22, require_base6422, require_base64_vlq3, require_util22, require_array_set3, require_mapping_list3, require_source_map_generator3, require_binary_search3, require_quick_sort3, require_source_map_consumer3, require_source_node3, require_source_map3, require_package2, require_escodegen2, require_esprima3, tslib_es6_exports2, extendStatics22, __assign2, __createBinding2, __setModuleDefault2, ownKeys2, _SuppressedError2, tslib_es6_default2, init_tslib_es62, require_types22, require_path2, require_scope2, require_node_path2, require_path_visitor2, require_equiv2, require_fork2, require_shared2, require_core3, require_es62, require_es72, require_es20202, require_jsx2, require_type_annotations2, require_flow2, require_esprima22, require_babel_core2, require_babel2, require_typescript3, require_es_proposals2, require_namedTypes2, require_main3, require_degenerator2, require_compile2, require_dist72, require_dateRange2, require_dnsDomainIs2, require_dnsDomainLevels2, require_util32, require_dnsResolve2, require_netmask2, require_isInNet2, require_isPlainHostName2, require_isResolvable2, require_localHostOrDomainIs2, require_ip2, require_myIpAddress2, require_shExpMatch2, require_timeRange2, require_weekdayRange2, require_dist82, require_esmHelpers2, require_debug22, require_errors2, require_asyncify_helpers2, require_lifetime2, require_deferred_promise2, require_memory2, require_types_ffi2, require_types32, require_context2, require_runtime2, require_module2, require_context_asyncify2, require_runtime_asyncify2, require_module_asyncify2, require_ffi_WASM_RELEASE_SYNC2, require_emscripten_module_WASM_RELEASE_SYNC2, require_variants2, require_vm_interface2, require_module_test2, require_dist92, require_dist102, require_dist112, import_proxy_agent2, init_httpUtil2, import_semver2, baseVersionUrl3, WINDOWS_ENV_PARAM_NAMES2, init_chrome2, init_chrome_headless_shell2, init_chromedriver2, init_chromium2, FirefoxChannel2, baseVersionUrl22, init_firefox2, downloadUrls2, downloadPaths2, executablePathByBrowser2, versionComparators2, init_browser_data2, init_detectPlatform2, import_debug7, debugCache2, InstalledBrowser2, Cache2, init_Cache2, import_debug22, init_debug2, debugLaunch2, CDP_WEBSOCKET_ENDPOINT_REGEX2, WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX2, processListeners2, dispatchers2, Process2, PROCESS_ERROR_EXPLANATION2, TimeoutError22, init_launch2, require_node_progress2, require_progress2, DefaultProvider2, init_DefaultProvider2, require_wrappy2, require_once2, require_end_of_stream2, require_pump2, require_buffer_stream2, require_get_stream2, require_pend2, require_fd_slicer2, require_buffer_crc322, require_yauzl2, require_extract_zip2, require_default3, require_fixed_size2, require_fast_fifo2, require_b4a2, require_pass_through_decoder2, require_utf8_decoder2, require_text_decoder2, require_streamx2, require_headers2, require_extract2, require_constants62, require_pack2, require_tar_stream2, require_tar_fs2, import_debug42, debugFileUtil2, internalConstantsForTesting2, init_fileUtil2, import_progress2, debugInstall2, times2, init_install2, align2, top2, right2, bottom2, left2, UI2, mixin3, init_lib4, ansi2, init_string_utils3, init_cliui2, init_sync2, init_string_utils22, init_tokenize_arg_string2, DefaultValuesForTypeKey2, init_yargs_parser_types2, mixin22, YargsParser2, init_yargs_parser2, _a5, _b2, _c2, minNodeVersion2, nodeVersion2, env3, parser2, yargsParser2, lib_default2, init_lib22, init_process_argv2, YError2, init_yerror2, node_default2, init_node3, shim3, Y18N2, init_lib32, y18n22, y18n_default2, init_y18n2, REQUIRE_ERROR2, REQUIRE_DIRECTORY_ERROR2, __dirname22, mainFilename2, esm_default3, init_esm3, init_common_types2, init_is_promise2, init_parse_command2, positionName2, init_argsert2, GlobalMiddleware2, init_middleware2, init_maybe_async_result2, init_which_module2, DEFAULT_MARKER2, CommandInstance2, init_command2, init_obj_filter2, init_set_blocking2, init_usage2, completionShTemplate2, completionZshTemplate2, init_completion_templates2, Completion2, init_completion2, init_levenshtein2, specialKeys2, init_validation2, previouslyVisitedConfigs2, shim22, init_apply_extends2, __classPrivateFieldSet22, __classPrivateFieldGet22, _YargsInstance_command2, _YargsInstance_cwd2, _YargsInstance_context2, _YargsInstance_completion2, _YargsInstance_completionCommand2, _YargsInstance_defaultShowHiddenOpt2, _YargsInstance_exitError2, _YargsInstance_detectLocale2, _YargsInstance_emittedWarnings2, _YargsInstance_exitProcess2, _YargsInstance_frozens2, _YargsInstance_globalMiddleware2, _YargsInstance_groups2, _YargsInstance_hasOutput2, _YargsInstance_helpOpt2, _YargsInstance_isGlobalContext2, _YargsInstance_logger2, _YargsInstance_output2, _YargsInstance_options2, _YargsInstance_parentRequire2, _YargsInstance_parserConfig2, _YargsInstance_parseFn2, _YargsInstance_parseContext2, _YargsInstance_pkgs2, _YargsInstance_preservedGroups2, _YargsInstance_processArgs2, _YargsInstance_recommendCommands2, _YargsInstance_shim2, _YargsInstance_strict2, _YargsInstance_strictCommands2, _YargsInstance_strictOptions2, _YargsInstance_usage2, _YargsInstance_usageConfig2, _YargsInstance_versionOpt2, _YargsInstance_validation2, kCopyDoubleDash2, kCreateLogger2, kDeleteFromParserHintObject2, kEmitWarning2, kFreeze2, kGetDollarZero2, kGetParserConfiguration2, kGetUsageConfiguration2, kGuessLocale2, kGuessVersion2, kParsePositionalNumbers2, kPkgUp2, kPopulateParserHintArray2, kPopulateParserHintSingleValueDictionary2, kPopulateParserHintArrayDictionary2, kPopulateParserHintDictionary2, kSanitizeKey2, kSetKey2, kUnfreeze2, kValidateAsync2, kGetCommandInstance2, kGetContext2, kGetHasOutput2, kGetLoggerInstance2, kGetParseContext2, kGetUsageInstance2, kGetValidationInstance2, kHasParseCallback2, kIsGlobalContext2, kPostProcess2, kRebase2, kReset2, kRunYargsParserAndExecuteCommands2, kRunValidation2, kSetHasOutput2, kTrackManuallySetKeys2, YargsInstance2, init_yargs_factory2, yargs_exports2, Yargs2, yargs_default2, init_yargs2, helpers_exports2, applyExtends22, init_helpers2, packageVersion22, CLI2, init_CLI2, init_provider2, main_exports2, init_main2, LaunchOptions_exports2, init_LaunchOptions2, getWebSocketTransportClass2, init_BrowserConnector32, Puppeteer2, init_Puppeteer2, TaskQueue2, init_TaskQueue2, init_common2, PUPPETEER_REVISIONS2, init_revisions2, init_util32, init_index_browser2, PipeTransport2, init_PipeTransport2, BrowserLauncher2, init_BrowserLauncher2, rmOptions2, init_fs2, ChromeLauncher2, init_ChromeLauncher2, FirefoxLauncher2, init_FirefoxLauncher2, PuppeteerNode2, init_PuppeteerNode2, import_debug62, __runInitializers232, __esDecorate232, __setFunctionName62, CRF_VALUE2, DEFAULT_FPS2, debugFfmpeg2, ScreenRecorder2, init_ScreenRecorder2, init_node22, init_puppeteer3, puppeteer_core_exports, puppeteer3, connect3, defaultArgs3, executablePath3, launch22, puppeteer_core_default, init_puppeteer_core2, CHANGED, CLASS_LIST, CUSTOM_ELEMENTS, CONTENT, DATASET, DOCTYPE, DOM_PARSER, END, EVENT_TARGET, GLOBALS, IMAGE, MIME, MUTATION_OBSERVER, NEXT, OWNER_ELEMENT, PREV, PRIVATE, SHEET, START, STYLE, UPGRADE, VALUE, esm_exports3, _a6, decodeMap, fromCodePoint, htmlDecodeTree, xmlDecodeTree, BinTrieFlags, CharCodes, TO_LOWER_BIT, EntityDecoderState, DecodingMode, EntityDecoder, CharCodes2, State, QuoteType, Sequences, Tokenizer, formTags, pTag, tableSectionTags, ddtTags, rtpTags, openImpliesClose, voidElements, foreignContextElements, htmlIntegrationElements, reNameEnd, Parser2, esm_exports, ElementType, Root2, Text, Directive, Comment2, Script, Style, Tag, CDATA, Doctype, Node22, DataNode, Text2, Comment22, ProcessingInstruction, NodeWithChildren, CDATA2, Document22, Element2, defaultOpts, DomHandler, esm_exports2, decode_data_html_default, decode_data_xml_default, _a22, decodeMap2, fromCodePoint2, CharCodes3, TO_LOWER_BIT2, BinTrieFlags2, EntityDecoderState2, DecodingMode2, EntityDecoder2, htmlDecoder, xmlDecoder, encode_html_default, xmlReplacer, xmlCodeMap, getCodePoint, escapeUTF8, escapeAttribute, escapeText, EntityLevel, EncodingMode, elementNames, attributeNames, unencodedElements, singleTag, esm_default2, foreignModeIntegrationPoints, foreignElements, Checks, DocumentPosition, MEDIA_KEYS_STRING, MEDIA_KEYS_INT, parseFeedDefaultOptions, NODE_END, ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, DOCUMENT_NODE, DOCUMENT_TYPE_NODE, DOCUMENT_FRAGMENT_NODE, BLOCK_ELEMENTS, SHOW_ALL, SHOW_ELEMENT, SHOW_TEXT, SHOW_CDATA_SECTION, SHOW_COMMENT, DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_PRECEDING, DOCUMENT_POSITION_FOLLOWING, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, SVG_NAMESPACE, assign, create, defineProperties, entries, getOwnPropertyDescriptors, keys, setPrototypeOf, $String, getEnd, ignoreCase, knownAdjacent, knownBoundaries, knownSegment, knownSiblings, localCase, setAdjacent, htmlToFragment, shadowRoots, reactive, Classes, customElements, attributeChangedCallback, createTrigger, triggerConnected, connectedCallback, triggerDisconnected, disconnectedCallback, CustomElementRegistry, Parser22, notParsing, append2, attribute, parseFromString, htmlClasses, registerHTMLClass, loopSegment, attrAsJSON, characterDataAsJSON, nonElementAsJSON, documentTypeAsJSON, elementAsJSON, createRecord, queueAttribute, attributeChangedCallback2, moCallback, MutationObserverClass, emptyAttributes, setAttribute, removeAttribute, booleanAttribute, numericAttribute, stringAttribute, wm, DOMEventTarget, NodeList, getParentNodeCount, Node3, replace, ca, esca, pe, escape2, QUOTE, Attr, isConnected, parentElement, previousSibling, nextSibling, nextElementSibling2, previousElementSibling, asFragment, before, after, replaceWith, remove, CharacterData, CDATASection, Comment3, import_boolbase6, import_css_what4, import_boolbase5, import_css_what, procedure, attributes, import_boolbase, reChars, caseInsensitiveAttributes, attributeRules, import_css_what2, whitespace, ZERO, NINE, import_boolbase2, import_boolbase3, filters, pseudos, aliases, import_boolbase4, PLACEHOLDER_ELEMENT, is, subselects, import_css_what3, DESCENDANT_TOKEN, FLEXIBLE_DESCENDANT_TOKEN, SCOPE_TOKEN, defaultEquals, defaultOptions, compile3, _compileUnsafe, _compileToken, selectAll, selectOne, isArray4, isTag3, existsOne2, getAttributeValue2, getChildren2, getName2, getParent2, getSiblings2, getText22, hasAttrib2, removeSubsets2, findAll2, findOne2, adapter, prepareMatch, matches, Text3, isNode3, insert, ParentNode, NonElementParentNode, DocumentFragment2, DocumentType, getInnerHtml, setInnerHtml, esm_default22, refs, key, prop, handler, DOMStringMap, add, addTokens, update, DOMTokenList, refs2, getKeys3, updateKeys, handler2, CSSStyleDeclaration, prototype, BUBBLING_PHASE, AT_TARGET, CAPTURING_PHASE, NONE, GlobalEvent, NamedNodeMap, ShadowRoot, attributesHandler, create2, isVoid, Element3, classNames, handler3, SVGElement2, illegalConstructor, Facades, Level0, level0, HTMLElement2, tagName, HTMLTemplateElement, HTMLHtmlElement, toString, TextElement, tagName2, HTMLScriptElement, HTMLFrameElement2, tagName3, HTMLIFrameElement2, HTMLObjectElement, HTMLHeadElement, HTMLBodyElement, import_cssom, tagName4, HTMLStyleElement, HTMLTimeElement, HTMLFieldSetElement, HTMLEmbedElement, HTMLHRElement, HTMLProgressElement, HTMLParagraphElement, HTMLTableElement, HTMLFrameSetElement, HTMLLIElement, HTMLBaseElement, HTMLDataListElement, tagName5, HTMLInputElement2, HTMLParamElement, HTMLMediaElement, HTMLAudioElement, tagName6, HTMLHeadingElement, HTMLDirectoryElement, HTMLQuoteElement, import_canvas, createCanvas, tagName7, HTMLCanvasElement, HTMLLegendElement, tagName8, HTMLOptionElement, HTMLSpanElement, HTMLMeterElement, HTMLVideoElement, HTMLTableCellElement, tagName9, HTMLTitleElement, HTMLOutputElement, HTMLTableRowElement, HTMLDataElement, HTMLMenuElement, tagName10, HTMLSelectElement2, HTMLBRElement, tagName11, HTMLButtonElement, HTMLMapElement, HTMLOptGroupElement, HTMLDListElement, tagName12, HTMLTextAreaElement2, HTMLFontElement, HTMLDivElement, tagName13, HTMLLinkElement, tagName14, HTMLSlotElement, HTMLFormElement, tagName15, HTMLImageElement, HTMLPreElement, HTMLUListElement, tagName16, HTMLMetaElement, HTMLPictureElement, HTMLAreaElement, HTMLOListElement, HTMLTableCaptionElement, tagName17, HTMLAnchorElement, HTMLLabelElement, HTMLUnknownElement, HTMLModElement, HTMLDetailsElement, tagName18, HTMLSourceElement, HTMLTrackElement, HTMLMarqueeElement, HTMLClasses, voidElements2, Mime, CustomEvent, InputEvent, ImageClass, deleteContents, Range, isOK, TreeWalker, query, globalExports, window2, Document3, createHTMLElement, HTMLDocument, SVGDocument, XMLDocument, DOMParser2, parse5, parseHTML, DEFAULT_CONFIG, _puppeteer, pooledBrowser, pooledBrowserRefCount, pooledCaptureMode, ENABLE_BROWSER_POOL, BEGINFRAME_ONLY_FLAGS, GSAP_METHODS, SUPPORTED_PROPS, TAG_PATTERN, STYLE_BLOCK_PATTERN, SCRIPT_BLOCK_PATTERN, COMPOSITION_ID_IN_CSS_PATTERN, TIMELINE_REGISTRY_INIT_PATTERN, TIMELINE_REGISTRY_ASSIGN_PATTERN, WINDOW_TIMELINE_ASSIGN_PATTERN, INVALID_SCRIPT_CLOSE_PATTERN, coreRules, mediaRules, META_GSAP_KEYS, gsapRules, captionRules, compositionRules, adapterRules, ALL_RULES, PATH_ATTRS, CSS_URL_RE, MEDIA_VISUAL_STYLE_PROPERTIES, arabicScriptRe, combiningMarkRe, decimalDigitRe, emojiPresentationRe, cdpSessionCache, lastFrameCache, PENDING_FRAME_RETRIES, BROWSER_CONSOLE_BUFFER_SIZE, cachedGpuEncoder, DEFAULT_TIMEOUT22, ENCODER_PRESETS, videoMetadataCache, audioMetadataCache, keyframeCache, downloadPathCache, inFlightDownloads, FrameLookupTable, MEMORY_PER_WORKER_MB, MIN_WORKERS, ABSOLUTE_MAX_WORKERS, DEFAULT_SAFE_MAX_WORKERS, MIN_FRAMES_PER_WORKER, compose, GET_MATCH_RESULT, parseBody, handleParsingAllValues, handleParsingNestedValues, splitPath, splitRoutingPath, extractGroupsFromPath, replaceGroupMarks, patternCache, getPattern, tryDecode, tryDecodeURI, getPath, getPathNoStrict, mergePath, checkOptionalParameter, _decodeURI, _getQueryParam, getQueryParam, getQueryParams, decodeURIComponent_, tryDecodeURIComponent, HonoRequest, HtmlEscapedCallbackPhase, raw, resolveCallback, TEXT_PLAIN, setDefaultContentType, createResponseInstance, Context, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError, COMPOSED_HANDLER, notFoundHandler, errorHandler, Hono, emptyParam, LABEL_REG_EXP_STR, ONLY_WILDCARD_REG_EXP_STR, TAIL_WILDCARD_REG_EXP_STR, PATH_ERROR, regExpMetaChars, Node5, Trie, nullMatcher, wildcardRegExpCache, RegExpRouter, SmartRouter, emptyParams, hasChildren2, Node6, TrieRouter, Hono2, RequestError, toRequestError, GlobalRequest, Request3, newHeadersFromIncoming, wrapBodyStream, newRequestFromIncoming, getRequestCache, requestCache, incomingKey, urlKey, headersKey, abortControllerKey, getAbortController, requestPrototype, newRequest, responseCache, getResponseCache, cacheKey, GlobalResponse, Response2, buildOutgoingHttpHeaders, X_ALREADY_SENT, outgoingEnded, handleRequestError, handleFetchError, handleResponseError, flushHeaders, responseViaCache, isPromise32, responseViaResponseObject, getRequestListener, createAdaptorServer, serve, PRODUCER_DIR, SIBLING_MANIFEST_PATH, MODULE_RELATIVE_MANIFEST_PATH, CWD_RELATIVE_MANIFEST_PATHS, MIME_TYPES, RENDER_SEEK_MODE, RENDER_SEEK_DIAGNOSTICS, RENDER_SEEK_STEP, RENDER_SEEK_OFFSET_FRACTION, RENDER_MODE_SCRIPT, HF_BRIDGE_SCRIPT, EMBEDDED_FONT_DATA, GENERIC_FAMILIES, CANONICAL_FONTS, FONT_ALIASES, GOOGLE_FONTS_CACHE_DIR, WOFF2_USER_AGENT, LOG_LEVEL_PRIORITY, defaultLogger, RenderCancelledError, StreamingApi, isOldBunVersion, SSEStreamingApi, run, contextStash, streamSSE, DEFAULT_RENDERS_DIR, Semaphore, entryScript, isPublicServerEntry;
333999
+ var import_esbuild, __create2, __defProp2, __getOwnPropDesc2, __getOwnPropNames2, __getProtoOf2, __hasOwnProp2, __require2, __esm2, __commonJS2, __export2, __copyProps2, __toESM2, __toCommonJS2, require_boolbase, require_types3, require_parse3, require_stringify2, require_commonjs, require_StyleSheet, require_CSSRule, require_CSSStyleRule, require_CSSStyleSheet, require_MediaList, require_CSSImportRule, require_CSSGroupingRule, require_CSSConditionRule, require_CSSMediaRule, require_CSSSupportsRule, require_CSSFontFaceRule, require_CSSHostRule, require_CSSKeyframeRule, require_CSSKeyframesRule, require_CSSValue, require_CSSValueExpression, require_MatcherList, require_CSSDocumentRule, require_parse22, require_CSSStyleDeclaration, require_clone, require_lib3, require_canvas_shim, require_canvas, extendStatics3, UnsubscriptionError2, Subscription2, EMPTY_SUBSCRIPTION2, config2, timeoutProvider2, COMPLETE_NOTIFICATION2, context2, Subscriber2, _bind2, ConsumerObserver2, SafeSubscriber2, EMPTY_OBSERVER2, observable2, Observable2, OperatorSubscriber2, ObjectUnsubscribedError2, Subject2, AnonymousSubject2, dateTimestampProvider2, ReplaySubject2, Action2, intervalProvider2, AsyncAction2, Scheduler2, AsyncScheduler2, asyncScheduler2, async2, EMPTY2, isArrayLike2, iterator2, EmptyError2, isArray22, isArray222, getPrototypeOf2, objectProto2, getKeys2, nodeEventEmitterMethods2, eventTargetMethods2, jqueryMethods2, NEVER2, isArray32, init_rxjs2, init_mitt3, disposeSymbol2, asyncDisposeSymbol2, DisposableStackPolyfill2, DisposableStack2, AsyncDisposableStackPolyfill2, AsyncDisposableStack2, SuppressedErrorPolyfill2, SuppressedError22, init_disposable2, EventEmitter4, init_EventEmitter2, isNode2, environment2, init_environment2, assert3, init_assert2, init_encoding2, packageVersion3, init_version2, require_ms2, require_common5, require_browser2, require_has_flag2, require_supports_color2, require_node4, require_src2, debugModule2, debug6, capturedLogs2, captureLogs2, init_Debug2, PuppeteerError2, TimeoutError3, TouchError2, ProtocolError2, UnsupportedOperation2, TargetCloseError2, ConnectionClosedError2, init_Errors2, paperFormats2, init_PDFOptions2, debugError2, DEFAULT_VIEWPORT2, SOURCE_URL2, PuppeteerURL2, withSourcePuppeteerURLIfNone2, getSourcePuppeteerURLIfAvailable2, isString2, isNumber3, isPlainObject2, isRegExp2, isDate2, VALID_DIALOG_TYPES2, UTILITY_WORLD_NAME2, SOURCE_URL_REGEX2, NETWORK_IDLE_TIME2, unitToPixels2, init_util4, WEB_PERMISSION_TO_PROTOCOL_PERMISSION2, Browser4, init_Browser5, Deferred2, init_Deferred2, Mutex2, init_Mutex2, BrowserContext2, init_BrowserContext4, CDPSessionEvent2, CDPSession2, init_CDPSession3, DeviceRequestPrompt2, init_DeviceRequestPrompt4, Dialog2, init_Dialog4, AsyncIterableUtil2, init_AsyncIterableUtil2, _isElementHandle2, init_ElementHandleSymbol2, init_ErrorLike2, createdFunctions2, createFunction2, interpolateFunction2, init_Function2, __addDisposableResource21, __disposeResources21, DEFAULT_BATCH_SIZE2, init_HandleIterator2, LazyArg2, init_LazyArg2, __addDisposableResource22, __disposeResources22, QueryHandler2, init_QueryHandler2, isKnownAttribute2, ATTRIBUTE_REGEXP2, parseARIASelector2, ARIAQueryHandler2, init_AriaQueryHandler2, CSSQueryHandler2, init_CSSQueryHandler2, source2, init_injected2, ScriptInjector2, scriptInjector2, init_ScriptInjector2, CustomQueryHandlerRegistry2, customQueryHandlers2, init_CustomQueryHandler2, PierceQueryHandler2, init_PierceQueryHandler2, PQueryHandler2, init_PQueryHandler2, TOKENS2, TRIM_TOKENS2, getArgumentPatternByType2, STRING_PATTERN2, ESCAPE_PATTERN2, init_parsel_js2, ESCAPE_REGEXP2, unquote2, init_PSelectorParser2, TextQueryHandler2, init_TextQueryHandler2, XPathQueryHandler2, init_XPathQueryHandler2, BUILTIN_QUERY_HANDLERS2, QUERY_SEPARATORS2, init_GetQueryHandler2, __addDisposableResource32, __disposeResources32, instances2, bubbleHandlers2, bubbleInitializer2, init_decorators2, __runInitializers24, __esDecorate24, __addDisposableResource42, __disposeResources42, JSHandle2, init_JSHandle4, __addDisposableResource52, __disposeResources52, LocatorEvent2, Locator2, FunctionLocator2, DelegatedLocator2, FilteredLocator2, MappedLocator2, NodeLocator2, RaceLocator2, RETRY_DELAY2, init_locators2, __runInitializers25, __esDecorate25, __addDisposableResource62, __disposeResources62, __setFunctionName7, ElementHandle2, init_ElementHandle4, __runInitializers32, __esDecorate32, __addDisposableResource72, __disposeResources72, FrameEvent2, throwIfDetached2, Frame2, init_Frame4, DEFAULT_INTERCEPT_RESOLUTION_PRIORITY2, HTTPRequest2, InterceptResolutionAction2, STATUS_TEXTS2, errorReasons2, init_HTTPRequest4, HTTPResponse2, init_HTTPResponse4, init_incremental_id_generator2, Keyboard2, MouseButton2, Mouse2, Touchscreen2, init_Input4, DEFAULT_TIMEOUT2, TimeoutSettings2, init_TimeoutSettings2, __runInitializers42, __esDecorate42, __addDisposableResource82, __disposeResources82, Page2, supportedMetrics3, init_Page4, WaitTask2, TaskManager2, init_WaitTask2, Realm3, init_Realm4, TargetType2, Target2, init_Target4, WebWorker2, init_WebWorker4, init_api2, __addDisposableResource92, __disposeResources92, Accessibility2, AXNode2, init_Accessibility2, __addDisposableResource102, __disposeResources102, Binding2, init_Binding2, CdpBluetoothEmulation2, init_BluetoothEmulation3, ConsoleMessage2, init_ConsoleMessage2, FileChooser2, init_FileChooser2, NetworkManagerEvent2, init_NetworkManagerEvents2, CallbackRegistry2, Callback2, init_CallbackRegistry2, CdpCDPSession2, init_CdpSession2, debugProtocolSend3, debugProtocolReceive3, Connection2, init_Connection3, Coverage2, JSCoverage2, CSSCoverage2, init_Coverage2, CdpDialog2, init_Dialog22, __runInitializers52, __esDecorate52, __setFunctionName22, EmulatedState2, EmulationManager2, init_EmulationManager2, CdpPreloadScript2, init_CdpPreloadScript2, CdpDeviceRequestPrompt2, CdpDeviceRequestPromptManager2, init_DeviceRequestPrompt22, getErrorDetails2, CDP_BINDING_PREFIX2, init_utils2, CdpJSHandle2, init_JSHandle22, __runInitializers62, __esDecorate62, NON_ELEMENT_NODE_ROLES2, CdpElementHandle2, init_ElementHandle22, __addDisposableResource112, __disposeResources112, ariaQuerySelectorBinding2, ariaQuerySelectorAllBinding2, ExecutionContext2, rewriteError22, init_ExecutionContext2, FrameManagerEvent2, init_FrameManagerEvents2, IsolatedWorld2, init_IsolatedWorld2, MAIN_WORLD2, PUPPETEER_WORLD2, init_IsolatedWorlds2, puppeteerToProtocolLifecycle2, LifecycleWatcher2, init_LifecycleWatcher2, __runInitializers72, __esDecorate72, CdpFrame2, init_Frame22, FrameTree2, init_FrameTree2, CdpHTTPRequest2, init_HTTPRequest22, SecurityDetails2, init_SecurityDetails2, CdpHTTPResponse2, init_HTTPResponse22, NetworkEventManager2, init_NetworkEventManager2, NetworkManager2, init_NetworkManager2, TIME_FOR_WAITING_FOR_SWAP2, FrameManager2, init_FrameManager2, _keyDefinitions2, init_USKeyboardLayout2, CdpKeyboard2, getFlag2, getButtonFromPressedButtons2, CdpMouse2, CdpTouchHandle2, CdpTouchscreen2, init_Input22, Tracing2, init_Tracing2, CdpWebWorker2, init_WebWorker22, __addDisposableResource122, __disposeResources122, CdpPage2, supportedMetrics22, init_Page22, __addDisposableResource132, __disposeResources132, CdpBrowserContext2, init_BrowserContext22, InitializationStatus2, CdpTarget2, PageTarget2, DevToolsTarget2, WorkerTarget2, OtherTarget2, init_Target22, TargetManager2, init_TargetManager2, CdpBrowser2, init_Browser22, init_BrowserConnector4, tabTargetInfo2, pageTargetInfo2, ExtensionTransport2, init_ExtensionTransport2, PredefinedNetworkConditions2, init_PredefinedNetworkConditions2, init_TargetManageEvents2, init_cdp2, BrowserWebSocketTransport_exports2, BrowserWebSocketTransport2, init_BrowserWebSocketTransport2, knownDevices2, knownDevicesByName2, KnownDevices2, init_Device2, mitt_exports2, init_mitt22, require_EventEmitter2, require_log2, require_ProcessingQueue2, require_cdp2, require_chromium_bidi2, require_webdriver_bidi2, require_ErrorResponse2, require_webdriver_bidi_permissions2, require_webdriver_bidi_bluetooth2, require_webdriver_bidi_nav_speculation2, require_webdriver_bidi_ua_client_hints2, require_protocol2, require_BidiNoOpParser2, require_BrowserProcessor2, require_CdpProcessor2, require_BrowsingContextProcessor2, require_EmulationProcessor2, require_assert2, require_graphemeTools2, require_InputSource2, require_keyUtils2, require_USKeyboardLayout2, require_ActionDispatcher2, require_Mutex2, require_InputState2, require_InputStateManager2, require_InputProcessor2, require_base644, require_NetworkUtils2, require_NetworkProcessor2, require_PermissionsProcessor2, require_uuid2, require_ChannelProxy2, require_PreloadScript2, require_ScriptProcessor2, require_SessionProcessor2, require_StorageProcessor2, require_WebExtensionProcessor2, require_OutgoingMessage2, require_CommandProcessor2, require_BluetoothProcessor2, require_ContextConfig2, require_ContextConfigStorage2, require_UserContextStorage2, require_Deferred2, require_time2, require_unitConversions2, require_SharedId2, require_Realm2, require_WindowRealm2, require_urlHelpers2, require_NavigationTracker2, require_BrowsingContextImpl2, require_WorkerRealm2, require_logHelper2, require_LogManager2, require_CollectorsStorage2, require_DefaultMap2, require_NetworkRequest2, require_NetworkStorage2, require_CdpTarget2, require_CdpTargetManager2, require_BrowsingContextStorage2, require_PreloadScriptStorage2, require_RealmStorage2, require_Buffer2, require_IdWrapper2, require_events2, require_SubscriptionManager2, require_EventManager2, require_SpeculationProcessor2, require_BidiServer2, require_BidiMapper2, BidiCdpSession2, init_CDPSession22, debugProtocolSend22, debugProtocolReceive22, BidiConnection2, init_Connection22, BidiMapper2, bidiServerLogger2, CdpConnectionAdapter2, CDPClientAdapter2, NoOpTransport2, init_BidiOverCdp2, BidiBluetoothEmulation2, init_BluetoothEmulation22, BidiDeviceRequestPromptManager2, BidiDeviceRequestPrompt2, init_DeviceRequestPrompt32, __runInitializers82, __esDecorate82, Navigation2, init_Navigation2, __runInitializers92, __esDecorate92, _a32, Realm22, WindowRealm2, DedicatedWorkerRealm2, SharedWorkerRealm2, init_Realm22, __runInitializers102, __esDecorate102, Request22, init_Request2, __runInitializers112, __esDecorate112, UserPrompt2, init_UserPrompt2, __runInitializers122, __esDecorate122, BrowsingContext2, init_BrowsingContext2, __runInitializers132, __esDecorate132, UserContext2, init_UserContext2, BidiDeserializer2, init_Deserializer2, BidiJSHandle2, init_JSHandle32, __runInitializers142, __esDecorate142, __addDisposableResource142, __disposeResources142, BidiElementHandle2, init_ElementHandle32, BidiDialog2, init_Dialog32, __addDisposableResource152, __disposeResources152, ExposableFunction2, init_ExposedFunction2, __runInitializers152, __esDecorate152, BidiHTTPResponse2, init_HTTPResponse32, _a4, requests2, BidiHTTPRequest2, init_HTTPRequest32, UnserializableError2, BidiSerializer2, init_Serializer2, init_util22, __addDisposableResource162, __disposeResources162, BidiRealm2, BidiFrameRealm2, BidiWorkerRealm2, init_Realm32, BidiWebWorker2, init_WebWorker32, __runInitializers162, __esDecorate162, __setFunctionName32, BidiFrame2, init_Frame32, SourceActionsType2, ActionType2, getBidiKeyValue2, BidiKeyboard2, getBidiButton2, BidiMouse2, BidiTouchHandle2, BidiTouchscreen2, init_Input32, __esDecorate172, __runInitializers172, __addDisposableResource172, __disposeResources172, BidiPage2, CDP_SPECIFIC_PREFIX2, init_Page32, BidiBrowserTarget2, BidiPageTarget2, BidiFrameTarget2, BidiWorkerTarget2, init_Target32, __esDecorate182, __runInitializers182, __addDisposableResource182, __disposeResources182, BidiBrowserContext2, init_BrowserContext32, __runInitializers192, __esDecorate192, __addDisposableResource192, __disposeResources192, Browser22, init_Browser32, __runInitializers202, __esDecorate202, Session2, init_Session2, __esDecorate212, __runInitializers212, __setFunctionName42, BidiBrowser2, init_Browser42, bidi_exports2, init_bidi2, init_BrowserConnector22, require_constants7, require_buffer_util2, require_limiter2, require_permessage_deflate2, require_validation2, require_receiver2, require_sender2, require_event_target2, require_extension2, require_websocket2, require_stream2, require_subprotocol2, require_websocket_server2, import_stream4, import_receiver2, import_sender2, import_websocket2, import_websocket_server2, wrapper_default2, init_wrapper2, NodeWebSocketTransport_exports2, NodeWebSocketTransport2, init_NodeWebSocketTransport2, Browser32, BrowserPlatform2, BrowserTag2, ChromeReleaseChannel2, init_types2, require_constants22, require_debug3, require_re2, require_parse_options2, require_identifiers2, require_semver3, require_parse32, require_valid3, require_clean2, require_inc2, require_diff2, require_major2, require_minor2, require_patch2, require_prerelease2, require_compare2, require_rcompare2, require_compare_loose2, require_compare_build2, require_sort2, require_rsort2, require_gt2, require_lt2, require_eq2, require_neq2, require_gte2, require_lte2, require_cmp2, require_coerce2, require_lrucache2, require_range2, require_comparator2, require_satisfies2, require_to_comparators2, require_max_satisfying2, require_min_satisfying2, require_min_version2, require_valid22, require_outside2, require_gtr2, require_ltr2, require_intersects2, require_simplify2, require_subset2, require_semver22, require_lru_cache2, require_helpers4, require_dist13, require_proxy_from_env2, require_dist22, require_parse_proxy_response2, require_dist32, require_utils3, require_smartbuffer2, require_constants32, require_util6, require_common22, require_constants42, require_address_error2, require_ipv42, require_constants52, require_helpers22, require_regular_expressions2, require_ipv62, require_ip_address2, require_helpers32, require_receivebuffer2, require_socksclient2, require_build3, require_dist42, require_common32, require_node22, require_notmodified2, require_data2, require_notfound2, require_file2, require_parseControlResponse2, require_FtpContext2, require_FileInfo2, require_parseListDOS2, require_parseListUnix2, require_parseListMLSD2, require_parseList2, require_ProgressTracker2, require_StringWriter2, require_netUtils2, require_transfer2, require_Client2, require_StringEncoding2, require_dist52, require_ftp2, require_http_error2, require_http2, require_https2, require_dist62, require_estraverse2, require_ast2, require_code2, require_keyword3, require_utils22, require_base6422, require_base64_vlq3, require_util22, require_array_set3, require_mapping_list3, require_source_map_generator3, require_binary_search3, require_quick_sort3, require_source_map_consumer3, require_source_node3, require_source_map3, require_package2, require_escodegen2, require_esprima3, tslib_es6_exports2, extendStatics22, __assign2, __createBinding2, __setModuleDefault2, ownKeys2, _SuppressedError2, tslib_es6_default2, init_tslib_es62, require_types22, require_path2, require_scope2, require_node_path2, require_path_visitor2, require_equiv2, require_fork2, require_shared2, require_core3, require_es62, require_es72, require_es20202, require_jsx2, require_type_annotations2, require_flow2, require_esprima22, require_babel_core2, require_babel2, require_typescript3, require_es_proposals2, require_namedTypes2, require_main3, require_degenerator2, require_compile2, require_dist72, require_dateRange2, require_dnsDomainIs2, require_dnsDomainLevels2, require_util32, require_dnsResolve2, require_netmask2, require_isInNet2, require_isPlainHostName2, require_isResolvable2, require_localHostOrDomainIs2, require_ip2, require_myIpAddress2, require_shExpMatch2, require_timeRange2, require_weekdayRange2, require_dist82, require_esmHelpers2, require_debug22, require_errors2, require_asyncify_helpers2, require_lifetime2, require_deferred_promise2, require_memory2, require_types_ffi2, require_types32, require_context2, require_runtime2, require_module2, require_context_asyncify2, require_runtime_asyncify2, require_module_asyncify2, require_ffi_WASM_RELEASE_SYNC2, require_emscripten_module_WASM_RELEASE_SYNC2, require_variants2, require_vm_interface2, require_module_test2, require_dist92, require_dist102, require_dist112, import_proxy_agent2, init_httpUtil2, import_semver2, baseVersionUrl3, WINDOWS_ENV_PARAM_NAMES2, init_chrome2, init_chrome_headless_shell2, init_chromedriver2, init_chromium2, FirefoxChannel2, baseVersionUrl22, init_firefox2, downloadUrls2, downloadPaths2, executablePathByBrowser2, versionComparators2, init_browser_data2, init_detectPlatform2, import_debug7, debugCache2, InstalledBrowser2, Cache2, init_Cache2, import_debug22, init_debug2, debugLaunch2, CDP_WEBSOCKET_ENDPOINT_REGEX2, WEBDRIVER_BIDI_WEBSOCKET_ENDPOINT_REGEX2, processListeners2, dispatchers2, Process2, PROCESS_ERROR_EXPLANATION2, TimeoutError22, init_launch2, require_node_progress2, require_progress2, DefaultProvider2, init_DefaultProvider2, require_wrappy2, require_once2, require_end_of_stream2, require_pump2, require_buffer_stream2, require_get_stream2, require_pend2, require_fd_slicer2, require_buffer_crc322, require_yauzl2, require_extract_zip2, require_default3, require_fixed_size2, require_fast_fifo2, require_b4a2, require_pass_through_decoder2, require_utf8_decoder2, require_text_decoder2, require_streamx2, require_headers2, require_extract2, require_constants62, require_pack2, require_tar_stream2, require_tar_fs2, import_debug42, debugFileUtil2, internalConstantsForTesting2, init_fileUtil2, import_progress2, debugInstall2, times2, init_install2, align2, top2, right2, bottom2, left2, UI2, mixin3, init_lib4, ansi2, init_string_utils3, init_cliui2, init_sync2, init_string_utils22, init_tokenize_arg_string2, DefaultValuesForTypeKey2, init_yargs_parser_types2, mixin22, YargsParser2, init_yargs_parser2, _a5, _b2, _c2, minNodeVersion2, nodeVersion2, env3, parser2, yargsParser2, lib_default2, init_lib22, init_process_argv2, YError2, init_yerror2, node_default2, init_node3, shim3, Y18N2, init_lib32, y18n22, y18n_default2, init_y18n2, REQUIRE_ERROR2, REQUIRE_DIRECTORY_ERROR2, __dirname22, mainFilename2, esm_default3, init_esm3, init_common_types2, init_is_promise2, init_parse_command2, positionName2, init_argsert2, GlobalMiddleware2, init_middleware2, init_maybe_async_result2, init_which_module2, DEFAULT_MARKER2, CommandInstance2, init_command2, init_obj_filter2, init_set_blocking2, init_usage2, completionShTemplate2, completionZshTemplate2, init_completion_templates2, Completion2, init_completion2, init_levenshtein2, specialKeys2, init_validation2, previouslyVisitedConfigs2, shim22, init_apply_extends2, __classPrivateFieldSet22, __classPrivateFieldGet22, _YargsInstance_command2, _YargsInstance_cwd2, _YargsInstance_context2, _YargsInstance_completion2, _YargsInstance_completionCommand2, _YargsInstance_defaultShowHiddenOpt2, _YargsInstance_exitError2, _YargsInstance_detectLocale2, _YargsInstance_emittedWarnings2, _YargsInstance_exitProcess2, _YargsInstance_frozens2, _YargsInstance_globalMiddleware2, _YargsInstance_groups2, _YargsInstance_hasOutput2, _YargsInstance_helpOpt2, _YargsInstance_isGlobalContext2, _YargsInstance_logger2, _YargsInstance_output2, _YargsInstance_options2, _YargsInstance_parentRequire2, _YargsInstance_parserConfig2, _YargsInstance_parseFn2, _YargsInstance_parseContext2, _YargsInstance_pkgs2, _YargsInstance_preservedGroups2, _YargsInstance_processArgs2, _YargsInstance_recommendCommands2, _YargsInstance_shim2, _YargsInstance_strict2, _YargsInstance_strictCommands2, _YargsInstance_strictOptions2, _YargsInstance_usage2, _YargsInstance_usageConfig2, _YargsInstance_versionOpt2, _YargsInstance_validation2, kCopyDoubleDash2, kCreateLogger2, kDeleteFromParserHintObject2, kEmitWarning2, kFreeze2, kGetDollarZero2, kGetParserConfiguration2, kGetUsageConfiguration2, kGuessLocale2, kGuessVersion2, kParsePositionalNumbers2, kPkgUp2, kPopulateParserHintArray2, kPopulateParserHintSingleValueDictionary2, kPopulateParserHintArrayDictionary2, kPopulateParserHintDictionary2, kSanitizeKey2, kSetKey2, kUnfreeze2, kValidateAsync2, kGetCommandInstance2, kGetContext2, kGetHasOutput2, kGetLoggerInstance2, kGetParseContext2, kGetUsageInstance2, kGetValidationInstance2, kHasParseCallback2, kIsGlobalContext2, kPostProcess2, kRebase2, kReset2, kRunYargsParserAndExecuteCommands2, kRunValidation2, kSetHasOutput2, kTrackManuallySetKeys2, YargsInstance2, init_yargs_factory2, yargs_exports2, Yargs2, yargs_default2, init_yargs2, helpers_exports2, applyExtends22, init_helpers2, packageVersion22, CLI2, init_CLI2, init_provider2, main_exports2, init_main2, LaunchOptions_exports2, init_LaunchOptions2, getWebSocketTransportClass2, init_BrowserConnector32, Puppeteer2, init_Puppeteer2, TaskQueue2, init_TaskQueue2, init_common2, PUPPETEER_REVISIONS2, init_revisions2, init_util32, init_index_browser2, PipeTransport2, init_PipeTransport2, BrowserLauncher2, init_BrowserLauncher2, rmOptions2, init_fs2, ChromeLauncher2, init_ChromeLauncher2, FirefoxLauncher2, init_FirefoxLauncher2, PuppeteerNode2, init_PuppeteerNode2, import_debug62, __runInitializers232, __esDecorate232, __setFunctionName62, CRF_VALUE2, DEFAULT_FPS2, debugFfmpeg2, ScreenRecorder2, init_ScreenRecorder2, init_node22, init_puppeteer3, puppeteer_core_exports, puppeteer3, connect3, defaultArgs3, executablePath3, launch22, puppeteer_core_default, init_puppeteer_core2, CHANGED, CLASS_LIST, CUSTOM_ELEMENTS, CONTENT, DATASET, DOCTYPE, DOM_PARSER, END, EVENT_TARGET, GLOBALS, IMAGE, MIME, MUTATION_OBSERVER, NEXT, OWNER_ELEMENT, PREV, PRIVATE, SHEET, START, STYLE, UPGRADE, VALUE, esm_exports3, _a6, decodeMap, fromCodePoint, htmlDecodeTree, xmlDecodeTree, BinTrieFlags, CharCodes, TO_LOWER_BIT, EntityDecoderState, DecodingMode, EntityDecoder, CharCodes2, State, QuoteType, Sequences, Tokenizer, formTags, pTag, tableSectionTags, ddtTags, rtpTags, openImpliesClose, voidElements, foreignContextElements, htmlIntegrationElements, reNameEnd, Parser2, esm_exports, ElementType, Root2, Text, Directive, Comment2, Script, Style, Tag, CDATA, Doctype, Node22, DataNode, Text2, Comment22, ProcessingInstruction, NodeWithChildren, CDATA2, Document22, Element2, defaultOpts, DomHandler, esm_exports2, decode_data_html_default, decode_data_xml_default, _a22, decodeMap2, fromCodePoint2, CharCodes3, TO_LOWER_BIT2, BinTrieFlags2, EntityDecoderState2, DecodingMode2, EntityDecoder2, htmlDecoder, xmlDecoder, encode_html_default, xmlReplacer, xmlCodeMap, getCodePoint, escapeUTF8, escapeAttribute, escapeText, EntityLevel, EncodingMode, elementNames, attributeNames, unencodedElements, singleTag, esm_default2, foreignModeIntegrationPoints, foreignElements, Checks, DocumentPosition, MEDIA_KEYS_STRING, MEDIA_KEYS_INT, parseFeedDefaultOptions, NODE_END, ELEMENT_NODE, ATTRIBUTE_NODE, TEXT_NODE, CDATA_SECTION_NODE, COMMENT_NODE, DOCUMENT_NODE, DOCUMENT_TYPE_NODE, DOCUMENT_FRAGMENT_NODE, BLOCK_ELEMENTS, SHOW_ALL, SHOW_ELEMENT, SHOW_TEXT, SHOW_CDATA_SECTION, SHOW_COMMENT, DOCUMENT_POSITION_DISCONNECTED, DOCUMENT_POSITION_PRECEDING, DOCUMENT_POSITION_FOLLOWING, DOCUMENT_POSITION_CONTAINS, DOCUMENT_POSITION_CONTAINED_BY, DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, SVG_NAMESPACE, assign, create, defineProperties, entries, getOwnPropertyDescriptors, keys, setPrototypeOf, $String, getEnd, ignoreCase, knownAdjacent, knownBoundaries, knownSegment, knownSiblings, localCase, setAdjacent, htmlToFragment, shadowRoots, reactive, Classes, customElements, attributeChangedCallback, createTrigger, triggerConnected, connectedCallback, triggerDisconnected, disconnectedCallback, CustomElementRegistry, Parser22, notParsing, append2, attribute, parseFromString, htmlClasses, registerHTMLClass, loopSegment, attrAsJSON, characterDataAsJSON, nonElementAsJSON, documentTypeAsJSON, elementAsJSON, createRecord, queueAttribute, attributeChangedCallback2, moCallback, MutationObserverClass, emptyAttributes, setAttribute, removeAttribute, booleanAttribute, numericAttribute, stringAttribute, wm, DOMEventTarget, NodeList, getParentNodeCount, Node3, replace, ca, esca, pe, escape2, QUOTE, Attr, isConnected, parentElement, previousSibling, nextSibling, nextElementSibling2, previousElementSibling, asFragment, before, after, replaceWith, remove, CharacterData, CDATASection, Comment3, import_boolbase6, import_css_what4, import_boolbase5, import_css_what, procedure, attributes, import_boolbase, reChars, caseInsensitiveAttributes, attributeRules, import_css_what2, whitespace, ZERO, NINE, import_boolbase2, import_boolbase3, filters, pseudos, aliases, import_boolbase4, PLACEHOLDER_ELEMENT, is, subselects, import_css_what3, DESCENDANT_TOKEN, FLEXIBLE_DESCENDANT_TOKEN, SCOPE_TOKEN, defaultEquals, defaultOptions, compile3, _compileUnsafe, _compileToken, selectAll, selectOne, isArray4, isTag3, existsOne2, getAttributeValue2, getChildren2, getName2, getParent2, getSiblings2, getText22, hasAttrib2, removeSubsets2, findAll2, findOne2, adapter, prepareMatch, matches, Text3, isNode3, insert, ParentNode, NonElementParentNode, DocumentFragment2, DocumentType, getInnerHtml, setInnerHtml, esm_default22, refs, key, prop, handler, DOMStringMap, add, addTokens, update, DOMTokenList, refs2, getKeys3, updateKeys, handler2, CSSStyleDeclaration, prototype, BUBBLING_PHASE, AT_TARGET, CAPTURING_PHASE, NONE, GlobalEvent, NamedNodeMap, ShadowRoot, attributesHandler, create2, isVoid, Element3, classNames, handler3, SVGElement2, illegalConstructor, Facades, Level0, level0, HTMLElement2, tagName, HTMLTemplateElement, HTMLHtmlElement, toString, TextElement, tagName2, HTMLScriptElement, HTMLFrameElement2, tagName3, HTMLIFrameElement2, HTMLObjectElement, HTMLHeadElement, HTMLBodyElement, import_cssom, tagName4, HTMLStyleElement, HTMLTimeElement, HTMLFieldSetElement, HTMLEmbedElement, HTMLHRElement, HTMLProgressElement, HTMLParagraphElement, HTMLTableElement, HTMLFrameSetElement, HTMLLIElement, HTMLBaseElement, HTMLDataListElement, tagName5, HTMLInputElement2, HTMLParamElement, HTMLMediaElement, HTMLAudioElement, tagName6, HTMLHeadingElement, HTMLDirectoryElement, HTMLQuoteElement, import_canvas, createCanvas, tagName7, HTMLCanvasElement, HTMLLegendElement, tagName8, HTMLOptionElement, HTMLSpanElement, HTMLMeterElement, HTMLVideoElement, HTMLTableCellElement, tagName9, HTMLTitleElement, HTMLOutputElement, HTMLTableRowElement, HTMLDataElement, HTMLMenuElement, tagName10, HTMLSelectElement2, HTMLBRElement, tagName11, HTMLButtonElement, HTMLMapElement, HTMLOptGroupElement, HTMLDListElement, tagName12, HTMLTextAreaElement2, HTMLFontElement, HTMLDivElement, tagName13, HTMLLinkElement, tagName14, HTMLSlotElement, HTMLFormElement, tagName15, HTMLImageElement, HTMLPreElement, HTMLUListElement, tagName16, HTMLMetaElement, HTMLPictureElement, HTMLAreaElement, HTMLOListElement, HTMLTableCaptionElement, tagName17, HTMLAnchorElement, HTMLLabelElement, HTMLUnknownElement, HTMLModElement, HTMLDetailsElement, tagName18, HTMLSourceElement, HTMLTrackElement, HTMLMarqueeElement, HTMLClasses, voidElements2, Mime, CustomEvent, InputEvent, ImageClass, deleteContents, Range, isOK, TreeWalker, query, globalExports, window2, Document3, createHTMLElement, HTMLDocument, SVGDocument, XMLDocument, DOMParser2, parse5, parseHTML, DEFAULT_CONFIG, _puppeteer, pooledBrowser, pooledBrowserRefCount, pooledCaptureMode, ENABLE_BROWSER_POOL, BEGINFRAME_ONLY_FLAGS, GSAP_METHODS, SUPPORTED_PROPS, TAG_PATTERN, STYLE_BLOCK_PATTERN, SCRIPT_BLOCK_PATTERN, COMPOSITION_ID_IN_CSS_PATTERN, TIMELINE_REGISTRY_INIT_PATTERN, TIMELINE_REGISTRY_ASSIGN_PATTERN, WINDOW_TIMELINE_ASSIGN_PATTERN, INVALID_SCRIPT_CLOSE_PATTERN, coreRules, mediaRules, META_GSAP_KEYS, gsapRules, captionRules, compositionRules, adapterRules, ALL_RULES, join42, resolve62, dirname42, PATH_ATTRS, CSS_URL_RE, MEDIA_VISUAL_STYLE_PROPERTIES, arabicScriptRe, combiningMarkRe, decimalDigitRe, emojiPresentationRe, cdpSessionCache, lastFrameCache, PENDING_FRAME_RETRIES, TRANSPARENT_BG_STYLE_ID, DOM_LAYER_MASK_STYLE_ID, BROWSER_CONSOLE_BUFFER_SIZE, cachedGpuEncoder, DEFAULT_TIMEOUT22, ENCODER_PRESETS, DEFAULT_HDR10_MASTERING, videoMetadataCache, audioMetadataCache, keyframeCache, downloadPathCache, inFlightDownloads, FrameLookupTable, MEMORY_PER_WORKER_MB, MIN_WORKERS, ABSOLUTE_MAX_WORKERS, DEFAULT_SAFE_MAX_WORKERS, MIN_FRAMES_PER_WORKER, compose, GET_MATCH_RESULT, parseBody, handleParsingAllValues, handleParsingNestedValues, splitPath, splitRoutingPath, extractGroupsFromPath, replaceGroupMarks, patternCache, getPattern, tryDecode, tryDecodeURI, getPath, getPathNoStrict, mergePath, checkOptionalParameter, _decodeURI, _getQueryParam, getQueryParam, getQueryParams, decodeURIComponent_, tryDecodeURIComponent, HonoRequest, HtmlEscapedCallbackPhase, raw, resolveCallback, TEXT_PLAIN, setDefaultContentType, createResponseInstance, Context, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE, METHODS, MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError, COMPOSED_HANDLER, notFoundHandler, errorHandler, Hono, emptyParam, LABEL_REG_EXP_STR, ONLY_WILDCARD_REG_EXP_STR, TAIL_WILDCARD_REG_EXP_STR, PATH_ERROR, regExpMetaChars, Node5, Trie, nullMatcher, wildcardRegExpCache, RegExpRouter, SmartRouter, emptyParams, hasChildren2, Node6, TrieRouter, Hono2, RequestError, toRequestError, GlobalRequest, Request3, newHeadersFromIncoming, wrapBodyStream, newRequestFromIncoming, getRequestCache, requestCache, incomingKey, urlKey, headersKey, abortControllerKey, getAbortController, requestPrototype, newRequest, responseCache, getResponseCache, cacheKey, GlobalResponse, Response2, buildOutgoingHttpHeaders, X_ALREADY_SENT, outgoingEnded, handleRequestError, handleFetchError, handleResponseError, flushHeaders, responseViaCache, isPromise32, responseViaResponseObject, getRequestListener, createAdaptorServer, serve, SRGB_TO_HLG, SRGB_TO_PQ, PQ_M1, PQ_M2, PQ_C1, PQ_C2, PQ_C3, HLG_OOTF_LW, HLG_OOTF_GAMMA, hlgToPqLut, pqToHlgLut, ROT_A, ROT_B, TRANSITIONS, crossfade, flashThroughWhite, chromaticSplit, sdfIris, glitch, lightLeak, crossWarpMorph, whipPan, cinematicZoom, gravitationalLens, rippleWaves, swirlVortex, thermalDistortion, domainWarp, ridgedBurn, PRODUCER_DIR, SIBLING_MANIFEST_PATH, MODULE_RELATIVE_MANIFEST_PATH, CWD_RELATIVE_MANIFEST_PATHS, MIME_TYPES, VIRTUAL_TIME_SHIM, RENDER_SEEK_MODE, RENDER_SEEK_DIAGNOSTICS, RENDER_SEEK_STEP, RENDER_SEEK_OFFSET_FRACTION, RENDER_MODE_SCRIPT, HF_EARLY_STUB, HF_BRIDGE_SCRIPT, DEFAULT_RENDERS_DIR, EMBEDDED_FONT_DATA, GENERIC_FAMILIES, CANONICAL_FONTS, FONT_ALIASES, GOOGLE_FONTS_CACHE_DIR, WOFF2_USER_AGENT, INLINE_SCRIPT_PATTERN, LOG_LEVEL_PRIORITY, defaultLogger, frameDirMaxIndexCache, FRAME_FILENAME_RE, RenderCancelledError, StreamingApi, isOldBunVersion, SSEStreamingApi, run, contextStash, streamSSE, Semaphore, entryScript, isPublicServerEntry;
332403
334000
  var init_dist = __esm({
332404
- "../../node_modules/.pnpm/@hyperframes+producer@0.4.4_typescript@5.9.3/node_modules/@hyperframes/producer/dist/index.js"() {
334001
+ "../../node_modules/.pnpm/@hyperframes+producer@0.4.10_typescript@5.9.3/node_modules/@hyperframes/producer/dist/index.js"() {
332405
334002
  import_esbuild = __toESM(require_main(), 1);
332406
334003
  init_postcss();
332407
334004
  __create2 = Object.create;
@@ -335934,12 +337531,12 @@ var init_dist = __esm({
335934
337531
  createDebug.skips = [];
335935
337532
  createDebug.formatters = {};
335936
337533
  function selectColor(namespace) {
335937
- let hash = 0;
337534
+ let hash2 = 0;
335938
337535
  for (let i = 0; i < namespace.length; i++) {
335939
- hash = (hash << 5) - hash + namespace.charCodeAt(i);
335940
- hash |= 0;
337536
+ hash2 = (hash2 << 5) - hash2 + namespace.charCodeAt(i);
337537
+ hash2 |= 0;
335941
337538
  }
335942
- return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
337539
+ return createDebug.colors[Math.abs(hash2) % createDebug.colors.length];
335943
337540
  }
335944
337541
  createDebug.selectColor = selectColor;
335945
337542
  function createDebug(namespace) {
@@ -383050,25 +384647,25 @@ ${sourceUrlComment}
383050
384647
  var notmodified_1 = __importDefault22(require_notmodified2());
383051
384648
  var debug62 = (0, debug_1.default)("get-uri:data");
383052
384649
  var DataReadable = class extends stream_1.Readable {
383053
- constructor(hash, buf) {
384650
+ constructor(hash2, buf) {
383054
384651
  super();
383055
384652
  this.push(buf);
383056
384653
  this.push(null);
383057
- this.hash = hash;
384654
+ this.hash = hash2;
383058
384655
  }
383059
384656
  };
383060
384657
  var data = async ({ href: uri }, { cache } = {}) => {
383061
384658
  const shasum = (0, crypto_1.createHash)("sha1");
383062
384659
  shasum.update(uri);
383063
- const hash = shasum.digest("hex");
383064
- debug62('generated SHA1 hash for "data:" URI: %o', hash);
383065
- if (cache?.hash === hash) {
383066
- debug62("got matching cache SHA1 hash: %o", hash);
384660
+ const hash2 = shasum.digest("hex");
384661
+ debug62('generated SHA1 hash for "data:" URI: %o', hash2);
384662
+ if (cache?.hash === hash2) {
384663
+ debug62("got matching cache SHA1 hash: %o", hash2);
383067
384664
  throw new notmodified_1.default();
383068
384665
  } else {
383069
384666
  debug62('creating Readable stream from "data:" URI buffer');
383070
384667
  const { buffer } = (0, data_uri_to_buffer_1.dataUriToBuffer)(uri);
383071
- return new DataReadable(hash, Buffer.from(buffer));
384668
+ return new DataReadable(hash2, Buffer.from(buffer));
383072
384669
  }
383073
384670
  };
383074
384671
  exports.data = data;
@@ -386508,7 +388105,7 @@ Closing reason: ${this._closingError.stack}`;
386508
388105
  }
386509
388106
  path122 = url.path;
386510
388107
  }
386511
- var isAbsolute22 = exports.isAbsolute(path122);
388108
+ var isAbsolute32 = exports.isAbsolute(path122);
386512
388109
  var parts = path122.split(/\/+/);
386513
388110
  for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
386514
388111
  part = parts[i];
@@ -386528,7 +388125,7 @@ Closing reason: ${this._closingError.stack}`;
386528
388125
  }
386529
388126
  path122 = parts.join("/");
386530
388127
  if (path122 === "") {
386531
- path122 = isAbsolute22 ? "/" : ".";
388128
+ path122 = isAbsolute32 ? "/" : ".";
386532
388129
  }
386533
388130
  if (url) {
386534
388131
  url.path = path122;
@@ -386573,7 +388170,7 @@ Closing reason: ${this._closingError.stack}`;
386573
388170
  exports.isAbsolute = function(aPath) {
386574
388171
  return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
386575
388172
  };
386576
- function relative22(aRoot, aPath) {
388173
+ function relative32(aRoot, aPath) {
386577
388174
  if (aRoot === "") {
386578
388175
  aRoot = ".";
386579
388176
  }
@@ -386592,7 +388189,7 @@ Closing reason: ${this._closingError.stack}`;
386592
388189
  }
386593
388190
  return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
386594
388191
  }
386595
- exports.relative = relative22;
388192
+ exports.relative = relative32;
386596
388193
  var supportsNullProto = (function() {
386597
388194
  var obj = /* @__PURE__ */ Object.create(null);
386598
388195
  return !("__proto__" in obj);
@@ -403454,14 +405051,14 @@ Attempted to suspend at:`);
403454
405051
  (0, quickjs_emscripten_1.getQuickJS)(),
403455
405052
  this.loadPacFile()
403456
405053
  ]);
403457
- const hash = crypto3.createHash("sha1").update(code).digest("hex");
403458
- if (this.resolver && this.resolverHash === hash) {
405054
+ const hash2 = crypto3.createHash("sha1").update(code).digest("hex");
405055
+ if (this.resolver && this.resolverHash === hash2) {
403459
405056
  debug62("Same sha1 hash for code - contents have not changed, reusing previous proxy resolver");
403460
405057
  return this.resolver;
403461
405058
  }
403462
405059
  debug62("Creating new proxy resolver instance");
403463
405060
  this.resolver = (0, pac_resolver_1.createPacResolver)(qjs, code, this.opts);
403464
- this.resolverHash = hash;
405061
+ this.resolverHash = hash2;
403465
405062
  return this.resolver;
403466
405063
  } catch (err) {
403467
405064
  if (this.resolver && err.code === "ENOTMODIFIED") {
@@ -421802,6 +423399,8 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
421802
423399
  ffmpegEncodeTimeout: 6e5,
421803
423400
  ffmpegProcessTimeout: 3e5,
421804
423401
  ffmpegStreamingTimeout: 6e5,
423402
+ hdr: false,
423403
+ hdrAutoDetect: true,
421805
423404
  audioGain: 1.35,
421806
423405
  frameDataUriCacheLimit: 256,
421807
423406
  playerReadyTimeout: 45e3,
@@ -422109,6 +423708,7 @@ For (2), check out our guide on configuring puppeteer at https://pptr.dev/guides
422109
423708
  const timedTagPositions = [];
422110
423709
  for (const tag of tags) {
422111
423710
  if (tag.name === "video" || tag.name === "audio") continue;
423711
+ if (readAttr(tag.raw, "data-composition-id")) continue;
422112
423712
  if (readAttr(tag.raw, "data-start")) {
422113
423713
  timedTagPositions.push({
422114
423714
  name: tag.name,
@@ -423004,6 +424604,7 @@ ${right22.raw}`)
423004
424604
  ...compositionRules,
423005
424605
  ...adapterRules
423006
424606
  ];
424607
+ ({ join: join42, resolve: resolve62, dirname: dirname42 } = posix);
423007
424608
  PATH_ATTRS = ["src", "href"];
423008
424609
  CSS_URL_RE = /\burl\(\s*(["']?)([^)"']+)\1\s*\)/g;
423009
424610
  MEDIA_VISUAL_STYLE_PROPERTIES = [
@@ -423041,6 +424642,8 @@ ${right22.raw}`)
423041
424642
  cdpSessionCache = /* @__PURE__ */ new WeakMap();
423042
424643
  lastFrameCache = /* @__PURE__ */ new WeakMap();
423043
424644
  PENDING_FRAME_RETRIES = 5;
424645
+ TRANSPARENT_BG_STYLE_ID = "__hf_transparent_bg__";
424646
+ DOM_LAYER_MASK_STYLE_ID = "__hf_dom_layer_mask__";
423044
424647
  BROWSER_CONSOLE_BUFFER_SIZE = 200;
423045
424648
  cachedGpuEncoder = void 0;
423046
424649
  DEFAULT_TIMEOUT22 = 3e5;
@@ -423049,6 +424652,10 @@ ${right22.raw}`)
423049
424652
  standard: { preset: "medium", quality: 18, codec: "h264" },
423050
424653
  high: { preset: "slow", quality: 15, codec: "h264" }
423051
424654
  };
424655
+ DEFAULT_HDR10_MASTERING = {
424656
+ masterDisplay: "G(13250,34500)B(7500,3000)R(34000,16000)WP(15635,16450)L(10000000,1)",
424657
+ maxCll: "1000,400"
424658
+ };
423052
424659
  videoMetadataCache = /* @__PURE__ */ new Map();
423053
424660
  audioMetadataCache = /* @__PURE__ */ new Map();
423054
424661
  keyframeCache = /* @__PURE__ */ new Map();
@@ -425543,6 +427150,485 @@ ${right22.raw}`)
425543
427150
  });
425544
427151
  return server3;
425545
427152
  };
427153
+ SRGB_TO_HLG = buildSrgbToHdrLut("hlg");
427154
+ SRGB_TO_PQ = buildSrgbToHdrLut("pq");
427155
+ PQ_M1 = 0.1593017578125;
427156
+ PQ_M2 = 78.84375;
427157
+ PQ_C1 = 0.8359375;
427158
+ PQ_C2 = 18.8515625;
427159
+ PQ_C3 = 18.6875;
427160
+ HLG_OOTF_LW = 1e3;
427161
+ HLG_OOTF_GAMMA = 1.2 * Math.pow(1.111, Math.log2(HLG_OOTF_LW / 1e3));
427162
+ hlgToPqLut = null;
427163
+ pqToHlgLut = null;
427164
+ ROT_A = 0.8;
427165
+ ROT_B = 0.6;
427166
+ TRANSITIONS = {};
427167
+ crossfade = (from22, to, out, w, h, p) => {
427168
+ const inv = 1 - p;
427169
+ for (let i = 0; i < w * h; i++) {
427170
+ const o = i * 6;
427171
+ out.writeUInt16LE(Math.round(from22.readUInt16LE(o) * inv + to.readUInt16LE(o) * p), o);
427172
+ out.writeUInt16LE(
427173
+ Math.round(from22.readUInt16LE(o + 2) * inv + to.readUInt16LE(o + 2) * p),
427174
+ o + 2
427175
+ );
427176
+ out.writeUInt16LE(
427177
+ Math.round(from22.readUInt16LE(o + 4) * inv + to.readUInt16LE(o + 4) * p),
427178
+ o + 4
427179
+ );
427180
+ }
427181
+ };
427182
+ TRANSITIONS["crossfade"] = crossfade;
427183
+ flashThroughWhite = (from22, to, out, w, h, p) => {
427184
+ const toWhite = smoothstep(0, 0.45, p);
427185
+ const fromWhite = 1 - smoothstep(0.5, 1, p);
427186
+ const blend = smoothstep(0.35, 0.65, p);
427187
+ for (let i = 0; i < w * h; i++) {
427188
+ const o = i * 6;
427189
+ const fromR = mix16(from22.readUInt16LE(o), 65535, toWhite);
427190
+ const fromG = mix16(from22.readUInt16LE(o + 2), 65535, toWhite);
427191
+ const fromB = mix16(from22.readUInt16LE(o + 4), 65535, toWhite);
427192
+ const toR = mix16(to.readUInt16LE(o), 65535, fromWhite);
427193
+ const toG = mix16(to.readUInt16LE(o + 2), 65535, fromWhite);
427194
+ const toB = mix16(to.readUInt16LE(o + 4), 65535, fromWhite);
427195
+ out.writeUInt16LE(mix16(fromR, toR, blend), o);
427196
+ out.writeUInt16LE(mix16(fromG, toG, blend), o + 2);
427197
+ out.writeUInt16LE(mix16(fromB, toB, blend), o + 4);
427198
+ }
427199
+ };
427200
+ TRANSITIONS["flash-through-white"] = flashThroughWhite;
427201
+ chromaticSplit = (from22, to, out, w, h, p) => {
427202
+ for (let i = 0; i < w * h; i++) {
427203
+ const ux = i % w / w;
427204
+ const uy = Math.floor(i / w) / h;
427205
+ const o = i * 6;
427206
+ const cx = ux - 0.5;
427207
+ const cy = uy - 0.5;
427208
+ const fromShift = p * 0.06;
427209
+ const fr = sampleRgb48le(from22, ux + cx * fromShift, uy + cy * fromShift, w, h)[0];
427210
+ const fg = sampleRgb48le(from22, ux, uy, w, h)[1];
427211
+ const fb = sampleRgb48le(from22, ux - cx * fromShift, uy - cy * fromShift, w, h)[2];
427212
+ const toShift = (1 - p) * 0.06;
427213
+ const tr = sampleRgb48le(to, ux - cx * toShift, uy - cy * toShift, w, h)[0];
427214
+ const tg = sampleRgb48le(to, ux, uy, w, h)[1];
427215
+ const tb = sampleRgb48le(to, ux + cx * toShift, uy + cy * toShift, w, h)[2];
427216
+ out.writeUInt16LE(clamp16(mix16(fr, tr, p)), o);
427217
+ out.writeUInt16LE(clamp16(mix16(fg, tg, p)), o + 2);
427218
+ out.writeUInt16LE(clamp16(mix16(fb, tb, p)), o + 4);
427219
+ }
427220
+ };
427221
+ TRANSITIONS["chromatic-split"] = chromaticSplit;
427222
+ sdfIris = (from22, to, out, w, h, p) => {
427223
+ const accentBright = [65535, 55e3, 35e3];
427224
+ for (let i = 0; i < w * h; i++) {
427225
+ const ux = i % w / w;
427226
+ const uy = Math.floor(i / w) / h;
427227
+ const o = i * 6;
427228
+ const ax = (ux - 0.5) * (w / h);
427229
+ const ay = uy - 0.5;
427230
+ const d = Math.sqrt(ax * ax + ay * ay);
427231
+ const radius = p * 1.2;
427232
+ const fw = 3e-3;
427233
+ const edge = smoothstep(radius + fw, radius - fw, d);
427234
+ const ring1 = Math.exp(-Math.abs(d - radius) * 25);
427235
+ const ring2 = Math.exp(-Math.abs(d - radius + 0.04) * 20) * 0.5;
427236
+ const ring3 = Math.exp(-Math.abs(d - radius + 0.08) * 15) * 0.25;
427237
+ const glow = (ring1 + ring2 + ring3) * p * (1 - p) * 4;
427238
+ const [fromR, fromG, fromB] = sampleRgb48le(from22, ux, uy, w, h);
427239
+ const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
427240
+ out.writeUInt16LE(clamp16(mix16(fromR, toR, edge) + accentBright[0] * glow * 0.6), o);
427241
+ out.writeUInt16LE(clamp16(mix16(fromG, toG, edge) + accentBright[1] * glow * 0.6), o + 2);
427242
+ out.writeUInt16LE(clamp16(mix16(fromB, toB, edge) + accentBright[2] * glow * 0.6), o + 4);
427243
+ }
427244
+ };
427245
+ TRANSITIONS["sdf-iris"] = sdfIris;
427246
+ glitch = (from22, to, out, w, h, p) => {
427247
+ const intensity = p * (1 - p) * 4;
427248
+ for (let i = 0; i < w * h; i++) {
427249
+ const ux = i % w / w;
427250
+ const uy = Math.floor(i / w) / h;
427251
+ const o = i * 6;
427252
+ const lineY = Math.floor(uy * 60) / 60;
427253
+ const lineDisp = (glitchRand(lineY, Math.floor(p * 17)) - 0.5) * 0.18 * intensity;
427254
+ const blockX = Math.floor(ux * 12);
427255
+ const blockY = Math.floor(uy * 8);
427256
+ const progressStep = Math.floor(p * 11);
427257
+ const br = glitchRand(blockX + progressStep, blockY + progressStep);
427258
+ const ba = (br >= 0.83 ? 1 : 0) * intensity;
427259
+ const bdx = (glitchRand(blockX * 2.1, blockY * 2.1) - 0.5) * 0.35 * ba;
427260
+ const bdy = (glitchRand(blockX * 3.7, blockY * 3.7) - 0.5) * 0.35 * ba;
427261
+ const uvx = Math.max(0, Math.min(1, ux + lineDisp + bdx));
427262
+ const uvy = Math.max(0, Math.min(1, uy + bdy));
427263
+ const shift = intensity * 0.035;
427264
+ const r = sampleRgb48le(from22, uvx + shift, uvy, w, h)[0];
427265
+ const g = sampleRgb48le(from22, uvx, uvy, w, h)[1];
427266
+ const b = sampleRgb48le(from22, uvx - shift, uvy, w, h)[2];
427267
+ let cr = r / 65535;
427268
+ let cg = g / 65535;
427269
+ let cb = b / 65535;
427270
+ const scanline = (uy * h * 0.5 % 1 + 1) % 1 >= 0.5 ? 0.05 * intensity : 0;
427271
+ cr -= scanline;
427272
+ cg -= scanline;
427273
+ cb -= scanline;
427274
+ const flicker = 1 + (glitchRand(Math.floor(p * 23), 0) - 0.5) * 0.3 * intensity;
427275
+ cr *= flicker;
427276
+ cg *= flicker;
427277
+ cb *= flicker;
427278
+ const levels = 256 - (256 - 8) * (intensity * 0.5);
427279
+ cr = Math.floor(cr * levels) / levels;
427280
+ cg = Math.floor(cg * levels) / levels;
427281
+ cb = Math.floor(cb * levels) / levels;
427282
+ const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
427283
+ out.writeUInt16LE(clamp16(mix16(Math.round(cr * 65535), toR, p)), o);
427284
+ out.writeUInt16LE(clamp16(mix16(Math.round(cg * 65535), toG, p)), o + 2);
427285
+ out.writeUInt16LE(clamp16(mix16(Math.round(cb * 65535), toB, p)), o + 4);
427286
+ }
427287
+ };
427288
+ TRANSITIONS["glitch"] = glitch;
427289
+ lightLeak = (from22, to, out, w, h, p) => {
427290
+ const accent = [5e4 / 65535, 25e3 / 65535, 5e3 / 65535];
427291
+ const accentBright = [65535 / 65535, 55e3 / 65535, 35e3 / 65535];
427292
+ const lpx = 1.3;
427293
+ const lpy = -0.2;
427294
+ for (let i = 0; i < w * h; i++) {
427295
+ const ux = i % w / w;
427296
+ const uy = Math.floor(i / w) / h;
427297
+ const o = i * 6;
427298
+ const dx = ux - lpx;
427299
+ const dy = uy - lpy;
427300
+ const dist = Math.sqrt(dx * dx + dy * dy);
427301
+ const leak = Math.max(0, Math.min(1, Math.exp(-dist * 1.8) * p * 4));
427302
+ const warmR = accent[0] + (accentBright[0] - accent[0]) * dist * 0.7;
427303
+ const warmG = accent[1] + (accentBright[1] - accent[1]) * dist * 0.7;
427304
+ const warmB = accent[2] + (accentBright[2] - accent[2]) * dist * 0.7;
427305
+ const flare = Math.exp(-Math.abs(uy - (-0.2 + ux * 0.3)) * 15) * leak * 0.3;
427306
+ const [fr, fg, fb] = sampleRgb48le(from22, ux, uy, w, h);
427307
+ const fromR = fr / 65535;
427308
+ const fromG = fg / 65535;
427309
+ const fromB = fb / 65535;
427310
+ const overR = aces(fromR + warmR * leak * 3 + accentBright[0] * flare);
427311
+ const overG = aces(fromG + warmG * leak * 3 + accentBright[1] * flare);
427312
+ const overB = aces(fromB + warmB * leak * 3 + accentBright[2] * flare);
427313
+ const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
427314
+ const blend = smoothstep(0.15, 0.85, p);
427315
+ out.writeUInt16LE(clamp16(mix16(Math.round(overR * 65535), toR, blend)), o);
427316
+ out.writeUInt16LE(clamp16(mix16(Math.round(overG * 65535), toG, blend)), o + 2);
427317
+ out.writeUInt16LE(clamp16(mix16(Math.round(overB * 65535), toB, blend)), o + 4);
427318
+ }
427319
+ };
427320
+ TRANSITIONS["light-leak"] = lightLeak;
427321
+ crossWarpMorph = (from22, to, out, w, h, p) => {
427322
+ for (let i = 0; i < w * h; i++) {
427323
+ const ux = i % w / w;
427324
+ const uy = Math.floor(i / w) / h;
427325
+ const o = i * 6;
427326
+ const dispX = fbm(ux * 3, uy * 3) - 0.5;
427327
+ const dispY = fbm(ux * 3 + 7.3, uy * 3 + 3.7) - 0.5;
427328
+ const fromUx = Math.max(0, Math.min(1, ux + dispX * p * 0.5));
427329
+ const fromUy = Math.max(0, Math.min(1, uy + dispY * p * 0.5));
427330
+ const toUx = Math.max(0, Math.min(1, ux - dispX * (1 - p) * 0.5));
427331
+ const toUy = Math.max(0, Math.min(1, uy - dispY * (1 - p) * 0.5));
427332
+ const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, fromUy, w, h);
427333
+ const [toR, toG, toB] = sampleRgb48le(to, toUx, toUy, w, h);
427334
+ const n = fbm(ux * 4 + 3.1, uy * 4 + 1.7);
427335
+ const blend = smoothstep(0.4, 0.6, n + p * 1.2 - 0.6);
427336
+ out.writeUInt16LE(clamp16(mix16(fromR, toR, blend)), o);
427337
+ out.writeUInt16LE(clamp16(mix16(fromG, toG, blend)), o + 2);
427338
+ out.writeUInt16LE(clamp16(mix16(fromB, toB, blend)), o + 4);
427339
+ }
427340
+ };
427341
+ TRANSITIONS["cross-warp-morph"] = crossWarpMorph;
427342
+ whipPan = (from22, to, out, w, h, p) => {
427343
+ const fromOff = p * 1.5;
427344
+ const toOff = (1 - p) * 1.5;
427345
+ for (let i = 0; i < w * h; i++) {
427346
+ const ux = i % w / w;
427347
+ const uy = Math.floor(i / w) / h;
427348
+ const o = i * 6;
427349
+ let fromR = 0, fromG = 0, fromB = 0;
427350
+ for (let s = 0; s < 10; s++) {
427351
+ const f = s / 10;
427352
+ const fuv = Math.max(0, Math.min(1, ux + fromOff + p * 0.08 * f));
427353
+ const [r, g, b] = sampleRgb48le(from22, fuv, uy, w, h);
427354
+ fromR += r;
427355
+ fromG += g;
427356
+ fromB += b;
427357
+ }
427358
+ fromR /= 10;
427359
+ fromG /= 10;
427360
+ fromB /= 10;
427361
+ let toR = 0, toG = 0, toB = 0;
427362
+ for (let s = 0; s < 10; s++) {
427363
+ const f = s / 10;
427364
+ const tuv = Math.max(0, Math.min(1, ux - toOff - (1 - p) * 0.08 * f));
427365
+ const [r, g, b] = sampleRgb48le(to, tuv, uy, w, h);
427366
+ toR += r;
427367
+ toG += g;
427368
+ toB += b;
427369
+ }
427370
+ toR /= 10;
427371
+ toG /= 10;
427372
+ toB /= 10;
427373
+ out.writeUInt16LE(clamp16(mix16(Math.round(fromR), Math.round(toR), p)), o);
427374
+ out.writeUInt16LE(clamp16(mix16(Math.round(fromG), Math.round(toG), p)), o + 2);
427375
+ out.writeUInt16LE(clamp16(mix16(Math.round(fromB), Math.round(toB), p)), o + 4);
427376
+ }
427377
+ };
427378
+ TRANSITIONS["whip-pan"] = whipPan;
427379
+ cinematicZoom = (from22, to, out, w, h, p) => {
427380
+ const fromS = p * 0.08;
427381
+ const toS = (1 - p) * 0.06;
427382
+ for (let i = 0; i < w * h; i++) {
427383
+ const ux = i % w / w;
427384
+ const uy = Math.floor(i / w) / h;
427385
+ const o = i * 6;
427386
+ const dx = ux - 0.5;
427387
+ const dy = uy - 0.5;
427388
+ let fr = 0, fg = 0, fb = 0;
427389
+ for (let s = 0; s < 12; s++) {
427390
+ const f = s / 12;
427391
+ const rr = sampleRgb48le(
427392
+ from22,
427393
+ ux - dx * fromS * 1.06 * f,
427394
+ uy - dy * fromS * 1.06 * f,
427395
+ w,
427396
+ h
427397
+ )[0];
427398
+ const gg = sampleRgb48le(from22, ux - dx * fromS * f, uy - dy * fromS * f, w, h)[1];
427399
+ const bb = sampleRgb48le(
427400
+ from22,
427401
+ ux - dx * fromS * 0.94 * f,
427402
+ uy - dy * fromS * 0.94 * f,
427403
+ w,
427404
+ h
427405
+ )[2];
427406
+ fr += rr;
427407
+ fg += gg;
427408
+ fb += bb;
427409
+ }
427410
+ fr /= 12;
427411
+ fg /= 12;
427412
+ fb /= 12;
427413
+ let tr = 0, tg = 0, tb = 0;
427414
+ for (let s = 0; s < 12; s++) {
427415
+ const f = s / 12;
427416
+ const rr = sampleRgb48le(to, ux + dx * toS * 1.06 * f, uy + dy * toS * 1.06 * f, w, h)[0];
427417
+ const gg = sampleRgb48le(to, ux + dx * toS * f, uy + dy * toS * f, w, h)[1];
427418
+ const bb = sampleRgb48le(to, ux + dx * toS * 0.94 * f, uy + dy * toS * 0.94 * f, w, h)[2];
427419
+ tr += rr;
427420
+ tg += gg;
427421
+ tb += bb;
427422
+ }
427423
+ tr /= 12;
427424
+ tg /= 12;
427425
+ tb /= 12;
427426
+ out.writeUInt16LE(clamp16(mix16(Math.round(fr), Math.round(tr), p)), o);
427427
+ out.writeUInt16LE(clamp16(mix16(Math.round(fg), Math.round(tg), p)), o + 2);
427428
+ out.writeUInt16LE(clamp16(mix16(Math.round(fb), Math.round(tb), p)), o + 4);
427429
+ }
427430
+ };
427431
+ TRANSITIONS["cinematic-zoom"] = cinematicZoom;
427432
+ gravitationalLens = (from22, to, out, w, h, p) => {
427433
+ for (let i = 0; i < w * h; i++) {
427434
+ const ux = i % w / w;
427435
+ const uy = Math.floor(i / w) / h;
427436
+ const o = i * 6;
427437
+ const uvx = ux - 0.5;
427438
+ const uvy = uy - 0.5;
427439
+ const dist = Math.sqrt(uvx * uvx + uvy * uvy);
427440
+ const pull = p * 2;
427441
+ const warpStr = pull * 0.3 / (dist + 0.1);
427442
+ const warpedX = Math.max(0, Math.min(1, ux - uvx * warpStr));
427443
+ const warpedY = Math.max(0, Math.min(1, uy - uvy * warpStr));
427444
+ const [, ag] = sampleRgb48le(from22, warpedX, warpedY, w, h);
427445
+ const horizon = smoothstep(0, 0.3, dist / (1 - p * 0.85 + 1e-3));
427446
+ const shift = pull * 0.02 / (dist + 0.2);
427447
+ const rSampX = Math.max(0, Math.min(1, ux - uvx * (warpStr + shift)));
427448
+ const rSampY = Math.max(0, Math.min(1, uy - uvy * (warpStr + shift)));
427449
+ const bSampX = Math.max(0, Math.min(1, ux - uvx * (warpStr - shift)));
427450
+ const bSampY = Math.max(0, Math.min(1, uy - uvy * (warpStr - shift)));
427451
+ const ar = sampleRgb48le(from22, rSampX, rSampY, w, h)[0];
427452
+ const ab = sampleRgb48le(from22, bSampX, bSampY, w, h)[2];
427453
+ const lensedR = Math.round(ar * horizon);
427454
+ const lensedG = Math.round(ag * horizon);
427455
+ const lensedB = Math.round(ab * horizon);
427456
+ const [toR, toG, toB] = sampleRgb48le(to, ux, uy, w, h);
427457
+ const blend = smoothstep(0.3, 0.9, p);
427458
+ out.writeUInt16LE(clamp16(mix16(lensedR, toR, blend)), o);
427459
+ out.writeUInt16LE(clamp16(mix16(lensedG, toG, blend)), o + 2);
427460
+ out.writeUInt16LE(clamp16(mix16(lensedB, toB, blend)), o + 4);
427461
+ }
427462
+ };
427463
+ TRANSITIONS["gravitational-lens"] = gravitationalLens;
427464
+ rippleWaves = (from22, to, out, w, h, p) => {
427465
+ const accentBright = [65535, 55e3, 35e3];
427466
+ for (let i = 0; i < w * h; i++) {
427467
+ const ux = i % w / w;
427468
+ const uy = Math.floor(i / w) / h;
427469
+ const o = i * 6;
427470
+ const uvx = ux - 0.5;
427471
+ const uvy = uy - 0.5;
427472
+ const dist = Math.sqrt(uvx * uvx + uvy * uvy);
427473
+ const nux = uvx + 1e-3;
427474
+ const nuy = uvy + 1e-3;
427475
+ const nlen = Math.sqrt(nux * nux + nuy * nuy);
427476
+ const dirx = nux / nlen;
427477
+ const diry = nuy / nlen;
427478
+ const fromAmp = p * 0.04;
427479
+ const fw1 = Math.exp(Math.sin(dist * 25 - p * 12) - 1);
427480
+ const fw2 = Math.exp(Math.sin(dist * 50 - p * 18) - 1) * 0.5;
427481
+ const fromUx = Math.max(0, Math.min(1, ux + dirx * (fw1 + fw2) * fromAmp));
427482
+ const fromUy = Math.max(0, Math.min(1, uy + diry * (fw1 + fw2) * fromAmp));
427483
+ const toAmp = (1 - p) * 0.04;
427484
+ const tw1 = Math.exp(Math.sin(dist * 25 + p * 12) - 1);
427485
+ const tw2 = Math.exp(Math.sin(dist * 50 + p * 18) - 1) * 0.5;
427486
+ const toUx = Math.max(0, Math.min(1, ux - dirx * (tw1 + tw2) * toAmp));
427487
+ const toUy = Math.max(0, Math.min(1, uy - diry * (tw1 + tw2) * toAmp));
427488
+ const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, fromUy, w, h);
427489
+ const [toR, toG, toB] = sampleRgb48le(to, toUx, toUy, w, h);
427490
+ const peak = fw1 * p;
427491
+ const tintR = accentBright[0] * peak * 0.1;
427492
+ const tintG = accentBright[1] * peak * 0.1;
427493
+ const tintB = accentBright[2] * peak * 0.1;
427494
+ out.writeUInt16LE(clamp16(mix16(Math.round(fromR + tintR), toR, p)), o);
427495
+ out.writeUInt16LE(clamp16(mix16(Math.round(fromG + tintG), toG, p)), o + 2);
427496
+ out.writeUInt16LE(clamp16(mix16(Math.round(fromB + tintB), toB, p)), o + 4);
427497
+ }
427498
+ };
427499
+ TRANSITIONS["ripple-waves"] = rippleWaves;
427500
+ swirlVortex = (from22, to, out, w, h, p) => {
427501
+ for (let i = 0; i < w * h; i++) {
427502
+ const ux = i % w / w;
427503
+ const uy = Math.floor(i / w) / h;
427504
+ const o = i * 6;
427505
+ const uvx = ux - 0.5;
427506
+ const uvy = uy - 0.5;
427507
+ const dist = Math.sqrt(uvx * uvx + uvy * uvy);
427508
+ const warp = fbm(ux * 4, uy * 4) * 0.5;
427509
+ const fromAng = p * (1 - dist) * 10 + warp * p * 3;
427510
+ const fs8 = Math.sin(fromAng);
427511
+ const fc = Math.cos(fromAng);
427512
+ const fromUx = Math.max(0, Math.min(1, uvx * fc - uvy * fs8 + 0.5));
427513
+ const fromUy = Math.max(0, Math.min(1, uvx * fs8 + uvy * fc + 0.5));
427514
+ const toAng = -(1 - p) * (1 - dist) * 10 - warp * (1 - p) * 3;
427515
+ const ts = Math.sin(toAng);
427516
+ const tc = Math.cos(toAng);
427517
+ const toUx = Math.max(0, Math.min(1, uvx * tc - uvy * ts + 0.5));
427518
+ const toUy = Math.max(0, Math.min(1, uvx * ts + uvy * tc + 0.5));
427519
+ const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, fromUy, w, h);
427520
+ const [toR, toG, toB] = sampleRgb48le(to, toUx, toUy, w, h);
427521
+ out.writeUInt16LE(clamp16(mix16(fromR, toR, p)), o);
427522
+ out.writeUInt16LE(clamp16(mix16(fromG, toG, p)), o + 2);
427523
+ out.writeUInt16LE(clamp16(mix16(fromB, toB, p)), o + 4);
427524
+ }
427525
+ };
427526
+ TRANSITIONS["swirl-vortex"] = swirlVortex;
427527
+ thermalDistortion = (from22, to, out, w, h, p) => {
427528
+ const accentBright = [65535, 55e3, 35e3];
427529
+ for (let i = 0; i < w * h; i++) {
427530
+ const ux = i % w / w;
427531
+ const uy = Math.floor(i / w) / h;
427532
+ const o = i * 6;
427533
+ const heat = p * 1.5;
427534
+ const yFade = smoothstep(1, 0, uy);
427535
+ const shimmer = Math.sin(uy * 40 + fbm(ux * 6, uy * 6) * 8) * fbm(ux * 3 + 0, uy * 3 + p * 2);
427536
+ const dispX = shimmer * heat * 0.03 * yFade;
427537
+ const fromUx = Math.max(0, Math.min(1, ux + dispX));
427538
+ const [fromR, fromG, fromB] = sampleRgb48le(from22, fromUx, uy, w, h);
427539
+ const invShimmer = Math.sin(uy * 40 + fbm(ux * 6 + 3, uy * 6 + 3) * 8) * fbm(ux * 3 + 3, uy * 3 + p * 2);
427540
+ const dispX2 = invShimmer * (1 - p) * 0.03 * yFade;
427541
+ const toUx = Math.max(0, Math.min(1, ux + dispX2));
427542
+ const [toR, toG, toB] = sampleRgb48le(to, toUx, uy, w, h);
427543
+ const haze = heat * yFade * 0.15 * (1 - p);
427544
+ out.writeUInt16LE(clamp16(mix16(fromR, toR, p) + Math.round(accentBright[0] * haze)), o);
427545
+ out.writeUInt16LE(clamp16(mix16(fromG, toG, p) + Math.round(accentBright[1] * haze)), o + 2);
427546
+ out.writeUInt16LE(clamp16(mix16(fromB, toB, p) + Math.round(accentBright[2] * haze)), o + 4);
427547
+ }
427548
+ };
427549
+ TRANSITIONS["thermal-distortion"] = thermalDistortion;
427550
+ domainWarp = (from22, to, out, w, h, p) => {
427551
+ const accentDark = [25e3, 8e3, 2e3];
427552
+ const accentBright = [65535, 55e3, 35e3];
427553
+ for (let i = 0; i < w * h; i++) {
427554
+ const ux = i % w / w;
427555
+ const uy = Math.floor(i / w) / h;
427556
+ const o = i * 6;
427557
+ const qx = fbm(ux * 3, uy * 3);
427558
+ const qy = fbm(ux * 3 + 5.2, uy * 3 + 1.3);
427559
+ const rx = fbm(ux * 3 + qx * 4 + 1.7, uy * 3 + qy * 4 + 9.2);
427560
+ const ry = fbm(ux * 3 + qx * 4 + 8.3, uy * 3 + qy * 4 + 2.8);
427561
+ const n = fbm(ux * 3 + rx * 2, uy * 3 + ry * 2);
427562
+ const warpDirX = (qx - 0.5) * 0.4;
427563
+ const warpDirY = (qy - 0.5) * 0.4;
427564
+ const aUx = Math.max(0, Math.min(1, ux + warpDirX * p));
427565
+ const aUy = Math.max(0, Math.min(1, uy + warpDirY * p));
427566
+ const bUx = Math.max(0, Math.min(1, ux - warpDirX * (1 - p)));
427567
+ const bUy = Math.max(0, Math.min(1, uy - warpDirY * (1 - p)));
427568
+ const [aR, aG, aB] = sampleRgb48le(from22, aUx, aUy, w, h);
427569
+ const [bR, bG, bB] = sampleRgb48le(to, bUx, bUy, w, h);
427570
+ const e = smoothstep(p - 0.08, p + 0.08, n);
427571
+ const ed = Math.abs(n - p);
427572
+ const pStep = p >= 1 ? 1 : 0;
427573
+ const em = smoothstep(0.1, 0, ed) * (1 - pStep);
427574
+ const ecBlend = smoothstep(0, 0.1, ed);
427575
+ const ecR = accentDark[0] + (accentBright[0] - accentDark[0]) * (1 - ecBlend);
427576
+ const ecG = accentDark[1] + (accentBright[1] - accentDark[1]) * (1 - ecBlend);
427577
+ const ecB = accentDark[2] + (accentBright[2] - accentDark[2]) * (1 - ecBlend);
427578
+ out.writeUInt16LE(clamp16(mix16(bR, aR, e) + Math.round(ecR * em * 2)), o);
427579
+ out.writeUInt16LE(clamp16(mix16(bG, aG, e) + Math.round(ecG * em * 2)), o + 2);
427580
+ out.writeUInt16LE(clamp16(mix16(bB, aB, e) + Math.round(ecB * em * 2)), o + 4);
427581
+ }
427582
+ };
427583
+ TRANSITIONS["domain-warp"] = domainWarp;
427584
+ ridgedBurn = (from22, to, out, w, h, p) => {
427585
+ const accent = [5e4, 25e3, 5e3];
427586
+ const accentDark = [25e3, 8e3, 2e3];
427587
+ const accentBright = [65535, 55e3, 35e3];
427588
+ for (let i = 0; i < w * h; i++) {
427589
+ const ux = i % w / w;
427590
+ const uy = Math.floor(i / w) / h;
427591
+ const o = i * 6;
427592
+ const [aR, aG, aB] = sampleRgb48le(from22, ux, uy, w, h);
427593
+ const [bR, bG, bB] = sampleRgb48le(to, ux, uy, w, h);
427594
+ const n = ridged(ux * 4, uy * 4);
427595
+ const e = smoothstep(p - 0.04, p + 0.04, n);
427596
+ const heat = smoothstep(0.12, 0, Math.abs(n - p));
427597
+ const pStep = p >= 1 ? 1 : 0;
427598
+ const heatMasked = heat * (1 - pStep);
427599
+ let burnR = accentDark[0] + (accent[0] - accentDark[0]) * smoothstep(0, 0.25, heatMasked);
427600
+ let burnG = accentDark[1] + (accent[1] - accentDark[1]) * smoothstep(0, 0.25, heatMasked);
427601
+ let burnB = accentDark[2] + (accent[2] - accentDark[2]) * smoothstep(0, 0.25, heatMasked);
427602
+ const blend2 = smoothstep(0.25, 0.5, heatMasked);
427603
+ burnR = burnR + (accentBright[0] - burnR) * blend2;
427604
+ burnG = burnG + (accentBright[1] - burnG) * blend2;
427605
+ burnB = burnB + (accentBright[2] - burnB) * blend2;
427606
+ const blend3 = smoothstep(0.5, 1, heatMasked);
427607
+ burnR = burnR + (65535 - burnR) * blend3;
427608
+ burnG = burnG + (65535 - burnG) * blend3;
427609
+ burnB = burnB + (65535 - burnB) * blend3;
427610
+ const sparks = (vnoise(ux * 80, uy * 80) >= 0.92 ? 1 : 0) * heatMasked * 3;
427611
+ out.writeUInt16LE(
427612
+ clamp16(
427613
+ mix16(bR, aR, e) + Math.round(burnR * heatMasked * 3.5) + Math.round(accentBright[0] * sparks)
427614
+ ),
427615
+ o
427616
+ );
427617
+ out.writeUInt16LE(
427618
+ clamp16(
427619
+ mix16(bG, aG, e) + Math.round(burnG * heatMasked * 3.5) + Math.round(accentBright[1] * sparks)
427620
+ ),
427621
+ o + 2
427622
+ );
427623
+ out.writeUInt16LE(
427624
+ clamp16(
427625
+ mix16(bB, aB, e) + Math.round(burnB * heatMasked * 3.5) + Math.round(accentBright[2] * sparks)
427626
+ ),
427627
+ o + 4
427628
+ );
427629
+ }
427630
+ };
427631
+ TRANSITIONS["ridged-burn"] = ridgedBurn;
425546
427632
  PRODUCER_DIR = dirname8(fileURLToPath22(import.meta.url));
425547
427633
  SIBLING_MANIFEST_PATH = resolve72(PRODUCER_DIR, "hyperframe.manifest.json");
425548
427634
  MODULE_RELATIVE_MANIFEST_PATH = resolve72(
@@ -425579,6 +427665,102 @@ ${right22.raw}`)
425579
427665
  ".ttf": "font/ttf",
425580
427666
  ".otf": "font/otf"
425581
427667
  };
427668
+ VIRTUAL_TIME_SHIM = String.raw`(function() {
427669
+ if (window.__HF_VIRTUAL_TIME__) return;
427670
+
427671
+ var virtualNowMs = 0;
427672
+ var rafId = 1;
427673
+ var rafQueue = [];
427674
+ var OriginalDate = Date;
427675
+ var originalSetTimeout = window.setTimeout.bind(window);
427676
+ var originalClearTimeout = window.clearTimeout.bind(window);
427677
+ var originalSetInterval = window.setInterval.bind(window);
427678
+ var originalClearInterval = window.clearInterval.bind(window);
427679
+ var originalRequestAnimationFrame = window.requestAnimationFrame
427680
+ ? window.requestAnimationFrame.bind(window)
427681
+ : null;
427682
+ var originalCancelAnimationFrame = window.cancelAnimationFrame
427683
+ ? window.cancelAnimationFrame.bind(window)
427684
+ : null;
427685
+
427686
+ function flushAnimationFrame() {
427687
+ if (!rafQueue.length) return;
427688
+ var current = rafQueue.slice();
427689
+ rafQueue.length = 0;
427690
+ for (var i = 0; i < current.length; i++) {
427691
+ var entry = current[i];
427692
+ if (entry.cancelled) continue;
427693
+ try {
427694
+ entry.callback(virtualNowMs);
427695
+ } catch {}
427696
+ }
427697
+ }
427698
+
427699
+ function VirtualDate() {
427700
+ var args = Array.prototype.slice.call(arguments);
427701
+ if (!(this instanceof VirtualDate)) {
427702
+ return OriginalDate.apply(null, args.length ? args : [virtualNowMs]);
427703
+ }
427704
+ var instance = args.length ? new (Function.prototype.bind.apply(OriginalDate, [null].concat(args)))() : new OriginalDate(virtualNowMs);
427705
+ Object.setPrototypeOf(instance, VirtualDate.prototype);
427706
+ return instance;
427707
+ }
427708
+
427709
+ VirtualDate.prototype = OriginalDate.prototype;
427710
+ Object.setPrototypeOf(VirtualDate, OriginalDate);
427711
+ VirtualDate.now = function() { return virtualNowMs; };
427712
+ VirtualDate.parse = OriginalDate.parse.bind(OriginalDate);
427713
+ VirtualDate.UTC = OriginalDate.UTC.bind(OriginalDate);
427714
+
427715
+ try {
427716
+ Object.defineProperty(window, "Date", {
427717
+ configurable: true,
427718
+ writable: true,
427719
+ value: VirtualDate,
427720
+ });
427721
+ } catch {}
427722
+
427723
+ if (window.performance && typeof window.performance.now === "function") {
427724
+ try {
427725
+ Object.defineProperty(window.performance, "now", {
427726
+ configurable: true,
427727
+ value: function() { return virtualNowMs; },
427728
+ });
427729
+ } catch {}
427730
+ }
427731
+
427732
+ window.requestAnimationFrame = function(callback) {
427733
+ if (typeof callback !== "function") return 0;
427734
+ var entry = { id: rafId++, callback: callback, cancelled: false };
427735
+ rafQueue.push(entry);
427736
+ return entry.id;
427737
+ };
427738
+ window.cancelAnimationFrame = function(id) {
427739
+ for (var i = 0; i < rafQueue.length; i++) {
427740
+ if (rafQueue[i].id === id) {
427741
+ rafQueue[i].cancelled = true;
427742
+ }
427743
+ }
427744
+ };
427745
+
427746
+ window.__HF_VIRTUAL_TIME__ = {
427747
+ originalSetTimeout: originalSetTimeout,
427748
+ originalClearTimeout: originalClearTimeout,
427749
+ originalSetInterval: originalSetInterval,
427750
+ originalClearInterval: originalClearInterval,
427751
+ originalRequestAnimationFrame: originalRequestAnimationFrame,
427752
+ originalCancelAnimationFrame: originalCancelAnimationFrame,
427753
+ seekToTime: function(nextTimeMs) {
427754
+ var safeTimeMs = Math.max(0, Number(nextTimeMs) || 0);
427755
+ virtualNowMs = safeTimeMs;
427756
+ flushAnimationFrame();
427757
+ return virtualNowMs;
427758
+ },
427759
+ getTime: function() {
427760
+ return virtualNowMs;
427761
+ },
427762
+ };
427763
+ })();`;
425582
427764
  RENDER_SEEK_MODE = process.env.PRODUCER_RUNTIME_RENDER_SEEK_MODE === "strict-boundary" ? "strict-boundary" : "preview-phase";
425583
427765
  RENDER_SEEK_DIAGNOSTICS = process.env.PRODUCER_DEBUG_SEEK_DIAGNOSTICS === "true";
425584
427766
  RENDER_SEEK_STEP = Math.max(
@@ -425590,6 +427772,10 @@ ${right22.raw}`)
425590
427772
  Math.min(0.95, Number(process.env.PRODUCER_RUNTIME_RENDER_SEEK_OFFSET_FRACTION || 0.5))
425591
427773
  );
425592
427774
  RENDER_MODE_SCRIPT = `(function() {
427775
+ var __realSetTimeout =
427776
+ window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.originalSetTimeout === "function"
427777
+ ? window.__HF_VIRTUAL_TIME__.originalSetTimeout
427778
+ : window.setTimeout.bind(window);
425593
427779
  var __seekMode = ${JSON.stringify(RENDER_SEEK_MODE)};
425594
427780
  var __seekDiagnostics = ${RENDER_SEEK_DIAGNOSTICS ? "true" : "false"};
425595
427781
  var __seekStep = ${RENDER_SEEK_STEP};
@@ -425683,42 +427869,91 @@ ${right22.raw}`)
425683
427869
  window.__renderReady = true;
425684
427870
  return;
425685
427871
  }
425686
- setTimeout(waitForPlayer, 50);
427872
+ __realSetTimeout(waitForPlayer, 50);
425687
427873
  return;
425688
427874
  }
425689
427875
  if (installMediaFallbackPlayer()) {
425690
427876
  return;
425691
427877
  }
425692
- setTimeout(waitForPlayer, 50);
427878
+ __realSetTimeout(waitForPlayer, 50);
425693
427879
  }
425694
427880
  waitForPlayer();
427881
+ })();`;
427882
+ HF_EARLY_STUB = `(function() {
427883
+ if (typeof window === "undefined") return;
427884
+ if (!window.__hf) window.__hf = {};
425695
427885
  })();`;
425696
427886
  HF_BRIDGE_SCRIPT = `(function() {
427887
+ var __realSetInterval =
427888
+ window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.originalSetInterval === "function"
427889
+ ? window.__HF_VIRTUAL_TIME__.originalSetInterval
427890
+ : window.setInterval.bind(window);
427891
+ var __realClearInterval =
427892
+ window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.originalClearInterval === "function"
427893
+ ? window.__HF_VIRTUAL_TIME__.originalClearInterval
427894
+ : window.clearInterval.bind(window);
425697
427895
  function getDeclaredDuration() {
425698
427896
  var root = document.querySelector('[data-composition-id]');
425699
427897
  if (!root) return 0;
425700
427898
  var d = Number(root.getAttribute('data-duration'));
425701
427899
  return Number.isFinite(d) && d > 0 ? d : 0;
425702
427900
  }
427901
+ function seekSameOriginChildFrames(frameWindow, nextTimeMs) {
427902
+ var frames;
427903
+ try {
427904
+ frames = frameWindow.frames;
427905
+ } catch (_error) {
427906
+ return;
427907
+ }
427908
+ if (!frames || typeof frames.length !== "number") return;
427909
+ for (var i = 0; i < frames.length; i++) {
427910
+ var childWindow = null;
427911
+ try {
427912
+ childWindow = frames[i];
427913
+ if (!childWindow || childWindow === frameWindow) continue;
427914
+ if (
427915
+ childWindow.__HF_VIRTUAL_TIME__ &&
427916
+ typeof childWindow.__HF_VIRTUAL_TIME__.seekToTime === "function"
427917
+ ) {
427918
+ childWindow.__HF_VIRTUAL_TIME__.seekToTime(nextTimeMs);
427919
+ }
427920
+ } catch (_error) {
427921
+ continue;
427922
+ }
427923
+ seekSameOriginChildFrames(childWindow, nextTimeMs);
427924
+ }
427925
+ }
425703
427926
  function bridge() {
425704
427927
  var p = window.__player;
425705
427928
  if (!p || typeof p.renderSeek !== "function" || typeof p.getDuration !== "function") {
425706
427929
  return false;
425707
427930
  }
425708
- window.__hf = {
425709
- get duration() {
427931
+ var hf = window.__hf || {};
427932
+ Object.defineProperty(hf, "duration", {
427933
+ configurable: true,
427934
+ enumerable: true,
427935
+ get: function() {
425710
427936
  var d = p.getDuration();
425711
427937
  return d > 0 ? d : getDeclaredDuration();
425712
427938
  },
425713
- seek: function(t) { p.renderSeek(t); },
427939
+ });
427940
+ hf.seek = function(t) {
427941
+ p.renderSeek(t);
427942
+ var nextTimeMs = (Math.max(0, Number(t) || 0)) * 1000;
427943
+ if (window.__HF_VIRTUAL_TIME__ && typeof window.__HF_VIRTUAL_TIME__.seekToTime === "function") {
427944
+ window.__HF_VIRTUAL_TIME__.seekToTime(nextTimeMs);
427945
+ }
427946
+ seekSameOriginChildFrames(window, nextTimeMs);
425714
427947
  };
427948
+ window.__hf = hf;
425715
427949
  return true;
425716
427950
  }
425717
427951
  if (bridge()) return;
425718
- var iv = setInterval(function() {
425719
- if (bridge()) clearInterval(iv);
427952
+ var iv = __realSetInterval(function() {
427953
+ if (bridge()) __realClearInterval(iv);
425720
427954
  }, 50);
425721
427955
  })();`;
427956
+ DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve82(new URL(import.meta.url).pathname, "../../..", "renders");
425722
427957
  EMBEDDED_FONT_DATA = /* @__PURE__ */ new Map([
425723
427958
  ["@fontsource/inter:400:normal", "data:font/woff2;base64,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"],
425724
427959
  ["@fontsource/inter:700:normal", "data:font/woff2;base64,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"],
@@ -425886,8 +428121,9 @@ ${right22.raw}`)
425886
428121
  poppins: "poppins",
425887
428122
  "segoe ui": "roboto"
425888
428123
  };
425889
- GOOGLE_FONTS_CACHE_DIR = join12(homedir22(), ".cache", "hyperframes", "fonts");
428124
+ GOOGLE_FONTS_CACHE_DIR = join13(homedir22(), ".cache", "hyperframes", "fonts");
425890
428125
  WOFF2_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
428126
+ INLINE_SCRIPT_PATTERN = /<script\b([^>]*)>([\s\S]*?)<\/script>/gi;
425891
428127
  LOG_LEVEL_PRIORITY = {
425892
428128
  error: 0,
425893
428129
  warn: 1,
@@ -425895,6 +428131,8 @@ ${right22.raw}`)
425895
428131
  debug: 3
425896
428132
  };
425897
428133
  defaultLogger = createConsoleLogger("info");
428134
+ frameDirMaxIndexCache = /* @__PURE__ */ new Map();
428135
+ FRAME_FILENAME_RE = /^frame_(\d+)\.png$/;
425898
428136
  RenderCancelledError = class extends Error {
425899
428137
  reason;
425900
428138
  constructor(message = "render_cancelled", reason = "aborted") {
@@ -426046,7 +428284,6 @@ ${right22.raw}`)
426046
428284
  run(stream2, cb, onError);
426047
428285
  return c.newResponse(stream2.responseReadable);
426048
428286
  };
426049
- DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve11(new URL(import.meta.url).pathname, "../../..", "renders");
426050
428287
  Semaphore = class {
426051
428288
  constructor(maxConcurrent) {
426052
428289
  this.maxConcurrent = maxConcurrent;
@@ -429789,7 +432026,8 @@ Instruction: ${instruction}`
429789
432026
  };
429790
432027
  ClaudeProvider.MOTION_MODELS = {
429791
432028
  sonnet: "claude-sonnet-4-6",
429792
- opus: "claude-opus-4-6"
432029
+ opus: "claude-opus-4-7",
432030
+ "opus-4-6": "claude-opus-4-6"
429793
432031
  };
429794
432032
  claudeProvider = new ClaudeProvider();
429795
432033
  }
@@ -447408,7 +449646,8 @@ var init_ai_motion = __esm({
447408
449646
  init_validate();
447409
449647
  MODEL_MAP2 = {
447410
449648
  sonnet: { provider: "claude", modelId: "claude-sonnet-4-6" },
447411
- opus: { provider: "claude", modelId: "claude-opus-4-6" },
449649
+ opus: { provider: "claude", modelId: "claude-opus-4-7" },
449650
+ "opus-4-6": { provider: "claude", modelId: "claude-opus-4-6" },
447412
449651
  gemini: { provider: "gemini", modelId: "gemini-2.5-pro" },
447413
449652
  "gemini-3.1-pro": { provider: "gemini", modelId: "gemini-3.1-pro-preview" }
447414
449653
  };