@ghostspeak/sdk 2.0.6 → 2.0.8

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 (118) hide show
  1. package/README.md +295 -30
  2. package/dist/GhostSpeakClient-bnXwUPHI.d.ts +1011 -0
  3. package/dist/StakingModule-DunDShLq.d.ts +2446 -0
  4. package/dist/{agent-M74TCRON.js → agent-S42FIMR7.js} +4 -4
  5. package/dist/{agent-M74TCRON.js.map → agent-S42FIMR7.js.map} +1 -1
  6. package/dist/batch-operations-45CQFEID.js +4 -0
  7. package/dist/batch-operations-45CQFEID.js.map +1 -0
  8. package/dist/browser-CI5_6Gzk.d.ts +234 -0
  9. package/dist/browser.d.ts +6 -576
  10. package/dist/browser.js +15 -842
  11. package/dist/browser.js.map +1 -1
  12. package/dist/chunk-46QWY3MG.js +156 -0
  13. package/dist/chunk-46QWY3MG.js.map +1 -0
  14. package/dist/{chunk-F3DZMBUA.js → chunk-5QBSC4T4.js} +327 -493
  15. package/dist/chunk-5QBSC4T4.js.map +1 -0
  16. package/dist/chunk-5QZVFUXB.js +4176 -0
  17. package/dist/chunk-5QZVFUXB.js.map +1 -0
  18. package/dist/chunk-6XCCMJ6M.js +1865 -0
  19. package/dist/chunk-6XCCMJ6M.js.map +1 -0
  20. package/dist/chunk-A7ALCVUI.js +98 -0
  21. package/dist/chunk-A7ALCVUI.js.map +1 -0
  22. package/dist/chunk-AWMGX3OX.js +814 -0
  23. package/dist/chunk-AWMGX3OX.js.map +1 -0
  24. package/dist/chunk-BF3IQ35I.js +284 -0
  25. package/dist/chunk-BF3IQ35I.js.map +1 -0
  26. package/dist/chunk-BQDGRTVP.js +168 -0
  27. package/dist/chunk-BQDGRTVP.js.map +1 -0
  28. package/dist/chunk-IQM5RASO.js +8502 -0
  29. package/dist/chunk-IQM5RASO.js.map +1 -0
  30. package/dist/chunk-JYXSOXCP.js +3850 -0
  31. package/dist/chunk-JYXSOXCP.js.map +1 -0
  32. package/dist/chunk-OXA7MECJ.js +7787 -0
  33. package/dist/chunk-OXA7MECJ.js.map +1 -0
  34. package/dist/chunk-QLRWUHN2.js +231 -0
  35. package/dist/chunk-QLRWUHN2.js.map +1 -0
  36. package/dist/chunk-SKMJJ3Q6.js +125 -0
  37. package/dist/chunk-SKMJJ3Q6.js.map +1 -0
  38. package/dist/chunk-TTB4OS2D.js +69 -0
  39. package/dist/chunk-TTB4OS2D.js.map +1 -0
  40. package/dist/chunk-UP2VWCW5.js +33 -0
  41. package/dist/{chunk-NSBPE2FW.js.map → chunk-UP2VWCW5.js.map} +1 -1
  42. package/dist/{chunk-UJUGGLMT.js → chunk-VQZQCHUT.js} +5 -5
  43. package/dist/{chunk-UJUGGLMT.js.map → chunk-VQZQCHUT.js.map} +1 -1
  44. package/dist/client.d.ts +4 -4
  45. package/dist/client.js +11 -10
  46. package/dist/createAgentAuthorization-KGZNXZBT.js +5 -0
  47. package/dist/createAgentAuthorization-KGZNXZBT.js.map +1 -0
  48. package/dist/credentials.js +1 -1
  49. package/dist/crypto.js +2 -2
  50. package/dist/errors.js +1 -1
  51. package/dist/feature-flags-B1g0DCPe.d.ts +1181 -0
  52. package/dist/generated-QJREJQ2C.js +9 -0
  53. package/dist/{generated-VNLHMR6Y.js.map → generated-QJREJQ2C.js.map} +1 -1
  54. package/dist/{ghostspeak_wasm-SB2RPJ3D.js → ghostspeak_wasm-F227HOSM.js} +3 -3
  55. package/dist/{ghostspeak_wasm-SB2RPJ3D.js.map → ghostspeak_wasm-F227HOSM.js.map} +1 -1
  56. package/dist/index.d.ts +1179 -1498
  57. package/dist/index.js +356 -3578
  58. package/dist/index.js.map +1 -1
  59. package/dist/metafile-esm.json +1 -1
  60. package/dist/minimal/core-minimal.d.ts +2446 -1245
  61. package/dist/minimal/core-minimal.js +9 -9
  62. package/dist/minimal/core-minimal.js.map +1 -1
  63. package/dist/nacl-fast-W5BJ3KZ2.js +2229 -0
  64. package/dist/nacl-fast-W5BJ3KZ2.js.map +1 -0
  65. package/dist/pda-4KP7CURF.js +4 -0
  66. package/dist/pda-4KP7CURF.js.map +1 -0
  67. package/dist/pda-Ce7VYg4T.d.ts +25 -0
  68. package/dist/reputation-types-Yebf0Rm_.d.ts +1071 -0
  69. package/dist/revokeAuthorization-2ZRO6GUZ.js +5 -0
  70. package/dist/revokeAuthorization-2ZRO6GUZ.js.map +1 -0
  71. package/dist/signature-verification-DGxR4aYQ.d.ts +448 -0
  72. package/dist/types.js +1 -1
  73. package/dist/updateReputationWithAuth-PCEUOCFV.js +5 -0
  74. package/dist/updateReputationWithAuth-PCEUOCFV.js.map +1 -0
  75. package/dist/utils.d.ts +69 -203
  76. package/dist/utils.js +15 -153
  77. package/dist/utils.js.map +1 -1
  78. package/package.json +27 -34
  79. package/dist/.tsbuildinfo +0 -1
  80. package/dist/GhostSpeakClient-D_66Uzsf.d.ts +0 -707
  81. package/dist/GovernanceModule-DQYYys-H.d.ts +0 -1766
  82. package/dist/chunk-APCKGD23.js +0 -1328
  83. package/dist/chunk-APCKGD23.js.map +0 -1
  84. package/dist/chunk-ASQXX4IT.js +0 -572
  85. package/dist/chunk-ASQXX4IT.js.map +0 -1
  86. package/dist/chunk-COGZFWOT.js +0 -19657
  87. package/dist/chunk-COGZFWOT.js.map +0 -1
  88. package/dist/chunk-F3DZMBUA.js.map +0 -1
  89. package/dist/chunk-GMHIUK2R.js +0 -7526
  90. package/dist/chunk-GMHIUK2R.js.map +0 -1
  91. package/dist/chunk-IAWBZYPE.js +0 -356
  92. package/dist/chunk-IAWBZYPE.js.map +0 -1
  93. package/dist/chunk-NSBPE2FW.js +0 -15
  94. package/dist/chunk-OWYHJG6H.js +0 -13311
  95. package/dist/chunk-OWYHJG6H.js.map +0 -1
  96. package/dist/chunk-RDDPOFR5.js +0 -3
  97. package/dist/chunk-RDDPOFR5.js.map +0 -1
  98. package/dist/chunk-RERCHKZP.js +0 -35
  99. package/dist/chunk-RERCHKZP.js.map +0 -1
  100. package/dist/chunk-TVVGXYCI.js +0 -2887
  101. package/dist/chunk-TVVGXYCI.js.map +0 -1
  102. package/dist/chunk-ZGP5552B.js +0 -377
  103. package/dist/chunk-ZGP5552B.js.map +0 -1
  104. package/dist/chunk-ZWOYNHVK.js +0 -196
  105. package/dist/chunk-ZWOYNHVK.js.map +0 -1
  106. package/dist/dist/.tsbuildinfo +0 -1
  107. package/dist/elgamal-VZLWB3XK.js +0 -5
  108. package/dist/elgamal-VZLWB3XK.js.map +0 -1
  109. package/dist/feature-flags-V722ZuXO.d.ts +0 -3512
  110. package/dist/generated-VNLHMR6Y.js +0 -5
  111. package/dist/ipfs-types-BOt9ZNg4.d.ts +0 -592
  112. package/dist/multisigConfig-BzEhy6jy.d.ts +0 -58
  113. package/dist/pda-B_nS8SbD.d.ts +0 -114
  114. package/dist/pda-S4BFJVGE.js +0 -4
  115. package/dist/pda-S4BFJVGE.js.map +0 -1
  116. package/dist/system-addresses-BFNLEbFx.d.ts +0 -857
  117. package/dist/token-2022-rpc-RALH4RK7.js +0 -593
  118. package/dist/token-2022-rpc-RALH4RK7.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/discriminator-validator.ts","../src/utils/account-migration.ts","../src/utils/account-diagnostics.ts","../src/utils/token-utils.ts","../src/utils/token-2022-extensions.ts","../src/utils/feature-flags.ts","../src/utils/client-encryption.ts"],"names":["AGENT_DISCRIMINATOR","TokenProgram","TokenExtension","result","getAddressEncoder","TokenAccountState"],"mappings":";;;;;;;;;AAgDO,SAAS,4BAAA,CACd,aACA,qBAAA,EAC+B;AAE/B,EAAA,IAAI,WAAA,CAAY,MAAA,GAAS,qBAAA,CAAsB,MAAA,EAAQ;AACrD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAgB,qBAAA,CAAsB,MAAA;AAAA,MACtC,cAAc,WAAA,CAAY,MAAA;AAAA,MAC1B,SAAA,EAAW,KAAA;AAAA,MACX,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAc,CAAA,qCAAA,EAAwC,qBAAA,CAAsB,MAAM,CAAA,YAAA,EAAe,YAAY,MAAM,CAAA;AAAA,KACrH;AAAA,EACF;AAGA,EAAA,MAAM,mBAAA,GAAsB,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,sBAAsB,MAAM,CAAA;AAG7E,EAAA,MAAM,OAAA,GAAU,oBAAoB,KAAA,CAAM,CAAC,MAAM,KAAA,KAAU,IAAA,KAAS,qBAAA,CAAsB,KAAK,CAAC,CAAA;AAEhG,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,gBAAgB,qBAAA,CAAsB,MAAA;AAAA,MACtC,cAAc,mBAAA,CAAoB,MAAA;AAAA,MAClC,SAAA,EAAW,IAAA;AAAA,MACX,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAGA,EAAA,IAAI,mBAAA,CAAoB,UAAU,CAAA,EAAG;AACnC,IAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAElD,IAAA,IAAI,YAAY,CAAC,CAAA,KAAM,KAAK,WAAA,CAAY,CAAC,MAAM,CAAA,EAAG;AAChD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,gBAAgB,qBAAA,CAAsB,MAAA;AAAA,QACtC,YAAA,EAAc,CAAA;AAAA;AAAA,QACd,SAAA,EAAW,KAAA;AAAA,QACX,cAAA,EAAgB,IAAA;AAAA,QAChB,YAAA,EAAc,CAAA,8DAAA;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,gBAAgB,qBAAA,CAAsB,MAAA;AAAA,IACtC,cAAc,mBAAA,CAAoB,MAAA;AAAA,IAClC,SAAA,EAAW,KAAA;AAAA,IACX,cAAA,EAAgB,IAAA;AAAA,IAChB,cAAc,CAAA,kCAAA,EAAqC,KAAA,CAAM,IAAA,CAAK,qBAAqB,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,QAAA,EAAW,MAAM,IAAA,CAAK,mBAAmB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,GACtJ;AACF;AAqFO,SAAS,+BAAA,CACd,UAAA,EACA,WAAA,EACA,OAAA,EACQ;AACR,EAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,IAAA,OAAO;AAAA,MACL,CAAA,cAAA,EAAO,WAAW,CAAA,0BAAA,EAA6B,OAAO,CAAA,CAAA;AAAA,MACtD,CAAA,UAAA,EAAa,WAAW,YAAY,CAAA,CAAA;AAAA,MACpC,CAAA,4EAAA,CAAA;AAAA,MACA,kCAAkC,OAAO,CAAA,uBAAA;AAAA,KAC3C,CAAE,KAAK,IAAI,CAAA;AAAA,EACb;AAEA,EAAA,IAAI,CAAC,WAAW,SAAA,EAAW;AACzB,IAAA,OAAO;AAAA,MACL,CAAA,wBAAA,EAAsB,WAAW,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA;AAAA,MACrD,CAAA,UAAA,EAAa,WAAW,YAAY,CAAA,CAAA;AAAA,MACpC,CAAA,sDAAA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,CAAA,OAAA,EAAK,WAAW,CAAA,mBAAA,EAAsB,OAAO,CAAA,CAAA;AACtD;AAMA,eAAsB,gBACpB,cAAA,EACqD;AACrD,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,mBAAA,EAAAA,oBAAAA,EAAqB,iBAAgB,GAAI,MAAM,OAAO,qBAAgC,CAAA;AAG9F,IAAA,MAAM,UAAA,GAAa,4BAAA,CAA6B,cAAA,CAAe,IAAA,EAAMA,oBAAmB,CAAA;AAExF,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,IAAI,CAAA;AAC/C,QAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAK;AAAA,MAC9B,SAAS,WAAA,EAAa;AACpB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+BAAA,EAAkC,cAAA,CAAe,OAAO,KAAK,WAAW,CAAA;AACrF,QAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,cAAA,CAAe,OAAO,KAAK,KAAK,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,SAAS,kBAAA,CACd,gBACA,OAAA,EACyB;AACzB,EAAA,IAAI,EAAE,QAAA,IAAY,cAAA,CAAA,IAAmB,CAAC,eAAe,MAAA,EAAQ;AAC3D,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,mBAAA,EAAqB,CAAA;AAAA,MACrB,cAAA,EAAgB,KAAA;AAAA,MAChB,cAAA,EAAgB,KAAA;AAAA,MAChB,OAAA,EAAS,IAAI,UAAA,CAAW,CAAC;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,IAAU,cAAA,GAAiB,eAAe,IAAA,GAAO,IAAI,WAAW,CAAC,CAAA;AAG9E,EAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,CAAA;AACnD,EAAA,MAAM,gBAAgB,mBAAA,GAAsB,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,EAAG,mBAAmB,CAAA,GAAI,IAAA;AAErF,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,YAAY,IAAA,CAAK,MAAA;AAAA,IACjB,aAAA;AAAA,IACA,mBAAA;AAAA,IACA,cAAA,EAAgB,KAAA;AAAA;AAAA,IAChB,cAAA,EAAgB,mBAAA,GAAsB,CAAA,IAAK,mBAAA,GAAsB,CAAA;AAAA,IACjE,OAAA,EAAS;AAAA,GACX;AACF;;;AC/OA,eAAsB,mBAAA,CACpB,gBACA,OAAA,EACwB;AACxB,EAAA,MAAM,IAAA,GAAsB;AAAA,IAC1B,OAAA;AAAA,IACA,YAAA,EAAc,YAAA;AAAA,IACd,aAAA,EAAe,MAAA;AAAA,IACf,QAAQ,EAAC;AAAA,IACT,iBAAiB,EAAC;AAAA,IAClB,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,IAAI,EAAE,QAAA,IAAY,cAAA,CAAA,IAAmB,CAAC,eAAe,MAAA,EAAQ;AAC3D,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,8CAA8C,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,EAAE,mBAAA,EAAAA,oBAAAA,EAAoB,GAAI,MAAM,OAAO,qBAAgC,CAAA;AAC7E,EAAA,MAAM,UAAA,GAAa,4BAAA,CAA6B,cAAA,CAAe,IAAA,EAAMA,oBAAmB,CAAA;AACxF,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,cAAA,EAAgB,OAAO,CAAA;AAG7D,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AACpB,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,0CAA0C,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,iBAAA;AACpB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,qDAAA,EAAwD,UAAA,CAAW,YAAY,CAAA,MAAA,CAAQ,CAAA;AAAA,EAC1G,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gDAAgD,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,UAAA,CAAW,wBAAwB,CAAA,EAAG;AAExC,IAAA,IAAA,CAAK,aAAA,GAAgB,UAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,iDAAiD,CAAA;AAClE,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,2DAA2D,CAAA;AACrF,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,wCAAwC,CAAA;AAAA,EACpE,CAAA,MAAA,IAAW,UAAA,CAAW,mBAAA,KAAwB,CAAA,EAAG;AAE/C,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,4DAA4D,CAAA;AAC7E,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,0CAA0C,CAAA;AAAA,EACtE,CAAA,MAAA,IAAW,UAAA,CAAW,mBAAA,GAAsB,CAAA,EAAG;AAE7C,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAA,gCAAA,EAAmC,UAAA,CAAW,mBAAmB,CAAA,OAAA,CAAS,CAAA;AAC3F,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,qDAAqD,CAAA;AAAA,EACjF,CAAA,MAAO;AAEL,IAAA,IAAA,CAAK,aAAA,GAAgB,iBAAA;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mDAAmD,CAAA;AACpE,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,yCAAyC,CAAA;AACnE,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,sDAAsD,CAAA;AAAA,EAClF;AAGA,EAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,aAAA,KAAkB,UAAA,IAAc,WAAW,UAAA,GAAa,CAAA;AAEnF,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,kBACd,cAAA,EACwB;AACxB,EAAA,IAAI,EAAE,QAAA,IAAY,cAAA,CAAA,IAAmB,CAAC,cAAA,CAAe,MAAA,IAAU,EAAE,MAAA,IAAU,cAAA,CAAA,IAAmB,cAAA,CAAe,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC5H,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAQ,MAAA,IAAU,cAAA,GAAkB,eAAe,IAAA,GAAO,IAAI,WAAW,CAAC,CAAA;AAEhF,EAAA,IAAI;AAEF,IAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA;AAAA;AAAA,OAGhC;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,kCAAkC,KAAK,CAAA;AAAA,EACtD;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,sBACpB,QAAA,EAWC;AACD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,EAAE,OAAA,EAAS,gBAAe,KACtE,mBAAA,CAAoB,gBAAgB,OAAO;AAAA,GAC5C,CAAA;AAED,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,OAAO,KAAA,CAAM,MAAA;AAAA,IACb,OAAO,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,YAAA,KAAiB,OAAO,CAAA,CAAE,MAAA;AAAA,IACrD,gBAAgB,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,YAAA,KAAiB,iBAAiB,CAAA,CAAE,MAAA;AAAA,IACxE,SAAS,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,YAAA,KAAiB,SAAS,CAAA,CAAE,MAAA;AAAA,IACzD,gBAAgB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,CAAA,CAAE;AAAA,GACtD;AAEA,EAAA,MAAM,kBAA4B,EAAC;AAEnC,EAAA,IAAI,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC9B,IAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAA,wBAAA,CAA0B,CAAA;AAAA,EAC1E;AAEA,EAAA,IAAI,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC9B,IAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAA,8BAAA,CAAgC,CAAA;AAAA,EAChF;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,IAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,sDAAA,CAAwD,CAAA;AAAA,EACjG;AAEA,EAAA,IAAI,OAAA,CAAQ,cAAA,KAAmB,CAAA,IAAK,OAAA,CAAQ,YAAY,CAAA,EAAG;AACzD,IAAA,eAAA,CAAgB,KAAK,wCAAwC,CAAA;AAAA,EAC/D,CAAA,MAAO;AACL,IAAA,eAAA,CAAgB,KAAK,mEAAmE,CAAA;AACxF,IAAA,eAAA,CAAgB,KAAK,gDAAgD,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAsB,iBAAA,CACpB,gBACA,OAAA,EASC;AACD,EAAA,MAAM,IAAA,GAAO,MAAM,mBAAA,CAAoB,cAAA,EAAgB,OAAO,CAAA;AAE9D,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,YAAA,EAAc,KAAA;AAAA,IACd,gBAAgB,EAAC;AAAA,IACjB,UAAU,EAAC;AAAA,IACX,iBAAiB;AAAC,GACpB;AAEA,EAAA,IAAI,IAAA,CAAK,iBAAiB,OAAA,EAAS;AACjC,IAAA,UAAA,CAAW,YAAA,GAAe,IAAA;AAC1B,IAAA,UAAA,CAAW,cAAA,CAAe,KAAK,gDAAgD,CAAA;AAC/E,IAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAAA,EAC5B;AAEA,EAAA,QAAQ,KAAK,aAAA;AAAe,IAC1B,KAAK,UAAA;AACH,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,kCAAkC,CAAA;AACjE,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,2CAA2C,CAAA;AAC1E,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,kCAAkC,CAAA;AACjE,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,sBAAsB,CAAA;AACrD,MAAA,UAAA,CAAW,eAAA,CAAgB,KAAK,iCAAiC,CAAA;AACjE,MAAA,UAAA,CAAW,QAAA,CAAS,KAAK,yCAAyC,CAAA;AAClE,MAAA,UAAA,CAAW,eAAe,IAAA,CAAK,cAAA;AAC/B,MAAA;AAAA,IAEF,KAAK,iBAAA;AACH,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,iCAAiC,CAAA;AAChE,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,0BAA0B,CAAA;AACzD,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,yBAAyB,CAAA;AACxD,MAAA,UAAA,CAAW,QAAA,CAAS,KAAK,iCAAiC,CAAA;AAC1D,MAAA,UAAA,CAAW,eAAA,CAAgB,KAAK,8BAA8B,CAAA;AAC9D,MAAA,UAAA,CAAW,YAAA,GAAe,KAAA;AAC1B,MAAA;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,kCAAkC,CAAA;AACjE,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,wCAAwC,CAAA;AACvE,MAAA,UAAA,CAAW,QAAA,CAAS,KAAK,gCAAgC,CAAA;AACzD,MAAA,UAAA,CAAW,eAAA,CAAgB,KAAK,2CAA2C,CAAA;AAC3E,MAAA,UAAA,CAAW,YAAA,GAAe,KAAA;AAC1B,MAAA;AAAA,IAEF;AACE,MAAA,UAAA,CAAW,cAAA,CAAe,KAAK,iCAAiC,CAAA;AAChE,MAAA,UAAA,CAAW,YAAA,GAAe,KAAA;AAAA;AAG9B,EAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAC5B;AAKO,SAAS,yBAAyB,IAAA,EAA+B;AACtE,EAAA,MAAM,eAAyB,EAAC;AAEhC,EAAA,QAAQ,KAAK,aAAA;AAAe,IAC1B,KAAK,MAAA;AACH,MAAA,YAAA,CAAa,KAAK,yDAAoD,CAAA;AACtE,MAAA;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,YAAA,CAAa,KAAK,wCAAiC,CAAA;AACnD,MAAA,YAAA,CAAa,KAAK,wEAAwE,CAAA;AAC1F,MAAA,YAAA,CAAa,KAAK,0DAA0D,CAAA;AAC5E,MAAA,YAAA,CAAa,KAAK,mDAAmD,CAAA;AACrE,MAAA,YAAA,CAAa,KAAK,2EAAiE,CAAA;AACnF,MAAA;AAAA,IAEF,KAAK,iBAAA;AACH,MAAA,YAAA,CAAa,KAAK,qCAA8B,CAAA;AAChD,MAAA,YAAA,CAAa,KAAK,2DAA2D,CAAA;AAC7E,MAAA,YAAA,CAAa,KAAK,wCAAwC,CAAA;AAC1D,MAAA,YAAA,CAAa,KAAK,+CAA+C,CAAA;AACjE,MAAA;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,YAAA,CAAa,KAAK,iCAA4B,CAAA;AAC9C,MAAA,YAAA,CAAa,KAAK,kDAAkD,CAAA;AACpE,MAAA,YAAA,CAAa,KAAK,oCAAoC,CAAA;AACtD,MAAA,YAAA,CAAa,KAAK,4DAA4D,CAAA;AAC9E,MAAA;AAAA;AAGJ,EAAA,OAAO,YAAA;AACT;;;ACxSA,IAAA,2BAAA,GAAA;AAAA,QAAA,CAAA,2BAAA,EAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA6DA,eAAsB,qBAAA,CACpB,gBACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,EAAA,MAAM,aAAA,GAAiB,QAAA,IAAY,cAAA,IAAmB,cAAA,CAAe,MAAA;AAErE,EAAA,IAAI,uBAAA,EAAyB,YAAY,aAAA,EAAe,mBAAA;AAExD,EAAA,IAAI,aAAA,EAAe;AAEjB,IAAA,MAAM,EAAE,mBAAA,EAAAA,oBAAAA,EAAoB,GAAI,MAAM,OAAO,qBAAgC,CAAA;AAC7E,IAAA,uBAAA,GAA0B,4BAAA,CAA6B,cAAA,CAAe,IAAA,EAAMA,oBAAmB,CAAA;AAC/F,IAAA,UAAA,GAAa,kBAAA,CAAmB,gBAAgB,OAAO,CAAA;AACvD,IAAA,aAAA,GAAgB,MAAM,mBAAA,CAAoB,cAAA,EAAgB,OAAO,CAAA;AACjE,IAAA,mBAAA,GAAsB,MAAM,iBAAA,CAAkB,cAAA,EAAgB,OAAO,CAAA;AAAA,EACvE,CAAA,MAAO;AAEL,IAAA,uBAAA,GAA0B;AAAA,MACxB,OAAA,EAAS,KAAA;AAAA,MACT,YAAA,EAAc,CAAA;AAAA,MACd,cAAA,EAAgB,CAAA;AAAA,MAChB,SAAA,EAAW,KAAA;AAAA,MACX,cAAA,EAAgB,KAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KAChB;AACA,IAAA,UAAA,GAAa;AAAA,MACX,OAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,mBAAA,EAAqB,CAAA;AAAA,MACrB,cAAA,EAAgB,KAAA;AAAA,MAChB,cAAA,EAAgB,KAAA;AAAA,MAChB,OAAA,EAAS,IAAI,UAAA,CAAW,CAAC;AAAA,KAC3B;AACA,IAAA,aAAA,GAAgB;AAAA,MACd,OAAA;AAAA,MACA,YAAA,EAAc,YAAA;AAAA,MACd,aAAA,EAAe,MAAA;AAAA,MACf,MAAA,EAAQ,CAAC,wBAAwB,CAAA;AAAA,MACjC,eAAA,EAAiB,CAAC,iDAAiD,CAAA;AAAA,MACnE,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,mBAAA,GAAsB;AAAA,MACpB,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,YAAA,EAAc,KAAA;AAAA,QACd,cAAA,EAAgB,CAAC,+BAA+B,CAAA;AAAA,QAChD,UAAU,EAAC;AAAA,QACX,eAAA,EAAiB,CAAC,gCAAgC;AAAA;AACpD,KACF;AAAA,EACF;AAGA,EAAA,MAAM,kBAA4B,EAAC;AAEnC,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,eAAA,CAAgB,KAAK,sDAAsD,CAAA;AAAA,EAC7E,CAAA,MAAA,IAAW,wBAAwB,OAAA,EAAS;AAC1C,IAAA,eAAA,CAAgB,KAAK,qCAAqC,CAAA;AAAA,EAC5D,CAAA,MAAO;AACL,IAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,wBAAA,CAAyB,aAAa,CAAC,CAAA;AAAA,EACjE;AAGA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,qBAAA,EAAuB,KAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA;AAAA,IACrD,qBAAqB,UAAA,CAAW,aAAA,GAAgB,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,GAAI,IAAA;AAAA,IACvF,WAAA,EAAa,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACvD,SAAA,EAAY,aAAA,IAAkB,OAAA,IAAW,cAAA,GAAkB,eAAe,KAAA,GAAQ;AAAA,GACpF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,uBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAsB,oBACpB,QAAA,EACgC;AAChC,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,EAAE,OAAA,EAAS,gBAAe,KACxE,qBAAA,CAAsB,gBAAgB,OAAO;AAAA,GAC9C,CAAA;AAED,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,OAAO,OAAA,CAAQ,MAAA;AAAA,IACf,KAAA,EAAO,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,aAAA,IAAiB,CAAA,CAAE,uBAAA,CAAwB,OAAO,CAAA,CAAE,MAAA;AAAA,IACjF,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,iBAAiB,CAAC,CAAA,CAAE,uBAAA,CAAwB,OAAO,CAAA,CAAE,MAAA;AAAA,IACpF,cAAA,EAAgB,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,aAAA,CAAc,YAAA,KAAiB,iBAAiB,CAAA,CAAE,MAAA;AAAA,IACxF,WAAW,OAAA,CAAQ,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,aAAa,CAAA,CAAE;AAAA,GACnD;AAEA,EAAA,MAAM,wBAAkC,EAAC;AAEzC,EAAA,IAAI,OAAA,CAAQ,YAAY,CAAA,EAAG;AACzB,IAAA,qBAAA,CAAsB,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAC/E;AACA,EAAA,IAAI,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC9B,IAAA,qBAAA,CAAsB,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,cAAc,CAAA,wBAAA,CAA0B,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,IAAA,qBAAA,CAAsB,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,0BAAA,CAA4B,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACnC,IAAA,qBAAA,CAAsB,KAAK,0BAA0B,CAAA;AAAA,EACvD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,eAAsB,wBAAA,CACpB,GAAA,EACA,OAAA,EACA,OAAA,EAC2B;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,cAAA,GAAiB,MAAM,mBAAA,CAAoB,GAAA,EAAK,OAAO,CAAA;AAC7D,IAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,cAAA,EAAgB,OAAO,CAAA;AAElE,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+BAAA,EAA2B,OAAO,CAAA,CAAE,CAAA;AAClD,MAAA,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,aAAa,CAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,uBAAA,CAAwB,OAAO,CAAA;AAC5D,MAAA,OAAA,CAAQ,GAAA,CAAI,kBAAA,EAAoB,MAAA,CAAO,aAAA,CAAc,iBAAiB,iBAAiB,CAAA;AACvF,MAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,MAAA,MAAA,CAAO,eAAA,CAAgB,QAAQ,CAAA,GAAA,KAAO,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAO,GAAG,EAAE,CAAC,CAAA;AAE/D,MAAA,IAAI,CAAC,MAAA,CAAO,uBAAA,CAAwB,OAAA,EAAS;AAC3C,QAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA,EAAG;AAC9C,UAAA,MAAA,CAAO,aAAA,CAAc,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAkB,QAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,QACpF;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,IACnB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAG3D,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,aAAA,EAAe,KAAA;AAAA,MACf,uBAAA,EAAyB;AAAA,QACvB,OAAA,EAAS,KAAA;AAAA,QACT,YAAA,EAAc,CAAA;AAAA,QACd,cAAA,EAAgB,CAAA;AAAA,QAChB,SAAA,EAAW,KAAA;AAAA,QACX,cAAA,EAAgB,KAAA;AAAA,QAChB,YAAA,EAAc,4BAA4B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OAC5F;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAA;AAAA,QACA,UAAA,EAAY,CAAA;AAAA,QACZ,aAAA,EAAe,IAAA;AAAA,QACf,mBAAA,EAAqB,CAAA;AAAA,QACrB,cAAA,EAAgB,KAAA;AAAA,QAChB,cAAA,EAAgB,KAAA;AAAA,QAChB,OAAA,EAAS,IAAI,UAAA,CAAW,CAAC;AAAA,OAC3B;AAAA,MACA,aAAA,EAAe;AAAA,QACb,OAAA;AAAA,QACA,YAAA,EAAc,SAAA;AAAA,QACd,aAAA,EAAe,aAAA;AAAA,QACf,MAAA,EAAQ,CAAC,CAAA,yBAAA,EAA4B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,QACvF,eAAA,EAAiB,CAAC,8CAA8C,CAAA;AAAA,QAChE,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,IAAA,EAAM;AAAA,UACJ,OAAA;AAAA,UACA,YAAA,EAAc,SAAA;AAAA,UACd,aAAA,EAAe,aAAA;AAAA,UACf,MAAA,EAAQ,CAAC,CAAA,yBAAA,EAA4B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,UACvF,eAAA,EAAiB,CAAC,8CAA8C,CAAA;AAAA,UAChE,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,UAAA,EAAY;AAAA,UACV,YAAA,EAAc,KAAA;AAAA,UACd,cAAA,EAAgB,CAAC,iCAAiC,CAAA;AAAA,UAClD,QAAA,EAAU,CAAC,8BAA8B,CAAA;AAAA,UACzC,eAAA,EAAiB,CAAC,+CAA+C;AAAA;AACnE,OACF;AAAA,MACA,eAAA,EAAiB,CAAC,8CAA8C,CAAA;AAAA,MAChE,SAAA,EAAW;AAAA,QACT,qBAAA,EAAuB,KAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA;AAAA,QACrD,mBAAA,EAAqB,IAAA;AAAA,QACrB,aAAa,EAAC;AAAA,QACd,SAAA,EAAW;AAAA;AACb,KACF;AAAA,EACF;AACF;AAKA,eAAsB,sBAAA,CACpB,GAAA,EACA,SAAA,EACA,OAAA,EAIgC;AAChC,EAAA,MAAM,aAAA,GAAgB,SAAS,aAAA,IAAiB,EAAA;AAChD,EAAA,MAAM,UAA8B,EAAC;AAGrC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,MAAA,EAAQ,KAAK,aAAA,EAAe;AACxD,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,IAAI,aAAa,CAAA;AAClD,IAAA,MAAM,gBAAgB,KAAA,CAAM,GAAA;AAAA,MAAI,aAC9B,wBAAA,CAAyB,GAAA,EAAK,SAAS,EAAE,YAAA,EAAc,OAAO;AAAA,KAChE;AAEA,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,UAAA,CAAW,aAAa,CAAA;AAE3D,IAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,MAAA,IAAI,MAAA,CAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MAC3B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA,CAAM,6BAAA,EAA+B,MAAA,CAAO,MAAM,CAAA;AAE1D,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,OAAA,EAAS,SAAA;AAAA,UACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,aAAA,EAAe,KAAA;AAAA,UACf,uBAAA,EAAyB;AAAA,YACvB,OAAA,EAAS,KAAA;AAAA,YACT,YAAA,EAAc,CAAA;AAAA,YACd,cAAA,EAAgB,CAAA;AAAA,YAChB,SAAA,EAAW,KAAA;AAAA,YACX,cAAA,EAAgB,KAAA;AAAA,YAChB,YAAA,EAAc;AAAA,WAChB;AAAA,UACA,UAAA,EAAY;AAAA,YACV,OAAA,EAAS,SAAA;AAAA,YACT,UAAA,EAAY,CAAA;AAAA,YACZ,aAAA,EAAe,IAAA;AAAA,YACf,mBAAA,EAAqB,CAAA;AAAA,YACrB,cAAA,EAAgB,KAAA;AAAA,YAChB,cAAA,EAAgB,KAAA;AAAA,YAChB,OAAA,EAAS,IAAI,UAAA,CAAW,CAAC;AAAA,WAC3B;AAAA,UACA,aAAA,EAAe;AAAA,YACb,OAAA,EAAS,SAAA;AAAA,YACT,YAAA,EAAc,SAAA;AAAA,YACd,aAAA,EAAe,aAAA;AAAA,YACf,MAAA,EAAQ,CAAC,yBAAyB,CAAA;AAAA,YAClC,eAAA,EAAiB,CAAC,0BAA0B,CAAA;AAAA,YAC5C,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,mBAAA,EAAqB;AAAA,YACnB,IAAA,EAAM;AAAA,cACJ,OAAA,EAAS,SAAA;AAAA,cACT,YAAA,EAAc,SAAA;AAAA,cACd,aAAA,EAAe,aAAA;AAAA,cACf,MAAA,EAAQ,CAAC,yBAAyB,CAAA;AAAA,cAClC,eAAA,EAAiB,CAAC,0BAA0B,CAAA;AAAA,cAC5C,cAAA,EAAgB;AAAA,aAClB;AAAA,YACA,UAAA,EAAY;AAAA,cACV,YAAA,EAAc,KAAA;AAAA,cACd,cAAA,EAAgB,CAAC,kBAAkB,CAAA;AAAA,cACnC,QAAA,EAAU,CAAC,8BAA8B,CAAA;AAAA,cACzC,eAAA,EAAiB,CAAC,eAAe;AAAA;AACnC,WACF;AAAA,UACA,eAAA,EAAiB,CAAC,0BAA0B,CAAA;AAAA,UAC5C,SAAA,EAAW;AAAA,YACT,qBAAA,EAAuB,KAAA,CAAM,IAAA,CAAK,mBAAmB,CAAA;AAAA,YACrD,mBAAA,EAAqB,IAAA;AAAA,YACrB,aAAa,EAAC;AAAA,YACd,SAAA,EAAW;AAAA;AACb,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,MAAM,mBAAA;AAAA,IACxB,OAAA,CAAQ,IAAI,CAAA,MAAA,MAAW;AAAA,MACrB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,cAAA,EAAgB;AAAA,QACd,QAAQ,MAAA,CAAO,aAAA;AAAA,QACf,IAAA,EAAM,OAAO,UAAA,CAAW,OAAA;AAAA,QACxB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,SAAA,IAAa,EAAA;AAAA,QACrC,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,EAAA;AAAA,QACV,cAAA,EAAgB,MAAA,CAAO,SAAA,CAAU,SAAA,IAAa,EAAA;AAAA,QAC9C,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ;AAAA;AACnC,KACF,CAAE;AAAA,GACJ;AAEA,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,OAAA,CAAQ,MAAM,qCAA8B,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB,WAAA,CAAY,OAAA,CAAQ,KAAK,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB,WAAA,CAAY,OAAA,CAAQ,KAAK,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA;AAC5D,IAAA,OAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB,WAAA,CAAY,OAAA,CAAQ,cAAc,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,IAAA,WAAA,CAAY,qBAAA,CAAsB,QAAQ,CAAA,GAAA,KAAO,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAO,GAAG,EAAE,CAAC,CAAA;AAC1E,IAAA,OAAA,CAAQ,QAAA,EAAS;AAAA,EACnB;AAEA,EAAA,OAAO,WAAA;AACT;AAKO,SAAS,sBAAA,CACd,QACA,QAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AAE3C,EAAA,IAAI,QAAA,EAAU;AAGZ,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,QAAQ,CAAA,CAAE,CAAA;AAC9D,IAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,IAAI,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,IAAA;AACT;AChYO,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AAEL,EAAAA,cAAA,WAAA,CAAA,GAAY,WAAA;AAEZ,EAAAA,cAAA,YAAA,CAAA,GAAa,YAAA;AAJH,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AA2BL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AAEL,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,yBAAsB,CAAA,CAAA,GAAtB,qBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,yBAAsB,CAAA,CAAA,GAAtB,qBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,0BAAuB,CAAA,CAAA,GAAvB,sBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,gCAA6B,CAAA,CAAA,GAA7B,4BAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,mCAAgC,CAAA,CAAA,GAAhC,+BAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,2BAAwB,CAAA,CAAA,GAAxB,uBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,qBAAkB,CAAA,CAAA,GAAlB,iBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,sBAAmB,CAAA,CAAA,GAAnB,kBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,2BAAwB,EAAA,CAAA,GAAxB,uBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,eAAY,EAAA,CAAA,GAAZ,WAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,wBAAqB,EAAA,CAAA,GAArB,oBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,8BAA2B,EAAA,CAAA,GAA3B,0BAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,mBAAgB,EAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,2BAAwB,EAAA,CAAA,GAAxB,uBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,sBAAmB,EAAA,CAAA,GAAnB,kBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,oBAAiB,EAAA,CAAA,GAAjB,gBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,mBAAgB,EAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,iBAAc,EAAA,CAAA,GAAd,aAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,0BAAuB,EAAA,CAAA,GAAvB,sBAAA;AAEA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,wBAAqB,EAAA,CAAA,GAArB,oBAAA;AA5CU,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAuHZ,eAAsB,4BAAA,CACpB,KAAA,EACA,IAAA,EACA,YAAA,GAAwB,qBAAA,EACN;AAClB,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,MAAM,wBAAA,CAAyB;AAAA,IAC/C,cAAA,EAAgB,gCAAA;AAAA,IAChB,KAAA,EAAO;AAAA,MACL,iBAAA,EAAkB,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,MAChC,iBAAA,EAAkB,CAAE,MAAA,CAAO,YAAY,CAAA;AAAA,MACvC,iBAAA,EAAkB,CAAE,MAAA,CAAO,IAAI;AAAA;AACjC,GACD,CAAA;AACD,EAAA,OAAO,OAAA;AACT;AASA,eAAsB,oCAAA,CACpB,OACA,IAAA,EACkB;AAClB,EAAA,OAAO,4BAAA,CAA6B,KAAA,EAAO,IAAA,EAAM,qBAAqB,CAAA;AACxE;AASA,eAAsB,qCAAA,CACpB,OACA,IAAA,EACkB;AAClB,EAAA,OAAO,4BAAA,CAA6B,KAAA,EAAO,IAAA,EAAM,0BAA0B,CAAA;AAC7E;AAUA,eAAsB,yBAAA,CACpB,KAAA,EACA,IAAA,EACA,YAAA,EACiC;AAGjC,EAAA,MAAM,UAAU,YAAA,IAAgB,qBAAA;AAChC,EAAA,MAAM,cAAc,OAAA,KAAY,0BAAA;AAEhC,EAAA,MAAM,OAAA,GAAU,MAAM,4BAAA,CAA6B,KAAA,EAAO,MAAM,OAAO,CAAA;AAEvE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA,EAAc,OAAA;AAAA,IACd;AAAA,GACF;AACF;AAaA,eAAsB,kBAAA,CACpB,IAAA,EACA,WAAA,GAAc,+BAAA,EACI;AAClB,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,aAAa,CAAA;AACtD,IAAA,MAAM,GAAA,GAAM,gBAAgB,WAAW,CAAA;AAGvC,IAAA,MAAM,WAAA,GAAc,MAAM,GAAA,CAAI,cAAA,CAAe,IAAA,EAAM;AAAA,MACjD,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,EAAE,IAAA,EAAK;AAER,IAAA,IAAI,CAAC,YAAY,KAAA,EAAO;AACtB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,IAClD;AAGA,IAAA,MAAM,YAAA,GAAe,YAAY,KAAA,CAAM,KAAA;AAGvC,IAAA,IAAI,iBAAiB,qBAAA,EAAuB;AAC1C,MAAA,OAAO,qBAAA;AAAA,IACT,CAAA,MAAA,IAAW,iBAAiB,0BAAA,EAA4B;AACtD,MAAA,OAAO,0BAAA;AAAA,IACT,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAgC,YAAY,CAAA,yBAAA,CAA2B,CAAA;AACpF,MAAA,OAAO,qBAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAEvE,IAAA,OAAO,qBAAA;AAAA,EACT;AACF;AAQA,eAAsB,gBAAgB,IAAA,EAAiC;AACrE,EAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAC7C,EAAA,OAAO,OAAA,KAAY,0BAAA;AACrB;AAQA,eAAsB,oBAAoB,IAAA,EAAsC;AAC9E,EAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,IAAI,CAAA;AAC9C,EAAA,OAAO,cAAc,YAAA,oBAA0B,WAAA;AACjD;AAeA,eAAsB,wBAAA,CACpB,IAAA,EACA,UAAA,EACA,WAAA,GAAc,+BAAA,EAC4B;AAC1C,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,MAAM,OAAO,8BAAqB,CAAA;AACpE,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,aAAa,CAAA;AAEtD,IAAA,MAAM,GAAA,GAAM,gBAAgB,WAAW,CAAA;AAGvC,IAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,CAAsB,GAAA,EAAK,MAAM,WAAW,CAAA;AAEnE,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,MAAMC,UAAS,EAAC;AAChB,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAAA,OAAAA,CAAO,SAAS,CAAA,GAAI,KAAA;AAAA,MACtB;AACA,MAAA,OAAOA,OAAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAS,EAAC;AAChB,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAElC,MAAA,QAAQ,SAAA;AAAW,QACjB,KAAK,CAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,iBAAiB,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,CAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,kBAAkB,CAAA;AAClE,UAAA;AAAA,QACF,KAAK,CAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,wBAAwB,CAAA;AACxE,UAAA;AAAA,QACF,KAAK,CAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,mBAAmB,CAAA;AACnE,UAAA;AAAA,QACF,KAAK,CAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,eAAe,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,EAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,qBAAqB,CAAA;AACrE,UAAA;AAAA,QACF,KAAK,EAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,iBAAiB,CAAA;AACjE,UAAA;AAAA,QACF,KAAK,EAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,YAAY,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,EAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,eAAe,CAAA;AAC/D,UAAA;AAAA,QACF,KAAK,EAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,aAAa,CAAA;AAC7D,UAAA;AAAA,QACF,KAAK,EAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,YAAY,CAAA;AAC5D,UAAA;AAAA,QACF,KAAK,EAAA;AACH,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,UAAU,CAAA;AAC1D,UAAA;AAAA,QACF;AAEE,UAAA,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA;AAAA;AACxB,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+CAAA,EAAkD,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAG9E,IAAA,MAAM,SAAS,EAAC;AAChB,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA;AAAA,IACtB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AASA,eAAsB,uBAAA,CACpB,IAAA,EACA,WAAA,GAAc,+BAAA,EACI;AAClB,EAAA,MAAM,SAAS,MAAM,wBAAA;AAAA,IACnB,IAAA;AAAA,IACA,CAAC,CAAA,2BAAkC;AAAA,IACnC;AAAA,GACF;AACA,EAAA,OAAO,OAAO,CAAA,2BAAkC;AAClD;AASA,eAAsB,gCAAA,CACpB,IAAA,EACA,WAAA,GAAc,+BAAA,EACI;AAClB,EAAA,MAAM,SAAS,MAAM,wBAAA;AAAA,IACnB,IAAA;AAAA,IACA,CAAC,CAAA,kCAAyC;AAAA,IAC1C;AAAA,GACF;AACA,EAAA,OAAO,OAAO,CAAA,kCAAyC;AACzD;AASA,eAAsB,2BAAA,CACpB,IAAA,EACA,WAAA,GAAc,+BAAA,EACI;AAClB,EAAA,MAAM,SAAS,MAAM,wBAAA;AAAA,IACnB,IAAA;AAAA,IACA,CAAC,EAAA,6BAAoC;AAAA,IACrC;AAAA,GACF;AACA,EAAA,OAAO,OAAO,EAAA,6BAAoC;AACpD;AAQA,eAAsB,oBAAA,CACpB,IAAA,EACA,WAAA,GAAc,+BAAA,EACqB;AACnC,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,MAAM,OAAO,8BAAqB,CAAA;AACpE,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,aAAa,CAAA;AAEtD,IAAA,MAAM,GAAA,GAAM,gBAAgB,WAAW,CAAA;AAGvC,IAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,CAAsB,GAAA,EAAK,MAAM,WAAW,CAAA;AAEnE,IAAA,IAAI,CAAC,QAAA,EAAU,UAAA,CAAW,iBAAA,EAAmB;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,SAAS,UAAA,CAAW,iBAAA;AACnC,IAAA,OAAO;AAAA,MACL,sBAAA,EAAwB,OAAO,gBAAA,CAAiB,sBAAA;AAAA,MAChD,UAAA,EAAY,OAAO,gBAAA,CAAiB,UAAA;AAAA,MACpC,4BAA4B,MAAA,CAAO,0BAAA;AAAA,MACnC,2BAA2B,MAAA,CAAO,yBAAA;AAAA,MAClC,cAAA,EAAgB,OAAO,CAAC,CAAA;AAAA,MACxB,gBAAA,EAAkB;AAAA,QAChB,KAAA,EAAO,MAAA,CAAO,gBAAA,CAAiB,KAAA,IAAS,OAAO,CAAC,CAAA;AAAA,QAChD,sBAAA,EAAwB,MAAA,CAAO,gBAAA,CAAiB,sBAAA,IAA0B,CAAA;AAAA,QAC1E,UAAA,EAAY,MAAA,CAAO,gBAAA,CAAiB,UAAA,IAAc,OAAO,CAAC;AAAA,OAC5D;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,KAAA,EAAO,OAAO,gBAAA,CAAiB,KAAA;AAAA,QAC/B,sBAAA,EAAwB,OAAO,gBAAA,CAAiB,sBAAA;AAAA,QAChD,UAAA,EAAY,OAAO,gBAAA,CAAiB;AAAA;AACtC,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2CAAA,EAA8C,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC1E,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,eAAsB,6BAAA,CACpB,IAAA,EACA,WAAA,GAAc,+BAAA,EAC8B;AAC5C,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,MAAM,OAAO,8BAAqB,CAAA;AACpE,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,aAAa,CAAA;AAEtD,IAAA,MAAM,GAAA,GAAM,gBAAgB,WAAW,CAAA;AAGvC,IAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,CAAsB,GAAA,EAAK,MAAM,WAAW,CAAA;AAEnE,IAAA,IAAI,CAAC,QAAA,EAAU,UAAA,CAAW,wBAAA,EAA0B;AAClD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,SAAS,UAAA,CAAW,wBAAA;AACnC,IAAA,OAAO;AAAA,MACL,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,wBAAwB,MAAA,CAAO,sBAAA;AAAA,MAC/B,sBAAsB,MAAA,CAAO;AAAA,KAC/B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oDAAA,EAAuD,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnF,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,eAAsB,wBAAA,CACpB,IAAA,EACA,WAAA,GAAc,+BAAA,EACyB;AACvC,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,MAAM,OAAO,8BAAqB,CAAA;AACpE,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,MAAM,OAAO,aAAa,CAAA;AAEtD,IAAA,MAAM,GAAA,GAAM,gBAAgB,WAAW,CAAA;AAGvC,IAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,CAAsB,GAAA,EAAK,MAAM,WAAW,CAAA;AAEnE,IAAA,IAAI,CAAC,QAAA,EAAU,UAAA,CAAW,qBAAA,EAAuB;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,MAAA,GAAS,SAAS,UAAA,CAAW,qBAAA;AACnC,IAAA,OAAO;AAAA,MACL,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,uBAAA,EAAyB,MAAA,CAAO,uBAAA,IAA2B,MAAA,CAAO,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAAA,MAC/F,qBAAqB,MAAA,CAAO,mBAAA;AAAA,MAC5B,sBAAsB,MAAA,CAAO;AAAA,KAC/B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,+CAAA,EAAkD,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC9E,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AA2DA,eAAsB,8BAAA,CACpB,OACA,IAAA,EACoD;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,SAAS,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC9C,oCAAA,CAAqC,OAAO,IAAI,CAAA;AAAA,IAChD,qCAAA,CAAsC,OAAO,IAAI;AAAA,GAClD,CAAA;AAED,EAAA,OAAO,EAAE,UAAU,SAAA,EAAU;AAC/B;AAUA,eAAsB,8BAAA,CACpB,OAAA,EACA,KAAA,EACA,IAAA,EACkD;AAClD,EAAA,MAAM,SAAA,GAAY,MAAM,8BAAA,CAA+B,KAAA,EAAO,IAAI,CAAA;AAElE,EAAA,IAAI,OAAA,KAAY,UAAU,QAAA,EAAU;AAClC,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,qBAAA,EAAsB;AAAA,EACzD;AAEA,EAAA,IAAI,OAAA,KAAY,UAAU,SAAA,EAAW;AACnC,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,0BAAA,EAA2B;AAAA,EAC9D;AAEA,EAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAC1B;AAYO,SAAS,uBAAuB,OAAA,EAAgC;AACrE,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,WAAA;AACH,MAAA,OAAO,qBAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,0BAAA;AAAA,IACT;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAE,CAAA;AAAA;AAEzD;AAQO,SAAS,2BAA2B,OAAA,EAAgC;AACzE,EAAA,IAAI,YAAY,qBAAA,EAAuB;AACrC,IAAA,OAAO,WAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAY,0BAAA,EAA4B;AAC1C,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,OAAO,CAAA,CAAE,CAAA;AAC7D;AASO,SAAS,iBAAA,CAAkB,QAAgB,QAAA,EAA0B;AAC1E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,EAAA,IAAM,QAAQ,CAAA;AACrC,EAAA,MAAM,WAAW,MAAA,GAAS,OAAA;AAC1B,EAAA,MAAM,YAAY,MAAA,GAAS,OAAA;AAE3B,EAAA,IAAI,SAAA,KAAc,MAAA,CAAO,CAAC,CAAA,EAAG;AAC3B,IAAA,OAAO,SAAS,QAAA,EAAS;AAAA,EAC3B;AAEA,EAAA,MAAM,eAAe,SAAA,CAAU,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,GAAG,CAAA;AAChE,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEvD,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA;AACxC;AASO,SAAS,gBAAA,CAAiB,WAAmB,QAAA,EAA0B;AAC5E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,GAAW,EAAE,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,CAAO,QAAA,EAAU,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,QAAQ,CAAA;AACvE,EAAA,MAAM,YAAY,KAAA,GAAQ,cAAA;AAC1B,EAAA,OAAO,OAAO,SAAS,CAAA;AACzB;;;AC9vBA,IAAA,6BAAA,GAAA;AAAA,QAAA,CAAA,6BAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,qCAAA,EAAA,MAAA,qCAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,2BAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,wBAAA,EAAA,MAAA,wBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,iCAAA,EAAA,MAAA,iCAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,+BAAA,EAAA,MAAA,+BAAA;AAAA,EAAA,+BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAuEO,SAAS,oBAAA,CACd,gBACA,SAAA,EACwB;AACxB,EAAA,MAAM,EAAE,sBAAA,EAAwB,UAAA,EAAW,GAAI,SAAA;AAG/C,EAAA,MAAM,aAAA,GAAiB,cAAA,GAAiB,MAAA,CAAO,sBAAsB,CAAA,GAAK,MAAA;AAG1E,EAAA,MAAM,SAAA,GAAY,aAAA,GAAgB,UAAA,GAAa,UAAA,GAAa,aAAA;AAC5D,EAAA,MAAM,eAAe,aAAA,GAAgB,UAAA;AAGrC,EAAA,MAAM,YAAY,cAAA,GAAiB,SAAA;AAEnC,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA,EAAgB,sBAAA;AAAA,IAChB;AAAA,GACF;AACF;AAUO,SAAS,qCAAA,CACd,kBACA,SAAA,EACwB;AACxB,EAAA,MAAM,EAAE,wBAAuB,GAAI,SAAA;AAInC,EAAA,MAAM,WAAA,GAAe,gBAAA,GAAmB,MAAA,IAAW,MAAA,GAAS,OAAO,sBAAsB,CAAA,CAAA;AAGzF,EAAA,OAAO,oBAAA,CAAqB,aAAa,SAAS,CAAA;AACpD;AASO,SAAS,uBAAA,CACd,WACA,SAAA,EAC+D;AAC/D,EAAA,MAAM,eAAyC,EAAC;AAChD,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,KAAA,MAAW,kBAAkB,SAAA,EAAW;AACtC,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,cAAA,EAAgB,SAAS,CAAA;AAClE,IAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAC7B,IAAA,SAAA,IAAa,WAAA,CAAY,SAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,EAAE,WAAW,YAAA,EAAa;AACnC;AAoDA,eAAsB,iCAAA,CACpB,MAAA,EACA,aAAA,EACA,eAAA,EACA,aAAA,EACoC;AAEpC,EAAA,MAAM,mBAAA,GAAsB,aAAA,CAAc,MAAA,EAAQ,eAAe,CAAA;AACjE,EAAA,MAAM,eAAA,GAAkB,oBAAoB,mBAAmB,CAAA;AAG/D,EAAA,MAAM,UAAA,GAAa,IAAI,UAAA,CAAW,EAAE,CAAA;AACpC,EAAA,MAAA,CAAO,gBAAgB,UAAU,CAAA;AAGjC,EAAA,MAAM,aAAa,MAAM,kBAAA;AAAA,IACvB,MAAA;AAAA,IACA,mBAAA,CAAoB,UAAA;AAAA,IACpB;AAAA,GACF;AAGA,EAAA,MAAM,gBAAgB,MAAM,qBAAA;AAAA,IAC1B,mBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,iBAAA,GAAoB,aAAA,CAAc,MAAA,EAAQ,aAAa,CAAA;AAC7D,IAAA,MAAM,iBAAA,GAAoB,IAAI,UAAA,CAAW,EAAE,CAAA;AAC3C,IAAA,MAAA,CAAO,gBAAgB,iBAAiB,CAAA;AAGxC,IAAA,MAAM,aAAA,GAAgB,qBAAA;AAAA,MACpB,mBAAA;AAAA,MACA,iBAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,YAAA,GAAe,IAAI,WAAW,GAAG,CAAA;AACjC,IAAA,YAAA,CAAa,GAAA,CAAI,mBAAA,CAAoB,iBAAiB,CAAA,EAAG,CAAC,CAAA;AAC1D,IAAA,YAAA,CAAa,GAAA,CAAI,aAAA,CAAc,KAAA,EAAO,EAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,YAAY,UAAA,CAAW,KAAA;AAAA,IACvB,eAAe,aAAA,CAAc,KAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAYA,eAAsB,+BAAA,CACpB,OACA,YAAA,EAKkB;AAClB,EAAA,IAAI;AAEF,IAAA,IAAI,KAAA,CAAM,eAAA,CAAgB,MAAA,KAAW,EAAA,EAAI;AACvC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,GAAA,EAAK;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,aAAA,CAAc,MAAA,GAAS,EAAA,EAAI;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,YAAA,CAAa,aAAA,IAAiB,CAAC,KAAA,CAAM,YAAA,EAAc;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,YAAA,CAAa,WAAW,GAAA,EAAK;AAC3D,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM;AAAA,MACJ,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,GAAI,MAAM,OAAO,uBAAc,CAAA;AAG/B,IAAA,MAAM,yBAAA,GAA4B,qBAAA,CAAsB,KAAA,CAAM,eAAe,CAAA;AAG7E,IAAA,MAAM,kBAAkB,MAAM,gBAAA;AAAA,MAC5B,EAAE,KAAA,EAAO,KAAA,CAAM,YAAY,UAAA,EAAY,yBAAA,CAA0B,WAAW,UAAA,EAAW;AAAA,MACvF,0BAA0B,UAAA,CAAW;AAAA,KACvC;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,kBAAA,GAAqB,mBAAA;AAAA,MACzB,EAAE,KAAA,EAAO,KAAA,CAAM,aAAA,EAAc;AAAA,MAC7B,yBAAA;AAAA,MACA,YAAA,CAAa;AAAA,KACf;AAEA,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAA,CAAM,YAAA,IAAgB,YAAA,CAAa,aAAA,EAAe;AAEpD,MAAA,MAAM,oBAAoB,qBAAA,CAAsB,KAAA,CAAM,aAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAC/E,MAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA;AAErD,MAAA,MAAM,kBAAA,GAAqB,mBAAA;AAAA,QACzB,EAAE,OAAO,iBAAA,EAAkB;AAAA,QAC3B,yBAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAgCO,SAAS,iBAAA,CACd,SAAA,EACA,MAAA,EACA,gBAAA,EACqB;AACrB,EAAA,MAAM,iBAAA,GAAoB,mBAAmB,MAAA,CAAO,mBAAA;AAIpD,EAAA,MAAM,cAAA,GAAiB,IAAA,GAAO,GAAA,GAAM,GAAA,GAAM,GAAA;AAC1C,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAGjD,EAAA,MAAM,cAAA,GAAkB,SAAA,GAAY,eAAA,GAAkB,iBAAA,IAAsB,MAAA,GAAS,cAAA,CAAA;AACrF,EAAA,MAAM,aAAa,SAAA,GAAY,cAAA;AAG/B,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,iBAAiB,CAAA,GAAI,OAAO,cAAc,CAAA;AACtE,EAAA,MAAM,mBAAA,GAAsB,MAAA,CAAO,WAAA,GAAc,GAAA,GAAM,YAAA;AAEvD,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,uBAAuB,MAAA,CAAO,WAAA;AAAA,IAC9B,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA,EAAW,UAAA;AAAA,IACX;AAAA,GACF;AACF;AAWO,SAAS,yBAAA,CACd,SAAA,EACA,qBAAA,EACA,yBAAA,EACA,KAAA,EACqB;AACrB,EAAA,MAAM,OAAO,qBAAA,GAAwB,GAAA;AACrC,EAAA,MAAM,CAAA,GAAI,yBAAA;AAGV,EAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,GAAO,CAAA,EAAG,IAAI,KAAK,CAAA;AACvD,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAS,CAAA,GAAI,cAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,eAAe,CAAC,CAAA;AACrD,EAAA,MAAM,iBAAiB,UAAA,GAAa,SAAA;AAEpC,EAAA,MAAM,iBAAA,GAAoB,OAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAE,CAAC,CAAA;AAEvE,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,qBAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA,EAAW,UAAA;AAAA,IACX,mBAAA,EAAA,CAAsB,iBAAiB,CAAA,IAAK;AAAA,GAC9C;AACF;AA0CO,SAAS,gCACd,WAAA,EACS;AAET,EAAA,IAAI,CAAC,WAAA,CAAY,SAAA,EAAW,OAAO,KAAA;AACnC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,kBAAkB,GAAG,OAAO,KAAA;AAE3D,EAAA,OAAO,IAAA;AACT;AASO,SAAS,6BAAA,CACd,eACA,OAAA,EACyB;AAEzB,EAAA,MAAM,eAAA,GAAkB,IAAI,UAAA,CAAW;AAAA,IACrC,GAAGC,iBAAAA,EAAkB,CAAE,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IAC5C,GAAGA,iBAAAA,EAAkB,CAAE,MAAA,CAAO,QAAQ,WAAW,CAAA;AAAA,IACjD,GAAGA,iBAAAA,EAAkB,CAAE,MAAA,CAAO,QAAQ,SAAS,CAAA;AAAA,IAC/C,GAAG,aAAA,EAAc,CAAE,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IACxC,GAAGA,iBAAAA,EAAkB,CAAE,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,IAC1C,GAAG,eAAA,EAAgB,CAAE,MAAA,CAAO,QAAQ,WAAW;AAAA,GAChD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,aAAA;AAAA,IACX,eAAA;AAAA,IACA,oBAAoB;AAAC;AAAA,GACvB;AACF;AAwCO,SAAS,uBAAuB,QAAA,EAAqC;AAE1E,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,cAAA,EAAe,CAAE,MAAA,CAAO,UAAU,CAAA;AAClD,EAAA,OAAO,IAAI,WAAW,OAAO,CAAA;AAC/B;AAQO,SAAS,yBAAyB,IAAA,EAAiC;AACxE,EAAA,MAAM,UAAA,GAAa,IAAI,WAAA,EAAY,CAAE,OAAO,IAAI,CAAA;AAChD,EAAA,OAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAC9B;AASO,IAAK,iBAAA,qBAAAC,kBAAAA,KAAL;AAEL,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAEA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,iBAAc,CAAA,CAAA,GAAd,aAAA;AAEA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AANU,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AA2CL,SAAS,WAAA,CACd,KAAA,EACA,iBAAA,GAAoB,KAAA,EACpB,WAAW,KAAA,EACF;AAET,EAAA,IAAI,KAAA,KAAU,qBAA+B,OAAO,KAAA;AACpD,EAAA,IAAI,mBAAmB,OAAO,KAAA;AAC9B,EAAA,IAAI,UAAU,OAAO,KAAA;AAErB,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,sBACd,UAAA,EACkB;AAClB,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AAEzC,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AAGtB,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAA,CAAA;AACE,QAAA,QAAA,CAAS,GAAA,CAAA,CAAA,2BAAsC;AAC/C,QAAA;AAAA,MACF,KAAA,CAAA;AACE,QAAA,QAAA,CAAS,GAAA,CAAA,CAAA,kCAA6C;AACtD,QAAA;AAAA,MACF,KAAA,EAAA;AACE,QAAA,QAAA,CAAS,GAAA,CAAA,EAAA,qBAAgC;AACzC,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAClD;AAYO,SAAS,wBAAwB,WAAA,EAA6B;AACnE,EAAA,OAAO,WAAA,GAAc,GAAA;AACvB;AAQO,SAAS,wBAAwB,UAAA,EAA4B;AAClE,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAK,CAAA;AACtC;AAQO,SAAS,kBAAkB,WAAA,EAA6B;AAC7D,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,WAAW,CAAA,GAAI,GAAA;AAC1D,EAAA,OAAO,CAAA,EAAG,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACjC;AASO,SAAS,oBAAA,CACd,SAAA,EACA,UAAA,GAA+B,EAAC,EACxB;AACR,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,UAAA;AACH,MAAA,SAAA,GAAY,MAAA;AACZ,MAAA;AAAA,IACF,KAAK,gBAAA;AACH,MAAA,SAAA,GAAY,MAAA;AACZ,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,SAAA,GAAY,MAAA;AACZ,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,SAAA,GAAY,MAAA;AACZ,MAAA;AAAA;AAIJ,EAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAA,CAAA;AACE,QAAA,cAAA,IAAkB,KAAA;AAClB,QAAA;AAAA,MACF,KAAA,CAAA;AAAA,MACA,KAAA,CAAA;AACE,QAAA,cAAA,IAAkB,MAAA;AAClB,QAAA;AAAA,MACF,KAAA,EAAA;AACE,QAAA,cAAA,IAAkB,MAAA;AAClB,QAAA;AAAA,MACF;AACE,QAAA,cAAA,IAAkB,KAAA;AAAA;AACtB,EACF;AAEA,EAAA,OAAO,SAAA,GAAY,cAAA;AACrB;AASO,SAAS,wBAAwB,MAAA,EAKlB;AACpB,EAAA,IAAI,MAAA,CAAO,yBAAyB,GAAA,EAAO;AACzC,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO;AAAA,IACL,wBAAwB,MAAA,CAAO,sBAAA;AAAA,IAC/B,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,4BAA4B,MAAA,CAAO,0BAAA;AAAA,IACnC,2BAA2B,MAAA,CAAO,yBAAA;AAAA,IAClC,cAAA,EAAgB,OAAO,CAAC,CAAA;AAAA,IACxB,gBAAA,EAAkB;AAAA,MAChB,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,MACf,sBAAA,EAAwB,CAAA;AAAA,MACxB,UAAA,EAAY,OAAO,CAAC;AAAA,KACtB;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,MACf,wBAAwB,MAAA,CAAO,sBAAA;AAAA,MAC/B,YAAY,MAAA,CAAO;AAAA;AACrB,GACF;AACF;AAKO,SAAS,4BAA4B,MAAA,EAGlB;AACxB,EAAA,IAAI,MAAA,CAAO,WAAA,GAAc,KAAA,IAAS,MAAA,CAAO,cAAc,MAAA,EAAQ;AAC7D,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAC,CAAA;AAE7D,EAAA,OAAO;AAAA,IACL,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,uBAAA,EAAyB,gBAAA;AAAA,IACzB,oBAAA,EAAsB,CAAA;AAAA,IACtB,mBAAA,EAAqB,gBAAA;AAAA,IACrB,aAAa,MAAA,CAAO;AAAA,GACtB;AACF;AAKO,SAAS,mBAAA,CACd,eACA,IAAA,EAC2C;AAC3C,EAAA,QAAQ,aAAA;AAAe,IACrB,KAAK,mBAAA,EAAqB;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,yBAAyB,IAAA,CAAK,CAAC,CAAA,GAAK,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA;AACrD,MAAA,OAAO;AAAA,QACL,sBAAA;AAAA,QACA,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA;AAAA,QACpB,0BAAA,EAA4B,IAAA;AAAA,QAC5B,yBAAA,EAA2B,IAAA;AAAA,QAC3B,cAAA,EAAgB,OAAO,CAAC,CAAA;AAAA,QACxB,gBAAA,EAAkB;AAAA,UAChB,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,UACf,sBAAA,EAAwB,CAAA;AAAA,UACxB,UAAA,EAAY,OAAO,CAAC;AAAA,SACtB;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,UACf,sBAAA;AAAA,UACA,UAAA,EAAY,OAAO,CAAC;AAAA;AACtB,OACF;AAAA,IACF;AAAA,IAEA,KAAK,uBAAA,EAAyB;AAC5B,MAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,QAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,MACjD;AAEA,MAAA,IAAI,SAAA,GAAY,EAAA;AAChB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,SAAA,IAAa,OAAO,IAAA,CAAK,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,MAC9C;AACA,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,IAAA;AAAA,QACf,uBAAA,EAAyB,SAAA;AAAA,QACzB,oBAAA,EAAsB,CAAA;AAAA,QACtB,mBAAA,EAAqB,SAAA;AAAA,QACrB,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAAA,IAEA;AACE,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA;AAE9C;;;ACj2BA,IAAA,qBAAA,GAAA;AAAA,QAAA,CAAA,qBAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAiCO,IAAM,aAAA,GAA8B;AAAA;AAAA,EAEzC,8BAAA,EAAgC,IAAA;AAAA,EAChC,qBAAA,EAAuB,IAAA;AAAA,EACvB,mBAAA,EAAqB,IAAA;AAAA;AAAA,EAGrB,wBAAA,EAA0B,IAAA;AAAA,EAC1B,iBAAA,EAAmB,IAAA;AAAA,EACnB,gBAAA,EAAkB,IAAA;AAAA;AAAA,EAGlB,0BAAA,EAA4B;AAC9B,CAAA;AAKO,IAAM,SAAA,GAA0B;AAAA,EACrC,8BAAA,EAAgC,IAAA;AAAA,EAChC,qBAAA,EAAuB,IAAA;AAAA,EACvB,mBAAA,EAAqB,IAAA;AAAA,EACrB,wBAAA,EAA0B,IAAA;AAAA,EAC1B,iBAAA,EAAmB,IAAA;AAAA,EACnB,gBAAA,EAAkB,IAAA;AAAA,EAClB,0BAAA,EAA4B;AAC9B,CAAA;AAKO,IAAM,qBAAN,MAAyB;AAAA,EACtB,KAAA;AAAA,EACA,YAAmC,EAAC;AAAA,EAE5C,WAAA,CAAY,cAA4C,YAAA,EAAc;AACpE,IAAA,IAAA,CAAK,KAAA,GAAQ,gBAAgB,aAAA,GAAgB,EAAE,GAAG,SAAA,EAAU,GAAI,EAAE,GAAG,aAAA,EAAc;AACnF,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AAEnC,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAClC,MAAA,MAAM,eAAsC,EAAC;AAG7C,MAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAAqC;AACzD,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,QAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,QAAA,OAAO,KAAA,CAAM,aAAY,KAAM,MAAA;AAAA,MACjC,CAAA;AAGA,MAAA,MAAM,qBAAA,GAAwB,aAAa,mCAAmC,CAAA;AAC9E,MAAA,IAAI,0BAA0B,MAAA,EAAW;AACvC,QAAA,YAAA,CAAa,8BAAA,GAAiC,qBAAA;AAAA,MAChD;AAEA,MAAA,MAAM,mBAAA,GAAsB,aAAa,kCAAkC,CAAA;AAC3E,MAAA,IAAI,wBAAwB,MAAA,EAAW;AACrC,QAAA,YAAA,CAAa,qBAAA,GAAwB,mBAAA;AAAA,MACvC;AAEA,MAAA,IAAA,CAAK,SAAA,GAAY,YAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAyB;AACvB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,GAAG,KAAK,SAAA,EAAU;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAA,EAAsC;AAC9C,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,OAAO,MAAM,OAAO,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,SAA6B,OAAA,EAAwB;AAC3D,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,GAAI,OAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAIE;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAE5B,IAAA,IAAI,CAAC,MAAM,8BAAA,EAAgC;AACzC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,qBAAA,EAAuB;AAC/B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,mBAAA;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAA,GAAqC;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,OAAO,KAAA,CAAM,kCACN,KAAA,CAAM,qBAAA;AAAA,EACf;AACF;AAGA,IAAI,kBAAA,GAAgD,IAAA;AAK7C,SAAS,gBAAgB,WAAA,EAAgE;AAC9F,EAAA,kBAAA,KAAuB,IAAI,mBAAmB,WAAW,CAAA;AACzD,EAAA,OAAO,kBAAA;AACT;AAKO,SAAS,iBAAiB,OAAA,EAAsC;AACrE,EAAA,OAAO,eAAA,EAAgB,CAAE,SAAA,CAAU,OAAO,CAAA;AAC5C;AAKO,SAAS,gBAAA,GAAmB;AACjC,EAAA,OAAO,eAAA,GAAkB,gBAAA,EAAiB;AAC5C;;;ACvMA,IAAA,yBAAA,GAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,uBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAuEO,IAAM,0BAAN,MAA8B;AAAA,EAC3B,OAAA;AAAA,EACA,eAAe,eAAA,EAAgB;AAAA,EAEvC,WAAA,CAAY,OAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,iBAAA,IAAqB,sBAAA,EAAuB;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAA,CACJ,MAAA,EACA,eAAA,EACwB;AAExB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,yBAAA,EAA0B,EAAG;AAClD,MAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,IACpD;AAGA,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAA,EAAQ,eAAe,CAAA;AAGxD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,eAAe,CAAA;AAEhE,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,SAAA,EAAW,eAAA;AAAA,MACX,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,SAAA,EACA,SAAA,EACiB;AAEjB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AACrD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,SAAA,CAAU,UAAA,EAAY,SAAS,CAAA;AAC5D,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,IAAA,EACA,eAAA,EACwB;AAGxB,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,MAAM,SAAA,GAAY,EAAA;AAElB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,SAAA,EAAW;AAC/C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AACzC,MAAA,MAAM,WAAA,GAAc,IAAI,UAAA,CAAW,EAAE,CAAA;AACrC,MAAA,WAAA,CAAY,CAAC,IAAI,KAAA,CAAM,MAAA;AACvB,MAAA,WAAA,CAAY,GAAA,CAAI,OAAO,CAAC,CAAA;AAGxB,MAAA,MAAM,KAAA,GAAQ,cAAc,WAAW,CAAA;AACvC,MAAA,MAAM,SAAA,GAAY,aAAA,CAAc,KAAA,EAAO,eAAe,CAAA;AACtD,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAM,eAAe,CAAA;AAElE,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,QAAA;AAAA,MACZ,SAAA,EAAW,eAAA;AAAA,MACX,UAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,WAAA,EACA,UAAA,EACA,eAAA,EAC0B;AAE1B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,IAAI,WAAA,EAAY,CAAE,OAAO,UAAU,CAAA;AAGrD,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,CAAY,WAAW,eAAe,CAAA;AAGnE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,UAAU,CAAA;AAEhE,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,SAAA,EAA4C;AAGjE,IAAA,OAAO,SAAA,CAAU,WAAW,MAAA,KAAW,EAAA,IAChC,UAAU,OAAA,KAAY,CAAA,IACtB,UAAU,SAAA,GAAY,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CACN,QACA,MAAA,EACY;AACZ,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,EAAE,CAAA;AAC9B,IAAA,IAAA,CAAK,GAAA,CAAI,aAAA,CAAc,MAAM,CAAA,EAAG,CAAC,CAAA;AACjC,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAC,CAAA;AAClB,IAAA,OAAO,OAAO,IAAI,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,CACN,MACA,MAAA,EACY;AACZ,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,IAAA,CAAK,SAAS,EAAE,CAAA;AAChD,IAAA,QAAA,CAAS,GAAA,CAAI,MAAM,CAAC,CAAA;AACpB,IAAA,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAChC,IAAA,OAAO,OAAO,QAAQ,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CACN,WACA,UAAA,EACY;AACZ,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,mBAAA,EAAqB,UAAA,CAAW,SAAA,CAAU,UAAU,CAAA;AAAA,MACpD,UAAA;AAAA,MACA,WAAW,SAAA,CAAU,SAAA;AAAA,MACrB,SAAS,SAAA,CAAU;AAAA,KACrB;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACtC,IAAA,OAAO,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,MAAA,EAAgD;AAGpE,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,OAAO,CAAC,CAAA;AAAA,EACjB;AACF;AASA,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,IAAA,GAAO,KAAK,CAAA;AAC9B,IAAA,IAAA,KAAS,OAAO,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,cAAc,KAAA,EAA2B;AAChD,EAAA,IAAI,MAAA,GAAS,OAAO,CAAC,CAAA;AACrB,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAA,GAAU,UAAU,MAAA,CAAO,CAAC,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,MAAA;AACT;AAUA,eAAsB,yBAAA,CACpB,WACA,SAAA,EAKC;AAED,EAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,GAAG,CAAA;AACpC,EAAA,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,UAAA,EAAY,CAAC,CAAA;AACrC,EAAA,SAAA,CAAU,GAAA,CAAI,OAAO,IAAI,WAAA,GAAc,MAAA,CAAO,SAAS,CAAC,CAAA,EAAG,EAAE,CAAA;AAC7D,EAAA,SAAA,CAAU,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA,EAAG,EAAE,CAAA;AAEjC,EAAA,MAAM,YAAA,GAAe,IAAI,UAAA,CAAW,EAAE,CAAA;AACtC,EAAA,YAAA,CAAa,GAAA,CAAI,SAAA,CAAU,UAAA,EAAY,CAAC,CAAA;AACxC,EAAA,YAAA,CAAa,GAAA,CAAI,SAAA,CAAU,SAAA,EAAW,EAAE,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAA;AAAA,IACP,YAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAKA,eAAsB,uBAAA,CACpB,KAAA,EACA,YAAA,EACA,SAAA,EACkB;AAElB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,GAAA,IAAO,YAAA,CAAa,WAAW,EAAA,EAAI;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACzC,EAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEhD,EAAA,OAAO,UAAA,CAAW,eAAe,CAAA,KAAM,UAAA,CAAW,SAAA,CAAU,UAAU,CAAA,IAC/D,UAAA,CAAW,eAAe,CAAA,KAAM,UAAA,CAAW,SAAA,CAAU,UAAU,CAAA;AACxE","file":"chunk-F3DZMBUA.js","sourcesContent":["/**\n * Discriminator Validation Utilities\n * \n * Handles discriminator validation and provides fallback mechanisms\n * for accounts with mismatched discriminators\n */\n\nimport type { Address } from '@solana/addresses'\nimport type { EncodedAccount, MaybeEncodedAccount } from '@solana/kit'\n\ninterface RpcResponse {\n value: {\n data: [string, string]\n executable: boolean\n lamports: number\n owner: string\n rentEpoch: number\n } | null\n}\n\ninterface RpcInterface {\n getAccountInfo: (address: Address, options: { encoding: string }) => {\n send: () => Promise<RpcResponse>\n }\n}\n\nexport interface DiscriminatorValidationResult {\n isValid: boolean\n expectedLength: number\n actualLength: number\n canDecode: boolean\n needsMigration: boolean\n errorMessage?: string\n}\n\nexport interface AccountInspectionResult {\n address: string\n dataLength: number\n discriminator: Uint8Array | null\n discriminatorLength: number\n isAgentAccount: boolean\n needsMigration: boolean\n rawData: Uint8Array\n}\n\n/**\n * Validates account discriminator before attempting to decode\n */\nexport function validateAccountDiscriminator(\n accountData: Uint8Array,\n expectedDiscriminator: Uint8Array\n): DiscriminatorValidationResult {\n // Check if we have enough data for a discriminator\n if (accountData.length < expectedDiscriminator.length) {\n return {\n isValid: false,\n expectedLength: expectedDiscriminator.length,\n actualLength: accountData.length,\n canDecode: false,\n needsMigration: true,\n errorMessage: `Account too small. Expected at least ${expectedDiscriminator.length} bytes, got ${accountData.length}`\n }\n }\n\n // Extract the discriminator from account data\n const actualDiscriminator = accountData.slice(0, expectedDiscriminator.length)\n\n // Check if discriminators match\n const isValid = actualDiscriminator.every((byte, index) => byte === expectedDiscriminator[index])\n\n if (isValid) {\n return {\n isValid: true,\n expectedLength: expectedDiscriminator.length,\n actualLength: actualDiscriminator.length,\n canDecode: true,\n needsMigration: false\n }\n }\n\n // Check for common legacy discriminator patterns\n if (actualDiscriminator.length >= 2) {\n const first2Bytes = actualDiscriminator.slice(0, 2)\n // If first 2 bytes are non-zero, might be legacy format\n if (first2Bytes[0] !== 0 || first2Bytes[1] !== 0) {\n return {\n isValid: false,\n expectedLength: expectedDiscriminator.length,\n actualLength: 2, // Legacy format\n canDecode: false,\n needsMigration: true,\n errorMessage: `Legacy discriminator format detected. Account needs migration.`\n }\n }\n }\n\n return {\n isValid: false,\n expectedLength: expectedDiscriminator.length,\n actualLength: actualDiscriminator.length,\n canDecode: false,\n needsMigration: true,\n errorMessage: `Discriminator mismatch. Expected [${Array.from(expectedDiscriminator).join(', ')}], got [${Array.from(actualDiscriminator).join(', ')}]`\n }\n}\n\n/**\n * Safe account decoding with discriminator validation\n */\nexport async function safeDecodeAccount<T>(\n rpc: unknown,\n address: Address,\n decoder: (data: Uint8Array) => T,\n expectedDiscriminator: Uint8Array,\n accountType = 'account'\n): Promise<{ account: T | null; validation: DiscriminatorValidationResult; needsAttention: boolean }> {\n try {\n // Fetch raw account data using compatible RPC interface\n const rpcClient = rpc as RpcInterface\n const response = await rpcClient.getAccountInfo(address, { encoding: 'base64' }).send()\n \n if (!response.value) {\n return {\n account: null,\n validation: {\n isValid: false,\n expectedLength: expectedDiscriminator.length,\n actualLength: 0,\n canDecode: false,\n needsMigration: false,\n errorMessage: `${accountType} account not found`\n },\n needsAttention: false\n }\n }\n\n // Decode base64 data\n const rawData = response.value.data[0]\n if (typeof rawData !== 'string') {\n throw new Error('Expected base64 string from RPC response')\n }\n const accountData = Buffer.from(rawData, 'base64')\n \n // Validate discriminator\n const validation = validateAccountDiscriminator(accountData, expectedDiscriminator)\n \n if (validation.canDecode) {\n // Try to decode the account\n try {\n const account = decoder(accountData)\n return { account, validation, needsAttention: false }\n } catch (decodeError) {\n return {\n account: null,\n validation: {\n ...validation,\n canDecode: false,\n errorMessage: `Decoding failed: ${decodeError instanceof Error ? decodeError.message : String(decodeError)}`\n },\n needsAttention: true\n }\n }\n }\n\n return {\n account: null,\n validation,\n needsAttention: validation.needsMigration\n }\n\n } catch (error) {\n return {\n account: null,\n validation: {\n isValid: false,\n expectedLength: expectedDiscriminator.length,\n actualLength: 0,\n canDecode: false,\n needsMigration: false,\n errorMessage: `Failed to fetch account: ${error instanceof Error ? error.message : String(error)}`\n },\n needsAttention: true\n }\n }\n}\n\n/**\n * Create user-friendly error message for discriminator issues\n */\nexport function createDiscriminatorErrorMessage(\n validation: DiscriminatorValidationResult,\n accountType: string,\n address: string\n): string {\n if (validation.needsMigration) {\n return [\n `⚠️ ${accountType} account needs attention: ${address}`,\n ` Issue: ${validation.errorMessage}`,\n ` Resolution: Account may need to be recreated with current program version`,\n ` Use 'ghost diagnose account ${address}' for detailed analysis`\n ].join('\\n')\n }\n\n if (!validation.canDecode) {\n return [\n `❌ Failed to decode ${accountType} account: ${address}`,\n ` Issue: ${validation.errorMessage}`,\n ` This may indicate a corrupt or incompatible account`\n ].join('\\n')\n }\n\n return `✅ ${accountType} account is valid: ${address}`\n}\n\n/**\n * Safe Agent account decoding with discriminator validation\n * Returns a compatibility result with exists property\n */\nexport async function safeDecodeAgent(\n encodedAccount: { address: Address; data: Uint8Array }\n): Promise<{ exists: boolean; data?: unknown } | null> {\n try {\n // Import Agent discriminator and decoder\n const { AGENT_DISCRIMINATOR, getAgentDecoder } = await import('../generated/accounts/agent.js')\n \n // Validate discriminator\n const validation = validateAccountDiscriminator(encodedAccount.data, AGENT_DISCRIMINATOR)\n \n if (validation.canDecode) {\n try {\n const decoder = getAgentDecoder()\n const data = decoder.decode(encodedAccount.data)\n return { exists: true, data }\n } catch (decodeError) {\n console.warn(`Failed to decode Agent account ${encodedAccount.address}:`, decodeError)\n return { exists: false }\n }\n }\n \n // Account exists but can't be decoded due to discriminator issues\n return { exists: false }\n } catch (error) {\n console.warn(`Safe decode failed for ${encodedAccount.address}:`, error)\n return null\n }\n}\n\n/**\n * Inspects account data and extracts useful information about discriminator\n */\nexport function inspectAccountData(\n encodedAccount: EncodedAccount | MaybeEncodedAccount,\n address: string\n): AccountInspectionResult {\n if (!('exists' in encodedAccount) || !encodedAccount.exists) {\n return {\n address,\n dataLength: 0,\n discriminator: null,\n discriminatorLength: 0,\n isAgentAccount: false,\n needsMigration: false,\n rawData: new Uint8Array(0)\n }\n }\n\n const data = 'data' in encodedAccount ? encodedAccount.data : new Uint8Array(0)\n \n // Extract discriminator (first 8 bytes if available)\n const discriminatorLength = Math.min(data.length, 8)\n const discriminator = discriminatorLength > 0 ? data.slice(0, discriminatorLength) : null\n\n return {\n address,\n dataLength: data.length,\n discriminator,\n discriminatorLength,\n isAgentAccount: false, // Would need more logic to determine this\n needsMigration: discriminatorLength > 0 && discriminatorLength < 8,\n rawData: data\n }\n}","/**\n * Account Migration Utility\n * \n * Handles migration of old Agent accounts that were created with\n * different discriminator formats to the current format.\n */\n\nimport type { EncodedAccount, MaybeEncodedAccount } from '@solana/kit';\nimport { \n validateAccountDiscriminator, \n inspectAccountData \n} from './discriminator-validator.js';\n\nexport interface MigrationPlan {\n address: string;\n currentState: 'valid' | 'needs_migration' | 'invalid' | 'not_exists';\n migrationType: 'none' | 'recreate' | 'data_conversion' | 'unsupported';\n issues: string[];\n recommendations: string[];\n canAutoMigrate: boolean;\n}\n\nexport interface MigrationResult {\n success: boolean;\n address: string;\n action: 'skipped' | 'migrated' | 'failed';\n error?: string;\n newAccountData?: Uint8Array;\n}\n\nexport interface LegacyAgentData {\n // Define potential old Agent format fields here\n // This would need to be updated based on actual legacy formats\n discriminator: Uint8Array;\n owner?: string;\n name?: string;\n // ... other legacy fields\n}\n\n/**\n * Analyzes an account and creates a migration plan\n */\nexport async function createMigrationPlan(\n encodedAccount: EncodedAccount | MaybeEncodedAccount,\n address: string\n): Promise<MigrationPlan> {\n const plan: MigrationPlan = {\n address,\n currentState: 'not_exists',\n migrationType: 'none',\n issues: [],\n recommendations: [],\n canAutoMigrate: false\n };\n\n if (!('exists' in encodedAccount) || !encodedAccount.exists) {\n plan.recommendations.push('Account does not exist - no migration needed');\n return plan;\n }\n\n // Import the discriminator\n const { AGENT_DISCRIMINATOR } = await import('../generated/accounts/agent.js');\n const validation = validateAccountDiscriminator(encodedAccount.data, AGENT_DISCRIMINATOR);\n const inspection = inspectAccountData(encodedAccount, address);\n\n // Determine current state\n if (validation.isValid) {\n plan.currentState = 'valid';\n plan.recommendations.push('Account is already in the correct format');\n return plan;\n }\n\n if (validation.needsMigration) {\n plan.currentState = 'needs_migration';\n plan.issues.push(`Discriminator length mismatch: expected 8 bytes, got ${validation.actualLength} bytes`);\n } else {\n plan.currentState = 'invalid';\n plan.issues.push('Account has invalid or corrupted discriminator');\n }\n\n // Determine migration type based on data analysis\n if (inspection.discriminatorLength === 2) {\n // This is likely an old format with 2-byte discriminator\n plan.migrationType = 'recreate';\n plan.issues.push('Account uses legacy 2-byte discriminator format');\n plan.recommendations.push('Recreate account using current register_agent instruction');\n plan.recommendations.push('Export existing data first if valuable');\n } else if (inspection.discriminatorLength === 0) {\n // Account has no discriminator\n plan.migrationType = 'unsupported';\n plan.issues.push('Account has no discriminator - may not be an Agent account');\n plan.recommendations.push('Verify this is actually an Agent account');\n } else if (inspection.discriminatorLength < 8) {\n // Partial discriminator\n plan.migrationType = 'unsupported';\n plan.issues.push(`Partial discriminator detected (${inspection.discriminatorLength} bytes)`);\n plan.recommendations.push('Account data may be corrupted - consider recreation');\n } else {\n // Full 8-byte discriminator but wrong values\n plan.migrationType = 'data_conversion';\n plan.issues.push('Discriminator has correct length but wrong values');\n plan.recommendations.push('May be from a different program version');\n plan.recommendations.push('Check if this account belongs to the correct program');\n }\n\n // Determine if auto-migration is possible\n plan.canAutoMigrate = plan.migrationType === 'recreate' && inspection.dataLength > 8;\n\n return plan;\n}\n\n/**\n * Attempts to extract meaningful data from a legacy account\n */\nexport function extractLegacyData(\n encodedAccount: EncodedAccount | MaybeEncodedAccount\n): LegacyAgentData | null {\n if (!('exists' in encodedAccount) || !encodedAccount.exists || !('data' in encodedAccount) || encodedAccount.data.length < 2) {\n return null;\n }\n\n const data = ('data' in encodedAccount) ? encodedAccount.data : new Uint8Array(0);\n \n try {\n // For accounts with 2-byte discriminator, try to extract what we can\n if (data.length >= 2) {\n return {\n discriminator: data.slice(0, 2),\n // Add more extraction logic here based on known legacy formats\n // This would need to be customized based on actual legacy account structures\n };\n }\n } catch (error) {\n console.warn('Failed to extract legacy data:', error);\n }\n\n return null;\n}\n\n/**\n * Creates a detailed migration report for multiple accounts\n */\nexport async function createMigrationReport(\n accounts: { address: string; encodedAccount: EncodedAccount | MaybeEncodedAccount }[]\n): Promise<{\n summary: {\n total: number;\n valid: number;\n needsMigration: number;\n invalid: number;\n canAutoMigrate: number;\n };\n plans: MigrationPlan[];\n recommendations: string[];\n}> {\n const plans = await Promise.all(accounts.map(({ address, encodedAccount }) => \n createMigrationPlan(encodedAccount, address)\n ));\n\n const summary = {\n total: plans.length,\n valid: plans.filter(p => p.currentState === 'valid').length,\n needsMigration: plans.filter(p => p.currentState === 'needs_migration').length,\n invalid: plans.filter(p => p.currentState === 'invalid').length,\n canAutoMigrate: plans.filter(p => p.canAutoMigrate).length\n };\n\n const recommendations: string[] = [];\n\n if (summary.needsMigration > 0) {\n recommendations.push(`${summary.needsMigration} accounts need migration`);\n }\n\n if (summary.canAutoMigrate > 0) {\n recommendations.push(`${summary.canAutoMigrate} accounts can be auto-migrated`);\n }\n\n if (summary.invalid > 0) {\n recommendations.push(`${summary.invalid} accounts have invalid data and should be investigated`);\n }\n\n if (summary.needsMigration === 0 && summary.invalid === 0) {\n recommendations.push('All accounts are in the correct format');\n } else {\n recommendations.push('Consider running migration utilities to fix account format issues');\n recommendations.push('Backup important account data before migration');\n }\n\n return {\n summary,\n plans,\n recommendations\n };\n}\n\n/**\n * Simulates migration without actually performing it\n */\nexport async function simulateMigration(\n encodedAccount: EncodedAccount | MaybeEncodedAccount,\n address: string\n): Promise<{\n plan: MigrationPlan;\n simulation: {\n wouldSucceed: boolean;\n estimatedSteps: string[];\n warnings: string[];\n requiredActions: string[];\n };\n}> {\n const plan = await createMigrationPlan(encodedAccount, address);\n \n const simulation = {\n wouldSucceed: false,\n estimatedSteps: [] as string[],\n warnings: [] as string[],\n requiredActions: [] as string[]\n };\n\n if (plan.currentState === 'valid') {\n simulation.wouldSucceed = true;\n simulation.estimatedSteps.push('No migration needed - account is already valid');\n return { plan, simulation };\n }\n\n switch (plan.migrationType) {\n case 'recreate':\n simulation.estimatedSteps.push('1. Extract existing account data');\n simulation.estimatedSteps.push('2. Create new account with correct format');\n simulation.estimatedSteps.push('3. Transfer any salvageable data');\n simulation.estimatedSteps.push('4. Close old account');\n simulation.requiredActions.push('User must re-register the agent');\n simulation.warnings.push('Some data may be lost during recreation');\n simulation.wouldSucceed = plan.canAutoMigrate;\n break;\n\n case 'data_conversion':\n simulation.estimatedSteps.push('1. Analyze existing data format');\n simulation.estimatedSteps.push('2. Convert to new format');\n simulation.estimatedSteps.push('3. Update discriminator');\n simulation.warnings.push('Data conversion is experimental');\n simulation.requiredActions.push('Manual verification required');\n simulation.wouldSucceed = false;\n break;\n\n case 'unsupported':\n simulation.estimatedSteps.push('1. Manual investigation required');\n simulation.estimatedSteps.push('2. Determine if account is recoverable');\n simulation.warnings.push('Account may not be recoverable');\n simulation.requiredActions.push('Manual inspection and possible recreation');\n simulation.wouldSucceed = false;\n break;\n\n default:\n simulation.estimatedSteps.push('No migration strategy available');\n simulation.wouldSucceed = false;\n }\n\n return { plan, simulation };\n}\n\n/**\n * Provides user-friendly migration instructions\n */\nexport function getMigrationInstructions(plan: MigrationPlan): string[] {\n const instructions: string[] = [];\n\n switch (plan.migrationType) {\n case 'none':\n instructions.push('✅ No migration needed - your account is up to date');\n break;\n\n case 'recreate':\n instructions.push('🔄 Account Recreation Required:');\n instructions.push('1. Use the CLI command: `ghost agent register` to create a new account');\n instructions.push('2. Configure your agent with the same settings as before');\n instructions.push('3. The old account will be automatically replaced');\n instructions.push('⚠️ Note: You may need to re-verify your agent after recreation');\n break;\n\n case 'data_conversion':\n instructions.push('🔧 Data Conversion Required:');\n instructions.push('1. Contact support for assistance with account conversion');\n instructions.push('2. Manual intervention may be required');\n instructions.push('3. Backup your account data before proceeding');\n break;\n\n case 'unsupported':\n instructions.push('❌ Migration Not Supported:');\n instructions.push('1. This account cannot be automatically migrated');\n instructions.push('2. Consider creating a new account');\n instructions.push('3. Contact support if this account contains important data');\n break;\n }\n\n return instructions;\n}","/**\n * Account Diagnostics Utility\n * \n * Comprehensive diagnostic tools for inspecting and debugging\n * account discriminator issues and data format problems.\n */\n\nimport type { \n Address, \n EncodedAccount, \n MaybeEncodedAccount\n} from '@solana/kit';\n\nimport { \n fetchEncodedAccount\n} from '@solana/kit';\nimport { \n validateAccountDiscriminator, \n inspectAccountData, \n type AccountInspectionResult \n} from './discriminator-validator.js';\nimport { \n createMigrationPlan, \n simulateMigration,\n getMigrationInstructions \n} from './account-migration.js';\nimport { AGENT_DISCRIMINATOR } from '../generated/accounts/agent.js';\n\nexport interface DiagnosticReport {\n address: string;\n timestamp: string;\n accountExists: boolean;\n discriminatorValidation: ReturnType<typeof validateAccountDiscriminator>;\n inspection: AccountInspectionResult;\n migrationPlan: Awaited<ReturnType<typeof createMigrationPlan>>;\n migrationSimulation: Awaited<ReturnType<typeof simulateMigration>>;\n recommendations: string[];\n debugInfo: {\n expectedDiscriminator: number[];\n actualDiscriminator: number[] | null;\n dataPreview: number[];\n programId?: string;\n };\n}\n\nexport interface BatchDiagnosticReport {\n summary: {\n total: number;\n valid: number;\n invalid: number;\n needsMigration: number;\n notExists: number;\n };\n reports: DiagnosticReport[];\n globalRecommendations: string[];\n timestamp: string;\n}\n\n/**\n * Runs comprehensive diagnostics on a single account\n */\nexport async function runAccountDiagnostics(\n encodedAccount: EncodedAccount | MaybeEncodedAccount,\n address: string\n): Promise<DiagnosticReport> {\n const timestamp = new Date().toISOString();\n const accountExists = ('exists' in encodedAccount) && encodedAccount.exists;\n \n let discriminatorValidation, inspection, migrationPlan, migrationSimulation;\n \n if (accountExists) {\n // Import the discriminator\n const { AGENT_DISCRIMINATOR } = await import('../generated/accounts/agent.js');\n discriminatorValidation = validateAccountDiscriminator(encodedAccount.data, AGENT_DISCRIMINATOR);\n inspection = inspectAccountData(encodedAccount, address);\n migrationPlan = await createMigrationPlan(encodedAccount, address);\n migrationSimulation = await simulateMigration(encodedAccount, address);\n } else {\n // Default values for non-existent accounts\n discriminatorValidation = {\n isValid: false,\n actualLength: 0,\n expectedLength: 8,\n canDecode: false,\n needsMigration: false,\n errorMessage: 'Account does not exist'\n };\n inspection = {\n address,\n dataLength: 0,\n discriminator: null,\n discriminatorLength: 0,\n isAgentAccount: false,\n needsMigration: false,\n rawData: new Uint8Array(0)\n };\n migrationPlan = {\n address,\n currentState: 'not_exists' as const,\n migrationType: 'none' as const,\n issues: ['Account does not exist'],\n recommendations: ['Create account using register_agent instruction'],\n canAutoMigrate: false\n };\n migrationSimulation = {\n plan: migrationPlan,\n simulation: {\n wouldSucceed: false,\n estimatedSteps: ['Account must be created first'],\n warnings: [],\n requiredActions: ['Use register_agent instruction']\n }\n };\n }\n\n // Generate recommendations\n const recommendations: string[] = [];\n \n if (!accountExists) {\n recommendations.push('Account does not exist - create using register_agent');\n } else if (discriminatorValidation.isValid) {\n recommendations.push('Account is valid - no action needed');\n } else {\n recommendations.push(...getMigrationInstructions(migrationPlan));\n }\n\n // Create debug info\n const debugInfo = {\n expectedDiscriminator: Array.from(AGENT_DISCRIMINATOR),\n actualDiscriminator: inspection.discriminator ? Array.from(inspection.discriminator) : null,\n dataPreview: Array.from(inspection.rawData.slice(0, 32)),\n programId: (accountExists && ('owner' in encodedAccount) ? encodedAccount.owner : undefined) as string | undefined\n };\n\n return {\n address,\n timestamp,\n accountExists,\n discriminatorValidation,\n inspection,\n migrationPlan,\n migrationSimulation,\n recommendations,\n debugInfo\n };\n}\n\n/**\n * Runs diagnostics on multiple accounts\n */\nexport async function runBatchDiagnostics(\n accounts: { address: string; encodedAccount: EncodedAccount | MaybeEncodedAccount }[]\n): Promise<BatchDiagnosticReport> {\n const timestamp = new Date().toISOString();\n const reports = await Promise.all(accounts.map(({ address, encodedAccount }) => \n runAccountDiagnostics(encodedAccount, address)\n ));\n\n const summary = {\n total: reports.length,\n valid: reports.filter(r => r.accountExists && r.discriminatorValidation.isValid).length,\n invalid: reports.filter(r => r.accountExists && !r.discriminatorValidation.isValid).length,\n needsMigration: reports.filter(r => r.migrationPlan.currentState === 'needs_migration').length,\n notExists: reports.filter(r => !r.accountExists).length\n };\n\n const globalRecommendations: string[] = [];\n \n if (summary.notExists > 0) {\n globalRecommendations.push(`${summary.notExists} accounts need to be created`);\n }\n if (summary.needsMigration > 0) {\n globalRecommendations.push(`${summary.needsMigration} accounts need migration`);\n }\n if (summary.invalid > 0) {\n globalRecommendations.push(`${summary.invalid} accounts have data issues`);\n }\n if (summary.valid === summary.total) {\n globalRecommendations.push('All accounts are healthy');\n }\n\n return {\n summary,\n reports,\n globalRecommendations,\n timestamp\n };\n}\n\n/**\n * Fetches and diagnoses an account directly from the blockchain\n */\nexport async function diagnoseAccountFromChain(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n address: Address,\n options?: { logToConsole?: boolean }\n): Promise<DiagnosticReport> {\n try {\n const encodedAccount = await fetchEncodedAccount(rpc, address);\n const report = await runAccountDiagnostics(encodedAccount, address);\n \n if (options?.logToConsole) {\n console.group(`🔍 Account Diagnostics: ${address}`);\n console.log('Exists:', report.accountExists);\n console.log('Valid:', report.discriminatorValidation.isValid);\n console.log('Needs Migration:', report.migrationPlan.currentState === 'needs_migration');\n console.log('Recommendations:');\n report.recommendations.forEach(rec => console.log(` - ${rec}`));\n \n if (!report.discriminatorValidation.isValid) {\n console.log('Issues:');\n if (Array.isArray(report.migrationPlan.issues)) {\n report.migrationPlan.issues.forEach((issue: string) => console.log(` - ${issue}`));\n }\n }\n \n console.groupEnd();\n }\n \n return report;\n } catch (err) {\n console.error(`Failed to diagnose account ${address}:`, err);\n \n // Return a diagnostic report for the error case\n return {\n address,\n timestamp: new Date().toISOString(),\n accountExists: false,\n discriminatorValidation: {\n isValid: false,\n actualLength: 0,\n expectedLength: 8,\n canDecode: false,\n needsMigration: false,\n errorMessage: `Failed to fetch account: ${err instanceof Error ? err.message : String(err)}`\n },\n inspection: {\n address,\n dataLength: 0,\n discriminator: null,\n discriminatorLength: 0,\n isAgentAccount: false,\n needsMigration: false,\n rawData: new Uint8Array(0)\n },\n migrationPlan: {\n address,\n currentState: 'invalid',\n migrationType: 'unsupported',\n issues: [`Failed to fetch account: ${err instanceof Error ? err.message : String(err)}`],\n recommendations: ['Check network connection and account address'],\n canAutoMigrate: false\n },\n migrationSimulation: {\n plan: {\n address,\n currentState: 'invalid',\n migrationType: 'unsupported',\n issues: [`Failed to fetch account: ${err instanceof Error ? err.message : String(err)}`],\n recommendations: ['Check network connection and account address'],\n canAutoMigrate: false\n },\n simulation: {\n wouldSucceed: false,\n estimatedSteps: ['Fix network connectivity issues'],\n warnings: ['Account could not be fetched'],\n requiredActions: ['Verify account address and network connection']\n }\n },\n recommendations: ['Check network connection and account address'],\n debugInfo: {\n expectedDiscriminator: Array.from(AGENT_DISCRIMINATOR),\n actualDiscriminator: null,\n dataPreview: [],\n programId: undefined\n }\n };\n }\n}\n\n/**\n * Fetches and diagnoses multiple accounts from the blockchain\n */\nexport async function diagnoseBatchFromChain(\n rpc: Parameters<typeof fetchEncodedAccount>[0],\n addresses: Address[],\n options?: { \n logToConsole?: boolean;\n maxConcurrent?: number;\n }\n): Promise<BatchDiagnosticReport> {\n const maxConcurrent = options?.maxConcurrent ?? 10;\n const reports: DiagnosticReport[] = [];\n \n // Process accounts in batches to avoid overwhelming the RPC\n for (let i = 0; i < addresses.length; i += maxConcurrent) {\n const batch = addresses.slice(i, i + maxConcurrent);\n const batchPromises = batch.map(address => \n diagnoseAccountFromChain(rpc, address, { logToConsole: false })\n );\n \n const batchReports = await Promise.allSettled(batchPromises);\n \n for (const result of batchReports) {\n if (result.status === 'fulfilled') {\n reports.push(result.value);\n } else {\n console.error('Failed to diagnose account:', result.reason);\n // Add a fallback report for failed fetches\n reports.push({\n address: 'unknown',\n timestamp: new Date().toISOString(),\n accountExists: false,\n discriminatorValidation: {\n isValid: false,\n actualLength: 0,\n expectedLength: 8,\n canDecode: false,\n needsMigration: false,\n errorMessage: 'Failed to fetch account'\n },\n inspection: {\n address: 'unknown',\n dataLength: 0,\n discriminator: null,\n discriminatorLength: 0,\n isAgentAccount: false,\n needsMigration: false,\n rawData: new Uint8Array(0)\n },\n migrationPlan: {\n address: 'unknown',\n currentState: 'invalid',\n migrationType: 'unsupported',\n issues: ['Failed to fetch account'],\n recommendations: ['Check network connection'],\n canAutoMigrate: false\n },\n migrationSimulation: {\n plan: {\n address: 'unknown',\n currentState: 'invalid' as const,\n migrationType: 'unsupported' as const,\n issues: ['Failed to fetch account'],\n recommendations: ['Check network connection'],\n canAutoMigrate: false\n },\n simulation: {\n wouldSucceed: false,\n estimatedSteps: ['Fix fetch issues'],\n warnings: ['Account could not be fetched'],\n requiredActions: ['Check network']\n }\n },\n recommendations: ['Check network connection'],\n debugInfo: {\n expectedDiscriminator: Array.from(AGENT_DISCRIMINATOR),\n actualDiscriminator: null,\n dataPreview: [],\n programId: undefined\n }\n });\n }\n }\n }\n\n const batchReport = await runBatchDiagnostics(\n reports.map(report => ({\n address: report.address,\n encodedAccount: {\n exists: report.accountExists,\n data: report.inspection.rawData,\n address: report.address,\n owner: report.debugInfo.programId ?? '',\n executable: false,\n lamports: 0n,\n programAddress: report.debugInfo.programId ?? '',\n space: report.inspection.rawData.length\n } as unknown as EncodedAccount\n }))\n );\n\n if (options?.logToConsole) {\n console.group('🔍 Batch Diagnostics Summary');\n console.log('Total accounts:', batchReport.summary.total);\n console.log('Valid accounts:', batchReport.summary.valid);\n console.log('Invalid accounts:', batchReport.summary.invalid);\n console.log('Need migration:', batchReport.summary.needsMigration);\n console.log('Do not exist:', batchReport.summary.notExists);\n console.log('Global recommendations:');\n batchReport.globalRecommendations.forEach(rec => console.log(` - ${rec}`));\n console.groupEnd();\n }\n\n return batchReport;\n}\n\n/**\n * Exports a diagnostic report as JSON\n */\nexport function exportDiagnosticReport(\n report: DiagnosticReport | BatchDiagnosticReport,\n filename?: string\n): string {\n const json = JSON.stringify(report, null, 2);\n \n if (filename) {\n // In a browser environment, you might want to trigger a download\n // In Node.js, you might want to write to file\n console.log(`Diagnostic report would be saved as: ${filename}`);\n console.log('Report data:', json);\n }\n \n return json;\n}","/**\n * Token Utilities for SPL Token and Token 2022 (Token Extensions)\n * \n * Provides comprehensive token handling utilities including:\n * - Associated Token Account (ATA) derivation for both SPL Token and Token 2022\n * - Token 2022 specific features (transfer fees, confidential transfers, etc.)\n * - Token program detection and validation\n * - Account creation and management utilities\n * \n * Based on the latest SPL Token 2022 specification and @solana/kit v2.3.0\n */\n\nimport type { Address } from '@solana/addresses'\nimport { \n getProgramDerivedAddress,\n getAddressEncoder\n} from '@solana/kit'\nimport { \n TOKEN_PROGRAM_ADDRESS,\n TOKEN_2022_PROGRAM_ADDRESS,\n ASSOCIATED_TOKEN_PROGRAM_ADDRESS \n} from '../constants/system-addresses.js'\n\n// =====================================================\n// TYPES AND INTERFACES\n// =====================================================\n\n/**\n * Token program variants supported by GhostSpeak\n */\nexport enum TokenProgram {\n /** Original SPL Token Program */\n SPL_TOKEN = 'spl-token',\n /** SPL Token 2022 (Token Extensions) Program */\n TOKEN_2022 = 'token-2022'\n}\n\n/**\n * Associated Token Account information\n */\nexport interface AssociatedTokenAccount {\n /** The derived ATA address */\n address: Address\n /** The wallet/owner address */\n owner: Address\n /** The token mint address */\n mint: Address\n /** The token program used (SPL Token or Token 2022) */\n tokenProgram: Address\n /** Whether this is a Token 2022 ATA */\n isToken2022: boolean\n}\n\n/**\n * Token 2022 Extension Types\n * Based on the latest Token Extensions specification\n */\nexport enum TokenExtension {\n /** Uninitialized account */\n UNINITIALIZED = 0,\n /** Transfer fee extension */\n TRANSFER_FEE_CONFIG = 1,\n /** Transfer fee amount */\n TRANSFER_FEE_AMOUNT = 2,\n /** Mint close authority */\n MINT_CLOSE_AUTHORITY = 3,\n /** Confidential transfer mint */\n CONFIDENTIAL_TRANSFER_MINT = 4,\n /** Confidential transfer account */\n CONFIDENTIAL_TRANSFER_ACCOUNT = 5,\n /** Default account state */\n DEFAULT_ACCOUNT_STATE = 6,\n /** Immutable owner */\n IMMUTABLE_OWNER = 7,\n /** Memo transfer */\n MEMO_TRANSFER = 8,\n /** Non-transferable */\n NON_TRANSFERABLE = 9,\n /** Interest bearing mint */\n INTEREST_BEARING_MINT = 10,\n /** CPI guard */\n CPI_GUARD = 11,\n /** Permanent delegate */\n PERMANENT_DELEGATE = 12,\n /** Non-transferable account */\n NON_TRANSFERABLE_ACCOUNT = 13,\n /** Transfer hook */\n TRANSFER_HOOK = 14,\n /** Transfer hook account */\n TRANSFER_HOOK_ACCOUNT = 15,\n /** Metadata pointer */\n METADATA_POINTER = 16,\n /** Token metadata */\n TOKEN_METADATA = 17,\n /** Group pointer */\n GROUP_POINTER = 18,\n /** Token group */\n TOKEN_GROUP = 19,\n /** Group member pointer */\n GROUP_MEMBER_POINTER = 20,\n /** Token group member */\n TOKEN_GROUP_MEMBER = 21\n}\n\n/**\n * Transfer fee configuration for Token 2022\n */\nexport interface TransferFeeConfig {\n /** Transfer fee basis points (0-10000, where 10000 = 100%) */\n transferFeeBasisPoints: number\n /** Maximum transfer fee in token base units */\n maximumFee: bigint\n /** Authority that can modify transfer fee config */\n transferFeeConfigAuthority: Address | null\n /** Authority that can withdraw collected fees */\n withdrawWithheldAuthority: Address | null\n /** Amount of fees currently withheld */\n withheldAmount: bigint\n /** Older transfer fee configuration */\n olderTransferFee: {\n epoch: bigint\n transferFeeBasisPoints: number\n maximumFee: bigint\n }\n /** Newer transfer fee configuration */\n newerTransferFee: {\n epoch: bigint\n transferFeeBasisPoints: number\n maximumFee: bigint\n }\n}\n\n/**\n * Confidential transfer configuration for Token 2022\n */\nexport interface ConfidentialTransferConfig {\n /** Authority that can configure confidential transfers */\n authority: Address | null\n /** Automatically approve new accounts for confidential transfers */\n autoApproveNewAccounts: boolean\n /** Public key for auditing confidential transfers */\n auditorElgamalPubkey: Uint8Array | null\n}\n\n/**\n * Interest-bearing token configuration for Token 2022\n */\nexport interface InterestBearingConfig {\n /** Authority that can update the interest rate */\n rateAuthority: Address | null\n /** Current interest rate (basis points per year) */\n currentRate: number\n /** Timestamp when interest bearing was initialized */\n initializationTimestamp: bigint\n /** Timestamp of last rate update */\n lastUpdateTimestamp: bigint\n /** Pre-computed interest rate */\n preUpdateAverageRate: number\n}\n\n// =====================================================\n// CORE ATA DERIVATION FUNCTIONS\n// =====================================================\n\n/**\n * Derive Associated Token Account address for any token program\n * \n * This is the core ATA derivation function that works with both\n * SPL Token and Token 2022 programs. The derivation follows the\n * standard pattern: ['owner', 'token_program', 'mint']\n * \n * @param owner - The wallet/owner address\n * @param mint - The token mint address\n * @param tokenProgram - The token program address (SPL Token or Token 2022)\n * @returns Promise<Address> - The derived ATA address\n */\nexport async function deriveAssociatedTokenAddress(\n owner: Address,\n mint: Address,\n tokenProgram: Address = TOKEN_PROGRAM_ADDRESS\n): Promise<Address> {\n const [address] = await getProgramDerivedAddress({\n programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,\n seeds: [\n getAddressEncoder().encode(owner),\n getAddressEncoder().encode(tokenProgram),\n getAddressEncoder().encode(mint)\n ]\n })\n return address\n}\n\n/**\n * Derive Associated Token Account for SPL Token (legacy)\n * \n * @param owner - The wallet/owner address\n * @param mint - The token mint address\n * @returns Promise<Address> - The derived ATA address\n */\nexport async function deriveSplTokenAssociatedTokenAddress(\n owner: Address,\n mint: Address\n): Promise<Address> {\n return deriveAssociatedTokenAddress(owner, mint, TOKEN_PROGRAM_ADDRESS)\n}\n\n/**\n * Derive Associated Token Account for Token 2022\n * \n * @param owner - The wallet/owner address\n * @param mint - The token mint address\n * @returns Promise<Address> - The derived ATA address\n */\nexport async function deriveToken2022AssociatedTokenAddress(\n owner: Address,\n mint: Address\n): Promise<Address> {\n return deriveAssociatedTokenAddress(owner, mint, TOKEN_2022_PROGRAM_ADDRESS)\n}\n\n/**\n * Get complete ATA information including program detection\n * \n * @param owner - The wallet/owner address\n * @param mint - The token mint address\n * @param tokenProgram - Optional: specify token program, auto-detect if not provided\n * @returns Promise<AssociatedTokenAccount> - Complete ATA information\n */\nexport async function getAssociatedTokenAccount(\n owner: Address,\n mint: Address,\n tokenProgram?: Address\n): Promise<AssociatedTokenAccount> {\n // If token program not specified, default to SPL Token\n // In practice, you might want to detect this from the mint account\n const program = tokenProgram ?? TOKEN_PROGRAM_ADDRESS\n const isToken2022 = program === TOKEN_2022_PROGRAM_ADDRESS\n \n const address = await deriveAssociatedTokenAddress(owner, mint, program)\n \n return {\n address,\n owner,\n mint,\n tokenProgram: program,\n isToken2022\n }\n}\n\n// =====================================================\n// TOKEN PROGRAM DETECTION\n// =====================================================\n\n/**\n * Detect which token program owns a given mint\n * Note: This requires RPC calls to fetch mint account data\n * \n * @param mint - The token mint address\n * @returns Promise<Address> - The token program address\n */\nexport async function detectTokenProgram(\n mint: Address, \n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<Address> {\n try {\n // Import RPC utilities for account fetching\n const { createSolanaRpc } = await import('@solana/kit')\n const rpc = createSolanaRpc(rpcEndpoint)\n \n // Fetch mint account info with safe base64 encoding\n const accountInfo = await rpc.getAccountInfo(mint, {\n encoding: 'base64',\n commitment: 'confirmed'\n }).send()\n \n if (!accountInfo.value) {\n throw new Error(`Mint account ${mint} not found`)\n }\n \n // Check the owner program - this determines which token program owns the mint\n const ownerProgram = accountInfo.value.owner\n \n // Compare against known token program addresses\n if (ownerProgram === TOKEN_PROGRAM_ADDRESS) {\n return TOKEN_PROGRAM_ADDRESS\n } else if (ownerProgram === TOKEN_2022_PROGRAM_ADDRESS) {\n return TOKEN_2022_PROGRAM_ADDRESS \n } else {\n // Unknown program - default to SPL Token for safety\n console.warn(`Unknown token program owner: ${ownerProgram}, defaulting to SPL Token`)\n return TOKEN_PROGRAM_ADDRESS\n }\n } catch (error) {\n console.error(`Failed to detect token program for mint ${mint}:`, error)\n // Default to SPL Token on error\n return TOKEN_PROGRAM_ADDRESS\n }\n}\n\n/**\n * Check if a mint is a Token 2022 mint\n * \n * @param mint - The token mint address\n * @returns Promise<boolean> - True if Token 2022, false if SPL Token\n */\nexport async function isToken2022Mint(mint: Address): Promise<boolean> {\n const program = await detectTokenProgram(mint)\n return program === TOKEN_2022_PROGRAM_ADDRESS\n}\n\n/**\n * Get the appropriate token program for a given mint\n * \n * @param mint - The token mint address\n * @returns Promise<TokenProgram> - The token program enum\n */\nexport async function getTokenProgramType(mint: Address): Promise<TokenProgram> {\n const isToken2022 = await isToken2022Mint(mint)\n return isToken2022 ? TokenProgram.TOKEN_2022 : TokenProgram.SPL_TOKEN\n}\n\n// =====================================================\n// TOKEN 2022 EXTENSION UTILITIES\n// =====================================================\n\n\n/**\n * Check if a mint has specific Token 2022 extensions\n * Note: This requires RPC calls to fetch and parse mint account data\n * \n * @param mint - The token mint address\n * @param extensions - Array of extensions to check for\n * @returns Promise<Record<TokenExtension, boolean>> - Extension presence map\n */\nexport async function checkToken2022Extensions(\n mint: Address,\n extensions: TokenExtension[],\n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<Record<TokenExtension, boolean>> {\n try {\n // Import the Token-2022 RPC functions\n const { getMintWithExtensions } = await import('./token-2022-rpc.js')\n const { createSolanaRpc } = await import('@solana/kit')\n \n const rpc = createSolanaRpc(rpcEndpoint)\n \n // Get mint data with extensions\n const mintData = await getMintWithExtensions(rpc, mint, 'confirmed')\n \n if (!mintData) {\n // Mint not found, return all false\n const result = {} as Record<TokenExtension, boolean>\n for (const extension of extensions) {\n result[extension] = false\n }\n return result\n }\n \n // Check each requested extension based on TokenExtension enum values\n const result = {} as Record<TokenExtension, boolean>\n for (const extension of extensions) {\n // Check if the extension exists in the mint data based on enum value\n switch (extension) {\n case TokenExtension.TRANSFER_FEE_CONFIG:\n result[extension] = Boolean(mintData.extensions.transferFeeConfig)\n break\n case TokenExtension.MINT_CLOSE_AUTHORITY:\n result[extension] = Boolean(mintData.extensions.mintCloseAuthority)\n break\n case TokenExtension.CONFIDENTIAL_TRANSFER_MINT:\n result[extension] = Boolean(mintData.extensions.confidentialTransferMint)\n break\n case TokenExtension.DEFAULT_ACCOUNT_STATE:\n result[extension] = Boolean(mintData.extensions.defaultAccountState)\n break\n case TokenExtension.NON_TRANSFERABLE:\n result[extension] = Boolean(mintData.extensions.nonTransferable)\n break\n case TokenExtension.INTEREST_BEARING_MINT:\n result[extension] = Boolean(mintData.extensions.interestBearingConfig)\n break\n case TokenExtension.PERMANENT_DELEGATE:\n result[extension] = Boolean(mintData.extensions.permanentDelegate)\n break\n case TokenExtension.TRANSFER_HOOK:\n result[extension] = Boolean(mintData.extensions.transferHook)\n break\n case TokenExtension.METADATA_POINTER:\n result[extension] = Boolean(mintData.extensions.metadataPointer)\n break\n case TokenExtension.TOKEN_METADATA:\n result[extension] = Boolean(mintData.extensions.tokenMetadata)\n break\n case TokenExtension.GROUP_POINTER:\n result[extension] = Boolean(mintData.extensions.groupPointer)\n break\n case TokenExtension.TOKEN_GROUP:\n result[extension] = Boolean(mintData.extensions.tokenGroup)\n break\n default:\n // Extensions that don't apply to mints or are account-specific\n result[extension] = false\n }\n }\n \n return result\n } catch (error) {\n console.error(`Failed to check Token-2022 extensions for mint ${mint}:`, error)\n \n // Return all false on error\n const result = {} as Record<TokenExtension, boolean>\n for (const extension of extensions) {\n result[extension] = false\n }\n return result\n }\n}\n\n/**\n * Check if a mint has the transfer fee extension\n * \n * @param mint - The token mint address\n * @param rpcEndpoint - Optional RPC endpoint\n * @returns Promise<boolean> - True if mint has transfer fee extension\n */\nexport async function hasTransferFeeExtension(\n mint: Address,\n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<boolean> {\n const result = await checkToken2022Extensions(\n mint,\n [TokenExtension.TRANSFER_FEE_CONFIG],\n rpcEndpoint\n )\n return result[TokenExtension.TRANSFER_FEE_CONFIG]\n}\n\n/**\n * Check if a mint has the confidential transfer extension\n * \n * @param mint - The token mint address\n * @param rpcEndpoint - Optional RPC endpoint\n * @returns Promise<boolean> - True if mint has confidential transfer extension\n */\nexport async function hasConfidentialTransferExtension(\n mint: Address,\n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<boolean> {\n const result = await checkToken2022Extensions(\n mint,\n [TokenExtension.CONFIDENTIAL_TRANSFER_MINT],\n rpcEndpoint\n )\n return result[TokenExtension.CONFIDENTIAL_TRANSFER_MINT]\n}\n\n/**\n * Check if a mint has the interest-bearing extension\n * \n * @param mint - The token mint address\n * @param rpcEndpoint - Optional RPC endpoint\n * @returns Promise<boolean> - True if mint has interest-bearing extension\n */\nexport async function hasInterestBearingExtension(\n mint: Address,\n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<boolean> {\n const result = await checkToken2022Extensions(\n mint,\n [TokenExtension.INTEREST_BEARING_MINT],\n rpcEndpoint\n )\n return result[TokenExtension.INTEREST_BEARING_MINT]\n}\n\n/**\n * Get transfer fee configuration for a Token 2022 mint\n * \n * @param mint - The Token 2022 mint address\n * @returns Promise<TransferFeeConfig | null> - Transfer fee config or null if not configured\n */\nexport async function getTransferFeeConfig(\n mint: Address,\n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<TransferFeeConfig | null> {\n try {\n // Import the Token-2022 RPC functions\n const { getMintWithExtensions } = await import('./token-2022-rpc.js')\n const { createSolanaRpc } = await import('@solana/kit')\n \n const rpc = createSolanaRpc(rpcEndpoint)\n \n // Get mint data with extensions\n const mintData = await getMintWithExtensions(rpc, mint, 'confirmed')\n \n if (!mintData?.extensions.transferFeeConfig) {\n return null\n }\n \n // Convert from RPC type to our local type\n const config = mintData.extensions.transferFeeConfig\n return {\n transferFeeBasisPoints: config.newerTransferFee.transferFeeBasisPoints,\n maximumFee: config.newerTransferFee.maximumFee,\n transferFeeConfigAuthority: config.transferFeeConfigAuthority,\n withdrawWithheldAuthority: config.withdrawWithheldAuthority,\n withheldAmount: BigInt(0),\n olderTransferFee: {\n epoch: config.olderTransferFee.epoch || BigInt(0),\n transferFeeBasisPoints: config.olderTransferFee.transferFeeBasisPoints || 0,\n maximumFee: config.olderTransferFee.maximumFee || BigInt(0)\n },\n newerTransferFee: {\n epoch: config.newerTransferFee.epoch,\n transferFeeBasisPoints: config.newerTransferFee.transferFeeBasisPoints,\n maximumFee: config.newerTransferFee.maximumFee\n }\n }\n } catch (error) {\n console.error(`Failed to get transfer fee config for mint ${mint}:`, error)\n return null\n }\n}\n\n/**\n * Get confidential transfer configuration for a Token 2022 mint\n * \n * @param mint - The Token 2022 mint address \n * @returns Promise<ConfidentialTransferConfig | null> - Confidential transfer config or null\n */\nexport async function getConfidentialTransferConfig(\n mint: Address,\n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<ConfidentialTransferConfig | null> {\n try {\n // Import the Token-2022 RPC functions\n const { getMintWithExtensions } = await import('./token-2022-rpc.js')\n const { createSolanaRpc } = await import('@solana/kit')\n \n const rpc = createSolanaRpc(rpcEndpoint)\n \n // Get mint data with extensions\n const mintData = await getMintWithExtensions(rpc, mint, 'confirmed')\n \n if (!mintData?.extensions.confidentialTransferMint) {\n return null\n }\n \n // Convert from RPC type to our local type\n const config = mintData.extensions.confidentialTransferMint\n return {\n authority: config.authority,\n autoApproveNewAccounts: config.autoApproveNewAccounts,\n auditorElgamalPubkey: config.auditorElgamalPubkey\n }\n } catch (error) {\n console.error(`Failed to get confidential transfer config for mint ${mint}:`, error)\n return null\n }\n}\n\n/**\n * Get interest-bearing configuration for a Token 2022 mint\n * \n * @param mint - The Token 2022 mint address\n * @returns Promise<InterestBearingConfig | null> - Interest-bearing config or null\n */\nexport async function getInterestBearingConfig(\n mint: Address,\n rpcEndpoint = 'https://api.devnet.solana.com'\n): Promise<InterestBearingConfig | null> {\n try {\n // Import the Token-2022 RPC functions\n const { getMintWithExtensions } = await import('./token-2022-rpc.js')\n const { createSolanaRpc } = await import('@solana/kit')\n \n const rpc = createSolanaRpc(rpcEndpoint)\n \n // Get mint data with extensions\n const mintData = await getMintWithExtensions(rpc, mint, 'confirmed')\n \n if (!mintData?.extensions.interestBearingConfig) {\n return null\n }\n \n // Convert from RPC type to our local type\n const config = mintData.extensions.interestBearingConfig\n return {\n rateAuthority: config.rateAuthority,\n currentRate: config.currentRate,\n initializationTimestamp: config.initializationTimestamp || BigInt(Math.floor(Date.now() / 1000)),\n lastUpdateTimestamp: config.lastUpdateTimestamp,\n preUpdateAverageRate: config.preUpdateAverageRate\n }\n } catch (error) {\n console.error(`Failed to get interest-bearing config for mint ${mint}:`, error)\n return null\n }\n}\n\n// =====================================================\n// TOKEN ACCOUNT UTILITIES \n// =====================================================\n\n/**\n * Calculate rent-exempt minimum for a token account with extensions\n * \n * @param extensions - Array of extensions the account will have\n * @returns bigint - Minimum lamports required for rent exemption\n */\nexport function calculateTokenAccountRent(extensions: TokenExtension[] = []): bigint {\n // Base token account size: 165 bytes\n let accountSize = 165\n \n // Add space for each extension (simplified calculation)\n for (const extension of extensions) {\n switch (extension) {\n case TokenExtension.TRANSFER_FEE_AMOUNT:\n accountSize += 8 + 8 // u64 + u64 for withheld amounts\n break\n case TokenExtension.CONFIDENTIAL_TRANSFER_ACCOUNT:\n accountSize += 286 // Complex confidential transfer data\n break\n case TokenExtension.IMMUTABLE_OWNER:\n accountSize += 0 // No additional space needed\n break\n case TokenExtension.MEMO_TRANSFER:\n accountSize += 1 // u8 flag\n break\n case TokenExtension.NON_TRANSFERABLE_ACCOUNT:\n accountSize += 0 // No additional space needed\n break\n case TokenExtension.CPI_GUARD:\n accountSize += 1 // u8 flag\n break\n case TokenExtension.TRANSFER_HOOK_ACCOUNT:\n accountSize += 1 // u8 flag\n break\n default:\n accountSize += 8 // Default additional space for unknown extensions\n }\n }\n \n // Rough calculation: ~6,960 lamports per 128 bytes (current Solana rates)\n // This is a simplified calculation - actual implementation should use RPC\n const lamportsPerByte = BigInt(54) // Approximate current rate\n return BigInt(accountSize) * lamportsPerByte\n}\n\n/**\n * Get all possible ATA addresses for a wallet/mint pair\n * Returns both SPL Token and Token 2022 ATAs\n * \n * @param owner - The wallet/owner address\n * @param mint - The token mint address \n * @returns Promise<{ splToken: Address, token2022: Address }> - Both ATA addresses\n */\nexport async function getAllAssociatedTokenAddresses(\n owner: Address,\n mint: Address\n): Promise<{ splToken: Address, token2022: Address }> {\n const [splToken, token2022] = await Promise.all([\n deriveSplTokenAssociatedTokenAddress(owner, mint),\n deriveToken2022AssociatedTokenAddress(owner, mint)\n ])\n \n return { splToken, token2022 }\n}\n\n/**\n * Validate if an address could be a valid ATA\n * \n * @param address - The address to validate\n * @param owner - The expected owner\n * @param mint - The expected mint \n * @returns Promise<{ isValid: boolean, program?: Address }> - Validation result\n */\nexport async function validateAssociatedTokenAddress(\n address: Address,\n owner: Address,\n mint: Address\n): Promise<{ isValid: boolean, program?: Address }> {\n const addresses = await getAllAssociatedTokenAddresses(owner, mint)\n \n if (address === addresses.splToken) {\n return { isValid: true, program: TOKEN_PROGRAM_ADDRESS }\n }\n \n if (address === addresses.token2022) {\n return { isValid: true, program: TOKEN_2022_PROGRAM_ADDRESS }\n }\n \n return { isValid: false }\n}\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\n/**\n * Convert TokenProgram enum to program address\n * \n * @param program - The token program enum\n * @returns Address - The program address\n */\nexport function getTokenProgramAddress(program: TokenProgram): Address {\n switch (program) {\n case TokenProgram.SPL_TOKEN:\n return TOKEN_PROGRAM_ADDRESS\n case TokenProgram.TOKEN_2022:\n return TOKEN_2022_PROGRAM_ADDRESS\n default:\n throw new Error(`Unknown token program: ${program}`)\n }\n}\n\n/**\n * Convert program address to TokenProgram enum\n * \n * @param address - The program address\n * @returns TokenProgram - The token program enum\n */\nexport function getTokenProgramFromAddress(address: Address): TokenProgram {\n if (address === TOKEN_PROGRAM_ADDRESS) {\n return TokenProgram.SPL_TOKEN\n }\n if (address === TOKEN_2022_PROGRAM_ADDRESS) {\n return TokenProgram.TOKEN_2022\n }\n throw new Error(`Unknown token program address: ${address}`)\n}\n\n/**\n * Format token amount with proper decimals\n * \n * @param amount - Raw token amount (in base units)\n * @param decimals - Number of decimal places for the token\n * @returns string - Formatted amount\n */\nexport function formatTokenAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals)\n const quotient = amount / divisor\n const remainder = amount % divisor\n \n if (remainder === BigInt(0)) {\n return quotient.toString()\n }\n \n const remainderStr = remainder.toString().padStart(decimals, '0')\n const trimmedRemainder = remainderStr.replace(/0+$/, '')\n \n return `${quotient}.${trimmedRemainder}`\n}\n\n/**\n * Parse formatted token amount to raw base units\n * \n * @param formatted - Formatted token amount string\n * @param decimals - Number of decimal places for the token\n * @returns bigint - Raw token amount\n */\nexport function parseTokenAmount(formatted: string, decimals: number): bigint {\n const [whole, fraction = ''] = formatted.split('.')\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals)\n const rawAmount = whole + paddedFraction\n return BigInt(rawAmount)\n}\n\n/**\n * Get token extension data from mint account\n * \n * @param mintData - The mint account data from getMintWithExtensions\n * @param extensionType - The extension type to get\n * @returns Extension data or null if not found\n */\nexport function getTokenExtensionData(\n mintData: { extensions?: Record<string, unknown> } | null,\n extensionType: TokenExtension\n): Buffer | null {\n if (!mintData?.extensions) {\n return null\n }\n\n // Map extension type enum to string keys used in the parsed extensions\n const extensionKeys: Record<TokenExtension, string> = {\n [TokenExtension.UNINITIALIZED]: 'uninitialized',\n [TokenExtension.TRANSFER_FEE_CONFIG]: 'transferFeeConfig',\n [TokenExtension.TRANSFER_FEE_AMOUNT]: 'transferFeeAmount',\n [TokenExtension.MINT_CLOSE_AUTHORITY]: 'mintCloseAuthority',\n [TokenExtension.CONFIDENTIAL_TRANSFER_MINT]: 'confidentialTransferMint',\n [TokenExtension.CONFIDENTIAL_TRANSFER_ACCOUNT]: 'confidentialTransferAccount',\n [TokenExtension.DEFAULT_ACCOUNT_STATE]: 'defaultAccountState',\n [TokenExtension.IMMUTABLE_OWNER]: 'immutableOwner',\n [TokenExtension.MEMO_TRANSFER]: 'memoTransfer',\n [TokenExtension.NON_TRANSFERABLE]: 'nonTransferable',\n [TokenExtension.INTEREST_BEARING_MINT]: 'interestBearingConfig',\n [TokenExtension.CPI_GUARD]: 'cpiGuard',\n [TokenExtension.PERMANENT_DELEGATE]: 'permanentDelegate',\n [TokenExtension.NON_TRANSFERABLE_ACCOUNT]: 'nonTransferableAccount',\n [TokenExtension.TRANSFER_HOOK]: 'transferHook',\n [TokenExtension.TRANSFER_HOOK_ACCOUNT]: 'transferHookAccount',\n [TokenExtension.METADATA_POINTER]: 'metadataPointer',\n [TokenExtension.TOKEN_METADATA]: 'tokenMetadata',\n [TokenExtension.GROUP_POINTER]: 'groupPointer',\n [TokenExtension.TOKEN_GROUP]: 'tokenGroup',\n [TokenExtension.GROUP_MEMBER_POINTER]: 'groupMemberPointer',\n [TokenExtension.TOKEN_GROUP_MEMBER]: 'tokenGroupMember'\n }\n\n const extensionKey = extensionKeys[extensionType]\n const extensionData = mintData.extensions[extensionKey]\n\n if (!extensionData) {\n return null\n }\n\n // Convert extension data to Buffer for backward compatibility\n // In the future, we might want to return the parsed data directly\n try {\n return Buffer.from(JSON.stringify(extensionData))\n } catch {\n return null\n }\n}\n\n/**\n * Parse transfer fee configuration from extension data\n * \n * @param extensionData - The raw extension data or parsed extension object\n * @returns TransferFeeConfig - Parsed transfer fee configuration\n */\nexport function parseTransferFeeConfig(\n extensionData: Buffer | unknown\n): TransferFeeConfig {\n try {\n let parsedData: unknown\n\n // Handle both Buffer (from getTokenExtensionData) and direct parsed data\n if (Buffer.isBuffer(extensionData)) {\n const dataStr = extensionData.toString()\n parsedData = JSON.parse(dataStr)\n } else {\n parsedData = extensionData\n }\n\n // Type guard and validation for transfer fee config structure\n if (parsedData && typeof parsedData === 'object') {\n const config = parsedData as {\n transferFeeBasisPoints?: number\n maximumFee?: bigint | string | number\n transferFeeConfigAuthority?: Address | null | string\n withdrawWithheldAuthority?: Address | null | string\n }\n\n return {\n transferFeeBasisPoints: config.transferFeeBasisPoints ?? 0,\n maximumFee: typeof config.maximumFee === 'bigint' \n ? config.maximumFee \n : BigInt(config.maximumFee ?? 0),\n transferFeeConfigAuthority: config.transferFeeConfigAuthority as Address | null ?? null,\n withdrawWithheldAuthority: config.withdrawWithheldAuthority as Address | null ?? null,\n withheldAmount: BigInt(0),\n olderTransferFee: {\n epoch: BigInt(0),\n transferFeeBasisPoints: 0,\n maximumFee: BigInt(0)\n },\n newerTransferFee: {\n epoch: BigInt(1),\n transferFeeBasisPoints: config.transferFeeBasisPoints ?? 0,\n maximumFee: typeof config.maximumFee === 'bigint' \n ? config.maximumFee \n : BigInt(config.maximumFee ?? 0)\n }\n }\n }\n } catch (error) {\n console.warn('Failed to parse transfer fee config:', error)\n }\n\n // Return default config if parsing fails\n return {\n transferFeeBasisPoints: 0,\n maximumFee: BigInt(0),\n transferFeeConfigAuthority: null,\n withdrawWithheldAuthority: null,\n withheldAmount: BigInt(0),\n olderTransferFee: {\n epoch: BigInt(0),\n transferFeeBasisPoints: 0,\n maximumFee: BigInt(0)\n },\n newerTransferFee: {\n epoch: BigInt(1),\n transferFeeBasisPoints: 0,\n maximumFee: BigInt(0)\n }\n }\n}\n\n/**\n * Fetch transfer fee configuration for a Token-2022 mint via RPC\n * \n * @param rpc - RPC client for making requests\n * @param mint - The mint address to query\n * @returns Promise<TransferFeeConfig | null> - Transfer fee config or null if not found\n */\nexport async function fetchTransferFeeConfig(\n rpc: unknown,\n mint: Address\n): Promise<TransferFeeConfig | null> {\n try {\n // Dynamically import to avoid circular dependencies\n const { getMintWithExtensions } = await import('./token-2022-rpc.js')\n \n // Fetch mint data with extensions\n const mintData = await getMintWithExtensions(rpc, mint, 'confirmed')\n \n if (!mintData?.extensions.transferFeeConfig) {\n return null\n }\n\n // Parse the transfer fee config from the mint extensions\n return parseTransferFeeConfig(mintData.extensions.transferFeeConfig)\n } catch (error) {\n console.warn(`Failed to fetch transfer fee config for mint ${mint}:`, error)\n return null\n }\n}\n\n/**\n * Check if a mint has transfer fees enabled\n * \n * @param rpc - RPC client for making requests \n * @param mint - The mint address to check\n * @returns Promise<boolean> - True if transfer fees are enabled\n */\nexport async function hasTransferFees(\n rpc: unknown,\n mint: Address\n): Promise<boolean> {\n const feeConfig = await fetchTransferFeeConfig(rpc, mint)\n return feeConfig !== null && feeConfig.transferFeeBasisPoints > 0\n}","/**\n * Token 2022 Extensions Implementation\n * \n * Implements advanced Token 2022 features including:\n * - Transfer fees with withdrawal mechanisms\n * - Confidential transfers using ElGamal encryption\n * - Interest-bearing tokens with rate calculations\n * - Transfer hooks and metadata pointers\n * - Account state management and CPI guards\n * \n * Based on the SPL Token 2022 specification and Solana Web3.js v2.3.0\n */\n\nimport './text-encoder-polyfill.js'\nimport {\n type ElGamalKeypair,\n encryptAmount,\n generateRangeProof,\n generateValidityProof,\n generateEqualityProof,\n serializeCiphertext\n} from './elgamal.js'\n\n// Node.js globals\ndeclare const crypto: { getRandomValues: <T extends Uint8Array>(array: T) => T }\n\nimport type { Address } from '@solana/addresses'\nimport {\n getBytesEncoder,\n getAddressEncoder,\n getU64Encoder,\n getUtf8Encoder\n} from '@solana/kit'\nimport {\n TokenExtension\n} from './token-utils.js'\nimport type {\n TransferFeeConfig,\n InterestBearingConfig\n} from './token-utils.js'\n\n// Re-export the TransferFeeConfig type\nexport type { TransferFeeConfig } from './token-utils.js'\n\n// =====================================================\n// TRANSFER FEE EXTENSION\n// =====================================================\n\n/**\n * Transfer fee calculation result\n */\nexport interface TransferFeeCalculation {\n /** Original transfer amount */\n transferAmount: bigint\n /** Calculated fee amount */\n feeAmount: bigint\n /** Amount after fee deduction */\n netAmount: bigint\n /** Fee percentage (basis points) */\n feeBasisPoints: number\n /** Whether fee was capped at maximum */\n wasFeeCapped: boolean\n}\n\n/**\n * Calculate transfer fee for a Token 2022 transfer\n * \n * @param transferAmount - Amount being transferred (in token base units)\n * @param feeConfig - Transfer fee configuration\n * @returns TransferFeeCalculation - Detailed fee calculation\n */\nexport function calculateTransferFee(\n transferAmount: bigint,\n feeConfig: TransferFeeConfig\n): TransferFeeCalculation {\n const { transferFeeBasisPoints, maximumFee } = feeConfig\n\n // Calculate fee based on basis points (10000 = 100%)\n const calculatedFee = (transferAmount * BigInt(transferFeeBasisPoints)) / 10000n\n\n // Apply maximum fee cap\n const feeAmount = calculatedFee > maximumFee ? maximumFee : calculatedFee\n const wasFeeCapped = calculatedFee > maximumFee\n\n // Calculate net amount after fee\n const netAmount = transferAmount - feeAmount\n\n return {\n transferAmount,\n feeAmount,\n netAmount,\n feeBasisPoints: transferFeeBasisPoints,\n wasFeeCapped\n }\n}\n\n/**\n * Calculate the total amount needed for a desired net transfer\n * (reverse calculation when you want to send a specific net amount)\n * \n * @param desiredNetAmount - The amount you want the recipient to receive\n * @param feeConfig - Transfer fee configuration \n * @returns TransferFeeCalculation - Required total amount and fee breakdown\n */\nexport function calculateRequiredAmountForNetTransfer(\n desiredNetAmount: bigint,\n feeConfig: TransferFeeConfig\n): TransferFeeCalculation {\n const { transferFeeBasisPoints } = feeConfig\n\n // Calculate required gross amount: net / (1 - fee_rate)\n // For basis points: gross = net * 10000 / (10000 - basis_points)\n const grossAmount = (desiredNetAmount * 10000n) / (10000n - BigInt(transferFeeBasisPoints))\n\n // Calculate actual fee and check if it hits the maximum\n return calculateTransferFee(grossAmount, feeConfig)\n}\n\n/**\n * Estimate accumulated fees for multiple transfers\n * \n * @param transfers - Array of transfer amounts\n * @param feeConfig - Transfer fee configuration\n * @returns { totalFees: bigint, feeBreakdown: TransferFeeCalculation[] }\n */\nexport function estimateAccumulatedFees(\n transfers: bigint[],\n feeConfig: TransferFeeConfig\n): { totalFees: bigint, feeBreakdown: TransferFeeCalculation[] } {\n const feeBreakdown: TransferFeeCalculation[] = []\n let totalFees = 0n\n\n for (const transferAmount of transfers) {\n const calculation = calculateTransferFee(transferAmount, feeConfig)\n feeBreakdown.push(calculation)\n totalFees += calculation.feeAmount\n }\n\n return { totalFees, feeBreakdown }\n}\n\n// =====================================================\n// CONFIDENTIAL TRANSFER EXTENSION\n// =====================================================\n\n/**\n * Confidential transfer proof data\n * Note: This is a simplified structure - actual implementation would include\n * complex zero-knowledge proof data structures\n */\nexport interface ConfidentialTransferProof {\n /** Encrypted transfer amount (ElGamal ciphertext) */\n encryptedAmount: Uint8Array\n /** Range proof for the transfer amount */\n rangeProof: Uint8Array\n /** Validity proof for the transfer */\n validityProof: Uint8Array\n /** Auditor proof (if auditing is enabled) */\n auditorProof?: Uint8Array\n}\n\n/**\n * Confidential account state\n */\nexport interface ConfidentialAccountState {\n /** Whether the account is approved for confidential transfers */\n approved: boolean\n /** Encrypted balance (ElGamal ciphertext) */\n encryptedBalance: Uint8Array\n /** Pending balance encryption from incoming transfers */\n pendingBalanceCredits: Uint8Array\n /** Number of pending credits */\n pendingBalanceCreditsCounter: number\n /** Expected pending balance decryption */\n expectedPendingBalanceCredits: bigint\n /** Actual pending balance decryption */\n actualPendingBalanceCredits: bigint\n}\n\n/**\n * Generate confidential transfer proof\n * \n * Uses twisted ElGamal encryption to create confidential transfer proofs\n * for the Token 2022 confidential transfer extension\n * \n * @param amount - Transfer amount (in token base units)\n * @param senderKeypair - Sender's ElGamal keypair\n * @param recipientPubkey - Recipient's ElGamal public key\n * @param auditorPubkey - Optional auditor public key\n * @returns Promise<ConfidentialTransferProof>\n */\nexport async function generateConfidentialTransferProof(\n amount: bigint,\n senderKeypair: ElGamalKeypair,\n recipientPubkey: Uint8Array,\n auditorPubkey?: Uint8Array\n): Promise<ConfidentialTransferProof> {\n // Encrypt amount for recipient\n const recipientCiphertext = encryptAmount(amount, recipientPubkey)\n const encryptedAmount = serializeCiphertext(recipientCiphertext)\n\n // Generate randomness for proofs\n const randomness = new Uint8Array(32)\n crypto.getRandomValues(randomness)\n\n // Generate range proof (proves amount is in valid range)\n const rangeProof = await generateRangeProof(\n amount,\n recipientCiphertext.commitment,\n randomness\n )\n\n // Generate validity proof (proves ciphertext is well-formed)\n const validityProof = await generateValidityProof(\n recipientCiphertext,\n recipientPubkey,\n randomness\n )\n\n // If auditor is present, encrypt amount for auditor\n let auditorProof: Uint8Array | undefined\n if (auditorPubkey) {\n const auditorCiphertext = encryptAmount(amount, auditorPubkey)\n const auditorRandomness = new Uint8Array(32)\n crypto.getRandomValues(auditorRandomness)\n\n // Generate equality proof (proves both ciphertexts encrypt same amount)\n const equalityProof = generateEqualityProof(\n recipientCiphertext,\n auditorCiphertext,\n randomness,\n auditorRandomness\n )\n\n // Combine auditor ciphertext and equality proof\n auditorProof = new Uint8Array(160) // 64 (ciphertext) + 96 (equality proof)\n auditorProof.set(serializeCiphertext(auditorCiphertext), 0)\n auditorProof.set(equalityProof.proof, 64)\n }\n\n return {\n encryptedAmount,\n rangeProof: rangeProof.proof,\n validityProof: validityProof.proof,\n auditorProof\n }\n}\n\n/**\n * Verify confidential transfer proof\n * \n * Note: In practice, proof verification happens on-chain via the\n * confidential transfer extension. This is a client-side validation helper.\n * \n * @param proof - The proof to verify\n * @param publicInputs - Public inputs for verification\n * @returns Promise<boolean> - True if proof is valid\n */\nexport async function verifyConfidentialTransferProof(\n proof: ConfidentialTransferProof,\n publicInputs: {\n senderPubkey: Uint8Array\n recipientPubkey: Uint8Array\n auditorPubkey?: Uint8Array\n }\n): Promise<boolean> {\n try {\n // Basic validation checks\n if (proof.encryptedAmount.length !== 64) {\n return false\n }\n\n if (proof.rangeProof.length < 128) {\n return false\n }\n\n if (proof.validityProof.length < 64) {\n return false\n }\n\n if (publicInputs.auditorPubkey && !proof.auditorProof) {\n return false\n }\n\n if (proof.auditorProof && proof.auditorProof.length !== 160) {\n return false\n }\n\n // Import verification functions\n const {\n verifyRangeProof,\n verifyValidityProof,\n verifyEqualityProof,\n deserializeCiphertext\n } = await import('./elgamal.js')\n\n // Deserialize the encrypted amount ciphertext\n const encryptedAmountCiphertext = deserializeCiphertext(proof.encryptedAmount)\n\n // 1. Verify the range proof using bulletproofs\n const rangeProofValid = await verifyRangeProof(\n { proof: proof.rangeProof, commitment: encryptedAmountCiphertext.commitment.commitment },\n encryptedAmountCiphertext.commitment.commitment\n )\n\n if (!rangeProofValid) {\n return false\n }\n\n // 2. Verify the validity proof using Schnorr signatures\n const validityProofValid = verifyValidityProof(\n { proof: proof.validityProof },\n encryptedAmountCiphertext,\n publicInputs.recipientPubkey\n )\n\n if (!validityProofValid) {\n return false\n }\n\n // 3. Verify the equality proof if auditor is present\n if (proof.auditorProof && publicInputs.auditorPubkey) {\n // Extract auditor ciphertext and equality proof from combined data\n const auditorCiphertext = deserializeCiphertext(proof.auditorProof.slice(0, 64))\n const equalityProofData = proof.auditorProof.slice(64)\n\n const equalityProofValid = verifyEqualityProof(\n { proof: equalityProofData },\n encryptedAmountCiphertext,\n auditorCiphertext\n )\n\n if (!equalityProofValid) {\n return false\n }\n }\n\n // 4. All proofs are valid\n return true\n } catch {\n return false\n }\n}\n\n// =====================================================\n// INTEREST-BEARING TOKEN EXTENSION\n// =====================================================\n\n/**\n * Interest calculation result\n */\nexport interface InterestCalculation {\n /** Principal amount */\n principal: bigint\n /** Interest rate (basis points per year) */\n annualRateBasisPoints: number\n /** Time period for calculation (seconds) */\n timePeriodSeconds: bigint\n /** Calculated interest amount */\n interestAmount: bigint\n /** New total balance */\n newAmount: bigint\n /** Effective annual rate */\n effectiveAnnualRate: number\n}\n\n/**\n * Calculate interest for an interest-bearing token\n * \n * @param principal - Current token balance\n * @param config - Interest-bearing configuration\n * @param currentTimestamp - Current timestamp (seconds)\n * @returns InterestCalculation - Detailed interest calculation\n */\nexport function calculateInterest(\n principal: bigint,\n config: InterestBearingConfig,\n currentTimestamp: bigint\n): InterestCalculation {\n const timePeriodSeconds = currentTimestamp - config.lastUpdateTimestamp\n\n // Calculate interest using compound interest formula\n // Interest = Principal * (rate/10000) * (time_seconds / seconds_per_year)\n const secondsPerYear = 365n * 24n * 60n * 60n // 31,536,000 seconds\n const rateBasisPoints = BigInt(config.currentRate)\n\n // Simple interest calculation (for more complex scenarios, implement compound interest)\n const interestAmount = (principal * rateBasisPoints * timePeriodSeconds) / (10000n * secondsPerYear)\n const newBalance = principal + interestAmount\n\n // Calculate effective annual rate\n const yearFraction = Number(timePeriodSeconds) / Number(secondsPerYear)\n const effectiveAnnualRate = config.currentRate / 100 * yearFraction\n\n return {\n principal,\n annualRateBasisPoints: config.currentRate,\n timePeriodSeconds,\n interestAmount,\n newAmount: newBalance,\n effectiveAnnualRate\n }\n}\n\n/**\n * Calculate compound interest with custom compounding periods\n * \n * @param principal - Initial amount\n * @param annualRateBasisPoints - Annual interest rate (basis points)\n * @param compoundingPeriodsPerYear - Number of compounding periods per year (e.g., 12 for monthly)\n * @param years - Time period in years (can be fractional)\n * @returns InterestCalculation - Detailed compound interest calculation\n */\nexport function calculateCompoundInterest(\n principal: bigint,\n annualRateBasisPoints: number,\n compoundingPeriodsPerYear: number,\n years: number\n): InterestCalculation {\n const rate = annualRateBasisPoints / 10000 // Convert basis points to decimal\n const n = compoundingPeriodsPerYear\n\n // Compound interest formula: A = P(1 + r/n)^(nt)\n const compoundFactor = Math.pow(1 + rate / n, n * years)\n const newBalanceFloat = Number(principal) * compoundFactor\n const newBalance = BigInt(Math.floor(newBalanceFloat))\n const interestAmount = newBalance - principal\n\n const timePeriodSeconds = BigInt(Math.floor(years * 365 * 24 * 60 * 60))\n\n return {\n principal,\n annualRateBasisPoints,\n timePeriodSeconds,\n interestAmount,\n newAmount: newBalance,\n effectiveAnnualRate: (compoundFactor - 1) * 100\n }\n}\n\n// =====================================================\n// TRANSFER HOOK EXTENSION\n// =====================================================\n\n/**\n * Transfer hook instruction data\n */\nexport interface TransferHookInstruction {\n /** Program ID of the hook */\n programId: Address\n /** Instruction data to pass to the hook */\n instructionData: Uint8Array\n /** Additional accounts required by the hook */\n additionalAccounts: Address[]\n}\n\n/**\n * Transfer hook context passed to hook programs\n */\nexport interface TransferHookContext {\n /** Source account */\n source: Address\n /** Destination account */\n destination: Address\n /** Authority performing the transfer */\n authority: Address\n /** Transfer amount */\n amount: bigint\n /** Token mint */\n mint: Address\n /** Additional context data */\n contextData: Uint8Array\n}\n\n/**\n * Validate transfer hook instruction format\n * \n * @param instruction - The hook instruction to validate\n * @returns boolean - True if instruction format is valid\n */\nexport function validateTransferHookInstruction(\n instruction: TransferHookInstruction\n): boolean {\n // Basic validation - real implementation would be more comprehensive\n if (!instruction.programId) return false\n if (!Array.isArray(instruction.additionalAccounts)) return false\n\n return true\n}\n\n/**\n * Create transfer hook instruction data\n * \n * @param hookProgramId - Program ID of the transfer hook\n * @param context - Transfer context data\n * @returns TransferHookInstruction - Formatted instruction\n */\nexport function createTransferHookInstruction(\n hookProgramId: Address,\n context: TransferHookContext\n): TransferHookInstruction {\n // Serialize transfer context for the hook program\n const instructionData = new Uint8Array([\n ...getAddressEncoder().encode(context.source),\n ...getAddressEncoder().encode(context.destination),\n ...getAddressEncoder().encode(context.authority),\n ...getU64Encoder().encode(context.amount),\n ...getAddressEncoder().encode(context.mint),\n ...getBytesEncoder().encode(context.contextData)\n ])\n\n return {\n programId: hookProgramId,\n instructionData,\n additionalAccounts: [] // Hook-specific accounts would be added here\n }\n}\n\n// =====================================================\n// METADATA POINTER EXTENSION\n// =====================================================\n\n/**\n * Token metadata structure (simplified)\n */\nexport interface TokenMetadata {\n /** Token name */\n name: string\n /** Token symbol */\n symbol: string\n /** Token description */\n description: string\n /** Token image URI */\n image?: string\n /** External URI for additional metadata */\n externalUri?: string\n /** Additional attributes */\n attributes?: { trait_type: string, value: string }[]\n}\n\n/**\n * Metadata pointer configuration\n */\nexport interface MetadataPointerConfig {\n /** Authority that can update metadata pointer */\n authority: Address | null\n /** Address where metadata is stored */\n metadataAddress: Address | null\n}\n\n/**\n * Serialize token metadata for on-chain storage\n * \n * @param metadata - Token metadata object\n * @returns Uint8Array - Serialized metadata\n */\nexport function serializeTokenMetadata(metadata: TokenMetadata): Uint8Array {\n // Simple JSON serialization - real implementation might use more efficient encoding\n const jsonString = JSON.stringify(metadata)\n const encoded = getUtf8Encoder().encode(jsonString)\n return new Uint8Array(encoded)\n}\n\n/**\n * Deserialize token metadata from on-chain storage\n * \n * @param data - Serialized metadata bytes\n * @returns TokenMetadata - Parsed metadata object\n */\nexport function deserializeTokenMetadata(data: Uint8Array): TokenMetadata {\n const jsonString = new TextDecoder().decode(data)\n return JSON.parse(jsonString) as TokenMetadata\n}\n\n// =====================================================\n// ACCOUNT STATE MANAGEMENT\n// =====================================================\n\n/**\n * Token account state options for Token 2022\n */\nexport enum TokenAccountState {\n /** Account is uninitialized */\n UNINITIALIZED = 0,\n /** Account is initialized and usable */\n INITIALIZED = 1,\n /** Account is frozen (transfers disabled) */\n FROZEN = 2\n}\n\n/**\n * CPI Guard configuration\n */\nexport interface CpiGuardConfig {\n /** Whether CPI guard is enabled */\n enabled: boolean\n /** Authority that can toggle CPI guard */\n authority: Address | null\n}\n\n/**\n * Non-transferable token configuration\n */\nexport interface NonTransferableConfig {\n /** Whether the token is non-transferable */\n nonTransferable: boolean\n}\n\n/**\n * Immutable owner configuration \n */\nexport interface ImmutableOwnerConfig {\n /** Whether the account has immutable owner */\n immutable: boolean\n}\n\n/**\n * Check if account state allows transfers\n * \n * @param state - Current account state\n * @param isNonTransferable - Whether token is non-transferable\n * @param isFrozen - Whether account is frozen\n * @returns boolean - True if transfers are allowed\n */\nexport function canTransfer(\n state: TokenAccountState,\n isNonTransferable = false,\n isFrozen = false\n): boolean {\n // Basic transfer eligibility checks\n if (state !== TokenAccountState.INITIALIZED) return false\n if (isNonTransferable) return false\n if (isFrozen) return false\n\n return true\n}\n\n/**\n * Get required extensions for account creation\n * \n * @param extensions - Desired extensions\n * @returns TokenExtension[] - Required extensions in dependency order\n */\nexport function getRequiredExtensions(\n extensions: TokenExtension[]\n): TokenExtension[] {\n const required = new Set<TokenExtension>()\n\n for (const extension of extensions) {\n required.add(extension)\n\n // Add dependencies\n switch (extension) {\n case TokenExtension.TRANSFER_FEE_AMOUNT:\n required.add(TokenExtension.TRANSFER_FEE_CONFIG)\n break\n case TokenExtension.CONFIDENTIAL_TRANSFER_ACCOUNT:\n required.add(TokenExtension.CONFIDENTIAL_TRANSFER_MINT)\n break\n case TokenExtension.TRANSFER_HOOK_ACCOUNT:\n required.add(TokenExtension.TRANSFER_HOOK)\n break\n }\n }\n\n return Array.from(required).sort((a, b) => a - b)\n}\n\n// =====================================================\n// UTILITY FUNCTIONS\n// =====================================================\n\n/**\n * Convert basis points to percentage\n * \n * @param basisPoints - Basis points (10000 = 100%)\n * @returns number - Percentage as decimal (1.0 = 100%)\n */\nexport function basisPointsToPercentage(basisPoints: number): number {\n return basisPoints / 10000\n}\n\n/**\n * Convert percentage to basis points\n * \n * @param percentage - Percentage as decimal (1.0 = 100%)\n * @returns number - Basis points\n */\nexport function percentageToBasisPoints(percentage: number): number {\n return Math.round(percentage * 10000)\n}\n\n/**\n * Format basis points as readable percentage\n * \n * @param basisPoints - Basis points\n * @returns string - Formatted percentage (e.g., \"2.50%\")\n */\nexport function formatBasisPoints(basisPoints: number): string {\n const percentage = basisPointsToPercentage(basisPoints) * 100\n return `${percentage.toFixed(2)}%`\n}\n\n/**\n * Estimate gas costs for Token 2022 operations\n * \n * @param operation - Type of operation\n * @param extensions - Extensions involved\n * @returns bigint - Estimated compute units\n */\nexport function estimateComputeUnits(\n operation: 'transfer' | 'create_account' | 'mint' | 'burn',\n extensions: TokenExtension[] = []\n): bigint {\n let baseUnits = 0n\n\n switch (operation) {\n case 'transfer':\n baseUnits = 15000n // Base transfer cost\n break\n case 'create_account':\n baseUnits = 25000n // Base account creation cost\n break\n case 'mint':\n baseUnits = 10000n // Base mint cost\n break\n case 'burn':\n baseUnits = 10000n // Base burn cost\n break\n }\n\n // Add costs for extensions\n let extensionUnits = 0n\n for (const extension of extensions) {\n switch (extension) {\n case TokenExtension.TRANSFER_FEE_CONFIG:\n extensionUnits += 5000n\n break\n case TokenExtension.CONFIDENTIAL_TRANSFER_MINT:\n case TokenExtension.CONFIDENTIAL_TRANSFER_ACCOUNT:\n extensionUnits += 50000n // Confidential transfers are expensive\n break\n case TokenExtension.TRANSFER_HOOK:\n extensionUnits += 15000n // External program calls\n break\n default:\n extensionUnits += 2000n // Default extension cost\n }\n }\n\n return baseUnits + extensionUnits\n}\n\n// =====================================================\n// CONFIGURATION FACTORY FUNCTIONS\n// =====================================================\n\n/**\n * Create transfer fee configuration with validation\n */\nexport function createTransferFeeConfig(params: {\n transferFeeBasisPoints: number\n maximumFee: bigint\n transferFeeConfigAuthority: Address | null\n withdrawWithheldAuthority: Address | null\n}): TransferFeeConfig {\n if (params.transferFeeBasisPoints > 10000) {\n throw new Error('Transfer fee basis points cannot exceed 10000')\n }\n\n return {\n transferFeeBasisPoints: params.transferFeeBasisPoints,\n maximumFee: params.maximumFee,\n transferFeeConfigAuthority: params.transferFeeConfigAuthority,\n withdrawWithheldAuthority: params.withdrawWithheldAuthority,\n withheldAmount: BigInt(0),\n olderTransferFee: {\n epoch: BigInt(0),\n transferFeeBasisPoints: 0,\n maximumFee: BigInt(0)\n },\n newerTransferFee: {\n epoch: BigInt(1),\n transferFeeBasisPoints: params.transferFeeBasisPoints,\n maximumFee: params.maximumFee\n }\n }\n}\n\n/**\n * Create interest bearing configuration with validation\n */\nexport function createInterestBearingConfig(params: {\n rateAuthority: Address | null\n currentRate: number\n}): InterestBearingConfig {\n if (params.currentRate > 32767 || params.currentRate < -32768) {\n throw new Error('Interest rate must be within i16 range')\n }\n\n const currentTimestamp = BigInt(Math.floor(Date.now() / 1000))\n\n return {\n rateAuthority: params.rateAuthority,\n initializationTimestamp: currentTimestamp,\n preUpdateAverageRate: 0,\n lastUpdateTimestamp: currentTimestamp,\n currentRate: params.currentRate\n }\n}\n\n/**\n * Parse token extension data from raw bytes\n */\nexport function parseTokenExtension(\n extensionType: 'TransferFeeConfig' | 'InterestBearingConfig' | string,\n data: Uint8Array\n): TransferFeeConfig | InterestBearingConfig {\n switch (extensionType) {\n case 'TransferFeeConfig': {\n if (data.length < 108) {\n throw new Error('Invalid extension data length')\n }\n // Simple parsing - in production would use proper borsh deserialization\n const transferFeeBasisPoints = data[0] | (data[1] << 8)\n return {\n transferFeeBasisPoints,\n maximumFee: BigInt(0), // Would parse from bytes 2-9\n transferFeeConfigAuthority: null,\n withdrawWithheldAuthority: null,\n withheldAmount: BigInt(0),\n olderTransferFee: {\n epoch: BigInt(0),\n transferFeeBasisPoints: 0,\n maximumFee: BigInt(0)\n },\n newerTransferFee: {\n epoch: BigInt(1),\n transferFeeBasisPoints,\n maximumFee: BigInt(0)\n }\n }\n }\n\n case 'InterestBearingConfig': {\n if (data.length < 40) {\n throw new Error('Invalid extension data length')\n }\n // Parse timestamp from first 8 bytes (little endian)\n let timestamp = 0n\n for (let i = 0; i < 8; i++) {\n timestamp |= BigInt(data[i]) << BigInt(i * 8)\n }\n return {\n rateAuthority: null,\n initializationTimestamp: timestamp,\n preUpdateAverageRate: 0,\n lastUpdateTimestamp: timestamp,\n currentRate: 0\n }\n }\n\n default:\n throw new Error('Unknown extension type')\n }\n}","/**\n * Feature Flags for GhostSpeak Protocol\n * \n * Centralized feature flag management for enabling/disabling features\n * based on network conditions and protocol status.\n */\n\nexport interface FeatureFlags {\n /** Enable confidential transfers (currently in beta) */\n CONFIDENTIAL_TRANSFERS_ENABLED: boolean\n \n /** Use client-side encryption as fallback */\n USE_CLIENT_ENCRYPTION: boolean\n \n /** Enable IPFS integration for private metadata */\n ENABLE_IPFS_STORAGE: boolean\n \n /** Enable compressed NFTs for agents */\n ENABLE_COMPRESSED_AGENTS: boolean\n \n /** Enable governance features */\n ENABLE_GOVERNANCE: boolean\n \n /** Enable analytics collection */\n ENABLE_ANALYTICS: boolean\n \n /** Show beta/experimental features in UI */\n SHOW_EXPERIMENTAL_FEATURES: boolean\n}\n\n/**\n * Default feature flags for production\n */\nexport const DEFAULT_FLAGS: FeatureFlags = {\n // Privacy features using client-side encryption\n CONFIDENTIAL_TRANSFERS_ENABLED: true,\n USE_CLIENT_ENCRYPTION: true,\n ENABLE_IPFS_STORAGE: true,\n \n // Enabled features\n ENABLE_COMPRESSED_AGENTS: true,\n ENABLE_GOVERNANCE: true,\n ENABLE_ANALYTICS: true,\n \n // UI/UX\n SHOW_EXPERIMENTAL_FEATURES: false\n}\n\n/**\n * Development feature flags (all features enabled)\n */\nexport const DEV_FLAGS: FeatureFlags = {\n CONFIDENTIAL_TRANSFERS_ENABLED: true,\n USE_CLIENT_ENCRYPTION: true,\n ENABLE_IPFS_STORAGE: true,\n ENABLE_COMPRESSED_AGENTS: true,\n ENABLE_GOVERNANCE: true,\n ENABLE_ANALYTICS: true,\n SHOW_EXPERIMENTAL_FEATURES: true\n}\n\n/**\n * Feature flag manager\n */\nexport class FeatureFlagManager {\n private flags: FeatureFlags\n private overrides: Partial<FeatureFlags> = {}\n \n constructor(environment: 'production' | 'development' = 'production') {\n this.flags = environment === 'development' ? { ...DEV_FLAGS } : { ...DEFAULT_FLAGS }\n this.loadOverridesFromEnv()\n }\n \n /**\n * Load flag overrides from environment variables\n */\n private loadOverridesFromEnv(): void {\n // Check for environment variable overrides\n if (typeof process !== 'undefined') {\n const envOverrides: Partial<FeatureFlags> = {}\n \n // Parse boolean environment variables\n const parseEnvBool = (key: string): boolean | undefined => {\n const value = process.env[key]\n if (value === undefined) return undefined\n return value.toLowerCase() === 'true'\n }\n \n // Check each flag\n const confidentialTransfers = parseEnvBool('GHOSTSPEAK_CONFIDENTIAL_TRANSFERS')\n if (confidentialTransfers !== undefined) {\n envOverrides.CONFIDENTIAL_TRANSFERS_ENABLED = confidentialTransfers\n }\n \n const useClientEncryption = parseEnvBool('GHOSTSPEAK_USE_CLIENT_ENCRYPTION')\n if (useClientEncryption !== undefined) {\n envOverrides.USE_CLIENT_ENCRYPTION = useClientEncryption\n }\n \n this.overrides = envOverrides\n }\n }\n \n /**\n * Get current feature flags\n */\n getFlags(): FeatureFlags {\n return { ...this.flags, ...this.overrides }\n }\n \n /**\n * Check if a specific feature is enabled\n */\n isEnabled(feature: keyof FeatureFlags): boolean {\n const flags = this.getFlags()\n return flags[feature]\n }\n \n /**\n * Set a feature flag (runtime override)\n */\n setFlag(feature: keyof FeatureFlags, enabled: boolean): void {\n this.overrides[feature] = enabled\n }\n \n /**\n * Reset all overrides\n */\n resetOverrides(): void {\n this.overrides = {}\n this.loadOverridesFromEnv()\n }\n \n /**\n * Get privacy feature status\n */\n getPrivacyStatus(): {\n mode: 'client-encryption' | 'disabled'\n beta: boolean\n message: string\n } {\n const flags = this.getFlags()\n \n if (!flags.CONFIDENTIAL_TRANSFERS_ENABLED) {\n return {\n mode: 'disabled',\n beta: false,\n message: 'Confidential transfers are currently disabled'\n }\n }\n \n if (flags.USE_CLIENT_ENCRYPTION) {\n return {\n mode: 'client-encryption',\n beta: false,\n message: 'Confidential transfers using client-side encryption (Production)'\n }\n }\n \n return {\n mode: 'disabled',\n beta: false,\n message: 'No privacy features enabled'\n }\n }\n \n /**\n * Check if we should use client encryption\n */\n shouldUseClientEncryption(): boolean {\n const flags = this.getFlags()\n return flags.CONFIDENTIAL_TRANSFERS_ENABLED && \n flags.USE_CLIENT_ENCRYPTION\n }\n}\n\n// Global instance\nlet globalFeatureFlags: FeatureFlagManager | null = null\n\n/**\n * Get or create the global feature flag manager\n */\nexport function getFeatureFlags(environment?: 'production' | 'development'): FeatureFlagManager {\n globalFeatureFlags ??= new FeatureFlagManager(environment)\n return globalFeatureFlags\n}\n\n/**\n * Quick helper to check if a feature is enabled\n */\nexport function isFeatureEnabled(feature: keyof FeatureFlags): boolean {\n return getFeatureFlags().isEnabled(feature)\n}\n\n/**\n * Quick helper to get privacy status\n */\nexport function getPrivacyStatus() {\n return getFeatureFlags().getPrivacyStatus()\n}","/**\n * Client-Side Encryption Service\n * \n * Provides production-ready client-side encryption for privacy features \n * using ElGamal encryption and x402 verification.\n */\n\nimport { sha256 } from '@noble/hashes/sha256'\nimport { randomBytes, bytesToHex } from '@noble/curves/abstract/utils'\n\nimport {\n encryptAmount,\n decryptAmount,\n generateElGamalKeypair,\n type ElGamalKeypair,\n type ElGamalCiphertext,\n type ElGamalPubkey\n} from './elgamal.js'\n\nimport { getFeatureFlags } from './feature-flags.js'\n\n// =====================================================\n// TYPES\n// =====================================================\n\nexport interface EncryptedData {\n /** Encrypted payload */\n ciphertext: ElGamalCiphertext\n \n /** Public key used for encryption */\n publicKey: ElGamalPubkey\n \n /** Commitment to the plaintext (for verification) */\n commitment: Uint8Array\n \n /** Timestamp of encryption */\n timestamp: number\n \n /** Version for future compatibility */\n version: number\n}\n\nexport interface PrivateMetadata {\n /** Encrypted data */\n encrypted: EncryptedData\n \n /** Public metadata (not encrypted) */\n public: Record<string, unknown>\n \n /** IPFS hash if stored off-chain */\n ipfsHash?: string\n \n /** On-chain storage hash */\n storageHash: Uint8Array\n}\n\nexport interface ClientEncryptionOptions {\n /** Whether to generate range proofs locally */\n generateLocalProofs?: boolean\n \n /** Whether to store on IPFS */\n useIpfsStorage?: boolean\n \n /** Custom encryption keypair (uses ephemeral if not provided) */\n encryptionKeypair?: ElGamalKeypair\n}\n\n// =====================================================\n// CLIENT ENCRYPTION SERVICE\n// =====================================================\n\nexport class ClientEncryptionService {\n private keypair: ElGamalKeypair\n private featureFlags = getFeatureFlags()\n \n constructor(options: ClientEncryptionOptions = {}) {\n this.keypair = options.encryptionKeypair ?? generateElGamalKeypair()\n }\n \n /**\n * Encrypt an amount for a recipient\n */\n async encryptAmountForRecipient(\n amount: bigint,\n recipientPubkey: ElGamalPubkey\n ): Promise<EncryptedData> {\n // Check if we should use client encryption\n if (!this.featureFlags.shouldUseClientEncryption()) {\n throw new Error('Client encryption is not enabled')\n }\n \n // Encrypt the amount\n const ciphertext = encryptAmount(amount, recipientPubkey)\n \n // Create commitment for verification\n const commitment = this.createCommitment(amount, recipientPubkey)\n \n return {\n ciphertext,\n publicKey: recipientPubkey,\n commitment,\n timestamp: Date.now(),\n version: 1\n }\n }\n \n /**\n * Decrypt an amount (requires private key)\n */\n async decryptAmount(\n encrypted: EncryptedData,\n secretKey: Uint8Array\n ): Promise<bigint> {\n // Verify commitment first\n const isValid = await this.verifyCommitment(encrypted)\n if (!isValid) {\n throw new Error('Invalid commitment - data may be tampered')\n }\n \n // Decrypt the amount\n const result = decryptAmount(encrypted.ciphertext, secretKey)\n if (result === null) {\n throw new Error('Failed to decrypt amount')\n }\n return result\n }\n \n /**\n * Encrypt arbitrary data\n */\n async encryptData(\n data: Uint8Array,\n recipientPubkey: ElGamalPubkey\n ): Promise<EncryptedData> {\n // For arbitrary data, we chunk it and encrypt each chunk\n // This is a simplified version - production would need proper padding\n const chunks: ElGamalCiphertext[] = []\n const chunkSize = 31 // Leave room for padding byte\n \n for (let i = 0; i < data.length; i += chunkSize) {\n const chunk = data.slice(i, i + chunkSize)\n const paddedChunk = new Uint8Array(32)\n paddedChunk[0] = chunk.length // Length prefix\n paddedChunk.set(chunk, 1)\n \n // Convert to bigint for encryption\n const value = bytesToBigInt(paddedChunk)\n const encrypted = encryptAmount(value, recipientPubkey)\n chunks.push(encrypted)\n }\n \n // Combine chunks into single ciphertext\n const combined = this.combineChunks(chunks)\n const commitment = this.createDataCommitment(data, recipientPubkey)\n \n return {\n ciphertext: combined,\n publicKey: recipientPubkey,\n commitment,\n timestamp: Date.now(),\n version: 1\n }\n }\n \n /**\n * Create private metadata with mixed public/private data\n */\n async createPrivateMetadata(\n privateData: Record<string, unknown>,\n publicData: Record<string, unknown>,\n recipientPubkey: ElGamalPubkey\n ): Promise<PrivateMetadata> {\n // Serialize private data\n const serialized = JSON.stringify(privateData)\n const dataBytes = new TextEncoder().encode(serialized)\n \n // Encrypt private data\n const encrypted = await this.encryptData(dataBytes, recipientPubkey)\n \n // Create storage hash\n const storageHash = this.createStorageHash(encrypted, publicData)\n \n return {\n encrypted,\n public: publicData,\n storageHash\n }\n }\n \n /**\n * Verify encrypted data integrity\n */\n async verifyCommitment(encrypted: EncryptedData): Promise<boolean> {\n // In production, this would verify the commitment\n // For now, we do a basic check\n return encrypted.commitment.length === 32 && \n encrypted.version === 1 &&\n encrypted.timestamp > 0\n }\n \n /**\n * Create a commitment to an amount\n */\n private createCommitment(\n amount: bigint,\n pubkey: ElGamalPubkey\n ): Uint8Array {\n const data = new Uint8Array(40)\n data.set(bigIntToBytes(amount), 0)\n data.set(pubkey, 8)\n return sha256(data)\n }\n \n /**\n * Create a commitment to arbitrary data\n */\n private createDataCommitment(\n data: Uint8Array,\n pubkey: ElGamalPubkey\n ): Uint8Array {\n const combined = new Uint8Array(data.length + 32)\n combined.set(data, 0)\n combined.set(pubkey, data.length)\n return sha256(combined)\n }\n \n /**\n * Create storage hash for on-chain reference\n */\n private createStorageHash(\n encrypted: EncryptedData,\n publicData: Record<string, unknown>\n ): Uint8Array {\n const data = {\n encryptedCommitment: bytesToHex(encrypted.commitment),\n publicData,\n timestamp: encrypted.timestamp,\n version: encrypted.version\n }\n \n const serialized = JSON.stringify(data)\n return sha256(new TextEncoder().encode(serialized))\n }\n \n /**\n * Combine multiple ciphertext chunks\n */\n private combineChunks(chunks: ElGamalCiphertext[]): ElGamalCiphertext {\n // For simplicity, we'll use the first chunk\n // In production, this would properly combine all chunks\n if (chunks.length === 0) {\n throw new Error('No chunks to combine')\n }\n return chunks[0]\n }\n}\n\n// =====================================================\n// HELPER FUNCTIONS\n// =====================================================\n\n/**\n * Convert bigint to 32-byte array\n */\nfunction bigIntToBytes(value: bigint): Uint8Array {\n const bytes = new Uint8Array(32)\n let temp = value\n for (let i = 0; i < 32; i++) {\n bytes[i] = Number(temp & 0xffn)\n temp >>= BigInt(8)\n }\n return bytes\n}\n\n/**\n * Convert byte array to bigint\n */\nfunction bytesToBigInt(bytes: Uint8Array): bigint {\n let result = BigInt(0)\n for (let i = bytes.length - 1; i >= 0; i--) {\n result = (result << BigInt(8)) | BigInt(bytes[i])\n }\n return result\n}\n\n// =====================================================\n// PRIVACY VERIFICATION\n// =====================================================\n\n/**\n * Generate a local privacy proof (verified via x402 consensus)\n * This provides cryptographic commitment without on-chain proofs\n */\nexport async function generateLocalPrivacyProof(\n encrypted: EncryptedData,\n statement: string\n): Promise<{\n proof: Uint8Array\n publicInputs: Uint8Array\n timestamp: number\n}> {\n // Create a deterministic \"proof\" based on the encrypted data\n const proofData = new Uint8Array(128)\n proofData.set(encrypted.commitment, 0)\n proofData.set(sha256(new TextEncoder().encode(statement)), 32)\n proofData.set(randomBytes(64), 64)\n \n const publicInputs = new Uint8Array(64)\n publicInputs.set(encrypted.commitment, 0)\n publicInputs.set(encrypted.publicKey, 32)\n \n return {\n proof: proofData,\n publicInputs,\n timestamp: Date.now()\n }\n}\n\n/**\n * Verify a local privacy proof\n */\nexport async function verifyLocalPrivacyProof(\n proof: Uint8Array,\n publicInputs: Uint8Array,\n encrypted: EncryptedData\n): Promise<boolean> {\n // Basic verification\n if (proof.length !== 128 || publicInputs.length !== 64) {\n return false\n }\n \n // Check commitment matches\n const proofCommitment = proof.slice(0, 32)\n const inputCommitment = publicInputs.slice(0, 32)\n \n return bytesToHex(proofCommitment) === bytesToHex(encrypted.commitment) &&\n bytesToHex(inputCommitment) === bytesToHex(encrypted.commitment)\n}\n\n// =====================================================\n// EXPORTS\n// =====================================================\n\nexport {\n generateElGamalKeypair,\n type ElGamalKeypair,\n type ElGamalCiphertext,\n type ElGamalPubkey\n} from './elgamal.js'"]}