pixi-effects 0.3.0 → 0.4.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 (45) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +6 -6
  3. package/ai/SKILL.md +3 -1
  4. package/ai/reference/cheatsheet.md +6 -5
  5. package/ai/reference/pitfalls.md +24 -3
  6. package/ai/template.html +3 -3
  7. package/dist/{Base-Ba4Ta4ap.d.ts → Base-5R7C5pHR.d.cts} +7 -1
  8. package/dist/{Base-BDw6dKRB.d.cts → Base-DhY9oMxr.d.ts} +7 -1
  9. package/dist/Composition-D7RCAGEA.cjs +13 -0
  10. package/dist/{Composition-6FDH5OPM.cjs.map → Composition-D7RCAGEA.cjs.map} +1 -1
  11. package/dist/Composition-RGTRZ2JX.js +4 -0
  12. package/dist/{Composition-FEYAUMFI.js.map → Composition-RGTRZ2JX.js.map} +1 -1
  13. package/dist/Controller.d.cts +2 -2
  14. package/dist/Controller.d.ts +2 -2
  15. package/dist/{Movie-W8ISiEBB.d.cts → Movie-CghFXprP.d.cts} +1 -1
  16. package/dist/{Movie-DMpaT67V.d.ts → Movie-DRZtIGU7.d.ts} +1 -1
  17. package/dist/{chunk-SIRVULFF.cjs → chunk-6BQ6IEW2.cjs} +119 -36
  18. package/dist/chunk-6BQ6IEW2.cjs.map +1 -0
  19. package/dist/{chunk-DIJG2RSF.js → chunk-A574IA4F.js} +44 -6
  20. package/dist/chunk-A574IA4F.js.map +1 -0
  21. package/dist/{chunk-ZL262ZRM.cjs → chunk-QGBOC5YL.cjs} +56 -18
  22. package/dist/chunk-QGBOC5YL.cjs.map +1 -0
  23. package/dist/{chunk-PN5A6QA7.js → chunk-ZQX7WIYL.js} +119 -37
  24. package/dist/chunk-ZQX7WIYL.js.map +1 -0
  25. package/dist/index.cjs +58 -16
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +4 -4
  28. package/dist/index.d.ts +4 -4
  29. package/dist/index.js +50 -8
  30. package/dist/index.js.map +1 -1
  31. package/dist/three.cjs +5 -5
  32. package/dist/three.d.cts +2 -2
  33. package/dist/three.d.ts +2 -2
  34. package/dist/three.js +1 -1
  35. package/dist/{types-3c8Vymgw.d.cts → types-CRE9WKd4.d.cts} +6 -0
  36. package/dist/{types-3c8Vymgw.d.ts → types-CRE9WKd4.d.ts} +6 -0
  37. package/docs/dsl.md +12 -1
  38. package/llms-full.txt +45 -10
  39. package/package.json +2 -1
  40. package/dist/Composition-6FDH5OPM.cjs +0 -13
  41. package/dist/Composition-FEYAUMFI.js +0 -4
  42. package/dist/chunk-DIJG2RSF.js.map +0 -1
  43. package/dist/chunk-PN5A6QA7.js.map +0 -1
  44. package/dist/chunk-SIRVULFF.cjs.map +0 -1
  45. package/dist/chunk-ZL262ZRM.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/expr/Parser.ts","../src/expr/normalizeProps.ts","../src/core/Timeline.ts","../src/expr/Scope.ts","../src/filters/ChromaKey.ts","../src/filters/index.ts","../src/sequences/Base.ts","../src/space/specKeys.ts","../src/core/lint.ts","../src/space/math.ts","../src/space/CameraSequence.ts","../src/core/revertibleSet.ts","../src/expr/colorInterp.ts","../src/expr/colorTween.ts","../src/sequences/Image.ts","../src/sequences/Text.ts","../src/sequences/Audio.ts","../src/core/FrameCache.ts","../src/sequences/Video.ts","../src/sequences/gradient.ts","../src/sequences/gradientFill.ts","../src/sequences/Shape.ts","../src/core/Composition.ts"],"names":["gsap","Color","Filter","GlProgram","defaultFilterVert","GpuProgram","UniformGroup","inst","Rectangle","Container","Assets","Sprite","Text","stripKeys","Texture","FillGradient","Graphics","GraphicsPath","live","registry"],"mappings":";;;;;;;;AAeA,IAAM,KAAA,GAAuD;AAAA,EAC3D,KAAK,IAAA,CAAK,GAAA;AAAA,EACV,KAAK,IAAA,CAAK,GAAA;AAAA,EACV,KAAK,IAAA,CAAK,GAAA;AAAA,EACV,OAAO,IAAA,CAAK,KAAA;AAAA,EACZ,MAAM,IAAA,CAAK,IAAA;AAAA,EACX,OAAO,IAAA,CAAK,KAAA;AAAA,EACZ,MAAM,IAAA,CAAK,IAAA;AAAA,EACX,KAAK,IAAA,CAAK,GAAA;AAAA,EACV,KAAK,IAAA,CAAK,GAAA;AAAA,EACV,KAAK,IAAA,CAAK,GAAA;AAAA,EACV,KAAK,IAAA,CAAK;AACZ,CAAA;AAkBA,SAAS,QAAQ,CAAA,EAAoB;AAAE,EAAA,OAAO,CAAA,IAAK,OAAO,CAAA,IAAK,GAAA;AAAK;AACpE,SAAS,UAAU,CAAA,EAAoB;AACrC,EAAA,OAAQ,CAAA,IAAK,OAAO,CAAA,IAAK,GAAA,IAAS,KAAK,GAAA,IAAO,CAAA,IAAK,OAAQ,CAAA,KAAM,GAAA;AACnE;AACA,SAAS,SAAS,CAAA,EAAoB;AAAE,EAAA,OAAO,SAAA,CAAU,CAAC,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA;AAAG;AAE3E,SAAS,SAAS,GAAA,EAAsB;AACtC,EAAA,MAAM,MAAe,EAAC;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,IAAS;AAC/B,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,MAAM,GAAA,IAAO,CAAA,KAAM,OAAQ,CAAA,KAAM,IAAA,IAAQ,MAAM,IAAA,EAAM;AAAE,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC1E,IAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,IAAM,CAAA,KAAM,GAAA,IAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,EAAE,CAAA,EAAI;AAC1D,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,CAAA,GAAI,GAAA,CAAI,MAAA,KAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAE,CAAA,IAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAA,EAAM,CAAA,EAAA;AAC/D,MAAA,MAAM,QAAQ,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACxC,MAAA,IAAI,MAAA,CAAO,MAAM,KAAK,CAAA,QAAS,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,CAAC,CAAA,CAAE,CAAA;AAC7D,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAC/B,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,CAAC,CAAA,EAAG;AAChB,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,SAAS,GAAA,CAAI,CAAC,CAAE,CAAA,EAAG,CAAA,EAAA;AAC5C,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA;AAC9C,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,GAAA,IAAO,CAAA,KAAM,OAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK;AACpD,MAAA,GAAA,CAAI,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAC9B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC9D,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC9D,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC7D,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,CAAC,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACvD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,SAAN,MAAa;AAAA,EAEX,YAAmB,MAAA,EAAiB;AAAjB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAkB;AAAA,EAAlB,MAAA;AAAA,EADnB,CAAA,GAAI,CAAA;AAAA,EAEJ,IAAA,GAA0B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,EAAG;AAAA,EACxD,IAAA,GAA0B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,CAAA;AAAA,EAAG;AAC5D,CAAA;AAEA,SAAS,UAAU,CAAA,EAAiB;AAAE,EAAA,OAAO,SAAS,CAAC,CAAA;AAAG;AAE1D,SAAS,SAAS,CAAA,EAAiB;AACjC,EAAA,IAAI,IAAA,GAAO,SAAS,CAAC,CAAA;AACrB,EAAA,WAAS;AACP,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,IAAA,IAAI,CAAA,EAAG,SAAS,IAAA,IAAS,CAAA,CAAE,OAAO,GAAA,IAAO,CAAA,CAAE,OAAO,GAAA,EAAM;AACxD,IAAA,CAAA,CAAE,IAAA,EAAK;AACP,IAAA,IAAA,GAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA,EAAE;AAAA,EACjE;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAS,CAAA,EAAiB;AACjC,EAAA,IAAI,IAAA,GAAO,WAAW,CAAC,CAAA;AACvB,EAAA,WAAS;AACP,IAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,IAAA,IAAI,CAAA,EAAG,SAAS,IAAA,IAAS,CAAA,CAAE,OAAO,GAAA,IAAO,CAAA,CAAE,OAAO,GAAA,EAAM;AACxD,IAAA,CAAA,CAAE,IAAA,EAAK;AACP,IAAA,IAAA,GAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,EACnE;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,CAAA,EAAiB;AACnC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,EAAG,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,OAAO,GAAA,EAAK;AAAE,IAAA,CAAA,CAAE,IAAA,EAAK;AAAG,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,EAAG;AAChG,EAAA,IAAI,CAAA,EAAG,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,OAAO,GAAA,EAAK;AAAE,IAAA,CAAA,CAAE,IAAA,EAAK;AAAG,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA,EAAG;AACxE,EAAA,OAAO,aAAa,CAAC,CAAA;AACvB;AAEA,SAAS,aAAa,CAAA,EAAiB;AACrC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,8BAA8B,CAAA;AACtD,EAAA,IAAI,CAAA,CAAE,SAAS,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAC3D,EAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,IAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAK;AACrB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,MAAM,IAAI,MAAM,cAAc,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACnB,IAAA,IAAI,CAAA,CAAE,IAAA,EAAK,EAAG,IAAA,KAAS,QAAA,EAAU;AAC/B,MAAA,CAAA,CAAE,IAAA,EAAK;AACP,MAAA,MAAM,OAAe,EAAC;AACtB,MAAA,IAAI,CAAA,CAAE,IAAA,EAAK,EAAG,IAAA,KAAS,QAAA,EAAU;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AACtB,QAAA,OAAO,CAAA,CAAE,IAAA,EAAK,EAAG,IAAA,KAAS,OAAA,EAAS;AAAE,UAAA,CAAA,CAAE,IAAA,EAAK;AAAG,UAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,QAAG;AAAA,MAC1E;AACA,MAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,EAAK;AACrB,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,MAAM,IAAI,MAAM,cAAc,CAAA;AAC5D,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,MAAM,IAAA,EAAK;AAAA,IAC5C;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,EACrC;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAA;AAChD;AAEA,SAAS,MAAM,GAAA,EAAmB;AAChC,EAAA,MAAM,CAAA,GAAI,IAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,EAAA,IAAI,EAAE,IAAA,EAAK,EAAG,MAAM,IAAI,MAAM,gBAAgB,CAAA;AAC9C,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAA,CAAS,MAAY,KAAA,EAAuC;AACnE,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,KAAA;AAAO,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACxB,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACzB,MAAA,IAAI,OAAO,MAAM,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAC7E,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,IACA,KAAK,KAAA;AAAO,MAAA,OAAO,CAAC,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,IAC9C,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnC,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACpC,MAAA,QAAQ,KAAK,EAAA;AAAI,QACf,KAAK,GAAA;AAAK,UAAA,OAAO,CAAA,GAAI,CAAA;AAAA,QACrB,KAAK,GAAA;AAAK,UAAA,OAAO,CAAA,GAAI,CAAA;AAAA,QACrB,KAAK,GAAA;AAAK,UAAA,OAAO,CAAA,GAAI,CAAA;AAAA,QACrB,KAAK,GAAA;AAAK,UAAA,OAAO,CAAA,GAAI,CAAA;AAAA;AACvB,IACF;AAAA;AAAA;AAAA,IAGA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC1B,MAAA,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACzD,MAAA,OAAO,EAAA,CAAG,GAAG,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAK,QAAA,CAAS,CAAA,EAAG,KAAK,CAAC,CAAC,CAAA;AAAA,IACrD;AAAA;AAEJ;AAEA,IAAM,SAAA,GAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA,EAAE;AAChD,IAAM,QAAA,uBAAe,GAAA,EAAkB;AAEhC,SAAS,OAAO,CAAA,EAAyB;AAC9C,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,CAAA;AAC7C;AAEO,SAAS,YAAA,CAAa,QAAgB,KAAA,EAAuC;AAClF,EAAA,IAAI,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAC7B,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,MAAM,CAAA;AAAA,IACpB,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA;AAC5D,MAAA,GAAA,GAAM,SAAA;AAAA,IACR;AACA,IAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI;AACF,IAAA,OAAO,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EAC5B,SAAS,CAAA,EAAG;AACV,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA;AAC5D,IAAA,OAAO,CAAA;AAAA,EACT;AACF;;;AC3MO,SAAS,cAAA,CACd,KAAA,EACA,KAAA,EACA,OAAA,GAA4B,EAAC,EAC1B;AACH,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA;AAC3C,EAAA,OAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AACtC;AAEA,SAAS,IAAA,CACP,KAAA,EACA,KAAA,EACA,IAAA,EACA,UAAA,EACS;AACT,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAA,KAAK,IAAA,CAAK,GAAG,KAAA,EAAO,IAAA,EAAM,UAAU,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,MAAA,GAAA,CAAI,CAAC,IAAI,IAAA,CAAM,KAAA,CAAkC,CAAC,CAAA,EAAG,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,KAAK,CAAA,IAAK,EAAE,eAAe,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,CAAA,EAAI;AAKnE,IAAA,IAAI,oBAAA,CAAqB,KAAK,CAAA,EAAG,OAAO,KAAA;AACxC,IAAA,OAAO,YAAA,CAAa,OAAO,KAAK,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,qBAAqB,CAAA,EAAoB;AAChD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC3B,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,KAAM,IAAc,OAAO,IAAA;AAG7C,EAAA,OAAO,mCAAA,CAAoC,KAAK,CAAC,CAAA;AACnD;;;AC1BO,SAAS,SAAS,EAAA,EAAiG;AACxH,EAAA,MAAM,MAAwC,EAAC;AAC/C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,EAAA,CAAG,WAAW,MAAA,EAAW;AAC3B,IAAA,IAAI,OAAO,QAAA,CAAS,EAAA,CAAG,MAAM,CAAA,IAAK,EAAA,CAAG,UAAU,CAAA,EAAG;AAChD,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA;AAC7B,MAAA,GAAA,CAAI,MAAA,GAAS,MAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,CAAA,8BAAA,EAAiC,MAAA,CAAO,EAAA,CAAG,MAAM,CAAC,CAAA,6HAAA,CAA0H,CAAA;AAAA,IAC3L;AAAA,EACF;AACA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,IAAI,EAAA,CAAG,IAAA,KAAS,MAAA,EAAW,GAAA,CAAI,OAAO,EAAA,CAAG,IAAA;AACzC,IAAA,IAAI,EAAA,CAAG,gBAAgB,MAAA,IAAa,EAAA,CAAG,cAAc,CAAA,EAAG,GAAA,CAAI,cAAc,EAAA,CAAG,WAAA;AAAA,EAC/E;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,SAAA,CAAU,IAA+B,QAAA,EAA0B;AACjF,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,IAAA,EAAM,OAAO,CAAA;AAC5C,EAAA,OAAO,EAAA,GAAK,CAAA,GAAI,QAAA,GAAW,EAAA,GAAK,EAAA;AAClC;AAEO,SAAS,iBAAA,CAAkB,IAAc,cAAA,EAA4C;AAC1F,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,CAAG,EAAA,EAAI,cAAc,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,GAAG,QAAA,IAAY,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,MAAA;AACxB,EAAA,MAAM,MAAA,GAAS,CAAC,CAAC,EAAA,CAAG,GAAA;AACpB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,EAAA,CAAG,IAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAC,EAAA,CAAG,EAAA;AACnB,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,QAAQ,IAAA,GAAO,KAAA;AAAA,OAAA,IACV,OAAA,IAAW,OAAO,IAAA,GAAO,QAAA;AAAA,OAAA,IACzB,SAAS,IAAA,GAAO,MAAA;AAAA,OAAA,IAChB,OAAO,IAAA,GAAO,IAAA;AAAA,OAClB,IAAA,GAAO,IAAA;AACZ,EAAA,OAAO,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,SAAS,EAAE,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,GAAG,GAAA,EAAK,IAAA,EAAM,GAAG,IAAA,EAAM,EAAA,EAAI,GAAG,EAAA,EAAG;AAC/F;AAOO,SAAS,eAAe,KAAA,EAA6C;AAC1E,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAA,MAAM,cAAuD,EAAC;AAC9D,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,0BAA0B,CAAA;AAC5C,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,MAAM,GAAG,IAAA,EAAM,GAAG,CAAA,GAAI,CAAA;AACtB,MAAA,CAAC,WAAA,CAAY,IAAI,CAAA,KAAM,IAAI,GAAG,CAAA,GAAI,MAAM,CAAC,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AACjC;AAmBO,SAAS,WAAA,CACd,OACA,OAAA,EACyD;AACzD,EAAA,IAAI,CAAC,SAAS,OAAO,EAAE,MAAM,KAAA,EAAO,MAAA,EAAQ,EAAC,EAAE;AAC/C,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,MAAM,CAAA,GAAI,OAAA,CAAQ,EAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAI,MAAA;AACpD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,MAAM,MAAA,CAAO,CAAA,CAAE,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AACnC,MAAA,IAAI,KAAK,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAI,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,CAAC,GAAG,CAAA;AAAA,IAEtF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAIA,SAAS,UAAA,CAAW,QAAsB,IAAA,EAAkC;AAC1E,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,IAAA;AAC7B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,OAAA,EAAS;AAC9B,IAAA,IAAI,CAAA,EAAG,KAAA,KAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,QAAA;AAAA,EACnB,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW,SAAA;AAAA,EACrB,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,QAAA;AAAA,EACnB,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EACjB,UAAA;AAAA,EACA,UAAA;AAAA,EAAY,WAAA;AAAA,EAAa,WAAA;AAAA,EACzB,cAAA;AAAA,EAAgB,eAAA;AAAA,EAAiB,eAAA;AAAA,EACjC,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,YAAA;AAAA,EAC3B,MAAA;AAAA,EACA,UAAA;AAAA,EAAY,gBAAA;AAAA,EACZ,mBAAA;AAAA,EACA,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,aAAA;AAAA,EAC1B,WAAA;AAAA,EACA,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa;AACzC,CAAC,CAAA;AAED,SAAS,SAAS,KAAA,EAAyD;AACzE,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,MAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAG,MAAA,QAAA,GAAW,IAAA;AAAA,IAAM,CAAA,MACvD;AAAE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IAAG;AAAA,EACrB;AACA,EAAA,IAAI,QAAA,MAAc,IAAA,GAAO,IAAA;AACzB,EAAA,OAAO,GAAA;AACT;AAIO,SAAS,cAAA,CACd,QAAA,EACA,MAAA,EACA,SAAA,EACA,cAAA,EACA,KAAA,EACA,QAAA,GAAqB,EAAC,EACtB,MAAA,GAAS,CAAA,EACT,OAAA,EACM;AACN,EAAA,KAAA,MAAW,GAAA,IAAO,SAAA,IAAa,EAAC,EAAG;AACjC,IAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,GAAA,EAAK,cAAc,CAAA;AAChD,IAAA,MAAM,EAAA,GAAK,SAAS,EAAA,CAAG,EAAA;AACvB,IAAA,IAAI,EAAA,CAAG,SAAS,KAAA,EAAO;AACrB,MAAA,MAAM,WAAW,cAAA,CAAe,EAAA,CAAG,KAAM,KAAA,EAAO,EAAE,UAAU,CAAA;AAC5D,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,WAAA,CAAY,UAAU,OAAO,CAAA;AACtD,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,EAAE,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,KAAA,IAAS,EAAE,CAAA;AACxE,MAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,eAAe,IAAI,CAAA;AACrD,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAA,EAAG,EAAE,CAAA;AACjF,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,QAAA,MAAM,CAAA,GAAI,UAAA,CAAW,MAAA,EAAwB,IAAI,CAAA;AACjD,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,EAAE,CAAA;AAAA,MAC3B;AAAA,IACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,IAAA,EAAM;AAC3B,MAAA,MAAM,WAAW,cAAA,CAAe,EAAA,CAAG,IAAK,KAAA,EAAO,EAAE,UAAU,CAAA;AAC3D,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,WAAA,CAAY,UAAU,OAAO,CAAA;AACtD,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA;AACd,QAAA,QAAA,CAAS,EAAA,CAAG,EAAE,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,KAAA,EAAO,UAAU,EAAA,CAAG,QAAA,EAAU,MAAM,EAAA,CAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AACnG,MAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,eAAe,IAAI,CAAA;AACrD,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA;AACjC,QAAA,QAAA,CAAS,GAAG,MAAA,EAAQ,EAAE,GAAG,QAAA,CAAS,QAAQ,CAAA,EAAG,QAAA,EAAU,EAAA,CAAG,QAAA,EAAU,MAAM,EAAA,CAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AACrG,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,QAAA,MAAM,CAAA,GAAI,UAAA,CAAW,MAAA,EAAwB,IAAI,CAAA;AACjD,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,QAAA,CAAS,EAAA,CAAG,CAAA,EAAG,EAAE,GAAG,OAAO,QAAA,EAAU,EAAA,CAAG,QAAA,EAAU,IAAA,EAAM,GAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AAAA,MACnF;AAAA,IACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,MAAA,EAAQ;AAC7B,MAAA,MAAM,WAAW,cAAA,CAAe,EAAA,CAAG,MAAO,KAAA,EAAO,EAAE,UAAU,CAAA;AAC7D,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,WAAA,CAAY,UAAU,OAAO,CAAA;AACtD,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA;AACd,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,KAAA,EAAO,UAAU,EAAA,CAAG,QAAA,EAAU,MAAM,EAAA,CAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AACrG,MAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,eAAe,IAAI,CAAA;AACrD,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA;AACjC,QAAA,QAAA,CAAS,KAAK,MAAA,EAAQ,EAAE,GAAG,QAAA,CAAS,QAAQ,CAAA,EAAG,QAAA,EAAU,EAAA,CAAG,QAAA,EAAU,MAAM,EAAA,CAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AACvG,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,QAAA,MAAM,CAAA,GAAI,UAAA,CAAW,MAAA,EAAwB,IAAI,CAAA;AACjD,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,EAAE,GAAG,OAAO,QAAA,EAAU,EAAA,CAAG,QAAA,EAAU,IAAA,EAAM,GAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AAAA,MACrF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,eAAe,cAAA,CAAe,EAAA,CAAG,MAAO,KAAA,EAAO,EAAE,UAAU,CAAA;AACjE,MAAA,MAAM,aAAa,cAAA,CAAe,EAAA,CAAG,IAAK,KAAA,EAAO,EAAE,UAAU,CAAA;AAC7D,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,YAAA,EAAc,OAAO,CAAA;AACpD,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,UAAA,EAAY,OAAO,CAAA;AAEhD,MAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,GAAA,EAAK,CAAC,CAAC,CAAC,CAAA;AAChE,MAAA,KAAA,MAAW,CAAA,IAAK,SAAS,MAAA,EAAQ;AAC/B,QAAA,MAAM,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA;AAC7B,QAAA,SAAA,CAAU,MAAA,CAAO,EAAE,GAAG,CAAA;AACtB,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,QAAA,CAAS,MAAA;AAAA,YAAO,CAAA,CAAE,MAAA;AAAA,YAAQ,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,EAAE,KAAA,EAAM;AAAA,YAC5C,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,KAAA,EAAO,QAAA,EAAU,EAAA,CAAG,UAAU,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,GAAG,GAAG,IAAA,EAAK;AAAA,YAAG;AAAA,WAAE;AAAA,QAC/E,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,EAAA,CAAG,EAAE,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,KAAA,EAAO,UAAU,EAAA,CAAG,QAAA,EAAU,MAAM,EAAA,CAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AAAA,QACnG;AAAA,MACF;AACA,MAAA,KAAA,MAAW,CAAA,IAAK,UAAU,MAAA,EAAO;AAC/B,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,KAAA,EAAO,UAAU,EAAA,CAAG,QAAA,EAAU,MAAM,EAAA,CAAG,IAAA,EAAM,GAAG,EAAA,CAAG,IAAA,IAAQ,EAAE,CAAA;AACrG,MAAA,MAAM,SAAA,GAAY,cAAA,CAAe,UAAA,CAAW,IAAI,CAAA;AAChD,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA;AAC5C,MAAA,MAAM,0BAAU,IAAI,GAAA,CAAI,CAAC,GAAG,OAAO,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAA;AAC9F,MAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACpB,QAAA,QAAA,CAAS,MAAA;AAAA,UACP,MAAA;AAAA,UACA,EAAE,GAAG,QAAA,CAAS,SAAA,CAAU,QAAQ,CAAA,EAAE;AAAA,UAClC,EAAE,GAAG,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,EAAG,QAAA,EAAU,EAAA,CAAG,QAAA,EAAU,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,GAAG,GAAG,IAAA,EAAK;AAAA,UAClF;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,QAC1B,GAAG,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAAA,QACpC,GAAG,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,WAAW;AAAA,OACnC,CAAA;AACD,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,MAAM,CAAA,GAAI,UAAA,CAAW,MAAA,EAAwB,IAAI,CAAA;AACjD,QAAA,IAAI,CAAC,CAAA,EAAG;AACR,QAAA,QAAA,CAAS,MAAA;AAAA,UACP,CAAA;AAAA,UACA,EAAE,GAAI,SAAA,CAAU,YAAY,IAAI,CAAA,IAAK,EAAC,EAAG;AAAA,UACzC,EAAE,GAAI,OAAA,CAAQ,WAAA,CAAY,IAAI,KAAK,EAAC,EAAI,QAAA,EAAU,EAAA,CAAG,UAAU,IAAA,EAAM,EAAA,CAAG,IAAA,EAAM,GAAG,GAAG,IAAA,EAAK;AAAA,UACzF;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,aACd,MAAA,EACA,OAAA,EACA,OACA,QAAA,GAAqB,IACrB,OAAA,EACM;AACN,EAAA,IAAI,CAAC,OAAA,EAAS;AACd,EAAA,MAAM,WAAW,cAAA,CAAe,OAAA,EAAS,KAAA,EAAO,EAAE,UAAU,CAAA;AAC5D,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,WAAA,CAAY,UAAU,OAAO,CAAA;AACtD,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQA,SAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,OAAO,CAAA;AAChE,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,eAAe,IAAI,CAAA;AACrD,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,EAAGA,SAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,QAAA,CAAS,QAAQ,CAAC,CAAA;AACzE,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,MAAA,EAAwB,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAAA,SAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA;AAAA,EACnB;AACF;;;AClQO,SAAS,UAAA,CACd,QAAA,EACA,MAAA,EACA,IAAA,EACO;AACP,EAAA,MAAM,CAAA,GAAI,SAAS,cAAA,IAAkB,CAAA;AACrC,EAAA,MAAM,CAAA,GAAI,SAAS,eAAA,IAAmB,CAAA;AACtC,EAAA,MAAM,CAAA,GAAI,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,KAAA;AAChC,EAAA,MAAM,CAAA,GAAI,MAAA,EAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AACjC,EAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAChB,EAAA,MAAM,KAAK,IAAA,CAAK,MAAA;AAChB,EAAA,MAAM,OAAA,GAAW,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,CAAA,GAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAChE,EAAA,MAAM,KAAA,GAAW,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,CAAA,GAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAChE,EAAA,OAAO;AAAA,IACL,CAAA;AAAA,IAAG,CAAA;AAAA,IAAG,CAAA;AAAA,IAAG,CAAA;AAAA,IAAG,EAAA;AAAA,IAAI,EAAA;AAAA,IAChB,OAAA;AAAA,IAAS,KAAA;AAAA,IACT,CAAA,EAAG,SAAS,EAAA,IAAM,CAAA;AAAA,IAClB,CAAA,EAAG,QAAA,CAAS,QAAA,IAAY,MAAA,EAAQ,YAAY,IAAA,CAAK,QAAA;AAAA,IACjD,CAAA,EAAG,MAAA,EAAQ,QAAA,IAAY,IAAA,CAAK;AAAA,GAC9B;AACF;ACpCA,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAgDpB,IAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAuGpB,SAAS,QAAQ,KAAA,EAAoE;AACnF,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAC9D,EAAA,MAAM,CAAA,GAAI,IAAIC,aAAA,CAAM,KAAK,CAAA;AACzB,EAAA,OAAO,CAAC,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,KAAA,EAAO,EAAE,IAAI,CAAA;AAChC;AAEO,IAAM,eAAA,GAAN,cAA8BC,cAAA,CAAO;AAAA,EAC1C,WAAA,CAAY,OAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,MAAM;AAAA,MACJ,QAAA,GAAW,SAAA;AAAA,MACX,SAAA,GAAY,GAAA;AAAA,MACZ,SAAA,GAAY,GAAA;AAAA,MACZ,KAAA,GAAQ;AAAA,KACV,GAAI,OAAA;AAEJ,IAAA,MAAM,SAAA,GAAYC,kBAAU,IAAA,CAAK;AAAA,MAC/B,MAAA,EAAQC,yBAAA;AAAA,MACR,QAAA,EAAU,WAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,UAAA,GAAaC,mBAAW,IAAA,CAAK;AAAA,MACjC,MAAA,EAAQ,EAAE,MAAA,EAAQ,WAAA,EAAa,YAAY,YAAA,EAAa;AAAA,MACxD,QAAA,EAAU,EAAE,MAAA,EAAQ,WAAA,EAAa,YAAY,cAAA;AAAe,KAC7D,CAAA;AAED,IAAA,KAAA,CAAM;AAAA,MACJ,SAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACT,cAAA,EAAgB,IAAIC,oBAAA,CAAa;AAAA,UAC/B,WAAa,EAAE,KAAA,EAAO,QAAQ,QAAQ,CAAA,EAAG,MAAM,WAAA,EAAY;AAAA,UAC3D,UAAA,EAAa,EAAE,KAAA,EAAO,SAAA,EAAmB,MAAM,KAAA,EAAM;AAAA,UACrD,UAAA,EAAa,EAAE,KAAA,EAAO,SAAA,EAAmB,MAAM,KAAA,EAAM;AAAA,UACrD,MAAA,EAAa,EAAE,KAAA,EAAO,KAAA,EAAmB,MAAM,KAAA;AAAM,SACtD;AAAA;AACH,KACD,CAAA;AAAA,EACH;AAAA,EAEA,IAAI,SAAA,GAAoB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAS,UAAA;AAAA,EAAsB;AAAA,EAC9F,IAAI,UAAU,CAAA,EAAW;AAAE,IAAA,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAS,UAAA,GAAa,CAAA;AAAA,EAAG;AAAA,EAClF,IAAI,SAAA,GAAoB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAS,UAAA;AAAA,EAAsB;AAAA,EAC9F,IAAI,UAAU,CAAA,EAAW;AAAE,IAAA,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAS,UAAA,GAAa,CAAA;AAAA,EAAG;AAAA,EAClF,IAAI,KAAA,GAAgB;AAAE,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAS,MAAA;AAAA,EAAkB;AAAA,EACtF,IAAI,MAAM,CAAA,EAAW;AAAE,IAAA,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,EAAG;AAAA,EAE1E,YAAY,KAAA,EAAgD;AAC1D,IAAA,MAAM,GAAA,GAAM,QAAQ,KAAK,CAAA;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAS,SAAA;AACjD,IAAA,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAAG,IAAA,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAAG,IAAA,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AAAA,EAC5C;AACF,CAAA;;;ACtMA,IAAM,QAAA,GAAsE;AAAA,EAC1E,SAAA,EAAW;AACb,CAAA;AAaA,SAAS,oBAAoB,CAAA,EAAyB;AACpD,EAAA,OAAO,CAAC,CAAC,CAAA,IAAK,OAAO,MAAM,QAAA,IAAY,OAAQ,EAA0B,KAAA,KAAU,UAAA;AACrF;AAEO,SAAS,aAAa,IAAA,EAA+B;AAC1D,EAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,IAAA,MAAMC,QAAQ,IAAA,CAA0B,MAAA;AACxC,IAAA,IAAI,CAAC,mBAAA,CAAoBA,KAAI,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,gIAAgI,CAAA;AAAA,IAClJ;AACA,IAAA,MAAM,KAAA,GAAQA,KAAAA;AACd,IAAA,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAA;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAA,mCAAA,EAAuC,IAAA,CAA0B,IAAI,CAAA,CAAA,CAAG,CAAA;AAClG,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,GAAG,QAAO,GAAI,IAAA;AACtC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAM,CAAA;AAC3B,EAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,EAAA,OAAO,IAAA;AACT;;;AChCO,IAAe,WAAf,MAAwB;AAAA,EAC7B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA,GAA2B,IAAA;AAAA,EAC3B,cAAA,GAAiB,CAAA;AAAA,EACjB,eAAA,GAAkB,CAAA;AAAA,EAClB,EAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAyB,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,YAAA,GAAgC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,aAAA,GAA+B,IAAA;AAAA,EAE/B,WAAA,CAAY,IAAA,EAAoB,MAAA,EAAiC,IAAA,EAAwB;AACvF,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,IAAM,CAAA;AACrB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAAA,EACvB;AAAA,EAIA,YAAA,GAAqB;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,IAAW,EAAC;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,YAAY,CAAA;AACrC,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,SAAA,IAAa,IAAA,CAAK,MAAA,EAAQ;AAC3C,MAAC,IAAA,CAAK,MAAA,CAAiD,OAAA,GAAU,IAAA,CAAK,OAAA;AAAA,IACxE;AAIA,IAAA,MAAM,EAAA,GAAK,KAAK,IAAA,CAAK,UAAA;AACrB,IAAA,IAAI,EAAA,IAAM,KAAK,MAAA,EAAQ;AACrB,MAAA,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,IAAIC,iBAAA,CAAU,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,KAAA,EAAO,EAAA,CAAG,MAAM,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,KAAA,GAAe;AACb,IAAA,OAAO,UAAA,CAAW,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAK,IAAI,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,WAAA,GAA2B;AACnC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AACjD,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,WAAA,EAAY;AAGjC,IAAA,MAAM,SAAA,GAAY,SAAS,IAAA,CAAK,EAAA;AAChC,IAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,SAAgD,KAAA,EAA4C,IAAI,OAAO,CAAA;AAC3I,IAAA,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,QAAA,EAAW,KAAA,EAA4C,EAAC,EAAG,SAAA,EAAW,OAAO,CAAA;AAK7I,IAAA,MAAM,OAAA,GAAU,YAAY,IAAA,CAAK,QAAA;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,aAAa,SAAA,IAAa,CAAA;AACtC,IAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,IAAQ,SAAS,CAAA;AACzD,IAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,EAAQ,EAAE,UAAA,EAAY,KAAA,IAAS,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,YAAA,CAAa,MAAyB,SAAA,EAAyB;AAAA,EAE/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAA,CAAY,IAAY,KAAA,EAAwB;AAAA,EAEhD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,cAAc,SAAA,EAAU;AAAA,EAC/B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,QAAQ,OAAA,IAAU;AACvB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AACF;;;ACrHO,SAAS,gBAAgB,IAAA,EAGhB;AACd,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA;AAC1D,EAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG;AACrC,IAAA,KAAA,MAAW,GAAA,IAAO,CAAC,EAAA,CAAG,GAAA,EAAK,GAAG,EAAA,EAAI,EAAA,CAAG,IAAI,CAAA,EAAG;AAC1C,MAAA,KAAA,MAAW,CAAA,IAAK,OAAO,IAAA,CAAK,GAAA,IAAO,EAAE,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA;AAAA,IACnD;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;ACXA,IAAM,WAAA,GAAoB,CAAA,CAAA,KAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAGtC,SAAS,cAAc,IAAA,EAA+C;AAC3E,EAAA,OAAO,IAAA,CAAK,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,CAAA,QAAA,EAAW,KAAK,IAAI,CAAA,MAAA,CAAA;AAClE;AAQO,SAAS,UAAA,CAAW,IAAA,EAAoB,cAAA,EAAwB,IAAA,GAAa,WAAA,EAAmB;AACrG,EAAA,MAAM,GAAA,GAAM,cAAc,IAAI,CAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,KAAK,EAAA,IAAM,CAAA;AACtB,EAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,IAAA,IAAA,CAAK,iBAAiB,GAAG,CAAA,WAAA,EAAc,EAAE,CAAA,+BAAA,EAAkC,cAAc,CAAA,0BAAA,CAA4B,CAAA;AAAA,EACvH;AACA,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,cAAA;AAClC,EAAA,CAAC,KAAK,SAAA,IAAa,IAAI,OAAA,CAAQ,CAAC,IAAI,CAAA,KAAM;AACxC,IAAA,MAAM,GAAA,GAAM,GAAG,EAAA,IAAM,CAAA;AACrB,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,IAAA;AAAA,QACE,iBAAiB,GAAG,CAAA,YAAA,EAAe,CAAC,CAAA,YAAA,EAAe,GAAG,qCAAqC,QAAQ,CAAA,uHAAA,CAAA;AAAA,QAEnG;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAMO,SAAS,iBAAA,CAAkB,QAAA,EAAoB,KAAA,GAAQ,CAAA,EAAa;AACzE,EAAA,IAAI,QAAA,CAAS,MAAA,IAAU,KAAA,EAAO,OAAO,QAAA;AACrC,EAAA,OAAO,CAAC,GAAG,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,cAAA,EAAiB,QAAA,CAAS,MAAA,GAAS,KAAK,CAAA,6HAAA,CAA+H,CAAA;AAC9M;AAGO,SAAS,QAAA,CAAS,IAAA,EAAoB,IAAA,GAAa,WAAA,EAAmB;AAC3E,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AAC1B,EAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA,CAAE,IAAA,CAAK,IAAA,IAAQ,EAAA,EAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAChF,IAAA,IAAA,CAAK,CAAA,cAAA,EAAiB,aAAA,CAAc,IAAI,CAAC,CAAA,2IAAA,CAA6I,CAAA;AAAA,EACxL;AACF;;;AC1CO,IAAM,GAAA,GAAM,KAAK,EAAA,GAAK;AACtB,IAAM,WAAA,GAAc;AACpB,IAAM,OAAA,GAAU,CAAA;AAChB,IAAM,OAAA,GAAU,GAAA;AAEhB,IAAM,IAAA,GAAO,CAAA;AAuCb,SAAS,SAAS,GAAA,EAAqB;AAC5C,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,GAAG,OAAO,WAAA;AAClC,EAAA,OAAO,KAAK,GAAA,CAAI,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA,EAAS,GAAG,CAAC,CAAA;AACjD;AAGO,SAAS,YAAA,CAAa,YAAoB,MAAA,EAAwB;AACvE,EAAA,OAAQ,UAAA,GAAa,IAAK,IAAA,CAAK,GAAA,CAAK,SAAS,MAAM,CAAA,GAAI,MAAO,CAAC,CAAA;AACjE;AAGO,SAAS,UAAA,CAAW,KAAA,EAAe,KAAA,EAAe,GAAA,GAAc,WAAA,EAA0B;AAC/F,EAAA,OAAO;AAAA,IACL,GAAG,KAAA,GAAQ,CAAA;AAAA,IAAG,GAAG,KAAA,GAAQ,CAAA;AAAA,IAAG,CAAA,EAAG,YAAA,CAAa,KAAA,EAAO,GAAG,CAAA;AAAA,IACtD,SAAS,KAAA,GAAQ,CAAA;AAAA,IAAG,SAAS,KAAA,GAAQ,CAAA;AAAA,IAAG,OAAA,EAAS,CAAA;AAAA,IACjD;AAAA,GACF;AACF;AAEO,SAAS,WAAA,CAAY,GAAA,EAAkB,KAAA,EAAe,KAAA,EAA4B;AACvF,EAAA,IAAI,EAAA,GAAK,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,CAAA;AAC3B,EAAA,IAAI,EAAA,GAAK,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,CAAA;AAC3B,EAAA,IAAI,EAAA,GAAK,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,CAAA;AAC3B,EAAA,IAAI,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,IAAI,EAAE,CAAA;AAC/B,EAAA,IAAI,MAAM,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA;AAAG,IAAA,EAAA,GAAK,EAAA;AAAI,IAAA,GAAA,GAAM,CAAA;AAAA,EAAG;AACpD,EAAA,EAAA,IAAM,GAAA;AAAK,EAAA,EAAA,IAAM,GAAA;AAAK,EAAA,EAAA,IAAM,GAAA;AAG5B,EAAA,IAAI,KAAK,CAAC,EAAA;AACV,EAAA,MAAM,EAAA,GAAK,CAAA;AACX,EAAA,IAAI,EAAA,GAAK,EAAA;AACT,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC9B,EAAA,IAAI,OAAO,IAAA,EAAM;AAAE,IAAA,EAAA,GAAK,CAAA;AAAG,IAAA,EAAA,GAAK,CAAA;AAAA,EAAG,CAAA,MAAO;AAAE,IAAA,EAAA,IAAM,IAAA;AAAM,IAAA,EAAA,IAAM,IAAA;AAAA,EAAM;AAGpE,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAE1B,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,CAAA;AAAA,IAAG,IAAI,GAAA,CAAI,CAAA;AAAA,IAAG,IAAI,GAAA,CAAI,CAAA;AAAA,IAC9B,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAAI,EAAA;AAAA,IAChC,KAAA,EAAQ,KAAA,GAAQ,CAAA,GAAK,IAAA,CAAK,GAAA,CAAK,SAAS,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA,GAAO,CAAC,CAAA;AAAA,IAC3D,OAAO,KAAA,GAAQ,CAAA;AAAA,IAAG,OAAO,KAAA,GAAQ;AAAA,GACnC;AACF;AAGO,SAAS,YAAA,CAAa,CAAA,EAAmB,EAAA,EAAY,EAAA,EAAkB;AAC5E,EAAA,IAAI,CAAA,GAAA,CAAK,EAAA,GAAK,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA;AAC5B,EAAA,IAAI,CAAA,GAAA,CAAK,EAAA,GAAK,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA;AAC5B,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AAC5B,EAAA,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AAC5B,EAAA,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAEtC,EAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AACxB,EAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AACxB,EAAA,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAEvC,EAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AACxB,EAAA,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA;AACxB,EAAA,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAEtC,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAA,EAAE;AAC9C;AAEO,SAAS,YAAA,CAAa,GAAgB,CAAA,EAAkD;AAC7F,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,EAAA;AACnB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,EAAA;AACnB,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,EAAA;AACnB,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA;AAC1C,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA;AAC1C,EAAA,MAAM,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA,GAAK,KAAK,CAAA,CAAE,EAAA;AAC1C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,KAAA,GAAS,CAAA,CAAE,QAAQ,EAAA,GAAM,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,QAAS,CAAA,CAAE,KAAA,GAAQ,EAAA,GAAM,EAAA,EAAI,OAAO,EAAA,EAAG;AACzF;AAEO,SAAS,YAAA,CAAa,CAAA,EAAmB,KAAA,EAAa,CAAA,EAAgC;AAC3F,EAAA,MAAM,GAAA,GAA+B;AAAA,IACnC,CAAC,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AAAA,IACjB,CAAC,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,IAC/B,CAAC,MAAM,CAAA,GAAI,KAAA,CAAM,OAAO,KAAA,CAAM,CAAA,GAAI,MAAM,MAAM,CAAA;AAAA,IAC9C,CAAC,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,MAAM,MAAM;AAAA,GAClC;AACA,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,GAAA,EAAK;AAC1B,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,EAAG,aAAa,CAAA,EAAG,EAAA,EAAI,EAAE,CAAC,CAAA;AACjD,IAAA,IAAI,EAAE,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAA,EAAO,OAAA,GAAU,KAAA;AACjC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAAA,EACvB;AACA,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AACzD,EAAA,OAAO,EAAE,OAAA,EAA6B,KAAA,EAAO,MAAA,CAAO,OAAO,OAAA,EAAQ;AACrE;AClIO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA;AAAA,EAG3C,KAAA,GAAQ,IAAA;AAAA,EACA,KAAA,GAAQ,CAAA;AAAA,EACR,SAAA,GAAY,KAAA;AAAA,EACZ,YAAA,GAAe,KAAA;AAAA,EAEvB,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,KAAK,IAAA,CAAK,KAAA;AAC9C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,MAAA,IAAU,KAAK,IAAA,CAAK,MAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY,KAAK,IAAA,CAAK,QAAA;AAAA,IACrD;AACA,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,KAAK,CAAA;AACzC,IAAA,MAAM,OAAA,GAAU,IAAIC,iBAAA,EAAU;AAC9B,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,CAAA;AACjB,IAAA,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AACvB,IAAA,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AACvB,IAAA,OAAA,CAAQ,UAAU,IAAA,CAAK,OAAA;AACvB,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,GAAA;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,IAAA,IAAA,CAAK,QAAQ,CAAC,eAAA,CAAgB,KAAK,IAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAAA,EAClD;AAAA;AAAA,EAGA,KAAA,GAAqB;AACnB,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,CAAC,KAAK,SAAA,IAAa,EAAE,EAAE,GAAA,IAAO,OAAA,IAAW,CAAA,CAAE,GAAA,IAAO,OAAA,CAAA,EAAU;AAC9D,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AACtD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,GAAG,CAAA,MAAA,EAAS,CAAA,CAAE,GAAG,CAAA,aAAA,EAAgB,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,UAAA,CAAY,CAAA;AAAA,IACtG;AACA,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,KAAK,KAAA,GAAQ,YAAA,CAAa,KAAK,KAAA,EAAO,GAAG,IAAI,CAAA,CAAE,CAAA;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,YAAY,CAAA,EAAG;AACnF,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AACtD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,GAAG,CAAA,6DAAA,CAA+D,CAAA;AAAA,IACxG;AACA,IAAA,OAAO;AAAA,MACL,GAAG,CAAA,CAAE,CAAA;AAAA,MAAG,GAAG,CAAA,CAAE,CAAA;AAAA,MAAG,CAAA;AAAA,MAChB,SAAS,CAAA,CAAE,OAAA;AAAA,MAAS,SAAS,CAAA,CAAE,OAAA;AAAA,MAAS,SAAS,CAAA,CAAE,OAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,GAAuB;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,EAAA;AACzC,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,IAAS,IAAA,CAAK,YAAY,CAAA,CAAA,EAAG;AAAA,EACpD;AACF;;;AC3DO,SAAS,aAAA,CACd,QAAA,EACA,EAAA,EACA,IAAA,EACA,OACA,KAAA,EACM;AACN,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,MAAA;AACJ,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,IAAI,CAAA,GAAI;AAAE,MAAA,OAAO,CAAA;AAAA,IAAG,CAAA;AAAA,IACpB,IAAI,EAAE,IAAA,EAAc;AAClB,MAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,CAAA,GAAI,CAAA,EAAG;AAAE,QAAA,MAAA,GAAS,IAAA,EAAK;AAAG,QAAA,KAAA,CAAM,KAAK,CAAA;AAAA,MAAG,CAAA,MAAA,IAChD,IAAA,GAAO,CAAA,IAAK,CAAA,IAAK,CAAA,EAAG;AAAE,QAAA,KAAA,CAAM,MAAM,CAAA;AAAA,MAAG;AAC9C,MAAA,CAAA,GAAI,IAAA;AAAA,IACN;AAAA,GACF;AACA,EAAA,QAAA,CAAS,IAAI,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,IAAK,EAAE,CAAA;AAClC;;;ACNO,SAAS,gBAAA,CACd,IAAA,EACA,EAAA,EACA,KAAA,EACuB;AACvB,EAAA,MAAM,QAAA,GAAW,YAAY,IAAI,CAAA;AACjC,EAAA,MAAM,MAAA,GAAW,YAAY,EAAE,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAW,WAAW,QAAQ,CAAA;AACpC,EAAA,MAAM,IAAA,GAAW,WAAW,MAAM,CAAA;AAElC,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAO,CAAC,CAAA,KAAsB;AAC5B,MAAA,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA;AAClC,MAAA,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA;AAClC,MAAA,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA;AAClC,MAAA,MAAM,QAAQ,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA;AAC1C,MAAA,OAAO,UAAA,CAAW,WAAW,EAAE,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,KAAK,CAAA;AAAA,IAClD,CAAA;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,aAAa,MAAM,CAAA;AACnC,EAAA,MAAM,KAAA,GAAU,aAAa,IAAI,CAAA;AAIjC,EAAA,IAAI,OAAA,CAAQ,CAAA,GAAI,IAAA,EAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,CAAA;AACxC,EAAA,IAAI,KAAA,CAAM,CAAA,GAAI,IAAA,EAAQ,KAAA,CAAM,IAAM,OAAA,CAAQ,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,OAAA,CAAQ,CAAA,EAAG,MAAM,CAAC,CAAA;AAEpD,EAAA,OAAO,CAAC,CAAA,KAAsB;AAC5B,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,CAAA;AACpC,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,QAAA,GAAW,CAAA;AACjC,IAAA,MAAM,QAAQ,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA;AAC1C,IAAA,MAAM,KAAK,YAAA,CAAa,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACnC,IAAA,OAAO,UAAA,CAAW,UAAA,CAAW,EAAE,CAAA,EAAG,KAAK,CAAA;AAAA,EACzC,CAAA;AACF;AAMA,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,CAAA,EAAA,CAAK,KAAA,IAAS,EAAA,GAAM,GAAA,IAAQ,KAAK,CAAA,EAAA,CAAK,KAAA,IAAS,CAAA,GAAK,GAAA,IAAQ,KAAK,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,IAAQ,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EAC1G;AACA,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,EAAE,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,SAAS,CAAC,CAAA;AACxC,EAAA,IAAI,EAAE,UAAA,CAAW,KAAK,CAAA,EAAG,OAAO,aAAa,CAAC,CAAA;AAG9C,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAClC;AAEA,SAAS,SAAS,CAAA,EAAiB;AACjC,EAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACrB,EAAA,IAAI,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA;AAC7B,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AACxC,IAAA,CAAA,GAAI,QAAA,CAAS,IAAI,CAAC,CAAA,GAAK,IAAI,CAAC,CAAA,EAAI,EAAE,CAAA,GAAI,GAAA;AACtC,IAAA,CAAA,GAAI,QAAA,CAAS,IAAI,CAAC,CAAA,GAAK,IAAI,CAAC,CAAA,EAAI,EAAE,CAAA,GAAI,GAAA;AACtC,IAAA,CAAA,GAAI,QAAA,CAAS,IAAI,CAAC,CAAA,GAAK,IAAI,CAAC,CAAA,EAAI,EAAE,CAAA,GAAI,GAAA;AACtC,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,GAAK,GAAA,CAAI,CAAC,CAAA,EAAI,EAAE,CAAA,GAAI,GAAA;AAAA,EAC9D,WAAW,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AAC/C,IAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACpC,IAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACpC,IAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACpC,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,EAC5D;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACtB;AAEA,SAAS,aAAa,CAAA,EAAiB;AAErC,EAAA,MAAM,KAAA,GAAQ,EAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACzD,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA;AACnE,EAAA,OAAO;AAAA,IACL,CAAA,EAAA,CAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,GAAA;AAAA,IACrB,CAAA,EAAA,CAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,GAAA;AAAA,IACrB,CAAA,EAAA,CAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,IAAK,GAAA;AAAA,IACrB,GAAG,KAAA,CAAM,MAAA,GAAS,IAAK,KAAA,CAAM,CAAC,KAAK,CAAA,GAAK;AAAA,GAC1C;AACF;AAEA,SAAS,UAAA,CAAW,KAA0C,KAAA,EAAuB;AACnF,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,CAAI,CAAC,IAAI,GAAG,CAAA;AACzC,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,CAAI,CAAC,IAAI,GAAG,CAAA;AACzC,EAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,CAAI,CAAC,IAAI,GAAG,CAAA;AACzC,EAAA,OAAO,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AACrC;AAIA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,OAAO,CAAA,IAAK,UAAU,CAAA,GAAI,KAAA,GAAQ,KAAK,GAAA,CAAA,CAAK,CAAA,GAAI,KAAA,IAAS,KAAA,EAAO,GAAG,CAAA;AACrE;AACA,SAAS,aAAa,CAAA,EAAmB;AACvC,EAAA,OAAO,CAAA,IAAK,QAAA,GAAY,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,KAAA;AACrE;AAIA,SAAS,WAAW,IAAA,EAAmB;AACrC,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,YAAA,GAAe,CAAA,GAAI,YAAA,GAAe,IAAI,YAAA,GAAe,CAAA;AAC/D,EAAA,MAAM,CAAA,GAAI,YAAA,GAAe,CAAA,GAAI,YAAA,GAAe,IAAI,YAAA,GAAe,CAAA;AAC/D,EAAA,MAAM,CAAA,GAAI,YAAA,GAAe,CAAA,GAAI,YAAA,GAAe,IAAI,YAAA,GAAe,CAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACtB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,YAAA,GAAe,EAAA,GAAK,WAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AAAA,IAC1D,CAAA,EAAG,YAAA,GAAe,EAAA,GAAK,WAAA,GAAe,KAAK,YAAA,GAAe,EAAA;AAAA,IAC1D,CAAA,EAAG,YAAA,GAAe,EAAA,GAAK,YAAA,GAAe,KAAK,WAAA,GAAe;AAAA,GAC5D;AACF;AAEA,SAAS,WAAW,GAAA,EAAiD;AACnE,EAAA,MAAM,KAAK,GAAA,CAAI,CAAA,GAAI,eAAe,GAAA,CAAI,CAAA,GAAI,eAAe,GAAA,CAAI,CAAA;AAC7D,EAAA,MAAM,KAAK,GAAA,CAAI,CAAA,GAAI,eAAe,GAAA,CAAI,CAAA,GAAI,eAAe,GAAA,CAAI,CAAA;AAC7D,EAAA,MAAM,KAAK,GAAA,CAAI,CAAA,GAAI,eAAe,GAAA,CAAI,CAAA,GAAI,cAAe,GAAA,CAAI,CAAA;AAC7D,EAAA,MAAM,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA;AACpB,EAAA,MAAM,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA;AACpB,EAAA,MAAM,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA;AACpB,EAAA,OAAO;AAAA,IACL,GAAG,YAAA,CAAa,YAAA,GAAgB,IAAI,YAAA,GAAe,CAAA,GAAI,eAAe,CAAC,CAAA;AAAA,IACvE,GAAG,YAAA,CAAa,aAAA,GAAgB,IAAI,YAAA,GAAe,CAAA,GAAI,eAAe,CAAC,CAAA;AAAA,IACvE,GAAG,YAAA,CAAa,aAAA,GAAgB,IAAI,YAAA,GAAe,CAAA,GAAI,cAAe,CAAC;AAAA,GACzE;AACF;AAIA,SAAS,aAAa,GAAA,EAAmB;AACvC,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,MAAM,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA,EAAG,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,EAAE;AAC9E;AAEA,SAAS,aAAa,GAAA,EAAmB;AACvC,EAAA,OAAO,EAAE,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG,GAAG,GAAA,CAAI,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAE;AAC5E;AAIA,SAAS,IAAA,CAAK,CAAA,EAAW,CAAA,EAAW,CAAA,EAAmB;AAAE,EAAA,OAAO,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AAAG;AACjF,SAAS,QAAQ,CAAA,EAAmB;AAAE,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAAG;AAExE,SAAS,gBAAA,CAAiB,MAAc,EAAA,EAAoB;AAG1D,EAAA,MAAM,MAAA,GAAS,KAAK,EAAA,GAAK,CAAA;AACzB,EAAA,IAAI,CAAA,GAAA,CAAK,KAAK,IAAA,IAAQ,MAAA;AACtB,EAAA,IAAI,CAAA,GAAK,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,MAAA;AACvB,EAAA,IAAI,CAAA,GAAI,CAAC,IAAA,CAAK,EAAA,EAAI,CAAA,IAAK,MAAA;AACvB,EAAA,OAAO,CAAA;AACT;;;ACjKO,SAAS,UAAA,CACd,QAAA,EACA,MAAA,EACA,GAAA,EACA,SAAA,EACA,OAAA,EACA,QAAA,EACA,IAAA,EACA,EAAA,EACA,UAAA,EACA,QAAA,EACA,IAAA,GAAyC,EAAC,EACpC;AACN,EAAA,IAAI,MAAA,GAA0C,IAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,EAAE,CAAA,EAAG,CAAA,EAAE;AACrB,EAAA,QAAA,CAAS,MAAA;AAAA,IACP,KAAA;AAAA,IACA,EAAE,GAAG,CAAA,EAAE;AAAA,IACP;AAAA,MACE,CAAA,EAAG,CAAA;AAAA,MAAG,QAAA;AAAA,MAAU,IAAA;AAAA,MAAM,GAAG,IAAA;AAAA,MACzB,SAAS,MAAM;AACb,QAAA,MAAM,KAAA,GAAS,SAAA,KAAc,MAAA,GAAY,SAAA,GAAY,OAAO,GAAG,CAAA;AAC/D,QAAA,IAAI,UAAU,MAAA,EAAW;AACzB,QAAA,MAAA,GAAS,UAAA,KAAe,KAAA,GACnBT,SAAAA,CAAK,KAAA,CAAM,WAAA,CAAY,KAAA,EAAO,OAAO,CAAA,GACtC,gBAAA,CAAiB,KAAA,EAAO,OAAA,EAAS,UAAU,CAAA;AAAA,MACjD,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAC5B,UAAA,IAAI,UAAU,QAAA,EAAS;AAAA,QACzB;AAAA,MACF;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;;;AC7CO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAG1C,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,UAAU,MAAMU,cAAA,CAAO,GAAA,CAAa,IAAA,CAAK,KAAK,KAAK,CAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAIC,cAAA,CAAO,EAAE,SAAS,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAC5D,IAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,KAAA;AAC9B,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,MAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY,KAAK,IAAA,CAAK,QAAA;AAAA,IACrD;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,CAAK,UAAA;AAC7B,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,KAAe,KAAA,EAAO;AAGvC,MAAA,KAAA,CAAM,YAAA,CAAa,UAAU,MAAM,CAAA;AACnC,MAAA;AAAA,IACF;AAKA,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,SAAA,GAAY,SAAS,IAAA,CAAK,EAAA;AAChC,IAAA,MAAM,UAAU,SAAA,CAAU,IAAA,CAAK,KAAK,OAAA,EAAS,CAAC,MAAM,CAAC,CAAA;AACrD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,SAAA,GACxB,KAAK,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAA,EAAA,KAAM,oBAAoB,EAAA,EAAI,CAAC,MAAM,CAAC,CAAC,CAAA,GAC/D,MAAA;AACJ,IAAA,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAgD,KAA0C,CAAA;AACpH,IAAA,cAAA,CAAe,QAAA,EAAU,KAAK,MAAA,EAAQ,SAAA,EAAW,KAAK,QAAA,EAAW,KAAA,EAA4C,EAAC,EAAG,SAAS,CAAA;AAG1H,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,IAAA,CAAK,OAAA,EAAiD,IAAA;AAC7E,IAAA,IAAI,QAAA,KAAa,MAAA,EAAY,IAAA,CAAK,OAA2C,IAAA,GAAO,QAAA;AAGpF,IAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG;AAC1C,MAAA,MAAM,KAAK,SAAA,GAAY,SAAA,CAAU,EAAA,CAAG,EAAA,EAAI,KAAK,QAAS,CAAA;AACtD,MAAA,MAAM,QAAA,GAAW,GAAG,QAAA,IAAY,CAAA;AAChC,MAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,MAAA;AACxB,MAAA,MAAM,QAAA,GAAY,GAAG,IAAA,EAA8C,IAAA;AACnE,MAAA,MAAM,MAAA,GAAY,GAAG,EAAA,EAA8C,IAAA;AACnE,MAAA,MAAM,OAAA,GAAY,GAAG,GAAA,EAA8C,IAAA;AACnE,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,aAAA,CAAc,QAAA,EAAU,EAAA,EAAI,MAAM,MAAA,CAAO,MAAM,CAAA,CAAA,KAAK;AAAE,UAAA,MAAA,CAAO,IAAA,GAAO,CAAA;AAAA,QAAG,GAAG,OAAO,CAAA;AAAA,MACnF;AACA,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,UAAA;AAAA,UACE,QAAA;AAAA,UACA,IAAA,CAAK,MAAA;AAAA,UACL,MAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA;AAAA,UAAU,IAAA;AAAA,UAAM,EAAA;AAAA,UAAI,UAAA;AAAA,UAAY,MAAA;AAAA,UAAW,SAAS,EAAE;AAAA,SACxD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AACrB,IAAA,MAAM,OAAA,GAAU,YAAY,IAAA,CAAK,QAAA;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,aAAa,SAAA,IAAa,CAAA;AACtC,IAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,IAAQ,SAAS,CAAA;AACzD,IAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,EAAQ,EAAE,UAAA,EAAY,KAAA,IAAS,OAAO,CAAA;AAAA,EAC1D;AACF,CAAA;AAEA,SAAS,SAAA,CAAU,OAA0B,IAAA,EAAmC;AAC9E,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AAAE,MAAA,OAAA,GAAU,IAAA;AAAM,MAAA;AAAA,IAAU;AAC7C,IAAA,GAAA,CAAI,CAAC,CAAA,GAAK,KAAA,CAAkC,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,UAAW,GAAA,GAA2B,KAAA;AAC/C;AAEA,SAAS,mBAAA,CAAoB,IAAc,IAAA,EAA0B;AACnE,EAAA,OAAO;AAAA,IACL,GAAG,EAAA;AAAA,IACH,GAAA,EAAK,SAAA,CAAU,EAAA,CAAG,GAAA,EAAK,IAAI,CAAA;AAAA,IAC3B,EAAA,EAAI,SAAA,CAAU,EAAA,CAAG,EAAA,EAAI,IAAI,CAAA;AAAA,IACzB,IAAA,EAAM,SAAA,CAAU,EAAA,CAAG,IAAA,EAAM,IAAI;AAAA,GAC/B;AACF;AC1FA,IAAM,iBAAA,GAAoB;AAAA,EACxB,YAAA;AAAA,EAAc,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,aAAA;AAAA,EAAe,cAAA;AAAA,EAAgB,YAAA;AAAA,EACzF,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS;AACtC,CAAA;AAIA,SAAS,WAAA,CAAY,GAAW,CAAA,EAAuC;AACrE,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAA,IAAY,CAAC,CAAC,CAAC,CAAA;AACjE,EAAA,IAAI,CAAC,CAAA,EAAG,QAAA,EAAU,OAAO,KAAA;AACzB,EAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AACnC,EAAA,OAAO,GAAA,CAAI,QAAQ,uBAAA,EAAyB,GAAG,KAAK,IAAA,KAAS,MAAA,GAAY,MAAM,IAAA,GAAO,EAAA,CAAA;AACxF;AAEO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA;AAAA,EAGjC,MAAA,GAAqB,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,EAChC,SAAA,GAAY,EAAA;AAAA;AAAA,EAGZ,YAAA,GAAqB;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,EAAA;AACnC,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AACnC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,SAAS,CAAA,CAAE,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAC5F,IAAA,IAAI,IAAA,KAAS,KAAK,SAAA,EAAW;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAC,IAAA,CAAK,OAAgB,IAAA,GAAO,IAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,UAAA,EAAY,OAAA;AAAA,MACZ,QAAA,EAAU,EAAA;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AACA,IAAA,MAAM,IAAA,GAAO,IAAIC,YAAA,CAAK;AAAA,MACpB,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,EAAA;AAAA,MACxB,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,KAAK,IAAA,CAAK;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,KAAA;AAC3B,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,MAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY,KAAK,IAAA,CAAK,QAAA;AAAA,IACrD;AACA,IAAA,IAAI,IAAA,CAAK,KAAK,KAAA,EAAO;AACnB,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,MAAA,MAAM,QAAA,GAAW,cAAA;AAAA,QACf,KAAK,IAAA,CAAK,KAAA;AAAA,QACV,KAAA;AAAA,QACA,EAAE,UAAU,iBAAA;AAAkB,OAChC;AACA,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,QAAC,IAAA,CAAK,KAAA,CAA6C,CAAC,CAAA,GAAK,SAAqC,CAAC,CAAA;AAAA,MACjG;AAEA,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,KAAA;AAC3B,MAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,MAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,YAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,OAAA,EAAiD,KAAA;AACjF,IAAA,IAAI,YAAA,KAAiB,QAAW,IAAA,CAAK,MAAA,CAAO,QAAQ,aAAA,CAAc,YAAA,EAAc,IAAA,CAAK,KAAA,EAAO,CAAA;AAC5F,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAI,IAAA,CAAK,cAAc,EAAA,EAAI;AACzB,MAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,KAAA;AAC3B,MAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,MAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,UAAA,IAAc,KAAA;AAO3C,IAAA,MAAM,WAAWC,UAAAA,CAAU,IAAA,CAAK,MAAM,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AACvD,IAAA,wBAAA,CAAyB,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACzD,IAAA,iBAAA,CAAkB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAgB,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,QAAA,EAAW,MAAA,GAAS,IAAA,CAAK,IAAI,UAAU,CAAA;AACxH,IAAA,kBAAA,CAAmB,UAAU,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,IAAA,CAAK,aAAa,EAAC,EAAG,KAAK,QAAA,EAAW,MAAA,GAAS,KAAK,EAAA,EAAI,IAAA,CAAK,OAAO,CAAA;AAAA,EAChJ;AACF,CAAA;AAKA,SAAS,wBAAA,CACP,IAAA,EACA,YAAA,EACA,QAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,eAAe,IAAA,CAAK,IAAA;AAC1B,EAAC,KAA+C,IAAA,GAAO,YAAA;AACvD,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,SAAA,CAAU,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,EAC7D,CAAA,SAAE;AACA,IAAC,KAA+C,IAAA,GAAO,YAAA;AAAA,EACzD;AACF;AAEA,SAASA,UAAAA,CAAU,MAAwB,IAAA,EAAkC;AAC3E,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,OAAA,EAAS,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IACtC,WAAW,IAAA,CAAK,SAAA,GACZ,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAA,MAAO;AAAA,MACxB,GAAG,EAAA;AAAA,MACH,GAAA,EAAK,UAAA,CAAW,EAAA,CAAG,GAAA,EAAK,IAAI,CAAA;AAAA,MAC5B,EAAA,EAAI,UAAA,CAAW,EAAA,CAAG,EAAA,EAAI,IAAI,CAAA;AAAA,MAC1B,IAAA,EAAM,UAAA,CAAW,EAAA,CAAG,IAAA,EAAM,IAAI;AAAA,MAC9B,CAAA,GACF;AAAA,GACN;AACF;AAEA,SAAS,UAAA,CAAW,OAA0B,IAAA,EAAmC;AAC/E,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,OAAK,CAAA,IAAK,KAAK,GAAG,OAAO,KAAA;AACxC,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,GAAG,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAK,MAAkC,CAAC,CAAA;AACxG,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAA,CAAc,GAAY,KAAA,EAAwB;AACzD,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,MAAM,MAAM,cAAA,CAAe,EAAE,CAAA,EAAE,EAAG,KAA0C,CAAA,CAAE,CAAA;AAC9E,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,MAAA,CAAO,GAAG,CAAA,IAAK,CAAA;AACxD;AAIA,SAAS,mBACP,QAAA,EACA,KAAA,EACA,SACA,SAAA,EACA,cAAA,EACA,QACA,KAAA,EACM;AACN,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,IAAA,GAAO,GAAG,GAAA,EAAK,KAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,GAAG,IAAA,EAAM,KAAA;AACvB,IAAA,MAAM,GAAA,GAAM,GAAG,EAAA,EAAI,KAAA;AACnB,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,KAAA,KAAU,MAAA,IAAa,QAAQ,MAAA,EAAW;AACpE,IAAA,MAAM,EAAA,GAAK,MAAA,GAAS,SAAA,CAAU,EAAA,CAAG,IAAI,cAAc,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,GAAG,QAAA,IAAY,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,MAAA;AACxB,IAAA,MAAM,IAAA,GAAO,SAAS,EAAE,CAAA;AACxB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AACnC,MAAA,aAAA,CAAc,QAAA,EAAU,EAAA,EAAI,MAAM,KAAA,CAAM,OAAO,CAAA,CAAA,KAAK;AAAE,QAAA,KAAA,CAAM,KAAA,GAAQ,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAG,GAAG,CAAC,CAAA;AAAA,IACxF;AACA,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW;AAC5C,MAAA,QAAA,CAAS,MAAA;AAAA,QAAO,KAAA;AAAA,QAAO,EAAE,KAAA,EAAO,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA,EAAE;AAAA,QAC1D,EAAE,KAAA,EAAO,aAAA,CAAc,GAAA,EAAK,KAAK,CAAA,EAAG,QAAA,EAAU,IAAA,EAAM,GAAG,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AAAA,QAAG;AAAA,OAAE;AAAA,IACxF,CAAA,MAAA,IAAW,QAAQ,MAAA,EAAW;AAC5B,MAAA,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,EAAE,KAAA,EAAO,cAAc,GAAA,EAAK,KAAK,CAAA,EAAG,QAAA,EAAU,MAAM,GAAG,IAAA,EAAM,QAAA,EAAU,OAAA,IAAW,EAAE,CAAA;AAAA,IACzG,CAAA,MAAA,IAAW,UAAU,MAAA,EAAW;AAC9B,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,EAAE,KAAA,EAAO,cAAc,KAAA,EAAO,KAAK,CAAA,EAAG,QAAA,EAAU,MAAM,GAAG,IAAA,EAAM,QAAA,EAAU,OAAA,IAAW,EAAE,CAAA;AAAA,IAC7G;AAAA,EACF;AACF;AAKA,SAAS,kBACP,QAAA,EACA,IAAA,EACA,SAAA,EACA,cAAA,EACA,QACA,UAAA,EACM;AAGN,EAAA,MAAM,KAAA,GAA+B,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,IAAA,EAA+B;AACvF,EAAA,MAAM,YAAY,MAAY;AAAE,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,KAAA,CAAM,IAAA;AAAA,EAAe,CAAA;AAEvE,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,EAAA,GAAK,MAAA,GAAS,SAAA,CAAU,EAAA,CAAG,IAAI,cAAc,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,GAAG,QAAA,IAAY,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,MAAA;AACxB,IAAA,MAAM,OAAA,GAAW,QAAA,CAAS,EAAA,CAAG,GAAG,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,EAAA,CAAG,IAAI,CAAA;AACjC,IAAA,MAAM,MAAA,GAAW,QAAA,CAAS,EAAA,CAAG,EAAE,CAAA;AAE/B,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,aAAA,CAAc,QAAA,EAAU,EAAA,EAAI,MAAM,KAAA,CAAM,MAAM,CAAA,CAAA,KAAK;AAAE,QAAA,KAAA,CAAM,IAAA,GAAO,CAAA;AAAG,QAAA,SAAA,EAAU;AAAA,MAAG,GAAG,OAAO,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,UAAA;AAAA,QACE,QAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QAAU,IAAA;AAAA,QAAM,EAAA;AAAA,QAAI,UAAA;AAAA,QACpB,SAAA;AAAA,QAAW,SAAS,EAAE;AAAA,OACxB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,IAAK,KAAA,CAAkC,IAAA;AAC7C,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,KAAM,UAAU,OAAO,CAAA;AAC3D,EAAA,OAAO,MAAA;AACT;ACjOO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAElC,YAAA,GAAmC,IAAA;AAAA,EAE3C,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,OAAO,MAAMH,cAAAA,CAAO,GAAA,CAAoB,IAAA,CAAK,KAAK,KAAK,CAAA;AAC7D,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA;AACzB,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAG/B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,EAAE,CAAA;AAChF,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,QAAA,CAAA,IAAa,IAAA,CAAK,IAAA,CAAK,QAAA;AAAA,IAC7F;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,QAAA,KAAa,MAAA,IAAa,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,GAAW,IAAA,EAAM;AAC1F,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,cAAA,EAAiB,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,eAAA,EAAkB,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,sBAAA,EACvG,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,2BAAA,EAA8B,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,mDAAA;AAAA,OACnF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAES,aAAa,SAAA,EAA0B;AAAA,EAEhD;AAAA,EAES,YAAA,CAAa,KAAwB,QAAA,EAAwB;AACpE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,CAAA;AAC1C,IAAA,MAAM,kBAAqD,EAAC;AAC5D,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,IAAA,MAAM,EAAA,GAAK,WAAW,IAAA,CAAK,EAAA;AAI3B,IAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,IACvC,GAAA,CAAI,CAAA,GAAA,KAAO,iBAAA,CAAkB,GAAA,EAAK,GAAG,CAAC,CAAA,CACtC,MAAA,CAAO,CAAA,EAAA,KAAM,CAAC,EAAA,CAAG,GAAA,EAAK,EAAA,CAAG,EAAA,EAAI,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,KAAK,QAAA,IAAY,CAAC,CAAC,CAAA,CACnE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AAC7B,IAAA,IAAI,OAAA,GAAU,aAAA;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAc,KAAA,KAAwB;AAAE,MAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,IAAG,CAAA;AAC9F,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,MAAM,KAAA,GAAQ,KAAK,EAAA,CAAG,EAAA;AACtB,MAAA,MAAM,GAAA,GAAM,QAAQ,EAAA,CAAG,QAAA;AACvB,MAAA,MAAM,GAAA,GAAO,GAAG,GAAA,EAA4C,MAAA;AAC5D,MAAA,MAAM,EAAA,GAAM,GAAG,EAAA,EAA2C,MAAA;AAC1D,MAAA,MAAM,IAAA,GAAQ,GAAG,IAAA,EAA6C,MAAA;AAC9D,MAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AACpB,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,KAAA,IAAS,GAAA,KAAQ,MAAA,EAAW;AAC1C,QAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAChB,QAAA,OAAA,GAAU,GAAA;AAAA,MACZ,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,IAAA,IAAQ,OAAO,MAAA,EAAW;AAC/C,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,QAAA,IAAY,OAAO,MAAA,EAAW;AACnD,QAAA,KAAA,CAAM,KAAA,EAAO,QAAQ,OAAO,CAAA;AAC5B,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,MAAA,IAAU,SAAS,MAAA,EAAW;AACnD,QAAA,KAAA,CAAM,OAAO,IAAI,CAAA;AACjB,QAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,QAAQ,IAAA,CAAK,YAAA;AAAA,MACb,IAAA,EAAM,CAAC,CAAC,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAClB,KAAA,EAAO,WAAW,IAAA,CAAK,EAAA;AAAA,MACvB,GAAA,EAAK,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,GAAA;AAAA,MAC1B,aAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AACF,CAAA;;;ACpEO,IAAM,aAAN,MAAiB;AAAA,EACtB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,uBAAqC,GAAA,EAAI;AAAA,EACjC,QAAA,uBAAwD,GAAA,EAAI;AAAA,EAEpE,WAAA,CAAY,IAAA,EAAiB,OAAA,GAA6B,EAAC,EAAG;AAC5D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AAAA,EACtC;AAAA,EAEQ,KAAK,IAAA,EAAsB;AACjC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,WAAW,IAAA,EAA0C;AACzD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAE1B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AACrB,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,SAAS,OAAO,OAAA;AAEpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,OAAA;AACpB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACvB,UAAA,KAAA,CAAM,KAAA,IAAQ;AACd,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACnC,UAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,UAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA;AAC5B,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AACzB,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACtB;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,IAAA,EAA0C;AAM7D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,UAAU,IAAI,CAAA;AAC7C,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,MAAA,MAAM,KAAA,GAAQ,OAAO,YAAA,EAAa;AAClC,MAAA,MAAA,CAAO,KAAA,IAAQ;AACf,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,cAAc,GAAA,YAAe,YAAA,KAC7B,IAAI,IAAA,KAAS,eAAA,IAAmB,IAAI,IAAA,KAAS,mBAAA,CAAA;AACnD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAA,CAAQ,KAAA,CAAM,iDAAA,EAAmD,IAAA,EAAM,UAAA,EAAO,IAAI,IAAI,CAAA;AAAA,MACxF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,4CAAA,EAA8C,IAAA,EAAM,UAAA,EAAO,GAAG,CAAA;AAAA,MAC7E;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,QAAA,EAAU;AACtC,MAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AAC3C,MAAA,IAAI,cAAc,MAAA,EAAW;AAC7B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAC5C,MAAA,WAAA,EAAa,KAAA,IAAQ;AACrB,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,KAAA,MAAW,KAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,KAAM,KAAA,IAAQ;AAChD,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AACF,CAAA;;;AC/FO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAElC,eAAA,GAAkB,CAAA;AAAA,EAClB,YAAA,GAAmC,IAAA;AAAA,EACnC,MAAA,GAA4B,IAAA;AAAA,EAC5B,OAAA,GAAoC,IAAA;AAAA,EACpC,IAAA,GAAwC,IAAA;AAAA,EACxC,QAAA,GAAW,CAAA;AAAA,EAEnB,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,OAAO,MAAMA,cAAAA,CAAO,GAAA,CAAoB,IAAA,CAAK,KAAK,KAAK,CAAA;AAC7D,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,QAAA;AAC5B,IAAA,IAAA,CAAK,eAAgB,IAAA,CAAK,IAAA,CAAK,KAAA,KAAU,KAAA,GAAS,KAAK,WAAA,GAAc,IAAA;AACrE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,MAA8B,EAAE,QAAA,EAAU,IAAI,CAAA;AAEhF,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,CAAC,CAAA;AACjD,IAAA,MAAM,CAAA,GAAI,YAAY,YAAA,IAAgB,IAAA;AACtC,IAAA,MAAM,CAAA,GAAI,YAAY,aAAA,IAAiB,IAAA;AAEvC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,KAAA,GAAQ,CAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AACf,IAAA,IAAA,CAAK,OAAO,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AACnD,IAAA,IAAI,UAAA,IAAc,KAAK,IAAA,EAAM,IAAA,CAAK,KAAK,SAAA,CAAU,UAAA,EAAY,GAAG,CAAC,CAAA;AAEjE,IAAA,MAAM,OAAA,GAAUI,eAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,IAAIH,cAAAA,CAAO,EAAE,SAAS,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AAC5D,IAAA,MAAA,CAAO,QAAA,GAAW,IAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AAEvB,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,IAAA,CAAK,YAAY,IAAA,CAAK,QAAA,IAAY,KAAK,IAAA,CAAK,QAAA;AAAA,IACnE;AAEA,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,MAAM,GAAA,GAAM,IAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,aAAA,EAAe;AAAA,MAC3C,GAAA,GAAc;AAAE,QAAA,OAAO,WAAA;AAAA,MAAa,CAAA;AAAA,MACpC,IAAI,CAAA,EAAW;AACb,QAAA,WAAA,GAAc,CAAA;AACd,QAAA,MAAM,KAAA,GAAQ,EAAE,GAAA,CAAI,QAAA;AACpB,QAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAI,eAAA,GAAkB,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,eAAA,GAAkB,CAAA;AACpF,QAAA,GAAA,CAAI,MAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,CAAE,KAAK,CAAA,KAAA,KAAS;AAC3C,UAAA,IAAI,KAAA,KAAU,IAAI,QAAA,EAAU;AAC5B,UAAA,IAAI,CAAC,KAAA,IAAS,CAAC,GAAA,CAAI,IAAA,EAAM;AACzB,UAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAC9B,UAAA,OAAA,CAAQ,OAAO,MAAA,EAAO;AAAA,QACxB,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAIhB,UAAA,OAAA,CAAQ,IAAA,CAAK,0CAA0C,GAAG,CAAA;AAAA,QAC5D,CAAC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,KAAA,CAAM,YAAA,CAAa,UAAU,MAAM,CAAA;AACnC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,IAAA,GAC3B,IAAA,CAAK,QAAA,GACL,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,EAAW,IAAA,CAAK,eAAe,CAAA;AACjD,IAAA,QAAA,CAAS,MAAA;AAAA,MACP,IAAA,CAAK,MAAA;AAAA,MACL,EAAE,aAAa,CAAA,EAAE;AAAA,MACjB,EAAE,WAAA,EAAa,YAAA,EAAc,QAAA,EAAU,YAAA,EAAc,MAAM,MAAA,EAAO;AAAA,MAClE,SAAS,IAAA,CAAK;AAAA;AAAA,KAChB;AAAA,EACF;AAAA,EAES,YAAA,CAAa,KAAwB,QAAA,EAAwB;AACpE,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,CAAA;AAC1C,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,QAAQ,IAAA,CAAK,YAAA;AAAA,MACb,IAAA,EAAM,CAAC,CAAC,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAClB,KAAA,EAAO,WAAW,IAAA,CAAK,EAAA;AAAA,MACvB,GAAA,EAAK,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,IAAA,CAAK,QAAA;AAAA,MAC/B,aAAA;AAAA,MACA,iBAAiB;AAAC,KACnB,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,IAAA,EAA6B;AAC9C,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,CAAK,QAAA;AACrB,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,IAAA,IAAQ,KAAK,eAAA,GAAkB,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,eAAA,GAAkB,IAAA;AAC1F,IAAA,IAAI,KAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAQ,UAAA,CAAW,MAAM,CAAA;AAAA,IAC9C,SAAS,GAAA,EAAK;AAGZ,MAAA,OAAA,CAAQ,IAAA,CAAK,sCAAA,EAAwC,IAAA,EAAM,UAAA,EAAO,GAAG,CAAA;AACrE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,KAAU,KAAK,QAAA,EAAU;AAC7B,IAAA,IAAI,KAAA,IAAS,KAAK,IAAA,EAAM;AACtB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAC/B,QAAC,IAAA,CAAK,MAAA,CAAkB,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAO;AAAA,MAChD,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,IAAA,CAAK,mCAAA,EAAqC,IAAA,EAAM,UAAA,EAAO,GAAG,CAAA;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA,EAES,OAAA,GAAgB;AACvB,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,KAAA,CAAM,OAAA,EAAQ;AAAA,EAChB;AACF,CAAA;;;AC1HO,SAAS,SAAS,CAAA,EAA4B;AACnD,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,GAAA,GAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA;AACzE;AAEA,SAAS,gBAAgB,CAAA,EAAoE;AAC3F,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,EAAC;AAC1B,EAAA,IAAI,MAAM,MAAA,GAAS,CAAA,EAAG,MAAM,IAAI,MAAM,oGAAoG,CAAA;AAC1I,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAE,MAAA,EAAQ,CAAA,CAAE,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC,CAAA,EAAE,GAAI,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,KAAA,EAAQ,CAAA;AACjH;AAOO,SAAS,gBAAgB,CAAA,EAA0C;AACxE,EAAA,MAAM,UAAA,GAAa,gBAAgB,CAAC,CAAA;AACpC,EAAA,MAAM,CAAA,GAAA,CAAM,CAAA,CAAE,KAAA,IAAS,EAAA,IAAM,KAAK,EAAA,GAAM,GAAA;AACxC,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,CAAI,CAAC,GAAG,EAAA,GAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AACvC,EAAA,MAAM,CAAA,GAAA,CAAK,KAAK,GAAA,CAAI,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA;AAC1C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,EAAE,CAAA,EAAG,GAAA,GAAM,KAAK,CAAA,EAAG,CAAA,EAAG,GAAA,GAAM,EAAA,GAAK,CAAA,EAAE;AAAA,IAC1C,GAAA,EAAK,EAAE,CAAA,EAAG,GAAA,GAAM,KAAK,CAAA,EAAG,CAAA,EAAG,GAAA,GAAM,EAAA,GAAK,CAAA,EAAE;AAAA,IACxC,UAAA;AAAA,IAAY,YAAA,EAAc;AAAA,GAC5B;AACF;AAgBO,SAAS,WAAA,CAAY,GAAA,EAAgB,IAAA,EAAc,CAAA,EAAuB;AAC/E,EAAA,MAAM,KAAA,GAAQ,gBAAgB,CAAC,CAAA;AAC/B,EAAA,MAAM,CAAC,IAAI,EAAE,CAAA,GAAI,EAAE,MAAA,IAAU,CAAC,KAAK,GAAG,CAAA;AACtC,EAAA,MAAM,OAAO,GAAA,CAAI,oBAAA,CAAqB,KAAK,IAAA,EAAM,EAAA,GAAK,OAAO,CAAA,CAAE,WAAA,IAAe,CAAA,IAAK,IAAA,EAAM,KAAK,IAAA,EAAM,EAAA,GAAK,OAAO,CAAA,CAAE,MAAA,IAAU,OAAO,IAAI,CAAA;AACvI,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,IAAA,CAAK,YAAA,CAAa,EAAE,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,KAAK,CAAC,CAAA;AACpE,EAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,EAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,IAAI,CAAA;AAC/B;;;AChDA,IAAM,WAAA,GAAc,GAAA;AAGb,SAAS,iBAAiB,CAAA,EAA6E;AAC5G,EAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,KAAA,GAAQ,WAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,WAAA;AAChB,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,WAAA,CAAY,GAAA,EAA6B,aAAa,CAAC,CAAA;AACvD,MAAA,OAAO,EAAE,OAAA,EAASG,eAAAA,CAAQ,KAAK,MAAM,CAAA,EAAG,cAAc,OAAA,EAAQ;AAAA,IAChE;AAAA,EACF;AACA,EAAA,OAAO,IAAIC,oBAAA,CAAa,eAAA,CAAgB,CAAC,CAAU,CAAA;AACrD;;;ACUA,IAAM,aAAa,CAAC,WAAA,EAAa,WAAA,EAAa,aAAA,EAAe,eAAe,aAAa,CAAA;AACzF,IAAM,6BAAa,IAAI,GAAA,CAAa,CAAC,WAAA,EAAa,aAAa,CAAC,CAAA;AAMhE,IAAM,sBAAA,GAAqF;AAAA,EACzF,MAAS,CAAC,OAAA,EAAS,QAAA,EAAU,cAAA,EAAgB,WAAW,SAAS,CAAA;AAAA,EACjE,MAAA,EAAS,CAAC,QAAA,EAAU,SAAA,EAAW,SAAS,CAAA;AAAA,EACxC,OAAA,EAAS,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAAA,EACpD,MAAS,EAAC;AAAA,EACV,SAAS,EAAC;AAAA,EACV,MAAS;AACX,CAAA;AAKA,IAAM,kCAAkB,IAAI,GAAA,CAAgC,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,CAAC,CAAA;AAqBlF,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EAElC,MAAA,GAAqB;AAAA,IAC3B,SAAA,EAAW,MAAA;AAAA,IACX,SAAA,EAAW,CAAA;AAAA,IACX,WAAA,EAAa,MAAA;AAAA,IACb,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACf;AAAA;AAAA;AAAA;AAAA,EAIQ,gBAAuC,MAAM;AAAA,EAAC,CAAA;AAAA,EAC9C,SAAA,GAAY,IAAI,GAAA,CAAa,UAAU,CAAA;AAAA,EAE/C,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAIC,gBAAA,CAAS,EAAE,OAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACvD,IAAA,QAAA,CAAS,QAAA,GAAW,IAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,MAAA,EAAQ,QAAA,IAAY,KAAK,IAAA,CAAK,QAAA;AAAA,IACrD;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AACvD,IAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAI9C,IAAA,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,IAAA,SAAA,CAAU,KAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,OAAA,IAAW,IAAI,KAAK,CAAA;AACrD,IAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,YAAA,IAAiB,IAAA,CAAK,KAAK,OAAA,EAAyD,YAAA;AACnH,IAAA,IAAI,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,iBAAiB,YAAY,CAAA;AAMvE,IAAA,IAAA,CAAK,gBAAgB,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,KAAK,MAAM,CAAA;AAEnE,IAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAC3B,IAAA,UAAA,CAAW,QAAA,EAAU,KAAK,MAAM,CAAA;AAEhC,IAAA,MAAM,MAAA,GAAS,SAAS,cAAA,EAAe;AACvC,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,KAAA;AAC7B,IAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,MAAA;AAO9B,IAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,CAAA;AACrC,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA;AACtC,MAAA,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAIzB,MAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,IAAW,EAAC;AACpC,MAAA,IAAI,IAAA,CAAK,CAAA,KAAM,MAAA,EAAW,QAAA,CAAS,CAAA,GAAI,EAAA;AACvC,MAAA,IAAI,IAAA,CAAK,CAAA,KAAM,MAAA,EAAW,QAAA,CAAS,CAAA,GAAI,EAAA;AAAA,IACzC;AAOA,IAAA,QAAA,CAAS,WAAW,MAAM;AACxB,MAAA,IAAI,KAAK,MAAA,EAAQ;AAAE,QAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAO,QAAA;AAAA,MAAQ;AAChD,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf,CAAA;AAEA,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA,EAEQ,MAAA,GAAS,KAAA;AAAA,EAET,OAAA,GAAgB;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,MAAA;AACtB,IAAA,QAAA,CAAS,KAAA,EAAM;AACf,IAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAC3B,IAAA,UAAA,CAAW,QAAA,EAAU,KAAK,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,SAAA,GAAkB;AACzB,IAAA,KAAA,CAAM,SAAA,EAAU;AAChB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,UAAA,EAAY;AAC9B,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAChB;AAAA,EAES,YAAA,CAAa,QAAA,EAAoB,MAAA,GAAS,CAAA,EAAS;AAC1D,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,SAAA,GAAY,SAAS,IAAA,CAAK,EAAA;AAGhC,IAAA,MAAM,OAAA,GAAU,UAAU,aAAA,CAAc,IAAA,CAAK,KAAK,OAAO,CAAA,EAAG,KAAK,SAAS,CAAA;AAC1E,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,SAAA,GACxB,KAAK,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAA,EAAA,KAAM,iBAAA,CAAkB,EAAA,EAAI,IAAA,CAAK,SAAS,CAAC,CAAA,GACnE,MAAA;AACJ,IAAA,YAAA,CAAa,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAgD,KAA0C,CAAA;AACpH,IAAA,cAAA,CAAe,QAAA,EAAU,KAAK,MAAA,EAAQ,SAAA,EAAW,KAAK,QAAA,EAAW,KAAA,EAA4C,EAAC,EAAG,SAAS,CAAA;AAO1H,IAAA,MAAM,UAAA,GAA0B,IAAA,CAAK,IAAA,CAAqC,UAAA,IAAc,KAAA;AACxF,IAAA,iBAAA,CAAkB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,IAAA,CAAK,SAAA,IAAa,EAAC,EAAG,IAAA,CAAK,QAAA,EAAW,KAAA,EAAO,WAAW,UAAU,CAAA;AAEhI,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAA;AACrB,IAAA,MAAM,OAAA,GAAU,YAAY,IAAA,CAAK,QAAA;AACjC,IAAA,IAAA,CAAK,MAAA,CAAO,aAAa,SAAA,IAAa,CAAA;AACtC,IAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,EAAQ,EAAE,UAAA,EAAY,IAAA,IAAQ,SAAS,CAAA;AACzD,IAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,EAAQ,EAAE,UAAA,EAAY,KAAA,IAAS,OAAO,CAAA;AAAA,EAC1D;AACF,CAAA;AAIA,SAAS,YAAA,CAAa,KAAA,EAAmB,IAAA,EAAyB,KAAA,EAAoB;AACpF,EAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,IAAA,CAAK,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAW,IAAA,CAAK,OAAA,IAAW,EAAC;AAClC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AAGpB,IAAA,MAAM,CAAA,GAAK,IAAA,CAA0D,CAAC,CAAA,IAAK,QAAQ,CAAC,CAAA;AACpF,IAAA,IAAI,CAAA,KAAM,QAAY,KAAA,CAA6C,CAAC,CAAA,GAAI,GAAA,CAAI,GAAG,KAAK,CAAA;AAAA,EACtF;AACF;AAEA,SAAS,SAAA,CAAU,KAAA,EAAmB,OAAA,EAAgB,KAAA,EAAoB;AACxE,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,CAAA,GAAK,QAAoC,CAAC,CAAA;AAChD,IAAA,IAAI,MAAM,MAAA,EAAW;AACrB,IAAC,KAAA,CAA6C,CAAC,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,SAAA,CAAU,CAAA,EAAG,KAAK,CAAA;AAAA,EAC/F;AACF;AAIA,SAAS,cAAc,KAAA,EAA6C;AAClE,EAAA,IAAI,CAAC,KAAA,IAAS,EAAE,cAAA,IAAkB,QAAQ,OAAO,KAAA;AACjD,EAAA,MAAM,EAAE,YAAA,EAAc,KAAA,EAAO,GAAG,MAAK,GAAI,KAAA;AACzC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,SAAA,CAAU,OAA0B,QAAA,EAA2C;AACtF,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,CAAY,CAAA,EAAG;AAAE,MAAA,OAAA,GAAU,IAAA;AAAM,MAAA;AAAA,IAAU;AAC5D,IAAA,GAAA,CAAI,CAAC,CAAA,GAAK,KAAA,CAAkC,CAAC,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,UAAW,GAAA,GAA2B,KAAA;AAC/C;AAEA,SAAS,iBAAA,CAAkB,IAAc,QAAA,EAAkC;AACzE,EAAA,OAAO;AAAA,IACL,GAAG,EAAA;AAAA,IACH,GAAA,EAAK,SAAA,CAAU,EAAA,CAAG,GAAA,EAAK,QAAQ,CAAA;AAAA,IAC/B,EAAA,EAAI,SAAA,CAAU,EAAA,CAAG,EAAA,EAAI,QAAQ,CAAA;AAAA,IAC7B,IAAA,EAAM,SAAA,CAAU,EAAA,CAAG,IAAA,EAAM,QAAQ;AAAA,GACnC;AACF;AAEA,SAAS,QAAA,CAAS,OAA0B,QAAA,EAAwD;AAClG,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,CAAY,CAAA,EAAG;AAC9B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAK,KAAA,CAAkC,CAAC,CAAA;AAC7C,MAAA,GAAA,GAAM,IAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAA,GAAM,IAAA;AACrB;AAEA,SAAS,gBAAA,CAAiB,GAAA,EAAc,KAAA,EAAgB,KAAA,EAAuB;AAC7E,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,KAAA;AAChC,EAAA,OAAO,SAAA,CAAU,OAAO,KAAK,CAAA;AAC/B;AAIA,SAAS,UAAA,CAAW,GAAa,CAAA,EAAqB;AACpD,EAAA,IAAI,EAAE,SAAA,EAAW;AACf,IAAA,CAAA,CAAE,IAAA,CAAK,EAAE,SAAkB,CAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,CAAA,CAAE,SAAA,KAAc,MAAA,EAAW;AACpC,IAAA,CAAA,CAAE,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,WAAW,KAAA,EAAO,CAAA,CAAE,WAAW,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,MAAA,IAAa,CAAA,CAAE,cAAc,CAAA,EAAG;AACpD,IAAA,CAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,CAAA,CAAE,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,EAC/E;AACF;AAUA,SAAS,iBAAA,CAAkB,GAAa,CAAA,EAAqB;AAC3D,EAAA,MAAM,CAAA,GAAI,EAAE,KAAA,IAAS,CAAA;AACrB,EAAA,MAAM,CAAA,GAAI,EAAE,MAAA,IAAU,CAAA;AACtB,EAAA,MAAM,CAAA,GAAI,EAAE,YAAA,IAAgB,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,GAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,GAAA;AAKxB,EAAA,MAAM,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AACnB,EAAA,MAAM,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AACnB,EAAA,IAAI,CAAA,GAAI,GAAG,CAAA,CAAE,SAAA,CAAU,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,OACzB,CAAA,CAAE,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC9B;AACA,SAAS,mBAAA,CAAoB,GAAa,CAAA,EAAqB;AAC7D,EAAA,MAAM,CAAA,GAAI,EAAE,MAAA,IAAU,CAAA;AACtB,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,GAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,GAAA;AAGxB,EAAA,CAAA,CAAE,MAAA,CAAA,CAAQ,MAAM,EAAA,IAAM,CAAA,GAAI,IAAI,GAAA,GAAM,EAAA,IAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACpD;AACA,SAAS,oBAAA,CAAqB,GAAa,CAAA,EAAqB;AAC9D,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,CAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,GAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,GAAA;AACxB,EAAA,CAAA,CAAE,OAAA,CAAA,CAAS,GAAA,GAAM,EAAA,IAAM,CAAA,GAAI,EAAA,EAAA,CAAK,MAAM,EAAA,IAAM,CAAA,GAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC5D;AACA,SAAS,YAAA,CAAa,MAAqB,KAAA,EAAqC;AAC9E,EAAA,MAAM,KAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,CAAC,GAAG,KAAK,CAAA;AAClC,EAAA,MAAM,KAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,CAAC,GAAG,KAAK,CAAA;AAClC,EAAA,MAAM,KAAK,GAAA,CAAI,IAAA,CAAK,EAAA,CAAG,CAAC,GAAG,KAAK,CAAA;AAChC,EAAA,MAAM,KAAK,GAAA,CAAI,IAAA,CAAK,EAAA,CAAG,CAAC,GAAG,KAAK,CAAA;AAChC,EAAA,OAAO,CAAC,CAAA,KAAgB;AAAE,IAAA,CAAA,CAAE,MAAA,CAAO,IAAI,EAAE,CAAA;AAAG,IAAA,CAAA,CAAE,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,EAAG,CAAA;AAChE;AACA,SAAS,eAAA,CAAgB,MAAwB,KAAA,EAAqC;AACpF,EAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,SAAU,MAAM;AAAA,EAAC,CAAA;AAC5C,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACxE,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,CAAK,IAAA;AACrB,EAAA,OAAO,CAAC,CAAA,KAAgB;AAAE,IAAA,CAAA,CAAE,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,EAAG,CAAA;AAClD;AACA,SAAS,aAAa,IAAA,EAA4C;AAGhE,EAAA,OAAO,CAAC,CAAA,KAAgB;AAAE,IAAA,CAAA,CAAE,IAAA,CAAK,IAAIC,oBAAA,CAAa,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,EAAG,CAAA;AAC9D;AAEA,IAAM,aAAA,GAAmG;AAAA,EACvG,IAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAS,mBAAA;AAAA,EACT,OAAA,EAAS;AACX,CAAA;AAEA,SAAS,gBAAA,CAAiB,IAAA,EAAyB,KAAA,EAAc,KAAA,EAA0C;AACzG,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA;AAC5C,EAAA,IAAI,aAAa,OAAO,CAAC,CAAA,KAAgB,WAAA,CAAY,GAAG,KAAK,CAAA;AAC7D,EAAA,QAAQ,KAAK,KAAA;AAAO,IAClB,KAAK,MAAA;AAAW,MAAA,OAAO,YAAA,CAAa,MAAM,KAAK,CAAA;AAAA,IAC/C,KAAK,SAAA;AAAW,MAAA,OAAO,eAAA,CAAgB,MAAM,KAAK,CAAA;AAAA,IAClD,KAAK,MAAA;AAAW,MAAA,OAAO,aAAa,IAAI,CAAA;AAAA;AAE1C,EAAA,OAAO,MAAM;AAAA,EAAC,CAAA;AAChB;AAIA,SAAS,iBAAA,CACP,UACA,KAAA,EACA,QAAA,EACA,WACA,cAAA,EACA,KAAA,EACA,QACA,UAAA,EACM;AACN,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,MAAM,EAAA,GAAK,MAAA,GAAS,SAAA,CAAU,EAAA,CAAG,IAAI,cAAc,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,GAAG,QAAA,IAAY,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,MAAA;AACxB,IAAA,MAAM,IAAA,GAAO,SAAS,EAAE,CAAA;AAExB,IAAA,IAAI,GAAG,GAAA,EAAK;AACV,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,EAAA,CAAG,GAAA,EAAK,QAAQ,CAAA;AACtC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,UAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,CAAA,EAAc,CAAA,EAAG,KAAK,CAAA;AACxD,UAAA,MAAMC,KAAAA,GAAO,KAAA;AACb,UAAA,aAAA,CAAc,UAAU,EAAA,EAAI,MAAMA,KAAAA,CAAK,CAAC,GAAG,CAAA,EAAA,KAAM;AAAE,YAAAA,KAAAA,CAAK,CAAC,CAAA,GAAI,EAAA;AAAA,UAAI,GAAG,QAAQ,CAAA;AAAA,QAC9E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,EAAA,CAAG,IAAA,EAAM,QAAQ,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAW,QAAA,CAAS,EAAA,CAAG,EAAA,EAAM,QAAQ,CAAA;AAC3C,IAAA,MAAM,OAAA,uBAAc,GAAA,CAAY;AAAA,MAC9B,GAAI,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,IAAI,EAAC;AAAA,MACxC,GAAI,MAAA,GAAW,MAAA,CAAO,IAAA,CAAK,MAAM,IAAM;AAAC,KACzC,CAAA;AACD,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,GAAA,GAAM,CAAA;AACZ,MAAA,MAAM,OAAA,GAAU,WAAW,GAAG,CAAA;AAC9B,MAAA,MAAM,KAAA,GAAU,SAAS,GAAG,CAAA;AAK5B,MAAA,MAAM,YAAY,OAAA,KAAY,MAAA,GAAY,iBAAiB,GAAA,EAAK,OAAA,EAAS,KAAK,CAAA,GAAI,MAAA;AAClF,MAAA,MAAM,UAAY,KAAA,KAAY,MAAA,GAAY,iBAAiB,GAAA,EAAK,KAAA,EAAS,KAAK,CAAA,GAAI,MAAA;AAClF,MAAA,YAAA,CAAa,QAAA,EAAU,OAAO,GAAA,EAAK,SAAA,EAAW,SAAS,QAAA,EAAU,IAAA,EAAM,EAAA,EAAI,UAAA,EAAY,IAAI,CAAA;AAAA,IAC7F;AAAA,EACF;AACF;AAEA,SAAS,YAAA,CACP,QAAA,EACA,KAAA,EACA,GAAA,EACA,SAAA,EACA,SACA,QAAA,EACA,IAAA,EACA,EAAA,EACA,UAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,YAAY,MAAA,EAAW;AAChD,IAAA,UAAA;AAAA,MACE,QAAA;AAAA,MACA,KAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MAAU,IAAA;AAAA,MAAM,EAAA;AAAA,MAAI,UAAA;AAAA,MAAY,MAAA;AAAA,MAAW;AAAA,KAC7C;AAAA,EACF,CAAA,MAAA,IAAW,YAAY,MAAA,EAAW;AAEhC,IAAA,IAAI,cAAc,MAAA,EAAW;AAE3B,MAAA,QAAA,CAAS,OAAO,KAAA,EAAO,EAAE,CAAC,GAAG,GAAG,WAAU,EAAG,EAAE,CAAC,GAAG,GAAG,OAAA,EAAS,QAAA,EAAU,MAAM,GAAG,IAAA,IAAQ,EAAE,CAAA;AAAA,IAC9F,CAAA,MAAO;AAGL,MAAA,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,EAAE,CAAC,GAAG,GAAG,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,GAAG,IAAA,EAAK,EAAG,EAAE,CAAA;AAAA,IACpE;AAAA,EACF;AACF;AAIA,SAAS,GAAA,CAAI,GAAc,KAAA,EAAsB;AAC/C,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,IAAI,OAAO,CAAC,CAAA,EAAG,OAAO,YAAA,CAAa,GAAG,KAA0C,CAAA;AAChF,EAAA,MAAM,MAAA,GAAS,WAAW,CAAC,CAAA;AAC3B,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,CAAA,GAAI,MAAA;AACpC;AACA,SAAS,SAAA,CAAU,GAAY,KAAA,EAAsB;AACnD,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,GAAA,CAAI,GAAG,KAAK,CAAA;AAC9C,EAAA,OAAO,CAAA;AACT;;;ACtbA,IAAI,oBAAA,GAA6F,IAAA;AACjG,eAAe,sBAAA,GAAyB;AACtC,EAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,IAAA,oBAAA,GAAA,CAAwB,MAAM,OAAO,4BAA0B,CAAA,EAAG,mBAAA;AAAA,EACpE;AACA,EAAA,OAAO,oBAAA;AACT;AAIA,IAAM,WAAA,GAAmE;AAAA,EACvE,KAAA,EAAO,aAAA;AAAA,EACP,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,aAAA;AAAA,EACP,KAAA,EAAO,aAAA;AAAA,EACP,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ;AACV,CAAA;AAKA,IAAMC,YAAyC,EAAC;AAGzC,SAAS,oBAAA,CAAqB,MAAc,IAAA,EAA0B;AAC3E,EAAAA,SAAAA,CAAS,IAAI,CAAA,GAAI,IAAA;AACnB;AAEA,eAAsB,iBAAA,CACpB,KAAA,EACA,MAAA,EACA,IAAA,EACqB;AACrB,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,MAAgC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,IAAKA,SAAAA,CAAS,KAAK,IAAI,CAAA;AAChF,IAAA,IAAI,CAAC,GAAA,IAAO,IAAA,CAAK,IAAA,KAAS,aAAA,EAAe;AACvC,MAAA,GAAA,GAAO,MAAM,sBAAA,EAAuB;AAAA,IACtC;AACA,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qCAAA,EAAyC,IAAA,CAA0B,IAAI,CAAA,CAAA,CAAG,CAAA;AACvF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM,QAAQ,IAAI,CAAA;AACtC,IAAA,MAAM,IAAI,KAAA,EAAM;AAChB,IAAA,IAAI,GAAA,CAAI,aAAa,MAAA,EAAW;AAC9B,MAAA,GAAA,CAAI,QAAA,GAAW,MAAA,EAAQ,QAAA,IAAY,IAAA,CAAK,QAAA;AAAA,IAC1C;AACA,IAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACd;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-6BQ6IEW2.cjs","sourcesContent":["/**\n * Tiny expression parser for the pixi-effects DSL.\n *\n * Supported grammar (recursive descent, LL(1)):\n * expr = additive\n * additive = multiplicative (('+'|'-') multiplicative)*\n * multiplicative = unary (('*'|'/') unary)*\n * unary = ('-'|'+') unary | primary\n * primary = number | identifier ('(' (expr (',' expr)*)? ')')? | '(' expr ')'\n *\n * Numbers are parsed via parseFloat (decimals OK). Identifiers map to keys in\n * the supplied scope. A small fixed function set is exposed: see FUNCS below.\n *\n * Parsed ASTs are cached per source string. CSP-safe: no Function constructor.\n */\nconst FUNCS: Record<string, (...args: number[]) => number> = {\n min: Math.min,\n max: Math.max,\n abs: Math.abs,\n floor: Math.floor,\n ceil: Math.ceil,\n round: Math.round,\n sqrt: Math.sqrt,\n pow: Math.pow,\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n};\n\ntype BinOp = '+' | '-' | '*' | '/';\ntype Token =\n | { type: 'num'; value: number }\n | { type: 'id'; name: string }\n | { type: 'op'; op: BinOp }\n | { type: 'lparen' }\n | { type: 'rparen' }\n | { type: 'comma' };\n\ntype Node =\n | { kind: 'num'; value: number }\n | { kind: 'var'; name: string }\n | { kind: 'neg'; child: Node }\n | { kind: 'bin'; op: BinOp; left: Node; right: Node }\n | { kind: 'call'; name: string; args: Node[] };\n\nfunction isDigit(c: string): boolean { return c >= '0' && c <= '9'; }\nfunction isIdStart(c: string): boolean {\n return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c === '_';\n}\nfunction isIdCont(c: string): boolean { return isIdStart(c) || isDigit(c); }\n\nfunction tokenize(src: string): Token[] {\n const out: Token[] = [];\n for (let i = 0; i < src.length;) {\n const c = src[i]!;\n if (c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') { i++; continue; }\n if (isDigit(c) || (c === '.' && isDigit(src[i + 1] ?? ''))) {\n let j = i + 1;\n while (j < src.length && (isDigit(src[j]!) || src[j] === '.')) j++;\n const value = parseFloat(src.slice(i, j));\n if (Number.isNaN(value)) throw new Error(`bad number at ${i}`);\n out.push({ type: 'num', value });\n i = j;\n continue;\n }\n if (isIdStart(c)) {\n let j = i + 1;\n while (j < src.length && isIdCont(src[j]!)) j++;\n out.push({ type: 'id', name: src.slice(i, j) });\n i = j;\n continue;\n }\n if (c === '+' || c === '-' || c === '*' || c === '/') {\n out.push({ type: 'op', op: c });\n i++;\n continue;\n }\n if (c === '(') { out.push({ type: 'lparen' }); i++; continue; }\n if (c === ')') { out.push({ type: 'rparen' }); i++; continue; }\n if (c === ',') { out.push({ type: 'comma' }); i++; continue; }\n throw new Error(`unexpected character \"${c}\" at ${i}`);\n }\n return out;\n}\n\nclass Cursor {\n i = 0;\n constructor(public tokens: Token[]) {}\n peek(): Token | undefined { return this.tokens[this.i]; }\n next(): Token | undefined { return this.tokens[this.i++]; }\n}\n\nfunction parseExpr(c: Cursor): Node { return parseAdd(c); }\n\nfunction parseAdd(c: Cursor): Node {\n let node = parseMul(c);\n for (;;) {\n const t = c.peek();\n if (t?.type !== 'op' || (t.op !== '+' && t.op !== '-')) break;\n c.next();\n node = { kind: 'bin', op: t.op, left: node, right: parseMul(c) };\n }\n return node;\n}\n\nfunction parseMul(c: Cursor): Node {\n let node = parseUnary(c);\n for (;;) {\n const t = c.peek();\n if (t?.type !== 'op' || (t.op !== '*' && t.op !== '/')) break;\n c.next();\n node = { kind: 'bin', op: t.op, left: node, right: parseUnary(c) };\n }\n return node;\n}\n\nfunction parseUnary(c: Cursor): Node {\n const t = c.peek();\n if (t?.type === 'op' && t.op === '-') { c.next(); return { kind: 'neg', child: parseUnary(c) }; }\n if (t?.type === 'op' && t.op === '+') { c.next(); return parseUnary(c); }\n return parsePrimary(c);\n}\n\nfunction parsePrimary(c: Cursor): Node {\n const t = c.next();\n if (!t) throw new Error('unexpected end of expression');\n if (t.type === 'num') return { kind: 'num', value: t.value };\n if (t.type === 'lparen') {\n const node = parseExpr(c);\n const close = c.next();\n if (close?.type !== 'rparen') throw new Error('expected \")\"');\n return node;\n }\n if (t.type === 'id') {\n if (c.peek()?.type === 'lparen') {\n c.next();\n const args: Node[] = [];\n if (c.peek()?.type !== 'rparen') {\n args.push(parseExpr(c));\n while (c.peek()?.type === 'comma') { c.next(); args.push(parseExpr(c)); }\n }\n const close = c.next();\n if (close?.type !== 'rparen') throw new Error('expected \")\"');\n return { kind: 'call', name: t.name, args };\n }\n return { kind: 'var', name: t.name };\n }\n throw new Error(`unexpected token \"${t.type}\"`);\n}\n\nfunction parse(src: string): Node {\n const c = new Cursor(tokenize(src));\n const node = parseExpr(c);\n if (c.peek()) throw new Error('trailing input');\n return node;\n}\n\nfunction evalNode(node: Node, scope: Record<string, number>): number {\n switch (node.kind) {\n case 'num': return node.value;\n case 'var': {\n const v = scope[node.name];\n if (typeof v !== 'number') throw new Error(`undefined variable: ${node.name}`);\n return v;\n }\n case 'neg': return -evalNode(node.child, scope);\n case 'bin': {\n const l = evalNode(node.left, scope);\n const r = evalNode(node.right, scope);\n switch (node.op) {\n case '+': return l + r;\n case '-': return l - r;\n case '*': return l * r;\n case '/': return l / r;\n }\n }\n /* c8 ignore next 5 */\n // eslint-disable-next-line no-fallthrough\n case 'call': {\n const fn = FUNCS[node.name];\n if (!fn) throw new Error(`unknown function: ${node.name}`);\n return fn(...node.args.map(a => evalNode(a, scope)));\n }\n }\n}\n\nconst ZERO_NODE: Node = { kind: 'num', value: 0 };\nconst astCache = new Map<string, Node>();\n\nexport function isExpr(v: unknown): v is string {\n return typeof v === 'string' && v.length > 0;\n}\n\nexport function evaluateExpr(source: string, scope: Record<string, number>): number {\n let ast = astCache.get(source);\n if (ast === undefined) {\n try {\n ast = parse(source);\n } catch (e) {\n console.warn(`pixi-effects: expression failed: ${source}`, e);\n ast = ZERO_NODE;\n }\n astCache.set(source, ast);\n }\n try {\n return evalNode(ast, scope);\n } catch (e) {\n console.warn(`pixi-effects: expression failed: ${source}`, e);\n return 0;\n }\n}\n","import { evaluateExpr, isExpr } from './Parser';\n\nexport interface NormalizeOptions {\n /** Keys whose string values should NOT be evaluated as expressions (e.g. 'fill', 'fontFamily'). */\n skipKeys?: string[];\n}\n\nexport function normalizeProps<T>(\n input: T,\n scope: Record<string, number>,\n options: NormalizeOptions = {},\n): T {\n const skip = new Set(options.skipKeys ?? []);\n return walk(input, scope, skip, null) as T;\n}\n\nfunction walk(\n value: unknown,\n scope: Record<string, number>,\n skip: Set<string>,\n currentKey: string | null,\n): unknown {\n if (Array.isArray(value)) {\n return value.map(v => walk(v, scope, skip, currentKey));\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value)) {\n out[k] = walk((value as Record<string, unknown>)[k], scope, skip, k);\n }\n return out;\n }\n if (isExpr(value) && !(currentKey !== null && skip.has(currentKey))) {\n // Hex colour strings (`#fff`, `#ff0000`, `#ff0000ff`) are passed through\n // verbatim — they're never expressions. Same for `rgb(...)` /\n // `rgba(...)` / `oklch(...)` etc. Without this, a bare `tint: '#ff0000'`\n // would be evaluated and silently zero out.\n if (looksLikeColorString(value)) return value;\n return evaluateExpr(value, scope);\n }\n return value;\n}\n\nfunction looksLikeColorString(s: string): boolean {\n if (s.length === 0) return false;\n if (s.charCodeAt(0) === 35 /* '#' */) return true;\n // Quick prefix check for css-style colour functions: rgb, rgba, hsl,\n // hsla, oklab, oklch, lab, lch.\n return /^(rgb|hsl|oklab|oklch|lab|lch)\\b/i.test(s);\n}\n","import { gsap } from 'gsap';\nimport { normalizeProps } from '../expr/normalizeProps';\nimport type { Keyframe } from '../types';\nimport type { NamedFilter } from '../filters';\n\nexport type Kind = 'set' | 'to' | 'from' | 'fromTo';\n\nexport interface NormalizedKeyframe {\n at: number;\n duration: number;\n ease: string;\n loop: Record<string, number | boolean>;\n kind: Kind;\n set?: Record<string, unknown>;\n to?: Record<string, unknown>;\n from?: Record<string, unknown>;\n}\n\n/**\n * GSAP loop vars (`repeat`, `yoyo`, `repeatDelay`) for a keyframe. Only a finite,\n * non-negative repeat count is allowed: an infinite repeat would give the\n * timeline an infinite length and break seeking / export.\n */\nexport function loopVars(kf: { repeat?: number; yoyo?: boolean; repeatDelay?: number }): Record<string, number | boolean> {\n const out: Record<string, number | boolean> = {};\n let repeat = 0;\n if (kf.repeat !== undefined) {\n if (Number.isFinite(kf.repeat) && kf.repeat >= 0) {\n repeat = Math.floor(kf.repeat);\n out.repeat = repeat;\n } else {\n console.warn(`pixi-effects: keyframe repeat ${String(kf.repeat)} ignored — repeat must be a finite count >= 0 (the timeline needs a fixed length; for endless motion repeat many times).`);\n }\n }\n if (repeat > 0) {\n if (kf.yoyo !== undefined) out.yoyo = kf.yoyo;\n if (kf.repeatDelay !== undefined && kf.repeatDelay > 0) out.repeatDelay = kf.repeatDelay;\n }\n return out;\n}\n\nexport function resolveAt(at: number | undefined | null, duration: number): number {\n if (at === undefined || at === null) return 0;\n return at < 0 ? duration + at : at;\n}\n\nexport function normalizeKeyframe(kf: Keyframe, parentDuration: number): NormalizedKeyframe {\n const at = resolveAt(kf.at, parentDuration);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const hasSet = !!kf.set;\n const hasFrom = !!kf.from;\n const hasTo = !!kf.to;\n let kind: Kind;\n if (hasSet) kind = 'set';\n else if (hasFrom && hasTo) kind = 'fromTo';\n else if (hasFrom) kind = 'from';\n else if (hasTo) kind = 'to';\n else kind = 'to';\n return { at, duration, ease, loop: loopVars(kf), kind, set: kf.set, from: kf.from, to: kf.to };\n}\n\nexport interface Partitioned {\n ownProps: Record<string, unknown>;\n filterProps: Record<string, Record<string, unknown>>;\n}\n\nexport function partitionProps(props: Record<string, unknown>): Partitioned {\n const ownProps: Record<string, unknown> = {};\n const filterProps: Record<string, Record<string, unknown>> = {};\n for (const k of Object.keys(props)) {\n const m = k.match(/^filters\\.([^.]+)\\.(.+)$/);\n if (m) {\n const [, name, sub] = m as unknown as [string, string, string];\n (filterProps[name] ??= {})[sub] = props[k];\n } else {\n ownProps[k] = props[k];\n }\n }\n return { ownProps, filterProps };\n}\n\n/**\n * Resolves a routed keyframe path to a concrete GSAP tween target.\n * `path` is everything after the registered prefix + dot (for\n * `three.cube.rotation.y` under prefix `three`, path = `cube.rotation.y`).\n * Return null to skip the key (the router is expected to have warned).\n */\nexport type PathRouter = (path: string) => { target: object; prop: string } | null;\nexport type PathRouters = Record<string, PathRouter>;\n\nexport interface RoutedProp {\n target: object;\n prop: string;\n /** Original full key, used to pair from/to sides of a fromTo keyframe. */\n key: string;\n value: unknown;\n}\n\nexport function splitRouted(\n props: Record<string, unknown>,\n routers: PathRouters | undefined,\n): { rest: Record<string, unknown>; routed: RoutedProp[] } {\n if (!routers) return { rest: props, routed: [] };\n const rest: Record<string, unknown> = {};\n const routed: RoutedProp[] = [];\n for (const k of Object.keys(props)) {\n const dot = k.indexOf('.');\n const router = dot > 0 ? routers[k.slice(0, dot)] : undefined;\n if (router) {\n const hit = router(k.slice(dot + 1));\n if (hit) routed.push({ target: hit.target, prop: hit.prop, key: k, value: props[k] });\n // Unresolved keys are dropped — the router already warned.\n } else {\n rest[k] = props[k];\n }\n }\n return { rest, routed };\n}\n\ninterface FilterTarget { filters?: NamedFilter[] | null }\n\nfunction findFilter(target: FilterTarget, name: string): NamedFilter | null {\n if (!target?.filters) return null;\n for (const f of target.filters) {\n if (f?._name === name) return f;\n }\n return null;\n}\n\nconst PIXI_SHORTHANDS = new Set([\n 'scale', 'scaleX', 'scaleY',\n 'anchor', 'anchorX', 'anchorY',\n 'pivot', 'pivotX', 'pivotY',\n 'skew', 'skewX', 'skewY',\n 'rotation',\n 'position', 'positionX', 'positionY',\n 'tilePosition', 'tilePositionX', 'tilePositionY',\n 'tileScale', 'tileScaleX', 'tileScaleY',\n 'tint',\n 'colorize', 'colorizeAmount',\n 'colorMatrixFilter',\n 'blur', 'blurX', 'blurY', 'blurPadding',\n 'autoAlpha',\n 'lineColor', 'lineAlpha', 'fillColor', 'fillAlpha',\n]);\n\nfunction pixiwrap(props: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const pixi: Record<string, unknown> = {};\n let usedPixi = false;\n for (const [k, v] of Object.entries(props)) {\n if (PIXI_SHORTHANDS.has(k)) { pixi[k] = v; usedPixi = true; }\n else { out[k] = v; }\n }\n if (usedPixi) out.pixi = pixi;\n return out;\n}\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport function applyKeyframes(\n timeline: Timeline,\n target: object,\n keyframes: Keyframe[] | undefined,\n parentDuration: number,\n scope: Record<string, number>,\n skipKeys: string[] = [],\n offset = 0,\n routers?: PathRouters,\n): void {\n for (const raw of keyframes ?? []) {\n const kf = normalizeKeyframe(raw, parentDuration);\n const at = offset + kf.at;\n if (kf.kind === 'set') {\n const resolved = normalizeProps(kf.set!, scope, { skipKeys });\n const { rest, routed } = splitRouted(resolved, routers);\n for (const r of routed) timeline.set(r.target, { [r.prop]: r.value }, at);\n const { ownProps, filterProps } = partitionProps(rest);\n if (Object.keys(ownProps).length > 0) timeline.set(target, pixiwrap(ownProps), at);\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.set(f, props, at);\n }\n } else if (kf.kind === 'to') {\n const resolved = normalizeProps(kf.to!, scope, { skipKeys });\n const { rest, routed } = splitRouted(resolved, routers);\n for (const r of routed)\n timeline.to(r.target, { [r.prop]: r.value, duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n const { ownProps, filterProps } = partitionProps(rest);\n if (Object.keys(ownProps).length > 0)\n timeline.to(target, { ...pixiwrap(ownProps), duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.to(f, { ...props, duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n }\n } else if (kf.kind === 'from') {\n const resolved = normalizeProps(kf.from!, scope, { skipKeys });\n const { rest, routed } = splitRouted(resolved, routers);\n for (const r of routed)\n timeline.from(r.target, { [r.prop]: r.value, duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n const { ownProps, filterProps } = partitionProps(rest);\n if (Object.keys(ownProps).length > 0)\n timeline.from(target, { ...pixiwrap(ownProps), duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.from(f, { ...props, duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n }\n } else {\n const fromResolved = normalizeProps(kf.from!, scope, { skipKeys });\n const toResolved = normalizeProps(kf.to!, scope, { skipKeys });\n const fromRouted = splitRouted(fromResolved, routers);\n const toRouted = splitRouted(toResolved, routers);\n // Pair routed from/to entries by their original key.\n const fromByKey = new Map(fromRouted.routed.map(r => [r.key, r]));\n for (const r of toRouted.routed) {\n const f = fromByKey.get(r.key);\n fromByKey.delete(r.key);\n if (f) {\n timeline.fromTo(r.target, { [r.prop]: f.value },\n { [r.prop]: r.value, duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n } else {\n timeline.to(r.target, { [r.prop]: r.value, duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n }\n }\n for (const f of fromByKey.values())\n timeline.from(f.target, { [f.prop]: f.value, duration: kf.duration, ease: kf.ease, ...kf.loop }, at);\n const fromSplit = partitionProps(fromRouted.rest);\n const toSplit = partitionProps(toRouted.rest);\n const ownKeys = new Set([...Object.keys(fromSplit.ownProps), ...Object.keys(toSplit.ownProps)]);\n if (ownKeys.size > 0) {\n timeline.fromTo(\n target,\n { ...pixiwrap(fromSplit.ownProps) },\n { ...pixiwrap(toSplit.ownProps), duration: kf.duration, ease: kf.ease, ...kf.loop },\n at,\n );\n }\n const filterNames = new Set([\n ...Object.keys(fromSplit.filterProps),\n ...Object.keys(toSplit.filterProps),\n ]);\n for (const name of filterNames) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.fromTo(\n f,\n { ...(fromSplit.filterProps[name] ?? {}) },\n { ...(toSplit.filterProps[name] ?? {}), duration: kf.duration, ease: kf.ease, ...kf.loop },\n at,\n );\n }\n }\n }\n}\n\nexport function applyInitial(\n target: object,\n initial: Record<string, unknown> | undefined,\n scope: Record<string, number>,\n skipKeys: string[] = [],\n routers?: PathRouters,\n): void {\n if (!initial) return;\n const resolved = normalizeProps(initial, scope, { skipKeys });\n const { rest, routed } = splitRouted(resolved, routers);\n for (const r of routed) gsap.set(r.target, { [r.prop]: r.value });\n const { ownProps, filterProps } = partitionProps(rest);\n if (Object.keys(ownProps).length > 0) gsap.set(target, pixiwrap(ownProps));\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n gsap.set(f, props);\n }\n}\n","import type { CompositionShape } from '../types';\n\n/** Sequence-shaped input expected by buildScope. */\nexport interface ScopeSequence {\n intrinsicWidth: number;\n intrinsicHeight: number;\n at?: number;\n duration?: number;\n}\n\n/** Variables available to expression evaluation. */\nexport interface Scope {\n w: number; h: number;\n W: number; H: number;\n GW: number; GH: number;\n contain: number; cover: number;\n t: number; d: number; T: number;\n}\n\nexport function buildScope(\n sequence: ScopeSequence,\n parent: CompositionShape | null,\n root: CompositionShape,\n): Scope {\n const w = sequence.intrinsicWidth || 0;\n const h = sequence.intrinsicHeight || 0;\n const W = parent?.width ?? root.width;\n const H = parent?.height ?? root.height;\n const GW = root.width;\n const GH = root.height;\n const contain = (w === 0 || h === 0) ? 1 : Math.min(W / w, H / h);\n const cover = (w === 0 || h === 0) ? 1 : Math.max(W / w, H / h);\n return {\n w, h, W, H, GW, GH,\n contain, cover,\n t: sequence.at ?? 0,\n d: sequence.duration ?? parent?.duration ?? root.duration,\n T: parent?.duration ?? root.duration,\n };\n}\n","import { Filter, GlProgram, GpuProgram, UniformGroup, defaultFilterVert, Color } from 'pixi.js';\n\n// ── Fragment shader ─ GLSL (WebGL renderer) ──────────────────────────────\nconst GL_FRAGMENT = `\nin vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform vec3 uKeyColor;\nuniform float uThreshold;\nuniform float uSmoothing;\nuniform float uSpill;\n\nout vec4 finalColor;\n\nvoid main(void) {\n vec4 raw = texture(uTexture, vTextureCoord);\n\n // Pixi passes pre-multiplied alpha into filters. Un-premultiply so the\n // chromakey distance is computed against the source color, not a darkened\n // version that drifts away from the key as sprite.alpha drops.\n vec3 rgb = raw.a > 0.0 ? raw.rgb / raw.a : vec3(0.0);\n\n vec3 ycbcr = vec3(\n 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b,\n -0.169 * rgb.r - 0.331 * rgb.g + 0.5 * rgb.b + 0.5,\n 0.5 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b + 0.5\n );\n vec3 keyYcbcr = vec3(\n 0.299 * uKeyColor.r + 0.587 * uKeyColor.g + 0.114 * uKeyColor.b,\n -0.169 * uKeyColor.r - 0.331 * uKeyColor.g + 0.5 * uKeyColor.b + 0.5,\n 0.5 * uKeyColor.r - 0.419 * uKeyColor.g - 0.081 * uKeyColor.b + 0.5\n );\n\n float dist = length(ycbcr - keyYcbcr);\n float alpha = smoothstep(uThreshold - uSmoothing, uThreshold + uSmoothing, dist);\n\n vec3 despilled = rgb;\n if (uSpill > 0.0) {\n float spillAmount = max(0.0, rgb.g - max(rgb.r, rgb.b));\n despilled.g -= spillAmount * uSpill;\n }\n\n float outA = raw.a * alpha;\n finalColor = vec4(despilled * outA, outA);\n}\n`;\n\n// ── Combined vertex+fragment ─ WGSL (WebGPU renderer) ────────────────────\n// Layout follows PIXI v8's built-in filter pattern (see NoiseFilter.wgsl):\n// group(0): global filter uniforms + uTexture + uSampler\n// group(1): the filter's own uniform block — name MUST match the resource\n// key passed to the Filter constructor (`chromaUniforms`).\nconst WGSL_SOURCE = `\nstruct GlobalFilterUniforms {\n uInputSize: vec4<f32>,\n uInputPixel: vec4<f32>,\n uInputClamp: vec4<f32>,\n uOutputFrame: vec4<f32>,\n uGlobalFrame: vec4<f32>,\n uOutputTexture: vec4<f32>,\n};\n\nstruct ChromaUniforms {\n uKeyColor: vec3<f32>,\n uThreshold: f32,\n uSmoothing: f32,\n uSpill: f32,\n};\n\n@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms;\n@group(0) @binding(1) var uTexture: texture_2d<f32>;\n@group(0) @binding(2) var uSampler : sampler;\n@group(1) @binding(0) var<uniform> chromaUniforms : ChromaUniforms;\n\nstruct VSOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\nfn filterVertexPosition(aPosition : vec2<f32>) -> vec4<f32> {\n var position = aPosition * gfu.uOutputFrame.zw + gfu.uOutputFrame.xy;\n position.x = position.x * (2.0 / gfu.uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * gfu.uOutputTexture.z / gfu.uOutputTexture.y) - gfu.uOutputTexture.z;\n return vec4<f32>(position, 0.0, 1.0);\n}\n\nfn filterTextureCoord(aPosition : vec2<f32>) -> vec2<f32> {\n return aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw);\n}\n\n// NOTE on whitespace: PIXI v8's WGSL attribute extractor is regex-based and\n// expects the noise/blur reference format — multi-line param list + space\n// before the colon. A compact one-liner with no space before the colon parses\n// as having NO vertex attributes, which then causes a \"Vertex attribute slot 0\n// not present in the VertexState\" pipeline validation error.\n@vertex\nfn mainVertex(\n @location(0) aPosition : vec2<f32>,\n) -> VSOutput {\n return VSOutput(\n filterVertexPosition(aPosition),\n filterTextureCoord(aPosition),\n );\n}\n\n@fragment\nfn mainFragment(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {\n let raw = textureSample(uTexture, uSampler, uv);\n\n // Un-premultiply (see comment in the GLSL version above).\n var rgb: vec3<f32>;\n if (raw.a > 0.0) {\n rgb = raw.rgb / raw.a;\n } else {\n rgb = vec3<f32>(0.0);\n }\n\n let key = chromaUniforms.uKeyColor;\n\n let ycbcr = vec3<f32>(\n 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b,\n -0.169 * rgb.r - 0.331 * rgb.g + 0.5 * rgb.b + 0.5,\n 0.5 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b + 0.5,\n );\n let keyYcbcr = vec3<f32>(\n 0.299 * key.r + 0.587 * key.g + 0.114 * key.b,\n -0.169 * key.r - 0.331 * key.g + 0.5 * key.b + 0.5,\n 0.5 * key.r - 0.419 * key.g - 0.081 * key.b + 0.5,\n );\n\n let dist = length(ycbcr - keyYcbcr);\n let alpha = smoothstep(\n chromaUniforms.uThreshold - chromaUniforms.uSmoothing,\n chromaUniforms.uThreshold + chromaUniforms.uSmoothing,\n dist,\n );\n\n var despilled = rgb;\n if (chromaUniforms.uSpill > 0.0) {\n let spillAmount = max(0.0, rgb.g - max(rgb.r, rgb.b));\n despilled.g = despilled.g - spillAmount * chromaUniforms.uSpill;\n }\n\n let outA = raw.a * alpha;\n return vec4<f32>(despilled * outA, outA);\n}\n`;\n\nexport interface ChromaKeyOptions {\n keyColor?: string | [number, number, number];\n threshold?: number;\n smoothing?: number;\n spill?: number;\n}\n\nfunction toRgb01(input: string | [number, number, number]): [number, number, number] {\n if (Array.isArray(input)) return [input[0], input[1], input[2]];\n const c = new Color(input);\n return [c.red, c.green, c.blue];\n}\n\nexport class ChromaKeyFilter extends Filter {\n constructor(options: ChromaKeyOptions = {}) {\n const {\n keyColor = '#00ff00',\n threshold = 0.4,\n smoothing = 0.1,\n spill = 0.2,\n } = options;\n\n const glProgram = GlProgram.from({\n vertex: defaultFilterVert,\n fragment: GL_FRAGMENT,\n name: 'chroma-key-filter',\n });\n\n const gpuProgram = GpuProgram.from({\n vertex: { source: WGSL_SOURCE, entryPoint: 'mainVertex' },\n fragment: { source: WGSL_SOURCE, entryPoint: 'mainFragment' },\n });\n\n super({\n glProgram,\n gpuProgram,\n resources: {\n chromaUniforms: new UniformGroup({\n uKeyColor: { value: toRgb01(keyColor), type: 'vec3<f32>' },\n uThreshold: { value: threshold, type: 'f32' },\n uSmoothing: { value: smoothing, type: 'f32' },\n uSpill: { value: spill, type: 'f32' },\n }),\n },\n });\n }\n\n get threshold(): number { return this.resources.chromaUniforms.uniforms.uThreshold as number; }\n set threshold(v: number) { this.resources.chromaUniforms.uniforms.uThreshold = v; }\n get smoothing(): number { return this.resources.chromaUniforms.uniforms.uSmoothing as number; }\n set smoothing(v: number) { this.resources.chromaUniforms.uniforms.uSmoothing = v; }\n get spill(): number { return this.resources.chromaUniforms.uniforms.uSpill as number; }\n set spill(v: number) { this.resources.chromaUniforms.uniforms.uSpill = v; }\n\n setKeyColor(input: string | [number, number, number]): void {\n const rgb = toRgb01(input);\n const u = this.resources.chromaUniforms.uniforms.uKeyColor as [number, number, number];\n u[0] = rgb[0]; u[1] = rgb[1]; u[2] = rgb[2];\n }\n}\n","import type { Filter } from 'pixi.js';\nimport type { FilterSpec, CustomFilterSpec } from '../types';\nimport { ChromaKeyFilter } from './ChromaKey';\n\ninterface FilterCtor {\n new (params: Record<string, unknown>): Filter;\n}\n\nconst registry: Record<Exclude<FilterSpec['type'], 'custom'>, FilterCtor> = {\n chromaKey: ChromaKeyFilter as unknown as FilterCtor,\n};\n\n/** Internal marker we set on filter instances so partition path resolution finds them. */\nexport interface NamedFilter extends Filter {\n _name?: string;\n}\n\n/**\n * Duck-type check for a PIXI Filter. We can't use `instanceof Filter` because\n * filters loaded from a different bundled copy of `pixi.js` (e.g. via esm.sh\n * or a duplicated install) won't share the same class reference. PIXI's\n * `Filter` exposes an `apply` method on its prototype; check for that instead.\n */\nfunction looksLikePixiFilter(x: unknown): x is Filter {\n return !!x && typeof x === 'object' && typeof (x as { apply?: unknown }).apply === 'function';\n}\n\nexport function createFilter(spec: FilterSpec): NamedFilter {\n if (spec.type === 'custom') {\n const inst = (spec as CustomFilterSpec).filter;\n if (!looksLikePixiFilter(inst)) {\n throw new Error('pixi-effects: { type: \"custom\" } requires a `filter` that is a PIXI Filter instance (duck-typed: must have an `apply` method).');\n }\n const named = inst as NamedFilter;\n named._name = spec.name;\n return named;\n }\n const Cls = registry[spec.type];\n if (!Cls) throw new Error(`pixi-effects: unknown filter type \"${(spec as { type: string }).type}\"`);\n const { type: _t, name, ...params } = spec as Record<string, unknown> & { type: string; name?: string };\n const inst = new Cls(params) as NamedFilter;\n inst._name = name;\n return inst;\n}\n\nexport function findFilterByName(filters: NamedFilter[], name: string): NamedFilter | null {\n return filters.find(f => f._name === name) ?? null;\n}\n","import type { Container } from 'pixi.js';\nimport { Rectangle } from 'pixi.js';\nimport { applyKeyframes, applyInitial, type PathRouters } from '../core/Timeline';\nimport { buildScope, type Scope } from '../expr/Scope';\nimport { createFilter, type NamedFilter } from '../filters';\nimport type { CompositionShape, SequenceSpec, AudioDescriptor } from '../types';\nimport type { SpaceHost } from '../space/Layer3D';\n\nimport type { gsap } from 'gsap';\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport abstract class Sequence {\n spec: SequenceSpec;\n parent: CompositionShape | null;\n root: CompositionShape;\n target: Container | null = null;\n intrinsicWidth = 0;\n intrinsicHeight = 0;\n at: number;\n duration: number | undefined;\n filters: NamedFilter[] = [];\n /**\n * Mask sequence built from `spec.mask`, if any. Built and added to the\n * scene graph by the parent CompositionSequence; rendered as a mask\n * (not a normal child) by PIXI when `target.mask = maskSequence.target`.\n */\n maskSequence: Sequence | null = null;\n /**\n * Absolute start time on the global timeline (offset + at), recorded by\n * bindTimeline. Movie._awaitVideoFrames uses it to determine the correct\n * time to pass to awaitFrameAt. Subclasses that override bindTimeline\n * without calling super must set this field themselves. Null until bound.\n */\n absoluteStart: number | null = null;\n\n constructor(spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape) {\n this.spec = spec;\n this.parent = parent;\n this.root = root;\n this.at = spec.at ?? 0;\n this.duration = spec.duration;\n }\n\n abstract build(): Promise<void>;\n\n buildFilters(): void {\n const specs = this.spec.filters ?? [];\n this.filters = specs.map(createFilter);\n if (this.target && 'filters' in this.target) {\n (this.target as unknown as { filters: NamedFilter[] }).filters = this.filters;\n }\n // Honor an explicit filterArea override (e.g. set by expandTransitions so\n // a wipe / iris filter on a small text sprite still covers the whole\n // composition rather than being clipped to the text bbox).\n const fa = this.spec.filterArea;\n if (fa && this.target) {\n this.target.filterArea = new Rectangle(fa.x, fa.y, fa.width, fa.height);\n }\n }\n\n scope(): Scope {\n return buildScope(this, this.parent, this.root);\n }\n\n /**\n * Prefix routers contributed to the keyframe pipeline (e.g. `three.` in\n * pixi-effects/three). Base sequences route nothing extra.\n */\n protected pathRouters(): PathRouters {\n return {};\n }\n\n bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const scope = this.scope();\n const routers = this.pathRouters();\n // Keyframe `at` is measured from THIS sequence's start (After Effects style),\n // and negative `at` back from its end — so the origin is offset + this.at.\n const startTime = offset + this.at;\n applyInitial(this.target, this.spec.initial as Record<string, unknown> | undefined, scope as unknown as Record<string, number>, [], routers);\n applyKeyframes(timeline, this.target, this.spec.keyframes, this.duration!, scope as unknown as Record<string, number>, [], startTime, routers);\n // Hide before lifespan starts. GSAP's `set` only fires when the playhead\n // crosses its time, so without this baseline a sequence with at>0 (or any\n // non-zero offset from a nested composition) would render at t<startTime\n // on PIXI's default `renderable: true`.\n const endTime = startTime + this.duration!;\n this.absoluteStart = startTime;\n this.target.renderable = startTime <= 0;\n timeline.set(this.target, { renderable: true }, startTime);\n timeline.set(this.target, { renderable: false }, endTime);\n }\n\n collectAudio(_out: AudioDescriptor[], _baseTime: number): void {\n // default: no audio\n }\n\n /**\n * 2.5D hook. Runs once per rendered frame, after the timeline seek and the\n * per-frame media sync, before the render. Compositions override it to\n * project their `threeD` layers; everything else has nothing to do.\n */\n updateSpace(_t: number, _host: SpaceHost): void {\n // default: nothing to project\n }\n\n /**\n * Runs once per rendered frame, after the timeline seek and before the cull. Layers whose drawn\n * geometry follows tweened state (shapes) redraw here, so the culler measures where the layer is NOW\n * and not where it was drawn at the previous render.\n */\n syncFrame(): void {\n this.maskSequence?.syncFrame();\n }\n\n destroy(): void {\n this.maskSequence?.destroy();\n this.maskSequence = null;\n this.target?.destroy?.();\n this.target = null;\n }\n}\n","import type { Keyframe } from '../types';\n\n/** Every prop key a spec touches in `initial` and in keyframe `set` / `to` / `from`. */\nexport function collectPropKeys(spec: {\n initial?: Record<string, unknown>;\n keyframes?: Keyframe[];\n}): Set<string> {\n const out = new Set<string>();\n for (const k of Object.keys(spec.initial ?? {})) out.add(k);\n for (const kf of spec.keyframes ?? []) {\n for (const bag of [kf.set, kf.to, kf.from]) {\n for (const k of Object.keys(bag ?? {})) out.add(k);\n }\n }\n return out;\n}\n","import type { SequenceSpec } from '../types';\nimport { collectPropKeys } from '../space/specKeys';\n\ntype Warn = (message: string, kind?: 'late-keyframe') => void;\nconst defaultWarn: Warn = m => console.warn(m);\n\n/** \"layer \"name\"\" or \"unnamed text layer\" — how warnings refer to a sequence. */\nexport function describeLayer(spec: { name?: string; type: string }): string {\n return spec.name ? `layer \"${spec.name}\"` : `unnamed ${spec.type} layer`;\n}\n\n/**\n * Timing mistakes that otherwise fail silently: a layer that starts after its\n * composition has ended, or a keyframe that starts after its own layer has\n * ended (the usual cause: writing keyframe `at` in composition time instead of\n * time since the start of the layer).\n */\nexport function lintTiming(spec: SequenceSpec, parentDuration: number, warn: Warn = defaultWarn): void {\n const who = describeLayer(spec);\n const at = spec.at ?? 0;\n if (at >= parentDuration) {\n warn(`pixi-effects: ${who} starts at ${at}s, after its composition ends (${parentDuration}s), so it is never visible`);\n }\n const duration = spec.duration ?? parentDuration;\n (spec.keyframes ?? []).forEach((kf, i) => {\n const kat = kf.at ?? 0;\n if (kat >= duration) {\n warn(\n `pixi-effects: ${who}: keyframes[${i}] starts at ${kat}s, after the layer ends (duration ${duration}s), so it never plays. ` +\n `Keyframe \\`at\\` is measured from the start of this layer, not from the start of the composition.`,\n 'late-keyframe',\n );\n }\n });\n}\n\n/**\n * A loop that builds a hundred layers makes the same mistake a hundred times. Print the first few in full and\n * say how many more there are: the rest are the same loop.\n */\nexport function summarizeWarnings(messages: string[], shown = 3): string[] {\n if (messages.length <= shown) return messages;\n return [...messages.slice(0, shown), `pixi-effects: ${messages.length - shown} more layers with the same problem (the same loop or helper is probably building them): fix the ones above and these go away.`];\n}\n\n/** A text layer that animates `value` but has nowhere to print it. */\nexport function lintText(spec: SequenceSpec, warn: Warn = defaultWarn): void {\n if (spec.type !== 'text') return;\n if (collectPropKeys(spec).has('value') && !(spec.text ?? '').includes('{value}')) {\n warn(`pixi-effects: ${describeLayer(spec)}: \\`value\\` is set or animated but the text has no {value} placeholder, so nothing shows it. Use text: '{value}' (or e.g. '{value} users').`);\n }\n}\n","/**\n * Pure 2.5D projection math. No Pixi, no DOM.\n *\n * Coordinates are comp pixels: +x right, +y down, +z toward the viewer\n * (CSS `translateZ` / three.js convention). Rotations are radians here; the\n * DSL speaks degrees and Layer3D converts. Rotation signs match CSS\n * `rotateX()` / `rotateY()` / `rotateZ()`.\n */\n\nexport const DEG = Math.PI / 180;\nexport const DEFAULT_FOV = 40;\nexport const MIN_FOV = 1;\nexport const MAX_FOV = 179;\n/** A corner with camera-space depth <= NEAR hides the whole layer for that frame. */\nexport const NEAR = 1;\n\nexport interface Vec3 { x: number; y: number; z: number }\nexport interface Rect { x: number; y: number; width: number; height: number }\n\nexport interface LayerTransform {\n x: number; y: number; z: number;\n /** radians */\n rotationX: number; rotationY: number; rotationZ: number;\n scaleX: number; scaleY: number;\n pivotX: number; pivotY: number;\n}\n\nexport interface CameraState {\n x: number; y: number; z: number;\n lookAtX: number; lookAtY: number; lookAtZ: number;\n /** Vertical field of view, degrees. */\n fov: number;\n}\n\nexport interface CameraBasis {\n cx: number; cy: number; cz: number;\n /** right */ rx: number; ry: number; rz: number;\n /** down */ dx: number; dy: number; dz: number;\n /** forward */ fx: number; fy: number; fz: number;\n /** focal length in comp pixels */ focal: number;\n halfW: number; halfH: number;\n}\n\nexport type Corners = [number, number, number, number, number, number, number, number];\n\nexport interface ProjectedLayer {\n /** Screen corners in comp pixels: TL, TR, BR, BL as x0,y0,x1,y1,x2,y2,x3,y3. */\n corners: Corners;\n /** Camera-space depth of the layer origin (larger = farther). */\n depth: number;\n visible: boolean;\n}\n\nexport function clampFov(fov: number): number {\n if (!Number.isFinite(fov)) return DEFAULT_FOV;\n return Math.min(MAX_FOV, Math.max(MIN_FOV, fov));\n}\n\n/** Camera distance that makes the z=0 plane map 1:1 to comp pixels. */\nexport function homeDistance(compHeight: number, fovDeg: number): number {\n return (compHeight / 2) / Math.tan((clampFov(fovDeg) * DEG) / 2);\n}\n\n/** The camera used when a composition has none: centred, looking at the z=0 plane. */\nexport function homeCamera(compW: number, compH: number, fov: number = DEFAULT_FOV): CameraState {\n return {\n x: compW / 2, y: compH / 2, z: homeDistance(compH, fov),\n lookAtX: compW / 2, lookAtY: compH / 2, lookAtZ: 0,\n fov,\n };\n}\n\nexport function cameraBasis(cam: CameraState, compW: number, compH: number): CameraBasis {\n let fx = cam.lookAtX - cam.x;\n let fy = cam.lookAtY - cam.y;\n let fz = cam.lookAtZ - cam.z;\n let len = Math.hypot(fx, fy, fz);\n if (len < 1e-9) { fx = 0; fy = 0; fz = -1; len = 1; }\n fx /= len; fy /= len; fz /= len;\n\n // right = normalize(forward × (0,1,0)) = normalize(-fz, 0, fx)\n let rx = -fz;\n const ry = 0;\n let rz = fx;\n const rlen = Math.hypot(rx, rz);\n if (rlen < 1e-9) { rx = 1; rz = 0; } else { rx /= rlen; rz /= rlen; }\n\n // down = right × forward\n const dx = ry * fz - rz * fy;\n const dy = rz * fx - rx * fz;\n const dz = rx * fy - ry * fx;\n\n return {\n cx: cam.x, cy: cam.y, cz: cam.z,\n rx, ry, rz, dx, dy, dz, fx, fy, fz,\n focal: (compH / 2) / Math.tan((clampFov(cam.fov) * DEG) / 2),\n halfW: compW / 2, halfH: compH / 2,\n };\n}\n\n/** Local layer point (before pivot) to world space: T(x,y,z) · Rz · Ry · Rx · S · T(-pivot). */\nexport function layerToWorld(t: LayerTransform, px: number, py: number): Vec3 {\n let x = (px - t.pivotX) * t.scaleX;\n let y = (py - t.pivotY) * t.scaleY;\n let z = 0;\n\n let c = Math.cos(t.rotationX);\n let s = Math.sin(t.rotationX);\n [y, z] = [y * c - z * s, y * s + z * c];\n\n c = Math.cos(t.rotationY);\n s = Math.sin(t.rotationY);\n [x, z] = [x * c + z * s, -x * s + z * c];\n\n c = Math.cos(t.rotationZ);\n s = Math.sin(t.rotationZ);\n [x, y] = [x * c - y * s, x * s + y * c];\n\n return { x: x + t.x, y: y + t.y, z: z + t.z };\n}\n\nexport function projectPoint(b: CameraBasis, p: Vec3): { x: number; y: number; depth: number } {\n const vx = p.x - b.cx;\n const vy = p.y - b.cy;\n const vz = p.z - b.cz;\n const xc = vx * b.rx + vy * b.ry + vz * b.rz;\n const yc = vx * b.dx + vy * b.dy + vz * b.dz;\n const zc = vx * b.fx + vy * b.fy + vz * b.fz;\n return { x: b.halfW + (b.focal * xc) / zc, y: b.halfH + (b.focal * yc) / zc, depth: zc };\n}\n\nexport function projectLayer(t: LayerTransform, frame: Rect, b: CameraBasis): ProjectedLayer {\n const pts: Array<[number, number]> = [\n [frame.x, frame.y],\n [frame.x + frame.width, frame.y],\n [frame.x + frame.width, frame.y + frame.height],\n [frame.x, frame.y + frame.height],\n ];\n let visible = true;\n const corners: number[] = [];\n for (const [px, py] of pts) {\n const p = projectPoint(b, layerToWorld(t, px, py));\n if (!(p.depth > NEAR)) visible = false;\n corners.push(p.x, p.y);\n }\n const origin = projectPoint(b, { x: t.x, y: t.y, z: t.z });\n return { corners: corners as Corners, depth: origin.depth, visible };\n}\n","import { Container } from 'pixi.js';\nimport { Sequence } from '../sequences/Base';\nimport { MAX_FOV, MIN_FOV, clampFov, homeCamera, homeDistance, type CameraState } from './math';\nimport { collectPropKeys } from './specKeys';\nimport type { CameraWindow } from './camera';\nimport type { CameraSequenceSpec } from '../types';\n\ntype Carrier = Container & {\n z: number; lookAtX: number; lookAtY: number; lookAtZ: number; fov: number;\n};\n\n/**\n * `type: 'camera'`. Has no display object: `target` is a detached carrier whose\n * numeric props GSAP tweens exactly like any other layer, so the camera reuses\n * the whole `initial` / `keyframes` / expression pipeline. It is never added to\n * the scene graph.\n */\nexport class CameraSequence extends Sequence {\n declare spec: CameraSequenceSpec;\n /** True when `z` is never specified anywhere: z then follows `fov`. */\n autoZ = true;\n private compH = 0;\n private warnedFov = false;\n private warnedLookAt = false;\n\n async build(): Promise<void> {\n const compW = this.parent?.width ?? this.root.width;\n this.compH = this.parent?.height ?? this.root.height;\n if (this.duration === undefined) {\n this.duration = this.parent?.duration ?? this.root.duration;\n }\n const home = homeCamera(compW, this.compH);\n const carrier = new Container() as unknown as Carrier;\n carrier.x = home.x;\n carrier.y = home.y;\n carrier.z = home.z;\n carrier.lookAtX = home.lookAtX;\n carrier.lookAtY = home.lookAtY;\n carrier.lookAtZ = home.lookAtZ;\n carrier.fov = home.fov;\n this.target = carrier as unknown as Container;\n this.autoZ = !collectPropKeys(this.spec).has('z');\n }\n\n /** The camera's state at the current timeline position. */\n state(): CameraState {\n const c = this.target as unknown as Carrier;\n if (!this.warnedFov && !(c.fov >= MIN_FOV && c.fov <= MAX_FOV)) {\n this.warnedFov = true;\n const who = this.spec.name ? ` \"${this.spec.name}\"` : '';\n console.warn(`pixi-effects: camera${who}: fov ${c.fov} is outside [${MIN_FOV}, ${MAX_FOV}]; clamped`);\n }\n const fov = clampFov(c.fov);\n const z = this.autoZ ? homeDistance(this.compH, fov) : c.z;\n if (!this.warnedLookAt && c.lookAtX === c.x && c.lookAtY === c.y && c.lookAtZ === z) {\n this.warnedLookAt = true;\n const who = this.spec.name ? ` \"${this.spec.name}\"` : '';\n console.warn(`pixi-effects: camera${who}: lookAt equals the camera position; looking along -z instead`);\n }\n return {\n x: c.x, y: c.y, z,\n lookAtX: c.lookAtX, lookAtY: c.lookAtY, lookAtZ: c.lookAtZ,\n fov,\n };\n }\n\n /** Lifespan on the global timeline (valid after bindTimeline). */\n window(): CameraWindow {\n const start = this.absoluteStart ?? this.at;\n return { start, end: start + (this.duration ?? 0) };\n }\n}\n","import type { gsap } from 'gsap';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\n/**\n * A `set` keyframe for values GSAP cannot tween directly (colours, text state).\n *\n * `timeline.call` runs forward only, and GSAP skips every callback of a zero-duration tween when\n * the playhead leaves its exact start time backwards — so a jump placed at 1 s stayed applied\n * after seeking back to 0. A property write is never skipped: GSAP tweens a proxy `p` from 0 to 1,\n * and the proxy's setter applies the value going forward and restores the previous one going back.\n */\nexport function revertibleSet<T>(\n timeline: Timeline,\n at: number,\n read: () => T,\n write: (value: T) => void,\n value: T,\n): void {\n let p = 0;\n let before: T;\n const proxy = {\n get p() { return p; },\n set p(next: number) {\n if (next >= 1 && p < 1) { before = read(); write(value); }\n else if (next < 1 && p >= 1) { write(before); }\n p = next;\n },\n };\n timeline.set(proxy, { p: 1 }, at);\n}\n","/**\n * Perceptually uniform colour interpolation in OKLab / OKLCH.\n *\n * These spaces (Björn Ottosson, 2020) keep saturation and lightness\n * intuitive across a tween — a red → green ramp doesn't pass through\n * the muddy olive / brown that linear sRGB interpolation produces.\n *\n * - `oklab` : straight line in the (a, b) chromaticity plane.\n * - `oklch` : (L, C, h) with hue along the shorter angular path —\n * gives smooth rainbow-style sweeps.\n *\n * Inputs accept any of the formats colours appear in our DSL:\n * - hex string (`'#ff3366'`, `'#f36'`)\n * - 0xRRGGBB number\n * - rgb()/rgba() string\n * Outputs are always `'rgba(r,g,b,a)'` strings — that's what PixiJS's\n * Color() parser handles natively.\n */\n\nexport type ColorSpace = 'rgb' | 'oklab' | 'oklch';\n\nexport type ColorInput = string | number;\n\n/** Build an interpolator function `t ∈ [0, 1] → 'rgba(...)' string`. */\nexport function buildColorInterp(\n from: ColorInput,\n to: ColorInput,\n space: 'oklab' | 'oklch',\n): (t: number) => string {\n const fromRGBA = parseToRGBA(from);\n const toRGBA = parseToRGBA(to);\n const fromOk = rgbToOklab(fromRGBA);\n const toOk = rgbToOklab(toRGBA);\n\n if (space === 'oklab') {\n return (t: number): string => {\n const L = lerp(fromOk.L, toOk.L, t);\n const a = lerp(fromOk.a, toOk.a, t);\n const b = lerp(fromOk.b, toOk.b, t);\n const alpha = lerp(fromRGBA.a, toRGBA.a, t);\n return rgbaString(oklabToRgb({ L, a, b }), alpha);\n };\n }\n\n // OKLCH: convert to polar and interpolate hue along the shorter arc.\n const fromLCH = oklabToOklch(fromOk);\n const toLCH = oklabToOklch(toOk);\n // If either endpoint is achromatic (C ≈ 0), its hue is undefined; carry\n // the other endpoint's hue across so the ramp doesn't sweep through\n // arbitrary colours on the way to / from grey.\n if (fromLCH.C < 1e-4) fromLCH.h = toLCH.h;\n if (toLCH.C < 1e-4) toLCH.h = fromLCH.h;\n const hueDelta = shortestHueDelta(fromLCH.h, toLCH.h);\n\n return (t: number): string => {\n const L = lerp(fromLCH.L, toLCH.L, t);\n const C = lerp(fromLCH.C, toLCH.C, t);\n const h = fromLCH.h + hueDelta * t;\n const alpha = lerp(fromRGBA.a, toRGBA.a, t);\n const ab = oklchToOklab({ L, C, h });\n return rgbaString(oklabToRgb(ab), alpha);\n };\n}\n\n// ─── Parsers / formatters ────────────────────────────────────────────────\n\ninterface RGBA { r: number; g: number; b: number; a: number; } // 0..1 each\n\nfunction parseToRGBA(input: ColorInput): RGBA {\n if (typeof input === 'number') {\n return { r: ((input >> 16) & 0xff) / 255, g: ((input >> 8) & 0xff) / 255, b: (input & 0xff) / 255, a: 1 };\n }\n const s = input.trim();\n if (s.startsWith('#')) return parseHex(s);\n if (s.startsWith('rgb')) return parseRgbFunc(s);\n // Unknown format — fall back to opaque black rather than throwing, since\n // styling is best-effort and a single bad colour shouldn't blow the timeline.\n return { r: 0, g: 0, b: 0, a: 1 };\n}\n\nfunction parseHex(s: string): RGBA {\n const hex = s.slice(1);\n let r = 0, g = 0, b = 0, a = 1;\n if (hex.length === 3 || hex.length === 4) {\n r = parseInt(hex[0]! + hex[0]!, 16) / 255;\n g = parseInt(hex[1]! + hex[1]!, 16) / 255;\n b = parseInt(hex[2]! + hex[2]!, 16) / 255;\n if (hex.length === 4) a = parseInt(hex[3]! + hex[3]!, 16) / 255;\n } else if (hex.length === 6 || hex.length === 8) {\n r = parseInt(hex.slice(0, 2), 16) / 255;\n g = parseInt(hex.slice(2, 4), 16) / 255;\n b = parseInt(hex.slice(4, 6), 16) / 255;\n if (hex.length === 8) a = parseInt(hex.slice(6, 8), 16) / 255;\n }\n return { r, g, b, a };\n}\n\nfunction parseRgbFunc(s: string): RGBA {\n // Accept `rgb(r, g, b)` and `rgba(r, g, b, a)` — channels are 0..255 ints.\n const inner = s.replace(/^rgba?\\(/, '').replace(/\\)$/, '');\n const parts = inner.split(/[,\\s/]+/).filter(Boolean).map(parseFloat);\n return {\n r: (parts[0] ?? 0) / 255,\n g: (parts[1] ?? 0) / 255,\n b: (parts[2] ?? 0) / 255,\n a: parts.length > 3 ? (parts[3] ?? 1) : 1,\n };\n}\n\nfunction rgbaString(rgb: { r: number; g: number; b: number }, alpha: number): string {\n const r = Math.round(clamp01(rgb.r) * 255);\n const g = Math.round(clamp01(rgb.g) * 255);\n const b = Math.round(clamp01(rgb.b) * 255);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\n// ─── sRGB ↔ linear ↔ OKLab ─────────────────────────────────────────────\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n}\n\ninterface OkLab { L: number; a: number; b: number; }\n\nfunction rgbToOklab(rgba: RGBA): OkLab {\n const r = srgbToLinear(rgba.r);\n const g = srgbToLinear(rgba.g);\n const b = srgbToLinear(rgba.b);\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n return {\n L: 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_,\n };\n}\n\nfunction oklabToRgb(lab: OkLab): { r: number; g: number; b: number } {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.2914855480 * lab.b;\n const l = l_ * l_ * l_;\n const m = m_ * m_ * m_;\n const s = s_ * s_ * s_;\n return {\n r: linearToSrgb(+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n g: linearToSrgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n b: linearToSrgb(-0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s),\n };\n}\n\ninterface OkLCh { L: number; C: number; h: number; } // h in radians\n\nfunction oklabToOklch(lab: OkLab): OkLCh {\n return { L: lab.L, C: Math.hypot(lab.a, lab.b), h: Math.atan2(lab.b, lab.a) };\n}\n\nfunction oklchToOklab(lch: OkLCh): OkLab {\n return { L: lch.L, a: lch.C * Math.cos(lch.h), b: lch.C * Math.sin(lch.h) };\n}\n\n// ─── helpers ─────────────────────────────────────────────────────────────\n\nfunction lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\nfunction clamp01(v: number): number { return v < 0 ? 0 : v > 1 ? 1 : v; }\n\nfunction shortestHueDelta(from: number, to: number): number {\n // Both inputs are in [-π, π] from atan2. Pick the path that crosses the\n // smaller arc — never more than ±π.\n const TWO_PI = Math.PI * 2;\n let d = (to - from) % TWO_PI;\n if (d > Math.PI) d -= TWO_PI;\n if (d < -Math.PI) d += TWO_PI;\n return d;\n}\n","import { gsap } from 'gsap';\nimport { buildColorInterp, type ColorSpace, type ColorInput } from './colorInterp';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\n/**\n * Shared colour-tween helper used by every sequence type that wants to\n * interpolate a colour-valued property smoothly through a chosen colour\n * space (sRGB / OKLab / OKLCH).\n *\n * Keys to the design:\n * 1. The interpolator is built inside `onStart`, not at bind time, so a\n * chained-keyframe tween picks up the previous tween's end colour\n * (rather than locking onto the initial spec value).\n * 2. `fromValue` is honoured if explicit; otherwise we read `target[key]`\n * at tween start — matching GSAP's standard `.to()` semantic.\n * 3. The optional `onUpdate` hook lets the caller flag the target as dirty\n * after each write (e.g. PIXI Text needs `_didChange = true` to\n * re-rasterise its fill).\n */\nexport function tweenColor(\n timeline: Timeline,\n target: Record<string, unknown>,\n key: string,\n fromValue: ColorInput | undefined,\n toValue: ColorInput,\n duration: number,\n ease: string,\n at: number,\n colorSpace: ColorSpace,\n onUpdate?: () => void,\n loop: Record<string, number | boolean> = {},\n): void {\n let interp: ((p: number) => unknown) | null = null;\n const proxy = { p: 0 };\n timeline.fromTo(\n proxy,\n { p: 0 },\n {\n p: 1, duration, ease, ...loop,\n onStart: () => {\n const start = (fromValue !== undefined ? fromValue : target[key]) as ColorInput | undefined;\n if (start === undefined) return;\n interp = colorSpace === 'rgb'\n ? (gsap.utils.interpolate(start, toValue) as (p: number) => unknown)\n : buildColorInterp(start, toValue, colorSpace);\n },\n onUpdate: () => {\n if (interp) {\n target[key] = interp(proxy.p);\n if (onUpdate) onUpdate();\n }\n },\n },\n at,\n );\n}\n","import { Sprite, Assets, type Texture } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { applyKeyframes, applyInitial, resolveAt, loopVars } from '../core/Timeline';\nimport { revertibleSet } from '../core/revertibleSet';\nimport { tweenColor } from '../expr/colorTween';\nimport type { ColorInput, ColorSpace } from '../expr/colorInterp';\nimport type { ImageSequenceSpec, Keyframe, Props } from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport class ImageSequence extends Sequence {\n declare spec: ImageSequenceSpec;\n\n async build(): Promise<void> {\n const texture = await Assets.get<Texture>(this.spec.asset);\n const sprite = new Sprite({ texture, label: this.spec.name });\n sprite.cullable = true;\n this.target = sprite;\n this.intrinsicWidth = texture.width;\n this.intrinsicHeight = texture.height;\n if (this.duration === undefined) {\n this.duration = this.parent?.duration ?? this.root.duration;\n }\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const colorSpace = this.spec.colorSpace;\n if (!colorSpace || colorSpace === 'rgb') {\n // Default path — tint goes through PixiPlugin's native colour\n // interpolation along with everything else.\n super.bindTimeline(timeline, offset);\n return;\n }\n\n // Custom colour-space path: strip `tint` from the standard pipeline\n // and route it through tweenColor() so the interpolator runs in OKLab\n // / OKLCH instead of linear sRGB.\n const scope = this.scope();\n const startTime = offset + this.at; // keyframe `at` is sequence-local\n const initial = stripKeys(this.spec.initial, ['tint']);\n const keyframes = this.spec.keyframes\n ? this.spec.keyframes.map(kf => stripKeysInKeyframe(kf, ['tint']))\n : undefined;\n applyInitial(this.target, initial as Record<string, unknown> | undefined, scope as unknown as Record<string, number>);\n applyKeyframes(timeline, this.target, keyframes, this.duration!, scope as unknown as Record<string, number>, [], startTime);\n\n // Seed tint from initial.\n const initTint = (this.spec.initial as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n if (initTint !== undefined) (this.target as unknown as { tint: ColorInput }).tint = initTint;\n\n // Walk keyframes and emit a perceptual colour tween for any `tint` key.\n for (const kf of this.spec.keyframes ?? []) {\n const at = startTime + resolveAt(kf.at, this.duration!);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const fromTint = (kf.from as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n const toTint = (kf.to as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n const setTint = (kf.set as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n if (setTint !== undefined) {\n const sprite = this.target as unknown as { tint: ColorInput };\n revertibleSet(timeline, at, () => sprite.tint, c => { sprite.tint = c; }, setTint);\n }\n if (toTint !== undefined) {\n tweenColor(\n timeline,\n this.target as unknown as Record<string, unknown>,\n 'tint',\n fromTint,\n toTint,\n duration, ease, at, colorSpace, undefined, loopVars(kf),\n );\n }\n }\n\n this.absoluteStart = startTime;\n const endTime = startTime + this.duration!;\n this.target.renderable = startTime <= 0;\n timeline.set(this.target, { renderable: true }, startTime);\n timeline.set(this.target, { renderable: false }, endTime);\n }\n}\n\nfunction stripKeys(props: Props | undefined, keys: string[]): Props | undefined {\n if (!props) return props;\n const drop = new Set(keys);\n const out: Record<string, unknown> = {};\n let changed = false;\n for (const k of Object.keys(props)) {\n if (drop.has(k)) { changed = true; continue; }\n out[k] = (props as Record<string, unknown>)[k];\n }\n return changed ? (out as unknown as Props) : props;\n}\n\nfunction stripKeysInKeyframe(kf: Keyframe, keys: string[]): Keyframe {\n return {\n ...kf,\n set: stripKeys(kf.set, keys),\n to: stripKeys(kf.to, keys),\n from: stripKeys(kf.from, keys),\n };\n}\n","import { Text } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { normalizeProps } from '../expr/normalizeProps';\nimport { applyKeyframes, applyInitial, resolveAt, loopVars } from '../core/Timeline';\nimport { revertibleSet } from '../core/revertibleSet';\nimport { tweenColor } from '../expr/colorTween';\nimport type { ColorInput } from '../expr/colorInterp';\nimport type { TextSequenceSpec, Keyframe, Props } from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\n// TextStyle fields whose string values are words or colours, never expressions. `join` / `cap` / `color`\n// also live inside `stroke` and `dropShadow`, `stroke` itself may be a colour name.\nconst STYLE_OPAQUE_KEYS = [\n 'fontFamily', 'fill', 'align', 'fontStyle', 'fontWeight', 'fontVariant', 'textBaseline', 'whiteSpace',\n 'lineJoin', 'join', 'cap', 'color', 'stroke',\n];\n\ntype ValueState = { value: number };\n\nfunction formatValue(v: number, f: TextSequenceSpec['format']): string {\n const fixed = v.toFixed(Math.max(0, Math.floor(f?.decimals ?? 0)));\n if (!f?.grouping) return fixed;\n const [int, frac] = fixed.split('.') as [string, string | undefined];\n return int.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',') + (frac !== undefined ? '.' + frac : '');\n}\n\nexport class TextSequence extends Sequence {\n declare spec: TextSequenceSpec;\n /** Current number for the `{value}` placeholder (tweened by `value` keyframes). */\n private _value: ValueState = { value: 0 };\n private _lastText = '';\n\n /** Rewrite the displayed string from the template and the current `value`. */\n private _refreshText(): void {\n const template = this.spec.text ?? '';\n if (!template.includes('{value}')) return;\n const next = template.split('{value}').join(formatValue(this._value.value, this.spec.format));\n if (next === this._lastText) return;\n this._lastText = next;\n (this.target as Text).text = next;\n }\n\n async build(): Promise<void> {\n const baseStyle = {\n fontFamily: 'Arial',\n fontSize: 36,\n fill: '#ffffff',\n align: 'center' as const,\n };\n const text = new Text({\n text: this.spec.text ?? '',\n style: baseStyle,\n label: this.spec.name,\n });\n text.cullable = true;\n this.target = text;\n this.intrinsicWidth = text.width;\n this.intrinsicHeight = text.height;\n if (this.duration === undefined) {\n this.duration = this.parent?.duration ?? this.root.duration;\n }\n if (this.spec.style) {\n const scope = this.scope();\n const resolved = normalizeProps(\n this.spec.style as Record<string, unknown>,\n scope as unknown as Record<string, number>,\n { skipKeys: STYLE_OPAQUE_KEYS },\n );\n for (const k of Object.keys(resolved)) {\n (text.style as unknown as Record<string, unknown>)[k] = (resolved as Record<string, unknown>)[k];\n }\n // Re-measure: `w` / `h` in expressions must describe the STYLED text.\n this.intrinsicWidth = text.width;\n this.intrinsicHeight = text.height;\n }\n // `{value}` counter: seed the number from initial.value and print it.\n const initialValue = (this.spec.initial as Record<string, unknown> | undefined)?.value;\n if (initialValue !== undefined) this._value.value = resolveNumber(initialValue, this.scope());\n this._refreshText();\n if (this._lastText !== '') {\n this.intrinsicWidth = text.width;\n this.intrinsicHeight = text.height;\n }\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const colorSpace = this.spec.colorSpace ?? 'rgb';\n // Run the standard pipeline with `fill` stripped — text doesn't have a\n // top-level `fill` property (it lives on `style`), so leaving it in\n // would make GSAP warn about an unknown prop. Then route fill through\n // our per-frame text.style.fill update, with optional perceptual\n // interpolation.\n // `value` (the counter) is likewise not a property of the Text object.\n const stripped = stripKeys(this.spec, ['fill', 'value']);\n runSuperWithStrippedSpec(this, stripped, timeline, offset);\n bindFillKeyframes(timeline, this.target as Text, this.spec.keyframes ?? [], this.duration!, offset + this.at, colorSpace);\n bindValueKeyframes(timeline, this._value, () => this._refreshText(), this.spec.keyframes ?? [], this.duration!, offset + this.at, this.scope());\n }\n}\n\n// Helper: temporarily swap in a fill-stripped spec, run the base\n// bindTimeline, restore. Cheaper than reimplementing the entire base\n// behaviour.\nfunction runSuperWithStrippedSpec(\n inst: TextSequence,\n strippedSpec: TextSequenceSpec,\n timeline: Timeline,\n offset: number,\n): void {\n const originalSpec = inst.spec;\n (inst as unknown as { spec: TextSequenceSpec }).spec = strippedSpec;\n try {\n Sequence.prototype.bindTimeline.call(inst, timeline, offset);\n } finally {\n (inst as unknown as { spec: TextSequenceSpec }).spec = originalSpec;\n }\n}\n\nfunction stripKeys(spec: TextSequenceSpec, keys: string[]): TextSequenceSpec {\n return {\n ...spec,\n initial: stripProps(spec.initial, keys),\n keyframes: spec.keyframes\n ? spec.keyframes.map(kf => ({\n ...kf,\n set: stripProps(kf.set, keys),\n to: stripProps(kf.to, keys),\n from: stripProps(kf.from, keys),\n }))\n : undefined,\n };\n}\n\nfunction stripProps(props: Props | undefined, keys: string[]): Props | undefined {\n if (!props) return props;\n if (!keys.some(k => k in props)) return props;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(props)) if (!keys.includes(k)) out[k] = (props as Record<string, unknown>)[k];\n return out as unknown as Props;\n}\n\nfunction resolveNumber(v: unknown, scope: unknown): number {\n if (typeof v === 'number') return v;\n const out = normalizeProps({ v }, scope as unknown as Record<string, number>).v;\n return typeof out === 'number' ? out : Number(out) || 0;\n}\n\n// Tween the `{value}` counter. Mirrors the other keyframe kinds (set / to / from / from+to),\n// honours ease and repeat/yoyo, and calls `refresh` after every update so the text re-renders.\nfunction bindValueKeyframes(\n timeline: Timeline,\n state: ValueState,\n refresh: () => void,\n keyframes: Keyframe[],\n parentDuration: number,\n origin: number,\n scope: unknown,\n): void {\n for (const kf of keyframes) {\n const setV = kf.set?.value;\n const fromV = kf.from?.value;\n const toV = kf.to?.value;\n if (setV === undefined && fromV === undefined && toV === undefined) continue;\n const at = origin + resolveAt(kf.at, parentDuration);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const loop = loopVars(kf);\n if (setV !== undefined) {\n const v = resolveNumber(setV, scope);\n revertibleSet(timeline, at, () => state.value, n => { state.value = n; refresh(); }, v);\n }\n if (toV !== undefined && fromV !== undefined) {\n timeline.fromTo(state, { value: resolveNumber(fromV, scope) },\n { value: resolveNumber(toV, scope), duration, ease, ...loop, onUpdate: refresh }, at);\n } else if (toV !== undefined) {\n timeline.to(state, { value: resolveNumber(toV, scope), duration, ease, ...loop, onUpdate: refresh }, at);\n } else if (fromV !== undefined) {\n timeline.from(state, { value: resolveNumber(fromV, scope), duration, ease, ...loop, onUpdate: refresh }, at);\n }\n }\n}\n\n// Walk the keyframes and emit colour tweens for any `fill` mutation.\n// Updates `text.style.fill` directly; PIXI v8 marks the text dirty on\n// style mutation, so the fill change is rendered on the next frame.\nfunction bindFillKeyframes(\n timeline: Timeline,\n text: Text,\n keyframes: Keyframe[],\n parentDuration: number,\n offset: number,\n colorSpace: 'rgb' | 'oklab' | 'oklch',\n): void {\n // Mirror state object so tweenColor has somewhere consistent to write.\n // We then mirror back to text.style.fill in the onUpdate callback.\n const state: { fill?: ColorInput } = { fill: text.style.fill as ColorInput | undefined };\n const writeFill = (): void => { text.style.fill = state.fill as never; };\n\n for (const kf of keyframes) {\n const at = offset + resolveAt(kf.at, parentDuration);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const setFill = pickFill(kf.set);\n const fromFill = pickFill(kf.from);\n const toFill = pickFill(kf.to);\n\n if (setFill !== undefined) {\n revertibleSet(timeline, at, () => state.fill, c => { state.fill = c; writeFill(); }, setFill);\n }\n if (toFill !== undefined) {\n tweenColor(\n timeline,\n state as unknown as Record<string, unknown>,\n 'fill',\n fromFill,\n toFill,\n duration, ease, at, colorSpace,\n writeFill, loopVars(kf),\n );\n }\n }\n}\n\nfunction pickFill(props: Props | undefined): ColorInput | undefined {\n if (!props) return undefined;\n const v = (props as Record<string, unknown>).fill;\n if (typeof v === 'string' || typeof v === 'number') return v as ColorInput;\n return undefined;\n}\n","import { Assets } from 'pixi.js';\nimport { Sequence } from './Base';\nimport { normalizeKeyframe } from '../core/Timeline';\nimport { describeLayer } from '../core/lint';\nimport type { AudioSequenceSpec, AudioDescriptor } from '../types';\nimport type { AudioAssetData } from '../core/AssetLoader';\n\nexport class AudioSequence extends Sequence {\n declare spec: AudioSequenceSpec;\n private _audioBuffer: AudioBuffer | null = null;\n\n async build(): Promise<void> {\n const data = await Assets.get<AudioAssetData>(this.spec.asset);\n this._audioBuffer = data.audioBuffer;\n if (this.duration === undefined) {\n // One-shot: exactly as long as the clip. Looping: until the composition ends (a loop that stopped\n // after one clip length would not be a loop).\n const rest = Math.max(0, (this.parent?.duration ?? this.root.duration) - this.at);\n this.duration = this.spec.duration ?? (this.spec.loop ? rest : data.duration) ?? this.root.duration;\n }\n // Without `loop` the sound simply stops when the file ends — silently.\n if (!this.spec.loop && data.duration !== undefined && this.duration > data.duration + 0.05) {\n console.warn(\n `pixi-effects: ${describeLayer(this.spec)}: audio asset \"${this.spec.asset}\" is ${data.duration.toFixed(1)}s but the layer lasts ` +\n `${this.duration.toFixed(1)}s, so it goes silent after ${data.duration.toFixed(1)}s. Add loop: true, or shorten the layer's duration.`,\n );\n }\n this.target = null;\n }\n\n override bindTimeline(_timeline: unknown): void {\n // Audio has no visual; everything happens at mixdown time via collectAudio.\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n if (!this._audioBuffer) return;\n const initialVolume = this.spec.volume ?? 1;\n const volumeKeyframes: { time: number; value: number }[] = [];\n const dur = this.duration!;\n const t0 = baseTime + this.at;\n // The mixer ramps linearly from the PREVIOUS event to each point. So, like every other keyframe, a\n // volume change must (1) hold the value it has until its own start (a point at `start` with the\n // current value) and (2) jump with two points at the same time. Keyframes are applied in time order.\n const keyframes = (this.spec.keyframes ?? [])\n .map(raw => normalizeKeyframe(raw, dur))\n .filter(kf => [kf.set, kf.to, kf.from].some(p => p && 'volume' in p))\n .sort((x, y) => x.at - y.at);\n let current = initialVolume;\n const point = (time: number, value: number): void => { volumeKeyframes.push({ time, value }); };\n for (const kf of keyframes) {\n const start = t0 + kf.at;\n const end = start + kf.duration;\n const set = (kf.set as Record<string, number> | undefined)?.volume;\n const to = (kf.to as Record<string, number> | undefined)?.volume;\n const from = (kf.from as Record<string, number> | undefined)?.volume;\n point(start, current); // hold until the keyframe starts\n if (kf.kind === 'set' && set !== undefined) {\n point(start, set);\n current = set;\n } else if (kf.kind === 'to' && to !== undefined) {\n point(end, to);\n current = to;\n } else if (kf.kind === 'fromTo' && to !== undefined) {\n point(start, from ?? current);\n point(end, to);\n current = to;\n } else if (kf.kind === 'from' && from !== undefined) {\n point(start, from);\n point(end, current); // back to the value it had\n }\n }\n out.push({\n buffer: this._audioBuffer,\n loop: !!this.spec.loop,\n start: baseTime + this.at,\n end: baseTime + this.at + dur,\n initialVolume,\n volumeKeyframes,\n });\n }\n\n override destroy(): void {\n this._audioBuffer = null;\n }\n}\n","/**\n * Subset of the mediabunny VideoSampleSink API we depend on. Exposed as an\n * interface so tests can provide a mock sink.\n */\nexport interface FrameSink {\n getSample(time: number): Promise<{\n timestamp: number;\n toVideoFrame: () => VideoFrame;\n close?: () => void;\n } | null>;\n}\n\nexport interface FrameCacheOptions {\n capacity?: number;\n}\n\nexport class FrameCache {\n sink: FrameSink;\n capacity: number;\n cache: Map<number, VideoFrame> = new Map();\n private _pending: Map<number, Promise<VideoFrame | null>> = new Map();\n\n constructor(sink: FrameSink, options: FrameCacheOptions = {}) {\n this.sink = sink;\n this.capacity = options.capacity ?? 30;\n }\n\n private _key(time: number): number {\n return Math.round(time * 1000);\n }\n\n async getFrameAt(time: number): Promise<VideoFrame | null> {\n const key = this._key(time);\n\n if (this.cache.has(key)) {\n const v = this.cache.get(key)!;\n this.cache.delete(key);\n this.cache.set(key, v);\n return v;\n }\n\n const pending = this._pending.get(key);\n if (pending) return pending;\n\n const promise = this._fetch(time);\n this._pending.set(key, promise);\n try {\n const frame = await promise;\n if (frame) {\n if (this.cache.has(key)) {\n frame.close?.();\n const existing = this.cache.get(key)!;\n this.cache.delete(key);\n this.cache.set(key, existing);\n return existing;\n }\n this.cache.set(key, frame);\n this._evictIfNeeded();\n }\n return frame;\n } finally {\n this._pending.delete(key);\n }\n }\n\n private async _fetch(time: number): Promise<VideoFrame | null> {\n // WebCodecs decoders occasionally surface EncodingError / NotSupportedError\n // on certain seeks (rapid scrubbing, malformed packets at chapter joins,\n // EOF probes). These are known-transient and the next request usually\n // succeeds, so log them at `debug` (hidden in default consoles) instead of\n // `warn`. Anything else still warns loudly.\n try {\n const sample = await this.sink.getSample(time);\n if (!sample) return null;\n const frame = sample.toVideoFrame();\n sample.close?.();\n return frame;\n } catch (err) {\n const isTransient = err instanceof DOMException\n && (err.name === 'EncodingError' || err.name === 'NotSupportedError');\n if (isTransient) {\n console.debug('pixi-effects: transient video decode failure at', time, 's —', err.name);\n } else {\n console.warn('pixi-effects: video frame decode failed at', time, 's —', err);\n }\n return null;\n }\n }\n\n private _evictIfNeeded(): void {\n while (this.cache.size > this.capacity) {\n const oldestKey = this.cache.keys().next().value as number | undefined;\n if (oldestKey === undefined) break;\n const oldestFrame = this.cache.get(oldestKey);\n oldestFrame?.close?.();\n this.cache.delete(oldestKey);\n }\n }\n\n dispose(): void {\n for (const f of this.cache.values()) f?.close?.();\n this.cache.clear();\n this._pending.clear();\n }\n}\n","import { Sprite, Texture, Assets } from 'pixi.js';\nimport { Sequence } from './Base';\nimport { FrameCache, type FrameSink } from '../core/FrameCache';\nimport type { VideoSequenceSpec, AudioDescriptor } from '../types';\nimport type { VideoAssetData } from '../core/AssetLoader';\n\nimport type { gsap } from 'gsap';\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport class VideoSequence extends Sequence {\n declare spec: VideoSequenceSpec;\n private _sourceDuration = 0;\n private _audioBuffer: AudioBuffer | null = null;\n private _cache: FrameCache | null = null;\n private _canvas: HTMLCanvasElement | null = null;\n private _ctx: CanvasRenderingContext2D | null = null;\n private _drawSeq = 0;\n\n async build(): Promise<void> {\n const data = await Assets.get<VideoAssetData>(this.spec.asset);\n this._sourceDuration = data.duration;\n this._audioBuffer = (this.spec.audio !== false) ? data.audioBuffer : null;\n this._cache = new FrameCache(data.sink as unknown as FrameSink, { capacity: 30 });\n\n const probeFrame = await this._cache.getFrameAt(0);\n const w = probeFrame?.displayWidth ?? 1920;\n const h = probeFrame?.displayHeight ?? 1080;\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n this._canvas = canvas;\n this._ctx = canvas.getContext('2d', { alpha: true });\n if (probeFrame && this._ctx) this._ctx.drawImage(probeFrame, 0, 0);\n\n const texture = Texture.from(canvas);\n const sprite = new Sprite({ texture, label: this.spec.name });\n sprite.cullable = true;\n this.target = sprite;\n this.intrinsicWidth = w;\n this.intrinsicHeight = h;\n\n if (this.duration === undefined) {\n this.duration = this.spec.duration ?? data.duration ?? this.root.duration;\n }\n\n let currentTime = 0;\n const seq = this;\n Object.defineProperty(sprite, 'currentTime', {\n get(): number { return currentTime; },\n set(v: number) {\n currentTime = v;\n const mySeq = ++seq._drawSeq;\n const lookup = seq.spec.loop && seq._sourceDuration > 0 ? v % seq._sourceDuration : v;\n seq._cache!.getFrameAt(lookup).then(frame => {\n if (mySeq !== seq._drawSeq) return;\n if (!frame || !seq._ctx) return;\n seq._ctx.drawImage(frame, 0, 0);\n texture.source.update();\n }).catch((err) => {\n // FrameCache._fetch already swallows decoder errors; this is defense\n // in depth against any failure inside the .then handler (e.g.\n // drawImage on a frame that became invalid mid-draw).\n console.warn('pixi-effects: video frame draw failed:', err);\n });\n },\n });\n\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n const playDuration = this.spec.loop\n ? this.duration!\n : Math.min(this.duration!, this._sourceDuration);\n timeline.fromTo(\n this.target!,\n { currentTime: 0 },\n { currentTime: playDuration, duration: playDuration, ease: 'none' },\n offset + this.at, // offset = start of the enclosing composition(s); dropping it misplaced videos inside nested compositions\n );\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n if (!this._audioBuffer) return;\n const initialVolume = this.spec.volume ?? 1;\n out.push({\n buffer: this._audioBuffer,\n loop: !!this.spec.loop,\n start: baseTime + this.at,\n end: baseTime + this.at + this.duration!,\n initialVolume,\n volumeKeyframes: [],\n });\n }\n\n async awaitFrameAt(time: number): Promise<void> {\n const mySeq = ++this._drawSeq;\n const lookup = this.spec.loop && this._sourceDuration > 0 ? time % this._sourceDuration : time;\n let frame: VideoFrame | null = null;\n try {\n frame = await this._cache!.getFrameAt(lookup);\n } catch (err) {\n // FrameCache should already handle this, but belt-and-suspenders so a\n // sync render path (Movie.gotoFrame) never rejects mid-pipeline.\n console.warn('pixi-effects: awaitFrameAt failed at', time, 's —', err);\n return;\n }\n if (mySeq !== this._drawSeq) return;\n if (frame && this._ctx) {\n try {\n this._ctx.drawImage(frame, 0, 0);\n (this.target as Sprite).texture.source.update();\n } catch (err) {\n console.warn('pixi-effects: drawImage failed at', time, 's —', err);\n }\n }\n }\n\n override destroy(): void {\n this._cache?.dispose();\n this._cache = null;\n super.destroy();\n }\n}\n","import type { GradientSpec } from '../types';\n\n/** `'#rrggbb'` for numbers; CSS colour strings (hex, rgb(), rgba(), names) pass through. */\nexport function cssColor(c: string | number): string {\n return typeof c === 'number' ? '#' + c.toString(16).padStart(6, '0') : c;\n}\n\nfunction normalizedStops(g: GradientSpec): Array<{ offset: number; color: string | number }> {\n const stops = g.stops ?? [];\n if (stops.length < 2) throw new Error('pixi-effects: fillGradient needs at least two colour stops, e.g. stops: [[0, \"#000\"], [1, \"#fff\"]]');\n return stops.map(s => (Array.isArray(s) ? { offset: s[0], color: s[1] } : { offset: s.offset, color: s.color }));\n}\n\n/**\n * PixiJS `FillGradient` options for a LINEAR `fillGradient` (local space: 0–1 across the shape's own\n * bounds, so it follows the shape's size). `angle` in degrees: 0 = left → right, 90 = top → bottom\n * (default, like CSS `to bottom`); the line passes through the centre and spans corner to corner.\n */\nexport function gradientOptions(g: GradientSpec): Record<string, unknown> {\n const colorStops = normalizedStops(g);\n const a = ((g.angle ?? 90) * Math.PI) / 180;\n const dx = Math.cos(a), dy = Math.sin(a);\n const h = (Math.abs(dx) + Math.abs(dy)) / 2; // half-extent so the line reaches the corners\n return {\n type: 'linear',\n start: { x: 0.5 - dx * h, y: 0.5 - dy * h },\n end: { x: 0.5 + dx * h, y: 0.5 + dy * h },\n colorStops, textureSpace: 'local',\n };\n}\n\n/** The slice of CanvasRenderingContext2D that `paintRadial` uses (so tests can fake it). */\nexport interface RadialCtx {\n createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): { addColorStop(offset: number, color: string): void };\n fillRect(x: number, y: number, w: number, h: number): void;\n fillStyle: unknown;\n}\n\n/**\n * Paint a RADIAL `fillGradient` onto a square canvas: centre / `innerRadius` / `radius` in 0–1 of the\n * canvas, concentric circles, so the first stop colours the inside and the last stop everything beyond.\n * The canvas is later stretched over the shape's bounds (an ellipse on a non-square shape — what a\n * vignette wants). Done on a canvas because PixiJS's own radial fill lays an opaque-last-colour underlay\n * over the whole shape, which makes a transparent-centre vignette dark everywhere.\n */\nexport function paintRadial(ctx: RadialCtx, size: number, g: GradientSpec): void {\n const stops = normalizedStops(g);\n const [cx, cy] = g.center ?? [0.5, 0.5];\n const grad = ctx.createRadialGradient(cx * size, cy * size, (g.innerRadius ?? 0) * size, cx * size, cy * size, (g.radius ?? 0.5) * size);\n for (const s of stops) grad.addColorStop(s.offset, cssColor(s.color));\n ctx.fillStyle = grad;\n ctx.fillRect(0, 0, size, size);\n}\n","import { FillGradient, Texture } from 'pixi.js';\nimport { gradientOptions, paintRadial, type RadialCtx } from './gradient';\nimport type { GradientSpec } from '../types';\n\nconst RADIAL_SIZE = 256;\n\n/** What to hand to `Graphics.fill(...)` for a `fillGradient`: a FillGradient (linear) or a local-space texture (radial). */\nexport function makeGradientFill(g: GradientSpec): FillGradient | { texture: Texture; textureSpace: 'local' } {\n if (g.type === 'radial') {\n const canvas = document.createElement('canvas');\n canvas.width = RADIAL_SIZE;\n canvas.height = RADIAL_SIZE;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n paintRadial(ctx as unknown as RadialCtx, RADIAL_SIZE, g);\n return { texture: Texture.from(canvas), textureSpace: 'local' };\n }\n }\n return new FillGradient(gradientOptions(g) as never);\n}\n","import { Graphics, GraphicsPath } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { evaluateExpr, isExpr } from '../expr/Parser';\nimport { applyKeyframes, applyInitial, resolveAt, loopVars } from '../core/Timeline';\nimport { revertibleSet } from '../core/revertibleSet';\nimport { type ColorSpace, type ColorInput } from '../expr/colorInterp';\nimport { tweenColor } from '../expr/colorTween';\nimport type { Scope } from '../expr/Scope';\nimport { makeGradientFill } from './gradientFill';\nimport type {\n ShapeSequenceSpec, GradientSpec,\n LineShapeSpec, PolygonShapeSpec, PathShapeSpec,\n Props, Keyframe, PropValue,\n} from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\n// Style + geometry props live on the shape's `_state`, not on the Graphics.\n// The shape redraws every frame from `_state`, so style AND scalar geometry\n// props (width, radius, …) are both keyframable through the same pipeline.\n//\n// Style is uniform across shape kinds; geometry is shape-kind-specific.\n// `LIVE_KEYS` is the union — any key in this set is stripped from the\n// standard transform/keyframe pipeline and routed through `_state` instead.\ntype StyleKey = 'fillColor' | 'fillAlpha' | 'strokeColor' | 'strokeAlpha' | 'strokeWidth';\ntype GeometryKey = 'width' | 'height' | 'cornerRadius' | 'radius' | 'radiusX' | 'radiusY' | 'anchorX' | 'anchorY';\ntype LiveKey = StyleKey | GeometryKey;\n\nconst STYLE_KEYS = ['fillColor', 'fillAlpha', 'strokeColor', 'strokeAlpha', 'strokeWidth'] as const;\nconst COLOR_KEYS = new Set<LiveKey>(['fillColor', 'strokeColor']);\n\n// Per-shape-kind set of geometry keys that are animatable. Array geometry\n// (polygon points, line endpoints, path `d`) isn't animated in v1 — those\n// are baked once at build. `anchorX` / `anchorY` are also animatable —\n// useful for \"morph from left-anchored to centred\" tricks.\nconst GEOMETRY_KEYS_BY_SHAPE: Record<ShapeSequenceSpec['shape'], readonly GeometryKey[]> = {\n rect: ['width', 'height', 'cornerRadius', 'anchorX', 'anchorY'],\n circle: ['radius', 'anchorX', 'anchorY'],\n ellipse: ['radiusX', 'radiusY', 'anchorX', 'anchorY'],\n line: [],\n polygon: [],\n path: [],\n};\n\n// Shape kinds whose geometry is drawn relative to a configurable anchor —\n// they don't need the build-time auto-pivot that user-coord shapes\n// (line / polygon / path) rely on for visual centring.\nconst ANCHORED_SHAPES = new Set<ShapeSequenceSpec['shape']>(['rect', 'circle', 'ellipse']);\n\ninterface ShapeState {\n // style\n fillStyle?: unknown; // gradient fill argument for Graphics.fill, built once at build; wins over fillColor\n fillColor: string | number | undefined;\n fillAlpha: number;\n strokeColor: string | number | undefined;\n strokeAlpha: number;\n strokeWidth: number;\n // geometry (only the relevant subset for the shape kind is non-undefined)\n width?: number;\n height?: number;\n cornerRadius?: number;\n radius?: number;\n radiusX?: number;\n radiusY?: number;\n anchorX?: number;\n anchorY?: number;\n}\n\nexport class ShapeSequence extends Sequence {\n declare spec: ShapeSequenceSpec;\n private _state: ShapeState = {\n fillColor: undefined,\n fillAlpha: 1,\n strokeColor: undefined,\n strokeAlpha: 1,\n strokeWidth: 0,\n };\n // Closure that draws the path commands for this shape kind from the\n // (possibly tweened) `_state`. Bound once at build; called on every frame\n // by `Container.onRender`.\n private _drawGeometry: (g: Graphics) => void = () => {};\n private _liveKeys = new Set<LiveKey>(STYLE_KEYS);\n\n async build(): Promise<void> {\n const graphics = new Graphics({ label: this.spec.name });\n graphics.cullable = true;\n this.target = graphics;\n if (this.duration === undefined) {\n this.duration = this.parent?.duration ?? this.root.duration;\n }\n\n const scope = this.scope();\n const geomKeys = GEOMETRY_KEYS_BY_SHAPE[this.spec.shape];\n for (const k of geomKeys) this._liveKeys.add(k);\n\n // Seed _state with geometry from the spec (resolved against the scope\n // for expression support like `width: 'W * 0.5'`) and the initial style.\n seedGeometry(this._state, this.spec, scope);\n seedStyle(this._state, this.spec.initial ?? {}, scope);\n const gradientSpec = this.spec.fillGradient ?? (this.spec.initial as { fillGradient?: GradientSpec } | undefined)?.fillGradient;\n if (gradientSpec) this._state.fillStyle = makeGradientFill(gradientSpec);\n\n // Build the per-frame draw closure. For symmetric shapes (rect / circle /\n // ellipse) it pulls from _state so geometry tweens take effect; for\n // user-coord shapes (line / polygon / path) the geometry is immutable\n // and resolved once here.\n this._drawGeometry = makeDrawGeometry(this.spec, scope, this._state);\n\n this._drawGeometry(graphics);\n applyState(graphics, this._state);\n\n const bounds = graphics.getLocalBounds();\n this.intrinsicWidth = bounds.width;\n this.intrinsicHeight = bounds.height;\n // Auto-pivot only for user-coord shapes (line / polygon / path) — they\n // need it to compensate for whatever local origin the user picked.\n // Anchored shapes (rect / circle / ellipse) already control their own\n // origin via `anchorX` / `anchorY`; setting pivot here would double-up\n // and surprise the user.\n // A user-supplied initial.pivotX / pivotY overrides this in bindTimeline.\n if (!ANCHORED_SHAPES.has(this.spec.shape)) {\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n graphics.pivot.set(cx, cy);\n // Pivot at the centre means x,y places the centre. When the author gives no x / y the points\n // are meant as plain coordinates, so default the position to that centre (the shape then\n // appears exactly where its points say). An explicit initial x / y still wins, per axis.\n const init = (this.spec.initial ?? {}) as Record<string, unknown>;\n if (init.x === undefined) graphics.x = cx;\n if (init.y === undefined) graphics.y = cy;\n }\n\n // Per-frame redraw: PIXI v8 `Container.onRender` fires during render, so\n // we read the (possibly tweened) `_state` and re-issue the geometry +\n // fill / stroke. Clearing first is essential because v8 records each\n // .fill()/.stroke() as a separate instruction — without clear() the\n // instruction list grows unbounded.\n graphics.onRender = () => {\n if (this._fresh) { this._fresh = false; return; } // syncFrame() already drew this frame\n this._redraw();\n };\n\n this.buildFilters();\n }\n\n private _fresh = false;\n\n private _redraw(): void {\n const graphics = this.target as Graphics;\n graphics.clear();\n this._drawGeometry(graphics);\n applyState(graphics, this._state);\n }\n\n /**\n * Draw from the tweened `_state` before the culler runs. The culler measures the geometry as last\n * drawn; a layer drawn only inside `onRender` is culled on stale bounds (a rect growing from\n * `width: 0` at the left edge was skipped after a jump seek, and one frame late in playback).\n */\n override syncFrame(): void {\n super.syncFrame();\n if (!this.target?.renderable) return;\n this._redraw();\n this._fresh = true;\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const scope = this.scope();\n const startTime = offset + this.at; // keyframe `at` is sequence-local\n // Non-live props go through the standard pipeline (transform, alpha,\n // filter uniforms, …).\n const initial = stripLive(stripGradient(this.spec.initial), this._liveKeys);\n const keyframes = this.spec.keyframes\n ? this.spec.keyframes.map(kf => stripLiveKeyframe(kf, this._liveKeys))\n : undefined;\n applyInitial(this.target, initial as Record<string, unknown> | undefined, scope as unknown as Record<string, number>);\n applyKeyframes(timeline, this.target, keyframes, this.duration!, scope as unknown as Record<string, number>, [], startTime);\n\n // Live props (style + scalar geometry) get a parallel set of tweens\n // targeting `_state`. Colour keys (fillColor / strokeColor) interpolate\n // through gsap.utils.interpolate (or OKLab / OKLCH if `colorSpace` is\n // set on the spec); geometry / alpha / width tween linearly through\n // GSAP's standard numeric interpolation.\n const colorSpace: ColorSpace = (this.spec as { colorSpace?: ColorSpace }).colorSpace ?? 'rgb';\n bindLiveKeyframes(timeline, this._state, this._liveKeys, this.spec.keyframes ?? [], this.duration!, scope, startTime, colorSpace);\n\n this.absoluteStart = startTime;\n const endTime = startTime + this.duration!;\n this.target.renderable = startTime <= 0;\n timeline.set(this.target, { renderable: true }, startTime);\n timeline.set(this.target, { renderable: false }, endTime);\n }\n}\n\n// ─── State seeding ───────────────────────────────────────────────────────\n\nfunction seedGeometry(state: ShapeState, spec: ShapeSequenceSpec, scope: Scope): void {\n const keys = GEOMETRY_KEYS_BY_SHAPE[spec.shape];\n const initial = (spec.initial ?? {}) as Record<string, PropValue | undefined>;\n for (const k of keys) {\n // Same vocabulary as every other layer: geometry may be written at the top\n // level (next to `shape`) or in `initial`; the top level wins.\n const v = (spec as unknown as Record<string, PropValue | undefined>)[k] ?? initial[k];\n if (v !== undefined) (state as unknown as Record<string, unknown>)[k] = num(v, scope);\n }\n}\n\nfunction seedStyle(state: ShapeState, initial: Props, scope: Scope): void {\n for (const k of STYLE_KEYS) {\n const v = (initial as Record<string, unknown>)[k];\n if (v === undefined) continue;\n (state as unknown as Record<string, unknown>)[k] = COLOR_KEYS.has(k) ? v : numOrZero(v, scope);\n }\n}\n\n// ─── Strip live keys from the spec.initial / spec.keyframes that go to PixiPlugin ──\n\nfunction stripGradient(props: Props | undefined): Props | undefined {\n if (!props || !('fillGradient' in props)) return props;\n const { fillGradient: _drop, ...rest } = props as Record<string, unknown>;\n return rest as unknown as Props;\n}\n\nfunction stripLive(props: Props | undefined, liveKeys: Set<LiveKey>): Props | undefined {\n if (!props) return props;\n const out: Record<string, unknown> = {};\n let changed = false;\n for (const k of Object.keys(props)) {\n if (liveKeys.has(k as LiveKey)) { changed = true; continue; }\n out[k] = (props as Record<string, unknown>)[k];\n }\n return changed ? (out as unknown as Props) : props;\n}\n\nfunction stripLiveKeyframe(kf: Keyframe, liveKeys: Set<LiveKey>): Keyframe {\n return {\n ...kf,\n set: stripLive(kf.set, liveKeys),\n to: stripLive(kf.to, liveKeys),\n from: stripLive(kf.from, liveKeys),\n };\n}\n\nfunction pickLive(props: Props | undefined, liveKeys: Set<LiveKey>): Record<string, unknown> | null {\n if (!props) return null;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const k of Object.keys(props)) {\n if (liveKeys.has(k as LiveKey)) {\n out[k] = (props as Record<string, unknown>)[k];\n any = true;\n }\n }\n return any ? out : null;\n}\n\nfunction resolveLiveValue(key: LiveKey, value: unknown, scope: Scope): unknown {\n if (COLOR_KEYS.has(key)) return value; // colour: pass through as-is\n return numOrZero(value, scope);\n}\n\n// ─── Per-frame redraw ────────────────────────────────────────────────────\n\nfunction applyState(g: Graphics, s: ShapeState): void {\n if (s.fillStyle) {\n g.fill(s.fillStyle as never);\n } else if (s.fillColor !== undefined) {\n g.fill({ color: s.fillColor, alpha: s.fillAlpha });\n }\n if (s.strokeColor !== undefined && s.strokeWidth > 0) {\n g.stroke({ color: s.strokeColor, alpha: s.strokeAlpha, width: s.strokeWidth });\n }\n}\n\n// ─── drawShape closures (live for symmetric shapes, frozen for the rest) ──\n//\n// The closure returned here is what `Container.onRender` calls every frame.\n// For rect / circle / ellipse it captures a reference to `_state`, so any\n// tween of width / radius / etc. is reflected on the next render.\n// For line / polygon / path the geometry is baked at build time and the\n// closure is constant — they aren't animatable in v1.\n\nfunction drawRectFromState(g: Graphics, s: ShapeState): void {\n const w = s.width ?? 0;\n const h = s.height ?? 0;\n const r = s.cornerRadius ?? 0;\n const ax = s.anchorX ?? 0.5;\n const ay = s.anchorY ?? 0.5;\n // The local origin sits at (anchorX * w, anchorY * h) of the rect.\n // anchorX:0 → left edge at origin (rect grows rightward when w animates).\n // anchorX:0.5 → centred (default).\n // (`0 - x` rather than `-x` to avoid JS's -0 quirk in the ax=0 case.)\n const x = 0 - ax * w;\n const y = 0 - ay * h;\n if (r > 0) g.roundRect(x, y, w, h, r);\n else g.rect(x, y, w, h);\n}\nfunction drawCircleFromState(g: Graphics, s: ShapeState): void {\n const r = s.radius ?? 0;\n const ax = s.anchorX ?? 0.5;\n const ay = s.anchorY ?? 0.5;\n // Anchor on the bbox of the circle: (ax, ay) in [0..1] × bbox (2r × 2r).\n // ax:0 → left edge at origin (centre at +r along x).\n g.circle((0.5 - ax) * 2 * r, (0.5 - ay) * 2 * r, r);\n}\nfunction drawEllipseFromState(g: Graphics, s: ShapeState): void {\n const rx = s.radiusX ?? 0;\n const ry = s.radiusY ?? 0;\n const ax = s.anchorX ?? 0.5;\n const ay = s.anchorY ?? 0.5;\n g.ellipse((0.5 - ax) * 2 * rx, (0.5 - ay) * 2 * ry, rx, ry);\n}\nfunction makeLineDraw(spec: LineShapeSpec, scope: Scope): (g: Graphics) => void {\n const fx = num(spec.from[0], scope);\n const fy = num(spec.from[1], scope);\n const tx = num(spec.to[0], scope);\n const ty = num(spec.to[1], scope);\n return (g: Graphics) => { g.moveTo(fx, fy); g.lineTo(tx, ty); };\n}\nfunction makePolygonDraw(spec: PolygonShapeSpec, scope: Scope): (g: Graphics) => void {\n if (spec.points.length === 0) return () => {};\n const flat: number[] = [];\n for (const [x, y] of spec.points) flat.push(num(x, scope), num(y, scope));\n const closed = !spec.open;\n return (g: Graphics) => { g.poly(flat, closed); };\n}\nfunction makePathDraw(spec: PathShapeSpec): (g: Graphics) => void {\n // GraphicsPath accepts the SVG `d` directly; we apply it as a sub-path\n // so user fill / stroke aren't clobbered by the SVG parser's defaults.\n return (g: Graphics) => { g.path(new GraphicsPath(spec.d)); };\n}\n\nconst STATE_DRAWERS: Partial<Record<ShapeSequenceSpec['shape'], (g: Graphics, s: ShapeState) => void>> = {\n rect: drawRectFromState,\n circle: drawCircleFromState,\n ellipse: drawEllipseFromState,\n};\n\nfunction makeDrawGeometry(spec: ShapeSequenceSpec, scope: Scope, state: ShapeState): (g: Graphics) => void {\n const stateDrawer = STATE_DRAWERS[spec.shape];\n if (stateDrawer) return (g: Graphics) => stateDrawer(g, state);\n switch (spec.shape) {\n case 'line': return makeLineDraw(spec, scope);\n case 'polygon': return makePolygonDraw(spec, scope);\n case 'path': return makePathDraw(spec);\n }\n return () => {};\n}\n\n// ─── Bind keyframes onto _state ──────────────────────────────────────────\n\nfunction bindLiveKeyframes(\n timeline: Timeline,\n state: ShapeState,\n liveKeys: Set<LiveKey>,\n keyframes: Keyframe[],\n parentDuration: number,\n scope: Scope,\n offset: number,\n colorSpace: ColorSpace,\n): void {\n for (const kf of keyframes) {\n const at = offset + resolveAt(kf.at, parentDuration);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const loop = loopVars(kf);\n\n if (kf.set) {\n const live = pickLive(kf.set, liveKeys);\n if (live) {\n for (const [k, v] of Object.entries(live)) {\n const resolved = resolveLiveValue(k as LiveKey, v, scope);\n const live = state as unknown as Record<string, unknown>;\n revertibleSet(timeline, at, () => live[k], v2 => { live[k] = v2; }, resolved);\n }\n }\n }\n\n const fromLive = pickLive(kf.from, liveKeys);\n const toLive = pickLive(kf.to, liveKeys);\n const allKeys = new Set<string>([\n ...(fromLive ? Object.keys(fromLive) : []),\n ...(toLive ? Object.keys(toLive) : []),\n ]);\n for (const k of allKeys) {\n const key = k as LiveKey;\n const fromRaw = fromLive?.[key];\n const toRaw = toLive?.[key];\n // Only resolve `from` when the user actually specified it.\n // Otherwise leave it undefined so the tween captures the live state\n // value WHEN it starts (not at bind time, which would lock every\n // chained keyframe back to the initial value — masking later changes).\n const fromValue = fromRaw !== undefined ? resolveLiveValue(key, fromRaw, scope) : undefined;\n const toValue = toRaw !== undefined ? resolveLiveValue(key, toRaw, scope) : undefined;\n tweenLiveKey(timeline, state, key, fromValue, toValue, duration, ease, at, colorSpace, loop);\n }\n }\n}\n\nfunction tweenLiveKey(\n timeline: Timeline,\n state: ShapeState,\n key: LiveKey,\n fromValue: unknown, // undefined = pick up live state at tween start\n toValue: unknown,\n duration: number,\n ease: string,\n at: number,\n colorSpace: ColorSpace,\n loop: Record<string, number | boolean>,\n): void {\n if (COLOR_KEYS.has(key) && toValue !== undefined) {\n tweenColor(\n timeline,\n state as unknown as Record<string, unknown>,\n key,\n fromValue as ColorInput | undefined,\n toValue as ColorInput,\n duration, ease, at, colorSpace, undefined, loop,\n );\n } else if (toValue !== undefined) {\n // Numeric keys (alpha, width, geometry).\n if (fromValue !== undefined) {\n // Only force a starting value when `from` was explicit on the keyframe.\n timeline.fromTo(state, { [key]: fromValue }, { [key]: toValue, duration, ease, ...loop }, at);\n } else {\n // Standard `.to()` picks up the live state value at tween start —\n // chains correctly through prior keyframes.\n timeline.to(state, { [key]: toValue, duration, ease, ...loop }, at);\n }\n }\n}\n\n// ─── helpers ─────────────────────────────────────────────────────────────\n\nfunction num(v: PropValue, scope: Scope): number {\n if (typeof v === 'number') return v;\n if (isExpr(v)) return evaluateExpr(v, scope as unknown as Record<string, number>);\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\nfunction numOrZero(v: unknown, scope: Scope): number {\n if (typeof v === 'number') return v;\n if (typeof v === 'string') return num(v, scope);\n return 0;\n}\n","import { ImageSequence } from '../sequences/Image';\nimport { TextSequence } from '../sequences/Text';\nimport { AudioSequence } from '../sequences/Audio';\nimport { VideoSequence } from '../sequences/Video';\nimport { ShapeSequence } from '../sequences/Shape';\nimport { CameraSequence } from '../space/CameraSequence';\nimport type { Sequence } from '../sequences/Base';\nimport type { SequenceSpec, CompositionShape } from '../types';\n\nlet _CompositionSequence: typeof import('../sequences/Composition').CompositionSequence | null = null;\nasync function getCompositionSequence() {\n if (!_CompositionSequence) {\n _CompositionSequence = (await import('../sequences/Composition')).CompositionSequence;\n }\n return _CompositionSequence;\n}\n\nexport type SequenceCtor = { new (spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape): Sequence };\n\nconst staticTypes: Partial<Record<SequenceSpec['type'], SequenceCtor>> = {\n image: ImageSequence as unknown as SequenceCtor,\n text: TextSequence as unknown as SequenceCtor,\n audio: AudioSequence as unknown as SequenceCtor,\n video: VideoSequence as unknown as SequenceCtor,\n shape: ShapeSequence as unknown as SequenceCtor,\n camera: CameraSequence as unknown as SequenceCtor,\n};\n\n// Externally-registered sequence types (e.g. `pixi-effects/three`).\n// tsup splits shared code into common chunks, so every entry point sees this\n// single module instance.\nconst registry: Record<string, SequenceCtor> = {};\n\n/** Register an external sequence type. Later registrations overwrite earlier ones. */\nexport function registerSequenceType(type: string, ctor: SequenceCtor): void {\n registry[type] = ctor;\n}\n\nexport async function buildSequenceTree(\n specs: SequenceSpec[],\n parent: CompositionShape | null,\n root: CompositionShape,\n): Promise<Sequence[]> {\n const out: Sequence[] = [];\n for (const spec of specs) {\n let Cls: SequenceCtor | undefined = staticTypes[spec.type] ?? registry[spec.type];\n if (!Cls && spec.type === 'composition') {\n Cls = (await getCompositionSequence()) as unknown as SequenceCtor;\n }\n if (!Cls) {\n console.warn(`pixi-effects: unknown sequence type \"${(spec as { type: string }).type}\"`);\n continue;\n }\n const seq = new Cls(spec, parent, root);\n await seq.build();\n if (seq.duration === undefined) {\n seq.duration = parent?.duration ?? root.duration;\n }\n out.push(seq);\n }\n return out;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { Sequence, lintTiming, lintText, buildSequenceTree, CameraSequence, describeLayer, cameraBasis, homeCamera, collectPropKeys, projectLayer, DEG } from './chunk-PN5A6QA7.js';
1
+ import { Sequence, lintTiming, lintText, summarizeWarnings, buildSequenceTree, CameraSequence, describeLayer, cameraBasis, homeCamera, collectPropKeys, projectLayer, DEG } from './chunk-ZQX7WIYL.js';
2
2
  import { Container, Rectangle, PerspectiveMesh, Texture, Matrix, RenderTexture } from 'pixi.js';
3
3
 
4
4
  // src/space/camera.ts
@@ -88,9 +88,16 @@ var Layer3D = class {
88
88
  /** Camera-space depth from the last update (larger = farther). */
89
89
  depth = 0;
90
90
  rt = null;
91
+ /**
92
+ * Textures replaced by a bigger / smaller one. Destroying one right away warns "destroyed while still
93
+ * bound": the mesh's bind group still points at it until the next render. They go at the next update,
94
+ * by which time a frame has been drawn with the new texture.
95
+ */
96
+ retired = [];
91
97
  size = null;
92
98
  warnedBehind = false;
93
99
  update(host, basis) {
100
+ this.flushRetired();
94
101
  const target = this.seq.target;
95
102
  if (!target || !target.renderable || !target.visible) return this.hide();
96
103
  const bounds = this.frameOf();
@@ -126,6 +133,11 @@ var Layer3D = class {
126
133
  this.display.destroy();
127
134
  this.rt?.destroy(true);
128
135
  this.rt = null;
136
+ this.flushRetired();
137
+ }
138
+ flushRetired() {
139
+ for (const t of this.retired) t.destroy(true);
140
+ this.retired = [];
129
141
  }
130
142
  hide() {
131
143
  this.display.visible = false;
@@ -148,6 +160,11 @@ var Layer3D = class {
148
160
  }
149
161
  ensureTexture(size) {
150
162
  if (this.rt && this.size === size) return;
163
+ if (this.rt && this.size && this.size.antialias === size.antialias) {
164
+ this.rt.resize(size.w, size.h, size.resolution);
165
+ this.size = size;
166
+ return;
167
+ }
151
168
  const next = RenderTexture.create({
152
169
  width: size.w,
153
170
  height: size.h,
@@ -155,7 +172,7 @@ var Layer3D = class {
155
172
  antialias: size.antialias
156
173
  });
157
174
  this.display.texture = next;
158
- this.rt?.destroy(true);
175
+ if (this.rt) this.retired.push(this.rt);
159
176
  this.rt = next;
160
177
  this.size = size;
161
178
  }
@@ -224,6 +241,18 @@ function lintSequence(spec, warn = defaultWarn) {
224
241
  }
225
242
  }
226
243
 
244
+ // src/core/blend.ts
245
+ var MODES = ["normal", "add", "screen", "multiply"];
246
+ function applyBlendMode(spec, display) {
247
+ const mode = spec.blendMode;
248
+ if (mode === void 0) return;
249
+ if (!MODES.includes(mode)) {
250
+ console.warn(`pixi-effects: ${describeLayer(spec)}: blendMode "${mode}" is not supported (use ${MODES.join(", ")})`);
251
+ return;
252
+ }
253
+ display.blendMode = mode;
254
+ }
255
+
227
256
  // src/sequences/Composition.ts
228
257
  var CompositionSequence = class extends Sequence {
229
258
  _innerContainer = null;
@@ -252,11 +281,13 @@ var CompositionSequence = class extends Sequence {
252
281
  this.intrinsicHeight = height;
253
282
  this._innerContainer = inner;
254
283
  this._compositionShape = { width, height, duration: this.duration };
284
+ const lateKeyframes = [];
255
285
  for (const s of this.spec.sequences ?? []) {
256
286
  lintSequence(s);
257
- lintTiming(s, this.duration);
287
+ lintTiming(s, this.duration, (message, kind) => kind === "late-keyframe" ? lateKeyframes.push(message) : console.warn(message));
258
288
  lintText(s);
259
289
  }
290
+ for (const message of summarizeWarnings(lateKeyframes)) console.warn(message);
260
291
  this._children = await buildSequenceTree(
261
292
  this.spec.sequences ?? [],
262
293
  this._compositionShape,
@@ -274,6 +305,7 @@ var CompositionSequence = class extends Sequence {
274
305
  inner.addChild(layer.display);
275
306
  this._layers3d.push(layer);
276
307
  this._visual.push({ seq: child, layer });
308
+ applyBlendMode(child.spec, layer.display);
277
309
  if (maskSpec) {
278
310
  console.warn(`pixi-effects: ${describeLayer(child.spec)}: mask is not supported on threeD layers yet; ignored`);
279
311
  }
@@ -281,8 +313,10 @@ var CompositionSequence = class extends Sequence {
281
313
  }
282
314
  inner.addChild(child.target);
283
315
  this._visual.push({ seq: child, layer: null });
316
+ applyBlendMode(child.spec, child.target);
284
317
  if (maskSpec) {
285
- const built = await buildSequenceTree([maskSpec], this._compositionShape, this.root);
318
+ const lifetime = maskSpec.at === void 0 ? { at: child.at, duration: maskSpec.duration ?? child.duration } : {};
319
+ const built = await buildSequenceTree([{ ...maskSpec, ...lifetime }], this._compositionShape, this.root);
286
320
  const maskSeq = built[0];
287
321
  if (maskSeq?.target) {
288
322
  inner.addChild(maskSeq.target);
@@ -327,6 +361,10 @@ var CompositionSequence = class extends Sequence {
327
361
  threeD: v.layer !== null
328
362
  }));
329
363
  }
364
+ syncFrame() {
365
+ super.syncFrame();
366
+ for (const child of this._children) child.syncFrame();
367
+ }
330
368
  updateSpace(t, host) {
331
369
  for (const child of this._children) child.updateSpace(t, host);
332
370
  if (this._layers3d.length === 0 || !this._compositionShape) return;
@@ -366,5 +404,5 @@ function frameOf(child) {
366
404
  }
367
405
 
368
406
  export { CompositionSequence };
369
- //# sourceMappingURL=chunk-DIJG2RSF.js.map
370
- //# sourceMappingURL=chunk-DIJG2RSF.js.map
407
+ //# sourceMappingURL=chunk-A574IA4F.js.map
408
+ //# sourceMappingURL=chunk-A574IA4F.js.map