@zubari/sdk 0.3.2 → 0.3.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/contracts.ts","../../src/services/ZubariApiClient.ts","../../src/protocols/NFTProtocol.ts","../../src/abi/ZubariMarket.json","../../src/protocols/MarketProtocol.ts","../../src/abi/ZubariTips.json","../../src/protocols/TipsProtocol.ts","../../src/abi/ZubariSubscription.json","../../src/protocols/SubscriptionProtocol.ts","../../src/protocols/PayoutsProtocol.ts"],"names":[],"mappings":";;;AAiBO,IAAM,YAAA,GAAe,4CAAA;AAoCrB,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,SAAA,EAAW,GAAA;AAAA;AAAA,EAEX,aAAA,EAAe,GAAA;AAAA,EAEK;AAAA,EAEpB,mBAAA,EAAqB,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAGtC,CAAA;AAGO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,UAAA,EAAY;AAAA,IACV,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,IACnC,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,QAAA,EAAS;AAAA,IAC9B,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAU;AAAA,IACnC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,SAAA,EAAU;AAAA,IACtC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,IAEpC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA,IACjC,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAA,EAAU;AAAA,IACpC,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,SAAA,EAAU;AAAA;AAAA,IAEjC,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAA,EAAU;AAAA,IACvC,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,SAAA,EAAU;AAAA,IAClC,EAAE,IAAA,EAAM,oBAAA,EAAsB,IAAA,EAAM,SAAA,EAAU;AAAA,IAC9C,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,SAAA;AAAU;AAEzC,CAAA;AAqBO,IAAM,kBAAA,GAAqB;AAAA,EAChC,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,YAAA;AAAA,IACL,IAAA,EAAM;AAAA;AAAA,GACR;AAAA,EACA,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,YAAA;AAAA,IACL,IAAA,EAAM;AAAA;AAAA;AAEV,CAAA;;;ACyaO,IAAM,kBAAN,MAAsB;AAAA,EACnB,MAAA;AAAA,EAER,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA;AAAA,MACzC,OAAA,EAAS,OAAO,OAAA,IAAW,GAAA;AAAA,MAC3B,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAAqB;AAChC,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,KAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,MAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,MAAA,EACA,IAAA,EACA,IAAA,EACY;AACZ,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,OAAO,SAAS,CAAA,CAAA;AAAA,IAC5D;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,MAAA,CAAO,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MAC5D,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACrC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,MAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACtF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,OAAA,EAAgD;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,SAAA,EAAY,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AAC7D,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAyB,KAAA,EAAO,IAAI,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAAiF;AAC5F,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAqB,KAAA,EAAO,CAAA,UAAA,EAAa,KAAK,CAAA,CAAE,CAAA;AACvE,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,IAAA,EACA,KAAA,EACkE;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,MAAA,QAAA,CAAS,MAAA,CAAO,SAAS,KAAK,CAAA;AAC9B,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AACjC,MAAA,IAAI,KAAK,WAAA,EAAa,QAAA,CAAS,MAAA,CAAO,aAAA,EAAe,KAAK,WAAW,CAAA;AACrE,MAAA,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AACnC,MAAA,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA;AACzC,MAAA,IAAI,IAAA,CAAK,eAAe,KAAA,CAAA,EAAW,QAAA,CAAS,OAAO,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AACxF,MAAA,IAAI,IAAA,CAAK,YAAY,QAAA,CAAS,MAAA,CAAO,cAAc,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,UAAU,CAAC,CAAA;AAClF,MAAA,IAAI,KAAK,WAAA,EAAa,QAAA,CAAS,MAAA,CAAO,aAAA,EAAe,KAAK,WAAW,CAAA;AAErE,MAAA,MAAM,UAAkC,EAAC;AACzC,MAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,QAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,OAAO,SAAS,CAAA,CAAA;AAAA,MAC5D;AAEA,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,SAAA,CAAA,EAAa;AAAA,QAC9D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,QAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC9D;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,KAAA,EAAe,MAAA,EAA8D;AAC/F,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA+B,QAAQ,CAAA,UAAA,EAAa,KAAK,YAAY,MAAM,CAAA;AAAA,IAC/F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,KAAA,EAAe,MAAA,EAA8D;AAC/F,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA+B,QAAQ,CAAA,UAAA,EAAa,KAAK,WAAW,MAAM,CAAA;AAAA,IAC9F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAA,EAA+C;AACpE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA+B,KAAA,EAAO,CAAA,UAAA,EAAa,KAAK,CAAA,eAAA,CAAiB,CAAA;AAAA,IAC7F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,OAAA,EAAqD;AACrE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,oBAAA,EAAuB,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AACxE,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA0B,KAAA,EAAO,IAAI,CAAA;AAAA,IACzD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,MAAA,EAAoD;AACjE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA0B,MAAA,EAAQ,oBAAoB,MAAM,CAAA;AAAA,IAChF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,MAAA,EAAkD;AAC9D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAyB,MAAA,EAAQ,mBAAmB,MAAM,CAAA;AAAA,IAC9E,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAA8D;AAChF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA+B,MAAA,EAAQ,sBAAsB,MAAM,CAAA;AAAA,IACvF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,MAAA,EAA0D;AACjF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA6B,OAAA,EAAS,qBAAqB,MAAM,CAAA;AAAA,IACrF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAAuE;AACzF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,uBAAA,EAA0B,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AAC3E,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA0B,KAAA,EAAO,IAAI,CAAA;AAAA,IACzD,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAA+C;AACnD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA6B,KAAA,EAAO,mBAAmB,CAAA;AAAA,IAC3E,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAQ,MAAA,EAAkD;AAC9D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAyB,MAAA,EAAQ,aAAa,MAAM,CAAA;AAAA,IACxE,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAyC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAGrB,OAAO,oBAAoB,CAAA;AAC9B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAiD;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,cAAA,EAAiB,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AAClE,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAIrB,OAAO,IAAI,CAAA;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAAiD;AACrE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,kBAAA,EAAqB,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AACtE,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAIrB,OAAO,IAAI,CAAA;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAAyE;AACpF,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAAsB,KAAA,EAAO,CAAA,UAAA,EAAa,KAAK,CAAA,CAAE,CAAA;AACzE,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,KAAK,GAAA,EAAI;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,KAAA,EACA,MAAA,EAC4E;AAC5E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA;AAAA,QACtB,OAAA;AAAA,QACA,aAAa,KAAK,CAAA,OAAA,CAAA;AAAA,QAClB;AAAA,OACF;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBAAuB,MAAA,EAAwD;AACnF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA4B,MAAA,EAAQ,4BAA4B,MAAM,CAAA;AAAA,IAC1F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,GAAoG;AACxG,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAuC,OAAO,0BAA0B,CAAA;AAChG,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,KAAK,KAAA,EAAM;AAAA,IAC5C,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,MAAA,EACqG;AACrG,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA;AAAA,QACtB,KAAA;AAAA,QACA,4BAA4B,MAAM,CAAA;AAAA,OACpC;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACJ,MAAA,EACwF;AACxF,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA;AAAA,QACtB,QAAA;AAAA,QACA,4BAA4B,MAAM,CAAA;AAAA,OACpC;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAA,EAAsD;AACpE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA2B,MAAA,EAAQ,gCAAgC,MAAM,CAAA;AAAA,IAC7F,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,OAAA,EAAkE;AACzF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,kBAAA,EAAqB,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AACtE,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAGrB,OAAO,IAAI,CAAA;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAAkE;AACvF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,8BAAA,EAAiC,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AAClF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAIrB,OAAO,IAAI,CAAA;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,cAAA,EAAyF;AAChH,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAA6B,QAAA,EAAU,CAAA,mBAAA,EAAsB,cAAc,CAAA,CAAE,CAAA;AACrG,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,8BAA8B,MAAA,EAAwE;AAC1G,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAoC,MAAA,EAAQ,qCAAqC,MAAM,CAAA;AAAA,IAC3G,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,MAAA,EAAsE;AAC3F,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAmC,MAAA,EAAQ,yCAAyC,MAAM,CAAA;AAAA,IAC9G,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAA,CACJ,cAAA,EACA,IAAA,EAC2F;AAC3F,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA;AAAA,QAChB,MAAA;AAAA,QACA,oCAAA;AAAA,QACA,EAAE,gBAAgB,IAAA;AAAK,OACzB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,UAAA,EAAoB,OAAA,EAAgD;AACrF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA;AAAA,QAChB,KAAA;AAAA,QACA,CAAA,qDAAA,EAAwD,UAAU,CAAA,SAAA,EAAY,OAAO,CAAA;AAAA,OACvF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,UAAA;AAAA,QACA,OAAA;AAAA,QACA,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAAA,GAA2D;AAC/D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA6B,KAAA,EAAO,iCAAiC,CAAA;AAAA,IACzF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,CAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,GAAyC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAMrB,OAAO,uBAAuB,CAAA;AACjC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAA,EAA8D;AAChF,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA+B,MAAA,EAAQ,sBAAsB,MAAM,CAAA;AAAA,IACvF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAA6E;AAClG,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,UAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,YAAA,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAClC;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,EAAS;AACpC,MAAA,MAAM,OAAO,CAAA,oBAAA,EAAuB,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AACxE,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAUrB,OAAO,IAAI,CAAA;AACd,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,GAA2D;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAGrB,OAAO,wBAAwB,CAAA;AAClC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,GAAsD;AAC1D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAA6B,KAAA,EAAO,2BAA2B,CAAA;AAAA,IACnF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,CAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAGA,IAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,mBAAA,IAAuB,+CAAA;AAG3D,IAAI,eAAA,GAA0C,IAAA;AAKvC,SAAS,mBAAmB,MAAA,EAAoD;AACrF,EAAA,IAAI,CAAC,mBAAoB,MAAA,EAAQ,OAAA,IAAW,gBAAgB,QAAQ,CAAA,CAAE,OAAA,KAAY,MAAA,CAAO,OAAA,EAAU;AACjG,IAAA,eAAA,GAAkB,IAAI,eAAA,CAAgB;AAAA,MACpC,OAAA,EAAS,QAAQ,OAAA,IAAW,eAAA;AAAA,MAC5B,SAAS,MAAA,EAAQ,OAAA;AAAA,MACjB,WAAW,MAAA,EAAQ;AAAA,KACpB,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,eAAA,CAAgB,YAAA,CAAa,OAAO,SAAS,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,eAAA;AACT;;;AClyCO,IAAM,oBAAN,MAAwB;AAAA,EACZ,eAAA;AAAA,EACA,mBAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACT,YAAA,GAAuB,CAAA;AAAA,EAE/B,YACE,eAAA,EACA,kBAAA,EACA,OAAA,EACA,OAAA,GAAiC,WACjC,MAAA,EACA;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,mBAAA,GAAsB,kBAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,YAAY,kBAAA,CAAmB,MAAA,GAAS,EAAE,OAAA,EAAS,MAAA,KAAW,MAAS,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UAAA,CAAW,OAAe,QAAA,EAA+B;AAC/D,IAAA,MAAM,QAAA,GAAW,QAAA,KAAa,KAAA,GAAQ,EAAA,GAAK,CAAA;AAC3C,IAAA,MAAM,CAAC,KAAA,EAAO,QAAA,GAAW,EAAE,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AAC9C,IAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,CAAO,QAAA,EAAU,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,QAAQ,CAAA;AACvE,IAAA,MAAM,MAAM,KAAA,GAAQ,cAAA;AAEpB,IAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,IAAK,GAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,QAAA,EAA+B;AACxD,IAAA,OAAO,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,CAAE,QAAQ,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAwB;AAC9B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,GAAO,IAAA,CAAK,YAAA,EAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,KAAA,EAAuB;AACvC,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AAC1B,MAAA,OAAO,KAAA,CAAM,MAAA,CAAO,EAAA,EAAI,GAAG,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,KAAK,CAAA;AAC7C,IAAA,OAAO,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,GAAG,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAA,CACJ,MAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,MAAM,EAAE,QAAA,EAAU,cAAA,EAAgB,OAAO,QAAA,EAAU,KAAA,EAAO,cAAa,GAAI,MAAA;AAG3E,IAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,GAAA;AAG1C,IAAA,IAAI,UAAA,GAAa,gBAAgB,aAAA,EAAe;AAC9C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,eAAA,CAAgB,aAAA,GAAgB,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACjF;AAGA,IAAA,IAAI,CAAC,KAAA,IAAS,UAAA,CAAW,KAAK,KAAK,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,OAAA,GAAU,KAAK,eAAA,EAAgB;AAGrC,IAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,IAAA,CAAK,KAAI,GAAI,GAAI,IAAI,eAAA,CAAgB,mBAAA;AAGjE,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AAGlD,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,kBAAA,CAAmB,QAAQ,CAAA;AAGxD,IAAA,MAAM,YAAA,GAAe,KAAA,IAAS,IAAA,CAAK,aAAA,EAAc;AAGjD,IAAA,MAAM,kBAAA,GAAqB,eAAe,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,GAAI,CAAA;AAC1E,IAAA,MAAM,cAAc,YAAA,GAAe,IAAA,CAAK,UAAU,YAAA,CAAa,WAAW,IAAI,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAM,IAAA,GAAO,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC3I,IAAA,MAAM,SAAS,YAAA,GAAe,IAAA,CAAK,UAAU,YAAA,CAAa,MAAM,IAAI,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAM,IAAA,GAAO,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACjI,IAAA,MAAM,YAAY,YAAA,GAAe,IAAA,CAAK,UAAU,YAAA,CAAa,SAAS,IAAI,YAAA,CAAa,OAAA,CAAQ,IAAA,EAAM,IAAA,GAAO,IAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAGvI,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,OAAA;AAAA,MACA,KAAK,QAAA,CAAS,KAAA;AAAA;AAAA,MACd,OAAA,EAAS,cAAA;AAAA,MACT,UAAA;AAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA,MACP,QAAA,EAAU,eAAA;AAAA,MACV,KAAA,EAAO,YAAA;AAAA,MACP,WAAA;AAAA,MACA,MAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,kBAAA;AAAA,MACH,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,mBAAmB,IAAA,CAAK;AAAA,KAC1B;AAGA,IAAA,MAAM,YAAY,MAAM,MAAA,CAAO,aAAA,CAAc,MAAA,EAAQ,mBAAmB,WAAW,CAAA;AAEnF,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,KAAK,QAAA,CAAS,KAAA;AAAA,MACd,OAAA,EAAS,cAAA;AAAA,MACT,UAAA;AAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA,MACP,QAAA,EAAU,eAAA;AAAA,MACV,KAAA,EAAO,YAAA;AAAA,MACP,WAAA,EAAa,eAAe,WAAA,GAAc,MAAA;AAAA,MAC1C,MAAA,EAAQ,eAAe,MAAA,GAAS,MAAA;AAAA,MAChC,kBAAA,EAAoB,eAAe,kBAAA,GAAqB,MAAA;AAAA,MACxD,SAAA,EAAW,eAAe,SAAA,GAAY;AAAA,KACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,2BAAA,CACJ,QAAA,EACA,cAAA,EACA,MAAA,EAC0B;AAE1B,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,MACV;AAAA,QACE,QAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACZ;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,OAAA,EACA,YAAA,EACA,OACA,SAAA,EACmB;AAEnB,IAAA,IAAI,OAAA,CAAQ,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,cAAc,KAAA,EAAO;AAAA,QACvD;AAAA,OACD,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,eAAA,EAAiB;AAC5C,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,CAAO,eAAA;AAAA,UACb,OAAA,EAAS,UAAA;AAAA,UACT,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU;AAAA,YACR,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,KAAA,EAAO;AAAA;AACT,SACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,0BAA0B,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,MAAM,IAAI,MAAM,CAAA,2BAAA,EAA8B,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC1G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,MAAA,EAAuB,SAAA,EAAsC;AAC7E,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAwB,MAAA,CAAO,YAAA,KAAiB,YAAA,GAAe,KAAA,GAAQ,MAAA;AAE7E,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS;AAAA,QAC3C,OAAO,MAAA,CAAO,OAAA;AAAA;AAAA,QACd,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,QAAA,EAAS;AAAA,QAC7B,QAAA;AAAA,QACA,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAA,GAAK,KAAK,EAAA,GAAK;AAAA;AAAA,OAC7C,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,EAAS;AACpC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA,CAAO,OAAA,CAAQ,EAAA,IAAM,EAAA;AAAA,UAC3B,OAAA,EAAS,UAAA;AAAA,UACT,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU;AAAA,YACR,SAAA,EAAW,OAAO,OAAA,CAAQ,EAAA;AAAA,YAC1B,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,QAAA,EAAS;AAAA,YAC7B,SAAS,MAAA,CAAO;AAAA;AAClB,SACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,oBAAoB,CAAA;AAAA,IACtD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,MAAA,MAAM,IAAI,MAAM,CAAA,gBAAA,EAAmB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC/F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,SAAA,EAAmB,KAAA,EAAe,YAAA,EAAyC;AACtF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ;AAAA,QAC1C,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,eAAA,EAAiB;AAC5C,QAAA,OAAO;AAAA,UACL,MAAM,MAAA,CAAO,eAAA;AAAA,UACb,OAAA,EAAS,UAAA;AAAA,UACT,MAAA,EAAQ,SAAA;AAAA,UACR,QAAA,EAAU;AAAA,YACR,SAAA;AAAA,YACA,KAAA,EAAO,MAAM,QAAA,EAAS;AAAA,YACtB,KAAA,EAAO;AAAA;AACT,SACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,mBAAmB,CAAA;AAAA,IACrD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AACzC,MAAA,MAAM,IAAI,MAAM,CAAA,iBAAA,EAAoB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAChG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CACJ,OAAA,EACA,EAAA,EACA,MACA,MAAA,EACmB;AACnB,IAAA,IAAI;AAGF,MAAA,MAAM,gBAAA,GAAmB,YAAA;AACzB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AACzE,MAAA,MAAM,SAAA,GAAY,EAAA,CAAG,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AACrE,MAAA,MAAM,cAAA,GAAiB,OAAO,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AAEpE,MAAA,MAAM,IAAA,GAAO,GAAG,gBAAgB,CAAA,EAAG,WAAW,CAAA,EAAG,SAAS,GAAG,cAAc,CAAA,CAAA;AAE3E,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QACtC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU;AAAA,UACR,OAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AACF,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,CAAA,iBAAA,EAAoB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAChG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAA,EAAiC;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,EAAE,OAAA,EAAS,SAAS,CAAA;AAEhE,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,UAC7B,OAAA,EAAS,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,EAAA;AAAA,UAC5B,eAAA,EAAiB,GAAA,CAAI,eAAA,IAAmB,IAAA,CAAK,eAAA;AAAA,UAC7C,KAAA,EAAO,IAAI,OAAA,IAAW,OAAA;AAAA,UACtB,OAAA,EAAS,IAAI,SAAA,IAAa,EAAA;AAAA,UAC1B,GAAA,EAAK,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,YAAA,IAAgB,EAAA;AAAA,UACzC,QAAA,EAAU,IAAI,IAAA,GAAO;AAAA,YACnB,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,YAChC,KAAA,EAAO,IAAI,QAAA,IAAY,EAAA;AAAA,YACvB,UAAA,EAAY;AAAA;AAAA,WACd,GAAI,KAAA,CAAA;AAAA,UACJ,YAAA,EAAc,CAAC,GAAA,CAAI;AAAA;AAAA,SACrB,CAAE,CAAA;AAAA,MACJ;AAEA,MAAA,OAAO,EAAC;AAAA,IACV,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAA0B;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,IAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAC5B,IAAA,OAAO,OAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EACnF;AACF;;;AC/XA,IAAA,oBAAA,GAAA;AAAA,EACE;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,qBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,YAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,cAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,kBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,qBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,4BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,8BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,0BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,yBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,kBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,qBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,SAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,SAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,eAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,aAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,cAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,MAAA;AAAA,YAChB,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,YAAA,EAAgB,6BAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,OAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,mBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,gBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,mBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,aAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,iBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,eAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,mBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,SAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,aAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA;AAEZ,CAAA;;;ACrrBO,IAAM,uBAAN,MAA2B;AAAA,EACf,eAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA,GAAM,oBAAA;AAAA,EAEvB,WAAA,CAAY,iBAAyB,OAAA,EAAiB;AACpD,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAS;AACP,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CACJ,MAAA,EACA,MAAA,EACmB;AAEnB,IAAA,IAAI,MAAA,CAAO,SAAS,EAAA,EAAI;AACtB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAGA,IAAA,IAAI,MAAA,CAAO,YAAY,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD;AAGA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,UAAA,EAAY;AAAA,MAChD,MAAA,CAAO,WAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO,YAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACR,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,CACJ,MAAA,EACA,MAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,WAAW,CAAC,MAAA,CAAO,SAAS,CAAC,CAAA;AAGnE,IAAA,MAAM,YAAA,GAAe,OAAO,YAAA,KAAiB,4CAAA;AAE7C,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,YAAA,GAAe,MAAA,CAAO,KAAA,GAAQ,EAAA;AAAA,MACrC;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CACJ,SAAA,EACA,MAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,eAAA,EAAiB,CAAC,SAAS,CAAC,CAAA;AAElE,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAA,CACJ,SAAA,EACA,QAAA,EACA,MAAA,EACmB;AACnB,IAAA,IAAI,YAAY,EAAA,EAAI;AAClB,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,eAAe,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAE1E,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CACJ,SAAA,EACA,QAAA,EACyB;AACzB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,YAAA,EAAc,CAAC,SAAS,CAAC,CAAA;AAE/D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,YAAA,EAAc,MAAM,CAAA;AAC/D,MAAA,MAAM,OAAA,GAAU,QAAQ,CAAC,CAAA;AAEzB,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAS;AAAA,QAClC,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,QACnC,UAAU,OAAA,CAAQ;AAAA,OACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CACJ,KAAA,EACA,QAAA,EACkB;AAClB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,iBAAA,EAAmB,CAAC,KAAK,CAAC,CAAA;AAEhE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,iBAAA,EAAmB,MAAM,CAAA;AACpE,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,KAAA,EAAsD;AACjE,IAAA,MAAM,GAAA,GAAO,KAAA,GAAQ,MAAA,CAAO,eAAA,CAAgB,SAAS,CAAA,GAAK,MAAA;AAC1D,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,cAAc,KAAA,GAAQ;AAAA,KACxB;AAAA,EACF;AACF;;;AC/OA,IAAA,kBAAA,GAAA;AAAA,EACE;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,YAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,kBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,qBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,4BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,8BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,0BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,WAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,cAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,oBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,aAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,QAAA;AAAA,YAChB,IAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,YAAA,EAAgB,uBAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,OAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,mBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,WAAA;AAAA,QAChB,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,WAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,UAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,eAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,SAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,gBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,aAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,QAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,SAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,UAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,mBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,mBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,SAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA;AAEZ,CAAA;;;AC9iBO,IAAM,qBAAN,MAAyB;AAAA,EACb,eAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA,GAAM,kBAAA;AAAA,EAEvB,WAAA,CAAY,iBAAyB,OAAA,EAAiB;AACpD,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAS;AACP,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CACJ,SAAA,EACA,OAAA,EACA,QACA,KAAA,EACmB;AACnB,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,4CAAA,EAA8C;AAC5E,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,SAAS,EAAA,EAAI;AACf,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,QAAA,EAAU,CAAC,SAAA,EAAW,OAAA,IAAW,EAAE,CAAC,CAAA;AAE1E,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAA,CACJ,SAAA,EACA,KAAA,EACA,MAAA,EACA,SACA,MAAA,EACmB;AACnB,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,4CAAA,EAA8C;AAC5E,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,KAAU,4CAAA,EAA8C;AACpE,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AACA,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,UAAA,EAAY,CAAC,WAAW,KAAA,EAAO,MAAA,EAAQ,OAAA,IAAW,EAAE,CAAC,CAAA;AAE3F,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,CACJ,UAAA,EACA,OAAA,EACA,QAAA,EACA,QACA,KAAA,EACmB;AACnB,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AACA,IAAA,IAAI,WAAW,MAAA,KAAW,OAAA,CAAQ,UAAU,UAAA,CAAW,MAAA,KAAW,SAAS,MAAA,EAAQ;AACjF,MAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,IACtF;AAGA,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,4CAAA,EAA8C;AAC5E,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,CAAC,KAAK,MAAA,KAAW,GAAA,GAAM,QAAQ,EAAE,CAAA;AACpE,IAAA,IAAI,eAAe,EAAA,EAAI;AACrB,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,eAAA,EAAiB,CAAC,UAAA,EAAY,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEtF,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CACJ,KAAA,EACA,QAAA,EACqB;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,QAAA,EAAU,CAAC,KAAK,CAAC,CAAA;AAEvD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,QAAA,EAAU,MAAM,CAAA;AAC3D,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AAGrB,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,KAAM,EAAA,EAAI;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,QAAA,EAAS;AAAA,QAC1B,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAA,QACzB,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAAA,QACnC,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAS;AAAA,OACjC;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,oBAAA,CACJ,OAAA,EACA,QAAA,EACiB;AACjB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,mBAAA,EAAqB,CAAC,OAAO,CAAC,CAAA;AAEpE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,mBAAA,EAAqB,MAAM,CAAA;AACtE,MAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBACJ,QAAA,EACiB;AACjB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,gBAAA,EAAkB,EAAE,CAAA;AAE1D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,gBAAA,EAAkB,MAAM,CAAA;AACnE,MAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,QAAA,EACiB;AACjB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,YAAA,EAAc,EAAE,CAAA;AAEtD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,YAAA,EAAc,MAAM,CAAA;AAC/D,MAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YACJ,QAAA,EACiB;AACjB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,UAAA,EAAY,EAAE,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,UAAA,EAAY,MAAM,CAAA;AAC7D,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,4CAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,CAAa,MAAA,EAAgB,MAAA,GAAiB,GAAA,EAA6C;AACzF,IAAA,MAAM,GAAA,GAAO,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,GAAK,MAAA;AACxC,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,eAAe,MAAA,GAAS;AAAA,KAC1B;AAAA,EACF;AACF;;;ACtTA,IAAA,0BAAA,GAAA;AAAA,EACE;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,mBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,YAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,qBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,4BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,eAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,cAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,8BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,0BAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,eAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,sBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,YAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,uBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,IAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,qBAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,SAAA,EAAa,KAAA;AAAA,IACb,MAAA,EAAU;AAAA,MACR;AAAA,QACE,OAAA,EAAW,KAAA;AAAA,QACX,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,oBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,QAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,cAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,gBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,iBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,WAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,QAAA;AAAA,YAChB,IAAA,EAAQ,MAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,QAAA;AAAA,YAChB,IAAA,EAAQ,aAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,cAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,cAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,iBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,MAAA;AAAA,YAChB,IAAA,EAAQ,UAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,YAAA,EAAgB,4CAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,iBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,UAAA,EAAc;AAAA,UACZ;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,gBAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,YAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,SAAA;AAAA,YAChB,IAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,MAAA;AAAA,YAChB,IAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAQ;AAAA,WACV;AAAA,UACA;AAAA,YACE,YAAA,EAAgB,4CAAA;AAAA,YAChB,IAAA,EAAQ,QAAA;AAAA,YACR,IAAA,EAAQ;AAAA;AACV,SACF;AAAA,QACA,YAAA,EAAgB,wCAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,cAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,OAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,QAAA;AAAA,QAChB,IAAA,EAAQ,aAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,cAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,iBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,mBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,cAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,gBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,aAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,WAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,SAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,yBAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,eAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,YAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,MAAA;AAAA,QAChB,IAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,QACE,YAAA,EAAgB,4CAAA;AAAA,QAChB,IAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAU;AAAA,MACR;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,UAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,IAAA,EAAQ,mBAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,MACT;AAAA,QACE,YAAA,EAAgB,SAAA;AAAA,QAChB,IAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAQ;AAAA;AACV,KACF;AAAA,IACA,eAAA,EAAmB,MAAA;AAAA,IACnB,IAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,QAAU,EAAC;AAAA,IACX,IAAA,EAAQ,SAAA;AAAA,IACR,SAAW,EAAC;AAAA,IACZ,eAAA,EAAmB,YAAA;AAAA,IACnB,IAAA,EAAQ;AAAA;AAEZ,CAAA;;;ACp1BO,IAAM,6BAAN,MAAiC;AAAA,EACrB,eAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA,GAAM,0BAAA;AAAA,EAEvB,WAAA,CAAY,iBAAyB,OAAA,EAAiB;AACpD,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAS;AACP,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,CACJ,IAAA,EACA,MAAA,EACiB;AAEjB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AACxC,MAAA,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,EAAA,EAAI;AACpB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,IACxD;AAGA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAG7D,IAAA,MAAM,eAAe,IAAA,CAAK,IAAA,CAAK,KAAK,QAAA,IAAY,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AAE7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,YAAA,EAAc;AAAA,MAClD,IAAA,CAAK,IAAA;AAAA,MACL,KAAK,WAAA,IAAe,EAAA;AAAA,MACpB,IAAA,CAAK,KAAA;AAAA,MACL,KAAK,YAAA,IAAgB,4CAAA;AAAA;AAAA,MACrB,YAAA;AAAA,MACA,KAAK,cAAA,IAAkB;AAAA;AAAA,KACxB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAGD,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,MAAA,EACA,MAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,gBAAA,EAAkB,CAAC,MAAM,CAAC,CAAA;AAEhE,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAA,CACJ,MAAA,EACA,MAAA,EACA,QACA,KAAA,EACmB;AACnB,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,aAAa,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAEnE,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,OAAO,KAAA,IAAS,EAAA;AAAA,MAChB;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CACJ,cAAA,EACA,MAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,QAAA,EAAU,CAAC,cAAc,CAAC,CAAA;AAEhE,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CACJ,cAAA,EACA,SAAA,EACA,MAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,gBAAgB,CAAC,cAAA,EAAgB,SAAS,CAAC,CAAA;AAEjF,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,MAC1C,IAAI,IAAA,CAAK,eAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,CACJ,UAAA,EACA,OAAA,EACA,QAAA,EACkB;AAClB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,gBAAgB,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAE3E,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,cAAA,EAAgB,MAAM,CAAA;AACjE,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,uBAAA,CACJ,UAAA,EACA,OAAA,EACA,QAAA,EACwB;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,sBAAsB,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAEjF,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,oBAAA,EAAsB,MAAM,CAAA;AACvE,MAAA,MAAM,cAAA,GAAiB,QAAQ,CAAC,CAAA;AAGhC,MAAA,IAAI,mBAAmB,oEAAA,EAAsE;AAC3F,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,cAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAA,CACJ,cAAA,EACA,QAAA,EAC8B;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,iBAAA,EAAmB,CAAC,cAAc,CAAC,CAAA;AAEzE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,iBAAA,EAAmB,MAAM,CAAA;AACpE,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AAGrB,MAAA,IAAI,GAAA,CAAI,mBAAmB,oEAAA,EAAsE;AAC/F,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,MAAA;AACJ,MAAA,QAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAAG,QAC1B,KAAK,CAAA;AACH,UAAA,MAAA,GAAS,QAAA;AACT,UAAA;AAAA,QACF,KAAK,CAAA;AACH,UAAA,MAAA,GAAS,WAAA;AACT,UAAA;AAAA,QACF,KAAK,CAAA;AACH,UAAA,MAAA,GAAS,SAAA;AACT,UAAA;AAAA,QACF;AACE,UAAA,MAAA,GAAS,QAAA;AAAA;AAGb,MAAA,OAAO;AAAA,QACL,gBAAgB,GAAA,CAAI,cAAA;AAAA,QACpB,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,YAAY,GAAA,CAAI,UAAA;AAAA,QAChB,SAAA,EAAW,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAAA,QAC/B,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAAA,QAC3B,WAAW,GAAA,CAAI,SAAA;AAAA,QACf;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,CACJ,MAAA,EACA,QAAA,EACkC;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,SAAA,EAAW,CAAC,MAAM,CAAC,CAAA;AAEzD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,SAAA,EAAW,MAAM,CAAA;AAC5D,MAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AAGtB,MAAA,IAAI,IAAA,CAAK,WAAW,oEAAA,EAAsE;AACxF,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAM,kBAAkB,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,GAAI,KAAK,EAAA,GAAK,EAAA;AAE9D,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,QAAA,EAAU,eAAA;AAAA,QACV,OAAO,EAAC;AAAA;AAAA,QACR,cAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAAA,QAC1C,QAAA,EAAU;AAAA;AAAA,OACZ;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAA,CACJ,OAAA,EACA,QAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,OAAO,KAAA,CAAM,kBAAA,CAAmB,iBAAA,EAAmB,CAAC,OAAO,CAAC,CAAA;AAElE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,iBAAA,EAAmB,MAAM,CAAA;AACpE,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAA,CACJ,OAAA,EACA,QAAA,EAC6B;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAAkB,SAAS,QAAQ,CAAA;AAC9D,IAAA,MAAM,QAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAChD,MAAA,IAAI,IAAA,IAAQ,KAAK,MAAA,EAAQ;AACvB,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBACJ,QAAA,EACiB;AACjB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,OAAO,QAAQ,CAAA,EAAG,SAAA,CAAU,KAAK,GAAG,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,gBAAA,EAAkB,EAAE,CAAA;AAE1D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,CAAK;AAAA,QACjC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,oBAAA,CAAqB,gBAAA,EAAkB,MAAM,CAAA;AACnE,MAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,yBAAA,CAA0B,WAAmB,MAAA,EAAwB;AACnE,IAAA,OAAO,SAAA,GAAY,OAAO,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,CAAa,MAAA,EAAgB,MAAA,GAAiB,GAAA,EAA6C;AACzF,IAAA,MAAM,GAAA,GAAO,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,GAAK,MAAA;AACxC,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,eAAe,MAAA,GAAS;AAAA,KAC1B;AAAA,EACF;AACF;;;ACtbA,IAAM,iBAAA,GAAoB;AAAA,EACxB,oBAAA,EAAsB,YAAA;AAAA;AAAA,EACtB,aAAA,EAAe,YAAA;AAAA;AAAA,EACf,oBAAA,EAAsB,YAAA;AAAA;AAAA,EACtB,eAAA,EAAiB,YAAA;AAAA;AAAA,EACjB,eAAA,EAAiB,YAAA;AAAA;AAAA,EACjB,kBAAA,EAAoB;AAAA;AACtB,CAAA;AAQO,IAAM,wBAAN,MAA4B;AAAA,EAChB,eAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EAEjB,WAAA,CAAY,eAAA,EAAyB,OAAA,EAAiB,UAAA,EAAqB;AACzE,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,aAAa,UAAA,IAAc,+CAAA;AAChC,IAAA,IAAA,CAAK,YAAY,kBAAA,CAAmB,EAAE,OAAA,EAAS,IAAA,CAAK,YAAY,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAmB,SAAA,EAA+C;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAElD,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,iBAAA,EAAmB;AAClD,QAAA,MAAM,YAAY,QAAA,CAAS,iBAAA;AAC3B,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,IAAA,IAAQ,GAAG,CAAA;AAAA,UAClC,aAAA,EAAe,MAAA,CAAO,SAAA,CAAU,aAAA,IAAiB,GAAG,CAAA;AAAA,UACpD,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,QAAA,IAAY,GAAG,CAAA;AAAA,UAC1C,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,SAAA,IAAa,GAAG,CAAA;AAAA,UAC5C,OAAO,MAAA,CAAO,SAAA,CAAU,QAAQ,GAAG,CAAA,GAC5B,OAAO,SAAA,CAAU,aAAA,IAAiB,GAAG,CAAA,GACrC,MAAA,CAAO,UAAU,QAAA,IAAY,GAAG,IAChC,MAAA,CAAO,SAAA,CAAU,aAAa,GAAG;AAAA,SAC1C;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,QACd,aAAA,EAAe,OAAO,CAAC,CAAA;AAAA,QACvB,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,QAClB,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,QACnB,KAAA,EAAO,OAAO,CAAC;AAAA,OACjB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,QACd,aAAA,EAAe,OAAO,CAAC,CAAA;AAAA,QACvB,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,QAClB,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,QACnB,KAAA,EAAO,OAAO,CAAC;AAAA,OACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,SAAA,EAA8C;AAC9D,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,qBAAA,CAAA,EAAyB;AAAA,MACtE,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,UAAU,SAAS,CAAA,CAAA;AAAA,QAClC,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,0BAA0B,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAA,CACJ,SAAA,EACA,IAAA,GAAe,CAAA,EACf,QAAgB,EAAA,EACgB;AAChC,IAAA,MAAM,WAAW,MAAM,KAAA;AAAA,MACrB,GAAG,IAAA,CAAK,UAAU,CAAA,0BAAA,EAA6B,IAAI,UAAU,KAAK,CAAA,CAAA;AAAA,MAClE;AAAA,QACE,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,UAAU,SAAS,CAAA,CAAA;AAAA,UAClC,cAAA,EAAgB;AAAA;AAClB;AACF,KACF;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,gCAAgC,CAAA;AAAA,IACjE;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,SAAA,EAA+C;AAChE,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,sBAAA,CAAA,EAA0B;AAAA,MACvE,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,UAAU,SAAS,CAAA,CAAA;AAAA,QAClC,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,oCAAoC,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,GAA+C;AACnD,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,yBAAA,CAAA,EAA6B;AAAA,MAC1E,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA;AAClB,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,8BAA8B,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,SAAA,EACA,MAAA,GAA2C,KAAA,EACb;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB;AAAA,QACrD,KAAA,EAAO,WAAW,KAAA,GAAQ,EAAA,GAAK,WAAW,MAAA,GAAS,CAAA,GAAI,MAAA,KAAW,OAAA,GAAU,EAAA,GAAK;AAAA,OAClF,CAAA;AAED,MAAA,IAAI,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,OAAA,EAAS;AAExC,QAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,UACrC,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA;AAAA,UACd,aAAA,EAAe,OAAO,CAAC,CAAA;AAAA,UACvB,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,UAClB,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,UACnB,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,GAAG,CAAA;AAAA,UAClC,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,QAAQ,MAAA,CAAO;AAAA,SACjB,CAAE,CAAA;AAAA,MACJ;AAEA,MAAA,OAAO,EAAC;AAAA,IACV,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,CAAoB,SAAA,EAAmB,IAAA,EAAoC;AAC/E,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,kBAAA,CAAA,EAAsB;AAAA,MACnE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,UAAU,SAAS,CAAA,CAAA;AAAA,QAClC,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM;AAAA,KAC9B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,0BAA0B,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,YAAA,EACA,MAAA,EACmB;AACnB,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAe,YAAA,CAAa,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AAClF,MAAA,MAAM,IAAA,GAAO,CAAA,EAAG,iBAAA,CAAkB,aAAa,GAAG,YAAY,CAAA,CAAA;AAE9D,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QACtC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,EAAE,KAAA,EAAO,YAAA;AAAa,OAClC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,MAAM,IAAI,MAAM,CAAA,cAAA,EAAiB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC7F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAA,CACJ,YAAA,EACA,MAAA,EACA,MAAA,EACmB;AACnB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,YAAA,GAAe,YAAA,CAAa,WAAA,EAAY,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AAClF,MAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AAC1D,MAAA,MAAM,OAAO,CAAA,EAAG,iBAAA,CAAkB,oBAAoB,CAAA,EAAG,YAAY,GAAG,aAAa,CAAA,CAAA;AAErF,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QACtC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,MAAA,EAAQ,SAAA;AAAA,QACR,UAAU,EAAE,KAAA,EAAO,cAAc,MAAA,EAAQ,MAAA,CAAO,UAAS;AAAE,OAC7D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,MAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IACrG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,iBAAA,CACJ,MAAA,EACA,MAAA,EACmB;AAEnB,IAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,WAAA,EAAa,CAAC,CAAA;AACzE,IAAA,IAAI,aAAa,GAAA,EAAO;AACtB,MAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,IACxE;AAGA,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,eAAe,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,MAC9D;AACA,MAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,SAAA,CAAU,WAAW,CAAA,EAAG;AACpD,QAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,IAAI;AAGF,MAAA,MAAM,SAAS,GAAA,CAAI,QAAA,CAAS,IAAI,GAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA;AAC9C,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AAE/D,MAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,SAAA,CAAU,WAAA,EAAY,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AACzF,QAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AAClE,QAAA,aAAA,IAAiB,gBAAA,GAAmB,UAAA;AAAA,MACtC;AAEA,MAAA,MAAM,IAAA,GAAO,GAAG,iBAAA,CAAkB,eAAe,GAAG,kEAAkE,CAAA,EAAG,WAAW,CAAA,EAAG,aAAa,CAAA,CAAA;AAEpJ,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QACtC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,MAAA,EAAQ,SAAA;AAAA,QACR,QAAA,EAAU,EAAE,MAAA;AAAO,OACrB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC3G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,cAAA,EAAiD;AACrE,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,UAAU,CAAA,2BAAA,EAA8B,cAAc,CAAA,CAAA,EAAI;AAAA,QAC7F,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C,CAAA;AAED,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,MAAA,EAAQ;AAC/B,UAAA,OAAO,IAAA,CAAK,MAAA;AAAA,QACd;AAAA,MACF;AAEA,MAAA,OAAO,EAAC;AAAA,IACV,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBACJ,MAAA,EACmB;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,iBAAA,CAAkB,kBAAA;AAE/B,MAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,eAAA,CAAgB;AAAA,QACtC,IAAI,IAAA,CAAK,eAAA;AAAA,QACT,IAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAM,EAAA,CAAG,IAAA;AAAA,QACT,OAAA,EAAS,UAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,MAAM,IAAI,MAAM,CAAA,6BAAA,EAAgC,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC5G;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAA,CACJ,KAAA,EACA,MAAA,EACA,WAAA,EACmB;AACnB,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAAA,IAC9F;AAEA,IAAA,IAAI;AAEF,MAAA,OAAO,MAAM,YAAY,WAAA,CAAY;AAAA,QACnC,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,4CAAA;AAAA;AAAA,QACV,QAAA,EAAU,MAAA;AAAA,QACV,WAAA,EAAa;AAAA;AAAA,OACd,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AACnD,MAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAClG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AACF","file":"index.js","sourcesContent":["// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n registry: string;\n nft: string;\n nft1155: string; // ERC-1155 multi-edition NFT\n marketplace: string;\n tips: string;\n subscriptions: string;\n payouts: string;\n entryPoint: string;\n paymaster: string;\n accountFactory: string;\n usdt: string;\n weth: string;\n}\n\n// Zero address for ETH payments and placeholder addresses\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n testnet: {\n // Ethereum Sepolia (11155111) - Deployed 2024-12-31\n registry: '0xe5CE1Eb986f58BE42EEDFe5C18ee5956803b2BDC',\n nft: '0xc165b8C6843e8f0B1489525D0f853d23f22c677B', // ZubariNFT ERC-721 with payment\n nft1155: '0x5e618B5bEaE1dc41369E7aa235Cc3b9245905192', // Zubari1155 ERC-1155 multi-edition\n marketplace: '0xfcEfDa6C73aC357b8695E5F8F8d17820750BF207',\n tips: '0x86a9A306C7fCC9e0B8cd6859f6f15498d0046BB7',\n subscriptions: '0xaB7F17A85F61d9ab9f96bCB4e73e910D019978F7',\n payouts: '0x8aaB23Fb2a83A259E965Aae8Ee0938b1400B7E6b',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdt: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n },\n mainnet: {\n // Ethereum Mainnet (1)\n registry: ZERO_ADDRESS,\n nft: ZERO_ADDRESS,\n nft1155: ZERO_ADDRESS,\n marketplace: ZERO_ADDRESS,\n tips: ZERO_ADDRESS,\n subscriptions: ZERO_ADDRESS,\n payouts: ZERO_ADDRESS,\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS,\n accountFactory: ZERO_ADDRESS,\n usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n // Platform fee in basis points (300 = 3%)\n tipFeeBps: 300,\n // Maximum royalty in basis points (1000 = 10%)\n maxRoyaltyBps: 1000,\n // Default slippage tolerance for swaps (50 = 0.5%)\n defaultSlippageBps: 50,\n // Voucher validity in seconds (30 days)\n voucherValiditySecs: 30 * 24 * 60 * 60,\n // Swap deadline in seconds (30 minutes)\n swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n name: 'ZubariNFT',\n version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n NFTVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// EIP-712 Domain for ERC-1155 edition minting\nexport const EDITION_VOUCHER_DOMAIN = {\n name: 'Zubari1155',\n version: '1',\n} as const;\n\n// EIP-712 Types for EditionVoucher (ERC-1155)\nexport const EDITION_VOUCHER_TYPES = {\n EditionVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'maxSupply', type: 'uint256' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const;\n\n// Currency addresses per network\nexport const CURRENCY_ADDRESSES = {\n testnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n },\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n\n// Multi-chain Fee/Treasury Wallet Addresses\n// These wallets receive platform fees from transactions on their respective chains\nexport interface FeeWalletConfig {\n address: string;\n name: string;\n network: string;\n chainId?: number;\n}\n\nexport type SupportedFeeChain = 'ETH' | 'BTC' | 'SOLANA' | 'TON' | 'TRON';\n\n/**\n * Mainnet Fee Wallet Addresses\n * These are the production treasury wallets for collecting platform fees\n */\nexport const MAINNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum (ETH, ERC-20 tokens like USDT)\n ETH: {\n address: '0x40Df60a57d02a7bB04B6624c65E2908Cc006badE',\n name: 'Zubari ETH Treasury',\n network: 'ethereum',\n chainId: 1,\n },\n // Bitcoin\n BTC: {\n address: 'bc1qh20fx23wk34pcm3zp0v9wctwprtl02uvh6q9qj',\n name: 'Zubari BTC Treasury',\n network: 'bitcoin',\n },\n // Solana (SOL, SPL tokens)\n SOLANA: {\n address: '2hXGumVRpD5KgdqNZUuYJ2YoyLR6jc8mvWbubciWjPuZ',\n name: 'Zubari Solana Treasury',\n network: 'solana',\n },\n // TON (The Open Network)\n TON: {\n address: 'UQB5hOrm9YGoKjrCVmvAUFgmApkvKWqVMROjieKs3z4kDz99',\n name: 'Zubari TON Treasury',\n network: 'ton',\n },\n // Tron (TRX, TRC-20 tokens like USDT)\n TRON: {\n address: 'TVBPjQFNe8JgVctDKWMxJNgjbPZoP6uu5h',\n name: 'Zubari Tron Treasury',\n network: 'tron',\n },\n} as const;\n\n/**\n * Testnet Fee Wallet Addresses\n * These are used for development and testing\n */\nexport const TESTNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum Sepolia\n ETH: {\n address: ZERO_ADDRESS, // Configure via environment\n name: 'Zubari ETH Testnet Treasury',\n network: 'sepolia',\n chainId: 11155111,\n },\n // Bitcoin Testnet\n BTC: {\n address: '',\n name: 'Zubari BTC Testnet Treasury',\n network: 'bitcoin-testnet',\n },\n // Solana Devnet\n SOLANA: {\n address: '',\n name: 'Zubari Solana Devnet Treasury',\n network: 'solana-devnet',\n },\n // TON Testnet\n TON: {\n address: '',\n name: 'Zubari TON Testnet Treasury',\n network: 'ton-testnet',\n },\n // Tron Shasta Testnet\n TRON: {\n address: '',\n name: 'Zubari Tron Testnet Treasury',\n network: 'tron-shasta',\n },\n} as const;\n\n/**\n * Get fee wallet address for a specific chain\n * @param chain - The blockchain network\n * @param isMainnet - Whether to use mainnet addresses (default: false for testnet)\n */\nexport function getFeeWallet(chain: SupportedFeeChain, isMainnet: boolean = false): FeeWalletConfig {\n return isMainnet ? MAINNET_FEE_WALLETS[chain] : TESTNET_FEE_WALLETS[chain];\n}\n\n/**\n * Get all fee wallets for a network type\n * @param isMainnet - Whether to use mainnet addresses\n */\nexport function getAllFeeWallets(isMainnet: boolean = false): Record<SupportedFeeChain, FeeWalletConfig> {\n return isMainnet ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n","/**\n * Zubari API Client\n *\n * Comprehensive client for interacting with the Zubari backend API.\n * Includes NFT, Marketplace, Tips, and Subscription operations.\n */\n\nimport type { NetworkType, NFTCurrency } from '../types';\n\nexport interface ZubariApiConfig {\n baseUrl: string;\n timeout?: number;\n authToken?: string;\n}\n\n// ============ NFT Types ============\n\nexport interface NFTVoucher {\n tokenId: string;\n uri: string;\n creator: string;\n royaltyBps: number;\n deadline: number;\n signature: string;\n price: string;\n currency: string;\n nonce: number;\n contentHash?: string;\n userId?: string;\n watermarkTimestamp?: number;\n sessionId?: string;\n}\n\nexport interface CreateVoucherRequest {\n creatorAddress: string;\n price: string;\n currency: NFTCurrency;\n}\n\nexport interface CreateVoucherResponse {\n success: boolean;\n voucher?: NFTVoucher;\n signature?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface RedeemVoucherRequest {\n buyerAddress: string;\n paymentTxHash?: string;\n}\n\nexport interface RedeemVoucherResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n owner?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface VoucherStatusResponse {\n success: boolean;\n nftId?: string;\n hasVoucher?: boolean;\n isRedeemed?: boolean;\n voucher?: NFTVoucher;\n error?: string;\n}\n\nexport interface NFTResponse {\n id: string;\n tokenId?: string;\n contractAddress?: string;\n name: string;\n description?: string;\n imageUrl?: string;\n animationUrl?: string;\n externalUrl?: string;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n creatorId: string;\n ownerId: string;\n price?: string;\n currency?: string;\n royaltyBps: number;\n isLazyMinted: boolean;\n isMinted: boolean;\n mintedAt?: string;\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateNFTRequest {\n name: string;\n description?: string;\n price: string;\n currency: NFTCurrency;\n royaltyBps?: number;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n externalUrl?: string;\n}\n\nexport interface NFTListResponse {\n success: boolean;\n nfts?: NFTResponse[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\n// ============ Marketplace Types ============\n\nexport interface MarketListing {\n id: string;\n nftId: string;\n nft?: NFTResponse;\n sellerId: string;\n sellerAddress: string;\n price: string;\n currency: string;\n expiresAt: string;\n status: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ListItemRequest {\n nftId: string;\n price: string;\n currency: NFTCurrency;\n duration?: number; // Duration in seconds, default 7 days\n}\n\nexport interface ListItemResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface BuyItemRequest {\n listingId: string;\n buyerAddress: string;\n}\n\nexport interface BuyItemResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n newOwner?: string;\n error?: string;\n}\n\nexport interface CancelListingRequest {\n listingId: string;\n}\n\nexport interface CancelListingResponse {\n success: boolean;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface UpdatePriceRequest {\n listingId: string;\n newPrice: string;\n}\n\nexport interface UpdatePriceResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface ListingsResponse {\n success: boolean;\n listings?: MarketListing[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface MarketStatsResponse {\n success: boolean;\n stats?: {\n totalListings: number;\n activeListings: number;\n totalVolume: string;\n totalSales: number;\n averagePrice: string;\n topSellers: Array<{\n address: string;\n sales: number;\n volume: string;\n }>;\n };\n error?: string;\n}\n\n// ============ Filter Types ============\n\nexport interface NFTFilters {\n creatorId?: string;\n ownerId?: string;\n isLazyMinted?: boolean;\n isMinted?: boolean;\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n page?: number;\n limit?: number;\n}\n\nexport interface ListingFilters {\n sellerId?: string;\n status?: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n sortBy?: 'price' | 'createdAt' | 'expiresAt';\n sortOrder?: 'asc' | 'desc';\n page?: number;\n limit?: number;\n}\n\n// ============ Tips Types ============\n\nexport interface TipUser {\n id: string;\n username?: string;\n displayName?: string;\n avatarUrl?: string;\n}\n\nexport interface Tip {\n id: string;\n senderId: string;\n recipientId?: string;\n senderAddress: string;\n recipientAddress: string;\n tokenAddress?: string;\n amount: string;\n amountUsd?: string;\n platformFee: string;\n message?: string;\n network: string;\n transactionHash?: string;\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n createdAt: string;\n sender?: TipUser;\n recipient?: TipUser;\n}\n\nexport interface SendTipRequest {\n recipientAddress: string;\n recipientUsername?: string;\n amount: string;\n tokenAddress?: string;\n network?: string;\n message?: string;\n transactionHash?: string;\n}\n\nexport interface SendTipResponse {\n success: boolean;\n message?: string;\n tip?: Tip;\n platformFee?: string;\n platformFeeBps?: number;\n error?: string;\n}\n\nexport interface TipStatsResponse {\n success: boolean;\n sent?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n };\n received?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n platformFees: string;\n };\n error?: string;\n}\n\nexport interface TipsListResponse {\n success: boolean;\n tips?: Tip[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n totals?: {\n count: number;\n amount: string;\n amountUsd: string;\n };\n error?: string;\n}\n\nexport interface TipFilters {\n page?: number;\n limit?: number;\n status?: 'PENDING' | 'CONFIRMED' | 'FAILED';\n}\n\nexport interface UpdateTipStatusRequest {\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n transactionHash?: string;\n}\n\n// ============ Subscription Types ============\n\nexport interface SubscriptionPlan {\n id: string;\n creatorId: string;\n name: string;\n description?: string;\n price: string;\n priceUsd?: string;\n paymentToken?: string;\n durationDays: number;\n perks: string[];\n nftBadge: boolean;\n maxSubscribers?: number;\n isActive: boolean;\n activeSubscribers?: number;\n createdAt: string;\n updatedAt: string;\n creator?: TipUser & { isVerified?: boolean };\n}\n\nexport interface Subscription {\n id: string;\n planId: string;\n subscriberId: string;\n creatorId: string;\n subscriberAddress?: string;\n creatorAddress?: string;\n transactionHash?: string;\n amount?: string;\n startDate: string;\n endDate: string;\n expiresAt: string;\n autoRenew: boolean;\n status: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n createdAt: string;\n plan?: Partial<SubscriptionPlan>;\n creator?: TipUser & { isVerified?: boolean };\n subscriber?: TipUser;\n}\n\nexport interface CreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n priceUsd?: number;\n paymentToken?: string;\n durationDays?: number;\n perks?: string[];\n nftBadge?: boolean;\n maxSubscribers?: number;\n}\n\nexport interface CreatePlanResponse {\n success: boolean;\n message?: string;\n plan?: SubscriptionPlan;\n error?: string;\n}\n\nexport interface SubscribeRequest {\n planId: string;\n transactionHash?: string;\n autoRenew?: boolean;\n}\n\nexport interface SubscribeResponse {\n success: boolean;\n message?: string;\n subscription?: Subscription;\n error?: string;\n}\n\nexport interface SubscriptionListResponse {\n success: boolean;\n subscriptions?: Subscription[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n stats?: {\n totalSubscribers: number;\n };\n error?: string;\n}\n\nexport interface SubscriptionFilters {\n page?: number;\n limit?: number;\n status?: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n}\n\nexport interface ContractSubscribeRequest {\n planId: string;\n months?: number;\n seed: string;\n}\n\nexport interface ContractSubscribeResponse {\n success: boolean;\n transactionHash?: string;\n subscription?: Subscription;\n message?: string;\n error?: string;\n}\n\nexport interface ContractCreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n paymentToken?: string;\n durationDays?: number;\n maxSubscribers?: number;\n seed: string;\n}\n\nexport interface ContractCreatePlanResponse {\n success: boolean;\n transactionHash?: string;\n plan?: SubscriptionPlan;\n message?: string;\n error?: string;\n}\n\nexport interface IsSubscribedResponse {\n subscriber: string;\n creator: string;\n isSubscribed: boolean;\n}\n\nexport interface PlatformFeeResponse {\n feeBps: number;\n feePercent: string;\n}\n\n// ============ Payouts Types ============\n\nexport interface EarningsResponse {\n success: boolean;\n address?: string;\n pendingEarnings?: string;\n totalEarnings?: string;\n earningsBreakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n recentPayouts?: Array<{\n id: string;\n amount: string;\n txHash: string;\n createdAt: string;\n }>;\n error?: string;\n}\n\nexport interface ClaimEarningsRequest {\n seed: string;\n}\n\nexport interface ClaimEarningsResponse {\n success: boolean;\n transactionHash?: string;\n amount?: string;\n message?: string;\n error?: string;\n}\n\nexport interface PayoutHistoryResponse {\n success: boolean;\n payouts?: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface EarningsBreakdownResponse {\n success: boolean;\n breakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n total: string;\n };\n percentages?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n error?: string;\n}\n\n/**\n * Zubari API Client for backend integration\n */\nexport class ZubariApiClient {\n private config: Required<Omit<ZubariApiConfig, 'authToken'>> & { authToken?: string };\n\n constructor(config: ZubariApiConfig) {\n this.config = {\n baseUrl: config.baseUrl.replace(/\\/$/, ''), // Remove trailing slash\n timeout: config.timeout || 30000,\n authToken: config.authToken,\n };\n }\n\n /**\n * Set the authentication token\n */\n setAuthToken(token: string): void {\n this.config.authToken = token;\n }\n\n /**\n * Clear the authentication token\n */\n clearAuthToken(): void {\n this.config.authToken = undefined;\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n // ============ NFT Methods ============\n\n /**\n * Get all NFTs with optional filters\n */\n async getNFTs(filters?: NFTFilters): Promise<NFTListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/nfts${queryString ? `?${queryString}` : ''}`;\n return await this.request<NFTListResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFTs',\n };\n }\n }\n\n /**\n * Get a single NFT by ID\n */\n async getNFT(nftId: string): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const nft = await this.request<NFTResponse>('GET', `/api/nfts/${nftId}`);\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFT',\n };\n }\n }\n\n /**\n * Create a new NFT (lazy minted)\n */\n async createNFT(\n data: CreateNFTRequest,\n image: File | Blob\n ): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const formData = new FormData();\n formData.append('image', image);\n formData.append('name', data.name);\n if (data.description) formData.append('description', data.description);\n formData.append('price', data.price);\n formData.append('currency', data.currency);\n if (data.royaltyBps !== undefined) formData.append('royaltyBps', String(data.royaltyBps));\n if (data.attributes) formData.append('attributes', JSON.stringify(data.attributes));\n if (data.externalUrl) formData.append('externalUrl', data.externalUrl);\n\n const headers: Record<string, string> = {};\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}/api/nfts`, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}`);\n }\n\n const nft = await response.json();\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create NFT',\n };\n }\n }\n\n /**\n * Create a voucher for an NFT (EIP-712 signed)\n */\n async createVoucher(nftId: string, params: CreateVoucherRequest): Promise<CreateVoucherResponse> {\n try {\n return await this.request<CreateVoucherResponse>('POST', `/api/nfts/${nftId}/voucher`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create voucher',\n };\n }\n }\n\n /**\n * Redeem an NFT voucher (buy/mint)\n */\n async redeemVoucher(nftId: string, params: RedeemVoucherRequest): Promise<RedeemVoucherResponse> {\n try {\n return await this.request<RedeemVoucherResponse>('POST', `/api/nfts/${nftId}/redeem`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to redeem voucher',\n };\n }\n }\n\n /**\n * Get voucher status for an NFT\n */\n async getVoucherStatus(nftId: string): Promise<VoucherStatusResponse> {\n try {\n return await this.request<VoucherStatusResponse>('GET', `/api/nfts/${nftId}/voucher/status`);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get voucher status',\n };\n }\n }\n\n // ============ Marketplace Methods ============\n\n /**\n * Get all active listings\n */\n async getListings(filters?: ListingFilters): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get listings',\n };\n }\n }\n\n /**\n * List an NFT for sale\n */\n async listItem(params: ListItemRequest): Promise<ListItemResponse> {\n try {\n return await this.request<ListItemResponse>('POST', '/api/market/list', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list item',\n };\n }\n }\n\n /**\n * Buy a listed NFT\n */\n async buyItem(params: BuyItemRequest): Promise<BuyItemResponse> {\n try {\n return await this.request<BuyItemResponse>('POST', '/api/market/buy', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to buy item',\n };\n }\n }\n\n /**\n * Cancel a listing\n */\n async cancelListing(params: CancelListingRequest): Promise<CancelListingResponse> {\n try {\n return await this.request<CancelListingResponse>('POST', '/api/market/cancel', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel listing',\n };\n }\n }\n\n /**\n * Update listing price\n */\n async updateListingPrice(params: UpdatePriceRequest): Promise<UpdatePriceResponse> {\n try {\n return await this.request<UpdatePriceResponse>('PATCH', '/api/market/price', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update price',\n };\n }\n }\n\n /**\n * Get current user's listings\n */\n async getMyListings(filters?: Omit<ListingFilters, 'sellerId'>): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/my/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get my listings',\n };\n }\n }\n\n /**\n * Get marketplace statistics\n */\n async getMarketStats(): Promise<MarketStatsResponse> {\n try {\n return await this.request<MarketStatsResponse>('GET', '/api/market/stats');\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get market stats',\n };\n }\n }\n\n // ============ Tips Methods ============\n\n /**\n * Send a tip to a creator\n */\n async sendTip(params: SendTipRequest): Promise<SendTipResponse> {\n try {\n return await this.request<SendTipResponse>('POST', '/api/tips', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send tip',\n };\n }\n }\n\n /**\n * Get tip statistics for current user\n */\n async getTipStats(): Promise<TipStatsResponse> {\n try {\n const data = await this.request<{\n sent: { count: number; totalAmount: string; totalAmountUsd: string };\n received: { count: number; totalAmount: string; totalAmountUsd: string; platformFees: string };\n }>('GET', '/api/tips/my/stats');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip stats',\n };\n }\n }\n\n /**\n * Get tips sent by current user\n */\n async getSentTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/sent${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get sent tips',\n };\n }\n }\n\n /**\n * Get tips received by current user\n */\n async getReceivedTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/received${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get received tips',\n };\n }\n }\n\n /**\n * Get a single tip by ID\n */\n async getTip(tipId: string): Promise<{ success: boolean; tip?: Tip; error?: string }> {\n try {\n const data = await this.request<{ tip: Tip }>('GET', `/api/tips/${tipId}`);\n return { success: true, tip: data.tip };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip',\n };\n }\n }\n\n /**\n * Update tip status (for transaction confirmation)\n */\n async updateTipStatus(\n tipId: string,\n params: UpdateTipStatusRequest\n ): Promise<{ success: boolean; tip?: Tip; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string; tip: Tip }>(\n 'PATCH',\n `/api/tips/${tipId}/status`,\n params\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update tip status',\n };\n }\n }\n\n // ============ Subscription Methods ============\n\n /**\n * Create a new subscription plan (creator only)\n */\n async createSubscriptionPlan(params: CreatePlanRequest): Promise<CreatePlanResponse> {\n try {\n return await this.request<CreatePlanResponse>('POST', '/api/subscriptions/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create subscription plan',\n };\n }\n }\n\n /**\n * Get current user's subscription plans\n */\n async getMySubscriptionPlans(): Promise<{ success: boolean; plans?: SubscriptionPlan[]; error?: string }> {\n try {\n const data = await this.request<{ plans: SubscriptionPlan[] }>('GET', '/api/subscriptions/plans');\n return { success: true, plans: data.plans };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plans',\n };\n }\n }\n\n /**\n * Get subscription plan by ID\n */\n async getSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; plan?: SubscriptionPlan & { isSubscribed?: boolean }; error?: string }> {\n try {\n const plan = await this.request<SubscriptionPlan & { isSubscribed?: boolean }>(\n 'GET',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, plan };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plan',\n };\n }\n }\n\n /**\n * Delete/deactivate subscription plan\n */\n async deleteSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; message?: string; deactivated?: boolean; error?: string }> {\n try {\n const data = await this.request<{ message: string; deactivated?: boolean }>(\n 'DELETE',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete subscription plan',\n };\n }\n }\n\n /**\n * Subscribe to a plan\n */\n async subscribe(params: SubscribeRequest): Promise<SubscribeResponse> {\n try {\n return await this.request<SubscribeResponse>('POST', '/api/subscriptions/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe',\n };\n }\n }\n\n /**\n * Get current user's subscriptions (as subscriber)\n */\n async getMySubscriptions(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscriptions',\n };\n }\n }\n\n /**\n * Get subscribers to current user's plans (as creator)\n */\n async getMySubscribers(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions/subscribers${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n stats: { totalSubscribers: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscribers',\n };\n }\n }\n\n /**\n * Cancel subscription\n */\n async cancelSubscription(subscriptionId: string): Promise<{ success: boolean; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string }>('DELETE', `/api/subscriptions/${subscriptionId}`);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription',\n };\n }\n }\n\n /**\n * Create a subscription plan on-chain\n */\n async createSubscriptionPlanOnChain(params: ContractCreatePlanRequest): Promise<ContractCreatePlanResponse> {\n try {\n return await this.request<ContractCreatePlanResponse>('POST', '/api/subscriptions/contract/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create plan on-chain',\n };\n }\n }\n\n /**\n * Subscribe to a plan on-chain\n */\n async subscribeOnChain(params: ContractSubscribeRequest): Promise<ContractSubscribeResponse> {\n try {\n return await this.request<ContractSubscribeResponse>('POST', '/api/subscriptions/contract/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe on-chain',\n };\n }\n }\n\n /**\n * Cancel subscription on-chain\n */\n async cancelSubscriptionOnChain(\n subscriptionId: string,\n seed: string\n ): Promise<{ success: boolean; transactionHash?: string; message?: string; error?: string }> {\n try {\n return await this.request<{ success: boolean; transactionHash: string; message: string }>(\n 'POST',\n '/api/subscriptions/contract/cancel',\n { subscriptionId, seed }\n );\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription on-chain',\n };\n }\n }\n\n /**\n * Check if user is subscribed to a creator on-chain\n */\n async isSubscribed(subscriber: string, creator: string): Promise<IsSubscribedResponse> {\n try {\n return await this.request<IsSubscribedResponse>(\n 'GET',\n `/api/subscriptions/contract/is-subscribed?subscriber=${subscriber}&creator=${creator}`\n );\n } catch (error) {\n return {\n subscriber,\n creator,\n isSubscribed: false,\n };\n }\n }\n\n /**\n * Get subscription platform fee\n */\n async getSubscriptionPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/subscriptions/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n\n // ============ Payouts Methods ============\n\n /**\n * Get pending and claimed earnings for the authenticated user\n */\n async getEarnings(): Promise<EarningsResponse> {\n try {\n const data = await this.request<{\n address: string;\n pendingEarnings: string;\n totalEarnings: string;\n earningsBreakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n recentPayouts: Array<{ id: string; amount: string; txHash: string; createdAt: string }>;\n }>('GET', '/api/payouts/earnings');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings',\n };\n }\n }\n\n /**\n * Claim pending earnings\n */\n async claimEarnings(params: ClaimEarningsRequest): Promise<ClaimEarningsResponse> {\n try {\n return await this.request<ClaimEarningsResponse>('POST', '/api/payouts/claim', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to claim earnings',\n };\n }\n }\n\n /**\n * Get payout history for the authenticated user\n */\n async getPayoutHistory(filters?: { page?: number; limit?: number }): Promise<PayoutHistoryResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/payouts/history${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n payouts: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination: { page: number; limit: number; total: number; pages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get payout history',\n };\n }\n }\n\n /**\n * Get earnings breakdown by source\n */\n async getEarningsBreakdown(): Promise<EarningsBreakdownResponse> {\n try {\n const data = await this.request<{\n breakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string; total: string };\n percentages: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n }>('GET', '/api/payouts/breakdown');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings breakdown',\n };\n }\n }\n\n /**\n * Get current platform fee for payouts\n */\n async getPayoutsPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/payouts/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\n// Singleton instance\nlet zubariApiClient: ZubariApiClient | null = null;\n\n/**\n * Get or create the Zubari API client instance\n */\nexport function getZubariApiClient(config?: Partial<ZubariApiConfig>): ZubariApiClient {\n if (!zubariApiClient || (config?.baseUrl && zubariApiClient['config'].baseUrl !== config.baseUrl)) {\n zubariApiClient = new ZubariApiClient({\n baseUrl: config?.baseUrl || DEFAULT_API_URL,\n timeout: config?.timeout,\n authToken: config?.authToken,\n });\n } else if (config?.authToken) {\n zubariApiClient.setAuthToken(config.authToken);\n }\n return zubariApiClient;\n}\n\n/**\n * Create a new Zubari API client instance\n */\nexport function createZubariApiClient(config: ZubariApiConfig): ZubariApiClient {\n return new ZubariApiClient(config);\n}\n","import type {\n NFTMetadata,\n LazyMintVoucher,\n NFT,\n ListingParams,\n TxResult,\n CreateVoucherParams,\n NFTCurrency,\n} from '../types';\nimport {\n PLATFORM_CONFIG,\n NFT_VOUCHER_DOMAIN,\n NFT_VOUCHER_TYPES,\n CURRENCY_ADDRESSES,\n ZERO_ADDRESS,\n} from '../config/contracts';\nimport { getZubariApiClient, ZubariApiClient } from '../services/ZubariApiClient';\n\n/**\n * ZubariNFTProtocol - NFT creation and marketplace operations\n *\n * Handles lazy minting via EIP-712 signatures, NFT listing,\n * and marketplace operations on Ethereum network.\n */\nexport class ZubariNFTProtocol {\n private readonly contractAddress: string;\n private readonly _marketplaceAddress: string;\n private readonly chainId: number;\n private readonly network: 'testnet' | 'mainnet';\n private readonly apiClient: ZubariApiClient;\n private nonceCounter: number = 0;\n\n constructor(\n contractAddress: string,\n marketplaceAddress: string,\n chainId: number,\n network: 'testnet' | 'mainnet' = 'testnet',\n apiUrl?: string\n ) {\n this.contractAddress = contractAddress;\n this._marketplaceAddress = marketplaceAddress;\n this.chainId = chainId;\n this.network = network;\n this.apiClient = getZubariApiClient(apiUrl ? { baseUrl: apiUrl } : undefined);\n }\n\n /**\n * Convert human-readable price to wei\n * @param price - Price in human-readable format (e.g., \"1.5\")\n * @param currency - ETH (18 decimals) or USDT (6 decimals)\n */\n private priceToWei(price: string, currency: NFTCurrency): string {\n const decimals = currency === 'ETH' ? 18 : 6;\n const [whole, fraction = ''] = price.split('.');\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);\n const wei = whole + paddedFraction;\n // Remove leading zeros but keep at least one digit\n return wei.replace(/^0+/, '') || '0';\n }\n\n /**\n * Get currency address for the configured network\n */\n private getCurrencyAddress(currency: NFTCurrency): string {\n return CURRENCY_ADDRESSES[this.network][currency];\n }\n\n /**\n * Generate a unique nonce\n */\n private generateNonce(): number {\n return Date.now() * 1000 + this.nonceCounter++;\n }\n\n /**\n * Pad string to bytes32 format\n */\n private toBytes32(value: string): string {\n if (value.startsWith('0x')) {\n return value.padEnd(66, '0');\n }\n // Convert string to hex and pad\n const hex = Buffer.from(value).toString('hex');\n return '0x' + hex.padEnd(64, '0');\n }\n\n /**\n * Create a lazy mint voucher for off-chain NFT creation\n * The voucher can be redeemed on-chain when purchased\n *\n * @param params - Voucher creation parameters\n * @param signer - Object with signTypedData method (ethers.js wallet or viem client)\n */\n async createLazyMintVoucher(\n params: CreateVoucherParams,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n const { metadata, creatorAddress, price, currency, nonce, watermarking } = params;\n\n // Ensure royaltyBps has a default value (500 = 5%)\n const royaltyBps = metadata.royaltyBps ?? 500;\n\n // Validate royalty\n if (royaltyBps > PLATFORM_CONFIG.maxRoyaltyBps) {\n throw new Error(`Royalty cannot exceed ${PLATFORM_CONFIG.maxRoyaltyBps / 100}%`);\n }\n\n // Validate price\n if (!price || parseFloat(price) <= 0) {\n throw new Error('Price must be greater than 0');\n }\n\n // Generate random tokenId\n const tokenId = this.generateTokenId();\n\n // Calculate deadline (30 days from now)\n const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.voucherValiditySecs;\n\n // Convert price to wei\n const priceInWei = this.priceToWei(price, currency);\n\n // Get currency address\n const currencyAddress = this.getCurrencyAddress(currency);\n\n // Generate or use provided nonce\n const voucherNonce = nonce ?? this.generateNonce();\n\n // Prepare watermarking data (use zero values if not provided)\n const watermarkTimestamp = watermarking ? Math.floor(Date.now() / 1000) : 0;\n const contentHash = watermarking ? this.toBytes32(watermarking.contentHash) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const userId = watermarking ? this.toBytes32(watermarking.userId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const sessionId = watermarking ? this.toBytes32(watermarking.sessionId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n\n // Build voucher data for signing\n const voucherData = {\n tokenId,\n uri: metadata.image, // Will be IPFS URI\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash,\n userId,\n watermarkTimestamp,\n sessionId,\n };\n\n // Create EIP-712 domain\n const domain = {\n ...NFT_VOUCHER_DOMAIN,\n chainId: this.chainId,\n verifyingContract: this.contractAddress,\n };\n\n // Sign the voucher\n const signature = await signer.signTypedData(domain, NFT_VOUCHER_TYPES, voucherData);\n\n return {\n tokenId,\n uri: metadata.image,\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n signature,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash: watermarking ? contentHash : undefined,\n userId: watermarking ? userId : undefined,\n watermarkTimestamp: watermarking ? watermarkTimestamp : undefined,\n sessionId: watermarking ? sessionId : undefined,\n };\n }\n\n /**\n * @deprecated Use createLazyMintVoucher(params, signer) instead\n * Legacy method for backward compatibility\n */\n async createLazyMintVoucherLegacy(\n metadata: NFTMetadata,\n creatorAddress: string,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n // Default to 0.01 ETH for legacy calls\n return this.createLazyMintVoucher(\n {\n metadata,\n creatorAddress,\n price: '0.01',\n currency: 'ETH',\n },\n signer\n );\n }\n\n /**\n * Redeem a lazy mint voucher to mint the NFT on-chain\n * Uses the backend API which handles the on-chain transaction\n */\n async redeemVoucher(\n voucher: LazyMintVoucher,\n buyerAddress: string,\n nftId: string,\n authToken: string\n ): Promise<TxResult> {\n // Validate voucher deadline\n if (voucher.deadline < Math.floor(Date.now() / 1000)) {\n throw new Error('Voucher has expired');\n }\n\n try {\n const result = await this.apiClient.redeemVoucher(nftId, {\n buyerAddress,\n });\n\n if (result.success && result.transactionHash) {\n return {\n hash: result.transactionHash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n nftId: result.nftId,\n tokenId: voucher.tokenId,\n buyer: buyerAddress,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to redeem voucher');\n } catch (error) {\n console.error('Failed to redeem voucher:', error);\n throw new Error(`Voucher redemption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List an NFT for sale on the marketplace via backend API\n */\n async listForSale(params: ListingParams, authToken: string): Promise<TxResult> {\n try {\n // Map paymentToken to currency\n const currency: NFTCurrency = params.paymentToken === ZERO_ADDRESS ? 'ETH' : 'USDT';\n\n const result = await this.apiClient.listItem({\n nftId: params.tokenId, // Using tokenId as nftId\n price: params.price.toString(),\n currency,\n duration: params.duration || 30 * 24 * 60 * 60, // 30 days default\n });\n\n if (result.success && result.listing) {\n return {\n hash: result.listing.id || '',\n network: 'ethereum',\n status: 'pending',\n metadata: {\n listingId: result.listing.id,\n price: params.price.toString(),\n tokenId: params.tokenId,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to list NFT');\n } catch (error) {\n console.error('Failed to list NFT:', error);\n throw new Error(`Listing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Buy an NFT from the marketplace via backend API\n */\n async buyNFT(listingId: string, price: bigint, buyerAddress: string): Promise<TxResult> {\n try {\n const result = await this.apiClient.buyItem({\n listingId,\n buyerAddress,\n });\n\n if (result.success && result.transactionHash) {\n return {\n hash: result.transactionHash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n listingId,\n price: price.toString(),\n buyer: buyerAddress,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to buy NFT');\n } catch (error) {\n console.error('Failed to buy NFT:', error);\n throw new Error(`Purchase failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Transfer an NFT to another address\n * Note: This requires direct contract interaction via wallet\n */\n async transfer(\n tokenId: string,\n to: string,\n from: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n // Build transfer transaction data\n // ERC721 transferFrom(address from, address to, uint256 tokenId)\n const functionSelector = '0x23b872dd'; // transferFrom selector\n const encodedFrom = from.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTo = to.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');\n\n const data = `${functionSelector}${encodedFrom}${encodedTo}${encodedTokenId}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n tokenId,\n from,\n to,\n },\n };\n } catch (error) {\n console.error('Failed to transfer NFT:', error);\n throw new Error(`Transfer failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get NFTs owned by an address via backend API\n */\n async getOwnedNFTs(address: string): Promise<NFT[]> {\n try {\n const result = await this.apiClient.getNFTs({ ownerId: address });\n\n if (result.success && result.nfts) {\n return result.nfts.map(nft => ({\n tokenId: nft.tokenId || nft.id,\n contractAddress: nft.contractAddress || this.contractAddress,\n owner: nft.ownerId || address,\n creator: nft.creatorId || '',\n uri: nft.imageUrl || nft.animationUrl || '',\n metadata: nft.name ? {\n name: nft.name,\n description: nft.description || '',\n image: nft.imageUrl || '',\n royaltyBps: 0, // Default royalty, actual value from contract\n } : undefined,\n isLazyMinted: !nft.tokenId, // If no tokenId, it's lazy minted\n }));\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get owned NFTs:', error);\n return [];\n }\n }\n\n /**\n * Generate a random tokenId (32 bytes hex)\n */\n private generateTokenId(): string {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InsufficientPayment\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidPrice\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingExpired\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotApproved\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSeller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotTokenOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"UnsupportedPaymentToken\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Listed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"PaymentTokenUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"buyer\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"royaltyAmount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Sale\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"buyItem\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"cancelListing\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getListing\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariMarket.Listing\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"isListingValid\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"duration\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listItem\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"listingCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setSupportedToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"supportedTokens\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tokenListings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"updatePrice\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type {\n ListingParams,\n Listing,\n BuyParams,\n TxResult,\n} from '../types';\nimport { PLATFORM_CONFIG } from '../config/contracts';\n\n// Import ABI\nimport ZubariMarketAbi from '../abi/ZubariMarket.json';\n\n/**\n * ZubariMarketProtocol - NFT Marketplace operations\n *\n * Handles NFT listings, purchases, and marketplace management\n * with support for ETH and ERC-20 payment tokens.\n */\nexport class ZubariMarketProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariMarketAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * List an NFT for sale\n * @param params Listing parameters\n * @param signer Wallet signer with sendTransaction method\n */\n async listItem(\n params: ListingParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n // Validate price\n if (params.price <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n // Validate duration\n if (params.duration <= 0) {\n throw new Error('Duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('listItem', [\n params.nftContract,\n params.tokenId,\n params.price,\n params.paymentToken,\n params.duration,\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Buy an NFT from a listing\n * @param params Buy parameters\n * @param signer Wallet signer\n */\n async buyItem(\n params: BuyParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('buyItem', [params.listingId]);\n\n // If paying with ETH (zero address), include value\n const isEthPayment = params.paymentToken === '0x0000000000000000000000000000000000000000';\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: isEthPayment ? params.price : 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel a listing\n * @param listingId The listing ID to cancel\n * @param signer Wallet signer\n */\n async cancelListing(\n listingId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancelListing', [listingId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Update listing price\n * @param listingId The listing ID\n * @param newPrice New price\n * @param signer Wallet signer\n */\n async updatePrice(\n listingId: string,\n newPrice: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (newPrice <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('updatePrice', [listingId, newPrice]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get listing details\n * @param listingId The listing ID\n * @param provider JSON-RPC provider\n */\n async getListing(\n listingId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Listing | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getListing', [listingId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getListing', result);\n const listing = decoded[0];\n\n return {\n listingId,\n nftContract: listing.nftContract,\n tokenId: listing.tokenId.toString(),\n seller: listing.seller,\n price: listing.price,\n paymentToken: listing.paymentToken,\n expiresAt: Number(listing.expiresAt),\n isActive: listing.isActive,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a payment token is supported\n * @param token Token address\n * @param provider JSON-RPC provider\n */\n async isTokenSupported(\n token: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('supportedTokens', [token]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('supportedTokens', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate platform fee for a given price\n * @param price The sale price\n */\n calculateFee(price: bigint): { fee: bigint; sellerAmount: bigint } {\n const fee = (price * BigInt(PLATFORM_CONFIG.tipFeeBps)) / 10000n;\n return {\n fee,\n sellerAmount: price - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidRecipient\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256[]\",\n \"name\": \"tipIds\",\n \"type\": \"uint256[]\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"BatchTipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"oldFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlatformFeeUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"TipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"oldTreasury\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newTreasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TreasuryUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getTip\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ZubariTips.Tip\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"recipients\",\n \"type\": \"address[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"amounts\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"string[]\",\n \"name\": \"messages\",\n \"type\": \"string[]\"\n }\n ],\n \"name\": \"sendBatchTips\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"tipCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipETH\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tips\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"totalTipsReceived\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { Tip, TxResult } from '../types';\n\n// Import ABI\nimport ZubariTipsAbi from '../abi/ZubariTips.json';\n\n/**\n * ZubariTipsProtocol - Micropayment tips for creators\n *\n * Handles ETH and ERC-20 token tips with platform fee distribution.\n * Supports individual tips, batch tips, and tip queries.\n */\nexport class ZubariTipsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariTipsAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Send ETH tip to a creator\n * @param recipient The recipient address\n * @param message Optional tip message\n * @param signer Wallet signer with sendTransaction method\n * @param value ETH amount to tip (in wei)\n */\n async tipETH(\n recipient: string,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (value <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipETH', [recipient, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send ERC-20 token tip to a creator\n * @param recipient The recipient address\n * @param token The ERC-20 token address\n * @param amount The amount of tokens to tip\n * @param message Optional tip message\n * @param signer Wallet signer\n */\n async tipToken(\n recipient: string,\n token: string,\n amount: bigint,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (!token || token === '0x0000000000000000000000000000000000000000') {\n throw new Error('Use tipETH for native ETH tips');\n }\n if (amount <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipToken', [recipient, token, amount, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send batch tips to multiple creators in a single transaction\n * @param recipients Array of recipient addresses\n * @param amounts Array of tip amounts (in wei)\n * @param messages Array of tip messages\n * @param signer Wallet signer\n * @param value Total ETH to send\n */\n async sendBatchTips(\n recipients: string[],\n amounts: bigint[],\n messages: string[],\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (recipients.length === 0) {\n throw new Error('At least one recipient is required');\n }\n if (recipients.length !== amounts.length || recipients.length !== messages.length) {\n throw new Error('Recipients, amounts, and messages arrays must have the same length');\n }\n\n // Validate all recipients\n for (const recipient of recipients) {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address in batch');\n }\n }\n\n // Calculate total amount\n const totalAmount = amounts.reduce((sum, amount) => sum + amount, 0n);\n if (totalAmount <= 0n) {\n throw new Error('Total tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('sendBatchTips', [recipients, amounts, messages]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get tip details by ID\n * @param tipId The tip ID\n * @param provider JSON-RPC provider\n */\n async getTip(\n tipId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Tip | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getTip', [tipId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getTip', result);\n const tip = decoded[0];\n\n // Check if tip exists (tipId != 0)\n if (BigInt(tip.tipId) === 0n) {\n return null;\n }\n\n return {\n tipId: tip.tipId.toString(),\n sender: tip.sender,\n recipient: tip.recipient,\n token: tip.token,\n amount: BigInt(tip.amount),\n platformFee: BigInt(tip.platformFee),\n message: tip.message,\n timestamp: Number(tip.timestamp),\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get total tips received by an address\n * @param address The address to query\n * @param provider JSON-RPC provider\n */\n async getTotalTipsReceived(\n address: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('totalTipsReceived', [address]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('totalTipsReceived', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Get current tip counter\n * @param provider JSON-RPC provider\n */\n async getTipCounter(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipCounter', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('tipCounter', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get treasury address\n * @param provider JSON-RPC provider\n */\n async getTreasury(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('treasury', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('treasury', result);\n return decoded[0];\n } catch {\n return '0x0000000000000000000000000000000000000000';\n }\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The tip amount\n * @param feeBps Fee in basis points (default: 300 = 3%)\n */\n calculateFee(amount: bigint, feeBps: number = 300): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"AlreadySubscribed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSubscriber\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanFull\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotFound\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlanCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanDeactivated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Subscribed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"SubscriptionCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newEndTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"SubscriptionRenewed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"activeSubscription\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"cancel\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"createPlan\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"creatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"deactivatePlan\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getCreatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPlan\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.SubscriptionPlan\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getSubscription\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.Subscription\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isSubscribed\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"plans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setAutoRenew\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"months\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscribe\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriberSubscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"subscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { SubscriptionPlan, Subscription, TxResult } from '../types';\n\n// Import ABI\nimport ZubariSubscriptionAbi from '../abi/ZubariSubscription.json';\n\n// Subscription status enum matching the contract\nenum SubscriptionStatus {\n Active = 0,\n Cancelled = 1,\n Expired = 2,\n}\n\n/**\n * ZubariSubscriptionProtocol - Recurring subscription payments\n *\n * Handles subscription plan creation, subscription management,\n * and verification of active subscriptions using the ZubariSubscription smart contract.\n */\nexport class ZubariSubscriptionProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariSubscriptionAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Create a new subscription plan\n * @param plan The plan details\n * @param signer Wallet signer with sendTransaction method\n */\n async createPlan(\n plan: SubscriptionPlan,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<string> {\n // Validate plan\n if (!plan.name || plan.name.length === 0) {\n throw new Error('Plan name is required');\n }\n if (plan.price <= 0n) {\n throw new Error('Plan price must be greater than 0');\n }\n if (plan.duration <= 0) {\n throw new Error('Plan duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n\n // Convert duration from seconds to days (contract expects days)\n const durationDays = Math.ceil(plan.duration / (24 * 60 * 60));\n\n const data = iface.encodeFunctionData('createPlan', [\n plan.name,\n plan.description || '',\n plan.price,\n plan.paymentToken || '0x0000000000000000000000000000000000000000', // ETH by default\n durationDays,\n plan.maxSubscribers || 0, // 0 = unlimited\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n // Return tx hash - the planId will be emitted in the event\n return result.hash;\n }\n\n /**\n * Deactivate a subscription plan (only creator can do this)\n * @param planId The plan ID to deactivate\n * @param signer Wallet signer\n */\n async deactivatePlan(\n planId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('deactivatePlan', [planId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Subscribe to a creator's plan\n * @param planId The plan ID to subscribe to\n * @param months Number of months to subscribe\n * @param signer Wallet signer\n * @param value ETH value to send (if paying with ETH)\n */\n async subscribe(\n planId: string,\n months: number,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value?: bigint\n ): Promise<TxResult> {\n if (months <= 0) {\n throw new Error('Subscription duration must be at least 1 month');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('subscribe', [planId, months]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: value || 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel an active subscription\n * @param subscriptionId The subscription ID to cancel\n * @param signer Wallet signer\n */\n async cancel(\n subscriptionId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancel', [subscriptionId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Set auto-renew for a subscription\n * @param subscriptionId The subscription ID\n * @param autoRenew Whether to enable auto-renew\n * @param signer Wallet signer\n */\n async setAutoRenew(\n subscriptionId: string,\n autoRenew: boolean,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('setAutoRenew', [subscriptionId, autoRenew]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Check if an address is subscribed to a creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async isSubscribed(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('isSubscribed', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('isSubscribed', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Get the active subscription ID between subscriber and creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getActiveSubscriptionId(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('activeSubscription', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('activeSubscription', result);\n const subscriptionId = decoded[0];\n\n // bytes32(0) means no active subscription\n if (subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n return subscriptionId;\n } catch {\n return null;\n }\n }\n\n /**\n * Get subscription details by ID\n * @param subscriptionId The subscription ID\n * @param provider JSON-RPC provider\n */\n async getSubscription(\n subscriptionId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Subscription | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getSubscription', [subscriptionId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getSubscription', result);\n const sub = decoded[0];\n\n // Check if subscription exists (subscriptionId != 0)\n if (sub.subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Map status enum\n let status: 'active' | 'cancelled' | 'expired';\n switch (Number(sub.status)) {\n case SubscriptionStatus.Active:\n status = 'active';\n break;\n case SubscriptionStatus.Cancelled:\n status = 'cancelled';\n break;\n case SubscriptionStatus.Expired:\n status = 'expired';\n break;\n default:\n status = 'active';\n }\n\n return {\n subscriptionId: sub.subscriptionId,\n planId: sub.planId,\n creator: sub.creator,\n subscriber: sub.subscriber,\n startTime: Number(sub.startTime),\n endTime: Number(sub.endTime),\n autoRenew: sub.autoRenew,\n status,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get a specific plan by ID\n * @param planId The plan ID\n * @param provider JSON-RPC provider\n */\n async getPlan(\n planId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getPlan', [planId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getPlan', result);\n const plan = decoded[0];\n\n // Check if plan exists (planId != 0)\n if (plan.planId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Convert duration from days to seconds\n const durationSeconds = Number(plan.durationDays) * 24 * 60 * 60;\n\n return {\n planId: plan.planId,\n name: plan.name,\n description: plan.description,\n price: plan.price,\n paymentToken: plan.paymentToken,\n duration: durationSeconds,\n perks: [], // Not stored on-chain\n maxSubscribers: Number(plan.maxSubscribers),\n nftBadge: false, // Not stored on-chain in this contract version\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get all plan IDs for a creator\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlanIds(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string[]> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getCreatorPlans', [creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getCreatorPlans', result);\n return decoded[0] as string[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get all plans for a creator with full details\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlans(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan[]> {\n const planIds = await this.getCreatorPlanIds(creator, provider);\n const plans: SubscriptionPlan[] = [];\n\n for (const planId of planIds) {\n const plan = await this.getPlan(planId, provider);\n if (plan && plan.planId) {\n plans.push(plan);\n }\n }\n\n return plans;\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Calculate the total cost for a subscription\n * @param planPrice The plan price per period\n * @param months Number of months\n */\n calculateSubscriptionCost(planPrice: bigint, months: number): bigint {\n return planPrice * BigInt(months);\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The amount\n * @param feeBps Fee in basis points\n */\n calculateFee(amount: bigint, feeBps: number = 300): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","import type {\n EarningsBreakdown,\n EarningsResponse,\n PayoutHistoryResponse,\n BreakdownResponse,\n PlatformFeeResponse,\n ClaimResult,\n RevenueSplit,\n TxResult,\n} from '../types';\nimport { getZubariApiClient, ZubariApiClient } from '../services/ZubariApiClient';\n\n// ZubariPayouts contract function selectors\nconst PAYOUTS_SELECTORS = {\n getEarningsBreakdown: '0xd4e9329c', // getEarningsBreakdown(address)\n claimEarnings: '0x48c54b9d', // claimEarnings(address)\n claimPartialEarnings: '0x7e3bfb5a', // claimPartialEarnings(address,uint256)\n setRevenueSplit: '0x92a8e3f5', // setRevenueSplit((address,uint256)[])\n getRevenueSplit: '0x6c8a4fd0', // getRevenueSplit(address)\n removeRevenueSplit: '0x8a4e3c5b', // removeRevenueSplit()\n};\n\n/**\n * ZubariPayoutsProtocol - Creator earnings management\n *\n * Handles earnings tracking, claiming, revenue splits,\n * and conversion to stablecoins.\n */\nexport class ZubariPayoutsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly apiBaseUrl: string;\n private readonly apiClient: ZubariApiClient;\n\n constructor(contractAddress: string, chainId: number, apiBaseUrl?: string) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n this.apiBaseUrl = apiBaseUrl || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n this.apiClient = getZubariApiClient({ baseUrl: this.apiBaseUrl });\n }\n\n /**\n * Get pending earnings breakdown for the current user via API\n * Uses backend API which reads from contract/database\n */\n async getPendingEarnings(authToken: string): Promise<EarningsBreakdown> {\n try {\n const response = await this.apiClient.getEarnings();\n\n if (response.success && response.earningsBreakdown) {\n const breakdown = response.earningsBreakdown;\n return {\n tips: BigInt(breakdown.tips || '0'),\n subscriptions: BigInt(breakdown.subscriptions || '0'),\n nftSales: BigInt(breakdown.nftSales || '0'),\n royalties: BigInt(breakdown.royalties || '0'),\n total: BigInt(breakdown.tips || '0') +\n BigInt(breakdown.subscriptions || '0') +\n BigInt(breakdown.nftSales || '0') +\n BigInt(breakdown.royalties || '0'),\n };\n }\n\n return {\n tips: BigInt(0),\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(0),\n };\n } catch (error) {\n console.error('Failed to get pending earnings:', error);\n return {\n tips: BigInt(0),\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(0),\n };\n }\n }\n\n /**\n * Get earnings data from API (includes pending, total, breakdown, and recent payouts)\n * Requires authentication token\n */\n async getEarnings(authToken: string): Promise<EarningsResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/earnings`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings');\n }\n\n return response.json();\n }\n\n /**\n * Get payout history with pagination\n * Requires authentication token\n */\n async getPayoutHistory(\n authToken: string,\n page: number = 1,\n limit: number = 20\n ): Promise<PayoutHistoryResponse> {\n const response = await fetch(\n `${this.apiBaseUrl}/api/payouts/history?page=${page}&limit=${limit}`,\n {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch payout history');\n }\n\n return response.json();\n }\n\n /**\n * Get earnings breakdown by source with percentages\n * Requires authentication token\n */\n async getBreakdown(authToken: string): Promise<BreakdownResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/breakdown`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings breakdown');\n }\n\n return response.json();\n }\n\n /**\n * Get current platform fee\n */\n async getPlatformFee(): Promise<PlatformFeeResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/platform-fee`, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch platform fee');\n }\n\n return response.json();\n }\n\n /**\n * Get historical earnings for a time period via API\n */\n async getEarningsHistory(\n authToken: string,\n period: 'day' | 'week' | 'month' | 'all' = 'all'\n ): Promise<EarningsBreakdown[]> {\n try {\n const response = await this.apiClient.getPayoutHistory({\n limit: period === 'day' ? 24 : period === 'week' ? 7 : period === 'month' ? 30 : 100,\n });\n\n if (response.success && response.payouts) {\n // Convert payout history to earnings breakdown format\n return response.payouts.map(payout => ({\n tips: BigInt(0), // Individual payouts don't have breakdown\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(payout.amount || '0'),\n timestamp: payout.createdAt,\n status: payout.status,\n }));\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get earnings history:', error);\n return [];\n }\n }\n\n /**\n * Claim all pending earnings via API\n * Requires authentication token and seed phrase\n */\n async claimEarningsViaApi(authToken: string, seed: string): Promise<ClaimResult> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/claim`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to claim earnings');\n }\n\n return response.json();\n }\n\n /**\n * Claim all pending earnings (direct contract call)\n * Requires a signer with sendTransaction capability\n */\n async claimEarnings(\n tokenAddress: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n // Encode claimEarnings(address token) call\n const encodedToken = tokenAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const data = `${PAYOUTS_SELECTORS.claimEarnings}${encodedToken}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { token: tokenAddress },\n };\n } catch (error) {\n console.error('Failed to claim earnings:', error);\n throw new Error(`Claim failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Claim specific amount of earnings\n * Requires a signer with sendTransaction capability\n */\n async claimPartialEarnings(\n tokenAddress: string,\n amount: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n try {\n // Encode claimPartialEarnings(address token, uint256 amount) call\n const encodedToken = tokenAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedAmount = amount.toString(16).padStart(64, '0');\n const data = `${PAYOUTS_SELECTORS.claimPartialEarnings}${encodedToken}${encodedAmount}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { token: tokenAddress, amount: amount.toString() },\n };\n } catch (error) {\n console.error('Failed to claim partial earnings:', error);\n throw new Error(`Partial claim failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Setup revenue split with collaborators\n * Basis points must sum to 10000 (100%)\n * Requires a signer with sendTransaction capability\n */\n async setupRevenueSplit(\n splits: RevenueSplit[],\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n // Validate that basis points sum to 100%\n const totalBps = splits.reduce((sum, split) => sum + split.basisPoints, 0);\n if (totalBps !== 10000) {\n throw new Error('Revenue splits must sum to 100% (10000 basis points)');\n }\n\n // Validate each split\n for (const split of splits) {\n if (split.basisPoints <= 0) {\n throw new Error('Each split must have positive basis points');\n }\n if (!split.recipient || split.recipient.length === 0) {\n throw new Error('Each split must have a valid recipient address');\n }\n }\n\n try {\n // Encode setRevenueSplit((address,uint256)[]) call\n // ABI encode the array of structs\n const offset = '0'.padStart(64, '0').slice(-64); // Offset to array data (32 bytes = 0x20)\n const arrayLength = splits.length.toString(16).padStart(64, '0');\n\n let encodedSplits = '';\n for (const split of splits) {\n const encodedRecipient = split.recipient.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedBps = split.basisPoints.toString(16).padStart(64, '0');\n encodedSplits += encodedRecipient + encodedBps;\n }\n\n const data = `${PAYOUTS_SELECTORS.setRevenueSplit}${'0000000000000000000000000000000000000000000000000000000000000020'}${arrayLength}${encodedSplits}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { splits },\n };\n } catch (error) {\n console.error('Failed to setup revenue split:', error);\n throw new Error(`Revenue split setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get current revenue split configuration via API\n */\n async getRevenueSplit(creatorAddress: string): Promise<RevenueSplit[]> {\n try {\n // Use API to get revenue split configuration\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/revenue-split/${creatorAddress}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.splits) {\n return data.splits;\n }\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get revenue split:', error);\n return [];\n }\n }\n\n /**\n * Remove revenue split (creator gets 100%)\n * Requires a signer with sendTransaction capability\n */\n async removeRevenueSplit(\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n const data = PAYOUTS_SELECTORS.removeRevenueSplit;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n };\n } catch (error) {\n console.error('Failed to remove revenue split:', error);\n throw new Error(`Remove revenue split failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Convert earnings to stablecoin (USDT) via swap\n * This will be implemented when SwapService is complete\n */\n async convertToStable(\n token: string,\n amount: bigint,\n swapService?: { executeSwap: (params: object) => Promise<TxResult> }\n ): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n if (!swapService) {\n throw new Error('SwapService required for conversion. Import and pass SwapService instance.');\n }\n\n try {\n // Delegate to SwapService for the actual swap\n return await swapService.executeSwap({\n tokenIn: token,\n tokenOut: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT mainnet\n amountIn: amount,\n slippageBps: 50, // 0.5% slippage\n });\n } catch (error) {\n console.error('Failed to convert to stable:', error);\n throw new Error(`Conversion failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get the contract address\n */\n getContractAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Get the chain ID\n */\n getChainId(): number {\n return this.chainId;\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/config/contracts.ts","../../src/services/ZubariApiClient.ts","../../src/protocols/NFTProtocol.ts","../../src/abi/ZubariMarket.json","../../src/protocols/MarketProtocol.ts","../../src/abi/ZubariTips.json","../../src/protocols/TipsProtocol.ts","../../src/abi/ZubariSubscription.json","../../src/protocols/SubscriptionProtocol.ts","../../src/protocols/PayoutsProtocol.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Contract addresses for Zubari ecosystem\nexport interface ContractAddresses {\n registry: string;\n nft: string;\n nft1155: string; // ERC-1155 multi-edition NFT\n marketplace: string;\n tips: string;\n subscriptions: string;\n payouts: string;\n entryPoint: string;\n paymaster: string;\n accountFactory: string;\n usdt: string;\n weth: string;\n}\n\n// Zero address for ETH payments and placeholder addresses\nexport const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport const ZUBARI_CONTRACTS: Record<'testnet' | 'mainnet', ContractAddresses> = {\n testnet: {\n // Ethereum Sepolia (11155111) - Deployed 2024-12-31\n registry: '0xe5CE1Eb986f58BE42EEDFe5C18ee5956803b2BDC',\n nft: '0xc165b8C6843e8f0B1489525D0f853d23f22c677B', // ZubariNFT ERC-721 with payment\n nft1155: '0x5e618B5bEaE1dc41369E7aa235Cc3b9245905192', // Zubari1155 ERC-1155 multi-edition\n marketplace: '0xfcEfDa6C73aC357b8695E5F8F8d17820750BF207',\n tips: '0x86a9A306C7fCC9e0B8cd6859f6f15498d0046BB7',\n subscriptions: '0xaB7F17A85F61d9ab9f96bCB4e73e910D019978F7',\n payouts: '0x8aaB23Fb2a83A259E965Aae8Ee0938b1400B7E6b',\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS, // Deploy with: npx hardhat run deploy/deploy.ts --network ethereum-sepolia\n accountFactory: ZERO_ADDRESS, // Not yet deployed\n usdt: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n weth: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14',\n },\n mainnet: {\n // Ethereum Mainnet (1)\n registry: ZERO_ADDRESS,\n nft: ZERO_ADDRESS,\n nft1155: ZERO_ADDRESS,\n marketplace: ZERO_ADDRESS,\n tips: ZERO_ADDRESS,\n subscriptions: ZERO_ADDRESS,\n payouts: ZERO_ADDRESS,\n entryPoint: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789',\n paymaster: ZERO_ADDRESS,\n accountFactory: ZERO_ADDRESS,\n usdt: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n weth: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n },\n};\n\n// Platform configuration\nexport const PLATFORM_CONFIG = {\n // Platform fee in basis points (1000 = 10%)\n // Zubari keeps 10%, Creator receives 90%\n platformFeeBps: 1000,\n tipFeeBps: 1000, // Alias for backward compatibility\n // Maximum royalty in basis points (1000 = 10%)\n maxRoyaltyBps: 1000,\n // Default slippage tolerance for swaps (50 = 0.5%)\n defaultSlippageBps: 50,\n // Voucher validity in seconds (30 days)\n voucherValiditySecs: 30 * 24 * 60 * 60,\n // Swap deadline in seconds (30 minutes)\n swapDeadlineSecs: 30 * 60,\n} as const;\n\n// EIP-712 Domain for lazy minting\nexport const NFT_VOUCHER_DOMAIN = {\n name: 'ZubariNFT',\n version: '1',\n} as const;\n\nexport const NFT_VOUCHER_TYPES = {\n NFTVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n // Pricing fields\n { name: 'price', type: 'uint256' },\n { name: 'currency', type: 'address' },\n { name: 'nonce', type: 'uint256' },\n // Watermarking fields\n { name: 'contentHash', type: 'bytes32' },\n { name: 'userId', type: 'bytes32' },\n { name: 'watermarkTimestamp', type: 'uint256' },\n { name: 'sessionId', type: 'bytes32' },\n ],\n} as const;\n\n// EIP-712 Domain for ERC-1155 edition minting\nexport const EDITION_VOUCHER_DOMAIN = {\n name: 'Zubari1155',\n version: '1',\n} as const;\n\n// EIP-712 Types for EditionVoucher (ERC-1155)\nexport const EDITION_VOUCHER_TYPES = {\n EditionVoucher: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'uri', type: 'string' },\n { name: 'creator', type: 'address' },\n { name: 'maxSupply', type: 'uint256' },\n { name: 'royaltyBps', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n ],\n} as const;\n\n// Currency addresses per network\nexport const CURRENCY_ADDRESSES = {\n testnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0', // USDT on Sepolia\n },\n mainnet: {\n ETH: ZERO_ADDRESS,\n USDT: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT on Ethereum\n },\n} as const;\n\nexport function getContractAddresses(network: 'testnet' | 'mainnet'): ContractAddresses {\n return ZUBARI_CONTRACTS[network];\n}\n\n// Multi-chain Fee/Treasury Wallet Addresses\n// These wallets receive platform fees from transactions on their respective chains\nexport interface FeeWalletConfig {\n address: string;\n name: string;\n network: string;\n chainId?: number;\n}\n\nexport type SupportedFeeChain = 'ETH' | 'BTC' | 'SOLANA' | 'TON' | 'TRON';\n\n/**\n * Mainnet Fee Wallet Addresses\n * These are the production treasury wallets for collecting platform fees\n */\nexport const MAINNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum (ETH, ERC-20 tokens like USDT)\n ETH: {\n address: '0x40Df60a57d02a7bB04B6624c65E2908Cc006badE',\n name: 'Zubari ETH Treasury',\n network: 'ethereum',\n chainId: 1,\n },\n // Bitcoin\n BTC: {\n address: 'bc1qh20fx23wk34pcm3zp0v9wctwprtl02uvh6q9qj',\n name: 'Zubari BTC Treasury',\n network: 'bitcoin',\n },\n // Solana (SOL, SPL tokens)\n SOLANA: {\n address: '2hXGumVRpD5KgdqNZUuYJ2YoyLR6jc8mvWbubciWjPuZ',\n name: 'Zubari Solana Treasury',\n network: 'solana',\n },\n // TON (The Open Network)\n TON: {\n address: 'UQB5hOrm9YGoKjrCVmvAUFgmApkvKWqVMROjieKs3z4kDz99',\n name: 'Zubari TON Treasury',\n network: 'ton',\n },\n // Tron (TRX, TRC-20 tokens like USDT)\n TRON: {\n address: 'TVBPjQFNe8JgVctDKWMxJNgjbPZoP6uu5h',\n name: 'Zubari Tron Treasury',\n network: 'tron',\n },\n} as const;\n\n/**\n * Testnet Fee Wallet Addresses\n * These are used for development and testing\n */\nexport const TESTNET_FEE_WALLETS: Record<SupportedFeeChain, FeeWalletConfig> = {\n // Ethereum Sepolia\n ETH: {\n address: ZERO_ADDRESS, // Configure via environment\n name: 'Zubari ETH Testnet Treasury',\n network: 'sepolia',\n chainId: 11155111,\n },\n // Bitcoin Testnet\n BTC: {\n address: '',\n name: 'Zubari BTC Testnet Treasury',\n network: 'bitcoin-testnet',\n },\n // Solana Devnet\n SOLANA: {\n address: '',\n name: 'Zubari Solana Devnet Treasury',\n network: 'solana-devnet',\n },\n // TON Testnet\n TON: {\n address: '',\n name: 'Zubari TON Testnet Treasury',\n network: 'ton-testnet',\n },\n // Tron Shasta Testnet\n TRON: {\n address: '',\n name: 'Zubari Tron Testnet Treasury',\n network: 'tron-shasta',\n },\n} as const;\n\n/**\n * Get fee wallet address for a specific chain\n * @param chain - The blockchain network\n * @param isMainnet - Whether to use mainnet addresses (default: false for testnet)\n */\nexport function getFeeWallet(chain: SupportedFeeChain, isMainnet: boolean = false): FeeWalletConfig {\n return isMainnet ? MAINNET_FEE_WALLETS[chain] : TESTNET_FEE_WALLETS[chain];\n}\n\n/**\n * Get all fee wallets for a network type\n * @param isMainnet - Whether to use mainnet addresses\n */\nexport function getAllFeeWallets(isMainnet: boolean = false): Record<SupportedFeeChain, FeeWalletConfig> {\n return isMainnet ? MAINNET_FEE_WALLETS : TESTNET_FEE_WALLETS;\n}\n","/**\n * Zubari API Client\n *\n * Comprehensive client for interacting with the Zubari backend API.\n * Includes NFT, Marketplace, Tips, and Subscription operations.\n */\n\nimport type { NetworkType, NFTCurrency } from '../types';\n\nexport interface ZubariApiConfig {\n baseUrl: string;\n timeout?: number;\n authToken?: string;\n}\n\n// ============ NFT Types ============\n\nexport interface NFTVoucher {\n tokenId: string;\n uri: string;\n creator: string;\n royaltyBps: number;\n deadline: number;\n signature: string;\n price: string;\n currency: string;\n nonce: number;\n contentHash?: string;\n userId?: string;\n watermarkTimestamp?: number;\n sessionId?: string;\n}\n\nexport interface CreateVoucherRequest {\n creatorAddress: string;\n price: string;\n currency: NFTCurrency;\n}\n\nexport interface CreateVoucherResponse {\n success: boolean;\n voucher?: NFTVoucher;\n signature?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface RedeemVoucherRequest {\n buyerAddress: string;\n paymentTxHash?: string;\n}\n\nexport interface RedeemVoucherResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n owner?: string;\n nftId?: string;\n error?: string;\n}\n\nexport interface VoucherStatusResponse {\n success: boolean;\n nftId?: string;\n hasVoucher?: boolean;\n isRedeemed?: boolean;\n voucher?: NFTVoucher;\n error?: string;\n}\n\nexport interface NFTResponse {\n id: string;\n tokenId?: string;\n contractAddress?: string;\n name: string;\n description?: string;\n imageUrl?: string;\n animationUrl?: string;\n externalUrl?: string;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n creatorId: string;\n ownerId: string;\n price?: string;\n currency?: string;\n royaltyBps: number;\n isLazyMinted: boolean;\n isMinted: boolean;\n mintedAt?: string;\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CreateNFTRequest {\n name: string;\n description?: string;\n price: string;\n currency: NFTCurrency;\n royaltyBps?: number;\n attributes?: Array<{\n trait_type: string;\n value: string | number;\n }>;\n externalUrl?: string;\n}\n\nexport interface NFTListResponse {\n success: boolean;\n nfts?: NFTResponse[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\n// ============ Marketplace Types ============\n\nexport interface MarketListing {\n id: string;\n nftId: string;\n nft?: NFTResponse;\n sellerId: string;\n sellerAddress: string;\n price: string;\n currency: string;\n expiresAt: string;\n status: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n transactionHash?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ListItemRequest {\n nftId: string;\n price: string;\n currency: NFTCurrency;\n duration?: number; // Duration in seconds, default 7 days\n}\n\nexport interface ListItemResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface BuyItemRequest {\n listingId: string;\n buyerAddress: string;\n}\n\nexport interface BuyItemResponse {\n success: boolean;\n transactionHash?: string;\n tokenId?: string;\n newOwner?: string;\n error?: string;\n}\n\nexport interface CancelListingRequest {\n listingId: string;\n}\n\nexport interface CancelListingResponse {\n success: boolean;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface UpdatePriceRequest {\n listingId: string;\n newPrice: string;\n}\n\nexport interface UpdatePriceResponse {\n success: boolean;\n listing?: MarketListing;\n transactionHash?: string;\n error?: string;\n}\n\nexport interface ListingsResponse {\n success: boolean;\n listings?: MarketListing[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface MarketStatsResponse {\n success: boolean;\n stats?: {\n totalListings: number;\n activeListings: number;\n totalVolume: string;\n totalSales: number;\n averagePrice: string;\n topSellers: Array<{\n address: string;\n sales: number;\n volume: string;\n }>;\n };\n error?: string;\n}\n\n// ============ Filter Types ============\n\nexport interface NFTFilters {\n creatorId?: string;\n ownerId?: string;\n isLazyMinted?: boolean;\n isMinted?: boolean;\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n page?: number;\n limit?: number;\n}\n\nexport interface ListingFilters {\n sellerId?: string;\n status?: 'ACTIVE' | 'SOLD' | 'CANCELLED' | 'EXPIRED';\n minPrice?: string;\n maxPrice?: string;\n currency?: NFTCurrency;\n sortBy?: 'price' | 'createdAt' | 'expiresAt';\n sortOrder?: 'asc' | 'desc';\n page?: number;\n limit?: number;\n}\n\n// ============ Tips Types ============\n\nexport interface TipUser {\n id: string;\n username?: string;\n displayName?: string;\n avatarUrl?: string;\n}\n\nexport interface Tip {\n id: string;\n senderId: string;\n recipientId?: string;\n senderAddress: string;\n recipientAddress: string;\n tokenAddress?: string;\n amount: string;\n amountUsd?: string;\n platformFee: string;\n message?: string;\n network: string;\n transactionHash?: string;\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n createdAt: string;\n sender?: TipUser;\n recipient?: TipUser;\n}\n\nexport interface SendTipRequest {\n recipientAddress: string;\n recipientUsername?: string;\n amount: string;\n tokenAddress?: string;\n network?: string;\n message?: string;\n transactionHash?: string;\n}\n\nexport interface SendTipResponse {\n success: boolean;\n message?: string;\n tip?: Tip;\n platformFee?: string;\n platformFeeBps?: number;\n error?: string;\n}\n\nexport interface TipStatsResponse {\n success: boolean;\n sent?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n };\n received?: {\n count: number;\n totalAmount: string;\n totalAmountUsd: string;\n platformFees: string;\n };\n error?: string;\n}\n\nexport interface TipsListResponse {\n success: boolean;\n tips?: Tip[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n totals?: {\n count: number;\n amount: string;\n amountUsd: string;\n };\n error?: string;\n}\n\nexport interface TipFilters {\n page?: number;\n limit?: number;\n status?: 'PENDING' | 'CONFIRMED' | 'FAILED';\n}\n\nexport interface UpdateTipStatusRequest {\n status: 'PENDING' | 'CONFIRMED' | 'FAILED';\n transactionHash?: string;\n}\n\n// ============ Subscription Types ============\n\nexport interface SubscriptionPlan {\n id: string;\n creatorId: string;\n name: string;\n description?: string;\n price: string;\n priceUsd?: string;\n paymentToken?: string;\n durationDays: number;\n perks: string[];\n nftBadge: boolean;\n maxSubscribers?: number;\n isActive: boolean;\n activeSubscribers?: number;\n createdAt: string;\n updatedAt: string;\n creator?: TipUser & { isVerified?: boolean };\n}\n\nexport interface Subscription {\n id: string;\n planId: string;\n subscriberId: string;\n creatorId: string;\n subscriberAddress?: string;\n creatorAddress?: string;\n transactionHash?: string;\n amount?: string;\n startDate: string;\n endDate: string;\n expiresAt: string;\n autoRenew: boolean;\n status: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n createdAt: string;\n plan?: Partial<SubscriptionPlan>;\n creator?: TipUser & { isVerified?: boolean };\n subscriber?: TipUser;\n}\n\nexport interface CreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n priceUsd?: number;\n paymentToken?: string;\n durationDays?: number;\n perks?: string[];\n nftBadge?: boolean;\n maxSubscribers?: number;\n}\n\nexport interface CreatePlanResponse {\n success: boolean;\n message?: string;\n plan?: SubscriptionPlan;\n error?: string;\n}\n\nexport interface SubscribeRequest {\n planId: string;\n transactionHash?: string;\n autoRenew?: boolean;\n}\n\nexport interface SubscribeResponse {\n success: boolean;\n message?: string;\n subscription?: Subscription;\n error?: string;\n}\n\nexport interface SubscriptionListResponse {\n success: boolean;\n subscriptions?: Subscription[];\n pagination?: {\n page: number;\n limit: number;\n total: number;\n totalPages: number;\n };\n stats?: {\n totalSubscribers: number;\n };\n error?: string;\n}\n\nexport interface SubscriptionFilters {\n page?: number;\n limit?: number;\n status?: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';\n}\n\nexport interface ContractSubscribeRequest {\n planId: string;\n months?: number;\n seed: string;\n}\n\nexport interface ContractSubscribeResponse {\n success: boolean;\n transactionHash?: string;\n subscription?: Subscription;\n message?: string;\n error?: string;\n}\n\nexport interface ContractCreatePlanRequest {\n name: string;\n description?: string;\n price: string;\n paymentToken?: string;\n durationDays?: number;\n maxSubscribers?: number;\n seed: string;\n}\n\nexport interface ContractCreatePlanResponse {\n success: boolean;\n transactionHash?: string;\n plan?: SubscriptionPlan;\n message?: string;\n error?: string;\n}\n\nexport interface IsSubscribedResponse {\n subscriber: string;\n creator: string;\n isSubscribed: boolean;\n}\n\nexport interface PlatformFeeResponse {\n feeBps: number;\n feePercent: string;\n}\n\n// ============ Payouts Types ============\n\nexport interface EarningsResponse {\n success: boolean;\n address?: string;\n pendingEarnings?: string;\n totalEarnings?: string;\n earningsBreakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n recentPayouts?: Array<{\n id: string;\n amount: string;\n txHash: string;\n createdAt: string;\n }>;\n error?: string;\n}\n\nexport interface ClaimEarningsRequest {\n seed: string;\n}\n\nexport interface ClaimEarningsResponse {\n success: boolean;\n transactionHash?: string;\n amount?: string;\n message?: string;\n error?: string;\n}\n\nexport interface PayoutHistoryResponse {\n success: boolean;\n payouts?: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n error?: string;\n}\n\nexport interface EarningsBreakdownResponse {\n success: boolean;\n breakdown?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n total: string;\n };\n percentages?: {\n tips: string;\n subscriptions: string;\n nftSales: string;\n royalties: string;\n };\n error?: string;\n}\n\n/**\n * Zubari API Client for backend integration\n */\nexport class ZubariApiClient {\n private config: Required<Omit<ZubariApiConfig, 'authToken'>> & { authToken?: string };\n\n constructor(config: ZubariApiConfig) {\n this.config = {\n baseUrl: config.baseUrl.replace(/\\/$/, ''), // Remove trailing slash\n timeout: config.timeout || 30000,\n authToken: config.authToken,\n };\n }\n\n /**\n * Set the authentication token\n */\n setAuthToken(token: string): void {\n this.config.authToken = token;\n }\n\n /**\n * Clear the authentication token\n */\n clearAuthToken(): void {\n this.config.authToken = undefined;\n }\n\n /**\n * Make an authenticated request to the API\n */\n private async request<T>(\n method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE',\n path: string,\n body?: unknown\n ): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n return response.json();\n }\n\n // ============ NFT Methods ============\n\n /**\n * Get all NFTs with optional filters\n */\n async getNFTs(filters?: NFTFilters): Promise<NFTListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/nfts${queryString ? `?${queryString}` : ''}`;\n return await this.request<NFTListResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFTs',\n };\n }\n }\n\n /**\n * Get a single NFT by ID\n */\n async getNFT(nftId: string): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const nft = await this.request<NFTResponse>('GET', `/api/nfts/${nftId}`);\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get NFT',\n };\n }\n }\n\n /**\n * Create a new NFT (lazy minted)\n */\n async createNFT(\n data: CreateNFTRequest,\n image: File | Blob\n ): Promise<{ success: boolean; nft?: NFTResponse; error?: string }> {\n try {\n const formData = new FormData();\n formData.append('image', image);\n formData.append('name', data.name);\n if (data.description) formData.append('description', data.description);\n formData.append('price', data.price);\n formData.append('currency', data.currency);\n if (data.royaltyBps !== undefined) formData.append('royaltyBps', String(data.royaltyBps));\n if (data.attributes) formData.append('attributes', JSON.stringify(data.attributes));\n if (data.externalUrl) formData.append('externalUrl', data.externalUrl);\n\n const headers: Record<string, string> = {};\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(`${this.config.baseUrl}/api/nfts`, {\n method: 'POST',\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.error || `HTTP ${response.status}`);\n }\n\n const nft = await response.json();\n return { success: true, nft };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create NFT',\n };\n }\n }\n\n /**\n * Create a voucher for an NFT (EIP-712 signed)\n */\n async createVoucher(nftId: string, params: CreateVoucherRequest): Promise<CreateVoucherResponse> {\n try {\n return await this.request<CreateVoucherResponse>('POST', `/api/nfts/${nftId}/voucher`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create voucher',\n };\n }\n }\n\n /**\n * Redeem an NFT voucher (buy/mint)\n */\n async redeemVoucher(nftId: string, params: RedeemVoucherRequest): Promise<RedeemVoucherResponse> {\n try {\n return await this.request<RedeemVoucherResponse>('POST', `/api/nfts/${nftId}/redeem`, params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to redeem voucher',\n };\n }\n }\n\n /**\n * Get voucher status for an NFT\n */\n async getVoucherStatus(nftId: string): Promise<VoucherStatusResponse> {\n try {\n return await this.request<VoucherStatusResponse>('GET', `/api/nfts/${nftId}/voucher/status`);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get voucher status',\n };\n }\n }\n\n // ============ Marketplace Methods ============\n\n /**\n * Get all active listings\n */\n async getListings(filters?: ListingFilters): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get listings',\n };\n }\n }\n\n /**\n * List an NFT for sale\n */\n async listItem(params: ListItemRequest): Promise<ListItemResponse> {\n try {\n return await this.request<ListItemResponse>('POST', '/api/market/list', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to list item',\n };\n }\n }\n\n /**\n * Buy a listed NFT\n */\n async buyItem(params: BuyItemRequest): Promise<BuyItemResponse> {\n try {\n return await this.request<BuyItemResponse>('POST', '/api/market/buy', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to buy item',\n };\n }\n }\n\n /**\n * Cancel a listing\n */\n async cancelListing(params: CancelListingRequest): Promise<CancelListingResponse> {\n try {\n return await this.request<CancelListingResponse>('POST', '/api/market/cancel', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel listing',\n };\n }\n }\n\n /**\n * Update listing price\n */\n async updateListingPrice(params: UpdatePriceRequest): Promise<UpdatePriceResponse> {\n try {\n return await this.request<UpdatePriceResponse>('PATCH', '/api/market/price', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update price',\n };\n }\n }\n\n /**\n * Get current user's listings\n */\n async getMyListings(filters?: Omit<ListingFilters, 'sellerId'>): Promise<ListingsResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/market/my/listings${queryString ? `?${queryString}` : ''}`;\n return await this.request<ListingsResponse>('GET', path);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get my listings',\n };\n }\n }\n\n /**\n * Get marketplace statistics\n */\n async getMarketStats(): Promise<MarketStatsResponse> {\n try {\n return await this.request<MarketStatsResponse>('GET', '/api/market/stats');\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get market stats',\n };\n }\n }\n\n // ============ Tips Methods ============\n\n /**\n * Send a tip to a creator\n */\n async sendTip(params: SendTipRequest): Promise<SendTipResponse> {\n try {\n return await this.request<SendTipResponse>('POST', '/api/tips', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to send tip',\n };\n }\n }\n\n /**\n * Get tip statistics for current user\n */\n async getTipStats(): Promise<TipStatsResponse> {\n try {\n const data = await this.request<{\n sent: { count: number; totalAmount: string; totalAmountUsd: string };\n received: { count: number; totalAmount: string; totalAmountUsd: string; platformFees: string };\n }>('GET', '/api/tips/my/stats');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip stats',\n };\n }\n }\n\n /**\n * Get tips sent by current user\n */\n async getSentTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/sent${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get sent tips',\n };\n }\n }\n\n /**\n * Get tips received by current user\n */\n async getReceivedTips(filters?: TipFilters): Promise<TipsListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/tips/received${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n tips: Tip[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n totals: { count: number; amount: string; amountUsd: string };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get received tips',\n };\n }\n }\n\n /**\n * Get a single tip by ID\n */\n async getTip(tipId: string): Promise<{ success: boolean; tip?: Tip; error?: string }> {\n try {\n const data = await this.request<{ tip: Tip }>('GET', `/api/tips/${tipId}`);\n return { success: true, tip: data.tip };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get tip',\n };\n }\n }\n\n /**\n * Update tip status (for transaction confirmation)\n */\n async updateTipStatus(\n tipId: string,\n params: UpdateTipStatusRequest\n ): Promise<{ success: boolean; tip?: Tip; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string; tip: Tip }>(\n 'PATCH',\n `/api/tips/${tipId}/status`,\n params\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to update tip status',\n };\n }\n }\n\n // ============ Subscription Methods ============\n\n /**\n * Create a new subscription plan (creator only)\n */\n async createSubscriptionPlan(params: CreatePlanRequest): Promise<CreatePlanResponse> {\n try {\n return await this.request<CreatePlanResponse>('POST', '/api/subscriptions/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create subscription plan',\n };\n }\n }\n\n /**\n * Get current user's subscription plans\n */\n async getMySubscriptionPlans(): Promise<{ success: boolean; plans?: SubscriptionPlan[]; error?: string }> {\n try {\n const data = await this.request<{ plans: SubscriptionPlan[] }>('GET', '/api/subscriptions/plans');\n return { success: true, plans: data.plans };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plans',\n };\n }\n }\n\n /**\n * Get subscription plan by ID\n */\n async getSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; plan?: SubscriptionPlan & { isSubscribed?: boolean }; error?: string }> {\n try {\n const plan = await this.request<SubscriptionPlan & { isSubscribed?: boolean }>(\n 'GET',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, plan };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscription plan',\n };\n }\n }\n\n /**\n * Delete/deactivate subscription plan\n */\n async deleteSubscriptionPlan(\n planId: string\n ): Promise<{ success: boolean; message?: string; deactivated?: boolean; error?: string }> {\n try {\n const data = await this.request<{ message: string; deactivated?: boolean }>(\n 'DELETE',\n `/api/subscriptions/plans/${planId}`\n );\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete subscription plan',\n };\n }\n }\n\n /**\n * Subscribe to a plan\n */\n async subscribe(params: SubscribeRequest): Promise<SubscribeResponse> {\n try {\n return await this.request<SubscribeResponse>('POST', '/api/subscriptions/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe',\n };\n }\n }\n\n /**\n * Get current user's subscriptions (as subscriber)\n */\n async getMySubscriptions(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscriptions',\n };\n }\n }\n\n /**\n * Get subscribers to current user's plans (as creator)\n */\n async getMySubscribers(filters?: SubscriptionFilters): Promise<SubscriptionListResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/subscriptions/subscribers${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n subscriptions: Subscription[];\n pagination: { page: number; limit: number; total: number; totalPages: number };\n stats: { totalSubscribers: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get subscribers',\n };\n }\n }\n\n /**\n * Cancel subscription\n */\n async cancelSubscription(subscriptionId: string): Promise<{ success: boolean; message?: string; error?: string }> {\n try {\n const data = await this.request<{ message: string }>('DELETE', `/api/subscriptions/${subscriptionId}`);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription',\n };\n }\n }\n\n /**\n * Create a subscription plan on-chain\n */\n async createSubscriptionPlanOnChain(params: ContractCreatePlanRequest): Promise<ContractCreatePlanResponse> {\n try {\n return await this.request<ContractCreatePlanResponse>('POST', '/api/subscriptions/contract/plans', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create plan on-chain',\n };\n }\n }\n\n /**\n * Subscribe to a plan on-chain\n */\n async subscribeOnChain(params: ContractSubscribeRequest): Promise<ContractSubscribeResponse> {\n try {\n return await this.request<ContractSubscribeResponse>('POST', '/api/subscriptions/contract/subscribe', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to subscribe on-chain',\n };\n }\n }\n\n /**\n * Cancel subscription on-chain\n */\n async cancelSubscriptionOnChain(\n subscriptionId: string,\n seed: string\n ): Promise<{ success: boolean; transactionHash?: string; message?: string; error?: string }> {\n try {\n return await this.request<{ success: boolean; transactionHash: string; message: string }>(\n 'POST',\n '/api/subscriptions/contract/cancel',\n { subscriptionId, seed }\n );\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to cancel subscription on-chain',\n };\n }\n }\n\n /**\n * Check if user is subscribed to a creator on-chain\n */\n async isSubscribed(subscriber: string, creator: string): Promise<IsSubscribedResponse> {\n try {\n return await this.request<IsSubscribedResponse>(\n 'GET',\n `/api/subscriptions/contract/is-subscribed?subscriber=${subscriber}&creator=${creator}`\n );\n } catch (error) {\n return {\n subscriber,\n creator,\n isSubscribed: false,\n };\n }\n }\n\n /**\n * Get subscription platform fee\n */\n async getSubscriptionPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/subscriptions/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n\n // ============ Payouts Methods ============\n\n /**\n * Get pending and claimed earnings for the authenticated user\n */\n async getEarnings(): Promise<EarningsResponse> {\n try {\n const data = await this.request<{\n address: string;\n pendingEarnings: string;\n totalEarnings: string;\n earningsBreakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n recentPayouts: Array<{ id: string; amount: string; txHash: string; createdAt: string }>;\n }>('GET', '/api/payouts/earnings');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings',\n };\n }\n }\n\n /**\n * Claim pending earnings\n */\n async claimEarnings(params: ClaimEarningsRequest): Promise<ClaimEarningsResponse> {\n try {\n return await this.request<ClaimEarningsResponse>('POST', '/api/payouts/claim', params);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to claim earnings',\n };\n }\n }\n\n /**\n * Get payout history for the authenticated user\n */\n async getPayoutHistory(filters?: { page?: number; limit?: number }): Promise<PayoutHistoryResponse> {\n try {\n const params = new URLSearchParams();\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n if (value !== undefined) {\n params.append(key, String(value));\n }\n });\n }\n const queryString = params.toString();\n const path = `/api/payouts/history${queryString ? `?${queryString}` : ''}`;\n const data = await this.request<{\n payouts: Array<{\n id: string;\n amount: string;\n status: string;\n txHash: string;\n createdAt: string;\n confirmedAt?: string;\n }>;\n pagination: { page: number; limit: number; total: number; pages: number };\n }>('GET', path);\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get payout history',\n };\n }\n }\n\n /**\n * Get earnings breakdown by source\n */\n async getEarningsBreakdown(): Promise<EarningsBreakdownResponse> {\n try {\n const data = await this.request<{\n breakdown: { tips: string; subscriptions: string; nftSales: string; royalties: string; total: string };\n percentages: { tips: string; subscriptions: string; nftSales: string; royalties: string };\n }>('GET', '/api/payouts/breakdown');\n return { success: true, ...data };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get earnings breakdown',\n };\n }\n }\n\n /**\n * Get current platform fee for payouts\n */\n async getPayoutsPlatformFee(): Promise<PlatformFeeResponse> {\n try {\n return await this.request<PlatformFeeResponse>('GET', '/api/payouts/platform-fee');\n } catch (error) {\n return {\n feeBps: 0,\n feePercent: '0',\n };\n }\n }\n}\n\n// Default API URL (can be overridden)\nconst DEFAULT_API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n\n// Singleton instance\nlet zubariApiClient: ZubariApiClient | null = null;\n\n/**\n * Get or create the Zubari API client instance\n */\nexport function getZubariApiClient(config?: Partial<ZubariApiConfig>): ZubariApiClient {\n if (!zubariApiClient || (config?.baseUrl && zubariApiClient['config'].baseUrl !== config.baseUrl)) {\n zubariApiClient = new ZubariApiClient({\n baseUrl: config?.baseUrl || DEFAULT_API_URL,\n timeout: config?.timeout,\n authToken: config?.authToken,\n });\n } else if (config?.authToken) {\n zubariApiClient.setAuthToken(config.authToken);\n }\n return zubariApiClient;\n}\n\n/**\n * Create a new Zubari API client instance\n */\nexport function createZubariApiClient(config: ZubariApiConfig): ZubariApiClient {\n return new ZubariApiClient(config);\n}\n","import type {\n NFTMetadata,\n LazyMintVoucher,\n NFT,\n ListingParams,\n TxResult,\n CreateVoucherParams,\n NFTCurrency,\n} from '../types';\nimport {\n PLATFORM_CONFIG,\n NFT_VOUCHER_DOMAIN,\n NFT_VOUCHER_TYPES,\n CURRENCY_ADDRESSES,\n ZERO_ADDRESS,\n} from '../config/contracts';\nimport { getZubariApiClient, ZubariApiClient } from '../services/ZubariApiClient';\n\n/**\n * ZubariNFTProtocol - NFT creation and marketplace operations\n *\n * Handles lazy minting via EIP-712 signatures, NFT listing,\n * and marketplace operations on Ethereum network.\n */\nexport class ZubariNFTProtocol {\n private readonly contractAddress: string;\n private readonly _marketplaceAddress: string;\n private readonly chainId: number;\n private readonly network: 'testnet' | 'mainnet';\n private readonly apiClient: ZubariApiClient;\n private nonceCounter: number = 0;\n\n constructor(\n contractAddress: string,\n marketplaceAddress: string,\n chainId: number,\n network: 'testnet' | 'mainnet' = 'testnet',\n apiUrl?: string\n ) {\n this.contractAddress = contractAddress;\n this._marketplaceAddress = marketplaceAddress;\n this.chainId = chainId;\n this.network = network;\n this.apiClient = getZubariApiClient(apiUrl ? { baseUrl: apiUrl } : undefined);\n }\n\n /**\n * Convert human-readable price to wei\n * @param price - Price in human-readable format (e.g., \"1.5\")\n * @param currency - ETH (18 decimals) or USDT (6 decimals)\n */\n private priceToWei(price: string, currency: NFTCurrency): string {\n const decimals = currency === 'ETH' ? 18 : 6;\n const [whole, fraction = ''] = price.split('.');\n const paddedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);\n const wei = whole + paddedFraction;\n // Remove leading zeros but keep at least one digit\n return wei.replace(/^0+/, '') || '0';\n }\n\n /**\n * Get currency address for the configured network\n */\n private getCurrencyAddress(currency: NFTCurrency): string {\n return CURRENCY_ADDRESSES[this.network][currency];\n }\n\n /**\n * Generate a unique nonce\n */\n private generateNonce(): number {\n return Date.now() * 1000 + this.nonceCounter++;\n }\n\n /**\n * Pad string to bytes32 format\n */\n private toBytes32(value: string): string {\n if (value.startsWith('0x')) {\n return value.padEnd(66, '0');\n }\n // Convert string to hex and pad\n const hex = Buffer.from(value).toString('hex');\n return '0x' + hex.padEnd(64, '0');\n }\n\n /**\n * Create a lazy mint voucher for off-chain NFT creation\n * The voucher can be redeemed on-chain when purchased\n *\n * @param params - Voucher creation parameters\n * @param signer - Object with signTypedData method (ethers.js wallet or viem client)\n */\n async createLazyMintVoucher(\n params: CreateVoucherParams,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n const { metadata, creatorAddress, price, currency, nonce, watermarking } = params;\n\n // Ensure royaltyBps has a default value (500 = 5%)\n const royaltyBps = metadata.royaltyBps ?? 500;\n\n // Validate royalty\n if (royaltyBps > PLATFORM_CONFIG.maxRoyaltyBps) {\n throw new Error(`Royalty cannot exceed ${PLATFORM_CONFIG.maxRoyaltyBps / 100}%`);\n }\n\n // Validate price\n if (!price || parseFloat(price) <= 0) {\n throw new Error('Price must be greater than 0');\n }\n\n // Generate random tokenId\n const tokenId = this.generateTokenId();\n\n // Calculate deadline (30 days from now)\n const deadline = Math.floor(Date.now() / 1000) + PLATFORM_CONFIG.voucherValiditySecs;\n\n // Convert price to wei\n const priceInWei = this.priceToWei(price, currency);\n\n // Get currency address\n const currencyAddress = this.getCurrencyAddress(currency);\n\n // Generate or use provided nonce\n const voucherNonce = nonce ?? this.generateNonce();\n\n // Prepare watermarking data (use zero values if not provided)\n const watermarkTimestamp = watermarking ? Math.floor(Date.now() / 1000) : 0;\n const contentHash = watermarking ? this.toBytes32(watermarking.contentHash) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const userId = watermarking ? this.toBytes32(watermarking.userId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n const sessionId = watermarking ? this.toBytes32(watermarking.sessionId) : ZERO_ADDRESS.replace('0x', '0x' + '0'.repeat(64)).slice(0, 66);\n\n // Build voucher data for signing\n const voucherData = {\n tokenId,\n uri: metadata.image, // Will be IPFS URI\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash,\n userId,\n watermarkTimestamp,\n sessionId,\n };\n\n // Create EIP-712 domain\n const domain = {\n ...NFT_VOUCHER_DOMAIN,\n chainId: this.chainId,\n verifyingContract: this.contractAddress,\n };\n\n // Sign the voucher\n const signature = await signer.signTypedData(domain, NFT_VOUCHER_TYPES, voucherData);\n\n return {\n tokenId,\n uri: metadata.image,\n creator: creatorAddress,\n royaltyBps, // Use the validated/defaulted value\n deadline,\n signature,\n price: priceInWei,\n currency: currencyAddress,\n nonce: voucherNonce,\n contentHash: watermarking ? contentHash : undefined,\n userId: watermarking ? userId : undefined,\n watermarkTimestamp: watermarking ? watermarkTimestamp : undefined,\n sessionId: watermarking ? sessionId : undefined,\n };\n }\n\n /**\n * @deprecated Use createLazyMintVoucher(params, signer) instead\n * Legacy method for backward compatibility\n */\n async createLazyMintVoucherLegacy(\n metadata: NFTMetadata,\n creatorAddress: string,\n signer: { signTypedData: (domain: object, types: object, value: object) => Promise<string> }\n ): Promise<LazyMintVoucher> {\n // Default to 0.01 ETH for legacy calls\n return this.createLazyMintVoucher(\n {\n metadata,\n creatorAddress,\n price: '0.01',\n currency: 'ETH',\n },\n signer\n );\n }\n\n /**\n * Redeem a lazy mint voucher to mint the NFT on-chain\n * Uses the backend API which handles the on-chain transaction\n */\n async redeemVoucher(\n voucher: LazyMintVoucher,\n buyerAddress: string,\n nftId: string,\n authToken: string\n ): Promise<TxResult> {\n // Validate voucher deadline\n if (voucher.deadline < Math.floor(Date.now() / 1000)) {\n throw new Error('Voucher has expired');\n }\n\n try {\n const result = await this.apiClient.redeemVoucher(nftId, {\n buyerAddress,\n });\n\n if (result.success && result.transactionHash) {\n return {\n hash: result.transactionHash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n nftId: result.nftId,\n tokenId: voucher.tokenId,\n buyer: buyerAddress,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to redeem voucher');\n } catch (error) {\n console.error('Failed to redeem voucher:', error);\n throw new Error(`Voucher redemption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List an NFT for sale on the marketplace via backend API\n */\n async listForSale(params: ListingParams, authToken: string): Promise<TxResult> {\n try {\n // Map paymentToken to currency\n const currency: NFTCurrency = params.paymentToken === ZERO_ADDRESS ? 'ETH' : 'USDT';\n\n const result = await this.apiClient.listItem({\n nftId: params.tokenId, // Using tokenId as nftId\n price: params.price.toString(),\n currency,\n duration: params.duration || 30 * 24 * 60 * 60, // 30 days default\n });\n\n if (result.success && result.listing) {\n return {\n hash: result.listing.id || '',\n network: 'ethereum',\n status: 'pending',\n metadata: {\n listingId: result.listing.id,\n price: params.price.toString(),\n tokenId: params.tokenId,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to list NFT');\n } catch (error) {\n console.error('Failed to list NFT:', error);\n throw new Error(`Listing failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Buy an NFT from the marketplace via backend API\n */\n async buyNFT(listingId: string, price: bigint, buyerAddress: string): Promise<TxResult> {\n try {\n const result = await this.apiClient.buyItem({\n listingId,\n buyerAddress,\n });\n\n if (result.success && result.transactionHash) {\n return {\n hash: result.transactionHash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n listingId,\n price: price.toString(),\n buyer: buyerAddress,\n },\n };\n }\n\n throw new Error(result.error || 'Failed to buy NFT');\n } catch (error) {\n console.error('Failed to buy NFT:', error);\n throw new Error(`Purchase failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Transfer an NFT to another address\n * Note: This requires direct contract interaction via wallet\n */\n async transfer(\n tokenId: string,\n to: string,\n from: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n // Build transfer transaction data\n // ERC721 transferFrom(address from, address to, uint256 tokenId)\n const functionSelector = '0x23b872dd'; // transferFrom selector\n const encodedFrom = from.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTo = to.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedTokenId = BigInt(tokenId).toString(16).padStart(64, '0');\n\n const data = `${functionSelector}${encodedFrom}${encodedTo}${encodedTokenId}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: {\n tokenId,\n from,\n to,\n },\n };\n } catch (error) {\n console.error('Failed to transfer NFT:', error);\n throw new Error(`Transfer failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get NFTs owned by an address via backend API\n */\n async getOwnedNFTs(address: string): Promise<NFT[]> {\n try {\n const result = await this.apiClient.getNFTs({ ownerId: address });\n\n if (result.success && result.nfts) {\n return result.nfts.map(nft => ({\n tokenId: nft.tokenId || nft.id,\n contractAddress: nft.contractAddress || this.contractAddress,\n owner: nft.ownerId || address,\n creator: nft.creatorId || '',\n uri: nft.imageUrl || nft.animationUrl || '',\n metadata: nft.name ? {\n name: nft.name,\n description: nft.description || '',\n image: nft.imageUrl || '',\n royaltyBps: 0, // Default royalty, actual value from contract\n } : undefined,\n isLazyMinted: !nft.tokenId, // If no tokenId, it's lazy minted\n }));\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get owned NFTs:', error);\n return [];\n }\n }\n\n /**\n * Generate a random tokenId (32 bytes hex)\n */\n private generateTokenId(): string {\n const bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n return '0x' + Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InsufficientPayment\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidPrice\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingExpired\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ListingNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotApproved\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSeller\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotTokenOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"UnsupportedPaymentToken\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Listed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"ListingUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"PaymentTokenUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"buyer\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"royaltyAmount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Sale\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"buyItem\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"cancelListing\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getListing\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariMarket.Listing\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"isListingValid\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"duration\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listItem\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"listingCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"listings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"nftContract\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"tokenId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"seller\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"expiresAt\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"supported\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setSupportedToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"supportedTokens\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tokenListings\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"listingId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"newPrice\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"updatePrice\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type {\n ListingParams,\n Listing,\n BuyParams,\n TxResult,\n} from '../types';\nimport { PLATFORM_CONFIG } from '../config/contracts';\n\n// Import ABI\nimport ZubariMarketAbi from '../abi/ZubariMarket.json';\n\n/**\n * ZubariMarketProtocol - NFT Marketplace operations\n *\n * Handles NFT listings, purchases, and marketplace management\n * with support for ETH and ERC-20 payment tokens.\n */\nexport class ZubariMarketProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariMarketAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * List an NFT for sale\n * @param params Listing parameters\n * @param signer Wallet signer with sendTransaction method\n */\n async listItem(\n params: ListingParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n // Validate price\n if (params.price <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n // Validate duration\n if (params.duration <= 0) {\n throw new Error('Duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('listItem', [\n params.nftContract,\n params.tokenId,\n params.price,\n params.paymentToken,\n params.duration,\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Buy an NFT from a listing\n * @param params Buy parameters\n * @param signer Wallet signer\n */\n async buyItem(\n params: BuyParams,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('buyItem', [params.listingId]);\n\n // If paying with ETH (zero address), include value\n const isEthPayment = params.paymentToken === '0x0000000000000000000000000000000000000000';\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: isEthPayment ? params.price : 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel a listing\n * @param listingId The listing ID to cancel\n * @param signer Wallet signer\n */\n async cancelListing(\n listingId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancelListing', [listingId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Update listing price\n * @param listingId The listing ID\n * @param newPrice New price\n * @param signer Wallet signer\n */\n async updatePrice(\n listingId: string,\n newPrice: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (newPrice <= 0n) {\n throw new Error('Price must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('updatePrice', [listingId, newPrice]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get listing details\n * @param listingId The listing ID\n * @param provider JSON-RPC provider\n */\n async getListing(\n listingId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Listing | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getListing', [listingId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getListing', result);\n const listing = decoded[0];\n\n return {\n listingId,\n nftContract: listing.nftContract,\n tokenId: listing.tokenId.toString(),\n seller: listing.seller,\n price: listing.price,\n paymentToken: listing.paymentToken,\n expiresAt: Number(listing.expiresAt),\n isActive: listing.isActive,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Check if a payment token is supported\n * @param token Token address\n * @param provider JSON-RPC provider\n */\n async isTokenSupported(\n token: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('supportedTokens', [token]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('supportedTokens', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Calculate platform fee for a given price\n * Platform keeps 10%, Creator/Seller receives 90%\n * @param price The sale price\n */\n calculateFee(price: bigint): { fee: bigint; sellerAmount: bigint } {\n const fee = (price * BigInt(PLATFORM_CONFIG.platformFeeBps)) / 10000n;\n return {\n fee,\n sellerAmount: price - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidRecipient\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"TransferFailed\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256[]\",\n \"name\": \"tipIds\",\n \"type\": \"uint256[]\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"BatchTipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"oldFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newFee\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlatformFeeUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"TipSent\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"oldTreasury\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"newTreasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"TreasuryUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getTip\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"internalType\": \"struct ZubariTips.Tip\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address[]\",\n \"name\": \"recipients\",\n \"type\": \"address[]\"\n },\n {\n \"internalType\": \"uint256[]\",\n \"name\": \"amounts\",\n \"type\": \"uint256[]\"\n },\n {\n \"internalType\": \"string[]\",\n \"name\": \"messages\",\n \"type\": \"string[]\"\n }\n ],\n \"name\": \"sendBatchTips\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"tipCounter\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipETH\",\n \"outputs\": [],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n }\n ],\n \"name\": \"tipToken\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"tips\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"tipId\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"sender\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"platformFee\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"message\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"timestamp\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"totalTipsReceived\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { Tip, TxResult } from '../types';\n\n// Import ABI\nimport ZubariTipsAbi from '../abi/ZubariTips.json';\n\n/**\n * ZubariTipsProtocol - Micropayment tips for creators\n *\n * Handles ETH and ERC-20 token tips with platform fee distribution.\n * Supports individual tips, batch tips, and tip queries.\n */\nexport class ZubariTipsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariTipsAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Send ETH tip to a creator\n * @param recipient The recipient address\n * @param message Optional tip message\n * @param signer Wallet signer with sendTransaction method\n * @param value ETH amount to tip (in wei)\n */\n async tipETH(\n recipient: string,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (value <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipETH', [recipient, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send ERC-20 token tip to a creator\n * @param recipient The recipient address\n * @param token The ERC-20 token address\n * @param amount The amount of tokens to tip\n * @param message Optional tip message\n * @param signer Wallet signer\n */\n async tipToken(\n recipient: string,\n token: string,\n amount: bigint,\n message: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n if (!token || token === '0x0000000000000000000000000000000000000000') {\n throw new Error('Use tipETH for native ETH tips');\n }\n if (amount <= 0n) {\n throw new Error('Tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipToken', [recipient, token, amount, message || '']);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Send batch tips to multiple creators in a single transaction\n * @param recipients Array of recipient addresses\n * @param amounts Array of tip amounts (in wei)\n * @param messages Array of tip messages\n * @param signer Wallet signer\n * @param value Total ETH to send\n */\n async sendBatchTips(\n recipients: string[],\n amounts: bigint[],\n messages: string[],\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value: bigint\n ): Promise<TxResult> {\n if (recipients.length === 0) {\n throw new Error('At least one recipient is required');\n }\n if (recipients.length !== amounts.length || recipients.length !== messages.length) {\n throw new Error('Recipients, amounts, and messages arrays must have the same length');\n }\n\n // Validate all recipients\n for (const recipient of recipients) {\n if (!recipient || recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address in batch');\n }\n }\n\n // Calculate total amount\n const totalAmount = amounts.reduce((sum, amount) => sum + amount, 0n);\n if (totalAmount <= 0n) {\n throw new Error('Total tip amount must be greater than 0');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('sendBatchTips', [recipients, amounts, messages]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Get tip details by ID\n * @param tipId The tip ID\n * @param provider JSON-RPC provider\n */\n async getTip(\n tipId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Tip | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getTip', [tipId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getTip', result);\n const tip = decoded[0];\n\n // Check if tip exists (tipId != 0)\n if (BigInt(tip.tipId) === 0n) {\n return null;\n }\n\n return {\n tipId: tip.tipId.toString(),\n sender: tip.sender,\n recipient: tip.recipient,\n token: tip.token,\n amount: BigInt(tip.amount),\n platformFee: BigInt(tip.platformFee),\n message: tip.message,\n timestamp: Number(tip.timestamp),\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get total tips received by an address\n * @param address The address to query\n * @param provider JSON-RPC provider\n */\n async getTotalTipsReceived(\n address: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('totalTipsReceived', [address]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('totalTipsReceived', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Get current tip counter\n * @param provider JSON-RPC provider\n */\n async getTipCounter(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<bigint> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('tipCounter', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('tipCounter', result);\n return BigInt(decoded[0]);\n } catch {\n return 0n;\n }\n }\n\n /**\n * Get treasury address\n * @param provider JSON-RPC provider\n */\n async getTreasury(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('treasury', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('treasury', result);\n return decoded[0];\n } catch {\n return '0x0000000000000000000000000000000000000000';\n }\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The tip amount\n * @param feeBps Fee in basis points (default: 1000 = 10%)\n * Platform keeps 10%, Creator receives 90%\n */\n calculateFee(amount: bigint, feeBps: number = 1000): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","[\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"_platformFeeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"constructor\"\n },\n {\n \"inputs\": [],\n \"name\": \"AlreadySubscribed\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"EnforcedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ExpectedPause\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAddress\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidAmount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidDuration\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"InvalidFee\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"NotSubscriber\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"owner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableInvalidOwner\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnableUnauthorizedAccount\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanFull\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotActive\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"PlanNotFound\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [],\n \"name\": \"ReentrancyGuardReentrantCall\",\n \"type\": \"error\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"token\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"SafeERC20FailedOperation\",\n \"type\": \"error\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"previousOwner\",\n \"type\": \"address\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"OwnershipTransferred\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Paused\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"PlanCreated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanDeactivated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"PlanUpdated\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": true,\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"Subscribed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"SubscriptionCancelled\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": true,\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"newEndTime\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"SubscriptionRenewed\",\n \"type\": \"event\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"address\",\n \"name\": \"account\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"Unpaused\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"activeSubscription\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"cancel\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"createPlan\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"creatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"deactivatePlan\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"getCreatorPlans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32[]\",\n \"name\": \"\",\n \"type\": \"bytes32[]\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getPlan\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.SubscriptionPlan\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"getSubscription\",\n \"outputs\": [\n {\n \"components\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"internalType\": \"struct ZubariSubscription.Subscription\",\n \"name\": \"\",\n \"type\": \"tuple\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"isSubscribed\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"owner\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"pause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"paused\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"plans\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"name\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"string\",\n \"name\": \"description\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"price\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"paymentToken\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"durationDays\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"maxSubscribers\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"subscriberCount\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"isActive\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"platformFeeBps\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"renounceOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n }\n ],\n \"name\": \"setAutoRenew\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_feeBps\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"setPlatformFee\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"_treasury\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"setTreasury\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"months\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscribe\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"payable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"subscriberSubscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"\",\n \"type\": \"bytes32\"\n }\n ],\n \"name\": \"subscriptions\",\n \"outputs\": [\n {\n \"internalType\": \"bytes32\",\n \"name\": \"subscriptionId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"bytes32\",\n \"name\": \"planId\",\n \"type\": \"bytes32\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"creator\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"subscriber\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"startTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"endTime\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"bool\",\n \"name\": \"autoRenew\",\n \"type\": \"bool\"\n },\n {\n \"internalType\": \"enum ZubariSubscription.SubscriptionStatus\",\n \"name\": \"status\",\n \"type\": \"uint8\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"newOwner\",\n \"type\": \"address\"\n }\n ],\n \"name\": \"transferOwnership\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"treasury\",\n \"outputs\": [\n {\n \"internalType\": \"address\",\n \"name\": \"\",\n \"type\": \"address\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [],\n \"name\": \"unpause\",\n \"outputs\": [],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]","import type { SubscriptionPlan, Subscription, TxResult } from '../types';\n\n// Import ABI\nimport ZubariSubscriptionAbi from '../abi/ZubariSubscription.json';\n\n// Subscription status enum matching the contract\nenum SubscriptionStatus {\n Active = 0,\n Cancelled = 1,\n Expired = 2,\n}\n\n/**\n * ZubariSubscriptionProtocol - Recurring subscription payments\n *\n * Handles subscription plan creation, subscription management,\n * and verification of active subscriptions using the ZubariSubscription smart contract.\n */\nexport class ZubariSubscriptionProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly abi = ZubariSubscriptionAbi;\n\n constructor(contractAddress: string, chainId: number) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n }\n\n /**\n * Get the contract ABI\n */\n getAbi() {\n return this.abi;\n }\n\n /**\n * Get the contract address\n */\n getAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Create a new subscription plan\n * @param plan The plan details\n * @param signer Wallet signer with sendTransaction method\n */\n async createPlan(\n plan: SubscriptionPlan,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<string> {\n // Validate plan\n if (!plan.name || plan.name.length === 0) {\n throw new Error('Plan name is required');\n }\n if (plan.price <= 0n) {\n throw new Error('Plan price must be greater than 0');\n }\n if (plan.duration <= 0) {\n throw new Error('Plan duration must be greater than 0');\n }\n\n // Encode function data\n const iface = new (await import('ethers')).Interface(this.abi);\n\n // Convert duration from seconds to days (contract expects days)\n const durationDays = Math.ceil(plan.duration / (24 * 60 * 60));\n\n const data = iface.encodeFunctionData('createPlan', [\n plan.name,\n plan.description || '',\n plan.price,\n plan.paymentToken || '0x0000000000000000000000000000000000000000', // ETH by default\n durationDays,\n plan.maxSubscribers || 0, // 0 = unlimited\n ]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n // Return tx hash - the planId will be emitted in the event\n return result.hash;\n }\n\n /**\n * Deactivate a subscription plan (only creator can do this)\n * @param planId The plan ID to deactivate\n * @param signer Wallet signer\n */\n async deactivatePlan(\n planId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('deactivatePlan', [planId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Subscribe to a creator's plan\n * @param planId The plan ID to subscribe to\n * @param months Number of months to subscribe\n * @param signer Wallet signer\n * @param value ETH value to send (if paying with ETH)\n */\n async subscribe(\n planId: string,\n months: number,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> },\n value?: bigint\n ): Promise<TxResult> {\n if (months <= 0) {\n throw new Error('Subscription duration must be at least 1 month');\n }\n\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('subscribe', [planId, months]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: value || 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Cancel an active subscription\n * @param subscriptionId The subscription ID to cancel\n * @param signer Wallet signer\n */\n async cancel(\n subscriptionId: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('cancel', [subscriptionId]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Set auto-renew for a subscription\n * @param subscriptionId The subscription ID\n * @param autoRenew Whether to enable auto-renew\n * @param signer Wallet signer\n */\n async setAutoRenew(\n subscriptionId: string,\n autoRenew: boolean,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('setAutoRenew', [subscriptionId, autoRenew]);\n\n const result = await signer.sendTransaction({\n to: this.contractAddress,\n value: 0n,\n data,\n });\n\n return {\n hash: result.hash,\n network: 'ethereum',\n status: 'pending',\n };\n }\n\n /**\n * Check if an address is subscribed to a creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async isSubscribed(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<boolean> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('isSubscribed', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('isSubscribed', result);\n return decoded[0];\n } catch {\n return false;\n }\n }\n\n /**\n * Get the active subscription ID between subscriber and creator\n * @param subscriber The subscriber address\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getActiveSubscriptionId(\n subscriber: string,\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('activeSubscription', [subscriber, creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('activeSubscription', result);\n const subscriptionId = decoded[0];\n\n // bytes32(0) means no active subscription\n if (subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n return subscriptionId;\n } catch {\n return null;\n }\n }\n\n /**\n * Get subscription details by ID\n * @param subscriptionId The subscription ID\n * @param provider JSON-RPC provider\n */\n async getSubscription(\n subscriptionId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<Subscription | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getSubscription', [subscriptionId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getSubscription', result);\n const sub = decoded[0];\n\n // Check if subscription exists (subscriptionId != 0)\n if (sub.subscriptionId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Map status enum\n let status: 'active' | 'cancelled' | 'expired';\n switch (Number(sub.status)) {\n case SubscriptionStatus.Active:\n status = 'active';\n break;\n case SubscriptionStatus.Cancelled:\n status = 'cancelled';\n break;\n case SubscriptionStatus.Expired:\n status = 'expired';\n break;\n default:\n status = 'active';\n }\n\n return {\n subscriptionId: sub.subscriptionId,\n planId: sub.planId,\n creator: sub.creator,\n subscriber: sub.subscriber,\n startTime: Number(sub.startTime),\n endTime: Number(sub.endTime),\n autoRenew: sub.autoRenew,\n status,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get a specific plan by ID\n * @param planId The plan ID\n * @param provider JSON-RPC provider\n */\n async getPlan(\n planId: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan | null> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getPlan', [planId]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getPlan', result);\n const plan = decoded[0];\n\n // Check if plan exists (planId != 0)\n if (plan.planId === '0x0000000000000000000000000000000000000000000000000000000000000000') {\n return null;\n }\n\n // Convert duration from days to seconds\n const durationSeconds = Number(plan.durationDays) * 24 * 60 * 60;\n\n return {\n planId: plan.planId,\n name: plan.name,\n description: plan.description,\n price: plan.price,\n paymentToken: plan.paymentToken,\n duration: durationSeconds,\n perks: [], // Not stored on-chain\n maxSubscribers: Number(plan.maxSubscribers),\n nftBadge: false, // Not stored on-chain in this contract version\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get all plan IDs for a creator\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlanIds(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<string[]> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('getCreatorPlans', [creator]);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('getCreatorPlans', result);\n return decoded[0] as string[];\n } catch {\n return [];\n }\n }\n\n /**\n * Get all plans for a creator with full details\n * @param creator The creator address\n * @param provider JSON-RPC provider\n */\n async getCreatorPlans(\n creator: string,\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<SubscriptionPlan[]> {\n const planIds = await this.getCreatorPlanIds(creator, provider);\n const plans: SubscriptionPlan[] = [];\n\n for (const planId of planIds) {\n const plan = await this.getPlan(planId, provider);\n if (plan && plan.planId) {\n plans.push(plan);\n }\n }\n\n return plans;\n }\n\n /**\n * Get platform fee in basis points\n * @param provider JSON-RPC provider\n */\n async getPlatformFeeBps(\n provider: { call: (tx: object) => Promise<string> }\n ): Promise<number> {\n const iface = new (await import('ethers')).Interface(this.abi);\n const data = iface.encodeFunctionData('platformFeeBps', []);\n\n try {\n const result = await provider.call({\n to: this.contractAddress,\n data,\n });\n\n const decoded = iface.decodeFunctionResult('platformFeeBps', result);\n return Number(decoded[0]);\n } catch {\n return 300; // Default 3%\n }\n }\n\n /**\n * Calculate the total cost for a subscription\n * @param planPrice The plan price per period\n * @param months Number of months\n */\n calculateSubscriptionCost(planPrice: bigint, months: number): bigint {\n return planPrice * BigInt(months);\n }\n\n /**\n * Calculate platform fee for a given amount\n * @param amount The amount\n * @param feeBps Fee in basis points (default: 1000 = 10%)\n * Platform keeps 10%, Creator receives 90%\n */\n calculateFee(amount: bigint, feeBps: number = 1000): { fee: bigint; creatorAmount: bigint } {\n const fee = (amount * BigInt(feeBps)) / 10000n;\n return {\n fee,\n creatorAmount: amount - fee,\n };\n }\n}\n","import type {\n EarningsBreakdown,\n EarningsResponse,\n PayoutHistoryResponse,\n BreakdownResponse,\n PlatformFeeResponse,\n ClaimResult,\n RevenueSplit,\n TxResult,\n} from '../types';\nimport { getZubariApiClient, ZubariApiClient } from '../services/ZubariApiClient';\n\n// ZubariPayouts contract function selectors\nconst PAYOUTS_SELECTORS = {\n getEarningsBreakdown: '0xd4e9329c', // getEarningsBreakdown(address)\n claimEarnings: '0x48c54b9d', // claimEarnings(address)\n claimPartialEarnings: '0x7e3bfb5a', // claimPartialEarnings(address,uint256)\n setRevenueSplit: '0x92a8e3f5', // setRevenueSplit((address,uint256)[])\n getRevenueSplit: '0x6c8a4fd0', // getRevenueSplit(address)\n removeRevenueSplit: '0x8a4e3c5b', // removeRevenueSplit()\n};\n\n/**\n * ZubariPayoutsProtocol - Creator earnings management\n *\n * Handles earnings tracking, claiming, revenue splits,\n * and conversion to stablecoins.\n */\nexport class ZubariPayoutsProtocol {\n private readonly contractAddress: string;\n private readonly chainId: number;\n private readonly apiBaseUrl: string;\n private readonly apiClient: ZubariApiClient;\n\n constructor(contractAddress: string, chainId: number, apiBaseUrl?: string) {\n this.contractAddress = contractAddress;\n this.chainId = chainId;\n this.apiBaseUrl = apiBaseUrl || 'https://ckgwifsxka.us-east-2.awsapprunner.com';\n this.apiClient = getZubariApiClient({ baseUrl: this.apiBaseUrl });\n }\n\n /**\n * Get pending earnings breakdown for the current user via API\n * Uses backend API which reads from contract/database\n */\n async getPendingEarnings(authToken: string): Promise<EarningsBreakdown> {\n try {\n const response = await this.apiClient.getEarnings();\n\n if (response.success && response.earningsBreakdown) {\n const breakdown = response.earningsBreakdown;\n return {\n tips: BigInt(breakdown.tips || '0'),\n subscriptions: BigInt(breakdown.subscriptions || '0'),\n nftSales: BigInt(breakdown.nftSales || '0'),\n royalties: BigInt(breakdown.royalties || '0'),\n total: BigInt(breakdown.tips || '0') +\n BigInt(breakdown.subscriptions || '0') +\n BigInt(breakdown.nftSales || '0') +\n BigInt(breakdown.royalties || '0'),\n };\n }\n\n return {\n tips: BigInt(0),\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(0),\n };\n } catch (error) {\n console.error('Failed to get pending earnings:', error);\n return {\n tips: BigInt(0),\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(0),\n };\n }\n }\n\n /**\n * Get earnings data from API (includes pending, total, breakdown, and recent payouts)\n * Requires authentication token\n */\n async getEarnings(authToken: string): Promise<EarningsResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/earnings`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings');\n }\n\n return response.json();\n }\n\n /**\n * Get payout history with pagination\n * Requires authentication token\n */\n async getPayoutHistory(\n authToken: string,\n page: number = 1,\n limit: number = 20\n ): Promise<PayoutHistoryResponse> {\n const response = await fetch(\n `${this.apiBaseUrl}/api/payouts/history?page=${page}&limit=${limit}`,\n {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch payout history');\n }\n\n return response.json();\n }\n\n /**\n * Get earnings breakdown by source with percentages\n * Requires authentication token\n */\n async getBreakdown(authToken: string): Promise<BreakdownResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/breakdown`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch earnings breakdown');\n }\n\n return response.json();\n }\n\n /**\n * Get current platform fee\n */\n async getPlatformFee(): Promise<PlatformFeeResponse> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/platform-fee`, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to fetch platform fee');\n }\n\n return response.json();\n }\n\n /**\n * Get historical earnings for a time period via API\n */\n async getEarningsHistory(\n authToken: string,\n period: 'day' | 'week' | 'month' | 'all' = 'all'\n ): Promise<EarningsBreakdown[]> {\n try {\n const response = await this.apiClient.getPayoutHistory({\n limit: period === 'day' ? 24 : period === 'week' ? 7 : period === 'month' ? 30 : 100,\n });\n\n if (response.success && response.payouts) {\n // Convert payout history to earnings breakdown format\n return response.payouts.map(payout => ({\n tips: BigInt(0), // Individual payouts don't have breakdown\n subscriptions: BigInt(0),\n nftSales: BigInt(0),\n royalties: BigInt(0),\n total: BigInt(payout.amount || '0'),\n timestamp: payout.createdAt,\n status: payout.status,\n }));\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get earnings history:', error);\n return [];\n }\n }\n\n /**\n * Claim all pending earnings via API\n * Requires authentication token and seed phrase\n */\n async claimEarningsViaApi(authToken: string, seed: string): Promise<ClaimResult> {\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/claim`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${authToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ seed }),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error || 'Failed to claim earnings');\n }\n\n return response.json();\n }\n\n /**\n * Claim all pending earnings (direct contract call)\n * Requires a signer with sendTransaction capability\n */\n async claimEarnings(\n tokenAddress: string,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n // Encode claimEarnings(address token) call\n const encodedToken = tokenAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const data = `${PAYOUTS_SELECTORS.claimEarnings}${encodedToken}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { token: tokenAddress },\n };\n } catch (error) {\n console.error('Failed to claim earnings:', error);\n throw new Error(`Claim failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Claim specific amount of earnings\n * Requires a signer with sendTransaction capability\n */\n async claimPartialEarnings(\n tokenAddress: string,\n amount: bigint,\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n try {\n // Encode claimPartialEarnings(address token, uint256 amount) call\n const encodedToken = tokenAddress.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedAmount = amount.toString(16).padStart(64, '0');\n const data = `${PAYOUTS_SELECTORS.claimPartialEarnings}${encodedToken}${encodedAmount}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { token: tokenAddress, amount: amount.toString() },\n };\n } catch (error) {\n console.error('Failed to claim partial earnings:', error);\n throw new Error(`Partial claim failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Setup revenue split with collaborators\n * Basis points must sum to 10000 (100%)\n * Requires a signer with sendTransaction capability\n */\n async setupRevenueSplit(\n splits: RevenueSplit[],\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n // Validate that basis points sum to 100%\n const totalBps = splits.reduce((sum, split) => sum + split.basisPoints, 0);\n if (totalBps !== 10000) {\n throw new Error('Revenue splits must sum to 100% (10000 basis points)');\n }\n\n // Validate each split\n for (const split of splits) {\n if (split.basisPoints <= 0) {\n throw new Error('Each split must have positive basis points');\n }\n if (!split.recipient || split.recipient.length === 0) {\n throw new Error('Each split must have a valid recipient address');\n }\n }\n\n try {\n // Encode setRevenueSplit((address,uint256)[]) call\n // ABI encode the array of structs\n const offset = '0'.padStart(64, '0').slice(-64); // Offset to array data (32 bytes = 0x20)\n const arrayLength = splits.length.toString(16).padStart(64, '0');\n\n let encodedSplits = '';\n for (const split of splits) {\n const encodedRecipient = split.recipient.toLowerCase().replace('0x', '').padStart(64, '0');\n const encodedBps = split.basisPoints.toString(16).padStart(64, '0');\n encodedSplits += encodedRecipient + encodedBps;\n }\n\n const data = `${PAYOUTS_SELECTORS.setRevenueSplit}${'0000000000000000000000000000000000000000000000000000000000000020'}${arrayLength}${encodedSplits}`;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n metadata: { splits },\n };\n } catch (error) {\n console.error('Failed to setup revenue split:', error);\n throw new Error(`Revenue split setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get current revenue split configuration via API\n */\n async getRevenueSplit(creatorAddress: string): Promise<RevenueSplit[]> {\n try {\n // Use API to get revenue split configuration\n const response = await fetch(`${this.apiBaseUrl}/api/payouts/revenue-split/${creatorAddress}`, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (response.ok) {\n const data = await response.json();\n if (data.success && data.splits) {\n return data.splits;\n }\n }\n\n return [];\n } catch (error) {\n console.error('Failed to get revenue split:', error);\n return [];\n }\n }\n\n /**\n * Remove revenue split (creator gets 100%)\n * Requires a signer with sendTransaction capability\n */\n async removeRevenueSplit(\n signer: { sendTransaction: (tx: object) => Promise<{ hash: string }> }\n ): Promise<TxResult> {\n try {\n const data = PAYOUTS_SELECTORS.removeRevenueSplit;\n\n const tx = await signer.sendTransaction({\n to: this.contractAddress,\n data,\n value: '0x0',\n });\n\n return {\n hash: tx.hash,\n network: 'ethereum',\n status: 'pending',\n };\n } catch (error) {\n console.error('Failed to remove revenue split:', error);\n throw new Error(`Remove revenue split failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Convert earnings to stablecoin (USDT) via swap\n * This will be implemented when SwapService is complete\n */\n async convertToStable(\n token: string,\n amount: bigint,\n swapService?: { executeSwap: (params: object) => Promise<TxResult> }\n ): Promise<TxResult> {\n if (amount <= 0n) {\n throw new Error('Amount must be greater than 0');\n }\n\n if (!swapService) {\n throw new Error('SwapService required for conversion. Import and pass SwapService instance.');\n }\n\n try {\n // Delegate to SwapService for the actual swap\n return await swapService.executeSwap({\n tokenIn: token,\n tokenOut: '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT mainnet\n amountIn: amount,\n slippageBps: 50, // 0.5% slippage\n });\n } catch (error) {\n console.error('Failed to convert to stable:', error);\n throw new Error(`Conversion failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get the contract address\n */\n getContractAddress(): string {\n return this.contractAddress;\n }\n\n /**\n * Get the chain ID\n */\n getChainId(): number {\n return this.chainId;\n }\n}\n"]}