@pixerate/editor 0.172.0 → 0.174.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/animation-editor/index.cjs +9 -9
  2. package/dist/animation-editor/index.js +1 -1
  3. package/dist/canvas/index.cjs +7 -7
  4. package/dist/canvas/index.js +1 -1
  5. package/dist/{chunk-CYKWYP6D.cjs → chunk-6DUEV36F.cjs} +14 -14
  6. package/dist/{chunk-7KWJEYIK.js → chunk-6G2NLMVK.js} +36 -4
  7. package/dist/{chunk-RUZQMYXH.cjs → chunk-A3A5TI6R.cjs} +43 -11
  8. package/dist/chunk-NZ3CTY7K.js +260 -0
  9. package/dist/{chunk-YN4AYYBJ.js → chunk-OZSA5YEJ.js} +1 -1
  10. package/dist/chunk-VCL7CB56.cjs +260 -0
  11. package/dist/{chunk-HCC2LBCW.js → chunk-WMVEYSOA.js} +1 -1
  12. package/dist/{chunk-3OSXHLIT.cjs → chunk-Z64NRDEH.cjs} +7 -7
  13. package/dist/commands/format.d.cts +43 -0
  14. package/dist/commands/format.d.ts +43 -0
  15. package/dist/commands/index.cjs +7 -1
  16. package/dist/commands/index.d.cts +1 -0
  17. package/dist/commands/index.d.ts +1 -0
  18. package/dist/commands/index.js +6 -0
  19. package/dist/effects/helpers.d.cts +11 -2
  20. package/dist/effects/helpers.d.ts +11 -2
  21. package/dist/effects/index.cjs +40 -34
  22. package/dist/effects/index.js +8 -2
  23. package/dist/effects/types.d.cts +2 -0
  24. package/dist/effects/types.d.ts +2 -0
  25. package/dist/image-editor/index.cjs +13 -13
  26. package/dist/image-editor/index.js +1 -1
  27. package/dist/index.cjs +7 -1
  28. package/dist/index.d.cts +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.js +6 -0
  31. package/dist/paint-editor/index.cjs +7 -7
  32. package/dist/paint-editor/index.js +2 -2
  33. package/dist/vector/index.cjs +6 -6
  34. package/dist/vector/index.js +1 -1
  35. package/dist/video-editor/index.cjs +309 -309
  36. package/dist/video-editor/index.js +3 -3
  37. package/package.json +3 -2
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7;
2
2
 
3
- var _chunkCYKWYP6Dcjs = require('../chunk-CYKWYP6D.cjs');
3
+ var _chunk6DUEV36Fcjs = require('../chunk-6DUEV36F.cjs');
4
4
 
5
5
 
6
6
 
@@ -148,7 +148,7 @@ var _chunkCYKWYP6Dcjs = require('../chunk-CYKWYP6D.cjs');
148
148
 
149
149
 
150
150
 
151
- var _chunk3OSXHLITcjs = require('../chunk-3OSXHLIT.cjs');
151
+ var _chunkZ64NRDEHcjs = require('../chunk-Z64NRDEH.cjs');
152
152
  require('../chunk-PY4GWSE2.cjs');
153
153
 
154
154
 
@@ -157,7 +157,7 @@ var _chunkEBDZWIOPcjs = require('../chunk-EBDZWIOP.cjs');
157
157
 
158
158
 
159
159
 
160
- var _chunkRUZQMYXHcjs = require('../chunk-RUZQMYXH.cjs');
160
+ var _chunkA3A5TI6Rcjs = require('../chunk-A3A5TI6R.cjs');
161
161
  require('../chunk-WOFXZ3XU.cjs');
162
162
 
163
163
 
@@ -216,7 +216,7 @@ function parseVideoEase(v, path) {
216
216
  if (v[0] < 0 || v[0] > 1 || v[2] < 0 || v[2] > 1) fail(path, "must have x1 and x2 between 0 and 1");
217
217
  return [v[0], v[1], v[2], v[3]];
218
218
  }
219
- return oneOf(v, _chunk3OSXHLITcjs.VIDEO_EASE_NAMES, path);
219
+ return oneOf(v, _chunkZ64NRDEHcjs.VIDEO_EASE_NAMES, path);
220
220
  }
221
221
  function parseVideoKeyframes(v, path, { min, max } = {}) {
222
222
  if (!isObject(v)) return fail(path, "must be a number or keyframes { keys: [{ t, v, ease }] }");
@@ -254,7 +254,7 @@ function parseVideoTimeRemap(v, speed, path) {
254
254
  if (typeof remap === "number" || remap === void 0) return fail(path, "must be keyframes { keys: [{ t, v, ease }] } (v: ms of source after the in point)");
255
255
  if (speed !== void 0 && speed !== 1) fail(path, 'cannot be used with a speed; a ramp sets the speed itself (remove "speed")');
256
256
  try {
257
- _chunk3OSXHLITcjs.checkVideoTimeRemap.call(void 0, remap, path);
257
+ _chunkZ64NRDEHcjs.checkVideoTimeRemap.call(void 0, remap, path);
258
258
  } catch (e) {
259
259
  throw new Error(e.message.replace(/\.?$/, "."));
260
260
  }
@@ -264,17 +264,17 @@ function parseVideoClipAnimation(v, path) {
264
264
  if (v === void 0) return void 0;
265
265
  if (!isObject(v)) return fail(path, "must be an object { effect, duration }");
266
266
  return compact({
267
- effect: oneOf(v.effect, _chunk3OSXHLITcjs.VIDEO_CLIP_ANIMATION_EFFECTS, `${path}.effect`, false),
267
+ effect: oneOf(v.effect, _chunkZ64NRDEHcjs.VIDEO_CLIP_ANIMATION_EFFECTS, `${path}.effect`, false),
268
268
  duration: num(v.duration, `${path}.duration`, { optional: true, positive: true })
269
269
  });
270
270
  }
271
271
  function parseVideoGrade(v, path) {
272
272
  if (v === void 0) return void 0;
273
273
  if (!isObject(v)) return fail(path, "must be an object such as { exposure, contrast, saturation }");
274
- const known = /* @__PURE__ */ new Set([..._chunk3OSXHLITcjs.VIDEO_GRADE_CONTROLS.map((c) => c.key), "lut"]);
274
+ const known = /* @__PURE__ */ new Set([..._chunkZ64NRDEHcjs.VIDEO_GRADE_CONTROLS.map((c) => c.key), "lut"]);
275
275
  const unknown = Object.keys(v).find((k) => !known.has(k));
276
276
  if (unknown) fail(`${path}.${unknown}`, `is not a grade setting; use ${[...known].join(", ")}`);
277
- return compact({ ...Object.fromEntries(_chunk3OSXHLITcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, num(v[c.key], `${path}.${c.key}`, { optional: true, min: c.min, max: c.max })])), lut: parseVideoGradeLut(v.lut, `${path}.lut`) });
277
+ return compact({ ...Object.fromEntries(_chunkZ64NRDEHcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, num(v[c.key], `${path}.${c.key}`, { optional: true, min: c.min, max: c.max })])), lut: parseVideoGradeLut(v.lut, `${path}.lut`) });
278
278
  }
