@omerdlw/base-framework 1.0.6 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/atoms/index.js +1 -103
  2. package/dist/atoms/index.js.map +1 -1
  3. package/dist/chunk-3BUP64Q6.js +105 -0
  4. package/dist/chunk-3BUP64Q6.js.map +1 -0
  5. package/dist/chunk-4GMQKD6F.js +353 -0
  6. package/dist/chunk-4GMQKD6F.js.map +1 -0
  7. package/dist/chunk-6SG7V77J.js +577 -0
  8. package/dist/chunk-6SG7V77J.js.map +1 -0
  9. package/dist/chunk-6ZJVLUBE.js +26 -0
  10. package/dist/chunk-6ZJVLUBE.js.map +1 -0
  11. package/dist/chunk-7HQMXTNP.js +419 -0
  12. package/dist/chunk-7HQMXTNP.js.map +1 -0
  13. package/dist/chunk-7TAVYJ3A.js +371 -0
  14. package/dist/chunk-7TAVYJ3A.js.map +1 -0
  15. package/dist/chunk-A5RE3F6O.js +9905 -0
  16. package/dist/chunk-A5RE3F6O.js.map +1 -0
  17. package/dist/chunk-AQ4BNXA2.js +349 -0
  18. package/dist/chunk-AQ4BNXA2.js.map +1 -0
  19. package/dist/chunk-CGHZSSFR.js +2166 -0
  20. package/dist/chunk-CGHZSSFR.js.map +1 -0
  21. package/dist/chunk-DGCQWQLZ.js +61 -0
  22. package/dist/chunk-DGCQWQLZ.js.map +1 -0
  23. package/dist/chunk-FIMPHODX.js +67 -0
  24. package/dist/chunk-FIMPHODX.js.map +1 -0
  25. package/dist/chunk-GF7TUX5I.js +1889 -0
  26. package/dist/chunk-GF7TUX5I.js.map +1 -0
  27. package/dist/chunk-JELG4JLT.js +454 -0
  28. package/dist/chunk-JELG4JLT.js.map +1 -0
  29. package/dist/chunk-K676GL7Z.js +51 -0
  30. package/dist/chunk-K676GL7Z.js.map +1 -0
  31. package/dist/chunk-QI3ALLIB.js +38 -0
  32. package/dist/chunk-QI3ALLIB.js.map +1 -0
  33. package/dist/chunk-QXR55VVS.js +1139 -0
  34. package/dist/chunk-QXR55VVS.js.map +1 -0
  35. package/dist/chunk-R2YGFJDJ.js +408 -0
  36. package/dist/chunk-R2YGFJDJ.js.map +1 -0
  37. package/dist/chunk-RFZQWLC5.js +27 -0
  38. package/dist/chunk-RFZQWLC5.js.map +1 -0
  39. package/dist/chunk-SKBITB5X.js +888 -0
  40. package/dist/chunk-SKBITB5X.js.map +1 -0
  41. package/dist/chunk-SYAVGTOX.js +521 -0
  42. package/dist/chunk-SYAVGTOX.js.map +1 -0
  43. package/dist/chunk-TV3WEF5G.js +784 -0
  44. package/dist/chunk-TV3WEF5G.js.map +1 -0
  45. package/dist/chunk-XASQT4CQ.js +280 -0
  46. package/dist/chunk-XASQT4CQ.js.map +1 -0
  47. package/dist/error/index.js +5 -682
  48. package/dist/error/index.js.map +1 -1
  49. package/dist/error/reporter.d.ts.map +1 -1
  50. package/dist/error/theme.d.ts +1 -1
  51. package/dist/error/theme.d.ts.map +1 -1
  52. package/dist/events.js +1 -7
  53. package/dist/events.js.map +1 -1
  54. package/dist/hooks/index.js +1 -358
  55. package/dist/hooks/index.js.map +1 -1
  56. package/dist/hooks/use-global-event.d.ts +1 -1
  57. package/dist/index.js +18 -20029
  58. package/dist/index.js.map +1 -1
  59. package/dist/kernel/index.js +2 -2035
  60. package/dist/kernel/index.js.map +1 -1
  61. package/dist/kernel/types.d.ts +1 -1
  62. package/dist/modules/ambient/analyze.d.ts +46 -0
  63. package/dist/modules/ambient/analyze.d.ts.map +1 -0
  64. package/dist/modules/ambient/constants.d.ts +1 -5
  65. package/dist/modules/ambient/constants.d.ts.map +1 -1
  66. package/dist/modules/ambient/context.d.ts.map +1 -1
  67. package/dist/modules/ambient/dom.d.ts +11 -12
  68. package/dist/modules/ambient/dom.d.ts.map +1 -1
  69. package/dist/modules/ambient/extractor.d.ts +10 -10
  70. package/dist/modules/ambient/extractor.d.ts.map +1 -1
  71. package/dist/modules/ambient/hooks.d.ts +1 -1
  72. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  73. package/dist/modules/ambient/index.d.ts +6 -4
  74. package/dist/modules/ambient/index.d.ts.map +1 -1
  75. package/dist/modules/ambient/index.js +7 -762
  76. package/dist/modules/ambient/index.js.map +1 -1
  77. package/dist/modules/ambient/module.d.ts +1 -1
  78. package/dist/modules/ambient/module.d.ts.map +1 -1
  79. package/dist/modules/ambient/oklab.d.ts +36 -0
  80. package/dist/modules/ambient/oklab.d.ts.map +1 -0
  81. package/dist/modules/ambient/pipeline.d.ts +28 -0
  82. package/dist/modules/ambient/pipeline.d.ts.map +1 -0
  83. package/dist/modules/ambient/quantize.d.ts +22 -0
  84. package/dist/modules/ambient/quantize.d.ts.map +1 -0
  85. package/dist/modules/ambient/server/address.d.ts +8 -0
  86. package/dist/modules/ambient/server/address.d.ts.map +1 -0
  87. package/dist/modules/ambient/server/index.d.ts +53 -0
  88. package/dist/modules/ambient/server/index.d.ts.map +1 -0
  89. package/dist/modules/ambient/server/index.js +221 -0
  90. package/dist/modules/ambient/server/index.js.map +1 -0
  91. package/dist/modules/ambient/settings.d.ts +19 -0
  92. package/dist/modules/ambient/settings.d.ts.map +1 -0
  93. package/dist/modules/ambient/types.d.ts +105 -9
  94. package/dist/modules/ambient/types.d.ts.map +1 -1
  95. package/dist/modules/ambient/worker/index.d.ts +15 -0
  96. package/dist/modules/ambient/worker/index.d.ts.map +1 -0
  97. package/dist/modules/ambient/worker/index.js +114 -0
  98. package/dist/modules/ambient/worker/index.js.map +1 -0
  99. package/dist/modules/background/constants.d.ts +2 -2
  100. package/dist/modules/background/constants.d.ts.map +1 -1
  101. package/dist/modules/background/hooks.d.ts +1 -1
  102. package/dist/modules/background/index.js +6 -3078
  103. package/dist/modules/background/index.js.map +1 -1
  104. package/dist/modules/background/motion.d.ts +9 -7
  105. package/dist/modules/background/motion.d.ts.map +1 -1
  106. package/dist/modules/background/overlay.d.ts +3 -8
  107. package/dist/modules/background/overlay.d.ts.map +1 -1
  108. package/dist/modules/background/types.d.ts +16 -2
  109. package/dist/modules/background/types.d.ts.map +1 -1
  110. package/dist/modules/context-menu/constants.d.ts +2 -2
  111. package/dist/modules/context-menu/constants.d.ts.map +1 -1
  112. package/dist/modules/context-menu/hooks.d.ts +1 -1
  113. package/dist/modules/context-menu/index.js +10 -1896
  114. package/dist/modules/context-menu/index.js.map +1 -1
  115. package/dist/modules/context-menu/motion.d.ts +1 -8
  116. package/dist/modules/context-menu/motion.d.ts.map +1 -1
  117. package/dist/modules/context-menu/overlay.d.ts.map +1 -1
  118. package/dist/modules/context-menu/types.d.ts +16 -2
  119. package/dist/modules/context-menu/types.d.ts.map +1 -1
  120. package/dist/modules/controls/constants.d.ts +1 -1
  121. package/dist/modules/controls/constants.d.ts.map +1 -1
  122. package/dist/modules/controls/entries.d.ts +1 -1
  123. package/dist/modules/controls/hooks.d.ts +1 -1
  124. package/dist/modules/controls/index.js +4 -1110
  125. package/dist/modules/controls/index.js.map +1 -1
  126. package/dist/modules/controls/overlay.d.ts +1 -1
  127. package/dist/modules/controls/types.d.ts +2 -2
  128. package/dist/modules/dock/cards.d.ts +711 -24
  129. package/dist/modules/dock/cards.d.ts.map +1 -1
  130. package/dist/modules/dock/constants.d.ts +2 -2
  131. package/dist/modules/dock/constants.d.ts.map +1 -1
  132. package/dist/modules/dock/helpers.d.ts +2 -2
  133. package/dist/modules/dock/hooks.d.ts +2 -2
  134. package/dist/modules/dock/index.d.ts +1 -1
  135. package/dist/modules/dock/index.d.ts.map +1 -1
  136. package/dist/modules/dock/index.js +9 -12132
  137. package/dist/modules/dock/index.js.map +1 -1
  138. package/dist/modules/dock/layout.d.ts.map +1 -1
  139. package/dist/modules/dock/module.d.ts +1 -1
  140. package/dist/modules/dock/motion.d.ts +44 -912
  141. package/dist/modules/dock/motion.d.ts.map +1 -1
  142. package/dist/modules/dock/overlay.d.ts +1 -1
  143. package/dist/modules/dock/overlay.d.ts.map +1 -1
  144. package/dist/modules/dock/runtime/dock.d.ts +1 -23
  145. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  146. package/dist/modules/dock/styles.d.ts +4 -4
  147. package/dist/modules/dock/surface/hooks.d.ts +5 -20
  148. package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
  149. package/dist/modules/dock/surface/machine.d.ts +4 -3
  150. package/dist/modules/dock/surface/machine.d.ts.map +1 -1
  151. package/dist/modules/dock/surface/stack.d.ts.map +1 -1
  152. package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
  153. package/dist/modules/dock/types.d.ts +162 -3
  154. package/dist/modules/dock/types.d.ts.map +1 -1
  155. package/dist/modules/index.js +16 -17883
  156. package/dist/modules/index.js.map +1 -1
  157. package/dist/modules/loading/constants.d.ts +1 -1
  158. package/dist/modules/loading/constants.d.ts.map +1 -1
  159. package/dist/modules/loading/context.d.ts +1 -1
  160. package/dist/modules/loading/hooks.d.ts +1 -1
  161. package/dist/modules/loading/index.js +5 -1153
  162. package/dist/modules/loading/index.js.map +1 -1
  163. package/dist/modules/loading/types.d.ts +2 -2
  164. package/dist/modules/media/context.d.ts +1 -1
  165. package/dist/modules/media/index.js +3 -570
  166. package/dist/modules/media/index.js.map +1 -1
  167. package/dist/modules/media/types.d.ts +2 -2
  168. package/dist/modules/modal/constants.d.ts +2 -2
  169. package/dist/modules/modal/constants.d.ts.map +1 -1
  170. package/dist/modules/modal/context.d.ts +1 -1
  171. package/dist/modules/modal/hooks.d.ts +3 -3
  172. package/dist/modules/modal/index.js +8 -2355
  173. package/dist/modules/modal/index.js.map +1 -1
  174. package/dist/modules/modal/motion.d.ts +3 -8
  175. package/dist/modules/modal/motion.d.ts.map +1 -1
  176. package/dist/modules/modal/overlay.d.ts.map +1 -1
  177. package/dist/modules/modal/types.d.ts +21 -0
  178. package/dist/modules/modal/types.d.ts.map +1 -1
  179. package/dist/modules/notification/constants.d.ts +2 -2
  180. package/dist/modules/notification/constants.d.ts.map +1 -1
  181. package/dist/modules/notification/context.d.ts +1 -1
  182. package/dist/modules/notification/hooks.d.ts +1 -1
  183. package/dist/modules/notification/index.js +4 -828
  184. package/dist/modules/notification/index.js.map +1 -1
  185. package/dist/modules/notification/motion.d.ts +1 -7
  186. package/dist/modules/notification/motion.d.ts.map +1 -1
  187. package/dist/modules/notification/overlay.d.ts.map +1 -1
  188. package/dist/modules/notification/types.d.ts +9 -1
  189. package/dist/modules/notification/types.d.ts.map +1 -1
  190. package/dist/overlay-TZ6L52A5.js +9 -0
  191. package/dist/overlay-TZ6L52A5.js.map +1 -0
  192. package/dist/provider.d.ts +1 -1
  193. package/dist/provider.d.ts.map +1 -1
  194. package/dist/provider.js +6 -1968
  195. package/dist/provider.js.map +1 -1
  196. package/dist/result.js +2 -63
  197. package/dist/result.js.map +1 -1
  198. package/dist/theme.d.ts +45 -8
  199. package/dist/theme.d.ts.map +1 -1
  200. package/dist/theme.js +3 -41
  201. package/dist/theme.js.map +1 -1
  202. package/dist/tokens/index.d.ts +1 -0
  203. package/dist/tokens/index.d.ts.map +1 -1
  204. package/dist/tokens/index.js +126 -155
  205. package/dist/tokens/index.js.map +1 -1
  206. package/dist/tokens/motion-config.d.ts +44 -0
  207. package/dist/tokens/motion-config.d.ts.map +1 -0
  208. package/dist/tokens/motion.d.ts +23 -174
  209. package/dist/tokens/motion.d.ts.map +1 -1
  210. package/dist/utils/index.js +4 -82
  211. package/dist/utils/index.js.map +1 -1
  212. package/dist/utils/report.d.ts.map +1 -1
  213. package/docs/README.md +1 -0
  214. package/docs/architecture-and-rules.md +4 -3
  215. package/docs/core-engine.md +7 -10
  216. package/docs/getting-started.md +4 -2
  217. package/docs/modules/ambient.md +194 -80
  218. package/docs/modules/background.md +3 -3
  219. package/docs/modules/context-menu.md +2 -2
  220. package/docs/modules/dock.md +9 -6
  221. package/docs/modules/modal.md +2 -2
  222. package/docs/modules/notification.md +2 -2
  223. package/docs/theming.md +81 -9
  224. package/package.json +22 -5
  225. package/templates/AGENTS.md +1 -1
  226. package/templates/motion/background.ts +17 -0
  227. package/templates/motion/context-menu.ts +63 -0
  228. package/templates/motion/dock.ts +327 -0
  229. package/templates/motion/modal.ts +79 -0
  230. package/templates/motion/notification.ts +27 -0
  231. package/templates/motion/tokens.ts +47 -0
  232. package/templates/tsconfig.json +7 -0
  233. package/dist/modules/ambient/color.d.ts +0 -21
  234. package/dist/modules/ambient/color.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/background/constants.ts","../src/modules/background/visual.ts","../src/modules/background/playback.ts","../src/modules/background/motion.ts","../src/modules/background/youtube/parse.ts","../src/modules/background/state.ts","../src/modules/background/context.tsx","../src/modules/background/hooks.ts","../src/modules/background/youtube/iframe.ts","../src/modules/background/youtube/player.tsx","../src/modules/background/overlay.tsx","../src/modules/background/module.tsx"],"names":["motion","videoElement","isPlaying","useMemo","useRef","useEffect","useState","YouTubeBackgroundPlayer","jsx","useCallback","memo","BackgroundGradients","EdgeGradient","NoiseOverlay","SolidOverlay","objectPosition","jsxs","Fragment"],"mappings":";;;;;;;;;;;AAGO,IAAM,eAAA,GAAkB,gBAG7B,YAAY;AAEP,IAAM,uBAAA,GAA0B;AAChC,IAAM,mBAAA,GAAsB;;;ACNnC,IAAM,SAAA,GAAY,CAAC,KAAA,MAAkC;AAAA,EACnD,SAAA,EAAW;AACb,CAAA,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAC,KAAA,MAAkC;AAAA,EACxD,cAAA,EAAgB;AAClB,CAAA,CAAA;AAEO,IAAM,wBAAA,GAAoE,OAAO,MAAA,CAAO;AAAA,EAC7F,WAAA,EAAa,eAAe,QAAQ,CAAA;AAAA,EACpC,WAAA,EAAa,eAAe,QAAQ,CAAA;AAAA,EACpC,YAAA,EAAc,UAAU,SAAS,CAAA;AAAA,EACjC,UAAA,EAAY,UAAU,OAAO,CAAA;AAAA,EAC7B,SAAA,EAAW,UAAU,MAAM,CAAA;AAAA,EAC3B,SAAA,EAAW,eAAe,MAAM,CAAA;AAAA,EAChC,gBAAA,EAAkB,eAAe,aAAa,CAAA;AAAA,EAC9C,aAAA,EAAe,eAAe,UAAU,CAAA;AAAA,EACxC,SAAA,EAAW,UAAU,MAAM,CAAA;AAAA,EAC3B,UAAA,EAAY,eAAe,OAAO,CAAA;AAAA,EAClC,iBAAA,EAAmB,eAAe,cAAc,CAAA;AAAA,EAChD,cAAA,EAAgB,eAAe,WAAW,CAAA;AAAA,EAC1C,eAAA,EAAiB,UAAU,YAAY,CAAA;AAAA,EACvC,QAAA,EAAU,eAAe,KAAK;AAChC,CAAC;AAEM,IAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,WAAW,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,YAAY,CAAC;AAEpF,IAAM,aAAA,GAAgB;AAE7B,IAAM,WAAA,GAAc,qBAAA;AAEb,SAAS,0BAA0B,MAAA,EAIxC;AACA,EAAA,MAAM,MAAA,GAAS,OACZ,OAAA,CAAQ,CAAC,UAAW,OAAO,KAAA,KAAU,WAAW,KAAA,CAAM,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAE,MAAM,KAAK,CAAA,GAAI,EAAG,CAAA,CAC3F,OAAO,OAAO,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,wBAAA,CAAyB,KAAK,CAAC,CAAC,CAAA;AAAA,IACxF,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IAClE,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU,WAAA,CAAY,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG;AAAA,GACnE;AACF;AAEO,SAAS,mBAAA,CAAoB,OAAA,GAAwB,EAAC,EAAG;AAC9D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAQ,KAAA,IAAS,MAAA;AAAA,IACxB,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA;AAAA,IACtB,WAAA,EAAa,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA;AAAA,IACxC,MAAA,EAAQ,QAAQ,IAAA,IAAQ,KAAA;AAAA,IACxB,OAAA,EAAS,QAAQ,KAAA,IAAS,IAAA;AAAA,IAC1B,YAAA,EAAc,QAAQ,YAAA,IAAgB,CAAA;AAAA,IACtC,OAAA,EAAS,QAAQ,OAAA,IAAW,OAAA;AAAA,IAC5B,cAAA,EAAgB,QAAQ,QAAA,IAAY,IAAA;AAAA,IACpC,UAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AAAA,IACtC,WAAA,EAAa,QAAQ,WAAA,KAAgB;AAAA,GACvC;AACF;AAEO,IAAM,oBAAA,GAAuB,CAAC,SAAA,EAA6B,KAAA,KAA0B;AAC1F,EAAA,MAAM,EAAA,GAAK,SAAA,KAAc,MAAA,GAAS,UAAA,GAAa,SAAA;AAC/C,EAAA,OAAO,CAAA,gBAAA,EAAmB,EAAE,CAAA,EAAA,EAAK,KAAK,2BAA2B,KAAK,CAAA,2CAAA,EAA8C,KAAK,CAAA,2CAAA,EAA8C,KAAK,CAAA,yCAAA,CAAA;AAC9K;AAEO,IAAM,oBAAA,GAAuB,CAAC,SAAA,EAA6B,KAAA,KAA0B;AAC1F,EAAA,MAAM,EAAA,GAAK,SAAA,KAAc,MAAA,GAAS,UAAA,GAAa,SAAA;AAC/C,EAAA,OAAO,CAAA,gBAAA,EAAmB,EAAE,CAAA,qBAAA,EAAwB,KAAK,6CAA6C,KAAK,CAAA,2CAAA,EAA8C,KAAK,CAAA,2CAAA,EAA8C,KAAK,CAAA,yCAAA,CAAA;AACnN;AAEO,SAAS,cAAA,CAAe,YAAA,GAAqC,EAAC,EAAG;AACtE,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,YAAA,GAAe,GAAG,aAAA,GAAgB,CAAA,EAAG,GAAG,SAAA,EAAU,GAAI,YAAA;AACrF,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,YAAA,EAAc,MAAA,CAAO,YAAY,CAAA,IAAK,CAAA;AAAA,IACtC,aAAA,EAAe,MAAA,CAAO,aAAa,CAAA,IAAK;AAAA,GAC1C;AACF;AAEO,SAAS,uBAAA,CAAwB;AAAA,EACtC,SAAA,GAAY,IAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,CAAA;AAAA,EACf,aAAA,GAAgB;AAClB,CAAA,EAKG;AACD,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,YAAA,GAAe,CAAA,EAAG,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,YAAA,GAAe,GAAG,CAAC,CAAA;AAAA,OAAA,IACxE,QAAA,IAAY,SAAA,KAAc,KAAA,EAAO,WAAA,GAAc,EAAA;AACxD,EAAA,IAAI,aAAA,GAAgB,CAAA,EAAG,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,aAAA,GAAgB,GAAG,CAAC,CAAA;AAAA,OAAA,IAC3E,QAAA,IAAY,SAAA,KAAc,KAAA,EAAO,YAAA,GAAe,EAAA;AACzD,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,WAAA,GAAc,SAAA;AACd,IAAA,YAAA,GAAe,SAAA;AAAA,EACjB,CAAA,MAAA,IAAW,OAAO,SAAA,KAAc,QAAA,EAAU;AACxC,IAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,MAAA,WAAA,GAAc,MAAA;AACd,MAAA,YAAA,GAAe,MAAA;AAAA,IACjB;AAAA,EACF,CAAA,MAAA,IAAW,OAAO,SAAA,KAAc,QAAA,IAAY,cAAc,IAAA,EAAM;AAC9D,IAAA,MAAM,OAAA,GAAU,SAAA;AAChB,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAW,WAAA,GAAc,WAAW,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA,IAAK,CAAA;AAClF,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW,YAAA,GAAe,WAAW,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,IAAK,CAAA;AAAA,EACvF,CAAA,MAAA,IAAW,cAAc,KAAA,EAAO;AAC9B,IAAA,WAAA,GAAc,CAAA;AACd,IAAA,YAAA,GAAe,CAAA;AAAA,EACjB;AACA,EAAA,MAAM,WAAA,GAAc,eAAe,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,YAAA,GAAe,IAAI,CAAA,GAAI,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAe,gBAAgB,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,aAAA,GAAgB,IAAI,CAAA,GAAI,CAAA;AAC7E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,WAAA,GAAc,CAAA,IAAK,YAAA,GAAe,CAAA;AAAA,IAC3C,WAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,uBAAA,CACd,OAAA,EACA,SAAA,GAA0B,IAAA,EAC1B,QAAQ,oBAAA,EACE;AACV,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AAAA,IACb,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,IACnB,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,IACnB,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,IACnB,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK;AAAA,IACnB,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAI;AAAA,IAClB,EAAE,CAAA,EAAG,CAAA,EAAK,CAAA,EAAG,CAAA;AAAI,GACnB;AACA,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,OAAO,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,EAAE,CAAA,EAAG,CAAA,EAAE,KACvB,MAAM,CAAA,GACF,CAAA,YAAA,EAAA,CAAgB,CAAA,GAAI,OAAA,EAAS,QAAQ,CAAC,CAAC,MACvC,CAAA,KAAM,CAAA,GACJ,GAAG,KAAK,CAAA,CAAA,EAAA,CAAK,CAAA,GAAI,OAAA,EAAS,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GACpC,CAAA,mBAAA,EAAsB,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAC,CAAA,gBAAA,EAAA,CAAoB,IAAI,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,KACrG;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAA,CAAI,CAAC,EAAE,CAAA,EAAG,GAAE,KAAM;AAC7B,IAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,IAAA,OAAO,UAAU,CAAA,GACb,CAAA,YAAA,EAAA,CAAgB,GAAA,GAAM,OAAA,GAAU,IAAI,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAC,MACvD,KAAA,KAAU,CAAA,GACR,GAAG,KAAK,CAAA,CAAA,EAAA,CAAK,MAAM,OAAA,GAAU,CAAA,GAAI,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GACpD,sBAAsB,KAAK,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,KAAA,GAAQ,GAAG,CAAC,oBAAoB,GAAA,GAAM,OAAA,GAAU,IAAI,OAAA,EAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EACzH,CAAC,CAAA;AACH;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA,GAAQ,oBAAA;AAAA,EACR,WAAA,GAAc,CAAA;AAAA,EACd,YAAA,GAAe;AACjB,CAAA,EAIuB;AACrB,EAAA,IAAI,WAAA,IAAe,CAAA,IAAK,YAAA,IAAgB,CAAA,EAAG,OAAO,MAAA;AAClD,EAAA,MAAM,SAAA,GACJ,WAAA,GAAc,CAAA,GAAI,uBAAA,CAAwB,WAAA,EAAa,IAAA,EAAM,KAAK,CAAA,GAAI,CAAC,CAAA,EAAG,KAAK,CAAA,GAAA,CAAK,CAAA;AACtF,EAAA,MAAM,UAAA,GACJ,YAAA,GAAe,CAAA,GAAI,uBAAA,CAAwB,YAAA,EAAc,KAAA,EAAO,KAAK,CAAA,GAAI,CAAC,CAAA,EAAG,KAAK,CAAA,KAAA,CAAO,CAAA;AAC3F,EAAA,OAAO,CAAA,0BAAA,EAA6B,UAAU,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AACpF;;;ACjLO,SAAS,uBAAA,CAAwB;AAAA,EACtC,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAKS;AACP,EAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,EAAA,MAAM,mBAAA,GAAsB,OAAO,YAAY,CAAA;AAC/C,EAAA,MAAM,uBACJ,MAAA,CAAO,QAAA,CAAS,mBAAmB,CAAA,IAAK,mBAAA,GAAsB,IAC1D,mBAAA,GACA,CAAA;AAEN,EAAA,IAAI;AACF,IAAA,IAAI,YAAA,CAAa,iBAAiB,oBAAA,EAAsB;AACtD,MAAA,YAAA,CAAa,YAAA,GAAe,oBAAA;AAAA,IAC9B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,IAAI,CAAC,YAAA,CAAa,MAAA,EAAQ,YAAA,CAAa,KAAA,EAAM;AAC7C,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,eAAe,CAAA,EAAG;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,aAAa,IAAA,EAAK;AACtC,EAAA,IAAI,CAAC,WAAA,IAAe,OAAO,WAAA,CAAY,SAAS,UAAA,EAAY;AAE5D,EAAA,WAAA,CACG,IAAA,CAAK,MAAM,eAAA,CAAgB,IAAI,CAAC,CAAA,CAChC,KAAA,CAAM,CAAC,KAAA,KAAyC;AAC/C,IAAA,IAAI,KAAA,EAAO,IAAA,KAAS,YAAA,IAAgB,YAAA,CAAa,aAAa,CAAA,EAAG;AAC/D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,EAAO,SAAS,iBAAA,EAAmB;AACrC,MAAA,YAAA,CAAa,KAAA,GAAQ,IAAA;AACrB,MAAA,YAAA,CACG,IAAA,GACA,IAAA,CAAK,MAAM,gBAAgB,IAAI,CAAC,CAAA,CAChC,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAC,CAAA;AACL;AAEO,SAAS,0BAAA,CACd,YAAA,EACA,WAAA,EACA,eAAA,EACM;AACN,EAAA,IAAI,CAAC,YAAA,EAAc;AACnB,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,YAAA,CAAa,KAAA,GAAQ,eAAA;AACrB,IAAA,IAAI,CAAC,eAAA,IAAmB,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AACjD,MAAA,YAAA,CAAa,MAAA,GAAS,GAAA;AAAA,IACxB;AACA,IAAA,YAAA,CAAa,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,GAAA,KAAuC;AAChE,MAAA,IAAI,GAAA,EAAK,SAAS,iBAAA,EAAmB;AACnC,QAAA,YAAA,CAAa,KAAA,GAAQ,IAAA;AACrB,QAAA,YAAA,CAAa,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACpC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,YAAA,CAAa,KAAA,EAAM;AAAA,EACrB;AACF;AAEO,SAAS,oBAAA,CACd,cACA,SAAA,EACM;AACN,EAAA,IAAI,CAAC,YAAA,EAAc;AACnB,EAAA,YAAA,CAAa,KAAA,GAAQ,SAAA;AACrB,EAAA,IAAI,CAAC,SAAA,IAAa,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AAC3C,IAAA,YAAA,CAAa,MAAA,GAAS,GAAA;AAAA,EACxB;AACF;AAEO,SAAS,mBAAA,CACd,cACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,YAAA,EAAc;AACnB,EAAA,YAAA,CAAa,IAAA,GAAO,QAAA;AACtB;;;ACvFO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAO,gBAAgB,eAAe,CAAA;AACxC;AAGO,SAAS,yBAAA,CACdA,SACA,SAAA,EACA;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,SAAA,EAAW,OAAA,IAAWA,OAAAA,CAAO,OAAA;AAAA,IACtC,IAAA,EAAM,SAAA,EAAW,IAAA,IAAQA,OAAAA,CAAO,IAAA;AAAA,IAChC,kBAAA,EAAoB,MAAA,CAAO,SAAA,EAAW,kBAAkB,CAAA;AAAA,IACxD,OAAA,EAAS,SAAA,EAAW,OAAA,IAAWA,OAAAA,CAAO,OAAA;AAAA,IACtC,UAAA,EAAY,SAAA,EAAW,UAAA,IAAcA,OAAAA,CAAO;AAAA,GAC9C;AACF;AAEO,SAAS,2BAAA,CACdA,SACA,MAAA,EACY;AACZ,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,UAAA;AAGxB,EAAA,MAAM,QAAA,GAAWA,QAAO,IAAA,CAAK,UAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,kBAAkB,CAAA,GACpD,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,kBAAkB,CAAA,GACrCA,OAAAA,CAAO,kBAAA;AACX,EAAA,OAAO;AAAA,IACL,GAAG,MAAA,CAAO,UAAA;AAAA,IACV,KAAA,EAAO,CAAA;AAAA,IACP,QAAA,EACE,KAAK,QAAA,IAAA,CACJ,MAAA,CAAO,WAAW,QAAA,IAAYA,OAAAA,CAAO,UAAA,CAAW,QAAA,IAAY,CAAA,IAC3D,MAAA;AAAA,IACJ,IAAA,EAAM,GAAA,EAAK,IAAA,IAAQ,QAAA,EAAU;AAAA,GAC/B;AACF;AAEO,SAAS,aAAA,CAAc,OAAA,EAAkB,QAAA,GAAW,CAAA,EAAW;AACpE,EAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,QAAQ,CAAA,GAAI,GAAI,CAAA,EAAA,CAAA;AACzE;AAEO,SAAS,WAAW,OAAA,EAA0B;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,CAAA,GAAI,GAAI,CAAA,EAAA,CAAA;AAClE;AAEO,SAAS,YAAY,MAAA,EAAyB;AACnD,EAAA,OAAO,UAAU,MAAM,CAAA;AACzB;;;AC3DA,IAAM,kBAAA,GAAqB,qBAAA;AAE3B,SAAS,sBAAsB,KAAA,EAAwC;AACrE,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAI,OAAO,CAAA;AAClE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,OAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,UAAU,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AACjD,EAAA,IAAI,CAAC,SAAS,OAAO,CAAA;AAErB,EAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA,EAAG;AACjC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,WAAW,OAAA,CAAQ,KAAA;AAAA,IACvB;AAAA,GACF;AACA,EAAA,IAAI,QAAA,KAAa,SAAS,CAAC,CAAA,IAAK,SAAS,CAAC,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,CAAA,EAAI;AAC3D,IAAA,MAAM,QAAQ,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AAC7C,IAAA,MAAM,UAAU,QAAA,CAAS,QAAA,CAAS,CAAC,CAAA,IAAK,KAAK,EAAE,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,CAAS,CAAC,KAAK,GAAG,CAAA;AAC7C,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,IAAA,GAAO,OAAA,GAAU,KAAK,OAAO,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,CAAA;AACT;AAEA,IAAM,iBAAA,GACJ,4EAAA;AAEF,SAAS,MAAM,KAAA,EAAe,EAAE,cAAc,KAAA,EAAM,GAAI,EAAC,EAAe;AACtE,EAAA,IAAI,SAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA,EAAG,SAAA,GAAY,KAAA;AAAA,OAAA,IACnC,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,SAAA,GAAY,SAAS,KAAK,CAAA,CAAA;AAAA,OAAA,IAClD,CAAC,WAAA,IAAe,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,EAAG;AACtD,IAAA,SAAA,GAAY,WAAW,KAAK,CAAA,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,SAAA,GAAY,IAAI,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAa,GAAA,EAAyB;AAC7C,EAAA,MAAM,OAAO,GAAA,CAAI,QAAA,CAAS,QAAQ,uBAAA,EAAyB,EAAE,EAAE,WAAA,EAAY;AAC3E,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAEvD,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO,kBAAA,CAAmB,KAAK,QAAA,CAAS,CAAC,KAAK,EAAE,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,IAAA;AAAA,EACpE;AACA,EAAA,IACE,IAAA,KAAS,iBACT,IAAA,KAAS,sBAAA,IACT,CAAC,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,EAC7B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACxE,EAAA,IAAI,SAAA,IAAa,kBAAA,CAAmB,IAAA,CAAK,SAAS,GAAG,OAAO,SAAA;AAE5D,EAAA,MAAM,WAAA,GACJ,QAAA,CAAS,MAAA,IAAU,CAAA,IACnB,CAAC,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK,OAAO,CAAA,CAAE,QAAA;AAAA,IAC7C,QAAA,CAAS,CAAC,CAAA,CAAE,WAAA;AAAY,GAC1B;AACF,EAAA,OAAO,WAAA,IAAe,mBAAmB,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,GACrD,QAAA,CAAS,CAAC,CAAA,GACV,IAAA;AACN;AAEO,SAAS,qBAAA,CACd,KAAA,EACA,OAAA,GAAqC,EAAC,EACvB;AACf,EAAA,MAAM,UAAU,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAK,GAAI,EAAA;AAC3D,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI,QAAQ,WAAA,IAAe,kBAAA,CAAmB,IAAA,CAAK,OAAO,GAAG,OAAO,OAAA;AAEpE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,uCAAuC,CAAA;AACtE,EAAA,IAAI,QAAA,EAAU,OAAO,QAAA,CAAS,CAAC,CAAA;AAE/B,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,EAAS,EAAE,WAAA,EAAa,MAAM,CAAA;AAChD,EAAA,OAAO,GAAA,GAAM,YAAA,CAAa,GAAG,CAAA,GAAI,IAAA;AACnC;AAEO,SAAS,aAAa,KAAA,EAAgC;AAC3D,EAAA,OAAO,OAAA,CAAQ,qBAAA,CAAsB,KAAK,CAAC,CAAA;AAC7C;AAEO,SAAS,iBAAiB,KAAA,EAAgC;AAC/D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,IACE,QAAQ,UAAA,CAAW,yBAAyB,KAC5C,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA,EAC1B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY;AAClE,EAAA,OAAO,qCAAA,CAAsC,KAAK,SAAS,CAAA;AAC7D;AAEO,SAAS,qBAAA,CACd,KAAA,EACA,OAAA,GAAqC,EAAC,EACb;AACzB,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,KAAA,EAAO,OAAO,CAAA;AACpD,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,EAAO,OAAO,IAAA;AAE/B,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,YAAA;AACpC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,qBAAA,CAAsB,MAAA,EAAQ,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACjD,MAAA,EAAQ,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,IAC/B,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,sBAAsB,MAAA,EAAQ,GAAA,CAAI,GAAG,CAAA,IAAK,MAAA,EAAQ,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,IACzE;AAAA,GACF;AACF;AAEO,SAAS,mBAAA,CACd,OAAA,EACA,OAAA,GAII,EAAC,EACG;AACR,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,MAAA,CAAO,GAAA,CAAI,MAAM,OAAO,CAAA;AACxB,EAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,OAAA,CAAQ,MAAA,IAAU,OAAO,CAAA;AAC9C,EAAA,IAAI,QAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,QAAQ,OAAO,CAAA;AAC1D,EAAA,IAAI,QAAQ,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,QAAQ,KAAK,CAAA;AACpD,EAAA,OAAO,CAAA,wBAAA,EAA2B,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AACrD;AAEO,SAAS,sBAAA,CACd,OAAA,EACA,OAAA,GAAU,IAAA,EACF;AACR,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,OAAO,CAAC,CAAA,iBAAA,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,CAAA,uBAAA,EAA0B,kBAAA,CAAmB,OAAO,CAAC,CAAA,kBAAA,CAAA;AAC9D;AAEO,SAAS,+BACd,UAAA,EACkB;AAClB,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAEjD,EAAA,MAAA,CAAO,iBAAiB,UAAA,EAAY;AAAA,IAClC,WAAA,EAAa;AAAA,MACX,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,UAAA,CAAW,cAAA,EAAe;AAAA,MACrC,GAAA,EAAK,CAAC,KAAA,KAAkB;AACtB,QAAA,UAAA,CAAW,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,IAAK,CAAC,CAAA;AACpC,QAAA,UAAA,CAAW,aAAA,CAAc,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,MAClD;AAAA,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,UAAA,CAAW,WAAA;AAAY,KACpC;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,UAAA,CAAW,OAAA,EAAQ;AAAA,MAC9B,GAAA,EAAK,CAAC,KAAA,KAAmB;AACvB,QAAA,UAAA,CAAW,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACnC;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,UAAA,CAAW,QAAA,EAAS;AAAA,MAC/B,GAAA,EAAK,CAAC,KAAA,KAAmB;AACvB,QAAA,UAAA,CAAW,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AAClC,QAAA,UAAA,CAAW,aAAA,CAAc,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA;AAAA,MACpD;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,YAAA,EAAc,IAAA;AAAA,MACd,OAAO,MAAM;AACX,QAAA,UAAA,CAAW,KAAA,EAAM;AACjB,QAAA,UAAA,CAAW,aAAA,CAAc,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC7C;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,UAAA,CAAW,SAAA;AAAU,KAClC;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,IAAA;AAAA,MACd,OAAO,MACL,UAAA,CAAW,IAAA,EAAK,CAAE,KAAK,MAAM;AAC3B,QAAA,UAAA,CAAW,aAAA,CAAc,IAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AAC1C,QAAA,UAAA,CAAW,aAAA,CAAc,IAAI,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,MAC/C,CAAC;AAAA,KACL;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,UAAA,CAAW,eAAA,EAAgB;AAAA,MACtC,GAAA,EAAK,CAAC,KAAA,KAAkB;AACtB,QAAA,UAAA,CAAW,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAA,IAAK,CAAC,CAAA;AAC7C,QAAA,UAAA,CAAW,aAAA,CAAc,IAAI,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,MAClD;AAAA,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,IAAA;AAAA,MACd,GAAA,EAAK,MAAM,UAAA,CAAW,SAAA,EAAU;AAAA,MAChC,GAAA,EAAK,CAAC,KAAA,KAAkB;AACtB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,IAAK,CAAC,CAAC,CAAA;AAC3D,QAAA,UAAA,CAAW,UAAU,OAAO,CAAA;AAC5B,QAAA,UAAA,CAAW,aAAA,CAAc,IAAI,KAAA,CAAM,cAAc,CAAC,CAAA;AAAA,MACpD;AAAA;AACF,GACD,CAAA;AAED,EAAA,OAAO,UAAA;AACT;;;ACrNO,IAAM,kBAAA,GAAsC,OAAO,MAAA,CAAO;AAAA,EAC/D,SAAA,EAAW,IAAA;AAAA,EACX,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,IAAA;AAAA,EACX,GAAA,EAAK,IAAA;AAAA,EACL,KAAA,EAAO,IAAA;AAAA,EACP,YAAY,EAAC;AAAA,EACb,SAAA,EAAW,KAAA;AAAA,EACX,YAAY,EAAC;AAAA,EACb,OAAA,EAAS,KAAA;AAAA,EACT,YAAA,EAAc,cAAA;AAAA,EACd,cAAA,EAAgB,CAAA;AAAA,EAChB,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAO,IAAA;AAAA,EACP,cAAA,EAAgB,EAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW,EAAA;AAAA,IACX,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,IAAA;AAAA,IACP,YAAA,EAAc,CAAA;AAAA,IACd,KAAA,EAAO;AAAA,GACT;AAAA,EACA,YAAY,EAAC;AAAA,EACb,KAAA,EAAO;AACT,CAAC;AAEM,IAAM,2BAAA,GAAuD,OAAO,MAAA,CAAO;AAAA,EAChF,GAAG,kBAAA;AAAA,EACH,aAAA,EAAe,KAAA;AAAA,EACf,OAAA,EAAS,KAAA;AAAA,EACT,SAAA,EAAW,KAAA;AAAA,EACX,SAAA,EAAW,IAAA;AAAA,EACX,cAAA,EAAgB;AAClB,CAAC;AAEM,IAAM,wBAAA,GAA8C,OAAO,MAAA,CAAO;AAAA,EACvE,iBAAiB,MAAM;AAAA,EAAC,CAAA;AAAA,EACxB,eAAe,MAAM;AAAA,EAAC,CAAA;AAAA,EACtB,iBAAiB,MAAM;AAAA,EAAC,CAAA;AAAA,EACxB,eAAe,MAAM;AAAA,EAAC,CAAA;AAAA,EACtB,iBAAiB,MAAM;AAAA,EAAC,CAAA;AAAA,EACxB,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,aAAa,MAAM;AAAA,EAAC;AACtB,CAAC;AAEM,SAAS,wBAAA,CACd,KAAA,GAA8D,EAAC,EACrC;AAC1B,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,YAAA,CAAa,OAAO,CAAA,IAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG;AACtD,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAA,EAAQ;AAAA,IACvC;AACA,IAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAAA,EAC1B;AAEA,EAAA,MAAM,SAAA,GAAsC,EAAE,GAAG,KAAA,EAAM;AAEvD,EAAA,IACE,OAAO,SAAA,CAAU,KAAA,KAAU,QAAA,IAC3B,YAAA,CAAa,UAAU,KAAK,CAAA,IAC5B,CAAC,SAAA,CAAU,KAAA,EACX;AACA,IAAA,SAAA,CAAU,QAAQ,SAAA,CAAU,KAAA;AAC5B,IAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAAA,EACpB;AAEA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,oBAAA,CACd,SAAA,EACA,KAAA,GAA2C,EAAC,EAC3B;AACjB,EAAA,MAAM,aAAA,GAAgB,yBAAyB,KAAK,CAAA;AAEpD,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,GAAG,SAAA,CAAU,YAAA;AAAA,IACb,GAAI,aAAA,CAAc,YAAA,IAAgB;AAAC,GACrC;AAEA,EAAA,MAAM,YACJ,aAAA,CAAc,KAAA,KAAU,MAAA,GAAY,aAAA,CAAc,QAAQ,SAAA,CAAU,KAAA;AACtE,EAAA,MAAM,cAAA,GAAiB,iBAAiB,QAAA,KAAa,KAAA;AACrD,EAAA,MAAM,iBAAA,GACJ,aAAA,CAAc,SAAA,KAAc,MAAA,GACxB,aAAA,CAAc,SAAA,GACd,aAAA,CAAc,KAAA,KAAU,MAAA,IAAa,OAAA,CAAQ,SAAS,CAAA,GACpD,iBACA,SAAA,CAAU,SAAA;AAElB,EAAA,OAAO;AAAA,IACL,GAAG,SAAA;AAAA,IACH,GAAG,aAAA;AAAA,IACH,SAAA,EAAW,iBAAA;AAAA,IACX,SAAA,EACE,aAAA,CAAc,SAAA,KAAc,MAAA,GACxB,cAAc,SAAA,GACZ;AAAA,MACE,GAAI,SAAA,CAAU,SAAA,IAAa,EAAC;AAAA,MAC5B,GAAG,aAAA,CAAc;AAAA,KACnB,GACA,aAAA,CAAc,SAAA,GAChB,SAAA,CAAU,SAAA;AAAA,IAChB,UAAA,EAAY;AAAA,MACV,GAAG,SAAA,CAAU,UAAA;AAAA,MACb,GAAI,aAAA,CAAc,UAAA,IAAc;AAAC,KACnC;AAAA,IACA,UAAA,EAAY;AAAA,MACV,GAAG,SAAA,CAAU,UAAA;AAAA,MACb,GAAI,aAAA,CAAc,UAAA,IAAc;AAAC,KACnC;AAAA,IACA,YAAA,EAAc,gBAAA;AAAA,IACd,UAAA,EAAY;AAAA,MACV,GAAG,SAAA,CAAU,UAAA;AAAA,MACb,GAAI,aAAA,CAAc,UAAA,IAAc;AAAC;AACnC,GACF;AACF;AAEO,SAAS,sBAAA,CACd,kBAAA,EACA,QAAA,EACA,QAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAO,kBAAA,GACT,oBAAA,CAAqB,kBAAA,EAAoB,kBAAkB,CAAA,GAC3D,kBAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,KAAa,QAAA,GAAW,SAAS,KAAA,GAAQ,IAAA;AAChE,EAAA,OAAO,KAAA,GAAQ,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA,GAAI,IAAA;AACrD;AAEO,SAAS,uBACd,UAAA,EACyB;AACzB,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,UAAA,CAAW,KAAK,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,QAAQ,cAAc,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,CAAW,KAAA,IAAS,SAAS,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,aAAA,EAAe,OAAA;AAAA,MACb,WAAW,KAAA,IACX,OAAA,IACA,UAAA,CAAW,KAAA,IACX,WAAW,OAAA,IACV,UAAA,CAAW,UAAA,KACT,UAAA,CAAW,WAAW,OAAA,KAAY,MAAA,IAAA,CAChC,UAAA,CAAW,UAAA,CAAW,WAAW,CAAA,IAAK,CAAA;AAAA,KAC7C;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA,EAAW,cAAA,GAAiB,sBAAA,CAAuB,cAAc,CAAA,GAAI,IAAA;AAAA,IACrE;AAAA,GACF;AACF;ACpIO,IAAM,iBAAA,GACX,wBAAA;AAAA,EACE,mBAAA;AAAA,EACA;AACF;AAEF,SAAS,eAAA,GAAiC;AACxC,EAAA,IAAI;AACF,IAAA,OAAO,WAAA,EAAY;AAAA,EACrB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,kBAAA,CAAmB,EAAE,QAAA,EAAS,EAA4B;AACxE,EAAA,MAAM,WAAW,eAAA,EAAgB;AACjC,EAAA,MAAM,kBAAA,GACJ,gBAAA;AAAA,IACE,YAAA;AAAA,IACA;AAAA,GACF,IAAK,IAAA;AAEP,EAAA,MAAM,CAAC,aAAa,CAAA,GAAI,QAAA;AAAA,IAAS,MAC/B,WAAA;AAAA,MACE,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,MACxB,EAAE,iBAAiB,KAAA;AAAM;AAC3B,GACF;AACA,EAAA,MAAM,cAAA,GAAiB,SAAS,aAAa,CAAA;AAE7C,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,EAAE,QAAA,EAAU,oBAAoB,CAAA;AACzD,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,SAAA,CAAU,OAAA,GAAU,EAAE,QAAA,EAAU,kBAAA,EAAmB;AAAA,EACrD,CAAA,EAAG,CAAC,QAAA,EAAU,kBAAkB,CAAC,CAAA;AAEjC,EAAA,MAAM,eAAA,GAAkB,OAAgC,IAAI,CAAA;AAE5D,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,MACE,sBAAA;AAAA,MACE,sBAAA,CAAuB,kBAAA,EAAoB,cAAA,EAAgB,QAAQ;AAAA,KACrE;AAAA,IACF,CAAC,QAAA,EAAU,kBAAA,EAAoB,cAAc;AAAA,GAC/C;AAEA,EAAA,MAAM,CAAC,UAAU,CAAA,GAAI,QAAA;AAAA,IAAS,MAC5B,WAAA,CAAqC,KAAA,EAAO,EAAE,eAAA,EAAiB,OAAO;AAAA,GACxE;AACA,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AAEtB,EAAA,MAAM,OAAA,GAAU,QAA2B,MAAM;AAC/C,IAAA,MAAM,cAAc,MAAuB;AACzC,MAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,kBAAA,EAAoB,QAAA,KACjD,SAAA,CAAU,OAAA;AACZ,MAAA,OAAO,sBAAA;AAAA,QACL,QAAA;AAAA,QACA,cAAc,WAAA,EAAY;AAAA,QAC1B;AAAA,OACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAClB,OAAA,KACG;AACH,MAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9B,QAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,kBAAA,EAAoB,QAAA,KACjD,SAAA,CAAU,OAAA;AACZ,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,KAAa,WAAA,GAAc,KAAK,KAAA,GAAQ,IAAA;AAClE,QAAA,MAAM,OAAA,GAAU,OAAA;AAAA,UACd,sBAAA,CAAuB,QAAA,EAAU,IAAA,EAAM,WAAW;AAAA,SACpD;AACA,QAAA,IAAI,CAAC,OAAA,IAAW,MAAA,CAAO,KAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACjD,UAAA,OAAO,IAAA;AAAA,QACT;AACA,QAAA,MAAM,cAAA,GAAiB,yBAAyB,OAAO,CAAA;AACvD,QAAA,MAAM,WAAA,GAAwC;AAAA,UAC5C,GAAI,gBAAgB,EAAC;AAAA,UACrB,GAAG,cAAA;AAAA,UACH,GAAI,YAAA,EAAc,YAAA,IAAgB,cAAA,CAAe,YAAA,GAC7C;AAAA,YACE,YAAA,EAAc;AAAA,cACZ,GAAI,YAAA,EAAc,YAAA,IAAgB,EAAC;AAAA,cACnC,GAAI,cAAA,CAAe,YAAA,IAAgB;AAAC;AACtC,cAEF;AAAC,SACP;AACA,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,WAAA;AAAA,UACP,QAAA,EAAU;AAAA,SACZ;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,mBAAA,GAAsB,CAAC,OAAA,KAC3B,eAAA,CAAgB,WAAW,OAAA,CAAQ,YAAA;AAErC,IAAA,OAAO;AAAA,MACL,iBAAiB,MAAM;AACrB,QAAA,aAAA,CAAc,OAAA,CAAQ;AAAA,UACpB,KAAA,EAAO,IAAA;AAAA,UACP,QAAA,EAAU,UAAU,OAAA,CAAQ;AAAA,SAC7B,CAAA;AAAA,MACH,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,cAAA,KAAsD;AACpE,QAAA,WAAA,CAAY,MAAM,wBAAA,CAAyB,cAAc,CAAC,CAAA;AAAA,MAC5D,CAAA;AAAA,MACA,eAAA,EAAiB,CAACC,aAAAA,KAA0C;AAC1D,QAAA,eAAA,CAAgB,OAAA,GAAUA,aAAAA;AAC1B,QAAA,WAAA;AAAA,UAAY,CAAC,QACX,GAAA,CAAI,YAAA,KAAiBA,gBAAe,EAAC,GAAI,EAAE,YAAA,EAAAA,aAAAA;AAAa,SAC1D;AAAA,MACF,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,KAAA,KAAmB;AACjC,QAAA,MAAM,SAAA,GAAY,QAAQ,KAAK,CAAA;AAC/B,QAAA,oBAAA,CAAqB,mBAAA,CAAoB,WAAA,EAAa,CAAA,EAAG,SAAS,CAAA;AAClE,QAAA,WAAA,CAAY,CAAC,GAAA,KAAQ;AACnB,UAAA,IAAI,GAAA,CAAI,YAAA,EAAc,KAAA,KAAU,SAAA,SAAkB,EAAC;AACnD,UAAA,OAAO;AAAA,YACL,cAAc,EAAE,GAAG,GAAA,CAAI,YAAA,EAAc,OAAO,SAAA;AAAU,WACxD;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,MACA,eAAA,EAAiB,CAACC,UAAAA,KAAuB;AACvC,QAAA,WAAA;AAAA,UAAY,CAAC,QACX,GAAA,CAAI,SAAA,KAAcA,aAAY,EAAC,GAAI,EAAE,SAAA,EAAAA,UAAAA;AAAU,SACjD;AAAA,MACF,CAAA;AAAA,MACA,YAAY,MAAM;AAChB,QAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,QAAA,MAAM,QAAA,GAAW,CAAC,OAAA,CAAQ,YAAA,EAAc,IAAA;AACxC,QAAA,mBAAA,CAAoB,mBAAA,CAAoB,OAAO,CAAA,EAAG,QAAQ,CAAA;AAC1D,QAAA,WAAA,CAAY,CAAC,GAAA,MAAS;AAAA,UACpB,cAAc,EAAE,GAAG,GAAA,CAAI,YAAA,EAAc,MAAM,QAAA;AAAS,SACtD,CAAE,CAAA;AAAA,MACJ,CAAA;AAAA,MACA,YAAY,MAAM;AAChB,QAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,QAAA,MAAM,SAAA,GAAY,CAAC,OAAA,CAAQ,YAAA,EAAc,KAAA;AACzC,QAAA,oBAAA,CAAqB,mBAAA,CAAoB,OAAO,CAAA,EAAG,SAAS,CAAA;AAC5D,QAAA,WAAA,CAAY,CAAC,GAAA,MAAS;AAAA,UACpB,SAAA,EAAW,SAAA,GAAY,GAAA,CAAI,SAAA,GAAY,IAAA;AAAA,UACvC,cAAc,EAAE,GAAG,GAAA,CAAI,YAAA,EAAc,OAAO,SAAA;AAAU,SACxD,CAAE,CAAA;AAAA,MACJ,CAAA;AAAA,MACA,aAAa,MAAM;AACjB,QAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,QAAA,MAAM,OAAA,GAAU,oBAAoB,OAAO,CAAA;AAC3C,QAAA,MAAM,oBAAA,GAAuB,OAAA,GACzB,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,OAAA,CAAQ,KAAA,GAC5B,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAC7B,QAAA,MAAM,cAAc,CAAC,oBAAA;AACrB,QAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,OAAA,CAAQ,YAAA,EAAc,KAAK,CAAA;AAE3D,QAAA,0BAAA,CAA2B,OAAA,EAAS,aAAa,eAAe,CAAA;AAEhE,QAAA,WAAA,CAAY,OAAO,EAAE,SAAA,EAAW,WAAA,EAAY,CAAE,CAAA;AAAA,MAChD;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,QAAQ,uBAAA,EAAwB;AACtC,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,YAAA,EAAa,GAAI,KAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,YAAA,EAAc,IAAI,CAAA;AAC/C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,KAAA,CAAM,aAAa,mBAAmB,CAAA;AACtC,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,YAAA,CAAa;AAAA,MACjB,QAAA,EAAU;AAAA,QACR,UAAU,OAAA,CAAQ,aAAA;AAAA,QAClB,QAAQ,OAAA,CAAQ,WAAA;AAAA,QAChB,YAAY,OAAA,CAAQ;AAAA,OACtB;AAAA,MACA,SAAS,YAAA,IAAgB,IAAA;AAAA,MACzB,EAAA,EAAI,mBAAA;AAAA,MACJ,SAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,WAAW,OAAA,EAAS,KAAA,EAAO,YAAY,CAAC,CAAA;AAC7D,EAAA,SAAA,CAAU,MAAM,MAAM,KAAA,CAAM,YAAA,CAAa,mBAAmB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEtE,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,UAAA,EAAW,CAAA;AAAA,IACpC,CAAC,SAAS,UAAU;AAAA,GACtB;AAEA,EAAA,uBAAO,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAe,QAAA,EAAS,CAAA;AACpD;;;ACtNA,IAAM,qBAAA,GAAwB,WAAA;AAAA,EAC5B;AACF,CAAA;AAEO,SAAS,yBAAA,CACd,QACA,OAAA,EACM;AACN,EAAA,qBAAA,CAAsB,YAAA,EAAc,QAAQ,OAAO,CAAA;AACrD;AAEO,SAAS,kBAAA,GAA8C;AAC5D,EAAA,MAAM,EAAE,OAAM,GAAI,kBAAA;AAAA,IAChB,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,SAAS,KAAK,CAAA;AACvB;AAEO,SAAS,oBAAA,GAA0C;AACxD,EAAA,OAAO,kBAAA;AAAA,IACL,iBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF,CAAE,OAAA;AACJ;AAEO,SAAS,aAAA,CACd,QACA,OAAA,EAC6C;AAC7C,EAAA,yBAAA,CAA0B,QAAQ,OAAO,CAAA;AAEzC,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,MAAM,QAAQ,kBAAA,EAAmB;AAEjC,EAAA,OAAOC,OAAAA,CAAQ,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ,CAAA,EAAI,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AACnE;AAOO,SAAS,0BAAA,CACd,UACA,OAAA,EACG;AACH,EAAA,MAAM,GAAA,GAAM,WAAW,iBAAiB,CAAA;AACxC,EAAA,OAAO,QAAA;AAAA,IACL,KAAK,KAAA,IAAS,qBAAA;AAAA,IACd,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,4BAAA,GAAkD;AAChE,EAAA,MAAM,GAAA,GAAM,WAAW,iBAAiB,CAAA;AACxC,EAAA,OAAO,KAAK,OAAA,IAAW,wBAAA;AACzB;ACnCA,IAAM,YAAA,GAAe,EAAE,KAAA,EAAO,CAAA,EAAG,SAAS,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAarE,IAAI,UAAA,GAAkD,IAAA;AAEtD,SAAS,oBAAA,GAAqD;AAC5D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAC9D,EAAA,IAAI,OAAO,EAAA,EAAI,MAAA,SAAe,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AACvD,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,UAAA,GAAa,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AACpC,IAAA,MAAM,mBAAmB,MAAA,CAAO,uBAAA;AAChC,IAAA,MAAA,CAAO,0BAA0B,MAAM;AACrC,MAAA,gBAAA,IAAmB;AACnB,MAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,IACE,CAAC,QAAA,CAAS,aAAA;AAAA,MACR;AAAA,KACF,EACA;AACA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAA,CAAO,GAAA,GAAM,oCAAA;AACb,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IAClC;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAAwB;AAC9C,EAAA,MAAA,EAAQ,uBAAA,GAA0B,UAAU,QAAQ,CAAA;AACpD,EAAA,MAAA,EAAQ,qBAAqB,QAAQ,CAAA;AACvC;AAEO,SAAS,sBAAA,CAAuB;AAAA,EACrC,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAeG;AACD,EAAA,MAAM,SAAA,GAAYC,OAA6B,IAAI,CAAA;AAEnD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,IAAI,gBAAA,GAAkC,IAAA;AACtC,IAAA,IAAI,YAAA,GAAwC,IAAA;AAE5C,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,aAAa,SAAA,IAAa,CAAA;AAAA,MAC1B,QAAA,EAAU,CAAA;AAAA,MACV,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,MACpB,KAAA,EAAO,QAAQ,OAAO,CAAA;AAAA,MACtB,QAAQ,CAAC,cAAA;AAAA,MACT,YAAA,EAAc,MAAA,CAAO,YAAY,CAAA,IAAK,CAAA;AAAA,MACtC,MAAA,EAAQ,UAAU,CAAA,GAAI;AAAA,KACxB;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,KAAkC;AACjD,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAC,CAAA;AACzD,MAAA,MAAA,EAAQ,MAAA,GAAS,WAAW,IAAI,CAAA;AAChC,MAAA,MAAA,EAAQ,SAAA,IAAY;AACpB,MAAA,OAAO,SAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB,YAAA,EAAc,cAAc,IAAI,KAAA,CAAM,IAAI,CAAC,CAAA;AAE1E,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,MAAM,UAAU,MAAA,EAAO;AACvB,MAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,CAAQ,mBAAmB,UAAA,EAAY;AAE9D,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,CAAA,IAAK,CAAA;AACjD,MAAA,MAAM,WAAW,MAAA,CAAO,OAAA,CAAQ,WAAA,IAAe,KAAK,KAAA,CAAM,QAAA;AAC1D,MAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,MAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,KAAa,KAAA,CAAM,QAAA,EAAU;AAC/C,QAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AACjB,QAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA,MACvB;AAEA,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,KAAA,KAAU,IAAA,CAAK,OAAA;AAC9C,MAAA,MAAM,SAAA,GACJ,OAAA,GAAU,CAAA,GACN,OAAA,GACA,QAAA,GAAW,CAAA,GACT,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA,GAC7B,CAAA;AAER,MAAA,IAAI,SAAA,GAAY,CAAA,IAAK,IAAA,IAAQ,SAAA,EAAW;AACtC,QAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACvB,UAAA,KAAA,CAAM,WAAA,GAAc,QAAQ,OAAO,CAAA;AAAA,QACrC,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,UAAA,IAAa;AACrB,UAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB;AAAA,MACF;AACA,MAAA,IAAA,CAAK,YAAY,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA8B;AACjD,MAAA,IAAI,UAAA,EAAY;AAChB,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,SAAA,CAAU,UAAU,MAAA,IAAU,IAAA;AAC9B,MAAA,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,MAAA,EAAQ,WAAA,IAAe,CAAA,IAAK,CAAA;AAEpD,MAAA,MAAM,EAAE,SAAS,KAAA,EAAO,SAAA,EAAAH,YAAW,YAAA,EAAc,IAAA,KAAS,IAAA,CAAK,OAAA;AAC/D,MAAA,IAAI,IAAA,KAAS,CAAA,EAAG,MAAA,EAAQ,eAAA,GAAkB,IAAI,CAAA;AAC9C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,EAAQ,IAAA,IAAO;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,MAAA,EAAQ,MAAA,IAAS;AACjB,QAAA,MAAA,EAAQ,YAAY,EAAE,CAAA;AAAA,MACxB;AAEA,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,IAAkBA,UAAAA,EAAW;AAC5C,QAAA,cAAA,CAAe,MAAM,CAAA;AACrB,QAAA,MAAA,EAAQ,SAAA,IAAY;AACpB,QAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,MACtB;AAEA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,QAAA,IAAA,CAAK,gBAAgB,CAAA;AACrB,QAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA,MACvB;AACA,MAAA,gBAAA,GAAmB,MAAA,CAAO,WAAA,CAAY,aAAA,EAAe,GAAG,CAAA;AAAA,IAC1D,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA8B;AACvD,MAAA,IAAI,UAAA,EAAY;AAChB,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,YAAA,CAAa,OAAA;AAChB,UAAA,cAAA,CAAe,MAAM,MAAM,CAAA;AAC3B,UAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,UAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,UAAA,cAAA,CAAe,KAAK,CAAA;AACpB,UAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,UAAA,IAAA,CAAK,MAAM,CAAA;AACX,UAAA,IAAA,CAAK,SAAS,CAAA;AACd,UAAA;AAAA,QACF,KAAK,YAAA,CAAa,SAAA;AAChB,UAAA,cAAA,CAAe,IAAI,CAAA;AACnB,UAAA;AAAA,QACF,KAAK,YAAA,CAAa,MAAA;AAChB,UAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,UAAA,cAAA,CAAe,KAAK,CAAA;AACpB,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAA,CAAK,OAAO,CAAA;AACZ,UAAA;AAAA,QACF,KAAK,YAAA,CAAa,KAAA;AAChB,UAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ;AACrC,YAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAClB,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,YAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,YAAA,IAAA,CAAK,OAAO,CAAA;AAAA,UACd;AACA,UAAA;AAAA;AACJ,IACF,CAAA;AAEA,IAAA,oBAAA,EAAqB,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AAClC,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,UAAA,IAAc,CAAC,EAAA,EAAI,MAAA,IAAU,CAAC,IAAA,EAAM;AAExC,MAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,MAAA,IAAA,CAAK,YAAY,WAAW,CAAA;AAE5B,MAAA,YAAA,GAAe,8BAAA,CAA+B;AAAA,QAC5C,cAAA,EAAgB,MAAM,KAAA,CAAM,WAAA;AAAA,QAC5B,WAAA,EAAa,MAAM,KAAA,CAAM,QAAA;AAAA,QACzB,OAAA,EAAS,MAAM,KAAA,CAAM,IAAA;AAAA,QACrB,QAAA,EAAU,MAAM,KAAA,CAAM,KAAA;AAAA,QACtB,SAAA,EAAW,MAAM,KAAA,CAAM,MAAA;AAAA,QACvB,eAAA,EAAiB,MAAM,KAAA,CAAM,YAAA;AAAA,QAC7B,SAAA,EAAW,MAAM,KAAA,CAAM,MAAA;AAAA,QACvB,OAAO,MAAM;AACX,UAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,UAAA,MAAA,IAAU,UAAA,IAAa;AACvB,UAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,QACvB,CAAA;AAAA,QACA,MAAM,YAAY;AAChB,UAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,UAAA,MAAA,IAAU,SAAA,IAAY;AACtB,UAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,QACtB,CAAA;AAAA,QACA,MAAA,EAAQ,CAAC,OAAA,KAAY;AACnB,UAAA,KAAA,CAAM,WAAA,GAAc,OAAA;AACpB,UAAA,MAAA,EAAO,EAAG,MAAA,GAAS,OAAA,EAAS,IAAI,CAAA;AAChC,UAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,MAAA,IAAU,SAAA,IAAY;AAAA,QAC3C,CAAA;AAAA,QACA,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,UAAA,KAAA,CAAM,IAAA,GAAO,IAAA;AAAA,QACf,CAAA;AAAA,QACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,UAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAA,IAAU,IAAA,IAAO;AACjB,YAAA;AAAA,UACF;AACA,UAAA,MAAA,IAAU,MAAA,IAAS;AACnB,UAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,YAAA,KAAA,CAAM,MAAA,GAAS,GAAA;AACf,YAAA,MAAA,EAAO,EAAG,YAAY,EAAE,CAAA;AAAA,UAC1B;AAAA,QACF,CAAA;AAAA,QACA,eAAA,EAAiB,CAAC,IAAA,KAAS;AACzB,UAAA,KAAA,CAAM,YAAA,GAAe,IAAA;AACrB,UAAA,MAAA,EAAO,EAAG,kBAAkB,IAAI,CAAA;AAAA,QAClC,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,MAAA,KAAW;AACrB,UAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AACf,UAAA,MAAA,IAAU,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAG,CAAC,CAAA;AAC9C,UAAA,IAAI,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,EAAO;AAC7B,YAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,YAAA,MAAA,IAAU,MAAA,IAAS;AAAA,UACrB,CAAA,MAAA,IAAW,MAAA,KAAW,CAAA,IAAK,CAAC,MAAM,KAAA,EAAO;AACvC,YAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,YAAA,MAAA,IAAU,IAAA,IAAO;AAAA,UACnB;AAAA,QACF;AAAA,OACD,CAAA;AAED,MAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,MAAA,SAAA,CAAU,OAAA,GAAU,IAAI,EAAA,CAAG,MAAA,CAAO,WAAA,EAAa;AAAA,QAC7C,MAAA,EAAQ,EAAE,OAAA,EAAS,WAAA,EAAa,eAAe,iBAAA,EAAkB;AAAA,QACjE,IAAA,EAAM,kCAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU,OAAA,CAAQ,cAAA,GAAiB,CAAA,GAAI,CAAA;AAAA,UACvC,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,CAAA;AAAA,UACX,WAAA,EAAa,CAAA;AAAA,UACb,EAAA,EAAI,CAAA;AAAA,UACJ,cAAA,EAAgB,CAAA;AAAA,UAChB,IAAA,EAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,UAC3B,cAAA,EAAgB,CAAA;AAAA,UAChB,IAAA,EAAM,OAAA,CAAQ,OAAA,GAAU,CAAA,GAAI,CAAA;AAAA,UAC5B,MAAA,EAAQ,OAAO,QAAA,CAAS,MAAA;AAAA,UACxB,QAAA,EAAU,OAAA;AAAA,UACV,WAAA,EAAa,CAAA;AAAA,UACb,GAAA,EAAK,CAAA;AAAA,UACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAC;AAAA,SAC1C;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,IAAI,gBAAA,KAAqB,IAAA,EAAM,MAAA,CAAO,aAAA,CAAc,gBAAgB,CAAA;AACpE,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,SAAS,OAAA,IAAU;AAAA,MAC/B,CAAA,CAAA,MAAQ;AAAA,MAAC;AACT,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAG,UAAU,MAAM;AACd,IAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAC1B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AAC1B,IAAA,IAAI;AACF,MAAA,IAAI,SAAA,UAAmB,SAAA,IAAY;AAAA,mBACtB,UAAA,IAAa;AAC1B,MAAA,IAAI,OAAA,UAAiB,IAAA,IAAO;AAAA,mBACf,MAAA,IAAS;AACtB,MAAA,IAAI,YAAA,EAAc,OAAA,CAAQ,eAAA,GAAkB,YAAY,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,GAAG,CAAC,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,YAAY,CAAC,CAAA;AAChD;AC1VA,IAAM,iBAAA,GAAoB;AAAA,EACxB,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,eAAA,CAAgB,OAAyB,KAAA,EAAgB;AAChE,EAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,QAAS,MAAA,GAAS,GAAA;AACnD;AAEA,SAAS,qBAAqB,MAAA,EAAoB;AAChD,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,MAAA,EAAO;AACP,IAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,OAAO,CAAA;AACjD,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,OAAO,CAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAA,CAAO,iBAAiB,aAAA,EAAe,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAC9D,EAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAC5D;AAEO,SAAS,+BAAA,CAAgC;AAAA,EAC9C,KAAA,GAAQ,MAAA;AAAA,EACR,IAAA,GAAO,CAAA;AAAA,EACP,OAAA,GAAU,CAAA;AAAA,EACV,WAAA,GAAc,KAAA;AAAA,EACd,MAAA,GAAS,KAAA;AAAA,EACT,OAAA,GAAU,IAAA;AAAA,EACV,SAAA,GAAY,IAAA;AAAA,EACZ,YAAA,GAAe,CAAA;AAAA,EACf,SAAA,GAAY,IAAA;AAAA,EACZ,OAAA,GAAU,OAAA;AAAA,EACV,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,UAAA,GAAa,KAAA;AAAA,EACb,WAAA,GAAc,IAAA;AAAA,EACd,SAAA,GAAY,CAAA;AAAA,EACZ,YAAA,EAAc,aAAA;AAAA,EACd,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAiC;AAC/B,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIC,QAAAA;AAAA,IAChD,QAAQ,WAAW;AAAA,GACrB;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,IAAI,CAAA;AACnD,EAAA,MAAM,QAAA,GAAWF,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,QAAA,GAAWA,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,aAAA,GAAgBA,OAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,iBAAA,GAAoBA,OAAO,KAAK,CAAA;AACtC,EAAA,MAAM,kBAAA,GAAqBA,OAAO,CAAC,CAAA;AACnC,EAAA,MAAM,uBAAA,GAA0BA,OAAO,CAAC,CAAA;AACxC,EAAA,MAAM,gBAAA,GAAmBA,MAAAA,iBAAO,IAAI,GAAA,EAAa,CAAA;AACjD,EAAA,MAAM,kBAAA,GAAqBA,OAAO,CAAC,CAAA;AACnC,EAAA,MAAM,OAAOA,MAAAA,CAAO;AAAA,IAClB,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,IAAA,CAAK,OAAA,GAAU;AAAA,IACb,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAAC,UAAU,MAAM;AACd,IAAA,oBAAA,CAAqB,OAAA,CAAQ,WAAW,CAAC,CAAA;AACzC,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,iBAAA,CAAkB,OAAA,GAAU,KAAA;AAC5B,IAAA,kBAAA,CAAmB,OAAA,GAAU,CAAA;AAC7B,IAAA,uBAAA,CAAwB,OAAA,GAAU,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AACzB,EAAA,MAAM,cAAA,GAAiBF,OAAAA;AAAA,IACrB,MAAM,oBAAoB,OAAA,EAAS,EAAE,OAAO,OAAA,EAAS,MAAA,EAAQ,SAAS,CAAA;AAAA,IACtE,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO;AAAA,GAC1B;AACA,EAAA,MAAM,cAAA,GAAiBA,OAAAA;AAAA,IACrB,MAAM,mBAAA,CAAoB,OAAA,EAAS,EAAE,MAAA,EAAQ,SAAS,CAAA;AAAA,IACtD,CAAC,OAAO;AAAA,GACV;AACA,EAAA,MAAM,iBAAiB,UAAA,GACnB,SAAA,IAAa,sBAAA,CAAuB,OAAA,EAAS,IAAI,CAAA,GACjD,IAAA;AACJ,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,CAAC,SAAA,GAAY,KAAA,KAAU;AAC5D,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,YAAY,CAAA,IAAK,CAAA;AACjD,MAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,UAAA,EAAY,KAAA,CAAM,YAAA,GAAe,UAAA;AAE5D,MAAA,IACE,KAAA,CAAM,UAAA,GAAa,CAAA,IACnB,CAAC,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,IAC/B,KAAA,CAAM,QAAA,IAAY,CAAA,EAClB;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,IAAK,CAAC,CAAC,CAAA;AACjE,MAAA,IAAI,IAAA,CAAK,IAAI,KAAA,CAAM,MAAA,GAAS,MAAM,CAAA,GAAI,IAAA,QAAa,MAAA,GAAS,MAAA;AAE5D,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,KAAK,KAAK,MAAA,KAAW,CAAA;AACpD,MAAA,IAAI,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU,KAAA,CAAM,KAAA,GAAQ,QAAA;AAE5C,MAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA,IAAS,MAAM,OAAA,EAAS;AAChD,QAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAM;AAC/B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,YAAY,GAAA,EAAI;AAC5B,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,WAAA,GAAc,MAAM,WAAW,CAAA;AAC5D,MAAA,MAAM,QAAA,GAAW,WAAW,GAAA,GAAM,IAAA;AAClC,MAAA,IACE,aACC,KAAA,GAAQ,QAAA,IAAY,GAAA,GAAM,kBAAA,CAAmB,UAAU,IAAA,EACxD;AACA,QAAA,kBAAA,CAAmB,OAAA,GAAU,GAAA;AAC7B,QAAA,KAAA,CAAM,cAAc,KAAA,CAAM,WAAA;AAAA,MAC5B;AAEA,MAAA,IAAI,MAAM,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,KAAA,EAAyB,SAAA,EAAoB,WAAA,KAAyB;AACrE,MAAA,MAAM,WAAW,MAAM;AACrB,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,kBAAA,CAAmB,SAAS,CAAA;AAAA,MAC9B,CAAA;AACA,MAAA,KAAA,CACG,MAAK,CACL,IAAA,CAAK,QAAQ,CAAA,CACb,KAAA,CAAM,CAAC,KAAA,KAAyC;AAC/C,QAAA,IAAI,KAAA,EAAO,SAAS,iBAAA,EAAmB;AACvC,QAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,QAAA,KAAA,CACG,IAAA,EAAK,CACL,IAAA,CAAK,MAAM;AACV,UAAA,QAAA,EAAS;AACT,UAAA,IAAI,CAAC,WAAA,EAAa;AAClB,UAAA,oBAAA,CAAqB,MAAM;AACzB,YAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,YAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,OAAA,EAAS;AACpC,cAAA,eAAA,CAAgB,SAAS,KAAK,CAAA;AAAA,YAChC;AAAA,UACF,CAAC,CAAA;AAAA,QACH,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnB,CAAC,CAAA;AAAA,IACL,CAAA;AAAA,IACA,CAAC,iBAAiB,kBAAkB;AAAA,GACtC;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,EAAsB,KAAA,KAAkB;AAC7D,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACtC,MAAA,gBAAA,CAAiB,OAAA,CAAQ,OAAO,OAAO,CAAA;AACvC,MAAA,IAAI;AACF,QAAA,QAAA,EAAS;AAAA,MACX,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,GAAG,KAAK,CAAA;AACR,IAAA,gBAAA,CAAiB,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,EACtC,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ;AACrC,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,OAAA,CAAQ,aAAa,CAAC,CAAA;AACzD,MAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AACpB,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,UAAA,IAAc,CAAA,QAAS,WAAA,GAAc,SAAA;AACxD,MAAA,KAAA,CACG,IAAA,EAAK,CACL,IAAA,CAAK,MAAM;AACV,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,MAAA,QAAc,KAAA,EAAM;AACxC,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,eAAA,EAAiB,kBAAkB,CAAC,CAAA;AACxC,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,KAAA,CAAM,WAAA,GAAc,CAAA,IAAK,KAAA,CAAM,cAAc,CAAA,EAAG;AAClD,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,IAAK,CAAA;AAC3C,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,aAAA,KAAkB,IAAA,CAAK,OAAA;AAC1D,IAAA,MAAM,YAAA,GACJ,gBAAgB,CAAA,GACZ,aAAA,GACA,aAAa,CAAA,IAAK,QAAA,GAAW,CAAA,GAC3B,QAAA,GAAW,UAAA,GACX,CAAA;AAER,IAAA,IAAI,YAAA,GAAe,CAAA,IAAK,KAAA,CAAM,WAAA,IAAe,cAAc,WAAA,EAAY;AAAA,EACzE,CAAA;AACA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,IAAI,SAAS,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,MAAM,KAAA,EAAO;AACjD,MAAA,eAAA,CAAgB,OAAO,KAAK,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,UAAA,GAAa,CAAA,iBAAkB,IAAI,CAAA;AACvD,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,EAC1B,CAAA;AACA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,MAAM,KAAA,IAAS,CAAC,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW;AACtE,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,IAAI,KAAA,CAAM,cAAc,CAAA,KAAM,CAAC,KAAK,OAAA,CAAQ,SAAA,IAAa,CAAC,KAAA,CAAM,MAAA,CAAA,EAAS;AACvE,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AACA,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAA,IAAa,KAAA,CAAM,MAAA,EAAQ;AAC1C,MAAA,KAAA,CACG,IAAA,EAAK,CACL,IAAA,CAAK,MAAM;AACV,QAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW;AAC3B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,eAAA,CAAgB,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AACpD,MAAA,gBAAA,CAAiB,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,IACrC;AAAA,EACF,CAAA;AACA,EAAA,MAAM,uBAAuB,MAAM;AACjC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,KAAA,CAAM,WAAA,GAAc,SAAA,EAAW;AAClD,MAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AACpB,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,WAAA,GAAc,SAAA;AAAA,IACvD;AAAA,EACF,CAAA;AACA,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,iBAAA,CAAkB,OAAA,GAAU,IAAA;AAC5B,IAAA,KAAA,CAAM,YAAA,GAAe,YAAA;AACrB,IAAA,eAAA,CAAgB,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AACpD,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,KAAA,CAAM,WAAA,GAAc,SAAA,EAAW;AAClD,MAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AAAA,IACtB;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW;AAC3B,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB,CAAA,MAAA,IAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,gBAAA,CAAiB,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IACrC;AAAA,EACF,CAAA;AACA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AAEvB,IAAA,IAAI,KAAA,IAAS,kBAAkB,OAAA,EAAS;AACtC,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,IAAe,CAAA;AACxC,MAAA,aAAA,CAAc,MAAM;AAClB,QAAA,KAAA,CAAM,IAAA,EAAK;AACX,QAAA,KAAA,CAAM,WAAA,GAAc,UAAA;AACpB,QAAA,IAAI,KAAK,OAAA,CAAQ,SAAA,QAAiB,IAAA,EAAK,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACzD,GAAG,GAAG,CAAA;AACN,MAAA;AAAA,IACF;AAEA,IAAA,kBAAA,CAAmB,OAAA,IAAW,CAAA;AAC9B,IAAA,IAAI,KAAA,IAAS,kBAAA,CAAmB,OAAA,IAAW,CAAA,EAAG;AAC5C,MAAA,aAAA,CAAc,MAAM,KAAA,CAAM,IAAA,EAAK,EAAG,GAAG,CAAA;AACrC,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC3B,CAAA;AACA,EAAA,MAAM,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,uBAAA,CAAwB,OAAA,IAAW,CAAA;AACnC,IAAA,IAAI,uBAAA,CAAwB,WAAW,CAAA,EAAG;AACxC,MAAA,aAAA,CAAc,MAAM;AAClB,QAAA,KAAA,CAAM,IAAA,EAAK;AACX,QAAA,IAAI,SAAS,OAAA,EAAS;AACpB,UAAA,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,WAAA,IAAe,CAAA;AAAA,QACtD;AAAA,MACF,GAAG,GAAG,CAAA;AACN,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS;AACzB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAAE,UAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,OAAO,MAAA;AAC9B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,MAAM,gBAAgB,gBAAA,CAAiB,OAAA;AACvC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,eAAA,CAAgB,KAAK,CAAA;AAErB,IAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAC9C,IAAA,KAAA,MAAW,SAAS,iBAAA,EAAmB;AACrC,MAAA,KAAA,CAAM,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,IACtC;AACA,IAAA,KAAA,CAAM,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,WAAA,CAAY,MAAA,EAAQ,GAAI,CAAA;AAEjD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,cAAc,SAAS,CAAA;AAC9B,MAAA,aAAA,CAAc,QAAQ,CAAC,OAAA,KAAY,MAAA,CAAO,YAAA,CAAa,OAAO,CAAC,CAAA;AAC/D,MAAA,aAAA,CAAc,KAAA,EAAM;AACpB,MAAA,KAAA,MAAW,SAAS,iBAAA,EAAmB;AACrC,QAAA,KAAA,CAAM,mBAAA,CAAoB,OAAO,MAAM,CAAA;AAAA,MACzC;AACA,MAAA,KAAA,CAAM,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAC5C,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,KAAA,EAAM;AACZ,QAAA,KAAA,EAAO,KAAA,EAAM;AAAA,MACf,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA;AAAA,EACF,GAAG,CAAC,eAAA,EAAiB,kBAAA,EAAoB,iBAAA,EAAmB,cAAc,CAAC,CAAA;AAC3E,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,iBAAA,IAAqB,CAAC,KAAA,EAAO;AACjC,IAAA,uBAAA,CAAwB;AAAA,MACtB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,kBAAA,EAAmB;AAAA,EACrB,CAAA,EAAG;AAAA,IACD,SAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,iBAAA,IAAqB,CAAC,KAAA,EAAO;AACjC,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,OAAA,EAAS,eAAA,CAAgB,OAAO,OAAO,CAAA;AAC3D,IAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,OAAA,EAAS,kBAAA,EAAoB,iBAAiB,CAAC,CAAA;AACnD,EAAA,sBAAA,CAAuB;AAAA,IACrB,OAAA,EAAS,iBAAA;AAAA,IACT,OAAA,EAAS,aAAA;AAAA,IACT,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,SAAA,GAAY,CAAC,YAAA,IAAiB,iBAAA,IAAqB,CAAC,SAAA;AAC1D,EAAA,MAAM,kBAAA,GAAqB,WAAA,KAAgB,CAAC,YAAA,IAAgB,WAAA,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,IAAM,uBAAA,GAA0B,IAAA,CAAK,SAASE,wBAAAA,CAAwB;AAAA,EAC3E,KAAA,GAAQ,MAAA;AAAA,EACR,IAAA,GAAO,CAAA;AAAA,EACP,OAAA,GAAU,CAAA;AAAA,EACV,WAAA,GAAc,KAAA;AAAA,EACd,MAAA,GAAS,KAAA;AAAA,EACT,OAAA,GAAU,IAAA;AAAA,EACV,SAAA,GAAY,IAAA;AAAA,EACZ,YAAA,GAAe,CAAA;AAAA,EACf,SAAA,GAAY,IAAA;AAAA,EACZ,OAAA,GAAU,OAAA;AAAA,EACV,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,UAAA,GAAa,KAAA;AAAA,EACb,WAAA,GAAc,IAAA;AAAA,EACd,SAAA,GAAY,CAAA;AAAA,EACZ,KAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM;AAAA,IACJ,iBAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA,EAAgB,eAAA;AAAA,IAChB,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA,EAAoB,mBAAA;AAAA,IACpB,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,+BAAA,CAAgC;AAAA,IAClC,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IAEA,YAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,MAAM,OAAA,EAC1B,QAAA,EAAA;AAAA,oBAAAC,IAAC,KAAA,EAAA,EAAI,cAAA,EAAc,WAAW,SAAA,EAAW,KAAA,CAAM,MAAM,YAAA,EAAc,CAAA;AAAA,oBAEnEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,cAAA,EAAc,kBAAA;AAAA,QACd,SAAA,EAAW,MAAM,KAAA,CAAM,cAAA;AAAA,QAEtB,QAAA,EAAA,WAAA,mBACCA,GAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,IAAI,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,kBAAA,EAAoB,CAAA,GAC5D;AAAA;AAAA,KACN;AAAA,IAEC,iCACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,cAAA,EAAc,SAAA;AAAA,QACd,SAAA,EAAW,MAAM,KAAA,CAAM,aAAA;AAAA,QACvB,KAAA,EAAO;AAAA,UACL,eAAA,EAAiB,OAAO,cAAc,CAAA,CAAA,CAAA;AAAA,UACtC,GAAG;AAAA;AACL;AAAA,KACF,GACE,IAAA;AAAA,IAEH,iBAAA,IAAqB,CAAC,SAAA,mBACrBA,GAAAA,CAAC,SAAI,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,eAAA,EAAiB,CAAA,GAC3C,IAAA;AAAA,IAEH,oCACCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,cAAA,EAAc,YAAA;AAAA,QACd,SAAA,EAAW,MAAM,KAAA,CAAM,YAAA;AAAA,QACvB,KAAA,EAAO,UAAA;AAAA,QAEP,QAAA,kBAAAA,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,eAAe,SAAA,EAAW,KAAA,CAAM,MAAM,WAAA,EAAa;AAAA;AAAA,wBAG/D,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,GAAA,EAAK,cAAA;AAAA,UACL,cAAA,EAAc,YAAA;AAAA,UACd,SAAA,EAAW,EAAA,CAAG,YAAA,EAAc,KAAA,CAAM,MAAM,YAAY,CAAA;AAAA,UACpD,OAAA,EAAQ,MAAA;AAAA,UACR,KAAA,EAAO,OAAA;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,WAAA,EAAW,IAAA;AAAA,UACX,KAAA,EAAO,UAAA;AAAA,UACP,YAAA,EAAc,gBAAA;AAAA,UACd,OAAA,EAAS,WAAA;AAAA,UACT,MAAA,EAAQ,UAAA;AAAA,UACR,WAAW,MAAM;AACf,YAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,YAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,UAC3B,CAAA;AAAA,UACA,SAAA,EAAW,aAAA;AAAA,UACX,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAW,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,UACrC,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAW,aAAA;AAAA,UACX,gBAAA,EAAkB,oBAAA;AAAA,UAClB,YAAA,EAAc,gBAAA;AAAA,UACd,OAAA,EAAS;AAAA;AAAA,OACX;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,GAAA,EAAK,cAAA;AAAA,UACL,OAAA,EAAQ,MAAA;AAAA,UACR,SAAA,EAAW,MAAM,mBAAA,CAAoB,IAAI,CAAA;AAAA,UACzC,OAAA,EAAS;AAAA;AAAA;AACX,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAC;AC5iBM,SAAS,mBAAA,CAAoB;AAAA,EAClC,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA,EAAO,MAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA,EAYG;AACD,EAAA,MAAM,QAAA,GAAWJ,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,WAAA,GAAcK,YAAY,MAAM;AACpC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AACpB,MAAA,KAAA,CACG,IAAA,GACA,KAAA,CAAM,CAAC,UAAU,MAAA,CAAO,sBAAA,EAAwB,KAAA,EAAO,MAAM,CAAC,CAAA;AACjE,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAA,EAAM;AACZ,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AACpB,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IACE,KAAA,EAAO,YACP,IAAA,GAAO,CAAA,IACP,MAAM,WAAA,IAAe,KAAA,CAAM,WAAW,IAAA,EACtC;AACA,MAAA,WAAA,EAAY;AAAA,IACd;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AACtB,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,YAAA,GAAe,YAAA;AACrB,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,IAAI,OAAA,QAAe,KAAA,GAAQ,IAAA;AAC3B,IAAA,KAAA,CACG,IAAA,EAAK,CACL,IAAA,CAAK,MAAM,eAAA,CAAgB,IAAI,CAAC,CAAA,CAChC,KAAA,CAAM,CAAC,KAAA,KAAU;AAChB,MAAA,MAAA,CAAO,qBAAA,EAAuB,OAAO,MAAM,CAAA;AAC3C,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACL,CAAA;AACA,EAAAJ,UAAU,MAAM;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI;AACF,QAAA,KAAA,EAAO,KAAA,EAAM;AAAA,MACf,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,eAAe,CAAC,CAAA;AACzB,EAAAA,SAAAA,CAAU,MAAM,MAAM,eAAA,CAAgB,IAAI,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAC9D,EAAAA,UAAU,MAAM;AACd,IAAA,uBAAA,CAAwB;AAAA,MACtB,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,SAAA,EAAW,YAAA,EAAc,eAAe,CAAC,CAAA;AAE7C,EAAA,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,gBAAA,EAAkB,gBAAA,EAAiB;AACrE;AAEO,SAAS,WAAA,CAAY;AAAA,EAC1B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAYG;AACD,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,gBAAA,EAAkB,gBAAA,KAC/C,mBAAA,CAAoB;AAAA,IAClB,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH,EAAA,uBACEG,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,QAAA;AAAA,MACL,GAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAW,IAAA;AAAA,MACX,KAAA;AAAA,MACA,YAAA,EAAc,gBAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACT,YAAA,EAAc;AAAA;AAAA,GAChB;AAEJ;AAEO,IAAM,mBAAA,GAAsBE,IAAAA,CAAK,SAASC,oBAAAA,CAAoB;AAAA,EACnE,KAAA,GAAQ,CAAA;AAAA,EACR,SAAA;AAAA,EACA,KAAA,GAAQ,aAAA;AAAA,EACR;AACF,CAAA,EAKG;AACD,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,IAAS,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,KAAA,GAAQ,IAAI,CAAC,CAAA;AACvD,EAAA,uBACEH,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW,MAAM,KAAA,CAAM,QAAA;AAAA,MACvB,KAAA,EAAO;AAAA,QACL,GAAG,MAAM,MAAA,CAAO,QAAA;AAAA,QAChB,OAAA;AAAA,QACA,UAAA,EAAY,oBAAA,CAAqB,SAAA,EAAW,KAAK;AAAA;AACnD;AAAA,GACF;AAEJ,CAAC,CAAA;AAEM,IAAM,YAAA,GAAeE,IAAAA,CAAK,SAASE,aAAAA,CAAa;AAAA,EACrD,SAAA;AAAA,EACA,OAAA,GAAU,CAAA;AAAA,EACV,OAAA,GAAU,CAAA;AAAA,EACV,KAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,IAAI,OAAA,IAAW,GAAG,OAAO,IAAA;AACzB,EAAA,uBACEJ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAW,MAAM,KAAA,CAAM,IAAA;AAAA,MACvB,KAAA,EAAO;AAAA,QACL,OAAO,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,EAAI,OAAA,GAAU,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,QACtC,OAAA;AAAA,QACA,UAAA,EAAY,oBAAA,CAAqB,SAAA,EAAW,KAAA,IAAS,aAAa;AAAA;AACpE;AAAA,GACF;AAEJ,CAAC,CAAA;AAEM,IAAM,YAAA,GAAeE,IAAAA,CAAK,SAASG,aAAAA,CAAa;AAAA,EACrD,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,uBACEL,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,eAAA,EAAe,UAAU,OAAA,GAAU,UAAA;AAAA,MACnC,SAAA,EAAW,MAAM,KAAA,CAAM,KAAA;AAAA,MACvB,KAAA,EAAO;AAAA,QACL,GAAG,MAAM,MAAA,CAAO,KAAA;AAAA,QAChB,GAAI,OAAO,OAAA,KAAY,WAAW,EAAE,OAAA,KAAY,EAAC;AAAA,QACjD,GAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,CAAU,IAAA,EAAK,GAChD,EAAE,YAAA,EAAc,SAAA,EAA2C,GAC3D,EAAC;AAAA,QACL,GAAI,SAAA,GAAY,EAAE,WAAW,eAAA,EAAiB,SAAA,KAAc,EAAC;AAAA,QAC7D,GAAG;AAAA;AACL;AAAA,GACF;AAEJ,CAAC,CAAA;AAEM,IAAM,YAAA,GAAeE,IAAAA,CAAK,SAASI,aAAAA,CAAa;AAAA,EACrD,OAAA,GAAU,CAAA;AAAA,EACV,KAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,uBACEN,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,MAAM,KAAA,CAAM,KAAA;AAAA,MACvB,KAAA,EAAO;AAAA,QACL,OAAA;AAAA,QACA,eAAA,EAAiB,KAAA;AAAA,QACjB,GAAI,SAAA,GAAY,EAAE,WAAW,eAAA,EAAiB,SAAA,KAAc,EAAC;AAAA,QAC7D,GAAG;AAAA;AACL;AAAA,GACF;AAEJ,CAAC,CAAA;AAEM,SAAS,yBAAA,GAA4B;AAC1C,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,EAAc,sBAAA;AAAA,IACd,UAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA,EAAe,uBAAA;AAAA,IACf,KAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,kBAAA,EAAmB;AACvB,EAAA,MAAM,EAAE,eAAA,EAAiB,eAAA,EAAgB,GAAI,oBAAA,EAAqB;AAClE,EAAA,MAAM,OAAA,GAAU,oBAAoB,YAAY,CAAA;AAChD,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,YAAA,EAAa,GAAI,OAAA;AACxC,EAAA,MAAM,aAAA,GAAgBL,OAAAA;AAAA,IACpB,MAAO,SAAA,GAAY,qBAAA,CAAsB,KAAK,CAAA,GAAI,IAAA;AAAA,IAClD,CAAC,WAAW,KAAK;AAAA,GACnB;AACA,EAAA,MAAM,SAAA,GAAY,YAAA,EAAc,SAAA,IAAa,aAAA,EAAe,SAAA,IAAa,CAAA;AACzE,EAAA,MAAM,OAAA,GAAU,YAAA,EAAc,OAAA,IAAW,aAAA,EAAe,OAAA,IAAW,CAAA;AACnE,EAAA,MAAM,gBAAgB,OAAA,GAClB,aAAA,GACE,WAAW,aAAA,CAAc,OAAO,KAChC,KAAA,GACF,KAAA;AACJ,EAAA,MAAM,mBAAmB,mBAAA,EAAoB;AAC7C,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,eAAA,EAAgB;AAE3C,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACnB,MACE,yBAAA;AAAA,MACE,gBAAA;AAAA,MACA,MAAA,CAAO,SAAA,EAAW,EAAE,OAAA,EAAS,OAAO;AAAA,KACtC;AAAA,IACF,CAAC,SAAA,EAAW,gBAAA,EAAkB,OAAA,EAAS,KAAK;AAAA,GAC9C;AACA,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,YAAA,EAAc,SAAA;AAAA,IACd,aAAA,EAAe;AAAA,GACjB,GAAIA,OAAAA;AAAA,IACF,MAAM,cAAA,CAAA,CAAgB,OAAA,GAAU,UAAA,GAAa,UAAA,KAAe,EAAE,CAAA;AAAA,IAC9D,CAAC,UAAA,EAAY,OAAA,EAAS,UAAU;AAAA,GAClC;AACA,EAAA,MAAM,eAAe,sBAAA,IAA0B,SAAA;AAC/C,EAAA,MAAM,gBAAgB,uBAAA,IAA2B,UAAA;AACjD,EAAA,MAAM;AAAA,IACJ,OAAA,EAAS,YAAA;AAAA,IACT,YAAA,EAAc,cAAA;AAAA,IACd,GAAG;AAAA,GACL,GAAI,cAAc,EAAC;AACnB,EAAA,MAAM,sBAAA,GAAyBA,OAAAA;AAAA,IAC7B,OAAO;AAAA,MACL,eAAA,EAAiB,UAAA,CAAW,YAAA,CAAa,UAAA,CAAW,KAAK,CAAA;AAAA,MACzD,kBAAA,EAAoB,aAAA;AAAA,QAClB,aAAa,UAAA,CAAW,QAAA;AAAA,QACxB,iBAAiB,UAAA,CAAW;AAAA,OAC9B;AAAA,MACA,kBAAA,EAAoB,SAAA;AAAA,MACpB,wBAAA,EAA0B,WAAA,CAAY,YAAA,CAAa,UAAA,CAAW,IAAI;AAAA,KACpE,CAAA;AAAA,IACA,CAAC,gBAAA,CAAiB,UAAA,CAAW,QAAA,EAAU,aAAa,UAAU;AAAA,GAChE;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,YAAA,EAAc,KAAA,IAAS,UAAA,EAAY,KAAA;AAC7D,EAAA,MAAM,aAAA,GACJ,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,QAAQ,QAAA,KAAa,EAAA,GACxD,MAAA,GACA,OAAO,aAAa,QAAA,GAClB,CAAA,EAAG,QAAQ,CAAA,EAAA,CAAA,GACX,OAAO,QAAQ,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,GAAA,IAAO,YAAA,EAAc,GAAA,IAAO,YAAA,EAAc,SAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,SAAe,eAAe,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAWA,OAAAA;AAAA,IACf,MACE,MAAA,IAAU,WAAA,CAAY,QAAA,CAAS,MAAM,IACjC,EAAE,SAAA,EAAW,MAAA,EAAqC,GAClD,EAAC;AAAA,IACP,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,UAAA,GAAa,sBAAA;AAAA,IACjB,cAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,EAAc,cAAA;AAAA,IACd,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AACA,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,aAAA,IAAiB,UAAA,CAAW,KAAK,CAAA;AAChE,EAAA,MAAM,gBAAA,GAAmBA,OAAAA;AAAA,IACvB,MACE,uBAAA,CAAwB;AAAA,MACtB,SAAA;AAAA,MACA,QAAA,EAAU,cAAA;AAAA,MACV,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,CAAC,SAAA,EAAW,cAAA,EAAgB,YAAA,EAAc,aAAa;AAAA,GACzD;AACA,EAAA,MAAM,SAAA,GAAYA,OAAAA;AAAA,IAChB,MACE,gBAAA,CAAiB,OAAA,GACb,eAAA,CAAgB;AAAA,MACd,OAAO,YAAA,IAAgB,aAAA;AAAA,MACvB,aAAa,gBAAA,CAAiB,WAAA;AAAA,MAC9B,cAAc,gBAAA,CAAiB;AAAA,KAChC,CAAA,GACD,MAAA;AAAA,IACN,CAAC,kBAAkB,YAAY;AAAA,GACjC;AACA,EAAA,MAAM,aAAA,GACJ,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,UAAU,QAAA,GAAW,QAAA;AAC3D,EAAA,MAAM,eAAe,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,WAAW,KAAK,CAAA;AAC3D,EAAA,MAAMY,eAAAA,GAAiB,SAAA,CAAU,cAAA,IAAkB,QAAA,IAAY,MAAA;AAC/D,EAAA,MAAM,gBAAA,GAAmBZ,OAAAA;AAAA,IACvB,OAAO;AAAA,MACL,GAAG,UAAA,CAAW,WAAA;AAAA,MACd,GAAG,QAAA;AAAA,MACH,GAAIY,eAAAA,GAAiB,EAAE,cAAA,EAAAA,eAAAA,KAAmB,EAAC;AAAA,MAC3C,GAAI,SAAA,GAAY,EAAE,iBAAiB,SAAA,EAAW,SAAA,KAAc,EAAC;AAAA,MAC7D,GAAG;AAAA,KACL,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,UAAA,CAAW,WAAA,EAAa,QAAA,EAAU,WAAWA,eAAc;AAAA,GACzE;AACA,EAAA,MAAM,cAAA,GAAiBZ,OAAAA;AAAA,IACrB,MAAM,2BAAA,CAA4B,gBAAA,EAAkB,YAAY,CAAA;AAAA,IAChE,CAAC,kBAAkB,YAAY;AAAA,GACjC;AAEA,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,sBAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,sBAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,MACE,yBAAA,EAA0B;AAE9B,EAAA,uBACEK,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAK,MAAA,EACnB,2CACCQ,IAAAA;AAAA,IAAC,MAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MAEC,SAAS,YAAA,CAAa,OAAA;AAAA,MACtB,SAAS,YAAA,CAAa,OAAA;AAAA,MACtB,YAAY,YAAA,CAAa,UAAA;AAAA,MACzB,MAAM,EAAE,GAAG,YAAA,CAAa,IAAA,EAAM,YAAY,cAAA,EAAe;AAAA,MACzD,SAAA,EAAW,MAAM,KAAA,CAAM,IAAA;AAAA,MACvB,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,4BAAA;AAAA,QACZ,GAAG,MAAM,MAAA,CAAO;AAAA,OAClB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,OAAA,mBACCA,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,eAAA,EAAe,aAAA;AAAA,YACf,YAAA,EACE,UAAA,CAAW,KAAA,IAAS,aAAA,GAAgB,MAAA,GAAY,MAAA;AAAA,YAElD,WAAW,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,UAAA,EAAY,WAAW,KAAK,CAAA;AAAA,YACtD,KAAA,EAAO;AAAA,cACL,GAAG,MAAM,MAAA,CAAO,UAAA;AAAA,cAChB,GAAI,aAAA,GAAgB,EAAE,KAAA,EAAO,aAAA,KAAkB;AAAC,aAClD;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,aAAA,mBACCR,GAAAA;AAAA,gBAAC,uBAAA;AAAA,gBAAA;AAAA,kBACC,SAAS,aAAA,CAAc,OAAA;AAAA,kBACvB,SAAA;AAAA,kBACA,OAAA;AAAA,kBACA,IAAA;AAAA,kBACA,SAAA;AAAA,kBACA,OAAA;AAAA,kBACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,kBAChB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,kBACxB,YAAY,OAAA,CAAQ,UAAA;AAAA,kBACpB,aAAa,OAAA,CAAQ,WAAA;AAAA,kBACrB,YAAA;AAAA,kBACA,SAAS,OAAA,CAAQ,OAAA;AAAA,kBACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,kBACf,aAAa,OAAA,CAAQ,WAAA;AAAA,kBACrB,SAAA,EAAW,OAAA,CAAQ,UAAA,GAAa,KAAA,IAAS,IAAA,GAAO,IAAA;AAAA,kBAChD,KAAA;AAAA,kBACA,YAAA;AAAA,kBACA,UAAA,EAAY,gBAAA;AAAA,kBACZ,eAAA;AAAA,kBACA;AAAA;AAAA,kCAGFA,GAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,KAAK,KAAA,IAAS,MAAA;AAAA,kBACd,SAAA,EAAW,YAAA;AAAA,kBACX,KAAA,EAAO,gBAAA;AAAA,kBACP,IAAA;AAAA,kBACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,kBAChB,OAAA;AAAA,kBACA,SAAA;AAAA,kBACA,YAAA;AAAA,kBACA,gBAAgB,OAAA,CAAQ,cAAA;AAAA,kBACxB,eAAA;AAAA,kBACA;AAAA;AAAA,eACF;AAAA,8BAGFA,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,KAAA;AAAA,kBACA,SAAA,EAAU,MAAA;AAAA,kBACV,SAAS,gBAAA,CAAiB,WAAA;AAAA,kBAC1B,SAAS,gBAAA,CAAiB,WAAA;AAAA,kBAC1B,KAAA,EAAO;AAAA;AAAA,eACT;AAAA,8BACAA,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,KAAA;AAAA,kBACA,SAAA,EAAU,OAAA;AAAA,kBACV,SAAS,gBAAA,CAAiB,YAAA;AAAA,kBAC1B,SAAS,gBAAA,CAAiB,YAAA;AAAA,kBAC1B,KAAA,EAAO;AAAA;AAAA,eACT;AAAA,cAEC,kCACCA,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,KAAA;AAAA,kBACA,OAAA,EAAS,YAAA;AAAA,kBACT,SAAA,EAAW,cAAA;AAAA,kBACX,WAAA,EAAa,gBAAA;AAAA,kBACb;AAAA;AAAA,eACF;AAAA,cAGD,cAAA,IAAkB,2BACjBA,GAAAA;AAAA,gBAAC,YAAA;AAAA,gBAAA;AAAA,kBACC,KAAA;AAAA,kBACA,OAAA,EAAS,cAAA;AAAA,kBACT,KAAA,EAAO,YAAA;AAAA,kBACP,eAAA,EAAiB,sBAAA;AAAA,kBACjB;AAAA;AAAA;AACF;AAAA;AAAA,4BAIJA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,MAAM,KAAA,CAAM,KAAA;AAAA,YACvB,KAAA,EAAO;AAAA,cACL,eAAA,EAAiB,KAAA,GAAQ,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,CAAA,GAAM,MAAA;AAAA,cAC3C,kBAAA,EAAoB,QAAA;AAAA,cACpB,GAAG;AAAA;AACL;AAAA,SACF;AAAA,QAAA,CAGA,CAAC,OAAA,IAAW,CAAC,mCACbQ,IAAAA,CAAAC,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAT,GAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,KAAA,EAAO,YAAA;AAAA,cACP,SAAA,EAAU,MAAA;AAAA,cACV,KAAA,EAAO;AAAA;AAAA,WACT;AAAA,0BACAA,GAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,KAAA,EAAO,aAAA;AAAA,cACP,SAAA,EAAU,OAAA;AAAA,cACV,KAAA,EAAO;AAAA;AAAA,WACT;AAAA,0BACAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,OAAA,EAAO,IAAA;AAAA,cACP,OAAA,EAAS,YAAA;AAAA,cACT,SAAA,EAAW,cAAA;AAAA,cACX,WAAA,EAAa;AAAA;AAAA,WACf;AAAA,UACC,2BACCA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,OAAA,EAAS,cAAA;AAAA,cACT,KAAA,EAAO,YAAA;AAAA,cACP,eAAA,EAAiB;AAAA;AAAA;AACnB,SAAA,EAEJ;AAAA;AAAA,KAAA;AAAA,IAzIG;AAAA,GA2IP,EAEJ,CAAA;AAEJ;AC5oBO,SAAS,qBACd,UAAA,EACiC;AACjC,EAAA,OAAO,UAAA,GAAa,wBAAA,CAAyB,UAAU,CAAA,GAAI,IAAA;AAC7D;AAEA,SAAS,iBAAA,CACP,QACA,IAAA,EACmB;AACnB,EAAA,MAAM,UAAU,oBAAA,EAAqB;AACrC,EAAA,OAAOL,OAAAA;AAAA,IACL,OAAO;AAAA,MACL,GAAG,OAAA;AAAA,MACH,KAAK,CAAC,UAAA,KAAqC,KAAK,GAAA,CAAI,EAAE,YAAY;AAAA,KACpE,CAAA;AAAA,IACA,CAAC,SAAS,IAAI;AAAA,GAChB;AACF;AAEO,IAAM,mBAAmB,YAAA,CAAa;AAAA,EAC3C,EAAA,EAAI,YAAA;AAAA,EACJ,OAAA,EAAS,iBAAA;AAAA,EACT,QAAA,EAAU,kBAAA;AAAA,EACV,QAAA,EAAU,iBAAA;AAAA,EACV,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,EACd,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,GAAA;AAAA,IAChB,SAAA,EAAW,WAAA;AAAA,IACX,SAAA,EAAW,WAAA;AAAA,IACX,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,CAAC,MAAA,KAAW,oBAAA,CAAqB,OAAO,UAAU,CAAA;AAAA,IAC1D,OAAA,EAAS,CAAC,KAAA,KAAoC;AAAA,MAC5C,EAAE,GAAA,EAAK,uBAAA,EAAyB,KAAA,EAAO,KAAA;AAAM,KAC/C;AAAA,IACA,GAAA,EAAK;AAAA;AAET,CAAC;AAWM,SAAS,gBAAA,CACd,UAAA,GAAoE,EAAC,EAClD;AACnB,EAAA,MAAM,EAAE,EAAA,GAAK,YAAA,EAAc,GAAG,MAAA,EAAO,GACnC,OAAO,UAAA,KAAe,QAAA,GAAW,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI,UAAA;AAE3D,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,MAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAA,EAAK,SAAS,oBAAA,CAAqB,SAAA,GAAY,EAAC,EAAG,OAAA,GAAU,EAAC,EAAG;AAC/D,MAAA,MAAM,QACJ,OAAO,SAAA,KAAc,WAAW,EAAE,KAAA,EAAO,WAAU,GAAI,SAAA;AACzD,MAAA,OAAO,cAAc,EAAE,GAAG,QAAQ,GAAG,KAAA,IAAS,OAAO,CAAA;AAAA,IACvD;AAAA,GACD,CAAA;AACH","file":"chunk-CGHZSSFR.js","sourcesContent":["import { defineThemeSpec } from \"@/theme\";\nimport { type BackgroundMotion, type BackgroundThemeSlot } from \"./types\";\n\nexport const backgroundTheme = defineThemeSpec<\n BackgroundThemeSlot,\n BackgroundMotion\n>(\"background\");\n\nexport const BACKGROUND_REGISTRY_KEY = \"page-background\";\nexport const BACKGROUND_MEDIA_ID = \"background\";\n","import { type CSSProperties } from \"react\";\nimport { type BackgroundMediaStyle, type FadeEdges, type VideoOptions } from \"./types\";\n\nconst objectFit = (value: string): CSSProperties => ({\n objectFit: value as CSSProperties[\"objectFit\"],\n});\n\nconst objectPosition = (value: string): CSSProperties => ({\n objectPosition: value,\n});\n\nexport const BG_TOKEN_TO_OBJECT_STYLE: Readonly<Record<string, CSSProperties>> = Object.freeze({\n \"bg-bottom\": objectPosition(\"bottom\"),\n \"bg-center\": objectPosition(\"center\"),\n \"bg-contain\": objectFit(\"contain\"),\n \"bg-cover\": objectFit(\"cover\"),\n \"bg-fill\": objectFit(\"fill\"),\n \"bg-left\": objectPosition(\"left\"),\n \"bg-left-bottom\": objectPosition(\"left bottom\"),\n \"bg-left-top\": objectPosition(\"left top\"),\n \"bg-none\": objectFit(\"none\"),\n \"bg-right\": objectPosition(\"right\"),\n \"bg-right-bottom\": objectPosition(\"right bottom\"),\n \"bg-right-top\": objectPosition(\"right top\"),\n \"bg-scale-down\": objectFit(\"scale-down\"),\n \"bg-top\": objectPosition(\"top\"),\n});\n\nexport const OBJECT_FITS = Object.freeze([\"contain\", \"cover\", \"fill\", \"none\", \"scale-down\"]);\n\nexport const DEFAULT_COLOR = \"var(--black, #000)\";\n\nconst WIDTH_CLASS = /^(w-|max-w-|min-w-)/;\n\nexport function resolveVideoClassNames(...inputs: (string | null | undefined)[]): {\n objectStyle: CSSProperties;\n other: string;\n width: string;\n} {\n const tokens = inputs\n .flatMap((input) => (typeof input === \"string\" ? input.replace(/,/g, \" \").split(/\\s+/) : []))\n .filter(Boolean);\n\n return {\n objectStyle: Object.assign({}, ...tokens.map((token) => BG_TOKEN_TO_OBJECT_STYLE[token])),\n other: tokens.filter((token) => !WIDTH_CLASS.test(token)).join(\" \"),\n width: tokens.filter((token) => WIDTH_CLASS.test(token)).join(\" \"),\n };\n}\n\nexport function resolveVideoOptions(options: VideoOptions = {}) {\n return {\n codec: options.codec || \"auto\",\n corp: options.corp ?? 0,\n forceIframe: Boolean(options.forceIframe),\n isLoop: options.loop ?? false,\n isMuted: options.muted ?? true,\n playbackRate: options.playbackRate ?? 1,\n quality: options.quality || \"1080p\",\n shouldAutoPlay: options.autoplay ?? true,\n showPoster: Boolean(options.showPoster),\n showSpinner: options.showSpinner !== false,\n };\n}\n\nexport const generateBaseGradient = (direction: \"left\" | \"right\", color: string): string => {\n const to = direction === \"left\" ? \"to right\" : \"to left\";\n return `linear-gradient(${to}, ${color} 0%, color-mix(in srgb, ${color} 85%, transparent) 15%, color-mix(in srgb, ${color} 50%, transparent) 45%, color-mix(in srgb, ${color} 18%, transparent) 75%, transparent 100%)`;\n};\n\nexport const generateEdgeGradient = (direction: \"left\" | \"right\", color: string): string => {\n const to = direction === \"left\" ? \"to right\" : \"to left\";\n return `linear-gradient(${to}, color-mix(in srgb, ${color} 95%, transparent) 0%, color-mix(in srgb, ${color} 70%, transparent) 25%, color-mix(in srgb, ${color} 35%, transparent) 55%, color-mix(in srgb, ${color} 10%, transparent) 80%, transparent 100%)`;\n};\n\nexport function getVisualStyle(currentStyle: BackgroundMediaStyle = {}) {\n const { className: _className, leftGradient = 0, rightGradient = 0, ...baseStyle } = currentStyle;\n return {\n baseStyle: baseStyle as CSSProperties,\n leftGradient: Number(leftGradient) || 0,\n rightGradient: Number(rightGradient) || 0,\n };\n}\n\nexport function resolveGradientSettings({\n fadeEdges = null,\n hasWidth = false,\n leftGradient = 0,\n rightGradient = 0,\n}: {\n fadeEdges?: FadeEdges | number | string | boolean | null;\n hasWidth?: boolean;\n leftGradient?: number;\n rightGradient?: number;\n}) {\n let leftPercent = 0;\n let rightPercent = 0;\n if (leftGradient > 0) leftPercent = Math.min(48, Math.max(12, leftGradient * 7.5));\n else if (hasWidth && fadeEdges !== false) leftPercent = 20;\n if (rightGradient > 0) rightPercent = Math.min(48, Math.max(12, rightGradient * 7.5));\n else if (hasWidth && fadeEdges !== false) rightPercent = 20;\n if (typeof fadeEdges === \"number\") {\n leftPercent = fadeEdges;\n rightPercent = fadeEdges;\n } else if (typeof fadeEdges === \"string\") {\n const parsed = parseFloat(fadeEdges);\n if (!Number.isNaN(parsed)) {\n leftPercent = parsed;\n rightPercent = parsed;\n }\n } else if (typeof fadeEdges === \"object\" && fadeEdges !== null) {\n const edgeObj = fadeEdges as { left?: unknown; right?: unknown };\n if (edgeObj.left !== undefined) leftPercent = parseFloat(String(edgeObj.left)) || 0;\n if (edgeObj.right !== undefined) rightPercent = parseFloat(String(edgeObj.right)) || 0;\n } else if (fadeEdges === false) {\n leftPercent = 0;\n rightPercent = 0;\n }\n const leftOpacity = leftGradient > 0 ? Math.min(1, leftGradient * 0.22) : 0;\n const rightOpacity = rightGradient > 0 ? Math.min(1, rightGradient * 0.22) : 0;\n return {\n enabled: leftPercent > 0 || rightPercent > 0,\n leftOpacity,\n leftPercent,\n rightOpacity,\n rightPercent,\n };\n}\n\nexport function generateSmoothstepStops(\n percent: number,\n direction: \"in\" | \"out\" = \"in\",\n color = \"var(--black, #000)\",\n): string[] {\n const steps = [\n { s: 0, t: 0 },\n { s: 0.06, t: 0.15 },\n { s: 0.22, t: 0.35 },\n { s: 0.47, t: 0.55 },\n { s: 0.76, t: 0.75 },\n { s: 0.93, t: 0.9 },\n { s: 1.0, t: 1.0 },\n ];\n if (direction === \"in\") {\n return steps.map(({ s, t }) =>\n s === 0\n ? `transparent ${(t * percent).toFixed(1)}%`\n : s === 1\n ? `${color} ${(t * percent).toFixed(1)}%`\n : `color-mix(in srgb, ${color} ${Math.round(s * 100)}%, transparent) ${(t * percent).toFixed(1)}%`,\n );\n }\n return steps.map(({ s, t }) => {\n const alpha = 1 - s;\n return alpha === 0\n ? `transparent ${(100 - percent + t * percent).toFixed(1)}%`\n : alpha === 1\n ? `${color} ${(100 - percent + t * percent).toFixed(1)}%`\n : `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent) ${(100 - percent + t * percent).toFixed(1)}%`;\n });\n}\n\nexport function getEdgeFadeMask({\n color = \"var(--black, #000)\",\n leftPercent = 0,\n rightPercent = 0,\n}: {\n color?: string;\n leftPercent?: number;\n rightPercent?: number;\n}): string | undefined {\n if (leftPercent <= 0 && rightPercent <= 0) return undefined;\n const leftStops =\n leftPercent > 0 ? generateSmoothstepStops(leftPercent, \"in\", color) : [`${color} 0%`];\n const rightStops =\n rightPercent > 0 ? generateSmoothstepStops(rightPercent, \"out\", color) : [`${color} 100%`];\n return `linear-gradient(to right, ${leftStops.join(\", \")}, ${rightStops.join(\", \")})`;\n}\n","export function applyVideoPlaybackState({\n isPlaying,\n playbackRate,\n setVideoPlaying,\n videoElement,\n}: {\n isPlaying?: boolean;\n playbackRate?: number;\n setVideoPlaying: (playing: boolean) => void;\n videoElement?: HTMLVideoElement | null;\n}): void {\n if (!videoElement) return;\n\n const numericPlaybackRate = Number(playbackRate);\n const resolvedPlaybackRate =\n Number.isFinite(numericPlaybackRate) && numericPlaybackRate > 0\n ? numericPlaybackRate\n : 1;\n\n try {\n if (videoElement.playbackRate !== resolvedPlaybackRate) {\n videoElement.playbackRate = resolvedPlaybackRate;\n }\n } catch {\n return;\n }\n\n if (!isPlaying) {\n if (!videoElement.paused) videoElement.pause();\n return;\n }\n\n if (videoElement.readyState === 0) {\n return;\n }\n\n const playPromise = videoElement.play();\n if (!playPromise || typeof playPromise.then !== \"function\") return;\n\n playPromise\n .then(() => setVideoPlaying(true))\n .catch((error: { name?: string } | undefined) => {\n if (error?.name === \"AbortError\" || videoElement.readyState < 2) {\n return;\n }\n if (error?.name === \"NotAllowedError\") {\n videoElement.muted = true;\n videoElement\n .play()\n .then(() => setVideoPlaying(true))\n .catch(() => {});\n return;\n }\n setVideoPlaying(false);\n });\n}\n\nexport function triggerVideoPlaybackDirect(\n videoElement: HTMLVideoElement | null | undefined,\n nextPlaying: boolean,\n configuredMuted: boolean,\n): void {\n if (!videoElement) return;\n if (nextPlaying) {\n videoElement.muted = configuredMuted;\n if (!configuredMuted && videoElement.volume === 0) {\n videoElement.volume = 0.8;\n }\n videoElement.play().catch((err: { name?: string } | undefined) => {\n if (err?.name === \"NotAllowedError\") {\n videoElement.muted = true;\n videoElement.play().catch(() => {});\n }\n });\n } else {\n videoElement.pause();\n }\n}\n\nexport function syncVideoMutedDirect(\n videoElement: HTMLVideoElement | null | undefined,\n nextMuted: boolean,\n): void {\n if (!videoElement) return;\n videoElement.muted = nextMuted;\n if (!nextMuted && videoElement.volume === 0) {\n videoElement.volume = 0.8;\n }\n}\n\nexport function syncVideoLoopDirect(\n videoElement: HTMLVideoElement | null | undefined,\n nextLoop: boolean,\n): void {\n if (!videoElement) return;\n videoElement.loop = nextLoop;\n}\n","import { type Transition } from \"motion/react\";\nimport { cssEasing } from \"@/tokens\";\nimport { useModuleMotion } from \"@/theme\";\nimport { backgroundTheme } from \"./constants\";\nimport {\n type BackgroundAnimationConfig,\n type BackgroundMotion,\n} from \"./types\";\n\nexport function useBackgroundMotion() {\n return useModuleMotion(backgroundTheme);\n}\n\n// A page's own animation wins field by field over the app's background motion.\nexport function getBackgroundMotionConfig(\n motion: BackgroundMotion,\n animation?: BackgroundAnimationConfig | null,\n) {\n return {\n animate: animation?.animate ?? motion.animate,\n exit: animation?.exit ?? motion.exit,\n exitDurationFactor: Number(animation?.exitDurationFactor),\n initial: animation?.initial ?? motion.initial,\n transition: animation?.transition ?? motion.transition,\n };\n}\n\nexport function getBackgroundExitTransition(\n motion: BackgroundMotion,\n config: ReturnType<typeof getBackgroundMotionConfig>,\n): Transition {\n const own = config.exit.transition as\n | { duration?: number; ease?: unknown }\n | undefined;\n const fallback = motion.exit.transition as { ease?: unknown } | undefined;\n const factor = Number.isFinite(config.exitDurationFactor)\n ? Math.max(0, config.exitDurationFactor)\n : motion.exitDurationFactor;\n return {\n ...config.transition,\n delay: 0,\n duration:\n own?.duration ??\n (config.transition.duration ?? motion.transition.duration ?? 0) *\n factor,\n ease: own?.ease ?? fallback?.ease,\n } as Transition;\n}\n\nexport function toCssDuration(seconds: unknown, fallback = 0): string {\n const value = Number(seconds);\n return `${Math.max(0, Number.isFinite(value) ? value : fallback) * 1000}ms`;\n}\n\nexport function toCssDelay(seconds: unknown): string {\n const value = Number(seconds);\n return `${Math.max(0, Number.isFinite(value) ? value : 0) * 1000}ms`;\n}\n\nexport function toCssEasing(easing: unknown): string {\n return cssEasing(easing);\n}\n","import { YouTubeProxyController, YouTubeUrlConfig } from \"../types\";\n\nconst YOUTUBE_ID_PATTERN = /^[a-zA-Z0-9_-]{11}$/;\n\nfunction parseYouTubeTimeParam(value?: string | number | null): number {\n if (value === undefined || value === null || value === \"\") return 0;\n if (typeof value === \"number\") {\n return Number.isFinite(value) && value >= 0 ? value : 0;\n }\n\n const trimmed = String(value).trim().toLowerCase();\n if (!trimmed) return 0;\n\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n return Math.max(0, parseFloat(trimmed));\n }\n\n const hmsMatch = trimmed.match(\n /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+(?:\\.\\d+)?)s?)?$/,\n );\n if (hmsMatch && (hmsMatch[1] || hmsMatch[2] || hmsMatch[3])) {\n const hours = parseInt(hmsMatch[1] || \"0\", 10);\n const minutes = parseInt(hmsMatch[2] || \"0\", 10);\n const seconds = parseFloat(hmsMatch[3] || \"0\");\n return Math.max(0, hours * 3600 + minutes * 60 + seconds);\n }\n\n return 0;\n}\n\nconst YOUTUBE_HOST_PATH =\n /^(?:www\\.|m\\.|music\\.)?(?:youtube\\.com|youtu\\.be|youtube-nocookie\\.com)\\//i;\n\nfunction toUrl(input: string, { youtubeOnly = false } = {}): URL | null {\n let candidate: string | null = null;\n if (/^https?:\\/\\//.test(input)) candidate = input;\n else if (input.startsWith(\"//\")) candidate = `https:${input}`;\n else if (!youtubeOnly || YOUTUBE_HOST_PATH.test(input)) {\n candidate = `https://${input}`;\n }\n\n try {\n return candidate ? new URL(candidate) : null;\n } catch {\n return null;\n }\n}\n\nfunction getIdFromUrl(url: URL): string | null {\n const host = url.hostname.replace(/^(www\\.|m\\.|music\\.)/i, \"\").toLowerCase();\n const segments = url.pathname.split(\"/\").filter(Boolean);\n\n if (host === \"youtu.be\") {\n return YOUTUBE_ID_PATTERN.test(segments[0] ?? \"\") ? segments[0] : null;\n }\n if (\n host !== \"youtube.com\" &&\n host !== \"youtube-nocookie.com\" &&\n !host.endsWith(\".youtube.com\")\n ) {\n return null;\n }\n\n const fromQuery = url.searchParams.get(\"v\") || url.searchParams.get(\"vi\");\n if (fromQuery && YOUTUBE_ID_PATTERN.test(fromQuery)) return fromQuery;\n\n const isVideoPath =\n segments.length >= 2 &&\n [\"embed\", \"shorts\", \"live\", \"v\", \"e\", \"watch\"].includes(\n segments[0].toLowerCase(),\n );\n return isVideoPath && YOUTUBE_ID_PATTERN.test(segments[1])\n ? segments[1]\n : null;\n}\n\nexport function extractYouTubeVideoId(\n input?: string | null,\n options: { allowBareId?: boolean } = {},\n): string | null {\n const trimmed = typeof input === \"string\" ? input.trim() : \"\";\n if (!trimmed) return null;\n\n if (options.allowBareId && YOUTUBE_ID_PATTERN.test(trimmed)) return trimmed;\n\n const prefixed = trimmed.match(/^(?:youtube|yt):([a-zA-Z0-9_-]{11})$/i);\n if (prefixed) return prefixed[1];\n\n const url = toUrl(trimmed, { youtubeOnly: true });\n return url ? getIdFromUrl(url) : null;\n}\n\nexport function isYouTubeUrl(input?: string | null): boolean {\n return Boolean(extractYouTubeVideoId(input));\n}\n\nexport function isDirectVideoUrl(input?: string | null): boolean {\n if (!input || typeof input !== \"string\") return false;\n const trimmed = input.trim();\n if (!trimmed) return false;\n if (isYouTubeUrl(trimmed)) return true;\n if (\n trimmed.startsWith(\"/api/background/youtube\") ||\n trimmed.startsWith(\"blob:\")\n ) {\n return true;\n }\n const cleanPath = trimmed.split(\"?\")[0].split(\"#\")[0].toLowerCase();\n return /\\.(mp4|webm|mov|m4v|ogg|ogv|m3u8)$/i.test(cleanPath);\n}\n\nexport function parseYouTubeUrlConfig(\n input?: string | null,\n options: { allowBareId?: boolean } = {},\n): YouTubeUrlConfig | null {\n const videoId = extractYouTubeVideoId(input, options);\n if (!videoId || !input) return null;\n\n const params = toUrl(input.trim())?.searchParams;\n return {\n endTime: parseYouTubeTimeParam(params?.get(\"end\")),\n listId: params?.get(\"list\") || null,\n rawUrl: input,\n startTime: parseYouTubeTimeParam(params?.get(\"t\") || params?.get(\"start\")),\n videoId,\n };\n}\n\nexport function getYouTubeStreamUrl(\n videoId: string,\n options: {\n codec?: string;\n quality?: string;\n stream?: \"video\" | \"audio\" | \"muxed\" | \"thumbnail\" | \"meta\";\n } = {},\n): string {\n const params = new URLSearchParams();\n params.set(\"id\", videoId);\n params.set(\"stream\", options.stream || \"video\");\n if (options.quality) params.set(\"quality\", options.quality);\n if (options.codec) params.set(\"codec\", options.codec);\n return `/api/background/youtube?${params.toString()}`;\n}\n\nexport function getYouTubeThumbnailUrl(\n videoId: string,\n proxied = true,\n): string {\n if (proxied) {\n return `/api/background/youtube?id=${encodeURIComponent(videoId)}&stream=thumbnail`;\n }\n return `https://i.ytimg.com/vi/${encodeURIComponent(videoId)}/maxresdefault.jpg`;\n}\n\nexport function createYouTubeVideoElementProxy(\n controller: YouTubeProxyController,\n): HTMLVideoElement {\n const proxyVideo = document.createElement(\"video\");\n\n Object.defineProperties(proxyVideo, {\n currentTime: {\n configurable: true,\n get: () => controller.getCurrentTime(),\n set: (value: number) => {\n controller.seekTo(Number(value) || 0);\n proxyVideo.dispatchEvent(new Event(\"timeupdate\"));\n },\n },\n duration: {\n configurable: true,\n get: () => controller.getDuration(),\n },\n loop: {\n configurable: true,\n get: () => controller.getLoop(),\n set: (value: boolean) => {\n controller.setLoop(Boolean(value));\n },\n },\n muted: {\n configurable: true,\n get: () => controller.getMuted(),\n set: (value: boolean) => {\n controller.setMuted(Boolean(value));\n proxyVideo.dispatchEvent(new Event(\"volumechange\"));\n },\n },\n pause: {\n configurable: true,\n value: () => {\n controller.pause();\n proxyVideo.dispatchEvent(new Event(\"pause\"));\n },\n },\n paused: {\n configurable: true,\n get: () => controller.getPaused(),\n },\n play: {\n configurable: true,\n value: () =>\n controller.play().then(() => {\n proxyVideo.dispatchEvent(new Event(\"play\"));\n proxyVideo.dispatchEvent(new Event(\"playing\"));\n }),\n },\n playbackRate: {\n configurable: true,\n get: () => controller.getPlaybackRate(),\n set: (value: number) => {\n controller.setPlaybackRate(Number(value) || 1);\n proxyVideo.dispatchEvent(new Event(\"ratechange\"));\n },\n },\n volume: {\n configurable: true,\n get: () => controller.getVolume(),\n set: (value: number) => {\n const clamped = Math.max(0, Math.min(1, Number(value) || 0));\n controller.setVolume(clamped);\n proxyVideo.dispatchEvent(new Event(\"volumechange\"));\n },\n },\n });\n\n return proxyVideo;\n}\n","import {\n type BackgroundActions,\n type BackgroundState,\n type BackgroundStateComputed,\n type ScopedOverride,\n} from \"./types\";\nimport {\n extractYouTubeVideoId,\n getYouTubeThumbnailUrl,\n isDirectVideoUrl,\n isYouTubeUrl,\n} from \"./youtube/parse\";\n\nexport const DEFAULT_BACKGROUND: BackgroundState = Object.freeze({\n animation: null,\n className: \"\",\n fadeEdges: null,\n fit: null,\n image: null,\n imageStyle: {},\n isPlaying: false,\n noiseStyle: {},\n overlay: false,\n overlayColor: \"var(--black)\",\n overlayOpacity: 0,\n position: \"center\",\n video: null,\n videoClassName: \"\",\n videoElement: null,\n videoOptions: {\n autoplay: true,\n className: \"\",\n corp: 0,\n loop: false,\n muted: true,\n playbackRate: 1,\n width: null,\n },\n videoStyle: {},\n width: null,\n});\n\nexport const DEFAULT_BACKGROUND_COMPUTED: BackgroundStateComputed = Object.freeze({\n ...DEFAULT_BACKGROUND,\n hasBackground: false,\n isVideo: false,\n isYouTube: false,\n posterUrl: null,\n youtubeVideoId: null,\n});\n\nexport const INERT_BACKGROUND_ACTIONS: BackgroundActions = Object.freeze({\n resetBackground: () => {},\n setBackground: () => {},\n setVideoElement: () => {},\n setVideoMuted: () => {},\n setVideoPlaying: () => {},\n toggleLoop: () => {},\n toggleMute: () => {},\n toggleVideo: () => {},\n});\n\nexport function normalizeBackgroundInput(\n patch: Partial<BackgroundState> | string | null | undefined = {},\n): Partial<BackgroundState> {\n if (!patch) return {};\n\n if (typeof patch === \"string\") {\n const trimmed = patch.trim();\n if (isYouTubeUrl(trimmed) || isDirectVideoUrl(trimmed)) {\n return { image: null, video: trimmed };\n }\n return { image: trimmed };\n }\n\n const nextPatch: Partial<BackgroundState> = { ...patch };\n\n if (\n typeof nextPatch.image === \"string\" &&\n isYouTubeUrl(nextPatch.image) &&\n !nextPatch.video\n ) {\n nextPatch.video = nextPatch.image;\n nextPatch.image = null;\n }\n\n return nextPatch;\n}\n\nexport function mergeBackgroundState(\n baseState: BackgroundState,\n patch: Partial<BackgroundState> | string = {},\n): BackgroundState {\n const resolvedPatch = normalizeBackgroundInput(patch);\n\n const nextVideoOptions = {\n ...baseState.videoOptions,\n ...(resolvedPatch.videoOptions || {}),\n };\n\n const nextVideo =\n resolvedPatch.video !== undefined ? resolvedPatch.video : baseState.video;\n const shouldAutoPlay = nextVideoOptions.autoplay !== false;\n const resolvedIsPlaying =\n resolvedPatch.isPlaying !== undefined\n ? resolvedPatch.isPlaying\n : resolvedPatch.video !== undefined && Boolean(nextVideo)\n ? shouldAutoPlay\n : baseState.isPlaying;\n\n return {\n ...baseState,\n ...resolvedPatch,\n isPlaying: resolvedIsPlaying,\n animation:\n resolvedPatch.animation !== undefined\n ? resolvedPatch.animation\n ? {\n ...(baseState.animation || {}),\n ...resolvedPatch.animation,\n }\n : resolvedPatch.animation\n : baseState.animation,\n imageStyle: {\n ...baseState.imageStyle,\n ...(resolvedPatch.imageStyle || {}),\n },\n noiseStyle: {\n ...baseState.noiseStyle,\n ...(resolvedPatch.noiseStyle || {}),\n },\n videoOptions: nextVideoOptions,\n videoStyle: {\n ...baseState.videoStyle,\n ...(resolvedPatch.videoStyle || {}),\n },\n };\n}\n\nexport function resolveBackgroundState(\n registryBackground: Partial<BackgroundState> | null,\n override: ScopedOverride,\n pathname: string | null,\n): BackgroundState {\n const base = registryBackground\n ? mergeBackgroundState(DEFAULT_BACKGROUND, registryBackground)\n : DEFAULT_BACKGROUND;\n const patch = override.pathname === pathname ? override.patch : null;\n return patch ? mergeBackgroundState(base, patch) : base;\n}\n\nexport function computeBackgroundState(\n background: BackgroundState,\n): BackgroundStateComputed {\n const youtubeVideoId = extractYouTubeVideoId(background.video);\n const isYouTube = Boolean(youtubeVideoId);\n const isVideo = Boolean(background.video || isYouTube);\n\n return {\n ...background,\n hasBackground: Boolean(\n background.image ||\n isVideo ||\n background.color ||\n background.overlay ||\n (background.noiseStyle &&\n (background.noiseStyle.opacity === undefined ||\n (background.noiseStyle.opacity ?? 0) > 0)),\n ),\n isVideo,\n isYouTube,\n posterUrl: youtubeVideoId ? getYouTubeThumbnailUrl(youtubeVideoId) : null,\n youtubeVideoId,\n };\n}\n","\"use client\";\n\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport {\n useIsomorphicLayoutEffect,\n useStore,\n} from \"@/hooks\";\nimport {\n getOrCreateGlobalContext,\n useRegistryValue,\n} from \"@/kernel\";\nimport { useOptionalMediaActions } from \"../media\";\nimport { createStore } from \"@/utils\";\nimport {\n BACKGROUND_MEDIA_ID,\n BACKGROUND_REGISTRY_KEY,\n} from \"./constants\";\nimport {\n computeBackgroundState,\n normalizeBackgroundInput,\n resolveBackgroundState,\n} from \"./state\";\nimport {\n syncVideoLoopDirect,\n syncVideoMutedDirect,\n triggerVideoPlaybackDirect,\n} from \"./playback\";\nimport {\n type BackgroundActions,\n type BackgroundContextValue,\n type BackgroundProviderProps,\n type BackgroundState,\n type BackgroundStateComputed,\n type ScopedOverride,\n} from \"./types\";\n\nexport const BackgroundContext =\n getOrCreateGlobalContext<BackgroundContextValue | null>(\n \"BackgroundContext\",\n null,\n );\n\nfunction useSafePathname(): string | null {\n try {\n return usePathname();\n } catch {\n return null;\n }\n}\n\nexport function BackgroundProvider({ children }: BackgroundProviderProps) {\n const pathname = useSafePathname();\n const registryBackground =\n useRegistryValue<\"background\", Partial<BackgroundState>>(\n \"background\",\n BACKGROUND_REGISTRY_KEY,\n ) ?? null;\n\n const [overrideStore] = useState(() =>\n createStore<ScopedOverride>(\n { patch: null, pathname },\n { freezeSnapshots: false },\n ),\n );\n const scopedOverride = useStore(overrideStore);\n\n const inputsRef = useRef({ pathname, registryBackground });\n useIsomorphicLayoutEffect(() => {\n inputsRef.current = { pathname, registryBackground };\n }, [pathname, registryBackground]);\n\n const videoElementRef = useRef<HTMLVideoElement | null>(null);\n\n const state = useMemo(\n () =>\n computeBackgroundState(\n resolveBackgroundState(registryBackground, scopedOverride, pathname),\n ),\n [pathname, registryBackground, scopedOverride],\n );\n\n const [stateStore] = useState(() =>\n createStore<BackgroundStateComputed>(state, { freezeSnapshots: false }),\n );\n useIsomorphicLayoutEffect(() => {\n stateStore.publish(state);\n }, [state, stateStore]);\n\n const actions = useMemo<BackgroundActions>(() => {\n const readCurrent = (): BackgroundState => {\n const { pathname: currentPath, registryBackground: registry } =\n inputsRef.current;\n return resolveBackgroundState(\n registry,\n overrideStore.getSnapshot(),\n currentPath,\n );\n };\n\n const updatePatch = (\n updater: (current: BackgroundState) => Partial<BackgroundState>,\n ) => {\n overrideStore.publish((prev) => {\n const { pathname: currentPath, registryBackground: registry } =\n inputsRef.current;\n const currentPatch = prev.pathname === currentPath ? prev.patch : null;\n const rawNext = updater(\n resolveBackgroundState(registry, prev, currentPath),\n );\n if (!rawNext || Object.keys(rawNext).length === 0) {\n return prev;\n }\n const normalizedNext = normalizeBackgroundInput(rawNext);\n const mergedPatch: Partial<BackgroundState> = {\n ...(currentPatch || {}),\n ...normalizedNext,\n ...(currentPatch?.videoOptions || normalizedNext.videoOptions\n ? {\n videoOptions: {\n ...(currentPatch?.videoOptions || {}),\n ...(normalizedNext.videoOptions || {}),\n },\n }\n : {}),\n };\n return {\n patch: mergedPatch,\n pathname: currentPath,\n };\n });\n };\n\n const currentVideoElement = (current: BackgroundState) =>\n videoElementRef.current || current.videoElement;\n\n return {\n resetBackground: () => {\n overrideStore.publish({\n patch: null,\n pathname: inputsRef.current.pathname,\n });\n },\n setBackground: (nextBackground: Partial<BackgroundState> | string) => {\n updatePatch(() => normalizeBackgroundInput(nextBackground));\n },\n setVideoElement: (videoElement: HTMLVideoElement | null) => {\n videoElementRef.current = videoElement;\n updatePatch((cur) =>\n cur.videoElement === videoElement ? {} : { videoElement },\n );\n },\n setVideoMuted: (muted: boolean) => {\n const nextMuted = Boolean(muted);\n syncVideoMutedDirect(currentVideoElement(readCurrent()), nextMuted);\n updatePatch((cur) => {\n if (cur.videoOptions?.muted === nextMuted) return {};\n return {\n videoOptions: { ...cur.videoOptions, muted: nextMuted },\n };\n });\n },\n setVideoPlaying: (isPlaying: boolean) => {\n updatePatch((cur) =>\n cur.isPlaying === isPlaying ? {} : { isPlaying },\n );\n },\n toggleLoop: () => {\n const current = readCurrent();\n const nextLoop = !current.videoOptions?.loop;\n syncVideoLoopDirect(currentVideoElement(current), nextLoop);\n updatePatch((cur) => ({\n videoOptions: { ...cur.videoOptions, loop: nextLoop },\n }));\n },\n toggleMute: () => {\n const current = readCurrent();\n const nextMuted = !current.videoOptions?.muted;\n syncVideoMutedDirect(currentVideoElement(current), nextMuted);\n updatePatch((cur) => ({\n isPlaying: nextMuted ? cur.isPlaying : true,\n videoOptions: { ...cur.videoOptions, muted: nextMuted },\n }));\n },\n toggleVideo: () => {\n const current = readCurrent();\n const videoEl = currentVideoElement(current);\n const domIsActuallyPlaying = videoEl\n ? !videoEl.paused && !videoEl.ended\n : Boolean(current.isPlaying);\n const nextPlaying = !domIsActuallyPlaying;\n const configuredMuted = Boolean(current.videoOptions?.muted);\n\n triggerVideoPlaybackDirect(videoEl, nextPlaying, configuredMuted);\n\n updatePatch(() => ({ isPlaying: nextPlaying }));\n },\n };\n }, [overrideStore]);\n\n const media = useOptionalMediaActions();\n const { isPlaying, isVideo, videoElement } = state;\n const isLoop = Boolean(state.videoOptions?.loop);\n useEffect(() => {\n if (!isVideo) {\n media.removeSource(BACKGROUND_MEDIA_ID);\n return;\n }\n media.upsertSource({\n controls: {\n setMuted: actions.setVideoMuted,\n toggle: actions.toggleVideo,\n toggleLoop: actions.toggleLoop,\n },\n element: videoElement ?? null,\n id: BACKGROUND_MEDIA_ID,\n isPlaying,\n kind: \"video\",\n loop: isLoop,\n });\n }, [actions, isLoop, isPlaying, isVideo, media, videoElement]);\n useEffect(() => () => media.removeSource(BACKGROUND_MEDIA_ID), [media]);\n\n const value = useMemo<BackgroundContextValue>(\n () => ({ actions, store: stateStore }),\n [actions, stateStore],\n );\n\n return <BackgroundContext value={value}>{children}</BackgroundContext>;\n}\n","\"use client\";\n\nimport { useContext, useMemo } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n useModuleRegistration,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { createStore } from \"@/utils\";\nimport { BackgroundContext } from \"./context\";\nimport {\n DEFAULT_BACKGROUND_COMPUTED,\n INERT_BACKGROUND_ACTIONS,\n} from \"./state\";\nimport type {\n BackgroundActions,\n BackgroundPageConfig,\n BackgroundStateComputed,\n} from \"./types\";\n\nconst NOOP_BACKGROUND_STORE = createStore<BackgroundStateComputed>(\n DEFAULT_BACKGROUND_COMPUTED,\n);\n\nexport function useBackgroundRegistration(\n config: BackgroundPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"background\", config, options);\n}\n\nexport function useBackgroundState(): BackgroundStateComputed {\n const { store } = useRequiredContext(\n BackgroundContext,\n \"useBackgroundState\",\n \"BackgroundProvider\",\n );\n return useStore(store);\n}\n\nexport function useBackgroundActions(): BackgroundActions {\n return useRequiredContext(\n BackgroundContext,\n \"useBackgroundActions\",\n \"BackgroundProvider\",\n ).actions;\n}\n\nexport function useBackground(\n config?: BackgroundPageConfig | null,\n options?: RegistryMetadata & { enabled?: boolean },\n): BackgroundStateComputed & BackgroundActions {\n useBackgroundRegistration(config, options);\n\n const actions = useBackgroundActions();\n const state = useBackgroundState();\n\n return useMemo(() => ({ ...state, ...actions }), [actions, state]);\n}\n\nexport function useOptionalBackgroundState(): BackgroundStateComputed;\nexport function useOptionalBackgroundState<T>(\n selector: (state: BackgroundStateComputed) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalBackgroundState<T = BackgroundStateComputed>(\n selector?: (state: BackgroundStateComputed) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(BackgroundContext);\n return useStore(\n ctx?.store ?? NOOP_BACKGROUND_STORE,\n selector as (state: BackgroundStateComputed) => T,\n isEqual,\n );\n}\n\nexport function useOptionalBackgroundActions(): BackgroundActions {\n const ctx = useContext(BackgroundContext);\n return ctx?.actions ?? INERT_BACKGROUND_ACTIONS;\n}\n","\"use client\";\n\nimport {\n useEffect,\n useRef,\n type Dispatch,\n type MutableRefObject,\n type RefObject,\n type SetStateAction,\n} from \"react\";\nimport { createYouTubeVideoElementProxy } from \"./parse\";\nimport { type BackgroundActions } from \"../types\";\n\ninterface YouTubePlayer {\n destroy?(): void;\n getCurrentTime?(): number;\n getDuration?(): number;\n mute?(): void;\n pauseVideo?(): void;\n playVideo?(): void;\n seekTo?(seconds: number, allowSeekAhead?: boolean): void;\n setPlaybackQuality?(quality: string): void;\n setPlaybackQualityRange?(min: string, max: string): void;\n setPlaybackRate?(rate: number): void;\n setVolume?(volume: number): void;\n unMute?(): void;\n}\n\ninterface YouTubePlayerEvent {\n data?: number;\n target?: YouTubePlayer;\n}\n\ndeclare global {\n interface Window {\n YT?: {\n Player: new (\n element: HTMLElement | string,\n options: Record<string, unknown>,\n ) => YouTubePlayer;\n };\n onYouTubeIframeAPIReady?: () => void;\n }\n}\n\nconst PLAYER_STATE = { ENDED: 0, PLAYING: 1, PAUSED: 2, BUFFERING: 3 } as const;\n\nexport interface YouTubeLiveState {\n corp: number;\n endTime: number;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying: boolean;\n playbackRate: number;\n shouldAutoPlay: boolean;\n startTime: number;\n}\n\nlet apiPromise: Promise<Window[\"YT\"] | null> | null = null;\n\nfunction loadYouTubeIframeApi(): Promise<Window[\"YT\"] | null> {\n if (typeof window === \"undefined\") return Promise.resolve(null);\n if (window.YT?.Player) return Promise.resolve(window.YT);\n if (apiPromise) return apiPromise;\n\n apiPromise = new Promise((resolve) => {\n const previousCallback = window.onYouTubeIframeAPIReady;\n window.onYouTubeIframeAPIReady = () => {\n previousCallback?.();\n resolve(window.YT);\n };\n\n if (\n !document.querySelector(\n 'script[src=\"https://www.youtube.com/iframe_api\"]',\n )\n ) {\n const script = document.createElement(\"script\");\n script.src = \"https://www.youtube.com/iframe_api\";\n script.async = true;\n document.head.appendChild(script);\n }\n });\n return apiPromise;\n}\n\nfunction setHighQuality(player?: YouTubePlayer) {\n player?.setPlaybackQualityRange?.(\"hd1080\", \"hd1080\");\n player?.setPlaybackQuality?.(\"hd1080\");\n}\n\nexport function useYouTubeIframePlayer({\n enabled,\n hostRef,\n isLoop,\n isMuted,\n isPlaying,\n live,\n playbackRate,\n setIsBuffering,\n setIsFrameReady,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n startTime,\n videoId,\n}: {\n enabled: boolean;\n hostRef: RefObject<HTMLDivElement | null>;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying: boolean;\n live: MutableRefObject<YouTubeLiveState>;\n playbackRate: number;\n setIsBuffering: Dispatch<SetStateAction<boolean>>;\n setIsFrameReady: Dispatch<SetStateAction<boolean>>;\n setVideoElement: BackgroundActions[\"setVideoElement\"];\n setVideoPlaying: BackgroundActions[\"setVideoPlaying\"];\n shouldAutoPlay: boolean;\n startTime: number;\n videoId: string;\n}) {\n const playerRef = useRef<YouTubePlayer | null>(null);\n\n useEffect(() => {\n if (!enabled) return undefined;\n let isDisposed = false;\n let progressInterval: number | null = null;\n let proxyElement: HTMLVideoElement | null = null;\n\n const state = {\n currentTime: startTime || 0,\n duration: 0,\n loop: Boolean(isLoop),\n muted: Boolean(isMuted),\n paused: !shouldAutoPlay,\n playbackRate: Number(playbackRate) || 1,\n volume: isMuted ? 0 : 0.8,\n };\n const player = () => playerRef.current;\n const restart = (target?: YouTubePlayer | null) => {\n const restartAt = Math.max(0, live.current.startTime || 0);\n target?.seekTo?.(restartAt, true);\n target?.playVideo?.();\n return restartAt;\n };\n const emit = (type: string) => proxyElement?.dispatchEvent(new Event(type));\n\n const trackProgress = () => {\n const current = player();\n if (!current || typeof current.getCurrentTime !== \"function\") return;\n\n const time = Number(current.getCurrentTime()) || 0;\n const duration = Number(current.getDuration?.()) || state.duration;\n state.currentTime = time;\n if (duration > 0 && duration !== state.duration) {\n state.duration = duration;\n emit(\"durationchange\");\n }\n\n const { corp, endTime, isLoop: loops } = live.current;\n const safetyEnd =\n endTime > 0\n ? endTime\n : duration > 0\n ? duration - Math.max(corp, 0.4)\n : 0;\n\n if (safetyEnd > 0 && time >= safetyEnd) {\n if (state.loop || loops) {\n state.currentTime = restart(current);\n } else {\n current.pauseVideo?.();\n state.paused = true;\n setVideoPlaying(false);\n }\n }\n emit(\"timeupdate\");\n };\n\n const handleReady = (event: YouTubePlayerEvent) => {\n if (isDisposed) return;\n const target = event.target;\n playerRef.current = target ?? null;\n state.duration = Number(target?.getDuration?.()) || 0;\n\n const { isMuted: muted, isPlaying, playbackRate: rate } = live.current;\n if (rate !== 1) target?.setPlaybackRate?.(rate);\n if (muted) {\n target?.mute?.();\n } else {\n target?.unMute?.();\n target?.setVolume?.(80);\n }\n\n if (live.current.shouldAutoPlay && isPlaying) {\n setHighQuality(target);\n target?.playVideo?.();\n state.paused = false;\n setVideoPlaying(true);\n }\n\n if (proxyElement) {\n setVideoElement(proxyElement);\n emit(\"loadedmetadata\");\n emit(\"durationchange\");\n }\n progressInterval = window.setInterval(trackProgress, 200);\n };\n\n const handleStateChange = (event: YouTubePlayerEvent) => {\n if (isDisposed) return;\n switch (event.data) {\n case PLAYER_STATE.PLAYING:\n setHighQuality(event.target);\n state.paused = false;\n setIsFrameReady(true);\n setIsBuffering(false);\n setVideoPlaying(true);\n emit(\"play\");\n emit(\"playing\");\n break;\n case PLAYER_STATE.BUFFERING:\n setIsBuffering(true);\n break;\n case PLAYER_STATE.PAUSED:\n state.paused = true;\n setIsBuffering(false);\n setVideoPlaying(false);\n emit(\"pause\");\n break;\n case PLAYER_STATE.ENDED:\n if (state.loop || live.current.isLoop) {\n restart(player());\n } else {\n state.paused = true;\n setVideoPlaying(false);\n emit(\"ended\");\n }\n break;\n }\n };\n\n loadYouTubeIframeApi().then((YT) => {\n const host = hostRef.current;\n if (isDisposed || !YT?.Player || !host) return;\n\n host.innerHTML = \"\";\n const mountTarget = document.createElement(\"div\");\n host.appendChild(mountTarget);\n\n proxyElement = createYouTubeVideoElementProxy({\n getCurrentTime: () => state.currentTime,\n getDuration: () => state.duration,\n getLoop: () => state.loop,\n getMuted: () => state.muted,\n getPaused: () => state.paused,\n getPlaybackRate: () => state.playbackRate,\n getVolume: () => state.volume,\n pause: () => {\n state.paused = true;\n player()?.pauseVideo?.();\n setVideoPlaying(false);\n },\n play: async () => {\n state.paused = false;\n player()?.playVideo?.();\n setVideoPlaying(true);\n },\n seekTo: (seconds) => {\n state.currentTime = seconds;\n player()?.seekTo?.(seconds, true);\n if (!state.paused) player()?.playVideo?.();\n },\n setLoop: (loop) => {\n state.loop = loop;\n },\n setMuted: (muted) => {\n state.muted = muted;\n if (muted) {\n player()?.mute?.();\n return;\n }\n player()?.unMute?.();\n if (state.volume === 0) {\n state.volume = 0.7;\n player()?.setVolume?.(70);\n }\n },\n setPlaybackRate: (rate) => {\n state.playbackRate = rate;\n player()?.setPlaybackRate?.(rate);\n },\n setVolume: (volume) => {\n state.volume = volume;\n player()?.setVolume?.(Math.round(volume * 100));\n if (volume > 0 && state.muted) {\n state.muted = false;\n player()?.unMute?.();\n } else if (volume === 0 && !state.muted) {\n state.muted = true;\n player()?.mute?.();\n }\n },\n });\n\n const initial = live.current;\n playerRef.current = new YT.Player(mountTarget, {\n events: { onReady: handleReady, onStateChange: handleStateChange },\n host: \"https://www.youtube-nocookie.com\",\n playerVars: {\n autoplay: initial.shouldAutoPlay ? 1 : 0,\n controls: 0,\n disablekb: 1,\n enablejsapi: 1,\n fs: 0,\n iv_load_policy: 3,\n loop: initial.isLoop ? 1 : 0,\n modestbranding: 1,\n mute: initial.isMuted ? 1 : 0,\n origin: window.location.origin,\n playlist: videoId,\n playsinline: 1,\n rel: 0,\n start: Math.floor(initial.startTime || 0),\n },\n videoId,\n });\n });\n\n return () => {\n isDisposed = true;\n if (progressInterval !== null) window.clearInterval(progressInterval);\n try {\n playerRef.current?.destroy?.();\n } catch {}\n playerRef.current = null;\n setVideoElement(null);\n };\n }, [\n enabled,\n hostRef,\n isLoop,\n isMuted,\n live,\n playbackRate,\n setIsBuffering,\n setIsFrameReady,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n startTime,\n videoId,\n ]);\n\n useEffect(() => {\n const current = playerRef.current;\n if (!enabled || !current) return;\n try {\n if (isPlaying) current.playVideo?.();\n else current.pauseVideo?.();\n if (isMuted) current.mute?.();\n else current.unMute?.();\n if (playbackRate) current.setPlaybackRate?.(playbackRate);\n } catch {}\n }, [enabled, isMuted, isPlaying, playbackRate]);\n}\n","\"use client\";\n\nimport {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"@/utils\";\nimport { Spinner } from \"@/atoms\";\nimport { applyVideoPlaybackState } from \"../playback\";\nimport {\n getYouTubeStreamUrl,\n getYouTubeThumbnailUrl,\n} from \"./parse\";\nimport { useYouTubeIframePlayer } from \"./iframe\";\nimport { type YouTubeBackgroundPlayerProps } from \"../types\";\n\nconst AUDIO_SYNC_EVENTS = [\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"volumechange\",\n \"ratechange\",\n] as const;\n\nfunction setElementMuted(video: HTMLVideoElement, muted: boolean) {\n video.muted = muted;\n if (!muted && video.volume === 0) video.volume = 0.8;\n}\n\nfunction unlockAudioOnGesture(unlock: () => void) {\n const handler = () => {\n unlock();\n window.removeEventListener(\"pointerdown\", handler);\n window.removeEventListener(\"keydown\", handler);\n };\n window.addEventListener(\"pointerdown\", handler, { once: true });\n window.addEventListener(\"keydown\", handler, { once: true });\n}\n\nexport function useYouTubeBackgroundPlayerModel({\n codec = \"auto\",\n corp = 0,\n endTime = 0,\n forceIframe = false,\n isLoop = false,\n isMuted = true,\n isPlaying = true,\n playbackRate = 1,\n posterUrl = null,\n quality = \"1080p\",\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay = true,\n showPoster = false,\n showSpinner = true,\n startTime = 0,\n videoClasses: _videoClasses,\n videoId,\n videoStyle: _videoStyle,\n}: YouTubeBackgroundPlayerProps) {\n const [useIframeFallback, setUseIframeFallback] = useState(\n Boolean(forceIframe),\n );\n const [isFrameReady, setIsFrameReady] = useState(false);\n const [isBuffering, setIsBuffering] = useState(true);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const iframeHostRef = useRef<HTMLDivElement | null>(null);\n const hasLoadedVideoRef = useRef(false);\n const errorRetryCountRef = useRef(0);\n const audioErrorRetryCountRef = useRef(0);\n const retryTimerIdsRef = useRef(new Set<number>());\n const lastAudioSeekAtRef = useRef(0);\n const live = useRef({\n corp,\n endTime,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n shouldAutoPlay,\n startTime,\n });\n live.current = {\n corp,\n endTime,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n shouldAutoPlay,\n startTime,\n };\n useEffect(() => {\n setUseIframeFallback(Boolean(forceIframe));\n setIsFrameReady(false);\n setIsBuffering(true);\n hasLoadedVideoRef.current = false;\n errorRetryCountRef.current = 0;\n audioErrorRetryCountRef.current = 0;\n }, [forceIframe, videoId]);\n const videoStreamUrl = useMemo(\n () => getYouTubeStreamUrl(videoId, { codec, quality, stream: \"video\" }),\n [codec, quality, videoId],\n );\n const audioStreamUrl = useMemo(\n () => getYouTubeStreamUrl(videoId, { stream: \"audio\" }),\n [videoId],\n );\n const resolvedPoster = showPoster\n ? posterUrl || getYouTubeThumbnailUrl(videoId, true)\n : null;\n const syncCompanionAudio = useCallback((forceSeek = false) => {\n const video = videoRef.current;\n const audio = audioRef.current;\n if (!video || !audio) return;\n\n try {\n const targetRate = Number(video.playbackRate) || 1;\n if (audio.playbackRate !== targetRate) audio.playbackRate = targetRate;\n\n if (\n audio.readyState < 2 ||\n !Number.isFinite(audio.duration) ||\n audio.duration <= 0\n ) {\n return;\n }\n\n const volume = Math.max(0, Math.min(1, Number(video.volume) ?? 1));\n if (Math.abs(audio.volume - volume) > 0.005) audio.volume = volume;\n\n const isSilent = Boolean(video.muted) || volume === 0;\n if (audio.muted !== isSilent) audio.muted = isSilent;\n\n if (video.paused || video.ended || video.seeking) {\n if (!audio.paused) audio.pause();\n return;\n }\n\n const now = performance.now();\n const drift = Math.abs(audio.currentTime - video.currentTime);\n const maxDrift = isSilent ? 0.5 : 0.35;\n if (\n forceSeek ||\n (drift > maxDrift && now - lastAudioSeekAtRef.current > 1500)\n ) {\n lastAudioSeekAtRef.current = now;\n audio.currentTime = video.currentTime;\n }\n\n if (audio.paused) audio.play().catch(() => {});\n } catch {}\n }, []);\n const playWithFallback = useCallback(\n (video: HTMLVideoElement, forceSeek: boolean, unlockAudio: boolean) => {\n const onPlayed = () => {\n setVideoPlaying(true);\n syncCompanionAudio(forceSeek);\n };\n video\n .play()\n .then(onPlayed)\n .catch((error: { name?: string } | undefined) => {\n if (error?.name !== \"NotAllowedError\") return;\n video.muted = true;\n video\n .play()\n .then(() => {\n onPlayed();\n if (!unlockAudio) return;\n unlockAudioOnGesture(() => {\n const current = videoRef.current;\n if (!live.current.isMuted && current) {\n setElementMuted(current, false);\n }\n });\n })\n .catch(() => {});\n });\n },\n [setVideoPlaying, syncCompanionAudio],\n );\n const scheduleRetry = (callback: () => void, delay: number) => {\n const timerId = window.setTimeout(() => {\n retryTimerIdsRef.current.delete(timerId);\n try {\n callback();\n } catch {}\n }, delay);\n retryTimerIdsRef.current.add(timerId);\n };\n const handleEnded = useCallback(() => {\n const video = videoRef.current;\n const audio = audioRef.current;\n if (!video) return;\n\n if (video.loop || live.current.isLoop) {\n const resetTime = Math.max(0, live.current.startTime || 0);\n video.currentTime = resetTime;\n if (audio && audio.readyState >= 2) audio.currentTime = resetTime;\n video\n .play()\n .then(() => {\n setVideoPlaying(true);\n syncCompanionAudio(true);\n })\n .catch(() => {});\n return;\n }\n\n video.pause();\n if (audio && !audio.paused) audio.pause();\n setVideoPlaying(false);\n }, [setVideoPlaying, syncCompanionAudio]);\n const handleTimeUpdate = () => {\n const video = videoRef.current;\n if (!video) return;\n\n if (video.currentTime > 0 && video.readyState >= 2) {\n setIsFrameReady(true);\n setIsBuffering(false);\n }\n\n const duration = Number(video.duration) || 0;\n const { corp: activeCorp, endTime: activeEndTime } = live.current;\n const effectiveEnd =\n activeEndTime > 0\n ? activeEndTime\n : activeCorp > 0 && duration > 0\n ? duration - activeCorp\n : 0;\n\n if (effectiveEnd > 0 && video.currentTime >= effectiveEnd) handleEnded();\n };\n const handlePlay = () => {\n const video = videoRef.current;\n hasLoadedVideoRef.current = true;\n if (video && !live.current.isMuted && video.muted) {\n setElementMuted(video, false);\n }\n if (!video || video.readyState < 2) setIsBuffering(true);\n setVideoPlaying(true);\n syncCompanionAudio(false);\n };\n const handlePlaying = () => {\n hasLoadedVideoRef.current = true;\n setIsFrameReady(true);\n setIsBuffering(false);\n setVideoPlaying(true);\n syncCompanionAudio(false);\n };\n const handlePause = () => {\n const video = videoRef.current;\n syncCompanionAudio(false);\n setIsBuffering(false);\n if (video && !video.seeking && !video.ended && !live.current.isPlaying) {\n setVideoPlaying(false);\n }\n };\n const handleSeeked = () => {\n const video = videoRef.current;\n if (!video) return;\n setIsFrameReady(true);\n if (video.readyState >= 2 && (!live.current.isPlaying || !video.paused)) {\n setIsBuffering(false);\n }\n syncCompanionAudio(true);\n if (live.current.isPlaying && video.paused) {\n video\n .play()\n .then(() => {\n setVideoPlaying(true);\n syncCompanionAudio(true);\n })\n .catch(() => {});\n }\n };\n const handleCanPlay = () => {\n const video = videoRef.current;\n if (!video) return;\n hasLoadedVideoRef.current = true;\n if (!live.current.isPlaying) {\n setIsFrameReady(true);\n setIsBuffering(false);\n } else if (video.paused) {\n setElementMuted(video, Boolean(live.current.isMuted));\n playWithFallback(video, false, true);\n }\n };\n const handleLoadedMetadata = () => {\n const video = videoRef.current;\n if (!video) return;\n hasLoadedVideoRef.current = true;\n if (startTime > 0 && video.currentTime < startTime) {\n video.currentTime = startTime;\n if (audioRef.current) audioRef.current.currentTime = startTime;\n }\n };\n const handleLoadedData = () => {\n const video = videoRef.current;\n if (!video) return;\n hasLoadedVideoRef.current = true;\n video.playbackRate = playbackRate;\n setElementMuted(video, Boolean(live.current.isMuted));\n if (startTime > 0 && video.currentTime < startTime) {\n video.currentTime = startTime;\n }\n if (!live.current.isPlaying) {\n setIsFrameReady(true);\n setIsBuffering(false);\n } else if (video.paused) {\n playWithFallback(video, true, false);\n }\n };\n const handleError = () => {\n const video = videoRef.current;\n\n if (video && hasLoadedVideoRef.current) {\n const resumeTime = video.currentTime || 0;\n scheduleRetry(() => {\n video.load();\n video.currentTime = resumeTime;\n if (live.current.isPlaying) video.play().catch(() => {});\n }, 150);\n return;\n }\n\n errorRetryCountRef.current += 1;\n if (video && errorRetryCountRef.current <= 1) {\n scheduleRetry(() => video.load(), 200);\n return;\n }\n setUseIframeFallback(true);\n };\n const handleAudioError = useCallback(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n audioErrorRetryCountRef.current += 1;\n if (audioErrorRetryCountRef.current <= 1) {\n scheduleRetry(() => {\n audio.load();\n if (videoRef.current) {\n audio.currentTime = videoRef.current.currentTime || 0;\n }\n }, 200);\n return;\n }\n\n if (!live.current.isMuted) {\n setUseIframeFallback(true);\n }\n }, []);\n useEffect(() => {\n if (useIframeFallback) return undefined;\n const video = videoRef.current;\n const audio = audioRef.current;\n const retryTimerIds = retryTimerIdsRef.current;\n if (!video) {\n setVideoElement(null);\n return undefined;\n }\n\n setVideoElement(video);\n\n const onSync = () => syncCompanionAudio(false);\n const onSeeked = () => syncCompanionAudio(true);\n for (const event of AUDIO_SYNC_EVENTS) {\n video.addEventListener(event, onSync);\n }\n video.addEventListener(\"seeked\", onSeeked);\n const syncTimer = window.setInterval(onSync, 1000);\n\n return () => {\n window.clearInterval(syncTimer);\n retryTimerIds.forEach((timerId) => window.clearTimeout(timerId));\n retryTimerIds.clear();\n for (const event of AUDIO_SYNC_EVENTS) {\n video.removeEventListener(event, onSync);\n }\n video.removeEventListener(\"seeked\", onSeeked);\n try {\n video.pause();\n audio?.pause();\n } catch {}\n };\n }, [setVideoElement, syncCompanionAudio, useIframeFallback, videoStreamUrl]);\n useEffect(() => {\n const video = videoRef.current;\n if (useIframeFallback || !video) return;\n applyVideoPlaybackState({\n isPlaying,\n playbackRate,\n setVideoPlaying,\n videoElement: video,\n });\n syncCompanionAudio();\n }, [\n isPlaying,\n playbackRate,\n setVideoPlaying,\n syncCompanionAudio,\n useIframeFallback,\n ]);\n useEffect(() => {\n const video = videoRef.current;\n if (useIframeFallback || !video) return;\n if (video.muted !== isMuted) setElementMuted(video, isMuted);\n syncCompanionAudio(true);\n }, [isMuted, syncCompanionAudio, useIframeFallback]);\n useYouTubeIframePlayer({\n enabled: useIframeFallback,\n hostRef: iframeHostRef,\n isLoop,\n isMuted,\n isPlaying,\n live,\n playbackRate,\n setIsBuffering,\n setIsFrameReady,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n startTime,\n videoId,\n });\n const isCovered = !isFrameReady || (useIframeFallback && !isPlaying);\n const showSpinnerOverlay = showSpinner && (!isFrameReady || isBuffering);\n\n return {\n useIframeFallback,\n isFrameReady,\n setIsBuffering,\n videoRef,\n audioRef,\n iframeHostRef,\n videoStreamUrl,\n audioStreamUrl,\n resolvedPoster,\n syncCompanionAudio,\n handleEnded,\n handleTimeUpdate,\n handlePlay,\n handlePlaying,\n handlePause,\n handleSeeked,\n handleCanPlay,\n handleLoadedMetadata,\n handleLoadedData,\n handleError,\n handleAudioError,\n isCovered,\n showSpinnerOverlay,\n };\n}\n\nexport const YouTubeBackgroundPlayer = memo(function YouTubeBackgroundPlayer({\n codec = \"auto\",\n corp = 0,\n endTime = 0,\n forceIframe = false,\n isLoop = false,\n isMuted = true,\n isPlaying = true,\n playbackRate = 1,\n posterUrl = null,\n quality = \"1080p\",\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay = true,\n showPoster = false,\n showSpinner = true,\n startTime = 0,\n theme,\n videoClasses,\n videoId,\n videoStyle,\n}: YouTubeBackgroundPlayerProps) {\n const {\n useIframeFallback,\n isFrameReady,\n setIsBuffering: _setIsBuffering,\n videoRef,\n audioRef,\n iframeHostRef,\n videoStreamUrl,\n audioStreamUrl,\n resolvedPoster,\n syncCompanionAudio: _syncCompanionAudio,\n handleEnded,\n handleTimeUpdate,\n handlePlay,\n handlePlaying,\n handlePause,\n handleSeeked,\n handleCanPlay,\n handleLoadedMetadata,\n handleLoadedData,\n handleError,\n handleAudioError,\n isCovered,\n showSpinnerOverlay,\n } = useYouTubeBackgroundPlayerModel({\n codec,\n corp,\n endTime,\n forceIframe,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n posterUrl,\n quality,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n showPoster,\n showSpinner,\n startTime,\n theme,\n videoClasses,\n videoId,\n videoStyle,\n });\n return (\n <div className={theme.slots.youtube}>\n <div data-visible={isCovered} className={theme.slots.youtubeCover} />\n\n <div\n data-visible={showSpinnerOverlay}\n className={theme.slots.youtubeSpinner}\n >\n {showSpinner ? (\n <Spinner size={30} className={theme.slots.youtubeSpinnerIcon} />\n ) : null}\n </div>\n\n {resolvedPoster ? (\n <div\n data-visible={isCovered}\n className={theme.slots.youtubePoster}\n style={{\n backgroundImage: `url(${resolvedPoster})`,\n ...videoStyle,\n }}\n />\n ) : null}\n\n {useIframeFallback && !isPlaying ? (\n <div className={theme.slots.youtubeBlackout} />\n ) : null}\n\n {useIframeFallback ? (\n <div\n data-visible={isFrameReady}\n className={theme.slots.youtubeFrame}\n style={videoStyle}\n >\n <div ref={iframeHostRef} className={theme.slots.youtubeHost} />\n </div>\n ) : (\n <>\n <video\n ref={videoRef}\n src={videoStreamUrl}\n data-visible={isFrameReady}\n className={cn(videoClasses, theme.slots.youtubeVideo)}\n preload=\"auto\"\n muted={isMuted}\n loop={isLoop}\n playsInline\n style={videoStyle}\n onTimeUpdate={handleTimeUpdate}\n onEnded={handleEnded}\n onPlay={handlePlay}\n onWaiting={() => {\n _setIsBuffering(true);\n _syncCompanionAudio(false);\n }}\n onPlaying={handlePlaying}\n onPause={handlePause}\n onSeeking={() => _setIsBuffering(true)}\n onSeeked={handleSeeked}\n onCanPlay={handleCanPlay}\n onLoadedMetadata={handleLoadedMetadata}\n onLoadedData={handleLoadedData}\n onError={handleError}\n />\n <audio\n ref={audioRef}\n src={audioStreamUrl}\n preload=\"auto\"\n onCanPlay={() => _syncCompanionAudio(true)}\n onError={handleAudioError}\n />\n </>\n )}\n </div>\n );\n});\n","\"use client\";\n\nimport {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type CSSProperties,\n} from \"react\";\nimport { cn, report } from \"@/utils\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { retime } from \"@/tokens\";\nimport {\n useModuleTheme,\n useMotionTokens,\n type ResolvedTheme,\n} from \"@/theme\";\nimport { backgroundTheme } from \"./constants\";\nimport {\n DEFAULT_COLOR,\n OBJECT_FITS,\n generateBaseGradient,\n generateEdgeGradient,\n getEdgeFadeMask,\n getVisualStyle,\n resolveGradientSettings,\n resolveVideoClassNames,\n resolveVideoOptions,\n} from \"./visual\";\nimport { applyVideoPlaybackState } from \"./playback\";\nimport {\n getBackgroundExitTransition,\n getBackgroundMotionConfig,\n toCssDelay,\n toCssDuration,\n toCssEasing,\n useBackgroundMotion,\n} from \"./motion\";\nimport { useBackgroundActions, useBackgroundState } from \"./hooks\";\nimport { parseYouTubeUrlConfig } from \"./youtube/parse\";\nimport { YouTubeBackgroundPlayer } from \"./youtube/player\";\nimport {\n type BackgroundActions,\n type BackgroundThemeSlot,\n} from \"./types\";\n\ntype Theme = ResolvedTheme<BackgroundThemeSlot>;\n\nexport function useNativeVideoModel({\n corp,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n src,\n style: _style,\n className: _className,\n}: {\n className: string;\n corp: number;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying?: boolean;\n playbackRate: number;\n setVideoElement: BackgroundActions[\"setVideoElement\"];\n setVideoPlaying: BackgroundActions[\"setVideoPlaying\"];\n shouldAutoPlay: boolean;\n src: string | undefined;\n style: CSSProperties;\n}) {\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const handleEnded = useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n if (video.loop) {\n video.currentTime = 0;\n video\n .play()\n .catch((error) => report(\"Background loop play\", error, \"warn\"));\n return;\n }\n video.pause();\n setVideoPlaying(false);\n }, [setVideoPlaying]);\n const handleTimeUpdate = useCallback(() => {\n const video = videoRef.current;\n if (\n video?.duration &&\n corp > 0 &&\n video.currentTime >= video.duration - corp\n ) {\n handleEnded();\n }\n }, [corp, handleEnded]);\n const handleLoadedData = () => {\n const video = videoRef.current;\n if (!video) return;\n video.playbackRate = playbackRate;\n if (!shouldAutoPlay) return;\n if (isMuted) video.muted = true;\n video\n .play()\n .then(() => setVideoPlaying(true))\n .catch((error) => {\n report(\"Background autoplay\", error, \"warn\");\n setVideoPlaying(false);\n });\n };\n useEffect(() => {\n const video = videoRef.current;\n setVideoElement(video);\n return () => {\n try {\n video?.pause();\n } catch {}\n };\n }, [src, setVideoElement]);\n useEffect(() => () => setVideoElement(null), [setVideoElement]);\n useEffect(() => {\n applyVideoPlaybackState({\n isPlaying,\n playbackRate,\n setVideoPlaying,\n videoElement: videoRef.current,\n });\n }, [isPlaying, playbackRate, setVideoPlaying]);\n\n return { videoRef, handleEnded, handleTimeUpdate, handleLoadedData };\n}\n\nexport function NativeVideo({\n corp,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n src,\n style,\n className,\n}: {\n className: string;\n corp: number;\n isLoop: boolean;\n isMuted: boolean;\n isPlaying?: boolean;\n playbackRate: number;\n setVideoElement: BackgroundActions[\"setVideoElement\"];\n setVideoPlaying: BackgroundActions[\"setVideoPlaying\"];\n shouldAutoPlay: boolean;\n src: string | undefined;\n style: CSSProperties;\n}) {\n const { videoRef, handleEnded, handleTimeUpdate, handleLoadedData } =\n useNativeVideoModel({\n corp,\n isLoop,\n isMuted,\n isPlaying,\n playbackRate,\n setVideoElement,\n setVideoPlaying,\n shouldAutoPlay,\n src,\n style,\n className,\n });\n return (\n <video\n ref={videoRef}\n src={src}\n className={className}\n preload=\"auto\"\n muted={isMuted}\n loop={isLoop}\n playsInline\n style={style}\n onTimeUpdate={handleTimeUpdate}\n onEnded={handleEnded}\n onLoadedData={handleLoadedData}\n />\n );\n}\n\nexport const BackgroundGradients = memo(function BackgroundGradients({\n count = 0,\n direction,\n color = DEFAULT_COLOR,\n theme,\n}: {\n theme: Theme;\n count?: number;\n direction: \"left\" | \"right\";\n color?: string;\n}) {\n if (!count || count <= 0) return null;\n const opacity = Math.min(1, Math.max(0.2, count * 0.25));\n return (\n <div\n data-side={direction}\n className={theme.slots.gradient}\n style={{\n ...theme.styles.gradient,\n opacity,\n background: generateBaseGradient(direction, color),\n }}\n />\n );\n});\n\nexport const EdgeGradient = memo(function EdgeGradient({\n direction,\n percent = 0,\n opacity = 0,\n color,\n theme,\n}: {\n theme: Theme;\n direction: \"left\" | \"right\";\n percent?: number;\n opacity?: number;\n color?: string;\n}) {\n if (opacity <= 0) return null;\n return (\n <div\n data-side={direction}\n className={theme.slots.edge}\n style={{\n width: `${Math.max(30, percent * 1.15)}%`,\n opacity,\n background: generateEdgeGradient(direction, color || DEFAULT_COLOR),\n }}\n />\n );\n});\n\nexport const NoiseOverlay = memo(function NoiseOverlay({\n opacity,\n blendMode,\n inlineStyle,\n maskImage,\n isFixed,\n theme,\n}: {\n theme: Theme;\n opacity?: number;\n blendMode?: string;\n inlineStyle?: CSSProperties;\n maskImage?: string;\n isFixed?: boolean;\n}) {\n return (\n <div\n data-position={isFixed ? \"fixed\" : \"absolute\"}\n className={theme.slots.noise}\n style={{\n ...theme.styles.noise,\n ...(typeof opacity === \"number\" ? { opacity } : {}),\n ...(typeof blendMode === \"string\" && blendMode.trim()\n ? { mixBlendMode: blendMode as CSSProperties[\"mixBlendMode\"] }\n : {}),\n ...(maskImage ? { maskImage, WebkitMaskImage: maskImage } : {}),\n ...inlineStyle,\n }}\n />\n );\n});\n\nexport const SolidOverlay = memo(function SolidOverlay({\n opacity = 0,\n color,\n transitionStyle,\n maskImage,\n theme,\n}: {\n theme: Theme;\n opacity?: number;\n color?: string;\n transitionStyle?: CSSProperties;\n maskImage?: string;\n}) {\n return (\n <div\n className={theme.slots.solid}\n style={{\n opacity,\n backgroundColor: color,\n ...(maskImage ? { maskImage, WebkitMaskImage: maskImage } : {}),\n ...transitionStyle,\n }}\n />\n );\n});\n\nexport function useBackgroundOverlayModel() {\n const {\n animation,\n className,\n fadeEdges,\n fit,\n hasBackground,\n image,\n imageStyle,\n isPlaying,\n isVideo,\n isYouTube,\n leftGradient: configuredLeftGradient,\n noiseStyle,\n overlay,\n overlayColor,\n overlayOpacity,\n position,\n rightGradient: configuredRightGradient,\n video,\n videoClassName,\n videoOptions,\n videoStyle,\n width,\n } = useBackgroundState();\n const { setVideoElement, setVideoPlaying } = useBackgroundActions();\n const options = resolveVideoOptions(videoOptions);\n const { corp, isMuted, playbackRate } = options;\n const youtubeConfig = useMemo(\n () => (isYouTube ? parseYouTubeUrlConfig(video) : null),\n [isYouTube, video],\n );\n const startTime = videoOptions?.startTime ?? youtubeConfig?.startTime ?? 0;\n const endTime = videoOptions?.endTime ?? youtubeConfig?.endTime ?? 0;\n const backgroundKey = isVideo\n ? youtubeConfig\n ? `youtube:${youtubeConfig.videoId}`\n : video\n : image;\n const backgroundMotion = useBackgroundMotion();\n const { reduced, tempo } = useMotionTokens();\n // A page's own animation is app motion too: it follows the same tempo.\n const motionConfig = useMemo(\n () =>\n getBackgroundMotionConfig(\n backgroundMotion,\n retime(animation, { reduced, tempo }),\n ),\n [animation, backgroundMotion, reduced, tempo],\n );\n const {\n baseStyle,\n leftGradient: styleLeft,\n rightGradient: styleRight,\n } = useMemo(\n () => getVisualStyle((isVideo ? videoStyle : imageStyle) || {}),\n [imageStyle, isVideo, videoStyle],\n );\n const leftGradient = configuredLeftGradient ?? styleLeft;\n const rightGradient = configuredRightGradient ?? styleRight;\n const {\n opacity: noiseOpacity,\n mixBlendMode: noiseBlendMode,\n ...noiseInlineStyle\n } = noiseStyle || {};\n const overlayTransitionStyle = useMemo<CSSProperties>(\n () => ({\n transitionDelay: toCssDelay(motionConfig.transition.delay),\n transitionDuration: toCssDuration(\n motionConfig.transition.duration,\n backgroundMotion.transition.duration,\n ),\n transitionProperty: \"opacity\",\n transitionTimingFunction: toCssEasing(motionConfig.transition.ease),\n }),\n [backgroundMotion.transition.duration, motionConfig.transition],\n );\n const rawWidth = width ?? videoOptions?.width ?? videoStyle?.width;\n const resolvedWidth =\n rawWidth === undefined || rawWidth === null || rawWidth === \"\"\n ? undefined\n : typeof rawWidth === \"number\"\n ? `${rawWidth}px`\n : String(rawWidth);\n const rawFit = fit ?? videoOptions?.fit ?? videoOptions?.objectFit;\n const theme = useModuleTheme(backgroundTheme);\n const fitStyle = useMemo<CSSProperties>(\n () =>\n rawFit && OBJECT_FITS.includes(rawFit)\n ? { objectFit: rawFit as CSSProperties[\"objectFit\"] }\n : {},\n [rawFit],\n );\n const classNames = resolveVideoClassNames(\n videoClassName,\n className,\n videoOptions?.videoClassName,\n videoOptions?.className,\n videoStyle?.className,\n );\n const hasCustomWidth = Boolean(resolvedWidth || classNames.width);\n const gradientSettings = useMemo(\n () =>\n resolveGradientSettings({\n fadeEdges,\n hasWidth: hasCustomWidth,\n leftGradient,\n rightGradient,\n }),\n [fadeEdges, hasCustomWidth, leftGradient, rightGradient],\n );\n const maskImage = useMemo(\n () =>\n gradientSettings.enabled\n ? getEdgeFadeMask({\n color: overlayColor || DEFAULT_COLOR,\n leftPercent: gradientSettings.leftPercent,\n rightPercent: gradientSettings.rightPercent,\n })\n : undefined,\n [gradientSettings, overlayColor],\n );\n const framePosition =\n position === \"left\" || position === \"right\" ? position : \"center\";\n const videoClasses = cn(theme.slots.video, classNames.other);\n const objectPosition = baseStyle.objectPosition || position || undefined;\n const sharedVideoStyle = useMemo<CSSProperties>(\n () => ({\n ...classNames.objectStyle,\n ...fitStyle,\n ...(objectPosition ? { objectPosition } : {}),\n ...(maskImage ? { WebkitMaskImage: maskImage, maskImage } : {}),\n ...baseStyle,\n }),\n [baseStyle, classNames.objectStyle, fitStyle, maskImage, objectPosition],\n );\n const exitTransition = useMemo(\n () => getBackgroundExitTransition(backgroundMotion, motionConfig),\n [backgroundMotion, motionConfig],\n );\n\n return {\n className,\n hasBackground,\n image,\n isPlaying,\n isVideo,\n overlay,\n overlayColor,\n overlayOpacity,\n position,\n video,\n videoStyle,\n width,\n setVideoElement,\n setVideoPlaying,\n options,\n corp,\n isMuted,\n playbackRate,\n youtubeConfig,\n startTime,\n endTime,\n backgroundKey,\n motionConfig,\n baseStyle,\n leftGradient,\n rightGradient,\n noiseOpacity,\n noiseBlendMode,\n noiseInlineStyle,\n overlayTransitionStyle,\n resolvedWidth,\n classNames,\n hasCustomWidth,\n gradientSettings,\n maskImage,\n framePosition,\n videoClasses,\n sharedVideoStyle,\n exitTransition,\n theme,\n };\n}\n\nexport function BackgroundOverlay() {\n const {\n hasBackground,\n image,\n isPlaying,\n isVideo,\n overlay,\n overlayColor,\n overlayOpacity,\n position,\n video,\n setVideoElement,\n setVideoPlaying,\n options,\n corp,\n isMuted,\n playbackRate,\n youtubeConfig,\n startTime,\n endTime,\n backgroundKey,\n motionConfig,\n baseStyle,\n leftGradient,\n rightGradient,\n noiseOpacity,\n noiseBlendMode,\n noiseInlineStyle,\n overlayTransitionStyle,\n resolvedWidth,\n classNames,\n hasCustomWidth,\n gradientSettings,\n maskImage,\n framePosition,\n videoClasses,\n sharedVideoStyle,\n exitTransition,\n theme,\n } = useBackgroundOverlayModel();\n\n return (\n <AnimatePresence mode=\"sync\">\n {hasBackground && (\n <motion.div\n key={backgroundKey}\n initial={motionConfig.initial}\n animate={motionConfig.animate}\n transition={motionConfig.transition}\n exit={{ ...motionConfig.exit, transition: exitTransition }}\n className={theme.slots.root}\n style={{\n willChange: \"transform, opacity, filter\",\n ...theme.styles.root,\n }}\n >\n {isVideo ? (\n <div\n data-position={framePosition}\n data-width={\n classNames.width || resolvedWidth ? undefined : \"full\"\n }\n className={cn(theme.slots.videoFrame, classNames.width)}\n style={{\n ...theme.styles.videoFrame,\n ...(resolvedWidth ? { width: resolvedWidth } : {}),\n }}\n >\n {youtubeConfig ? (\n <YouTubeBackgroundPlayer\n videoId={youtubeConfig.videoId}\n startTime={startTime}\n endTime={endTime}\n corp={corp}\n isPlaying={isPlaying}\n isMuted={isMuted}\n isLoop={options.isLoop}\n shouldAutoPlay={options.shouldAutoPlay}\n showPoster={options.showPoster}\n showSpinner={options.showSpinner}\n playbackRate={playbackRate}\n quality={options.quality}\n codec={options.codec}\n forceIframe={options.forceIframe}\n posterUrl={options.showPoster ? image || null : null}\n theme={theme}\n videoClasses={videoClasses}\n videoStyle={sharedVideoStyle}\n setVideoElement={setVideoElement}\n setVideoPlaying={setVideoPlaying}\n />\n ) : (\n <NativeVideo\n src={video || undefined}\n className={videoClasses}\n style={sharedVideoStyle}\n corp={corp}\n isLoop={options.isLoop}\n isMuted={isMuted}\n isPlaying={isPlaying}\n playbackRate={playbackRate}\n shouldAutoPlay={options.shouldAutoPlay}\n setVideoElement={setVideoElement}\n setVideoPlaying={setVideoPlaying}\n />\n )}\n\n <EdgeGradient\n theme={theme}\n direction=\"left\"\n percent={gradientSettings.leftPercent}\n opacity={gradientSettings.leftOpacity}\n color={overlayColor}\n />\n <EdgeGradient\n theme={theme}\n direction=\"right\"\n percent={gradientSettings.rightPercent}\n opacity={gradientSettings.rightOpacity}\n color={overlayColor}\n />\n\n {hasCustomWidth && (\n <NoiseOverlay\n theme={theme}\n opacity={noiseOpacity}\n blendMode={noiseBlendMode}\n inlineStyle={noiseInlineStyle as CSSProperties}\n maskImage={maskImage}\n />\n )}\n\n {hasCustomWidth && overlay && (\n <SolidOverlay\n theme={theme}\n opacity={overlayOpacity}\n color={overlayColor}\n transitionStyle={overlayTransitionStyle}\n maskImage={maskImage}\n />\n )}\n </div>\n ) : (\n <div\n className={theme.slots.image}\n style={{\n backgroundImage: image ? `url(${image})` : undefined,\n backgroundPosition: position,\n ...baseStyle,\n }}\n />\n )}\n\n {(!isVideo || !hasCustomWidth) && (\n <>\n <BackgroundGradients\n theme={theme}\n count={leftGradient}\n direction=\"left\"\n color={overlayColor}\n />\n <BackgroundGradients\n theme={theme}\n count={rightGradient}\n direction=\"right\"\n color={overlayColor}\n />\n <NoiseOverlay\n theme={theme}\n isFixed\n opacity={noiseOpacity}\n blendMode={noiseBlendMode}\n inlineStyle={noiseInlineStyle as CSSProperties}\n />\n {overlay && (\n <SolidOverlay\n theme={theme}\n opacity={overlayOpacity}\n color={overlayColor}\n transitionStyle={overlayTransitionStyle}\n />\n )}\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { defineModule, type PageModuleApi } from \"@/kernel\";\nimport { BACKGROUND_REGISTRY_KEY } from \"./constants\";\nimport {\n BackgroundContext,\n BackgroundProvider,\n} from \"./context\";\nimport {\n useBackground,\n useBackgroundActions,\n} from \"./hooks\";\nimport { normalizeBackgroundInput } from \"./state\";\nimport { BackgroundOverlay } from \"./overlay\";\nimport {\n type BackgroundPageApi,\n type BackgroundPageConfig,\n type BackgroundState,\n type DefinedBackground,\n} from \"./types\";\n\nexport function selectPageBackground(\n background: BackgroundPageConfig | null | undefined,\n): Partial<BackgroundState> | null {\n return background ? normalizeBackgroundInput(background) : null;\n}\n\nfunction useBackgroundPage(\n _slice: Partial<BackgroundState> | null,\n page: PageModuleApi,\n): BackgroundPageApi {\n const actions = useBackgroundActions();\n return useMemo(\n () => ({\n ...actions,\n set: (background: BackgroundPageConfig) => page.set({ background }),\n }),\n [actions, page],\n );\n}\n\nexport const backgroundModule = defineModule({\n id: \"background\",\n context: BackgroundContext,\n Provider: BackgroundProvider,\n Backdrop: BackgroundOverlay,\n uses: [\"media\"],\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"singleton\",\n lifecycle: \"immediate\",\n singletonKey: BACKGROUND_REGISTRY_KEY,\n },\n page: {\n select: (config) => selectPageBackground(config.background),\n entries: (slice: Partial<BackgroundState>) => [\n { key: BACKGROUND_REGISTRY_KEY, value: slice },\n ],\n use: useBackgroundPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n background: typeof backgroundModule;\n }\n interface PageConfig {\n background?: BackgroundPageConfig;\n }\n}\n\nexport function defineBackground(\n definition: (Partial<BackgroundState> & { id?: string }) | string = {},\n): DefinedBackground {\n const { id = \"background\", ...config } =\n typeof definition === \"string\" ? { image: definition } : definition;\n\n return Object.freeze({\n config,\n id,\n use: function useDefinedBackground(overrides = {}, options = {}) {\n const patch =\n typeof overrides === \"string\" ? { image: overrides } : overrides;\n return useBackground({ ...config, ...patch }, options);\n },\n });\n}\n"]}
