agent-hustle-demo 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +429 -0
  2. package/dist/HustleChat-BC9wvWVA.d.ts +90 -0
  3. package/dist/HustleChat-BcrKkkyn.d.cts +90 -0
  4. package/dist/browser/hustle-react.js +14854 -0
  5. package/dist/browser/hustle-react.js.map +1 -0
  6. package/dist/components/index.cjs +3141 -0
  7. package/dist/components/index.cjs.map +1 -0
  8. package/dist/components/index.d.cts +20 -0
  9. package/dist/components/index.d.ts +20 -0
  10. package/dist/components/index.js +3112 -0
  11. package/dist/components/index.js.map +1 -0
  12. package/dist/hooks/index.cjs +845 -0
  13. package/dist/hooks/index.cjs.map +1 -0
  14. package/dist/hooks/index.d.cts +6 -0
  15. package/dist/hooks/index.d.ts +6 -0
  16. package/dist/hooks/index.js +838 -0
  17. package/dist/hooks/index.js.map +1 -0
  18. package/dist/hustle-Kj0X8qXC.d.cts +193 -0
  19. package/dist/hustle-Kj0X8qXC.d.ts +193 -0
  20. package/dist/index-ChUsRBwL.d.ts +152 -0
  21. package/dist/index-DE1N7C3W.d.cts +152 -0
  22. package/dist/index-DuPFrMZy.d.cts +214 -0
  23. package/dist/index-kFIdHjNw.d.ts +214 -0
  24. package/dist/index.cjs +3746 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +271 -0
  27. package/dist/index.d.ts +271 -0
  28. package/dist/index.js +3697 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/providers/index.cjs +844 -0
  31. package/dist/providers/index.cjs.map +1 -0
  32. package/dist/providers/index.d.cts +5 -0
  33. package/dist/providers/index.d.ts +5 -0
  34. package/dist/providers/index.js +838 -0
  35. package/dist/providers/index.js.map +1 -0
  36. package/package.json +80 -0
  37. package/src/components/AuthStatus.tsx +352 -0
  38. package/src/components/ConnectButton.tsx +421 -0
  39. package/src/components/HustleChat.tsx +1273 -0
  40. package/src/components/MarkdownContent.tsx +431 -0
  41. package/src/components/index.ts +15 -0
  42. package/src/hooks/index.ts +40 -0
  43. package/src/hooks/useEmblemAuth.ts +27 -0
  44. package/src/hooks/useHustle.ts +36 -0
  45. package/src/hooks/usePlugins.ts +135 -0
  46. package/src/index.ts +142 -0
  47. package/src/plugins/index.ts +48 -0
  48. package/src/plugins/migrateFun.ts +211 -0
  49. package/src/plugins/predictionMarket.ts +411 -0
  50. package/src/providers/EmblemAuthProvider.tsx +319 -0
  51. package/src/providers/HustleProvider.tsx +540 -0
  52. package/src/providers/index.ts +6 -0
  53. package/src/styles/index.ts +2 -0
  54. package/src/styles/tokens.ts +447 -0
  55. package/src/types/auth.ts +85 -0
  56. package/src/types/hustle.ts +217 -0
  57. package/src/types/index.ts +49 -0
  58. package/src/types/plugin.ts +180 -0
  59. package/src/utils/index.ts +122 -0
  60. package/src/utils/pluginRegistry.ts +375 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/EmblemAuthProvider.tsx","../src/utils/pluginRegistry.ts","../src/hooks/usePlugins.ts","../src/providers/HustleProvider.tsx","../src/styles/tokens.ts","../src/components/ConnectButton.tsx","../src/components/AuthStatus.tsx","../src/plugins/predictionMarket.ts","../src/plugins/migrateFun.ts","../src/plugins/index.ts","../src/components/MarkdownContent.tsx","../src/components/HustleChat.tsx","../src/utils/index.ts"],"names":["createContext","useState","useRef","useCallback","useEffect","existingSession","EmblemAuthSDK","jsx","useContext","value","useMemo","HustleIncognitoClient","error","jsxs","Fragment","copyToClipboard","hljs","javascript","typescript","python","json","bash","shell","css","xml","markdown","sql","yaml","rust","go","java","cpp","csharp","php","ruby","swift","kotlin","marked","code","styles","containerStyle","truncateAddress","generateId"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,IAAI,iBAAA,GAA0C,IAAA;AAC9C,IAAI,iBAAA,GAAoB,KAAA;AAKxB,IAAM,iBAAA,GAAoBA,oBAAkD,MAAS,CAAA;AAmB9E,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,EAA4B;AAE1B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAA6B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAA2B,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA+B,iBAAiB,CAAA;AAG9E,EAAA,MAAM,WAAA,GAAcC,aAAO,KAAK,CAAA;AAGhC,EAAA,MAAM,GAAA,GAAMC,iBAAA;AAAA,IACV,CAAC,YAAoB,IAAA,KAAoB;AACvC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,MAChD;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAKA,EAAA,MAAM,cAAA,GAAiBA,iBAAA;AAAA,IACrB,OAAO,GAAA,KAAuB;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,YAAA,EAAa;AACpC,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA,GAAA,CAAI,sBAAsB,IAAI,CAAA;AAAA,QAChC;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,+BAA+B,GAAG,CAAA;AAAA,MACxC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAKA,EAAA,MAAM,iBAAA,GAAoBA,iBAAA;AAAA,IACxB,CAAC,YAAyB,GAAA,KAAuB;AAC/C,MAAA,GAAA,CAAI,2BAA2B,UAAU,CAAA;AACzC,MAAA,UAAA,CAAW,UAAU,CAAA;AACrB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,KAAK,cAAc;AAAA,GACtB;AAKA,EAAA,MAAM,eAAA,GAAkBA,iBAAA;AAAA,IACtB,CAAC,GAAA,KAAe;AACd,MAAA,GAAA,CAAI,eAAe,GAAG,CAAA;AACtB,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAKA,EAAA,MAAM,oBAAA,GAAuBA,kBAAY,MAAM;AAC7C,IAAA,GAAA,CAAI,iBAAiB,CAAA;AACrB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,YAAA,CAAa,IAAI,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAKR,EAAAC,eAAA,CAAU,MAAM;AAEd,IAAA,IAAI,WAAA,CAAY,OAAA,IAAW,iBAAA,IAAqB,iBAAA,EAAmB;AACjE,MAAA,IAAI,iBAAA,IAAqB,CAAC,OAAA,EAAS;AACjC,QAAA,UAAA,CAAW,iBAAiB,CAAA;AAE5B,QAAA,MAAMC,gBAAAA,GAAkB,kBAAkB,UAAA,EAAW;AACrD,QAAA,IAAIA,gBAAAA,EAAiB;AACnB,UAAA,iBAAA,CAAkBA,kBAAiB,iBAAiB,CAAA;AAAA,QACtD;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,IAAA,iBAAA,GAAoB,IAAA;AACpB,IAAA,GAAA,CAAI,gCAAgC,KAAK,CAAA;AAGzC,IAAA,MAAM,GAAA,GAAM,IAAIC,2BAAA,CAAc;AAAA,MAC5B,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,CAAC,UAAA,KAAe;AACzB,QAAA,iBAAA,CAAkB,YAA2B,GAAG,CAAA;AAAA,MAClD,CAAA;AAAA,MACA,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,QAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,MACrB;AAAA,KACD,CAAA;AAGD,IAAA,iBAAA,GAAoB,GAAA;AACpB,IAAA,iBAAA,GAAoB,KAAA;AACpB,IAAA,UAAA,CAAW,GAAG,CAAA;AAGd,IAAA,MAAM,eAAA,GAAkB,IAAI,UAAA,EAAW;AACvC,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,MAAA,iBAAA,CAAkB,iBAAgC,GAAG,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,mBAAA,GAAsB,CAAC,cAAA,KAAuC;AAClE,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,UAAA,CAAW,cAAc,CAAA;AACzB,QAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,oBAAA,EAAqB;AAAA,MACvB;AAAA,IACF,CAAA;AAEA,IAAA,GAAA,CAAI,EAAA,CAAG,WAAW,mBAAmB,CAAA;AACrC,IAAA,GAAA,CAAI,EAAA,CAAG,kBAAkB,oBAAoB,CAAA;AAG7C,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,GAAA,CAAI,WAAW,mBAAmB,CAAA;AACtC,MAAA,GAAA,CAAI,GAAA,CAAI,kBAAkB,oBAAoB,CAAA;AAAA,IAChD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAK,iBAAA,EAAmB,eAAA,EAAiB,oBAAA,EAAsB,OAAO,CAAC,CAAA;AAKpG,EAAA,MAAM,aAAA,GAAgBH,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,IAAI,KAAA,CAAM,0BAA0B,CAAC,CAAA;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,oBAAoB,CAAA;AACxB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,aAAA,EAAc;AAAA,IAE9B,SAAS,GAAA,EAAK;AACZ,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,2BAA2B,CAAC,CAAA;AAAA,IAC9E;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,GAAG,CAAC,CAAA;AAKjB,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,GAAA,CAAI,aAAa,CAAA;AACjB,IAAA,OAAA,CAAQ,MAAA,EAAO;AACf,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,OAAA,EAAS,GAAG,CAAC,CAAA;AAKjB,EAAA,MAAM,cAAA,GAAiBA,kBAAY,YAAyC;AAC1E,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,GAAA,CAAI,oBAAoB,CAAA;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,GAAmB,MAAM,OAAA,CAAQ,cAAA,EAAe;AACtD,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,UAAA,CAAW,gBAA+B,CAAA;AAC1C,QAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,QAAA,OAAO,gBAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,8BAA8B,GAAG,CAAA;AACrC,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,2BAA2B,CAAC,CAAA;AAC5E,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,GAAG,CAAC,CAAA;AAGjB,EAAA,MAAM,OAAA,GAAU,OAAA,EAAS,IAAA,EAAM,OAAA,IAAW,IAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,IAAA,EAAM,UAAA,IAAc,IAAA;AAGnD,EAAA,MAAM,KAAA,GAAgC;AAAA;AAAA,IAEpC,OAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA;AAAA,IAGA,OAAA;AAAA,IACA,aAAA;AAAA;AAAA,IAGA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA;AAAA,IAGA;AAAA,GACF;AAEA,EAAA,uBACEI,cAAA,CAAC,iBAAA,CAAkB,QAAA,EAAlB,EAA2B,OACzB,QAAA,EACH,CAAA;AAEJ;AAiBO,SAAS,aAAA,GAAwC;AACtD,EAAA,MAAM,OAAA,GAAUC,iBAAW,iBAAiB,CAAA;AAC5C,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,YAAA,GAAqB;AACnC,EAAA,iBAAA,GAAoB,IAAA;AACpB,EAAA,iBAAA,GAAoB,KAAA;AACtB;;;AC9RA,IAAM,WAAA,GAAc,gBAAA;AAEpB,SAAS,mBAAmB,UAAA,EAA4B;AACtD,EAAA,OAAO,uBAAuB,UAAU,CAAA,CAAA;AAC1C;AAWA,SAAS,kBAAkB,EAAA,EAAqC;AAC9D,EAAA,OAAO,GAAG,QAAA,EAAS;AACrB;AAQA,SAAS,oBAAoB,IAAA,EAA4B;AAIvD,EAAA,IAAI;AAEF,IAAA,OAAO,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACzB,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAE7D,IAAA,OAAO,aAAa,EAAE,KAAA,EAAO,gCAAA,EAAkC,IAAA,EAAK,CAAA;AAAA,EACtE;AACF;AAQA,SAAS,gBAAmD,IAAA,EAAiB;AAC3E,EAAA,IAAI;AAEF,IAAA,OAAO,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACzB,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,GAAG,CAAA;AACzD,IAAA,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,EACjB;AACF;AAKA,SAAS,oBAAA,CACP,OACA,SAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAC1B,GAAG,IAAA;AAAA,IACH,YAAA,EAAc,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,GAC/B,kBAAkB,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,GACtC;AAAA,GACN,CAAE,CAAA;AACJ;AAKA,SAAS,eAAe,KAAA,EAA6D;AACnF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,EAAA,MAAM,aAA8B,EAAC;AAErC,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,UAAA,CAAW,cAAA,GAAiB,iBAAA,CAAkB,KAAA,CAAM,UAAU,CAAA;AAAA,EAChE;AACA,EAAA,IAAI,MAAM,aAAA,EAAe;AACvB,IAAA,UAAA,CAAW,iBAAA,GAAoB,iBAAA,CAAkB,KAAA,CAAM,aAAa,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,MAAM,aAAA,EAAe;AACvB,IAAA,UAAA,CAAW,iBAAA,GAAoB,iBAAA,CAAkB,KAAA,CAAM,aAAa,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,UAAA,CAAW,WAAA,GAAc,iBAAA,CAAkB,KAAA,CAAM,OAAO,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,MAAA;AAC3D;AAOO,SAAS,cAAc,MAAA,EAAsC;AAElE,EAAA,MAAM,YAA0C,EAAC;AAEjD,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI,mBAAA,CAAoB,KAAK,YAAY,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA;AAEJ,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,KAAA,GAAQ,EAAC;AACT,IAAA,IAAI,MAAA,CAAO,UAAU,cAAA,EAAgB;AACnC,MAAA,KAAA,CAAM,UAAA,GAAa,eAAA,CAAgB,MAAA,CAAO,SAAA,CAAU,cAAc,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,iBAAA,EAAmB;AACtC,MAAA,KAAA,CAAM,aAAA,GAAgB,eAAA,CAAgB,MAAA,CAAO,SAAA,CAAU,iBAAiB,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,iBAAA,EAAmB;AACtC,MAAA,KAAA,CAAM,aAAA,GAAgB,eAAA,CAAgB,MAAA,CAAO,SAAA,CAAU,iBAAiB,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,WAAA,EAAa;AAChC,MAAA,KAAA,CAAM,OAAA,GAAU,eAAA,CAAgB,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA;AAAA,IAC9D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,WAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,GAAS,IAAI,SAAA,GAAY,MAAA;AAAA,IAC3D;AAAA,GACF;AACF;AASA,IAAM,iBAAN,MAAqB;AAAA,EAArB,WAAA,GAAA;AACE,IAAA,IAAA,CAAQ,SAAA,uBAAwD,GAAA,EAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAK5D,aAAa,UAAA,EAA+C;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,kBAAY,IAAI,KAAK,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAAwD;AAC9D,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAC/C,MAAA,OAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,EAAC;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAqB,OAAA,EAAgD;AAC3E,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,UAAA,EAAkC;AACzD,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,kBAAA,CAAmB,UAAU,CAAC,CAAA;AAClE,MAAA,OAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,EAAC;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CAAiB,OAAqB,UAAA,EAA0B;AACtE,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,YAAA,CAAa,QAAQ,kBAAA,CAAmB,UAAU,GAAG,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,CAAgB,aAAqB,SAAA,EAA2B;AAC9D,IAAA,MAAM,SAAA,GAAY,KAAK,oBAAA,EAAqB;AAC5C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AAErD,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAChC,GAAG,MAAA;AAAA;AAAA,MAEH,OAAA,EAAS,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,IAAK;AAAA,KACxC,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAA,CAAS,MAAA,EAAsB,OAAA,GAAU,IAAA,EAAM,aAAqB,SAAA,EAAiB;AAEnF,IAAA,MAAM,SAAA,GAAY,KAAK,oBAAA,EAAqB;AAC5C,IAAA,MAAM,QAAA,GAAW,UAAU,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,OAAO,IAAI,CAAA;AAElE,IAAA,MAAM,YAAA,GAA8C;AAAA,MAClD,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,KAAA,EAAO,oBAAA,CAAqB,MAAA,CAAO,KAAA,EAAO,OAAO,SAAS,CAAA;AAAA,MAC1D,SAAA,EAAW,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA;AAAA,MACtC,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACtC;AAEA,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,SAAA,CAAU,QAAQ,CAAA,GAAI,YAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,qBAAqB,SAAS,CAAA;AAGnC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AACrD,IAAA,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,GAAI,OAAA;AAC5B,IAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,UAAU,CAAA;AAE9C,IAAA,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,UAAA,EAAoB,UAAA,GAAqB,SAAA,EAAiB;AAEnE,IAAA,MAAM,SAAA,GAAY,KAAK,oBAAA,EAAqB,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AACjF,IAAA,IAAA,CAAK,qBAAqB,SAAS,CAAA;AAGnC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AACrD,IAAA,OAAO,aAAa,UAAU,CAAA;AAC9B,IAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,UAAU,CAAA;AAE9C,IAAA,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,UAAA,EAAoB,OAAA,EAAkB,UAAA,GAAqB,SAAA,EAAiB;AACrF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AACrD,IAAA,YAAA,CAAa,UAAU,CAAA,GAAI,OAAA;AAC3B,IAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,UAAU,CAAA;AAC9C,IAAA,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAAA,EAA6B;AACxC,IAAA,OAAO,IAAA,CAAK,sBAAqB,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,UAAA,EAAoB,UAAA,GAAqB,SAAA,EAAqC;AACtF,IAAA,OAAO,IAAA,CAAK,gBAAgB,UAAU,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,aAAqB,SAAA,EAA6B;AAClE,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,CAAI,aAAa,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,QAAA,EAAgC,UAAA,GAAqB,SAAA,EAAuB;AACnF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA;AAC9C,IAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,IAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,CAAgB,aAAqB,SAAA,EAAiB;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAC/C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA;AAC9C,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,CAAC,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,aAAqB,SAAA,EAAiB;AAC1C,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,YAAA,CAAa,UAAA,CAAW,kBAAA,CAAmB,UAAU,CAAC,CAAA;AACtD,IAAA,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,YAAA,CAAa,WAAW,WAAW,CAAA;AAAA,EAErC;AACF,CAAA;AAGO,IAAM,cAAA,GAAiB,IAAI,cAAA;;;ACjWlC,SAAS,cAAc,UAAA,EAA4B;AACjD,EAAA,OAAO,kBAAkB,UAAU,CAAA,CAAA;AACrC;AAwCO,SAAS,UAAA,CAAW,aAAqB,SAAA,EAA6B;AAC3E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIP,cAAAA,CAAyB,EAAE,CAAA;AAGzD,EAAAG,gBAAU,MAAM;AAEd,IAAA,UAAA,CAAW,cAAA,CAAe,eAAA,CAAgB,UAAU,CAAC,CAAA;AAGrD,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,QAAA,CAAS,UAAA,EAAY,UAAU,CAAA;AAGlE,IAAA,MAAM,UAAA,GAAa,cAAc,UAAU,CAAA;AAC3C,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB;AACzC,MAAA,IAAI,CAAA,CAAE,QAAQ,UAAA,EAAY;AACxB,QAAA,UAAA,CAAW,cAAA,CAAe,eAAA,CAAgB,UAAU,CAAC,CAAA;AAAA,MACvD;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAEhD,IAAA,OAAO,MAAM;AACX,MAAA,WAAA,EAAY;AACZ,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACrD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,cAAA,GAAiBD,iBAAAA,CAAY,CAAC,MAAA,KAAyB;AAC3D,IAAA,cAAA,CAAe,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AACrD,IAAA,cAAA,CAAe,UAAA,CAAW,MAAM,UAAU,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AACjD,IAAA,cAAA,CAAe,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,UAAU,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,aAAA,GAAgBA,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AAClD,IAAA,cAAA,CAAe,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,UAAU,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAA,MAAM,YAAA,GAAeA,iBAAAA;AAAA,IACnB,CAAC,IAAA,KAAiB,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,IACnD,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,SAAA,GAAYA,iBAAAA;AAAA,IAChB,CAAC,SAAiB,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,OAAO,CAAA;AAAA,IAChE,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAE,IAAI,aAAa,CAAA;AAEvE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;ACtGA,IAAM,aAAA,GAAgBH,oBAA8C,MAAS,CAAA;AAK7E,IAAM,sBAAA,GAAyB,wBAAA;AAM/B,IAAI,eAAA,GAAkB,CAAA;AAKtB,IAAM,oBAAA,uBAA2B,GAAA,EAAY;AAkBtC,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,YAAA,GAAe,sBAAA;AAAA,EACf,KAAA,GAAQ,KAAA;AAAA,EACR,UAAA,EAAY;AACd,CAAA,EAAwB;AAEtB,EAAA,MAAM,CAAC,kBAAkB,CAAA,GAAIC,cAAAA,CAAS,MAAM;AAC1C,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,OAAO,kBAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,CAAA,SAAA,EAAY,EAAE,eAAe,CAAA,CAAA;AAC5C,IAAA,oBAAA,CAAqB,IAAI,MAAM,CAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,iBAAiB,CAAC,kBAAA;AAGxB,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,kBAAkB,oBAAA,CAAqB,IAAA,GAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,aAAa,YAAA,EAAc;AAC5F,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA;AAAA,4CAAA;AAAA,OAGF;AAAA,IACF;AAGA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,oBAAA,CAAqB,OAAO,kBAAkB,CAAA;AAAA,MAChD;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,kBAAkB,CAAC,CAAA;AAGvC,EAAA,MAAM,EAAE,OAAA,EAAS,eAAA,EAAgB,GAAI,aAAA,EAAc;AAGnD,EAAA,MAAM,EAAE,cAAA,EAAe,GAAI,UAAA,CAAW,kBAAkB,CAAA;AAGxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIH,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAAA,CAAkB,EAAE,CAAA;AAGhD,EAAA,MAAM,oBAAA,GAAuBC,YAAAA,iBAAoB,IAAI,GAAA,EAAK,CAAA;AAG1D,EAAA,MAAM,YAAA,GAAe,mBAAmB,kBAAkB,CAAA,CAAA;AAG1D,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAE,eAAe,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,gBAAA,EAAkB,KAAA,EAAM;AACzG,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,YAAY,CAAA;AAChD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,aAAA,EAAe,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,kBAAkB,KAAA,EAAM;AAAA,EACxE,CAAA;AAEA,EAAA,MAAM,kBAAkB,YAAA,EAAa;AAGrC,EAAA,MAAM,CAAC,aAAA,EAAe,qBAAqB,CAAA,GAAID,cAAAA,CAAiB,gBAAgB,aAAa,CAAA;AAC7F,EAAA,MAAM,CAAC,YAAA,EAAc,oBAAoB,CAAA,GAAIA,cAAAA,CAAiB,gBAAgB,YAAY,CAAA;AAC1F,EAAA,MAAM,CAAC,gBAAA,EAAkB,wBAAwB,CAAA,GAAIA,cAAAA,CAAkB,gBAAgB,gBAAgB,CAAA;AAGvG,EAAA,MAAM,YAAA,GAAeE,iBAAAA,CAAY,CAAC,QAAA,KAAyF;AACzH,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,OAAA,CAAQ,YAAA,EAAc,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,CAACM,MAAAA,KAAkB;AACtD,IAAA,qBAAA,CAAsBA,MAAK,CAAA;AAC3B,IAAA,YAAA,CAAa,EAAE,aAAA,EAAeA,MAAAA,EAAO,YAAA,EAAc,kBAAkB,CAAA;AAAA,EACvE,CAAA,EAAG,CAAC,YAAA,EAAc,gBAAA,EAAkB,YAAY,CAAC,CAAA;AAEjD,EAAA,MAAM,eAAA,GAAkBN,iBAAAA,CAAY,CAACM,MAAAA,KAAkB;AACrD,IAAA,oBAAA,CAAqBA,MAAK,CAAA;AAC1B,IAAA,YAAA,CAAa,EAAE,aAAA,EAAe,YAAA,EAAcA,MAAAA,EAAO,kBAAkB,CAAA;AAAA,EACvE,CAAA,EAAG,CAAC,aAAA,EAAe,gBAAA,EAAkB,YAAY,CAAC,CAAA;AAElD,EAAA,MAAM,mBAAA,GAAsBN,iBAAAA,CAAY,CAACM,MAAAA,KAAmB;AAC1D,IAAA,wBAAA,CAAyBA,MAAK,CAAA;AAC9B,IAAA,YAAA,CAAa,EAAE,aAAA,EAAe,YAAA,EAAc,gBAAA,EAAkBA,QAAO,CAAA;AAAA,EACvE,CAAA,EAAG,CAAC,aAAA,EAAe,YAAA,EAAc,YAAY,CAAC,CAAA;AAG9C,EAAA,MAAM,GAAA,GAAMN,iBAAAA;AAAA,IACV,CAAC,YAAoB,IAAA,KAAoB;AACvC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA;AAAA,MAC5C;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAMA,EAAA,MAAM,MAAA,GAASO,cAAQ,MAAM;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,eAAA,EAAiB;AAChC,MAAA,GAAA,CAAI,qCAAqC,CAAA;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,GAAA,CAAI,8CAA8C,CAAA;AAElD,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,IAAIC,qCAAA,CAAsB;AAAA,QAC7C,GAAA,EAAK,OAAA;AAAA;AAAA,QACL,YAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,YAAA,CAAa,EAAA,CAAG,YAAA,EAAc,CAAC,KAAA,KAAmB;AAChD,QAAA,GAAA,CAAI,eAAe,KAAK,CAAA;AAAA,MAC1B,CAAC,CAAA;AAED,MAAA,YAAA,CAAa,EAAA,CAAG,UAAA,EAAY,CAAC,KAAA,KAAmB;AAC9C,QAAA,GAAA,CAAI,aAAa,KAAK,CAAA;AAAA,MACxB,CAAC,CAAA;AAED,MAAA,YAAA,CAAa,EAAA,CAAG,YAAA,EAAc,CAAC,KAAA,KAAmB;AAChD,QAAA,GAAA,CAAI,eAAe,KAAK,CAAA;AAAA,MAC1B,CAAC,CAAA;AAED,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,4BAA4B,GAAG,CAAA;AACnC,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,gCAAgC,CAAC,CAAA;AACjF,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,iBAAiB,YAAA,EAAc,KAAA,EAAO,GAAG,CAAC,CAAA;AAGvD,EAAA,MAAM,UAAU,MAAA,KAAW,IAAA;AAK3B,EAAAP,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,kBAAkB,YAAY;AAElC,MAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,cAAA,CAAe,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AAG5D,MAAA,KAAA,MAAW,IAAA,IAAQ,qBAAqB,OAAA,EAAS;AAC/C,QAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC3B,UAAA,GAAA,CAAI,yBAAyB,IAAI,CAAA;AACjC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,CAAO,MAAM,IAAI,CAAA;AACvB,YAAA,oBAAA,CAAqB,OAAA,CAAQ,OAAO,IAAI,CAAA;AACxC,YAAA,GAAA,CAAI,wBAAwB,IAAI,CAAA;AAAA,UAClC,SAAS,GAAA,EAAK;AACZ,YAAA,GAAA,CAAI,8BAAA,EAAgC,MAAM,GAAG,CAAA;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,QAAA,IAAI,CAAC,oBAAA,CAAqB,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAClD,UAAA,GAAA,CAAI,qBAAA,EAAuB,OAAO,IAAI,CAAA;AACtC,UAAA,IAAI;AAEF,YAAA,IAAI,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,KAAA,EAAO;AAEpC,cAAA,MAAM,OAAO,GAAA,CAAI;AAAA,gBACf,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,SAAS,MAAA,CAAO,OAAA;AAAA,gBAChB,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,WAAW,MAAA,CAAO,SAAA;AAAA,gBAClB,OAAO,MAAA,CAAO;AAAA,eACqB,CAAA;AACrC,cAAA,oBAAA,CAAqB,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAC5C,cAAA,GAAA,CAAI,oBAAA,EAAsB,OAAO,IAAI,CAAA;AAAA,YACvC,CAAA,MAAO;AACL,cAAA,GAAA,CAAI,uDAAA,EAAyD,OAAO,IAAI,CAAA;AAAA,YAC1E;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,GAAA,CAAI,4BAAA,EAA8B,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AAAA,UACpD;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,eAAA,EAAgB;AAAA,EAClB,CAAA,EAAG,CAAC,MAAA,EAAQ,cAAA,EAAgB,GAAG,CAAC,CAAA;AAKhC,EAAA,MAAM,UAAA,GAAaD,kBAAY,YAA8B;AAC3D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,GAAA,CAAI,uCAAuC,CAAA;AAC3C,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,GAAA,CAAI,gBAAgB,CAAA;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,SAAA,EAAU;AACzC,MAAA,SAAA,CAAU,SAAoB,CAAA;AAC9B,MAAA,GAAA,CAAI,gBAAA,EAAkB,UAAU,MAAM,CAAA;AACtC,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,0BAA0B,GAAG,CAAA;AACjC,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,uBAAuB,CAAC,CAAA;AACxE,MAAA,OAAO,EAAC;AAAA,IACV,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAG,CAAC,CAAA;AAKhB,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAU,CAAC,CAAA;AAKvB,EAAA,MAAM,IAAA,GAAOD,iBAAAA;AAAA,IACX,OAAO,OAAA,KAAgD;AACrD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,MACvE;AAEA,MAAA,GAAA,CAAI,eAAA,EAAiB,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAQ,UAAU,CAAA;AACxD,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AAEF,QAAA,MAAM,qBAAA,GAAwB,QAAQ,YAAA,IAAgB,YAAA;AACtD,QAAA,MAAM,qBAAoC,EAAC;AAE3C,QAAA,IAAI,qBAAA,EAAuB;AACzB,UAAA,kBAAA,CAAmB,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,uBAAuB,CAAA;AAAA,QAC5E;AACA,QAAA,kBAAA,CAAmB,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAG3C,QAAA,MAAM,UAAA,GAAsC;AAAA,UAC1C,QAAA,EAAU,kBAAA;AAAA,UACV,aAAA,EAAe;AAAA,SACjB;AAEA,QAAA,IAAI,OAAA,CAAQ,SAAS,aAAA,EAAe;AAClC,UAAA,UAAA,CAAW,KAAA,GAAQ,QAAQ,KAAA,IAAS,aAAA;AAAA,QACtC;AACA,QAAA,IAAI,OAAA,CAAQ,wBAAwB,gBAAA,EAAkB;AACpD,UAAA,UAAA,CAAW,oBAAA,GAAuB,IAAA;AAAA,QACpC;AACA,QAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,UAAA,UAAA,CAAW,cAAc,OAAA,CAAQ,WAAA;AAAA,QACnC;AAGA,QAAA,MAAM,QAAA,GAAW,MAAO,MAAA,CAAoF,IAAA,CAAK,UAAU,CAAA;AAC3H,QAAA,GAAA,CAAI,wBAAwB,CAAA;AAC5B,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,eAAe,GAAG,CAAA;AACtB,QAAA,MAAMS,SAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,qBAAqB,CAAA;AAC1E,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,MAAMA,MAAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,aAAA,EAAe,YAAA,EAAc,kBAAkB,GAAG;AAAA,GAC7D;AAKA,EAAA,MAAM,cAAA,GAAiBT,iBAAAA;AAAA,IACrB,CAAC,OAAA,KAAuD;AACtD,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,QAAA,OAAO;AAAA,UACL,CAAC,MAAA,CAAO,aAAa,GAAG,mBAAmB;AACzC,YAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,EAAE,OAAA,EAAS,uDAAsD,EAAE;AAAA,UACnG;AAAA,SACF;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,sBAAA,EAAwB,OAAA,CAAQ,QAAA,CAAS,MAAA,EAAQ,UAAU,CAAA;AAC/D,MAAA,QAAA,CAAS,IAAI,CAAA;AAGb,MAAA,MAAM,qBAAA,GAAwB,QAAQ,YAAA,IAAgB,YAAA;AACtD,MAAA,MAAM,qBAAoC,EAAC;AAE3C,MAAA,IAAI,qBAAA,EAAuB;AACzB,QAAA,kBAAA,CAAmB,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,uBAAuB,CAAA;AAAA,MAC5E;AACA,MAAA,kBAAA,CAAmB,IAAA,CAAK,GAAG,OAAA,CAAQ,QAAQ,CAAA;AAG3C,MAAA,MAAM,UAAA,GAAsC;AAAA,QAC1C,QAAA,EAAU,kBAAA;AAAA,QACV,aAAA,EAAe,QAAQ,aAAA,IAAiB;AAAA,OAC1C;AAEA,MAAA,IAAI,OAAA,CAAQ,SAAS,aAAA,EAAe;AAClC,QAAA,UAAA,CAAW,KAAA,GAAQ,QAAQ,KAAA,IAAS,aAAA;AAAA,MACtC;AACA,MAAA,IAAI,OAAA,CAAQ,wBAAwB,gBAAA,EAAkB;AACpD,QAAA,UAAA,CAAW,oBAAA,GAAuB,IAAA;AAAA,MACpC;AACA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,UAAA,CAAW,cAAc,OAAA,CAAQ,WAAA;AAAA,MACnC;AAGA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,UAAgE,CAAA;AAGjG,MAAA,OAAO;AAAA,QACL,CAAC,MAAA,CAAO,aAAa,GAAG,mBAAmB;AACzC,UAAA,IAAI;AACF,YAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAEhC,cAAA,MAAM,UAAA,GAAa,KAAA;AAEnB,cAAA,IAAI,UAAA,CAAW,SAAS,MAAA,EAAQ;AAC9B,gBAAA,MAAM,YAAY,UAAA,CAAW,KAAA;AAC7B,gBAAA,GAAA,CAAI,oBAAA,EAAsB,SAAA,EAAW,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA;AACrD,gBAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU;AAAA,cACzC,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,KAAS,WAAA,EAAa;AAC1C,gBAAA,GAAA,CAAI,mBAAA,EAAqB,WAAW,KAAK,CAAA;AACzC,gBAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,cACrD,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,KAAS,aAAA,EAAe;AAC5C,gBAAA,GAAA,CAAI,oBAAoB,CAAA;AACxB,gBAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,cACvD,CAAA,MAAA,IAAW,UAAA,CAAW,IAAA,KAAS,OAAA,EAAS;AACtC,gBAAA,MAAM,aAAa,UAAA,CAAW,KAAA;AAC9B,gBAAA,GAAA,CAAI,iBAAiB,UAAU,CAAA;AAC/B,gBAAA,QAAA,CAAS,IAAI,KAAA,CAAM,UAAA,EAAY,OAAA,IAAW,cAAc,CAAC,CAAA;AACzD,gBAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAY,OAAA,IAAW,cAAA,EAAe,EAAE;AAAA,cACnF,CAAA,MAAO;AAEL,gBAAA,MAAM,KAAA;AAAA,cACR;AAAA,YACF;AAAA,UACF,SAAS,GAAA,EAAK;AACZ,YAAA,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACxB,YAAA,MAAMS,SAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,eAAe,CAAA;AACpE,YAAA,QAAA,CAASA,MAAK,CAAA;AACd,YAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,EAAE,OAAA,EAASA,MAAAA,CAAM,SAAQ,EAAE;AAAA,UAC3D;AAAA,QACF;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,aAAA,EAAe,YAAA,EAAc,kBAAkB,GAAG;AAAA,GAC7D;AAKA,EAAA,MAAM,UAAA,GAAaT,iBAAAA;AAAA,IACjB,OAAO,IAAA,KAAoC;AACzC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,MACvE;AAEA,MAAA,GAAA,CAAI,iBAAA,EAAmB,KAAK,IAAI,CAAA;AAChC,MAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAC/C,QAAA,GAAA,CAAI,kBAAkB,UAAU,CAAA;AAChC,QAAA,OAAO,UAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,iBAAiB,GAAG,CAAA;AACxB,QAAA,MAAMS,SAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,oBAAoB,CAAA;AACzE,QAAA,QAAA,CAASA,MAAK,CAAA;AACd,QAAA,MAAMA,MAAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,GAAG;AAAA,GACd;AAGA,EAAA,MAAM,KAAA,GAA4B;AAAA;AAAA,IAEhC,UAAA,EAAY,kBAAA;AAAA;AAAA,IAGZ,OAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA;AAAA,IAGA,MAAA;AAAA;AAAA,IAGA,IAAA;AAAA,IACA,UAAA,EAAY,cAAA;AAAA;AAAA,IAGZ,UAAA;AAAA;AAAA,IAGA,UAAA;AAAA;AAAA,IAGA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEL,cAAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OACrB,QAAA,EACH,CAAA;AAEJ;AAmBO,SAAS,SAAA,GAAgC;AAC9C,EAAA,MAAM,OAAA,GAAUC,iBAAW,aAAa,CAAA;AACxC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,oFAAoF,CAAA;AAAA,EACtG;AACA,EAAA,OAAO,OAAA;AACT;;;ACzgBA,IAAM,QAAA,GAAW;AAAA,EACf,MAAA,EAAQ;AAAA;AAAA,IAEN,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,UAAA,EAAY,SAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,SAAA,EAAW,oBAAA;AAAA;AAAA,IAGX,aAAA,EAAe,SAAA;AAAA,IACf,eAAA,EAAiB,MAAA;AAAA,IACjB,WAAA,EAAa,MAAA;AAAA;AAAA,IAGb,WAAA,EAAa,SAAA;AAAA,IACb,aAAA,EAAe,SAAA;AAAA,IACf,YAAA,EAAc,SAAA;AAAA,IACd,WAAA,EAAa,MAAA;AAAA;AAAA,IAGb,aAAA,EAAe,SAAA;AAAA,IACf,kBAAA,EAAoB,SAAA;AAAA,IACpB,eAAA,EAAiB,yBAAA;AAAA;AAAA,IAGjB,aAAA,EAAe,SAAA;AAAA,IACf,kBAAA,EAAoB,SAAA;AAAA,IACpB,eAAA,EAAiB,yBAAA;AAAA;AAAA,IAGjB,aAAA,EAAe,SAAA;AAAA,IACf,eAAA,EAAiB,yBAAA;AAAA;AAAA,IAGjB,WAAA,EAAa,SAAA;AAAA,IACb,gBAAA,EAAkB,SAAA;AAAA,IAClB,aAAA,EAAe,wBAAA;AAAA;AAAA,IAGf,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc;AAAA,GAChB;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,mEAAA;AAAA,IACZ,cAAA,EAAgB,8BAAA;AAAA,IAChB,UAAA,EAAY,MAAA;AAAA,IACZ,UAAA,EAAY,MAAA;AAAA,IACZ,UAAA,EAAY,MAAA;AAAA,IACZ,UAAA,EAAY,MAAA;AAAA,IACZ,UAAA,EAAY,MAAA;AAAA,IACZ,gBAAA,EAAkB,KAAA;AAAA,IAClB,gBAAA,EAAkB,KAAA;AAAA,IAClB,kBAAA,EAAoB,KAAA;AAAA,IACpB,eAAA,EAAiB,KAAA;AAAA,IACjB,gBAAA,EAAkB,KAAA;AAAA,IAClB,iBAAA,EAAmB;AAAA,GACrB;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,GAAA,EAAK;AAAA,GACP;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,KAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,2BAAA;AAAA,IACJ,EAAA,EAAI,4BAAA;AAAA,IACJ,EAAA,EAAI,4BAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,yBAAA;AAAA,IACT,OAAA,EAAS,yBAAA;AAAA,IACT,KAAA,EAAO,wBAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,KAAA;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,MAAA;AAAA,IACZ,mBAAA,EAAqB;AAAA;AAEzB,CAAA;AAKA,SAAS,SAAA,CAAU,UAAkB,GAAA,EAAqB;AAExD,EAAA,MAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,KAAK,EAAE,WAAA,EAAY;AACzD,EAAA,OAAO,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AACtC;AAKA,SAAS,oBAAA,GAA+B;AACtC,EAAA,MAAM,KAAA,GAAkB,CAAC,SAAS,CAAA;AAGlC,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,OAAA,EAAS,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACtD;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AAC9D,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,MAAA,EAAQ,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACrD;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3D,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,OAAA,EAAS,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACtD;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,QAAA,EAAU,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACvD;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3D,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,QAAA,EAAU,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACvD;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AACzD,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,MAAA,EAAQ,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EACrD;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAC/D,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,YAAA,EAAc,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3D;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1D,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,SAAA,CAAU,GAAA,EAAK,GAAG,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,EAClD;AAEA,EAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAM4B,oBAAA;AAK5B,SAAS,iBAAA,GAAoB;AAC3B,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AACjE,IAAA,MAAA,CAAO,GAAG,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,SAAS,GAAG,CAAC,KAAK,YAAY,CAAA,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,sBAAA,GAAyB;AAChC,EAAA,MAAM,SAA0C,EAAC;AACjD,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAA,EAAG;AACrE,IAAA,MAAA,CAAO,GAAG,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,QAAQ,GAAG,CAAC,KAAK,YAAY,CAAA,CAAA,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAA;AAeT;AAEA,SAAS,mBAAA,GAAsB;AAC7B,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAClE,IAAA,MAAA,CAAO,GAAG,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,SAAS,GAAG,CAAC,KAAK,YAAY,CAAA,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAA,GAAqB;AAC5B,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AACjE,IAAA,MAAA,CAAO,GAAG,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,UAAU,GAAG,CAAC,KAAK,YAAY,CAAA,CAAA,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAA,GAAqB;AAC5B,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAClE,IAAA,MAAA,CAAO,GAAG,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,UAAU,GAAG,CAAC,KAAK,YAAY,CAAA,CAAA,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,gBAAA,GAAmB;AAC1B,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAChE,IAAA,MAAA,CAAO,GAAG,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,QAAQ,GAAG,CAAC,KAAK,YAAY,CAAA,CAAA,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,sBAAA,GAAyB;AAChC,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACtE,IAAA,MAAA,CAAO,GAAG,IAAI,CAAA,IAAA,EAAO,SAAA,CAAU,cAAc,GAAG,CAAC,KAAK,YAAY,CAAA,CAAA,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAA,GAAqB;AAC5B,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAGjE,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,QAAA,CAAS,YAAA,EAAc,EAAE,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,MAAA;AACT;AAKO,IAAM,MAAA,GAAS;AAAA,EACpB,QAAQ,iBAAA,EAAkB;AAAA,EAC1B,YAAY,sBAAA,EAAuB;AAAA,EACnC,SAAS,mBAAA,EAAoB;AAAA,EAC7B,QAAQ,kBAAA,EAAmB;AAAA,EAC3B,SAAS,kBAAA,EAAmB;AAAA,EAC5B,OAAO,gBAAA,EAAiB;AAAA,EACxB,aAAa,sBAAA,EAAuB;AAAA,EACpC,QAAQ,kBAAA;AACV,CAAA;AAmDO,IAAM,OAAA,GAAU;AAAA,EACrB,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,IAC9B,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,OAAO,MAAA,CAAO,WAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IAChD,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,GAC9B;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAElD,UAAA,EAAY,CAAA,aAAA,EAAgB,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAAA,GACvD;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,GAAA,EAAK,OAAO,OAAA,CAAQ,EAAA;AAAA,IACpB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,IAC5C,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,UAAA,EAAY,OAAO,MAAA,CAAO,aAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,GAC7B;AAAA,EAEA,eAAA,EAAiB;AAAA,IACf,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,GAC7B;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA;AAAA,IAET,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,OAAO,UAAA,CAAW,cAAA;AAAA,IAC9B,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,GAC9B;AAAA,EAEA,KAAA,EAAO;AAAA,IAEL,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA;AAEjC,CAAA;AAUO,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAWC,QAAA,CAAS,OAAO,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAI/B,QAAA,CAAS,OAAO,aAAa,CAAA;AAAA;AAAA;AAAA,CAAA;ACjZxD,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,EAAA,SAAW,OAAA,IAAW,EAAA;AACvD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AACtD;AAKA,eAAe,gBAAgB,IAAA,EAAgC;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,IAAM,MAAA,GAAS;AAAA,EACb,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,GAAG,OAAA,CAAQ,MAAA;AAAA,IACX,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,GACpD;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,GAC7B;AAAA,EAEA,iBAAA,EAAmB;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,CAAO,OAAA;AAAA,IAC1B,WAAA,EAAa,OAAO,MAAA,CAAO;AAAA,GAC7B;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,WAAA,EAAa,OAAO,MAAA,CAAO,aAAA;AAAA,IAC3B,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,GAC9B;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,UAAA,EAAY,OAAO,MAAA,CAAO;AAAA,GAC5B;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,OAAO,MAAA,CAAO,eAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,MAAA,EAAQ;AAAA,GACV;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,OAAO,MAAA,CAAO,eAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,MAAA,EAAQ,aAAA;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,GAC9B;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,wBAAA;AAAA,IACR,cAAA,EAAgB,aAAA;AAAA,IAChB,YAAA,EAAc,OAAO,MAAA,CAAO,IAAA;AAAA,IAC5B,SAAA,EAAW;AAAA,GACb;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,GAAG,OAAA,CAAQ,IAAA;AAAA,IACX,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,UAAA,EAAY,OAAO,OAAA,CAAQ;AAAA,GAC7B;AAAA;AAAA,EAGA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAAA,GAC9C;AAAA,EAEA,kBAAA,EAAoB;AAAA,IAClB,WAAA,EAAa,OAAO,MAAA,CAAO,WAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,GAAA,EAAK,MAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,SAAA,EAAW,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC1B,UAAA,EAAY,OAAO,MAAA,CAAO,SAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IAChD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,QAAA,EAAU,OAAA;AAAA,IACV,MAAA,EAAQ,OAAO,MAAA,CAAO,QAAA;AAAA,IACtB,SAAA,EAAW,CAAA,sCAAA,EAAyC,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA;AAAA,GACnF;AAAA,EAEA,cAAA,EAAgB;AAAA,IACd,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,kBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,aAAA,EAAe,OAAA;AAAA,IACf,YAAA,EAAc,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC7B,aAAA,EAAe;AAAA,GACjB;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EAEA,gBAAA,EAAkB;AAAA,IAChB,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,IAAA,EAAM;AAAA,GACR;AAAA,EAEA,iBAAA,EAAmB;AAAA,IACjB,GAAG,OAAA,CAAQ,IAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,IAC5C,UAAA,EAAY;AAAA,GACd;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAY,OAAO,MAAA,CAAO,OAAA;AAAA,IAC1B,WAAA,EAAa,OAAO,MAAA,CAAO,aAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,UAAA,EAAY,OAAO,MAAA,CAAO,aAAA;AAAA,IAC1B,WAAA,EAAa,OAAO,MAAA,CAAO,aAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA;AAEzB,CAAA;AAMO,SAAS,aAAA,CAAc;AAAA,EAC5B,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,YAAA,GAAe,SAAA;AAAA,EACf,YAAA,GAAe,eAAA;AAAA,EACf,SAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA,GAAgB,IAAA;AAAA,EAChB,QAAA,GAAW;AACb,CAAA,EAAuB;AACrB,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,MACE,aAAA,EAAc;AAElB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIP,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAElE,EAAA,MAAM,WAAA,GAAcE,kBAAY,YAAY;AAC1C,IAAA,IAAI,QAAA,EAAU;AAEd,IAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,SAAA,EAAW;AAClC,MAAA,MAAM,aAAA,EAAc;AACpB,MAAA,SAAA,IAAY;AAAA,IACd;AAAA,EAEF,GAAG,CAAC,QAAA,EAAU,iBAAiB,SAAA,EAAW,aAAA,EAAe,SAAS,CAAC,CAAA;AAEnE,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,MAAM;AACzC,IAAA,MAAA,EAAO;AACP,IAAA,YAAA,IAAe;AACf,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEzB,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,OAAO,KAAA,EAAe,KAAA,KAAkB;AACrE,IAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,KAAK,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,UAAA,CAAW,MAAM,cAAA,CAAe,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,IAAI,WAAA,GAAmC,EAAE,GAAG,MAAA,CAAO,MAAA,EAAO;AAC1D,EAAA,IAAI,OAAA,GAA2B,YAAA;AAE/B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,OAAO,YAAA,EAAc,GAAG,OAAO,QAAA,EAAS;AAAA,EAC7E,WAAW,SAAA,EAAW;AACpB,IAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,OAAO,YAAA,EAAc,GAAG,OAAO,OAAA,EAAQ;AAC1E,IAAA,OAAA,mBACEU,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAP,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,MAC5B;AAAA,KAAA,EACH,CAAA;AAAA,EAEJ,WAAW,eAAA,EAAiB;AAC1B,IAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,OAAO,SAAA,EAAU;AACpD,IAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,MAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,OAAO,cAAA,EAAe;AAAA,IAC3D;AACA,IAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,aAAA,IAAiB,EAAE,CAAA;AAErD,IAAA,OAAA,mBACEM,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAP,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,OAAO,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC5BA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,sBACfA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,KAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC1BA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,SAAU,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACxCA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,OAAO,QAAA,EAAA,QAAA,EAAC;AAAA,KAAA,EAC9B,CAAA;AAAA,EAEJ,CAAA,MAAO;AACL,IAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,OAAO,YAAA,EAAa;AACvD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,OAAO,iBAAA,EAAkB;AAAA,IAC9D;AACA,IAAA,OAAA,mBACEM,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAP,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,MAAM,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,MAC1B;AAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,WAAA,GAAc,EAAE,GAAG,WAAA,EAAa,GAAG,KAAA,EAAM;AAAA,EAC3C;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,EAAe,KAAA,KAAkB;AACtD,IAAA,MAAM,WAAW,WAAA,KAAgB,KAAA;AACjC,IAAA,MAAM,UAAU,WAAA,KAAgB,KAAA;AAChC,IAAA,uBACEA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,UAAA,CAAW,OAAO,KAAK,CAAA;AAAA,QAAG,CAAA;AAAA,QACjE,KAAA,EAAO;AAAA,UACL,GAAG,MAAA,CAAO,OAAA;AAAA,UACV,GAAI,QAAA,GAAW,MAAA,CAAO,gBAAgB,OAAA,GAAU,MAAA,CAAO,eAAe;AAAC,SACzE;AAAA,QACA,YAAA,EAAc,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,QACxC,YAAA,EAAc,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,QAEtC,qBAAW,SAAA,GAAY;AAAA;AAAA,KAC1B;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEM,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,cAAAA,CAAC,WAAO,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,oBACnBM,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,OAAO,MAAA,CAAO,OAAA;AAAA,QACd,YAAA,EAAc,MAAM,eAAA,IAAmB,aAAA,IAAiB,gBAAgB,IAAI,CAAA;AAAA,QAC5E,YAAA,EAAc,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,QAGzC,QAAA,EAAA;AAAA,0BAAAN,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,WAAA;AAAA,cACT,UAAU,QAAA,IAAY,SAAA;AAAA,cACtB,SAAA;AAAA,cACA,KAAA,EAAO,WAAA;AAAA,cACP,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,cACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,cAErC,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UAGC,mCACCA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,gBAAA;AAAA,cACT,KAAA,EAAO;AAAA,gBACL,GAAG,MAAA,CAAO,aAAA;AAAA,gBACV,GAAI,iBAAA,GAAoB,MAAA,CAAO,kBAAA,GAAqB;AAAC,eACvD;AAAA,cACA,YAAA,EAAc,MAAM,oBAAA,CAAqB,IAAI,CAAA;AAAA,cAC7C,YAAA,EAAc,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,cAC9C,KAAA,EAAM,YAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,UAID,mBAAmB,aAAA,IAAiB,YAAA,oCAClC,KAAA,EAAA,EAAI,KAAA,EAAO,OAAO,QAAA,EACjB,QAAA,EAAA;AAAA,4BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,gBAAgB,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,4BAGpDM,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,WAAA,EACjB,QAAA,EAAA;AAAA,8BAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,eAAe,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,8BAC3CM,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,gBAAA,EACjB,QAAA,EAAA;AAAA,gCAAAA,eAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,aAAA,EAAe,QAAA,EAAA;AAAA,kBAAA,GAAA;AAAA,kBAAE;AAAA,iBAAA,EAAQ,CAAA;AAAA,gBAC5C,aAAA,CAAc,SAAA,EAAW,OAAA,IAAW,EAAE;AAAA,eAAA,EACzC;AAAA,aAAA,EACF,CAAA;AAAA,4BAGAA,eAAA,CAAC,SAAI,KAAA,EAAO,EAAE,GAAG,MAAA,CAAO,WAAA,EAAa,YAAA,EAAc,CAAA,EAAE,EACnD,QAAA,EAAA;AAAA,8BAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,MAAA,CAAO,eAAe,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,8BACnDM,eAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,gBAAA,EACjB,QAAA,EAAA;AAAA,gCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,MAAA,CAAO,aAAA,EAAe,GAAG,MAAA,CAAO,iBAAA,EAAkB,EACjE,QAAA,EAAA,aAAA,EACH,CAAA;AAAA,gBACC,aAAA,CAAc,QAAA,EAAU,aAAA,IAAiB,EAAE;AAAA,eAAA,EAC9C;AAAA,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;ACnYA,eAAeQ,iBAAgB,IAAA,EAAgC;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,IAAM,CAAA,GAAI;AAAA,EACR,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,UAAA;AAAA,IACV,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ,EAAA;AAAA,IACpB,UAAA,EAAY,OAAO,UAAA,CAAW;AAAA,GAChC;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ,EAAA;AAAA,IACpB,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,GAC9B;AAAA,EACA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,YAAA,EAAc,OAAO,MAAA,CAAO,IAAA;AAAA,IAC5B,eAAA,EAAiB,OAAO,MAAA,CAAO;AAAA,GACjC;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,eAAA,EAAiB,OAAO,MAAA,CAAO;AAAA,GACjC;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IAChD,cAAA,EAAgB,aAAA;AAAA,IAChB,YAAA,EAAc,OAAO,MAAA,CAAO,IAAA;AAAA,IAC5B,SAAA,EAAW;AAAA,GACb;AAAA,EACA,SAAA,EAAW;AAAA,IACT,GAAG,OAAA,CAAQ,UAAA;AAAA,IACX,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,UAAA,EAAY,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA;AAAA,GAC9C;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,WAAA,EAAa,OAAO,MAAA,CAAO,WAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,UAAA;AAAA,IACV,GAAA,EAAK,MAAA;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,SAAA,EAAW,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC1B,UAAA,EAAY,OAAO,MAAA,CAAO,WAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IAChD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,QAAA,EAAU,OAAA;AAAA,IACV,MAAA,EAAQ,OAAO,MAAA,CAAO,QAAA;AAAA,IACtB,SAAA,EAAW,OAAO,OAAA,CAAQ;AAAA,GAC5B;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,kBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,aAAA,EAAe,OAAA;AAAA,IACf,YAAA,EAAc,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC7B,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,IAAA,EAAM;AAAA,GACR;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,GAAG,OAAA,CAAQ,IAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,IAC5C,UAAA,EAAY;AAAA,GACd;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,UAAA,EAAY,OAAO,MAAA,CAAO,OAAA;AAAA,IAC1B,WAAA,EAAa,OAAO,MAAA,CAAO,aAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,aAAA,EAAe;AAAA,IACb,UAAA,EAAY,OAAO,MAAA,CAAO,aAAA;AAAA,IAC1B,WAAA,EAAa,OAAO,MAAA,CAAO,aAAA;AAAA,IAC3B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA;AAEzB,CAAA;AAKO,SAAS,UAAA,CAAW;AAAA,EACzB,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,UAAA,GAAa;AACf,CAAA,EAAoB;AAClB,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,MACE,aAAA,EAAc;AAElB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAElE,EAAA,MAAM,UAAA,GAAaE,iBAAAA,CAAY,OAAO,KAAA,EAAe,KAAA,KAAkB;AACrE,IAAA,MAAM,OAAA,GAAU,MAAMY,gBAAAA,CAAgB,KAAK,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,UAAA,CAAW,MAAM,cAAA,CAAe,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBACEF,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAP,cAAAA,CAAC,WAAO,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,wBACnBM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,CAAA,CAAE,YAAA,EAAc,GAAG,KAAA,EAAM,EAC9D,QAAA,EAAA;AAAA,0BAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,0BACxBA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,eAAA,EAAa;AAAA,SAAA,EACrB;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,CAAA,CAAE,YAAA,EAAc,GAAG,KAAA,EAAM,EAC9D,QAAA,EAAA;AAAA,sBAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,GAAA,EAAK,CAAA;AAAA,sBACpBA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,eAAA,EAAa;AAAA,KAAA,EACrB,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEM,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,cAAAA,CAAC,WAAO,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,oBACnBM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,CAAA,CAAE,SAAA,EAAW,GAAG,KAAA,EAAM,EAE3D,QAAA,EAAA;AAAA,sBAAAA,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAO,CAAA,CAAE,gBAAA;AAAA,UACT,YAAA,EAAc,MAAM,aAAA,IAAiB,YAAA,CAAa,IAAI,CAAA;AAAA,UACtD,YAAA,EAAc,MAAM,aAAA,IAAiB,YAAA,CAAa,KAAK,CAAA;AAAA,UAGvD,QAAA,EAAA;AAAA,4BAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,CAAA,CAAE,GAAA,EAAK,GAAG,CAAA,CAAE,YAAA,EAAa,EAAG,KAAA,EAAM,WAAA,EAAY,CAAA;AAAA,YAG/D,iBAAiB,SAAA,oBAChBM,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EACZ,QAAA,EAAA;AAAA,8BAAAN,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,iBAAiB,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,8BAGhDM,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EACZ,QAAA,EAAA;AAAA,gCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,YAAY,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,gCACnCM,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,aAAA,EACZ,QAAA,EAAA;AAAA,kCAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,UAAA,EAAY,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,oBAAE;AAAA,mBAAA,EAAQ,CAAA;AAAA,kCACrCN,cAAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAM,SAAA;AAAA,sBACN,OAAO,OAAA,IAAW,EAAA;AAAA,sBAClB,WAAA;AAAA,sBACA,WAAA;AAAA,sBACA,cAAA;AAAA,sBACA,MAAA,EAAQ;AAAA;AAAA;AACV,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BAGAM,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EACZ,QAAA,EAAA;AAAA,gCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,YAAY,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,gCAC3CM,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,aAAA,EACZ,QAAA,EAAA;AAAA,kCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,CAAA,CAAE,UAAA,EAAY,GAAG,CAAA,CAAE,cAAA,EAAe,EAAI,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,kCACtEA,cAAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAM,QAAA;AAAA,sBACN,OAAO,aAAA,IAAiB,EAAA;AAAA,sBACxB,WAAA;AAAA,sBACA,WAAA;AAAA,sBACA,cAAA;AAAA,sBACA,MAAA,EAAQ;AAAA;AAAA;AACV,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,cAGC,WAAW,UAAA,oBACVM,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EACZ,QAAA,EAAA;AAAA,gCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,YAAY,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,gCAC5CM,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,aAAA,EACZ,QAAA,EAAA;AAAA,kCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,CAAA,CAAE,UAAA,EAAY,GAAG,CAAA,CAAE,cAAA,EAAe,EAAI,QAAA,EAAA,SAAA,CAAU,UAAA,EAAW,CAAA;AAAA,kCAC7EA,cAAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAM,YAAA;AAAA,sBACN,OAAO,SAAA,CAAU,UAAA;AAAA,sBACjB,WAAA;AAAA,sBACA,WAAA;AAAA,sBACA,cAAA;AAAA,sBACA,MAAA,EAAQ;AAAA;AAAA;AACV,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,cAID,WAAW,aAAA,oBACVM,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,YAAA,EACZ,QAAA,EAAA;AAAA,gCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,CAAA,CAAE,YAAY,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,gCAC/CM,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,aAAA,EACZ,QAAA,EAAA;AAAA,kCAAAN,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,GAAG,CAAA,CAAE,UAAA,EAAY,GAAG,CAAA,CAAE,cAAA,EAAe,EAAI,QAAA,EAAA,SAAA,CAAU,aAAA,EAAc,CAAA;AAAA,kCAChFA,cAAAA;AAAA,oBAAC,UAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAM,YAAA;AAAA,sBACN,OAAO,SAAA,CAAU,aAAA;AAAA,sBACjB,WAAA;AAAA,sBACA,WAAA;AAAA,sBACA,cAAA;AAAA,sBACA,MAAA,EAAQ;AAAA;AAAA;AACV,iBAAA,EACF;AAAA,eAAA,EACF;AAAA,aAAA,EAEJ;AAAA;AAAA;AAAA,OAEJ;AAAA,MAGC,8BACCA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,KAAA,EAAO;AAAA,YACL,GAAG,CAAA,CAAE,SAAA;AAAA,YACL,GAAI,aAAA,GAAgB,CAAA,CAAE,cAAA,GAAiB;AAAC,WAC1C;AAAA,UACA,YAAA,EAAc,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,UACzC,YAAA,EAAc,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,UAC1C,KAAA,EAAM,YAAA;AAAA,UACP,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAYA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,KAAA,EAAO,aAAa,WAAA,EAAa,cAAA,EAAgB,QAAO,EAAoB;AACvG,EAAA,MAAM,WAAW,WAAA,KAAgB,KAAA;AACjC,EAAA,MAAM,YAAY,WAAA,KAAgB,KAAA;AAElC,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,MAAA,CAAO,KAAA,EAAO,KAAK,CAAA;AAAA,MAClC,KAAA,EAAO;AAAA,QACL,GAAG,CAAA,CAAE,OAAA;AAAA,QACL,GAAI,QAAA,GAAW,CAAA,CAAE,gBAAgB,SAAA,GAAY,CAAA,CAAE,eAAe;AAAC,OACjE;AAAA,MACA,YAAA,EAAc,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,MACxC,YAAA,EAAc,MAAM,cAAA,CAAe,IAAI,CAAA;AAAA,MAEtC,qBAAW,SAAA,GAAY;AAAA;AAAA,GAC1B;AAEJ;;;AClUA,IAAM,aAAA,GAAgB,2BAAA;AAiBf,IAAM,sBAAA,GAAuC;AAAA,EAClD,IAAA,EAAM,yBAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,gEAAA;AAAA,EAEb,KAAA,EAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,yBAAA;AAAA,MACN,WAAA,EACE,0HAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,YAAY;AAAC;AACf,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,2BAAA;AAAA,MACN,WAAA,EACE,yLAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,YAAA,EAAc,QAAQ,CAAA;AAAA,YAC7B,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,YACvB,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,2BAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX,SACF;AAAA,QACA,QAAA,EAAU,CAAC,MAAM;AAAA;AACnB,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,oBAAA;AAAA,MACN,WAAA,EACE,+HAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,YAAA,EAAc,QAAQ,CAAA;AAAA,YAC7B,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,aAAa;AAAA;AAC1B,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,WAAA,EACE,sFAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,YAAA,EAAc,QAAQ,CAAA;AAAA,YAC7B,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,aAAa;AAAA;AAC1B,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,mBAAA;AAAA,MACN,WAAA,EAAa,6DAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,QAAA,EAAU;AAAA,YACR,IAAA,EAAM,QAAA;AAAA,YACN,IAAA,EAAM,CAAC,YAAA,EAAc,QAAQ,CAAA;AAAA,YAC7B,WAAA,EAAa;AAAA,WACf;AAAA,UACA,WAAA,EAAa;AAAA,YACX,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,sCAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX,SACF;AAAA,QACA,QAAA,EAAU,CAAC,aAAa;AAAA;AAC1B;AACF,GACF;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,yBAAyB,YAAY;AACnC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW;AAAA,UACT;AAAA,YACE,EAAA,EAAI,YAAA;AAAA,YACJ,IAAA,EAAM,YAAA;AAAA,YACN,WAAA,EAAa,4CAAA;AAAA,YACb,QAAA,EAAU,CAAC,MAAA,EAAQ,kBAAkB;AAAA,WACvC;AAAA,UACA;AAAA,YACE,EAAA,EAAI,QAAA;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,2CAAA;AAAA,YACb,QAAA,EAAU,CAAC,WAAA,EAAa,aAAa;AAAA;AACvC;AACF,OACF;AAAA,IACF,CAAA;AAAA,IAEA,yBAAA,EAA2B,OAAO,IAAA,KAAS;AACzC,MAAA,MAAM,QAAA,GAAY,KAAK,QAAA,IAAyB,YAAA;AAChD,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,MAAA,IAAI,IAAA,CAAK,OAAO,MAAA,CAAO,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAEzD,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,IAAI,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,CAAO,QAAS,IAAA,CAAK,IAAA,CAAkB,IAAA,CAAK,GAAG,CAAC,CAAA;AACtE,QAAA,IAAI,KAAK,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,KAAK,MAAgB,CAAA;AAE9D,QAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,aAAa,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAE,CAAA;AAE5E,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,YAAA;AAAA,UACV,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,MAAgC;AAAA,YAC1D,MAAM,CAAA,CAAE,WAAA;AAAA,YACR,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,QAAQ,CAAA,CAAE,YAAA;AAAA,YACV,MAAM,CAAA,CAAE,IAAA;AAAA,YACR,QAAA,EAAU;AAAA,cACR,EAAE,OAAQ,CAAA,CAAE,MAAA,EAAoC,OAAO,EAAA,EAAK,CAAA,CAAE,QAAoC,EAAA,EAAG;AAAA,cACrG,EAAE,OAAQ,CAAA,CAAE,MAAA,EAAoC,OAAO,EAAA,EAAK,CAAA,CAAE,QAAoC,EAAA;AAAG,aACvG;AAAA,YACA,QAAQ,CAAA,CAAE;AAAA,WACZ,CAAE,KAAK,EAAC;AAAA,UACR,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,KAAA,IAAS,CAAA;AAAA,UACjC,OAAA,EAAS,IAAA,CAAK,UAAA,EAAY,QAAA,IAAY;AAAA,SACxC;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,QAAA,IAAI,KAAK,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,KAAK,MAAgB,CAAA;AAE9D,QAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,aAAa,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AAExE,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,QAAA;AAAA,UACV,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,CAAC,CAAA,MAAgC;AAAA,YAC1D,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,QAAQ,CAAA,CAAE,MAAA;AAAA,YACV,UAAU,CAAA,CAAE,QAAA;AAAA,YACZ,UAAU,CAAA,CAAE,QAAA;AAAA,YACZ,QAAQ,CAAA,CAAE,OAAA;AAAA,YACV,QAAQ,CAAA,CAAE,OAAA;AAAA,YACV,QAAQ,CAAA,CAAE;AAAA,WACZ,CAAE,KAAK,EAAC;AAAA,UACR,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,KAAA,IAAS,CAAA;AAAA,UACjC,OAAA,EAAS,IAAA,CAAK,UAAA,EAAY,QAAA,IAAY;AAAA,SACxC;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,kBAAA,EAAoB,OAAO,IAAA,KAAS;AAClC,MAAA,MAAM,QAAA,GAAY,KAAK,QAAA,IAAyB,YAAA;AAEhD,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,EAAG,aAAa,CAAA,gCAAA,EAAmC,IAAA,CAAK,WAAW,CAAA;AAAA,SACrE;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA;AAE/B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,QACzD;AAEA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,YAAA;AAAA,UACV,MAAM,MAAA,CAAO,WAAA;AAAA,UACb,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,SAAA,EAAW,MAAA,CAAO,UAAA,GACd,IAAI,IAAA,CAAK,OAAO,UAAA,GAAa,GAAI,CAAA,CAAE,WAAA,EAAY,GAC/C,IAAA;AAAA,UACJ,OAAA,EAAS,MAAA,CAAO,QAAA,GACZ,IAAI,IAAA,CAAK,OAAO,QAAA,GAAW,GAAI,CAAA,CAAE,WAAA,EAAY,GAC7C,IAAA;AAAA,UACJ,MAAA,EAAQ;AAAA,YACN,OAAO,MAAA,CAAO,YAAA;AAAA,YACd,MAAM,MAAA,CAAO,aAAA;AAAA,YACb,OAAO,MAAA,CAAO;AAAA,WAChB;AAAA,UACA,kBAAkB,MAAA,CAAO,iBAAA;AAAA,UACzB,QAAA,EAAU;AAAA,YACR,EAAE,OAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA,CAAO,QAAQ,EAAA,EAAG;AAAA,YACrD,EAAE,OAAO,MAAA,CAAO,MAAA,EAAQ,OAAO,EAAA,EAAI,MAAA,CAAO,QAAQ,EAAA;AAAG,WACvD;AAAA,UACA,QAAQ,MAAA,CAAO,YAAA;AAAA,UACf,MAAM,MAAA,CAAO;AAAA,SACf;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,EAAG,aAAa,CAAA,uBAAA,EAA0B,IAAA,CAAK,WAAW,CAAA;AAAA,SAC5D;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA;AAE/B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,QACzD;AAEA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,QAAA;AAAA,UACV,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,QAAQ,MAAA,CAAO,OAAA;AAAA,UACf,QAAQ,MAAA,CAAO,OAAA;AAAA,UACf,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,cAAc,MAAA,CAAO;AAAA,SACvB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,iBAAA,EAAmB,OAAO,IAAA,KAAS;AACjC,MAAA,MAAM,QAAA,GAAY,KAAK,QAAA,IAAyB,YAAA;AAEhD,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,EAAG,aAAa,CAAA,qCAAA,EAAwC,IAAA,CAAK,WAAW,CAAA;AAAA,SAC1E;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,GAAG,IAAA,EAAK;AAAA,MAC3C,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAEhC,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,EAAG,aAAa,CAAA,uBAAA,EAA0B,IAAA,CAAK,WAAW,CAAA;AAAA,SAC5D;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA;AAE/B,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,QACzD;AAEA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,QAAA;AAAA,UACV,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,QAAQ,MAAA,CAAO,OAAA;AAAA,UACf,QAAQ,MAAA,CAAO,OAAA;AAAA,UACf,WAAW,MAAA,CAAO;AAAA,SACpB;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,iBAAA,EAAmB,OAAO,IAAA,KAAS;AACjC,MAAA,MAAM,QAAA,GAAY,KAAK,QAAA,IAAyB,YAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAErC,MAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,QAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,UACjC,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB;AAAA,SACD,CAAA;AAED,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,EAAG,aAAa,CAAA,mBAAA,EAAsB,MAAM,CAAA;AAAA,SAC9C;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,GAAG,IAAA,EAAK;AAAA,MAC3C,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,QAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,UACjC,QAAQ,IAAA,CAAK,WAAA;AAAA,UACb;AAAA,SACD,CAAA;AAED,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACrB,CAAA,EAAG,aAAa,CAAA,eAAA,EAAkB,MAAM,CAAA;AAAA,SAC1C;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E;AAEA,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,GAAG,IAAA,EAAK;AAAA,MACvC;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACrD;AAAA,GACF;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,YAAY,MAAM;AAChB,MAAA,OAAA,CAAQ,IAAI,0EAA0E,CAAA;AAAA,IACxF;AAAA;AAEJ;;;AC9WA,IAAM,EAAA,GAAgB;AAAA,EACpB,EAAE,EAAA,EAAI,sBAAA,EAAwB,QAAA,EAAU,kDAAkD,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mEAAA,CAAA,EAAisB,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAS,SAAA,EAAW,KAAK,CAAA,EAAG,QAAA,EAAU,SAAA,EAAU;AAAA,EACj3B,EAAE,EAAA,EAAI,yBAAA,EAA2B,QAAA,EAAU,0CAA0C,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iFAAA,CAAA,EAAusB,QAAA,EAAU,CAAC,MAAA,EAAQ,SAAA,EAAW,SAAS,SAAA,EAAW,KAAK,CAAA,EAAG,QAAA,EAAU,SAAA,EAAU;AAAA,EACl3B,EAAE,EAAA,EAAI,yBAAA,EAA2B,QAAA,EAAU,mDAAmD,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wFAAA,CAAA,EAAivB,QAAA,EAAU,CAAC,SAAA,EAAW,OAAA,EAAS,WAAW,KAAK,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EAC75B,EAAE,EAAA,EAAI,0BAAA,EAA4B,QAAA,EAAU,wDAAwD,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,8GAAA,CAAA,EAAmkB,QAAA,EAAU,CAAC,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,WAAW,aAAA,EAAe,WAAW,CAAA,EAAG,QAAA,EAAU,gBAAA,EAAiB;AAAA,EAC3xB,EAAE,EAAA,EAAI,yBAAA,EAA2B,QAAA,EAAU,uDAAuD,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;;AAAA,2DAAA,CAAA,EAA8P,QAAA,EAAU,CAAC,OAAA,EAAS,MAAA,EAAQ,WAAW,QAAQ,CAAA,EAAG,UAAU,gBAAA,EAAiB;AAAA,EACrb,EAAE,EAAA,EAAI,oBAAA,EAAsB,QAAA,EAAU,kCAAkC,MAAA,EAAQ,CAAA,oSAAA,CAAA,EAAwS,QAAA,EAAU,CAAC,cAAc,WAAA,EAAa,KAAA,EAAO,WAAW,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EACxc,EAAE,EAAA,EAAI,kBAAA,EAAoB,QAAA,EAAU,6BAAA,EAA+B,QAAQ,CAAA,yJAAA,CAAA,EAA6J,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO,OAAA,EAAS,QAAA,EAAU,QAAQ,SAAS,CAAA,EAAG,UAAU,MAAA,EAAO;AAAA,EAC1T,EAAE,EAAA,EAAI,iBAAA,EAAmB,QAAA,EAAU,iDAAA,EAAmD,QAAQ,CAAA,kEAAA,CAAA,EAAsE,QAAA,EAAU,CAAC,OAAA,EAAS,QAAQ,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA,EAAG,UAAU,MAAA,EAAO;AAAA,EAChP,EAAE,EAAA,EAAI,oBAAA,EAAsB,QAAA,EAAU,mCAAmC,MAAA,EAAQ,CAAA,qGAAA,CAAA,EAAyG,QAAA,EAAU,CAAC,SAAS,MAAA,EAAQ,SAAA,EAAW,WAAW,CAAA,EAAG,UAAU,MAAA,EAAO;AAAA,EAChQ,EAAE,EAAA,EAAI,oBAAA,EAAsB,QAAA,EAAU,kCAAA,EAAoC,QAAQ,CAAA,qMAAA,CAAA,EAAyM,QAAA,EAAU,CAAC,OAAA,EAAS,QAAQ,MAAA,EAAQ,SAAA,EAAW,WAAW,CAAA,EAAG,UAAU,MAAA,EAAO;AAAA,EACzW,EAAE,EAAA,EAAI,YAAA,EAAc,QAAA,EAAU,iCAAiC,MAAA,EAAQ,CAAA;AAAA;AAAA,sEAAA,CAAA,EAAgP,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,YAAY,SAAA,EAAW,MAAM,CAAA,EAAG,QAAA,EAAU,UAAA,EAAW;AAAA,EAC3Y,EAAE,EAAA,EAAI,iBAAA,EAAmB,QAAA,EAAU,0CAA0C,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,6DAAA,CAAA,EAA0b,QAAA,EAAU,CAAC,MAAA,EAAQ,YAAA,EAAc,WAAW,QAAA,EAAU,MAAM,CAAA,EAAG,QAAA,EAAU,iBAAA,EAAkB;AAAA,EAC1mB,EAAE,EAAA,EAAI,qBAAA,EAAuB,QAAA,EAAU,wBAAwB,MAAA,EAAQ,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAAA,CAAA,EAA0lB,QAAA,EAAU,CAAC,MAAA,EAAQ,aAAA,EAAe,SAAS,SAAA,EAAW,UAAU,CAAA,EAAG,QAAA,EAAU,SAAA,EAAU;AAAA,EACxvB,EAAE,EAAA,EAAI,uBAAA,EAAyB,QAAA,EAAU,wDAAA,EAA0D,QAAQ,CAAA,kIAAA,CAAA,EAAsI,QAAA,EAAU,CAAC,KAAA,EAAO,YAAY,UAAA,EAAY,YAAA,EAAc,aAAa,UAAU,CAAA,EAAG,UAAU,OAAA,EAAQ;AAAA,EACrV,EAAE,EAAA,EAAI,eAAA,EAAiB,QAAA,EAAU,8BAA8B,MAAA,EAAQ,CAAA,sFAAA,CAAA,EAA0F,QAAA,EAAU,CAAC,iBAAiB,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EAC3O,EAAE,EAAA,EAAI,SAAA,EAAW,QAAA,EAAU,4BAAA,EAA8B,QAAQ,CAAA,4HAAA,CAAA,EAAgI,QAAA,EAAU,CAAC,SAAA,EAAW,UAAU,MAAA,EAAQ,MAAA,EAAQ,SAAS,UAAU,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EAC5R,EAAE,EAAA,EAAI,mBAAA,EAAqB,QAAA,EAAU,wDAAA,EAA0D,QAAQ,CAAA,4LAAA,CAAA,EAAgM,QAAA,EAAU,CAAC,QAAA,EAAU,WAAW,YAAA,EAAc,WAAA,EAAa,KAAK,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EAC/X,EAAE,EAAA,EAAI,0BAAA,EAA4B,QAAA,EAAU,oDAAoD,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,wEAAA,CAAA,EAAyR,QAAA,EAAU,CAAC,QAAA,EAAU,OAAA,EAAS,UAAU,aAAA,EAAe,QAAQ,CAAA,EAAG,QAAA,EAAU,UAAA,EAAW;AAAA,EACxd,EAAE,EAAA,EAAI,oBAAA,EAAsB,QAAA,EAAU,8BAA8B,MAAA,EAAQ,CAAA;;AAAA,4KAAA,CAAA,EAAkU,QAAA,EAAU,CAAC,UAAA,EAAY,UAAA,EAAY,MAAA,EAAQ,QAAQ,QAAA,EAAU,QAAQ,CAAA,EAAG,QAAA,EAAU,UAAA,EAAW;AAAA,EAC3e,EAAE,EAAA,EAAI,uBAAA,EAAyB,QAAA,EAAU,+DAA+D,MAAA,EAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,4DAAA,CAAA,EAA2jB,QAAA,EAAU,CAAC,aAAA,EAAe,QAAA,EAAU,SAAA,EAAW,UAAU,OAAA,EAAS,SAAS,CAAA,EAAG,QAAA,EAAU,UAAA,EAAW;AAAA,EAC9wB,EAAE,EAAA,EAAI,aAAA,EAAe,QAAA,EAAU,oCAAoC,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,CAAA,EAAoK,QAAA,EAAU,CAAC,KAAA,EAAO,SAAA,EAAW,YAAY,YAAA,EAAc,QAAQ,CAAA,EAAG,QAAA,EAAU,SAAA,EAAU;AAAA,EACrU,EAAE,EAAA,EAAI,gCAAA,EAAkC,QAAA,EAAU,6DAA6D,MAAA,EAAQ,CAAA;AAAA;AAAA,iFAAA,CAAA,EAA2Q,QAAA,EAAU,CAAC,WAAA,EAAa,OAAA,EAAS,eAAe,UAAA,EAAY,SAAS,CAAA,EAAG,QAAA,EAAU,SAAA,EAAU;AAAA,EAC9d,EAAE,EAAA,EAAI,kBAAA,EAAoB,QAAA,EAAU,yDAAyD,MAAA,EAAQ,CAAA,mGAAA,CAAA,EAAuG,QAAA,EAAU,CAAC,YAAY,SAAA,EAAW,aAAA,EAAe,UAAU,CAAA,EAAG,UAAU,iBAAA,EAAkB;AAAA,EACtS,EAAE,EAAA,EAAI,WAAA,EAAa,QAAA,EAAU,kCAAkC,MAAA,EAAQ,CAAA,4FAAA,CAAA,EAAgG,QAAA,EAAU,CAAC,OAAO,oBAAA,EAAsB,OAAA,EAAS,aAAa,CAAA,EAAG,UAAU,iBAAA,EAAkB;AAAA,EACpQ,EAAE,EAAA,EAAI,uBAAA,EAAyB,QAAA,EAAU,mDAAmD,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAAA,CAAA,EAAgb,QAAA,EAAU,CAAC,cAAA,EAAgB,QAAA,EAAU,WAAW,MAAA,EAAQ,SAAS,CAAA,EAAG,QAAA,EAAU,UAAA,EAAW;AAAA,EAC7mB,EAAE,EAAA,EAAI,UAAA,EAAY,QAAA,EAAU,wDAAwD,MAAA,EAAQ,CAAA,kIAAA,CAAA,EAAsI,QAAA,EAAU,CAAC,YAAY,QAAA,EAAU,QAAA,EAAU,cAAc,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EAClT,EAAE,EAAA,EAAI,oBAAA,EAAsB,QAAA,EAAU,2CAA2C,MAAA,EAAQ,CAAA,sGAAA,CAAA,EAA0G,QAAA,EAAU,CAAC,aAAa,WAAA,EAAa,QAAA,EAAU,MAAM,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EAC/Q,EAAE,EAAA,EAAI,iBAAA,EAAmB,QAAA,EAAU,gEAAgE,MAAA,EAAQ,CAAA;AAAA;AAAA,4FAAA,CAAA,EAAuP,QAAA,EAAU,CAAC,UAAA,EAAY,YAAA,EAAc,UAAU,QAAA,EAAU,KAAK,CAAA,EAAG,QAAA,EAAU,YAAA,EAAa;AAAA,EAC1b,EAAE,EAAA,EAAI,kBAAA,EAAoB,QAAA,EAAU,8BAAA,EAAgC,QAAQ,CAAA,0HAAA,CAAA,EAA8H,QAAA,EAAU,CAAC,WAAA,EAAa,UAAU,WAAA,EAAa,QAAA,EAAU,MAAM,CAAA,EAAG,UAAU,gBAAA,EAAiB;AAAA,EACvS,EAAE,EAAA,EAAI,oBAAA,EAAsB,QAAA,EAAU,2CAAA,EAA6C,QAAQ,CAAA,6GAAA,CAAA,EAAiH,QAAA,EAAU,CAAC,eAAA,EAAiB,cAAc,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA,EAAG,UAAU,YAAA,EAAa;AAAA,EAC5S,EAAE,EAAA,EAAI,cAAA,EAAgB,QAAA,EAAU,gDAAA,EAAkD,QAAQ,CAAA,kLAAA,CAAA,EAAsL,QAAA,EAAU,CAAC,SAAA,EAAW,QAAQ,UAAA,EAAY,QAAA,EAAU,SAAS,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EACrW,EAAE,EAAA,EAAI,QAAA,EAAU,QAAA,EAAU,+CAAA,EAAiD,QAAQ,CAAA,kHAAA,CAAA,EAAsH,QAAA,EAAU,CAAC,IAAA,EAAM,YAAY,SAAA,EAAW,KAAA,EAAO,MAAM,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EACrR,EAAE,EAAA,EAAI,WAAA,EAAa,QAAA,EAAU,4BAAA,EAA8B,QAAQ,CAAA,2GAAA,CAAA,EAA+G,QAAA,EAAU,CAAC,QAAA,EAAU,MAAM,QAAA,EAAU,SAAA,EAAW,UAAU,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EACpQ,EAAE,EAAA,EAAI,eAAA,EAAiB,QAAA,EAAU,kDAAkD,MAAA,EAAQ,CAAA,kNAAA,CAAA,EAAsN,QAAA,EAAU,CAAC,UAAU,YAAA,EAAc,QAAA,EAAU,MAAM,CAAA,EAAG,UAAU,YAAA,EAAa;AAAA,EAC9X,EAAE,EAAA,EAAI,iBAAA,EAAmB,QAAA,EAAU,8CAAA,EAAgD,QAAQ,CAAA,mHAAA,CAAA,EAAuH,QAAA,EAAU,CAAC,QAAA,EAAU,SAAS,UAAA,EAAY,KAAA,EAAO,WAAW,CAAA,EAAG,UAAU,OAAA,EAAQ;AAAA,EACnS,EAAE,EAAA,EAAI,cAAA,EAAgB,QAAA,EAAU,qCAAA,EAAuC,QAAQ,CAAA,4GAAA,CAAA,EAAgH,QAAA,EAAU,CAAC,UAAA,EAAY,eAAe,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA,EAAG,UAAU,gBAAA,EAAiB;AAAA,EACzR,EAAE,EAAA,EAAI,YAAA,EAAc,QAAA,EAAU,6BAAA,EAA+B,QAAQ,CAAA,6HAAA,CAAA,EAAiI,QAAA,EAAU,CAAC,IAAA,EAAM,UAAU,WAAA,EAAa,MAAA,EAAQ,SAAS,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EACtR,EAAE,EAAA,EAAI,WAAA,EAAa,QAAA,EAAU,4CAAA,EAA8C,QAAQ,CAAA,mGAAA,CAAA,EAAuG,QAAA,EAAU,CAAC,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EAClQ,EAAE,EAAA,EAAI,gBAAA,EAAkB,QAAA,EAAU,uCAAA,EAAyC,QAAQ,CAAA,kFAAA,CAAA,EAAsF,QAAA,EAAU,CAAC,QAAA,EAAU,WAAW,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EAC5P,EAAE,EAAA,EAAI,iBAAA,EAAmB,QAAA,EAAU,mDAAmD,MAAA,EAAQ,CAAA,+LAAA,CAAA,EAAmM,QAAA,EAAU,CAAC,WAAW,UAAA,EAAY,SAAA,EAAW,MAAM,CAAA,EAAG,UAAU,iBAAA,EAAkB;AAAA,EACnX,EAAE,EAAA,EAAI,qBAAA,EAAuB,QAAA,EAAU,yCAAyC,MAAA,EAAQ,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,wDAAA,CAAA,EAAkgB,QAAA,EAAU,CAAC,cAAA,EAAgB,UAAA,EAAY,UAAU,MAAM,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EACzqB,EAAE,EAAA,EAAI,YAAA,EAAc,QAAA,EAAU,uDAAuD,MAAA,EAAQ,CAAA;AAAA,kEAAA,CAAA,EAA4I,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAA,EAAS,WAAW,UAAU,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EACjT,EAAE,EAAA,EAAI,eAAA,EAAiB,QAAA,EAAU,kCAAA,EAAoC,QAAQ,CAAA,mKAAA,CAAA,EAAuK,QAAA,EAAU,CAAC,UAAA,EAAY,QAAQ,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EAChU,EAAE,EAAA,EAAI,eAAA,EAAiB,QAAA,EAAU,kCAAkC,MAAA,EAAQ,CAAA,2HAAA,CAAA,EAA+H,QAAA,EAAU,CAAC,UAAU,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EAClR,EAAE,EAAA,EAAI,SAAA,EAAW,QAAA,EAAU,mDAAA,EAAqD,QAAQ,CAAA,4EAAA,CAAA,EAAgF,QAAA,EAAU,CAAC,SAAA,EAAW,SAAS,OAAA,EAAS,IAAA,EAAM,WAAW,MAAM,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EAC9P,EAAE,EAAA,EAAI,kBAAA,EAAoB,QAAA,EAAU,wCAAwC,MAAA,EAAQ,CAAA,4EAAA,CAAA,EAAgF,QAAA,EAAU,CAAC,SAAS,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA,EAAG,UAAU,SAAA,EAAU;AAAA,EACvO,EAAE,EAAA,EAAI,OAAA,EAAS,QAAA,EAAU,kCAAA,EAAoC,QAAQ,CAAA,iMAAA,CAAA,EAAqM,QAAA,EAAU,CAAC,MAAA,EAAQ,UAAU,MAAA,EAAQ,SAAA,EAAW,OAAO,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EACzV,EAAE,EAAA,EAAI,0BAAA,EAA4B,QAAA,EAAU,kDAAkD,MAAA,EAAQ,CAAA,4NAAA,CAAA,EAAgO,QAAA,EAAU,CAAC,YAAY,QAAA,EAAU,MAAA,EAAQ,eAAe,CAAA,EAAG,UAAU,OAAA,EAAQ;AAAA,EACnZ,EAAE,EAAA,EAAI,YAAA,EAAc,QAAA,EAAU,oDAAoD,MAAA,EAAQ,CAAA,6IAAA,CAAA,EAAiJ,QAAA,EAAU,CAAC,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA,EAAG,UAAU,UAAA,EAAW;AAAA,EAC1S,EAAE,EAAA,EAAI,qBAAA,EAAuB,QAAA,EAAU,+DAAA,EAAiE,QAAQ,CAAA,uNAAA,CAAA,EAA2N,QAAA,EAAU,CAAC,QAAA,EAAU,QAAQ,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA,EAAG,UAAU,YAAA,EAAa;AAAA,EAC3Z,EAAE,EAAA,EAAI,kBAAA,EAAoB,QAAA,EAAU,kDAAkD,MAAA,EAAQ,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,CAAA,EAA4f,QAAA,EAAU,CAAC,UAAA,EAAY,KAAA,EAAO,QAAQ,SAAA,EAAW,aAAa,CAAA,EAAG,QAAA,EAAU,YAAA,EAAa;AAAA,EAClrB,EAAE,EAAA,EAAI,kBAAA,EAAoB,QAAA,EAAU,0DAA0D,MAAA,EAAQ,CAAA;;AAAA,yMAAA,CAAA,EAAsT,QAAA,EAAU,CAAC,KAAA,EAAO,MAAA,EAAQ,UAAU,SAAA,EAAW,KAAK,CAAA,EAAG,QAAA,EAAU,UAAA;AAC/d,CAAA;AAmBO,IAAM,gBAAA,GAAiC;AAAA,EAC5C,IAAA,EAAM,uBAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,+DAAA;AAAA,EAEb,KAAA,EAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,yBAAA;AAAA,MACN,WAAA,EACE,6UAAA;AAAA,MACF,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,IAAA,EAAM;AAAA,YACJ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf,SACF;AAAA,QACA,QAAA,EAAU,CAAC,OAAO;AAAA;AACpB;AACF,GACF;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,uBAAA,EAAyB,OAAO,IAAA,KAAS;AACvC,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAI,IAAA,CAAK,IAAA,IAAmB,CAAC,CAAA,EAAG,EAAE,CAAA;AAEjE,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,MAAA,MAAM,UAAA,GAAa,WAAW,KAAA,CAAM,KAAK,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAGnE,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,GAAA,CAAI,CAAA,EAAA,KAAM;AAC1B,QAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,QAAA,MAAM,aAAA,GAAgB,EAAA,CAAG,QAAA,CAAS,WAAA,EAAY;AAC9C,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,MAAA,CAAO,WAAA,EAAY;AAC1C,QAAA,MAAM,cAAc,EAAA,CAAG,QAAA,CAAS,IAAA,CAAK,GAAG,EAAE,WAAA,EAAY;AACtD,QAAA,MAAM,WAAW,CAAA,EAAG,aAAa,CAAA,CAAA,EAAI,WAAW,IAAI,WAAW,CAAA,CAAA;AAG/D,QAAA,IAAI,aAAA,CAAc,QAAA,CAAS,UAAU,CAAA,EAAG,KAAA,IAAS,EAAA;AAGjD,QAAA,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG,KAAA,IAAS,CAAA;AAG5C,QAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAE7B,UAAA,IAAI,GAAG,QAAA,CAAS,IAAA,CAAK,CAAA,EAAA,KAAM,EAAA,CAAG,aAAY,CAAE,QAAA,CAAS,IAAI,CAAA,IAAK,KAAK,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,CAAC,CAAA,EAAG;AAC9F,YAAA,KAAA,IAAS,CAAA;AAAA,UACX;AAEA,UAAA,IAAI,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,EAAG,KAAA,IAAS,CAAA;AAE3C,UAAA,IAAI,WAAA,CAAY,QAAA,CAAS,IAAI,CAAA,EAAG,KAAA,IAAS,CAAA;AAAA,QAC3C;AAEA,QAAA,OAAO,EAAE,GAAG,EAAA,EAAI,KAAA,EAAM;AAAA,MACxB,CAAC,CAAA;AAGD,MAAA,MAAM,OAAA,GAA0B,MAAA,CAC7B,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,CAAG,QAAQ,CAAC,CAAA,CACzB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,CACb,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,MAAO;AAAA,QACf,MAAM,CAAA,GAAI,CAAA;AAAA,QACV,WAAW,IAAA,CAAK,KAAA,CAAO,GAAG,KAAA,GAAQ,EAAA,GAAM,GAAG,CAAA,GAAI,GAAA;AAAA,QAC/C,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,QAAQ,EAAA,CAAG,MAAA;AAAA,QACX,UAAU,EAAA,CAAG;AAAA,OACf,CAAE,CAAA;AAEJ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,KAAA;AAAA,QACA,aAAa,OAAA,CAAQ,MAAA;AAAA,QACrB,OAAA;AAAA,QACA,IAAA,EAAM,OAAA,CAAQ,MAAA,KAAW,CAAA,GACrB,iFAAA,GACA;AAAA,OACN;AAAA,IACF;AAAA,GACF;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,YAAY,MAAM;AAChB,MAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AAAA,IACrE;AAAA;AAEJ;;;ACrLO,IAAM,gBAAA,GAAsC;AAAA,EACjD;AAAA,IACE,GAAG,sBAAA;AAAA,IACH,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,GAAG,gBAAA;AAAA,IACH,WAAA,EAAa;AAAA;AAEjB;AAKO,SAAS,mBAAmB,IAAA,EAA2C;AAC5E,EAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AACnD;ACdAS,qBAAA,CAAK,gBAAA,CAAiB,cAAcC,2BAAU,CAAA;AAC9CD,qBAAA,CAAK,gBAAA,CAAiB,MAAMC,2BAAU,CAAA;AACtCD,qBAAA,CAAK,gBAAA,CAAiB,cAAcE,2BAAU,CAAA;AAC9CF,qBAAA,CAAK,gBAAA,CAAiB,MAAME,2BAAU,CAAA;AACtCF,qBAAA,CAAK,gBAAA,CAAiB,UAAUG,uBAAM,CAAA;AACtCH,qBAAA,CAAK,gBAAA,CAAiB,MAAMG,uBAAM,CAAA;AAClCH,qBAAA,CAAK,gBAAA,CAAiB,QAAQI,qBAAI,CAAA;AAClCJ,qBAAA,CAAK,gBAAA,CAAiB,QAAQK,qBAAI,CAAA;AAClCL,qBAAA,CAAK,gBAAA,CAAiB,MAAMK,qBAAI,CAAA;AAChCL,qBAAA,CAAK,gBAAA,CAAiB,SAASM,sBAAK,CAAA;AACpCN,qBAAA,CAAK,gBAAA,CAAiB,OAAOO,oBAAG,CAAA;AAChCP,qBAAA,CAAK,gBAAA,CAAiB,OAAOQ,oBAAG,CAAA;AAChCR,qBAAA,CAAK,gBAAA,CAAiB,QAAQQ,oBAAG,CAAA;AACjCR,qBAAA,CAAK,gBAAA,CAAiB,YAAYS,yBAAQ,CAAA;AAC1CT,qBAAA,CAAK,gBAAA,CAAiB,MAAMS,yBAAQ,CAAA;AACpCT,qBAAA,CAAK,gBAAA,CAAiB,OAAOU,oBAAG,CAAA;AAChCV,qBAAA,CAAK,gBAAA,CAAiB,QAAQW,qBAAI,CAAA;AAClCX,qBAAA,CAAK,gBAAA,CAAiB,OAAOW,qBAAI,CAAA;AACjCX,qBAAA,CAAK,gBAAA,CAAiB,QAAQY,qBAAI,CAAA;AAClCZ,qBAAA,CAAK,gBAAA,CAAiB,MAAMa,mBAAE,CAAA;AAC9Bb,qBAAA,CAAK,gBAAA,CAAiB,QAAQc,qBAAI,CAAA;AAClCd,qBAAA,CAAK,gBAAA,CAAiB,OAAOe,oBAAG,CAAA;AAChCf,qBAAA,CAAK,gBAAA,CAAiB,KAAKe,oBAAG,CAAA;AAC9Bf,qBAAA,CAAK,gBAAA,CAAiB,UAAUgB,uBAAM,CAAA;AACtChB,qBAAA,CAAK,gBAAA,CAAiB,MAAMgB,uBAAM,CAAA;AAClChB,qBAAA,CAAK,gBAAA,CAAiB,OAAOiB,oBAAG,CAAA;AAChCjB,qBAAA,CAAK,gBAAA,CAAiB,QAAQkB,qBAAI,CAAA;AAClClB,qBAAA,CAAK,gBAAA,CAAiB,MAAMkB,qBAAI,CAAA;AAChClB,qBAAA,CAAK,gBAAA,CAAiB,SAASmB,sBAAK,CAAA;AACpCnB,qBAAA,CAAK,gBAAA,CAAiB,UAAUoB,uBAAM,CAAA;AACtCpB,qBAAA,CAAK,gBAAA,CAAiB,MAAMoB,uBAAM,CAAA;AAiBlC,IAAM,cAAA,GAAsC;AAAA,EAC1C,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,EAC9B,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,EAC5B,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA;AAKA,IAAM,YAAA,GAAe;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,SAAA,EAoEV,MAAA,CAAO,OAAO,aAAa,CAAA;AAAA;AAAA;AAAA,eAAA,EAGrB,MAAA,CAAO,WAAW,cAAc,CAAA;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,yBAAA,EA6BtB,MAAA,CAAO,OAAO,eAAe,CAAA;AAAA,SAAA,EAC7C,MAAA,CAAO,OAAO,aAAa,CAAA;AAAA;AAAA;AAAA,SAAA,EAG3B,MAAA,CAAO,OAAO,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAMZ,MAAA,CAAO,OAAO,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,EASjC,MAAA,CAAO,OAAO,aAAa,CAAA;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;AA6DjDC,aAAA,CAAO,GAAA,CAAI;AAAA,EACT,GAAA,EAAK,IAAA;AAAA,EACL,MAAA,EAAQ;AACV,CAAC,CAAA;AAKD,SAAS,aAAA,CAAcC,OAAc,IAAA,EAAsB;AACzD,EAAA,IAAI,IAAA,IAAQtB,qBAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG;AAClC,IAAA,IAAI;AACF,MAAA,OAAOA,sBAAK,SAAA,CAAUsB,KAAAA,EAAM,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA,CAAE,KAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,OAAOtB,qBAAA,CAAK,aAAA,CAAcsB,KAAI,CAAA,CAAE,KAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAOA,KAAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAAA,EACzB;AACF;AAKA,IAAI,gBAAA,GAAmB,CAAA;AACvB,SAAS,mBAAA,GAA8B;AACrC,EAAA,OAAO,CAAA,WAAA,EAAc,EAAE,gBAAgB,CAAA,CAAA;AACzC;AAMA,SAAS,eAAe,OAAA,EAAyB;AAE/C,EAAA,MAAM,OAAOD,aAAA,CAAO,KAAA,CAAM,SAAS,EAAE,KAAA,EAAO,OAAO,CAAA;AAGnD,EAAA,MAAM,cAAA,GAAiB,8DAAA;AACvB,EAAA,IAAI,SAAS,IAAA,CAAK,OAAA,CAAQ,gBAAgB,CAAC,CAAA,EAAG,MAAMC,KAAAA,KAAS;AAC3D,IAAA,MAAM,UAAUA,KAAAA,CACb,OAAA,CAAQ,OAAA,EAAS,GAAG,EACpB,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,QAAQ,QAAA,EAAU,GAAG,CAAA,CACrB,OAAA,CAAQ,WAAW,GAAG,CAAA;AACzB,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,IAAI,CAAA;AAC/C,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,IAAA,MAAM,WAAA,GAAc,mBAAmB,OAAO,CAAA;AAC9C,IAAA,OAAO,CAAA,8CAAA,EAAiD,EAAE,CAAA,aAAA,EAAgB,WAAW,CAAA,kCAAA,EAAqC,IAAI,CAAA,EAAA,EAAK,WAAW,CAAA,6GAAA,EAAgH,EAAE,CAAA,+UAAA,EAAkV,EAAE,CAAA,qPAAA,CAAA;AAAA,EACtlB,CAAC,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiB,uCAAA;AACvB,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,CAAC,GAAGA,KAAAA,KAAS;AACnD,IAAA,MAAM,UAAUA,KAAAA,CACb,OAAA,CAAQ,OAAA,EAAS,GAAG,EACpB,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,QAAQ,QAAA,EAAU,GAAG,CAAA,CACrB,OAAA,CAAQ,WAAW,GAAG,CAAA;AACzB,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,EAAE,CAAA;AAC7C,IAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,IAAA,MAAM,WAAA,GAAc,mBAAmB,OAAO,CAAA;AAC9C,IAAA,OAAO,CAAA,8CAAA,EAAiD,EAAE,CAAA,aAAA,EAAgB,WAAW,6BAA6B,WAAW,CAAA,6GAAA,EAAgH,EAAE,CAAA,+UAAA,EAAkV,EAAE,CAAA,qPAAA,CAAA;AAAA,EACrkB,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,eAAA,CAAgB,EAAE,OAAA,EAAS,SAAA,EAAU,EAAyB;AAC5E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIrC,eAAiB,EAAE,CAAA;AACnD,EAAA,MAAM,YAAA,GAAeC,aAAuB,IAAI,CAAA;AAEhD,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AAEpD,MAAA,WAAA;AAAA,QACE,OAAA,CACG,OAAA,CAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,OAAO,MAAM;AAAA,OAC1B;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,WAAA,GAAc,OAAO,CAAA,KAAkB;AAC3C,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAC7C,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA;AAC9B,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,aAAA,CAAc,CAAA,eAAA,EAAkB,MAAM,CAAA,EAAA,CAAI,CAAA;AACpE,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,WAAA,GAAc,QAAQ,OAAA,CAAQ,IAAA;AACpC,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAMkC,KAAAA,GAAO,mBAAmB,WAAW,CAAA;AAE3C,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAUA,KAAI,CAAA;AACxC,UAAA,MAAA,CAAO,SAAA,CAAU,IAAI,QAAQ,CAAA;AAE7B,UAAA,MAAA,CAAO,SAAA,GAAY,CAAA;AAAA;AAAA,gBAAA,CAAA;AAGnB,UAAA,UAAA,CAAW,MAAM;AACf,YAAA,MAAA,CAAO,SAAA,CAAU,OAAO,QAAQ,CAAA;AAChC,YAAA,MAAA,CAAO,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA,kBAAA,CAAA;AAAA,UAIrB,GAAG,GAAI,CAAA;AAAA,QACT,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,mBAAmB,GAAG,CAAA;AAAA,QACtC;AAAA,MACF,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,QAAA,MAAM,GAAA,GAAM,CAAA,gCAAA,EAAmC,kBAAA,CAAmBA,KAAI,CAAC,CAAA,CAAA;AACvE,QAAA,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,QAAA,EAAU,qBAAqB,CAAA;AAAA,MAClD;AAAA,IACF,CAAA;AAEA,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC/C,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACEzB,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,cAAAA,CAAC,WAAO,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,oBACrBA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO,cAAA;AAAA,QACP,SAAA,EAAW,CAAA,QAAA,EAAW,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,QACrC,uBAAA,EAAyB,EAAE,MAAA,EAAQ,QAAA;AAAS;AAAA;AAC9C,GAAA,EACF,CAAA;AAEJ;AC9ZA,IAAMgC,OAAAA,GAAS;AAAA;AAAA,EAEb,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,OAAO,MAAA,CAAO,WAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IAChD,UAAA,EAAY,OAAO,UAAA,CAAW,UAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IAIX,OAAA,EAAS,OAAO,OAAA,CAAQ,GAAA;AAAA,IACxB,UAAA,EAAY,OAAO,MAAA,CAAO,WAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAAA,GAClD;AAAA,EACA,kBAAA,EAAoB;AAAA,IAElB,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,cAAA,EAAgB;AAAA,IAId,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,YAAY,CAAA,CAAA;AAAA,IAE/C,YAAA,EAAc,OAAO,MAAA,CAAO,IAAA;AAAA,IAE5B,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,UAAA,EAAY,OAAO,MAAA,CAAO,SAAA;AAAA,IAC1B,YAAA,EAAc,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IACtD,YAAA,EAAc,GAAG,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,EAAE,CAAA,IAAA;AAAA,GACvD;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,OAAO,UAAA,CAAW,kBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,GAC9B;AAAA,EACA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA;AAAA,EAGA,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,WAEvB,CAAA;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,GAAG,OAAA,CAAQ,UAAA;AAAA,IACX,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,GAC9B;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,UAAA,EAAY,OAAO,MAAA,CAAO,eAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,OAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,UAAA,EAAY,OAAO,MAAA,CAAO,SAAA;AAAA,IAC1B,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,MAAA,EAAQ,OAAO,MAAA,CAAO;AAAA,GACxB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,UAAA,EAAY,OAAO,MAAA,CAAO,WAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IAChD,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,OAAA;AAAA,IACV,SAAA,EAAW,MAAA;AAAA,IACX,QAAA,EAAU,MAAA;AAAA,IACV,SAAA,EAAW,OAAO,OAAA,CAAQ;AAAA,GAC5B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAAA,GACxD;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,kBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,QAAA,EAAU,MAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,CAAA,MAAA,EAAS,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,GAC9C;AAAA,EACA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,OAAO,OAAA,CAAQ;AAAA,GAC1B;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACZ,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,aAAA,EAAe;AAAA,IACb,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,OAAA,EAAS,MAAA;AAAA,IACT,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,MAAA;AAAA,IACZ,eAAA,EAAiB,CAAA,wKAAA,CAAA;AAAA,IACjB,gBAAA,EAAkB,WAAA;AAAA,IAClB,kBAAA,EAAoB,mBAAA;AAAA,IACpB,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,SAAA,EAAW,OAAO,OAAA,CAAQ;AAAA,GAC5B;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,OAAO,MAAA,CAAO,eAAA;AAAA,IAC1B,YAAA,EAAc,MAAA;AAAA,IACd,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,CAAA,WAAA,EAAc,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,GACnD;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,UAAA,EAAY,OAAO,MAAA,CAAO;AAAA,GAC5B;AAAA,EACA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,OAAO,MAAA,CAAO,WAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,IAAA;AAAA,IAC5B,UAAA,EAAY,CAAA,UAAA,EAAa,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA;AAAA,GAClD;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,eAAA,EAAiB;AAAA,IACf,KAAA,EAAO,MAAA;AAAA,IACP,SAAA,EAAW,OAAA;AAAA,IACX,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,OAAA,EAAS,MAAA;AAAA,IACT,MAAA,EAAQ,UAAA;AAAA,IACR,UAAA,EAAY,OAAO,UAAA,CAAW;AAAA,GAChC;AAAA;AAAA,EAGA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,CAAA;AAAA,IACN,SAAA,EAAW,MAAA;AAAA,IACX,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,UAAA,EAAY,OAAO,MAAA,CAAO;AAAA,GAC5B;AAAA,EACA,aAAA,EAAe;AAAA,IACb,SAAA,EAAW,QAAA;AAAA,IACX,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,OAAA,EAAS,OAAO,OAAA,CAAQ;AAAA,GAC1B;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA;AAAA,EAGA,kBAAA,EAAoB;AAAA,IAClB,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,GAAA,EAAK,OAAO,OAAA,CAAQ,EAAA;AAAA,IACpB,OAAA,EAAS,CAAA,EAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,GACjC;AAAA,EACA,aAAA,EAAe;AAAA,IACb,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ,EAAA;AAAA,IACpB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,MAAA,CAAO,eAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,GAC9B;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,OAAO,MAAA,CAAO,aAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,IAAA;AAAA,IAC5B,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,kBAAA,EAAoB;AAAA,IAClB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,SAAA,EAAW,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IACnD,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,MAAA;AAAA,IACV,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS,aAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ,EAAA;AAAA,IACpB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,GAC9B;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,QAAA,EAAU,OAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,YAAA,EAAc,UAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,UAAA,EAAY,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,MAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAAA;AAAA,EAGA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,UAAA,EAAY,OAAO,MAAA,CAAO,SAAA;AAAA,IAC1B,SAAA,EAAW,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IACnD,YAAA,EAAc,OAAO,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,GAC3D;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,CAAA;AAAA,IACN,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,CAAA;AAAA,IACd,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,OAAA,EAAS,MAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,aAAA,EAAe;AAAA,IACb,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA;AAAA,IAEP,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,CAAA,EAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,IAC/B,UAAA,EAAY,OAAO,UAAA,CAAW;AAAA,GAChC;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,GAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,wBAAA;AAAA,IACR,cAAA,EAAgB,aAAA;AAAA,IAChB,YAAA,EAAc,OAAO,MAAA,CAAO,IAAA;AAAA,IAC5B,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,SAAA,EAAW,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC1B,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,UAAA,EAAY,OAAO,MAAA,CAAO,aAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,GAC9B;AAAA;AAAA,EAGA,sBAAA,EAAwB;AAAA,IACtB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,aAAA,EAAe;AAAA,IACb,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,GAC9B;AAAA,EACA,sBAAA,EAAwB;AAAA,IACtB,UAAA,EAAY,OAAO,MAAA,CAAO,OAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,2BAAA,EAA6B;AAAA,IAC3B,UAAA,EAAY,OAAO,MAAA,CAAO,YAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,SAAA,EAAW;AAAA,GACb;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,UAAA,EAAY,UAAA;AAAA,IACZ,SAAA,EAAW,YAAA;AAAA,IACX,UAAA,EAAY,OAAO,UAAA,CAAW;AAAA,GAChC;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAY,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC3B,UAAA,EAAY,cAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,SAAA,EAAW,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC1B,UAAA,EAAY,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC3B,SAAA,EAAW,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,IACrD,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,GAC9B;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,UAAA,EAAY,wBAAA;AAAA,IACZ,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,SAAA,EAAW,OAAO,OAAA,CAAQ;AAAA,GAC5B;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,GAAG,OAAA,CAAQ;AAAA,GACb;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,GAAG,OAAA,CAAQ,IAAA;AAAA,IACX,SAAA,EAAW,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC1B,QAAA,EAAU,MAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAGA,cAAA,EAAgB;AAAA,IACd,MAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAY,OAAO,MAAA,CAAO,aAAA;AAAA,IAC1B,MAAA,EAAQ,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,EAAA;AAAA,GAC9B;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,GAAA,EAAK,OAAO,OAAA,CAAQ;AAAA,GACtB;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,eAAA;AAAA,IAChB,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,GAC9B;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,GAAA,EAAK,OAAO,OAAA,CAAQ,EAAA;AAAA,IACpB,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,OAAA;AAAA,IACT,UAAA,EAAY,OAAO,UAAA,CAAW,gBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,UAAA,EAAY,QAAA;AAAA,IACZ,QAAA,EAAU,QAAA;AAAA,IACV,YAAA,EAAc;AAAA,GAChB;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,OAAA;AAAA,IACT,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO;AAAA,GACvB;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,SAAA,EAAW,QAAA;AAAA,IACX,KAAA,EAAO,OAAO,MAAA,CAAO,YAAA;AAAA,IACrB,QAAA,EAAU,OAAO,UAAA,CAAW;AAAA,GAC9B;AAAA,EAEA,sBAAA,EAAwB;AAAA,IACtB,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,kBAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,aAAA,EAAe,WAAA;AAAA,IACf,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,OAAO,OAAA,CAAQ,EAAA;AAAA,IAC1B,YAAA,EAAc,OAAO,OAAA,CAAQ;AAAA,GAC/B;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,IAChD,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,aAAA;AAAA,IACrB,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,CAAA;AAAA,IAC1C,UAAA,EAAY;AAAA,GACd;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA;AAAA,IAC5B,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,CAAA;AAAA,IAC9C,YAAA,EAAc,OAAO,MAAA,CAAO,EAAA;AAAA,IAC5B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA;AAAA,IACrB,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,CAAY,IAAI,CAAA,CAAA;AAAA,IAC1C,UAAA,EAAY;AAAA;AAEhB,CAAA;AAoCA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACpE;AAmBO,SAAS,UAAA,CAAW;AAAA,EACzB,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc,mBAAA;AAAA,EACd,YAAA,GAAe,KAAA;AAAA,EACf,SAAA,GAAY,KAAA;AAAA,EACZ,mBAAA,GAAsB,EAAA;AAAA,EACtB,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,aAAA,EAAc;AAC1C,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,MACE,SAAA,EAAU;AACd,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAW,UAAU,CAAA;AAGzB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAItC,cAAAA,CAA2B,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,CAAuB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,cAAAA,CAAqB,EAAE,CAAA;AACvE,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAGhE,EAAA,MAAM,cAAA,GAAiBC,aAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,YAAA,GAAeA,aAAyB,IAAI,CAAA;AAGlD,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,mBAAA,IAAuB,CAAC,YAAA,EAAc;AACxC,MAAA,eAAA,CAAgB,mBAAmB,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,mBAAA,EAAqB,YAAA,EAAc,eAAe,CAAC,CAAA;AAGvD,EAAAA,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAKb,EAAA,MAAM,gBAAA,GAAmBD,iBAAAA;AAAA,IACvB,OAAO,CAAA,KAA2C;AAChD,MAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,MAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAElC,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAG;AACpC,QAAA,IAAI;AACF,UAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,IAAI,CAAA;AACxC,UAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,UAAU,CAAC,CAAA;AAAA,QAC9C,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,kBAAkB,GAAG,CAAA;AAAA,QACrC;AAAA,MACF;AAGA,MAAA,IAAI,aAAa,OAAA,EAAS;AACxB,QAAA,YAAA,CAAa,QAAQ,KAAA,GAAQ,EAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAKA,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,CAAC,KAAA,KAAkB;AACtD,IAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAC,CAAA;AAAA,EAC3D,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,WAAA,GAAcA,kBAAY,YAAY;AAC1C,IAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,IAAA,IAAI,CAAC,OAAA,IAAW,WAAA,IAAe,CAAC,OAAA,EAAS;AAGzC,IAAA,MAAM,WAAA,GAA8B;AAAA,MAClC,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN;AAAA,KACF;AAGA,IAAA,WAAA,CAAY,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,WAAW,CAAC,CAAA;AAC1C,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,SAAA,GAAY,WAAW,CAAA;AAGvB,IAAA,MAAM,gBAAA,GAAmC;AAAA,MACvC,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,EAAA;AAAA,MACT,WAAA,EAAa,IAAA;AAAA,MACb,WAAW;AAAC,KACd;AAEA,IAAA,WAAA,CAAY,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,gBAAgB,CAAC,CAAA;AAC/C,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,mBAAA,CAAoB,EAAE,CAAA;AAEtB,IAAA,IAAI;AAEF,MAAA,MAAM,eAA8B,QAAA,CACjC,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,WAAW,CAAA,CAC1B,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE,CAAA;AAGlD,MAAA,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAG3C,MAAA,MAAM,SAAS,UAAA,CAAW;AAAA,QACxB,QAAA,EAAU,YAAA;AAAA,QACV,WAAA,EAAa,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,KAAA,CAAA;AAAA,QACpD,aAAA,EAAe;AAAA,OAChB,CAAA;AAGD,MAAA,cAAA,CAAe,EAAE,CAAA;AAEjB,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,MAAM,uBAAmC,EAAC;AAE1C,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,UAAA,WAAA,IAAe,KAAA,CAAM,KAAA;AACrB,UAAA,WAAA;AAAA,YAAY,UACV,IAAA,CAAK,GAAA;AAAA,cAAI,CAAA,CAAA,KACP,CAAA,CAAE,EAAA,KAAO,gBAAA,CAAiB,EAAA,GACtB,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,WAAA,EAAY,GAC7B;AAAA;AACN,WACF;AAAA,QACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa;AACrC,UAAA,MAAM,WAAW,KAAA,CAAM,KAAA;AACvB,UAAA,oBAAA,CAAqB,KAAK,QAAQ,CAAA;AAClC,UAAA,mBAAA,CAAoB,CAAC,GAAG,oBAAoB,CAAC,CAAA;AAC7C,UAAA,WAAA;AAAA,YAAY,UACV,IAAA,CAAK,GAAA;AAAA,cAAI,CAAA,CAAA,KACP,CAAA,CAAE,EAAA,KAAO,gBAAA,CAAiB,EAAA,GACtB,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,CAAC,GAAG,oBAAoB,GAAE,GAC7C;AAAA;AACN,WACF;AACA,UAAA,UAAA,GAAa,QAAQ,CAAA;AAAA,QACvB,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,UAAA,OAAA,CAAQ,KAAA,CAAM,eAAA,EAAiB,KAAA,CAAM,KAAK,CAAA;AAAA,QAC5C;AAAA,MACF;AAGA,MAAA,WAAA;AAAA,QAAY,UACV,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KACP,CAAA,CAAE,EAAA,KAAO,gBAAA,CAAiB,EAAA,GACtB,EAAE,GAAG,CAAA,EAAG,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,WAAA,IAAe,iBAAgB,GACpE;AAAA;AACN,OACF;AAEA,MAAA,UAAA,GAAa,WAAW,CAAA;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,eAAe,GAAG,CAAA;AAChC,MAAA,WAAA;AAAA,QAAY,UACV,IAAA,CAAK,GAAA;AAAA,UAAI,OACP,CAAA,CAAE,EAAA,KAAO,iBAAiB,EAAA,GACtB,EAAE,GAAG,CAAA,EAAG,WAAA,EAAa,KAAA,EAAO,OAAA,EAAS,UAAU,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,eAAe,IAAG,GACtG;AAAA;AACN,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,WAAA,EAAa,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW,UAAA,EAAY,UAAU,CAAC,CAAA;AAK3G,EAAA,MAAM,cAAA,GAAiBA,iBAAAA;AAAA,IACrB,CAAC,CAAA,KAA2B;AAC1B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,WAAA,EAAY;AAAA,MACd;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAGA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,8BAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,iBAAA;AAAA,IACT;AACA,IAAA,OAAO,yBAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,UAAU,eAAA,IAAmB,OAAA;AAEnC,EAAA,uBACEU,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,cAAAA,CAAC,WAAO,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,oBACnBM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,KAAA,EAAO0B,QAAO,SAAA,EAEvC,QAAA,EAAA;AAAA,sBAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,MAAA,EACjB,QAAA,EAAA;AAAA,wBAAAhC,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAOgC,OAAAA,CAAO,aAAa,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACnC1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,aAAA,EAEhB,QAAA,EAAA;AAAA,UAAA,aAAA,oBACChC,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAO,EAAE,QAAA,EAAU,OAAO,UAAA,CAAW,UAAA,EAAY,OAAO,MAAA,CAAO,MAAA,CAAO,eAAc,EACvF,QAAA,EAAA,aAAA,CAAc,MAAM,GAAG,CAAA,CAAE,KAAI,EAChC,CAAA;AAAA,UAID,gCACCA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,oBAAA,CAAqB,CAAC,iBAAiB,CAAA;AAAA,cACtD,KAAA,EAAO;AAAA,gBACL,GAAGgC,OAAAA,CAAO,WAAA;AAAA,gBACV,GAAI,iBAAA,GAAoBA,OAAAA,CAAO,iBAAA,GAAoBA,OAAAA,CAAO;AAAA,eAC5D;AAAA,cACA,KAAA,EAAM,UAAA;AAAA,cAEN,QAAA,kBAAAhC,eAAC,YAAA,EAAA,EAAa;AAAA;AAAA;AAChB,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,YAAA,IAAgB,qCACfA,cAAAA,CAAC,SAAI,KAAA,EAAOgC,OAAAA,CAAO,YAAA,EAAc,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA,EACxE,QAAA,kBAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,OAAO,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,eAAA,EAAgB,EAExD,QAAA,EAAA;AAAA,wBAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,WAAA,EACjB,QAAA,EAAA;AAAA,0BAAAhC,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,YAAY,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,0BACxChC,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAOgC,OAAAA,CAAO,UAAA;AAAA,cACd,OAAA,EAAS,MAAM,oBAAA,CAAqB,KAAK,CAAA;AAAA,cAC1C,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA;AAAA,wBAGA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,SAAA,EAEjB,QAAA,EAAA;AAAA,0BAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,YAAA,EACjB,QAAA,EAAA;AAAA,4BAAAhC,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAOgC,OAAAA,CAAO,cAAc,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACxChC,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAOgC,OAAAA,CAAO,oBAAoB,QAAA,EAAA,+CAAA,EAA6C,CAAA;AAAA,4BAClF1B,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,aAAA;AAAA,gBACP,QAAA,EAAU,CAAA,CAAA,KAAK,gBAAA,CAAiB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC9C,OAAO0B,OAAAA,CAAO,aAAA;AAAA,gBAEd,QAAA,EAAA;AAAA,kCAAAhC,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,0BAAA,EAAwB,CAAA;AAAA,kBAAA,CACvC,MAAM;AAEN,oBAAA,MAAM,UAAyC,EAAC;AAChD,oBAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AACtB,sBAAA,MAAM,CAAC,QAAQ,CAAA,GAAI,KAAA,CAAM,EAAA,CAAG,MAAM,GAAG,CAAA;AACrC,sBAAA,IAAI,CAAC,OAAA,CAAQ,QAAQ,GAAG,OAAA,CAAQ,QAAQ,IAAI,EAAC;AAC7C,sBAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,oBAC9B,CAAC,CAAA;AACD,oBAAA,OAAO,OAAO,OAAA,CAAQ,OAAO,EAAE,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,cAAc,CAAA,qBAC3DA,eAAC,UAAA,EAAA,EAAwB,KAAA,EAAO,SAAS,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAChF,QAAA,EAAA,cAAA,CAAe,IAAI,CAAA,KAAA,qBAClBA,eAAC,QAAA,EAAA,EAAsB,KAAA,EAAO,KAAA,CAAM,EAAA,EACjC,gBAAM,IAAA,EAAA,EADI,KAAA,CAAM,EAEnB,CACD,CAAA,EAAA,EALY,QAMf,CACD,CAAA;AAAA,kBACH,CAAA;AAAG;AAAA;AAAA,aACL;AAAA,YACC,kBAAkB,MAAM;AACvB,cAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,aAAa,CAAA;AACrD,cAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,cAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,iBAAiB,GAAI,CAAA;AACvD,cAAA,MAAM,aAAa,UAAA,CAAW,KAAA,CAAM,OAAA,EAAS,MAAA,IAAU,GAAG,CAAA,GAAI,GAAA;AAC9D,cAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA,CAAM,OAAA,EAAS,UAAA,IAAc,GAAG,CAAA,GAAI,GAAA;AACtE,cAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,SAAA,EAAW,QAAA,EAAA;AAAA,gBAAA,WAAA;AAAA,gBAClB,QAAA;AAAA,gBAAS,oBAAA;AAAA,gBAAmB,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,gBAAE,IAAA;AAAA,gBAAG,cAAA,CAAe,QAAQ,CAAC,CAAA;AAAA,gBAAE;AAAA,eAAA,EAC3F,CAAA;AAAA,YAEJ,CAAA;AAAG,WAAA,EACL,CAAA;AAAA,0BAGA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,YAAA,EACjB,QAAA,EAAA;AAAA,4BAAAhC,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAOgC,OAAAA,CAAO,cAAc,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,4BACvD1B,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,OAAO0B,OAAAA,CAAO,SAAA;AAAA,gBACd,OAAA,EAAS,MAAM,mBAAA,CAAoB,CAAC,gBAAgB,CAAA;AAAA,gBAEpD,QAAA,EAAA;AAAA,kCAAAhC,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,aAAa,QAAA,EAAA,oCAAA,EAAkC,CAAA;AAAA,kCACnEhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,oBACV,GAAGgC,OAAAA,CAAO,YAAA;AAAA,oBACV,GAAI,gBAAA,GAAmBA,OAAAA,CAAO,kBAAA,GAAqB;AAAC,mBACtD,EACE,QAAA,kBAAAhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,oBACV,GAAGgC,OAAAA,CAAO,UAAA;AAAA,oBACV,GAAI,gBAAA,GAAmBA,OAAAA,CAAO,gBAAA,GAAmB;AAAC,qBACjD,CAAA,EACL;AAAA;AAAA;AAAA,aACF;AAAA,4BACAhC,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAOgC,OAAAA,CAAO,oBAAoB,QAAA,EAAA,mEAAA,EAErC;AAAA,WAAA,EACF,CAAA;AAAA,0BAGA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,YAAA,EACjB,QAAA,EAAA;AAAA,4BAAAhC,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAOgC,OAAAA,CAAO,cAAc,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,4BACvDhC,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAOgC,OAAAA,CAAO,oBAAoB,QAAA,EAAA,mDAAA,EAAiD,CAAA;AAAA,4BACtFhC,cAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,YAAA;AAAA,gBACP,QAAA,EAAU,CAAA,CAAA,KAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC7C,WAAA,EAAY,gCAAA;AAAA,gBACZ,OAAOgC,OAAAA,CAAO;AAAA;AAAA;AAChB,WAAA,EACF,CAAA;AAAA,0BAGAhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,QAAO,cAAA,EAAgB,CAAA;AAAA,0BAGnC1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,GAAG0B,OAAAA,CAAO,YAAA,EAAc,YAAA,EAAc,CAAA,EAAE,EACpD,QAAA,EAAA;AAAA,4BAAAhC,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAOgC,OAAAA,CAAO,cAAc,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BAC1ChC,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAOgC,OAAAA,CAAO,oBAAoB,QAAA,EAAA,iCAAA,EAA+B,CAAA;AAAA,YAGnE,QAAQ,MAAA,GAAS,CAAA,mBAChBhC,cAAAA,CAAC,SAAI,KAAA,EAAOgC,OAAAA,CAAO,UAAA,EAChB,QAAA,EAAA,OAAA,CAAQ,IAAI,CAAA,MAAA,qBACX1B,gBAAC,KAAA,EAAA,EAAsB,KAAA,EAAO0B,QAAO,SAAA,EACnC,QAAA,EAAA;AAAA,8BAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,UAAA,EACjB,QAAA,EAAA;AAAA,gCAAAhC,cAAAA,CAAC,UAAK,KAAA,EAAOgC,OAAAA,CAAO,YAAa,QAAA,EAAA,MAAA,CAAO,OAAA,GAAU,cAAO,QAAA,EAAI,CAAA;AAAA,gCAC7D1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,aAAA,EACjB,QAAA,EAAA;AAAA,kCAAAhC,eAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,UAAA,EAAa,iBAAO,IAAA,EAAK,CAAA;AAAA,kCAC7C1B,eAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO0B,QAAO,UAAA,EAAY,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,oBAC5B,MAAA,CAAO,OAAA;AAAA,oBAAQ,UAAA;AAAA,oBAAI,MAAA,CAAO,OAAO,MAAA,IAAU,CAAA;AAAA,oBAAE;AAAA,mBAAA,EACjD;AAAA,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BACA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,EAAA,EAAG,EACpD,QAAA,EAAA;AAAA,gCAAAN,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO;AAAA,sBACL,GAAGgC,OAAAA,CAAO,YAAA;AAAA,sBACV,GAAI,MAAA,CAAO,OAAA,GAAUA,OAAAA,CAAO,qBAAqB;AAAC,qBACpD;AAAA,oBACA,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,GAClB,aAAA,CAAc,OAAO,IAAI,CAAA,GACzB,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA;AAAA,oBAG5B,QAAA,kBAAAhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO;AAAA,sBACV,GAAGgC,OAAAA,CAAO,UAAA;AAAA,sBACV,GAAI,MAAA,CAAO,OAAA,GAAUA,OAAAA,CAAO,mBAAmB;AAAC,qBAClD,EAAG;AAAA;AAAA,iBACL;AAAA,gCACAhC,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAOgC,OAAAA,CAAO,YAAA;AAAA,oBACd,OAAA,EAAS,MAAM,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA;AAAA,oBAC5C,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF;AAAA,aAAA,EAAA,EAjCQ,MAAA,CAAO,IAkCjB,CACD,CAAA,EACH,CAAA,mBAEAhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,OAAAA,CAAO,WAAA,EAAa,QAAA,EAAA,sBAAA,EAEhC,CAAA;AAAA,YAID,iBAAiB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,eAAa,SAAA,CAAU,IAAA,KAAS,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,MAAA,GAAS,qBAC5F1B,eAAAA,CAAAC,qBAAA,EACE,QAAA,EAAA;AAAA,8BAAAP,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,OAAAA,CAAO,wBAAwB,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,8BACpDhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,OAAAA,CAAO,UAAA,EAChB,QAAA,EAAA,gBAAA,CACE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,KAAa,UAAU,IAAA,KAAS,CAAA,CAAE,IAAI,CAAC,CAAA,CACjE,GAAA,CAAI,CAAA,MAAA,qBACH1B,eAAAA,CAAC,KAAA,EAAA,EAAsB,KAAA,EAAO0B,OAAAA,CAAO,SAAA,EACnC,QAAA,EAAA;AAAA,gCAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,UAAA,EACjB,QAAA,EAAA;AAAA,kCAAAhC,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,YAAY,QAAA,EAAA,WAAA,EAAE,CAAA;AAAA,kCAClC1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,aAAA,EACjB,QAAA,EAAA;AAAA,oCAAAhC,eAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,UAAA,EAAa,iBAAO,IAAA,EAAK,CAAA;AAAA,oCAC7ChC,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAOgC,OAAAA,CAAO,UAAA,EAAa,iBAAO,WAAA,EAAY;AAAA,mBAAA,EACtD;AAAA,iBAAA,EACF,CAAA;AAAA,gCACAhC,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAOgC,OAAAA,CAAO,UAAA;AAAA,oBACd,OAAA,EAAS,MAAM,cAAA,CAAe,MAAM,CAAA;AAAA,oBACrC,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EAAA,EAdQ,MAAA,CAAO,IAejB,CACD,CAAA,EACL;AAAA,aAAA,EACF;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBAIF1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,YAAA,EAChB,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,MAAA,KAAW,CAAA,oBACnBhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,OAAAA,CAAO,aAAA,EACjB,QAAA,kBAAAhC,cAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,qBAAA,IAAwB,CAAA,EAC9B,CAAA;AAAA,wBAGFA,eAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,QAAO,iBAAA,EAChB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,qBACZhC,cAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YAEC,OAAA;AAAA,YACA;AAAA,WAAA;AAAA,UAFK,OAAA,CAAQ;AAAA,SAIhB,CAAA,EACH,CAAA;AAAA,QAGC,iBAAiB,MAAA,GAAS,CAAA,oBACzBA,cAAAA,CAAC,SAAI,KAAA,EAAOgC,OAAAA,CAAO,kBAAA,EAChB,QAAA,EAAA,gBAAA,CAAiB,IAAI,CAAA,IAAA,qBACpB1B,gBAAC,MAAA,EAAA,EAA2B,KAAA,EAAO0B,QAAO,aAAA,EACxC,QAAA,EAAA;AAAA,0BAAAhC,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,WAAA,EAAa,CAAA;AAAA,UAChC,IAAA,CAAK;AAAA,SAAA,EAAA,EAFG,IAAA,CAAK,UAGhB,CACD,CAAA,EACH,CAAA;AAAA,wBAGFhC,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB;AAAA,OAAA,EAC5B,CAAA;AAAA,MAGC,YAAY,MAAA,GAAS,CAAA,oBACpBA,cAAAA,CAAC,KAAA,EAAA,EAAI,OAAOgC,OAAAA,CAAO,kBAAA,EAChB,sBAAY,GAAA,CAAI,CAAC,KAAK,KAAA,qBACrB1B,gBAAC,KAAA,EAAA,EAAgB,KAAA,EAAO0B,QAAO,cAAA,EAC7B,QAAA,EAAA;AAAA,wBAAAhC,eAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,cAAA,EAAiB,cAAI,IAAA,EAAK,CAAA;AAAA,wBAC9ChC,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,YACrC,OAAOgC,OAAAA,CAAO,gBAAA;AAAA,YACf,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EAAA,EARQ,KASV,CACD,CAAA,EACH,CAAA;AAAA,sBAIF1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,QAAO,SAAA,EACjB,QAAA,EAAA;AAAA,wBAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,QAAA,EAEjB,QAAA,EAAA;AAAA,0BAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,cAAA,EACjB,QAAA,EAAA;AAAA,4BAAAhC,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,YAAA,CAAa,OAAA,EAAS,KAAA,EAAM;AAAA,gBAC3C,OAAOgC,OAAAA,CAAO,SAAA;AAAA,gBACd,KAAA,EAAM,aAAA;AAAA,gBAEN,QAAA,kBAAAhC,eAAC,UAAA,EAAA,EAAW;AAAA;AAAA,aACd;AAAA,4BACAA,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,YAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,SAAA;AAAA,gBACP,QAAA,EAAQ,IAAA;AAAA,gBACR,QAAA,EAAU,gBAAA;AAAA,gBACV,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA;AAAO;AAAA,aAC3B;AAAA,4BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,OAAAA,CAAO,cACjB,QAAA,kBAAAhC,cAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,UAAA;AAAA,gBACP,QAAA,EAAU,CAAA,CAAA,KAAK,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC3C,UAAA,EAAY,cAAA;AAAA,gBACZ,WAAA;AAAA,gBACA,QAAA,EAAU,CAAC,OAAA,IAAW,WAAA,IAAe,SAAA;AAAA,gBACrC,IAAA,EAAM,CAAA;AAAA,gBACN,KAAA,EAAO;AAAA,kBACL,GAAGgC,OAAAA,CAAO,KAAA;AAAA,kBACV,GAAI,CAAC,OAAA,IAAW,eAAe,SAAA,GAAYA,OAAAA,CAAO,gBAAgB;AAAC;AACrE;AAAA,aACF,EACF;AAAA,WAAA,EACF,CAAA;AAAA,0BAGAhC,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,WAAA;AAAA,cACT,UAAU,CAAC,OAAA,IAAW,CAAC,UAAA,CAAW,IAAA,MAAU,WAAA,IAAe,SAAA;AAAA,cAC3D,KAAA,EAAO;AAAA,gBACL,GAAGgC,OAAAA,CAAO,OAAA;AAAA,gBACV,GAAI,CAAC,OAAA,IAAW,CAAC,UAAA,CAAW,IAAA,EAAK,IAAK,WAAA,IAAe,SAAA,GACjDA,OAAAA,CAAO,eAAA,GACP;AAAC,eACP;AAAA,cAEC,wCACChC,cAAAA,CAAC,UAAK,KAAA,EAAOgC,OAAAA,CAAO,aAAa,CAAA,GAEjC;AAAA;AAAA;AAEJ,SAAA,EACF,CAAA;AAAA,QAGC,KAAA,oBACChC,cAAAA,CAAC,KAAA,EAAA,EAAI,OAAOgC,OAAAA,CAAO,QAAA,EAChB,gBAAM,OAAA,EACT;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAUA,SAAS,aAAA,CAAc,EAAE,OAAA,EAAS,SAAA,EAAU,EAAuB;AACjE,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,KAAS,MAAA;AAChC,EAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,KAAS,QAAA;AAElC,EAAA,MAAMC,eAAAA,GAAiB;AAAA,IACrB,GAAGD,OAAAA,CAAO,sBAAA;AAAA,IACV,GAAI,MAAA,GAASA,OAAAA,CAAO,iBAAA,GAAoBA,OAAAA,CAAO;AAAA,GACjD;AAEA,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,GAAGA,OAAAA,CAAO,aAAA;AAAA,IACV,GAAI,MAAA,GACAA,OAAAA,CAAO,yBACP,QAAA,GACEA,OAAAA,CAAO,2BACPA,OAAAA,CAAO;AAAA,GACf;AAEA,EAAA,uBACEhC,eAAC,KAAA,EAAA,EAAI,KAAA,EAAOiC,iBACV,QAAA,kBAAA3B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EAEV,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,cAAA,EAChB,QAAA,EAAA;AAAA,MAAA,MAAA,IAAU,QAAA;AAAA;AAAA,QAET,OAAA,CAAQ;AAAA;AAAA;AAAA,wBAGRhC,cAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,QAAQ,OAAA,EAAS;AAAA,OAAA;AAAA,MAE5C,QAAQ,WAAA,oBACPA,eAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,QAAO,eAAA,EAAiB;AAAA,KAAA,EAEzC,CAAA;AAAA,IAGC,SAAA,IAAa,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,oBAC5D1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO0B,OAAAA,CAAO,cAAA,EACjB,QAAA,EAAA;AAAA,sBAAAhC,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAOgC,OAAAA,CAAO,qBAAqB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,MAClD,OAAA,CAAQ,UAAU,GAAA,CAAI,CAAA,IAAA,qBACrB1B,eAAAA,CAAC,KAAA,EAAA,EAA0B,KAAA,EAAO0B,OAAAA,CAAO,iBAAA,EACvC,QAAA,EAAA;AAAA,wBAAAhC,eAAC,MAAA,EAAA,EAAK,KAAA,EAAOgC,OAAAA,CAAO,iBAAA,EAAoB,eAAK,QAAA,EAAS,CAAA;AAAA,QACrD,IAAA,CAAK,IAAA,oBACJhC,cAAAA,CAAC,SAAI,KAAA,EAAOgC,OAAAA,CAAO,iBAAA,EAChB,QAAA,EAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EACpC;AAAA,OAAA,EAAA,EALM,IAAA,CAAK,UAOf,CACD;AAAA,KAAA,EACH;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AAKA,SAAS,YAAA,GAAe;AACtB,EAAA,uBACE1B,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,oBAAAN,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,oBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,guBAAA,EAAiuB;AAAA,GAAA,EAC3uB,CAAA;AAEJ;AAKA,SAAS,UAAA,GAAa;AACpB,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qHAAoH,CAAA,EAC9H,CAAA;AAEJ;;;AC9uCO,SAASkC,gBAAAA,CAAgB,OAAA,EAAiB,UAAA,GAAa,CAAA,EAAG,WAAW,CAAA,EAAW;AACrF,EAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AACrB,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,UAAA,GAAa,QAAA,EAAU,OAAO,OAAA;AACpD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,UAAU,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,QAAQ,CAAC,CAAA,CAAA;AACtE;AAMA,eAAsB1B,iBAAgB,IAAA,EAAgC;AACpE,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,MAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,MAAA,QAAA,CAAS,MAAM,QAAA,GAAW,OAAA;AAC1B,MAAA,QAAA,CAAS,MAAM,OAAA,GAAU,GAAA;AACzB,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,MAAA,QAAA,CAAS,MAAA,EAAO;AAChB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA;AAC3C,MAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AAKO,SAAS2B,WAAAA,CAAW,SAAS,IAAA,EAAc;AAChD,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC1E;AAMO,SAAS,iBAAiB,KAAA,EAA+C;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACzC,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,SAAS,aAAa,KAAA,EAAwB;AACnD,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,CAAQ,GAAA,KAAQ,UAAU,OAAO,IAAA;AACxD,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,IAAK,OAAA,CAAQ,GAAA,GAAM,GAAA;AACrC;AAMO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,SAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,IAAA,EAAM,MAAM,IAAI,CAAA;AACxC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAClD,EAAA,OAAO,CAAA,EAAG,UAAA,CAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACvE;AAKO,SAAS,QAAA,CACd,IACA,KAAA,EACkC;AAClC,EAAA,IAAI,SAAA;AACJ,EAAA,OAAO,IAAI,IAAA,KAAwB;AACjC,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,SAAA,GAAY,WAAW,MAAM,EAAA,CAAG,GAAG,IAAI,GAAG,KAAK,CAAA;AAAA,EACjD,CAAA;AACF;AAKO,IAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc,qBAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc,qBAAA;AAAA,EACd,OAAA,EAAS;AACX;AAKO,IAAM,QAAA,GAAW;AAAA,EACtB,cAAA,EAAgB,wBAAA;AAAA,EAChB,cAAA,EAAgB,4BAAA;AAAA,EAChB,gBAAA,EAAkB;AACpB","file":"index.cjs","sourcesContent":["'use client';\n\nimport React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useRef,\n} from 'react';\nimport { EmblemAuthSDK } from 'emblem-auth-sdk';\nimport type {\n AuthSession,\n VaultInfo,\n EmblemAuthContextValue,\n EmblemAuthProviderProps,\n} from '../types';\n\n/**\n * Global SDK instance to prevent multiple initializations\n * This is important for React strict mode and hot reloading\n */\nlet globalSDKInstance: EmblemAuthSDK | null = null;\nlet isSDKInitializing = false;\n\n/**\n * Auth context - undefined when not within provider\n */\nconst EmblemAuthContext = createContext<EmblemAuthContextValue | undefined>(undefined);\n\n/**\n * EmblemAuthProvider - Provides authentication state and actions to the app\n *\n * This is a first-class citizen - it has no dependency on Hustle SDK.\n * The Hustle SDK depends on this provider for authentication.\n *\n * @example\n * ```tsx\n * <EmblemAuthProvider\n * appId=\"your-app-id\"\n * apiUrl=\"https://dev-api.emblemvault.ai\"\n * modalUrl=\"https://dev-auth.emblemvault.ai/connect\"\n * >\n * <App />\n * </EmblemAuthProvider>\n * ```\n */\nexport function EmblemAuthProvider({\n children,\n appId,\n apiUrl,\n modalUrl,\n debug = false,\n}: EmblemAuthProviderProps) {\n // State\n const [session, setSession] = useState<AuthSession | null>(null);\n const [isAuthenticated, setIsAuthenticated] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [vaultInfo, setVaultInfo] = useState<VaultInfo | null>(null);\n const [authSDK, setAuthSDK] = useState<EmblemAuthSDK | null>(globalSDKInstance);\n\n // Track if we've initialized\n const initialized = useRef(false);\n\n // Debug logger\n const log = useCallback(\n (message: string, ...args: unknown[]) => {\n if (debug) {\n console.log(`[EmblemAuth] ${message}`, ...args);\n }\n },\n [debug]\n );\n\n /**\n * Fetch vault info after authentication\n */\n const fetchVaultInfo = useCallback(\n async (sdk: EmblemAuthSDK) => {\n try {\n const info = await sdk.getVaultInfo();\n if (info) {\n setVaultInfo(info);\n log('Vault info loaded:', info);\n }\n } catch (err) {\n log('Failed to fetch vault info:', err);\n }\n },\n [log]\n );\n\n /**\n * Handle successful authentication\n */\n const handleAuthSuccess = useCallback(\n (newSession: AuthSession, sdk: EmblemAuthSDK) => {\n log('Auth success - session:', newSession);\n setSession(newSession);\n setIsAuthenticated(true);\n setIsLoading(false);\n setError(null);\n fetchVaultInfo(sdk);\n },\n [log, fetchVaultInfo]\n );\n\n /**\n * Handle authentication error\n */\n const handleAuthError = useCallback(\n (err: Error) => {\n log('Auth error:', err);\n setError(err);\n setIsLoading(false);\n setIsAuthenticated(false);\n setSession(null);\n },\n [log]\n );\n\n /**\n * Handle session expiration\n */\n const handleSessionExpired = useCallback(() => {\n log('Session expired');\n setSession(null);\n setIsAuthenticated(false);\n setVaultInfo(null);\n }, [log]);\n\n /**\n * Initialize the SDK\n */\n useEffect(() => {\n // Prevent double initialization\n if (initialized.current || globalSDKInstance || isSDKInitializing) {\n if (globalSDKInstance && !authSDK) {\n setAuthSDK(globalSDKInstance);\n // Check for existing session\n const existingSession = globalSDKInstance.getSession();\n if (existingSession) {\n handleAuthSuccess(existingSession, globalSDKInstance);\n }\n }\n return;\n }\n\n initialized.current = true;\n isSDKInitializing = true;\n log('Initializing SDK with appId:', appId);\n\n // Create SDK instance\n const sdk = new EmblemAuthSDK({\n appId,\n apiUrl,\n modalUrl,\n onSuccess: (newSession) => {\n handleAuthSuccess(newSession as AuthSession, sdk);\n },\n onError: (err) => {\n handleAuthError(err);\n },\n });\n\n // Store globally and locally\n globalSDKInstance = sdk;\n isSDKInitializing = false;\n setAuthSDK(sdk);\n\n // Check for existing session\n const existingSession = sdk.getSession();\n if (existingSession) {\n log('Found existing session');\n handleAuthSuccess(existingSession as AuthSession, sdk);\n }\n\n // Subscribe to session events\n const handleSessionUpdate = (updatedSession: AuthSession | null) => {\n if (updatedSession) {\n setSession(updatedSession);\n setIsAuthenticated(true);\n } else {\n handleSessionExpired();\n }\n };\n\n sdk.on('session', handleSessionUpdate);\n sdk.on('sessionExpired', handleSessionExpired);\n\n // Cleanup\n return () => {\n sdk.off('session', handleSessionUpdate);\n sdk.off('sessionExpired', handleSessionExpired);\n };\n }, [appId, apiUrl, modalUrl, log, handleAuthSuccess, handleAuthError, handleSessionExpired, authSDK]);\n\n /**\n * Open the auth modal\n */\n const openAuthModal = useCallback(async () => {\n if (!authSDK) {\n setError(new Error('Auth SDK not initialized'));\n return;\n }\n\n log('Opening auth modal');\n setIsLoading(true);\n setError(null);\n\n try {\n await authSDK.openAuthModal();\n // Success is handled by onSuccess callback\n } catch (err) {\n setIsLoading(false);\n setError(err instanceof Error ? err : new Error('Failed to open auth modal'));\n }\n }, [authSDK, log]);\n\n /**\n * Logout and clear session\n */\n const logout = useCallback(() => {\n if (!authSDK) return;\n\n log('Logging out');\n authSDK.logout();\n setSession(null);\n setIsAuthenticated(false);\n setVaultInfo(null);\n setError(null);\n }, [authSDK, log]);\n\n /**\n * Refresh the current session\n */\n const refreshSession = useCallback(async (): Promise<AuthSession | null> => {\n if (!authSDK) return null;\n\n log('Refreshing session');\n try {\n const refreshedSession = await authSDK.refreshSession();\n if (refreshedSession) {\n setSession(refreshedSession as AuthSession);\n setIsAuthenticated(true);\n return refreshedSession as AuthSession;\n }\n return null;\n } catch (err) {\n log('Failed to refresh session:', err);\n setError(err instanceof Error ? err : new Error('Failed to refresh session'));\n return null;\n }\n }, [authSDK, log]);\n\n // Derived values\n const vaultId = session?.user?.vaultId ?? null;\n const walletAddress = session?.user?.evmAddress ?? null;\n\n // Context value\n const value: EmblemAuthContextValue = {\n // State\n session,\n isAuthenticated,\n isLoading,\n error,\n vaultInfo,\n\n // Derived\n vaultId,\n walletAddress,\n\n // Actions\n openAuthModal,\n logout,\n refreshSession,\n\n // For Hustle integration\n authSDK,\n };\n\n return (\n <EmblemAuthContext.Provider value={value}>\n {children}\n </EmblemAuthContext.Provider>\n );\n}\n\n/**\n * Hook to access auth context\n * Must be used within EmblemAuthProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isAuthenticated, openAuthModal, logout } = useEmblemAuth();\n *\n * return isAuthenticated\n * ? <button onClick={logout}>Logout</button>\n * : <button onClick={openAuthModal}>Connect</button>;\n * }\n * ```\n */\nexport function useEmblemAuth(): EmblemAuthContextValue {\n const context = useContext(EmblemAuthContext);\n if (context === undefined) {\n throw new Error('useEmblemAuth must be used within an EmblemAuthProvider');\n }\n return context;\n}\n\n/**\n * Reset the global SDK instance (useful for testing)\n */\nexport function resetAuthSDK(): void {\n globalSDKInstance = null;\n isSDKInitializing = false;\n}\n","/**\n * Plugin Registry\n *\n * Manages plugin storage and state in localStorage.\n *\n * Storage model:\n * - Installed plugins are GLOBAL (hustle-plugins) - install once, available everywhere\n * - Enabled/disabled state is INSTANCE-SCOPED (hustle-plugin-state-{instanceId})\n *\n * Executor functions are serialized as strings (executorCode) and\n * reconstituted at runtime via new Function().\n *\n * SECURITY TODO: Add signature verification before executing stored code.\n * Plugins should be signed by trusted publishers and verified before\n * any eval/Function execution occurs.\n */\n\nimport type {\n StoredPlugin,\n HustlePlugin,\n HydratedPlugin,\n ToolExecutor,\n PluginHooks,\n SerializedToolDefinition,\n SerializedHooks,\n} from '../types';\n\n/**\n * Storage keys:\n * - PLUGINS_KEY: Global list of installed plugins (not instance-scoped)\n * - getEnabledStateKey: Per-instance enabled/disabled states\n */\nconst PLUGINS_KEY = 'hustle-plugins';\n\nfunction getEnabledStateKey(instanceId: string): string {\n return `hustle-plugin-state-${instanceId}`;\n}\n\ntype PluginChangeCallback = (plugins: StoredPlugin[]) => void;\n\n/** Stored enabled state per instance */\ntype EnabledState = Record<string, boolean>;\n\n/**\n * Serialize a function to a string for storage\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction serializeFunction(fn: (...args: any[]) => any): string {\n return fn.toString();\n}\n\n/**\n * Deserialize a function string back to executable function\n *\n * FIXME: Add signature verification before execution\n * This is a security-sensitive operation that executes stored code.\n */\nfunction deserializeExecutor(code: string): ToolExecutor {\n // Extract function body - handles arrow functions and regular functions\n // The stored code is the full function: \"(args) => { ... }\" or \"async (args) => { ... }\"\n // We wrap it in parentheses and eval to get the function reference\n try {\n // eslint-disable-next-line no-eval\n return eval(`(${code})`) as ToolExecutor;\n } catch (err) {\n console.error('[Hustle] Failed to deserialize executor:', err);\n // Return a no-op executor that reports the error\n return async () => ({ error: 'Failed to deserialize executor', code });\n }\n}\n\n/**\n * Deserialize a hook function string\n *\n * FIXME: Add signature verification before execution\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction deserializeHook<T extends (...args: any[]) => any>(code: string): T {\n try {\n // eslint-disable-next-line no-eval\n return eval(`(${code})`) as T;\n } catch (err) {\n console.error('[Hustle] Failed to deserialize hook:', err);\n return (() => {}) as T;\n }\n}\n\n/**\n * Serialize a plugin's executors to executorCode strings\n */\nfunction serializePluginTools(\n tools: HustlePlugin['tools'],\n executors: HustlePlugin['executors']\n): SerializedToolDefinition[] {\n if (!tools) return [];\n\n return tools.map((tool) => ({\n ...tool,\n executorCode: executors?.[tool.name]\n ? serializeFunction(executors[tool.name])\n : undefined,\n }));\n}\n\n/**\n * Serialize plugin hooks to code strings\n */\nfunction serializeHooks(hooks: PluginHooks | undefined): SerializedHooks | undefined {\n if (!hooks) return undefined;\n\n const serialized: SerializedHooks = {};\n\n if (hooks.onRegister) {\n serialized.onRegisterCode = serializeFunction(hooks.onRegister);\n }\n if (hooks.beforeRequest) {\n serialized.beforeRequestCode = serializeFunction(hooks.beforeRequest);\n }\n if (hooks.afterResponse) {\n serialized.afterResponseCode = serializeFunction(hooks.afterResponse);\n }\n if (hooks.onError) {\n serialized.onErrorCode = serializeFunction(hooks.onError);\n }\n\n return Object.keys(serialized).length > 0 ? serialized : undefined;\n}\n\n/**\n * Hydrate a stored plugin - reconstitute executors from executorCode\n *\n * FIXME: Add signature verification before execution\n */\nexport function hydratePlugin(stored: StoredPlugin): HydratedPlugin {\n // Reconstitute executors from executorCode strings\n const executors: Record<string, ToolExecutor> = {};\n\n if (stored.tools) {\n for (const tool of stored.tools) {\n if (tool.executorCode) {\n executors[tool.name] = deserializeExecutor(tool.executorCode);\n }\n }\n }\n\n // Reconstitute hooks from hooksCode strings\n let hooks: PluginHooks | undefined;\n\n if (stored.hooksCode) {\n hooks = {};\n if (stored.hooksCode.onRegisterCode) {\n hooks.onRegister = deserializeHook(stored.hooksCode.onRegisterCode);\n }\n if (stored.hooksCode.beforeRequestCode) {\n hooks.beforeRequest = deserializeHook(stored.hooksCode.beforeRequestCode);\n }\n if (stored.hooksCode.afterResponseCode) {\n hooks.afterResponse = deserializeHook(stored.hooksCode.afterResponseCode);\n }\n if (stored.hooksCode.onErrorCode) {\n hooks.onError = deserializeHook(stored.hooksCode.onErrorCode);\n }\n }\n\n return {\n ...stored,\n executors: Object.keys(executors).length > 0 ? executors : undefined,\n hooks,\n };\n}\n\n/**\n * Plugin Registry class\n *\n * Manages plugin persistence with:\n * - Global plugin installations (with serialized executorCode)\n * - Instance-scoped enabled/disabled state\n */\nclass PluginRegistry {\n private listeners: Map<string, Set<PluginChangeCallback>> = new Map();\n\n /**\n * Get listeners for a specific instance\n */\n private getListeners(instanceId: string): Set<PluginChangeCallback> {\n if (!this.listeners.has(instanceId)) {\n this.listeners.set(instanceId, new Set());\n }\n return this.listeners.get(instanceId)!;\n }\n\n /**\n * Load installed plugins (global)\n */\n private loadInstalledPlugins(): Omit<StoredPlugin, 'enabled'>[] {\n if (typeof window === 'undefined') return [];\n try {\n const stored = localStorage.getItem(PLUGINS_KEY);\n return stored ? JSON.parse(stored) : [];\n } catch {\n return [];\n }\n }\n\n /**\n * Save installed plugins (global)\n * Serializes executors as executorCode strings\n */\n private saveInstalledPlugins(plugins: Omit<StoredPlugin, 'enabled'>[]): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(PLUGINS_KEY, JSON.stringify(plugins));\n }\n\n /**\n * Load enabled state for an instance\n */\n private loadEnabledState(instanceId: string): EnabledState {\n if (typeof window === 'undefined') return {};\n try {\n const stored = localStorage.getItem(getEnabledStateKey(instanceId));\n return stored ? JSON.parse(stored) : {};\n } catch {\n return {};\n }\n }\n\n /**\n * Save enabled state for an instance\n */\n private saveEnabledState(state: EnabledState, instanceId: string): void {\n if (typeof window === 'undefined') return;\n localStorage.setItem(getEnabledStateKey(instanceId), JSON.stringify(state));\n }\n\n /**\n * Load plugins with instance-specific enabled state\n * Combines global plugin list with per-instance enabled state\n */\n loadFromStorage(instanceId: string = 'default'): StoredPlugin[] {\n const installed = this.loadInstalledPlugins();\n const enabledState = this.loadEnabledState(instanceId);\n\n return installed.map((plugin) => ({\n ...plugin,\n // Default to enabled if no state exists for this instance\n enabled: enabledState[plugin.name] ?? true,\n }));\n }\n\n /**\n * Register a new plugin (global - available to all instances)\n * Serializes executors as executorCode for persistence\n *\n * @param plugin The plugin to install\n * @param enabled Initial enabled state for this instance (default: true)\n * @param instanceId Instance to set initial enabled state for\n */\n register(plugin: HustlePlugin, enabled = true, instanceId: string = 'default'): void {\n // Add to global installed list with serialized executors\n const installed = this.loadInstalledPlugins();\n const existing = installed.findIndex((p) => p.name === plugin.name);\n\n const storedPlugin: Omit<StoredPlugin, 'enabled'> = {\n name: plugin.name,\n version: plugin.version,\n description: plugin.description,\n tools: serializePluginTools(plugin.tools, plugin.executors),\n hooksCode: serializeHooks(plugin.hooks),\n installedAt: new Date().toISOString(),\n };\n\n if (existing >= 0) {\n installed[existing] = storedPlugin;\n } else {\n installed.push(storedPlugin);\n }\n\n this.saveInstalledPlugins(installed);\n\n // Set initial enabled state for this instance\n const enabledState = this.loadEnabledState(instanceId);\n enabledState[plugin.name] = enabled;\n this.saveEnabledState(enabledState, instanceId);\n\n this.notifyListeners(instanceId);\n }\n\n /**\n * Unregister a plugin (global - removes from all instances)\n */\n unregister(pluginName: string, instanceId: string = 'default'): void {\n // Remove from global list\n const installed = this.loadInstalledPlugins().filter((p) => p.name !== pluginName);\n this.saveInstalledPlugins(installed);\n\n // Clean up enabled state for this instance\n const enabledState = this.loadEnabledState(instanceId);\n delete enabledState[pluginName];\n this.saveEnabledState(enabledState, instanceId);\n\n this.notifyListeners(instanceId);\n }\n\n /**\n * Enable or disable a plugin (instance-scoped)\n */\n setEnabled(pluginName: string, enabled: boolean, instanceId: string = 'default'): void {\n const enabledState = this.loadEnabledState(instanceId);\n enabledState[pluginName] = enabled;\n this.saveEnabledState(enabledState, instanceId);\n this.notifyListeners(instanceId);\n }\n\n /**\n * Check if a plugin is installed (global)\n */\n isRegistered(pluginName: string): boolean {\n return this.loadInstalledPlugins().some((p) => p.name === pluginName);\n }\n\n /**\n * Get a specific plugin with instance-specific enabled state\n */\n getPlugin(pluginName: string, instanceId: string = 'default'): StoredPlugin | undefined {\n return this.loadFromStorage(instanceId).find((p) => p.name === pluginName);\n }\n\n /**\n * Get all enabled plugins for an instance (hydrated with executors)\n */\n getEnabledPlugins(instanceId: string = 'default'): HydratedPlugin[] {\n return this.loadFromStorage(instanceId).filter((p) => p.enabled).map(hydratePlugin);\n }\n\n /**\n * Subscribe to plugin changes for a specific instance\n */\n onChange(callback: PluginChangeCallback, instanceId: string = 'default'): () => void {\n const listeners = this.getListeners(instanceId);\n listeners.add(callback);\n return () => listeners.delete(callback);\n }\n\n /**\n * Notify all listeners for a specific instance\n */\n private notifyListeners(instanceId: string = 'default'): void {\n const plugins = this.loadFromStorage(instanceId);\n const listeners = this.getListeners(instanceId);\n listeners.forEach((cb) => cb(plugins));\n }\n\n /**\n * Clear enabled state for an instance (plugins remain installed globally)\n */\n clear(instanceId: string = 'default'): void {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(getEnabledStateKey(instanceId));\n this.notifyListeners(instanceId);\n }\n\n /**\n * Clear all installed plugins globally\n */\n clearAll(): void {\n if (typeof window === 'undefined') return;\n localStorage.removeItem(PLUGINS_KEY);\n // Note: This doesn't clear instance-specific enabled states\n }\n}\n\n// Singleton instance\nexport const pluginRegistry = new PluginRegistry();\n\nexport default pluginRegistry;\n","'use client';\n\n/**\n * usePlugins Hook\n *\n * Manages plugin state with localStorage persistence and cross-tab sync.\n * Supports instance-scoped storage for multiple HustleProviders.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { pluginRegistry, hydratePlugin } from '../utils/pluginRegistry';\nimport type { StoredPlugin, HustlePlugin, HydratedPlugin } from '../types';\n\n// Re-export hydratePlugin for convenience\nexport { hydratePlugin };\n\n/**\n * Get the storage key for a given instance\n */\nfunction getStorageKey(instanceId: string): string {\n return `hustle-plugins-${instanceId}`;\n}\n\n/**\n * Return type for usePlugins hook\n */\nexport interface UsePluginsReturn {\n /** All registered plugins (with enabled state) */\n plugins: StoredPlugin[];\n /** Only enabled plugins (hydrated with executors) */\n enabledPlugins: HydratedPlugin[];\n /** Register a new plugin */\n registerPlugin: (plugin: HustlePlugin) => void;\n /** Unregister a plugin by name */\n unregisterPlugin: (name: string) => void;\n /** Enable a plugin */\n enablePlugin: (name: string) => void;\n /** Disable a plugin */\n disablePlugin: (name: string) => void;\n /** Check if a plugin is registered */\n isRegistered: (name: string) => boolean;\n /** Check if a plugin is enabled */\n isEnabled: (name: string) => boolean;\n}\n\n/**\n * Hook for managing plugins\n *\n * @param instanceId - Optional instance ID for scoping plugin storage (defaults to 'default')\n *\n * @example\n * ```tsx\n * const { plugins, registerPlugin, enabledPlugins } = usePlugins();\n *\n * // Install a plugin\n * registerPlugin(myPlugin);\n *\n * // Check enabled plugins\n * console.log('Active tools:', enabledPlugins.flatMap(p => p.tools));\n * ```\n */\nexport function usePlugins(instanceId: string = 'default'): UsePluginsReturn {\n const [plugins, setPlugins] = useState<StoredPlugin[]>([]);\n\n // Load initial plugins and subscribe to changes\n useEffect(() => {\n // Load initial state\n setPlugins(pluginRegistry.loadFromStorage(instanceId));\n\n // Subscribe to registry changes for this instance\n const unsubscribe = pluginRegistry.onChange(setPlugins, instanceId);\n\n // Listen to storage events for cross-tab sync\n const storageKey = getStorageKey(instanceId);\n const handleStorage = (e: StorageEvent) => {\n if (e.key === storageKey) {\n setPlugins(pluginRegistry.loadFromStorage(instanceId));\n }\n };\n window.addEventListener('storage', handleStorage);\n\n return () => {\n unsubscribe();\n window.removeEventListener('storage', handleStorage);\n };\n }, [instanceId]);\n\n // Register a new plugin\n const registerPlugin = useCallback((plugin: HustlePlugin) => {\n pluginRegistry.register(plugin, true, instanceId);\n }, [instanceId]);\n\n // Unregister a plugin\n const unregisterPlugin = useCallback((name: string) => {\n pluginRegistry.unregister(name, instanceId);\n }, [instanceId]);\n\n // Enable a plugin\n const enablePlugin = useCallback((name: string) => {\n pluginRegistry.setEnabled(name, true, instanceId);\n }, [instanceId]);\n\n // Disable a plugin\n const disablePlugin = useCallback((name: string) => {\n pluginRegistry.setEnabled(name, false, instanceId);\n }, [instanceId]);\n\n // Check if plugin is registered\n const isRegistered = useCallback(\n (name: string) => plugins.some(p => p.name === name),\n [plugins]\n );\n\n // Check if plugin is enabled\n const isEnabled = useCallback(\n (name: string) => plugins.some(p => p.name === name && p.enabled),\n [plugins]\n );\n\n // Get enabled plugins with hydrated executors\n const enabledPlugins = plugins.filter(p => p.enabled).map(hydratePlugin);\n\n return {\n plugins,\n enabledPlugins,\n registerPlugin,\n unregisterPlugin,\n enablePlugin,\n disablePlugin,\n isRegistered,\n isEnabled,\n };\n}\n\nexport default usePlugins;\n","'use client';\n\nimport React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport { HustleIncognitoClient } from 'hustle-incognito';\nimport { useEmblemAuth } from './EmblemAuthProvider';\nimport { usePlugins } from '../hooks/usePlugins';\nimport type {\n Model,\n ChatOptions,\n StreamOptions,\n StreamChunk,\n ChatResponse,\n Attachment,\n HustleContextValue,\n HustleProviderProps,\n ChatMessage,\n HydratedPlugin,\n} from '../types';\n\n/**\n * Hustle context - undefined when not within provider\n */\nconst HustleContext = createContext<HustleContextValue | undefined>(undefined);\n\n/**\n * Default Hustle API URL\n */\nconst DEFAULT_HUSTLE_API_URL = 'https://agenthustle.ai';\n\n/**\n * Module-level counter for auto-generating instance IDs.\n * Resets on page load, but render order is deterministic.\n */\nlet instanceCounter = 0;\n\n/**\n * Track mounted instances without explicit IDs for dev warnings\n */\nconst mountedAutoInstances = new Set<string>();\n\n/**\n * HustleProvider - Provides Hustle SDK functionality to the app\n *\n * IMPORTANT: This provider depends on EmblemAuthProvider and must be nested within it.\n * It uses the modern pattern of passing the auth SDK instance to HustleIncognitoClient,\n * NOT the deprecated api-key pattern.\n *\n * @example\n * ```tsx\n * <EmblemAuthProvider appId=\"your-app-id\">\n * <HustleProvider hustleApiUrl=\"https://dev.agenthustle.ai\">\n * <App />\n * </HustleProvider>\n * </EmblemAuthProvider>\n * ```\n */\nexport function HustleProvider({\n children,\n hustleApiUrl = DEFAULT_HUSTLE_API_URL,\n debug = false,\n instanceId: explicitInstanceId,\n}: HustleProviderProps) {\n // Generate stable instance ID - explicit or auto-generated based on mount order\n const [resolvedInstanceId] = useState(() => {\n if (explicitInstanceId) {\n return explicitInstanceId;\n }\n // Auto-generate based on mount order\n const autoId = `instance-${++instanceCounter}`;\n mountedAutoInstances.add(autoId);\n return autoId;\n });\n\n // Track if this is an auto-generated instance for cleanup\n const isAutoInstance = !explicitInstanceId;\n\n // Dev warning for multiple auto-generated instances\n useEffect(() => {\n if (isAutoInstance && mountedAutoInstances.size > 1 && process.env.NODE_ENV !== 'production') {\n console.warn(\n `[Hustle] Multiple HustleProviders detected without explicit instanceId. ` +\n `For stable settings persistence, consider adding instanceId prop:\\n` +\n ` <HustleProvider instanceId=\"my-chat-name\">`\n );\n }\n\n // Cleanup on unmount\n return () => {\n if (isAutoInstance) {\n mountedAutoInstances.delete(resolvedInstanceId);\n }\n };\n }, [isAutoInstance, resolvedInstanceId]);\n\n // Get auth context - this provider REQUIRES EmblemAuthProvider\n const { authSDK, isAuthenticated } = useEmblemAuth();\n\n // Get plugins with instance scoping\n const { enabledPlugins } = usePlugins(resolvedInstanceId);\n\n // State\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [models, setModels] = useState<Model[]>([]);\n\n // Track registered plugins to avoid re-registering\n const registeredPluginsRef = useRef<Set<string>>(new Set());\n\n // Settings storage key - scoped to instance\n const SETTINGS_KEY = `hustle-settings-${resolvedInstanceId}`;\n\n // Load initial settings from localStorage\n const loadSettings = () => {\n if (typeof window === 'undefined') return { selectedModel: '', systemPrompt: '', skipServerPrompt: false };\n try {\n const stored = localStorage.getItem(SETTINGS_KEY);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch {\n // Ignore parse errors\n }\n return { selectedModel: '', systemPrompt: '', skipServerPrompt: false };\n };\n\n const initialSettings = loadSettings();\n\n // Settings state (initialized from localStorage)\n const [selectedModel, setSelectedModelState] = useState<string>(initialSettings.selectedModel);\n const [systemPrompt, setSystemPromptState] = useState<string>(initialSettings.systemPrompt);\n const [skipServerPrompt, setSkipServerPromptState] = useState<boolean>(initialSettings.skipServerPrompt);\n\n // Persist settings to localStorage\n const saveSettings = useCallback((settings: { selectedModel: string; systemPrompt: string; skipServerPrompt: boolean }) => {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings));\n } catch {\n // Ignore storage errors\n }\n }, []);\n\n // Wrapped setters that also persist\n const setSelectedModel = useCallback((value: string) => {\n setSelectedModelState(value);\n saveSettings({ selectedModel: value, systemPrompt, skipServerPrompt });\n }, [systemPrompt, skipServerPrompt, saveSettings]);\n\n const setSystemPrompt = useCallback((value: string) => {\n setSystemPromptState(value);\n saveSettings({ selectedModel, systemPrompt: value, skipServerPrompt });\n }, [selectedModel, skipServerPrompt, saveSettings]);\n\n const setSkipServerPrompt = useCallback((value: boolean) => {\n setSkipServerPromptState(value);\n saveSettings({ selectedModel, systemPrompt, skipServerPrompt: value });\n }, [selectedModel, systemPrompt, saveSettings]);\n\n // Debug logger\n const log = useCallback(\n (message: string, ...args: unknown[]) => {\n if (debug) {\n console.log(`[Hustle] ${message}`, ...args);\n }\n },\n [debug]\n );\n\n /**\n * Create the Hustle client with the auth SDK\n * This is the CORRECT pattern - using sdk: authSDK, NOT apiKey\n */\n const client = useMemo(() => {\n if (!authSDK || !isAuthenticated) {\n log('Client not created - auth not ready');\n return null;\n }\n\n log('Creating HustleIncognitoClient with auth SDK');\n\n try {\n const hustleClient = new HustleIncognitoClient({\n sdk: authSDK, // CORRECT: Pass auth SDK instance, NOT apiKey\n hustleApiUrl,\n debug,\n });\n\n // Subscribe to events (use any for SDK event types)\n hustleClient.on('tool_start', (event: unknown) => {\n log('Tool start:', event);\n });\n\n hustleClient.on('tool_end', (event: unknown) => {\n log('Tool end:', event);\n });\n\n hustleClient.on('stream_end', (event: unknown) => {\n log('Stream end:', event);\n });\n\n return hustleClient;\n } catch (err) {\n log('Failed to create client:', err);\n setError(err instanceof Error ? err : new Error('Failed to create Hustle client'));\n return null;\n }\n }, [authSDK, isAuthenticated, hustleApiUrl, debug, log]);\n\n // Is ready when client exists\n const isReady = client !== null;\n\n /**\n * Register enabled plugins with the client\n */\n useEffect(() => {\n if (!client) return;\n\n const registerPlugins = async () => {\n // Get the set of enabled plugin names\n const enabledNames = new Set(enabledPlugins.map(p => p.name));\n\n // Unregister plugins that were disabled\n for (const name of registeredPluginsRef.current) {\n if (!enabledNames.has(name)) {\n log('Unregistering plugin:', name);\n try {\n await client.unuse(name);\n registeredPluginsRef.current.delete(name);\n log('Plugin unregistered:', name);\n } catch (err) {\n log('Failed to unregister plugin:', name, err);\n }\n }\n }\n\n // Register new plugins\n for (const plugin of enabledPlugins) {\n if (!registeredPluginsRef.current.has(plugin.name)) {\n log('Registering plugin:', plugin.name);\n try {\n // The SDK's use() method registers the plugin\n if (plugin.executors || plugin.hooks) {\n // Cast to SDK's expected type (our types are compatible but TS is strict)\n await client.use({\n name: plugin.name,\n version: plugin.version,\n tools: plugin.tools,\n executors: plugin.executors,\n hooks: plugin.hooks,\n } as Parameters<typeof client.use>[0]);\n registeredPluginsRef.current.add(plugin.name);\n log('Plugin registered:', plugin.name);\n } else {\n log('Plugin has no executors/hooks, skipping registration:', plugin.name);\n }\n } catch (err) {\n log('Failed to register plugin:', plugin.name, err);\n }\n }\n }\n };\n\n registerPlugins();\n }, [client, enabledPlugins, log]);\n\n /**\n * Load available models\n */\n const loadModels = useCallback(async (): Promise<Model[]> => {\n if (!client) {\n log('Cannot load models - client not ready');\n return [];\n }\n\n log('Loading models');\n setIsLoading(true);\n\n try {\n const modelList = await client.getModels();\n setModels(modelList as Model[]);\n log('Loaded models:', modelList.length);\n return modelList as Model[];\n } catch (err) {\n log('Failed to load models:', err);\n setError(err instanceof Error ? err : new Error('Failed to load models'));\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [client, log]);\n\n /**\n * Load models when client becomes ready\n */\n useEffect(() => {\n if (client) {\n loadModels();\n }\n }, [client, loadModels]);\n\n /**\n * Send a chat message (non-streaming)\n */\n const chat = useCallback(\n async (options: ChatOptions): Promise<ChatResponse> => {\n if (!client) {\n throw new Error('Hustle client not ready. Please authenticate first.');\n }\n\n log('Chat request:', options.messages.length, 'messages');\n setIsLoading(true);\n setError(null);\n\n try {\n // Build the messages array, prepending system prompt if provided\n const effectiveSystemPrompt = options.systemPrompt || systemPrompt;\n const messagesWithSystem: ChatMessage[] = [];\n\n if (effectiveSystemPrompt) {\n messagesWithSystem.push({ role: 'system', content: effectiveSystemPrompt });\n }\n messagesWithSystem.push(...options.messages);\n\n // Build the options object for the SDK\n const sdkOptions: Record<string, unknown> = {\n messages: messagesWithSystem,\n processChunks: true,\n };\n\n if (options.model || selectedModel) {\n sdkOptions.model = options.model || selectedModel;\n }\n if (options.overrideSystemPrompt ?? skipServerPrompt) {\n sdkOptions.overrideSystemPrompt = true;\n }\n if (options.attachments) {\n sdkOptions.attachments = options.attachments;\n }\n\n // Call the SDK - it accepts an options object\n const response = await (client as unknown as { chat: (opts: Record<string, unknown>) => Promise<unknown> }).chat(sdkOptions);\n log('Chat response received');\n return response as ChatResponse;\n } catch (err) {\n log('Chat error:', err);\n const error = err instanceof Error ? err : new Error('Chat request failed');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [client, selectedModel, systemPrompt, skipServerPrompt, log]\n );\n\n /**\n * Send a chat message with streaming response\n */\n const chatStreamImpl = useCallback(\n (options: StreamOptions): AsyncIterable<StreamChunk> => {\n if (!client) {\n // Return an async iterable that yields an error\n return {\n [Symbol.asyncIterator]: async function* () {\n yield { type: 'error', value: { message: 'Hustle client not ready. Please authenticate first.' } } as StreamChunk;\n },\n };\n }\n\n log('Chat stream request:', options.messages.length, 'messages');\n setError(null);\n\n // Build the messages array, prepending system prompt if provided\n const effectiveSystemPrompt = options.systemPrompt || systemPrompt;\n const messagesWithSystem: ChatMessage[] = [];\n\n if (effectiveSystemPrompt) {\n messagesWithSystem.push({ role: 'system', content: effectiveSystemPrompt });\n }\n messagesWithSystem.push(...options.messages);\n\n // Build the options object for the SDK\n const sdkOptions: Record<string, unknown> = {\n messages: messagesWithSystem,\n processChunks: options.processChunks ?? true,\n };\n\n if (options.model || selectedModel) {\n sdkOptions.model = options.model || selectedModel;\n }\n if (options.overrideSystemPrompt ?? skipServerPrompt) {\n sdkOptions.overrideSystemPrompt = true;\n }\n if (options.attachments) {\n sdkOptions.attachments = options.attachments;\n }\n\n // Get the stream from the client (cast through unknown for SDK compatibility)\n const stream = client.chatStream(sdkOptions as unknown as Parameters<typeof client.chatStream>[0]);\n\n // Wrap to add logging and type conversion\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of stream) {\n // Type guard for chunk with type property\n const typedChunk = chunk as { type?: string; value?: unknown };\n\n if (typedChunk.type === 'text') {\n const textValue = typedChunk.value as string;\n log('Stream text chunk:', textValue?.substring(0, 50));\n yield { type: 'text', value: textValue } as StreamChunk;\n } else if (typedChunk.type === 'tool_call') {\n log('Stream tool call:', typedChunk.value);\n yield { type: 'tool_call', value: typedChunk.value } as StreamChunk;\n } else if (typedChunk.type === 'tool_result') {\n log('Stream tool result');\n yield { type: 'tool_result', value: typedChunk.value } as StreamChunk;\n } else if (typedChunk.type === 'error') {\n const errorValue = typedChunk.value as { message?: string };\n log('Stream error:', errorValue);\n setError(new Error(errorValue?.message || 'Stream error'));\n yield { type: 'error', value: { message: errorValue?.message || 'Stream error' } } as StreamChunk;\n } else {\n // Pass through unknown chunk types\n yield chunk as StreamChunk;\n }\n }\n } catch (err) {\n log('Stream error:', err);\n const error = err instanceof Error ? err : new Error('Stream failed');\n setError(error);\n yield { type: 'error', value: { message: error.message } } as StreamChunk;\n }\n },\n };\n },\n [client, selectedModel, systemPrompt, skipServerPrompt, log]\n );\n\n /**\n * Upload a file\n */\n const uploadFile = useCallback(\n async (file: File): Promise<Attachment> => {\n if (!client) {\n throw new Error('Hustle client not ready. Please authenticate first.');\n }\n\n log('Uploading file:', file.name);\n setIsLoading(true);\n\n try {\n const attachment = await client.uploadFile(file);\n log('File uploaded:', attachment);\n return attachment as Attachment;\n } catch (err) {\n log('Upload error:', err);\n const error = err instanceof Error ? err : new Error('File upload failed');\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n },\n [client, log]\n );\n\n // Context value\n const value: HustleContextValue = {\n // Instance ID for scoped storage\n instanceId: resolvedInstanceId,\n\n // State\n isReady,\n isLoading,\n error,\n models,\n\n // Client (for advanced use)\n client,\n\n // Chat methods\n chat,\n chatStream: chatStreamImpl,\n\n // File upload\n uploadFile,\n\n // Data fetching\n loadModels,\n\n // Settings\n selectedModel,\n setSelectedModel,\n systemPrompt,\n setSystemPrompt,\n skipServerPrompt,\n setSkipServerPrompt,\n };\n\n return (\n <HustleContext.Provider value={value}>\n {children}\n </HustleContext.Provider>\n );\n}\n\n/**\n * Hook to access Hustle context\n * Must be used within HustleProvider (which must be within EmblemAuthProvider)\n *\n * @example\n * ```tsx\n * function ChatComponent() {\n * const { isReady, chat, chatStream } = useHustle();\n *\n * if (!isReady) {\n * return <div>Please connect to start chatting</div>;\n * }\n *\n * // Use chat or chatStream...\n * }\n * ```\n */\nexport function useHustle(): HustleContextValue {\n const context = useContext(HustleContext);\n if (context === undefined) {\n throw new Error('useHustle must be used within a HustleProvider (which requires EmblemAuthProvider)');\n }\n return context;\n}\n","/**\n * Design Tokens for Hustle React Components\n *\n * These tokens use CSS Custom Properties (CSS Variables) for easy theming.\n * Override any variable in your CSS to customize the theme:\n *\n * @example\n * ```css\n * :root {\n * --hustle-color-bg-primary: #ffffff;\n * --hustle-color-text-primary: #1a1a1a;\n * }\n * ```\n */\n\n// ============================================================================\n// Default Token Values\n// ============================================================================\nconst defaults = {\n colors: {\n // Backgrounds\n bgPrimary: '#0b0d10',\n bgSecondary: '#12161b',\n bgTertiary: '#1a1f25',\n bgHover: '#252b33',\n bgOverlay: 'rgba(0, 0, 0, 0.7)',\n\n // Borders\n borderPrimary: '#222b35',\n borderSecondary: '#333',\n borderHover: '#444',\n\n // Text\n textPrimary: '#e6eef8',\n textSecondary: '#8892a4',\n textTertiary: '#6b7280',\n textInverse: '#fff',\n\n // Accent - Primary (blue)\n accentPrimary: '#4c9aff',\n accentPrimaryHover: '#7bb6ff',\n accentPrimaryBg: 'rgba(76, 154, 255, 0.1)',\n\n // Accent - Success (green)\n accentSuccess: '#10b981',\n accentSuccessHover: '#34d399',\n accentSuccessBg: 'rgba(16, 185, 129, 0.1)',\n\n // Accent - Warning (yellow/orange)\n accentWarning: '#f59e0b',\n accentWarningBg: 'rgba(245, 158, 11, 0.1)',\n\n // Accent - Error (red)\n accentError: '#dc2626',\n accentErrorHover: '#ef4444',\n accentErrorBg: 'rgba(239, 68, 68, 0.1)',\n\n // Messages\n msgUser: '#1e3a5f',\n msgAssistant: '#1a2633',\n },\n\n typography: {\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontFamilyMono: '\"SF Mono\", Monaco, monospace',\n fontSizeXs: '11px',\n fontSizeSm: '13px',\n fontSizeMd: '14px',\n fontSizeLg: '16px',\n fontSizeXl: '18px',\n fontWeightNormal: '400',\n fontWeightMedium: '500',\n fontWeightSemibold: '600',\n lineHeightTight: '1.3',\n lineHeightNormal: '1.5',\n lineHeightRelaxed: '1.7',\n },\n\n spacing: {\n xs: '4px',\n sm: '8px',\n md: '12px',\n lg: '16px',\n xl: '20px',\n xxl: '24px',\n },\n\n radius: {\n sm: '4px',\n md: '6px',\n lg: '8px',\n xl: '12px',\n pill: '20px',\n full: '50%',\n },\n\n shadows: {\n sm: '0 2px 8px rgba(0,0,0,0.2)',\n md: '0 4px 16px rgba(0,0,0,0.3)',\n lg: '0 8px 32px rgba(0,0,0,0.4)',\n xl: '0 16px 48px rgba(0,0,0,0.5)',\n },\n\n // Glow effects (for enhanced themes)\n glows: {\n primary: 'rgba(76, 154, 255, 0.4)',\n success: 'rgba(16, 185, 129, 0.4)',\n error: 'rgba(239, 68, 68, 0.4)',\n ambient: 'rgba(76, 154, 255, 0.08)',\n },\n\n transitions: {\n fast: '0.15s ease',\n normal: '0.2s ease',\n slow: '0.3s ease',\n },\n\n zIndex: {\n dropdown: '100',\n modal: '1000',\n fullscreen: '1000',\n modalOverFullscreen: '10000',\n },\n};\n\n// ============================================================================\n// CSS Variable Name Generator\n// ============================================================================\nfunction toVarName(category: string, key: string): string {\n // Convert camelCase to kebab-case\n const kebab = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `--hustle-${category}-${kebab}`;\n}\n\n// ============================================================================\n// CSS Variables Stylesheet (inject this once in your app)\n// ============================================================================\nfunction generateCSSVariables(): string {\n const lines: string[] = [':root {'];\n\n // Colors\n for (const [key, value] of Object.entries(defaults.colors)) {\n lines.push(` ${toVarName('color', key)}: ${value};`);\n }\n\n // Typography\n for (const [key, value] of Object.entries(defaults.typography)) {\n lines.push(` ${toVarName('font', key)}: ${value};`);\n }\n\n // Spacing\n for (const [key, value] of Object.entries(defaults.spacing)) {\n lines.push(` ${toVarName('space', key)}: ${value};`);\n }\n\n // Radius\n for (const [key, value] of Object.entries(defaults.radius)) {\n lines.push(` ${toVarName('radius', key)}: ${value};`);\n }\n\n // Shadows\n for (const [key, value] of Object.entries(defaults.shadows)) {\n lines.push(` ${toVarName('shadow', key)}: ${value};`);\n }\n\n // Glows\n for (const [key, value] of Object.entries(defaults.glows)) {\n lines.push(` ${toVarName('glow', key)}: ${value};`);\n }\n\n // Transitions\n for (const [key, value] of Object.entries(defaults.transitions)) {\n lines.push(` ${toVarName('transition', key)}: ${value};`);\n }\n\n // Z-Index\n for (const [key, value] of Object.entries(defaults.zIndex)) {\n lines.push(` ${toVarName('z', key)}: ${value};`);\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n/**\n * CSS Variables stylesheet - inject this in your app's <head> or include in your CSS\n * Contains all default token values as CSS custom properties\n */\nexport const cssVariables = generateCSSVariables();\n\n// ============================================================================\n// Token Accessors (use CSS var() with fallback to default)\n// ============================================================================\nfunction createColorTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.colors)) {\n result[key] = `var(${toVarName('color', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.colors;\n}\n\nfunction createTypographyTokens() {\n const result: Record<string, string | number> = {};\n for (const [key, defaultValue] of Object.entries(defaults.typography)) {\n result[key] = `var(${toVarName('font', key)}, ${defaultValue})`;\n }\n return result as unknown as {\n fontFamily: string;\n fontFamilyMono: string;\n fontSizeXs: string;\n fontSizeSm: string;\n fontSizeMd: string;\n fontSizeLg: string;\n fontSizeXl: string;\n fontWeightNormal: number;\n fontWeightMedium: number;\n fontWeightSemibold: number;\n lineHeightTight: number;\n lineHeightNormal: number;\n lineHeightRelaxed: number;\n };\n}\n\nfunction createSpacingTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.spacing)) {\n result[key] = `var(${toVarName('space', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.spacing;\n}\n\nfunction createRadiusTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.radius)) {\n result[key] = `var(${toVarName('radius', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.radius;\n}\n\nfunction createShadowTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.shadows)) {\n result[key] = `var(${toVarName('shadow', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.shadows;\n}\n\nfunction createGlowTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.glows)) {\n result[key] = `var(${toVarName('glow', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.glows;\n}\n\nfunction createTransitionTokens() {\n const result: Record<string, string> = {};\n for (const [key, defaultValue] of Object.entries(defaults.transitions)) {\n result[key] = `var(${toVarName('transition', key)}, ${defaultValue})`;\n }\n return result as typeof defaults.transitions;\n}\n\nfunction createZIndexTokens() {\n const result: Record<string, number> = {};\n for (const [key, defaultValue] of Object.entries(defaults.zIndex)) {\n // z-index needs to be a number for React inline styles\n // We keep the default value as number, CSS var override still works\n result[key] = parseInt(defaultValue, 10);\n }\n return result as { dropdown: number; modal: number; fullscreen: number; modalOverFullscreen: number };\n}\n\n// ============================================================================\n// Exported Tokens (use these in components)\n// ============================================================================\nexport const tokens = {\n colors: createColorTokens(),\n typography: createTypographyTokens(),\n spacing: createSpacingTokens(),\n radius: createRadiusTokens(),\n shadows: createShadowTokens(),\n glows: createGlowTokens(),\n transitions: createTransitionTokens(),\n zIndex: createZIndexTokens(),\n};\n\nexport type Tokens = typeof tokens;\n\n/**\n * Raw default values (without CSS var() wrapper)\n * Use this if you need the actual values, not CSS variable references\n */\nexport const defaultTokens = defaults;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get a token value by path (e.g., 'colors.bgPrimary')\n */\nexport function getTokenValue(path: string): string | number | undefined {\n const parts = path.split('.');\n let current: unknown = tokens;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current as string | number | undefined;\n}\n\n/**\n * Create a themed style object\n */\nexport function createStyle(mapping: Record<string, string>): React.CSSProperties {\n const result: Record<string, unknown> = {};\n\n for (const [cssProp, tokenPath] of Object.entries(mapping)) {\n const value = getTokenValue(tokenPath);\n if (value !== undefined) {\n result[cssProp] = value;\n }\n }\n\n return result as React.CSSProperties;\n}\n\n// ============================================================================\n// Common Style Presets\n// ============================================================================\nexport const presets = {\n base: {\n fontFamily: tokens.typography.fontFamily,\n fontSize: tokens.typography.fontSizeMd,\n lineHeight: tokens.typography.lineHeightNormal,\n color: tokens.colors.textPrimary,\n } as React.CSSProperties,\n\n card: {\n background: tokens.colors.bgSecondary,\n border: `1px solid ${tokens.colors.borderPrimary}`,\n borderRadius: tokens.radius.xl,\n } as React.CSSProperties,\n\n input: {\n background: tokens.colors.bgTertiary,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n color: tokens.colors.textPrimary,\n fontSize: tokens.typography.fontSizeMd,\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n outline: 'none',\n transition: `border-color ${tokens.transitions.normal}`,\n } as React.CSSProperties,\n\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: tokens.spacing.sm,\n padding: `${tokens.spacing.sm} ${tokens.spacing.lg}`,\n borderRadius: tokens.radius.lg,\n fontSize: tokens.typography.fontSizeMd,\n fontWeight: tokens.typography.fontWeightMedium,\n cursor: 'pointer',\n transition: `all ${tokens.transitions.normal}`,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n outline: 'none',\n } as React.CSSProperties,\n\n buttonPrimary: {\n background: tokens.colors.accentPrimary,\n color: tokens.colors.textInverse,\n borderColor: tokens.colors.accentPrimary,\n } as React.CSSProperties,\n\n buttonSecondary: {\n background: tokens.colors.bgTertiary,\n color: tokens.colors.textPrimary,\n borderColor: tokens.colors.borderSecondary,\n } as React.CSSProperties,\n\n buttonIcon: {\n width: '36px',\n height: '36px',\n padding: 0,\n // background inherited from global button styles\n color: tokens.colors.textSecondary,\n } as React.CSSProperties,\n\n mono: {\n fontFamily: tokens.typography.fontFamilyMono,\n fontSize: tokens.typography.fontSizeSm,\n } as React.CSSProperties,\n\n label: {\n display: 'block',\n fontSize: tokens.typography.fontSizeXs,\n color: tokens.colors.textTertiary,\n marginBottom: tokens.spacing.xs,\n } as React.CSSProperties,\n};\n\n// ============================================================================\n// Animation Keyframes\n// ============================================================================\n\n/**\n * Animation keyframes only (no CSS variable defaults)\n * Use this in components to avoid overriding consumer theme customizations\n */\nexport const animations = `\n@keyframes hustle-spin {\n to { transform: rotate(360deg); }\n}\n@keyframes hustle-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n}\n@keyframes hustle-glow {\n 0%, 100% {\n opacity: 1;\n text-shadow: 0 0 4px ${defaults.colors.accentPrimaryBg};\n }\n 50% {\n opacity: 0.6;\n text-shadow: 0 0 8px ${defaults.colors.accentPrimary};\n }\n}\n`;\n\n/**\n * @deprecated Use `animations` instead. This includes CSS variable defaults\n * which can override consumer theme customizations.\n */\nexport const keyframes = `\n${cssVariables}\n${animations}\n`;\n\nexport default tokens;\n","'use client';\n\nimport React, { useCallback, useState } from 'react';\nimport { useEmblemAuth } from '../providers/EmblemAuthProvider';\nimport { tokens, presets, animations } from '../styles';\n\n/**\n * Props for ConnectButton component\n */\nexport interface ConnectButtonProps {\n /** Additional CSS classes */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Custom content when disconnected */\n connectLabel?: React.ReactNode;\n /** Custom content while loading */\n loadingLabel?: React.ReactNode;\n /** Callback after successful connection */\n onConnect?: () => void;\n /** Callback after disconnection */\n onDisconnect?: () => void;\n /** Show vault info dropdown when connected */\n showVaultInfo?: boolean;\n /** Disable the button */\n disabled?: boolean;\n}\n\n/**\n * Truncate wallet address for display\n */\nfunction truncateAddress(address: string): string {\n if (!address || address.length < 10) return address || '';\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Copy text to clipboard\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n\n// Styles using design tokens\nconst styles = {\n wrapper: {\n position: 'relative' as const,\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n },\n\n button: {\n ...presets.button,\n padding: `${tokens.spacing.sm} ${tokens.spacing.xl}`,\n } as React.CSSProperties,\n\n disconnected: {\n background: tokens.colors.bgTertiary,\n color: tokens.colors.textPrimary,\n borderColor: tokens.colors.borderSecondary,\n } as React.CSSProperties,\n\n disconnectedHover: {\n background: tokens.colors.bgHover,\n borderColor: tokens.colors.borderHover,\n } as React.CSSProperties,\n\n connected: {\n background: 'transparent',\n color: tokens.colors.accentSuccess,\n borderColor: tokens.colors.accentSuccess,\n borderRadius: tokens.radius.pill,\n } as React.CSSProperties,\n\n connectedHover: {\n background: tokens.colors.accentSuccessBg,\n } as React.CSSProperties,\n\n loading: {\n background: tokens.colors.borderSecondary,\n color: tokens.colors.textSecondary,\n cursor: 'wait',\n } as React.CSSProperties,\n\n disabled: {\n background: tokens.colors.borderSecondary,\n color: tokens.colors.textTertiary,\n cursor: 'not-allowed',\n opacity: 0.5,\n } as React.CSSProperties,\n\n icon: {\n fontSize: tokens.typography.fontSizeLg,\n } as React.CSSProperties,\n\n spinner: {\n display: 'inline-block',\n width: '14px',\n height: '14px',\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: tokens.radius.full,\n animation: 'hustle-spin 0.8s linear infinite',\n } as React.CSSProperties,\n\n address: {\n ...presets.mono,\n color: tokens.colors.textPrimary,\n } as React.CSSProperties,\n\n dot: {\n color: tokens.colors.textSecondary,\n } as React.CSSProperties,\n\n check: {\n color: tokens.colors.accentSuccess,\n } as React.CSSProperties,\n\n arrow: {\n fontSize: '10px',\n color: tokens.colors.textSecondary,\n marginLeft: tokens.spacing.xs,\n } as React.CSSProperties,\n\n // Disconnect button\n disconnectBtn: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '36px',\n height: '36px',\n background: 'transparent',\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n color: tokens.colors.textSecondary,\n cursor: 'pointer',\n fontSize: '16px',\n transition: `all ${tokens.transitions.normal}`,\n } as React.CSSProperties,\n\n disconnectBtnHover: {\n borderColor: tokens.colors.accentError,\n color: tokens.colors.accentError,\n } as React.CSSProperties,\n\n // Vault info dropdown\n dropdown: {\n position: 'absolute' as const,\n top: '100%',\n left: 0,\n marginTop: tokens.spacing.xs,\n background: tokens.colors.bgPrimary,\n border: `1px solid ${tokens.colors.accentSuccess}`,\n borderRadius: tokens.radius.xl,\n padding: tokens.spacing.lg,\n minWidth: '300px',\n zIndex: tokens.zIndex.dropdown,\n boxShadow: `0 8px 32px rgba(0,0,0,0.4), 0 0 0 1px ${tokens.colors.accentSuccessBg}`,\n },\n\n dropdownHeader: {\n fontSize: tokens.typography.fontSizeXs,\n fontWeight: tokens.typography.fontWeightSemibold,\n color: tokens.colors.textSecondary,\n letterSpacing: '0.5px',\n marginBottom: tokens.spacing.lg,\n textTransform: 'uppercase' as const,\n },\n\n dropdownRow: {\n marginBottom: tokens.spacing.md,\n },\n\n dropdownLabel: {\n display: 'block',\n fontSize: tokens.typography.fontSizeXs,\n color: tokens.colors.textTertiary,\n marginBottom: tokens.spacing.xs,\n },\n\n dropdownValueRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: tokens.spacing.sm,\n },\n\n dropdownValue: {\n fontSize: tokens.typography.fontSizeMd,\n color: tokens.colors.textPrimary,\n fontWeight: tokens.typography.fontWeightMedium,\n flex: 1,\n },\n\n dropdownValueMono: {\n ...presets.mono,\n wordBreak: 'break-all' as const,\n },\n\n copyBtn: {\n background: 'transparent',\n border: `1px solid ${tokens.colors.borderSecondary}`,\n color: tokens.colors.textSecondary,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n borderRadius: tokens.radius.sm,\n cursor: 'pointer',\n fontSize: tokens.typography.fontSizeXs,\n transition: `all ${tokens.transitions.normal}`,\n whiteSpace: 'nowrap' as const,\n },\n\n copyBtnHover: {\n background: tokens.colors.bgHover,\n borderColor: tokens.colors.accentPrimary,\n color: tokens.colors.accentPrimary,\n },\n\n copyBtnCopied: {\n background: tokens.colors.accentSuccess,\n borderColor: tokens.colors.accentSuccess,\n color: tokens.colors.textInverse,\n },\n};\n\n/**\n * ConnectButton - A button to trigger Emblem Auth connection\n * When connected, shows vault info dropdown and separate disconnect button\n */\nexport function ConnectButton({\n className = '',\n style,\n connectLabel = 'Connect',\n loadingLabel = 'Connecting...',\n onConnect,\n onDisconnect,\n showVaultInfo = true,\n disabled = false,\n}: ConnectButtonProps) {\n const {\n isAuthenticated,\n isLoading,\n walletAddress,\n vaultId,\n openAuthModal,\n logout,\n } = useEmblemAuth();\n\n const [isHovered, setIsHovered] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [disconnectHovered, setDisconnectHovered] = useState(false);\n const [copiedField, setCopiedField] = useState<string | null>(null);\n const [copyHovered, setCopyHovered] = useState<string | null>(null);\n\n const handleClick = useCallback(async () => {\n if (disabled) return;\n\n if (!isAuthenticated && !isLoading) {\n await openAuthModal();\n onConnect?.();\n }\n // When connected, clicking toggles dropdown (handled by hover)\n }, [disabled, isAuthenticated, isLoading, openAuthModal, onConnect]);\n\n const handleDisconnect = useCallback(() => {\n logout();\n onDisconnect?.();\n setShowDropdown(false);\n }, [logout, onDisconnect]);\n\n const handleCopy = useCallback(async (field: string, value: string) => {\n const success = await copyToClipboard(value);\n if (success) {\n setCopiedField(field);\n setTimeout(() => setCopiedField(null), 1500);\n }\n }, []);\n\n // Build style based on state\n let buttonStyle: React.CSSProperties = { ...styles.button };\n let content: React.ReactNode = connectLabel;\n\n if (disabled) {\n buttonStyle = { ...buttonStyle, ...styles.disconnected, ...styles.disabled };\n } else if (isLoading) {\n buttonStyle = { ...buttonStyle, ...styles.disconnected, ...styles.loading };\n content = (\n <>\n <span style={styles.spinner} />\n {loadingLabel}\n </>\n );\n } else if (isAuthenticated) {\n buttonStyle = { ...buttonStyle, ...styles.connected };\n if (isHovered || showDropdown) {\n buttonStyle = { ...buttonStyle, ...styles.connectedHover };\n }\n const truncated = truncateAddress(walletAddress || '');\n\n content = (\n <>\n <span style={styles.check}>✓</span>\n <span>Connected</span>\n <span style={styles.dot}>•</span>\n <span style={styles.address}>{truncated}</span>\n <span style={styles.arrow}>▾</span>\n </>\n );\n } else {\n buttonStyle = { ...buttonStyle, ...styles.disconnected };\n if (isHovered) {\n buttonStyle = { ...buttonStyle, ...styles.disconnectedHover };\n }\n content = (\n <>\n <span style={styles.icon}>→</span>\n {connectLabel}\n </>\n );\n }\n\n // Merge with passed style\n if (style) {\n buttonStyle = { ...buttonStyle, ...style };\n }\n\n // Render copy button helper\n const renderCopyBtn = (field: string, value: string) => {\n const isCopied = copiedField === field;\n const isHover = copyHovered === field;\n return (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); handleCopy(field, value); }}\n style={{\n ...styles.copyBtn,\n ...(isCopied ? styles.copyBtnCopied : isHover ? styles.copyBtnHover : {}),\n }}\n onMouseEnter={() => setCopyHovered(field)}\n onMouseLeave={() => setCopyHovered(null)}\n >\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n );\n };\n\n return (\n <>\n <style>{animations}</style>\n <div\n style={styles.wrapper}\n onMouseEnter={() => isAuthenticated && showVaultInfo && setShowDropdown(true)}\n onMouseLeave={() => setShowDropdown(false)}\n >\n {/* Main button */}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isLoading}\n className={className}\n style={buttonStyle}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {content}\n </button>\n\n {/* Disconnect button (only when authenticated) */}\n {isAuthenticated && (\n <button\n type=\"button\"\n onClick={handleDisconnect}\n style={{\n ...styles.disconnectBtn,\n ...(disconnectHovered ? styles.disconnectBtnHover : {}),\n }}\n onMouseEnter={() => setDisconnectHovered(true)}\n onMouseLeave={() => setDisconnectHovered(false)}\n title=\"Disconnect\"\n >\n ⏻\n </button>\n )}\n\n {/* Vault info dropdown */}\n {isAuthenticated && showVaultInfo && showDropdown && (\n <div style={styles.dropdown}>\n <div style={styles.dropdownHeader}>Vault Information</div>\n\n {/* Vault ID */}\n <div style={styles.dropdownRow}>\n <span style={styles.dropdownLabel}>Vault ID</span>\n <div style={styles.dropdownValueRow}>\n <span style={styles.dropdownValue}>#{vaultId}</span>\n {renderCopyBtn('vaultId', vaultId || '')}\n </div>\n </div>\n\n {/* Connected Wallet */}\n <div style={{ ...styles.dropdownRow, marginBottom: 0 }}>\n <span style={styles.dropdownLabel}>Connected Wallet</span>\n <div style={styles.dropdownValueRow}>\n <span style={{ ...styles.dropdownValue, ...styles.dropdownValueMono }}>\n {walletAddress}\n </span>\n {renderCopyBtn('wallet', walletAddress || '')}\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n );\n}\n\nexport default ConnectButton;\n","'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { useEmblemAuth } from '../providers/EmblemAuthProvider';\nimport { tokens, presets, animations } from '../styles';\n\n/**\n * Props for AuthStatus component\n */\nexport interface AuthStatusProps {\n /** Additional CSS classes */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Show expandable vault details */\n showVaultInfo?: boolean;\n /** Show logout button */\n showLogout?: boolean;\n}\n\n/**\n * Truncate address for display\n */\nfunction truncateAddress(address: string): string {\n if (!address || address.length < 10) return address || '';\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Copy text to clipboard\n */\nasync function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n\n// Styles using design tokens\nconst s = {\n container: {\n position: 'relative' as const,\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n fontFamily: tokens.typography.fontFamily,\n },\n disconnected: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n color: tokens.colors.textSecondary,\n fontSize: tokens.typography.fontSizeMd,\n },\n dot: {\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: tokens.radius.full,\n backgroundColor: tokens.colors.textTertiary,\n },\n dotConnected: {\n backgroundColor: tokens.colors.accentSuccess,\n },\n spinner: {\n display: 'inline-block',\n width: '12px',\n height: '12px',\n border: `2px solid ${tokens.colors.textSecondary}`,\n borderTopColor: 'transparent',\n borderRadius: tokens.radius.full,\n animation: 'hustle-spin 0.8s linear infinite',\n },\n logoutBtn: {\n ...presets.buttonIcon,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n transition: `all ${tokens.transitions.normal}`,\n } as React.CSSProperties,\n logoutBtnHover: {\n borderColor: tokens.colors.accentError,\n color: tokens.colors.accentError,\n },\n vaultInfoWrapper: {\n position: 'relative' as const,\n },\n vaultInfo: {\n position: 'absolute' as const,\n top: '100%',\n right: 0,\n marginTop: tokens.spacing.sm,\n background: tokens.colors.bgSecondary,\n border: `1px solid ${tokens.colors.borderPrimary}`,\n borderRadius: tokens.radius.xl,\n padding: tokens.spacing.lg,\n minWidth: '380px',\n zIndex: tokens.zIndex.dropdown,\n boxShadow: tokens.shadows.lg,\n },\n vaultInfoHeader: {\n fontSize: tokens.typography.fontSizeXs,\n fontWeight: tokens.typography.fontWeightSemibold,\n color: tokens.colors.textSecondary,\n letterSpacing: '0.5px',\n marginBottom: tokens.spacing.lg,\n textTransform: 'uppercase' as const,\n },\n vaultInfoRow: {\n marginBottom: tokens.spacing.md,\n },\n vaultLabel: {\n display: 'block',\n fontSize: '12px',\n color: tokens.colors.textTertiary,\n marginBottom: tokens.spacing.xs,\n },\n vaultValueRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: tokens.spacing.sm,\n },\n vaultValue: {\n fontSize: tokens.typography.fontSizeMd,\n color: tokens.colors.textPrimary,\n fontWeight: tokens.typography.fontWeightMedium,\n flex: 1,\n },\n vaultValueMono: {\n ...presets.mono,\n wordBreak: 'break-all' as const,\n },\n copyBtn: {\n background: 'transparent',\n border: `1px solid ${tokens.colors.borderSecondary}`,\n color: tokens.colors.textSecondary,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n borderRadius: tokens.radius.sm,\n cursor: 'pointer',\n fontSize: tokens.typography.fontSizeXs,\n transition: `all ${tokens.transitions.normal}`,\n whiteSpace: 'nowrap' as const,\n },\n copyBtnHover: {\n background: tokens.colors.bgHover,\n borderColor: tokens.colors.accentPrimary,\n color: tokens.colors.accentPrimary,\n },\n copyBtnCopied: {\n background: tokens.colors.accentSuccess,\n borderColor: tokens.colors.accentSuccess,\n color: tokens.colors.textInverse,\n },\n};\n\n/**\n * AuthStatus - Displays current authentication status and vault info\n */\nexport function AuthStatus({\n className = '',\n style,\n showVaultInfo = false,\n showLogout = false,\n}: AuthStatusProps) {\n const {\n isAuthenticated,\n isLoading,\n walletAddress,\n vaultId,\n vaultInfo,\n logout,\n } = useEmblemAuth();\n\n const [isHovered, setIsHovered] = useState(false);\n const [logoutHovered, setLogoutHovered] = useState(false);\n const [copiedField, setCopiedField] = useState<string | null>(null);\n const [copyHovered, setCopyHovered] = useState<string | null>(null);\n\n const handleCopy = useCallback(async (field: string, value: string) => {\n const success = await copyToClipboard(value);\n if (success) {\n setCopiedField(field);\n setTimeout(() => setCopiedField(null), 1500);\n }\n }, []);\n\n // Not authenticated\n if (!isAuthenticated) {\n if (isLoading) {\n return (\n <>\n <style>{animations}</style>\n <div className={className} style={{ ...s.disconnected, ...style }}>\n <span style={s.spinner} />\n <span>Connecting...</span>\n </div>\n </>\n );\n }\n\n return (\n <div className={className} style={{ ...s.disconnected, ...style }}>\n <span style={s.dot} />\n <span>Not connected</span>\n </div>\n );\n }\n\n // Authenticated\n return (\n <>\n <style>{animations}</style>\n <div className={className} style={{ ...s.container, ...style }}>\n {/* Vault info wrapper for hover effect */}\n <div\n style={s.vaultInfoWrapper}\n onMouseEnter={() => showVaultInfo && setIsHovered(true)}\n onMouseLeave={() => showVaultInfo && setIsHovered(false)}\n >\n {/* Connected indicator - just a dot */}\n <span style={{ ...s.dot, ...s.dotConnected }} title=\"Connected\" />\n\n {/* Vault info dropdown on hover */}\n {showVaultInfo && isHovered && (\n <div style={s.vaultInfo}>\n <div style={s.vaultInfoHeader}>Vault Information</div>\n\n {/* Vault ID */}\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Vault ID</span>\n <div style={s.vaultValueRow}>\n <span style={s.vaultValue}>#{vaultId}</span>\n <CopyButton\n field=\"vaultId\"\n value={vaultId || ''}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n\n {/* Connected Wallet */}\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Connected Wallet</span>\n <div style={s.vaultValueRow}>\n <span style={{ ...s.vaultValue, ...s.vaultValueMono }}>{walletAddress}</span>\n <CopyButton\n field=\"wallet\"\n value={walletAddress || ''}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n\n {/* EVM Address */}\n {vaultInfo?.evmAddress && (\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Vault EVM Address</span>\n <div style={s.vaultValueRow}>\n <span style={{ ...s.vaultValue, ...s.vaultValueMono }}>{vaultInfo.evmAddress}</span>\n <CopyButton\n field=\"evmAddress\"\n value={vaultInfo.evmAddress}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n )}\n\n {/* Solana Address */}\n {vaultInfo?.solanaAddress && (\n <div style={s.vaultInfoRow}>\n <span style={s.vaultLabel}>Vault Solana Address</span>\n <div style={s.vaultValueRow}>\n <span style={{ ...s.vaultValue, ...s.vaultValueMono }}>{vaultInfo.solanaAddress}</span>\n <CopyButton\n field=\"solAddress\"\n value={vaultInfo.solanaAddress}\n copiedField={copiedField}\n copyHovered={copyHovered}\n setCopyHovered={setCopyHovered}\n onCopy={handleCopy}\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Logout button */}\n {showLogout && (\n <button\n type=\"button\"\n onClick={logout}\n style={{\n ...s.logoutBtn,\n ...(logoutHovered ? s.logoutBtnHover : {}),\n }}\n onMouseEnter={() => setLogoutHovered(true)}\n onMouseLeave={() => setLogoutHovered(false)}\n title=\"Disconnect\"\n >\n ⏻\n </button>\n )}\n </div>\n </>\n );\n}\n\n// Copy button helper\ninterface CopyButtonProps {\n field: string;\n value: string;\n copiedField: string | null;\n copyHovered: string | null;\n setCopyHovered: (field: string | null) => void;\n onCopy: (field: string, value: string) => void;\n}\n\nfunction CopyButton({ field, value, copiedField, copyHovered, setCopyHovered, onCopy }: CopyButtonProps) {\n const isCopied = copiedField === field;\n const isHovered = copyHovered === field;\n\n return (\n <button\n type=\"button\"\n onClick={() => onCopy(field, value)}\n style={{\n ...s.copyBtn,\n ...(isCopied ? s.copyBtnCopied : isHovered ? s.copyBtnHover : {}),\n }}\n onMouseEnter={() => setCopyHovered(field)}\n onMouseLeave={() => setCopyHovered(null)}\n >\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n );\n}\n\nexport default AuthStatus;\n","/**\n* Prediction Market Alpha Plugin\n*\n* Provides AI tools for searching and analyzing prediction markets\n* using the Dome API (https://api.domeapi.io)\n*\n* Supported platforms: Polymarket, Kalshi\n* \n* Get specific market details:\n* - \"Get details on the [market-slug] market\"\n* - \"Tell me more about that Bitcoin prediction market\"\n*\n* Get prices/odds:\n* - \"What are the current odds on [market]?\"\n* - \"What's the probability showing for [market]?\"\n*\n* Get trading activity:\n* - \"Show me recent trades on that market\"\n* - \"What's the trading activity like?\"\n* - \"What prediction market platforms are supported?\"\n* - \"Search Kalshi for markets about crypto\"\n* - \"Show me prediction markets on Polymarket about politics\"\n* - \"Get details on [ticker] from Kalshi\" \n */\n\nimport type { HustlePlugin } from '../types';\n\nconst DOME_API_BASE = 'https://api.domeapi.io/v1';\n\n/**\n * Supported prediction market platforms\n */\ntype Platform = 'polymarket' | 'kalshi';\n\n/**\n * Prediction Market Alpha Plugin\n *\n * Tools:\n * - get_supported_platforms: List supported prediction market platforms\n * - search_prediction_markets: Search for markets on Polymarket or Kalshi\n * - get_market_details: Get detailed info about a specific market\n * - get_market_prices: Get current prices/odds for a market\n * - get_market_trades: Get recent trading activity\n */\nexport const predictionMarketPlugin: HustlePlugin = {\n name: 'prediction-market-alpha',\n version: '1.1.0',\n description: 'Search and analyze prediction markets on Polymarket and Kalshi',\n\n tools: [\n {\n name: 'get_supported_platforms',\n description:\n 'Get a list of supported prediction market platforms. Call this first to know which platforms are available for querying.',\n parameters: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'search_prediction_markets',\n description:\n 'Search for prediction markets. Find markets about politics, crypto, sports, and more. Returns market titles, current odds, volume, and status. You MUST provide tags to filter results.',\n parameters: {\n type: 'object',\n properties: {\n platform: {\n type: 'string',\n enum: ['polymarket', 'kalshi'],\n description: 'The prediction market platform to search (default: polymarket)',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'REQUIRED: Single word categories or tags to identify a market segment (e.g., \"politics\", \"crypto\", \"sports\", \"finance\", \"entertainment\", \"ai\")',\n },\n status: {\n type: 'string',\n enum: ['open', 'closed'],\n description: 'Filter by market status',\n },\n limit: {\n type: 'number',\n description: 'Number of results (1-100)',\n default: 10,\n },\n },\n required: ['tags'],\n },\n },\n {\n name: 'get_market_details',\n description:\n 'Get detailed information about a specific prediction market including current prices, trading history, and resolution source.',\n parameters: {\n type: 'object',\n properties: {\n platform: {\n type: 'string',\n enum: ['polymarket', 'kalshi'],\n description: 'The prediction market platform (default: polymarket)',\n },\n market_slug: {\n type: 'string',\n description: 'The market slug/identifier (ticker for Kalshi)',\n },\n },\n required: ['market_slug'],\n },\n },\n {\n name: 'get_market_prices',\n description:\n 'Get current prices/odds for a prediction market. Shows probability for each outcome.',\n parameters: {\n type: 'object',\n properties: {\n platform: {\n type: 'string',\n enum: ['polymarket', 'kalshi'],\n description: 'The prediction market platform (default: polymarket)',\n },\n market_slug: {\n type: 'string',\n description: 'The market slug/identifier (ticker for Kalshi)',\n },\n },\n required: ['market_slug'],\n },\n },\n {\n name: 'get_market_trades',\n description: 'Get recent orders/trading activity for a prediction market.',\n parameters: {\n type: 'object',\n properties: {\n platform: {\n type: 'string',\n enum: ['polymarket', 'kalshi'],\n description: 'The prediction market platform (default: polymarket)',\n },\n market_slug: {\n type: 'string',\n description: 'The market slug/identifier (ticker for Kalshi)',\n },\n limit: {\n type: 'number',\n description: 'Number of orders to return (max 100)',\n default: 20,\n },\n },\n required: ['market_slug'],\n },\n },\n ],\n\n executors: {\n get_supported_platforms: async () => {\n return {\n platforms: [\n {\n id: 'polymarket',\n name: 'Polymarket',\n description: 'Decentralized prediction market on Polygon',\n features: ['tags', 'volume_filtering'],\n },\n {\n id: 'kalshi',\n name: 'Kalshi',\n description: 'CFTC-regulated prediction market exchange',\n features: ['regulated', 'event_based'],\n },\n ],\n };\n },\n\n search_prediction_markets: async (args) => {\n const platform = (args.platform as Platform) || 'polymarket';\n const params = new URLSearchParams();\n\n if (args.limit) params.append('limit', String(args.limit));\n\n if (platform === 'polymarket') {\n if (args.tags) params.append('tags', (args.tags as string[]).join(','));\n if (args.status) params.append('status', args.status as string);\n\n const response = await fetch(`${DOME_API_BASE}/polymarket/markets?${params}`);\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n return {\n platform: 'polymarket',\n markets: data.markets?.map((m: Record<string, unknown>) => ({\n slug: m.market_slug,\n title: m.title,\n status: m.status,\n volume: m.volume_total,\n tags: m.tags,\n outcomes: [\n { label: (m.side_a as Record<string, unknown>)?.label, id: (m.side_a as Record<string, unknown>)?.id },\n { label: (m.side_b as Record<string, unknown>)?.label, id: (m.side_b as Record<string, unknown>)?.id },\n ],\n winner: m.winning_side,\n })) || [],\n total: data.pagination?.total || 0,\n hasMore: data.pagination?.has_more || false,\n };\n } else if (platform === 'kalshi') {\n if (args.status) params.append('status', args.status as string);\n\n const response = await fetch(`${DOME_API_BASE}/kalshi/markets?${params}`);\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n\n return {\n platform: 'kalshi',\n markets: data.markets?.map((m: Record<string, unknown>) => ({\n ticker: m.ticker,\n title: m.title,\n status: m.status,\n category: m.category,\n subtitle: m.subtitle,\n yesAsk: m.yes_ask,\n yesBid: m.yes_bid,\n volume: m.volume,\n })) || [],\n total: data.pagination?.total || 0,\n hasMore: data.pagination?.has_more || false,\n };\n }\n\n throw new Error(`Unsupported platform: ${platform}`);\n },\n\n get_market_details: async (args) => {\n const platform = (args.platform as Platform) || 'polymarket';\n\n if (platform === 'polymarket') {\n const response = await fetch(\n `${DOME_API_BASE}/polymarket/markets?market_slug=${args.market_slug}`\n );\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n const market = data.markets?.[0];\n\n if (!market) {\n throw new Error(`Market not found: ${args.market_slug}`);\n }\n\n return {\n platform: 'polymarket',\n slug: market.market_slug,\n title: market.title,\n status: market.status,\n startTime: market.start_time\n ? new Date(market.start_time * 1000).toISOString()\n : null,\n endTime: market.end_time\n ? new Date(market.end_time * 1000).toISOString()\n : null,\n volume: {\n total: market.volume_total,\n week: market.volume_1_week,\n month: market.volume_1_month,\n },\n resolutionSource: market.resolution_source,\n outcomes: [\n { label: market.side_a?.label, id: market.side_a?.id },\n { label: market.side_b?.label, id: market.side_b?.id },\n ],\n winner: market.winning_side,\n tags: market.tags,\n };\n } else if (platform === 'kalshi') {\n const response = await fetch(\n `${DOME_API_BASE}/kalshi/markets?ticker=${args.market_slug}`\n );\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n const market = data.markets?.[0];\n\n if (!market) {\n throw new Error(`Market not found: ${args.market_slug}`);\n }\n\n return {\n platform: 'kalshi',\n ticker: market.ticker,\n title: market.title,\n subtitle: market.subtitle,\n status: market.status,\n category: market.category,\n yesAsk: market.yes_ask,\n yesBid: market.yes_bid,\n volume: market.volume,\n openInterest: market.open_interest,\n };\n }\n\n throw new Error(`Unsupported platform: ${platform}`);\n },\n\n get_market_prices: async (args) => {\n const platform = (args.platform as Platform) || 'polymarket';\n\n if (platform === 'polymarket') {\n const response = await fetch(\n `${DOME_API_BASE}/polymarket/market-price?market_slug=${args.market_slug}`\n );\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return { platform: 'polymarket', ...data };\n } else if (platform === 'kalshi') {\n // Kalshi prices are included in the market details\n const response = await fetch(\n `${DOME_API_BASE}/kalshi/markets?ticker=${args.market_slug}`\n );\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n const market = data.markets?.[0];\n\n if (!market) {\n throw new Error(`Market not found: ${args.market_slug}`);\n }\n\n return {\n platform: 'kalshi',\n ticker: market.ticker,\n yesAsk: market.yes_ask,\n yesBid: market.yes_bid,\n lastPrice: market.last_price,\n };\n }\n\n throw new Error(`Unsupported platform: ${platform}`);\n },\n\n get_market_trades: async (args) => {\n const platform = (args.platform as Platform) || 'polymarket';\n const limit = String(args.limit || 20);\n\n if (platform === 'polymarket') {\n const params = new URLSearchParams({\n market_slug: args.market_slug as string,\n limit,\n });\n\n const response = await fetch(\n `${DOME_API_BASE}/polymarket/orders?${params}`\n );\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return { platform: 'polymarket', ...data };\n } else if (platform === 'kalshi') {\n const params = new URLSearchParams({\n ticker: args.market_slug as string,\n limit,\n });\n\n const response = await fetch(\n `${DOME_API_BASE}/kalshi/trades?${params}`\n );\n\n if (!response.ok) {\n throw new Error(`Dome API error: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return { platform: 'kalshi', ...data };\n }\n\n throw new Error(`Unsupported platform: ${platform}`);\n },\n },\n\n hooks: {\n onRegister: () => {\n console.log('[Plugin] Prediction Market Alpha v1.1.0 registered (Polymarket + Kalshi)');\n },\n },\n};\n\nexport default predictionMarketPlugin;\n","/**\n * Migrate.fun Knowledge Base Plugin\n *\n * Provides AI tools for answering questions about token migrations\n * using an embedded knowledge base from real support conversations.\n *\n * Supported topics: Bonk Fun, Pump Fun, Raydium migrations,\n * costs/fees, timelines, post-migration steps, technical details.\n *\n * Example prompts:\n * - \"How does a migration to Pump Fun work?\"\n * - \"What does Migrate Fun cost?\"\n * - \"What steps do I need to do after the migration?\"\n * - \"How long is the migration period?\"\n * - \"What is the claim period for migrations?\"\n * - \"Has Migrate Fun been audited?\"\n * - \"What happens to tokens on exchanges during migration?\"\n * - \"Can I change the total supply when migrating?\"\n *\n * System prompt suggestion (for optimal results):\n * You are a support agent for Migrate.fun, the token migration platform on Solana.\n * You have the `search_migrate_fun_docs` tool - ALWAYS use it when users ask about migrations.\n * Key facts: 3.75% fee, 90-day claim period, supports Bonk Fun/Pump Fun/Raydium, audited by Halborn.\n * For complex questions: direct to https://x.com/MigrateFun\n */\n\nimport type { HustlePlugin } from '../types';\n\n/**\n * Q&A entry structure\n */\ninterface QAEntry {\n id: string;\n question: string;\n answer: string;\n keywords: string[];\n category: string;\n}\n\n/**\n * Embedded knowledge base from real support conversations\n */\nconst QA: QAEntry[] = [\n { id: 'migration-steps-bonk', question: 'What are all the steps for migrations to Bonk?', answer: `Here's how MigrateFun migrates your token to BonkFun:\\n1) The creator/team sets up a migration portal through migratefun - Create new CA for BonkFun (Ticker, name, image, supply) and set timeline period (1-30 days, 14 days average)\\n2) After portal setup, holders commit their tokens to migration - tokens are locked in migration vault until time period ends\\n3) Once migration ends, ALL tokens are market sold in a single candle to retrieve as much SOL as possible from the locked liquidity pool\\n4) The recovered SOL seeds the new LP paired with appropriate amount of tokens. Set market cap at or slightly below current market cap\\n5) Claims open for 90 days - users burn MFTs and receive new tokens`, keywords: ['bonk', 'bonkfun', 'steps', 'process', 'how'], category: 'process' },\n { id: 'migration-steps-pumpfun', question: 'How does a migration work to Pump Fun?', answer: `Here's how the migration to Pump Fun works:\\n1) Set up a new CA for pumpfun using MigrateFun creator dashboard (Ticker, CA, image)\\n2) Users migrate their tokens in the migration portal for a specific time period\\n3) Once migration ends, MigrateFun sells all migrated tokens\\n4) MigrateFun takes all recovered SOL and buys out new token's bonding curve + purchases until it reaches old market cap levels\\n5) Users return to migratefun and claim their new tokens\\n6) 90-day claim period for all users, regardless if they migrated on time or late\\n7) The claim period can also be used to swap tokens with centralized exchanges\\n8) After 90 days, all unclaimed tokens and remaining SOL are returned to the team`, keywords: ['pump', 'pumpfun', 'steps', 'process', 'how'], category: 'process' },\n { id: 'migration-steps-raydium', question: 'How does Migrate Fun migrate tokens to Raydium?', answer: `1) The creator/team sets up a migration portal through migratefun.com - Create new CA (Ticker, name, image, supply) and set timeline period (1-30 days, 14 days average)\\n2) After portal setup, holders commit their tokens to migration and get MFTs in exchange - tokens are locked in migration vault until time period ends\\n3) Once migration ends, ALL old tokens are market sold in a single candle to retrieve as much SOL as possible\\n4) The recovered SOL seeds the new LP paired with appropriate amount of new tokens. Market Cap is set by the user\\n5) Claims open for 90 days - users burn MFTs and receive new tokens. Late migrators can swap at discounted rate\\n6) At the end of the 90 day claim window all remaining tokens can be claimed by the team`, keywords: ['raydium', 'steps', 'process', 'how'], category: 'process' },\n { id: 'post-migration-checklist', question: 'What are the steps I need to do after the migration?', answer: `Admin Checklist - places to register your new CA:\\n\\nPRIMARY:\\n- Coingecko (Free + migration application process)\\n- Dexscreener ($300)\\n- GeckoTerminal (free for 5 days wait)\\n- Holderscan (Listing free, Verify $125)\\n\\nSECONDARY:\\n- Solscan (if metadata updates needed)\\n- CoinMarketCap ($5000 for immediate listing)\\n- Dextools ($300 for verification)\\n- Photon (2 SOL)\\n- Cookie.fun (Free, DM needed) [For AI accounts]\\n- Kaito (DM needed) [For AI accounts]\\n\\nNote: Coingecko and CoinMarketCap will ask for a post from official twitter with migration details and new CA.`, keywords: ['after', 'post', 'checklist', 'listing', 'dexscreener', 'coingecko'], category: 'post-migration' },\n { id: 'post-migration-approval', question: 'Do we need to do anything after the migration ends?', answer: `Yes, the team needs to approve several steps in the migration portal including:\\n1) Selling the migrated tokens into the old LP\\n2) Setting the new market cap\\n3) Opening the claim portal\\n\\nVideo tutorial: https://www.youtube.com/watch?v=SjPN-1DnXtM`, keywords: ['after', 'ends', 'approve', 'portal'], category: 'post-migration' },\n { id: 'market-cap-setting', question: 'What market cap should we set?', answer: `Set at or slightly below the ending market cap at migration. For example, if your ending market cap is $1 million, set it to around $950,000. This accounts for the fact you won't receive 1:1 liquidity from the old pool compared to the new pool, which is determined by migration participation.`, keywords: ['market cap', 'marketcap', 'set', 'recommend'], category: 'settings' },\n { id: 'migrate-fun-cost', question: 'What does Migrate Fun cost?', answer: `Migrate Fun charges a flat 3.75% fee on the total SOL unlocked from the old Liquidity Pool. This fee is taken automatically during the migration process.`, keywords: ['cost', 'fee', 'price', 'charge', '3.75', 'percent'], category: 'fees' },\n { id: 'claim-fees-bonk', question: 'How does the team claim their fees on Bonk Fun?', answer: `Go to https://bonk.fun/creator-rewards to claim your creator fees.`, keywords: ['claim', 'fees', 'bonk', 'creator', 'rewards'], category: 'fees' },\n { id: 'claim-fees-raydium', question: 'How do I claim fees on Raydium?', answer: `You can claim fees from https://raydium.io/portfolio/ with the same wallet that set up the migration.`, keywords: ['claim', 'fees', 'raydium', 'portfolio'], category: 'fees' },\n { id: 'claim-fees-pumpfun', question: 'How do I claim fees on Pump Fun?', answer: `Fees are paid automatically to the wallet used to set up the migration. Once migrated to PumpSwap you will receive creator rewards based on their Ascend Program. Details: https://pump.fun/docs/fees`, keywords: ['claim', 'fees', 'pump', 'pumpfun', 'automatic'], category: 'fees' },\n { id: 'audit-info', question: 'Has Migrate Fun been audited?', answer: `Yes. Migrate Fun was audited by Halborn, the same auditing firm used by the Solana Foundation.\\nAudit: https://www.halborn.com/audits/emblem-vault/migratefun-8ad34b\\nAnnouncement: https://x.com/HalbornSecurity/status/1978869642744811933`, keywords: ['audit', 'audited', 'security', 'halborn', 'safe'], category: 'security' },\n { id: 'user-experience', question: 'What is the process like for the user?', answer: `Super easy - takes less than 20 seconds.\\n1) During migration: users swap old tokens for Migrate Fun Tokens (MFTs)\\n2) Once migration ends: claim period opens for 90 days, users burn MFTs to claim new tokens\\n3) Late migrators: can swap old tokens for new at a discounted rate set by the team\\n\\nVideo guides:\\n- Migration: https://x.com/MigrateFun/status/1971259552856408433\\n- Claims: https://x.com/MigrateFun/status/1976376597906325767`, keywords: ['user', 'experience', 'process', 'simple', 'easy'], category: 'user-experience' },\n { id: 'what-is-migrate-fun', question: 'What is Migrate Fun?', answer: `Migrate Fun is the category-defining platform that created the migration meta. It allows users to migrate locked liquidity from one launchpad to another.\\n\\nAs of October 2025: 15 migrations completed, $5+ million in liquidity moved, largest migration was $35M market cap project. Supports migrations to Bonk Fun, Raydium, and Pump Fun.\\n\\nLinks:\\n- Website: https://migrate.fun/\\n- X: https://x.com/MigrateFun\\n- Docs: https://github.com/EmblemCompany/Migrate-fun-docs/\\n- Audit: https://www.halborn.com/audits/emblem-vault/migratefun-8ad34b\\n- Calculator: https://migrate.fun/migration-calculator`, keywords: ['what', 'migrate fun', 'about', 'general', 'overview'], category: 'general' },\n { id: 'sol-recovery-estimate', question: 'How can I see how much SOL we can get from the old LP?', answer: `Use the migration calculator to estimate SOL recovery based on participation percentages: https://migrate.fun/migration-calculator`, keywords: ['sol', 'recovery', 'estimate', 'calculator', 'liquidity', 'how much'], category: 'tools' },\n { id: 'documentation', question: 'Do you have documentation?', answer: `Yes, documentation is available at: https://github.com/EmblemCompany/Migrate-fun-docs/`, keywords: ['documentation', 'docs', 'guide', 'help'], category: 'general' },\n { id: 'rebrand', question: 'What if I want to rebrand?', answer: `The migration enables a full rebrand - reset metadata, image, logo, name, everything. Or keep it all the same if you prefer.`, keywords: ['rebrand', 'change', 'name', 'logo', 'image', 'metadata'], category: 'features' },\n { id: 'sniper-protection', question: 'How do you prevent snipers when migrating to Pump Fun?', answer: `On Solana you can stack transactions. When deploying the bonding curve, you are first to purchase so you can buyout the bonding curve and more in the first transaction, preventing snipers.`, keywords: ['sniper', 'snipers', 'protection', 'front-run', 'mev'], category: 'security' },\n { id: 'claim-period-flexibility', question: 'Is there flexibility on the 90 day claim period?', answer: `The 90-day claim period is mandatory. Reasons:\\n- All users need time to claim tokens after migration\\n- Those who missed migration need a window\\n- Users don't get tokens until after migration completes\\n- Allowing team to withdraw during claims would be risky (potential rug)`, keywords: ['90 day', 'claim', 'period', 'flexibility', 'change'], category: 'settings' },\n { id: 'migration-duration', question: 'How long is the migration?', answer: `You can set the migration window for as long as you'd like. Average is 14 days. Some teams choose 7 days (works great), some go up to 30 days.\\n\\nNote: Majority of participation happens in the first and last 24 hours. Example: 76% participation with 50%+ migrating in first 24 hours and additional 10% on the last day.`, keywords: ['how long', 'duration', 'time', 'days', 'period', 'window'], category: 'settings' },\n { id: 'migration-performance', question: 'Can you give examples of token performance after migration?', answer: `Migration squeeze: When large percentage of old tokens migrate, sell pressure reduces, often causing market cap spike near migration end.\\n\\nExample charts:\\n- ZERA Old: https://dexscreener.com/solana/95at5r4i85gfqeew2yr6byfg8rlry1d9ztps7qrskdvc\\n New: https://dexscreener.com/solana/nn9vmhjtqgg9l9f8sp3geufwc5zvuhradcwehh7n7di\\n- HUSTLE Old: https://dexscreener.com/solana/gjckb2eesjk65nuvpaw4tn2rabnr8wmfcwcwpagk5dzs\\n New: https://dexscreener.com/solana/hxo1wrcrdewek8l2j6rxswnolumej2mweh38gajxtw7y\\n\\nThread: https://x.com/jakegallen_/status/1973051293213028468`, keywords: ['performance', 'charts', 'example', 'before', 'after', 'squeeze'], category: 'examples' },\n { id: 'why-migrate', question: 'Why would teams want to migrate?', answer: `Top reasons:\\n- Access to creator rewards\\n- Rebrand opportunity\\n- Fresh chart\\n- Reclaim part of the token supply\\n- Reinvigorated community on the other side`, keywords: ['why', 'reasons', 'benefits', 'advantages', 'should'], category: 'general' },\n { id: 'migration-recommendation-steps', question: 'What steps do you recommend when considering a migration?', answer: `1) Discuss with Migrate Fun team: process details, where to move LP (Raydium, Bonk Fun, or Pump Fun)\\n2) Discuss benefits with your community, especially whale holders - get buy-in\\n3) Announce on all social channels - maximize awareness for maximum participation`, keywords: ['recommend', 'steps', 'considering', 'planning', 'prepare'], category: 'process' },\n { id: 'multiple-wallets', question: 'Do holders with multiple wallets need to consolidate?', answer: `No. Migration is linear - users can migrate all tokens together or separately. Makes no difference.`, keywords: ['multiple', 'wallets', 'consolidate', 'separate'], category: 'user-experience' },\n { id: 'mft-value', question: 'Do MFTs show value in wallets?', answer: `MFTs (Migrate Fun Tokens) are just placeholder tokens for the migration. They are valueless.`, keywords: ['mft', 'migrate fun tokens', 'value', 'placeholder'], category: 'user-experience' },\n { id: 'announcement-examples', question: 'Can you give me sample migration announcements?', answer: `Here are announcements made by teams:\\n- https://x.com/radrdotfun/status/1952127168101949620\\n- https://x.com/project_89/status/1951345024656089368\\n- https://x.com/HKittyOnSol/status/1948925330032349210\\n- https://x.com/ModernStoicAI/status/1948129627362218483\\n- https://x.com/pokithehamster/status/1950238636928327927\\n- https://x.com/IQ6900_/status/1953002036599173499\\n- https://x.com/TheBongoCat/status/1965538945132843333`, keywords: ['announcement', 'sample', 'example', 'post', 'twitter'], category: 'examples' },\n { id: 'graphics', question: 'Does Migrate Fun provide graphics for announcements?', answer: `No. For your own migration announcement you create the graphic. Migrate Fun's designer creates group migration announcements only.`, keywords: ['graphics', 'images', 'design', 'announcement'], category: 'general' },\n { id: 'developer-required', question: 'Do I need to be a developer to migrate?', answer: `No development required. The entire process is a few clicks for both pre-migration and post-migration.`, keywords: ['developer', 'technical', 'coding', 'code'], category: 'general' },\n { id: 'exchange-tokens', question: 'What happens to tokens on exchanges or locked in Streamflow?', answer: `They will miss the migration as those tokens are considered circulating supply onchain. Options:\\n1) Join as late migrator during 90-day claim window\\n2) After 90-day period, team takes possession of unclaimed tokens and can reimburse directly`, keywords: ['exchange', 'streamflow', 'locked', 'vested', 'cex'], category: 'edge-cases' },\n { id: 'unclaimed-tokens', question: 'Can we get unclaimed tokens?', answer: `After the 90-day claim period ends, all unclaimed tokens are returned to whichever wallet set up the migration (the team).`, keywords: ['unclaimed', 'supply', 'remaining', 'tokens', 'team'], category: 'post-migration' },\n { id: 'participation-rate', question: 'What is typical participation percentage?', answer: `Nearly all projects have had over 50% migration participation. View all stats at https://migrate.fun/projects`, keywords: ['participation', 'percentage', 'rate', 'typical', 'average'], category: 'statistics' },\n { id: 'late-penalty', question: 'What penalty can teams set for late migrators?', answer: `Teams can set 0-100% penalty for late migrators who swap during the 90-day claim window. 25% seems to be a good balance - encourages participation without being overly punishing.`, keywords: ['penalty', 'late', 'discount', 'punish', 'percent'], category: 'settings' },\n { id: 'new-ca', question: 'Will we get a new CA or just change the pair?', answer: `A new CA. If migrating to Bonk Fun your CA will end with \"bonk\". If migrating to Pump Fun it will end with \"pump\".`, keywords: ['ca', 'contract', 'address', 'new', 'pair'], category: 'process' },\n { id: 'vanity-ca', question: 'Can we create a vanity CA?', answer: `Yes, but if migrating to Bonk Fun it needs to end with \"bonk\", or for Pump Fun it needs to end with \"pump\".`, keywords: ['vanity', 'ca', 'custom', 'address', 'contract'], category: 'features' },\n { id: 'vested-tokens', question: 'What about team tokens locked with Streamflow?', answer: `Those tokens can't be migrated. They won't be lost - you'll recapture that supply post-migration. Any unmigrated tokens return to team at full or discounted rate depending on your late migrator penalty setting.`, keywords: ['vested', 'streamflow', 'locked', 'team'], category: 'edge-cases' },\n { id: 'wallet-tracking', question: 'Can I track wallet addresses post-migration?', answer: `At the end of migration, there's a snapshot tool that lets you download a CSV of all wallets holding the old token.`, keywords: ['wallet', 'track', 'snapshot', 'csv', 'addresses'], category: 'tools' },\n { id: 'old-listings', question: 'What happens to old token listings?', answer: `You will need to apply to new directories. Migrate Fun provides a list once you begin the migration process.`, keywords: ['listings', 'directories', 'old', 'new', 'update'], category: 'post-migration' },\n { id: 'lp-locking', question: 'Does the new LP get locked?', answer: `If migrating to Bonk Fun or Pump Fun: LP is locked (their rules). If migrating to Raydium: LP is unlocked and you control it.`, keywords: ['lp', 'locked', 'liquidity', 'pool', 'control'], category: 'process' },\n { id: 'sol-pairs', question: 'Are Bonk migrations confined to SOL pairs?', answer: `As of October 2025, they are SOL migrations. Check with the team to see if USD1 pairs are possible.`, keywords: ['sol', 'pair', 'usd1', 'usdc', 'bonk'], category: 'settings' },\n { id: 'change-penalty', question: 'Can I change the penalty after setup?', answer: `No. The penalty must be set during migration creation and cannot be changed after.`, keywords: ['change', 'penalty', 'modify', 'update', 'after'], category: 'settings' },\n { id: 'unhappy-holders', question: 'What if someone is unhappy about the migration?', answer: `They can sell their tokens and not participate. Migrations are a fresh start - holders who migrate are voting with their tokens that they support the team and believe in the project's future.`, keywords: ['unhappy', 'disagree', 'against', 'sell'], category: 'user-experience' },\n { id: 'sample-announcement', question: 'What is a good announcement template?', answer: `Sample for Bonk Fun migration:\\n\\n\"We're excited to announce that we're migrating with @MigrateFun and officially joining the @bonk_inu ecosystem next month!\\n\\nWith our 1-year anniversary less than a month away, this migration to @bonk_fun marks the beginning of our next chapter.\\n\\nWhy Bonk Fun?\\n🧰 Purpose-built tools for community projects\\n💸 Transaction fee rev share\\n🔁 Seamless LP migration\\n🤝 Strategic alignment with top meme coin teams\\n\\nOur migration timeline + holder instructions drop soon.\"`, keywords: ['announcement', 'template', 'sample', 'post'], category: 'examples' },\n { id: 'share-link', question: 'Do you have a link to share explaining Migrate Fun?', answer: `Overview thread: https://x.com/migratefun/status/1957492884355314035\\nDeep dive docs: https://github.com/EmblemCompany/Migrate-fun-docs/`, keywords: ['link', 'share', 'explain', 'overview'], category: 'general' },\n { id: 'exchange-rate', question: 'Is the exchange rate always 1:1?', answer: `Yes, 1 old token = 1 new token for users who participate in migration. Users who miss can swap during the 90-day claim window at a discounted rate set by the team.`, keywords: ['exchange', 'rate', '1:1', 'ratio', 'same'], category: 'process' },\n { id: 'change-supply', question: 'Can I change the total supply?', answer: `Generally yes, with some constraints depending on destination platform. Reach out to Migrate Fun team to discuss specifics.`, keywords: ['supply', 'change', 'total', 'amount'], category: 'features' },\n { id: 'contact', question: 'How can I get in touch with the Migrate Fun team?', answer: `Send a direct message to the Migrate Fun X account: https://x.com/MigrateFun`, keywords: ['contact', 'reach', 'touch', 'dm', 'message', 'talk'], category: 'general' },\n { id: 'ready-to-migrate', question: 'I am ready to migrate, what is next?', answer: `Send a direct message to the Migrate Fun X account: https://x.com/MigrateFun`, keywords: ['ready', 'start', 'begin', 'next'], category: 'general' },\n { id: 'risks', question: 'What are the risks of migrating?', answer: `Main risk: Failed migration where not enough tokens migrate to fund the new LP. In that case, migrated tokens are sold into the old LP and SOL is returned to community members who participated.`, keywords: ['risk', 'danger', 'fail', 'problem', 'issue'], category: 'security' },\n { id: 'how-detect-non-migrators', question: 'How does Migrate Fun know who did not migrate?', answer: `Migrate Fun has a snapshot and claim tool that puts onchain all wallets holding old tokens at migration end. This enables late migrators to swap old tokens for new during the 90-day claim window at the team-set discount.`, keywords: ['snapshot', 'detect', 'know', 'non-migrators'], category: 'tools' },\n { id: 'no-penalty', question: 'What if I do not want to penalize non-migrators?', answer: `Set the late claim penalty to zero. Holders who didn't migrate can then swap old tokens for new at a 1:1 rate during the 90-day claim window.`, keywords: ['no penalty', 'zero', 'fair'], category: 'settings' },\n { id: 'missed-claim-window', question: 'What happens if holders miss both migration and claim window?', answer: `They won't have access to new tokens through Migrate Fun platform. All remaining tokens go to the team after 90-day window closes. The team has a snapshot of all old token holders and can handle at their discretion.`, keywords: ['missed', 'both', 'claim', 'window', 'late'], category: 'edge-cases' },\n { id: 'exchange-options', question: 'What options do exchanges have to swap tokens?', answer: `Two options:\\n\\nOption 1: Participate onchain through the migration portal (same as retail). Load tokens into Phantom wallet, migrate, then claim. ~10 seconds each step.\\n\\nOption 2: Admin withdraw function during 90-day claim period. Migration admin can withdraw new tokens from claims vault and manually swap with exchange.\\n- 90-day window for exchange procedures\\n- Exchange can observe migration complete before acting\\n- Can receive new tokens before sending old\\n- Can pause trading during process`, keywords: ['exchange', 'cex', 'swap', 'options', 'centralized'], category: 'edge-cases' },\n { id: 'buy-prevent-dump', question: 'Can we buy supply before migration to prevent dumping?', answer: `I would recommend buying now. There is no arb opportunity as you set the market cap of the new token.\\n\\nTo regain control of non-migrated tokens, you can penalize non-migrators. Example: If 60% migrate, 40% didn't. With a 50% penalty on non-migrators, you'd recoup 20% of total supply if everyone claimed.`, keywords: ['buy', 'dump', 'supply', 'control', 'arb'], category: 'strategy' },\n];\n\n/**\n * Search result structure\n */\ninterface SearchResult {\n rank: number;\n relevance: number;\n question: string;\n answer: string;\n category: string;\n}\n\n/**\n * Migrate.fun Knowledge Base Plugin\n *\n * Tools:\n * - search_migrate_fun_docs: Search the knowledge base for migration Q&A\n */\nexport const migrateFunPlugin: HustlePlugin = {\n name: 'migrate-fun-knowledge',\n version: '1.0.0',\n description: 'Search Migrate.fun knowledge base for token migration answers',\n\n tools: [\n {\n name: 'search_migrate_fun_docs',\n description:\n 'Search the Migrate.fun knowledge base for answers about token migrations. Use this tool when users ask about: how migrations work (Bonk Fun, Pump Fun, Raydium), costs/fees/timelines, post-migration steps, user experience, technical details (LP, CA, penalties), or examples. Returns ranked Q&A pairs from real support conversations.',\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'The search query - user question or key terms about token migrations',\n },\n topK: {\n type: 'number',\n description: 'Number of results to return (default: 5, max: 10)',\n },\n },\n required: ['query'],\n },\n },\n ],\n\n executors: {\n search_migrate_fun_docs: async (args) => {\n const query = args.query as string;\n const topK = Math.min(Math.max(1, (args.topK as number) || 5), 10);\n\n const queryLower = query.toLowerCase();\n const queryWords = queryLower.split(/\\s+/).filter(w => w.length > 2);\n\n // Score each Q&A entry\n const scored = QA.map(qa => {\n let score = 0;\n const questionLower = qa.question.toLowerCase();\n const answerLower = qa.answer.toLowerCase();\n const keywordsStr = qa.keywords.join(' ').toLowerCase();\n const fullText = `${questionLower} ${answerLower} ${keywordsStr}`;\n\n // Exact phrase match in question (highest weight)\n if (questionLower.includes(queryLower)) score += 15;\n\n // Exact phrase match anywhere\n if (fullText.includes(queryLower)) score += 8;\n\n // Individual word matches\n for (const word of queryWords) {\n // Keyword match (high weight)\n if (qa.keywords.some(kw => kw.toLowerCase().includes(word) || word.includes(kw.toLowerCase()))) {\n score += 4;\n }\n // Question match (medium weight)\n if (questionLower.includes(word)) score += 3;\n // Answer match (low weight)\n if (answerLower.includes(word)) score += 1;\n }\n\n return { ...qa, score };\n });\n\n // Filter, sort, and format results\n const results: SearchResult[] = scored\n .filter(qa => qa.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, topK)\n .map((qa, i) => ({\n rank: i + 1,\n relevance: Math.round((qa.score / 30) * 100) / 100,\n question: qa.question,\n answer: qa.answer,\n category: qa.category,\n }));\n\n return {\n success: true,\n query,\n resultCount: results.length,\n results,\n hint: results.length === 0\n ? 'No matches found. Suggest contacting @MigrateFun on X: https://x.com/MigrateFun'\n : 'Use these Q&A pairs to answer. Include relevant links from the answers.',\n };\n },\n },\n\n hooks: {\n onRegister: () => {\n console.log('[Plugin] Migrate.fun Knowledge Base v1.0.0 registered');\n },\n },\n};\n\nexport default migrateFunPlugin;\n","/**\n * Plugin Registry\n *\n * Available plugins that can be installed by users.\n * This is a hardcoded registry for the PoC - in the future\n * this could be fetched from a remote plugin marketplace.\n *\n * NOTE: Plugins no longer need to be pre-registered. Executor code\n * is now serialized to localStorage as executorCode strings and\n * reconstituted at runtime via eval().\n */\n\nimport { predictionMarketPlugin } from './predictionMarket';\nimport { migrateFunPlugin } from './migrateFun';\nimport type { HustlePlugin } from '../types';\n\n/**\n * Available plugin with display metadata\n */\nexport interface AvailablePlugin extends HustlePlugin {\n /** Short description for UI display */\n description: string;\n}\n\n/**\n * All available plugins that can be installed\n */\nexport const availablePlugins: AvailablePlugin[] = [\n {\n ...predictionMarketPlugin,\n description: 'Search and analyze Polymarket and Kalshi prediction markets',\n },\n {\n ...migrateFunPlugin,\n description: 'Search Migrate.fun knowledge base for token migration answers',\n },\n];\n\n/**\n * Get an available plugin by name\n */\nexport function getAvailablePlugin(name: string): AvailablePlugin | undefined {\n return availablePlugins.find(p => p.name === name);\n}\n\n// Re-export individual plugins\nexport { predictionMarketPlugin };\nexport { migrateFunPlugin };\n","'use client';\n\nimport React, { useEffect, useState, useCallback, useRef } from 'react';\nimport { marked } from 'marked';\nimport hljs from 'highlight.js/lib/core';\n// Import only common languages for AI chat\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport python from 'highlight.js/lib/languages/python';\nimport json from 'highlight.js/lib/languages/json';\nimport bash from 'highlight.js/lib/languages/bash';\nimport shell from 'highlight.js/lib/languages/shell';\nimport css from 'highlight.js/lib/languages/css';\nimport xml from 'highlight.js/lib/languages/xml';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport sql from 'highlight.js/lib/languages/sql';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport rust from 'highlight.js/lib/languages/rust';\nimport go from 'highlight.js/lib/languages/go';\nimport java from 'highlight.js/lib/languages/java';\nimport cpp from 'highlight.js/lib/languages/cpp';\nimport csharp from 'highlight.js/lib/languages/csharp';\nimport php from 'highlight.js/lib/languages/php';\nimport ruby from 'highlight.js/lib/languages/ruby';\nimport swift from 'highlight.js/lib/languages/swift';\nimport kotlin from 'highlight.js/lib/languages/kotlin';\nimport { tokens } from '../styles';\n\n// Register languages\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('python', python);\nhljs.registerLanguage('py', python);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('shell', shell);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('html', xml);\nhljs.registerLanguage('markdown', markdown);\nhljs.registerLanguage('md', markdown);\nhljs.registerLanguage('sql', sql);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('yml', yaml);\nhljs.registerLanguage('rust', rust);\nhljs.registerLanguage('go', go);\nhljs.registerLanguage('java', java);\nhljs.registerLanguage('cpp', cpp);\nhljs.registerLanguage('c', cpp);\nhljs.registerLanguage('csharp', csharp);\nhljs.registerLanguage('cs', csharp);\nhljs.registerLanguage('php', php);\nhljs.registerLanguage('ruby', ruby);\nhljs.registerLanguage('rb', ruby);\nhljs.registerLanguage('swift', swift);\nhljs.registerLanguage('kotlin', kotlin);\nhljs.registerLanguage('kt', kotlin);\n\n/**\n * MarkdownContent - Renders markdown using marked + highlight.js\n *\n * Uses marked for markdown parsing (lightweight, reliable)\n * Uses highlight.js for code block syntax highlighting\n * Adds copy and \"Open in Emblem AI\" buttons to code blocks\n */\nexport interface MarkdownContentProps {\n content: string;\n className?: string;\n}\n\n/**\n * Container styles\n */\nconst containerStyle: React.CSSProperties = {\n fontFamily: tokens.typography.fontFamily,\n fontSize: tokens.typography.fontSizeMd,\n lineHeight: 1.5,\n color: 'inherit',\n wordBreak: 'break-word',\n};\n\n/**\n * Scoped CSS for markdown content + highlight.js dark theme\n */\nconst scopedStyles = `\n.hljs-md p {\n margin: 0 0 0.5em 0;\n}\n.hljs-md p:last-child {\n margin-bottom: 0;\n}\n.hljs-md ul,\n.hljs-md ol {\n margin: 0.25em 0 0.5em 0;\n padding-left: 1.5em;\n}\n.hljs-md li {\n margin: 0.1em 0;\n line-height: 1.4;\n}\n.hljs-md li > p {\n margin: 0;\n display: inline;\n}\n.hljs-md li > ul,\n.hljs-md li > ol {\n margin: 0.1em 0;\n}\n.hljs-md .code-block-wrapper {\n position: relative;\n margin: 0.5em 0;\n}\n.hljs-md .code-block-wrapper pre {\n position: relative;\n margin: 0;\n padding: 0.75em 1em;\n border-radius: 6px;\n background: #1e1e1e;\n overflow-x: auto;\n}\n.hljs-md .code-block-toolbar {\n position: absolute;\n top: 6px;\n right: 6px;\n display: flex;\n gap: 4px;\n z-index: 10;\n}\n.hljs-md .code-block-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n padding: 0;\n background: #2d2d2d;\n border: 1px solid #404040;\n border-radius: 4px;\n color: #888;\n cursor: pointer;\n transition: all 0.15s ease;\n opacity: 0.7;\n}\n.hljs-md .code-block-wrapper:hover .code-block-btn {\n opacity: 1;\n}\n.hljs-md .code-block-btn:hover {\n background: #3d3d3d;\n border-color: #555;\n color: #ccc;\n}\n.hljs-md .code-block-btn.copied {\n color: ${tokens.colors.accentSuccess};\n}\n.hljs-md code {\n font-family: ${tokens.typography.fontFamilyMono};\n font-size: 0.9em;\n}\n.hljs-md :not(pre) > code {\n padding: 0.15em 0.4em;\n border-radius: 4px;\n background: rgba(255, 255, 255, 0.1);\n}\n.hljs-md pre code {\n padding: 0;\n background: transparent;\n font-size: 0.875em;\n line-height: 1.5;\n}\n.hljs-md h1, .hljs-md h2, .hljs-md h3, .hljs-md h4 {\n margin: 0.5em 0 0.25em 0;\n font-weight: 600;\n line-height: 1.3;\n}\n.hljs-md h1:first-child, .hljs-md h2:first-child, .hljs-md h3:first-child {\n margin-top: 0;\n}\n.hljs-md h1 { font-size: 1.5em; }\n.hljs-md h2 { font-size: 1.25em; }\n.hljs-md h3 { font-size: 1.1em; }\n.hljs-md h4 { font-size: 1em; }\n.hljs-md blockquote {\n margin: 0.5em 0;\n padding: 0.5em 0 0.5em 1em;\n border-left: 3px solid ${tokens.colors.borderSecondary};\n color: ${tokens.colors.textSecondary};\n}\n.hljs-md a {\n color: ${tokens.colors.accentPrimary};\n text-decoration: underline;\n}\n.hljs-md hr {\n margin: 1em 0;\n border: none;\n border-top: 1px solid ${tokens.colors.borderSecondary};\n}\n.hljs-md table {\n width: 100%;\n margin: 0.5em 0;\n border-collapse: collapse;\n}\n.hljs-md th, .hljs-md td {\n padding: 0.5em;\n border: 1px solid ${tokens.colors.borderPrimary};\n text-align: left;\n}\n.hljs-md th {\n font-weight: 600;\n background: rgba(255, 255, 255, 0.05);\n}\n\n/* highlight.js dark theme (VS Code Dark+ inspired) */\n.hljs {\n color: #d4d4d4;\n background: #1e1e1e;\n}\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-title,\n.hljs-section,\n.hljs-doctag,\n.hljs-name,\n.hljs-strong {\n color: #569cd6;\n font-weight: normal;\n}\n.hljs-built_in,\n.hljs-literal,\n.hljs-type,\n.hljs-params,\n.hljs-meta,\n.hljs-link {\n color: #4ec9b0;\n}\n.hljs-string,\n.hljs-symbol,\n.hljs-bullet,\n.hljs-addition {\n color: #ce9178;\n}\n.hljs-number {\n color: #b5cea8;\n}\n.hljs-comment,\n.hljs-quote,\n.hljs-deletion {\n color: #6a9955;\n}\n.hljs-variable,\n.hljs-template-variable,\n.hljs-attr {\n color: #9cdcfe;\n}\n.hljs-regexp,\n.hljs-selector-id,\n.hljs-selector-class {\n color: #d7ba7d;\n}\n.hljs-emphasis {\n font-style: italic;\n}\n`;\n\n// Configure marked with highlight.js\nmarked.use({\n gfm: true,\n breaks: false,\n});\n\n/**\n * Highlight code using highlight.js\n */\nfunction highlightCode(code: string, lang: string): string {\n if (lang && hljs.getLanguage(lang)) {\n try {\n return hljs.highlight(code, { language: lang }).value;\n } catch {\n // Fall through to auto-detect\n }\n }\n\n // Auto-detect language\n try {\n return hljs.highlightAuto(code).value;\n } catch {\n // Fallback to escaped plain text\n return code\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n}\n\n/**\n * Generate unique ID for code blocks\n */\nlet codeBlockCounter = 0;\nfunction generateCodeBlockId(): string {\n return `code-block-${++codeBlockCounter}`;\n}\n\n/**\n * Process markdown and highlight code blocks\n * Returns HTML with data attributes for code block content\n */\nfunction renderMarkdown(content: string): string {\n // Parse markdown to HTML\n const html = marked.parse(content, { async: false }) as string;\n\n // Find and highlight code blocks with language\n const codeBlockRegex = /<pre><code class=\"language-(\\w+)\">([\\s\\S]*?)<\\/code><\\/pre>/g;\n let result = html.replace(codeBlockRegex, (_, lang, code) => {\n const decoded = code\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"');\n const highlighted = highlightCode(decoded, lang);\n const id = generateCodeBlockId();\n const encodedCode = encodeURIComponent(decoded);\n return `<div class=\"code-block-wrapper\" data-code-id=\"${id}\" data-code=\"${encodedCode}\"><pre><code class=\"hljs language-${lang}\">${highlighted}</code></pre><div class=\"code-block-toolbar\"><button class=\"code-block-btn\" data-action=\"copy\" data-code-id=\"${id}\" title=\"Copy code\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg></button><button class=\"code-block-btn\" data-action=\"emblem\" data-code-id=\"${id}\" title=\"Open in Emblem AI\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"16 18 22 12 16 6\"></polyline><polyline points=\"8 6 2 12 8 18\"></polyline></svg></button></div></div>`;\n });\n\n // Also handle code blocks without language\n const plainCodeRegex = /<pre><code>([\\s\\S]*?)<\\/code><\\/pre>/g;\n result = result.replace(plainCodeRegex, (_, code) => {\n const decoded = code\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&amp;/g, '&')\n .replace(/&quot;/g, '\"');\n const highlighted = highlightCode(decoded, '');\n const id = generateCodeBlockId();\n const encodedCode = encodeURIComponent(decoded);\n return `<div class=\"code-block-wrapper\" data-code-id=\"${id}\" data-code=\"${encodedCode}\"><pre><code class=\"hljs\">${highlighted}</code></pre><div class=\"code-block-toolbar\"><button class=\"code-block-btn\" data-action=\"copy\" data-code-id=\"${id}\" title=\"Copy code\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg></button><button class=\"code-block-btn\" data-action=\"emblem\" data-code-id=\"${id}\" title=\"Open in Emblem AI\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"16 18 22 12 16 6\"></polyline><polyline points=\"8 6 2 12 8 18\"></polyline></svg></button></div></div>`;\n });\n\n return result;\n}\n\nexport function MarkdownContent({ content, className }: MarkdownContentProps) {\n const [rendered, setRendered] = useState<string>('');\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n try {\n const html = renderMarkdown(content);\n setRendered(html);\n } catch (err) {\n console.error('[MarkdownContent] Render error:', err);\n // Fallback to escaped plain text\n setRendered(\n content\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\\n/g, '<br>')\n );\n }\n }, [content]);\n\n // Attach event handlers after render\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n const handleClick = async (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const button = target.closest('[data-action]') as HTMLElement;\n if (!button) return;\n\n const action = button.dataset.action;\n const codeId = button.dataset.codeId;\n if (!codeId) return;\n\n const wrapper = container.querySelector(`[data-code-id=\"${codeId}\"]`) as HTMLElement;\n if (!wrapper) return;\n\n const encodedCode = wrapper.dataset.code;\n if (!encodedCode) return;\n\n const code = decodeURIComponent(encodedCode);\n\n if (action === 'copy') {\n e.preventDefault();\n try {\n await navigator.clipboard.writeText(code);\n button.classList.add('copied');\n // Change icon to checkmark temporarily\n button.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>`;\n setTimeout(() => {\n button.classList.remove('copied');\n button.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path>\n </svg>`;\n }, 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n } else if (action === 'emblem') {\n e.preventDefault();\n // Open Emblem AI with code in URL (no auto-submit)\n const url = `https://build.emblemvault.ai/?q=${encodeURIComponent(code)}`;\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n };\n\n container.addEventListener('click', handleClick);\n return () => container.removeEventListener('click', handleClick);\n }, [rendered]);\n\n return (\n <>\n <style>{scopedStyles}</style>\n <div\n ref={containerRef}\n style={containerStyle}\n className={`hljs-md ${className || ''}`}\n dangerouslySetInnerHTML={{ __html: rendered }}\n />\n </>\n );\n}\n\nexport default MarkdownContent;\n","'use client';\n\nimport React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { useHustle } from '../providers/HustleProvider';\nimport { useEmblemAuth } from '../providers/EmblemAuthProvider';\nimport { usePlugins } from '../hooks/usePlugins';\nimport { availablePlugins } from '../plugins';\nimport { tokens, presets, animations } from '../styles';\nimport { MarkdownContent } from './MarkdownContent';\nimport type { ChatMessage, StreamChunk, ToolCall, Attachment } from '../types';\n\n// ============================================================================\n// Styles using design tokens\n// ============================================================================\nconst styles = {\n // Container\n container: {\n display: 'flex',\n flexDirection: 'column' as const,\n height: '100%',\n background: tokens.colors.bgSecondary,\n borderRadius: tokens.radius.xl,\n border: `1px solid ${tokens.colors.borderPrimary}`,\n fontFamily: tokens.typography.fontFamily,\n color: tokens.colors.textPrimary,\n },\n\n // Not ready / auth required states\n placeholder: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: tokens.spacing.xxl,\n background: tokens.colors.bgSecondary,\n borderRadius: tokens.radius.xl,\n border: `1px solid ${tokens.colors.borderPrimary}`,\n },\n placeholderContent: {\n textAlign: 'center' as const,\n color: tokens.colors.textSecondary,\n },\n placeholderTitle: {\n fontSize: tokens.typography.fontSizeLg,\n fontWeight: tokens.typography.fontWeightMedium,\n marginBottom: tokens.spacing.xs,\n },\n placeholderText: {\n fontSize: tokens.typography.fontSizeSm,\n color: tokens.colors.textTertiary,\n },\n loadingSpinner: {\n display: 'inline-block',\n width: '24px',\n height: '24px',\n border: `2px solid ${tokens.colors.textTertiary}`,\n borderTopColor: 'transparent',\n borderRadius: tokens.radius.full,\n animation: 'hustle-spin 0.8s linear infinite',\n marginBottom: tokens.spacing.sm,\n },\n\n // Header - darker shade\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n background: tokens.colors.bgPrimary,\n borderBottom: `1px solid ${tokens.colors.borderPrimary}`,\n borderRadius: `${tokens.radius.xl} ${tokens.radius.xl} 0 0`,\n },\n headerTitle: {\n fontWeight: tokens.typography.fontWeightSemibold,\n color: tokens.colors.textPrimary,\n fontSize: tokens.typography.fontSizeMd,\n },\n headerActions: {\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n },\n\n // Model selector\n select: {\n fontSize: tokens.typography.fontSizeSm,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.md,\n background: tokens.colors.bgTertiary,\n color: tokens.colors.textPrimary,\n outline: 'none',\n },\n\n // Settings button\n settingsBtn: {\n ...presets.buttonIcon,\n borderRadius: tokens.radius.md,\n } as React.CSSProperties,\n settingsBtnActive: {\n background: tokens.colors.accentPrimaryBg,\n color: tokens.colors.accentPrimary,\n },\n settingsBtnInactive: {\n color: tokens.colors.textSecondary,\n },\n\n // Settings Modal\n modalOverlay: {\n position: 'fixed' as const,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: tokens.colors.bgOverlay,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: tokens.zIndex.modal,\n },\n modal: {\n background: tokens.colors.bgSecondary,\n borderRadius: tokens.radius.xl,\n border: `1px solid ${tokens.colors.borderPrimary}`,\n width: '100%',\n maxWidth: '440px',\n maxHeight: '90vh',\n overflow: 'auto',\n boxShadow: tokens.shadows.xl,\n },\n modalHeader: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${tokens.spacing.lg} ${tokens.spacing.xl}`,\n borderBottom: `1px solid ${tokens.colors.borderPrimary}`,\n },\n modalTitle: {\n fontSize: tokens.typography.fontSizeLg,\n fontWeight: tokens.typography.fontWeightSemibold,\n color: tokens.colors.textPrimary,\n },\n modalClose: {\n background: 'transparent',\n border: 'none',\n color: tokens.colors.textTertiary,\n fontSize: '20px',\n cursor: 'pointer',\n padding: tokens.spacing.xs,\n lineHeight: 1,\n transition: `color ${tokens.transitions.fast}`,\n },\n modalBody: {\n padding: tokens.spacing.xl,\n },\n\n // Settings sections\n settingGroup: {\n marginBottom: tokens.spacing.xl,\n },\n settingLabel: {\n display: 'block',\n fontSize: tokens.typography.fontSizeMd,\n fontWeight: tokens.typography.fontWeightMedium,\n color: tokens.colors.textPrimary,\n marginBottom: tokens.spacing.xs,\n },\n settingDescription: {\n fontSize: tokens.typography.fontSizeSm,\n color: tokens.colors.textTertiary,\n marginBottom: tokens.spacing.md,\n },\n settingSelect: {\n width: '100%',\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n fontSize: tokens.typography.fontSizeMd,\n background: tokens.colors.bgTertiary,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n color: tokens.colors.textPrimary,\n outline: 'none',\n cursor: 'pointer',\n appearance: 'none' as const,\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%238892a4' d='M6 8L1 3h10z'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'right 12px center',\n paddingRight: '36px',\n },\n modelInfo: {\n fontSize: tokens.typography.fontSizeXs,\n color: tokens.colors.textTertiary,\n marginTop: tokens.spacing.sm,\n },\n\n // Toggle switch row\n toggleRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n background: tokens.colors.bgTertiary,\n borderRadius: tokens.radius.lg,\n marginBottom: tokens.spacing.sm,\n },\n toggleLabel: {\n fontSize: tokens.typography.fontSizeMd,\n color: tokens.colors.textPrimary,\n },\n toggleSwitch: {\n position: 'relative' as const,\n width: '44px',\n height: '24px',\n background: tokens.colors.borderSecondary,\n borderRadius: '12px',\n cursor: 'pointer',\n transition: `background ${tokens.transitions.fast}`,\n },\n toggleSwitchActive: {\n background: tokens.colors.accentPrimary,\n },\n toggleKnob: {\n position: 'absolute' as const,\n top: '2px',\n left: '2px',\n width: '20px',\n height: '20px',\n background: tokens.colors.textPrimary,\n borderRadius: tokens.radius.full,\n transition: `transform ${tokens.transitions.fast}`,\n },\n toggleKnobActive: {\n transform: 'translateX(20px)',\n },\n\n // Settings textarea\n settingTextarea: {\n width: '100%',\n minHeight: '100px',\n padding: tokens.spacing.lg,\n fontSize: tokens.typography.fontSizeMd,\n background: tokens.colors.bgTertiary,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n color: tokens.colors.textPrimary,\n outline: 'none',\n resize: 'vertical' as const,\n fontFamily: tokens.typography.fontFamily,\n },\n\n // Messages area\n messagesArea: {\n flex: 1,\n overflowY: 'auto' as const,\n padding: tokens.spacing.lg,\n background: tokens.colors.bgSecondary,\n },\n messagesEmpty: {\n textAlign: 'center' as const,\n color: tokens.colors.textTertiary,\n padding: tokens.spacing.xxl,\n },\n messagesContainer: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: tokens.spacing.lg,\n },\n\n // Tool calls indicator\n toolCallsIndicator: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n gap: tokens.spacing.sm,\n padding: `0 ${tokens.spacing.lg}`,\n },\n toolCallBadge: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.xs,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n fontSize: tokens.typography.fontSizeXs,\n background: tokens.colors.accentWarningBg,\n color: tokens.colors.accentWarning,\n borderRadius: tokens.radius.pill,\n },\n toolCallDot: {\n width: '8px',\n height: '8px',\n background: tokens.colors.accentWarning,\n borderRadius: tokens.radius.full,\n animation: 'hustle-pulse 1s ease-in-out infinite',\n },\n\n // Attachments preview\n attachmentsPreview: {\n padding: `${tokens.spacing.sm} ${tokens.spacing.lg}`,\n borderTop: `1px solid ${tokens.colors.borderPrimary}`,\n display: 'flex',\n flexWrap: 'wrap' as const,\n gap: tokens.spacing.sm,\n },\n attachmentItem: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: tokens.spacing.xs,\n padding: `${tokens.spacing.xs} ${tokens.spacing.sm}`,\n background: tokens.colors.bgTertiary,\n borderRadius: tokens.radius.md,\n fontSize: tokens.typography.fontSizeSm,\n },\n attachmentName: {\n maxWidth: '100px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n },\n attachmentRemove: {\n background: 'none',\n border: 'none',\n color: tokens.colors.textTertiary,\n cursor: 'pointer',\n fontSize: '14px',\n padding: 0,\n lineHeight: 1,\n },\n\n // Input area - slightly darker than messages\n inputArea: {\n padding: tokens.spacing.lg,\n background: tokens.colors.bgPrimary,\n borderTop: `1px solid ${tokens.colors.borderPrimary}`,\n borderRadius: `0 0 ${tokens.radius.xl} ${tokens.radius.xl}`,\n },\n inputRow: {\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.sm,\n },\n inputContainer: {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n background: tokens.colors.bgTertiary,\n border: `1px solid ${tokens.colors.borderSecondary}`,\n borderRadius: tokens.radius.lg,\n overflow: 'hidden',\n },\n attachBtn: {\n width: '40px',\n height: '40px',\n padding: 0,\n background: 'transparent',\n border: 'none',\n borderRadius: 0,\n color: tokens.colors.textTertiary,\n flexShrink: 0,\n } as React.CSSProperties,\n inputWrapper: {\n flex: 1,\n },\n input: {\n width: '100%',\n padding: `${tokens.spacing.md} ${tokens.spacing.sm}`,\n background: 'transparent',\n border: 'none',\n color: tokens.colors.textPrimary,\n fontSize: tokens.typography.fontSizeMd,\n outline: 'none',\n resize: 'none' as const,\n } as React.CSSProperties,\n inputDisabled: {\n background: tokens.colors.bgTertiary,\n cursor: 'not-allowed',\n },\n sendBtn: {\n // Inherits global button styles from CSS\n height: '40px',\n padding: `0 ${tokens.spacing.lg}`,\n fontWeight: tokens.typography.fontWeightMedium,\n } as React.CSSProperties,\n sendBtnDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n sendSpinner: {\n display: 'inline-block',\n width: '16px',\n height: '16px',\n border: '2px solid currentColor',\n borderTopColor: 'transparent',\n borderRadius: tokens.radius.full,\n animation: 'hustle-spin 0.8s linear infinite',\n },\n\n // Error display\n errorBox: {\n marginTop: tokens.spacing.sm,\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n background: tokens.colors.accentErrorBg,\n color: tokens.colors.accentError,\n fontSize: tokens.typography.fontSizeSm,\n borderRadius: tokens.radius.md,\n },\n\n // Message bubbles\n messageBubbleContainer: {\n display: 'flex',\n },\n messageBubbleUser: {\n justifyContent: 'flex-end',\n },\n messageBubbleAssistant: {\n justifyContent: 'flex-start',\n },\n messageBubble: {\n maxWidth: '80%',\n padding: `${tokens.spacing.sm} ${tokens.spacing.lg}`,\n borderRadius: tokens.radius.lg,\n },\n messageBubbleUserStyle: {\n background: tokens.colors.msgUser,\n color: tokens.colors.textPrimary,\n },\n messageBubbleAssistantStyle: {\n background: tokens.colors.msgAssistant,\n color: tokens.colors.textPrimary,\n },\n messageBubbleSystemStyle: {\n background: tokens.colors.bgTertiary,\n color: tokens.colors.textSecondary,\n fontSize: tokens.typography.fontSizeSm,\n fontStyle: 'italic' as const,\n },\n messageContent: {\n whiteSpace: 'pre-wrap' as const,\n wordBreak: 'break-word' as const,\n lineHeight: tokens.typography.lineHeightRelaxed,\n },\n streamingCursor: {\n display: 'inline-block',\n width: '2px',\n height: '16px',\n marginLeft: tokens.spacing.xs,\n background: 'currentColor',\n animation: 'hustle-pulse 0.8s ease-in-out infinite',\n },\n\n // Tool calls debug\n toolCallsDebug: {\n marginTop: tokens.spacing.sm,\n paddingTop: tokens.spacing.sm,\n borderTop: `1px solid ${tokens.colors.borderSecondary}`,\n fontSize: tokens.typography.fontSizeXs,\n },\n toolCallsDebugTitle: {\n fontWeight: tokens.typography.fontWeightMedium,\n color: tokens.colors.textSecondary,\n marginBottom: tokens.spacing.xs,\n },\n toolCallDebugItem: {\n background: 'rgba(255,255,255,0.05)',\n borderRadius: tokens.radius.sm,\n padding: tokens.spacing.xs,\n marginTop: tokens.spacing.xs,\n },\n toolCallDebugName: {\n ...presets.mono,\n } as React.CSSProperties,\n toolCallDebugArgs: {\n ...presets.mono,\n marginTop: tokens.spacing.xs,\n fontSize: '10px',\n overflow: 'auto',\n } as React.CSSProperties,\n\n // Plugin management styles\n settingDivider: {\n height: '1px',\n background: tokens.colors.borderPrimary,\n margin: `${tokens.spacing.xl} 0`,\n },\n\n pluginList: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: tokens.spacing.sm,\n },\n\n pluginRow: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${tokens.spacing.md} ${tokens.spacing.lg}`,\n background: tokens.colors.bgTertiary,\n borderRadius: tokens.radius.lg,\n },\n\n pluginInfo: {\n display: 'flex',\n alignItems: 'center',\n gap: tokens.spacing.md,\n flex: 1,\n minWidth: 0,\n },\n\n pluginIcon: {\n fontSize: '20px',\n flexShrink: 0,\n },\n\n pluginDetails: {\n flex: 1,\n minWidth: 0,\n },\n\n pluginName: {\n display: 'block',\n fontWeight: tokens.typography.fontWeightMedium,\n color: tokens.colors.textPrimary,\n whiteSpace: 'nowrap' as const,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n\n pluginMeta: {\n display: 'block',\n fontSize: tokens.typography.fontSizeXs,\n color: tokens.colors.textTertiary,\n },\n\n pluginEmpty: {\n padding: tokens.spacing.lg,\n textAlign: 'center' as const,\n color: tokens.colors.textTertiary,\n fontSize: tokens.typography.fontSizeSm,\n },\n\n availablePluginsHeader: {\n fontSize: tokens.typography.fontSizeXs,\n fontWeight: tokens.typography.fontWeightSemibold,\n color: tokens.colors.textSecondary,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.5px',\n marginTop: tokens.spacing.lg,\n marginBottom: tokens.spacing.sm,\n },\n\n installBtn: {\n padding: `${tokens.spacing.xs} ${tokens.spacing.md}`,\n fontSize: tokens.typography.fontSizeSm,\n background: 'transparent',\n border: `1px solid ${tokens.colors.accentPrimary}`,\n borderRadius: tokens.radius.md,\n color: tokens.colors.accentPrimary,\n cursor: 'pointer',\n transition: `all ${tokens.transitions.fast}`,\n whiteSpace: 'nowrap' as const,\n } as React.CSSProperties,\n\n uninstallBtn: {\n padding: `${tokens.spacing.xs} ${tokens.spacing.md}`,\n fontSize: tokens.typography.fontSizeSm,\n background: 'transparent',\n border: `1px solid ${tokens.colors.accentError}`,\n borderRadius: tokens.radius.md,\n color: tokens.colors.accentError,\n cursor: 'pointer',\n transition: `all ${tokens.transitions.fast}`,\n whiteSpace: 'nowrap' as const,\n } as React.CSSProperties,\n};\n\n/**\n * Props for HustleChat component\n */\nexport interface HustleChatProps {\n /** Additional CSS classes */\n className?: string;\n /** Placeholder text for input */\n placeholder?: string;\n /** Show settings button (opens modal with model selector, prompts, etc.) */\n showSettings?: boolean;\n /** Show debug info */\n showDebug?: boolean;\n /** Initial system prompt */\n initialSystemPrompt?: string;\n /** Callback when message is sent */\n onMessage?: (message: ChatMessage) => void;\n /** Callback when tool is called */\n onToolCall?: (toolCall: ToolCall) => void;\n /** Callback when response is received */\n onResponse?: (content: string) => void;\n}\n\n/**\n * Internal message type for display\n */\ninterface DisplayMessage extends ChatMessage {\n id: string;\n isStreaming?: boolean;\n toolCalls?: ToolCall[];\n}\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * HustleChat - Complete streaming chat interface\n *\n * @example Basic usage\n * ```tsx\n * <HustleChat />\n * ```\n *\n * @example With settings modal\n * ```tsx\n * <HustleChat\n * showSettings\n * placeholder=\"Ask me anything...\"\n * onMessage={(msg) => console.log('Sent:', msg)}\n * />\n * ```\n */\nexport function HustleChat({\n className = '',\n placeholder = 'Type a message...',\n showSettings = false,\n showDebug = false,\n initialSystemPrompt = '',\n onMessage,\n onToolCall,\n onResponse,\n}: HustleChatProps) {\n const { isAuthenticated } = useEmblemAuth();\n const {\n instanceId,\n isReady,\n isLoading,\n error,\n models,\n chatStream,\n uploadFile,\n selectedModel,\n setSelectedModel,\n systemPrompt,\n setSystemPrompt,\n skipServerPrompt,\n setSkipServerPrompt,\n } = useHustle();\n const {\n plugins,\n registerPlugin,\n unregisterPlugin,\n enablePlugin,\n disablePlugin,\n } = usePlugins(instanceId);\n\n // Local state\n const [messages, setMessages] = useState<DisplayMessage[]>([]);\n const [inputValue, setInputValue] = useState('');\n const [isStreaming, setIsStreaming] = useState(false);\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n const [currentToolCalls, setCurrentToolCalls] = useState<ToolCall[]>([]);\n const [showSettingsPanel, setShowSettingsPanel] = useState(false);\n\n // Refs\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Set initial system prompt\n useEffect(() => {\n if (initialSystemPrompt && !systemPrompt) {\n setSystemPrompt(initialSystemPrompt);\n }\n }, [initialSystemPrompt, systemPrompt, setSystemPrompt]);\n\n // Scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n /**\n * Handle file upload\n */\n const handleFileSelect = useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files || files.length === 0) return;\n\n for (const file of Array.from(files)) {\n try {\n const attachment = await uploadFile(file);\n setAttachments(prev => [...prev, attachment]);\n } catch (err) {\n console.error('Upload failed:', err);\n }\n }\n\n // Reset file input\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n },\n [uploadFile]\n );\n\n /**\n * Remove an attachment\n */\n const removeAttachment = useCallback((index: number) => {\n setAttachments(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n /**\n * Send a message\n */\n const sendMessage = useCallback(async () => {\n const content = inputValue.trim();\n if (!content || isStreaming || !isReady) return;\n\n // Create user message\n const userMessage: DisplayMessage = {\n id: generateId(),\n role: 'user',\n content,\n };\n\n // Add user message to display\n setMessages(prev => [...prev, userMessage]);\n setInputValue('');\n onMessage?.(userMessage);\n\n // Create assistant message placeholder\n const assistantMessage: DisplayMessage = {\n id: generateId(),\n role: 'assistant',\n content: '',\n isStreaming: true,\n toolCalls: [],\n };\n\n setMessages(prev => [...prev, assistantMessage]);\n setIsStreaming(true);\n setCurrentToolCalls([]);\n\n try {\n // Build messages array\n const chatMessages: ChatMessage[] = messages\n .filter(m => !m.isStreaming)\n .map(m => ({ role: m.role, content: m.content }));\n\n // Add current user message\n chatMessages.push({ role: 'user', content });\n\n // Stream the response\n const stream = chatStream({\n messages: chatMessages,\n attachments: attachments.length > 0 ? attachments : undefined,\n processChunks: true,\n });\n\n // Clear attachments after sending\n setAttachments([]);\n\n let fullContent = '';\n const toolCallsAccumulated: ToolCall[] = [];\n\n for await (const chunk of stream) {\n if (chunk.type === 'text') {\n fullContent += chunk.value;\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessage.id\n ? { ...m, content: fullContent }\n : m\n )\n );\n } else if (chunk.type === 'tool_call') {\n const toolCall = chunk.value;\n toolCallsAccumulated.push(toolCall);\n setCurrentToolCalls([...toolCallsAccumulated]);\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessage.id\n ? { ...m, toolCalls: [...toolCallsAccumulated] }\n : m\n )\n );\n onToolCall?.(toolCall);\n } else if (chunk.type === 'error') {\n console.error('Stream error:', chunk.value);\n }\n }\n\n // Finalize the message\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessage.id\n ? { ...m, isStreaming: false, content: fullContent || '(No response)' }\n : m\n )\n );\n\n onResponse?.(fullContent);\n } catch (err) {\n console.error('Chat error:', err);\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantMessage.id\n ? { ...m, isStreaming: false, content: `Error: ${err instanceof Error ? err.message : 'Unknown error'}` }\n : m\n )\n );\n } finally {\n setIsStreaming(false);\n setCurrentToolCalls([]);\n }\n }, [inputValue, isStreaming, isReady, messages, chatStream, attachments, onMessage, onToolCall, onResponse]);\n\n /**\n * Handle key press\n */\n const handleKeyPress = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n sendMessage();\n }\n },\n [sendMessage]\n );\n\n // Determine placeholder message for messages area\n const getPlaceholderMessage = () => {\n if (!isAuthenticated) {\n return 'Connect to start chatting...';\n }\n if (!isReady) {\n return 'Initializing...';\n }\n return 'Start a conversation...';\n };\n\n // Can interact with chat?\n const canChat = isAuthenticated && isReady;\n\n return (\n <>\n <style>{animations}</style>\n <div className={className} style={styles.container}>\n {/* Header */}\n <div style={styles.header}>\n <h2 style={styles.headerTitle}>Chat</h2>\n <div style={styles.headerActions}>\n {/* Selected model label */}\n {selectedModel && (\n <span style={{ fontSize: tokens.typography.fontSizeSm, color: tokens.colors.textSecondary }}>\n {selectedModel.split('/').pop()}\n </span>\n )}\n\n {/* Settings toggle */}\n {showSettings && (\n <button\n type=\"button\"\n onClick={() => setShowSettingsPanel(!showSettingsPanel)}\n style={{\n ...styles.settingsBtn,\n ...(showSettingsPanel ? styles.settingsBtnActive : styles.settingsBtnInactive),\n }}\n title=\"Settings\"\n >\n <SettingsIcon />\n </button>\n )}\n </div>\n </div>\n\n {/* Settings Modal */}\n {showSettings && showSettingsPanel && (\n <div style={styles.modalOverlay} onClick={() => setShowSettingsPanel(false)}>\n <div style={styles.modal} onClick={e => e.stopPropagation()}>\n {/* Modal Header */}\n <div style={styles.modalHeader}>\n <span style={styles.modalTitle}>Settings</span>\n <button\n type=\"button\"\n style={styles.modalClose}\n onClick={() => setShowSettingsPanel(false)}\n >\n ×\n </button>\n </div>\n\n {/* Modal Body */}\n <div style={styles.modalBody}>\n {/* Model Selection */}\n <div style={styles.settingGroup}>\n <label style={styles.settingLabel}>Model</label>\n <p style={styles.settingDescription}>Select the AI model to use for chat responses</p>\n <select\n value={selectedModel}\n onChange={e => setSelectedModel(e.target.value)}\n style={styles.settingSelect}\n >\n <option value=\"\">Default (server decides)</option>\n {(() => {\n // Group models by provider\n const grouped: Record<string, typeof models> = {};\n models.forEach(model => {\n const [provider] = model.id.split('/');\n if (!grouped[provider]) grouped[provider] = [];\n grouped[provider].push(model);\n });\n return Object.entries(grouped).map(([provider, providerModels]) => (\n <optgroup key={provider} label={provider.charAt(0).toUpperCase() + provider.slice(1)}>\n {providerModels.map(model => (\n <option key={model.id} value={model.id}>\n {model.name}\n </option>\n ))}\n </optgroup>\n ));\n })()}\n </select>\n {selectedModel && (() => {\n const model = models.find(m => m.id === selectedModel);\n if (!model) return null;\n const contextK = Math.round(model.context_length / 1000);\n const promptCost = parseFloat(model.pricing?.prompt || '0') * 1000000;\n const completionCost = parseFloat(model.pricing?.completion || '0') * 1000000;\n return (\n <div style={styles.modelInfo}>\n Context: {contextK}K tokens | Cost: ${promptCost.toFixed(2)}/${completionCost.toFixed(2)} per 1M tokens\n </div>\n );\n })()}\n </div>\n\n {/* Server System Prompt */}\n <div style={styles.settingGroup}>\n <label style={styles.settingLabel}>Server System Prompt</label>\n <div\n style={styles.toggleRow}\n onClick={() => setSkipServerPrompt(!skipServerPrompt)}\n >\n <span style={styles.toggleLabel}>Skip server-provided system prompt</span>\n <div style={{\n ...styles.toggleSwitch,\n ...(skipServerPrompt ? styles.toggleSwitchActive : {}),\n }}>\n <div style={{\n ...styles.toggleKnob,\n ...(skipServerPrompt ? styles.toggleKnobActive : {}),\n }} />\n </div>\n </div>\n <p style={styles.settingDescription}>\n When enabled, the server's default system prompt will not be used\n </p>\n </div>\n\n {/* Custom System Prompt */}\n <div style={styles.settingGroup}>\n <label style={styles.settingLabel}>Custom System Prompt</label>\n <p style={styles.settingDescription}>Provide instructions for how the AI should behave</p>\n <textarea\n value={systemPrompt}\n onChange={e => setSystemPrompt(e.target.value)}\n placeholder=\"You are a helpful assistant...\"\n style={styles.settingTextarea}\n />\n </div>\n\n {/* Divider */}\n <div style={styles.settingDivider} />\n\n {/* Plugins Section */}\n <div style={{ ...styles.settingGroup, marginBottom: 0 }}>\n <label style={styles.settingLabel}>Plugins</label>\n <p style={styles.settingDescription}>Extend the AI with custom tools</p>\n\n {/* Installed plugins */}\n {plugins.length > 0 ? (\n <div style={styles.pluginList}>\n {plugins.map(plugin => (\n <div key={plugin.name} style={styles.pluginRow}>\n <div style={styles.pluginInfo}>\n <span style={styles.pluginIcon}>{plugin.enabled ? '🔌' : '⚪'}</span>\n <div style={styles.pluginDetails}>\n <span style={styles.pluginName}>{plugin.name}</span>\n <span style={styles.pluginMeta}>\n v{plugin.version} • {plugin.tools?.length || 0} tools\n </span>\n </div>\n </div>\n <div style={{ display: 'flex', gap: tokens.spacing.sm }}>\n <div\n style={{\n ...styles.toggleSwitch,\n ...(plugin.enabled ? styles.toggleSwitchActive : {}),\n }}\n onClick={() => plugin.enabled\n ? disablePlugin(plugin.name)\n : enablePlugin(plugin.name)\n }\n >\n <div style={{\n ...styles.toggleKnob,\n ...(plugin.enabled ? styles.toggleKnobActive : {}),\n }} />\n </div>\n <button\n type=\"button\"\n style={styles.uninstallBtn}\n onClick={() => unregisterPlugin(plugin.name)}\n >\n Remove\n </button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div style={styles.pluginEmpty}>\n No plugins installed\n </div>\n )}\n\n {/* Available plugins */}\n {availablePlugins.filter(p => !plugins.some(installed => installed.name === p.name)).length > 0 && (\n <>\n <div style={styles.availablePluginsHeader}>Available</div>\n <div style={styles.pluginList}>\n {availablePlugins\n .filter(p => !plugins.some(installed => installed.name === p.name))\n .map(plugin => (\n <div key={plugin.name} style={styles.pluginRow}>\n <div style={styles.pluginInfo}>\n <span style={styles.pluginIcon}>📦</span>\n <div style={styles.pluginDetails}>\n <span style={styles.pluginName}>{plugin.name}</span>\n <span style={styles.pluginMeta}>{plugin.description}</span>\n </div>\n </div>\n <button\n type=\"button\"\n style={styles.installBtn}\n onClick={() => registerPlugin(plugin)}\n >\n + Install\n </button>\n </div>\n ))}\n </div>\n </>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Messages area */}\n <div style={styles.messagesArea}>\n {messages.length === 0 && (\n <div style={styles.messagesEmpty}>\n <p>{getPlaceholderMessage()}</p>\n </div>\n )}\n\n <div style={styles.messagesContainer}>\n {messages.map(message => (\n <MessageBubble\n key={message.id}\n message={message}\n showDebug={showDebug}\n />\n ))}\n </div>\n\n {/* Current tool calls indicator */}\n {currentToolCalls.length > 0 && (\n <div style={styles.toolCallsIndicator}>\n {currentToolCalls.map(tool => (\n <span key={tool.toolCallId} style={styles.toolCallBadge}>\n <span style={styles.toolCallDot} />\n {tool.toolName}\n </span>\n ))}\n </div>\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Attachments preview */}\n {attachments.length > 0 && (\n <div style={styles.attachmentsPreview}>\n {attachments.map((att, index) => (\n <div key={index} style={styles.attachmentItem}>\n <span style={styles.attachmentName}>{att.name}</span>\n <button\n type=\"button\"\n onClick={() => removeAttachment(index)}\n style={styles.attachmentRemove}\n >\n ×\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Input area */}\n <div style={styles.inputArea}>\n <div style={styles.inputRow}>\n {/* Input container with attached file button */}\n <div style={styles.inputContainer}>\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n style={styles.attachBtn}\n title=\"Attach file\"\n >\n <AttachIcon />\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n onChange={handleFileSelect}\n style={{ display: 'none' }}\n />\n <div style={styles.inputWrapper}>\n <textarea\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n onKeyPress={handleKeyPress}\n placeholder={placeholder}\n disabled={!canChat || isStreaming || isLoading}\n rows={1}\n style={{\n ...styles.input,\n ...(!canChat || isStreaming || isLoading ? styles.inputDisabled : {}),\n }}\n />\n </div>\n </div>\n\n {/* Send button */}\n <button\n type=\"button\"\n onClick={sendMessage}\n disabled={!canChat || !inputValue.trim() || isStreaming || isLoading}\n style={{\n ...styles.sendBtn,\n ...(!canChat || !inputValue.trim() || isStreaming || isLoading\n ? styles.sendBtnDisabled\n : {}),\n }}\n >\n {isStreaming ? (\n <span style={styles.sendSpinner} />\n ) : (\n 'Send'\n )}\n </button>\n </div>\n\n {/* Error display */}\n {error && (\n <div style={styles.errorBox}>\n {error.message}\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n/**\n * Message bubble component\n */\ninterface MessageBubbleProps {\n message: DisplayMessage;\n showDebug?: boolean;\n}\n\nfunction MessageBubble({ message, showDebug }: MessageBubbleProps) {\n const isUser = message.role === 'user';\n const isSystem = message.role === 'system';\n\n const containerStyle = {\n ...styles.messageBubbleContainer,\n ...(isUser ? styles.messageBubbleUser : styles.messageBubbleAssistant),\n };\n\n const bubbleStyle = {\n ...styles.messageBubble,\n ...(isUser\n ? styles.messageBubbleUserStyle\n : isSystem\n ? styles.messageBubbleSystemStyle\n : styles.messageBubbleAssistantStyle),\n };\n\n return (\n <div style={containerStyle}>\n <div style={bubbleStyle}>\n {/* Message content */}\n <div style={styles.messageContent}>\n {isUser || isSystem ? (\n // User and system messages: plain text\n message.content\n ) : (\n // Assistant messages: render markdown\n <MarkdownContent content={message.content} />\n )}\n {message.isStreaming && (\n <span style={styles.streamingCursor} />\n )}\n </div>\n\n {/* Tool calls (debug mode) */}\n {showDebug && message.toolCalls && message.toolCalls.length > 0 && (\n <div style={styles.toolCallsDebug}>\n <div style={styles.toolCallsDebugTitle}>Tool calls:</div>\n {message.toolCalls.map(tool => (\n <div key={tool.toolCallId} style={styles.toolCallDebugItem}>\n <span style={styles.toolCallDebugName}>{tool.toolName}</span>\n {tool.args && (\n <pre style={styles.toolCallDebugArgs}>\n {JSON.stringify(tool.args, null, 2)}\n </pre>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Settings icon\n */\nfunction SettingsIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\" />\n </svg>\n );\n}\n\n/**\n * Attach icon\n */\nfunction AttachIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n );\n}\n\nexport default HustleChat;\n","/**\n * Utility functions for Emblem Auth + Hustle SDK integration\n */\n\n/**\n * Truncate a wallet address for display\n * @example truncateAddress('0x1234567890abcdef1234567890abcdef12345678') => '0x1234...5678'\n */\nexport function truncateAddress(address: string, startChars = 6, endChars = 4): string {\n if (!address) return '';\n if (address.length <= startChars + endChars) return address;\n return `${address.slice(0, startChars)}...${address.slice(-endChars)}`;\n}\n\n/**\n * Copy text to clipboard\n * @returns true if successful, false otherwise\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fallback for older browsers\n try {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n const success = document.execCommand('copy');\n document.body.removeChild(textarea);\n return success;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Generate a unique ID\n */\nexport function generateId(prefix = 'id'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\n/**\n * Decode JWT payload (without verification)\n * @returns Decoded payload object or null if invalid\n */\nexport function decodeJwtPayload(token: string): Record<string, unknown> | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(atob(parts[1]));\n return payload;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if a JWT is expired\n * @returns true if expired or invalid, false if valid\n */\nexport function isJwtExpired(token: string): boolean {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload.exp !== 'number') return true;\n return Date.now() >= payload.exp * 1000;\n}\n\n/**\n * Format file size for display\n * @example formatFileSize(1024) => '1 KB'\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;\n}\n\n/**\n * Create a debounced function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n}\n\n/**\n * Storage keys for persistence\n */\nexport const STORAGE_KEYS = {\n AUTH_SESSION: 'emblem_auth_session',\n HUSTLE_SETTINGS: 'hustle_settings',\n CHAT_HISTORY: 'hustle_chat_history',\n PLUGINS: 'hustle-plugins',\n} as const;\n\n/**\n * Default configuration values\n */\nexport const DEFAULTS = {\n HUSTLE_API_URL: 'https://agenthustle.ai',\n EMBLEM_API_URL: 'https://api.emblemvault.ai',\n EMBLEM_MODAL_URL: 'https://emblemvault.ai/connect',\n} as const;\n\n// Plugin registry\nexport {\n pluginRegistry,\n hydratePlugin,\n} from './pluginRegistry';\n"]}