279
279
  function parseVideoGradeLut(v, path) {
280
280
  if (v === void 0) return void 0;
@@ -289,7 +289,7 @@ function parseVideoClipMask(v, path) {
289
289
  if (!isObject(v)) return fail(path, 'must be an object such as { shape: "ellipse", x: 0.5, y: 0.5, width: 0.4, height: 0.6, feather: 20 }');
290
290
  const unknown = Object.keys(v).find((k) => !MASK_KEYS.includes(k));
291
291
  if (unknown) fail(`${path}.${unknown}`, `is not a mask setting; use ${MASK_KEYS.join(", ")}`);
292
- const shape = oneOf(v.shape, _chunk3OSXHLITcjs.VIDEO_MASK_SHAPES, `${path}.shape`, false);
292
+ const shape = oneOf(v.shape, _chunkZ64NRDEHcjs.VIDEO_MASK_SHAPES, `${path}.shape`, false);
293
293
  let points;
294
294
  if (v.points !== void 0) {
295
295
  if (shape !== "polygon") fail(`${path}.points`, "is only for polygon masks");
@@ -315,15 +315,15 @@ function parseVideoClipMask(v, path) {
315
315
  function parseVideoTransition(v, path) {
316
316
  if (v === void 0) return void 0;
317
317
  if (!isObject(v)) return fail(path, "must be an object { type, duration }");
318
- const type = oneOf(v.type, _chunk3OSXHLITcjs.VIDEO_TRANSITION_TYPES, `${path}.type`, false);
318
+ const type = oneOf(v.type, _chunkZ64NRDEHcjs.VIDEO_TRANSITION_TYPES, `${path}.type`, false);
319
319
  if (type === "effect" && v.effect === void 0) fail(`${path}.effect`, 'is required for an effect transition: { effect: "<effect id>", values }');
320
320
  if (type !== "effect" && v.effect !== void 0) fail(`${path}.effect`, 'is only for transitions of type "effect"');
321
321
  return compact({
322
322
  type,
323
323
  duration: num(v.duration, `${path}.duration`, { positive: true }),
324
324
  color: str(v.color, `${path}.color`, true),
325
- direction: oneOf(v.direction, _chunk3OSXHLITcjs.VIDEO_WIPE_DIRECTIONS, `${path}.direction`),
326
- audioCurve: oneOf(v.audioCurve, _chunk3OSXHLITcjs.VIDEO_FADE_CURVES, `${path}.audioCurve`),
325
+ direction: oneOf(v.direction, _chunkZ64NRDEHcjs.VIDEO_WIPE_DIRECTIONS, `${path}.direction`),
326
+ audioCurve: oneOf(v.audioCurve, _chunkZ64NRDEHcjs.VIDEO_FADE_CURVES, `${path}.audioCurve`),
327
327
  effect: v.effect === void 0 ? void 0 : parseVideoEffectRef(v.effect, `${path}.effect`, false)
328
328
  });
329
329
  }
@@ -416,7 +416,7 @@ function parseVideoAssetProxies(v, path) {
416
416
  }
417
417
  function parseVideoClip(v, path = "clip") {
418
418
  if (!isObject(v)) return fail(path, "must be an object");
419
- const type = oneOf(_nullishCoalesce(v.type, () => ( "media")), _chunk3OSXHLITcjs.VIDEO_CLIP_TYPES, `${path}.type`, false);
419
+ const type = oneOf(_nullishCoalesce(v.type, () => ( "media")), _chunkZ64NRDEHcjs.VIDEO_CLIP_TYPES, `${path}.type`, false);
420
420
  const base = {
421
421
  id: str(v.id, `${path}.id`),
422
422
  name: str(v.name, `${path}.name`, true),
@@ -424,8 +424,8 @@ function parseVideoClip(v, path = "clip") {
424
424
  duration: num(v.duration, `${path}.duration`, { positive: true }),
425
425
  opacity: parseVideoAnimatable(v.opacity, `${path}.opacity`, { optional: true, min: 0, max: 1 }),
426
426
  transform: parseVideoTransform(v.transform, `${path}.transform`),
427
- fit: oneOf(v.fit, _chunk3OSXHLITcjs.VIDEO_FITS, `${path}.fit`),
428
- blend: oneOf(v.blend, _chunk3OSXHLITcjs.VIDEO_BLEND_MODES, `${path}.blend`),
427
+ fit: oneOf(v.fit, _chunkZ64NRDEHcjs.VIDEO_FITS, `${path}.fit`),
428
+ blend: oneOf(v.blend, _chunkZ64NRDEHcjs.VIDEO_BLEND_MODES, `${path}.blend`),
429
429
  grade: parseVideoGrade(v.grade, `${path}.grade`),
430
430
  animateIn: parseVideoClipAnimation(v.animateIn, `${path}.animateIn`),
431
431
  animateOut: parseVideoClipAnimation(v.animateOut, `${path}.animateOut`),
@@ -445,8 +445,8 @@ function parseVideoClip(v, path = "clip") {
445
445
  volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
446
446
  muted: bool(v.muted, `${path}.muted`),
447
447
  timeRemap: parseVideoTimeRemap(v.timeRemap, v.speed, `${path}.timeRemap`),
448
- fadeInCurve: oneOf(v.fadeInCurve, _chunk3OSXHLITcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
449
- fadeOutCurve: oneOf(v.fadeOutCurve, _chunk3OSXHLITcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
448
+ fadeInCurve: oneOf(v.fadeInCurve, _chunkZ64NRDEHcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
449
+ fadeOutCurve: oneOf(v.fadeOutCurve, _chunkZ64NRDEHcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
450
450
  });
451
451
  if (type === "sequence") {
452
452
  for (const key of ["speed", "timeRemap"])
@@ -458,8 +458,8 @@ function parseVideoClip(v, path = "clip") {
458
458
  in: num(v.in, `${path}.in`, { optional: true, min: 0 }),
459
459
  volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
460
460
  muted: bool(v.muted, `${path}.muted`),
461
- fadeInCurve: oneOf(v.fadeInCurve, _chunk3OSXHLITcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
462
- fadeOutCurve: oneOf(v.fadeOutCurve, _chunk3OSXHLITcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
461
+ fadeInCurve: oneOf(v.fadeInCurve, _chunkZ64NRDEHcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
462
+ fadeOutCurve: oneOf(v.fadeOutCurve, _chunkZ64NRDEHcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
463
463
  });
464
464
  }
465
465
  if (type === "text")
@@ -474,7 +474,7 @@ function parseVideoClip(v, path = "clip") {
474
474
  background: str(v.background, `${path}.background`, true)
475
475
  });
476
476
  if (type === "adjustment") {
477
- const scope = oneOf(v.scope, _chunk3OSXHLITcjs.VIDEO_ADJUSTMENT_SCOPES, `${path}.scope`);
477
+ const scope = oneOf(v.scope, _chunkZ64NRDEHcjs.VIDEO_ADJUSTMENT_SCOPES, `${path}.scope`);
478
478
  const targetTrack = str(v.targetTrack, `${path}.targetTrack`, true);
479
479
  if (scope === "track" && !targetTrack) fail(`${path}.targetTrack`, 'is required when scope is "track": the id of the track whose pictures the adjustment changes');
480
480
  if (targetTrack !== void 0 && scope !== "track") fail(`${path}.targetTrack`, 'is only for scope "track"');
@@ -577,9 +577,9 @@ function createVideoProject(options = {}) {
577
577
  // src/video-editor/check.ts
578
578
  function videoClipKeyframes(clip) {
579
579
  const out = [
580
- { property: "opacity", keys: _chunk3OSXHLITcjs.videoKeysOf.call(void 0, clip.opacity) },
581
- { property: "volume", keys: clip.type === "media" || clip.type === "sequence" ? _chunk3OSXHLITcjs.videoKeysOf.call(void 0, clip.volume) : [] },
582
- ..._chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES.map((p) => ({ property: p, keys: _chunk3OSXHLITcjs.videoKeysOf.call(void 0, _optionalChain([clip, 'access', _2 => _2.transform, 'optionalAccess', _3 => _3[p]])) }))
580
+ { property: "opacity", keys: _chunkZ64NRDEHcjs.videoKeysOf.call(void 0, clip.opacity) },
581
+ { property: "volume", keys: clip.type === "media" || clip.type === "sequence" ? _chunkZ64NRDEHcjs.videoKeysOf.call(void 0, clip.volume) : [] },
582
+ ..._chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES.map((p) => ({ property: p, keys: _chunkZ64NRDEHcjs.videoKeysOf.call(void 0, _optionalChain([clip, 'access', _2 => _2.transform, 'optionalAccess', _3 => _3[p]])) }))
583
583
  ];
584
584
  return out.filter((o) => o.keys.length);
585
585
  }
@@ -607,8 +607,8 @@ var VIDEO_ISSUE_CODES = [
607
607
  var videoIssueKey = (i) => [i.code, _nullishCoalesce(i.sequence, () => ( "")), _nullishCoalesce(i.track, () => ( "")), _nullishCoalesce(i.clip, () => ( "")), _nullishCoalesce(i.asset, () => ( "")), _nullishCoalesce(i.marker, () => ( ""))].join("|");
608
608
  function checkVideoProject(project) {
609
609
  const issues = [];
610
- const assets = _chunk3OSXHLITcjs.videoAssetMap.call(void 0, project);
611
- const sequences = _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, project);
610
+ const assets = _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, project);
611
+ const sequences = _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, project);
612
612
  const used = /* @__PURE__ */ new Set();
613
613
  const usedSequences = /* @__PURE__ */ new Set();
614
614
  const cycles = /* @__PURE__ */ new Map();
@@ -616,7 +616,7 @@ function checkVideoProject(project) {
616
616
  if ((asset.kind === "video" || asset.kind === "audio") && asset.duration === void 0)
617
617
  issues.push({ code: "unknown-duration", severity: "warning", asset: asset.id, message: `Asset "${asset.id}" has no duration, so clips of it cannot be checked against its length; set "duration" in ms.` });
618
618
  const checkTrack = (track, sequence) => {
619
- const clips = _chunk3OSXHLITcjs.sortedVideoClips.call(void 0, track);
619
+ const clips = _chunkZ64NRDEHcjs.sortedVideoClips.call(void 0, track);
620
620
  const where = sequence ? ` in sequence "${sequence}"` : "";
621
621
  for (let i = 0; i < clips.length; i++) {
622
622
  const clip = clips[i];
@@ -626,13 +626,13 @@ function checkVideoProject(project) {
626
626
  const seq = sequences.get(clip.sequence);
627
627
  if (!seq) issues.push({ code: "missing-sequence", severity: "error", ...at, message: `Compound clip "${clip.id}" plays sequence "${clip.sequence}", which is not in the project; add the sequence or delete the clip.` });
628
628
  else {
629
- if (!cycles.has(seq.id)) cycles.set(seq.id, _chunk3OSXHLITcjs.findVideoSequenceCycle.call(void 0, project, seq.id));
629
+ if (!cycles.has(seq.id)) cycles.set(seq.id, _chunkZ64NRDEHcjs.findVideoSequenceCycle.call(void 0, project, seq.id));
630
630
  const cycle = cycles.get(seq.id);
631
631
  if (cycle) issues.push({ code: "sequence-cycle", severity: "error", ...at, message: `Compound clip "${clip.id}" plays sequence "${seq.id}", which contains itself (${cycle.join(" \u2192 ")}), so it is left out of the picture and sound; remove the compound clip that closes the loop.` });
632
- const length = _chunk3OSXHLITcjs.videoSequenceDuration.call(void 0, seq);
633
- const range = _chunk3OSXHLITcjs.videoClipSourceRange.call(void 0, clip);
634
- if (range.out > length + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
635
- issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, range.out)} of sequence "${seq.id}", which is only ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, length)} long; shorten the clip or move its in point.` });
632
+ const length = _chunkZ64NRDEHcjs.videoSequenceDuration.call(void 0, seq);
633
+ const range = _chunkZ64NRDEHcjs.videoClipSourceRange.call(void 0, clip);
634
+ if (range.out > length + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
635
+ issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, range.out)} of sequence "${seq.id}", which is only ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, length)} long; shorten the clip or move its in point.` });
636
636
  }
637
637
  } else if (clip.type === "media") {
638
638
  used.add(clip.asset);
@@ -641,30 +641,30 @@ function checkVideoProject(project) {
641
641
  else {
642
642
  if (track.kind === "audio" && asset.kind === "image") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is an image on audio track "${track.id}"; move it to a video track.` });
643
643
  if (track.kind === "video" && asset.kind === "audio") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is audio on video track "${track.id}"; move it to an audio track.` });
644
- const range = _chunk3OSXHLITcjs.videoClipSourceRange.call(void 0, clip);
645
- if (asset.duration !== void 0 && range.out > asset.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
646
- issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, range.out)} of "${asset.id}", which is only ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, asset.duration)} long; shorten the clip or move its in point.` });
644
+ const range = _chunkZ64NRDEHcjs.videoClipSourceRange.call(void 0, clip);
645
+ if (asset.duration !== void 0 && range.out > asset.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
646
+ issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, range.out)} of "${asset.id}", which is only ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, asset.duration)} long; shorten the clip or move its in point.` });
647
647
  }
648
648
  } else if (track.kind === "audio") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is a ${clip.type} clip on audio track "${track.id}"; move it to a video track.` });
649
649
  if (clip.type === "adjustment" && (_nullishCoalesce(clip.scope, () => ( "underneath"))) === "track" && !(sequence ? _nullishCoalesce(_optionalChain([sequences, 'access', _4 => _4.get, 'call', _5 => _5(sequence), 'optionalAccess', _6 => _6.tracks]), () => ( [])) : project.tracks).some((t) => t.id === clip.targetTrack))
650
650
  issues.push({ code: "missing-target-track", severity: "warning", ...at, message: `Adjustment clip "${clip.id}" changes track "${clip.targetTrack}", which is not ${sequence ? `in sequence "${sequence}"` : "in the project"}, so it changes nothing; set its targetTrack to a track beside it or change its scope.` });
651
651
  const next = clips[i + 1];
652
- if (next && next.start < _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip) - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
653
- issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, next.start)}; move one of them.` });
654
- if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
652
+ if (next && next.start < _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip) - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
653
+ issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, next.start)}; move one of them.` });
654
+ if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
655
655
  issues.push({ code: "fades-too-long", severity: "warning", ...at, message: `Clip "${clip.id}"'s fades (${_nullishCoalesce(clip.fadeIn, () => ( 0))} + ${_nullishCoalesce(clip.fadeOut, () => ( 0))} ms) are longer than the clip (${clip.duration} ms); shorten them.` });
656
- const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => ( _chunk3OSXHLITcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0) + (clip.animateOut ? _nullishCoalesce(clip.animateOut.duration, () => ( _chunk3OSXHLITcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0);
657
- if (anim > clip.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
656
+ const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => ( _chunkZ64NRDEHcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0) + (clip.animateOut ? _nullishCoalesce(clip.animateOut.duration, () => ( _chunkZ64NRDEHcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0);
657
+ if (anim > clip.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
658
658
  issues.push({ code: "animations-too-long", severity: "warning", ...at, message: `Clip "${clip.id}"'s entrance and exit (${anim} ms together) are longer than the clip (${clip.duration} ms), so both are shortened; give them shorter durations.` });
659
659
  for (const which of ["animateIn", "animateOut"]) {
660
660
  const a = clip[which];
661
661
  if (!a) continue;
662
- const keyed = _chunk3OSXHLITcjs.videoClipAnimationProperties.call(void 0, a).filter((p) => _chunk3OSXHLITcjs.videoKeysOf.call(void 0, p === "opacity" ? clip.opacity : _optionalChain([clip, 'access', _7 => _7.transform, 'optionalAccess', _8 => _8[p]])).length);
662
+ const keyed = _chunkZ64NRDEHcjs.videoClipAnimationProperties.call(void 0, a).filter((p) => _chunkZ64NRDEHcjs.videoKeysOf.call(void 0, p === "opacity" ? clip.opacity : _optionalChain([clip, 'access', _7 => _7.transform, 'optionalAccess', _8 => _8[p]])).length);
663
663
  if (keyed.length)
664
664
  issues.push({ code: "animation-keyed", severity: "note", ...at, message: `Clip "${clip.id}"'s ${a.effect} ${which === "animateIn" ? "entrance" : "exit"} leaves ${keyed.join(", ")} alone, because the clip keys ${keyed.length > 1 ? "them" : "it"} itself; remove those keyframes or the animation.` });
665
665
  }
666
666
  for (const { property, keys } of videoClipKeyframes(clip)) {
667
- const outside = keys.filter((k) => k.t < -_chunk3OSXHLITcjs.VIDEO_TIME_EPSILON || k.t > clip.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON);
667
+ const outside = keys.filter((k) => k.t < -_chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON || k.t > clip.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON);
668
668
  if (outside.length)
669
669
  issues.push({
670
670
  code: "keyframes-outside-clip",
@@ -675,20 +675,20 @@ function checkVideoProject(project) {
675
675
  }
676
676
  if (clip.transition) {
677
677
  const d = clip.transition.duration;
678
- const before = _chunk3OSXHLITcjs.videoClipBefore.call(void 0, track, clip);
678
+ const before = _chunkZ64NRDEHcjs.videoClipBefore.call(void 0, track, clip);
679
679
  if (!before) {
680
680
  issues.push({ code: "transition-without-cut", severity: "warning", ...at, message: `Clip "${clip.id}" has a transition but no clip ends where it starts on track "${track.id}", so it plays as nothing; butt a clip up against it or remove the transition.` });
681
681
  continue;
682
682
  }
683
- if (d > clip.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON || d > before.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) {
683
+ if (d > clip.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON || d > before.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) {
684
684
  issues.push({ code: "transition-too-long", severity: "error", ...at, message: `The ${d} ms transition into "${clip.id}" is longer than "${clip.id}" (${clip.duration} ms) or "${before.id}" (${before.duration} ms); make it at most ${Math.min(clip.duration, before.duration)} ms.` });
685
685
  continue;
686
686
  }
687
687
  if (clip.transition.type === "dip") continue;
688
- const outgoing = _chunk3OSXHLITcjs.videoClipHandles.call(void 0, before, assets, sequences).after;
689
- const incoming = _chunk3OSXHLITcjs.videoClipHandles.call(void 0, clip, assets, sequences).before;
688
+ const outgoing = _chunkZ64NRDEHcjs.videoClipHandles.call(void 0, before, assets, sequences).after;
689
+ const incoming = _chunkZ64NRDEHcjs.videoClipHandles.call(void 0, clip, assets, sequences).before;
690
690
  const half = d / 2;
691
- if (outgoing < half - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON || incoming < half - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) {
691
+ if (outgoing < half - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON || incoming < half - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) {
692
692
  const fits = 2 * Math.min(outgoing, incoming);
693
693
  issues.push({
694
694
  code: "transition-handles",
@@ -705,9 +705,9 @@ function checkVideoProject(project) {
705
705
  for (const sequence of _nullishCoalesce(project.sequences, () => ( [])))
706
706
  if (!usedSequences.has(sequence.id)) issues.push({ code: "unused-sequence", severity: "note", sequence: sequence.id, message: `Sequence "${sequence.id}" is not played by any compound clip.` });
707
707
  for (const asset of project.assets) if (!used.has(asset.id)) issues.push({ code: "unused-asset", severity: "note", asset: asset.id, message: `Asset "${asset.id}" is not used by any clip.` });
708
- const end = _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, project);
708
+ const end = _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, project);
709
709
  for (const marker of _nullishCoalesce(project.markers, () => ( [])))
710
- if (marker.time > end + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) issues.push({ code: "marker-past-end", severity: "note", marker: marker.id, message: `Marker "${marker.id}" at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, marker.time)} is past the end (${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, end)}).` });
710
+ if (marker.time > end + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) issues.push({ code: "marker-past-end", severity: "note", marker: marker.id, message: `Marker "${marker.id}" at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, marker.time)} is past the end (${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, end)}).` });
711
711
  if (!project.tracks.some((t) => t.clips.length)) issues.push({ code: "empty", severity: "note", message: "The project has no clips yet; add assets and then clips." });
712
712
  const rank = { error: 0, warning: 1, note: 2 };
713
713
  return issues.sort((a, b) => rank[a.severity] - rank[b.severity]);
@@ -761,7 +761,7 @@ function mergeSpans(spans) {
761
761
  const out = [];
762
762
  for (const [from, to] of [...spans].sort((a, b) => a[0] - b[0])) {
763
763
  const last = out[out.length - 1];
764
- if (last && from <= last[1] + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) last[1] = Math.max(last[1], to);
764
+ if (last && from <= last[1] + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) last[1] = Math.max(last[1], to);
765
765
  else out.push([from, to]);
766
766
  }
767
767
  return out;
@@ -775,13 +775,13 @@ function clipAnimatables(clip) {
775
775
  // A speed ramp is keys in clip time too, so trims and splits keep it on the same frames of source.
776
776
  { get: () => c.timeRemap, set: (v) => c.timeRemap = v }
777
777
  ];
778
- for (const p of _chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES) out.push({ get: () => _optionalChain([c, 'access', _9 => _9.transform, 'optionalAccess', _10 => _10[p]]), set: (v) => c.transform && (c.transform[p] = v) });
778
+ for (const p of _chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES) out.push({ get: () => _optionalChain([c, 'access', _9 => _9.transform, 'optionalAccess', _10 => _10[p]]), set: (v) => c.transform && (c.transform[p] = v) });
779
779
  return out;
780
780
  }
781
781
  function retimeClipKeys(clip, fn) {
782
782
  for (const a of clipAnimatables(clip)) {
783
783
  const v = a.get();
784
- if (_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, v)) a.set(fn(v));
784
+ if (_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, v)) a.set(fn(v));
785
785
  }
786
786
  }
787
787
  var OPTIONAL_CLIP_FIELDS = ["name", "effects", "mask", "scope", "targetTrack", "values", "provider", "opacity", "transform", "fit", "blend", "grade", "animateIn", "animateOut", "fadeIn", "fadeOut", "fadeInCurve", "fadeOutCurve", "transition", "in", "speed", "timeRemap", "volume", "muted", "color", "fontSize", "fontFamily", "fontWeight", "background"];
@@ -798,8 +798,8 @@ var Editor = (_class = class {
798
798
  return t;
799
799
  }
800
800
  clip(id) {
801
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, this.p, id);
802
- const nested = at ? null : _chunk3OSXHLITcjs.findVideoSequenceClip.call(void 0, this.p, id);
801
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, this.p, id);
802
+ const nested = at ? null : _chunkZ64NRDEHcjs.findVideoSequenceClip.call(void 0, this.p, id);
803
803
  if (nested) refuse(`Clip "${id}" is inside sequence "${nested.sequence.id}", and clips inside sequences cannot be edited yet; edit the compound clip that plays the sequence instead (list_video_sequences shows which).`);
804
804
  if (!at) {
805
805
  const ids = this.p.tracks.flatMap((t) => t.clips.map((c) => c.id));
@@ -816,16 +816,16 @@ var Editor = (_class = class {
816
816
  return a;
817
817
  }
818
818
  fits(track, start, duration, ignore, what) {
819
- const hit = _chunk3OSXHLITcjs.videoOverlap.call(void 0, track, start, start + duration, ignore);
819
+ const hit = _chunkZ64NRDEHcjs.videoOverlap.call(void 0, track, start, start + duration, ignore);
820
820
  if (hit) {
821
- const free = _chunk3OSXHLITcjs.nextFreeVideoSlot.call(void 0, track, start, duration, ignore);
822
- refuse(`${what} at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, start)}\u2013${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, start + duration)} would overlap clip "${hit.id}" (${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, hit))}) on track "${track.id}"; the next free place is ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, free)}, or use mode "insert" to push later clips along or "overwrite" to replace what is there.`);
821
+ const free = _chunkZ64NRDEHcjs.nextFreeVideoSlot.call(void 0, track, start, duration, ignore);
822
+ refuse(`${what} at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, start)}\u2013${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, start + duration)} would overlap clip "${hit.id}" (${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, hit))}) on track "${track.id}"; the next free place is ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, free)}, or use mode "insert" to push later clips along or "overwrite" to replace what is there.`);
823
823
  }
824
824
  }
825
825
  /** An adjustment clip's target track must exist. */
826
826
  adjustmentTarget(clip) {
827
827
  if (clip.type !== "adjustment" || clip.targetTrack === void 0) return;
828
- const ids = _chunk3OSXHLITcjs.allVideoTracks.call(void 0, this.p).map(({ track }) => track.id);
828
+ const ids = _chunkZ64NRDEHcjs.allVideoTracks.call(void 0, this.p).map(({ track }) => track.id);
829
829
  if (!ids.includes(clip.targetTrack)) refuse(`Adjustment clip "${clip.id}" targets track ${_chunkEBDZWIOPcjs.namedWithSuggestion.call(void 0, clip.targetTrack, ids)}, which does not exist; the tracks are ${ids.map((t) => `"${t}"`).join(", ")}.`);
830
830
  }
831
831
  kindFits(track, clip) {
@@ -841,14 +841,14 @@ var Editor = (_class = class {
841
841
  /** Moves every clip on `track` starting at or after `from` by `delta`. */
842
842
  shift(track, from, delta, except = /* @__PURE__ */ new Set()) {
843
843
  if (!delta) return;
844
- for (const c of track.clips) if (!except.has(c.id) && c.start >= from - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) c.start = Math.max(0, c.start + delta);
844
+ for (const c of track.clips) if (!except.has(c.id) && c.start >= from - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) c.start = Math.max(0, c.start + delta);
845
845
  track.clips.sort((a, b) => a.start - b.start);
846
846
  }
847
847
  get frame() {
848
848
  return 1e3 / this.p.fps;
849
849
  }
850
850
  ids() {
851
- return _chunk3OSXHLITcjs.allVideoClipIds.call(void 0, this.p);
851
+ return _chunkZ64NRDEHcjs.allVideoClipIds.call(void 0, this.p);
852
852
  }
853
853
  /**
854
854
  * The tracks a ripple on `sources` moves, top to bottom: the sources, and every unlocked
@@ -856,8 +856,8 @@ var Editor = (_class = class {
856
856
  */
857
857
  rippleTracks(sources) {
858
858
  const set = new Set(sources);
859
- if ([...set].some(_chunk3OSXHLITcjs.videoTrackSyncLocked)) {
860
- for (const t of this.p.tracks) if (_chunk3OSXHLITcjs.videoTrackSyncLocked.call(void 0, t) && !t.locked) set.add(t);
859
+ if ([...set].some(_chunkZ64NRDEHcjs.videoTrackSyncLocked)) {
860
+ for (const t of this.p.tracks) if (_chunkZ64NRDEHcjs.videoTrackSyncLocked.call(void 0, t) && !t.locked) set.add(t);
861
861
  }
862
862
  return this.p.tracks.filter((t) => set.has(t));
863
863
  }
@@ -874,7 +874,7 @@ var Editor = (_class = class {
874
874
  return open;
875
875
  }
876
876
  range(from, to) {
877
- if (!(to - from > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)) refuse(`"to" (${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, to)}) must be after "from" (${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, from)}).`);
877
+ if (!(to - from > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)) refuse(`"to" (${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, to)}) must be after "from" (${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, from)}).`);
878
878
  }
879
879
  /** Moves a media or compound clip's in point by `delta` of timeline time (stills, titles and colours have none). */
880
880
  moveIn(clip, delta) {
@@ -883,18 +883,18 @@ var Editor = (_class = class {
883
883
  if (clip.in < 1e-9) delete clip.in;
884
884
  return;
885
885
  }
886
- if (clip.type !== "media" || _optionalChain([_chunk3OSXHLITcjs.videoAssetMap.call(void 0, this.p), 'access', _12 => _12.get, 'call', _13 => _13(clip.asset), 'optionalAccess', _14 => _14.kind]) === "image") return;
887
- clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta * _chunk3OSXHLITcjs.videoClipSpeed.call(void 0, clip));
886
+ if (clip.type !== "media" || _optionalChain([_chunkZ64NRDEHcjs.videoAssetMap.call(void 0, this.p), 'access', _12 => _12.get, 'call', _13 => _13(clip.asset), 'optionalAccess', _14 => _14.kind]) === "image") return;
887
+ clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta * _chunkZ64NRDEHcjs.videoClipSpeed.call(void 0, clip));
888
888
  if (clip.in < 1e-9) delete clip.in;
889
889
  }
890
890
  /** Moves a clip's head `delta` later in time (start, in point and keys); the caller sets start and duration. */
891
891
  trimHead(clip, delta) {
892
892
  if (!isRamped(clip)) this.moveIn(clip, delta);
893
- retimeClipKeys(clip, (v) => _chunk3OSXHLITcjs.retimeVideoAnimatable.call(void 0, v, -delta));
893
+ retimeClipKeys(clip, (v) => _chunkZ64NRDEHcjs.retimeVideoAnimatable.call(void 0, v, -delta));
894
894
  }
895
895
  /** Cuts `clip` at `at` (inside it): the left part keeps the id, the right part is returned. */
896
896
  cut(track, clip, at, id) {
897
- const end = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip);
897
+ const end = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip);
898
898
  const right = { ...structuredClone(clip), id: _nullishCoalesce(id, () => ( freshId(`${clip.id}-`, this.ids()))), start: at, duration: end - at };
899
899
  delete right.transition;
900
900
  delete right.fadeIn;
@@ -902,9 +902,9 @@ var Editor = (_class = class {
902
902
  delete right.animateIn;
903
903
  const leftValues = clipAnimatables(clip);
904
904
  clipAnimatables(right).forEach((r, i) => {
905
- const [l, rr] = _chunk3OSXHLITcjs.splitVideoAnimatable.call(void 0, leftValues[i].get(), at - clip.start);
906
- if (_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, l)) leftValues[i].set(l);
907
- if (_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, rr)) r.set(rr);
905
+ const [l, rr] = _chunkZ64NRDEHcjs.splitVideoAnimatable.call(void 0, leftValues[i].get(), at - clip.start);
906
+ if (_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, l)) leftValues[i].set(l);
907
+ if (_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, rr)) r.set(rr);
908
908
  });
909
909
  if (!isRamped(right)) this.moveIn(right, at - clip.start);
910
910
  clip.duration = at - clip.start;
@@ -918,7 +918,7 @@ var Editor = (_class = class {
918
918
  /** Cuts every clip on `tracks` that runs across `at`; returns the new right-hand parts. */
919
919
  cutAcross(tracks, at) {
920
920
  const made = [];
921
- for (const t of tracks) for (const c of [...t.clips]) if (c.start < at - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON && _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c) > at + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) made.push(this.cut(t, c, at));
921
+ for (const t of tracks) for (const c of [...t.clips]) if (c.start < at - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON && _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c) > at + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) made.push(this.cut(t, c, at));
922
922
  return made;
923
923
  }
924
924
  /**
@@ -936,10 +936,10 @@ var Editor = (_class = class {
936
936
  */
937
937
  close(tracks, from, to) {
938
938
  for (const t of tracks) {
939
- const hit = _chunk3OSXHLITcjs.videoOverlap.call(void 0, t, from, to);
939
+ const hit = _chunkZ64NRDEHcjs.videoOverlap.call(void 0, t, from, to);
940
940
  if (hit)
941
941
  refuse(
942
- `Rippling out ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, from)}\u2013${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, to)} would pull track "${t.id}" out of sync: clip "${hit.id}" (${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, hit))}) is in that stretch. Extract the range across "${t.id}" too (extract_range with its id in "tracks"), turn its sync lock off (update_track with syncLocked false) or lock it, or lift instead of rippling.`
942
+ `Rippling out ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, from)}\u2013${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, to)} would pull track "${t.id}" out of sync: clip "${hit.id}" (${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, hit))}) is in that stretch. Extract the range across "${t.id}" too (extract_range with its id in "tracks"), turn its sync lock off (update_track with syncLocked false) or lock it, or lift instead of rippling.`
943
943
  );
944
944
  }
945
945
  for (const t of tracks) this.shift(t, to, from - to);
@@ -951,10 +951,10 @@ var Editor = (_class = class {
951
951
  clear(track, from, to, report) {
952
952
  for (const c of [...track.clips]) {
953
953
  const start = c.start;
954
- const end = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c);
955
- if (end <= from + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON || start >= to - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) continue;
956
- const coversHead = start >= from - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON;
957
- const coversTail = end <= to + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON;
954
+ const end = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c);
955
+ if (end <= from + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON || start >= to - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) continue;
956
+ const coversHead = start >= from - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON;
957
+ const coversTail = end <= to + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON;
958
958
  if (coversHead && coversTail) {
959
959
  track.clips = track.clips.filter((x) => x !== c);
960
960
  report.removed.push(c.id);
@@ -977,8 +977,8 @@ var Editor = (_class = class {
977
977
  /** Clamps a slip, roll or slide to `[lo, hi]`, refusing when it cannot move that way at all. */
978
978
  clamp(delta, lo, hi, why) {
979
979
  const applied = Math.min(Math.max(delta, Math.min(0, lo)), Math.max(0, hi));
980
- if (Math.abs(delta) > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON && Math.abs(applied) <= _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) refuse(why());
981
- return Math.abs(applied) <= _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON ? 0 : applied;
980
+ if (Math.abs(delta) > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON && Math.abs(applied) <= _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) refuse(why());
981
+ return Math.abs(applied) <= _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON ? 0 : applied;
982
982
  }
983
983
  /** Places a clip on a track by `mode`, returning what it cut, trimmed, removed and rippled. */
984
984
  place(track, clip, mode, outcome) {
@@ -988,14 +988,14 @@ var Editor = (_class = class {
988
988
  outcome.rippled = tracks.map((t) => t.id);
989
989
  } else if (mode === "overwrite") {
990
990
  const report = { removed: [], trimmed: [], created: [] };
991
- this.clear(track, clip.start, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip), report);
991
+ this.clear(track, clip.start, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip), report);
992
992
  Object.assign(outcome, report);
993
993
  } else this.fits(track, clip.start, clip.duration, /* @__PURE__ */ new Set([clip.id]), `Clip "${clip.id}"`);
994
994
  track.clips.push(clip);
995
995
  track.clips.sort((a, b) => a.start - b.start);
996
996
  }
997
997
  placement(mode, ripple) {
998
- if (mode !== void 0 && !_chunk3OSXHLITcjs.VIDEO_PLACEMENT_MODES.includes(mode)) refuse(`"mode" must be ${_chunk3OSXHLITcjs.VIDEO_PLACEMENT_MODES.map((m) => `"${m}"`).join(", ")}.`);
998
+ if (mode !== void 0 && !_chunkZ64NRDEHcjs.VIDEO_PLACEMENT_MODES.includes(mode)) refuse(`"mode" must be ${_chunkZ64NRDEHcjs.VIDEO_PLACEMENT_MODES.map((m) => `"${m}"`).join(", ")}.`);
999
999
  if (ripple && mode !== void 0 && mode !== "insert") refuse(`"ripple" means mode "insert", so it cannot go with mode "${mode}"; pass one or the other.`);
1000
1000
  return _nullishCoalesce(mode, () => ( (ripple ? "insert" : "refuse")));
1001
1001
  }
@@ -1032,7 +1032,7 @@ var Editor = (_class = class {
1032
1032
  }
1033
1033
  case "remove_asset": {
1034
1034
  const asset = this.asset(e.asset);
1035
- const users = _chunk3OSXHLITcjs.allVideoTracks.call(void 0, this.p).flatMap(({ track: t }) => t.clips.filter((c) => c.type === "media" && c.asset === asset.id).map((c) => c.id));
1035
+ const users = _chunkZ64NRDEHcjs.allVideoTracks.call(void 0, this.p).flatMap(({ track: t }) => t.clips.filter((c) => c.type === "media" && c.asset === asset.id).map((c) => c.id));
1036
1036
  if (users.length) refuse(`Asset "${asset.id}" is used by clip${users.length > 1 ? "s" : ""} ${users.map((u) => `"${u}"`).join(", ")}; delete ${users.length > 1 ? "them" : "it"} first.`);
1037
1037
  this.p.assets = this.p.assets.filter((a) => a !== asset);
1038
1038
  return this.outcomes.push({ op: e.op, asset: asset.id });
@@ -1085,12 +1085,12 @@ var Editor = (_class = class {
1085
1085
  else draft.duration = (asset.duration - (_nullishCoalesce(draft.in, () => ( 0)))) / (_nullishCoalesce(draft.speed, () => ( 1)));
1086
1086
  if (!(draft.duration > 0)) refuse(`"in" (${draft.in} ms) is at or past the end of "${asset.id}" (${asset.duration} ms).`);
1087
1087
  } else if (draft.type === "sequence") {
1088
- const length = _chunk3OSXHLITcjs.videoSequenceDuration.call(void 0, _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, this.p).get(draft.sequence)) - (_nullishCoalesce(draft.in, () => ( 0)));
1088
+ const length = _chunkZ64NRDEHcjs.videoSequenceDuration.call(void 0, _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, this.p).get(draft.sequence)) - (_nullishCoalesce(draft.in, () => ( 0)));
1089
1089
  if (!(length > 0)) refuse(`"in" (${_nullishCoalesce(draft.in, () => ( 0))} ms) is at or past the end of sequence "${draft.sequence}".`);
1090
1090
  draft.duration = length;
1091
1091
  } else draft.duration = VIDEO_DEFAULT_TITLE_DURATION;
1092
1092
  }
1093
- const end = _chunk3OSXHLITcjs.sortedVideoClips.call(void 0, track).reduce((m, c) => Math.max(m, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c)), 0);
1093
+ const end = _chunkZ64NRDEHcjs.sortedVideoClips.call(void 0, track).reduce((m, c) => Math.max(m, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c)), 0);
1094
1094
  draft.start ??= end;
1095
1095
  const clip = parseVideoClip(draft, "clip");
1096
1096
  this.adjustmentTarget(clip);
@@ -1116,20 +1116,20 @@ var Editor = (_class = class {
1116
1116
  case "trim_clip": {
1117
1117
  const { track, clip } = this.clip(e.clip);
1118
1118
  this.unlocked(track);
1119
- const speed = _chunk3OSXHLITcjs.videoClipSpeed.call(void 0, clip);
1120
- const end = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip);
1119
+ const speed = _chunkZ64NRDEHcjs.videoClipSpeed.call(void 0, clip);
1120
+ const end = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip);
1121
1121
  const minimum = 1e3 / this.p.fps;
1122
- const assets = _chunk3OSXHLITcjs.videoAssetMap.call(void 0, this.p);
1122
+ const assets = _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, this.p);
1123
1123
  if (e.edge === "start") {
1124
1124
  const delta = e.to - clip.start;
1125
- if (clip.duration - delta < minimum - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the start to ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it ends at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, end)}.`);
1125
+ if (clip.duration - delta < minimum - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the start to ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it ends at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, end)}.`);
1126
1126
  if (clip.type === "media" && !isRamped(clip) || clip.type === "sequence") {
1127
1127
  const sourceIn = (_nullishCoalesce(clip.in, () => ( 0))) + delta * speed;
1128
- if (sourceIn < -_chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" starts ${Math.round((_nullishCoalesce(clip.in, () => ( 0))) / speed)} ms into its source, so its start can move at most that far earlier (to ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, clip.start - (_nullishCoalesce(clip.in, () => ( 0))) / speed)}).`);
1128
+ if (sourceIn < -_chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" starts ${Math.round((_nullishCoalesce(clip.in, () => ( 0))) / speed)} ms into its source, so its start can move at most that far earlier (to ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, clip.start - (_nullishCoalesce(clip.in, () => ( 0))) / speed)}).`);
1129
1129
  clip.in = Math.max(0, sourceIn);
1130
1130
  if (clip.in === 0) delete clip.in;
1131
1131
  }
1132
- retimeClipKeys(clip, (v) => _chunk3OSXHLITcjs.retimeVideoAnimatable.call(void 0, v, -delta));
1132
+ retimeClipKeys(clip, (v) => _chunkZ64NRDEHcjs.retimeVideoAnimatable.call(void 0, v, -delta));
1133
1133
  if (e.ripple) {
1134
1134
  const tracks = this.rippleTracks([track]);
1135
1135
  if (delta > 0) {
@@ -1150,17 +1150,17 @@ var Editor = (_class = class {
1150
1150
  }
1151
1151
  } else {
1152
1152
  const duration = e.to - clip.start;
1153
- if (duration < minimum - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the end to ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it starts at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, clip.start)}.`);
1153
+ if (duration < minimum - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the end to ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it starts at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, clip.start)}.`);
1154
1154
  if (clip.type === "media" && !isRamped(clip)) {
1155
1155
  const asset = assets.get(clip.asset);
1156
1156
  const out = (_nullishCoalesce(clip.in, () => ( 0))) + duration * speed;
1157
- if (_optionalChain([asset, 'optionalAccess', _15 => _15.duration]) !== void 0 && out > asset.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
1158
- refuse(`"${clip.id}" can end at most at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, clip.start + (asset.duration - (_nullishCoalesce(clip.in, () => ( 0)))) / speed)}, where "${asset.id}" runs out.`);
1157
+ if (_optionalChain([asset, 'optionalAccess', _15 => _15.duration]) !== void 0 && out > asset.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
1158
+ refuse(`"${clip.id}" can end at most at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, clip.start + (asset.duration - (_nullishCoalesce(clip.in, () => ( 0)))) / speed)}, where "${asset.id}" runs out.`);
1159
1159
  }
1160
1160
  if (clip.type === "sequence") {
1161
- const seq = _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, this.p).get(clip.sequence);
1162
- const length = seq ? _chunk3OSXHLITcjs.videoSequenceDuration.call(void 0, seq) : Infinity;
1163
- if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" can end at most at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, clip.start + length - (_nullishCoalesce(clip.in, () => ( 0))))}, where sequence "${clip.sequence}" ends.`);
1161
+ const seq = _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, this.p).get(clip.sequence);
1162
+ const length = seq ? _chunkZ64NRDEHcjs.videoSequenceDuration.call(void 0, seq) : Infinity;
1163
+ if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" can end at most at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, clip.start + length - (_nullishCoalesce(clip.in, () => ( 0))))}, where sequence "${clip.sequence}" ends.`);
1164
1164
  }
1165
1165
  if (e.ripple) {
1166
1166
  const tracks = this.rippleTracks([track]);
@@ -1182,9 +1182,9 @@ var Editor = (_class = class {
1182
1182
  case "split_clip": {
1183
1183
  const { track, clip } = this.clip(e.clip);
1184
1184
  this.unlocked(track);
1185
- const end = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip);
1185
+ const end = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip);
1186
1186
  const minimum = 1e3 / this.p.fps;
1187
- if (e.at < clip.start + minimum - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON || e.at > end - minimum + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) refuse(`${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, e.at)} is not inside "${clip.id}" (${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, clip.start)}\u2013${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, end)}), at least a frame from either end.`);
1187
+ if (e.at < clip.start + minimum - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON || e.at > end - minimum + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) refuse(`${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, e.at)} is not inside "${clip.id}" (${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, clip.start)}\u2013${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, end)}), at least a frame from either end.`);
1188
1188
  if (e.id !== void 0 && this.ids().includes(e.id)) refuse(`There is already a clip "${e.id}".`);
1189
1189
  const right = this.cut(track, clip, e.at, e.id);
1190
1190
  return this.outcomes.push({ op: e.op, clips: [clip.id, right.id], clip: right.id, track: track.id });
@@ -1195,12 +1195,12 @@ var Editor = (_class = class {
1195
1195
  for (const track of new Set(found.map((f) => f.track))) track.clips = track.clips.filter((c) => !found.some((f) => f.clip === c));
1196
1196
  if (!e.ripple) return this.outcomes.push({ op: e.op, clips: found.map((f) => f.clip.id) });
1197
1197
  const rippled = /* @__PURE__ */ new Set();
1198
- const groups = [...new Set(found.map((f) => f.track))].filter((t) => !_chunk3OSXHLITcjs.videoTrackSyncLocked.call(void 0, t)).map((t) => [t]);
1199
- if (found.some((f) => _chunk3OSXHLITcjs.videoTrackSyncLocked.call(void 0, f.track))) groups.push(found.filter((f) => _chunk3OSXHLITcjs.videoTrackSyncLocked.call(void 0, f.track)).map((f) => f.track));
1198
+ const groups = [...new Set(found.map((f) => f.track))].filter((t) => !_chunkZ64NRDEHcjs.videoTrackSyncLocked.call(void 0, t)).map((t) => [t]);
1199
+ if (found.some((f) => _chunkZ64NRDEHcjs.videoTrackSyncLocked.call(void 0, f.track))) groups.push(found.filter((f) => _chunkZ64NRDEHcjs.videoTrackSyncLocked.call(void 0, f.track)).map((f) => f.track));
1200
1200
  for (const sources of groups) {
1201
1201
  const tracks = this.rippleTracks(sources);
1202
1202
  tracks.forEach((t) => rippled.add(t));
1203
- const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, f.clip)]));
1203
+ const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, f.clip)]));
1204
1204
  for (const [from, to] of spans.reverse()) this.close(tracks, from, to);
1205
1205
  }
1206
1206
  return this.outcomes.push({ op: e.op, clips: found.map((f) => f.clip.id), rippled: this.p.tracks.filter((t) => rippled.has(t)).map((t) => t.id) });
@@ -1216,7 +1216,7 @@ var Editor = (_class = class {
1216
1216
  if ("timeRemap" in set) refuse("Set a speed ramp with set_time_remap, which checks it against the media and moves later clips if asked.");
1217
1217
  let stretch = 1;
1218
1218
  if (at.clip.type === "media" && !("duration" in set)) {
1219
- const was = _chunk3OSXHLITcjs.videoClipSpeed.call(void 0, at.clip);
1219
+ const was = _chunkZ64NRDEHcjs.videoClipSpeed.call(void 0, at.clip);
1220
1220
  const now = "speed" in set ? set.speed : _optionalChain([e, 'access', _16 => _16.remove, 'optionalAccess', _17 => _17.includes, 'call', _18 => _18("speed")]) ? 1 : was;
1221
1221
  if (now !== was) {
1222
1222
  set.duration = at.clip.duration * was / now;
@@ -1224,7 +1224,7 @@ var Editor = (_class = class {
1224
1224
  }
1225
1225
  }
1226
1226
  const next = { ...structuredClone(at.clip), ...set };
1227
- if (stretch !== 1) retimeClipKeys(next, (v) => _chunk3OSXHLITcjs.retimeVideoAnimatable.call(void 0, v, 0, stretch));
1227
+ if (stretch !== 1) retimeClipKeys(next, (v) => _chunkZ64NRDEHcjs.retimeVideoAnimatable.call(void 0, v, 0, stretch));
1228
1228
  for (const k of _nullishCoalesce(e.remove, () => ( []))) delete next[k];
1229
1229
  const clip = parseVideoClip(next, "set");
1230
1230
  this.adjustmentTarget(clip);
@@ -1238,17 +1238,17 @@ var Editor = (_class = class {
1238
1238
  const { track, clip } = this.clip(e.clip);
1239
1239
  this.unlocked(track);
1240
1240
  if (clip.type === "sequence") refuse(`Clip "${clip.id}" is a compound clip, which plays its sequence at normal speed; ramp the clips inside the sequence instead.`);
1241
- if (clip.type !== "media") refuse(`Clip "${clip.id}" is a ${_chunk3OSXHLITcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to ramp; only video and audio clips change speed.`);
1241
+ if (clip.type !== "media") refuse(`Clip "${clip.id}" is a ${_chunkZ64NRDEHcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to ramp; only video and audio clips change speed.`);
1242
1242
  const asset = this.asset(clip.asset);
1243
1243
  if (asset.kind === "image") refuse(`Clip "${clip.id}" is a still ("${asset.id}"), so it has no motion to ramp.`);
1244
1244
  const media = clip;
1245
- const end = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, media);
1245
+ const end = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, media);
1246
1246
  const duration = _nullishCoalesce(e.duration, () => ( media.duration));
1247
- if (!(duration >= 1e3 / this.p.fps - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)) refuse(`"duration" must be at least a frame (${Math.ceil(1e3 / this.p.fps)} ms).`);
1247
+ if (!(duration >= 1e3 / this.p.fps - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)) refuse(`"duration" must be at least a frame (${Math.ceil(1e3 / this.p.fps)} ms).`);
1248
1248
  if (e.keys === null) {
1249
1249
  if (!media.timeRemap) refuse(`Clip "${clip.id}" has no speed ramp to remove.`);
1250
1250
  const from = (_nullishCoalesce(media.in, () => ( 0))) + media.timeRemap.keys[0].v;
1251
- if (asset.duration !== void 0 && from + duration > asset.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
1251
+ if (asset.duration !== void 0 && from + duration > asset.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
1252
1252
  refuse(`At normal speed from ${Math.round(from)} ms, "${clip.id}" would run past the end of "${asset.id}" (${asset.duration} ms); give a duration of at most ${Math.floor(asset.duration - from)} ms.`);
1253
1253
  delete media.timeRemap;
1254
1254
  media.in = from;
@@ -1256,17 +1256,17 @@ var Editor = (_class = class {
1256
1256
  } else {
1257
1257
  if (!Array.isArray(e.keys) || !e.keys.length) refuse('"keys" must be a list of at least one { t, v, ease } (or null to remove the ramp).');
1258
1258
  const remap = parseVideoTimeRemap({ keys: e.keys }, void 0, "keys");
1259
- remap.keys = _chunk3OSXHLITcjs.sortVideoKeys.call(void 0, remap.keys);
1260
- _chunk3OSXHLITcjs.checkVideoTimeRemap.call(void 0, remap, "keys");
1261
- const span = _chunk3OSXHLITcjs.videoTimeRemapSpan.call(void 0, remap);
1262
- if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON)
1259
+ remap.keys = _chunkZ64NRDEHcjs.sortVideoKeys.call(void 0, remap.keys);
1260
+ _chunkZ64NRDEHcjs.checkVideoTimeRemap.call(void 0, remap, "keys");
1261
+ const span = _chunkZ64NRDEHcjs.videoTimeRemapSpan.call(void 0, remap);
1262
+ if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON)
1263
1263
  refuse(`The ramp plays ${Math.round(span.to)} ms of source from the in point (${_nullishCoalesce(media.in, () => ( 0))} ms), past the end of "${asset.id}" (${asset.duration} ms); it can use at most ${Math.floor(asset.duration - (_nullishCoalesce(media.in, () => ( 0))))} ms.`);
1264
1264
  media.timeRemap = remap;
1265
1265
  delete media.speed;
1266
1266
  }
1267
1267
  const newEnd = media.start + duration;
1268
1268
  const outcome = { op: e.op, clip: clip.id, track: track.id };
1269
- if (Math.abs(newEnd - end) > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) {
1269
+ if (Math.abs(newEnd - end) > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) {
1270
1270
  if (e.ripple) {
1271
1271
  const tracks = this.rippleTracks([track]);
1272
1272
  if (newEnd < end) {
@@ -1295,11 +1295,11 @@ var Editor = (_class = class {
1295
1295
  case "slip_clip": {
1296
1296
  const { track, clip } = this.clip(e.clip);
1297
1297
  this.unlocked(track);
1298
- if (clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${_chunk3OSXHLITcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to slip; only video, audio and compound clips slip.`);
1298
+ if (clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${_chunkZ64NRDEHcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to slip; only video, audio and compound clips slip.`);
1299
1299
  const source = clip.type === "sequence" ? `sequence "${clip.sequence}"` : `"${this.asset(clip.asset).id}"`;
1300
1300
  if (clip.type === "media" && this.asset(clip.asset).kind === "image") refuse(`Clip "${clip.id}" is a still ("${clip.asset}"), so it has no source to slip; only video and audio clips slip.`);
1301
- const handles = _chunk3OSXHLITcjs.videoClipHandles.call(void 0, clip, _chunk3OSXHLITcjs.videoAssetMap.call(void 0, this.p), _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, this.p));
1302
- const { lead, tail } = _chunk3OSXHLITcjs.videoClipOverhang.call(void 0, track, clip);
1301
+ const handles = _chunkZ64NRDEHcjs.videoClipHandles.call(void 0, clip, _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, this.p), _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, this.p));
1302
+ const { lead, tail } = _chunkZ64NRDEHcjs.videoClipOverhang.call(void 0, track, clip);
1303
1303
  const delta = this.clamp(
1304
1304
  e.delta,
1305
1305
  lead - handles.before,
@@ -1317,13 +1317,13 @@ var Editor = (_class = class {
1317
1317
  this.unlocked(track);
1318
1318
  const L = left.clip;
1319
1319
  const R = right.clip;
1320
- if (Math.abs(_chunk3OSXHLITcjs.videoClipEnd.call(void 0, L) - R.start) > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) {
1321
- if (Math.abs(_chunk3OSXHLITcjs.videoClipEnd.call(void 0, R) - L.start) <= _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) refuse(`"${R.id}" comes before "${L.id}"; pass left "${R.id}" and right "${L.id}".`);
1322
- refuse(`"${L.id}" ends at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, L))} but "${R.id}" starts at ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, R.start)}; a roll needs two clips that meet at a cut (use trim_clip to move one edge).`);
1320
+ if (Math.abs(_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, L) - R.start) > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) {
1321
+ if (Math.abs(_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, R) - L.start) <= _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) refuse(`"${R.id}" comes before "${L.id}"; pass left "${R.id}" and right "${L.id}".`);
1322
+ refuse(`"${L.id}" ends at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, L))} but "${R.id}" starts at ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, R.start)}; a roll needs two clips that meet at a cut (use trim_clip to move one edge).`);
1323
1323
  }
1324
- const assets = _chunk3OSXHLITcjs.videoAssetMap.call(void 0, this.p);
1325
- const lo = Math.max(-(L.duration - this.frame), -(_chunk3OSXHLITcjs.videoClipHandles.call(void 0, R, assets, _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, this.p)).before - _chunk3OSXHLITcjs.videoClipOverhang.call(void 0, track, R).lead));
1326
- const hi = Math.min(R.duration - this.frame, _chunk3OSXHLITcjs.videoClipHandles.call(void 0, L, assets, _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, this.p)).after - _chunk3OSXHLITcjs.videoClipOverhang.call(void 0, track, L).tail);
1324
+ const assets = _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, this.p);
1325
+ const lo = Math.max(-(L.duration - this.frame), -(_chunkZ64NRDEHcjs.videoClipHandles.call(void 0, R, assets, _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkZ64NRDEHcjs.videoClipOverhang.call(void 0, track, R).lead));
1326
+ const hi = Math.min(R.duration - this.frame, _chunkZ64NRDEHcjs.videoClipHandles.call(void 0, L, assets, _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkZ64NRDEHcjs.videoClipOverhang.call(void 0, track, L).tail);
1327
1327
  const delta = this.clamp(
1328
1328
  e.delta,
1329
1329
  lo,
@@ -1339,18 +1339,18 @@ var Editor = (_class = class {
1339
1339
  case "slide_clip": {
1340
1340
  const { track, clip } = this.clip(e.clip);
1341
1341
  this.unlocked(track);
1342
- const before = _chunk3OSXHLITcjs.videoClipBefore.call(void 0, track, clip);
1343
- const after = _chunk3OSXHLITcjs.videoClipAfter.call(void 0, track, clip);
1342
+ const before = _chunkZ64NRDEHcjs.videoClipBefore.call(void 0, track, clip);
1343
+ const after = _chunkZ64NRDEHcjs.videoClipAfter.call(void 0, track, clip);
1344
1344
  if (!before && !after) refuse(`"${clip.id}" has no clip right before or after it on track "${track.id}", so there is nothing to slide against; use move_clip.`);
1345
- const assets = _chunk3OSXHLITcjs.videoAssetMap.call(void 0, this.p);
1346
- const end = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip);
1345
+ const assets = _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, this.p);
1346
+ const end = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip);
1347
1347
  const others = track.clips.filter((c) => c !== clip);
1348
1348
  const room = {
1349
- earlier: before ? before.duration - this.frame : clip.start - others.filter((c) => _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c) <= clip.start + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.max(m, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c)), 0),
1350
- later: after ? after.duration - this.frame : others.filter((c) => c.start >= end - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.min(m, c.start - end), Infinity)
1349
+ earlier: before ? before.duration - this.frame : clip.start - others.filter((c) => _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c) <= clip.start + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.max(m, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c)), 0),
1350
+ later: after ? after.duration - this.frame : others.filter((c) => c.start >= end - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.min(m, c.start - end), Infinity)
1351
1351
  };
1352
- const lo = -Math.min(room.earlier, after ? _chunk3OSXHLITcjs.videoClipHandles.call(void 0, after, assets, _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, this.p)).before - _chunk3OSXHLITcjs.videoClipOverhang.call(void 0, track, after).lead : Infinity);
1353
- const hi = Math.min(room.later, before ? _chunk3OSXHLITcjs.videoClipHandles.call(void 0, before, assets, _chunk3OSXHLITcjs.videoSequenceMap.call(void 0, this.p)).after - _chunk3OSXHLITcjs.videoClipOverhang.call(void 0, track, before).tail : Infinity);
1352
+ const lo = -Math.min(room.earlier, after ? _chunkZ64NRDEHcjs.videoClipHandles.call(void 0, after, assets, _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkZ64NRDEHcjs.videoClipOverhang.call(void 0, track, after).lead : Infinity);
1353
+ const hi = Math.min(room.later, before ? _chunkZ64NRDEHcjs.videoClipHandles.call(void 0, before, assets, _chunkZ64NRDEHcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkZ64NRDEHcjs.videoClipOverhang.call(void 0, track, before).tail : Infinity);
1354
1354
  const delta = this.clamp(
1355
1355
  e.delta,
1356
1356
  lo,
@@ -1383,29 +1383,29 @@ var Editor = (_class = class {
1383
1383
  }
1384
1384
  case "split_at": {
1385
1385
  const tracks = this.rangeTracks(e.tracks);
1386
- const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON && _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c) > e.at + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON).map((c) => c.id));
1387
- if (!lefts.length) refuse(`No clip runs across ${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, e.at)} on ${e.tracks ? `track${tracks.length > 1 ? "s" : ""} ${tracks.map((t) => `"${t.id}"`).join(", ")}` : "the unlocked tracks"}, so there is nothing to split there.`);
1386
+ const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON && _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c) > e.at + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON).map((c) => c.id));
1387
+ if (!lefts.length) refuse(`No clip runs across ${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, e.at)} on ${e.tracks ? `track${tracks.length > 1 ? "s" : ""} ${tracks.map((t) => `"${t.id}"`).join(", ")}` : "the unlocked tracks"}, so there is nothing to split there.`);
1388
1388
  const created = this.cutAcross(tracks, e.at).map((c) => c.id);
1389
1389
  return this.outcomes.push({ op: e.op, clips: lefts, created });
1390
1390
  }
1391
1391
  case "set_keyframes": {
1392
1392
  const { track, clip } = this.clip(e.clip);
1393
1393
  this.unlocked(track);
1394
- if (!_chunk3OSXHLITcjs.VIDEO_KEYFRAME_PROPERTIES.includes(e.property)) refuse(`"${e.property}" cannot be keyframed; use one of ${_chunk3OSXHLITcjs.VIDEO_KEYFRAME_PROPERTIES.join(", ")}.`);
1394
+ if (!_chunkZ64NRDEHcjs.VIDEO_KEYFRAME_PROPERTIES.includes(e.property)) refuse(`"${e.property}" cannot be keyframed; use one of ${_chunkZ64NRDEHcjs.VIDEO_KEYFRAME_PROPERTIES.join(", ")}.`);
1395
1395
  if (e.property === "volume" && clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${clip.type} clip and has no volume; volume keys go on media and compound clips.`);
1396
- const limits = _chunk3OSXHLITcjs.VIDEO_KEYFRAME_LIMITS[e.property];
1397
- const transform = _chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES.includes(e.property);
1396
+ const limits = _chunkZ64NRDEHcjs.VIDEO_KEYFRAME_LIMITS[e.property];
1397
+ const transform = _chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES.includes(e.property);
1398
1398
  const c = clip;
1399
1399
  const current = transform ? _optionalChain([c, 'access', _21 => _21.transform, 'optionalAccess', _22 => _22[e.property]]) : c[e.property];
1400
1400
  let value;
1401
1401
  if (e.keys === null) {
1402
- const v = _chunk3OSXHLITcjs.videoValueAt.call(void 0, current, 0, limits.default);
1403
- value = _chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, current) ? v === limits.default ? void 0 : v : current;
1402
+ const v = _chunkZ64NRDEHcjs.videoValueAt.call(void 0, current, 0, limits.default);
1403
+ value = _chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, current) ? v === limits.default ? void 0 : v : current;
1404
1404
  } else {
1405
1405
  if (!Array.isArray(e.keys) || !e.keys.length) refuse('"keys" must list at least one key { t, v }; pass null to remove the keyframes.');
1406
1406
  let sorted = [];
1407
1407
  try {
1408
- sorted = _chunk3OSXHLITcjs.sortVideoKeys.call(void 0, e.keys);
1408
+ sorted = _chunkZ64NRDEHcjs.sortVideoKeys.call(void 0, e.keys);
1409
1409
  } catch (error) {
1410
1410
  refuse(error.message);
1411
1411
  }
@@ -1424,12 +1424,12 @@ var Editor = (_class = class {
1424
1424
  this.unlocked(track);
1425
1425
  let at = 0;
1426
1426
  const moved = [];
1427
- for (const clip of _chunk3OSXHLITcjs.sortedVideoClips.call(void 0, track)) {
1428
- if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON && clip.start > at + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) {
1427
+ for (const clip of _chunkZ64NRDEHcjs.sortedVideoClips.call(void 0, track)) {
1428
+ if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON && clip.start > at + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) {
1429
1429
  clip.start = Math.max(at, _nullishCoalesce(e.from, () => ( 0)));
1430
1430
  moved.push(clip.id);
1431
1431
  }
1432
- at = Math.max(at, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip));
1432
+ at = Math.max(at, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip));
1433
1433
  }
1434
1434
  return this.outcomes.push({ op: e.op, track: track.id, clips: moved });
1435
1435
  }
@@ -1559,7 +1559,7 @@ function videoTranscriptTrack(project, track) {
1559
1559
  if (!project.tracks.some((t) => t.id === track)) throw new Error(`There is no track "${track}"; the tracks are ${project.tracks.map((t) => `"${t.id}"`).join(", ")}.`);
1560
1560
  return track;
1561
1561
  }
1562
- const assets = _chunk3OSXHLITcjs.videoAssetMap.call(void 0, project);
1562
+ const assets = _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, project);
1563
1563
  const transcribed = (t) => t.clips.some((c) => c.type === "media" && _optionalChain([assets, 'access', _24 => _24.get, 'call', _25 => _25(c.asset), 'optionalAccess', _26 => _26.transcript, 'optionalAccess', _27 => _27.length]));
1564
1564
  return _nullishCoalesce(_optionalChain([(_nullishCoalesce(project.tracks.find((t) => t.kind === "audio" && transcribed(t)), () => ( project.tracks.find(transcribed)))), 'optionalAccess', _28 => _28.id]), () => ( null));
1565
1565
  }
@@ -1567,16 +1567,16 @@ function videoTimelineTranscript(project, options = {}) {
1567
1567
  const id = videoTranscriptTrack(project, options.track);
1568
1568
  if (!id) return [];
1569
1569
  const track = project.tracks.find((t) => t.id === id);
1570
- const assets = _chunk3OSXHLITcjs.videoAssetMap.call(void 0, project);
1570
+ const assets = _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, project);
1571
1571
  const out = [];
1572
- for (const clip of _chunk3OSXHLITcjs.sortedVideoClips.call(void 0, track)) {
1572
+ for (const clip of _chunkZ64NRDEHcjs.sortedVideoClips.call(void 0, track)) {
1573
1573
  if (clip.type !== "media") continue;
1574
1574
  const words = _optionalChain([assets, 'access', _29 => _29.get, 'call', _30 => _30(clip.asset), 'optionalAccess', _31 => _31.transcript]);
1575
1575
  if (!_optionalChain([words, 'optionalAccess', _32 => _32.length])) continue;
1576
- const speed = _chunk3OSXHLITcjs.videoClipSpeed.call(void 0, clip);
1576
+ const speed = _chunkZ64NRDEHcjs.videoClipSpeed.call(void 0, clip);
1577
1577
  const from = _nullishCoalesce(clip.in, () => ( 0));
1578
1578
  const to = from + clip.duration * speed;
1579
- const toTimeline = (s) => Math.min(_chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip), Math.max(clip.start, clip.start + (s - from) / speed));
1579
+ const toTimeline = (s) => Math.min(_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip), Math.max(clip.start, clip.start + (s - from) / speed));
1580
1580
  words.forEach((w, index) => {
1581
1581
  const mid = (w.start + w.end) / 2;
1582
1582
  if (mid < from || mid >= to) return;
@@ -1621,19 +1621,19 @@ function findVideoTranscriptPauses(words, options = {}) {
1621
1621
  let to = b.start - keep;
1622
1622
  if (options.fps) {
1623
1623
  const f = 1e3 / options.fps;
1624
- from = _chunk3OSXHLITcjs.snapToVideoFrame.call(void 0, Math.ceil(from / f - 1e-9) * f, options.fps);
1625
- to = _chunk3OSXHLITcjs.snapToVideoFrame.call(void 0, Math.floor(to / f + 1e-9) * f, options.fps);
1624
+ from = _chunkZ64NRDEHcjs.snapToVideoFrame.call(void 0, Math.ceil(from / f - 1e-9) * f, options.fps);
1625
+ to = _chunkZ64NRDEHcjs.snapToVideoFrame.call(void 0, Math.floor(to / f + 1e-9) * f, options.fps);
1626
1626
  }
1627
- if (to - from > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) out.push({ from, to, text: `(pause after "${a.word}")` });
1627
+ if (to - from > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) out.push({ from, to, text: `(pause after "${a.word}")` });
1628
1628
  }
1629
1629
  return out;
1630
1630
  }
1631
1631
  function mergeVideoRanges(ranges) {
1632
- const sorted = ranges.filter((r) => r.to - r.from > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON).map((r) => ({ from: r.from, to: r.to })).sort((a, b) => a.from - b.from);
1632
+ const sorted = ranges.filter((r) => r.to - r.from > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON).map((r) => ({ from: r.from, to: r.to })).sort((a, b) => a.from - b.from);
1633
1633
  const out = [];
1634
1634
  for (const r of sorted) {
1635
1635
  const last = out[out.length - 1];
1636
- if (last && r.from <= last.to + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) last.to = Math.max(last.to, r.to);
1636
+ if (last && r.from <= last.to + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) last.to = Math.max(last.to, r.to);
1637
1637
  else out.push(r);
1638
1638
  }
1639
1639
  return out;
@@ -1679,7 +1679,7 @@ function findVideoRepetitions(words, options = {}) {
1679
1679
  var VIDEO_DISFLUENCY_KINDS = ["filler", "pause", "repetition"];
1680
1680
  function detectVideoDisfluencies(words, options = {}) {
1681
1681
  const kinds = new Set(_nullishCoalesce(options.kinds, () => ( VIDEO_DISFLUENCY_KINDS)));
1682
- const startIndex = (time) => Math.max(0, words.findIndex((w) => w.start >= time - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON));
1682
+ const startIndex = (time) => Math.max(0, words.findIndex((w) => w.start >= time - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON));
1683
1683
  const out = [];
1684
1684
  if (kinds.has("filler"))
1685
1685
  for (const r of findVideoFillers(words, options.fillers)) {
@@ -1693,13 +1693,13 @@ function detectVideoDisfluencies(words, options = {}) {
1693
1693
  }
1694
1694
  if (kinds.has("pause"))
1695
1695
  for (const r of findVideoTranscriptPauses(words, options.pauses)) {
1696
- const after = words.findIndex((w) => w.start >= r.to - _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON);
1696
+ const after = words.findIndex((w) => w.start >= r.to - _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON);
1697
1697
  out.push({ ...r, kind: "pause", words: [Math.max(0, after - 1), Math.max(0, after)] });
1698
1698
  }
1699
1699
  return out.sort((a, b) => a.from - b.from || a.to - b.to);
1700
1700
  }
1701
1701
  function videoCutsWithMargin(ranges, keep) {
1702
- return ranges.map((r) => ({ ...r, from: r.from + keep, to: r.to - keep })).filter((r) => r.to - r.from > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON);
1702
+ return ranges.map((r) => ({ ...r, from: r.from + keep, to: r.to - keep })).filter((r) => r.to - r.from > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON);
1703
1703
  }
1704
1704
 
1705
1705
  // src/video-editor/mix.ts
@@ -1805,7 +1805,7 @@ function videoDuckingKeys(clip, speech, options = {}) {
1805
1805
  const gap = Math.max(_nullishCoalesce(options.mergeGap, () => ( 600)), attack + release);
1806
1806
  const base = _nullishCoalesce(options.base, () => ( 1));
1807
1807
  const low = Math.round(base * 10 ** (duckDb / 20) * 1e4) / 1e4;
1808
- const end = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip);
1808
+ const end = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip);
1809
1809
  const ranges = [];
1810
1810
  for (const r of mergeVideoRanges(speech)) {
1811
1811
  if (r.to <= clip.start - release || r.from >= end + attack) continue;
@@ -2010,7 +2010,7 @@ function videoClipWaveform(clip, peaks, columns) {
2010
2010
  const step = clip.duration / Math.max(1, n);
2011
2011
  for (let c = 0; c < n; c++) {
2012
2012
  const { min, max } = videoAudioPeakRange(peaks, start + c * step * speed, start + (c + 1) * step * speed);
2013
- const gain = _chunk3OSXHLITcjs.videoClipSoundGain.call(void 0, clip, (c + 0.5) * step);
2013
+ const gain = _chunkZ64NRDEHcjs.videoClipSoundGain.call(void 0, clip, (c + 0.5) * step);
2014
2014
  out[2 * c] = min * gain;
2015
2015
  out[2 * c + 1] = max * gain;
2016
2016
  }
@@ -2141,7 +2141,7 @@ var VideoAudioPeaksCache = (_class2 = class {
2141
2141
  // src/video-editor/plan.ts
2142
2142
  function clipIndex(project) {
2143
2143
  const out = /* @__PURE__ */ new Map();
2144
- for (const { track } of _chunk3OSXHLITcjs.allVideoTracks.call(void 0, project)) for (const c of track.clips) out.set(c.id, c);
2144
+ for (const { track } of _chunkZ64NRDEHcjs.allVideoTracks.call(void 0, project)) for (const c of track.clips) out.set(c.id, c);
2145
2145
  return out;
2146
2146
  }
2147
2147
  function diffVideoProjects(before, after) {
@@ -2150,8 +2150,8 @@ function diffVideoProjects(before, after) {
2150
2150
  const clipsAdded = [...b.keys()].filter((id) => !a.has(id));
2151
2151
  const clipsRemoved = [...a.keys()].filter((id) => !b.has(id));
2152
2152
  const clipsChanged = [...b.keys()].filter((id) => a.has(id) && JSON.stringify(a.get(id)) !== JSON.stringify(b.get(id)));
2153
- const durationBefore = _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, before);
2154
- const durationAfter = _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, after);
2153
+ const durationBefore = _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, before);
2154
+ const durationAfter = _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, after);
2155
2155
  return { durationBefore, durationAfter, durationDelta: durationAfter - durationBefore, clipsAdded, clipsRemoved, clipsChanged };
2156
2156
  }
2157
2157
  function planVideoEdits(project, input) {
@@ -2781,7 +2781,7 @@ function videoProxyFfmpeg(asset, options = {}) {
2781
2781
  output
2782
2782
  ];
2783
2783
  const proxy = { scale, src: output, ...asset.width && asset.height ? { width: Math.trunc(asset.width * scale / 2) * 2, height: Math.trunc(asset.height * scale / 2) * 2 } : {} };
2784
- return { asset: asset.id, args, command: ["ffmpeg", ...args].map(_chunk3OSXHLITcjs.videoShellQuote).join(" "), proxy };
2784
+ return { asset: asset.id, args, command: ["ffmpeg", ...args].map(_chunkZ64NRDEHcjs.videoShellQuote).join(" "), proxy };
2785
2785
  }
2786
2786
  function videoProxyPlan(project, options = {}) {
2787
2787
  const scale = _nullishCoalesce(options.scale, () => ( 0.5));
@@ -2807,7 +2807,7 @@ var videoSourceFrameTime = (frame, fps) => (frame + 0.5) * 1e3 / fps;
2807
2807
  var videoFrameCacheKey = (src, frame) => `${frame}@${src}`;
2808
2808
  function videoFrameRequestsAt(project, time, srcFor = (l) => l.src) {
2809
2809
  const out = [];
2810
- for (const layer of _chunk3OSXHLITcjs.videoFrameLeafLayers.call(void 0, _chunk3OSXHLITcjs.videoFrameAt.call(void 0, project, time).layers)) {
2810
+ for (const layer of _chunkZ64NRDEHcjs.videoFrameLeafLayers.call(void 0, _chunkZ64NRDEHcjs.videoFrameAt.call(void 0, project, time).layers)) {
2811
2811
  if (layer.type !== "media" || layer.assetKind !== "video") continue;
2812
2812
  const src = srcFor(layer);
2813
2813
  if (!src) continue;
@@ -3148,7 +3148,7 @@ var VideoPreviewEngine = (_class6 = class {
3148
3148
  if (this.destroyed) return;
3149
3149
  const state = this.source.getState();
3150
3150
  const { project, time, playing } = state;
3151
- const frame = _chunk3OSXHLITcjs.videoFrameAt.call(void 0, project, time);
3151
+ const frame = _chunkZ64NRDEHcjs.videoFrameAt.call(void 0, project, time);
3152
3152
  const scale = resolveVideoPreviewScale(_nullishCoalesce(this.options.previewScale, () => ( state.previewScale)), this.resolutionFor(project.width));
3153
3153
  const assets = new Map(project.assets.map((a) => [a.id, a]));
3154
3154
  this.srcFor = (layer) => videoPreviewSrc(assets.get(_nullishCoalesce(layer.asset, () => ( ""))), scale, layer.src);
@@ -3178,7 +3178,7 @@ var VideoPreviewEngine = (_class6 = class {
3178
3178
  }
3179
3179
  };
3180
3180
  const sounding = new Map(frame.audio.map((a) => [a.clip, a]));
3181
- for (const layer of _chunk3OSXHLITcjs.videoFrameLeafLayers.call(void 0, frame.layers)) {
3181
+ for (const layer of _chunkZ64NRDEHcjs.videoFrameLeafLayers.call(void 0, frame.layers)) {
3182
3182
  if (layer.type !== "media" || layer.assetKind !== "video" || !layer.src) continue;
3183
3183
  const sound = sounding.get(layer.clip);
3184
3184
  sync(layer.clip, this.srcFor(layer), "video", _nullishCoalesce(layer.sourceTime, () => ( 0)), _nullishCoalesce(_optionalChain([sound, 'optionalAccess', _86 => _86.speed]), () => ( 1)), sound ? sound.gain : null);
@@ -3190,9 +3190,9 @@ var VideoPreviewEngine = (_class6 = class {
3190
3190
  }
3191
3191
  /** With effects, the frame is drawn at the start of its frame, so effect pictures are cached once per frame. */
3192
3192
  drawable(project, frame) {
3193
- if (!_optionalChain([this, 'access', _87 => _87.effects, 'optionalAccess', _88 => _88.available]) || !_chunk3OSXHLITcjs.videoLayersUseEffects.call(void 0, frame.layers)) return frame;
3194
- const at = _chunk3OSXHLITcjs.videoEffectFrameTime.call(void 0, frame.time, project.fps);
3195
- return at === frame.time ? frame : { ..._chunk3OSXHLITcjs.videoFrameAt.call(void 0, project, at), time: frame.time };
3193
+ if (!_optionalChain([this, 'access', _87 => _87.effects, 'optionalAccess', _88 => _88.available]) || !_chunkZ64NRDEHcjs.videoLayersUseEffects.call(void 0, frame.layers)) return frame;
3194
+ const at = _chunkZ64NRDEHcjs.videoEffectFrameTime.call(void 0, frame.time, project.fps);
3195
+ return at === frame.time ? frame : { ..._chunkZ64NRDEHcjs.videoFrameAt.call(void 0, project, at), time: frame.time };
3196
3196
  }
3197
3197
  redraw() {
3198
3198
  if (this.scheduled || this.destroyed) return;
@@ -3201,7 +3201,7 @@ var VideoPreviewEngine = (_class6 = class {
3201
3201
  this.scheduled = false;
3202
3202
  if (this.destroyed) return;
3203
3203
  const { project, time } = this.source.getState();
3204
- this.draw(this.drawable(project, _chunk3OSXHLITcjs.videoFrameAt.call(void 0, project, time)));
3204
+ this.draw(this.drawable(project, _chunkZ64NRDEHcjs.videoFrameAt.call(void 0, project, time)));
3205
3205
  });
3206
3206
  }
3207
3207
  __init40() {this.sourceFor = (layer) => {
@@ -3244,7 +3244,7 @@ var VideoPreviewEngine = (_class6 = class {
3244
3244
  if (!source) this.complete = false;
3245
3245
  return source;
3246
3246
  };
3247
- _chunk3OSXHLITcjs.drawVideoFrame.call(void 0, this.ctx, frame, sourceFor, resolution, {
3247
+ _chunkZ64NRDEHcjs.drawVideoFrame.call(void 0, this.ctx, frame, sourceFor, resolution, {
3248
3248
  defineSvgFilter: this.defineSvgFilter,
3249
3249
  lutFor: this.lutFor,
3250
3250
  scratch: this.scratch,
@@ -3348,17 +3348,17 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3348
3348
  constructor(options = {}) {;_class7.prototype.__init44.call(this);_class7.prototype.__init45.call(this);_class7.prototype.__init46.call(this);_class7.prototype.__init47.call(this);_class7.prototype.__init48.call(this);_class7.prototype.__init49.call(this);_class7.prototype.__init50.call(this);_class7.prototype.__init51.call(this);_class7.prototype.__init52.call(this);_class7.prototype.__init53.call(this);_class7.prototype.__init54.call(this);_class7.prototype.__init55.call(this);
3349
3349
  this.history = _nullishCoalesce(options.history, () => ( new (0, _chunkFJ2MSI43cjs.HistoryManager)()));
3350
3350
  this.audioPeaks = options.audioPeaks instanceof VideoAudioPeaksCache ? options.audioPeaks : new VideoAudioPeaksCache(options.audioPeaks);
3351
- this.luts = options.luts instanceof _chunk3OSXHLITcjs.VideoLutCache ? options.luts : new (0, _chunk3OSXHLITcjs.VideoLutCache)(options.luts);
3351
+ this.luts = options.luts instanceof _chunkZ64NRDEHcjs.VideoLutCache ? options.luts : new (0, _chunkZ64NRDEHcjs.VideoLutCache)(options.luts);
3352
3352
  this.frameCache = _nullishCoalesce(options.frameCache, () => ( null));
3353
- this.effects = new (0, _chunkRUZQMYXHcjs.EffectsSlot)();
3353
+ this.effects = new (0, _chunkA3A5TI6Rcjs.EffectsSlot)();
3354
3354
  if (options.effects) this.effects.set(options.effects);
3355
- this.effectsEngine = new (0, _chunk3OSXHLITcjs.VideoEffectsEngine)({ slot: this.effects });
3355
+ this.effectsEngine = new (0, _chunkZ64NRDEHcjs.VideoEffectsEngine)({ slot: this.effects });
3356
3356
  this.project = options.project ? parseVideoProject(options.project) : createVideoProject();
3357
3357
  this.issues = checkVideoProject(this.project);
3358
3358
  this.readOnly = _nullishCoalesce(options.readOnly, () => ( false));
3359
3359
  this.previewScale = checkPreviewScale(_nullishCoalesce(options.previewScale, () => ( "auto")));
3360
3360
  this.onChange = options.onChange;
3361
- this.player = new (0, _chunkM5GLQQWGcjs.AnimationPlayer)({ clock: options.clock, duration: () => _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, this.project), loop: "none" });
3361
+ this.player = new (0, _chunkM5GLQQWGcjs.AnimationPlayer)({ clock: options.clock, duration: () => _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, this.project), loop: "none" });
3362
3362
  this.state = this.computeState();
3363
3363
  this.connect();
3364
3364
  }
@@ -3395,12 +3395,12 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3395
3395
  const h = this.history.getState();
3396
3396
  return {
3397
3397
  project: this.project,
3398
- duration: _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, this.project),
3398
+ duration: _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, this.project),
3399
3399
  time: p.time,
3400
3400
  playing: p.playing,
3401
3401
  loop: p.loop,
3402
3402
  selection: this.selection,
3403
- current: _chunk3OSXHLITcjs.videoClipsAt.call(void 0, this.project, p.time).map((c) => c.clip.id),
3403
+ current: _chunkZ64NRDEHcjs.videoClipsAt.call(void 0, this.project, p.time).map((c) => c.clip.id),
3404
3404
  issues: this.issues,
3405
3405
  readOnly: this.readOnly,
3406
3406
  error: this.error,
@@ -3433,7 +3433,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3433
3433
  this.issues = checkVideoProject(project);
3434
3434
  const ids = new Set(project.tracks.flatMap((t) => t.clips.map((c) => c.id)));
3435
3435
  if (this.selection.some((id) => !ids.has(id))) this.selection = this.selection.filter((id) => ids.has(id));
3436
- this.player.setDuration(() => _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, this.project));
3436
+ this.player.setDuration(() => _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, this.project));
3437
3437
  } finally {
3438
3438
  this.applying = false;
3439
3439
  }
@@ -3595,7 +3595,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3595
3595
  }
3596
3596
  /** Selects clips (unknown ids are dropped). `add` toggles them into the current selection. */
3597
3597
  select(clips, options = {}) {
3598
- const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _104 => _104.filter, 'call', _105 => _105((id) => _chunk3OSXHLITcjs.findVideoClip.call(void 0, this.project, id))]), () => ( []));
3598
+ const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _104 => _104.filter, 'call', _105 => _105((id) => _chunkZ64NRDEHcjs.findVideoClip.call(void 0, this.project, id))]), () => ( []));
3599
3599
  let next;
3600
3600
  if (options.add) {
3601
3601
  next = [...this.selection];
@@ -3622,7 +3622,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3622
3622
  step(frames) {
3623
3623
  this.player.pause();
3624
3624
  const fps = this.project.fps;
3625
- this.player.seek(Math.max(0, _chunk3OSXHLITcjs.snapToVideoFrame.call(void 0, this.player.currentTime, fps) + frames * 1e3 / fps));
3625
+ this.player.seek(Math.max(0, _chunkZ64NRDEHcjs.snapToVideoFrame.call(void 0, this.player.currentTime, fps) + frames * 1e3 / fps));
3626
3626
  }
3627
3627
  setLoop(loop) {
3628
3628
  this.player.setLoop(loop);
@@ -3639,14 +3639,14 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3639
3639
  */
3640
3640
  snap(time, options = {}) {
3641
3641
  const threshold = _nullishCoalesce(options.threshold, () => ( 8 * 1e3 / this.project.fps));
3642
- const points = _chunk3OSXHLITcjs.videoSnapPoints.call(void 0, this.project, { exclude: options.exclude, playhead: options.playhead === false ? void 0 : this.player.currentTime });
3643
- const hit = _chunk3OSXHLITcjs.snapVideoTime.call(void 0, time, points, threshold);
3644
- return hit.snapped !== null ? hit : { time: Math.max(0, _chunk3OSXHLITcjs.snapToVideoFrame.call(void 0, time, this.project.fps)), snapped: null };
3642
+ const points = _chunkZ64NRDEHcjs.videoSnapPoints.call(void 0, this.project, { exclude: options.exclude, playhead: options.playhead === false ? void 0 : this.player.currentTime });
3643
+ const hit = _chunkZ64NRDEHcjs.snapVideoTime.call(void 0, time, points, threshold);
3644
+ return hit.snapped !== null ? hit : { time: Math.max(0, _chunkZ64NRDEHcjs.snapToVideoFrame.call(void 0, time, this.project.fps)), snapped: null };
3645
3645
  }
3646
3646
  /** Splits the selected clips (or every clip) under the playhead there, as one undo step. */
3647
3647
  splitAtPlayhead() {
3648
- const t = _chunk3OSXHLITcjs.snapToVideoFrame.call(void 0, this.player.currentTime, this.project.fps);
3649
- const under = _chunk3OSXHLITcjs.videoClipsAt.call(void 0, this.project, t).filter(({ clip }) => t > clip.start && t < _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip));
3648
+ const t = _chunkZ64NRDEHcjs.snapToVideoFrame.call(void 0, this.player.currentTime, this.project.fps);
3649
+ const under = _chunkZ64NRDEHcjs.videoClipsAt.call(void 0, this.project, t).filter(({ clip }) => t > clip.start && t < _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip));
3650
3650
  const chosen = this.selection.length ? under.filter(({ clip }) => this.selection.includes(clip.id)) : under;
3651
3651
  if (!chosen.length) return this.refuse("No clip is under the playhead to split.");
3652
3652
  return this.apply(chosen.map(({ clip }) => ({ op: "split_clip", clip: clip.id, at: t })), "Split");
@@ -3674,7 +3674,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3674
3674
  /** The provider's description of an effect, checked for `place` (rejects without a provider or for an unknown id). */
3675
3675
  async describeEffect(effect, place) {
3676
3676
  const d = await this.effects.require().describe(effect);
3677
- if (place) _chunk3OSXHLITcjs.checkVideoEffectPlace.call(void 0, d, place);
3677
+ if (place) _chunkZ64NRDEHcjs.checkVideoEffectPlace.call(void 0, d, place);
3678
3678
  return d;
3679
3679
  }
3680
3680
  refused(message) {
@@ -3687,7 +3687,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3687
3687
  try {
3688
3688
  plan = await run();
3689
3689
  } catch (error) {
3690
- if (_chunkRUZQMYXHcjs.isEffectError.call(void 0, error) || error instanceof Error) return this.refused(error.message);
3690
+ if (_chunkA3A5TI6Rcjs.isEffectError.call(void 0, error) || error instanceof Error) return this.refused(error.message);
3691
3691
  throw error;
3692
3692
  }
3693
3693
  const result = this.apply(plan.edit, plan.label, { merge });
@@ -3695,7 +3695,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3695
3695
  return { ...result, clip: plan.clip, ...plan.effect ? { effect: plan.effect() } : {} };
3696
3696
  }
3697
3697
  clipOrThrow(id) {
3698
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, this.project, id);
3698
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, this.project, id);
3699
3699
  if (!at) throw new Error(`There is no clip "${id}"; list_applied_effects or get_video_project lists the clips.`);
3700
3700
  return at.clip;
3701
3701
  }
@@ -3708,7 +3708,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3708
3708
  return this.effectEdit(async () => {
3709
3709
  const current = this.clipOrThrow(clip);
3710
3710
  const d = await this.describeEffect(effect, "clip");
3711
- const values = _chunk3OSXHLITcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3711
+ const values = _chunkZ64NRDEHcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3712
3712
  const stack = [..._nullishCoalesce(current.effects, () => ( []))];
3713
3713
  const taken = new Set(stack.map((e) => e.id));
3714
3714
  let n = 1;
@@ -3744,7 +3744,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3744
3744
  if (!(k in d.controls.properties)) throw new Error(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
3745
3745
  base[k] = d.defaults[k];
3746
3746
  }
3747
- next.values = _chunk3OSXHLITcjs.checkVideoEffectValues.call(void 0, d, given, { base, keyframes: true });
3747
+ next.values = _chunkZ64NRDEHcjs.checkVideoEffectValues.call(void 0, d, given, { base, keyframes: true });
3748
3748
  }
3749
3749
  if (changes.enabled !== void 0) {
3750
3750
  if (changes.enabled) delete next.enabled;
@@ -3762,7 +3762,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3762
3762
  removeClipEffect(clip, instance) {
3763
3763
  const reason = this.readOnlyReason();
3764
3764
  if (reason) return this.refused(reason);
3765
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, this.project, clip);
3765
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, this.project, clip);
3766
3766
  if (!at) return this.refused(`There is no clip "${clip}".`);
3767
3767
  const stack = _nullishCoalesce(at.clip.effects, () => ( []));
3768
3768
  const was = stack.find((e) => e.id === instance);
@@ -3779,7 +3779,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3779
3779
  return this.effectEdit(async () => {
3780
3780
  this.clipOrThrow(clip);
3781
3781
  const d = await this.describeEffect(effect, "transition");
3782
- const values = _chunk3OSXHLITcjs.checkVideoEffectValues.call(void 0, d, options.values);
3782
+ const values = _chunkZ64NRDEHcjs.checkVideoEffectValues.call(void 0, d, options.values);
3783
3783
  const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 1e3));
3784
3784
  return { edit: { op: "set_transition", clip, transition: { type: "effect", duration, effect: { effect: d.id, provider: this.effects.require().id, name: d.name, values } } }, label: `Transition ${d.name}`, clip };
3785
3785
  });
@@ -3792,7 +3792,7 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3792
3792
  addEffectClip(track, effect, options = {}) {
3793
3793
  return this.effectEdit(async () => {
3794
3794
  const d = await this.describeEffect(effect, "generator");
3795
- const values = _chunk3OSXHLITcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3795
+ const values = _chunkZ64NRDEHcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3796
3796
  const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 5e3));
3797
3797
  const label = `Add ${d.name}`;
3798
3798
  const clipId = _nullishCoalesce(options.id, () => ( ""));
@@ -3814,42 +3814,42 @@ var VideoEditorController = (_class7 = class _VideoEditorController {
3814
3814
  if (part === "generator") {
3815
3815
  if (current.type !== "effect") throw new Error(`Clip "${clip}" is not an effect clip.`);
3816
3816
  const d2 = await this.describeEffect(current.effect);
3817
- return { edit: { op: "update_clip", clip, set: { values: _chunk3OSXHLITcjs.checkVideoEffectValues.call(void 0, d2, values, { base: _nullishCoalesce(current.values, () => ( {})), keyframes: true }) } }, label: `Change ${_nullishCoalesce(current.name, () => ( d2.name))}`, clip };
3817
+ return { edit: { op: "update_clip", clip, set: { values: _chunkZ64NRDEHcjs.checkVideoEffectValues.call(void 0, d2, values, { base: _nullishCoalesce(current.values, () => ( {})), keyframes: true }) } }, label: `Change ${_nullishCoalesce(current.name, () => ( d2.name))}`, clip };
3818
3818
  }
3819
3819
  const t = current.transition;
3820
3820
  if (_optionalChain([t, 'optionalAccess', _109 => _109.type]) !== "effect" || !t.effect) throw new Error(`Clip "${clip}" has no effect transition.`);
3821
3821
  const d = await this.describeEffect(t.effect.effect);
3822
- const merged = _chunk3OSXHLITcjs.checkVideoEffectValues.call(void 0, d, values, { base: _nullishCoalesce(t.effect.values, () => ( {})) });
3822
+ const merged = _chunkZ64NRDEHcjs.checkVideoEffectValues.call(void 0, d, values, { base: _nullishCoalesce(t.effect.values, () => ( {})) });
3823
3823
  return { edit: { op: "set_transition", clip, transition: { ...t, effect: { ...t.effect, values: merged } } }, label: `Change transition ${d.name}`, clip };
3824
3824
  }, options.merge);
3825
3825
  }
3826
3826
  /** Keys for one numeric control of a clip effect (clip-relative ms), or `null` to stop animating it (keeping its value at the clip's start). */
3827
3827
  setClipEffectKeyframes(clip, instance, control, keys) {
3828
- const current = _optionalChain([_chunk3OSXHLITcjs.findVideoClip.call(void 0, this.project, clip), 'optionalAccess', _110 => _110.clip]);
3828
+ const current = _optionalChain([_chunkZ64NRDEHcjs.findVideoClip.call(void 0, this.project, clip), 'optionalAccess', _110 => _110.clip]);
3829
3829
  const was = _optionalChain([current, 'optionalAccess', _111 => _111.effects, 'optionalAccess', _112 => _112.find, 'call', _113 => _113((e) => e.id === instance)]);
3830
3830
  const value = _optionalChain([was, 'optionalAccess', _114 => _114.values, 'optionalAccess', _115 => _115[control]]);
3831
- const plain = keys === null ? _chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, value) ? _optionalChain([value, 'access', _116 => _116.keys, 'access', _117 => _117[0], 'optionalAccess', _118 => _118.v]) : value : { keys: [...keys].sort((a, b) => a.t - b.t) };
3831
+ const plain = keys === null ? _chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, value) ? _optionalChain([value, 'access', _116 => _116.keys, 'access', _117 => _117[0], 'optionalAccess', _118 => _118.v]) : value : { keys: [...keys].sort((a, b) => a.t - b.t) };
3832
3832
  return this.updateClipEffect(clip, instance, { values: { [control]: _nullishCoalesce(plain, () => ( null)) } });
3833
3833
  }
3834
3834
  /** What plays at `time` (default: the playhead). */
3835
3835
  frame(time = this.player.currentTime) {
3836
- return _chunk3OSXHLITcjs.videoFrameAt.call(void 0, this.project, time);
3836
+ return _chunkZ64NRDEHcjs.videoFrameAt.call(void 0, this.project, time);
3837
3837
  }
3838
3838
  /** The frame at `time` (default: the playhead) as SVG. */
3839
3839
  toSvg(time = this.player.currentTime, options = {}) {
3840
- return _chunk3OSXHLITcjs.videoProjectSvg.call(void 0, this.project, time, { lutFor: (src) => this.luts.peek(src), ...options });
3840
+ return _chunkZ64NRDEHcjs.videoProjectSvg.call(void 0, this.project, time, { lutFor: (src) => this.luts.peek(src), ...options });
3841
3841
  }
3842
3842
  /** The project as an ffmpeg command. */
3843
3843
  toFfmpeg(options = {}) {
3844
- return _chunk3OSXHLITcjs.toVideoFfmpeg.call(void 0, this.project, options);
3844
+ return _chunkZ64NRDEHcjs.toVideoFfmpeg.call(void 0, this.project, options);
3845
3845
  }
3846
3846
  /** The ffmpeg command that measures the mix's loudness (see `toVideoLoudnessMeasure`). */
3847
3847
  toLoudnessMeasure(options = {}) {
3848
- return _chunk3OSXHLITcjs.toVideoLoudnessMeasure.call(void 0, this.project, options);
3848
+ return _chunkZ64NRDEHcjs.toVideoLoudnessMeasure.call(void 0, this.project, options);
3849
3849
  }
3850
3850
  /** One track as a CMX 3600 EDL. */
3851
3851
  toEdl(options = {}) {
3852
- return _chunk3OSXHLITcjs.toVideoEdl.call(void 0, this.project, options);
3852
+ return _chunkZ64NRDEHcjs.toVideoEdl.call(void 0, this.project, options);
3853
3853
  }
3854
3854
  }, _class7.__initStatic(), _class7);
3855
3855
  function checkPreviewScale(scale) {
@@ -3917,12 +3917,12 @@ function videoRulerTicks(duration, pxPerSecond, fps) {
3917
3917
  const ticks = [];
3918
3918
  for (let t = 0; t <= duration + 1e-6; t += step) {
3919
3919
  const isMajor = Math.abs(t / major - Math.round(t / major)) < 1e-9;
3920
- ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label: _chunk3OSXHLITcjs.formatVideoTimecode.call(void 0, t, fps).replace(/^00:/, "") } : {} });
3920
+ ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label: _chunkZ64NRDEHcjs.formatVideoTimecode.call(void 0, t, fps).replace(/^00:/, "") } : {} });
3921
3921
  }
3922
3922
  return ticks;
3923
3923
  }
3924
3924
  function videoClipShowsWaveform(clip, asset, mode = "audio") {
3925
- if (clip.type !== "media" || mode === "none" || !_chunk3OSXHLITcjs.videoAssetHasSound.call(void 0, asset)) return false;
3925
+ if (clip.type !== "media" || mode === "none" || !_chunkZ64NRDEHcjs.videoAssetHasSound.call(void 0, asset)) return false;
3926
3926
  return mode === "all" || asset.kind === "audio";
3927
3927
  }
3928
3928
  var VIDEO_CLIP_ANIMATION_LABELS = {
@@ -3983,11 +3983,11 @@ function videoClipLabel(clip, asset, sequence) {
3983
3983
  if (clip.type === "effect") return `Effect: ${clip.effect}`;
3984
3984
  if (clip.type === "adjustment") return `Adjustment${clip.scope === "all" ? " (all tracks)" : clip.scope === "track" ? ` (${clip.targetTrack})` : ""}`;
3985
3985
  const base = _nullishCoalesce(_nullishCoalesce(_optionalChain([asset, 'optionalAccess', _121 => _121.name]), () => ( _optionalChain([asset, 'optionalAccess', _122 => _122.src, 'access', _123 => _123.replace, 'call', _124 => _124(/^.*[\\/]/, "")]))), () => ( clip.asset));
3986
- const speed = _chunk3OSXHLITcjs.videoClipSpeed.call(void 0, clip);
3986
+ const speed = _chunkZ64NRDEHcjs.videoClipSpeed.call(void 0, clip);
3987
3987
  return speed !== 1 ? `${base} (${Math.round(speed * 100)}%)` : base;
3988
3988
  }
3989
3989
  function planVideoClipDrag(project, input) {
3990
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project, input.clip);
3990
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project, input.clip);
3991
3991
  if (!at) return null;
3992
3992
  const { clip, track } = at;
3993
3993
  const snap = _nullishCoalesce(input.snap, () => ( ((t) => t)));
@@ -4004,17 +4004,17 @@ function planVideoClipDrag(project, input) {
4004
4004
  }
4005
4005
  const minimum = 1e3 / project.fps;
4006
4006
  if (input.mode === "trim-start") {
4007
- const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)), _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip) - minimum);
4007
+ const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)), _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip) - minimum);
4008
4008
  const changed2 = Math.abs(to2 - clip.start) > 1e-6;
4009
- const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration: _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip) - to2 };
4009
+ const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration: _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip) - to2 };
4010
4010
  return { ...plan, track: track.id, edit: changed2 ? { op: "trim_clip", clip: clip.id, edge: "start", to: to2, ...input.ripple ? { ripple: true } : {} } : null };
4011
4011
  }
4012
- const to = Math.max(snap(_chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip) + input.delta), clip.start + minimum);
4013
- const changed = Math.abs(to - _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip)) > 1e-6;
4012
+ const to = Math.max(snap(_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip) + input.delta), clip.start + minimum);
4013
+ const changed = Math.abs(to - _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip)) > 1e-6;
4014
4014
  return { start: clip.start, duration: to - clip.start, track: track.id, edit: changed ? { op: "trim_clip", clip: clip.id, edge: "end", to, ...input.ripple ? { ripple: true } : {} } : null };
4015
4015
  }
4016
4016
  function videoDropTracks(project, clipId) {
4017
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project, clipId);
4017
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project, clipId);
4018
4018
  if (!at) return [];
4019
4019
  return project.tracks.filter((t) => t.kind === at.track.kind && !t.locked).map((t) => t.id);
4020
4020
  }
@@ -4023,7 +4023,7 @@ function videoDragLabel(edit) {
4023
4023
  return edit.op === "trim_clip" && edit.ripple ? "Ripple trim" : "Trim clip";
4024
4024
  }
4025
4025
  function videoAssetDropEdit(project, assetId, options = {}) {
4026
- const asset = _chunk3OSXHLITcjs.videoAssetMap.call(void 0, project).get(assetId);
4026
+ const asset = _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, project).get(assetId);
4027
4027
  if (!asset) return null;
4028
4028
  const kind = asset.kind === "audio" ? "audio" : "video";
4029
4029
  const track = _nullishCoalesce(options.track, () => ( _optionalChain([project, 'access', _125 => _125.tracks, 'access', _126 => _126.find, 'call', _127 => _127((t) => t.kind === kind && !t.locked), 'optionalAccess', _128 => _128.id])));
@@ -4075,25 +4075,25 @@ var KEY_LABELS = {
4075
4075
  scale: { label: "Scale", step: 0.05 },
4076
4076
  rotation: { label: "Rotation", step: 1 }
4077
4077
  };
4078
- var animatableOf = (clip, property) => _chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _129 => _129.transform, 'optionalAccess', _130 => _130[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
4078
+ var animatableOf = (clip, property) => _chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _129 => _129.transform, 'optionalAccess', _130 => _130[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
4079
4079
  var playheadInClip = (clip, time) => Math.round(Math.min(clip.duration, Math.max(0, time - clip.start)));
4080
4080
  function videoKeyframeRows(project, clipId, time) {
4081
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project, clipId);
4081
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project, clipId);
4082
4082
  if (!at) return [];
4083
4083
  const { clip } = at;
4084
- const asset = clip.type === "media" ? _chunk3OSXHLITcjs.videoAssetMap.call(void 0, project).get(clip.asset) : void 0;
4084
+ const asset = clip.type === "media" ? _chunkZ64NRDEHcjs.videoAssetMap.call(void 0, project).get(clip.asset) : void 0;
4085
4085
  const visual = !(_optionalChain([asset, 'optionalAccess', _131 => _131.kind]) === "audio" || at.track.kind === "audio");
4086
- const audible = clip.type === "media" && _chunk3OSXHLITcjs.videoAssetHasSound.call(void 0, asset) || clip.type === "sequence";
4087
- const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ? _chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES : []];
4086
+ const audible = clip.type === "media" && _chunkZ64NRDEHcjs.videoAssetHasSound.call(void 0, asset) || clip.type === "sequence";
4087
+ const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ? _chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES : []];
4088
4088
  const clipTime = playheadInClip(clip, time);
4089
4089
  return properties.map((property) => {
4090
4090
  const prop = animatableOf(clip, property);
4091
- const keys = _chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, prop) ? prop.keys : [];
4092
- const limits = _chunk3OSXHLITcjs.VIDEO_KEYFRAME_LIMITS[property];
4091
+ const keys = _chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, prop) ? prop.keys : [];
4092
+ const limits = _chunkZ64NRDEHcjs.VIDEO_KEYFRAME_LIMITS[property];
4093
4093
  return {
4094
4094
  property,
4095
4095
  ...KEY_LABELS[property],
4096
- value: Math.round(_chunk3OSXHLITcjs.videoValueAt.call(void 0, prop, clipTime, limits.default) * 1e3) / 1e3,
4096
+ value: Math.round(_chunkZ64NRDEHcjs.videoValueAt.call(void 0, prop, clipTime, limits.default) * 1e3) / 1e3,
4097
4097
  keyed: keys.length > 0,
4098
4098
  keys: keys.length,
4099
4099
  onKey: keys.some((k) => Math.abs(k.t - clipTime) < 0.5),
@@ -4104,44 +4104,44 @@ function videoKeyframeRows(project, clipId, time) {
4104
4104
  });
4105
4105
  }
4106
4106
  function plainValueEdit(clip, property, value) {
4107
- if (!_chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property))
4107
+ if (!_chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property))
4108
4108
  return value === void 0 ? { op: "update_clip", clip: clip.id, remove: [property] } : { op: "update_clip", clip: clip.id, set: { [property]: value } };
4109
4109
  const transform = { ...clip.transform, [property]: value };
4110
4110
  if (value === void 0) delete transform[property];
4111
4111
  return Object.keys(transform).length ? { op: "update_clip", clip: clip.id, set: { transform } } : { op: "update_clip", clip: clip.id, remove: ["transform"] };
4112
4112
  }
4113
4113
  function videoKeyframeValueEdit(project, clipId, property, time, value) {
4114
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project, clipId);
4114
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project, clipId);
4115
4115
  if (!at) return null;
4116
4116
  const prop = animatableOf(at.clip, property);
4117
- if (!_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, prop)) return plainValueEdit(at.clip, property, value);
4117
+ if (!_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, prop)) return plainValueEdit(at.clip, property, value);
4118
4118
  if (value === void 0) return null;
4119
- return { op: "set_keyframes", clip: clipId, property, keys: _chunk3OSXHLITcjs.setVideoKey.call(void 0, prop, { t: playheadInClip(at.clip, time), v: value }, _chunk3OSXHLITcjs.VIDEO_KEYFRAME_LIMITS[property].default).keys };
4119
+ return { op: "set_keyframes", clip: clipId, property, keys: _chunkZ64NRDEHcjs.setVideoKey.call(void 0, prop, { t: playheadInClip(at.clip, time), v: value }, _chunkZ64NRDEHcjs.VIDEO_KEYFRAME_LIMITS[property].default).keys };
4120
4120
  }
4121
4121
  function videoKeyframeToggleEdit(project, clipId, property, time) {
4122
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project, clipId);
4122
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project, clipId);
4123
4123
  if (!at) return null;
4124
4124
  const prop = animatableOf(at.clip, property);
4125
4125
  const t = playheadInClip(at.clip, time);
4126
- const fallback = _chunk3OSXHLITcjs.VIDEO_KEYFRAME_LIMITS[property].default;
4127
- if (_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, prop)) {
4126
+ const fallback = _chunkZ64NRDEHcjs.VIDEO_KEYFRAME_LIMITS[property].default;
4127
+ if (_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, prop)) {
4128
4128
  const key = prop.keys.find((k) => Math.abs(k.t - t) < 0.5);
4129
4129
  if (key) {
4130
- const rest = _chunk3OSXHLITcjs.removeVideoKey.call(void 0, prop, key.t);
4131
- return _chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, rest) ? { op: "set_keyframes", clip: clipId, property, keys: rest.keys } : plainValueEdit(at.clip, property, rest === fallback ? void 0 : rest);
4130
+ const rest = _chunkZ64NRDEHcjs.removeVideoKey.call(void 0, prop, key.t);
4131
+ return _chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, rest) ? { op: "set_keyframes", clip: clipId, property, keys: rest.keys } : plainValueEdit(at.clip, property, rest === fallback ? void 0 : rest);
4132
4132
  }
4133
4133
  }
4134
- const v = _chunk3OSXHLITcjs.videoValueAt.call(void 0, prop, t, fallback);
4135
- return { op: "set_keyframes", clip: clipId, property, keys: _chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, prop) ? _chunk3OSXHLITcjs.setVideoKey.call(void 0, prop, { t, v }, fallback).keys : [{ t, v }] };
4134
+ const v = _chunkZ64NRDEHcjs.videoValueAt.call(void 0, prop, t, fallback);
4135
+ return { op: "set_keyframes", clip: clipId, property, keys: _chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, prop) ? _chunkZ64NRDEHcjs.setVideoKey.call(void 0, prop, { t, v }, fallback).keys : [{ t, v }] };
4136
4136
  }
4137
4137
  function videoLutEdits(project, clips, lut) {
4138
4138
  const edits = [];
4139
4139
  for (const id of clips) {
4140
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project, id);
4140
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project, id);
4141
4141
  if (!at) continue;
4142
4142
  const { lut: current, ...rest } = _nullishCoalesce(at.clip.grade, () => ( {}));
4143
4143
  if (!lut && !current) continue;
4144
- const grade = _chunk3OSXHLITcjs.normalizeVideoGrade.call(void 0, lut ? { ...rest, lut } : rest);
4144
+ const grade = _chunkZ64NRDEHcjs.normalizeVideoGrade.call(void 0, lut ? { ...rest, lut } : rest);
4145
4145
  edits.push(grade ? { op: "update_clip", clip: id, set: { grade } } : { op: "update_clip", clip: id, remove: ["grade"] });
4146
4146
  }
4147
4147
  return edits;
@@ -4162,7 +4162,7 @@ function videoAddAdjustmentEdits(project, time, options = {}) {
4162
4162
  const duration = _nullishCoalesce(options.duration, () => ( 3e3));
4163
4163
  const start = Math.max(0, time);
4164
4164
  const top = project.tracks[0];
4165
- const free = top && top.kind === "video" && !top.locked && !top.clips.some((c) => c.start < start + duration && _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c) > start);
4165
+ const free = top && top.kind === "video" && !top.locked && !top.clips.some((c) => c.start < start + duration && _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c) > start);
4166
4166
  const edits = [];
4167
4167
  let track = _optionalChain([top, 'optionalAccess', _132 => _132.id]);
4168
4168
  if (!free) {
@@ -4181,7 +4181,7 @@ function videoMaskEdit(clip, mask) {
4181
4181
  function videoSkinProtectionEdits(project, clips, amount) {
4182
4182
  const edits = [];
4183
4183
  for (const id of clips) {
4184
- const clip = _optionalChain([_chunk3OSXHLITcjs.findVideoClip.call(void 0, project, id), 'optionalAccess', _133 => _133.clip]);
4184
+ const clip = _optionalChain([_chunkZ64NRDEHcjs.findVideoClip.call(void 0, project, id), 'optionalAccess', _133 => _133.clip]);
4185
4185
  const lut = _optionalChain([clip, 'optionalAccess', _134 => _134.grade, 'optionalAccess', _135 => _135.lut]);
4186
4186
  if (!clip || !lut) continue;
4187
4187
  const { preserveSkinTones: _p, ...rest } = lut;
@@ -4215,7 +4215,7 @@ var RIPPLE = {
4215
4215
  };
4216
4216
  var MODE = {
4217
4217
  type: "string",
4218
- enum: [..._chunk3OSXHLITcjs.VIDEO_PLACEMENT_MODES],
4218
+ enum: [..._chunkZ64NRDEHcjs.VIDEO_PLACEMENT_MODES],
4219
4219
  description: 'What to do with clips already where it lands: "refuse" (default) fails with the next free place; "overwrite" cuts, trims or removes what is underneath on that track; "insert" cuts everything across the start and pushes later material along by its length on this track and every sync-locked track.'
4220
4220
  };
4221
4221
  var DELTA = (what) => ({ type: "number", description: `${what}, in milliseconds of timeline time: positive is later, negative earlier. It is clamped to what the media and neighbours allow; the result says how far it went.` });
@@ -4232,11 +4232,11 @@ var TRANSFORM = object(
4232
4232
  );
4233
4233
  var TRANSITION = object(
4234
4234
  {
4235
- type: { type: "string", enum: _chunk3OSXHLITcjs.VIDEO_TRANSITION_TYPES.filter((t) => t !== "effect"), description: "crossfade (this clip fades up over the one before), dip (down into a colour and up out of it), wipe (an edge travels across revealing this clip), push (this clip slides in and pushes the one before out), slide (this clip slides in over the one before) or iris (a circle opens from the centre). For a transition effect from the effects provider use set_video_effect_transition." },
4235
+ type: { type: "string", enum: _chunkZ64NRDEHcjs.VIDEO_TRANSITION_TYPES.filter((t) => t !== "effect"), description: "crossfade (this clip fades up over the one before), dip (down into a colour and up out of it), wipe (an edge travels across revealing this clip), push (this clip slides in and pushes the one before out), slide (this clip slides in over the one before) or iris (a circle opens from the centre). For a transition effect from the effects provider use set_video_effect_transition." },
4236
4236
  duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms, centred on the cut. Every type but dip needs half of it in media past the cut on both sides (handles); a dip needs none." },
4237
4237
  color: COLOR("For dip: the colour passed through (default black)"),
4238
- direction: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_WIPE_DIRECTIONS], description: "For wipe, push and slide: the way the edge or picture travels (default right, coming in from the left)." },
4239
- audioCurve: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fades through it: default equal-power for every type but dip (steady loudness while the two sounds overlap), linear for dip; or s-curve, exponential, logarithmic." }
4238
+ direction: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_WIPE_DIRECTIONS], description: "For wipe, push and slide: the way the edge or picture travels (default right, coming in from the left)." },
4239
+ audioCurve: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fades through it: default equal-power for every type but dip (steady loudness while the two sounds overlap), linear for dip; or s-curve, exponential, logarithmic." }
4240
4240
  },
4241
4241
  ["type", "duration"],
4242
4242
  "A transition from the clip that ends where this one starts on the same track."
@@ -4246,7 +4246,7 @@ var LUT_STRENGTH = { type: "number", minimum: 0, maximum: 1, description: "How m
4246
4246
  var SKIN = { type: "number", minimum: 0, maximum: 1, description: "How much of the LUT's change to hold back on skin tones, 0 (none, the default) to 1 (skin keeps its colour); 0.5-0.8 keeps faces natural under a heavy look. Applied in the preview and frame renders; ffmpeg's lut3d cannot, so the export notes it." };
4247
4247
  var GRADE = object(
4248
4248
  {
4249
- ...Object.fromEntries(_chunk3OSXHLITcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, { type: "number", minimum: c.min, maximum: c.max, description: c.description }])),
4249
+ ...Object.fromEntries(_chunkZ64NRDEHcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, { type: "number", minimum: c.min, maximum: c.max, description: c.description }])),
4250
4250
  lut: object({ src: LUT_SRC, strength: LUT_STRENGTH, name: { type: "string", minLength: 1, description: "A label for the look." }, preserveSkinTones: SKIN }, ["src"], "A 3D LUT applied after the other settings (set_video_lut checks the file first).")
4251
4251
  },
4252
4252
  [],
@@ -4254,7 +4254,7 @@ var GRADE = object(
4254
4254
  );
4255
4255
  var ANIMATION = (when) => object(
4256
4256
  {
4257
- effect: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_CLIP_ANIMATION_EFFECTS], description: "fade; rise (up into place) or drop (down into place); slide-left / slide-right (moving that way); zoom (grows into place); pop (grows past its size and settles). Each also fades; an exit plays the movement backwards." },
4257
+ effect: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_CLIP_ANIMATION_EFFECTS], description: "fade; rise (up into place) or drop (down into place); slide-left / slide-right (moving that way); zoom (grows into place); pop (grows past its size and settles). Each also fades; an exit plays the movement backwards." },
4258
4258
  duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default 500)." }
4259
4259
  },
4260
4260
  ["effect"],
@@ -4264,11 +4264,11 @@ var CLIP_COMMON = {
4264
4264
  name: { type: "string", description: "A label for the clip." },
4265
4265
  opacity: { type: "number", minimum: 0, maximum: 1, description: "Opacity 0\u20131 (default 1). A number replaces any keyframes; set_video_keyframes animates it." },
4266
4266
  transform: TRANSFORM,
4267
- fit: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_FITS], description: "How the picture fits the frame before the transform, as CSS object-fit (default contain for media, fill for colours)." },
4267
+ fit: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_FITS], description: "How the picture fits the frame before the transform, as CSS object-fit (default contain for media, fill for colours)." },
4268
4268
  grade: GRADE,
4269
4269
  animateIn: ANIMATION("How the picture enters, from the clip's start (on top of any fade in). Titles usually rise, pop or fade in."),
4270
4270
  animateOut: ANIMATION("How the picture leaves, ending at the clip's end."),
4271
- blend: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_BLEND_MODES], description: "How the picture mixes with what is beneath it, as CSS mix-blend-mode (default normal): multiply darkens (shadows, textures), screen and add lighten (light leaks, flares, glows), overlay and soft-light add contrast, difference and exclusion invert." },
4271
+ blend: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_BLEND_MODES], description: "How the picture mixes with what is beneath it, as CSS mix-blend-mode (default normal): multiply darkens (shadows, textures), screen and add lighten (light leaks, flares, glows), overlay and soft-light add contrast, difference and exclusion invert." },
4272
4272
  fadeIn: MS("Fade up from nothing (picture and sound) over this long"),
4273
4273
  fadeOut: MS("Fade down to nothing over this long")
4274
4274
  };
@@ -4277,8 +4277,8 @@ var MEDIA_FIELDS = {
4277
4277
  speed: { type: "number", minimum: 0.05, maximum: 20, description: "Playback speed (default 1). Changing it keeps the stretch of source, so the clip gets shorter or longer." },
4278
4278
  volume: { type: "number", minimum: 0, maximum: 4, description: "Gain (1 = unchanged, default 1). A number replaces any keyframes; set_video_keyframes animates it." },
4279
4279
  muted: { type: "boolean", description: "Silence this clip (default false)." },
4280
- fadeInCurve: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade in (default linear; the picture always fades linearly): linear, equal-power (steady loudness, best for crossfades), s-curve (gentle at both ends), exponential (slow start, natural from silence) or logarithmic (fast start)." },
4281
- fadeOutCurve: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade out (default linear), the same choices as fadeInCurve; exponential sounds natural fading to silence." }
4280
+ fadeInCurve: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade in (default linear; the picture always fades linearly): linear, equal-power (steady loudness, best for crossfades), s-curve (gentle at both ends), exponential (slow start, natural from silence) or logarithmic (fast start)." },
4281
+ fadeOutCurve: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade out (default linear), the same choices as fadeInCurve; exponential sounds natural fading to silence." }
4282
4282
  };
4283
4283
  var TEXT_FIELDS = {
4284
4284
  text: { type: "string", minLength: 1, description: `The title's text ("\\n" breaks lines).` },
@@ -4327,7 +4327,7 @@ var ASSET_FIELDS = {
4327
4327
  };
4328
4328
  var KEY_PROPERTY = {
4329
4329
  type: "string",
4330
- enum: [..._chunk3OSXHLITcjs.VIDEO_KEYFRAME_PROPERTIES],
4330
+ enum: [..._chunkZ64NRDEHcjs.VIDEO_KEYFRAME_PROPERTIES],
4331
4331
  description: "Which property: opacity (0\u20131), volume (media only, 0\u20134 gain), x / y (pixels from the frame's centre, right / down), scale (1 = fitted size) or rotation (degrees clockwise)."
4332
4332
  };
4333
4333
  var KEYS = {
@@ -4342,7 +4342,7 @@ var KEYS = {
4342
4342
  ease: {
4343
4343
  description: "How the value moves from this key to the next (default linear): linear, hold (stays, then jumps at the next key), ease-in, ease-out, ease-in-out, or CSS cubic-bezier points [x1, y1, x2, y2] with x1 and x2 in 0\u20131.",
4344
4344
  anyOf: [
4345
- { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_EASE_NAMES] },
4345
+ { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_EASE_NAMES] },
4346
4346
  { type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }
4347
4347
  ]
4348
4348
  }
@@ -4371,19 +4371,19 @@ var describeVideoTracks = (tracks) => tracks.map((t, index) => ({
4371
4371
  ...t.locked ? { locked: true } : {},
4372
4372
  ...t.syncLocked === false ? { syncLocked: false } : {},
4373
4373
  ...t.volume !== void 0 ? { volume: t.volume } : {},
4374
- clips: _chunk3OSXHLITcjs.sortedVideoClips.call(void 0, t).map((c) => ({ ...c, end: _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunk3OSXHLITcjs.videoClipSourceRange.call(void 0, c) } : {} }))
4374
+ clips: _chunkZ64NRDEHcjs.sortedVideoClips.call(void 0, t).map((c) => ({ ...c, end: _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkZ64NRDEHcjs.videoClipSourceRange.call(void 0, c) } : {} }))
4375
4375
  }));
4376
- var videoSequenceUsers = (project, id) => _chunk3OSXHLITcjs.allVideoTracks.call(void 0, project).flatMap(
4377
- ({ sequence, track }) => track.clips.flatMap((c) => c.type === "sequence" && c.sequence === id ? [{ clip: c.id, ...sequence ? { inSequence: sequence } : {}, track: track.id, start: c.start, end: _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c), source: _chunk3OSXHLITcjs.videoClipSourceRange.call(void 0, c) }] : [])
4376
+ var videoSequenceUsers = (project, id) => _chunkZ64NRDEHcjs.allVideoTracks.call(void 0, project).flatMap(
4377
+ ({ sequence, track }) => track.clips.flatMap((c) => c.type === "sequence" && c.sequence === id ? [{ clip: c.id, ...sequence ? { inSequence: sequence } : {}, track: track.id, start: c.start, end: _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c), source: _chunkZ64NRDEHcjs.videoClipSourceRange.call(void 0, c) }] : [])
4378
4378
  );
4379
4379
  function describeVideoSequence(project, sequence, tracks = true) {
4380
- const cycle = _chunk3OSXHLITcjs.findVideoSequenceCycle.call(void 0, project, sequence.id);
4380
+ const cycle = _chunkZ64NRDEHcjs.findVideoSequenceCycle.call(void 0, project, sequence.id);
4381
4381
  return {
4382
4382
  id: sequence.id,
4383
4383
  ...sequence.name ? { name: sequence.name } : {},
4384
- duration: _chunk3OSXHLITcjs.videoSequenceDuration.call(void 0, sequence),
4384
+ duration: _chunkZ64NRDEHcjs.videoSequenceDuration.call(void 0, sequence),
4385
4385
  clipCount: sequence.tracks.reduce((n, t) => n + t.clips.length, 0),
4386
- nests: _chunk3OSXHLITcjs.videoSequenceChildren.call(void 0, sequence),
4386
+ nests: _chunkZ64NRDEHcjs.videoSequenceChildren.call(void 0, sequence),
4387
4387
  usedBy: videoSequenceUsers(project, sequence.id),
4388
4388
  ...cycle ? { cycle } : {},
4389
4389
  ...tracks ? { tracks: describeVideoTracks(sequence.tracks) } : { trackCount: sequence.tracks.length }
@@ -4395,7 +4395,7 @@ function describeVideoProject(project) {
4395
4395
  width: project.width,
4396
4396
  height: project.height,
4397
4397
  fps: project.fps,
4398
- duration: _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, project),
4398
+ duration: _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, project),
4399
4399
  ...project.background ? { background: project.background } : {},
4400
4400
  assets: project.assets.map(videoAssetOut),
4401
4401
  tracks: describeVideoTracks(project.tracks),
@@ -4412,7 +4412,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4412
4412
  const project = () => controller.getProject();
4413
4413
  const outcome = (result, extra = {}) => {
4414
4414
  if (!result.ok) throw new Error(result.error);
4415
- return { ...extra, duration: _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, result.project), issues: issueSummary(result.issues) };
4415
+ return { ...extra, duration: _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, result.project), issues: issueSummary(result.issues) };
4416
4416
  };
4417
4417
  const apply = (edits, label, extra) => {
4418
4418
  const result = controller.apply(edits, label);
@@ -4421,7 +4421,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4421
4421
  const clipOut = (p, id) => {
4422
4422
  for (const t of p.tracks) {
4423
4423
  const c = t.clips.find((x) => x.id === id);
4424
- if (c) return { track: t.id, ...c, end: _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunk3OSXHLITcjs.videoClipSourceRange.call(void 0, c) } : {} };
4424
+ if (c) return { track: t.id, ...c, end: _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkZ64NRDEHcjs.videoClipSourceRange.call(void 0, c) } : {} };
4425
4425
  }
4426
4426
  return null;
4427
4427
  };
@@ -4433,7 +4433,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4433
4433
  });
4434
4434
  const keysOut = (p, clip, property) => {
4435
4435
  const c = clipOut(p, clip);
4436
- const value = _chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _144 => _144.transform, 'optionalAccess', _145 => _145[property]]) : _optionalChain([c, 'optionalAccess', _146 => _146[property]]);
4436
+ const value = _chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _144 => _144.transform, 'optionalAccess', _145 => _145[property]]) : _optionalChain([c, 'optionalAccess', _146 => _146[property]]);
4437
4437
  return typeof value === "object" ? { keys: value.keys } : { keys: [], value: _nullishCoalesce(value, () => ( null)) };
4438
4438
  };
4439
4439
  const getProject = {
@@ -4455,8 +4455,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
4455
4455
  inputSchema: object({ time: MS("Time from the start (default: the playhead)") }),
4456
4456
  annotations: { title: "What plays at a moment", ...READ },
4457
4457
  handler: ({ time }) => {
4458
- const frame = _chunk3OSXHLITcjs.videoFrameAt.call(void 0, project(), _nullishCoalesce(time, () => ( controller.getState().time)));
4459
- return { ...frame, timecode: _chunk3OSXHLITcjs.formatVideoTimecode.call(void 0, frame.time, project().fps) };
4458
+ const frame = _chunkZ64NRDEHcjs.videoFrameAt.call(void 0, project(), _nullishCoalesce(time, () => ( controller.getState().time)));
4459
+ return { ...frame, timecode: _chunkZ64NRDEHcjs.formatVideoTimecode.call(void 0, frame.time, project().fps) };
4460
4460
  }
4461
4461
  };
4462
4462
  const listSequences = {
@@ -4484,7 +4484,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4484
4484
  annotations: { title: "Find gaps", ...READ },
4485
4485
  handler: ({ track }) => {
4486
4486
  if (track !== void 0 && !project().tracks.some((t) => t.id === track)) throw new Error(`There is no track "${track}"; the tracks are ${project().tracks.map((t) => `"${t.id}"`).join(", ")}.`);
4487
- return { gaps: _chunk3OSXHLITcjs.findVideoGaps.call(void 0, project(), track) };
4487
+ return { gaps: _chunkZ64NRDEHcjs.findVideoGaps.call(void 0, project(), track) };
4488
4488
  }
4489
4489
  };
4490
4490
  const checkProject = {
@@ -4514,7 +4514,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4514
4514
  const lutSrcs = [...new Set(p.tracks.flatMap((t) => t.clips.map((c) => _optionalChain([c, 'access', _147 => _147.grade, 'optionalAccess', _148 => _148.lut, 'optionalAccess', _149 => _149.src])).filter((x) => !!x)))];
4515
4515
  const missing = (await Promise.all(lutSrcs.map((src) => controller.luts.load(src).then(() => null, (e) => e.message)))).filter((m) => !!m);
4516
4516
  const svgOptions = { lutFor: (src) => controller.luts.peek(src), ...columns ? { columns } : {} };
4517
- const svg = times ? _chunk3OSXHLITcjs.videoContactSheetSvg.call(void 0, p, times, svgOptions) : _chunk3OSXHLITcjs.videoProjectSvg.call(void 0, p, _nullishCoalesce(time, () => ( controller.getState().time)), svgOptions);
4517
+ const svg = times ? _chunkZ64NRDEHcjs.videoContactSheetSvg.call(void 0, p, times, svgOptions) : _chunkZ64NRDEHcjs.videoProjectSvg.call(void 0, p, _nullishCoalesce(time, () => ( controller.getState().time)), svgOptions);
4518
4518
  const notes = [...missing.map((m) => `${m}; that LUT is left out of the picture.`), ...lutSrcs.length > missing.length ? ["LUTs are drawn approximately in SVG (curves and a colour matrix); the preview and export apply them exactly."] : []];
4519
4519
  if (format === "png") {
4520
4520
  if (!options.rasterize) throw new Error('This host cannot make PNG images; call render_video_frame with format "svg".');
@@ -4604,7 +4604,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4604
4604
  if (play === true) controller.play();
4605
4605
  if (play === false) controller.pause();
4606
4606
  const state = controller.getState();
4607
- return { time: state.time, timecode: _chunk3OSXHLITcjs.formatVideoTimecode.call(void 0, state.time, p.fps), playing: state.playing, clips: state.current };
4607
+ return { time: state.time, timecode: _chunkZ64NRDEHcjs.formatVideoTimecode.call(void 0, state.time, p.fps), playing: state.playing, clips: state.current };
4608
4608
  }
4609
4609
  };
4610
4610
  const setSettings = {
@@ -4730,7 +4730,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4730
4730
  inputSchema: object(
4731
4731
  {
4732
4732
  clip: CLIP_ID,
4733
- set: object({ ...CLIP_COMMON, ...MEDIA_FIELDS, asset: { ...ASSET_ID, description: "For media: play another asset (same in point)." }, ...TEXT_FIELDS, color: COLOR("Text colour, or a colour clip's fill"), scope: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_ADJUSTMENT_SCOPES], description: "For adjustment clips: which pictures it changes, underneath (default), all or track." }, targetTrack: { ...TRACK_ID, description: 'For adjustment clips with scope "track": the track whose pictures it changes.' } }, [], "Fields to replace (only those that fit the clip's type)."),
4733
+ set: object({ ...CLIP_COMMON, ...MEDIA_FIELDS, asset: { ...ASSET_ID, description: "For media: play another asset (same in point)." }, ...TEXT_FIELDS, color: COLOR("Text colour, or a colour clip's fill"), scope: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_ADJUSTMENT_SCOPES], description: "For adjustment clips: which pictures it changes, underneath (default), all or track." }, targetTrack: { ...TRACK_ID, description: 'For adjustment clips with scope "track": the track whose pictures it changes.' } }, [], "Fields to replace (only those that fit the clip's type)."),
4734
4734
  remove: { type: "array", items: { type: "string", enum: ["name", "opacity", "transform", "fit", "blend", "grade", "animateIn", "animateOut", "fadeIn", "fadeOut", "fadeInCurve", "fadeOutCurve", "in", "speed", "volume", "muted", "fontSize", "fontFamily", "fontWeight", "background", "scope", "targetTrack"] }, description: 'Fields to reset to their defaults (an adjustment clip going from scope "track" to another scope must also remove targetTrack).' }
4735
4735
  },
4736
4736
  ["clip"]
@@ -4749,7 +4749,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4749
4749
  const gradeTargets = (ids) => {
4750
4750
  const p = project();
4751
4751
  for (const id of ids) {
4752
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, p, id);
4752
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, p, id);
4753
4753
  if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
4754
4754
  const { clip } = at;
4755
4755
  if (at.track.kind !== "video" || clip.type === "media" && _optionalChain([p, 'access', _150 => _150.assets, 'access', _151 => _151.find, 'call', _152 => _152((a) => a.id === clip.asset), 'optionalAccess', _153 => _153.kind]) === "audio")
@@ -4763,7 +4763,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4763
4763
  inputSchema: object(
4764
4764
  {
4765
4765
  clips: { type: "array", items: CLIP_ID, minItems: 1, description: "Clips on video tracks to grade." },
4766
- preset: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_GRADE_PRESET_NAMES], description: "The look." },
4766
+ preset: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_GRADE_PRESET_NAMES], description: "The look." },
4767
4767
  amount: { type: "number", minimum: 0, maximum: 1, description: "Strength, 0 (none) to 1 (full, the default); 0.5 is a subtler version." }
4768
4768
  },
4769
4769
  ["clips", "preset"]
@@ -4772,10 +4772,10 @@ function createVideoEditorToolProvider(controller, options = {}) {
4772
4772
  handler: ({ clips, preset, amount }) => {
4773
4773
  gradeTargets(clips);
4774
4774
  const edits = clips.map((clip) => {
4775
- const grade = _chunk3OSXHLITcjs.videoGradeLook.call(void 0, _chunk3OSXHLITcjs.findVideoClip.call(void 0, project(), clip).clip.grade, preset, _nullishCoalesce(amount, () => ( 1)));
4775
+ const grade = _chunkZ64NRDEHcjs.videoGradeLook.call(void 0, _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project(), clip).clip.grade, preset, _nullishCoalesce(amount, () => ( 1)));
4776
4776
  return grade ? { op: "update_clip", clip, set: { grade } } : { op: "update_clip", clip, remove: ["grade"] };
4777
4777
  });
4778
- return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunk3OSXHLITcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _154 => _154.clip, 'access', _155 => _155.grade]), () => ( null)) })) }));
4778
+ return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkZ64NRDEHcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _154 => _154.clip, 'access', _155 => _155.grade]), () => ( null)) })) }));
4779
4779
  }