@@ -0,0 +1,61 @@
1
+ // src/utils/user-message.ts
2
+ var USER_MESSAGES = Object.freeze({
3
+ generic: "Something went wrong. Please try again",
4
+ network: "You appear to be offline. Check your connection and try again",
5
+ timeout: "That took too long. Please try again",
6
+ unauthorized: "Your session has expired. Please sign in again",
7
+ forbidden: "You don't have permission to do that",
8
+ notFound: "We couldn't find what you were looking for",
9
+ rateLimited: "Too many attempts. Please wait a moment and try again",
10
+ server: "We're having trouble on our end. Please try again in a moment"
11
+ });
12
+ var UserError = class extends Error {
13
+ status;
14
+ constructor(message, status) {
15
+ super(message);
16
+ this.name = "UserError";
17
+ this.status = status;
18
+ }
19
+ };
20
+ var NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;
21
+ function readField(source, field, type) {
22
+ const value = source?.[field];
23
+ return typeof value === type ? value : void 0;
24
+ }
25
+ function readPayloadMessage(error) {
26
+ const payload = error?.payload;
27
+ const message = readField(payload, "error", "string")?.trim();
28
+ return message || void 0;
29
+ }
30
+ function toUserMessage(error, { codes, fallback = USER_MESSAGES.generic } = {}) {
31
+ if (typeof error === "string") return error.trim() || fallback;
32
+ if (!error || typeof error !== "object") return fallback;
33
+ if (error instanceof UserError) {
34
+ if (error.status === 401) return USER_MESSAGES.unauthorized;
35
+ return error.message || fallback;
36
+ }
37
+ if (error.name === "AbortError") return fallback;
38
+ const code = readField(error, "code", "string");
39
+ if (code && codes?.[code]) return codes[code];
40
+ const status = readField(error, "status", "number");
41
+ if (status === 401) return USER_MESSAGES.unauthorized;
42
+ if (status === 429) return USER_MESSAGES.rateLimited;
43
+ if (status === 408 || status === 504) return USER_MESSAGES.timeout;
44
+ if (status !== void 0 && status >= 500) return USER_MESSAGES.server;
45
+ if (status !== void 0 && status >= 400) {
46
+ const authored = readPayloadMessage(error);
47
+ if (authored) return authored;
48
+ if (status === 403) return USER_MESSAGES.forbidden;
49
+ if (status === 404) return USER_MESSAGES.notFound;
50
+ return fallback;
51
+ }
52
+ const isOffline = typeof navigator !== "undefined" && navigator.onLine === false;
53
+ if (isOffline || NETWORK_FAILURE.test(error.message ?? "") && (error instanceof TypeError || /fetch/i.test(error.name))) {
54
+ return USER_MESSAGES.network;
55
+ }
56
+ return fallback;
57
+ }
58
+
59
+ export { USER_MESSAGES, UserError, toUserMessage };
60
+ //# sourceMappingURL=chunk-DGCQWQLZ.js.map
61
+ //# sourceMappingURL=chunk-DGCQWQLZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/user-message.ts"],"names":[],"mappings":"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","file":"chunk-DGCQWQLZ.js","sourcesContent":["export const USER_MESSAGES = Object.freeze({\n generic: \"Something went wrong. Please try again\",\n network: \"You appear to be offline. Check your connection and try again\",\n timeout: \"That took too long. Please try again\",\n unauthorized: \"Your session has expired. Please sign in again\",\n forbidden: \"You don't have permission to do that\",\n notFound: \"We couldn't find what you were looking for\",\n rateLimited: \"Too many attempts. Please wait a moment and try again\",\n server: \"We're having trouble on our end. Please try again in a moment\",\n} as const);\n\nexport class UserError extends Error {\n readonly status?: number;\n\n constructor(message: string, status?: number) {\n super(message);\n this.name = \"UserError\";\n this.status = status;\n }\n}\n\nexport interface UserMessageOptions {\n fallback?: string;\n codes?: Readonly<Record<string, string>>;\n}\n\nconst NETWORK_FAILURE = /failed to fetch|network|load failed|fetch failed/i;\n\nfunction readField<T>(\n source: unknown,\n field: string,\n type: \"string\" | \"number\",\n): T | undefined {\n const value = (source as Record<string, unknown> | null)?.[field];\n return typeof value === type ? (value as T) : undefined;\n}\n\nfunction readPayloadMessage(error: unknown): string | undefined {\n const payload = (error as { payload?: unknown } | null)?.payload;\n const message = readField<string>(payload, \"error\", \"string\")?.trim();\n return message || undefined;\n}\n\nexport function toUserMessage(\n error: unknown,\n { codes, fallback = USER_MESSAGES.generic }: UserMessageOptions = {},\n): string {\n if (typeof error === \"string\") return error.trim() || fallback;\n if (!error || typeof error !== \"object\") return fallback;\n\n if (error instanceof UserError) {\n if (error.status === 401) return USER_MESSAGES.unauthorized;\n return error.message || fallback;\n }\n if ((error as { name?: string }).name === \"AbortError\") return fallback;\n\n const code = readField<string>(error, \"code\", \"string\");\n if (code && codes?.[code]) return codes[code];\n\n const status = readField<number>(error, \"status\", \"number\");\n\n if (status === 401) return USER_MESSAGES.unauthorized;\n if (status === 429) return USER_MESSAGES.rateLimited;\n if (status === 408 || status === 504) return USER_MESSAGES.timeout;\n if (status !== undefined && status >= 500) return USER_MESSAGES.server;\n\n if (status !== undefined && status >= 400) {\n const authored = readPayloadMessage(error);\n if (authored) return authored;\n if (status === 403) return USER_MESSAGES.forbidden;\n if (status === 404) return USER_MESSAGES.notFound;\n return fallback;\n }\n\n const isOffline =\n typeof navigator !== \"undefined\" && navigator.onLine === false;\n if (\n isOffline ||\n (NETWORK_FAILURE.test((error as Error).message ?? \"\") &&\n (error instanceof TypeError || /fetch/i.test((error as Error).name)))\n ) {\n return USER_MESSAGES.network;\n }\n\n return fallback;\n}\n"]}
@@ -0,0 +1,67 @@
1
+ import { ModalProvider, ModalContext, useModalActions, getModalIdentity, useModal } from './chunk-7HQMXTNP.js';
2
+ import { defineModule } from './chunk-GF7TUX5I.js';
3
+ import { useIsomorphicLayoutEffect } from './chunk-TV3WEF5G.js';
4
+ import { useRef, useMemo } from 'react';
5
+ import dynamic from 'next/dynamic';
6
+
7
+ var LazyModal = dynamic(
8
+ () => import('./overlay-TZ6L52A5.js').then((view) => view.Modal),
9
+ {
10
+ ssr: false
11
+ }
12
+ );
13
+ function selectPageModals(config) {
14
+ return config.modal ?? null;
15
+ }
16
+ function useModalPage(slice, page) {
17
+ const actions = useModalActions();
18
+ const sliceRef = useRef(slice);
19
+ useIsomorphicLayoutEffect(() => {
20
+ sliceRef.current = slice;
21
+ }, [slice]);
22
+ return useMemo(
23
+ () => ({
24
+ ...actions,
25
+ open: (modal, data = {}) => {
26
+ const own = typeof modal === "string" && modal !== "registry" ? sliceRef.current?.[modal] : void 0;
27
+ return actions.openModal(own ?? modal, { data });
28
+ },
29
+ set: (modal) => page.set({ modal })
30
+ }),
31
+ [actions, page]
32
+ );
33
+ }
34
+ var modalModule = defineModule({
35
+ id: "modal",
36
+ context: ModalContext,
37
+ Provider: ModalProvider,
38
+ Overlay: LazyModal,
39
+ registry: {
40
+ cleanupDelayMs: 600,
41
+ keyPolicy: "named",
42
+ lifecycle: "immediate",
43
+ valueKind: "component"
44
+ },
45
+ page: {
46
+ select: selectPageModals,
47
+ entries: (slice) => Object.entries(slice).map(([key, value]) => ({ key, value })),
48
+ use: useModalPage
49
+ }
50
+ });
51
+ function defineModal(definition = {}) {
52
+ const { type } = getModalIdentity(definition);
53
+ const modalDefinition = Object.freeze({
54
+ ...definition,
55
+ id: definition.id || type,
56
+ isModalDefinition: true,
57
+ type,
58
+ use: function useDefinedModal() {
59
+ return useModal(modalDefinition);
60
+ }
61
+ });
62
+ return modalDefinition;
63
+ }
64
+
65
+ export { defineModal, modalModule };
66
+ //# sourceMappingURL=chunk-FIMPHODX.js.map
67
+ //# sourceMappingURL=chunk-FIMPHODX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/modal/module.tsx"],"names":[],"mappings":";;;;;;AA2BA,IAAM,SAAA,GAAY,OAAA;AAAA,EAChB,MAAM,OAAO,uBAAW,CAAA,CAAE,KAAK,CAAC,IAAA,KAAS,KAAK,KAAK,CAAA;AAAA,EACnD;AAAA,IACE,GAAA,EAAK;AAAA;AAET,CAAA;AAEA,SAAS,iBAAiB,MAAA,EAA4C;AACpE,EAAA,OAAO,OAAO,KAAA,IAAS,IAAA;AACzB;AAEA,SAAS,YAAA,CACP,OACA,IAAA,EACc;AACd,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,yBAAA,CAA0B,MAAM;AAC9B,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA,EACrB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,OAAA;AAAA,IACL,OAAO;AAAA,MACL,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,CAAC,KAAA,EAAmB,IAAA,GAAgC,EAAC,KAAM;AAC/D,QAAA,MAAM,GAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,UAAA,GACnC,QAAA,CAAS,OAAA,GAAU,KAAK,CAAA,GACxB,MAAA;AACN,QAAA,OAAO,QAAQ,SAAA,CAAW,GAAA,IAAsB,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA,MACjE,CAAA;AAAA,MACA,KAAK,CAAC,KAAA,KAA2B,KAAK,GAAA,CAAI,EAAE,OAAO;AAAA,KACrD,CAAA;AAAA,IACA,CAAC,SAAS,IAAI;AAAA,GAChB;AACF;AAEO,IAAM,cAAc,YAAA,CAAa;AAAA,EACtC,EAAA,EAAI,OAAA;AAAA,EACJ,OAAA,EAAS,YAAA;AAAA,EACT,QAAA,EAAU,aAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AAAA,IACR,cAAA,EAAgB,GAAA;AAAA,IAChB,SAAA,EAAW,OAAA;AAAA,IACX,SAAA,EAAW,WAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,gBAAA;AAAA,IACR,SAAS,CAAC,KAAA,KACR,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,KAAK,KAAK,CAAA,MAAO,EAAE,GAAA,EAAK,OAAM,CAAE,CAAA;AAAA,IAC9D,GAAA,EAAK;AAAA;AAET,CAAC;AAWM,SAAS,WAAA,CACd,UAAA,GAAiC,EAAC,EACjB;AACjB,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,gBAAA,CAAiB,UAAU,CAAA;AAE5C,EAAA,MAAM,eAAA,GAAmC,OAAO,MAAA,CAAO;AAAA,IACrD,GAAG,UAAA;AAAA,IACH,EAAA,EAAI,WAAW,EAAA,IAAM,IAAA;AAAA,IACrB,iBAAA,EAAmB,IAAA;AAAA,IACnB,IAAA;AAAA,IACA,GAAA,EAAK,SAAS,eAAA,GAAkB;AAC9B,MAAA,OAAO,SAAS,eAAe,CAAA;AAAA,IACjC;AAAA,GACD,CAAA;AACD,EAAA,OAAO,eAAA;AACT","file":"chunk-FIMPHODX.js","sourcesContent":["\"use client\";\n\nimport { useMemo, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport dynamic from \"next/dynamic\";\nimport {\n ModalContext,\n ModalProvider,\n} from \"./context\";\nimport {\n useModal,\n useModalActions,\n} from \"./hooks\";\nimport {\n type DefineModalOptions,\n type ModalDefinition,\n type ModalInput,\n type ModalPageApi,\n type ModalPageConfig,\n} from \"./types\";\nimport { getModalIdentity } from \"./identity\";\n\nconst LazyModal = dynamic(\n () => import(\"./overlay\").then((view) => view.Modal),\n {\n ssr: false,\n },\n);\n\nfunction selectPageModals(config: PageConfig): ModalPageConfig | null {\n return config.modal ?? null;\n}\n\nfunction useModalPage(\n slice: ModalPageConfig | null,\n page: PageModuleApi,\n): ModalPageApi {\n const actions = useModalActions();\n const sliceRef = useRef(slice);\n useIsomorphicLayoutEffect(() => {\n sliceRef.current = slice;\n }, [slice]);\n\n return useMemo(\n () => ({\n ...actions,\n open: (modal: ModalInput, data: Record<string, unknown> = {}) => {\n const own =\n typeof modal === \"string\" && modal !== \"registry\"\n ? sliceRef.current?.[modal]\n : undefined;\n return actions.openModal((own as ModalInput) ?? modal, { data });\n },\n set: (modal: ModalPageConfig) => page.set({ modal }),\n }),\n [actions, page],\n );\n}\n\nexport const modalModule = defineModule({\n id: \"modal\",\n context: ModalContext,\n Provider: ModalProvider,\n Overlay: LazyModal,\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"named\",\n lifecycle: \"immediate\",\n valueKind: \"component\",\n },\n page: {\n select: selectPageModals,\n entries: (slice: ModalPageConfig) =>\n Object.entries(slice).map(([key, value]) => ({ key, value })),\n use: useModalPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n modal: typeof modalModule;\n }\n interface PageConfig {\n modal?: ModalPageConfig;\n }\n}\n\nexport function defineModal(\n definition: DefineModalOptions = {},\n): ModalDefinition {\n const { type } = getModalIdentity(definition);\n\n const modalDefinition: ModalDefinition = Object.freeze({\n ...definition,\n id: definition.id || type,\n isModalDefinition: true,\n type,\n use: function useDefinedModal() {\n return useModal(modalDefinition);\n },\n });\n return modalDefinition;\n}\n"]}