hyperframes 0.8.179 → 0.8.180

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 (158) hide show
  1. package/dist/{add-2CCBND75.js → add-HUVEWSVU.js} +11 -11
  2. package/dist/{animatedGifPrep-S6XXOOXK.js → animatedGifPrep-V6GJQOEB.js} +5 -5
  3. package/dist/api.js +13 -13
  4. package/dist/{asset-7HOLVSD5.js → asset-ZGQHDMIO.js} +2 -2
  5. package/dist/{assetCataloger-MSAMR77T.js → assetCataloger-MZWCOV6C.js} +5 -5
  6. package/dist/{audio-356GVOLJ.js → audio-XDWHLNIW.js} +11 -11
  7. package/dist/{auth-YHI5VR4X.js → auth-VIV3M7S6.js} +1 -1
  8. package/dist/{autoUpdate-OP345EBV.js → autoUpdate-R32XDL42.js} +2 -2
  9. package/dist/{backgroundChecks-6NVELE25.js → backgroundChecks-A2N6EVCP.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-OOQYGH5A.js → batchRender-3AYDQRBI.js} +3 -3
  12. package/dist/{beats-DQH5SOHM.js → beats-2O423Z6Q.js} +4 -4
  13. package/dist/{benchmark-2W2NPNLJ.js → benchmark-YXP3PTZP.js} +8 -8
  14. package/dist/{browser-SCM75524.js → browser-M47BNOTJ.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-4F6HKLMZ.js → bundleWithLocalizedFonts-GCIHOMIU.js} +2 -2
  16. package/dist/{capture-YRS6SZ6B.js → capture-BT2ZXN5P.js} +8 -8
  17. package/dist/{capture-ZBGAJYVH.js → capture-IV3Y2MT4.js} +2 -2
  18. package/dist/{captureCompositionFrame-Z33NWUED.js → captureCompositionFrame-BMZEKPOU.js} +9 -9
  19. package/dist/{catalog-MOSGL65T.js → catalog-GI6P22KI.js} +11 -11
  20. package/dist/{catch-up-TCAZFTMO.js → catch-up-QS6HUHAO.js} +4 -4
  21. package/dist/{check-QVXSTHZB.js → check-HE5E4Q7Q.js} +32 -32
  22. package/dist/{checkBrowser-NF2CMWYR.js → checkBrowser-BHLYP3YW.js} +28 -28
  23. package/dist/{chunk-WOXRCPJU.js → chunk-2JDLESMS.js} +1 -1
  24. package/dist/{chunk-HU4PBQGJ.js → chunk-2VJNKE7C.js} +1 -1
  25. package/dist/{chunk-5RS2FIZU.js → chunk-3QENZQSL.js} +1 -1
  26. package/dist/{chunk-VI7IQ2QF.js → chunk-3YXTFXT7.js} +7 -7
  27. package/dist/{chunk-PU33GPG4.js → chunk-4IEH6EAC.js} +1 -1
  28. package/dist/{chunk-AEWZDKFS.js → chunk-4J7DHVN2.js} +1 -1
  29. package/dist/{chunk-XX4ZYQR6.js → chunk-55P7GDT6.js} +1 -1
  30. package/dist/{chunk-RJIJWETG.js → chunk-65CLIHK2.js} +1 -1
  31. package/dist/{chunk-NTMCSIQB.js → chunk-7Z6AARJR.js} +2 -2
  32. package/dist/{chunk-ILLFG4RN.js → chunk-A3NFBMYX.js} +3 -3
  33. package/dist/{chunk-A2BB2XQU.js → chunk-AMX53HVX.js} +2 -2
  34. package/dist/{chunk-PLNQW2C6.js → chunk-BAZ5LCR3.js} +1 -1
  35. package/dist/{chunk-TINAVSGR.js → chunk-BI52RNRW.js} +1 -1
  36. package/dist/{chunk-N3U7WHQK.js → chunk-F5VMPELS.js} +5 -5
  37. package/dist/{chunk-MXNKK7HY.js → chunk-FCUTQM2P.js} +3 -3
  38. package/dist/{chunk-JRIXYXG3.js → chunk-G2ZMCNRN.js} +58 -26
  39. package/dist/{chunk-ORM7SJ7K.js → chunk-HFZ4UILX.js} +6 -6
  40. package/dist/{chunk-BGKZ37BC.js → chunk-IWTRHPTP.js} +2 -2
  41. package/dist/{chunk-VCDWVVDV.js → chunk-IZM562YJ.js} +3 -3
  42. package/dist/{chunk-3EJYUZHW.js → chunk-JBCU6NR5.js} +6 -6
  43. package/dist/{chunk-CW3VIQMZ.js → chunk-K3KANDZQ.js} +1 -1
  44. package/dist/{chunk-M5CJQ6EH.js → chunk-K7RGIADJ.js} +1 -1
  45. package/dist/{chunk-UOHQV6AV.js → chunk-KIO3R4QN.js} +1 -1
  46. package/dist/{chunk-DHKYJYOY.js → chunk-KZ3VI5K6.js} +3 -3
  47. package/dist/{chunk-FIAQ4J45.js → chunk-L527FLMV.js} +2 -2
  48. package/dist/{chunk-AHS5QYKF.js → chunk-LBQFLUIY.js} +1 -1
  49. package/dist/{chunk-DLF5KIBL.js → chunk-LL5VQ4WS.js} +2 -2
  50. package/dist/{chunk-F3GML67X.js → chunk-MPWLGNM2.js} +1 -1
  51. package/dist/{chunk-UWPUEI5U.js → chunk-MQOE5RE4.js} +1 -1
  52. package/dist/{chunk-C5XU53VP.js → chunk-NOXGG4C7.js} +9 -9
  53. package/dist/{chunk-Q73AGCTV.js → chunk-NXYBR4QX.js} +10 -10
  54. package/dist/{chunk-YH7VQAKX.js → chunk-OFY6JTZC.js} +2 -2
  55. package/dist/{chunk-BJJ3QF7T.js → chunk-OR5WCFWZ.js} +1 -1
  56. package/dist/{chunk-BNGRVR3Y.js → chunk-Q2ASTBSG.js} +4 -4
  57. package/dist/{chunk-COK5OUBX.js → chunk-R46P7TGY.js} +1 -1
  58. package/dist/{chunk-XSQWXUK2.js → chunk-RGXAN3YU.js} +1 -1
  59. package/dist/{chunk-ZAJO3YCQ.js → chunk-RXQHSGAQ.js} +2 -2
  60. package/dist/{chunk-A3RUVTGB.js → chunk-S3RYRF3W.js} +1 -1
  61. package/dist/{chunk-M2DZX2DP.js → chunk-SEMOZNVE.js} +1 -1
  62. package/dist/{chunk-BW2UQR4A.js → chunk-ST2ARHQ5.js} +5 -5
  63. package/dist/{chunk-AFKVI7FJ.js → chunk-TO6JNTML.js} +1 -1
  64. package/dist/{chunk-52L2L46Q.js → chunk-ULWZYLCV.js} +1 -1
  65. package/dist/{chunk-FTWOVWHR.js → chunk-UVEQLDKB.js} +2 -2
  66. package/dist/{chunk-LBRJKTVY.js → chunk-V6MQP32U.js} +2 -2
  67. package/dist/{chunk-IHWI3KZY.js → chunk-VARUKXOZ.js} +3 -3
  68. package/dist/{chunk-5HZAIPHY.js → chunk-VE3OKVSD.js} +1 -1
  69. package/dist/{chunk-OXP77SHD.js → chunk-VKMP3IVR.js} +1 -1
  70. package/dist/{chunk-VU4JLRNH.js → chunk-W4SLIGGM.js} +2 -25
  71. package/dist/{chunk-32GKQ73S.js → chunk-WUQUR33W.js} +1 -1
  72. package/dist/{chunk-IE6O2VXV.js → chunk-XH262OWN.js} +1 -1
  73. package/dist/{chunk-OINJILMB.js → chunk-XO6CWU7D.js} +1 -1
  74. package/dist/{chunk-MK6D6HVT.js → chunk-Y5APFFMD.js} +1 -1
  75. package/dist/{chunk-LO4DHZLH.js → chunk-ZJPCQBU7.js} +3 -3
  76. package/dist/{clean-SJ2UIDKG.js → clean-TQOW24OF.js} +13 -13
  77. package/dist/cli.js +53 -53
  78. package/dist/{cloud-DH7QGNPZ.js → cloud-7TOVPUMY.js} +4 -4
  79. package/dist/{cloudrun-ZA2ZH2VZ.js → cloudrun-2BKGY53X.js} +4 -4
  80. package/dist/{compare-5JNN5BHX.js → compare-WDV3Q6WC.js} +23 -23
  81. package/dist/{compiler-CQ6OKYT5.js → compiler-U3W6CJW7.js} +2 -2
  82. package/dist/{component-LJQWLOXZ.js → component-U66GBIUO.js} +3 -3
  83. package/dist/{compositions-UILNO2RF.js → compositions-Y63YGLCE.js} +9 -9
  84. package/dist/{delete-WIO2MDPB.js → delete-TBAIAD7M.js} +2 -2
  85. package/dist/{deploy-BUEYC7MP.js → deploy-BIWOSWS3.js} +1 -1
  86. package/dist/{dist-MHJYD5IZ.js → dist-VO7OXOFK.js} +2 -2
  87. package/dist/{doctor-5G2RXBQX.js → doctor-GC4REGB6.js} +9 -9
  88. package/dist/{events-BXODXMJ6.js → events-4NMQVUZR.js} +2 -2
  89. package/dist/{events-2LHNVY2F.js → events-PUUP24FT.js} +3 -3
  90. package/dist/{feedback-57END2CW.js → feedback-BIDXK7TE.js} +6 -6
  91. package/dist/{ffmpeg-64E4VH6W.js → ffmpeg-2VJDEWQQ.js} +5 -5
  92. package/dist/{figma-O5MO4GF5.js → figma-THMXYLMU.js} +3 -3
  93. package/dist/fontLocalizeCli.js +7 -7
  94. package/dist/{get-OEWPJ4HH.js → get-5T4B7ERH.js} +2 -2
  95. package/dist/{gpuPolicy-IGZOHHMX.js → gpuPolicy-GLUATV5I.js} +5 -5
  96. package/dist/{grade-compare-PG2UOMHO.js → grade-compare-2A65YEHZ.js} +24 -24
  97. package/dist/{help-44J4SQTE.js → help-JFBDXFRC.js} +1 -1
  98. package/dist/{history-CUA53AOE.js → history-OJEWFWMS.js} +6 -6
  99. package/dist/hyperframe-runtime.js +54 -54
  100. package/dist/hyperframe.manifest.json +1 -1
  101. package/dist/hyperframe.runtime.iife.js +54 -54
  102. package/dist/hyperframes-player.global.js +1 -1
  103. package/dist/{info-UDXYDQVK.js → info-KJZBU3SZ.js} +7 -7
  104. package/dist/{init-CVT6HLW2.js → init-6V4ELU4Z.js} +25 -25
  105. package/dist/{inspect-6F72RJQG.js → inspect-WGBZZUZU.js} +24 -24
  106. package/dist/{installer-ADKWK4I4.js → installer-EPRSH6QI.js} +4 -4
  107. package/dist/{keyframes-GJ7EEWW2.js → keyframes-57LYKC2M.js} +6 -6
  108. package/dist/{lambda-WFSBYU6U.js → lambda-5P5X2X5E.js} +6 -6
  109. package/dist/{layout-SASENZOG.js → layout-PM2VAUT2.js} +24 -24
  110. package/dist/{lint-JX57B52X.js → lint-DXS6QRYZ.js} +6 -6
  111. package/dist/{list-WG7NTE63.js → list-6IBSX7FU.js} +2 -2
  112. package/dist/{login-3NFLD65G.js → login-RY3PWK44.js} +4 -4
  113. package/dist/{manager-BKHRATMY.js → manager-N3COY6BJ.js} +6 -6
  114. package/dist/{media-treatment-QI5F2SMU.js → media-treatment-3HEZR7ZS.js} +11 -11
  115. package/dist/{models-TXURF3J6.js → models-FEULJWSX.js} +9 -9
  116. package/dist/{motionShot-HRM6NMT4.js → motionShot-BZTEIZEO.js} +12 -12
  117. package/dist/{normalize-audio-IEKL43N4.js → normalize-audio-O4X4LPLK.js} +4 -4
  118. package/dist/{open-GU3I75TB.js → open-H3MX4TI2.js} +11 -11
  119. package/dist/{parakeetRunner-S2QI3PCA.js → parakeetRunner-5ABMPCI6.js} +10 -10
  120. package/dist/{pipeline-OO2MYYIV.js → pipeline-RJ4DOVWX.js} +6 -6
  121. package/dist/{play-VL2WQCT3.js → play-3PBKEZIX.js} +16 -16
  122. package/dist/{preflight-GBPRLIM6.js → preflight-3RABQJT3.js} +6 -6
  123. package/dist/{present-YWSFX5CH.js → present-6SNRG3GI.js} +12 -12
  124. package/dist/{preview-SMG6GXLY.js → preview-LSDFCJ3H.js} +16 -16
  125. package/dist/{producer-67RIQCWZ.js → producer-SUZDRXHJ.js} +1 -1
  126. package/dist/{projectConfig-NQQDEDAK.js → projectConfig-5QCNTGQT.js} +6 -6
  127. package/dist/{publication-7DW4IJPC.js → publication-2QT7VVE2.js} +2 -2
  128. package/dist/{publish-FJKJ74IF.js → publish-53EBL7OO.js} +7 -7
  129. package/dist/{remove-background-HO2NBZCJ.js → remove-background-4G4MX5WK.js} +7 -7
  130. package/dist/{render-5TTZDI5N.js → render-75CRB3BW.js} +3 -3
  131. package/dist/{render-DH4CGGLO.js → render-RXKUYTYI.js} +8 -8
  132. package/dist/{render-MB7PW2YQ.js → render-SKY6FKYB.js} +25 -25
  133. package/dist/{render-batch-4RPH66OX.js → render-batch-CEVWUYBP.js} +3 -3
  134. package/dist/{resolver-UW6NYBJA.js → resolver-4ICE2AT6.js} +4 -4
  135. package/dist/{sherpa-LVXRZGE3.js → sherpa-TMX3WBTM.js} +9 -9
  136. package/dist/{skills-NDWQPEUD.js → skills-MCWFAGIP.js} +5 -5
  137. package/dist/{skillsUpdateCheck-HZVZ3IUU.js → skillsUpdateCheck-NXOI35BW.js} +3 -3
  138. package/dist/{snapshot-MCHWMAPH.js → snapshot-ESZMKQ6J.js} +77 -60
  139. package/dist/{src-E34ZBMAS.js → src-GYYWBQXJ.js} +6 -6
  140. package/dist/{src-XRFOS5LP.js → src-XRTZOBO5.js} +4 -4
  141. package/dist/{staticProjectServer-COEAKTGH.js → staticProjectServer-GYPUQGI7.js} +12 -12
  142. package/dist/studio/assets/{hyperframes-player-C0SyMC21.js → hyperframes-player-1wdLVP-x.js} +1 -1
  143. package/dist/studio/assets/{index-DHUassFP.js → index-CaWPPTQ1.js} +1 -1
  144. package/dist/studio/assets/{index-ueMRyAJ2.js → index-mdtW0Ug-.js} +4 -4
  145. package/dist/studio/index.html +1 -1
  146. package/dist/{studio-api-455XWQPD.js → studio-api-IXGX5ZFI.js} +6 -6
  147. package/dist/{studioServer-XK5N6PIB.js → studioServer-XVGYU6O3.js} +41 -41
  148. package/dist/{telemetry-DD5ZIBOK.js → telemetry-E355EUDZ.js} +3 -3
  149. package/dist/{timeline-MJJEX5CU.js → timeline-VWH6WSD7.js} +14 -14
  150. package/dist/{tokens-AKUZMYRE.js → tokens-IOAVF4UI.js} +2 -2
  151. package/dist/{transcribe-ZQI5P2LH.js → transcribe-EGUXJGD4.js} +14 -14
  152. package/dist/{transcribe-ER7GGF4L.js → transcribe-EJA7OOHH.js} +8 -8
  153. package/dist/{updateCheck-GYFCXFWR.js → updateCheck-U2CVTKPF.js} +2 -2
  154. package/dist/{upgrade-UNWHMZP5.js → upgrade-CWEKQ4JO.js} +2 -2
  155. package/dist/{urlDownloader-QF7EBQC2.js → urlDownloader-DY5BLAFA.js} +4 -4
  156. package/dist/{validate-32CQZFNZ.js → validate-XOMNMKD6.js} +18 -18
  157. package/dist/{video-2KGC3RIQ.js → video-22NN6OEH.js} +5 -5
  158. package/package.json +1 -1
