@yewdiel21/motion-kit 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/NOTICE +3 -35
  2. package/README.md +93 -81
  3. package/dist/auto/index.d.ts +22 -3
  4. package/dist/auto/index.js +43 -5
  5. package/dist/auto/index.js.map +1 -1
  6. package/dist/{chunk-KLY5BRRI.js → chunk-34EZ7DF4.js} +1 -1
  7. package/dist/chunk-34EZ7DF4.js.map +1 -0
  8. package/dist/{chunk-RFDIZYFX.js → chunk-DOOMULVV.js} +20 -20
  9. package/dist/chunk-DOOMULVV.js.map +1 -0
  10. package/dist/{chunk-ABNRDDO7.js → chunk-I3DXF2KQ.js} +2 -2
  11. package/dist/{chunk-Q4LVFNLN.js → chunk-IKQ5FODN.js} +4 -4
  12. package/dist/chunk-IKQ5FODN.js.map +1 -0
  13. package/dist/{chunk-2BQGFOA7.js → chunk-J6OCFNGU.js} +2 -2
  14. package/dist/chunk-J6OCFNGU.js.map +1 -0
  15. package/dist/{chunk-6OJAP6ZL.js → chunk-QFBOHPWZ.js} +3 -3
  16. package/dist/chunk-QFBOHPWZ.js.map +1 -0
  17. package/dist/{chunk-J27KH2A2.js → chunk-RVSKEBIC.js} +1 -1
  18. package/dist/chunk-RVSKEBIC.js.map +1 -0
  19. package/dist/{chunk-34XYOXHG.js → chunk-TFNRIZHU.js} +1615 -12
  20. package/dist/chunk-TFNRIZHU.js.map +1 -0
  21. package/dist/{chunk-FS2HJVVY.js → chunk-XAKC2QY7.js} +1204 -5
  22. package/dist/chunk-XAKC2QY7.js.map +1 -0
  23. package/dist/css/components/calendar.css +159 -0
  24. package/dist/css/components/chat-background.css +2 -2
  25. package/dist/css/components/chat.css +1 -1
  26. package/dist/css/components/cursor.css +3 -3
  27. package/dist/css/components/dialog.css +3 -3
  28. package/dist/css/components/hover-card.css +14 -0
  29. package/dist/css/components/input-otp.css +10 -0
  30. package/dist/css/components/island.css +1 -1
  31. package/dist/css/components/menu.css +1 -1
  32. package/dist/css/components/nav.css +1 -5
  33. package/dist/css/components/pagination.css +11 -0
  34. package/dist/css/components/quantity.css +16 -0
  35. package/dist/css/components/slot-picker.css +126 -0
  36. package/dist/css/components/steps.css +2 -2
  37. package/dist/css/components/studio-dock.css +35 -0
  38. package/dist/css/components/theme-picker.css +1 -1
  39. package/dist/css/components/toast.css +1 -1
  40. package/dist/css/components/trailer.css +37 -0
  41. package/dist/css/controls.css +78 -13
  42. package/dist/css/effects.css +8 -8
  43. package/dist/css/fonts.css +1 -1
  44. package/dist/css/themes/black-green.css +1 -1
  45. package/dist/css/themes/black.css +1 -1
  46. package/dist/css/themes/blue.css +1 -1
  47. package/dist/css/themes/brown.css +1 -1
  48. package/dist/css/themes/cold-blue.css +1 -1
  49. package/dist/css/themes/funny.css +1 -1
  50. package/dist/css/themes/gray.css +1 -1
  51. package/dist/css/themes/green.css +1 -1
  52. package/dist/css/themes/modern-1.css +1 -1
  53. package/dist/css/themes/neogreen.css +1 -1
  54. package/dist/css/themes/new.css +1 -1
  55. package/dist/css/themes/new2.css +1 -1
  56. package/dist/css/themes/oled.css +1 -1
  57. package/dist/css/themes/orange.css +1 -1
  58. package/dist/css/themes/pastel-pink.css +1 -1
  59. package/dist/css/themes/pink.css +1 -1
  60. package/dist/css/themes/purple.css +1 -1
  61. package/dist/css/themes/red.css +1 -1
  62. package/dist/css/themes/super-blue.css +1 -1
  63. package/dist/css/themes.css +19 -19
  64. package/dist/css/tokens.css +9 -9
  65. package/dist/elements/index.d.ts +75 -7
  66. package/dist/elements/index.js +172 -6
  67. package/dist/elements/index.js.map +1 -1
  68. package/dist/{engine-CUr9QijM.d.ts → engine-GDGwQnJE.d.ts} +2 -2
  69. package/dist/gl/index.js +3 -3
  70. package/dist/index.css +1076 -63
  71. package/dist/index.d.ts +17 -17
  72. package/dist/index.js +49 -7
  73. package/dist/index.js.map +1 -1
  74. package/dist/react/index.d.ts +139 -40
  75. package/dist/react/index.js +355 -8
  76. package/dist/react/index.js.map +1 -1
  77. package/dist/{reduced-BM4Ls0g5.d.ts → reduced-BmBzKH94.d.ts} +215 -18
  78. package/dist/{reveal-WFUWDrei.d.ts → reveal-jsX-uwUz.d.ts} +233 -24
  79. package/dist/{store-Bqy_obnD.d.ts → store-DYb3tTsZ.d.ts} +5 -5
  80. package/dist/theme/generate.d.ts +1 -1
  81. package/dist/theme/generate.js +2 -2
  82. package/dist/theme/generate.js.map +1 -1
  83. package/dist/theme/index.d.ts +2 -2
  84. package/dist/theme/index.js +2 -2
  85. package/dist/{theme-BFMoCzi6.d.ts → theme-Bjf9qIIy.d.ts} +1 -1
  86. package/package.json +2 -2
  87. package/registry.json +230 -156
  88. package/skills/motion-kit/SKILL.md +209 -189
  89. package/skills/motion-kit/reference/components.md +5 -5
  90. package/skills/motion-kit/reference/design.md +14 -14
  91. package/skills/motion-kit/reference/recipes.md +48 -49
  92. package/src/auto/auto-init.ts +38 -0
  93. package/src/components/calendar/README.md +82 -0
  94. package/src/components/calendar/calendar.css +158 -0
  95. package/src/components/calendar/element.ts +27 -0
  96. package/src/components/calendar/engine.ts +412 -0
  97. package/src/components/calendar/react.tsx +69 -0
  98. package/src/components/chat/README.md +1 -3
  99. package/src/components/chat/chat.css +1 -1
  100. package/src/components/chat/engine.ts +1 -1
  101. package/src/components/chat/react.tsx +1 -1
  102. package/src/components/chat-background/README.md +1 -3
  103. package/src/components/chat-background/audio.ts +1 -1
  104. package/src/components/chat-background/chat-background.css +2 -2
  105. package/src/components/chat-background/engine.ts +1 -1
  106. package/src/components/chat-background/react.tsx +1 -1
  107. package/src/components/cursor/README.md +3 -5
  108. package/src/components/cursor/cursor.css +3 -3
  109. package/src/components/cursor/element.ts +2 -2
  110. package/src/components/cursor/engine.ts +5 -5
  111. package/src/components/cursor/react.tsx +1 -1
  112. package/src/components/dialog/README.md +4 -8
  113. package/src/components/dialog/dialog.css +3 -3
  114. package/src/components/dialog/engine.ts +2 -2
  115. package/src/components/dialog/react.tsx +1 -1
  116. package/src/components/hover-card/README.md +16 -0
  117. package/src/components/hover-card/element.ts +8 -0
  118. package/src/components/hover-card/engine.ts +69 -0
  119. package/src/components/hover-card/hover-card.css +13 -0
  120. package/src/components/hover-card/react.tsx +19 -0
  121. package/src/components/input-otp/README.md +18 -0
  122. package/src/components/input-otp/element.ts +14 -0
  123. package/src/components/input-otp/engine.ts +106 -0
  124. package/src/components/input-otp/input-otp.css +9 -0
  125. package/src/components/input-otp/react.tsx +21 -0
  126. package/src/components/island/README.md +7 -7
  127. package/src/components/island/engine.ts +3 -3
  128. package/src/components/island/island.css +1 -1
  129. package/src/components/island/react.tsx +3 -3
  130. package/src/components/menu/README.md +2 -4
  131. package/src/components/menu/engine.ts +1 -1
  132. package/src/components/menu/menu.css +1 -1
  133. package/src/components/menu/react.tsx +1 -1
  134. package/src/components/nav/README.md +12 -14
  135. package/src/components/nav/engine.ts +5 -5
  136. package/src/components/nav/nav.css +1 -5
  137. package/src/components/nav/react.tsx +3 -3
  138. package/src/components/pagination/README.md +17 -0
  139. package/src/components/pagination/element.ts +14 -0
  140. package/src/components/pagination/engine.ts +102 -0
  141. package/src/components/pagination/pagination.css +10 -0
  142. package/src/components/pagination/react.tsx +22 -0
  143. package/src/components/quantity/README.md +20 -0
  144. package/src/components/quantity/element.ts +14 -0
  145. package/src/components/quantity/engine.ts +85 -0
  146. package/src/components/quantity/quantity.css +15 -0
  147. package/src/components/quantity/react.tsx +21 -0
  148. package/src/components/slot-picker/README.md +68 -0
  149. package/src/components/slot-picker/element.ts +27 -0
  150. package/src/components/slot-picker/engine.ts +412 -0
  151. package/src/components/slot-picker/react.tsx +76 -0
  152. package/src/components/slot-picker/slot-picker.css +125 -0
  153. package/src/components/steps/README.md +1 -3
  154. package/src/components/steps/engine.ts +3 -3
  155. package/src/components/steps/react.tsx +2 -2
  156. package/src/components/steps/steps.css +2 -2
  157. package/src/components/studio-dock/README.md +44 -0
  158. package/src/components/studio-dock/element.ts +11 -0
  159. package/src/components/studio-dock/engine.ts +212 -0
  160. package/src/components/studio-dock/react.tsx +23 -0
  161. package/src/components/studio-dock/studio-dock.css +34 -0
  162. package/src/components/theme-picker/README.md +3 -5
  163. package/src/components/theme-picker/engine.ts +2 -2
  164. package/src/components/theme-picker/react.tsx +1 -1
  165. package/src/components/theme-picker/theme-picker.css +1 -1
  166. package/src/components/toast/README.md +1 -3
  167. package/src/components/toast/engine.ts +2 -2
  168. package/src/components/toast/react.tsx +1 -1
  169. package/src/components/toast/store.ts +1 -2
  170. package/src/components/toast/toast.css +1 -1
  171. package/src/components/trailer/README.md +28 -0
  172. package/src/components/trailer/element.ts +13 -0
  173. package/src/components/trailer/engine.ts +189 -0
  174. package/src/components/trailer/react.tsx +16 -0
  175. package/src/components/trailer/trailer.css +36 -0
  176. package/src/core/channels.ts +3 -3
  177. package/src/core/curves.ts +3 -3
  178. package/src/core/dates.ts +98 -0
  179. package/src/core/gsap.ts +2 -2
  180. package/src/core/loop.ts +1 -1
  181. package/src/core/math.ts +1 -1
  182. package/src/core/physics-spring.ts +2 -2
  183. package/src/core/scroll-track.ts +2 -4
  184. package/src/core/spring.ts +1 -1
  185. package/src/core/timing.ts +21 -22
  186. package/src/css/controls/README.md +24 -20
  187. package/src/css/controls/burger.css +1 -1
  188. package/src/css/controls/button.css +4 -4
  189. package/src/css/controls/checkbox.css +1 -1
  190. package/src/css/controls/chip.css +1 -1
  191. package/src/css/controls/field.css +2 -2
  192. package/src/css/controls/glass.css +4 -4
  193. package/src/css/controls/status.css +63 -0
  194. package/src/css/default-theme.css +1 -1
  195. package/src/css/effects/README.md +19 -21
  196. package/src/css/effects/anim.css +1 -1
  197. package/src/css/effects/fade.css +1 -1
  198. package/src/css/effects/float.css +1 -1
  199. package/src/css/effects/frost.css +1 -1
  200. package/src/css/effects/grain.css +1 -1
  201. package/src/css/effects/loading.css +1 -1
  202. package/src/css/effects/success.css +1 -1
  203. package/src/css/effects/text.css +1 -1
  204. package/src/css/fonts.css +1 -1
  205. package/src/css/states.css +1 -1
  206. package/src/css/themes/black-green.css +1 -1
  207. package/src/css/themes/black.css +1 -1
  208. package/src/css/themes/blue.css +1 -1
  209. package/src/css/themes/brown.css +1 -1
  210. package/src/css/themes/cold-blue.css +1 -1
  211. package/src/css/themes/funny.css +1 -1
  212. package/src/css/themes/gray.css +1 -1
  213. package/src/css/themes/green.css +1 -1
  214. package/src/css/themes/modern-1.css +1 -1
  215. package/src/css/themes/neogreen.css +1 -1
  216. package/src/css/themes/new.css +1 -1
  217. package/src/css/themes/new2.css +1 -1
  218. package/src/css/themes/oled.css +1 -1
  219. package/src/css/themes/orange.css +1 -1
  220. package/src/css/themes/pastel-pink.css +1 -1
  221. package/src/css/themes/pink.css +1 -1
  222. package/src/css/themes/purple.css +1 -1
  223. package/src/css/themes/red.css +1 -1
  224. package/src/css/themes/super-blue.css +1 -1
  225. package/src/css/tokens.css +8 -8
  226. package/src/elements/index.ts +24 -0
  227. package/src/gl/liquid-blend/README.md +3 -3
  228. package/src/gl/matcap/README.md +3 -3
  229. package/src/gl/particle-hero/README.md +1 -1
  230. package/src/gl/particle-hero/create-particle-hero.ts +3 -5
  231. package/src/gl/particle-hero/shaders.ts +1 -1
  232. package/src/gl/shader-blur/README.md +3 -3
  233. package/src/gl/shader-grain/README.md +3 -3
  234. package/src/index.ts +25 -0
  235. package/src/motion/chat.ts +2 -2
  236. package/src/motion/confetti.ts +1 -1
  237. package/src/motion/count.ts +1 -1
  238. package/src/motion/details.ts +1 -1
  239. package/src/motion/drag-dismiss.ts +1 -1
  240. package/src/motion/effects.ts +1 -1
  241. package/src/motion/entrances.ts +1 -1
  242. package/src/motion/floating.ts +1 -1
  243. package/src/motion/flow.ts +2 -2
  244. package/src/motion/indicator.ts +1 -1
  245. package/src/motion/layout.ts +1 -1
  246. package/src/motion/liquid.ts +1 -1
  247. package/src/motion/morph.ts +2 -2
  248. package/src/motion/reveal.ts +1 -1
  249. package/src/motion/sheet.ts +1 -1
  250. package/src/motion/surface.ts +1 -1
  251. package/src/react/animated-number.tsx +2 -2
  252. package/src/react/flip-group.tsx +1 -1
  253. package/src/react/frost.tsx +1 -1
  254. package/src/react/index.ts +21 -0
  255. package/src/react/slot-text.tsx +1 -1
  256. package/src/react/use-action-button.ts +6 -0
  257. package/src/react/use-card-dock.ts +1 -1
  258. package/src/react/use-cascade.ts +1 -1
  259. package/src/react/use-contrast.ts +1 -1
  260. package/src/react/use-depth-grid.ts +1 -1
  261. package/src/react/use-editorial-reveal.ts +7 -0
  262. package/src/react/use-fill-text.ts +1 -1
  263. package/src/react/use-film-hero.ts +6 -0
  264. package/src/react/use-font-cycle.ts +7 -0
  265. package/src/react/use-frame-zoom.ts +1 -1
  266. package/src/react/use-image-zoom.ts +5 -0
  267. package/src/react/use-joined-cta.ts +5 -0
  268. package/src/react/use-letters.ts +1 -1
  269. package/src/react/use-local-clock.ts +5 -0
  270. package/src/react/use-marquee.ts +1 -1
  271. package/src/react/use-mask-text.ts +1 -1
  272. package/src/react/use-parallax.ts +1 -1
  273. package/src/react/use-particle-hero.ts +1 -1
  274. package/src/react/use-scroll-dock.ts +5 -0
  275. package/src/react/use-snap-strip.ts +1 -1
  276. package/src/react/use-sticker.ts +5 -0
  277. package/src/react/use-studio-dock.ts +8 -0
  278. package/src/react/use-text-roll.ts +1 -1
  279. package/src/react/use-thumbnail-nav.ts +7 -0
  280. package/src/react/use-trailer.ts +6 -0
  281. package/src/react/use-weight-hover.ts +5 -0
  282. package/src/recipes/action-button/README.md +31 -0
  283. package/src/recipes/action-button/action-button.css +113 -0
  284. package/src/recipes/action-button/create-action-button.ts +56 -0
  285. package/src/recipes/card-dock/README.md +1 -1
  286. package/src/recipes/card-dock/card-dock.css +1 -1
  287. package/src/recipes/card-dock/create-card-dock.ts +2 -2
  288. package/src/recipes/cascade/README.md +1 -3
  289. package/src/recipes/cascade/create-cascade.ts +3 -3
  290. package/src/recipes/contrast/README.md +0 -2
  291. package/src/recipes/contrast/create-contrast.ts +1 -1
  292. package/src/recipes/counter/README.md +0 -2
  293. package/src/recipes/counter/create-counter.ts +1 -1
  294. package/src/recipes/curved-carousel/README.md +0 -2
  295. package/src/recipes/curved-carousel/create-curved-carousel.ts +2 -2
  296. package/src/recipes/curved-carousel/curved-carousel.css +1 -1
  297. package/src/recipes/depth-grid/README.md +0 -2
  298. package/src/recipes/depth-grid/create-depth-grid.ts +3 -4
  299. package/src/recipes/details/README.md +0 -2
  300. package/src/recipes/details/create-details.ts +1 -1
  301. package/src/recipes/dock-pill/README.md +3 -3
  302. package/src/recipes/drag-ruler/README.md +3 -3
  303. package/src/recipes/editorial-reveal/README.md +35 -0
  304. package/src/recipes/editorial-reveal/create-editorial-reveal.ts +91 -0
  305. package/src/recipes/editorial-reveal/editorial-reveal.css +17 -0
  306. package/src/recipes/fill-text/README.md +1 -1
  307. package/src/recipes/fill-text/create-fill-text.ts +1 -1
  308. package/src/recipes/film-hero/README.md +23 -0
  309. package/src/recipes/film-hero/create-film-hero.ts +65 -0
  310. package/src/recipes/film-hero/film-hero.css +29 -0
  311. package/src/recipes/fit-text/README.md +0 -2
  312. package/src/recipes/flow/README.md +0 -2
  313. package/src/recipes/flow/create-flow.ts +1 -1
  314. package/src/recipes/font-cycle/README.md +11 -0
  315. package/src/recipes/font-cycle/create-font-cycle.ts +126 -0
  316. package/src/recipes/font-cycle/font-cycle.css +36 -0
  317. package/src/recipes/frame-zoom/README.md +1 -3
  318. package/src/recipes/frame-zoom/create-frame-zoom.ts +2 -2
  319. package/src/recipes/image-zoom/README.md +16 -0
  320. package/src/recipes/image-zoom/create-image-zoom.ts +27 -0
  321. package/src/recipes/image-zoom/image-zoom.css +7 -0
  322. package/src/recipes/infinite-reel/README.md +3 -3
  323. package/src/recipes/joined-cta/README.md +13 -0
  324. package/src/recipes/joined-cta/create-joined-cta.ts +22 -0
  325. package/src/recipes/joined-cta/joined-cta.css +17 -0
  326. package/src/recipes/letters/README.md +2 -4
  327. package/src/recipes/letters/create-letters.ts +3 -3
  328. package/src/recipes/local-clock/README.md +31 -0
  329. package/src/recipes/local-clock/create-local-clock.ts +61 -0
  330. package/src/recipes/marquee/README.md +0 -2
  331. package/src/recipes/marquee/create-marquee.ts +3 -3
  332. package/src/recipes/marquee/marquee.css +1 -1
  333. package/src/recipes/mask-text/README.md +3 -5
  334. package/src/recipes/mask-text/create-mask-text.ts +4 -4
  335. package/src/recipes/parallax/README.md +1 -3
  336. package/src/recipes/parallax/create-parallax.ts +1 -1
  337. package/src/recipes/pile/README.md +0 -2
  338. package/src/recipes/pile/create-pile.ts +1 -1
  339. package/src/recipes/pile/pile-math.ts +1 -1
  340. package/src/recipes/pile/pile.css +1 -1
  341. package/src/recipes/pill/README.md +0 -2
  342. package/src/recipes/pill/pill.css +2 -2
  343. package/src/recipes/pop/README.md +0 -2
  344. package/src/recipes/pop/create-pop.ts +1 -1
  345. package/src/recipes/radial-menu/README.md +0 -2
  346. package/src/recipes/radial-menu/create-radial-menu.ts +1 -1
  347. package/src/recipes/radial-menu/radial-menu.css +1 -1
  348. package/src/recipes/reflow/README.md +3 -5
  349. package/src/recipes/reflow/create-reflow.ts +1 -1
  350. package/src/recipes/repel-bento/README.md +3 -3
  351. package/src/recipes/reveal/README.md +0 -2
  352. package/src/recipes/reveal/create-reveal.ts +1 -1
  353. package/src/recipes/rotator/README.md +3 -3
  354. package/src/recipes/scroll-dock/README.md +46 -0
  355. package/src/recipes/scroll-dock/create-scroll-dock.ts +72 -0
  356. package/src/recipes/scroll-dock/scroll-dock.css +70 -0
  357. package/src/recipes/slot-text/README.md +0 -2
  358. package/src/recipes/slot-text/create-slot-text.ts +1 -1
  359. package/src/recipes/snap-strip/README.md +1 -1
  360. package/src/recipes/snap-strip/create-snap-strip.ts +5 -6
  361. package/src/recipes/snap-strip/snap-strip.css +1 -1
  362. package/src/recipes/sortable/README.md +3 -5
  363. package/src/recipes/sortable/create-sortable.ts +4 -4
  364. package/src/recipes/sortable/sortable.css +1 -1
  365. package/src/recipes/spring-cards/README.md +0 -2
  366. package/src/recipes/spring-cards/create-spring-cards.ts +1 -1
  367. package/src/recipes/spring-cards/spring-cards.css +1 -1
  368. package/src/recipes/sticker/README.md +59 -0
  369. package/src/recipes/sticker/create-sticker.ts +490 -0
  370. package/src/recipes/sticker/sticker.css +112 -0
  371. package/src/recipes/stretch-footer/README.md +0 -2
  372. package/src/recipes/stretch-footer/create-stretch-footer.ts +1 -1
  373. package/src/recipes/stretch-footer/stretch-footer.css +1 -1
  374. package/src/recipes/tabs/README.md +0 -2
  375. package/src/recipes/tabs/create-tabs.ts +1 -1
  376. package/src/recipes/text-roll/README.md +1 -3
  377. package/src/recipes/text-roll/create-text-roll.ts +3 -3
  378. package/src/recipes/text-roll/text-roll.css +1 -1
  379. package/src/recipes/thumbnail-nav/README.md +16 -0
  380. package/src/recipes/thumbnail-nav/create-thumbnail-nav.ts +165 -0
  381. package/src/recipes/thumbnail-nav/thumbnail-nav.css +108 -0
  382. package/src/recipes/ticket-menu/README.md +3 -3
  383. package/src/recipes/weight-hover/README.md +37 -0
  384. package/src/recipes/weight-hover/create-weight-hover.ts +136 -0
  385. package/src/recipes/weight-hover/weight-hover.css +7 -0
  386. package/src/recipes/words/README.md +0 -2
  387. package/src/recipes/words/create-words.ts +1 -1
  388. package/src/theme/generate.ts +1 -1
  389. package/src/theme/presets.ts +2 -2
  390. package/src/theme/theme.ts +1 -2
  391. package/dist/chunk-2BQGFOA7.js.map +0 -1
  392. package/dist/chunk-34XYOXHG.js.map +0 -1
  393. package/dist/chunk-6OJAP6ZL.js.map +0 -1
  394. package/dist/chunk-FS2HJVVY.js.map +0 -1
  395. package/dist/chunk-J27KH2A2.js.map +0 -1
  396. package/dist/chunk-KLY5BRRI.js.map +0 -1
  397. package/dist/chunk-Q4LVFNLN.js.map +0 -1
  398. package/dist/chunk-RFDIZYFX.js.map +0 -1
  399. /package/dist/{chunk-ABNRDDO7.js.map → chunk-I3DXF2KQ.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/curves.ts","../src/core/gsap.ts","../src/core/channels.ts","../src/core/split.ts","../src/core/frame.ts","../src/core/styles.ts","../src/core/physics-spring.ts","../src/motion/flow.ts","../src/motion/entrances.ts","../src/core/pointer.ts","../src/motion/reveal.ts","../src/motion/count.ts","../src/motion/anchor.ts","../src/motion/drag-dismiss.ts","../src/motion/floating.ts","../src/motion/surface.ts","../src/motion/liquid.ts","../src/motion/morph.ts","../src/motion/sheet.ts","../src/components/dialog/engine.ts","../src/components/menu/engine.ts"],"sourcesContent":["/** Stepbro's curve paths (CustomEase SVG syntax). */\nexport const PATHS = {\n /** The signature: a strong deceleration that is not a plain ease-out. */\n signature: 'M0,0 C0.308,0.19 0.107,0.633 0.288,0.866 0.382,0.987 0.656,1 1,1',\n /** Lists and steps entering (`flowSoft`, also `numberSoft`). */\n flow: 'M0,0 C0.25,0.1 0.25,1 1,1',\n /** A conversation scrolling to its newest message. */\n chatScroll: 'M0,0 C0.308,0.19 0.318,0.567 0.5,0.8 0.593,0.921 0.656,1 1,1',\n} as const;\n\n/**\n * A damped spring sampled as an ease path (Stepbro's `FA`): `ratio` below 1\n * overshoots and settles, `velocity` is the starting speed.\n */\nexport function springPath(ratio: number, velocity = 0, steps = 72): string {\n const damping = Math.min(Math.max(ratio, 0.05), 0.999);\n const stiffness = 5.6;\n const frequency = (stiffness / damping) * Math.sqrt(1 - damping * damping);\n const phase = (velocity - stiffness) / frequency;\n const at = (time: number) =>\n 1 + Math.exp(-stiffness * time) * (-Math.cos(frequency * time) + phase * Math.sin(frequency * time));\n let path = 'M0,0';\n for (let step = 1; step <= steps; step += 1) {\n const time = step / steps;\n path += ` L${time.toFixed(4)},${(step === steps ? 1 : at(time)).toFixed(4)}`;\n }\n return path;\n}\n\n/**\n * Stepbro's own linear() sampling of the signature curve (its backdrop tint),\n * for CSS and the Web Animations API.\n */\nexport const SIGNATURE_LINEAR =\n 'linear(0 0%, .017 2.5%, .037 5%, .061 7.5%, .091 10%, .13 12.5%, .184 15%, .275 17.5%, .562 20%, .733 22.5%, .803 25%, .848 27.5%, .88 30%, .902 32.5%, .942 40%, .97 50%, .985 60%, .993 70%, .998 80%, 1 90%, 1 100%)';\n","import { gsap } from 'gsap';\nimport { ScrollTrigger } from 'gsap/ScrollTrigger';\nimport { SplitText } from 'gsap/SplitText';\nimport { CustomEase } from 'gsap/CustomEase';\nimport { Flip } from 'gsap/Flip';\nimport { PATHS, springPath } from './curves';\n\n/** Spencer's elastic overshoot; close to the `--mk-ease-elastic` CSS curve. */\nexport const ELASTIC = 'elastic.out(1, 0.45)';\n\n/** Custom eases registered by `registerMotion()` (Stepbro curves). Use the names as GSAP `ease` values. */\nexport const EASE = {\n signature: 'mk-signature',\n flow: 'mk-flow',\n /** A closing surface's fade (`.56,.27,0,1`). Kept from v0.1; same curve as `fadeAway`. */\n close: 'mk-close',\n fadeAway: 'mk-fade-away',\n /** A closing surface's blur (`.37,.35,0,1`). */\n blurAway: 'mk-blur-away',\n chatScroll: 'mk-chat-scroll',\n /** Items travelling to a new place in a list (spring ratio .52). */\n layoutReflow: 'mk-layout-reflow',\n /** A dragged item landing in its slot (spring ratio .62). */\n sortableLand: 'mk-sortable-land',\n slot: 'mk-slot',\n slotResize: 'mk-slot-resize',\n liquidSize: 'mk-liquid-size',\n swatch: 'mk-swatch',\n swatchLight: 'mk-swatch-light',\n sheet: 'mk-sheet',\n inOut: 'mk-in-out',\n} as const;\n\nconst CURVES: Record<keyof typeof EASE, string> = {\n signature: PATHS.signature,\n flow: PATHS.flow,\n close: '.56,.27,0,1',\n fadeAway: '.56,.27,0,1',\n blurAway: '.37,.35,0,1',\n chatScroll: PATHS.chatScroll,\n layoutReflow: springPath(0.52),\n sortableLand: springPath(0.62),\n slot: '.34,1.56,.64,1',\n slotResize: '.2,0,0,1',\n liquidSize: '.8,.3,.5,.8',\n swatch: '.38,.49,0,1.5',\n swatchLight: '.11,1,0,1',\n sheet: '.16,1,.3,1',\n inOut: '.42,0,.58,1',\n};\n\nlet registered = false;\n\n/** Register plugins and eases once. Safe to call from every recipe and during SSR (no-op). */\nexport function registerMotion() {\n if (typeof window === 'undefined') return;\n // Cancels the MK_HEAD_SCRIPT safety net: JS owns the entrance states from here on.\n document.documentElement.classList.add('mk-ready');\n if (registered) return;\n registered = true;\n gsap.registerPlugin(ScrollTrigger, SplitText, CustomEase, Flip);\n for (const key of Object.keys(EASE) as Array<keyof typeof EASE>) CustomEase.create(EASE[key], CURVES[key]);\n}\n\nexport { gsap, ScrollTrigger, SplitText, CustomEase, Flip };\n","import { gsap } from 'gsap';\n\n/**\n * Stepbro's per-property motion channels (ported from Kayro's spring-channels):\n * each value moves toward its target either on a spring (stiffness, damping, an\n * initial kick) or on an eased duration, all stepped on GSAP's ticker. Used by\n * surfaces that grow out of a control (liquid dialog, toasts) and floating windows.\n */\n\nexport type Channel =\n | { type: 'spring'; stiffness: number; damping: number; mass?: number; velocity?: number; direction?: number }\n | { type: 'ease'; duration: number; ease: (progress: number) => number };\n\nexport interface ChannelState {\n current: number;\n origin: number;\n target: number;\n velocity: number;\n elapsed: number;\n active: boolean;\n config: Channel | null;\n}\n\nexport const easeOut = (t: number) => 1 - (1 - t) * (1 - t);\nexport const easeOutCubic = (t: number) => 1 - (1 - t) ** 3;\nexport const easeInCubic = (t: number) => t * t * t;\n\n/** A cubic-bezier as a function of progress (Stepbro's `cr.bezier`). */\nexport function bezier(x1: number, y1: number, x2: number, y2: number) {\n const at = (t: number, a: number, b: number) => {\n const u = 1 - t;\n return 3 * u * u * t * a + 3 * u * t * t * b + t * t * t;\n };\n return (progress: number) => {\n if (progress <= 0 || progress >= 1) return Math.min(1, Math.max(0, progress));\n let low = 0;\n let high = 1;\n let t = progress;\n for (let step = 0; step < 24; step += 1) {\n const x = at(t, x1, x2);\n if (Math.abs(x - progress) < 1e-5) break;\n if (x < progress) low = t;\n else high = t;\n t = (low + high) / 2;\n }\n return at(t, y1, y2);\n };\n}\n\nexport const spring = (stiffness: number, damping: number, extra: { mass?: number; velocity?: number; direction?: number } = {}): Channel => ({\n type: 'spring',\n stiffness,\n damping,\n ...extra,\n});\n\nexport const eased = (duration: number, ease: (progress: number) => number): Channel => ({ type: 'ease', duration, ease });\n\nexport const createChannelState = (value: number): ChannelState => ({\n current: value,\n origin: value,\n target: value,\n velocity: 0,\n elapsed: 0,\n active: false,\n config: null,\n});\n\n/** Advance one channel by `seconds`. Pure: exported for tests and custom loops. */\nexport function stepChannel(channel: ChannelState, seconds: number) {\n const config = channel.config;\n if (!channel.active || !config) return;\n if (config.type === 'spring') {\n // Sub-steps of at most 1/60 s keep stiff springs stable; a long frame is capped.\n const time = Math.min(0.064, Math.max(0, seconds));\n const steps = Math.max(1, Math.ceil(time / (1 / 60) - 1e-9));\n const step = time / steps;\n for (let index = 0; index < steps; index += 1) {\n const force = -config.stiffness * (channel.current - channel.target) - config.damping * channel.velocity;\n channel.velocity += (force / (config.mass ?? 1)) * step;\n channel.current += channel.velocity * step;\n }\n if (Math.abs(channel.velocity) <= 0.01 && Math.abs(channel.target - channel.current) <= 0.01) {\n channel.current = channel.target;\n channel.velocity = 0;\n channel.active = false;\n }\n } else {\n channel.elapsed += Math.max(0, seconds);\n const progress = Math.min(1, channel.elapsed / config.duration);\n channel.current = progress >= 1 ? channel.target : channel.origin + (channel.target - channel.origin) * config.ease(progress);\n if (progress >= 1) channel.active = false;\n }\n}\n\n/** Animate named values toward targets, each on its own channel, calling `onChange` per frame. */\nexport function channels<K extends string>(start: Record<K, number>, onChange: (name: K, value: number) => void) {\n const names = Object.keys(start) as K[];\n const state = Object.fromEntries(names.map((name) => [name, createChannelState(start[name])])) as Record<K, ChannelState>;\n let last = 0;\n let resolveDone: (() => void) | null = null;\n\n const tick = () => {\n const now = performance.now();\n const elapsed = Math.max(0, (now - last) / 1000);\n last = now;\n let running = false;\n for (const name of names) {\n const channel = state[name];\n if (!channel.active) continue;\n stepChannel(channel, elapsed);\n onChange(name, channel.current);\n running ||= channel.active;\n }\n if (!running) {\n gsap.ticker.remove(tick);\n resolveDone?.();\n resolveDone = null;\n }\n };\n\n return {\n state,\n /** Start moving; resolves when every channel has settled (or `stop()` is called). */\n animate(targets: Partial<Record<K, number>>, configs: Partial<Record<K, Channel>>): Promise<void> {\n for (const name of Object.keys(targets) as K[]) {\n const channel = state[name];\n const config = configs[name];\n if (!channel || !config) continue;\n channel.config = config;\n channel.origin = channel.current;\n channel.target = targets[name] as number;\n channel.elapsed = 0;\n if (config.type === 'spring' && config.velocity) {\n const sign = config.direction !== undefined ? Math.sign(config.direction) : Math.sign(channel.target - channel.current);\n channel.velocity = Math.abs(config.velocity) * sign;\n }\n channel.active = channel.target !== channel.current || channel.velocity !== 0;\n }\n last = performance.now();\n gsap.ticker.remove(tick);\n gsap.ticker.add(tick);\n resolveDone?.();\n return new Promise((resolve) => {\n resolveDone = resolve;\n });\n },\n stop() {\n gsap.ticker.remove(tick);\n for (const name of names) state[name].active = false;\n resolveDone?.();\n resolveDone = null;\n },\n };\n}\n\n/** A damped spring as an ease function of progress (Stepbro's `Vw`). */\nexport function springEase(ratio: number, velocity = 0) {\n const damping = Math.min(Math.max(ratio, 0.05), 0.999);\n const stiffness = 5.6;\n const frequency = (stiffness / damping) * Math.sqrt(1 - damping * damping);\n const phase = (velocity - stiffness) / frequency;\n return (progress: number) =>\n progress >= 1 ? 1 : 1 + Math.exp(-stiffness * progress) * (-Math.cos(frequency * progress) + phase * Math.sin(frequency * progress));\n}\n","/**\n * Split text for animation and put it back afterwards. Words become inline-block\n * spans (so they can move); spaces stay plain text so lines still wrap. Elements\n * matched by `exclude` (tables, code) are left whole.\n */\nexport interface Split {\n parts: HTMLElement[];\n revert(): void;\n}\n\nexport interface SplitWordsOptions {\n exclude?: string[];\n className?: string;\n}\n\nexport function splitWords(el: HTMLElement, { exclude = ['table', 'pre'], className = 'mk-split-word' }: SplitWordsOptions = {}): Split {\n const parts: HTMLElement[] = [];\n const replaced: Array<[Text, Node[]]> = [];\n const skip = exclude.join(',');\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n const texts: Text[] = [];\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const parent = (node as Text).parentElement;\n if (skip && parent?.closest(skip) && el.contains(parent.closest(skip))) continue;\n if ((node as Text).data.trim()) texts.push(node as Text);\n }\n for (const text of texts) {\n const pieces = text.data.split(/(\\s+)/);\n const nodes: Node[] = [];\n for (const piece of pieces) {\n if (!piece) continue;\n if (/^\\s+$/.test(piece)) {\n nodes.push(document.createTextNode(piece));\n continue;\n }\n const span = document.createElement('span');\n span.className = className;\n span.style.display = 'inline-block';\n span.textContent = piece;\n parts.push(span);\n nodes.push(span);\n }\n text.replaceWith(...nodes);\n replaced.push([text, nodes]);\n }\n let reverted = false;\n return {\n parts,\n revert() {\n if (reverted) return;\n reverted = true;\n for (const [text, nodes] of replaced.reverse()) {\n nodes[0]?.parentNode?.insertBefore(text, nodes[0]);\n for (const node of nodes) node.parentNode?.removeChild(node);\n }\n el.normalize();\n },\n };\n}\n\ntype Segmenter = { segment(text: string): Iterable<{ segment: string }> };\n\n/** User-perceived characters (emoji with modifiers stay whole), at most `limit`. */\nexport function splitGraphemes(text: string, limit = 64): string[] {\n const Ctor = (Intl as unknown as { Segmenter?: new (locale?: string, options?: { granularity: string }) => Segmenter }).Segmenter;\n const all = Ctor ? Array.from(new Ctor(undefined, { granularity: 'grapheme' }).segment(text), (part) => part.segment) : Array.from(text);\n return all.slice(0, limit);\n}\n","/** requestAnimationFrame with a timer fallback (tests, old WebViews). Returns a cancel function. */\nexport function requestFrame(fn: (time: number) => void): () => void {\n if (typeof requestAnimationFrame === 'function') {\n const id = requestAnimationFrame(fn);\n return () => cancelAnimationFrame(id);\n }\n const id = setTimeout(() => fn(Date.now()), 16);\n return () => clearTimeout(id);\n}\n\n/** Resolves on the next frame, after the framework has painted a DOM change. */\nexport const nextFrame = () => new Promise<void>((resolve) => requestFrame(() => resolve()));\n","/**\n * Remove inline properties GSAP wrote, without asking GSAP. `gsap.set(el,\n * { clearProps: 'transform' })` measures the element first, and an element\n * that is not rendered (a closed <dialog>, display: none) is moved to the end of\n * the document and back to be measured — which reorders text around it and\n * disconnects custom elements inside. This only edits the style attribute and\n * drops GSAP's cache so the next tween starts from scratch.\n */\nexport function clearStyles(targets: Iterable<Element>, properties: string[]) {\n for (const element of targets) {\n const style = (element as HTMLElement).style;\n if (!style) continue;\n for (const property of properties) style.removeProperty(property);\n if (element.getAttribute('style') === '') element.removeAttribute('style');\n delete (element as unknown as { _gsap?: unknown })._gsap;\n }\n}\n\n/** What the surface morphs write. */\nexport const MORPH_STYLES = [\n 'transform',\n 'translate',\n 'rotate',\n 'scale',\n 'transform-origin',\n 'clip-path',\n 'opacity',\n 'visibility',\n 'filter',\n 'will-change',\n];\n","/*\n * Motion/Framer's physical spring — stiffness, damping and mass, released from\n * rest at 0 toward 1 — the way Dousan declares its motion (400/10, 260/18…).\n * motionSpring() gives a GSAP ease plus the time it takes to settle;\n * springLinear() samples it as a CSS linear(). Stepbro's own springs (FA)\n * stay in springPath / springEase.\n */\n\nconst REST = 0.001;\nconst STEP = 1 / 240;\nconst LIMIT = 10;\n\nexport interface MotionSpring {\n /** Progress 0…1 over `duration` → position (overshoots when bouncy). */\n ease: (progress: number) => number;\n /** Seconds until it stays within 0.1 % of the target. */\n duration: number;\n}\n\nfunction position(stiffness: number, damping: number, mass: number) {\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n if (zeta < 1) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return (t: number) => 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta === 1) return (t: number) => 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n const root = Math.sqrt(zeta * zeta - 1);\n const r1 = -w0 * (zeta - root);\n const r2 = -w0 * (zeta + root);\n return (t: number) => 1 - (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r2 - r1);\n}\n\nconst springs = new Map<string, MotionSpring>();\n\nexport function motionSpring(stiffness: number, damping: number, mass = 1): MotionSpring {\n const key = `${stiffness}/${damping}/${mass}`;\n const known = springs.get(key);\n if (known) return known;\n const x = position(Math.max(stiffness, 1e-6), Math.max(damping, 0), Math.max(mass, 1e-6));\n let settled = 0;\n for (let i = 0; i * STEP <= LIMIT; i++) if (Math.abs(x(i * STEP) - 1) > REST) settled = (i + 1) * STEP;\n const duration = Math.round(Math.min(settled, LIMIT) * 1000) / 1000;\n const spring: MotionSpring = {\n ease: (progress) => (progress <= 0 ? 0 : progress >= 1 ? 1 : x(progress * duration)),\n duration,\n };\n springs.set(key, spring);\n return spring;\n}\n\n/** Seconds a Motion spring takes to settle. */\nexport const springDuration = (stiffness: number, damping: number, mass = 1) => motionSpring(stiffness, damping, mass).duration;\n\n/** The spring as a CSS linear() easing (pair it with springDuration). */\nexport function springLinear(stiffness: number, damping: number, mass = 1, points = 40) {\n const { ease } = motionSpring(stiffness, damping, mass);\n return `linear(${Array.from({ length: points + 1 }, (_, i) => Number(ease(i / points).toFixed(4))).join(', ')})`;\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { nextFrame } from '../core/frame';\nimport { clearStyles } from '../core/styles';\n\n/*\n * Stepbro flowIn / flowOut: items drop in from 20 px above out of a 16 px blur,\n * 0.5 s, 50 ms apart (`flowSoft`), and leave 20 px down into the same blur.\n * Style 2 grows them from 90 % instead of moving them.\n */\n\nexport interface FlowInOptions {\n /** Distance travelled (style 1), px. */\n y?: number;\n blur?: number;\n duration?: number;\n stagger?: number;\n delay?: number;\n /** 1: drop from above (default). 2: grow from `startScale`. */\n style?: 1 | 2;\n startScale?: number;\n /** Last item first. */\n reverse?: boolean;\n /** With a single container as target, animate its matches instead. */\n target?: string;\n ease?: string;\n /**\n * Hide with visibility as well as opacity (default). Off for controls that must\n * take focus while they enter (menu options): a visibility:hidden element cannot.\n */\n autoAlpha?: boolean;\n}\n\nexport interface FlowOutOptions {\n y?: number;\n blur?: number;\n duration?: number;\n stagger?: number;\n delay?: number;\n reverse?: boolean;\n target?: string;\n}\n\nconst CLEAR = 'transform,filter,opacity,visibility';\n\nfunction list(targets: gsap.TweenTarget, target?: string, reverse?: boolean): HTMLElement[] {\n let items: HTMLElement[];\n if (target && targets instanceof Element) items = [...targets.querySelectorAll<HTMLElement>(target)];\n else items = gsap.utils.toArray<HTMLElement>(targets);\n return reverse ? items.reverse() : items;\n}\n\n/** Flow items in. Returns the tween, or null when there is nothing to animate or motion is reduced. */\nexport function flowIn(targets: gsap.TweenTarget, options: FlowInOptions = {}): gsap.core.Tween | null {\n registerMotion();\n const {\n y = 20,\n blur = 16,\n duration = TIMING.flow,\n stagger = TIMING.flowStagger,\n delay = 0,\n style = 1,\n startScale = 0.9,\n reverse = false,\n target,\n ease = EASE.flow,\n autoAlpha = true,\n } = options;\n const items = list(targets, target, reverse);\n if (!items.length) return null;\n if (reduced()) {\n // Not gsap.set(clearProps): it would move hidden items around to measure them.\n clearStyles(items, ['transform', 'translate', 'rotate', 'scale', 'filter', 'opacity', 'visibility']);\n return null;\n }\n const from = style === 2 ? { scale: startScale } : { y: -y };\n const to = style === 2 ? { scale: 1 } : { y: 0 };\n const alpha = autoAlpha ? 'autoAlpha' : 'opacity';\n return gsap.fromTo(\n items,\n { ...from, [alpha]: 0, filter: `blur(${blur}px)` },\n { ...to, [alpha]: 1, filter: 'blur(0px)', duration, stagger, delay, ease, clearProps: CLEAR },\n );\n}\n\n/** Flow items out (down into a blur). They stay hidden afterwards; flowIn brings them back. */\nexport function flowOut(targets: gsap.TweenTarget, options: FlowOutOptions = {}): gsap.core.Tween | null {\n registerMotion();\n const { y = 20, blur = 16, duration = TIMING.flow, stagger = TIMING.flowStagger, delay = 0, reverse = false, target } = options;\n const items = list(targets, target, reverse);\n if (!items.length) return null;\n if (reduced()) {\n gsap.set(items, { autoAlpha: 0 });\n return null;\n }\n return gsap.to(items, { y, autoAlpha: 0, filter: `blur(${blur}px)`, duration, stagger, delay, ease: EASE.flow });\n}\n\n/**\n * Stepbro's step change: the current children flow out, `mutate` swaps the\n * content (render the next step there), and after a frame the new children flow in.\n */\nexport async function stepChange(\n container: HTMLElement,\n mutate: () => void | Promise<void>,\n { duration = TIMING.stepChange }: { duration?: number } = {},\n): Promise<void> {\n const before = [...container.children] as HTMLElement[];\n const out = flowOut(before, { duration });\n if (out) await out;\n await mutate();\n await nextFrame();\n flowIn([...container.children] as HTMLElement[], { duration });\n}\n","import { TIMING } from '../core/timing';\nimport { flowIn } from './flow';\n\n/*\n * Named entrances from Stepbro (money/replication-catalog.json): the same\n * flowIn with each surface's own scale, blur and rhythm.\n */\n\n/** Navigation menu options: grow from 90 % out of 4 px blur, last first, after 0.1 s. */\nexport const flowInMenu = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.9, blur: 4, reverse: true, autoAlpha: false, ...TIMING.menu });\n\n/** Theme picker swatches: pop in from half size, 10 ms apart. */\nexport const flowInPalette = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.5, blur: 4, autoAlpha: false, ...TIMING.palette });\n\n/** Form cards (`[data-flow-item]`): grow from 90 % out of 8 px blur. */\nexport const flowInForm = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.9, blur: 8, ...TIMING.form });\n\n/** Landing pieces: grow from 85 % out of 24 px blur, after 0.15 s. */\nexport const flowInLanding = (targets: gsap.TweenTarget) =>\n flowIn(targets, { style: 2, startScale: 0.85, blur: 24, ...TIMING.landing });\n\n/** Long-form content (`[data-flow]`, markdown blocks): style 2, 0.6 s, 60 ms apart. */\nexport const flowInContent = (root: Element) =>\n flowIn(root, { style: 2, target: '[data-flow], .markdown-content > *', ...TIMING.content });\n","import { gsap } from 'gsap';\n\n/** Live pointer position (viewport px) plus movement accumulated since the last frame. */\nexport const pointer = { x: 0, y: 0, active: false };\n\nlet mx = 0;\nlet my = 0;\nlet lastX: number | null = null;\nlet lastY: number | null = null;\nlet users = 0;\n\nfunction onMove(e: PointerEvent) {\n if (lastX !== null && lastY !== null) {\n mx += e.clientX - lastX;\n my += e.clientY - lastY;\n }\n lastX = pointer.x = e.clientX;\n lastY = pointer.y = e.clientY;\n pointer.active = true;\n}\n\nfunction onOut(e: PointerEvent) {\n if (e.relatedTarget) return;\n pointer.active = false;\n lastX = lastY = null;\n}\n\n/** Start tracking (reference-counted). Call the returned function when the recipe is destroyed. */\nexport function bindPointer(): () => void {\n if (users++ === 0) {\n addEventListener('pointermove', onMove, { passive: true });\n document.addEventListener('pointerout', onOut);\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (--users > 0) return;\n removeEventListener('pointermove', onMove);\n document.removeEventListener('pointerout', onOut);\n pointer.active = false;\n lastX = lastY = null;\n mx = my = 0;\n };\n}\n\nlet frameMovement = { mx: 0, my: 0 };\nlet movementFrame = -1;\n\n/**\n * Pointer movement since the previous animation frame. Every caller in the same\n * frame gets the same value (two recipes on a page both feel the pointer); the\n * next frame starts again from what moved since.\n */\nexport function takeMovement() {\n const frame = gsap.ticker.frame;\n if (frame !== movementFrame) {\n movementFrame = frame;\n frameMovement = { mx, my };\n mx = my = 0;\n }\n return frameMovement;\n}\n","import { gsap, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { pointer } from '../core/pointer';\nimport { TIMING } from '../core/timing';\n\n/*\n * Stepbro's reveal (PrettyCalendarMenu, Nav, SupportModal): a veil in the\n * surface's own colour covers it and a round opening grows from the origin,\n * uncovering the content like a wave; then the veil fades. Overshoot 2 lets the\n * opening pass the far corner halfway through, so the end is soft.\n */\n\nexport type RevealSpeed = keyof typeof TIMING.reveal;\n\nexport interface RevealOptions {\n /** Element (its centre) or viewport point. Default: the last pointer position, else the centre. */\n origin?: Element | { x: number; y: number } | null;\n speed?: RevealSpeed;\n delay?: number;\n overshoot?: number;\n /** Veil colour. Default: the first opaque background up the tree, else var(--mk-bg). */\n fill?: string;\n}\n\nexport interface RevealHandle {\n timeline: gsap.core.Timeline;\n finished: Promise<void>;\n /** Stop now and remove the veil. */\n cancel(): void;\n}\n\nconst TRANSPARENT = /^(transparent|rgba\\(0, 0, 0, 0\\))$/;\n\nfunction backgroundOf(el: Element): string {\n for (let node: Element | null = el; node; node = node.parentElement) {\n const color = getComputedStyle(node).backgroundColor;\n if (color && !TRANSPARENT.test(color)) return color;\n }\n return 'var(--mk-bg, #fff)';\n}\n\nexport function revealFrom(target: HTMLElement, options: RevealOptions = {}): RevealHandle | null {\n if (reduced() || !target.isConnected) return null;\n registerMotion();\n const { speed = 'normal', delay = 0, overshoot = 2 } = options;\n const style = getComputedStyle(target);\n const fill = options.fill ?? backgroundOf(target);\n const position = target.style.position;\n if (style.position === 'static') target.style.position = 'relative';\n\n const box = target.getBoundingClientRect();\n const width = target.clientWidth;\n const height = target.clientHeight;\n let point: { x: number; y: number } | null = null;\n const origin = options.origin;\n if (origin instanceof Element) {\n if (origin.isConnected) {\n const rect = origin.getBoundingClientRect();\n point = { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 };\n }\n } else if (origin) point = origin;\n else if (origin === undefined && pointer.active) point = { x: pointer.x, y: pointer.y };\n const x = point ? point.x - box.left - target.clientLeft : width / 2;\n const y = point ? point.y - box.top - target.clientTop : height / 2;\n const radius =\n Math.max(Math.hypot(x, y), Math.hypot(width - x, y), Math.hypot(x, height - y), Math.hypot(width - x, height - y)) * overshoot;\n\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n veil.dataset.mkVeil = '';\n Object.assign(veil.style, {\n position: 'absolute',\n top: `${target.scrollTop}px`,\n left: `${target.scrollLeft}px`,\n width: `${width}px`,\n height: `${height}px`,\n borderRadius: style.borderRadius,\n pointerEvents: 'none',\n zIndex: '1000',\n });\n const progress = { value: 0 };\n const paint = () => {\n veil.style.background = `radial-gradient(${radius}px at ${x}px ${y}px, transparent 0%, ${fill} ${progress.value}%)`;\n };\n paint();\n target.append(veil);\n\n let done = false;\n let resolve!: () => void;\n const finished = new Promise<void>((r) => (resolve = r));\n const cleanup = () => {\n if (done) return;\n done = true;\n veil.remove();\n target.style.position = position;\n resolve();\n };\n const [duration, fade] = TIMING.reveal[speed];\n const timeline = gsap\n .timeline({ delay, onComplete: cleanup, onInterrupt: cleanup })\n .to(progress, { value: 100, duration, ease: 'power2.out', onUpdate: paint }, 0)\n .to(veil, { opacity: 0, duration: fade, ease: 'power1.out' }, Math.max(0, duration * Math.min(1, 1 / overshoot) - 0.1));\n\n return {\n timeline,\n finished,\n cancel() {\n timeline.kill();\n cleanup();\n },\n };\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { requestFrame } from '../core/frame';\n\n/*\n * Numbers that count to their new value: Stepbro's animated number (`numberSoft`,\n * 0.6 s; 0.7 s on prices) and the onboarding's revealed balance (rAF, 0.9 s,\n * ease-out cubic). Both continue from the value currently shown.\n */\n\nexport type NumberFormat = (value: number) => string;\nexport interface CountOptions {\n /** Start value. Default: the last value counted on this element, else the number in its text. */\n from?: number;\n duration?: number;\n format?: NumberFormat;\n}\n\nconst shown = new WeakMap<Element, number>();\nconst tweens = new WeakMap<Element, gsap.core.Tween>();\nconst frames = new WeakMap<Element, () => void>();\nconst defaultFormat: NumberFormat = (value) => String(Math.round(value));\n\nfunction current(el: Element): number {\n const known = shown.get(el);\n if (known !== undefined) return known;\n const parsed = Number((el.textContent ?? '').replace(/[^\\d.-]/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\n/** Tween a plain number (no DOM): `onUpdate` gets each value. Reduced motion jumps to `to`. */\nexport function tweenNumber(from: number, to: number, onUpdate: (value: number) => void, { duration = TIMING.number }: { duration?: number } = {}) {\n registerMotion();\n if (from === to || reduced()) {\n onUpdate(to);\n return null;\n }\n const state = { value: from };\n return gsap.to(state, { value: to, duration, ease: EASE.flow, onUpdate: () => onUpdate(state.value), onComplete: () => onUpdate(to) });\n}\n\nexport function countTo(el: HTMLElement, to: number, { from, duration = TIMING.number, format = defaultFormat }: CountOptions = {}) {\n registerMotion();\n tweens.get(el)?.kill();\n const start = from ?? current(el);\n const write = (value: number) => {\n shown.set(el, value);\n el.textContent = format(value);\n };\n if (start === to || reduced()) {\n write(to);\n return null;\n }\n const state = { value: start };\n const tween = gsap.to(state, {\n value: to,\n duration,\n ease: EASE.flow,\n onUpdate: () => write(state.value),\n onComplete: () => {\n write(to);\n tweens.delete(el);\n },\n });\n tweens.set(el, tween);\n return tween;\n}\n\n/** Count with requestAnimationFrame and ease-out cubic. Returns a cancel function. */\nexport function revealCounter(el: HTMLElement, to: number, { from, duration = TIMING.revealCounter, format = defaultFormat }: CountOptions = {}) {\n frames.get(el)?.();\n const start = from ?? current(el);\n const write = (value: number) => {\n shown.set(el, value);\n el.textContent = format(value);\n };\n if (start === to || reduced()) {\n write(to);\n return () => {};\n }\n let began: number | null = null;\n let cancel = () => {};\n const step = (time: number) => {\n began ??= time;\n const progress = Math.min(1, (time - began) / (duration * 1000));\n write(start + (to - start) * (1 - (1 - progress) ** 3));\n if (progress < 1) cancel = requestFrame(step);\n else frames.delete(el);\n };\n cancel = requestFrame(step);\n const stop = () => cancel();\n frames.set(el, stop);\n return stop;\n}\n","/*\n * Place an anchored surface (menu, anchored dialog) under its opener, left\n * aligned with it, inside the viewport: above when there is no room below,\n * beside it when neither fits (never covering it), else as low as it can go.\n * Under 680 px the stylesheet's full-screen sheet wins, so the inline place is cleared.\n */\n\nconst EDGE = 16;\nconst GAP = 8;\nconst PHONE = 680;\n/** Shorthands and longhands: some engines keep the longhands of a removed shorthand. */\nconst PLACED = ['top', 'left', 'right', 'bottom', 'margin', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left'];\n\nexport interface Viewport {\n width: number;\n height: number;\n}\n\nexport function anchorSurface(surface: HTMLElement, origin: DOMRect | null | undefined, viewport?: Viewport) {\n const view = viewport ?? { width: innerWidth, height: innerHeight };\n if (!origin || view.width < PHONE) {\n for (const side of PLACED) surface.style.removeProperty(side);\n return;\n }\n const box = surface.getBoundingClientRect();\n const clampLeft = (value: number) => Math.max(EDGE, Math.min(value, view.width - box.width - EDGE));\n const below = origin.bottom + GAP;\n const above = origin.top - GAP - box.height;\n const lowest = Math.max(EDGE, view.height - box.height - EDGE);\n const besideRight = origin.right + GAP;\n const besideLeft = origin.left - GAP - box.width;\n let top: number;\n let left: number;\n if (below <= lowest) [top, left] = [below, clampLeft(origin.left)];\n else if (above >= EDGE) [top, left] = [above, clampLeft(origin.left)];\n else if (besideRight + box.width <= view.width - EDGE) [top, left] = [Math.min(Math.max(EDGE, origin.top), lowest), besideRight];\n else if (besideLeft >= EDGE) [top, left] = [Math.min(Math.max(EDGE, origin.top), lowest), besideLeft];\n else [top, left] = [lowest, clampLeft(origin.left)];\n Object.assign(surface.style, { margin: '0', top: `${Math.round(top)}px`, left: `${Math.round(left)}px`, right: 'auto', bottom: 'auto' });\n}\n\n/** Remove the inline place anchorSurface wrote. */\nexport function clearAnchor(surface: HTMLElement) {\n for (const side of PLACED) surface.style.removeProperty(side);\n}\n","import { gsap, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Stepbro's modal drag (ported from Kayro): a surface follows a drag (or a pull\n * with the wheel) at half speed and shrinks as it goes down (1 − y/400); past\n * 100 px it is dismissed, otherwise it springs back (elastic.out(.5,.5), 0.5 s).\n * A drag starts after 6 px, ignores controls, scrollable areas that can still\n * scroll, popovers and [data-mk-no-drag]; with a [data-mk-drag-handle] only the\n * handle drags. The wheel dismisses at speed 1.5 past 16 px, or past 100 px.\n */\n\nconst START = 6;\nconst FOLLOW = 0.5;\nconst DISMISS = 100;\nconst SHRINK = 400;\nconst WHEEL_SPEED = 1.5;\nconst WHEEL_MIN = 16;\nconst WHEEL_IDLE = 90;\nconst WHEEL_COOLDOWN = 250;\nconst CONTROLS = [\n 'a[href]',\n 'button',\n 'input',\n 'select',\n 'textarea',\n 'label',\n 'summary',\n '[contenteditable=\"true\"]',\n '[role=\"button\"]',\n '[role=\"slider\"]',\n '[role=\"combobox\"]',\n '[role=\"option\"]',\n '[role=\"checkbox\"]',\n '[role=\"menuitem\"]',\n].join(',');\n\n/** The nearest element between `target` and `surface` that scrolls vertically. */\nfunction scrollerOf(target: EventTarget | null, surface: HTMLElement) {\n let element = target instanceof Element ? target : null;\n while (element) {\n if (element.scrollHeight > element.clientHeight + 1) {\n const overflow = getComputedStyle(element).overflowY;\n if (overflow === 'auto' || overflow === 'scroll') return element;\n }\n if (element === surface) break;\n element = element.parentElement;\n }\n return null;\n}\n\nconst draggableFrom = (target: EventTarget | null, surface: HTMLElement) =>\n target instanceof Element &&\n !target.closest('[data-mk-no-drag], [popover]') &&\n !target.closest(CONTROLS) &&\n !(surface.querySelector('[data-mk-drag-handle]') && !target.closest('[data-mk-drag-handle]'));\n\nexport interface DragDismissOptions {\n /** Whether a gesture may start now (not while opening, saving or floating). */\n canDrag?: () => boolean;\n onDismiss: () => void;\n}\n\n/** Let `surface` be dragged away. Returns the function that detaches it. */\nexport function attachDragDismiss(surface: HTMLElement, { canDrag = () => true, onDismiss }: DragDismissOptions) {\n registerMotion();\n let pointer: number | null = null;\n let startX = 0;\n let startY = 0;\n let mode: 'drag' | 'scroll' | null = null;\n let pulled = 0;\n let base = { x: 0, y: 0, scale: 1 };\n let target: EventTarget | null = null;\n\n const noSelect = (event: Event) => event.preventDefault();\n const begin = () => {\n mode = 'drag';\n gsap.killTweensOf(surface, 'x,y,scale');\n base = {\n x: Number(gsap.getProperty(surface, 'x')) || 0,\n y: Number(gsap.getProperty(surface, 'y')) || 0,\n scale: Number(gsap.getProperty(surface, 'scaleX')) || 1,\n };\n window.getSelection?.()?.removeAllRanges();\n document.body.style.userSelect = 'none';\n document.addEventListener('selectstart', noSelect);\n };\n const follow = (dx: number, dy: number) => {\n pulled = dy * FOLLOW;\n gsap.set(surface, { x: base.x + dx * FOLLOW, y: base.y + pulled, scale: Math.max(0.1, base.scale * (1 - pulled / SHRINK)) });\n };\n const restore = () => gsap.to(surface, { x: 0, y: 0, scale: 1, duration: TIMING.drag.restore, ease: 'elastic.out(0.5,0.5)' });\n const release = () => {\n document.removeEventListener('selectstart', noSelect);\n document.body.style.userSelect = '';\n const dismiss = pulled > DISMISS;\n mode = null;\n pulled = 0;\n if (dismiss) onDismiss();\n else restore();\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 || pointer !== null || reduced() || !canDrag()) return;\n if (!draggableFrom(event.target, surface)) return;\n pointer = event.pointerId;\n target = event.target;\n startX = event.clientX;\n startY = event.clientY;\n mode = null;\n pulled = 0;\n };\n const onPointerMove = (event: PointerEvent) => {\n if (event.pointerId !== pointer || mode === 'scroll') return;\n const dx = event.clientX - startX;\n const dy = event.clientY - startY;\n if (mode === null) {\n if (Math.abs(dx) < START && Math.abs(dy) < START) return;\n if (event.pointerType !== 'mouse') {\n // A touch decides between scrolling the content and dragging the surface.\n const scroller = scrollerOf(target, surface);\n if (scroller && Math.abs(dx) < Math.abs(dy) && !(dy > 0 && scroller.scrollTop <= 0)) {\n mode = 'scroll';\n return;\n }\n }\n begin();\n }\n if (event.cancelable) event.preventDefault();\n follow(dx, dy);\n };\n const onPointerUp = (event: PointerEvent) => {\n if (event.pointerId !== pointer) return;\n pointer = null;\n target = null;\n if (mode !== 'drag') {\n mode = null;\n return;\n }\n // The click that ends a drag does not reach what is under the pointer.\n const swallow = (click: Event) => {\n click.stopPropagation();\n click.preventDefault();\n };\n window.addEventListener('click', swallow, { capture: true, once: true });\n setTimeout(() => window.removeEventListener('click', swallow, { capture: true }), 50);\n release();\n };\n\n // Pulling down with the wheel (scrolling up past the top) drags it as well.\n let wheeling = false;\n let wheelPull = 0;\n let wheelSpeed = 0;\n let lastWheel = 0;\n let idle: ReturnType<typeof setTimeout> | undefined;\n let quietUntil = 0;\n const deltaOf = (event: WheelEvent) =>\n event.deltaMode === 1 ? event.deltaY * 16 : event.deltaMode === 2 ? event.deltaY * innerHeight : event.deltaY;\n function endWheel(dismiss: boolean, at: number) {\n window.removeEventListener('wheel', onWheelCapture, { capture: true });\n clearTimeout(idle);\n wheeling = false;\n quietUntil = at + WHEEL_COOLDOWN;\n pulled = 0;\n wheelPull = 0;\n wheelSpeed = 0;\n lastWheel = 0;\n document.body.style.userSelect = '';\n if (dismiss) onDismiss();\n else restore();\n }\n function stepWheel(event: WheelEvent) {\n const amount = -deltaOf(event);\n const elapsed = lastWheel ? Math.max(1, event.timeStamp - lastWheel) : 16;\n lastWheel = event.timeStamp;\n wheelSpeed = wheelSpeed * 0.4 + (amount / elapsed) * 0.6;\n wheelPull = Math.max(0, wheelPull + amount);\n follow(0, wheelPull);\n if ((wheelSpeed > WHEEL_SPEED && pulled > WHEEL_MIN) || pulled > DISMISS) {\n endWheel(true, event.timeStamp);\n return;\n }\n clearTimeout(idle);\n idle = setTimeout(() => wheeling && endWheel(false, performance.now()), WHEEL_IDLE);\n }\n function onWheelCapture(event: WheelEvent) {\n if (!wheeling) return;\n event.preventDefault();\n event.stopPropagation();\n stepWheel(event);\n }\n const onWheel = (event: WheelEvent) => {\n if (wheeling || reduced() || !canDrag()) return;\n const up = deltaOf(event) < 0;\n const scroller = scrollerOf(event.target, surface);\n const canScroll = scroller\n ? up\n ? scroller.scrollTop > 0\n : scroller.scrollTop + scroller.clientHeight < scroller.scrollHeight - 1\n : false;\n if (canScroll || !up || event.timeStamp < quietUntil) return;\n if (event.target instanceof Element && event.target.closest('[data-mk-no-drag], [popover]')) return;\n event.preventDefault();\n wheeling = true;\n wheelPull = 0;\n wheelSpeed = 0;\n lastWheel = 0;\n begin();\n mode = null;\n window.addEventListener('wheel', onWheelCapture, { passive: false, capture: true });\n stepWheel(event);\n };\n\n surface.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('pointermove', onPointerMove, { passive: false });\n window.addEventListener('pointerup', onPointerUp);\n window.addEventListener('pointercancel', onPointerUp);\n surface.addEventListener('wheel', onWheel, { passive: false });\n return () => {\n surface.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onPointerUp);\n window.removeEventListener('pointercancel', onPointerUp);\n surface.removeEventListener('wheel', onWheel);\n window.removeEventListener('wheel', onWheelCapture, { capture: true });\n clearTimeout(idle);\n document.removeEventListener('selectstart', noSelect);\n document.body.style.userSelect = '';\n };\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Stepbro's floating modal (ported from Kayro): on desktop (≥ 680 px) a handle\n * lifts a surface into a window that moves on a spring (1100/38, mass by area),\n * glides when flung (≥ 350 px/s, decays in 0.18 s), stays inside the viewport\n * (8 px margin), resizes from its corners (min 320 × 240) and remembers where it\n * was left (localStorage `mk-float.<key>`). A press on the handle without\n * moving toggles floating.\n */\n\nconst MIN_WIDTH = 320;\nconst MIN_HEIGHT = 240;\nconst MARGIN = 8;\nconst DESKTOP = 680;\nconst LIFT = 4;\nconst SPRING = { stiffness: 1100, damping: 38 };\nconst MASS_AREA = 24_000;\nconst MAX_MASS = 1.5;\nconst REST_SPEED = 24;\nconst FLING_SPEED = 350;\nconst POINTER_SMOOTHING = 0.05;\nconst SHRINK_FULL = 0.85;\nconst FLOAT_SHADOW = 'rgba(0, 0, 0, 0.24) 0px 0px 24px -6px';\n\nexport const floatingAvailable = () => typeof innerWidth === 'number' && innerWidth >= DESKTOP;\n\nexport interface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** A window kept inside the viewport, at least 320 × 240. */\nexport function clampRect(rect: Rect, viewport = { width: innerWidth, height: innerHeight }): Rect {\n const maxWidth = Math.max(MIN_WIDTH, viewport.width - MARGIN * 2);\n const maxHeight = Math.max(MIN_HEIGHT, viewport.height - MARGIN * 2);\n const width = Math.min(maxWidth, Math.max(MIN_WIDTH, rect.width));\n const height = Math.min(maxHeight, Math.max(MIN_HEIGHT, rect.height));\n return {\n top: Math.min(Math.max(MARGIN, viewport.height - height - MARGIN), Math.max(MARGIN, rect.top)),\n left: Math.min(Math.max(MARGIN, viewport.width - width - MARGIN), Math.max(MARGIN, rect.left)),\n width,\n height,\n };\n}\n\nconst rectOf = (element: HTMLElement): Rect => {\n const box = element.getBoundingClientRect();\n return { top: box.top, left: box.left, width: box.width, height: box.height };\n};\n\nconst place = (element: HTMLElement, rect: Rect) =>\n Object.assign(element.style, {\n position: 'fixed',\n inset: 'auto',\n margin: '0',\n top: `${rect.top}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n maxWidth: 'none',\n maxHeight: 'none',\n });\n\nconst storageKey = (key: string) => `mk-float.${key}`;\n\n/** Where a floating window was left, if this device remembers it. */\nexport function savedFloat(key: string): Rect | null {\n try {\n const value = JSON.parse(localStorage.getItem(storageKey(key)) ?? 'null') as Rect | null;\n return value && (['top', 'left', 'width', 'height'] as const).every((name) => Number.isFinite(value[name])) ? clampRect(value) : null;\n } catch {\n return null;\n }\n}\n\nfunction saveFloat(key: string, rect: Rect) {\n try {\n localStorage.setItem(\n storageKey(key),\n JSON.stringify({ top: Math.round(rect.top), left: Math.round(rect.left), width: Math.round(rect.width), height: Math.round(rect.height) }),\n );\n } catch {\n // A convenience only.\n }\n}\n\nexport function forgetFloat(key: string) {\n try {\n localStorage.removeItem(storageKey(key));\n } catch {\n // A convenience only.\n }\n}\n\n/** Lift a surface into a window at `rect` (its shadow eases in, 0.45 s). */\nexport function liftWindow(surface: HTMLElement, rect: Rect) {\n registerMotion();\n place(surface, clampRect(rect));\n surface.classList.add('is-floating');\n if (!reduced()) {\n gsap.fromTo(\n surface,\n { boxShadow: 'rgba(0, 0, 0, 0) 0px 0px 0px 0px' },\n { boxShadow: FLOAT_SHADOW, duration: TIMING.float.shadow, ease: EASE.signature, clearProps: 'boxShadow' },\n );\n }\n}\n\nconst PLACED = [\n 'position',\n 'inset',\n 'right',\n 'bottom',\n 'margin',\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n 'top',\n 'left',\n 'width',\n 'height',\n 'max-width',\n 'max-height',\n];\n\n/** Remove what liftWindow wrote (no animation). */\nexport function unplaceWindow(surface: HTMLElement) {\n surface.classList.remove('is-floating');\n for (const name of PLACED) surface.style.removeProperty(name);\n}\n\n/** Put a floating surface back in its place, travelling from where it floated. */\nexport function dockWindow(surface: HTMLElement, from: Rect) {\n registerMotion();\n unplaceWindow(surface);\n if (reduced()) return;\n const to = rectOf(surface);\n gsap.from(surface, { x: from.left - to.left, y: from.top - to.top, duration: TIMING.float.shadow, ease: EASE.signature, clearProps: 'transform' });\n}\n\nexport interface FloatingOptions {\n key: string;\n handle: HTMLElement;\n corners?: HTMLElement[];\n isFloating: () => boolean;\n float: () => void;\n dock: () => void;\n}\n\n/** Move a floating surface by its handle and resize it from its corners. Returns the detach function. */\nexport function attachFloating(surface: HTMLElement, { key, handle, corners = [], isFloating, float, dock }: FloatingOptions) {\n const cleanups: Array<() => void> = [];\n const listen = (element: HTMLElement, listener: (event: PointerEvent) => void) => {\n element.addEventListener('pointerdown', listener);\n cleanups.push(() => element.removeEventListener('pointerdown', listener));\n };\n let active: number | null = null;\n let release: (() => void) | null = null;\n /**\n * Follow one pointer until it is released. Moves and the release are heard on\n * the window, not only through pointer capture: the window moves under the\n * pointer, and where capture does not hold the gesture must still end.\n */\n const capture = (element: HTMLElement, down: PointerEvent, { onMove, onUp }: { onMove: (event: PointerEvent) => void; onUp: () => void }) => {\n release?.();\n active = down.pointerId;\n try {\n element.setPointerCapture?.(down.pointerId);\n } catch {\n // The window listeners below still follow the pointer.\n }\n const move = (event: PointerEvent) => {\n if (event.pointerId === active) onMove(event);\n };\n const up = (event: PointerEvent) => {\n if (event.pointerId !== active) return;\n stop();\n onUp();\n };\n const stop = () => {\n active = null;\n release = null;\n window.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n window.removeEventListener('pointercancel', up);\n };\n release = stop;\n window.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n window.addEventListener('pointercancel', up);\n };\n cleanups.push(() => release?.());\n\n type Body = {\n x: number;\n y: number;\n vx: number;\n vy: number;\n w: number;\n h: number;\n targetX: number;\n targetY: number;\n targetW: number;\n targetH: number;\n mass: number;\n time: number;\n gliding: boolean;\n fromX: number;\n fromY: number;\n pointerVx: number;\n pointerVy: number;\n pointerX: number;\n pointerY: number;\n pointerTime: number;\n };\n let body: Body | null = null;\n const settle = () => {\n if (!body) return;\n gsap.ticker.remove(tick);\n body = null;\n };\n function tick() {\n if (!body) return;\n const now = performance.now();\n const elapsed = Math.min((now - body.time) / 1000, 1 / 30);\n if (elapsed <= 0) return;\n body.time = now;\n if (body.gliding) {\n const decay = Math.exp(-elapsed / TIMING.float.glideDecay);\n body.vx *= decay;\n body.vy *= decay;\n } else {\n body.vx += (((body.targetX - body.x) * SPRING.stiffness - body.vx * SPRING.damping) * elapsed) / body.mass;\n body.vy += (((body.targetY - body.y) * SPRING.stiffness - body.vy * SPRING.damping) * elapsed) / body.mass;\n }\n body.x += body.vx * elapsed;\n body.y += body.vy * elapsed;\n const smoothing = 1 - Math.exp(-elapsed / TIMING.float.sizeSmoothing);\n body.w += (body.targetW - body.w) * smoothing;\n body.h += (body.targetH - body.h) * smoothing;\n if (Math.abs(body.targetW - body.w) < 0.5) body.w = body.targetW;\n if (Math.abs(body.targetH - body.h) < 0.5) body.h = body.targetH;\n const rect = clampRect({ top: body.y, left: body.x, width: body.w, height: body.h });\n if (rect.left !== body.x) {\n body.x = rect.left;\n body.vx = 0;\n }\n if (rect.top !== body.y) {\n body.y = rect.top;\n body.vy = 0;\n }\n place(surface, rect);\n const resting = Math.hypot(body.vx, body.vy) < REST_SPEED && body.w === body.targetW && body.h === body.targetH;\n if (body.gliding && resting) {\n saveFloat(key, rect);\n settle();\n }\n }\n\n listen(handle, (down) => {\n if (down.button !== 0 || active !== null || !floatingAvailable()) return;\n down.preventDefault();\n settle();\n let moved = false;\n capture(handle, down, {\n onMove(event) {\n const dx = event.clientX - down.clientX;\n const dy = event.clientY - down.clientY;\n if (!moved) {\n if (Math.abs(dx) < LIFT && Math.abs(dy) < LIFT) return;\n moved = true;\n if (!isFloating()) float();\n const rect = rectOf(surface);\n const fullWidth = innerWidth - MARGIN * 2;\n const fullHeight = innerHeight - MARGIN * 2;\n // A window as large as the screen shrinks so it can be moved.\n const width = rect.width >= fullWidth - 2 ? Math.max(MIN_WIDTH, Math.round(fullWidth * SHRINK_FULL)) : rect.width;\n const height = rect.height >= fullHeight - 2 ? Math.max(MIN_HEIGHT, Math.round(fullHeight * SHRINK_FULL)) : rect.height;\n const grip = rect.width > 0 ? (down.clientX - rect.left) / rect.width : 0;\n const left = rect.left + (rect.width - width) * grip;\n const now = performance.now();\n body = {\n x: left,\n y: rect.top,\n vx: 0,\n vy: 0,\n w: rect.width,\n h: rect.height,\n targetX: left,\n targetY: rect.top,\n targetW: width,\n targetH: height,\n mass: Math.min(MAX_MASS, Math.max(1, Math.sqrt((rect.width * rect.height) / MASS_AREA))),\n time: now,\n gliding: false,\n fromX: left,\n fromY: rect.top,\n pointerVx: 0,\n pointerVy: 0,\n pointerX: event.clientX,\n pointerY: event.clientY,\n pointerTime: now,\n };\n gsap.ticker.add(tick);\n }\n if (!body) return;\n body.targetX = body.fromX + dx;\n body.targetY = body.fromY + dy;\n const now = performance.now();\n const seconds = Math.max(1, now - body.pointerTime) / 1000;\n const smoothing = 1 - Math.exp(-seconds / POINTER_SMOOTHING);\n body.pointerVx += ((event.clientX - body.pointerX) / seconds - body.pointerVx) * smoothing;\n body.pointerVy += ((event.clientY - body.pointerY) / seconds - body.pointerVy) * smoothing;\n body.pointerX = event.clientX;\n body.pointerY = event.clientY;\n body.pointerTime = now;\n },\n onUp() {\n if (!moved) {\n if (isFloating()) dock();\n else float();\n return;\n }\n if (!body) return;\n // A fling keeps gliding; a gentle release stays where it is.\n const speed = performance.now() - body.pointerTime > 80 ? 0 : Math.hypot(body.pointerVx, body.pointerVy);\n if (speed >= FLING_SPEED) {\n body.vx = body.pointerVx;\n body.vy = body.pointerVy;\n } else {\n body.vx = 0;\n body.vy = 0;\n body.targetX = body.x;\n body.targetY = body.y;\n }\n body.gliding = true;\n },\n });\n });\n\n for (const corner of corners) {\n listen(corner, (down) => {\n if (down.button !== 0 || active !== null || !floatingAvailable()) return;\n down.preventDefault();\n settle();\n const side = corner.dataset.mkFloatCorner ?? 'br';\n const fromLeft = side.endsWith('l');\n const fromTop = side.startsWith('t');\n let start: Rect | null = null;\n capture(corner, down, {\n onMove(event) {\n const dx = event.clientX - down.clientX;\n const dy = event.clientY - down.clientY;\n if (!start) {\n if (Math.abs(dx) < LIFT && Math.abs(dy) < LIFT) return;\n if (!isFloating()) float();\n start = rectOf(surface);\n }\n const width = Math.min(innerWidth - MARGIN * 2, Math.max(MIN_WIDTH, fromLeft ? start.width - dx : start.width + dx));\n const height = Math.min(innerHeight - MARGIN * 2, Math.max(MIN_HEIGHT, fromTop ? start.height - dy : start.height + dy));\n place(\n surface,\n clampRect({\n top: fromTop ? start.top + start.height - height : start.top,\n left: fromLeft ? start.left + start.width - width : start.left,\n width,\n height,\n }),\n );\n },\n onUp() {\n if (start) saveFloat(key, rectOf(surface));\n },\n });\n });\n }\n\n return () => {\n if (body?.gliding) saveFloat(key, rectOf(surface));\n settle();\n for (const cleanup of cleanups) cleanup();\n };\n}\n","import { SIGNATURE_LINEAR } from '../core/curves';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\n\n/*\n * Helpers shared by surfaces (dialogs, menus): opening a <dialog> with a\n * fallback where showModal is missing, the backdrop tint, and an inert visual\n * copy (ghost) that plays a close while the real element is already gone.\n */\n\n/** A computed colour with no alpha: `transparent`, `rgba(…, 0)` or `color(… / 0)`. */\nexport const transparentColor = (color: string) =>\n !color || color === 'transparent' || /,\\s*0\\)$/.test(color) || /\\/\\s*0\\)$/.test(color);\n\ntype DialogLike = HTMLElement & Partial<Pick<HTMLDialogElement, 'showModal' | 'show' | 'close'>>;\n\n/** Open a <dialog> modally (or not). Falls back to the `open` attribute. */\nexport function openModal(dialog: DialogLike, modal = true) {\n if (dialog.hasAttribute('open')) return;\n if (modal && typeof dialog.showModal === 'function') dialog.showModal();\n else if (typeof dialog.show === 'function') dialog.show();\n else dialog.setAttribute('open', '');\n}\n\nexport function closeModal(dialog: DialogLike) {\n if (typeof dialog.close === 'function') dialog.close();\n else dialog.removeAttribute('open');\n}\n\n/**\n * Fade a modal <dialog>'s ::backdrop in (Stepbro's tint: 0.5 s on the signature\n * curve) or out (linear). Resolves at once without the Web Animations API.\n */\nexport function fadeBackdrop(dialog: HTMLElement, direction: 'in' | 'out'): Promise<void> {\n if (typeof dialog.animate !== 'function' || reduced()) return Promise.resolve();\n try {\n const animation = dialog.animate(direction === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }], {\n duration: (direction === 'in' ? TIMING.dialog.backdrop : TIMING.dialog.close) * 1000,\n easing: direction === 'in' ? SIGNATURE_LINEAR : 'linear',\n fill: direction === 'out' ? 'forwards' : 'none',\n pseudoElement: '::backdrop',\n });\n return animation.finished.then(\n () => undefined,\n () => undefined,\n );\n } catch {\n return Promise.resolve();\n }\n}\n\n/**\n * An inert visual copy of `surface`, fixed over the place it occupies now and not\n * yet in the document (null when it has no size). A picture, not a second form:\n * no ids, labels, names or roles to collide with the page.\n */\n/** A fixed copy of a modal's backdrop (tint and blur), for a closing ghost to fade with. Not appended. */\nexport function backdropVeil(surface: HTMLElement): HTMLElement {\n const backdrop = getComputedStyle(surface, '::backdrop');\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n veil.dataset.mkVeil = '';\n Object.assign(veil.style, {\n position: 'fixed',\n inset: '0',\n zIndex: '2147483645',\n background: backdrop.background || backdrop.backgroundColor,\n backdropFilter: backdrop.backdropFilter,\n pointerEvents: 'none',\n });\n return veil;\n}\n\nexport function ghostOf(surface: HTMLElement): HTMLElement | null {\n const rect = surface.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n const style = getComputedStyle(surface);\n const ghost = document.createElement('div');\n ghost.className = surface.className;\n ghost.innerHTML = surface.innerHTML;\n ghost.setAttribute('aria-hidden', 'true');\n ghost.inert = true;\n ghost.dataset.mkGhost = '';\n const strip = ['id', 'for', 'name', 'aria-labelledby', 'aria-describedby', 'aria-label', 'role'];\n for (const element of ghost.querySelectorAll(strip.map((name) => `[${name}]`).join(','))) {\n for (const name of strip) element.removeAttribute(name);\n }\n for (const label of ghost.querySelectorAll('label')) {\n const span = document.createElement('span');\n span.className = label.className;\n span.append(...label.childNodes);\n label.replaceWith(span);\n }\n Object.assign(ghost.style, {\n position: 'fixed',\n inset: 'auto',\n left: `${rect.left}px`,\n top: `${rect.top}px`,\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n margin: '0',\n display: style.display === 'none' ? 'flex' : style.display,\n flexDirection: style.flexDirection,\n zIndex: '2147483646',\n pointerEvents: 'none',\n });\n return ghost;\n}\n","import { gsap } from '../core/gsap';\nimport { bezier, channels, easeOut, eased, spring } from '../core/channels';\nimport { TIMING } from '../core/timing';\nimport { transparentColor } from './surface';\n\n/*\n * Stepbro's liquid modal (ported from Kayro): the opener's colour melts into the\n * surface. Two blobs (one on the opener, one with the surface's shape) sit under\n * a \"goo\" filter (blur 20, alpha threshold 19·a − 9), so while the surface's\n * blob swings out of the opener on a spring (144/14, kick 2400 px/s) they\n * stretch and merge like a liquid; the content zooms in from twice its size.\n * Each property runs on its own channel, as in the source.\n */\n\nconst GOO = 'mk-liquid-goo';\n\n/** The goo filter, added to the page once. */\nfunction ensureGoo() {\n if (document.getElementById(GOO)) return;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('width', '0');\n svg.setAttribute('height', '0');\n svg.style.position = 'absolute';\n svg.innerHTML = `<defs><filter id=\"${GOO}\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\"><feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"20\"/><feColorMatrix type=\"matrix\" values=\"1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 19 -9\"/></filter></defs>`;\n document.body.append(svg);\n}\n\ninterface Box {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** A layer under the surface's content, in viewport coordinates, holding the blobs. */\nfunction gooLayer(surface: HTMLElement) {\n ensureGoo();\n const box = surface.getBoundingClientRect();\n const layer = document.createElement('div');\n layer.className = 'mk-morph-face mk-liquid';\n layer.setAttribute('aria-hidden', 'true');\n Object.assign(layer.style, {\n position: 'absolute',\n left: `${-box.left - surface.clientLeft}px`,\n top: `${-box.top - surface.clientTop}px`,\n width: `${innerWidth}px`,\n height: `${innerHeight}px`,\n zIndex: '-1',\n pointerEvents: 'none',\n filter: `url(#${GOO})`,\n borderRadius: '0',\n background: 'none',\n });\n const blob = (from: Box, radius: number, color: string) => {\n const element = document.createElement('div');\n Object.assign(element.style, {\n position: 'absolute',\n top: `${from.top}px`,\n left: `${from.left}px`,\n width: `${from.width}px`,\n height: `${from.height}px`,\n borderRadius: `${radius}px`,\n background: color,\n });\n layer.append(element);\n return element;\n };\n surface.append(layer);\n return { layer, blob };\n}\n\n/** The surface turns into a frame while its blob is the visible shape. */\nfunction hideFrame(surface: HTMLElement) {\n const saved = surface.getAttribute('style');\n Object.assign(surface.style, {\n transition: 'none',\n background: 'transparent',\n boxShadow: 'none',\n borderColor: 'transparent',\n overflow: 'visible',\n });\n return () => {\n if (saved === null) surface.removeAttribute('style');\n else surface.setAttribute('style', saved);\n };\n}\n\nconst radiusOf = (element: HTMLElement, box: DOMRect) =>\n Math.min(parseFloat(getComputedStyle(element).borderTopLeftRadius) || 0, box.width / 2, box.height / 2);\n\n/** Content parts move and zoom about the surface's centre. */\nfunction centerParts(surface: HTMLElement, parts: HTMLElement[]) {\n const box = surface.getBoundingClientRect();\n const centerX = box.left + box.width / 2;\n const centerY = box.top + box.height / 2;\n for (const part of parts) {\n const own = part.getBoundingClientRect();\n gsap.set(part, { transformOrigin: `${centerX - own.left}px ${centerY - own.top}px` });\n }\n return { centerX, centerY };\n}\n\ntype Frame = { top: number; left: number; width: number; height: number; scale: number; blur: number };\n\n/** Open `surface` out of `origin` the liquid way. Returns a function that stops it and settles the surface. */\nexport function liquidOpen(surface: HTMLElement, origin: HTMLElement, parts: HTMLElement[]) {\n const box = surface.getBoundingClientRect();\n const start = origin.getBoundingClientRect();\n const surfaceColor = getComputedStyle(surface).backgroundColor;\n const originLook = getComputedStyle(origin).backgroundColor;\n const originColor = transparentColor(originLook) ? surfaceColor : originLook;\n const endRadius = radiusOf(surface, box);\n const startRadius = radiusOf(origin, start);\n const { centerX, centerY } = centerParts(surface, parts);\n const restore = hideFrame(surface);\n const { layer, blob } = gooLayer(surface);\n const originBlob = blob(start, startRadius, originColor);\n const shape = blob(start, startRadius, originColor);\n const towardX = start.left + start.width / 2 < innerWidth / 2 ? 1 : -1;\n const towardY = start.top + start.height / 2 < innerHeight / 2 ? 1 : -1;\n if (parts.length) gsap.set(parts, { opacity: 0 });\n const current: Frame = { top: start.top, left: start.left, width: start.width, height: start.height, scale: 2, blur: 8 };\n const paint = () => {\n if (!parts.length) return;\n gsap.set(parts, {\n x: current.left + current.width / 2 - centerX,\n y: current.top + current.height / 2 - centerY,\n scale: current.scale,\n filter: `blur(${current.blur}px)`,\n });\n };\n const motion = channels({ ...current, radius: startRadius }, (name, value) => {\n if (name === 'radius') shape.style.borderRadius = `${value}px`;\n else {\n current[name] = value;\n if (name === 'top' || name === 'left' || name === 'width' || name === 'height') shape.style[name] = `${value}px`;\n paint();\n }\n });\n const L = TIMING.liquid;\n void motion.animate(\n { top: box.top, left: box.left, width: box.width, height: box.height, radius: endRadius, scale: 1, blur: 0 },\n {\n top: spring(144, 14, { velocity: 2400, direction: towardY }),\n left: spring(144, 14, { velocity: 2400, direction: towardX }),\n width: eased(L.size, bezier(0.8, 0.3, 0.5, 0.8)),\n height: eased(L.size, bezier(0.8, 0.3, 0.5, 0.8)),\n radius: eased(L.radius, easeOut),\n scale: eased(L.content, easeOut),\n blur: eased(L.content, easeOut),\n },\n );\n gsap.to(shape, { background: surfaceColor, duration: L.color, delay: L.colorDelay, ease: 'power2.out' });\n if (parts.length) gsap.to(parts, { opacity: 1, duration: L.color, delay: L.colorDelay, ease: 'power2.out' });\n gsap.to(originBlob, { opacity: 0, duration: L.ghost, delay: L.ghostDelay, ease: 'power2.out' });\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n motion.stop();\n clearTimeout(timer);\n layer.remove();\n restore();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter' });\n };\n // The springs settle well within the source's 1.1 s window.\n const timer = setTimeout(finish, L.safetyMs);\n return finish;\n}\n\n/** Close `surface` back into `origin` the liquid way, then call `onComplete`. */\nexport function liquidClose(surface: HTMLElement, origin: HTMLElement, parts: HTMLElement[], onComplete: () => void) {\n const box = surface.getBoundingClientRect();\n const end = origin.getBoundingClientRect();\n const surfaceColor = getComputedStyle(surface).backgroundColor;\n const originLook = getComputedStyle(origin).backgroundColor;\n const originColor = transparentColor(originLook) ? surfaceColor : originLook;\n const startRadius = radiusOf(surface, box);\n const endRadius = radiusOf(origin, end);\n const { centerX, centerY } = centerParts(surface, parts);\n hideFrame(surface);\n const { blob } = gooLayer(surface);\n const originBlob = blob(end, endRadius, originColor);\n originBlob.style.opacity = '0';\n const shape = blob(box, startRadius, surfaceColor);\n const current: Frame = { top: box.top, left: box.left, width: box.width, height: box.height, scale: 1, blur: 0 };\n const motion = channels({ ...current, radius: startRadius, opacity: 1 }, (name, value) => {\n if (name === 'radius') shape.style.borderRadius = `${value}px`;\n else if (name === 'opacity') {\n if (parts.length) gsap.set(parts, { opacity: value });\n } else {\n current[name] = value;\n if (name === 'top' || name === 'left' || name === 'width' || name === 'height') shape.style[name] = `${value}px`;\n if (parts.length) {\n gsap.set(parts, {\n x: current.left + current.width / 2 - centerX,\n y: current.top + current.height / 2 - centerY,\n scale: current.scale,\n filter: `blur(${current.blur}px)`,\n });\n }\n }\n });\n const L = TIMING.liquid;\n void motion.animate(\n { top: end.top, left: end.left, width: end.width, height: end.height, radius: endRadius, scale: 2, blur: 8, opacity: 0 },\n {\n top: spring(130, 18),\n left: spring(130, 18),\n width: eased(L.closeSize, easeOut),\n height: eased(L.closeSize, easeOut),\n // It rounds into the opener's shape early, long before it arrives.\n radius: eased(L.closeSize, easeOut),\n scale: eased(L.closeContent, easeOut),\n blur: eased(L.closeContent, easeOut),\n opacity: spring(137, 20),\n },\n );\n gsap.to(originBlob, { opacity: 1, duration: L.originRestore, delay: 0.15, ease: 'power2.in' });\n gsap.to(shape, { background: originColor, duration: L.originRestore, ease: 'power2.out' });\n gsap.to(surface, { opacity: 0, duration: TIMING.dialog.close, ease: 'power3.in' });\n setTimeout(() => {\n motion.stop();\n onComplete();\n }, L.safetyMs);\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { reduced } from '../core/reduced';\nimport { TIMING } from '../core/timing';\nimport { MORPH_STYLES, clearStyles } from '../core/styles';\nimport { liquidClose, liquidOpen } from './liquid';\nimport { backdropVeil, ghostOf, transparentColor } from './surface';\n\n/*\n * Container transform after Stepbro's ModalHost (ported from Kayro): a surface\n * (dialog, menu, option list) grows out of the control that opened it and folds\n * back into it. The surface itself is never scaled: it starts clipped to the\n * opener's size and corners, moved onto the opener, and widens to its own box\n * while the opener's colour fades into its own. A dialog's content travels as\n * one group, scaled from the opener's box to its own while it sharpens and\n * fades in. `data-mk-shared=\"id\"` pieces (a title) fly between opener and surface.\n */\n\nconst FACE = 'mk-morph-face';\nconst HIDDEN_ORIGIN = 'data-mk-morph-origin';\nconst SHARED = 'data-mk-shared';\nconst SHARED_HIDDEN = 'data-mk-shared-hidden';\n\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n\n/** A computed radius in pixels (percentages resolve against `size`). */\nconst radiusOf = (value: string, size: number) => {\n const parsed = Number.parseFloat(value) || 0;\n return value.trim().endsWith('%') ? (parsed / 100) * size : parsed;\n};\n\ninterface Shape {\n /** Offset that puts the clipped area on the opener. */\n x: number;\n y: number;\n /** Clip at the opener's size, and the full surface. */\n from: string;\n to: string;\n /** The clipped area in the surface's own coordinates. */\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Where the surface starts: the area of the opener's size nearest to it inside\n * the surface, and the offset that moves that area onto the opener. Null when\n * the opener is gone, tiny or off screen.\n */\nfunction shapeOf(surface: HTMLElement, origin: HTMLElement | null): Shape | null {\n if (!origin?.isConnected) return null;\n const start = origin.getBoundingClientRect();\n const box = surface.getBoundingClientRect();\n if (start.width < 4 || start.height < 4 || !box.width || !box.height) return null;\n if (start.bottom < 0 || start.top > innerHeight || start.right < 0 || start.left > innerWidth) return null;\n const width = Math.min(start.width, box.width);\n const height = Math.min(start.height, box.height);\n const left = clamp(start.left - box.left, 0, box.width - width);\n const top = clamp(start.top - box.top, 0, box.height - height);\n const corner = Math.min(radiusOf(getComputedStyle(origin).borderTopLeftRadius, start.height), width / 2, height / 2);\n const radius = radiusOf(getComputedStyle(surface).borderTopLeftRadius, box.height);\n return {\n x: start.left + (start.width - width) / 2 - (box.left + left),\n y: start.top + (start.height - height) / 2 - (box.top + top),\n from: `inset(${top}px ${box.width - left - width}px ${box.height - top - height}px ${left}px round ${corner}px)`,\n to: `inset(0px 0px 0px 0px round ${radius}px)`,\n left,\n top,\n width,\n height,\n };\n}\n\n/** Properties that make a copy look like the opener wherever it is placed. */\nconst LOOK = [\n 'display',\n 'alignItems',\n 'justifyContent',\n 'gap',\n 'padding',\n 'borderRadius',\n 'borderWidth',\n 'borderStyle',\n 'borderColor',\n 'backgroundColor',\n 'color',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'lineHeight',\n 'letterSpacing',\n 'whiteSpace',\n] as const;\n\n/**\n * A layer over the surface that looks like the opener: its colour fills the\n * surface and, for lists, a copy of its label sits where it was. Fading it out\n * turns the opener into the surface.\n */\nfunction faceOf(surface: HTMLElement, origin: HTMLElement, shape: Shape, withCopy: boolean) {\n const look = getComputedStyle(origin);\n const face = document.createElement('div');\n face.className = FACE;\n face.setAttribute('aria-hidden', 'true');\n face.inert = true;\n if (!transparentColor(look.backgroundColor)) face.style.background = look.backgroundColor;\n surface.append(face);\n if (!withCopy) return { face, copy: null as HTMLElement | null };\n const copy = document.createElement('span');\n copy.innerHTML = origin.innerHTML;\n for (const element of copy.querySelectorAll('[id], [name], [for]')) for (const name of ['id', 'name', 'for']) element.removeAttribute(name);\n for (const property of LOOK) copy.style[property] = look[property];\n Object.assign(copy.style, {\n position: 'absolute',\n left: `${shape.left}px`,\n top: `${shape.top}px`,\n width: `${shape.width}px`,\n height: `${shape.height}px`,\n boxSizing: 'border-box',\n margin: '0',\n overflow: 'hidden',\n });\n face.append(copy);\n return { face, copy };\n}\n\n/** The morph each surface is playing, so a new one stops it first. */\nconst running = new WeakMap<HTMLElement, gsap.core.Animation>();\n\n/** Whether a surface is opening or closing right now. */\nexport const isMorphing = (surface: HTMLElement) => running.has(surface);\n\nfunction stop(surface: HTMLElement) {\n running.get(surface)?.kill();\n running.delete(surface);\n gsap.killTweensOf(surface);\n for (const face of surface.querySelectorAll(`:scope > .${FACE}`)) face.remove();\n clearStyles([surface], MORPH_STYLES);\n}\n\n/** Stop a surface's morph now and put the surface and its content back to rest. */\nexport function stopMorph(surface: HTMLElement) {\n stop(surface);\n const parts = [...surface.querySelectorAll<HTMLElement>(':scope > *')].filter((element) => !element.classList.contains('mk-liquid'));\n gsap.killTweensOf(parts);\n clearStyles(parts, MORPH_STYLES);\n}\n\n/** Small controls disappear into the surface they open, like a shared element. */\nconst compact = (element: HTMLElement) => {\n const box = element.getBoundingClientRect();\n return box.width <= 360 && box.height <= 72;\n};\n\n/** Show a hidden opener again; with `fade` it comes back while its surface closes (0.3 s after 0.2 s). */\nexport function showOrigin(origin: HTMLElement | null | undefined, { fade = false }: { fade?: boolean } = {}) {\n if (!origin?.hasAttribute(HIDDEN_ORIGIN)) return;\n if (!fade || reduced()) {\n origin.removeAttribute(HIDDEN_ORIGIN);\n return;\n }\n const previous = origin.style.transition;\n const { originShow, originShowDelay } = TIMING.dialog;\n origin.style.transition = `opacity ${originShow}s cubic-bezier(0.215, 0.61, 0.355, 1) ${originShowDelay}s`;\n origin.removeAttribute(HIDDEN_ORIGIN);\n setTimeout(() => {\n origin.style.transition = previous;\n }, (originShow + originShowDelay) * 1000 + 50);\n}\n\n/** Scale and offset that fit the content, as one group, into the opener's box inside the surface. */\nfunction groupOf(surface: HTMLElement, parts: HTMLElement[], shape: Shape) {\n const box = surface.getBoundingClientRect();\n for (const part of parts) {\n const own = part.getBoundingClientRect();\n gsap.set(part, { transformOrigin: `${box.left - own.left}px ${box.top - own.top}px` });\n }\n return {\n x: shape.left,\n y: shape.top,\n scaleX: box.width ? shape.width / box.width : 1,\n scaleY: box.height ? shape.height / box.height : 1,\n };\n}\n\nconst escape = (value: string) => (typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(value) : value.replace(/\"/g, '\\\\\"'));\n\nfunction sharedPairs(origin: HTMLElement, surface: HTMLElement) {\n return [origin, ...origin.querySelectorAll<HTMLElement>(`[${SHARED}]`)]\n .filter((source) => source.hasAttribute(SHARED))\n .map((source) => ({\n source,\n target: surface.querySelector<HTMLElement>(`[${SHARED}=\"${escape(source.getAttribute(SHARED) ?? '')}\"]`),\n }))\n .filter((pair): pair is { source: HTMLElement; target: HTMLElement } => pair.target !== null);\n}\n\n/** Where an element's text sits: its box without padding and border. */\nfunction textBox(element: HTMLElement) {\n const box = element.getBoundingClientRect();\n const style = getComputedStyle(element);\n const px = (value: string) => parseFloat(value) || 0;\n const left = box.left + px(style.borderLeftWidth) + px(style.paddingLeft);\n const top = box.top + px(style.borderTopWidth) + px(style.paddingTop);\n const bottom = box.bottom - px(style.borderBottomWidth) - px(style.paddingBottom);\n return { left, top, height: Math.max(0, bottom - top), style };\n}\n\nconst textOf = (element: HTMLElement) =>\n element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement\n ? element.value || element.placeholder\n : (element.firstChild?.textContent ?? element.textContent ?? '');\n\n/** Fly a copy of `from`'s text onto `to` (place, size, colour) in the top layer. Resolves when it lands. */\nfunction flyText(from: HTMLElement, to: HTMLElement, text: string, duration: number) {\n return new Promise<void>((resolve) => {\n const start = textBox(from);\n const end = textBox(to);\n const fromSize = parseFloat(start.style.fontSize) || 16;\n const toSize = parseFloat(end.style.fontSize) || fromSize;\n const scale = toSize / fromSize;\n const ghost = document.createElement('div');\n ghost.setAttribute('aria-hidden', 'true');\n ghost.setAttribute('popover', 'manual');\n ghost.textContent = text;\n Object.assign(ghost.style, {\n position: 'fixed',\n inset: 'auto',\n left: `${start.left}px`,\n top: `${start.top}px`,\n margin: '0',\n padding: '0',\n border: '0',\n background: 'transparent',\n overflow: 'visible',\n whiteSpace: 'nowrap',\n pointerEvents: 'none',\n fontFamily: start.style.fontFamily,\n fontSize: start.style.fontSize,\n fontWeight: start.style.fontWeight,\n lineHeight: `${start.height || fromSize * 1.2}px`,\n letterSpacing: start.style.letterSpacing,\n color: start.style.color,\n transformOrigin: '0 0',\n });\n document.body.append(ghost);\n if (typeof ghost.showPopover === 'function') ghost.showPopover();\n const height = (start.height || fromSize * 1.2) * scale;\n gsap.to(ghost, {\n x: end.left - start.left,\n y: end.top + end.height / 2 - height / 2 - start.top,\n scale,\n color: end.style.color,\n duration,\n ease: EASE.signature,\n onComplete: () => {\n ghost.remove();\n resolve();\n },\n });\n });\n}\n\n/** Show the opener's shared pieces again (a surface closed without its animation). */\nexport function releaseShared(origin: HTMLElement | null | undefined) {\n if (!origin) return;\n for (const element of [origin, ...origin.querySelectorAll(`[${SHARED_HIDDEN}]`)]) element.removeAttribute(SHARED_HIDDEN);\n}\n\n/** The opener's pieces travel into the surface; they stay hidden at home until it closes. */\nexport function shareInto(origin: HTMLElement, surface: HTMLElement, duration: number = TIMING.dialog.open) {\n for (const { source, target } of sharedPairs(origin, surface)) {\n const text = textOf(source);\n source.setAttribute(SHARED_HIDDEN, '');\n gsap.set(target, { opacity: 0 });\n void flyText(source, target, text, duration).then(() => gsap.set(target, { clearProps: 'opacity' }));\n }\n}\n\n/** The surface's pieces travel back home and show there again. */\nexport function shareBack(surface: HTMLElement, origin: HTMLElement, duration: number = TIMING.dialog.close) {\n for (const { source, target } of sharedPairs(origin, surface)) {\n gsap.set(target, { opacity: 0 });\n void flyText(target, source, textOf(source), duration).then(() => source.removeAttribute(SHARED_HIDDEN));\n }\n}\n\nexport interface MorphOpenOptions {\n duration?: number;\n /** Keep a compact opener hidden while the surface is open; call showOrigin when it closes. */\n hideOrigin?: boolean;\n /** What enters inside the surface (selector); by default its children. */\n content?: string;\n /** Delay between content parts: an option list cascades instead of growing as one. */\n stagger?: number;\n liquid?: boolean;\n}\n\nconst partsOf = (surface: HTMLElement, content: string | undefined) =>\n [...surface.querySelectorAll<HTMLElement>(content ?? ':scope > *')].filter(\n (element) => !element.classList.contains(FACE) && !element.classList.contains('mk-liquid'),\n );\n\n/**\n * Open `surface` out of `origin`. Returns the timeline (null when reduced).\n * Shape travels from the opener (0.7 s, signature) and takes the surface's\n * colour over the first 0.3 s; the content grows from the opener's box out of\n * an 8 px blur on the same curve. Without an opener on screen: scale .92 → 1, 0.35 s.\n */\nexport function morphOpen(surface: HTMLElement, origin: HTMLElement | null, options: MorphOpenOptions = {}) {\n registerMotion();\n const { duration = TIMING.dialog.open, hideOrigin = false, content, stagger = 0, liquid = false } = options;\n stop(surface);\n if (reduced()) return null;\n const parts = partsOf(surface, content);\n if (liquid && !stagger && origin && shapeOf(surface, origin)) {\n if (hideOrigin && compact(origin)) origin.setAttribute(HIDDEN_ORIGIN, '');\n const settle = liquidOpen(surface, origin, parts);\n const window = gsap.timeline({\n onComplete: () => {\n settle();\n running.delete(surface);\n },\n onInterrupt: settle,\n });\n window.to({}, { duration: TIMING.liquid.safetyMs / 1000 });\n running.set(surface, window);\n return window;\n }\n const enter = stagger\n ? { opacity: 1, y: 0, duration: TIMING.dialog.list, ease: 'power2.out', stagger, clearProps: 'opacity,transform' }\n : { opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature, clearProps: 'opacity,filter' };\n const enterFrom = stagger ? { opacity: 0, y: -6 } : { opacity: 0, filter: 'blur(8px)' };\n const shape = shapeOf(surface, origin);\n if (!shape || !origin) {\n const rise = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n },\n })\n .fromTo(\n surface,\n { opacity: 0, scale: 0.92 },\n { opacity: 1, scale: 1, duration: TIMING.dialog.fallback, ease: 'power2.out', clearProps: 'opacity,transform' },\n );\n if (parts.length) rise.fromTo(parts, enterFrom, { ...enter, duration: Math.min(enter.duration, TIMING.dialog.fallback) }, 0);\n running.set(surface, rise);\n return rise;\n }\n const list = Boolean(stagger);\n if (!list) shareInto(origin, surface, duration);\n const { face, copy } = faceOf(surface, origin, shape, list);\n const group = list ? null : groupOf(surface, parts, shape);\n if (hideOrigin && compact(origin)) origin.setAttribute(HIDDEN_ORIGIN, '');\n const finish = () => {\n face.remove();\n running.delete(surface);\n gsap.set(surface, { clearProps: 'transform,clipPath,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter' });\n };\n const timeline = gsap\n .timeline({ onComplete: finish, onInterrupt: finish })\n .fromTo(\n surface,\n { x: shape.x, y: shape.y, clipPath: shape.from, willChange: 'transform,clip-path' },\n { x: 0, y: 0, clipPath: shape.to, duration, ease: EASE.signature },\n 0,\n )\n // The opener's colour hands over early, so a light button never flashes over a dark form.\n .to(face, { opacity: 0, duration: TIMING.dialog.surfaceColor, ease: EASE.signature }, 0);\n if (copy) timeline.to(copy, { opacity: 0, duration: 0.25, ease: 'power2.out' }, 0.05);\n if (parts.length) {\n if (group) {\n timeline.fromTo(\n parts,\n { ...group, opacity: 0, filter: 'blur(8px)' },\n { x: 0, y: 0, scaleX: 1, scaleY: 1, opacity: 1, filter: 'blur(0px)', duration, ease: EASE.signature },\n 0,\n );\n } else timeline.fromTo(parts, enterFrom, enter, duration * 0.2);\n }\n running.set(surface, timeline);\n return timeline;\n}\n\nexport interface MorphCloseOptions {\n duration?: number;\n content?: string;\n liquid?: boolean;\n}\n\n/**\n * Fold `surface` back into `origin`, then call `onComplete` (which hides it).\n * Without an opener on screen it closes in place: 90 % scale, 32 px blur.\n */\nexport function morphClose(surface: HTMLElement, origin: HTMLElement | null, onComplete: () => void, options: MorphCloseOptions = {}) {\n registerMotion();\n const { duration = TIMING.dialog.close, content, liquid = false } = options;\n stop(surface);\n if (reduced()) {\n onComplete();\n return null;\n }\n const parts = partsOf(surface, content);\n const shape = shapeOf(surface, origin);\n if (!shape || !origin) {\n const fade = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n gsap.set(surface, { clearProps: 'opacity,transform' });\n if (parts.length) gsap.set(parts, { clearProps: 'filter' });\n },\n })\n .to(surface, { scale: 0.9, duration, ease: EASE.signature }, 0)\n .to(surface, { opacity: 0, duration, ease: EASE.fadeAway }, 0);\n if (parts.length) fade.to(parts, { filter: 'blur(32px)', duration, ease: EASE.blurAway }, 0);\n running.set(surface, fade);\n return fade;\n }\n const list = content !== undefined;\n if (liquid && !list) {\n liquidClose(surface, origin, parts, onComplete);\n return null;\n }\n const { face, copy } = faceOf(surface, origin, shape, list);\n gsap.set(copy ? [face, copy] : face, { opacity: 0 });\n if (!list) {\n // The shape folds back into the opener and takes its colour (0.5 s); the\n // content heads for the opener on a 2 s path while it fades and blurs away\n // within the 0.5 s, and the surface fades out (power3.in).\n shareBack(surface, origin, duration);\n const group = groupOf(surface, parts, shape);\n const signature = gsap.parseEase(EASE.signature);\n const toward = (progress: number) => signature(progress * (duration / TIMING.dialog.contentReturn));\n const timeline = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n face.remove();\n gsap.set(surface, { clearProps: 'transform,clipPath,opacity,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter,borderRadius' });\n },\n onInterrupt: () => {\n face.remove();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,transformOrigin,filter,borderRadius' });\n },\n })\n .fromTo(\n surface,\n { clipPath: shape.to, willChange: 'transform,clip-path' },\n { x: shape.x, y: shape.y, clipPath: shape.from, duration, ease: EASE.signature },\n 0,\n )\n .to(face, { opacity: 1, duration, ease: EASE.signature }, 0)\n .to(surface, { opacity: 0, duration, ease: 'power3.in' }, 0);\n if (parts.length) {\n timeline\n .to(parts, { ...group, duration, ease: toward }, 0)\n // Stepbro rounds the content toward a 400 px radius while it fades and blurs.\n .to(parts, { opacity: 0, borderRadius: '400px', duration, ease: EASE.fadeAway }, 0)\n .to(parts, { filter: 'blur(32px)', duration, ease: EASE.blurAway }, 0);\n }\n running.set(surface, timeline);\n return timeline;\n }\n // A list: its content dissolves while the shape travels back and takes the label back.\n const timeline = gsap\n .timeline({\n onComplete: () => {\n running.delete(surface);\n onComplete();\n face.remove();\n gsap.set(surface, { clearProps: 'transform,clipPath,willChange' });\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,filter' });\n },\n onInterrupt: () => {\n face.remove();\n if (parts.length) gsap.set(parts, { clearProps: 'opacity,transform,filter' });\n },\n })\n .fromTo(\n surface,\n { clipPath: shape.to, willChange: 'transform,clip-path' },\n { x: shape.x, y: shape.y, clipPath: shape.from, duration, ease: EASE.signature },\n 0,\n )\n .to(face, { opacity: 1, duration: duration * 0.5, ease: 'power1.in' }, duration * 0.3);\n if (parts.length) timeline.to(parts, { opacity: 0, filter: 'blur(32px)', duration: duration * 0.7, ease: 'power2.in' }, 0);\n if (copy) timeline.to(copy, { opacity: 1, duration: duration * 0.3, ease: 'power1.in' }, duration * 0.65);\n running.set(surface, timeline);\n return timeline;\n}\n\n/**\n * Close a modal at once (focus returns, the page takes input) while an inert\n * copy folds back into the opener over a fading veil. `inPlace` (after a drag)\n * closes it where it was dropped instead of folding into the opener.\n */\nexport function morphCloseWithGhost(\n surface: HTMLElement,\n origin: HTMLElement | null,\n { inPlace = false, liquid = false }: { inPlace?: boolean; liquid?: boolean } = {},\n) {\n registerMotion();\n const dragged = inPlace\n ? {\n x: Number(gsap.getProperty(surface, 'x')) || 0,\n y: Number(gsap.getProperty(surface, 'y')) || 0,\n scale: Number(gsap.getProperty(surface, 'scaleX')) || 1,\n }\n : null;\n if (dragged) gsap.set(surface, { clearProps: 'transform' });\n const ghost = reduced() ? null : ghostOf(surface);\n if (!ghost) {\n showOrigin(origin);\n releaseShared(origin);\n return;\n }\n // The veil copies the modal's backdrop (tint and blur) and fades with the copy.\n const veil = backdropVeil(surface);\n document.body.append(veil, ghost);\n showOrigin(origin, { fade: true });\n gsap.to(veil, { opacity: 0, duration: TIMING.dialog.close, ease: 'power3.in' });\n if (dragged) gsap.set(ghost, { ...dragged, transformOrigin: getComputedStyle(surface).transformOrigin });\n morphClose(\n ghost,\n dragged ? null : origin,\n () => {\n showOrigin(origin);\n releaseShared(origin);\n ghost.remove();\n veil.remove();\n },\n { liquid },\n );\n}\n","import { gsap, EASE, registerMotion } from '../core/gsap';\nimport { motionSpring } from '../core/physics-spring';\nimport { reduced } from '../core/reduced';\nimport { clearStyles } from '../core/styles';\nimport { TIMING } from '../core/timing';\nimport { backdropVeil, ghostOf } from './surface';\n\n/*\n * Dousan's project sheet: the surface rises from below the screen (0.72 s,\n * cubic(.16,1,.3,1)) while the page behind ([data-mk-underlay]) sinks to\n * scale .98 / opacity .4 on a 300/30 spring. It closes through an inert copy\n * that drops away, so focus returns at once.\n */\n\nconst UNDERLAY_STYLES = ['transform', 'translate', 'rotate', 'scale', 'transform-origin', 'opacity'];\n\nexport function sheetOpen(surface: HTMLElement) {\n if (reduced()) return null;\n registerMotion();\n return gsap.fromTo(surface, { yPercent: 100 }, { yPercent: 0, duration: TIMING.sheet.open, ease: EASE.sheet, clearProps: 'transform' });\n}\n\n/** Drop a copy of the (still open) sheet off the bottom of the screen. */\nexport function sheetClose(surface: HTMLElement, { inPlace = false }: { inPlace?: boolean } = {}) {\n registerMotion();\n const dragged = inPlace ? Number(gsap.getProperty(surface, 'y')) || 0 : 0;\n gsap.killTweensOf(surface);\n clearStyles([surface], ['transform', 'translate', 'rotate', 'scale']);\n const ghost = reduced() ? null : ghostOf(surface);\n if (!ghost) return null;\n const veil = backdropVeil(surface);\n document.body.append(veil, ghost);\n gsap.to(veil, { opacity: 0, duration: TIMING.sheet.close, ease: 'power3.in', onComplete: () => veil.remove() });\n return gsap.fromTo(\n ghost,\n { y: dragged, yPercent: 0 },\n { yPercent: 100, duration: TIMING.sheet.close, ease: EASE.sheet, onComplete: () => ghost.remove() },\n );\n}\n\nexport function pushUnderlay(elements: HTMLElement[]) {\n if (!elements.length || reduced()) return;\n registerMotion();\n const { ease, duration } = motionSpring(...TIMING.springs.underlay);\n gsap.to(elements, {\n scale: TIMING.sheet.underlayScale,\n opacity: TIMING.sheet.underlayOpacity,\n transformOrigin: '50% 0',\n duration,\n ease,\n overwrite: 'auto',\n });\n}\n\nexport function releaseUnderlay(elements: HTMLElement[], animated = true) {\n if (!elements.length) return;\n const restore = () => clearStyles(elements, UNDERLAY_STYLES);\n if (!animated || reduced()) {\n gsap.killTweensOf(elements);\n restore();\n return;\n }\n const { ease, duration } = motionSpring(...TIMING.springs.underlay);\n gsap.to(elements, { scale: 1, opacity: 1, duration, ease, overwrite: 'auto', onComplete: restore });\n}\n","import { gsap, EASE, registerMotion } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce, type Cleanup, type Instance } from '../../core/types';\nimport { MORPH_STYLES, clearStyles } from '../../core/styles';\nimport { anchorSurface, clearAnchor } from '../../motion/anchor';\nimport { attachDragDismiss } from '../../motion/drag-dismiss';\nimport {\n attachFloating,\n dockWindow,\n floatingAvailable,\n forgetFloat,\n liftWindow,\n savedFloat,\n unplaceWindow,\n} from '../../motion/floating';\nimport { isMorphing, morphCloseWithGhost, morphOpen, releaseShared, showOrigin, stopMorph } from '../../motion/morph';\nimport { pushUnderlay, releaseUnderlay, sheetClose, sheetOpen } from '../../motion/sheet';\nimport { closeModal, fadeBackdrop, openModal } from '../../motion/surface';\n\n/*\n * Stepbro's ModalHost on a native <dialog> (focus trap, Escape, top layer): the\n * control that opened it turns into it and it folds back into that control\n * (morph or liquid) over a backdrop tinted on the signature curve. It eases to\n * new heights (auto-resize), can be dragged away (> 100 px) and, on desktop,\n * lifted into a floating window by its handle. Parts: [data-mk-part] header,\n * title, description, body, footer, close, handle.\n */\n\nexport type DialogVariant = 'morph' | 'liquid' | 'sheet';\nexport type DialogPlacement = 'center' | 'anchor' | 'side';\n\nexport interface DialogLabels {\n close?: string;\n float?: string;\n dock?: string;\n}\n\nexport interface DialogOptions {\n /** morph (Stepbro, default), liquid (Stepbro), or sheet: rises from the bottom and pushes [data-mk-underlay] back (Dousan). */\n variant?: DialogVariant;\n placement?: DialogPlacement;\n /** Tinted backdrop; false leaves it transparent (menus). */\n backdrop?: boolean;\n closeOnBackdrop?: boolean;\n /** Drag (or wheel) down to dismiss. */\n drag?: boolean;\n /** A key turns on the floating window (desktop) and remembers its place. */\n float?: string | false;\n autoResize?: boolean;\n /** `[data-mk-open=\"<id>\"]` buttons open it: true uses the dialog's id; a string names another id; false: none. */\n triggers?: boolean | string;\n /** Modal (default) or a non-modal dialog. */\n modal?: boolean;\n labels?: DialogLabels;\n /** Grow the content with the surface (default). Menus turn it off and cascade their items instead. */\n animateContent?: boolean;\n onOpen?: () => void;\n /** After it closed, whatever closed it. */\n onClose?: () => void;\n}\n\nexport interface DialogInstance extends Instance {\n /** `origin`: the control it grows from; omitted, the focused control; null, none (scale-in). */\n open(origin?: HTMLElement | null): void;\n close(): void;\n toggle(origin?: HTMLElement | null): void;\n float(): void;\n dock(): void;\n readonly isOpen: boolean;\n readonly isFloating: boolean;\n readonly element: HTMLElement;\n}\n\nconst DEFAULT_LABELS: Required<DialogLabels> = { close: 'Cerrar', float: 'Ventana flotante', dock: 'Volver a su sitio' };\nconst FIELDS = '[autofocus], input:not([type=\"hidden\"]):not(:disabled), textarea:not(:disabled), select:not(:disabled)';\nconst CORNERS = ['tl', 'tr', 'bl', 'br'] as const;\nlet uid = 0;\n\nconst part = (dialog: HTMLElement, name: string) => dialog.querySelector<HTMLElement>(`[data-mk-part=\"${name}\"]`);\n\nexport function createDialog(dialog: HTMLElement | null, options: DialogOptions = {}): DialogInstance {\n if (!dialog) {\n warnOnce('dialog: missing <dialog> element');\n return inert({ open() {}, close() {}, toggle() {}, float() {}, dock() {}, isOpen: false, isFloating: false, element: null as unknown as HTMLElement });\n }\n registerMotion();\n const {\n variant = 'morph',\n placement = 'center',\n backdrop = true,\n closeOnBackdrop = true,\n drag = true,\n float: floatKey = false,\n autoResize = true,\n triggers = true,\n modal = true,\n } = options;\n const labels = { ...DEFAULT_LABELS, ...options.labels };\n const liquid = variant === 'liquid';\n const sheet = variant === 'sheet';\n const scope = createScope();\n /** Effects that live while it is open. */\n let session: Cleanup[] = [];\n let opener: HTMLElement | null = null;\n let isOpen = false;\n let closing = false;\n let floating = false;\n /**\n * Lifting and docking swap modal ↔ popover: the native `close` events they cause\n * (queued, so they arrive later) are not the person closing it.\n */\n let ownCloses = 0;\n const closeNatively = () => {\n if (!dialog.hasAttribute('open')) return;\n ownCloses += 1;\n closeModal(dialog as HTMLDialogElement);\n };\n let destroyed = false;\n /** destroy() is under way: the page behind comes back at once. */\n let tearingDown = false;\n\n if (placement !== 'center') scope.attr(dialog, 'data-mk-placement', placement);\n if (!backdrop) scope.attr(dialog, 'data-mk-backdrop', 'none');\n scope.attr(dialog, 'data-mk-variant', variant);\n const title = part(dialog, 'title');\n if (title && !dialog.hasAttribute('aria-label') && !dialog.hasAttribute('aria-labelledby')) {\n if (!title.id) scope.attr(title, 'id', `mk-dialog-title-${++uid}`);\n scope.attr(dialog, 'aria-labelledby', title.id);\n }\n const description = part(dialog, 'description');\n if (description && !dialog.hasAttribute('aria-describedby')) {\n if (!description.id) scope.attr(description, 'id', `mk-dialog-description-${++uid}`);\n scope.attr(dialog, 'aria-describedby', description.id);\n }\n const closeButton = part(dialog, 'close');\n if (closeButton && !closeButton.hasAttribute('aria-label') && !closeButton.textContent?.trim()) {\n scope.attr(closeButton, 'aria-label', labels.close);\n }\n const handle = floatKey ? part(dialog, 'handle') : null;\n if (handle) {\n scope.attr(handle, 'data-mk-no-drag', '');\n scope.attr(handle, 'aria-pressed', 'false');\n scope.attr(handle, 'aria-label', labels.float);\n }\n const corners: HTMLElement[] = [];\n if (floatKey) {\n for (const corner of CORNERS) {\n const element = document.createElement('span');\n element.className = 'mk-float-corner';\n element.dataset.mkFloatCorner = corner;\n element.dataset.mkNoDrag = '';\n element.setAttribute('aria-hidden', 'true');\n dialog.append(element);\n corners.push(element);\n }\n scope.add(() => corners.forEach((corner) => corner.remove()));\n }\n\n const emit = (type: string, cancelable = false, detail: Record<string, unknown> = {}) =>\n dialog.dispatchEvent(new CustomEvent(type, { bubbles: true, cancelable, detail: { dialog, ...detail } }));\n\n const endSession = () => {\n for (const cleanup of session.splice(0).reverse()) cleanup();\n };\n\n const settleFloating = () => {\n if (!floating) return;\n floating = false;\n if (typeof dialog.hidePopover === 'function' && dialog.hasAttribute('popover')) {\n try {\n dialog.hidePopover();\n } catch {\n // Already hidden.\n }\n }\n dialog.removeAttribute('popover');\n unplaceWindow(dialog);\n if (handle) {\n handle.setAttribute('aria-pressed', 'false');\n handle.setAttribute('aria-label', labels.float);\n }\n };\n\n /** Closed without our animation (owner, form[method=dialog], destroy). */\n const closedQuietly = () => {\n stopMorph(dialog);\n endSession();\n isOpen = false;\n closing = false;\n showOrigin(opener);\n releaseShared(opener);\n emit('mk:closed');\n options.onClose?.();\n };\n\n const lift = () => {\n if (!floatKey || floating || !isOpen || !floatingAvailable()) return;\n const box = dialog.getBoundingClientRect();\n const rect = savedFloat(floatKey) ?? { top: box.top, left: box.left, width: box.width, height: box.height };\n const focused = document.activeElement;\n // Its backdrop leaves as the window lifts off the page.\n const backdropStyle = getComputedStyle(dialog, '::backdrop');\n const veil = document.createElement('div');\n veil.setAttribute('aria-hidden', 'true');\n Object.assign(veil.style, {\n position: 'fixed',\n inset: '0',\n background: backdropStyle.background || backdropStyle.backgroundColor,\n backdropFilter: backdropStyle.backdropFilter,\n pointerEvents: 'none',\n });\n closeNatively();\n document.body.append(veil);\n dialog.setAttribute('popover', 'manual');\n if (typeof dialog.showPopover === 'function') dialog.showPopover();\n else openModal(dialog, false);\n liftWindow(dialog, rect);\n gsap.to(veil, { opacity: 0, duration: reduced() ? 0 : TIMING.float.shadow, ease: EASE.signature, onComplete: () => veil.remove() });\n floating = true;\n if (handle) {\n handle.setAttribute('aria-pressed', 'true');\n handle.setAttribute('aria-label', labels.dock);\n }\n showOrigin(opener, { fade: true });\n if (focused instanceof HTMLElement && dialog.contains(focused)) focused.focus();\n };\n\n const dock = () => {\n if (!floatKey || !floating) return;\n const box = dialog.getBoundingClientRect();\n const focused = document.activeElement;\n floating = false;\n if (typeof dialog.hidePopover === 'function') dialog.hidePopover();\n dialog.removeAttribute('popover');\n closeNatively();\n openModal(dialog, modal);\n dockWindow(dialog, { top: box.top, left: box.left, width: box.width, height: box.height });\n if (backdrop) void fadeBackdrop(dialog, 'in');\n forgetFloat(floatKey);\n if (handle) {\n handle.setAttribute('aria-pressed', 'false');\n handle.setAttribute('aria-label', labels.float);\n }\n if (focused instanceof HTMLElement && dialog.contains(focused)) focused.focus();\n };\n\n const startSession = () => {\n if (sheet) {\n const behind = [...document.querySelectorAll<HTMLElement>('[data-mk-underlay]')];\n pushUnderlay(behind);\n const root = document.documentElement;\n const overflow = root.style.overflow;\n root.style.overflow = 'hidden';\n session.push(() => {\n root.style.overflow = overflow;\n if (root.getAttribute('style') === '') root.removeAttribute('style');\n releaseUnderlay(behind, !tearingDown);\n });\n }\n if (autoResize && typeof ResizeObserver === 'function') {\n let last = dialog.offsetHeight;\n let resizing: gsap.core.Tween | null = null;\n const observer = new ResizeObserver(() => {\n if (resizing?.isActive()) return;\n const next = dialog.offsetHeight;\n const previous = last;\n last = next;\n // A floating window's size is the person's, not its content's.\n if (floating || Math.abs(next - previous) < 2 || !previous || isMorphing(dialog) || reduced()) return;\n resizing = gsap.fromTo(\n dialog,\n { height: previous },\n {\n height: next,\n duration: TIMING.dialog.autoResize,\n ease: EASE.signature,\n clearProps: 'height',\n onComplete: () => {\n last = dialog.offsetHeight;\n },\n },\n );\n });\n observer.observe(dialog);\n session.push(() => {\n observer.disconnect();\n resizing?.kill();\n clearStyles([dialog], ['height']);\n });\n }\n if (drag) {\n session.push(\n attachDragDismiss(dialog, {\n canDrag: () => !isMorphing(dialog) && !floating && !closing && isOpen,\n onDismiss: () => close(true),\n }),\n );\n }\n if (placement === 'anchor') {\n const onResize = () => {\n if (isOpen && !floating) anchorSurface(dialog, opener?.isConnected ? opener.getBoundingClientRect() : null);\n };\n addEventListener('resize', onResize);\n session.push(() => {\n removeEventListener('resize', onResize);\n clearAnchor(dialog);\n });\n }\n if (floatKey && handle) {\n session.push(attachFloating(dialog, { key: floatKey, handle, corners, isFloating: () => floating, float: lift, dock }));\n const onResize = () => {\n if (floating && !floatingAvailable()) dock();\n };\n addEventListener('resize', onResize);\n session.push(() => removeEventListener('resize', onResize));\n }\n };\n\n const open = (origin?: HTMLElement | null) => {\n if (destroyed || isOpen) return;\n const active = document.activeElement;\n // undefined: the focused control (usually the one clicked); null: no opener at all.\n opener = origin !== undefined ? origin : active instanceof HTMLElement && active !== document.body && !dialog.contains(active) ? active : null;\n closing = false;\n isOpen = true;\n openModal(dialog, modal);\n if (placement === 'anchor') anchorSurface(dialog, opener?.getBoundingClientRect());\n if (backdrop && modal) void fadeBackdrop(dialog, 'in');\n if (sheet) sheetOpen(dialog);\n else morphOpen(dialog, opener, { hideOrigin: true, liquid, content: options.animateContent === false ? ':scope > :not(*)' : undefined });\n startSession();\n // Forms start at their first field (after showModal: a closed dialog cannot take focus).\n dialog.querySelector<HTMLElement>(FIELDS)?.focus({ preventScroll: true });\n emit('mk:open', false, { origin: opener });\n options.onOpen?.();\n };\n\n /** Animated close: the dialog closes at once while an inert copy folds into the opener. */\n const close = (inPlace = false) => {\n if (destroyed || !isOpen || closing) return;\n if (!emit('mk:close', true, { inPlace })) return;\n closing = true;\n // The copy is measured first: the session cleanup clears an anchored place.\n if (sheet) sheetClose(dialog, { inPlace });\n else morphCloseWithGhost(dialog, opener, { inPlace, liquid });\n endSession();\n if (floating) settleFloating();\n if (dialog.hasAttribute('open')) closeModal(dialog as HTMLDialogElement);\n isOpen = false;\n closing = false;\n if (opener?.isConnected) opener.focus();\n emit('mk:closed');\n options.onClose?.();\n };\n\n scope.on(dialog, 'cancel', (event) => {\n event.preventDefault();\n close();\n });\n scope.on(dialog, 'close', () => {\n if (ownCloses > 0) {\n ownCloses -= 1;\n return;\n }\n // A native close we did not start (form method=\"dialog\", dialog.close()).\n if (!isOpen || closing) return;\n closedQuietly();\n });\n scope.on(dialog, 'keydown', (event) => {\n // A floating (non-modal) window still closes with Escape.\n if ((event as KeyboardEvent).key === 'Escape' && floating) {\n event.preventDefault();\n close();\n }\n });\n scope.on(dialog, 'click', (event) => {\n const target = event.target as Element | null;\n if (target?.closest('[data-mk-part=\"close\"], [data-mk-close]') && dialog.contains(target)) {\n close();\n return;\n }\n if (target !== dialog || !closeOnBackdrop || floating) return;\n const mouse = event as MouseEvent;\n const box = dialog.getBoundingClientRect();\n if (mouse.clientX < box.left || mouse.clientX > box.right || mouse.clientY < box.top || mouse.clientY > box.bottom) close();\n });\n const triggerId = triggers === true ? dialog.id : triggers || '';\n if (triggerId) {\n const selector = `[data-mk-open=\"${typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(triggerId) : triggerId}\"]`;\n scope.on(document, 'click', (event) => {\n const trigger = (event.target as Element | null)?.closest<HTMLElement>(selector);\n if (!trigger || dialog.contains(trigger)) return;\n event.preventDefault();\n if (isOpen) close();\n else open(trigger);\n });\n }\n dialog.dataset.mkReady = '';\n\n return {\n open,\n close: () => close(),\n toggle: (origin?: HTMLElement | null) => (isOpen ? close() : open(origin)),\n float: lift,\n dock,\n get isOpen() {\n return isOpen;\n },\n get isFloating() {\n return floating;\n },\n element: dialog,\n destroy() {\n if (destroyed) return;\n tearingDown = true;\n if (isOpen) {\n settleFloating();\n closing = true;\n if (dialog.hasAttribute('open')) closeModal(dialog as HTMLDialogElement);\n closedQuietly();\n }\n destroyed = true;\n endSession();\n gsap.killTweensOf(dialog);\n clearStyles([dialog], [...MORPH_STYLES, 'height']);\n scope.dispose();\n delete dialog.dataset.mkReady;\n },\n };\n}\n","import { createScope } from '../../core/scope';\nimport { gsap } from '../../core/gsap';\nimport { reduced } from '../../core/reduced';\nimport { TIMING } from '../../core/timing';\nimport { inert, warnOnce } from '../../core/types';\nimport { flowInMenu } from '../../motion/entrances';\nimport { createDialog, type DialogInstance, type DialogOptions } from '../dialog/engine';\n\n/*\n * Stepbro's NavMenu \"Opciones\": the same ModalHost as a dialog, anchored to its\n * button, without a tinted backdrop, on a translucent surface that grows out of\n * the button; its options flow in from 90 % out of a 4 px blur, last first,\n * 40 ms apart, after 0.1 s. Arrow keys, Home and End move between options.\n */\n\nexport interface MenuOptions extends Omit<DialogOptions, 'placement' | 'backdrop' | 'drag' | 'autoResize' | 'animateContent'> {\n ticket?: boolean;\n /** Close after an option is chosen (default). */\n closeOnSelect?: boolean;\n onSelect?: (value: string, item: HTMLElement) => void;\n}\n\nexport interface MenuInstance extends DialogInstance {\n readonly items: HTMLElement[];\n}\n\nconst ITEM = '[data-mk-item]';\n\nexport function createMenu(dialog: HTMLElement | null, options: MenuOptions = {}): MenuInstance {\n if (!dialog) {\n warnOnce('menu: missing <dialog> element');\n return inert({\n open() {},\n close() {},\n toggle() {},\n float() {},\n dock() {},\n isOpen: false,\n isFloating: false,\n element: null as unknown as HTMLElement,\n items: [],\n });\n }\n const { closeOnSelect = true } = options;\n const scope = createScope();\n let ticketAnimation: gsap.core.Timeline | undefined;\n if (options.ticket) {\n scope.attr(dialog, 'data-mk-ticket', '');\n scope.attr(dialog, 'style', dialog.getAttribute('style'));\n for (const item of dialog.querySelectorAll<HTMLElement>(ITEM)) scope.attr(item, 'style', item.getAttribute('style'));\n scope.add(() => ticketAnimation?.kill());\n }\n const items = () => [...dialog.querySelectorAll<HTMLElement>(ITEM)].filter((item) => !item.hasAttribute('disabled') && item.getAttribute('aria-disabled') !== 'true');\n\n scope.attr(dialog, 'role', 'menu');\n // Options can come and go (frameworks): roles are applied now and on every open.\n const markItems = () => {\n for (const item of dialog.querySelectorAll<HTMLElement>(ITEM)) {\n scope.attr(item, 'role', 'menuitem');\n scope.attr(item, 'tabindex', '-1');\n }\n };\n markItems();\n\n const surface = createDialog(dialog, {\n ...options,\n placement: 'anchor',\n backdrop: false,\n drag: false,\n autoResize: false,\n animateContent: false,\n onOpen: () => {\n markItems();\n const list = items();\n if (options.ticket && !reduced()) {\n ticketAnimation?.kill();\n ticketAnimation = gsap.timeline()\n .fromTo(dialog, { clipPath: 'inset(0 0 100% 0)' }, { clipPath: 'inset(0 0 0% 0)', duration: TIMING.ticketMenu.open, ease: 'expo.out' })\n .fromTo(list, { yPercent: TIMING.ticketMenu.from }, { yPercent: 0, duration: TIMING.ticketMenu.content, stagger: TIMING.ticketMenu.stagger, ease: 'expo.out' }, 0);\n } else flowInMenu(list);\n list[0]?.focus({ preventScroll: true });\n options.onOpen?.();\n },\n });\n\n const select = (item: HTMLElement) => {\n const value = item.dataset.mkValue ?? item.textContent?.trim() ?? '';\n dialog.dispatchEvent(new CustomEvent('mk:select', { bubbles: true, detail: { value, item } }));\n options.onSelect?.(value, item);\n if (closeOnSelect) surface.close();\n };\n\n scope.on(dialog, 'click', (event) => {\n const item = (event.target as Element | null)?.closest<HTMLElement>(ITEM);\n if (item && dialog.contains(item) && items().includes(item)) select(item);\n });\n scope.on(dialog, 'keydown', (event) => {\n const key = (event as KeyboardEvent).key;\n const list = items();\n if (!list.length) return;\n const at = list.indexOf(document.activeElement as HTMLElement);\n const moves: Record<string, number> = {\n ArrowDown: at < 0 ? 0 : (at + 1) % list.length,\n ArrowUp: at < 0 ? list.length - 1 : (at - 1 + list.length) % list.length,\n Home: 0,\n End: list.length - 1,\n };\n if (key in moves) {\n event.preventDefault();\n list[moves[key]]?.focus();\n return;\n }\n // Buttons and links activate themselves; other items need Enter and Space.\n const target = event.target as HTMLElement;\n if ((key === 'Enter' || key === ' ') && list.includes(target) && !target.matches('button, a[href]')) {\n event.preventDefault();\n select(target);\n }\n });\n\n return {\n open: surface.open,\n close: surface.close,\n toggle: surface.toggle,\n float: surface.float,\n dock: surface.dock,\n get isOpen() {\n return surface.isOpen;\n },\n get isFloating() {\n return surface.isFloating;\n },\n get items() {\n return items();\n },\n element: dialog,\n destroy() {\n surface.destroy();\n scope.dispose();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AACO,IAAM,QAAQ;AAAA;AAAA,EAEnB,WAAW;AAAA;AAAA,EAEX,MAAM;AAAA;AAAA,EAEN,YAAY;AACd;AAMO,SAAS,WAAW,OAAe,WAAW,GAAG,QAAQ,IAAY;AAC1E,QAAM,UAAU,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,KAAK;AACrD,QAAM,YAAY;AAClB,QAAM,YAAa,YAAY,UAAW,KAAK,KAAK,IAAI,UAAU,OAAO;AACzE,QAAM,SAAS,WAAW,aAAa;AACvC,QAAM,KAAK,CAAC,SACV,IAAI,KAAK,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,IAAI,YAAY,IAAI,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI;AACpG,MAAI,OAAO;AACX,WAAS,OAAO,GAAG,QAAQ,OAAO,QAAQ,GAAG;AAC3C,UAAM,OAAO,OAAO;AACpB,YAAQ,KAAK,KAAK,QAAQ,CAAC,CAAC,KAAK,SAAS,QAAQ,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;AAAA,EAC5E;AACA,SAAO;AACT;AAMO,IAAM,mBACX;;;AClCF,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAId,IAAM,UAAU;AAGhB,IAAM,OAAO;AAAA,EAClB,WAAW;AAAA,EACX,MAAM;AAAA;AAAA,EAEN,OAAO;AAAA,EACP,UAAU;AAAA;AAAA,EAEV,UAAU;AAAA,EACV,YAAY;AAAA;AAAA,EAEZ,cAAc;AAAA;AAAA,EAEd,cAAc;AAAA,EACd,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AACT;AAEA,IAAM,SAA4C;AAAA,EAChD,WAAW,MAAM;AAAA,EACjB,MAAM,MAAM;AAAA,EACZ,OAAO;AAAA,EACP,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY,MAAM;AAAA,EAClB,cAAc,WAAW,IAAI;AAAA,EAC7B,cAAc,WAAW,IAAI;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AACT;AAEA,IAAI,aAAa;AAGV,SAAS,iBAAiB;AAC/B,MAAI,OAAO,WAAW,YAAa;AAEnC,WAAS,gBAAgB,UAAU,IAAI,UAAU;AACjD,MAAI,WAAY;AAChB,eAAa;AACb,OAAK,eAAe,eAAe,WAAW,YAAY,IAAI;AAC9D,aAAW,OAAO,OAAO,KAAK,IAAI,EAA+B,YAAW,OAAO,KAAK,GAAG,GAAG,OAAO,GAAG,CAAC;AAC3G;;;AC9DA,SAAS,QAAAA,aAAY;AAuBd,IAAM,UAAU,CAAC,MAAc,KAAK,IAAI,MAAM,IAAI;AAClD,IAAM,eAAe,CAAC,MAAc,KAAK,IAAI,MAAM;AACnD,IAAM,cAAc,CAAC,MAAc,IAAI,IAAI;AAG3C,SAAS,OAAO,IAAY,IAAY,IAAY,IAAY;AACrE,QAAM,KAAK,CAAC,GAAW,GAAW,MAAc;AAC9C,UAAM,IAAI,IAAI;AACd,WAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,EACzD;AACA,SAAO,CAAC,aAAqB;AAC3B,QAAI,YAAY,KAAK,YAAY,EAAG,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC;AAC5E,QAAI,MAAM;AACV,QAAI,OAAO;AACX,QAAI,IAAI;AACR,aAAS,OAAO,GAAG,OAAO,IAAI,QAAQ,GAAG;AACvC,YAAM,IAAI,GAAG,GAAG,IAAI,EAAE;AACtB,UAAI,KAAK,IAAI,IAAI,QAAQ,IAAI,KAAM;AACnC,UAAI,IAAI,SAAU,OAAM;AAAA,UACnB,QAAO;AACZ,WAAK,MAAM,QAAQ;AAAA,IACrB;AACA,WAAO,GAAG,GAAG,IAAI,EAAE;AAAA,EACrB;AACF;AAEO,IAAM,SAAS,CAAC,WAAmB,SAAiB,QAAkE,CAAC,OAAgB;AAAA,EAC5I,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,GAAG;AACL;AAEO,IAAM,QAAQ,CAAC,UAAkB,UAAiD,EAAE,MAAM,QAAQ,UAAU,KAAK;AAEjH,IAAM,qBAAqB,CAAC,WAAiC;AAAA,EAClE,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAGO,SAAS,YAAY,SAAuB,SAAiB;AAClE,QAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,QAAQ,UAAU,CAAC,OAAQ;AAChC,MAAI,OAAO,SAAS,UAAU;AAE5B,UAAM,OAAO,KAAK,IAAI,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;AACjD,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC;AAC3D,UAAM,OAAO,OAAO;AACpB,aAAS,QAAQ,GAAG,QAAQ,OAAO,SAAS,GAAG;AAC7C,YAAM,QAAQ,CAAC,OAAO,aAAa,QAAQ,UAAU,QAAQ,UAAU,OAAO,UAAU,QAAQ;AAChG,cAAQ,YAAa,SAAS,OAAO,QAAQ,KAAM;AACnD,cAAQ,WAAW,QAAQ,WAAW;AAAA,IACxC;AACA,QAAI,KAAK,IAAI,QAAQ,QAAQ,KAAK,QAAQ,KAAK,IAAI,QAAQ,SAAS,QAAQ,OAAO,KAAK,MAAM;AAC5F,cAAQ,UAAU,QAAQ;AAC1B,cAAQ,WAAW;AACnB,cAAQ,SAAS;AAAA,IACnB;AAAA,EACF,OAAO;AACL,YAAQ,WAAW,KAAK,IAAI,GAAG,OAAO;AACtC,UAAM,WAAW,KAAK,IAAI,GAAG,QAAQ,UAAU,OAAO,QAAQ;AAC9D,YAAQ,UAAU,YAAY,IAAI,QAAQ,SAAS,QAAQ,UAAU,QAAQ,SAAS,QAAQ,UAAU,OAAO,KAAK,QAAQ;AAC5H,QAAI,YAAY,EAAG,SAAQ,SAAS;AAAA,EACtC;AACF;AAGO,SAAS,SAA2B,OAA0B,UAA4C;AAC/G,QAAM,QAAQ,OAAO,KAAK,KAAK;AAC/B,QAAM,QAAQ,OAAO,YAAY,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,mBAAmB,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7F,MAAI,OAAO;AACX,MAAI,cAAmC;AAEvC,QAAM,OAAO,MAAM;AACjB,UAAM,MAAM,YAAY,IAAI;AAC5B,UAAM,UAAU,KAAK,IAAI,IAAI,MAAM,QAAQ,GAAI;AAC/C,WAAO;AACP,QAAIC,WAAU;AACd,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,MAAM,IAAI;AAC1B,UAAI,CAAC,QAAQ,OAAQ;AACrB,kBAAY,SAAS,OAAO;AAC5B,eAAS,MAAM,QAAQ,OAAO;AAC9B,MAAAA,aAAY,QAAQ;AAAA,IACtB;AACA,QAAI,CAACA,UAAS;AACZ,MAAAD,MAAK,OAAO,OAAO,IAAI;AACvB,oBAAc;AACd,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA;AAAA,IAEA,QAAQ,SAAqC,SAAqD;AAChG,iBAAW,QAAQ,OAAO,KAAK,OAAO,GAAU;AAC9C,cAAM,UAAU,MAAM,IAAI;AAC1B,cAAM,SAAS,QAAQ,IAAI;AAC3B,YAAI,CAAC,WAAW,CAAC,OAAQ;AACzB,gBAAQ,SAAS;AACjB,gBAAQ,SAAS,QAAQ;AACzB,gBAAQ,SAAS,QAAQ,IAAI;AAC7B,gBAAQ,UAAU;AAClB,YAAI,OAAO,SAAS,YAAY,OAAO,UAAU;AAC/C,gBAAM,OAAO,OAAO,cAAc,SAAY,KAAK,KAAK,OAAO,SAAS,IAAI,KAAK,KAAK,QAAQ,SAAS,QAAQ,OAAO;AACtH,kBAAQ,WAAW,KAAK,IAAI,OAAO,QAAQ,IAAI;AAAA,QACjD;AACA,gBAAQ,SAAS,QAAQ,WAAW,QAAQ,WAAW,QAAQ,aAAa;AAAA,MAC9E;AACA,aAAO,YAAY,IAAI;AACvB,MAAAA,MAAK,OAAO,OAAO,IAAI;AACvB,MAAAA,MAAK,OAAO,IAAI,IAAI;AACpB,oBAAc;AACd,aAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,sBAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AACL,MAAAA,MAAK,OAAO,OAAO,IAAI;AACvB,iBAAW,QAAQ,MAAO,OAAM,IAAI,EAAE,SAAS;AAC/C,oBAAc;AACd,oBAAc;AAAA,IAChB;AAAA,EACF;AACF;AAGO,SAAS,WAAW,OAAe,WAAW,GAAG;AACtD,QAAM,UAAU,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,GAAG,KAAK;AACrD,QAAM,YAAY;AAClB,QAAM,YAAa,YAAY,UAAW,KAAK,KAAK,IAAI,UAAU,OAAO;AACzE,QAAM,SAAS,WAAW,aAAa;AACvC,SAAO,CAAC,aACN,YAAY,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC,KAAK,IAAI,YAAY,QAAQ,IAAI,QAAQ,KAAK,IAAI,YAAY,QAAQ;AACtI;;;ACrJO,SAAS,WAAW,IAAiB,EAAE,UAAU,CAAC,SAAS,KAAK,GAAG,YAAY,gBAAgB,IAAuB,CAAC,GAAU;AACtI,QAAM,QAAuB,CAAC;AAC9B,QAAM,WAAkC,CAAC;AACzC,QAAM,OAAO,QAAQ,KAAK,GAAG;AAC7B,QAAM,SAAS,SAAS,iBAAiB,IAAI,WAAW,SAAS;AACjE,QAAM,QAAgB,CAAC;AACvB,WAAS,OAAO,OAAO,SAAS,GAAG,MAAM,OAAO,OAAO,SAAS,GAAG;AACjE,UAAM,SAAU,KAAc;AAC9B,QAAI,QAAQ,QAAQ,QAAQ,IAAI,KAAK,GAAG,SAAS,OAAO,QAAQ,IAAI,CAAC,EAAG;AACxE,QAAK,KAAc,KAAK,KAAK,EAAG,OAAM,KAAK,IAAY;AAAA,EACzD;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,KAAK,KAAK,MAAM,OAAO;AACtC,UAAM,QAAgB,CAAC;AACvB,eAAW,SAAS,QAAQ;AAC1B,UAAI,CAAC,MAAO;AACZ,UAAI,QAAQ,KAAK,KAAK,GAAG;AACvB,cAAM,KAAK,SAAS,eAAe,KAAK,CAAC;AACzC;AAAA,MACF;AACA,YAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,WAAK,YAAY;AACjB,WAAK,MAAM,UAAU;AACrB,WAAK,cAAc;AACnB,YAAM,KAAK,IAAI;AACf,YAAM,KAAK,IAAI;AAAA,IACjB;AACA,SAAK,YAAY,GAAG,KAAK;AACzB,aAAS,KAAK,CAAC,MAAM,KAAK,CAAC;AAAA,EAC7B;AACA,MAAI,WAAW;AACf,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AACP,UAAI,SAAU;AACd,iBAAW;AACX,iBAAW,CAAC,MAAM,KAAK,KAAK,SAAS,QAAQ,GAAG;AAC9C,cAAM,CAAC,GAAG,YAAY,aAAa,MAAM,MAAM,CAAC,CAAC;AACjD,mBAAW,QAAQ,MAAO,MAAK,YAAY,YAAY,IAAI;AAAA,MAC7D;AACA,SAAG,UAAU;AAAA,IACf;AAAA,EACF;AACF;AAKO,SAAS,eAAe,MAAc,QAAQ,IAAc;AACjE,QAAM,OAAQ,KAA0G;AACxH,QAAM,MAAM,OAAO,MAAM,KAAK,IAAI,KAAK,QAAW,EAAE,aAAa,WAAW,CAAC,EAAE,QAAQ,IAAI,GAAG,CAACE,UAASA,MAAK,OAAO,IAAI,MAAM,KAAK,IAAI;AACvI,SAAO,IAAI,MAAM,GAAG,KAAK;AAC3B;;;AClEO,SAAS,aAAa,IAAwC;AACnE,MAAI,OAAO,0BAA0B,YAAY;AAC/C,UAAMC,MAAK,sBAAsB,EAAE;AACnC,WAAO,MAAM,qBAAqBA,GAAE;AAAA,EACtC;AACA,QAAM,KAAK,WAAW,MAAM,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE;AAC9C,SAAO,MAAM,aAAa,EAAE;AAC9B;AAGO,IAAM,YAAY,MAAM,IAAI,QAAc,CAAC,YAAY,aAAa,MAAM,QAAQ,CAAC,CAAC;;;ACHpF,SAAS,YAAY,SAA4B,YAAsB;AAC5E,aAAW,WAAW,SAAS;AAC7B,UAAM,QAAS,QAAwB;AACvC,QAAI,CAAC,MAAO;AACZ,eAAW,YAAY,WAAY,OAAM,eAAe,QAAQ;AAChE,QAAI,QAAQ,aAAa,OAAO,MAAM,GAAI,SAAQ,gBAAgB,OAAO;AACzE,WAAQ,QAA2C;AAAA,EACrD;AACF;AAGO,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACtBA,IAAM,OAAO;AACb,IAAM,OAAO,IAAI;AACjB,IAAM,QAAQ;AASd,SAAS,SAAS,WAAmB,SAAiB,MAAc;AAClE,QAAM,KAAK,KAAK,KAAK,YAAY,IAAI;AACrC,QAAM,OAAO,WAAW,IAAI,KAAK,KAAK,YAAY,IAAI;AACtD,MAAI,OAAO,GAAG;AACZ,UAAM,KAAK,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI;AACzC,WAAO,CAAC,MAAc,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,IAAM,OAAO,KAAM,KAAM,KAAK,IAAI,KAAK,CAAC;AAAA,EAC/G;AACA,MAAI,SAAS,EAAG,QAAO,CAAC,MAAc,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK;AACxE,QAAM,OAAO,KAAK,KAAK,OAAO,OAAO,CAAC;AACtC,QAAM,KAAK,CAAC,MAAM,OAAO;AACzB,QAAM,KAAK,CAAC,MAAM,OAAO;AACzB,SAAO,CAAC,MAAc,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK;AACpF;AAEA,IAAM,UAAU,oBAAI,IAA0B;AAEvC,SAAS,aAAa,WAAmB,SAAiB,OAAO,GAAiB;AACvF,QAAM,MAAM,GAAG,SAAS,IAAI,OAAO,IAAI,IAAI;AAC3C,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,MAAO,QAAO;AAClB,QAAM,IAAI,SAAS,KAAK,IAAI,WAAW,IAAI,GAAG,KAAK,IAAI,SAAS,CAAC,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC;AACxF,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,IAAK,KAAI,KAAK,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,KAAM,YAAW,IAAI,KAAK;AAClG,QAAM,WAAW,KAAK,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,GAAI,IAAI;AAC/D,QAAMC,UAAuB;AAAA,IAC3B,MAAM,CAAC,aAAc,YAAY,IAAI,IAAI,YAAY,IAAI,IAAI,EAAE,WAAW,QAAQ;AAAA,IAClF;AAAA,EACF;AACA,UAAQ,IAAI,KAAKA,OAAM;AACvB,SAAOA;AACT;AAGO,IAAM,iBAAiB,CAAC,WAAmB,SAAiB,OAAO,MAAM,aAAa,WAAW,SAAS,IAAI,EAAE;AAGhH,SAAS,aAAa,WAAmB,SAAiB,OAAO,GAAG,SAAS,IAAI;AACtF,QAAM,EAAE,KAAK,IAAI,aAAa,WAAW,SAAS,IAAI;AACtD,SAAO,UAAU,MAAM,KAAK,EAAE,QAAQ,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,KAAK,IAAI,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAC/G;;;ACdA,IAAM,QAAQ;AAEd,SAAS,KAAK,SAA2B,QAAiB,SAAkC;AAC1F,MAAI;AACJ,MAAI,UAAU,mBAAmB,QAAS,SAAQ,CAAC,GAAG,QAAQ,iBAA8B,MAAM,CAAC;AAAA,MAC9F,SAAQ,KAAK,MAAM,QAAqB,OAAO;AACpD,SAAO,UAAU,MAAM,QAAQ,IAAI;AACrC;AAGO,SAAS,OAAO,SAA2B,UAAyB,CAAC,GAA2B;AACrG,iBAAe;AACf,QAAM;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,YAAY;AAAA,EACd,IAAI;AACJ,QAAM,QAAQ,KAAK,SAAS,QAAQ,OAAO;AAC3C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,MAAI,QAAQ,GAAG;AAEb,gBAAY,OAAO,CAAC,aAAa,aAAa,UAAU,SAAS,UAAU,WAAW,YAAY,CAAC;AACnG,WAAO;AAAA,EACT;AACA,QAAM,OAAO,UAAU,IAAI,EAAE,OAAO,WAAW,IAAI,EAAE,GAAG,CAAC,EAAE;AAC3D,QAAM,KAAK,UAAU,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE;AAC/C,QAAM,QAAQ,YAAY,cAAc;AACxC,SAAO,KAAK;AAAA,IACV;AAAA,IACA,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,GAAG,QAAQ,QAAQ,IAAI,MAAM;AAAA,IACjD,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,QAAQ,aAAa,UAAU,SAAS,OAAO,MAAM,YAAY,MAAM;AAAA,EAC9F;AACF;AAGO,SAAS,QAAQ,SAA2B,UAA0B,CAAC,GAA2B;AACvG,iBAAe;AACf,QAAM,EAAE,IAAI,IAAI,OAAO,IAAI,WAAW,OAAO,MAAM,UAAU,OAAO,aAAa,QAAQ,GAAG,UAAU,OAAO,OAAO,IAAI;AACxH,QAAM,QAAQ,KAAK,SAAS,QAAQ,OAAO;AAC3C,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,MAAI,QAAQ,GAAG;AACb,SAAK,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;AAChC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,GAAG,OAAO,EAAE,GAAG,WAAW,GAAG,QAAQ,QAAQ,IAAI,OAAO,UAAU,SAAS,OAAO,MAAM,KAAK,KAAK,CAAC;AACjH;AAMA,eAAsB,WACpB,WACA,QACA,EAAE,WAAW,OAAO,WAAW,IAA2B,CAAC,GAC5C;AACf,QAAM,SAAS,CAAC,GAAG,UAAU,QAAQ;AACrC,QAAM,MAAM,QAAQ,QAAQ,EAAE,SAAS,CAAC;AACxC,MAAI,IAAK,OAAM;AACf,QAAM,OAAO;AACb,QAAM,UAAU;AAChB,SAAO,CAAC,GAAG,UAAU,QAAQ,GAAoB,EAAE,SAAS,CAAC;AAC/D;;;ACzGO,IAAM,aAAa,CAAC,YACzB,OAAO,SAAS,EAAE,OAAO,GAAG,YAAY,KAAK,MAAM,GAAG,SAAS,MAAM,WAAW,OAAO,GAAG,OAAO,KAAK,CAAC;AAGlG,IAAM,gBAAgB,CAAC,YAC5B,OAAO,SAAS,EAAE,OAAO,GAAG,YAAY,KAAK,MAAM,GAAG,WAAW,OAAO,GAAG,OAAO,QAAQ,CAAC;AAGtF,IAAM,aAAa,CAAC,YACzB,OAAO,SAAS,EAAE,OAAO,GAAG,YAAY,KAAK,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC;AAGjE,IAAM,gBAAgB,CAAC,YAC5B,OAAO,SAAS,EAAE,OAAO,GAAG,YAAY,MAAM,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC;AAGtE,IAAM,gBAAgB,CAAC,SAC5B,OAAO,MAAM,EAAE,OAAO,GAAG,QAAQ,sCAAsC,GAAG,OAAO,QAAQ,CAAC;;;AC1B5F,SAAS,QAAAC,aAAY;AAGd,IAAM,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,MAAM;AAEnD,IAAI,KAAK;AACT,IAAI,KAAK;AACT,IAAI,QAAuB;AAC3B,IAAI,QAAuB;AAC3B,IAAI,QAAQ;AAEZ,SAAS,OAAO,GAAiB;AAC/B,MAAI,UAAU,QAAQ,UAAU,MAAM;AACpC,UAAM,EAAE,UAAU;AAClB,UAAM,EAAE,UAAU;AAAA,EACpB;AACA,UAAQ,QAAQ,IAAI,EAAE;AACtB,UAAQ,QAAQ,IAAI,EAAE;AACtB,UAAQ,SAAS;AACnB;AAEA,SAAS,MAAM,GAAiB;AAC9B,MAAI,EAAE,cAAe;AACrB,UAAQ,SAAS;AACjB,UAAQ,QAAQ;AAClB;AAGO,SAAS,cAA0B;AACxC,MAAI,YAAY,GAAG;AACjB,qBAAiB,eAAe,QAAQ,EAAE,SAAS,KAAK,CAAC;AACzD,aAAS,iBAAiB,cAAc,KAAK;AAAA,EAC/C;AACA,MAAI,WAAW;AACf,SAAO,MAAM;AACX,QAAI,SAAU;AACd,eAAW;AACX,QAAI,EAAE,QAAQ,EAAG;AACjB,wBAAoB,eAAe,MAAM;AACzC,aAAS,oBAAoB,cAAc,KAAK;AAChD,YAAQ,SAAS;AACjB,YAAQ,QAAQ;AAChB,SAAK,KAAK;AAAA,EACZ;AACF;AAEA,IAAI,gBAAgB,EAAE,IAAI,GAAG,IAAI,EAAE;AACnC,IAAI,gBAAgB;AAOb,SAAS,eAAe;AAC7B,QAAM,QAAQA,MAAK,OAAO;AAC1B,MAAI,UAAU,eAAe;AAC3B,oBAAgB;AAChB,oBAAgB,EAAE,IAAI,GAAG;AACzB,SAAK,KAAK;AAAA,EACZ;AACA,SAAO;AACT;;;AC/BA,IAAM,cAAc;AAEpB,SAAS,aAAa,IAAqB;AACzC,WAAS,OAAuB,IAAI,MAAM,OAAO,KAAK,eAAe;AACnE,UAAM,QAAQ,iBAAiB,IAAI,EAAE;AACrC,QAAI,SAAS,CAAC,YAAY,KAAK,KAAK,EAAG,QAAO;AAAA,EAChD;AACA,SAAO;AACT;AAEO,SAAS,WAAW,QAAqB,UAAyB,CAAC,GAAwB;AAChG,MAAI,QAAQ,KAAK,CAAC,OAAO,YAAa,QAAO;AAC7C,iBAAe;AACf,QAAM,EAAE,QAAQ,UAAU,QAAQ,GAAG,YAAY,EAAE,IAAI;AACvD,QAAM,QAAQ,iBAAiB,MAAM;AACrC,QAAM,OAAO,QAAQ,QAAQ,aAAa,MAAM;AAChD,QAAMC,YAAW,OAAO,MAAM;AAC9B,MAAI,MAAM,aAAa,SAAU,QAAO,MAAM,WAAW;AAEzD,QAAM,MAAM,OAAO,sBAAsB;AACzC,QAAM,QAAQ,OAAO;AACrB,QAAM,SAAS,OAAO;AACtB,MAAI,QAAyC;AAC7C,QAAM,SAAS,QAAQ;AACvB,MAAI,kBAAkB,SAAS;AAC7B,QAAI,OAAO,aAAa;AACtB,YAAM,OAAO,OAAO,sBAAsB;AAC1C,cAAQ,EAAE,GAAG,KAAK,OAAO,KAAK,QAAQ,GAAG,GAAG,KAAK,MAAM,KAAK,SAAS,EAAE;AAAA,IACzE;AAAA,EACF,WAAW,OAAQ,SAAQ;AAAA,WAClB,WAAW,UAAa,QAAQ,OAAQ,SAAQ,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE;AACtF,QAAM,IAAI,QAAQ,MAAM,IAAI,IAAI,OAAO,OAAO,aAAa,QAAQ;AACnE,QAAM,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM,OAAO,YAAY,SAAS;AAClE,QAAM,SACJ,KAAK,IAAI,KAAK,MAAM,GAAG,CAAC,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,KAAK,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,IAAI;AAEvH,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,aAAa,eAAe,MAAM;AACvC,OAAK,QAAQ,SAAS;AACtB,SAAO,OAAO,KAAK,OAAO;AAAA,IACxB,UAAU;AAAA,IACV,KAAK,GAAG,OAAO,SAAS;AAAA,IACxB,MAAM,GAAG,OAAO,UAAU;AAAA,IAC1B,OAAO,GAAG,KAAK;AAAA,IACf,QAAQ,GAAG,MAAM;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,eAAe;AAAA,IACf,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,WAAW,EAAE,OAAO,EAAE;AAC5B,QAAM,QAAQ,MAAM;AAClB,SAAK,MAAM,aAAa,mBAAmB,MAAM,SAAS,CAAC,MAAM,CAAC,uBAAuB,IAAI,IAAI,SAAS,KAAK;AAAA,EACjH;AACA,QAAM;AACN,SAAO,OAAO,IAAI;AAElB,MAAI,OAAO;AACX,MAAI;AACJ,QAAM,WAAW,IAAI,QAAc,CAAC,MAAO,UAAU,CAAE;AACvD,QAAM,UAAU,MAAM;AACpB,QAAI,KAAM;AACV,WAAO;AACP,SAAK,OAAO;AACZ,WAAO,MAAM,WAAWA;AACxB,YAAQ;AAAA,EACV;AACA,QAAM,CAAC,UAAU,IAAI,IAAI,OAAO,OAAO,KAAK;AAC5C,QAAM,WAAW,KACd,SAAS,EAAE,OAAO,YAAY,SAAS,aAAa,QAAQ,CAAC,EAC7D,GAAG,UAAU,EAAE,OAAO,KAAK,UAAU,MAAM,cAAc,UAAU,MAAM,GAAG,CAAC,EAC7E,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,MAAM,MAAM,aAAa,GAAG,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;AAExH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AACP,eAAS,KAAK;AACd,cAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AC5FA,IAAM,QAAQ,oBAAI,QAAyB;AAC3C,IAAM,SAAS,oBAAI,QAAkC;AACrD,IAAM,SAAS,oBAAI,QAA6B;AAChD,IAAM,gBAA8B,CAAC,UAAU,OAAO,KAAK,MAAM,KAAK,CAAC;AAEvE,SAAS,QAAQ,IAAqB;AACpC,QAAM,QAAQ,MAAM,IAAI,EAAE;AAC1B,MAAI,UAAU,OAAW,QAAO;AAChC,QAAM,SAAS,QAAQ,GAAG,eAAe,IAAI,QAAQ,YAAY,EAAE,CAAC;AACpE,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAGO,SAAS,YAAY,MAAc,IAAY,UAAmC,EAAE,WAAW,OAAO,OAAO,IAA2B,CAAC,GAAG;AACjJ,iBAAe;AACf,MAAI,SAAS,MAAM,QAAQ,GAAG;AAC5B,aAAS,EAAE;AACX,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,EAAE,OAAO,KAAK;AAC5B,SAAO,KAAK,GAAG,OAAO,EAAE,OAAO,IAAI,UAAU,MAAM,KAAK,MAAM,UAAU,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,MAAM,SAAS,EAAE,EAAE,CAAC;AACvI;AAEO,SAAS,QAAQ,IAAiB,IAAY,EAAE,MAAM,WAAW,OAAO,QAAQ,SAAS,cAAc,IAAkB,CAAC,GAAG;AAClI,iBAAe;AACf,SAAO,IAAI,EAAE,GAAG,KAAK;AACrB,QAAM,QAAQ,QAAQ,QAAQ,EAAE;AAChC,QAAM,QAAQ,CAAC,UAAkB;AAC/B,UAAM,IAAI,IAAI,KAAK;AACnB,OAAG,cAAc,OAAO,KAAK;AAAA,EAC/B;AACA,MAAI,UAAU,MAAM,QAAQ,GAAG;AAC7B,UAAM,EAAE;AACR,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,EAAE,OAAO,MAAM;AAC7B,QAAM,QAAQ,KAAK,GAAG,OAAO;AAAA,IAC3B,OAAO;AAAA,IACP;AAAA,IACA,MAAM,KAAK;AAAA,IACX,UAAU,MAAM,MAAM,MAAM,KAAK;AAAA,IACjC,YAAY,MAAM;AAChB,YAAM,EAAE;AACR,aAAO,OAAO,EAAE;AAAA,IAClB;AAAA,EACF,CAAC;AACD,SAAO,IAAI,IAAI,KAAK;AACpB,SAAO;AACT;AAGO,SAAS,cAAc,IAAiB,IAAY,EAAE,MAAM,WAAW,OAAO,eAAe,SAAS,cAAc,IAAkB,CAAC,GAAG;AAC/I,SAAO,IAAI,EAAE,IAAI;AACjB,QAAM,QAAQ,QAAQ,QAAQ,EAAE;AAChC,QAAM,QAAQ,CAAC,UAAkB;AAC/B,UAAM,IAAI,IAAI,KAAK;AACnB,OAAG,cAAc,OAAO,KAAK;AAAA,EAC/B;AACA,MAAI,UAAU,MAAM,QAAQ,GAAG;AAC7B,UAAM,EAAE;AACR,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,MAAI,QAAuB;AAC3B,MAAI,SAAS,MAAM;AAAA,EAAC;AACpB,QAAM,OAAO,CAAC,SAAiB;AAC7B,cAAU;AACV,UAAM,WAAW,KAAK,IAAI,IAAI,OAAO,UAAU,WAAW,IAAK;AAC/D,UAAM,SAAS,KAAK,UAAU,KAAK,IAAI,aAAa,EAAE;AACtD,QAAI,WAAW,EAAG,UAAS,aAAa,IAAI;AAAA,QACvC,QAAO,OAAO,EAAE;AAAA,EACvB;AACA,WAAS,aAAa,IAAI;AAC1B,QAAMC,QAAO,MAAM,OAAO;AAC1B,SAAO,IAAI,IAAIA,KAAI;AACnB,SAAOA;AACT;;;ACvFA,IAAM,OAAO;AACb,IAAM,MAAM;AACZ,IAAM,QAAQ;AAEd,IAAM,SAAS,CAAC,OAAO,QAAQ,SAAS,UAAU,UAAU,cAAc,gBAAgB,iBAAiB,aAAa;AAOjH,SAAS,cAAc,SAAsB,QAAoC,UAAqB;AAC3G,QAAM,OAAO,YAAY,EAAE,OAAO,YAAY,QAAQ,YAAY;AAClE,MAAI,CAAC,UAAU,KAAK,QAAQ,OAAO;AACjC,eAAW,QAAQ,OAAQ,SAAQ,MAAM,eAAe,IAAI;AAC5D;AAAA,EACF;AACA,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,QAAM,YAAY,CAAC,UAAkB,KAAK,IAAI,MAAM,KAAK,IAAI,OAAO,KAAK,QAAQ,IAAI,QAAQ,IAAI,CAAC;AAClG,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,QAAQ,OAAO,MAAM,MAAM,IAAI;AACrC,QAAM,SAAS,KAAK,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,IAAI;AAC7D,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,aAAa,OAAO,OAAO,MAAM,IAAI;AAC3C,MAAI;AACJ,MAAI;AACJ,MAAI,SAAS,OAAQ,EAAC,KAAK,IAAI,IAAI,CAAC,OAAO,UAAU,OAAO,IAAI,CAAC;AAAA,WACxD,SAAS,KAAM,EAAC,KAAK,IAAI,IAAI,CAAC,OAAO,UAAU,OAAO,IAAI,CAAC;AAAA,WAC3D,cAAc,IAAI,SAAS,KAAK,QAAQ,KAAM,EAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,GAAG,GAAG,MAAM,GAAG,WAAW;AAAA,WACtH,cAAc,KAAM,EAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,MAAM,OAAO,GAAG,GAAG,MAAM,GAAG,UAAU;AAAA,MAC/F,EAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,UAAU,OAAO,IAAI,CAAC;AAClD,SAAO,OAAO,QAAQ,OAAO,EAAE,QAAQ,KAAK,KAAK,GAAG,KAAK,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,KAAK,MAAM,IAAI,CAAC,MAAM,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACzI;AAGO,SAAS,YAAY,SAAsB;AAChD,aAAW,QAAQ,OAAQ,SAAQ,MAAM,eAAe,IAAI;AAC9D;;;AC/BA,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,cAAc;AACpB,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAGV,SAAS,WAAW,QAA4B,SAAsB;AACpE,MAAI,UAAU,kBAAkB,UAAU,SAAS;AACnD,SAAO,SAAS;AACd,QAAI,QAAQ,eAAe,QAAQ,eAAe,GAAG;AACnD,YAAM,WAAW,iBAAiB,OAAO,EAAE;AAC3C,UAAI,aAAa,UAAU,aAAa,SAAU,QAAO;AAAA,IAC3D;AACA,QAAI,YAAY,QAAS;AACzB,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO;AACT;AAEA,IAAM,gBAAgB,CAAC,QAA4B,YACjD,kBAAkB,WAClB,CAAC,OAAO,QAAQ,8BAA8B,KAC9C,CAAC,OAAO,QAAQ,QAAQ,KACxB,EAAE,QAAQ,cAAc,uBAAuB,KAAK,CAAC,OAAO,QAAQ,uBAAuB;AAStF,SAAS,kBAAkB,SAAsB,EAAE,UAAU,MAAM,MAAM,UAAU,GAAuB;AAC/G,iBAAe;AACf,MAAIC,WAAyB;AAC7B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,OAAiC;AACrC,MAAI,SAAS;AACb,MAAI,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,EAAE;AAClC,MAAI,SAA6B;AAEjC,QAAM,WAAW,CAAC,UAAiB,MAAM,eAAe;AACxD,QAAM,QAAQ,MAAM;AAClB,WAAO;AACP,SAAK,aAAa,SAAS,WAAW;AACtC,WAAO;AAAA,MACL,GAAG,OAAO,KAAK,YAAY,SAAS,GAAG,CAAC,KAAK;AAAA,MAC7C,GAAG,OAAO,KAAK,YAAY,SAAS,GAAG,CAAC,KAAK;AAAA,MAC7C,OAAO,OAAO,KAAK,YAAY,SAAS,QAAQ,CAAC,KAAK;AAAA,IACxD;AACA,WAAO,eAAe,GAAG,gBAAgB;AACzC,aAAS,KAAK,MAAM,aAAa;AACjC,aAAS,iBAAiB,eAAe,QAAQ;AAAA,EACnD;AACA,QAAM,SAAS,CAAC,IAAY,OAAe;AACzC,aAAS,KAAK;AACd,SAAK,IAAI,SAAS,EAAE,GAAG,KAAK,IAAI,KAAK,QAAQ,GAAG,KAAK,IAAI,QAAQ,OAAO,KAAK,IAAI,KAAK,KAAK,SAAS,IAAI,SAAS,OAAO,EAAE,CAAC;AAAA,EAC7H;AACA,QAAM,UAAU,MAAM,KAAK,GAAG,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,UAAU,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AAC5H,QAAM,UAAU,MAAM;AACpB,aAAS,oBAAoB,eAAe,QAAQ;AACpD,aAAS,KAAK,MAAM,aAAa;AACjC,UAAM,UAAU,SAAS;AACzB,WAAO;AACP,aAAS;AACT,QAAI,QAAS,WAAU;AAAA,QAClB,SAAQ;AAAA,EACf;AAEA,QAAM,gBAAgB,CAAC,UAAwB;AAC7C,QAAI,MAAM,WAAW,KAAKA,aAAY,QAAQ,QAAQ,KAAK,CAAC,QAAQ,EAAG;AACvE,QAAI,CAAC,cAAc,MAAM,QAAQ,OAAO,EAAG;AAC3C,IAAAA,WAAU,MAAM;AAChB,aAAS,MAAM;AACf,aAAS,MAAM;AACf,aAAS,MAAM;AACf,WAAO;AACP,aAAS;AAAA,EACX;AACA,QAAM,gBAAgB,CAAC,UAAwB;AAC7C,QAAI,MAAM,cAAcA,YAAW,SAAS,SAAU;AACtD,UAAM,KAAK,MAAM,UAAU;AAC3B,UAAM,KAAK,MAAM,UAAU;AAC3B,QAAI,SAAS,MAAM;AACjB,UAAI,KAAK,IAAI,EAAE,IAAI,SAAS,KAAK,IAAI,EAAE,IAAI,MAAO;AAClD,UAAI,MAAM,gBAAgB,SAAS;AAEjC,cAAM,WAAW,WAAW,QAAQ,OAAO;AAC3C,YAAI,YAAY,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,aAAa,IAAI;AACnF,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,IACR;AACA,QAAI,MAAM,WAAY,OAAM,eAAe;AAC3C,WAAO,IAAI,EAAE;AAAA,EACf;AACA,QAAM,cAAc,CAAC,UAAwB;AAC3C,QAAI,MAAM,cAAcA,SAAS;AACjC,IAAAA,WAAU;AACV,aAAS;AACT,QAAI,SAAS,QAAQ;AACnB,aAAO;AACP;AAAA,IACF;AAEA,UAAM,UAAU,CAAC,UAAiB;AAChC,YAAM,gBAAgB;AACtB,YAAM,eAAe;AAAA,IACvB;AACA,WAAO,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,MAAM,KAAK,CAAC;AACvE,eAAW,MAAM,OAAO,oBAAoB,SAAS,SAAS,EAAE,SAAS,KAAK,CAAC,GAAG,EAAE;AACpF,YAAQ;AAAA,EACV;AAGA,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,MAAI;AACJ,MAAI,aAAa;AACjB,QAAM,UAAU,CAAC,UACf,MAAM,cAAc,IAAI,MAAM,SAAS,KAAK,MAAM,cAAc,IAAI,MAAM,SAAS,cAAc,MAAM;AACzG,WAAS,SAAS,SAAkB,IAAY;AAC9C,WAAO,oBAAoB,SAAS,gBAAgB,EAAE,SAAS,KAAK,CAAC;AACrE,iBAAa,IAAI;AACjB,eAAW;AACX,iBAAa,KAAK;AAClB,aAAS;AACT,gBAAY;AACZ,iBAAa;AACb,gBAAY;AACZ,aAAS,KAAK,MAAM,aAAa;AACjC,QAAI,QAAS,WAAU;AAAA,QAClB,SAAQ;AAAA,EACf;AACA,WAAS,UAAU,OAAmB;AACpC,UAAM,SAAS,CAAC,QAAQ,KAAK;AAC7B,UAAM,UAAU,YAAY,KAAK,IAAI,GAAG,MAAM,YAAY,SAAS,IAAI;AACvE,gBAAY,MAAM;AAClB,iBAAa,aAAa,MAAO,SAAS,UAAW;AACrD,gBAAY,KAAK,IAAI,GAAG,YAAY,MAAM;AAC1C,WAAO,GAAG,SAAS;AACnB,QAAK,aAAa,eAAe,SAAS,aAAc,SAAS,SAAS;AACxE,eAAS,MAAM,MAAM,SAAS;AAC9B;AAAA,IACF;AACA,iBAAa,IAAI;AACjB,WAAO,WAAW,MAAM,YAAY,SAAS,OAAO,YAAY,IAAI,CAAC,GAAG,UAAU;AAAA,EACpF;AACA,WAAS,eAAe,OAAmB;AACzC,QAAI,CAAC,SAAU;AACf,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,cAAU,KAAK;AAAA,EACjB;AACA,QAAM,UAAU,CAAC,UAAsB;AACrC,QAAI,YAAY,QAAQ,KAAK,CAAC,QAAQ,EAAG;AACzC,UAAM,KAAK,QAAQ,KAAK,IAAI;AAC5B,UAAM,WAAW,WAAW,MAAM,QAAQ,OAAO;AACjD,UAAM,YAAY,WACd,KACE,SAAS,YAAY,IACrB,SAAS,YAAY,SAAS,eAAe,SAAS,eAAe,IACvE;AACJ,QAAI,aAAa,CAAC,MAAM,MAAM,YAAY,WAAY;AACtD,QAAI,MAAM,kBAAkB,WAAW,MAAM,OAAO,QAAQ,8BAA8B,EAAG;AAC7F,UAAM,eAAe;AACrB,eAAW;AACX,gBAAY;AACZ,iBAAa;AACb,gBAAY;AACZ,UAAM;AACN,WAAO;AACP,WAAO,iBAAiB,SAAS,gBAAgB,EAAE,SAAS,OAAO,SAAS,KAAK,CAAC;AAClF,cAAU,KAAK;AAAA,EACjB;AAEA,UAAQ,iBAAiB,eAAe,aAAa;AACrD,SAAO,iBAAiB,eAAe,eAAe,EAAE,SAAS,MAAM,CAAC;AACxE,SAAO,iBAAiB,aAAa,WAAW;AAChD,SAAO,iBAAiB,iBAAiB,WAAW;AACpD,UAAQ,iBAAiB,SAAS,SAAS,EAAE,SAAS,MAAM,CAAC;AAC7D,SAAO,MAAM;AACX,YAAQ,oBAAoB,eAAe,aAAa;AACxD,WAAO,oBAAoB,eAAe,aAAa;AACvD,WAAO,oBAAoB,aAAa,WAAW;AACnD,WAAO,oBAAoB,iBAAiB,WAAW;AACvD,YAAQ,oBAAoB,SAAS,OAAO;AAC5C,WAAO,oBAAoB,SAAS,gBAAgB,EAAE,SAAS,KAAK,CAAC;AACrE,iBAAa,IAAI;AACjB,aAAS,oBAAoB,eAAe,QAAQ;AACpD,aAAS,KAAK,MAAM,aAAa;AAAA,EACnC;AACF;;;ACzNA,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,OAAO;AACb,IAAM,SAAS,EAAE,WAAW,MAAM,SAAS,GAAG;AAC9C,IAAM,YAAY;AAClB,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,oBAAoB;AAC1B,IAAM,cAAc;AACpB,IAAM,eAAe;AAEd,IAAM,oBAAoB,MAAM,OAAO,eAAe,YAAY,cAAc;AAUhF,SAAS,UAAU,MAAY,WAAW,EAAE,OAAO,YAAY,QAAQ,YAAY,GAAS;AACjG,QAAM,WAAW,KAAK,IAAI,WAAW,SAAS,QAAQ,SAAS,CAAC;AAChE,QAAM,YAAY,KAAK,IAAI,YAAY,SAAS,SAAS,SAAS,CAAC;AACnE,QAAM,QAAQ,KAAK,IAAI,UAAU,KAAK,IAAI,WAAW,KAAK,KAAK,CAAC;AAChE,QAAM,SAAS,KAAK,IAAI,WAAW,KAAK,IAAI,YAAY,KAAK,MAAM,CAAC;AACpE,SAAO;AAAA,IACL,KAAK,KAAK,IAAI,KAAK,IAAI,QAAQ,SAAS,SAAS,SAAS,MAAM,GAAG,KAAK,IAAI,QAAQ,KAAK,GAAG,CAAC;AAAA,IAC7F,MAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,SAAS,QAAQ,QAAQ,MAAM,GAAG,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC7F;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,SAAS,CAAC,YAA+B;AAC7C,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,SAAO,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO;AAC9E;AAEA,IAAM,QAAQ,CAAC,SAAsB,SACnC,OAAO,OAAO,QAAQ,OAAO;AAAA,EAC3B,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK,GAAG,KAAK,GAAG;AAAA,EAChB,MAAM,GAAG,KAAK,IAAI;AAAA,EAClB,OAAO,GAAG,KAAK,KAAK;AAAA,EACpB,QAAQ,GAAG,KAAK,MAAM;AAAA,EACtB,UAAU;AAAA,EACV,WAAW;AACb,CAAC;AAEH,IAAM,aAAa,CAAC,QAAgB,YAAY,GAAG;AAG5C,SAAS,WAAW,KAA0B;AACnD,MAAI;AACF,UAAM,QAAQ,KAAK,MAAM,aAAa,QAAQ,WAAW,GAAG,CAAC,KAAK,MAAM;AACxE,WAAO,SAAU,CAAC,OAAO,QAAQ,SAAS,QAAQ,EAAY,MAAM,CAAC,SAAS,OAAO,SAAS,MAAM,IAAI,CAAC,CAAC,IAAI,UAAU,KAAK,IAAI;AAAA,EACnI,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,KAAa,MAAY;AAC1C,MAAI;AACF,iBAAa;AAAA,MACX,WAAW,GAAG;AAAA,MACd,KAAK,UAAU,EAAE,KAAK,KAAK,MAAM,KAAK,GAAG,GAAG,MAAM,KAAK,MAAM,KAAK,IAAI,GAAG,OAAO,KAAK,MAAM,KAAK,KAAK,GAAG,QAAQ,KAAK,MAAM,KAAK,MAAM,EAAE,CAAC;AAAA,IAC3I;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,YAAY,KAAa;AACvC,MAAI;AACF,iBAAa,WAAW,WAAW,GAAG,CAAC;AAAA,EACzC,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,WAAW,SAAsB,MAAY;AAC3D,iBAAe;AACf,QAAM,SAAS,UAAU,IAAI,CAAC;AAC9B,UAAQ,UAAU,IAAI,aAAa;AACnC,MAAI,CAAC,QAAQ,GAAG;AACd,SAAK;AAAA,MACH;AAAA,MACA,EAAE,WAAW,mCAAmC;AAAA,MAChD,EAAE,WAAW,cAAc,UAAU,OAAO,MAAM,QAAQ,MAAM,KAAK,WAAW,YAAY,YAAY;AAAA,IAC1G;AAAA,EACF;AACF;AAEA,IAAMC,UAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,SAAS,cAAc,SAAsB;AAClD,UAAQ,UAAU,OAAO,aAAa;AACtC,aAAW,QAAQA,QAAQ,SAAQ,MAAM,eAAe,IAAI;AAC9D;AAGO,SAAS,WAAW,SAAsB,MAAY;AAC3D,iBAAe;AACf,gBAAc,OAAO;AACrB,MAAI,QAAQ,EAAG;AACf,QAAM,KAAK,OAAO,OAAO;AACzB,OAAK,KAAK,SAAS,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM,GAAG,KAAK,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,QAAQ,MAAM,KAAK,WAAW,YAAY,YAAY,CAAC;AACnJ;AAYO,SAAS,eAAe,SAAsB,EAAE,KAAK,QAAQ,UAAU,CAAC,GAAG,YAAY,OAAO,KAAK,GAAoB;AAC5H,QAAM,WAA8B,CAAC;AACrC,QAAM,SAAS,CAAC,SAAsB,aAA4C;AAChF,YAAQ,iBAAiB,eAAe,QAAQ;AAChD,aAAS,KAAK,MAAM,QAAQ,oBAAoB,eAAe,QAAQ,CAAC;AAAA,EAC1E;AACA,MAAI,SAAwB;AAC5B,MAAI,UAA+B;AAMnC,QAAM,UAAU,CAAC,SAAsB,MAAoB,EAAE,QAAAC,SAAQ,KAAK,MAAmE;AAC3I,cAAU;AACV,aAAS,KAAK;AACd,QAAI;AACF,cAAQ,oBAAoB,KAAK,SAAS;AAAA,IAC5C,QAAQ;AAAA,IAER;AACA,UAAM,OAAO,CAAC,UAAwB;AACpC,UAAI,MAAM,cAAc,OAAQ,CAAAA,QAAO,KAAK;AAAA,IAC9C;AACA,UAAM,KAAK,CAAC,UAAwB;AAClC,UAAI,MAAM,cAAc,OAAQ;AAChC,MAAAC,MAAK;AACL,WAAK;AAAA,IACP;AACA,UAAMA,QAAO,MAAM;AACjB,eAAS;AACT,gBAAU;AACV,aAAO,oBAAoB,eAAe,IAAI;AAC9C,aAAO,oBAAoB,aAAa,EAAE;AAC1C,aAAO,oBAAoB,iBAAiB,EAAE;AAAA,IAChD;AACA,cAAUA;AACV,WAAO,iBAAiB,eAAe,IAAI;AAC3C,WAAO,iBAAiB,aAAa,EAAE;AACvC,WAAO,iBAAiB,iBAAiB,EAAE;AAAA,EAC7C;AACA,WAAS,KAAK,MAAM,UAAU,CAAC;AAwB/B,MAAI,OAAoB;AACxB,QAAM,SAAS,MAAM;AACnB,QAAI,CAAC,KAAM;AACX,SAAK,OAAO,OAAO,IAAI;AACvB,WAAO;AAAA,EACT;AACA,WAAS,OAAO;AACd,QAAI,CAAC,KAAM;AACX,UAAM,MAAM,YAAY,IAAI;AAC5B,UAAM,UAAU,KAAK,KAAK,MAAM,KAAK,QAAQ,KAAM,IAAI,EAAE;AACzD,QAAI,WAAW,EAAG;AAClB,SAAK,OAAO;AACZ,QAAI,KAAK,SAAS;AAChB,YAAM,QAAQ,KAAK,IAAI,CAAC,UAAU,OAAO,MAAM,UAAU;AACzD,WAAK,MAAM;AACX,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,QAAS,KAAK,UAAU,KAAK,KAAK,OAAO,YAAY,KAAK,KAAK,OAAO,WAAW,UAAW,KAAK;AACtG,WAAK,QAAS,KAAK,UAAU,KAAK,KAAK,OAAO,YAAY,KAAK,KAAK,OAAO,WAAW,UAAW,KAAK;AAAA,IACxG;AACA,SAAK,KAAK,KAAK,KAAK;AACpB,SAAK,KAAK,KAAK,KAAK;AACpB,UAAM,YAAY,IAAI,KAAK,IAAI,CAAC,UAAU,OAAO,MAAM,aAAa;AACpE,SAAK,MAAM,KAAK,UAAU,KAAK,KAAK;AACpC,SAAK,MAAM,KAAK,UAAU,KAAK,KAAK;AACpC,QAAI,KAAK,IAAI,KAAK,UAAU,KAAK,CAAC,IAAI,IAAK,MAAK,IAAI,KAAK;AACzD,QAAI,KAAK,IAAI,KAAK,UAAU,KAAK,CAAC,IAAI,IAAK,MAAK,IAAI,KAAK;AACzD,UAAM,OAAO,UAAU,EAAE,KAAK,KAAK,GAAG,MAAM,KAAK,GAAG,OAAO,KAAK,GAAG,QAAQ,KAAK,EAAE,CAAC;AACnF,QAAI,KAAK,SAAS,KAAK,GAAG;AACxB,WAAK,IAAI,KAAK;AACd,WAAK,KAAK;AAAA,IACZ;AACA,QAAI,KAAK,QAAQ,KAAK,GAAG;AACvB,WAAK,IAAI,KAAK;AACd,WAAK,KAAK;AAAA,IACZ;AACA,UAAM,SAAS,IAAI;AACnB,UAAM,UAAU,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,IAAI,cAAc,KAAK,MAAM,KAAK,WAAW,KAAK,MAAM,KAAK;AACxG,QAAI,KAAK,WAAW,SAAS;AAC3B,gBAAU,KAAK,IAAI;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,QAAQ,CAAC,SAAS;AACvB,QAAI,KAAK,WAAW,KAAK,WAAW,QAAQ,CAAC,kBAAkB,EAAG;AAClE,SAAK,eAAe;AACpB,WAAO;AACP,QAAI,QAAQ;AACZ,YAAQ,QAAQ,MAAM;AAAA,MACpB,OAAO,OAAO;AACZ,cAAM,KAAK,MAAM,UAAU,KAAK;AAChC,cAAM,KAAK,MAAM,UAAU,KAAK;AAChC,YAAI,CAAC,OAAO;AACV,cAAI,KAAK,IAAI,EAAE,IAAI,QAAQ,KAAK,IAAI,EAAE,IAAI,KAAM;AAChD,kBAAQ;AACR,cAAI,CAAC,WAAW,EAAG,OAAM;AACzB,gBAAM,OAAO,OAAO,OAAO;AAC3B,gBAAM,YAAY,aAAa,SAAS;AACxC,gBAAM,aAAa,cAAc,SAAS;AAE1C,gBAAM,QAAQ,KAAK,SAAS,YAAY,IAAI,KAAK,IAAI,WAAW,KAAK,MAAM,YAAY,WAAW,CAAC,IAAI,KAAK;AAC5G,gBAAM,SAAS,KAAK,UAAU,aAAa,IAAI,KAAK,IAAI,YAAY,KAAK,MAAM,aAAa,WAAW,CAAC,IAAI,KAAK;AACjH,gBAAM,OAAO,KAAK,QAAQ,KAAK,KAAK,UAAU,KAAK,QAAQ,KAAK,QAAQ;AACxE,gBAAM,OAAO,KAAK,QAAQ,KAAK,QAAQ,SAAS;AAChD,gBAAMC,OAAM,YAAY,IAAI;AAC5B,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,GAAG,KAAK;AAAA,YACR,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,GAAG,KAAK;AAAA,YACR,GAAG,KAAK;AAAA,YACR,SAAS;AAAA,YACT,SAAS,KAAK;AAAA,YACd,SAAS;AAAA,YACT,SAAS;AAAA,YACT,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,KAAK,KAAM,KAAK,QAAQ,KAAK,SAAU,SAAS,CAAC,CAAC;AAAA,YACvF,MAAMA;AAAA,YACN,SAAS;AAAA,YACT,OAAO;AAAA,YACP,OAAO,KAAK;AAAA,YACZ,WAAW;AAAA,YACX,WAAW;AAAA,YACX,UAAU,MAAM;AAAA,YAChB,UAAU,MAAM;AAAA,YAChB,aAAaA;AAAA,UACf;AACA,eAAK,OAAO,IAAI,IAAI;AAAA,QACtB;AACA,YAAI,CAAC,KAAM;AACX,aAAK,UAAU,KAAK,QAAQ;AAC5B,aAAK,UAAU,KAAK,QAAQ;AAC5B,cAAM,MAAM,YAAY,IAAI;AAC5B,cAAM,UAAU,KAAK,IAAI,GAAG,MAAM,KAAK,WAAW,IAAI;AACtD,cAAM,YAAY,IAAI,KAAK,IAAI,CAAC,UAAU,iBAAiB;AAC3D,aAAK,eAAe,MAAM,UAAU,KAAK,YAAY,UAAU,KAAK,aAAa;AACjF,aAAK,eAAe,MAAM,UAAU,KAAK,YAAY,UAAU,KAAK,aAAa;AACjF,aAAK,WAAW,MAAM;AACtB,aAAK,WAAW,MAAM;AACtB,aAAK,cAAc;AAAA,MACrB;AAAA,MACA,OAAO;AACL,YAAI,CAAC,OAAO;AACV,cAAI,WAAW,EAAG,MAAK;AAAA,cAClB,OAAM;AACX;AAAA,QACF;AACA,YAAI,CAAC,KAAM;AAEX,cAAM,QAAQ,YAAY,IAAI,IAAI,KAAK,cAAc,KAAK,IAAI,KAAK,MAAM,KAAK,WAAW,KAAK,SAAS;AACvG,YAAI,SAAS,aAAa;AACxB,eAAK,KAAK,KAAK;AACf,eAAK,KAAK,KAAK;AAAA,QACjB,OAAO;AACL,eAAK,KAAK;AACV,eAAK,KAAK;AACV,eAAK,UAAU,KAAK;AACpB,eAAK,UAAU,KAAK;AAAA,QACtB;AACA,aAAK,UAAU;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,aAAW,UAAU,SAAS;AAC5B,WAAO,QAAQ,CAAC,SAAS;AACvB,UAAI,KAAK,WAAW,KAAK,WAAW,QAAQ,CAAC,kBAAkB,EAAG;AAClE,WAAK,eAAe;AACpB,aAAO;AACP,YAAM,OAAO,OAAO,QAAQ,iBAAiB;AAC7C,YAAM,WAAW,KAAK,SAAS,GAAG;AAClC,YAAM,UAAU,KAAK,WAAW,GAAG;AACnC,UAAI,QAAqB;AACzB,cAAQ,QAAQ,MAAM;AAAA,QACpB,OAAO,OAAO;AACZ,gBAAM,KAAK,MAAM,UAAU,KAAK;AAChC,gBAAM,KAAK,MAAM,UAAU,KAAK;AAChC,cAAI,CAAC,OAAO;AACV,gBAAI,KAAK,IAAI,EAAE,IAAI,QAAQ,KAAK,IAAI,EAAE,IAAI,KAAM;AAChD,gBAAI,CAAC,WAAW,EAAG,OAAM;AACzB,oBAAQ,OAAO,OAAO;AAAA,UACxB;AACA,gBAAM,QAAQ,KAAK,IAAI,aAAa,SAAS,GAAG,KAAK,IAAI,WAAW,WAAW,MAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE,CAAC;AACnH,gBAAM,SAAS,KAAK,IAAI,cAAc,SAAS,GAAG,KAAK,IAAI,YAAY,UAAU,MAAM,SAAS,KAAK,MAAM,SAAS,EAAE,CAAC;AACvH;AAAA,YACE;AAAA,YACA,UAAU;AAAA,cACR,KAAK,UAAU,MAAM,MAAM,MAAM,SAAS,SAAS,MAAM;AAAA,cACzD,MAAM,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ,MAAM;AAAA,cAC1D;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QACA,OAAO;AACL,cAAI,MAAO,WAAU,KAAK,OAAO,OAAO,CAAC;AAAA,QAC3C;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,MAAM;AACX,QAAI,MAAM,QAAS,WAAU,KAAK,OAAO,OAAO,CAAC;AACjD,WAAO;AACP,eAAW,WAAW,SAAU,SAAQ;AAAA,EAC1C;AACF;;;ACzXO,IAAM,mBAAmB,CAAC,UAC/B,CAAC,SAAS,UAAU,iBAAiB,WAAW,KAAK,KAAK,KAAK,YAAY,KAAK,KAAK;AAKhF,SAAS,UAAU,QAAoB,QAAQ,MAAM;AAC1D,MAAI,OAAO,aAAa,MAAM,EAAG;AACjC,MAAI,SAAS,OAAO,OAAO,cAAc,WAAY,QAAO,UAAU;AAAA,WAC7D,OAAO,OAAO,SAAS,WAAY,QAAO,KAAK;AAAA,MACnD,QAAO,aAAa,QAAQ,EAAE;AACrC;AAEO,SAAS,WAAW,QAAoB;AAC7C,MAAI,OAAO,OAAO,UAAU,WAAY,QAAO,MAAM;AAAA,MAChD,QAAO,gBAAgB,MAAM;AACpC;AAMO,SAAS,aAAa,QAAqB,WAAwC;AACxF,MAAI,OAAO,OAAO,YAAY,cAAc,QAAQ,EAAG,QAAO,QAAQ,QAAQ;AAC9E,MAAI;AACF,UAAM,YAAY,OAAO,QAAQ,cAAc,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,GAAG;AAAA,MACzH,WAAW,cAAc,OAAO,OAAO,OAAO,WAAW,OAAO,OAAO,SAAS;AAAA,MAChF,QAAQ,cAAc,OAAO,mBAAmB;AAAA,MAChD,MAAM,cAAc,QAAQ,aAAa;AAAA,MACzC,eAAe;AAAA,IACjB,CAAC;AACD,WAAO,UAAU,SAAS;AAAA,MACxB,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF,QAAQ;AACN,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACF;AAQO,SAAS,aAAa,SAAmC;AAC9D,QAAM,WAAW,iBAAiB,SAAS,YAAY;AACvD,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,aAAa,eAAe,MAAM;AACvC,OAAK,QAAQ,SAAS;AACtB,SAAO,OAAO,KAAK,OAAO;AAAA,IACxB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY,SAAS,cAAc,SAAS;AAAA,IAC5C,gBAAgB,SAAS;AAAA,IACzB,eAAe;AAAA,EACjB,CAAC;AACD,SAAO;AACT;AAEO,SAAS,QAAQ,SAA0C;AAChE,QAAM,OAAO,QAAQ,sBAAsB;AAC3C,MAAI,KAAK,UAAU,KAAK,KAAK,WAAW,EAAG,QAAO;AAClD,QAAM,QAAQ,iBAAiB,OAAO;AACtC,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY,QAAQ;AAC1B,QAAM,YAAY,QAAQ;AAC1B,QAAM,aAAa,eAAe,MAAM;AACxC,QAAM,QAAQ;AACd,QAAM,QAAQ,UAAU;AACxB,QAAM,QAAQ,CAAC,MAAM,OAAO,QAAQ,mBAAmB,oBAAoB,cAAc,MAAM;AAC/F,aAAW,WAAW,MAAM,iBAAiB,MAAM,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG;AACxF,eAAW,QAAQ,MAAO,SAAQ,gBAAgB,IAAI;AAAA,EACxD;AACA,aAAW,SAAS,MAAM,iBAAiB,OAAO,GAAG;AACnD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY,MAAM;AACvB,SAAK,OAAO,GAAG,MAAM,UAAU;AAC/B,UAAM,YAAY,IAAI;AAAA,EACxB;AACA,SAAO,OAAO,MAAM,OAAO;AAAA,IACzB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM,GAAG,KAAK,IAAI;AAAA,IAClB,KAAK,GAAG,KAAK,GAAG;AAAA,IAChB,OAAO,GAAG,KAAK,KAAK;AAAA,IACpB,QAAQ,GAAG,KAAK,MAAM;AAAA,IACtB,QAAQ;AAAA,IACR,SAAS,MAAM,YAAY,SAAS,SAAS,MAAM;AAAA,IACnD,eAAe,MAAM;AAAA,IACrB,QAAQ;AAAA,IACR,eAAe;AAAA,EACjB,CAAC;AACD,SAAO;AACT;;;AC7FA,IAAM,MAAM;AAGZ,SAAS,YAAY;AACnB,MAAI,SAAS,eAAe,GAAG,EAAG;AAClC,QAAM,MAAM,SAAS,gBAAgB,8BAA8B,KAAK;AACxE,MAAI,aAAa,eAAe,MAAM;AACtC,MAAI,aAAa,SAAS,GAAG;AAC7B,MAAI,aAAa,UAAU,GAAG;AAC9B,MAAI,MAAM,WAAW;AACrB,MAAI,YAAY,qBAAqB,GAAG;AACxC,WAAS,KAAK,OAAO,GAAG;AAC1B;AAUA,SAAS,SAAS,SAAsB;AACtC,YAAU;AACV,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,aAAa,eAAe,MAAM;AACxC,SAAO,OAAO,MAAM,OAAO;AAAA,IACzB,UAAU;AAAA,IACV,MAAM,GAAG,CAAC,IAAI,OAAO,QAAQ,UAAU;AAAA,IACvC,KAAK,GAAG,CAAC,IAAI,MAAM,QAAQ,SAAS;AAAA,IACpC,OAAO,GAAG,UAAU;AAAA,IACpB,QAAQ,GAAG,WAAW;AAAA,IACtB,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,QAAQ,QAAQ,GAAG;AAAA,IACnB,cAAc;AAAA,IACd,YAAY;AAAA,EACd,CAAC;AACD,QAAM,OAAO,CAAC,MAAW,QAAgB,UAAkB;AACzD,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,WAAO,OAAO,QAAQ,OAAO;AAAA,MAC3B,UAAU;AAAA,MACV,KAAK,GAAG,KAAK,GAAG;AAAA,MAChB,MAAM,GAAG,KAAK,IAAI;AAAA,MAClB,OAAO,GAAG,KAAK,KAAK;AAAA,MACpB,QAAQ,GAAG,KAAK,MAAM;AAAA,MACtB,cAAc,GAAG,MAAM;AAAA,MACvB,YAAY;AAAA,IACd,CAAC;AACD,UAAM,OAAO,OAAO;AACpB,WAAO;AAAA,EACT;AACA,UAAQ,OAAO,KAAK;AACpB,SAAO,EAAE,OAAO,KAAK;AACvB;AAGA,SAAS,UAAU,SAAsB;AACvC,QAAM,QAAQ,QAAQ,aAAa,OAAO;AAC1C,SAAO,OAAO,QAAQ,OAAO;AAAA,IAC3B,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AACD,SAAO,MAAM;AACX,QAAI,UAAU,KAAM,SAAQ,gBAAgB,OAAO;AAAA,QAC9C,SAAQ,aAAa,SAAS,KAAK;AAAA,EAC1C;AACF;AAEA,IAAM,WAAW,CAAC,SAAsB,QACtC,KAAK,IAAI,WAAW,iBAAiB,OAAO,EAAE,mBAAmB,KAAK,GAAG,IAAI,QAAQ,GAAG,IAAI,SAAS,CAAC;AAGxG,SAAS,YAAY,SAAsB,OAAsB;AAC/D,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,QAAM,UAAU,IAAI,OAAO,IAAI,QAAQ;AACvC,QAAM,UAAU,IAAI,MAAM,IAAI,SAAS;AACvC,aAAWC,SAAQ,OAAO;AACxB,UAAM,MAAMA,MAAK,sBAAsB;AACvC,SAAK,IAAIA,OAAM,EAAE,iBAAiB,GAAG,UAAU,IAAI,IAAI,MAAM,UAAU,IAAI,GAAG,KAAK,CAAC;AAAA,EACtF;AACA,SAAO,EAAE,SAAS,QAAQ;AAC5B;AAKO,SAAS,WAAW,SAAsB,QAAqB,OAAsB;AAC1F,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,QAAM,QAAQ,OAAO,sBAAsB;AAC3C,QAAM,eAAe,iBAAiB,OAAO,EAAE;AAC/C,QAAM,aAAa,iBAAiB,MAAM,EAAE;AAC5C,QAAM,cAAc,iBAAiB,UAAU,IAAI,eAAe;AAClE,QAAM,YAAY,SAAS,SAAS,GAAG;AACvC,QAAM,cAAc,SAAS,QAAQ,KAAK;AAC1C,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY,SAAS,KAAK;AACvD,QAAM,UAAU,UAAU,OAAO;AACjC,QAAM,EAAE,OAAO,KAAK,IAAI,SAAS,OAAO;AACxC,QAAM,aAAa,KAAK,OAAO,aAAa,WAAW;AACvD,QAAM,QAAQ,KAAK,OAAO,aAAa,WAAW;AAClD,QAAM,UAAU,MAAM,OAAO,MAAM,QAAQ,IAAI,aAAa,IAAI,IAAI;AACpE,QAAM,UAAU,MAAM,MAAM,MAAM,SAAS,IAAI,cAAc,IAAI,IAAI;AACrE,MAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;AAChD,QAAMC,WAAiB,EAAE,KAAK,MAAM,KAAK,MAAM,MAAM,MAAM,OAAO,MAAM,OAAO,QAAQ,MAAM,QAAQ,OAAO,GAAG,MAAM,EAAE;AACvH,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,MAAM,OAAQ;AACnB,SAAK,IAAI,OAAO;AAAA,MACd,GAAGA,SAAQ,OAAOA,SAAQ,QAAQ,IAAI;AAAA,MACtC,GAAGA,SAAQ,MAAMA,SAAQ,SAAS,IAAI;AAAA,MACtC,OAAOA,SAAQ;AAAA,MACf,QAAQ,QAAQA,SAAQ,IAAI;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,QAAM,SAAS,SAAS,EAAE,GAAGA,UAAS,QAAQ,YAAY,GAAG,CAAC,MAAM,UAAU;AAC5E,QAAI,SAAS,SAAU,OAAM,MAAM,eAAe,GAAG,KAAK;AAAA,SACrD;AACH,MAAAA,SAAQ,IAAI,IAAI;AAChB,UAAI,SAAS,SAAS,SAAS,UAAU,SAAS,WAAW,SAAS,SAAU,OAAM,MAAM,IAAI,IAAI,GAAG,KAAK;AAC5G,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACD,QAAM,IAAI,OAAO;AACjB,OAAK,OAAO;AAAA,IACV,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ,QAAQ,WAAW,OAAO,GAAG,MAAM,EAAE;AAAA,IAC3G;AAAA,MACE,KAAK,OAAO,KAAK,IAAI,EAAE,UAAU,MAAM,WAAW,QAAQ,CAAC;AAAA,MAC3D,MAAM,OAAO,KAAK,IAAI,EAAE,UAAU,MAAM,WAAW,QAAQ,CAAC;AAAA,MAC5D,OAAO,MAAM,EAAE,MAAM,OAAO,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,MAC/C,QAAQ,MAAM,EAAE,MAAM,OAAO,KAAK,KAAK,KAAK,GAAG,CAAC;AAAA,MAChD,QAAQ,MAAM,EAAE,QAAQ,OAAO;AAAA,MAC/B,OAAO,MAAM,EAAE,SAAS,OAAO;AAAA,MAC/B,MAAM,MAAM,EAAE,SAAS,OAAO;AAAA,IAChC;AAAA,EACF;AACA,OAAK,GAAG,OAAO,EAAE,YAAY,cAAc,UAAU,EAAE,OAAO,OAAO,EAAE,YAAY,MAAM,aAAa,CAAC;AACvG,MAAI,MAAM,OAAQ,MAAK,GAAG,OAAO,EAAE,SAAS,GAAG,UAAU,EAAE,OAAO,OAAO,EAAE,YAAY,MAAM,aAAa,CAAC;AAC3G,OAAK,GAAG,YAAY,EAAE,SAAS,GAAG,UAAU,EAAE,OAAO,OAAO,EAAE,YAAY,MAAM,aAAa,CAAC;AAC9F,MAAI,OAAO;AACX,QAAM,SAAS,MAAM;AACnB,QAAI,KAAM;AACV,WAAO;AACP,WAAO,KAAK;AACZ,iBAAa,KAAK;AAClB,UAAM,OAAO;AACb,YAAQ;AACR,QAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,YAAY,2CAA2C,CAAC;AAAA,EAC9F;AAEA,QAAM,QAAQ,WAAW,QAAQ,EAAE,QAAQ;AAC3C,SAAO;AACT;AAGO,SAAS,YAAY,SAAsB,QAAqB,OAAsB,YAAwB;AACnH,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,QAAM,MAAM,OAAO,sBAAsB;AACzC,QAAM,eAAe,iBAAiB,OAAO,EAAE;AAC/C,QAAM,aAAa,iBAAiB,MAAM,EAAE;AAC5C,QAAM,cAAc,iBAAiB,UAAU,IAAI,eAAe;AAClE,QAAM,cAAc,SAAS,SAAS,GAAG;AACzC,QAAM,YAAY,SAAS,QAAQ,GAAG;AACtC,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY,SAAS,KAAK;AACvD,YAAU,OAAO;AACjB,QAAM,EAAE,KAAK,IAAI,SAAS,OAAO;AACjC,QAAM,aAAa,KAAK,KAAK,WAAW,WAAW;AACnD,aAAW,MAAM,UAAU;AAC3B,QAAM,QAAQ,KAAK,KAAK,aAAa,YAAY;AACjD,QAAMA,WAAiB,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ,OAAO,GAAG,MAAM,EAAE;AAC/G,QAAM,SAAS,SAAS,EAAE,GAAGA,UAAS,QAAQ,aAAa,SAAS,EAAE,GAAG,CAAC,MAAM,UAAU;AACxF,QAAI,SAAS,SAAU,OAAM,MAAM,eAAe,GAAG,KAAK;AAAA,aACjD,SAAS,WAAW;AAC3B,UAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,SAAS,MAAM,CAAC;AAAA,IACtD,OAAO;AACL,MAAAA,SAAQ,IAAI,IAAI;AAChB,UAAI,SAAS,SAAS,SAAS,UAAU,SAAS,WAAW,SAAS,SAAU,OAAM,MAAM,IAAI,IAAI,GAAG,KAAK;AAC5G,UAAI,MAAM,QAAQ;AAChB,aAAK,IAAI,OAAO;AAAA,UACd,GAAGA,SAAQ,OAAOA,SAAQ,QAAQ,IAAI;AAAA,UACtC,GAAGA,SAAQ,MAAMA,SAAQ,SAAS,IAAI;AAAA,UACtC,OAAOA,SAAQ;AAAA,UACf,QAAQ,QAAQA,SAAQ,IAAI;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,IAAI,OAAO;AACjB,OAAK,OAAO;AAAA,IACV,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ,QAAQ,WAAW,OAAO,GAAG,MAAM,GAAG,SAAS,EAAE;AAAA,IACvH;AAAA,MACE,KAAK,OAAO,KAAK,EAAE;AAAA,MACnB,MAAM,OAAO,KAAK,EAAE;AAAA,MACpB,OAAO,MAAM,EAAE,WAAW,OAAO;AAAA,MACjC,QAAQ,MAAM,EAAE,WAAW,OAAO;AAAA;AAAA,MAElC,QAAQ,MAAM,EAAE,WAAW,OAAO;AAAA,MAClC,OAAO,MAAM,EAAE,cAAc,OAAO;AAAA,MACpC,MAAM,MAAM,EAAE,cAAc,OAAO;AAAA,MACnC,SAAS,OAAO,KAAK,EAAE;AAAA,IACzB;AAAA,EACF;AACA,OAAK,GAAG,YAAY,EAAE,SAAS,GAAG,UAAU,EAAE,eAAe,OAAO,MAAM,MAAM,YAAY,CAAC;AAC7F,OAAK,GAAG,OAAO,EAAE,YAAY,aAAa,UAAU,EAAE,eAAe,MAAM,aAAa,CAAC;AACzF,OAAK,GAAG,SAAS,EAAE,SAAS,GAAG,UAAU,OAAO,OAAO,OAAO,MAAM,YAAY,CAAC;AACjF,aAAW,MAAM;AACf,WAAO,KAAK;AACZ,eAAW;AAAA,EACb,GAAG,EAAE,QAAQ;AACf;;;ACjNA,IAAM,OAAO;AACb,IAAM,gBAAgB;AACtB,IAAM,SAAS;AACf,IAAM,gBAAgB;AAEtB,IAAM,QAAQ,CAAC,OAAe,KAAa,QAAgB,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC;AAG5G,IAAMC,YAAW,CAAC,OAAe,SAAiB;AAChD,QAAM,SAAS,OAAO,WAAW,KAAK,KAAK;AAC3C,SAAO,MAAM,KAAK,EAAE,SAAS,GAAG,IAAK,SAAS,MAAO,OAAO;AAC9D;AAqBA,SAAS,QAAQ,SAAsB,QAA0C;AAC/E,MAAI,CAAC,QAAQ,YAAa,QAAO;AACjC,QAAM,QAAQ,OAAO,sBAAsB;AAC3C,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,MAAI,MAAM,QAAQ,KAAK,MAAM,SAAS,KAAK,CAAC,IAAI,SAAS,CAAC,IAAI,OAAQ,QAAO;AAC7E,MAAI,MAAM,SAAS,KAAK,MAAM,MAAM,eAAe,MAAM,QAAQ,KAAK,MAAM,OAAO,WAAY,QAAO;AACtG,QAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI,KAAK;AAC7C,QAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM;AAChD,QAAM,OAAO,MAAM,MAAM,OAAO,IAAI,MAAM,GAAG,IAAI,QAAQ,KAAK;AAC9D,QAAM,MAAM,MAAM,MAAM,MAAM,IAAI,KAAK,GAAG,IAAI,SAAS,MAAM;AAC7D,QAAM,SAAS,KAAK,IAAIA,UAAS,iBAAiB,MAAM,EAAE,qBAAqB,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AACnH,QAAM,SAASA,UAAS,iBAAiB,OAAO,EAAE,qBAAqB,IAAI,MAAM;AACjF,SAAO;AAAA,IACL,GAAG,MAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK,IAAI,OAAO;AAAA,IACxD,GAAG,MAAM,OAAO,MAAM,SAAS,UAAU,KAAK,IAAI,MAAM;AAAA,IACxD,MAAM,SAAS,GAAG,MAAM,IAAI,QAAQ,OAAO,KAAK,MAAM,IAAI,SAAS,MAAM,MAAM,MAAM,IAAI,YAAY,MAAM;AAAA,IAC3G,IAAI,+BAA+B,MAAM;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,IAAM,OAAO;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOA,SAAS,OAAO,SAAsB,QAAqB,OAAc,UAAmB;AAC1F,QAAM,OAAO,iBAAiB,MAAM;AACpC,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,aAAa,eAAe,MAAM;AACvC,OAAK,QAAQ;AACb,MAAI,CAAC,iBAAiB,KAAK,eAAe,EAAG,MAAK,MAAM,aAAa,KAAK;AAC1E,UAAQ,OAAO,IAAI;AACnB,MAAI,CAAC,SAAU,QAAO,EAAE,MAAM,MAAM,KAA2B;AAC/D,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,YAAY,OAAO;AACxB,aAAW,WAAW,KAAK,iBAAiB,qBAAqB,EAAG,YAAW,QAAQ,CAAC,MAAM,QAAQ,KAAK,EAAG,SAAQ,gBAAgB,IAAI;AAC1I,aAAW,YAAY,KAAM,MAAK,MAAM,QAAQ,IAAI,KAAK,QAAQ;AACjE,SAAO,OAAO,KAAK,OAAO;AAAA,IACxB,UAAU;AAAA,IACV,MAAM,GAAG,MAAM,IAAI;AAAA,IACnB,KAAK,GAAG,MAAM,GAAG;AAAA,IACjB,OAAO,GAAG,MAAM,KAAK;AAAA,IACrB,QAAQ,GAAG,MAAM,MAAM;AAAA,IACvB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ,CAAC;AACD,OAAK,OAAO,IAAI;AAChB,SAAO,EAAE,MAAM,KAAK;AACtB;AAGA,IAAM,UAAU,oBAAI,QAA0C;AAGvD,IAAM,aAAa,CAAC,YAAyB,QAAQ,IAAI,OAAO;AAEvE,SAAS,KAAK,SAAsB;AAClC,UAAQ,IAAI,OAAO,GAAG,KAAK;AAC3B,UAAQ,OAAO,OAAO;AACtB,OAAK,aAAa,OAAO;AACzB,aAAW,QAAQ,QAAQ,iBAAiB,aAAa,IAAI,EAAE,EAAG,MAAK,OAAO;AAC9E,cAAY,CAAC,OAAO,GAAG,YAAY;AACrC;AAGO,SAAS,UAAU,SAAsB;AAC9C,OAAK,OAAO;AACZ,QAAM,QAAQ,CAAC,GAAG,QAAQ,iBAA8B,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,QAAQ,UAAU,SAAS,WAAW,CAAC;AACnI,OAAK,aAAa,KAAK;AACvB,cAAY,OAAO,YAAY;AACjC;AAGA,IAAM,UAAU,CAAC,YAAyB;AACxC,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,SAAO,IAAI,SAAS,OAAO,IAAI,UAAU;AAC3C;AAGO,SAAS,WAAW,QAAwC,EAAE,OAAO,MAAM,IAAwB,CAAC,GAAG;AAC5G,MAAI,CAAC,QAAQ,aAAa,aAAa,EAAG;AAC1C,MAAI,CAAC,QAAQ,QAAQ,GAAG;AACtB,WAAO,gBAAgB,aAAa;AACpC;AAAA,EACF;AACA,QAAM,WAAW,OAAO,MAAM;AAC9B,QAAM,EAAE,YAAY,gBAAgB,IAAI,OAAO;AAC/C,SAAO,MAAM,aAAa,WAAW,UAAU,yCAAyC,eAAe;AACvG,SAAO,gBAAgB,aAAa;AACpC,aAAW,MAAM;AACf,WAAO,MAAM,aAAa;AAAA,EAC5B,IAAI,aAAa,mBAAmB,MAAO,EAAE;AAC/C;AAGA,SAAS,QAAQ,SAAsB,OAAsB,OAAc;AACzE,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,aAAWC,SAAQ,OAAO;AACxB,UAAM,MAAMA,MAAK,sBAAsB;AACvC,SAAK,IAAIA,OAAM,EAAE,iBAAiB,GAAG,IAAI,OAAO,IAAI,IAAI,MAAM,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC;AAAA,EACvF;AACA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,GAAG,MAAM;AAAA,IACT,QAAQ,IAAI,QAAQ,MAAM,QAAQ,IAAI,QAAQ;AAAA,IAC9C,QAAQ,IAAI,SAAS,MAAM,SAAS,IAAI,SAAS;AAAA,EACnD;AACF;AAEA,IAAM,SAAS,CAAC,UAAmB,OAAO,QAAQ,eAAe,IAAI,SAAS,IAAI,OAAO,KAAK,IAAI,MAAM,QAAQ,MAAM,KAAK;AAE3H,SAAS,YAAY,QAAqB,SAAsB;AAC9D,SAAO,CAAC,QAAQ,GAAG,OAAO,iBAA8B,IAAI,MAAM,GAAG,CAAC,EACnE,OAAO,CAAC,WAAW,OAAO,aAAa,MAAM,CAAC,EAC9C,IAAI,CAAC,YAAY;AAAA,IAChB;AAAA,IACA,QAAQ,QAAQ,cAA2B,IAAI,MAAM,KAAK,OAAO,OAAO,aAAa,MAAM,KAAK,EAAE,CAAC,IAAI;AAAA,EACzG,EAAE,EACD,OAAO,CAAC,SAA+D,KAAK,WAAW,IAAI;AAChG;AAGA,SAAS,QAAQ,SAAsB;AACrC,QAAM,MAAM,QAAQ,sBAAsB;AAC1C,QAAM,QAAQ,iBAAiB,OAAO;AACtC,QAAM,KAAK,CAAC,UAAkB,WAAW,KAAK,KAAK;AACnD,QAAM,OAAO,IAAI,OAAO,GAAG,MAAM,eAAe,IAAI,GAAG,MAAM,WAAW;AACxE,QAAM,MAAM,IAAI,MAAM,GAAG,MAAM,cAAc,IAAI,GAAG,MAAM,UAAU;AACpE,QAAM,SAAS,IAAI,SAAS,GAAG,MAAM,iBAAiB,IAAI,GAAG,MAAM,aAAa;AAChF,SAAO,EAAE,MAAM,KAAK,QAAQ,KAAK,IAAI,GAAG,SAAS,GAAG,GAAG,MAAM;AAC/D;AAEA,IAAM,SAAS,CAAC,YACd,mBAAmB,oBAAoB,mBAAmB,sBACtD,QAAQ,SAAS,QAAQ,cACxB,QAAQ,YAAY,eAAe,QAAQ,eAAe;AAGjE,SAAS,QAAQ,MAAmB,IAAiB,MAAc,UAAkB;AACnF,SAAO,IAAI,QAAc,CAAC,YAAY;AACpC,UAAM,QAAQ,QAAQ,IAAI;AAC1B,UAAM,MAAM,QAAQ,EAAE;AACtB,UAAM,WAAW,WAAW,MAAM,MAAM,QAAQ,KAAK;AACrD,UAAM,SAAS,WAAW,IAAI,MAAM,QAAQ,KAAK;AACjD,UAAM,QAAQ,SAAS;AACvB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,aAAa,eAAe,MAAM;AACxC,UAAM,aAAa,WAAW,QAAQ;AACtC,UAAM,cAAc;AACpB,WAAO,OAAO,MAAM,OAAO;AAAA,MACzB,UAAU;AAAA,MACV,OAAO;AAAA,MACP,MAAM,GAAG,MAAM,IAAI;AAAA,MACnB,KAAK,GAAG,MAAM,GAAG;AAAA,MACjB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,YAAY,MAAM,MAAM;AAAA,MACxB,UAAU,MAAM,MAAM;AAAA,MACtB,YAAY,MAAM,MAAM;AAAA,MACxB,YAAY,GAAG,MAAM,UAAU,WAAW,GAAG;AAAA,MAC7C,eAAe,MAAM,MAAM;AAAA,MAC3B,OAAO,MAAM,MAAM;AAAA,MACnB,iBAAiB;AAAA,IACnB,CAAC;AACD,aAAS,KAAK,OAAO,KAAK;AAC1B,QAAI,OAAO,MAAM,gBAAgB,WAAY,OAAM,YAAY;AAC/D,UAAM,UAAU,MAAM,UAAU,WAAW,OAAO;AAClD,SAAK,GAAG,OAAO;AAAA,MACb,GAAG,IAAI,OAAO,MAAM;AAAA,MACpB,GAAG,IAAI,MAAM,IAAI,SAAS,IAAI,SAAS,IAAI,MAAM;AAAA,MACjD;AAAA,MACA,OAAO,IAAI,MAAM;AAAA,MACjB;AAAA,MACA,MAAM,KAAK;AAAA,MACX,YAAY,MAAM;AAChB,cAAM,OAAO;AACb,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAGO,SAAS,cAAc,QAAwC;AACpE,MAAI,CAAC,OAAQ;AACb,aAAW,WAAW,CAAC,QAAQ,GAAG,OAAO,iBAAiB,IAAI,aAAa,GAAG,CAAC,EAAG,SAAQ,gBAAgB,aAAa;AACzH;AAGO,SAAS,UAAU,QAAqB,SAAsB,WAAmB,OAAO,OAAO,MAAM;AAC1G,aAAW,EAAE,QAAQ,OAAO,KAAK,YAAY,QAAQ,OAAO,GAAG;AAC7D,UAAM,OAAO,OAAO,MAAM;AAC1B,WAAO,aAAa,eAAe,EAAE;AACrC,SAAK,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC/B,SAAK,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,EAAE,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,YAAY,UAAU,CAAC,CAAC;AAAA,EACrG;AACF;AAGO,SAAS,UAAU,SAAsB,QAAqB,WAAmB,OAAO,OAAO,OAAO;AAC3G,aAAW,EAAE,QAAQ,OAAO,KAAK,YAAY,QAAQ,OAAO,GAAG;AAC7D,SAAK,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC/B,SAAK,QAAQ,QAAQ,QAAQ,OAAO,MAAM,GAAG,QAAQ,EAAE,KAAK,MAAM,OAAO,gBAAgB,aAAa,CAAC;AAAA,EACzG;AACF;AAaA,IAAM,UAAU,CAAC,SAAsB,YACrC,CAAC,GAAG,QAAQ,iBAA8B,WAAW,YAAY,CAAC,EAAE;AAAA,EAClE,CAAC,YAAY,CAAC,QAAQ,UAAU,SAAS,IAAI,KAAK,CAAC,QAAQ,UAAU,SAAS,WAAW;AAC3F;AAQK,SAAS,UAAU,SAAsB,QAA4B,UAA4B,CAAC,GAAG;AAC1G,iBAAe;AACf,QAAM,EAAE,WAAW,OAAO,OAAO,MAAM,aAAa,OAAO,SAAS,UAAU,GAAG,SAAS,MAAM,IAAI;AACpG,OAAK,OAAO;AACZ,MAAI,QAAQ,EAAG,QAAO;AACtB,QAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,MAAI,UAAU,CAAC,WAAW,UAAU,QAAQ,SAAS,MAAM,GAAG;AAC5D,QAAI,cAAc,QAAQ,MAAM,EAAG,QAAO,aAAa,eAAe,EAAE;AACxE,UAAM,SAAS,WAAW,SAAS,QAAQ,KAAK;AAChD,UAAMC,UAAS,KAAK,SAAS;AAAA,MAC3B,YAAY,MAAM;AAChB,eAAO;AACP,gBAAQ,OAAO,OAAO;AAAA,MACxB;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AACD,IAAAA,QAAO,GAAG,CAAC,GAAG,EAAE,UAAU,OAAO,OAAO,WAAW,IAAK,CAAC;AACzD,YAAQ,IAAI,SAASA,OAAM;AAC3B,WAAOA;AAAA,EACT;AACA,QAAM,QAAQ,UACV,EAAE,SAAS,GAAG,GAAG,GAAG,UAAU,OAAO,OAAO,MAAM,MAAM,cAAc,SAAS,YAAY,oBAAoB,IAC/G,EAAE,SAAS,GAAG,QAAQ,aAAa,UAAU,MAAM,KAAK,WAAW,YAAY,iBAAiB;AACpG,QAAM,YAAY,UAAU,EAAE,SAAS,GAAG,GAAG,GAAG,IAAI,EAAE,SAAS,GAAG,QAAQ,YAAY;AACtF,QAAM,QAAQ,QAAQ,SAAS,MAAM;AACrC,MAAI,CAAC,SAAS,CAAC,QAAQ;AACrB,UAAM,OAAO,KACV,SAAS;AAAA,MACR,YAAY,MAAM;AAChB,gBAAQ,OAAO,OAAO;AAAA,MACxB;AAAA,IACF,CAAC,EACA;AAAA,MACC;AAAA,MACA,EAAE,SAAS,GAAG,OAAO,KAAK;AAAA,MAC1B,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,OAAO,OAAO,UAAU,MAAM,cAAc,YAAY,oBAAoB;AAAA,IAChH;AACF,QAAI,MAAM,OAAQ,MAAK,OAAO,OAAO,WAAW,EAAE,GAAG,OAAO,UAAU,KAAK,IAAI,MAAM,UAAU,OAAO,OAAO,QAAQ,EAAE,GAAG,CAAC;AAC3H,YAAQ,IAAI,SAAS,IAAI;AACzB,WAAO;AAAA,EACT;AACA,QAAMC,QAAO,QAAQ,OAAO;AAC5B,MAAI,CAACA,MAAM,WAAU,QAAQ,SAAS,QAAQ;AAC9C,QAAM,EAAE,MAAM,KAAK,IAAI,OAAO,SAAS,QAAQ,OAAOA,KAAI;AAC1D,QAAM,QAAQA,QAAO,OAAO,QAAQ,SAAS,OAAO,KAAK;AACzD,MAAI,cAAc,QAAQ,MAAM,EAAG,QAAO,aAAa,eAAe,EAAE;AACxE,QAAM,SAAS,MAAM;AACnB,SAAK,OAAO;AACZ,YAAQ,OAAO,OAAO;AACtB,SAAK,IAAI,SAAS,EAAE,YAAY,gCAAgC,CAAC;AACjE,QAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,YAAY,2CAA2C,CAAC;AAAA,EAC9F;AACA,QAAM,WAAW,KACd,SAAS,EAAE,YAAY,QAAQ,aAAa,OAAO,CAAC,EACpD;AAAA,IACC;AAAA,IACA,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,UAAU,MAAM,MAAM,YAAY,sBAAsB;AAAA,IAClF,EAAE,GAAG,GAAG,GAAG,GAAG,UAAU,MAAM,IAAI,UAAU,MAAM,KAAK,UAAU;AAAA,IACjE;AAAA,EACF,EAEC,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,OAAO,OAAO,cAAc,MAAM,KAAK,UAAU,GAAG,CAAC;AACzF,MAAI,KAAM,UAAS,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,MAAM,MAAM,aAAa,GAAG,IAAI;AACpF,MAAI,MAAM,QAAQ;AAChB,QAAI,OAAO;AACT,eAAS;AAAA,QACP;AAAA,QACA,EAAE,GAAG,OAAO,SAAS,GAAG,QAAQ,YAAY;AAAA,QAC5C,EAAE,GAAG,GAAG,GAAG,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,aAAa,UAAU,MAAM,KAAK,UAAU;AAAA,QACpG;AAAA,MACF;AAAA,IACF,MAAO,UAAS,OAAO,OAAO,WAAW,OAAO,WAAW,GAAG;AAAA,EAChE;AACA,UAAQ,IAAI,SAAS,QAAQ;AAC7B,SAAO;AACT;AAYO,SAAS,WAAW,SAAsB,QAA4B,YAAwB,UAA6B,CAAC,GAAG;AACpI,iBAAe;AACf,QAAM,EAAE,WAAW,OAAO,OAAO,OAAO,SAAS,SAAS,MAAM,IAAI;AACpE,OAAK,OAAO;AACZ,MAAI,QAAQ,GAAG;AACb,eAAW;AACX,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ,SAAS,OAAO;AACtC,QAAM,QAAQ,QAAQ,SAAS,MAAM;AACrC,MAAI,CAAC,SAAS,CAAC,QAAQ;AACrB,UAAM,OAAO,KACV,SAAS;AAAA,MACR,YAAY,MAAM;AAChB,gBAAQ,OAAO,OAAO;AACtB,mBAAW;AACX,aAAK,IAAI,SAAS,EAAE,YAAY,oBAAoB,CAAC;AACrD,YAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,YAAY,SAAS,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC,EACA,GAAG,SAAS,EAAE,OAAO,KAAK,UAAU,MAAM,KAAK,UAAU,GAAG,CAAC,EAC7D,GAAG,SAAS,EAAE,SAAS,GAAG,UAAU,MAAM,KAAK,SAAS,GAAG,CAAC;AAC/D,QAAI,MAAM,OAAQ,MAAK,GAAG,OAAO,EAAE,QAAQ,cAAc,UAAU,MAAM,KAAK,SAAS,GAAG,CAAC;AAC3F,YAAQ,IAAI,SAAS,IAAI;AACzB,WAAO;AAAA,EACT;AACA,QAAMA,QAAO,YAAY;AACzB,MAAI,UAAU,CAACA,OAAM;AACnB,gBAAY,SAAS,QAAQ,OAAO,UAAU;AAC9C,WAAO;AAAA,EACT;AACA,QAAM,EAAE,MAAM,KAAK,IAAI,OAAO,SAAS,QAAQ,OAAOA,KAAI;AAC1D,OAAK,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;AACnD,MAAI,CAACA,OAAM;AAIT,cAAU,SAAS,QAAQ,QAAQ;AACnC,UAAM,QAAQ,QAAQ,SAAS,OAAO,KAAK;AAC3C,UAAM,YAAY,KAAK,UAAU,KAAK,SAAS;AAC/C,UAAM,SAAS,CAAC,aAAqB,UAAU,YAAY,WAAW,OAAO,OAAO,cAAc;AAClG,UAAMC,YAAW,KACd,SAAS;AAAA,MACR,YAAY,MAAM;AAChB,gBAAQ,OAAO,OAAO;AACtB,mBAAW;AACX,aAAK,OAAO;AACZ,aAAK,IAAI,SAAS,EAAE,YAAY,wCAAwC,CAAC;AACzE,YAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,YAAY,wDAAwD,CAAC;AAAA,MAC3G;AAAA,MACA,aAAa,MAAM;AACjB,aAAK,OAAO;AACZ,YAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,YAAY,wDAAwD,CAAC;AAAA,MAC3G;AAAA,IACF,CAAC,EACA;AAAA,MACC;AAAA,MACA,EAAE,UAAU,MAAM,IAAI,YAAY,sBAAsB;AAAA,MACxD,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU;AAAA,MAC/E;AAAA,IACF,EACC,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,MAAM,KAAK,UAAU,GAAG,CAAC,EAC1D,GAAG,SAAS,EAAE,SAAS,GAAG,UAAU,MAAM,YAAY,GAAG,CAAC;AAC7D,QAAI,MAAM,QAAQ;AAChB,MAAAA,UACG,GAAG,OAAO,EAAE,GAAG,OAAO,UAAU,MAAM,OAAO,GAAG,CAAC,EAEjD,GAAG,OAAO,EAAE,SAAS,GAAG,cAAc,SAAS,UAAU,MAAM,KAAK,SAAS,GAAG,CAAC,EACjF,GAAG,OAAO,EAAE,QAAQ,cAAc,UAAU,MAAM,KAAK,SAAS,GAAG,CAAC;AAAA,IACzE;AACA,YAAQ,IAAI,SAASA,SAAQ;AAC7B,WAAOA;AAAA,EACT;AAEA,QAAM,WAAW,KACd,SAAS;AAAA,IACR,YAAY,MAAM;AAChB,cAAQ,OAAO,OAAO;AACtB,iBAAW;AACX,WAAK,OAAO;AACZ,WAAK,IAAI,SAAS,EAAE,YAAY,gCAAgC,CAAC;AACjE,UAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,YAAY,2BAA2B,CAAC;AAAA,IAC9E;AAAA,IACA,aAAa,MAAM;AACjB,WAAK,OAAO;AACZ,UAAI,MAAM,OAAQ,MAAK,IAAI,OAAO,EAAE,YAAY,2BAA2B,CAAC;AAAA,IAC9E;AAAA,EACF,CAAC,EACA;AAAA,IACC;AAAA,IACA,EAAE,UAAU,MAAM,IAAI,YAAY,sBAAsB;AAAA,IACxD,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,UAAU,MAAM,MAAM,UAAU,MAAM,KAAK,UAAU;AAAA,IAC/E;AAAA,EACF,EACC,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,WAAW,KAAK,MAAM,YAAY,GAAG,WAAW,GAAG;AACvF,MAAI,MAAM,OAAQ,UAAS,GAAG,OAAO,EAAE,SAAS,GAAG,QAAQ,cAAc,UAAU,WAAW,KAAK,MAAM,YAAY,GAAG,CAAC;AACzH,MAAI,KAAM,UAAS,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,WAAW,KAAK,MAAM,YAAY,GAAG,WAAW,IAAI;AACxG,UAAQ,IAAI,SAAS,QAAQ;AAC7B,SAAO;AACT;AAOO,SAAS,oBACd,SACA,QACA,EAAE,UAAU,OAAO,SAAS,MAAM,IAA6C,CAAC,GAChF;AACA,iBAAe;AACf,QAAM,UAAU,UACZ;AAAA,IACE,GAAG,OAAO,KAAK,YAAY,SAAS,GAAG,CAAC,KAAK;AAAA,IAC7C,GAAG,OAAO,KAAK,YAAY,SAAS,GAAG,CAAC,KAAK;AAAA,IAC7C,OAAO,OAAO,KAAK,YAAY,SAAS,QAAQ,CAAC,KAAK;AAAA,EACxD,IACA;AACJ,MAAI,QAAS,MAAK,IAAI,SAAS,EAAE,YAAY,YAAY,CAAC;AAC1D,QAAM,QAAQ,QAAQ,IAAI,OAAO,QAAQ,OAAO;AAChD,MAAI,CAAC,OAAO;AACV,eAAW,MAAM;AACjB,kBAAc,MAAM;AACpB;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,OAAO;AACjC,WAAS,KAAK,OAAO,MAAM,KAAK;AAChC,aAAW,QAAQ,EAAE,MAAM,KAAK,CAAC;AACjC,OAAK,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,OAAO,OAAO,OAAO,MAAM,YAAY,CAAC;AAC9E,MAAI,QAAS,MAAK,IAAI,OAAO,EAAE,GAAG,SAAS,iBAAiB,iBAAiB,OAAO,EAAE,gBAAgB,CAAC;AACvG;AAAA,IACE;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,MAAM;AACJ,iBAAW,MAAM;AACjB,oBAAc,MAAM;AACpB,YAAM,OAAO;AACb,WAAK,OAAO;AAAA,IACd;AAAA,IACA,EAAE,OAAO;AAAA,EACX;AACF;;;AC7gBA,IAAM,kBAAkB,CAAC,aAAa,aAAa,UAAU,SAAS,oBAAoB,SAAS;AAE5F,SAAS,UAAU,SAAsB;AAC9C,MAAI,QAAQ,EAAG,QAAO;AACtB,iBAAe;AACf,SAAO,KAAK,OAAO,SAAS,EAAE,UAAU,IAAI,GAAG,EAAE,UAAU,GAAG,UAAU,OAAO,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY,YAAY,CAAC;AACxI;AAGO,SAAS,WAAW,SAAsB,EAAE,UAAU,MAAM,IAA2B,CAAC,GAAG;AAChG,iBAAe;AACf,QAAM,UAAU,UAAU,OAAO,KAAK,YAAY,SAAS,GAAG,CAAC,KAAK,IAAI;AACxE,OAAK,aAAa,OAAO;AACzB,cAAY,CAAC,OAAO,GAAG,CAAC,aAAa,aAAa,UAAU,OAAO,CAAC;AACpE,QAAM,QAAQ,QAAQ,IAAI,OAAO,QAAQ,OAAO;AAChD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,aAAa,OAAO;AACjC,WAAS,KAAK,OAAO,MAAM,KAAK;AAChC,OAAK,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,OAAO,MAAM,OAAO,MAAM,aAAa,YAAY,MAAM,KAAK,OAAO,EAAE,CAAC;AAC9G,SAAO,KAAK;AAAA,IACV;AAAA,IACA,EAAE,GAAG,SAAS,UAAU,EAAE;AAAA,IAC1B,EAAE,UAAU,KAAK,UAAU,OAAO,MAAM,OAAO,MAAM,KAAK,OAAO,YAAY,MAAM,MAAM,OAAO,EAAE;AAAA,EACpG;AACF;AAEO,SAAS,aAAa,UAAyB;AACpD,MAAI,CAAC,SAAS,UAAU,QAAQ,EAAG;AACnC,iBAAe;AACf,QAAM,EAAE,MAAM,SAAS,IAAI,aAAa,GAAG,OAAO,QAAQ,QAAQ;AAClE,OAAK,GAAG,UAAU;AAAA,IAChB,OAAO,OAAO,MAAM;AAAA,IACpB,SAAS,OAAO,MAAM;AAAA,IACtB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AACH;AAEO,SAAS,gBAAgB,UAAyB,WAAW,MAAM;AACxE,MAAI,CAAC,SAAS,OAAQ;AACtB,QAAM,UAAU,MAAM,YAAY,UAAU,eAAe;AAC3D,MAAI,CAAC,YAAY,QAAQ,GAAG;AAC1B,SAAK,aAAa,QAAQ;AAC1B,YAAQ;AACR;AAAA,EACF;AACA,QAAM,EAAE,MAAM,SAAS,IAAI,aAAa,GAAG,OAAO,QAAQ,QAAQ;AAClE,OAAK,GAAG,UAAU,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,MAAM,WAAW,QAAQ,YAAY,QAAQ,CAAC;AACpG;;;ACWA,IAAM,iBAAyC,EAAE,OAAO,UAAU,OAAO,oBAAoB,MAAM,oBAAoB;AACvH,IAAM,SAAS;AACf,IAAM,UAAU,CAAC,MAAM,MAAM,MAAM,IAAI;AACvC,IAAI,MAAM;AAEV,IAAM,OAAO,CAAC,QAAqB,SAAiB,OAAO,cAA2B,kBAAkB,IAAI,IAAI;AAEzG,SAAS,aAAa,QAA4B,UAAyB,CAAC,GAAmB;AACpG,MAAI,CAAC,QAAQ;AACX,aAAS,kCAAkC;AAC3C,WAAO,MAAM,EAAE,OAAO;AAAA,IAAC,GAAG,QAAQ;AAAA,IAAC,GAAG,SAAS;AAAA,IAAC,GAAG,QAAQ;AAAA,IAAC,GAAG,OAAO;AAAA,IAAC,GAAG,QAAQ,OAAO,YAAY,OAAO,SAAS,KAA+B,CAAC;AAAA,EACvJ;AACA,iBAAe;AACf,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,OAAO,WAAW;AAAA,IAClB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,IAAI;AACJ,QAAM,SAAS,EAAE,GAAG,gBAAgB,GAAG,QAAQ,OAAO;AACtD,QAAM,SAAS,YAAY;AAC3B,QAAM,QAAQ,YAAY;AAC1B,QAAM,QAAQ,YAAY;AAE1B,MAAI,UAAqB,CAAC;AAC1B,MAAI,SAA6B;AACjC,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,WAAW;AAKf,MAAI,YAAY;AAChB,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,OAAO,aAAa,MAAM,EAAG;AAClC,iBAAa;AACb,eAAW,MAA2B;AAAA,EACxC;AACA,MAAI,YAAY;AAEhB,MAAI,cAAc;AAElB,MAAI,cAAc,SAAU,OAAM,KAAK,QAAQ,qBAAqB,SAAS;AAC7E,MAAI,CAAC,SAAU,OAAM,KAAK,QAAQ,oBAAoB,MAAM;AAC5D,QAAM,KAAK,QAAQ,mBAAmB,OAAO;AAC7C,QAAM,QAAQ,KAAK,QAAQ,OAAO;AAClC,MAAI,SAAS,CAAC,OAAO,aAAa,YAAY,KAAK,CAAC,OAAO,aAAa,iBAAiB,GAAG;AAC1F,QAAI,CAAC,MAAM,GAAI,OAAM,KAAK,OAAO,MAAM,mBAAmB,EAAE,GAAG,EAAE;AACjE,UAAM,KAAK,QAAQ,mBAAmB,MAAM,EAAE;AAAA,EAChD;AACA,QAAM,cAAc,KAAK,QAAQ,aAAa;AAC9C,MAAI,eAAe,CAAC,OAAO,aAAa,kBAAkB,GAAG;AAC3D,QAAI,CAAC,YAAY,GAAI,OAAM,KAAK,aAAa,MAAM,yBAAyB,EAAE,GAAG,EAAE;AACnF,UAAM,KAAK,QAAQ,oBAAoB,YAAY,EAAE;AAAA,EACvD;AACA,QAAM,cAAc,KAAK,QAAQ,OAAO;AACxC,MAAI,eAAe,CAAC,YAAY,aAAa,YAAY,KAAK,CAAC,YAAY,aAAa,KAAK,GAAG;AAC9F,UAAM,KAAK,aAAa,cAAc,OAAO,KAAK;AAAA,EACpD;AACA,QAAM,SAAS,WAAW,KAAK,QAAQ,QAAQ,IAAI;AACnD,MAAI,QAAQ;AACV,UAAM,KAAK,QAAQ,mBAAmB,EAAE;AACxC,UAAM,KAAK,QAAQ,gBAAgB,OAAO;AAC1C,UAAM,KAAK,QAAQ,cAAc,OAAO,KAAK;AAAA,EAC/C;AACA,QAAM,UAAyB,CAAC;AAChC,MAAI,UAAU;AACZ,eAAW,UAAU,SAAS;AAC5B,YAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,cAAQ,YAAY;AACpB,cAAQ,QAAQ,gBAAgB;AAChC,cAAQ,QAAQ,WAAW;AAC3B,cAAQ,aAAa,eAAe,MAAM;AAC1C,aAAO,OAAO,OAAO;AACrB,cAAQ,KAAK,OAAO;AAAA,IACtB;AACA,UAAM,IAAI,MAAM,QAAQ,QAAQ,CAAC,WAAW,OAAO,OAAO,CAAC,CAAC;AAAA,EAC9D;AAEA,QAAM,OAAO,CAAC,MAAc,aAAa,OAAO,SAAkC,CAAC,MACjF,OAAO,cAAc,IAAI,YAAY,MAAM,EAAE,SAAS,MAAM,YAAY,QAAQ,EAAE,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC;AAE1G,QAAM,aAAa,MAAM;AACvB,eAAW,WAAW,QAAQ,OAAO,CAAC,EAAE,QAAQ,EAAG,SAAQ;AAAA,EAC7D;AAEA,QAAM,iBAAiB,MAAM;AAC3B,QAAI,CAAC,SAAU;AACf,eAAW;AACX,QAAI,OAAO,OAAO,gBAAgB,cAAc,OAAO,aAAa,SAAS,GAAG;AAC9E,UAAI;AACF,eAAO,YAAY;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO,gBAAgB,SAAS;AAChC,kBAAc,MAAM;AACpB,QAAI,QAAQ;AACV,aAAO,aAAa,gBAAgB,OAAO;AAC3C,aAAO,aAAa,cAAc,OAAO,KAAK;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,gBAAgB,MAAM;AAC1B,cAAU,MAAM;AAChB,eAAW;AACX,aAAS;AACT,cAAU;AACV,eAAW,MAAM;AACjB,kBAAc,MAAM;AACpB,SAAK,WAAW;AAChB,YAAQ,UAAU;AAAA,EACpB;AAEA,QAAM,OAAO,MAAM;AACjB,QAAI,CAAC,YAAY,YAAY,CAAC,UAAU,CAAC,kBAAkB,EAAG;AAC9D,UAAM,MAAM,OAAO,sBAAsB;AACzC,UAAM,OAAO,WAAW,QAAQ,KAAK,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO;AAC1G,UAAM,UAAU,SAAS;AAEzB,UAAM,gBAAgB,iBAAiB,QAAQ,YAAY;AAC3D,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,aAAa,eAAe,MAAM;AACvC,WAAO,OAAO,KAAK,OAAO;AAAA,MACxB,UAAU;AAAA,MACV,OAAO;AAAA,MACP,YAAY,cAAc,cAAc,cAAc;AAAA,MACtD,gBAAgB,cAAc;AAAA,MAC9B,eAAe;AAAA,IACjB,CAAC;AACD,kBAAc;AACd,aAAS,KAAK,OAAO,IAAI;AACzB,WAAO,aAAa,WAAW,QAAQ;AACvC,QAAI,OAAO,OAAO,gBAAgB,WAAY,QAAO,YAAY;AAAA,QAC5D,WAAU,QAAQ,KAAK;AAC5B,eAAW,QAAQ,IAAI;AACvB,SAAK,GAAG,MAAM,EAAE,SAAS,GAAG,UAAU,QAAQ,IAAI,IAAI,OAAO,MAAM,QAAQ,MAAM,KAAK,WAAW,YAAY,MAAM,KAAK,OAAO,EAAE,CAAC;AAClI,eAAW;AACX,QAAI,QAAQ;AACV,aAAO,aAAa,gBAAgB,MAAM;AAC1C,aAAO,aAAa,cAAc,OAAO,IAAI;AAAA,IAC/C;AACA,eAAW,QAAQ,EAAE,MAAM,KAAK,CAAC;AACjC,QAAI,mBAAmB,eAAe,OAAO,SAAS,OAAO,EAAG,SAAQ,MAAM;AAAA,EAChF;AAEA,QAAM,OAAO,MAAM;AACjB,QAAI,CAAC,YAAY,CAAC,SAAU;AAC5B,UAAM,MAAM,OAAO,sBAAsB;AACzC,UAAM,UAAU,SAAS;AACzB,eAAW;AACX,QAAI,OAAO,OAAO,gBAAgB,WAAY,QAAO,YAAY;AACjE,WAAO,gBAAgB,SAAS;AAChC,kBAAc;AACd,cAAU,QAAQ,KAAK;AACvB,eAAW,QAAQ,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,OAAO,IAAI,OAAO,QAAQ,IAAI,OAAO,CAAC;AACzF,QAAI,SAAU,MAAK,aAAa,QAAQ,IAAI;AAC5C,gBAAY,QAAQ;AACpB,QAAI,QAAQ;AACV,aAAO,aAAa,gBAAgB,OAAO;AAC3C,aAAO,aAAa,cAAc,OAAO,KAAK;AAAA,IAChD;AACA,QAAI,mBAAmB,eAAe,OAAO,SAAS,OAAO,EAAG,SAAQ,MAAM;AAAA,EAChF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,OAAO;AACT,YAAM,SAAS,CAAC,GAAG,SAAS,iBAA8B,oBAAoB,CAAC;AAC/E,mBAAa,MAAM;AACnB,YAAM,OAAO,SAAS;AACtB,YAAM,WAAW,KAAK,MAAM;AAC5B,WAAK,MAAM,WAAW;AACtB,cAAQ,KAAK,MAAM;AACjB,aAAK,MAAM,WAAW;AACtB,YAAI,KAAK,aAAa,OAAO,MAAM,GAAI,MAAK,gBAAgB,OAAO;AACnE,wBAAgB,QAAQ,CAAC,WAAW;AAAA,MACtC,CAAC;AAAA,IACH;AACA,QAAI,cAAc,OAAO,mBAAmB,YAAY;AACtD,UAAI,OAAO,OAAO;AAClB,UAAI,WAAmC;AACvC,YAAM,WAAW,IAAI,eAAe,MAAM;AACxC,YAAI,UAAU,SAAS,EAAG;AAC1B,cAAM,OAAO,OAAO;AACpB,cAAM,WAAW;AACjB,eAAO;AAEP,YAAI,YAAY,KAAK,IAAI,OAAO,QAAQ,IAAI,KAAK,CAAC,YAAY,WAAW,MAAM,KAAK,QAAQ,EAAG;AAC/F,mBAAW,KAAK;AAAA,UACd;AAAA,UACA,EAAE,QAAQ,SAAS;AAAA,UACnB;AAAA,YACE,QAAQ;AAAA,YACR,UAAU,OAAO,OAAO;AAAA,YACxB,MAAM,KAAK;AAAA,YACX,YAAY;AAAA,YACZ,YAAY,MAAM;AAChB,qBAAO,OAAO;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,eAAS,QAAQ,MAAM;AACvB,cAAQ,KAAK,MAAM;AACjB,iBAAS,WAAW;AACpB,kBAAU,KAAK;AACf,oBAAY,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC;AAAA,MAClC,CAAC;AAAA,IACH;AACA,QAAI,MAAM;AACR,cAAQ;AAAA,QACN,kBAAkB,QAAQ;AAAA,UACxB,SAAS,MAAM,CAAC,WAAW,MAAM,KAAK,CAAC,YAAY,CAAC,WAAW;AAAA,UAC/D,WAAW,MAAM,MAAM,IAAI;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,cAAc,UAAU;AAC1B,YAAM,WAAW,MAAM;AACrB,YAAI,UAAU,CAAC,SAAU,eAAc,QAAQ,QAAQ,cAAc,OAAO,sBAAsB,IAAI,IAAI;AAAA,MAC5G;AACA,uBAAiB,UAAU,QAAQ;AACnC,cAAQ,KAAK,MAAM;AACjB,4BAAoB,UAAU,QAAQ;AACtC,oBAAY,MAAM;AAAA,MACpB,CAAC;AAAA,IACH;AACA,QAAI,YAAY,QAAQ;AACtB,cAAQ,KAAK,eAAe,QAAQ,EAAE,KAAK,UAAU,QAAQ,SAAS,YAAY,MAAM,UAAU,OAAO,MAAM,KAAK,CAAC,CAAC;AACtH,YAAM,WAAW,MAAM;AACrB,YAAI,YAAY,CAAC,kBAAkB,EAAG,MAAK;AAAA,MAC7C;AACA,uBAAiB,UAAU,QAAQ;AACnC,cAAQ,KAAK,MAAM,oBAAoB,UAAU,QAAQ,CAAC;AAAA,IAC5D;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,WAAgC;AAC5C,QAAI,aAAa,OAAQ;AACzB,UAAM,SAAS,SAAS;AAExB,aAAS,WAAW,SAAY,SAAS,kBAAkB,eAAe,WAAW,SAAS,QAAQ,CAAC,OAAO,SAAS,MAAM,IAAI,SAAS;AAC1I,cAAU;AACV,aAAS;AACT,cAAU,QAAQ,KAAK;AACvB,QAAI,cAAc,SAAU,eAAc,QAAQ,QAAQ,sBAAsB,CAAC;AACjF,QAAI,YAAY,MAAO,MAAK,aAAa,QAAQ,IAAI;AACrD,QAAI,MAAO,WAAU,MAAM;AAAA,QACtB,WAAU,QAAQ,QAAQ,EAAE,YAAY,MAAM,QAAQ,SAAS,QAAQ,mBAAmB,QAAQ,qBAAqB,OAAU,CAAC;AACvI,iBAAa;AAEb,WAAO,cAA2B,MAAM,GAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AACxE,SAAK,WAAW,OAAO,EAAE,QAAQ,OAAO,CAAC;AACzC,YAAQ,SAAS;AAAA,EACnB;AAGA,QAAM,QAAQ,CAAC,UAAU,UAAU;AACjC,QAAI,aAAa,CAAC,UAAU,QAAS;AACrC,QAAI,CAAC,KAAK,YAAY,MAAM,EAAE,QAAQ,CAAC,EAAG;AAC1C,cAAU;AAEV,QAAI,MAAO,YAAW,QAAQ,EAAE,QAAQ,CAAC;AAAA,QACpC,qBAAoB,QAAQ,QAAQ,EAAE,SAAS,OAAO,CAAC;AAC5D,eAAW;AACX,QAAI,SAAU,gBAAe;AAC7B,QAAI,OAAO,aAAa,MAAM,EAAG,YAAW,MAA2B;AACvE,aAAS;AACT,cAAU;AACV,QAAI,QAAQ,YAAa,QAAO,MAAM;AACtC,SAAK,WAAW;AAChB,YAAQ,UAAU;AAAA,EACpB;AAEA,QAAM,GAAG,QAAQ,UAAU,CAAC,UAAU;AACpC,UAAM,eAAe;AACrB,UAAM;AAAA,EACR,CAAC;AACD,QAAM,GAAG,QAAQ,SAAS,MAAM;AAC9B,QAAI,YAAY,GAAG;AACjB,mBAAa;AACb;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,QAAS;AACxB,kBAAc;AAAA,EAChB,CAAC;AACD,QAAM,GAAG,QAAQ,WAAW,CAAC,UAAU;AAErC,QAAK,MAAwB,QAAQ,YAAY,UAAU;AACzD,YAAM,eAAe;AACrB,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACD,QAAM,GAAG,QAAQ,SAAS,CAAC,UAAU;AACnC,UAAM,SAAS,MAAM;AACrB,QAAI,QAAQ,QAAQ,yCAAyC,KAAK,OAAO,SAAS,MAAM,GAAG;AACzF,YAAM;AACN;AAAA,IACF;AACA,QAAI,WAAW,UAAU,CAAC,mBAAmB,SAAU;AACvD,UAAM,QAAQ;AACd,UAAM,MAAM,OAAO,sBAAsB;AACzC,QAAI,MAAM,UAAU,IAAI,QAAQ,MAAM,UAAU,IAAI,SAAS,MAAM,UAAU,IAAI,OAAO,MAAM,UAAU,IAAI,OAAQ,OAAM;AAAA,EAC5H,CAAC;AACD,QAAM,YAAY,aAAa,OAAO,OAAO,KAAK,YAAY;AAC9D,MAAI,WAAW;AACb,UAAM,WAAW,kBAAkB,OAAO,QAAQ,eAAe,IAAI,SAAS,IAAI,OAAO,SAAS,IAAI,SAAS;AAC/G,UAAM,GAAG,UAAU,SAAS,CAAC,UAAU;AACrC,YAAM,UAAW,MAAM,QAA2B,QAAqB,QAAQ;AAC/E,UAAI,CAAC,WAAW,OAAO,SAAS,OAAO,EAAG;AAC1C,YAAM,eAAe;AACrB,UAAI,OAAQ,OAAM;AAAA,UACb,MAAK,OAAO;AAAA,IACnB,CAAC;AAAA,EACH;AACA,SAAO,QAAQ,UAAU;AAEzB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM,MAAM;AAAA,IACnB,QAAQ,CAAC,WAAiC,SAAS,MAAM,IAAI,KAAK,MAAM;AAAA,IACxE,OAAO;AAAA,IACP;AAAA,IACA,IAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,IACA,IAAI,aAAa;AACf,aAAO;AAAA,IACT;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AACR,UAAI,UAAW;AACf,oBAAc;AACd,UAAI,QAAQ;AACV,uBAAe;AACf,kBAAU;AACV,YAAI,OAAO,aAAa,MAAM,EAAG,YAAW,MAA2B;AACvE,sBAAc;AAAA,MAChB;AACA,kBAAY;AACZ,iBAAW;AACX,WAAK,aAAa,MAAM;AACxB,kBAAY,CAAC,MAAM,GAAG,CAAC,GAAG,cAAc,QAAQ,CAAC;AACjD,YAAM,QAAQ;AACd,aAAO,OAAO,QAAQ;AAAA,IACxB;AAAA,EACF;AACF;;;ACrZA,IAAM,OAAO;AAEN,SAAS,WAAW,QAA4B,UAAuB,CAAC,GAAiB;AAC9F,MAAI,CAAC,QAAQ;AACX,aAAS,gCAAgC;AACzC,WAAO,MAAM;AAAA,MACX,OAAO;AAAA,MAAC;AAAA,MACR,QAAQ;AAAA,MAAC;AAAA,MACT,SAAS;AAAA,MAAC;AAAA,MACV,QAAQ;AAAA,MAAC;AAAA,MACT,OAAO;AAAA,MAAC;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,OAAO,CAAC;AAAA,IACV,CAAC;AAAA,EACH;AACA,QAAM,EAAE,gBAAgB,KAAK,IAAI;AACjC,QAAM,QAAQ,YAAY;AAC1B,MAAI;AACJ,MAAI,QAAQ,QAAQ;AAClB,UAAM,KAAK,QAAQ,kBAAkB,EAAE;AACvC,UAAM,KAAK,QAAQ,SAAS,OAAO,aAAa,OAAO,CAAC;AACxD,eAAW,QAAQ,OAAO,iBAA8B,IAAI,EAAG,OAAM,KAAK,MAAM,SAAS,KAAK,aAAa,OAAO,CAAC;AACnH,UAAM,IAAI,MAAM,iBAAiB,KAAK,CAAC;AAAA,EACzC;AACA,QAAM,QAAQ,MAAM,CAAC,GAAG,OAAO,iBAA8B,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,aAAa,UAAU,KAAK,KAAK,aAAa,eAAe,MAAM,MAAM;AAEpK,QAAM,KAAK,QAAQ,QAAQ,MAAM;AAEjC,QAAM,YAAY,MAAM;AACtB,eAAW,QAAQ,OAAO,iBAA8B,IAAI,GAAG;AAC7D,YAAM,KAAK,MAAM,QAAQ,UAAU;AACnC,YAAM,KAAK,MAAM,YAAY,IAAI;AAAA,IACnC;AAAA,EACF;AACA,YAAU;AAEV,QAAM,UAAU,aAAa,QAAQ;AAAA,IACnC,GAAG;AAAA,IACH,WAAW;AAAA,IACX,UAAU;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,QAAQ,MAAM;AACZ,gBAAU;AACV,YAAMC,QAAO,MAAM;AACnB,UAAI,QAAQ,UAAU,CAAC,QAAQ,GAAG;AAChC,yBAAiB,KAAK;AACtB,0BAAkB,KAAK,SAAS,EAC7B,OAAO,QAAQ,EAAE,UAAU,oBAAoB,GAAG,EAAE,UAAU,mBAAmB,UAAU,OAAO,WAAW,MAAM,MAAM,WAAW,CAAC,EACrI,OAAOA,OAAM,EAAE,UAAU,OAAO,WAAW,KAAK,GAAG,EAAE,UAAU,GAAG,UAAU,OAAO,WAAW,SAAS,SAAS,OAAO,WAAW,SAAS,MAAM,WAAW,GAAG,CAAC;AAAA,MACrK,MAAO,YAAWA,KAAI;AACtB,MAAAA,MAAK,CAAC,GAAG,MAAM,EAAE,eAAe,KAAK,CAAC;AACtC,cAAQ,SAAS;AAAA,IACnB;AAAA,EACF,CAAC;AAED,QAAM,SAAS,CAAC,SAAsB;AACpC,UAAM,QAAQ,KAAK,QAAQ,WAAW,KAAK,aAAa,KAAK,KAAK;AAClE,WAAO,cAAc,IAAI,YAAY,aAAa,EAAE,SAAS,MAAM,QAAQ,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC;AAC7F,YAAQ,WAAW,OAAO,IAAI;AAC9B,QAAI,cAAe,SAAQ,MAAM;AAAA,EACnC;AAEA,QAAM,GAAG,QAAQ,SAAS,CAAC,UAAU;AACnC,UAAM,OAAQ,MAAM,QAA2B,QAAqB,IAAI;AACxE,QAAI,QAAQ,OAAO,SAAS,IAAI,KAAK,MAAM,EAAE,SAAS,IAAI,EAAG,QAAO,IAAI;AAAA,EAC1E,CAAC;AACD,QAAM,GAAG,QAAQ,WAAW,CAAC,UAAU;AACrC,UAAM,MAAO,MAAwB;AACrC,UAAMA,QAAO,MAAM;AACnB,QAAI,CAACA,MAAK,OAAQ;AAClB,UAAM,KAAKA,MAAK,QAAQ,SAAS,aAA4B;AAC7D,UAAM,QAAgC;AAAA,MACpC,WAAW,KAAK,IAAI,KAAK,KAAK,KAAKA,MAAK;AAAA,MACxC,SAAS,KAAK,IAAIA,MAAK,SAAS,KAAK,KAAK,IAAIA,MAAK,UAAUA,MAAK;AAAA,MAClE,MAAM;AAAA,MACN,KAAKA,MAAK,SAAS;AAAA,IACrB;AACA,QAAI,OAAO,OAAO;AAChB,YAAM,eAAe;AACrB,MAAAA,MAAK,MAAM,GAAG,CAAC,GAAG,MAAM;AACxB;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACrB,SAAK,QAAQ,WAAW,QAAQ,QAAQA,MAAK,SAAS,MAAM,KAAK,CAAC,OAAO,QAAQ,iBAAiB,GAAG;AACnG,YAAM,eAAe;AACrB,aAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ;AAAA,IACd,IAAI,SAAS;AACX,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,IAAI,aAAa;AACf,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,IAAI,QAAQ;AACV,aAAO,MAAM;AAAA,IACf;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AACR,cAAQ,QAAQ;AAChB,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AACF;","names":["gsap","running","part","id","spring","gsap","position","stop","pointer","PLACED","onMove","stop","now","part","current","radiusOf","part","window","list","timeline","list"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gl/shared/shaders.ts","../src/gl/shared/create-shader-effect.ts","../src/gl/liquid-blend/shader.ts","../src/gl/liquid-blend/create-liquid-blend.ts","../src/gl/matcap/shader.ts","../src/gl/matcap/create-matcap.ts","../src/gl/shader-grain/shader.ts","../src/gl/shader-grain/create-shader-grain.ts","../src/gl/shader-blur/shader.ts","../src/gl/shader-blur/create-shader-blur.ts","../src/gl/particle-hero/shaders.ts","../src/gl/particle-hero/create-particle-hero.ts"],"sourcesContent":["export const fullscreenVertex = `\nattribute vec2 position;\nvarying vec2 vUv;\nvoid main() {\n vUv = position * .5 + .5;\n gl_Position = vec4(position, 0., 1.);\n}`;\n\nexport const fragmentHeader = `\nprecision highp float;\nvarying vec2 vUv;\nuniform sampler2D uImage0;\nuniform sampler2D uImage1;\nuniform vec2 uSize;\nuniform vec2 uImageSize0;\nuniform vec2 uImageSize1;\nuniform float uTime;\nuniform float uProgress;\nuniform float uAmount;\nuniform float uHasImage;\nvec2 cover(vec2 uv, vec2 imageSize) {\n float aspect = uSize.x / uSize.y;\n float imageAspect = imageSize.x / imageSize.y;\n vec2 scale = vec2(min(aspect / imageAspect, 1.), min(imageAspect / aspect, 1.));\n return (uv - .5) * scale + .5;\n}\nfloat noise(vec2 point) {\n return fract(sin(dot(point, vec2(12.9898, 78.233))) * 43758.5453);\n}\n`;\n","import { whileVisible } from '../../core/loop';\nimport { clamp } from '../../core/math';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { inert, type Instance } from '../../core/types';\nimport { fragmentHeader, fullscreenVertex } from './shaders';\n\nexport interface ShaderEffectOptions {\n images?: HTMLImageElement[];\n progress?: number;\n amount?: number;\n maxDpr?: number;\n}\nexport interface ShaderEffectInstance extends Instance {\n readonly mode: 'webgl' | 'none';\n setProgress(progress: number): void;\n setAmount(amount: number): void;\n pause(): void;\n resume(): void;\n}\n\ninterface Renderer {\n draw(time: number, progress: number, amount: number): void;\n upload(): boolean;\n destroy(): void;\n}\n\nfunction createRenderer(canvas: HTMLCanvasElement, fragment: string, images: HTMLImageElement[]): Renderer {\n const gl = canvas.getContext('webgl', { alpha: true, antialias: false, premultipliedAlpha: false });\n if (!gl) throw new Error('WebGL unavailable');\n const releases: Array<() => void> = [];\n const destroy = () => { releases.splice(0).reverse().forEach((release) => release()); };\n try {\n const compile = (type: number, source: string) => {\n const shader = gl.createShader(type);\n if (!shader) throw new Error('Shader allocation failed');\n releases.push(() => gl.deleteShader(shader));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(shader) ?? 'Shader failed');\n return shader;\n };\n const vertex = compile(gl.VERTEX_SHADER, fullscreenVertex);\n const pixel = compile(gl.FRAGMENT_SHADER, fragmentHeader + fragment);\n const program = gl.createProgram();\n if (!program) throw new Error('Program allocation failed');\n releases.push(() => gl.deleteProgram(program));\n gl.attachShader(program, vertex);\n gl.attachShader(program, pixel);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(program) ?? 'Link failed');\n gl.useProgram(program);\n const buffer = gl.createBuffer();\n if (!buffer) throw new Error('Buffer allocation failed');\n releases.push(() => gl.deleteBuffer(buffer));\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n const attribute = gl.getAttribLocation(program, 'position');\n gl.enableVertexAttribArray(attribute);\n gl.vertexAttribPointer(attribute, 2, gl.FLOAT, false, 0, 0);\n const names = ['uSize', 'uImageSize0', 'uImageSize1', 'uTime', 'uProgress', 'uAmount', 'uImage0', 'uImage1', 'uHasImage'] as const;\n const uniforms = Object.fromEntries(names.map((name) => [name, gl.getUniformLocation(program, name)]));\n const textures = [0, 1].map((index) => {\n const texture = gl.createTexture();\n if (!texture) throw new Error('Texture allocation failed');\n releases.push(() => gl.deleteTexture(texture));\n gl.activeTexture(gl.TEXTURE0 + index);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([26, 40, 55, 255]));\n gl.uniform1i(uniforms[`uImage${index}`]!, index);\n return texture;\n });\n const upload = () => {\n if (images.some((image) => !image.complete || !image.naturalWidth)) return false;\n gl.useProgram(program);\n images.slice(0, 2).forEach((image, index) => {\n gl.activeTexture(gl.TEXTURE0 + index);\n gl.bindTexture(gl.TEXTURE_2D, textures[index]!);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);\n });\n return true;\n };\n return {\n upload,\n draw(time, progress, amount) {\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.useProgram(program);\n gl.uniform2f(uniforms.uSize!, canvas.width, canvas.height);\n [0, 1].forEach((index) => gl.uniform2f(uniforms[`uImageSize${index}`]!, images[index]?.naturalWidth || 1, images[index]?.naturalHeight || 1));\n gl.uniform1f(uniforms.uTime!, time);\n gl.uniform1f(uniforms.uProgress!, progress);\n gl.uniform1f(uniforms.uAmount!, amount);\n gl.uniform1f(uniforms.uHasImage!, images.length ? 1 : 0);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n },\n destroy,\n };\n } catch (error) {\n destroy();\n throw error;\n }\n}\n\nexport function createShaderEffect(root: HTMLElement | null, fragment: string, options: ShaderEffectOptions = {}): ShaderEffectInstance {\n if (!root) return inert({ mode: 'none' as const, setProgress() {}, setAmount() {}, pause() {}, resume() {} });\n const scope = createScope();\n const canvas = document.createElement('canvas');\n canvas.className = 'mk-shader__canvas';\n canvas.setAttribute('aria-hidden', 'true');\n canvas.hidden = true;\n const images = (options.images ?? [...root.querySelectorAll('img')]).slice(0, 2);\n if (images.length === 1) images.push(images[0]!);\n let renderer: Renderer | null = null;\n let mode: ShaderEffectInstance['mode'] = 'none';\n let progress = clamp(options.progress ?? 0, 0, 1);\n let amount = clamp(options.amount ?? 1, 0, 100);\n let time = 0;\n let paused = false;\n let ready = false;\n const draw = () => {\n if (!scope.disposed && ready && renderer && mode === 'webgl') renderer.draw(time, progress, amount);\n };\n const fallback = () => {\n mode = 'none';\n ready = false;\n canvas.hidden = true;\n };\n const load = () => {\n if (scope.disposed || !renderer) return;\n try {\n ready = renderer.upload();\n canvas.hidden = !ready;\n if (ready) mode = 'webgl';\n draw();\n } catch { fallback(); }\n };\n const resize = (render = true) => {\n if (scope.disposed) return;\n const rect = root.getBoundingClientRect();\n const dpr = Math.min(typeof devicePixelRatio === 'number' ? devicePixelRatio : 1, Math.max(0.5, options.maxDpr ?? 1.5));\n canvas.width = Math.max(1, Math.round(rect.width * dpr));\n canvas.height = Math.max(1, Math.round(rect.height * dpr));\n if (render) draw();\n };\n const initialize = () => {\n renderer?.destroy();\n renderer = null;\n try {\n renderer = createRenderer(canvas, fragment, images);\n mode = 'webgl';\n resize(false);\n load();\n return true;\n } catch { fallback(); return false; }\n };\n if (!initialize()) { scope.dispose(); return inert({ mode: 'none' as const, setProgress() {}, setAmount() {}, pause() {}, resume() {} }); }\n scope.attr(root, 'class', `${root.className} mk-shader`.trim());\n root.append(canvas);\n scope.add(() => { renderer?.destroy(); renderer = null; canvas.remove(); mode = 'none'; });\n images.forEach((image) => {\n scope.on(image, 'load', load);\n scope.on(image, 'error', fallback);\n });\n scope.on(canvas, 'webglcontextlost', (event) => { event.preventDefault(); fallback(); });\n scope.on(canvas, 'webglcontextrestored', initialize);\n if (typeof ResizeObserver === 'function') scope.observe(new ResizeObserver(() => resize())).observe(root);\n scope.on(window, 'resize', () => resize());\n if (!reduced()) scope.add(whileVisible(root, (dt) => {\n if (paused || document.hidden || mode === 'none') return;\n time += dt / 60;\n draw();\n }));\n return {\n get mode() { return mode; },\n setProgress(value) { if (scope.disposed || !Number.isFinite(value)) return; progress = clamp(value, 0, 1); draw(); },\n setAmount(value) { if (scope.disposed || !Number.isFinite(value)) return; amount = clamp(value, 0, 100); draw(); },\n pause() { paused = true; },\n resume() { paused = false; },\n destroy: () => scope.dispose(),\n };\n}\n","export const liquidFragment = `\nvoid main() {\n float center = 1. - smoothstep(0., .5, distance(vUv, vec2(.5)));\n vec2 wave = vec2(sin(vUv.y * 18. + uTime), cos(vUv.x * 20. - uTime));\n vec2 distortion = wave * center * uAmount;\n vec2 currentUv = cover(vUv + distortion * uProgress, uImageSize0);\n vec2 nextUv = cover(vUv - distortion * (1. - uProgress), uImageSize1);\n gl_FragColor = mix(texture2D(uImage0, currentUv), texture2D(uImage1, nextUv), uProgress);\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { liquidFragment } from './shader';\n\nexport type LiquidBlendOptions = ShaderEffectOptions;\nexport type LiquidBlendInstance = ShaderEffectInstance;\nexport const createLiquidBlend = (root: HTMLElement | null, options: LiquidBlendOptions = {}): LiquidBlendInstance =>\n createShaderEffect(root, liquidFragment, { amount: 0.15, ...options });\n","export const matcapFragment = `\nvoid main() {\n vec2 point = (vUv - .5) * 2.5;\n point.x *= uSize.x / uSize.y;\n float radius = length(point);\n if (radius > 1.) { gl_FragColor = vec4(.04, .06, .08, 1.); return; }\n vec3 normal = normalize(vec3(point, sqrt(max(0., 1. - dot(point, point)))));\n float angle = uTime * .2 + uProgress * 6.28318;\n vec2 rotated = mat2(cos(angle), -sin(angle), sin(angle), cos(angle)) * normal.xy;\n vec2 matcapUv = rotated * .495 + .5;\n float hemisphere = clamp(1. - dot(normalize(vec3(1., -1., 1.)), normal), 0., 1.);\n vec3 metal = mix(vec3(.1), vec3(1.), hemisphere) + pow(normal.z, 24.) * uAmount;\n vec3 mapped = texture2D(uImage0, matcapUv).rgb;\n metal = mix(metal, mapped + metal * .15, uHasImage);\n gl_FragColor = vec4(metal, 1.);\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { matcapFragment } from './shader';\n\nexport type MatcapOptions = ShaderEffectOptions;\nexport type MatcapInstance = ShaderEffectInstance;\nexport const createMatcap = (root: HTMLElement | null, options: MatcapOptions = {}): MatcapInstance =>\n createShaderEffect(root, matcapFragment, { amount: 0.15, ...options });\n","export const grainFragment = `\nvoid main() {\n vec4 color = texture2D(uImage0, cover(vUv, uImageSize0));\n float grain = noise(floor(vUv * uSize) + floor(uTime * 24.)) - .5;\n gl_FragColor = vec4(color.rgb + grain * uAmount, color.a);\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { grainFragment } from './shader';\n\nexport type ShaderGrainOptions = ShaderEffectOptions;\nexport type ShaderGrainInstance = ShaderEffectInstance;\nexport const createShaderGrain = (root: HTMLElement | null, options: ShaderGrainOptions = {}): ShaderGrainInstance =>\n createShaderEffect(root, grainFragment, { amount: 0.07, ...options });\n","export const blurFragment = `\nvoid main() {\n vec2 uv = cover(vUv, uImageSize0);\n float angle = uProgress * 1.5707963;\n vec2 delta = vec2(cos(angle), sin(angle)) * uAmount / uImageSize0;\n vec4 color = texture2D(uImage0, uv) * .1964825501511404;\n color += (texture2D(uImage0, uv + delta * 1.411764705882353) + texture2D(uImage0, uv - delta * 1.411764705882353)) * .2969069646728344;\n color += (texture2D(uImage0, uv + delta * 3.2941176470588234) + texture2D(uImage0, uv - delta * 3.2941176470588234)) * .09447039785044732;\n color += (texture2D(uImage0, uv + delta * 5.176470588235294) + texture2D(uImage0, uv - delta * 5.176470588235294)) * .010381362401148057;\n gl_FragColor = color;\n}`;\n","import { createShaderEffect, type ShaderEffectInstance, type ShaderEffectOptions } from '../shared/create-shader-effect';\nimport { blurFragment } from './shader';\n\nexport type ShaderBlurOptions = ShaderEffectOptions;\nexport type ShaderBlurInstance = ShaderEffectInstance;\nexport const createShaderBlur = (root: HTMLElement | null, options: ShaderBlurOptions = {}): ShaderBlurInstance =>\n createShaderEffect(root, blurFragment, { amount: 5, ...options });\n","/*\n * Shaders for the particle hero. Own GLSL (not iyo's): state texture XY = position,\n * ZW = velocity; the simulation pulls each point toward the zero lines of a\n * radial / grid / square field mixed with a Chladni plate (four Newton-like\n * projections, step .4) or toward a word, and pushes it away from the pointer.\n */\n\nexport const fullscreenVertex = `#version 300 es\nprecision highp float;\nout vec2 vUv;\nvoid main() {\n vec2 p = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2);\n vUv = p;\n gl_Position = vec4(p * 2. - 1., 0., 1.);\n}`;\n\nexport const simulationFragment = `#version 300 es\nprecision highp float;\nin vec2 vUv;\nuniform sampler2D uState, uMask;\nuniform float uTime, uDt, uMix, uFrequency, uDistortion, uNoise, uJitter, uMouseSpeed, uAspect;\nuniform vec2 uModes, uMouse;\nuniform int uPattern;\nout vec4 outState;\nfloat hash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); }\nfloat field(vec2 p) {\n float base = sin(length(p) * uFrequency * .35);\n if (uPattern == 1) base = sin(p.x * uFrequency * .35) * sin(p.y * uFrequency * .35);\n if (uPattern == 2) base = sin(max(abs(p.x), abs(p.y)) * uFrequency * .35);\n float chladni = sin(uModes.x * 3.14159265 * (p.x + 1.) * .5) * sin(uModes.y * 3.14159265 * (p.y + 1.) * .5);\n float spots = (hash(floor(p * 12.)) - .5) * uNoise * .08;\n float jitter = sin(uTime * 42. + hash(p * 30.) * 6.283) * uJitter * .015;\n return mix(base, chladni, clamp(uDistortion * .2, 0., .85)) + spots + jitter;\n}\nvoid main() {\n vec4 state = texture(uState, vUv);\n vec2 pos = state.xy;\n vec2 vel = state.zw;\n vec2 p = (vUv - .5) * 2.;\n for (int i = 0; i < 4; i++) {\n float f = field(p);\n float e = .003;\n vec2 g = vec2(field(p + vec2(e, 0.)) - field(p - vec2(e, 0.)), field(p + vec2(0., e)) - field(p - vec2(0., e))) / (2. * e);\n float q = dot(g, g);\n if (q > .00001) p -= f * g / q * .4;\n }\n vec2 word = texture(uMask, vUv).xy;\n float text = step(hash(vUv), uMix);\n vec2 target = mix(p * .88, word, text);\n target.x *= max(uAspect, 1.);\n float dt60 = uDt * 60.;\n vel *= pow(.91, dt60);\n vec2 delta = target - pos;\n float dist = length(delta);\n if (dist > .004 * (1. - text)) vel += delta / max(dist, .00001) * mix(.0016, .0009, text) * dt60;\n vec2 away = pos - uMouse;\n float r = length(away);\n vel += away / max(r, .0001) * (1. - smoothstep(0., .28, r)) * uMouseSpeed * .017 * dt60;\n vel += vec2(sin(uTime + vUv.x * 400.), cos(uTime + vUv.y * 400.)) * .00003 * dt60;\n pos += vel * dt60;\n outState = vec4(pos, vel);\n}`;\n\nexport const pointsVertex = `#version 300 es\nprecision highp float;\nuniform sampler2D uState;\nuniform int uSize;\nuniform float uAspect, uDpr, uPointSize;\nvoid main() {\n ivec2 uv = ivec2(gl_VertexID % uSize, gl_VertexID / uSize);\n vec2 p = texelFetch(uState, uv, 0).xy;\n gl_Position = vec4(p.x / max(uAspect, 1.), p.y, 0., 1.);\n gl_PointSize = uPointSize * uDpr;\n}`;\n\nexport const pointsFragment = `#version 300 es\nprecision highp float;\nuniform vec3 uColor;\nuniform float uOpacity;\nout vec4 outColor;\nvoid main() {\n float a = (1. - smoothstep(.12, .5, length(gl_PointCoord - .5))) * .44 * uOpacity;\n outColor = vec4(uColor, a);\n}`;\n","import { whileVisible } from '../../core/loop';\nimport { reduced } from '../../core/reduced';\nimport { createScope } from '../../core/scope';\nimport { TIMING } from '../../core/timing';\nimport { warnOnce, type Instance } from '../../core/types';\nimport { fullscreenVertex, pointsFragment, pointsVertex, simulationFragment } from './shaders';\n\n/*\n * iyo.ai's hero, adapted: a cloud of points simulated on the GPU (two RGBA32F\n * textures, position + velocity, ping-pong) that settles on the zero lines of a\n * shifting interference pattern — Chladni modes from [3, 5, 7] every 6–12 s, a\n * frequency of 20–45 every 5–10 s, a distortion tween of 1.2–3 s — while part of\n * the points (40–80 %, eased) leave to draw a word, then return. The pointer\n * pushes them away in proportion to its speed. It fades in over 1 s after 0.3 s.\n *\n * iyo runs 1 638 400 points on Three.js with its own word pictures; this is a\n * smaller own implementation (size² points, 16 384 by default) with words drawn\n * locally. Without WebGL2 float targets it falls back to ~1800 points on a 2D\n * canvas; with no canvas at all it does nothing. Reduced motion draws one still\n * frame. The canvas is decorative (aria-hidden): the hero's text lives in HTML.\n */\n\nexport type ParticleHeroMode = 'webgl2' | 'canvas2d' | 'none';\n\nexport interface ParticleHeroOptions {\n /** Words the points draw in turn. */\n words?: string[];\n /** The state texture's side: size² points (32–256). */\n size?: number;\n /** Point size in CSS pixels (1–8). */\n pointSize?: number;\n /** RGB, 0–1 each. */\n color?: [number, number, number];\n seed?: number;\n /** Skip WebGL (to try the fallback). */\n forceFallback?: boolean;\n onMode?: (mode: ParticleHeroMode) => void;\n}\n\nexport interface ParticleHeroInstance extends Instance {\n readonly mode: ParticleHeroMode;\n /** Draw this word next (the cycle carries on afterwards). */\n setWord(word: string): void;\n /** Share of points on the word, 0–1; null gives control back to the cycle. */\n setTextureMix(value: number | null): void;\n /** Base field: 0 circles, 1 grid, 2 squares. */\n setPattern(value: number): void;\n pause(): void;\n resume(): void;\n}\n\ninterface State {\n time: number;\n dt: number;\n mix: number;\n frequency: number;\n distortion: number;\n noise: number;\n jitter: number;\n m: number;\n n: number;\n mouseX: number;\n mouseY: number;\n mouseSpeed: number;\n pattern: number;\n aspect: number;\n dpr: number;\n opacity: number;\n}\n\ninterface Renderer {\n mode: Exclude<ParticleHeroMode, 'none'>;\n render(state: State, steps?: number): void;\n setMask(data: Float32Array): void;\n destroy(): void;\n}\n\nconst instances = new WeakMap<HTMLElement, ParticleHeroInstance>();\nconst clamp = (x: number, a: number, b: number) => Math.max(a, Math.min(b, x));\nconst mix = (a: number, b: number, t: number) => a + (b - a) * t;\n/** power2.inOut-like cubic. */\nconst inOut = (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2);\n\nfunction random(seed: number) {\n let s = seed >>> 0;\n return () => {\n s = (1664525 * s + 1013904223) >>> 0;\n return s / 4294967296;\n };\n}\n\n/** Points sampled from the dark pixels of a word drawn on a 640 × 320 canvas (iyo: red < 120). */\nfunction wordMask(word: string, count: number, rng: () => number) {\n const result = new Float32Array(count * 4);\n const canvas = document.createElement('canvas');\n canvas.width = 640;\n canvas.height = 320;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n const dark: Array<[number, number]> = [];\n if (ctx) {\n ctx.fillStyle = '#fff';\n ctx.fillRect(0, 0, 640, 320);\n ctx.fillStyle = '#000';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n let size = 140;\n ctx.font = `600 ${size}px system-ui, sans-serif`;\n while (ctx.measureText(word).width > 590 && size > 16) {\n size -= 4;\n ctx.font = `600 ${size}px system-ui, sans-serif`;\n }\n ctx.fillText(word, 320, 160);\n const pixels = ctx.getImageData(0, 0, 640, 320).data;\n for (let y = 0; y < 320; y += 2) for (let x = 0; x < 640; x += 2) if (pixels[(y * 640 + x) * 4]! < 120) dark.push([x, y]);\n }\n for (let i = 0; i < count; i++) {\n const [x, y] = dark.length ? dark[Math.floor(rng() * dark.length)]! : [320, 160];\n result[i * 4] = (x / 640 - 0.5) * 1.75 + (rng() - 0.5) * 0.004;\n result[i * 4 + 1] = (0.5 - y / 320) * 0.9 + (rng() - 0.5) * 0.004;\n }\n return result;\n}\n\nfunction gpuRenderer(\n canvas: HTMLCanvasElement,\n size: number,\n pointSize: number,\n color: number[],\n initial: Float32Array,\n mask: Float32Array,\n): Renderer {\n const gl = canvas.getContext('webgl2', { alpha: true, antialias: false, powerPreference: 'high-performance', premultipliedAlpha: true });\n if (!gl || !gl.getExtension('EXT_color_buffer_float')) throw new Error('WebGL2 float render targets unavailable');\n const releases: Array<() => void> = [];\n const release = () => {\n for (const fn of releases.reverse()) fn();\n releases.length = 0;\n };\n try {\n const shader = (type: number, source: string) => {\n const s = gl.createShader(type)!;\n releases.push(() => gl.deleteShader(s));\n gl.shaderSource(s, source);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) throw new Error(gl.getShaderInfoLog(s) ?? 'shader');\n return s;\n };\n const program = (vs: string, fs: string) => {\n const p = gl.createProgram()!;\n releases.push(() => gl.deleteProgram(p));\n gl.attachShader(p, shader(gl.VERTEX_SHADER, vs));\n gl.attachShader(p, shader(gl.FRAGMENT_SHADER, fs));\n gl.linkProgram(p);\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) throw new Error(gl.getProgramInfoLog(p) ?? 'program');\n return p;\n };\n const texture = (data: Float32Array) => {\n const tex = gl.createTexture()!;\n releases.push(() => gl.deleteTexture(tex));\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, size, size, 0, gl.RGBA, gl.FLOAT, data);\n return tex;\n };\n const sim = program(fullscreenVertex, simulationFragment);\n const draw = program(pointsVertex, pointsFragment);\n const states = [texture(initial), texture(initial)];\n const maskTexture = texture(mask);\n const buffers = states.map((tex) => {\n const fb = gl.createFramebuffer()!;\n releases.push(() => gl.deleteFramebuffer(fb));\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) throw new Error('incomplete float framebuffer');\n return fb;\n });\n const vao = gl.createVertexArray()!;\n releases.push(() => gl.deleteVertexArray(vao));\n const uniforms = (p: WebGLProgram, names: string[]) => Object.fromEntries(names.map((name) => [name, gl.getUniformLocation(p, name)]));\n const simU = uniforms(sim, [\n 'uState',\n 'uMask',\n 'uTime',\n 'uDt',\n 'uMix',\n 'uFrequency',\n 'uDistortion',\n 'uNoise',\n 'uJitter',\n 'uMouseSpeed',\n 'uAspect',\n 'uModes',\n 'uMouse',\n 'uPattern',\n ]);\n const drawU = uniforms(draw, ['uState', 'uSize', 'uAspect', 'uDpr', 'uPointSize', 'uColor', 'uOpacity']);\n const bind = (unit: number, tex: WebGLTexture) => {\n gl.activeTexture(gl.TEXTURE0 + unit);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n };\n let read = 0;\n return {\n mode: 'webgl2',\n render(s, steps = 1) {\n gl.bindVertexArray(vao);\n gl.disable(gl.BLEND);\n gl.useProgram(sim);\n gl.uniform1i(simU.uState!, 0);\n gl.uniform1i(simU.uMask!, 1);\n gl.uniform1f(simU.uTime!, s.time);\n gl.uniform1f(simU.uDt!, s.dt);\n gl.uniform1f(simU.uMix!, s.mix);\n gl.uniform1f(simU.uFrequency!, s.frequency);\n gl.uniform1f(simU.uDistortion!, s.distortion);\n gl.uniform1f(simU.uNoise!, s.noise);\n gl.uniform1f(simU.uJitter!, s.jitter);\n gl.uniform1f(simU.uMouseSpeed!, s.mouseSpeed);\n gl.uniform1f(simU.uAspect!, s.aspect);\n gl.uniform2f(simU.uModes!, s.m, s.n);\n gl.uniform2f(simU.uMouse!, s.mouseX, s.mouseY);\n gl.uniform1i(simU.uPattern!, s.pattern);\n bind(1, maskTexture);\n for (let i = 0; i < steps; i++) {\n bind(0, states[read]!);\n gl.bindFramebuffer(gl.FRAMEBUFFER, buffers[1 - read]!);\n gl.viewport(0, 0, size, size);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n read = 1 - read;\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.useProgram(draw);\n bind(0, states[read]!);\n gl.uniform1i(drawU.uState!, 0);\n gl.uniform1i(drawU.uSize!, size);\n gl.uniform1f(drawU.uAspect!, s.aspect);\n gl.uniform1f(drawU.uDpr!, s.dpr);\n gl.uniform1f(drawU.uPointSize!, pointSize);\n gl.uniform3fv(drawU.uColor!, color);\n gl.uniform1f(drawU.uOpacity!, s.opacity);\n gl.enable(gl.BLEND);\n // RGB premultiplied, coverage accumulated once, for the page's compositing.\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.drawArrays(gl.POINTS, 0, size * size);\n },\n setMask(data) {\n bind(1, maskTexture);\n gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, size, size, gl.RGBA, gl.FLOAT, data);\n },\n destroy: release,\n };\n } catch (error) {\n release();\n throw error;\n }\n}\n\n/** ~1800 points eased toward a breathing circle or the word: no Chladni field. */\nfunction canvasRenderer(\n canvas: HTMLCanvasElement,\n size: number,\n pointSize: number,\n color: number[],\n initial: Float32Array,\n mask: Float32Array,\n): Renderer {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('no 2D context');\n const stride = Math.max(1, Math.floor((size * size) / 1800));\n const ids: number[] = [];\n for (let i = 0; i < size * size; i += stride) ids.push(i);\n const points = Float32Array.from(initial);\n let target = mask;\n const rgb = color.map((c) => Math.round(c * 255)).join(',');\n return {\n mode: 'canvas2d',\n setMask(data) {\n target = data;\n },\n render(s, steps = 1) {\n for (let step = 0; step < steps; step++)\n for (const i of ids) {\n const o = i * 4;\n const angle = i * 2.3999632297;\n const radius = 0.3 + 0.52 * Math.sin(angle * 0.025 + s.time * 0.07);\n let x = Math.cos(angle) * radius;\n let y = Math.sin(angle) * radius;\n if (((i * 137) % 1000) / 1000 < s.mix) {\n x = target[o]!;\n y = target[o + 1]!;\n }\n points[o] = points[o]! + (x - points[o]!) * 0.075;\n points[o + 1] = points[o + 1]! + (y - points[o + 1]!) * 0.075;\n }\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = `rgba(${rgb},${0.4 * s.opacity})`;\n for (const i of ids) {\n const x = (points[i * 4]! * 0.5 + 0.5) * canvas.width;\n const y = (0.5 - points[i * 4 + 1]! * 0.5) * canvas.height;\n ctx.beginPath();\n ctx.arc(x, y, pointSize * s.dpr * 0.55, 0, Math.PI * 2);\n ctx.fill();\n }\n },\n destroy() {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n },\n };\n}\n\nconst NONE: ParticleHeroInstance = {\n mode: 'none',\n setWord() {},\n setTextureMix() {},\n setPattern() {},\n pause() {},\n resume() {},\n destroy() {},\n};\n\nexport function createParticleHero(root: HTMLElement | null, options: ParticleHeroOptions = {}): ParticleHeroInstance {\n if (!root) {\n warnOnce('particle-hero: missing element');\n return NONE;\n }\n const existing = instances.get(root);\n if (existing) return existing;\n const t = TIMING.particleHero;\n const rng = random(options.seed ?? 1907);\n const size = Math.round(clamp(options.size ?? t.size, 32, 256));\n const pointSize = clamp(options.pointSize ?? t.pointSize, 1, 8);\n const color = options.color ?? [1, 1, 1];\n const words = options.words?.length ? options.words.map(String) : ['CREATE', 'NATURAL', 'IDEAS'];\n const count = size * size;\n const still = reduced();\n\n const initial = new Float32Array(count * 4);\n for (let i = 0; i < count; i++) {\n initial[i * 4] = (rng() - 0.5) * 1.7;\n initial[i * 4 + 1] = (rng() - 0.5) * 1.7;\n }\n let mask = wordMask(words[0]!, count, rng);\n\n const makeCanvas = () => {\n const canvas = document.createElement('canvas');\n canvas.className = 'mk-particle-hero__canvas';\n canvas.setAttribute('aria-hidden', 'true');\n return canvas;\n };\n let canvas = makeCanvas();\n let renderer: Renderer | null = null;\n if (!options.forceFallback) {\n try {\n renderer = gpuRenderer(canvas, size, pointSize, color, initial, mask);\n } catch {\n canvas = makeCanvas();\n }\n }\n if (!renderer) {\n try {\n renderer = canvasRenderer(canvas, size, pointSize, color, initial, mask);\n } catch {\n warnOnce('particle-hero: no WebGL2 and no 2D canvas — nothing drawn');\n return NONE;\n }\n }\n const draw = renderer;\n\n const scope = createScope();\n if (!root.classList.contains('mk-particle-hero')) {\n root.classList.add('mk-particle-hero');\n scope.add(() => {\n root.classList.remove('mk-particle-hero');\n if (root.getAttribute('class') === '') root.removeAttribute('class');\n });\n }\n root.append(canvas);\n scope.add(() => canvas.remove());\n scope.attr(root, 'data-mk-mode', draw.mode);\n scope.add(() => draw.destroy());\n\n const state: State = {\n time: 0,\n dt: 1 / 60,\n mix: still ? 0.8 : 0,\n frequency: 35,\n distortion: 2.4,\n noise: 0.2,\n jitter: 0.08,\n m: 3,\n n: 5,\n mouseX: 9,\n mouseY: 9,\n mouseSpeed: 0,\n pattern: 0,\n aspect: 1,\n dpr: 1,\n opacity: still ? 1 : 0,\n };\n let paused = false;\n let age = 0;\n let wordIndex = 0;\n let manualMix: number | null = null;\n let nextFrequency = 5;\n let nextModes = 6;\n let distortion = { from: 2.4, to: rng() * 5, start: 0, end: 2.5 };\n // Word cycle: points gather on the word, shift share, leave, next word.\n let cycle = { stage: 0, start: 0, duration: 4.2, from: 0, to: 0.65 };\n let pointer = { x: 9, y: 9 };\n let previous = { x: 9, y: 9 };\n\n const drawStill = () => {\n state.opacity = 1;\n state.mix = manualMix ?? 0.8;\n state.mouseSpeed = 0;\n state.dt = 1 / 60;\n draw.render(state, t.stillSteps);\n };\n const isStill = () => still || paused;\n const resize = () => {\n const box = root.getBoundingClientRect();\n const w = Math.max(1, box.width);\n const h = Math.max(1, box.height);\n state.dpr = Math.min(window.devicePixelRatio || 1, t.maxDpr);\n state.aspect = w / h;\n canvas.width = Math.round(w * state.dpr);\n canvas.height = Math.round(h * state.dpr);\n if (isStill()) drawStill();\n };\n const setWord = (word: string) => {\n if (scope.disposed) return;\n mask = wordMask(String(word), count, rng);\n draw.setMask(mask);\n if (isStill()) drawStill();\n };\n\n const tick = (frames: number) => {\n if (paused || scope.disposed) return;\n const dt = clamp(frames / 60, 0, 0.05);\n age += dt;\n state.time = age * 4;\n state.dt = dt;\n state.opacity = clamp((age - t.fadeDelay) / t.fadeIn, 0, 1);\n state.mouseX = mix(state.mouseX, pointer.x, 0.1);\n state.mouseY = mix(state.mouseY, pointer.y, 0.1);\n const speed = Math.min(Math.hypot(state.mouseX - previous.x, state.mouseY - previous.y) * 5, 1);\n state.mouseSpeed = mix(state.mouseSpeed, speed, 0.2);\n previous = { x: state.mouseX, y: state.mouseY };\n if (age >= nextFrequency) {\n state.frequency = 20 + rng() * 25;\n state.jitter = rng() * 0.3;\n state.noise = rng() * 0.5;\n nextFrequency = age + 5 + rng() * 5;\n }\n if (age >= nextModes) {\n const modes = [3, 5, 7];\n state.m = modes[Math.floor(rng() * 3)]!;\n state.n = modes[Math.floor(rng() * 3)]!;\n nextModes = age + 6 + rng() * 6;\n }\n if (age >= distortion.end) distortion = { from: state.distortion, to: rng() * 5, start: age, end: age + 1.2 + rng() * 1.8 };\n state.distortion = mix(\n distortion.from,\n distortion.to,\n inOut(clamp((age - distortion.start) / (distortion.end - distortion.start), 0, 1)),\n );\n if (age - cycle.start >= cycle.duration) {\n const stage = (cycle.stage + 1) % 3;\n cycle = { stage, start: age, from: cycle.to, to: 0, duration: 2 + rng() };\n if (stage === 0) {\n wordIndex = (wordIndex + 1) % words.length;\n setWord(words[wordIndex]!);\n }\n if (stage !== 2) {\n cycle.to = 0.4 + rng() * 0.4;\n cycle.duration = 2 + rng() * 2;\n }\n }\n state.mix = manualMix ?? mix(cycle.from, cycle.to, inOut(clamp((age - cycle.start) / cycle.duration, 0, 1)));\n draw.render(state);\n };\n\n scope.on(\n root,\n 'pointermove',\n (event) => {\n const box = root.getBoundingClientRect();\n const e = event as PointerEvent;\n pointer = {\n x: (((e.clientX - box.left) / Math.max(box.width, 1)) * 2 - 1) * Math.max(state.aspect, 1),\n y: 1 - ((e.clientY - box.top) / Math.max(box.height, 1)) * 2,\n };\n },\n { passive: true },\n );\n scope.on(root, 'pointerleave', () => (pointer = { x: 9, y: 9 }), { passive: true });\n scope.on(canvas, 'webglcontextlost', (event) => {\n event.preventDefault();\n paused = true;\n scope.attr(root, 'data-mk-mode', 'context-lost');\n });\n if (typeof ResizeObserver === 'function') scope.observe(new ResizeObserver(resize)).observe(root);\n else scope.on(window, 'resize', resize);\n // The shared ticker runs while the hero is near the screen and the tab is visible.\n if (!still) scope.add(whileVisible(root, tick, '100px'));\n\n const instance: ParticleHeroInstance = {\n mode: draw.mode,\n setWord,\n setTextureMix(value) {\n if (scope.disposed) return;\n manualMix = value === null ? null : clamp(Number(value) || 0, 0, 1);\n if (isStill()) drawStill();\n },\n setPattern(value) {\n if (scope.disposed) return;\n state.pattern = clamp(Math.round(Number(value) || 0), 0, 2);\n if (isStill()) drawStill();\n },\n pause() {\n if (!scope.disposed) paused = true;\n },\n resume() {\n if (scope.disposed) return;\n paused = false;\n if (still) drawStill();\n },\n destroy() {\n if (scope.disposed) return;\n scope.dispose();\n instances.delete(root);\n },\n };\n instances.set(root, instance);\n resize();\n if (still) drawStill();\n options.onMode?.(draw.mode);\n return instance;\n}\n"],"mappings":"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","names":["fullscreenVertex","clamp","fullscreenVertex","canvas"]}