payweave 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/_tsup-dts-rollup.d.ts +19470 -0
- package/dist/chunk-4R5OGOCC.js +94 -0
- package/dist/chunk-4R5OGOCC.js.map +1 -0
- package/dist/chunk-535Q3GUN.js +175 -0
- package/dist/chunk-535Q3GUN.js.map +1 -0
- package/dist/chunk-67NRYGRC.js +192 -0
- package/dist/chunk-67NRYGRC.js.map +1 -0
- package/dist/chunk-CGQ73I4I.js +568 -0
- package/dist/chunk-CGQ73I4I.js.map +1 -0
- package/dist/chunk-CJEYDHY6.js +18 -0
- package/dist/chunk-CJEYDHY6.js.map +1 -0
- package/dist/chunk-CR63JAAS.js +3 -0
- package/dist/chunk-CR63JAAS.js.map +1 -0
- package/dist/chunk-E633MKVX.js +1507 -0
- package/dist/chunk-E633MKVX.js.map +1 -0
- package/dist/chunk-FBPOCXRZ.js +1135 -0
- package/dist/chunk-FBPOCXRZ.js.map +1 -0
- package/dist/chunk-HTRGMZFH.js +267 -0
- package/dist/chunk-HTRGMZFH.js.map +1 -0
- package/dist/chunk-IUVGM3K7.js +765 -0
- package/dist/chunk-IUVGM3K7.js.map +1 -0
- package/dist/chunk-JD4OZHRI.js +326 -0
- package/dist/chunk-JD4OZHRI.js.map +1 -0
- package/dist/chunk-NV3MZF7L.js +139 -0
- package/dist/chunk-NV3MZF7L.js.map +1 -0
- package/dist/chunk-NXQBP35U.js +13 -0
- package/dist/chunk-NXQBP35U.js.map +1 -0
- package/dist/chunk-QJHXDZYC.js +412 -0
- package/dist/chunk-QJHXDZYC.js.map +1 -0
- package/dist/chunk-TWZK62TZ.js +83 -0
- package/dist/chunk-TWZK62TZ.js.map +1 -0
- package/dist/cli/index.js +35381 -0
- package/dist/core/index.d.ts +85 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/db/drizzle/index.d.ts +6 -0
- package/dist/db/drizzle/index.js +1532 -0
- package/dist/db/drizzle/index.js.map +1 -0
- package/dist/db/index.d.ts +43 -0
- package/dist/db/index.js +3 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/mongodb/index.d.ts +3 -0
- package/dist/db/mongodb/index.js +934 -0
- package/dist/db/mongodb/index.js.map +1 -0
- package/dist/db/mysql/index.d.ts +1 -0
- package/dist/db/mysql/index.js +12 -0
- package/dist/db/mysql/index.js.map +1 -0
- package/dist/db/postgres/index.d.ts +5 -0
- package/dist/db/postgres/index.js +791 -0
- package/dist/db/postgres/index.js.map +1 -0
- package/dist/db/prisma/index.d.ts +1 -0
- package/dist/db/prisma/index.js +12 -0
- package/dist/db/prisma/index.js.map +1 -0
- package/dist/db/sqlite/index.d.ts +5 -0
- package/dist/db/sqlite/index.js +750 -0
- package/dist/db/sqlite/index.js.map +1 -0
- package/dist/express/index.d.ts +1 -0
- package/dist/express/index.js +3 -0
- package/dist/express/index.js.map +1 -0
- package/dist/fastify/index.d.ts +1 -0
- package/dist/fastify/index.js +3 -0
- package/dist/fastify/index.js.map +1 -0
- package/dist/flutterwave/index.d.ts +27 -0
- package/dist/flutterwave/index.js +9 -0
- package/dist/flutterwave/index.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.js +3677 -0
- package/dist/index.js.map +1 -0
- package/dist/next/index.d.ts +1 -0
- package/dist/next/index.js +3 -0
- package/dist/next/index.js.map +1 -0
- package/dist/paystack/index.d.ts +33 -0
- package/dist/paystack/index.js +9 -0
- package/dist/paystack/index.js.map +1 -0
- package/dist/products/index.d.ts +22 -0
- package/dist/products/index.js +7 -0
- package/dist/products/index.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.js +69 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/unified/index.d.ts +41 -0
- package/dist/unified/index.js +6 -0
- package/dist/unified/index.js.map +1 -0
- package/dist/webhooks/index.d.ts +8 -0
- package/dist/webhooks/index.js +8 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +164 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/db/drizzle/detect.ts","../../../src/db/drizzle/errors.ts","../../../src/db/drizzle/id.ts","../../../src/db/drizzle/plan-content.ts","../../../src/db/drizzle/schema/mysql.ts","../../../src/db/drizzle/verify.ts","../../../src/db/drizzle/mysql-adapter.ts","../../../src/db/drizzle/schema/pg.ts","../../../src/db/drizzle/postgres-adapter.ts","../../../src/db/drizzle/schema/sqlite.ts","../../../src/db/drizzle/sqlite-adapter.ts","../../../src/db/drizzle/index.ts"],"names":["sql","period","remaining","applied","rows","ACTIVE_STATUS_SQL_LIST","pwCustomers","pwPlans","boolean","bigint","uniqueIndex","pwSubscriptions","pwFeatureBalances","pwWebhookEvents","DRIZZLE_KIT_INSTRUCTIONS","customersGetByExternalId","customersUpsert","customersLinkProviderRef","plansGetActiveVersion","plansListActive","plansPushVersion","subscriptionsGetActive","subscriptionsCreate","subscriptionsUpdate","balancesGet","balancesConsume","balancesResetTo","webhookEventsClaim","webhookEventsMarkApplied","eq","and","text","integer"],"mappings":";;;;;;;;;AAsCO,SAAS,oBAAA,CAAqB,IAAa,QAAA,EAA2C;AAC3F,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,IAAI,EAAA,YAAc,YAAY,OAAO,UAAA;AACrC,EAAA,IAAI,EAAA,YAAc,eAAe,OAAO,OAAA;AACxC,EAAA,IAAI,EAAA,YAAc,oBAAoB,OAAO,QAAA;AAC7C,EAAA,MAAM,IAAI,mBAAA;AAAA,IACR;AAAA,GAGF;AACF;;;ACpBA,SAAS,eAAe,KAAA,EAAoC;AAC1D,EAAA,MAAM,SAAU,KAAA,EAAqC,IAAA;AACrD,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AACvC,EAAA,MAAM,QAAS,KAAA,EAAiD,KAAA;AAChE,EAAA,MAAM,SAAS,KAAA,EAAO,IAAA;AACtB,EAAA,OAAO,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,MAAA;AAC/C;AAGA,SAAS,sBAAsB,KAAA,EAAyB;AACtD,EAAA,MAAM,IAAA,GAAO,eAAe,KAAK,CAAA;AACjC,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,KAAA;AAC/B,EAAA,OACE,IAAA,CAAK,WAAW,mBAAmB,CAAA;AAAA,EACnC,IAAA,KAAS,OAAA;AAAA,EACT,IAAA,KAAS,OAAA;AAAA,EACT,IAAA,KAAS,cAAA;AAEb;AAYO,SAAS,eAAA,CAAgB,OAAgB,OAAA,EAAgC;AAC9E,EAAA,IAAI,KAAA,YAAiB,eAAe,OAAO,KAAA;AAC3C,EAAA,IAAI,qBAAA,CAAsB,KAAK,CAAA,EAAG;AAChC,IAAA,OAAO,IAAI,uBAAA,CAAwB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,IAAI,cAAc,OAAA,EAAS,EAAE,OAAO,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA;AACxE;AC/CA,IAAM,QAAA,GAAW,kCAAA;AACjB,IAAM,eAAe,QAAA,CAAS,MAAA;AAC9B,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,UAAA,GAAa,EAAA;AAEnB,SAAS,UAAA,CAAW,QAAgB,GAAA,EAAqB;AACvD,EAAA,IAAI,CAAC,MAAA,CAAO,aAAA,CAAc,MAAM,CAAA,IAAK,SAAS,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,0DAAA,EAAwD,MAAM,CAAA,CAAE,CAAA;AAAA,EACvF;AACA,EAAA,IAAI,SAAA,GAAY,MAAA;AAChB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,MAAM,MAAM,SAAA,GAAY,YAAA;AACxB,IAAA,GAAA,GAAM,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAC7B,IAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,YAAY,CAAA;AAAA,EACjD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAK,CAAA,EAAA,EAAK;AAC5B,IAAA,GAAA,IAAO,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,YAAY,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,IAAA,CAAK,MAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,EAAW;AACxD,EAAA,OAAO,UAAA,CAAW,MAAA,EAAQ,QAAQ,CAAA,GAAI,aAAa,UAAU,CAAA;AAC/D;AAMO,SAAS,YAAA,CAAa,MAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,EAAW;AAChE,EAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAC5B;;;AC9CA,SAAS,gBAAgB,KAAA,EAAwB;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,eAAe,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACzE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC/C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAC5E,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI;AAAA,KAC3B;AACA,IAAA,OAAO,CAAA,CAAA,EAAI,QAAQ,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,GAAG,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,GAAG,CAAC,IAAI,eAAA,CAAgB,GAAG,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACpG;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAcA,IAAM,WAAA,GAAc,CAAC,CAAA,MAAwD;AAAA,EAC3E,OAAO,CAAA,CAAE,KAAA;AAAA,EACT,WAAW,CAAA,CAAE,SAAA;AAAA,EACb,MAAM,CAAA,CAAE,IAAA;AAAA,EACR,YAAY,CAAA,CAAE,UAAA;AAAA,EACd,eAAe,CAAA,CAAE,aAAA;AAAA,EACjB,eAAe,CAAA,CAAE,aAAA;AAAA,EACjB,UAAU,CAAA,CAAE,QAAA;AAAA,EACZ,cAAc,CAAA,CAAE;AAClB,CAAA,CAAA;AAGO,SAAS,iBAAA,CAAkB,QAAuB,KAAA,EAAoC;AAC3F,EAAA,OAAO,eAAA,CAAgB,YAAY,MAAM,CAAC,MAAM,eAAA,CAAgB,WAAA,CAAY,KAAK,CAAC,CAAA;AACpF;ACCA,IAAM,yBAAyB,GAAA,CAAI,GAAA;AAAA,EACjC,+BAAA,CAAgC,IAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI;AAChE,CAAA;AAEA,IAAM,UAAA,GAAa,EAAE,OAAA,EAAS,SAAA,EAAoB,SAAS,aAAA,EAAuB;AAE3E,IAAM,WAAA,GAAc,UAAA,CAAW,SAAA,CAAU,SAAA,EAAW;AAAA,EACzD,EAAA,EAAI,QAAQ,IAAA,EAAM,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA,EAC9C,UAAA,EAAY,OAAA,CAAQ,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAA,EAAK,GAAG,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,MAAA,EAAO;AAAA,EACpF,aAAa,IAAA,CAAK,cAAc,CAAA,CAAE,KAAA,GAAgC,OAAA,EAAQ;AAAA,EAC1E,OAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EACvC,SAAA,EAAW,SAAS,YAAA,EAAc,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,EACtD,SAAA,EAAW,SAAS,YAAA,EAAc,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA;AAChD,CAAC,CAAA;AAEM,IAAM,OAAA,GAAU,UAAA;AAAA,EACrB,SAAA,CAAU,KAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAI,QAAQ,IAAA,EAAM,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA,IAC9C,MAAA,EAAQ,QAAQ,SAAA,EAAW,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IACpD,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,KAAA,EAAO,QAAQ,OAAA,EAAS,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IACjD,SAAA,EAAW,OAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACzC,MAAM,OAAA,CAAQ,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACrC,YAAY,MAAA,CAAO,aAAA,EAAe,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,IACpD,eAAe,OAAA,CAAQ,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACxD,aAAA,EAAe,QAAQ,gBAAA,EAAkB,EAAE,QAAQ,GAAA,EAAK,EAAE,KAAA,EAAuB;AAAA,IACjF,UAAU,IAAA,CAAK,UAAU,CAAA,CAAE,KAAA,GAA4C,OAAA,EAAQ;AAAA,IAC/E,cAAc,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,GAAgD,OAAA,EAAQ;AAAA,IAC5F,QAAA,EAAU,SAAS,WAAA,EAAa,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA;AAAQ,GACtD;AAAA,EACA,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,6BAA6B,CAAA,CAAE,EAAA,CAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAC;AAC5E,CAAA;AAEO,IAAM,eAAA,GAAkB,UAAA;AAAA,EAC7B,SAAA,CAAU,aAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAI,QAAQ,IAAA,EAAM,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA,IAC9C,UAAA,EAAY,OAAA,CAAQ,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA,CAC/C,OAAA,EAAQ,CACR,UAAA,CAAW,MAAM,YAAY,EAAE,CAAA;AAAA,IAClC,MAAA,EAAQ,QAAQ,SAAA,EAAW,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IACpD,WAAA,EAAa,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IACzC,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAK,GAAG,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChE,MAAA,EAAQ,OAAA,CAAQ,QAAA,EAAU,EAAE,MAAA,EAAQ,GAAA,EAAK,GAAG,UAAA,EAAY,CAAA,CAAE,KAAA,EAA4B,CAAE,OAAA,EAAQ;AAAA,IAChG,UAAU,OAAA,CAAQ,UAAA,EAAY,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC7C,yBAAyB,OAAA,CAAQ,2BAAA,EAA6B,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC7E,kBAAA,EAAoB,SAAS,sBAAA,EAAwB,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IACzE,gBAAA,EAAkB,SAAS,oBAAA,EAAsB,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IACrE,iBAAA,EAAmB,OAAA,CAAQ,sBAAsB,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC3D,SAAA,EAAW,SAAS,YAAA,EAAc,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IACtD,SAAA,EAAW,SAAS,YAAA,EAAc,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,IAGtD,YAAY,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,iBAAA;AAAA,MAC7C,gBAAgB,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAC,QAAQ,sBAAsB,CAAA,wBAAA,CAAA;AAAA,MACtE,EAAE,MAAM,QAAA;AAAS;AACnB,GACF;AAAA,EACA,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,4BAA4B,CAAA,CAAE,EAAA,CAAG,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,UAAU,CAAC;AAC3F,CAAA;AAEO,IAAM,iBAAA,GAAoB,UAAA;AAAA,EAC/B,SAAA,CAAU,eAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAI,QAAQ,IAAA,EAAM,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA,IAC9C,UAAA,EAAY,OAAA,CAAQ,aAAA,EAAe,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA,CAC/C,OAAA,EAAQ,CACR,UAAA,CAAW,MAAM,YAAY,EAAE,CAAA;AAAA,IAClC,SAAA,EAAW,QAAQ,YAAA,EAAc,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IAC1D,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAK,GAAG,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChE,IAAA,EAAM,OAAO,MAAA,EAAQ,EAAE,MAAM,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA,IACjD,KAAA,EAAO,OAAO,OAAA,EAAS,EAAE,MAAM,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA,IACnD,aAAA,EAAe,OAAA,CAAQ,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAK,CAAA,CAAE,KAAA,EAAuB,CAAE,OAAA,EAAQ;AAAA,IAC3F,MAAA,EAAQ,SAAS,QAAA,EAAU,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IAC/C,WAAA,EAAa,SAAS,cAAA,EAAgB,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IAC1D,SAAA,EAAW,SAAS,YAAA,EAAc,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,IACtD,MAAA,EAAQ,QAAQ,SAAA,EAAW,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,IACpD,WAAA,EAAa,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IACzC,SAAA,EAAW,SAAS,YAAA,EAAc,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA;AAAQ,GACxD;AAAA,EACA,CAAC,CAAA,KAAM;AAAA,IACL,WAAA,CAAY,+CAA+C,CAAA,CAAE,EAAA;AAAA,MAC3D,CAAA,CAAE,UAAA;AAAA,MACF,CAAA,CAAE,SAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACJ;AAEJ,CAAA;AAEO,IAAM,eAAA,GAAkB,UAAA,CAAW,SAAA,CAAU,aAAA,EAAe;AAAA,EACjE,SAAA,EAAW,QAAQ,YAAA,EAAc,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA,EAC7D,QAAA,EAAU,QAAQ,UAAA,EAAY,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,EACvD,IAAA,EAAM,QAAQ,MAAA,EAAQ,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,EAC/C,UAAA,EAAY,SAAS,aAAA,EAAe,EAAE,KAAK,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,EACxD,WAAW,QAAA,CAAS,YAAA,EAAc,EAAE,GAAA,EAAK,GAAG,CAAA;AAAA,EAC5C,WAAW,QAAA,CAAS,YAAA,EAAc,EAAE,GAAA,EAAK,GAAG;AAC9C,CAAC,CAAA;AAGM,IAAM,WAAA,GAAc;AAAA,EACzB,WAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF;ACpIA,IAAM,eAAA,GAA0C;AAAA,EAC9C,SAAA,CAAU,SAAA;AAAA,EACV,SAAA,CAAU,KAAA;AAAA,EACV,SAAA,CAAU,aAAA;AAAA,EACV,SAAA,CAAU,eAAA;AAAA,EACV,SAAA,CAAU;AACZ,CAAA;AAEA,IAAM,gBAAA,GACJ,sOAAA;AAIF,SAAS,mBAAmB,OAAA,EAAiD;AAC3E,EAAA,OAAO,IAAI,mBAAA;AAAA,IACT,kGACe,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,WAAW,gBAAgB,CAAA;AAAA,GAC9D;AACF;AAKA,eAAe,kBAAkB,KAAA,EAAsC;AACrE,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,IAAA,IAAI,CAAE,MAAM,KAAA,CAAM,KAAK,CAAA,EAAI,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,eAAe,KAAA,EAAwC;AACrE,EAAA,IAAI,MAAA;AACJ,EAAA,OAAO,SAAS,cAAA,GAAgC;AAC9C,IAAA,MAAA,KAAA,CAAY,YAAY;AACtB,MAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,KAAK,CAAA;AAC7C,MAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,MAAM,mBAAmB,OAAO,CAAA;AAAA,IAC1D,CAAA,GAAG,CAAE,KAAA,CAAM,CAAC,KAAA,KAAmB;AAC7B,MAAA,MAAA,GAAS,MAAA;AACT,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AACD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAGA,eAAsB,2BAA2B,KAAA,EAAsC;AACrF,EAAA,OAAO,kBAAkB,KAAK,CAAA;AAChC;AAuBO,SAAS,qBAAqB,EAAA,EAAgC;AACnE,EAAA,OAAO,OAAO,KAAA,KAAU;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAG,GAAA,CAAIA,GAAAA,CAAAA,cAAAA,EAAoBA,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA,QAAA,CAAU,CAAA;AAChE,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;AAEO,SAAS,kBAAkB,EAAA,EAA+B;AAC/D,EAAA,OAAO,OAAO,KAAA,KAAU;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,GAAG,OAAA,CAAQA,GAAAA,CAAAA,cAAAA,EAAoBA,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA,QAAA,CAAU,CAAA;AACpE,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACF;;;AC1DA,IAAM,wBAAA,GACJ,+QAAA;AAUF,SAAS,cAAc,GAAA,EAAgC;AACrD,EAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAC7C,EAAA,MAAM,eAAgB,MAAA,EAA8C,YAAA;AACpE,EAAA,OAAO,EAAE,YAAA,EAAc,OAAO,YAAA,KAAiB,QAAA,GAAW,eAAe,CAAA,EAAE;AAC7E;AAGO,SAAS,kBAAkB,EAAA,EAAqC;AACrE,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,iBAAA,CAAkB,EAAE,CAAC,CAAA;AAC3D,EAAA,SAAS,QACP,EAAA,EAC+B;AAC/B,IAAA,OAAO,UAAU,IAAA,KAAe;AAC9B,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACnB,CAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,SAAA,EAAW;AAAA,MACT,iBAAiB,OAAA,CAAQ,CAAC,eAAuB,wBAAA,CAAyB,EAAA,EAAI,UAAU,CAAC,CAAA;AAAA,MACzF,QAAQ,OAAA,CAAQ,CAAC,UAA4B,eAAA,CAAgB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MACvE,eAAA,EAAiB,OAAA;AAAA,QAAQ,CAAC,YAAoB,QAAA,EAAkB,GAAA,KAC9D,yBAAyB,EAAA,EAAI,UAAA,EAAY,UAAU,GAAG;AAAA;AACxD,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,kBAAkB,OAAA,CAAQ,CAAC,WAAmB,qBAAA,CAAsB,EAAA,EAAI,MAAM,CAAC,CAAA;AAAA,MAC/E,UAAA,EAAY,OAAA,CAAQ,MAAM,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,MAC7C,aAAa,OAAA,CAAQ,CAAC,SAA6B,gBAAA,CAAiB,EAAA,EAAI,IAAI,CAAC;AAAA,KAC/E;AAAA,IACA,aAAA,EAAe;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,QAAQ,CAAC,UAAA,EAAoB,KAAA,KACtC,sBAAA,CAAuB,EAAA,EAAI,YAAY,KAAK;AAAA,OAC9C;AAAA,MACA,QAAQ,OAAA,CAAQ,CAAC,UAA+B,mBAAA,CAAoB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MAC9E,MAAA,EAAQ,OAAA;AAAA,QAAQ,CAAC,EAAA,EAAY,KAAA,KAC3B,mBAAA,CAAoB,EAAA,EAAI,IAAI,KAAK;AAAA;AACnC,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,GAAA,EAAK,OAAA;AAAA,QAAQ,CAAC,YAAoB,SAAA,EAAmB,KAAA,KACnD,YAAY,EAAA,EAAI,UAAA,EAAY,WAAW,KAAK;AAAA,OAC9C;AAAA,MACA,SAAS,OAAA,CAAQ,CAAC,UAA0B,eAAA,CAAgB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MACtE,OAAA,EAAS,OAAA;AAAA,QACP,CAAC,UAAA,EAAoB,SAAA,EAAmB,KAAA,EAAe,IAAA,KACrD,gBAAgB,EAAA,EAAI,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,IAAI;AAAA;AAC1D,KACF;AAAA,IACA,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,QACL,CACE,SAAA,EACA,IAAA,KACG,kBAAA,CAAmB,EAAA,EAAI,WAAW,IAAI;AAAA,OAC7C;AAAA,MACA,aAAa,OAAA,CAAQ,CAAC,cAAsB,wBAAA,CAAyB,EAAA,EAAI,SAAS,CAAC;AAAA,KACrF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,QAAQ,YAAY;AAClB,QAAA,MAAM,OAAA,GAAU,MAAM,0BAAA,CAA2B,iBAAA,CAAkB,EAAE,CAAC,CAAA;AACtE,QAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,GACpB,EAAE,OAAA,EAAS,CAAC,WAAW,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE,GACtC,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,CAAC,WAAW,CAAA,EAAE;AAAA,MAC5C,CAAA;AAAA,MACA,KAAA,EAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,SAAS,EAAC,EAAG,YAAA,EAAc,wBAAA,EAA0B;AAAA,KACtF;AAAA,IACA,WAAA,EAAa,CAAC,EAAA,KAAO,EAAA,CAAG,WAAA,CAAY,CAAC,EAAA,KAAO,EAAA,CAAG,iBAAA,CAAkB,EAAE,CAAC,CAAC;AAAA,GACvE;AACF;AAIA,eAAe,wBAAA,CAAyB,IAAoB,UAAA,EAAoB;AAC9E,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAK,WAAW,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,UAAA,EAAY,UAAU,CAAC,CAAA;AAC7F,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAe,eAAA,CAAgB,IAAoB,KAAA,EAAyB;AAC1E,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AAKrC,EAAA,MAAM,GAAA,GAA+B,EAAE,SAAA,EAAW,GAAA,EAAI;AACtD,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,QAAQ,KAAA,CAAM,KAAA;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CACH,MAAA,CAAO,WAAW,CAAA,CAClB,MAAA,CAAO;AAAA,MACN,EAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,aAAa,EAAC;AAAA,MACd,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,MACtB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA,CACA,oBAAA,CAAqB,EAAE,KAAK,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,GAAS,IAAA,CAAK,WAAW,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,WAAA,CAAY,UAAA,EAAY,KAAA,CAAM,UAAU,CAAC,CAAA;AACnG,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,2DAA2D,CAAA;AACrF,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,8CAAA,EAAiD,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAC,CAAA,SAAA;AAAA,KACnF;AAAA,EACF;AACF;AAEA,eAAe,wBAAA,CACb,EAAA,EACA,UAAA,EACA,QAAA,EACA,GAAA,EACe;AACf,EAAA,MAAM,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AACjC,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,EAAO,CACP,KAAK,WAAW,CAAA,CAChB,KAAA,CAAM,EAAA,CAAG,YAAY,UAAA,EAAY,UAAU,CAAC,CAAA,CAC5C,IAAI,QAAQ,CAAA;AACf,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,oFAAA,EACK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA,CAAA;AAAA,OACjC;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,EAAE,GAAG,GAAA,CAAI,aAAa,CAAC,QAAQ,GAAG,GAAA,EAAI;AAC1D,IAAA,MAAM,GACH,MAAA,CAAO,WAAW,EAClB,GAAA,CAAI,EAAE,aAAa,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,CAAA,CAC1C,KAAA,CAAM,GAAG,WAAA,CAAY,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAIA,eAAe,qBAAA,CAAsB,IAAoB,MAAA,EAAgB;AACvE,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAChB,MAAA,GACA,IAAA,CAAK,OAAO,CAAA,CACZ,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,QAAQ,MAAM,CAAC,EAChC,OAAA,CAAQA,GAAAA,CAAAA,EAAM,QAAQ,OAAO,CAAA,KAAA,CAAO,CAAA,CACpC,KAAA,CAAM,CAAC,CAAA;AACV,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAe,gBAAgB,EAAA,EAAoB;AACjD,EAAA,MAAM,MAAA,GAAS,GACZ,MAAA,CAAO;AAAA,IACN,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAASA,GAAAA,CAAAA,IAAAA,EAAkB,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAA,CAAI,GAAG,aAAa;AAAA,GAC/D,CAAA,CACA,IAAA,CAAK,OAAO,CAAA,CACZ,QAAQ,OAAA,CAAQ,MAAM,CAAA,CACtB,EAAA,CAAG,QAAQ,CAAA;AACd,EAAA,OAAO,GACJ,MAAA,CAAO;AAAA,IACN,IAAI,OAAA,CAAQ,EAAA;AAAA,IACZ,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,UAAU,OAAA,CAAQ;AAAA,GACnB,EACA,IAAA,CAAK,OAAO,EACZ,SAAA,CAAU,MAAA,EAAQ,IAAI,EAAA,CAAG,MAAA,CAAO,QAAQ,OAAA,CAAQ,MAAM,GAAG,EAAA,CAAG,MAAA,CAAO,SAAS,OAAA,CAAQ,OAAO,CAAC,CAAC,CAAA;AAClG;AAEA,eAAe,gBAAA,CAAiB,IAAoB,IAAA,EAA0B;AAC5E,EAAA,OAAO,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AAClC,IAAA,MAAM,UAAA,GAAa,MAAM,EAAA,CACtB,MAAA,EAAO,CACP,IAAA,CAAK,OAAO,CAAA,CACZ,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAC,CAAA,CACrC,OAAA,CAAQA,GAAAA,CAAAA,EAAM,OAAA,CAAQ,OAAO,CAAA,KAAA,CAAO,CAAA,CACpC,KAAA,CAAM,CAAC,CAAA,CACP,GAAA,CAAI,QAAQ,CAAA;AACf,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA;AAChC,IAAA,IAAI,MAAA,IAAU,iBAAA,CAAkB,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,IAAA,MAAM,WAAA,GAAA,CAAe,MAAA,EAAQ,OAAA,IAAW,CAAA,IAAK,CAAA;AAC7C,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA,CAAO;AAAA,MAC9B,EAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS,WAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,OAAA,CAAQ,EAAA,EAAI,EAAE,CAAC,CAAA;AACrE,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,4DAA4D,CAAA;AACtF,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;AAIA,eAAe,sBAAA,CAAuB,EAAA,EAAoB,UAAA,EAAoB,KAAA,EAAe;AAC3F,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,QAAO,CACP,IAAA,CAAK,eAAe,CAAA,CACpB,KAAA;AAAA,IACC,GAAA;AAAA,MACE,EAAA,CAAG,eAAA,CAAgB,UAAA,EAAY,UAAU,CAAA;AAAA,MACzC,EAAA,CAAG,eAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAAA,MAC/BA,GAAAA,CAAAA,EAAM,eAAA,CAAgB,MAAM,CAAA,IAAA,EAAO,+BAA+B,CAAA;AAAA;AACpE,GACF;AACF,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAe,mBAAA,CAAoB,IAAoB,KAAA,EAA4B;AACjF,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,eAAe,CAAA,CAAE,MAAA,CAAO;AAAA,MACtC,EAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,yBAAyB,KAAA,CAAM,uBAAA;AAAA,MAC/B,oBAAoB,KAAA,CAAM,kBAAA;AAAA,MAC1B,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,mBAAmB,KAAA,CAAM,iBAAA;AAAA,MACzB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,eAAA,CAAgB,EAAA,EAAI,EAAE,CAAC,CAAA;AACrF,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,+DAA+D,CAAA;AACzF,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,+DAAA,EACK,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,8HAAA;AAAA,KAG5E;AAAA,EACF;AACF;AAEA,eAAe,mBAAA,CAAoB,EAAA,EAAoB,EAAA,EAAY,KAAA,EAA4B;AAC7F,EAAA,MAAM,GAAA,GAA+B,EAAE,SAAA,kBAAW,IAAI,MAAK,EAAE;AAC7D,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EACtC;AACA,EAAA,IAAI;AAMF,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,eAAe,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,eAAA,CAAgB,EAAA,EAAI,EAAE,CAAC,CAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAK,eAAe,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,eAAA,CAAgB,EAAA,EAAI,EAAE,CAAC,CAAA;AACrF,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,2EAAA,EACK,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAA;AAAA,OACzB;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,uBAAuB,MAAM,KAAA;AAClD,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,kDAAA,EAAqD,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,SAAA;AAAA,KACzE;AAAA,EACF;AACF;AAIA,eAAe,WAAA,CAAY,EAAA,EAAoB,UAAA,EAAoB,SAAA,EAAmB,KAAA,EAAe;AACnG,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,QAAO,CACP,IAAA,CAAK,iBAAiB,CAAA,CACtB,KAAA;AAAA,IACC,GAAA;AAAA,MACE,EAAA,CAAG,iBAAA,CAAkB,UAAA,EAAY,UAAU,CAAA;AAAA,MAC3C,EAAA,CAAG,iBAAA,CAAkB,SAAA,EAAW,SAAS,CAAA;AAAA,MACzC,EAAA,CAAG,iBAAA,CAAkB,KAAA,EAAO,KAAK;AAAA;AACnC,GACF;AACF,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAe,eAAA,CAAgB,IAAoB,KAAA,EAAiD;AAClG,EAAA,OAAO,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AAClC,IAAA,MAAM,eAAe,MAAM,EAAA,CACxB,QAAO,CACP,IAAA,CAAK,iBAAiB,CAAA,CACtB,KAAA;AAAA,MACC,GAAA;AAAA,QACE,EAAA,CAAG,iBAAA,CAAkB,UAAA,EAAY,KAAA,CAAM,UAAU,CAAA;AAAA,QACjD,EAAA,CAAG,iBAAA,CAAkB,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA;AAAA,QAC/C,EAAA,CAAG,iBAAA,CAAkB,KAAA,EAAO,KAAA,CAAM,KAAK;AAAA;AACzC,KACF,CACC,IAAI,QAAQ,CAAA;AACf,IAAA,MAAM,WAAA,GAAc,aAAa,CAAC,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,EAAQ;AAEhC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAMC,OAAAA,GAAS,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG,KAAA,CAAM,IAAA,CAAK,aAAA,EAAe,KAAK,CAAA;AACzF,MAAA,MAAMC,UAAAA,GAAY,MAAM,IAAA,CAAK,KAAA;AAC7B,MAAA,MAAMC,QAAAA,GAAU,KAAA,CAAM,WAAA,KAAgB,IAAA,IAAQD,cAAa,KAAA,CAAM,MAAA;AACjE,MAAA,MAAM,IAAA,GAAOC,QAAAA,GAAU,KAAA,CAAM,MAAA,GAAS,CAAA;AACtC,MAAA,MAAM,EAAA,GAAK,aAAa,KAAK,CAAA;AAC7B,MAAA,MAAM,EAAA,CAAG,MAAA,CAAO,iBAAiB,CAAA,CAAE,MAAA,CAAO;AAAA,QACxC,EAAA;AAAA,QACA,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,IAAA;AAAA,QACA,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA;AAAA,QAClB,aAAA,EAAe,MAAM,IAAA,CAAK,aAAA;AAAA,QAC1B,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,QACnB,WAAA,EAAa,IAAI,IAAA,CAAKF,OAAAA,CAAO,KAAK,CAAA;AAAA,QAClC,SAAA,EAAW,IAAI,IAAA,CAAKA,OAAAA,CAAO,GAAG,CAAA;AAAA,QAC9B,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,QACnB,WAAA,EAAa,MAAM,IAAA,CAAK,WAAA;AAAA,QACxB,WAAW,KAAA,CAAM;AAAA,OAClB,CAAA;AACD,MAAA,MAAMG,KAAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAK,iBAAiB,CAAA,CAAE,KAAA,CAAM,EAAA,CAAG,iBAAA,CAAkB,EAAA,EAAI,EAAE,CAAC,CAAA;AACzF,MAAA,MAAM,GAAA,GAAMA,MAAK,CAAC,CAAA;AAClB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,MACtF;AACA,MAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAAD,QAAAA,EAAQ;AAAA,IAC3B;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,IAAS,WAAA,CAAY,SAAA,CAAU,OAAA,EAAQ;AACxD,IAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,GAAI,WAAA,CAAY,IAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,WACX,aAAA,CAAc,WAAA,CAAY,OAAO,OAAA,EAAQ,EAAG,YAAY,aAAA,EAAe,KAAK,IAC5E,EAAE,KAAA,EAAO,YAAY,WAAA,CAAY,OAAA,IAAW,GAAA,EAAK,WAAA,CAAY,SAAA,CAAU,OAAA,EAAQ,EAAE;AACrF,IAAA,MAAM,SAAA,GAAY,YAAY,KAAA,GAAQ,QAAA;AACtC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,KAAgB,IAAA,IAAQ,aAAa,KAAA,CAAM,MAAA;AAEjE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AACzB,MAAA,OAAO,EAAE,GAAG,WAAA,EAAa,OAAA,EAAS,KAAA,EAAM;AAAA,IAC1C;AAEA,IAAA,MAAM,SAAA,GAAY,OAAA,GAAU,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,QAAA;AACtD,IAAA,MAAM,EAAA,CACH,MAAA,CAAO,iBAAiB,CAAA,CACxB,GAAA,CAAI;AAAA,MACH,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,MAC9B,WAAW,KAAA,CAAM;AAAA,KAClB,EACA,KAAA,CAAM,EAAA,CAAG,kBAAkB,EAAA,EAAI,WAAA,CAAY,EAAE,CAAC,CAAA;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAChB,MAAA,GACA,IAAA,CAAK,iBAAiB,CAAA,CACtB,KAAA,CAAM,EAAA,CAAG,iBAAA,CAAkB,EAAA,EAAI,WAAA,CAAY,EAAE,CAAC,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,KAAK,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,EAAE,GAAG,UAAA,EAAY,OAAA,EAAQ;AAAA,EAClC,CAAC,CAAA;AACH;AAEA,eAAe,eAAA,CACb,EAAA,EACA,UAAA,EACA,SAAA,EACA,OACA,IAAA,EACe;AACf,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,IAAA,CAAK,aAAA,EAAe,GAAA,CAAI,OAAA,EAAS,CAAA;AACrF,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,MAAM,EAAA,CACH,MAAA,CAAO,iBAAiB,CAAA,CACxB,MAAA,CAAO;AAAA,IACN,EAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,CAAA;AAAA,IACN,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,IAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,IAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACZ,EACA,oBAAA,CAAqB;AAAA,IACpB,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,CAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,MAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACL;AAIA,eAAe,kBAAA,CACb,EAAA,EACA,SAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,iBAAA,GAAoB,KAAK,iBAAA,IAAqB,4BAAA;AACpD,EAAA,MAAM,iBAAiB,IAAI,IAAA,CAAK,KAAK,GAAA,CAAI,OAAA,KAAY,iBAAiB,CAAA;AAItE,EAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,OAAA;AAAA,IACnBH,kBAAkB,eAAe,CAAA;AAAA,gBAAA,EACnB,SAAS,CAAA,EAAA,EAAK,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,GAAG,CAAA;AAAA,qFAAA,EACE,cAAc,CAAA,EAAA,EAAK,IAAA,CAAK,GAAG,CAAA,aAAA;AAAA,GAChH;AACA,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAGhC,EAAA,OAAO,MAAA,CAAO,YAAA,KAAiB,CAAA,IAAK,MAAA,CAAO,YAAA,KAAiB,CAAA;AAC9D;AAEA,eAAe,wBAAA,CAAyB,IAAoB,SAAA,EAAkC;AAC5F,EAAA,MAAM,GACH,MAAA,CAAO,eAAe,CAAA,CACtB,GAAA,CAAI,EAAE,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,CAAA,CAC7B,KAAA,CAAM,GAAG,eAAA,CAAgB,SAAA,EAAW,SAAS,CAAC,CAAA;AACnD;ACpfA,IAAMK,0BAAyBL,GAAAA,CAAI,GAAA;AAAA,EACjC,+BAAA,CAAgC,IAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI;AAChE,CAAA;AAEO,IAAMM,YAAAA,GAAc,OAAA,CAAQ,SAAA,CAAU,SAAA,EAAW;AAAA,EACtD,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,YAAY,IAAA,CAAK,aAAa,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EACjD,aAAa,KAAA,CAAM,cAAc,CAAA,CAAE,KAAA,GAAgC,OAAA,EAAQ;AAAA,EAC3E,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,EACnB,SAAA,EAAW,UAAU,YAAA,EAAc,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,EACnE,SAAA,EAAW,UAAU,YAAA,EAAc,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA;AAC7D,CAAC,CAAA;AAEM,IAAMC,QAAAA,GAAU,OAAA;AAAA,EACrB,SAAA,CAAU,KAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,IAC1B,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IACpC,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7B,SAAA,EAAWC,SAAAA,CAAQ,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACzC,IAAA,EAAM,KAAK,MAAM,CAAA;AAAA,IACjB,YAAYC,QAAAA,CAAO,aAAA,EAAe,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,IACpD,aAAA,EAAe,KAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,EAAuB;AAAA,IAC7D,UAAU,KAAA,CAAM,UAAU,CAAA,CAAE,KAAA,GAA4C,OAAA,EAAQ;AAAA,IAChF,cAAc,KAAA,CAAM,eAAe,CAAA,CAAE,KAAA,GAAgD,OAAA,EAAQ;AAAA,IAC7F,QAAA,EAAU,UAAU,WAAA,EAAa,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA;AAAQ,GACnE;AAAA,EACA,CAAC,CAAA,KAAM,CAACC,aAAAA,CAAY,6BAA6B,CAAA,CAAE,EAAA,CAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAC;AAC5E,CAAA;AAEO,IAAMC,gBAAAA,GAAkB,OAAA;AAAA,EAC7B,SAAA,CAAU,aAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,IAC1B,UAAA,EAAY,KAAK,aAAa,CAAA,CAC3B,SAAQ,CACR,UAAA,CAAW,MAAML,YAAAA,CAAY,EAAE,CAAA;AAAA,IAClC,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,WAAA,EAAa,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7C,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7B,QAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,GAA8B,OAAA,EAAQ;AAAA,IAC7D,QAAA,EAAU,KAAK,UAAU,CAAA;AAAA,IACzB,uBAAA,EAAyB,KAAK,2BAA2B,CAAA;AAAA,IACzD,kBAAA,EAAoB,UAAU,sBAAA,EAAwB,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,IACtF,gBAAA,EAAkB,UAAU,oBAAA,EAAsB,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,IAClF,iBAAA,EAAmBE,SAAAA,CAAQ,sBAAsB,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC3D,SAAA,EAAW,UAAU,YAAA,EAAc,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,IACnE,SAAA,EAAW,UAAU,YAAA,EAAc,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA;AAAQ,GACrE;AAAA,EACA,CAAC,CAAA,KAAM;AAAA,IACLE,aAAAA,CAAY,4BAA4B,CAAA,CACrC,EAAA,CAAG,EAAE,UAAA,EAAY,CAAA,CAAE,KAAK,CAAA,CACxB,MAAMV,GAAAA,CAAAA,EAAM,CAAA,CAAE,MAAM,CAAA,KAAA,EAAQK,uBAAsB,CAAA,CAAA,CAAG;AAAA;AAE5D,CAAA;AAEO,IAAMO,kBAAAA,GAAoB,OAAA;AAAA,EAC/B,SAAA,CAAU,eAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,IAC1B,UAAA,EAAY,KAAK,aAAa,CAAA,CAC3B,SAAQ,CACR,UAAA,CAAW,MAAMN,YAAAA,CAAY,EAAE,CAAA;AAAA,IAClC,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7B,IAAA,EAAMG,SAAO,MAAA,EAAQ,EAAE,MAAM,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA,IACjD,KAAA,EAAOA,SAAO,OAAA,EAAS,EAAE,MAAM,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA,IACnD,eAAe,IAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,GAAyB,OAAA,EAAQ;AAAA,IACvE,MAAA,EAAQ,UAAU,QAAA,EAAU,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,IAC5D,WAAA,EAAa,UAAU,cAAA,EAAgB,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,IACvE,SAAA,EAAW,UAAU,YAAA,EAAc,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,IACnE,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,WAAA,EAAa,OAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7C,SAAA,EAAW,UAAU,YAAA,EAAc,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA;AAAQ,GACrE;AAAA,EACA,CAAC,CAAA,KAAM;AAAA,IACLC,aAAAA,CAAY,+CAA+C,CAAA,CAAE,EAAA;AAAA,MAC3D,CAAA,CAAE,UAAA;AAAA,MACF,CAAA,CAAE,SAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACJ;AAEJ,CAAA;AAEO,IAAMG,gBAAAA,GAAkB,OAAA,CAAQ,SAAA,CAAU,aAAA,EAAe;AAAA,EAC9D,SAAA,EAAW,IAAA,CAAK,YAAY,CAAA,CAAE,UAAA,EAAW;AAAA,EACzC,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA,EACnC,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3B,UAAA,EAAY,UAAU,aAAA,EAAe,EAAE,cAAc,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,EACrE,WAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,EACzD,WAAW,SAAA,CAAU,YAAA,EAAc,EAAE,YAAA,EAAc,MAAM;AAC3D,CAAC,CAAA;AAGM,IAAM,QAAA,GAAW;AAAA,EACtB,WAAA,EAAAP,YAAAA;AAAA,EACA,OAAA,EAAAC,QAAAA;AAAA,EACA,eAAA,EAAAI,gBAAAA;AAAA,EACA,iBAAA,EAAAC,kBAAAA;AAAA,EACA,eAAA,EAAAC;AACF;;;ACxFA,IAAMC,yBAAAA,GACJ,4QAAA;AAMK,SAAS,qBAAqB,EAAA,EAAwC;AAC3E,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,iBAAA,CAAkB,EAAE,CAAC,CAAA;AAC3D,EAAA,SAAS,QACP,EAAA,EAC+B;AAC/B,IAAA,OAAO,UAAU,IAAA,KAAe;AAC9B,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACnB,CAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW;AAAA,MACT,iBAAiB,OAAA,CAAQ,CAAC,eAAuBC,yBAAAA,CAAyB,EAAA,EAAI,UAAU,CAAC,CAAA;AAAA,MACzF,QAAQ,OAAA,CAAQ,CAAC,UAA4BC,gBAAAA,CAAgB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MACvE,eAAA,EAAiB,OAAA;AAAA,QAAQ,CAAC,YAAoB,QAAA,EAAkB,GAAA,KAC9DC,0BAAyB,EAAA,EAAI,UAAA,EAAY,UAAU,GAAG;AAAA;AACxD,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,kBAAkB,OAAA,CAAQ,CAAC,WAAmBC,sBAAAA,CAAsB,EAAA,EAAI,MAAM,CAAC,CAAA;AAAA,MAC/E,UAAA,EAAY,OAAA,CAAQ,MAAMC,gBAAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,MAC7C,aAAa,OAAA,CAAQ,CAAC,SAA6BC,iBAAAA,CAAiB,EAAA,EAAI,IAAI,CAAC;AAAA,KAC/E;AAAA,IACA,aAAA,EAAe;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,QAAQ,CAAC,UAAA,EAAoB,KAAA,KACtCC,uBAAAA,CAAuB,EAAA,EAAI,YAAY,KAAK;AAAA,OAC9C;AAAA,MACA,QAAQ,OAAA,CAAQ,CAAC,UAA+BC,oBAAAA,CAAoB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MAC9E,MAAA,EAAQ,OAAA;AAAA,QAAQ,CAAC,EAAA,EAAY,KAAA,KAC3BC,oBAAAA,CAAoB,EAAA,EAAI,IAAI,KAAK;AAAA;AACnC,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,GAAA,EAAK,OAAA;AAAA,QAAQ,CAAC,YAAoB,SAAA,EAAmB,KAAA,KACnDC,aAAY,EAAA,EAAI,UAAA,EAAY,WAAW,KAAK;AAAA,OAC9C;AAAA,MACA,SAAS,OAAA,CAAQ,CAAC,UAA0BC,gBAAAA,CAAgB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MACtE,OAAA,EAAS,OAAA;AAAA,QACP,CAAC,UAAA,EAAoB,SAAA,EAAmB,KAAA,EAAe,IAAA,KACrDC,iBAAgB,EAAA,EAAI,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,IAAI;AAAA;AAC1D,KACF;AAAA,IACA,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,QACL,CACE,SAAA,EACA,IAAA,KACGC,mBAAAA,CAAmB,EAAA,EAAI,WAAW,IAAI;AAAA,OAC7C;AAAA,MACA,aAAa,OAAA,CAAQ,CAAC,cAAsBC,yBAAAA,CAAyB,EAAA,EAAI,SAAS,CAAC;AAAA,KACrF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,QAAQ,YAAY;AAClB,QAAA,MAAM,OAAA,GAAU,MAAM,0BAAA,CAA2B,iBAAA,CAAkB,EAAE,CAAC,CAAA;AACtE,QAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,GACpB,EAAE,OAAA,EAAS,CAAC,WAAW,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE,GACtC,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,CAAC,WAAW,CAAA,EAAE;AAAA,MAC5C,CAAA;AAAA,MACA,KAAA,EAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,SAAS,EAAC,EAAG,YAAA,EAAcd,yBAAAA,EAA0B;AAAA,KACtF;AAAA,IACA,WAAA,EAAa,CAAC,EAAA,KAAO,EAAA,CAAG,WAAA,CAAY,CAAC,EAAA,KAAO,EAAA,CAAG,oBAAA,CAAqB,EAAE,CAAC,CAAC;AAAA,GAC1E;AACF;AAIA,eAAeC,yBAAAA,CAAyB,IAAuB,UAAA,EAAoB;AACjF,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAKT,YAAW,CAAA,CAAE,KAAA,CAAMuB,EAAAA,CAAGvB,YAAAA,CAAY,UAAA,EAAY,UAAU,CAAC,CAAA;AAC7F,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAeU,gBAAAA,CAAgB,IAAuB,KAAA,EAAyB;AAC7E,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOV,YAAW,EAClB,MAAA,CAAO;AAAA,MACN,EAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,aAAa,EAAC;AAAA,MACd,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,MACtB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,EACA,kBAAA,CAAmB;AAAA,MAClB,QAAQA,YAAAA,CAAY,UAAA;AAAA,MACpB,GAAA,EAAK;AAAA,QACH,KAAA,EAAON,GAAAA,CAAAA,yBAAAA,EAA+BM,YAAAA,CAAY,KAAK,CAAA,CAAA,CAAA;AAAA,QACvD,SAAA,EAAW;AAAA;AACb,KACD,EACA,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,8DAA8D,CAAA;AACxF,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,iDAAA,EAAoD,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAC,CAAA,SAAA;AAAA,KACtF;AAAA,EACF;AACF;AAEA,eAAeW,yBAAAA,CACb,EAAA,EACA,UAAA,EACA,QAAA,EACA,GAAA,EACe;AACf,EAAA,MAAM,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AACjC,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,EAAO,CACP,KAAKX,YAAW,CAAA,CAChB,KAAA,CAAMuB,EAAAA,CAAGvB,aAAY,UAAA,EAAY,UAAU,CAAC,CAAA,CAC5C,IAAI,QAAQ,CAAA;AACf,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,uFAAA,EACK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA,CAAA;AAAA,OACjC;AAAA,IACF;AACA,IAAA,MAAM,WAAA,GAAc,EAAE,GAAG,GAAA,CAAI,aAAa,CAAC,QAAQ,GAAG,GAAA,EAAI;AAC1D,IAAA,MAAM,GACH,MAAA,CAAOA,YAAW,EAClB,GAAA,CAAI,EAAE,aAAa,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,CAAA,CAC1C,KAAA,CAAMuB,GAAGvB,YAAAA,CAAY,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAIA,eAAeY,sBAAAA,CAAsB,IAAuB,MAAA,EAAgB;AAC1E,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAChB,MAAA,GACA,IAAA,CAAKX,QAAO,CAAA,CACZ,KAAA,CAAMsB,EAAAA,CAAGtB,QAAAA,CAAQ,QAAQ,MAAM,CAAC,EAChC,OAAA,CAAQP,GAAAA,CAAAA,EAAMO,SAAQ,OAAO,CAAA,KAAA,CAAO,CAAA,CACpC,KAAA,CAAM,CAAC,CAAA;AACV,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAeY,iBAAgB,EAAA,EAAuB;AACpD,EAAA,MAAM,MAAA,GAAS,GACZ,MAAA,CAAO;AAAA,IACN,QAAQZ,QAAAA,CAAQ,MAAA;AAAA,IAChB,SAASP,GAAAA,CAAAA,IAAAA,EAAkBO,QAAAA,CAAQ,OAAO,CAAA,CAAA,CAAA,CAAI,GAAG,aAAa;AAAA,GAC/D,CAAA,CACA,IAAA,CAAKA,QAAO,CAAA,CACZ,QAAQA,QAAAA,CAAQ,MAAM,CAAA,CACtB,EAAA,CAAG,QAAQ,CAAA;AACd,EAAA,OAAO,GACJ,MAAA,CAAO;AAAA,IACN,IAAIA,QAAAA,CAAQ,EAAA;AAAA,IACZ,QAAQA,QAAAA,CAAQ,MAAA;AAAA,IAChB,SAASA,QAAAA,CAAQ,OAAA;AAAA,IACjB,OAAOA,QAAAA,CAAQ,KAAA;AAAA,IACf,WAAWA,QAAAA,CAAQ,SAAA;AAAA,IACnB,MAAMA,QAAAA,CAAQ,IAAA;AAAA,IACd,YAAYA,QAAAA,CAAQ,UAAA;AAAA,IACpB,eAAeA,QAAAA,CAAQ,aAAA;AAAA,IACvB,eAAeA,QAAAA,CAAQ,aAAA;AAAA,IACvB,UAAUA,QAAAA,CAAQ,QAAA;AAAA,IAClB,cAAcA,QAAAA,CAAQ,YAAA;AAAA,IACtB,UAAUA,QAAAA,CAAQ;AAAA,GACnB,EACA,IAAA,CAAKA,QAAO,EACZ,SAAA,CAAU,MAAA,EAAQuB,IAAID,EAAAA,CAAG,MAAA,CAAO,QAAQtB,QAAAA,CAAQ,MAAM,GAAGsB,EAAAA,CAAG,MAAA,CAAO,SAAStB,QAAAA,CAAQ,OAAO,CAAC,CAAC,CAAA;AAClG;AAEA,eAAea,iBAAAA,CAAiB,IAAuB,IAAA,EAA0B;AAC/E,EAAA,OAAO,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AAClC,IAAA,MAAM,UAAA,GAAa,MAAM,EAAA,CACtB,MAAA,EAAO,CACP,IAAA,CAAKb,QAAO,CAAA,CACZ,KAAA,CAAMsB,EAAAA,CAAGtB,QAAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAC,CAAA,CACrC,OAAA,CAAQP,GAAAA,CAAAA,EAAMO,QAAAA,CAAQ,OAAO,CAAA,KAAA,CAAO,CAAA,CACpC,KAAA,CAAM,CAAC,CAAA,CACP,GAAA,CAAI,QAAQ,CAAA;AACf,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA;AAChC,IAAA,IAAI,MAAA,IAAU,iBAAA,CAAkB,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,IAAA,MAAM,WAAA,GAAA,CAAe,MAAA,EAAQ,OAAA,IAAW,CAAA,IAAK,CAAA;AAC7C,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOA,QAAO,EACd,MAAA,CAAO;AAAA,MACN,EAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS,WAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,QAAA,EAAU;AAAA,KACX,EACA,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,+DAA+D,CAAA;AACzF,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACH;AAIA,eAAec,uBAAAA,CAAuB,EAAA,EAAuB,UAAA,EAAoB,KAAA,EAAe;AAC9F,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,QAAO,CACP,IAAA,CAAKV,gBAAe,CAAA,CACpB,KAAA;AAAA,IACCmB,GAAAA;AAAA,MACED,EAAAA,CAAGlB,gBAAAA,CAAgB,UAAA,EAAY,UAAU,CAAA;AAAA,MACzCkB,EAAAA,CAAGlB,gBAAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAAA,MAC/BX,GAAAA,CAAAA,EAAMW,gBAAAA,CAAgB,MAAM,CAAA,IAAA,EAAO,+BAA+B,CAAA;AAAA;AACpE,GACF;AACF,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAeW,oBAAAA,CAAoB,IAAuB,KAAA,EAA4B;AACpF,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOX,gBAAe,EACtB,MAAA,CAAO;AAAA,MACN,EAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,yBAAyB,KAAA,CAAM,uBAAA;AAAA,MAC/B,oBAAoB,KAAA,CAAM,kBAAA;AAAA,MAC1B,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,mBAAmB,KAAA,CAAM,iBAAA;AAAA,MACzB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,EACA,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAC5F,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,kEAAA,EACK,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,8HAAA;AAAA,KAG5E;AAAA,EACF;AACF;AAEA,eAAeY,oBAAAA,CAAoB,EAAA,EAAuB,EAAA,EAAY,KAAA,EAA4B;AAChG,EAAA,MAAM,GAAA,GAA+B,EAAE,SAAA,kBAAW,IAAI,MAAK,EAAE;AAC7D,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EACtC;AACA,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOZ,gBAAe,EACtB,GAAA,CAAI,GAAG,CAAA,CACP,KAAA,CAAMkB,GAAGlB,gBAAAA,CAAgB,EAAA,EAAI,EAAE,CAAC,EAChC,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,8EAAA,EACK,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAA;AAAA,OACzB;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,uBAAuB,MAAM,KAAA;AAClD,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,qDAAA,EAAwD,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,SAAA;AAAA,KAC5E;AAAA,EACF;AACF;AAIA,eAAea,YAAAA,CAAY,EAAA,EAAuB,UAAA,EAAoB,SAAA,EAAmB,KAAA,EAAe;AACtG,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,QAAO,CACP,IAAA,CAAKZ,kBAAiB,CAAA,CACtB,KAAA;AAAA,IACCkB,GAAAA;AAAA,MACED,EAAAA,CAAGjB,kBAAAA,CAAkB,UAAA,EAAY,UAAU,CAAA;AAAA,MAC3CiB,EAAAA,CAAGjB,kBAAAA,CAAkB,SAAA,EAAW,SAAS,CAAA;AAAA,MACzCiB,EAAAA,CAAGjB,kBAAAA,CAAkB,KAAA,EAAO,KAAK;AAAA;AACnC,GACF;AACF,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAea,gBAAAA,CACb,IACA,KAAA,EAC0B;AAC1B,EAAA,OAAO,EAAA,CAAG,WAAA,CAAY,OAAO,EAAA,KAAO;AAClC,IAAA,MAAM,eAAe,MAAM,EAAA,CACxB,QAAO,CACP,IAAA,CAAKb,kBAAiB,CAAA,CACtB,KAAA;AAAA,MACCkB,GAAAA;AAAA,QACED,EAAAA,CAAGjB,kBAAAA,CAAkB,UAAA,EAAY,KAAA,CAAM,UAAU,CAAA;AAAA,QACjDiB,EAAAA,CAAGjB,kBAAAA,CAAkB,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA;AAAA,QAC/CiB,EAAAA,CAAGjB,kBAAAA,CAAkB,KAAA,EAAO,KAAA,CAAM,KAAK;AAAA;AACzC,KACF,CACC,IAAI,QAAQ,CAAA;AACf,IAAA,MAAM,WAAA,GAAc,aAAa,CAAC,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,EAAQ;AAEhC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAMX,OAAAA,GAAS,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG,KAAA,CAAM,IAAA,CAAK,aAAA,EAAe,KAAK,CAAA;AACzF,MAAA,MAAMC,UAAAA,GAAY,MAAM,IAAA,CAAK,KAAA;AAC7B,MAAA,MAAMC,QAAAA,GAAU,KAAA,CAAM,WAAA,KAAgB,IAAA,IAAQD,cAAa,KAAA,CAAM,MAAA;AACjE,MAAA,MAAM,IAAA,GAAOC,QAAAA,GAAU,KAAA,CAAM,MAAA,GAAS,CAAA;AACtC,MAAA,MAAM,EAAA,GAAK,aAAa,KAAK,CAAA;AAC7B,MAAA,MAAMC,QAAO,MAAM,EAAA,CAChB,MAAA,CAAOQ,kBAAiB,EACxB,MAAA,CAAO;AAAA,QACN,EAAA;AAAA,QACA,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,IAAA;AAAA,QACA,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA;AAAA,QAClB,aAAA,EAAe,MAAM,IAAA,CAAK,aAAA;AAAA,QAC1B,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,QACnB,WAAA,EAAa,IAAI,IAAA,CAAKX,OAAAA,CAAO,KAAK,CAAA;AAAA,QAClC,SAAA,EAAW,IAAI,IAAA,CAAKA,OAAAA,CAAO,GAAG,CAAA;AAAA,QAC9B,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,QACnB,WAAA,EAAa,MAAM,IAAA,CAAK,WAAA;AAAA,QACxB,WAAW,KAAA,CAAM;AAAA,OAClB,EACA,SAAA,EAAU;AACb,MAAA,MAAM,GAAA,GAAMG,MAAK,CAAC,CAAA;AAClB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,MACzF;AACA,MAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAAD,QAAAA,EAAQ;AAAA,IAC3B;AAEA,IAAA,MAAM,QAAA,GAAW,KAAA,IAAS,WAAA,CAAY,SAAA,CAAU,OAAA,EAAQ;AACxD,IAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,GAAI,WAAA,CAAY,IAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,WACX,aAAA,CAAc,WAAA,CAAY,OAAO,OAAA,EAAQ,EAAG,YAAY,aAAA,EAAe,KAAK,IAC5E,EAAE,KAAA,EAAO,YAAY,WAAA,CAAY,OAAA,IAAW,GAAA,EAAK,WAAA,CAAY,SAAA,CAAU,OAAA,EAAQ,EAAE;AACrF,IAAA,MAAM,SAAA,GAAY,YAAY,KAAA,GAAQ,QAAA;AACtC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,KAAgB,IAAA,IAAQ,aAAa,KAAA,CAAM,MAAA;AAEjE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AACzB,MAAA,OAAO,EAAE,GAAG,WAAA,EAAa,OAAA,EAAS,KAAA,EAAM;AAAA,IAC1C;AAEA,IAAA,MAAM,SAAA,GAAY,OAAA,GAAU,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,QAAA;AACtD,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOS,kBAAiB,EACxB,GAAA,CAAI;AAAA,MACH,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,MAC9B,WAAW,KAAA,CAAM;AAAA,KAClB,CAAA,CACA,KAAA,CAAMiB,EAAAA,CAAGjB,kBAAAA,CAAkB,IAAI,WAAA,CAAY,EAAE,CAAC,CAAA,CAC9C,SAAA,EAAU;AACb,IAAA,MAAM,UAAA,GAAa,KAAK,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,IACzF;AACA,IAAA,OAAO,EAAE,GAAG,UAAA,EAAY,OAAA,EAAQ;AAAA,EAClC,CAAC,CAAA;AACH;AAEA,eAAec,gBAAAA,CACb,EAAA,EACA,UAAA,EACA,SAAA,EACA,OACA,IAAA,EACe;AACf,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,IAAA,CAAK,aAAA,EAAe,GAAA,CAAI,OAAA,EAAS,CAAA;AACrF,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,MAAM,EAAA,CACH,MAAA,CAAOd,kBAAiB,CAAA,CACxB,MAAA,CAAO;AAAA,IACN,EAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,CAAA;AAAA,IACN,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,IAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,IAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACZ,EACA,kBAAA,CAAmB;AAAA,IAClB,QAAQ,CAACA,kBAAAA,CAAkB,YAAYA,kBAAAA,CAAkB,SAAA,EAAWA,mBAAkB,KAAK,CAAA;AAAA,IAC3F,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,CAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,MAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACL;AAIA,eAAee,mBAAAA,CACb,EAAA,EACA,SAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,iBAAA,GAAoB,KAAK,iBAAA,IAAqB,4BAAA;AACpD,EAAA,MAAM,iBAAiB,IAAI,IAAA,CAAK,KAAK,GAAA,CAAI,OAAA,KAAY,iBAAiB,CAAA;AACtE,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOd,gBAAe,EACtB,MAAA,CAAO;AAAA,IACN,SAAA;AAAA,IACA,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,YAAY,IAAA,CAAK,GAAA;AAAA,IACjB,WAAW,IAAA,CAAK,GAAA;AAAA,IAChB,SAAA,EAAW;AAAA,GACZ,EACA,kBAAA,CAAmB;AAAA,IAClB,QAAQA,gBAAAA,CAAgB,SAAA;AAAA,IACxB,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI;AAAA;AAAA;AAAA,IAG3B,QAAA,EAAUiB,GAAAA;AAAA,MACR9B,GAAAA,CAAAA,EAAMa,iBAAgB,SAAS,CAAA,QAAA,CAAA;AAAA,MAC/Bb,GAAAA,CAAAA,EAAMa,gBAAAA,CAAgB,SAAS,CAAA,IAAA,EAAO,cAAc,CAAA;AAAA;AACtD,GACD,CAAA,CACA,SAAA,CAAU,EAAE,SAAA,EAAWA,gBAAAA,CAAgB,WAAW,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,OAAO,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,SAAA,KAAc,IAAA,IAAQ,GAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,KAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAQ;AACrG;AAEA,eAAee,yBAAAA,CAAyB,IAAuB,SAAA,EAAkC;AAC/F,EAAA,MAAM,GACH,MAAA,CAAOf,gBAAe,CAAA,CACtB,GAAA,CAAI,EAAE,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,CAAA,CAC7B,KAAA,CAAMgB,GAAGhB,gBAAAA,CAAgB,SAAA,EAAW,SAAS,CAAC,CAAA;AACnD;AC7eA,IAAMR,0BAAyBL,GAAAA,CAAI,GAAA;AAAA,EACjC,+BAAA,CAAgC,IAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI;AAChE,CAAA;AAEO,IAAMM,YAAAA,GAAc,WAAA,CAAY,SAAA,CAAU,SAAA,EAAW;AAAA,EAC1D,EAAA,EAAIyB,MAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC1B,YAAYA,MAAAA,CAAK,aAAa,CAAA,CAAE,OAAA,GAAU,MAAA,EAAO;AAAA,EACjD,WAAA,EAAaA,MAAAA,CAAK,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAQ,CAAA,CAAE,KAAA,EAA8B,CAAE,OAAA,EAAQ;AAAA,EAC5F,KAAA,EAAOA,OAAK,OAAO,CAAA;AAAA,EACnB,SAAA,EAAWC,UAAQ,YAAA,EAAc,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,EACnE,SAAA,EAAWA,UAAQ,YAAA,EAAc,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA;AAC7D,CAAC,CAAA;AAEM,IAAMzB,QAAAA,GAAU,WAAA;AAAA,EACrB,SAAA,CAAU,KAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAIwB,MAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,IAC1B,MAAA,EAAQA,MAAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,OAAA,EAASC,SAAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IACpC,KAAA,EAAOD,MAAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7B,SAAA,EAAWC,UAAQ,YAAA,EAAc,EAAE,MAAM,SAAA,EAAW,EAAE,OAAA,EAAQ;AAAA,IAC9D,IAAA,EAAMD,OAAK,MAAM,CAAA;AAAA,IACjB,UAAA,EAAYC,UAAQ,aAAa,CAAA;AAAA,IACjC,aAAA,EAAeD,OAAK,gBAAgB,CAAA;AAAA,IACpC,aAAA,EAAeA,MAAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,EAAuB;AAAA,IAC7D,QAAA,EAAUA,MAAAA,CAAK,UAAA,EAAY,EAAE,IAAA,EAAM,QAAQ,CAAA,CAAE,KAAA,EAA0C,CAAE,OAAA,EAAQ;AAAA,IACjG,YAAA,EAAcA,MAAAA,CAAK,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAQ,CAAA,CACjD,KAAA,EAA8C,CAC9C,OAAA,EAAQ;AAAA,IACX,QAAA,EAAUC,UAAQ,WAAA,EAAa,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA;AAAQ,GACnE;AAAA,EACA,CAAC,CAAA,KAAM,CAACtB,aAAAA,CAAY,6BAA6B,CAAA,CAAE,EAAA,CAAG,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAC;AAC5E,CAAA;AAEO,IAAMC,gBAAAA,GAAkB,WAAA;AAAA,EAC7B,SAAA,CAAU,aAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAIoB,MAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,IAC1B,UAAA,EAAYA,MAAAA,CAAK,aAAa,CAAA,CAAE,OAAA,EAAQ;AAAA,IACxC,MAAA,EAAQA,MAAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,WAAA,EAAaC,SAAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7C,KAAA,EAAOD,MAAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7B,QAAQA,MAAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,GAA8B,OAAA,EAAQ;AAAA,IAC7D,QAAA,EAAUA,OAAK,UAAU,CAAA;AAAA,IACzB,uBAAA,EAAyBA,OAAK,2BAA2B,CAAA;AAAA,IACzD,kBAAA,EAAoBC,UAAQ,sBAAA,EAAwB,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,IACtF,gBAAA,EAAkBA,UAAQ,oBAAA,EAAsB,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,IAClF,iBAAA,EAAmBA,UAAQ,sBAAA,EAAwB,EAAE,MAAM,SAAA,EAAW,EAAE,OAAA,EAAQ;AAAA,IAChF,SAAA,EAAWA,UAAQ,YAAA,EAAc,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,IACnE,SAAA,EAAWA,UAAQ,YAAA,EAAc,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA;AAAQ,GACrE;AAAA,EACA,CAAC,CAAA,KAAM;AAAA,IACLtB,aAAAA,CAAY,4BAA4B,CAAA,CACrC,EAAA,CAAG,EAAE,UAAA,EAAY,CAAA,CAAE,KAAK,CAAA,CACxB,MAAMV,GAAAA,CAAAA,EAAM,CAAA,CAAE,MAAM,CAAA,KAAA,EAAQK,uBAAsB,CAAA,CAAA,CAAG;AAAA;AAE5D,CAAA;AAEO,IAAMO,kBAAAA,GAAoB,WAAA;AAAA,EAC/B,SAAA,CAAU,eAAA;AAAA,EACV;AAAA,IACE,EAAA,EAAImB,MAAAA,CAAK,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,IAC1B,UAAA,EAAYA,MAAAA,CAAK,aAAa,CAAA,CAAE,OAAA,EAAQ;AAAA,IACxC,SAAA,EAAWA,MAAAA,CAAK,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,IACtC,KAAA,EAAOA,MAAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7B,IAAA,EAAMC,SAAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC9B,KAAA,EAAOA,SAAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,eAAeD,MAAAA,CAAK,gBAAgB,CAAA,CAAE,KAAA,GAAyB,OAAA,EAAQ;AAAA,IACvE,MAAA,EAAQC,UAAQ,QAAA,EAAU,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,IAC5D,WAAA,EAAaA,UAAQ,cAAA,EAAgB,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,IACvE,SAAA,EAAWA,UAAQ,YAAA,EAAc,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,IACnE,MAAA,EAAQD,MAAAA,CAAK,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,IAChC,WAAA,EAAaC,SAAAA,CAAQ,cAAc,CAAA,CAAE,OAAA,EAAQ;AAAA,IAC7C,SAAA,EAAWA,UAAQ,YAAA,EAAc,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA;AAAQ,GACrE;AAAA,EACA,CAAC,CAAA,KAAM;AAAA,IACLtB,aAAAA,CAAY,+CAA+C,CAAA,CAAE,EAAA;AAAA,MAC3D,CAAA,CAAE,UAAA;AAAA,MACF,CAAA,CAAE,SAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACJ;AAEJ,CAAA;AAEO,IAAMG,gBAAAA,GAAkB,WAAA,CAAY,SAAA,CAAU,aAAA,EAAe;AAAA,EAClE,SAAA,EAAWkB,MAAAA,CAAK,YAAY,CAAA,CAAE,UAAA,EAAW;AAAA,EACzC,QAAA,EAAUA,MAAAA,CAAK,UAAU,CAAA,CAAE,OAAA,EAAQ;AAAA,EACnC,IAAA,EAAMA,MAAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3B,UAAA,EAAYC,UAAQ,aAAA,EAAe,EAAE,MAAM,cAAA,EAAgB,EAAE,OAAA,EAAQ;AAAA,EACrE,WAAWA,SAAAA,CAAQ,YAAA,EAAc,EAAE,IAAA,EAAM,gBAAgB,CAAA;AAAA,EACzD,WAAWA,SAAAA,CAAQ,YAAA,EAAc,EAAE,IAAA,EAAM,gBAAgB;AAC3D,CAAC,CAAA;AAGM,IAAM,YAAA,GAAe;AAAA,EAC1B,WAAA,EAAA1B,YAAAA;AAAA,EACA,OAAA,EAAAC,QAAAA;AAAA,EACA,eAAA,EAAAI,gBAAAA;AAAA,EACA,iBAAA,EAAAC,kBAAAA;AAAA,EACA,eAAA,EAAAC;AACF;;;AC5DA,IAAM,cAAN,MAAkB;AAAA,EAChB,KAAA,GAAuB,QAAQ,OAAA,EAAQ;AAAA,EAEvC,IAAO,EAAA,EAAkC;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAEjC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,IAAA;AAAA,MAClB,MAAM,MAAA;AAAA,MACN,MAAM;AAAA,KACR;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;AAUA,IAAM,iBAAN,MAA6C;AAAA,EAClC,MAAA,GAAS,IAAI,WAAA,EAAY;AAAA,EAElC,QAAW,EAAA,EAAkC;AAC3C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,EAC3B;AAAA,EAEA,WAAA,CAAe,IAAqB,EAAA,EAAqD;AACvF,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,YAAY;AACjC,MAAA,MAAM,EAAA,CAAG,IAAIb,GAAAA,CAAAA,eAAAA,CAAoB,CAAA;AACjC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,EAAA,EAAI,IAAI,cAAc,CAAA;AACxD,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,MAAM,CAAA;AAC9B,QAAA,MAAM,EAAA,CAAG,IAAIA,GAAAA,CAAAA,MAAAA,CAAW,CAAA;AACxB,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,CAAG,IAAIA,GAAAA,CAAAA,QAAAA,CAAa,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF,CAAA;AAGA,IAAM,eAAN,MAA2C;AAAA,EACzC,QAAW,EAAA,EAAkC;AAC3C,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ;AAAA,EAEA,WAAA,CAAe,IAAqB,EAAA,EAAqD;AACvF,IAAA,OAAO,EAAA,CAAG,kBAAA,CAAmB,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,EACxC;AACF,CAAA;AAKO,SAAS,kBAAA,CACd,EAAA,EACA,MAAA,GAAuB,IAAI,gBAAe,EACzB;AAKjB,EAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,oBAAA,CAAqB,EAAE,CAAC,CAAA;AAC9D,EAAA,SAAS,QACP,EAAA,EAC+B;AAC/B,IAAA,OAAO,CAAA,GAAI,IAAA,KACT,MAAA,CAAO,OAAA,CAAQ,YAAY;AACzB,MAAA,MAAM,cAAA,EAAe;AACrB,MAAA,OAAO,EAAA,CAAG,GAAG,IAAI,CAAA;AAAA,IACnB,CAAC,CAAA;AAAA,EACL;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,SAAA,EAAW;AAAA,MACT,iBAAiB,OAAA,CAAQ,CAAC,eAAuBe,yBAAAA,CAAyB,EAAA,EAAI,UAAU,CAAC,CAAA;AAAA,MACzF,QAAQ,OAAA,CAAQ,CAAC,UAA4BC,gBAAAA,CAAgB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MACvE,eAAA,EAAiB,OAAA;AAAA,QAAQ,CAAC,YAAoB,QAAA,EAAkB,GAAA,KAC9DC,0BAAyB,EAAA,EAAI,UAAA,EAAY,UAAU,GAAG;AAAA;AACxD,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,kBAAkB,OAAA,CAAQ,CAAC,WAAmBC,sBAAAA,CAAsB,EAAA,EAAI,MAAM,CAAC,CAAA;AAAA,MAC/E,UAAA,EAAY,OAAA,CAAQ,MAAMC,gBAAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,MAC7C,aAAa,OAAA,CAAQ,CAAC,SAA6BC,iBAAAA,CAAiB,EAAA,EAAI,IAAI,CAAC;AAAA,KAC/E;AAAA,IACA,aAAA,EAAe;AAAA,MACb,SAAA,EAAW,OAAA;AAAA,QAAQ,CAAC,UAAA,EAAoB,KAAA,KACtCC,uBAAAA,CAAuB,EAAA,EAAI,YAAY,KAAK;AAAA,OAC9C;AAAA,MACA,QAAQ,OAAA,CAAQ,CAAC,UAA+BC,oBAAAA,CAAoB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MAC9E,MAAA,EAAQ,OAAA;AAAA,QAAQ,CAAC,EAAA,EAAY,KAAA,KAC3BC,oBAAAA,CAAoB,EAAA,EAAI,IAAI,KAAK;AAAA;AACnC,KACF;AAAA,IACA,QAAA,EAAU;AAAA,MACR,GAAA,EAAK,OAAA;AAAA,QAAQ,CAAC,YAAoB,SAAA,EAAmB,KAAA,KACnDC,aAAY,EAAA,EAAI,UAAA,EAAY,WAAW,KAAK;AAAA,OAC9C;AAAA,MACA,SAAS,OAAA,CAAQ,CAAC,UAA0BC,gBAAAA,CAAgB,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,MACtE,OAAA,EAAS,OAAA;AAAA,QACP,CAAC,UAAA,EAAoB,SAAA,EAAmB,KAAA,EAAe,IAAA,KACrDC,iBAAgB,EAAA,EAAI,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,IAAI;AAAA;AAC1D,KACF;AAAA,IACA,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,OAAA;AAAA,QACL,CACE,SAAA,EACA,IAAA,KACGC,mBAAAA,CAAmB,EAAA,EAAI,WAAW,IAAI;AAAA,OAC7C;AAAA,MACA,aAAa,OAAA,CAAQ,CAAC,cAAsBC,yBAAAA,CAAyB,EAAA,EAAI,SAAS,CAAC;AAAA,KACrF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ,MAAM,sBAAA,CAAuB,EAAE,CAAA;AAAA,MACvC,KAAA,EAAO,MAAM,OAAA,CAAQ,OAAA,CAAQ,uBAAuB;AAAA,KACtD;AAAA,IACA,aAAa,CAAC,EAAA,KAAO,MAAA,CAAO,WAAA,CAAY,IAAI,EAAE;AAAA,GAChD;AACF;AAIA,IAAMd,yBAAAA,GACJ,gRAAA;AAKF,SAAS,qBAAA,GAAqE;AAC5E,EAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAG,cAAcA,yBAAAA,EAAyB;AAC/D;AAEA,eAAe,uBACb,EAAA,EACmD;AACnD,EAAA,MAAM,OAAA,GAAU,MAAM,0BAAA,CAA2B,oBAAA,CAAqB,EAAE,CAAC,CAAA;AACzE,EAAA,OAAO,QAAQ,MAAA,GAAS,CAAA,GACpB,EAAE,OAAA,EAAS,CAAC,WAAW,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE,GACtC,EAAE,OAAA,EAAS,IAAI,OAAA,EAAS,CAAC,WAAW,CAAA,EAAE;AAC5C;AAIA,eAAeC,yBAAAA,CAAyB,IAAqB,UAAA,EAAoB;AAC/E,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAKT,YAAW,CAAA,CAAE,KAAA,CAAMuB,EAAAA,CAAGvB,YAAAA,CAAY,UAAA,EAAY,UAAU,CAAC,CAAA;AAC7F,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAeU,gBAAAA,CAAgB,IAAqB,KAAA,EAAyB;AAC3E,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOV,YAAW,EAClB,MAAA,CAAO;AAAA,MACN,EAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,aAAa,EAAC;AAAA,MACd,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,MACtB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,EACA,kBAAA,CAAmB;AAAA,MAClB,QAAQA,YAAAA,CAAY,UAAA;AAAA,MACpB,GAAA,EAAK;AAAA,QACH,KAAA,EAAON,GAAAA,CAAAA,yBAAAA,EAA+BM,YAAAA,CAAY,KAAK,CAAA,CAAA,CAAA;AAAA,QACvD,SAAA,EAAW;AAAA;AACb,KACD,EACA,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,4DAA4D,CAAA;AACtF,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,+CAAA,EAAkD,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAC,CAAA,SAAA;AAAA,KACpF;AAAA,EACF;AACF;AAEA,eAAeW,yBAAAA,CACb,EAAA,EACA,UAAA,EACA,QAAA,EACA,GAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAO,CAAE,IAAA,CAAKX,YAAW,CAAA,CAAE,KAAA,CAAMuB,EAAAA,CAAGvB,YAAAA,CAAY,UAAA,EAAY,UAAU,CAAC,CAAA;AAC7F,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,CAAA,qFAAA,EACK,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA,CAAA;AAAA,KACjC;AAAA,EACF;AACA,EAAA,MAAM,WAAA,GAAc,EAAE,GAAG,GAAA,CAAI,aAAa,CAAC,QAAQ,GAAG,GAAA,EAAI;AAC1D,EAAA,MAAM,GACH,MAAA,CAAOA,YAAW,EAClB,GAAA,CAAI,EAAE,aAAa,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,CAAA,CAC1C,KAAA,CAAMuB,GAAGvB,YAAAA,CAAY,UAAA,EAAY,UAAU,CAAC,CAAA;AACjD;AAIA,eAAeY,sBAAAA,CAAsB,IAAqB,MAAA,EAAgB;AACxE,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAChB,MAAA,GACA,IAAA,CAAKX,QAAO,CAAA,CACZ,KAAA,CAAMsB,EAAAA,CAAGtB,QAAAA,CAAQ,QAAQ,MAAM,CAAC,EAChC,OAAA,CAAQP,GAAAA,CAAAA,EAAMO,SAAQ,OAAO,CAAA,KAAA,CAAO,CAAA,CACpC,KAAA,CAAM,CAAC,CAAA;AACV,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAeY,iBAAgB,EAAA,EAAqB;AAClD,EAAA,MAAM,MAAA,GAAS,GACZ,MAAA,CAAO;AAAA,IACN,QAAQZ,QAAAA,CAAQ,MAAA;AAAA,IAChB,SAASP,GAAAA,CAAAA,IAAAA,EAAkBO,QAAAA,CAAQ,OAAO,CAAA,CAAA,CAAA,CAAI,GAAG,aAAa;AAAA,GAC/D,CAAA,CACA,IAAA,CAAKA,QAAO,CAAA,CACZ,QAAQA,QAAAA,CAAQ,MAAM,CAAA,CACtB,EAAA,CAAG,QAAQ,CAAA;AACd,EAAA,MAAM,IAAA,GAAO,MAAM,EAAA,CAChB,MAAA,CAAO;AAAA,IACN,IAAIA,QAAAA,CAAQ,EAAA;AAAA,IACZ,QAAQA,QAAAA,CAAQ,MAAA;AAAA,IAChB,SAASA,QAAAA,CAAQ,OAAA;AAAA,IACjB,OAAOA,QAAAA,CAAQ,KAAA;AAAA,IACf,WAAWA,QAAAA,CAAQ,SAAA;AAAA,IACnB,MAAMA,QAAAA,CAAQ,IAAA;AAAA,IACd,YAAYA,QAAAA,CAAQ,UAAA;AAAA,IACpB,eAAeA,QAAAA,CAAQ,aAAA;AAAA,IACvB,eAAeA,QAAAA,CAAQ,aAAA;AAAA,IACvB,UAAUA,QAAAA,CAAQ,QAAA;AAAA,IAClB,cAAcA,QAAAA,CAAQ,YAAA;AAAA,IACtB,UAAUA,QAAAA,CAAQ;AAAA,GACnB,CAAA,CACA,IAAA,CAAKA,QAAO,CAAA,CACZ,SAAA;AAAA,IACC,MAAA;AAAA,IACAuB,GAAAA,CAAID,EAAAA,CAAG,MAAA,CAAO,MAAA,EAAQtB,QAAAA,CAAQ,MAAM,CAAA,EAAGsB,EAAAA,CAAG,MAAA,CAAO,OAAA,EAAStB,QAAAA,CAAQ,OAAO,CAAC;AAAA,GAC5E;AACF,EAAA,OAAO,IAAA;AACT;AAEA,eAAea,iBAAAA,CAAiB,IAAqB,IAAA,EAA0B;AAC7E,EAAA,MAAM,UAAA,GAAa,MAAM,EAAA,CACtB,MAAA,GACA,IAAA,CAAKb,QAAO,CAAA,CACZ,KAAA,CAAMsB,EAAAA,CAAGtB,QAAAA,CAAQ,QAAQ,IAAA,CAAK,MAAM,CAAC,CAAA,CACrC,OAAA,CAAQP,GAAAA,CAAAA,EAAMO,SAAQ,OAAO,CAAA,KAAA,CAAO,CAAA,CACpC,KAAA,CAAM,CAAC,CAAA;AACV,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA;AAChC,EAAA,IAAI,MAAA,IAAU,iBAAA,CAAkB,MAAA,EAAQ,IAAI,CAAA,EAAG;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,MAAM,WAAA,GAAA,CAAe,MAAA,EAAQ,OAAA,IAAW,CAAA,IAAK,CAAA;AAC7C,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOA,QAAO,EACd,MAAA,CAAO;AAAA,IACN,EAAA;AAAA,IACA,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAA,EAAS,WAAA;AAAA,IACT,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,QAAA,EAAU;AAAA,GACX,EACA,SAAA,EAAU;AACb,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,6DAA6D,CAAA;AACvF,EAAA,OAAO,GAAA;AACT;AAIA,eAAec,uBAAAA,CAAuB,EAAA,EAAqB,UAAA,EAAoB,KAAA,EAAe;AAC5F,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,QAAO,CACP,IAAA,CAAKV,gBAAe,CAAA,CACpB,KAAA;AAAA,IACCmB,GAAAA;AAAA,MACED,EAAAA,CAAGlB,gBAAAA,CAAgB,UAAA,EAAY,UAAU,CAAA;AAAA,MACzCkB,EAAAA,CAAGlB,gBAAAA,CAAgB,KAAA,EAAO,KAAK,CAAA;AAAA,MAC/BX,GAAAA,CAAAA,EAAMW,gBAAAA,CAAgB,MAAM,CAAA,IAAA,EAAO,+BAA+B,CAAA;AAAA;AACpE,GACF;AACF,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAeW,oBAAAA,CAAoB,IAAqB,KAAA,EAA4B;AAClF,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOX,gBAAe,EACtB,MAAA,CAAO;AAAA,MACN,EAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,yBAAyB,KAAA,CAAM,uBAAA;AAAA,MAC/B,oBAAoB,KAAA,CAAM,kBAAA;AAAA,MAC1B,kBAAkB,KAAA,CAAM,gBAAA;AAAA,MACxB,mBAAmB,KAAA,CAAM,iBAAA;AAAA,MACzB,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACZ,EACA,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAC1F,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,gEAAA,EACK,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,8HAAA;AAAA,KAG5E;AAAA,EACF;AACF;AAEA,eAAeY,oBAAAA,CAAoB,EAAA,EAAqB,EAAA,EAAY,KAAA,EAA4B;AAC9F,EAAA,MAAM,GAAA,GAA+B,EAAE,SAAA,kBAAW,IAAI,MAAK,EAAE;AAC7D,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EACtC;AACA,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOZ,gBAAe,EACtB,GAAA,CAAI,GAAG,CAAA,CACP,KAAA,CAAMkB,GAAGlB,gBAAAA,CAAgB,EAAA,EAAI,EAAE,CAAC,EAChC,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,4EAAA,EACK,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,CAAA;AAAA,OACzB;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiB,uBAAuB,MAAM,KAAA;AAClD,IAAA,MAAM,eAAA;AAAA,MACJ,KAAA;AAAA,MACA,CAAA,mDAAA,EAAsD,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA,SAAA;AAAA,KAC1E;AAAA,EACF;AACF;AAIA,eAAea,YAAAA,CAAY,EAAA,EAAqB,UAAA,EAAoB,SAAA,EAAmB,KAAA,EAAe;AACpG,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,QAAO,CACP,IAAA,CAAKZ,kBAAiB,CAAA,CACtB,KAAA;AAAA,IACCkB,GAAAA;AAAA,MACED,EAAAA,CAAGjB,kBAAAA,CAAkB,UAAA,EAAY,UAAU,CAAA;AAAA,MAC3CiB,EAAAA,CAAGjB,kBAAAA,CAAkB,SAAA,EAAW,SAAS,CAAA;AAAA,MACzCiB,EAAAA,CAAGjB,kBAAAA,CAAkB,KAAA,EAAO,KAAK;AAAA;AACnC,GACF;AACF,EAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACpB;AAEA,eAAea,gBAAAA,CAAgB,IAAqB,KAAA,EAAiD;AACnG,EAAA,MAAM,eAAe,MAAM,EAAA,CACxB,QAAO,CACP,IAAA,CAAKb,kBAAiB,CAAA,CACtB,KAAA;AAAA,IACCkB,GAAAA;AAAA,MACED,EAAAA,CAAGjB,kBAAAA,CAAkB,UAAA,EAAY,KAAA,CAAM,UAAU,CAAA;AAAA,MACjDiB,EAAAA,CAAGjB,kBAAAA,CAAkB,SAAA,EAAW,KAAA,CAAM,SAAS,CAAA;AAAA,MAC/CiB,EAAAA,CAAGjB,kBAAAA,CAAkB,KAAA,EAAO,KAAA,CAAM,KAAK;AAAA;AACzC,GACF;AACF,EAAA,MAAM,WAAA,GAAc,aAAa,CAAC,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,OAAA,EAAQ;AAEhC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAMX,OAAAA,GAAS,aAAA,CAAc,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,SAAQ,EAAG,KAAA,CAAM,IAAA,CAAK,aAAA,EAAe,KAAK,CAAA;AACzF,IAAA,MAAMC,UAAAA,GAAY,MAAM,IAAA,CAAK,KAAA;AAC7B,IAAA,MAAMC,QAAAA,GAAU,KAAA,CAAM,WAAA,KAAgB,IAAA,IAAQD,cAAa,KAAA,CAAM,MAAA;AACjE,IAAA,MAAM,IAAA,GAAOC,QAAAA,GAAU,KAAA,CAAM,MAAA,GAAS,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,aAAa,KAAK,CAAA;AAC7B,IAAA,MAAMC,QAAO,MAAM,EAAA,CAChB,MAAA,CAAOQ,kBAAiB,EACxB,MAAA,CAAO;AAAA,MACN,EAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA;AAAA,MACA,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA;AAAA,MAClB,aAAA,EAAe,MAAM,IAAA,CAAK,aAAA;AAAA,MAC1B,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,MACnB,WAAA,EAAa,IAAI,IAAA,CAAKX,OAAAA,CAAO,KAAK,CAAA;AAAA,MAClC,SAAA,EAAW,IAAI,IAAA,CAAKA,OAAAA,CAAO,GAAG,CAAA;AAAA,MAC9B,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,MACnB,WAAA,EAAa,MAAM,IAAA,CAAK,WAAA;AAAA,MACxB,WAAW,KAAA,CAAM;AAAA,KAClB,EACA,SAAA,EAAU;AACb,IAAA,MAAM,GAAA,GAAMG,MAAK,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,qEAAqE,CAAA;AAC/F,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAAD,QAAAA,EAAQ;AAAA,EAC3B;AAEA,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,WAAA,CAAY,SAAA,CAAU,OAAA,EAAQ;AACxD,EAAA,MAAM,QAAA,GAAW,QAAA,GAAW,CAAA,GAAI,WAAA,CAAY,IAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,WACX,aAAA,CAAc,WAAA,CAAY,OAAO,OAAA,EAAQ,EAAG,YAAY,aAAA,EAAe,KAAK,IAC5E,EAAE,KAAA,EAAO,YAAY,WAAA,CAAY,OAAA,IAAW,GAAA,EAAK,WAAA,CAAY,SAAA,CAAU,OAAA,EAAQ,EAAE;AACrF,EAAA,MAAM,SAAA,GAAY,YAAY,KAAA,GAAQ,QAAA;AACtC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,WAAA,KAAgB,IAAA,IAAQ,aAAa,KAAA,CAAM,MAAA;AAEjE,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AAGzB,IAAA,OAAO,EAAE,GAAG,WAAA,EAAa,OAAA,EAAS,KAAA,EAAM;AAAA,EAC1C;AAEA,EAAA,MAAM,SAAA,GAAY,OAAA,GAAU,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,QAAA;AACtD,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOS,kBAAiB,EACxB,GAAA,CAAI;AAAA,IACH,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,IAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,IAC9B,WAAW,KAAA,CAAM;AAAA,GAClB,CAAA,CACA,KAAA,CAAMiB,EAAAA,CAAGjB,kBAAAA,CAAkB,IAAI,WAAA,CAAY,EAAE,CAAC,CAAA,CAC9C,SAAA,EAAU;AACb,EAAA,MAAM,UAAA,GAAa,KAAK,CAAC,CAAA;AACzB,EAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,MAAM,qEAAqE,CAAA;AACtG,EAAA,OAAO,EAAE,GAAG,UAAA,EAAY,OAAA,EAAQ;AAClC;AAEA,eAAec,gBAAAA,CACb,EAAA,EACA,UAAA,EACA,SAAA,EACA,OACA,IAAA,EACe;AACf,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,IAAA,CAAK,aAAA,EAAe,GAAA,CAAI,OAAA,EAAS,CAAA;AACrF,EAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,CAAA;AACrC,EAAA,MAAM,EAAA,CACH,MAAA,CAAOd,kBAAiB,CAAA,CACxB,MAAA,CAAO;AAAA,IACN,EAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,CAAA;AAAA,IACN,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,IAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,IAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,SAAA,EAAW;AAAA,GACZ,EACA,kBAAA,CAAmB;AAAA,IAClB,QAAQ,CAACA,kBAAAA,CAAkB,YAAYA,kBAAAA,CAAkB,SAAA,EAAWA,mBAAkB,KAAK,CAAA;AAAA,IAC3F,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,CAAA;AAAA,MACN,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAA,EAAa,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MAClC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,MAC9B,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,EAAW;AAAA;AACb,GACD,CAAA;AACL;AAIA,eAAee,mBAAAA,CACb,EAAA,EACA,SAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,iBAAA,GAAoB,KAAK,iBAAA,IAAqB,4BAAA;AACpD,EAAA,MAAM,iBAAiB,IAAI,IAAA,CAAK,KAAK,GAAA,CAAI,OAAA,KAAY,iBAAiB,CAAA;AACtE,EAAA,MAAM,OAAO,MAAM,EAAA,CAChB,MAAA,CAAOd,gBAAe,EACtB,MAAA,CAAO;AAAA,IACN,SAAA;AAAA,IACA,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,YAAY,IAAA,CAAK,GAAA;AAAA,IACjB,WAAW,IAAA,CAAK,GAAA;AAAA,IAChB,SAAA,EAAW;AAAA,GACZ,EACA,kBAAA,CAAmB;AAAA,IAClB,QAAQA,gBAAAA,CAAgB,SAAA;AAAA,IACxB,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA,IAK3B,QAAA,EAAUiB,GAAAA;AAAA,MACR9B,GAAAA,CAAAA,EAAMa,iBAAgB,SAAS,CAAA,QAAA,CAAA;AAAA,MAC/Bb,GAAAA,CAAAA,EAAMa,gBAAAA,CAAgB,SAAS,CAAA,IAAA,EAAO,cAAc,CAAA;AAAA;AACtD,GACD,CAAA,CACA,SAAA,CAAU,EAAE,SAAA,EAAWA,gBAAAA,CAAgB,WAAW,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,EAAA,OAAO,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,SAAA,KAAc,IAAA,IAAQ,GAAA,CAAI,SAAA,CAAU,OAAA,EAAQ,KAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAQ;AACrG;AAEA,eAAee,yBAAAA,CAAyB,IAAqB,SAAA,EAAkC;AAC7F,EAAA,MAAM,GACH,MAAA,CAAOf,gBAAe,CAAA,CACtB,GAAA,CAAI,EAAE,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,CAAA,CAC7B,KAAA,CAAMgB,GAAGhB,gBAAAA,CAAgB,SAAA,EAAW,SAAS,CAAC,CAAA;AACnD;;;AC7iBA,SAAS,mBAAmB,KAAA,EAAyB;AACnD,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AACxD,EAAA,MAAM,SAAA,GAAY,KAAA;AAClB,EAAA,OACE,OAAO,SAAA,CAAU,MAAA,KAAW,UAAA,IAC5B,OAAO,SAAA,CAAU,MAAA,KAAW,UAAA,IAC5B,OAAO,SAAA,CAAU,MAAA,KAAW,UAAA,IAC5B,OAAO,UAAU,WAAA,KAAgB,UAAA;AAErC;AAeO,SAAS,cAAA,CAAe,EAAA,EAAa,OAAA,GAAiC,EAAC,EAAoB;AAChG,EAAA,IAAI,CAAC,kBAAA,CAAmB,EAAE,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,mBAAA;AAAA,MACR,CAAA,0KAAA,EAEK,OAAO,EAAA,KAAO,QAAA,IAAY,OAAO,IAAA,GAAO,oDAAA,GAAuD,OAAO,EAAE,CAAA,CAAA;AAAA,KAC/G;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,EAAA,EAAI,OAAA,CAAQ,OAAO,CAAA;AACxD,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA;AACH,MAAA,OAAO,mBAAmB,EAAqB,CAAA;AAAA,IACjD,KAAK,UAAA;AACH,MAAA,OAAO,qBAAqB,EAAgD,CAAA;AAAA,IAC9E,KAAK,OAAA;AACH,MAAA,OAAO,kBAAkB,EAA6C,CAAA;AAAA;AAE5E","file":"index.js","sourcesContent":["/**\n * Dialect detection for `drizzleAdapter(db)` (docs/v1/database.md §1/§4, PW-708).\n *\n * ── Build-time resolution (recorded in database.md §4) ──────────────────────\n * The PW-708 brief flags dialect detection as a ⚠️-style check: \"attempt\n * detection from the instance; if drizzle-orm exposes no stable public\n * discriminator... accept an explicit second argument.\" Verified against the\n * installed `drizzle-orm@0.45.2`: it DOES expose a stable, public\n * discriminator — `drizzle(...)` for postgres/mysql/sqlite each return an\n * instance of a dialect base class the package exports from a driver-INDEPENDENT\n * entry point (`drizzle-orm/pg-core`'s `PgDatabase`, `drizzle-orm/mysql-core`'s\n * `MySqlDatabase`, `drizzle-orm/sqlite-core`'s `BaseSQLiteDatabase`) —\n * confirmed empirically: `drizzle(new Database(\":memory:\")) instanceof\n * BaseSQLiteDatabase` is `true` regardless of which of the sqlite-family\n * drivers (better-sqlite3, `@libsql/client`, D1, Bun, Expo…) actually backs\n * it, and importing these three `-core` entry points requires only\n * `drizzle-orm` itself — never `pg`/`mysql2`/`better-sqlite3` — so `instanceof`\n * detection carries no extra driver dependency. `instanceof` is therefore used\n * as the primary mechanism, with `options.dialect` as a documented escape\n * hatch (e.g. for a proxied/wrapped `db` whose prototype chain does not\n * preserve the `instanceof` relationship).\n */\nimport { MySqlDatabase } from \"drizzle-orm/mysql-core\";\nimport { PgDatabase } from \"drizzle-orm/pg-core\";\nimport { BaseSQLiteDatabase } from \"drizzle-orm/sqlite-core\";\nimport { PayweaveConfigError } from \"../../core/errors\";\n\n/** The SQL dialects a `drizzle-orm` instance can wrap that this adapter supports. */\nexport type DrizzleDialect = \"postgres\" | \"mysql\" | \"sqlite\";\n\n/**\n * Resolve the SQL dialect behind a Drizzle `db` instance. `override` (from\n * `drizzleAdapter(db, { dialect })`) always wins over detection.\n *\n * @throws {PayweaveConfigError} when `db` is not a recognizable Drizzle\n * instance of any of the three supported dialect base classes and no\n * `override` was given.\n */\nexport function detectDrizzleDialect(db: unknown, override?: DrizzleDialect): DrizzleDialect {\n if (override !== undefined) return override;\n if (db instanceof PgDatabase) return \"postgres\";\n if (db instanceof MySqlDatabase) return \"mysql\";\n if (db instanceof BaseSQLiteDatabase) return \"sqlite\";\n throw new PayweaveConfigError(\n \"payweave/db/drizzle: could not detect the SQL dialect of the given Drizzle instance (expected \" +\n \"an instance backed by drizzle-orm/pg-core, drizzle-orm/mysql-core, or drizzle-orm/sqlite-core). \" +\n 'Pass it explicitly: drizzleAdapter(db, { dialect: \"postgres\" | \"mysql\" | \"sqlite\" }).',\n );\n}\n","/**\n * Error helpers for the Drizzle adapter (docs/v1/database.md §4/§7, PW-708):\n * a thin wrapper turning raw driver/drizzle exceptions into\n * {@link PayweaveError} subclasses (AGENTS.md §2: public SDK methods only\n * ever throw `PayweaveError` subclasses).\n *\n * NOTE on the \"dynamic import + install-hint\" pattern the other first-party\n * adapters use (PW-505/PW-706 style) for their optional peer driver: it does\n * NOT apply cleanly here, and this is a deliberate, documented deviation —\n * see `../index.ts`'s module header for the full reasoning. In short:\n * dialect detection (`../detect.ts`) MUST use `instanceof` against\n * `drizzle-orm`'s own dialect base classes for correctness, which requires\n * those classes to be the SAME loaded instances the caller's own `db` was\n * built from — a lazy `import()` executed later is safe for that (Node\n * caches modules), but making `drizzleAdapter(db)` itself `async` to await\n * one would break the factory contract every other adapter shares (sync,\n * side-effect-free construction — database.md §1), and a synchronous\n * `require()` escape hatch risks loading a SEPARATE module instance than the\n * caller's `import`, silently breaking `instanceof`. `drizzle-orm` is also\n * this subpath's ONE unavoidable optional peer (unlike sqlite's two\n * alternative drivers) — every dialect file here imports it statically, so\n * a missing `drizzle-orm` fails at `import \"payweave/db/drizzle\"` time with\n * Node's own clear `Cannot find package 'drizzle-orm'` error, not a\n * downstream cryptic one.\n */\nimport { PayweaveError, PayweaveValidationError } from \"../../core/errors\";\n\n/** Driver error `.code`/`.cause.code` values that mean \"a constraint was violated\". */\nfunction constraintCode(error: unknown): string | undefined {\n const direct = (error as { code?: unknown } | null)?.code;\n if (typeof direct === \"string\") return direct;\n const cause = (error as { cause?: { code?: unknown } } | null)?.cause;\n const nested = cause?.code;\n return typeof nested === \"string\" ? nested : undefined;\n}\n\n/** postgres/mysql/sqlite constraint-violation error codes across the three raw drivers. */\nfunction isConstraintViolation(error: unknown): boolean {\n const code = constraintCode(error);\n if (code === undefined) return false;\n return (\n code.startsWith(\"SQLITE_CONSTRAINT\") || // better-sqlite3 / @libsql/client\n code === \"23505\" || // postgres unique_violation\n code === \"23P01\" || // postgres exclusion_violation\n code === \"ER_DUP_ENTRY\" // mysql2\n );\n}\n\n/**\n * Normalize a raw driver/drizzle error into a {@link PayweaveError} subclass.\n * Constraint violations (e.g. the partial-unique active-subscription rule,\n * `pw_customers.external_id`) become {@link PayweaveValidationError} — the\n * caller supplied input that conflicts with existing state; anything else\n * becomes a generic {@link PayweaveError}, preserving the original error as\n * `cause` either way. Drizzle wraps driver errors in its own\n * `DrizzleQueryError` (`.cause` holds the raw driver error), so both the\n * direct and nested `.code` are checked.\n */\nexport function wrapDriverError(error: unknown, message: string): PayweaveError {\n if (error instanceof PayweaveError) return error;\n if (isConstraintViolation(error)) {\n return new PayweaveValidationError(message, { cause: error });\n }\n return new PayweaveError(message, { cause: error, isRetryable: false });\n}\n","/**\n * `pwv_<ulid>` id generation for the Drizzle adapter (docs/v1/database.md §2,\n * PW-708). Deliberately self-contained — NOT imported from\n * `src/db/sqlite/id.ts` (that directory is PW-706's, read-only for this\n * ticket) — each first-party adapter owns an independent copy so the\n * disjoint-directory parallel-safety the epic brief describes\n * (`epic-07-database.md` PW-704…709 preamble) holds for real, not just by\n * convention. This is a minimal, dependency-free ULID implementation (spec:\n * https://github.com/ulid/spec) — no third-party `ulid` package, keeping the\n * SDK's zod-only `dependencies` rule intact. Monotonicity\n * within the same millisecond is NOT implemented (row ids only need to be\n * unique, not strictly sortable under sub-ms bursts); randomness is\n * `node:crypto`'s CSPRNG.\n */\nimport { randomInt } from \"node:crypto\";\n\n/** Crockford's Base32 alphabet (32 symbols; excludes I, L, O, U). */\nconst ENCODING = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\nconst ENCODING_LEN = ENCODING.length;\nconst TIME_LEN = 10;\nconst RANDOM_LEN = 16;\n\nfunction encodeTime(timeMs: number, len: number): string {\n if (!Number.isSafeInteger(timeMs) || timeMs < 0) {\n throw new RangeError(`ulid: time must be a non-negative safe integer — got ${timeMs}`);\n }\n let remaining = timeMs;\n let out = \"\";\n for (let i = 0; i < len; i++) {\n const mod = remaining % ENCODING_LEN;\n out = ENCODING.charAt(mod) + out;\n remaining = Math.floor(remaining / ENCODING_LEN);\n }\n return out;\n}\n\nfunction encodeRandom(len: number): string {\n let out = \"\";\n for (let i = 0; i < len; i++) {\n out += ENCODING.charAt(randomInt(0, ENCODING_LEN));\n }\n return out;\n}\n\n/** A fresh ULID (26 chars: 10 time + 16 random), uppercase Crockford Base32. */\nexport function ulid(timeMs: number = Date.now()): string {\n return encodeTime(timeMs, TIME_LEN) + encodeRandom(RANDOM_LEN);\n}\n\n/**\n * A fresh Payweave row id: `pwv_` + a 26-char ULID — matches\n * `src/db/schema.ts`'s `pwIdSchema` exactly.\n */\nexport function generatePwId(timeMs: number = Date.now()): string {\n return `pwv_${ulid(timeMs)}`;\n}\n","/**\n * Shared `plans.pushVersion` content-comparison helper (docs/v1/database.md\n * §2/§3, PW-708) — dialect-agnostic pure JS, reused by all three Drizzle\n * dialect stores so the append-only/no-op-on-unchanged-content rule can never\n * drift between them.\n */\nimport type { PwPlanVersion, PwPlanVersionInput } from \"../schema\";\n\n/** Stable (sorted-key) JSON for order-independent structural comparison. */\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n if (value !== null && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n );\n return `{${entries.map(([key, val]) => `${JSON.stringify(key)}:${stableStringify(val)}`).join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\n/** The `pw_plans` fields that define plan \"content\" — everything except id/version/pushedAt. */\ninterface PlanContent {\n group: string;\n isDefault: boolean;\n name: string | null;\n priceMinor: number | null;\n priceCurrency: string | null;\n priceInterval: string | null;\n features: unknown;\n providerRefs: unknown;\n}\n\nconst planContent = (p: PwPlanVersion | PwPlanVersionInput): PlanContent => ({\n group: p.group,\n isDefault: p.isDefault,\n name: p.name,\n priceMinor: p.priceMinor,\n priceCurrency: p.priceCurrency,\n priceInterval: p.priceInterval,\n features: p.features,\n providerRefs: p.providerRefs,\n});\n\n/** Whether `input`'s comparable fields match `active`'s — the pushVersion no-op gate. */\nexport function planContentEquals(active: PwPlanVersion, input: PwPlanVersionInput): boolean {\n return stableStringify(planContent(active)) === stableStringify(planContent(input));\n}\n","/**\n * Published Drizzle schema — MySQL dialect (docs/v1/database.md §2/§4,\n * PW-708). Merge these table definitions into your own `schema.ts` and\n * migrate them with `drizzle-kit` (`push` for local/dev, `generate` +\n * `migrate` for tracked migrations) — Payweave never runs migrations for the\n * Drizzle adapter itself (`../index.ts`'s `migrations.apply()` returns\n * instructions, never DDL; database.md §4 \"Same model\" as the Prisma\n * adapter).\n *\n * Column-for-column equivalent to `src/db/migrations/ddl.ts`'s\n * `MYSQL_INIT_STATEMENTS` — asserted by `test/db/drizzle.test.ts`'s\n * cross-dialect parity test. Per-dialect storage mapping:\n * `datetime(3)` timestamps, native `json`, `tinyint(1)`-backed `boolean`,\n * `bigint` (mode `\"number\"`) for money/usage/version-scale integers.\n *\n * MySQL has NO partial unique indexes (database.md §4 build-time resolution,\n * mirroring PW-703's `src/db/migrations/ddl.ts` header exactly): the\n * `pw_subscriptions` active-subscription rule is emulated with a `STORED`\n * generated column `active_slot` (`'x'` when `status` is in the active set,\n * `NULL` otherwise) plus a composite unique index on\n * (`customer_id`, `group`, `active_slot`) — MySQL unique indexes never treat\n * NULLs as equal, so inactive rows never collide while a second active-set\n * row per (customer, group) is rejected. `active_slot` is generated storage\n * — the adapter must NEVER write it (an INSERT naming it errors; that is the\n * DDL working, not a bug).\n */\nimport { sql } from \"drizzle-orm\";\nimport {\n bigint,\n boolean,\n char,\n datetime,\n int,\n json,\n mysqlTable,\n uniqueIndex,\n varchar,\n} from \"drizzle-orm/mysql-core\";\nimport type {\n PwFeatureInclusion,\n PwPriceInterval,\n PwResetInterval,\n PwSubscriptionStatus,\n} from \"../../schema\";\nimport { PW_ACTIVE_SUBSCRIPTION_STATUSES, PW_TABLES } from \"../../schema\";\n\n/** `status IN (...)` list for the generated `active_slot` column, derived from the contract constant. */\nconst ACTIVE_STATUS_SQL_LIST = sql.raw(\n PW_ACTIVE_SUBSCRIPTION_STATUSES.map((s) => `'${s}'`).join(\", \"),\n);\n\nconst utf8mb4Bin = { charSet: \"utf8mb4\" as const, collate: \"utf8mb4_bin\" as const };\n\nexport const pwCustomers = mysqlTable(PW_TABLES.customers, {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n externalId: varchar(\"external_id\", { length: 255, ...utf8mb4Bin }).notNull().unique(),\n providerIds: json(\"provider_ids\").$type<Record<string, string>>().notNull(),\n email: varchar(\"email\", { length: 255 }),\n createdAt: datetime(\"created_at\", { fsp: 3 }).notNull(),\n updatedAt: datetime(\"updated_at\", { fsp: 3 }).notNull(),\n});\n\nexport const pwPlans = mysqlTable(\n PW_TABLES.plans,\n {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n planId: varchar(\"plan_id\", { length: 255 }).notNull(),\n version: int(\"version\").notNull(),\n group: varchar(\"group\", { length: 255 }).notNull(),\n isDefault: boolean(\"is_default\").notNull(),\n name: varchar(\"name\", { length: 255 }),\n priceMinor: bigint(\"price_minor\", { mode: \"number\" }),\n priceCurrency: varchar(\"price_currency\", { length: 255 }),\n priceInterval: varchar(\"price_interval\", { length: 255 }).$type<PwPriceInterval>(),\n features: json(\"features\").$type<Record<string, PwFeatureInclusion>>().notNull(),\n providerRefs: json(\"provider_refs\").$type<Record<string, Record<string, string>>>().notNull(),\n pushedAt: datetime(\"pushed_at\", { fsp: 3 }).notNull(),\n },\n (t) => [uniqueIndex(\"pw_plans_plan_id_version_uq\").on(t.planId, t.version)],\n);\n\nexport const pwSubscriptions = mysqlTable(\n PW_TABLES.subscriptions,\n {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n customerId: varchar(\"customer_id\", { length: 255 })\n .notNull()\n .references(() => pwCustomers.id),\n planId: varchar(\"plan_id\", { length: 255 }).notNull(),\n planVersion: int(\"plan_version\").notNull(),\n group: varchar(\"group\", { length: 255, ...utf8mb4Bin }).notNull(),\n status: varchar(\"status\", { length: 255, ...utf8mb4Bin }).$type<PwSubscriptionStatus>().notNull(),\n provider: varchar(\"provider\", { length: 255 }),\n providerSubscriptionRef: varchar(\"provider_subscription_ref\", { length: 255 }),\n currentPeriodStart: datetime(\"current_period_start\", { fsp: 3 }).notNull(),\n currentPeriodEnd: datetime(\"current_period_end\", { fsp: 3 }).notNull(),\n cancelAtPeriodEnd: boolean(\"cancel_at_period_end\").notNull(),\n createdAt: datetime(\"created_at\", { fsp: 3 }).notNull(),\n updatedAt: datetime(\"updated_at\", { fsp: 3 }).notNull(),\n // STORED generated column emulating the partial-unique rule (see module\n // header) — never write to this column directly.\n activeSlot: char(\"active_slot\", { length: 1 }).generatedAlwaysAs(\n sql`case when ${sql.identifier(\"status\")} in (${ACTIVE_STATUS_SQL_LIST}) then 'x' else null end`,\n { mode: \"stored\" },\n ),\n },\n (t) => [uniqueIndex(\"pw_subscriptions_active_uq\").on(t.customerId, t.group, t.activeSlot)],\n);\n\nexport const pwFeatureBalances = mysqlTable(\n PW_TABLES.featureBalances,\n {\n id: varchar(\"id\", { length: 255 }).primaryKey(),\n customerId: varchar(\"customer_id\", { length: 255 })\n .notNull()\n .references(() => pwCustomers.id),\n featureId: varchar(\"feature_id\", { length: 255 }).notNull(),\n group: varchar(\"group\", { length: 255, ...utf8mb4Bin }).notNull(),\n used: bigint(\"used\", { mode: \"number\" }).notNull(),\n limit: bigint(\"limit\", { mode: \"number\" }).notNull(),\n resetInterval: varchar(\"reset_interval\", { length: 255 }).$type<PwResetInterval>().notNull(),\n anchor: datetime(\"anchor\", { fsp: 3 }).notNull(),\n periodStart: datetime(\"period_start\", { fsp: 3 }).notNull(),\n periodEnd: datetime(\"period_end\", { fsp: 3 }).notNull(),\n planId: varchar(\"plan_id\", { length: 255 }).notNull(),\n planVersion: int(\"plan_version\").notNull(),\n updatedAt: datetime(\"updated_at\", { fsp: 3 }).notNull(),\n },\n (t) => [\n uniqueIndex(\"pw_feature_balances_customer_feature_group_uq\").on(\n t.customerId,\n t.featureId,\n t.group,\n ),\n ],\n);\n\nexport const pwWebhookEvents = mysqlTable(PW_TABLES.webhookEvents, {\n dedupeKey: varchar(\"dedupe_key\", { length: 255 }).primaryKey(),\n provider: varchar(\"provider\", { length: 255 }).notNull(),\n type: varchar(\"type\", { length: 255 }).notNull(),\n receivedAt: datetime(\"received_at\", { fsp: 3 }).notNull(),\n claimedAt: datetime(\"claimed_at\", { fsp: 3 }),\n appliedAt: datetime(\"applied_at\", { fsp: 3 }),\n});\n\n/** Every table this schema publishes, keyed the same way as `PW_TABLES`. */\nexport const mysqlSchema = {\n pwCustomers,\n pwPlans,\n pwSubscriptions,\n pwFeatureBalances,\n pwWebhookEvents,\n};\n","/**\n * First-use table verification for the Drizzle adapter (docs/v1/database.md\n * §4, PW-708) — mirrors the Prisma adapter's model exactly (per the PW-708\n * brief: \"PW-707's brief/PR — mirror its verification + instructions\n * patterns\"): since `migrations.apply()` never runs DDL (drizzle-kit is\n * user-owned), the adapter instead verifies — on FIRST USE, not at factory\n * construction time (§1's sync/side-effect-free contract) — that the\n * expected `pw_*` tables exist, and throws a `PayweaveConfigError` naming the\n * missing tables AND the packaged schema file if not.\n *\n * \"Verification caches its result per adapter instance — it must not tax the\n * hot path on every call\" (brief): {@link createVerifier} memoizes a SUCCESSFUL\n * check forever, but clears the cache on failure so a later call (e.g. after\n * the user runs `drizzle-kit push` mid-process) re-attempts rather than\n * wedging into a permanent throw.\n */\nimport { sql } from \"drizzle-orm\";\nimport { PayweaveConfigError } from \"../../core/errors\";\nimport { PW_TABLES, type PwTableName } from \"../schema\";\n\n/** Every table the Drizzle adapter needs — the ledger table is SQL-adapter-only. */\nconst REQUIRED_TABLES: readonly PwTableName[] = [\n PW_TABLES.customers,\n PW_TABLES.plans,\n PW_TABLES.subscriptions,\n PW_TABLES.featureBalances,\n PW_TABLES.webhookEvents,\n];\n\nconst SCHEMA_FILE_HINT =\n '\"payweave/db/drizzle\"\\'s published schema (src/db/drizzle/schema/{pg,mysql,sqlite}.ts — ' +\n \"docs/v1/database.md §4) — merge it into your own Drizzle schema and run `drizzle-kit push` \" +\n \"or `drizzle-kit generate`/`migrate`.\";\n\nfunction missingTablesError(missing: readonly string[]): PayweaveConfigError {\n return new PayweaveConfigError(\n `payweave/db/drizzle: the following Payweave tables do not exist yet in the connected ` +\n `database: ${missing.join(\", \")}. Merge ${SCHEMA_FILE_HINT}`,\n );\n}\n\n/** Probe one table for existence with an inert, side-effect-free query. */\nexport type TableProbe = (table: string) => Promise<boolean>;\n\nasync function findMissingTables(probe: TableProbe): Promise<string[]> {\n const missing: string[] = [];\n for (const table of REQUIRED_TABLES) {\n if (!(await probe(table))) missing.push(table);\n }\n return missing;\n}\n\n/**\n * Build a memoized `ensureVerified()` gate from a dialect-specific existence\n * check. Every store method (except `migrations.status()/apply()`, which\n * report the same information without throwing) calls this before touching\n * the database.\n */\nexport function createVerifier(probe: TableProbe): () => Promise<void> {\n let cached: Promise<void> | undefined;\n return function ensureVerified(): Promise<void> {\n cached ??= (async () => {\n const missing = await findMissingTables(probe);\n if (missing.length > 0) throw missingTablesError(missing);\n })().catch((error: unknown) => {\n cached = undefined;\n throw error;\n });\n return cached;\n };\n}\n\n/** Non-memoized variant for `migrations.status()` — reports rather than throws. */\nexport async function findMissingTablesForStatus(probe: TableProbe): Promise<string[]> {\n return findMissingTables(probe);\n}\n\n// ── Dialect probes ───────────────────────────────────────────────────────────\n// A bare `SELECT 1 FROM <table> LIMIT 0` is valid, inert SQL on all three\n// dialects and needs no per-dialect introspection query. sqlite-core exposes\n// `.run(...)`; pg-core/mysql-core expose `.execute(...)` instead (verified\n// against the installed drizzle-orm@0.45.2's `db.d.ts` for each dialect).\n\n/**\n * sqlite-core's raw-query surface. `run()`'s return type is `unknown` (not\n * `Promise<unknown>`) because `BaseSQLiteDatabase`'s `\"async\" | \"sync\"`\n * result-kind union makes its declared return type itself a union of `T` and\n * `Promise<T>` — `await` handles both uniformly at runtime either way.\n */\nexport interface SqliteRunnable {\n run(query: unknown): unknown;\n}\n\n/** pg-core/mysql-core's raw-query surface. */\nexport interface SqlExecutable {\n execute(query: unknown): Promise<unknown>;\n}\n\nexport function makeSqliteTableProbe(db: SqliteRunnable): TableProbe {\n return async (table) => {\n try {\n await db.run(sql`select 1 from ${sql.identifier(table)} limit 0`);\n return true;\n } catch {\n return false;\n }\n };\n}\n\nexport function makeSqlTableProbe(db: SqlExecutable): TableProbe {\n return async (table) => {\n try {\n await db.execute(sql`select 1 from ${sql.identifier(table)} limit 0`);\n return true;\n } catch {\n return false;\n }\n };\n}\n","/**\n * MySQL store implementation for the Drizzle adapter. Built against the\n * published `./schema/mysql.ts` tables.\n *\n * Like the postgres dialect, this is NOT exercised by a live conformance run\n * in this sandbox (no docker — Drizzle's CI conformance obligation is\n * the Postgres variant; see `./postgres-adapter.ts`'s header and\n * `test/db/drizzle.test.ts`). MySQL has neither `RETURNING` nor a\n * conditional/`WHERE` clause on `ON DUPLICATE KEY UPDATE` (confirmed against\n * the installed `drizzle-orm@0.45.2`'s `mysql-core` insert query-builder\n * types — no `setWhere`/`where` option exists there, unlike pg-core's), so\n * this file follows the same two sanctioned techniques as the (not yet\n * shipped) mysql raw-driver adapter's own design brief, verbatim:\n *\n * - No `RETURNING`: every write is followed by a `SELECT` on the same\n * connection/transaction to fetch the resulting row.\n * - `webhookEvents.claim`: a raw `INSERT ... ON DUPLICATE KEY UPDATE\n * claimed_at = IF(applied_at IS NULL AND claimed_at <= ?, ?, claimed_at)`\n * detects ownership from `mysql2`'s affected-rows semantics — WITHOUT the\n * `CLIENT_FOUND_ROWS` flag (`mysql2`'s default): `affectedRows === 1` means\n * a fresh INSERT (first sight, we win); `=== 2` means the UPDATE branch\n * actually changed `claimed_at` (we won a steal); `=== 0` means the row\n * matched but nothing changed (we lost). This is a single server\n * round-trip, unlike every other write in this file.\n *\n * `balances.consume` uses `db.transaction()` + `.for(\"update\")` (raw\n * `SELECT ... FOR UPDATE` via the query builder) to recompute the current\n * billing window through `src/products/period.ts` — same reasoning as the\n * postgres/sqlite dialect files: no portable single statement can replicate\n * that calendar arithmetic.\n */\nimport { and, eq, sql } from \"drizzle-orm\";\nimport { MySqlDatabase, type AnyMySqlQueryResultHKT, type PreparedQueryHKTBase } from \"drizzle-orm/mysql-core\";\nimport { PayweaveNotFoundError } from \"../../core/errors\";\nimport { currentPeriod } from \"../../products/period\";\nimport type { DatabaseAdapter, PwConsumeInput, PwConsumeResult } from \"../index\";\nimport {\n DEFAULT_STALE_CLAIM_AFTER_MS,\n PW_ACTIVE_SUBSCRIPTION_STATUSES,\n type PwCustomerUpsert,\n type PwFeatureBalanceInit,\n type PwPlanVersionInput,\n type PwSubscriptionInput,\n type PwSubscriptionPatch,\n} from \"../schema\";\nimport { wrapDriverError } from \"./errors\";\nimport { generatePwId } from \"./id\";\nimport { planContentEquals } from \"./plan-content\";\nimport {\n pwCustomers,\n pwFeatureBalances,\n pwPlans,\n pwSubscriptions,\n pwWebhookEvents,\n} from \"./schema/mysql\";\nimport { createVerifier, findMissingTablesForStatus, makeSqlTableProbe } from \"./verify\";\n\n/** Any `drizzle-orm` mysql instance (`mysql2`, PlanetScale, TiDB, …). */\nexport type MysqlDrizzleDb = MySqlDatabase<AnyMySqlQueryResultHKT, PreparedQueryHKTBase>;\n\nconst DRIZZLE_KIT_INSTRUCTIONS =\n \"payweave/db/drizzle never runs migrations for you. Merge \" +\n '\"payweave/db/drizzle\"\\'s published schema (see `./schema/mysql.ts`) into your own Drizzle ' +\n \"schema, then run `drizzle-kit push` (dev) or `drizzle-kit generate` + `drizzle-kit migrate` \" +\n \"(tracked migrations) yourself.\";\n\n/** A `mysql2`-shaped write result — `ResultSetHeader` (see the module header). */\ninterface MysqlWriteResult {\n affectedRows: number;\n}\n\nfunction asWriteResult(raw: unknown): MysqlWriteResult {\n const header = Array.isArray(raw) ? raw[0] : raw;\n const affectedRows = (header as { affectedRows?: unknown } | null)?.affectedRows;\n return { affectedRows: typeof affectedRows === \"number\" ? affectedRows : 0 };\n}\n\n/** Build a full `DatabaseAdapter` over a Drizzle mysql `db` (or an open `tx`). */\nexport function buildMysqlAdapter(db: MysqlDrizzleDb): DatabaseAdapter {\n const ensureVerified = createVerifier(makeSqlTableProbe(db));\n function guarded<Args extends unknown[], T>(\n fn: (...args: Args) => Promise<T>,\n ): (...args: Args) => Promise<T> {\n return async (...args: Args) => {\n await ensureVerified();\n return fn(...args);\n };\n }\n\n return {\n dialect: \"mysql\",\n customers: {\n getByExternalId: guarded((externalId: string) => customersGetByExternalId(db, externalId)),\n upsert: guarded((input: PwCustomerUpsert) => customersUpsert(db, input)),\n linkProviderRef: guarded((externalId: string, provider: string, ref: string) =>\n customersLinkProviderRef(db, externalId, provider, ref),\n ),\n },\n plans: {\n getActiveVersion: guarded((planId: string) => plansGetActiveVersion(db, planId)),\n listActive: guarded(() => plansListActive(db)),\n pushVersion: guarded((plan: PwPlanVersionInput) => plansPushVersion(db, plan)),\n },\n subscriptions: {\n getActive: guarded((customerId: string, group: string) =>\n subscriptionsGetActive(db, customerId, group),\n ),\n create: guarded((input: PwSubscriptionInput) => subscriptionsCreate(db, input)),\n update: guarded((id: string, patch: PwSubscriptionPatch) =>\n subscriptionsUpdate(db, id, patch),\n ),\n },\n balances: {\n get: guarded((customerId: string, featureId: string, group: string) =>\n balancesGet(db, customerId, featureId, group),\n ),\n consume: guarded((input: PwConsumeInput) => balancesConsume(db, input)),\n resetTo: guarded(\n (customerId: string, featureId: string, group: string, init: PwFeatureBalanceInit) =>\n balancesResetTo(db, customerId, featureId, group, init),\n ),\n },\n webhookEvents: {\n claim: guarded(\n (\n dedupeKey: string,\n meta: { provider: string; type: string; now: Date; staleClaimAfterMs?: number },\n ) => webhookEventsClaim(db, dedupeKey, meta),\n ),\n markApplied: guarded((dedupeKey: string) => webhookEventsMarkApplied(db, dedupeKey)),\n },\n migrations: {\n status: async () => {\n const missing = await findMissingTablesForStatus(makeSqlTableProbe(db));\n return missing.length > 0\n ? { pending: [\"0001_init\"], applied: [] }\n : { pending: [], applied: [\"0001_init\"] };\n },\n apply: () => Promise.resolve({ applied: [], instructions: DRIZZLE_KIT_INSTRUCTIONS }),\n },\n transaction: (fn) => db.transaction((tx) => fn(buildMysqlAdapter(tx))),\n };\n}\n\n// ── customers ────────────────────────────────────────────────────────────────\n\nasync function customersGetByExternalId(db: MysqlDrizzleDb, externalId: string) {\n const rows = await db.select().from(pwCustomers).where(eq(pwCustomers.externalId, externalId));\n return rows[0] ?? null;\n}\n\nasync function customersUpsert(db: MysqlDrizzleDb, input: PwCustomerUpsert) {\n const now = new Date();\n const id = generatePwId(now.getTime());\n // Omitting `email` from `set` when not provided (rather than a raw\n // `VALUES(email)` expression, deprecated since MySQL 8.0.20) leaves the\n // existing value untouched — ON DUPLICATE KEY UPDATE only rewrites the\n // columns it's told to.\n const set: Record<string, unknown> = { updatedAt: now };\n if (input.email !== undefined) set.email = input.email;\n try {\n await db\n .insert(pwCustomers)\n .values({\n id,\n externalId: input.externalId,\n providerIds: {},\n email: input.email ?? null,\n createdAt: now,\n updatedAt: now,\n })\n .onDuplicateKeyUpdate({ set });\n const rows = await db.select().from(pwCustomers).where(eq(pwCustomers.externalId, input.externalId));\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (mysql): customers.upsert returned no row\");\n return row;\n } catch (error) {\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (mysql): customers.upsert(${JSON.stringify(input.externalId)}) failed.`,\n );\n }\n}\n\nasync function customersLinkProviderRef(\n db: MysqlDrizzleDb,\n externalId: string,\n provider: string,\n ref: string,\n): Promise<void> {\n await db.transaction(async (tx) => {\n const rows = await tx\n .select()\n .from(pwCustomers)\n .where(eq(pwCustomers.externalId, externalId))\n .for(\"update\");\n const row = rows[0];\n if (!row) {\n throw new PayweaveNotFoundError(\n `payweave/db/drizzle (mysql): customers.linkProviderRef: no customer with externalId ` +\n `${JSON.stringify(externalId)}.`,\n );\n }\n const providerIds = { ...row.providerIds, [provider]: ref };\n await tx\n .update(pwCustomers)\n .set({ providerIds, updatedAt: new Date() })\n .where(eq(pwCustomers.externalId, externalId));\n });\n}\n\n// ── plans ────────────────────────────────────────────────────────────────────\n\nasync function plansGetActiveVersion(db: MysqlDrizzleDb, planId: string) {\n const rows = await db\n .select()\n .from(pwPlans)\n .where(eq(pwPlans.planId, planId))\n .orderBy(sql`${pwPlans.version} desc`)\n .limit(1);\n return rows[0] ?? null;\n}\n\nasync function plansListActive(db: MysqlDrizzleDb) {\n const latest = db\n .select({\n planId: pwPlans.planId,\n version: sql<number>`max(${pwPlans.version})`.as(\"max_version\"),\n })\n .from(pwPlans)\n .groupBy(pwPlans.planId)\n .as(\"latest\");\n return db\n .select({\n id: pwPlans.id,\n planId: pwPlans.planId,\n version: pwPlans.version,\n group: pwPlans.group,\n isDefault: pwPlans.isDefault,\n name: pwPlans.name,\n priceMinor: pwPlans.priceMinor,\n priceCurrency: pwPlans.priceCurrency,\n priceInterval: pwPlans.priceInterval,\n features: pwPlans.features,\n providerRefs: pwPlans.providerRefs,\n pushedAt: pwPlans.pushedAt,\n })\n .from(pwPlans)\n .innerJoin(latest, and(eq(latest.planId, pwPlans.planId), eq(latest.version, pwPlans.version)));\n}\n\nasync function plansPushVersion(db: MysqlDrizzleDb, plan: PwPlanVersionInput) {\n return db.transaction(async (tx) => {\n const activeRows = await tx\n .select()\n .from(pwPlans)\n .where(eq(pwPlans.planId, plan.planId))\n .orderBy(sql`${pwPlans.version} desc`)\n .limit(1)\n .for(\"update\");\n const active = activeRows[0] ?? null;\n if (active && planContentEquals(active, plan)) {\n return active;\n }\n const now = new Date();\n const id = generatePwId(now.getTime());\n const nextVersion = (active?.version ?? 0) + 1;\n await tx.insert(pwPlans).values({\n id,\n planId: plan.planId,\n version: nextVersion,\n group: plan.group,\n isDefault: plan.isDefault,\n name: plan.name,\n priceMinor: plan.priceMinor,\n priceCurrency: plan.priceCurrency,\n priceInterval: plan.priceInterval,\n features: plan.features,\n providerRefs: plan.providerRefs,\n pushedAt: now,\n });\n const rows = await tx.select().from(pwPlans).where(eq(pwPlans.id, id));\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (mysql): plans.pushVersion returned no row\");\n return row;\n });\n}\n\n// ── subscriptions ────────────────────────────────────────────────────────────\n\nasync function subscriptionsGetActive(db: MysqlDrizzleDb, customerId: string, group: string) {\n const rows = await db\n .select()\n .from(pwSubscriptions)\n .where(\n and(\n eq(pwSubscriptions.customerId, customerId),\n eq(pwSubscriptions.group, group),\n sql`${pwSubscriptions.status} in ${PW_ACTIVE_SUBSCRIPTION_STATUSES}`,\n ),\n );\n return rows[0] ?? null;\n}\n\nasync function subscriptionsCreate(db: MysqlDrizzleDb, input: PwSubscriptionInput) {\n const now = new Date();\n const id = generatePwId(now.getTime());\n try {\n await db.insert(pwSubscriptions).values({\n id,\n customerId: input.customerId,\n planId: input.planId,\n planVersion: input.planVersion,\n group: input.group,\n status: input.status,\n provider: input.provider,\n providerSubscriptionRef: input.providerSubscriptionRef,\n currentPeriodStart: input.currentPeriodStart,\n currentPeriodEnd: input.currentPeriodEnd,\n cancelAtPeriodEnd: input.cancelAtPeriodEnd,\n createdAt: now,\n updatedAt: now,\n });\n const rows = await db.select().from(pwSubscriptions).where(eq(pwSubscriptions.id, id));\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (mysql): subscriptions.create returned no row\");\n return row;\n } catch (error) {\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (mysql): subscriptions.create for customer ` +\n `${JSON.stringify(input.customerId)} group ${JSON.stringify(input.group)} violated a ` +\n \"uniqueness rule (an active-set subscription already exists for this customer/group, or \" +\n \"another constraint failed).\",\n );\n }\n}\n\nasync function subscriptionsUpdate(db: MysqlDrizzleDb, id: string, patch: PwSubscriptionPatch) {\n const set: Record<string, unknown> = { updatedAt: new Date() };\n for (const [key, value] of Object.entries(patch)) {\n if (value !== undefined) set[key] = value;\n }\n try {\n // mysql-core has no `RETURNING` (module header): the UPDATE's own\n // affected-rows count can't distinguish \"no such id\" from \"id exists but\n // the update was a no-op\" (mysql2 reports 0 for both without\n // `CLIENT_FOUND_ROWS`), so a single follow-up SELECT resolves both —\n // fetching the row, then checking whether it exists at all.\n await db.update(pwSubscriptions).set(set).where(eq(pwSubscriptions.id, id));\n const rows = await db.select().from(pwSubscriptions).where(eq(pwSubscriptions.id, id));\n const row = rows[0];\n if (!row) {\n throw new PayweaveNotFoundError(\n `payweave/db/drizzle (mysql): subscriptions.update: no subscription with id ` +\n `${JSON.stringify(id)}.`,\n );\n }\n return row;\n } catch (error) {\n if (error instanceof PayweaveNotFoundError) throw error;\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (mysql): subscriptions.update(${JSON.stringify(id)}) failed.`,\n );\n }\n}\n\n// ── balances ─────────────────────────────────────────────────────────────────\n\nasync function balancesGet(db: MysqlDrizzleDb, customerId: string, featureId: string, group: string) {\n const rows = await db\n .select()\n .from(pwFeatureBalances)\n .where(\n and(\n eq(pwFeatureBalances.customerId, customerId),\n eq(pwFeatureBalances.featureId, featureId),\n eq(pwFeatureBalances.group, group),\n ),\n );\n return rows[0] ?? null;\n}\n\nasync function balancesConsume(db: MysqlDrizzleDb, input: PwConsumeInput): Promise<PwConsumeResult> {\n return db.transaction(async (tx) => {\n const existingRows = await tx\n .select()\n .from(pwFeatureBalances)\n .where(\n and(\n eq(pwFeatureBalances.customerId, input.customerId),\n eq(pwFeatureBalances.featureId, input.featureId),\n eq(pwFeatureBalances.group, input.group),\n ),\n )\n .for(\"update\");\n const existingRow = existingRows[0];\n const nowMs = input.now.getTime();\n\n if (!existingRow) {\n const period = currentPeriod(input.init.anchor.getTime(), input.init.resetInterval, nowMs);\n const remaining = input.init.limit;\n const applied = input.conditional !== true || remaining >= input.amount;\n const used = applied ? input.amount : 0;\n const id = generatePwId(nowMs);\n await tx.insert(pwFeatureBalances).values({\n id,\n customerId: input.customerId,\n featureId: input.featureId,\n group: input.group,\n used,\n limit: input.init.limit,\n resetInterval: input.init.resetInterval,\n anchor: input.init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: input.init.planId,\n planVersion: input.init.planVersion,\n updatedAt: input.now,\n });\n const rows = await tx.select().from(pwFeatureBalances).where(eq(pwFeatureBalances.id, id));\n const row = rows[0];\n if (!row) {\n throw new Error(\"drizzle adapter (mysql): balances.consume (create) returned no row\");\n }\n return { ...row, applied };\n }\n\n const resetDue = nowMs >= existingRow.periodEnd.getTime();\n const baseUsed = resetDue ? 0 : existingRow.used;\n const period = resetDue\n ? currentPeriod(existingRow.anchor.getTime(), existingRow.resetInterval, nowMs)\n : { start: existingRow.periodStart.getTime(), end: existingRow.periodEnd.getTime() };\n const remaining = existingRow.limit - baseUsed;\n const applied = input.conditional !== true || remaining >= input.amount;\n\n if (!applied && !resetDue) {\n return { ...existingRow, applied: false };\n }\n\n const finalUsed = applied ? baseUsed + input.amount : baseUsed;\n await tx\n .update(pwFeatureBalances)\n .set({\n used: finalUsed,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n updatedAt: input.now,\n })\n .where(eq(pwFeatureBalances.id, existingRow.id));\n const rows = await tx\n .select()\n .from(pwFeatureBalances)\n .where(eq(pwFeatureBalances.id, existingRow.id));\n const updatedRow = rows[0];\n if (!updatedRow) {\n throw new Error(\"drizzle adapter (mysql): balances.consume (update) returned no row\");\n }\n return { ...updatedRow, applied };\n });\n}\n\nasync function balancesResetTo(\n db: MysqlDrizzleDb,\n customerId: string,\n featureId: string,\n group: string,\n init: PwFeatureBalanceInit,\n): Promise<void> {\n const now = new Date();\n const period = currentPeriod(init.anchor.getTime(), init.resetInterval, now.getTime());\n const id = generatePwId(now.getTime());\n await db\n .insert(pwFeatureBalances)\n .values({\n id,\n customerId,\n featureId,\n group,\n used: 0,\n limit: init.limit,\n resetInterval: init.resetInterval,\n anchor: init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: init.planId,\n planVersion: init.planVersion,\n updatedAt: now,\n })\n .onDuplicateKeyUpdate({\n set: {\n used: 0,\n limit: init.limit,\n resetInterval: init.resetInterval,\n anchor: init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: init.planId,\n planVersion: init.planVersion,\n updatedAt: now,\n },\n });\n}\n\n// ── webhookEvents ────────────────────────────────────────────────────────────\n\nasync function webhookEventsClaim(\n db: MysqlDrizzleDb,\n dedupeKey: string,\n meta: { provider: string; type: string; now: Date; staleClaimAfterMs?: number },\n): Promise<boolean> {\n const staleClaimAfterMs = meta.staleClaimAfterMs ?? DEFAULT_STALE_CLAIM_AFTER_MS;\n const staleThreshold = new Date(meta.now.getTime() - staleClaimAfterMs);\n // Raw SQL: mysql-core's `.onDuplicateKeyUpdate` has no conditional/`WHERE`\n // form (see module header) — the `IF(...)` expression is the standard\n // MySQL substitute (the sanctioned technique).\n const raw = await db.execute(\n sql`insert into ${pwWebhookEvents} (dedupe_key, provider, type, received_at, claimed_at, applied_at)\n values (${dedupeKey}, ${meta.provider}, ${meta.type}, ${meta.now}, ${meta.now}, null)\n on duplicate key update claimed_at = if(applied_at is null and claimed_at <= ${staleThreshold}, ${meta.now}, claimed_at)`,\n );\n const result = asWriteResult(raw);\n // See module header: 1 = fresh insert (we win), 2 = the UPDATE branch\n // actually changed claimed_at (we won a steal), 0 = matched but unchanged.\n return result.affectedRows === 1 || result.affectedRows === 2;\n}\n\nasync function webhookEventsMarkApplied(db: MysqlDrizzleDb, dedupeKey: string): Promise<void> {\n await db\n .update(pwWebhookEvents)\n .set({ appliedAt: new Date() })\n .where(eq(pwWebhookEvents.dedupeKey, dedupeKey));\n}\n","/**\n * Published Drizzle schema — PostgreSQL dialect (docs/v1/database.md §2/§4,\n * PW-708). Merge these table definitions into your own `schema.ts` and\n * migrate them with `drizzle-kit` (`push` for local/dev, `generate` +\n * `migrate` for tracked migrations) — Payweave never runs migrations for the\n * Drizzle adapter itself (`../index.ts`'s `migrations.apply()` returns\n * instructions, never DDL; database.md §4 \"Same model\" as the Prisma\n * adapter). This is the dialect the shared conformance suite runs against in\n * CI — a dockerized `postgres:16` via PW-710's matrix; it\n * cannot run in this sandbox (no docker), so it is exercised here via the\n * schema + adapter code, not a live conformance run (see `test/db/drizzle.test.ts`).\n *\n * Column-for-column equivalent to `src/db/migrations/ddl.ts`'s\n * `POSTGRES_INIT_STATEMENTS` — asserted by `test/db/drizzle.test.ts`'s\n * cross-dialect parity test. Per-dialect storage mapping:\n * `timestamptz` timestamps, `jsonb` JSON, native `boolean`, `bigint` (mode\n * `\"number\"`, since these values are safe-integer money/usage counters —\n * AGENTS.md rule 7 — never JS `bigint`) for money/usage/version-scale integers.\n *\n * The `pw_subscriptions` partial-unique active-subscription rule (database.md\n * §2) uses Postgres's NATIVE partial index support: `uniqueIndex(...).where(...)`.\n */\nimport { sql } from \"drizzle-orm\";\nimport { bigint, boolean, integer, jsonb, pgTable, text, timestamp, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport type {\n PwFeatureInclusion,\n PwPriceInterval,\n PwResetInterval,\n PwSubscriptionStatus,\n} from \"../../schema\";\nimport { PW_ACTIVE_SUBSCRIPTION_STATUSES, PW_TABLES } from \"../../schema\";\n\n/** `status IN (...)` list for the partial-unique index, derived from the contract constant. */\nconst ACTIVE_STATUS_SQL_LIST = sql.raw(\n PW_ACTIVE_SUBSCRIPTION_STATUSES.map((s) => `'${s}'`).join(\", \"),\n);\n\nexport const pwCustomers = pgTable(PW_TABLES.customers, {\n id: text(\"id\").primaryKey(),\n externalId: text(\"external_id\").notNull().unique(),\n providerIds: jsonb(\"provider_ids\").$type<Record<string, string>>().notNull(),\n email: text(\"email\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n});\n\nexport const pwPlans = pgTable(\n PW_TABLES.plans,\n {\n id: text(\"id\").primaryKey(),\n planId: text(\"plan_id\").notNull(),\n version: integer(\"version\").notNull(),\n group: text(\"group\").notNull(),\n isDefault: boolean(\"is_default\").notNull(),\n name: text(\"name\"),\n priceMinor: bigint(\"price_minor\", { mode: \"number\" }),\n priceCurrency: text(\"price_currency\"),\n priceInterval: text(\"price_interval\").$type<PwPriceInterval>(),\n features: jsonb(\"features\").$type<Record<string, PwFeatureInclusion>>().notNull(),\n providerRefs: jsonb(\"provider_refs\").$type<Record<string, Record<string, string>>>().notNull(),\n pushedAt: timestamp(\"pushed_at\", { withTimezone: true }).notNull(),\n },\n (t) => [uniqueIndex(\"pw_plans_plan_id_version_uq\").on(t.planId, t.version)],\n);\n\nexport const pwSubscriptions = pgTable(\n PW_TABLES.subscriptions,\n {\n id: text(\"id\").primaryKey(),\n customerId: text(\"customer_id\")\n .notNull()\n .references(() => pwCustomers.id),\n planId: text(\"plan_id\").notNull(),\n planVersion: integer(\"plan_version\").notNull(),\n group: text(\"group\").notNull(),\n status: text(\"status\").$type<PwSubscriptionStatus>().notNull(),\n provider: text(\"provider\"),\n providerSubscriptionRef: text(\"provider_subscription_ref\"),\n currentPeriodStart: timestamp(\"current_period_start\", { withTimezone: true }).notNull(),\n currentPeriodEnd: timestamp(\"current_period_end\", { withTimezone: true }).notNull(),\n cancelAtPeriodEnd: boolean(\"cancel_at_period_end\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n },\n (t) => [\n uniqueIndex(\"pw_subscriptions_active_uq\")\n .on(t.customerId, t.group)\n .where(sql`${t.status} IN (${ACTIVE_STATUS_SQL_LIST})`),\n ],\n);\n\nexport const pwFeatureBalances = pgTable(\n PW_TABLES.featureBalances,\n {\n id: text(\"id\").primaryKey(),\n customerId: text(\"customer_id\")\n .notNull()\n .references(() => pwCustomers.id),\n featureId: text(\"feature_id\").notNull(),\n group: text(\"group\").notNull(),\n used: bigint(\"used\", { mode: \"number\" }).notNull(),\n limit: bigint(\"limit\", { mode: \"number\" }).notNull(),\n resetInterval: text(\"reset_interval\").$type<PwResetInterval>().notNull(),\n anchor: timestamp(\"anchor\", { withTimezone: true }).notNull(),\n periodStart: timestamp(\"period_start\", { withTimezone: true }).notNull(),\n periodEnd: timestamp(\"period_end\", { withTimezone: true }).notNull(),\n planId: text(\"plan_id\").notNull(),\n planVersion: integer(\"plan_version\").notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n },\n (t) => [\n uniqueIndex(\"pw_feature_balances_customer_feature_group_uq\").on(\n t.customerId,\n t.featureId,\n t.group,\n ),\n ],\n);\n\nexport const pwWebhookEvents = pgTable(PW_TABLES.webhookEvents, {\n dedupeKey: text(\"dedupe_key\").primaryKey(),\n provider: text(\"provider\").notNull(),\n type: text(\"type\").notNull(),\n receivedAt: timestamp(\"received_at\", { withTimezone: true }).notNull(),\n claimedAt: timestamp(\"claimed_at\", { withTimezone: true }),\n appliedAt: timestamp(\"applied_at\", { withTimezone: true }),\n});\n\n/** Every table this schema publishes, keyed the same way as `PW_TABLES`. */\nexport const pgSchema = {\n pwCustomers,\n pwPlans,\n pwSubscriptions,\n pwFeatureBalances,\n pwWebhookEvents,\n};\n","/**\n * PostgreSQL store implementation for the Drizzle adapter. Built against the\n * published `./schema/pg.ts` tables.\n *\n * This is the dialect the shared conformance suite runs against in CI\n * (dockerized `postgres:16` + `drizzle-kit push`)\n * — unavailable in this sandbox (no docker), so it is NOT exercised\n * by a live conformance run here (`test/db/drizzle.test.ts` documents the\n * gate). The code below follows the Postgres/Drizzle approach\n * exactly: `db.transaction()` (a REAL row-locked transaction on a dedicated\n * pooled connection — unlike the sqlite dialect, `drizzle-orm`'s postgres\n * `.transaction()` supports concurrent async callbacks correctly) plus raw\n * `FOR UPDATE` (via the query builder's `.for(\"update\")`, not a raw `sql`\n * fragment — pg-core exposes it natively) for the one read `balances.consume`\n * needs to recompute the current billing window via `src/products/period.ts`\n * (same reasoning as the sqlite adapter: no portable single\n * statement can replicate that calendar arithmetic safely).\n */\nimport { and, eq, sql } from \"drizzle-orm\";\nimport { PgDatabase, type PgQueryResultHKT } from \"drizzle-orm/pg-core\";\nimport { PayweaveNotFoundError } from \"../../core/errors\";\nimport { currentPeriod } from \"../../products/period\";\nimport type { DatabaseAdapter, PwConsumeInput, PwConsumeResult } from \"../index\";\nimport {\n DEFAULT_STALE_CLAIM_AFTER_MS,\n PW_ACTIVE_SUBSCRIPTION_STATUSES,\n type PwCustomerUpsert,\n type PwFeatureBalanceInit,\n type PwPlanVersionInput,\n type PwSubscriptionInput,\n type PwSubscriptionPatch,\n} from \"../schema\";\nimport { wrapDriverError } from \"./errors\";\nimport { generatePwId } from \"./id\";\nimport { planContentEquals } from \"./plan-content\";\nimport {\n pwCustomers,\n pwFeatureBalances,\n pwPlans,\n pwSubscriptions,\n pwWebhookEvents,\n} from \"./schema/pg\";\nimport { createVerifier, findMissingTablesForStatus, makeSqlTableProbe } from \"./verify\";\n\n/** Any `drizzle-orm` postgres instance (`node-postgres`, `postgres-js`, `neon`, …). */\nexport type PostgresDrizzleDb = PgDatabase<PgQueryResultHKT>;\n\nconst DRIZZLE_KIT_INSTRUCTIONS =\n \"payweave/db/drizzle never runs migrations for you. Merge \" +\n '\"payweave/db/drizzle\"\\'s published schema (see `./schema/pg.ts`) into your own Drizzle schema, ' +\n \"then run `drizzle-kit push` (dev) or `drizzle-kit generate` + `drizzle-kit migrate` (tracked \" +\n \"migrations) yourself.\";\n\n/** Build a full `DatabaseAdapter` over a Drizzle postgres `db` (or an open `tx`). */\nexport function buildPostgresAdapter(db: PostgresDrizzleDb): DatabaseAdapter {\n const ensureVerified = createVerifier(makeSqlTableProbe(db));\n function guarded<Args extends unknown[], T>(\n fn: (...args: Args) => Promise<T>,\n ): (...args: Args) => Promise<T> {\n return async (...args: Args) => {\n await ensureVerified();\n return fn(...args);\n };\n }\n\n return {\n dialect: \"postgres\",\n customers: {\n getByExternalId: guarded((externalId: string) => customersGetByExternalId(db, externalId)),\n upsert: guarded((input: PwCustomerUpsert) => customersUpsert(db, input)),\n linkProviderRef: guarded((externalId: string, provider: string, ref: string) =>\n customersLinkProviderRef(db, externalId, provider, ref),\n ),\n },\n plans: {\n getActiveVersion: guarded((planId: string) => plansGetActiveVersion(db, planId)),\n listActive: guarded(() => plansListActive(db)),\n pushVersion: guarded((plan: PwPlanVersionInput) => plansPushVersion(db, plan)),\n },\n subscriptions: {\n getActive: guarded((customerId: string, group: string) =>\n subscriptionsGetActive(db, customerId, group),\n ),\n create: guarded((input: PwSubscriptionInput) => subscriptionsCreate(db, input)),\n update: guarded((id: string, patch: PwSubscriptionPatch) =>\n subscriptionsUpdate(db, id, patch),\n ),\n },\n balances: {\n get: guarded((customerId: string, featureId: string, group: string) =>\n balancesGet(db, customerId, featureId, group),\n ),\n consume: guarded((input: PwConsumeInput) => balancesConsume(db, input)),\n resetTo: guarded(\n (customerId: string, featureId: string, group: string, init: PwFeatureBalanceInit) =>\n balancesResetTo(db, customerId, featureId, group, init),\n ),\n },\n webhookEvents: {\n claim: guarded(\n (\n dedupeKey: string,\n meta: { provider: string; type: string; now: Date; staleClaimAfterMs?: number },\n ) => webhookEventsClaim(db, dedupeKey, meta),\n ),\n markApplied: guarded((dedupeKey: string) => webhookEventsMarkApplied(db, dedupeKey)),\n },\n migrations: {\n status: async () => {\n const missing = await findMissingTablesForStatus(makeSqlTableProbe(db));\n return missing.length > 0\n ? { pending: [\"0001_init\"], applied: [] }\n : { pending: [], applied: [\"0001_init\"] };\n },\n apply: () => Promise.resolve({ applied: [], instructions: DRIZZLE_KIT_INSTRUCTIONS }),\n },\n transaction: (fn) => db.transaction((tx) => fn(buildPostgresAdapter(tx))),\n };\n}\n\n// ── customers ────────────────────────────────────────────────────────────────\n\nasync function customersGetByExternalId(db: PostgresDrizzleDb, externalId: string) {\n const rows = await db.select().from(pwCustomers).where(eq(pwCustomers.externalId, externalId));\n return rows[0] ?? null;\n}\n\nasync function customersUpsert(db: PostgresDrizzleDb, input: PwCustomerUpsert) {\n const now = new Date();\n const id = generatePwId(now.getTime());\n try {\n const rows = await db\n .insert(pwCustomers)\n .values({\n id,\n externalId: input.externalId,\n providerIds: {},\n email: input.email ?? null,\n createdAt: now,\n updatedAt: now,\n })\n .onConflictDoUpdate({\n target: pwCustomers.externalId,\n set: {\n email: sql`coalesce(excluded.email, ${pwCustomers.email})`,\n updatedAt: now,\n },\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (postgres): customers.upsert returned no row\");\n return row;\n } catch (error) {\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (postgres): customers.upsert(${JSON.stringify(input.externalId)}) failed.`,\n );\n }\n}\n\nasync function customersLinkProviderRef(\n db: PostgresDrizzleDb,\n externalId: string,\n provider: string,\n ref: string,\n): Promise<void> {\n await db.transaction(async (tx) => {\n const rows = await tx\n .select()\n .from(pwCustomers)\n .where(eq(pwCustomers.externalId, externalId))\n .for(\"update\");\n const row = rows[0];\n if (!row) {\n throw new PayweaveNotFoundError(\n `payweave/db/drizzle (postgres): customers.linkProviderRef: no customer with externalId ` +\n `${JSON.stringify(externalId)}.`,\n );\n }\n const providerIds = { ...row.providerIds, [provider]: ref };\n await tx\n .update(pwCustomers)\n .set({ providerIds, updatedAt: new Date() })\n .where(eq(pwCustomers.externalId, externalId));\n });\n}\n\n// ── plans ────────────────────────────────────────────────────────────────────\n\nasync function plansGetActiveVersion(db: PostgresDrizzleDb, planId: string) {\n const rows = await db\n .select()\n .from(pwPlans)\n .where(eq(pwPlans.planId, planId))\n .orderBy(sql`${pwPlans.version} desc`)\n .limit(1);\n return rows[0] ?? null;\n}\n\nasync function plansListActive(db: PostgresDrizzleDb) {\n const latest = db\n .select({\n planId: pwPlans.planId,\n version: sql<number>`max(${pwPlans.version})`.as(\"max_version\"),\n })\n .from(pwPlans)\n .groupBy(pwPlans.planId)\n .as(\"latest\");\n return db\n .select({\n id: pwPlans.id,\n planId: pwPlans.planId,\n version: pwPlans.version,\n group: pwPlans.group,\n isDefault: pwPlans.isDefault,\n name: pwPlans.name,\n priceMinor: pwPlans.priceMinor,\n priceCurrency: pwPlans.priceCurrency,\n priceInterval: pwPlans.priceInterval,\n features: pwPlans.features,\n providerRefs: pwPlans.providerRefs,\n pushedAt: pwPlans.pushedAt,\n })\n .from(pwPlans)\n .innerJoin(latest, and(eq(latest.planId, pwPlans.planId), eq(latest.version, pwPlans.version)));\n}\n\nasync function plansPushVersion(db: PostgresDrizzleDb, plan: PwPlanVersionInput) {\n return db.transaction(async (tx) => {\n const activeRows = await tx\n .select()\n .from(pwPlans)\n .where(eq(pwPlans.planId, plan.planId))\n .orderBy(sql`${pwPlans.version} desc`)\n .limit(1)\n .for(\"update\");\n const active = activeRows[0] ?? null;\n if (active && planContentEquals(active, plan)) {\n return active;\n }\n const now = new Date();\n const id = generatePwId(now.getTime());\n const nextVersion = (active?.version ?? 0) + 1;\n const rows = await tx\n .insert(pwPlans)\n .values({\n id,\n planId: plan.planId,\n version: nextVersion,\n group: plan.group,\n isDefault: plan.isDefault,\n name: plan.name,\n priceMinor: plan.priceMinor,\n priceCurrency: plan.priceCurrency,\n priceInterval: plan.priceInterval,\n features: plan.features,\n providerRefs: plan.providerRefs,\n pushedAt: now,\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (postgres): plans.pushVersion returned no row\");\n return row;\n });\n}\n\n// ── subscriptions ────────────────────────────────────────────────────────────\n\nasync function subscriptionsGetActive(db: PostgresDrizzleDb, customerId: string, group: string) {\n const rows = await db\n .select()\n .from(pwSubscriptions)\n .where(\n and(\n eq(pwSubscriptions.customerId, customerId),\n eq(pwSubscriptions.group, group),\n sql`${pwSubscriptions.status} in ${PW_ACTIVE_SUBSCRIPTION_STATUSES}`,\n ),\n );\n return rows[0] ?? null;\n}\n\nasync function subscriptionsCreate(db: PostgresDrizzleDb, input: PwSubscriptionInput) {\n const now = new Date();\n const id = generatePwId(now.getTime());\n try {\n const rows = await db\n .insert(pwSubscriptions)\n .values({\n id,\n customerId: input.customerId,\n planId: input.planId,\n planVersion: input.planVersion,\n group: input.group,\n status: input.status,\n provider: input.provider,\n providerSubscriptionRef: input.providerSubscriptionRef,\n currentPeriodStart: input.currentPeriodStart,\n currentPeriodEnd: input.currentPeriodEnd,\n cancelAtPeriodEnd: input.cancelAtPeriodEnd,\n createdAt: now,\n updatedAt: now,\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (postgres): subscriptions.create returned no row\");\n return row;\n } catch (error) {\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (postgres): subscriptions.create for customer ` +\n `${JSON.stringify(input.customerId)} group ${JSON.stringify(input.group)} violated a ` +\n \"uniqueness rule (an active-set subscription already exists for this customer/group, or \" +\n \"another constraint failed).\",\n );\n }\n}\n\nasync function subscriptionsUpdate(db: PostgresDrizzleDb, id: string, patch: PwSubscriptionPatch) {\n const set: Record<string, unknown> = { updatedAt: new Date() };\n for (const [key, value] of Object.entries(patch)) {\n if (value !== undefined) set[key] = value;\n }\n try {\n const rows = await db\n .update(pwSubscriptions)\n .set(set)\n .where(eq(pwSubscriptions.id, id))\n .returning();\n const row = rows[0];\n if (!row) {\n throw new PayweaveNotFoundError(\n `payweave/db/drizzle (postgres): subscriptions.update: no subscription with id ` +\n `${JSON.stringify(id)}.`,\n );\n }\n return row;\n } catch (error) {\n if (error instanceof PayweaveNotFoundError) throw error;\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (postgres): subscriptions.update(${JSON.stringify(id)}) failed.`,\n );\n }\n}\n\n// ── balances ─────────────────────────────────────────────────────────────────\n\nasync function balancesGet(db: PostgresDrizzleDb, customerId: string, featureId: string, group: string) {\n const rows = await db\n .select()\n .from(pwFeatureBalances)\n .where(\n and(\n eq(pwFeatureBalances.customerId, customerId),\n eq(pwFeatureBalances.featureId, featureId),\n eq(pwFeatureBalances.group, group),\n ),\n );\n return rows[0] ?? null;\n}\n\nasync function balancesConsume(\n db: PostgresDrizzleDb,\n input: PwConsumeInput,\n): Promise<PwConsumeResult> {\n return db.transaction(async (tx) => {\n const existingRows = await tx\n .select()\n .from(pwFeatureBalances)\n .where(\n and(\n eq(pwFeatureBalances.customerId, input.customerId),\n eq(pwFeatureBalances.featureId, input.featureId),\n eq(pwFeatureBalances.group, input.group),\n ),\n )\n .for(\"update\");\n const existingRow = existingRows[0];\n const nowMs = input.now.getTime();\n\n if (!existingRow) {\n const period = currentPeriod(input.init.anchor.getTime(), input.init.resetInterval, nowMs);\n const remaining = input.init.limit;\n const applied = input.conditional !== true || remaining >= input.amount;\n const used = applied ? input.amount : 0;\n const id = generatePwId(nowMs);\n const rows = await tx\n .insert(pwFeatureBalances)\n .values({\n id,\n customerId: input.customerId,\n featureId: input.featureId,\n group: input.group,\n used,\n limit: input.init.limit,\n resetInterval: input.init.resetInterval,\n anchor: input.init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: input.init.planId,\n planVersion: input.init.planVersion,\n updatedAt: input.now,\n })\n .returning();\n const row = rows[0];\n if (!row) {\n throw new Error(\"drizzle adapter (postgres): balances.consume (create) returned no row\");\n }\n return { ...row, applied };\n }\n\n const resetDue = nowMs >= existingRow.periodEnd.getTime();\n const baseUsed = resetDue ? 0 : existingRow.used;\n const period = resetDue\n ? currentPeriod(existingRow.anchor.getTime(), existingRow.resetInterval, nowMs)\n : { start: existingRow.periodStart.getTime(), end: existingRow.periodEnd.getTime() };\n const remaining = existingRow.limit - baseUsed;\n const applied = input.conditional !== true || remaining >= input.amount;\n\n if (!applied && !resetDue) {\n return { ...existingRow, applied: false };\n }\n\n const finalUsed = applied ? baseUsed + input.amount : baseUsed;\n const rows = await tx\n .update(pwFeatureBalances)\n .set({\n used: finalUsed,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n updatedAt: input.now,\n })\n .where(eq(pwFeatureBalances.id, existingRow.id))\n .returning();\n const updatedRow = rows[0];\n if (!updatedRow) {\n throw new Error(\"drizzle adapter (postgres): balances.consume (update) returned no row\");\n }\n return { ...updatedRow, applied };\n });\n}\n\nasync function balancesResetTo(\n db: PostgresDrizzleDb,\n customerId: string,\n featureId: string,\n group: string,\n init: PwFeatureBalanceInit,\n): Promise<void> {\n const now = new Date();\n const period = currentPeriod(init.anchor.getTime(), init.resetInterval, now.getTime());\n const id = generatePwId(now.getTime());\n await db\n .insert(pwFeatureBalances)\n .values({\n id,\n customerId,\n featureId,\n group,\n used: 0,\n limit: init.limit,\n resetInterval: init.resetInterval,\n anchor: init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: init.planId,\n planVersion: init.planVersion,\n updatedAt: now,\n })\n .onConflictDoUpdate({\n target: [pwFeatureBalances.customerId, pwFeatureBalances.featureId, pwFeatureBalances.group],\n set: {\n used: 0,\n limit: init.limit,\n resetInterval: init.resetInterval,\n anchor: init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: init.planId,\n planVersion: init.planVersion,\n updatedAt: now,\n },\n });\n}\n\n// ── webhookEvents ────────────────────────────────────────────────────────────\n\nasync function webhookEventsClaim(\n db: PostgresDrizzleDb,\n dedupeKey: string,\n meta: { provider: string; type: string; now: Date; staleClaimAfterMs?: number },\n): Promise<boolean> {\n const staleClaimAfterMs = meta.staleClaimAfterMs ?? DEFAULT_STALE_CLAIM_AFTER_MS;\n const staleThreshold = new Date(meta.now.getTime() - staleClaimAfterMs);\n const rows = await db\n .insert(pwWebhookEvents)\n .values({\n dedupeKey,\n provider: meta.provider,\n type: meta.type,\n receivedAt: meta.now,\n claimedAt: meta.now,\n appliedAt: null,\n })\n .onConflictDoUpdate({\n target: pwWebhookEvents.dedupeKey,\n set: { claimedAt: meta.now },\n // See the sqlite dialect file's identical comment: `and(...)` with two\n // fixed conditions never actually returns `undefined`.\n setWhere: and(\n sql`${pwWebhookEvents.appliedAt} is null`,\n sql`${pwWebhookEvents.claimedAt} <= ${staleThreshold}`,\n )!,\n })\n .returning({ claimedAt: pwWebhookEvents.claimedAt });\n const row = rows[0];\n return row !== undefined && row.claimedAt !== null && row.claimedAt.getTime() === meta.now.getTime();\n}\n\nasync function webhookEventsMarkApplied(db: PostgresDrizzleDb, dedupeKey: string): Promise<void> {\n await db\n .update(pwWebhookEvents)\n .set({ appliedAt: new Date() })\n .where(eq(pwWebhookEvents.dedupeKey, dedupeKey));\n}\n","/**\n * Published Drizzle schema — SQLite/libSQL dialect (docs/v1/database.md\n * §2/§4, PW-708). Merge these table definitions into your own `schema.ts` and\n * migrate them with `drizzle-kit` (`push` for local/dev, `generate` +\n * `migrate` for tracked migrations) — Payweave never runs migrations for the\n * Drizzle adapter itself (`../index.ts`'s `migrations.apply()` returns\n * instructions, never DDL; database.md §4 \"Same model\" as the Prisma\n * adapter).\n *\n * Column-for-column equivalent to `src/db/migrations/ddl.ts`'s\n * `SQLITE_INIT_STATEMENTS` — asserted by `test/db/drizzle.test.ts`'s\n * cross-dialect parity test so this file, `./mysql.ts`, and `./pg.ts` can\n * never silently drift from each other or from the SQL adapters' DDL\n * knowledge. Per-dialect storage mapping: timestamps are\n * epoch-millisecond `integer` columns (`{ mode: \"timestamp_ms\" }` — drizzle\n * marshals to/from a JS `Date` automatically); JSON columns are `text`\n * (`{ mode: \"json\" }`); booleans are `integer` (`{ mode: \"boolean\" }`).\n *\n * The `pw_subscriptions` partial-unique active-subscription rule (database.md\n * §2) uses SQLite's NATIVE partial index support: `uniqueIndex(...).where(...)`.\n */\nimport { sql } from \"drizzle-orm\";\nimport { integer, sqliteTable, text, uniqueIndex } from \"drizzle-orm/sqlite-core\";\nimport type {\n PwFeatureInclusion,\n PwPriceInterval,\n PwResetInterval,\n PwSubscriptionStatus,\n} from \"../../schema\";\nimport { PW_ACTIVE_SUBSCRIPTION_STATUSES, PW_TABLES } from \"../../schema\";\n\n/** `status IN (...)` list for the partial-unique index, derived from the contract constant. */\nconst ACTIVE_STATUS_SQL_LIST = sql.raw(\n PW_ACTIVE_SUBSCRIPTION_STATUSES.map((s) => `'${s}'`).join(\", \"),\n);\n\nexport const pwCustomers = sqliteTable(PW_TABLES.customers, {\n id: text(\"id\").primaryKey(),\n externalId: text(\"external_id\").notNull().unique(),\n providerIds: text(\"provider_ids\", { mode: \"json\" }).$type<Record<string, string>>().notNull(),\n email: text(\"email\"),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" }).notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" }).notNull(),\n});\n\nexport const pwPlans = sqliteTable(\n PW_TABLES.plans,\n {\n id: text(\"id\").primaryKey(),\n planId: text(\"plan_id\").notNull(),\n version: integer(\"version\").notNull(),\n group: text(\"group\").notNull(),\n isDefault: integer(\"is_default\", { mode: \"boolean\" }).notNull(),\n name: text(\"name\"),\n priceMinor: integer(\"price_minor\"),\n priceCurrency: text(\"price_currency\"),\n priceInterval: text(\"price_interval\").$type<PwPriceInterval>(),\n features: text(\"features\", { mode: \"json\" }).$type<Record<string, PwFeatureInclusion>>().notNull(),\n providerRefs: text(\"provider_refs\", { mode: \"json\" })\n .$type<Record<string, Record<string, string>>>()\n .notNull(),\n pushedAt: integer(\"pushed_at\", { mode: \"timestamp_ms\" }).notNull(),\n },\n (t) => [uniqueIndex(\"pw_plans_plan_id_version_uq\").on(t.planId, t.version)],\n);\n\nexport const pwSubscriptions = sqliteTable(\n PW_TABLES.subscriptions,\n {\n id: text(\"id\").primaryKey(),\n customerId: text(\"customer_id\").notNull(),\n planId: text(\"plan_id\").notNull(),\n planVersion: integer(\"plan_version\").notNull(),\n group: text(\"group\").notNull(),\n status: text(\"status\").$type<PwSubscriptionStatus>().notNull(),\n provider: text(\"provider\"),\n providerSubscriptionRef: text(\"provider_subscription_ref\"),\n currentPeriodStart: integer(\"current_period_start\", { mode: \"timestamp_ms\" }).notNull(),\n currentPeriodEnd: integer(\"current_period_end\", { mode: \"timestamp_ms\" }).notNull(),\n cancelAtPeriodEnd: integer(\"cancel_at_period_end\", { mode: \"boolean\" }).notNull(),\n createdAt: integer(\"created_at\", { mode: \"timestamp_ms\" }).notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" }).notNull(),\n },\n (t) => [\n uniqueIndex(\"pw_subscriptions_active_uq\")\n .on(t.customerId, t.group)\n .where(sql`${t.status} IN (${ACTIVE_STATUS_SQL_LIST})`),\n ],\n);\n\nexport const pwFeatureBalances = sqliteTable(\n PW_TABLES.featureBalances,\n {\n id: text(\"id\").primaryKey(),\n customerId: text(\"customer_id\").notNull(),\n featureId: text(\"feature_id\").notNull(),\n group: text(\"group\").notNull(),\n used: integer(\"used\").notNull(),\n limit: integer(\"limit\").notNull(),\n resetInterval: text(\"reset_interval\").$type<PwResetInterval>().notNull(),\n anchor: integer(\"anchor\", { mode: \"timestamp_ms\" }).notNull(),\n periodStart: integer(\"period_start\", { mode: \"timestamp_ms\" }).notNull(),\n periodEnd: integer(\"period_end\", { mode: \"timestamp_ms\" }).notNull(),\n planId: text(\"plan_id\").notNull(),\n planVersion: integer(\"plan_version\").notNull(),\n updatedAt: integer(\"updated_at\", { mode: \"timestamp_ms\" }).notNull(),\n },\n (t) => [\n uniqueIndex(\"pw_feature_balances_customer_feature_group_uq\").on(\n t.customerId,\n t.featureId,\n t.group,\n ),\n ],\n);\n\nexport const pwWebhookEvents = sqliteTable(PW_TABLES.webhookEvents, {\n dedupeKey: text(\"dedupe_key\").primaryKey(),\n provider: text(\"provider\").notNull(),\n type: text(\"type\").notNull(),\n receivedAt: integer(\"received_at\", { mode: \"timestamp_ms\" }).notNull(),\n claimedAt: integer(\"claimed_at\", { mode: \"timestamp_ms\" }),\n appliedAt: integer(\"applied_at\", { mode: \"timestamp_ms\" }),\n});\n\n/** Every table this schema publishes, keyed the same way as `PW_TABLES`. */\nexport const sqliteSchema = {\n pwCustomers,\n pwPlans,\n pwSubscriptions,\n pwFeatureBalances,\n pwWebhookEvents,\n};\n","/**\n * SQLite/libSQL store implementation for the Drizzle adapter. Built against\n * the published `./schema/sqlite.ts` tables — works identically whether the\n * caller's `drizzle-orm` instance wraps `better-sqlite3` or `@libsql/client`\n * (any `BaseSQLiteDatabase`).\n *\n * ── Atomicity (spec-silent engineering decision) ────────────────────────────\n * `balances.consume` must recompute the CURRENT billing window from the row's\n * OWN stored `anchor`/`resetInterval` using `src/products/period.ts`'s exact\n * clamp-once calendar arithmetic (the conformance suite's oracle) — no\n * portable single SQL statement can replicate that safely across every\n * `drizzle-orm` sqlite backend (`./adapter.ts`'s header explains this\n * in full for the raw-driver case; the same reasoning applies here, doubled,\n * since this ONE adapter must also work over postgres/mysql `drizzle-orm`\n * instances via the SAME public interface). So `consume` reads the current\n * row, decides via `period.ts` directly, and writes the result back.\n *\n * Correctness under a high-concurrency requirement does\n * NOT come from SQL transactions here — empirically, `drizzle-orm`'s own\n * `.transaction()` is unusable for this purpose: the `better-sqlite3` session\n * rejects an async transaction callback outright (\"Transaction function\n * cannot return a promise\" — better-sqlite3 requires its transactions to be\n * fully synchronous), and concurrent `.transaction()` calls against a\n * `:memory:` `@libsql/client` can each open a DISTINCT physical connection\n * (verified empirically: a second concurrent transaction saw a blank,\n * table-less database) — exactly the \"an in-memory database is PER\n * CONNECTION\" hazard the sibling sqlite adapter's brief calls out. Instead,\n * {@link SerialQueue} (below) serializes every operation issued through THIS\n * adapter instance onto one logical FIFO queue, so at most one\n * read-decide-write sequence (or user-visible `transaction()` callback) is\n * ever in flight against the caller's `db` — the same single-connection\n * assumption holds for Drizzle-wrapped sqlite too (a pooled sqlite `db` is\n * not a realistic configuration). `transaction()` still issues REAL `BEGIN\n * IMMEDIATE` / `COMMIT` / `ROLLBACK` (via `db.run(sql\\`...\\`)`) so a thrown\n * callback rolls back every write the user made inside it (conformance's\n * \"transaction — visibility + atomicity\" scenario) — internal single-writer\n * helpers (`consume`, `pushVersion`, `linkProviderRef`) rely on the queue\n * alone (their one terminal write is already atomic at the SQLite level; if\n * anything before it throws, nothing was written).\n */\nimport { and, eq, sql } from \"drizzle-orm\";\nimport type { BaseSQLiteDatabase } from \"drizzle-orm/sqlite-core\";\nimport { PayweaveNotFoundError } from \"../../core/errors\";\nimport { currentPeriod } from \"../../products/period\";\nimport type { DatabaseAdapter, PwConsumeInput, PwConsumeResult } from \"../index\";\nimport {\n DEFAULT_STALE_CLAIM_AFTER_MS,\n PW_ACTIVE_SUBSCRIPTION_STATUSES,\n type PwCustomerUpsert,\n type PwFeatureBalanceInit,\n type PwPlanVersionInput,\n type PwSubscriptionInput,\n type PwSubscriptionPatch,\n} from \"../schema\";\nimport { wrapDriverError } from \"./errors\";\nimport { generatePwId } from \"./id\";\nimport { planContentEquals } from \"./plan-content\";\nimport {\n pwCustomers,\n pwFeatureBalances,\n pwPlans,\n pwSubscriptions,\n pwWebhookEvents,\n} from \"./schema/sqlite\";\nimport { createVerifier, findMissingTablesForStatus, makeSqliteTableProbe } from \"./verify\";\n\n/** Any `drizzle-orm` sqlite instance (better-sqlite3, `@libsql/client`, D1, Bun, Expo, …). */\nexport type SqliteDrizzleDb = BaseSQLiteDatabase<\"async\" | \"sync\", unknown>;\n\n// ── Serialization primitives ─────────────────────────────────────────────────\n\n/** A strict FIFO chain: `run` never starts before the previous `run` settles. */\nclass SerialQueue {\n #tail: Promise<void> = Promise.resolve();\n\n run<T>(fn: () => Promise<T>): Promise<T> {\n const result = this.#tail.then(fn);\n // The chain itself must never reject, or every later-queued op wedges forever.\n this.#tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n}\n\n/** What every store method funnels through — see the module header for why. */\ninterface SqliteRunner {\n /** Serialize (top-level) or run inline (already inside a held slot). */\n enqueue<T>(fn: () => Promise<T>): Promise<T>;\n /** The public `DatabaseAdapter.transaction(fn)` surface. */\n transaction<T>(db: SqliteDrizzleDb, fn: (tx: DatabaseAdapter) => Promise<T>): Promise<T>;\n}\n\nclass TopLevelRunner implements SqliteRunner {\n readonly #queue = new SerialQueue();\n\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return this.#queue.run(fn);\n }\n\n transaction<T>(db: SqliteDrizzleDb, fn: (tx: DatabaseAdapter) => Promise<T>): Promise<T> {\n return this.#queue.run(async () => {\n await db.run(sql`BEGIN IMMEDIATE`);\n try {\n const nested = buildSqliteAdapter(db, new NestedRunner());\n const result = await fn(nested);\n await db.run(sql`COMMIT`);\n return result;\n } catch (error) {\n try {\n await db.run(sql`ROLLBACK`);\n } catch {\n // best-effort — the original `error` is what surfaces to the caller.\n }\n throw error;\n }\n });\n }\n}\n\n/** Bound to an already-open transaction — reentrant, no nested `BEGIN`. */\nclass NestedRunner implements SqliteRunner {\n enqueue<T>(fn: () => Promise<T>): Promise<T> {\n return fn();\n }\n\n transaction<T>(db: SqliteDrizzleDb, fn: (tx: DatabaseAdapter) => Promise<T>): Promise<T> {\n return fn(buildSqliteAdapter(db, this));\n }\n}\n\n// ── Adapter ──────────────────────────────────────────────────────────────────\n\n/** Build a full `DatabaseAdapter` over a Drizzle sqlite `db` (fresh top-level runner if omitted). */\nexport function buildSqliteAdapter(\n db: SqliteDrizzleDb,\n runner: SqliteRunner = new TopLevelRunner(),\n): DatabaseAdapter {\n // First-use table verification (\"same model\" as Prisma —\n // see ./verify.ts). Every store method is gated behind it EXCEPT\n // `migrations.status()/apply()`, which must keep working (to report what's\n // missing / hand back instructions) even before the schema exists.\n const ensureVerified = createVerifier(makeSqliteTableProbe(db));\n function guarded<Args extends unknown[], T>(\n fn: (...args: Args) => Promise<T>,\n ): (...args: Args) => Promise<T> {\n return (...args: Args) =>\n runner.enqueue(async () => {\n await ensureVerified();\n return fn(...args);\n });\n }\n\n return {\n dialect: \"sqlite\",\n customers: {\n getByExternalId: guarded((externalId: string) => customersGetByExternalId(db, externalId)),\n upsert: guarded((input: PwCustomerUpsert) => customersUpsert(db, input)),\n linkProviderRef: guarded((externalId: string, provider: string, ref: string) =>\n customersLinkProviderRef(db, externalId, provider, ref),\n ),\n },\n plans: {\n getActiveVersion: guarded((planId: string) => plansGetActiveVersion(db, planId)),\n listActive: guarded(() => plansListActive(db)),\n pushVersion: guarded((plan: PwPlanVersionInput) => plansPushVersion(db, plan)),\n },\n subscriptions: {\n getActive: guarded((customerId: string, group: string) =>\n subscriptionsGetActive(db, customerId, group),\n ),\n create: guarded((input: PwSubscriptionInput) => subscriptionsCreate(db, input)),\n update: guarded((id: string, patch: PwSubscriptionPatch) =>\n subscriptionsUpdate(db, id, patch),\n ),\n },\n balances: {\n get: guarded((customerId: string, featureId: string, group: string) =>\n balancesGet(db, customerId, featureId, group),\n ),\n consume: guarded((input: PwConsumeInput) => balancesConsume(db, input)),\n resetTo: guarded(\n (customerId: string, featureId: string, group: string, init: PwFeatureBalanceInit) =>\n balancesResetTo(db, customerId, featureId, group, init),\n ),\n },\n webhookEvents: {\n claim: guarded(\n (\n dedupeKey: string,\n meta: { provider: string; type: string; now: Date; staleClaimAfterMs?: number },\n ) => webhookEventsClaim(db, dedupeKey, meta),\n ),\n markApplied: guarded((dedupeKey: string) => webhookEventsMarkApplied(db, dedupeKey)),\n },\n migrations: {\n status: () => sqliteMigrationsStatus(db),\n apply: () => Promise.resolve(sqliteMigrationsApply()),\n },\n transaction: (fn) => runner.transaction(db, fn),\n };\n}\n\n// ── migrations (\"same model\" as Prisma: instructions only) ─────────────────\n\nconst DRIZZLE_KIT_INSTRUCTIONS =\n \"payweave/db/drizzle never runs migrations for you. Merge \" +\n '\"payweave/db/drizzle\"\\'s published schema (see `./schema/sqlite.ts`) into your own Drizzle ' +\n \"schema, then run `drizzle-kit push` (dev) or `drizzle-kit generate` + `drizzle-kit migrate` \" +\n \"(tracked migrations) yourself.\";\n\nfunction sqliteMigrationsApply(): { applied: string[]; instructions: string } {\n return { applied: [], instructions: DRIZZLE_KIT_INSTRUCTIONS };\n}\n\nasync function sqliteMigrationsStatus(\n db: SqliteDrizzleDb,\n): Promise<{ pending: string[]; applied: string[] }> {\n const missing = await findMissingTablesForStatus(makeSqliteTableProbe(db));\n return missing.length > 0\n ? { pending: [\"0001_init\"], applied: [] }\n : { pending: [], applied: [\"0001_init\"] };\n}\n\n// ── customers ────────────────────────────────────────────────────────────────\n\nasync function customersGetByExternalId(db: SqliteDrizzleDb, externalId: string) {\n const rows = await db.select().from(pwCustomers).where(eq(pwCustomers.externalId, externalId));\n return rows[0] ?? null;\n}\n\nasync function customersUpsert(db: SqliteDrizzleDb, input: PwCustomerUpsert) {\n const now = new Date();\n const id = generatePwId(now.getTime());\n try {\n const rows = await db\n .insert(pwCustomers)\n .values({\n id,\n externalId: input.externalId,\n providerIds: {},\n email: input.email ?? null,\n createdAt: now,\n updatedAt: now,\n })\n .onConflictDoUpdate({\n target: pwCustomers.externalId,\n set: {\n email: sql`coalesce(excluded.email, ${pwCustomers.email})`,\n updatedAt: now,\n },\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (sqlite): customers.upsert returned no row\");\n return row;\n } catch (error) {\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (sqlite): customers.upsert(${JSON.stringify(input.externalId)}) failed.`,\n );\n }\n}\n\nasync function customersLinkProviderRef(\n db: SqliteDrizzleDb,\n externalId: string,\n provider: string,\n ref: string,\n): Promise<void> {\n const rows = await db.select().from(pwCustomers).where(eq(pwCustomers.externalId, externalId));\n const row = rows[0];\n if (!row) {\n throw new PayweaveNotFoundError(\n `payweave/db/drizzle (sqlite): customers.linkProviderRef: no customer with externalId ` +\n `${JSON.stringify(externalId)}.`,\n );\n }\n const providerIds = { ...row.providerIds, [provider]: ref };\n await db\n .update(pwCustomers)\n .set({ providerIds, updatedAt: new Date() })\n .where(eq(pwCustomers.externalId, externalId));\n}\n\n// ── plans ────────────────────────────────────────────────────────────────────\n\nasync function plansGetActiveVersion(db: SqliteDrizzleDb, planId: string) {\n const rows = await db\n .select()\n .from(pwPlans)\n .where(eq(pwPlans.planId, planId))\n .orderBy(sql`${pwPlans.version} desc`)\n .limit(1);\n return rows[0] ?? null;\n}\n\nasync function plansListActive(db: SqliteDrizzleDb) {\n const latest = db\n .select({\n planId: pwPlans.planId,\n version: sql<number>`max(${pwPlans.version})`.as(\"max_version\"),\n })\n .from(pwPlans)\n .groupBy(pwPlans.planId)\n .as(\"latest\");\n const rows = await db\n .select({\n id: pwPlans.id,\n planId: pwPlans.planId,\n version: pwPlans.version,\n group: pwPlans.group,\n isDefault: pwPlans.isDefault,\n name: pwPlans.name,\n priceMinor: pwPlans.priceMinor,\n priceCurrency: pwPlans.priceCurrency,\n priceInterval: pwPlans.priceInterval,\n features: pwPlans.features,\n providerRefs: pwPlans.providerRefs,\n pushedAt: pwPlans.pushedAt,\n })\n .from(pwPlans)\n .innerJoin(\n latest,\n and(eq(latest.planId, pwPlans.planId), eq(latest.version, pwPlans.version)),\n );\n return rows;\n}\n\nasync function plansPushVersion(db: SqliteDrizzleDb, plan: PwPlanVersionInput) {\n const activeRows = await db\n .select()\n .from(pwPlans)\n .where(eq(pwPlans.planId, plan.planId))\n .orderBy(sql`${pwPlans.version} desc`)\n .limit(1);\n const active = activeRows[0] ?? null;\n if (active && planContentEquals(active, plan)) {\n return active;\n }\n const now = new Date();\n const id = generatePwId(now.getTime());\n const nextVersion = (active?.version ?? 0) + 1;\n const rows = await db\n .insert(pwPlans)\n .values({\n id,\n planId: plan.planId,\n version: nextVersion,\n group: plan.group,\n isDefault: plan.isDefault,\n name: plan.name,\n priceMinor: plan.priceMinor,\n priceCurrency: plan.priceCurrency,\n priceInterval: plan.priceInterval,\n features: plan.features,\n providerRefs: plan.providerRefs,\n pushedAt: now,\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (sqlite): plans.pushVersion returned no row\");\n return row;\n}\n\n// ── subscriptions ────────────────────────────────────────────────────────────\n\nasync function subscriptionsGetActive(db: SqliteDrizzleDb, customerId: string, group: string) {\n const rows = await db\n .select()\n .from(pwSubscriptions)\n .where(\n and(\n eq(pwSubscriptions.customerId, customerId),\n eq(pwSubscriptions.group, group),\n sql`${pwSubscriptions.status} in ${PW_ACTIVE_SUBSCRIPTION_STATUSES}`,\n ),\n );\n return rows[0] ?? null;\n}\n\nasync function subscriptionsCreate(db: SqliteDrizzleDb, input: PwSubscriptionInput) {\n const now = new Date();\n const id = generatePwId(now.getTime());\n try {\n const rows = await db\n .insert(pwSubscriptions)\n .values({\n id,\n customerId: input.customerId,\n planId: input.planId,\n planVersion: input.planVersion,\n group: input.group,\n status: input.status,\n provider: input.provider,\n providerSubscriptionRef: input.providerSubscriptionRef,\n currentPeriodStart: input.currentPeriodStart,\n currentPeriodEnd: input.currentPeriodEnd,\n cancelAtPeriodEnd: input.cancelAtPeriodEnd,\n createdAt: now,\n updatedAt: now,\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (sqlite): subscriptions.create returned no row\");\n return row;\n } catch (error) {\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (sqlite): subscriptions.create for customer ` +\n `${JSON.stringify(input.customerId)} group ${JSON.stringify(input.group)} violated a ` +\n \"uniqueness rule (an active-set subscription already exists for this customer/group, or \" +\n \"another constraint failed).\",\n );\n }\n}\n\nasync function subscriptionsUpdate(db: SqliteDrizzleDb, id: string, patch: PwSubscriptionPatch) {\n const set: Record<string, unknown> = { updatedAt: new Date() };\n for (const [key, value] of Object.entries(patch)) {\n if (value !== undefined) set[key] = value;\n }\n try {\n const rows = await db\n .update(pwSubscriptions)\n .set(set)\n .where(eq(pwSubscriptions.id, id))\n .returning();\n const row = rows[0];\n if (!row) {\n throw new PayweaveNotFoundError(\n `payweave/db/drizzle (sqlite): subscriptions.update: no subscription with id ` +\n `${JSON.stringify(id)}.`,\n );\n }\n return row;\n } catch (error) {\n if (error instanceof PayweaveNotFoundError) throw error;\n throw wrapDriverError(\n error,\n `payweave/db/drizzle (sqlite): subscriptions.update(${JSON.stringify(id)}) failed.`,\n );\n }\n}\n\n// ── balances ─────────────────────────────────────────────────────────────────\n\nasync function balancesGet(db: SqliteDrizzleDb, customerId: string, featureId: string, group: string) {\n const rows = await db\n .select()\n .from(pwFeatureBalances)\n .where(\n and(\n eq(pwFeatureBalances.customerId, customerId),\n eq(pwFeatureBalances.featureId, featureId),\n eq(pwFeatureBalances.group, group),\n ),\n );\n return rows[0] ?? null;\n}\n\nasync function balancesConsume(db: SqliteDrizzleDb, input: PwConsumeInput): Promise<PwConsumeResult> {\n const existingRows = await db\n .select()\n .from(pwFeatureBalances)\n .where(\n and(\n eq(pwFeatureBalances.customerId, input.customerId),\n eq(pwFeatureBalances.featureId, input.featureId),\n eq(pwFeatureBalances.group, input.group),\n ),\n );\n const existingRow = existingRows[0];\n const nowMs = input.now.getTime();\n\n if (!existingRow) {\n const period = currentPeriod(input.init.anchor.getTime(), input.init.resetInterval, nowMs);\n const remaining = input.init.limit; // baseUsed is 0 on creation\n const applied = input.conditional !== true || remaining >= input.amount;\n const used = applied ? input.amount : 0;\n const id = generatePwId(nowMs);\n const rows = await db\n .insert(pwFeatureBalances)\n .values({\n id,\n customerId: input.customerId,\n featureId: input.featureId,\n group: input.group,\n used,\n limit: input.init.limit,\n resetInterval: input.init.resetInterval,\n anchor: input.init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: input.init.planId,\n planVersion: input.init.planVersion,\n updatedAt: input.now,\n })\n .returning();\n const row = rows[0];\n if (!row) throw new Error(\"drizzle adapter (sqlite): balances.consume (create) returned no row\");\n return { ...row, applied };\n }\n\n const resetDue = nowMs >= existingRow.periodEnd.getTime();\n const baseUsed = resetDue ? 0 : existingRow.used;\n const period = resetDue\n ? currentPeriod(existingRow.anchor.getTime(), existingRow.resetInterval, nowMs)\n : { start: existingRow.periodStart.getTime(), end: existingRow.periodEnd.getTime() };\n const remaining = existingRow.limit - baseUsed;\n const applied = input.conditional !== true || remaining >= input.amount;\n\n if (!applied && !resetDue) {\n // Denied and no reset was due: the row must be left\n // COMPLETELY untouched — including `updatedAt` — so issue no write at all.\n return { ...existingRow, applied: false };\n }\n\n const finalUsed = applied ? baseUsed + input.amount : baseUsed;\n const rows = await db\n .update(pwFeatureBalances)\n .set({\n used: finalUsed,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n updatedAt: input.now,\n })\n .where(eq(pwFeatureBalances.id, existingRow.id))\n .returning();\n const updatedRow = rows[0];\n if (!updatedRow) throw new Error(\"drizzle adapter (sqlite): balances.consume (update) returned no row\");\n return { ...updatedRow, applied };\n}\n\nasync function balancesResetTo(\n db: SqliteDrizzleDb,\n customerId: string,\n featureId: string,\n group: string,\n init: PwFeatureBalanceInit,\n): Promise<void> {\n const now = new Date();\n const period = currentPeriod(init.anchor.getTime(), init.resetInterval, now.getTime());\n const id = generatePwId(now.getTime());\n await db\n .insert(pwFeatureBalances)\n .values({\n id,\n customerId,\n featureId,\n group,\n used: 0,\n limit: init.limit,\n resetInterval: init.resetInterval,\n anchor: init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: init.planId,\n planVersion: init.planVersion,\n updatedAt: now,\n })\n .onConflictDoUpdate({\n target: [pwFeatureBalances.customerId, pwFeatureBalances.featureId, pwFeatureBalances.group],\n set: {\n used: 0,\n limit: init.limit,\n resetInterval: init.resetInterval,\n anchor: init.anchor,\n periodStart: new Date(period.start),\n periodEnd: new Date(period.end),\n planId: init.planId,\n planVersion: init.planVersion,\n updatedAt: now,\n },\n });\n}\n\n// ── webhookEvents ────────────────────────────────────────────────────────────\n\nasync function webhookEventsClaim(\n db: SqliteDrizzleDb,\n dedupeKey: string,\n meta: { provider: string; type: string; now: Date; staleClaimAfterMs?: number },\n): Promise<boolean> {\n const staleClaimAfterMs = meta.staleClaimAfterMs ?? DEFAULT_STALE_CLAIM_AFTER_MS;\n const staleThreshold = new Date(meta.now.getTime() - staleClaimAfterMs);\n const rows = await db\n .insert(pwWebhookEvents)\n .values({\n dedupeKey,\n provider: meta.provider,\n type: meta.type,\n receivedAt: meta.now,\n claimedAt: meta.now,\n appliedAt: null,\n })\n .onConflictDoUpdate({\n target: pwWebhookEvents.dedupeKey,\n set: { claimedAt: meta.now },\n // `and(...)` only returns `undefined` when given zero conditions —\n // these two are always present, so the non-null assertion is safe\n // (satisfies `exactOptionalPropertyTypes`, which forbids `| undefined`\n // on `setWhere` even though `and()`'s own return type allows it).\n setWhere: and(\n sql`${pwWebhookEvents.appliedAt} is null`,\n sql`${pwWebhookEvents.claimedAt} <= ${staleThreshold}`,\n )!,\n })\n .returning({ claimedAt: pwWebhookEvents.claimedAt });\n const row = rows[0];\n return row !== undefined && row.claimedAt !== null && row.claimedAt.getTime() === meta.now.getTime();\n}\n\nasync function webhookEventsMarkApplied(db: SqliteDrizzleDb, dedupeKey: string): Promise<void> {\n await db\n .update(pwWebhookEvents)\n .set({ appliedAt: new Date() })\n .where(eq(pwWebhookEvents.dedupeKey, dedupeKey));\n}\n","/**\n * `payweave/db/drizzle` — Drizzle ORM adapter. Wraps YOUR OWN existing\n * `drizzle-orm` instance (whatever\n * postgres/mysql/sqlite driver it wraps) behind the shared\n * {@link DatabaseAdapter} contract.\n *\n * \"Same model\" as the Prisma adapter:\n * Payweave publishes the schema (`./schema/{pg,mysql,sqlite}.ts` — merge one\n * into your own Drizzle schema) and you own migrations via `drizzle-kit`\n * (`push` for local/dev, `generate` + `migrate` for tracked history).\n * `migrations.apply()` NEVER shells out or runs DDL — it returns an\n * instructions result (an `apply()` union type); `migrations.status()`\n * reports which tables are missing by probing the connected database.\n *\n * ── Dialect detection (build-time resolution) ───────────────────────────────\n * `drizzleAdapter(db, options?)` auto-detects which of postgres/mysql/sqlite\n * `db` is backed by via `instanceof` against `drizzle-orm`'s dialect base\n * classes (`./detect.ts` — verified stable against the installed\n * `drizzle-orm@0.45.2`). `options.dialect` is an explicit override for the\n * rare case where that detection fails (e.g. a proxied/wrapped instance whose\n * prototype chain breaks `instanceof`).\n *\n * ── Conformance obligations ────────────────────────────────\n * CI's obligation is the Postgres variant (dockerized `postgres:16` +\n * `drizzle-kit push`) — unavailable in this sandbox (no\n * docker). `test/db/drizzle.test.ts` instead runs the FULL conformance suite\n * in-process against `drizzle-orm/libsql` over an in-memory `@libsql/client`\n * (a real, runnable sqlite dialect — no docker needed either way, mirroring\n * the sqlite adapter's own in-memory conformance runs) as a stand-in proof\n * that the adapter logic (dialect dispatch, atomicity, verification,\n * instructions-only migrations) is correct; the postgres/mysql code paths\n * are implemented to the same contract but ride a separate docker matrix in\n * CI for their conformance proof.\n */\nimport { PayweaveConfigError } from \"../../core/errors\";\nimport type { DatabaseAdapter } from \"../index\";\nimport { detectDrizzleDialect, type DrizzleDialect } from \"./detect\";\nimport { buildMysqlAdapter } from \"./mysql-adapter\";\nimport { buildPostgresAdapter } from \"./postgres-adapter\";\nimport { buildSqliteAdapter, type SqliteDrizzleDb } from \"./sqlite-adapter\";\n\nexport { mysqlSchema } from \"./schema/mysql\";\nexport { pgSchema } from \"./schema/pg\";\nexport { sqliteSchema } from \"./schema/sqlite\";\nexport type { DrizzleDialect } from \"./detect\";\n\n/** `drizzleAdapter(db, options?)`'s second argument. */\nexport interface DrizzleAdapterOptions {\n /**\n * Force the dialect instead of auto-detecting it from `db` (see the module\n * header's build-time resolution note). Rarely needed:\n * `instanceof` detection against `drizzle-orm`'s dialect base classes is\n * stable across postgres/mysql/sqlite for every driver `drizzle-orm` ships.\n */\n dialect?: DrizzleDialect;\n}\n\n/**\n * Structural shape every `drizzle-orm` `db` instance satisfies, regardless of\n * dialect — enough to validate the argument eagerly without\n * importing `drizzle-orm` merely to check it.\n */\nfunction looksLikeDrizzleDb(value: unknown): boolean {\n if (value === null || typeof value !== \"object\") return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.select === \"function\" &&\n typeof candidate.insert === \"function\" &&\n typeof candidate.update === \"function\" &&\n typeof candidate.transaction === \"function\"\n );\n}\n\n/**\n * Create a {@link DatabaseAdapter} over your existing Drizzle `db` instance.\n * Construction is synchronous and side-effect-free: `db`'s\n * shape is validated eagerly; the dialect is detected (or takes\n * `options.dialect`) synchronously too, since `drizzle-orm`'s dialect base\n * classes are already in memory the moment the caller constructed `db`\n * itself. No query runs, no table-existence check happens, until the first\n * store method call (`./verify.ts`).\n *\n * @throws {PayweaveConfigError} synchronously if `db` is not recognizable as\n * a Drizzle instance, or if its dialect cannot be detected and no\n * `options.dialect` override was given.\n */\nexport function drizzleAdapter(db: unknown, options: DrizzleAdapterOptions = {}): DatabaseAdapter {\n if (!looksLikeDrizzleDb(db)) {\n throw new PayweaveConfigError(\n \"payweave/db/drizzle: drizzleAdapter(db) expects your own `drizzle-orm` database instance \" +\n \"(the object returned by e.g. `drizzle(pool)`/`drizzle(client)`) — got \" +\n `${typeof db === \"object\" && db !== null ? \"an object missing select/insert/update/transaction\" : typeof db}.`,\n );\n }\n const dialect = detectDrizzleDialect(db, options.dialect);\n switch (dialect) {\n case \"sqlite\":\n return buildSqliteAdapter(db as SqliteDrizzleDb);\n case \"postgres\":\n return buildPostgresAdapter(db as Parameters<typeof buildPostgresAdapter>[0]);\n case \"mysql\":\n return buildMysqlAdapter(db as Parameters<typeof buildMysqlAdapter>[0]);\n }\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export { PW_TABLE_PREFIX } from '../_tsup-dts-rollup.js';
|
|
2
|
+
export { PW_TABLES } from '../_tsup-dts-rollup.js';
|
|
3
|
+
export { PW_ACTIVE_SUBSCRIPTION_STATUSES } from '../_tsup-dts-rollup.js';
|
|
4
|
+
export { DEFAULT_STALE_CLAIM_AFTER_MS } from '../_tsup-dts-rollup.js';
|
|
5
|
+
export { pwIdSchema } from '../_tsup-dts-rollup.js';
|
|
6
|
+
export { pwSubscriptionStatusSchema } from '../_tsup-dts-rollup.js';
|
|
7
|
+
export { pwResetIntervalSchema } from '../_tsup-dts-rollup.js';
|
|
8
|
+
export { pwPriceIntervalSchema } from '../_tsup-dts-rollup.js';
|
|
9
|
+
export { pwCustomerSchema } from '../_tsup-dts-rollup.js';
|
|
10
|
+
export { pwCustomerUpsertSchema } from '../_tsup-dts-rollup.js';
|
|
11
|
+
export { pwFeatureInclusionSchema } from '../_tsup-dts-rollup.js';
|
|
12
|
+
export { pwPlanVersionSchema } from '../_tsup-dts-rollup.js';
|
|
13
|
+
export { pwPlanVersionInputSchema } from '../_tsup-dts-rollup.js';
|
|
14
|
+
export { pwSubscriptionSchema } from '../_tsup-dts-rollup.js';
|
|
15
|
+
export { pwSubscriptionInputSchema } from '../_tsup-dts-rollup.js';
|
|
16
|
+
export { pwSubscriptionPatchSchema } from '../_tsup-dts-rollup.js';
|
|
17
|
+
export { pwFeatureBalanceSchema } from '../_tsup-dts-rollup.js';
|
|
18
|
+
export { pwFeatureBalanceInitSchema } from '../_tsup-dts-rollup.js';
|
|
19
|
+
export { pwWebhookEventSchema } from '../_tsup-dts-rollup.js';
|
|
20
|
+
export { pwMigrationRecordSchema } from '../_tsup-dts-rollup.js';
|
|
21
|
+
export { PwTableName } from '../_tsup-dts-rollup.js';
|
|
22
|
+
export { PwSubscriptionStatus } from '../_tsup-dts-rollup.js';
|
|
23
|
+
export { PwResetInterval } from '../_tsup-dts-rollup.js';
|
|
24
|
+
export { PwPriceInterval } from '../_tsup-dts-rollup.js';
|
|
25
|
+
export { PwCustomer } from '../_tsup-dts-rollup.js';
|
|
26
|
+
export { PwCustomerUpsert } from '../_tsup-dts-rollup.js';
|
|
27
|
+
export { PwFeatureInclusion } from '../_tsup-dts-rollup.js';
|
|
28
|
+
export { PwPlanVersion } from '../_tsup-dts-rollup.js';
|
|
29
|
+
export { PwPlanVersionInput } from '../_tsup-dts-rollup.js';
|
|
30
|
+
export { PwSubscription } from '../_tsup-dts-rollup.js';
|
|
31
|
+
export { PwSubscriptionInput } from '../_tsup-dts-rollup.js';
|
|
32
|
+
export { PwSubscriptionPatch } from '../_tsup-dts-rollup.js';
|
|
33
|
+
export { PwFeatureBalance } from '../_tsup-dts-rollup.js';
|
|
34
|
+
export { PwFeatureBalanceInit } from '../_tsup-dts-rollup.js';
|
|
35
|
+
export { PwWebhookEvent } from '../_tsup-dts-rollup.js';
|
|
36
|
+
export { PwMigrationRecord } from '../_tsup-dts-rollup.js';
|
|
37
|
+
export { PwKnownDialect } from '../_tsup-dts-rollup.js';
|
|
38
|
+
export { DatabaseAdapter } from '../_tsup-dts-rollup.js';
|
|
39
|
+
export { PwConsumeInput } from '../_tsup-dts-rollup.js';
|
|
40
|
+
export { PwConsumeResult } from '../_tsup-dts-rollup.js';
|
|
41
|
+
export { PwClaimMeta } from '../_tsup-dts-rollup.js';
|
|
42
|
+
export { PwMigrationStatus } from '../_tsup-dts-rollup.js';
|
|
43
|
+
export { PwMigrationApplyResult } from '../_tsup-dts-rollup.js';
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { DEFAULT_STALE_CLAIM_AFTER_MS, PW_ACTIVE_SUBSCRIPTION_STATUSES, PW_TABLES, PW_TABLE_PREFIX, pwCustomerSchema, pwCustomerUpsertSchema, pwFeatureBalanceInitSchema, pwFeatureBalanceSchema, pwFeatureInclusionSchema, pwIdSchema, pwMigrationRecordSchema, pwPlanVersionInputSchema, pwPlanVersionSchema, pwPriceIntervalSchema, pwResetIntervalSchema, pwSubscriptionInputSchema, pwSubscriptionPatchSchema, pwSubscriptionSchema, pwSubscriptionStatusSchema, pwWebhookEventSchema } from '../chunk-NV3MZF7L.js';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|