@@ -17,26 +17,26 @@ import {
17
17
  } from "./chunk-57GN6KWT.js";
18
18
  import {
19
19
  captureArtifactRevision
20
- } from "./chunk-OINJILMB.js";
21
- import "./chunk-OXP77SHD.js";
20
+ } from "./chunk-XO6CWU7D.js";
21
+ import "./chunk-VKMP3IVR.js";
22
22
  import "./chunk-X7MTZ4T2.js";
23
23
  import {
24
24
  formatLintFindings
25
25
  } from "./chunk-6CSYCFQV.js";
26
26
  import {
27
27
  resolveProject
28
- } from "./chunk-XX4ZYQR6.js";
28
+ } from "./chunk-55P7GDT6.js";
29
29
  import {
30
30
  serveStaticProjectHtml
31
- } from "./chunk-VCDWVVDV.js";
32
- import "./chunk-FTWOVWHR.js";
31
+ } from "./chunk-IZM562YJ.js";
32
+ import "./chunk-UVEQLDKB.js";
33
33
  import "./chunk-X7MTZ4T2.js";
34
34
  import "./chunk-XUHOIDKG.js";
35
- import "./chunk-3EJYUZHW.js";
36
- import "./chunk-BGKZ37BC.js";
35
+ import "./chunk-JBCU6NR5.js";
36
+ import "./chunk-IWTRHPTP.js";
37
37
  import "./chunk-TTVHYD5R.js";