4780
4780
  };
4781
4781
  const copyGrade = {
@@ -4786,7 +4786,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4786
4786
  annotations: { title: "Copy a colour grade", ...WRITE_IDEMPOTENT },
4787
4787
  handler: ({ from, to }) => {
4788
4788
  gradeTargets([from, ...to]);
4789
- const grade = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project(), from).clip.grade;
4789
+ const grade = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project(), from).clip.grade;
4790
4790
  const edits = to.map((clip) => grade ? { op: "update_clip", clip, set: { grade: { ...grade } } } : { op: "update_clip", clip, remove: ["grade"] });
4791
4791
  return apply(edits, "Copy grade", () => ({ grade: _nullishCoalesce(grade, () => ( null)), clips: to }));
4792
4792
  }
@@ -4812,7 +4812,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4812
4812
  const lut = await controller.luts.load(src);
4813
4813
  const label = _nullishCoalesce(name, () => ( lut.title));
4814
4814
  const setting = { src, ...strength !== void 0 && strength !== 1 ? { strength } : {}, ...label ? { name: label } : {}, ...preserve_skin_tones ? { preserveSkinTones: preserve_skin_tones } : {} };
4815
- return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunk3OSXHLITcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _156 => _156.clip, 'access', _157 => _157.grade]), () => ( null)) })) }));
4815
+ return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkZ64NRDEHcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _156 => _156.clip, 'access', _157 => _157.grade]), () => ( null)) })) }));
4816
4816
  }
