@videojs/html 10.0.0-beta.2 → 10.0.0-beta.21

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 (972) hide show
  1. package/cdn/abort-C9UiBdVU.js +2 -0
  2. package/cdn/abort-C9UiBdVU.js.map +1 -0
  3. package/cdn/abort-DsTff8mS.js +22 -0
  4. package/cdn/abort-DsTff8mS.js.map +1 -0
  5. package/cdn/audio-minimal-ui.dev.d.ts +1 -0
  6. package/cdn/audio-minimal-ui.dev.js +4 -0
  7. package/cdn/audio-minimal-ui.js +1 -0
  8. package/cdn/audio-minimal.dev.d.ts +1 -0
  9. package/cdn/audio-minimal.dev.js +93 -5331
  10. package/cdn/audio-minimal.dev.js.map +1 -1
  11. package/cdn/audio-minimal.js +1 -24
  12. package/cdn/audio-minimal.js.map +1 -1
  13. package/cdn/audio-ui.dev.d.ts +1 -0
  14. package/cdn/audio-ui.dev.js +4 -0
  15. package/cdn/audio-ui.js +1 -0
  16. package/cdn/audio.dev.d.ts +1 -0
  17. package/cdn/audio.dev.js +107 -5325
  18. package/cdn/audio.dev.js.map +1 -1
  19. package/cdn/audio.js +1 -24
  20. package/cdn/audio.js.map +1 -1
  21. package/cdn/background.dev.d.ts +1 -0
  22. package/cdn/background.dev.js +105 -2017
  23. package/cdn/background.dev.js.map +1 -1
  24. package/cdn/background.js +1 -18
  25. package/cdn/background.js.map +1 -1
  26. package/cdn/compounds-CM_NP-ej.js +4154 -0
  27. package/cdn/compounds-CM_NP-ej.js.map +1 -0
  28. package/cdn/compounds-Vvz-YfXP.js +8 -0
  29. package/cdn/compounds-Vvz-YfXP.js.map +1 -0
  30. package/cdn/context-0rI_P6jf.js +107 -0
  31. package/cdn/context-0rI_P6jf.js.map +1 -0
  32. package/cdn/context-CEFisYD0.js +14 -0
  33. package/cdn/context-CEFisYD0.js.map +1 -0
  34. package/cdn/create-player-Bi6WUwDZ.js +2182 -0
  35. package/cdn/create-player-Bi6WUwDZ.js.map +1 -0
  36. package/cdn/create-player-CKuX8YI5.js +7 -0
  37. package/cdn/create-player-CKuX8YI5.js.map +1 -0
  38. package/cdn/default-C8KsZ0zK.js +2 -0
  39. package/cdn/default-C8KsZ0zK.js.map +1 -0
  40. package/cdn/default-XHZAb7gP.js +28 -0
  41. package/cdn/default-XHZAb7gP.js.map +1 -0
  42. package/cdn/hls-BotloEPN.js +28632 -0
  43. package/cdn/hls-BotloEPN.js.map +1 -0
  44. package/cdn/hls-CBpGTZXU.js +41 -0
  45. package/cdn/hls-CBpGTZXU.js.map +1 -0
  46. package/cdn/hotkey-element-317kwVH5.js +369 -0
  47. package/cdn/hotkey-element-317kwVH5.js.map +1 -0
  48. package/cdn/hotkey-element-DRGCbVj9.js +2 -0
  49. package/cdn/hotkey-element-DRGCbVj9.js.map +1 -0
  50. package/cdn/listen-CJT7C4kM.js +9 -0
  51. package/cdn/listen-CJT7C4kM.js.map +1 -0
  52. package/cdn/listen-DFX-0NbX.js +2 -0
  53. package/cdn/listen-DFX-0NbX.js.map +1 -0
  54. package/cdn/media/dash-video.dev.d.ts +1 -0
  55. package/cdn/media/dash-video.dev.js +39153 -0
  56. package/cdn/media/dash-video.dev.js.map +1 -0
  57. package/cdn/media/dash-video.js +21 -0
  58. package/cdn/media/dash-video.js.map +1 -0
  59. package/cdn/media/hls-video.dev.d.ts +1 -0
  60. package/cdn/media/hls-video.dev.js +12 -28712
  61. package/cdn/media/hls-video.dev.js.map +1 -1
  62. package/cdn/media/hls-video.js +1 -82
  63. package/cdn/media/hls-video.js.map +1 -1
  64. package/cdn/media/mux-audio.dev.d.ts +1 -0
  65. package/cdn/media/mux-audio.dev.js +29 -0
  66. package/cdn/media/mux-audio.dev.js.map +1 -0
  67. package/cdn/media/mux-audio.js +2 -0
  68. package/cdn/media/mux-audio.js.map +1 -0
  69. package/cdn/media/mux-video.dev.d.ts +1 -0
  70. package/cdn/media/mux-video.dev.js +29 -0
  71. package/cdn/media/mux-video.dev.js.map +1 -0
  72. package/cdn/media/mux-video.js +2 -0
  73. package/cdn/media/mux-video.js.map +1 -0
  74. package/cdn/media/native-hls-video.dev.d.ts +1 -0
  75. package/cdn/media/native-hls-video.dev.js +19 -0
  76. package/cdn/media/native-hls-video.dev.js.map +1 -0
  77. package/cdn/media/native-hls-video.js +2 -0
  78. package/cdn/media/native-hls-video.js.map +1 -0
  79. package/cdn/media/simple-hls-video.dev.d.ts +1 -0
  80. package/cdn/media/simple-hls-video.dev.js +2887 -2605
  81. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  82. package/cdn/media/simple-hls-video.js +58 -43
  83. package/cdn/media/simple-hls-video.js.map +1 -1
  84. package/cdn/media-attach-mixin-C2wz0Qbd.js +2 -0
  85. package/cdn/media-attach-mixin-C2wz0Qbd.js.map +1 -0
  86. package/cdn/media-attach-mixin-CYoNe7Sh.js +67 -0
  87. package/cdn/media-attach-mixin-CYoNe7Sh.js.map +1 -0
  88. package/cdn/minimal-BnDnlwbj.js +28 -0
  89. package/cdn/minimal-BnDnlwbj.js.map +1 -0
  90. package/cdn/minimal-CqBxBoLe.js +2 -0
  91. package/cdn/minimal-CqBxBoLe.js.map +1 -0
  92. package/cdn/minimal-ui-C_G24FML.js +2 -0
  93. package/cdn/minimal-ui-C_G24FML.js.map +1 -0
  94. package/cdn/minimal-ui-CroDYUGf.js +2 -0
  95. package/cdn/minimal-ui-CroDYUGf.js.map +1 -0
  96. package/cdn/minimal-ui-DhxN21v5.js +22 -0
  97. package/cdn/minimal-ui-DhxN21v5.js.map +1 -0
  98. package/cdn/minimal-ui-cy2oEbFm.js +28 -0
  99. package/cdn/minimal-ui-cy2oEbFm.js.map +1 -0
  100. package/cdn/mux-B5K6kOzg.js +3072 -0
  101. package/cdn/mux-B5K6kOzg.js.map +1 -0
  102. package/cdn/mux-DJhfbcCw.js +25 -0
  103. package/cdn/mux-DJhfbcCw.js.map +1 -0
  104. package/cdn/native-hls-CU2F7L5C.js +123 -0
  105. package/cdn/native-hls-CU2F7L5C.js.map +1 -0
  106. package/cdn/native-hls-DKcYYWRt.js +2 -0
  107. package/cdn/native-hls-DKcYYWRt.js.map +1 -0
  108. package/cdn/pick-CERGq1No.js +2 -0
  109. package/cdn/pick-CERGq1No.js.map +1 -0
  110. package/cdn/pick-D-wCJ3iA.js +23 -0
  111. package/cdn/pick-D-wCJ3iA.js.map +1 -0
  112. package/cdn/player-BK35-ndY.js +2 -0
  113. package/cdn/player-BK35-ndY.js.map +1 -0
  114. package/cdn/player-C7ajkBi4.js +2 -0
  115. package/cdn/player-C7ajkBi4.js.map +1 -0
  116. package/cdn/player-CatrGW7l.js +382 -0
  117. package/cdn/player-CatrGW7l.js.map +1 -0
  118. package/cdn/player-xstFHOgW.js +16 -0
  119. package/cdn/player-xstFHOgW.js.map +1 -0
  120. package/cdn/shadow-styles-BYZ6q3Q4.js +3 -0
  121. package/cdn/shadow-styles-BYZ6q3Q4.js.map +1 -0
  122. package/cdn/shadow-styles-DKXFMmyD.js +41 -0
  123. package/cdn/shadow-styles-DKXFMmyD.js.map +1 -0
  124. package/cdn/shallow-equal-Daj3-_LC.js +15 -0
  125. package/cdn/shallow-equal-Daj3-_LC.js.map +1 -0
  126. package/cdn/shallow-equal-xh6Wj-hj.js +2 -0
  127. package/cdn/shallow-equal-xh6Wj-hj.js.map +1 -0
  128. package/cdn/skin-element-BGP23sop.js +2 -0
  129. package/cdn/skin-element-BGP23sop.js.map +1 -0
  130. package/cdn/skin-element-CDUkmCtS.js +55 -0
  131. package/cdn/skin-element-CDUkmCtS.js.map +1 -0
  132. package/cdn/ui-AFHQtrqa.js +25 -0
  133. package/cdn/ui-AFHQtrqa.js.map +1 -0
  134. package/cdn/ui-B7vt9mp-.js +2 -0
  135. package/cdn/ui-B7vt9mp-.js.map +1 -0
  136. package/cdn/ui-Em9rF9Ah.js +31 -0
  137. package/cdn/ui-Em9rF9Ah.js.map +1 -0
  138. package/cdn/ui-QHwo6iyo.js +2 -0
  139. package/cdn/ui-QHwo6iyo.js.map +1 -0
  140. package/cdn/video-host-CPRJVRi3.js +47 -0
  141. package/cdn/video-host-CPRJVRi3.js.map +1 -0
  142. package/cdn/video-host-ycP7ckxU.js +410 -0
  143. package/cdn/video-host-ycP7ckxU.js.map +1 -0
  144. package/cdn/video-minimal-ui.dev.d.ts +1 -0
  145. package/cdn/video-minimal-ui.dev.js +4 -0
  146. package/cdn/video-minimal-ui.js +1 -0
  147. package/cdn/video-minimal.dev.d.ts +1 -0
  148. package/cdn/video-minimal.dev.js +114 -5669
  149. package/cdn/video-minimal.dev.js.map +1 -1
  150. package/cdn/video-minimal.js +1 -24
  151. package/cdn/video-minimal.js.map +1 -1
  152. package/cdn/video-ui.dev.d.ts +1 -0
  153. package/cdn/video-ui.dev.js +4 -0
  154. package/cdn/video-ui.js +1 -0
  155. package/cdn/video.dev.d.ts +1 -0
  156. package/cdn/video.dev.js +136 -5739
  157. package/cdn/video.dev.js.map +1 -1
  158. package/cdn/video.js +1 -24
  159. package/cdn/video.js.map +1 -1
  160. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +2 -2
  161. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  162. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +2 -2
  163. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  164. package/dist/default/_virtual/inline-css_src/define/background/skin.js +6 -0
  165. package/dist/default/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  166. package/dist/default/_virtual/inline-css_src/define/base.js +6 -0
  167. package/dist/default/_virtual/inline-css_src/define/base.js.map +1 -0
  168. package/dist/default/_virtual/inline-css_src/define/shared.js +6 -0
  169. package/dist/default/_virtual/inline-css_src/define/shared.js.map +1 -0
  170. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +2 -2
  171. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  172. package/dist/default/_virtual/inline-css_src/define/video/skin.js +2 -2
  173. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  174. package/dist/default/define/audio/minimal-skin.css +324 -182
  175. package/dist/default/define/audio/minimal-skin.js +10 -19
  176. package/dist/default/define/audio/minimal-skin.js.map +1 -1
  177. package/dist/default/define/audio/minimal-skin.tailwind.js +11 -19
  178. package/dist/default/define/audio/minimal-skin.tailwind.js.map +1 -1
  179. package/dist/default/define/audio/minimal-ui.js +28 -0
  180. package/dist/default/define/audio/minimal-ui.js.map +1 -0
  181. package/dist/default/define/audio/player.js +1 -2
  182. package/dist/default/define/audio/player.js.map +1 -1
  183. package/dist/default/define/audio/skin.css +307 -174
  184. package/dist/default/define/audio/skin.js +10 -19
  185. package/dist/default/define/audio/skin.js.map +1 -1
  186. package/dist/default/define/audio/skin.tailwind.js +13 -21
  187. package/dist/default/define/audio/skin.tailwind.js.map +1 -1
  188. package/dist/default/define/audio/ui.js +32 -0
  189. package/dist/default/define/audio/ui.js.map +1 -0
  190. package/dist/default/define/background/player.js +1 -2
  191. package/dist/default/define/background/player.js.map +1 -1
  192. package/dist/default/define/background/skin.css +1 -1
  193. package/dist/default/define/background/skin.js +6 -4
  194. package/dist/default/define/background/skin.js.map +1 -1
  195. package/dist/default/define/background/video.js +1 -2
  196. package/dist/default/define/base.css +27 -0
  197. package/dist/default/define/media/background-video.js +1 -2
  198. package/dist/default/define/media/background-video.js.map +1 -1
  199. package/dist/default/define/media/container.js +1 -2
  200. package/dist/default/define/media/container.js.map +1 -1
  201. package/dist/default/define/media/dash-video.js +13 -0
  202. package/dist/default/define/media/dash-video.js.map +1 -0
  203. package/dist/default/define/media/hls-video.js +1 -2
  204. package/dist/default/define/media/hls-video.js.map +1 -1
  205. package/dist/default/define/media/mux-audio.js +13 -0
  206. package/dist/default/define/media/mux-audio.js.map +1 -0
  207. package/dist/default/define/media/mux-video.js +13 -0
  208. package/dist/default/define/media/mux-video.js.map +1 -0
  209. package/dist/default/define/media/native-hls-video.js +13 -0
  210. package/dist/default/define/media/native-hls-video.js.map +1 -0
  211. package/dist/default/define/media/simple-hls-video.js +3 -3
  212. package/dist/default/define/media/simple-hls-video.js.map +1 -1
  213. package/dist/default/define/safe-define.js +4 -2
  214. package/dist/default/define/safe-define.js.map +1 -1
  215. package/dist/default/define/shared.css +14 -0
  216. package/dist/default/define/skin-element.js +33 -0
  217. package/dist/default/define/skin-element.js.map +1 -0
  218. package/dist/default/define/ui/alert-dialog-close.js +1 -2
  219. package/dist/default/define/ui/alert-dialog-close.js.map +1 -1
  220. package/dist/default/define/ui/alert-dialog-description.js +1 -2
  221. package/dist/default/define/ui/alert-dialog-description.js.map +1 -1
  222. package/dist/default/define/ui/alert-dialog-title.js +1 -2
  223. package/dist/default/define/ui/alert-dialog-title.js.map +1 -1
  224. package/dist/default/define/ui/alert-dialog.js +1 -2
  225. package/dist/default/define/ui/alert-dialog.js.map +1 -1
  226. package/dist/default/define/ui/buffering-indicator.js +1 -2
  227. package/dist/default/define/ui/buffering-indicator.js.map +1 -1
  228. package/dist/default/define/ui/captions-button.js +3 -3
  229. package/dist/default/define/ui/captions-button.js.map +1 -1
  230. package/dist/default/define/ui/compounds.js +62 -0
  231. package/dist/default/define/ui/compounds.js.map +1 -0
  232. package/dist/default/define/ui/controls-group.js +1 -2
  233. package/dist/default/define/ui/controls-group.js.map +1 -1
  234. package/dist/default/define/ui/controls.js +3 -7
  235. package/dist/default/define/ui/controls.js.map +1 -1
  236. package/dist/default/define/ui/error-dialog.js +6 -0
  237. package/dist/default/define/ui/error-dialog.js.map +1 -0
  238. package/dist/default/define/ui/fullscreen-button.js +1 -2
  239. package/dist/default/define/ui/fullscreen-button.js.map +1 -1
  240. package/dist/default/define/ui/hotkey.js +7 -0
  241. package/dist/default/define/ui/hotkey.js.map +1 -0
  242. package/dist/default/define/ui/mute-button.js +1 -2
  243. package/dist/default/define/ui/mute-button.js.map +1 -1
  244. package/dist/default/define/ui/pip-button.js +1 -2
  245. package/dist/default/define/ui/pip-button.js.map +1 -1
  246. package/dist/default/define/ui/play-button.js +1 -2
  247. package/dist/default/define/ui/play-button.js.map +1 -1
  248. package/dist/default/define/ui/playback-rate-button.js +1 -2
  249. package/dist/default/define/ui/playback-rate-button.js.map +1 -1
  250. package/dist/default/define/ui/popover.js +1 -2
  251. package/dist/default/define/ui/popover.js.map +1 -1
  252. package/dist/default/define/ui/poster.js +1 -2
  253. package/dist/default/define/ui/poster.js.map +1 -1
  254. package/dist/default/define/ui/seek-button.js +1 -2
  255. package/dist/default/define/ui/seek-button.js.map +1 -1
  256. package/dist/default/define/ui/slider-buffer.js +1 -2
  257. package/dist/default/define/ui/slider-buffer.js.map +1 -1
  258. package/dist/default/define/ui/slider-fill.js +1 -2
  259. package/dist/default/define/ui/slider-fill.js.map +1 -1
  260. package/dist/default/define/ui/slider-thumb.js +1 -2
  261. package/dist/default/define/ui/slider-thumb.js.map +1 -1
  262. package/dist/default/define/ui/slider-thumbnail.js +1 -2
  263. package/dist/default/define/ui/slider-thumbnail.js.map +1 -1
  264. package/dist/default/define/ui/slider-track.js +1 -2
  265. package/dist/default/define/ui/slider-track.js.map +1 -1
  266. package/dist/default/define/ui/slider-value.js +1 -2
  267. package/dist/default/define/ui/slider-value.js.map +1 -1
  268. package/dist/default/define/ui/slider.js +3 -15
  269. package/dist/default/define/ui/slider.js.map +1 -1
  270. package/dist/default/define/ui/thumbnail.js +1 -2
  271. package/dist/default/define/ui/thumbnail.js.map +1 -1
  272. package/dist/default/define/ui/time-group.js +1 -2
  273. package/dist/default/define/ui/time-group.js.map +1 -1
  274. package/dist/default/define/ui/time-separator.js +1 -2
  275. package/dist/default/define/ui/time-separator.js.map +1 -1
  276. package/dist/default/define/ui/time-slider.js +3 -19
  277. package/dist/default/define/ui/time-slider.js.map +1 -1
  278. package/dist/default/define/ui/time.js +3 -9
  279. package/dist/default/define/ui/time.js.map +1 -1
  280. package/dist/default/define/ui/tooltip-group.js +1 -2
  281. package/dist/default/define/ui/tooltip-group.js.map +1 -1
  282. package/dist/default/define/ui/tooltip.js +1 -2
  283. package/dist/default/define/ui/tooltip.js.map +1 -1
  284. package/dist/default/define/ui/volume-slider.js +3 -15
  285. package/dist/default/define/ui/volume-slider.js.map +1 -1
  286. package/dist/default/define/video/minimal-skin.css +618 -328
  287. package/dist/default/define/video/minimal-skin.js +10 -23
  288. package/dist/default/define/video/minimal-skin.js.map +1 -1
  289. package/dist/default/define/video/minimal-skin.tailwind.js +13 -30
  290. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  291. package/dist/default/define/video/minimal-ui.js +39 -0
  292. package/dist/default/define/video/minimal-ui.js.map +1 -0
  293. package/dist/default/define/video/player.js +1 -2
  294. package/dist/default/define/video/player.js.map +1 -1
  295. package/dist/default/define/video/skin.css +586 -311
  296. package/dist/default/define/video/skin.js +10 -24
  297. package/dist/default/define/video/skin.js.map +1 -1
  298. package/dist/default/define/video/skin.tailwind.js +13 -28
  299. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  300. package/dist/default/define/video/ui.js +43 -0
  301. package/dist/default/define/video/ui.js.map +1 -0
  302. package/dist/default/icons/dist/render/default/index.js +3 -2
  303. package/dist/default/icons/dist/render/default/index.js.map +1 -1
  304. package/dist/default/icons/dist/render/minimal/index.js +3 -2
  305. package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
  306. package/dist/default/index.js +10 -5
  307. package/dist/default/media/background-video/index.js +6 -3
  308. package/dist/default/media/background-video/index.js.map +1 -1
  309. package/dist/default/media/container-element.js +22 -4
  310. package/dist/default/media/container-element.js.map +1 -1
  311. package/dist/default/media/dash-video/index.js +9 -0
  312. package/dist/default/media/dash-video/index.js.map +1 -0
  313. package/dist/default/media/hls-video/index.js +12 -19
  314. package/dist/default/media/hls-video/index.js.map +1 -1
  315. package/dist/default/media/mux-audio/index.js +18 -0
  316. package/dist/default/media/mux-audio/index.js.map +1 -0
  317. package/dist/default/media/mux-video/index.js +18 -0
  318. package/dist/default/media/mux-video/index.js.map +1 -0
  319. package/dist/default/media/native-hls-video/index.js +9 -0
  320. package/dist/default/media/native-hls-video/index.js.map +1 -0
  321. package/dist/default/media/simple-hls-video/index.js +5 -17
  322. package/dist/default/media/simple-hls-video/index.js.map +1 -1
  323. package/dist/default/player/context.js +7 -4
  324. package/dist/default/player/context.js.map +1 -1
  325. package/dist/default/player/create-player.js +12 -5
  326. package/dist/default/player/create-player.js.map +1 -1
  327. package/dist/default/player/player-controller.js +1 -2
  328. package/dist/default/player/player-controller.js.map +1 -1
  329. package/dist/default/presets/audio.js +1 -2
  330. package/dist/default/presets/background.js +1 -2
  331. package/dist/default/presets/video.js +1 -2
  332. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +17 -38
  333. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  334. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  335. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  336. package/dist/default/skins/dist/default/default/tailwind/components/button-group.js +7 -0
  337. package/dist/default/skins/dist/default/default/tailwind/components/button-group.js.map +1 -0
  338. package/dist/default/skins/dist/default/default/tailwind/components/button.js +5 -5
  339. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  340. package/dist/default/skins/dist/default/default/tailwind/components/controls.js +2 -3
  341. package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  342. package/dist/default/skins/dist/default/default/tailwind/components/error.js +4 -5
  343. package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  344. package/dist/default/skins/dist/default/default/tailwind/components/icon.js +1 -2
  345. package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  346. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +2 -3
  347. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  348. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js +1 -1
  349. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -1
  350. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +5 -6
  351. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  352. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +15 -0
  353. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  354. package/dist/default/skins/dist/default/default/tailwind/components/preview.js +12 -0
  355. package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  356. package/dist/default/skins/dist/default/default/tailwind/components/root.js +2 -3
  357. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  358. package/dist/default/skins/dist/default/default/tailwind/components/seek.js +2 -3
  359. package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  360. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +2 -3
  361. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  362. package/dist/default/skins/dist/default/default/tailwind/components/surface.js +2 -3
  363. package/dist/default/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  364. package/dist/default/skins/dist/default/default/tailwind/components/time.js +1 -1
  365. package/dist/default/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  366. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +41 -26
  367. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  368. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +18 -33
  369. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  370. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  371. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  372. package/dist/default/skins/dist/default/minimal/tailwind/components/button-group.js +1 -2
  373. package/dist/default/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -1
  374. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +5 -5
  375. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  376. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +2 -3
  377. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  378. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +4 -5
  379. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  380. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +1 -2
  381. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  382. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +2 -3
  383. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  384. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  385. package/dist/default/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  386. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +5 -5
  387. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  388. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +15 -0
  389. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  390. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +13 -0
  391. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  392. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +2 -3
  393. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  394. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +2 -3
  395. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  396. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +2 -3
  397. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  398. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js +5 -6
  399. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  400. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +45 -24
  401. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  402. package/dist/{dev/skins/dist/default/default/tailwind/components → default/skins/dist/default/shared/tailwind}/icon-state.js +7 -2
  403. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  404. package/dist/default/store/container-mixin.js +17 -62
  405. package/dist/default/store/container-mixin.js.map +1 -1
  406. package/dist/default/store/media-attach-mixin.js +44 -0
  407. package/dist/default/store/media-attach-mixin.js.map +1 -0
  408. package/dist/default/store/provider-mixin.js +100 -11
  409. package/dist/default/store/provider-mixin.js.map +1 -1
  410. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js +1 -2
  411. package/dist/default/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  412. package/dist/default/ui/alert-dialog/alert-dialog-description-element.js +1 -2
  413. package/dist/default/ui/alert-dialog/alert-dialog-description-element.js.map +1 -1
  414. package/dist/default/ui/alert-dialog/alert-dialog-element.js +2 -2
  415. package/dist/default/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  416. package/dist/default/ui/alert-dialog/alert-dialog-title-element.js +1 -2
  417. package/dist/default/ui/alert-dialog/alert-dialog-title-element.js.map +1 -1
  418. package/dist/default/ui/alert-dialog/context.js +2 -5
  419. package/dist/default/ui/alert-dialog/context.js.map +1 -1
  420. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +2 -2
  421. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  422. package/dist/default/ui/captions-button/captions-button-element.js +2 -2
  423. package/dist/default/ui/captions-button/captions-button-element.js.map +1 -1
  424. package/dist/default/ui/context-part-element.js +1 -2
  425. package/dist/default/ui/context-part-element.js.map +1 -1
  426. package/dist/default/ui/controls/context.js +2 -5
  427. package/dist/default/ui/controls/context.js.map +1 -1
  428. package/dist/default/ui/controls/controls-element.js +1 -2
  429. package/dist/default/ui/controls/controls-element.js.map +1 -1
  430. package/dist/default/ui/controls/controls-group-element.js +1 -2
  431. package/dist/default/ui/controls/controls-group-element.js.map +1 -1
  432. package/dist/default/ui/error-dialog/error-dialog-element.js +77 -0
  433. package/dist/default/ui/error-dialog/error-dialog-element.js.map +1 -0
  434. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js +2 -2
  435. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
  436. package/dist/default/ui/gesture/gesture-element.js +84 -0
  437. package/dist/default/ui/gesture/gesture-element.js.map +1 -0
  438. package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
  439. package/dist/default/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
  440. package/dist/default/ui/hotkey/hotkey-element.js +81 -0
  441. package/dist/default/ui/hotkey/hotkey-element.js.map +1 -0
  442. package/dist/default/ui/media-button-element.js +17 -3
  443. package/dist/default/ui/media-button-element.js.map +1 -1
  444. package/dist/default/ui/media-element.js +1 -2
  445. package/dist/default/ui/media-element.js.map +1 -1
  446. package/dist/default/ui/media-ui-element.js +1 -2
  447. package/dist/default/ui/media-ui-element.js.map +1 -1
  448. package/dist/default/ui/mute-button/mute-button-element.js +2 -2
  449. package/dist/default/ui/mute-button/mute-button-element.js.map +1 -1
  450. package/dist/default/ui/pip-button/pip-button-element.js +2 -2
  451. package/dist/default/ui/pip-button/pip-button-element.js.map +1 -1
  452. package/dist/default/ui/play-button/play-button-element.js +2 -2
  453. package/dist/default/ui/play-button/play-button-element.js.map +1 -1
  454. package/dist/default/ui/playback-rate-button/playback-rate-button-element.js +1 -2
  455. package/dist/default/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
  456. package/dist/default/ui/popover/popover-element.js +13 -11
  457. package/dist/default/ui/popover/popover-element.js.map +1 -1
  458. package/dist/default/ui/position-controller.js +76 -0
  459. package/dist/default/ui/position-controller.js.map +1 -0
  460. package/dist/default/ui/poster/poster-element.js +1 -2
  461. package/dist/default/ui/poster/poster-element.js.map +1 -1
  462. package/dist/default/ui/seek-button/seek-button-element.js +1 -2
  463. package/dist/default/ui/seek-button/seek-button-element.js.map +1 -1
  464. package/dist/default/ui/slider/context.js +2 -5
  465. package/dist/default/ui/slider/context.js.map +1 -1
  466. package/dist/default/ui/slider/slider-buffer-element.js +1 -2
  467. package/dist/default/ui/slider/slider-buffer-element.js.map +1 -1
  468. package/dist/default/ui/slider/slider-element.js +2 -3
  469. package/dist/default/ui/slider/slider-element.js.map +1 -1
  470. package/dist/default/ui/slider/slider-fill-element.js +1 -2
  471. package/dist/default/ui/slider/slider-fill-element.js.map +1 -1
  472. package/dist/default/ui/slider/slider-preview-element.js +2 -3
  473. package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
  474. package/dist/default/ui/slider/slider-thumb-element.js +1 -2
  475. package/dist/default/ui/slider/slider-thumb-element.js.map +1 -1
  476. package/dist/default/ui/slider/slider-thumbnail-element.js +1 -2
  477. package/dist/default/ui/slider/slider-thumbnail-element.js.map +1 -1
  478. package/dist/default/ui/slider/slider-track-element.js +1 -2
  479. package/dist/default/ui/slider/slider-track-element.js.map +1 -1
  480. package/dist/default/ui/slider/slider-value-element.js +1 -2
  481. package/dist/default/ui/slider/slider-value-element.js.map +1 -1
  482. package/dist/default/ui/thumbnail/thumbnail-element.js +1 -2
  483. package/dist/default/ui/thumbnail/thumbnail-element.js.map +1 -1
  484. package/dist/default/ui/time/time-element.js +13 -12
  485. package/dist/default/ui/time/time-element.js.map +1 -1
  486. package/dist/default/ui/time/time-group-element.js +1 -2
  487. package/dist/default/ui/time/time-group-element.js.map +1 -1
  488. package/dist/default/ui/time/time-separator-element.js +1 -2
  489. package/dist/default/ui/time/time-separator-element.js.map +1 -1
  490. package/dist/default/ui/time-slider/time-slider-element.js +7 -8
  491. package/dist/default/ui/time-slider/time-slider-element.js.map +1 -1
  492. package/dist/default/ui/tooltip/context.js +2 -5
  493. package/dist/default/ui/tooltip/context.js.map +1 -1
  494. package/dist/default/ui/tooltip/tooltip-element.js +25 -18
  495. package/dist/default/ui/tooltip/tooltip-element.js.map +1 -1
  496. package/dist/default/ui/tooltip/tooltip-group-element.js +5 -3
  497. package/dist/default/ui/tooltip/tooltip-group-element.js.map +1 -1
  498. package/dist/default/ui/volume-slider/volume-slider-element.js +27 -20
  499. package/dist/default/ui/volume-slider/volume-slider-element.js.map +1 -1
  500. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +2 -2
  501. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  502. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +2 -2
  503. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  504. package/dist/dev/_virtual/inline-css_src/define/background/skin.js +6 -0
  505. package/dist/dev/_virtual/inline-css_src/define/background/skin.js.map +1 -0
  506. package/dist/dev/_virtual/inline-css_src/define/base.js +6 -0
  507. package/dist/dev/_virtual/inline-css_src/define/base.js.map +1 -0
  508. package/dist/dev/_virtual/inline-css_src/define/shared.js +6 -0
  509. package/dist/dev/_virtual/inline-css_src/define/shared.js.map +1 -0
  510. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +2 -2
  511. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  512. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +2 -2
  513. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  514. package/dist/dev/define/audio/minimal-skin.css +324 -182
  515. package/dist/dev/define/audio/minimal-skin.d.ts +6 -10
  516. package/dist/dev/define/audio/minimal-skin.d.ts.map +1 -1
  517. package/dist/dev/define/audio/minimal-skin.js +85 -82
  518. package/dist/dev/define/audio/minimal-skin.js.map +1 -1
  519. package/dist/dev/define/audio/minimal-skin.tailwind.d.ts +4 -10
  520. package/dist/dev/define/audio/minimal-skin.tailwind.d.ts.map +1 -1
  521. package/dist/dev/define/audio/minimal-skin.tailwind.js +86 -84
  522. package/dist/dev/define/audio/minimal-skin.tailwind.js.map +1 -1
  523. package/dist/dev/define/audio/minimal-ui.d.ts +1 -0
  524. package/dist/dev/define/audio/minimal-ui.js +28 -0
  525. package/dist/dev/define/audio/minimal-ui.js.map +1 -0
  526. package/dist/dev/define/audio/player.js +1 -2
  527. package/dist/dev/define/audio/player.js.map +1 -1
  528. package/dist/dev/define/audio/skin.css +307 -174
  529. package/dist/dev/define/audio/skin.d.ts +6 -10
  530. package/dist/dev/define/audio/skin.d.ts.map +1 -1
  531. package/dist/dev/define/audio/skin.js +97 -74
  532. package/dist/dev/define/audio/skin.js.map +1 -1
  533. package/dist/dev/define/audio/skin.tailwind.d.ts +4 -10
  534. package/dist/dev/define/audio/skin.tailwind.d.ts.map +1 -1
  535. package/dist/dev/define/audio/skin.tailwind.js +84 -78
  536. package/dist/dev/define/audio/skin.tailwind.js.map +1 -1
  537. package/dist/dev/define/audio/ui.d.ts +1 -0
  538. package/dist/dev/define/audio/ui.js +32 -0
  539. package/dist/dev/define/audio/ui.js.map +1 -0
  540. package/dist/dev/define/background/player.js +1 -2
  541. package/dist/dev/define/background/player.js.map +1 -1
  542. package/dist/dev/define/background/skin.css +1 -1
  543. package/dist/dev/define/background/skin.d.ts.map +1 -1
  544. package/dist/dev/define/background/skin.js +8 -4
  545. package/dist/dev/define/background/skin.js.map +1 -1
  546. package/dist/dev/define/background/video.js +1 -2
  547. package/dist/dev/define/base.css +27 -0
  548. package/dist/dev/define/media/background-video.js +1 -2
  549. package/dist/dev/define/media/background-video.js.map +1 -1
  550. package/dist/dev/define/media/container.js +1 -2
  551. package/dist/dev/define/media/container.js.map +1 -1
  552. package/dist/dev/define/media/dash-video.d.ts +14 -0
  553. package/dist/dev/define/media/dash-video.d.ts.map +1 -0
  554. package/dist/dev/define/media/dash-video.js +13 -0
  555. package/dist/dev/define/media/dash-video.js.map +1 -0
  556. package/dist/dev/define/media/hls-video.js +1 -2
  557. package/dist/dev/define/media/hls-video.js.map +1 -1
  558. package/dist/dev/define/media/mux-audio.d.ts +14 -0
  559. package/dist/dev/define/media/mux-audio.d.ts.map +1 -0
  560. package/dist/dev/define/media/mux-audio.js +13 -0
  561. package/dist/dev/define/media/mux-audio.js.map +1 -0
  562. package/dist/dev/define/media/mux-video.d.ts +14 -0
  563. package/dist/dev/define/media/mux-video.d.ts.map +1 -0
  564. package/dist/dev/define/media/mux-video.js +13 -0
  565. package/dist/dev/define/media/mux-video.js.map +1 -0
  566. package/dist/dev/define/media/native-hls-video.d.ts +14 -0
  567. package/dist/dev/define/media/native-hls-video.d.ts.map +1 -0
  568. package/dist/dev/define/media/native-hls-video.js +13 -0
  569. package/dist/dev/define/media/native-hls-video.js.map +1 -0
  570. package/dist/dev/define/media/simple-hls-video.d.ts.map +1 -1
  571. package/dist/dev/define/media/simple-hls-video.js +3 -3
  572. package/dist/dev/define/media/simple-hls-video.js.map +1 -1
  573. package/dist/dev/define/safe-define.js +4 -2
  574. package/dist/dev/define/safe-define.js.map +1 -1
  575. package/dist/dev/define/shared.css +14 -0
  576. package/dist/dev/define/skin-element.d.ts +18 -0
  577. package/dist/dev/define/skin-element.d.ts.map +1 -0
  578. package/dist/dev/define/skin-element.js +33 -0
  579. package/dist/dev/define/skin-element.js.map +1 -0
  580. package/dist/dev/define/ui/alert-dialog-close.js +1 -2
  581. package/dist/dev/define/ui/alert-dialog-close.js.map +1 -1
  582. package/dist/dev/define/ui/alert-dialog-description.js +1 -2
  583. package/dist/dev/define/ui/alert-dialog-description.js.map +1 -1
  584. package/dist/dev/define/ui/alert-dialog-title.js +1 -2
  585. package/dist/dev/define/ui/alert-dialog-title.js.map +1 -1
  586. package/dist/dev/define/ui/alert-dialog.js +1 -2
  587. package/dist/dev/define/ui/alert-dialog.js.map +1 -1
  588. package/dist/dev/define/ui/buffering-indicator.js +1 -2
  589. package/dist/dev/define/ui/buffering-indicator.js.map +1 -1
  590. package/dist/dev/define/ui/captions-button.d.ts.map +1 -1
  591. package/dist/dev/define/ui/captions-button.js +3 -3
  592. package/dist/dev/define/ui/captions-button.js.map +1 -1
  593. package/dist/dev/define/ui/compounds.d.ts +12 -0
  594. package/dist/dev/define/ui/compounds.d.ts.map +1 -0
  595. package/dist/dev/define/ui/compounds.js +62 -0
  596. package/dist/dev/define/ui/compounds.js.map +1 -0
  597. package/dist/dev/define/ui/controls-group.js +1 -2
  598. package/dist/dev/define/ui/controls-group.js.map +1 -1
  599. package/dist/dev/define/ui/controls.d.ts +2 -0
  600. package/dist/dev/define/ui/controls.d.ts.map +1 -1
  601. package/dist/dev/define/ui/controls.js +3 -7
  602. package/dist/dev/define/ui/controls.js.map +1 -1
  603. package/dist/dev/define/ui/error-dialog.d.ts +15 -0
  604. package/dist/dev/define/ui/error-dialog.d.ts.map +1 -0
  605. package/dist/dev/define/ui/error-dialog.js +6 -0
  606. package/dist/dev/define/ui/error-dialog.js.map +1 -0
  607. package/dist/dev/define/ui/fullscreen-button.js +1 -2
  608. package/dist/dev/define/ui/fullscreen-button.js.map +1 -1
  609. package/dist/dev/define/ui/hotkey.d.ts +9 -0
  610. package/dist/dev/define/ui/hotkey.d.ts.map +1 -0
  611. package/dist/dev/define/ui/hotkey.js +7 -0
  612. package/dist/dev/define/ui/hotkey.js.map +1 -0
  613. package/dist/dev/define/ui/mute-button.js +1 -2
  614. package/dist/dev/define/ui/mute-button.js.map +1 -1
  615. package/dist/dev/define/ui/pip-button.js +1 -2
  616. package/dist/dev/define/ui/pip-button.js.map +1 -1
  617. package/dist/dev/define/ui/play-button.js +1 -2
  618. package/dist/dev/define/ui/play-button.js.map +1 -1
  619. package/dist/dev/define/ui/playback-rate-button.js +1 -2
  620. package/dist/dev/define/ui/playback-rate-button.js.map +1 -1
  621. package/dist/dev/define/ui/popover.js +1 -2
  622. package/dist/dev/define/ui/popover.js.map +1 -1
  623. package/dist/dev/define/ui/poster.js +1 -2
  624. package/dist/dev/define/ui/poster.js.map +1 -1
  625. package/dist/dev/define/ui/seek-button.js +1 -2
  626. package/dist/dev/define/ui/seek-button.js.map +1 -1
  627. package/dist/dev/define/ui/slider-buffer.js +1 -2
  628. package/dist/dev/define/ui/slider-buffer.js.map +1 -1
  629. package/dist/dev/define/ui/slider-fill.js +1 -2
  630. package/dist/dev/define/ui/slider-fill.js.map +1 -1
  631. package/dist/dev/define/ui/slider-thumb.js +1 -2
  632. package/dist/dev/define/ui/slider-thumb.js.map +1 -1
  633. package/dist/dev/define/ui/slider-thumbnail.js +1 -2
  634. package/dist/dev/define/ui/slider-thumbnail.js.map +1 -1
  635. package/dist/dev/define/ui/slider-track.js +1 -2
  636. package/dist/dev/define/ui/slider-track.js.map +1 -1
  637. package/dist/dev/define/ui/slider-value.js +1 -2
  638. package/dist/dev/define/ui/slider-value.js.map +1 -1
  639. package/dist/dev/define/ui/slider.d.ts +10 -0
  640. package/dist/dev/define/ui/slider.d.ts.map +1 -1
  641. package/dist/dev/define/ui/slider.js +3 -15
  642. package/dist/dev/define/ui/slider.js.map +1 -1
  643. package/dist/dev/define/ui/thumbnail.js +1 -2
  644. package/dist/dev/define/ui/thumbnail.js.map +1 -1
  645. package/dist/dev/define/ui/time-group.js +1 -2
  646. package/dist/dev/define/ui/time-group.js.map +1 -1
  647. package/dist/dev/define/ui/time-separator.js +1 -2
  648. package/dist/dev/define/ui/time-separator.js.map +1 -1
  649. package/dist/dev/define/ui/time-slider.d.ts +14 -0
  650. package/dist/dev/define/ui/time-slider.d.ts.map +1 -1
  651. package/dist/dev/define/ui/time-slider.js +3 -19
  652. package/dist/dev/define/ui/time-slider.js.map +1 -1
  653. package/dist/dev/define/ui/time.d.ts +4 -0
  654. package/dist/dev/define/ui/time.d.ts.map +1 -1
  655. package/dist/dev/define/ui/time.js +3 -9
  656. package/dist/dev/define/ui/time.js.map +1 -1
  657. package/dist/dev/define/ui/tooltip-group.js +1 -2
  658. package/dist/dev/define/ui/tooltip-group.js.map +1 -1
  659. package/dist/dev/define/ui/tooltip.js +1 -2
  660. package/dist/dev/define/ui/tooltip.js.map +1 -1
  661. package/dist/dev/define/ui/volume-slider.d.ts +10 -0
  662. package/dist/dev/define/ui/volume-slider.d.ts.map +1 -1
  663. package/dist/dev/define/ui/volume-slider.js +3 -15
  664. package/dist/dev/define/ui/volume-slider.js.map +1 -1
  665. package/dist/dev/define/video/minimal-skin.css +618 -328
  666. package/dist/dev/define/video/minimal-skin.d.ts +6 -10
  667. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  668. package/dist/dev/define/video/minimal-skin.js +113 -119
  669. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  670. package/dist/dev/define/video/minimal-skin.tailwind.d.ts +4 -10
  671. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  672. package/dist/dev/define/video/minimal-skin.tailwind.js +105 -129
  673. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  674. package/dist/dev/define/video/minimal-ui.d.ts +1 -0
  675. package/dist/dev/define/video/minimal-ui.js +39 -0
  676. package/dist/dev/define/video/minimal-ui.js.map +1 -0
  677. package/dist/dev/define/video/player.js +1 -2
  678. package/dist/dev/define/video/player.js.map +1 -1
  679. package/dist/dev/define/video/skin.css +586 -311
  680. package/dist/dev/define/video/skin.d.ts +6 -10
  681. package/dist/dev/define/video/skin.d.ts.map +1 -1
  682. package/dist/dev/define/video/skin.js +134 -116
  683. package/dist/dev/define/video/skin.js.map +1 -1
  684. package/dist/dev/define/video/skin.tailwind.d.ts +4 -10
  685. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  686. package/dist/dev/define/video/skin.tailwind.js +101 -121
  687. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  688. package/dist/dev/define/video/ui.d.ts +1 -0
  689. package/dist/dev/define/video/ui.js +43 -0
  690. package/dist/dev/define/video/ui.js.map +1 -0
  691. package/dist/dev/icons/dist/render/default/index.js +3 -2
  692. package/dist/dev/icons/dist/render/default/index.js.map +1 -1
  693. package/dist/dev/icons/dist/render/minimal/index.js +3 -2
  694. package/dist/dev/icons/dist/render/minimal/index.js.map +1 -1
  695. package/dist/dev/index.d.ts +12 -5
  696. package/dist/dev/index.js +10 -5
  697. package/dist/dev/media/background-video/index.d.ts +8 -1
  698. package/dist/dev/media/background-video/index.d.ts.map +1 -1
  699. package/dist/dev/media/background-video/index.js +6 -3
  700. package/dist/dev/media/background-video/index.js.map +1 -1
  701. package/dist/dev/media/container-element.d.ts +3 -0
  702. package/dist/dev/media/container-element.d.ts.map +1 -1
  703. package/dist/dev/media/container-element.js +22 -4
  704. package/dist/dev/media/container-element.js.map +1 -1
  705. package/dist/dev/media/dash-video/index.d.ts +17 -0
  706. package/dist/dev/media/dash-video/index.d.ts.map +1 -0
  707. package/dist/dev/media/dash-video/index.js +9 -0
  708. package/dist/dev/media/dash-video/index.js.map +1 -0
  709. package/dist/dev/media/hls-video/index.d.ts +13 -6
  710. package/dist/dev/media/hls-video/index.d.ts.map +1 -1
  711. package/dist/dev/media/hls-video/index.js +12 -19
  712. package/dist/dev/media/hls-video/index.js.map +1 -1
  713. package/dist/dev/media/mux-audio/index.d.ts +19 -0
  714. package/dist/dev/media/mux-audio/index.d.ts.map +1 -0
  715. package/dist/dev/media/mux-audio/index.js +18 -0
  716. package/dist/dev/media/mux-audio/index.js.map +1 -0
  717. package/dist/dev/media/mux-video/index.d.ts +19 -0
  718. package/dist/dev/media/mux-video/index.d.ts.map +1 -0
  719. package/dist/dev/media/mux-video/index.js +18 -0
  720. package/dist/dev/media/mux-video/index.js.map +1 -0
  721. package/dist/dev/media/native-hls-video/index.d.ts +17 -0
  722. package/dist/dev/media/native-hls-video/index.d.ts.map +1 -0
  723. package/dist/dev/media/native-hls-video/index.js +9 -0
  724. package/dist/dev/media/native-hls-video/index.js.map +1 -0
  725. package/dist/dev/media/simple-hls-video/index.d.ts +12 -6
  726. package/dist/dev/media/simple-hls-video/index.d.ts.map +1 -1
  727. package/dist/dev/media/simple-hls-video/index.js +5 -17
  728. package/dist/dev/media/simple-hls-video/index.js.map +1 -1
  729. package/dist/dev/player/context.d.ts +19 -3
  730. package/dist/dev/player/context.d.ts.map +1 -1
  731. package/dist/dev/player/context.js +7 -4
  732. package/dist/dev/player/context.js.map +1 -1
  733. package/dist/dev/player/create-player.d.ts +1 -1
  734. package/dist/dev/player/create-player.js +12 -5
  735. package/dist/dev/player/create-player.js.map +1 -1
  736. package/dist/dev/player/player-controller.js +1 -2
  737. package/dist/dev/player/player-controller.js.map +1 -1
  738. package/dist/dev/presets/audio.js +1 -2
  739. package/dist/dev/presets/background.js +1 -2
  740. package/dist/dev/presets/video.js +1 -2
  741. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +17 -38
  742. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  743. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js +1 -1
  744. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  745. package/dist/dev/skins/dist/default/default/tailwind/components/button-group.js +7 -0
  746. package/dist/dev/skins/dist/default/default/tailwind/components/button-group.js.map +1 -0
  747. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +5 -5
  748. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  749. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +2 -3
  750. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +1 -1
  751. package/dist/dev/skins/dist/default/default/tailwind/components/error.js +4 -5
  752. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -1
  753. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +1 -2
  754. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  755. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +2 -3
  756. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  757. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js +1 -1
  758. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -1
  759. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +5 -6
  760. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  761. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +15 -0
  762. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -0
  763. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js +12 -0
  764. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  765. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +2 -3
  766. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  767. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +2 -3
  768. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  769. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +2 -3
  770. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  771. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js +2 -3
  772. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  773. package/dist/dev/skins/dist/default/default/tailwind/components/time.js +1 -1
  774. package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  775. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +41 -26
  776. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  777. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +18 -33
  778. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  779. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  780. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  781. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js +1 -2
  782. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -1
  783. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +5 -5
  784. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  785. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +2 -3
  786. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -1
  787. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +4 -5
  788. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -1
  789. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +1 -2
  790. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  791. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +2 -3
  792. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  793. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js +6 -0
  794. package/dist/dev/skins/dist/default/minimal/tailwind/components/playback-rate.js.map +1 -0
  795. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +5 -5
  796. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  797. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +15 -0
  798. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -0
  799. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js +13 -0
  800. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  801. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +2 -3
  802. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  803. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +2 -3
  804. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  805. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +2 -3
  806. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  807. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js +5 -6
  808. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  809. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +45 -24
  810. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  811. package/dist/{default/skins/dist/default/default/tailwind/components → dev/skins/dist/default/shared/tailwind}/icon-state.js +7 -2
  812. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +1 -0
  813. package/dist/dev/store/container-mixin.d.ts +10 -5
  814. package/dist/dev/store/container-mixin.d.ts.map +1 -1
  815. package/dist/dev/store/container-mixin.js +17 -62
  816. package/dist/dev/store/container-mixin.js.map +1 -1
  817. package/dist/dev/store/media-attach-mixin.d.ts +19 -0
  818. package/dist/dev/store/media-attach-mixin.d.ts.map +1 -0
  819. package/dist/dev/store/media-attach-mixin.js +44 -0
  820. package/dist/dev/store/media-attach-mixin.js.map +1 -0
  821. package/dist/dev/store/provider-mixin.d.ts +19 -6
  822. package/dist/dev/store/provider-mixin.d.ts.map +1 -1
  823. package/dist/dev/store/provider-mixin.js +100 -11
  824. package/dist/dev/store/provider-mixin.js.map +1 -1
  825. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js +1 -2
  826. package/dist/dev/ui/alert-dialog/alert-dialog-close-element.js.map +1 -1
  827. package/dist/dev/ui/alert-dialog/alert-dialog-description-element.js +1 -2
  828. package/dist/dev/ui/alert-dialog/alert-dialog-description-element.js.map +1 -1
  829. package/dist/dev/ui/alert-dialog/alert-dialog-element.d.ts.map +1 -1
  830. package/dist/dev/ui/alert-dialog/alert-dialog-element.js +2 -2
  831. package/dist/dev/ui/alert-dialog/alert-dialog-element.js.map +1 -1
  832. package/dist/dev/ui/alert-dialog/alert-dialog-title-element.js +1 -2
  833. package/dist/dev/ui/alert-dialog/alert-dialog-title-element.js.map +1 -1
  834. package/dist/dev/ui/alert-dialog/context.js +2 -5
  835. package/dist/dev/ui/alert-dialog/context.js.map +1 -1
  836. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts.map +1 -1
  837. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +2 -2
  838. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js.map +1 -1
  839. package/dist/dev/ui/captions-button/captions-button-element.d.ts +1 -0
  840. package/dist/dev/ui/captions-button/captions-button-element.d.ts.map +1 -1
  841. package/dist/dev/ui/captions-button/captions-button-element.js +2 -2
  842. package/dist/dev/ui/captions-button/captions-button-element.js.map +1 -1
  843. package/dist/dev/ui/context-part-element.d.ts +1 -1
  844. package/dist/dev/ui/context-part-element.js +1 -2
  845. package/dist/dev/ui/context-part-element.js.map +1 -1
  846. package/dist/dev/ui/controls/context.js +2 -5
  847. package/dist/dev/ui/controls/context.js.map +1 -1
  848. package/dist/dev/ui/controls/controls-element.js +1 -2
  849. package/dist/dev/ui/controls/controls-element.js.map +1 -1
  850. package/dist/dev/ui/controls/controls-group-element.js +1 -2
  851. package/dist/dev/ui/controls/controls-group-element.js.map +1 -1
  852. package/dist/dev/ui/error-dialog/error-dialog-element.d.ts +16 -0
  853. package/dist/dev/ui/error-dialog/error-dialog-element.d.ts.map +1 -0
  854. package/dist/dev/ui/error-dialog/error-dialog-element.js +77 -0
  855. package/dist/dev/ui/error-dialog/error-dialog-element.js.map +1 -0
  856. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +1 -0
  857. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts.map +1 -1
  858. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js +2 -2
  859. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js.map +1 -1
  860. package/dist/dev/ui/gesture/gesture-element.d.ts +22 -0
  861. package/dist/dev/ui/gesture/gesture-element.d.ts.map +1 -0
  862. package/dist/dev/ui/gesture/gesture-element.js +84 -0
  863. package/dist/dev/ui/gesture/gesture-element.js.map +1 -0
  864. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts +15 -0
  865. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.d.ts.map +1 -0
  866. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js +28 -0
  867. package/dist/dev/ui/hotkey/aria-key-shortcuts-controller.js.map +1 -0
  868. package/dist/dev/ui/hotkey/hotkey-element.d.ts +21 -0
  869. package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -0
  870. package/dist/dev/ui/hotkey/hotkey-element.js +81 -0
  871. package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -0
  872. package/dist/dev/ui/media-button-element.d.ts +8 -2
  873. package/dist/dev/ui/media-button-element.d.ts.map +1 -1
  874. package/dist/dev/ui/media-button-element.js +17 -3
  875. package/dist/dev/ui/media-button-element.js.map +1 -1
  876. package/dist/dev/ui/media-element.js +1 -2
  877. package/dist/dev/ui/media-element.js.map +1 -1
  878. package/dist/dev/ui/media-ui-element.js +1 -2
  879. package/dist/dev/ui/media-ui-element.js.map +1 -1
  880. package/dist/dev/ui/mute-button/mute-button-element.d.ts +1 -0
  881. package/dist/dev/ui/mute-button/mute-button-element.d.ts.map +1 -1
  882. package/dist/dev/ui/mute-button/mute-button-element.js +2 -2
  883. package/dist/dev/ui/mute-button/mute-button-element.js.map +1 -1
  884. package/dist/dev/ui/pip-button/pip-button-element.d.ts +1 -0
  885. package/dist/dev/ui/pip-button/pip-button-element.d.ts.map +1 -1
  886. package/dist/dev/ui/pip-button/pip-button-element.js +2 -2
  887. package/dist/dev/ui/pip-button/pip-button-element.js.map +1 -1
  888. package/dist/dev/ui/play-button/play-button-element.d.ts +1 -0
  889. package/dist/dev/ui/play-button/play-button-element.d.ts.map +1 -1
  890. package/dist/dev/ui/play-button/play-button-element.js +2 -2
  891. package/dist/dev/ui/play-button/play-button-element.js.map +1 -1
  892. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js +1 -2
  893. package/dist/dev/ui/playback-rate-button/playback-rate-button-element.js.map +1 -1
  894. package/dist/dev/ui/popover/popover-element.d.ts.map +1 -1
  895. package/dist/dev/ui/popover/popover-element.js +13 -11
  896. package/dist/dev/ui/popover/popover-element.js.map +1 -1
  897. package/dist/dev/ui/position-controller.js +76 -0
  898. package/dist/dev/ui/position-controller.js.map +1 -0
  899. package/dist/dev/ui/poster/poster-element.js +1 -2
  900. package/dist/dev/ui/poster/poster-element.js.map +1 -1
  901. package/dist/dev/ui/seek-button/seek-button-element.js +1 -2
  902. package/dist/dev/ui/seek-button/seek-button-element.js.map +1 -1
  903. package/dist/dev/ui/slider/context.js +2 -5
  904. package/dist/dev/ui/slider/context.js.map +1 -1
  905. package/dist/dev/ui/slider/slider-buffer-element.js +1 -2
  906. package/dist/dev/ui/slider/slider-buffer-element.js.map +1 -1
  907. package/dist/dev/ui/slider/slider-element.js +2 -3
  908. package/dist/dev/ui/slider/slider-element.js.map +1 -1
  909. package/dist/dev/ui/slider/slider-fill-element.js +1 -2
  910. package/dist/dev/ui/slider/slider-fill-element.js.map +1 -1
  911. package/dist/dev/ui/slider/slider-preview-element.d.ts +21 -0
  912. package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -0
  913. package/dist/dev/ui/slider/slider-preview-element.js +2 -3
  914. package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
  915. package/dist/dev/ui/slider/slider-thumb-element.js +1 -2
  916. package/dist/dev/ui/slider/slider-thumb-element.js.map +1 -1
  917. package/dist/dev/ui/slider/slider-thumbnail-element.js +1 -2
  918. package/dist/dev/ui/slider/slider-thumbnail-element.js.map +1 -1
  919. package/dist/dev/ui/slider/slider-track-element.js +1 -2
  920. package/dist/dev/ui/slider/slider-track-element.js.map +1 -1
  921. package/dist/dev/ui/slider/slider-value-element.js +1 -2
  922. package/dist/dev/ui/slider/slider-value-element.js.map +1 -1
  923. package/dist/dev/ui/thumbnail/thumbnail-element.js +1 -2
  924. package/dist/dev/ui/thumbnail/thumbnail-element.js.map +1 -1
  925. package/dist/dev/ui/time/time-element.d.ts +0 -1
  926. package/dist/dev/ui/time/time-element.d.ts.map +1 -1
  927. package/dist/dev/ui/time/time-element.js +13 -12
  928. package/dist/dev/ui/time/time-element.js.map +1 -1
  929. package/dist/dev/ui/time/time-group-element.js +1 -2
  930. package/dist/dev/ui/time/time-group-element.js.map +1 -1
  931. package/dist/dev/ui/time/time-separator-element.js +1 -2
  932. package/dist/dev/ui/time/time-separator-element.js.map +1 -1
  933. package/dist/dev/ui/time-slider/time-slider-element.d.ts +2 -2
  934. package/dist/dev/ui/time-slider/time-slider-element.js +7 -8
  935. package/dist/dev/ui/time-slider/time-slider-element.js.map +1 -1
  936. package/dist/dev/ui/tooltip/context.js +2 -5
  937. package/dist/dev/ui/tooltip/context.js.map +1 -1
  938. package/dist/dev/ui/tooltip/tooltip-element.d.ts.map +1 -1
  939. package/dist/dev/ui/tooltip/tooltip-element.js +25 -18
  940. package/dist/dev/ui/tooltip/tooltip-element.js.map +1 -1
  941. package/dist/dev/ui/tooltip/tooltip-group-element.js +5 -3
  942. package/dist/dev/ui/tooltip/tooltip-group-element.js.map +1 -1
  943. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts +5 -0
  944. package/dist/dev/ui/volume-slider/volume-slider-element.d.ts.map +1 -1
  945. package/dist/dev/ui/volume-slider/volume-slider-element.js +27 -20
  946. package/dist/dev/ui/volume-slider/volume-slider-element.js.map +1 -1
  947. package/package.json +25 -14
  948. package/cdn/audio-minimal.css +0 -1
  949. package/cdn/audio.css +0 -1
  950. package/cdn/background.css +0 -1
  951. package/cdn/video-minimal.css +0 -1
  952. package/cdn/video.css +0 -1
  953. package/dist/default/define/skin-mixin.js +0 -55
  954. package/dist/default/define/skin-mixin.js.map +0 -1
  955. package/dist/default/skins/dist/default/default/tailwind/components/icon-state.js.map +0 -1
  956. package/dist/default/skins/dist/default/default/tailwind/components/tooltip-state.js +0 -28
  957. package/dist/default/skins/dist/default/default/tailwind/components/tooltip-state.js.map +0 -1
  958. package/dist/default/skins/dist/default/minimal/tailwind/components/icon-state.js +0 -29
  959. package/dist/default/skins/dist/default/minimal/tailwind/components/icon-state.js.map +0 -1
  960. package/dist/default/skins/dist/default/minimal/tailwind/components/tooltip-state.js +0 -28
  961. package/dist/default/skins/dist/default/minimal/tailwind/components/tooltip-state.js.map +0 -1
  962. package/dist/dev/define/skin-mixin.d.ts +0 -21
  963. package/dist/dev/define/skin-mixin.d.ts.map +0 -1
  964. package/dist/dev/define/skin-mixin.js +0 -69
  965. package/dist/dev/define/skin-mixin.js.map +0 -1
  966. package/dist/dev/skins/dist/default/default/tailwind/components/icon-state.js.map +0 -1
  967. package/dist/dev/skins/dist/default/default/tailwind/components/tooltip-state.js +0 -28
  968. package/dist/dev/skins/dist/default/default/tailwind/components/tooltip-state.js.map +0 -1
  969. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js +0 -29
  970. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js.map +0 -1
  971. package/dist/dev/skins/dist/default/minimal/tailwind/components/tooltip-state.js +0 -28
  972. package/dist/dev/skins/dist/default/minimal/tailwind/components/tooltip-state.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"simple-hls-video.js","names":["#delegate","#isDefined","#propsToAttrs","#define","#init","#target","#isInit","#upgradeProperty","#childObserver","#syncMediaChildAttribute","#syncMediaChildren","#childMap","#enableDefaultTrack","#forwardAttribute","#current","#equalityFn","#pending","#scheduleFlush","#listeners","#selectorListeners","#pendingFlush","#runFn","#signal","#abortController","#status","#value","#error","#chain","#config","#engine","#cancelPendingPlay","#loadstartListener"],"sources":["../../../core/dist/default/core/utils/define-class-prop-hooks.js","../../../core/dist/default/core/media/delegate.js","../../../core/dist/default/dom/media/custom-media-element/index.js","../../../utils/dist/dom/listen.js","../../../utils/dist/predicate/predicate.js","../../../spf/dist/adapter-CMw-rvbk.js","../../../core/dist/default/dom/media/simple-hls/index.js","../../src/media/simple-hls-video/index.ts","../../src/define/media/simple-hls-video.ts"],"sourcesContent":["//#region src/core/utils/define-class-prop-hooks.ts\nfunction defineClassPropHooks(Class, BaseClassProto) {\n\tfor (const prop of Object.getOwnPropertyNames(BaseClassProto)) {\n\t\tif (prop in Class.prototype) continue;\n\t\tconst descriptor = Object.getOwnPropertyDescriptor(BaseClassProto, prop);\n\t\tif (!descriptor) continue;\n\t\tconst config = {};\n\t\tif (typeof descriptor.value === \"function\") config.value = function(...args) {\n\t\t\treturn this.call?.(prop, ...args);\n\t\t};\n\t\telse if (descriptor.get) {\n\t\t\tconfig.get = function() {\n\t\t\t\treturn this.get?.(prop);\n\t\t\t};\n\t\t\tif (descriptor.set) config.set = function(val) {\n\t\t\t\tthis.set?.(prop, val);\n\t\t\t};\n\t\t}\n\t\tObject.defineProperty(Class.prototype, prop, config);\n\t}\n}\n\n//#endregion\nexport { defineClassPropHooks };\n//# sourceMappingURL=define-class-prop-hooks.js.map","import { defineClassPropHooks } from \"../utils/define-class-prop-hooks.js\";\n\n//#region src/core/media/delegate.ts\n/**\n* Mixin that intercepts `get`, `set`, and `call` to delegate property access\n* and method calls to an instance of `DelegateClass` before falling through\n* to the base class implementation.\n*\n* Works with both `CustomMediaMixin` and `MediaProxyMixin`.\n*/\nfunction MediaDelegateMixin(BaseClass, DelegateClass) {\n\tclass DelegateMedia extends BaseClass {\n\t\t#delegate = new DelegateClass();\n\t\tget(prop) {\n\t\t\tif (prop in this.#delegate) return this.#delegate[prop];\n\t\t\treturn super.get?.(prop);\n\t\t}\n\t\tset(prop, val) {\n\t\t\tif (prop in this.#delegate) {\n\t\t\t\tthis.#delegate[prop] = val;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsuper.set?.(prop, val);\n\t\t}\n\t\tcall(prop, ...args) {\n\t\t\tif (prop in this.#delegate) return this.#delegate[prop](...args);\n\t\t\treturn super.call?.(prop, ...args);\n\t\t}\n\t\tattach(target) {\n\t\t\tsuper.attach?.(target);\n\t\t\tthis.#delegate.attach?.(target);\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#delegate.detach?.();\n\t\t\tsuper.detach?.();\n\t\t}\n\t}\n\tfor (let proto = DelegateClass.prototype; proto && proto !== Object.prototype; proto = Object.getPrototypeOf(proto)) defineClassPropHooks(DelegateMedia, proto);\n\treturn DelegateMedia;\n}\n\n//#endregion\nexport { MediaDelegateMixin };\n//# sourceMappingURL=delegate.js.map","//#region src/dom/media/custom-media-element/index.ts\n/**\n* Custom Media Element\n* Based on https://github.com/muxinc/custom-video-element - Mux - MIT License\n*\n* The goal is to create an element that works just like the video element\n* but can be extended/sub-classed, because native elements cannot be\n* extended today across browsers.\n*/\nconst Events = [\n\t\"abort\",\n\t\"canplay\",\n\t\"canplaythrough\",\n\t\"durationchange\",\n\t\"emptied\",\n\t\"encrypted\",\n\t\"ended\",\n\t\"error\",\n\t\"loadeddata\",\n\t\"loadedmetadata\",\n\t\"loadstart\",\n\t\"pause\",\n\t\"play\",\n\t\"playing\",\n\t\"progress\",\n\t\"ratechange\",\n\t\"seeked\",\n\t\"seeking\",\n\t\"stalled\",\n\t\"suspend\",\n\t\"timeupdate\",\n\t\"volumechange\",\n\t\"waiting\",\n\t\"waitingforkey\",\n\t\"resize\",\n\t\"enterpictureinpicture\",\n\t\"leavepictureinpicture\",\n\t\"webkitbeginfullscreen\",\n\t\"webkitendfullscreen\",\n\t\"webkitpresentationmodechanged\"\n];\nconst Attributes = [\n\t\"autopictureinpicture\",\n\t\"disablepictureinpicture\",\n\t\"disableremoteplayback\",\n\t\"autoplay\",\n\t\"controls\",\n\t\"controlslist\",\n\t\"crossorigin\",\n\t\"loop\",\n\t\"muted\",\n\t\"playsinline\",\n\t\"poster\",\n\t\"preload\",\n\t\"src\"\n];\n/**\n* Helper function to generate the HTML template for audio elements.\n*/\nfunction getAudioTemplateHTML(attrs) {\n\treturn `\n <style>\n :host {\n display: inline-flex;\n line-height: 0;\n flex-direction: column;\n justify-content: end;\n }\n\n audio {\n width: 100%;\n }\n </style>\n <slot name=\"media\">\n <audio${serializeAttributes(attrs)}></audio>\n </slot>\n <slot></slot>\n `;\n}\n/**\n* Helper function to generate the HTML template for video elements.\n*/\nfunction getVideoTemplateHTML(attrs) {\n\treturn `\n <style>\n :host {\n display: inline-block;\n line-height: 0;\n }\n\n video {\n max-width: 100%;\n max-height: 100%;\n min-width: 100%;\n min-height: 100%;\n object-fit: var(--media-object-fit, contain);\n object-position: var(--media-object-position, 50% 50%);\n }\n\n video::-webkit-media-text-track-container {\n transform: var(--media-webkit-text-track-transform);\n transition: var(--media-webkit-text-track-transition);\n }\n </style>\n <slot name=\"media\">\n <video${serializeAttributes(attrs)}></video>\n </slot>\n <slot></slot>\n `;\n}\nfunction CustomMediaMixin(superclass, { tag, is }) {\n\tconst nativeElTest = globalThis.document?.createElement?.(tag, { is });\n\tconst nativeElProps = nativeElTest ? getNativeElProps(nativeElTest) : [];\n\treturn class CustomMedia extends superclass {\n\t\tstatic getTemplateHTML = tag.endsWith(\"audio\") ? getAudioTemplateHTML : getVideoTemplateHTML;\n\t\tstatic shadowRootOptions = { mode: \"open\" };\n\t\tstatic Events = Events;\n\t\tstatic #isDefined = false;\n\t\tstatic #propsToAttrs;\n\t\tstatic get observedAttributes() {\n\t\t\tCustomMedia.#define();\n\t\t\treturn [...nativeElTest?.constructor?.observedAttributes ?? [], ...Attributes];\n\t\t}\n\t\tstatic #define() {\n\t\t\tif (CustomMedia.#isDefined) return;\n\t\t\tCustomMedia.#isDefined = true;\n\t\t\tCustomMedia.#propsToAttrs = new Set(CustomMedia.observedAttributes);\n\t\t\tCustomMedia.#propsToAttrs.delete(\"muted\");\n\t\t\tfor (const prop of nativeElProps) {\n\t\t\t\tif (prop in CustomMedia.prototype) continue;\n\t\t\t\tif (typeof nativeElTest[prop] === \"function\") CustomMedia.prototype[prop] = function(...args) {\n\t\t\t\t\tthis.#init();\n\t\t\t\t\treturn this.call(prop, ...args);\n\t\t\t\t};\n\t\t\t\telse {\n\t\t\t\t\tconst config = { get() {\n\t\t\t\t\t\tthis.#init();\n\t\t\t\t\t\treturn this.get(prop);\n\t\t\t\t\t} };\n\t\t\t\t\tif (prop !== prop.toUpperCase()) config.set = function(val) {\n\t\t\t\t\t\tthis.#init();\n\t\t\t\t\t\tthis.set(prop, val);\n\t\t\t\t\t};\n\t\t\t\t\tObject.defineProperty(CustomMedia.prototype, prop, config);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#isInit = false;\n\t\t#target = null;\n\t\t#childMap = /* @__PURE__ */ new Map();\n\t\t#childObserver;\n\t\tget(prop) {\n\t\t\tconst attr = prop.toLowerCase();\n\t\t\tif (CustomMedia.#propsToAttrs.has(attr)) {\n\t\t\t\tconst val = this.getAttribute(attr);\n\t\t\t\treturn val === null ? false : val === \"\" ? true : val;\n\t\t\t}\n\t\t\treturn this.target?.[prop];\n\t\t}\n\t\tset(prop, val) {\n\t\t\tconst attr = prop.toLowerCase();\n\t\t\tif (CustomMedia.#propsToAttrs.has(attr)) {\n\t\t\t\tif (val === true || val === false || val == null) this.toggleAttribute(attr, Boolean(val));\n\t\t\t\telse this.setAttribute(attr, val);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this.target) this.target[prop] = val;\n\t\t}\n\t\tcall(prop, ...args) {\n\t\t\treturn (this.target?.[prop])?.apply(this.target, args);\n\t\t}\n\t\tget target() {\n\t\t\tthis.#init();\n\t\t\treturn this.#target ?? this.querySelector(\":scope > [slot=media]\") ?? this.querySelector(tag) ?? this.shadowRoot?.querySelector(tag) ?? null;\n\t\t}\n\t\tset target(val) {\n\t\t\tthis.#target = val;\n\t\t}\n\t\tget defaultMuted() {\n\t\t\tthis.#init();\n\t\t\treturn this.get(\"muted\");\n\t\t}\n\t\tset defaultMuted(val) {\n\t\t\tthis.#init();\n\t\t\tthis.set(\"muted\", val);\n\t\t}\n\t\t#init() {\n\t\t\tif (this.#isInit) return;\n\t\t\tthis.#isInit = true;\n\t\t\tthis.init();\n\t\t}\n\t\tinit() {\n\t\t\tif (!this.shadowRoot) {\n\t\t\t\tthis.attachShadow({ mode: \"open\" });\n\t\t\t\tconst attrs = namedNodeMapToObject(this.attributes);\n\t\t\t\tif (is) attrs.is = is;\n\t\t\t\tif (tag) attrs.part = tag;\n\t\t\t\tthis.shadowRoot.innerHTML = this.constructor.getTemplateHTML(attrs);\n\t\t\t}\n\t\t\tthis.target.muted = this.hasAttribute(\"muted\");\n\t\t\tfor (const prop of nativeElProps) this.#upgradeProperty(prop);\n\t\t\tthis.#childObserver = new MutationObserver(this.#syncMediaChildAttribute.bind(this));\n\t\t\tthis.shadowRoot.addEventListener(\"slotchange\", () => this.#syncMediaChildren());\n\t\t\tthis.#syncMediaChildren();\n\t\t\tfor (const type of this.constructor.Events) this.shadowRoot.addEventListener(type, this, true);\n\t\t}\n\t\thandleEvent(event) {\n\t\t\tif (event.target === this.target) this.dispatchEvent(new CustomEvent(event.type, { detail: event.detail }));\n\t\t}\n\t\t#syncMediaChildren() {\n\t\t\tconst removeNativeChildren = new Map(this.#childMap);\n\t\t\t((this.shadowRoot?.querySelector(\"slot:not([name])\"))?.assignedElements({ flatten: true }).filter((el) => [\"track\", \"source\"].includes(el.localName))).forEach((el) => {\n\t\t\t\tremoveNativeChildren.delete(el);\n\t\t\t\tlet clone = this.#childMap.get(el);\n\t\t\t\tif (!clone) {\n\t\t\t\t\tclone = el.cloneNode();\n\t\t\t\t\tthis.#childMap.set(el, clone);\n\t\t\t\t\tthis.#childObserver?.observe(el, { attributes: true });\n\t\t\t\t}\n\t\t\t\tthis.target?.append(clone);\n\t\t\t\tthis.#enableDefaultTrack(clone);\n\t\t\t});\n\t\t\tremoveNativeChildren.forEach((clone, el) => {\n\t\t\t\tclone.remove();\n\t\t\t\tthis.#childMap.delete(el);\n\t\t\t});\n\t\t}\n\t\t#syncMediaChildAttribute(mutations) {\n\t\t\tfor (const mutation of mutations) if (mutation.type === \"attributes\") {\n\t\t\t\tconst { target, attributeName } = mutation;\n\t\t\t\tconst clone = this.#childMap.get(target);\n\t\t\t\tif (clone && attributeName) {\n\t\t\t\t\tclone.setAttribute(attributeName, target.getAttribute(attributeName) ?? \"\");\n\t\t\t\t\tthis.#enableDefaultTrack(clone);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t#enableDefaultTrack(trackEl) {\n\t\t\tif (trackEl && trackEl.localName === \"track\" && trackEl.default && (trackEl.kind === \"chapters\" || trackEl.kind === \"metadata\") && trackEl.track.mode === \"disabled\") trackEl.track.mode = \"hidden\";\n\t\t}\n\t\t#upgradeProperty(prop) {\n\t\t\tif (Object.hasOwn(this, prop)) {\n\t\t\t\tconst value = this[prop];\n\t\t\t\tdelete this[prop];\n\t\t\t\tthis[prop] = value;\n\t\t\t}\n\t\t}\n\t\tattributeChangedCallback(attrName, oldValue, newValue) {\n\t\t\tthis.#init();\n\t\t\tthis.#forwardAttribute(attrName, oldValue, newValue);\n\t\t}\n\t\t#forwardAttribute(attrName, _oldValue, newValue) {\n\t\t\tif ([\"id\", \"class\"].includes(attrName)) return;\n\t\t\tif (!CustomMedia.observedAttributes.includes(attrName) && this.constructor.observedAttributes.includes(attrName)) return;\n\t\t\tif (newValue === null) this.target?.removeAttribute(attrName);\n\t\t\telse if (this.target?.getAttribute(attrName) !== newValue) this.target?.setAttribute(attrName, newValue);\n\t\t}\n\t\tconnectedCallback() {\n\t\t\tthis.#init();\n\t\t\tthis.setAttribute(\"data-media-element\", \"\");\n\t\t}\n\t};\n}\n/**\n* Helper function to get all properties from a native media element's prototype.\n*/\nfunction getNativeElProps(nativeElTest) {\n\tconst nativeElProps = [];\n\tfor (let proto = Object.getPrototypeOf(nativeElTest); proto && proto !== HTMLElement.prototype; proto = Object.getPrototypeOf(proto)) {\n\t\tconst props = Object.getOwnPropertyNames(proto);\n\t\tnativeElProps.push(...props);\n\t}\n\treturn nativeElProps;\n}\n/**\n* Helper function to serialize attributes into a string.\n*/\nfunction serializeAttributes(attrs) {\n\tlet html = \"\";\n\tfor (const key in attrs) {\n\t\tif (!Attributes.includes(key)) continue;\n\t\tconst value = attrs[key];\n\t\tif (value === \"\") html += ` ${key}`;\n\t\telse html += ` ${key}=\"${value}\"`;\n\t}\n\treturn html;\n}\n/**\n* Helper function to convert NamedNodeMap to a plain object.\n*/\nfunction namedNodeMapToObject(namedNodeMap) {\n\tconst obj = {};\n\tfor (const attr of namedNodeMap) obj[attr.name] = attr.value;\n\treturn obj;\n}\nconst CustomVideoElement = CustomMediaMixin(globalThis.HTMLElement ?? class {}, { tag: \"video\" });\nconst CustomAudioElement = CustomMediaMixin(globalThis.HTMLElement ?? class {}, { tag: \"audio\" });\n\n//#endregion\nexport { Attributes, CustomAudioElement, CustomMediaMixin, CustomVideoElement, Events };\n//# sourceMappingURL=index.js.map","//#region src/dom/listen.ts\nfunction listen(target, type, listener, options) {\n\ttarget.addEventListener(type, listener, options);\n\treturn () => target.removeEventListener(type, listener, options);\n}\n\n//#endregion\nexport { listen };\n//# sourceMappingURL=listen.js.map","//#region src/predicate/predicate.ts\nfunction isString(value) {\n\treturn typeof value === \"string\";\n}\nfunction isNumber(value) {\n\treturn typeof value === \"number\";\n}\nfunction isBoolean(value) {\n\treturn typeof value === \"boolean\";\n}\nfunction isFunction(value) {\n\treturn typeof value === \"function\";\n}\nfunction isNull(value) {\n\treturn value === null;\n}\nfunction isUndefined(value) {\n\treturn typeof value === \"undefined\";\n}\nfunction isNil(value) {\n\treturn value == null;\n}\nfunction isPromise(value) {\n\treturn value instanceof Promise;\n}\n/**\n* Check if a value is an object, excluding null.\n*/\nfunction isObject(value) {\n\treturn value !== null && typeof value === \"object\";\n}\n/**\n* Check if a value is a plain object (not a class instance like Date, Map, etc).\n*/\nfunction isPlainObject(value) {\n\tif (!isObject(value)) return false;\n\tconst proto = Object.getPrototypeOf(value);\n\treturn proto === null || proto === Object.prototype;\n}\n/**\n* Check if a value is an AbortError.\n*/\nfunction isAbortError(value) {\n\treturn value instanceof Error && value.name === \"AbortError\";\n}\n\n//#endregion\nexport { isAbortError, isBoolean, isFunction, isNil, isNull, isNumber, isObject, isPlainObject, isPromise, isString, isUndefined };\n//# sourceMappingURL=predicate.js.map","import { listen } from \"@videojs/utils/dom\";\nimport { isNil, isUndefined } from \"@videojs/utils/predicate\";\n\n//#region src/core/state/create-state.ts\n/**\n* Reactive state container with selectors, custom equality, and batched updates.\n*\n* Manages both immutable state values and mutable object references (e.g., HTMLMediaElement).\n*/\nconst STATE_SYMBOL = Symbol(\"@videojs/spf/state\");\n/**\n* Default equality function using Object.is.\n*/\nfunction defaultEquality(a, b) {\n\treturn Object.is(a, b);\n}\n/**\n* State container implementation.\n*/\nvar StateContainer = class {\n\t[STATE_SYMBOL] = true;\n\t#current;\n\t#pending = null;\n\t#pendingFlush = false;\n\t#equalityFn;\n\t#listeners = /* @__PURE__ */ new Set();\n\t#selectorListeners = /* @__PURE__ */ new Set();\n\tconstructor(initial, config) {\n\t\tthis.#current = typeof initial === \"object\" && initial !== null ? { ...initial } : initial;\n\t\tthis.#equalityFn = config?.equalityFn ?? defaultEquality;\n\t}\n\tget current() {\n\t\treturn this.#pending ?? this.#current;\n\t}\n\tpatch(partial) {\n\t\tconst base = this.#pending ?? this.#current;\n\t\tif (typeof base !== \"object\" || base === null) {\n\t\t\tconst value = partial;\n\t\t\tif (!Object.is(base, value)) {\n\t\t\t\tthis.#pending = value;\n\t\t\t\tthis.#scheduleFlush();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst next = { ...base };\n\t\tlet changed = false;\n\t\tfor (const key in partial) {\n\t\t\tif (!Object.hasOwn(partial, key)) continue;\n\t\t\tconst value = partial[key];\n\t\t\tif (!Object.is(base[key], value)) {\n\t\t\t\tnext[key] = value;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\t\tif (changed) {\n\t\t\tthis.#pending = next;\n\t\t\tthis.#scheduleFlush();\n\t\t}\n\t}\n\tsubscribe(selectorOrListener, maybeListener, options) {\n\t\tif (maybeListener === void 0) {\n\t\t\tconst listener$1 = selectorOrListener;\n\t\t\tthis.#listeners.add(listener$1);\n\t\t\tlistener$1(this.current);\n\t\t\treturn () => {\n\t\t\t\tthis.#listeners.delete(listener$1);\n\t\t\t};\n\t\t}\n\t\tconst selector = selectorOrListener;\n\t\tconst listener = maybeListener;\n\t\tconst entry = {\n\t\t\tselector,\n\t\t\tlistener,\n\t\t\toptions: options ?? {}\n\t\t};\n\t\tthis.#selectorListeners.add(entry);\n\t\tlistener(selector(this.current));\n\t\treturn () => {\n\t\t\tthis.#selectorListeners.delete(entry);\n\t\t};\n\t}\n\tflush() {\n\t\tif (this.#pending === null) return;\n\t\tconst prev = this.#current;\n\t\tconst next = this.#pending;\n\t\tthis.#pending = null;\n\t\tthis.#pendingFlush = false;\n\t\tif (this.#equalityFn(prev, next)) return;\n\t\tthis.#current = next;\n\t\tfor (const listener of this.#listeners) listener(this.#current);\n\t\tfor (const entry of this.#selectorListeners) {\n\t\t\tconst prevSelected = entry.selector(prev);\n\t\t\tconst nextSelected = entry.selector(this.#current);\n\t\t\tif (!(entry.options.equalityFn ?? Object.is)(prevSelected, nextSelected)) entry.listener(nextSelected);\n\t\t}\n\t}\n\t#scheduleFlush() {\n\t\tif (this.#pendingFlush) return;\n\t\tthis.#pendingFlush = true;\n\t\tqueueMicrotask(() => this.flush());\n\t}\n};\n/**\n* Create a reactive state container.\n*\n* @example\n* ```typescript\n* const state = createState({ count: 0 });\n*\n* // Subscribe to changes\n* state.subscribe((current, prev) => {\n* console.log('Changed:', prev, '->', current);\n* });\n*\n* // Updates are batched\n* state.patch({ count: 1 });\n* state.patch({ count: 2 });\n* // Only one notification fires (with count: 2)\n* ```\n*\n* @example Selector subscriptions\n* ```typescript\n* const state = createState({ count: 0, name: 'test' });\n*\n* // Only notified when count changes\n* state.subscribe(\n* s => s.count,\n* (current, prev) => console.log(current, prev)\n* );\n* ```\n*\n* @example Custom equality\n* ```typescript\n* const state = createState(\n* { count: 0, name: 'test' },\n* { equalityFn: (a, b) => a.count === b.count }\n* );\n* ```\n*/\nfunction createState(initial, config) {\n\treturn new StateContainer(initial, config);\n}\n\n//#endregion\n//#region src/core/hls/parse-attributes.ts\n/**\n* Parse HLS attribute list from a tag line.\n* Handles both quoted and unquoted values.\n*/\nfunction parseAttributeList(line) {\n\tconst attributes = /* @__PURE__ */ new Map();\n\tfor (const match of line.matchAll(/([A-Z0-9-]+)=(?:\"([^\"]*)\"|([^,]*))/g)) {\n\t\tconst key = match[1];\n\t\tconst value = match[2] ?? match[3] ?? \"\";\n\t\tif (key) attributes.set(key, value);\n\t}\n\treturn attributes;\n}\n/**\n* Parse RESOLUTION attribute value (WIDTHxHEIGHT).\n*/\nfunction parseResolution(value) {\n\tconst match = /^(\\d+)x(\\d+)$/.exec(value);\n\tif (!match) return null;\n\treturn {\n\t\twidth: Number.parseInt(match[1], 10),\n\t\theight: Number.parseInt(match[2], 10)\n\t};\n}\n/**\n* Parse FRAME-RATE attribute to rational frame rate.\n*/\nfunction parseFrameRate(value) {\n\tconst fps = Number.parseFloat(value);\n\tif (Number.isNaN(fps) || fps <= 0) return void 0;\n\tif (Math.abs(fps - 23.976) < .01) return {\n\t\tframeRateNumerator: 24e3,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 29.97) < .01) return {\n\t\tframeRateNumerator: 3e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 59.94) < .01) return {\n\t\tframeRateNumerator: 6e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (fps % 1 === 0) return { frameRateNumerator: Math.round(fps) };\n\treturn { frameRateNumerator: Math.round(fps) };\n}\n/**\n* Parse CODECS attribute into separate video and audio codecs.\n*/\nfunction parseCodecs(codecs) {\n\tconst parts = codecs.split(\",\").map((s) => s.trim());\n\tconst result = {};\n\tfor (const codec of parts) if (codec.startsWith(\"avc1.\") || codec.startsWith(\"hvc1.\") || codec.startsWith(\"hev1.\")) result.video = codec;\n\telse if (codec.startsWith(\"mp4a.\")) result.audio = codec;\n\treturn result;\n}\n/**\n* Parse #EXTINF duration value.\n*/\nfunction parseExtInfDuration(value) {\n\tconst durationPart = value.split(\",\")[0] ?? value;\n\tconst duration = Number.parseFloat(durationPart);\n\treturn Number.isNaN(duration) ? 0 : duration;\n}\n/**\n* Parse BYTERANGE attribute value.\n* Format: \"length[@offset]\"\n* If offset is omitted, it continues from the previous byte range end.\n*/\nfunction parseByteRange(value, previousEnd) {\n\tconst match = /^(\\d+)(?:@(\\d+))?$/.exec(value);\n\tif (!match) return null;\n\tconst length = Number.parseInt(match[1], 10);\n\tif (Number.isNaN(length)) return null;\n\tlet start;\n\tif (match[2] !== void 0) {\n\t\tstart = Number.parseInt(match[2], 10);\n\t\tif (Number.isNaN(start)) return null;\n\t} else if (previousEnd !== void 0) start = previousEnd;\n\telse return null;\n\treturn {\n\t\tstart,\n\t\tend: start + length - 1\n\t};\n}\n/**\n* Create AttributeList from raw attribute string.\n*/\nfunction createAttributeList(line) {\n\tconst map = parseAttributeList(line);\n\treturn {\n\t\tget(key) {\n\t\t\treturn map.get(key);\n\t\t},\n\t\tgetInt(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseInt(value, 10);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetFloat(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseFloat(value);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetBool(key) {\n\t\t\treturn map.get(key) === \"YES\";\n\t\t},\n\t\tgetResolution(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseResolution(value) ?? void 0;\n\t\t},\n\t\tgetFrameRate(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseFrameRate(value);\n\t\t}\n\t};\n}\n/**\n* Match a tag and extract its attributes.\n* Returns null if the line doesn't match the tag.\n*/\nfunction matchTag(line, tag) {\n\tconst prefix = `#${tag}:`;\n\tif (!line.startsWith(prefix)) return null;\n\treturn createAttributeList(line.slice(prefix.length));\n}\n\n//#endregion\n//#region src/core/hls/resolve-url.ts\n/**\n* Resolve a potentially relative URL against a base URL using native URL API.\n*/\nfunction resolveUrl(url, baseUrl) {\n\treturn new URL(url, baseUrl).href;\n}\n\n//#endregion\n//#region src/core/hls/parse-media-playlist.ts\n/**\n* Parse HLS media playlist and resolve track with segments.\n*\n* Takes an unresolved track (from multivariant playlist) and media playlist text,\n* returns a HAM-compliant resolved track with segments.\n*\n* @param text - Media playlist text content\n* @param unresolved - Unresolved track from parseMultivariantPlaylist\n* @returns Resolved track with segments (type inferred from input)\n*/\nfunction parseMediaPlaylist(text, unresolved) {\n\tconst lines = text.split(/\\r?\\n/);\n\tconst baseUrl = unresolved.url;\n\tconst segments = [];\n\tlet initSegmentUrl;\n\tlet initSegmentByteRange;\n\tlet currentDuration = 0;\n\tlet currentByteRange;\n\tlet currentTime = 0;\n\tlet segmentIndex = 0;\n\tlet previousByteRangeEnd;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-TARGETDURATION:\") || trimmed.startsWith(\"#EXT-X-PLAYLIST-TYPE:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mapAttrs = matchTag(trimmed, \"EXT-X-MAP\");\n\t\tif (mapAttrs) {\n\t\t\tconst uri = mapAttrs.get(\"URI\");\n\t\t\tif (uri) {\n\t\t\t\tinitSegmentUrl = resolveUrl(uri, baseUrl);\n\t\t\t\tconst byteRangeStr = mapAttrs.get(\"BYTERANGE\");\n\t\t\t\tif (byteRangeStr) initSegmentByteRange = parseByteRange(byteRangeStr, 0) ?? void 0;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXTINF:\")) {\n\t\t\tcurrentDuration = parseExtInfDuration(trimmed.slice(8));\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXT-X-BYTERANGE:\")) {\n\t\t\tcurrentByteRange = parseByteRange(trimmed.slice(17), previousByteRangeEnd) ?? void 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed === \"#EXT-X-ENDLIST\") continue;\n\t\tif (!trimmed.startsWith(\"#\") && currentDuration > 0) {\n\t\t\tconst segment = {\n\t\t\t\tid: `segment-${segmentIndex}`,\n\t\t\t\turl: resolveUrl(trimmed, baseUrl),\n\t\t\t\tduration: currentDuration,\n\t\t\t\tstartTime: currentTime\n\t\t\t};\n\t\t\tif (currentByteRange) {\n\t\t\t\tsegment.byteRange = currentByteRange;\n\t\t\t\tpreviousByteRangeEnd = currentByteRange.end + 1;\n\t\t\t} else previousByteRangeEnd = void 0;\n\t\t\tsegments.push(segment);\n\t\t\tcurrentTime += currentDuration;\n\t\t\tsegmentIndex++;\n\t\t\tcurrentDuration = 0;\n\t\t\tcurrentByteRange = void 0;\n\t\t}\n\t}\n\tconst totalDuration = currentTime;\n\tconst initialization = unresolved.type === \"text\" && !initSegmentUrl ? void 0 : initSegmentUrl ? {\n\t\turl: initSegmentUrl,\n\t\t...initSegmentByteRange ? { byteRange: initSegmentByteRange } : {}\n\t} : { url: \"\" };\n\treturn {\n\t\t...unresolved,\n\t\tstartTime: 0,\n\t\tduration: totalDuration,\n\t\tsegments,\n\t\tinitialization\n\t};\n}\n\n//#endregion\n//#region src/core/utils/generate-id.ts\n/**\n* Generate unique ID for HAM objects.\n*\n* Uses timestamp + random number for sufficient uniqueness.\n* IDs are strings without decimals.\n*\n* @returns Unique string ID in format: timestamp-random\n*\n* @example\n* ```ts\n* const id = generateId(); // \"1738423156789-542891\"\n* ```\n*/\nfunction generateId() {\n\treturn `${Date.now()}-${Math.floor(Math.random() * 1e6)}`;\n}\n\n//#endregion\n//#region src/core/hls/parse-multivariant.ts\n/**\n* Parse HLS multivariant playlist into a Presentation.\n*\n* Returns Presentation with partially resolved tracks (no segment information).\n* Tracks contain metadata from multivariant playlist (bandwidth, resolution, codecs)\n* but segment information is added when media playlists are fetched.\n*\n* @param text - Raw playlist text content\n* @param unresolved - Unresolved presentation (contains URL for base URL resolution)\n* @returns Presentation with partially resolved tracks (duration is undefined)\n*/\nfunction parseMultivariantPlaylist(text, unresolved) {\n\tconst baseUrl = unresolved.url;\n\tconst lines = text.split(/\\r?\\n/);\n\tconst streams = [];\n\tconst audioRenditions = [];\n\tconst subtitleRenditions = [];\n\tlet pendingStreamInfo = null;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mediaAttrs = matchTag(trimmed, \"EXT-X-MEDIA\");\n\t\tif (mediaAttrs) {\n\t\t\tconst type = mediaAttrs.get(\"TYPE\");\n\t\t\tconst groupId = mediaAttrs.get(\"GROUP-ID\");\n\t\t\tconst name = mediaAttrs.get(\"NAME\");\n\t\t\tif (type === \"AUDIO\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\taudioRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: uri ? resolveUrl(uri, baseUrl) : void 0,\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type === \"SUBTITLES\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\tif (uri) subtitleRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: resolveUrl(uri, baseUrl),\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\"),\n\t\t\t\t\tforced: mediaAttrs.getBool(\"FORCED\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst streamInfAttrs = matchTag(trimmed, \"EXT-X-STREAM-INF\");\n\t\tif (streamInfAttrs) {\n\t\t\tpendingStreamInfo = {\n\t\t\t\tbandwidth: streamInfAttrs.getInt(\"BANDWIDTH\", 0),\n\t\t\t\tresolution: streamInfAttrs.getResolution(\"RESOLUTION\"),\n\t\t\t\tcodecs: streamInfAttrs.get(\"CODECS\"),\n\t\t\t\tframeRate: streamInfAttrs.getFrameRate(\"FRAME-RATE\"),\n\t\t\t\taudioGroupId: streamInfAttrs.get(\"AUDIO\")\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\t\tif (!trimmed.startsWith(\"#\") && pendingStreamInfo) {\n\t\t\tstreams.push({\n\t\t\t\t...pendingStreamInfo,\n\t\t\t\turi: resolveUrl(trimmed, baseUrl)\n\t\t\t});\n\t\t\tpendingStreamInfo = null;\n\t\t}\n\t}\n\tconst videoStreams = [];\n\tconst audioOnlyStreams = [];\n\tfor (const stream of streams) {\n\t\tif (!stream.codecs) {\n\t\t\tvideoStreams.push(stream);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsedCodecs = parseCodecs(stream.codecs);\n\t\tif (stream.codecs.split(\",\").length === 1) if (parsedCodecs.audio && !parsedCodecs.video) audioOnlyStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t}\n\tconst videoTracks = videoStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\tconst track = {\n\t\t\ttype: \"video\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"video/mp4\",\n\t\t\tcodecs: []\n\t\t};\n\t\tif (stream.resolution?.width !== void 0) track.width = stream.resolution.width;\n\t\tif (stream.resolution?.height !== void 0) track.height = stream.resolution.height;\n\t\tif (codecs?.video) track.codecs = [codecs.video];\n\t\tif (stream.frameRate) track.frameRate = stream.frameRate;\n\t\tif (stream.audioGroupId) track.audioGroupId = stream.audioGroupId;\n\t\treturn track;\n\t});\n\tconst audioOnlyTracks = audioOnlyStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\treturn {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tcodecs: codecs?.audio ? [codecs.audio] : [],\n\t\t\tgroupId: stream.audioGroupId || \"default\",\n\t\t\tname: \"Default\",\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2\n\t\t};\n\t});\n\tconst audioTracks = [...audioRenditions.map((rendition) => {\n\t\tlet audioCodecs;\n\t\tfor (const stream of streams) if (stream.audioGroupId === rendition.groupId && stream.codecs) {\n\t\t\tconst codecs = parseCodecs(stream.codecs);\n\t\t\tif (codecs.audio) {\n\t\t\t\taudioCodecs = [codecs.audio];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst track = {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri ?? \"\",\n\t\t\tgroupId: rendition.groupId,\n\t\t\tname: rendition.name,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tbandwidth: 0,\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2,\n\t\t\tcodecs: []\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (audioCodecs) track.codecs = audioCodecs;\n\t\tif (rendition.default) track.default = rendition.default;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\treturn track;\n\t}), ...audioOnlyTracks];\n\tconst textTracks = subtitleRenditions.map((rendition) => {\n\t\tconst track = {\n\t\t\ttype: \"text\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri,\n\t\t\tgroupId: rendition.groupId,\n\t\t\tlabel: rendition.name,\n\t\t\tkind: \"subtitles\",\n\t\t\tmimeType: \"text/vtt\",\n\t\t\tbandwidth: 0\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (rendition.default && rendition.autoselect) track.default = true;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\tif (rendition.forced) track.forced = rendition.forced;\n\t\treturn track;\n\t});\n\tconst selectionSets = [];\n\tif (videoTracks.length > 0) {\n\t\tconst videoSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\ttracks: videoTracks\n\t\t};\n\t\tconst videoSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\tswitchingSets: [videoSwitchingSet]\n\t\t};\n\t\tselectionSets.push(videoSelectionSet);\n\t}\n\tif (audioTracks.length > 0) {\n\t\tconst audioSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\ttracks: audioTracks\n\t\t};\n\t\tconst audioSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\tswitchingSets: [audioSwitchingSet]\n\t\t};\n\t\tselectionSets.push(audioSelectionSet);\n\t}\n\tif (textTracks.length > 0) {\n\t\tconst textSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\ttracks: textTracks\n\t\t};\n\t\tconst textSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\tswitchingSets: [textSwitchingSet]\n\t\t};\n\t\tselectionSets.push(textSelectionSet);\n\t}\n\treturn {\n\t\tid: generateId(),\n\t\turl: unresolved.url,\n\t\tstartTime: 0,\n\t\tselectionSets\n\t};\n}\n\n//#endregion\n//#region src/core/abr/ewma.ts\n/**\n* Exponentially Weighted Moving Average (EWMA)\n*\n* Pure functional implementation of EWMA calculations.\n* Based on Shaka Player's EWMA algorithm.\n*/\n/**\n* Calculate alpha (decay factor) from half-life.\n*\n* Alpha determines how quickly old data \"expires\":\n* - alpha close to 1 = slow decay (long memory)\n* - alpha close to 0 = fast decay (short memory)\n*\n* @param halfLife - The quantity of prior samples (by weight) that make up\n* half of the new estimate. Must be positive.\n* @returns Alpha value between 0 and 1\n*\n* @example\n* const alpha = calculateAlpha(2); // ≈ 0.7071 for 2-second half-life\n*/\nfunction calculateAlpha(halfLife) {\n\treturn Math.exp(Math.log(.5) / halfLife);\n}\n/**\n* Calculate exponentially weighted moving average.\n*\n* Updates an estimate by blending a new value with the previous estimate,\n* weighted by the sample duration. Longer samples have more influence.\n*\n* @param prevEstimate - Previous EWMA estimate\n* @param value - New sample value to incorporate\n* @param weight - Sample weight (typically duration in seconds)\n* @param halfLife - Half-life for decay (typically 2-5 seconds)\n* @returns Updated EWMA estimate\n*\n* @example\n* let estimate = 0;\n* estimate = calculateEwma(estimate, 1_000_000, 1, 2); // First sample\n* estimate = calculateEwma(estimate, 2_000_000, 1, 2); // Second sample\n*/\nfunction calculateEwma(prevEstimate, value, weight, halfLife) {\n\tconst adjAlpha = calculateAlpha(halfLife) ** weight;\n\treturn value * (1 - adjAlpha) + adjAlpha * prevEstimate;\n}\n/**\n* Apply zero-factor correction to EWMA estimate.\n*\n* The zero-factor correction compensates for bias when starting from zero.\n* Without this correction, early estimates would be artificially low.\n*\n* As totalWeight increases, the correction factor approaches 1, meaning\n* the estimate becomes more reliable and needs less correction.\n*\n* @param estimate - Raw EWMA estimate (uncorrected)\n* @param totalWeight - Accumulated weight from all samples\n* @param halfLife - Half-life used in EWMA calculation\n* @returns Corrected estimate, or 0 if totalWeight is 0\n*\n* @example\n* const raw = calculateEwma(0, 1_000_000, 1, 2);\n* const corrected = applyZeroFactor(raw, 1, 2); // ≈ 1_000_000\n*/\nfunction applyZeroFactor(estimate, totalWeight, halfLife) {\n\tif (totalWeight === 0) return 0;\n\treturn estimate / (1 - calculateAlpha(halfLife) ** totalWeight);\n}\n\n//#endregion\n//#region src/core/abr/bandwidth-estimator.ts\n/**\n* Default bandwidth estimator configuration.\n*\n* Values match Shaka Player defaults based on experimentation.\n*/\nconst DEFAULT_BANDWIDTH_CONFIG = {\n\tfastHalfLife: 2,\n\tslowHalfLife: 5,\n\tminTotalBytes: 128e3,\n\tminBytes: 16e3,\n\tminDuration: 5\n};\n/**\n* Add a bandwidth sample from a segment download.\n*\n* Samples are filtered based on:\n* - Minimum bytes (filters TTFB-dominated small segments)\n* - Minimum duration (filters cached responses)\n*\n* Valid samples update both fast and slow EWMA estimates.\n*\n* @param state - Current estimator state\n* @param durationMs - Download duration in milliseconds\n* @param numBytes - Number of bytes downloaded\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns New estimator state with sample incorporated (or unchanged if filtered)\n*\n* @example\n* let state = { fastEstimate: 0, fastTotalWeight: 0, ... };\n* // Sample: 1MB in 1 second\n* state = sampleBandwidth(state, 1000, 1_000_000);\n*/\nfunction sampleBandwidth(state, durationMs, numBytes, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tconst updatedBytesSampled = state.bytesSampled + numBytes;\n\tif (numBytes < config.minBytes) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tif (durationMs < config.minDuration) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tconst bandwidth = 8e3 * numBytes / durationMs;\n\tconst weight = durationMs / 1e3;\n\treturn {\n\t\tfastEstimate: calculateEwma(state.fastEstimate, bandwidth, weight, config.fastHalfLife),\n\t\tfastTotalWeight: state.fastTotalWeight + weight,\n\t\tslowEstimate: calculateEwma(state.slowEstimate, bandwidth, weight, config.slowHalfLife),\n\t\tslowTotalWeight: state.slowTotalWeight + weight,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n}\n/**\n* Get the current bandwidth estimate.\n*\n* Returns the **minimum** of the fast and slow EWMA estimates.\n* This provides the key asymmetric behavior:\n* - When bandwidth drops, fast EWMA reacts first and dominates (quick adaptation)\n* - When bandwidth rises, slow EWMA lags behind and dominates (slow adaptation)\n*\n* Uses default estimate until enough data has been sampled.\n*\n* @param state - Current estimator state\n* @param defaultEstimate - Fallback estimate before sufficient samples (bps)\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns Bandwidth estimate in bits per second\n*\n* @example\n* const estimate = getBandwidthEstimate(state, 5_000_000); // 5 Mbps default\n*/\nfunction getBandwidthEstimate(state, defaultEstimate, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tif (state.bytesSampled < config.minTotalBytes) return defaultEstimate;\n\tconst fastEstimate = applyZeroFactor(state.fastEstimate, state.fastTotalWeight, config.fastHalfLife);\n\tconst slowEstimate = applyZeroFactor(state.slowEstimate, state.slowTotalWeight, config.slowHalfLife);\n\treturn Math.min(fastEstimate, slowEstimate);\n}\n\n//#endregion\n//#region src/core/abr/quality-selection.ts\n/**\n* Default quality selection configuration.\n* Values match Shaka Player upgrade threshold (0.85 = 15% headroom).\n*/\nconst DEFAULT_QUALITY_CONFIG = { safetyMargin: .85 };\n/**\n* Select the best video track based on current bandwidth estimate.\n*\n* Selects the highest quality track where bandwidth is sufficient with safety margin:\n* - currentBandwidth >= track.bandwidth / safetyMargin\n* - Default safetyMargin 0.85 means track uses ≤85% of bandwidth (15% headroom)\n* - At same bandwidth, prefers higher resolution\n*\n* @param tracks - Available video tracks (can be unsorted)\n* @param currentBandwidth - Current bandwidth estimate in bits per second\n* @param config - Optional quality selection configuration\n* @returns Selected track, or undefined if no tracks available\n*\n* @example\n* const tracks = [\n* { id: '360p', bandwidth: 500_000, ... },\n* { id: '720p', bandwidth: 2_000_000, ... },\n* { id: '1080p', bandwidth: 4_000_000, ... },\n* ];\n*\n* // With 2.5 Mbps, selects 720p (1080p needs 4M/0.85 = 4.7 Mbps)\n* const selected = selectQuality(tracks, 2_500_000);\n*/\nfunction selectQuality(tracks, currentBandwidth, config = DEFAULT_QUALITY_CONFIG) {\n\tif (tracks.length === 0) return;\n\tconst sortedTracks = tracks.slice().sort((a, b) => a.bandwidth - b.bandwidth);\n\tlet chosen;\n\tfor (const track of sortedTracks) if (currentBandwidth >= track.bandwidth / config.safetyMargin) {\n\t\tif (!chosen || track.bandwidth > chosen.bandwidth || track.bandwidth === chosen.bandwidth && hasHigherResolution(track, chosen)) chosen = track;\n\t}\n\treturn chosen ?? sortedTracks[0];\n}\n/**\n* Check if track A has higher resolution than track B.\n* Compares by total pixel count (width × height).\n*\n* @param trackA - First track to compare\n* @param trackB - Second track to compare\n* @returns True if trackA has more pixels than trackB\n*/\nfunction hasHigherResolution(trackA, trackB) {\n\treturn (trackA.width ?? 0) * (trackA.height ?? 0) > (trackB.width ?? 0) * (trackB.height ?? 0);\n}\n\n//#endregion\n//#region src/core/buffer/back-buffer.ts\n/**\n* Default back buffer configuration.\n*/\nconst DEFAULT_BACK_BUFFER_CONFIG = { keepSegments: 2 };\n/**\n* Calculate back buffer flush point.\n*\n* Determines where to flush old segments from the back buffer.\n* Keeps a fixed number of segments behind the current playback position.\n*\n* Algorithm:\n* 1. Find segments before currentTime\n* 2. Count back N segments (keepSegments)\n* 3. Return startTime of segment N+1 back (flush everything before this)\n*\n* @param segments - Available segments (should be sorted by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional back buffer configuration\n* @returns Time in seconds to flush up to (flush range: [0, flushEnd))\n*\n* @example\n* const segments = [\n* { startTime: 0, duration: 6, ... },\n* { startTime: 6, duration: 6, ... },\n* { startTime: 12, duration: 6, ... },\n* { startTime: 18, duration: 6, ... },\n* ];\n*\n* // Playing at 18s, keep 2 segments\n* const flushEnd = calculateBackBufferFlushPoint(segments, 18);\n* // Returns 6 (flush [0, 6), keep [6-18))\n*/\nfunction calculateBackBufferFlushPoint(segments, currentTime, config = DEFAULT_BACK_BUFFER_CONFIG) {\n\tif (segments.length === 0) return 0;\n\tconst segmentsBefore = segments.filter((seg) => seg.startTime < currentTime);\n\tif (segmentsBefore.length === 0) return 0;\n\tconst segmentsToFlush = segmentsBefore.length - config.keepSegments;\n\tif (segmentsToFlush <= 0) return 0;\n\tif (segmentsToFlush >= segmentsBefore.length) return currentTime;\n\treturn segmentsBefore[segmentsToFlush].startTime;\n}\n\n//#endregion\n//#region src/core/buffer/forward-buffer.ts\n/**\n* Default forward buffer configuration.\n*/\nconst DEFAULT_FORWARD_BUFFER_CONFIG = { bufferDuration: 30 };\n/**\n* Get segments that need to be loaded for forward buffer.\n*\n* Determines which segments to load to maintain target buffer duration.\n* Handles discontiguous buffering (gaps after seeks).\n*\n* Algorithm:\n* 1. Calculate target time: currentTime + bufferDuration\n* 2. Find all segments in range [currentTime, targetTime)\n* 3. Filter out segments already buffered at that time position\n* 4. Return segments to load (fills gaps + extends to target)\n*\n* @param segments - All available segments from playlist\n* @param bufferedSegments - Segments already buffered (ordered by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Array of segments to load (empty if buffer is sufficient)\n*\n* @example\n* // After seek: buffered [0-12, 18-30], playing at 7s\n* const toLoad = getSegmentsToLoad(segments, buffered, 7, { bufferDuration: 24 });\n* // Returns [seg-12, seg-30] (fills gap, extends to target 31s)\n*/\n/**\n* Calculate the start time from which to flush forward buffer content.\n*\n* Content that starts at or beyond `currentTime + bufferDuration` is no\n* longer needed for the current playback position and should be removed\n* from the SourceBuffer. This prevents unbounded accumulation of scattered\n* SourceBuffer content after seeks, which can cause QuotaExceededError on\n* long-form content.\n*\n* Returns `Infinity` when nothing needs flushing (no buffered segments\n* exist beyond the threshold).\n*\n* @param bufferedSegments - Segments currently tracked in the buffer model\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Start time to flush from (flush range: [flushStart, Infinity)),\n* or Infinity if no flush is needed\n*\n* @example\n* // Playing at 0s, buffered [0,6,12,18,24,30,36], bufferDuration=30\n* const flushStart = calculateForwardFlushPoint(segments, 0);\n* // Returns 30 — flush [30, Infinity), keep [0, 30)\n*/\nfunction calculateForwardFlushPoint(bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (bufferedSegments.length === 0) return Infinity;\n\tconst threshold = currentTime + config.bufferDuration;\n\tconst beyond = bufferedSegments.filter((seg) => seg.startTime >= threshold);\n\tif (beyond.length === 0) return Infinity;\n\treturn Math.min(...beyond.map((seg) => seg.startTime));\n}\nfunction getSegmentsToLoad(segments, bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (segments.length === 0) return [];\n\tconst targetTime = currentTime + config.bufferDuration;\n\tconst bufferedStartTimes = new Set(bufferedSegments.map((seg) => seg.startTime));\n\treturn segments.filter((seg) => {\n\t\tconst segmentEnd = seg.startTime + seg.duration;\n\t\tconst isInRange = seg.startTime < targetTime && segmentEnd > currentTime;\n\t\tconst isNotBuffered = !bufferedStartTimes.has(seg.startTime);\n\t\treturn isInRange && isNotBuffered;\n\t});\n}\n\n//#endregion\n//#region src/core/types/index.ts\nfunction isResolvedTrack(track) {\n\treturn \"segments\" in track;\n}\n/**\n* Check if a presentation has duration (at least one track resolved).\n* Narrows type to include required duration.\n*/\nfunction hasPresentationDuration(presentation) {\n\treturn presentation.duration !== void 0;\n}\n\n//#endregion\n//#region src/dom/media/mediasource-setup.ts\n/**\n* MediaSource Setup\n*\n* Utilities for creating and configuring MediaSource/ManagedMediaSource\n* for MSE (Media Source Extensions) playback.\n*\n* Global ManagedMediaSource types are defined in ./mediasource.d.ts\n*/\n/**\n* Check if MediaSource API is supported.\n*/\nfunction supportsMediaSource() {\n\treturn typeof MediaSource !== \"undefined\";\n}\n/**\n* Check if ManagedMediaSource API is supported.\n* ManagedMediaSource is a newer Safari API with better lifecycle management.\n*/\nfunction supportsManagedMediaSource() {\n\treturn typeof ManagedMediaSource !== \"undefined\";\n}\n/**\n* Create a MediaSource or ManagedMediaSource instance.\n*\n* @param options - Creation options\n* @returns A MediaSource or ManagedMediaSource instance\n* @throws Error if no MediaSource API is available\n*\n* @example\n* const mediaSource = createMediaSource();\n* const mediaElement = document.querySelector('video');\n* attachMediaSource(mediaSource, mediaElement);\n*/\nfunction createMediaSource(options = {}) {\n\tconst { preferManaged = false } = options;\n\tif (preferManaged && supportsManagedMediaSource()) return new ManagedMediaSource();\n\tif (supportsMediaSource()) return new MediaSource();\n\tthrow new Error(\"MediaSource API is not supported\");\n}\n/**\n* Attach a MediaSource to an HTMLMediaElement.\n*\n* Uses srcObject for ManagedMediaSource (Safari), or createObjectURL for regular MediaSource.\n*\n* @param mediaSource - The MediaSource to attach\n* @param mediaElement - The media element to attach to\n* @returns Object with URL and detach function\n*\n* @example\n* const mediaSource = createMediaSource();\n* const { detach } = attachMediaSource(mediaSource, videoElement);\n* await waitForSourceOpen(mediaSource);\n* // Use mediaSource...\n* // Later, to clean up:\n* detach();\n*/\nfunction attachMediaSource(mediaSource, mediaElement) {\n\tif (supportsManagedMediaSource() && mediaSource instanceof ManagedMediaSource) {\n\t\tmediaElement.disableRemotePlayback = true;\n\t\tmediaElement.srcObject = mediaSource;\n\t\tconst detach$1 = () => {\n\t\t\tmediaElement.srcObject = null;\n\t\t\tmediaElement.load();\n\t\t};\n\t\treturn {\n\t\t\turl: \"\",\n\t\t\tdetach: detach$1\n\t\t};\n\t}\n\tconst url = URL.createObjectURL(mediaSource);\n\tmediaElement.src = url;\n\tconst detach = () => {\n\t\tmediaElement.removeAttribute(\"src\");\n\t\tmediaElement.load();\n\t\tURL.revokeObjectURL(url);\n\t};\n\treturn {\n\t\turl,\n\t\tdetach\n\t};\n}\n/**\n* Wait for a MediaSource to reach the 'open' state.\n* Resolves immediately if already open.\n*\n* @param mediaSource - The MediaSource to wait for\n* @param signal - Optional AbortSignal for cancellation\n* @returns Promise that resolves when the MediaSource is open\n*\n* @example\n* const mediaSource = createMediaSource();\n* attachMediaSource(mediaSource, videoElement);\n* await waitForSourceOpen(mediaSource);\n* // MediaSource is now ready for SourceBuffer creation\n*/\nfunction waitForSourceOpen(mediaSource, signal) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (mediaSource.readyState === \"open\") {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tif (signal?.aborted) {\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\treturn;\n\t\t}\n\t\tconst controller = new AbortController();\n\t\tconst options = { signal: controller.signal };\n\t\tmediaSource.addEventListener(\"sourceopen\", () => {\n\t\t\tcontroller.abort();\n\t\t\tresolve();\n\t\t}, options);\n\t\tsignal?.addEventListener(\"abort\", () => {\n\t\t\tcontroller.abort();\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t}, options);\n\t});\n}\n/**\n* Create a SourceBuffer on a MediaSource.\n*\n* @param mediaSource - The MediaSource (must be in 'open' state)\n* @param mimeCodec - MIME type with codecs (e.g., 'video/mp4; codecs=\"avc1.42E01E\"')\n* @returns The created SourceBuffer\n* @throws Error if MediaSource is not open or codec is unsupported\n*\n* @example\n* await waitForSourceOpen(mediaSource);\n* const buffer = createSourceBuffer(mediaSource, 'video/mp4; codecs=\"avc1.42E01E\"');\n*/\nfunction createSourceBuffer(mediaSource, mimeCodec) {\n\tif (mediaSource.readyState !== \"open\") throw new Error(\"MediaSource is not open\");\n\tif (!isCodecSupported(mimeCodec)) throw new Error(`Codec not supported: ${mimeCodec}`);\n\treturn mediaSource.addSourceBuffer(mimeCodec);\n}\n/**\n* Check if a codec is supported.\n*\n* @param mimeCodec - MIME type with codecs string\n* @returns True if the codec is supported\n*\n* @example\n* if (isCodecSupported('video/mp4; codecs=\"avc1.42E01E\"')) {\n* // Create source buffer\n* }\n*/\nfunction isCodecSupported(mimeCodec) {\n\tif (!supportsMediaSource()) return false;\n\treturn MediaSource.isTypeSupported(mimeCodec);\n}\n\n//#endregion\n//#region src/dom/network/fetch.ts\n/**\n* Fetch resolvable from AddressableObject.\n*\n* Handles byte range requests if byteRange is present.\n* Returns native fetch Response for composability (can extract text, stream, etc.).\n*\n* @param addressable - Resource to fetch (url + optional byteRange)\n* @returns Promise resolving to Response\n*\n* @example\n* const response = await fetchResolvable({ url: 'https://example.com/segment.m4s' });\n* const text = await getResponseText(response);\n*\n* @example\n* // With byte range\n* const response = await fetchResolvable({\n* url: 'https://example.com/file.mp4',\n* byteRange: { start: 1000, end: 1999 }\n* });\n*/\nasync function fetchResolvable(addressable, options) {\n\tconst headers = new Headers(options?.headers);\n\tif (addressable.byteRange) {\n\t\tconst { start, end } = addressable.byteRange;\n\t\theaders.set(\"Range\", `bytes=${start}-${end}`);\n\t}\n\tconst request = new Request(addressable.url, {\n\t\tmethod: \"GET\",\n\t\theaders,\n\t\t...options\n\t});\n\treturn fetch(request);\n}\n/**\n* Fetch resolvable as bytes.\n*\n* Convenience wrapper around fetchResolvable that resolves the body as an\n* ArrayBuffer. Use this when you need the raw bytes (e.g. segment appends).\n* For text or streaming consumption, use fetchResolvable directly.\n*/\nasync function fetchResolvableBytes(addressable, options) {\n\treturn (await fetchResolvable(addressable, options)).arrayBuffer();\n}\n/**\n* Extract text from Response.\n*\n* Accepts minimal Response-like object (just needs text() method).\n* Returns promise from response.text().\n*\n* @param response - Response-like object with text() method\n* @returns Promise resolving to text content\n*\n* @example\n* const response = await fetchResolvable(addressable);\n* const text = await getResponseText(response);\n*/\nfunction getResponseText(response) {\n\treturn response.text();\n}\n\n//#endregion\n//#region src/core/events/create-event-stream.ts\n/**\n* Minimal event stream with Observable-like shape.\n*\n* Simple Subject/Observable-like implementation for dispatching discrete events.\n* Events are dispatched synchronously to all subscribers.\n*/\nconst EVENT_STREAM_SYMBOL = Symbol(\"@videojs/event-stream\");\n/**\n* Creates a minimal event stream for dispatching discrete events.\n*\n* Events are dispatched synchronously to all subscribers.\n* Conforms to Observable-like shape for future compatibility.\n*\n* Events must have a 'type' property for discriminated union type narrowing.\n*\n* @example\n* ```ts\n* type Action = { type: 'PLAY' } | { type: 'PAUSE' };\n* const events = createEventStream<Action>();\n*\n* events.subscribe((action) => {\n* if (action.type === 'PLAY') {\n* // Type narrowed to { type: 'PLAY' }\n* }\n* });\n*\n* events.dispatch({ type: 'PLAY' });\n* ```\n*/\nfunction createEventStream() {\n\tconst subscribers = /* @__PURE__ */ new Set();\n\treturn {\n\t\t[EVENT_STREAM_SYMBOL]: true,\n\t\tdispatch(event) {\n\t\t\tconst current = Array.from(subscribers);\n\t\t\tfor (const listener of current) listener(event);\n\t\t},\n\t\tsubscribe(listener) {\n\t\t\tsubscribers.add(listener);\n\t\t\treturn () => subscribers.delete(listener);\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/core/reactive/combine-latest.ts\n/**\n* Combines multiple Observable sources into a single Observable.\n*\n* Emits an array of latest values whenever any source emits.\n* Only emits after all sources have emitted at least once.\n*\n* Supports selector-based subscriptions (fires only when the selected value\n* changes, per the optional equalityFn) mirroring the createState API.\n*\n* @param sources - Array of Observable sources\n* @returns Combined Observable\n*\n* @example\n* ```ts\n* const state = createState({ count: 0 });\n* const events = createEventStream<Action>();\n*\n* combineLatest([state, events]).subscribe(([state, event]) => {\n* if (event.type === 'PLAY' && state.count > 0) {\n* // React to event + state condition\n* }\n* });\n* ```\n*\n* @example Selector subscription\n* ```ts\n* combineLatest([state, owners]).subscribe(\n* ([s, o]) => deriveKey(s, o),\n* (key) => { ... },\n* { equalityFn: keyEq }\n* );\n* ```\n*/\nfunction combineLatest(sources) {\n\tconst subscribeToSources = (listener) => {\n\t\tconst latest = new Array(sources.length);\n\t\tconst hasValue = new Array(sources.length).fill(false);\n\t\tconst unsubscribers = [];\n\t\tfor (let i = 0; i < sources.length; i++) {\n\t\t\tconst unsubscribe = sources[i].subscribe((value) => {\n\t\t\t\tlatest[i] = value;\n\t\t\t\thasValue[i] = true;\n\t\t\t\tif (hasValue.every((has) => has)) listener([...latest]);\n\t\t\t});\n\t\t\tunsubscribers.push(unsubscribe);\n\t\t}\n\t\treturn () => {\n\t\t\tfor (const unsubscribe of unsubscribers) unsubscribe();\n\t\t};\n\t};\n\treturn { subscribe(listenerOrSelector, maybeListener, options) {\n\t\tif (maybeListener === void 0) return subscribeToSources(listenerOrSelector);\n\t\tconst selector = listenerOrSelector;\n\t\tconst listener = maybeListener;\n\t\tconst equalityFn = options?.equalityFn ?? Object.is;\n\t\tlet prevSelected;\n\t\tlet initialized = false;\n\t\treturn subscribeToSources((values) => {\n\t\t\tconst nextSelected = selector(values);\n\t\t\tif (!initialized || !equalityFn(prevSelected, nextSelected)) {\n\t\t\t\tprevSelected = nextSelected;\n\t\t\t\tinitialized = true;\n\t\t\t\tlistener(nextSelected);\n\t\t\t}\n\t\t});\n\t} };\n}\n\n//#endregion\n//#region src/core/features/resolve-presentation.ts\n/**\n* Type guard to check if presentation is unresolved.\n*/\nfunction isUnresolved(presentation) {\n\treturn presentation !== void 0 && \"url\" in presentation && !(\"id\" in presentation);\n}\nfunction canResolve$1(state) {\n\treturn isUnresolved(state.presentation);\n}\n/**\n* Determines if resolution conditions are met based on preload policy and event.\n*\n* Resolution conditions:\n* - State-driven: preload is 'auto' or 'metadata'\n* - Event-driven: play event\n*\n* @param state - Current presentation state\n* @param event - Current action/event\n* @returns true if resolution conditions are met\n*/\nfunction shouldResolve$1(state, event) {\n\tconst { preload } = state;\n\treturn [\"auto\", \"metadata\"].includes(preload) || event.type === \"play\";\n}\n/**\n* Syncs preload attribute from mediaElement to state.\n*\n* Watches the owners state for mediaElement changes and copies the\n* preload attribute to the immutable state.\n*\n* @param state - Immutable state container\n* @param owners - Mutable platform objects container\n* @returns Cleanup function to stop syncing\n*/\nfunction syncPreloadAttribute(state, owners) {\n\treturn owners.subscribe((current) => {\n\t\tconst preload = current.mediaElement?.preload || void 0;\n\t\tstate.patch({ preload });\n\t});\n}\n/**\n* Resolves unresolved presentations using reactive composition.\n*\n* Uses combineLatest to compose state + events, enabling both state-driven\n* and event-driven resolution triggers.\n*\n* Triggers resolution when:\n* - State-driven: Unresolved presentation + preload allows (auto/metadata)\n* - Event-driven: PLAY event when preload=\"none\"\n*\n* @example\n* ```ts\n* const state = createState({ presentation: undefined, preload: 'auto' });\n* const events = createEventStream<PresentationAction>();\n*\n* const cleanup = resolvePresentation({ state, events });\n*\n* // State-driven: resolves immediately when preload allows\n* state.patch({ presentation: { url: 'http://example.com/playlist.m3u8' } });\n*\n* // Event-driven: resolves on PLAY when preload=\"none\"\n* state.patch({ preload: 'none', presentation: { url: '...' } });\n* events.dispatch({ type: 'PLAY' });\n* ```\n*/\nfunction resolvePresentation({ state, events }) {\n\tlet resolving = false;\n\tlet abortController = null;\n\tconst cleanup = combineLatest([state, events]).subscribe(async ([currentState, event]) => {\n\t\tif (!canResolve$1(currentState) || !shouldResolve$1(currentState, event) || resolving) return;\n\t\ttry {\n\t\t\tresolving = true;\n\t\t\tabortController = new AbortController();\n\t\t\tconst { presentation } = currentState;\n\t\t\tconst parsed = parseMultivariantPlaylist(await getResponseText(await fetchResolvable(presentation, { signal: abortController.signal })), presentation);\n\t\t\tstate.patch({ presentation: parsed });\n\t\t} catch (error) {\n\t\t\tif (error instanceof Error && error.name === \"AbortError\") return;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tresolving = false;\n\t\t\tabortController = null;\n\t\t}\n\t});\n\treturn () => {\n\t\tabortController?.abort();\n\t\tcleanup();\n\t};\n}\n\n//#endregion\n//#region src/core/features/quality-switching.ts\n/**\n* Default quality switching configuration.\n*/\nconst DEFAULT_SWITCHING_CONFIG = {\n\tsafetyMargin: .85,\n\tminUpgradeInterval: 8e3,\n\tdefaultBandwidth: 5e6\n};\n/**\n* Get all video tracks from a presentation's first switching set.\n* Returns [] when the presentation is still unresolved (no selectionSets yet).\n*/\nfunction getVideoTracks(presentation) {\n\treturn (presentation.selectionSets?.find((s) => s.type === \"video\"))?.switchingSets[0]?.tracks ?? [];\n}\n/**\n* Quality switching orchestration (F9).\n*\n* Reacts to bandwidth estimate changes and updates `selectedVideoTrackId`\n* when a different quality is optimal:\n*\n* - **Downgrades** happen immediately to avoid buffering stalls.\n* - **Upgrades** are gated by `minUpgradeInterval` to prevent oscillation.\n* - The first switch (from any track, or no track) is always immediate.\n*\n* Smooth switching is handled downstream: when `selectedVideoTrackId` changes,\n* `resolveTrack` fetches the new playlist and `loadSegments` reloads the init\n* segment, then appends media segments from the current position in the new\n* quality. The browser's SourceBuffer replaces the overlapping buffered range.\n*\n* @example\n* const cleanup = switchQuality({ state });\n* // Later, when done:\n* cleanup();\n*/\nfunction switchQuality({ state }, config = {}) {\n\tconst safetyMargin = config.safetyMargin ?? DEFAULT_SWITCHING_CONFIG.safetyMargin;\n\tconst minUpgradeInterval = config.minUpgradeInterval ?? DEFAULT_SWITCHING_CONFIG.minUpgradeInterval;\n\tconst defaultBandwidth = config.defaultBandwidth ?? DEFAULT_SWITCHING_CONFIG.defaultBandwidth;\n\tlet lastUpgradeTime = Date.now();\n\tlet firstMeaningfulFire = true;\n\treturn state.subscribe((currentState) => {\n\t\tconst { presentation, bandwidthState, selectedVideoTrackId, abrDisabled } = currentState;\n\t\tif (abrDisabled === true) return;\n\t\tif (!presentation || !bandwidthState) return;\n\t\tconst videoTracks = getVideoTracks(presentation);\n\t\tif (videoTracks.length === 0) return;\n\t\tconst isFirst = firstMeaningfulFire;\n\t\tfirstMeaningfulFire = false;\n\t\tconst optimal = selectQuality(videoTracks, getBandwidthEstimate(bandwidthState, defaultBandwidth), { safetyMargin });\n\t\tif (!optimal || optimal.id === selectedVideoTrackId) return;\n\t\tconst currentTrack = videoTracks.find((t) => t.id === selectedVideoTrackId);\n\t\tif (!currentTrack || optimal.bandwidth > currentTrack.bandwidth) {\n\t\t\tconst now = Date.now();\n\t\t\tif (!isFirst && now - lastUpgradeTime < minUpgradeInterval) return;\n\t\t\tlastUpgradeTime = now;\n\t\t}\n\t\tstate.patch({ selectedVideoTrackId: optimal.id });\n\t});\n}\n\n//#endregion\n//#region src/core/utils/track-selection.ts\n/**\n* Map track type to selected track ID property key in state.\n*/\nconst SelectedTrackIdKeyByType = {\n\tvideo: \"selectedVideoTrackId\",\n\taudio: \"selectedAudioTrackId\",\n\ttext: \"selectedTextTrackId\"\n};\n/**\n* Map track type to buffer owner property key.\n* Used for SourceBuffer references in owners.\n*/\nconst BufferKeyByType = {\n\tvideo: \"videoBuffer\",\n\taudio: \"audioBuffer\"\n};\n/**\n* Get selected track from state by type.\n* Returns properly typed track (partially or fully resolved) or undefined.\n* Type parameter T is inferred from the type argument.\n*\n* @example\n* const videoTrack = getSelectedTrack(state, 'video');\n* if (videoTrack && isResolvedTrack(videoTrack)) {\n* // videoTrack is VideoTrack\n* }\n*/\nfunction getSelectedTrack(state, type) {\n\tconst { presentation } = state;\n\t/** @TODO Consider moving and reusing isUnresolved(presentation) (CJP) */\n\tif (!presentation || !(\"id\" in presentation)) return void 0;\n\tconst trackId = state[SelectedTrackIdKeyByType[type]];\n\treturn presentation.selectionSets.find(({ type: selectionSetType }) => selectionSetType === type)?.switchingSets[0]?.tracks.find(({ id }) => id === trackId);\n}\n\n//#endregion\n//#region src/dom/features/segment-loader-actor.ts\n/**\n* Creates a SegmentLoaderActor for one track type (video or audio).\n*\n* Receives load assignments via `send()` and owns all execution: planning,\n* removes, fetches, and appends. Coordinates with the SourceBufferActor for\n* all physical SourceBuffer operations.\n*\n* Planning (Cases 1–3) happens in `send()` on every incoming message, producing\n* an ordered LoadTask list. The runner drains that list sequentially. When a new\n* message arrives mid-run, send() replans and either continues the in-flight\n* operation (if still needed) or preempts it.\n*\n* @param sourceBufferActor - Shared SourceBufferActor reference (not owned)\n* @param fetchBytes - Tracked fetch closure (owns throughput sampling)\n*/\nfunction createSegmentLoaderActor(sourceBufferActor, fetchBytes) {\n\tlet pendingTasks = null;\n\tlet inFlightInitTrackId = null;\n\tlet inFlightSegmentId = null;\n\tlet abortController = null;\n\tlet running = false;\n\tlet destroyed = false;\n\tconst getBufferedSegments = (allSegments) => {\n\t\tconst bufferedIds = new Set(sourceBufferActor.snapshot.context.segments.map((s) => s.id));\n\t\treturn allSegments.filter((s) => bufferedIds.has(s.id));\n\t};\n\t/**\n\t* Translate a load message into an ordered LoadTask list based on committed\n\t* actor state. In-flight awareness is handled separately in send().\n\t*\n\t* @todo Rename alongside LoadTask (e.g. planOps).\n\t*\n\t* Case 1 — Removes: forward and back buffer flush points, segment-aligned.\n\t* No flush on track switch: appending new content overwrites existing buffer\n\t* ranges, and the actor's time-aligned deduplication keeps the segment model\n\t* accurate as new segments arrive.\n\t*\n\t* Case 2 — Init: schedule if not yet committed for this track.\n\t*\n\t* Case 3 — Segments: all segments in the load window not yet committed.\n\t*/\n\tconst planTasks = (message) => {\n\t\tconst { track, range } = message;\n\t\tconst actorCtx = sourceBufferActor.snapshot.context;\n\t\tconst bufferedSegments = getBufferedSegments(track.segments);\n\t\tconst currentTime = range?.start ?? 0;\n\t\tconst tasks = [];\n\t\tif (range) {\n\t\t\tconst forwardFlushStart = calculateForwardFlushPoint(bufferedSegments, currentTime);\n\t\t\tif (forwardFlushStart < Infinity) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: forwardFlushStart,\n\t\t\t\tend: Infinity\n\t\t\t});\n\t\t\tconst backFlushEnd = calculateBackBufferFlushPoint(bufferedSegments, currentTime);\n\t\t\tif (backFlushEnd > 0) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: 0,\n\t\t\t\tend: backFlushEnd\n\t\t\t});\n\t\t}\n\t\tif (actorCtx.initTrackId !== track.id) tasks.push({\n\t\t\ttype: \"append-init\",\n\t\t\tmeta: { trackId: track.id },\n\t\t\turl: track.initialization.url\n\t\t});\n\t\tif (range) {\n\t\t\tconst EPSILON = 1e-4;\n\t\t\tconst segmentsToLoad = getSegmentsToLoad(track.segments, bufferedSegments, currentTime).filter((seg) => {\n\t\t\t\tconst existing = actorCtx.segments.find((s) => Math.abs(s.startTime - seg.startTime) < EPSILON);\n\t\t\t\tif (!existing?.trackBandwidth || !track.bandwidth) return true;\n\t\t\t\treturn track.bandwidth > existing.trackBandwidth;\n\t\t\t});\n\t\t\tfor (const segment of segmentsToLoad) tasks.push({\n\t\t\t\ttype: \"append-segment\",\n\t\t\t\tmeta: {\n\t\t\t\t\tid: segment.id,\n\t\t\t\t\tstartTime: segment.startTime,\n\t\t\t\t\tduration: segment.duration,\n\t\t\t\t\ttrackId: track.id,\n\t\t\t\t\ttrackBandwidth: track.bandwidth\n\t\t\t\t},\n\t\t\t\turl: segment.url\n\t\t\t});\n\t\t}\n\t\treturn tasks;\n\t};\n\t/**\n\t* Execute a single LoadTask: fetch (if needed) then forward to SourceBufferActor.\n\t* Sets/clears in-flight tracking around async operations so send() can make\n\t* accurate continue/preempt decisions at any point during execution.\n\t*\n\t* @todo Rename alongside LoadTask (e.g. executeOp).\n\t*/\n\tconst executeLoadTask = async (task) => {\n\t\tconst signal = abortController.signal;\n\t\ttry {\n\t\t\tif (task.type === \"remove\") {\n\t\t\t\tawait sourceBufferActor.send(task, signal);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (task.type === \"append-init\") {\n\t\t\t\tinFlightInitTrackId = task.meta.trackId;\n\t\t\t\tif (!signal.aborted) {\n\t\t\t\t\tconst data = await fetchBytes(task, { signal });\n\t\t\t\t\tconst isTrackSwitch = pendingTasks?.some((t) => t.type === \"append-init\" && t.meta.trackId !== task.meta.trackId);\n\t\t\t\t\tif (!signal.aborted || !isTrackSwitch) {\n\t\t\t\t\t\tconst appendSignal = signal.aborted ? new AbortController().signal : signal;\n\t\t\t\t\t\tawait sourceBufferActor.send({\n\t\t\t\t\t\t\ttype: \"append-init\",\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tmeta: task.meta\n\t\t\t\t\t\t}, appendSignal);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tinFlightSegmentId = task.meta.id;\n\t\t\tif (!signal.aborted) {\n\t\t\t\tconst data = await fetchBytes(task, { signal });\n\t\t\t\tif (!signal.aborted) await sourceBufferActor.send({\n\t\t\t\t\ttype: \"append-segment\",\n\t\t\t\t\tdata,\n\t\t\t\t\tmeta: task.meta\n\t\t\t\t}, signal);\n\t\t\t}\n\t\t} finally {\n\t\t\tinFlightInitTrackId = null;\n\t\t\tinFlightSegmentId = null;\n\t\t}\n\t};\n\t/**\n\t* Drain the scheduled task list sequentially.\n\t* After each task completes, checks for a pending replacement plan from send().\n\t* If the signal was aborted and no new plan arrived, stops immediately.\n\t*/\n\tconst runScheduled = async (initialTasks) => {\n\t\trunning = true;\n\t\tabortController = new AbortController();\n\t\tlet scheduled = initialTasks;\n\t\twhile (scheduled.length > 0 && !destroyed) {\n\t\t\tconst task = scheduled[0];\n\t\t\tscheduled = scheduled.slice(1);\n\t\t\ttry {\n\t\t\t\tawait executeLoadTask(task);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") {} else {\n\t\t\t\t\tconsole.error(\"Unexpected error in segment loader:\", error);\n\t\t\t\t\tscheduled = [];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pendingTasks !== null) {\n\t\t\t\tscheduled = pendingTasks;\n\t\t\t\tpendingTasks = null;\n\t\t\t\tabortController = new AbortController();\n\t\t\t} else if (abortController.signal.aborted) break;\n\t\t}\n\t\tabortController = null;\n\t\trunning = false;\n\t};\n\treturn {\n\t\tsend(message) {\n\t\t\tif (destroyed) return;\n\t\t\tconst allTasks = planTasks(message);\n\t\t\tif (!running) {\n\t\t\t\tif (allTasks.length === 0) return;\n\t\t\t\trunScheduled(allTasks);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inFlightSegmentId !== null && allTasks.some((t) => t.type === \"append-segment\" && t.meta.id === inFlightSegmentId) || inFlightInitTrackId !== null && allTasks.some((t) => t.type === \"append-init\" && t.meta.trackId === inFlightInitTrackId)) pendingTasks = allTasks.filter((t) => !(t.type === \"append-segment\" && t.meta.id === inFlightSegmentId) && !(t.type === \"append-init\" && t.meta.trackId === inFlightInitTrackId));\n\t\t\telse {\n\t\t\t\tpendingTasks = allTasks;\n\t\t\t\tabortController?.abort();\n\t\t\t}\n\t\t},\n\t\tdestroy() {\n\t\t\tdestroyed = true;\n\t\t\tabortController?.abort();\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/dom/features/load-segments.ts\nconst ActorKeyByType$1 = {\n\tvideo: \"videoBufferActor\",\n\taudio: \"audioBufferActor\"\n};\n/**\n* Creates a fetch function that transparently samples bandwidth after each\n* completed request. Callers receive bytes; throughput tracking is invisible.\n*\n* `onSample` is an optional callback invoked after each sample is recorded,\n* used for bridging throughput state outward (e.g. migration bridge to global\n* state). A callback is used rather than a subscription so that no immediate\n* fire occurs at setup time — subscriptions fire on registration and would\n* trigger spurious state changes before any work has started.\n*/\nfunction createTrackedFetch(throughput, onSample) {\n\treturn async (addressable, options) => {\n\t\tconst start = performance.now();\n\t\tconst data = await fetchResolvableBytes(addressable, options);\n\t\tconst elapsed = performance.now() - start;\n\t\tconst next = sampleBandwidth(throughput.current, elapsed, data.byteLength);\n\t\tthroughput.patch(next);\n\t\tthroughput.flush();\n\t\tonSample?.(next);\n\t\treturn data;\n\t};\n}\nfunction selectLoadingInputs([segmentsCanLoad, state], type) {\n\tconst { playbackInitiated, preload, currentTime } = state;\n\treturn {\n\t\tplaybackInitiated,\n\t\tpreload,\n\t\tcurrentTime,\n\t\ttrack: getSelectedTrack(state, type),\n\t\tsegmentsCanLoad\n\t};\n}\n/**\n* Equality function encoding the condition hierarchy for relevant changes.\n*\n* Pre-play (!playbackInitiated):\n* Only preload changes matter. currentTime and resolvedTrackId are ignored\n* (track changes not supported pre-play; currentTime value is used at\n* trigger time but changes don't re-trigger).\n*\n* playbackInitiated transition:\n* Always fires (handled in the subscriber; preload='auto' suppression\n* applied there since equality functions have no memory of prior values).\n*\n* Post-play (playbackInitiated):\n* resolvedTrackId changes (track switch or previously-unresolved track\n* resolving) and currentTime changes both trigger. preload is irrelevant.\n*/\nconst segmentStartFor = (currentTime, track) => {\n\tif (currentTime == null) return void 0;\n\treturn track?.segments.find(({ startTime, duration }, i, segments) => currentTime >= startTime && (currentTime < startTime + duration || i === segments.length - 1))?.startTime;\n};\n/**\n* Returns true when the inputs are equal (no meaningful change — don't fire).\n* Returns false when the inputs differ in a way that requires a new message.\n*\n* This IS the shouldLoadSegments logic, expressed as an equality function.\n*/\nfunction loadingInputsEq(prevState, curState) {\n\tif (!curState.segmentsCanLoad) return true;\n\tif (!curState.playbackInitiated) {\n\t\tif (curState.preload === \"none\") return true;\n\t\treturn curState.preload === prevState.preload;\n\t}\n\tif (!prevState.playbackInitiated && curState.playbackInitiated) {\n\t\tif (prevState.preload !== \"auto\") return false;\n\t}\n\tif (!curState.track || !isResolvedTrack(curState.track)) return true;\n\tif (prevState.track?.id !== curState.track.id && isResolvedTrack(curState.track)) return false;\n\treturn segmentStartFor(prevState.currentTime, curState.track) === segmentStartFor(curState.currentTime, curState.track);\n}\n/**\n* Load segments orchestration — Reactor layer.\n*\n* Sends typed load messages to a SegmentLoaderActor when relevant conditions\n* change. Uses targeted subscriptions rather than broad combineLatest so only\n* meaningful state changes trigger evaluation.\n*\n* Condition hierarchy (see SegmentLoadingKey for detail):\n*\n* !playbackInitiated\n* preload==='none' (or unset) → dormant; no trigger\n* preload==='metadata' → trigger on transition to 'metadata'\n* preload==='auto' → trigger on transition to 'auto'\n*\n* !playbackInitiated → playbackInitiated\n* preload !== 'auto' → trigger (message shape changes)\n* preload === 'auto' → suppressed (was already full-range mode;\n* let segmentStart take over post-play)\n* KNOWN LIMITATION: seek-before-play with\n* preload='auto' is not supported — if the\n* user seeks before pressing play, the\n* first re-send is delayed until the next\n* segment boundary crossing post-play.\n*\n* playbackInitiated\n* resolvedTrackId changes → trigger\n* segmentStart(currentTime) changes → trigger (segment boundary only)\n*\n* @example\n* const cleanup = loadSegments({ state, owners }, { type: 'video' });\n*/\nfunction loadSegments({ state, owners }, config) {\n\tconst { type } = config;\n\tconst actorKey = ActorKeyByType$1[type];\n\tconst initialBandwidth = state.current.bandwidthState;\n\tconst throughput = createState(initialBandwidth ?? {\n\t\tfastEstimate: 0,\n\t\tfastTotalWeight: 0,\n\t\tslowEstimate: 0,\n\t\tslowTotalWeight: 0,\n\t\tbytesSampled: 0\n\t});\n\tconst fetchBytes = type === \"video\" ? createTrackedFetch(throughput, initialBandwidth !== void 0 ? (next) => {\n\t\tstate.patch({ bandwidthState: next });\n\t\tstate.flush();\n\t} : void 0) : fetchResolvableBytes;\n\tconst segmentLoader = createState(void 0);\n\tconst unsubActorLifecycle = owners.subscribe((o) => o[actorKey], (actor) => {\n\t\tif (actor) segmentLoader.patch(createSegmentLoaderActor(actor, fetchBytes));\n\t\telse if (!actor && segmentLoader.current) {\n\t\t\tsegmentLoader.current.destroy();\n\t\t\tsegmentLoader.patch(void 0);\n\t\t}\n\t\treturn () => {\n\t\t\tsegmentLoader.current?.destroy();\n\t\t\tsegmentLoader.patch(void 0);\n\t\t};\n\t});\n\tconst segmentsCanLoad = createState(false);\n\tconst unsubscribeCanLoadSegments = combineLatest([state, segmentLoader]).subscribe(([currentState, currentSegmentLoader]) => {\n\t\tconst track = getSelectedTrack(currentState, type);\n\t\tconst trackResolved = !!track && isResolvedTrack(track);\n\t\tconst segmentLoaderActorExists = !!currentSegmentLoader;\n\t\tsegmentsCanLoad.patch(trackResolved && segmentLoaderActorExists);\n\t});\n\tconst unsubscribeShouldLoadSegments = combineLatest([segmentsCanLoad, state]).subscribe(([segmentsCanLoad$1, state$1]) => selectLoadingInputs([segmentsCanLoad$1, state$1], type), ({ preload, playbackInitiated, currentTime, track }) => {\n\t\tif (!(preload === \"auto\" || !!playbackInitiated))\n /** @ts-expect-error */\n\t\tsegmentLoader.current?.send({\n\t\t\ttype: \"load\",\n\t\t\ttrack\n\t\t});\n\t\telse segmentLoader.current?.send({\n\t\t\ttype: \"load\",\n\t\t\ttrack,\n\t\t\trange: {\n\t\t\t\tstart: currentTime,\n\t\t\t\tend: currentTime + DEFAULT_FORWARD_BUFFER_CONFIG.bufferDuration\n\t\t\t}\n\t\t});\n\t}, { equalityFn: loadingInputsEq });\n\treturn () => {\n\t\tunsubscribeCanLoadSegments();\n\t\tunsubscribeShouldLoadSegments();\n\t\tunsubActorLifecycle();\n\t};\n}\n\n//#endregion\n//#region src/dom/text/parse-vtt-segment.ts\n/**\n* Parse a VTT segment using browser's native parser.\n*\n* Creates a dummy video element with a track element to leverage\n* the browser's optimized VTT parsing. Returns parsed VTTCue objects.\n*/\nlet dummyVideo = null;\nfunction ensureDummyVideo() {\n\tif (!dummyVideo) {\n\t\tdummyVideo = document.createElement(\"video\");\n\t\tdummyVideo.muted = true;\n\t\tdummyVideo.preload = \"none\";\n\t\tdummyVideo.style.display = \"none\";\n\t\tdummyVideo.crossOrigin = \"anonymous\";\n\t}\n\treturn dummyVideo;\n}\nfunction parseVttSegment(url) {\n\tconst video = ensureDummyVideo();\n\tconst track = document.createElement(\"track\");\n\ttrack.kind = \"subtitles\";\n\ttrack.default = true;\n\treturn new Promise((resolve, reject) => {\n\t\tconst onLoad = () => {\n\t\t\tconst cues = [];\n\t\t\tconst textTrack = track.track;\n\t\t\tif (textTrack.cues) for (let i = 0; i < textTrack.cues.length; i++) {\n\t\t\t\tconst cue = textTrack.cues[i];\n\t\t\t\tif (cue) cues.push(cue);\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tresolve(cues);\n\t\t};\n\t\tconst onError = () => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`Failed to load VTT segment: ${url}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\ttrack.removeEventListener(\"load\", onLoad);\n\t\t\ttrack.removeEventListener(\"error\", onError);\n\t\t\tvideo.removeChild(track);\n\t\t};\n\t\ttrack.addEventListener(\"load\", onLoad);\n\t\ttrack.addEventListener(\"error\", onError);\n\t\tvideo.appendChild(track);\n\t\ttrack.src = url;\n\t});\n}\nfunction destroyVttParser() {\n\tdummyVideo = null;\n}\n\n//#endregion\n//#region src/dom/features/load-text-track-cues.ts\nfunction isDuplicateCue(cue, textTrack) {\n\tconst { cues } = textTrack;\n\tif (!cues) return false;\n\tfor (let i = 0; i < cues.length; i++) {\n\t\tconst existing = cues[i];\n\t\tif (existing.startTime === cue.startTime && existing.endTime === cue.endTime && existing.text === cue.text) return true;\n\t}\n\treturn false;\n}\nconst loadVttSegmentTask = async ({ segment }, context) => {\n\tconst cues = await parseVttSegment(segment.url);\n\tfor (const cue of cues) if (!isDuplicateCue(cue, context.textTrack)) context.textTrack.addCue(cue);\n};\n/**\n* Load text track cues task (composite - orchestrates VTT segment subtasks).\n*/\nconst loadTextTrackCuesTask = async ({ currentState }, context) => {\n\tconst track = findSelectedTextTrack(currentState);\n\tif (!track || !isResolvedTrack(track)) return;\n\tconst { segments } = track;\n\tif (segments.length === 0) return;\n\tconst trackId = track.id;\n\tconst loadedIds = new Set((currentState.textBufferState?.[trackId]?.segments ?? []).map((s) => s.id));\n\tconst segmentsToLoad = getSegmentsToLoad(segments, segments.filter((s) => loadedIds.has(s.id)), currentState.currentTime ?? 0).filter((s) => !loadedIds.has(s.id));\n\tif (segmentsToLoad.length === 0) return;\n\tfor (const segment of segmentsToLoad) {\n\t\tif (context.signal.aborted) break;\n\t\ttry {\n\t\t\tawait loadVttSegmentTask({ segment }, { textTrack: context.textTrack });\n\t\t\tconst latest = context.state.current.textBufferState ?? {};\n\t\t\tconst trackState = latest[trackId] ?? { segments: [] };\n\t\t\tcontext.state.patch({ textBufferState: {\n\t\t\t\t...latest,\n\t\t\t\t[trackId]: { segments: [...trackState.segments, { id: segment.id }] }\n\t\t\t} });\n\t\t} catch (error) {\n\t\t\tif (error instanceof Error && error.name === \"AbortError\") break;\n\t\t\tconsole.error(\"Failed to load VTT segment:\", error);\n\t\t}\n\t}\n\tif (context.textTrack.mode === \"showing\" && context.textTrack.cues) Array.from(context.textTrack.cues).forEach((cue) => {\n\t\tcontext.textTrack.addCue(cue);\n\t});\n\tawait new Promise((resolve) => requestAnimationFrame(resolve));\n};\n/**\n* Find the selected text track in the presentation.\n*/\nfunction findSelectedTextTrack(state) {\n\tif (!state.presentation || !state.selectedTextTrackId) return;\n\tconst textSet = state.presentation.selectionSets.find((set) => set.type === \"text\");\n\tif (!textSet?.switchingSets?.[0]?.tracks) return;\n\treturn textSet.switchingSets[0].tracks.find((t) => t.id === state.selectedTextTrackId);\n}\n/**\n* Get the browser's TextTrack object for the selected text track.\n*\n* Retrieves the live TextTrack interface from the track element in owners,\n* which is used for adding cues, checking mode, and managing track state.\n*\n* Note: Returns the DOM TextTrack interface (HTMLTrackElement.track),\n* not the presentation Track metadata type.\n*\n* @param state - Current playback state (track selection)\n* @param owners - DOM owners containing track elements map\n* @returns DOM TextTrack interface or undefined if not found\n*/\nfunction getSelectedTextTrackFromOwners(state, owners) {\n\tconst trackId = state.selectedTextTrackId;\n\tif (!trackId || !owners.textTracks) return;\n\treturn owners.textTracks.get(trackId)?.track;\n}\n/**\n* Check if we can load text track cues.\n*\n* Requires:\n* - Selected text track ID exists\n* - Track elements map exists\n* - Track element exists for selected track\n*/\nfunction canLoadTextTrackCues(state, owners) {\n\treturn !!state.selectedTextTrackId && !!owners.textTracks && owners.textTracks.has(state.selectedTextTrackId);\n}\n/**\n* Check if we should load text track cues.\n*\n* Only load if:\n* - Track is resolved (has segments)\n* - Track has at least one segment\n* - Track element exists\n*/\nfunction shouldLoadTextTrackCues(state, owners) {\n\tif (!canLoadTextTrackCues(state, owners)) return false;\n\tconst track = findSelectedTextTrack(state);\n\tif (!track || !isResolvedTrack(track) || track.segments.length === 0) return false;\n\tif (!getSelectedTextTrackFromOwners(state, owners)) return false;\n\treturn true;\n}\n/**\n* Load text track cues orchestration.\n*\n* Triggers when:\n* - Text track is selected\n* - Track is resolved (has segments)\n* - Track element exists\n*\n* Fetches and parses VTT segments within the forward buffer window, then adds\n* cues to the track incrementally. Continues on segment errors to provide\n* partial subtitles.\n*\n* @example\n* const cleanup = loadTextTrackCues({ state, owners });\n*/\nfunction loadTextTrackCues({ state, owners }) {\n\tlet currentTask = null;\n\tlet abortController = null;\n\tlet lastTrackId;\n\tconst cleanup = combineLatest([state, owners]).subscribe(async ([currentState, currentOwners]) => {\n\t\tif (currentState.selectedTextTrackId !== lastTrackId) {\n\t\t\tlastTrackId = currentState.selectedTextTrackId;\n\t\t\tabortController?.abort();\n\t\t\tcurrentTask = null;\n\t\t}\n\t\tif (currentTask) return;\n\t\tif (!shouldLoadTextTrackCues(currentState, currentOwners)) return;\n\t\tconst textTrack = getSelectedTextTrackFromOwners(currentState, currentOwners);\n\t\tif (!textTrack) return;\n\t\tabortController = new AbortController();\n\t\tcurrentTask = loadTextTrackCuesTask({ currentState }, {\n\t\t\tsignal: abortController.signal,\n\t\t\ttextTrack,\n\t\t\tstate\n\t\t}).finally(() => {\n\t\t\tcurrentTask = null;\n\t\t});\n\t});\n\treturn () => {\n\t\tabortController?.abort();\n\t\tcleanup();\n\t};\n}\n\n//#endregion\n//#region src/dom/features/track-current-time.ts\n/**\n* Track current playback position from the media element.\n*\n* Mirrors `mediaElement.currentTime` into reactive state on:\n* - `timeupdate` — fires during playback (~4 Hz)\n* - `seeking` — fires when a seek begins; per spec, `currentTime` is\n* already at the new position when this event dispatches, so buffer\n* management can react immediately rather than waiting for `timeupdate`,\n* which does not fire while paused.\n*\n* Also syncs immediately when a media element becomes available.\n*\n* @example\n* const cleanup = trackCurrentTime({ state, owners });\n*/\nfunction trackCurrentTime({ state, owners }) {\n\tlet lastMediaElement;\n\tlet removeListeners = null;\n\tconst unsubscribe = owners.subscribe((currentOwners) => {\n\t\tconst { mediaElement } = currentOwners;\n\t\tif (mediaElement === lastMediaElement) return;\n\t\tremoveListeners?.();\n\t\tremoveListeners = null;\n\t\tlastMediaElement = mediaElement;\n\t\tif (!mediaElement) return;\n\t\tstate.patch({ currentTime: mediaElement.currentTime });\n\t\tconst sync = () => state.patch({ currentTime: mediaElement.currentTime });\n\t\tconst removeTimeupdate = listen(mediaElement, \"timeupdate\", sync);\n\t\tconst removeSeeking = listen(mediaElement, \"seeking\", sync);\n\t\tremoveListeners = () => {\n\t\t\tremoveTimeupdate();\n\t\t\tremoveSeeking();\n\t\t};\n\t});\n\treturn () => {\n\t\tremoveListeners?.();\n\t\tunsubscribe();\n\t};\n}\n\n//#endregion\n//#region src/dom/features/track-playback-initiated.ts\n/**\n* Track whether playback has been initiated by the user.\n*\n* Sets `state.playbackInitiated = true` when the media element fires a `play`\n* event (via `element.play()`, native controls, or autoplay) and simultaneously\n* dispatches `{ type: 'play' }` to the event stream so `resolvePresentation`\n* can react.\n*\n* Resets `state.playbackInitiated = false` when `presentation.url` changes,\n* so a new source with `preload=\"none\"` won't load segments until play is\n* triggered again.\n*\n* This flag is used by `shouldLoadSegments` to allow segment loading after\n* play is initiated regardless of the initial `preload` setting — `preload`\n* is a startup hint, not a runtime gate.\n*\n* @example\n* const cleanup = trackPlaybackInitiated({ state, owners, events });\n*/\nfunction trackPlaybackInitiated({ state, owners, events }) {\n\tlet lastMediaElement;\n\tlet removeListener = null;\n\tlet lastPresentationUrl;\n\tconst unsubscribeState = state.subscribe((currentState) => {\n\t\tconst url = currentState.presentation?.url;\n\t\tif (url !== lastPresentationUrl) {\n\t\t\tif (lastPresentationUrl !== void 0) state.patch({ playbackInitiated: false });\n\t\t\tlastPresentationUrl = url;\n\t\t}\n\t});\n\tconst unsubscribeOwners = owners.subscribe((currentOwners) => {\n\t\tconst { mediaElement } = currentOwners;\n\t\tif (mediaElement === lastMediaElement) return;\n\t\tremoveListener?.();\n\t\tremoveListener = null;\n\t\tlastMediaElement = mediaElement;\n\t\tif (!mediaElement) return;\n\t\tremoveListener = listen(mediaElement, \"play\", () => {\n\t\t\tstate.patch({ playbackInitiated: true });\n\t\t\tevents.dispatch({ type: \"play\" });\n\t\t});\n\t});\n\treturn () => {\n\t\tremoveListener?.();\n\t\tunsubscribeState();\n\t\tunsubscribeOwners();\n\t};\n}\n\n//#endregion\n//#region src/dom/media/append-segment.ts\n/**\n* Segment appender helper (P11)\n*\n* Appends media segments (ArrayBuffer) to SourceBuffer.\n*/\n/**\n* Append a media segment to a SourceBuffer.\n*\n* Waits for the SourceBuffer to be ready (not updating), then appends\n* the segment data. Returns a promise that resolves when append completes.\n*\n* @param sourceBuffer - The SourceBuffer to append to\n* @param segmentData - The segment data as ArrayBuffer\n* @returns Promise that resolves when append completes\n*\n* @example\n* const data = await fetch(segmentUrl).then(r => r.arrayBuffer());\n* await appendSegment(videoSourceBuffer, data);\n*/\nasync function appendSegment(sourceBuffer, segmentData) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer append error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.appendBuffer(segmentData);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n\n//#endregion\n//#region src/dom/media/buffer-flusher.ts\n/**\n* Buffer flusher helper (P12)\n*\n* Removes a time range from a SourceBuffer to manage memory.\n*/\n/**\n* Remove a time range from a SourceBuffer.\n*\n* Waits for the SourceBuffer to be ready (not updating), then removes\n* the specified range. Returns a promise that resolves when removal completes.\n*\n* @param sourceBuffer - The SourceBuffer to remove data from\n* @param start - Start of the time range to remove (seconds)\n* @param end - End of the time range to remove (seconds)\n* @returns Promise that resolves when removal completes\n*\n* @example\n* await flushBuffer(videoSourceBuffer, 0, 30);\n*/\nasync function flushBuffer(sourceBuffer, start, end) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer remove error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.remove(start, end);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n\n//#endregion\n//#region src/core/features/calculate-presentation-duration.ts\n/**\n* Check if we can calculate presentation duration (have required data).\n*/\nfunction canCalculateDuration(state) {\n\tif (!state.presentation) return false;\n\treturn !!(state.selectedVideoTrackId || state.selectedAudioTrackId);\n}\n/**\n* Check if we should calculate presentation duration (conditions met).\n*/\nfunction shouldCalculateDuration(state) {\n\tif (!canCalculateDuration(state)) return false;\n\tconst { presentation } = state;\n\tif (presentation.duration !== void 0) return false;\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\treturn !!(videoTrack && isResolvedTrack(videoTrack) || audioTrack && isResolvedTrack(audioTrack));\n}\n/**\n* Get duration from the first resolved track (prefer video, fallback to audio).\n*/\nfunction getDurationFromResolvedTracks(state) {\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tif (videoTrack && isResolvedTrack(videoTrack)) return videoTrack.duration;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\tif (audioTrack && isResolvedTrack(audioTrack)) return audioTrack.duration;\n}\n/**\n* Calculate and set presentation duration from resolved tracks.\n*/\nfunction calculatePresentationDuration({ state }) {\n\treturn combineLatest([state]).subscribe(([currentState]) => {\n\t\tif (!shouldCalculateDuration(currentState)) return;\n\t\tconst duration = getDurationFromResolvedTracks(currentState);\n\t\tif (duration === void 0 || !Number.isFinite(duration)) return;\n\t\tconst { presentation } = currentState;\n\t\tstate.patch({ presentation: {\n\t\t\t...presentation,\n\t\t\tduration\n\t\t} });\n\t});\n}\n\n//#endregion\n//#region src/core/task.ts\n/**\n* Generic reusable task that wraps an async run function.\n*\n* Owns its own AbortController so it can always be aborted independently.\n* Optionally composes an external AbortSignal so that a parent's cancellation\n* propagates into the task's work without requiring the caller to track the\n* task separately.\n*\n* Ordering guarantee: `value` is written before `status` transitions to `'done'`;\n* `error` is written before `status` transitions to `'error'`. Any reader\n* observing `status === 'done'` is guaranteed `value` is already present.\n*/\nvar Task = class {\n\tid;\n\t#runFn;\n\t#abortController = new AbortController();\n\t#signal;\n\t#status = \"pending\";\n\t#value = void 0;\n\t#error = void 0;\n\tconstructor(runFn, config) {\n\t\tthis.#runFn = runFn;\n\t\tconst rawId = config?.id;\n\t\tthis.id = typeof rawId === \"function\" ? rawId() : rawId ?? generateId();\n\t\tthis.#signal = config?.signal ? AbortSignal.any([this.#abortController.signal, config.signal]) : this.#abortController.signal;\n\t}\n\tget status() {\n\t\treturn this.#status;\n\t}\n\tget value() {\n\t\treturn this.#value;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tasync run() {\n\t\tthis.#status = \"running\";\n\t\ttry {\n\t\t\tconst result = await this.#runFn(this.#signal);\n\t\t\tthis.#value = result;\n\t\t\tthis.#status = \"done\";\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tthis.#error = e;\n\t\t\tthis.#status = \"error\";\n\t\t\tthrow e;\n\t\t}\n\t}\n\tabort() {\n\t\tthis.#abortController.abort();\n\t}\n};\n/**\n* Runs tasks concurrently, deduplicated by task id.\n*\n* If a task with a given id is already in flight, subsequent schedule() calls\n* for that id are silently ignored until the first completes. Tasks are stored\n* so abortAll() can cancel any in-flight work (e.g. on engine cleanup).\n*/\nvar ConcurrentRunner = class {\n\t#pending = /* @__PURE__ */ new Map();\n\tschedule(task) {\n\t\tif (this.#pending.has(task.id)) return;\n\t\tthis.#pending.set(task.id, task);\n\t\ttask.run().catch((error) => {\n\t\t\tif (!(error instanceof Error && error.name === \"AbortError\")) throw error;\n\t\t}).finally(() => {\n\t\t\tthis.#pending.delete(task.id);\n\t\t});\n\t}\n\tabortAll() {\n\t\tfor (const task of this.#pending.values()) task.abort();\n\t\tthis.#pending.clear();\n\t}\n};\n/**\n* Runs tasks one at a time in submission order.\n*\n* Each schedule() call returns a Promise that resolves or rejects with the\n* task's result when it is eventually executed. Tasks wait in queue until the\n* prior task completes.\n*\n* Serialization is achieved by chaining each task's run() onto the tail of a\n* shared promise chain — no explicit queue or drain loop needed.\n*\n* abortAll() aborts all pending (not yet started) tasks and the currently\n* in-flight task. Pending tasks still run briefly but receive an aborted\n* signal and are expected to exit early.\n*/\nvar SerialRunner = class {\n\t#chain = Promise.resolve();\n\t#pending = /* @__PURE__ */ new Set();\n\t#current = null;\n\tschedule(task) {\n\t\tconst t = task;\n\t\tthis.#pending.add(t);\n\t\tconst result = this.#chain.then(() => {\n\t\t\tthis.#pending.delete(t);\n\t\t\tthis.#current = t;\n\t\t\treturn task.run();\n\t\t}).finally(() => {\n\t\t\tthis.#current = null;\n\t\t});\n\t\tthis.#chain = result.then(() => {}, () => {});\n\t\treturn result;\n\t}\n\tabortAll() {\n\t\tfor (const task of this.#pending) task.abort();\n\t\tthis.#pending.clear();\n\t\tthis.#current?.abort();\n\t}\n\tdestroy() {\n\t\tthis.abortAll();\n\t}\n};\n\n//#endregion\n//#region src/core/features/resolve-track.ts\nfunction canResolve(state, config) {\n\tconst track = getSelectedTrack(state, config.type);\n\tif (!track) return false;\n\treturn !isResolvedTrack(track);\n}\n/**\n* Determines if track resolution conditions are met.\n*\n* Currently always returns true - conditions are checked by canResolveTrack()\n* and resolving flag. Kept as placeholder for future conditional logic.\n*\n* @param state - Current track resolution state\n* @param event - Current action/event\n* @returns true (conditions checked elsewhere)\n*/\nfunction shouldResolve(_state, _event) {\n\treturn true;\n}\n/**\n* Updates a track within a presentation (immutably).\n* Generic - works for video, audio, or text tracks.\n*/\nfunction updateTrackInPresentation(presentation, resolvedTrack) {\n\tconst trackId = resolvedTrack.id;\n\treturn {\n\t\t...presentation,\n\t\tselectionSets: presentation.selectionSets.map((selectionSet) => ({\n\t\t\t...selectionSet,\n\t\t\tswitchingSets: selectionSet.switchingSets.map((switchingSet) => ({\n\t\t\t\t...switchingSet,\n\t\t\t\ttracks: switchingSet.tracks.map((track) => track.id === trackId ? resolvedTrack : track)\n\t\t\t}))\n\t\t}))\n\t};\n}\n/**\n* Resolves unresolved tracks using reactive composition.\n*\n* The subscribe closure is pure scheduling logic: it checks conditions and\n* creates a Task for the selected track when appropriate. The ConcurrentRunner\n* handles all concurrency concerns — deduplication, parallel execution, and\n* cleanup.\n*\n* Generic version that works for video, audio, or text tracks based on config.\n* Type parameter T is inferred from config.type (use 'as const' for inference).\n*/\nfunction resolveTrack({ state, events }, config) {\n\tconst runner = new ConcurrentRunner();\n\tconst cleanup = combineLatest([state, events]).subscribe(([currentState, event]) => {\n\t\tif (!canResolve(currentState, config) || !shouldResolve(currentState, event)) return;\n\t\tconst track = getSelectedTrack(currentState, config.type);\n\t\tif (!track) return;\n\t\tconst resolvedTrack = track;\n\t\trunner.schedule(new Task(async (signal) => {\n\t\t\tconst mediaTrack = parseMediaPlaylist(await getResponseText(await fetchResolvable(resolvedTrack, { signal })), resolvedTrack);\n\t\t\tconst latestPresentation = state.current.presentation;\n\t\t\tconst updatedPresentation = updateTrackInPresentation(latestPresentation, mediaTrack);\n\t\t\tstate.patch({ presentation: updatedPresentation });\n\t\t}, { id: track.id }));\n\t});\n\treturn () => {\n\t\trunner.abortAll();\n\t\tcleanup();\n\t};\n}\n\n//#endregion\n//#region src/core/features/select-tracks.ts\n/**\n* Pick text track to activate.\n*\n* Selection priority (if enabled):\n* 1. User preference (preferredSubtitleLanguage)\n* 2. DEFAULT track (if enableDefaultTrack is true and track has DEFAULT=YES + AUTOSELECT=YES)\n* 3. No auto-selection (user opt-in)\n*\n* By default, FORCED tracks are excluded per Apple's HLS spec.\n*\n* @param presentation - Presentation with text tracks\n* @param config - Selection configuration\n* @returns Track ID or undefined (no auto-selection)\n*/\nfunction pickTextTrack(presentation, config) {\n\tconst textSet = presentation.selectionSets.find((set) => set.type === \"text\");\n\tif (!textSet?.switchingSets?.[0]?.tracks.length) return void 0;\n\tconst tracks = textSet.switchingSets[0].tracks;\n\tconst availableTracks = config.includeForcedTracks ? tracks : tracks.filter((track) => !track.forced);\n\tif (availableTracks.length === 0) return void 0;\n\tconst { preferredSubtitleLanguage, enableDefaultTrack = false } = config;\n\tif (preferredSubtitleLanguage) {\n\t\tconst languageMatch = availableTracks.find((track) => track.language === preferredSubtitleLanguage);\n\t\tif (languageMatch) return languageMatch.id;\n\t}\n\tif (enableDefaultTrack) {\n\t\tconst defaultTrack = availableTracks.find((track) => track.default === true);\n\t\tif (defaultTrack) return defaultTrack.id;\n\t}\n}\n/**\n* Check if we can select a track of the given type.\n*\n* Returns true when:\n* - Presentation exists\n* - Has tracks of the specified type\n*\n* Generic over track type - works for video, audio, or text.\n*/\nfunction canSelectTrack(state, config) {\n\treturn !!state?.presentation?.selectionSets?.find(({ type }) => type === config.type)?.switchingSets?.[0]?.tracks.length;\n}\n/**\n* Check if we should select a track of the given type.\n*\n* Returns true when:\n* - Track of this type is not already selected\n*\n* Generic over track type - works for video, audio, or text.\n*\n* @TODO figure out reactive model for ABR cases - right now we're only selecting\n* if we have nothing selected (CJP)\n*/\nfunction shouldSelectTrack(state, config) {\n\treturn !state[SelectedTrackIdKeyByType[config.type]];\n}\n/**\n* Select video track orchestration.\n*\n* Selects video track when:\n* - Presentation exists\n* - No video track is selected yet\n*\n* Uses bandwidth-based quality selection algorithm.\n*\n* @example\n* const cleanup = selectVideoTrack(\n* { state, owners, events },\n* { initialBandwidth: 2_000_000 }\n* );\n*/\nfunction selectVideoTrack({ state }, config = { type: \"video\" }) {\n\tlet selecting = false;\n\treturn state.subscribe(async (currentState) => {\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config) || selecting) return;\n\t\ttry {\n\t\t\tselecting = true;\n\t\t\tconst selectedTrackId = currentState.presentation?.selectionSets.find(({ type }) => type === config.type)?.switchingSets[0]?.tracks[0]?.id;\n\t\t\tif (selectedTrackId) {\n\t\t\t\tconst selectedTrackKey = SelectedTrackIdKeyByType[config.type];\n\t\t\t\tstate.patch({ [selectedTrackKey]: selectedTrackId });\n\t\t\t}\n\t\t} finally {\n\t\t\tselecting = false;\n\t\t}\n\t});\n}\n/**\n* Select audio track orchestration.\n*\n* Selects audio track when:\n* - Presentation exists\n* - No audio track is selected yet\n*\n* Uses language and preference-based selection.\n*\n* @example\n* const cleanup = selectAudioTrack(\n* { state, owners, events },\n* { preferredAudioLanguage: 'en' }\n* );\n*/\nfunction selectAudioTrack({ state }, config = { type: \"audio\" }) {\n\tlet selecting = false;\n\treturn state.subscribe(async (currentState) => {\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config) || selecting) return;\n\t\ttry {\n\t\t\tselecting = true;\n\t\t\tconst selectedTrackId = currentState.presentation?.selectionSets.find(({ type }) => type === \"audio\")?.switchingSets[0]?.tracks[0]?.id;\n\t\t\tif (selectedTrackId) state.patch({ selectedAudioTrackId: selectedTrackId });\n\t\t} finally {\n\t\t\tselecting = false;\n\t\t}\n\t});\n}\n/**\n* Select text track orchestration.\n*\n* Selects text track when:\n* - Presentation exists\n* - No text track is selected yet\n*\n* Note: Currently does not auto-select (user opt-in).\n*\n* @example\n* const cleanup = selectTextTrack({ state, owners, events }, {});\n*/\nfunction selectTextTrack({ state }, config = { type: \"text\" }) {\n\tlet selecting = false;\n\treturn state.subscribe(async (currentState) => {\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config) || selecting) return;\n\t\ttry {\n\t\t\tselecting = true;\n\t\t\tconst selectedTextTrackId = pickTextTrack(currentState.presentation, config);\n\t\t\tif (selectedTextTrackId) state.patch({ selectedTextTrackId });\n\t\t} finally {\n\t\t\tselecting = false;\n\t\t}\n\t});\n}\n\n//#endregion\n//#region src/dom/features/end-of-stream.ts\n/**\n* Check if the last segment of a track has been appended to a SourceBuffer.\n*\n* Checks by segment ID rather than a pipeline flag, so it is robust across\n* quality switches (different tracks have different segment IDs) and\n* back-buffer flushes (flushed segment IDs are removed from the model).\n*/\nfunction isLastSegmentAppended(segments, actor) {\n\tif (segments.length === 0) return true;\n\tconst lastSeg = segments[segments.length - 1];\n\tif (!lastSeg) return false;\n\treturn actor?.snapshot.context.segments.some((s) => s.id === lastSeg.id) ?? false;\n}\n/**\n* Check if the last segment has been appended for each selected track.\n*\n* Handles video-only, audio-only, and video+audio scenarios.\n* A track with no segments (e.g. unresolved) is considered not ready.\n*/\nfunction hasLastSegmentLoaded(state, owners) {\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\tif (videoTrack && !isResolvedTrack(videoTrack)) return false;\n\tif (audioTrack && !isResolvedTrack(audioTrack)) return false;\n\tif (videoTrack && isResolvedTrack(videoTrack)) {\n\t\tif (!isLastSegmentAppended(videoTrack.segments, owners.videoBufferActor)) return false;\n\t}\n\tif (audioTrack && isResolvedTrack(audioTrack)) {\n\t\tif (!isLastSegmentAppended(audioTrack.segments, owners.audioBufferActor)) return false;\n\t}\n\treturn true;\n}\n/**\n* Check if we can call endOfStream.\n*/\nfunction canEndStream(state, owners) {\n\treturn !!(owners.mediaSource && state.presentation);\n}\n/**\n* Check if we should call endOfStream.\n*/\nfunction shouldEndStream(state, owners) {\n\tif (!canEndStream(state, owners)) return false;\n\tconst { mediaSource, mediaElement } = owners;\n\tif (mediaSource.readyState !== \"open\") return false;\n\tif (mediaElement && mediaElement.readyState < HTMLMediaElement.HAVE_METADATA) return false;\n\tconst hasVideoTrack = !!state.selectedVideoTrackId;\n\tconst hasAudioTrack = !!state.selectedAudioTrackId;\n\tif (hasVideoTrack && !owners.videoBuffer) return false;\n\tif (hasAudioTrack && !owners.audioBuffer) return false;\n\tif (owners.videoBufferActor?.snapshot.status === \"updating\") return false;\n\tif (owners.audioBufferActor?.snapshot.status === \"updating\") return false;\n\tif (!hasLastSegmentLoaded(state, owners)) return false;\n\tif (mediaElement) {\n\t\tconst videoTrack = hasVideoTrack ? getSelectedTrack(state, \"video\") : void 0;\n\t\tconst audioTrack = hasAudioTrack ? getSelectedTrack(state, \"audio\") : void 0;\n\t\tconst refTrack = videoTrack && isResolvedTrack(videoTrack) ? videoTrack : audioTrack && isResolvedTrack(audioTrack) ? audioTrack : void 0;\n\t\tif (refTrack && refTrack.segments.length > 0) {\n\t\t\tconst lastSeg = refTrack.segments[refTrack.segments.length - 1];\n\t\t\tif (mediaElement.currentTime < lastSeg.startTime) return false;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n* Wait for all currently-updating SourceBufferActors to finish.\n* Uses actor status rather than raw SourceBuffer.updating so the wait is\n* aligned with the same abstraction that owns all buffer operations.\n*/\nfunction waitForSourceBuffersReady$1(owners) {\n\tconst updatingActors = [owners.videoBufferActor, owners.audioBufferActor].filter((actor) => actor !== void 0 && actor.snapshot.status === \"updating\");\n\tif (updatingActors.length === 0) return Promise.resolve();\n\treturn Promise.all(updatingActors.map((actor) => new Promise((resolve) => {\n\t\tconst unsub = actor.subscribe((snapshot) => {\n\t\t\tif (snapshot.status !== \"updating\") {\n\t\t\t\tunsub();\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}))).then(() => void 0);\n}\n/**\n* Get the highest buffered end time across all active SourceBuffers.\n* Used to set the final duration from actual container timestamps rather\n* than playlist metadata, which handles both shorter and longer cases.\n*/\nfunction getMaxBufferedEnd$1(owners) {\n\tlet max = 0;\n\tfor (const buf of [owners.videoBuffer, owners.audioBuffer]) if (buf && buf.buffered.length > 0) {\n\t\tconst end = buf.buffered.end(buf.buffered.length - 1);\n\t\tif (end > max) max = end;\n\t}\n\treturn max;\n}\n/**\n* End of stream task (module-level, pure).\n* Sets the final duration from actual buffered end time, then calls endOfStream().\n*/\nconst endOfStreamTask = async ({ currentOwners }, _context) => {\n\tconst { mediaSource } = currentOwners;\n\tif (mediaSource.readyState === \"ended\") return;\n\tawait waitForSourceBuffersReady$1(currentOwners);\n\tif (mediaSource.readyState !== \"open\") return;\n\tconst bufferedEnd = getMaxBufferedEnd$1(currentOwners);\n\tif (bufferedEnd > 0) mediaSource.duration = bufferedEnd;\n\tmediaSource.endOfStream();\n\tawait new Promise((resolve) => requestAnimationFrame(resolve));\n};\n/**\n* Call endOfStream when the last segment has been appended.\n* This signals to the browser that the stream is complete.\n*\n* Per the MSE spec, appendBuffer() remains valid after endOfStream() —\n* seeks that require re-appending earlier segments will still work.\n* What becomes blocked is calling endOfStream() again, addSourceBuffer(),\n* and MediaSource.duration updates.\n*/\nfunction endOfStream({ state, owners }) {\n\tlet hasEnded = false;\n\tlet destroyed = false;\n\tconst activeActorUnsubs = [];\n\tconst runEvaluate = async () => {\n\t\tif (destroyed) return;\n\t\tconst currentState = state.current;\n\t\tconst currentOwners = owners.current;\n\t\tif (hasEnded) {\n\t\t\tif (currentOwners.mediaSource?.readyState !== \"open\") return;\n\t\t\thasEnded = false;\n\t\t}\n\t\tif (!shouldEndStream(currentState, currentOwners)) return;\n\t\thasEnded = true;\n\t\ttry {\n\t\t\tawait endOfStreamTask({ currentOwners }, {});\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to call endOfStream:\", error);\n\t\t}\n\t};\n\tconst cleanupOwners = owners.subscribe((currentOwners) => {\n\t\tactiveActorUnsubs.forEach((u) => u());\n\t\tactiveActorUnsubs.length = 0;\n\t\tfor (const actor of [currentOwners.videoBufferActor, currentOwners.audioBufferActor]) {\n\t\t\tif (!actor) continue;\n\t\t\tlet isFirst = true;\n\t\t\tactiveActorUnsubs.push(actor.subscribe(() => {\n\t\t\t\tif (isFirst) {\n\t\t\t\t\tisFirst = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trunEvaluate();\n\t\t\t}));\n\t\t}\n\t});\n\tconst cleanupCombineLatest = combineLatest([state, owners]).subscribe(async () => runEvaluate());\n\treturn () => {\n\t\tdestroyed = true;\n\t\tactiveActorUnsubs.forEach((u) => u());\n\t\tcleanupOwners();\n\t\tcleanupCombineLatest();\n\t};\n}\n\n//#endregion\n//#region src/dom/features/setup-mediasource.ts\n/**\n* Check if we have the minimum requirements to create MediaSource.\n*/\nfunction canSetup(state, owners) {\n\treturn !isNil(owners.mediaElement) && !isNil(state.presentation?.url);\n}\n/**\n* Check if we should proceed with MediaSource creation.\n* Placeholder for future conditions (e.g., checking if already created).\n*/\nfunction shouldSetup(_state, owners) {\n\treturn isNil(owners.mediaSource);\n}\n/**\n* Setup MediaSource orchestration.\n*\n* Creates and attaches MediaSource when:\n* - mediaElement exists in owners\n* - presentation.url exists in state\n*\n* Updates owners.mediaSource after successful setup.\n*/\nfunction setupMediaSource({ state, owners }) {\n\tlet settingUp = false;\n\tlet abortController = null;\n\tconst unsubscribe = combineLatest([state, owners]).subscribe(async ([currentState, currentOwners]) => {\n\t\tif (!canSetup(currentState, currentOwners) || !shouldSetup(currentState, currentOwners) || settingUp) return;\n\t\ttry {\n\t\t\tsettingUp = true;\n\t\t\tabortController = new AbortController();\n\t\t\tconst mediaSource = createMediaSource({ preferManaged: true });\n\t\t\tattachMediaSource(mediaSource, currentOwners.mediaElement);\n\t\t\tawait waitForSourceOpen(mediaSource, abortController.signal);\n\t\t\towners.patch({ mediaSource });\n\t\t} catch (error) {\n\t\t\tif (error instanceof DOMException && error.name === \"AbortError\") return;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tsettingUp = false;\n\t\t}\n\t});\n\treturn () => {\n\t\tabortController?.abort();\n\t\tunsubscribe();\n\t};\n}\n\n//#endregion\n//#region src/dom/media/source-buffer-actor.ts\n/**\n* Thrown when a message is sent to the actor in a state that does not\n* accept messages (currently: 'updating').\n*/\nvar SourceBufferActorError = class extends Error {\n\tconstructor(message) {\n\t\tsuper(message);\n\t\tthis.name = \"SourceBufferActorError\";\n\t}\n};\nfunction snapshotBuffered(buffered) {\n\tconst ranges = [];\n\tfor (let i = 0; i < buffered.length; i++) ranges.push({\n\t\tstart: buffered.start(i),\n\t\tend: buffered.end(i)\n\t});\n\treturn ranges;\n}\nfunction appendInitTask(message, { signal, getCtx, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getCtx();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait appendSegment(sourceBuffer, message.data);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tinitTrackId: message.meta.trackId\n\t\t};\n\t}, { signal });\n}\nfunction appendSegmentTask(message, { signal, getCtx, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getCtx();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait appendSegment(sourceBuffer, message.data);\n\t\tconst { meta } = message;\n\t\tconst EPSILON = 1e-4;\n\t\tconst filtered = ctx.segments.filter((s) => Math.abs(s.startTime - meta.startTime) >= EPSILON);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: [...filtered, {\n\t\t\t\tid: meta.id,\n\t\t\t\tstartTime: meta.startTime,\n\t\t\t\tduration: meta.duration,\n\t\t\t\ttrackId: meta.trackId,\n\t\t\t\t...meta.trackBandwidth !== void 0 && { trackBandwidth: meta.trackBandwidth }\n\t\t\t}],\n\t\t\tbufferedRanges: snapshotBuffered(sourceBuffer.buffered)\n\t\t};\n\t}, { signal });\n}\nfunction removeTask(message, { signal, getCtx, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getCtx();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait flushBuffer(sourceBuffer, message.start, message.end);\n\t\tconst bufferedRanges = snapshotBuffered(sourceBuffer.buffered);\n\t\tconst filtered = ctx.segments.filter((s) => {\n\t\t\tconst midpoint = s.startTime + s.duration / 2;\n\t\t\treturn bufferedRanges.some((r) => midpoint >= r.start && midpoint < r.end);\n\t\t});\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: filtered,\n\t\t\tbufferedRanges\n\t\t};\n\t}, { signal });\n}\nconst messageTaskFactories = {\n\t\"append-init\": appendInitTask,\n\t\"append-segment\": appendSegmentTask,\n\tremove: removeTask\n};\nfunction messageToTask(message, options) {\n\tconst factory = messageTaskFactories[message.type];\n\treturn factory(message, options);\n}\nfunction createSourceBufferActor(sourceBuffer, initialContext) {\n\tconst state = createState({\n\t\tstatus: \"idle\",\n\t\tcontext: {\n\t\t\tsegments: [],\n\t\t\tbufferedRanges: [],\n\t\t\tinitTrackId: void 0,\n\t\t\t...initialContext\n\t\t}\n\t});\n\tconst runner = new SerialRunner();\n\tfunction applyResult(newContext) {\n\t\tconst status = state.current.status === \"destroyed\" ? \"destroyed\" : \"idle\";\n\t\tstate.patch({\n\t\t\tstatus,\n\t\t\tcontext: newContext\n\t\t});\n\t\tstate.flush();\n\t}\n\tfunction handleError(e) {\n\t\tconst status = state.current.status === \"destroyed\" ? \"destroyed\" : \"idle\";\n\t\tstate.patch({ status });\n\t\tstate.flush();\n\t\tthrow e;\n\t}\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn state.current;\n\t\t},\n\t\tsubscribe(listener) {\n\t\t\treturn state.subscribe(listener);\n\t\t},\n\t\tsend(message, signal) {\n\t\t\tif (state.current.status !== \"idle\") return Promise.reject(new SourceBufferActorError(`send() called while actor is ${state.current.status}`));\n\t\t\tstate.patch({ status: \"updating\" });\n\t\t\tconst task = messageToTask(message, {\n\t\t\t\tsignal,\n\t\t\t\tgetCtx: () => state.current.context,\n\t\t\t\tsourceBuffer\n\t\t\t});\n\t\t\treturn runner.schedule(task).then(applyResult).catch(handleError);\n\t\t},\n\t\tbatch(messages, signal) {\n\t\t\tif (state.current.status !== \"idle\") return Promise.reject(new SourceBufferActorError(`batch() called while actor is ${state.current.status}`));\n\t\t\tif (messages.length === 0) return Promise.resolve();\n\t\t\tstate.patch({ status: \"updating\" });\n\t\t\tlet workingCtx = state.current.context;\n\t\t\tfor (const message of messages.slice(0, -1)) {\n\t\t\t\tconst task = messageToTask(message, {\n\t\t\t\t\tsignal,\n\t\t\t\t\tgetCtx: () => workingCtx,\n\t\t\t\t\tsourceBuffer\n\t\t\t\t});\n\t\t\t\trunner.schedule(task).then((newCtx) => {\n\t\t\t\t\tworkingCtx = newCtx;\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst lastTask = messageToTask(messages[messages.length - 1], {\n\t\t\t\tsignal,\n\t\t\t\tgetCtx: () => workingCtx,\n\t\t\t\tsourceBuffer\n\t\t\t});\n\t\t\treturn runner.schedule(lastTask).then(applyResult).catch(handleError);\n\t\t},\n\t\tdestroy() {\n\t\t\tstate.patch({ status: \"destroyed\" });\n\t\t\tstate.flush();\n\t\t\trunner.destroy();\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/dom/features/setup-sourcebuffer.ts\n/** Map track type to SourceBufferActor owner property key. */\nconst ActorKeyByType = {\n\tvideo: \"videoBufferActor\",\n\taudio: \"audioBufferActor\"\n};\n/**\n* Setup SourceBuffer task (module-level, pure).\n* Creates SourceBuffer for resolved track and waits a frame before completing.\n*/\nconst setupSourceBufferTask = async ({ currentState, currentOwners }, context) => {\n\tconst track = getSelectedTrack(currentState, context.config.type);\n\tif (!track || !isResolvedTrack(track)) return;\n\tif (!track.codecs || track.codecs.length === 0) return;\n\tconst mimeCodec = buildMimeCodec(track);\n\tconst buffer = createSourceBuffer(currentOwners.mediaSource, mimeCodec);\n\tconst actor = createSourceBufferActor(buffer);\n\tconst bufferKey = BufferKeyByType[context.config.type];\n\tconst actorKey = ActorKeyByType[context.config.type];\n\tcontext.owners.patch({\n\t\t[bufferKey]: buffer,\n\t\t[actorKey]: actor\n\t});\n\tawait new Promise((resolve) => requestAnimationFrame(resolve));\n};\n/**\n* Build MIME codec string from track metadata.\n*\n* @param track - Resolved track with mimeType and codecs\n* @returns MIME codec string (e.g., 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"')\n*\n* @example\n* buildMimeCodec({ mimeType: 'video/mp4', codecs: ['avc1.42E01E'] })\n* // => 'video/mp4; codecs=\"avc1.42E01E\"'\n*/\nfunction buildMimeCodec(track) {\n\tconst codecString = track.codecs?.join(\",\") ?? \"\";\n\treturn `${track.mimeType}; codecs=\"${codecString}\"`;\n}\n/**\n* Check if we can setup SourceBuffer for track type.\n*\n* Requires:\n* - MediaSource exists in owners\n* - Track is selected\n*\n* Note: We don't check mediaSource.readyState because owners holds references\n* to mutable objects. Changes to properties on those objects won't trigger\n* observations. Instead, setupMediaSource only patches owners.mediaSource after\n* it's already open, so if it exists in owners, it's ready to use.\n*\n* Note: Track does not need to be resolved yet. The orchestration will wait\n* for the track to be resolved (via resolveTrack) before creating the SourceBuffer.\n*/\nfunction canSetupBuffer(state, owners, type) {\n\tif (!owners.mediaSource) return false;\n\tif (!getSelectedTrack(state, type)) return false;\n\treturn true;\n}\n/**\n* Check if we should create SourceBuffer (not already created).\n*/\nfunction shouldSetupBuffer(owners, type) {\n\tconst bufferKey = BufferKeyByType[type];\n\treturn isUndefined(owners[bufferKey]);\n}\n/**\n* Setup SourceBuffer orchestration.\n*\n* Triggers when:\n* - MediaSource exists and is in 'open' state\n* - Track is selected (same condition as resolveTrack)\n*\n* Creates SourceBuffer when track becomes resolved with codecs.\n* This allows setupSourceBuffer to run in parallel with resolveTrack.\n*\n* Note: Text tracks don't use SourceBuffers and should be handled separately.\n*\n* Generic over track type - create one orchestration per track type:\n* @example\n* const videoCleanup = setupSourceBuffer({ state, owners }, { type: 'video' });\n* const audioCleanup = setupSourceBuffer({ state, owners }, { type: 'audio' });\n*/\nfunction setupSourceBuffer({ state, owners }, config) {\n\tlet currentTask = null;\n\treturn combineLatest([state, owners]).subscribe(async ([currentState, currentOwners]) => {\n\t\tif (currentTask) return;\n\t\tif (!canSetupBuffer(currentState, currentOwners, config.type) || !shouldSetupBuffer(currentOwners, config.type)) return;\n\t\tcurrentTask = setupSourceBufferTask({\n\t\t\tcurrentState,\n\t\t\tcurrentOwners\n\t\t}, {\n\t\t\towners,\n\t\t\tconfig\n\t\t});\n\t\ttry {\n\t\t\tawait currentTask;\n\t\t} finally {\n\t\t\tcurrentTask = null;\n\t\t}\n\t});\n}\n\n//#endregion\n//#region src/dom/features/setup-text-tracks.ts\n/**\n* Get all text tracks from presentation.\n*/\nfunction getTextTracks(presentation) {\n\tif (!presentation?.selectionSets) return [];\n\tconst textSet = presentation.selectionSets.find((set) => set.type === \"text\");\n\tif (!textSet?.switchingSets?.[0]?.tracks) return [];\n\treturn textSet.switchingSets[0].tracks;\n}\n/**\n* Check if we can setup text tracks.\n*\n* Requires:\n* - mediaElement exists\n* - presentation has text tracks to setup\n*/\nfunction canSetupTextTracks(state, owners) {\n\treturn !!owners.mediaElement && !!getTextTracks(state.presentation).length;\n}\n/**\n* Check if we should setup text tracks (not already set up).\n*/\nfunction shouldSetupTextTracks(owners) {\n\treturn !owners.textTracks;\n}\n/**\n* Create a track element for a text track.\n*\n* Note: We use DOM <track> elements instead of the TextTrack JS API\n* because there's no way to remove TextTracks added via addTextTrack().\n*/\nfunction createTrackElement(track) {\n\tconst trackElement = document.createElement(\"track\");\n\ttrackElement.id = track.id;\n\ttrackElement.kind = track.kind;\n\ttrackElement.label = track.label;\n\tif (track.language) trackElement.srclang = track.language;\n\tif (track.default) trackElement.default = true;\n\ttrackElement.src = track.url;\n\treturn trackElement;\n}\n/**\n* Setup text tracks orchestration.\n*\n* Triggers when:\n* - mediaElement exists\n* - presentation is resolved (has text tracks)\n*\n* Creates <track> elements for all text tracks and adds them as children\n* to the media element. This allows the browser's native text track rendering.\n*\n* Note: Uses DOM track elements instead of TextTrack API because tracks\n* added via addTextTrack() cannot be removed.\n*\n* @example\n* const cleanup = setupTextTracks({ state, owners });\n*/\nfunction setupTextTracks({ state, owners }) {\n\tlet hasSetup = false;\n\tlet createdTracks = [];\n\tconst unsubscribe = combineLatest([state, owners]).subscribe(([s, o]) => {\n\t\tif (hasSetup) return;\n\t\tif (!canSetupTextTracks(s, o) || !shouldSetupTextTracks(o)) return;\n\t\thasSetup = true;\n\t\tconst textTracks = getTextTracks(s.presentation);\n\t\tif (textTracks.length === 0) return;\n\t\tconst trackMap = /* @__PURE__ */ new Map();\n\t\tfor (const track of textTracks) {\n\t\t\tconst trackElement = createTrackElement(track);\n\t\t\to.mediaElement.appendChild(trackElement);\n\t\t\ttrackMap.set(track.id, trackElement);\n\t\t\tcreatedTracks.push(trackElement);\n\t\t}\n\t\towners.patch({ textTracks: trackMap });\n\t});\n\treturn () => {\n\t\tfor (const trackElement of createdTracks) trackElement.remove();\n\t\tcreatedTracks = [];\n\t\tunsubscribe();\n\t};\n}\n\n//#endregion\n//#region src/dom/features/sync-selected-text-track-from-dom.ts\n/**\n* Sync selectedTextTrackId from DOM text track mode changes.\n*\n* Listens to the `change` event on `media.textTracks` and updates\n* `selectedTextTrackId` when external code (e.g. the captions button via\n* `toggleSubtitles()`) changes a subtitle/caption track mode to 'showing'.\n*\n* This bridges the core store's `toggleSubtitles()` with SPF's reactive text\n* track pipeline (`syncTextTrackModes`, `loadTextTrackCues`). Without this\n* bridge, direct DOM mode changes would be immediately overridden by\n* `syncTextTrackModes` on the next SPF state update.\n*\n* When a subtitle/caption track's mode is 'showing', its DOM `id` — which\n* matches the SPF track ID set by `setupTextTracks` — is written to\n* `selectedTextTrackId`. When no subtitle/caption track is 'showing',\n* `selectedTextTrackId` is cleared along with the deselected track's\n* `textBufferState` entry — setting mode to 'disabled' clears native cues from\n* the track element, so the buffer must be reset to re-fetch cues on re-enable.\n*\n* @example\n* const cleanup = syncSelectedTextTrackFromDom({ state, owners });\n*/\nfunction syncSelectedTextTrackFromDom({ state, owners }) {\n\tlet lastMediaElement;\n\tlet removeListener = null;\n\tconst unsubscribe = owners.subscribe((currentOwners) => {\n\t\tconst { mediaElement } = currentOwners;\n\t\tif (mediaElement === lastMediaElement) return;\n\t\tremoveListener?.();\n\t\tremoveListener = null;\n\t\tlastMediaElement = mediaElement;\n\t\tif (!mediaElement) return;\n\t\tconst sync = () => {\n\t\t\tconst newId = Array.from(mediaElement.textTracks).find((t) => t.mode === \"showing\" && (t.kind === \"subtitles\" || t.kind === \"captions\"))?.id || void 0;\n\t\t\tconst current = state.current;\n\t\t\tif (current.selectedTextTrackId === newId) return;\n\t\t\tif (newId) state.patch({ selectedTextTrackId: newId });\n\t\t\telse {\n\t\t\t\tconst prevId = current.selectedTextTrackId;\n\t\t\t\tif (prevId && current.textBufferState?.[prevId]) {\n\t\t\t\t\tconst next = { ...current.textBufferState };\n\t\t\t\t\tdelete next[prevId];\n\t\t\t\t\tstate.patch({\n\t\t\t\t\t\tselectedTextTrackId: void 0,\n\t\t\t\t\t\ttextBufferState: next\n\t\t\t\t\t});\n\t\t\t\t} else state.patch({ selectedTextTrackId: void 0 });\n\t\t\t}\n\t\t};\n\t\tremoveListener = listen(mediaElement.textTracks, \"change\", sync);\n\t});\n\treturn () => {\n\t\tremoveListener?.();\n\t\tunsubscribe();\n\t};\n}\n\n//#endregion\n//#region src/dom/features/sync-text-track-modes.ts\n/**\n* Check if we can sync text track modes.\n*\n* Requires:\n* - textTracks map exists (track elements created)\n*/\nfunction canSyncTextTrackModes(owners) {\n\treturn !!owners.textTracks && owners.textTracks.size > 0;\n}\n/**\n* Sync text track modes orchestration.\n*\n* Manages track element modes based on selectedTextTrackId:\n* - Selected track: mode = \"showing\"\n* - Other tracks: mode = \"hidden\"\n* - No selection: all tracks mode = \"hidden\"\n*\n* Note: Uses \"hidden\" instead of \"disabled\" for non-selected tracks\n* so they remain available in the browser's track menu.\n*\n* @example\n* const cleanup = syncTextTrackModes({ state, owners });\n*/\nfunction syncTextTrackModes({ state, owners }) {\n\treturn combineLatest([state, owners]).subscribe(([s, o]) => {\n\t\tif (!canSyncTextTrackModes(o)) return;\n\t\tconst selectedId = s.selectedTextTrackId;\n\t\tfor (const [trackId, trackElement] of o.textTracks) if (trackId === selectedId) trackElement.track.mode = \"showing\";\n\t\telse trackElement.track.mode = \"hidden\";\n\t});\n}\n\n//#endregion\n//#region src/dom/features/update-duration.ts\n/**\n* Check if we can update MediaSource duration (have required data).\n*/\nfunction canUpdateDuration(state, owners) {\n\treturn !!(owners.mediaSource && state.presentation && hasPresentationDuration(state.presentation));\n}\n/**\n* Get the maximum buffered end time across all SourceBuffers.\n*/\nfunction getMaxBufferedEnd(owners) {\n\tlet maxEnd = 0;\n\tconst buffers = [owners.videoSourceBuffer, owners.audioSourceBuffer].filter((buf) => buf !== void 0);\n\tfor (const buffer of buffers) {\n\t\tconst { buffered } = buffer;\n\t\tif (buffered.length > 0) {\n\t\t\tconst end = buffered.end(buffered.length - 1);\n\t\t\tif (end > maxEnd) maxEnd = end;\n\t\t}\n\t}\n\treturn maxEnd;\n}\n/**\n* Check if we should update MediaSource duration (conditions met).\n*/\nfunction shouldUpdateDuration(state, owners) {\n\tif (!canUpdateDuration(state, owners)) return false;\n\tconst { mediaSource } = owners;\n\tconst { presentation } = state;\n\tif (mediaSource.readyState !== \"open\") return false;\n\tconst duration = presentation.duration;\n\tif (!Number.isFinite(duration) || Number.isNaN(duration) || duration <= 0) return false;\n\treturn Number.isNaN(mediaSource.duration);\n}\n/**\n* Wait for all currently-updating SourceBuffers to finish.\n*\n* The MSE spec forbids setting MediaSource.duration while any attached\n* SourceBuffer has updating === true. This defers until all are idle.\n*/\nfunction waitForSourceBuffersReady(owners) {\n\tconst updating = [owners.videoSourceBuffer, owners.audioSourceBuffer].filter((buf) => buf?.updating === true);\n\tif (updating.length === 0) return Promise.resolve();\n\treturn Promise.all(updating.map((buf) => new Promise((resolve) => buf.addEventListener(\"updateend\", () => resolve(), { once: true })))).then(() => void 0);\n}\n/**\n* Update MediaSource duration when presentation duration becomes available.\n*/\nfunction updateDuration({ state, owners }) {\n\tlet destroyed = false;\n\tconst unsubscribe = combineLatest([state, owners]).subscribe(async ([currentState, currentOwners]) => {\n\t\tif (!shouldUpdateDuration(currentState, currentOwners)) return;\n\t\tconst { mediaSource } = currentOwners;\n\t\tawait waitForSourceBuffersReady(currentOwners);\n\t\tif (destroyed || mediaSource.readyState !== \"open\") return;\n\t\tlet duration = currentState.presentation.duration;\n\t\tconst maxBufferedEnd = getMaxBufferedEnd(currentOwners);\n\t\tif (maxBufferedEnd > duration) duration = maxBufferedEnd;\n\t\tmediaSource.duration = duration;\n\t});\n\treturn () => {\n\t\tdestroyed = true;\n\t\tunsubscribe();\n\t};\n}\n\n//#endregion\n//#region src/dom/playback-engine/engine.ts\n/**\n* Create a POC playback engine.\n*\n* Wires together all orchestrations to create a reactive playback pipeline:\n* 1. Resolve presentation (multivariant playlist)\n* 2. Select initial video and audio tracks\n* 3. Resolve selected tracks (media playlists)\n* 4. Setup MediaSource\n* 5. Setup SourceBuffers for video and audio\n*\n* Note: This is a POC - does not yet load/append segments.\n*\n* @param config - Playback engine configuration\n* @returns Playback engine instance with state, owners, and destroy function\n*\n* @example\n* const engine = createPlaybackEngine({\n* initialBandwidth: 2_000_000,\n* preferredAudioLanguage: 'en',\n* });\n*\n* // Initialize by patching state and owners\n* engine.owners.patch({ mediaElement: document.querySelector('video') });\n* engine.state.patch({\n* presentation: { url: 'https://example.com/playlist.m3u8' },\n* preload: 'auto',\n* });\n*\n* // Inspect state\n* console.log(engine.state.current);\n*\n* // Cleanup\n* engine.destroy();\n*/\nfunction createPlaybackEngine(config = {}) {\n\tconst state = createState({ bandwidthState: {\n\t\tfastEstimate: 0,\n\t\tfastTotalWeight: 0,\n\t\tslowEstimate: 0,\n\t\tslowTotalWeight: 0,\n\t\tbytesSampled: 0\n\t} });\n\tconst owners = createState({});\n\tconst events = createEventStream();\n\tconst cleanups = [\n\t\tsyncPreloadAttribute(state, owners),\n\t\ttrackPlaybackInitiated({\n\t\t\tstate,\n\t\t\towners,\n\t\t\tevents\n\t\t}),\n\t\tresolvePresentation({\n\t\t\tstate,\n\t\t\tevents\n\t\t}),\n\t\tselectVideoTrack({\n\t\t\tstate,\n\t\t\towners,\n\t\t\tevents\n\t\t}, {\n\t\t\ttype: \"video\",\n\t\t\t...config.initialBandwidth !== void 0 && { initialBandwidth: config.initialBandwidth }\n\t\t}),\n\t\tselectAudioTrack({\n\t\t\tstate,\n\t\t\towners,\n\t\t\tevents\n\t\t}, {\n\t\t\ttype: \"audio\",\n\t\t\t...config.preferredAudioLanguage !== void 0 && { preferredAudioLanguage: config.preferredAudioLanguage }\n\t\t}),\n\t\tselectTextTrack({\n\t\t\tstate,\n\t\t\towners,\n\t\t\tevents\n\t\t}, {\n\t\t\ttype: \"text\",\n\t\t\t...config.preferredSubtitleLanguage !== void 0 && { preferredSubtitleLanguage: config.preferredSubtitleLanguage },\n\t\t\t...config.includeForcedTracks !== void 0 && { includeForcedTracks: config.includeForcedTracks },\n\t\t\t...config.enableDefaultTrack !== void 0 && { enableDefaultTrack: config.enableDefaultTrack }\n\t\t}),\n\t\tresolveTrack({\n\t\t\tstate,\n\t\t\tevents\n\t\t}, { type: \"video\" }),\n\t\tresolveTrack({\n\t\t\tstate,\n\t\t\tevents\n\t\t}, { type: \"audio\" }),\n\t\tresolveTrack({\n\t\t\tstate,\n\t\t\tevents\n\t\t}, { type: \"text\" }),\n\t\tcalculatePresentationDuration({ state }),\n\t\tsetupMediaSource({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tupdateDuration({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsetupSourceBuffer({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"video\" }),\n\t\tsetupSourceBuffer({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"audio\" }),\n\t\ttrackCurrentTime({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tswitchQuality({ state }),\n\t\tloadSegments({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"video\" }),\n\t\tloadSegments({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"audio\" }),\n\t\tendOfStream({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsetupTextTracks({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsyncTextTrackModes({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsyncSelectedTextTrackFromDom({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tloadTextTrackCues({\n\t\t\tstate,\n\t\t\towners\n\t\t})\n\t];\n\tevents.dispatch({ type: \"@@INITIALIZE@@\" });\n\treturn {\n\t\tstate,\n\t\towners,\n\t\tevents,\n\t\tdestroy: () => {\n\t\t\tcleanups.forEach((cleanup) => cleanup());\n\t\t\tdestroyVttParser();\n\t\t}\n\t};\n}\n\n//#endregion\n//#region src/dom/playback-engine/adapter.ts\n/**\n* HTMLMediaElement-compatible adapter for the SPF playback engine.\n*\n* Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n* be used anywhere a media element API is expected.\n*\n* A new engine is created on every src assignment — this fully tears down all\n* state, SourceBuffers, and in-flight requests from the previous source before\n* the next one begins. The media element reference is preserved across src\n* changes and re-applied to the new engine automatically.\n*\n* @example\n* const media = new SpfMedia({ preferredAudioLanguage: 'en' });\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*\n* // Change source — old engine is destroyed, new one starts clean:\n* media.src = 'https://stream.mux.com/xyz456.m3u8';\n*\n* // Explicit teardown:\n* media.destroy();\n*/\nvar SpfMedia = class {\n\t#engine;\n\t#config;\n\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t#loadstartListener = null;\n\tconstructor(config = {}) {\n\t\tthis.#config = config;\n\t\tthis.#engine = createPlaybackEngine(config);\n\t}\n\tget engine() {\n\t\treturn this.#engine;\n\t}\n\tattach(mediaElement) {\n\t\tthis.#engine.owners.patch({ mediaElement });\n\t}\n\tdetach() {\n\t\tthis.#cancelPendingPlay();\n\t\tthis.#engine.owners.patch({ mediaElement: void 0 });\n\t}\n\tdestroy() {\n\t\tthis.#cancelPendingPlay();\n\t\tthis.#engine.destroy();\n\t}\n\tget src() {\n\t\treturn this.#engine.state.current.presentation?.url ?? \"\";\n\t}\n\tset src(value) {\n\t\tconst prevMediaElement = this.#engine.owners.current.mediaElement;\n\t\tthis.#cancelPendingPlay();\n\t\tthis.#engine.destroy();\n\t\tthis.#engine = createPlaybackEngine(this.#config);\n\t\tif (prevMediaElement) this.#engine.owners.patch({ mediaElement: prevMediaElement });\n\t\tif (value) this.#engine.state.patch({ presentation: { url: value } });\n\t}\n\tplay() {\n\t\tconst { mediaElement } = this.#engine.owners.current;\n\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"SpfMedia: no media element attached\"));\n\t\tthis.#engine.state.patch({ playbackInitiated: true });\n\t\treturn mediaElement.play().catch((err) => {\n\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\tconst listener = () => {\n\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t};\n\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t});\n\t\t\tthrow err;\n\t\t});\n\t}\n\t#cancelPendingPlay() {\n\t\tif (!this.#loadstartListener) return;\n\t\tconst { mediaElement } = this.#engine.owners.current;\n\t\tmediaElement?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\tthis.#loadstartListener = null;\n\t}\n};\n\n//#endregion\nexport { trackPlaybackInitiated as a, destroyVttParser as c, appendSegment as i, parseVttSegment as l, createPlaybackEngine as n, trackCurrentTime as o, flushBuffer as r, loadTextTrackCues as s, SpfMedia as t, loadSegments as u };\n//# sourceMappingURL=adapter-CMw-rvbk.js.map","import { MediaProxyMixin } from \"../../../core/media/proxy.js\";\nimport { MediaDelegateMixin } from \"../../../core/media/delegate.js\";\nimport { CustomMediaMixin } from \"../custom-media-element/index.js\";\nimport { SpfMedia } from \"@videojs/spf/dom\";\n\n//#region src/dom/media/simple-hls/index.ts\nvar SimpleHlsCustomMedia = class extends MediaDelegateMixin(CustomMediaMixin(globalThis.HTMLElement ?? class {}, { tag: \"video\" }), SpfMedia) {};\nvar SimpleHlsMedia = class extends MediaDelegateMixin(MediaProxyMixin(globalThis.HTMLVideoElement ?? class {}, globalThis.HTMLMediaElement ?? class {}, globalThis.EventTarget ?? class {}), SpfMedia) {};\n\n//#endregion\nexport { SimpleHlsCustomMedia, SimpleHlsMedia };\n//# sourceMappingURL=index.js.map","import { SimpleHlsCustomMedia } from '@videojs/core/dom/media/simple-hls';\n\nexport class SimpleHlsVideo extends SimpleHlsCustomMedia {\n static getTemplateHTML(attrs: Record<string, string>): string {\n const { src, ...rest } = attrs;\n // biome-ignore lint/complexity/noThisInStatic: intentional use of super\n return super.getTemplateHTML(rest);\n }\n\n constructor() {\n super();\n this.attach(this.target);\n }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void {\n if (attrName !== 'src') {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n }\n\n if (attrName === 'src' && oldValue !== newValue) {\n this.src = newValue ?? '';\n }\n }\n}\n","import { SimpleHlsVideo } from '../../media/simple-hls-video';\n\nexport class SimpleHlsVideoElement extends SimpleHlsVideo {\n static readonly tagName = 'simple-hls-video';\n}\n\ncustomElements.define(SimpleHlsVideoElement.tagName, SimpleHlsVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [SimpleHlsVideoElement.tagName]: SimpleHlsVideoElement;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"simple-hls-video.js","names":["#readableStream","#runFn","#signal","#abortController","#status","#value","#error","#destroyed","#pending","#settled","#resolveSettled","#chain","#current","ActorKeyByType","deriveState","deriveState","waitForSourceBuffersReady","getMaxBufferedEnd","#config","#engine","#cancelPendingPlay","#preload","#loadstartListener"],"sources":["../../../spf/dist/default/core/abr/ewma.js","../../../spf/dist/default/core/abr/bandwidth-estimator.js","../../../spf/dist/default/core/buffer/forward-buffer.js","../../../../node_modules/.pnpm/signal-polyfill@0.2.2/node_modules/signal-polyfill/dist/index.js","../../../spf/dist/default/core/signals/effect.js","../../../spf/dist/default/core/signals/primitives.js","../../../spf/dist/default/core/types/index.js","../../../spf/dist/default/core/utils/track-selection.js","../../../spf/dist/default/dom/network/chunked-stream-iterable.js","../../../spf/dist/default/dom/network/fetch.js","../../../spf/dist/default/core/buffer/back-buffer.js","../../../spf/dist/default/core/machine.js","../../../spf/dist/default/core/create-machine-actor.js","../../../spf/dist/default/core/utils/generate-id.js","../../../spf/dist/default/core/task.js","../../../spf/dist/default/dom/features/segment-loader-actor.js","../../../spf/dist/default/dom/features/load-segments.js","../../../spf/dist/default/dom/text/parse-vtt-segment.js","../../../spf/dist/default/core/create-machine-reactor.js","../../../spf/dist/default/dom/features/text-track-segment-loader-actor.js","../../../spf/dist/default/core/create-transition-actor.js","../../../spf/dist/default/dom/features/text-tracks-actor.js","../../../spf/dist/default/dom/features/load-text-track-cues.js","../../../spf/dist/default/dom/features/track-current-time.js","../../../spf/dist/default/dom/features/track-playback-initiated.js","../../../spf/dist/default/dom/media/append-segment.js","../../../spf/dist/default/dom/media/buffer-flusher.js","../../../spf/dist/default/core/features/calculate-presentation-duration.js","../../../spf/dist/default/core/abr/quality-selection.js","../../../spf/dist/default/core/features/quality-switching.js","../../../spf/dist/default/core/hls/parse-attributes.js","../../../spf/dist/default/core/hls/resolve-url.js","../../../spf/dist/default/core/hls/parse-multivariant.js","../../../spf/dist/default/core/features/resolve-presentation.js","../../../spf/dist/default/core/hls/parse-media-playlist.js","../../../spf/dist/default/core/features/resolve-track.js","../../../spf/dist/default/core/features/select-tracks.js","../../../spf/dist/default/core/features/sync-preload-attribute.js","../../../spf/dist/default/dom/features/end-of-stream.js","../../../spf/dist/default/dom/media/mediasource-setup.js","../../../spf/dist/default/dom/features/setup-mediasource.js","../../../spf/dist/default/dom/media/source-buffer-actor.js","../../../spf/dist/default/dom/features/setup-sourcebuffer.js","../../../spf/dist/default/dom/features/sync-text-tracks.js","../../../spf/dist/default/dom/features/update-duration.js","../../../spf/dist/default/dom/playback-engine/engine.js","../../../spf/dist/default/dom/playback-engine/adapter.js","../../../core/dist/default/dom/media/simple-hls/index.js","../../src/media/simple-hls-video/index.ts","../../src/define/media/simple-hls-video.ts"],"sourcesContent":["//#region src/core/abr/ewma.ts\n/**\n* Exponentially Weighted Moving Average (EWMA)\n*\n* Pure functional implementation of EWMA calculations.\n* Based on Shaka Player's EWMA algorithm.\n*/\n/**\n* Calculate alpha (decay factor) from half-life.\n*\n* Alpha determines how quickly old data \"expires\":\n* - alpha close to 1 = slow decay (long memory)\n* - alpha close to 0 = fast decay (short memory)\n*\n* @param halfLife - The quantity of prior samples (by weight) that make up\n* half of the new estimate. Must be positive.\n* @returns Alpha value between 0 and 1\n*\n* @example\n* const alpha = calculateAlpha(2); // ≈ 0.7071 for 2-second half-life\n*/\nfunction calculateAlpha(halfLife) {\n\treturn Math.exp(Math.log(.5) / halfLife);\n}\n/**\n* Calculate exponentially weighted moving average.\n*\n* Updates an estimate by blending a new value with the previous estimate,\n* weighted by the sample duration. Longer samples have more influence.\n*\n* @param prevEstimate - Previous EWMA estimate\n* @param value - New sample value to incorporate\n* @param weight - Sample weight (typically duration in seconds)\n* @param halfLife - Half-life for decay (typically 2-5 seconds)\n* @returns Updated EWMA estimate\n*\n* @example\n* let estimate = 0;\n* estimate = calculateEwma(estimate, 1_000_000, 1, 2); // First sample\n* estimate = calculateEwma(estimate, 2_000_000, 1, 2); // Second sample\n*/\nfunction calculateEwma(prevEstimate, value, weight, halfLife) {\n\tconst adjAlpha = calculateAlpha(halfLife) ** weight;\n\treturn value * (1 - adjAlpha) + adjAlpha * prevEstimate;\n}\n/**\n* Apply zero-factor correction to EWMA estimate.\n*\n* The zero-factor correction compensates for bias when starting from zero.\n* Without this correction, early estimates would be artificially low.\n*\n* As totalWeight increases, the correction factor approaches 1, meaning\n* the estimate becomes more reliable and needs less correction.\n*\n* @param estimate - Raw EWMA estimate (uncorrected)\n* @param totalWeight - Accumulated weight from all samples\n* @param halfLife - Half-life used in EWMA calculation\n* @returns Corrected estimate, or 0 if totalWeight is 0\n*\n* @example\n* const raw = calculateEwma(0, 1_000_000, 1, 2);\n* const corrected = applyZeroFactor(raw, 1, 2); // ≈ 1_000_000\n*/\nfunction applyZeroFactor(estimate, totalWeight, halfLife) {\n\tif (totalWeight === 0) return 0;\n\treturn estimate / (1 - calculateAlpha(halfLife) ** totalWeight);\n}\n//#endregion\nexport { applyZeroFactor, calculateEwma };\n\n//# sourceMappingURL=ewma.js.map","import { applyZeroFactor, calculateEwma } from \"./ewma.js\";\n//#region src/core/abr/bandwidth-estimator.ts\n/**\n* Dual EWMA Bandwidth Estimator\n*\n* Estimates available bandwidth using two EWMA calculations with different\n* half-lives, taking the minimum of both. This approach (from Shaka Player):\n*\n* - **Fast EWMA** (2s half-life): Reacts quickly to bandwidth drops\n* - **Slow EWMA** (5s half-life): Provides stability during fluctuations\n* - **min(fast, slow)**: Adapts down quickly, up slowly\n*\n* This naturally provides asymmetric behavior needed for good QoE:\n* avoiding stalls (quick downgrade) while preventing oscillation (slow upgrade).\n*/\n/**\n* Default bandwidth estimator configuration.\n*\n* Values match Shaka Player defaults based on experimentation.\n*/\nconst DEFAULT_BANDWIDTH_CONFIG = {\n\tfastHalfLife: 2,\n\tslowHalfLife: 5,\n\tminTotalBytes: 128e3,\n\tminBytes: 16e3,\n\tminDuration: 5\n};\n/**\n* Add a bandwidth sample from a segment download.\n*\n* Samples are filtered based on:\n* - Minimum bytes (filters TTFB-dominated small segments)\n* - Minimum duration (filters cached responses)\n*\n* Valid samples update both fast and slow EWMA estimates.\n*\n* @param state - Current estimator state\n* @param durationMs - Download duration in milliseconds\n* @param numBytes - Number of bytes downloaded\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns New estimator state with sample incorporated (or unchanged if filtered)\n*\n* @example\n* let state = { fastEstimate: 0, fastTotalWeight: 0, ... };\n* // Sample: 1MB in 1 second\n* state = sampleBandwidth(state, 1000, 1_000_000);\n*/\nfunction sampleBandwidth(state, durationMs, numBytes, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tconst updatedBytesSampled = state.bytesSampled + numBytes;\n\tif (numBytes < config.minBytes) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tif (durationMs < config.minDuration) return {\n\t\t...state,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n\tconst bandwidth = 8e3 * numBytes / durationMs;\n\tconst weight = durationMs / 1e3;\n\treturn {\n\t\tfastEstimate: calculateEwma(state.fastEstimate, bandwidth, weight, config.fastHalfLife),\n\t\tfastTotalWeight: state.fastTotalWeight + weight,\n\t\tslowEstimate: calculateEwma(state.slowEstimate, bandwidth, weight, config.slowHalfLife),\n\t\tslowTotalWeight: state.slowTotalWeight + weight,\n\t\tbytesSampled: updatedBytesSampled\n\t};\n}\n/**\n* Get the current bandwidth estimate.\n*\n* Returns the **minimum** of the fast and slow EWMA estimates.\n* This provides the key asymmetric behavior:\n* - When bandwidth drops, fast EWMA reacts first and dominates (quick adaptation)\n* - When bandwidth rises, slow EWMA lags behind and dominates (slow adaptation)\n*\n* Uses default estimate until enough data has been sampled.\n*\n* @param state - Current estimator state\n* @param defaultEstimate - Fallback estimate before sufficient samples (bps)\n* @param config - Optional estimator configuration (uses defaults if not provided)\n* @returns Bandwidth estimate in bits per second\n*\n* @example\n* const estimate = getBandwidthEstimate(state, 5_000_000); // 5 Mbps default\n*/\nfunction getBandwidthEstimate(state, defaultEstimate, config = DEFAULT_BANDWIDTH_CONFIG) {\n\tif (state.bytesSampled < config.minTotalBytes) return defaultEstimate;\n\tconst fastEstimate = applyZeroFactor(state.fastEstimate, state.fastTotalWeight, config.fastHalfLife);\n\tconst slowEstimate = applyZeroFactor(state.slowEstimate, state.slowTotalWeight, config.slowHalfLife);\n\treturn Math.min(fastEstimate, slowEstimate);\n}\n//#endregion\nexport { getBandwidthEstimate, sampleBandwidth };\n\n//# sourceMappingURL=bandwidth-estimator.js.map","//#region src/core/buffer/forward-buffer.ts\n/**\n* Default forward buffer configuration.\n*/\nconst DEFAULT_FORWARD_BUFFER_CONFIG = { bufferDuration: 30 };\n/**\n* Get segments that need to be loaded for forward buffer.\n*\n* Determines which segments to load to maintain target buffer duration.\n* Handles discontiguous buffering (gaps after seeks).\n*\n* Algorithm:\n* 1. Calculate target time: currentTime + bufferDuration\n* 2. Find all segments in range [currentTime, targetTime)\n* 3. Filter out segments already buffered at that time position\n* 4. Return segments to load (fills gaps + extends to target)\n*\n* @param segments - All available segments from playlist\n* @param bufferedSegments - Segments already buffered (ordered by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Array of segments to load (empty if buffer is sufficient)\n*\n* @example\n* // After seek: buffered [0-12, 18-30], playing at 7s\n* const toLoad = getSegmentsToLoad(segments, buffered, 7, { bufferDuration: 24 });\n* // Returns [seg-12, seg-30] (fills gap, extends to target 31s)\n*/\n/**\n* Calculate the start time from which to flush forward buffer content.\n*\n* Content that starts at or beyond `currentTime + bufferDuration` is no\n* longer needed for the current playback position and should be removed\n* from the SourceBuffer. This prevents unbounded accumulation of scattered\n* SourceBuffer content after seeks, which can cause QuotaExceededError on\n* long-form content.\n*\n* Returns `Infinity` when nothing needs flushing (no buffered segments\n* exist beyond the threshold).\n*\n* @param bufferedSegments - Segments currently tracked in the buffer model\n* @param currentTime - Current playback position in seconds\n* @param config - Optional forward buffer configuration\n* @returns Start time to flush from (flush range: [flushStart, Infinity)),\n* or Infinity if no flush is needed\n*\n* @example\n* // Playing at 0s, buffered [0,6,12,18,24,30,36], bufferDuration=30\n* const flushStart = calculateForwardFlushPoint(segments, 0);\n* // Returns 30 — flush [30, Infinity), keep [0, 30)\n*/\nfunction calculateForwardFlushPoint(bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (bufferedSegments.length === 0) return Infinity;\n\tconst threshold = currentTime + config.bufferDuration;\n\tconst beyond = bufferedSegments.filter((seg) => seg.startTime >= threshold);\n\tif (beyond.length === 0) return Infinity;\n\treturn Math.min(...beyond.map((seg) => seg.startTime));\n}\nfunction getSegmentsToLoad(segments, bufferedSegments, currentTime, config = DEFAULT_FORWARD_BUFFER_CONFIG) {\n\tif (segments.length === 0) return [];\n\tconst targetTime = currentTime + config.bufferDuration;\n\tconst bufferedStartTimes = new Set(bufferedSegments.map((seg) => seg.startTime));\n\treturn segments.filter((seg) => {\n\t\tconst segmentEnd = seg.startTime + seg.duration;\n\t\tconst isInRange = seg.startTime < targetTime && segmentEnd > currentTime;\n\t\tconst isNotBuffered = !bufferedStartTimes.has(seg.startTime);\n\t\treturn isInRange && isNotBuffered;\n\t});\n}\n//#endregion\nexport { DEFAULT_FORWARD_BUFFER_CONFIG, calculateForwardFlushPoint, getSegmentsToLoad };\n\n//# sourceMappingURL=forward-buffer.js.map","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nvar __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateIn = (member, obj) => {\n if (Object(obj) !== obj)\n throw TypeError('Cannot use the \"in\" operator on this value');\n return member.has(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction defaultEquals(a, b) {\n return Object.is(a, b);\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet activeConsumer = null;\nlet inNotificationPhase = false;\nlet epoch = 1;\nconst SIGNAL = /* @__PURE__ */ Symbol(\"SIGNAL\");\nfunction setActiveConsumer(consumer) {\n const prev = activeConsumer;\n activeConsumer = consumer;\n return prev;\n}\nfunction getActiveConsumer() {\n return activeConsumer;\n}\nfunction isInNotificationPhase() {\n return inNotificationPhase;\n}\nconst REACTIVE_NODE = {\n version: 0,\n lastCleanEpoch: 0,\n dirty: false,\n producerNode: void 0,\n producerLastReadVersion: void 0,\n producerIndexOfThis: void 0,\n nextProducerIndex: 0,\n liveConsumerNode: void 0,\n liveConsumerIndexOfThis: void 0,\n consumerAllowSignalWrites: false,\n consumerIsAlwaysLive: false,\n producerMustRecompute: () => false,\n producerRecomputeValue: () => {\n },\n consumerMarkedDirty: () => {\n },\n consumerOnSignalRead: () => {\n }\n};\nfunction producerAccessed(node) {\n if (inNotificationPhase) {\n throw new Error(\n typeof ngDevMode !== \"undefined\" && ngDevMode ? `Assertion error: signal read during notification phase` : \"\"\n );\n }\n if (activeConsumer === null) {\n return;\n }\n activeConsumer.consumerOnSignalRead(node);\n const idx = activeConsumer.nextProducerIndex++;\n assertConsumerNode(activeConsumer);\n if (idx < activeConsumer.producerNode.length && activeConsumer.producerNode[idx] !== node) {\n if (consumerIsLive(activeConsumer)) {\n const staleProducer = activeConsumer.producerNode[idx];\n producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]);\n }\n }\n if (activeConsumer.producerNode[idx] !== node) {\n activeConsumer.producerNode[idx] = node;\n activeConsumer.producerIndexOfThis[idx] = consumerIsLive(activeConsumer) ? producerAddLiveConsumer(node, activeConsumer, idx) : 0;\n }\n activeConsumer.producerLastReadVersion[idx] = node.version;\n}\nfunction producerIncrementEpoch() {\n epoch++;\n}\nfunction producerUpdateValueVersion(node) {\n if (!node.dirty && node.lastCleanEpoch === epoch) {\n return;\n }\n if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) {\n node.dirty = false;\n node.lastCleanEpoch = epoch;\n return;\n }\n node.producerRecomputeValue(node);\n node.dirty = false;\n node.lastCleanEpoch = epoch;\n}\nfunction producerNotifyConsumers(node) {\n if (node.liveConsumerNode === void 0) {\n return;\n }\n const prev = inNotificationPhase;\n inNotificationPhase = true;\n try {\n for (const consumer of node.liveConsumerNode) {\n if (!consumer.dirty) {\n consumerMarkDirty(consumer);\n }\n }\n } finally {\n inNotificationPhase = prev;\n }\n}\nfunction producerUpdatesAllowed() {\n return (activeConsumer == null ? void 0 : activeConsumer.consumerAllowSignalWrites) !== false;\n}\nfunction consumerMarkDirty(node) {\n var _a;\n node.dirty = true;\n producerNotifyConsumers(node);\n (_a = node.consumerMarkedDirty) == null ? void 0 : _a.call(node.wrapper ?? node);\n}\nfunction consumerBeforeComputation(node) {\n node && (node.nextProducerIndex = 0);\n return setActiveConsumer(node);\n}\nfunction consumerAfterComputation(node, prevConsumer) {\n setActiveConsumer(prevConsumer);\n if (!node || node.producerNode === void 0 || node.producerIndexOfThis === void 0 || node.producerLastReadVersion === void 0) {\n return;\n }\n if (consumerIsLive(node)) {\n for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n }\n }\n while (node.producerNode.length > node.nextProducerIndex) {\n node.producerNode.pop();\n node.producerLastReadVersion.pop();\n node.producerIndexOfThis.pop();\n }\n}\nfunction consumerPollProducersForChange(node) {\n assertConsumerNode(node);\n for (let i = 0; i < node.producerNode.length; i++) {\n const producer = node.producerNode[i];\n const seenVersion = node.producerLastReadVersion[i];\n if (seenVersion !== producer.version) {\n return true;\n }\n producerUpdateValueVersion(producer);\n if (seenVersion !== producer.version) {\n return true;\n }\n }\n return false;\n}\nfunction producerAddLiveConsumer(node, consumer, indexOfThis) {\n var _a;\n assertProducerNode(node);\n assertConsumerNode(node);\n if (node.liveConsumerNode.length === 0) {\n (_a = node.watched) == null ? void 0 : _a.call(node.wrapper);\n for (let i = 0; i < node.producerNode.length; i++) {\n node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i);\n }\n }\n node.liveConsumerIndexOfThis.push(indexOfThis);\n return node.liveConsumerNode.push(consumer) - 1;\n}\nfunction producerRemoveLiveConsumerAtIndex(node, idx) {\n var _a;\n assertProducerNode(node);\n assertConsumerNode(node);\n if (typeof ngDevMode !== \"undefined\" && ngDevMode && idx >= node.liveConsumerNode.length) {\n throw new Error(\n `Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`\n );\n }\n if (node.liveConsumerNode.length === 1) {\n (_a = node.unwatched) == null ? void 0 : _a.call(node.wrapper);\n for (let i = 0; i < node.producerNode.length; i++) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n }\n }\n const lastIdx = node.liveConsumerNode.length - 1;\n node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx];\n node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx];\n node.liveConsumerNode.length--;\n node.liveConsumerIndexOfThis.length--;\n if (idx < node.liveConsumerNode.length) {\n const idxProducer = node.liveConsumerIndexOfThis[idx];\n const consumer = node.liveConsumerNode[idx];\n assertConsumerNode(consumer);\n consumer.producerIndexOfThis[idxProducer] = idx;\n }\n}\nfunction consumerIsLive(node) {\n var _a;\n return node.consumerIsAlwaysLive || (((_a = node == null ? void 0 : node.liveConsumerNode) == null ? void 0 : _a.length) ?? 0) > 0;\n}\nfunction assertConsumerNode(node) {\n node.producerNode ?? (node.producerNode = []);\n node.producerIndexOfThis ?? (node.producerIndexOfThis = []);\n node.producerLastReadVersion ?? (node.producerLastReadVersion = []);\n}\nfunction assertProducerNode(node) {\n node.liveConsumerNode ?? (node.liveConsumerNode = []);\n node.liveConsumerIndexOfThis ?? (node.liveConsumerIndexOfThis = []);\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction computedGet(node) {\n producerUpdateValueVersion(node);\n producerAccessed(node);\n if (node.value === ERRORED) {\n throw node.error;\n }\n return node.value;\n}\nfunction createComputed(computation) {\n const node = Object.create(COMPUTED_NODE);\n node.computation = computation;\n const computed = () => computedGet(node);\n computed[SIGNAL] = node;\n return computed;\n}\nconst UNSET = /* @__PURE__ */ Symbol(\"UNSET\");\nconst COMPUTING = /* @__PURE__ */ Symbol(\"COMPUTING\");\nconst ERRORED = /* @__PURE__ */ Symbol(\"ERRORED\");\nconst COMPUTED_NODE = /* @__PURE__ */ (() => {\n return {\n ...REACTIVE_NODE,\n value: UNSET,\n dirty: true,\n error: null,\n equal: defaultEquals,\n producerMustRecompute(node) {\n return node.value === UNSET || node.value === COMPUTING;\n },\n producerRecomputeValue(node) {\n if (node.value === COMPUTING) {\n throw new Error(\"Detected cycle in computations.\");\n }\n const oldValue = node.value;\n node.value = COMPUTING;\n const prevConsumer = consumerBeforeComputation(node);\n let newValue;\n let wasEqual = false;\n try {\n newValue = node.computation.call(node.wrapper);\n const oldOk = oldValue !== UNSET && oldValue !== ERRORED;\n wasEqual = oldOk && node.equal.call(node.wrapper, oldValue, newValue);\n } catch (err) {\n newValue = ERRORED;\n node.error = err;\n } finally {\n consumerAfterComputation(node, prevConsumer);\n }\n if (wasEqual) {\n node.value = oldValue;\n return;\n }\n node.value = newValue;\n node.version++;\n }\n };\n})();\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction defaultThrowError() {\n throw new Error();\n}\nlet throwInvalidWriteToSignalErrorFn = defaultThrowError;\nfunction throwInvalidWriteToSignalError() {\n throwInvalidWriteToSignalErrorFn();\n}\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nfunction createSignal(initialValue) {\n const node = Object.create(SIGNAL_NODE);\n node.value = initialValue;\n const getter = () => {\n producerAccessed(node);\n return node.value;\n };\n getter[SIGNAL] = node;\n return getter;\n}\nfunction signalGetFn() {\n producerAccessed(this);\n return this.value;\n}\nfunction signalSetFn(node, newValue) {\n if (!producerUpdatesAllowed()) {\n throwInvalidWriteToSignalError();\n }\n if (!node.equal.call(node.wrapper, node.value, newValue)) {\n node.value = newValue;\n signalValueChanged(node);\n }\n}\nconst SIGNAL_NODE = /* @__PURE__ */ (() => {\n return {\n ...REACTIVE_NODE,\n equal: defaultEquals,\n value: void 0\n };\n})();\nfunction signalValueChanged(node) {\n node.version++;\n producerIncrementEpoch();\n producerNotifyConsumers(node);\n}\n/**\n * @license\n * Copyright 2024 Bloomberg Finance L.P.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst NODE = Symbol(\"node\");\nvar Signal;\n((Signal2) => {\n var _a, _brand, brand_fn, _b, _brand2, brand_fn2;\n class State {\n constructor(initialValue, options = {}) {\n __privateAdd(this, _brand);\n __publicField(this, _a);\n const ref = createSignal(initialValue);\n const node = ref[SIGNAL];\n this[NODE] = node;\n node.wrapper = this;\n if (options) {\n const equals = options.equals;\n if (equals) {\n node.equal = equals;\n }\n node.watched = options[Signal2.subtle.watched];\n node.unwatched = options[Signal2.subtle.unwatched];\n }\n }\n get() {\n if (!(0, Signal2.isState)(this))\n throw new TypeError(\"Wrong receiver type for Signal.State.prototype.get\");\n return signalGetFn.call(this[NODE]);\n }\n set(newValue) {\n if (!(0, Signal2.isState)(this))\n throw new TypeError(\"Wrong receiver type for Signal.State.prototype.set\");\n if (isInNotificationPhase()) {\n throw new Error(\"Writes to signals not permitted during Watcher callback\");\n }\n const ref = this[NODE];\n signalSetFn(ref, newValue);\n }\n }\n _a = NODE;\n _brand = new WeakSet();\n brand_fn = function() {\n };\n Signal2.isState = (s) => typeof s === \"object\" && __privateIn(_brand, s);\n Signal2.State = State;\n class Computed {\n // Create a Signal which evaluates to the value returned by the callback.\n // Callback is called with this signal as the parameter.\n constructor(computation, options) {\n __privateAdd(this, _brand2);\n __publicField(this, _b);\n const ref = createComputed(computation);\n const node = ref[SIGNAL];\n node.consumerAllowSignalWrites = true;\n this[NODE] = node;\n node.wrapper = this;\n if (options) {\n const equals = options.equals;\n if (equals) {\n node.equal = equals;\n }\n node.watched = options[Signal2.subtle.watched];\n node.unwatched = options[Signal2.subtle.unwatched];\n }\n }\n get() {\n if (!(0, Signal2.isComputed)(this))\n throw new TypeError(\"Wrong receiver type for Signal.Computed.prototype.get\");\n return computedGet(this[NODE]);\n }\n }\n _b = NODE;\n _brand2 = new WeakSet();\n brand_fn2 = function() {\n };\n Signal2.isComputed = (c) => typeof c === \"object\" && __privateIn(_brand2, c);\n Signal2.Computed = Computed;\n ((subtle2) => {\n var _a2, _brand3, brand_fn3, _assertSignals, assertSignals_fn;\n function untrack(cb) {\n let output;\n let prevActiveConsumer = null;\n try {\n prevActiveConsumer = setActiveConsumer(null);\n output = cb();\n } finally {\n setActiveConsumer(prevActiveConsumer);\n }\n return output;\n }\n subtle2.untrack = untrack;\n function introspectSources(sink) {\n var _a3;\n if (!(0, Signal2.isComputed)(sink) && !(0, Signal2.isWatcher)(sink)) {\n throw new TypeError(\"Called introspectSources without a Computed or Watcher argument\");\n }\n return ((_a3 = sink[NODE].producerNode) == null ? void 0 : _a3.map((n) => n.wrapper)) ?? [];\n }\n subtle2.introspectSources = introspectSources;\n function introspectSinks(signal) {\n var _a3;\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called introspectSinks without a Signal argument\");\n }\n return ((_a3 = signal[NODE].liveConsumerNode) == null ? void 0 : _a3.map((n) => n.wrapper)) ?? [];\n }\n subtle2.introspectSinks = introspectSinks;\n function hasSinks(signal) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called hasSinks without a Signal argument\");\n }\n const liveConsumerNode = signal[NODE].liveConsumerNode;\n if (!liveConsumerNode)\n return false;\n return liveConsumerNode.length > 0;\n }\n subtle2.hasSinks = hasSinks;\n function hasSources(signal) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isWatcher)(signal)) {\n throw new TypeError(\"Called hasSources without a Computed or Watcher argument\");\n }\n const producerNode = signal[NODE].producerNode;\n if (!producerNode)\n return false;\n return producerNode.length > 0;\n }\n subtle2.hasSources = hasSources;\n class Watcher {\n // When a (recursive) source of Watcher is written to, call this callback,\n // if it hasn't already been called since the last `watch` call.\n // No signals may be read or written during the notify.\n constructor(notify) {\n __privateAdd(this, _brand3);\n __privateAdd(this, _assertSignals);\n __publicField(this, _a2);\n let node = Object.create(REACTIVE_NODE);\n node.wrapper = this;\n node.consumerMarkedDirty = notify;\n node.consumerIsAlwaysLive = true;\n node.consumerAllowSignalWrites = false;\n node.producerNode = [];\n this[NODE] = node;\n }\n // Add these signals to the Watcher's set, and set the watcher to run its\n // notify callback next time any signal in the set (or one of its dependencies) changes.\n // Can be called with no arguments just to reset the \"notified\" state, so that\n // the notify callback will be invoked again.\n watch(...signals) {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called unwatch without Watcher receiver\");\n }\n __privateMethod(this, _assertSignals, assertSignals_fn).call(this, signals);\n const node = this[NODE];\n node.dirty = false;\n const prev = setActiveConsumer(node);\n for (const signal of signals) {\n producerAccessed(signal[NODE]);\n }\n setActiveConsumer(prev);\n }\n // Remove these signals from the watched set (e.g., for an effect which is disposed)\n unwatch(...signals) {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called unwatch without Watcher receiver\");\n }\n __privateMethod(this, _assertSignals, assertSignals_fn).call(this, signals);\n const node = this[NODE];\n assertConsumerNode(node);\n for (let i = node.producerNode.length - 1; i >= 0; i--) {\n if (signals.includes(node.producerNode[i].wrapper)) {\n producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);\n const lastIdx = node.producerNode.length - 1;\n node.producerNode[i] = node.producerNode[lastIdx];\n node.producerIndexOfThis[i] = node.producerIndexOfThis[lastIdx];\n node.producerNode.length--;\n node.producerIndexOfThis.length--;\n node.nextProducerIndex--;\n if (i < node.producerNode.length) {\n const idxConsumer = node.producerIndexOfThis[i];\n const producer = node.producerNode[i];\n assertProducerNode(producer);\n producer.liveConsumerIndexOfThis[idxConsumer] = i;\n }\n }\n }\n }\n // Returns the set of computeds in the Watcher's set which are still yet\n // to be re-evaluated\n getPending() {\n if (!(0, Signal2.isWatcher)(this)) {\n throw new TypeError(\"Called getPending without Watcher receiver\");\n }\n const node = this[NODE];\n return node.producerNode.filter((n) => n.dirty).map((n) => n.wrapper);\n }\n }\n _a2 = NODE;\n _brand3 = new WeakSet();\n brand_fn3 = function() {\n };\n _assertSignals = new WeakSet();\n assertSignals_fn = function(signals) {\n for (const signal of signals) {\n if (!(0, Signal2.isComputed)(signal) && !(0, Signal2.isState)(signal)) {\n throw new TypeError(\"Called watch/unwatch without a Computed or State argument\");\n }\n }\n };\n Signal2.isWatcher = (w) => __privateIn(_brand3, w);\n subtle2.Watcher = Watcher;\n function currentComputed() {\n var _a3;\n return (_a3 = getActiveConsumer()) == null ? void 0 : _a3.wrapper;\n }\n subtle2.currentComputed = currentComputed;\n subtle2.watched = Symbol(\"watched\");\n subtle2.unwatched = Symbol(\"unwatched\");\n })(Signal2.subtle || (Signal2.subtle = {}));\n})(Signal || (Signal = {}));\nexport {\n Signal\n};\n","import { Signal } from \"signal-polyfill\";\n//#region src/core/signals/effect.ts\nconst pending = /* @__PURE__ */ new Set();\nconst watcher = new Signal.subtle.Watcher(() => {\n\tqueueMicrotask(runPending);\n});\nfunction runPending() {\n\tfor (const c of watcher.getPending()) pending.add(c);\n\twatcher.watch();\n\tfor (const c of pending) {\n\t\tpending.delete(c);\n\t\tc.get();\n\t}\n}\n/**\n* Run a side effect whenever its signal dependencies change.\n*\n* Executes immediately (synchronous initial run), then re-runs on the next\n* microtask after any dependency changes. If the callback returns a function,\n* it is called before each re-run and when the effect is stopped — the same\n* cleanup contract as Preact Signals, Maverick Signals, and Svelte 5 $effect.\n*\n* Returns a cleanup function that stops the effect.\n*/\nfunction effect(fn) {\n\tlet cleanup;\n\tconst c = new Signal.Computed(() => {\n\t\tif (typeof cleanup === \"function\") cleanup();\n\t\tcleanup = fn();\n\t});\n\twatcher.watch(c);\n\tc.get();\n\treturn () => {\n\t\twatcher.unwatch(c);\n\t\tif (typeof cleanup === \"function\") cleanup();\n\t};\n}\n//#endregion\nexport { effect };\n\n//# sourceMappingURL=effect.js.map","import { Signal } from \"signal-polyfill\";\n//#region src/core/signals/primitives.ts\n/** Read a signal value without tracking it as a dependency. */\nconst untrack = Signal.subtle.untrack;\n/** Create a writable reactive value. */\nfunction signal(initialValue, options) {\n\treturn new Signal.State(initialValue, options);\n}\n/** Create a computed reactive value. */\nfunction computed(fn, options) {\n\treturn new Signal.Computed(fn, options);\n}\n/**\n* Update a writable signal. Accepts either a partial object to merge into the\n* current state, or an updater function that receives the current state and\n* returns the next state.\n*\n* @example\n* update(state, { playbackRate: 2 });\n* update(state, (s) => ({ ...s, count: s.count + 1 }));\n*/\nfunction update(signal, updater) {\n\tconst current = untrack(() => signal.get());\n\tsignal.set(typeof updater === \"function\" ? updater(current) : {\n\t\t...current,\n\t\t...updater\n\t});\n}\n//#endregion\nexport { computed, signal, untrack, update };\n\n//# sourceMappingURL=primitives.js.map","//#region src/core/types/index.ts\nfunction isResolvedTrack(track) {\n\treturn \"segments\" in track;\n}\n/**\n* Check if a presentation has duration (at least one track resolved).\n* Narrows type to include required duration.\n*/\nfunction hasPresentationDuration(presentation) {\n\treturn presentation.duration !== void 0;\n}\n//#endregion\nexport { hasPresentationDuration, isResolvedTrack };\n\n//# sourceMappingURL=index.js.map","//#region src/core/utils/track-selection.ts\n/**\n* Map track type to selected track ID property key in state.\n*/\nconst SelectedTrackIdKeyByType = {\n\tvideo: \"selectedVideoTrackId\",\n\taudio: \"selectedAudioTrackId\",\n\ttext: \"selectedTextTrackId\"\n};\n/**\n* Map track type to buffer owner property key.\n* Used for SourceBuffer references in owners.\n*/\nconst BufferKeyByType = {\n\tvideo: \"videoBuffer\",\n\taudio: \"audioBuffer\"\n};\n/**\n* Get selected track from state by type.\n* Returns properly typed track (partially or fully resolved) or undefined.\n* Type parameter T is inferred from the type argument.\n*\n* @example\n* const videoTrack = getSelectedTrack(state, 'video');\n* if (videoTrack && isResolvedTrack(videoTrack)) {\n* // videoTrack is VideoTrack\n* }\n*/\nfunction getSelectedTrack(state, type) {\n\tconst { presentation } = state;\n\t/** @TODO Consider moving and reusing isUnresolved(presentation) (CJP) */\n\tif (!presentation || !(\"id\" in presentation)) return void 0;\n\tconst trackId = state[SelectedTrackIdKeyByType[type]];\n\treturn presentation.selectionSets.find(({ type: selectionSetType }) => selectionSetType === type)?.switchingSets[0]?.tracks.find(({ id }) => id === trackId);\n}\n//#endregion\nexport { BufferKeyByType, SelectedTrackIdKeyByType, getSelectedTrack };\n\n//# sourceMappingURL=track-selection.js.map","//#region src/dom/network/chunked-stream-iterable.ts\nconst DEFAULT_MIN_CHUNK_SIZE = 2 ** 17;\n/**\n* Adapts a `ReadableStream<Uint8Array>` (e.g. `response.body`) into an\n* `AsyncIterable<Uint8Array>` that yields chunks no smaller than\n* `minChunkSize` bytes. Smaller network chunks are accumulated and yielded\n* together once the threshold is met. Any remainder is flushed on stream end.\n*\n* Errors from the underlying stream propagate naturally — the reader lock is\n* always released via `finally`.\n*/\nvar ChunkedStreamIterable = class {\n\tminChunkSize;\n\t#readableStream;\n\tconstructor(readableStream, { minChunkSize = DEFAULT_MIN_CHUNK_SIZE } = {}) {\n\t\tthis.#readableStream = readableStream;\n\t\tthis.minChunkSize = minChunkSize;\n\t}\n\tasync *[Symbol.asyncIterator]() {\n\t\tlet pending;\n\t\tconst reader = this.#readableStream.getReader();\n\t\ttry {\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) {\n\t\t\t\t\tif (pending) yield pending;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tpending = pending ? concat(pending, value) : value;\n\t\t\t\tif (pending.length >= this.minChunkSize) {\n\t\t\t\t\tyield pending;\n\t\t\t\t\tpending = void 0;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\treader.releaseLock();\n\t\t}\n\t}\n};\nfunction concat(a, b) {\n\tconst result = new Uint8Array(a.length + b.length);\n\tresult.set(a);\n\tresult.set(b, a.length);\n\treturn result;\n}\n//#endregion\nexport { ChunkedStreamIterable };\n\n//# sourceMappingURL=chunked-stream-iterable.js.map","//#region src/dom/network/fetch.ts\n/**\n* Fetch resolvable from AddressableObject.\n*\n* Handles byte range requests if byteRange is present.\n* Returns native fetch Response for composability (can extract text, stream, etc.).\n*\n* @param addressable - Resource to fetch (url + optional byteRange)\n* @returns Promise resolving to Response\n*\n* @example\n* const response = await fetchResolvable({ url: 'https://example.com/segment.m4s' });\n* const text = await getResponseText(response);\n*\n* @example\n* // With byte range\n* const response = await fetchResolvable({\n* url: 'https://example.com/file.mp4',\n* byteRange: { start: 1000, end: 1999 }\n* });\n*/\nasync function fetchResolvable(addressable, options) {\n\tconst headers = new Headers(options?.headers);\n\tif (addressable.byteRange) {\n\t\tconst { start, end } = addressable.byteRange;\n\t\theaders.set(\"Range\", `bytes=${start}-${end}`);\n\t}\n\tconst request = new Request(addressable.url, {\n\t\tmethod: \"GET\",\n\t\theaders,\n\t\t...options\n\t});\n\treturn fetch(request);\n}\n/**\n* Extract text from Response.\n*\n* Accepts minimal Response-like object (just needs text() method).\n* Returns promise from response.text().\n*\n* @param response - Response-like object with text() method\n* @returns Promise resolving to text content\n*\n* @example\n* const response = await fetchResolvable(addressable);\n* const text = await getResponseText(response);\n*/\nfunction getResponseText(response) {\n\treturn response.text();\n}\n//#endregion\nexport { fetchResolvable, getResponseText };\n\n//# sourceMappingURL=fetch.js.map","//#region src/core/buffer/back-buffer.ts\n/**\n* Default back buffer configuration.\n*/\nconst DEFAULT_BACK_BUFFER_CONFIG = { keepSegments: 2 };\n/**\n* Calculate back buffer flush point.\n*\n* Determines where to flush old segments from the back buffer.\n* Keeps a fixed number of segments behind the current playback position.\n*\n* Algorithm:\n* 1. Find segments before currentTime\n* 2. Count back N segments (keepSegments)\n* 3. Return startTime of segment N+1 back (flush everything before this)\n*\n* @param segments - Available segments (should be sorted by startTime)\n* @param currentTime - Current playback position in seconds\n* @param config - Optional back buffer configuration\n* @returns Time in seconds to flush up to (flush range: [0, flushEnd))\n*\n* @example\n* const segments = [\n* { startTime: 0, duration: 6, ... },\n* { startTime: 6, duration: 6, ... },\n* { startTime: 12, duration: 6, ... },\n* { startTime: 18, duration: 6, ... },\n* ];\n*\n* // Playing at 18s, keep 2 segments\n* const flushEnd = calculateBackBufferFlushPoint(segments, 18);\n* // Returns 6 (flush [0, 6), keep [6-18))\n*/\nfunction calculateBackBufferFlushPoint(segments, currentTime, config = DEFAULT_BACK_BUFFER_CONFIG) {\n\tif (segments.length === 0) return 0;\n\tconst segmentsBefore = segments.filter((seg) => seg.startTime < currentTime);\n\tif (segmentsBefore.length === 0) return 0;\n\tconst segmentsToFlush = segmentsBefore.length - config.keepSegments;\n\tif (segmentsToFlush <= 0) return 0;\n\tif (segmentsToFlush >= segmentsBefore.length) return currentTime;\n\treturn segmentsBefore[segmentsToFlush].startTime;\n}\n//#endregion\nexport { calculateBackBufferFlushPoint };\n\n//# sourceMappingURL=back-buffer.js.map","import { signal, untrack, update } from \"./signals/primitives.js\";\n//#region src/core/machine.ts\n/**\n* Provisions the shared mechanics for all machine-like primitives: a snapshot\n* signal, an untracked state reader, and a transition function.\n*\n* Internal — consumed by `createMachineActor` and `createMachineReactor`. Not part of the\n* public API.\n*/\nfunction createMachineCore(initialSnapshot) {\n\tconst snapshotSignal = signal(initialSnapshot);\n\tconst getState = () => untrack(() => snapshotSignal.get().value);\n\tconst transition = (to) => update(snapshotSignal, (current) => ({\n\t\t...current,\n\t\tvalue: to\n\t}));\n\treturn {\n\t\tsnapshotSignal,\n\t\tgetState,\n\t\ttransition\n\t};\n}\n//#endregion\nexport { createMachineCore };\n\n//# sourceMappingURL=machine.js.map","import { untrack, update } from \"./signals/primitives.js\";\nimport { createMachineCore } from \"./machine.js\";\n//#region src/core/create-machine-actor.ts\n/**\n* Creates a message-driven actor from a declarative definition.\n*\n* The actor owns a reactive snapshot signal (state + context), an optional\n* runner, and dispatches incoming messages to per-state handlers. `'destroyed'`\n* is always the implicit terminal state — `destroy()` transitions there\n* unconditionally and all subsequent `send()` calls are no-ops.\n*\n* When a state declares `onSettled`, the framework calls `runner.whenSettled()`\n* after the handler returns. The runner owns the generation-token logic — if\n* new tasks are scheduled before the current batch settles, the callback is\n* automatically superseded.\n*\n* @example\n* const actor = createMachineActor({\n* runner: () => new SerialRunner(),\n* initial: 'idle',\n* context: {},\n* states: {\n* idle: {\n* on: {\n* load: (msg, { transition, runner }) => {\n* segments.forEach(s => runner.schedule(new Task(...)));\n* transition('loading');\n* }\n* }\n* },\n* loading: {\n* onSettled: 'idle',\n* on: {\n* load: (msg, { runner }) => {\n* runner.abortAll();\n* segments.forEach(s => runner.schedule(new Task(...)));\n* }\n* }\n* }\n* }\n* });\n*/\nfunction createMachineActor(def) {\n\tconst runner = def.runner?.();\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: def.initial,\n\t\tcontext: def.context\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => {\n\t\tupdate(snapshotSignal, { context });\n\t};\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tconst state = getState();\n\t\t\tif (state === \"destroyed\") return;\n\t\t\tconst handler = def.states[state]?.on?.[message.type];\n\t\t\tif (!handler) return;\n\t\t\thandler(message, {\n\t\t\t\tcontext: getContext(),\n\t\t\t\tgetContext,\n\t\t\t\ttransition: (to) => transition(to),\n\t\t\t\tsetContext,\n\t\t\t\t...runner ? { runner } : {}\n\t\t\t});\n\t\t\tconst newState = getState();\n\t\t\tif (newState !== \"destroyed\") {\n\t\t\t\tconst newStateDef = def.states[newState];\n\t\t\t\tif (newStateDef?.onSettled && runner) {\n\t\t\t\t\tconst targetState = newStateDef.onSettled;\n\t\t\t\t\trunner.whenSettled(() => {\n\t\t\t\t\t\tif (getState() !== newState) return;\n\t\t\t\t\t\ttransition(targetState);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\trunner?.destroy();\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createMachineActor };\n\n//# sourceMappingURL=create-machine-actor.js.map","//#region src/core/utils/generate-id.ts\n/**\n* Generate unique ID for HAM objects.\n*\n* Uses timestamp + random number for sufficient uniqueness.\n* IDs are strings without decimals.\n*\n* @returns Unique string ID in format: timestamp-random\n*\n* @example\n* ```ts\n* const id = generateId(); // \"1738423156789-542891\"\n* ```\n*/\nfunction generateId() {\n\treturn `${Date.now()}-${Math.floor(Math.random() * 1e6)}`;\n}\n//#endregion\nexport { generateId };\n\n//# sourceMappingURL=generate-id.js.map","import { generateId } from \"./utils/generate-id.js\";\nimport { anyAbortSignal } from \"@videojs/utils/events\";\n//#region src/core/task.ts\n/**\n* Generic reusable task that wraps an async run function.\n*\n* Owns its own AbortController so it can always be aborted independently.\n* Optionally composes an external AbortSignal so that a parent's cancellation\n* propagates into the task's work without requiring the caller to track the\n* task separately.\n*\n* Ordering guarantee: `value` is written before `status` transitions to `'done'`;\n* `error` is written before `status` transitions to `'error'`. Any reader\n* observing `status === 'done'` is guaranteed `value` is already present.\n*/\nvar Task = class {\n\tid;\n\t#runFn;\n\t#abortController = new AbortController();\n\t#signal;\n\t#status = \"pending\";\n\t#value = void 0;\n\t#error = void 0;\n\tconstructor(runFn, config) {\n\t\tthis.#runFn = runFn;\n\t\tconst rawId = config?.id;\n\t\tthis.id = typeof rawId === \"function\" ? rawId() : rawId ?? generateId();\n\t\tthis.#signal = config?.signal ? anyAbortSignal([this.#abortController.signal, config.signal]) : this.#abortController.signal;\n\t}\n\tget status() {\n\t\treturn this.#status;\n\t}\n\tget value() {\n\t\treturn this.#value;\n\t}\n\tget error() {\n\t\treturn this.#error;\n\t}\n\tasync run() {\n\t\tthis.#status = \"running\";\n\t\ttry {\n\t\t\tconst result = await this.#runFn(this.#signal);\n\t\t\tthis.#value = result;\n\t\t\tthis.#status = \"done\";\n\t\t\treturn result;\n\t\t} catch (e) {\n\t\t\tthis.#error = e;\n\t\t\tthis.#status = \"error\";\n\t\t\tthrow e;\n\t\t}\n\t}\n\tabort() {\n\t\tthis.#abortController.abort();\n\t}\n};\n/**\n* Runs tasks concurrently, deduplicated by task id.\n*\n* If a task with a given id is already in flight, subsequent schedule() calls\n* for that id are silently ignored until the first completes. Tasks are stored\n* so abortAll() can cancel any in-flight work (e.g. on engine cleanup).\n*/\nvar ConcurrentRunner = class {\n\t#pending = /* @__PURE__ */ new Map();\n\t#settled = Promise.resolve();\n\t#resolveSettled = null;\n\t#destroyed = false;\n\tschedule(task) {\n\t\tif (this.#destroyed) return Promise.resolve();\n\t\tconst existing = this.#pending.get(task.id);\n\t\tif (existing) return existing.promise;\n\t\tif (this.#pending.size === 0) this.#settled = new Promise((resolve) => {\n\t\t\tthis.#resolveSettled = resolve;\n\t\t});\n\t\tconst promise = task.run();\n\t\tpromise.catch(() => {});\n\t\tconst cleanup = () => {\n\t\t\tthis.#pending.delete(task.id);\n\t\t\tif (this.#pending.size === 0) {\n\t\t\t\tthis.#resolveSettled?.();\n\t\t\t\tthis.#resolveSettled = null;\n\t\t\t}\n\t\t};\n\t\tpromise.then(cleanup, cleanup);\n\t\tthis.#pending.set(task.id, {\n\t\t\ttask,\n\t\t\tpromise\n\t\t});\n\t\treturn promise;\n\t}\n\t/**\n\t* Registers a callback to fire when all currently in-flight tasks settle.\n\t* If the runner is already idle, the callback is never called. If abortAll()\n\t* is called before the batch settles, the callback is superseded and silently\n\t* dropped — no stale callbacks, no generation token required by the caller.\n\t*/\n\twhenSettled(callback) {\n\t\tif (this.#pending.size === 0) return;\n\t\tconst captured = this.#settled;\n\t\tcaptured.then(() => {\n\t\t\tif (this.#settled !== captured) return;\n\t\t\tcallback();\n\t\t}, () => {});\n\t}\n\tabortAll() {\n\t\tfor (const { task } of this.#pending.values()) task.abort();\n\t\tthis.#pending.clear();\n\t\tthis.#resolveSettled?.();\n\t\tthis.#resolveSettled = null;\n\t\tthis.#settled = Promise.resolve();\n\t}\n\tdestroy() {\n\t\tthis.#destroyed = true;\n\t\tthis.abortAll();\n\t}\n};\n/**\n* Runs tasks one at a time in submission order.\n*\n* Each schedule() call returns a Promise that resolves or rejects with the\n* task's result when it is eventually executed. Tasks wait in queue until the\n* prior task completes.\n*\n* Serialization is achieved by chaining each task's run() onto the tail of a\n* shared promise chain — no explicit queue or drain loop needed.\n*\n* abortAll() aborts all pending (not yet started) tasks and the currently\n* in-flight task. Pending tasks still run briefly but receive an aborted\n* signal and are expected to exit early.\n*/\nvar SerialRunner = class {\n\t#chain = Promise.resolve();\n\t#pending = /* @__PURE__ */ new Set();\n\t#current = null;\n\t#destroyed = false;\n\tschedule(task) {\n\t\tif (this.#destroyed) return Promise.resolve();\n\t\tconst t = task;\n\t\tthis.#pending.add(t);\n\t\tconst result = this.#chain.then(() => {\n\t\t\tthis.#pending.delete(t);\n\t\t\tthis.#current = t;\n\t\t\treturn task.run();\n\t\t}).finally(() => {\n\t\t\tthis.#current = null;\n\t\t});\n\t\tthis.#chain = result.then(() => {}, () => {});\n\t\treturn result;\n\t}\n\t/**\n\t* A promise that resolves when all currently-scheduled tasks have settled.\n\t* Use the reference as a generation token: capture it after scheduling a\n\t* batch, then check identity in the resolution callback to detect whether\n\t* a subsequent abortAll() + new batch has superseded this one.\n\t*/\n\tget settled() {\n\t\treturn this.#chain;\n\t}\n\t/**\n\t* Registers a callback to fire when all currently-pending tasks settle.\n\t* If the runner is already idle (no pending or running tasks), the callback\n\t* is never called. If new tasks are scheduled before the current batch\n\t* settles, the callback is superseded and silently dropped — no stale\n\t* callbacks, no generation token required by the caller.\n\t*/\n\twhenSettled(callback) {\n\t\tif (this.#pending.size === 0 && this.#current === null) return;\n\t\tconst currentChain = this.#chain;\n\t\tcurrentChain.then(() => {\n\t\t\tif (this.#chain !== currentChain) return;\n\t\t\tcallback();\n\t\t}, () => {});\n\t}\n\t/** Aborts and clears queued tasks without touching the in-flight task. */\n\tabortPending() {\n\t\tfor (const task of this.#pending) task.abort();\n\t\tthis.#pending.clear();\n\t}\n\tabortAll() {\n\t\tthis.abortPending();\n\t\tthis.#current?.abort();\n\t}\n\tdestroy() {\n\t\tthis.#destroyed = true;\n\t\tthis.abortAll();\n\t}\n};\n//#endregion\nexport { ConcurrentRunner, SerialRunner, Task };\n\n//# sourceMappingURL=task.js.map","import { calculateForwardFlushPoint, getSegmentsToLoad } from \"../../core/buffer/forward-buffer.js\";\nimport { effect } from \"../../core/signals/effect.js\";\nimport { calculateBackBufferFlushPoint } from \"../../core/buffer/back-buffer.js\";\nimport { createMachineActor } from \"../../core/create-machine-actor.js\";\nimport { SerialRunner, Task } from \"../../core/task.js\";\n//#region src/dom/features/segment-loader-actor.ts\n/**\n* Resolves when the SourceBufferActor snapshot reaches 'idle'.\n* Rejects if the signal is aborted or the actor is destroyed.\n*\n* Used to sequence SourceBufferActor operations without awaiting send()\n* directly — send() is fire-and-forget; callers observe completion via\n* state transition.\n*/\nfunction waitForIdle(snapshot, signal) {\n\treturn new Promise((resolve, reject) => {\n\t\tif (snapshot.get().value === \"idle\") {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tif (snapshot.get().value === \"destroyed\") {\n\t\t\treject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\treturn;\n\t\t}\n\t\tif (signal.aborted) {\n\t\t\treject(signal.reason);\n\t\t\treturn;\n\t\t}\n\t\tlet stop;\n\t\tconst cleanup = (fn) => {\n\t\t\tstop?.();\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tfn();\n\t\t};\n\t\tconst onAbort = () => cleanup(() => reject(signal.reason));\n\t\tstop = effect(() => {\n\t\t\tconst value = snapshot.get().value;\n\t\t\tif (value === \"idle\") cleanup(resolve);\n\t\t\telse if (value === \"destroyed\") cleanup(() => reject(new DOMException(\"Aborted\", \"AbortError\")));\n\t\t});\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n/**\n* Wraps a LoadTask descriptor into a Task that fetches (if needed) and\n* forwards to SourceBufferActor. Updates in-flight context around async\n* operations so the loading handler can make accurate continue/preempt\n* decisions at any point.\n*/\nfunction makeLoadTask(op, { getContext, setContext, fetchBytes, sourceBufferActor }) {\n\treturn new Task(async (taskSignal) => {\n\t\tif (taskSignal.aborted) return;\n\t\tif (op.type === \"remove\") {\n\t\t\tsourceBufferActor.send(op);\n\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\treturn;\n\t\t}\n\t\tif (op.type === \"append-init\") {\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightInitTrackId: op.meta.trackId\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tconst data = await fetchBytes(op, {\n\t\t\t\t\tsignal: taskSignal,\n\t\t\t\t\tminChunkSize: Infinity\n\t\t\t\t});\n\t\t\t\tif (!taskSignal.aborted) {\n\t\t\t\t\tsourceBufferActor.send({\n\t\t\t\t\t\ttype: \"append-init\",\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tmeta: op.meta\n\t\t\t\t\t});\n\t\t\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetContext({\n\t\t\t\t\t...getContext(),\n\t\t\t\t\tinFlightInitTrackId: null\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsetContext({\n\t\t\t...getContext(),\n\t\t\tinFlightSegmentId: op.meta.id\n\t\t});\n\t\ttry {\n\t\t\tconst stream = await fetchBytes(op, { signal: taskSignal });\n\t\t\tif (!taskSignal.aborted) {\n\t\t\t\tsourceBufferActor.send({\n\t\t\t\t\ttype: \"append-segment\",\n\t\t\t\t\tdata: stream,\n\t\t\t\t\tmeta: op.meta\n\t\t\t\t});\n\t\t\t\tawait waitForIdle(sourceBufferActor.snapshot, taskSignal);\n\t\t\t}\n\t\t} finally {\n\t\t\tsetContext({\n\t\t\t\t...getContext(),\n\t\t\t\tinFlightSegmentId: null\n\t\t\t});\n\t\t}\n\t});\n}\n/**\n* Creates a SegmentLoaderActor for one track type (video or audio).\n*\n* Receives load assignments via `send()` and owns all execution: planning,\n* removes, fetches, and appends. Coordinates with the SourceBufferActor for\n* all physical SourceBuffer operations.\n*\n* Planning (Cases 1–3) happens in the `load` handler on every incoming\n* message, producing an ordered LoadTask list. The runner drains that list\n* sequentially via SerialRunner. When a new message arrives mid-run, the\n* handler replans and either continues the in-flight operation (abortPending\n* + schedule new remainder) or preempts it (abortAll + cancel SourceBuffer\n* if needed + schedule new plan).\n*\n* @param sourceBufferActor - Shared SourceBufferActor reference (not owned)\n* @param fetchBytes - Tracked fetch closure (owns throughput sampling for segments).\n* Accepts an optional `minChunkSize` in options; init segments pass `Infinity`\n* so the entire body accumulates as one chunk before appending.\n*/\nfunction createSegmentLoaderActor(sourceBufferActor, fetchBytes) {\n\tconst getBufferedSegments = (allSegments) => {\n\t\tconst bufferedIds = new Set(sourceBufferActor.snapshot.get().context.segments.filter((s) => !s.partial).map((s) => s.id));\n\t\treturn allSegments.filter((s) => bufferedIds.has(s.id));\n\t};\n\t/**\n\t* Translate a load message into an ordered LoadTask list based on committed\n\t* actor state. In-flight awareness is handled separately in the load handler.\n\t*\n\t* @todo Rename alongside LoadTask (e.g. planOps).\n\t*\n\t* Case 1 — Removes: forward and back buffer flush points, segment-aligned.\n\t* No flush on track switch: appending new content overwrites existing buffer\n\t* ranges, and the actor's time-aligned deduplication keeps the segment model\n\t* accurate as new segments arrive.\n\t*\n\t* Case 2 — Init: schedule if not yet committed for this track.\n\t*\n\t* Case 3 — Segments: all segments in the load window not yet committed.\n\t*/\n\tconst planTasks = (message) => {\n\t\tconst { track, range } = message;\n\t\tconst actorCtx = sourceBufferActor.snapshot.get().context;\n\t\tconst bufferedSegments = getBufferedSegments(track.segments);\n\t\tconst currentTime = range?.start ?? 0;\n\t\tconst tasks = [];\n\t\tif (range) {\n\t\t\tconst forwardFlushStart = calculateForwardFlushPoint(bufferedSegments, currentTime);\n\t\t\tif (forwardFlushStart < Infinity) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: forwardFlushStart,\n\t\t\t\tend: Infinity\n\t\t\t});\n\t\t\tconst backFlushEnd = calculateBackBufferFlushPoint(bufferedSegments, currentTime);\n\t\t\tif (backFlushEnd > 0) tasks.push({\n\t\t\t\ttype: \"remove\",\n\t\t\t\tstart: 0,\n\t\t\t\tend: backFlushEnd\n\t\t\t});\n\t\t}\n\t\tif (actorCtx.initTrackId !== track.id) tasks.push({\n\t\t\ttype: \"append-init\",\n\t\t\tmeta: { trackId: track.id },\n\t\t\turl: track.initialization.url,\n\t\t\t...track.initialization.byteRange !== void 0 && { byteRange: track.initialization.byteRange }\n\t\t});\n\t\tif (range) {\n\t\t\tconst EPSILON = 1e-4;\n\t\t\tconst segmentsToLoad = getSegmentsToLoad(track.segments, bufferedSegments, currentTime).filter((seg) => {\n\t\t\t\tconst existing = actorCtx.segments.find((s) => Math.abs(s.startTime - seg.startTime) < EPSILON);\n\t\t\t\tif (existing?.partial) return true;\n\t\t\t\tif (!existing?.trackBandwidth || !track.bandwidth) return true;\n\t\t\t\treturn track.bandwidth > existing.trackBandwidth;\n\t\t\t});\n\t\t\tfor (const segment of segmentsToLoad) tasks.push({\n\t\t\t\ttype: \"append-segment\",\n\t\t\t\tmeta: {\n\t\t\t\t\tid: segment.id,\n\t\t\t\t\tstartTime: segment.startTime,\n\t\t\t\t\tduration: segment.duration,\n\t\t\t\t\ttrackId: track.id,\n\t\t\t\t\ttrackBandwidth: track.bandwidth\n\t\t\t\t},\n\t\t\t\turl: segment.url,\n\t\t\t\t...segment.byteRange !== void 0 && { byteRange: segment.byteRange }\n\t\t\t});\n\t\t}\n\t\treturn tasks;\n\t};\n\tconst scheduleAll = (tasks, { getContext, setContext, runner }) => {\n\t\ttasks.forEach((op) => {\n\t\t\trunner.schedule(makeLoadTask(op, {\n\t\t\t\tgetContext,\n\t\t\t\tsetContext,\n\t\t\t\tfetchBytes,\n\t\t\t\tsourceBufferActor\n\t\t\t})).then(void 0, (e) => {\n\t\t\t\tif (e instanceof Error && e.name === \"AbortError\") return;\n\t\t\t\tconsole.error(\"Unexpected error in segment loader:\", e);\n\t\t\t\trunner.abortPending();\n\t\t\t});\n\t\t});\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tinFlightInitTrackId: null,\n\t\t\tinFlightSegmentId: null\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: { load: (msg, ctx) => {\n\t\t\t\tconst allTasks = planTasks(msg);\n\t\t\t\tif (allTasks.length === 0) return;\n\t\t\t\tctx.transition(\"loading\");\n\t\t\t\tscheduleAll(allTasks, ctx);\n\t\t\t} } },\n\t\t\tloading: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { load: (msg, ctx) => {\n\t\t\t\t\tconst { context, runner } = ctx;\n\t\t\t\t\tconst allTasks = planTasks(msg);\n\t\t\t\t\tif (context.inFlightSegmentId !== null && allTasks.some((t) => t.type === \"append-segment\" && t.meta.id === context.inFlightSegmentId) || context.inFlightInitTrackId !== null && allTasks.some((t) => t.type === \"append-init\" && t.meta.trackId === context.inFlightInitTrackId)) {\n\t\t\t\t\t\trunner.abortPending();\n\t\t\t\t\t\tscheduleAll(allTasks.filter((t) => !(t.type === \"append-segment\" && t.meta.id === context.inFlightSegmentId) && !(t.type === \"append-init\" && t.meta.trackId === context.inFlightInitTrackId)), ctx);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trunner.abortAll();\n\t\t\t\t\t\tif (context.inFlightSegmentId !== null || context.inFlightInitTrackId !== null && allTasks.some((t) => t.type === \"append-init\" && t.meta.trackId !== context.inFlightInitTrackId)) sourceBufferActor.send({ type: \"cancel\" });\n\t\t\t\t\t\tscheduleAll(allTasks, ctx);\n\t\t\t\t\t}\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createSegmentLoaderActor };\n\n//# sourceMappingURL=segment-loader-actor.js.map","import { sampleBandwidth } from \"../../core/abr/bandwidth-estimator.js\";\nimport { DEFAULT_FORWARD_BUFFER_CONFIG } from \"../../core/buffer/forward-buffer.js\";\nimport { effect } from \"../../core/signals/effect.js\";\nimport { computed, signal } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { getSelectedTrack } from \"../../core/utils/track-selection.js\";\nimport { ChunkedStreamIterable } from \"../network/chunked-stream-iterable.js\";\nimport { fetchResolvable } from \"../network/fetch.js\";\nimport { createSegmentLoaderActor } from \"./segment-loader-actor.js\";\n//#region src/dom/features/load-segments.ts\nconst ActorKeyByType = {\n\tvideo: \"videoBufferActor\",\n\taudio: \"audioBufferActor\"\n};\nfunction createTrackedFetch(throughput, onSample) {\n\treturn async (addressable, options) => {\n\t\tconst { minChunkSize, ...fetchOptions } = options ?? {};\n\t\tconst response = await fetchResolvable(addressable, fetchOptions);\n\t\tif (!response.body) throw new Error(\"Response has no body\");\n\t\tconst body = response.body;\n\t\treturn { [Symbol.asyncIterator]: async function* () {\n\t\t\tlet chunkStart = performance.now();\n\t\t\tfor await (const chunk of new ChunkedStreamIterable(body, ...minChunkSize !== void 0 ? [{ minChunkSize }] : [])) {\n\t\t\t\tconst elapsed = performance.now() - chunkStart;\n\t\t\t\tconst next = sampleBandwidth(throughput.get(), elapsed, chunk.byteLength);\n\t\t\t\tthroughput.set(next);\n\t\t\t\tonSample?.(next);\n\t\t\t\tyield chunk;\n\t\t\t\tchunkStart = performance.now();\n\t\t\t}\n\t\t} };\n\t};\n}\n/**\n* Non-tracking fetch: eagerly starts the request and returns the response body\n* as a lazy chunk iterable. Used for audio tracks which don't sample bandwidth.\n* Pass `minChunkSize: Infinity` to accumulate the full body as a single chunk\n* (equivalent to arrayBuffer() but through the same streaming path).\n*/\nasync function fetchStream(addressable, options) {\n\tconst { minChunkSize, ...fetchOptions } = options ?? {};\n\tconst response = await fetchResolvable(addressable, fetchOptions);\n\tif (!response.body) throw new Error(\"Response has no body\");\n\treturn new ChunkedStreamIterable(response.body, ...minChunkSize !== void 0 ? [{ minChunkSize }] : []);\n}\nfunction selectLoadingInputs([segmentsCanLoad, state], type) {\n\tconst { playbackInitiated, preload, currentTime } = state;\n\treturn {\n\t\tplaybackInitiated,\n\t\tpreload,\n\t\tcurrentTime,\n\t\ttrack: getSelectedTrack(state, type),\n\t\tsegmentsCanLoad\n\t};\n}\n/**\n* Equality function encoding the condition hierarchy for relevant changes.\n*\n* Pre-play (!playbackInitiated):\n* Only preload changes matter. currentTime and resolvedTrackId are ignored\n* (track changes not supported pre-play; currentTime value is used at\n* trigger time but changes don't re-trigger).\n*\n* playbackInitiated transition:\n* Always fires (handled in the subscriber; preload='auto' suppression\n* applied there since equality functions have no memory of prior values).\n*\n* Post-play (playbackInitiated):\n* resolvedTrackId changes (track switch or previously-unresolved track\n* resolving) and currentTime changes both trigger. preload is irrelevant.\n*/\nconst segmentStartFor = (currentTime, track) => {\n\tif (currentTime == null) return void 0;\n\treturn track?.segments.find(({ startTime, duration }, i, segments) => currentTime >= startTime && (currentTime < startTime + duration || i === segments.length - 1))?.startTime;\n};\n/**\n* Returns true when the inputs are equal (no meaningful change — don't fire).\n* Returns false when the inputs differ in a way that requires a new message.\n*\n* This IS the shouldLoadSegments logic, expressed as an equality function.\n*/\nfunction loadingInputsEq(prevState, curState) {\n\tif (!curState.segmentsCanLoad) return true;\n\tif (!curState.playbackInitiated) {\n\t\tif (curState.preload === \"none\") return true;\n\t\treturn curState.preload === prevState.preload;\n\t}\n\tif (!prevState.playbackInitiated && curState.playbackInitiated) {\n\t\tif (prevState.preload !== \"auto\") return false;\n\t}\n\tif (!curState.track || !isResolvedTrack(curState.track)) return true;\n\tif (prevState.track?.id !== curState.track.id && isResolvedTrack(curState.track)) return false;\n\treturn segmentStartFor(prevState.currentTime, curState.track) === segmentStartFor(curState.currentTime, curState.track);\n}\n/**\n* Load segments orchestration — Reactor layer.\n*\n* Sends typed load messages to a SegmentLoaderActor when relevant conditions\n* change. Uses targeted subscriptions rather than broad combineLatest so only\n* meaningful state changes trigger evaluation.\n*\n* Condition hierarchy (see SegmentLoadingKey for detail):\n*\n* !playbackInitiated\n* preload==='none' (or unset) → dormant; no trigger\n* preload==='metadata' → trigger on transition to 'metadata'\n* preload==='auto' → trigger on transition to 'auto'\n*\n* !playbackInitiated → playbackInitiated\n* preload !== 'auto' → trigger (message shape changes)\n* preload === 'auto' → suppressed (was already full-range mode;\n* let segmentStart take over post-play)\n* KNOWN LIMITATION: seek-before-play with\n* preload='auto' is not supported — if the\n* user seeks before pressing play, the\n* first re-send is delayed until the next\n* segment boundary crossing post-play.\n*\n* playbackInitiated\n* resolvedTrackId changes → trigger\n* segmentStart(currentTime) changes → trigger (segment boundary only)\n*\n* @example\n* const cleanup = loadSegments({ state, owners }, { type: 'video' });\n*/\nfunction loadSegments({ state, owners }, config) {\n\tconst { type } = config;\n\tconst actorKey = ActorKeyByType[type];\n\tconst initialBandwidth = state.get().bandwidthState;\n\tconst throughput = signal(initialBandwidth ?? {\n\t\tfastEstimate: 0,\n\t\tfastTotalWeight: 0,\n\t\tslowEstimate: 0,\n\t\tslowTotalWeight: 0,\n\t\tbytesSampled: 0\n\t});\n\tconst fetchBytes = type === \"video\" ? createTrackedFetch(throughput, initialBandwidth !== void 0 ? (next) => {\n\t\tstate.set(Object.assign({}, state.get(), { bandwidthState: next }));\n\t} : void 0) : fetchStream;\n\tconst segmentLoader = signal(void 0);\n\tconst actorSource = computed(() => owners.get()[actorKey]);\n\tlet currentLoader;\n\tconst cleanupActorLifecycle = effect(() => {\n\t\tconst actor = actorSource.get();\n\t\tif (currentLoader) {\n\t\t\tcurrentLoader.destroy();\n\t\t\tsegmentLoader.set(void 0);\n\t\t\tcurrentLoader = void 0;\n\t\t}\n\t\tif (actor) {\n\t\t\tconst loader = createSegmentLoaderActor(actor, fetchBytes);\n\t\t\tcurrentLoader = loader;\n\t\t\tsegmentLoader.set(loader);\n\t\t}\n\t});\n\tconst segmentsCanLoad = computed(() => {\n\t\tconst track = getSelectedTrack(state.get(), type);\n\t\treturn !!track && isResolvedTrack(track) && !!segmentLoader.get();\n\t});\n\tconst loadingInputs = computed(() => selectLoadingInputs([segmentsCanLoad.get(), state.get()], type));\n\tlet prevInputs;\n\tconst cleanupLoadEffect = effect(() => {\n\t\tconst inputs = loadingInputs.get();\n\t\tif (prevInputs !== void 0 && loadingInputsEq(prevInputs, inputs)) return;\n\t\tconst { preload, playbackInitiated, currentTime, track, segmentsCanLoad: canLoad } = inputs;\n\t\tif (!canLoad) return;\n\t\tprevInputs = inputs;\n\t\tif (!(preload === \"auto\" || !!playbackInitiated))\n /** @ts-expect-error */\n\t\tsegmentLoader.get()?.send({\n\t\t\ttype: \"load\",\n\t\t\ttrack\n\t\t});\n\t\telse segmentLoader.get()?.send({\n\t\t\ttype: \"load\",\n\t\t\ttrack,\n\t\t\trange: {\n\t\t\t\tstart: currentTime,\n\t\t\t\tend: currentTime + DEFAULT_FORWARD_BUFFER_CONFIG.bufferDuration\n\t\t\t}\n\t\t});\n\t});\n\treturn () => {\n\t\tcleanupActorLifecycle();\n\t\tcleanupLoadEffect();\n\t\tcurrentLoader?.destroy();\n\t};\n}\n//#endregion\nexport { loadSegments };\n\n//# sourceMappingURL=load-segments.js.map","//#region src/dom/text/parse-vtt-segment.ts\n/**\n* Parse a VTT segment using browser's native parser.\n*\n* Creates a dummy video element with a track element to leverage\n* the browser's optimized VTT parsing. Returns parsed VTTCue objects.\n*/\nlet dummyVideo = null;\nfunction ensureDummyVideo() {\n\tif (!dummyVideo) {\n\t\tdummyVideo = document.createElement(\"video\");\n\t\tdummyVideo.muted = true;\n\t\tdummyVideo.preload = \"none\";\n\t\tdummyVideo.style.display = \"none\";\n\t\tdummyVideo.crossOrigin = \"anonymous\";\n\t}\n\treturn dummyVideo;\n}\nfunction parseVttSegment(url) {\n\tconst video = ensureDummyVideo();\n\tconst track = document.createElement(\"track\");\n\ttrack.kind = \"subtitles\";\n\ttrack.default = true;\n\treturn new Promise((resolve, reject) => {\n\t\tconst onLoad = () => {\n\t\t\tconst cues = [];\n\t\t\tconst textTrack = track.track;\n\t\t\tif (textTrack.cues) for (let i = 0; i < textTrack.cues.length; i++) {\n\t\t\t\tconst cue = textTrack.cues[i];\n\t\t\t\tif (cue) cues.push(cue);\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tresolve(cues);\n\t\t};\n\t\tconst onError = () => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`Failed to load VTT segment: ${url}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\ttrack.removeEventListener(\"load\", onLoad);\n\t\t\ttrack.removeEventListener(\"error\", onError);\n\t\t\tvideo.removeChild(track);\n\t\t};\n\t\ttrack.addEventListener(\"load\", onLoad);\n\t\ttrack.addEventListener(\"error\", onError);\n\t\tvideo.appendChild(track);\n\t\ttrack.src = url;\n\t});\n}\nfunction destroyVttParser() {\n\tdummyVideo = null;\n}\n//#endregion\nexport { destroyVttParser, parseVttSegment };\n\n//# sourceMappingURL=parse-vtt-segment.js.map","import { effect } from \"./signals/effect.js\";\nimport { untrack } from \"./signals/primitives.js\";\nimport { createMachineCore } from \"./machine.js\";\n//#region src/core/create-machine-reactor.ts\nconst toArray = (x) => x === void 0 ? [] : Array.isArray(x) ? x : [x];\n/**\n* Creates a reactive Reactor from a declarative definition.\n*\n* A Reactor is driven by subscriptions to external signals rather than\n* imperative messages. Each state holds an array of effect functions —\n* every element becomes one independent `effect()` call gated on that state,\n* with its own dependency tracking and cleanup lifecycle.\n*\n* `'destroying'` and `'destroyed'` are always implicit terminal states.\n* `destroy()` transitions through both in sequence: `'destroying'` first (for\n* potential async teardown in a future extension), then immediately `'destroyed'`\n* for the synchronous base case. Active effect cleanups fire via disposal.\n*\n* @example\n* const reactor = createMachineReactor({\n* initial: 'waiting',\n* monitor: () => srcSignal.get() ? 'active' : 'waiting',\n* states: {\n* active: {\n* // entry: runs once on state entry; fn body is automatically untracked.\n* entry: () => listen(el, 'play', handler),\n* // effects: re-runs whenever tracked signals change.\n* effects: () => { currentTimeSignal.get(); return cleanup; },\n* },\n* waiting: {},\n* }\n* });\n*/\nfunction createMachineReactor(def) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({ value: def.initial });\n\tconst effectDisposals = [];\n\tconst wrapResult = (result) => {\n\t\tif (!result) return void 0;\n\t\tif (typeof result === \"function\") return result;\n\t\treturn () => result.abort();\n\t};\n\tconst untracked = (baseCall) => () => untrack(baseCall);\n\tconst isTerminal = (snapshot) => snapshot.value === \"destroying\" || snapshot.value === \"destroyed\";\n\tconst descriptors = [...toArray(def.monitor).map((fn) => ({\n\t\tfn: () => {\n\t\t\tconst target = fn();\n\t\t\tif (target !== getState()) transition(target);\n\t\t},\n\t\tshouldSkip: isTerminal\n\t})), ...Object.entries(def.states).flatMap(([state, stateDef]) => {\n\t\tconst isNotState = (snapshot) => snapshot.value !== state;\n\t\treturn [...toArray(stateDef.entry).map((fn) => ({\n\t\t\tfn,\n\t\t\tshouldSkip: isNotState,\n\t\t\ttoFnCall: untracked\n\t\t})), ...toArray(stateDef.effects).map((fn) => ({\n\t\t\tfn,\n\t\t\tshouldSkip: isNotState\n\t\t}))];\n\t})];\n\tconst toEffect = ({ fn, shouldSkip, toFnCall = (baseCall) => baseCall }) => effect(() => {\n\t\tif (shouldSkip(snapshotSignal.get())) return;\n\t\tconst baseCall = () => fn();\n\t\treturn wrapResult(toFnCall(baseCall)());\n\t});\n\teffectDisposals.push(...descriptors.map(toEffect));\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tdestroy() {\n\t\t\tconst state = getState();\n\t\t\tif (state === \"destroying\" || state === \"destroyed\") return;\n\t\t\ttransition(\"destroying\");\n\t\t\ttransition(\"destroyed\");\n\t\t\tfor (const dispose of effectDisposals) dispose();\n\t\t}\n\t};\n}\n//#endregion\nexport { createMachineReactor };\n\n//# sourceMappingURL=create-machine-reactor.js.map","import { getSegmentsToLoad } from \"../../core/buffer/forward-buffer.js\";\nimport { untrack } from \"../../core/signals/primitives.js\";\nimport { SerialRunner, Task } from \"../../core/task.js\";\nimport { parseVttSegment } from \"../text/parse-vtt-segment.js\";\n//#region src/dom/features/text-track-segment-loader-actor.ts\n/**\n* Loads VTT segments for a text track and delegates cue management to a\n* TextTracksActor. Mirrors the SegmentLoaderActor/SourceBufferActor pattern\n* for the text track equivalent.\n*\n* Planning is done in the load handler: segments already recorded in\n* TextTracksActor's context are skipped. Each load preempts in-flight work\n* via abortAll() before scheduling fresh tasks.\n*/\nfunction createTextTrackSegmentLoaderActor(textTracksActor) {\n\tconst runner = new SerialRunner();\n\tlet destroyed = false;\n\treturn {\n\t\tsend({ track, currentTime }) {\n\t\t\tif (destroyed) return;\n\t\t\tconst trackId = track.id;\n\t\t\tconst bufferedSegments = untrack(() => textTracksActor.snapshot.get().context.segments[trackId] ?? []);\n\t\t\tconst segmentsToLoad = getSegmentsToLoad(track.segments, bufferedSegments, currentTime);\n\t\t\trunner.abortAll();\n\t\t\tfor (const segment of segmentsToLoad) runner.schedule(new Task(async (signal) => {\n\t\t\t\tif (signal.aborted) return;\n\t\t\t\ttry {\n\t\t\t\t\tconst cues = await parseVttSegment(segment.url);\n\t\t\t\t\tif (signal.aborted) return;\n\t\t\t\t\ttextTracksActor.send({\n\t\t\t\t\t\ttype: \"add-cues\",\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\ttrackId,\n\t\t\t\t\t\t\tid: segment.id,\n\t\t\t\t\t\t\tstartTime: segment.startTime,\n\t\t\t\t\t\t\tduration: segment.duration\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcues\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(\"Failed to load VTT segment:\", error);\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\t\t\tdestroyed = true;\n\t\t\trunner.destroy();\n\t\t}\n\t};\n}\n//#endregion\nexport { createTextTrackSegmentLoaderActor };\n\n//# sourceMappingURL=text-track-segment-loader-actor.js.map","import { untrack, update } from \"./signals/primitives.js\";\nimport { createMachineCore } from \"./machine.js\";\n//#region src/core/create-transition-actor.ts\n/**\n* Creates a reducer-shaped actor from an initial context and a reducer function.\n*\n* The reducer receives the current context and a message and returns the next\n* context. Returning the same reference (by identity) skips the signal update —\n* so early-returning `context` unchanged is both the no-op and the optimization.\n*\n* Side effects (e.g. DOM mutations) may be performed inside the reducer.\n* They run synchronously before the signal is updated.\n*\n* @example\n* const actor = createTransitionActor(\n* { count: 0 },\n* (context, message: { type: 'increment' }) => ({ count: context.count + 1 })\n* );\n*/\nfunction createTransitionActor(initialContext, reducer) {\n\tconst { snapshotSignal, getState, transition } = createMachineCore({\n\t\tvalue: \"active\",\n\t\tcontext: initialContext\n\t});\n\tconst getContext = () => untrack(() => snapshotSignal.get().context);\n\tconst setContext = (context) => update(snapshotSignal, { context });\n\treturn {\n\t\tget snapshot() {\n\t\t\treturn snapshotSignal;\n\t\t},\n\t\tsend(message) {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\tconst context = getContext();\n\t\t\tconst newContext = reducer(context, message);\n\t\t\tif (newContext !== context) setContext(newContext);\n\t\t},\n\t\tdestroy() {\n\t\t\tif (getState() === \"destroyed\") return;\n\t\t\ttransition(\"destroyed\");\n\t\t}\n\t};\n}\n//#endregion\nexport { createTransitionActor };\n\n//# sourceMappingURL=create-transition-actor.js.map","import { createTransitionActor } from \"../../core/create-transition-actor.js\";\n//#region src/dom/features/text-tracks-actor.ts\nfunction isDuplicateCue(cue, existing) {\n\treturn existing.some((r) => r.startTime === cue.startTime && r.endTime === cue.endTime && r.text === cue.text);\n}\n/** TextTrack actor: wraps all text tracks on a media element, owns cue operations. */\nfunction createTextTracksActor(mediaElement) {\n\treturn createTransitionActor({\n\t\tloaded: {},\n\t\tsegments: {}\n\t}, (context, message) => {\n\t\tconst { meta, cues } = message;\n\t\tconst { trackId, id: segmentId, startTime, duration } = meta;\n\t\tconst textTrack = Array.from(mediaElement.textTracks).find((t) => t.id === trackId);\n\t\tif (!textTrack) return context;\n\t\tconst existingCues = context.loaded[trackId] ?? [];\n\t\tconst existingSegments = context.segments[trackId] ?? [];\n\t\tconst prunedCues = cues.filter((cue) => !isDuplicateCue(cue, existingCues));\n\t\tconst segmentAlreadyLoaded = existingSegments.some((s) => s.id === segmentId);\n\t\tif (prunedCues.length === 0 && segmentAlreadyLoaded) return context;\n\t\tfor (const cue of prunedCues) textTrack.addCue(cue);\n\t\treturn {\n\t\t\t...context,\n\t\t\tloaded: {\n\t\t\t\t...context.loaded,\n\t\t\t\t[trackId]: [...existingCues, ...prunedCues]\n\t\t\t},\n\t\t\tsegments: segmentAlreadyLoaded ? context.segments : {\n\t\t\t\t...context.segments,\n\t\t\t\t[trackId]: [...existingSegments, {\n\t\t\t\t\tid: segmentId,\n\t\t\t\t\tstartTime,\n\t\t\t\t\tduration\n\t\t\t\t}]\n\t\t\t}\n\t\t};\n\t});\n}\n//#endregion\nexport { createTextTracksActor };\n\n//# sourceMappingURL=text-tracks-actor.js.map","import { computed, untrack, update } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { createMachineReactor } from \"../../core/create-machine-reactor.js\";\nimport { createTextTrackSegmentLoaderActor } from \"./text-track-segment-loader-actor.js\";\nimport { createTextTracksActor } from \"./text-tracks-actor.js\";\n//#region src/dom/features/load-text-track-cues.ts\nfunction getTextTracks(presentation) {\n\treturn presentation?.selectionSets?.find((s) => s.type === \"text\")?.switchingSets[0]?.tracks;\n}\nfunction findSelectedTrack(state) {\n\tconst track = getTextTracks(state.presentation)?.find((t) => t.id === state.selectedTextTrackId);\n\treturn track && isResolvedTrack(track) ? track : void 0;\n}\n/**\n* Derives the correct state from current state and owners.\n*\n* States are mutually exclusive and exhaustive:\n* - `'preconditions-unmet'`: no mediaElement, or no resolved presentation with text tracks\n* - `'setting-up'`: preconditions met; actors not yet in owners\n* - `'pending'`: actors alive; no selection, or selected track not yet resolved/in DOM\n* - `'monitoring-for-loads'`: selected track resolved, in DOM — ready to dispatch load messages\n*/\nfunction deriveState(state, owners) {\n\tif (!owners.mediaElement || !getTextTracks(state.presentation)?.length) return \"preconditions-unmet\";\n\tif (!owners.textTracksActor || !owners.segmentLoaderActor) return \"setting-up\";\n\tconst track = findSelectedTrack(state);\n\tif (!track || track.segments.length === 0) return \"pending\";\n\tif (!Array.from(owners.mediaElement.textTracks).some((t) => t.id === state.selectedTextTrackId)) return \"pending\";\n\treturn \"monitoring-for-loads\";\n}\nfunction teardownActors(owners) {\n\tconst { textTracksActor, segmentLoaderActor } = untrack(() => owners.get());\n\tif (!textTracksActor && !segmentLoaderActor) return;\n\ttextTracksActor?.destroy();\n\tsegmentLoaderActor?.destroy();\n\tupdate(owners, {\n\t\ttextTracksActor: void 0,\n\t\tsegmentLoaderActor: void 0\n\t});\n}\n/**\n* Text track cue loading orchestration.\n*\n* A single `always` monitor keeps the reactor in sync with conditions.\n* Actor lifecycle is managed across two states:\n*\n* - **`'setting-up'`** — creates `TextTracksActor` and `TextTrackSegmentLoaderActor`\n* and writes them to owners. Entry resets any stale actors first.\n* - **`'preconditions-unmet'`** — destroys any actors in owners and resets them to\n* `undefined`. Handles all paths back from active states.\n* - **`'monitoring-for-loads'`** — reactive dispatch: re-runs whenever `state`\n* changes (selection, currentTime, presentation) and sends a `load` message to\n* the segment loader.\n*\n* **Destroy note:** actors written to owners are NOT auto-destroyed when\n* `reactor.destroy()` is called. Callers must read them from owners and destroy\n* them explicitly alongside the reactor.\n*\n* @example\n* const reactor = loadTextTrackCues({ state, owners });\n* // later:\n* const { textTracksActor, segmentLoaderActor } = owners.get();\n* textTracksActor?.destroy();\n* segmentLoaderActor?.destroy();\n* reactor.destroy();\n*/\nfunction loadTextTrackCues({ state, owners }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.get(), owners.get()));\n\tconst currentTimeSignal = computed(() => state.get().currentTime ?? 0);\n\tconst selectedTrackSignal = computed(() => findSelectedTrack(state.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": { entry: () => {\n\t\t\t\tteardownActors(owners);\n\t\t\t} },\n\t\t\t\"setting-up\": { entry: () => {\n\t\t\t\tteardownActors(owners);\n\t\t\t\tconst mediaElement = owners.get().mediaElement;\n\t\t\t\tconst textTracksActor = createTextTracksActor(mediaElement);\n\t\t\t\tupdate(owners, {\n\t\t\t\t\ttextTracksActor,\n\t\t\t\t\tsegmentLoaderActor: createTextTrackSegmentLoaderActor(textTracksActor)\n\t\t\t\t});\n\t\t\t} },\n\t\t\tpending: {},\n\t\t\t\"monitoring-for-loads\": { effects: () => {\n\t\t\t\tconst currentTime = currentTimeSignal.get();\n\t\t\t\tconst track = selectedTrackSignal.get();\n\t\t\t\tconst { segmentLoaderActor } = untrack(() => owners.get());\n\t\t\t\tsegmentLoaderActor.send({\n\t\t\t\t\ttype: \"load\",\n\t\t\t\t\ttrack,\n\t\t\t\t\tcurrentTime\n\t\t\t\t});\n\t\t\t} }\n\t\t}\n\t});\n}\n//#endregion\nexport { loadTextTrackCues };\n\n//# sourceMappingURL=load-text-track-cues.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { update } from \"../../core/signals/primitives.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/dom/features/track-current-time.ts\n/**\n* Track current playback position from the media element.\n*\n* Mirrors `mediaElement.currentTime` into reactive state on:\n* - `timeupdate` — fires during playback (~4 Hz)\n* - `seeking` — fires when a seek begins; per spec, `currentTime` is\n* already at the new position when this event dispatches, so buffer\n* management can react immediately rather than waiting for `timeupdate`,\n* which does not fire while paused.\n*\n* Also syncs immediately when a media element becomes available.\n*\n* @example\n* const cleanup = trackCurrentTime({ state, owners });\n*/\nfunction trackCurrentTime({ state, owners }) {\n\tlet lastMediaElement;\n\tlet removeListeners = null;\n\tconst cleanupEffect = effect(() => {\n\t\tconst { mediaElement } = owners.get();\n\t\tif (mediaElement === lastMediaElement) return;\n\t\tremoveListeners?.();\n\t\tremoveListeners = null;\n\t\tlastMediaElement = mediaElement;\n\t\tif (!mediaElement) return;\n\t\tconst sync = () => {\n\t\t\tupdate(state, { currentTime: mediaElement.currentTime });\n\t\t};\n\t\tsync();\n\t\tconst removeTimeupdate = listen(mediaElement, \"timeupdate\", sync);\n\t\tconst removeSeeking = listen(mediaElement, \"seeking\", sync);\n\t\tremoveListeners = () => {\n\t\t\tremoveTimeupdate();\n\t\t\tremoveSeeking();\n\t\t};\n\t});\n\treturn () => {\n\t\tremoveListeners?.();\n\t\tcleanupEffect();\n\t};\n}\n//#endregion\nexport { trackCurrentTime };\n\n//# sourceMappingURL=track-current-time.js.map","import { computed, update } from \"../../core/signals/primitives.js\";\nimport { createMachineReactor } from \"../../core/create-machine-reactor.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/dom/features/track-playback-initiated.ts\n/**\n* FSM states for playback initiation tracking.\n*\n* ```\n* 'preconditions-unmet' ──── element + URL ────→ 'monitoring'\n* ↑ ↑ │\n* │ preconditions lost │ play / !paused\n* │ │ ↓\n* └────────────── 'playback-initiated' ←──────┘\n* (exit cleanup resets state.playbackInitiated → false)\n*\n* any state ──── destroy() ────→ 'destroying' ────→ 'destroyed'\n* ```\n*/\nfunction deriveState(state, owners) {\n\tif (!owners.mediaElement || !state.presentation?.url) return \"preconditions-unmet\";\n\tif (state.playbackInitiated) return \"playback-initiated\";\n\treturn \"monitoring\";\n}\n/**\n* Track whether playback has been initiated for the current presentation URL.\n*\n* A three-state Reactor FSM driven by `state.playbackInitiated` and the\n* `deriveState` pattern:\n* - `'preconditions-unmet'` — no element or URL yet; no effects.\n* - `'monitoring'` — checks `!el.paused` on entry; listens for `play`.\n* - `'playback-initiated'` — tracks element and URL; exit cleanup resets\n* `state.playbackInitiated` to `false` on any change or lost preconditions.\n*\n* @example\n* const reactor = trackPlaybackInitiated({ state, owners });\n* // later:\n* reactor.destroy();\n*/\nfunction trackPlaybackInitiated({ state, owners }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.get(), owners.get()));\n\tconst mediaElementSignal = computed(() => owners.get().mediaElement);\n\tconst urlSignal = computed(() => state.get().presentation?.url);\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\tmonitoring: { entry: () => {\n\t\t\t\tconst el = mediaElementSignal.get();\n\t\t\t\tupdate(state, { playbackInitiated: !el.paused });\n\t\t\t\treturn listen(el, \"play\", () => {\n\t\t\t\t\tupdate(state, { playbackInitiated: !el.paused });\n\t\t\t\t});\n\t\t\t} },\n\t\t\t\"playback-initiated\": { effects: () => {\n\t\t\t\tmediaElementSignal.get();\n\t\t\t\turlSignal.get();\n\t\t\t\treturn () => update(state, { playbackInitiated: false });\n\t\t\t} }\n\t\t}\n\t});\n}\n//#endregion\nexport { trackPlaybackInitiated };\n\n//# sourceMappingURL=track-playback-initiated.js.map","//#region src/dom/media/append-segment.ts\n/**\n* Append media data to a SourceBuffer.\n*\n* Accepts either a full ArrayBuffer (single append) or an AsyncIterable of\n* Uint8Array chunks (one append per chunk, in order). Waits for `updateend`\n* between each call so appends are serialized correctly.\n*\n* Errors from the SourceBuffer (`error` event) or from the iterable are\n* propagated as rejections.\n*/\nasync function appendSegment(sourceBuffer, data, signal) {\n\tif (data instanceof ArrayBuffer) await appendChunk(sourceBuffer, data);\n\telse try {\n\t\tfor await (const chunk of data) {\n\t\t\tif (signal?.aborted) throw signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n\t\t\tawait appendChunk(sourceBuffer, chunk);\n\t\t}\n\t} catch (e) {\n\t\tif (e instanceof DOMException && e.name === \"AbortError\" && !sourceBuffer.updating) try {\n\t\t\tsourceBuffer.abort();\n\t\t} catch {}\n\t\tthrow e;\n\t}\n}\nasync function appendChunk(sourceBuffer, data) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer append error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.appendBuffer(data);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n//#endregion\nexport { appendSegment };\n\n//# sourceMappingURL=append-segment.js.map","//#region src/dom/media/buffer-flusher.ts\n/**\n* Buffer flusher helper (P12)\n*\n* Removes a time range from a SourceBuffer to manage memory.\n*/\n/**\n* Remove a time range from a SourceBuffer.\n*\n* Waits for the SourceBuffer to be ready (not updating), then removes\n* the specified range. Returns a promise that resolves when removal completes.\n*\n* @param sourceBuffer - The SourceBuffer to remove data from\n* @param start - Start of the time range to remove (seconds)\n* @param end - End of the time range to remove (seconds)\n* @returns Promise that resolves when removal completes\n*\n* @example\n* await flushBuffer(videoSourceBuffer, 0, 30);\n*/\nasync function flushBuffer(sourceBuffer, start, end) {\n\tif (sourceBuffer.updating) await new Promise((resolve) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tresolve();\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t});\n\treturn new Promise((resolve, reject) => {\n\t\tconst onUpdateEnd = () => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t};\n\t\tconst onError = (event) => {\n\t\t\tcleanup();\n\t\t\treject(/* @__PURE__ */ new Error(`SourceBuffer remove error: ${event.type}`));\n\t\t};\n\t\tconst cleanup = () => {\n\t\t\tsourceBuffer.removeEventListener(\"updateend\", onUpdateEnd);\n\t\t\tsourceBuffer.removeEventListener(\"error\", onError);\n\t\t};\n\t\tsourceBuffer.addEventListener(\"updateend\", onUpdateEnd);\n\t\tsourceBuffer.addEventListener(\"error\", onError);\n\t\ttry {\n\t\t\tsourceBuffer.remove(start, end);\n\t\t} catch (error) {\n\t\t\tcleanup();\n\t\t\treject(error);\n\t\t}\n\t});\n}\n//#endregion\nexport { flushBuffer };\n\n//# sourceMappingURL=buffer-flusher.js.map","import { effect } from \"../signals/effect.js\";\nimport { isResolvedTrack } from \"../types/index.js\";\nimport { getSelectedTrack } from \"../utils/track-selection.js\";\n//#region src/core/features/calculate-presentation-duration.ts\n/**\n* Check if we can calculate presentation duration (have required data).\n*/\nfunction canCalculateDuration(state) {\n\tif (!state.presentation) return false;\n\treturn !!(state.selectedVideoTrackId || state.selectedAudioTrackId);\n}\n/**\n* Check if we should calculate presentation duration (conditions met).\n*/\nfunction shouldCalculateDuration(state) {\n\tif (!canCalculateDuration(state)) return false;\n\tconst { presentation } = state;\n\tif (presentation.duration !== void 0) return false;\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\treturn !!(videoTrack && isResolvedTrack(videoTrack) || audioTrack && isResolvedTrack(audioTrack));\n}\n/**\n* Get duration from the first resolved track (prefer video, fallback to audio).\n*/\nfunction getDurationFromResolvedTracks(state) {\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tif (videoTrack && isResolvedTrack(videoTrack)) return videoTrack.duration;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\tif (audioTrack && isResolvedTrack(audioTrack)) return audioTrack.duration;\n}\n/**\n* Calculate and set presentation duration from resolved tracks.\n*/\nfunction calculatePresentationDuration({ state }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!shouldCalculateDuration(currentState)) return;\n\t\tconst duration = getDurationFromResolvedTracks(currentState);\n\t\tif (duration === void 0 || !Number.isFinite(duration)) return;\n\t\tstate.set({\n\t\t\t...currentState,\n\t\t\tpresentation: {\n\t\t\t\t...currentState.presentation,\n\t\t\t\tduration\n\t\t\t}\n\t\t});\n\t});\n}\n//#endregion\nexport { calculatePresentationDuration };\n\n//# sourceMappingURL=calculate-presentation-duration.js.map","//#region src/core/abr/quality-selection.ts\n/**\n* Default quality selection configuration.\n* Values match Shaka Player upgrade threshold (0.85 = 15% headroom).\n*/\nconst DEFAULT_QUALITY_CONFIG = { safetyMargin: .85 };\n/**\n* Select the best video track based on current bandwidth estimate.\n*\n* Selects the highest quality track where bandwidth is sufficient with safety margin:\n* - currentBandwidth >= track.bandwidth / safetyMargin\n* - Default safetyMargin 0.85 means track uses ≤85% of bandwidth (15% headroom)\n* - At same bandwidth, prefers higher resolution\n*\n* @param tracks - Available video tracks (can be unsorted)\n* @param currentBandwidth - Current bandwidth estimate in bits per second\n* @param config - Optional quality selection configuration\n* @returns Selected track, or undefined if no tracks available\n*\n* @example\n* const tracks = [\n* { id: '360p', bandwidth: 500_000, ... },\n* { id: '720p', bandwidth: 2_000_000, ... },\n* { id: '1080p', bandwidth: 4_000_000, ... },\n* ];\n*\n* // With 2.5 Mbps, selects 720p (1080p needs 4M/0.85 = 4.7 Mbps)\n* const selected = selectQuality(tracks, 2_500_000);\n*/\nfunction selectQuality(tracks, currentBandwidth, config = DEFAULT_QUALITY_CONFIG) {\n\tif (tracks.length === 0) return;\n\tconst sortedTracks = tracks.slice().sort((a, b) => a.bandwidth - b.bandwidth);\n\tlet chosen;\n\tfor (const track of sortedTracks) if (currentBandwidth >= track.bandwidth / config.safetyMargin) {\n\t\tif (!chosen || track.bandwidth > chosen.bandwidth || track.bandwidth === chosen.bandwidth && hasHigherResolution(track, chosen)) chosen = track;\n\t}\n\treturn chosen ?? sortedTracks[0];\n}\n/**\n* Check if track A has higher resolution than track B.\n* Compares by total pixel count (width × height).\n*\n* @param trackA - First track to compare\n* @param trackB - Second track to compare\n* @returns True if trackA has more pixels than trackB\n*/\nfunction hasHigherResolution(trackA, trackB) {\n\treturn (trackA.width ?? 0) * (trackA.height ?? 0) > (trackB.width ?? 0) * (trackB.height ?? 0);\n}\n//#endregion\nexport { selectQuality };\n\n//# sourceMappingURL=quality-selection.js.map","import { getBandwidthEstimate } from \"../abr/bandwidth-estimator.js\";\nimport { effect } from \"../signals/effect.js\";\nimport { update } from \"../signals/primitives.js\";\nimport { selectQuality } from \"../abr/quality-selection.js\";\n//#region src/core/features/quality-switching.ts\n/**\n* Default quality switching configuration.\n*/\nconst DEFAULT_SWITCHING_CONFIG = {\n\tsafetyMargin: .85,\n\tminUpgradeInterval: 8e3,\n\tdefaultBandwidth: 5e6\n};\n/**\n* Get all video tracks from a presentation's first switching set.\n* Returns [] when the presentation is still unresolved (no selectionSets yet).\n*/\nfunction getVideoTracks(presentation) {\n\treturn (presentation.selectionSets?.find((s) => s.type === \"video\"))?.switchingSets[0]?.tracks ?? [];\n}\n/**\n* Quality switching orchestration (F9).\n*\n* Reacts to bandwidth estimate changes and updates `selectedVideoTrackId`\n* when a different quality is optimal:\n*\n* - **Downgrades** happen immediately to avoid buffering stalls.\n* - **Upgrades** are gated by `minUpgradeInterval` to prevent oscillation.\n* - The first switch (from any track, or no track) is always immediate.\n*\n* Smooth switching is handled downstream: when `selectedVideoTrackId` changes,\n* `resolveTrack` fetches the new playlist and `loadSegments` reloads the init\n* segment, then appends media segments from the current position in the new\n* quality. The browser's SourceBuffer replaces the overlapping buffered range.\n*\n* @example\n* const cleanup = switchQuality({ state });\n* // Later, when done:\n* cleanup();\n*/\nfunction switchQuality({ state }, config = {}) {\n\tconst safetyMargin = config.safetyMargin ?? DEFAULT_SWITCHING_CONFIG.safetyMargin;\n\tconst minUpgradeInterval = config.minUpgradeInterval ?? DEFAULT_SWITCHING_CONFIG.minUpgradeInterval;\n\tconst defaultBandwidth = config.defaultBandwidth ?? DEFAULT_SWITCHING_CONFIG.defaultBandwidth;\n\tlet lastUpgradeTime = Date.now();\n\tlet firstMeaningfulFire = true;\n\treturn effect(() => {\n\t\tconst { presentation, bandwidthState, selectedVideoTrackId, abrDisabled } = state.get();\n\t\tif (abrDisabled === true) return;\n\t\tif (!presentation || !bandwidthState) return;\n\t\tconst videoTracks = getVideoTracks(presentation);\n\t\tif (videoTracks.length === 0) return;\n\t\tconst isFirst = firstMeaningfulFire;\n\t\tfirstMeaningfulFire = false;\n\t\tconst optimal = selectQuality(videoTracks, getBandwidthEstimate(bandwidthState, defaultBandwidth), { safetyMargin });\n\t\tif (!optimal || optimal.id === selectedVideoTrackId) return;\n\t\tconst currentTrack = videoTracks.find((t) => t.id === selectedVideoTrackId);\n\t\tif (!currentTrack || optimal.bandwidth > currentTrack.bandwidth) {\n\t\t\tconst now = Date.now();\n\t\t\tif (!isFirst && now - lastUpgradeTime < minUpgradeInterval) return;\n\t\t\tlastUpgradeTime = now;\n\t\t}\n\t\tupdate(state, { selectedVideoTrackId: optimal.id });\n\t});\n}\n//#endregion\nexport { switchQuality };\n\n//# sourceMappingURL=quality-switching.js.map","//#region src/core/hls/parse-attributes.ts\n/**\n* Parse HLS attribute list from a tag line.\n* Handles both quoted and unquoted values.\n*/\nfunction parseAttributeList(line) {\n\tconst attributes = /* @__PURE__ */ new Map();\n\tfor (const match of line.matchAll(/([A-Z0-9-]+)=(?:\"([^\"]*)\"|([^,]*))/g)) {\n\t\tconst key = match[1];\n\t\tconst value = match[2] ?? match[3] ?? \"\";\n\t\tif (key) attributes.set(key, value);\n\t}\n\treturn attributes;\n}\n/**\n* Parse RESOLUTION attribute value (WIDTHxHEIGHT).\n*/\nfunction parseResolution(value) {\n\tconst match = /^(\\d+)x(\\d+)$/.exec(value);\n\tif (!match) return null;\n\treturn {\n\t\twidth: Number.parseInt(match[1], 10),\n\t\theight: Number.parseInt(match[2], 10)\n\t};\n}\n/**\n* Parse FRAME-RATE attribute to rational frame rate.\n*/\nfunction parseFrameRate(value) {\n\tconst fps = Number.parseFloat(value);\n\tif (Number.isNaN(fps) || fps <= 0) return void 0;\n\tif (Math.abs(fps - 23.976) < .01) return {\n\t\tframeRateNumerator: 24e3,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 29.97) < .01) return {\n\t\tframeRateNumerator: 3e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (Math.abs(fps - 59.94) < .01) return {\n\t\tframeRateNumerator: 6e4,\n\t\tframeRateDenominator: 1001\n\t};\n\tif (fps % 1 === 0) return { frameRateNumerator: Math.round(fps) };\n\treturn { frameRateNumerator: Math.round(fps) };\n}\n/**\n* Parse CODECS attribute into separate video and audio codecs.\n*/\nfunction parseCodecs(codecs) {\n\tconst parts = codecs.split(\",\").map((s) => s.trim());\n\tconst result = {};\n\tfor (const codec of parts) if (codec.startsWith(\"avc1.\") || codec.startsWith(\"hvc1.\") || codec.startsWith(\"hev1.\")) result.video = codec;\n\telse if (codec.startsWith(\"mp4a.\")) result.audio = codec;\n\treturn result;\n}\n/**\n* Parse #EXTINF duration value.\n*/\nfunction parseExtInfDuration(value) {\n\tconst durationPart = value.split(\",\")[0] ?? value;\n\tconst duration = Number.parseFloat(durationPart);\n\treturn Number.isNaN(duration) ? 0 : duration;\n}\n/**\n* Parse BYTERANGE attribute value.\n* Format: \"length[@offset]\"\n* If offset is omitted, it continues from the previous byte range end.\n*/\nfunction parseByteRange(value, previousEnd) {\n\tconst match = /^(\\d+)(?:@(\\d+))?$/.exec(value);\n\tif (!match) return null;\n\tconst length = Number.parseInt(match[1], 10);\n\tif (Number.isNaN(length)) return null;\n\tlet start;\n\tif (match[2] !== void 0) {\n\t\tstart = Number.parseInt(match[2], 10);\n\t\tif (Number.isNaN(start)) return null;\n\t} else if (previousEnd !== void 0) start = previousEnd;\n\telse return null;\n\treturn {\n\t\tstart,\n\t\tend: start + length - 1\n\t};\n}\n/**\n* Create AttributeList from raw attribute string.\n*/\nfunction createAttributeList(line) {\n\tconst map = parseAttributeList(line);\n\treturn {\n\t\tget(key) {\n\t\t\treturn map.get(key);\n\t\t},\n\t\tgetInt(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseInt(value, 10);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetFloat(key, defaultValue) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (value === void 0) return defaultValue;\n\t\t\tconst parsed = Number.parseFloat(value);\n\t\t\treturn Number.isNaN(parsed) ? defaultValue : parsed;\n\t\t},\n\t\tgetBool(key) {\n\t\t\treturn map.get(key) === \"YES\";\n\t\t},\n\t\tgetResolution(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseResolution(value) ?? void 0;\n\t\t},\n\t\tgetFrameRate(key) {\n\t\t\tconst value = map.get(key);\n\t\t\tif (!value) return void 0;\n\t\t\treturn parseFrameRate(value);\n\t\t}\n\t};\n}\n/**\n* Match a tag and extract its attributes.\n* Returns null if the line doesn't match the tag.\n*/\nfunction matchTag(line, tag) {\n\tconst prefix = `#${tag}:`;\n\tif (!line.startsWith(prefix)) return null;\n\treturn createAttributeList(line.slice(prefix.length));\n}\n//#endregion\nexport { matchTag, parseByteRange, parseCodecs, parseExtInfDuration };\n\n//# sourceMappingURL=parse-attributes.js.map","//#region src/core/hls/resolve-url.ts\n/**\n* Resolve a potentially relative URL against a base URL using native URL API.\n*/\nfunction resolveUrl(url, baseUrl) {\n\treturn new URL(url, baseUrl).href;\n}\n//#endregion\nexport { resolveUrl };\n\n//# sourceMappingURL=resolve-url.js.map","import { generateId } from \"../utils/generate-id.js\";\nimport { matchTag, parseCodecs } from \"./parse-attributes.js\";\nimport { resolveUrl } from \"./resolve-url.js\";\n//#region src/core/hls/parse-multivariant.ts\n/**\n* Parse HLS multivariant playlist into a Presentation.\n*\n* Returns Presentation with partially resolved tracks (no segment information).\n* Tracks contain metadata from multivariant playlist (bandwidth, resolution, codecs)\n* but segment information is added when media playlists are fetched.\n*\n* @param text - Raw playlist text content\n* @param unresolved - Unresolved presentation (contains URL for base URL resolution)\n* @returns Presentation with partially resolved tracks (duration is undefined)\n*/\nfunction parseMultivariantPlaylist(text, unresolved) {\n\tconst baseUrl = unresolved.url;\n\tconst lines = text.split(/\\r?\\n/);\n\tconst streams = [];\n\tconst audioRenditions = [];\n\tconst subtitleRenditions = [];\n\tlet pendingStreamInfo = null;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mediaAttrs = matchTag(trimmed, \"EXT-X-MEDIA\");\n\t\tif (mediaAttrs) {\n\t\t\tconst type = mediaAttrs.get(\"TYPE\");\n\t\t\tconst groupId = mediaAttrs.get(\"GROUP-ID\");\n\t\t\tconst name = mediaAttrs.get(\"NAME\");\n\t\t\tif (type === \"AUDIO\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\taudioRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: uri ? resolveUrl(uri, baseUrl) : void 0,\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type === \"SUBTITLES\" && groupId && name) {\n\t\t\t\tconst uri = mediaAttrs.get(\"URI\");\n\t\t\t\tif (uri) subtitleRenditions.push({\n\t\t\t\t\tgroupId,\n\t\t\t\t\tname,\n\t\t\t\t\tlanguage: mediaAttrs.get(\"LANGUAGE\"),\n\t\t\t\t\turi: resolveUrl(uri, baseUrl),\n\t\t\t\t\tdefault: mediaAttrs.getBool(\"DEFAULT\"),\n\t\t\t\t\tautoselect: mediaAttrs.getBool(\"AUTOSELECT\"),\n\t\t\t\t\tforced: mediaAttrs.getBool(\"FORCED\")\n\t\t\t\t});\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst streamInfAttrs = matchTag(trimmed, \"EXT-X-STREAM-INF\");\n\t\tif (streamInfAttrs) {\n\t\t\tpendingStreamInfo = {\n\t\t\t\tbandwidth: streamInfAttrs.getInt(\"BANDWIDTH\", 0),\n\t\t\t\tresolution: streamInfAttrs.getResolution(\"RESOLUTION\"),\n\t\t\t\tcodecs: streamInfAttrs.get(\"CODECS\"),\n\t\t\t\tframeRate: streamInfAttrs.getFrameRate(\"FRAME-RATE\"),\n\t\t\t\taudioGroupId: streamInfAttrs.get(\"AUDIO\")\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\t\tif (!trimmed.startsWith(\"#\") && pendingStreamInfo) {\n\t\t\tstreams.push({\n\t\t\t\t...pendingStreamInfo,\n\t\t\t\turi: resolveUrl(trimmed, baseUrl)\n\t\t\t});\n\t\t\tpendingStreamInfo = null;\n\t\t}\n\t}\n\tconst videoStreams = [];\n\tconst audioOnlyStreams = [];\n\tfor (const stream of streams) {\n\t\tif (!stream.codecs) {\n\t\t\tvideoStreams.push(stream);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsedCodecs = parseCodecs(stream.codecs);\n\t\tif (stream.codecs.split(\",\").length === 1) if (parsedCodecs.audio && !parsedCodecs.video) audioOnlyStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t\telse videoStreams.push(stream);\n\t}\n\tconst videoTracks = videoStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\tconst track = {\n\t\t\ttype: \"video\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"video/mp4\",\n\t\t\tcodecs: []\n\t\t};\n\t\tif (stream.resolution?.width !== void 0) track.width = stream.resolution.width;\n\t\tif (stream.resolution?.height !== void 0) track.height = stream.resolution.height;\n\t\tif (codecs?.video) track.codecs = [codecs.video];\n\t\tif (stream.frameRate) track.frameRate = stream.frameRate;\n\t\tif (stream.audioGroupId) track.audioGroupId = stream.audioGroupId;\n\t\treturn track;\n\t});\n\tconst audioOnlyTracks = audioOnlyStreams.map((stream) => {\n\t\tconst codecs = stream.codecs ? parseCodecs(stream.codecs) : void 0;\n\t\treturn {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: stream.uri,\n\t\t\tbandwidth: stream.bandwidth,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tcodecs: codecs?.audio ? [codecs.audio] : [],\n\t\t\tgroupId: stream.audioGroupId || \"default\",\n\t\t\tname: \"Default\",\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2\n\t\t};\n\t});\n\tconst audioTracks = [...audioRenditions.map((rendition) => {\n\t\tlet audioCodecs;\n\t\tfor (const stream of streams) if (stream.audioGroupId === rendition.groupId && stream.codecs) {\n\t\t\tconst codecs = parseCodecs(stream.codecs);\n\t\t\tif (codecs.audio) {\n\t\t\t\taudioCodecs = [codecs.audio];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst track = {\n\t\t\ttype: \"audio\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri ?? \"\",\n\t\t\tgroupId: rendition.groupId,\n\t\t\tname: rendition.name,\n\t\t\tmimeType: \"audio/mp4\",\n\t\t\tbandwidth: 0,\n\t\t\tsampleRate: 48e3,\n\t\t\tchannels: 2,\n\t\t\tcodecs: []\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (audioCodecs) track.codecs = audioCodecs;\n\t\tif (rendition.default) track.default = rendition.default;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\treturn track;\n\t}), ...audioOnlyTracks];\n\tconst textTracks = subtitleRenditions.map((rendition) => {\n\t\tconst track = {\n\t\t\ttype: \"text\",\n\t\t\tid: generateId(),\n\t\t\turl: rendition.uri,\n\t\t\tgroupId: rendition.groupId,\n\t\t\tlabel: rendition.name,\n\t\t\tkind: \"subtitles\",\n\t\t\tmimeType: \"text/vtt\",\n\t\t\tbandwidth: 0\n\t\t};\n\t\tif (rendition.language) track.language = rendition.language;\n\t\tif (rendition.default && rendition.autoselect) track.default = true;\n\t\tif (rendition.autoselect) track.autoselect = rendition.autoselect;\n\t\tif (rendition.forced) track.forced = rendition.forced;\n\t\treturn track;\n\t});\n\tconst selectionSets = [];\n\tif (videoTracks.length > 0) {\n\t\tconst videoSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\ttracks: videoTracks\n\t\t};\n\t\tconst videoSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"video\",\n\t\t\tswitchingSets: [videoSwitchingSet]\n\t\t};\n\t\tselectionSets.push(videoSelectionSet);\n\t}\n\tif (audioTracks.length > 0) {\n\t\tconst audioSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\ttracks: audioTracks\n\t\t};\n\t\tconst audioSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"audio\",\n\t\t\tswitchingSets: [audioSwitchingSet]\n\t\t};\n\t\tselectionSets.push(audioSelectionSet);\n\t}\n\tif (textTracks.length > 0) {\n\t\tconst textSwitchingSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\ttracks: textTracks\n\t\t};\n\t\tconst textSelectionSet = {\n\t\t\tid: generateId(),\n\t\t\ttype: \"text\",\n\t\t\tswitchingSets: [textSwitchingSet]\n\t\t};\n\t\tselectionSets.push(textSelectionSet);\n\t}\n\treturn {\n\t\tid: generateId(),\n\t\turl: unresolved.url,\n\t\tstartTime: 0,\n\t\tselectionSets\n\t};\n}\n//#endregion\nexport { parseMultivariantPlaylist };\n\n//# sourceMappingURL=parse-multivariant.js.map","import { computed, update } from \"../signals/primitives.js\";\nimport { fetchResolvable, getResponseText } from \"../../dom/network/fetch.js\";\nimport { createMachineReactor } from \"../create-machine-reactor.js\";\nimport { parseMultivariantPlaylist } from \"../hls/parse-multivariant.js\";\n//#region src/core/features/resolve-presentation.ts\n/**\n* Determines if resolution conditions are met based on preload policy and playback state.\n*\n* Resolution conditions:\n* - State-driven: preload is 'auto' or 'metadata'\n* - Playback-driven: playbackInitiated is true\n*\n* @param state - Current presentation state\n* @returns true if resolution conditions are met\n*/\nfunction shouldResolve(state) {\n\tconst { preload, playbackInitiated } = state;\n\treturn [\"auto\", \"metadata\"].includes(preload) || !!playbackInitiated;\n}\n/**\n* Derives the correct state from current state conditions.\n*\n* States are mutually exclusive and exhaustive:\n* - `'preconditions-unmet'`: no presentation, or presentation has no URL\n* - `'idle'`: URL present, unresolved (no id), shouldResolve not met\n* - `'resolving'`: URL present, unresolved (no id), shouldResolve met\n* - `'resolved'`: URL present, resolved (has id)\n*/\nfunction deriveState(state) {\n\tconst { presentation } = state;\n\tif (!presentation || !(\"url\" in presentation)) return \"preconditions-unmet\";\n\tif (\"id\" in presentation) return \"resolved\";\n\treturn shouldResolve(state) ? \"resolving\" : \"idle\";\n}\n/**\n* Resolves unresolved presentations using reactive composition.\n*\n* FSM driven by `deriveState` — a single `always` monitor keeps the state in\n* sync with conditions at all times. `'resolving'` additionally runs the fetch\n* task and returns an AbortController so the framework aborts it on state exit.\n*\n* @example\n* const reactor = resolvePresentation({ state });\n* // later:\n* reactor.destroy();\n*/\nfunction resolvePresentation({ state }) {\n\tconst derivedStateSignal = computed(() => deriveState(state.get()));\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => derivedStateSignal.get(),\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\tidle: {},\n\t\t\tresolving: { entry: () => {\n\t\t\t\tconst presentation = state.get().presentation;\n\t\t\t\tconst ac = new AbortController();\n\t\t\t\tfetchResolvable(presentation, { signal: ac.signal }).then((response) => getResponseText(response)).then((text) => {\n\t\t\t\t\tupdate(state, { presentation: parseMultivariantPlaylist(text, presentation) });\n\t\t\t\t}).catch((error) => {\n\t\t\t\t\tif (error instanceof Error && error.name === \"AbortError\") return;\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t\t\treturn ac;\n\t\t\t} },\n\t\t\tresolved: {}\n\t\t}\n\t});\n}\n//#endregion\nexport { resolvePresentation };\n\n//# sourceMappingURL=resolve-presentation.js.map","import { matchTag, parseByteRange, parseExtInfDuration } from \"./parse-attributes.js\";\nimport { resolveUrl } from \"./resolve-url.js\";\n//#region src/core/hls/parse-media-playlist.ts\n/**\n* Parse HLS media playlist and resolve track with segments.\n*\n* Takes an unresolved track (from multivariant playlist) and media playlist text,\n* returns a HAM-compliant resolved track with segments.\n*\n* @param text - Media playlist text content\n* @param unresolved - Unresolved track from parseMultivariantPlaylist\n* @returns Resolved track with segments (type inferred from input)\n*/\nfunction parseMediaPlaylist(text, unresolved) {\n\tconst lines = text.split(/\\r?\\n/);\n\tconst baseUrl = unresolved.url;\n\tconst segments = [];\n\tlet initSegmentUrl;\n\tlet initSegmentByteRange;\n\tlet currentDuration = 0;\n\tlet currentByteRange;\n\tlet currentTime = 0;\n\tlet segmentIndex = 0;\n\tlet previousByteRangeEnd;\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\t\tif (!trimmed || trimmed.startsWith(\"#\") && !trimmed.startsWith(\"#EXT\")) continue;\n\t\tif (trimmed === \"#EXTM3U\" || trimmed.startsWith(\"#EXT-X-VERSION:\") || trimmed.startsWith(\"#EXT-X-TARGETDURATION:\") || trimmed.startsWith(\"#EXT-X-PLAYLIST-TYPE:\") || trimmed.startsWith(\"#EXT-X-INDEPENDENT-SEGMENTS\")) continue;\n\t\tconst mapAttrs = matchTag(trimmed, \"EXT-X-MAP\");\n\t\tif (mapAttrs) {\n\t\t\tconst uri = mapAttrs.get(\"URI\");\n\t\t\tif (uri) {\n\t\t\t\tinitSegmentUrl = resolveUrl(uri, baseUrl);\n\t\t\t\tconst byteRangeStr = mapAttrs.get(\"BYTERANGE\");\n\t\t\t\tif (byteRangeStr) initSegmentByteRange = parseByteRange(byteRangeStr, 0) ?? void 0;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXTINF:\")) {\n\t\t\tcurrentDuration = parseExtInfDuration(trimmed.slice(8));\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed.startsWith(\"#EXT-X-BYTERANGE:\")) {\n\t\t\tcurrentByteRange = parseByteRange(trimmed.slice(17), previousByteRangeEnd) ?? void 0;\n\t\t\tcontinue;\n\t\t}\n\t\tif (trimmed === \"#EXT-X-ENDLIST\") continue;\n\t\tif (!trimmed.startsWith(\"#\") && currentDuration > 0) {\n\t\t\tconst segment = {\n\t\t\t\tid: `segment-${segmentIndex}`,\n\t\t\t\turl: resolveUrl(trimmed, baseUrl),\n\t\t\t\tduration: currentDuration,\n\t\t\t\tstartTime: currentTime\n\t\t\t};\n\t\t\tif (currentByteRange) {\n\t\t\t\tsegment.byteRange = currentByteRange;\n\t\t\t\tpreviousByteRangeEnd = currentByteRange.end + 1;\n\t\t\t} else previousByteRangeEnd = void 0;\n\t\t\tsegments.push(segment);\n\t\t\tcurrentTime += currentDuration;\n\t\t\tsegmentIndex++;\n\t\t\tcurrentDuration = 0;\n\t\t\tcurrentByteRange = void 0;\n\t\t}\n\t}\n\tconst totalDuration = currentTime;\n\tconst initialization = unresolved.type === \"text\" && !initSegmentUrl ? void 0 : initSegmentUrl ? {\n\t\turl: initSegmentUrl,\n\t\t...initSegmentByteRange ? { byteRange: initSegmentByteRange } : {}\n\t} : { url: \"\" };\n\treturn {\n\t\t...unresolved,\n\t\tstartTime: 0,\n\t\tduration: totalDuration,\n\t\tsegments,\n\t\tinitialization\n\t};\n}\n//#endregion\nexport { parseMediaPlaylist };\n\n//# sourceMappingURL=parse-media-playlist.js.map","import { effect } from \"../signals/effect.js\";\nimport { isResolvedTrack } from \"../types/index.js\";\nimport { getSelectedTrack } from \"../utils/track-selection.js\";\nimport { fetchResolvable, getResponseText } from \"../../dom/network/fetch.js\";\nimport { ConcurrentRunner, Task } from \"../task.js\";\nimport { parseMediaPlaylist } from \"../hls/parse-media-playlist.js\";\n//#region src/core/features/resolve-track.ts\nfunction canResolve(state, config) {\n\tconst track = getSelectedTrack(state, config.type);\n\tif (!track) return false;\n\treturn !isResolvedTrack(track);\n}\n/**\n* Updates a track within a presentation (immutably).\n* Generic - works for video, audio, or text tracks.\n*/\nfunction updateTrackInPresentation(presentation, resolvedTrack) {\n\tconst trackId = resolvedTrack.id;\n\treturn {\n\t\t...presentation,\n\t\tselectionSets: presentation.selectionSets.map((selectionSet) => ({\n\t\t\t...selectionSet,\n\t\t\tswitchingSets: selectionSet.switchingSets.map((switchingSet) => ({\n\t\t\t\t...switchingSet,\n\t\t\t\ttracks: switchingSet.tracks.map((track) => track.id === trackId ? resolvedTrack : track)\n\t\t\t}))\n\t\t}))\n\t};\n}\n/**\n* Resolves unresolved tracks using reactive composition.\n*\n* Reacts to state changes and schedules fetch tasks via ConcurrentRunner when\n* a selected track is unresolved. The ConcurrentRunner handles deduplication,\n* parallel execution, and cleanup.\n*\n* Generic version that works for video, audio, or text tracks based on config.\n* Type parameter T is inferred from config.type (use 'as const' for inference).\n*/\nfunction resolveTrack({ state }, config) {\n\tconst runner = new ConcurrentRunner();\n\tconst cleanup = effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canResolve(currentState, config)) return;\n\t\tconst track = getSelectedTrack(currentState, config.type);\n\t\tif (!track) return;\n\t\tconst resolvedTrack = track;\n\t\trunner.schedule(new Task(async (signal) => {\n\t\t\tconst mediaTrack = parseMediaPlaylist(await getResponseText(await fetchResolvable(resolvedTrack, { signal })), resolvedTrack);\n\t\t\tconst latest = state.get();\n\t\t\tconst updatedPresentation = updateTrackInPresentation(latest.presentation, mediaTrack);\n\t\t\tstate.set({\n\t\t\t\t...latest,\n\t\t\t\tpresentation: updatedPresentation\n\t\t\t});\n\t\t}, { id: track.id }));\n\t});\n\treturn () => {\n\t\trunner.abortAll();\n\t\tcleanup();\n\t};\n}\n//#endregion\nexport { resolveTrack };\n\n//# sourceMappingURL=resolve-track.js.map","import { effect } from \"../signals/effect.js\";\nimport { update } from \"../signals/primitives.js\";\nimport { SelectedTrackIdKeyByType } from \"../utils/track-selection.js\";\n//#region src/core/features/select-tracks.ts\n/**\n* Pick text track to activate.\n*\n* Selection priority (if enabled):\n* 1. User preference (preferredSubtitleLanguage)\n* 2. DEFAULT track (if enableDefaultTrack is true and track has DEFAULT=YES + AUTOSELECT=YES)\n* 3. No auto-selection (user opt-in)\n*\n* By default, FORCED tracks are excluded per Apple's HLS spec.\n*\n* @param presentation - Presentation with text tracks\n* @param config - Selection configuration\n* @returns Track ID or undefined (no auto-selection)\n*/\nfunction pickTextTrack(presentation, config) {\n\tconst textSet = presentation.selectionSets.find((set) => set.type === \"text\");\n\tif (!textSet?.switchingSets?.[0]?.tracks.length) return void 0;\n\tconst tracks = textSet.switchingSets[0].tracks;\n\tconst availableTracks = config.includeForcedTracks ? tracks : tracks.filter((track) => !track.forced);\n\tif (availableTracks.length === 0) return void 0;\n\tconst { preferredSubtitleLanguage, enableDefaultTrack = false } = config;\n\tif (preferredSubtitleLanguage) {\n\t\tconst languageMatch = availableTracks.find((track) => track.language === preferredSubtitleLanguage);\n\t\tif (languageMatch) return languageMatch.id;\n\t}\n\tif (enableDefaultTrack) {\n\t\tconst defaultTrack = availableTracks.find((track) => track.default === true);\n\t\tif (defaultTrack) return defaultTrack.id;\n\t}\n}\n/**\n* Check if we can select a track of the given type.\n*\n* Returns true when:\n* - Presentation exists\n* - Has tracks of the specified type\n*\n* Generic over track type - works for video, audio, or text.\n*/\nfunction canSelectTrack(state, config) {\n\treturn !!state?.presentation?.selectionSets?.find(({ type }) => type === config.type)?.switchingSets?.[0]?.tracks.length;\n}\n/**\n* Check if we should select a track of the given type.\n*\n* Returns true when:\n* - Track of this type is not already selected\n*\n* Generic over track type - works for video, audio, or text.\n*\n* @TODO figure out reactive model for ABR cases - right now we're only selecting\n* if we have nothing selected (CJP)\n*/\nfunction shouldSelectTrack(state, config) {\n\treturn !state[SelectedTrackIdKeyByType[config.type]];\n}\n/**\n* Select video track orchestration.\n*\n* Selects video track when:\n* - Presentation exists\n* - No video track is selected yet\n*\n* Uses bandwidth-based quality selection algorithm.\n*\n* @example\n* const cleanup = selectVideoTrack(\n* { state, owners, events },\n* { initialBandwidth: 2_000_000 }\n* );\n*/\nfunction selectVideoTrack({ state }, config = { type: \"video\" }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config)) return;\n\t\tconst selectedTrackId = currentState.presentation?.selectionSets.find(({ type }) => type === config.type)?.switchingSets[0]?.tracks[0]?.id;\n\t\tif (selectedTrackId) update(state, { [SelectedTrackIdKeyByType[config.type]]: selectedTrackId });\n\t});\n}\n/**\n* Select audio track orchestration.\n*\n* Selects audio track when:\n* - Presentation exists\n* - No audio track is selected yet\n*\n* Uses language and preference-based selection.\n*\n* @example\n* const cleanup = selectAudioTrack(\n* { state, owners, events },\n* { preferredAudioLanguage: 'en' }\n* );\n*/\nfunction selectAudioTrack({ state }, config = { type: \"audio\" }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config)) return;\n\t\tconst selectedTrackId = currentState.presentation?.selectionSets.find(({ type }) => type === \"audio\")?.switchingSets[0]?.tracks[0]?.id;\n\t\tif (selectedTrackId) update(state, { selectedAudioTrackId: selectedTrackId });\n\t});\n}\n/**\n* Select text track orchestration.\n*\n* Selects text track when:\n* - Presentation exists\n* - No text track is selected yet\n*\n* Note: Currently does not auto-select (user opt-in).\n*\n* @example\n* const cleanup = selectTextTrack({ state, owners, events }, {});\n*/\nfunction selectTextTrack({ state }, config = { type: \"text\" }) {\n\treturn effect(() => {\n\t\tconst currentState = state.get();\n\t\tif (!canSelectTrack(currentState, config) || !shouldSelectTrack(currentState, config)) return;\n\t\tconst selectedTextTrackId = pickTextTrack(currentState.presentation, config);\n\t\tif (selectedTextTrackId) update(state, { selectedTextTrackId });\n\t});\n}\n//#endregion\nexport { selectAudioTrack, selectTextTrack, selectVideoTrack };\n\n//# sourceMappingURL=select-tracks.js.map","import { effect } from \"../signals/effect.js\";\nimport { computed, update } from \"../signals/primitives.js\";\n//#region src/core/features/sync-preload-attribute.ts\n/**\n* Syncs preload attribute from mediaElement to state.\n*\n* Watches the owners signal for mediaElement changes and copies the\n* preload attribute to state when no explicit value has been set.\n* An explicit value (set via SpfMedia.preload) always wins.\n*\n* @example\n* const cleanup = syncPreloadAttribute({ state, owners });\n*/\nfunction syncPreloadAttribute({ state, owners }) {\n\tconst mediaElement = computed(() => owners.get().mediaElement);\n\treturn effect(() => {\n\t\tif (state.get().preload !== void 0) return;\n\t\tconst preload = mediaElement.get()?.preload || void 0;\n\t\tif (preload === void 0) return;\n\t\tupdate(state, { preload });\n\t});\n}\n//#endregion\nexport { syncPreloadAttribute };\n\n//# sourceMappingURL=sync-preload-attribute.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { computed } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { getSelectedTrack } from \"../../core/utils/track-selection.js\";\n//#region src/dom/features/end-of-stream.ts\n/**\n* Check if the last segment of a track has been appended to a SourceBuffer.\n*\n* Checks by segment ID rather than a pipeline flag, so it is robust across\n* quality switches (different tracks have different segment IDs) and\n* back-buffer flushes (flushed segment IDs are removed from the model).\n*/\nfunction isLastSegmentAppended(segments, actor) {\n\tif (segments.length === 0) return true;\n\tconst lastSeg = segments[segments.length - 1];\n\tif (!lastSeg) return false;\n\treturn actor?.snapshot.get().context.segments.some((s) => s.id === lastSeg.id && !s.partial) ?? false;\n}\n/**\n* Check if the last segment has been appended for each selected track.\n*\n* Handles video-only, audio-only, and video+audio scenarios.\n* A track with no segments (e.g. unresolved) is considered not ready.\n*/\nfunction hasLastSegmentLoaded(state, owners) {\n\tconst videoTrack = state.selectedVideoTrackId ? getSelectedTrack(state, \"video\") : void 0;\n\tconst audioTrack = state.selectedAudioTrackId ? getSelectedTrack(state, \"audio\") : void 0;\n\tif (videoTrack && !isResolvedTrack(videoTrack)) return false;\n\tif (audioTrack && !isResolvedTrack(audioTrack)) return false;\n\tif (videoTrack && isResolvedTrack(videoTrack)) {\n\t\tif (!isLastSegmentAppended(videoTrack.segments, owners.videoBufferActor)) return false;\n\t}\n\tif (audioTrack && isResolvedTrack(audioTrack)) {\n\t\tif (!isLastSegmentAppended(audioTrack.segments, owners.audioBufferActor)) return false;\n\t}\n\treturn true;\n}\n/**\n* Check if we can call endOfStream.\n*/\nfunction canEndStream(state, owners) {\n\treturn !!(owners.mediaSource && state.presentation);\n}\n/**\n* Check if we should call endOfStream.\n*/\nfunction shouldEndStream(state, owners) {\n\tif (!canEndStream(state, owners)) return false;\n\tconst { mediaElement } = owners;\n\tif ((owners.mediaSourceReadyState?.get() ?? owners.mediaSource?.readyState) !== \"open\") return false;\n\tif (mediaElement && mediaElement.readyState < HTMLMediaElement.HAVE_METADATA) return false;\n\tconst hasVideoTrack = !!state.selectedVideoTrackId;\n\tconst hasAudioTrack = !!state.selectedAudioTrackId;\n\tif (hasVideoTrack && !owners.videoBuffer) return false;\n\tif (hasAudioTrack && !owners.audioBuffer) return false;\n\tif (owners.videoBufferActor?.snapshot.get().value === \"updating\") return false;\n\tif (owners.audioBufferActor?.snapshot.get().value === \"updating\") return false;\n\tif (!hasLastSegmentLoaded(state, owners)) return false;\n\tif (mediaElement) {\n\t\tconst videoTrack = hasVideoTrack ? getSelectedTrack(state, \"video\") : void 0;\n\t\tconst audioTrack = hasAudioTrack ? getSelectedTrack(state, \"audio\") : void 0;\n\t\tconst refTrack = videoTrack && isResolvedTrack(videoTrack) ? videoTrack : audioTrack && isResolvedTrack(audioTrack) ? audioTrack : void 0;\n\t\tif (refTrack && refTrack.segments.length > 0) {\n\t\t\tconst lastSeg = refTrack.segments[refTrack.segments.length - 1];\n\t\t\tif (mediaElement.currentTime < lastSeg.startTime) return false;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n* Wait for all currently-updating SourceBufferActors to finish.\n* Uses actor state rather than raw SourceBuffer.updating so the wait is\n* aligned with the same abstraction that owns all buffer operations.\n*/\nfunction waitForSourceBuffersReady(owners) {\n\tconst updatingActors = [owners.videoBufferActor, owners.audioBufferActor].filter((actor) => actor !== void 0 && actor.snapshot.get().value === \"updating\");\n\tif (updatingActors.length === 0) return Promise.resolve();\n\treturn Promise.all(updatingActors.map((actor) => new Promise((resolve) => {\n\t\tlet cleanup;\n\t\tlet resolved = false;\n\t\tcleanup = effect(() => {\n\t\t\tif (actor.snapshot.get().value !== \"updating\") {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true;\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t\tqueueMicrotask(() => cleanup?.());\n\t\t\t}\n\t\t});\n\t}))).then(() => void 0);\n}\n/**\n* Get the highest buffered end time across all active SourceBuffers.\n* Used to set the final duration from actual container timestamps rather\n* than playlist metadata, which handles both shorter and longer cases.\n*/\nfunction getMaxBufferedEnd(owners) {\n\tlet max = 0;\n\tfor (const buf of [owners.videoBuffer, owners.audioBuffer]) if (buf && buf.buffered.length > 0) {\n\t\tconst end = buf.buffered.end(buf.buffered.length - 1);\n\t\tif (end > max) max = end;\n\t}\n\treturn max;\n}\n/**\n* End of stream task (module-level, pure).\n* Sets the final duration from actual buffered end time, then calls endOfStream().\n*/\nconst endOfStreamTask = async ({ currentOwners }, _context) => {\n\tconst { mediaSource } = currentOwners;\n\tif (mediaSource.readyState === \"ended\") return;\n\tawait waitForSourceBuffersReady(currentOwners);\n\tif (mediaSource.readyState !== \"open\") return;\n\tconst bufferedEnd = getMaxBufferedEnd(currentOwners);\n\tif (bufferedEnd > 0) mediaSource.duration = bufferedEnd;\n\tmediaSource.endOfStream();\n\tawait new Promise((resolve) => requestAnimationFrame(resolve));\n};\n/**\n* Call endOfStream when the last segment has been appended.\n* This signals to the browser that the stream is complete.\n*\n* Per the MSE spec, appendBuffer() remains valid after endOfStream() —\n* seeks that require re-appending earlier segments will still work.\n* What becomes blocked is calling endOfStream() again, addSourceBuffer(),\n* and MediaSource.duration updates.\n*/\nfunction endOfStream({ state, owners }) {\n\tconst shouldEnd = computed(() => shouldEndStream(state.get(), owners.get()));\n\tlet hasEnded = false;\n\treturn effect(() => {\n\t\tif (!shouldEnd.get()) return;\n\t\tconst currentOwners = owners.get();\n\t\tif (hasEnded) {\n\t\t\tif ((currentOwners.mediaSourceReadyState?.get() ?? currentOwners.mediaSource?.readyState) !== \"open\") return;\n\t\t\thasEnded = false;\n\t\t}\n\t\thasEnded = true;\n\t\tendOfStreamTask({ currentOwners }, {}).catch((error) => console.error(\"Failed to call endOfStream:\", error));\n\t});\n}\n//#endregion\nexport { endOfStream };\n\n//# sourceMappingURL=end-of-stream.js.map","import { signal } from \"../../core/signals/primitives.js\";\n//#region src/dom/media/mediasource-setup.ts\n/**\n* MediaSource Setup\n*\n* Utilities for creating and configuring MediaSource/ManagedMediaSource\n* for MSE (Media Source Extensions) playback.\n*\n* Global ManagedMediaSource types are defined in ./mediasource.d.ts\n*/\n/**\n* Check if MediaSource API is supported.\n*/\nfunction supportsMediaSource() {\n\treturn typeof MediaSource !== \"undefined\";\n}\n/**\n* Check if ManagedMediaSource API is supported.\n* ManagedMediaSource is a newer Safari API with better lifecycle management.\n*/\nfunction supportsManagedMediaSource() {\n\treturn typeof ManagedMediaSource !== \"undefined\";\n}\n/**\n* Create a MediaSource or ManagedMediaSource instance.\n*\n* @param options - Creation options\n* @returns A MediaSource or ManagedMediaSource instance\n* @throws Error if no MediaSource API is available\n*\n* @example\n* const mediaSource = createMediaSource();\n* const mediaElement = document.querySelector('video');\n* attachMediaSource(mediaSource, mediaElement);\n*/\nfunction createMediaSource(options = {}) {\n\tconst { preferManaged = false } = options;\n\tif (preferManaged && supportsManagedMediaSource()) return new ManagedMediaSource();\n\tif (supportsMediaSource()) return new MediaSource();\n\tthrow new Error(\"MediaSource API is not supported\");\n}\n/**\n* Attach a MediaSource to an HTMLMediaElement.\n*\n* Uses srcObject for ManagedMediaSource (Safari), or createObjectURL for regular MediaSource.\n*\n* @param mediaSource - The MediaSource to attach\n* @param mediaElement - The media element to attach to\n* @returns Object with URL and detach function\n*\n* @example\n* const mediaSource = createMediaSource();\n* const { detach } = attachMediaSource(mediaSource, videoElement);\n* // Use mediaSource...\n* // Later, to clean up:\n* detach();\n*/\nfunction attachMediaSource(mediaSource, mediaElement) {\n\tif (supportsManagedMediaSource() && mediaSource instanceof ManagedMediaSource) {\n\t\tmediaElement.disableRemotePlayback = true;\n\t\tmediaElement.srcObject = mediaSource;\n\t\tconst detach = () => {\n\t\t\tmediaElement.srcObject = null;\n\t\t\tmediaElement.load();\n\t\t};\n\t\treturn {\n\t\t\turl: \"\",\n\t\t\tdetach\n\t\t};\n\t}\n\tconst url = URL.createObjectURL(mediaSource);\n\tmediaElement.src = url;\n\tconst detach = () => {\n\t\tmediaElement.removeAttribute(\"src\");\n\t\tmediaElement.load();\n\t\tURL.revokeObjectURL(url);\n\t};\n\treturn {\n\t\turl,\n\t\tdetach\n\t};\n}\n/**\n* Create a SourceBuffer on a MediaSource.\n*\n* @param mediaSource - The MediaSource (must be in 'open' state)\n* @param mimeCodec - MIME type with codecs (e.g., 'video/mp4; codecs=\"avc1.42E01E\"')\n* @returns The created SourceBuffer\n* @throws Error if MediaSource is not open or codec is unsupported\n*\n* @example\n* const buffer = createSourceBuffer(mediaSource, 'video/mp4; codecs=\"avc1.42E01E\"');\n*/\nfunction createSourceBuffer(mediaSource, mimeCodec) {\n\tif (mediaSource.readyState !== \"open\") throw new Error(\"MediaSource is not open\");\n\tif (!isCodecSupported(mimeCodec)) throw new Error(`Codec not supported: ${mimeCodec}`);\n\treturn mediaSource.addSourceBuffer(mimeCodec);\n}\n/**\n* Check if a codec is supported.\n*\n* @param mimeCodec - MIME type with codecs string\n* @returns True if the codec is supported\n*\n* @example\n* if (isCodecSupported('video/mp4; codecs=\"avc1.42E01E\"')) {\n* // Create source buffer\n* }\n*/\nfunction isCodecSupported(mimeCodec) {\n\tif (!supportsMediaSource()) return false;\n\treturn MediaSource.isTypeSupported(mimeCodec);\n}\n/**\n* Create a reactive signal that mirrors `mediaSource.readyState`.\n*\n* Listens to `sourceopen`, `sourceended`, and `sourceclose` events and updates\n* the signal accordingly, making readyState visible to the TC39 signal graph.\n* Listeners are automatically removed when `signal` is aborted.\n*\n* @param mediaSource - The MediaSource to observe\n* @param signal - AbortSignal that controls listener lifetime\n* @returns A `Signal.ReadonlyState` that reflects the current `readyState`\n*\n* @example\n* const controller = new AbortController();\n* const readyState = observeMediaSourceReadyState(mediaSource, controller.signal);\n* effect(() => {\n* if (readyState.get() === 'open') { ... }\n* });\n* // Later:\n* controller.abort();\n*/\nfunction observeMediaSourceReadyState(mediaSource, abortSignal) {\n\tconst readyState = signal(mediaSource.readyState);\n\tconst update = () => readyState.set(mediaSource.readyState);\n\tconst options = { signal: abortSignal };\n\tmediaSource.addEventListener(\"sourceopen\", update, options);\n\tmediaSource.addEventListener(\"sourceended\", update, options);\n\tmediaSource.addEventListener(\"sourceclose\", update, options);\n\treturn readyState;\n}\n//#endregion\nexport { attachMediaSource, createMediaSource, createSourceBuffer, observeMediaSourceReadyState };\n\n//# sourceMappingURL=mediasource-setup.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { computed } from \"../../core/signals/primitives.js\";\nimport { attachMediaSource, createMediaSource, observeMediaSourceReadyState } from \"../media/mediasource-setup.js\";\n//#region src/dom/features/setup-mediasource.ts\n/**\n* Setup MediaSource orchestration.\n*\n* Creates and attaches MediaSource when:\n* - mediaElement exists in owners\n* - presentation.url exists in state\n*\n* Updates owners.mediaSource after successful setup.\n*/\nfunction setupMediaSource({ state, owners }) {\n\tconst abortController = new AbortController();\n\tconst mediaElementSignal = computed(() => owners.get().mediaElement);\n\tconst presentationUrlSignal = computed(() => state.get().presentation?.url);\n\tconst canSetupSignal = computed(() => !!mediaElementSignal.get() && !!presentationUrlSignal.get());\n\tconst mediaElementSrcSignal = computed(() => mediaElementSignal.get()?.src);\n\tconst mediaSourceSignal = computed(() => owners.get().mediaSource);\n\tconst shouldSetupSignal = computed(() => !mediaElementSrcSignal.get());\n\tconst cleanupEffect = effect(() => {\n\t\tif (!canSetupSignal.get() || !shouldSetupSignal.get()) return;\n\t\tconst mediaElement = mediaElementSignal.get();\n\t\tconst { signal } = abortController;\n\t\tconst mediaSource = createMediaSource({ preferManaged: true });\n\t\tconst mediaSourceReadyState = observeMediaSourceReadyState(mediaSource, signal);\n\t\tattachMediaSource(mediaSource, mediaElement);\n\t\tconst cleanupOwnersUpdateEffect = effect(() => {\n\t\t\tif (!!mediaSourceSignal.get() || mediaSourceReadyState.get() !== \"open\") return;\n\t\t\towners.set(Object.assign({}, owners.get(), {\n\t\t\t\tmediaSource,\n\t\t\t\tmediaSourceReadyState\n\t\t\t}));\n\t\t});\n\t\treturn () => {\n\t\t\tcleanupOwnersUpdateEffect();\n\t\t};\n\t});\n\treturn () => {\n\t\tabortController?.abort();\n\t\tcleanupEffect();\n\t};\n}\n//#endregion\nexport { setupMediaSource };\n\n//# sourceMappingURL=setup-mediasource.js.map","import { createMachineActor } from \"../../core/create-machine-actor.js\";\nimport { SerialRunner, Task } from \"../../core/task.js\";\nimport { appendSegment } from \"./append-segment.js\";\nimport { flushBuffer } from \"./buffer-flusher.js\";\n//#region src/dom/media/source-buffer-actor.ts\nfunction snapshotBuffered(buffered) {\n\tconst ranges = [];\n\tfor (let i = 0; i < buffered.length; i++) ranges.push({\n\t\tstart: buffered.start(i),\n\t\tend: buffered.end(i)\n\t});\n\treturn ranges;\n}\nfunction appendInitTask(message, { getContext, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait appendSegment(sourceBuffer, message.data);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tinitTrackId: message.meta.trackId\n\t\t};\n\t});\n}\nfunction appendSegmentTask(message, { getContext, sourceBuffer, setContext }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tconst { meta } = message;\n\t\tconst EPSILON = 1e-4;\n\t\tconst filtered = ctx.segments.filter((s) => Math.abs(s.startTime - meta.startTime) >= EPSILON);\n\t\tif (!(message.data instanceof ArrayBuffer)) setContext({\n\t\t\t...ctx,\n\t\t\tsegments: [...filtered, {\n\t\t\t\tid: meta.id,\n\t\t\t\tstartTime: meta.startTime,\n\t\t\t\tduration: meta.duration,\n\t\t\t\ttrackId: meta.trackId,\n\t\t\t\t...meta.trackBandwidth !== void 0 && { trackBandwidth: meta.trackBandwidth },\n\t\t\t\tpartial: true\n\t\t\t}],\n\t\t\tbufferedRanges: ctx.bufferedRanges\n\t\t});\n\t\tawait appendSegment(sourceBuffer, message.data, taskSignal);\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: [...filtered, {\n\t\t\t\tid: meta.id,\n\t\t\t\tstartTime: meta.startTime,\n\t\t\t\tduration: meta.duration,\n\t\t\t\ttrackId: meta.trackId,\n\t\t\t\t...meta.trackBandwidth !== void 0 && { trackBandwidth: meta.trackBandwidth }\n\t\t\t}],\n\t\t\tbufferedRanges: snapshotBuffered(sourceBuffer.buffered)\n\t\t};\n\t});\n}\nfunction removeTask(message, { getContext, sourceBuffer }) {\n\treturn new Task(async (taskSignal) => {\n\t\tconst ctx = getContext();\n\t\tif (taskSignal.aborted) return ctx;\n\t\tawait flushBuffer(sourceBuffer, message.start, message.end);\n\t\tconst bufferedRanges = snapshotBuffered(sourceBuffer.buffered);\n\t\tconst filtered = ctx.segments.filter((s) => {\n\t\t\tconst midpoint = s.startTime + s.duration / 2;\n\t\t\treturn bufferedRanges.some((r) => midpoint >= r.start && midpoint < r.end);\n\t\t});\n\t\treturn {\n\t\t\t...ctx,\n\t\t\tsegments: filtered,\n\t\t\tbufferedRanges\n\t\t};\n\t});\n}\nconst messageTaskFactories = {\n\t\"append-init\": appendInitTask,\n\t\"append-segment\": appendSegmentTask,\n\tremove: removeTask\n};\nfunction messageToTask(message, options) {\n\tconst factory = messageTaskFactories[message.type];\n\treturn factory(message, options);\n}\nfunction createSourceBufferActor(sourceBuffer, initialContext) {\n\tconst handleError = (e) => {\n\t\tif (!(e instanceof Error && e.name === \"AbortError\")) console.error(\"SourceBuffer operation failed:\", e);\n\t};\n\tconst onMessage = (msg, { transition, setContext, getContext, runner }) => {\n\t\ttransition(\"updating\");\n\t\tconst task = messageToTask(msg, {\n\t\t\tgetContext,\n\t\t\tsourceBuffer,\n\t\t\tsetContext\n\t\t});\n\t\trunner.schedule(task).then(setContext, handleError);\n\t};\n\treturn createMachineActor({\n\t\trunner: () => new SerialRunner(),\n\t\tinitial: \"idle\",\n\t\tcontext: {\n\t\t\tsegments: [],\n\t\t\tbufferedRanges: [],\n\t\t\tinitTrackId: void 0,\n\t\t\t...initialContext\n\t\t},\n\t\tstates: {\n\t\t\tidle: { on: {\n\t\t\t\t\"append-init\": onMessage,\n\t\t\t\t\"append-segment\": onMessage,\n\t\t\t\tremove: onMessage,\n\t\t\t\tbatch: (msg, { transition, setContext, getContext, runner }) => {\n\t\t\t\t\tconst { messages } = msg;\n\t\t\t\t\tif (messages.length === 0) return;\n\t\t\t\t\ttransition(\"updating\");\n\t\t\t\t\tmessages.forEach((msg) => {\n\t\t\t\t\t\tconst task = messageToTask(msg, {\n\t\t\t\t\t\t\tgetContext,\n\t\t\t\t\t\t\tsourceBuffer,\n\t\t\t\t\t\t\tsetContext\n\t\t\t\t\t\t});\n\t\t\t\t\t\trunner.schedule(task).then(setContext, handleError);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} },\n\t\t\tupdating: {\n\t\t\t\tonSettled: \"idle\",\n\t\t\t\ton: { cancel: (_, { runner }) => {\n\t\t\t\t\trunner.abortAll();\n\t\t\t\t} }\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { createSourceBufferActor };\n\n//# sourceMappingURL=source-buffer-actor.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { computed, update } from \"../../core/signals/primitives.js\";\nimport { isResolvedTrack } from \"../../core/types/index.js\";\nimport { BufferKeyByType, getSelectedTrack } from \"../../core/utils/track-selection.js\";\nimport { createSourceBuffer } from \"../media/mediasource-setup.js\";\nimport { createSourceBufferActor } from \"../media/source-buffer-actor.js\";\n//#region src/dom/features/setup-sourcebuffer.ts\nconst ActorKeyByType = {\n\tvideo: \"videoBufferActor\",\n\taudio: \"audioBufferActor\"\n};\n/**\n* Build MIME codec string from track metadata.\n*\n* @param track - Resolved track with mimeType and codecs\n* @returns MIME codec string (e.g., 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"')\n*\n* @example\n* buildMimeCodec({ mimeType: 'video/mp4', codecs: ['avc1.42E01E'] })\n* // => 'video/mp4; codecs=\"avc1.42E01E\"'\n*/\nfunction buildMimeCodec(track) {\n\tconst codecString = track.codecs?.join(\",\") ?? \"\";\n\treturn `${track.mimeType}; codecs=\"${codecString}\"`;\n}\n/**\n* Setup all needed SourceBuffers as a single coordinated operation.\n*\n* Waits until ALL media tracks in the presentation are resolved with codecs,\n* then creates every SourceBuffer in one synchronous block before setting\n* owners. This guarantees that downstream consumers (e.g. loadSegments) never\n* see a partial set of SourceBuffers — preventing the Firefox bug where\n* appending to a video SourceBuffer before the audio SourceBuffer exists\n* causes mozHasAudio to be permanently false.\n*\n* Handles video-only, audio-only, and combined presentations correctly:\n* track types are derived from the presentation rather than hardcoded.\n*\n* @example\n* const cleanup = setupSourceBuffers({ state, owners });\n*/\nfunction setupSourceBuffers({ state, owners }) {\n\tconst presentationTypesSignal = computed(() => {\n\t\tconst { presentation } = state.get();\n\t\tif (!presentation || !(\"selectionSets\" in presentation)) return [];\n\t\treturn presentation.selectionSets.map(({ type }) => type).filter((type) => type === \"video\" || type === \"audio\");\n\t});\n\tconst canSetupSignal = computed(() => {\n\t\tconst types = presentationTypesSignal.get();\n\t\tif (!owners.get().mediaSource || types.length === 0) return false;\n\t\tconst s = state.get();\n\t\treturn types.every((type) => {\n\t\t\tconst track = getSelectedTrack(s, type);\n\t\t\treturn track && isResolvedTrack(track) && !!track.codecs?.length;\n\t\t});\n\t});\n\tconst shouldSetupSignal = computed(() => {\n\t\tconst o = owners.get();\n\t\treturn presentationTypesSignal.get().every((type) => !o[BufferKeyByType[type]]);\n\t});\n\treturn effect(() => {\n\t\tif (!canSetupSignal.get() || !shouldSetupSignal.get()) return;\n\t\tconst s = state.get();\n\t\tconst o = owners.get();\n\t\tconst patch = {};\n\t\tfor (const type of presentationTypesSignal.get()) {\n\t\t\tconst track = getSelectedTrack(s, type);\n\t\t\tconst buffer = createSourceBuffer(o.mediaSource, buildMimeCodec(track));\n\t\t\tpatch[BufferKeyByType[type]] = buffer;\n\t\t\tpatch[ActorKeyByType[type]] = createSourceBufferActor(buffer);\n\t\t}\n\t\tupdate(owners, patch);\n\t});\n}\n//#endregion\nexport { setupSourceBuffers };\n\n//# sourceMappingURL=setup-sourcebuffer.js.map","import { computed, untrack, update } from \"../../core/signals/primitives.js\";\nimport { createMachineReactor } from \"../../core/create-machine-reactor.js\";\nimport { listen } from \"@videojs/utils/dom\";\n//#region src/dom/features/sync-text-tracks.ts\nfunction createTrackElement(track) {\n\tconst el = document.createElement(\"track\");\n\tel.id = track.id;\n\tel.kind = track.kind;\n\tel.label = track.label;\n\tel.toggleAttribute(\"data-src-track\", true);\n\tif (track.language) el.srclang = track.language;\n\tif (track.default) el.default = true;\n\treturn el;\n}\nfunction getModelTextTracks(presentation) {\n\treturn presentation?.selectionSets?.find((s) => s.type === \"text\")?.switchingSets[0]?.tracks;\n}\nfunction syncModes(textTracks, selectedId) {\n\tfor (let i = 0; i < textTracks.length; i++) {\n\t\tconst track = textTracks[i];\n\t\tif (track.kind !== \"subtitles\" && track.kind !== \"captions\") continue;\n\t\ttrack.mode = track.id === selectedId ? \"showing\" : \"disabled\";\n\t}\n}\n/**\n* Text track sync orchestration.\n*\n* A single `always` monitor keeps the reactor in sync with preconditions.\n* `'set-up'` owns the full lifecycle of `<track>` elements:\n*\n* - **Effect 1** — creates `<track>` elements on entry; exit cleanup removes\n* them and clears `selectedTextTrackId` on any outbound transition.\n* - **Effect 2** — owns mode sync, the Chromium settling-window guard, and\n* the `'change'` listener that bridges DOM state back to\n* `selectedTextTrackId`.\n*\n* @example\n* const reactor = syncTextTracks({ state, owners });\n* // later:\n* reactor.destroy();\n*/\nfunction syncTextTracks({ state, owners }) {\n\tconst mediaElementSignal = computed(() => owners.get().mediaElement);\n\tconst modelTextTracksSignal = computed(() => getModelTextTracks(state.get().presentation), { equals(prevTextTracks, nextTextTracks) {\n\t\tif (prevTextTracks === nextTextTracks) return true;\n\t\tif (typeof prevTextTracks !== typeof nextTextTracks) return false;\n\t\tif (prevTextTracks?.length !== nextTextTracks?.length) return false;\n\t\treturn !!nextTextTracks && nextTextTracks.every((nextTextTrack) => prevTextTracks?.some((prevTextTrack) => prevTextTrack.id === nextTextTrack.id));\n\t} });\n\tconst selectedTextTrackIdSignal = computed(() => state.get().selectedTextTrackId);\n\tconst preconditionsMetSignal = computed(() => !!mediaElementSignal.get() && !!modelTextTracksSignal.get()?.length);\n\treturn createMachineReactor({\n\t\tinitial: \"preconditions-unmet\",\n\t\tmonitor: () => preconditionsMetSignal.get() ? \"set-up\" : \"preconditions-unmet\",\n\t\tstates: {\n\t\t\t\"preconditions-unmet\": {},\n\t\t\t\"set-up\": {\n\t\t\t\tentry: () => {\n\t\t\t\t\tconst mediaElement = mediaElementSignal.get();\n\t\t\t\t\tmodelTextTracksSignal.get().forEach((track) => mediaElement.appendChild(createTrackElement(track)));\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tmediaElement.querySelectorAll(\"track[data-src-track]:is([kind=\\\"subtitles\\\"],[kind=\\\"captions\\\"]\").forEach((trackEl) => trackEl.remove());\n\t\t\t\t\t\tupdate(state, { selectedTextTrackId: void 0 });\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\teffects: () => {\n\t\t\t\t\tconst mediaElement = untrack(() => mediaElementSignal.get());\n\t\t\t\t\tconst selectedId = selectedTextTrackIdSignal.get();\n\t\t\t\t\tsyncModes(mediaElement.textTracks, selectedId);\n\t\t\t\t\tlet syncTimeout = setTimeout(() => {\n\t\t\t\t\t\tsyncTimeout = void 0;\n\t\t\t\t\t}, 0);\n\t\t\t\t\tconst onChange = () => {\n\t\t\t\t\t\tif (syncTimeout) {\n\t\t\t\t\t\t\tsyncModes(mediaElement.textTracks, untrack(() => selectedTextTrackIdSignal.get()));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst newId = Array.from(mediaElement.textTracks).find((t) => t.mode === \"showing\" && (t.kind === \"subtitles\" || t.kind === \"captions\"))?.id;\n\t\t\t\t\t\tif (newId === untrack(() => selectedTextTrackIdSignal.get())) return;\n\t\t\t\t\t\tupdate(state, { selectedTextTrackId: newId });\n\t\t\t\t\t};\n\t\t\t\t\tconst unlisten = listen(mediaElement.textTracks, \"change\", onChange);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tclearTimeout(syncTimeout ?? void 0);\n\t\t\t\t\t\tunlisten();\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n//#endregion\nexport { syncTextTracks };\n\n//# sourceMappingURL=sync-text-tracks.js.map","import { effect } from \"../../core/signals/effect.js\";\nimport { hasPresentationDuration } from \"../../core/types/index.js\";\n//#region src/dom/features/update-duration.ts\n/**\n* Check if we can update MediaSource duration (have required data).\n*/\nfunction canUpdateDuration(state, owners) {\n\treturn !!(owners.mediaSource && state.presentation && hasPresentationDuration(state.presentation));\n}\n/**\n* Get the maximum buffered end time across all SourceBuffers.\n*/\nfunction getMaxBufferedEnd(owners) {\n\tlet maxEnd = 0;\n\tconst buffers = [owners.videoSourceBuffer, owners.audioSourceBuffer].filter((buf) => buf !== void 0);\n\tfor (const buffer of buffers) {\n\t\tconst { buffered } = buffer;\n\t\tif (buffered.length > 0) {\n\t\t\tconst end = buffered.end(buffered.length - 1);\n\t\t\tif (end > maxEnd) maxEnd = end;\n\t\t}\n\t}\n\treturn maxEnd;\n}\n/**\n* Check if we should update MediaSource duration (conditions met).\n*/\nfunction shouldUpdateDuration(state, owners) {\n\tif (!canUpdateDuration(state, owners)) return false;\n\tconst { mediaSource } = owners;\n\tconst { presentation } = state;\n\tif ((owners.mediaSourceReadyState?.get() ?? owners.mediaSource?.readyState) !== \"open\") return false;\n\tconst duration = presentation.duration;\n\tif (!Number.isFinite(duration) || Number.isNaN(duration) || duration <= 0) return false;\n\treturn Number.isNaN(mediaSource.duration);\n}\n/**\n* Wait for all currently-updating SourceBuffers to finish.\n*\n* The MSE spec forbids setting MediaSource.duration while any attached\n* SourceBuffer has updating === true. This defers until all are idle.\n*/\nfunction waitForSourceBuffersReady(owners) {\n\tconst updating = [owners.videoSourceBuffer, owners.audioSourceBuffer].filter((buf) => buf?.updating === true);\n\tif (updating.length === 0) return Promise.resolve();\n\treturn Promise.all(updating.map((buf) => new Promise((resolve) => buf.addEventListener(\"updateend\", () => resolve(), { once: true })))).then(() => void 0);\n}\n/**\n* Update MediaSource duration when presentation duration becomes available.\n*/\nfunction updateDuration({ state, owners }) {\n\tlet destroyed = false;\n\tlet running = false;\n\tconst cleanupEffect = effect(() => {\n\t\tconst currentState = state.get();\n\t\tconst currentOwners = owners.get();\n\t\tif (!shouldUpdateDuration(currentState, currentOwners) || running) return;\n\t\tconst { mediaSource } = currentOwners;\n\t\trunning = true;\n\t\twaitForSourceBuffersReady(currentOwners).then(() => {\n\t\t\tif (destroyed || mediaSource.readyState !== \"open\") return;\n\t\t\tlet duration = currentState.presentation.duration;\n\t\t\tconst maxBufferedEnd = getMaxBufferedEnd(currentOwners);\n\t\t\tif (maxBufferedEnd > duration) duration = maxBufferedEnd;\n\t\t\tmediaSource.duration = duration;\n\t\t}).finally(() => {\n\t\t\trunning = false;\n\t\t});\n\t});\n\treturn () => {\n\t\tdestroyed = true;\n\t\tcleanupEffect();\n\t};\n}\n//#endregion\nexport { updateDuration };\n\n//# sourceMappingURL=update-duration.js.map","import { signal } from \"../../core/signals/primitives.js\";\nimport { loadSegments } from \"../features/load-segments.js\";\nimport { destroyVttParser } from \"../text/parse-vtt-segment.js\";\nimport { loadTextTrackCues } from \"../features/load-text-track-cues.js\";\nimport { trackCurrentTime } from \"../features/track-current-time.js\";\nimport { trackPlaybackInitiated } from \"../features/track-playback-initiated.js\";\nimport { calculatePresentationDuration } from \"../../core/features/calculate-presentation-duration.js\";\nimport { switchQuality } from \"../../core/features/quality-switching.js\";\nimport { resolvePresentation } from \"../../core/features/resolve-presentation.js\";\nimport { resolveTrack } from \"../../core/features/resolve-track.js\";\nimport { selectAudioTrack, selectTextTrack, selectVideoTrack } from \"../../core/features/select-tracks.js\";\nimport { syncPreloadAttribute } from \"../../core/features/sync-preload-attribute.js\";\nimport { endOfStream } from \"../features/end-of-stream.js\";\nimport { setupMediaSource } from \"../features/setup-mediasource.js\";\nimport { setupSourceBuffers } from \"../features/setup-sourcebuffer.js\";\nimport { syncTextTracks } from \"../features/sync-text-tracks.js\";\nimport { updateDuration } from \"../features/update-duration.js\";\n//#region src/dom/playback-engine/engine.ts\n/**\n* Create a POC playback engine.\n*\n* Wires together all orchestrations to create a reactive playback pipeline:\n* 1. Resolve presentation (multivariant playlist)\n* 2. Select initial video and audio tracks\n* 3. Resolve selected tracks (media playlists)\n* 4. Setup MediaSource\n* 5. Setup SourceBuffers for video and audio\n*\n* Note: This is a POC - does not yet load/append segments.\n*\n* @param config - Playback engine configuration\n* @returns Playback engine instance with state, owners, and destroy function\n*\n* @example\n* const engine = createPlaybackEngine({\n* initialBandwidth: 2_000_000,\n* preferredAudioLanguage: 'en',\n* });\n*\n* // Initialize by setting state and owners\n* engine.owners.set({ ...engine.owners.get(), mediaElement: document.querySelector('video') });\n* engine.state.set({\n* ...engine.state.get(),\n* presentation: { url: 'https://example.com/playlist.m3u8' },\n* preload: 'auto',\n* });\n*\n* // Inspect state\n* console.log(engine.state.get());\n*\n* // Cleanup\n* engine.destroy();\n*/\nfunction createPlaybackEngine(config = {}) {\n\tconst state = signal({ bandwidthState: {\n\t\tfastEstimate: 0,\n\t\tfastTotalWeight: 0,\n\t\tslowEstimate: 0,\n\t\tslowTotalWeight: 0,\n\t\tbytesSampled: 0\n\t} });\n\tconst owners = signal({});\n\tconst cleanups = [\n\t\tsyncPreloadAttribute({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\ttrackPlaybackInitiated({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tresolvePresentation({ state }),\n\t\tselectVideoTrack({ state }, {\n\t\t\ttype: \"video\",\n\t\t\t...config.initialBandwidth !== void 0 && { initialBandwidth: config.initialBandwidth }\n\t\t}),\n\t\tselectAudioTrack({ state }, {\n\t\t\ttype: \"audio\",\n\t\t\t...config.preferredAudioLanguage !== void 0 && { preferredAudioLanguage: config.preferredAudioLanguage }\n\t\t}),\n\t\tselectTextTrack({ state }, {\n\t\t\ttype: \"text\",\n\t\t\t...config.preferredSubtitleLanguage !== void 0 && { preferredSubtitleLanguage: config.preferredSubtitleLanguage },\n\t\t\t...config.includeForcedTracks !== void 0 && { includeForcedTracks: config.includeForcedTracks },\n\t\t\t...config.enableDefaultTrack !== void 0 && { enableDefaultTrack: config.enableDefaultTrack }\n\t\t}),\n\t\tresolveTrack({ state }, { type: \"video\" }),\n\t\tresolveTrack({ state }, { type: \"audio\" }),\n\t\tresolveTrack({ state }, { type: \"text\" }),\n\t\tcalculatePresentationDuration({ state }),\n\t\tsetupMediaSource({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tupdateDuration({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsetupSourceBuffers({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\ttrackCurrentTime({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tswitchQuality({ state }, config.initialBandwidth !== void 0 ? { defaultBandwidth: config.initialBandwidth } : {}),\n\t\tloadSegments({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"video\" }),\n\t\tloadSegments({\n\t\t\tstate,\n\t\t\towners\n\t\t}, { type: \"audio\" }),\n\t\tendOfStream({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tsyncTextTracks({\n\t\t\tstate,\n\t\t\towners\n\t\t}),\n\t\tloadTextTrackCues({\n\t\t\tstate,\n\t\t\towners\n\t\t})\n\t];\n\treturn {\n\t\tstate,\n\t\towners,\n\t\tdestroy: () => {\n\t\t\tcleanups.forEach((cleanup) => typeof cleanup === \"function\" ? cleanup() : cleanup.destroy());\n\t\t\tfor (const value of Object.values(owners.get())) if (value !== null && typeof value === \"object\" && typeof value.destroy === \"function\") value.destroy();\n\t\t\tdestroyVttParser();\n\t\t}\n\t};\n}\n//#endregion\nexport { createPlaybackEngine };\n\n//# sourceMappingURL=engine.js.map","import { update } from \"../../core/signals/primitives.js\";\nimport { createPlaybackEngine } from \"./engine.js\";\n//#region src/dom/playback-engine/adapter.ts\n/**\n* Mixin that adds SPF playback engine behavior to any base class.\n*\n* Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n* be used anywhere a media element API is expected.\n*\n* A new engine is created on every src assignment — this fully tears down all\n* state, SourceBuffers, and in-flight requests from the previous source before\n* the next one begins. The media element reference is preserved across src\n* changes and re-applied to the new engine automatically.\n*\n* @example\n* class SimpleHlsMedia extends SpfMediaMixin(HTMLVideoElementHost) {}\n*\n* const media = new SimpleHlsMedia();\n* media.attach(document.querySelector('video'));\n* media.src = 'https://stream.mux.com/abc123.m3u8';\n*/\nfunction SpfMediaMixin(BaseClass) {\n\tclass SpfMediaImpl extends BaseClass {\n\t\t#engine;\n\t\t#config;\n\t\t#preload = \"\";\n\t\t/** Pending loadstart listener from a deferred play() retry, if any. */\n\t\t#loadstartListener = null;\n\t\tconstructor(...args) {\n\t\t\tsuper(...args);\n\t\t\tconst { config } = args?.[0] ?? {};\n\t\t\tthis.#config = config;\n\t\t\tthis.#engine = createPlaybackEngine(config);\n\t\t}\n\t\tget engine() {\n\t\t\treturn this.#engine;\n\t\t}\n\t\tattach(mediaElement) {\n\t\t\tsuper.attach?.(mediaElement);\n\t\t\tupdate(this.#engine.owners, { mediaElement });\n\t\t}\n\t\tdetach() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tupdate(this.#engine.owners, { mediaElement: void 0 });\n\t\t\tsuper.detach?.();\n\t\t}\n\t\tdestroy() {\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#engine.destroy();\n\t\t}\n\t\tget preload() {\n\t\t\treturn this.#preload;\n\t\t}\n\t\tset preload(value) {\n\t\t\tthis.#preload = value;\n\t\t\tif (value) update(this.#engine.state, { preload: value });\n\t\t}\n\t\tget src() {\n\t\t\treturn this.#engine.state.get().presentation?.url ?? \"\";\n\t\t}\n\t\tset src(value) {\n\t\t\tconst prevMediaElement = this.#engine.owners.get().mediaElement;\n\t\t\tthis.#cancelPendingPlay();\n\t\t\tthis.#engine.destroy();\n\t\t\tthis.#engine = createPlaybackEngine(this.#config);\n\t\t\tif (this.#preload) update(this.#engine.state, { preload: this.#preload });\n\t\t\tif (prevMediaElement) update(this.#engine.owners, { mediaElement: prevMediaElement });\n\t\t\tif (value) update(this.#engine.state, { presentation: { url: value } });\n\t\t}\n\t\tplay() {\n\t\t\tconst { mediaElement } = this.#engine.owners.get();\n\t\t\tif (!mediaElement) return Promise.reject(/* @__PURE__ */ new Error(\"SpfMedia: no media element attached\"));\n\t\t\tupdate(this.#engine.state, { playbackInitiated: true });\n\t\t\treturn mediaElement.play().catch((err) => {\n\t\t\t\tif (this.src) return new Promise((resolve, reject) => {\n\t\t\t\t\tconst listener = () => {\n\t\t\t\t\t\tthis.#loadstartListener = null;\n\t\t\t\t\t\tmediaElement.play().then(resolve, reject);\n\t\t\t\t\t};\n\t\t\t\t\tthis.#loadstartListener = listener;\n\t\t\t\t\tmediaElement.addEventListener(\"loadstart\", listener, { once: true });\n\t\t\t\t});\n\t\t\t\tthrow err;\n\t\t\t});\n\t\t}\n\t\t#cancelPendingPlay() {\n\t\t\tif (!this.#loadstartListener) return;\n\t\t\tconst { mediaElement } = this.#engine.owners.get();\n\t\t\tmediaElement?.removeEventListener(\"loadstart\", this.#loadstartListener);\n\t\t\tthis.#loadstartListener = null;\n\t\t}\n\t}\n\treturn SpfMediaImpl;\n}\n/** Standalone SPF media adapter with no base class. */\nvar SpfMedia = class extends SpfMediaMixin(class {}) {};\n//#endregion\nexport { SpfMedia, SpfMediaMixin };\n\n//# sourceMappingURL=adapter.js.map","import { HTMLVideoElementHost } from \"../video-host.js\";\nimport { SpfMediaMixin } from \"@videojs/spf/dom\";\n//#region src/dom/media/simple-hls/index.ts\nvar SimpleHlsMedia = class extends SpfMediaMixin(HTMLVideoElementHost) {};\n//#endregion\nexport { SimpleHlsMedia };\n\n//# sourceMappingURL=index.js.map","import { CustomMediaElement } from '@videojs/core/dom/media/custom-media-element';\nimport { SimpleHlsMedia } from '@videojs/core/dom/media/simple-hls';\nimport { MediaAttachMixin } from '../../store/media-attach-mixin';\n\nexport class SimpleHlsVideo extends MediaAttachMixin(CustomMediaElement('video', SimpleHlsMedia)) {}\n","import { SimpleHlsVideo } from '../../media/simple-hls-video';\nimport { safeDefine } from '../safe-define';\n\nexport class SimpleHlsVideoElement extends SimpleHlsVideo {\n static readonly tagName = 'simple-hls-video';\n}\n\nsafeDefine(SimpleHlsVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [SimpleHlsVideoElement.tagName]: SimpleHlsVideoElement;\n }\n}\n"],"x_google_ignoreList":[3],"mappings":"oOAqBA,SAAS,EAAe,EAAU,CACjC,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,CAAG,EAAS,CAmBzC,SAAS,EAAc,EAAc,EAAO,EAAQ,EAAU,CAC7D,IAAM,EAAW,EAAe,EAAS,EAAI,EAC7C,OAAO,GAAS,EAAI,GAAY,EAAW,EAoB5C,SAAS,EAAgB,EAAU,EAAa,EAAU,CAEzD,OADI,IAAgB,EAAU,EACvB,GAAY,EAAI,EAAe,EAAS,EAAI,GC7CpD,MAAM,EAA2B,CAChC,aAAc,EACd,aAAc,EACd,cAAe,MACf,SAAU,KACV,YAAa,EACb,CAqBD,SAAS,EAAgB,EAAO,EAAY,EAAU,EAAS,EAA0B,CACxF,IAAM,EAAsB,EAAM,aAAe,EAKjD,GAJI,EAAW,EAAO,UAIlB,EAAa,EAAO,YAAa,MAAO,CAC3C,GAAG,EACH,aAAc,EACd,CACD,IAAM,EAAY,IAAM,EAAW,EAC7B,EAAS,EAAa,IAC5B,MAAO,CACN,aAAc,EAAc,EAAM,aAAc,EAAW,EAAQ,EAAO,aAAa,CACvF,gBAAiB,EAAM,gBAAkB,EACzC,aAAc,EAAc,EAAM,aAAc,EAAW,EAAQ,EAAO,aAAa,CACvF,gBAAiB,EAAM,gBAAkB,EACzC,aAAc,EACd,CAoBF,SAAS,EAAqB,EAAO,EAAiB,EAAS,EAA0B,CACxF,GAAI,EAAM,aAAe,EAAO,cAAe,OAAO,EACtD,IAAM,EAAe,EAAgB,EAAM,aAAc,EAAM,gBAAiB,EAAO,aAAa,CAC9F,EAAe,EAAgB,EAAM,aAAc,EAAM,gBAAiB,EAAO,aAAa,CACpG,OAAO,KAAK,IAAI,EAAc,EAAa,CCrF5C,MAAM,EAAgC,CAAE,eAAgB,GAAI,CA+C5D,SAAS,EAA2B,EAAkB,EAAa,EAAS,EAA+B,CAC1G,GAAI,EAAiB,SAAW,EAAG,MAAO,KAC1C,IAAM,EAAY,EAAc,EAAO,eACjC,EAAS,EAAiB,OAAQ,GAAQ,EAAI,WAAa,EAAU,CAE3E,OADI,EAAO,SAAW,EAAU,IACzB,KAAK,IAAI,GAAG,EAAO,IAAK,GAAQ,EAAI,UAAU,CAAC,CAEvD,SAAS,EAAkB,EAAU,EAAkB,EAAa,EAAS,EAA+B,CAC3G,GAAI,EAAS,SAAW,EAAG,MAAO,EAAE,CACpC,IAAM,EAAa,EAAc,EAAO,eAClC,EAAqB,IAAI,IAAI,EAAiB,IAAK,GAAQ,EAAI,UAAU,CAAC,CAChF,OAAO,EAAS,OAAQ,GAAQ,CAC/B,IAAM,EAAa,EAAI,UAAY,EAAI,SACjC,EAAY,EAAI,UAAY,GAAc,EAAa,EACvD,EAAgB,CAAC,EAAmB,IAAI,EAAI,UAAU,CAC5D,OAAO,GAAa,GACnB,CCnEH,IAAI,EAAY,OAAO,eACnB,IAAmB,EAAK,EAAK,IAAU,KAAO,EAAM,EAAU,EAAK,EAAK,CAAE,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,QAAO,CAAC,CAAG,EAAI,GAAO,EACtJ,IAAiB,EAAK,EAAK,KAC7B,GAAgB,EAAK,OAAO,GAAQ,SAAsB,EAAX,EAAM,GAAU,EAAM,CAC9D,GAEL,IAAiB,EAAK,EAAQ,IAAQ,CACxC,GAAI,CAAC,EAAO,IAAI,EAAI,CAClB,MAAM,UAAU,UAAY,EAAI,EAEhC,GAAe,EAAQ,IAAQ,CACjC,GAAI,OAAO,EAAI,GAAK,EAClB,MAAM,UAAU,6CAA6C,CAC/D,OAAO,EAAO,IAAI,EAAI,EAEpB,GAAgB,EAAK,EAAQ,IAAU,CACzC,GAAI,EAAO,IAAI,EAAI,CACjB,MAAM,UAAU,oDAAoD,CACtE,aAAkB,QAAU,EAAO,IAAI,EAAI,CAAG,EAAO,IAAI,EAAK,EAAM,EAElE,IAAmB,EAAK,EAAQ,KAClC,GAAc,EAAK,EAAQ,wBAAwB,CAC5C;;;;;;;;AAST,SAAS,GAAc,EAAG,EAAG,CAC3B,OAAO,OAAO,GAAG,EAAG,EAAE;;;;;;;;AASxB,IAAI,EAAiB,KACjB,EAAsB,GACtB,EAAQ,EACZ,MAAM,EAAyB,OAAO,SAAS,CAC/C,SAAS,EAAkB,EAAU,CACnC,IAAM,EAAO,EAEb,MADA,GAAiB,EACV,EAET,SAAS,IAAoB,CAC3B,OAAO,EAET,SAAS,IAAwB,CAC/B,OAAO,EAET,MAAM,GAAgB,CACpB,QAAS,EACT,eAAgB,EAChB,MAAO,GACP,aAAc,IAAK,GACnB,wBAAyB,IAAK,GAC9B,oBAAqB,IAAK,GAC1B,kBAAmB,EACnB,iBAAkB,IAAK,GACvB,wBAAyB,IAAK,GAC9B,0BAA2B,GAC3B,qBAAsB,GACtB,0BAA6B,GAC7B,2BAA8B,GAE9B,wBAA2B,GAE3B,yBAA4B,GAE7B,CACD,SAAS,EAAiB,EAAM,CAC9B,GAAI,EACF,MAAU,MACR,OAAO,UAAc,KAAe,UAAY,yDAA2D,GAC5G,CAEH,GAAI,IAAmB,KACrB,OAEF,EAAe,qBAAqB,EAAK,CACzC,IAAM,EAAM,EAAe,oBAE3B,GADA,EAAmB,EAAe,CAC9B,EAAM,EAAe,aAAa,QAAU,EAAe,aAAa,KAAS,GAC/E,GAAe,EAAe,CAAE,CAClC,IAAM,EAAgB,EAAe,aAAa,GAClD,EAAkC,EAAe,EAAe,oBAAoB,GAAK,CAGzF,EAAe,aAAa,KAAS,IACvC,EAAe,aAAa,GAAO,EACnC,EAAe,oBAAoB,GAAO,GAAe,EAAe,CAAG,GAAwB,EAAM,EAAgB,EAAI,CAAG,GAElI,EAAe,wBAAwB,GAAO,EAAK,QAErD,SAAS,IAAyB,CAChC,IAEF,SAAS,GAA2B,EAAM,CACpC,MAAC,EAAK,OAAS,EAAK,iBAAmB,GAG3C,IAAI,CAAC,EAAK,sBAAsB,EAAK,EAAI,CAAC,GAA+B,EAAK,CAAE,CAC9E,EAAK,MAAQ,GACb,EAAK,eAAiB,EACtB,OAEF,EAAK,uBAAuB,EAAK,CACjC,EAAK,MAAQ,GACb,EAAK,eAAiB,GAExB,SAAS,GAAwB,EAAM,CACrC,GAAI,EAAK,mBAAqB,IAAK,GACjC,OAEF,IAAM,EAAO,EACb,EAAsB,GACtB,GAAI,CACF,IAAK,IAAM,KAAY,EAAK,iBACrB,EAAS,OACZ,GAAkB,EAAS,QAGvB,CACR,EAAsB,GAG1B,SAAS,IAAyB,CAChC,OAAQ,GAAiD,4BAA+B,GAE1F,SAAS,GAAkB,EAAM,CAC/B,IAAI,EACJ,EAAK,MAAQ,GACb,GAAwB,EAAK,EAC5B,EAAK,EAAK,sBAAwB,MAAgB,EAAG,KAAK,EAAK,SAAW,EAAK,CAElF,SAAS,GAA0B,EAAM,CAEvC,OADA,IAAS,EAAK,kBAAoB,GAC3B,EAAkB,EAAK,CAEhC,SAAS,GAAyB,EAAM,EAAc,CACpD,KAAkB,EAAa,CAC3B,GAAC,GAAQ,EAAK,eAAiB,IAAK,IAAK,EAAK,sBAAwB,IAAK,IAAK,EAAK,0BAA4B,IAAK,IAG1H,IAAI,GAAe,EAAK,CACtB,IAAK,IAAI,EAAI,EAAK,kBAAmB,EAAI,EAAK,aAAa,OAAQ,IACjE,EAAkC,EAAK,aAAa,GAAI,EAAK,oBAAoB,GAAG,CAGxF,KAAO,EAAK,aAAa,OAAS,EAAK,mBACrC,EAAK,aAAa,KAAK,CACvB,EAAK,wBAAwB,KAAK,CAClC,EAAK,oBAAoB,KAAK,EAGlC,SAAS,GAA+B,EAAM,CAC5C,EAAmB,EAAK,CACxB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,aAAa,OAAQ,IAAK,CACjD,IAAM,EAAW,EAAK,aAAa,GAC7B,EAAc,EAAK,wBAAwB,GAKjD,GAJI,IAAgB,EAAS,UAG7B,GAA2B,EAAS,CAChC,IAAgB,EAAS,SAC3B,MAAO,GAGX,MAAO,GAET,SAAS,GAAwB,EAAM,EAAU,EAAa,CAC5D,IAAI,EAGJ,GAFA,EAAmB,EAAK,CACxB,EAAmB,EAAK,CACpB,EAAK,iBAAiB,SAAW,EAAG,EACrC,EAAK,EAAK,UAAY,MAAgB,EAAG,KAAK,EAAK,QAAQ,CAC5D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,aAAa,OAAQ,IAC5C,EAAK,oBAAoB,GAAK,GAAwB,EAAK,aAAa,GAAI,EAAM,EAAE,CAIxF,OADA,EAAK,wBAAwB,KAAK,EAAY,CACvC,EAAK,iBAAiB,KAAK,EAAS,CAAG,EAEhD,SAAS,EAAkC,EAAM,EAAK,CACpD,IAAI,EAGJ,GAFA,EAAmB,EAAK,CACxB,EAAmB,EAAK,CACpB,OAAO,UAAc,KAAe,WAAa,GAAO,EAAK,iBAAiB,OAChF,MAAU,MACR,0CAA0C,EAAI,uBAAuB,EAAK,iBAAiB,OAAO,aACnG,CAEH,GAAI,EAAK,iBAAiB,SAAW,EAAG,EACrC,EAAK,EAAK,YAAc,MAAgB,EAAG,KAAK,EAAK,QAAQ,CAC9D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,aAAa,OAAQ,IAC5C,EAAkC,EAAK,aAAa,GAAI,EAAK,oBAAoB,GAAG,CAGxF,IAAM,EAAU,EAAK,iBAAiB,OAAS,EAK/C,GAJA,EAAK,iBAAiB,GAAO,EAAK,iBAAiB,GACnD,EAAK,wBAAwB,GAAO,EAAK,wBAAwB,GACjE,EAAK,iBAAiB,SACtB,EAAK,wBAAwB,SACzB,EAAM,EAAK,iBAAiB,OAAQ,CACtC,IAAM,EAAc,EAAK,wBAAwB,GAC3C,EAAW,EAAK,iBAAiB,GACvC,EAAmB,EAAS,CAC5B,EAAS,oBAAoB,GAAe,GAGhD,SAAS,GAAe,EAAM,CAE5B,OAAO,EAAK,uBAAgC,GAA6B,kBAAwC,QAAW,GAAK,EAEnI,SAAS,EAAmB,EAAM,CAChC,AAAsB,EAAK,eAAe,EAAE,CAC5C,AAA6B,EAAK,sBAAsB,EAAE,CAC1D,AAAiC,EAAK,0BAA0B,EAAE,CAEpE,SAAS,EAAmB,EAAM,CAChC,AAA0B,EAAK,mBAAmB,EAAE,CACpD,AAAiC,EAAK,0BAA0B,EAAE;;;;;;;;AASpE,SAAS,GAAY,EAAM,CAGzB,GAFA,GAA2B,EAAK,CAChC,EAAiB,EAAK,CAClB,EAAK,QAAU,EACjB,MAAM,EAAK,MAEb,OAAO,EAAK,MAEd,SAAS,GAAe,EAAa,CACnC,IAAM,EAAO,OAAO,OAAO,GAAc,CACzC,EAAK,YAAc,EACnB,IAAM,MAAiB,GAAY,EAAK,CAExC,MADA,GAAS,GAAU,EACZ,EAET,MAAM,EAAwB,OAAO,QAAQ,CACvC,EAA4B,OAAO,YAAY,CAC/C,EAA0B,OAAO,UAAU,CAC3C,GACG,CACL,GAAG,GACH,MAAO,EACP,MAAO,GACP,MAAO,KACP,MAAO,GACP,sBAAsB,EAAM,CAC1B,OAAO,EAAK,QAAU,GAAS,EAAK,QAAU,GAEhD,uBAAuB,EAAM,CAC3B,GAAI,EAAK,QAAU,EACjB,MAAU,MAAM,kCAAkC,CAEpD,IAAM,EAAW,EAAK,MACtB,EAAK,MAAQ,EACb,IAAM,EAAe,GAA0B,EAAK,CAChD,EACA,EAAW,GACf,GAAI,CACF,EAAW,EAAK,YAAY,KAAK,EAAK,QAAQ,CAE9C,EADc,IAAa,GAAS,IAAa,GAC7B,EAAK,MAAM,KAAK,EAAK,QAAS,EAAU,EAAS,OAC9D,EAAK,CACZ,EAAW,EACX,EAAK,MAAQ,SACL,CACR,GAAyB,EAAM,EAAa,CAE9C,GAAI,EAAU,CACZ,EAAK,MAAQ,EACb,OAEF,EAAK,MAAQ,EACb,EAAK,WAER;;;;;;;;AASH,SAAS,IAAoB,CAC3B,MAAU,OAAO,CAEnB,IAAI,GAAmC,GACvC,SAAS,IAAiC,CACxC,IAAkC;;;;;;;;AASpC,SAAS,GAAa,EAAc,CAClC,IAAM,EAAO,OAAO,OAAO,GAAY,CACvC,EAAK,MAAQ,EACb,IAAM,OACJ,EAAiB,EAAK,CACf,EAAK,OAGd,MADA,GAAO,GAAU,EACV,EAET,SAAS,IAAc,CAErB,OADA,EAAiB,KAAK,CACf,KAAK,MAEd,SAAS,GAAY,EAAM,EAAU,CAC9B,IAAwB,EAC3B,IAAgC,CAE7B,EAAK,MAAM,KAAK,EAAK,QAAS,EAAK,MAAO,EAAS,GACtD,EAAK,MAAQ,EACb,GAAmB,EAAK,EAG5B,MAAM,GACG,CACL,GAAG,GACH,MAAO,GACP,MAAO,IAAK,GACb,CAEH,SAAS,GAAmB,EAAM,CAChC,EAAK,UACL,IAAwB,CACxB,GAAwB,EAAK;;;;;;;;;;;;;;;;;AAkB/B,MAAM,EAAO,OAAO,OAAO,CAC3B,IAAI,GACF,GAAY,CACZ,IAAI,EAAI,EAAkB,EAAI,EAC9B,MAAM,CAAM,CACV,YAAY,EAAc,EAAU,EAAE,CAAE,CACtC,EAAa,KAAM,EAAO,CAC1B,GAAc,KAAM,EAAG,CAEvB,IAAM,EADM,GAAa,EAAa,CACrB,GAGjB,GAFA,KAAK,GAAQ,EACb,EAAK,QAAU,KACX,EAAS,CACX,IAAM,EAAS,EAAQ,OACnB,IACF,EAAK,MAAQ,GAEf,EAAK,QAAU,EAAQ,EAAQ,OAAO,SACtC,EAAK,UAAY,EAAQ,EAAQ,OAAO,YAG5C,KAAM,CACJ,GAAI,EAAE,EAAG,EAAQ,SAAS,KAAK,CAC7B,MAAU,UAAU,qDAAqD,CAC3E,OAAO,GAAY,KAAK,KAAK,GAAM,CAErC,IAAI,EAAU,CACZ,GAAI,EAAE,EAAG,EAAQ,SAAS,KAAK,CAC7B,MAAU,UAAU,qDAAqD,CAC3E,GAAI,IAAuB,CACzB,MAAU,MAAM,0DAA0D,CAE5E,IAAM,EAAM,KAAK,GACjB,GAAY,EAAK,EAAS,EAG9B,EAAK,EACL,EAAS,IAAI,QAGb,EAAQ,QAAW,GAAM,OAAO,GAAM,UAAY,EAAY,EAAQ,EAAE,CACxE,EAAQ,MAAQ,EAChB,MAAM,CAAS,CAGb,YAAY,EAAa,EAAS,CAChC,EAAa,KAAM,EAAQ,CAC3B,GAAc,KAAM,EAAG,CAEvB,IAAM,EADM,GAAe,EAAY,CACtB,GAIjB,GAHA,EAAK,0BAA4B,GACjC,KAAK,GAAQ,EACb,EAAK,QAAU,KACX,EAAS,CACX,IAAM,EAAS,EAAQ,OACnB,IACF,EAAK,MAAQ,GAEf,EAAK,QAAU,EAAQ,EAAQ,OAAO,SACtC,EAAK,UAAY,EAAQ,EAAQ,OAAO,YAG5C,KAAM,CACJ,GAAI,EAAE,EAAG,EAAQ,YAAY,KAAK,CAChC,MAAU,UAAU,wDAAwD,CAC9E,OAAO,GAAY,KAAK,GAAM,EAGlC,EAAK,EACL,EAAU,IAAI,QAGd,EAAQ,WAAc,GAAM,OAAO,GAAM,UAAY,EAAY,EAAS,EAAE,CAC5E,EAAQ,SAAW,GACjB,GAAY,CACZ,IAAI,EAAK,EAAoB,EAAgB,EAC7C,SAAS,EAAQ,EAAI,CACnB,IAAI,EACA,EAAqB,KACzB,GAAI,CACF,EAAqB,EAAkB,KAAK,CAC5C,EAAS,GAAI,QACL,CACR,EAAkB,EAAmB,CAEvC,OAAO,EAET,EAAQ,QAAU,EAClB,SAAS,EAAkB,EAAM,CAE/B,GAAI,EAAE,EAAG,EAAQ,YAAY,EAAK,EAAI,EAAE,EAAG,EAAQ,WAAW,EAAK,CACjE,MAAU,UAAU,kEAAkE,CAExF,OAAe,EAAK,GAAM,cAAqC,IAAK,GAAM,EAAE,QAAQ,EAAK,EAAE,CAE7F,EAAQ,kBAAoB,EAC5B,SAAS,EAAgB,EAAQ,CAE/B,GAAI,EAAE,EAAG,EAAQ,YAAY,EAAO,EAAI,EAAE,EAAG,EAAQ,SAAS,EAAO,CACnE,MAAU,UAAU,mDAAmD,CAEzE,OAAe,EAAO,GAAM,kBAAyC,IAAK,GAAM,EAAE,QAAQ,EAAK,EAAE,CAEnG,EAAQ,gBAAkB,EAC1B,SAAS,EAAS,EAAQ,CACxB,GAAI,EAAE,EAAG,EAAQ,YAAY,EAAO,EAAI,EAAE,EAAG,EAAQ,SAAS,EAAO,CACnE,MAAU,UAAU,4CAA4C,CAElE,IAAM,EAAmB,EAAO,GAAM,iBAGtC,OAFK,EAEE,EAAiB,OAAS,EADxB,GAGX,EAAQ,SAAW,EACnB,SAAS,EAAW,EAAQ,CAC1B,GAAI,EAAE,EAAG,EAAQ,YAAY,EAAO,EAAI,EAAE,EAAG,EAAQ,WAAW,EAAO,CACrE,MAAU,UAAU,2DAA2D,CAEjF,IAAM,EAAe,EAAO,GAAM,aAGlC,OAFK,EAEE,EAAa,OAAS,EADpB,GAGX,EAAQ,WAAa,EACrB,MAAM,CAAQ,CAIZ,YAAY,EAAQ,CAClB,EAAa,KAAM,EAAQ,CAC3B,EAAa,KAAM,EAAe,CAClC,GAAc,KAAM,EAAI,CACxB,IAAI,EAAO,OAAO,OAAO,GAAc,CACvC,EAAK,QAAU,KACf,EAAK,oBAAsB,EAC3B,EAAK,qBAAuB,GAC5B,EAAK,0BAA4B,GACjC,EAAK,aAAe,EAAE,CACtB,KAAK,GAAQ,EAMf,MAAM,GAAG,EAAS,CAChB,GAAI,EAAE,EAAG,EAAQ,WAAW,KAAK,CAC/B,MAAU,UAAU,0CAA0C,CAEhE,GAAgB,KAAM,EAAgB,EAAiB,CAAC,KAAK,KAAM,EAAQ,CAC3E,IAAM,EAAO,KAAK,GAClB,EAAK,MAAQ,GACb,IAAM,EAAO,EAAkB,EAAK,CACpC,IAAK,IAAM,KAAU,EACnB,EAAiB,EAAO,GAAM,CAEhC,EAAkB,EAAK,CAGzB,QAAQ,GAAG,EAAS,CAClB,GAAI,EAAE,EAAG,EAAQ,WAAW,KAAK,CAC/B,MAAU,UAAU,0CAA0C,CAEhE,GAAgB,KAAM,EAAgB,EAAiB,CAAC,KAAK,KAAM,EAAQ,CAC3E,IAAM,EAAO,KAAK,GAClB,EAAmB,EAAK,CACxB,IAAK,IAAI,EAAI,EAAK,aAAa,OAAS,EAAG,GAAK,EAAG,IACjD,GAAI,EAAQ,SAAS,EAAK,aAAa,GAAG,QAAQ,CAAE,CAClD,EAAkC,EAAK,aAAa,GAAI,EAAK,oBAAoB,GAAG,CACpF,IAAM,EAAU,EAAK,aAAa,OAAS,EAM3C,GALA,EAAK,aAAa,GAAK,EAAK,aAAa,GACzC,EAAK,oBAAoB,GAAK,EAAK,oBAAoB,GACvD,EAAK,aAAa,SAClB,EAAK,oBAAoB,SACzB,EAAK,oBACD,EAAI,EAAK,aAAa,OAAQ,CAChC,IAAM,EAAc,EAAK,oBAAoB,GACvC,EAAW,EAAK,aAAa,GACnC,EAAmB,EAAS,CAC5B,EAAS,wBAAwB,GAAe,IAOxD,YAAa,CACX,GAAI,EAAE,EAAG,EAAQ,WAAW,KAAK,CAC/B,MAAU,UAAU,6CAA6C,CAGnE,OADa,KAAK,GACN,aAAa,OAAQ,GAAM,EAAE,MAAM,CAAC,IAAK,GAAM,EAAE,QAAQ,EAGzE,EAAM,EACN,EAAU,IAAI,QAGd,EAAiB,IAAI,QACrB,EAAmB,SAAS,EAAS,CACnC,IAAK,IAAM,KAAU,EACnB,GAAI,EAAE,EAAG,EAAQ,YAAY,EAAO,EAAI,EAAE,EAAG,EAAQ,SAAS,EAAO,CACnE,MAAU,UAAU,4DAA4D,EAItF,EAAQ,UAAa,GAAM,EAAY,EAAS,EAAE,CAClD,EAAQ,QAAU,EAClB,SAAS,GAAkB,CAEzB,OAAc,IAAmB,EAAyB,QAE5D,EAAQ,gBAAkB,EAC1B,EAAQ,QAAU,OAAO,UAAU,CACnC,EAAQ,UAAY,OAAO,YAAY,GACtC,AAAmB,EAAQ,SAAS,EAAE,CAAE,GAC1C,AAAW,IAAS,EAAE,CAAE,CCjkB3B,MAAM,EAA0B,IAAI,IAC9B,EAAU,IAAI,EAAO,OAAO,YAAc,CAC/C,eAAe,GAAW,EACzB,CACF,SAAS,IAAa,CACrB,IAAK,IAAM,KAAK,EAAQ,YAAY,CAAE,EAAQ,IAAI,EAAE,CACpD,EAAQ,OAAO,CACf,IAAK,IAAM,KAAK,EACf,EAAQ,OAAO,EAAE,CACjB,EAAE,KAAK,CAaT,SAAS,EAAO,EAAI,CACnB,IAAI,EACE,EAAI,IAAI,EAAO,aAAe,CAC/B,OAAO,GAAY,YAAY,GAAS,CAC5C,EAAU,GAAI,EACb,CAGF,OAFA,EAAQ,MAAM,EAAE,CAChB,EAAE,KAAK,KACM,CACZ,EAAQ,QAAQ,EAAE,CACd,OAAO,GAAY,YAAY,GAAS,EC/B9C,MAAM,EAAU,EAAO,OAAO,QAE9B,SAAS,EAAO,EAAc,EAAS,CACtC,OAAO,IAAI,EAAO,MAAM,EAAc,EAAQ,CAG/C,SAAS,EAAS,EAAI,EAAS,CAC9B,OAAO,IAAI,EAAO,SAAS,EAAI,EAAQ,CAWxC,SAAS,EAAO,EAAQ,EAAS,CAChC,IAAM,EAAU,MAAc,EAAO,KAAK,CAAC,CAC3C,EAAO,IAAI,OAAO,GAAY,WAAa,EAAQ,EAAQ,CAAG,CAC7D,GAAG,EACH,GAAG,EACH,CAAC,CCzBH,SAAS,EAAgB,EAAO,CAC/B,MAAO,aAAc,EAMtB,SAAS,GAAwB,EAAc,CAC9C,OAAO,EAAa,WAAa,IAAK,GCLvC,MAAM,EAA2B,CAChC,MAAO,uBACP,MAAO,uBACP,KAAM,sBACN,CAKK,GAAkB,CACvB,MAAO,cACP,MAAO,cACP,CAYD,SAAS,EAAiB,EAAO,EAAM,CACtC,GAAM,CAAE,gBAAiB,EAEzB,GAAI,CAAC,GAAgB,EAAE,OAAQ,GAAe,OAC9C,IAAM,EAAU,EAAM,EAAyB,IAC/C,OAAO,EAAa,cAAc,MAAM,CAAE,KAAM,KAAuB,IAAqB,EAAK,EAAE,cAAc,IAAI,OAAO,MAAM,CAAE,QAAS,IAAO,EAAQ,CChC7J,MAAM,GAAyB,GAAK,GAUpC,IAAI,GAAwB,KAAM,CACjC,aACA,GACA,YAAY,EAAgB,CAAE,eAAe,IAA2B,EAAE,CAAE,CAC3E,MAAA,EAAuB,EACvB,KAAK,aAAe,EAErB,OAAQ,OAAO,gBAAiB,CAC/B,IAAI,EACE,EAAS,MAAA,EAAqB,WAAW,CAC/C,GAAI,CACH,OAAa,CACZ,GAAM,CAAE,OAAM,SAAU,MAAM,EAAO,MAAM,CAC3C,GAAI,EAAM,CACL,IAAS,MAAM,GACnB,MAED,EAAU,EAAU,GAAO,EAAS,EAAM,CAAG,EACzC,EAAQ,QAAU,KAAK,eAC1B,MAAM,EACN,EAAU,IAAK,YAGR,CACT,EAAO,aAAa,IAIvB,SAAS,GAAO,EAAG,EAAG,CACrB,IAAM,EAAS,IAAI,WAAW,EAAE,OAAS,EAAE,OAAO,CAGlD,OAFA,EAAO,IAAI,EAAE,CACb,EAAO,IAAI,EAAG,EAAE,OAAO,CAChB,ECtBR,eAAe,EAAgB,EAAa,EAAS,CACpD,IAAM,EAAU,IAAI,QAAQ,GAAS,QAAQ,CAC7C,GAAI,EAAY,UAAW,CAC1B,GAAM,CAAE,QAAO,OAAQ,EAAY,UACnC,EAAQ,IAAI,QAAS,SAAS,EAAM,GAAG,IAAM,CAE9C,IAAM,EAAU,IAAI,QAAQ,EAAY,IAAK,CAC5C,OAAQ,MACR,UACA,GAAG,EACH,CAAC,CACF,OAAO,MAAM,EAAQ,CAetB,SAAS,GAAgB,EAAU,CAClC,OAAO,EAAS,MAAM,CC5CvB,MAAM,GAA6B,CAAE,aAAc,EAAG,CA6BtD,SAAS,GAA8B,EAAU,EAAa,EAAS,GAA4B,CAClG,GAAI,EAAS,SAAW,EAAG,MAAO,GAClC,IAAM,EAAiB,EAAS,OAAQ,GAAQ,EAAI,UAAY,EAAY,CAC5E,GAAI,EAAe,SAAW,EAAG,MAAO,GACxC,IAAM,EAAkB,EAAe,OAAS,EAAO,aAGvD,OAFI,GAAmB,EAAU,EAC7B,GAAmB,EAAe,OAAe,EAC9C,EAAe,GAAiB,UC/BxC,SAAS,EAAkB,EAAiB,CAC3C,IAAM,EAAiB,EAAO,EAAgB,CAM9C,MAAO,CACN,iBACA,aAPsB,MAAc,EAAe,KAAK,CAAC,MAAM,CAQ/D,WAPmB,GAAO,EAAO,EAAiB,IAAa,CAC/D,GAAG,EACH,MAAO,EACP,EAAE,CAKF,CCsBF,SAAS,GAAmB,EAAK,CAChC,IAAM,EAAS,EAAI,UAAU,CACvB,CAAE,iBAAgB,WAAU,cAAe,EAAkB,CAClE,MAAO,EAAI,QACX,QAAS,EAAI,QACb,CAAC,CACI,MAAmB,MAAc,EAAe,KAAK,CAAC,QAAQ,CAC9D,EAAc,GAAY,CAC/B,EAAO,EAAgB,CAAE,UAAS,CAAC,EAEpC,MAAO,CACN,IAAI,UAAW,CACd,OAAO,GAER,KAAK,EAAS,CACb,IAAM,EAAQ,GAAU,CACxB,GAAI,IAAU,YAAa,OAC3B,IAAM,EAAU,EAAI,OAAO,IAAQ,KAAK,EAAQ,MAChD,GAAI,CAAC,EAAS,OACd,EAAQ,EAAS,CAChB,QAAS,GAAY,CACrB,aACA,WAAa,GAAO,EAAW,EAAG,CAClC,aACA,GAAG,EAAS,CAAE,SAAQ,CAAG,EAAE,CAC3B,CAAC,CACF,IAAM,EAAW,GAAU,CAC3B,GAAI,IAAa,YAAa,CAC7B,IAAM,EAAc,EAAI,OAAO,GAC/B,GAAI,GAAa,WAAa,EAAQ,CACrC,IAAM,EAAc,EAAY,UAChC,EAAO,gBAAkB,CACpB,GAAU,GAAK,GACnB,EAAW,EAAY,EACtB,IAIL,SAAU,CACL,GAAU,GAAK,cACnB,GAAQ,SAAS,CACjB,EAAW,YAAY,GAExB,CCvEF,SAAS,GAAa,CACrB,MAAO,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,MAAM,KAAK,QAAQ,CAAG,IAAI,GCAxD,IAAI,EAAO,KAAM,CAChB,GACA,GACA,GAAmB,IAAI,gBACvB,GACA,GAAU,UACV,GAAS,IAAK,GACd,GAAS,IAAK,GACd,YAAY,EAAO,EAAQ,CAC1B,MAAA,EAAc,EACd,IAAM,EAAQ,GAAQ,GACtB,KAAK,GAAK,OAAO,GAAU,WAAa,GAAO,CAAG,GAAS,GAAY,CACvE,MAAA,EAAe,GAAQ,OAAS,EAAe,CAAC,MAAA,EAAsB,OAAQ,EAAO,OAAO,CAAC,CAAG,MAAA,EAAsB,OAEvH,IAAI,QAAS,CACZ,OAAO,MAAA,EAER,IAAI,OAAQ,CACX,OAAO,MAAA,EAER,IAAI,OAAQ,CACX,OAAO,MAAA,EAER,MAAM,KAAM,CACX,MAAA,EAAe,UACf,GAAI,CACH,IAAM,EAAS,MAAM,MAAA,EAAY,MAAA,EAAa,CAG9C,MAFA,OAAA,EAAc,EACd,MAAA,EAAe,OACR,QACC,EAAG,CAGX,KAFA,OAAA,EAAc,EACd,MAAA,EAAe,QACT,GAGR,OAAQ,CACP,MAAA,EAAsB,OAAO,GAU3B,GAAmB,KAAM,CAC5B,GAA2B,IAAI,IAC/B,GAAW,QAAQ,SAAS,CAC5B,GAAkB,KAClB,GAAa,GACb,SAAS,EAAM,CACd,GAAI,MAAA,EAAiB,OAAO,QAAQ,SAAS,CAC7C,IAAM,EAAW,MAAA,EAAc,IAAI,EAAK,GAAG,CAC3C,GAAI,EAAU,OAAO,EAAS,QAC1B,MAAA,EAAc,OAAS,IAAG,MAAA,EAAgB,IAAI,QAAS,GAAY,CACtE,MAAA,EAAuB,GACtB,EACF,IAAM,EAAU,EAAK,KAAK,CAC1B,EAAQ,UAAY,GAAG,CACvB,IAAM,MAAgB,CACrB,MAAA,EAAc,OAAO,EAAK,GAAG,CACzB,MAAA,EAAc,OAAS,IAC1B,MAAA,KAAwB,CACxB,MAAA,EAAuB,OAQzB,OALA,EAAQ,KAAK,EAAS,EAAQ,CAC9B,MAAA,EAAc,IAAI,EAAK,GAAI,CAC1B,OACA,UACA,CAAC,CACK,EAQR,YAAY,EAAU,CACrB,GAAI,MAAA,EAAc,OAAS,EAAG,OAC9B,IAAM,EAAW,MAAA,EACjB,EAAS,SAAW,CACf,MAAA,IAAkB,GACtB,GAAU,MACF,GAAG,CAEb,UAAW,CACV,IAAK,GAAM,CAAE,UAAU,MAAA,EAAc,QAAQ,CAAE,EAAK,OAAO,CAC3D,MAAA,EAAc,OAAO,CACrB,MAAA,KAAwB,CACxB,MAAA,EAAuB,KACvB,MAAA,EAAgB,QAAQ,SAAS,CAElC,SAAU,CACT,MAAA,EAAkB,GAClB,KAAK,UAAU,GAiBb,EAAe,KAAM,CACxB,GAAS,QAAQ,SAAS,CAC1B,GAA2B,IAAI,IAC/B,GAAW,KACX,GAAa,GACb,SAAS,EAAM,CACd,GAAI,MAAA,EAAiB,OAAO,QAAQ,SAAS,CAC7C,IAAM,EAAI,EACV,MAAA,EAAc,IAAI,EAAE,CACpB,IAAM,EAAS,MAAA,EAAY,UAC1B,MAAA,EAAc,OAAO,EAAE,CACvB,MAAA,EAAgB,EACT,EAAK,KAAK,EAChB,CAAC,YAAc,CAChB,MAAA,EAAgB,MACf,CAEF,MADA,OAAA,EAAc,EAAO,SAAW,OAAU,GAAG,CACtC,EAQR,IAAI,SAAU,CACb,OAAO,MAAA,EASR,YAAY,EAAU,CACrB,GAAI,MAAA,EAAc,OAAS,GAAK,MAAA,IAAkB,KAAM,OACxD,IAAM,EAAe,MAAA,EACrB,EAAa,SAAW,CACnB,MAAA,IAAgB,GACpB,GAAU,MACF,GAAG,CAGb,cAAe,CACd,IAAK,IAAM,KAAQ,MAAA,EAAe,EAAK,OAAO,CAC9C,MAAA,EAAc,OAAO,CAEtB,UAAW,CACV,KAAK,cAAc,CACnB,MAAA,GAAe,OAAO,CAEvB,SAAU,CACT,MAAA,EAAkB,GAClB,KAAK,UAAU,GC1KjB,SAAS,EAAY,EAAU,EAAQ,CACtC,OAAO,IAAI,SAAS,EAAS,IAAW,CACvC,GAAI,EAAS,KAAK,CAAC,QAAU,OAAQ,CACpC,GAAS,CACT,OAED,GAAI,EAAS,KAAK,CAAC,QAAU,YAAa,CACzC,EAAO,IAAI,aAAa,UAAW,aAAa,CAAC,CACjD,OAED,GAAI,EAAO,QAAS,CACnB,EAAO,EAAO,OAAO,CACrB,OAED,IAAI,EACE,EAAW,GAAO,CACvB,KAAQ,CACR,EAAO,oBAAoB,QAAS,EAAQ,CAC5C,GAAI,EAEC,MAAgB,MAAc,EAAO,EAAO,OAAO,CAAC,CAC1D,EAAO,MAAa,CACnB,IAAM,EAAQ,EAAS,KAAK,CAAC,MACzB,IAAU,OAAQ,EAAQ,EAAQ,CAC7B,IAAU,aAAa,MAAc,EAAO,IAAI,aAAa,UAAW,aAAa,CAAC,CAAC,EAC/F,CACF,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,GAAM,CAAC,EACxD,CAQH,SAAS,GAAa,EAAI,CAAE,aAAY,aAAY,aAAY,qBAAqB,CACpF,OAAO,IAAI,EAAK,KAAO,IAAe,CACjC,MAAW,QACf,IAAI,EAAG,OAAS,SAAU,CACzB,EAAkB,KAAK,EAAG,CAC1B,MAAM,EAAY,EAAkB,SAAU,EAAW,CACzD,OAED,GAAI,EAAG,OAAS,cAAe,CAC9B,EAAW,CACV,GAAG,GAAY,CACf,oBAAqB,EAAG,KAAK,QAC7B,CAAC,CACF,GAAI,CACH,IAAM,EAAO,MAAM,EAAW,EAAI,CACjC,OAAQ,EACR,aAAc,IACd,CAAC,CACG,EAAW,UACf,EAAkB,KAAK,CACtB,KAAM,cACN,OACA,KAAM,EAAG,KACT,CAAC,CACF,MAAM,EAAY,EAAkB,SAAU,EAAW,SAEjD,CACT,EAAW,CACV,GAAG,GAAY,CACf,oBAAqB,KACrB,CAAC,CAEH,OAED,EAAW,CACV,GAAG,GAAY,CACf,kBAAmB,EAAG,KAAK,GAC3B,CAAC,CACF,GAAI,CACH,IAAM,EAAS,MAAM,EAAW,EAAI,CAAE,OAAQ,EAAY,CAAC,CACtD,EAAW,UACf,EAAkB,KAAK,CACtB,KAAM,iBACN,KAAM,EACN,KAAM,EAAG,KACT,CAAC,CACF,MAAM,EAAY,EAAkB,SAAU,EAAW,SAEjD,CACT,EAAW,CACV,GAAG,GAAY,CACf,kBAAmB,KACnB,CAAC,IAEF,CAqBH,SAAS,GAAyB,EAAmB,EAAY,CAChE,IAAM,EAAuB,GAAgB,CAC5C,IAAM,EAAc,IAAI,IAAI,EAAkB,SAAS,KAAK,CAAC,QAAQ,SAAS,OAAQ,GAAM,CAAC,EAAE,QAAQ,CAAC,IAAK,GAAM,EAAE,GAAG,CAAC,CACzH,OAAO,EAAY,OAAQ,GAAM,EAAY,IAAI,EAAE,GAAG,CAAC,EAiBlD,EAAa,GAAY,CAC9B,GAAM,CAAE,QAAO,SAAU,EACnB,EAAW,EAAkB,SAAS,KAAK,CAAC,QAC5C,EAAmB,EAAoB,EAAM,SAAS,CACtD,EAAc,GAAO,OAAS,EAC9B,EAAQ,EAAE,CAChB,GAAI,EAAO,CACV,IAAM,EAAoB,EAA2B,EAAkB,EAAY,CAC/E,EAAoB,KAAU,EAAM,KAAK,CAC5C,KAAM,SACN,MAAO,EACP,IAAK,IACL,CAAC,CACF,IAAM,EAAe,GAA8B,EAAkB,EAAY,CAC7E,EAAe,GAAG,EAAM,KAAK,CAChC,KAAM,SACN,MAAO,EACP,IAAK,EACL,CAAC,CAQH,GANI,EAAS,cAAgB,EAAM,IAAI,EAAM,KAAK,CACjD,KAAM,cACN,KAAM,CAAE,QAAS,EAAM,GAAI,CAC3B,IAAK,EAAM,eAAe,IAC1B,GAAG,EAAM,eAAe,YAAc,IAAK,IAAK,CAAE,UAAW,EAAM,eAAe,UAAW,CAC7F,CAAC,CACE,EAAO,CACV,IACM,EAAiB,EAAkB,EAAM,SAAU,EAAkB,EAAY,CAAC,OAAQ,GAAQ,CACvG,IAAM,EAAW,EAAS,SAAS,KAAM,GAAM,KAAK,IAAI,EAAE,UAAY,EAAI,UAAU,CAAG,KAAQ,CAG/F,OAFI,GAAU,SACV,CAAC,GAAU,gBAAkB,CAAC,EAAM,UAAkB,GACnD,EAAM,UAAY,EAAS,gBACjC,CACF,IAAK,IAAM,KAAW,EAAgB,EAAM,KAAK,CAChD,KAAM,iBACN,KAAM,CACL,GAAI,EAAQ,GACZ,UAAW,EAAQ,UACnB,SAAU,EAAQ,SAClB,QAAS,EAAM,GACf,eAAgB,EAAM,UACtB,CACD,IAAK,EAAQ,IACb,GAAG,EAAQ,YAAc,IAAK,IAAK,CAAE,UAAW,EAAQ,UAAW,CACnE,CAAC,CAEH,OAAO,GAEF,GAAe,EAAO,CAAE,aAAY,aAAY,YAAa,CAClE,EAAM,QAAS,GAAO,CACrB,EAAO,SAAS,GAAa,EAAI,CAChC,aACA,aACA,aACA,oBACA,CAAC,CAAC,CAAC,KAAK,IAAK,GAAI,GAAM,CACnB,aAAa,OAAS,EAAE,OAAS,eACrC,QAAQ,MAAM,sCAAuC,EAAE,CACvD,EAAO,cAAc,GACpB,EACD,EAEH,OAAO,GAAmB,CACzB,WAAc,IAAI,EAClB,QAAS,OACT,QAAS,CACR,oBAAqB,KACrB,kBAAmB,KACnB,CACD,OAAQ,CACP,KAAM,CAAE,GAAI,CAAE,MAAO,EAAK,IAAQ,CACjC,IAAM,EAAW,EAAU,EAAI,CAC3B,EAAS,SAAW,IACxB,EAAI,WAAW,UAAU,CACzB,EAAY,EAAU,EAAI,GACxB,CAAE,CACL,QAAS,CACR,UAAW,OACX,GAAI,CAAE,MAAO,EAAK,IAAQ,CACzB,GAAM,CAAE,UAAS,UAAW,EACtB,EAAW,EAAU,EAAI,CAC3B,EAAQ,oBAAsB,MAAQ,EAAS,KAAM,GAAM,EAAE,OAAS,kBAAoB,EAAE,KAAK,KAAO,EAAQ,kBAAkB,EAAI,EAAQ,sBAAwB,MAAQ,EAAS,KAAM,GAAM,EAAE,OAAS,eAAiB,EAAE,KAAK,UAAY,EAAQ,oBAAoB,EACjR,EAAO,cAAc,CACrB,EAAY,EAAS,OAAQ,GAAM,EAAE,EAAE,OAAS,kBAAoB,EAAE,KAAK,KAAO,EAAQ,oBAAsB,EAAE,EAAE,OAAS,eAAiB,EAAE,KAAK,UAAY,EAAQ,qBAAqB,CAAE,EAAI,GAEpM,EAAO,UAAU,EACb,EAAQ,oBAAsB,MAAQ,EAAQ,sBAAwB,MAAQ,EAAS,KAAM,GAAM,EAAE,OAAS,eAAiB,EAAE,KAAK,UAAY,EAAQ,oBAAoB,GAAE,EAAkB,KAAK,CAAE,KAAM,SAAU,CAAC,CAC9N,EAAY,EAAU,EAAI,GAEzB,CACH,CACD,CACD,CAAC,CCnOH,MAAMa,GAAiB,CACtB,MAAO,mBACP,MAAO,mBACP,CACD,SAAS,GAAmB,EAAY,EAAU,CACjD,OAAO,MAAO,EAAa,IAAY,CACtC,GAAM,CAAE,eAAc,GAAG,GAAiB,GAAW,EAAE,CACjD,EAAW,MAAM,EAAgB,EAAa,EAAa,CACjE,GAAI,CAAC,EAAS,KAAM,MAAU,MAAM,uBAAuB,CAC3D,IAAM,EAAO,EAAS,KACtB,MAAO,CAAE,CAAC,OAAO,eAAgB,iBAAmB,CACnD,IAAI,EAAa,YAAY,KAAK,CAClC,UAAW,IAAM,KAAS,IAAI,GAAsB,EAAM,GAAG,IAAiB,IAAK,GAAyB,EAAE,CAAvB,CAAC,CAAE,eAAc,CAAC,CAAM,CAAE,CAChH,IAAM,EAAU,YAAY,KAAK,CAAG,EAC9B,EAAO,EAAgB,EAAW,KAAK,CAAE,EAAS,EAAM,WAAW,CACzE,EAAW,IAAI,EAAK,CACpB,IAAW,EAAK,CAChB,MAAM,EACN,EAAa,YAAY,KAAK,GAE7B,EASL,eAAe,GAAY,EAAa,EAAS,CAChD,GAAM,CAAE,eAAc,GAAG,GAAiB,GAAW,EAAE,CACjD,EAAW,MAAM,EAAgB,EAAa,EAAa,CACjE,GAAI,CAAC,EAAS,KAAM,MAAU,MAAM,uBAAuB,CAC3D,OAAO,IAAI,GAAsB,EAAS,KAAM,GAAG,IAAiB,IAAK,GAAyB,EAAE,CAAvB,CAAC,CAAE,eAAc,CAAC,CAAM,CAEtG,SAAS,GAAoB,CAAC,EAAiB,GAAQ,EAAM,CAC5D,GAAM,CAAE,oBAAmB,UAAS,eAAgB,EACpD,MAAO,CACN,oBACA,UACA,cACA,MAAO,EAAiB,EAAO,EAAK,CACpC,kBACA,CAkBF,MAAM,IAAmB,EAAa,IAAU,CAC3C,MAAe,KACnB,OAAO,GAAO,SAAS,MAAM,CAAE,YAAW,YAAY,EAAG,IAAa,GAAe,IAAc,EAAc,EAAY,GAAY,IAAM,EAAS,OAAS,GAAG,EAAE,WAQvK,SAAS,GAAgB,EAAW,EAAU,CAW7C,OAVK,EAAS,gBACT,EAAS,kBAIV,CAAC,EAAU,mBAAqB,EAAS,mBACxC,EAAU,UAAY,OAAe,GAEtC,CAAC,EAAS,OAAS,CAAC,EAAgB,EAAS,MAAM,CAAS,GAC5D,EAAU,OAAO,KAAO,EAAS,MAAM,IAAM,EAAgB,EAAS,MAAM,CAAS,GAClF,GAAgB,EAAU,YAAa,EAAS,MAAM,GAAK,GAAgB,EAAS,YAAa,EAAS,MAAM,CARlH,EAAS,UAAY,OAAe,GACjC,EAAS,UAAY,EAAU,QAHD,GA2CvC,SAAS,GAAa,CAAE,QAAO,UAAU,EAAQ,CAChD,GAAM,CAAE,QAAS,EACX,EAAWA,GAAe,GAC1B,EAAmB,EAAM,KAAK,CAAC,eAC/B,EAAa,EAAO,GAAoB,CAC7C,aAAc,EACd,gBAAiB,EACjB,aAAc,EACd,gBAAiB,EACjB,aAAc,EACd,CAAC,CACI,EAAa,IAAS,QAAU,GAAmB,EAAY,IAAqB,IAAK,GAE3F,IAAK,GAF2F,GAAS,CAC5G,EAAM,IAAI,OAAO,OAAO,EAAE,CAAE,EAAM,KAAK,CAAE,CAAE,eAAgB,EAAM,CAAC,CAAC,EACzD,CAAG,GACR,EAAgB,EAAO,IAAK,GAAE,CAC9B,EAAc,MAAe,EAAO,KAAK,CAAC,GAAU,CACtD,EACE,EAAwB,MAAa,CAC1C,IAAM,EAAQ,EAAY,KAAK,CAM/B,GALA,AAGC,KAFA,EAAc,SAAS,CACvB,EAAc,IAAI,IAAK,GAAE,CACT,IAAK,IAElB,EAAO,CACV,IAAM,EAAS,GAAyB,EAAO,EAAW,CAC1D,EAAgB,EAChB,EAAc,IAAI,EAAO,GAEzB,CACI,EAAkB,MAAe,CACtC,IAAM,EAAQ,EAAiB,EAAM,KAAK,CAAE,EAAK,CACjD,MAAO,CAAC,CAAC,GAAS,EAAgB,EAAM,EAAI,CAAC,CAAC,EAAc,KAAK,EAChE,CACI,EAAgB,MAAe,GAAoB,CAAC,EAAgB,KAAK,CAAE,EAAM,KAAK,CAAC,CAAE,EAAK,CAAC,CACjG,EACE,GAAoB,MAAa,CACtC,IAAM,EAAS,EAAc,KAAK,CAClC,GAAI,IAAe,IAAK,IAAK,GAAgB,EAAY,EAAO,CAAE,OAClE,GAAM,CAAE,UAAS,oBAAmB,cAAa,QAAO,gBAAiB,GAAY,EAChF,IACL,EAAa,EACP,IAAY,QAAY,EAMzB,EAAc,KAAK,EAAE,KAAK,CAC9B,KAAM,OACN,QACA,MAAO,CACN,MAAO,EACP,IAAK,EAAc,EAA8B,eACjD,CACD,CAAC,CAXF,EAAc,KAAK,EAAE,KAAK,CACzB,KAAM,OACN,QACA,CAAC,GASD,CACF,UAAa,CACZ,GAAuB,CACvB,IAAmB,CACnB,GAAe,SAAS,EClL1B,IAAI,EAAa,KACjB,SAAS,IAAmB,CAQ3B,OAPK,IACJ,EAAa,SAAS,cAAc,QAAQ,CAC5C,EAAW,MAAQ,GACnB,EAAW,QAAU,OACrB,EAAW,MAAM,QAAU,OAC3B,EAAW,YAAc,aAEnB,EAER,SAAS,GAAgB,EAAK,CAC7B,IAAM,EAAQ,IAAkB,CAC1B,EAAQ,SAAS,cAAc,QAAQ,CAG7C,MAFA,GAAM,KAAO,YACb,EAAM,QAAU,GACT,IAAI,SAAS,EAAS,IAAW,CACvC,IAAM,MAAe,CACpB,IAAM,EAAO,EAAE,CACT,EAAY,EAAM,MACxB,GAAI,EAAU,KAAM,IAAK,IAAI,EAAI,EAAG,EAAI,EAAU,KAAK,OAAQ,IAAK,CACnE,IAAM,EAAM,EAAU,KAAK,GACvB,GAAK,EAAK,KAAK,EAAI,CAExB,GAAS,CACT,EAAQ,EAAK,EAER,MAAgB,CACrB,GAAS,CACT,EAA2B,MAAM,+BAA+B,IAAM,CAAC,EAElE,MAAgB,CACrB,EAAM,oBAAoB,OAAQ,EAAO,CACzC,EAAM,oBAAoB,QAAS,EAAQ,CAC3C,EAAM,YAAY,EAAM,EAEzB,EAAM,iBAAiB,OAAQ,EAAO,CACtC,EAAM,iBAAiB,QAAS,EAAQ,CACxC,EAAM,YAAY,EAAM,CACxB,EAAM,IAAM,GACX,CAEH,SAAS,IAAmB,CAC3B,EAAa,KC9Cd,MAAM,EAAW,GAAM,IAAM,IAAK,GAAI,EAAE,CAAG,MAAM,QAAQ,EAAE,CAAG,EAAI,CAAC,EAAE,CA6BrE,SAAS,EAAqB,EAAK,CAClC,GAAM,CAAE,iBAAgB,WAAU,cAAe,EAAkB,CAAE,MAAO,EAAI,QAAS,CAAC,CACpF,EAAkB,EAAE,CACpB,EAAc,GAAW,CACzB,KAEL,OADI,OAAO,GAAW,WAAmB,MAC5B,EAAO,OAAO,EAEtB,EAAa,OAAmB,EAAQ,EAAS,CACjD,EAAc,GAAa,EAAS,QAAU,cAAgB,EAAS,QAAU,YACjF,EAAc,CAAC,GAAG,EAAQ,EAAI,QAAQ,CAAC,IAAK,IAAQ,CACzD,OAAU,CACT,IAAM,EAAS,GAAI,CACf,IAAW,GAAU,EAAE,EAAW,EAAO,EAE9C,WAAY,EACZ,EAAE,CAAE,GAAG,OAAO,QAAQ,EAAI,OAAO,CAAC,SAAS,CAAC,EAAO,KAAc,CACjE,IAAM,EAAc,GAAa,EAAS,QAAU,EACpD,MAAO,CAAC,GAAG,EAAQ,EAAS,MAAM,CAAC,IAAK,IAAQ,CAC/C,KACA,WAAY,EACZ,SAAU,EACV,EAAE,CAAE,GAAG,EAAQ,EAAS,QAAQ,CAAC,IAAK,IAAQ,CAC9C,KACA,WAAY,EACZ,EAAE,CAAC,EACH,CAAC,CAOH,OADA,EAAgB,KAAK,GAAG,EAAY,KALlB,CAAE,KAAI,aAAY,WAAY,GAAa,KAAe,MACvE,EAAW,EAAe,KAAK,CAAC,CAAE,OAE/B,EAAW,MADK,GAAI,CACS,EAAE,CAAC,CACtC,CAC+C,CAAC,CAC3C,CACN,IAAI,UAAW,CACd,OAAO,GAER,SAAU,CACT,IAAM,EAAQ,GAAU,CACpB,SAAU,cAAgB,IAAU,aAExC,CADA,EAAW,aAAa,CACxB,EAAW,YAAY,CACvB,IAAK,IAAM,KAAW,EAAiB,GAAS,GAEjD,CC/DF,SAAS,GAAkC,EAAiB,CAC3D,IAAM,EAAS,IAAI,EACf,EAAY,GAChB,MAAO,CACN,KAAK,CAAE,QAAO,eAAe,CAC5B,GAAI,EAAW,OACf,IAAM,EAAU,EAAM,GAChB,EAAmB,MAAc,EAAgB,SAAS,KAAK,CAAC,QAAQ,SAAS,IAAY,EAAE,CAAC,CAChG,EAAiB,EAAkB,EAAM,SAAU,EAAkB,EAAY,CACvF,EAAO,UAAU,CACjB,IAAK,IAAM,KAAW,EAAgB,EAAO,SAAS,IAAI,EAAK,KAAO,IAAW,CAC5E,MAAO,QACX,GAAI,CACH,IAAM,EAAO,MAAM,GAAgB,EAAQ,IAAI,CAC/C,GAAI,EAAO,QAAS,OACpB,EAAgB,KAAK,CACpB,KAAM,WACN,KAAM,CACL,UACA,GAAI,EAAQ,GACZ,UAAW,EAAQ,UACnB,SAAU,EAAQ,SAClB,CACD,OACA,CAAC,OACM,EAAO,CACf,QAAQ,MAAM,8BAA+B,EAAM,GAEnD,CAAC,EAEJ,SAAU,CACL,IACJ,EAAY,GACZ,EAAO,SAAS,GAEjB,CC9BF,SAAS,GAAsB,EAAgB,EAAS,CACvD,GAAM,CAAE,iBAAgB,WAAU,cAAe,EAAkB,CAClE,MAAO,SACP,QAAS,EACT,CAAC,CACI,MAAmB,MAAc,EAAe,KAAK,CAAC,QAAQ,CAC9D,EAAc,GAAY,EAAO,EAAgB,CAAE,UAAS,CAAC,CACnE,MAAO,CACN,IAAI,UAAW,CACd,OAAO,GAER,KAAK,EAAS,CACb,GAAI,GAAU,GAAK,YAAa,OAChC,IAAM,EAAU,GAAY,CACtB,EAAa,EAAQ,EAAS,EAAQ,CACxC,IAAe,GAAS,EAAW,EAAW,EAEnD,SAAU,CACL,GAAU,GAAK,aACnB,EAAW,YAAY,EAExB,CCtCF,SAAS,GAAe,EAAK,EAAU,CACtC,OAAO,EAAS,KAAM,GAAM,EAAE,YAAc,EAAI,WAAa,EAAE,UAAY,EAAI,SAAW,EAAE,OAAS,EAAI,KAAK,CAG/G,SAAS,GAAsB,EAAc,CAC5C,OAAO,GAAsB,CAC5B,OAAQ,EAAE,CACV,SAAU,EAAE,CACZ,EAAG,EAAS,IAAY,CACxB,GAAM,CAAE,OAAM,QAAS,EACjB,CAAE,UAAS,GAAI,EAAW,YAAW,YAAa,EAClD,EAAY,MAAM,KAAK,EAAa,WAAW,CAAC,KAAM,GAAM,EAAE,KAAO,EAAQ,CACnF,GAAI,CAAC,EAAW,OAAO,EACvB,IAAM,EAAe,EAAQ,OAAO,IAAY,EAAE,CAC5C,EAAmB,EAAQ,SAAS,IAAY,EAAE,CAClD,EAAa,EAAK,OAAQ,GAAQ,CAAC,GAAe,EAAK,EAAa,CAAC,CACrE,EAAuB,EAAiB,KAAM,GAAM,EAAE,KAAO,EAAU,CAC7E,GAAI,EAAW,SAAW,GAAK,EAAsB,OAAO,EAC5D,IAAK,IAAM,KAAO,EAAY,EAAU,OAAO,EAAI,CACnD,MAAO,CACN,GAAG,EACH,OAAQ,CACP,GAAG,EAAQ,QACV,GAAU,CAAC,GAAG,EAAc,GAAG,EAAW,CAC3C,CACD,SAAU,EAAuB,EAAQ,SAAW,CACnD,GAAG,EAAQ,UACV,GAAU,CAAC,GAAG,EAAkB,CAChC,GAAI,EACJ,YACA,WACA,CAAC,CACF,CACD,EACA,CC9BH,SAAS,GAAc,EAAc,CACpC,OAAO,GAAc,eAAe,KAAM,GAAM,EAAE,OAAS,OAAO,EAAE,cAAc,IAAI,OAEvF,SAAS,GAAkB,EAAO,CACjC,IAAM,EAAQ,GAAc,EAAM,aAAa,EAAE,KAAM,GAAM,EAAE,KAAO,EAAM,oBAAoB,CAChG,OAAO,GAAS,EAAgB,EAAM,CAAG,EAAQ,IAAK,GAWvD,SAASC,GAAY,EAAO,EAAQ,CACnC,GAAI,CAAC,EAAO,cAAgB,CAAC,GAAc,EAAM,aAAa,EAAE,OAAQ,MAAO,sBAC/E,GAAI,CAAC,EAAO,iBAAmB,CAAC,EAAO,mBAAoB,MAAO,aAClE,IAAM,EAAQ,GAAkB,EAAM,CAGtC,MAFI,CAAC,GAAS,EAAM,SAAS,SAAW,GACpC,CAAC,MAAM,KAAK,EAAO,aAAa,WAAW,CAAC,KAAM,GAAM,EAAE,KAAO,EAAM,oBAAoB,CAAS,UACjG,uBAER,SAAS,GAAe,EAAQ,CAC/B,GAAM,CAAE,kBAAiB,sBAAuB,MAAc,EAAO,KAAK,CAAC,CACvE,CAAC,GAAmB,CAAC,IACzB,GAAiB,SAAS,CAC1B,GAAoB,SAAS,CAC7B,EAAO,EAAQ,CACd,gBAAiB,IAAK,GACtB,mBAAoB,IAAK,GACzB,CAAC,EA4BH,SAAS,GAAkB,CAAE,QAAO,UAAU,CAC7C,IAAM,EAAqB,MAAeA,GAAY,EAAM,KAAK,CAAE,EAAO,KAAK,CAAC,CAAC,CAC3E,EAAoB,MAAe,EAAM,KAAK,CAAC,aAAe,EAAE,CAChE,EAAsB,MAAe,GAAkB,EAAM,KAAK,CAAC,CAAC,CAC1E,OAAO,EAAqB,CAC3B,QAAS,sBACT,YAAe,EAAmB,KAAK,CACvC,OAAQ,CACP,sBAAuB,CAAE,UAAa,CACrC,GAAe,EAAO,EACpB,CACH,aAAc,CAAE,UAAa,CAC5B,GAAe,EAAO,CACtB,IAAM,EAAe,EAAO,KAAK,CAAC,aAC5B,EAAkB,GAAsB,EAAa,CAC3D,EAAO,EAAQ,CACd,kBACA,mBAAoB,GAAkC,EAAgB,CACtE,CAAC,EACA,CACH,QAAS,EAAE,CACX,uBAAwB,CAAE,YAAe,CACxC,IAAM,EAAc,EAAkB,KAAK,CACrC,EAAQ,EAAoB,KAAK,CACjC,CAAE,sBAAuB,MAAc,EAAO,KAAK,CAAC,CAC1D,EAAmB,KAAK,CACvB,KAAM,OACN,QACA,cACA,CAAC,EACA,CACH,CACD,CAAC,CC/EH,SAAS,GAAiB,CAAE,QAAO,UAAU,CAC5C,IAAI,EACA,EAAkB,KAChB,EAAgB,MAAa,CAClC,GAAM,CAAE,gBAAiB,EAAO,KAAK,CAKrC,GAJI,IAAiB,IACrB,KAAmB,CACnB,EAAkB,KAClB,EAAmB,EACf,CAAC,GAAc,OACnB,IAAM,MAAa,CAClB,EAAO,EAAO,CAAE,YAAa,EAAa,YAAa,CAAC,EAEzD,GAAM,CACN,IAAM,EAAmB,EAAO,EAAc,aAAc,EAAK,CAC3D,EAAgB,EAAO,EAAc,UAAW,EAAK,CAC3D,MAAwB,CACvB,GAAkB,CAClB,GAAe,GAEf,CACF,UAAa,CACZ,KAAmB,CACnB,GAAe,ECxBjB,SAASC,GAAY,EAAO,EAAQ,CAGnC,MAFI,CAAC,EAAO,cAAgB,CAAC,EAAM,cAAc,IAAY,sBACzD,EAAM,kBAA0B,qBAC7B,aAiBR,SAAS,GAAuB,CAAE,QAAO,UAAU,CAClD,IAAM,EAAqB,MAAeA,GAAY,EAAM,KAAK,CAAE,EAAO,KAAK,CAAC,CAAC,CAC3E,EAAqB,MAAe,EAAO,KAAK,CAAC,aAAa,CAC9D,EAAY,MAAe,EAAM,KAAK,CAAC,cAAc,IAAI,CAC/D,OAAO,EAAqB,CAC3B,QAAS,sBACT,YAAe,EAAmB,KAAK,CACvC,OAAQ,CACP,sBAAuB,EAAE,CACzB,WAAY,CAAE,UAAa,CAC1B,IAAM,EAAK,EAAmB,KAAK,CAEnC,OADA,EAAO,EAAO,CAAE,kBAAmB,CAAC,EAAG,OAAQ,CAAC,CACzC,EAAO,EAAI,WAAc,CAC/B,EAAO,EAAO,CAAE,kBAAmB,CAAC,EAAG,OAAQ,CAAC,EAC/C,EACA,CACH,qBAAsB,CAAE,aACvB,EAAmB,KAAK,CACxB,EAAU,KAAK,KACF,EAAO,EAAO,CAAE,kBAAmB,GAAO,CAAC,EACtD,CACH,CACD,CAAC,CCjDH,eAAe,GAAc,EAAc,EAAM,EAAQ,CACxD,GAAI,aAAgB,YAAa,MAAM,GAAY,EAAc,EAAK,MACjE,GAAI,CACR,UAAW,IAAM,KAAS,EAAM,CAC/B,GAAI,GAAQ,QAAS,MAAM,EAAO,QAAU,IAAI,aAAa,UAAW,aAAa,CACrF,MAAM,GAAY,EAAc,EAAM,QAE/B,EAAG,CACX,GAAI,aAAa,cAAgB,EAAE,OAAS,cAAgB,CAAC,EAAa,SAAU,GAAI,CACvF,EAAa,OAAO,MACb,EACR,MAAM,GAGR,eAAe,GAAY,EAAc,EAAM,CAQ9C,OAPI,EAAa,UAAU,MAAM,IAAI,QAAS,GAAY,CACzD,IAAM,MAAoB,CACzB,EAAa,oBAAoB,YAAa,EAAY,CAC1D,GAAS,EAEV,EAAa,iBAAiB,YAAa,EAAY,EACtD,CACK,IAAI,SAAS,EAAS,IAAW,CACvC,IAAM,MAAoB,CACzB,GAAS,CACT,GAAS,EAEJ,EAAW,GAAU,CAC1B,GAAS,CACT,EAA2B,MAAM,8BAA8B,EAAM,OAAO,CAAC,EAExE,MAAgB,CACrB,EAAa,oBAAoB,YAAa,EAAY,CAC1D,EAAa,oBAAoB,QAAS,EAAQ,EAEnD,EAAa,iBAAiB,YAAa,EAAY,CACvD,EAAa,iBAAiB,QAAS,EAAQ,CAC/C,GAAI,CACH,EAAa,aAAa,EAAK,OACvB,EAAO,CACf,GAAS,CACT,EAAO,EAAM,GAEb,CClCH,eAAe,GAAY,EAAc,EAAO,EAAK,CAQpD,OAPI,EAAa,UAAU,MAAM,IAAI,QAAS,GAAY,CACzD,IAAM,MAAoB,CACzB,EAAa,oBAAoB,YAAa,EAAY,CAC1D,GAAS,EAEV,EAAa,iBAAiB,YAAa,EAAY,EACtD,CACK,IAAI,SAAS,EAAS,IAAW,CACvC,IAAM,MAAoB,CACzB,GAAS,CACT,GAAS,EAEJ,EAAW,GAAU,CAC1B,GAAS,CACT,EAA2B,MAAM,8BAA8B,EAAM,OAAO,CAAC,EAExE,MAAgB,CACrB,EAAa,oBAAoB,YAAa,EAAY,CAC1D,EAAa,oBAAoB,QAAS,EAAQ,EAEnD,EAAa,iBAAiB,YAAa,EAAY,CACvD,EAAa,iBAAiB,QAAS,EAAQ,CAC/C,GAAI,CACH,EAAa,OAAO,EAAO,EAAI,OACvB,EAAO,CACf,GAAS,CACT,EAAO,EAAM,GAEb,CC1CH,SAAS,GAAqB,EAAO,CAEpC,OADK,EAAM,aACJ,CAAC,EAAE,EAAM,sBAAwB,EAAM,sBADd,GAMjC,SAAS,GAAwB,EAAO,CACvC,GAAI,CAAC,GAAqB,EAAM,CAAE,MAAO,GACzC,GAAM,CAAE,gBAAiB,EACzB,GAAI,EAAa,WAAa,IAAK,GAAG,MAAO,GAC7C,IAAM,EAAa,EAAM,qBAAuB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GAClF,EAAa,EAAM,qBAAuB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GACxF,MAAO,CAAC,EAAE,GAAc,EAAgB,EAAW,EAAI,GAAc,EAAgB,EAAW,EAKjG,SAAS,GAA8B,EAAO,CAC7C,IAAM,EAAa,EAAM,qBAAuB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GACxF,GAAI,GAAc,EAAgB,EAAW,CAAE,OAAO,EAAW,SACjE,IAAM,EAAa,EAAM,qBAAuB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GACxF,GAAI,GAAc,EAAgB,EAAW,CAAE,OAAO,EAAW,SAKlE,SAAS,GAA8B,CAAE,SAAS,CACjD,OAAO,MAAa,CACnB,IAAM,EAAe,EAAM,KAAK,CAChC,GAAI,CAAC,GAAwB,EAAa,CAAE,OAC5C,IAAM,EAAW,GAA8B,EAAa,CACxD,IAAa,IAAK,IAAK,CAAC,OAAO,SAAS,EAAS,EACrD,EAAM,IAAI,CACT,GAAG,EACH,aAAc,CACb,GAAG,EAAa,aAChB,WACA,CACD,CAAC,EACD,CC1CH,MAAM,GAAyB,CAAE,aAAc,IAAK,CAwBpD,SAAS,GAAc,EAAQ,EAAkB,EAAS,GAAwB,CACjF,GAAI,EAAO,SAAW,EAAG,OACzB,IAAM,EAAe,EAAO,OAAO,CAAC,MAAM,EAAG,IAAM,EAAE,UAAY,EAAE,UAAU,CACzE,EACJ,IAAK,IAAM,KAAS,EAAkB,GAAoB,EAAM,UAAY,EAAO,eAC9E,CAAC,GAAU,EAAM,UAAY,EAAO,WAAa,EAAM,YAAc,EAAO,WAAa,GAAoB,EAAO,EAAO,IAAE,EAAS,GAE3I,OAAO,GAAU,EAAa,GAU/B,SAAS,GAAoB,EAAQ,EAAQ,CAC5C,OAAQ,EAAO,OAAS,IAAM,EAAO,QAAU,IAAM,EAAO,OAAS,IAAM,EAAO,QAAU,GCvC7F,MAAM,EAA2B,CAChC,aAAc,IACd,mBAAoB,IACpB,iBAAkB,IAClB,CAKD,SAAS,GAAe,EAAc,CACrC,OAAQ,EAAa,eAAe,KAAM,GAAM,EAAE,OAAS,QAAQ,GAAG,cAAc,IAAI,QAAU,EAAE,CAsBrG,SAAS,GAAc,CAAE,SAAS,EAAS,EAAE,CAAE,CAC9C,IAAM,EAAe,EAAO,cAAgB,EAAyB,aAC/D,EAAqB,EAAO,oBAAsB,EAAyB,mBAC3E,EAAmB,EAAO,kBAAoB,EAAyB,iBACzE,EAAkB,KAAK,KAAK,CAC5B,EAAsB,GAC1B,OAAO,MAAa,CACnB,GAAM,CAAE,eAAc,iBAAgB,uBAAsB,eAAgB,EAAM,KAAK,CAEvF,GADI,IAAgB,IAChB,CAAC,GAAgB,CAAC,EAAgB,OACtC,IAAM,EAAc,GAAe,EAAa,CAChD,GAAI,EAAY,SAAW,EAAG,OAC9B,IAAM,EAAU,EAChB,EAAsB,GACtB,IAAM,EAAU,GAAc,EAAa,EAAqB,EAAgB,EAAiB,CAAE,CAAE,eAAc,CAAC,CACpH,GAAI,CAAC,GAAW,EAAQ,KAAO,EAAsB,OACrD,IAAM,EAAe,EAAY,KAAM,GAAM,EAAE,KAAO,EAAqB,CAC3E,GAAI,CAAC,GAAgB,EAAQ,UAAY,EAAa,UAAW,CAChE,IAAM,EAAM,KAAK,KAAK,CACtB,GAAI,CAAC,GAAW,EAAM,EAAkB,EAAoB,OAC5D,EAAkB,EAEnB,EAAO,EAAO,CAAE,qBAAsB,EAAQ,GAAI,CAAC,EAClD,CC1DH,SAAS,GAAmB,EAAM,CACjC,IAAM,EAA6B,IAAI,IACvC,IAAK,IAAM,KAAS,EAAK,SAAS,sCAAsC,CAAE,CACzE,IAAM,EAAM,EAAM,GACZ,EAAQ,EAAM,IAAM,EAAM,IAAM,GAClC,GAAK,EAAW,IAAI,EAAK,EAAM,CAEpC,OAAO,EAKR,SAAS,GAAgB,EAAO,CAC/B,IAAM,EAAQ,gBAAgB,KAAK,EAAM,CAEzC,OADK,EACE,CACN,MAAO,OAAO,SAAS,EAAM,GAAI,GAAG,CACpC,OAAQ,OAAO,SAAS,EAAM,GAAI,GAAG,CACrC,CAJkB,KASpB,SAAS,GAAe,EAAO,CAC9B,IAAM,EAAM,OAAO,WAAW,EAAM,CAChC,YAAO,MAAM,EAAI,EAAI,GAAO,GAchC,OAbI,KAAK,IAAI,EAAM,OAAO,CAAG,IAAY,CACxC,mBAAoB,KACpB,qBAAsB,KACtB,CACG,KAAK,IAAI,EAAM,MAAM,CAAG,IAAY,CACvC,mBAAoB,IACpB,qBAAsB,KACtB,CACG,KAAK,IAAI,EAAM,MAAM,CAAG,IAAY,CACvC,mBAAoB,IACpB,qBAAsB,KACtB,EACG,EAAM,EAAgB,CAAE,mBAAoB,KAAK,MAAM,EAAI,CAAE,EAMlE,SAAS,EAAY,EAAQ,CAC5B,IAAM,EAAQ,EAAO,MAAM,IAAI,CAAC,IAAK,GAAM,EAAE,MAAM,CAAC,CAC9C,EAAS,EAAE,CACjB,IAAK,IAAM,KAAS,EAAW,EAAM,WAAW,QAAQ,EAAI,EAAM,WAAW,QAAQ,EAAI,EAAM,WAAW,QAAQ,CAAE,EAAO,MAAQ,EAC1H,EAAM,WAAW,QAAQ,GAAE,EAAO,MAAQ,GACnD,OAAO,EAKR,SAAS,GAAoB,EAAO,CACnC,IAAM,EAAe,EAAM,MAAM,IAAI,CAAC,IAAM,EACtC,EAAW,OAAO,WAAW,EAAa,CAChD,OAAO,OAAO,MAAM,EAAS,CAAG,EAAI,EAOrC,SAAS,GAAe,EAAO,EAAa,CAC3C,IAAM,EAAQ,qBAAqB,KAAK,EAAM,CAC9C,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EAAS,OAAO,SAAS,EAAM,GAAI,GAAG,CAC5C,GAAI,OAAO,MAAM,EAAO,CAAE,OAAO,KACjC,IAAI,EACJ,GAAI,EAAM,KAAO,IAAK,GAErB,IADA,EAAQ,OAAO,SAAS,EAAM,GAAI,GAAG,CACjC,OAAO,MAAM,EAAM,CAAE,OAAO,aACtB,IAAgB,IAAK,GAAG,EAAQ,OACtC,OAAO,KACZ,MAAO,CACN,QACA,IAAK,EAAQ,EAAS,EACtB,CAKF,SAAS,GAAoB,EAAM,CAClC,IAAM,EAAM,GAAmB,EAAK,CACpC,MAAO,CACN,IAAI,EAAK,CACR,OAAO,EAAI,IAAI,EAAI,EAEpB,OAAO,EAAK,EAAc,CACzB,IAAM,EAAQ,EAAI,IAAI,EAAI,CAC1B,GAAI,IAAU,IAAK,GAAG,OAAO,EAC7B,IAAM,EAAS,OAAO,SAAS,EAAO,GAAG,CACzC,OAAO,OAAO,MAAM,EAAO,CAAG,EAAe,GAE9C,SAAS,EAAK,EAAc,CAC3B,IAAM,EAAQ,EAAI,IAAI,EAAI,CAC1B,GAAI,IAAU,IAAK,GAAG,OAAO,EAC7B,IAAM,EAAS,OAAO,WAAW,EAAM,CACvC,OAAO,OAAO,MAAM,EAAO,CAAG,EAAe,GAE9C,QAAQ,EAAK,CACZ,OAAO,EAAI,IAAI,EAAI,GAAK,OAEzB,cAAc,EAAK,CAClB,IAAM,EAAQ,EAAI,IAAI,EAAI,CACrB,KACL,OAAO,GAAgB,EAAM,EAAI,IAAK,IAEvC,aAAa,EAAK,CACjB,IAAM,EAAQ,EAAI,IAAI,EAAI,CACrB,KACL,OAAO,GAAe,EAAM,EAE7B,CAMF,SAAS,GAAS,EAAM,EAAK,CAC5B,IAAM,EAAS,IAAI,EAAI,GAEvB,OADK,EAAK,WAAW,EAAO,CACrB,GAAoB,EAAK,MAAM,EAAO,OAAO,CAAC,CADhB,KC3HtC,SAAS,EAAW,EAAK,EAAS,CACjC,OAAO,IAAI,IAAI,EAAK,EAAQ,CAAC,KCU9B,SAAS,GAA0B,EAAM,EAAY,CACpD,IAAM,EAAU,EAAW,IACrB,EAAQ,EAAK,MAAM,QAAQ,CAC3B,EAAU,EAAE,CACZ,EAAkB,EAAE,CACpB,EAAqB,EAAE,CACzB,EAAoB,KACxB,IAAK,IAAM,KAAQ,EAAO,CACzB,IAAM,EAAU,EAAK,MAAM,CAE3B,GADI,CAAC,GAAW,EAAQ,WAAW,IAAI,EAAI,CAAC,EAAQ,WAAW,OAAO,EAClE,IAAY,WAAa,EAAQ,WAAW,kBAAkB,EAAI,EAAQ,WAAW,8BAA8B,CAAE,SACzH,IAAM,EAAa,GAAS,EAAS,cAAc,CACnD,GAAI,EAAY,CACf,IAAM,EAAO,EAAW,IAAI,OAAO,CAC7B,EAAU,EAAW,IAAI,WAAW,CACpC,EAAO,EAAW,IAAI,OAAO,CACnC,GAAI,IAAS,SAAW,GAAW,EAAM,CACxC,IAAM,EAAM,EAAW,IAAI,MAAM,CACjC,EAAgB,KAAK,CACpB,UACA,OACA,SAAU,EAAW,IAAI,WAAW,CACpC,IAAK,EAAM,EAAW,EAAK,EAAQ,CAAG,IAAK,GAC3C,QAAS,EAAW,QAAQ,UAAU,CACtC,WAAY,EAAW,QAAQ,aAAa,CAC5C,CAAC,CAEH,GAAI,IAAS,aAAe,GAAW,EAAM,CAC5C,IAAM,EAAM,EAAW,IAAI,MAAM,CAC7B,GAAK,EAAmB,KAAK,CAChC,UACA,OACA,SAAU,EAAW,IAAI,WAAW,CACpC,IAAK,EAAW,EAAK,EAAQ,CAC7B,QAAS,EAAW,QAAQ,UAAU,CACtC,WAAY,EAAW,QAAQ,aAAa,CAC5C,OAAQ,EAAW,QAAQ,SAAS,CACpC,CAAC,CAEH,SAED,IAAM,EAAiB,GAAS,EAAS,mBAAmB,CAC5D,GAAI,EAAgB,CACnB,EAAoB,CACnB,UAAW,EAAe,OAAO,YAAa,EAAE,CAChD,WAAY,EAAe,cAAc,aAAa,CACtD,OAAQ,EAAe,IAAI,SAAS,CACpC,UAAW,EAAe,aAAa,aAAa,CACpD,aAAc,EAAe,IAAI,QAAQ,CACzC,CACD,SAEG,CAAC,EAAQ,WAAW,IAAI,EAAI,IAC/B,EAAQ,KAAK,CACZ,GAAG,EACH,IAAK,EAAW,EAAS,EAAQ,CACjC,CAAC,CACF,EAAoB,MAGtB,IAAM,EAAe,EAAE,CACjB,EAAmB,EAAE,CAC3B,IAAK,IAAM,KAAU,EAAS,CAC7B,GAAI,CAAC,EAAO,OAAQ,CACnB,EAAa,KAAK,EAAO,CACzB,SAED,IAAM,EAAe,EAAY,EAAO,OAAO,CAC3C,EAAO,OAAO,MAAM,IAAI,CAAC,SAAW,GAAO,EAAa,OAAS,CAAC,EAAa,MAAO,EAAiB,KAAK,EAAO,CAClH,EAAa,KAAK,EAAO,CAG/B,IAAM,EAAc,EAAa,IAAK,GAAW,CAChD,IAAM,EAAS,EAAO,OAAS,EAAY,EAAO,OAAO,CAAG,IAAK,GAC3D,EAAQ,CACb,KAAM,QACN,GAAI,GAAY,CAChB,IAAK,EAAO,IACZ,UAAW,EAAO,UAClB,SAAU,YACV,OAAQ,EAAE,CACV,CAMD,OALI,EAAO,YAAY,QAAU,IAAK,KAAG,EAAM,MAAQ,EAAO,WAAW,OACrE,EAAO,YAAY,SAAW,IAAK,KAAG,EAAM,OAAS,EAAO,WAAW,QACvE,GAAQ,QAAO,EAAM,OAAS,CAAC,EAAO,MAAM,EAC5C,EAAO,YAAW,EAAM,UAAY,EAAO,WAC3C,EAAO,eAAc,EAAM,aAAe,EAAO,cAC9C,GACN,CACI,EAAkB,EAAiB,IAAK,GAAW,CACxD,IAAM,EAAS,EAAO,OAAS,EAAY,EAAO,OAAO,CAAG,IAAK,GACjE,MAAO,CACN,KAAM,QACN,GAAI,GAAY,CAChB,IAAK,EAAO,IACZ,UAAW,EAAO,UAClB,SAAU,YACV,OAAQ,GAAQ,MAAQ,CAAC,EAAO,MAAM,CAAG,EAAE,CAC3C,QAAS,EAAO,cAAgB,UAChC,KAAM,UACN,WAAY,KACZ,SAAU,EACV,EACA,CACI,EAAc,CAAC,GAAG,EAAgB,IAAK,GAAc,CAC1D,IAAI,EACJ,IAAK,IAAM,KAAU,EAAS,GAAI,EAAO,eAAiB,EAAU,SAAW,EAAO,OAAQ,CAC7F,IAAM,EAAS,EAAY,EAAO,OAAO,CACzC,GAAI,EAAO,MAAO,CACjB,EAAc,CAAC,EAAO,MAAM,CAC5B,OAGF,IAAM,EAAQ,CACb,KAAM,QACN,GAAI,GAAY,CAChB,IAAK,EAAU,KAAO,GACtB,QAAS,EAAU,QACnB,KAAM,EAAU,KAChB,SAAU,YACV,UAAW,EACX,WAAY,KACZ,SAAU,EACV,OAAQ,EAAE,CACV,CAKD,OAJI,EAAU,WAAU,EAAM,SAAW,EAAU,UAC/C,IAAa,EAAM,OAAS,GAC5B,EAAU,UAAS,EAAM,QAAU,EAAU,SAC7C,EAAU,aAAY,EAAM,WAAa,EAAU,YAChD,GACN,CAAE,GAAG,EAAgB,CACjB,EAAa,EAAmB,IAAK,GAAc,CACxD,IAAM,EAAQ,CACb,KAAM,OACN,GAAI,GAAY,CAChB,IAAK,EAAU,IACf,QAAS,EAAU,QACnB,MAAO,EAAU,KACjB,KAAM,YACN,SAAU,WACV,UAAW,EACX,CAKD,OAJI,EAAU,WAAU,EAAM,SAAW,EAAU,UAC/C,EAAU,SAAW,EAAU,aAAY,EAAM,QAAU,IAC3D,EAAU,aAAY,EAAM,WAAa,EAAU,YACnD,EAAU,SAAQ,EAAM,OAAS,EAAU,QACxC,GACN,CACI,EAAgB,EAAE,CACxB,GAAI,EAAY,OAAS,EAAG,CAC3B,IAAM,EAAoB,CACzB,GAAI,GAAY,CAChB,KAAM,QACN,OAAQ,EACR,CACK,EAAoB,CACzB,GAAI,GAAY,CAChB,KAAM,QACN,cAAe,CAAC,EAAkB,CAClC,CACD,EAAc,KAAK,EAAkB,CAEtC,GAAI,EAAY,OAAS,EAAG,CAC3B,IAAM,EAAoB,CACzB,GAAI,GAAY,CAChB,KAAM,QACN,OAAQ,EACR,CACK,EAAoB,CACzB,GAAI,GAAY,CAChB,KAAM,QACN,cAAe,CAAC,EAAkB,CAClC,CACD,EAAc,KAAK,EAAkB,CAEtC,GAAI,EAAW,OAAS,EAAG,CAC1B,IAAM,EAAmB,CACxB,GAAI,GAAY,CAChB,KAAM,OACN,OAAQ,EACR,CACK,EAAmB,CACxB,GAAI,GAAY,CAChB,KAAM,OACN,cAAe,CAAC,EAAiB,CACjC,CACD,EAAc,KAAK,EAAiB,CAErC,MAAO,CACN,GAAI,GAAY,CAChB,IAAK,EAAW,IAChB,UAAW,EACX,gBACA,CCjMF,SAAS,GAAc,EAAO,CAC7B,GAAM,CAAE,UAAS,qBAAsB,EACvC,MAAO,CAAC,OAAQ,WAAW,CAAC,SAAS,EAAQ,EAAI,CAAC,CAAC,EAWpD,SAAS,GAAY,EAAO,CAC3B,GAAM,CAAE,gBAAiB,EAGzB,MAFI,CAAC,GAAgB,EAAE,QAAS,GAAsB,sBAClD,OAAQ,EAAqB,WAC1B,GAAc,EAAM,CAAG,YAAc,OAc7C,SAAS,GAAoB,CAAE,SAAS,CACvC,IAAM,EAAqB,MAAe,GAAY,EAAM,KAAK,CAAC,CAAC,CACnE,OAAO,EAAqB,CAC3B,QAAS,sBACT,YAAe,EAAmB,KAAK,CACvC,OAAQ,CACP,sBAAuB,EAAE,CACzB,KAAM,EAAE,CACR,UAAW,CAAE,UAAa,CACzB,IAAM,EAAe,EAAM,KAAK,CAAC,aAC3B,EAAK,IAAI,gBAOf,OANA,EAAgB,EAAc,CAAE,OAAQ,EAAG,OAAQ,CAAC,CAAC,KAAM,GAAa,GAAgB,EAAS,CAAC,CAAC,KAAM,GAAS,CACjH,EAAO,EAAO,CAAE,aAAc,GAA0B,EAAM,EAAa,CAAE,CAAC,EAC7E,CAAC,MAAO,GAAU,CACf,kBAAiB,OAAS,EAAM,OAAS,cAC7C,MAAM,GACL,CACK,GACL,CACH,SAAU,EAAE,CACZ,CACD,CAAC,CCtDH,SAAS,GAAmB,EAAM,EAAY,CAC7C,IAAM,EAAQ,EAAK,MAAM,QAAQ,CAC3B,EAAU,EAAW,IACrB,EAAW,EAAE,CACf,EACA,EACA,EAAkB,EAClB,EACA,EAAc,EACd,EAAe,EACf,EACJ,IAAK,IAAM,KAAQ,EAAO,CACzB,IAAM,EAAU,EAAK,MAAM,CAE3B,GADI,CAAC,GAAW,EAAQ,WAAW,IAAI,EAAI,CAAC,EAAQ,WAAW,OAAO,EAClE,IAAY,WAAa,EAAQ,WAAW,kBAAkB,EAAI,EAAQ,WAAW,yBAAyB,EAAI,EAAQ,WAAW,wBAAwB,EAAI,EAAQ,WAAW,8BAA8B,CAAE,SACxN,IAAM,EAAW,GAAS,EAAS,YAAY,CAC/C,GAAI,EAAU,CACb,IAAM,EAAM,EAAS,IAAI,MAAM,CAC/B,GAAI,EAAK,CACR,EAAiB,EAAW,EAAK,EAAQ,CACzC,IAAM,EAAe,EAAS,IAAI,YAAY,CAC1C,IAAc,EAAuB,GAAe,EAAc,EAAE,EAAI,IAAK,IAElF,SAED,GAAI,EAAQ,WAAW,WAAW,CAAE,CACnC,EAAkB,GAAoB,EAAQ,MAAM,EAAE,CAAC,CACvD,SAED,GAAI,EAAQ,WAAW,oBAAoB,CAAE,CAC5C,EAAmB,GAAe,EAAQ,MAAM,GAAG,CAAE,EAAqB,EAAI,IAAK,GACnF,SAEG,OAAY,kBACZ,CAAC,EAAQ,WAAW,IAAI,EAAI,EAAkB,EAAG,CACpD,IAAM,EAAU,CACf,GAAI,WAAW,IACf,IAAK,EAAW,EAAS,EAAQ,CACjC,SAAU,EACV,UAAW,EACX,CACG,GACH,EAAQ,UAAY,EACpB,EAAuB,EAAiB,IAAM,GACxC,EAAuB,IAAK,GACnC,EAAS,KAAK,EAAQ,CACtB,GAAe,EACf,IACA,EAAkB,EAClB,EAAmB,IAAK,IAG1B,IAAM,EAAgB,EAChB,EAAiB,EAAW,OAAS,QAAU,CAAC,EAAiB,IAAK,GAAI,EAAiB,CAChG,IAAK,EACL,GAAG,EAAuB,CAAE,UAAW,EAAsB,CAAG,EAAE,CAClE,CAAG,CAAE,IAAK,GAAI,CACf,MAAO,CACN,GAAG,EACH,UAAW,EACX,SAAU,EACV,WACA,iBACA,CCrEF,SAAS,GAAW,EAAO,EAAQ,CAClC,IAAM,EAAQ,EAAiB,EAAO,EAAO,KAAK,CAElD,OADK,EACE,CAAC,EAAgB,EAAM,CADX,GAOpB,SAAS,GAA0B,EAAc,EAAe,CAC/D,IAAM,EAAU,EAAc,GAC9B,MAAO,CACN,GAAG,EACH,cAAe,EAAa,cAAc,IAAK,IAAkB,CAChE,GAAG,EACH,cAAe,EAAa,cAAc,IAAK,IAAkB,CAChE,GAAG,EACH,OAAQ,EAAa,OAAO,IAAK,GAAU,EAAM,KAAO,EAAU,EAAgB,EAAM,CACxF,EAAE,CACH,EAAE,CACH,CAYF,SAAS,GAAa,CAAE,SAAS,EAAQ,CACxC,IAAM,EAAS,IAAI,GACb,EAAU,MAAa,CAC5B,IAAM,EAAe,EAAM,KAAK,CAChC,GAAI,CAAC,GAAW,EAAc,EAAO,CAAE,OACvC,IAAM,EAAQ,EAAiB,EAAc,EAAO,KAAK,CACzD,GAAI,CAAC,EAAO,OACZ,IAAM,EAAgB,EACtB,EAAO,SAAS,IAAI,EAAK,KAAO,IAAW,CAC1C,IAAM,EAAa,GAAmB,MAAM,GAAgB,MAAM,EAAgB,EAAe,CAAE,SAAQ,CAAC,CAAC,CAAE,EAAc,CACvH,EAAS,EAAM,KAAK,CACpB,EAAsB,GAA0B,EAAO,aAAc,EAAW,CACtF,EAAM,IAAI,CACT,GAAG,EACH,aAAc,EACd,CAAC,EACA,CAAE,GAAI,EAAM,GAAI,CAAC,CAAC,EACpB,CACF,UAAa,CACZ,EAAO,UAAU,CACjB,GAAS,ECzCX,SAAS,GAAc,EAAc,EAAQ,CAC5C,IAAM,EAAU,EAAa,cAAc,KAAM,GAAQ,EAAI,OAAS,OAAO,CAC7E,GAAI,CAAC,GAAS,gBAAgB,IAAI,OAAO,OAAQ,OACjD,IAAM,EAAS,EAAQ,cAAc,GAAG,OAClC,EAAkB,EAAO,oBAAsB,EAAS,EAAO,OAAQ,GAAU,CAAC,EAAM,OAAO,CACrG,GAAI,EAAgB,SAAW,EAAG,OAClC,GAAM,CAAE,4BAA2B,qBAAqB,IAAU,EAClE,GAAI,EAA2B,CAC9B,IAAM,EAAgB,EAAgB,KAAM,GAAU,EAAM,WAAa,EAA0B,CACnG,GAAI,EAAe,OAAO,EAAc,GAEzC,GAAI,EAAoB,CACvB,IAAM,EAAe,EAAgB,KAAM,GAAU,EAAM,UAAY,GAAK,CAC5E,GAAI,EAAc,OAAO,EAAa,IAYxC,SAAS,GAAe,EAAO,EAAQ,CACtC,MAAO,CAAC,CAAC,GAAO,cAAc,eAAe,MAAM,CAAE,UAAW,IAAS,EAAO,KAAK,EAAE,gBAAgB,IAAI,OAAO,OAanH,SAAS,GAAkB,EAAO,EAAQ,CACzC,MAAO,CAAC,EAAM,EAAyB,EAAO,OAiB/C,SAAS,GAAiB,CAAE,SAAS,EAAS,CAAE,KAAM,QAAS,CAAE,CAChE,OAAO,MAAa,CACnB,IAAM,EAAe,EAAM,KAAK,CAChC,GAAI,CAAC,GAAe,EAAc,EAAO,EAAI,CAAC,GAAkB,EAAc,EAAO,CAAE,OACvF,IAAM,EAAkB,EAAa,cAAc,cAAc,MAAM,CAAE,UAAW,IAAS,EAAO,KAAK,EAAE,cAAc,IAAI,OAAO,IAAI,GACpI,GAAiB,EAAO,EAAO,EAAG,EAAyB,EAAO,OAAQ,EAAiB,CAAC,EAC/F,CAiBH,SAAS,GAAiB,CAAE,SAAS,EAAS,CAAE,KAAM,QAAS,CAAE,CAChE,OAAO,MAAa,CACnB,IAAM,EAAe,EAAM,KAAK,CAChC,GAAI,CAAC,GAAe,EAAc,EAAO,EAAI,CAAC,GAAkB,EAAc,EAAO,CAAE,OACvF,IAAM,EAAkB,EAAa,cAAc,cAAc,MAAM,CAAE,UAAW,IAAS,QAAQ,EAAE,cAAc,IAAI,OAAO,IAAI,GAChI,GAAiB,EAAO,EAAO,CAAE,qBAAsB,EAAiB,CAAC,EAC5E,CAcH,SAAS,GAAgB,CAAE,SAAS,EAAS,CAAE,KAAM,OAAQ,CAAE,CAC9D,OAAO,MAAa,CACnB,IAAM,EAAe,EAAM,KAAK,CAChC,GAAI,CAAC,GAAe,EAAc,EAAO,EAAI,CAAC,GAAkB,EAAc,EAAO,CAAE,OACvF,IAAM,EAAsB,GAAc,EAAa,aAAc,EAAO,CACxE,GAAqB,EAAO,EAAO,CAAE,sBAAqB,CAAC,EAC9D,CC/GH,SAAS,GAAqB,CAAE,QAAO,UAAU,CAChD,IAAM,EAAe,MAAe,EAAO,KAAK,CAAC,aAAa,CAC9D,OAAO,MAAa,CACnB,GAAI,EAAM,KAAK,CAAC,UAAY,IAAK,GAAG,OACpC,IAAM,EAAU,EAAa,KAAK,EAAE,SAAW,IAAK,GAChD,IAAY,IAAK,IACrB,EAAO,EAAO,CAAE,UAAS,CAAC,EACzB,CCRH,SAAS,GAAsB,EAAU,EAAO,CAC/C,GAAI,EAAS,SAAW,EAAG,MAAO,GAClC,IAAM,EAAU,EAAS,EAAS,OAAS,GAE3C,OADK,EACE,GAAO,SAAS,KAAK,CAAC,QAAQ,SAAS,KAAM,GAAM,EAAE,KAAO,EAAQ,IAAM,CAAC,EAAE,QAAQ,EAAI,GAD3E,GAStB,SAAS,GAAqB,EAAO,EAAQ,CAC5C,IAAM,EAAa,EAAM,qBAAuB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GAClF,EAAa,EAAM,qBAAuB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GASxF,MAHA,EALI,GAAc,CAAC,EAAgB,EAAW,EAC1C,GAAc,CAAC,EAAgB,EAAW,EAC1C,GAAc,EAAgB,EAAW,EACxC,CAAC,GAAsB,EAAW,SAAU,EAAO,iBAAiB,EAErE,GAAc,EAAgB,EAAW,EACxC,CAAC,GAAsB,EAAW,SAAU,EAAO,iBAAiB,EAO1E,SAAS,GAAa,EAAO,EAAQ,CACpC,MAAO,CAAC,EAAE,EAAO,aAAe,EAAM,cAKvC,SAAS,GAAgB,EAAO,EAAQ,CACvC,GAAI,CAAC,GAAa,EAAO,EAAO,CAAE,MAAO,GACzC,GAAM,CAAE,gBAAiB,EAEzB,IADK,EAAO,uBAAuB,KAAK,EAAI,EAAO,aAAa,cAAgB,QAC5E,GAAgB,EAAa,WAAa,iBAAiB,cAAe,MAAO,GACrF,IAAM,EAAgB,CAAC,CAAC,EAAM,qBACxB,EAAgB,CAAC,CAAC,EAAM,qBAK9B,GAJI,GAAiB,CAAC,EAAO,aACzB,GAAiB,CAAC,EAAO,aACzB,EAAO,kBAAkB,SAAS,KAAK,CAAC,QAAU,YAClD,EAAO,kBAAkB,SAAS,KAAK,CAAC,QAAU,YAClD,CAAC,GAAqB,EAAO,EAAO,CAAE,MAAO,GACjD,GAAI,EAAc,CACjB,IAAM,EAAa,EAAgB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GACrE,EAAa,EAAgB,EAAiB,EAAO,QAAQ,CAAG,IAAK,GACrE,EAAW,GAAc,EAAgB,EAAW,CAAG,EAAa,GAAc,EAAgB,EAAW,CAAG,EAAa,IAAK,GACxI,GAAI,GAAY,EAAS,SAAS,OAAS,EAAG,CAC7C,IAAM,EAAU,EAAS,SAAS,EAAS,SAAS,OAAS,GAC7D,GAAI,EAAa,YAAc,EAAQ,UAAW,MAAO,IAG3D,MAAO,GAOR,SAASC,GAA0B,EAAQ,CAC1C,IAAM,EAAiB,CAAC,EAAO,iBAAkB,EAAO,iBAAiB,CAAC,OAAQ,GAAU,IAAU,IAAK,IAAK,EAAM,SAAS,KAAK,CAAC,QAAU,WAAW,CAE1J,OADI,EAAe,SAAW,EAAU,QAAQ,SAAS,CAClD,QAAQ,IAAI,EAAe,IAAK,GAAU,IAAI,QAAS,GAAY,CACzE,IAAI,EACA,EAAW,GACf,EAAU,MAAa,CAClB,EAAM,SAAS,KAAK,CAAC,QAAU,aAC7B,IACJ,EAAW,GACX,GAAS,EAEV,mBAAqB,KAAW,CAAC,GAEjC,EACD,CAAC,CAAC,CAAC,SAAW,IAAK,GAAE,CAOxB,SAASC,GAAkB,EAAQ,CAClC,IAAI,EAAM,EACV,IAAK,IAAM,IAAO,CAAC,EAAO,YAAa,EAAO,YAAY,CAAE,GAAI,GAAO,EAAI,SAAS,OAAS,EAAG,CAC/F,IAAM,EAAM,EAAI,SAAS,IAAI,EAAI,SAAS,OAAS,EAAE,CACjD,EAAM,IAAK,EAAM,GAEtB,OAAO,EAMR,MAAM,GAAkB,MAAO,CAAE,iBAAiB,IAAa,CAC9D,GAAM,CAAE,eAAgB,EAGxB,GAFI,EAAY,aAAe,UAC/B,MAAMD,GAA0B,EAAc,CAC1C,EAAY,aAAe,QAAQ,OACvC,IAAM,EAAcC,GAAkB,EAAc,CAChD,EAAc,IAAG,EAAY,SAAW,GAC5C,EAAY,aAAa,CACzB,MAAM,IAAI,QAAS,GAAY,sBAAsB,EAAQ,CAAC,EAW/D,SAAS,GAAY,CAAE,QAAO,UAAU,CACvC,IAAM,EAAY,MAAe,GAAgB,EAAM,KAAK,CAAE,EAAO,KAAK,CAAC,CAAC,CACxE,EAAW,GACf,OAAO,MAAa,CACnB,GAAI,CAAC,EAAU,KAAK,CAAE,OACtB,IAAM,EAAgB,EAAO,KAAK,CAClC,GAAI,EAAU,CACb,IAAK,EAAc,uBAAuB,KAAK,EAAI,EAAc,aAAa,cAAgB,OAAQ,OACtG,EAAW,GAEZ,EAAW,GACX,GAAgB,CAAE,gBAAe,CAAE,EAAE,CAAC,CAAC,MAAO,GAAU,QAAQ,MAAM,8BAA+B,EAAM,CAAC,EAC3G,CC9HH,SAAS,IAAsB,CAC9B,OAAO,OAAO,YAAgB,IAM/B,SAAS,IAA6B,CACrC,OAAO,OAAO,mBAAuB,IActC,SAAS,GAAkB,EAAU,EAAE,CAAE,CACxC,GAAM,CAAE,gBAAgB,IAAU,EAClC,GAAI,GAAiB,IAA4B,CAAE,OAAO,IAAI,mBAC9D,GAAI,IAAqB,CAAE,OAAO,IAAI,YACtC,MAAU,MAAM,mCAAmC,CAkBpD,SAAS,GAAkB,EAAa,EAAc,CACrD,GAAI,IAA4B,EAAI,aAAuB,mBAO1D,MANA,GAAa,sBAAwB,GACrC,EAAa,UAAY,EAKlB,CACN,IAAK,GACL,WANoB,CACpB,EAAa,UAAY,KACzB,EAAa,MAAM,EAKnB,CAEF,IAAM,EAAM,IAAI,gBAAgB,EAAY,CAO5C,MANA,GAAa,IAAM,EAMZ,CACN,MACA,WAPoB,CACpB,EAAa,gBAAgB,MAAM,CACnC,EAAa,MAAM,CACnB,IAAI,gBAAgB,EAAI,EAKxB,CAaF,SAAS,GAAmB,EAAa,EAAW,CACnD,GAAI,EAAY,aAAe,OAAQ,MAAU,MAAM,0BAA0B,CACjF,GAAI,CAAC,GAAiB,EAAU,CAAE,MAAU,MAAM,wBAAwB,IAAY,CACtF,OAAO,EAAY,gBAAgB,EAAU,CAa9C,SAAS,GAAiB,EAAW,CAEpC,OADK,IAAqB,CACnB,YAAY,gBAAgB,EAAU,CADV,GAuBpC,SAAS,GAA6B,EAAa,EAAa,CAC/D,IAAM,EAAa,EAAO,EAAY,WAAW,CAC3C,MAAe,EAAW,IAAI,EAAY,WAAW,CACrD,EAAU,CAAE,OAAQ,EAAa,CAIvC,OAHA,EAAY,iBAAiB,aAAc,EAAQ,EAAQ,CAC3D,EAAY,iBAAiB,cAAe,EAAQ,EAAQ,CAC5D,EAAY,iBAAiB,cAAe,EAAQ,EAAQ,CACrD,EC/HR,SAAS,GAAiB,CAAE,QAAO,UAAU,CAC5C,IAAM,EAAkB,IAAI,gBACtB,EAAqB,MAAe,EAAO,KAAK,CAAC,aAAa,CAC9D,EAAwB,MAAe,EAAM,KAAK,CAAC,cAAc,IAAI,CACrE,EAAiB,MAAe,CAAC,CAAC,EAAmB,KAAK,EAAI,CAAC,CAAC,EAAsB,KAAK,CAAC,CAC5F,EAAwB,MAAe,EAAmB,KAAK,EAAE,IAAI,CACrE,EAAoB,MAAe,EAAO,KAAK,CAAC,YAAY,CAC5D,EAAoB,MAAe,CAAC,EAAsB,KAAK,CAAC,CAChE,EAAgB,MAAa,CAClC,GAAI,CAAC,EAAe,KAAK,EAAI,CAAC,EAAkB,KAAK,CAAE,OACvD,IAAM,EAAe,EAAmB,KAAK,CACvC,CAAE,UAAW,EACb,EAAc,GAAkB,CAAE,cAAe,GAAM,CAAC,CACxD,EAAwB,GAA6B,EAAa,EAAO,CAC/E,GAAkB,EAAa,EAAa,CAC5C,IAAM,EAA4B,MAAa,CACxC,EAAkB,KAAK,EAAI,EAAsB,KAAK,GAAK,QACjE,EAAO,IAAI,OAAO,OAAO,EAAE,CAAE,EAAO,KAAK,CAAE,CAC1C,cACA,wBACA,CAAC,CAAC,EACF,CACF,UAAa,CACZ,GAA2B,GAE3B,CACF,UAAa,CACZ,GAAiB,OAAO,CACxB,GAAe,ECpCjB,SAAS,GAAiB,EAAU,CACnC,IAAM,EAAS,EAAE,CACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,EAAO,KAAK,CACrD,MAAO,EAAS,MAAM,EAAE,CACxB,IAAK,EAAS,IAAI,EAAE,CACpB,CAAC,CACF,OAAO,EAER,SAAS,GAAe,EAAS,CAAE,aAAY,gBAAgB,CAC9D,OAAO,IAAI,EAAK,KAAO,IAAe,CACrC,IAAM,EAAM,GAAY,CAGxB,OAFI,EAAW,QAAgB,GAC/B,MAAM,GAAc,EAAc,EAAQ,KAAK,CACxC,CACN,GAAG,EACH,YAAa,EAAQ,KAAK,QAC1B,GACA,CAEH,SAAS,GAAkB,EAAS,CAAE,aAAY,eAAc,cAAc,CAC7E,OAAO,IAAI,EAAK,KAAO,IAAe,CACrC,IAAM,EAAM,GAAY,CACxB,GAAI,EAAW,QAAS,OAAO,EAC/B,GAAM,CAAE,QAAS,EAEX,EAAW,EAAI,SAAS,OAAQ,GAAM,KAAK,IAAI,EAAE,UAAY,EAAK,UAAU,EAAI,KAAQ,CAc9F,OAbM,EAAQ,gBAAgB,aAAc,EAAW,CACtD,GAAG,EACH,SAAU,CAAC,GAAG,EAAU,CACvB,GAAI,EAAK,GACT,UAAW,EAAK,UAChB,SAAU,EAAK,SACf,QAAS,EAAK,QACd,GAAG,EAAK,iBAAmB,IAAK,IAAK,CAAE,eAAgB,EAAK,eAAgB,CAC5E,QAAS,GACT,CAAC,CACF,eAAgB,EAAI,eACpB,CAAC,CACF,MAAM,GAAc,EAAc,EAAQ,KAAM,EAAW,CACpD,CACN,GAAG,EACH,SAAU,CAAC,GAAG,EAAU,CACvB,GAAI,EAAK,GACT,UAAW,EAAK,UAChB,SAAU,EAAK,SACf,QAAS,EAAK,QACd,GAAG,EAAK,iBAAmB,IAAK,IAAK,CAAE,eAAgB,EAAK,eAAgB,CAC5E,CAAC,CACF,eAAgB,GAAiB,EAAa,SAAS,CACvD,EACA,CAEH,SAAS,GAAW,EAAS,CAAE,aAAY,gBAAgB,CAC1D,OAAO,IAAI,EAAK,KAAO,IAAe,CACrC,IAAM,EAAM,GAAY,CACxB,GAAI,EAAW,QAAS,OAAO,EAC/B,MAAM,GAAY,EAAc,EAAQ,MAAO,EAAQ,IAAI,CAC3D,IAAM,EAAiB,GAAiB,EAAa,SAAS,CACxD,EAAW,EAAI,SAAS,OAAQ,GAAM,CAC3C,IAAM,EAAW,EAAE,UAAY,EAAE,SAAW,EAC5C,OAAO,EAAe,KAAM,GAAM,GAAY,EAAE,OAAS,EAAW,EAAE,IAAI,EACzE,CACF,MAAO,CACN,GAAG,EACH,SAAU,EACV,iBACA,EACA,CAEH,MAAM,GAAuB,CAC5B,cAAe,GACf,iBAAkB,GAClB,OAAQ,GACR,CACD,SAAS,GAAc,EAAS,EAAS,CACxC,IAAM,EAAU,GAAqB,EAAQ,MAC7C,OAAO,EAAQ,EAAS,EAAQ,CAEjC,SAAS,GAAwB,EAAc,EAAgB,CAC9D,IAAM,EAAe,GAAM,CACpB,aAAa,OAAS,EAAE,OAAS,cAAe,QAAQ,MAAM,iCAAkC,EAAE,EAEnG,GAAa,EAAK,CAAE,aAAY,aAAY,aAAY,YAAa,CAC1E,EAAW,WAAW,CACtB,IAAM,EAAO,GAAc,EAAK,CAC/B,aACA,eACA,aACA,CAAC,CACF,EAAO,SAAS,EAAK,CAAC,KAAK,EAAY,EAAY,EAEpD,OAAO,GAAmB,CACzB,WAAc,IAAI,EAClB,QAAS,OACT,QAAS,CACR,SAAU,EAAE,CACZ,eAAgB,EAAE,CAClB,YAAa,IAAK,GAClB,GAAG,EACH,CACD,OAAQ,CACP,KAAM,CAAE,GAAI,CACX,cAAe,EACf,iBAAkB,EAClB,OAAQ,EACR,OAAQ,EAAK,CAAE,aAAY,aAAY,aAAY,YAAa,CAC/D,GAAM,CAAE,YAAa,EACjB,EAAS,SAAW,IACxB,EAAW,WAAW,CACtB,EAAS,QAAS,GAAQ,CACzB,IAAM,EAAO,GAAc,EAAK,CAC/B,aACA,eACA,aACA,CAAC,CACF,EAAO,SAAS,EAAK,CAAC,KAAK,EAAY,EAAY,EAClD,GAEH,CAAE,CACH,SAAU,CACT,UAAW,OACX,GAAI,CAAE,QAAS,EAAG,CAAE,YAAa,CAChC,EAAO,UAAU,EACf,CACH,CACD,CACD,CAAC,CC5HH,MAAM,GAAiB,CACtB,MAAO,mBACP,MAAO,mBACP,CAWD,SAAS,GAAe,EAAO,CAC9B,IAAM,EAAc,EAAM,QAAQ,KAAK,IAAI,EAAI,GAC/C,MAAO,GAAG,EAAM,SAAS,YAAY,EAAY,GAkBlD,SAAS,GAAmB,CAAE,QAAO,UAAU,CAC9C,IAAM,EAA0B,MAAe,CAC9C,GAAM,CAAE,gBAAiB,EAAM,KAAK,CAEpC,MADI,CAAC,GAAgB,EAAE,kBAAmB,GAAsB,EAAE,CAC3D,EAAa,cAAc,KAAK,CAAE,UAAW,EAAK,CAAC,OAAQ,GAAS,IAAS,SAAW,IAAS,QAAQ,EAC/G,CACI,EAAiB,MAAe,CACrC,IAAM,EAAQ,EAAwB,KAAK,CAC3C,GAAI,CAAC,EAAO,KAAK,CAAC,aAAe,EAAM,SAAW,EAAG,MAAO,GAC5D,IAAM,EAAI,EAAM,KAAK,CACrB,OAAO,EAAM,MAAO,GAAS,CAC5B,IAAM,EAAQ,EAAiB,EAAG,EAAK,CACvC,OAAO,GAAS,EAAgB,EAAM,EAAI,CAAC,CAAC,EAAM,QAAQ,QACzD,EACD,CACI,EAAoB,MAAe,CACxC,IAAM,EAAI,EAAO,KAAK,CACtB,OAAO,EAAwB,KAAK,CAAC,MAAO,GAAS,CAAC,EAAE,GAAgB,IAAO,EAC9E,CACF,OAAO,MAAa,CACnB,GAAI,CAAC,EAAe,KAAK,EAAI,CAAC,EAAkB,KAAK,CAAE,OACvD,IAAM,EAAI,EAAM,KAAK,CACf,EAAI,EAAO,KAAK,CAChB,EAAQ,EAAE,CAChB,IAAK,IAAM,KAAQ,EAAwB,KAAK,CAAE,CACjD,IAAM,EAAQ,EAAiB,EAAG,EAAK,CACjC,EAAS,GAAmB,EAAE,YAAa,GAAe,EAAM,CAAC,CACvE,EAAM,GAAgB,IAAS,EAC/B,EAAM,GAAe,IAAS,GAAwB,EAAO,CAE9D,EAAO,EAAQ,EAAM,EACpB,CCpEH,SAAS,GAAmB,EAAO,CAClC,IAAM,EAAK,SAAS,cAAc,QAAQ,CAO1C,MANA,GAAG,GAAK,EAAM,GACd,EAAG,KAAO,EAAM,KAChB,EAAG,MAAQ,EAAM,MACjB,EAAG,gBAAgB,iBAAkB,GAAK,CACtC,EAAM,WAAU,EAAG,QAAU,EAAM,UACnC,EAAM,UAAS,EAAG,QAAU,IACzB,EAER,SAAS,GAAmB,EAAc,CACzC,OAAO,GAAc,eAAe,KAAM,GAAM,EAAE,OAAS,OAAO,EAAE,cAAc,IAAI,OAEvF,SAAS,GAAU,EAAY,EAAY,CAC1C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,OAAQ,IAAK,CAC3C,IAAM,EAAQ,EAAW,GACrB,EAAM,OAAS,aAAe,EAAM,OAAS,aACjD,EAAM,KAAO,EAAM,KAAO,EAAa,UAAY,aAoBrD,SAAS,GAAe,CAAE,QAAO,UAAU,CAC1C,IAAM,EAAqB,MAAe,EAAO,KAAK,CAAC,aAAa,CAC9D,EAAwB,MAAe,GAAmB,EAAM,KAAK,CAAC,aAAa,CAAE,CAAE,OAAO,EAAgB,EAAgB,CAInI,OAHI,IAAmB,EAAuB,GAC1C,OAAO,GAAmB,OAAO,GACjC,GAAgB,SAAW,GAAgB,OAAe,GACvD,CAAC,CAAC,GAAkB,EAAe,MAAO,GAAkB,GAAgB,KAAM,GAAkB,EAAc,KAAO,EAAc,GAAG,CAAC,EAChJ,CAAC,CACE,EAA4B,MAAe,EAAM,KAAK,CAAC,oBAAoB,CAC3E,EAAyB,MAAe,CAAC,CAAC,EAAmB,KAAK,EAAI,CAAC,CAAC,EAAsB,KAAK,EAAE,OAAO,CAClH,OAAO,EAAqB,CAC3B,QAAS,sBACT,YAAe,EAAuB,KAAK,CAAG,SAAW,sBACzD,OAAQ,CACP,sBAAuB,EAAE,CACzB,SAAU,CACT,UAAa,CACZ,IAAM,EAAe,EAAmB,KAAK,CAE7C,OADA,EAAsB,KAAK,CAAC,QAAS,GAAU,EAAa,YAAY,GAAmB,EAAM,CAAC,CAAC,KACtF,CACZ,EAAa,iBAAiB,gEAAoE,CAAC,QAAS,GAAY,EAAQ,QAAQ,CAAC,CACzI,EAAO,EAAO,CAAE,oBAAqB,IAAK,GAAG,CAAC,GAGhD,YAAe,CACd,IAAM,EAAe,MAAc,EAAmB,KAAK,CAAC,CACtD,EAAa,EAA0B,KAAK,CAClD,GAAU,EAAa,WAAY,EAAW,CAC9C,IAAI,EAAc,eAAiB,CAClC,EAAc,IAAK,IACjB,EAAE,CAUC,EAAW,EAAO,EAAa,WAAY,aAT1B,CACtB,GAAI,EAAa,CAChB,GAAU,EAAa,WAAY,MAAc,EAA0B,KAAK,CAAC,CAAC,CAClF,OAED,IAAM,EAAQ,MAAM,KAAK,EAAa,WAAW,CAAC,KAAM,GAAM,EAAE,OAAS,YAAc,EAAE,OAAS,aAAe,EAAE,OAAS,YAAY,EAAE,GACtI,IAAU,MAAc,EAA0B,KAAK,CAAC,EAC5D,EAAO,EAAO,CAAE,oBAAqB,EAAO,CAAC,EAEsB,CACpE,UAAa,CACZ,aAAa,GAAe,IAAK,GAAE,CACnC,GAAU,GAGZ,CACD,CACD,CAAC,CCnFH,SAAS,GAAkB,EAAO,EAAQ,CACzC,MAAO,CAAC,EAAE,EAAO,aAAe,EAAM,cAAgB,GAAwB,EAAM,aAAa,EAKlG,SAAS,GAAkB,EAAQ,CAClC,IAAI,EAAS,EACP,EAAU,CAAC,EAAO,kBAAmB,EAAO,kBAAkB,CAAC,OAAQ,GAAQ,IAAQ,IAAK,GAAE,CACpG,IAAK,IAAM,KAAU,EAAS,CAC7B,GAAM,CAAE,YAAa,EACrB,GAAI,EAAS,OAAS,EAAG,CACxB,IAAM,EAAM,EAAS,IAAI,EAAS,OAAS,EAAE,CACzC,EAAM,IAAQ,EAAS,IAG7B,OAAO,EAKR,SAAS,GAAqB,EAAO,EAAQ,CAC5C,GAAI,CAAC,GAAkB,EAAO,EAAO,CAAE,MAAO,GAC9C,GAAM,CAAE,eAAgB,EAClB,CAAE,gBAAiB,EACzB,IAAK,EAAO,uBAAuB,KAAK,EAAI,EAAO,aAAa,cAAgB,OAAQ,MAAO,GAC/F,IAAM,EAAW,EAAa,SAE9B,MADI,CAAC,OAAO,SAAS,EAAS,EAAI,OAAO,MAAM,EAAS,EAAI,GAAY,EAAU,GAC3E,OAAO,MAAM,EAAY,SAAS,CAQ1C,SAAS,GAA0B,EAAQ,CAC1C,IAAM,EAAW,CAAC,EAAO,kBAAmB,EAAO,kBAAkB,CAAC,OAAQ,GAAQ,GAAK,WAAa,GAAK,CAE7G,OADI,EAAS,SAAW,EAAU,QAAQ,SAAS,CAC5C,QAAQ,IAAI,EAAS,IAAK,GAAQ,IAAI,QAAS,GAAY,EAAI,iBAAiB,gBAAmB,GAAS,CAAE,CAAE,KAAM,GAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAW,IAAK,GAAE,CAK3J,SAAS,GAAe,CAAE,QAAO,UAAU,CAC1C,IAAI,EAAY,GACZ,EAAU,GACR,EAAgB,MAAa,CAClC,IAAM,EAAe,EAAM,KAAK,CAC1B,EAAgB,EAAO,KAAK,CAClC,GAAI,CAAC,GAAqB,EAAc,EAAc,EAAI,EAAS,OACnE,GAAM,CAAE,eAAgB,EACxB,EAAU,GACV,GAA0B,EAAc,CAAC,SAAW,CACnD,GAAI,GAAa,EAAY,aAAe,OAAQ,OACpD,IAAI,EAAW,EAAa,aAAa,SACnC,EAAiB,GAAkB,EAAc,CACnD,EAAiB,IAAU,EAAW,GAC1C,EAAY,SAAW,GACtB,CAAC,YAAc,CAChB,EAAU,IACT,EACD,CACF,UAAa,CACZ,EAAY,GACZ,GAAe,EClBjB,SAAS,GAAqB,EAAS,EAAE,CAAE,CAC1C,IAAM,EAAQ,EAAO,CAAE,eAAgB,CACtC,aAAc,EACd,gBAAiB,EACjB,aAAc,EACd,gBAAiB,EACjB,aAAc,EACd,CAAE,CAAC,CACE,EAAS,EAAO,EAAE,CAAC,CACnB,EAAW,CAChB,GAAqB,CACpB,QACA,SACA,CAAC,CACF,GAAuB,CACtB,QACA,SACA,CAAC,CACF,GAAoB,CAAE,QAAO,CAAC,CAC9B,GAAiB,CAAE,QAAO,CAAE,CAC3B,KAAM,QACN,GAAG,EAAO,mBAAqB,IAAK,IAAK,CAAE,iBAAkB,EAAO,iBAAkB,CACtF,CAAC,CACF,GAAiB,CAAE,QAAO,CAAE,CAC3B,KAAM,QACN,GAAG,EAAO,yBAA2B,IAAK,IAAK,CAAE,uBAAwB,EAAO,uBAAwB,CACxG,CAAC,CACF,GAAgB,CAAE,QAAO,CAAE,CAC1B,KAAM,OACN,GAAG,EAAO,4BAA8B,IAAK,IAAK,CAAE,0BAA2B,EAAO,0BAA2B,CACjH,GAAG,EAAO,sBAAwB,IAAK,IAAK,CAAE,oBAAqB,EAAO,oBAAqB,CAC/F,GAAG,EAAO,qBAAuB,IAAK,IAAK,CAAE,mBAAoB,EAAO,mBAAoB,CAC5F,CAAC,CACF,GAAa,CAAE,QAAO,CAAE,CAAE,KAAM,QAAS,CAAC,CAC1C,GAAa,CAAE,QAAO,CAAE,CAAE,KAAM,QAAS,CAAC,CAC1C,GAAa,CAAE,QAAO,CAAE,CAAE,KAAM,OAAQ,CAAC,CACzC,GAA8B,CAAE,QAAO,CAAC,CACxC,GAAiB,CAChB,QACA,SACA,CAAC,CACF,GAAe,CACd,QACA,SACA,CAAC,CACF,GAAmB,CAClB,QACA,SACA,CAAC,CACF,GAAiB,CAChB,QACA,SACA,CAAC,CACF,GAAc,CAAE,QAAO,CAAE,EAAO,mBAAqB,IAAK,GAAoD,EAAE,CAAlD,CAAE,iBAAkB,EAAO,iBAAkB,CAAM,CACjH,GAAa,CACZ,QACA,SACA,CAAE,CAAE,KAAM,QAAS,CAAC,CACrB,GAAa,CACZ,QACA,SACA,CAAE,CAAE,KAAM,QAAS,CAAC,CACrB,GAAY,CACX,QACA,SACA,CAAC,CACF,GAAe,CACd,QACA,SACA,CAAC,CACF,GAAkB,CACjB,QACA,SACA,CAAC,CACF,CACD,MAAO,CACN,QACA,SACA,YAAe,CACd,EAAS,QAAS,GAAY,OAAO,GAAY,WAAa,GAAS,CAAG,EAAQ,SAAS,CAAC,CAC5F,IAAK,IAAM,KAAS,OAAO,OAAO,EAAO,KAAK,CAAC,CAAwB,OAAO,GAAU,UAAnC,GAA+C,OAAO,EAAM,SAAY,YAAY,EAAM,SAAS,CACxJ,IAAkB,EAEnB,CCnHF,SAAS,GAAc,EAAW,CACjC,MAAM,UAAqB,CAAU,CACpC,GACA,GACA,GAAW,GAEX,GAAqB,KACrB,YAAY,GAAG,EAAM,CACpB,MAAM,GAAG,EAAK,CACd,GAAM,CAAE,UAAW,IAAO,IAAM,EAAE,CAClC,MAAA,EAAe,EACf,MAAA,EAAe,GAAqB,EAAO,CAE5C,IAAI,QAAS,CACZ,OAAO,MAAA,EAER,OAAO,EAAc,CACpB,MAAM,SAAS,EAAa,CAC5B,EAAO,MAAA,EAAa,OAAQ,CAAE,eAAc,CAAC,CAE9C,QAAS,CACR,MAAA,GAAyB,CACzB,EAAO,MAAA,EAAa,OAAQ,CAAE,aAAc,IAAK,GAAG,CAAC,CACrD,MAAM,UAAU,CAEjB,SAAU,CACT,MAAA,GAAyB,CACzB,MAAA,EAAa,SAAS,CAEvB,IAAI,SAAU,CACb,OAAO,MAAA,EAER,IAAI,QAAQ,EAAO,CAClB,MAAA,EAAgB,EACZ,GAAO,EAAO,MAAA,EAAa,MAAO,CAAE,QAAS,EAAO,CAAC,CAE1D,IAAI,KAAM,CACT,OAAO,MAAA,EAAa,MAAM,KAAK,CAAC,cAAc,KAAO,GAEtD,IAAI,IAAI,EAAO,CACd,IAAM,EAAmB,MAAA,EAAa,OAAO,KAAK,CAAC,aACnD,MAAA,GAAyB,CACzB,MAAA,EAAa,SAAS,CACtB,MAAA,EAAe,GAAqB,MAAA,EAAa,CAC7C,MAAA,GAAe,EAAO,MAAA,EAAa,MAAO,CAAE,QAAS,MAAA,EAAe,CAAC,CACrE,GAAkB,EAAO,MAAA,EAAa,OAAQ,CAAE,aAAc,EAAkB,CAAC,CACjF,GAAO,EAAO,MAAA,EAAa,MAAO,CAAE,aAAc,CAAE,IAAK,EAAO,CAAE,CAAC,CAExE,MAAO,CACN,GAAM,CAAE,gBAAiB,MAAA,EAAa,OAAO,KAAK,CAGlD,OAFK,GACL,EAAO,MAAA,EAAa,MAAO,CAAE,kBAAmB,GAAM,CAAC,CAChD,EAAa,MAAM,CAAC,MAAO,GAAQ,CACzC,GAAI,KAAK,IAAK,OAAO,IAAI,SAAS,EAAS,IAAW,CACrD,IAAM,MAAiB,CACtB,MAAA,EAA0B,KAC1B,EAAa,MAAM,CAAC,KAAK,EAAS,EAAO,EAE1C,MAAA,EAA0B,EAC1B,EAAa,iBAAiB,YAAa,EAAU,CAAE,KAAM,GAAM,CAAC,EACnE,CACF,MAAM,GACL,EAZwB,QAAQ,OAA2B,MAAM,sCAAsC,CAAC,CAc3G,IAAqB,CACpB,GAAI,CAAC,MAAA,EAAyB,OAC9B,GAAM,CAAE,gBAAiB,MAAA,EAAa,OAAO,KAAK,CAClD,GAAc,oBAAoB,YAAa,MAAA,EAAwB,CACvE,MAAA,EAA0B,MAG5B,OAAO,ECzFR,IAAI,GAAiB,cAAc,GAAc,EAAqB,AAAC,GCC1D,GAAb,cAAoC,EAAiB,EAAmB,QAAS,GAAe,CAAC,AAAC,GCGlG,EAJA,cAA2C,EAAe,qBAC9B,qBAGK"}