38
38
  import "./chunk-6JR2XUEE.js";
39
- import "./chunk-UOHQV6AV.js";
39
+ import "./chunk-KIO3R4QN.js";
40
40
  import {
41
41
  artifactDirectory,
42
42
  finishSnapshotRun,
@@ -53,33 +53,35 @@ import {
53
53
  resolveCropRegion,
54
54
  runFfmpegOnce,
55
55
  seekCompositionTimeline
56
- } from "./chunk-ORM7SJ7K.js";
56
+ } from "./chunk-HFZ4UILX.js";
57
57
  import "./chunk-FH7WODJH.js";
58
- import "./chunk-52L2L46Q.js";
59
- import "./chunk-LO4DHZLH.js";
58
+ import "./chunk-ULWZYLCV.js";
59
+ import "./chunk-ZJPCQBU7.js";
60
60
  import "./chunk-BRHI7EIA.js";
61
- import "./chunk-A3RUVTGB.js";
61
+ import "./chunk-S3RYRF3W.js";
62
62
  import "./chunk-K2FLNJVB.js";
63
63
  import "./chunk-DQBY7FRR.js";
64
64
  import {
65
65
  resolveLocalBrowserGpuMode
66
- } from "./chunk-A2BB2XQU.js";
66
+ } from "./chunk-AMX53HVX.js";
67
67
  import "./chunk-442JNXRM.js";