4817
4817
  };
4818
4818
  const removeLut = {
@@ -4824,9 +4824,9 @@ function createVideoEditorToolProvider(controller, options = {}) {
4824
4824
  handler: ({ clips }) => {
4825
4825
  gradeTargets(clips);
4826
4826
  const p = project();
4827
- const withLut = clips.filter((id) => _optionalChain([_chunk3OSXHLITcjs.findVideoClip.call(void 0, p, id), 'access', _158 => _158.clip, 'access', _159 => _159.grade, 'optionalAccess', _160 => _160.lut]));
4827
+ const withLut = clips.filter((id) => _optionalChain([_chunkZ64NRDEHcjs.findVideoClip.call(void 0, p, id), 'access', _158 => _158.clip, 'access', _159 => _159.grade, 'optionalAccess', _160 => _160.lut]));
4828
4828
  if (!withLut.length) throw new Error(`None of ${clips.map((c) => `"${c}"`).join(", ")} has a LUT; get_video_project shows each clip's grade.`);
4829
- return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunk3OSXHLITcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _161 => _161.clip, 'access', _162 => _162.grade]), () => ( null)) })) }));
4829
+ return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkZ64NRDEHcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _161 => _161.clip, 'access', _162 => _162.grade]), () => ( null)) })) }));
4830
4830
  }
4831
4831
  };
4832
4832
  const PROXY_SCALE = { type: "number", exclusiveMinimum: 0, exclusiveMaximum: 1, description: "Proxy size as a fraction of the original: 0.5 (half width and height, the default) or 0.25 for very large footage." };
@@ -4935,7 +4935,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4935
4935
  approximate: parsed.approximate,
4936
4936
  first: list[0],
4937
4937
  last: list[list.length - 1],
4938
- ...a.duration !== void 0 && list[list.length - 1].end > a.duration + _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON ? { warning: `The transcript runs to ${list[list.length - 1].end} ms, past the asset's ${a.duration} ms: is it for this asset?` } : {}
4938
+ ...a.duration !== void 0 && list[list.length - 1].end > a.duration + _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON ? { warning: `The transcript runs to ${list[list.length - 1].end} ms, past the asset's ${a.duration} ms: is it for this asset?` } : {}
4939
4939
  }));
4940
4940
  }
4941
4941
  };
@@ -5006,22 +5006,22 @@ function createVideoEditorToolProvider(controller, options = {}) {
5006
5006
  const bad = ranges.findIndex((r) => !(r.to > r.from));
5007
5007
  if (bad >= 0) throw new Error(`Range ${bad + 1} is empty or backwards (${ranges[bad].from}\u2013${ranges[bad].to} ms); "to" must be after "from".`);
5008
5008
  const merged = mergeVideoRanges(ranges);
5009
- const before = _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, project());
5010
- return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before - _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, r.project)), duration: _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, r.project) }));
5009
+ const before = _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, project());
5010
+ return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before - _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, r.project)), duration: _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, r.project) }));
5011
5011
  }