68
68
  import "./chunk-RGHQID2E.js";
69
- import "./chunk-IE6O2VXV.js";
69
+ import "./chunk-XH262OWN.js";
70
70
  import "./chunk-XT7X6QCP.js";
71
71
  import "./chunk-4YYJOFKS.js";
72
72
  import "./chunk-HVW7ABXD.js";
73
- import "./chunk-32GKQ73S.js";
74
- import "./chunk-JHOCK3DG.js";
75
- import "./chunk-YH7VQAKX.js";
76
- import "./chunk-AFKVI7FJ.js";
73
+ import "./chunk-WUQUR33W.js";
74
+ import {
75
+ runWithConcurrencyLimit
76
+ } from "./chunk-JHOCK3DG.js";
77
+ import "./chunk-OFY6JTZC.js";
78
+ import "./chunk-TO6JNTML.js";
77
79
  import "./chunk-AWDFDFI3.js";
78
80
  import "./chunk-P6LJ4Y32.js";
79
81
  import "./chunk-GMECXFAN.js";
80
82
  import "./chunk-5CS4T6C6.js";
81
- import "./chunk-COK5OUBX.js";
82
- import "./chunk-M5CJQ6EH.js";
83
+ import "./chunk-R46P7TGY.js";
84
+ import "./chunk-K7RGIADJ.js";
83
85
  import "./chunk-VWG7OQKU.js";
84
86
  import "./chunk-T6AGUTZJ.js";
85
87
  import {
@@ -103,7 +105,7 @@ import "./chunk-K4WIOZFP.js";
103
105
  import "./chunk-XUXGIA7H.js";
104
106
  import "./chunk-WERLJGIC.js";
105
107
  import "./chunk-ISN5GRYI.js";
106
- import "./chunk-DLF5KIBL.js";
108
+ import "./chunk-LL5VQ4WS.js";
107
109
  import {
108
110
  loadOptionalPackage
109
111
  } from "./chunk-3DKN5WKL.js";
@@ -113,21 +115,21 @@ import {
113
115
  findFFmpeg,
114
116
  findFFprobe,
115
117
  getFFmpegInstallHint
116
- } from "./chunk-5RS2FIZU.js";
118
+ } from "./chunk-3QENZQSL.js";
117
119
  import "./chunk-XT6MXC7A.js";
118
- import "./chunk-VU4JLRNH.js";
119
- import "./chunk-PU33GPG4.js";
120
+ import "./chunk-W4SLIGGM.js";
121
+ import "./chunk-4IEH6EAC.js";
120
122
  import "./chunk-W2LGJSEN.js";
121
123
  import {
122
124
  createRuntimeStartTimeResolver,
123
125
  isClipVisibleAt,
124
126
  isInClipWindow
125
- } from "./chunk-AHS5QYKF.js";
127
+ } from "./chunk-LBQFLUIY.js";
126
128
  import {
127
129
  readElementRateSpec,
128
130
  sourceTimeAt,
129
131
  timeAtSourceTime
130
- } from "./chunk-PLNQW2C6.js";
132
+ } from "./chunk-BAZ5LCR3.js";
131
133
  import "./chunk-VC76R6W2.js";
132
134
  import "./chunk-UJKQWGFF.js";
133
135
  import "./chunk-YMS5FOMC.js";
@@ -236,6 +238,7 @@ function orbitStageSource() {
236
238
  }`;
237
239
  }
238
240
  var FFMPEG_EXTRACT_TIMEOUT_MS = 3e4;
241
+ var VIDEO_FRAME_EXTRACT_CONCURRENCY = 4;
239
242
  function formatSnapshotTimestamp(time) {
240
243
  return `${Number(time.toFixed(3))}s`;
241
244
  }
@@ -396,7 +399,7 @@ async function probeSeekLanding(ffmpeg, videoPath, seek) {
396
399
  return null;
397
400
  }
398
401
  }
399
- async function extractVideoFrameToBuffer(videoPath, timeSeconds, useVp9AlphaDecoder = false, holdLastFrame = false) {
402
+ async function extractVideoFrameToBuffer(videoPath, timeSeconds, useVp9AlphaDecoder = false, holdLastFrame = false, displayedPixels = 0) {
400
403
  const tmp = mkdtempSync(join(tmpdir(), "hf-snapshot-frame-"));
401
404
  const outPath = join(tmp, "frame.png");
402
405
  try {
@@ -411,7 +414,14 @@ async function extractVideoFrameToBuffer(videoPath, timeSeconds, useVp9AlphaDeco
411
414
  if (useVp9AlphaDecoder) args.push("-c:v", "libvpx-vp9");
412
415
  if (seek.seek !== void 0) args.push("-ss", String(seek.seek));
413
416
  args.push("-i", videoPath, "-map", "0:v:0");
414
- if (seek.select !== void 0) args.push("-vf", `select=gte(t-start_t\\,${seek.select})`);
417
+ const filters = [];
418
+ if (seek.select !== void 0) filters.push(`select=gte(t-start_t\\,${seek.select})`);
419
+ if (displayedPixels > 0) {
420
+ filters.push(
421
+ `scale='min(iw,${displayedPixels})':'min(ih,${displayedPixels})':force_original_aspect_ratio=increase`
422
+ );
423
+ }
424
+ if (filters.length > 0) args.push("-vf", filters.join(","));
415
425
  args.push("-frames:v", "1", "-q:v", "2", "-y", outPath);
416
426
  const result = await runFfmpegOnce(ffmpegPath, args, FFMPEG_EXTRACT_TIMEOUT_MS);
417
427
  if (result.code !== 0 || result.timedOut || !existsSync(outPath)) return null;
@@ -466,7 +476,7 @@ function serveCapturePage(projectDir, html, proxy) {
466
476
  return serveStaticProjectHtml(projectDir, html, void 0, [], proxy === true);
467
477
  }
468
478
  async function captureSnapshots(projectDir, opts) {
469
- const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-4F6HKLMZ.js");
479
+ const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-GCIHOMIU.js");
470
480
  const capture = await captureArtifactRevision(projectDir).catch(warnSnapshotsNotRecorded);
471
481
  const invocation = randomUUID();
472
482
  const artifacts = [];
@@ -579,7 +589,7 @@ async function captureSnapshots(projectDir, opts) {
579
589
  let syncVideoFrameVisibility = null;
580
590
  let extractMediaMetadata = null;
581
591
  try {
582
- const engine = await import("./src-XRFOS5LP.js");
592
+ const engine = await import("./src-XRTZOBO5.js");
583
593
  injectVideoFramesBatch = engine.injectVideoFramesBatch;
584
594
  syncVideoFrameVisibility = engine.syncVideoFrameVisibility;
585
595
  extractMediaMetadata = engine.extractMediaMetadata;
@@ -611,6 +621,7 @@ async function captureSnapshots(projectDir, opts) {
611
621
  const runtimeWindow = window;
612
622
  return Array.from(document.querySelectorAll("video")).map((el) => {
613
623
  const v = el;
624
+ const box = v.getBoundingClientRect();
614
625
  const authoredStart = parseFloat(v.dataset.start ?? "0") || 0;
615
626
  const runtimeResolvedStart = runtimeWindow.__hfResolveMediaStartSeconds?.(v);
616
627
  const mediaStart = parseFloat(v.dataset.playbackStart ?? v.dataset.mediaStart ?? "0") || 0;
@@ -627,7 +638,9 @@ async function captureSnapshots(projectDir, opts) {
627
638
  authoredDuration: Number.isFinite(rawDuration) && rawDuration > 0 ? rawDuration : null,
628
639
  srcDuration: srcDur,
629
640
  mediaStart,
630
- loop: v.loop
641
+ loop: v.loop,
642
+ displayedSize: Math.max(box.width, box.height),
643
+ devicePixelRatio: window.devicePixelRatio
631
644
  };
632
645
  });
633
646
  });
@@ -654,37 +667,41 @@ async function captureSnapshots(projectDir, opts) {
654
667
  });
655
668
  return frameTime === null ? [] : [{ ...candidate, start, playbackRate, duration: duration2, relTime: frameTime }];
656
669
  });
657
- const updates = [];
658
- for (const v of active) {
659
- let ffmpegInput = null;
660
- let inputIsLocal = false;
661
- try {
662
- const url = new URL(v.src);
663
- const decodedPath = decodeURIComponent(url.pathname).replace(/^\//, "");
664
- const candidate = resolve(projectDir, decodedPath);
665
- const rel2 = relative(projectDir, candidate);
666
- if (!rel2.startsWith("..") && !isAbsolute(rel2) && existsSync(candidate)) {
667
- ffmpegInput = candidate;
668
- inputIsLocal = true;
669
- } else if (url.protocol === "http:" || url.protocol === "https:") {
670
- ffmpegInput = url.href;
670
+ const extracted = await runWithConcurrencyLimit(
671
+ active,
672
+ VIDEO_FRAME_EXTRACT_CONCURRENCY,
673
+ async (v) => {
674
+ let ffmpegInput = null;
675
+ let inputIsLocal = false;
676
+ try {
677
+ const url = new URL(v.src);
678
+ const decodedPath = decodeURIComponent(url.pathname).replace(/^\//, "");
679
+ const candidate = resolve(projectDir, decodedPath);
680
+ const rel2 = relative(projectDir, candidate);
681
+ if (!rel2.startsWith("..") && !isAbsolute(rel2) && existsSync(candidate)) {
682
+ ffmpegInput = candidate;
683
+ inputIsLocal = true;
684
+ } else if (url.protocol === "http:" || url.protocol === "https:") {
685
+ ffmpegInput = url.href;
686
+ }
687
+ } catch {
671
688
  }
672
- } catch {
689
+ if (!ffmpegInput) return null;
690
+ const useVp9AlphaDecoder = inputIsLocal ? await shouldUseVp9AlphaDecoder(ffmpegInput) : false;
691
+ const png = await extractVideoFrameToBuffer(
692
+ ffmpegInput,
693
+ Math.max(0, v.relTime),
694
+ useVp9AlphaDecoder,
695
+ v.srcDuration > 0 && v.relTime >= v.srcDuration - 1,
696
+ Math.ceil(
697
+ v.displayedSize * (opts.zoom ? opts.zoomScale ?? DEFAULT_ZOOM_SCALE : v.devicePixelRatio)
698
+ )
699
+ );
700
+ if (!png) return null;
701
+ return { videoId: v.id, dataUri: `data:image/png;base64,${png.toString("base64")}` };
673
702
  }
674
- if (!ffmpegInput) continue;
675
- const useVp9AlphaDecoder = inputIsLocal ? await shouldUseVp9AlphaDecoder(ffmpegInput) : false;
676
- const png = await extractVideoFrameToBuffer(
677
- ffmpegInput,
678
- Math.max(0, v.relTime),
679
- useVp9AlphaDecoder,
680
- v.srcDuration > 0 && v.relTime >= v.srcDuration - 1
681
- );
682
- if (!png) continue;
683
- updates.push({
684
- videoId: v.id,
685
- dataUri: `data:image/png;base64,${png.toString("base64")}`
686
- });
687
- }
703
+ );
704
+ const updates = extracted.filter((update) => update !== null);
688
705
  if (active.length > 0 && updates.length < active.length) {
689
706
  const missed = active.length - updates.length;
690
707
  warnings.push(`${missed} video frames missing at ${time}s`);
@@ -69,7 +69,7 @@ import {
69
69
  serializeRenderRequest,
70
70
  startServer,
71
71
  validatePlanV2MaterializedTarget
72
- } from "./chunk-JRIXYXG3.js";
72
+ } from "./chunk-G2ZMCNRN.js";
73
73
  import "./chunk-KLIKCX6Q.js";
74
74
  import "./chunk-EVMY7IPL.js";
75
75
  import {
@@ -81,7 +81,7 @@ import {
81
81
  } from "./chunk-B4VT6YU2.js";
82
82
  import "./chunk-7FMUTGOH.js";
83
83
  import "./chunk-FI4I7CME.js";
84
- import "./chunk-FIAQ4J45.js";
84
+ import "./chunk-L527FLMV.js";
85
85
  import "./chunk-BZ56MTDX.js";
86
86
  import {
87
87
  DEFAULT_CONFIG,
@@ -96,13 +96,13 @@ import {
96
96
  isTransientBrowserError,
97
97
  prepareCaptureSessionForReuse,
98
98
  resolveConfig
99
- } from "./chunk-VU4JLRNH.js";
100
- import "./chunk-PU33GPG4.js";
99
+ } from "./chunk-W4SLIGGM.js";
100
+ import "./chunk-4IEH6EAC.js";
101
101
  import "./chunk-W2LGJSEN.js";
102
102
  import {
103
103
  quantizeTimeToFrame
104
- } from "./chunk-AHS5QYKF.js";
105
- import "./chunk-PLNQW2C6.js";
104
+ } from "./chunk-LBQFLUIY.js";
105
+ import "./chunk-BAZ5LCR3.js";
106
106
  import "./chunk-VC76R6W2.js";
107
107
  import "./chunk-UJKQWGFF.js";
108
108
  import "./chunk-YMS5FOMC.js";
@@ -218,8 +218,8 @@ import {
218
218
  verifyGpuParity,
219
219
  writeCapturedFrame,
220
220
  writeUrlDownloadTelemetry
221
- } from "./chunk-VU4JLRNH.js";
222
- import "./chunk-PU33GPG4.js";
221
+ } from "./chunk-W4SLIGGM.js";
222
+ import "./chunk-4IEH6EAC.js";
223
223
  import {
224
224
  LOW_MEMORY_TOTAL_MB_THRESHOLD,
225
225
  getCgroupMemoryLimitMb,
@@ -229,8 +229,8 @@ import {
229
229
  import {
230
230
  MEDIA_VISUAL_STYLE_PROPERTIES,
231
231
  quantizeTimeToFrame
232
- } from "./chunk-AHS5QYKF.js";
233
- import "./chunk-PLNQW2C6.js";
232
+ } from "./chunk-LBQFLUIY.js";
233
+ import "./chunk-BAZ5LCR3.js";
234
234
  import "./chunk-VC76R6W2.js";
235
235
  import "./chunk-UJKQWGFF.js";
236
236
  import "./chunk-YMS5FOMC.js";
@@ -7,25 +7,25 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  inProcessAnswer,
9
9
  serveStaticProjectHtml
10
- } from "./chunk-VCDWVVDV.js";
11
- import "./chunk-FTWOVWHR.js";
10
+ } from "./chunk-IZM562YJ.js";
11
+ import "./chunk-UVEQLDKB.js";
12
12
  import "./chunk-X7MTZ4T2.js";
13
13
  import "./chunk-XUHOIDKG.js";
14
- import "./chunk-3EJYUZHW.js";
15
- import "./chunk-BGKZ37BC.js";
14
+ import "./chunk-JBCU6NR5.js";
15
+ import "./chunk-IWTRHPTP.js";
16
16
  import "./chunk-TTVHYD5R.js";
17
17
  import "./chunk-6JR2XUEE.js";
18
- import "./chunk-UOHQV6AV.js";
18
+ import "./chunk-KIO3R4QN.js";
19
19
  import "./chunk-ICMXC3MI.js";
20
20
  import "./chunk-ALVXFXUG.js";
21
- import "./chunk-IE6O2VXV.js";
21
+ import "./chunk-XH262OWN.js";
22
22
  import "./chunk-XT7X6QCP.js";
23
23
  import "./chunk-4YYJOFKS.js";
24
24
  import "./chunk-HVW7ABXD.js";
25
- import "./chunk-32GKQ73S.js";
25
+ import "./chunk-WUQUR33W.js";
26
26
  import "./chunk-JHOCK3DG.js";
27
- import "./chunk-YH7VQAKX.js";
28
- import "./chunk-AFKVI7FJ.js";
27
+ import "./chunk-OFY6JTZC.js";
28
+ import "./chunk-TO6JNTML.js";
29
29
  import "./chunk-AWDFDFI3.js";
30
30
  import "./chunk-P6LJ4Y32.js";
31
31
  import "./chunk-GMECXFAN.js";
@@ -34,9 +34,9 @@ import "./chunk-KLIKCX6Q.js";
34
34
  import "./chunk-EVMY7IPL.js";
35
35
  import "./chunk-7FMUTGOH.js";
36
36
  import "./chunk-EOVYQ3IG.js";
37
- import "./chunk-PU33GPG4.js";
38
- import "./chunk-AHS5QYKF.js";
39
- import "./chunk-PLNQW2C6.js";
37
+ import "./chunk-4IEH6EAC.js";
38
+ import "./chunk-LBQFLUIY.js";
39
+ import "./chunk-BAZ5LCR3.js";
40
40
  import "./chunk-VC76R6W2.js";
41
41
  import "./chunk-UJKQWGFF.js";
42
42
  import "./chunk-YMS5FOMC.js";
@@ -1,4 +1,4 @@
1
- var xe=Object.defineProperty;var Ie=(r,i,e)=>i in r?xe(r,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[i]=e;var l=(r,i,e)=>Ie(r,typeof i!="symbol"?i+"":i,e);import{S as Oe,r as Ne,a as fe,i as Fe,b as w,c as _e,p as Ve,d as Ue,e as He,f as We,s as ze,g as ge,F as ye}from"./index-ueMRyAJ2.js";function $e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function x(r){return typeof r=="object"&&r!==null}function je(r){return x(r)&&typeof r.getDuration=="function"}function Be(r){return x(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function qe(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const W=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:qe("0.0.0-dev");function $(r){if(r===null)return null;const i=Number.parseInt(r,10);return Number.isFinite(i)&&i>0?i:null}function Ge(r){const i=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!i)return null;const e=$(i.getAttribute("data-width")),t=$(i.getAttribute("data-height"));return e!==null&&t!==null?{width:e,height:t}:null}function Ye(r){return Array.isArray(r)?r.find(i=>typeof i=="string"&&i.trim()!==""&&i!=="[object Event]")??null:null}class Xe{constructor(i,e){l(this,"_interval",null);l(this,"_runtimeInjected",!1);l(this,"_runtimeScript",null);l(this,"_failure",null);this._iframe=i,this._callbacks=e}get failed(){return this._failure!==null&&this._failure.document===this._iframe.contentDocument}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._failure=null,this._runtimeInjected=!1;let i=0;this._interval=setInterval(()=>{i++;let e=null;try{e=this._poll(i)}catch(t){t instanceof DOMException&&t.name==="SecurityError"||(e={kind:"error",message:t instanceof Error?t.message:String(t)})}e??(e=this._deadlineOutcome(i)),e&&(this.stop(),e.kind==="error"?(this._failure={document:this._iframe.contentDocument},this._callbacks.onError(e.message)):this._callbacks.onReady(e.result))},200)}_deadlineOutcome(i){var e,t;return i<40||(t=(e=this._callbacks).hostOwnsDeadline)!=null&&t.call(e)?null:{kind:"error",message:"Composition timeline not found after 8s"}}_poll(i){const e=this._iframe.contentWindow;if(!e)return null;const t=Ye(Reflect.get(e,Oe));if(t!==null)return{kind:"error",message:t};const s=this._iframe.contentDocument,n=Reflect.get(e,"__timelines"),o=this.hasRuntimeBridge(e);if($e({hasRuntime:o,hasTimelines:x(n)&&Object.keys(n).length>0,hasNestedCompositions:!!(s!=null&&s.querySelector("[data-composition-src]")),runtimeInjected:this._runtimeInjected,attempts:i}))return this._injectRuntime(),null;if(this._runtimeInjected&&!o)return null;const a=this._resolveReadyResult(e,s);return a?{kind:"ready",result:a}:null}_resolveReadyResult(i,e){var n;const t=this._resolvePlaybackDurationAdapter(i)??{kind:"document",getDuration:()=>0};let s=t.getDuration();if(!Number.isFinite(s)||s<=0){if(t.kind==="direct-timeline")return null;s=e?((n=Ne(e))==null?void 0:n.durationSeconds)??0:0}return s<=0?null:{duration:s,adapter:{...t,getDuration:()=>s},compositionSize:Ge(e)}}stop(){this._runtimeScript&&(this._runtimeScript.onerror=null,this._runtimeScript=null),this.failed||(this._failure=null),this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const i=this._iframe.contentWindow;return i?this._resolveDirectTimelineAdapterFromWindow(i):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(i){return this._resolveDirectTimelineAdapterFromWindow(i)}hasRuntimeBridge(i){return x(Reflect.get(i,"__player"))}_injectRuntime(){var i,e,t,s;this._runtimeInjected=!0;try{const n=this._iframe.contentDocument;if(!n)return;const o=n.createElement("script");o.src=((e=(i=this._callbacks).resolveRuntimeUrl)==null?void 0:e.call(i))??W,this._runtimeScript=o,o.onerror=()=>{this._runtimeScript!==o||this._iframe.contentDocument!==n||(this.stop(),this._failure={document:n},this._callbacks.onError("HyperFrames runtime failed to load from "+o.src))},(n.head||n.documentElement).appendChild(o),(s=(t=this._callbacks).onRuntimeInjected)==null||s.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(i){var a,c;if(this.hasRuntimeBridge(i))return null;const e=Reflect.get(i,"__timelines");if(!x(e))return null;const t=Object.keys(e);if(t.length===0)return null;const s=(c=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:c.getAttribute("data-composition-id"),n=s&&s in e?s:t[t.length-1],o=e[n];return Be(o)?o:null}_resolvePlaybackDurationAdapter(i){const e=Reflect.get(i,"__player");if(je(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const t=this._resolveDirectTimelineAdapterFromWindow(i);return t?{kind:"direct-timeline",timeline:t,getDuration:()=>t.duration()}:null}}const Ze=`
1
+ var xe=Object.defineProperty;var Ie=(r,i,e)=>i in r?xe(r,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[i]=e;var l=(r,i,e)=>Ie(r,typeof i!="symbol"?i+"":i,e);import{S as Oe,r as Ne,a as fe,i as Fe,b as w,c as _e,p as Ve,d as Ue,e as He,f as We,s as ze,g as ge,F as ye}from"./index-mdtW0Ug-.js";function $e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function x(r){return typeof r=="object"&&r!==null}function je(r){return x(r)&&typeof r.getDuration=="function"}function Be(r){return x(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function qe(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const W=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:qe("0.0.0-dev");function $(r){if(r===null)return null;const i=Number.parseInt(r,10);return Number.isFinite(i)&&i>0?i:null}function Ge(r){const i=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!i)return null;const e=$(i.getAttribute("data-width")),t=$(i.getAttribute("data-height"));return e!==null&&t!==null?{width:e,height:t}:null}function Ye(r){return Array.isArray(r)?r.find(i=>typeof i=="string"&&i.trim()!==""&&i!=="[object Event]")??null:null}class Xe{constructor(i,e){l(this,"_interval",null);l(this,"_runtimeInjected",!1);l(this,"_runtimeScript",null);l(this,"_failure",null);this._iframe=i,this._callbacks=e}get failed(){return this._failure!==null&&this._failure.document===this._iframe.contentDocument}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._failure=null,this._runtimeInjected=!1;let i=0;this._interval=setInterval(()=>{i++;let e=null;try{e=this._poll(i)}catch(t){t instanceof DOMException&&t.name==="SecurityError"||(e={kind:"error",message:t instanceof Error?t.message:String(t)})}e??(e=this._deadlineOutcome(i)),e&&(this.stop(),e.kind==="error"?(this._failure={document:this._iframe.contentDocument},this._callbacks.onError(e.message)):this._callbacks.onReady(e.result))},200)}_deadlineOutcome(i){var e,t;return i<40||(t=(e=this._callbacks).hostOwnsDeadline)!=null&&t.call(e)?null:{kind:"error",message:"Composition timeline not found after 8s"}}_poll(i){const e=this._iframe.contentWindow;if(!e)return null;const t=Ye(Reflect.get(e,Oe));if(t!==null)return{kind:"error",message:t};const s=this._iframe.contentDocument,n=Reflect.get(e,"__timelines"),o=this.hasRuntimeBridge(e);if($e({hasRuntime:o,hasTimelines:x(n)&&Object.keys(n).length>0,hasNestedCompositions:!!(s!=null&&s.querySelector("[data-composition-src]")),runtimeInjected:this._runtimeInjected,attempts:i}))return this._injectRuntime(),null;if(this._runtimeInjected&&!o)return null;const a=this._resolveReadyResult(e,s);return a?{kind:"ready",result:a}:null}_resolveReadyResult(i,e){var n;const t=this._resolvePlaybackDurationAdapter(i)??{kind:"document",getDuration:()=>0};let s=t.getDuration();if(!Number.isFinite(s)||s<=0){if(t.kind==="direct-timeline")return null;s=e?((n=Ne(e))==null?void 0:n.durationSeconds)??0:0}return s<=0?null:{duration:s,adapter:{...t,getDuration:()=>s},compositionSize:Ge(e)}}stop(){this._runtimeScript&&(this._runtimeScript.onerror=null,this._runtimeScript=null),this.failed||(this._failure=null),this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const i=this._iframe.contentWindow;return i?this._resolveDirectTimelineAdapterFromWindow(i):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(i){return this._resolveDirectTimelineAdapterFromWindow(i)}hasRuntimeBridge(i){return x(Reflect.get(i,"__player"))}_injectRuntime(){var i,e,t,s;this._runtimeInjected=!0;try{const n=this._iframe.contentDocument;if(!n)return;const o=n.createElement("script");o.src=((e=(i=this._callbacks).resolveRuntimeUrl)==null?void 0:e.call(i))??W,this._runtimeScript=o,o.onerror=()=>{this._runtimeScript!==o||this._iframe.contentDocument!==n||(this.stop(),this._failure={document:n},this._callbacks.onError("HyperFrames runtime failed to load from "+o.src))},(n.head||n.documentElement).appendChild(o),(s=(t=this._callbacks).onRuntimeInjected)==null||s.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(i){var a,c;if(this.hasRuntimeBridge(i))return null;const e=Reflect.get(i,"__timelines");if(!x(e))return null;const t=Object.keys(e);if(t.length===0)return null;const s=(c=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:c.getAttribute("data-composition-id"),n=s&&s in e?s:t[t.length-1],o=e[n];return Be(o)?o:null}_resolvePlaybackDurationAdapter(i){const e=Reflect.get(i,"__player");if(je(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const t=this._resolveDirectTimelineAdapterFromWindow(i);return t?{kind:"direct-timeline",timeline:t,getDuration:()=>t.duration()}:null}}const Ze=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;
@@ -1,4 +1,4 @@
1
- import{n as Qi}from"./index-ueMRyAJ2.js";/*!
1
+ import{n as Qi}from"./index-mdtW0Ug-.js";/*!
2
2
  * Copyright (c) 2026-present, Vanilagy and contributors
3
3
  *
4
4
  * This Source Code Form is subject to the terms of the Mozilla Public