5012
5012
  };
5013
5013
  const rampTarget = (id) => {
5014
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project(), id);
5014
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project(), id);
5015
5015
  if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
5016
5016
  const { clip } = at;
5017
5017
  if (clip.type === "sequence") throw new Error(`Clip "${id}" is a compound clip, which plays its sequence at normal speed; change the speed of the clips inside the sequence instead.`);
5018
- if (clip.type !== "media") throw new Error(`Clip "${id}" is a ${_chunk3OSXHLITcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to change the speed of; use a video or audio clip.`);
5018
+ if (clip.type !== "media") throw new Error(`Clip "${id}" is a ${_chunkZ64NRDEHcjs.videoClipTypeLabel.call(void 0, clip)}, so it has no source to change the speed of; use a video or audio clip.`);
5019
5019
  if (_optionalChain([project, 'call', _167 => _167(), 'access', _168 => _168.assets, 'access', _169 => _169.find, 'call', _170 => _170((a) => a.id === clip.asset), 'optionalAccess', _171 => _171.kind]) === "image") throw new Error(`Clip "${id}" is a still, so it has no motion to change the speed of.`);
5020
5020
  return clip;
5021
5021
  };
5022
5022
  const rampOut = (r, id) => {
5023
5023
  const outcome2 = r.outcomes[r.outcomes.length - 1];
5024
- return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration: _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, r.project) };
5024
+ return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration: _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, r.project) };
5025
5025
  };
5026
5026
  const RIPPLE_RAMP = { type: "boolean", description: "Move later material on every sync-locked track by the change in length (default true); false refuses if the clip would overlap the next one." };
5027
5027
  const setSpeedRamp = {
@@ -5052,8 +5052,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
5052
5052
  ),
5053
5053
  annotations: { title: "Ramp the speed", ...WRITE_IDEMPOTENT },
5054
5054
  handler: ({ clip, segments, ripple }) => {
5055
- const edit = _chunk3OSXHLITcjs.videoSpeedRampEdit.call(void 0, rampTarget(clip), segments, _nullishCoalesce(ripple, () => ( true)));
5056
- return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(_chunk3OSXHLITcjs.videoSpeedRampKeys.call(void 0, segments).source) }));
5055
+ const edit = _chunkZ64NRDEHcjs.videoSpeedRampEdit.call(void 0, rampTarget(clip), segments, _nullishCoalesce(ripple, () => ( true)));
5056
+ return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(_chunkZ64NRDEHcjs.videoSpeedRampKeys.call(void 0, segments).source) }));
5057
5057
  }
5058
5058
  };
5059
5059
  const addFreeze = {
@@ -5073,8 +5073,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
5073
5073
  handler: ({ clip, at, duration, ripple }) => {
5074
5074
  const c = rampTarget(clip);
5075
5075
  const t = at - c.start;
5076
- if (t < 0 || t > c.duration) throw new Error(`${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, at)} is outside clip "${clip}" (${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, c.start)}\u2013${_chunk3OSXHLITcjs.formatVideoSeconds.call(void 0, _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c))}); pick a time inside it.`);
5077
- return apply(_chunk3OSXHLITcjs.videoFreezeFrameEdit.call(void 0, c, t, duration, _nullishCoalesce(ripple, () => ( true))), "Freeze frame", (r) => rampOut(r, clip));
5076
+ if (t < 0 || t > c.duration) throw new Error(`${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, at)} is outside clip "${clip}" (${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, c.start)}\u2013${_chunkZ64NRDEHcjs.formatVideoSeconds.call(void 0, _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c))}); pick a time inside it.`);
5077
+ return apply(_chunkZ64NRDEHcjs.videoFreezeFrameEdit.call(void 0, c, t, duration, _nullishCoalesce(ripple, () => ( true))), "Freeze frame", (r) => rampOut(r, clip));
5078
5078
  }
5079
5079
  };
5080
5080
  const removeRamp = {
@@ -5247,7 +5247,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
5247
5247
  let from;
5248
5248
  let to;
5249
5249
  if (args.clip !== void 0) {
5250
- const found = _chunk3OSXHLITcjs.findVideoClip.call(void 0, p, args.clip);
5250
+ const found = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, p, args.clip);
5251
5251
  if (!found) throw new Error(`There is no clip "${args.clip}"; get_video_project lists the clips.`);
5252
5252
  const c = found.clip;
5253
5253
  if (c.type === "sequence") throw new Error(`Clip "${c.id}" is a compound clip; its sound is the mix of its sequence "${c.sequence}", so read the levels of the media in it (list_video_sequences lists its clips and assets).`);
@@ -5257,7 +5257,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
5257
5257
  toSource = (t) => (_nullishCoalesce(c.in, () => ( 0))) + (t - c.start) * speed;
5258
5258
  toOut = (s) => c.start + (s - (_nullishCoalesce(c.in, () => ( 0)))) / speed;
5259
5259
  from = Math.max(c.start, _nullishCoalesce(args.from, () => ( c.start)));
5260
- to = Math.min(_chunk3OSXHLITcjs.videoClipEnd.call(void 0, c), _nullishCoalesce(args.to, () => ( _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c))));
5260
+ to = Math.min(_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c), _nullishCoalesce(args.to, () => ( _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c))));
5261
5261
  } else {
5262
5262
  asset = p.assets.find((a) => a.id === args.asset);
5263
5263
  if (!asset) throw new Error(`There is no asset "${args.asset}"; the assets are ${p.assets.map((a) => `"${a.id}"`).join(", ") || "none"}.`);
@@ -5338,15 +5338,15 @@ function createVideoEditorToolProvider(controller, options = {}) {
5338
5338
  annotations: { title: "Measure a frame with scopes", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
5339
5339
  handler: async ({ time, bins, columns }) => {
5340
5340
  const p = project();
5341
- const end = _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, p);
5341
+ const end = _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, p);
5342
5342
  const t = _nullishCoalesce(time, () => ( controller.getState().time));
5343
5343
  if (time !== void 0 && time > end) throw new Error(`Time ${time} ms is past the end of the project (${end} ms).`);
5344
5344
  const pixels = await pixelsAt(t);
5345
- return { time: t, timecode: _chunk3OSXHLITcjs.formatVideoTimecode.call(void 0, t, p.fps), width: pixels.width, height: pixels.height, ...summarizeVideoScopes(pixels, { bins, columns }) };
5345
+ return { time: t, timecode: _chunkZ64NRDEHcjs.formatVideoTimecode.call(void 0, t, p.fps), width: pixels.width, height: pixels.height, ...summarizeVideoScopes(pixels, { bins, columns }) };
5346
5346
  }
5347
5347
  };
5348
5348
  const MASK_FIELDS = {
5349
- shape: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_MASK_SHAPES], description: "rectangle (with corner_radius), ellipse, linear (a straight split: the side above the line at rotation 0 shows) or polygon (points)." },
5349
+ shape: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_MASK_SHAPES], description: "rectangle (with corner_radius), ellipse, linear (a straight split: the side above the line at rotation 0 shows) or polygon (points)." },
5350
5350
  x: { type: "number", description: "Centre across the clip's picture, 0 (left edge) to 1 (right edge); default 0.5." },
5351
5351
  y: { type: "number", description: "Centre down the clip's picture, 0 (top) to 1 (bottom); default 0.5." },
5352
5352
  width: { type: "number", minimum: 0, description: "Width as a fraction of the picture's width (default 0.5). Unused by linear." },
@@ -5366,10 +5366,10 @@ function createVideoEditorToolProvider(controller, options = {}) {
5366
5366
  track: { ...TRACK_ID, description: 'A video track to put it on; tracks below it are "underneath".' },
5367
5367
  start: MS("Where it starts on the timeline (default: the end of the track)"),
5368
5368
  duration: { type: "number", exclusiveMinimum: 0, description: "How long it lasts, in ms (default 3000)." },
5369
- scope: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_ADJUSTMENT_SCOPES], description: "Which pictures it changes: underneath (default), all or track." },
5369
+ scope: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_ADJUSTMENT_SCOPES], description: "Which pictures it changes: underneath (default), all or track." },
5370
5370
  target_track: { ...TRACK_ID, description: 'For scope "track" (required then): the track whose pictures it changes.' },
5371
5371
  grade: GRADE,
5372
- preset: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_GRADE_PRESET_NAMES], description: "A named look to start from (grade settings given override it)." },
5372
+ preset: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_GRADE_PRESET_NAMES], description: "A named look to start from (grade settings given override it)." },
5373
5373
  amount: { type: "number", minimum: 0, maximum: 1, description: "Strength of the preset, 0\u20131 (default 1)." },
5374
5374
  name: { type: "string", minLength: 1, description: 'A label for the clip (e.g. "Night look").' },
5375
5375
  id: { type: "string", minLength: 1, description: 'Your own id for the clip (default: a fresh one such as "c7").' },
@@ -5383,13 +5383,13 @@ function createVideoEditorToolProvider(controller, options = {}) {
5383
5383
  if (t && t.kind !== "video") throw new Error(`Track "${track}" is an audio track; adjustment clips change pictures, so put it on a video track.`);
5384
5384
  if (scope === "track" && !target_track) throw new Error('Scope "track" needs target_track: the id of the track whose pictures it changes.');
5385
5385
  if (target_track !== void 0 && scope !== "track") throw new Error('target_track is only for scope "track"; leave it out or set scope to "track".');
5386
- const look = { ...preset ? _chunk3OSXHLITcjs.videoGradePreset.call(void 0, preset, _nullishCoalesce(amount, () => ( 1))) : {}, ..._nullishCoalesce(grade, () => ( {})) };
5386
+ const look = { ...preset ? _chunkZ64NRDEHcjs.videoGradePreset.call(void 0, preset, _nullishCoalesce(amount, () => ( 1))) : {}, ..._nullishCoalesce(grade, () => ( {})) };
5387
5387
  const clip = { type: "adjustment", ...id ? { id } : {}, ...name ? { name } : {}, ...start !== void 0 ? { start } : {}, duration: _nullishCoalesce(duration, () => ( 3e3)), ...scope ? { scope } : {}, ...target_track ? { targetTrack: target_track } : {}, ...Object.keys(look).length ? { grade: look } : {} };
5388
5388
  return apply({ op: "add_clip", track, clip, mode }, "Add adjustment clip", (r) => ({ clip: clipOut(r.project, r.outcomes[0].clip), ...placed(r.outcomes[0]), ...Object.keys(look).length ? {} : { hint: "It changes nothing yet: give it a grade (update_video_clip), effects (apply_effect) or a mask." } }));
5389
5389
  }
5390
5390
  };
5391
5391
  const maskTarget = (id) => {
5392
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project(), id);
5392
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project(), id);
5393
5393
  if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
5394
5394
  if (at.track.kind !== "video") throw new Error(`Clip "${id}" is on audio track "${at.track.id}"; masks cut pictures, so pass a clip on a video track.`);
5395
5395
  return at;
@@ -5431,13 +5431,13 @@ function createVideoEditorToolProvider(controller, options = {}) {
5431
5431
  gradeTargets(clips);
5432
5432
  const edits = [];
5433
5433
  for (const id of clips) {
5434
- const clip = _chunk3OSXHLITcjs.findVideoClip.call(void 0, project(), id).clip;
5434
+ const clip = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, project(), id).clip;
5435
5435
  const lut = _optionalChain([clip, 'access', _172 => _172.grade, 'optionalAccess', _173 => _173.lut]);
5436
5436
  if (!lut) throw new Error(`Clip "${id}" has no LUT to protect skin from; add one with set_video_lut first.`);
5437
5437
  const { preserveSkinTones: _p, ...rest } = lut;
5438
5438
  edits.push({ op: "update_clip", clip: id, set: { grade: { ...clip.grade, lut: amount > 0 ? { ...rest, preserveSkinTones: amount } : rest } } });
5439
5439
  }
5440
- return apply(edits, amount > 0 ? "Protect skin tones" : "Stop protecting skin tones", (r) => ({ clips: clips.map((id) => ({ id, lut: _nullishCoalesce(_optionalChain([_chunk3OSXHLITcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _174 => _174.clip, 'access', _175 => _175.grade, 'optionalAccess', _176 => _176.lut]), () => ( null)) })) }));
5440
+ return apply(edits, amount > 0 ? "Protect skin tones" : "Stop protecting skin tones", (r) => ({ clips: clips.map((id) => ({ id, lut: _nullishCoalesce(_optionalChain([_chunkZ64NRDEHcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _174 => _174.clip, 'access', _175 => _175.grade, 'optionalAccess', _176 => _176.lut]), () => ( null)) })) }));
5441
5441
  }
5442
5442
  };
5443
5443
  const planOut = (plan) => ({
@@ -5490,7 +5490,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
5490
5490
  handler: ({ plan }) => {
5491
5491
  const r = controller.applyPlan(plan);
5492
5492
  if (!r.ok) throw new Error(r.error);
5493
- return { plan: r.plan.id, title: r.plan.title, stale: r.stale, outcomes: r.outcomes, duration: _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, r.project), issues: issueSummary(r.issues) };
5493
+ return { plan: r.plan.id, title: r.plan.title, stale: r.stale, outcomes: r.outcomes, duration: _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, r.project), issues: issueSummary(r.issues) };
5494
5494
  }
5495
5495
  };
5496
5496
  const discardPlan = {
@@ -5544,7 +5544,7 @@ var KEYS2 = {
5544
5544
  properties: {
5545
5545
  t: { type: "number", description: "Clip-relative time in ms (0 = the clip's start)." },
5546
5546
  v: { type: "number", description: "The control's value at t, within its range from describe_effect." },
5547
- ease: { anyOf: [{ type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_EASE_NAMES] }, { type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }], description: "How the value moves to the next key: linear (default), hold, ease-in, ease-out, ease-in-out, or CSS cubic-bezier [x1, y1, x2, y2]." }
5547
+ ease: { anyOf: [{ type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_EASE_NAMES] }, { type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }], description: "How the value moves to the next key: linear (default), hold, ease-in, ease-out, ease-in-out, or CSS cubic-bezier [x1, y1, x2, y2]." }
5548
5548
  },
5549
5549
  required: ["t", "v"],
5550
5550
  additionalProperties: false
@@ -5558,7 +5558,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
5558
5558
  return controller.readOnlyReason();
5559
5559
  };
5560
5560
  const clipOf = (id) => {
5561
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, controller.getProject(), id);
5561
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, controller.getProject(), id);
5562
5562
  if (!at) {
5563
5563
  const ids = controller.getProject().tracks.flatMap((t) => t.clips.map((c) => c.id));
5564
5564
  throw new Error(`There is no clip "${id}"; the clips are ${ids.map((c) => `"${c}"`).join(", ") || "none"} (get_video_project lists them).`);
@@ -5571,7 +5571,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
5571
5571
  const effect = _nullishCoalesce(effects.find((e) => e.id === (_nullishCoalesce(instance, () => ( _optionalChain([r, 'access', _179 => _179.effect, 'optionalAccess', _180 => _180.id]))))), () => ( (r.effect ? { id: r.effect.id, effect: r.effect.effect, role: "clip effect", enabled: r.effect.enabled !== false, values: _nullishCoalesce(r.effect.values, () => ( {})) } : effects[0])));
5572
5572
  return { target, effect, effects, ...extra };
5573
5573
  };
5574
- return withVideoPlayback(_chunkRUZQMYXHcjs.createEffectToolProvider.call(void 0, {
5574
+ return withVideoPlayback(_chunkA3A5TI6Rcjs.createEffectToolProvider.call(void 0, {
5575
5575
  id: _nullishCoalesce(options.id, () => ( "video-effects")),
5576
5576
  namespace: options.namespace,
5577
5577
  title: "Video effects",
@@ -5629,7 +5629,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
5629
5629
  duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default: the effect's own length, else 5000)." },
5630
5630
  values: ctx.valuesSchema("Control values over the effect's defaults", true),
5631
5631
  name: { type: "string", minLength: 1, description: "A label for the clip (default: the effect's name)." },
5632
- mode: { type: "string", enum: [..._chunk3OSXHLITcjs.VIDEO_PLACEMENT_MODES], description: "What to do with clips already there: refuse (default), overwrite or insert." }
5632
+ mode: { type: "string", enum: [..._chunkZ64NRDEHcjs.VIDEO_PLACEMENT_MODES], description: "What to do with clips already there: refuse (default), overwrite or insert." }
5633
5633
  },
5634
5634
  required: ["track", "effect"],
5635
5635
  additionalProperties: false
@@ -5689,7 +5689,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
5689
5689
  const clip = clipOf(args.clip);
5690
5690
  if (clip.type !== "effect") throw new Error(`Clip "${args.clip}" is not an effect clip; give the id of one of its effects (list_applied_effects).`);
5691
5691
  const was = _optionalChain([clip, 'access', _181 => _181.values, 'optionalAccess', _182 => _182[args.control]]);
5692
- const plain = keys === null ? _chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _183 => _183.keys, 'access', _184 => _184[0], 'optionalAccess', _185 => _185.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
5692
+ const plain = keys === null ? _chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _183 => _183.keys, 'access', _184 => _184[0], 'optionalAccess', _185 => _185.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
5693
5693
  if (plain === void 0) throw new Error(`"${args.control}" has no value to keep; give keys instead.`);
5694
5694
  r = await controller.updateEffectValues(args.clip, "generator", { [args.control]: plain });
5695
5695
  } else r = await controller.setClipEffectKeyframes(args.clip, args.effect, args.control, keys);
@@ -5767,7 +5767,7 @@ function createVideoDialogueToolProvider(controller, options = {}) {
5767
5767
  const r = controller.proposePlan({ title, description: "Cuts fillers, long pauses and stutters found in the transcript, closing up every sync-locked track.", edits: videoRemoveRangesEdits(cuts), ranges: cuts.map((d) => ({ from: d.from, to: d.to, text: d.text, reason: d.kind })), source: "plan_video_dialogue_cleanup" });
5768
5768
  if (!r.ok) throw new Error(r.error);
5769
5769
  const p = r.plan;
5770
- return { plan: { id: p.id, title: p.title, summary: p.summary, text: describeVideoEditPlan(p), cuts: cuts.length }, durationNow: _chunk3OSXHLITcjs.videoProjectDuration.call(void 0, controller.getProject()), hint: `Nothing changed yet. Show the user the plan, then call apply_video_edit_plan with plan "${p.id}" (or discard_video_edit_plan).` };
5770
+ return { plan: { id: p.id, title: p.title, summary: p.summary, text: describeVideoEditPlan(p), cuts: cuts.length }, durationNow: _chunkZ64NRDEHcjs.videoProjectDuration.call(void 0, controller.getProject()), hint: `Nothing changed yet. Show the user the plan, then call apply_video_edit_plan with plan "${p.id}" (or discard_video_edit_plan).` };
5771
5771
  }
5772
5772
  };
5773
5773
  return withVideoPlayback(
@@ -5814,7 +5814,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
5814
5814
  };
5815
5815
  const project = () => controller.getProject();
5816
5816
  const soundClip = (p, id) => {
5817
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, p, id);
5817
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, p, id);
5818
5818
  if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
5819
5819
  const c = at.clip;
5820
5820
  if (c.type !== "media") throw new Error(`Clip "${id}" is a ${c.type} clip and has no sound of its own; pass a video or audio clip.`);
@@ -5830,8 +5830,8 @@ function createVideoMusicToolProvider(controller, options = {}) {
5830
5830
  const { clip, asset: asset2 } = soundClip(p, args.clip);
5831
5831
  const speed = _nullishCoalesce(clip.speed, () => ( 1));
5832
5832
  const from2 = Math.max(clip.start, _nullishCoalesce(args.from, () => ( clip.start)));
5833
- const to2 = Math.min(_chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip), _nullishCoalesce(args.to, () => ( _chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip))));
5834
- if (!(to2 > from2)) throw new Error(`The stretch is empty (${from2}\u2013${to2} ms); "from" and "to" must be inside the clip (${clip.start}\u2013${_chunk3OSXHLITcjs.videoClipEnd.call(void 0, clip)} ms) with "to" after "from".`);
5833
+ const to2 = Math.min(_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip), _nullishCoalesce(args.to, () => ( _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip))));
5834
+ if (!(to2 > from2)) throw new Error(`The stretch is empty (${from2}\u2013${to2} ms); "from" and "to" must be inside the clip (${clip.start}\u2013${_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, clip)} ms) with "to" after "from".`);
5835
5835
  return { asset: asset2, from: (_nullishCoalesce(clip.in, () => ( 0))) + (from2 - clip.start) * speed, to: (_nullishCoalesce(clip.in, () => ( 0))) + (to2 - clip.start) * speed, out: (s) => clip.start + (s - (_nullishCoalesce(clip.in, () => ( 0)))) / speed };
5836
5836
  }
5837
5837
  const asset = p.assets.find((a) => a.id === args.asset);
@@ -5873,7 +5873,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
5873
5873
  handler: async ({ clips, target, ceiling, replace }) => {
5874
5874
  const p = project();
5875
5875
  const targets = clips.map((id) => soundClip(p, id));
5876
- for (const t of targets) if (_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, t.clip.volume) && !replace) throw new Error(`Clip "${t.clip.id}" has volume keyframes, which a constant gain would replace; pass replace: true, or remove them first.`);
5876
+ for (const t of targets) if (_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, t.clip.volume) && !replace) throw new Error(`Clip "${t.clip.id}" has volume keyframes, which a constant gain would replace; pass replace: true, or remove them first.`);
5877
5877
  const results = [];
5878
5878
  const edits = [];
5879
5879
  for (const { clip, asset } of targets) {
@@ -5918,7 +5918,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
5918
5918
  handler: async (args) => {
5919
5919
  const p = project();
5920
5920
  const music = args.music.map((id) => soundClip(p, id));
5921
- for (const m of music) if (_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, m.clip.volume) && !args.replace) throw new Error(`Music clip "${m.clip.id}" already has volume keyframes; pass replace: true to replace them, or remove them first.`);
5921
+ for (const m of music) if (_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, m.clip.volume) && !args.replace) throw new Error(`Music clip "${m.clip.id}" already has volume keyframes; pass replace: true to replace them, or remove them first.`);
5922
5922
  const transcriptTrack = videoTranscriptTrack(p, args.dialogue_track);
5923
5923
  const mode = _nullishCoalesce(args.speech, () => ( (transcriptTrack && videoTimelineTranscript(p, { track: transcriptTrack }).length ? "transcript" : "audio")));
5924
5924
  let ranges = [];
@@ -5931,7 +5931,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
5931
5931
  const track = p.tracks.find((t) => t.id === args.dialogue_track);
5932
5932
  if (!track) throw new Error(`There is no track "${args.dialogue_track}".`);
5933
5933
  const musicIds = new Set(music.map((m) => m.clip.id));
5934
- for (const c of _chunk3OSXHLITcjs.sortedVideoClips.call(void 0, track)) {
5934
+ for (const c of _chunkZ64NRDEHcjs.sortedVideoClips.call(void 0, track)) {
5935
5935
  if (c.type !== "media" || musicIds.has(c.id)) continue;
5936
5936
  const asset = p.assets.find((a) => a.id === c.asset);
5937
5937
  if (!asset || asset.kind === "image" || asset.hasAudio === false) continue;
@@ -5942,10 +5942,10 @@ function createVideoMusicToolProvider(controller, options = {}) {
5942
5942
  let at = c.start;
5943
5943
  for (const s of silences) {
5944
5944
  const a = c.start + (s.start - src0) / speed;
5945
- if (a - at > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) ranges.push({ from: at, to: a });
5945
+ if (a - at > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) ranges.push({ from: at, to: a });
5946
5946
  at = c.start + (s.end - src0) / speed;
5947
5947
  }
5948
- if (_chunk3OSXHLITcjs.videoClipEnd.call(void 0, c) - at > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) ranges.push({ from: at, to: _chunk3OSXHLITcjs.videoClipEnd.call(void 0, c) });
5948
+ if (_chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c) - at > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) ranges.push({ from: at, to: _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, c) });
5949
5949
  }
5950
5950
  if (!ranges.length) throw new Error(`Track "${args.dialogue_track}" has no sound above -40 dBFS, so there is no speech to duck under.`);
5951
5951
  }
@@ -6008,7 +6008,7 @@ function createVideoMusicToolProvider(controller, options = {}) {
6008
6008
  if (!beats.length) throw new Error(`No beats were found in "${args.music}"; try a lower sensitivity, or pass beats.`);
6009
6009
  } else beats = [...args.beats].sort((a, b) => a - b);
6010
6010
  const tolerance = _nullishCoalesce(args.tolerance, () => ( 150));
6011
- const clips = _chunk3OSXHLITcjs.sortedVideoClips.call(void 0, track);
6011
+ const clips = _chunkZ64NRDEHcjs.sortedVideoClips.call(void 0, track);
6012
6012
  const edits = [];
6013
6013
  const ranges = [];
6014
6014
  const skipped = [];
@@ -6016,8 +6016,8 @@ function createVideoMusicToolProvider(controller, options = {}) {
6016
6016
  for (let i = 0; i + 1 < clips.length; i++) {
6017
6017
  const left = clips[i];
6018
6018
  const right = clips[i + 1];
6019
- const cut = _chunk3OSXHLITcjs.videoClipEnd.call(void 0, left);
6020
- if (Math.abs(right.start - cut) > _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON) continue;
6019
+ const cut = _chunkZ64NRDEHcjs.videoClipEnd.call(void 0, left);
6020
+ if (Math.abs(right.start - cut) > _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON) continue;
6021
6021
  const beat = nearestVideoBeat(beats, cut, tolerance);
6022
6022
  if (beat === null) {
6023
6023
  skipped.push({ cut: round4(cut), reason: `no beat within ${tolerance} ms` });
@@ -6092,7 +6092,7 @@ function videoClipEffectDocument(clip, instance, providerId) {
6092
6092
  const values = {};
6093
6093
  const tracks = {};
6094
6094
  for (const [control, v] of Object.entries(_nullishCoalesce(effect.values, () => ( {})))) {
6095
- if (_chunk3OSXHLITcjs.isVideoKeyframes.call(void 0, v)) {
6095
+ if (_chunkZ64NRDEHcjs.isVideoKeyframes.call(void 0, v)) {
6096
6096
  values[control] = v.keys[0].v;
6097
6097
  tracks[control] = v.keys.map((k) => ({ time: k.t, value: k.v, ...k.ease && k.ease !== "linear" ? { easing: videoEaseToAnimationEasing(k.ease) } : {} }));
6098
6098
  } else values[control] = v;
@@ -6133,10 +6133,10 @@ function videoEffectValuesFromDocument(doc) {
6133
6133
  async function openVideoClipEffectAuthoring(controller, clip, instance, options = {}) {
6134
6134
  const provider = controller.effectsProvider;
6135
6135
  if (!provider) throw new Error("No effects provider is registered, so the effect cannot be opened for authoring; register one with setEffectsProvider.");
6136
- const at = _chunk3OSXHLITcjs.findVideoClip.call(void 0, controller.getProject(), clip);
6136
+ const at = _chunkZ64NRDEHcjs.findVideoClip.call(void 0, controller.getProject(), clip);
6137
6137
  if (!at) throw new Error(`There is no clip "${clip}".`);
6138
6138
  const doc = videoClipEffectDocument(at.clip, instance, provider.id);
6139
- const session = await _chunkCYKWYP6Dcjs.createEffectAuthoringSession.call(void 0, { document: doc }, { ...options, provider });
6139
+ const session = await _chunk6DUEV36Fcjs.createEffectAuthoringSession.call(void 0, { document: doc }, { ...options, provider });
6140
6140
  return {
6141
6141
  clip,
6142
6142
  instance,
@@ -6477,4 +6477,4 @@ function createVideoEditorDocument(controller) {
6477
6477
 
6478
6478
 
6479
6479
 
6480
- exports.TranscriptVideoController = TranscriptVideoController; exports.VIDEO_ADJUSTMENT_SCOPES = _chunk3OSXHLITcjs.VIDEO_ADJUSTMENT_SCOPES; exports.VIDEO_ADJUSTMENT_SCOPE_LABELS = VIDEO_ADJUSTMENT_SCOPE_LABELS; exports.VIDEO_BLEND_MODES = _chunk3OSXHLITcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunk3OSXHLITcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunk3OSXHLITcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunk3OSXHLITcjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_DISFLUENCY_KINDS = VIDEO_DISFLUENCY_KINDS; exports.VIDEO_EASE_NAMES = _chunk3OSXHLITcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunk3OSXHLITcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunk3OSXHLITcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunk3OSXHLITcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunk3OSXHLITcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunk3OSXHLITcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunk3OSXHLITcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunk3OSXHLITcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunk3OSXHLITcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LOUDNESS_HOP = VIDEO_LOUDNESS_HOP; exports.VIDEO_LUT_MAX_SIZE = _chunk3OSXHLITcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_MASK_DEFAULTS = _chunk3OSXHLITcjs.VIDEO_MASK_DEFAULTS; exports.VIDEO_MASK_SHAPES = _chunk3OSXHLITcjs.VIDEO_MASK_SHAPES; exports.VIDEO_MASK_SHAPE_LABELS = VIDEO_MASK_SHAPE_LABELS; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunk3OSXHLITcjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunk3OSXHLITcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunk3OSXHLITcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunk3OSXHLITcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunk3OSXHLITcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunk3OSXHLITcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunk3OSXHLITcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunk3OSXHLITcjs.allVideoClipIds; exports.allVideoTracks = _chunk3OSXHLITcjs.allVideoTracks; exports.animationEasingToVideoEase = animationEasingToVideoEase; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunk3OSXHLITcjs.applyVideoGrade; exports.applyVideoLut = _chunk3OSXHLITcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunk3OSXHLITcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunk3OSXHLITcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunk3OSXHLITcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunk3OSXHLITcjs.checkVideoTimeRemap; exports.createVideoDialogueToolProvider = createVideoDialogueToolProvider; exports.createVideoEditorDocument = createVideoEditorDocument; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoMusicToolProvider = createVideoMusicToolProvider; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoEditPlan = describeVideoEditPlan; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.detectVideoDisfluencies = detectVideoDisfluencies; exports.diffVideoProjects = diffVideoProjects; exports.drawVideoFrame = _chunk3OSXHLITcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunk3OSXHLITcjs.ffmpegFilterValue; exports.findVideoAudioBeats = findVideoAudioBeats; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunk3OSXHLITcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunk3OSXHLITcjs.findVideoGaps; exports.findVideoRepetitions = findVideoRepetitions; exports.findVideoSequenceClip = _chunk3OSXHLITcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunk3OSXHLITcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunk3OSXHLITcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunk3OSXHLITcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunk3OSXHLITcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunk3OSXHLITcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunk3OSXHLITcjs.isVideoKeyframes; exports.measureVideoLoudness = measureVideoLoudness; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunk3OSXHLITcjs.mixEffectPixels; exports.nearestVideoBeat = nearestVideoBeat; exports.nextFreeVideoSlot = _chunk3OSXHLITcjs.nextFreeVideoSlot; exports.normalizeVideoClipMask = _chunk3OSXHLITcjs.normalizeVideoClipMask; exports.normalizeVideoGrade = _chunk3OSXHLITcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunk3OSXHLITcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.openVideoClipEffectAuthoring = openVideoClipEffectAuthoring; exports.overEffectPixels = _chunk3OSXHLITcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoClipMask = parseVideoClipMask; exports.parseVideoCubeLut = _chunk3OSXHLITcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunk3OSXHLITcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRef = parseVideoTimeRef; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunk3OSXHLITcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoEdits = planVideoEdits; exports.planVideoPrefetch = planVideoPrefetch; exports.planVideoToolPlayback = planVideoToolPlayback; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunk3OSXHLITcjs.removeVideoKey; exports.renderVideoFrameExact = _chunk3OSXHLITcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunk3OSXHLITcjs.retimeVideoAnimatable; exports.setVideoKey = _chunk3OSXHLITcjs.setVideoKey; exports.snapToVideoFrame = _chunk3OSXHLITcjs.snapToVideoFrame; exports.snapVideoTime = _chunk3OSXHLITcjs.snapVideoTime; exports.sortVideoKeys = _chunk3OSXHLITcjs.sortVideoKeys; exports.sortedVideoClips = _chunk3OSXHLITcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunk3OSXHLITcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunk3OSXHLITcjs.toVideoEdl; exports.toVideoFfmpeg = _chunk3OSXHLITcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunk3OSXHLITcjs.toVideoLoudnessMeasure; exports.videoAddAdjustmentEdits = videoAddAdjustmentEdits; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunk3OSXHLITcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunk3OSXHLITcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioLoudness = videoAudioLoudness; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoAuthorableEffects = videoAuthorableEffects; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunk3OSXHLITcjs.videoClipAfter; exports.videoClipAnimated = _chunk3OSXHLITcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunk3OSXHLITcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunk3OSXHLITcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunk3OSXHLITcjs.videoClipBefore; exports.videoClipEffectDocument = videoClipEffectDocument; exports.videoClipEffectUses = _chunk3OSXHLITcjs.videoClipEffectUses; exports.videoClipEnd = _chunk3OSXHLITcjs.videoClipEnd; exports.videoClipHandles = _chunk3OSXHLITcjs.videoClipHandles; exports.videoClipHeading = videoClipHeading; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunk3OSXHLITcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunk3OSXHLITcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunk3OSXHLITcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunk3OSXHLITcjs.videoClipSourceTime; exports.videoClipSpeed = _chunk3OSXHLITcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunk3OSXHLITcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipTypeLabel = _chunk3OSXHLITcjs.videoClipTypeLabel; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunk3OSXHLITcjs.videoClipsAt; exports.videoContactSheetSvg = _chunk3OSXHLITcjs.videoContactSheetSvg; exports.videoCutsWithMargin = videoCutsWithMargin; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoDuckingKeys = videoDuckingKeys; exports.videoEaseBezier = _chunk3OSXHLITcjs.videoEaseBezier; exports.videoEaseProgress = _chunk3OSXHLITcjs.videoEaseProgress; exports.videoEaseToAnimationEasing = videoEaseToAnimationEasing; exports.videoEffectFrameTime = _chunk3OSXHLITcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunk3OSXHLITcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunk3OSXHLITcjs.videoEffectValuesAt; exports.videoEffectValuesFromDocument = videoEffectValuesFromDocument; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunk3OSXHLITcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunk3OSXHLITcjs.videoFfmpegUnsupportedEffects; exports.videoFfmpegUnsupportedFeatures = _chunk3OSXHLITcjs.videoFfmpegUnsupportedFeatures; exports.videoFrameAt = _chunk3OSXHLITcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunk3OSXHLITcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunk3OSXHLITcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunk3OSXHLITcjs.videoFrameToSvg; exports.videoFrames = _chunk3OSXHLITcjs.videoFrames; exports.videoFreezeFrameEdit = _chunk3OSXHLITcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunk3OSXHLITcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunk3OSXHLITcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunk3OSXHLITcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunk3OSXHLITcjs.videoGradeLook; exports.videoGradePreset = _chunk3OSXHLITcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunk3OSXHLITcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunk3OSXHLITcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunk3OSXHLITcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunk3OSXHLITcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunk3OSXHLITcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunk3OSXHLITcjs.videoHourFrames; exports.videoIrisRadius = _chunk3OSXHLITcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunk3OSXHLITcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunk3OSXHLITcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunk3OSXHLITcjs.videoKeysOf; exports.videoLayerMask = _chunk3OSXHLITcjs.videoLayerMask; exports.videoLayersUseEffects = _chunk3OSXHLITcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunk3OSXHLITcjs.videoLayersWithoutTransitionEffects; exports.videoLoudnessEnergy = videoLoudnessEnergy; exports.videoLoudnessGain = videoLoudnessGain; exports.videoLoudnessOf = videoLoudnessOf; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunk3OSXHLITcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunk3OSXHLITcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunk3OSXHLITcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunk3OSXHLITcjs.videoLutToCube; exports.videoMaskContains = _chunk3OSXHLITcjs.videoMaskContains; exports.videoMaskEdit = videoMaskEdit; exports.videoMaskPolygon = _chunk3OSXHLITcjs.videoMaskPolygon; exports.videoMaskSvgPath = _chunk3OSXHLITcjs.videoMaskSvgPath; exports.videoOverlap = _chunk3OSXHLITcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunk3OSXHLITcjs.videoProjectDuration; exports.videoProjectEffects = _chunk3OSXHLITcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunk3OSXHLITcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunk3OSXHLITcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunk3OSXHLITcjs.videoSequenceDuration; exports.videoSequenceMap = _chunk3OSXHLITcjs.videoSequenceMap; exports.videoShellQuote = _chunk3OSXHLITcjs.videoShellQuote; exports.videoSkinProtectionEdits = videoSkinProtectionEdits; exports.videoSkinToneWeight = _chunk3OSXHLITcjs.videoSkinToneWeight; exports.videoSlowMotionRamp = _chunk3OSXHLITcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunk3OSXHLITcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeechRanges = videoSpeechRanges; exports.videoSpeedRampEdit = _chunk3OSXHLITcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunk3OSXHLITcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunk3OSXHLITcjs.videoTextStyle; exports.videoTimeRef = videoTimeRef; exports.videoTimeRemapBreakpoints = _chunk3OSXHLITcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunk3OSXHLITcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunk3OSXHLITcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunk3OSXHLITcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunk3OSXHLITcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunk3OSXHLITcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunk3OSXHLITcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunk3OSXHLITcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunk3OSXHLITcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunk3OSXHLITcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange; exports.withVideoPlayback = withVideoPlayback;
6480
+ exports.TranscriptVideoController = TranscriptVideoController; exports.VIDEO_ADJUSTMENT_SCOPES = _chunkZ64NRDEHcjs.VIDEO_ADJUSTMENT_SCOPES; exports.VIDEO_ADJUSTMENT_SCOPE_LABELS = VIDEO_ADJUSTMENT_SCOPE_LABELS; exports.VIDEO_BLEND_MODES = _chunkZ64NRDEHcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkZ64NRDEHcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkZ64NRDEHcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkZ64NRDEHcjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_DISFLUENCY_KINDS = VIDEO_DISFLUENCY_KINDS; exports.VIDEO_EASE_NAMES = _chunkZ64NRDEHcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkZ64NRDEHcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkZ64NRDEHcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkZ64NRDEHcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkZ64NRDEHcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkZ64NRDEHcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkZ64NRDEHcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkZ64NRDEHcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkZ64NRDEHcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LOUDNESS_HOP = VIDEO_LOUDNESS_HOP; exports.VIDEO_LUT_MAX_SIZE = _chunkZ64NRDEHcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_MASK_DEFAULTS = _chunkZ64NRDEHcjs.VIDEO_MASK_DEFAULTS; exports.VIDEO_MASK_SHAPES = _chunkZ64NRDEHcjs.VIDEO_MASK_SHAPES; exports.VIDEO_MASK_SHAPE_LABELS = VIDEO_MASK_SHAPE_LABELS; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkZ64NRDEHcjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunkZ64NRDEHcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkZ64NRDEHcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkZ64NRDEHcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkZ64NRDEHcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkZ64NRDEHcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkZ64NRDEHcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkZ64NRDEHcjs.allVideoClipIds; exports.allVideoTracks = _chunkZ64NRDEHcjs.allVideoTracks; exports.animationEasingToVideoEase = animationEasingToVideoEase; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkZ64NRDEHcjs.applyVideoGrade; exports.applyVideoLut = _chunkZ64NRDEHcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkZ64NRDEHcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkZ64NRDEHcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkZ64NRDEHcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkZ64NRDEHcjs.checkVideoTimeRemap; exports.createVideoDialogueToolProvider = createVideoDialogueToolProvider; exports.createVideoEditorDocument = createVideoEditorDocument; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoMusicToolProvider = createVideoMusicToolProvider; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoEditPlan = describeVideoEditPlan; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.detectVideoDisfluencies = detectVideoDisfluencies; exports.diffVideoProjects = diffVideoProjects; exports.drawVideoFrame = _chunkZ64NRDEHcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkZ64NRDEHcjs.ffmpegFilterValue; exports.findVideoAudioBeats = findVideoAudioBeats; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkZ64NRDEHcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkZ64NRDEHcjs.findVideoGaps; exports.findVideoRepetitions = findVideoRepetitions; exports.findVideoSequenceClip = _chunkZ64NRDEHcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkZ64NRDEHcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkZ64NRDEHcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkZ64NRDEHcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkZ64NRDEHcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkZ64NRDEHcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkZ64NRDEHcjs.isVideoKeyframes; exports.measureVideoLoudness = measureVideoLoudness; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkZ64NRDEHcjs.mixEffectPixels; exports.nearestVideoBeat = nearestVideoBeat; exports.nextFreeVideoSlot = _chunkZ64NRDEHcjs.nextFreeVideoSlot; exports.normalizeVideoClipMask = _chunkZ64NRDEHcjs.normalizeVideoClipMask; exports.normalizeVideoGrade = _chunkZ64NRDEHcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkZ64NRDEHcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.openVideoClipEffectAuthoring = openVideoClipEffectAuthoring; exports.overEffectPixels = _chunkZ64NRDEHcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoClipMask = parseVideoClipMask; exports.parseVideoCubeLut = _chunkZ64NRDEHcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkZ64NRDEHcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRef = parseVideoTimeRef; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkZ64NRDEHcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoEdits = planVideoEdits; exports.planVideoPrefetch = planVideoPrefetch; exports.planVideoToolPlayback = planVideoToolPlayback; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkZ64NRDEHcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkZ64NRDEHcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkZ64NRDEHcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkZ64NRDEHcjs.setVideoKey; exports.snapToVideoFrame = _chunkZ64NRDEHcjs.snapToVideoFrame; exports.snapVideoTime = _chunkZ64NRDEHcjs.snapVideoTime; exports.sortVideoKeys = _chunkZ64NRDEHcjs.sortVideoKeys; exports.sortedVideoClips = _chunkZ64NRDEHcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkZ64NRDEHcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkZ64NRDEHcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkZ64NRDEHcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkZ64NRDEHcjs.toVideoLoudnessMeasure; exports.videoAddAdjustmentEdits = videoAddAdjustmentEdits; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkZ64NRDEHcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkZ64NRDEHcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioLoudness = videoAudioLoudness; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoAuthorableEffects = videoAuthorableEffects; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkZ64NRDEHcjs.videoClipAfter; exports.videoClipAnimated = _chunkZ64NRDEHcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkZ64NRDEHcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkZ64NRDEHcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkZ64NRDEHcjs.videoClipBefore; exports.videoClipEffectDocument = videoClipEffectDocument; exports.videoClipEffectUses = _chunkZ64NRDEHcjs.videoClipEffectUses; exports.videoClipEnd = _chunkZ64NRDEHcjs.videoClipEnd; exports.videoClipHandles = _chunkZ64NRDEHcjs.videoClipHandles; exports.videoClipHeading = videoClipHeading; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkZ64NRDEHcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkZ64NRDEHcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkZ64NRDEHcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkZ64NRDEHcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkZ64NRDEHcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkZ64NRDEHcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipTypeLabel = _chunkZ64NRDEHcjs.videoClipTypeLabel; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkZ64NRDEHcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkZ64NRDEHcjs.videoContactSheetSvg; exports.videoCutsWithMargin = videoCutsWithMargin; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoDuckingKeys = videoDuckingKeys; exports.videoEaseBezier = _chunkZ64NRDEHcjs.videoEaseBezier; exports.videoEaseProgress = _chunkZ64NRDEHcjs.videoEaseProgress; exports.videoEaseToAnimationEasing = videoEaseToAnimationEasing; exports.videoEffectFrameTime = _chunkZ64NRDEHcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkZ64NRDEHcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkZ64NRDEHcjs.videoEffectValuesAt; exports.videoEffectValuesFromDocument = videoEffectValuesFromDocument; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkZ64NRDEHcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkZ64NRDEHcjs.videoFfmpegUnsupportedEffects; exports.videoFfmpegUnsupportedFeatures = _chunkZ64NRDEHcjs.videoFfmpegUnsupportedFeatures; exports.videoFrameAt = _chunkZ64NRDEHcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkZ64NRDEHcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkZ64NRDEHcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkZ64NRDEHcjs.videoFrameToSvg; exports.videoFrames = _chunkZ64NRDEHcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkZ64NRDEHcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkZ64NRDEHcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkZ64NRDEHcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkZ64NRDEHcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkZ64NRDEHcjs.videoGradeLook; exports.videoGradePreset = _chunkZ64NRDEHcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkZ64NRDEHcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkZ64NRDEHcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkZ64NRDEHcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkZ64NRDEHcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkZ64NRDEHcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkZ64NRDEHcjs.videoHourFrames; exports.videoIrisRadius = _chunkZ64NRDEHcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkZ64NRDEHcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkZ64NRDEHcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkZ64NRDEHcjs.videoKeysOf; exports.videoLayerMask = _chunkZ64NRDEHcjs.videoLayerMask; exports.videoLayersUseEffects = _chunkZ64NRDEHcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkZ64NRDEHcjs.videoLayersWithoutTransitionEffects; exports.videoLoudnessEnergy = videoLoudnessEnergy; exports.videoLoudnessGain = videoLoudnessGain; exports.videoLoudnessOf = videoLoudnessOf; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkZ64NRDEHcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkZ64NRDEHcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkZ64NRDEHcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkZ64NRDEHcjs.videoLutToCube; exports.videoMaskContains = _chunkZ64NRDEHcjs.videoMaskContains; exports.videoMaskEdit = videoMaskEdit; exports.videoMaskPolygon = _chunkZ64NRDEHcjs.videoMaskPolygon; exports.videoMaskSvgPath = _chunkZ64NRDEHcjs.videoMaskSvgPath; exports.videoOverlap = _chunkZ64NRDEHcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkZ64NRDEHcjs.videoProjectDuration; exports.videoProjectEffects = _chunkZ64NRDEHcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkZ64NRDEHcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkZ64NRDEHcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkZ64NRDEHcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkZ64NRDEHcjs.videoSequenceMap; exports.videoShellQuote = _chunkZ64NRDEHcjs.videoShellQuote; exports.videoSkinProtectionEdits = videoSkinProtectionEdits; exports.videoSkinToneWeight = _chunkZ64NRDEHcjs.videoSkinToneWeight; exports.videoSlowMotionRamp = _chunkZ64NRDEHcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkZ64NRDEHcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeechRanges = videoSpeechRanges; exports.videoSpeedRampEdit = _chunkZ64NRDEHcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkZ64NRDEHcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkZ64NRDEHcjs.videoTextStyle; exports.videoTimeRef = videoTimeRef; exports.videoTimeRemapBreakpoints = _chunkZ64NRDEHcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkZ64NRDEHcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkZ64NRDEHcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkZ64NRDEHcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkZ64NRDEHcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkZ64NRDEHcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkZ64NRDEHcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkZ64NRDEHcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkZ64NRDEHcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkZ64NRDEHcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange; exports.withVideoPlayback = withVideoPlayback;