@superheld/summae-core 0.1.0 → 0.2.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/README.md +1 -1
- package/dist/index.cjs +93 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +46 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +93 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/errors.ts","../src/shared/currency.ts","../src/shared/money.ts","../src/shared/canonical-json.ts","../src/shared/clock.ts","../src/shared/uuid.ts","../src/shared/id-generator.ts","../src/shared/calendar-date.ts","../src/shared/account-number.ts","../src/shared/period-ref.ts","../src/shared/dimension-value.ts","../src/domain-error.ts","../src/ledger/types.ts","../src/ledger/account.ts","../src/ledger/entry-line.ts","../src/ledger/journal-entry.ts","../src/ledger/voucher.ts","../src/ledger/period.ts","../src/ledger/fiscal-year.ts","../src/ledger/audit-record.ts","../src/ledger/open-item.ts","../src/ledger/settlement.ts","../src/ledger/post-result.ts","../src/ledger/dimension-registry.ts","../src/ledger/ledger.ts","../src/in-memory.ts","../src/assets/asset.ts","../src/assets/asset-route.ts","../src/assets/asset-service.ts","../src/costing/costing-run.ts","../src/costing/costing-service.ts","../src/partner/partner.ts","../src/partner/partner-service.ts","../src/projection/ec-sales-list.ts","../src/projection/trial-balance.ts","../src/projection/open-items.ts","../src/projection/account-sheet.ts","../src/projection/audit-log.ts","../src/projection/vat-return.ts","../src/projection/income-statement.ts","../src/mapping/mapping.ts","../src/projection/balance-sheet.ts","../src/projection/cash-basis.ts","../src/projection/asset-register.ts","../src/projection/journal-export.ts","../src/projection/datev-export.ts","../src/mapping/mapping-registry.ts","../src/mapping/mapping-importer.ts","../src/tax/tax-code.ts","../src/tax/tax-code-version.ts","../src/tax/tax-code-registry.ts","../src/tax/tax-profile.ts","../src/tax/tax-service.ts","../src/composition/tenant.ts","../src/composition/post-voucher-service.ts","../src/composition/tenant-operations.ts","../src/composition/tenant-factory.ts"],"names":["isRecord","asString","Big"],"mappings":";;;;AACO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAGO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;;;ACLA,IAAM,MAAA,GAA2C;AAAA,EAC/C,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAEO,IAAM,QAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACZ,WAAA,CACG,MACA,KAAA,EACT;AAFS,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACR;AAAA,EAFQ,IAAA;AAAA,EACA,KAAA;AAAA,EAGX,OAAO,GAAG,IAAA,EAAwB;AAChC,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,8BAAA,EAA8B,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,IAAI,SAAA,CAAS,IAAA,EAAM,MAAA,CAAO,IAAI,KAAK,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,KAAA,EAA0B;AAC/B,IAAA,OAAO,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA;AAAA,EAC7B;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AACF;ACnCA,IAAM,UAAU,GAAA,CAAI,WAAA;AAGpB,SAAS,cAAc,KAAA,EAAoB;AACzC,EAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,EAAE,MAAA,GAAS,KAAA,CAAM,IAAI,CAAC,CAAA;AACjD;AAWO,IAAM,KAAA,GAAN,MAAM,MAAA,CAAM;AAAA,EACT,WAAA,CACW,QACR,QAAA,EACT;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACR,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACR;AAAA,EAFgB,MAAA;AAAA,EACR,QAAA;AAAA,EAGX,OAAe,WAAW,QAAA,EAAuC;AAC/D,IAAA,OAAO,QAAA,YAAoB,QAAA,GAAW,QAAA,GAAW,QAAA,CAAS,GAAG,QAAQ,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,EAAA,CAAG,MAAA,EAAgB,QAAA,EAAoC;AAC5D,IAAA,MAAM,GAAA,GAAM,MAAA,CAAM,UAAA,CAAW,QAAQ,CAAA;AACrC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAI,IAAI,MAAM,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,sBAAA,EAAsB,MAAM,CAAA,oBAAA,EAAiB,IAAI,IAAI,CAAA,QAAA,EAAW,GAAA,CAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACrG;AACA,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,OAAO,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,sBAAA,EAAsB,MAAM,CAAA,oBAAA,EAAiB,IAAI,IAAI,CAAA,QAAA,EAAW,GAAA,CAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACrG;AACA,IAAA,OAAO,IAAI,MAAA,CAAM,MAAA,EAAQ,GAAG,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,eAAA,CAAgB,KAAA,EAAqB,QAAA,EAAoC;AAC9E,IAAA,MAAM,GAAA,GAAM,MAAA,CAAM,UAAA,CAAW,QAAQ,CAAA;AACrC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,KAAA,YAAiB,GAAA,GAAM,KAAA,GAAQ,IAAI,IAAI,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,2CAAA,EAAqC,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IACxE;AACA,IAAA,OAAO,IAAI,OAAM,GAAA,CAAI,KAAA,CAAM,IAAI,KAAA,EAAO,OAAO,GAAG,GAAG,CAAA;AAAA,EACrD;AAAA,EAEA,OAAO,KAAK,QAAA,EAAoC;AAC9C,IAAA,OAAO,IAAI,OAAM,IAAI,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA,CAAM,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,EACzD;AAAA,EAEA,IAAI,KAAA,EAAqB;AACvB,IAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC7B,IAAA,OAAO,IAAI,OAAM,IAAA,CAAK,MAAA,CAAO,KAAK,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAChE;AAAA,EAEA,SAAS,KAAA,EAAqB;AAC5B,IAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC7B,IAAA,OAAO,IAAI,OAAM,IAAA,CAAK,MAAA,CAAO,MAAM,KAAA,CAAM,MAAM,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EACjE;AAAA,EAEA,MAAA,GAAgB;AACd,IAAA,OAAO,IAAI,OAAM,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,CAAA,EAAG,KAAK,QAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,GAAA,GAAa;AACX,IAAA,OAAO,IAAI,MAAA,CAAM,IAAA,CAAK,OAAO,GAAA,EAAI,EAAG,KAAK,QAAQ,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,UAAU,KAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,EACrC;AAAA,EAEA,OAAO,KAAA,EAAuB;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,QAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,MAAM,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,CAAC,CAAA;AAAA,EACzB;AAAA,EAEA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,CAAC,CAAA;AAAA,EACzB;AAAA,EAEA,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,CAAC,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,OAAA,EAA0C;AACpD,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,aAAa,yCAAyC,CAAA;AAAA,IAClE;AAEA,IAAA,IAAI,IAAA,CAAK,YAAW,EAAG;AACrB,MAAA,OAAO,IAAA,CAAK,MAAA,EAAO,CAChB,QAAA,CAAS,GAAG,OAAO,CAAA,CACnB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,KAAA;AAC5B,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAM,gBAAA,CAAiB,OAAO,CAAA;AAErD,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,MAAA,SAAA,IAAa,MAAA;AAAA,IACf;AACA,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,MAAM,IAAI,aAAa,6BAA6B,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,SAAS,IAAI,GAAA,CAAI,EAAE,CAAA,CAAE,IAAI,KAAK,CAAA;AACpC,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,MAAA,CAAO,MAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAE9D,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,KAAW;AAC3C,MAAA,MAAM,UAAU,UAAA,GAAa,MAAA;AAC7B,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,GAAU,SAAA,EAAW,SAAA,EAAW,UAAU,SAAA,EAAU;AAAA,IACrE,CAAC,CAAA;AAED,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,QAAA,IAAY,IAAA,CAAK,IAAA;AAAA,IACnB;AAGA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,GAAa,QAAQ,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,MAAW,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,KAAA,EAAM,CAAE,CAAA;AAC/E,IAAA,KAAA,CAAM,IAAA;AAAA,MAAK,CAAC,CAAA,EAAG,CAAA,KACb,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA,GAAY,EAAA,GAAK,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA,GAAY,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,CAAE;AAAA,KAC/E;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,MAAA,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAG,KAAK,EAAG,IAAA,IAAQ,EAAA;AAAA,IAClC;AAEA,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,MAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,EAC7E;AAAA;AAAA,EAGA,eAAe,KAAA,EAAwB;AACrC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,IAAI,aAAa,8CAA8C,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,GAAG,IAAI,MAAc,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA,EAGA,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAChD;AAAA,EAEA,MAAA,GAA+C;AAC7C,IAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,cAAA,IAAkB,QAAA,EAAU,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,EACvE;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,GAAG,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,IAAI,CAAA,CAAA;AAAA,EACvD;AAAA,EAEA,OAAe,SAAA,CAAU,KAAA,EAAe,KAAA,EAAe,QAAA,EAA2B;AAChF,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,CAAE,GAAA,CAAI,IAAI,GAAA,CAAI,EAAE,CAAA,CAAE,GAAA,CAAI,KAAK,CAAC,CAAA;AAClE,IAAA,OAAO,IAAI,MAAA,CAAM,KAAA,CAAM,MAAM,KAAA,EAAO,OAAO,GAAG,QAAQ,CAAA;AAAA,EACxD;AAAA;AAAA,EAGA,OAAe,iBAAiB,OAAA,EAA2C;AACzE,IAAA,MAAM,WAAkB,EAAC;AACzB,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,IAAI,IAAI,MAAM,CAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,YAAA,CAAa,CAAA,uBAAA,EAAuB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MACzD;AACA,MAAA,IAAI,OAAA,CAAQ,EAAA,CAAG,CAAC,CAAA,EAAG;AACjB,QAAA,MAAM,IAAI,aAAa,uCAAoC,CAAA;AAAA,MAC7D;AACA,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AACrB,MAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,IACtD;AAEA,IAAA,MAAM,SAAS,IAAI,GAAA,CAAI,EAAE,CAAA,CAAE,IAAI,QAAQ,CAAA;AACvC,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEQ,mBAAmB,KAAA,EAAoB;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,gBAAA;AAAA,QACR,oCAAiC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,KAAA,EAAQ,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,OAChF;AAAA,IACF;AAAA,EACF;AACF;;;AC7MA,IAAM,gBAAA,GAAmB,gBAAA;AAElB,SAAS,cAAc,KAAA,EAAwB;AACpD,EAAA,OAAO,YAAY,KAAK,CAAA;AAC1B;AAEA,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,QAAQ,MAAA,GAAS,OAAA;AAAA,EAC1B;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,YAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,gBAAA,EAAkB;AACtC,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,4DAAA,EAA4D,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5F;AACA,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,aAAa,KAAK,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,IAAI,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,OAAO,SAAA,CAAU,MAAA,KAAW,UAAA,EAAY;AAC1C,MAAA,OAAO,WAAA,CAAY,SAAA,CAAU,MAAA,EAAQ,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,aAAa,KAAgC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,IAAI,YAAA,CAAa,CAAA,4BAAA,EAA+B,OAAO,KAAK,CAAA,CAAE,CAAA;AACtE;AAEA,SAAS,aAAa,MAAA,EAAyC;AAC7D,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAA,CAAK,IAAA,EAAK;AACV,EAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,EAAG,aAAa,GAAG,CAAC,IAAI,WAAA,CAAY,MAAA,CAAO,GAAG,CAAC,CAAC,EAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAC5F;AAMA,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC/B,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,GAAA,IAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,SAAS,IAAA,EAAM;AACxB,MAAA,GAAA,IAAO,MAAA;AAAA,IACT,CAAA,MAAA,IAAW,SAAS,CAAA,EAAM;AACxB,MAAA,GAAA,IAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,SAAS,CAAA,EAAM;AACxB,MAAA,GAAA,IAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,SAAS,EAAA,EAAM;AACxB,MAAA,GAAA,IAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,SAAS,EAAA,EAAM;AACxB,MAAA,GAAA,IAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,SAAS,EAAA,EAAM;AACxB,MAAA,GAAA,IAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,OAAO,EAAA,EAAM;AACtB,MAAA,GAAA,IAAO,CAAA,GAAA,EAAM,KAAK,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,GAAG,GAAG,CAAA,CAAA,CAAA;AACf;;;ACvFO,IAAM,cAAN,MAAmC;AAAA,EACxC,GAAA,GAAY;AACV,IAAA,2BAAW,IAAA,EAAK;AAAA,EAClB;AACF;AAGO,IAAM,UAAA,GAAN,MAAM,WAAA,CAA4B;AAAA,EAC/B,OAAA;AAAA,EAEA,YAAY,EAAA,EAAU;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,EAAA;AAAA,EACjB;AAAA,EAEA,OAAO,GAAG,OAAA,EAA6B;AACrC,IAAA,OAAO,IAAI,WAAA,CAAW,IAAI,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EACzC;AAAA,EAEA,GAAA,GAAY;AACV,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,oBAAoB,YAAA,EAA4B;AAC9C,IAAA,IAAA,CAAK,UAAU,IAAI,IAAA,CAAK,KAAK,OAAA,CAAQ,OAAA,KAAY,YAAY,CAAA;AAAA,EAC/D;AACF;ACzBA,IAAM,OAAA,GAAU,gEAAA;AAET,IAAM,IAAA,GAAN,MAAM,KAAA,CAAK;AAAA,EACR,YAAqB,KAAA,EAAe;AAAf,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAgB;AAAA,EAAhB,KAAA;AAAA,EAE7B,OAAO,WAAW,KAAA,EAAqB;AACrC,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,wBAAA,EAAwB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,IAAI,MAAK,UAAU,CAAA;AAAA,EAC5B;AAAA,EAEA,OAAO,EAAA,CAAG,KAAA,GAAe,IAAI,aAAY,EAAS;AAChD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,EAAI,CAAE,OAAA,EAAQ,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AAChE,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AAE7C,IAAA,MAAM,OAAA,GAAA,CAAY,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAI,EAAE,CAAA,GAAI,CAAA,GAAO,CAAA,EAAK,QAAA,CAAS,EAAE,CAAA;AAEpE,IAAA,OAAO,IAAI,KAAA;AAAA,MACT,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,EAAG,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,KACxH;AAAA,EACF;AAAA,EAEA,OAAO,KAAA,EAAsB;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAU,KAAA,CAAM,KAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,UAAU,KAAA,EAAqB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,CAAA;AAAA,EACxE;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF;;;ACrCO,IAAM,oBAAN,MAA+C;AAAA,EACpD,WAAA,CAA6B,KAAA,GAAe,IAAI,WAAA,EAAY,EAAG;AAAlC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAmC;AAAA,EAAnC,KAAA;AAAA,EAE7B,IAAA,GAAa;AACX,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EAC3B;AACF;AAOO,IAAM,2BAAN,MAAsD;AAAA,EAG3D,YAA6B,KAAA,EAAc;AAAd,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAe;AAAA,EAAf,KAAA;AAAA,EAFrB,OAAA,GAAU,CAAA;AAAA,EAIlB,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,OAAA,EAAA;AAEL,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI,CAAE,OAAA,EAAQ,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,GAAG,CAAA;AACrE,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,IAAI,GAAG,CAAA;AAE3D,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,MACV,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,EAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,EAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,KACrH;AAAA,EACF;AACF;;;ACjCA,SAAS,KAAA,CAAM,IAAA,EAAc,UAAA,EAAoB,GAAA,EAAqB;AACpE,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,IAAA,EAAM,UAAA,EAAY,GAAG,CAAC,CAAA;AACrD,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACvD,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,WAAA,KAAgB,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACxD,EAAA,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACnD,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AACvB;AAEO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EAChB,YAAqB,GAAA,EAAa;AAAb,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAc;AAAA,EAAd,GAAA;AAAA,EAE7B,OAAO,GAAG,GAAA,EAA2B;AACnC,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,GAAG,CAAA,EAAG;AACpC,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,iCAAA,EAAiC,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AACA,IAAA,MAAM,OAAO,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACnC,IAAA,MAAM,QAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACpC,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAEnC,IAAA,IAAI,MAAM,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAG,GAAG,MAAM,GAAA,EAAK;AACvC,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,iCAAA,EAAiC,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,IAAI,cAAa,GAAG,CAAA;AAAA,EAC7B;AAAA,EAEA,UAAU,KAAA,EAA6B;AACrC,IAAA,OAAO,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA,GAAM,KAAK,IAAA,CAAK,GAAA,GAAM,KAAA,CAAM,GAAA,GAAM,CAAA,GAAI,CAAA;AAAA,EAChE;AAAA,EAEA,OAAO,KAAA,EAA8B;AACnC,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,GAAA;AAAA,EAC5B;AAAA,EAEA,SAAS,KAAA,EAA8B;AACrC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,CAAA;AAAA,EACjC;AAAA,EAEA,QAAQ,KAAA,EAA8B;AACpC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,GAAI,CAAA;AAAA,EACjC;AAAA,EAEA,SAAA,CAAU,OAAqB,GAAA,EAA4B;AACzD,IAAA,OAAO,CAAC,KAAK,QAAA,CAAS,KAAK,KAAK,CAAC,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,EACnD;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACpC;AAAA,EAEA,KAAA,GAAgB;AACd,IAAA,OAAO,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EACpC;AAAA,EAEA,cAAA,GAA+B;AAE7B,IAAA,OAAO,IAAI,aAAA,CAAa,KAAA,CAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAA,EAAM,EAAG,CAAC,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEA,mBAAA,GAAoC;AAClC,IAAA,OAAO,IAAI,aAAA,CAAa,KAAA,CAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAA,EAAM,EAAG,CAAC,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AACF;;;ACpEO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EACjB,YAAqB,KAAA,EAAe;AAAf,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAgB;AAAA,EAAhB,KAAA;AAAA,EAE7B,OAAO,GAAG,KAAA,EAA8B;AACtC,IAAA,IAAI,KAAA,KAAU,EAAA,IAAM,KAAA,CAAM,MAAA,GAAS,EAAA,EAAI;AACrC,MAAA,MAAM,IAAI,aAAa,yCAAyC,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,uDAAA,EAAuD,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IACxF;AACA,IAAA,OAAO,IAAI,eAAc,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,UAAU,KAAA,EAA8B;AACtC,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,GAAI,CAAA;AAAA,EACxE;AAAA,EAEA,OAAO,KAAA,EAA+B;AACpC,IAAA,OAAO,IAAA,CAAK,UAAU,KAAA,CAAM,KAAA;AAAA,EAC9B;AAAA,EAEA,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AACF;;;AC9BO,IAAM,YAAN,MAAgB;AAAA,EACrB,WAAA,CACW,YACA,MAAA,EACT;AAFS,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAET,IAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,GAAa,IAAA,EAAM;AACvC,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,gCAAA,EAA6B,UAAU,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,GAAS,GAAA,EAAK;AAC9B,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,6BAAA,EAA6B,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EATW,UAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAWX,UAAU,KAAA,EAA0B;AAClC,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,KAAA,CAAM,UAAA,EAAY;AACxC,MAAA,OAAO,IAAA,CAAK,UAAA,GAAa,KAAA,CAAM,UAAA,GAAa,EAAA,GAAK,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,KAAA,CAAM,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,CAAA;AAAA,EAC5E;AAAA,EAEA,OAAO,KAAA,EAA2B;AAChC,IAAA,OAAO,KAAK,UAAA,KAAe,KAAA,CAAM,UAAA,IAAc,IAAA,CAAK,WAAW,KAAA,CAAM,MAAA;AAAA,EACvE;AAAA,EAEA,MAAA,GAAiD;AAC/C,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAC5D;AACF;;;AC3BO,IAAM,cAAA,GAAN,MAAM,eAAA,CAAe;AAAA,EAClB,WAAA,CACG,MACA,IAAA,EACT;AAFS,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EACR;AAAA,EAFQ,IAAA;AAAA,EACA,IAAA;AAAA,EAGX,OAAO,EAAA,CAAG,IAAA,EAAc,IAAA,EAA8B;AACpD,IAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,KAAS,EAAA,EAAI;AAC9B,MAAA,MAAM,IAAI,aAAa,mDAAgD,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,IAAI,eAAA,CAAe,IAAA,EAAM,IAAI,CAAA;AAAA,EACtC;AAAA,EAEA,OAAO,KAAA,EAAgC;AACrC,IAAA,OAAO,KAAK,IAAA,KAAS,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,SAAS,KAAA,CAAM,IAAA;AAAA,EACzD;AAAA,EAEA,MAAA,GAAyC;AACvC,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,EAC5C;AACF;;;ACtBO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EACrC,YACW,SAAA,EACT,OAAA,GAAU,EAAA,EACD,OAAA,GAAmC,EAAC,EAC7C;AACA,IAAA,KAAA,CAAM,OAAA,KAAY,EAAA,GAAK,OAAA,GAAU,SAAS,CAAA;AAJjC,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EACd;AAAA,EANW,SAAA;AAAA,EAEA,OAAA;AAKb;;;ACLA,IAAM,gBAAA,uBAAiD,GAAA,CAAiB;AAAA,EACtE,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,SAAS,kBAAkB,IAAA,EAA4B;AAC5D,EAAA,OAAO,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAClC;AAEO,SAAS,cAAc,KAAA,EAAsC;AAClE,EAAA,OACE,KAAA,KAAU,WACV,KAAA,KAAU,WAAA,IACV,UAAU,QAAA,IACV,KAAA,KAAU,aACV,KAAA,KAAU,SAAA;AAEd;AAqBO,SAAS,8BAA8B,KAAA,EAAiD;AAC7F,EAAA,OAAO,UAAU,UAAA,IAAc,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,UAAU,KAAA,GAAQ,IAAA;AACrF;AAEO,SAAS,kBAAkB,KAAA,EAAqC;AACrE,EAAA,OAAO,KAAA,KAAU,YAAA,IAAgB,KAAA,KAAU,SAAA,GAAY,KAAA,GAAQ,IAAA;AACjE;;;AC/CO,IAAM,UAAN,MAAc;AAAA,EAGnB,YACW,EAAA,EACA,MAAA,EACA,MACA,IAAA,EACA,OAAA,EACT,SAAwB,QAAA,EACxB;AANS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGT,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AAAA,EACvB;AAAA,EARW,EAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EAPH,aAAA;AAAA,EAaR,MAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,aAAA,KAAkB,QAAA;AAAA,EAChC;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AAAA,EACvB;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,MAAA,EAAQ,KAAK,MAAA,CAAO,KAAA;AAAA,MACpB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACF;;;AClCO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EACrB,WAAA,CACW,WACA,OAAA,EACA,IAAA,EACA,OACA,UAAA,GAA+B,EAAC,EAChC,MAAA,GAAyC,IAAA,EAClD;AANS,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACR;AAAA,EANQ,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EAGX,OAAA,GAAqB;AACnB,IAAA,OAAO,IAAI,UAAA;AAAA,MACT,IAAA,CAAK,SAAA;AAAA,MACL,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,IAAA;AAAA,MACL,IAAA,CAAK,MAAM,MAAA,EAAO;AAAA,MAClB,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,SAAA,CAAU,KAAA;AAAA,MAC1B,OAAA,EAAS,KAAK,OAAA,CAAQ,KAAA;AAAA,MACtB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,MACzB,UAAA,EAAY,KAAK,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc,SAAA,CAAU,QAAQ,CAAA;AAAA,MACjE,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACF;;;AC7BO,IAAM,eAAN,MAAmB;AAAA,EAMxB,WAAA,CACW,EAAA,EACA,cAAA,EACA,SAAA,EACA,aACA,UAAA,EACA,SAAA,EACA,SAAA,EACT,IAAA,EACA,OACS,QAAA,GAAwB,IAAA,EACjC,UAAA,GAA0B,IAAA,EAC1B,SAAsB,SAAA,EACtB;AAZS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAIT,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,eAAA,GAAkB,UAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,EACrB;AAAA,EAjBW,EAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EAGA,QAAA;AAAA,EAfH,SAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EAsBR,MAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,WAAA,KAAgB,WAAA;AAAA,EAC9B;AAAA,EAEA,IAAA,GAAe;AACb,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,UAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC7B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA,EAEA,YAAY,KAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,EACpB;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA,EAEA,aAAa,UAAA,EAAwB;AACnC,IAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AACjC,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,0BAAA;AAAA,QACA,WAAW,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,8BAAA,EAAiC,IAAA,CAAK,gBAAgB,KAAK,CAAA,CAAA,CAAA;AAAA,QACnF,EAAE,SAAS,IAAA,CAAK,EAAA,CAAG,OAAO,UAAA,EAAY,IAAA,CAAK,gBAAgB,KAAA;AAAM,OACnE;AAAA,IACF;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,UAAA;AAAA,EACzB;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,IAAA,CAAK,gBAAgB,SAAA,EAAW;AAClC,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,mBAAA;AAAA,QACA,CAAA,QAAA,EAAW,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,kEAAA,CAAA;AAAA,QACxB,EAAE,OAAA,EAAS,IAAA,CAAK,EAAA,CAAG,KAAA;AAAM,OAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,QAAQ,IAAA,CAAK,WAAA;AAAA,MACb,SAAA,EAAW,KAAK,SAAA,CAAU,GAAA;AAAA,MAC1B,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,GAAA,IAAO,IAAA;AAAA,MACtC,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO;AAAA,MACjC,SAAA,EAAW,KAAK,SAAA,CAAU,KAAA;AAAA,MAC1B,MAAM,IAAA,CAAK,SAAA;AAAA,MACX,KAAA,EAAO,KAAK,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,CAAA;AAAA,MAClD,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAA,IAAS,IAAA;AAAA,MAClC,UAAA,EAAY,IAAA,CAAK,eAAA,EAAiB,KAAA,IAAS;AAAA,KAC7C;AAAA,EACF;AACF;;;ACrFO,IAAM,UAAN,MAAc;AAAA,EACV,EAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,sBAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EAET,YAAY,KAAA,EAAqB;AAC/B,IAAA,IAAA,CAAK,KAAK,KAAA,CAAM,EAAA;AAChB,IAAA,IAAA,CAAK,gBAAgB,KAAA,CAAM,aAAA;AAC3B,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,WAAA;AACzB,IAAA,IAAA,CAAK,GAAA,GAAM,MAAM,GAAA,IAAO,IAAA;AACxB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAM,SAAA,IAAa,KAAA;AACpC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAM,YAAA,IAAgB,IAAA;AAC1C,IAAA,IAAA,CAAK,sBAAA,GAAyB,MAAM,sBAAA,IAA0B,IAAA;AAC9D,IAAA,IAAA,CAAK,WAAA,GAAc,MAAM,WAAA,IAAe,IAAA;AACxC,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAM,iBAAA,IAAqB,IAAA;AACpD,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAM,eAAA,IAAmB,IAAA;AAChD,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,IAAA,IAAQ,IAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,GAAY,MAAM,SAAA,IAAa,IAAA;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAM,MAAA,IAAU,IAAA;AAAA,EAChC;AAAA;AAAA,EAGA,OAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAA;AAAA,EAC1D;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,WAAA,EAAa,KAAK,WAAA,CAAY,GAAA;AAAA,MAC9B,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,GAAA,IAAO,IAAA;AAAA,MACtB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,wBAAwB,IAAA,CAAK,sBAAA;AAAA,MAC7B,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,GAAA,IAAO,IAAA;AAAA,MACtC,aAAA,EACE,IAAA,CAAK,iBAAA,KAAsB,IAAA,GACvB,OACA,EAAE,IAAA,EAAM,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,EAAA,EAAI,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA,EAAK;AAAA,MAChF,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,KAAA,IAAS,IAAA;AAAA,MACpC,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACF;;;ACxEO,IAAM,SAAN,MAAa;AAAA,EAGlB,WAAA,CACW,MAAA,EACA,KAAA,EACA,GAAA,EACT,SAAuB,MAAA,EACvB;AAJS,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAGT,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,EACtB;AAAA,EANW,MAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EALH,YAAA;AAAA,EAWR,MAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,MAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,YAAA,KAAiB,MAAA;AAAA,EAC/B;AAAA,EAEA,SAAS,IAAA,EAA6B;AACpC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,QAAA;AAAA,EACtB;AAAA;AAAA,EAGA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,EACtB;AACF;;;ACtBO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EAGd,YACG,EAAA,EACA,IAAA,EACA,OACA,GAAA,EACQ,UAAA,EACjB,SAA2B,MAAA,EAC3B;AANS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACQ,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGjB,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,EACtB;AAAA,EARW,EAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACQ,UAAA;AAAA,EAPX,YAAA;AAAA,EAaR,OAAO,MAAA,CACL,EAAA,EACA,MACA,KAAA,EACA,GAAA,EACA,kBAA6C,IAAA,EACjC;AACZ,IAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,aAAa,6CAA0C,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,OAAA,GACJ,oBAAoB,IAAA,GAChB,WAAA,CAAW,eAAe,KAAA,EAAO,GAAG,IACpC,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,IAAI,OAAO,CAAA,CAAE,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,CAAE,GAAG,CAAC,CAAA;AACrE,IAAA,OAAO,IAAI,WAAA,CAAW,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,KAAK,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,OAAe,cAAA,CAAe,KAAA,EAAqB,GAAA,EAA6B;AAC9E,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,OAAO,CAAC,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC3B,MAAA,MAAM,QAAA,GAAW,OAAO,cAAA,EAAe;AACvC,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAM,QAAA;AAChD,MAAA,OAAA,CAAQ,KAAK,IAAI,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAC,CAAA;AAClD,MAAA,MAAA,GAAS,OAAO,mBAAA,EAAoB;AACpC,MAAA,MAAA,EAAA;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,KAAK,YAAA,KAAiB,QAAA;AAAA,EAC/B;AAAA,EAEA,OAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,OAAO,MAAA,EAAwB;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAM,CAAA;AAC7D,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,kBAAA;AAAA,QACA,CAAA,QAAA,EAAW,MAAM,CAAA,qCAAA,EAAqC,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,QAC/D,EAAE,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,QAAQ,MAAA;AAAO,OAC1C;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,SAAS,IAAA,EAA6B;AACpC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,EAC5C;AAAA,EAEA,cAAc,IAAA,EAA4B;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AAC1D,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,kBAAA;AAAA,QACA,CAAA,6BAAA,EAA6B,IAAA,CAAK,GAAG,CAAA,qBAAA,EAAqB,KAAK,IAAI,CAAA,CAAA;AAAA,QACnE,EAAE,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,UAAA,EAAY,KAAK,IAAA;AAAK,OAC1C;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACjC,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,UAAA,EAAY;AACpC,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,MAAA,IAAU,MAAA,CAAO,QAAO,EAAG;AAC7C,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,uBAAA;AAAA,UACA,CAAA,QAAA,EAAW,MAAM,CAAA,wCAAA,EAA2C,MAAA,CAAO,MAAM,CAAA,eAAA,CAAA;AAAA,UACzE,EAAE,YAAY,IAAA,CAAK,IAAA,EAAM,QAAQ,MAAA,EAAQ,UAAA,EAAY,OAAO,MAAA;AAAO,SACrE;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAA,EAAM;AACb,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,aAAa,MAAA,EAAwB;AACnC,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACjC,IAAA,MAAA,CAAO,MAAA,EAAO;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,UAAA,EAAY;AACpC,MAAA,IAAI,MAAA,CAAO,QAAO,EAAG;AACnB,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,uBAAA;AAAA,UACA,CAAA,gBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,UAAA,EAAa,OAAO,MAAM,CAAA,eAAA,CAAA;AAAA,UACtD,EAAE,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,OAAO,MAAA;AAAO,SACrD;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,QAAA;AAAA,EACtB;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AACnB,MAAA,MAAM,IAAI,WAAA,CAAY,qBAAA,EAAuB,CAAA,iBAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,kBAAA,CAAA,EAAsB;AAAA,QAC3F,YAAY,IAAA,CAAK;AAAA,OAClB,CAAA;AAAA,IACH;AAAA,EACF;AACF;;;AC3IO,IAAM,cAAN,MAAkB;AAAA,EACvB,WAAA,CACW,IACA,EAAA,EACA,KAAA,EACA,YACA,QAAA,EACA,MAAA,EACA,OAAA,GAAwB,EAAC,EAClC;AAPS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACR;AAAA,EAPQ,EAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EAGX,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA,EAAU,KAAK,QAAA,CAAS,KAAA;AAAA,MACxB,QAAQ,IAAA,CAAK,MAAA;AAAA;AAAA,MAEb,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AACF;;;ACnBO,IAAM,WAAN,MAAe;AAAA,EAGpB,WAAA,CACW,IACA,IAAA,EACA,aAAA,EACA,iBACA,KAAA,EACA,SAAA,EACA,QAAA,EACA,SAAA,GAAyB,IAAA,EAClC;AARS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACR;AAAA,EARQ,EAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EAVM,iBAA+B,EAAC;AAAA,EAajD,WAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,SAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,YAAY,IAAA,EAAkC;AAC5C,IAAA,IAAI,YAAY,IAAA,CAAK,KAAA;AACrB,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,cAAA,EAAgB;AAC5C,MAAA,IAAI,SAAS,IAAA,IAAQ,UAAA,CAAW,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzD,MAAA,SAAA,GAAY,SAAA,CAAU,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,EAC3B;AAAA,EAEA,SAAS,IAAA,EAA2C;AAClD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACvC,IAAA,IAAI,SAAA,CAAU,MAAA,EAAO,EAAG,OAAO,SAAA;AAC/B,IAAA,OAAO,SAAA,CAAU,MAAA,CAAO,IAAA,CAAK,KAAK,IAAI,MAAA,GAAS,mBAAA;AAAA,EACjD;AAAA,EAEA,OAAO,UAAA,EAA8B;AACnC,IAAA,IAAI,WAAW,KAAA,CAAM,SAAA,CAAU,KAAK,SAAA,EAAW,IAAI,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,2BAAA;AAAA,QACA,CAAA,UAAA,EAAa,UAAA,CAAW,KAAA,CAAM,cAAA,EAAgB,CAAA,0BAAA,EAA0B,IAAA,CAAK,SAAA,EAAU,CAAE,cAAA,EAAgB,CAAA,aAAA,EAAgB,IAAA,CAAK,GAAG,KAAK,CAAA,CAAA;AAAA,QACtI;AAAA,UACE,UAAA,EAAY,KAAK,EAAA,CAAG,KAAA;AAAA,UACpB,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU,CAAE,cAAA,EAAe;AAAA,UAC3C,SAAA,EAAW,UAAA,CAAW,KAAA,CAAM,cAAA;AAAe;AAC7C,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,UAAU,CAAA;AAAA,EACrC;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAA,EAAe,KAAK,aAAA,CAAc,KAAA;AAAA,MAClC,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,MACzB,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,KAAA,IAAS,IAAA;AAAA,MACpC,SAAA,EAAW,IAAA,CAAK,SAAA,EAAU,CAAE,MAAA,EAAO;AAAA,MACnC,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,MACpB,WAAA,EAAa,KAAK,cAAA,CAAe,GAAA,CAAI,CAAC,UAAA,KAAe,UAAA,CAAW,QAAQ;AAAA,KAC1E;AAAA,EACF;AACF;;;ACzEO,IAAM,aAAN,MAAiB;AAAA,EACtB,YACW,OAAA,EACA,KAAA,EACA,WACA,eAAA,GAAgC,IAAA,EAChC,iBAAkD,IAAA,EAC3D;AALS,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACR;AAAA,EALQ,OAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EAGX,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAK,OAAA,CAAQ,KAAA;AAAA,MACtB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,MACzB,SAAA,EAAW,KAAK,SAAA,CAAU,GAAA;AAAA,MAC1B,UAAA,EACE,IAAA,CAAK,eAAA,KAAoB,IAAA,GACrB,IAAA,GACA,EAAE,KAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAO,EAAG,IAAA,EAAM,KAAK,cAAA;AAAe,KAC1E;AAAA,EACF;AACF;;;ACvBO,IAAM,aAAN,MAAiB;AAAA,EACtB,WAAA,CACW,OACA,gBAAA,EACT;AAFS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAAA,EACR;AAAA,EAFQ,KAAA;AAAA,EACA,gBAAA;AAEb;;;ACgBO,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA,EACrB,WAAA,CACW,KAAA,EACA,MAAA,EACA,KAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAChB;AAAA,EAHgB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EAGnB,OAAO,KAAA,GAA2B;AAChC,IAAA,OAAO,IAAI,mCAAkB,IAAI,GAAA,oBAAO,IAAI,GAAA,EAAI,EAAG,EAAE,CAAA;AAAA,EACvD;AAAA,EAEA,OAAO,QAAA,CACL,cAAA,EACA,eAAA,EACA,cAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,cAAA,CAAe,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,EAAE,CAAC,CAAA;AAC5E,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACvC,IAAA,EAAM,EAAE,YAAA,CAAa,IAAA;AAAA,MACrB,EAAA,EAAI,EAAE,YAAA,CAAa,EAAA;AAAA,MACnB,UAAU,CAAA,CAAE;AAAA,KACd,CAAE,CAAA;AACF,IAAA,OAAO,IAAI,kBAAA,CAAkB,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA;AAAA,EACnD;AAAA,EAEA,YAAA,CAAa,SAAwB,UAAA,EAAoC;AACvE,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACnC,QAAA,MAAM,IAAI,WAAA,CAAY,qBAAA,EAAuB,CAAA,2BAAA,EAA8B,SAAA,CAAU,IAAI,CAAA,CAAA,CAAA,EAAK;AAAA,UAC5F,MAAM,SAAA,CAAU;AAAA,SACjB,CAAA;AAAA,MACH;AACA,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA,EAAG;AAC3D,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,qBAAA;AAAA,UACA,CAAA,4BAAA,EAA+B,SAAA,CAAU,IAAI,CAAA,cAAA,EAAc,UAAU,IAAI,CAAA,CAAA,CAAA;AAAA,UACzE,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,UAAU,IAAA;AAAK,SAC/C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,IAAS,KAAK,IAAA,IAAQ,OAAA,CAAQ,SAAS,IAAA,CAAK,EAAA;AACpE,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAI,UAAA,CAAW,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,IAAA,CAAK,QAAQ,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,qBAAA;AAAA,QACA,CAAA,kBAAA,EAAqB,IAAA,CAAK,QAAQ,CAAA,kBAAA,EAAqB,QAAQ,KAAK,CAAA,CAAA;AAAA,QACpE,EAAE,OAAA,EAAS,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,KAAK,QAAA;AAAS,OACpD;AAAA,IACF;AAAA,EACF;AACF;;;ACnCA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAYO,IAAM,SAAN,MAAa;AAAA,EAClB,WAAA,CACmB,YAAA,EACA,QAAA,EACA,WAAA,EACA,QAAA,EACA,SACA,SAAA,EACA,KAAA,EACA,UAAA,EACA,KAAA,EACA,GAAA,EACjB;AAViB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAVgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EAGnB,KAAK,KAAA,EAA4C;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAG9B,IAAA,MAAM,WAAW,KAAA,CAAM,KAAA;AACvB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,WAAA,CAAY,uBAAA,EAAyB,iDAAiD,CAAA;AAAA,IAClG;AACA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAC9C,MAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,CAAA,SAAA,EAAY,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,MACxF;AACA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAAA,IACtC,CAAC,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAGtC,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAGzB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA;AACrD,IAAA,MAAM,CAAC,UAAA,EAAY,MAAM,CAAA,GAAI,IAAA,CAAK,cAAc,SAAS,CAAA;AAEzD,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAErC,IAAA,MAAM,QAAQ,IAAI,YAAA;AAAA,MAChB,IAAA,CAAK,IAAI,IAAA,EAAK;AAAA,MACd,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,UAAA,CAAW,IAAI,CAAA;AAAA,MAC/C,SAAA;AAAA,MACA,OAAA,CAAQ,WAAA;AAAA,MACR,KAAK,GAAA,EAAI;AAAA,MACT,IAAI,SAAA,CAAU,UAAA,CAAW,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MAC5C,OAAA,CAAQ,EAAA;AAAA,MACR,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,KAAA,CAAM,IAAI,SAAS,CAAA;AAE3D,IAAA,OAAO,IAAI,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,KAAA,EAAiC;AACvD,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,IAAA,EAAM,OAAO,EAAC;AAErC,IAAA,MAAM,UAAsB,EAAC;AAC7B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAElD,IAAA,KAAA,CAAM,KAAA,EAAM,CAAE,OAAA,CAAQ,CAAC,MAAM,KAAA,KAAU;AACrC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,MAAA,IAAI,IAAA,GAA4B,IAAA;AAChC,MAAA,IAAI,SAAS,OAAA,KAAY,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,SAAS,IAAA,GAAO,YAAA;AAAA,WAAA,IACtD,SAAS,OAAA,KAAY,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,UAAU,IAAA,GAAO,SAAA;AACrE,MAAA,IAAI,SAAS,IAAA,EAAM;AAEnB,MAAA,MAAM,OAAO,IAAI,QAAA;AAAA,QACf,IAAA,CAAK,IAAI,IAAA,EAAK;AAAA,QACd,IAAA;AAAA,QACA,KAAA,CAAM,EAAA;AAAA,QACN,KAAA;AAAA,QACA,IAAA,CAAK,KAAA;AAAA,QACL,KAAA,CAAM,SAAA;AAAA,QACN,KAAA,CAAM,SAAA;AAAA,QACN,SAAS,SAAA,IAAa;AAAA,OACxB;AACA,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AACvB,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB,CAAC,CAAA;AAED,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAA,EAA4C;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAE7C,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA,GAAI,KAAA,CAAM,cAAc,EAAC;AAC5E,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,WAAA,CAAY,oBAAA,EAAsB,yBAAyB,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,OAA0D,EAAC;AACjE,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAmB;AAEvC,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,IAAI,CAAC,QAAA,CAAS,UAAU,CAAA,EAAG;AACzB,QAAA,MAAM,IAAI,WAAA,CAAY,oBAAA,EAAsB,8BAA8B,CAAA;AAAA,MAC5E;AACA,MAAA,MAAM,aAAa,UAAA,CAAW,UAAA;AAC9B,MAAA,IAAI,IAAA,GAAwB,IAAA;AAC5B,MAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,KAAK,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,QACxD,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,EAAE,KAAA,YAAiB,YAAA,CAAA,EAAe,MAAM,KAAA;AAAA,QAC9C;AAAA,MACF;AACA,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,oBAAA;AAAA,UACA,CAAA,eAAA,EAAkB,OAAO,UAAA,KAAe,QAAA,GAAW,aAAa,GAAG,CAAA,gBAAA;AAAA,SACrE;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,oBAAA,CAAqB,UAAA,CAAW,OAAO,kBAAkB,CAAA;AAC5E,MAAA,MAAM,CAAC,iBAAiB,cAAc,CAAA,GAAI,KAAK,eAAA,CAAgB,UAAA,CAAW,UAAA,IAAc,IAAA,EAAM,IAAI,CAAA;AAElG,MAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACjF,MAAA,IAAI,KAAA,CAAM,IAAI,cAAc,CAAA,CAAE,UAAU,IAAA,CAAK,SAAA,EAAW,CAAA,GAAI,CAAA,EAAG;AAC7D,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,2BAAA;AAAA,UACA,aAAa,KAAA,CAAM,cAAA,EAAgB,CAAA,0BAAA,EAA0B,KAC1D,SAAA,EAAU,CACV,QAAA,CAAS,cAAc,EACvB,cAAA,EAAgB,CAAA,aAAA,EAAgB,IAAA,CAAK,GAAG,KAAK,CAAA,CAAA;AAAA,UAChD,EAAE,UAAA,EAAY,IAAA,CAAK,EAAA,CAAG,KAAA;AAAM,SAC9B;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,EAAA,CAAG,OAAO,KAAA,CAAM,GAAA,CAAI,cAAc,CAAC,CAAA;AACpD,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,IAAA;AAAA,QACA,UAAA,EAAY,IAAI,UAAA,CAAW,KAAA,CAAM,IAAI,KAAA,EAAO,KAAA,CAAM,SAAA,EAAW,eAAA,EAAiB,cAAc;AAAA,OAC7F,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,WAAuB,EAAC;AAC9B,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,cAAA,EAAe;AACpD,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAChC,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AAC7B,MAAA,IAAA,CAAK,YAAY,KAAA,EAAO,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,IAAI,SAAA,EAAW;AAAA,QAC3D,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAI,KAAK,IAAA,CAAK,SAAA,EAAU,CAAE,cAAA,EAAe;AAAE,OACvE,CAAA;AACD,MAAA,QAAA,CAAS,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,oBAAA,CAAqB,KAAc,KAAA,EAAsB;AAC/D,IAAA,MAAM,SAAS,QAAA,CAAS,GAAG,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA;AACtD,IAAA,MAAM,WAAW,QAAA,CAAS,GAAG,IAAI,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA;AAC1D,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,QAAA,KAAa,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1D,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,EAAG,KAAK,CAAA,8BAAA,CAA6B,CAAA;AAAA,IAC9D;AACA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,KAAK,YAAY,CAAA;AAChD,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAW,EAAG;AACvB,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,EAAG,KAAK,CAAA,cAAA,CAAgB,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CACN,KACA,IAAA,EACiD;AACjD,IAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,OAAO,CAAC,MAAM,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,MAAA,MAAM,IAAI,WAAA,CAAY,iCAAA,EAAmC,+BAA+B,CAAA;AAAA,IAC1F;AACA,IAAA,MAAM,IAAA,GAAO,6BAAA,CAA8B,GAAA,CAAI,IAAI,CAAA;AACnD,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,iCAAA;AAAA,QACA,4BAA4B,OAAO,GAAA,CAAI,SAAS,QAAA,GAAW,GAAA,CAAI,OAAO,GAAG,CAAA,CAAA;AAAA,OAC3E;AAAA,IACF;AACA,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,KAAA,EAAO,iBAAiB,CAAA;AAAA,IAChE,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,WAAA,CAAY,iCAAA,EAAmC,oDAA4C,CAAA;AAAA,MACvG;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,IAAI,MAAM,SAAA,CAAU,IAAA,CAAK,SAAA,EAAW,IAAI,CAAA,EAAG;AACzC,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,iCAAA;AAAA,QACA,CAAA,UAAA,EAAa,MAAM,cAAA,EAAgB,6BAA0B,IAAA,CAAK,SAAA,EAAU,CAAE,cAAA,EAAgB,CAAA;AAAA,OAChG;AAAA,IACF;AACA,IAAA,OAAO,CAAC,OAAO,IAAI,CAAA;AAAA,EACrB;AAAA,EAEA,QAAQ,KAAA,EAA8C;AACpD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAC7C,IAAA,MAAM,UAAwB,EAAC;AAE/B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,KAAA,CAAM,MAAK,EAAG;AAC1C,MAAA,OAAA,CAAQ,OAAO,EAAE,IAAA,EAAM,MAAM,IAAA,EAAK,EAAG,IAAI,IAAA,EAAK;AAC9C,MAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,IAAI,WAAA,CAAY,uBAAA,EAAyB,iDAAiD,CAAA;AAAA,MAClG;AACA,MAAA,MAAM,SAAS,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AACjD,QAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,EAAG;AACtB,UAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,CAAA,SAAA,EAAY,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,QACxF;AACA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAAA,MACtC,CAAC,CAAA;AACD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACtC,MAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAEzB,MAAA,OAAA,CAAQ,KAAA,GAAQ;AAAA,QACd,IAAA,EAAM,MAAM,KAAA,EAAM,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,QAC/C,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ;AAAA,OACvC;AACA,MAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAO,cAAA,EAAgB,KAAA,CAAM,EAAA,EAAI,aAAa,OAAO,CAAA;AAAA,IACxE,CAAA,MAAO;AAEL,MAAA,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,SAAS,KAAA,EAAwC;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAE9B,IAAA,IAAI,KAAA,CAAM,YAAY,MAAA,EAAW;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAC7C,MAAA,IAAI,KAAA,CAAM,WAAA,EAAY,EAAG,OAAO,CAAA;AAChC,MAAA,KAAA,CAAM,QAAA,EAAS;AACf,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,KAAA,CAAM,IAAI,WAAA,EAAa;AAAA,QAC7D,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,IAAI,WAAA;AAAY,OAC5C,CAAA;AACD,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAQ,KAAA,CAAM,aAAA;AACpB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,IAAI,WAAA,CAAY,iBAAA,EAAmB,6CAA6C,CAAA;AAAA,IACxF;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC3C,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,MAAA,IAAI,MAAM,WAAA,EAAY,IAAK,MAAM,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC/D,MAAA,KAAA,CAAM,QAAA,EAAS;AACf,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,KAAA,CAAM,IAAI,WAAA,EAAa;AAAA,QAC7D,MAAA,EAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,IAAI,WAAA;AAAY,OAC5C,CAAA;AACD,MAAA,KAAA,EAAA;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,QAAQ,KAAA,EAA8C;AACpD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAEhD,IAAA,IAAI,QAAA,CAAS,UAAA,EAAW,KAAM,IAAA,EAAM;AAClC,MAAA,MAAM,IAAI,WAAA,CAAY,0BAAA,EAA4B,WAAW,QAAA,CAAS,EAAA,CAAG,KAAK,CAAA,sBAAA,CAAA,EAA0B;AAAA,QACtG,OAAA,EAAS,SAAS,EAAA,CAAG;AAAA,OACtB,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,SAAS,CAAA;AACrD,IAAA,MAAM,CAAC,UAAA,EAAY,MAAM,CAAA,GAAI,IAAA,CAAK,cAAc,SAAS,CAAA;AACzD,IAAA,MAAM,OAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA,OAAA,EAAU,SAAS,cAAc,CAAA,CAAA;AAEtE,IAAA,MAAM,WAAW,IAAI,YAAA;AAAA,MACnB,IAAA,CAAK,IAAI,IAAA,EAAK;AAAA,MACd,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,UAAA,CAAW,IAAI,CAAA;AAAA,MAC/C,SAAA;AAAA,MACA,QAAA,CAAS,WAAA;AAAA,MACT,KAAK,GAAA,EAAI;AAAA,MACT,IAAI,SAAA,CAAU,UAAA,CAAW,IAAA,EAAM,OAAO,MAAM,CAAA;AAAA,MAC5C,QAAA,CAAS,SAAA;AAAA,MACT,IAAA;AAAA,MACA,QAAA,CAAS,OAAM,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAA;AAAA,MAC7C,QAAA,CAAS;AAAA,KACX;AAEA,IAAA,QAAA,CAAS,YAAA,CAAa,SAAS,EAAE,CAAA;AACjC,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAE1B,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,QAAA,CAAS,IAAI,SAAS,CAAA;AAC9D,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,cAAA,EAAgB,QAAA,CAAS,IAAI,UAAA,EAAY;AAAA,MAC/D,YAAY,EAAE,IAAA,EAAM,MAAM,EAAA,EAAI,QAAA,CAAS,GAAG,KAAA;AAAM,KACjD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,YAAY,KAAA,EAAwF;AAClG,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,UAAU,CAAA;AAC1D,IAAA,MAAM,SAAS,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AAC9D,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,OAAO,EAAE,UAAA,EAAY,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,EAAE;AAAA,EACvF;AAAA,EAEA,aAAa,KAAA,EAAwF;AACnG,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,UAAU,CAAA;AAC1D,IAAA,MAAM,SAAS,UAAA,CAAW,YAAA,CAAa,IAAA,CAAK,YAAA,CAAa,KAAK,CAAC,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,OAAO,EAAE,UAAA,EAAY,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,EAAE;AAAA,EACvF;AAAA,EAEA,gBAAgB,KAAA,EAA4C;AAC1D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,UAAU,CAAA;AAC1D,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,UAAA,CAAW,IAAI,CAAA,EAAG;AAC/D,MAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AACxB,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,kCAAA;AAAA,UACA,CAAA,gBAAA,EAAmB,UAAA,CAAW,IAAI,CAAA,UAAA,EAAa,MAAM,cAAc,CAAA,0BAAA,CAAA;AAAA,UACnE,EAAE,UAAA,EAAY,UAAA,CAAW,IAAA,EAAM,cAAA,EAAgB,MAAM,cAAA;AAAe,SACtE;AAAA,MACF;AAAA,IACF;AACA,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAChC,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,iBAAiB,KAAA,EAA4C;AAC3D,IAAA,MAAM,OAAO,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAM,IAAA,GAAO,CAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,KAAK,CAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA;AAEzC,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,WAAA,CAAY,GAAA,EAAI,EAAG;AAC7C,MAAA,MAAM,QAAA,GAAW,CAAC,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7E,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,IAAA,KAAS,IAAA,EAAM;AACtC,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,sBAAA;AAAA,UACA,CAAA,iBAAA,EAAiB,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,GAAG,QAAQ,GAAA,CAAI,GAAG,CAAA,4BAAA,EAA4B,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,UAC3F,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,CAAS,IAAA;AAAK,SAClC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,WAAW,MAAA,CAAO,IAAA,CAAK,IAAI,IAAA,EAAK,EAAG,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AACtE,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,UAAU,CAAA;AAC/B,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,cAAc,KAAA,EAAyC;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAEvC,IAAA,IAAI,KAAK,QAAA,CAAS,QAAA,CAAS,OAAA,CAAQ,MAAM,MAAM,IAAA,EAAM;AACnD,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,eAAe,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,qBAAA,CAAA,EAAyB;AAAA,QAC1G,MAAA,EAAQ,QAAQ,MAAA,CAAO;AAAA,OACxB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,OAAA,CAAQ,IAAI,SAAS,CAAA;AACxD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,YAAY,KAAA,EAAyC;AACnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,IAAK,EAAA;AACzC,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,SAAS,aAAA,CAAc,EAAA,CAAG,MAAM,CAAC,CAAA;AAE/D,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAI,YAAY,mBAAA,EAAqB,CAAA,MAAA,EAAS,MAAM,CAAA,gBAAA,CAAA,EAAoB,EAAE,QAAQ,CAAA;AAAA,IAC1F;AAEA,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,EAAO;AAC9B,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAC1B,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,OAAA,CAAQ,IAAI,QAAA,EAAU;AAAA,MACvD,QAAQ,EAAE,IAAA,EAAM,QAAQ,EAAA,EAAI,OAAA,CAAQ,QAAO;AAAE,KAC9C,CAAA;AACD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,sBAAsB,KAAA,EAAwC;AAC5D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,WAAA,CAAY,sBAAA,EAAwB,oBAAoB,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,WAAsB,EAAC;AAC7B,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,MAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,QAAA,MAAM,IAAI,WAAA,CAAY,sBAAA,EAAwB,CAAA,MAAA,EAAS,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,MACnF;AACA,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,MACjC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,UAAA,MAAM,IAAI,YAAY,sBAAA,EAAwB,CAAA,MAAA,EAAS,KAAK,CAAA,mBAAA,CAAA,EAAuB,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA;AAAA,QACnG;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,KAAM,IAAA,EAAM;AACxF,QAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,eAAe,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,qBAAA,CAAA,EAAyB;AAAA,UAC1G,MAAA,EAAQ,QAAQ,MAAA,CAAO;AAAA,SACxB,CAAA;AAAA,MACH;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAChC,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB,CAAC,CAAA;AAED,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,OAAA,CAAQ,IAAI,SAAS,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA;AAAA,EAIQ,MAAM,KAAA,EAAwC;AACpD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAClC,IAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,EAAA,GAAK,KAAA,GAAQ,QAAA;AAAA,EAClD;AAAA,EAEQ,SAAA,CAAU,SAAkC,KAAA,EAA2B;AAC7E,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,MAAM,SAAS,QAAA,CAAS,KAAK,IAAI,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA;AAC1D,IAAA,MAAM,WAAW,QAAA,CAAS,KAAK,IAAI,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA;AAE9D,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,QAAA,KAAa,IAAA,EAAM;AACxC,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,CAAA,SAAA,EAAY,KAAK,CAAA,mCAAA,CAAkC,CAAA;AAAA,IACrG;AACA,IAAA,IAAI,QAAA,KAAa,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM;AACvC,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,wBAAA;AAAA,QACA,YAAY,KAAK,CAAA,kBAAA,EAAkB,QAAQ,CAAA,yCAAA,EAAoC,IAAA,CAAK,aAAa,IAAI,CAAA,CAAA;AAAA,QACrG,EAAE,QAAA;AAAS,OACb;AAAA,IACF;AAEA,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,wBAAA;AAAA,UACA,YAAY,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,uBAAA,EAAuB,IAAA,CAAK,aAAa,IAAI,CAAA,OAAA,CAAA;AAAA,UACjF,EAAE,MAAA;AAAO,SACX;AAAA,MACF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AACA,IAAA,IAAI,CAAC,WAAA,CAAY,UAAA,EAAW,EAAG;AAC7B,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,wBAAA;AAAA,QACA,YAAY,KAAK,CAAA,2DAAA,CAAA;AAAA,QACjB,EAAE,MAAA;AAAO,OACX;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,IAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,QAAA,EAAU;AACzC,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,CAAA,SAAA,EAAY,KAAK,CAAA,kCAAA,CAAoC,CAAA;AAAA,IACvG;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AACxC,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,EAAA,EAAI;AACtC,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,CAAA,SAAA,EAAY,KAAK,CAAA,eAAA,CAAiB,CAAA;AAAA,IACpF;AAEA,IAAA,MAAM,aAA+B,EAAC;AACtC,IAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,GAAI,OAAA,CAAQ,aAAa,EAAC;AAChF,IAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,MAAA,IAAI,CAAC,QAAA,CAAS,YAAY,CAAA,IAAK,OAAO,YAAA,CAAa,IAAA,KAAS,QAAA,IAAY,OAAO,YAAA,CAAa,IAAA,KAAS,QAAA,EAAU;AAC7G,QAAA,MAAM,IAAI,WAAA,CAAY,qBAAA,EAAuB,CAAA,SAAA,EAAY,KAAK,CAAA,4BAAA,CAA2B,CAAA;AAAA,MAC3F;AACA,MAAA,UAAA,CAAW,KAAK,cAAA,CAAe,EAAA,CAAG,aAAa,IAAA,EAAM,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,SAAS,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,GAAI,QAAQ,MAAA,GAAS,IAAA;AAE3D,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,WAAA,EAAa,YAAY,MAAA,EAAO;AAAA,EACjE;AAAA,EAEQ,eAAe,SAAA,EAA6B;AAClD,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,EAAA,EAAI;AACrD,MAAA,MAAM,IAAI,WAAA,CAAY,oBAAA,EAAsB,uCAAuC,CAAA;AAAA,IACrF;AACA,IAAA,IAAI,OAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,KAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,IACzD,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,EAAE,KAAA,YAAiB,YAAA,CAAA,EAAe,MAAM,KAAA;AAAA,IAC9C;AACA,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAI,YAAY,mBAAA,EAAqB,CAAA,MAAA,EAAS,SAAS,CAAA,gBAAA,CAAA,EAAoB,EAAE,WAAW,CAAA;AAAA,IAChG;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,aAAa,MAAA,EAAmC;AACtD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,KAAS;AACjC,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,EAAA,CAAG,IAAA,CAAK,OAAO,CAAA;AAC5C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA;AAC7C,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,MAAA,EAAS,MAAA,CAAO,KAAK,CAAA,gBAAA,CAAA,EAAoB,EAAE,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAC9G;AACA,MAAA,IAAI,OAAA,CAAQ,UAAS,EAAG;AACtB,QAAA,MAAM,IAAI,WAAA,CAAY,kBAAA,EAAoB,CAAA,MAAA,EAAS,MAAA,CAAO,KAAK,CAAA,aAAA,CAAA,EAAiB,EAAE,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAC1G;AACA,MAAA,OAAO,IAAI,SAAA,CAAU,OAAA,CAAQ,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,UAAA,EAAY,KAAK,MAAM,CAAA;AAAA,IACtG,CAAC,CAAA;AAED,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,KAAK,UAAU,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAe,KAAA,EAA0B;AAC/C,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACxC,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,KAAK,IAAA,KAAS,OAAA,UAAiB,KAAA,CAAM,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,WAClD,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,oBAAA;AAAA,QACA,gBAAW,KAAA,CAAM,cAAA,EAAgB,CAAA,uBAAA,EAAgB,MAAA,CAAO,gBAAgB,CAAA,CAAA,CAAA;AAAA,QACxE,EAAE,OAAO,KAAA,CAAM,cAAA,IAAkB,MAAA,EAAQ,MAAA,CAAO,gBAAe;AAAE,OACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,SAAA,EAAkC;AACvD,IAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,MAAA,MAAM,IAAI,WAAA,CAAY,kBAAA,EAAoB,iBAAiB,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI;AACF,MAAA,OAAO,YAAA,CAAa,GAAG,SAAS,CAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,WAAA,CAAY,kBAAA,EAAoB,CAAA,6BAAA,EAA6B,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACrF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,cAAc,SAAA,EAAgF;AACpG,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACrD,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,kBAAA;AAAA,QACA,CAAA,cAAA,EAAiB,UAAU,GAAG,CAAA,gDAAA,CAAA;AAAA,QAC9B,EAAE,IAAA,EAAM,SAAA,CAAU,GAAA;AAAI,OACxB;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,aAAA,CAAc,SAAS,CAAA;AACjD,IAAA,IAAI,WAAW,QAAA,EAAS,IAAK,CAAC,MAAA,CAAO,QAAO,EAAG;AAC7C,MAAA,MAAM,IAAI,YAAY,iBAAA,EAAmB,CAAA,QAAA,EAAW,WAAW,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,gBAAA,CAAA,EAAoB;AAAA,QACtG,YAAY,UAAA,CAAW,IAAA;AAAA,QACvB,QAAQ,MAAA,CAAO;AAAA,OAChB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,CAAC,YAAY,MAAM,CAAA;AAAA,EAC5B;AAAA,EAEQ,aAAa,OAAA,EAAgC;AACnD,IAAA,IAAI,KAAA,GAA6B,IAAA;AACjC,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,EAAA,EAAI;AACjD,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,MACpD,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,EAAE,KAAA,YAAiB,YAAA,CAAA,EAAe,MAAM,KAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,YAAY,iBAAA,EAAmB,CAAA,QAAA,EAAW,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACnH;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAA,EAA2B;AACnD,IAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,QAAA,GAAW,KAAK,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAC9E,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,MAAM,IAAI,YAAY,kBAAA,EAAoB,CAAA,iBAAA,EAAiB,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,GAAG,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACvH;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,aAAa,KAAA,EAAwC;AAC3D,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,EAAG;AAC3D,MAAA,MAAM,IAAI,WAAA,CAAY,kBAAA,EAAoB,sBAAsB,CAAA;AAAA,IAClE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,aAAa,KAAA,EAAyC;AAC5D,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AAEnB,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,EAAA,IAAM,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,EAAA,IAAM,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AAC5F,MAAA,MAAM,IAAI,WAAA,CAAY,sBAAA,EAAwB,iDAA8C,CAAA;AAAA,IAC9F;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,QAAA,GAAW,QAAA;AAEtD,IAAA,OAAO,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK,EAAG,aAAA,CAAc,EAAA,CAAG,MAAM,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,EAC3F;AAAA,EAEQ,YACN,KAAA,EACA,UAAA,EACA,UACA,MAAA,EACA,OAAA,GAAwB,EAAC,EACnB;AACN,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,IAAI,WAAA,CAAY,IAAA,CAAK,IAAI,IAAA,EAAK,EAAG,IAAA,CAAK,GAAA,IAAO,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,EAC9G;AAAA,EAEQ,GAAA,GAAc;AACpB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI,CAAE,WAAA,EAAY;AAAA,EACtC;AACF;;;AC9rBO,IAAM,4BAAN,MAA6D;AAAA,EACjD,WAAA,uBAAkB,GAAA,EAAqB;AAAA,EACvC,OAAA,uBAAc,GAAA,EAAqB;AAAA,EAEpD,IAAI,OAAA,EAAwB;AAC1B,IAAA,IAAI,KAAK,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC9C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,QAAA,CAAU,CAAA;AAAA,IAC7F;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,OAAO,OAAO,CAAA;AAClD,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,KAAK,QAAA,EAAyB;AAAA,EAE9B;AAAA,EAEA,SAAS,MAAA,EAAuC;AAC9C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,IAAK,IAAA;AAAA,EAC/C;AAAA,EAEA,KAAK,EAAA,EAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,IAAK,IAAA;AAAA,EACvC;AAAA,EAEA,GAAA,GAAiB;AACf,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,EACnF;AACF;AAEO,IAAM,+BAAN,MAAmE;AAAA,EACvD,SAAA,uBAAgB,GAAA,EAAwB;AAAA,EAEzD,IAAI,UAAA,EAA8B;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,UAAU,CAAA;AAAA,EAChD;AAAA,EAEA,KAAK,WAAA,EAA+B;AAAA,EAAC;AAAA,EAErC,OAAO,IAAA,EAAiC;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACrC;AAAA,EAEA,QAAQ,IAAA,EAAuC;AAC7C,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,SAAA,CAAU,MAAA,EAAO,EAAG;AAChD,MAAA,IAAI,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,UAAA;AAAA,IACxC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAoB;AAClB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAAA,EACpE;AACF;AAEO,IAAM,4BAAN,MAA6D;AAAA,EACjD,UAA0B,EAAC;AAAA,EAC3B,OAAA,uBAAc,GAAA,EAA0B;AAAA,EACxC,SAAA,uBAAgB,GAAA,EAAoB;AAAA,EAErD,OAAO,KAAA,EAA2B;AAChC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,OAAO,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,KAAA,CAAM,SAAA,CAAU,UAAA,EAAY,MAAM,cAAc,CAAA;AAAA,EACrE;AAAA,EAEA,KAAK,MAAA,EAA4B;AAAA,EAAC;AAAA,EAElC,KAAK,EAAA,EAA+B;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,IAAK,IAAA;AAAA,EACvC;AAAA,EAEA,mBAAmB,UAAA,EAA4B;AAC7C,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAU,KAAK,CAAA,IAAK,CAAA;AAAA,EACjD;AAAA,EAEA,GAAA,GAAsB;AACpB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,CAAA,EAAG,CAAA,KAChC,CAAA,CAAE,SAAA,CAAU,eAAe,CAAA,CAAE,SAAA,CAAU,UAAA,GACnC,CAAA,CAAE,UAAU,UAAA,GAAa,CAAA,CAAE,UAAU,UAAA,GACrC,CAAA,CAAE,iBAAiB,CAAA,CAAE;AAAA,KAC3B;AAAA,EACF;AAAA,EAEA,cAAc,UAAA,EAAoC;AAChD,IAAA,OAAO,KAAK,OAAA,CACT,MAAA,CAAO,CAAC,KAAA,KAAU,MAAM,SAAA,CAAU,UAAA,KAAe,UAAU,CAAA,CAC3D,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,cAAA,GAAiB,EAAE,cAAc,CAAA;AAAA,EACvD;AACF;AAEO,IAAM,4BAAN,MAA6D;AAAA,EACjD,OAAA,uBAAc,GAAA,EAAqB;AAAA,EAEpD,IAAI,OAAA,EAAwB;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,KAAK,EAAA,EAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,IAAK,IAAA;AAAA,EACvC;AAAA,EAEA,GAAA,GAAiB;AACf,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,CAAA,EAAG,CAAA,KACzC,CAAA,CAAE,EAAA,CAAG,QAAQ,CAAA,CAAE,EAAA,CAAG,KAAA,GAAQ,EAAA,GAAK,EAAE,EAAA,CAAG,KAAA,GAAQ,CAAA,CAAE,EAAA,CAAG,QAAQ,CAAA,GAAI;AAAA,KAC/D;AAAA,EACF;AACF;AAEO,IAAM,6BAAN,MAA+D;AAAA,EACnD,QAAoB,EAAC;AAAA,EACrB,OAAA,uBAAc,GAAA,EAAsB;AAAA,EAErD,IAAI,IAAA,EAAsB;AACxB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,CAAG,OAAO,IAAI,CAAA;AAAA,EACtC;AAAA,EAEA,KAAK,KAAA,EAAuB;AAAA,EAAC;AAAA,EAE7B,KAAK,EAAA,EAA2B;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,IAAK,IAAA;AAAA,EACvC;AAAA,EAEA,cAAc,OAAA,EAA2B;AACvC,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EACvE;AAAA,EAEA,GAAA,GAAkB;AAChB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AACF;AAEO,IAAM,qBAAN,MAA+C;AAAA,EACnC,UAAyB,EAAC;AAAA,EAE3C,OAAO,MAAA,EAA2B;AAChC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EAC1B;AAAA,EAEA,GAAA,GAAqB;AACnB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzB;AACF;AAEO,IAAM,4BAAN,MAA6D;AAAA,EACjD,OAAA,uBAAc,GAAA,EAAqB;AAAA,EAEpD,IAAI,OAAA,EAAwB;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,KAAK,QAAA,EAAyB;AAAA,EAAC;AAAA,EAE/B,KAAK,EAAA,EAA0B;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,IAAK,IAAA;AAAA,EACvC;AAAA,EAEA,GAAA,GAAiB;AACf,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC/C,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,IAAA,EAAK,GAAI,EAAE,IAAA,EAAK,GAAI,EAAA,GAAK,CAAA,CAAE,IAAA,EAAK,GAAI,CAAA,CAAE,IAAA,KAAS,CAAA,GAAI,CAAA;AACpE,MAAA,OAAO,WAAW,CAAA,GAAI,MAAA,GAAS,CAAA,CAAE,EAAA,CAAG,QAAQ,CAAA,CAAE,EAAA,CAAG,KAAA,GAAQ,EAAA,GAAK,EAAE,EAAA,CAAG,KAAA,GAAQ,CAAA,CAAE,EAAA,CAAG,QAAQ,CAAA,GAAI,CAAA;AAAA,IAC9F,CAAC,CAAA;AAAA,EACH;AACF;AAEO,IAAM,0BAAN,MAAyD;AAAA,EAC7C,QAAiB,EAAC;AAAA,EAClB,OAAA,uBAAc,GAAA,EAAmB;AAAA,EAElD,IAAI,KAAA,EAAoB;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AACrB,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,CAAG,OAAO,KAAK,CAAA;AAAA,EACxC;AAAA,EAEA,KAAK,MAAA,EAAqB;AAAA,EAAC;AAAA,EAE3B,KAAK,EAAA,EAAwB;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,IAAK,IAAA;AAAA,EACvC;AAAA,EAEA,GAAA,GAAe;AACb,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AACF;;;AC9LA,SAAS,mBAAA,CAAoB,MAAoB,WAAA,EAAmC;AAClF,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,EAAM,GAAI,CAAA,GAAI,WAAA;AACvC,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,cAAc,EAAE,CAAA;AACtD,EAAA,MAAM,MAAA,GAAA,CAAW,WAAA,GAAc,EAAA,GAAM,EAAA,IAAM,EAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAA,GAAS,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,UAAA,EAAW;AACnE,EAAA,OAAO,YAAA,CAAa,EAAA;AAAA,IAClB,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,GAAS,CAAC,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,GAC7G;AACF;AAMO,IAAM,QAAN,MAAY;AAAA,EAKjB,WAAA,CACW,EAAA,EACA,IAAA,EACA,UAAA,EACA,YAAA,EACA,iBACA,UAAA,EACA,KAAA,EACA,gBAAA,EACA,eAAA,EACA,SAAA,EACT;AAVS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACR;AAAA,EAVQ,EAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EAdM,gBAAgC,EAAC;AAAA,EAC1C,QAAA,GAAW,KAAA;AAAA,EACX,UAAA,GAAkC,IAAA;AAAA,EAe1C,UAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,YAAA,GAAqB;AACnB,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,kBAAA;AAAA,QACA,CAAA,UAAA,EAAa,KAAK,EAAA,CAAG,KAAK,4BAA4B,IAAA,CAAK,UAAA,EAAY,OAAO,GAAG,CAAA,CAAA,CAAA;AAAA,QACjF,EAAE,OAAA,EAAS,IAAA,CAAK,EAAA,CAAG,KAAA;AAAM,OAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,UAAA,EAAgC;AACtC,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,cAAc,SAAA,EAAiC;AAC7C,IAAA,OAAO,mBAAA,CAAoB,IAAA,CAAK,UAAA,EAAY,SAAA,GAAY,CAAC,CAAA;AAAA,EAC3D;AAAA,EAEA,cAAc,SAAA,EAA4B;AACxC,IAAA,OAAO,KAAK,aAAA,CAAc,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,cAAc,SAAS,CAAA;AAAA,EAC7E;AAAA,EAEA,kBAAA,CAAmB,SAAA,EAAmB,IAAA,EAAoB,MAAA,EAAe,OAAA,EAAqB;AAC5F,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,EAAE,WAAW,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,EAC9D;AAAA,EAEA,0BAA0B,IAAA,EAAkC;AAC1D,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,KAAK,eAAe,CAAA;AAC5D,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,aAAA,EAAe;AACxC,MAAA,IAAI,SAAS,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjD,MAAA,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,YAAY,IAAA,EAAkC;AAC5C,IAAA,IAAI,IAAA,CAAK,UAAU,YAAA,EAAc,OAAO,KAAK,eAAA,CAAgB,QAAA,CAAS,KAAK,eAAe,CAAA;AAC1F,IAAA,OAAO,KAAK,eAAA,CAAgB,QAAA,CAAS,IAAA,CAAK,yBAAA,CAA0B,IAAI,CAAC,CAAA;AAAA,EAC3E;AAAA,EAEA,eAAA,GAA0C;AACxC,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,KAAW,CAAA,SAAU,EAAC;AAE/C,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,KAAK,eAAe,CAAA;AAC9D,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AAC9C,MAAA,KAAA,GAAQ,KAAA,CAAM,IAAI,MAAM,CAAA;AACxB,MAAA,MAAM,MAAA,GAAS,KAAA,KAAU,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,CAAA;AACvD,MAAA,MAAM,OAAO,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAC3D,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,CAAA,MAAA,EAAS,QAAQ,CAAA,EAAA,EAAK,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA,GAAI,OAAO,cAAA,EAAe;AACnE,MAAA,QAAA,GAAW,KAAA,GAAQ,CAAA;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,KAAA,GAAQ,MAAM,cAAA,EAAe;AACrC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,YAAA,EAAc,KAAK,YAAA,CAAa,KAAA;AAAA,MAChC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,eAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAO;AAAA,MAC7C,UAAA,EAAY,KAAK,UAAA,CAAW,GAAA;AAAA,MAC5B,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,MAAA,EAAQ,IAAA,CAAK,QAAA,GAAW,UAAA,GAAa,QAAA;AAAA,MACrC,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,GAAA,IAAO,IAAA;AAAA,MACpC,SAAA,EAAW,KAAK,SAAA,CAAU;AAAA,KAC5B;AAAA,EACF;AACF;;;AC7HO,SAAS,gBAAgB,KAAA,EAAmC;AACjE,EAAA,OAAO,UAAU,YAAA,IAAgB,KAAA,KAAU,mBAAA,IAAuB,KAAA,KAAU,SAAS,KAAA,GAAQ,IAAA;AAC/F;;;ACSA,SAASA,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AACA,SAASC,UAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAeO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YACmB,YAAA,EACA,MAAA,EACA,WAAA,EACA,QAAA,EACA,QACA,GAAA,EACjB;AANiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EANgB,YAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EARX,aAAsC,EAAC;AAAA,EAW/C,cAAc,UAAA,EAA2C;AACvD,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA,EAEA,QAAQ,KAAA,EAAyD;AAC/D,IAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AACrC,IAAA,MAAM,UAAA,GAAaA,SAAAA,CAAS,KAAA,CAAM,UAAU,CAAA,IAAK,EAAA;AACjD,IAAA,MAAM,eAAe,aAAA,CAAc,EAAA,CAAGA,UAAS,KAAA,CAAM,YAAY,KAAK,GAAG,CAAA;AACzE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,eAAe,CAAA;AAClD,IAAA,MAAM,aAAa,YAAA,CAAa,EAAA,CAAGA,UAAS,KAAA,CAAM,UAAU,KAAK,EAAE,CAAA;AACnE,IAAA,MAAM,YAAA,GAAeA,SAAAA,CAAS,KAAA,CAAM,SAAS,CAAA;AAC7C,IAAA,IAAI,YAAA,KAAiB,IAAA,EAAM,MAAM,IAAI,aAAa,gCAAgC,CAAA;AAClF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AAC9C,IAAA,MAAM,MAAA,GAASA,SAAAA,CAAS,KAAA,CAAM,SAAS,CAAA,IAAK,MAAA;AAE5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,MAAM,UAAU,CAAA;AAExD,IAAA,IAAI,gBAAA,GAAkC,IAAA;AACtC,IAAA,MAAM,WAAoB,EAAC;AAC3B,IAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,MAAA,gBAAA,GAAmB,IAAA,CAAK,iBAAiB,UAAU,CAAA;AACnD,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,cAAA,CAAe,gBAAgB,CAAC,CAAA;AAAA,IACxD,CAAA,MAAA,IAAW,UAAU,MAAA,EAAQ;AAE3B,MAAA,gBAAA,GAAmB,EAAA;AACnB,MAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,cAAA,CAAe,CAAC,CAAA,EAAG;AAC/C,QAAA,QAAA,CAAS,IAAA,CAAK,GAAG,UAAA,CAAW,cAAA,CAAe,EAAE,CAAC,CAAA;AAAA,MAChD;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,MAChB,IAAA,CAAK,IAAI,IAAA,EAAK;AAAA,MACd,IAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,gBAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,KAAK,CAAA;AAErB,IAAA,MAAM,gBAAgB,KAAA,KAAU,mBAAA,GAAsB,IAAA,CAAK,iBAAA,KAAsB,YAAA,CAAa,KAAA;AAC9F,IAAA,IAAA,CAAK,gBAAA,CAAiB,UAAA,EAAY,SAAA,EAAW,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI;AAAA,MACpE,EAAE,SAAS,aAAA,EAAe,IAAA,EAAM,SAAS,KAAA,EAAO,IAAA,CAAK,QAAO,EAAE;AAAA,MAC9D,EAAE,OAAA,EAAS,IAAA,CAAK,cAAA,EAAe,EAAG,MAAM,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,MAAA,EAAO;AAAE,KACxE,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAO;AAC5B,IAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,IAAA,IAAI,KAAA,KAAU,mBAAA,EAAqB,MAAA,CAAO,cAAA,GAAiB,aAAA;AAC3D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,QAAQ,KAAA,EAAyD;AAC/D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAC7C,IAAA,KAAA,CAAM,YAAA,EAAa;AAEnB,IAAA,MAAM,aAAa,YAAA,CAAa,EAAA,CAAGA,UAAS,KAAA,CAAM,UAAU,KAAK,EAAE,CAAA;AACnE,IAAA,KAAA,CAAM,QAAQ,UAAU,CAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAEtB,IAAA,MAAM,QAAA,GAAWD,UAAS,KAAA,CAAM,QAAQ,IAAI,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA;AAC9E,IAAA,MAAM,eAAA,GAAkBC,SAAAA,CAAS,KAAA,CAAM,eAAe,CAAA;AACtD,IAAA,MAAM,cAAcA,SAAAA,CAAS,KAAA,CAAM,WAAW,CAAA,IAAK,KAAK,cAAA,EAAe;AAEvE,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,eAAA,KAAoB,IAAA,EAAM;AACjD,MAAA,MAAM,SAAA,GAAYA,SAAAA,CAAS,KAAA,CAAM,SAAS,CAAA,GAAI,IAAA,CAAK,UAAA,CAAWA,SAAAA,CAAS,KAAA,CAAM,SAAS,CAAE,CAAA,GAAI,KAAA,CAAM,SAAA;AAClG,MAAA,IAAA,CAAK,iBAAiB,UAAA,EAAY,SAAA,EAAW,CAAA,cAAA,EAAiB,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI;AAAA,QAC1E,EAAE,SAAS,WAAA,EAAa,IAAA,EAAM,SAAS,KAAA,EAAO,QAAA,CAAS,QAAO,EAAE;AAAA,QAChE,EAAE,SAAS,eAAA,EAAiB,IAAA,EAAM,UAAU,KAAA,EAAO,QAAA,CAAS,QAAO;AAAE,OACtE,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB;AAAA,EAEA,gBAAgB,KAAA,EAAyD;AACvE,IAAA,MAAM,aAAa,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,GAAW,MAAM,UAAA,GAAa,CAAA;AAC7E,IAAA,MAAM,SAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,IAAA;AAEjE,IAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAA,IAAI,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAExC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,GAAA,EAAI,EAAG;AACrC,MAAA,IAAI,KAAA,CAAM,KAAA,KAAU,YAAA,IAAgB,KAAA,CAAM,UAAU,MAAA,EAAQ;AAC5D,MAAA,IAAI,KAAA,CAAM,YAAW,EAAG;AAExB,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GACnB,WAAW,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,UAAU,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,YAAY,MAAM,CAAA;AACnG,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,QAAO,EAAG;AAE5C,MAAA,MAAM,cAAc,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,UAAA,EAAY,QAAQ,MAAM,CAAA;AACtE,MAAA,MAAM,WAAA,GAAc,MAAA,KAAW,IAAA,GAAO,EAAA,GAAK,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC9E,MAAA,MAAM,QAAQ,IAAA,CAAK,gBAAA;AAAA,QACjB,WAAA;AAAA,QACA,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAA,QAClD,OAAO,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,UAAU,GAAG,WAAW,CAAA,CAAA;AAAA,QAC7C;AAAA,UACE,EAAE,OAAA,EAAS,IAAA,CAAK,0BAAA,EAA2B,EAAG,MAAM,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,MAAA,EAAO,EAAE;AAAA,UACpF,EAAE,OAAA,EAAS,KAAA,CAAM,YAAA,CAAa,KAAA,EAAO,MAAM,QAAA,EAAU,KAAA,EAAO,MAAA,CAAO,MAAA,EAAO;AAAE;AAC9E,OACF;AAEA,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,CAAC,MAAM,CAAA,GAAI,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAC7F,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,SAAA,EAAW,KAAA,KAAU;AACnC,QAAA,KAAA,CAAM,mBAAmB,SAAA,EAAW,WAAA,EAAa,YAAA,CAAa,KAAK,GAAI,KAAK,CAAA;AAAA,MAC9E,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,MAAA,cAAA,EAAA;AACA,MAAA,KAAA,GAAQ,KAAA,CAAM,IAAI,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,mBAAmB,CAAA,EAAG,OAAO,EAAE,UAAA,EAAY,IAAA,EAAM,gBAAgB,CAAA,EAAE;AACvE,IAAA,OAAO,EAAE,cAAA,EAAgB,iBAAA,EAAmB,KAAA,CAAM,QAAO,EAAE;AAAA,EAC7D;AAAA,EAEA,aAAa,OAAA,EAAyB;AACpC,IAAA,IAAI,KAAA,GAAsB,IAAA;AAC1B,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,EAAA,EAAI;AACjD,MAAA,IAAI;AACF,QAAA,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,MACnD,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,EAAE,KAAA,YAAiB,YAAA,CAAA,EAAe,MAAM,KAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,MAAM,IAAI,YAAY,iBAAA,EAAmB,CAAA,UAAA,EAAa,OAAO,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACrH;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAIQ,UAAA,CAAW,OAAc,UAAA,EAAuC;AACtE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsB;AAC/C,IAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,MAAA;AACnC,IAAA,KAAA,IAAS,SAAA,GAAY,CAAA,EAAG,SAAA,IAAa,IAAA,EAAM,SAAA,EAAA,EAAa;AACtD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,SAAS,EAAE,IAAA,EAAK;AACjD,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,IAAI,KAAK,EAAC;AACxC,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,MAAA,YAAA,CAAa,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,WAAW,MAAA,EAAW,OAAO,CAAC,IAAI,IAAI,CAAA;AAE1C,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,YAAA,CAAa,MAAM,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,CAAI,CAAC,SAAS,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,CAAG,MAAM,CAAA;AAClE,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,eAAA,CAAgB,QAAA,CAAS,GAAG,OAAO,CAAA;AAC7D,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA;AAC1C,IAAA,IAAI,cAAc,EAAA,EAAI,OAAO,CAAC,IAAI,IAAI,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,YAAY,SAAS,CAAA;AAExC,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,YAAA,GAAe,IAAA;AACnB,IAAA,KAAA,MAAW,aAAa,MAAA,EAAQ;AAC9B,MAAA,IAAI,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA,EAAG;AAClC,QAAA,YAAA,GAAe,aAAa,GAAA,CAAI,KAAA,CAAM,eAAA,CAAgB,SAAA,GAAY,CAAC,CAAE,CAAA;AACrE,QAAA;AAAA,MACF;AACA,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,QAAA,CAAS,YAAY,CAAA;AAC/C,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,CAAC,MAAA,CAAO,UAAA,EAAW,EAAG,OAAO,CAAC,EAAC,EAAG,IAAI,CAAA;AACrE,IAAA,OAAO,CAAC,YAAY,MAAM,CAAA;AAAA,EAC5B;AAAA,EAEQ,WAAA,CAAY,KAAA,EAAc,UAAA,EAAoB,MAAA,EAAmC;AACvF,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,UAAU,CAAA;AAC/C,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,MAAM,IAAI,WAAA,CAAY,kBAAA,EAAoB,CAAA,iBAAA,EAAiB,UAAU,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAC5F;AACA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,MAAA;AACnC,IAAA,KAAA,IAAS,SAAA,GAAY,CAAA,EAAG,SAAA,IAAa,IAAA,EAAM,SAAA,EAAA,EAAa;AACtD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,aAAA,CAAc,SAAS,CAAA;AAC1C,MAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,KAAA,CAAM,cAAc,SAAS,CAAA,SAAU,CAAC,IAAI,IAAI,CAAA;AACpD,MAAA,OAAO,CAAC,CAAC,SAAS,CAAA,EAAG,MAAM,eAAA,CAAgB,SAAA,GAAY,CAAC,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,CAAC,EAAC,EAAG,IAAI,CAAA;AAAA,EAClB;AAAA,EAEQ,YAAA,CAAa,KAAA,EAAc,MAAA,EAAkB,KAAA,EAAuB;AAC1E,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,CAAC,cAAc,KAAA,CAAM,eAAA,CAAgB,SAAA,GAAY,CAAC,CAAE,CAAA;AAC/E,IAAA,IAAI,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAC7C,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,EAAS,UAAA,GAAa,UAAA,CAAW,IAAI,MAAM,CAAA;AAChE,IAAA,IAAI,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,OAAA;AACrC,IAAA,OAAO,KAAA,CAAM,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEQ,WAAA,CAAY,KAAA,EAAc,UAAA,EAAoB,MAAA,EAAuB,MAAA,EAAgC;AAC3G,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,UAAU,CAAA;AAC/C,IAAA,IAAI,MAAA,KAAW,QAAQ,IAAA,KAAS,IAAA,SAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAE,GAAA;AACjE,IAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA,CAAK,GAAA;AAC/B,IAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAE,CAAA;AAAA,EACvD;AAAA,EAEQ,gBAAA,CACN,IAAA,EACA,SAAA,EACA,IAAA,EACA,KAAA,EACM;AACN,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,EAAE,SAAA,EAAW,IAAA,CAAK,GAAA,EAAK,SAAA,EAAW,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAEhG,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,EAAE,OAAA,EAAS,OAAO,KAAA,CAAM,EAAA,CAAG,OAAO,CAAA;AACvD,IAAA,OAAO,OAAO,KAAA,CAAM,EAAA;AAAA,EACtB;AAAA,EAEQ,mBAAA,CAAoB,KAAA,EAAc,UAAA,EAAoB,MAAA,EAA6B;AACzF,IAAA,MAAM,WAAA,GAAc,MAAA,KAAW,IAAA,GAAO,EAAA,GAAK,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC9E,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,MAC1B,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK;AAAA,MAClB,aAAA,EAAe,CAAA,IAAA,EAAO,UAAU,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,KAAA,CAAM,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAAA,MAC1E,WAAA,EAAa,YAAA,CAAa,EAAA,CAAG,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAQ,CAAA;AAAA,MAC3E,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,OAAO,OAAA,CAAQ,EAAA;AAAA,EACjB;AAAA,EAEQ,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAa,UAAA,EAAsC;AACtF,IAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,eAAA,CAAgB,MAAM,CAAA,IAAK,YAAA;AAEzD,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,UAAA,EAAW,EAAG;AACzC,MAAA,MAAM,SAAA,GAAY,YAAA,CAAa,EAAA,CAAG,SAAA,CAAU,SAAS,CAAA;AACrD,MAAA,MAAM,OAAA,GAAU,UAAU,OAAA,KAAY,IAAA,GAAO,OAAO,YAAA,CAAa,EAAA,CAAG,UAAU,OAAO,CAAA;AACrF,MAAA,IAAI,UAAA,CAAW,SAAS,SAAS,CAAA,IAAM,YAAY,IAAA,IAAQ,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA,EAAI;AAEzF,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,EAAA,CAAG,SAAA,CAAU,YAAA,EAAc,IAAA,CAAK,YAAY,CAAC,CAAA,IAAK,CAAA,EAAG,OAAO,mBAAA;AACrF,MAAA,IACE,SAAA,CAAU,OAAA,KAAY,IAAA,IACtB,SAAA,CAAU,OAAA,KAAY,IAAA,IACtB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,EAAA,CAAG,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,YAAY,CAAC,CAAA,IAAK,CAAA,IAClE,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,EAAA,CAAG,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,YAAY,CAAC,CAAA,IAAK,CAAA,EAClE;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAA0B;AAChC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,aAAA,GAAgB,EAAC;AAC5F,IAAA,MAAM,aAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,IAAI,CAACD,SAAAA,CAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,SAAA,KAAc,QAAA,IAAY,OAAO,IAAA,CAAK,YAAA,KAAiB,QAAA,EAAU;AACpG,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,SAAS,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU,IAAA;AAAA,QAC3D,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,SAAS,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU,IAAA;AAAA,QAC3D,SAAS,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,GAAW,KAAK,OAAA,GAAU;AAAA,OAC5D,CAAA;AAAA,IACH;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,UAAA,EAA4B;AACnD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,UAAA,GAAa,EAAC;AACtF,IAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,IAAIA,SAAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAK,eAAe,UAAA,IAAc,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,EAAU;AACvF,QAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,iBAAA;AAAA,MACA,6CAA0C,UAAU,CAAA,qCAAA;AAAA,KACtD;AAAA,EACF;AAAA,EAEQ,cAAA,GAAyB;AAC/B,IAAA,OAAO,IAAA,CAAK,aAAa,2BAA2B,CAAA;AAAA,EACtD;AAAA,EACQ,0BAAA,GAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,aAAa,4BAA4B,CAAA;AAAA,EACvD;AAAA,EACQ,iBAAA,GAA4B;AAClC,IAAA,OAAO,IAAA,CAAK,aAAa,mBAAmB,CAAA;AAAA,EAC9C;AAAA,EAEQ,aAAa,GAAA,EAAqB;AACxC,IAAA,MAAM,KAAA,GAAQA,UAAS,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,GAAI,IAAA,CAAK,UAAA,CAAW,aAAA,GAAgB,EAAC;AACzF,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAI,OAAO,KAAA;AACtD,IAAA,MAAM,IAAI,YAAY,mBAAA,EAAqB,CAAA,cAAA,EAAiB,GAAG,CAAA,gCAAA,CAAA,EAAoC,EAAE,KAAK,CAAA;AAAA,EAC5G;AAAA,EAEQ,WAAW,GAAA,EAAqB;AACtC,IAAA,MAAM,SAASA,SAAAA,CAAS,GAAG,IAAIC,SAAAA,CAAS,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA;AACtD,IAAA,IAAI,MAAA,KAAW,IAAA,EAAM,MAAM,IAAI,aAAa,cAAc,CAAA;AAC1D,IAAA,OAAO,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAA;AAAA,EAC3C;AACF;;;ACjVO,IAAM,aAAN,MAAiB;AAAA,EAGtB,YACW,EAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACA,iBACA,UAAA,EACT;AANS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EACR;AAAA,EANQ,EAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EARH,SAAA,GAAY,OAAA;AAAA,EAWpB,MAAA,GAAiB;AACf,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,cAAc,UAAA,EAAY;AACjC,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,wBAAA;AAAA,QACA,CAAA,KAAA,EAAQ,IAAA,CAAK,EAAA,CAAG,KAAK,CAAA,wEAAA,CAAA;AAAA,QACrB,EAAE,KAAA,EAAO,IAAA,CAAK,EAAA,CAAG,KAAA;AAAM,OACzB;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,UAAA;AAAA,EACnB;AACF;;;ACzBA,SAASD,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAgBO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,WAAA,CACmB,YAAA,EACA,QAAA,EACA,OAAA,EACA,GAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAJgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EARX,cAAsB,EAAC;AAAA,EACd,IAAA,uBAAW,GAAA,EAAwB;AAAA,EACnC,QAAA,uBAAe,GAAA,EAAoB;AAAA,EASpD,oBAAoB,KAAA,EAAyD;AAC3E,IAAA,MAAM,SAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,aAAA;AACjE,IAAA,MAAM,QAAgB,EAAC;AACvB,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAsB;AAExC,IAAA,KAAA,MAAW,OAAA,IAAW,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,CAAM,KAAA,GAAQ,EAAC,EAAG;AACnE,MAAA,IAAI,CAACA,SAAAA,CAAS,OAAO,KAAK,OAAO,OAAA,CAAQ,WAAW,QAAA,EAAU;AAC5D,QAAA,MAAM,IAAI,aAAa,8BAA8B,CAAA;AAAA,MACvD;AACA,MAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,MAAA,MAAM,YAAwB,EAAC;AAC/B,MAAA,KAAA,MAAW,WAAA,IAAe,MAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,OAAA,CAAQ,SAAA,GAAY,EAAC,EAAG;AACnF,QAAA,IAAI,CAACA,SAAAA,CAAS,WAAW,KAAK,OAAO,WAAA,CAAY,SAAS,QAAA,EAAU;AACpE,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,CAAY,IAAA,EAAM,KAAA,EAAO,OAAO,WAAA,CAAY,KAAA,KAAU,QAAA,GAAW,WAAA,CAAY,KAAA,GAAQ,KAAK,CAAA;AACjH,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,EAAC;AACnC,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,IAAI,CAAA;AAC1B,QAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,MACxB;AACA,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,SAAA,EAAW,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,MAAA,KAAW,aAAA,EAAe,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AACtD,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAEnB,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA,EACxD;AAAA,EAEA,IAAI,KAAA,EAA4C;AAC9C,IAAA,MAAM,aAAa,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,GAAW,MAAM,UAAA,GAAa,CAAA;AAC7E,IAAA,MAAM,SAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,GAAW,MAAM,MAAA,GAAS,CAAA;AACjE,IAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,UAAA,EAAY,MAAM,CAAA;AAElD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAmB;AAEvC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA,EAAG;AAC1D,MAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,KAAW,MAAA,EAAQ;AACvC,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,QAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,CAAQ,IAAA,KAAS,SAAA,EAAW;AACpD,QAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,UAAA,IAAI,SAAA,CAAU,SAAS,YAAA,EAAc;AACrC,UAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,OAAA,GAAU,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO;AACtE,UAAA,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,IAAA,EAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,OAAO,CAAA;AAC7B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,WAAA,EAAa;AACnC,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,IAAK,IAAA;AAC9C,MAAA,IAAI,YAAY,MAAA,EAAO,IAAK,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EAAG;AACzD,MAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,QAAA,KAAa,SAAS,KAAK,CAAA;AAC/D,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,OAAO,CAAA;AAC7C,MAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,EAAU,KAAA,KAAU;AAC1C,QAAA,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,IAAA,EAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,KAAK,CAAE,CAAC,CAAA;AAAA,MAChF,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,UAAA,GAAa,IAAA;AACjB,IAAA,KAAA,MAAW,SAAS,KAAA,CAAM,MAAA,IAAU,UAAA,GAAa,UAAA,CAAW,IAAI,KAAK,CAAA;AAErE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACnC,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,KAAK,CAAA,IAAK,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA;AAE9B,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK,EAAG,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,UAAU,CAAA;AAC1F,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,OAAO,GAAG,CAAA;AAC/B,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,QAAQ,KAAA,EAA4C;AAClD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA;AACvC,IAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,oBAAoB,MAAA,EAA0D;AAC5E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AACxC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,IAAI,EAAA,CAAG,KAAA;AAAA,MACd,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,MACnB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA;AAAA,MACzC,eAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,eAAe,CAAA;AAAA,MACzD,UAAA,EAAY,GAAA,CAAI,UAAA,CAAW,cAAA;AAAe,KAC5C;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAA,EAA0E;AAChG,IAAA,MAAM,QAAQ,CAAC,GAAG,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAO,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAE,CAAA;AAC5E,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,CAAG,cAAA,IAAiB,CAAE,CAAA;AAAA,EAC9F;AAAA,EAEQ,WAAW,KAAA,EAA4B;AAC7C,IAAA,IAAI,GAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,EAAA,EAAI;AAC7C,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,IAAA,CAAK,KAAK,GAAA,CAAI,IAAA,CAAK,WAAW,KAAK,CAAA,CAAE,KAAK,CAAA,IAAK,IAAA;AAAA,MACvD,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,EAAE,KAAA,YAAiB,YAAA,CAAA,EAAe,MAAM,KAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,IAAI,YAAY,uBAAA,EAAyB,CAAA,gBAAA,EAAmB,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC7H;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,cAAc,KAAA,EAAoC;AACxD,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAuB;AACpC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,iBAAA;AAAA,UACA,sCAAmC,IAAI,CAAA,6CAAA,CAAA;AAAA,UACvC,EAAE,YAAY,IAAA;AAAK,SACrB;AAAA,MACF;AACA,MAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AACjB,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,GAAA,CAAI,IAAI,KAAK,EAAC,QAAS,IAAI,CAAA;AACpD,MAAA,QAAA,CAAS,OAAO,IAAI,CAAA;AACpB,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,EAAK,QAAS,IAAI,CAAA;AAAA,EAC7C;AACF;;;ACpKO,IAAM,UAAN,MAAc;AAAA,EAMnB,WAAA,CACW,EAAA,EACT,IAAA,EACA,IAAA,EACA,KAAA,EACA,gBAAA,EACiB,cAAA,GAA2B,EAAC,EAC5B,OAAA,GAAmC,EAAC,EACrD;AAPS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAKQ,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEjB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,uBAAA,GAA0B,gBAAA;AAAA,EACjC;AAAA,EAZW,EAAA;AAAA,EAKQ,cAAA;AAAA,EACA,OAAA;AAAA,EAZX,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,uBAAA;AAAA,EAiBR,IAAA,GAAe;AACb,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,OAAO,KAAA,EAA8C;AACnD,IAAA,MAAM,UAAwB,EAAC;AAE/B,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,YAAY,KAAA,CAAM,IAAA,KAAS,KAAK,WAAA,EAAa;AACrE,MAAA,OAAA,CAAQ,OAAO,EAAE,IAAA,EAAM,KAAK,WAAA,EAAa,EAAA,EAAI,MAAM,IAAA,EAAK;AACxD,MAAA,IAAA,CAAK,cAAc,KAAA,CAAM,IAAA;AAAA,IAC3B;AACA,IAAA,IACE,OAAA,IAAW,KAAA,IACX,KAAA,CAAM,KAAA,KAAU,IAAA,CAAK,YAAA,KACpB,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,KAAA,KAAU,IAAA,CAAA,EACpD;AACA,MAAA,OAAA,CAAQ,QAAQ,EAAE,IAAA,EAAM,KAAK,YAAA,EAAc,EAAA,EAAI,MAAM,KAAA,EAAM;AAC3D,MAAA,IAAA,CAAK,eAAe,KAAA,CAAM,KAAA;AAAA,IAC5B;AACA,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,YAAY,KAAA,CAAM,IAAA,KAAS,KAAK,WAAA,EAAa;AACrE,MAAA,OAAA,CAAQ,OAAO,EAAE,IAAA,EAAM,KAAK,WAAA,EAAa,EAAA,EAAI,MAAM,IAAA,EAAK;AACxD,MAAA,IAAA,CAAK,cAAc,KAAA,CAAM,IAAA;AAAA,IAC3B;AACA,IAAA,IACE,OAAO,KAAA,CAAM,gBAAA,KAAqB,YAClC,KAAA,CAAM,gBAAA,KAAqB,KAAK,uBAAA,EAChC;AACA,MAAA,OAAA,CAAQ,mBAAmB,EAAE,IAAA,EAAM,KAAK,uBAAA,EAAyB,EAAA,EAAI,MAAM,gBAAA,EAAiB;AAC5F,MAAA,IAAA,CAAK,0BAA0B,KAAA,CAAM,gBAAA;AAAA,IACvC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,WAAA;AAAA,MACX,MAAM,IAAA,CAAK,WAAA;AAAA,MACX,OAAO,IAAA,CAAK,YAAA;AAAA,MACZ,kBAAkB,IAAA,CAAK,uBAAA;AAAA,MACvB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,OAAA,EAAS,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK;AAAA,KAChE;AAAA,EACF;AACF;;;ACpEA,SAASC,UAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAGO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,WAAA,CACmB,QAAA,EACA,KAAA,EACA,KAAA,EACA,GAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAJgB,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EAGnB,OAAO,KAAA,EAAyC;AAC9C,IAAA,MAAM,cAAA,GAAA,CAAkB,MAAM,OAAA,CAAQ,KAAA,CAAM,cAAc,CAAA,GAAI,KAAA,CAAM,cAAA,GAAiB,EAAC,EAAG,MAAA;AAAA,MACvF,CAAC,KAAA,KAA2B,OAAO,KAAA,KAAU;AAAA,KAC/C;AACA,IAAA,MAAM,UACJ,KAAA,CAAM,OAAA,KAAY,IAAA,IAAQ,OAAO,MAAM,OAAA,KAAY,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,KAAA,CAAM,OAAO,CAAA,GACtF,KAAA,CAAM,UACP,EAAC;AAEP,IAAA,MAAM,UAAU,IAAI,OAAA;AAAA,MAClB,IAAA,CAAK,IAAI,IAAA,EAAK;AAAA,MACdA,SAAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAAA,MACxBA,SAAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,MAAA;AAAA,MACxBA,SAAAA,CAAS,MAAM,KAAK,CAAA;AAAA,MACpB,OAAO,KAAA,CAAM,gBAAA,KAAqB,QAAA,GAAW,MAAM,gBAAA,GAAmB,IAAA;AAAA,MACtE,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAO,SAAA,EAAW,OAAA,CAAQ,EAAA,EAAI,EAAE,CAAA;AACjD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,OAAO,KAAA,EAAyC;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACpC,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAC1B,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,OAAA,CAAQ,IAAI,OAAO,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,QAAQ,SAAA,EAA6B;AACnC,IAAA,IAAI,OAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,SAAA,KAAc,EAAA,EAAI;AACrD,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,KAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,MACzD,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,EAAE,KAAA,YAAiB,YAAA,CAAA,EAAe,MAAM,KAAA;AAAA,MAC9C;AAAA,IACF;AACA,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAI,YAAY,mBAAA,EAAqB,CAAA,oBAAA,EAAoB,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAClI;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,WAAA,CACN,KAAA,EACA,MAAA,EACA,QAAA,EACA,OAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQA,SAAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAClC,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA;AAAA,MACT,IAAI,WAAA;AAAA,QACF,IAAA,CAAK,IAAI,IAAA,EAAK;AAAA,QACd,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI,CAAE,WAAA,EAAY;AAAA,QAC7B,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,EAAA,GAAK,KAAA,GAAQ,QAAA;AAAA,QACzC,SAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AACF;;;ACjFO,IAAM,wBAAN,MAA4B;AAAA,EACjC,WAAA,CACmB,YAAA,EACA,OAAA,EACA,QAAA,EACA,UACA,QAAA,EACjB;AALiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EALgB,YAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0E;AAChF,IAAA,MAAM,OAAO,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,CAAA;AAC7D,IAAA,MAAM,UAAU,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,CAAA;AAEtE,IAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAY;AAC3C,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG;AACjD,MAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,wBAAA,IAA4B,OAAA,CAAQ,iBAAiB,IAAA,EAAM;AACnF,QAAA,kBAAA,CAAmB,GAAA,CAAI,QAAQ,YAAY,CAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAmB;AAEvC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAClD,MAAA,MAAM,UAAU,OAAA,KAAY,IAAA,GAAO,KAAA,CAAM,SAAA,GAAY,QAAQ,OAAA,EAAQ;AACrE,MAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,KAAM,IAAA,EAAM;AAC7B,MAAA,IAAI,OAAA,KAAY,CAAA,IAAK,IAAA,CAAK,KAAA,CAAA,CAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,CAAA,IAAK,CAAC,CAAA,GAAI,CAAA,KAAM,OAAA,EAAS;AAE5E,MAAA,MAAM,OAAA,GAAU,SAAS,SAAA,IAAa,IAAA,GAAO,OAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACxF,MAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,EAAM,IAAK,IAAA;AAClC,MAAA,IAAI,UAAU,IAAA,EAAM;AAEpB,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,QAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAQ,YAAA;AAC5B,QAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,WAAW,QAAA,EAAU;AAC9D,QAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA,EAAG;AAC7C,QAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO;AACvE,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA,EAAG,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,MACtF;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,CAAC,GAAG,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAO,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAE,CAAA;AAC9E,IAAA,MAAM,OAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAChC,MAAA,IAAI,MAAA,CAAO,QAAO,EAAG;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,cAAA,EAAe,EAAG,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,IACtE;AACA,IAAA,OAAO,EAAE,IAAA,EAAK;AAAA,EAChB;AACF;;;ACxCO,IAAM,yBAAN,MAA6B;AAAA,EAClC,WAAA,CACmB,YAAA,EACA,QAAA,EACA,OAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAHgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0E;AAChF,IAAA,MAAM,aAAa,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,CAAA;AAC/E,IAAA,MAAM,gBACJ,OAAO,MAAA,CAAO,kBAAkB,QAAA,GAAW,MAAA,CAAO,gBAAgB,MAAA,CAAO,gBAAA;AAC3E,IAAA,MAAM,mBAAA,GAAsB,OAAO,mBAAA,KAAwB,IAAA;AAE3D,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,MAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,UAAA;AAClC,MAAA,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,MAAA;AACpC,MAAA,MAAM,cAAc,SAAA,GAAY,UAAA;AAChC,MAAA,MAAM,cAAA,GAAiB,SAAA,KAAc,UAAA,IAAc,WAAA,IAAe,aAAA;AAClE,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,cAAA,EAAgB;AAErC,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,QAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,QAAA,IAAI,WAAA,IAAe,CAAC,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAA,EAAG;AAErD,QAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,CAAO,KAAA;AAC3B,QAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC1B,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,KAAA,GAAQ,EAAE,SAAS,IAAA,EAAM,KAAA,EAAO,MAAM,MAAA,EAAQ,IAAA,EAAM,SAAS,KAAA,EAAM;AACnE,UAAA,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,QACvB;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,KAAA,CAAM,OAAA,GACJ,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,KAAK,CAAA;AAC3F,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAAA,mBACxD,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAC/C,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,IAAI,mBAAA,EAAqB;AACvB,MAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,GAAA,EAAI,EAAG;AACzC,QAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AACrC,UAAA,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,CAAC,GAAG,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAO,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAE,CAAA;AAC9E,IAAA,MAAM,OAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,KAAK,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACpE,MAAA,IAAI,CAAC,mBAAA,IAAuB,OAAA,CAAQ,QAAO,IAAK,CAAC,MAAM,OAAA,EAAS;AAChE,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,cAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,cAAA,EAAe;AAAA,QAC7C,UAAA,EAAY,KAAA,CAAM,KAAA,CAAM,cAAA,EAAe;AAAA,QACvC,WAAA,EAAa,KAAA,CAAM,MAAA,CAAO,cAAA,EAAe;AAAA,QACzC,OAAA,EAAS,QAAQ,cAAA;AAAe,OACjC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,EAAE,IAAA,EAAK;AAAA,EAChB;AACF;;;AClFO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,WAAA,CACmB,SAAA,EACA,QAAA,EACA,OAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAHgB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EAGnB,QAAQ,MAAA,EAA4E;AAClF,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,IAAA,KAAS,WAAW,YAAA,CAAa,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAC9E,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAC1C,IAAA,MAAM,YAAY,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,GAAW,OAAO,SAAA,GAAY,IAAA;AAE5E,IAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,KAAI,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS;AACjD,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,MAAM,OAAO,KAAA;AAChD,MAAA,IAAI,cAAc,IAAA,IAAA,CAAS,IAAA,CAAK,WAAW,KAAA,IAAS,IAAA,MAAU,WAAW,OAAO,KAAA;AAChF,MAAA,IAAI,SAAS,IAAA,IAAQ,IAAA,CAAK,SAAS,OAAA,CAAQ,IAAI,GAAG,OAAO,KAAA;AACzD,MAAA,IAAI,KAAK,WAAA,CAAY,IAAI,CAAA,CAAE,MAAA,IAAU,OAAO,KAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,MAAA,MAAM,MAAA,GAAS,KAAK,WAAA,CAAY,CAAC,EAAE,SAAA,CAAU,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAChE,MAAA,OAAO,MAAA,KAAW,IAAI,MAAA,GAAS,IAAA,CAAK,eAAe,CAAC,CAAA,GAAI,IAAA,CAAK,cAAA,CAAe,CAAC,CAAA;AAAA,IAC/E,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,IAAI,CAAC,CAAA,EAAE;AAAA,EACrE;AAAA,EAEQ,YAAY,IAAA,EAA8B;AAChD,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA,EAAG,eAAe,IAAA,CAAK,QAAA;AAAA,EACjE;AAAA,EAEQ,eAAe,IAAA,EAAwB;AAC7C,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,aAAa,GAAG,cAAA,IAAkB,CAAA;AAAA,EAClE;AAAA,EAEQ,aAAA,CAAc,MAAgB,IAAA,EAAoD;AACxF,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,EAAA,CAAG,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,eAAe,IAAA,CAAK,QAAA,CAAS,KAAK,IAAA,CAAK,SAAS,GAAG,aAAA,IAAiB,IAAA;AAAA,MACpE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,MACzB,SAAA,EAAW,IAAA,CAAK,WAAA,CAAY,IAAI,EAAE,MAAA,EAAO;AAAA,MACzC,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,IAAI;AAAA,KAC5B;AAAA,EACF;AACF;;;AC3CO,IAAM,yBAAN,MAA6B;AAAA,EAClC,WAAA,CACmB,YAAA,EACA,QAAA,EACA,OAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAHgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0D;AAChE,IAAA,MAAM,SAAS,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,EAAA;AACrE,IAAA,MAAM,aAAa,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,CAAA;AAC/E,IAAA,MAAM,gBACJ,OAAO,MAAA,CAAO,kBAAkB,QAAA,GAAW,MAAA,CAAO,gBAAgB,MAAA,CAAO,gBAAA;AAE3E,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,SAAS,aAAA,CAAc,EAAA,CAAG,MAAM,CAAC,CAAA;AAC/D,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,MAAA,EAAS,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC9E;AAEA,IAAA,IAAI,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAC1C,IAAA,IAAI,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAA,EAAG;AACnC,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,QAAA,IAAI,KAAA,CAAM,SAAA,CAAU,UAAA,IAAc,UAAA,EAAY;AAC9C,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,UAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,EAAG;AACxC,UAAA,OAAA,GAAU,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,QACzF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,GAAU,OAAA;AACd,IAAA,MAAM,QAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA,EAAG;AAC1D,MAAA,IAAI,KAAA,CAAM,SAAA,CAAU,MAAA,GAAS,aAAA,EAAe;AAC5C,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,EAAG;AACxC,QAAA,OAAA,GAAU,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACvF,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,gBAAgB,KAAA,CAAM,cAAA;AAAA,UACtB,SAAA,EAAW,MAAM,SAAA,CAAU,GAAA;AAAA,UAC3B,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,UACjB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,UACzB,cAAA,EAAgB,QAAQ,cAAA;AAAe,SACxC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,QAAQ,MAAA,CAAO,KAAA;AAAA,MACxB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,cAAA,EAAgB,QAAQ,cAAA,EAAe;AAAA,MACvC,KAAA;AAAA,MACA,cAAA,EAAgB,QAAQ,cAAA;AAAe,KACzC;AAAA,EACF;AACF;;;AC5DO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,KAAA,EAAmB;AAAnB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAoB;AAAA,EAApB,KAAA;AAAA,EAE7B,QAAQ,MAAA,EAA8E;AACpF,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,IAAA,KAAS,WAAW,YAAA,CAAa,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAC9E,IAAA,MAAM,EAAA,GAAK,OAAO,MAAA,CAAO,EAAA,KAAO,WAAW,YAAA,CAAa,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,GAAI,IAAA;AAExE,IAAA,MAAM,UAA0C,EAAC;AACjD,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI,EAAG;AACrC,MAAA,MAAM,IAAA,GAAO,aAAa,EAAA,CAAG,MAAA,CAAO,GAAG,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACnD,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1C,MAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA,EAAG;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnB;AACF;ACSO,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YACmB,YAAA,EACA,OAAA,EACA,WACA,QAAA,EACA,QAAA,EACA,UACA,OAAA,EACjB;AAPiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAPgB,YAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0D;AAChE,IAAA,MAAM,OAAO,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,CAAA;AAC7D,IAAA,MAAM,UAAU,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,IAAA,KAAS,WAAW,YAAA,CAAa,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAE9E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAuB;AACxC,IAAA,MAAM,UAAA,GAAa,KAAK,kBAAA,EAAmB;AAE3C,IAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAa,IAAA,EAAa,GAAA,KAAqB;AAC1D,MAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,GAAG,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,IAAA,EAAK;AACzD,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,IAC3E,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC9B,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,EAAI,EAAG;AACvC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,aAAa,CAAA;AACnD,QAAA,IAAI,MAAA,KAAW,QAAS,IAAA,KAAS,IAAA,IAAQ,OAAO,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAI;AAC1E,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,UAAU,CAAA;AAChE,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC9B,QAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,qBAAA,CAAsB,IAAA,EAAM,aAAa,CAAA,EAAG;AACnE,UAAA,IAAI,SAAS,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpD,UAAA,IAAI,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAA,EAAW,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,MAAM,GAAG,CAAA;AAAA,QAC1F;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,MAAM,SAAA,EAAW,IAAA,EAAM,OAAO,CAAA,EAAG;AACrD,QAAA,IAAI,SAAS,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpD,QAAA,IAAI,KAAK,SAAA,CAAU,aAAA,CAAc,MAAM,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG;AACvD,QAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,KAAK,kBAAA,CAAmB,KAAA,EAAO,UAAU,CAAA,EAAG;AAC5E,UAAA,GAAA,CAAI,GAAA,EAAK,YAAA,CAAa,IAAA,EAAM,YAAA,CAAa,GAAG,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI,KAAA,CAAM,aAAa,IAAA,EAAM;AAE3B,UAAA,OAAA,GAAU,KAAA,CAAM,SAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAClD,UAAA,OAAA,GAAU,OAAA,KAAY,IAAA,GAAO,KAAA,CAAM,SAAA,GAAY,QAAQ,OAAA,EAAQ;AAAA,QACjE;AACA,QAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA,EAAG;AAC7C,QAAA,IAAI,SAAS,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpD,QAAA,KAAA,MAAW,CAAC,KAAK,YAAY,CAAA,IAAK,KAAK,kBAAA,CAAmB,KAAA,EAAO,UAAU,CAAA,EAAG;AAC5E,UAAA,GAAA,CAAI,GAAA,EAAK,YAAA,CAAa,IAAA,EAAM,YAAA,CAAa,GAAG,CAAA;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,CAAC,GAAG,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAO,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAE,CAAA;AAC/E,IAAA,MAAM,SAAwD,EAAC;AAC/D,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAE5B,MAAA,MAAM,cAAc,KAAA,CAAM,eAAA;AAAA,QACxB,IAAIC,GAAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,CAAA,EAAGA,GAAAA,CAAI,SAAS,CAAA;AAAA,QAC7D,IAAA,CAAK;AAAA,OACP;AACA,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAE,IAAA,EAAM,WAAA,CAAY,cAAA,EAAe,EAAG,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAe,EAAE;AACtF,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,QAAA;AACzC,MAAA,OAAA,GAAU,SAAA,KAAc,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAAA,IAC3F;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,QAAO,EAAE;AAAA,EACnD;AAAA,EAEQ,kBAAA,GAA0C;AAChD,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY,EAAG;AACjD,MAAA,IAAI,OAAA,CAAQ,iBAAiB,IAAA,EAAM;AACjC,QAAA,UAAA,CAAW,IAAI,OAAA,CAAQ,YAAA,EAAc,KAAK,gBAAA,CAAiB,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,MAChF;AACA,MAAA,IAAI,OAAA,CAAQ,sBAAsB,IAAA,EAAM;AACtC,QAAA,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA;AAAA,MACnD;AACA,MAAA,IAAI,OAAA,CAAQ,qBAAqB,IAAA,EAAM;AACrC,QAAA,UAAA,CAAW,GAAA;AAAA,UACT,OAAA,CAAQ,gBAAA;AAAA,UACR,QAAQ,SAAA,KAAc,gBAAA,GAAmB,UAAU,IAAA,CAAK,gBAAA,CAAiB,QAAQ,UAAU;AAAA,SAC7F;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,aAAA,EAA+B;AACtD,IAAA,IAAI,aAAA,KAAkB,IAAI,OAAO,QAAA;AACjC,IAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,SAAS,aAAA,CAAc,EAAA,CAAG,aAAa,CAAC,CAAA;AACtE,IAAA,OAAO,OAAA,EAAS,OAAA,KAAY,QAAA,GAAW,OAAA,GAAU,QAAA;AAAA,EACnD;AAAA,EAEQ,kBAAA,CAAmB,OAAqB,UAAA,EAAyD;AACvG,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAOzC,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuB;AAE7C,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,MAAA,MAAM,MAAM,IAAA,CAAK,MAAA;AACjB,MAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,MAAA,MAAM,SAAS,GAAA,CAAI,YAAA;AACnB,MAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,OAAO,WAAW,QAAA,EAAU;AAC9D,MAAA,MAAM,GAAA,GAAM,OAAO,MAAM,CAAA;AAEzB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,MAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AACpC,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,IAAK;AAAA,QACrC,WAAA,EAAa,IAAA;AAAA,QACb,UAAA,EAAY,KAAA;AAAA,QACZ,YAAA,EAAc,IAAA;AAAA,QACd,GAAA,EAAK;AAAA,OACP;AAEA,MAAA,IAAI,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,QAAA,EAAU;AACjD,QAAA,MAAM,YAAA,GAAe,OAAA,KAAY,SAAA,GAAY,QAAA,GAAW,OAAA;AACxD,QAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,YAAA,GAAe,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO;AAC3E,QAAA,QAAA,CAAS,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAEtC,QAAA,IAAI,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA;AACrC,QAAA,IAAI,cAAc,IAAA,EAAM;AACtB,UAAA,IAAI,KAAK,KAAA,CAAM,UAAA,EAAW,EAAG,SAAA,GAAY,UAAU,MAAA,EAAO;AAC1D,UAAA,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AACzD,UAAA,QAAA,CAAS,UAAA,GAAa,IAAA;AAAA,QACxB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,QAAA;AACzC,QAAA,MAAM,YAAA,GAAe,SAAA,KAAc,OAAA,GAAU,OAAA,GAAU,QAAA;AACvD,QAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,YAAA,GAAe,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO;AAC3E,QAAA,QAAA,CAAS,YAAA,GAAe,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAAA,MAC1D;AACA,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAuB;AACjD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,SAAA,EAAW;AACpC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,cAAc,KAAA,CAAM,YAAA;AAC1D,MAAA,IAAI,KAAK,MAAA,EAAO,IAAK,KAAA,CAAM,GAAA,CAAI,QAAO,EAAG;AACzC,MAAA,aAAA,CAAc,IAAI,GAAA,EAAK,EAAE,MAAM,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEQ,aAAa,GAAA,EAA4C;AAC/D,IAAA,MAAM,YAAY,GAAA,CAAI,SAAA;AACtB,IAAA,MAAM,MAAA,GACJ,SAAA,KAAc,IAAA,IAAQ,OAAO,SAAA,KAAc,QAAA,IAAY,OAAQ,SAAA,CAAsC,MAAA,KAAW,QAAA,GAC1G,SAAA,CAAsC,MAAA,GACxC,IAAA;AACN,IAAA,OAAO,WAAW,IAAA,GAAO,IAAA,GAAO,MAAM,EAAA,CAAG,MAAA,EAAQ,KAAK,YAAY,CAAA;AAAA,EACpE;AAAA,EAEQ,qBAAA,CAAsB,MAAgB,aAAA,EAAgD;AAC5F,IAAA,MAAM,SAAkB,EAAC;AACzB,IAAA,MAAM,SAAA,uBAAgB,GAAA,EAAuB;AAC7C,IAAA,IAAI,YAAY,IAAA,CAAK,KAAA;AACrB,IAAA,MAAM,QAAQ,IAAIA,GAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAEjD,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,WAAA,EAAY,EAAG;AAC3C,MAAA,SAAA,GAAY,SAAA,CAAU,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AAC/C,MAAA,MAAM,OAAA,GAAU,UAAU,MAAA,EAAO;AACjC,MAAA,MAAM,QAAQ,IAAIA,GAAAA,CAAI,UAAA,CAAW,KAAA,CAAM,gBAAgB,CAAA;AAEvD,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,YAAY,CAAA,IAAK,aAAA,EAAe;AAC/C,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,IAAK;AAAA,UACpC,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAAA,UAClC,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY;AAAA,SACnC;AAEA,QAAA,IAAI,IAAA;AACJ,QAAA,IAAI,GAAA;AACJ,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAC9C,UAAA,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AAAA,QAC7C,CAAA,MAAO;AACL,UAAA,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,IAAA,EAAM,OAAO,KAAK,CAAA;AACxD,UAAA,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,GAAA,EAAK,OAAO,KAAK,CAAA;AAAA,QACxD;AAEA,QAAA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,GAAG,CAAA;AAC9E,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,KAAK,SAAA,EAAW,UAAA,CAAW,WAAW,CAAA;AAAA,MACjE;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,KAAA,EAAc,IAAA,EAAW,KAAA,EAAmB;AAC/D,IAAA,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA,SAAU,KAAA,CAAM,IAAA,CAAK,KAAK,YAAY,CAAA;AACpD,IAAA,OAAO,KAAA,CAAM,eAAA;AAAA,MACX,IAAIA,GAAAA,CAAI,KAAA,CAAM,cAAA,EAAgB,EAAE,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA;AAAA,MACrD,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,IAAA,EAAoB,IAAA,EAAc,OAAA,EAA0B;AAC5E,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,IAAA,EAAM,OAAO,KAAA;AACjC,IAAA,OAAO,OAAA,KAAY,CAAA,IAAK,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,OAAM,GAAI,CAAA,IAAK,CAAC,CAAA,GAAI,CAAA,KAAM,OAAA;AAAA,EACrE;AACF;;;AC7OO,IAAM,4BAAN,MAAgC;AAAA,EACrC,WAAA,CACmB,YAAA,EACA,QAAA,EACA,OAAA,EACA,QAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EAJgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0D;AAChE,IAAA,MAAM,aAAa,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,CAAA;AAC/E,IAAA,MAAM,aAAa,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,CAAA;AAC/E,IAAA,MAAM,gBACJ,OAAO,MAAA,CAAO,kBAAkB,QAAA,GAAW,MAAA,CAAO,gBAAgB,MAAA,CAAO,gBAAA;AAC3E,IAAA,MAAM,YAAY,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,EAAA;AAExE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAC5C,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,SAAA,EAAY,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAmB;AACvC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA,EAAG;AAC1D,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA;AAC/B,MAAA,IAAI,MAAA,GAAS,UAAA,IAAc,MAAA,GAAS,aAAA,EAAe;AAEnD,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,QAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzD,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,KAAK,CAAA;AACjD,QAAA,IAAI,SAAS,IAAA,EAAM;AACnB,QAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO;AACvE,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,EAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACjE,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,MAAM,YAA2C,EAAC;AAClD,IAAA,IAAI,SAAA,GAAY,IAAA;AAEhB,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,MAAA,EAAQ;AACjC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA;AACxC,MAAA,SAAA,GAAY,SAAA,CAAU,IAAI,MAAM,CAAA;AAChC,MAAA,IAAI,MAAA,CAAO,QAAO,IAAK,CAAC,QAAQ,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AAC/C,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,cAAA,EAAe,EAAG,CAAA;AAAA,IACtF;AAEA,IAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,SAAA,CAAU,gBAAe,EAAE;AAAA,EAC5D;AACF;;;ACpDA,SAASF,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AACA,SAASC,UAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAGO,SAAS,WAAA,CAAY,MAAmB,aAAA,EAAgC;AAC7E,EAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,aAAa,GAAG,OAAO,IAAA;AACjD,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,IAAA,IAAI,iBAAiB,KAAA,CAAM,IAAA,IAAQ,aAAA,IAAiB,KAAA,CAAM,IAAI,OAAO,IAAA;AAAA,EACvE;AACA,EAAA,OAAO,KAAA;AACT;AAMO,IAAM,OAAA,GAAN,MAAM,QAAA,CAAQ;AAAA,EACnB,WAAA,CACW,EAAA,EACA,IAAA,EACA,OAAA,EACA,MAAA,EACT;AAJS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACR;AAAA,EAJQ,EAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EAGX,OAAO,SAAS,IAAA,EAAwC;AACtD,IAAA,MAAM,SAAwB,EAAC;AAC/B,IAAA,QAAA,CAAQ,aAAA,CAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,EAAC,EAAG,EAAC,EAAG,QAAQ,IAAI,CAAA;AAC3F,IAAA,OAAO,IAAI,QAAA,CAAQA,SAAAA,CAAS,IAAA,CAAK,EAAE,KAAK,EAAA,EAAIA,SAAAA,CAAS,IAAA,CAAK,IAAI,KAAK,EAAA,EAAIA,SAAAA,CAAS,KAAK,OAAO,CAAA,IAAK,IAAI,MAAM,CAAA;AAAA,EAC7G;AAAA,EAEA,OAAe,aAAA,CACb,SAAA,EACA,OAAA,EACA,QACA,IAAA,EACM;AACN,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,IAAI,CAACD,SAAAA,CAAS,QAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,GAAA,GAAMC,SAAAA,CAAS,QAAA,CAAS,GAAG,CAAA,IAAK,EAAA;AAEtC,MAAA,MAAM,QAAA,GAAWA,SAAAA,CAAS,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,CAAS,WAAW,EAAC;AAEzE,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,QAAA,CAAQ,aAAA,CAAc,UAAU,CAAC,GAAG,SAAS,GAAG,CAAA,EAAG,QAAQ,QAAQ,CAAA;AACnE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAA8C,EAAC;AACrD,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,KAAA,MAAW,QAAA,IAAY,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,CAAS,QAAA,GAAW,EAAC,EAAG;AAChF,QAAA,IAAI,CAACD,SAAAA,CAAS,QAAQ,CAAA,EAAG;AACzB,QAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,YAAY,OAAO,QAAA,CAAS,OAAO,QAAA,EAAU;AACxE,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,CAAS,MAAM,EAAA,EAAI,QAAA,CAAS,IAAI,CAAA;AAAA,QACtD;AACA,QAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,GAAI,QAAA,CAAS,OAAA,GAAU,EAAC,EAAG;AAC5E,UAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QACrD;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAA;AAAA,QACA,KAAA,EAAOC,SAAAA,CAAS,QAAA,CAAS,KAAK,CAAA,IAAK,GAAA;AAAA,QACnC,IAAA,EAAM,QAAA;AAAA,QACN,MAAA;AAAA,QACA,OAAA;AAAA,QACA,cAAA,EAAgB,SAAS,cAAA,KAAmB,IAAA;AAAA,QAC5C,iBAAA,EAAmB,SAAS,iBAAA,KAAsB,IAAA;AAAA,QAClD;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,QAAQ,aAAA,EAA2C;AACjD,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,MAAA,EAAQ;AAC9B,MAAA,IAAI,WAAA,CAAY,IAAA,EAAM,aAAa,CAAA,EAAG,OAAO,IAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC7EO,IAAM,yBAAN,MAA6B;AAAA,EAClC,WAAA,CACmB,YAAA,EACA,QAAA,EACA,OAAA,EACA,QAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EAJgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0D;AAChE,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,IAAA,KAAS,WAAW,YAAA,CAAa,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAC9E,IAAA,MAAM,YAAY,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,EAAA;AAExE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAC5C,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,SAAA,EAAY,SAAS,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACzC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAmB;AACtC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAmB;AACvC,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,IAAA,IAAI,SAAA,GAAY,IAAA;AAEhB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,MAAA,IAAI,SAAS,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpD,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,QAAA,IAAI,YAAY,IAAA,EAAM;AAEtB,QAAA,IAAI,CAAC,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpC,UAAA,SAAA,GAAY,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAAI,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAC9F,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,CAAO,KAAA;AAC3B,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS,MAAA,CAAO,IAAI,GAAA,EAAA,CAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,aAC/E,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAChE,QAAA,eAAA,CAAgB,IAAI,GAAG,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,mBAAa,IAAI,GAAA,CAAY,CAAC,GAAG,MAAA,CAAO,IAAA,EAAK,EAAG,GAAG,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA;AACxE,IAAA,MAAM,WAA2D,EAAE,MAAA,EAAQ,EAAC,EAAG,oBAAA,EAAsB,EAAC,EAAE;AACxG,IAAA,MAAM,MAAA,GAAiC,EAAE,MAAA,EAAQ,IAAA,EAAM,sBAAsB,IAAA,EAAK;AAElF,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,MAAA,EAAQ;AACjC,MAAA,MAAM,OAAA,GAAmB,IAAA,CAAK,IAAA,KAAS,sBAAA,GAAyB,sBAAA,GAAyB,QAAA;AACzF,MAAA,IAAI,MAAA,GAAS,IAAA;AACb,MAAA,IAAI,OAAA,GAAU,KAAA;AAEd,MAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,QAAA,IAAI,CAAC,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA,EAAG;AAChC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AACpC,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AACtC,QAAA,MAAA,GACE,OAAA,KAAY,QAAA,GACR,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,GACjC,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,CAAE,SAAS,KAAK,CAAA;AACvC,QAAA,OAAA,GAAU,OAAA,IAAW,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA;AAAA,MACjD;AAEA,MAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,QAAA,MAAA,GAAS,MAAA,CAAO,IAAI,SAAS,CAAA;AAC7B,QAAA,OAAA,GAAU,OAAA,IAAW,CAAC,SAAA,CAAU,MAAA,EAAO;AAAA,MACzC;AAEA,MAAA,IAAI,MAAA,CAAO,MAAA,EAAO,IAAK,CAAC,OAAA,EAAS;AAEjC,MAAA,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA,CAAK,EAAE,KAAK,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,cAAA,IAAkB,CAAA;AAC5F,MAAA,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,OAAO,CAAA,CAAE,IAAI,MAAM,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,cAAA,EAAe;AAAA,MAC1C,sBAAsB,QAAA,CAAS,oBAAA;AAAA,MAC/B,yBAAA,EAA2B,MAAA,CAAO,oBAAA,CAAqB,cAAA;AAAe,KACxE;AAAA,EACF;AACF;AC9EA,IAAM,mBAAA,uBAA0B,GAAA,CAAI,CAAC,QAAQ,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,IAAI,CAAC,CAAA;AAQpE,IAAM,sBAAN,MAA0B;AAAA,EAC/B,YACmB,YAAA,EACA,QAAA,EACA,SACA,SAAA,EACA,QAAA,EACA,aACA,QAAA,EACjB;AAPiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EAPgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0D;AAChE,IAAA,MAAM,OAAO,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,IAAA,KAAS,WAAW,YAAA,CAAa,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAC9E,IAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,KAAK,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,GAAI,IAAA;AAE1F,IAAA,IAAA,CAAK,8BAA8B,IAAI,CAAA;AAEvC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAmB;AACtC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAmB;AACxC,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAA4B,KAAA,EAAe,MAAA,KAAwB;AAChF,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA,EAAG,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IACpF,CAAA;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,MAAA,IAAI,SAAS,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AAEpD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AAEpC,MAAA,IAAI,QAAA,CAAS,QAAO,EAAG;AAErB,QAAA,IAAI,YAAY,IAAA,IAAQ,KAAA,CAAM,SAAA,CAAU,IAAA,OAAW,IAAA,EAAM;AACzD,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,UAAA,IAAI,YAAY,IAAA,EAAM;AACtB,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,KAAK,CAAA;AACjD,UAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,CAAC,IAAA,CAAK,cAAA,EAAgB;AAE3C,UAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,SAAA,IAAa,OAAA,CAAQ,YAAY,SAAA,EAAW;AAC/D,YAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO;AACvE,YAAA,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAAA,UAClC,WAAW,OAAA,CAAQ,IAAA,KAAS,SAAA,IAAa,OAAA,CAAQ,YAAY,QAAA,EAAU;AACrE,YAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,OAAA,GAAU,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO;AACtE,YAAA,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAAA,UACpC;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,KAAM,IAAA,EAAM;AACrC,MAAA,MAAM,MAAA,GAAS,SAAS,UAAA,EAAW;AAEnC,MAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG;AAC7C,QAAA,MAAM,UAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,KAAK,SAAS,CAAA;AACzD,QAAA,IAAI,OAAA,KAAY,QAAS,OAAA,CAAQ,OAAA,KAAY,QAAQ,mBAAA,CAAoB,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA,EAAI;AAC9F,UAAA;AAAA,QACF;AACA,QAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,QAAQ,IAAA,CAAK,KAAA,EAAO,QAAQ,KAAK,CAAA;AAElE,QAAA,IAAI,OAAA,CAAQ,YAAY,SAAA,EAAW;AACjC,UAAA,KAAA,CAAM,SAAS,MAAA,GAAS,QAAA,EAAU,MAAA,GAAS,kBAAA,GAAqB,qBAAqB,MAAM,CAAA;AAAA,QAC7F,CAAA,MAAA,IAAW,OAAA,CAAQ,OAAA,KAAY,QAAA,EAAU;AACvC,UAAA,KAAA,CAAM,QAAA,EAAU,sBAAsB,MAAM,CAAA;AAAA,QAC9C,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,SAAA,EAAW;AACrC,UAAA,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,OAAO,GAAG,MAAM,CAAA;AAAA,QACpD,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,SAAA,EAAW;AACrC,UAAA,KAAA,CAAM,UAAU,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,OAAO,GAAG,MAAM,CAAA;AAAA,QACtD;AAAA,MAEF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,eAAA,CAAgB,MAAM,GAAG,QAAA,EAAU,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA,EAAE;AAAA,EAC1F;AAAA,EAEQ,8BAA8B,IAAA,EAAoB;AACxD,IAAA,MAAM,IAAI,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACtC,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA,MAAA,CAAQ,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,EAAA,CAAG,CAAA,EAAG,CAAC,CAAA,MAAA,CAAQ,CAAA;AAExC,IAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,WAAA,CAAY,GAAA,EAAI,EAAG;AAC/C,MAAA,MAAM,QAAA,GAAW,CAAC,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AACjF,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,MAAM,cAAA,GACJ,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,KAAM,OAAA,IAAW,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,KAAM,OAAA;AAC/E,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,mCAAA;AAAA,UACA,CAAA,iBAAA,EAAiB,UAAA,CAAW,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,MAAM,GAAG,CAAA,KAAA,EAAQ,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,mEAAA,CAAA;AAAA,UACnF,EAAE,UAAA,EAAY,UAAA,CAAW,IAAA;AAAK,SAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,SAAS,KAAA,EAA4B;AAC3C,IAAA,IAAI,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACvC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,MAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AACpC,MAAA,IAAI,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,MAAA,EAAQ;AAC9C,MAAA,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAAA,IAChF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,WAAW,KAAA,EAA6B;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAClD,IAAA,IACE,YAAY,IAAA,IACZ,OAAA,CAAQ,aACR,OAAA,CAAQ,YAAA,KAAiB,QACzB,OAAA,CAAQ,GAAA,KAAQ,QAChB,IAAA,CAAK,cAAA,CAAe,MAAM,SAAS,CAAA,IACnC,KAAK,cAAA,CAAe,OAAA,CAAQ,GAAG,CAAA,EAC/B;AACA,MAAA,OAAO,OAAA,CAAQ,YAAA;AAAA,IACjB;AACA,IAAA,OAAO,KAAA,CAAM,UAAU,IAAA,EAAK;AAAA,EAC9B;AAAA,EAEQ,eAAe,IAAA,EAA6B;AAClD,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxC,IAAA,OAAQ,UAAU,EAAA,IAAM,GAAA,IAAO,EAAA,IAAQ,KAAA,KAAU,KAAK,GAAA,IAAO,EAAA;AAAA,EAC/D;AAAA,EAEQ,YAAY,KAAA,EAA6D;AAC/E,IAAA,MAAM,UAAkD,EAAC;AAEzD,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,EAAI,EAAG;AACvC,MAAA,KAAA,MAAW,UAAA,IAAc,IAAA,CAAK,WAAA,EAAY,EAAG;AAC3C,QAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AAC1C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,aAAa,CAAA;AACnD,QAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,QAAO,EAAG;AAC5C,QAAA,MAAM,KAAA,GAAQ,IAAIC,GAAAA,CAAI,UAAA,CAAW,MAAM,cAAA,EAAgB,CAAA,CAAE,GAAA,CAAI,IAAIA,GAAAA,CAAI,IAAA,CAAK,KAAA,CAAM,cAAA,EAAgB,CAAC,CAAA;AACjG,QAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAM,UAAW,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,MACjE;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,OAAA;AAE/B,IAAA,MAAM,GAAA,GAAM,IAAIA,GAAAA,CAAI,CAAC,CAAA;AACrB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,CAAA;AACnE,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,QAAe,KAAA,EAAmB;AACrD,IAAA,IAAI,MAAM,EAAA,CAAG,CAAC,CAAA,EAAG,OAAO,OAAO,GAAA,EAAI;AACnC,IAAA,OAAO,KAAA,CAAM,eAAA,CAAgB,IAAIA,GAAAA,CAAI,OAAO,GAAA,EAAI,CAAE,cAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,EAAG,KAAK,YAAY,CAAA;AAAA,EACrG;AAAA,EAEQ,KAAA,CAAM,SAAyB,OAAA,EAA0B;AAC/D,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAO,KAAK,CAAA;AACjD,MAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA;AAAA,IACjC;AACA,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,EACjB;AAAA,EAEQ,gBAAgB,MAAA,EAAyE;AAC/F,IAAA,MAAM,SAAS,CAAC,GAAG,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAO,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,IAAI,CAAE,CAAA;AAC7E,IAAA,MAAM,OAAoD,EAAC;AAC3D,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAC/B,MAAA,IAAI,MAAA,CAAO,QAAO,EAAG;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,QAAA,EAAU,KAAA,EAAO,QAAQ,MAAA,CAAO,cAAA,IAAkB,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9LO,IAAM,0BAAN,MAA8B;AAAA,EACnC,YAA6B,MAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA0B;AAAA,EAA1B,MAAA;AAAA,EAE7B,QAAQ,MAAA,EAA6E;AACnF,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,IAAA,KAAS,WAAW,YAAA,CAAa,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AAE9E,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACnD,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,UAAA,CAAW,SAAA,CAAU,EAAE,UAAU,CAAA;AAClD,MAAA,OAAO,WAAW,CAAA,GAAI,MAAA,GAAS,EAAE,EAAA,CAAG,SAAA,CAAU,EAAE,EAAE,CAAA;AAAA,IACpD,CAAC,CAAA;AAED,IAAA,MAAM,OAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,SAAS,IAAA,IAAQ,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrD,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAO;AACzB,MAAA,GAAA,CAAI,uBAAA,GAA0B,KAAA,CAAM,yBAAA,CAA0B,IAAI,EAAE,MAAA,EAAO;AAC3E,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA,CAAM,WAAA,CAAY,IAAI,EAAE,MAAA,EAAO;AAC/C,MAAA,IAAI,MAAM,KAAA,KAAU,YAAA,EAAc,GAAA,CAAI,oBAAA,GAAuB,MAAM,eAAA,EAAgB;AACnF,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IACf;AACA,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,EACxB;AACF;ACfA,IAAM,cAAA,GAAiB,KAAA;AACvB,IAAM,cAAc,CAAC,WAAA,EAAa,MAAA,EAAQ,OAAA,EAAS,cAAc,QAAQ,CAAA;AAEzE,SAAS,aAAa,GAAA,EAAuD;AAC3E,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,IAAI,CAAC,CAAA;AACrF;AAOO,IAAM,uBAAA,GAAN,MAAM,wBAAA,CAAwB;AAAA,EACnC,WAAA,CACmB,UACA,UAAA,EACA,YAAA,EACA,SACA,QAAA,EACA,QAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACjB;AATiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAChB;AAAA,EATgB,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0D;AAChE,IAAA,MAAM,aAAa,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,IAAA;AAC/E,IAAA,MAAM,OAAA,GAAU,UAAA,KAAe,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAI,GAAI,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA;AAEhG,IAAA,MAAM,OAAA,GAAqC;AAAA,MACzC,OAAA,EAAS,QAAQ,GAAA,CAAI,CAAC,UAAU,wBAAA,CAAwB,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,MAC1E,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,OAAA,KAAY,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,MAC7E,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,OAAA,KAAY,YAAA,CAAa,OAAA,CAAQ,MAAA,EAAQ,CAAC;AAAA,KAC/E;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,EAAI,CAAE,SAAS,CAAA,EAAG;AAClC,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,EAAI,CAAE,IAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,IAC1E;AACA,IAAA,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,EAAI,CAAE,IAAI,CAAC,MAAA,KAAW,MAAA,CAAO,MAAA,EAAQ,CAAA;AAEnE,IAAA,MAAM,gBAAwC,EAAC;AAC/C,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,aAAA,CAAc,GAAG,CAAC,CAAA;AAClD,MAAA,aAAA,CAAc,IAAI,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAA,KAAU,KAAA,CAAM,aAAa,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,QACR,aAAA,EAAe,cAAA;AAAA,QACf,QAAA,EAAU,KAAK,QAAA,CAAS,KAAA;AAAA,QACxB,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,YAAA,EAAc,KAAK,YAAA,CAAa,IAAA;AAAA,QAChC,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,WAAA,EAAY;AAAA,QACzC,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,QAC5B;AAAA,OACF;AAAA,MACA,oBAAA,EAAsB,IAAA;AAAA,MACtB,YAAA,EAAc,KAAK,YAAA,EAAa;AAAA,MAChC,SAAS,EAAE,UAAA,EAAY,QAAQ,MAAA,EAAQ,QAAA,EAAU,kBAAkB,YAAA,EAAa;AAAA,MAChF,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AAAA,EAEA,OAAe,YAAY,KAAA,EAA8C;AACvE,IAAA,MAAM,IAAA,GAAO,MAAM,MAAA,EAAO;AAC1B,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAC;AACxD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA;AACf,MAAA,MAAM,WAAoC,EAAC;AAC3C,MAAA,KAAA,MAAW,SAAS,WAAA,EAAa,QAAA,CAAS,KAAK,CAAA,GAAI,OAAO,KAAK,CAAA;AAC/D,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,YAAA,GAAuF;AAC7F,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,SAAS,iCAAA,EAAkC;AAAA,QACvE,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,SAAA,EAAW,SAAS,iDAAA,EAA4C;AAAA,QAChG,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,SAAS,oCAAA,EAAqC;AAAA,QAChF,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,SAAS,0BAAA,EAA2B;AAAA,QACvE,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,WAAA,EAAa,SAAS,qBAAA,EAAsB;AAAA,QACxE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,SAAS,4BAAA,EAA0B;AAAA,QACxE,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,SAAS,yBAAA,EAA0B;AAAA,QACtE,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,SAAS,cAAA,EAAe;AAAA,QACxD,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,SAAS,2DAAA,EAA4D;AAAA,QACrG,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,SAAS,2CAAA,EAAyC;AAAA,QACzF,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,WAAA,EAAa,SAAS,+BAAA;AAAgC,OACpF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,SAAS,8CAAA,EAA4C;AAAA,QACvF,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,SAAS,kBAAA,EAAmB;AAAA,QAC5D,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,SAAS,wCAAA,EAAyC;AAAA,QAClF,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,aAAA,EAAe,SAAS,2CAAA;AAAuC,OAC1F;AAAA,MACA,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,QAAA,EAAU,SAAS,aAAA,EAAc;AAAA,QAChE,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,MAAA,EAAQ,SAAS,YAAA;AAAa,OAC7D;AAAA,MACA,QAAA,EAAU;AAAA,QACR,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,WAAA,EAAa,SAAS,uBAAA,EAAqB;AAAA,QAC/D,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,SAAS,oBAAA,EAAkB;AAAA,QAC5D,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,SAAS,2CAAA,EAAuC;AAAA,QAClF,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,SAAS,8CAAA;AAA4C;AAC1F,KACF;AAAA,EACF;AACF;;;AClHA,IAAM,+BAAe,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAElD,SAAS,KAAK,KAAA,EAAuB;AACnC,EAAA,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACtC;AACA,SAAS,QAAQ,IAAA,EAAgC;AAC/C,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,EAAQ,IAAA;AAC1B,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,IAAA;AAC3C;AAOO,IAAM,wBAAN,MAA4B;AAAA,EACjC,WAAA,CACmB,OAAA,EACA,QAAA,EACA,QAAA,EACA,UACA,QAAA,EACjB;AALiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EALgB,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EAGnB,QAAQ,MAAA,EAA0D;AAChE,IAAA,MAAM,OAAO,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,SAAA;AAC7D,IAAA,MAAM,IAAA,GACJ,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,WAAA,EAAY,GAAI,IAAA,KAAS,UAAA,GAAa,IAAA,CAAK,WAAA,EAAY,GAAI,IAAA,CAAK,UAAU,MAAM,CAAA;AAC7G,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,KAAK,MAAA,EAAO;AAAA,EAC7C;AAAA,EAEQ,UAAU,MAAA,EAAiE;AACjF,IAAA,MAAM,aAAa,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,IAAA;AAC/E,IAAA,MAAM,aAAa,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,CAAA;AAC/E,IAAA,MAAM,gBAAgB,OAAO,MAAA,CAAO,kBAAkB,QAAA,GAAW,MAAA,CAAO,gBAAgB,MAAA,CAAO,gBAAA;AAE/F,IAAA,MAAM,OAAA,GAAU,UAAA,KAAe,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAI,GAAI,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA;AAChG,IAAA,MAAM,OAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,MAAA;AAC/B,MAAA,IAAI,MAAA,GAAS,UAAA,IAAc,MAAA,GAAS,aAAA,EAAe;AACnD,MAAA,IAAA,CAAK,IAAA,CAAK,GAAG,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,WAAW,KAAA,EAAqD;AACtE,IAAA,IAAI,IAAA,GAAyB,IAAA;AAC7B,IAAA,MAAM,cAA2B,EAAC;AAClC,IAAA,MAAM,WAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,EAAG;AAChC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,KAAK,SAAS,CAAA;AACjD,MAAA,MAAM,SAAA,GACJ,OAAA,EAAS,OAAA,IAAW,IAAA,IAAQ,YAAA,CAAa,IAAI,OAAA,CAAQ,OAAO,CAAA,IAAK,IAAA,CAAK,MAAA,KAAW,IAAA;AACnF,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,IAAA,EAAM;AACzC,QAAA,IAAA,GAAO,IAAA;AACP,QAAA;AAAA,MACF;AACA,MAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,SAAS,IAAA,IAAQ,WAAA,CAAY,MAAA,KAAW,CAAA,SAAU,EAAC;AAEvD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAClD,IAAA,MAAM,OAAuC,EAAC;AAE9C,IAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,MAAA,IAAI,QAAQ,MAAA,CAAO,KAAA;AACnB,MAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,MAAA,MAAM,UAAA,GAAa,QAAQ,MAAM,CAAA;AACjC,MAAA,IAAI,eAAe,IAAA,EAAM;AACvB,QAAA,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA;AAC3C,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,KAAM,UAAA,UAAoB,KAAA,CAAM,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,QACtE;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,MAAA,EAAQ,KAAA,CAAM,GAAA,EAAI,CAAE,cAAA,EAAe;AAAA,QACnC,WAAA,EAAa,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,GAAA,GAAM,GAAA;AAAA,QAC3C,OAAA,EAAS,KAAK,OAAA,CAAQ,KAAA;AAAA,QACtB,aAAA,EAAe,OAAO,OAAA,CAAQ,KAAA;AAAA,QAC9B,KAAA;AAAA,QACA,cAAA,EAAgB,OAAA,KAAY,IAAA,GAAO,EAAA,GAAK,OAAA,CAAQ,aAAA;AAAA,QAChD,MAAM,CAAA,EAAG,IAAA,CAAK,MAAM,SAAA,CAAU,KAAA,EAAO,CAAC,CAAA,EAAG,KAAK,MAAA,CAAO,KAAA,CAAM,UAAU,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA,QACvF,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,QACjB,SAAA,EAAW,MAAM,WAAA;AAAY,OAC9B,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,WAAA,GAA8C;AACpD,IAAA,OAAO,KAAK,QAAA,CAAS,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,MAC3C,MAAA,EAAQ,QAAQ,MAAA,CAAO,KAAA;AAAA,MACvB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ;AAAA,KAChB,CAAE,CAAA;AAAA,EACJ;AAAA,EAEQ,WAAA,GAA8C;AACpD,IAAA,OAAO,IAAA,CAAK,SAAS,GAAA,EAAI,CAAE,IAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAAA,EAC9D;AACF;;;ACpHA,SAASF,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EACV,OAAA,uBAAc,GAAA,EAAqB;AAAA,EAEpD,OAAO,KAAA,GAAyB;AAC9B,IAAA,OAAO,IAAI,gBAAA,EAAgB;AAAA,EAC7B;AAAA,EAEA,OAAO,gBAAgB,GAAA,EAAiC;AACtD,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,EAAgB;AACrC,IAAA,KAAA,MAAW,eAAe,GAAA,EAAK;AAC7B,MAAA,IAAIA,SAAAA,CAAS,WAAW,CAAA,EAAG,QAAA,CAAS,IAAI,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAC,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,IAAI,OAAA,EAAwB;AAC1B,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,KAAK,EAAA,EAA4B;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA;AAAA,EACjC;AACF;;;ACvBA,SAASA,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACmB,UACA,QAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAChB;AAAA,EAFgB,QAAA;AAAA,EACA,QAAA;AAAA,EAGnB,OAAO,KAAA,EAAyD;AAC9D,IAAA,MAAM,OAAOA,SAAAA,CAAS,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA,CAAM,UAAU,EAAC;AACxD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AACrC,IAAA,MAAM,cAA8D,EAAC;AAErE,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzD,MAAA,MAAM,UAAU,OAAA,CAAQ,MAAA,CACrB,MAAA,CAAO,CAAC,SAAS,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA,CACxD,IAAI,CAAC,IAAA,KAAS,KAAK,GAAG,CAAA;AAEzB,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,mBAAA;AAAA,UACA,CAAA,MAAA,EAAS,QAAQ,MAAA,CAAO,KAAK,oCAAiC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAChF,EAAE,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,WAAW,OAAA;AAAQ,SACtD;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,QAAA,WAAA,CAAY,IAAA,CAAK,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAO,KAAA,EAAO,UAAA,EAAY,eAAe,CAAA;AAAA,MAC/E;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AAEzB,IAAA,OAAO,EAAE,UAAU,IAAA,EAAM,EAAA,EAAI,QAAQ,EAAA,EAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,WAAA,EAAY;AAAA,EAC3E;AAAA,EAEQ,iBAAiB,IAAA,EAAc;AACrC,IAAA,OAAO,KAAK,QAAA,CAAS,GAAA,EAAI,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY;AAC7C,MAAA,IAAI,IAAA,KAAS,eAAA,EAAiB,OAAO,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AACnE,MAAA,IAAI,SAAS,kBAAA,EAAoB,OAAO,CAAC,iBAAA,CAAkB,QAAQ,IAAI,CAAA;AACvE,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACF;;;AC/CO,IAAM,UAAN,MAAc;AAAA,EACnB,WAAA,CACW,IAAA,EACA,QAAA,EACA,OAAA,GAAyB,IAAA,EAClC;AAHS,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACR;AAAA,EAHQ,IAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EAGX,WAAW,IAAA,EAAoC;AAC7C,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,OAAA;AAAA,IACvC;AACA,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,4BAAA;AAAA,MACA,CAAA,mBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,eAAA,EAAkB,KAAK,GAAG,CAAA,wBAAA,CAAA;AAAA,MACtD,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAK,GAAA;AAAI,KACpC;AAAA,EACF;AACF;;;AClBO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,WAAA,CACW,SAAA,EACA,OAAA,EACA,IAAA,EACA,UAAA,EACA,YAAA,EACA,SAAA,GAAoB,UAAA,EACpB,eAAA,GAAiC,IAAA,EACjC,iBAAA,GAAmC,IAAA,EACnC,mBAAkC,IAAA,EAC3C;AATS,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAAA,EACR;AAAA,EATQ,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EAGX,WAAW,IAAA,EAA6B;AACtC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,SAAS,GAAG,OAAO,KAAA;AAC1C,IAAA,OAAO,KAAK,OAAA,KAAY,IAAA,IAAQ,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EAC5D;AACF;;;ACnBA,SAASC,UAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAGO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAAgB;AAAA,EACnB,YAA6B,KAAA,EAAqC;AAArC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAAsC;AAAA,EAAtC,KAAA;AAAA,EAErC,OAAO,KAAA,GAAyB;AAC9B,IAAA,OAAO,IAAI,gBAAA,iBAAgB,IAAI,GAAA,EAAK,CAAA;AAAA,EACtC;AAAA,EAEA,OAAO,SAAS,IAAA,EAAuD;AACrE,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AAEvC,IAAA,KAAA,MAAW,YAAY,IAAA,EAAM;AAC3B,MAAA,MAAM,IAAA,GAAOA,SAAAA,CAAS,QAAA,CAAS,IAAI,CAAA,IAAK,EAAA;AACxC,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,GAAI,QAAA,CAAS,WAAW,EAAC;AAC5E,MAAA,MAAM,WAA6B,EAAC;AAEpC,MAAA,KAAA,MAAW,eAAe,WAAA,EAAa;AACrC,QAAA,IAAI,WAAA,KAAgB,IAAA,IAAQ,OAAO,WAAA,KAAgB,QAAA,EAAU;AAC7D,QAAA,MAAM,CAAA,GAAI,WAAA;AACV,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,IAAI,cAAA;AAAA,YACF,aAAa,EAAA,CAAGA,SAAAA,CAAS,CAAA,CAAE,SAAS,KAAK,EAAE,CAAA;AAAA,YAC3C,OAAO,EAAE,OAAA,KAAY,QAAA,GAAW,aAAa,EAAA,CAAG,CAAA,CAAE,OAAO,CAAA,GAAI,IAAA;AAAA,YAC7DA,SAAAA,CAAS,CAAA,CAAE,IAAI,CAAA,IAAK,GAAA;AAAA,YACpBA,SAAAA,CAAS,CAAA,CAAE,UAAU,CAAA,IAAK,EAAA;AAAA,YAC1BA,SAAAA,CAAS,EAAE,YAAY,CAAA;AAAA,YACvBA,SAAAA,CAAS,CAAA,CAAE,SAAS,CAAA,IAAK,UAAA;AAAA,YACzBA,SAAAA,CAAS,EAAE,eAAe,CAAA;AAAA,YAC1BA,SAAAA,CAAS,EAAE,iBAAiB,CAAA;AAAA,YAC5BA,SAAAA,CAAS,EAAE,gBAAgB;AAAA;AAC7B,SACF;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,IAAI,OAAA,CAAQ,IAAA,EAAM,UAAUA,SAAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAC,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,IAAI,iBAAgB,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,WAAA,GAAgC;AAC9B,IAAA,MAAM,WAA6B,EAAC;AACpC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,IAAA,CAAK,GAAG,IAAA,CAAK,QAAQ,CAAA;AACtE,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,WAAW,IAAA,EAA6B;AACtC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,GAAG,OAAA,IAAW,IAAA;AAAA,EAC1C;AAAA,EAEA,IAAI,IAAA,EAAuB;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,YAAY,mBAAA,EAAqB,CAAA,oBAAA,EAAoB,IAAI,CAAA,qBAAA,CAAA,EAAyB,EAAE,MAAM,CAAA;AAAA,IACtG;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,UAAA,CAAW,MAAc,IAAA,EAAoC;AAC3D,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CAAE,WAAW,IAAI,CAAA;AAAA,EACvC;AACF;;;AC1DO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EACd,WAAA,CACW,MAAA,EACT,aAAA,EACS,MAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACT,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACS,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA,EAHgB,MAAA;AAAA,EACT,aAAA;AAAA,EACS,MAAA;AAAA,EAGnB,OAAO,SAAS,IAAA,EAA2C;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,KAAmB,MAAA,GAAS,MAAA,GAAS,SAAA;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,KAAc,SAAA,GAAY,SAAA,GAAY,WAAA;AAE1D,IAAA,MAAM,WAAsB,EAAC;AAC7B,IAAA,MAAM,aAAA,GAAgB,KAAK,aAAA,IAAiB,KAAA;AAC5C,IAAA,IAAI,OAAO,kBAAkB,SAAA,EAAW;AACtC,MAAA,IAAI,aAAA,EAAe,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAW,YAAA,CAAa,EAAA,CAAG,YAAY,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,IAC5F,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AACvC,MAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,QAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAO,OAAA,KAAY,QAAA,EAAU;AACrD,QAAA,MAAM,CAAA,GAAI,OAAA;AACV,QAAA,IAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU;AACrC,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAW,YAAA,CAAa,EAAA,CAAG,CAAA,CAAE,SAAS,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,KAAU,IAAA,EAAM,CAAA;AAAA,MACpF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,WAAA,CAAW,MAAA,EAAQ,YAAW,MAAA,CAAO,QAAQ,GAAG,MAAM,CAAA;AAAA,EACnE;AAAA,EAEA,OAAO,OAAA,GAAsB;AAC3B,IAAA,OAAO,IAAI,WAAA,CAAW,SAAA,EAAW,IAAI,WAAW,CAAA;AAAA,EAClD;AAAA,EAEA,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,MAAA,KAAW,MAAA;AAAA,EACzB;AAAA,EAEA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,gBAAgB,IAAA,EAA6B;AAC3C,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,aAAA,EAAe;AACxC,MAAA,IAAI,OAAA,CAAQ,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,EAAG;AACrC,MAAA,KAAA,GAAQ,OAAA,CAAQ,KAAA;AAAA,IAClB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,gBAAA,CAAiB,WAAyB,KAAA,EAAsB;AAC9D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,CAAC,OAAA,KAAY,CAAC,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,SAAS,CAAC,CAAA;AAC5F,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAClC,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAAA,EACjD;AAAA,EAEA,OAAe,OAAO,QAAA,EAAgC;AACpD,IAAA,OAAO,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,SAAA,CAAU,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,EACxE;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,gBAAgB,IAAA,CAAK,MAAA;AAAA,MACrB,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,aAAA,EAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,CAAC,OAAA,MAAa;AAAA,QAClD,SAAA,EAAW,QAAQ,SAAA,CAAU,GAAA;AAAA,QAC7B,OAAO,OAAA,CAAQ;AAAA,OACjB,CAAE;AAAA,KACJ;AAAA,EACF;AACF;ACzEA,SAASD,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AACA,SAASC,UAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAcO,IAAM,aAAN,MAAiB;AAAA,EACtB,WAAA,CACmB,YAAA,EACA,QAAA,EACA,YAAA,EACA,OAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAJgB,YAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EAGnB,OAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,cAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,OAAO,KAAA,EAAyD;AAE9D,IAAA,MAAM,IAAA,GACJ,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,GACzB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA,GAChC,IAAA,CAAK,SAAA,CAAU,MAAM,IAAI,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,KAAc,OAAA,GAAU,OAAA,GAAU,QAAA;AAC1D,IAAA,MAAM,WAAA,GAAcA,SAAAA,CAAS,KAAA,CAAM,OAAO,CAAA;AAE1C,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,GAAI,KAAA,CAAM,WAAW,EAAC;AACnE,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,WAAA,CAAY,uBAAA,EAAyB,iCAAiC,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,QAAA,GAAsB,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY;AACpD,MAAA,IAAI,CAACD,SAAAA,CAAS,OAAO,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,mCAAmC,CAAA;AAAA,MACrF;AACA,MAAA,MAAM,IAAA,GAAOC,SAAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,IAAK,WAAA;AAC1C,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,yDAAsD,CAAA;AAAA,MACnG;AACA,MAAA,OAAO,EAAE,OAAA,EAASA,SAAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,IAAK,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,KAAK,GAAG,IAAA,EAAK;AAAA,IACjG,CAAC,CAAA;AAGD,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,IAAI,CAAA;AAExD,IAAA,MAAM,QAAA,uBAAe,GAAA,EAA4B;AACjD,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAmB;AACrC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAI,GAAG,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,KAAK,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAC/F,MAAA,KAAA,CAAM,IAAI,IAAA,CAAK,IAAA,EAAA,CAAO,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,KAAK,YAAY,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IAC9F;AAEA,IAAA,IAAI,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AAC3C,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,SAAA,KAAc,QAAA,GAAW,QAAA,GAAW,OAAA;AAEpD,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,IAAI,CAAA,EAAG;AAC3C,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UAChC,SAAS,IAAA,CAAK,OAAA;AAAA,UACd,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,UACzB,MAAA,EAAQ;AAAA,SACV,CAAE,CAAA;AAAA,QACF,UAAU,EAAC;AAAA,QACX,UAAA,EAAY,SAAS,MAAA;AAAO,OAC9B;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7C,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAG,UAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,CAAG,UAAA;AAC5B,MAAA,OAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,CAAA,GAAI,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,MAAM,WAA2C,EAAC;AAClD,IAAA,IAAI,UAAA,GAAa,QAAA;AACjB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAqC;AAE1D,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC3B,MAAA,MAAM,MAAM,KAAA,CAAM,eAAA;AAAA,QAChB,IAAIC,GAAAA,CAAI,IAAA,CAAK,cAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAAA,QAC1D,IAAA,CAAK;AAAA,OACP;AAEA,MAAA,IAAI,OAAA,CAAQ,cAAc,wBAAA,EAA0B;AAClD,QAAA,QAAA,CAAS,GAAA,CAAI,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,EAAS,OAAA,CAAQ,YAAA,EAAc,IAAI,CAAC,CAAA;AACtE,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,cAAc,gBAAA,EAAkB;AAC1C,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,SAAS,OAAA,CAAQ,UAAA;AAAA,UACjB,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,IAAI,MAAA,EAAO;AAAA,UAClB,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,EAAS,OAAA,CAAQ,cAAc,IAAI;AAAA,SAC3D,CAAA;AACD,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,OAAA,EAAS,OAAA,CAAQ,eAAA,IAAmB,OAAA,CAAQ,UAAA;AAAA,UAC5C,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,IAAI,MAAA,EAAO;AAAA,UAClB,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,EAAS,OAAA,CAAQ,mBAAmB,IAAI;AAAA,SAChE,CAAA;AACD,QAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,YAAA,EAAc,IAAI,CAAC,CAAA;AAAA,MACpG,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,SAAS,OAAA,CAAQ,UAAA;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,IAAI,MAAA,EAAO;AAAA,UAClB,QAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,EAAS,OAAA,CAAQ,cAAc,IAAI;AAAA,SAC3D,CAAA;AACD,QAAA,QAAA,CAAS,GAAA,CAAI,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,OAAA,EAAS,OAAA,CAAQ,YAAA,EAAc,IAAI,CAAC,CAAA;AACtE,QAAA,UAAA,GAAa,UAAA,CAAW,IAAI,GAAG,CAAA;AAAA,MACjC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAChC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO;AAAA,QACzB,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,IAAK;AAAA,OACrC,CAAE,CAAA;AAAA,MACF,QAAA;AAAA,MACA,UAAA,EAAY,WAAW,MAAA;AAAO,KAChC;AAAA,EACF;AAAA,EAEA,WAAW,KAAA,EAA4C;AACrD,IAAA,MAAM,gBAAgB,KAAA,CAAM,aAAA;AAC5B,IAAA,IAAI,CAACF,SAAAA,CAAS,aAAa,KAAK,OAAO,aAAA,CAAc,cAAc,QAAA,EAAU;AAC3E,MAAA,MAAM,IAAI,WAAA,CAAY,gCAAA,EAAkC,+CAA+C,CAAA;AAAA,IACzG;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,SAAS,CAAA;AAExD,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG;AACtC,MAAA,IAAI,KAAA,CAAM,aAAY,IAAK,CAAC,MAAM,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/D,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,gCAAA;AAAA,UACA,CAAA,YAAA,EAAe,SAAA,CAAU,GAAG,CAAA,kDAAA,EAAkD,MAAM,cAAc,CAAA,CAAA,CAAA;AAAA,UAClG,EAAE,SAAA,EAAW,SAAA,CAAU,GAAA,EAAK,cAAA,EAAgB,MAAM,cAAA;AAAe,SACnE;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,SAAA,EAAW,aAAA,CAAc,UAAU,IAAI,CAAA;AAC1E,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEQ,GAAA,CACN,IAAA,EACA,OAAA,EACA,YAAA,EACA,IAAA,EACyB;AACzB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,cAAA,EAAgB,QAAQ,SAAA,CAAU,GAAA;AAAA,MAClC,YAAA;AAAA,MACA,SAAA,EAAW,KAAK,MAAA;AAAO,KACzB;AAAA,EACF;AAAA,EAEQ,UAAU,IAAA,EAA6B;AAC7C,IAAA,IAAI;AACF,MAAA,OAAO,aAAa,EAAA,CAAG,OAAO,IAAA,KAAS,QAAA,GAAW,OAAO,EAAE,CAAA;AAAA,IAC7D,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,WAAA,CAAY,4BAAA,EAA8B,mCAAgC,CAAA;AAAA,MACtF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,WAAW,GAAA,EAAqB;AACtC,IAAA,MAAM,SAASA,SAAAA,CAAS,GAAG,IAAIC,SAAAA,CAAS,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA;AACtD,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,4BAA4B,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI;AACF,MAAA,OAAO,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,WAAA,CAAY,wBAAA,EAA0B,CAAA,sBAAA,EAAsB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,MACjF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;;;ACtLO,IAAM,MAAA,GAAN,MAAM,OAAA,CAAO;AAAA,EAClB,YACW,EAAA,EACA,IAAA,EACA,cACA,QAAA,EACA,WAAA,EACA,UACA,OAAA,EACA,SAAA,EACA,QACA,QAAA,EACA,KAAA,EACA,QACA,GAAA,EACA,YAAA,EACA,SACA,cAAA,EACA,QAAA,EACA,OACA,GAAA,EACT;AAnBS,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EACR;AAAA,EAnBQ,EAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EAGX,OAAO,QAAA,CACL,IAAA,EACA,YAAA,EACA,KAAA,GAAe,IAAI,WAAA,EAAY,EAC/B,GAAA,EACA,UAAA,GAAgC,iBAAA,CAAkB,KAAA,IAClD,QAAA,GAA4B,eAAA,CAAgB,KAAA,EAAM,EAClD,UAAA,GAAyB,UAAA,CAAW,SAAQ,EAC5C,QAAA,GAA4B,eAAA,CAAgB,KAAA,EAAM,EAC1C;AACR,IAAA,MAAM,KAAA,GAAQ,GAAA,IAAO,IAAI,iBAAA,CAAkB,KAAK,CAAA;AAEhD,IAAA,MAAM,QAAA,GAAW,IAAI,yBAAA,EAA0B;AAC/C,IAAA,MAAM,WAAA,GAAc,IAAI,4BAAA,EAA6B;AACrD,IAAA,MAAM,QAAA,GAAW,IAAI,yBAAA,EAA0B;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAI,yBAAA,EAA0B;AAC9C,IAAA,MAAM,SAAA,GAAY,IAAI,0BAAA,EAA2B;AACjD,IAAA,MAAM,MAAA,GAAS,IAAI,uBAAA,EAAwB;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAI,yBAAA,EAA0B;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAI,kBAAA,EAAmB;AAErC,IAAA,MAAM,SAAS,IAAI,MAAA;AAAA,MACjB,YAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,MAAM,IAAI,UAAA,CAAW,YAAA,EAAc,QAAA,EAAU,YAAY,OAAO,CAAA;AACtE,IAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,YAAA,EAAc,QAAQ,WAAA,EAAa,QAAA,EAAU,QAAQ,KAAK,CAAA;AAChG,IAAA,MAAM,UAAU,IAAI,cAAA,CAAe,YAAA,EAAc,QAAA,EAAU,SAAS,KAAK,CAAA;AACzE,IAAA,MAAM,iBAAiB,IAAI,cAAA,CAAe,QAAA,EAAU,KAAA,EAAO,OAAO,KAAK,CAAA;AAEvE,IAAA,OAAO,IAAI,OAAA;AAAA,MACT,MAAM,IAAA,EAAK;AAAA,MACX,IAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;ACnHA,SAASD,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AACA,SAASC,UAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAMO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,MAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAiB;AAAA,EAAjB,MAAA;AAAA,EAE7B,KAAK,KAAA,EAAyD;AAC5D,IAAA,MAAM,cAAcD,SAAAA,CAAS,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA,CAAM,UAAU,EAAC;AAC/D,IAAA,MAAM,aAAA,GAAgBC,SAAAA,CAAS,WAAA,CAAY,aAAa,CAAA,IAAK,EAAA;AAE7D,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,aAAa,EAAA,CAAGA,SAAAA,CAAS,WAAA,CAAY,WAAW,KAAK,EAAE,CAAA;AAAA,IACvE,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,IAAI,WAAA,CAAY,oBAAA,EAAsB,yCAAyC,CAAA;AAAA,MACvF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,IAAI,SAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,WAAA,CAAY,SAAA,KAAc,MAAA,IAAa,WAAA,CAAY,cAAc,IAAA,EAAM;AACzE,MAAA,SAAA,GAAY,KAAK,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,CAAE,EAAA;AAAA,IACxE;AAEA,IAAA,MAAM,IAAA,GAAO,CAAC,KAAA,KACZ,OAAO,UAAU,QAAA,GAAW,YAAA,CAAa,EAAA,CAAG,KAAK,CAAA,GAAI,IAAA;AACvD,IAAA,MAAM,gBAAgBD,SAAAA,CAAS,WAAA,CAAY,aAAa,CAAA,GAAI,WAAA,CAAY,gBAAgB,EAAC;AAEzF,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,MAC1B,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAK;AAAA,MACzB,aAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA,EAAK,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAAA,MACzB,SAAA,EAAW,YAAY,SAAA,KAAc,IAAA;AAAA,MACrC,cAAc,OAAO,WAAA,CAAY,YAAA,KAAiB,QAAA,GAAW,YAAY,YAAA,GAAe,IAAA;AAAA,MACxF,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,WAAW,CAAA;AAAA,MACzC,iBAAA,EAAmB,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AAAA,MAC1C,eAAA,EAAiB,IAAA,CAAK,aAAA,CAAc,EAAE,CAAA;AAAA,MACtC,IAAA,EAAMC,SAAAA,CAAS,WAAA,CAAY,IAAI,CAAA;AAAA,MAC/B,SAAA;AAAA,MACA,MAAA,EAAQA,SAAAA,CAAS,WAAA,CAAY,MAAM;AAAA,KACpC,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AAEhC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO;AAAA,MACvC,MAAM,WAAA,CAAY,GAAA;AAAA,MAClB,WAAA,EAAa,OAAA,CAAQ,OAAA,EAAQ,CAAE,GAAA;AAAA,MAC/B,OAAA,EAAS,MAAM,OAAA,IAAW,IAAA;AAAA,MAC1B,SAAA,EAAW,MAAM,SAAA,IAAa,QAAA;AAAA,MAC9B,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY;AAAC,KAC9B,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,KAAc,OAAA,GAAU,OAAA,GAAU,QAAA;AAC1D,IAAA,MAAM,cAAA,GAAiBA,SAAAA,CAAS,KAAA,CAAM,cAAc,CAAA,IAAK,EAAA;AACzD,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA,GAAI,SAAA,CAAU,WAAW,EAAC;AAC3E,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA,GAAI,SAAA,CAAU,WAAW,EAAC;AAE3E,IAAA,MAAM,KAAA,GAAwC;AAAA,MAC5C;AAAA,QACE,OAAA,EAAS,cAAA;AAAA,QACT,IAAA,EAAM,SAAA,KAAc,QAAA,GAAW,OAAA,GAAU,QAAA;AAAA,QACzC,OAAO,SAAA,CAAU;AAAA,OACnB;AAAA,MACA,GAAG,QAAA;AAAA,MACH,GAAG;AAAA,KACL;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK;AAAA,MACrC,KAAA,EAAO,MAAM,KAAA,IAAS,IAAA;AAAA,MACtB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,WAAA,CAAY,GAAA;AAAA,MAC1C,SAAA,EAAW,QAAQ,EAAA,CAAG,KAAA;AAAA,MACtB,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC9C,gBAAA,EAAkB,MAAA,CAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAY,CAAA;AAAA,MACnG,YAAY,SAAA,CAAU,UAAA;AAAA,MACtB,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,SAAA,EAAW,QAAQ,EAAA,CAAG;AAAA,KACxB;AAAA,EACF;AACF;;;AClFA,SAAS,UAAU,KAAA,EAAyC;AAC1D,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;AAOO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,MAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAiB;AAAA,EAAjB,MAAA;AAAA,EAE7B,OAAA,CAAQ,IAAY,KAAA,EAAyD;AAC3E,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA;AAE3B,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,WAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAAA,MACrC,KAAK,eAAA;AACH,QAAA,OAAO,UAAU,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MACpD,KAAK,aAAA;AACH,QAAA,OAAO,IAAI,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,MACvD,KAAK,MAAA,EAAQ;AACX,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAChC,QAAA,OAAO;AAAA,UACL,GAAG,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,UACzB,gBAAA,EAAkB,OAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC;AAAA,SACzE;AAAA,MACF;AAAA,MACA,KAAK,SAAA;AACH,QAAA,OAAO,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACxC,KAAK,QAAA;AACH,QAAA,OAAO,EAAE,SAAA,EAAW,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAC,CAAA,EAAE;AAAA,MAC1E,KAAK,UAAA;AACH,QAAA,OAAO,EAAE,cAAA,EAAgB,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAE;AAAA,MAClD,KAAK,SAAA;AACH,QAAA,OAAO,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MACxC,KAAK,aAAA;AACH,QAAA,OAAO,MAAA,CAAO,YAAY,KAAK,CAAA;AAAA,MACjC,KAAK,cAAA;AACH,QAAA,OAAO,MAAA,CAAO,aAAa,KAAK,CAAA;AAAA,MAClC,KAAK,iBAAA;AACH,QAAA,OAAO,EAAE,YAAY,MAAA,CAAO,eAAA,CAAgB,KAAK,CAAA,CAAE,IAAA,EAAM,QAAQ,QAAA,EAAS;AAAA,MAC5E,KAAK,eAAA;AACH,QAAA,OAAO,SAAA,CAAU,MAAA,CAAO,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,MAC9C,KAAK,kBAAA,EAAoB;AACvB,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,gBAAA,CAAiB,KAAK,CAAA;AAChD,QAAA,OAAO,EAAE,MAAM,UAAA,CAAW,IAAA,EAAM,aAAa,UAAA,CAAW,OAAA,GAAU,MAAA,EAAO;AAAA,MAC3E;AAAA,MACA,KAAK,aAAA;AACH,QAAA,OAAO,SAAA,CAAU,MAAA,CAAO,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,MAC5C,KAAK,uBAAA;AACH,QAAA,OAAO,EAAE,aAAA,EAAe,MAAA,CAAO,qBAAA,CAAsB,KAAK,CAAA,EAAE;AAAA,MAC9D,KAAK,eAAA;AACH,QAAA,OAAO,IAAI,eAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,KAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,MACrF,KAAK,eAAA;AACH,QAAA,OAAO,UAAU,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC3D,KAAK,eAAA;AACH,QAAA,OAAO,UAAU,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC3D,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC/C,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC/C,KAAK,iBAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvD,KAAK,qBAAA;AACH,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,mBAAA,CAAoB,KAAK,CAAA;AAAA,MACtD,KAAK,YAAA,EAAc;AACjB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,KAAK,CAAA;AACzC,QAAA,OAAO,EAAE,KAAA,EAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAO,EAAG,OAAA,EAAS,GAAA,CAAI,OAAA,EAAQ;AAAA,MAC3E;AAAA,MACA,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAClD,QAAA,OAAO,EAAE,OAAO,QAAA,CAAS,EAAA,CAAG,OAAO,MAAA,EAAQ,QAAA,CAAS,QAAO,EAAE;AAAA,MAC/D;AAAA,MACA;AACE,QAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,WAAA,EAAc,EAAE,CAAA,qBAAA,CAAuB,CAAA;AAAA;AACtF,EACF;AAAA,EAEA,OAAA,CAAQ,MAAc,MAAA,EAA0D;AAC9E,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,cAAA;AACH,QAAA,OAAO,IAAI,sBAAA,CAAuB,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,UAAU,MAAA,CAAO,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,MACxG,KAAK,WAAA;AACH,QAAA,OAAO,IAAI,mBAAA,CAAoB,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,UAAU,MAAA,CAAO,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,MAClG,KAAK,cAAA;AACH,QAAA,OAAO,IAAI,sBAAA,CAAuB,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,UAAU,MAAA,CAAO,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,MACxG,KAAK,UAAA;AACH,QAAA,OAAO,IAAI,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,MAC5D,KAAK,eAAA;AACH,QAAA,OAAO,IAAI,uBAAA,CAAwB,MAAA,CAAO,MAAM,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClE,KAAK,qBAAA;AACH,QAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,mBAAA,CAAoB,MAAM,CAAA;AAAA,MAClD,KAAK,aAAA;AACH,QAAA,OAAO,IAAI,qBAAA;AAAA,UACT,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,IAAI,cAAA;AAAe,SAC5B,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClB,KAAK,iBAAA;AACH,QAAA,OAAO,IAAI,yBAAA;AAAA,UACT,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO;AAAA,SACT,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClB,KAAK,cAAA;AACH,QAAA,OAAO,IAAI,sBAAA;AAAA,UACT,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO;AAAA,SACT,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClB,KAAK,WAAA;AACH,QAAA,OAAO,IAAI,mBAAA;AAAA,UACT,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO,SAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,IAAI,cAAA,EAAe;AAAA,UAC1B,MAAA,CAAO,IAAI,OAAA;AAAQ,SACrB,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClB,KAAK,iBAAA;AACH,QAAA,OAAO,IAAI,mBAAA;AAAA,UACT,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO,SAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,WAAA;AAAA,UACP,MAAA,CAAO;AAAA,SACT,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClB,KAAK,eAAA;AACH,QAAA,OAAO,IAAI,uBAAA;AAAA,UACT,MAAA,CAAO,EAAA;AAAA,UACP,MAAA,CAAO,IAAA;AAAA,UACP,MAAA,CAAO,YAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,KAAA;AAAA,UACP,MAAA,CAAO;AAAA,SACT,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClB,KAAK,aAAA;AACH,QAAA,OAAO,IAAI,qBAAA;AAAA,UACT,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,QAAA;AAAA,UACP,MAAA,CAAO,IAAI,cAAA;AAAe,SAC5B,CAAE,QAAQ,MAAM,CAAA;AAAA,MAClB;AACE,QAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,YAAA,EAAe,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAAA;AACzF,EACF;AACF;;;ACvKA,SAASD,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AACA,SAASC,UAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA;AAC7C;AAMO,IAAM,gBAAN,MAAoB;AAAA,EACzB,WAAA,CACmB,WAAA,EACA,KAAA,EACA,GAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAHgB,WAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EAGnB,OAAO,KAAA,EAAqF;AAC1F,IAAA,MAAM,SAAA,GAAYA,SAAAA,CAAS,KAAA,CAAM,OAAO,CAAA,IAAK,EAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,SAAS,CAAA;AACnD,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,QAAA,EAAW,SAAS,CAAA,qBAAA,CAAuB,CAAA;AAAA,IACxF;AAEA,IAAA,MAAM,KAAA,GAAQA,SAAAA,CAAS,OAAA,CAAQ,eAAe,CAAA,IAAK,EAAA;AACnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,kBAAA,EAAoB,KAAK,CAAA;AACnD,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,IAAI,WAAA,CAAY,mBAAA,EAAqB,CAAA,cAAA,EAAiB,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACxF;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,GAAI,OAAA,CAAQ,WAAW,EAAC;AAC1E,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,QAAA,GAAW,EAAC;AAC5F,IAAA,MAAM,cAAc,WAAA,CAAY,MAAA;AAAA,MAC9B,CAAC,SAA0CD,SAAAA,CAAS,IAAI,KAAK,WAAA,CAAY,QAAA,CAAS,KAAK,IAAI;AAAA,KAC7F;AAEA,IAAA,MAAM,WAAWA,SAAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,GAAI,OAAA,CAAQ,WAAW,EAAC;AAClE,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,QAAA,CAAS,QAAQ,CAAA;AAE/C,IAAA,MAAM,SAAS,MAAA,CAAO,QAAA;AAAA,MACpBC,SAAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,QAAA;AAAA,MACxB,SAAS,EAAA,CAAGA,SAAAA,CAAS,KAAA,CAAM,YAAY,KAAK,KAAK,CAAA;AAAA,MACjD,IAAA,CAAK,KAAA;AAAA,MACL,IAAA,CAAK,GAAA;AAAA,MACL,MAAA;AAAA,MACA,eAAA,CAAgB,SAAS,WAAW,CAAA;AAAA,MACpC;AAAA,KACF;AAEA,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,MAAW,WAAA,IAAe,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,QAAA,GAAW,EAAC,EAAG;AACzE,MAAA,IAAI,CAACD,SAAAA,CAAS,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AACzB,MAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA,QACd,IAAI,OAAA;AAAA,UACF,MAAA,CAAO,IAAI,IAAA,EAAK;AAAA,UAChB,cAAc,EAAA,CAAGC,SAAAA,CAAS,WAAA,CAAY,MAAM,KAAK,EAAE,CAAA;AAAA,UACnDA,SAAAA,CAAS,WAAA,CAAY,IAAI,CAAA,IAAK,EAAA;AAAA,UAC9B,IAAA;AAAA,UACAA,SAAAA,CAAS,YAAY,OAAO,CAAA;AAAA,UAC5B;AAAA;AACF,OACF;AACA,MAAA,YAAA,EAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,OAAO,KAAA,CAAM,eAAA,KAAoB,QAAA,GAAW,MAAM,eAAA,GAAkB,CAAA;AACjF,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,MAAM,IAAI,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACtC,MAAA,MAAA,CAAO,WAAA,CAAY,GAAA;AAAA,QACjB,WAAW,MAAA,CAAO,MAAA,CAAO,IAAI,IAAA,EAAK,EAAG,MAAM,YAAA,CAAa,EAAA,CAAG,CAAA,EAAG,CAAC,QAAQ,CAAA,EAAG,YAAA,CAAa,GAAG,CAAA,EAAG,CAAC,QAAQ,CAAC;AAAA,OACzG;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,EAAA,EAAI,OAAO,EAAA,CAAG,KAAA;AAAA,QACd,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAA,EAAS,EAAE,EAAA,EAAI,SAAA,EAAW,SAASA,SAAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,IAAK,EAAA,EAAG;AAAA,QACnE,YAAA;AAAA,QACA,cAAA,EAAgB,WAAW,cAAA;AAAe;AAC5C,KACF;AAAA,EACF;AAAA,EAEQ,QAAA,CAAS,QAAgB,EAAA,EAA4C;AAC3E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA,GAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,GAAkB,EAAC;AAClG,IAAA,KAAA,MAAW,aAAa,IAAA,EAAM;AAC5B,MAAA,IAAID,UAAS,SAAS,CAAA,IAAK,SAAA,CAAU,EAAA,KAAO,IAAI,OAAO,SAAA;AAAA,IACzD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF","file":"index.js","sourcesContent":["/** Fachlich ungültiger Wert (Betrag, Gewicht, Code, UUID …). */\nexport class InvalidValue extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidValue';\n }\n}\n\n/** Verschiedene Währungen lassen sich nicht verrechnen. */\nexport class CurrencyMismatch extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CurrencyMismatch';\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Währung nach ISO 4217 mit fester Nachkommastellen-Skala\n * (datenformat.md: \"feste Nachkommastellen je Währung\").\n *\n * Skalen abweichend vom Default 2 — bewusst klein, v1 ist EUR-zentriert,\n * Fremdwährung kommt erst in v2.\n */\nconst SCALES: Readonly<Record<string, number>> = {\n JPY: 0,\n KRW: 0,\n BHD: 3,\n KWD: 3,\n TND: 3,\n};\n\nexport class Currency {\n private constructor(\n readonly code: string,\n readonly scale: number,\n ) {}\n\n static of(code: string): Currency {\n if (!/^[A-Z]{3}$/.test(code)) {\n throw new InvalidValue(`Ungültiger ISO-4217-Code: \"${code}\"`);\n }\n return new Currency(code, SCALES[code] ?? 2);\n }\n\n equals(other: Currency): boolean {\n return this.code === other.code;\n }\n\n toJSON(): string {\n return this.code;\n }\n\n toString(): string {\n return this.code;\n }\n}\n","import Big from 'big.js';\nimport { Currency } from './currency.js';\nimport { CurrencyMismatch, InvalidValue } from './errors.js';\n\n// Determinismus-Anhang §2: kaufmännisch HALF_UP, von Null weg bei genau .5\n// (NICHT banker's). big.js `roundHalfUp` (=1) rundet away-from-zero.\nconst HALF_UP = Big.roundHalfUp;\n\n/** Nachkommastellen eines Big-Werts (big.js hält Koeffizient `c` + Exponent `e`). */\nfunction decimalPlaces(value: Big): number {\n return Math.max(0, value.c.length - value.e - 1);\n}\n\n/**\n * Betrag = Dezimalwert + Währung, nie Float (Glossar `money`).\n *\n * Determinismus-Regeln (determinismus.md §2):\n * - Rundung: kaufmännisch half-up, von Null weg bei genau .5.\n * - allocate: Largest-Remainder, Gleichstand → erster Teil; Σ Teile = Betrag, immer.\n *\n * Der Betrag liegt intern immer exakt auf der Währungsskala.\n */\nexport class Money {\n private constructor(\n private readonly amount: Big,\n readonly currency: Currency,\n ) {}\n\n private static currencyOf(currency: Currency | string): Currency {\n return currency instanceof Currency ? currency : Currency.of(currency);\n }\n\n /**\n * Exakter Betrag auf Währungsskala. Mehr Nachkommastellen als die Währung\n * erlaubt sind ein Fehler — hier wird nie still gerundet.\n */\n static of(amount: string, currency: Currency | string): Money {\n const cur = Money.currencyOf(currency);\n let value: Big;\n try {\n value = new Big(amount);\n } catch {\n throw new InvalidValue(`Ungültiger Betrag \"${amount}\" für Währung ${cur.code} (Skala ${cur.scale})`);\n }\n const scaled = value.round(cur.scale, HALF_UP);\n if (!scaled.eq(value)) {\n throw new InvalidValue(`Ungültiger Betrag \"${amount}\" für Währung ${cur.code} (Skala ${cur.scale})`);\n }\n return new Money(scaled, cur);\n }\n\n /**\n * Ergebnis einer Rechnung auf Währungsskala bringen: half-up\n * (2.225 → 2.23, -2.345 → -2.35). Einziger Weg, auf dem Money rundet.\n */\n static fromCalculation(value: Big | string, currency: Currency | string): Money {\n const cur = Money.currencyOf(currency);\n let big: Big;\n try {\n big = value instanceof Big ? value : new Big(value);\n } catch {\n throw new InvalidValue(`Ungültiger Rechenwert für Währung ${cur.code}`);\n }\n return new Money(big.round(cur.scale, HALF_UP), cur);\n }\n\n static zero(currency: Currency | string): Money {\n return new Money(new Big(0), Money.currencyOf(currency));\n }\n\n add(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(this.amount.plus(other.amount), this.currency);\n }\n\n subtract(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(this.amount.minus(other.amount), this.currency);\n }\n\n negate(): Money {\n return new Money(this.amount.times(-1), this.currency);\n }\n\n abs(): Money {\n return new Money(this.amount.abs(), this.currency);\n }\n\n /** -1, 0 oder 1 */\n compareTo(other: Money): number {\n this.assertSameCurrency(other);\n return this.amount.cmp(other.amount);\n }\n\n equals(other: Money): boolean {\n return this.currency.equals(other.currency) && this.amount.eq(other.amount);\n }\n\n isZero(): boolean {\n return this.amount.eq(0);\n }\n\n isPositive(): boolean {\n return this.amount.gt(0);\n }\n\n isNegative(): boolean {\n return this.amount.lt(0);\n }\n\n /**\n * Verteilt den Betrag nach Gewichten (determinismus.md §2): Largest-Remainder,\n * Gleichstand → erster Teil. Σ Teile = Betrag, immer.\n *\n * Gewichte: nicht-negative Dezimalwerte (Zahl oder String), Summe > 0.\n * Negative Beträge werden als negiertes Spiegelbild verteilt.\n */\n allocate(...weights: Array<number | string>): Money[] {\n if (weights.length === 0) {\n throw new InvalidValue('allocate braucht mindestens ein Gewicht');\n }\n\n if (this.isNegative()) {\n return this.negate()\n .allocate(...weights)\n .map((part) => part.negate());\n }\n\n const scale = this.currency.scale;\n const integerWeights = Money.normalizeWeights(weights);\n\n let weightSum = 0n;\n for (const weight of integerWeights) {\n weightSum += weight;\n }\n if (weightSum === 0n) {\n throw new InvalidValue('Gewichtssumme muss > 0 sein');\n }\n\n const factor = new Big(10).pow(scale);\n const totalMinor = BigInt(this.amount.times(factor).toFixed(0));\n\n const parts = integerWeights.map((weight) => {\n const product = totalMinor * weight;\n return { base: product / weightSum, remainder: product % weightSum };\n });\n\n let assigned = 0n;\n for (const part of parts) {\n assigned += part.base;\n }\n\n // Restverteilung nach größtem Rest; Gleichstand → kleinster Index.\n const leftover = Number(totalMinor - assigned);\n const order = parts.map((part, index) => ({ remainder: part.remainder, index }));\n order.sort((a, b) =>\n a.remainder > b.remainder ? -1 : a.remainder < b.remainder ? 1 : a.index - b.index,\n );\n for (let i = 0; i < leftover; i++) {\n parts[order[i]!.index]!.base += 1n;\n }\n\n return parts.map((part) => Money.fromMinor(part.base, scale, this.currency));\n }\n\n /** Verteilung in n gleiche Teile (Sammelposten-Fünftel, AfA-Monatsraten). */\n allocateEvenly(parts: number): Money[] {\n if (parts < 1) {\n throw new InvalidValue('allocateEvenly braucht mindestens einen Teil');\n }\n return this.allocate(...new Array<number>(parts).fill(1));\n }\n\n /** Betrag als String-Dezimal mit fester Skala, z. B. \"1234.56\" (datenformat.md). */\n amountAsString(): string {\n return this.amount.toFixed(this.currency.scale);\n }\n\n toJSON(): { amount: string; currency: string } {\n return { amount: this.amountAsString(), currency: this.currency.code };\n }\n\n toString(): string {\n return `${this.amountAsString()} ${this.currency.code}`;\n }\n\n private static fromMinor(minor: bigint, scale: number, currency: Currency): Money {\n const value = new Big(minor.toString()).div(new Big(10).pow(scale));\n return new Money(value.round(scale, HALF_UP), currency);\n }\n\n /** Dezimalgewichte verlustfrei auf ganzzahlige Gewichte gleicher Skala bringen. */\n private static normalizeWeights(weights: Array<number | string>): bigint[] {\n const decimals: Big[] = [];\n let maxScale = 0;\n\n for (const weight of weights) {\n let decimal: Big;\n try {\n decimal = new Big(weight);\n } catch {\n throw new InvalidValue(`Ungültiges Gewicht \"${weight}\"`);\n }\n if (decimal.lt(0)) {\n throw new InvalidValue('Gewichte dürfen nicht negativ sein');\n }\n decimals.push(decimal);\n maxScale = Math.max(maxScale, decimalPlaces(decimal));\n }\n\n const factor = new Big(10).pow(maxScale);\n return decimals.map((decimal) => BigInt(decimal.times(factor).toFixed(0)));\n }\n\n private assertSameCurrency(other: Money): void {\n if (!this.currency.equals(other.currency)) {\n throw new CurrencyMismatch(\n `Währungen mischen sich nicht: ${this.currency.code} vs. ${other.currency.code}`,\n );\n }\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Kanonisches JSON nach RFC 8785 (JCS) — Grundlage aller Hashes und\n * Determinismus-Vergleiche (datenformat.md Grundsatz 1, determinismus.md §5).\n *\n * Bewusste Abweichung vom vollen RFC: Floats werden abgelehnt statt\n * ECMAScript-serialisiert — das Datenformat verbietet JSON-Number für Beträge\n * (String-Dezimal), und Ganzzahlen (sequenceNumber, year) sind exakt darstellbar.\n *\n * Schlüsselsortierung nach UTF-16-Code-Units: JS-Strings sind UTF-16, der\n * native `Array#sort` vergleicht genau danach — RFC-konform ohne Handarbeit\n * (Surrogatpaare sortieren vor U+E000..U+FFFF).\n *\n * Objekte mit `toJSON()` werden entpackt (JS-Pendant zu PHPs JsonSerializable).\n */\nconst MAX_SAFE_INTEGER = 9007199254740991; // 2^53 - 1\n\nexport function canonicalJson(value: unknown): string {\n return encodeValue(value);\n}\n\nfunction encodeValue(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (typeof value === 'number') {\n if (!Number.isInteger(value)) {\n throw new InvalidValue(\n 'Floats sind im Datenformat verboten (Beträge als String-Dezimal, datenformat.md)',\n );\n }\n if (Math.abs(value) > MAX_SAFE_INTEGER) {\n throw new InvalidValue(`Ganzzahl außerhalb des sicheren Bereichs (|x| > 2^53-1): ${value}`);\n }\n return String(value);\n }\n if (typeof value === 'string') {\n return encodeString(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(encodeValue).join(',')}]`;\n }\n if (typeof value === 'object') {\n const candidate = value as { toJSON?: () => unknown };\n if (typeof candidate.toJSON === 'function') {\n return encodeValue(candidate.toJSON());\n }\n return encodeObject(value as Record<string, unknown>);\n }\n throw new InvalidValue(`Nicht serialisierbarer Typ: ${typeof value}`);\n}\n\nfunction encodeObject(object: Record<string, unknown>): string {\n const keys = Object.keys(object);\n if (keys.length === 0) {\n return '{}';\n }\n // Native Sortierung = UTF-16-Code-Unit-Reihenfolge = RFC 8785.\n keys.sort();\n return `{${keys.map((key) => `${encodeString(key)}:${encodeValue(object[key])}`).join(',')}}`;\n}\n\n/**\n * JCS-Stringserialisierung (RFC 8785 §3.2.2.2): kurze Escapes für die üblichen\n * Steuerzeichen, \\u00xx (lowercase) für den Rest unter U+0020, alles andere roh.\n */\nfunction encodeString(value: string): string {\n let out = '\"';\n for (let i = 0; i < value.length; i++) {\n const char = value[i]!;\n const code = value.charCodeAt(i);\n if (char === '\"') {\n out += '\\\\\"';\n } else if (char === '\\\\') {\n out += '\\\\\\\\';\n } else if (code === 0x08) {\n out += '\\\\b';\n } else if (code === 0x09) {\n out += '\\\\t';\n } else if (code === 0x0a) {\n out += '\\\\n';\n } else if (code === 0x0c) {\n out += '\\\\f';\n } else if (code === 0x0d) {\n out += '\\\\r';\n } else if (code < 0x20) {\n out += `\\\\u${code.toString(16).padStart(4, '0')}`;\n } else {\n out += char;\n }\n }\n return `${out}\"`;\n}\n","/**\n * Zeitquelle des Kerns (Determinismus-Hook). Bewusst eigenes Interface,\n * PSR-20-/Temporal-kompatibel im Geist: liefert einen Zeitpunkt.\n */\nexport interface Clock {\n now(): Date;\n}\n\n/** Echte Systemzeit (Produktion). */\nexport class SystemClock implements Clock {\n now(): Date {\n return new Date();\n }\n}\n\n/** Feststehende Zeit für Tests und deterministische Läufe. */\nexport class FixedClock implements Clock {\n private current: Date;\n\n private constructor(at: Date) {\n this.current = at;\n }\n\n static at(iso8601: string): FixedClock {\n return new FixedClock(new Date(iso8601));\n }\n\n now(): Date {\n return this.current;\n }\n\n advanceMilliseconds(milliseconds: number): void {\n this.current = new Date(this.current.getTime() + milliseconds);\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport { type Clock, SystemClock } from './clock.js';\nimport { InvalidValue } from './errors.js';\n\n/**\n * UUIDv7 (RFC 9562): 48 Bit Unix-Millisekunden + Zufall — zeitlich sortierbar\n * als String, implementierungsunabhängig erzeugbar (datenformat.md Grundsatz 3).\n * Fixtures vergleichen nie ID-Werte, nur Platzhalter-Gleichheit.\n */\nconst PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport class Uuid {\n private constructor(readonly value: string) {}\n\n static fromString(value: string): Uuid {\n const normalized = value.toLowerCase();\n if (!PATTERN.test(normalized)) {\n throw new InvalidValue(`Keine gültige UUID: \"${value}\"`);\n }\n return new Uuid(normalized);\n }\n\n static v7(clock: Clock = new SystemClock()): Uuid {\n const time = clock.now().getTime().toString(16).padStart(12, '0');\n const random = randomBytes(10).toString('hex'); // 20 Hex-Zeichen Entropie\n // Variantennibble: oberste zwei Bits = 10 -> 8, 9, a oder b.\n const variant = ((parseInt(random[3]!, 16) & 0x3) | 0x8).toString(16);\n\n return new Uuid(\n `${time.slice(0, 8)}-${time.slice(8, 12)}-7${random.slice(0, 3)}-${variant}${random.slice(4, 7)}-${random.slice(7, 19)}`,\n );\n }\n\n equals(other: Uuid): boolean {\n return this.value === other.value;\n }\n\n /** Byteweise = zeitliche Ordnung bei v7. */\n compareTo(other: Uuid): number {\n return this.value < other.value ? -1 : this.value > other.value ? 1 : 0;\n }\n\n toJSON(): string {\n return this.value;\n }\n\n toString(): string {\n return this.value;\n }\n}\n","import { type Clock, SystemClock } from './clock.js';\nimport { Uuid } from './uuid.js';\n\n/**\n * ID-Quelle des Kerns — Port, damit Tests und Determinismus-Läufe die Erzeugung\n * kontrollieren können. Produktion: UUIDv7.\n */\nexport interface IdGenerator {\n next(): Uuid;\n}\n\n/** Produktions-Generator: echte UUIDv7 aus Zeit + Zufall. */\nexport class UuidV7IdGenerator implements IdGenerator {\n constructor(private readonly clock: Clock = new SystemClock()) {}\n\n next(): Uuid {\n return Uuid.v7(this.clock);\n }\n}\n\n/**\n * UUIDv7-förmige IDs aus fester Uhr + Zähler statt Zufall — für Tests und den\n * Doppellauf-Determinismus-Check der Konformitätssuite (Strom-Hashes enthalten\n * IDs; zwei Läufe müssen byte-identisch sein).\n */\nexport class DeterministicIdGenerator implements IdGenerator {\n private counter = 0;\n\n constructor(private readonly clock: Clock) {}\n\n next(): Uuid {\n this.counter++;\n\n const time = this.clock.now().getTime().toString(16).padStart(12, '0');\n const sequence = this.counter.toString(16).padStart(18, '0');\n\n return Uuid.fromString(\n `${time.slice(0, 8)}-${time.slice(8, 12)}-7${sequence.slice(0, 3)}-8${sequence.slice(3, 6)}-${sequence.slice(6, 18)}`,\n );\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Zonenloses Kalenderdatum (determinismus.md §4): Beleg- und Buchungsdatum\n * kennen keine Zeitzone — kein UTC-Shift-Risiko. ISO-Format sortiert\n * lexikographisch korrekt (= chronologisch).\n */\nfunction toIso(year: number, monthIndex: number, day: number): string {\n const date = new Date(Date.UTC(year, monthIndex, day));\n const y = String(date.getUTCFullYear()).padStart(4, '0');\n const m = String(date.getUTCMonth() + 1).padStart(2, '0');\n const d = String(date.getUTCDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\nexport class CalendarDate {\n private constructor(readonly iso: string) {}\n\n static of(iso: string): CalendarDate {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(iso)) {\n throw new InvalidValue(`Kein gültiges Kalenderdatum: \"${iso}\"`);\n }\n const year = Number(iso.slice(0, 4));\n const month = Number(iso.slice(5, 7));\n const day = Number(iso.slice(8, 10));\n // Round-trip-Prüfung fängt 2026-13-01, 2026-02-30 etc.\n if (toIso(year, month - 1, day) !== iso) {\n throw new InvalidValue(`Kein gültiges Kalenderdatum: \"${iso}\"`);\n }\n return new CalendarDate(iso);\n }\n\n compareTo(other: CalendarDate): number {\n return this.iso < other.iso ? -1 : this.iso > other.iso ? 1 : 0;\n }\n\n equals(other: CalendarDate): boolean {\n return this.iso === other.iso;\n }\n\n isBefore(other: CalendarDate): boolean {\n return this.compareTo(other) < 0;\n }\n\n isAfter(other: CalendarDate): boolean {\n return this.compareTo(other) > 0;\n }\n\n isBetween(start: CalendarDate, end: CalendarDate): boolean {\n return !this.isBefore(start) && !this.isAfter(end);\n }\n\n year(): number {\n return Number(this.iso.slice(0, 4));\n }\n\n month(): number {\n return Number(this.iso.slice(5, 7));\n }\n\n lastDayOfMonth(): CalendarDate {\n // Tag 0 des Folgemonats = letzter Tag dieses Monats.\n return new CalendarDate(toIso(this.year(), this.month(), 0));\n }\n\n firstDayOfNextMonth(): CalendarDate {\n return new CalendarDate(toIso(this.year(), this.month(), 1));\n }\n\n toJSON(): string {\n return this.iso;\n }\n\n toString(): string {\n return this.iso;\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Kontonummer als String — führende Nullen signifikant (datenformat.md).\n * Vergleich nach Unicode-Codepoints, keine Locale-Collation: \"10\" < \"9\",\n * \"0420\" < \"1200\" < \"8400\" (determinismus.md §3). JS-`<` auf Strings\n * vergleicht UTF-16-Code-Units = Codepoints im BMP.\n */\nexport class AccountNumber {\n private constructor(readonly value: string) {}\n\n static of(value: string): AccountNumber {\n if (value === '' || value.length > 64) {\n throw new InvalidValue('Kontonummer muss 1-64 Zeichen lang sein');\n }\n if (!/^[^\\s\\p{C}]+$/u.test(value)) {\n throw new InvalidValue(`Kontonummer enthält Whitespace oder Steuerzeichen: \"${value}\"`);\n }\n return new AccountNumber(value);\n }\n\n compareTo(other: AccountNumber): number {\n return this.value < other.value ? -1 : this.value > other.value ? 1 : 0;\n }\n\n equals(other: AccountNumber): boolean {\n return this.value === other.value;\n }\n\n toJSON(): string {\n return this.value;\n }\n\n toString(): string {\n return this.value;\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Verweis auf eine Periode: Geschäftsjahr + Periodennummer (datenformat.md\n * `periodRef`). `fiscalYear` = Kalenderjahr des GJ-Endes.\n */\nexport class PeriodRef {\n constructor(\n readonly fiscalYear: number,\n readonly period: number,\n ) {\n if (fiscalYear < 1 || fiscalYear > 9999) {\n throw new InvalidValue(`Ungültiges Geschäftsjahr: ${fiscalYear}`);\n }\n if (period < 1 || period > 999) {\n throw new InvalidValue(`Ungültige Periodennummer: ${period}`);\n }\n }\n\n /** Chronologisch: erst Jahr, dann Periode. */\n compareTo(other: PeriodRef): number {\n if (this.fiscalYear !== other.fiscalYear) {\n return this.fiscalYear < other.fiscalYear ? -1 : 1;\n }\n return this.period < other.period ? -1 : this.period > other.period ? 1 : 0;\n }\n\n equals(other: PeriodRef): boolean {\n return this.fiscalYear === other.fiscalYear && this.period === other.period;\n }\n\n toJSON(): { fiscalYear: number; period: number } {\n return { fiscalYear: this.fiscalYear, period: this.period };\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Zusatzzuordnung einer Buchungsposition: Dimensionstyp + Wert-Code\n * (datenformat.md). Gültigkeitsprüfung gegen Stammdaten passiert an der\n * Operation (E_DIMENSION_INVALID), nicht hier.\n */\nexport class DimensionValue {\n private constructor(\n readonly type: string,\n readonly code: string,\n ) {}\n\n static of(type: string, code: string): DimensionValue {\n if (type === '' || code === '') {\n throw new InvalidValue('Dimensionstyp und -code dürfen nicht leer sein');\n }\n return new DimensionValue(type, code);\n }\n\n equals(other: DimensionValue): boolean {\n return this.type === other.type && this.code === other.code;\n }\n\n toJSON(): { type: string; code: string } {\n return { type: this.type, code: this.code };\n }\n}\n","/**\n * Fachlicher Fehler mit Katalog-Code (fehlerkatalog.md). Vertragsteil: gleicher\n * Verstoß → gleicher Code in allen Implementierungen. `message` ist frei,\n * `details` trägt beteiligte IDs/Werte.\n */\nexport class DomainError extends Error {\n constructor(\n readonly errorCode: string,\n message = '',\n readonly details: Record<string, unknown> = {},\n ) {\n super(message !== '' ? message : errorCode);\n this.name = 'DomainError';\n }\n}\n","/** Soll/Haben. */\nexport type Side = 'debit' | 'credit';\n\n/**\n * Kontotyp bestimmt die Saldenmechanik (ledger-modell.md): Bestandskonten\n * kumulieren über Jahre, Erfolgskonten je Geschäftsjahr.\n */\nexport type AccountType = 'asset' | 'liability' | 'equity' | 'expense' | 'revenue';\n\nconst BALANCE_CARRYING: ReadonlySet<AccountType> = new Set<AccountType>([\n 'asset',\n 'liability',\n 'equity',\n]);\n\n/** Bestandskonto: Saldo trägt implizit vor (kein SBK/EBK). */\nexport function isBalanceCarrying(type: AccountType): boolean {\n return BALANCE_CARRYING.has(type);\n}\n\nexport function isAccountType(value: unknown): value is AccountType {\n return (\n value === 'asset' ||\n value === 'liability' ||\n value === 'equity' ||\n value === 'expense' ||\n value === 'revenue'\n );\n}\n\nexport type AccountStatus = 'active' | 'locked';\n\n/** GoBD-Lebenszyklus: erfasst (korrigierbar) → festgeschrieben (nur Storno). */\nexport type EntryStatus = 'entered' | 'finalized';\n\nexport type PeriodStatus = 'open' | 'closed';\n\nexport type FiscalYearStatus = 'open' | 'closed';\n\nexport type OpenItemKind = 'receivable' | 'payable';\n\nexport type OpenItemStatus = 'open' | 'partially_settled' | 'settled';\n\n/**\n * Ausgleich mit Differenz (api.md G2): Skonto, Forderungsausfall, Kleindifferenz.\n * Die Differenz muss als Buchungszeile(n) sichtbar sein (§ 17 UStG).\n */\nexport type SettlementDifferenceKind = 'discount' | 'bad_debt' | 'minor';\n\nexport function parseSettlementDifferenceKind(value: unknown): SettlementDifferenceKind | null {\n return value === 'discount' || value === 'bad_debt' || value === 'minor' ? value : null;\n}\n\nexport function parseOpenItemKind(value: unknown): OpenItemKind | null {\n return value === 'receivable' || value === 'payable' ? value : null;\n}\n","import { AccountNumber } from '../shared/account-number.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { AccountStatus, AccountType } from './types.js';\n\n/**\n * Konto (ledger-modell.md Aggregat 2). Kein Saldo im Aggregat — Salden sind\n * Projektionen des Journals, immer.\n */\nexport class Account {\n private accountStatus: AccountStatus;\n\n constructor(\n readonly id: Uuid,\n readonly number: AccountNumber,\n readonly name: string,\n readonly type: AccountType,\n readonly subtype: string | null,\n status: AccountStatus = 'active',\n ) {\n this.accountStatus = status;\n }\n\n status(): AccountStatus {\n return this.accountStatus;\n }\n\n isLocked(): boolean {\n return this.accountStatus === 'locked';\n }\n\n lock(): void {\n this.accountStatus = 'locked';\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n number: this.number.value,\n name: this.name,\n type: this.type,\n subtype: this.subtype,\n status: this.accountStatus,\n };\n }\n}\n","import type { AccountNumber } from '../shared/account-number.js';\nimport type { DimensionValue } from '../shared/dimension-value.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { Side } from './types.js';\n\n/**\n * Buchungsposition — Value Object innerhalb der Buchung (keine eigene Identität;\n * Referenz = Buchungs-ID + Positionsindex).\n */\nexport class EntryLine {\n constructor(\n readonly accountId: Uuid,\n readonly account: AccountNumber,\n readonly side: Side,\n readonly money: Money,\n readonly dimensions: DimensionValue[] = [],\n readonly taxTag: Record<string, unknown> | null = null,\n ) {}\n\n negated(): EntryLine {\n return new EntryLine(\n this.accountId,\n this.account,\n this.side,\n this.money.negate(),\n this.dimensions,\n this.taxTag,\n );\n }\n\n toJSON(): Record<string, unknown> {\n return {\n accountId: this.accountId.value,\n account: this.account.value,\n side: this.side,\n money: this.money.toJSON(),\n dimensions: this.dimensions.map((dimension) => dimension.toJSON()),\n taxTag: this.taxTag,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport type { PeriodRef } from '../shared/period-ref.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { EntryLine } from './entry-line.js';\nimport type { EntryStatus } from './types.js';\n\n/**\n * Buchung — das wichtigste Aggregat (ledger-modell.md). Entsteht vollständig und\n * gültig (Validierung im Ledger-Service); Lebenszyklus entered → finalized,\n * danach nur Storno (neue Buchung mit Rückverweis, Generalumkehr).\n */\nexport class JournalEntry {\n private entryText: string;\n private entryLines: EntryLine[];\n private entryReversedBy: Uuid | null;\n private entryStatus: EntryStatus;\n\n constructor(\n readonly id: Uuid,\n readonly sequenceNumber: number,\n readonly entryDate: CalendarDate,\n readonly voucherDate: CalendarDate | null,\n readonly recordedAt: string,\n readonly periodRef: PeriodRef,\n readonly voucherId: Uuid,\n text: string,\n lines: EntryLine[],\n readonly reverses: Uuid | null = null,\n reversedBy: Uuid | null = null,\n status: EntryStatus = 'entered',\n ) {\n this.entryText = text;\n this.entryLines = lines;\n this.entryReversedBy = reversedBy;\n this.entryStatus = status;\n }\n\n status(): EntryStatus {\n return this.entryStatus;\n }\n\n isFinalized(): boolean {\n return this.entryStatus === 'finalized';\n }\n\n text(): string {\n return this.entryText;\n }\n\n lines(): EntryLine[] {\n return this.entryLines;\n }\n\n reversedBy(): Uuid | null {\n return this.entryReversedBy;\n }\n\n changeText(text: string): void {\n this.assertCorrectable();\n this.entryText = text;\n }\n\n changeLines(lines: EntryLine[]): void {\n this.assertCorrectable();\n this.entryLines = lines;\n }\n\n finalize(): void {\n this.entryStatus = 'finalized';\n }\n\n markReversed(reversalId: Uuid): void {\n if (this.entryReversedBy !== null) {\n throw new DomainError(\n 'E_ENTRY_ALREADY_REVERSED',\n `Buchung ${this.id.value} ist bereits storniert (durch ${this.entryReversedBy.value})`,\n { entryId: this.id.value, reversedBy: this.entryReversedBy.value },\n );\n }\n this.entryReversedBy = reversalId;\n }\n\n private assertCorrectable(): void {\n if (this.entryStatus !== 'entered') {\n throw new DomainError(\n 'E_ENTRY_FINALIZED',\n `Buchung ${this.id.value} ist festgeschrieben — Korrektur nicht möglich, nur Storno`,\n { entryId: this.id.value },\n );\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n sequenceNumber: this.sequenceNumber,\n status: this.entryStatus,\n entryDate: this.entryDate.iso,\n voucherDate: this.voucherDate?.iso ?? null,\n recordedAt: this.recordedAt,\n periodRef: this.periodRef.toJSON(),\n voucherId: this.voucherId.value,\n text: this.entryText,\n lines: this.entryLines.map((line) => line.toJSON()),\n reverses: this.reverses?.value ?? null,\n reversedBy: this.entryReversedBy?.value ?? null,\n };\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Beleg (ledger-modell.md Aggregat 4): existiert vor/ohne Buchung, mehrere\n * Buchungen können ihn referenzieren. Metadaten für EÜR/USt (due, recurring,\n * economicYear, serviceDate/servicePeriod, partnerId, kind …).\n */\nexport interface VoucherProps {\n readonly id: Uuid;\n readonly voucherNumber: string;\n readonly voucherDate: CalendarDate;\n readonly due?: CalendarDate | null;\n readonly recurring?: boolean;\n readonly economicYear?: number | null;\n readonly supplierTaxationMethod?: string | null;\n readonly serviceDate?: CalendarDate | null;\n readonly servicePeriodFrom?: CalendarDate | null;\n readonly servicePeriodTo?: CalendarDate | null;\n readonly kind?: string | null;\n readonly partnerId?: Uuid | null;\n readonly issuer?: string | null;\n}\n\nexport class Voucher {\n readonly id: Uuid;\n readonly voucherNumber: string;\n readonly voucherDate: CalendarDate;\n readonly due: CalendarDate | null;\n readonly recurring: boolean;\n readonly economicYear: number | null;\n readonly supplierTaxationMethod: string | null;\n readonly serviceDate: CalendarDate | null;\n readonly servicePeriodFrom: CalendarDate | null;\n readonly servicePeriodTo: CalendarDate | null;\n readonly kind: string | null;\n readonly partnerId: Uuid | null;\n readonly issuer: string | null;\n\n constructor(props: VoucherProps) {\n this.id = props.id;\n this.voucherNumber = props.voucherNumber;\n this.voucherDate = props.voucherDate;\n this.due = props.due ?? null;\n this.recurring = props.recurring ?? false;\n this.economicYear = props.economicYear ?? null;\n this.supplierTaxationMethod = props.supplierTaxationMethod ?? null;\n this.serviceDate = props.serviceDate ?? null;\n this.servicePeriodFrom = props.servicePeriodFrom ?? null;\n this.servicePeriodTo = props.servicePeriodTo ?? null;\n this.kind = props.kind ?? null;\n this.partnerId = props.partnerId ?? null;\n this.issuer = props.issuer ?? null;\n }\n\n /** Steuerlich maßgebliches Datum: Leistungsdatum, Fallback Belegdatum. */\n taxDate(): CalendarDate {\n return this.serviceDate ?? this.servicePeriodTo ?? this.voucherDate;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n voucherNumber: this.voucherNumber,\n voucherDate: this.voucherDate.iso,\n due: this.due?.iso ?? null,\n recurring: this.recurring,\n economicYear: this.economicYear,\n supplierTaxationMethod: this.supplierTaxationMethod,\n serviceDate: this.serviceDate?.iso ?? null,\n servicePeriod:\n this.servicePeriodFrom === null\n ? null\n : { from: this.servicePeriodFrom.iso, to: this.servicePeriodTo?.iso ?? null },\n kind: this.kind,\n partnerId: this.partnerId?.value ?? null,\n issuer: this.issuer,\n };\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\nimport type { PeriodStatus } from './types.js';\n\n/**\n * Periode — Entity innerhalb des FiscalYear-Aggregats (lückenlos,\n * überlappungsfrei; Statuswechsel nur über das Aggregat).\n */\nexport class Period {\n private periodStatus: PeriodStatus;\n\n constructor(\n readonly number: number,\n readonly start: CalendarDate,\n readonly end: CalendarDate,\n status: PeriodStatus = 'open',\n ) {\n this.periodStatus = status;\n }\n\n status(): PeriodStatus {\n return this.periodStatus;\n }\n\n isOpen(): boolean {\n return this.periodStatus === 'open';\n }\n\n contains(date: CalendarDate): boolean {\n return date.isBetween(this.start, this.end);\n }\n\n /** Nur über FiscalYear aufrufen (Reihenfolgeprüfung dort). */\n close(): void {\n this.periodStatus = 'closed';\n }\n\n /** Nur über FiscalYear aufrufen (Jahresstatusprüfung dort). */\n reopen(): void {\n this.periodStatus = 'open';\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport { Period } from './period.js';\nimport type { FiscalYearStatus } from './types.js';\n\nexport interface PeriodDefinition {\n readonly period: number;\n readonly start: CalendarDate;\n readonly end: CalendarDate;\n}\n\n/**\n * Geschäftsjahr mit Perioden (ledger-modell.md Aggregat 3). Invarianten:\n * Perioden lückenlos und überlappungsfrei; Schließen nur in Reihenfolge;\n * Wiedereröffnen nur vor Jahresabschluss. `year` = Kalenderjahr des GJ-Endes.\n */\nexport class FiscalYear {\n private fiscalStatus: FiscalYearStatus;\n\n private constructor(\n readonly id: Uuid,\n readonly year: number,\n readonly start: CalendarDate,\n readonly end: CalendarDate,\n private readonly periodList: Period[],\n status: FiscalYearStatus = 'open',\n ) {\n this.fiscalStatus = status;\n }\n\n static create(\n id: Uuid,\n year: number,\n start: CalendarDate,\n end: CalendarDate,\n explicitPeriods: PeriodDefinition[] | null = null,\n ): FiscalYear {\n if (!start.isBefore(end)) {\n throw new InvalidValue('Geschäftsjahr: start muss vor end liegen');\n }\n const periods =\n explicitPeriods === null\n ? FiscalYear.monthlyPeriods(start, end)\n : explicitPeriods.map((d) => new Period(d.period, d.start, d.end));\n return new FiscalYear(id, year, start, end, periods);\n }\n\n private static monthlyPeriods(start: CalendarDate, end: CalendarDate): Period[] {\n const periods: Period[] = [];\n let cursor = start;\n let number = 1;\n while (!cursor.isAfter(end)) {\n const monthEnd = cursor.lastDayOfMonth();\n const periodEnd = monthEnd.isAfter(end) ? end : monthEnd;\n periods.push(new Period(number, cursor, periodEnd));\n cursor = cursor.firstDayOfNextMonth();\n number++;\n }\n return periods;\n }\n\n status(): FiscalYearStatus {\n return this.fiscalStatus;\n }\n\n isClosed(): boolean {\n return this.fiscalStatus === 'closed';\n }\n\n periods(): Period[] {\n return this.periodList;\n }\n\n period(number: number): Period {\n const found = this.periodList.find((p) => p.number === number);\n if (found === undefined) {\n throw new DomainError(\n 'E_PERIOD_UNKNOWN',\n `Periode ${number} existiert nicht im Geschäftsjahr ${this.year}`,\n { fiscalYear: this.year, period: number },\n );\n }\n return found;\n }\n\n contains(date: CalendarDate): boolean {\n return date.isBetween(this.start, this.end);\n }\n\n periodForDate(date: CalendarDate): Period {\n const found = this.periodList.find((p) => p.contains(date));\n if (found === undefined) {\n throw new DomainError(\n 'E_PERIOD_UNKNOWN',\n `Kein Periodenzeitraum für ${date.iso} im Geschäftsjahr ${this.year}`,\n { date: date.iso, fiscalYear: this.year },\n );\n }\n return found;\n }\n\n closePeriod(number: number): Period {\n this.assertNotClosed();\n const target = this.period(number);\n for (const period of this.periodList) {\n if (period.number < number && period.isOpen()) {\n throw new DomainError(\n 'E_PERIOD_OUT_OF_ORDER',\n `Periode ${number} kann nicht geschlossen werden: Periode ${period.number} ist noch offen`,\n { fiscalYear: this.year, period: number, openPeriod: period.number },\n );\n }\n }\n target.close();\n return target;\n }\n\n reopenPeriod(number: number): Period {\n this.assertNotClosed();\n const target = this.period(number);\n target.reopen();\n return target;\n }\n\n /** Reiner Statuswechsel — keine fachliche Buchungswirkung (api.md v0.3). */\n close(): void {\n for (const period of this.periodList) {\n if (period.isOpen()) {\n throw new DomainError(\n 'E_PERIOD_OUT_OF_ORDER',\n `Jahresabschluss ${this.year}: Periode ${period.number} ist noch offen`,\n { fiscalYear: this.year, openPeriod: period.number },\n );\n }\n }\n this.fiscalStatus = 'closed';\n }\n\n private assertNotClosed(): void {\n if (this.isClosed()) {\n throw new DomainError('E_FISCALYEAR_CLOSED', `Geschäftsjahr ${this.year} ist abgeschlossen`, {\n fiscalYear: this.year,\n });\n }\n }\n}\n","import type { Uuid } from '../shared/uuid.js';\n\nexport type AuditChanges = Record<string, { from: unknown; to: unknown }>;\n\n/**\n * Audit-Eintrag (datenformat.md v0.3 `auditLog.jsonl`): flacher Vorher/Nachher-\n * Diff nur der geänderten Felder.\n */\nexport class AuditRecord {\n constructor(\n readonly id: Uuid,\n readonly at: string,\n readonly actor: string,\n readonly objectType: string,\n readonly objectId: Uuid,\n readonly action: string,\n readonly changes: AuditChanges = {},\n ) {}\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n at: this.at,\n actor: this.actor,\n objectType: this.objectType,\n objectId: this.objectId.value,\n action: this.action,\n // Leerer Diff → {} (nicht []), damit das Format stabil bleibt.\n changes: this.changes,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { Settlement } from './settlement.js';\nimport type { OpenItemKind, OpenItemStatus } from './types.js';\n\n/**\n * Offener Posten (ledger-modell.md Aggregat 5): entsteht aus einer Buchung auf\n * ein AR/AP-Konto, referenziert Ursprungsbuchung + Position. Invariante:\n * Σ Ausgleiche ≤ Betrag; Teilausgleiche erlaubt.\n */\nexport class OpenItem {\n private readonly settlementList: Settlement[] = [];\n\n constructor(\n readonly id: Uuid,\n readonly kind: OpenItemKind,\n readonly originEntryId: Uuid,\n readonly originLineIndex: number,\n readonly money: Money,\n readonly voucherId: Uuid,\n readonly openedAt: CalendarDate,\n readonly partnerId: Uuid | null = null,\n ) {}\n\n settlements(): Settlement[] {\n return this.settlementList;\n }\n\n remaining(): Money {\n return this.remainingAt(null);\n }\n\n /** Restbetrag zum Stichtag (null = heute/alles). */\n remainingAt(asOf: CalendarDate | null): Money {\n let remaining = this.money;\n for (const settlement of this.settlementList) {\n if (asOf !== null && settlement.settledAt.isAfter(asOf)) continue;\n remaining = remaining.subtract(settlement.money);\n }\n return remaining;\n }\n\n status(): OpenItemStatus {\n return this.statusAt(null);\n }\n\n statusAt(asOf: CalendarDate | null): OpenItemStatus {\n const remaining = this.remainingAt(asOf);\n if (remaining.isZero()) return 'settled';\n return remaining.equals(this.money) ? 'open' : 'partially_settled';\n }\n\n settle(settlement: Settlement): void {\n if (settlement.money.compareTo(this.remaining()) > 0) {\n throw new DomainError(\n 'E_SETTLEMENT_EXCEEDS_ITEM',\n `Zuordnung ${settlement.money.amountAsString()} übersteigt Restbetrag ${this.remaining().amountAsString()} des Postens ${this.id.value}`,\n {\n openItemId: this.id.value,\n remaining: this.remaining().amountAsString(),\n allocated: settlement.money.amountAsString(),\n },\n );\n }\n this.settlementList.push(settlement);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n kind: this.kind,\n originEntryId: this.originEntryId.value,\n originLineIndex: this.originLineIndex,\n money: this.money.toJSON(),\n partnerId: this.partnerId?.value ?? null,\n remaining: this.remaining().toJSON(),\n status: this.status(),\n settlements: this.settlementList.map((settlement) => settlement.toJSON()),\n };\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { SettlementDifferenceKind } from './types.js';\n\n/**\n * Einzelner Ausgleich eines offenen Postens. `money` ist der ausgeglichene\n * OP-Betrag EINSCHLIESSLICH Differenz (api.md G2).\n */\nexport class Settlement {\n constructor(\n readonly entryId: Uuid,\n readonly money: Money,\n readonly settledAt: CalendarDate,\n readonly differenceMoney: Money | null = null,\n readonly differenceKind: SettlementDifferenceKind | null = null,\n ) {}\n\n toJSON(): Record<string, unknown> {\n return {\n entryId: this.entryId.value,\n money: this.money.toJSON(),\n settledAt: this.settledAt.iso,\n difference:\n this.differenceMoney === null\n ? null\n : { money: this.differenceMoney.toJSON(), kind: this.differenceKind },\n };\n }\n}\n","import type { JournalEntry } from './journal-entry.js';\n\n/**\n * Ergebnis von `post`: die Buchung plus die dabei entstandenen offenen Posten\n * (AR/AP-Automatik — folgt mit dem Open-Items-Slice, daher vorerst leer).\n */\nexport class PostResult {\n constructor(\n readonly entry: JournalEntry,\n readonly openItemsCreated: unknown[],\n ) {}\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountNumber } from '../shared/account-number.js';\nimport type { DimensionValue } from '../shared/dimension-value.js';\n\ninterface DimensionRule {\n readonly from: string;\n readonly to: string;\n readonly required: string;\n}\n\nexport interface DimensionTypeData {\n readonly code: string;\n}\nexport interface DimensionValueData {\n readonly typeCode: string;\n readonly code: string;\n}\nexport interface DimensionRuleData {\n readonly accountRange: { from: string; to: string };\n readonly requiredDimension: string;\n}\n\n/**\n * Dimensions-Validierung: Mechanik im Kern, Inhalte als Regelmodul-Daten\n * (ledger-modell.md). Typen/Werte sind Stammdaten; Pflichtdimensionen kommen\n * aus `ruleModules.dimensionRules`.\n */\nexport class DimensionRegistry {\n private constructor(\n private readonly types: ReadonlySet<string>,\n private readonly values: ReadonlySet<string>,\n private readonly rules: readonly DimensionRule[],\n ) {}\n\n static empty(): DimensionRegistry {\n return new DimensionRegistry(new Set(), new Set(), []);\n }\n\n static fromData(\n dimensionTypes: DimensionTypeData[],\n dimensionValues: DimensionValueData[],\n dimensionRules: DimensionRuleData[],\n ): DimensionRegistry {\n const types = new Set(dimensionTypes.map((t) => t.code));\n const values = new Set(dimensionValues.map((v) => `${v.typeCode}:${v.code}`));\n const rules = dimensionRules.map((r) => ({\n from: r.accountRange.from,\n to: r.accountRange.to,\n required: r.requiredDimension,\n }));\n return new DimensionRegistry(types, values, rules);\n }\n\n validateLine(account: AccountNumber, dimensions: DimensionValue[]): void {\n for (const dimension of dimensions) {\n if (!this.types.has(dimension.type)) {\n throw new DomainError('E_DIMENSION_INVALID', `Unbekannter Dimensionstyp \"${dimension.type}\"`, {\n type: dimension.type,\n });\n }\n if (!this.values.has(`${dimension.type}:${dimension.code}`)) {\n throw new DomainError(\n 'E_DIMENSION_INVALID',\n `Unbekannter Dimensionswert \"${dimension.code}\" für Typ \"${dimension.type}\"`,\n { type: dimension.type, code: dimension.code },\n );\n }\n }\n\n for (const rule of this.rules) {\n const inRange = account.value >= rule.from && account.value <= rule.to;\n if (!inRange) continue;\n if (dimensions.some((d) => d.type === rule.required)) continue;\n throw new DomainError(\n 'E_DIMENSION_INVALID',\n `Pflichtdimension \"${rule.required}\" fehlt auf Konto ${account.value}`,\n { account: account.value, required: rule.required },\n );\n }\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type {\n AccountRepository,\n AuditTrail,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n VoucherRepository,\n} from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Clock } from '../shared/clock.js';\nimport type { Currency } from '../shared/currency.js';\nimport { DimensionValue } from '../shared/dimension-value.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Money } from '../shared/money.js';\nimport { PeriodRef } from '../shared/period-ref.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { Account } from './account.js';\nimport { AuditRecord, type AuditChanges } from './audit-record.js';\nimport { DimensionRegistry } from './dimension-registry.js';\nimport { EntryLine } from './entry-line.js';\nimport { FiscalYear } from './fiscal-year.js';\nimport { JournalEntry } from './journal-entry.js';\nimport { OpenItem } from './open-item.js';\nimport { PostResult } from './post-result.js';\nimport { Settlement } from './settlement.js';\nimport {\n isAccountType,\n type OpenItemKind,\n parseSettlementDifferenceKind,\n type SettlementDifferenceKind,\n type Side,\n} from './types.js';\nimport type { Voucher } from './voucher.js';\n\ninterface ParsedLine {\n readonly account: string;\n readonly side: Side;\n readonly money: Money;\n readonly dimensions: DimensionValue[];\n readonly taxTag: Record<string, unknown> | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * Domain Service `post` und Verwandte (ledger-modell.md). Prüfreihenfolge beim\n * Buchen ist Vertragsbestandteil (api.md):\n * 1. Struktur (E_ENTRY_TOO_FEW_LINES, E_ENTRY_INVALID_AMOUNT)\n * 2. Referenzen (E_ENTRY_NO_VOUCHER, E_VOUCHER_UNKNOWN, E_ACCOUNT_UNKNOWN,\n * E_ACCOUNT_LOCKED, E_DIMENSION_INVALID)\n * 3. Bilanzgleichung (E_ENTRY_UNBALANCED)\n * 4. Zeitlicher Kontext (E_PERIOD_UNKNOWN, E_PERIOD_CLOSED)\n * Nur der erste Fehler wird gemeldet.\n */\nexport class Ledger {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly fiscalYears: FiscalYearRepository,\n private readonly vouchers: VoucherRepository,\n private readonly journal: JournalRepository,\n private readonly openItems: OpenItemRepository,\n private readonly audit: AuditTrail,\n private readonly dimensions: DimensionRegistry,\n private readonly clock: Clock,\n private readonly ids: IdGenerator,\n ) {}\n\n post(input: Record<string, unknown>): PostResult {\n const actor = this.actor(input);\n\n // 1. Struktur\n const rawLines = input.lines;\n if (!Array.isArray(rawLines) || rawLines.length < 2) {\n throw new DomainError('E_ENTRY_TOO_FEW_LINES', 'Eine Buchung braucht mindestens zwei Positionen');\n }\n const parsed = rawLines.map((rawLine, index) => {\n if (!isRecord(rawLine)) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index} ist keine Struktur`);\n }\n return this.parseLine(rawLine, index);\n });\n\n // 2. Referenzen\n const voucher = this.requireVoucher(input.voucherId);\n const lines = this.resolveLines(parsed);\n\n // 3. Bilanzgleichung\n this.assertBalanced(lines);\n\n // 4. Zeitlicher Kontext\n const entryDate = this.parseEntryDate(input.entryDate);\n const [fiscalYear, period] = this.openPeriodFor(entryDate);\n\n const text = asString(input.text) ?? '';\n\n const entry = new JournalEntry(\n this.ids.next(),\n this.journal.nextSequenceNumber(fiscalYear.year),\n entryDate,\n voucher.voucherDate,\n this.now(),\n new PeriodRef(fiscalYear.year, period.number),\n voucher.id,\n text,\n lines,\n );\n\n this.journal.append(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'created');\n\n return new PostResult(entry, this.createOpenItems(entry));\n }\n\n /**\n * AR/AP-Automatik: Soll auf Forderungskonto → receivable, Haben auf\n * Verbindlichkeitskonto → payable. Stornobuchungen erzeugen keine Posten.\n */\n private createOpenItems(entry: JournalEntry): OpenItem[] {\n if (entry.reverses !== null) return [];\n\n const created: OpenItem[] = [];\n const voucher = this.vouchers.byId(entry.voucherId);\n\n entry.lines().forEach((line, index) => {\n const account = this.accounts.byId(line.accountId);\n let kind: OpenItemKind | null = null;\n if (account?.subtype === 'ar' && line.side === 'debit') kind = 'receivable';\n else if (account?.subtype === 'ap' && line.side === 'credit') kind = 'payable';\n if (kind === null) return;\n\n const item = new OpenItem(\n this.ids.next(),\n kind,\n entry.id,\n index,\n line.money,\n entry.voucherId,\n entry.entryDate,\n voucher?.partnerId ?? null,\n );\n this.openItems.add(item);\n created.push(item);\n });\n\n return created;\n }\n\n /**\n * Ausgleich: Zuordnung Zahlung → offene(r) Posten, auch teilweise; immer\n * explizit, kein FIFO (determinismus.md §3). Differenzen (Skonto/Ausfall/\n * Kleindifferenz) nach api.md G2. Erst vollständig validieren, dann anwenden.\n */\n settle(input: Record<string, unknown>): OpenItem[] {\n const actor = this.actor(input);\n const entry = this.requireEntry(input.entryId);\n\n const allocations = Array.isArray(input.allocations) ? input.allocations : [];\n if (allocations.length === 0) {\n throw new DomainError('E_OPENITEM_UNKNOWN', 'settle ohne Zuordnungen');\n }\n\n const plan: Array<{ item: OpenItem; settlement: Settlement }> = [];\n const planned = new Map<string, Money>();\n\n for (const allocation of allocations) {\n if (!isRecord(allocation)) {\n throw new DomainError('E_OPENITEM_UNKNOWN', 'Zuordnung ist keine Struktur');\n }\n const openItemId = allocation.openItemId;\n let item: OpenItem | null = null;\n if (typeof openItemId === 'string') {\n try {\n item = this.openItems.byId(Uuid.fromString(openItemId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (item === null) {\n throw new DomainError(\n 'E_OPENITEM_UNKNOWN',\n `Offener Posten ${typeof openItemId === 'string' ? openItemId : '?'} existiert nicht`,\n );\n }\n\n const money = this.parseSettlementMoney(allocation.money, 'Zuordnungsbetrag');\n const [differenceMoney, differenceKind] = this.parseDifference(allocation.difference ?? null, item);\n\n const alreadyPlanned = planned.get(item.id.value) ?? Money.zero(this.baseCurrency);\n if (money.add(alreadyPlanned).compareTo(item.remaining()) > 0) {\n throw new DomainError(\n 'E_SETTLEMENT_EXCEEDS_ITEM',\n `Zuordnung ${money.amountAsString()} übersteigt Restbetrag ${item\n .remaining()\n .subtract(alreadyPlanned)\n .amountAsString()} des Postens ${item.id.value}`,\n { openItemId: item.id.value },\n );\n }\n\n planned.set(item.id.value, money.add(alreadyPlanned));\n plan.push({\n item,\n settlement: new Settlement(entry.id, money, entry.entryDate, differenceMoney, differenceKind),\n });\n }\n\n const affected: OpenItem[] = [];\n for (const step of plan) {\n const before = step.item.remaining().amountAsString();\n step.item.settle(step.settlement);\n this.openItems.save(step.item);\n this.recordAudit(actor, 'openItem', step.item.id, 'settled', {\n remaining: { from: before, to: step.item.remaining().amountAsString() },\n });\n affected.push(step.item);\n }\n\n return affected;\n }\n\n private parseSettlementMoney(raw: unknown, label: string): Money {\n const amount = isRecord(raw) ? asString(raw.amount) : null;\n const currency = isRecord(raw) ? asString(raw.currency) : null;\n if (amount === null || currency !== this.baseCurrency.code) {\n throw new InvalidValue(`${label} fehlt oder falsche Währung`);\n }\n const money = Money.of(amount, this.baseCurrency);\n if (!money.isPositive()) {\n throw new InvalidValue(`${label} muss > 0 sein`);\n }\n return money;\n }\n\n private parseDifference(\n raw: unknown,\n item: OpenItem,\n ): [Money | null, SettlementDifferenceKind | null] {\n if (raw === null) return [null, null];\n if (!isRecord(raw)) {\n throw new DomainError('E_SETTLEMENT_DIFFERENCE_INVALID', 'difference ist keine Struktur');\n }\n const kind = parseSettlementDifferenceKind(raw.kind);\n if (kind === null) {\n throw new DomainError(\n 'E_SETTLEMENT_DIFFERENCE_INVALID',\n `Unbekannte Differenzart \"${typeof raw.kind === 'string' ? raw.kind : '?'}\"`,\n );\n }\n let money: Money;\n try {\n money = this.parseSettlementMoney(raw.money, 'Differenzbetrag');\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_SETTLEMENT_DIFFERENCE_INVALID', 'Differenzbetrag ungültig (≤ 0 oder Format)');\n }\n throw error;\n }\n if (money.compareTo(item.remaining()) > 0) {\n throw new DomainError(\n 'E_SETTLEMENT_DIFFERENCE_INVALID',\n `Differenz ${money.amountAsString()} übersteigt Restbetrag ${item.remaining().amountAsString()}`,\n );\n }\n return [money, kind];\n }\n\n correct(input: Record<string, unknown>): JournalEntry {\n const actor = this.actor(input);\n const entry = this.requireEntry(input.entryId);\n const changes: AuditChanges = {};\n\n const text = asString(input.text);\n if (text !== null && text !== entry.text()) {\n changes.text = { from: entry.text(), to: text };\n entry.changeText(text);\n }\n\n if (Array.isArray(input.lines)) {\n if (input.lines.length < 2) {\n throw new DomainError('E_ENTRY_TOO_FEW_LINES', 'Eine Buchung braucht mindestens zwei Positionen');\n }\n const parsed = input.lines.map((rawLine, index) => {\n if (!isRecord(rawLine)) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index} ist keine Struktur`);\n }\n return this.parseLine(rawLine, index);\n });\n const lines = this.resolveLines(parsed);\n this.assertBalanced(lines);\n\n changes.lines = {\n from: entry.lines().map((line) => line.toJSON()),\n to: lines.map((line) => line.toJSON()),\n };\n entry.changeLines(lines);\n }\n\n if (Object.keys(changes).length > 0) {\n this.journal.save(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'corrected', changes);\n } else {\n // Statusprüfung auch ohne effektive Änderung (E_ENTRY_FINALIZED).\n entry.changeText(entry.text());\n }\n\n return entry;\n }\n\n finalize(input: Record<string, unknown>): number {\n const actor = this.actor(input);\n\n if (input.entryId !== undefined) {\n const entry = this.requireEntry(input.entryId);\n if (entry.isFinalized()) return 0;\n entry.finalize();\n this.journal.save(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'finalized', {\n status: { from: 'entered', to: 'finalized' },\n });\n return 1;\n }\n\n const until = input.finalizeUntil;\n if (typeof until !== 'string') {\n throw new DomainError('E_ENTRY_UNKNOWN', 'finalize braucht entryId oder finalizeUntil');\n }\n const untilDate = this.parseEntryDate(until);\n let count = 0;\n\n for (const entry of this.journal.all()) {\n if (entry.isFinalized() || entry.entryDate.isAfter(untilDate)) continue;\n entry.finalize();\n this.journal.save(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'finalized', {\n status: { from: 'entered', to: 'finalized' },\n });\n count++;\n }\n return count;\n }\n\n reverse(input: Record<string, unknown>): JournalEntry {\n const actor = this.actor(input);\n const original = this.requireEntry(input.entryId);\n\n if (original.reversedBy() !== null) {\n throw new DomainError('E_ENTRY_ALREADY_REVERSED', `Buchung ${original.id.value} ist bereits storniert`, {\n entryId: original.id.value,\n });\n }\n\n const entryDate = this.parseEntryDate(input.entryDate);\n const [fiscalYear, period] = this.openPeriodFor(entryDate);\n const text = asString(input.text) ?? `Storno ${original.sequenceNumber}`;\n\n const reversal = new JournalEntry(\n this.ids.next(),\n this.journal.nextSequenceNumber(fiscalYear.year),\n entryDate,\n original.voucherDate,\n this.now(),\n new PeriodRef(fiscalYear.year, period.number),\n original.voucherId,\n text,\n original.lines().map((line) => line.negated()),\n original.id,\n );\n\n original.markReversed(reversal.id);\n this.journal.append(reversal);\n this.journal.save(original);\n\n this.recordAudit(actor, 'journalEntry', reversal.id, 'created');\n this.recordAudit(actor, 'journalEntry', original.id, 'reversed', {\n reversedBy: { from: null, to: reversal.id.value },\n });\n\n return reversal;\n }\n\n closePeriod(input: Record<string, unknown>): { fiscalYear: number; period: number; status: string } {\n const fiscalYear = this.requireFiscalYear(input.fiscalYear);\n const period = fiscalYear.closePeriod(this.periodNumber(input));\n this.fiscalYears.save(fiscalYear);\n return { fiscalYear: fiscalYear.year, period: period.number, status: period.status() };\n }\n\n reopenPeriod(input: Record<string, unknown>): { fiscalYear: number; period: number; status: string } {\n const fiscalYear = this.requireFiscalYear(input.fiscalYear);\n const period = fiscalYear.reopenPeriod(this.periodNumber(input));\n this.fiscalYears.save(fiscalYear);\n return { fiscalYear: fiscalYear.year, period: period.number, status: period.status() };\n }\n\n closeFiscalYear(input: Record<string, unknown>): FiscalYear {\n const fiscalYear = this.requireFiscalYear(input.fiscalYear);\n for (const entry of this.journal.forFiscalYear(fiscalYear.year)) {\n if (!entry.isFinalized()) {\n throw new DomainError(\n 'E_FISCALYEAR_UNFINALIZED_ENTRIES',\n `Jahresabschluss ${fiscalYear.year}: Buchung ${entry.sequenceNumber} ist nicht festgeschrieben`,\n { fiscalYear: fiscalYear.year, sequenceNumber: entry.sequenceNumber },\n );\n }\n }\n fiscalYear.close();\n this.fiscalYears.save(fiscalYear);\n return fiscalYear;\n }\n\n createFiscalYear(input: Record<string, unknown>): FiscalYear {\n const year = typeof input.year === 'number' ? input.year : 0;\n const start = this.parseEntryDate(input.start);\n const end = this.parseEntryDate(input.end);\n\n for (const existing of this.fiscalYears.all()) {\n const overlaps = !existing.end.isBefore(start) && !existing.start.isAfter(end);\n if (overlaps || existing.year === year) {\n throw new DomainError(\n 'E_FISCALYEAR_OVERLAP',\n `Geschäftsjahr ${year} (${start.iso} bis ${end.iso}) überschneidet sich mit ${existing.year}`,\n { year, existing: existing.year },\n );\n }\n }\n\n const fiscalYear = FiscalYear.create(this.ids.next(), year, start, end);\n this.fiscalYears.add(fiscalYear);\n return fiscalYear;\n }\n\n createAccount(input: Record<string, unknown>): Account {\n const actor = this.actor(input);\n const account = this.buildAccount(input);\n\n if (this.accounts.byNumber(account.number) !== null) {\n throw new DomainError('E_ACCOUNT_NUMBER_TAKEN', `Kontonummer ${account.number.value} ist bereits vergeben`, {\n number: account.number.value,\n });\n }\n\n this.accounts.add(account);\n this.recordAudit(actor, 'account', account.id, 'created');\n return account;\n }\n\n lockAccount(input: Record<string, unknown>): Account {\n const actor = this.actor(input);\n const number = asString(input.number) ?? '';\n const account = this.accounts.byNumber(AccountNumber.of(number));\n\n if (account === null) {\n throw new DomainError('E_ACCOUNT_UNKNOWN', `Konto ${number} existiert nicht`, { number });\n }\n\n const before = account.status();\n account.lock();\n this.accounts.save(account);\n this.recordAudit(actor, 'account', account.id, 'locked', {\n status: { from: before, to: account.status() },\n });\n return account;\n }\n\n importChartOfAccounts(input: Record<string, unknown>): number {\n const actor = this.actor(input);\n const rows = input.rows;\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new DomainError('E_COA_FORMAT_INVALID', 'Import ohne Zeilen');\n }\n\n const accounts: Account[] = [];\n const numbers = new Set<string>();\n\n rows.forEach((row, index) => {\n if (!isRecord(row)) {\n throw new DomainError('E_COA_FORMAT_INVALID', `Zeile ${index} ist keine Struktur`);\n }\n let account: Account;\n try {\n account = this.buildAccount(row);\n } catch (error) {\n if (error instanceof DomainError) {\n throw new DomainError('E_COA_FORMAT_INVALID', `Zeile ${index} ist nicht parsebar`, { row: index });\n }\n throw error;\n }\n if (numbers.has(account.number.value) || this.accounts.byNumber(account.number) !== null) {\n throw new DomainError('E_ACCOUNT_NUMBER_TAKEN', `Kontonummer ${account.number.value} ist bereits vergeben`, {\n number: account.number.value,\n });\n }\n numbers.add(account.number.value);\n accounts.push(account);\n });\n\n for (const account of accounts) {\n this.accounts.add(account);\n this.recordAudit(actor, 'account', account.id, 'created');\n }\n return accounts.length;\n }\n\n // ---- intern ----------------------------------------------------------\n\n private actor(input: Record<string, unknown>): string {\n const actor = asString(input.actor);\n return actor !== null && actor !== '' ? actor : 'system';\n }\n\n private parseLine(rawLine: Record<string, unknown>, index: number): ParsedLine {\n const money = rawLine.money;\n const amount = isRecord(money) ? asString(money.amount) : null;\n const currency = isRecord(money) ? asString(money.currency) : null;\n\n if (amount === null || currency === null) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index}: money fehlt oder unvollständig`);\n }\n if (currency !== this.baseCurrency.code) {\n throw new DomainError(\n 'E_ENTRY_INVALID_AMOUNT',\n `Position ${index}: Fremdwährung ${currency} — v1 bucht nur Mandantenwährung ${this.baseCurrency.code}`,\n { currency },\n );\n }\n\n let parsedMoney: Money;\n try {\n parsedMoney = Money.of(amount, this.baseCurrency);\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError(\n 'E_ENTRY_INVALID_AMOUNT',\n `Position ${index}: Betrag \"${amount}\" ist kein gültiger ${this.baseCurrency.code}-Betrag`,\n { amount },\n );\n }\n throw error;\n }\n if (!parsedMoney.isPositive()) {\n throw new DomainError(\n 'E_ENTRY_INVALID_AMOUNT',\n `Position ${index}: Betrag muss > 0 sein (negative Beträge nur bei Storno)`,\n { amount },\n );\n }\n\n const side = rawLine.side;\n if (side !== 'debit' && side !== 'credit') {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index}: side muss debit oder credit sein`);\n }\n\n const account = asString(rawLine.account);\n if (account === null || account === '') {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index}: account fehlt`);\n }\n\n const dimensions: DimensionValue[] = [];\n const rawDimensions = Array.isArray(rawLine.dimensions) ? rawLine.dimensions : [];\n for (const rawDimension of rawDimensions) {\n if (!isRecord(rawDimension) || typeof rawDimension.type !== 'string' || typeof rawDimension.code !== 'string') {\n throw new DomainError('E_DIMENSION_INVALID', `Position ${index}: Dimension unvollständig`);\n }\n dimensions.push(DimensionValue.of(rawDimension.type, rawDimension.code));\n }\n\n const taxTag = isRecord(rawLine.taxTag) ? rawLine.taxTag : null;\n\n return { account, side, money: parsedMoney, dimensions, taxTag };\n }\n\n private requireVoucher(voucherId: unknown): Voucher {\n if (typeof voucherId !== 'string' || voucherId === '') {\n throw new DomainError('E_ENTRY_NO_VOUCHER', 'Keine Buchung ohne Beleg (F-CORE-003)');\n }\n let voucher: Voucher | null = null;\n try {\n voucher = this.vouchers.byId(Uuid.fromString(voucherId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n if (voucher === null) {\n throw new DomainError('E_VOUCHER_UNKNOWN', `Beleg ${voucherId} existiert nicht`, { voucherId });\n }\n return voucher;\n }\n\n private resolveLines(parsed: ParsedLine[]): EntryLine[] {\n const lines = parsed.map((line) => {\n const number = AccountNumber.of(line.account);\n const account = this.accounts.byNumber(number);\n if (account === null) {\n throw new DomainError('E_ACCOUNT_UNKNOWN', `Konto ${number.value} existiert nicht`, { number: number.value });\n }\n if (account.isLocked()) {\n throw new DomainError('E_ACCOUNT_LOCKED', `Konto ${number.value} ist gesperrt`, { number: number.value });\n }\n return new EntryLine(account.id, account.number, line.side, line.money, line.dimensions, line.taxTag);\n });\n\n for (const line of lines) {\n this.dimensions.validateLine(line.account, line.dimensions);\n }\n return lines;\n }\n\n private assertBalanced(lines: EntryLine[]): void {\n let debit = Money.zero(this.baseCurrency);\n let credit = Money.zero(this.baseCurrency);\n for (const line of lines) {\n if (line.side === 'debit') debit = debit.add(line.money);\n else credit = credit.add(line.money);\n }\n if (!debit.equals(credit)) {\n throw new DomainError(\n 'E_ENTRY_UNBALANCED',\n `Σ Soll (${debit.amountAsString()}) ≠ Σ Haben (${credit.amountAsString()})`,\n { debit: debit.amountAsString(), credit: credit.amountAsString() },\n );\n }\n }\n\n private parseEntryDate(entryDate: unknown): CalendarDate {\n if (typeof entryDate !== 'string') {\n throw new DomainError('E_PERIOD_UNKNOWN', 'entryDate fehlt');\n }\n try {\n return CalendarDate.of(entryDate);\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_PERIOD_UNKNOWN', `Ungültiges Buchungsdatum \"${entryDate}\"`);\n }\n throw error;\n }\n }\n\n private openPeriodFor(entryDate: CalendarDate): [FiscalYear, ReturnType<FiscalYear['periodForDate']>] {\n const fiscalYear = this.fiscalYears.forDate(entryDate);\n if (fiscalYear === null) {\n throw new DomainError(\n 'E_PERIOD_UNKNOWN',\n `Buchungsdatum ${entryDate.iso} liegt außerhalb angelegter Geschäftsjahre`,\n { date: entryDate.iso },\n );\n }\n const period = fiscalYear.periodForDate(entryDate);\n if (fiscalYear.isClosed() || !period.isOpen()) {\n throw new DomainError('E_PERIOD_CLOSED', `Periode ${fiscalYear.year}/${period.number} ist geschlossen`, {\n fiscalYear: fiscalYear.year,\n period: period.number,\n });\n }\n return [fiscalYear, period];\n }\n\n private requireEntry(entryId: unknown): JournalEntry {\n let entry: JournalEntry | null = null;\n if (typeof entryId === 'string' && entryId !== '') {\n try {\n entry = this.journal.byId(Uuid.fromString(entryId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (entry === null) {\n throw new DomainError('E_ENTRY_UNKNOWN', `Buchung ${typeof entryId === 'string' ? entryId : '?'} existiert nicht`);\n }\n return entry;\n }\n\n private requireFiscalYear(year: unknown): FiscalYear {\n const fiscalYear = typeof year === 'number' ? this.fiscalYears.byYear(year) : null;\n if (fiscalYear === null) {\n throw new DomainError('E_PERIOD_UNKNOWN', `Geschäftsjahr ${typeof year === 'number' ? year : '?'} ist nicht angelegt`);\n }\n return fiscalYear;\n }\n\n private periodNumber(input: Record<string, unknown>): number {\n const period = input.period;\n if (typeof period !== 'number' || !Number.isInteger(period)) {\n throw new DomainError('E_PERIOD_UNKNOWN', 'Periodennummer fehlt');\n }\n return period;\n }\n\n private buildAccount(input: Record<string, unknown>): Account {\n const number = asString(input.number);\n const name = asString(input.name);\n const type = input.type;\n\n if (number === null || number === '' || name === null || name === '' || !isAccountType(type)) {\n throw new DomainError('E_COA_FORMAT_INVALID', 'Konto braucht number, name und gültigen type');\n }\n\n const subtype = asString(input.subtype);\n const status = input.status === 'locked' ? 'locked' : 'active';\n\n return new Account(this.ids.next(), AccountNumber.of(number), name, type, subtype, status);\n }\n\n private recordAudit(\n actor: string,\n objectType: string,\n objectId: Uuid,\n action: string,\n changes: AuditChanges = {},\n ): void {\n this.audit.append(new AuditRecord(this.ids.next(), this.now(), actor, objectType, objectId, action, changes));\n }\n\n private now(): string {\n return this.clock.now().toISOString();\n }\n}\n","import type {\n AccountRepository,\n AssetRepository,\n AuditTrail,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n PartnerRepository,\n VoucherRepository,\n} from './port.js';\nimport type { Asset } from './assets/asset.js';\nimport type { Partner } from './partner/partner.js';\nimport type { AccountNumber } from './shared/account-number.js';\nimport type { CalendarDate } from './shared/calendar-date.js';\nimport type { Uuid } from './shared/uuid.js';\nimport type { Account } from './ledger/account.js';\nimport type { AuditRecord } from './ledger/audit-record.js';\nimport type { FiscalYear } from './ledger/fiscal-year.js';\nimport type { JournalEntry } from './ledger/journal-entry.js';\nimport type { OpenItem } from './ledger/open-item.js';\nimport type { Voucher } from './ledger/voucher.js';\n\nexport class InMemoryAccountRepository implements AccountRepository {\n private readonly byNumberMap = new Map<string, Account>();\n private readonly byIdMap = new Map<string, Account>();\n\n add(account: Account): void {\n if (this.byNumberMap.has(account.number.value)) {\n throw new Error(`Repository-Kontrakt verletzt: Kontonummer ${account.number.value} doppelt`);\n }\n this.byNumberMap.set(account.number.value, account);\n this.byIdMap.set(account.id.value, account);\n }\n\n save(_account: Account): void {\n // In-Memory: Objektidentität genügt.\n }\n\n byNumber(number: AccountNumber): Account | null {\n return this.byNumberMap.get(number.value) ?? null;\n }\n\n byId(id: Uuid): Account | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Account[] {\n return [...this.byNumberMap.values()].sort((a, b) => a.number.compareTo(b.number));\n }\n}\n\nexport class InMemoryFiscalYearRepository implements FiscalYearRepository {\n private readonly byYearMap = new Map<number, FiscalYear>();\n\n add(fiscalYear: FiscalYear): void {\n this.byYearMap.set(fiscalYear.year, fiscalYear);\n }\n\n save(_fiscalYear: FiscalYear): void {}\n\n byYear(year: number): FiscalYear | null {\n return this.byYearMap.get(year) ?? null;\n }\n\n forDate(date: CalendarDate): FiscalYear | null {\n for (const fiscalYear of this.byYearMap.values()) {\n if (fiscalYear.contains(date)) return fiscalYear;\n }\n return null;\n }\n\n all(): FiscalYear[] {\n return [...this.byYearMap.values()].sort((a, b) => a.year - b.year);\n }\n}\n\nexport class InMemoryJournalRepository implements JournalRepository {\n private readonly entries: JournalEntry[] = [];\n private readonly byIdMap = new Map<string, JournalEntry>();\n private readonly sequences = new Map<number, number>();\n\n append(entry: JournalEntry): void {\n this.entries.push(entry);\n this.byIdMap.set(entry.id.value, entry);\n this.sequences.set(entry.periodRef.fiscalYear, entry.sequenceNumber);\n }\n\n save(_entry: JournalEntry): void {}\n\n byId(id: Uuid): JournalEntry | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n nextSequenceNumber(fiscalYear: number): number {\n return (this.sequences.get(fiscalYear) ?? 0) + 1;\n }\n\n all(): JournalEntry[] {\n return [...this.entries].sort((a, b) =>\n a.periodRef.fiscalYear !== b.periodRef.fiscalYear\n ? a.periodRef.fiscalYear - b.periodRef.fiscalYear\n : a.sequenceNumber - b.sequenceNumber,\n );\n }\n\n forFiscalYear(fiscalYear: number): JournalEntry[] {\n return this.entries\n .filter((entry) => entry.periodRef.fiscalYear === fiscalYear)\n .sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n }\n}\n\nexport class InMemoryVoucherRepository implements VoucherRepository {\n private readonly byIdMap = new Map<string, Voucher>();\n\n add(voucher: Voucher): void {\n this.byIdMap.set(voucher.id.value, voucher);\n }\n\n byId(id: Uuid): Voucher | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Voucher[] {\n return [...this.byIdMap.values()].sort((a, b) =>\n a.id.value < b.id.value ? -1 : a.id.value > b.id.value ? 1 : 0,\n );\n }\n}\n\nexport class InMemoryOpenItemRepository implements OpenItemRepository {\n private readonly items: OpenItem[] = [];\n private readonly byIdMap = new Map<string, OpenItem>();\n\n add(item: OpenItem): void {\n this.items.push(item);\n this.byIdMap.set(item.id.value, item);\n }\n\n save(_item: OpenItem): void {}\n\n byId(id: Uuid): OpenItem | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n byOriginEntry(entryId: Uuid): OpenItem[] {\n return this.items.filter((item) => item.originEntryId.equals(entryId));\n }\n\n all(): OpenItem[] {\n return [...this.items];\n }\n}\n\nexport class InMemoryAuditTrail implements AuditTrail {\n private readonly records: AuditRecord[] = [];\n\n append(record: AuditRecord): void {\n this.records.push(record);\n }\n\n all(): AuditRecord[] {\n return [...this.records];\n }\n}\n\nexport class InMemoryPartnerRepository implements PartnerRepository {\n private readonly byIdMap = new Map<string, Partner>();\n\n add(partner: Partner): void {\n this.byIdMap.set(partner.id.value, partner);\n }\n\n save(_partner: Partner): void {}\n\n byId(id: Uuid): Partner | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Partner[] {\n return [...this.byIdMap.values()].sort((a, b) => {\n const byName = a.name() < b.name() ? -1 : a.name() > b.name() ? 1 : 0;\n return byName !== 0 ? byName : a.id.value < b.id.value ? -1 : a.id.value > b.id.value ? 1 : 0;\n });\n }\n}\n\nexport class InMemoryAssetRepository implements AssetRepository {\n private readonly items: Asset[] = [];\n private readonly byIdMap = new Map<string, Asset>();\n\n add(asset: Asset): void {\n this.items.push(asset);\n this.byIdMap.set(asset.id.value, asset);\n }\n\n save(_asset: Asset): void {}\n\n byId(id: Uuid): Asset | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Asset[] {\n return [...this.items];\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { AssetRoute } from './asset-route.js';\n\ninterface Depreciation {\n planMonth: number;\n date: CalendarDate;\n amount: Money;\n entryId: Uuid;\n}\n\n/** Letzter Tag des Monats `monthsToAdd` nach `base` (1-basierte Planmonate). */\nfunction lastDayOfMonthAfter(base: CalendarDate, monthsToAdd: number): CalendarDate {\n const totalMonth0 = base.month() - 1 + monthsToAdd;\n const year = base.year() + Math.floor(totalMonth0 / 12);\n const month0 = ((totalMonth0 % 12) + 12) % 12;\n const lastDay = new Date(Date.UTC(year, month0 + 1, 0)).getUTCDate();\n return CalendarDate.of(\n `${String(year).padStart(4, '0')}-${String(month0 + 1).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`,\n );\n}\n\n/**\n * Anlagegut (assets-modell.md): Stammdaten + AfA-Plan + Lebenslauf. Invarianten:\n * Restbuchwert = AHK − Σ Abschreibungen, nie < 0; keine AfA vor Zugang/nach Abgang.\n */\nexport class Asset {\n private readonly depreciations: Depreciation[] = [];\n private disposed = false;\n private disposedOn: CalendarDate | null = null;\n\n constructor(\n readonly id: Uuid,\n readonly name: string,\n readonly assetClass: string,\n readonly assetAccount: AccountNumber,\n readonly acquisitionCost: Money,\n readonly acquiredOn: CalendarDate,\n readonly route: AssetRoute,\n readonly usefulLifeMonths: number | null,\n readonly monthlySchedule: Money[],\n readonly voucherId: Uuid,\n ) {}\n\n isDisposed(): boolean {\n return this.disposed;\n }\n\n assertActive(): void {\n if (this.disposed) {\n throw new DomainError(\n 'E_ASSET_DISPOSED',\n `Anlagegut ${this.id.value} ist bereits abgegangen (${this.disposedOn?.iso ?? '?'})`,\n { assetId: this.id.value },\n );\n }\n }\n\n dispose(disposedOn: CalendarDate): void {\n this.assertActive();\n this.disposed = true;\n this.disposedOn = disposedOn;\n }\n\n planMonthDate(planMonth: number): CalendarDate {\n return lastDayOfMonthAfter(this.acquiredOn, planMonth - 1);\n }\n\n isMonthBooked(planMonth: number): boolean {\n return this.depreciations.some((booking) => booking.planMonth === planMonth);\n }\n\n recordDepreciation(planMonth: number, date: CalendarDate, amount: Money, entryId: Uuid): void {\n this.depreciations.push({ planMonth, date, amount, entryId });\n }\n\n accumulatedDepreciationAt(asOf: CalendarDate | null): Money {\n let sum = this.acquisitionCost.subtract(this.acquisitionCost); // 0 in Mandantenwährung\n for (const booking of this.depreciations) {\n if (asOf !== null && booking.date.isAfter(asOf)) continue;\n sum = sum.add(booking.amount);\n }\n return sum;\n }\n\n bookValueAt(asOf: CalendarDate | null): Money {\n if (this.route !== 'capitalize') return this.acquisitionCost.subtract(this.acquisitionCost);\n return this.acquisitionCost.subtract(this.accumulatedDepreciationAt(asOf));\n }\n\n scheduleSummary(): Record<string, string> {\n if (this.monthlySchedule.length === 0) return {};\n\n const summary: Record<string, string> = {};\n let total = this.acquisitionCost.subtract(this.acquisitionCost);\n let runStart = 1;\n\n this.monthlySchedule.forEach((amount, index) => {\n total = total.add(amount);\n const isLast = index === this.monthlySchedule.length - 1;\n const next = isLast ? null : this.monthlySchedule[index + 1]!;\n if (next !== null && next.equals(amount)) return;\n summary[`months${runStart}to${index + 1}`] = amount.amountAsString();\n runStart = index + 2;\n });\n\n summary.total = total.amountAsString();\n return summary;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n name: this.name,\n assetClass: this.assetClass,\n assetAccount: this.assetAccount.value,\n route: this.route,\n acquisitionCost: this.acquisitionCost.toJSON(),\n acquiredOn: this.acquiredOn.iso,\n usefulLifeMonths: this.usefulLifeMonths,\n status: this.disposed ? 'disposed' : 'active',\n disposedOn: this.disposedOn?.iso ?? null,\n voucherId: this.voucherId.value,\n };\n }\n}\n","/** GWG-Weiche (SF-05): drei Pfade; die Grenzen sind Regelmodul-Daten. */\nexport type AssetRoute = 'capitalize' | 'immediate_expense' | 'pool';\n\nexport function parseAssetRoute(value: unknown): AssetRoute | null {\n return value === 'capitalize' || value === 'immediate_expense' || value === 'pool' ? value : null;\n}\n","import { DomainError } from '../domain-error.js';\nimport type { Ledger } from '../ledger/ledger.js';\nimport { Voucher } from '../ledger/voucher.js';\nimport type { AssetRepository, FiscalYearRepository, VoucherRepository } from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Money } from '../shared/money.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { Asset } from './asset.js';\nimport { type AssetRoute, parseAssetRoute } from './asset-route.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\ninterface Threshold {\n validFrom: string;\n validTo: string | null;\n immediateMax: string;\n poolMin: string | null;\n poolMax: string | null;\n}\n\n/**\n * Anlagen-Nebenbuch (assets-modell.md): GWG-Weiche beim Zugang, AfA-Lauf\n * idempotent je Lauf-Ziel, Buchungen über den Ledger (sofort festgeschrieben).\n * AfA-Verteilung: Monatswerte = allocate der AHK über die Laufzeit (flach).\n */\nexport class AssetService {\n private ruleModule: Record<string, unknown> = {};\n\n constructor(\n private readonly baseCurrency: Currency,\n private readonly assets: AssetRepository,\n private readonly fiscalYears: FiscalYearRepository,\n private readonly vouchers: VoucherRepository,\n private readonly ledger: Ledger,\n private readonly ids: IdGenerator,\n ) {}\n\n setRuleModule(ruleModule: Record<string, unknown>): void {\n this.ruleModule = ruleModule;\n }\n\n acquire(input: Record<string, unknown>): Record<string, unknown> {\n const name = asString(input.name) ?? '';\n const assetClass = asString(input.assetClass) ?? '';\n const assetAccount = AccountNumber.of(asString(input.assetAccount) ?? '0');\n const cost = this.parseMoney(input.acquisitionCost);\n const acquiredOn = CalendarDate.of(asString(input.acquiredOn) ?? '');\n const voucherIdRaw = asString(input.voucherId);\n if (voucherIdRaw === null) throw new InvalidValue('acquireAsset braucht voucherId');\n const voucherId = Uuid.fromString(voucherIdRaw);\n const choice = asString(input.gwgChoice) ?? 'auto';\n\n const route = this.resolveRoute(choice, cost, acquiredOn);\n\n let usefulLifeMonths: number | null = null;\n const schedule: Money[] = [];\n if (route === 'capitalize') {\n usefulLifeMonths = this.usefulLifeMonths(assetClass);\n schedule.push(...cost.allocateEvenly(usefulLifeMonths));\n } else if (route === 'pool') {\n // Sammelposten § 6 Abs. 2a: starr 5 Jahre je 1/5.\n usefulLifeMonths = 60;\n for (const yearAmount of cost.allocateEvenly(5)) {\n schedule.push(...yearAmount.allocateEvenly(12));\n }\n }\n\n const asset = new Asset(\n this.ids.next(),\n name,\n assetClass,\n assetAccount,\n cost,\n acquiredOn,\n route,\n usefulLifeMonths,\n schedule,\n voucherId,\n );\n this.assets.add(asset);\n\n const targetAccount = route === 'immediate_expense' ? this.gwgExpenseAccount() : assetAccount.value;\n this.postMachineEntry(acquiredOn, voucherId, `Anlagenzugang ${name}`, [\n { account: targetAccount, side: 'debit', money: cost.toJSON() },\n { account: this.counterAccount(), side: 'credit', money: cost.toJSON() },\n ]);\n\n const result = asset.toJSON();\n result.route = route;\n if (route === 'immediate_expense') result.expenseAccount = targetAccount;\n return result;\n }\n\n dispose(input: Record<string, unknown>): Record<string, unknown> {\n const asset = this.requireAsset(input.assetId);\n asset.assertActive();\n\n const disposedOn = CalendarDate.of(asString(input.disposedOn) ?? '');\n asset.dispose(disposedOn);\n this.assets.save(asset);\n\n const proceeds = isRecord(input.proceeds) ? this.parseMoney(input.proceeds) : null;\n const proceedsAccount = asString(input.proceedsAccount);\n const bankAccount = asString(input.bankAccount) ?? this.counterAccount();\n\n if (proceeds !== null && proceedsAccount !== null) {\n const voucherId = asString(input.voucherId) ? Uuid.fromString(asString(input.voucherId)!) : asset.voucherId;\n this.postMachineEntry(disposedOn, voucherId, `Anlagenabgang ${asset.name}`, [\n { account: bankAccount, side: 'debit', money: proceeds.toJSON() },\n { account: proceedsAccount, side: 'credit', money: proceeds.toJSON() },\n ]);\n }\n\n return asset.toJSON();\n }\n\n runDepreciation(input: Record<string, unknown>): Record<string, unknown> {\n const fiscalYear = typeof input.fiscalYear === 'number' ? input.fiscalYear : 0;\n const period = typeof input.period === 'number' ? input.period : null;\n\n let entriesCreated = 0;\n let total = Money.zero(this.baseCurrency);\n\n for (const asset of this.assets.all()) {\n if (asset.route !== 'capitalize' && asset.route !== 'pool') continue;\n if (asset.isDisposed()) continue;\n\n const [months, amount] =\n period === null ? this.yearTarget(asset, fiscalYear) : this.monthTarget(asset, fiscalYear, period);\n if (months.length === 0 || amount.isZero()) continue;\n\n const bookingDate = this.bookingDate(asset, fiscalYear, period, months);\n const periodLabel = period === null ? '' : `/${String(period).padStart(2, '0')}`;\n const entry = this.postMachineEntry(\n bookingDate,\n this.depreciationVoucher(asset, fiscalYear, period),\n `AfA ${asset.name} ${fiscalYear}${periodLabel}`,\n [\n { account: this.depreciationExpenseAccount(), side: 'debit', money: amount.toJSON() },\n { account: asset.assetAccount.value, side: 'credit', money: amount.toJSON() },\n ],\n );\n\n const monthAmounts = months.length === 1 ? [amount] : this.monthAmounts(asset, months, amount);\n months.forEach((planMonth, index) => {\n asset.recordDepreciation(planMonth, bookingDate, monthAmounts[index]!, entry);\n });\n\n this.assets.save(asset);\n entriesCreated++;\n total = total.add(amount);\n }\n\n if (entriesCreated === 0) return { alreadyRun: true, entriesCreated: 0 };\n return { entriesCreated, totalDepreciation: total.toJSON() };\n }\n\n requireAsset(assetId: unknown): Asset {\n let asset: Asset | null = null;\n if (typeof assetId === 'string' && assetId !== '') {\n try {\n asset = this.assets.byId(Uuid.fromString(assetId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (asset === null) {\n throw new DomainError('E_ASSET_UNKNOWN', `Anlagegut ${typeof assetId === 'string' ? assetId : '?'} existiert nicht`);\n }\n return asset;\n }\n\n // ---- intern ----------------------------------------------------------\n\n private yearTarget(asset: Asset, fiscalYear: number): [number[], Money] {\n const zero = Money.zero(this.baseCurrency);\n const monthsByYear = new Map<number, number[]>();\n const life = asset.monthlySchedule.length;\n for (let planMonth = 1; planMonth <= life; planMonth++) {\n const year = asset.planMonthDate(planMonth).year();\n const list = monthsByYear.get(year) ?? [];\n list.push(planMonth);\n monthsByYear.set(year, list);\n }\n const months = monthsByYear.get(fiscalYear);\n if (months === undefined) return [[], zero];\n\n const years = [...monthsByYear.keys()];\n const weights = years.map((year) => monthsByYear.get(year)!.length);\n const yearAmounts = asset.acquisitionCost.allocate(...weights);\n const yearIndex = years.indexOf(fiscalYear);\n if (yearIndex === -1) return [[], zero];\n const yearAmount = yearAmounts[yearIndex]!;\n\n const openMonths: number[] = [];\n let bookedAmount = zero;\n for (const planMonth of months) {\n if (asset.isMonthBooked(planMonth)) {\n bookedAmount = bookedAmount.add(asset.monthlySchedule[planMonth - 1]!);\n continue;\n }\n openMonths.push(planMonth);\n }\n\n const amount = yearAmount.subtract(bookedAmount);\n if (openMonths.length === 0 || !amount.isPositive()) return [[], zero];\n return [openMonths, amount];\n }\n\n private monthTarget(asset: Asset, fiscalYear: number, period: number): [number[], Money] {\n const zero = Money.zero(this.baseCurrency);\n const year = this.fiscalYears.byYear(fiscalYear);\n if (year === null) {\n throw new DomainError('E_PERIOD_UNKNOWN', `Geschäftsjahr ${fiscalYear} ist nicht angelegt`);\n }\n const periodEntity = year.period(period);\n const life = asset.monthlySchedule.length;\n for (let planMonth = 1; planMonth <= life; planMonth++) {\n const date = asset.planMonthDate(planMonth);\n if (!periodEntity.contains(date)) continue;\n if (asset.isMonthBooked(planMonth)) return [[], zero];\n return [[planMonth], asset.monthlySchedule[planMonth - 1]!];\n }\n return [[], zero];\n }\n\n private monthAmounts(asset: Asset, months: number[], total: Money): Money[] {\n const planned = months.map((planMonth) => asset.monthlySchedule[planMonth - 1]!);\n let plannedSum = Money.zero(this.baseCurrency);\n for (const amount of planned) plannedSum = plannedSum.add(amount);\n if (plannedSum.equals(total)) return planned;\n return total.allocateEvenly(months.length);\n }\n\n private bookingDate(asset: Asset, fiscalYear: number, period: number | null, months: number[]): CalendarDate {\n const year = this.fiscalYears.byYear(fiscalYear);\n if (period !== null && year !== null) return year.period(period).end;\n if (year !== null) return year.end;\n return asset.planMonthDate(months[months.length - 1]!);\n }\n\n private postMachineEntry(\n date: CalendarDate,\n voucherId: Uuid,\n text: string,\n lines: Array<Record<string, unknown>>,\n ): Uuid {\n const result = this.ledger.post({ entryDate: date.iso, voucherId: voucherId.value, text, lines });\n // Maschinell erzeugte Buchung: sofort festschreiben (GoBD).\n this.ledger.finalize({ entryId: result.entry.id.value });\n return result.entry.id;\n }\n\n private depreciationVoucher(asset: Asset, fiscalYear: number, period: number | null): Uuid {\n const periodLabel = period === null ? '' : `-${String(period).padStart(2, '0')}`;\n const voucher = new Voucher({\n id: this.ids.next(),\n voucherNumber: `AFA-${fiscalYear}${periodLabel}-${asset.id.value.slice(-6)}`,\n voucherDate: CalendarDate.of(`${String(fiscalYear).padStart(4, '0')}-12-31`),\n kind: 'internal',\n });\n this.vouchers.add(voucher);\n return voucher.id;\n }\n\n private resolveRoute(choice: string, cost: Money, acquiredOn: CalendarDate): AssetRoute {\n if (choice !== 'auto') return parseAssetRoute(choice) ?? 'capitalize';\n\n for (const threshold of this.thresholds()) {\n const validFrom = CalendarDate.of(threshold.validFrom);\n const validTo = threshold.validTo === null ? null : CalendarDate.of(threshold.validTo);\n if (acquiredOn.isBefore(validFrom) || (validTo !== null && acquiredOn.isAfter(validTo))) continue;\n\n if (cost.compareTo(Money.of(threshold.immediateMax, this.baseCurrency)) <= 0) return 'immediate_expense';\n if (\n threshold.poolMin !== null &&\n threshold.poolMax !== null &&\n cost.compareTo(Money.of(threshold.poolMin, this.baseCurrency)) >= 0 &&\n cost.compareTo(Money.of(threshold.poolMax, this.baseCurrency)) <= 0\n ) {\n return 'pool';\n }\n }\n return 'capitalize';\n }\n\n private thresholds(): Threshold[] {\n const raw = Array.isArray(this.ruleModule.gwgThresholds) ? this.ruleModule.gwgThresholds : [];\n const thresholds: Threshold[] = [];\n for (const item of raw) {\n if (!isRecord(item) || typeof item.validFrom !== 'string' || typeof item.immediateMax !== 'string') continue;\n thresholds.push({\n validFrom: item.validFrom,\n validTo: typeof item.validTo === 'string' ? item.validTo : null,\n immediateMax: item.immediateMax,\n poolMin: typeof item.poolMin === 'string' ? item.poolMin : null,\n poolMax: typeof item.poolMax === 'string' ? item.poolMax : null,\n });\n }\n return thresholds;\n }\n\n private usefulLifeMonths(assetClass: string): number {\n const raw = Array.isArray(this.ruleModule.usefulLife) ? this.ruleModule.usefulLife : [];\n for (const item of raw) {\n if (isRecord(item) && item.assetClass === assetClass && typeof item.months === 'number') {\n return item.months;\n }\n }\n throw new DomainError(\n 'E_ASSET_UNKNOWN',\n `Keine Nutzungsdauer für Anlagenklasse \"${assetClass}\" im Regelmodul (siehe SPEC-FINDINGS)`,\n );\n }\n\n private counterAccount(): string {\n return this.assetAccount('acquisitionCounterAccount');\n }\n private depreciationExpenseAccount(): string {\n return this.assetAccount('depreciationExpenseAccount');\n }\n private gwgExpenseAccount(): string {\n return this.assetAccount('gwgExpenseAccount');\n }\n\n private assetAccount(key: string): string {\n const block = isRecord(this.ruleModule.assetAccounts) ? this.ruleModule.assetAccounts : {};\n const value = block[key];\n if (typeof value === 'string' && value !== '') return value;\n throw new DomainError('E_ACCOUNT_UNKNOWN', `assetAccounts.${key} ist im Regelmodul nicht gesetzt`, { key });\n }\n\n private parseMoney(raw: unknown): Money {\n const amount = isRecord(raw) ? asString(raw.amount) : null;\n if (amount === null) throw new InvalidValue('Betrag fehlt');\n return Money.of(amount, this.baseCurrency);\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { Money } from '../shared/money.js';\nimport type { PeriodRef } from '../shared/period-ref.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Abrechnungslauf (costing-modell.md Aggregat 1): je Periode + Version eindeutig;\n * Wiederholung erzeugt neue Version. draft → released.\n */\nexport class CostingRun {\n private runStatus = 'draft';\n\n constructor(\n readonly id: Uuid,\n readonly period: PeriodRef,\n readonly version: number,\n readonly primary: Map<string, Money>,\n readonly afterAllocation: Map<string, Money>,\n readonly grandTotal: Money,\n ) {}\n\n status(): string {\n return this.runStatus;\n }\n\n release(): void {\n if (this.runStatus === 'released') {\n throw new DomainError(\n 'E_COSTING_RUN_RELEASED',\n `Lauf ${this.id.value} ist bereits freigegeben — Änderungen erzeugen eine neue Version`,\n { runId: this.id.value },\n );\n }\n this.runStatus = 'released';\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport type { Currency } from '../shared/currency.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Money } from '../shared/money.js';\nimport { PeriodRef } from '../shared/period-ref.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { CostingRun } from './costing-run.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\ninterface Receiver {\n code: string;\n share: string;\n}\ninterface Step {\n sender: string;\n receivers: Receiver[];\n}\n\n/**\n * KLR-Abrechnung (costing-modell.md): eigener Rechnungskreis — das Fibu-Journal\n * bleibt unberührt. Primärkostenübernahme über costCenter-Dimension, Umlage per\n * Stufenleiter (zyklenfrei, E_COSTING_CYCLE), Verteilung per Money.allocate.\n */\nexport class CostingService {\n private schemeSteps: Step[] = [];\n private readonly runs = new Map<string, CostingRun>();\n private readonly versions = new Map<string, number>();\n\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly ids: IdGenerator,\n ) {}\n\n setAllocationScheme(input: Record<string, unknown>): Record<string, unknown> {\n const method = typeof input.method === 'string' ? input.method : 'step_ladder';\n const steps: Step[] = [];\n const edges = new Map<string, string[]>();\n\n for (const rawStep of Array.isArray(input.steps) ? input.steps : []) {\n if (!isRecord(rawStep) || typeof rawStep.sender !== 'string') {\n throw new InvalidValue('Umlageschritt braucht sender');\n }\n const sender = rawStep.sender;\n const receivers: Receiver[] = [];\n for (const rawReceiver of Array.isArray(rawStep.receivers) ? rawStep.receivers : []) {\n if (!isRecord(rawReceiver) || typeof rawReceiver.code !== 'string') continue;\n receivers.push({ code: rawReceiver.code, share: typeof rawReceiver.share === 'string' ? rawReceiver.share : '1' });\n const list = edges.get(sender) ?? [];\n list.push(rawReceiver.code);\n edges.set(sender, list);\n }\n steps.push({ sender, receivers });\n }\n\n if (method === 'step_ladder') this.assertAcyclic(edges);\n this.schemeSteps = steps;\n\n return { valid: true, method, stepCount: steps.length };\n }\n\n run(input: Record<string, unknown>): CostingRun {\n const fiscalYear = typeof input.fiscalYear === 'number' ? input.fiscalYear : 0;\n const period = typeof input.period === 'number' ? input.period : 0;\n const periodRef = new PeriodRef(fiscalYear, period);\n\n const zero = Money.zero(this.baseCurrency);\n const primary = new Map<string, Money>();\n\n for (const entry of this.journal.forFiscalYear(fiscalYear)) {\n if (entry.periodRef.period !== period) continue;\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null || account.type !== 'expense') continue;\n for (const dimension of line.dimensions) {\n if (dimension.type !== 'costCenter') continue;\n const signed = line.side === 'debit' ? line.money : line.money.negate();\n primary.set(dimension.code, (primary.get(dimension.code) ?? zero).add(signed));\n }\n }\n }\n\n const after = new Map(primary);\n for (const step of this.schemeSteps) {\n const senderTotal = after.get(step.sender) ?? zero;\n if (senderTotal.isZero() || step.receivers.length === 0) continue;\n const weights = step.receivers.map((receiver) => receiver.share);\n const parts = senderTotal.allocate(...weights);\n step.receivers.forEach((receiver, index) => {\n after.set(receiver.code, (after.get(receiver.code) ?? zero).add(parts[index]!));\n });\n after.set(step.sender, zero);\n }\n\n let grandTotal = zero;\n for (const total of after.values()) grandTotal = grandTotal.add(total);\n\n const key = `${fiscalYear}-${period}`;\n const version = (this.versions.get(key) ?? 0) + 1;\n this.versions.set(key, version);\n\n const run = new CostingRun(this.ids.next(), periodRef, version, primary, after, grandTotal);\n this.runs.set(run.id.value, run);\n return run;\n }\n\n release(input: Record<string, unknown>): CostingRun {\n const run = this.requireRun(input.runId);\n run.release();\n return run;\n }\n\n costAllocationSheet(params: Record<string, unknown>): Record<string, unknown> {\n const run = this.requireRun(params.runId);\n return {\n runId: run.id.value,\n status: run.status(),\n version: run.version,\n primary: this.serializeTotals(run.primary),\n afterAllocation: this.serializeTotals(run.afterAllocation),\n grandTotal: run.grandTotal.amountAsString(),\n };\n }\n\n private serializeTotals(totals: Map<string, Money>): Array<{ costCenter: string; total: string }> {\n const codes = [...totals.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n return codes.map((code) => ({ costCenter: code, total: totals.get(code)!.amountAsString() }));\n }\n\n private requireRun(runId: unknown): CostingRun {\n let run: CostingRun | null = null;\n if (typeof runId === 'string' && runId !== '') {\n try {\n run = this.runs.get(Uuid.fromString(runId).value) ?? null;\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (run === null) {\n throw new DomainError('E_COSTING_RUN_UNKNOWN', `Abrechnungslauf ${typeof runId === 'string' ? runId : '?'} existiert nicht`);\n }\n return run;\n }\n\n private assertAcyclic(edges: Map<string, string[]>): void {\n const visiting = new Set<string>();\n const done = new Set<string>();\n\n const visit = (node: string): void => {\n if (done.has(node)) return;\n if (visiting.has(node)) {\n throw new DomainError(\n 'E_COSTING_CYCLE',\n `Umlagezyklus über Kostenstelle \"${node}\" — Stufenleiter verlangt Zyklenfreiheit`,\n { costCenter: node },\n );\n }\n visiting.add(node);\n for (const next of edges.get(node) ?? []) visit(next);\n visiting.delete(node);\n done.add(node);\n };\n\n for (const node of edges.keys()) visit(node);\n }\n}\n","import type { AuditChanges } from '../ledger/audit-record.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Geschäftspartner (datenformat.md v0.4) — bewusst schlank: OP-je-Partner,\n * igL-Nachweis (USt-IdNr.), ZM-Grundlage, DATEV-Stammdaten.\n */\nexport class Partner {\n private partnerName: string;\n private partnerKind: string;\n private partnerVatId: string | null;\n private partnerPaymentTermsDays: number | null;\n\n constructor(\n readonly id: Uuid,\n name: string,\n kind: string,\n vatId: string | null,\n paymentTermsDays: number | null,\n private readonly accountNumbers: string[] = [],\n private readonly address: Record<string, unknown> = {},\n ) {\n this.partnerName = name;\n this.partnerKind = kind;\n this.partnerVatId = vatId;\n this.partnerPaymentTermsDays = paymentTermsDays;\n }\n\n name(): string {\n return this.partnerName;\n }\n\n vatId(): string | null {\n return this.partnerVatId;\n }\n\n update(input: Record<string, unknown>): AuditChanges {\n const changes: AuditChanges = {};\n\n if (typeof input.name === 'string' && input.name !== this.partnerName) {\n changes.name = { from: this.partnerName, to: input.name };\n this.partnerName = input.name;\n }\n if (\n 'vatId' in input &&\n input.vatId !== this.partnerVatId &&\n (typeof input.vatId === 'string' || input.vatId === null)\n ) {\n changes.vatId = { from: this.partnerVatId, to: input.vatId };\n this.partnerVatId = input.vatId;\n }\n if (typeof input.kind === 'string' && input.kind !== this.partnerKind) {\n changes.kind = { from: this.partnerKind, to: input.kind };\n this.partnerKind = input.kind;\n }\n if (\n typeof input.paymentTermsDays === 'number' &&\n input.paymentTermsDays !== this.partnerPaymentTermsDays\n ) {\n changes.paymentTermsDays = { from: this.partnerPaymentTermsDays, to: input.paymentTermsDays };\n this.partnerPaymentTermsDays = input.paymentTermsDays;\n }\n\n return changes;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n name: this.partnerName,\n kind: this.partnerKind,\n vatId: this.partnerVatId,\n paymentTermsDays: this.partnerPaymentTermsDays,\n accountNumbers: this.accountNumbers,\n address: Object.keys(this.address).length === 0 ? null : this.address,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { AuditRecord, type AuditChanges } from '../ledger/audit-record.js';\nimport type { AuditTrail, PartnerRepository } from '../port.js';\nimport type { Clock } from '../shared/clock.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { Partner } from './partner.js';\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Partner-Operationen (api.md v0.4): createPartner / updatePartner mit Audit. */\nexport class PartnerService {\n constructor(\n private readonly partners: PartnerRepository,\n private readonly audit: AuditTrail,\n private readonly clock: Clock,\n private readonly ids: IdGenerator,\n ) {}\n\n create(input: Record<string, unknown>): Partner {\n const accountNumbers = (Array.isArray(input.accountNumbers) ? input.accountNumbers : []).filter(\n (value): value is string => typeof value === 'string',\n );\n const address =\n input.address !== null && typeof input.address === 'object' && !Array.isArray(input.address)\n ? (input.address as Record<string, unknown>)\n : {};\n\n const partner = new Partner(\n this.ids.next(),\n asString(input.name) ?? '',\n asString(input.kind) ?? 'both',\n asString(input.vatId),\n typeof input.paymentTermsDays === 'number' ? input.paymentTermsDays : null,\n accountNumbers,\n address,\n );\n\n this.partners.add(partner);\n this.recordAudit(input, 'created', partner.id, {});\n return partner;\n }\n\n update(input: Record<string, unknown>): Partner {\n const partner = this.require(input.partnerId);\n const changes = partner.update(input);\n if (Object.keys(changes).length > 0) {\n this.partners.save(partner);\n this.recordAudit(input, 'updated', partner.id, changes);\n }\n return partner;\n }\n\n require(partnerId: unknown): Partner {\n let partner: Partner | null = null;\n if (typeof partnerId === 'string' && partnerId !== '') {\n try {\n partner = this.partners.byId(Uuid.fromString(partnerId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (partner === null) {\n throw new DomainError('E_PARTNER_UNKNOWN', `Geschäftspartner ${typeof partnerId === 'string' ? partnerId : '?'} existiert nicht`);\n }\n return partner;\n }\n\n private recordAudit(\n input: Record<string, unknown>,\n action: string,\n objectId: Uuid,\n changes: AuditChanges,\n ): void {\n const actor = asString(input.actor);\n this.audit.append(\n new AuditRecord(\n this.ids.next(),\n this.clock.now().toISOString(),\n actor !== null && actor !== '' ? actor : 'system',\n 'partner',\n objectId,\n action,\n changes,\n ),\n );\n }\n}\n","import type { JournalRepository, PartnerRepository, VoucherRepository } from '../port.js';\nimport { Money } from '../shared/money.js';\nimport type { Currency } from '../shared/currency.js';\nimport type { TaxCodeRegistry } from '../tax/tax-code-registry.js';\n\n/**\n * ZM-Grundlage (v0.4, SF-21): innergemeinschaftliche Umsätze je USt-IdNr. und\n * Zeitraum — aus Kennzahl-Tags der igL-Schlüssel, Partner über den Beleg.\n */\nexport class EcSalesListProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly journal: JournalRepository,\n private readonly vouchers: VoucherRepository,\n private readonly partners: PartnerRepository,\n private readonly registry: TaxCodeRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): { rows: Array<Record<string, string>> } {\n const year = typeof params.year === 'number' ? params.year : 0;\n const quarter = typeof params.quarter === 'number' ? params.quarter : 0;\n\n const intraCommunityKeys = new Set<string>();\n for (const version of this.registry.allVersions()) {\n if (version.mechanism === 'intra_community_supply' && version.reportingKey !== null) {\n intraCommunityKeys.add(version.reportingKey);\n }\n }\n\n const byVatId = new Map<string, Money>();\n\n for (const entry of this.journal.all()) {\n const voucher = this.vouchers.byId(entry.voucherId);\n const taxDate = voucher === null ? entry.entryDate : voucher.taxDate();\n if (taxDate.year() !== year) continue;\n if (quarter !== 0 && Math.floor((taxDate.month() - 1) / 3) + 1 !== quarter) continue;\n\n const partner = voucher?.partnerId == null ? null : this.partners.byId(voucher.partnerId);\n const vatId = partner?.vatId() ?? null;\n if (vatId === null) continue;\n\n for (const line of entry.lines()) {\n const rawKey = line.taxTag?.reportingKey;\n if (typeof rawKey !== 'string' && typeof rawKey !== 'number') continue;\n if (!intraCommunityKeys.has(String(rawKey))) continue;\n const signed = line.side === 'credit' ? line.money : line.money.negate();\n byVatId.set(vatId, (byVatId.get(vatId) ?? Money.zero(this.baseCurrency)).add(signed));\n }\n }\n\n const vatIds = [...byVatId.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const rows: Array<Record<string, string>> = [];\n for (const vatId of vatIds) {\n const amount = byVatId.get(vatId)!;\n if (amount.isZero()) continue;\n rows.push({ vatId, amount: amount.amountAsString(), kind: 'supply' });\n }\n return { rows };\n }\n}\n","import type { AccountRepository, JournalRepository } from '../port.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\ninterface Totals {\n opening: Money;\n debit: Money;\n credit: Money;\n touched: boolean;\n}\n\n/**\n * Summen- und Saldenliste (SuSa) — Spalten verbindlich (api.md v0.4):\n * - openingBalance: kumulierter Saldo VOR dem GJ (0 bei Erfolgskonten)\n * - debitTotal/creditTotal: Verkehrszahlen des Zeitraums (GJ bis Periode)\n * - balance = openingBalance + debitTotal − creditTotal (Soll-Salden positiv)\n * Sortierung: Kontonummer nach Codepoints (determinismus.md §3).\n */\nexport class TrialBalanceProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n ) {}\n\n compute(params: Record<string, unknown>): { rows: Array<Record<string, string>> } {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : 0;\n const throughPeriod =\n typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n const includeZeroBalances = params.includeZeroBalances === true;\n\n const zero = Money.zero(this.baseCurrency);\n const totals = new Map<string, Totals>();\n\n for (const entry of this.journal.all()) {\n const entryYear = entry.periodRef.fiscalYear;\n const entryPeriod = entry.periodRef.period;\n const isPriorYear = entryYear < fiscalYear;\n const isCurrentScope = entryYear === fiscalYear && entryPeriod <= throughPeriod;\n if (!isPriorYear && !isCurrentScope) continue;\n\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null) continue;\n // Erfolgskonten starten je Geschäftsjahr bei null (G1).\n if (isPriorYear && !isBalanceCarrying(account.type)) continue;\n\n const key = account.number.value;\n let total = totals.get(key);\n if (total === undefined) {\n total = { opening: zero, debit: zero, credit: zero, touched: false };\n totals.set(key, total);\n }\n\n if (isPriorYear) {\n total.opening =\n line.side === 'debit' ? total.opening.add(line.money) : total.opening.subtract(line.money);\n continue;\n }\n\n if (line.side === 'debit') total.debit = total.debit.add(line.money);\n else total.credit = total.credit.add(line.money);\n total.touched = true;\n }\n }\n\n if (includeZeroBalances) {\n for (const account of this.accounts.all()) {\n if (!totals.has(account.number.value)) {\n totals.set(account.number.value, { opening: zero, debit: zero, credit: zero, touched: false });\n }\n }\n }\n\n const numbers = [...totals.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const rows: Array<Record<string, string>> = [];\n for (const number of numbers) {\n const total = totals.get(number)!;\n const balance = total.opening.add(total.debit).subtract(total.credit);\n if (!includeZeroBalances && balance.isZero() && !total.touched) continue;\n rows.push({\n account: number,\n openingBalance: total.opening.amountAsString(),\n debitTotal: total.debit.amountAsString(),\n creditTotal: total.credit.amountAsString(),\n balance: balance.amountAsString(),\n });\n }\n return { rows };\n }\n}\n","import type { JournalRepository, OpenItemRepository, VoucherRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { OpenItem } from '../ledger/open-item.js';\nimport { parseOpenItemKind } from '../ledger/types.js';\n\n/**\n * OP-Liste: deterministisch, asOf-fähig (Zeitreise über settledAt). Sortierung:\n * voucherDate, dann sequenceNumber (determinismus.md §3).\n */\nexport class OpenItemsProjection {\n constructor(\n private readonly openItems: OpenItemRepository,\n private readonly vouchers: VoucherRepository,\n private readonly journal: JournalRepository,\n ) {}\n\n compute(params: Record<string, unknown>): { items: Array<Record<string, unknown>> } {\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n const kind = parseOpenItemKind(params.kind);\n const partnerId = typeof params.partnerId === 'string' ? params.partnerId : null;\n\n const open = this.openItems.all().filter((item) => {\n if (kind !== null && item.kind !== kind) return false;\n if (partnerId !== null && (item.partnerId?.value ?? null) !== partnerId) return false;\n if (asOf !== null && item.openedAt.isAfter(asOf)) return false;\n if (item.remainingAt(asOf).isZero()) return false;\n return true;\n });\n\n open.sort((a, b) => {\n const byDate = this.voucherDate(a).compareTo(this.voucherDate(b));\n return byDate !== 0 ? byDate : this.sequenceNumber(a) - this.sequenceNumber(b);\n });\n\n return { items: open.map((item) => this.serializeItem(item, asOf)) };\n }\n\n private voucherDate(item: OpenItem): CalendarDate {\n return this.vouchers.byId(item.voucherId)?.voucherDate ?? item.openedAt;\n }\n\n private sequenceNumber(item: OpenItem): number {\n return this.journal.byId(item.originEntryId)?.sequenceNumber ?? 0;\n }\n\n private serializeItem(item: OpenItem, asOf: CalendarDate | null): Record<string, unknown> {\n return {\n id: item.id.value,\n kind: item.kind,\n voucherNumber: this.vouchers.byId(item.voucherId)?.voucherNumber ?? null,\n money: item.money.toJSON(),\n remaining: item.remainingAt(asOf).toJSON(),\n status: item.statusAt(asOf),\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\n/**\n * Kontoblatt: alle Bewegungen eines Kontos im Geschäftsjahr mit laufendem Saldo.\n * Anfangsbestand = kumulierte Vorjahre für Bestandskonten, null für Erfolgskonten.\n * Ordnung: sequenceNumber (determinismus.md §3).\n */\nexport class AccountSheetProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const number = typeof params.account === 'string' ? params.account : '';\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : 0;\n const throughPeriod =\n typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n\n const account = this.accounts.byNumber(AccountNumber.of(number));\n if (account === null) {\n throw new DomainError('E_ACCOUNT_UNKNOWN', `Konto ${number} existiert nicht`);\n }\n\n let opening = Money.zero(this.baseCurrency);\n if (isBalanceCarrying(account.type)) {\n for (const entry of this.journal.all()) {\n if (entry.periodRef.fiscalYear >= fiscalYear) continue;\n for (const line of entry.lines()) {\n if (!line.accountId.equals(account.id)) continue;\n opening = line.side === 'debit' ? opening.add(line.money) : opening.subtract(line.money);\n }\n }\n }\n\n let running = opening;\n const lines: Array<Record<string, unknown>> = [];\n for (const entry of this.journal.forFiscalYear(fiscalYear)) {\n if (entry.periodRef.period > throughPeriod) continue;\n for (const line of entry.lines()) {\n if (!line.accountId.equals(account.id)) continue;\n running = line.side === 'debit' ? running.add(line.money) : running.subtract(line.money);\n lines.push({\n sequenceNumber: entry.sequenceNumber,\n entryDate: entry.entryDate.iso,\n text: entry.text(),\n side: line.side,\n money: line.money.toJSON(),\n runningBalance: running.amountAsString(),\n });\n }\n }\n\n return {\n account: account.number.value,\n name: account.name,\n openingBalance: opening.amountAsString(),\n lines,\n closingBalance: running.amountAsString(),\n };\n }\n}\n","import type { AuditTrail } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\n\n/**\n * Änderungshistorie als Projektion (F-CORE-014). Reihenfolge =\n * Erfassungsreihenfolge des Audit-Trails.\n */\nexport class AuditLogProjection {\n constructor(private readonly audit: AuditTrail) {}\n\n compute(params: Record<string, unknown>): { records: Array<Record<string, unknown>> } {\n const from = typeof params.from === 'string' ? CalendarDate.of(params.from) : null;\n const to = typeof params.to === 'string' ? CalendarDate.of(params.to) : null;\n\n const records: Array<Record<string, unknown>> = [];\n for (const record of this.audit.all()) {\n const date = CalendarDate.of(record.at.slice(0, 10));\n if (from !== null && date.isBefore(from)) continue;\n if (to !== null && date.isAfter(to)) continue;\n records.push(record.toJSON());\n }\n return { records };\n }\n}\n","import Big from 'big.js';\nimport type {\n AccountRepository,\n JournalRepository,\n OpenItemRepository,\n VoucherRepository,\n} from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\nimport type { OpenItem } from '../ledger/open-item.js';\nimport type { TaxCodeRegistry } from '../tax/tax-code-registry.js';\nimport type { TaxProfile } from '../tax/tax-profile.js';\n\ninterface KeyAmount {\n base: Money;\n tax: Money;\n}\ninterface Share {\n key: string;\n base: Money;\n tax: Money;\n settledAt: CalendarDate;\n}\n\n/**\n * USt-VA-Kennzahlen über taxTags (SF-09). Soll: Buchungs-/Leistungsdatum; Ist:\n * folgt OP-Ausgleichen (anteilig half-up, Schlussrest exakt). Bemessungsgrund-\n * lagen je Kennzahl auf volle Euro abgerundet, Steuer centgenau (api.md v0.3).\n */\nexport class VatReturnProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly journal: JournalRepository,\n private readonly openItems: OpenItemRepository,\n private readonly vouchers: VoucherRepository,\n private readonly accounts: AccountRepository,\n private readonly registry: TaxCodeRegistry,\n private readonly profile: TaxProfile,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const year = typeof params.year === 'number' ? params.year : 0;\n const quarter = typeof params.quarter === 'number' ? params.quarter : 0;\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n\n const zero = Money.zero(this.baseCurrency);\n const keys = new Map<string, KeyAmount>();\n const directions = this.registryDirections();\n\n const add = (key: string, base: Money, tax: Money): void => {\n const current = keys.get(key) ?? { base: zero, tax: zero };\n keys.set(key, { base: current.base.add(base), tax: current.tax.add(tax) });\n };\n\n if (this.profile.isCashBasis()) {\n for (const item of this.openItems.all()) {\n const origin = this.journal.byId(item.originEntryId);\n if (origin === null || (asOf !== null && origin.entryDate.isAfter(asOf))) continue;\n const contributions = this.entryContributions(origin, directions);\n if (contributions.size === 0) continue;\n for (const share of this.allocateToSettlements(item, contributions)) {\n if (asOf !== null && share.settledAt.isAfter(asOf)) continue;\n if (this.inQuarter(share.settledAt, year, quarter)) add(share.key, share.base, share.tax);\n }\n }\n\n for (const entry of this.journal.all()) {\n if (!this.inQuarter(entry.entryDate, year, quarter)) continue;\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n if (this.openItems.byOriginEntry(entry.id).length > 0) continue;\n for (const [key, contribution] of this.entryContributions(entry, directions)) {\n add(key, contribution.base, contribution.tax);\n }\n }\n } else {\n for (const entry of this.journal.all()) {\n let taxDate: CalendarDate;\n if (entry.reverses !== null) {\n // F-011: § 17-Korrektur zählt nach eigenem Buchungsdatum.\n taxDate = entry.entryDate;\n } else {\n const voucher = this.vouchers.byId(entry.voucherId);\n taxDate = voucher === null ? entry.entryDate : voucher.taxDate();\n }\n if (!this.inQuarter(taxDate, year, quarter)) continue;\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n for (const [key, contribution] of this.entryContributions(entry, directions)) {\n add(key, contribution.base, contribution.tax);\n }\n }\n }\n\n const sortedKeys = [...keys.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const result: Record<string, { base: string; tax: string }> = {};\n let payload = zero;\n\n for (const key of sortedKeys) {\n const amounts = keys.get(key)!;\n // Amtliche VA-Konvention: Basis auf volle Euro abrunden.\n const flooredBase = Money.fromCalculation(\n new Big(amounts.base.amountAsString()).round(0, Big.roundDown),\n this.baseCurrency,\n );\n result[key] = { base: flooredBase.amountAsString(), tax: amounts.tax.amountAsString() };\n const direction = directions.get(key) ?? 'output';\n payload = direction === 'input' ? payload.subtract(amounts.tax) : payload.add(amounts.tax);\n }\n\n return { keys: result, payload: payload.toJSON() };\n }\n\n private registryDirections(): Map<string, string> {\n const directions = new Map<string, string>();\n for (const version of this.registry.allVersions()) {\n if (version.reportingKey !== null) {\n directions.set(version.reportingKey, this.accountDirection(version.taxAccount));\n }\n if (version.inputReportingKey !== null) {\n directions.set(version.inputReportingKey, 'input');\n }\n if (version.baseReportingKey !== null) {\n directions.set(\n version.baseReportingKey,\n version.mechanism === 'reverse_charge' ? 'input' : this.accountDirection(version.taxAccount),\n );\n }\n }\n return directions;\n }\n\n private accountDirection(accountNumber: string): string {\n if (accountNumber === '') return 'output';\n const account = this.accounts.byNumber(AccountNumber.of(accountNumber));\n return account?.subtype === 'tax_in' ? 'input' : 'output';\n }\n\n private entryContributions(entry: JournalEntry, directions: Map<string, string>): Map<string, KeyAmount> {\n const zero = Money.zero(this.baseCurrency);\n interface Collected {\n baseFromTax: Money;\n hasTaxBase: boolean;\n baseFallback: Money;\n tax: Money;\n }\n const collected = new Map<string, Collected>();\n\n for (const line of entry.lines()) {\n const tag = line.taxTag;\n if (tag === null) continue;\n const rawKey = tag.reportingKey;\n if (typeof rawKey !== 'string' && typeof rawKey !== 'number') continue;\n const key = String(rawKey);\n\n const account = this.accounts.byId(line.accountId);\n const subtype = account?.subtype ?? null;\n const entryFor = collected.get(key) ?? {\n baseFromTax: zero,\n hasTaxBase: false,\n baseFallback: zero,\n tax: zero,\n };\n\n if (subtype === 'tax_out' || subtype === 'tax_in') {\n const positiveSide = subtype === 'tax_out' ? 'credit' : 'debit';\n const signed = line.side === positiveSide ? line.money : line.money.negate();\n entryFor.tax = entryFor.tax.add(signed);\n\n let baseMoney = this.tagBaseMoney(tag);\n if (baseMoney !== null) {\n if (line.money.isNegative()) baseMoney = baseMoney.negate();\n entryFor.baseFromTax = entryFor.baseFromTax.add(baseMoney);\n entryFor.hasTaxBase = true;\n }\n } else {\n const direction = directions.get(key) ?? 'output';\n const positiveSide = direction === 'input' ? 'debit' : 'credit';\n const signed = line.side === positiveSide ? line.money : line.money.negate();\n entryFor.baseFallback = entryFor.baseFallback.add(signed);\n }\n collected.set(key, entryFor);\n }\n\n const contributions = new Map<string, KeyAmount>();\n for (const [key, parts] of collected) {\n const base = parts.hasTaxBase ? parts.baseFromTax : parts.baseFallback;\n if (base.isZero() && parts.tax.isZero()) continue;\n contributions.set(key, { base, tax: parts.tax });\n }\n return contributions;\n }\n\n private tagBaseMoney(tag: Record<string, unknown>): Money | null {\n const baseMoney = tag.baseMoney;\n const amount =\n baseMoney !== null && typeof baseMoney === 'object' && typeof (baseMoney as Record<string, unknown>).amount === 'string'\n ? ((baseMoney as Record<string, unknown>).amount as string)\n : null;\n return amount === null ? null : Money.of(amount, this.baseCurrency);\n }\n\n private allocateToSettlements(item: OpenItem, contributions: Map<string, KeyAmount>): Share[] {\n const shares: Share[] = [];\n const allocated = new Map<string, KeyAmount>();\n let remaining = item.money;\n const total = new Big(item.money.amountAsString());\n\n for (const settlement of item.settlements()) {\n remaining = remaining.subtract(settlement.money);\n const isFinal = remaining.isZero();\n const ratio = new Big(settlement.money.amountAsString());\n\n for (const [key, contribution] of contributions) {\n const current = allocated.get(key) ?? {\n base: Money.zero(this.baseCurrency),\n tax: Money.zero(this.baseCurrency),\n };\n\n let base: Money;\n let tax: Money;\n if (isFinal) {\n base = contribution.base.subtract(current.base);\n tax = contribution.tax.subtract(current.tax);\n } else {\n base = this.proportional(contribution.base, ratio, total);\n tax = this.proportional(contribution.tax, ratio, total);\n }\n\n allocated.set(key, { base: current.base.add(base), tax: current.tax.add(tax) });\n shares.push({ key, base, tax, settledAt: settlement.settledAt });\n }\n }\n return shares;\n }\n\n private proportional(total: Money, part: Big, whole: Big): Money {\n if (whole.eq(0)) return Money.zero(this.baseCurrency);\n return Money.fromCalculation(\n new Big(total.amountAsString()).times(part).div(whole),\n this.baseCurrency,\n );\n }\n\n private inQuarter(date: CalendarDate, year: number, quarter: number): boolean {\n if (date.year() !== year) return false;\n return quarter === 0 || Math.floor((date.month() - 1) / 3) + 1 === quarter;\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { MappingRegistry } from '../mapping/mapping-registry.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\n/**\n * GuV als Projektion über ein Mapping (SF-09). Vorzeichen: Haben − Soll\n * (Erträge positiv, Aufwand negativ); netIncome = Summe der Positionen.\n * fromPeriod/throughPeriod grenzen ab (Monats-GuV als BWA-Grundlage).\n */\nexport class IncomeStatementProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly mappings: MappingRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : 0;\n const fromPeriod = typeof params.fromPeriod === 'number' ? params.fromPeriod : 1;\n const throughPeriod =\n typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n const mappingId = typeof params.mapping === 'string' ? params.mapping : '';\n\n const mapping = this.mappings.byId(mappingId);\n if (mapping === null) {\n throw new DomainError('E_MAPPING_OVERLAP', `Mapping \"${mappingId}\" ist nicht geladen`);\n }\n\n const zero = Money.zero(this.baseCurrency);\n const amounts = new Map<string, Money>();\n const touched = new Set<string>();\n\n for (const entry of this.journal.forFiscalYear(fiscalYear)) {\n const period = entry.periodRef.period;\n if (period < fromPeriod || period > throughPeriod) continue;\n\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null || isBalanceCarrying(account.type)) continue;\n const leaf = mapping.leafFor(account.number.value);\n if (leaf === null) continue;\n const signed = line.side === 'credit' ? line.money : line.money.negate();\n amounts.set(leaf.key, (amounts.get(leaf.key) ?? zero).add(signed));\n touched.add(leaf.key);\n }\n }\n\n const positions: Array<Record<string, string>> = [];\n let netIncome = zero;\n\n for (const leaf of mapping.leaves) {\n const amount = amounts.get(leaf.key) ?? zero;\n netIncome = netIncome.add(amount);\n if (amount.isZero() && !touched.has(leaf.key)) continue;\n positions.push({ key: leaf.key, label: leaf.label, amount: amount.amountAsString() });\n }\n\n return { positions, netIncome: netIncome.amountAsString() };\n }\n}\n","export interface MappingLeaf {\n key: string;\n label: string;\n side: string | null;\n ranges: Array<{ from: string; to: string }>;\n numbers: string[];\n includeNonCash: boolean;\n includesNetIncome: boolean;\n parents: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Trifft ein Blatt eine Kontonummer? (Einzelnummern oder Codepoint-Bereiche.) */\nexport function leafMatches(leaf: MappingLeaf, accountNumber: string): boolean {\n if (leaf.numbers.includes(accountNumber)) return true;\n for (const range of leaf.ranges) {\n if (accountNumber >= range.from && accountNumber <= range.to) return true;\n }\n return false;\n}\n\n/**\n * Gliederungs-Mapping (datenformat.md v0.2): ordnet Konten Positionen zu —\n * gleiche Struktur für Bilanz, GuV, EÜR-Zeilen und VA-Kennzahlen.\n */\nexport class Mapping {\n constructor(\n readonly id: string,\n readonly kind: string,\n readonly version: string,\n readonly leaves: MappingLeaf[],\n ) {}\n\n static fromData(data: Record<string, unknown>): Mapping {\n const leaves: MappingLeaf[] = [];\n Mapping.collectLeaves(Array.isArray(data.positions) ? data.positions : [], [], leaves, null);\n return new Mapping(asString(data.id) ?? '', asString(data.kind) ?? '', asString(data.version) ?? '', leaves);\n }\n\n private static collectLeaves(\n positions: unknown[],\n parents: string[],\n leaves: MappingLeaf[],\n side: string | null,\n ): void {\n for (const position of positions) {\n if (!isRecord(position)) continue;\n const key = asString(position.key) ?? '';\n // side wird am Wurzelknoten gesetzt und an die Blätter vererbt (v0.5/F-007).\n const nodeSide = asString(position.side) ?? side;\n const children = Array.isArray(position.children) ? position.children : [];\n\n if (children.length > 0) {\n Mapping.collectLeaves(children, [...parents, key], leaves, nodeSide);\n continue;\n }\n\n const ranges: Array<{ from: string; to: string }> = [];\n const numbers: string[] = [];\n for (const selector of Array.isArray(position.accounts) ? position.accounts : []) {\n if (!isRecord(selector)) continue;\n if (typeof selector.from === 'string' && typeof selector.to === 'string') {\n ranges.push({ from: selector.from, to: selector.to });\n }\n for (const number of Array.isArray(selector.numbers) ? selector.numbers : []) {\n if (typeof number === 'string') numbers.push(number);\n }\n }\n\n leaves.push({\n key,\n label: asString(position.label) ?? key,\n side: nodeSide,\n ranges,\n numbers,\n includeNonCash: position.includeNonCash === true,\n includesNetIncome: position.includesNetIncome === true,\n parents,\n });\n }\n }\n\n leafFor(accountNumber: string): MappingLeaf | null {\n for (const leaf of this.leaves) {\n if (leafMatches(leaf, accountNumber)) return leaf;\n }\n return null;\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { leafMatches } from '../mapping/mapping.js';\nimport type { MappingRegistry } from '../mapping/mapping-registry.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\ntype Section = 'assets' | 'liabilitiesAndEquity';\n\n/**\n * Bilanz als Projektion (SF-10): kumulativ zum Stichtag. Position mit\n * includesNetIncome enthält die kumulierten Jahresergebnisse + eigenen Saldo.\n * Seite (v0.5/F-007): `side` am Wurzelknoten; assets = Soll−Haben,\n * liabilitiesAndEquity = Haben−Soll. Default: assets.\n */\nexport class BalanceSheetProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly mappings: MappingRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n const mappingId = typeof params.mapping === 'string' ? params.mapping : '';\n\n const mapping = this.mappings.byId(mappingId);\n if (mapping === null) {\n throw new DomainError('E_MAPPING_OVERLAP', `Mapping \"${mappingId}\" ist nicht geladen`);\n }\n\n const zero = Money.zero(this.baseCurrency);\n const debits = new Map<string, Money>();\n const credits = new Map<string, Money>();\n const touchedAccounts = new Set<string>();\n let netIncome = zero;\n\n for (const entry of this.journal.all()) {\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null) continue;\n\n if (!isBalanceCarrying(account.type)) {\n netIncome = line.side === 'credit' ? netIncome.add(line.money) : netIncome.subtract(line.money);\n continue;\n }\n\n const key = account.number.value;\n if (line.side === 'debit') debits.set(key, (debits.get(key) ?? zero).add(line.money));\n else credits.set(key, (credits.get(key) ?? zero).add(line.money));\n touchedAccounts.add(key);\n }\n }\n\n const allNumbers = new Set<string>([...debits.keys(), ...credits.keys()]);\n const sections: Record<Section, Array<Record<string, string>>> = { assets: [], liabilitiesAndEquity: [] };\n const totals: Record<Section, Money> = { assets: zero, liabilitiesAndEquity: zero };\n\n for (const leaf of mapping.leaves) {\n const section: Section = leaf.side === 'liabilitiesAndEquity' ? 'liabilitiesAndEquity' : 'assets';\n let amount = zero;\n let touched = false;\n\n for (const number of allNumbers) {\n if (!leafMatches(leaf, number)) continue;\n const debit = debits.get(number) ?? zero;\n const credit = credits.get(number) ?? zero;\n amount =\n section === 'assets'\n ? amount.add(debit).subtract(credit)\n : amount.add(credit).subtract(debit);\n touched = touched || touchedAccounts.has(number);\n }\n\n if (leaf.includesNetIncome) {\n amount = amount.add(netIncome);\n touched = touched || !netIncome.isZero();\n }\n\n if (amount.isZero() && !touched) continue;\n\n sections[section].push({ key: leaf.key, label: leaf.label, amount: amount.amountAsString() });\n totals[section] = totals[section].add(amount);\n }\n\n return {\n assets: sections.assets,\n assetsTotal: totals.assets.amountAsString(),\n liabilitiesAndEquity: sections.liabilitiesAndEquity,\n liabilitiesAndEquityTotal: totals.liabilitiesAndEquity.amountAsString(),\n };\n }\n}\n","import Big from 'big.js';\nimport { DomainError } from '../domain-error.js';\nimport type { Mapping } from '../mapping/mapping.js';\nimport type { MappingRegistry } from '../mapping/mapping-registry.js';\nimport type {\n AccountRepository,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n VoucherRepository,\n} from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport type { Account } from '../ledger/account.js';\nimport type { EntryLine } from '../ledger/entry-line.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\n\nconst NON_PROFIT_SUBTYPES = new Set(['bank', 'cash', 'transit', 'ar', 'ap']);\n\n/**\n * EÜR als Projektion über das doppische Journal — Regeln R1–R7\n * (euer-projektions-beweis.md). Zahlungswirksamkeit über Geldkonten, OP-Link bei\n * Ausgleich (anteilig), 10-Tage-Regel, USt zahlungswirksam, R7 includeNonCash.\n * Kalenderjahrgebunden: abweichendes GJ → E_CASHBASIS_DEVIATING_FISCAL_YEAR.\n */\nexport class CashBasisProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly openItems: OpenItemRepository,\n private readonly vouchers: VoucherRepository,\n private readonly fiscalYears: FiscalYearRepository,\n private readonly mappings: MappingRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const year = typeof params.year === 'number' ? params.year : 0;\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n const mapping = typeof params.mapping === 'string' ? this.mappings.byId(params.mapping) : null;\n\n this.assertCalendarYearFiscalYears(year);\n\n const income = new Map<string, Money>();\n const expenses = new Map<string, Money>();\n const addTo = (bucket: Map<string, Money>, label: string, amount: Money): void => {\n bucket.set(label, (bucket.get(label) ?? Money.zero(this.baseCurrency)).add(amount));\n };\n\n for (const entry of this.journal.all()) {\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n\n const bankFlow = this.bankFlow(entry);\n\n if (bankFlow.isZero()) {\n // R7: nicht zahlungswirksame Pflichtkategorien (Buchungsjahr).\n if (mapping === null || entry.entryDate.year() !== year) continue;\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null) continue;\n const leaf = mapping.leafFor(account.number.value);\n if (leaf === null || !leaf.includeNonCash) continue;\n\n if (account.type === 'revenue' || account.subtype === 'tax_out') {\n const signed = line.side === 'credit' ? line.money : line.money.negate();\n addTo(income, leaf.label, signed);\n } else if (account.type === 'expense' || account.subtype === 'tax_in') {\n const signed = line.side === 'debit' ? line.money : line.money.negate();\n addTo(expenses, leaf.label, signed);\n }\n }\n continue;\n }\n\n // R1: zahlungswirksam — Zieljahr (R2), Quelle ggf. via OP-Link.\n if (this.assignYear(entry) !== year) continue;\n const inflow = bankFlow.isPositive();\n\n for (const sourced of this.sourceLines(entry)) {\n const account = this.accounts.byId(sourced.line.accountId);\n if (account === null || (account.subtype !== null && NON_PROFIT_SUBTYPES.has(account.subtype))) {\n continue;\n }\n const amount = this.proportional(sourced.line.money, sourced.ratio);\n\n if (account.subtype === 'tax_out') {\n addTo(inflow ? income : expenses, inflow ? 'Vereinnahmte USt' : 'USt-Zahlung an FA', amount);\n } else if (account.subtype === 'tax_in') {\n addTo(expenses, 'Gezahlte Vorsteuer', amount);\n } else if (account.type === 'revenue') {\n addTo(income, this.label(mapping, account), amount);\n } else if (account.type === 'expense') {\n addTo(expenses, this.label(mapping, account), amount);\n }\n // R4/R5: Anlagen, Darlehen, Privat, durchlaufende Posten — neutral.\n }\n }\n\n return { income: this.serializeBucket(income), expenses: this.serializeBucket(expenses) };\n }\n\n private assertCalendarYearFiscalYears(year: number): void {\n const y = String(year).padStart(4, '0');\n const start = CalendarDate.of(`${y}-01-01`);\n const end = CalendarDate.of(`${y}-12-31`);\n\n for (const fiscalYear of this.fiscalYears.all()) {\n const overlaps = !fiscalYear.end.isBefore(start) && !fiscalYear.start.isAfter(end);\n if (!overlaps) continue;\n const isCalendarYear =\n fiscalYear.start.iso.slice(5) === '01-01' && fiscalYear.end.iso.slice(5) === '12-31';\n if (!isCalendarYear) {\n throw new DomainError(\n 'E_CASHBASIS_DEVIATING_FISCAL_YEAR',\n `Geschäftsjahr ${fiscalYear.year} (${fiscalYear.start.iso} bis ${fiscalYear.end.iso}) weicht vom Kalenderjahr ab — EÜR ist kalenderjahrgebunden`,\n { fiscalYear: fiscalYear.year },\n );\n }\n }\n }\n\n private bankFlow(entry: JournalEntry): Money {\n let flow = Money.zero(this.baseCurrency);\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n const subtype = account?.subtype ?? null;\n if (subtype !== 'bank' && subtype !== 'cash') continue;\n flow = line.side === 'debit' ? flow.add(line.money) : flow.subtract(line.money);\n }\n return flow;\n }\n\n private assignYear(entry: JournalEntry): number {\n const voucher = this.vouchers.byId(entry.voucherId);\n if (\n voucher !== null &&\n voucher.recurring &&\n voucher.economicYear !== null &&\n voucher.due !== null &&\n this.inTenDayWindow(entry.entryDate) &&\n this.inTenDayWindow(voucher.due)\n ) {\n return voucher.economicYear;\n }\n return entry.entryDate.year();\n }\n\n private inTenDayWindow(date: CalendarDate): boolean {\n const month = date.month();\n const day = Number(date.iso.slice(8, 10));\n return (month === 12 && day >= 22) || (month === 1 && day <= 10);\n }\n\n private sourceLines(entry: JournalEntry): Array<{ line: EntryLine; ratio: Big }> {\n const sourced: Array<{ line: EntryLine; ratio: Big }> = [];\n\n for (const item of this.openItems.all()) {\n for (const settlement of item.settlements()) {\n if (!settlement.entryId.equals(entry.id)) continue;\n const origin = this.journal.byId(item.originEntryId);\n if (origin === null || item.money.isZero()) continue;\n const ratio = new Big(settlement.money.amountAsString()).div(new Big(item.money.amountAsString()));\n for (const line of origin.lines()) sourced.push({ line, ratio });\n }\n }\n\n if (sourced.length > 0) return sourced;\n\n const one = new Big(1);\n for (const line of entry.lines()) sourced.push({ line, ratio: one });\n return sourced;\n }\n\n private proportional(amount: Money, ratio: Big): Money {\n if (ratio.eq(1)) return amount.abs();\n return Money.fromCalculation(new Big(amount.abs().amountAsString()).times(ratio), this.baseCurrency);\n }\n\n private label(mapping: Mapping | null, account: Account): string {\n if (mapping !== null) {\n const leaf = mapping.leafFor(account.number.value);\n if (leaf !== null) return leaf.label;\n }\n return account.name;\n }\n\n private serializeBucket(bucket: Map<string, Money>): Array<{ category: string; amount: string }> {\n const labels = [...bucket.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const rows: Array<{ category: string; amount: string }> = [];\n for (const label of labels) {\n const amount = bucket.get(label)!;\n if (amount.isZero()) continue;\n rows.push({ category: label, amount: amount.amountAsString() });\n }\n return rows;\n }\n}\n","import type { AssetRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\n\n/**\n * Anlageverzeichnis (Pflicht auch bei EÜR, § 4 Abs. 3 S. 5 EStG). Sortierung:\n * Zugangsdatum, dann ID (deterministisch).\n */\nexport class AssetRegisterProjection {\n constructor(private readonly assets: AssetRepository) {}\n\n compute(params: Record<string, unknown>): { assets: Array<Record<string, unknown>> } {\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n\n const sorted = [...this.assets.all()].sort((a, b) => {\n const byDate = a.acquiredOn.compareTo(b.acquiredOn);\n return byDate !== 0 ? byDate : a.id.compareTo(b.id);\n });\n\n const rows: Array<Record<string, unknown>> = [];\n for (const asset of sorted) {\n if (asOf !== null && asset.acquiredOn.isAfter(asOf)) continue;\n const row = asset.toJSON();\n row.accumulatedDepreciation = asset.accumulatedDepreciationAt(asOf).toJSON();\n row.bookValue = asset.bookValueAt(asOf).toJSON();\n if (asset.route === 'capitalize') row.depreciationSchedule = asset.scheduleSummary();\n rows.push(row);\n }\n return { assets: rows };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalJson } from '../shared/canonical-json.js';\nimport type { Clock } from '../shared/clock.js';\nimport type { Currency } from '../shared/currency.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type {\n AccountRepository,\n AuditTrail,\n JournalRepository,\n PartnerRepository,\n VoucherRepository,\n} from '../port.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\n\nconst FORMAT_VERSION = '0.4';\nconst LINE_FIELDS = ['accountId', 'side', 'money', 'dimensions', 'taxTag'] as const;\n\nfunction withoutNulls(row: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(row).filter(([, value]) => value !== null));\n}\n\n/**\n * GoBD-Z3-Export (SF-14): Manifest mit SHA-256-Strom-Hashes über RFC-8785-\n * kanonisierte Zeilen, Feldkatalog, Journal vollständig in sequenceNumber-\n * Reihenfolge. auditLog ist immer Teil des Exports (v0.5/F-005).\n */\nexport class JournalExportProjection {\n constructor(\n private readonly tenantId: Uuid,\n private readonly tenantName: string,\n private readonly baseCurrency: Currency,\n private readonly journal: JournalRepository,\n private readonly accounts: AccountRepository,\n private readonly vouchers: VoucherRepository,\n private readonly partners: PartnerRepository,\n private readonly audit: AuditTrail,\n private readonly clock: Clock,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : null;\n const entries = fiscalYear === null ? this.journal.all() : this.journal.forFiscalYear(fiscalYear);\n\n const streams: Record<string, unknown[]> = {\n journal: entries.map((entry) => JournalExportProjection.formatEntry(entry)),\n accounts: this.accounts.all().map((account) => withoutNulls(account.toJSON())),\n vouchers: this.vouchers.all().map((voucher) => withoutNulls(voucher.toJSON())),\n };\n if (this.partners.all().length > 0) {\n streams.partners = this.partners.all().map((partner) => partner.toJSON());\n }\n streams.auditLog = this.audit.all().map((record) => record.toJSON());\n\n const contentHashes: Record<string, string> = {};\n for (const [name, rows] of Object.entries(streams)) {\n const lines = rows.map((row) => canonicalJson(row));\n contentHashes[name] = createHash('sha256').update(lines.join('\\n')).digest('hex');\n }\n\n const allFinalized = entries.every((entry) => entry.isFinalized());\n\n return {\n manifest: {\n formatVersion: FORMAT_VERSION,\n tenantId: this.tenantId.value,\n tenantName: this.tenantName,\n baseCurrency: this.baseCurrency.code,\n exportedAt: this.clock.now().toISOString(),\n hashAlgorithm: 'sha256',\n streams: Object.keys(streams),\n contentHashes,\n },\n fieldCatalogIncluded: true,\n fieldCatalog: this.fieldCatalog(),\n journal: { entryCount: entries.length, ordering: 'sequenceNumber', allFinalized },\n data: streams,\n };\n }\n\n private static formatEntry(entry: JournalEntry): Record<string, unknown> {\n const data = entry.toJSON();\n const lines = Array.isArray(data.lines) ? data.lines : [];\n data.lines = lines.map((line) => {\n const source = line as Record<string, unknown>;\n const stripped: Record<string, unknown> = {};\n for (const field of LINE_FIELDS) stripped[field] = source[field];\n return stripped;\n });\n return data;\n }\n\n private fieldCatalog(): Record<string, Array<{ name: string; type: string; meaning: string }>> {\n return {\n journal: [\n { name: 'id', type: 'uuid', meaning: 'Eindeutige Buchungs-ID (UUIDv7)' },\n { name: 'sequenceNumber', type: 'integer', meaning: 'Lückenlose Journalnummer je Geschäftsjahr' },\n { name: 'status', type: 'string', meaning: 'entered|finalized (Festschreibung)' },\n { name: 'entryDate', type: 'date', meaning: 'Buchungsdatum (zonenlos)' },\n { name: 'recordedAt', type: 'timestamp', meaning: 'Erfassungszeitpunkt' },\n { name: 'periodRef', type: 'object', meaning: 'Geschäftsjahr + Periode' },\n { name: 'voucherId', type: 'uuid', meaning: 'Belegreferenz (Pflicht)' },\n { name: 'text', type: 'string', meaning: 'Buchungstext' },\n { name: 'lines', type: 'array', meaning: 'Positionen: Konto, Seite, Betrag, Dimensionen, Steuer-Tag' },\n { name: 'reverses', type: 'uuid|null', meaning: 'Rückverweis bei Storno (Generalumkehr)' },\n { name: 'reversedBy', type: 'uuid|null', meaning: 'Verweis auf die Stornobuchung' },\n ],\n accounts: [\n { name: 'number', type: 'string', meaning: 'Kontonummer (führende Nullen signifikant)' },\n { name: 'name', type: 'string', meaning: 'Kontobezeichnung' },\n { name: 'type', type: 'string', meaning: 'asset|liability|equity|expense|revenue' },\n { name: 'subtype', type: 'string|null', meaning: 'Kanonischer Subtyp (bank, ar, ap, …)' },\n ],\n vouchers: [\n { name: 'voucherNumber', type: 'string', meaning: 'Belegnummer' },\n { name: 'voucherDate', type: 'date', meaning: 'Belegdatum' },\n ],\n auditLog: [\n { name: 'at', type: 'timestamp', meaning: 'Änderungszeitpunkt' },\n { name: 'actor', type: 'string', meaning: 'Audit-Identität' },\n { name: 'action', type: 'string', meaning: 'created|corrected|finalized|locked|…' },\n { name: 'changes', type: 'object', meaning: 'Vorher/Nachher-Diff der geänderten Felder' },\n ],\n };\n }\n}\n","import type {\n AccountRepository,\n JournalRepository,\n PartnerRepository,\n VoucherRepository,\n} from '../port.js';\nimport type { EntryLine } from '../ledger/entry-line.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\nimport type { TaxCodeRegistry } from '../tax/tax-code-registry.js';\n\nconst TAX_SUBTYPES = new Set(['tax_in', 'tax_out']);\n\nfunction pad2(value: number): string {\n return String(value).padStart(2, '0');\n}\nfunction tagCode(line: EntryLine): string | null {\n const code = line.taxTag?.code;\n return typeof code === 'string' ? code : null;\n}\n\n/**\n * DATEV-Export (F-IO-005): Buchungsstapel, Kontenbeschriftungen, Partner-\n * Stammdaten. Steuerzeilen werden DATEV-seitig aus dem BU-Schlüssel erzeugt und\n * deshalb in die Basiszeile gefaltet; zusammengesetzte Buchungen in Teilzeilen.\n */\nexport class DatevExportProjection {\n constructor(\n private readonly journal: JournalRepository,\n private readonly accounts: AccountRepository,\n private readonly vouchers: VoucherRepository,\n private readonly partners: PartnerRepository,\n private readonly registry: TaxCodeRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const kind = typeof params.kind === 'string' ? params.kind : 'entries';\n const rows =\n kind === 'accounts' ? this.accountRows() : kind === 'partners' ? this.partnerRows() : this.entryRows(params);\n return { kind, rows, rowCount: rows.length };\n }\n\n private entryRows(params: Record<string, unknown>): Array<Record<string, unknown>> {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : null;\n const fromPeriod = typeof params.fromPeriod === 'number' ? params.fromPeriod : 1;\n const throughPeriod = typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n\n const entries = fiscalYear === null ? this.journal.all() : this.journal.forFiscalYear(fiscalYear);\n const rows: Array<Record<string, unknown>> = [];\n for (const entry of entries) {\n const period = entry.periodRef.period;\n if (period < fromPeriod || period > throughPeriod) continue;\n rows.push(...this.splitEntry(entry));\n }\n return rows;\n }\n\n private splitEntry(entry: JournalEntry): Array<Record<string, unknown>> {\n let lead: EntryLine | null = null;\n const contraLines: EntryLine[] = [];\n const taxLines: EntryLine[] = [];\n\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n const isTaxLine =\n account?.subtype != null && TAX_SUBTYPES.has(account.subtype) && line.taxTag !== null;\n if (isTaxLine) {\n taxLines.push(line);\n continue;\n }\n if (lead === null && line.taxTag === null) {\n lead = line;\n continue;\n }\n contraLines.push(line);\n }\n\n if (lead === null || contraLines.length === 0) return [];\n\n const voucher = this.vouchers.byId(entry.voucherId);\n const rows: Array<Record<string, unknown>> = [];\n\n for (const contra of contraLines) {\n let gross = contra.money;\n let buKey: string | null = null;\n const contraCode = tagCode(contra);\n if (contraCode !== null) {\n buKey = this.registry.datevBuFor(contraCode);\n for (const taxLine of taxLines) {\n if (tagCode(taxLine) === contraCode) gross = gross.add(taxLine.money);\n }\n }\n\n rows.push({\n amount: gross.abs().amountAsString(),\n debitCredit: lead.side === 'debit' ? 'S' : 'H',\n account: lead.account.value,\n contraAccount: contra.account.value,\n buKey,\n documentField1: voucher === null ? '' : voucher.voucherNumber,\n date: `${pad2(entry.entryDate.month())}${pad2(Number(entry.entryDate.iso.slice(8, 10)))}`,\n text: entry.text(),\n finalized: entry.isFinalized(),\n });\n }\n return rows;\n }\n\n private accountRows(): Array<Record<string, unknown>> {\n return this.accounts.all().map((account) => ({\n number: account.number.value,\n name: account.name,\n type: account.type,\n }));\n }\n\n private partnerRows(): Array<Record<string, unknown>> {\n return this.partners.all().map((partner) => partner.toJSON());\n }\n}\n","import { Mapping } from './mapping.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Geladene Mappings eines Mandanten (mutierbar über importMapping). */\nexport class MappingRegistry {\n private readonly byIdMap = new Map<string, Mapping>();\n\n static empty(): MappingRegistry {\n return new MappingRegistry();\n }\n\n static fromRuleModules(raw: unknown[]): MappingRegistry {\n const registry = new MappingRegistry();\n for (const mappingData of raw) {\n if (isRecord(mappingData)) registry.add(Mapping.fromData(mappingData));\n }\n return registry;\n }\n\n add(mapping: Mapping): void {\n this.byIdMap.set(mapping.id, mapping);\n }\n\n byId(id: string): Mapping | null {\n return this.byIdMap.get(id) ?? null;\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountRepository } from '../port.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\nimport { leafMatches, Mapping } from './mapping.js';\nimport type { MappingRegistry } from './mapping-registry.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Mapping-Import (api.md): Überlappung → E_MAPPING_OVERLAP; Lücken sind kein\n * Fehler, sondern gapWarnings[] mit Auffangposition `_unassigned`. Geprüft gegen\n * die real existierenden Konten je Mapping-Art.\n */\nexport class MappingImporter {\n constructor(\n private readonly accounts: AccountRepository,\n private readonly registry: MappingRegistry,\n ) {}\n\n import(input: Record<string, unknown>): Record<string, unknown> {\n const data = isRecord(input.mapping) ? input.mapping : {};\n const mapping = Mapping.fromData(data);\n const gapWarnings: Array<{ account: string; assignedTo: string }> = [];\n\n for (const account of this.relevantAccounts(mapping.kind)) {\n const matches = mapping.leaves\n .filter((leaf) => leafMatches(leaf, account.number.value))\n .map((leaf) => leaf.key);\n\n if (matches.length > 1) {\n throw new DomainError(\n 'E_MAPPING_OVERLAP',\n `Konto ${account.number.value} fällt in mehrere Positionen: ${matches.join(', ')}`,\n { account: account.number.value, positions: matches },\n );\n }\n if (matches.length === 0) {\n gapWarnings.push({ account: account.number.value, assignedTo: '_unassigned' });\n }\n }\n\n this.registry.add(mapping);\n\n return { imported: true, id: mapping.id, kind: mapping.kind, gapWarnings };\n }\n\n private relevantAccounts(kind: string) {\n return this.accounts.all().filter((account) => {\n if (kind === 'balance-sheet') return isBalanceCarrying(account.type);\n if (kind === 'income-statement') return !isBalanceCarrying(account.type);\n return false; // z. B. cash-basis-categories: bewusst partiell\n });\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport type { TaxCodeVersion } from './tax-code-version.js';\n\n/**\n * Steuerschlüssel (tax-modell.md Aggregat 1): gebündelter Steuersachverhalt als\n * Liste von Regelversionen. Versionswahl folgt dem Belegdatum.\n */\nexport class TaxCode {\n constructor(\n readonly code: string,\n readonly versions: TaxCodeVersion[],\n readonly datevBu: string | null = null,\n ) {}\n\n versionFor(date: CalendarDate): TaxCodeVersion {\n for (const version of this.versions) {\n if (version.coversDate(date)) return version;\n }\n throw new DomainError(\n 'E_TAXCODE_NO_VALID_VERSION',\n `Steuerschlüssel ${this.code} hat keine zum ${date.iso} gültige Regelversion`,\n { code: this.code, date: date.iso },\n );\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\n\n/**\n * Regelversion eines Steuerschlüssels mit Gültigkeitszeitraum. Inhalte sind\n * Regelmodul-Daten — Code zitiert kein Gesetz. mechanism `reverse_charge`:\n * USt- und VSt-Position gleichzeitig; `intra_community_supply`: steuerfrei.\n */\nexport class TaxCodeVersion {\n constructor(\n readonly validFrom: CalendarDate,\n readonly validTo: CalendarDate | null,\n readonly rate: string,\n readonly taxAccount: string,\n readonly reportingKey: string | null,\n readonly mechanism: string = 'standard',\n readonly inputTaxAccount: string | null = null,\n readonly inputReportingKey: string | null = null,\n readonly baseReportingKey: string | null = null,\n ) {}\n\n coversDate(date: CalendarDate): boolean {\n if (date.isBefore(this.validFrom)) return false;\n return this.validTo === null || !date.isAfter(this.validTo);\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport { TaxCode } from './tax-code.js';\nimport { TaxCodeVersion } from './tax-code-version.js';\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Geladene, validierte Form der Steuerschlüssel-Regelmodul-Daten. */\nexport class TaxCodeRegistry {\n private constructor(private readonly codes: ReadonlyMap<string, TaxCode>) {}\n\n static empty(): TaxCodeRegistry {\n return new TaxCodeRegistry(new Map());\n }\n\n static fromData(data: Array<Record<string, unknown>>): TaxCodeRegistry {\n const codes = new Map<string, TaxCode>();\n\n for (const codeData of data) {\n const code = asString(codeData.code) ?? '';\n const rawVersions = Array.isArray(codeData.versions) ? codeData.versions : [];\n const versions: TaxCodeVersion[] = [];\n\n for (const versionData of rawVersions) {\n if (versionData === null || typeof versionData !== 'object') continue;\n const v = versionData as Record<string, unknown>;\n versions.push(\n new TaxCodeVersion(\n CalendarDate.of(asString(v.validFrom) ?? ''),\n typeof v.validTo === 'string' ? CalendarDate.of(v.validTo) : null,\n asString(v.rate) ?? '0',\n asString(v.taxAccount) ?? '',\n asString(v.reportingKey),\n asString(v.mechanism) ?? 'standard',\n asString(v.inputTaxAccount),\n asString(v.inputReportingKey),\n asString(v.baseReportingKey),\n ),\n );\n }\n\n codes.set(code, new TaxCode(code, versions, asString(codeData.datevBu)));\n }\n\n return new TaxCodeRegistry(codes);\n }\n\n allVersions(): TaxCodeVersion[] {\n const versions: TaxCodeVersion[] = [];\n for (const code of this.codes.values()) versions.push(...code.versions);\n return versions;\n }\n\n datevBuFor(code: string): string | null {\n return this.codes.get(code)?.datevBu ?? null;\n }\n\n get(code: string): TaxCode {\n const found = this.codes.get(code);\n if (found === undefined) {\n throw new DomainError('E_TAXCODE_UNKNOWN', `Steuerschlüssel \"${code}\" ist nicht definiert`, { code });\n }\n return found;\n }\n\n versionFor(code: string, date: CalendarDate): TaxCodeVersion {\n return this.get(code).versionFor(date);\n }\n}\n","import { CalendarDate } from '../shared/calendar-date.js';\n\ninterface Segment {\n validFrom: CalendarDate;\n value: boolean;\n}\n\n/**\n * Steuerliches Mandantenprofil (tax-modell.md Aggregat 2): Versteuerungsart,\n * Kleinunternehmer-Status mit Gültigkeitszeitraum (unterjähriger Wechsel,\n * SF-11), Voranmeldungszeitraum.\n */\nexport class TaxProfile {\n private constructor(\n private readonly method: string,\n private smallBusiness: Segment[],\n private readonly period: string,\n ) {}\n\n static fromData(data: Record<string, unknown>): TaxProfile {\n const method = data.taxationMethod === 'cash' ? 'cash' : 'accrual';\n const period = data.vatPeriod === 'monthly' ? 'monthly' : 'quarterly';\n\n const segments: Segment[] = [];\n const smallBusiness = data.smallBusiness ?? false;\n if (typeof smallBusiness === 'boolean') {\n if (smallBusiness) segments.push({ validFrom: CalendarDate.of('0001-01-01'), value: true });\n } else if (Array.isArray(smallBusiness)) {\n for (const segment of smallBusiness) {\n if (segment === null || typeof segment !== 'object') continue;\n const s = segment as Record<string, unknown>;\n if (typeof s.validFrom !== 'string') continue;\n segments.push({ validFrom: CalendarDate.of(s.validFrom), value: s.value === true });\n }\n }\n\n return new TaxProfile(method, TaxProfile.sorted(segments), period);\n }\n\n static default(): TaxProfile {\n return new TaxProfile('accrual', [], 'quarterly');\n }\n\n taxationMethod(): string {\n return this.method;\n }\n\n isCashBasis(): boolean {\n return this.method === 'cash';\n }\n\n vatPeriod(): string {\n return this.period;\n }\n\n smallBusinessAt(date: CalendarDate): boolean {\n let value = false;\n for (const segment of this.smallBusiness) {\n if (segment.validFrom.isAfter(date)) break;\n value = segment.value;\n }\n return value;\n }\n\n setSmallBusiness(validFrom: CalendarDate, value: boolean): void {\n const segments = this.smallBusiness.filter((segment) => !segment.validFrom.equals(validFrom));\n segments.push({ validFrom, value });\n this.smallBusiness = TaxProfile.sorted(segments);\n }\n\n private static sorted(segments: Segment[]): Segment[] {\n return [...segments].sort((a, b) => a.validFrom.compareTo(b.validFrom));\n }\n\n toJSON(): Record<string, unknown> {\n return {\n taxationMethod: this.method,\n vatPeriod: this.period,\n smallBusiness: this.smallBusiness.map((segment) => ({\n validFrom: segment.validFrom.iso,\n value: segment.value,\n })),\n };\n }\n}\n","import Big from 'big.js';\nimport { DomainError } from '../domain-error.js';\nimport type { JournalRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport { Money } from '../shared/money.js';\nimport type { TaxCodeRegistry } from './tax-code-registry.js';\nimport type { TaxCodeVersion } from './tax-code-version.js';\nimport type { TaxProfile } from './tax-profile.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\ninterface NetLine {\n account: string;\n money: Money;\n code: string;\n}\n\n/**\n * Steuerexpansion (tax-modell.md): side-effect-free. Determinismus (§2):\n * USt pro Beleg je Steuersatz — Netto-Summe je Schlüssel, Steuer berechnen,\n * EINMAL half-up runden. Versionswahl nach Leistungs-/Belegdatum.\n * Kleinunternehmer (§ 19): keine Steuerpositionen, Brutto = Netto.\n */\nexport class TaxService {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly registry: TaxCodeRegistry,\n private readonly profileValue: TaxProfile,\n private readonly journal: JournalRepository,\n ) {}\n\n profile(): TaxProfile {\n return this.profileValue;\n }\n\n registryHandle(): TaxCodeRegistry {\n return this.registry;\n }\n\n expand(input: Record<string, unknown>): Record<string, unknown> {\n // v0.4 (§ 27): Regelversion folgt dem Leistungsdatum, Fallback Belegdatum.\n const date =\n typeof input.serviceDate === 'string'\n ? this.parseDate(input.serviceDate)\n : this.parseDate(input.date);\n const direction = input.direction === 'input' ? 'input' : 'output';\n const defaultCode = asString(input.taxCode);\n\n const rawLines = Array.isArray(input.netLines) ? input.netLines : [];\n if (rawLines.length === 0) {\n throw new DomainError('E_ENTRY_TOO_FEW_LINES', 'expandTax ohne Netto-Positionen');\n }\n\n const netLines: NetLine[] = rawLines.map((rawLine) => {\n if (!isRecord(rawLine)) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', 'Netto-Position ist keine Struktur');\n }\n const code = asString(rawLine.taxCode) ?? defaultCode;\n if (code === null) {\n throw new DomainError('E_TAXCODE_UNKNOWN', 'Position ohne Steuerschlüssel (kein Default gesetzt)');\n }\n return { account: asString(rawLine.account) ?? '', money: this.parseMoney(rawLine.money), code };\n });\n\n // Referenzprüfung vollständig vor Berechnung (Reihenfolge-unabhängig).\n for (const line of netLines) this.registry.get(line.code);\n\n const versions = new Map<string, TaxCodeVersion>();\n const bases = new Map<string, Money>();\n for (const line of netLines) {\n if (!versions.has(line.code)) versions.set(line.code, this.registry.versionFor(line.code, date));\n bases.set(line.code, (bases.get(line.code) ?? Money.zero(this.baseCurrency)).add(line.money));\n }\n\n let netTotal = Money.zero(this.baseCurrency);\n for (const line of netLines) netTotal = netTotal.add(line.money);\n\n const sideFor = direction === 'output' ? 'credit' : 'debit';\n\n if (this.profileValue.smallBusinessAt(date)) {\n return {\n netLines: netLines.map((line) => ({\n account: line.account,\n side: sideFor,\n money: line.money.toJSON(),\n taxTag: null,\n })),\n taxLines: [],\n grossTotal: netTotal.toJSON(),\n };\n }\n\n // Gruppen deterministisch nach Steuerkonto sortieren (Codepoints).\n const codes = [...bases.keys()].sort((a, b) => {\n const aa = versions.get(a)!.taxAccount;\n const bb = versions.get(b)!.taxAccount;\n return aa < bb ? -1 : aa > bb ? 1 : 0;\n });\n\n const taxLines: Array<Record<string, unknown>> = [];\n let grossTotal = netTotal;\n const baseTags = new Map<string, Record<string, unknown>>();\n\n for (const code of codes) {\n const version = versions.get(code)!;\n const base = bases.get(code)!;\n const tax = Money.fromCalculation(\n new Big(base.amountAsString()).times(version.rate).div(100),\n this.baseCurrency,\n );\n\n if (version.mechanism === 'intra_community_supply') {\n baseTags.set(code, this.tag(code, version, version.reportingKey, base));\n continue;\n }\n\n if (version.mechanism === 'reverse_charge') {\n taxLines.push({\n account: version.taxAccount,\n side: 'credit',\n money: tax.toJSON(),\n taxTag: this.tag(code, version, version.reportingKey, base),\n });\n taxLines.push({\n account: version.inputTaxAccount ?? version.taxAccount,\n side: 'debit',\n money: tax.toJSON(),\n taxTag: this.tag(code, version, version.inputReportingKey, base),\n });\n baseTags.set(code, this.tag(code, version, version.baseReportingKey ?? version.reportingKey, base));\n } else {\n taxLines.push({\n account: version.taxAccount,\n side: sideFor,\n money: tax.toJSON(),\n taxTag: this.tag(code, version, version.reportingKey, base),\n });\n baseTags.set(code, this.tag(code, version, version.reportingKey, base));\n grossTotal = grossTotal.add(tax);\n }\n }\n\n return {\n netLines: netLines.map((line) => ({\n account: line.account,\n side: sideFor,\n money: line.money.toJSON(),\n taxTag: baseTags.get(line.code) ?? null,\n })),\n taxLines,\n grossTotal: grossTotal.toJSON(),\n };\n }\n\n setProfile(input: Record<string, unknown>): TaxProfile {\n const smallBusiness = input.smallBusiness;\n if (!isRecord(smallBusiness) || typeof smallBusiness.validFrom !== 'string') {\n throw new DomainError('E_PROFILE_RETROACTIVE_CONFLICT', 'setTaxProfile braucht smallBusiness.validFrom');\n }\n const validFrom = this.parseDate(smallBusiness.validFrom);\n\n for (const entry of this.journal.all()) {\n if (entry.isFinalized() && !entry.entryDate.isBefore(validFrom)) {\n throw new DomainError(\n 'E_PROFILE_RETROACTIVE_CONFLICT',\n `Zeitraum ab ${validFrom.iso} enthält festgeschriebene Buchungen (z. B. Nr. ${entry.sequenceNumber})`,\n { validFrom: validFrom.iso, sequenceNumber: entry.sequenceNumber },\n );\n }\n }\n\n this.profileValue.setSmallBusiness(validFrom, smallBusiness.value === true);\n return this.profileValue;\n }\n\n private tag(\n code: string,\n version: TaxCodeVersion,\n reportingKey: string | null,\n base: Money,\n ): Record<string, unknown> {\n return {\n code,\n appliedVersion: version.validFrom.iso,\n reportingKey,\n baseMoney: base.toJSON(),\n };\n }\n\n private parseDate(date: unknown): CalendarDate {\n try {\n return CalendarDate.of(typeof date === 'string' ? date : '');\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_TAXCODE_NO_VALID_VERSION', 'Belegdatum fehlt oder ungültig');\n }\n throw error;\n }\n }\n\n private parseMoney(raw: unknown): Money {\n const amount = isRecord(raw) ? asString(raw.amount) : null;\n if (amount === null) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', 'Netto-Position ohne Betrag');\n }\n try {\n return Money.of(amount, this.baseCurrency);\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Ungültiger Betrag \"${amount}\"`);\n }\n throw error;\n }\n }\n}\n","import { AssetService } from '../assets/asset-service.js';\nimport { CostingService } from '../costing/costing-service.js';\nimport {\n InMemoryAccountRepository,\n InMemoryAssetRepository,\n InMemoryAuditTrail,\n InMemoryFiscalYearRepository,\n InMemoryJournalRepository,\n InMemoryOpenItemRepository,\n InMemoryPartnerRepository,\n InMemoryVoucherRepository,\n} from '../in-memory.js';\nimport { PartnerService } from '../partner/partner-service.js';\nimport { DimensionRegistry } from '../ledger/dimension-registry.js';\nimport { Ledger } from '../ledger/ledger.js';\nimport { MappingRegistry } from '../mapping/mapping-registry.js';\nimport { TaxCodeRegistry } from '../tax/tax-code-registry.js';\nimport { TaxProfile } from '../tax/tax-profile.js';\nimport { TaxService } from '../tax/tax-service.js';\nimport type {\n AccountRepository,\n AssetRepository,\n AuditTrail,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n PartnerRepository,\n VoucherRepository,\n} from '../port.js';\nimport { type Clock, SystemClock } from '../shared/clock.js';\nimport type { Currency } from '../shared/currency.js';\nimport { type IdGenerator, UuidV7IdGenerator } from '../shared/id-generator.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Mandant: buchführende Einheit, oberste Datengrenze (Glossar `tenant`). Bündelt\n * Ports + Services einer Instanz. Wächst mit den Slices (Tax/Partner/Asset/\n * Costing folgen); der Adapter ersetzt nur die Ports.\n */\nexport class Tenant {\n constructor(\n readonly id: Uuid,\n readonly name: string,\n readonly baseCurrency: Currency,\n readonly accounts: AccountRepository,\n readonly fiscalYears: FiscalYearRepository,\n readonly vouchers: VoucherRepository,\n readonly journal: JournalRepository,\n readonly openItems: OpenItemRepository,\n readonly assets: AssetRepository,\n readonly partners: PartnerRepository,\n readonly audit: AuditTrail,\n readonly ledger: Ledger,\n readonly tax: TaxService,\n readonly assetService: AssetService,\n readonly costing: CostingService,\n readonly partnerService: PartnerService,\n readonly mappings: MappingRegistry,\n readonly clock: Clock,\n readonly ids: IdGenerator,\n ) {}\n\n static inMemory(\n name: string,\n baseCurrency: Currency,\n clock: Clock = new SystemClock(),\n ids?: IdGenerator,\n dimensions: DimensionRegistry = DimensionRegistry.empty(),\n taxCodes: TaxCodeRegistry = TaxCodeRegistry.empty(),\n taxProfile: TaxProfile = TaxProfile.default(),\n mappings: MappingRegistry = MappingRegistry.empty(),\n ): Tenant {\n const idGen = ids ?? new UuidV7IdGenerator(clock);\n\n const accounts = new InMemoryAccountRepository();\n const fiscalYears = new InMemoryFiscalYearRepository();\n const vouchers = new InMemoryVoucherRepository();\n const journal = new InMemoryJournalRepository();\n const openItems = new InMemoryOpenItemRepository();\n const assets = new InMemoryAssetRepository();\n const partners = new InMemoryPartnerRepository();\n const audit = new InMemoryAuditTrail();\n\n const ledger = new Ledger(\n baseCurrency,\n accounts,\n fiscalYears,\n vouchers,\n journal,\n openItems,\n audit,\n dimensions,\n clock,\n idGen,\n );\n const tax = new TaxService(baseCurrency, taxCodes, taxProfile, journal);\n const assetService = new AssetService(baseCurrency, assets, fiscalYears, vouchers, ledger, idGen);\n const costing = new CostingService(baseCurrency, accounts, journal, idGen);\n const partnerService = new PartnerService(partners, audit, clock, idGen);\n\n return new Tenant(\n idGen.next(),\n name,\n baseCurrency,\n accounts,\n fiscalYears,\n vouchers,\n journal,\n openItems,\n assets,\n partners,\n audit,\n ledger,\n tax,\n assetService,\n costing,\n partnerService,\n mappings,\n clock,\n idGen,\n );\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport { Voucher } from '../ledger/voucher.js';\nimport type { Tenant } from './tenant.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * Anwendungsschicht-Komposition `postVoucher` (api.md, Teil der Spec): SF-02/03\n * in einem Aufruf — Beleg anlegen, expandTax, post, OP-Anlage.\n */\nexport class PostVoucherService {\n constructor(private readonly tenant: Tenant) {}\n\n post(input: Record<string, unknown>): Record<string, unknown> {\n const voucherData = isRecord(input.voucher) ? input.voucher : {};\n const voucherNumber = asString(voucherData.voucherNumber) ?? '';\n\n let voucherDate: CalendarDate;\n try {\n voucherDate = CalendarDate.of(asString(voucherData.voucherDate) ?? '');\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_ENTRY_NO_VOUCHER', 'postVoucher braucht voucher.voucherDate');\n }\n throw error;\n }\n\n // v0.4: Partner muss existieren, bevor irgendetwas entsteht.\n let partnerId: Uuid | null = null;\n if (voucherData.partnerId !== undefined && voucherData.partnerId !== null) {\n partnerId = this.tenant.partnerService.require(voucherData.partnerId).id;\n }\n\n const date = (value: unknown): CalendarDate | null =>\n typeof value === 'string' ? CalendarDate.of(value) : null;\n const servicePeriod = isRecord(voucherData.servicePeriod) ? voucherData.servicePeriod : {};\n\n const voucher = new Voucher({\n id: this.tenant.ids.next(),\n voucherNumber,\n voucherDate,\n due: date(voucherData.due),\n recurring: voucherData.recurring === true,\n economicYear: typeof voucherData.economicYear === 'number' ? voucherData.economicYear : null,\n serviceDate: date(voucherData.serviceDate),\n servicePeriodFrom: date(servicePeriod.from),\n servicePeriodTo: date(servicePeriod.to),\n kind: asString(voucherData.kind),\n partnerId,\n issuer: asString(voucherData.issuer),\n });\n this.tenant.vouchers.add(voucher);\n\n const expansion = this.tenant.tax.expand({\n date: voucherDate.iso,\n serviceDate: voucher.taxDate().iso,\n taxCode: input.taxCode ?? null,\n direction: input.direction ?? 'output',\n netLines: input.netLines ?? [],\n });\n\n const direction = input.direction === 'input' ? 'input' : 'output';\n const counterAccount = asString(input.counterAccount) ?? '';\n const netLines = Array.isArray(expansion.netLines) ? expansion.netLines : [];\n const taxLines = Array.isArray(expansion.taxLines) ? expansion.taxLines : [];\n\n const lines: Array<Record<string, unknown>> = [\n {\n account: counterAccount,\n side: direction === 'output' ? 'debit' : 'credit',\n money: expansion.grossTotal,\n },\n ...netLines,\n ...taxLines,\n ];\n\n const result = this.tenant.ledger.post({\n actor: input.actor ?? null,\n entryDate: input.entryDate ?? voucherDate.iso,\n voucherId: voucher.id.value,\n text: input.text ?? '',\n lines,\n });\n\n return {\n entry: JSON.parse(JSON.stringify(result.entry)) as Record<string, unknown>,\n openItemsCreated: result.openItemsCreated.map((item) => JSON.parse(JSON.stringify(item)) as unknown),\n grossTotal: expansion.grossTotal,\n taxLines: expansion.taxLines,\n voucherId: voucher.id.value,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { AssetRegisterProjection } from '../projection/asset-register.js';\nimport { MappingImporter } from '../mapping/mapping-importer.js';\nimport { AccountSheetProjection } from '../projection/account-sheet.js';\nimport { AuditLogProjection } from '../projection/audit-log.js';\nimport { BalanceSheetProjection } from '../projection/balance-sheet.js';\nimport { CashBasisProjection } from '../projection/cash-basis.js';\nimport { DatevExportProjection } from '../projection/datev-export.js';\nimport { JournalExportProjection } from '../projection/journal-export.js';\nimport { IncomeStatementProjection } from '../projection/income-statement.js';\nimport { EcSalesListProjection } from '../projection/ec-sales-list.js';\nimport { OpenItemsProjection } from '../projection/open-items.js';\nimport { TrialBalanceProjection } from '../projection/trial-balance.js';\nimport { VatReturnProjection } from '../projection/vat-return.js';\nimport { PostVoucherService } from './post-voucher-service.js';\nimport type { Tenant } from './tenant.js';\n\n/** Plain-JSON-Serialisierung über toJSON() (wie PHPs json_encode/decode). */\nfunction serialize(value: unknown): Record<string, unknown> {\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n}\n\n/**\n * Generischer Einstieg in alle Operationen und Projektionen eines Mandanten —\n * die Schnittstelle für CLI und Konformitäts-Runner. Namen exakt nach api.md.\n * Wächst mit den Slices; Unimplementiertes meldet E_NOT_IMPLEMENTED.\n */\nexport class TenantOperations {\n constructor(private readonly tenant: Tenant) {}\n\n execute(op: string, input: Record<string, unknown>): Record<string, unknown> {\n const ledger = this.tenant.ledger;\n\n switch (op) {\n case 'expandTax':\n return this.tenant.tax.expand(input);\n case 'setTaxProfile':\n return serialize(this.tenant.tax.setProfile(input));\n case 'postVoucher':\n return new PostVoucherService(this.tenant).post(input);\n case 'post': {\n const result = ledger.post(input);\n return {\n ...serialize(result.entry),\n openItemsCreated: result.openItemsCreated.map((item) => serialize(item)),\n };\n }\n case 'correct':\n return serialize(ledger.correct(input));\n case 'settle':\n return { openItems: ledger.settle(input).map((item) => serialize(item)) };\n case 'finalize':\n return { finalizedCount: ledger.finalize(input) };\n case 'reverse':\n return serialize(ledger.reverse(input));\n case 'closePeriod':\n return ledger.closePeriod(input);\n case 'reopenPeriod':\n return ledger.reopenPeriod(input);\n case 'closeFiscalYear':\n return { fiscalYear: ledger.closeFiscalYear(input).year, status: 'closed' };\n case 'createAccount':\n return serialize(ledger.createAccount(input));\n case 'createFiscalYear': {\n const fiscalYear = ledger.createFiscalYear(input);\n return { year: fiscalYear.year, periodCount: fiscalYear.periods().length };\n }\n case 'lockAccount':\n return serialize(ledger.lockAccount(input));\n case 'importChartOfAccounts':\n return { importedCount: ledger.importChartOfAccounts(input) };\n case 'importMapping':\n return new MappingImporter(this.tenant.accounts, this.tenant.mappings).import(input);\n case 'createPartner':\n return serialize(this.tenant.partnerService.create(input));\n case 'updatePartner':\n return serialize(this.tenant.partnerService.update(input));\n case 'acquireAsset':\n return this.tenant.assetService.acquire(input);\n case 'disposeAsset':\n return this.tenant.assetService.dispose(input);\n case 'runDepreciation':\n return this.tenant.assetService.runDepreciation(input);\n case 'setAllocationScheme':\n return this.tenant.costing.setAllocationScheme(input);\n case 'runCosting': {\n const run = this.tenant.costing.run(input);\n return { runId: run.id.value, status: run.status(), version: run.version };\n }\n case 'releaseCosting': {\n const released = this.tenant.costing.release(input);\n return { runId: released.id.value, status: released.status() };\n }\n default:\n throw new DomainError('E_NOT_IMPLEMENTED', `Operation \"${op}\" ist nicht definiert`);\n }\n }\n\n project(name: string, params: Record<string, unknown>): Record<string, unknown> {\n const tenant = this.tenant;\n\n switch (name) {\n case 'trialBalance':\n return new TrialBalanceProjection(tenant.baseCurrency, tenant.accounts, tenant.journal).compute(params);\n case 'openItems':\n return new OpenItemsProjection(tenant.openItems, tenant.vouchers, tenant.journal).compute(params);\n case 'accountSheet':\n return new AccountSheetProjection(tenant.baseCurrency, tenant.accounts, tenant.journal).compute(params);\n case 'auditLog':\n return new AuditLogProjection(tenant.audit).compute(params);\n case 'assetRegister':\n return new AssetRegisterProjection(tenant.assets).compute(params);\n case 'costAllocationSheet':\n return tenant.costing.costAllocationSheet(params);\n case 'ecSalesList':\n return new EcSalesListProjection(\n tenant.baseCurrency,\n tenant.journal,\n tenant.vouchers,\n tenant.partners,\n tenant.tax.registryHandle(),\n ).compute(params);\n case 'incomeStatement':\n return new IncomeStatementProjection(\n tenant.baseCurrency,\n tenant.accounts,\n tenant.journal,\n tenant.mappings,\n ).compute(params);\n case 'balanceSheet':\n return new BalanceSheetProjection(\n tenant.baseCurrency,\n tenant.accounts,\n tenant.journal,\n tenant.mappings,\n ).compute(params);\n case 'vatReturn':\n return new VatReturnProjection(\n tenant.baseCurrency,\n tenant.journal,\n tenant.openItems,\n tenant.vouchers,\n tenant.accounts,\n tenant.tax.registryHandle(),\n tenant.tax.profile(),\n ).compute(params);\n case 'cashBasisReport':\n return new CashBasisProjection(\n tenant.baseCurrency,\n tenant.accounts,\n tenant.journal,\n tenant.openItems,\n tenant.vouchers,\n tenant.fiscalYears,\n tenant.mappings,\n ).compute(params);\n case 'journalExport':\n return new JournalExportProjection(\n tenant.id,\n tenant.name,\n tenant.baseCurrency,\n tenant.journal,\n tenant.accounts,\n tenant.vouchers,\n tenant.partners,\n tenant.audit,\n tenant.clock,\n ).compute(params);\n case 'datevExport':\n return new DatevExportProjection(\n tenant.journal,\n tenant.accounts,\n tenant.vouchers,\n tenant.partners,\n tenant.tax.registryHandle(),\n ).compute(params);\n default:\n throw new DomainError('E_NOT_IMPLEMENTED', `Projektion \"${name}\" ist nicht definiert`);\n }\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { Account } from '../ledger/account.js';\nimport { FiscalYear } from '../ledger/fiscal-year.js';\nimport { isAccountType } from '../ledger/types.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Clock } from '../shared/clock.js';\nimport { Currency } from '../shared/currency.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { TaxCodeRegistry } from '../tax/tax-code-registry.js';\nimport { TaxProfile } from '../tax/tax-profile.js';\nimport { Tenant } from './tenant.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * `createTenant` (SF-01): Mandant per Profil anlegen — sofort buchbar. Profile\n * sind versionierte Regelmodul-Daten; der Mandant pinnt die Version.\n */\nexport class TenantFactory {\n constructor(\n private readonly ruleModules: Record<string, unknown>,\n private readonly clock: Clock,\n private readonly ids: IdGenerator,\n ) {}\n\n create(input: Record<string, unknown>): { tenant: Tenant; result: Record<string, unknown> } {\n const profileId = asString(input.profile) ?? '';\n const profile = this.findById('profiles', profileId);\n if (profile === null) {\n throw new DomainError('E_PROFILE_UNKNOWN', `Profil \"${profileId}\" ist nicht vorhanden`);\n }\n\n const coaId = asString(profile.chartOfAccounts) ?? '';\n const coa = this.findById('chartsOfAccounts', coaId);\n if (coa === null) {\n throw new DomainError('E_PROFILE_UNKNOWN', `Kontenrahmen \"${coaId}\" des Profils fehlt`);\n }\n\n const wantedCodes = Array.isArray(profile.taxCodes) ? profile.taxCodes : [];\n const allTaxCodes = Array.isArray(this.ruleModules.taxCodes) ? this.ruleModules.taxCodes : [];\n const taxCodeData = allTaxCodes.filter(\n (code): code is Record<string, unknown> => isRecord(code) && wantedCodes.includes(code.code),\n );\n\n const defaults = isRecord(profile.defaults) ? profile.defaults : {};\n const taxProfile = TaxProfile.fromData(defaults);\n\n const tenant = Tenant.inMemory(\n asString(input.name) ?? 'Tenant',\n Currency.of(asString(input.baseCurrency) ?? 'EUR'),\n this.clock,\n this.ids,\n undefined,\n TaxCodeRegistry.fromData(taxCodeData),\n taxProfile,\n );\n\n let accountCount = 0;\n for (const accountData of Array.isArray(coa.accounts) ? coa.accounts : []) {\n if (!isRecord(accountData)) continue;\n const type = accountData.type;\n if (!isAccountType(type)) continue;\n tenant.accounts.add(\n new Account(\n tenant.ids.next(),\n AccountNumber.of(asString(accountData.number) ?? ''),\n asString(accountData.name) ?? '',\n type,\n asString(accountData.subtype),\n 'active',\n ),\n );\n accountCount++;\n }\n\n const year = typeof input.firstFiscalYear === 'number' ? input.firstFiscalYear : 0;\n if (year > 0) {\n const y = String(year).padStart(4, '0');\n tenant.fiscalYears.add(\n FiscalYear.create(tenant.ids.next(), year, CalendarDate.of(`${y}-01-01`), CalendarDate.of(`${y}-12-31`)),\n );\n }\n\n return {\n tenant,\n result: {\n id: tenant.id.value,\n name: tenant.name,\n profile: { id: profileId, version: asString(profile.version) ?? '' },\n accountCount,\n taxationMethod: taxProfile.taxationMethod(),\n },\n };\n }\n\n private findById(module: string, id: string): Record<string, unknown> | null {\n const list = Array.isArray(this.ruleModules[module]) ? (this.ruleModules[module] as unknown[]) : [];\n for (const candidate of list) {\n if (isRecord(candidate) && candidate.id === id) return candidate;\n }\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/errors.ts","../src/shared/currency.ts","../src/shared/money.ts","../src/shared/canonical-json.ts","../src/shared/clock.ts","../src/shared/uuid.ts","../src/shared/id-generator.ts","../src/shared/calendar-date.ts","../src/shared/account-number.ts","../src/shared/period-ref.ts","../src/shared/dimension-value.ts","../src/domain-error.ts","../src/ledger/types.ts","../src/ledger/account.ts","../src/ledger/entry-line.ts","../src/ledger/journal-entry.ts","../src/ledger/voucher.ts","../src/ledger/period.ts","../src/ledger/fiscal-year.ts","../src/ledger/audit-record.ts","../src/ledger/open-item.ts","../src/ledger/settlement.ts","../src/ledger/post-result.ts","../src/ledger/dimension-registry.ts","../src/ledger/ledger.ts","../src/in-memory.ts","../src/assets/asset.ts","../src/assets/asset-route.ts","../src/assets/asset-service.ts","../src/costing/costing-run.ts","../src/costing/costing-service.ts","../src/partner/partner.ts","../src/partner/partner-service.ts","../src/projection/ec-sales-list.ts","../src/projection/trial-balance.ts","../src/projection/open-items.ts","../src/projection/account-sheet.ts","../src/projection/audit-log.ts","../src/projection/vat-return.ts","../src/projection/income-statement.ts","../src/mapping/mapping.ts","../src/projection/balance-sheet.ts","../src/projection/cash-basis.ts","../src/projection/asset-register.ts","../src/projection/journal-export.ts","../src/projection/datev-export.ts","../src/mapping/mapping-registry.ts","../src/mapping/mapping-importer.ts","../src/tax/tax-code.ts","../src/tax/tax-code-version.ts","../src/tax/tax-code-registry.ts","../src/tax/tax-profile.ts","../src/tax/tax-service.ts","../src/composition/tenant.ts","../src/composition/post-voucher-service.ts","../src/composition/tenant-operations.ts","../src/composition/tenant-factory.ts"],"names":["isRecord","asString","Big"],"mappings":"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","file":"index.js","sourcesContent":["/** Fachlich ungültiger Wert (Betrag, Gewicht, Code, UUID …). */\nexport class InvalidValue extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidValue';\n }\n}\n\n/** Verschiedene Währungen lassen sich nicht verrechnen. */\nexport class CurrencyMismatch extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CurrencyMismatch';\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Währung nach ISO 4217 mit fester Nachkommastellen-Skala\n * (datenformat.md: \"feste Nachkommastellen je Währung\").\n *\n * Skalen abweichend vom Default 2 — bewusst klein, v1 ist EUR-zentriert,\n * Fremdwährung kommt erst in v2.\n */\nconst SCALES: Readonly<Record<string, number>> = {\n JPY: 0,\n KRW: 0,\n BHD: 3,\n KWD: 3,\n TND: 3,\n};\n\nexport class Currency {\n private constructor(\n readonly code: string,\n readonly scale: number,\n ) {}\n\n static of(code: string): Currency {\n if (!/^[A-Z]{3}$/.test(code)) {\n throw new InvalidValue(`Ungültiger ISO-4217-Code: \"${code}\"`);\n }\n return new Currency(code, SCALES[code] ?? 2);\n }\n\n equals(other: Currency): boolean {\n return this.code === other.code;\n }\n\n toJSON(): string {\n return this.code;\n }\n\n toString(): string {\n return this.code;\n }\n}\n","import Big from 'big.js';\nimport { Currency } from './currency.js';\nimport { CurrencyMismatch, InvalidValue } from './errors.js';\n\n// Determinismus-Anhang §2: kaufmännisch HALF_UP, von Null weg bei genau .5\n// (NICHT banker's). big.js `roundHalfUp` (=1) rundet away-from-zero.\nconst HALF_UP = Big.roundHalfUp;\n\n/** Nachkommastellen eines Big-Werts (big.js hält Koeffizient `c` + Exponent `e`). */\nfunction decimalPlaces(value: Big): number {\n return Math.max(0, value.c.length - value.e - 1);\n}\n\n/**\n * Betrag = Dezimalwert + Währung, nie Float (Glossar `money`).\n *\n * Determinismus-Regeln (determinismus.md §2):\n * - Rundung: kaufmännisch half-up, von Null weg bei genau .5.\n * - allocate: Largest-Remainder, Gleichstand → erster Teil; Σ Teile = Betrag, immer.\n *\n * Der Betrag liegt intern immer exakt auf der Währungsskala.\n */\nexport class Money {\n private constructor(\n private readonly amount: Big,\n readonly currency: Currency,\n ) {}\n\n private static currencyOf(currency: Currency | string): Currency {\n return currency instanceof Currency ? currency : Currency.of(currency);\n }\n\n /**\n * Exakter Betrag auf Währungsskala. Mehr Nachkommastellen als die Währung\n * erlaubt sind ein Fehler — hier wird nie still gerundet.\n */\n static of(amount: string, currency: Currency | string): Money {\n const cur = Money.currencyOf(currency);\n let value: Big;\n try {\n value = new Big(amount);\n } catch {\n throw new InvalidValue(`Ungültiger Betrag \"${amount}\" für Währung ${cur.code} (Skala ${cur.scale})`);\n }\n const scaled = value.round(cur.scale, HALF_UP);\n if (!scaled.eq(value)) {\n throw new InvalidValue(`Ungültiger Betrag \"${amount}\" für Währung ${cur.code} (Skala ${cur.scale})`);\n }\n return new Money(scaled, cur);\n }\n\n /**\n * Ergebnis einer Rechnung auf Währungsskala bringen: half-up\n * (2.225 → 2.23, -2.345 → -2.35). Einziger Weg, auf dem Money rundet.\n */\n static fromCalculation(value: Big | string, currency: Currency | string): Money {\n const cur = Money.currencyOf(currency);\n let big: Big;\n try {\n big = value instanceof Big ? value : new Big(value);\n } catch {\n throw new InvalidValue(`Ungültiger Rechenwert für Währung ${cur.code}`);\n }\n return new Money(big.round(cur.scale, HALF_UP), cur);\n }\n\n static zero(currency: Currency | string): Money {\n return new Money(new Big(0), Money.currencyOf(currency));\n }\n\n add(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(this.amount.plus(other.amount), this.currency);\n }\n\n subtract(other: Money): Money {\n this.assertSameCurrency(other);\n return new Money(this.amount.minus(other.amount), this.currency);\n }\n\n negate(): Money {\n return new Money(this.amount.times(-1), this.currency);\n }\n\n abs(): Money {\n return new Money(this.amount.abs(), this.currency);\n }\n\n /** -1, 0 oder 1 */\n compareTo(other: Money): number {\n this.assertSameCurrency(other);\n return this.amount.cmp(other.amount);\n }\n\n equals(other: Money): boolean {\n return this.currency.equals(other.currency) && this.amount.eq(other.amount);\n }\n\n isZero(): boolean {\n return this.amount.eq(0);\n }\n\n isPositive(): boolean {\n return this.amount.gt(0);\n }\n\n isNegative(): boolean {\n return this.amount.lt(0);\n }\n\n /**\n * Verteilt den Betrag nach Gewichten (determinismus.md §2): Largest-Remainder,\n * Gleichstand → erster Teil. Σ Teile = Betrag, immer.\n *\n * Gewichte: nicht-negative Dezimalwerte (Zahl oder String), Summe > 0.\n * Negative Beträge werden als negiertes Spiegelbild verteilt.\n */\n allocate(...weights: Array<number | string>): Money[] {\n if (weights.length === 0) {\n throw new InvalidValue('allocate braucht mindestens ein Gewicht');\n }\n\n if (this.isNegative()) {\n return this.negate()\n .allocate(...weights)\n .map((part) => part.negate());\n }\n\n const scale = this.currency.scale;\n const integerWeights = Money.normalizeWeights(weights);\n\n let weightSum = 0n;\n for (const weight of integerWeights) {\n weightSum += weight;\n }\n if (weightSum === 0n) {\n throw new InvalidValue('Gewichtssumme muss > 0 sein');\n }\n\n const factor = new Big(10).pow(scale);\n const totalMinor = BigInt(this.amount.times(factor).toFixed(0));\n\n const parts = integerWeights.map((weight) => {\n const product = totalMinor * weight;\n return { base: product / weightSum, remainder: product % weightSum };\n });\n\n let assigned = 0n;\n for (const part of parts) {\n assigned += part.base;\n }\n\n // Restverteilung nach größtem Rest; Gleichstand → kleinster Index.\n const leftover = Number(totalMinor - assigned);\n const order = parts.map((part, index) => ({ remainder: part.remainder, index }));\n order.sort((a, b) =>\n a.remainder > b.remainder ? -1 : a.remainder < b.remainder ? 1 : a.index - b.index,\n );\n for (let i = 0; i < leftover; i++) {\n parts[order[i]!.index]!.base += 1n;\n }\n\n return parts.map((part) => Money.fromMinor(part.base, scale, this.currency));\n }\n\n /** Verteilung in n gleiche Teile (Sammelposten-Fünftel, AfA-Monatsraten). */\n allocateEvenly(parts: number): Money[] {\n if (parts < 1) {\n throw new InvalidValue('allocateEvenly braucht mindestens einen Teil');\n }\n return this.allocate(...new Array<number>(parts).fill(1));\n }\n\n /** Betrag als String-Dezimal mit fester Skala, z. B. \"1234.56\" (datenformat.md). */\n amountAsString(): string {\n return this.amount.toFixed(this.currency.scale);\n }\n\n toJSON(): { amount: string; currency: string } {\n return { amount: this.amountAsString(), currency: this.currency.code };\n }\n\n toString(): string {\n return `${this.amountAsString()} ${this.currency.code}`;\n }\n\n private static fromMinor(minor: bigint, scale: number, currency: Currency): Money {\n const value = new Big(minor.toString()).div(new Big(10).pow(scale));\n return new Money(value.round(scale, HALF_UP), currency);\n }\n\n /** Dezimalgewichte verlustfrei auf ganzzahlige Gewichte gleicher Skala bringen. */\n private static normalizeWeights(weights: Array<number | string>): bigint[] {\n const decimals: Big[] = [];\n let maxScale = 0;\n\n for (const weight of weights) {\n let decimal: Big;\n try {\n decimal = new Big(weight);\n } catch {\n throw new InvalidValue(`Ungültiges Gewicht \"${weight}\"`);\n }\n if (decimal.lt(0)) {\n throw new InvalidValue('Gewichte dürfen nicht negativ sein');\n }\n decimals.push(decimal);\n maxScale = Math.max(maxScale, decimalPlaces(decimal));\n }\n\n const factor = new Big(10).pow(maxScale);\n return decimals.map((decimal) => BigInt(decimal.times(factor).toFixed(0)));\n }\n\n private assertSameCurrency(other: Money): void {\n if (!this.currency.equals(other.currency)) {\n throw new CurrencyMismatch(\n `Währungen mischen sich nicht: ${this.currency.code} vs. ${other.currency.code}`,\n );\n }\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Kanonisches JSON nach RFC 8785 (JCS) — Grundlage aller Hashes und\n * Determinismus-Vergleiche (datenformat.md Grundsatz 1, determinismus.md §5).\n *\n * Bewusste Abweichung vom vollen RFC: Floats werden abgelehnt statt\n * ECMAScript-serialisiert — das Datenformat verbietet JSON-Number für Beträge\n * (String-Dezimal), und Ganzzahlen (sequenceNumber, year) sind exakt darstellbar.\n *\n * Schlüsselsortierung nach UTF-16-Code-Units: JS-Strings sind UTF-16, der\n * native `Array#sort` vergleicht genau danach — RFC-konform ohne Handarbeit\n * (Surrogatpaare sortieren vor U+E000..U+FFFF).\n *\n * Objekte mit `toJSON()` werden entpackt (JS-Pendant zu PHPs JsonSerializable).\n */\nconst MAX_SAFE_INTEGER = 9007199254740991; // 2^53 - 1\n\nexport function canonicalJson(value: unknown): string {\n return encodeValue(value);\n}\n\nfunction encodeValue(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (typeof value === 'number') {\n if (!Number.isInteger(value)) {\n throw new InvalidValue(\n 'Floats sind im Datenformat verboten (Beträge als String-Dezimal, datenformat.md)',\n );\n }\n if (Math.abs(value) > MAX_SAFE_INTEGER) {\n throw new InvalidValue(`Ganzzahl außerhalb des sicheren Bereichs (|x| > 2^53-1): ${value}`);\n }\n return String(value);\n }\n if (typeof value === 'string') {\n return encodeString(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(encodeValue).join(',')}]`;\n }\n if (typeof value === 'object') {\n const candidate = value as { toJSON?: () => unknown };\n if (typeof candidate.toJSON === 'function') {\n return encodeValue(candidate.toJSON());\n }\n return encodeObject(value as Record<string, unknown>);\n }\n throw new InvalidValue(`Nicht serialisierbarer Typ: ${typeof value}`);\n}\n\nfunction encodeObject(object: Record<string, unknown>): string {\n const keys = Object.keys(object);\n if (keys.length === 0) {\n return '{}';\n }\n // Native Sortierung = UTF-16-Code-Unit-Reihenfolge = RFC 8785.\n keys.sort();\n return `{${keys.map((key) => `${encodeString(key)}:${encodeValue(object[key])}`).join(',')}}`;\n}\n\n/**\n * JCS-Stringserialisierung (RFC 8785 §3.2.2.2): kurze Escapes für die üblichen\n * Steuerzeichen, \\u00xx (lowercase) für den Rest unter U+0020, alles andere roh.\n */\nfunction encodeString(value: string): string {\n let out = '\"';\n for (let i = 0; i < value.length; i++) {\n const char = value[i]!;\n const code = value.charCodeAt(i);\n if (char === '\"') {\n out += '\\\\\"';\n } else if (char === '\\\\') {\n out += '\\\\\\\\';\n } else if (code === 0x08) {\n out += '\\\\b';\n } else if (code === 0x09) {\n out += '\\\\t';\n } else if (code === 0x0a) {\n out += '\\\\n';\n } else if (code === 0x0c) {\n out += '\\\\f';\n } else if (code === 0x0d) {\n out += '\\\\r';\n } else if (code < 0x20) {\n out += `\\\\u${code.toString(16).padStart(4, '0')}`;\n } else {\n out += char;\n }\n }\n return `${out}\"`;\n}\n","/**\n * Zeitquelle des Kerns (Determinismus-Hook). Bewusst eigenes Interface,\n * PSR-20-/Temporal-kompatibel im Geist: liefert einen Zeitpunkt.\n */\nexport interface Clock {\n now(): Date;\n}\n\n/** Echte Systemzeit (Produktion). */\nexport class SystemClock implements Clock {\n now(): Date {\n return new Date();\n }\n}\n\n/** Feststehende Zeit für Tests und deterministische Läufe. */\nexport class FixedClock implements Clock {\n private current: Date;\n\n private constructor(at: Date) {\n this.current = at;\n }\n\n static at(iso8601: string): FixedClock {\n return new FixedClock(new Date(iso8601));\n }\n\n now(): Date {\n return this.current;\n }\n\n advanceMilliseconds(milliseconds: number): void {\n this.current = new Date(this.current.getTime() + milliseconds);\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport { type Clock, SystemClock } from './clock.js';\nimport { InvalidValue } from './errors.js';\n\n/**\n * UUIDv7 (RFC 9562): 48 Bit Unix-Millisekunden + Zufall — zeitlich sortierbar\n * als String, implementierungsunabhängig erzeugbar (datenformat.md Grundsatz 3).\n * Fixtures vergleichen nie ID-Werte, nur Platzhalter-Gleichheit.\n */\nconst PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport class Uuid {\n private constructor(readonly value: string) {}\n\n static fromString(value: string): Uuid {\n const normalized = value.toLowerCase();\n if (!PATTERN.test(normalized)) {\n throw new InvalidValue(`Keine gültige UUID: \"${value}\"`);\n }\n return new Uuid(normalized);\n }\n\n static v7(clock: Clock = new SystemClock()): Uuid {\n const time = clock.now().getTime().toString(16).padStart(12, '0');\n const random = randomBytes(10).toString('hex'); // 20 Hex-Zeichen Entropie\n // Variantennibble: oberste zwei Bits = 10 -> 8, 9, a oder b.\n const variant = ((parseInt(random[3]!, 16) & 0x3) | 0x8).toString(16);\n\n return new Uuid(\n `${time.slice(0, 8)}-${time.slice(8, 12)}-7${random.slice(0, 3)}-${variant}${random.slice(4, 7)}-${random.slice(7, 19)}`,\n );\n }\n\n equals(other: Uuid): boolean {\n return this.value === other.value;\n }\n\n /** Byteweise = zeitliche Ordnung bei v7. */\n compareTo(other: Uuid): number {\n return this.value < other.value ? -1 : this.value > other.value ? 1 : 0;\n }\n\n toJSON(): string {\n return this.value;\n }\n\n toString(): string {\n return this.value;\n }\n}\n","import { type Clock, SystemClock } from './clock.js';\nimport { Uuid } from './uuid.js';\n\n/**\n * ID-Quelle des Kerns — Port, damit Tests und Determinismus-Läufe die Erzeugung\n * kontrollieren können. Produktion: UUIDv7.\n */\nexport interface IdGenerator {\n next(): Uuid;\n}\n\n/** Produktions-Generator: echte UUIDv7 aus Zeit + Zufall. */\nexport class UuidV7IdGenerator implements IdGenerator {\n constructor(private readonly clock: Clock = new SystemClock()) {}\n\n next(): Uuid {\n return Uuid.v7(this.clock);\n }\n}\n\n/**\n * UUIDv7-förmige IDs aus fester Uhr + Zähler statt Zufall — für Tests und den\n * Doppellauf-Determinismus-Check der Konformitätssuite (Strom-Hashes enthalten\n * IDs; zwei Läufe müssen byte-identisch sein).\n */\nexport class DeterministicIdGenerator implements IdGenerator {\n private counter = 0;\n\n constructor(private readonly clock: Clock) {}\n\n next(): Uuid {\n this.counter++;\n\n const time = this.clock.now().getTime().toString(16).padStart(12, '0');\n const sequence = this.counter.toString(16).padStart(18, '0');\n\n return Uuid.fromString(\n `${time.slice(0, 8)}-${time.slice(8, 12)}-7${sequence.slice(0, 3)}-8${sequence.slice(3, 6)}-${sequence.slice(6, 18)}`,\n );\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Zonenloses Kalenderdatum (determinismus.md §4): Beleg- und Buchungsdatum\n * kennen keine Zeitzone — kein UTC-Shift-Risiko. ISO-Format sortiert\n * lexikographisch korrekt (= chronologisch).\n */\nfunction toIso(year: number, monthIndex: number, day: number): string {\n const date = new Date(Date.UTC(year, monthIndex, day));\n const y = String(date.getUTCFullYear()).padStart(4, '0');\n const m = String(date.getUTCMonth() + 1).padStart(2, '0');\n const d = String(date.getUTCDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n}\n\nexport class CalendarDate {\n private constructor(readonly iso: string) {}\n\n static of(iso: string): CalendarDate {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(iso)) {\n throw new InvalidValue(`Kein gültiges Kalenderdatum: \"${iso}\"`);\n }\n const year = Number(iso.slice(0, 4));\n const month = Number(iso.slice(5, 7));\n const day = Number(iso.slice(8, 10));\n // Round-trip-Prüfung fängt 2026-13-01, 2026-02-30 etc.\n if (toIso(year, month - 1, day) !== iso) {\n throw new InvalidValue(`Kein gültiges Kalenderdatum: \"${iso}\"`);\n }\n return new CalendarDate(iso);\n }\n\n compareTo(other: CalendarDate): number {\n return this.iso < other.iso ? -1 : this.iso > other.iso ? 1 : 0;\n }\n\n equals(other: CalendarDate): boolean {\n return this.iso === other.iso;\n }\n\n isBefore(other: CalendarDate): boolean {\n return this.compareTo(other) < 0;\n }\n\n isAfter(other: CalendarDate): boolean {\n return this.compareTo(other) > 0;\n }\n\n isBetween(start: CalendarDate, end: CalendarDate): boolean {\n return !this.isBefore(start) && !this.isAfter(end);\n }\n\n year(): number {\n return Number(this.iso.slice(0, 4));\n }\n\n month(): number {\n return Number(this.iso.slice(5, 7));\n }\n\n lastDayOfMonth(): CalendarDate {\n // Tag 0 des Folgemonats = letzter Tag dieses Monats.\n return new CalendarDate(toIso(this.year(), this.month(), 0));\n }\n\n firstDayOfNextMonth(): CalendarDate {\n return new CalendarDate(toIso(this.year(), this.month(), 1));\n }\n\n toJSON(): string {\n return this.iso;\n }\n\n toString(): string {\n return this.iso;\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Kontonummer als String — führende Nullen signifikant (datenformat.md).\n * Vergleich nach Unicode-Codepoints, keine Locale-Collation: \"10\" < \"9\",\n * \"0420\" < \"1200\" < \"8400\" (determinismus.md §3). JS-`<` auf Strings\n * vergleicht UTF-16-Code-Units = Codepoints im BMP.\n */\nexport class AccountNumber {\n private constructor(readonly value: string) {}\n\n static of(value: string): AccountNumber {\n if (value === '' || value.length > 64) {\n throw new InvalidValue('Kontonummer muss 1-64 Zeichen lang sein');\n }\n if (!/^[^\\s\\p{C}]+$/u.test(value)) {\n throw new InvalidValue(`Kontonummer enthält Whitespace oder Steuerzeichen: \"${value}\"`);\n }\n return new AccountNumber(value);\n }\n\n compareTo(other: AccountNumber): number {\n return this.value < other.value ? -1 : this.value > other.value ? 1 : 0;\n }\n\n equals(other: AccountNumber): boolean {\n return this.value === other.value;\n }\n\n toJSON(): string {\n return this.value;\n }\n\n toString(): string {\n return this.value;\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Verweis auf eine Periode: Geschäftsjahr + Periodennummer (datenformat.md\n * `periodRef`). `fiscalYear` = Kalenderjahr des GJ-Endes.\n */\nexport class PeriodRef {\n constructor(\n readonly fiscalYear: number,\n readonly period: number,\n ) {\n if (fiscalYear < 1 || fiscalYear > 9999) {\n throw new InvalidValue(`Ungültiges Geschäftsjahr: ${fiscalYear}`);\n }\n if (period < 1 || period > 999) {\n throw new InvalidValue(`Ungültige Periodennummer: ${period}`);\n }\n }\n\n /** Chronologisch: erst Jahr, dann Periode. */\n compareTo(other: PeriodRef): number {\n if (this.fiscalYear !== other.fiscalYear) {\n return this.fiscalYear < other.fiscalYear ? -1 : 1;\n }\n return this.period < other.period ? -1 : this.period > other.period ? 1 : 0;\n }\n\n equals(other: PeriodRef): boolean {\n return this.fiscalYear === other.fiscalYear && this.period === other.period;\n }\n\n toJSON(): { fiscalYear: number; period: number } {\n return { fiscalYear: this.fiscalYear, period: this.period };\n }\n}\n","import { InvalidValue } from './errors.js';\n\n/**\n * Zusatzzuordnung einer Buchungsposition: Dimensionstyp + Wert-Code\n * (datenformat.md). Gültigkeitsprüfung gegen Stammdaten passiert an der\n * Operation (E_DIMENSION_INVALID), nicht hier.\n */\nexport class DimensionValue {\n private constructor(\n readonly type: string,\n readonly code: string,\n ) {}\n\n static of(type: string, code: string): DimensionValue {\n if (type === '' || code === '') {\n throw new InvalidValue('Dimensionstyp und -code dürfen nicht leer sein');\n }\n return new DimensionValue(type, code);\n }\n\n equals(other: DimensionValue): boolean {\n return this.type === other.type && this.code === other.code;\n }\n\n toJSON(): { type: string; code: string } {\n return { type: this.type, code: this.code };\n }\n}\n","/**\n * Fachlicher Fehler mit Katalog-Code (fehlerkatalog.md). Vertragsteil: gleicher\n * Verstoß → gleicher Code in allen Implementierungen. `message` ist frei,\n * `details` trägt beteiligte IDs/Werte.\n */\nexport class DomainError extends Error {\n constructor(\n readonly errorCode: string,\n message = '',\n readonly details: Record<string, unknown> = {},\n ) {\n super(message !== '' ? message : errorCode);\n this.name = 'DomainError';\n }\n}\n","/** Soll/Haben. */\nexport type Side = 'debit' | 'credit';\n\n/**\n * Kontotyp bestimmt die Saldenmechanik (ledger-modell.md): Bestandskonten\n * kumulieren über Jahre, Erfolgskonten je Geschäftsjahr.\n */\nexport type AccountType = 'asset' | 'liability' | 'equity' | 'expense' | 'revenue';\n\nconst BALANCE_CARRYING: ReadonlySet<AccountType> = new Set<AccountType>([\n 'asset',\n 'liability',\n 'equity',\n]);\n\n/** Bestandskonto: Saldo trägt implizit vor (kein SBK/EBK). */\nexport function isBalanceCarrying(type: AccountType): boolean {\n return BALANCE_CARRYING.has(type);\n}\n\nexport function isAccountType(value: unknown): value is AccountType {\n return (\n value === 'asset' ||\n value === 'liability' ||\n value === 'equity' ||\n value === 'expense' ||\n value === 'revenue'\n );\n}\n\nexport type AccountStatus = 'active' | 'locked';\n\n/** GoBD-Lebenszyklus: erfasst (korrigierbar) → festgeschrieben (nur Storno). */\nexport type EntryStatus = 'entered' | 'finalized';\n\nexport type PeriodStatus = 'open' | 'closed';\n\nexport type FiscalYearStatus = 'open' | 'closed';\n\nexport type OpenItemKind = 'receivable' | 'payable';\n\nexport type OpenItemStatus = 'open' | 'partially_settled' | 'settled';\n\n/**\n * Ausgleich mit Differenz (api.md G2): Skonto, Forderungsausfall, Kleindifferenz.\n * Die Differenz muss als Buchungszeile(n) sichtbar sein (§ 17 UStG).\n */\nexport type SettlementDifferenceKind = 'discount' | 'bad_debt' | 'minor';\n\nexport function parseSettlementDifferenceKind(value: unknown): SettlementDifferenceKind | null {\n return value === 'discount' || value === 'bad_debt' || value === 'minor' ? value : null;\n}\n\nexport function parseOpenItemKind(value: unknown): OpenItemKind | null {\n return value === 'receivable' || value === 'payable' ? value : null;\n}\n","import { AccountNumber } from '../shared/account-number.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { AccountStatus, AccountType } from './types.js';\n\n/**\n * Konto (ledger-modell.md Aggregat 2). Kein Saldo im Aggregat — Salden sind\n * Projektionen des Journals, immer.\n */\nexport class Account {\n private accountStatus: AccountStatus;\n\n constructor(\n readonly id: Uuid,\n readonly number: AccountNumber,\n readonly name: string,\n readonly type: AccountType,\n readonly subtype: string | null,\n status: AccountStatus = 'active',\n ) {\n this.accountStatus = status;\n }\n\n status(): AccountStatus {\n return this.accountStatus;\n }\n\n isLocked(): boolean {\n return this.accountStatus === 'locked';\n }\n\n lock(): void {\n this.accountStatus = 'locked';\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n number: this.number.value,\n name: this.name,\n type: this.type,\n subtype: this.subtype,\n status: this.accountStatus,\n };\n }\n}\n","import type { AccountNumber } from '../shared/account-number.js';\nimport type { DimensionValue } from '../shared/dimension-value.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { Side } from './types.js';\n\n/**\n * Buchungsposition — Value Object innerhalb der Buchung (keine eigene Identität;\n * Referenz = Buchungs-ID + Positionsindex).\n */\nexport class EntryLine {\n constructor(\n readonly accountId: Uuid,\n readonly account: AccountNumber,\n readonly side: Side,\n readonly money: Money,\n readonly dimensions: DimensionValue[] = [],\n readonly taxTag: Record<string, unknown> | null = null,\n ) {}\n\n negated(): EntryLine {\n return new EntryLine(\n this.accountId,\n this.account,\n this.side,\n this.money.negate(),\n this.dimensions,\n this.taxTag,\n );\n }\n\n toJSON(): Record<string, unknown> {\n return {\n accountId: this.accountId.value,\n account: this.account.value,\n side: this.side,\n money: this.money.toJSON(),\n dimensions: this.dimensions.map((dimension) => dimension.toJSON()),\n taxTag: this.taxTag,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport type { PeriodRef } from '../shared/period-ref.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { EntryLine } from './entry-line.js';\nimport type { EntryStatus } from './types.js';\n\n/**\n * Buchung — das wichtigste Aggregat (ledger-modell.md). Entsteht vollständig und\n * gültig (Validierung im Ledger-Service); Lebenszyklus entered → finalized,\n * danach nur Storno (neue Buchung mit Rückverweis, Generalumkehr).\n */\nexport class JournalEntry {\n private entryText: string;\n private entryLines: EntryLine[];\n private entryReversedBy: Uuid | null;\n private entryStatus: EntryStatus;\n\n constructor(\n readonly id: Uuid,\n readonly sequenceNumber: number,\n readonly entryDate: CalendarDate,\n readonly voucherDate: CalendarDate | null,\n readonly recordedAt: string,\n readonly periodRef: PeriodRef,\n readonly voucherId: Uuid,\n text: string,\n lines: EntryLine[],\n readonly reverses: Uuid | null = null,\n reversedBy: Uuid | null = null,\n status: EntryStatus = 'entered',\n ) {\n this.entryText = text;\n this.entryLines = lines;\n this.entryReversedBy = reversedBy;\n this.entryStatus = status;\n }\n\n status(): EntryStatus {\n return this.entryStatus;\n }\n\n isFinalized(): boolean {\n return this.entryStatus === 'finalized';\n }\n\n text(): string {\n return this.entryText;\n }\n\n lines(): EntryLine[] {\n return this.entryLines;\n }\n\n reversedBy(): Uuid | null {\n return this.entryReversedBy;\n }\n\n changeText(text: string): void {\n this.assertCorrectable();\n this.entryText = text;\n }\n\n changeLines(lines: EntryLine[]): void {\n this.assertCorrectable();\n this.entryLines = lines;\n }\n\n finalize(): void {\n this.entryStatus = 'finalized';\n }\n\n markReversed(reversalId: Uuid): void {\n if (this.entryReversedBy !== null) {\n throw new DomainError(\n 'E_ENTRY_ALREADY_REVERSED',\n `Buchung ${this.id.value} ist bereits storniert (durch ${this.entryReversedBy.value})`,\n { entryId: this.id.value, reversedBy: this.entryReversedBy.value },\n );\n }\n this.entryReversedBy = reversalId;\n }\n\n private assertCorrectable(): void {\n if (this.entryStatus !== 'entered') {\n throw new DomainError(\n 'E_ENTRY_FINALIZED',\n `Buchung ${this.id.value} ist festgeschrieben — Korrektur nicht möglich, nur Storno`,\n { entryId: this.id.value },\n );\n }\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n sequenceNumber: this.sequenceNumber,\n status: this.entryStatus,\n entryDate: this.entryDate.iso,\n voucherDate: this.voucherDate?.iso ?? null,\n recordedAt: this.recordedAt,\n periodRef: this.periodRef.toJSON(),\n voucherId: this.voucherId.value,\n text: this.entryText,\n lines: this.entryLines.map((line) => line.toJSON()),\n reverses: this.reverses?.value ?? null,\n reversedBy: this.entryReversedBy?.value ?? null,\n };\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Beleg (ledger-modell.md Aggregat 4): existiert vor/ohne Buchung, mehrere\n * Buchungen können ihn referenzieren. Metadaten für EÜR/USt (due, recurring,\n * economicYear, serviceDate/servicePeriod, partnerId, kind …).\n */\nexport interface VoucherProps {\n readonly id: Uuid;\n readonly voucherNumber: string;\n readonly voucherDate: CalendarDate;\n readonly due?: CalendarDate | null;\n readonly recurring?: boolean;\n readonly economicYear?: number | null;\n readonly supplierTaxationMethod?: string | null;\n readonly serviceDate?: CalendarDate | null;\n readonly servicePeriodFrom?: CalendarDate | null;\n readonly servicePeriodTo?: CalendarDate | null;\n readonly kind?: string | null;\n readonly partnerId?: Uuid | null;\n readonly issuer?: string | null;\n}\n\nexport class Voucher {\n readonly id: Uuid;\n readonly voucherNumber: string;\n readonly voucherDate: CalendarDate;\n readonly due: CalendarDate | null;\n readonly recurring: boolean;\n readonly economicYear: number | null;\n readonly supplierTaxationMethod: string | null;\n readonly serviceDate: CalendarDate | null;\n readonly servicePeriodFrom: CalendarDate | null;\n readonly servicePeriodTo: CalendarDate | null;\n readonly kind: string | null;\n readonly partnerId: Uuid | null;\n readonly issuer: string | null;\n\n constructor(props: VoucherProps) {\n this.id = props.id;\n this.voucherNumber = props.voucherNumber;\n this.voucherDate = props.voucherDate;\n this.due = props.due ?? null;\n this.recurring = props.recurring ?? false;\n this.economicYear = props.economicYear ?? null;\n this.supplierTaxationMethod = props.supplierTaxationMethod ?? null;\n this.serviceDate = props.serviceDate ?? null;\n this.servicePeriodFrom = props.servicePeriodFrom ?? null;\n this.servicePeriodTo = props.servicePeriodTo ?? null;\n this.kind = props.kind ?? null;\n this.partnerId = props.partnerId ?? null;\n this.issuer = props.issuer ?? null;\n }\n\n /** Steuerlich maßgebliches Datum: Leistungsdatum, Fallback Belegdatum. */\n taxDate(): CalendarDate {\n return this.serviceDate ?? this.servicePeriodTo ?? this.voucherDate;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n voucherNumber: this.voucherNumber,\n voucherDate: this.voucherDate.iso,\n due: this.due?.iso ?? null,\n recurring: this.recurring,\n economicYear: this.economicYear,\n supplierTaxationMethod: this.supplierTaxationMethod,\n serviceDate: this.serviceDate?.iso ?? null,\n servicePeriod:\n this.servicePeriodFrom === null\n ? null\n : { from: this.servicePeriodFrom.iso, to: this.servicePeriodTo?.iso ?? null },\n kind: this.kind,\n partnerId: this.partnerId?.value ?? null,\n issuer: this.issuer,\n };\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\nimport type { PeriodStatus } from './types.js';\n\n/**\n * Periode — Entity innerhalb des FiscalYear-Aggregats (lückenlos,\n * überlappungsfrei; Statuswechsel nur über das Aggregat).\n */\nexport class Period {\n private periodStatus: PeriodStatus;\n\n constructor(\n readonly number: number,\n readonly start: CalendarDate,\n readonly end: CalendarDate,\n status: PeriodStatus = 'open',\n ) {\n this.periodStatus = status;\n }\n\n status(): PeriodStatus {\n return this.periodStatus;\n }\n\n isOpen(): boolean {\n return this.periodStatus === 'open';\n }\n\n contains(date: CalendarDate): boolean {\n return date.isBetween(this.start, this.end);\n }\n\n /** Nur über FiscalYear aufrufen (Reihenfolgeprüfung dort). */\n close(): void {\n this.periodStatus = 'closed';\n }\n\n /** Nur über FiscalYear aufrufen (Jahresstatusprüfung dort). */\n reopen(): void {\n this.periodStatus = 'open';\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport { Period } from './period.js';\nimport type { FiscalYearStatus } from './types.js';\n\nexport interface PeriodDefinition {\n readonly period: number;\n readonly start: CalendarDate;\n readonly end: CalendarDate;\n}\n\n/**\n * Geschäftsjahr mit Perioden (ledger-modell.md Aggregat 3). Invarianten:\n * Perioden lückenlos und überlappungsfrei; Schließen nur in Reihenfolge;\n * Wiedereröffnen nur vor Jahresabschluss. `year` = Kalenderjahr des GJ-Endes.\n */\nexport class FiscalYear {\n private fiscalStatus: FiscalYearStatus;\n\n private constructor(\n readonly id: Uuid,\n readonly year: number,\n readonly start: CalendarDate,\n readonly end: CalendarDate,\n private readonly periodList: Period[],\n status: FiscalYearStatus = 'open',\n ) {\n this.fiscalStatus = status;\n }\n\n static create(\n id: Uuid,\n year: number,\n start: CalendarDate,\n end: CalendarDate,\n explicitPeriods: PeriodDefinition[] | null = null,\n ): FiscalYear {\n if (!start.isBefore(end)) {\n throw new InvalidValue('Geschäftsjahr: start muss vor end liegen');\n }\n const periods =\n explicitPeriods === null\n ? FiscalYear.monthlyPeriods(start, end)\n : explicitPeriods.map((d) => new Period(d.period, d.start, d.end));\n return new FiscalYear(id, year, start, end, periods);\n }\n\n /**\n * Aus Persistenz wiederherstellen: Status und Perioden explizit übernehmen\n * (kein Neuaufbau, keine Validierung) — Pendant zu PHPs `FiscalYear::restore`.\n */\n static restore(\n id: Uuid,\n year: number,\n start: CalendarDate,\n end: CalendarDate,\n status: FiscalYearStatus,\n periods: Period[],\n ): FiscalYear {\n return new FiscalYear(id, year, start, end, periods, status);\n }\n\n private static monthlyPeriods(start: CalendarDate, end: CalendarDate): Period[] {\n const periods: Period[] = [];\n let cursor = start;\n let number = 1;\n while (!cursor.isAfter(end)) {\n const monthEnd = cursor.lastDayOfMonth();\n const periodEnd = monthEnd.isAfter(end) ? end : monthEnd;\n periods.push(new Period(number, cursor, periodEnd));\n cursor = cursor.firstDayOfNextMonth();\n number++;\n }\n return periods;\n }\n\n status(): FiscalYearStatus {\n return this.fiscalStatus;\n }\n\n isClosed(): boolean {\n return this.fiscalStatus === 'closed';\n }\n\n periods(): Period[] {\n return this.periodList;\n }\n\n period(number: number): Period {\n const found = this.periodList.find((p) => p.number === number);\n if (found === undefined) {\n throw new DomainError(\n 'E_PERIOD_UNKNOWN',\n `Periode ${number} existiert nicht im Geschäftsjahr ${this.year}`,\n { fiscalYear: this.year, period: number },\n );\n }\n return found;\n }\n\n contains(date: CalendarDate): boolean {\n return date.isBetween(this.start, this.end);\n }\n\n periodForDate(date: CalendarDate): Period {\n const found = this.periodList.find((p) => p.contains(date));\n if (found === undefined) {\n throw new DomainError(\n 'E_PERIOD_UNKNOWN',\n `Kein Periodenzeitraum für ${date.iso} im Geschäftsjahr ${this.year}`,\n { date: date.iso, fiscalYear: this.year },\n );\n }\n return found;\n }\n\n closePeriod(number: number): Period {\n this.assertNotClosed();\n const target = this.period(number);\n for (const period of this.periodList) {\n if (period.number < number && period.isOpen()) {\n throw new DomainError(\n 'E_PERIOD_OUT_OF_ORDER',\n `Periode ${number} kann nicht geschlossen werden: Periode ${period.number} ist noch offen`,\n { fiscalYear: this.year, period: number, openPeriod: period.number },\n );\n }\n }\n target.close();\n return target;\n }\n\n reopenPeriod(number: number): Period {\n this.assertNotClosed();\n const target = this.period(number);\n target.reopen();\n return target;\n }\n\n /** Reiner Statuswechsel — keine fachliche Buchungswirkung (api.md v0.3). */\n close(): void {\n for (const period of this.periodList) {\n if (period.isOpen()) {\n throw new DomainError(\n 'E_PERIOD_OUT_OF_ORDER',\n `Jahresabschluss ${this.year}: Periode ${period.number} ist noch offen`,\n { fiscalYear: this.year, openPeriod: period.number },\n );\n }\n }\n this.fiscalStatus = 'closed';\n }\n\n private assertNotClosed(): void {\n if (this.isClosed()) {\n throw new DomainError('E_FISCALYEAR_CLOSED', `Geschäftsjahr ${this.year} ist abgeschlossen`, {\n fiscalYear: this.year,\n });\n }\n }\n}\n","import type { Uuid } from '../shared/uuid.js';\n\nexport type AuditChanges = Record<string, { from: unknown; to: unknown }>;\n\n/**\n * Audit-Eintrag (datenformat.md v0.3 `auditLog.jsonl`): flacher Vorher/Nachher-\n * Diff nur der geänderten Felder.\n */\nexport class AuditRecord {\n constructor(\n readonly id: Uuid,\n readonly at: string,\n readonly actor: string,\n readonly objectType: string,\n readonly objectId: Uuid,\n readonly action: string,\n readonly changes: AuditChanges = {},\n ) {}\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n at: this.at,\n actor: this.actor,\n objectType: this.objectType,\n objectId: this.objectId.value,\n action: this.action,\n // Leerer Diff → {} (nicht []), damit das Format stabil bleibt.\n changes: this.changes,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { Settlement } from './settlement.js';\nimport type { OpenItemKind, OpenItemStatus } from './types.js';\n\n/**\n * Offener Posten (ledger-modell.md Aggregat 5): entsteht aus einer Buchung auf\n * ein AR/AP-Konto, referenziert Ursprungsbuchung + Position. Invariante:\n * Σ Ausgleiche ≤ Betrag; Teilausgleiche erlaubt.\n */\nexport class OpenItem {\n private readonly settlementList: Settlement[] = [];\n\n constructor(\n readonly id: Uuid,\n readonly kind: OpenItemKind,\n readonly originEntryId: Uuid,\n readonly originLineIndex: number,\n readonly money: Money,\n readonly voucherId: Uuid,\n readonly openedAt: CalendarDate,\n readonly partnerId: Uuid | null = null,\n ) {}\n\n /**\n * Aus Persistenz wiederherstellen: bereits validierte Ausgleiche direkt setzen\n * (keine erneute Prüfung) — Pendant zu PHPs `OpenItem::restore`.\n */\n static restore(\n id: Uuid,\n kind: OpenItemKind,\n originEntryId: Uuid,\n originLineIndex: number,\n money: Money,\n voucherId: Uuid,\n openedAt: CalendarDate,\n partnerId: Uuid | null,\n settlements: Settlement[],\n ): OpenItem {\n const item = new OpenItem(id, kind, originEntryId, originLineIndex, money, voucherId, openedAt, partnerId);\n item.settlementList.push(...settlements);\n return item;\n }\n\n settlements(): Settlement[] {\n return this.settlementList;\n }\n\n remaining(): Money {\n return this.remainingAt(null);\n }\n\n /** Restbetrag zum Stichtag (null = heute/alles). */\n remainingAt(asOf: CalendarDate | null): Money {\n let remaining = this.money;\n for (const settlement of this.settlementList) {\n if (asOf !== null && settlement.settledAt.isAfter(asOf)) continue;\n remaining = remaining.subtract(settlement.money);\n }\n return remaining;\n }\n\n status(): OpenItemStatus {\n return this.statusAt(null);\n }\n\n statusAt(asOf: CalendarDate | null): OpenItemStatus {\n const remaining = this.remainingAt(asOf);\n if (remaining.isZero()) return 'settled';\n return remaining.equals(this.money) ? 'open' : 'partially_settled';\n }\n\n settle(settlement: Settlement): void {\n if (settlement.money.compareTo(this.remaining()) > 0) {\n throw new DomainError(\n 'E_SETTLEMENT_EXCEEDS_ITEM',\n `Zuordnung ${settlement.money.amountAsString()} übersteigt Restbetrag ${this.remaining().amountAsString()} des Postens ${this.id.value}`,\n {\n openItemId: this.id.value,\n remaining: this.remaining().amountAsString(),\n allocated: settlement.money.amountAsString(),\n },\n );\n }\n this.settlementList.push(settlement);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n kind: this.kind,\n originEntryId: this.originEntryId.value,\n originLineIndex: this.originLineIndex,\n money: this.money.toJSON(),\n partnerId: this.partnerId?.value ?? null,\n remaining: this.remaining().toJSON(),\n status: this.status(),\n settlements: this.settlementList.map((settlement) => settlement.toJSON()),\n };\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { SettlementDifferenceKind } from './types.js';\n\n/**\n * Einzelner Ausgleich eines offenen Postens. `money` ist der ausgeglichene\n * OP-Betrag EINSCHLIESSLICH Differenz (api.md G2).\n */\nexport class Settlement {\n constructor(\n readonly entryId: Uuid,\n readonly money: Money,\n readonly settledAt: CalendarDate,\n readonly differenceMoney: Money | null = null,\n readonly differenceKind: SettlementDifferenceKind | null = null,\n ) {}\n\n toJSON(): Record<string, unknown> {\n return {\n entryId: this.entryId.value,\n money: this.money.toJSON(),\n settledAt: this.settledAt.iso,\n difference:\n this.differenceMoney === null\n ? null\n : { money: this.differenceMoney.toJSON(), kind: this.differenceKind },\n };\n }\n}\n","import type { JournalEntry } from './journal-entry.js';\n\n/**\n * Ergebnis von `post`: die Buchung plus die dabei entstandenen offenen Posten\n * (AR/AP-Automatik — folgt mit dem Open-Items-Slice, daher vorerst leer).\n */\nexport class PostResult {\n constructor(\n readonly entry: JournalEntry,\n readonly openItemsCreated: unknown[],\n ) {}\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountNumber } from '../shared/account-number.js';\nimport type { DimensionValue } from '../shared/dimension-value.js';\n\ninterface DimensionRule {\n readonly from: string;\n readonly to: string;\n readonly required: string;\n}\n\nexport interface DimensionTypeData {\n readonly code: string;\n}\nexport interface DimensionValueData {\n readonly typeCode: string;\n readonly code: string;\n}\nexport interface DimensionRuleData {\n readonly accountRange: { from: string; to: string };\n readonly requiredDimension: string;\n}\n\n/**\n * Dimensions-Validierung: Mechanik im Kern, Inhalte als Regelmodul-Daten\n * (ledger-modell.md). Typen/Werte sind Stammdaten; Pflichtdimensionen kommen\n * aus `ruleModules.dimensionRules`.\n */\nexport class DimensionRegistry {\n private constructor(\n private readonly types: ReadonlySet<string>,\n private readonly values: ReadonlySet<string>,\n private readonly rules: readonly DimensionRule[],\n ) {}\n\n static empty(): DimensionRegistry {\n return new DimensionRegistry(new Set(), new Set(), []);\n }\n\n static fromData(\n dimensionTypes: DimensionTypeData[],\n dimensionValues: DimensionValueData[],\n dimensionRules: DimensionRuleData[],\n ): DimensionRegistry {\n const types = new Set(dimensionTypes.map((t) => t.code));\n const values = new Set(dimensionValues.map((v) => `${v.typeCode}:${v.code}`));\n const rules = dimensionRules.map((r) => ({\n from: r.accountRange.from,\n to: r.accountRange.to,\n required: r.requiredDimension,\n }));\n return new DimensionRegistry(types, values, rules);\n }\n\n validateLine(account: AccountNumber, dimensions: DimensionValue[]): void {\n for (const dimension of dimensions) {\n if (!this.types.has(dimension.type)) {\n throw new DomainError('E_DIMENSION_INVALID', `Unbekannter Dimensionstyp \"${dimension.type}\"`, {\n type: dimension.type,\n });\n }\n if (!this.values.has(`${dimension.type}:${dimension.code}`)) {\n throw new DomainError(\n 'E_DIMENSION_INVALID',\n `Unbekannter Dimensionswert \"${dimension.code}\" für Typ \"${dimension.type}\"`,\n { type: dimension.type, code: dimension.code },\n );\n }\n }\n\n for (const rule of this.rules) {\n const inRange = account.value >= rule.from && account.value <= rule.to;\n if (!inRange) continue;\n if (dimensions.some((d) => d.type === rule.required)) continue;\n throw new DomainError(\n 'E_DIMENSION_INVALID',\n `Pflichtdimension \"${rule.required}\" fehlt auf Konto ${account.value}`,\n { account: account.value, required: rule.required },\n );\n }\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type {\n AccountRepository,\n AuditTrail,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n VoucherRepository,\n} from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Clock } from '../shared/clock.js';\nimport type { Currency } from '../shared/currency.js';\nimport { DimensionValue } from '../shared/dimension-value.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Money } from '../shared/money.js';\nimport { PeriodRef } from '../shared/period-ref.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { Account } from './account.js';\nimport { AuditRecord, type AuditChanges } from './audit-record.js';\nimport { DimensionRegistry } from './dimension-registry.js';\nimport { EntryLine } from './entry-line.js';\nimport { FiscalYear } from './fiscal-year.js';\nimport { JournalEntry } from './journal-entry.js';\nimport { OpenItem } from './open-item.js';\nimport { PostResult } from './post-result.js';\nimport { Settlement } from './settlement.js';\nimport {\n isAccountType,\n type OpenItemKind,\n parseSettlementDifferenceKind,\n type SettlementDifferenceKind,\n type Side,\n} from './types.js';\nimport type { Voucher } from './voucher.js';\n\ninterface ParsedLine {\n readonly account: string;\n readonly side: Side;\n readonly money: Money;\n readonly dimensions: DimensionValue[];\n readonly taxTag: Record<string, unknown> | null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * Domain Service `post` und Verwandte (ledger-modell.md). Prüfreihenfolge beim\n * Buchen ist Vertragsbestandteil (api.md):\n * 1. Struktur (E_ENTRY_TOO_FEW_LINES, E_ENTRY_INVALID_AMOUNT)\n * 2. Referenzen (E_ENTRY_NO_VOUCHER, E_VOUCHER_UNKNOWN, E_ACCOUNT_UNKNOWN,\n * E_ACCOUNT_LOCKED, E_DIMENSION_INVALID)\n * 3. Bilanzgleichung (E_ENTRY_UNBALANCED)\n * 4. Zeitlicher Kontext (E_PERIOD_UNKNOWN, E_PERIOD_CLOSED)\n * Nur der erste Fehler wird gemeldet.\n */\nexport class Ledger {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly fiscalYears: FiscalYearRepository,\n private readonly vouchers: VoucherRepository,\n private readonly journal: JournalRepository,\n private readonly openItems: OpenItemRepository,\n private readonly audit: AuditTrail,\n private readonly dimensions: DimensionRegistry,\n private readonly clock: Clock,\n private readonly ids: IdGenerator,\n ) {}\n\n post(input: Record<string, unknown>): PostResult {\n const actor = this.actor(input);\n\n // 1. Struktur\n const rawLines = input.lines;\n if (!Array.isArray(rawLines) || rawLines.length < 2) {\n throw new DomainError('E_ENTRY_TOO_FEW_LINES', 'Eine Buchung braucht mindestens zwei Positionen');\n }\n const parsed = rawLines.map((rawLine, index) => {\n if (!isRecord(rawLine)) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index} ist keine Struktur`);\n }\n return this.parseLine(rawLine, index);\n });\n\n // 2. Referenzen\n const voucher = this.requireVoucher(input.voucherId);\n const lines = this.resolveLines(parsed);\n\n // 3. Bilanzgleichung\n this.assertBalanced(lines);\n\n // 4. Zeitlicher Kontext\n const entryDate = this.parseEntryDate(input.entryDate);\n const [fiscalYear, period] = this.openPeriodFor(entryDate);\n\n const text = asString(input.text) ?? '';\n\n const entry = new JournalEntry(\n this.ids.next(),\n this.journal.nextSequenceNumber(fiscalYear.year),\n entryDate,\n voucher.voucherDate,\n this.now(),\n new PeriodRef(fiscalYear.year, period.number),\n voucher.id,\n text,\n lines,\n );\n\n this.journal.append(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'created');\n\n return new PostResult(entry, this.createOpenItems(entry));\n }\n\n /**\n * AR/AP-Automatik: Soll auf Forderungskonto → receivable, Haben auf\n * Verbindlichkeitskonto → payable. Stornobuchungen erzeugen keine Posten.\n */\n private createOpenItems(entry: JournalEntry): OpenItem[] {\n if (entry.reverses !== null) return [];\n\n const created: OpenItem[] = [];\n const voucher = this.vouchers.byId(entry.voucherId);\n\n entry.lines().forEach((line, index) => {\n const account = this.accounts.byId(line.accountId);\n let kind: OpenItemKind | null = null;\n if (account?.subtype === 'ar' && line.side === 'debit') kind = 'receivable';\n else if (account?.subtype === 'ap' && line.side === 'credit') kind = 'payable';\n if (kind === null) return;\n\n const item = new OpenItem(\n this.ids.next(),\n kind,\n entry.id,\n index,\n line.money,\n entry.voucherId,\n entry.entryDate,\n voucher?.partnerId ?? null,\n );\n this.openItems.add(item);\n created.push(item);\n });\n\n return created;\n }\n\n /**\n * Ausgleich: Zuordnung Zahlung → offene(r) Posten, auch teilweise; immer\n * explizit, kein FIFO (determinismus.md §3). Differenzen (Skonto/Ausfall/\n * Kleindifferenz) nach api.md G2. Erst vollständig validieren, dann anwenden.\n */\n settle(input: Record<string, unknown>): OpenItem[] {\n const actor = this.actor(input);\n const entry = this.requireEntry(input.entryId);\n\n const allocations = Array.isArray(input.allocations) ? input.allocations : [];\n if (allocations.length === 0) {\n throw new DomainError('E_OPENITEM_UNKNOWN', 'settle ohne Zuordnungen');\n }\n\n const plan: Array<{ item: OpenItem; settlement: Settlement }> = [];\n const planned = new Map<string, Money>();\n\n for (const allocation of allocations) {\n if (!isRecord(allocation)) {\n throw new DomainError('E_OPENITEM_UNKNOWN', 'Zuordnung ist keine Struktur');\n }\n const openItemId = allocation.openItemId;\n let item: OpenItem | null = null;\n if (typeof openItemId === 'string') {\n try {\n item = this.openItems.byId(Uuid.fromString(openItemId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (item === null) {\n throw new DomainError(\n 'E_OPENITEM_UNKNOWN',\n `Offener Posten ${typeof openItemId === 'string' ? openItemId : '?'} existiert nicht`,\n );\n }\n\n const money = this.parseSettlementMoney(allocation.money, 'Zuordnungsbetrag');\n const [differenceMoney, differenceKind] = this.parseDifference(allocation.difference ?? null, item);\n\n const alreadyPlanned = planned.get(item.id.value) ?? Money.zero(this.baseCurrency);\n if (money.add(alreadyPlanned).compareTo(item.remaining()) > 0) {\n throw new DomainError(\n 'E_SETTLEMENT_EXCEEDS_ITEM',\n `Zuordnung ${money.amountAsString()} übersteigt Restbetrag ${item\n .remaining()\n .subtract(alreadyPlanned)\n .amountAsString()} des Postens ${item.id.value}`,\n { openItemId: item.id.value },\n );\n }\n\n planned.set(item.id.value, money.add(alreadyPlanned));\n plan.push({\n item,\n settlement: new Settlement(entry.id, money, entry.entryDate, differenceMoney, differenceKind),\n });\n }\n\n const affected: OpenItem[] = [];\n for (const step of plan) {\n const before = step.item.remaining().amountAsString();\n step.item.settle(step.settlement);\n this.openItems.save(step.item);\n this.recordAudit(actor, 'openItem', step.item.id, 'settled', {\n remaining: { from: before, to: step.item.remaining().amountAsString() },\n });\n affected.push(step.item);\n }\n\n return affected;\n }\n\n private parseSettlementMoney(raw: unknown, label: string): Money {\n const amount = isRecord(raw) ? asString(raw.amount) : null;\n const currency = isRecord(raw) ? asString(raw.currency) : null;\n if (amount === null || currency !== this.baseCurrency.code) {\n throw new InvalidValue(`${label} fehlt oder falsche Währung`);\n }\n const money = Money.of(amount, this.baseCurrency);\n if (!money.isPositive()) {\n throw new InvalidValue(`${label} muss > 0 sein`);\n }\n return money;\n }\n\n private parseDifference(\n raw: unknown,\n item: OpenItem,\n ): [Money | null, SettlementDifferenceKind | null] {\n if (raw === null) return [null, null];\n if (!isRecord(raw)) {\n throw new DomainError('E_SETTLEMENT_DIFFERENCE_INVALID', 'difference ist keine Struktur');\n }\n const kind = parseSettlementDifferenceKind(raw.kind);\n if (kind === null) {\n throw new DomainError(\n 'E_SETTLEMENT_DIFFERENCE_INVALID',\n `Unbekannte Differenzart \"${typeof raw.kind === 'string' ? raw.kind : '?'}\"`,\n );\n }\n let money: Money;\n try {\n money = this.parseSettlementMoney(raw.money, 'Differenzbetrag');\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_SETTLEMENT_DIFFERENCE_INVALID', 'Differenzbetrag ungültig (≤ 0 oder Format)');\n }\n throw error;\n }\n if (money.compareTo(item.remaining()) > 0) {\n throw new DomainError(\n 'E_SETTLEMENT_DIFFERENCE_INVALID',\n `Differenz ${money.amountAsString()} übersteigt Restbetrag ${item.remaining().amountAsString()}`,\n );\n }\n return [money, kind];\n }\n\n correct(input: Record<string, unknown>): JournalEntry {\n const actor = this.actor(input);\n const entry = this.requireEntry(input.entryId);\n const changes: AuditChanges = {};\n\n const text = asString(input.text);\n if (text !== null && text !== entry.text()) {\n changes.text = { from: entry.text(), to: text };\n entry.changeText(text);\n }\n\n if (Array.isArray(input.lines)) {\n if (input.lines.length < 2) {\n throw new DomainError('E_ENTRY_TOO_FEW_LINES', 'Eine Buchung braucht mindestens zwei Positionen');\n }\n const parsed = input.lines.map((rawLine, index) => {\n if (!isRecord(rawLine)) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index} ist keine Struktur`);\n }\n return this.parseLine(rawLine, index);\n });\n const lines = this.resolveLines(parsed);\n this.assertBalanced(lines);\n\n changes.lines = {\n from: entry.lines().map((line) => line.toJSON()),\n to: lines.map((line) => line.toJSON()),\n };\n entry.changeLines(lines);\n }\n\n if (Object.keys(changes).length > 0) {\n this.journal.save(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'corrected', changes);\n } else {\n // Statusprüfung auch ohne effektive Änderung (E_ENTRY_FINALIZED).\n entry.changeText(entry.text());\n }\n\n return entry;\n }\n\n finalize(input: Record<string, unknown>): number {\n const actor = this.actor(input);\n\n if (input.entryId !== undefined) {\n const entry = this.requireEntry(input.entryId);\n if (entry.isFinalized()) return 0;\n entry.finalize();\n this.journal.save(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'finalized', {\n status: { from: 'entered', to: 'finalized' },\n });\n return 1;\n }\n\n const until = input.finalizeUntil;\n if (typeof until !== 'string') {\n throw new DomainError('E_ENTRY_UNKNOWN', 'finalize braucht entryId oder finalizeUntil');\n }\n const untilDate = this.parseEntryDate(until);\n let count = 0;\n\n for (const entry of this.journal.all()) {\n if (entry.isFinalized() || entry.entryDate.isAfter(untilDate)) continue;\n entry.finalize();\n this.journal.save(entry);\n this.recordAudit(actor, 'journalEntry', entry.id, 'finalized', {\n status: { from: 'entered', to: 'finalized' },\n });\n count++;\n }\n return count;\n }\n\n reverse(input: Record<string, unknown>): JournalEntry {\n const actor = this.actor(input);\n const original = this.requireEntry(input.entryId);\n\n if (original.reversedBy() !== null) {\n throw new DomainError('E_ENTRY_ALREADY_REVERSED', `Buchung ${original.id.value} ist bereits storniert`, {\n entryId: original.id.value,\n });\n }\n\n const entryDate = this.parseEntryDate(input.entryDate);\n const [fiscalYear, period] = this.openPeriodFor(entryDate);\n const text = asString(input.text) ?? `Storno ${original.sequenceNumber}`;\n\n const reversal = new JournalEntry(\n this.ids.next(),\n this.journal.nextSequenceNumber(fiscalYear.year),\n entryDate,\n original.voucherDate,\n this.now(),\n new PeriodRef(fiscalYear.year, period.number),\n original.voucherId,\n text,\n original.lines().map((line) => line.negated()),\n original.id,\n );\n\n original.markReversed(reversal.id);\n this.journal.append(reversal);\n this.journal.save(original);\n\n this.recordAudit(actor, 'journalEntry', reversal.id, 'created');\n this.recordAudit(actor, 'journalEntry', original.id, 'reversed', {\n reversedBy: { from: null, to: reversal.id.value },\n });\n\n return reversal;\n }\n\n closePeriod(input: Record<string, unknown>): { fiscalYear: number; period: number; status: string } {\n const fiscalYear = this.requireFiscalYear(input.fiscalYear);\n const period = fiscalYear.closePeriod(this.periodNumber(input));\n this.fiscalYears.save(fiscalYear);\n return { fiscalYear: fiscalYear.year, period: period.number, status: period.status() };\n }\n\n reopenPeriod(input: Record<string, unknown>): { fiscalYear: number; period: number; status: string } {\n const fiscalYear = this.requireFiscalYear(input.fiscalYear);\n const period = fiscalYear.reopenPeriod(this.periodNumber(input));\n this.fiscalYears.save(fiscalYear);\n return { fiscalYear: fiscalYear.year, period: period.number, status: period.status() };\n }\n\n closeFiscalYear(input: Record<string, unknown>): FiscalYear {\n const fiscalYear = this.requireFiscalYear(input.fiscalYear);\n for (const entry of this.journal.forFiscalYear(fiscalYear.year)) {\n if (!entry.isFinalized()) {\n throw new DomainError(\n 'E_FISCALYEAR_UNFINALIZED_ENTRIES',\n `Jahresabschluss ${fiscalYear.year}: Buchung ${entry.sequenceNumber} ist nicht festgeschrieben`,\n { fiscalYear: fiscalYear.year, sequenceNumber: entry.sequenceNumber },\n );\n }\n }\n fiscalYear.close();\n this.fiscalYears.save(fiscalYear);\n return fiscalYear;\n }\n\n createFiscalYear(input: Record<string, unknown>): FiscalYear {\n const year = typeof input.year === 'number' ? input.year : 0;\n const start = this.parseEntryDate(input.start);\n const end = this.parseEntryDate(input.end);\n\n for (const existing of this.fiscalYears.all()) {\n const overlaps = !existing.end.isBefore(start) && !existing.start.isAfter(end);\n if (overlaps || existing.year === year) {\n throw new DomainError(\n 'E_FISCALYEAR_OVERLAP',\n `Geschäftsjahr ${year} (${start.iso} bis ${end.iso}) überschneidet sich mit ${existing.year}`,\n { year, existing: existing.year },\n );\n }\n }\n\n const fiscalYear = FiscalYear.create(this.ids.next(), year, start, end);\n this.fiscalYears.add(fiscalYear);\n return fiscalYear;\n }\n\n createAccount(input: Record<string, unknown>): Account {\n const actor = this.actor(input);\n const account = this.buildAccount(input);\n\n if (this.accounts.byNumber(account.number) !== null) {\n throw new DomainError('E_ACCOUNT_NUMBER_TAKEN', `Kontonummer ${account.number.value} ist bereits vergeben`, {\n number: account.number.value,\n });\n }\n\n this.accounts.add(account);\n this.recordAudit(actor, 'account', account.id, 'created');\n return account;\n }\n\n lockAccount(input: Record<string, unknown>): Account {\n const actor = this.actor(input);\n const number = asString(input.number) ?? '';\n const account = this.accounts.byNumber(AccountNumber.of(number));\n\n if (account === null) {\n throw new DomainError('E_ACCOUNT_UNKNOWN', `Konto ${number} existiert nicht`, { number });\n }\n\n const before = account.status();\n account.lock();\n this.accounts.save(account);\n this.recordAudit(actor, 'account', account.id, 'locked', {\n status: { from: before, to: account.status() },\n });\n return account;\n }\n\n importChartOfAccounts(input: Record<string, unknown>): number {\n const actor = this.actor(input);\n const rows = input.rows;\n if (!Array.isArray(rows) || rows.length === 0) {\n throw new DomainError('E_COA_FORMAT_INVALID', 'Import ohne Zeilen');\n }\n\n const accounts: Account[] = [];\n const numbers = new Set<string>();\n\n rows.forEach((row, index) => {\n if (!isRecord(row)) {\n throw new DomainError('E_COA_FORMAT_INVALID', `Zeile ${index} ist keine Struktur`);\n }\n let account: Account;\n try {\n account = this.buildAccount(row);\n } catch (error) {\n if (error instanceof DomainError) {\n throw new DomainError('E_COA_FORMAT_INVALID', `Zeile ${index} ist nicht parsebar`, { row: index });\n }\n throw error;\n }\n if (numbers.has(account.number.value) || this.accounts.byNumber(account.number) !== null) {\n throw new DomainError('E_ACCOUNT_NUMBER_TAKEN', `Kontonummer ${account.number.value} ist bereits vergeben`, {\n number: account.number.value,\n });\n }\n numbers.add(account.number.value);\n accounts.push(account);\n });\n\n for (const account of accounts) {\n this.accounts.add(account);\n this.recordAudit(actor, 'account', account.id, 'created');\n }\n return accounts.length;\n }\n\n // ---- intern ----------------------------------------------------------\n\n private actor(input: Record<string, unknown>): string {\n const actor = asString(input.actor);\n return actor !== null && actor !== '' ? actor : 'system';\n }\n\n private parseLine(rawLine: Record<string, unknown>, index: number): ParsedLine {\n const money = rawLine.money;\n const amount = isRecord(money) ? asString(money.amount) : null;\n const currency = isRecord(money) ? asString(money.currency) : null;\n\n if (amount === null || currency === null) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index}: money fehlt oder unvollständig`);\n }\n if (currency !== this.baseCurrency.code) {\n throw new DomainError(\n 'E_ENTRY_INVALID_AMOUNT',\n `Position ${index}: Fremdwährung ${currency} — v1 bucht nur Mandantenwährung ${this.baseCurrency.code}`,\n { currency },\n );\n }\n\n let parsedMoney: Money;\n try {\n parsedMoney = Money.of(amount, this.baseCurrency);\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError(\n 'E_ENTRY_INVALID_AMOUNT',\n `Position ${index}: Betrag \"${amount}\" ist kein gültiger ${this.baseCurrency.code}-Betrag`,\n { amount },\n );\n }\n throw error;\n }\n if (!parsedMoney.isPositive()) {\n throw new DomainError(\n 'E_ENTRY_INVALID_AMOUNT',\n `Position ${index}: Betrag muss > 0 sein (negative Beträge nur bei Storno)`,\n { amount },\n );\n }\n\n const side = rawLine.side;\n if (side !== 'debit' && side !== 'credit') {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index}: side muss debit oder credit sein`);\n }\n\n const account = asString(rawLine.account);\n if (account === null || account === '') {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Position ${index}: account fehlt`);\n }\n\n const dimensions: DimensionValue[] = [];\n const rawDimensions = Array.isArray(rawLine.dimensions) ? rawLine.dimensions : [];\n for (const rawDimension of rawDimensions) {\n if (!isRecord(rawDimension) || typeof rawDimension.type !== 'string' || typeof rawDimension.code !== 'string') {\n throw new DomainError('E_DIMENSION_INVALID', `Position ${index}: Dimension unvollständig`);\n }\n dimensions.push(DimensionValue.of(rawDimension.type, rawDimension.code));\n }\n\n const taxTag = isRecord(rawLine.taxTag) ? rawLine.taxTag : null;\n\n return { account, side, money: parsedMoney, dimensions, taxTag };\n }\n\n private requireVoucher(voucherId: unknown): Voucher {\n if (typeof voucherId !== 'string' || voucherId === '') {\n throw new DomainError('E_ENTRY_NO_VOUCHER', 'Keine Buchung ohne Beleg (F-CORE-003)');\n }\n let voucher: Voucher | null = null;\n try {\n voucher = this.vouchers.byId(Uuid.fromString(voucherId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n if (voucher === null) {\n throw new DomainError('E_VOUCHER_UNKNOWN', `Beleg ${voucherId} existiert nicht`, { voucherId });\n }\n return voucher;\n }\n\n private resolveLines(parsed: ParsedLine[]): EntryLine[] {\n const lines = parsed.map((line) => {\n const number = AccountNumber.of(line.account);\n const account = this.accounts.byNumber(number);\n if (account === null) {\n throw new DomainError('E_ACCOUNT_UNKNOWN', `Konto ${number.value} existiert nicht`, { number: number.value });\n }\n if (account.isLocked()) {\n throw new DomainError('E_ACCOUNT_LOCKED', `Konto ${number.value} ist gesperrt`, { number: number.value });\n }\n return new EntryLine(account.id, account.number, line.side, line.money, line.dimensions, line.taxTag);\n });\n\n for (const line of lines) {\n this.dimensions.validateLine(line.account, line.dimensions);\n }\n return lines;\n }\n\n private assertBalanced(lines: EntryLine[]): void {\n let debit = Money.zero(this.baseCurrency);\n let credit = Money.zero(this.baseCurrency);\n for (const line of lines) {\n if (line.side === 'debit') debit = debit.add(line.money);\n else credit = credit.add(line.money);\n }\n if (!debit.equals(credit)) {\n throw new DomainError(\n 'E_ENTRY_UNBALANCED',\n `Σ Soll (${debit.amountAsString()}) ≠ Σ Haben (${credit.amountAsString()})`,\n { debit: debit.amountAsString(), credit: credit.amountAsString() },\n );\n }\n }\n\n private parseEntryDate(entryDate: unknown): CalendarDate {\n if (typeof entryDate !== 'string') {\n throw new DomainError('E_PERIOD_UNKNOWN', 'entryDate fehlt');\n }\n try {\n return CalendarDate.of(entryDate);\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_PERIOD_UNKNOWN', `Ungültiges Buchungsdatum \"${entryDate}\"`);\n }\n throw error;\n }\n }\n\n private openPeriodFor(entryDate: CalendarDate): [FiscalYear, ReturnType<FiscalYear['periodForDate']>] {\n const fiscalYear = this.fiscalYears.forDate(entryDate);\n if (fiscalYear === null) {\n throw new DomainError(\n 'E_PERIOD_UNKNOWN',\n `Buchungsdatum ${entryDate.iso} liegt außerhalb angelegter Geschäftsjahre`,\n { date: entryDate.iso },\n );\n }\n const period = fiscalYear.periodForDate(entryDate);\n if (fiscalYear.isClosed() || !period.isOpen()) {\n throw new DomainError('E_PERIOD_CLOSED', `Periode ${fiscalYear.year}/${period.number} ist geschlossen`, {\n fiscalYear: fiscalYear.year,\n period: period.number,\n });\n }\n return [fiscalYear, period];\n }\n\n private requireEntry(entryId: unknown): JournalEntry {\n let entry: JournalEntry | null = null;\n if (typeof entryId === 'string' && entryId !== '') {\n try {\n entry = this.journal.byId(Uuid.fromString(entryId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (entry === null) {\n throw new DomainError('E_ENTRY_UNKNOWN', `Buchung ${typeof entryId === 'string' ? entryId : '?'} existiert nicht`);\n }\n return entry;\n }\n\n private requireFiscalYear(year: unknown): FiscalYear {\n const fiscalYear = typeof year === 'number' ? this.fiscalYears.byYear(year) : null;\n if (fiscalYear === null) {\n throw new DomainError('E_PERIOD_UNKNOWN', `Geschäftsjahr ${typeof year === 'number' ? year : '?'} ist nicht angelegt`);\n }\n return fiscalYear;\n }\n\n private periodNumber(input: Record<string, unknown>): number {\n const period = input.period;\n if (typeof period !== 'number' || !Number.isInteger(period)) {\n throw new DomainError('E_PERIOD_UNKNOWN', 'Periodennummer fehlt');\n }\n return period;\n }\n\n private buildAccount(input: Record<string, unknown>): Account {\n const number = asString(input.number);\n const name = asString(input.name);\n const type = input.type;\n\n if (number === null || number === '' || name === null || name === '' || !isAccountType(type)) {\n throw new DomainError('E_COA_FORMAT_INVALID', 'Konto braucht number, name und gültigen type');\n }\n\n const subtype = asString(input.subtype);\n const status = input.status === 'locked' ? 'locked' : 'active';\n\n return new Account(this.ids.next(), AccountNumber.of(number), name, type, subtype, status);\n }\n\n private recordAudit(\n actor: string,\n objectType: string,\n objectId: Uuid,\n action: string,\n changes: AuditChanges = {},\n ): void {\n this.audit.append(new AuditRecord(this.ids.next(), this.now(), actor, objectType, objectId, action, changes));\n }\n\n private now(): string {\n return this.clock.now().toISOString();\n }\n}\n","import type {\n AccountRepository,\n AssetRepository,\n AuditTrail,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n PartnerRepository,\n VoucherRepository,\n} from './port.js';\nimport type { Asset } from './assets/asset.js';\nimport type { Partner } from './partner/partner.js';\nimport type { AccountNumber } from './shared/account-number.js';\nimport type { CalendarDate } from './shared/calendar-date.js';\nimport type { Uuid } from './shared/uuid.js';\nimport type { Account } from './ledger/account.js';\nimport type { AuditRecord } from './ledger/audit-record.js';\nimport type { FiscalYear } from './ledger/fiscal-year.js';\nimport type { JournalEntry } from './ledger/journal-entry.js';\nimport type { OpenItem } from './ledger/open-item.js';\nimport type { Voucher } from './ledger/voucher.js';\n\nexport class InMemoryAccountRepository implements AccountRepository {\n private readonly byNumberMap = new Map<string, Account>();\n private readonly byIdMap = new Map<string, Account>();\n\n add(account: Account): void {\n if (this.byNumberMap.has(account.number.value)) {\n throw new Error(`Repository-Kontrakt verletzt: Kontonummer ${account.number.value} doppelt`);\n }\n this.byNumberMap.set(account.number.value, account);\n this.byIdMap.set(account.id.value, account);\n }\n\n save(_account: Account): void {\n // In-Memory: Objektidentität genügt.\n }\n\n byNumber(number: AccountNumber): Account | null {\n return this.byNumberMap.get(number.value) ?? null;\n }\n\n byId(id: Uuid): Account | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Account[] {\n return [...this.byNumberMap.values()].sort((a, b) => a.number.compareTo(b.number));\n }\n}\n\nexport class InMemoryFiscalYearRepository implements FiscalYearRepository {\n private readonly byYearMap = new Map<number, FiscalYear>();\n\n add(fiscalYear: FiscalYear): void {\n this.byYearMap.set(fiscalYear.year, fiscalYear);\n }\n\n save(_fiscalYear: FiscalYear): void {}\n\n byYear(year: number): FiscalYear | null {\n return this.byYearMap.get(year) ?? null;\n }\n\n forDate(date: CalendarDate): FiscalYear | null {\n for (const fiscalYear of this.byYearMap.values()) {\n if (fiscalYear.contains(date)) return fiscalYear;\n }\n return null;\n }\n\n all(): FiscalYear[] {\n return [...this.byYearMap.values()].sort((a, b) => a.year - b.year);\n }\n}\n\nexport class InMemoryJournalRepository implements JournalRepository {\n private readonly entries: JournalEntry[] = [];\n private readonly byIdMap = new Map<string, JournalEntry>();\n private readonly sequences = new Map<number, number>();\n\n append(entry: JournalEntry): void {\n this.entries.push(entry);\n this.byIdMap.set(entry.id.value, entry);\n this.sequences.set(entry.periodRef.fiscalYear, entry.sequenceNumber);\n }\n\n save(_entry: JournalEntry): void {}\n\n byId(id: Uuid): JournalEntry | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n nextSequenceNumber(fiscalYear: number): number {\n return (this.sequences.get(fiscalYear) ?? 0) + 1;\n }\n\n all(): JournalEntry[] {\n return [...this.entries].sort((a, b) =>\n a.periodRef.fiscalYear !== b.periodRef.fiscalYear\n ? a.periodRef.fiscalYear - b.periodRef.fiscalYear\n : a.sequenceNumber - b.sequenceNumber,\n );\n }\n\n forFiscalYear(fiscalYear: number): JournalEntry[] {\n return this.entries\n .filter((entry) => entry.periodRef.fiscalYear === fiscalYear)\n .sort((a, b) => a.sequenceNumber - b.sequenceNumber);\n }\n}\n\nexport class InMemoryVoucherRepository implements VoucherRepository {\n private readonly byIdMap = new Map<string, Voucher>();\n\n add(voucher: Voucher): void {\n this.byIdMap.set(voucher.id.value, voucher);\n }\n\n byId(id: Uuid): Voucher | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Voucher[] {\n return [...this.byIdMap.values()].sort((a, b) =>\n a.id.value < b.id.value ? -1 : a.id.value > b.id.value ? 1 : 0,\n );\n }\n}\n\nexport class InMemoryOpenItemRepository implements OpenItemRepository {\n private readonly items: OpenItem[] = [];\n private readonly byIdMap = new Map<string, OpenItem>();\n\n add(item: OpenItem): void {\n this.items.push(item);\n this.byIdMap.set(item.id.value, item);\n }\n\n save(_item: OpenItem): void {}\n\n byId(id: Uuid): OpenItem | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n byOriginEntry(entryId: Uuid): OpenItem[] {\n return this.items.filter((item) => item.originEntryId.equals(entryId));\n }\n\n all(): OpenItem[] {\n return [...this.items];\n }\n}\n\nexport class InMemoryAuditTrail implements AuditTrail {\n private readonly records: AuditRecord[] = [];\n\n append(record: AuditRecord): void {\n this.records.push(record);\n }\n\n all(): AuditRecord[] {\n return [...this.records];\n }\n}\n\nexport class InMemoryPartnerRepository implements PartnerRepository {\n private readonly byIdMap = new Map<string, Partner>();\n\n add(partner: Partner): void {\n this.byIdMap.set(partner.id.value, partner);\n }\n\n save(_partner: Partner): void {}\n\n byId(id: Uuid): Partner | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Partner[] {\n return [...this.byIdMap.values()].sort((a, b) => {\n const byName = a.name() < b.name() ? -1 : a.name() > b.name() ? 1 : 0;\n return byName !== 0 ? byName : a.id.value < b.id.value ? -1 : a.id.value > b.id.value ? 1 : 0;\n });\n }\n}\n\nexport class InMemoryAssetRepository implements AssetRepository {\n private readonly items: Asset[] = [];\n private readonly byIdMap = new Map<string, Asset>();\n\n add(asset: Asset): void {\n this.items.push(asset);\n this.byIdMap.set(asset.id.value, asset);\n }\n\n save(_asset: Asset): void {}\n\n byId(id: Uuid): Asset | null {\n return this.byIdMap.get(id.value) ?? null;\n }\n\n all(): Asset[] {\n return [...this.items];\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Money } from '../shared/money.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type { AssetRoute } from './asset-route.js';\n\ninterface Depreciation {\n planMonth: number;\n date: CalendarDate;\n amount: Money;\n entryId: Uuid;\n}\n\n/** Letzter Tag des Monats `monthsToAdd` nach `base` (1-basierte Planmonate). */\nfunction lastDayOfMonthAfter(base: CalendarDate, monthsToAdd: number): CalendarDate {\n const totalMonth0 = base.month() - 1 + monthsToAdd;\n const year = base.year() + Math.floor(totalMonth0 / 12);\n const month0 = ((totalMonth0 % 12) + 12) % 12;\n const lastDay = new Date(Date.UTC(year, month0 + 1, 0)).getUTCDate();\n return CalendarDate.of(\n `${String(year).padStart(4, '0')}-${String(month0 + 1).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`,\n );\n}\n\n/**\n * Anlagegut (assets-modell.md): Stammdaten + AfA-Plan + Lebenslauf. Invarianten:\n * Restbuchwert = AHK − Σ Abschreibungen, nie < 0; keine AfA vor Zugang/nach Abgang.\n */\nexport class Asset {\n private readonly depreciations: Depreciation[] = [];\n private disposed = false;\n private disposedOn: CalendarDate | null = null;\n\n constructor(\n readonly id: Uuid,\n readonly name: string,\n readonly assetClass: string,\n readonly assetAccount: AccountNumber,\n readonly acquisitionCost: Money,\n readonly acquiredOn: CalendarDate,\n readonly route: AssetRoute,\n readonly usefulLifeMonths: number | null,\n readonly monthlySchedule: Money[],\n readonly voucherId: Uuid,\n ) {}\n\n isDisposed(): boolean {\n return this.disposed;\n }\n\n assertActive(): void {\n if (this.disposed) {\n throw new DomainError(\n 'E_ASSET_DISPOSED',\n `Anlagegut ${this.id.value} ist bereits abgegangen (${this.disposedOn?.iso ?? '?'})`,\n { assetId: this.id.value },\n );\n }\n }\n\n dispose(disposedOn: CalendarDate): void {\n this.assertActive();\n this.disposed = true;\n this.disposedOn = disposedOn;\n }\n\n planMonthDate(planMonth: number): CalendarDate {\n return lastDayOfMonthAfter(this.acquiredOn, planMonth - 1);\n }\n\n isMonthBooked(planMonth: number): boolean {\n return this.depreciations.some((booking) => booking.planMonth === planMonth);\n }\n\n recordDepreciation(planMonth: number, date: CalendarDate, amount: Money, entryId: Uuid): void {\n this.depreciations.push({ planMonth, date, amount, entryId });\n }\n\n /** AfA-Lebenslauf in persistierbarer Form — Pendant zu PHPs `depreciationsForPersistence`. */\n depreciationsForPersistence(): Array<{\n planMonth: number;\n date: string;\n amount: { amount: string; currency: string };\n entryId: string;\n }> {\n return this.depreciations.map((booking) => ({\n planMonth: booking.planMonth,\n date: booking.date.iso,\n amount: booking.amount.toJSON(),\n entryId: booking.entryId.value,\n }));\n }\n\n /**\n * Aus Persistenz wiederherstellen: Stammdaten + AfA-Lebenslauf + Abgangsstatus\n * direkt setzen (keine erneute Prüfung) — Pendant zu PHPs `Asset::restore`.\n */\n static restore(\n id: Uuid,\n name: string,\n assetClass: string,\n assetAccount: AccountNumber,\n acquisitionCost: Money,\n acquiredOn: CalendarDate,\n route: AssetRoute,\n usefulLifeMonths: number | null,\n monthlySchedule: Money[],\n voucherId: Uuid,\n depreciations: ReadonlyArray<{ planMonth: number; date: CalendarDate; amount: Money; entryId: Uuid }>,\n disposed: boolean,\n disposedOn: CalendarDate | null,\n ): Asset {\n const asset = new Asset(\n id,\n name,\n assetClass,\n assetAccount,\n acquisitionCost,\n acquiredOn,\n route,\n usefulLifeMonths,\n monthlySchedule,\n voucherId,\n );\n for (const booking of depreciations) {\n asset.depreciations.push({\n planMonth: booking.planMonth,\n date: booking.date,\n amount: booking.amount,\n entryId: booking.entryId,\n });\n }\n asset.disposed = disposed;\n asset.disposedOn = disposedOn;\n return asset;\n }\n\n accumulatedDepreciationAt(asOf: CalendarDate | null): Money {\n let sum = this.acquisitionCost.subtract(this.acquisitionCost); // 0 in Mandantenwährung\n for (const booking of this.depreciations) {\n if (asOf !== null && booking.date.isAfter(asOf)) continue;\n sum = sum.add(booking.amount);\n }\n return sum;\n }\n\n bookValueAt(asOf: CalendarDate | null): Money {\n if (this.route !== 'capitalize') return this.acquisitionCost.subtract(this.acquisitionCost);\n return this.acquisitionCost.subtract(this.accumulatedDepreciationAt(asOf));\n }\n\n scheduleSummary(): Record<string, string> {\n if (this.monthlySchedule.length === 0) return {};\n\n const summary: Record<string, string> = {};\n let total = this.acquisitionCost.subtract(this.acquisitionCost);\n let runStart = 1;\n\n this.monthlySchedule.forEach((amount, index) => {\n total = total.add(amount);\n const isLast = index === this.monthlySchedule.length - 1;\n const next = isLast ? null : this.monthlySchedule[index + 1]!;\n if (next !== null && next.equals(amount)) return;\n summary[`months${runStart}to${index + 1}`] = amount.amountAsString();\n runStart = index + 2;\n });\n\n summary.total = total.amountAsString();\n return summary;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n name: this.name,\n assetClass: this.assetClass,\n assetAccount: this.assetAccount.value,\n route: this.route,\n acquisitionCost: this.acquisitionCost.toJSON(),\n acquiredOn: this.acquiredOn.iso,\n usefulLifeMonths: this.usefulLifeMonths,\n status: this.disposed ? 'disposed' : 'active',\n disposedOn: this.disposedOn?.iso ?? null,\n voucherId: this.voucherId.value,\n };\n }\n}\n","/** GWG-Weiche (SF-05): drei Pfade; die Grenzen sind Regelmodul-Daten. */\nexport type AssetRoute = 'capitalize' | 'immediate_expense' | 'pool';\n\nexport function parseAssetRoute(value: unknown): AssetRoute | null {\n return value === 'capitalize' || value === 'immediate_expense' || value === 'pool' ? value : null;\n}\n","import { DomainError } from '../domain-error.js';\nimport type { Ledger } from '../ledger/ledger.js';\nimport { Voucher } from '../ledger/voucher.js';\nimport type { AssetRepository, FiscalYearRepository, VoucherRepository } from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Money } from '../shared/money.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { Asset } from './asset.js';\nimport { type AssetRoute, parseAssetRoute } from './asset-route.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\ninterface Threshold {\n validFrom: string;\n validTo: string | null;\n immediateMax: string;\n poolMin: string | null;\n poolMax: string | null;\n}\n\n/**\n * Anlagen-Nebenbuch (assets-modell.md): GWG-Weiche beim Zugang, AfA-Lauf\n * idempotent je Lauf-Ziel, Buchungen über den Ledger (sofort festgeschrieben).\n * AfA-Verteilung: Monatswerte = allocate der AHK über die Laufzeit (flach).\n */\nexport class AssetService {\n private ruleModule: Record<string, unknown> = {};\n\n constructor(\n private readonly baseCurrency: Currency,\n private readonly assets: AssetRepository,\n private readonly fiscalYears: FiscalYearRepository,\n private readonly vouchers: VoucherRepository,\n private readonly ledger: Ledger,\n private readonly ids: IdGenerator,\n ) {}\n\n setRuleModule(ruleModule: Record<string, unknown>): void {\n this.ruleModule = ruleModule;\n }\n\n acquire(input: Record<string, unknown>): Record<string, unknown> {\n const name = asString(input.name) ?? '';\n const assetClass = asString(input.assetClass) ?? '';\n const assetAccount = AccountNumber.of(asString(input.assetAccount) ?? '0');\n const cost = this.parseMoney(input.acquisitionCost);\n const acquiredOn = CalendarDate.of(asString(input.acquiredOn) ?? '');\n const voucherIdRaw = asString(input.voucherId);\n if (voucherIdRaw === null) throw new InvalidValue('acquireAsset braucht voucherId');\n const voucherId = Uuid.fromString(voucherIdRaw);\n const choice = asString(input.gwgChoice) ?? 'auto';\n\n const route = this.resolveRoute(choice, cost, acquiredOn);\n\n let usefulLifeMonths: number | null = null;\n const schedule: Money[] = [];\n if (route === 'capitalize') {\n usefulLifeMonths = this.usefulLifeMonths(assetClass);\n schedule.push(...cost.allocateEvenly(usefulLifeMonths));\n } else if (route === 'pool') {\n // Sammelposten § 6 Abs. 2a: starr 5 Jahre je 1/5.\n usefulLifeMonths = 60;\n for (const yearAmount of cost.allocateEvenly(5)) {\n schedule.push(...yearAmount.allocateEvenly(12));\n }\n }\n\n const asset = new Asset(\n this.ids.next(),\n name,\n assetClass,\n assetAccount,\n cost,\n acquiredOn,\n route,\n usefulLifeMonths,\n schedule,\n voucherId,\n );\n this.assets.add(asset);\n\n const targetAccount = route === 'immediate_expense' ? this.gwgExpenseAccount() : assetAccount.value;\n this.postMachineEntry(acquiredOn, voucherId, `Anlagenzugang ${name}`, [\n { account: targetAccount, side: 'debit', money: cost.toJSON() },\n { account: this.counterAccount(), side: 'credit', money: cost.toJSON() },\n ]);\n\n const result = asset.toJSON();\n result.route = route;\n if (route === 'immediate_expense') result.expenseAccount = targetAccount;\n return result;\n }\n\n dispose(input: Record<string, unknown>): Record<string, unknown> {\n const asset = this.requireAsset(input.assetId);\n asset.assertActive();\n\n const disposedOn = CalendarDate.of(asString(input.disposedOn) ?? '');\n asset.dispose(disposedOn);\n this.assets.save(asset);\n\n const proceeds = isRecord(input.proceeds) ? this.parseMoney(input.proceeds) : null;\n const proceedsAccount = asString(input.proceedsAccount);\n const bankAccount = asString(input.bankAccount) ?? this.counterAccount();\n\n if (proceeds !== null && proceedsAccount !== null) {\n const voucherId = asString(input.voucherId) ? Uuid.fromString(asString(input.voucherId)!) : asset.voucherId;\n this.postMachineEntry(disposedOn, voucherId, `Anlagenabgang ${asset.name}`, [\n { account: bankAccount, side: 'debit', money: proceeds.toJSON() },\n { account: proceedsAccount, side: 'credit', money: proceeds.toJSON() },\n ]);\n }\n\n return asset.toJSON();\n }\n\n runDepreciation(input: Record<string, unknown>): Record<string, unknown> {\n const fiscalYear = typeof input.fiscalYear === 'number' ? input.fiscalYear : 0;\n const period = typeof input.period === 'number' ? input.period : null;\n\n let entriesCreated = 0;\n let total = Money.zero(this.baseCurrency);\n\n for (const asset of this.assets.all()) {\n if (asset.route !== 'capitalize' && asset.route !== 'pool') continue;\n if (asset.isDisposed()) continue;\n\n const [months, amount] =\n period === null ? this.yearTarget(asset, fiscalYear) : this.monthTarget(asset, fiscalYear, period);\n if (months.length === 0 || amount.isZero()) continue;\n\n const bookingDate = this.bookingDate(asset, fiscalYear, period, months);\n const periodLabel = period === null ? '' : `/${String(period).padStart(2, '0')}`;\n const entry = this.postMachineEntry(\n bookingDate,\n this.depreciationVoucher(asset, fiscalYear, period),\n `AfA ${asset.name} ${fiscalYear}${periodLabel}`,\n [\n { account: this.depreciationExpenseAccount(), side: 'debit', money: amount.toJSON() },\n { account: asset.assetAccount.value, side: 'credit', money: amount.toJSON() },\n ],\n );\n\n const monthAmounts = months.length === 1 ? [amount] : this.monthAmounts(asset, months, amount);\n months.forEach((planMonth, index) => {\n asset.recordDepreciation(planMonth, bookingDate, monthAmounts[index]!, entry);\n });\n\n this.assets.save(asset);\n entriesCreated++;\n total = total.add(amount);\n }\n\n if (entriesCreated === 0) return { alreadyRun: true, entriesCreated: 0 };\n return { entriesCreated, totalDepreciation: total.toJSON() };\n }\n\n requireAsset(assetId: unknown): Asset {\n let asset: Asset | null = null;\n if (typeof assetId === 'string' && assetId !== '') {\n try {\n asset = this.assets.byId(Uuid.fromString(assetId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (asset === null) {\n throw new DomainError('E_ASSET_UNKNOWN', `Anlagegut ${typeof assetId === 'string' ? assetId : '?'} existiert nicht`);\n }\n return asset;\n }\n\n // ---- intern ----------------------------------------------------------\n\n private yearTarget(asset: Asset, fiscalYear: number): [number[], Money] {\n const zero = Money.zero(this.baseCurrency);\n const monthsByYear = new Map<number, number[]>();\n const life = asset.monthlySchedule.length;\n for (let planMonth = 1; planMonth <= life; planMonth++) {\n const year = asset.planMonthDate(planMonth).year();\n const list = monthsByYear.get(year) ?? [];\n list.push(planMonth);\n monthsByYear.set(year, list);\n }\n const months = monthsByYear.get(fiscalYear);\n if (months === undefined) return [[], zero];\n\n const years = [...monthsByYear.keys()];\n const weights = years.map((year) => monthsByYear.get(year)!.length);\n const yearAmounts = asset.acquisitionCost.allocate(...weights);\n const yearIndex = years.indexOf(fiscalYear);\n if (yearIndex === -1) return [[], zero];\n const yearAmount = yearAmounts[yearIndex]!;\n\n const openMonths: number[] = [];\n let bookedAmount = zero;\n for (const planMonth of months) {\n if (asset.isMonthBooked(planMonth)) {\n bookedAmount = bookedAmount.add(asset.monthlySchedule[planMonth - 1]!);\n continue;\n }\n openMonths.push(planMonth);\n }\n\n const amount = yearAmount.subtract(bookedAmount);\n if (openMonths.length === 0 || !amount.isPositive()) return [[], zero];\n return [openMonths, amount];\n }\n\n private monthTarget(asset: Asset, fiscalYear: number, period: number): [number[], Money] {\n const zero = Money.zero(this.baseCurrency);\n const year = this.fiscalYears.byYear(fiscalYear);\n if (year === null) {\n throw new DomainError('E_PERIOD_UNKNOWN', `Geschäftsjahr ${fiscalYear} ist nicht angelegt`);\n }\n const periodEntity = year.period(period);\n const life = asset.monthlySchedule.length;\n for (let planMonth = 1; planMonth <= life; planMonth++) {\n const date = asset.planMonthDate(planMonth);\n if (!periodEntity.contains(date)) continue;\n if (asset.isMonthBooked(planMonth)) return [[], zero];\n return [[planMonth], asset.monthlySchedule[planMonth - 1]!];\n }\n return [[], zero];\n }\n\n private monthAmounts(asset: Asset, months: number[], total: Money): Money[] {\n const planned = months.map((planMonth) => asset.monthlySchedule[planMonth - 1]!);\n let plannedSum = Money.zero(this.baseCurrency);\n for (const amount of planned) plannedSum = plannedSum.add(amount);\n if (plannedSum.equals(total)) return planned;\n return total.allocateEvenly(months.length);\n }\n\n private bookingDate(asset: Asset, fiscalYear: number, period: number | null, months: number[]): CalendarDate {\n const year = this.fiscalYears.byYear(fiscalYear);\n if (period !== null && year !== null) return year.period(period).end;\n if (year !== null) return year.end;\n return asset.planMonthDate(months[months.length - 1]!);\n }\n\n private postMachineEntry(\n date: CalendarDate,\n voucherId: Uuid,\n text: string,\n lines: Array<Record<string, unknown>>,\n ): Uuid {\n const result = this.ledger.post({ entryDate: date.iso, voucherId: voucherId.value, text, lines });\n // Maschinell erzeugte Buchung: sofort festschreiben (GoBD).\n this.ledger.finalize({ entryId: result.entry.id.value });\n return result.entry.id;\n }\n\n private depreciationVoucher(asset: Asset, fiscalYear: number, period: number | null): Uuid {\n const periodLabel = period === null ? '' : `-${String(period).padStart(2, '0')}`;\n const voucher = new Voucher({\n id: this.ids.next(),\n voucherNumber: `AFA-${fiscalYear}${periodLabel}-${asset.id.value.slice(-6)}`,\n voucherDate: CalendarDate.of(`${String(fiscalYear).padStart(4, '0')}-12-31`),\n kind: 'internal',\n });\n this.vouchers.add(voucher);\n return voucher.id;\n }\n\n private resolveRoute(choice: string, cost: Money, acquiredOn: CalendarDate): AssetRoute {\n if (choice !== 'auto') return parseAssetRoute(choice) ?? 'capitalize';\n\n for (const threshold of this.thresholds()) {\n const validFrom = CalendarDate.of(threshold.validFrom);\n const validTo = threshold.validTo === null ? null : CalendarDate.of(threshold.validTo);\n if (acquiredOn.isBefore(validFrom) || (validTo !== null && acquiredOn.isAfter(validTo))) continue;\n\n if (cost.compareTo(Money.of(threshold.immediateMax, this.baseCurrency)) <= 0) return 'immediate_expense';\n if (\n threshold.poolMin !== null &&\n threshold.poolMax !== null &&\n cost.compareTo(Money.of(threshold.poolMin, this.baseCurrency)) >= 0 &&\n cost.compareTo(Money.of(threshold.poolMax, this.baseCurrency)) <= 0\n ) {\n return 'pool';\n }\n }\n return 'capitalize';\n }\n\n private thresholds(): Threshold[] {\n const raw = Array.isArray(this.ruleModule.gwgThresholds) ? this.ruleModule.gwgThresholds : [];\n const thresholds: Threshold[] = [];\n for (const item of raw) {\n if (!isRecord(item) || typeof item.validFrom !== 'string' || typeof item.immediateMax !== 'string') continue;\n thresholds.push({\n validFrom: item.validFrom,\n validTo: typeof item.validTo === 'string' ? item.validTo : null,\n immediateMax: item.immediateMax,\n poolMin: typeof item.poolMin === 'string' ? item.poolMin : null,\n poolMax: typeof item.poolMax === 'string' ? item.poolMax : null,\n });\n }\n return thresholds;\n }\n\n private usefulLifeMonths(assetClass: string): number {\n const raw = Array.isArray(this.ruleModule.usefulLife) ? this.ruleModule.usefulLife : [];\n for (const item of raw) {\n if (isRecord(item) && item.assetClass === assetClass && typeof item.months === 'number') {\n return item.months;\n }\n }\n throw new DomainError(\n 'E_ASSET_UNKNOWN',\n `Keine Nutzungsdauer für Anlagenklasse \"${assetClass}\" im Regelmodul (siehe SPEC-FINDINGS)`,\n );\n }\n\n private counterAccount(): string {\n return this.assetAccount('acquisitionCounterAccount');\n }\n private depreciationExpenseAccount(): string {\n return this.assetAccount('depreciationExpenseAccount');\n }\n private gwgExpenseAccount(): string {\n return this.assetAccount('gwgExpenseAccount');\n }\n\n private assetAccount(key: string): string {\n const block = isRecord(this.ruleModule.assetAccounts) ? this.ruleModule.assetAccounts : {};\n const value = block[key];\n if (typeof value === 'string' && value !== '') return value;\n throw new DomainError('E_ACCOUNT_UNKNOWN', `assetAccounts.${key} ist im Regelmodul nicht gesetzt`, { key });\n }\n\n private parseMoney(raw: unknown): Money {\n const amount = isRecord(raw) ? asString(raw.amount) : null;\n if (amount === null) throw new InvalidValue('Betrag fehlt');\n return Money.of(amount, this.baseCurrency);\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { Money } from '../shared/money.js';\nimport type { PeriodRef } from '../shared/period-ref.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Abrechnungslauf (costing-modell.md Aggregat 1): je Periode + Version eindeutig;\n * Wiederholung erzeugt neue Version. draft → released.\n */\nexport class CostingRun {\n private runStatus = 'draft';\n\n constructor(\n readonly id: Uuid,\n readonly period: PeriodRef,\n readonly version: number,\n readonly primary: Map<string, Money>,\n readonly afterAllocation: Map<string, Money>,\n readonly grandTotal: Money,\n ) {}\n\n status(): string {\n return this.runStatus;\n }\n\n release(): void {\n if (this.runStatus === 'released') {\n throw new DomainError(\n 'E_COSTING_RUN_RELEASED',\n `Lauf ${this.id.value} ist bereits freigegeben — Änderungen erzeugen eine neue Version`,\n { runId: this.id.value },\n );\n }\n this.runStatus = 'released';\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport type { Currency } from '../shared/currency.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Money } from '../shared/money.js';\nimport { PeriodRef } from '../shared/period-ref.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { CostingRun } from './costing-run.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\ninterface Receiver {\n code: string;\n share: string;\n}\ninterface Step {\n sender: string;\n receivers: Receiver[];\n}\n\n/**\n * KLR-Abrechnung (costing-modell.md): eigener Rechnungskreis — das Fibu-Journal\n * bleibt unberührt. Primärkostenübernahme über costCenter-Dimension, Umlage per\n * Stufenleiter (zyklenfrei, E_COSTING_CYCLE), Verteilung per Money.allocate.\n */\nexport class CostingService {\n private schemeSteps: Step[] = [];\n private readonly runs = new Map<string, CostingRun>();\n private readonly versions = new Map<string, number>();\n\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly ids: IdGenerator,\n ) {}\n\n setAllocationScheme(input: Record<string, unknown>): Record<string, unknown> {\n const method = typeof input.method === 'string' ? input.method : 'step_ladder';\n const steps: Step[] = [];\n const edges = new Map<string, string[]>();\n\n for (const rawStep of Array.isArray(input.steps) ? input.steps : []) {\n if (!isRecord(rawStep) || typeof rawStep.sender !== 'string') {\n throw new InvalidValue('Umlageschritt braucht sender');\n }\n const sender = rawStep.sender;\n const receivers: Receiver[] = [];\n for (const rawReceiver of Array.isArray(rawStep.receivers) ? rawStep.receivers : []) {\n if (!isRecord(rawReceiver) || typeof rawReceiver.code !== 'string') continue;\n receivers.push({ code: rawReceiver.code, share: typeof rawReceiver.share === 'string' ? rawReceiver.share : '1' });\n const list = edges.get(sender) ?? [];\n list.push(rawReceiver.code);\n edges.set(sender, list);\n }\n steps.push({ sender, receivers });\n }\n\n if (method === 'step_ladder') this.assertAcyclic(edges);\n this.schemeSteps = steps;\n\n return { valid: true, method, stepCount: steps.length };\n }\n\n run(input: Record<string, unknown>): CostingRun {\n const fiscalYear = typeof input.fiscalYear === 'number' ? input.fiscalYear : 0;\n const period = typeof input.period === 'number' ? input.period : 0;\n const periodRef = new PeriodRef(fiscalYear, period);\n\n const zero = Money.zero(this.baseCurrency);\n const primary = new Map<string, Money>();\n\n for (const entry of this.journal.forFiscalYear(fiscalYear)) {\n if (entry.periodRef.period !== period) continue;\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null || account.type !== 'expense') continue;\n for (const dimension of line.dimensions) {\n if (dimension.type !== 'costCenter') continue;\n const signed = line.side === 'debit' ? line.money : line.money.negate();\n primary.set(dimension.code, (primary.get(dimension.code) ?? zero).add(signed));\n }\n }\n }\n\n const after = new Map(primary);\n for (const step of this.schemeSteps) {\n const senderTotal = after.get(step.sender) ?? zero;\n if (senderTotal.isZero() || step.receivers.length === 0) continue;\n const weights = step.receivers.map((receiver) => receiver.share);\n const parts = senderTotal.allocate(...weights);\n step.receivers.forEach((receiver, index) => {\n after.set(receiver.code, (after.get(receiver.code) ?? zero).add(parts[index]!));\n });\n after.set(step.sender, zero);\n }\n\n let grandTotal = zero;\n for (const total of after.values()) grandTotal = grandTotal.add(total);\n\n const key = `${fiscalYear}-${period}`;\n const version = (this.versions.get(key) ?? 0) + 1;\n this.versions.set(key, version);\n\n const run = new CostingRun(this.ids.next(), periodRef, version, primary, after, grandTotal);\n this.runs.set(run.id.value, run);\n return run;\n }\n\n release(input: Record<string, unknown>): CostingRun {\n const run = this.requireRun(input.runId);\n run.release();\n return run;\n }\n\n costAllocationSheet(params: Record<string, unknown>): Record<string, unknown> {\n const run = this.requireRun(params.runId);\n return {\n runId: run.id.value,\n status: run.status(),\n version: run.version,\n primary: this.serializeTotals(run.primary),\n afterAllocation: this.serializeTotals(run.afterAllocation),\n grandTotal: run.grandTotal.amountAsString(),\n };\n }\n\n private serializeTotals(totals: Map<string, Money>): Array<{ costCenter: string; total: string }> {\n const codes = [...totals.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n return codes.map((code) => ({ costCenter: code, total: totals.get(code)!.amountAsString() }));\n }\n\n private requireRun(runId: unknown): CostingRun {\n let run: CostingRun | null = null;\n if (typeof runId === 'string' && runId !== '') {\n try {\n run = this.runs.get(Uuid.fromString(runId).value) ?? null;\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (run === null) {\n throw new DomainError('E_COSTING_RUN_UNKNOWN', `Abrechnungslauf ${typeof runId === 'string' ? runId : '?'} existiert nicht`);\n }\n return run;\n }\n\n private assertAcyclic(edges: Map<string, string[]>): void {\n const visiting = new Set<string>();\n const done = new Set<string>();\n\n const visit = (node: string): void => {\n if (done.has(node)) return;\n if (visiting.has(node)) {\n throw new DomainError(\n 'E_COSTING_CYCLE',\n `Umlagezyklus über Kostenstelle \"${node}\" — Stufenleiter verlangt Zyklenfreiheit`,\n { costCenter: node },\n );\n }\n visiting.add(node);\n for (const next of edges.get(node) ?? []) visit(next);\n visiting.delete(node);\n done.add(node);\n };\n\n for (const node of edges.keys()) visit(node);\n }\n}\n","import type { AuditChanges } from '../ledger/audit-record.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Geschäftspartner (datenformat.md v0.4) — bewusst schlank: OP-je-Partner,\n * igL-Nachweis (USt-IdNr.), ZM-Grundlage, DATEV-Stammdaten.\n */\nexport class Partner {\n private partnerName: string;\n private partnerKind: string;\n private partnerVatId: string | null;\n private partnerPaymentTermsDays: number | null;\n\n constructor(\n readonly id: Uuid,\n name: string,\n kind: string,\n vatId: string | null,\n paymentTermsDays: number | null,\n private readonly accountNumbers: string[] = [],\n private readonly address: Record<string, unknown> = {},\n ) {\n this.partnerName = name;\n this.partnerKind = kind;\n this.partnerVatId = vatId;\n this.partnerPaymentTermsDays = paymentTermsDays;\n }\n\n name(): string {\n return this.partnerName;\n }\n\n vatId(): string | null {\n return this.partnerVatId;\n }\n\n update(input: Record<string, unknown>): AuditChanges {\n const changes: AuditChanges = {};\n\n if (typeof input.name === 'string' && input.name !== this.partnerName) {\n changes.name = { from: this.partnerName, to: input.name };\n this.partnerName = input.name;\n }\n if (\n 'vatId' in input &&\n input.vatId !== this.partnerVatId &&\n (typeof input.vatId === 'string' || input.vatId === null)\n ) {\n changes.vatId = { from: this.partnerVatId, to: input.vatId };\n this.partnerVatId = input.vatId;\n }\n if (typeof input.kind === 'string' && input.kind !== this.partnerKind) {\n changes.kind = { from: this.partnerKind, to: input.kind };\n this.partnerKind = input.kind;\n }\n if (\n typeof input.paymentTermsDays === 'number' &&\n input.paymentTermsDays !== this.partnerPaymentTermsDays\n ) {\n changes.paymentTermsDays = { from: this.partnerPaymentTermsDays, to: input.paymentTermsDays };\n this.partnerPaymentTermsDays = input.paymentTermsDays;\n }\n\n return changes;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n id: this.id.value,\n name: this.partnerName,\n kind: this.partnerKind,\n vatId: this.partnerVatId,\n paymentTermsDays: this.partnerPaymentTermsDays,\n accountNumbers: this.accountNumbers,\n address: Object.keys(this.address).length === 0 ? null : this.address,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { AuditRecord, type AuditChanges } from '../ledger/audit-record.js';\nimport type { AuditTrail, PartnerRepository } from '../port.js';\nimport type { Clock } from '../shared/clock.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { Uuid } from '../shared/uuid.js';\nimport { Partner } from './partner.js';\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Partner-Operationen (api.md v0.4): createPartner / updatePartner mit Audit. */\nexport class PartnerService {\n constructor(\n private readonly partners: PartnerRepository,\n private readonly audit: AuditTrail,\n private readonly clock: Clock,\n private readonly ids: IdGenerator,\n ) {}\n\n create(input: Record<string, unknown>): Partner {\n const accountNumbers = (Array.isArray(input.accountNumbers) ? input.accountNumbers : []).filter(\n (value): value is string => typeof value === 'string',\n );\n const address =\n input.address !== null && typeof input.address === 'object' && !Array.isArray(input.address)\n ? (input.address as Record<string, unknown>)\n : {};\n\n const partner = new Partner(\n this.ids.next(),\n asString(input.name) ?? '',\n asString(input.kind) ?? 'both',\n asString(input.vatId),\n typeof input.paymentTermsDays === 'number' ? input.paymentTermsDays : null,\n accountNumbers,\n address,\n );\n\n this.partners.add(partner);\n this.recordAudit(input, 'created', partner.id, {});\n return partner;\n }\n\n update(input: Record<string, unknown>): Partner {\n const partner = this.require(input.partnerId);\n const changes = partner.update(input);\n if (Object.keys(changes).length > 0) {\n this.partners.save(partner);\n this.recordAudit(input, 'updated', partner.id, changes);\n }\n return partner;\n }\n\n require(partnerId: unknown): Partner {\n let partner: Partner | null = null;\n if (typeof partnerId === 'string' && partnerId !== '') {\n try {\n partner = this.partners.byId(Uuid.fromString(partnerId));\n } catch (error) {\n if (!(error instanceof InvalidValue)) throw error;\n }\n }\n if (partner === null) {\n throw new DomainError('E_PARTNER_UNKNOWN', `Geschäftspartner ${typeof partnerId === 'string' ? partnerId : '?'} existiert nicht`);\n }\n return partner;\n }\n\n private recordAudit(\n input: Record<string, unknown>,\n action: string,\n objectId: Uuid,\n changes: AuditChanges,\n ): void {\n const actor = asString(input.actor);\n this.audit.append(\n new AuditRecord(\n this.ids.next(),\n this.clock.now().toISOString(),\n actor !== null && actor !== '' ? actor : 'system',\n 'partner',\n objectId,\n action,\n changes,\n ),\n );\n }\n}\n","import type { JournalRepository, PartnerRepository, VoucherRepository } from '../port.js';\nimport { Money } from '../shared/money.js';\nimport type { Currency } from '../shared/currency.js';\nimport type { TaxCodeRegistry } from '../tax/tax-code-registry.js';\n\n/**\n * ZM-Grundlage (v0.4, SF-21): innergemeinschaftliche Umsätze je USt-IdNr. und\n * Zeitraum — aus Kennzahl-Tags der igL-Schlüssel, Partner über den Beleg.\n */\nexport class EcSalesListProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly journal: JournalRepository,\n private readonly vouchers: VoucherRepository,\n private readonly partners: PartnerRepository,\n private readonly registry: TaxCodeRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): { rows: Array<Record<string, string>> } {\n const year = typeof params.year === 'number' ? params.year : 0;\n const quarter = typeof params.quarter === 'number' ? params.quarter : 0;\n\n const intraCommunityKeys = new Set<string>();\n for (const version of this.registry.allVersions()) {\n if (version.mechanism === 'intra_community_supply' && version.reportingKey !== null) {\n intraCommunityKeys.add(version.reportingKey);\n }\n }\n\n const byVatId = new Map<string, Money>();\n\n for (const entry of this.journal.all()) {\n const voucher = this.vouchers.byId(entry.voucherId);\n const taxDate = voucher === null ? entry.entryDate : voucher.taxDate();\n if (taxDate.year() !== year) continue;\n if (quarter !== 0 && Math.floor((taxDate.month() - 1) / 3) + 1 !== quarter) continue;\n\n const partner = voucher?.partnerId == null ? null : this.partners.byId(voucher.partnerId);\n const vatId = partner?.vatId() ?? null;\n if (vatId === null) continue;\n\n for (const line of entry.lines()) {\n const rawKey = line.taxTag?.reportingKey;\n if (typeof rawKey !== 'string' && typeof rawKey !== 'number') continue;\n if (!intraCommunityKeys.has(String(rawKey))) continue;\n const signed = line.side === 'credit' ? line.money : line.money.negate();\n byVatId.set(vatId, (byVatId.get(vatId) ?? Money.zero(this.baseCurrency)).add(signed));\n }\n }\n\n const vatIds = [...byVatId.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const rows: Array<Record<string, string>> = [];\n for (const vatId of vatIds) {\n const amount = byVatId.get(vatId)!;\n if (amount.isZero()) continue;\n rows.push({ vatId, amount: amount.amountAsString(), kind: 'supply' });\n }\n return { rows };\n }\n}\n","import type { AccountRepository, JournalRepository } from '../port.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\ninterface Totals {\n opening: Money;\n debit: Money;\n credit: Money;\n touched: boolean;\n}\n\n/**\n * Summen- und Saldenliste (SuSa) — Spalten verbindlich (api.md v0.4):\n * - openingBalance: kumulierter Saldo VOR dem GJ (0 bei Erfolgskonten)\n * - debitTotal/creditTotal: Verkehrszahlen des Zeitraums (GJ bis Periode)\n * - balance = openingBalance + debitTotal − creditTotal (Soll-Salden positiv)\n * Sortierung: Kontonummer nach Codepoints (determinismus.md §3).\n */\nexport class TrialBalanceProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n ) {}\n\n compute(params: Record<string, unknown>): { rows: Array<Record<string, string>> } {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : 0;\n const throughPeriod =\n typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n const includeZeroBalances = params.includeZeroBalances === true;\n\n const zero = Money.zero(this.baseCurrency);\n const totals = new Map<string, Totals>();\n\n for (const entry of this.journal.all()) {\n const entryYear = entry.periodRef.fiscalYear;\n const entryPeriod = entry.periodRef.period;\n const isPriorYear = entryYear < fiscalYear;\n const isCurrentScope = entryYear === fiscalYear && entryPeriod <= throughPeriod;\n if (!isPriorYear && !isCurrentScope) continue;\n\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null) continue;\n // Erfolgskonten starten je Geschäftsjahr bei null (G1).\n if (isPriorYear && !isBalanceCarrying(account.type)) continue;\n\n const key = account.number.value;\n let total = totals.get(key);\n if (total === undefined) {\n total = { opening: zero, debit: zero, credit: zero, touched: false };\n totals.set(key, total);\n }\n\n if (isPriorYear) {\n total.opening =\n line.side === 'debit' ? total.opening.add(line.money) : total.opening.subtract(line.money);\n continue;\n }\n\n if (line.side === 'debit') total.debit = total.debit.add(line.money);\n else total.credit = total.credit.add(line.money);\n total.touched = true;\n }\n }\n\n if (includeZeroBalances) {\n for (const account of this.accounts.all()) {\n if (!totals.has(account.number.value)) {\n totals.set(account.number.value, { opening: zero, debit: zero, credit: zero, touched: false });\n }\n }\n }\n\n const numbers = [...totals.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const rows: Array<Record<string, string>> = [];\n for (const number of numbers) {\n const total = totals.get(number)!;\n const balance = total.opening.add(total.debit).subtract(total.credit);\n if (!includeZeroBalances && balance.isZero() && !total.touched) continue;\n rows.push({\n account: number,\n openingBalance: total.opening.amountAsString(),\n debitTotal: total.debit.amountAsString(),\n creditTotal: total.credit.amountAsString(),\n balance: balance.amountAsString(),\n });\n }\n return { rows };\n }\n}\n","import type { JournalRepository, OpenItemRepository, VoucherRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { OpenItem } from '../ledger/open-item.js';\nimport { parseOpenItemKind } from '../ledger/types.js';\n\n/**\n * OP-Liste: deterministisch, asOf-fähig (Zeitreise über settledAt). Sortierung:\n * voucherDate, dann sequenceNumber (determinismus.md §3).\n */\nexport class OpenItemsProjection {\n constructor(\n private readonly openItems: OpenItemRepository,\n private readonly vouchers: VoucherRepository,\n private readonly journal: JournalRepository,\n ) {}\n\n compute(params: Record<string, unknown>): { items: Array<Record<string, unknown>> } {\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n const kind = parseOpenItemKind(params.kind);\n const partnerId = typeof params.partnerId === 'string' ? params.partnerId : null;\n\n const open = this.openItems.all().filter((item) => {\n if (kind !== null && item.kind !== kind) return false;\n if (partnerId !== null && (item.partnerId?.value ?? null) !== partnerId) return false;\n if (asOf !== null && item.openedAt.isAfter(asOf)) return false;\n if (item.remainingAt(asOf).isZero()) return false;\n return true;\n });\n\n open.sort((a, b) => {\n const byDate = this.voucherDate(a).compareTo(this.voucherDate(b));\n return byDate !== 0 ? byDate : this.sequenceNumber(a) - this.sequenceNumber(b);\n });\n\n return { items: open.map((item) => this.serializeItem(item, asOf)) };\n }\n\n private voucherDate(item: OpenItem): CalendarDate {\n return this.vouchers.byId(item.voucherId)?.voucherDate ?? item.openedAt;\n }\n\n private sequenceNumber(item: OpenItem): number {\n return this.journal.byId(item.originEntryId)?.sequenceNumber ?? 0;\n }\n\n private serializeItem(item: OpenItem, asOf: CalendarDate | null): Record<string, unknown> {\n return {\n id: item.id.value,\n kind: item.kind,\n voucherNumber: this.vouchers.byId(item.voucherId)?.voucherNumber ?? null,\n money: item.money.toJSON(),\n remaining: item.remainingAt(asOf).toJSON(),\n status: item.statusAt(asOf),\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\n/**\n * Kontoblatt: alle Bewegungen eines Kontos im Geschäftsjahr mit laufendem Saldo.\n * Anfangsbestand = kumulierte Vorjahre für Bestandskonten, null für Erfolgskonten.\n * Ordnung: sequenceNumber (determinismus.md §3).\n */\nexport class AccountSheetProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const number = typeof params.account === 'string' ? params.account : '';\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : 0;\n const throughPeriod =\n typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n\n const account = this.accounts.byNumber(AccountNumber.of(number));\n if (account === null) {\n throw new DomainError('E_ACCOUNT_UNKNOWN', `Konto ${number} existiert nicht`);\n }\n\n let opening = Money.zero(this.baseCurrency);\n if (isBalanceCarrying(account.type)) {\n for (const entry of this.journal.all()) {\n if (entry.periodRef.fiscalYear >= fiscalYear) continue;\n for (const line of entry.lines()) {\n if (!line.accountId.equals(account.id)) continue;\n opening = line.side === 'debit' ? opening.add(line.money) : opening.subtract(line.money);\n }\n }\n }\n\n let running = opening;\n const lines: Array<Record<string, unknown>> = [];\n for (const entry of this.journal.forFiscalYear(fiscalYear)) {\n if (entry.periodRef.period > throughPeriod) continue;\n for (const line of entry.lines()) {\n if (!line.accountId.equals(account.id)) continue;\n running = line.side === 'debit' ? running.add(line.money) : running.subtract(line.money);\n lines.push({\n sequenceNumber: entry.sequenceNumber,\n entryDate: entry.entryDate.iso,\n text: entry.text(),\n side: line.side,\n money: line.money.toJSON(),\n runningBalance: running.amountAsString(),\n });\n }\n }\n\n return {\n account: account.number.value,\n name: account.name,\n openingBalance: opening.amountAsString(),\n lines,\n closingBalance: running.amountAsString(),\n };\n }\n}\n","import type { AuditTrail } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\n\n/**\n * Änderungshistorie als Projektion (F-CORE-014). Reihenfolge =\n * Erfassungsreihenfolge des Audit-Trails.\n */\nexport class AuditLogProjection {\n constructor(private readonly audit: AuditTrail) {}\n\n compute(params: Record<string, unknown>): { records: Array<Record<string, unknown>> } {\n const from = typeof params.from === 'string' ? CalendarDate.of(params.from) : null;\n const to = typeof params.to === 'string' ? CalendarDate.of(params.to) : null;\n\n const records: Array<Record<string, unknown>> = [];\n for (const record of this.audit.all()) {\n const date = CalendarDate.of(record.at.slice(0, 10));\n if (from !== null && date.isBefore(from)) continue;\n if (to !== null && date.isAfter(to)) continue;\n records.push(record.toJSON());\n }\n return { records };\n }\n}\n","import Big from 'big.js';\nimport type {\n AccountRepository,\n JournalRepository,\n OpenItemRepository,\n VoucherRepository,\n} from '../port.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\nimport type { OpenItem } from '../ledger/open-item.js';\nimport type { TaxCodeRegistry } from '../tax/tax-code-registry.js';\nimport type { TaxProfile } from '../tax/tax-profile.js';\n\ninterface KeyAmount {\n base: Money;\n tax: Money;\n}\ninterface Share {\n key: string;\n base: Money;\n tax: Money;\n settledAt: CalendarDate;\n}\n\n/**\n * USt-VA-Kennzahlen über taxTags (SF-09). Soll: Buchungs-/Leistungsdatum; Ist:\n * folgt OP-Ausgleichen (anteilig half-up, Schlussrest exakt). Bemessungsgrund-\n * lagen je Kennzahl auf volle Euro abgerundet, Steuer centgenau (api.md v0.3).\n */\nexport class VatReturnProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly journal: JournalRepository,\n private readonly openItems: OpenItemRepository,\n private readonly vouchers: VoucherRepository,\n private readonly accounts: AccountRepository,\n private readonly registry: TaxCodeRegistry,\n private readonly profile: TaxProfile,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const year = typeof params.year === 'number' ? params.year : 0;\n const quarter = typeof params.quarter === 'number' ? params.quarter : 0;\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n\n const zero = Money.zero(this.baseCurrency);\n const keys = new Map<string, KeyAmount>();\n const directions = this.registryDirections();\n\n const add = (key: string, base: Money, tax: Money): void => {\n const current = keys.get(key) ?? { base: zero, tax: zero };\n keys.set(key, { base: current.base.add(base), tax: current.tax.add(tax) });\n };\n\n if (this.profile.isCashBasis()) {\n for (const item of this.openItems.all()) {\n const origin = this.journal.byId(item.originEntryId);\n if (origin === null || (asOf !== null && origin.entryDate.isAfter(asOf))) continue;\n const contributions = this.entryContributions(origin, directions);\n if (contributions.size === 0) continue;\n for (const share of this.allocateToSettlements(item, contributions)) {\n if (asOf !== null && share.settledAt.isAfter(asOf)) continue;\n if (this.inQuarter(share.settledAt, year, quarter)) add(share.key, share.base, share.tax);\n }\n }\n\n for (const entry of this.journal.all()) {\n if (!this.inQuarter(entry.entryDate, year, quarter)) continue;\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n if (this.openItems.byOriginEntry(entry.id).length > 0) continue;\n for (const [key, contribution] of this.entryContributions(entry, directions)) {\n add(key, contribution.base, contribution.tax);\n }\n }\n } else {\n for (const entry of this.journal.all()) {\n let taxDate: CalendarDate;\n if (entry.reverses !== null) {\n // F-011: § 17-Korrektur zählt nach eigenem Buchungsdatum.\n taxDate = entry.entryDate;\n } else {\n const voucher = this.vouchers.byId(entry.voucherId);\n taxDate = voucher === null ? entry.entryDate : voucher.taxDate();\n }\n if (!this.inQuarter(taxDate, year, quarter)) continue;\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n for (const [key, contribution] of this.entryContributions(entry, directions)) {\n add(key, contribution.base, contribution.tax);\n }\n }\n }\n\n const sortedKeys = [...keys.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const result: Record<string, { base: string; tax: string }> = {};\n let payload = zero;\n\n for (const key of sortedKeys) {\n const amounts = keys.get(key)!;\n // Amtliche VA-Konvention: Basis auf volle Euro abrunden.\n const flooredBase = Money.fromCalculation(\n new Big(amounts.base.amountAsString()).round(0, Big.roundDown),\n this.baseCurrency,\n );\n result[key] = { base: flooredBase.amountAsString(), tax: amounts.tax.amountAsString() };\n const direction = directions.get(key) ?? 'output';\n payload = direction === 'input' ? payload.subtract(amounts.tax) : payload.add(amounts.tax);\n }\n\n return { keys: result, payload: payload.toJSON() };\n }\n\n private registryDirections(): Map<string, string> {\n const directions = new Map<string, string>();\n for (const version of this.registry.allVersions()) {\n if (version.reportingKey !== null) {\n directions.set(version.reportingKey, this.accountDirection(version.taxAccount));\n }\n if (version.inputReportingKey !== null) {\n directions.set(version.inputReportingKey, 'input');\n }\n if (version.baseReportingKey !== null) {\n directions.set(\n version.baseReportingKey,\n version.mechanism === 'reverse_charge' ? 'input' : this.accountDirection(version.taxAccount),\n );\n }\n }\n return directions;\n }\n\n private accountDirection(accountNumber: string): string {\n if (accountNumber === '') return 'output';\n const account = this.accounts.byNumber(AccountNumber.of(accountNumber));\n return account?.subtype === 'tax_in' ? 'input' : 'output';\n }\n\n private entryContributions(entry: JournalEntry, directions: Map<string, string>): Map<string, KeyAmount> {\n const zero = Money.zero(this.baseCurrency);\n interface Collected {\n baseFromTax: Money;\n hasTaxBase: boolean;\n baseFallback: Money;\n tax: Money;\n }\n const collected = new Map<string, Collected>();\n\n for (const line of entry.lines()) {\n const tag = line.taxTag;\n if (tag === null) continue;\n const rawKey = tag.reportingKey;\n if (typeof rawKey !== 'string' && typeof rawKey !== 'number') continue;\n const key = String(rawKey);\n\n const account = this.accounts.byId(line.accountId);\n const subtype = account?.subtype ?? null;\n const entryFor = collected.get(key) ?? {\n baseFromTax: zero,\n hasTaxBase: false,\n baseFallback: zero,\n tax: zero,\n };\n\n if (subtype === 'tax_out' || subtype === 'tax_in') {\n const positiveSide = subtype === 'tax_out' ? 'credit' : 'debit';\n const signed = line.side === positiveSide ? line.money : line.money.negate();\n entryFor.tax = entryFor.tax.add(signed);\n\n let baseMoney = this.tagBaseMoney(tag);\n if (baseMoney !== null) {\n if (line.money.isNegative()) baseMoney = baseMoney.negate();\n entryFor.baseFromTax = entryFor.baseFromTax.add(baseMoney);\n entryFor.hasTaxBase = true;\n }\n } else {\n const direction = directions.get(key) ?? 'output';\n const positiveSide = direction === 'input' ? 'debit' : 'credit';\n const signed = line.side === positiveSide ? line.money : line.money.negate();\n entryFor.baseFallback = entryFor.baseFallback.add(signed);\n }\n collected.set(key, entryFor);\n }\n\n const contributions = new Map<string, KeyAmount>();\n for (const [key, parts] of collected) {\n const base = parts.hasTaxBase ? parts.baseFromTax : parts.baseFallback;\n if (base.isZero() && parts.tax.isZero()) continue;\n contributions.set(key, { base, tax: parts.tax });\n }\n return contributions;\n }\n\n private tagBaseMoney(tag: Record<string, unknown>): Money | null {\n const baseMoney = tag.baseMoney;\n const amount =\n baseMoney !== null && typeof baseMoney === 'object' && typeof (baseMoney as Record<string, unknown>).amount === 'string'\n ? ((baseMoney as Record<string, unknown>).amount as string)\n : null;\n return amount === null ? null : Money.of(amount, this.baseCurrency);\n }\n\n private allocateToSettlements(item: OpenItem, contributions: Map<string, KeyAmount>): Share[] {\n const shares: Share[] = [];\n const allocated = new Map<string, KeyAmount>();\n let remaining = item.money;\n const total = new Big(item.money.amountAsString());\n\n for (const settlement of item.settlements()) {\n remaining = remaining.subtract(settlement.money);\n const isFinal = remaining.isZero();\n const ratio = new Big(settlement.money.amountAsString());\n\n for (const [key, contribution] of contributions) {\n const current = allocated.get(key) ?? {\n base: Money.zero(this.baseCurrency),\n tax: Money.zero(this.baseCurrency),\n };\n\n let base: Money;\n let tax: Money;\n if (isFinal) {\n base = contribution.base.subtract(current.base);\n tax = contribution.tax.subtract(current.tax);\n } else {\n base = this.proportional(contribution.base, ratio, total);\n tax = this.proportional(contribution.tax, ratio, total);\n }\n\n allocated.set(key, { base: current.base.add(base), tax: current.tax.add(tax) });\n shares.push({ key, base, tax, settledAt: settlement.settledAt });\n }\n }\n return shares;\n }\n\n private proportional(total: Money, part: Big, whole: Big): Money {\n if (whole.eq(0)) return Money.zero(this.baseCurrency);\n return Money.fromCalculation(\n new Big(total.amountAsString()).times(part).div(whole),\n this.baseCurrency,\n );\n }\n\n private inQuarter(date: CalendarDate, year: number, quarter: number): boolean {\n if (date.year() !== year) return false;\n return quarter === 0 || Math.floor((date.month() - 1) / 3) + 1 === quarter;\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { MappingRegistry } from '../mapping/mapping-registry.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\n/**\n * GuV als Projektion über ein Mapping (SF-09). Vorzeichen: Haben − Soll\n * (Erträge positiv, Aufwand negativ); netIncome = Summe der Positionen.\n * fromPeriod/throughPeriod grenzen ab (Monats-GuV als BWA-Grundlage).\n */\nexport class IncomeStatementProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly mappings: MappingRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : 0;\n const fromPeriod = typeof params.fromPeriod === 'number' ? params.fromPeriod : 1;\n const throughPeriod =\n typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n const mappingId = typeof params.mapping === 'string' ? params.mapping : '';\n\n const mapping = this.mappings.byId(mappingId);\n if (mapping === null) {\n throw new DomainError('E_MAPPING_OVERLAP', `Mapping \"${mappingId}\" ist nicht geladen`);\n }\n\n const zero = Money.zero(this.baseCurrency);\n const amounts = new Map<string, Money>();\n const touched = new Set<string>();\n\n for (const entry of this.journal.forFiscalYear(fiscalYear)) {\n const period = entry.periodRef.period;\n if (period < fromPeriod || period > throughPeriod) continue;\n\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null || isBalanceCarrying(account.type)) continue;\n const leaf = mapping.leafFor(account.number.value);\n if (leaf === null) continue;\n const signed = line.side === 'credit' ? line.money : line.money.negate();\n amounts.set(leaf.key, (amounts.get(leaf.key) ?? zero).add(signed));\n touched.add(leaf.key);\n }\n }\n\n const positions: Array<Record<string, string>> = [];\n let netIncome = zero;\n\n for (const leaf of mapping.leaves) {\n const amount = amounts.get(leaf.key) ?? zero;\n netIncome = netIncome.add(amount);\n if (amount.isZero() && !touched.has(leaf.key)) continue;\n positions.push({ key: leaf.key, label: leaf.label, amount: amount.amountAsString() });\n }\n\n return { positions, netIncome: netIncome.amountAsString() };\n }\n}\n","export interface MappingLeaf {\n key: string;\n label: string;\n side: string | null;\n ranges: Array<{ from: string; to: string }>;\n numbers: string[];\n includeNonCash: boolean;\n includesNetIncome: boolean;\n parents: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Trifft ein Blatt eine Kontonummer? (Einzelnummern oder Codepoint-Bereiche.) */\nexport function leafMatches(leaf: MappingLeaf, accountNumber: string): boolean {\n if (leaf.numbers.includes(accountNumber)) return true;\n for (const range of leaf.ranges) {\n if (accountNumber >= range.from && accountNumber <= range.to) return true;\n }\n return false;\n}\n\n/**\n * Gliederungs-Mapping (datenformat.md v0.2): ordnet Konten Positionen zu —\n * gleiche Struktur für Bilanz, GuV, EÜR-Zeilen und VA-Kennzahlen.\n */\nexport class Mapping {\n constructor(\n readonly id: string,\n readonly kind: string,\n readonly version: string,\n readonly leaves: MappingLeaf[],\n ) {}\n\n static fromData(data: Record<string, unknown>): Mapping {\n const leaves: MappingLeaf[] = [];\n Mapping.collectLeaves(Array.isArray(data.positions) ? data.positions : [], [], leaves, null);\n return new Mapping(asString(data.id) ?? '', asString(data.kind) ?? '', asString(data.version) ?? '', leaves);\n }\n\n private static collectLeaves(\n positions: unknown[],\n parents: string[],\n leaves: MappingLeaf[],\n side: string | null,\n ): void {\n for (const position of positions) {\n if (!isRecord(position)) continue;\n const key = asString(position.key) ?? '';\n // side wird am Wurzelknoten gesetzt und an die Blätter vererbt (v0.5/F-007).\n const nodeSide = asString(position.side) ?? side;\n const children = Array.isArray(position.children) ? position.children : [];\n\n if (children.length > 0) {\n Mapping.collectLeaves(children, [...parents, key], leaves, nodeSide);\n continue;\n }\n\n const ranges: Array<{ from: string; to: string }> = [];\n const numbers: string[] = [];\n for (const selector of Array.isArray(position.accounts) ? position.accounts : []) {\n if (!isRecord(selector)) continue;\n if (typeof selector.from === 'string' && typeof selector.to === 'string') {\n ranges.push({ from: selector.from, to: selector.to });\n }\n for (const number of Array.isArray(selector.numbers) ? selector.numbers : []) {\n if (typeof number === 'string') numbers.push(number);\n }\n }\n\n leaves.push({\n key,\n label: asString(position.label) ?? key,\n side: nodeSide,\n ranges,\n numbers,\n includeNonCash: position.includeNonCash === true,\n includesNetIncome: position.includesNetIncome === true,\n parents,\n });\n }\n }\n\n leafFor(accountNumber: string): MappingLeaf | null {\n for (const leaf of this.leaves) {\n if (leafMatches(leaf, accountNumber)) return leaf;\n }\n return null;\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { leafMatches } from '../mapping/mapping.js';\nimport type { MappingRegistry } from '../mapping/mapping-registry.js';\nimport type { AccountRepository, JournalRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\n\ntype Section = 'assets' | 'liabilitiesAndEquity';\n\n/**\n * Bilanz als Projektion (SF-10): kumulativ zum Stichtag. Position mit\n * includesNetIncome enthält die kumulierten Jahresergebnisse + eigenen Saldo.\n * Seite (v0.5/F-007): `side` am Wurzelknoten; assets = Soll−Haben,\n * liabilitiesAndEquity = Haben−Soll. Default: assets.\n */\nexport class BalanceSheetProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly mappings: MappingRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n const mappingId = typeof params.mapping === 'string' ? params.mapping : '';\n\n const mapping = this.mappings.byId(mappingId);\n if (mapping === null) {\n throw new DomainError('E_MAPPING_OVERLAP', `Mapping \"${mappingId}\" ist nicht geladen`);\n }\n\n const zero = Money.zero(this.baseCurrency);\n const debits = new Map<string, Money>();\n const credits = new Map<string, Money>();\n const touchedAccounts = new Set<string>();\n let netIncome = zero;\n\n for (const entry of this.journal.all()) {\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null) continue;\n\n if (!isBalanceCarrying(account.type)) {\n netIncome = line.side === 'credit' ? netIncome.add(line.money) : netIncome.subtract(line.money);\n continue;\n }\n\n const key = account.number.value;\n if (line.side === 'debit') debits.set(key, (debits.get(key) ?? zero).add(line.money));\n else credits.set(key, (credits.get(key) ?? zero).add(line.money));\n touchedAccounts.add(key);\n }\n }\n\n const allNumbers = new Set<string>([...debits.keys(), ...credits.keys()]);\n const sections: Record<Section, Array<Record<string, string>>> = { assets: [], liabilitiesAndEquity: [] };\n const totals: Record<Section, Money> = { assets: zero, liabilitiesAndEquity: zero };\n\n for (const leaf of mapping.leaves) {\n const section: Section = leaf.side === 'liabilitiesAndEquity' ? 'liabilitiesAndEquity' : 'assets';\n let amount = zero;\n let touched = false;\n\n for (const number of allNumbers) {\n if (!leafMatches(leaf, number)) continue;\n const debit = debits.get(number) ?? zero;\n const credit = credits.get(number) ?? zero;\n amount =\n section === 'assets'\n ? amount.add(debit).subtract(credit)\n : amount.add(credit).subtract(debit);\n touched = touched || touchedAccounts.has(number);\n }\n\n if (leaf.includesNetIncome) {\n amount = amount.add(netIncome);\n touched = touched || !netIncome.isZero();\n }\n\n if (amount.isZero() && !touched) continue;\n\n sections[section].push({ key: leaf.key, label: leaf.label, amount: amount.amountAsString() });\n totals[section] = totals[section].add(amount);\n }\n\n return {\n assets: sections.assets,\n assetsTotal: totals.assets.amountAsString(),\n liabilitiesAndEquity: sections.liabilitiesAndEquity,\n liabilitiesAndEquityTotal: totals.liabilitiesAndEquity.amountAsString(),\n };\n }\n}\n","import Big from 'big.js';\nimport { DomainError } from '../domain-error.js';\nimport type { Mapping } from '../mapping/mapping.js';\nimport type { MappingRegistry } from '../mapping/mapping-registry.js';\nimport type {\n AccountRepository,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n VoucherRepository,\n} from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { Money } from '../shared/money.js';\nimport type { Account } from '../ledger/account.js';\nimport type { EntryLine } from '../ledger/entry-line.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\n\nconst NON_PROFIT_SUBTYPES = new Set(['bank', 'cash', 'transit', 'ar', 'ap']);\n\n/**\n * EÜR als Projektion über das doppische Journal — Regeln R1–R7\n * (euer-projektions-beweis.md). Zahlungswirksamkeit über Geldkonten, OP-Link bei\n * Ausgleich (anteilig), 10-Tage-Regel, USt zahlungswirksam, R7 includeNonCash.\n * Kalenderjahrgebunden: abweichendes GJ → E_CASHBASIS_DEVIATING_FISCAL_YEAR.\n */\nexport class CashBasisProjection {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly accounts: AccountRepository,\n private readonly journal: JournalRepository,\n private readonly openItems: OpenItemRepository,\n private readonly vouchers: VoucherRepository,\n private readonly fiscalYears: FiscalYearRepository,\n private readonly mappings: MappingRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const year = typeof params.year === 'number' ? params.year : 0;\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n const mapping = typeof params.mapping === 'string' ? this.mappings.byId(params.mapping) : null;\n\n this.assertCalendarYearFiscalYears(year);\n\n const income = new Map<string, Money>();\n const expenses = new Map<string, Money>();\n const addTo = (bucket: Map<string, Money>, label: string, amount: Money): void => {\n bucket.set(label, (bucket.get(label) ?? Money.zero(this.baseCurrency)).add(amount));\n };\n\n for (const entry of this.journal.all()) {\n if (asOf !== null && entry.entryDate.isAfter(asOf)) continue;\n\n const bankFlow = this.bankFlow(entry);\n\n if (bankFlow.isZero()) {\n // R7: nicht zahlungswirksame Pflichtkategorien (Buchungsjahr).\n if (mapping === null || entry.entryDate.year() !== year) continue;\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n if (account === null) continue;\n const leaf = mapping.leafFor(account.number.value);\n if (leaf === null || !leaf.includeNonCash) continue;\n\n if (account.type === 'revenue' || account.subtype === 'tax_out') {\n const signed = line.side === 'credit' ? line.money : line.money.negate();\n addTo(income, leaf.label, signed);\n } else if (account.type === 'expense' || account.subtype === 'tax_in') {\n const signed = line.side === 'debit' ? line.money : line.money.negate();\n addTo(expenses, leaf.label, signed);\n }\n }\n continue;\n }\n\n // R1: zahlungswirksam — Zieljahr (R2), Quelle ggf. via OP-Link.\n if (this.assignYear(entry) !== year) continue;\n const inflow = bankFlow.isPositive();\n\n for (const sourced of this.sourceLines(entry)) {\n const account = this.accounts.byId(sourced.line.accountId);\n if (account === null || (account.subtype !== null && NON_PROFIT_SUBTYPES.has(account.subtype))) {\n continue;\n }\n const amount = this.proportional(sourced.line.money, sourced.ratio);\n\n if (account.subtype === 'tax_out') {\n addTo(inflow ? income : expenses, inflow ? 'Vereinnahmte USt' : 'USt-Zahlung an FA', amount);\n } else if (account.subtype === 'tax_in') {\n addTo(expenses, 'Gezahlte Vorsteuer', amount);\n } else if (account.type === 'revenue') {\n addTo(income, this.label(mapping, account), amount);\n } else if (account.type === 'expense') {\n addTo(expenses, this.label(mapping, account), amount);\n }\n // R4/R5: Anlagen, Darlehen, Privat, durchlaufende Posten — neutral.\n }\n }\n\n return { income: this.serializeBucket(income), expenses: this.serializeBucket(expenses) };\n }\n\n private assertCalendarYearFiscalYears(year: number): void {\n const y = String(year).padStart(4, '0');\n const start = CalendarDate.of(`${y}-01-01`);\n const end = CalendarDate.of(`${y}-12-31`);\n\n for (const fiscalYear of this.fiscalYears.all()) {\n const overlaps = !fiscalYear.end.isBefore(start) && !fiscalYear.start.isAfter(end);\n if (!overlaps) continue;\n const isCalendarYear =\n fiscalYear.start.iso.slice(5) === '01-01' && fiscalYear.end.iso.slice(5) === '12-31';\n if (!isCalendarYear) {\n throw new DomainError(\n 'E_CASHBASIS_DEVIATING_FISCAL_YEAR',\n `Geschäftsjahr ${fiscalYear.year} (${fiscalYear.start.iso} bis ${fiscalYear.end.iso}) weicht vom Kalenderjahr ab — EÜR ist kalenderjahrgebunden`,\n { fiscalYear: fiscalYear.year },\n );\n }\n }\n }\n\n private bankFlow(entry: JournalEntry): Money {\n let flow = Money.zero(this.baseCurrency);\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n const subtype = account?.subtype ?? null;\n if (subtype !== 'bank' && subtype !== 'cash') continue;\n flow = line.side === 'debit' ? flow.add(line.money) : flow.subtract(line.money);\n }\n return flow;\n }\n\n private assignYear(entry: JournalEntry): number {\n const voucher = this.vouchers.byId(entry.voucherId);\n if (\n voucher !== null &&\n voucher.recurring &&\n voucher.economicYear !== null &&\n voucher.due !== null &&\n this.inTenDayWindow(entry.entryDate) &&\n this.inTenDayWindow(voucher.due)\n ) {\n return voucher.economicYear;\n }\n return entry.entryDate.year();\n }\n\n private inTenDayWindow(date: CalendarDate): boolean {\n const month = date.month();\n const day = Number(date.iso.slice(8, 10));\n return (month === 12 && day >= 22) || (month === 1 && day <= 10);\n }\n\n private sourceLines(entry: JournalEntry): Array<{ line: EntryLine; ratio: Big }> {\n const sourced: Array<{ line: EntryLine; ratio: Big }> = [];\n\n for (const item of this.openItems.all()) {\n for (const settlement of item.settlements()) {\n if (!settlement.entryId.equals(entry.id)) continue;\n const origin = this.journal.byId(item.originEntryId);\n if (origin === null || item.money.isZero()) continue;\n const ratio = new Big(settlement.money.amountAsString()).div(new Big(item.money.amountAsString()));\n for (const line of origin.lines()) sourced.push({ line, ratio });\n }\n }\n\n if (sourced.length > 0) return sourced;\n\n const one = new Big(1);\n for (const line of entry.lines()) sourced.push({ line, ratio: one });\n return sourced;\n }\n\n private proportional(amount: Money, ratio: Big): Money {\n if (ratio.eq(1)) return amount.abs();\n return Money.fromCalculation(new Big(amount.abs().amountAsString()).times(ratio), this.baseCurrency);\n }\n\n private label(mapping: Mapping | null, account: Account): string {\n if (mapping !== null) {\n const leaf = mapping.leafFor(account.number.value);\n if (leaf !== null) return leaf.label;\n }\n return account.name;\n }\n\n private serializeBucket(bucket: Map<string, Money>): Array<{ category: string; amount: string }> {\n const labels = [...bucket.keys()].sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));\n const rows: Array<{ category: string; amount: string }> = [];\n for (const label of labels) {\n const amount = bucket.get(label)!;\n if (amount.isZero()) continue;\n rows.push({ category: label, amount: amount.amountAsString() });\n }\n return rows;\n }\n}\n","import type { AssetRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\n\n/**\n * Anlageverzeichnis (Pflicht auch bei EÜR, § 4 Abs. 3 S. 5 EStG). Sortierung:\n * Zugangsdatum, dann ID (deterministisch).\n */\nexport class AssetRegisterProjection {\n constructor(private readonly assets: AssetRepository) {}\n\n compute(params: Record<string, unknown>): { assets: Array<Record<string, unknown>> } {\n const asOf = typeof params.asOf === 'string' ? CalendarDate.of(params.asOf) : null;\n\n const sorted = [...this.assets.all()].sort((a, b) => {\n const byDate = a.acquiredOn.compareTo(b.acquiredOn);\n return byDate !== 0 ? byDate : a.id.compareTo(b.id);\n });\n\n const rows: Array<Record<string, unknown>> = [];\n for (const asset of sorted) {\n if (asOf !== null && asset.acquiredOn.isAfter(asOf)) continue;\n const row = asset.toJSON();\n row.accumulatedDepreciation = asset.accumulatedDepreciationAt(asOf).toJSON();\n row.bookValue = asset.bookValueAt(asOf).toJSON();\n if (asset.route === 'capitalize') row.depreciationSchedule = asset.scheduleSummary();\n rows.push(row);\n }\n return { assets: rows };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalJson } from '../shared/canonical-json.js';\nimport type { Clock } from '../shared/clock.js';\nimport type { Currency } from '../shared/currency.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport type {\n AccountRepository,\n AuditTrail,\n JournalRepository,\n PartnerRepository,\n VoucherRepository,\n} from '../port.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\n\nconst FORMAT_VERSION = '0.4';\nconst LINE_FIELDS = ['accountId', 'side', 'money', 'dimensions', 'taxTag'] as const;\n\nfunction withoutNulls(row: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(row).filter(([, value]) => value !== null));\n}\n\n/**\n * GoBD-Z3-Export (SF-14): Manifest mit SHA-256-Strom-Hashes über RFC-8785-\n * kanonisierte Zeilen, Feldkatalog, Journal vollständig in sequenceNumber-\n * Reihenfolge. auditLog ist immer Teil des Exports (v0.5/F-005).\n */\nexport class JournalExportProjection {\n constructor(\n private readonly tenantId: Uuid,\n private readonly tenantName: string,\n private readonly baseCurrency: Currency,\n private readonly journal: JournalRepository,\n private readonly accounts: AccountRepository,\n private readonly vouchers: VoucherRepository,\n private readonly partners: PartnerRepository,\n private readonly audit: AuditTrail,\n private readonly clock: Clock,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : null;\n const entries = fiscalYear === null ? this.journal.all() : this.journal.forFiscalYear(fiscalYear);\n\n const streams: Record<string, unknown[]> = {\n journal: entries.map((entry) => JournalExportProjection.formatEntry(entry)),\n accounts: this.accounts.all().map((account) => withoutNulls(account.toJSON())),\n vouchers: this.vouchers.all().map((voucher) => withoutNulls(voucher.toJSON())),\n };\n if (this.partners.all().length > 0) {\n streams.partners = this.partners.all().map((partner) => partner.toJSON());\n }\n streams.auditLog = this.audit.all().map((record) => record.toJSON());\n\n const contentHashes: Record<string, string> = {};\n for (const [name, rows] of Object.entries(streams)) {\n const lines = rows.map((row) => canonicalJson(row));\n contentHashes[name] = createHash('sha256').update(lines.join('\\n')).digest('hex');\n }\n\n const allFinalized = entries.every((entry) => entry.isFinalized());\n\n return {\n manifest: {\n formatVersion: FORMAT_VERSION,\n tenantId: this.tenantId.value,\n tenantName: this.tenantName,\n baseCurrency: this.baseCurrency.code,\n exportedAt: this.clock.now().toISOString(),\n hashAlgorithm: 'sha256',\n streams: Object.keys(streams),\n contentHashes,\n },\n fieldCatalogIncluded: true,\n fieldCatalog: this.fieldCatalog(),\n journal: { entryCount: entries.length, ordering: 'sequenceNumber', allFinalized },\n data: streams,\n };\n }\n\n private static formatEntry(entry: JournalEntry): Record<string, unknown> {\n const data = entry.toJSON();\n const lines = Array.isArray(data.lines) ? data.lines : [];\n data.lines = lines.map((line) => {\n const source = line as Record<string, unknown>;\n const stripped: Record<string, unknown> = {};\n for (const field of LINE_FIELDS) stripped[field] = source[field];\n return stripped;\n });\n return data;\n }\n\n private fieldCatalog(): Record<string, Array<{ name: string; type: string; meaning: string }>> {\n return {\n journal: [\n { name: 'id', type: 'uuid', meaning: 'Eindeutige Buchungs-ID (UUIDv7)' },\n { name: 'sequenceNumber', type: 'integer', meaning: 'Lückenlose Journalnummer je Geschäftsjahr' },\n { name: 'status', type: 'string', meaning: 'entered|finalized (Festschreibung)' },\n { name: 'entryDate', type: 'date', meaning: 'Buchungsdatum (zonenlos)' },\n { name: 'recordedAt', type: 'timestamp', meaning: 'Erfassungszeitpunkt' },\n { name: 'periodRef', type: 'object', meaning: 'Geschäftsjahr + Periode' },\n { name: 'voucherId', type: 'uuid', meaning: 'Belegreferenz (Pflicht)' },\n { name: 'text', type: 'string', meaning: 'Buchungstext' },\n { name: 'lines', type: 'array', meaning: 'Positionen: Konto, Seite, Betrag, Dimensionen, Steuer-Tag' },\n { name: 'reverses', type: 'uuid|null', meaning: 'Rückverweis bei Storno (Generalumkehr)' },\n { name: 'reversedBy', type: 'uuid|null', meaning: 'Verweis auf die Stornobuchung' },\n ],\n accounts: [\n { name: 'number', type: 'string', meaning: 'Kontonummer (führende Nullen signifikant)' },\n { name: 'name', type: 'string', meaning: 'Kontobezeichnung' },\n { name: 'type', type: 'string', meaning: 'asset|liability|equity|expense|revenue' },\n { name: 'subtype', type: 'string|null', meaning: 'Kanonischer Subtyp (bank, ar, ap, …)' },\n ],\n vouchers: [\n { name: 'voucherNumber', type: 'string', meaning: 'Belegnummer' },\n { name: 'voucherDate', type: 'date', meaning: 'Belegdatum' },\n ],\n auditLog: [\n { name: 'at', type: 'timestamp', meaning: 'Änderungszeitpunkt' },\n { name: 'actor', type: 'string', meaning: 'Audit-Identität' },\n { name: 'action', type: 'string', meaning: 'created|corrected|finalized|locked|…' },\n { name: 'changes', type: 'object', meaning: 'Vorher/Nachher-Diff der geänderten Felder' },\n ],\n };\n }\n}\n","import type {\n AccountRepository,\n JournalRepository,\n PartnerRepository,\n VoucherRepository,\n} from '../port.js';\nimport type { EntryLine } from '../ledger/entry-line.js';\nimport type { JournalEntry } from '../ledger/journal-entry.js';\nimport type { TaxCodeRegistry } from '../tax/tax-code-registry.js';\n\nconst TAX_SUBTYPES = new Set(['tax_in', 'tax_out']);\n\nfunction pad2(value: number): string {\n return String(value).padStart(2, '0');\n}\nfunction tagCode(line: EntryLine): string | null {\n const code = line.taxTag?.code;\n return typeof code === 'string' ? code : null;\n}\n\n/**\n * DATEV-Export (F-IO-005): Buchungsstapel, Kontenbeschriftungen, Partner-\n * Stammdaten. Steuerzeilen werden DATEV-seitig aus dem BU-Schlüssel erzeugt und\n * deshalb in die Basiszeile gefaltet; zusammengesetzte Buchungen in Teilzeilen.\n */\nexport class DatevExportProjection {\n constructor(\n private readonly journal: JournalRepository,\n private readonly accounts: AccountRepository,\n private readonly vouchers: VoucherRepository,\n private readonly partners: PartnerRepository,\n private readonly registry: TaxCodeRegistry,\n ) {}\n\n compute(params: Record<string, unknown>): Record<string, unknown> {\n const kind = typeof params.kind === 'string' ? params.kind : 'entries';\n const rows =\n kind === 'accounts' ? this.accountRows() : kind === 'partners' ? this.partnerRows() : this.entryRows(params);\n return { kind, rows, rowCount: rows.length };\n }\n\n private entryRows(params: Record<string, unknown>): Array<Record<string, unknown>> {\n const fiscalYear = typeof params.fiscalYear === 'number' ? params.fiscalYear : null;\n const fromPeriod = typeof params.fromPeriod === 'number' ? params.fromPeriod : 1;\n const throughPeriod = typeof params.throughPeriod === 'number' ? params.throughPeriod : Number.MAX_SAFE_INTEGER;\n\n const entries = fiscalYear === null ? this.journal.all() : this.journal.forFiscalYear(fiscalYear);\n const rows: Array<Record<string, unknown>> = [];\n for (const entry of entries) {\n const period = entry.periodRef.period;\n if (period < fromPeriod || period > throughPeriod) continue;\n rows.push(...this.splitEntry(entry));\n }\n return rows;\n }\n\n private splitEntry(entry: JournalEntry): Array<Record<string, unknown>> {\n let lead: EntryLine | null = null;\n const contraLines: EntryLine[] = [];\n const taxLines: EntryLine[] = [];\n\n for (const line of entry.lines()) {\n const account = this.accounts.byId(line.accountId);\n const isTaxLine =\n account?.subtype != null && TAX_SUBTYPES.has(account.subtype) && line.taxTag !== null;\n if (isTaxLine) {\n taxLines.push(line);\n continue;\n }\n if (lead === null && line.taxTag === null) {\n lead = line;\n continue;\n }\n contraLines.push(line);\n }\n\n if (lead === null || contraLines.length === 0) return [];\n\n const voucher = this.vouchers.byId(entry.voucherId);\n const rows: Array<Record<string, unknown>> = [];\n\n for (const contra of contraLines) {\n let gross = contra.money;\n let buKey: string | null = null;\n const contraCode = tagCode(contra);\n if (contraCode !== null) {\n buKey = this.registry.datevBuFor(contraCode);\n for (const taxLine of taxLines) {\n if (tagCode(taxLine) === contraCode) gross = gross.add(taxLine.money);\n }\n }\n\n rows.push({\n amount: gross.abs().amountAsString(),\n debitCredit: lead.side === 'debit' ? 'S' : 'H',\n account: lead.account.value,\n contraAccount: contra.account.value,\n buKey,\n documentField1: voucher === null ? '' : voucher.voucherNumber,\n date: `${pad2(entry.entryDate.month())}${pad2(Number(entry.entryDate.iso.slice(8, 10)))}`,\n text: entry.text(),\n finalized: entry.isFinalized(),\n });\n }\n return rows;\n }\n\n private accountRows(): Array<Record<string, unknown>> {\n return this.accounts.all().map((account) => ({\n number: account.number.value,\n name: account.name,\n type: account.type,\n }));\n }\n\n private partnerRows(): Array<Record<string, unknown>> {\n return this.partners.all().map((partner) => partner.toJSON());\n }\n}\n","import { Mapping } from './mapping.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Geladene Mappings eines Mandanten (mutierbar über importMapping). */\nexport class MappingRegistry {\n private readonly byIdMap = new Map<string, Mapping>();\n\n static empty(): MappingRegistry {\n return new MappingRegistry();\n }\n\n static fromRuleModules(raw: unknown[]): MappingRegistry {\n const registry = new MappingRegistry();\n for (const mappingData of raw) {\n if (isRecord(mappingData)) registry.add(Mapping.fromData(mappingData));\n }\n return registry;\n }\n\n add(mapping: Mapping): void {\n this.byIdMap.set(mapping.id, mapping);\n }\n\n byId(id: string): Mapping | null {\n return this.byIdMap.get(id) ?? null;\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { AccountRepository } from '../port.js';\nimport { isBalanceCarrying } from '../ledger/types.js';\nimport { leafMatches, Mapping } from './mapping.js';\nimport type { MappingRegistry } from './mapping-registry.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Mapping-Import (api.md): Überlappung → E_MAPPING_OVERLAP; Lücken sind kein\n * Fehler, sondern gapWarnings[] mit Auffangposition `_unassigned`. Geprüft gegen\n * die real existierenden Konten je Mapping-Art.\n */\nexport class MappingImporter {\n constructor(\n private readonly accounts: AccountRepository,\n private readonly registry: MappingRegistry,\n ) {}\n\n import(input: Record<string, unknown>): Record<string, unknown> {\n const data = isRecord(input.mapping) ? input.mapping : {};\n const mapping = Mapping.fromData(data);\n const gapWarnings: Array<{ account: string; assignedTo: string }> = [];\n\n for (const account of this.relevantAccounts(mapping.kind)) {\n const matches = mapping.leaves\n .filter((leaf) => leafMatches(leaf, account.number.value))\n .map((leaf) => leaf.key);\n\n if (matches.length > 1) {\n throw new DomainError(\n 'E_MAPPING_OVERLAP',\n `Konto ${account.number.value} fällt in mehrere Positionen: ${matches.join(', ')}`,\n { account: account.number.value, positions: matches },\n );\n }\n if (matches.length === 0) {\n gapWarnings.push({ account: account.number.value, assignedTo: '_unassigned' });\n }\n }\n\n this.registry.add(mapping);\n\n return { imported: true, id: mapping.id, kind: mapping.kind, gapWarnings };\n }\n\n private relevantAccounts(kind: string) {\n return this.accounts.all().filter((account) => {\n if (kind === 'balance-sheet') return isBalanceCarrying(account.type);\n if (kind === 'income-statement') return !isBalanceCarrying(account.type);\n return false; // z. B. cash-basis-categories: bewusst partiell\n });\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport type { CalendarDate } from '../shared/calendar-date.js';\nimport type { TaxCodeVersion } from './tax-code-version.js';\n\n/**\n * Steuerschlüssel (tax-modell.md Aggregat 1): gebündelter Steuersachverhalt als\n * Liste von Regelversionen. Versionswahl folgt dem Belegdatum.\n */\nexport class TaxCode {\n constructor(\n readonly code: string,\n readonly versions: TaxCodeVersion[],\n readonly datevBu: string | null = null,\n ) {}\n\n versionFor(date: CalendarDate): TaxCodeVersion {\n for (const version of this.versions) {\n if (version.coversDate(date)) return version;\n }\n throw new DomainError(\n 'E_TAXCODE_NO_VALID_VERSION',\n `Steuerschlüssel ${this.code} hat keine zum ${date.iso} gültige Regelversion`,\n { code: this.code, date: date.iso },\n );\n }\n}\n","import type { CalendarDate } from '../shared/calendar-date.js';\n\n/**\n * Regelversion eines Steuerschlüssels mit Gültigkeitszeitraum. Inhalte sind\n * Regelmodul-Daten — Code zitiert kein Gesetz. mechanism `reverse_charge`:\n * USt- und VSt-Position gleichzeitig; `intra_community_supply`: steuerfrei.\n */\nexport class TaxCodeVersion {\n constructor(\n readonly validFrom: CalendarDate,\n readonly validTo: CalendarDate | null,\n readonly rate: string,\n readonly taxAccount: string,\n readonly reportingKey: string | null,\n readonly mechanism: string = 'standard',\n readonly inputTaxAccount: string | null = null,\n readonly inputReportingKey: string | null = null,\n readonly baseReportingKey: string | null = null,\n ) {}\n\n coversDate(date: CalendarDate): boolean {\n if (date.isBefore(this.validFrom)) return false;\n return this.validTo === null || !date.isAfter(this.validTo);\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport { TaxCode } from './tax-code.js';\nimport { TaxCodeVersion } from './tax-code-version.js';\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/** Geladene, validierte Form der Steuerschlüssel-Regelmodul-Daten. */\nexport class TaxCodeRegistry {\n private constructor(private readonly codes: ReadonlyMap<string, TaxCode>) {}\n\n static empty(): TaxCodeRegistry {\n return new TaxCodeRegistry(new Map());\n }\n\n static fromData(data: Array<Record<string, unknown>>): TaxCodeRegistry {\n const codes = new Map<string, TaxCode>();\n\n for (const codeData of data) {\n const code = asString(codeData.code) ?? '';\n const rawVersions = Array.isArray(codeData.versions) ? codeData.versions : [];\n const versions: TaxCodeVersion[] = [];\n\n for (const versionData of rawVersions) {\n if (versionData === null || typeof versionData !== 'object') continue;\n const v = versionData as Record<string, unknown>;\n versions.push(\n new TaxCodeVersion(\n CalendarDate.of(asString(v.validFrom) ?? ''),\n typeof v.validTo === 'string' ? CalendarDate.of(v.validTo) : null,\n asString(v.rate) ?? '0',\n asString(v.taxAccount) ?? '',\n asString(v.reportingKey),\n asString(v.mechanism) ?? 'standard',\n asString(v.inputTaxAccount),\n asString(v.inputReportingKey),\n asString(v.baseReportingKey),\n ),\n );\n }\n\n codes.set(code, new TaxCode(code, versions, asString(codeData.datevBu)));\n }\n\n return new TaxCodeRegistry(codes);\n }\n\n allVersions(): TaxCodeVersion[] {\n const versions: TaxCodeVersion[] = [];\n for (const code of this.codes.values()) versions.push(...code.versions);\n return versions;\n }\n\n datevBuFor(code: string): string | null {\n return this.codes.get(code)?.datevBu ?? null;\n }\n\n get(code: string): TaxCode {\n const found = this.codes.get(code);\n if (found === undefined) {\n throw new DomainError('E_TAXCODE_UNKNOWN', `Steuerschlüssel \"${code}\" ist nicht definiert`, { code });\n }\n return found;\n }\n\n versionFor(code: string, date: CalendarDate): TaxCodeVersion {\n return this.get(code).versionFor(date);\n }\n}\n","import { CalendarDate } from '../shared/calendar-date.js';\n\ninterface Segment {\n validFrom: CalendarDate;\n value: boolean;\n}\n\n/**\n * Steuerliches Mandantenprofil (tax-modell.md Aggregat 2): Versteuerungsart,\n * Kleinunternehmer-Status mit Gültigkeitszeitraum (unterjähriger Wechsel,\n * SF-11), Voranmeldungszeitraum.\n */\nexport class TaxProfile {\n private constructor(\n private readonly method: string,\n private smallBusiness: Segment[],\n private readonly period: string,\n ) {}\n\n static fromData(data: Record<string, unknown>): TaxProfile {\n const method = data.taxationMethod === 'cash' ? 'cash' : 'accrual';\n const period = data.vatPeriod === 'monthly' ? 'monthly' : 'quarterly';\n\n const segments: Segment[] = [];\n const smallBusiness = data.smallBusiness ?? false;\n if (typeof smallBusiness === 'boolean') {\n if (smallBusiness) segments.push({ validFrom: CalendarDate.of('0001-01-01'), value: true });\n } else if (Array.isArray(smallBusiness)) {\n for (const segment of smallBusiness) {\n if (segment === null || typeof segment !== 'object') continue;\n const s = segment as Record<string, unknown>;\n if (typeof s.validFrom !== 'string') continue;\n segments.push({ validFrom: CalendarDate.of(s.validFrom), value: s.value === true });\n }\n }\n\n return new TaxProfile(method, TaxProfile.sorted(segments), period);\n }\n\n static default(): TaxProfile {\n return new TaxProfile('accrual', [], 'quarterly');\n }\n\n taxationMethod(): string {\n return this.method;\n }\n\n isCashBasis(): boolean {\n return this.method === 'cash';\n }\n\n vatPeriod(): string {\n return this.period;\n }\n\n smallBusinessAt(date: CalendarDate): boolean {\n let value = false;\n for (const segment of this.smallBusiness) {\n if (segment.validFrom.isAfter(date)) break;\n value = segment.value;\n }\n return value;\n }\n\n setSmallBusiness(validFrom: CalendarDate, value: boolean): void {\n const segments = this.smallBusiness.filter((segment) => !segment.validFrom.equals(validFrom));\n segments.push({ validFrom, value });\n this.smallBusiness = TaxProfile.sorted(segments);\n }\n\n private static sorted(segments: Segment[]): Segment[] {\n return [...segments].sort((a, b) => a.validFrom.compareTo(b.validFrom));\n }\n\n toJSON(): Record<string, unknown> {\n return {\n taxationMethod: this.method,\n vatPeriod: this.period,\n smallBusiness: this.smallBusiness.map((segment) => ({\n validFrom: segment.validFrom.iso,\n value: segment.value,\n })),\n };\n }\n}\n","import Big from 'big.js';\nimport { DomainError } from '../domain-error.js';\nimport type { JournalRepository } from '../port.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Currency } from '../shared/currency.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport { Money } from '../shared/money.js';\nimport type { TaxCodeRegistry } from './tax-code-registry.js';\nimport type { TaxCodeVersion } from './tax-code-version.js';\nimport type { TaxProfile } from './tax-profile.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\ninterface NetLine {\n account: string;\n money: Money;\n code: string;\n}\n\n/**\n * Steuerexpansion (tax-modell.md): side-effect-free. Determinismus (§2):\n * USt pro Beleg je Steuersatz — Netto-Summe je Schlüssel, Steuer berechnen,\n * EINMAL half-up runden. Versionswahl nach Leistungs-/Belegdatum.\n * Kleinunternehmer (§ 19): keine Steuerpositionen, Brutto = Netto.\n */\nexport class TaxService {\n constructor(\n private readonly baseCurrency: Currency,\n private readonly registry: TaxCodeRegistry,\n private readonly profileValue: TaxProfile,\n private readonly journal: JournalRepository,\n ) {}\n\n profile(): TaxProfile {\n return this.profileValue;\n }\n\n registryHandle(): TaxCodeRegistry {\n return this.registry;\n }\n\n expand(input: Record<string, unknown>): Record<string, unknown> {\n // v0.4 (§ 27): Regelversion folgt dem Leistungsdatum, Fallback Belegdatum.\n const date =\n typeof input.serviceDate === 'string'\n ? this.parseDate(input.serviceDate)\n : this.parseDate(input.date);\n const direction = input.direction === 'input' ? 'input' : 'output';\n const defaultCode = asString(input.taxCode);\n\n const rawLines = Array.isArray(input.netLines) ? input.netLines : [];\n if (rawLines.length === 0) {\n throw new DomainError('E_ENTRY_TOO_FEW_LINES', 'expandTax ohne Netto-Positionen');\n }\n\n const netLines: NetLine[] = rawLines.map((rawLine) => {\n if (!isRecord(rawLine)) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', 'Netto-Position ist keine Struktur');\n }\n const code = asString(rawLine.taxCode) ?? defaultCode;\n if (code === null) {\n throw new DomainError('E_TAXCODE_UNKNOWN', 'Position ohne Steuerschlüssel (kein Default gesetzt)');\n }\n return { account: asString(rawLine.account) ?? '', money: this.parseMoney(rawLine.money), code };\n });\n\n // Referenzprüfung vollständig vor Berechnung (Reihenfolge-unabhängig).\n for (const line of netLines) this.registry.get(line.code);\n\n const versions = new Map<string, TaxCodeVersion>();\n const bases = new Map<string, Money>();\n for (const line of netLines) {\n if (!versions.has(line.code)) versions.set(line.code, this.registry.versionFor(line.code, date));\n bases.set(line.code, (bases.get(line.code) ?? Money.zero(this.baseCurrency)).add(line.money));\n }\n\n let netTotal = Money.zero(this.baseCurrency);\n for (const line of netLines) netTotal = netTotal.add(line.money);\n\n const sideFor = direction === 'output' ? 'credit' : 'debit';\n\n if (this.profileValue.smallBusinessAt(date)) {\n return {\n netLines: netLines.map((line) => ({\n account: line.account,\n side: sideFor,\n money: line.money.toJSON(),\n taxTag: null,\n })),\n taxLines: [],\n grossTotal: netTotal.toJSON(),\n };\n }\n\n // Gruppen deterministisch nach Steuerkonto sortieren (Codepoints).\n const codes = [...bases.keys()].sort((a, b) => {\n const aa = versions.get(a)!.taxAccount;\n const bb = versions.get(b)!.taxAccount;\n return aa < bb ? -1 : aa > bb ? 1 : 0;\n });\n\n const taxLines: Array<Record<string, unknown>> = [];\n let grossTotal = netTotal;\n const baseTags = new Map<string, Record<string, unknown>>();\n\n for (const code of codes) {\n const version = versions.get(code)!;\n const base = bases.get(code)!;\n const tax = Money.fromCalculation(\n new Big(base.amountAsString()).times(version.rate).div(100),\n this.baseCurrency,\n );\n\n if (version.mechanism === 'intra_community_supply') {\n baseTags.set(code, this.tag(code, version, version.reportingKey, base));\n continue;\n }\n\n if (version.mechanism === 'reverse_charge') {\n taxLines.push({\n account: version.taxAccount,\n side: 'credit',\n money: tax.toJSON(),\n taxTag: this.tag(code, version, version.reportingKey, base),\n });\n taxLines.push({\n account: version.inputTaxAccount ?? version.taxAccount,\n side: 'debit',\n money: tax.toJSON(),\n taxTag: this.tag(code, version, version.inputReportingKey, base),\n });\n baseTags.set(code, this.tag(code, version, version.baseReportingKey ?? version.reportingKey, base));\n } else {\n taxLines.push({\n account: version.taxAccount,\n side: sideFor,\n money: tax.toJSON(),\n taxTag: this.tag(code, version, version.reportingKey, base),\n });\n baseTags.set(code, this.tag(code, version, version.reportingKey, base));\n grossTotal = grossTotal.add(tax);\n }\n }\n\n return {\n netLines: netLines.map((line) => ({\n account: line.account,\n side: sideFor,\n money: line.money.toJSON(),\n taxTag: baseTags.get(line.code) ?? null,\n })),\n taxLines,\n grossTotal: grossTotal.toJSON(),\n };\n }\n\n setProfile(input: Record<string, unknown>): TaxProfile {\n const smallBusiness = input.smallBusiness;\n if (!isRecord(smallBusiness) || typeof smallBusiness.validFrom !== 'string') {\n throw new DomainError('E_PROFILE_RETROACTIVE_CONFLICT', 'setTaxProfile braucht smallBusiness.validFrom');\n }\n const validFrom = this.parseDate(smallBusiness.validFrom);\n\n for (const entry of this.journal.all()) {\n if (entry.isFinalized() && !entry.entryDate.isBefore(validFrom)) {\n throw new DomainError(\n 'E_PROFILE_RETROACTIVE_CONFLICT',\n `Zeitraum ab ${validFrom.iso} enthält festgeschriebene Buchungen (z. B. Nr. ${entry.sequenceNumber})`,\n { validFrom: validFrom.iso, sequenceNumber: entry.sequenceNumber },\n );\n }\n }\n\n this.profileValue.setSmallBusiness(validFrom, smallBusiness.value === true);\n return this.profileValue;\n }\n\n private tag(\n code: string,\n version: TaxCodeVersion,\n reportingKey: string | null,\n base: Money,\n ): Record<string, unknown> {\n return {\n code,\n appliedVersion: version.validFrom.iso,\n reportingKey,\n baseMoney: base.toJSON(),\n };\n }\n\n private parseDate(date: unknown): CalendarDate {\n try {\n return CalendarDate.of(typeof date === 'string' ? date : '');\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_TAXCODE_NO_VALID_VERSION', 'Belegdatum fehlt oder ungültig');\n }\n throw error;\n }\n }\n\n private parseMoney(raw: unknown): Money {\n const amount = isRecord(raw) ? asString(raw.amount) : null;\n if (amount === null) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', 'Netto-Position ohne Betrag');\n }\n try {\n return Money.of(amount, this.baseCurrency);\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_ENTRY_INVALID_AMOUNT', `Ungültiger Betrag \"${amount}\"`);\n }\n throw error;\n }\n }\n}\n","import { AssetService } from '../assets/asset-service.js';\nimport { CostingService } from '../costing/costing-service.js';\nimport {\n InMemoryAccountRepository,\n InMemoryAssetRepository,\n InMemoryAuditTrail,\n InMemoryFiscalYearRepository,\n InMemoryJournalRepository,\n InMemoryOpenItemRepository,\n InMemoryPartnerRepository,\n InMemoryVoucherRepository,\n} from '../in-memory.js';\nimport { PartnerService } from '../partner/partner-service.js';\nimport { DimensionRegistry } from '../ledger/dimension-registry.js';\nimport { Ledger } from '../ledger/ledger.js';\nimport { MappingRegistry } from '../mapping/mapping-registry.js';\nimport { TaxCodeRegistry } from '../tax/tax-code-registry.js';\nimport { TaxProfile } from '../tax/tax-profile.js';\nimport { TaxService } from '../tax/tax-service.js';\nimport type {\n AccountRepository,\n AssetRepository,\n AuditTrail,\n FiscalYearRepository,\n JournalRepository,\n OpenItemRepository,\n PartnerRepository,\n VoucherRepository,\n} from '../port.js';\nimport { type Clock, SystemClock } from '../shared/clock.js';\nimport type { Currency } from '../shared/currency.js';\nimport { type IdGenerator, UuidV7IdGenerator } from '../shared/id-generator.js';\nimport type { Uuid } from '../shared/uuid.js';\n\n/**\n * Mandant: buchführende Einheit, oberste Datengrenze (Glossar `tenant`). Bündelt\n * Ports + Services einer Instanz. Wächst mit den Slices (Tax/Partner/Asset/\n * Costing folgen); der Adapter ersetzt nur die Ports.\n */\nexport class Tenant {\n constructor(\n readonly id: Uuid,\n readonly name: string,\n readonly baseCurrency: Currency,\n readonly accounts: AccountRepository,\n readonly fiscalYears: FiscalYearRepository,\n readonly vouchers: VoucherRepository,\n readonly journal: JournalRepository,\n readonly openItems: OpenItemRepository,\n readonly assets: AssetRepository,\n readonly partners: PartnerRepository,\n readonly audit: AuditTrail,\n readonly ledger: Ledger,\n readonly tax: TaxService,\n readonly assetService: AssetService,\n readonly costing: CostingService,\n readonly partnerService: PartnerService,\n readonly mappings: MappingRegistry,\n readonly clock: Clock,\n readonly ids: IdGenerator,\n ) {}\n\n static inMemory(\n name: string,\n baseCurrency: Currency,\n clock: Clock = new SystemClock(),\n ids?: IdGenerator,\n dimensions: DimensionRegistry = DimensionRegistry.empty(),\n taxCodes: TaxCodeRegistry = TaxCodeRegistry.empty(),\n taxProfile: TaxProfile = TaxProfile.default(),\n mappings: MappingRegistry = MappingRegistry.empty(),\n ): Tenant {\n const idGen = ids ?? new UuidV7IdGenerator(clock);\n return Tenant.fromPorts(\n idGen.next(), // Mandanten-ID = erste generierte ID (Determinismus)\n name,\n baseCurrency,\n {\n accounts: new InMemoryAccountRepository(),\n fiscalYears: new InMemoryFiscalYearRepository(),\n vouchers: new InMemoryVoucherRepository(),\n journal: new InMemoryJournalRepository(),\n openItems: new InMemoryOpenItemRepository(),\n assets: new InMemoryAssetRepository(),\n partners: new InMemoryPartnerRepository(),\n audit: new InMemoryAuditTrail(),\n },\n clock,\n idGen,\n dimensions,\n taxCodes,\n taxProfile,\n mappings,\n );\n }\n\n /**\n * Mandant aus beliebigen Ports bauen (Service-Verdrahtung bleibt hier im Kern).\n * `inMemory` nutzt das mit In-Memory-Ports; der Persistenz-Adapter\n * (`@superheld/summae-knex`) reicht DB-gestützte Ports herein — derselbe\n * `Tenant`, nur andere Ports.\n */\n static fromPorts(\n tenantId: Uuid,\n name: string,\n baseCurrency: Currency,\n ports: {\n accounts: AccountRepository;\n fiscalYears: FiscalYearRepository;\n vouchers: VoucherRepository;\n journal: JournalRepository;\n openItems: OpenItemRepository;\n assets: AssetRepository;\n partners: PartnerRepository;\n audit: AuditTrail;\n },\n clock: Clock,\n ids: IdGenerator,\n dimensions: DimensionRegistry = DimensionRegistry.empty(),\n taxCodes: TaxCodeRegistry = TaxCodeRegistry.empty(),\n taxProfile: TaxProfile = TaxProfile.default(),\n mappings: MappingRegistry = MappingRegistry.empty(),\n ): Tenant {\n const { accounts, fiscalYears, vouchers, journal, openItems, assets, partners, audit } = ports;\n const ledger = new Ledger(\n baseCurrency,\n accounts,\n fiscalYears,\n vouchers,\n journal,\n openItems,\n audit,\n dimensions,\n clock,\n ids,\n );\n const tax = new TaxService(baseCurrency, taxCodes, taxProfile, journal);\n const assetService = new AssetService(baseCurrency, assets, fiscalYears, vouchers, ledger, ids);\n const costing = new CostingService(baseCurrency, accounts, journal, ids);\n const partnerService = new PartnerService(partners, audit, clock, ids);\n\n return new Tenant(\n tenantId,\n name,\n baseCurrency,\n accounts,\n fiscalYears,\n vouchers,\n journal,\n openItems,\n assets,\n partners,\n audit,\n ledger,\n tax,\n assetService,\n costing,\n partnerService,\n mappings,\n clock,\n ids,\n );\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport { InvalidValue } from '../shared/errors.js';\nimport type { Uuid } from '../shared/uuid.js';\nimport { Voucher } from '../ledger/voucher.js';\nimport type { Tenant } from './tenant.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * Anwendungsschicht-Komposition `postVoucher` (api.md, Teil der Spec): SF-02/03\n * in einem Aufruf — Beleg anlegen, expandTax, post, OP-Anlage.\n */\nexport class PostVoucherService {\n constructor(private readonly tenant: Tenant) {}\n\n post(input: Record<string, unknown>): Record<string, unknown> {\n const voucherData = isRecord(input.voucher) ? input.voucher : {};\n const voucherNumber = asString(voucherData.voucherNumber) ?? '';\n\n let voucherDate: CalendarDate;\n try {\n voucherDate = CalendarDate.of(asString(voucherData.voucherDate) ?? '');\n } catch (error) {\n if (error instanceof InvalidValue) {\n throw new DomainError('E_ENTRY_NO_VOUCHER', 'postVoucher braucht voucher.voucherDate');\n }\n throw error;\n }\n\n // v0.4: Partner muss existieren, bevor irgendetwas entsteht.\n let partnerId: Uuid | null = null;\n if (voucherData.partnerId !== undefined && voucherData.partnerId !== null) {\n partnerId = this.tenant.partnerService.require(voucherData.partnerId).id;\n }\n\n const date = (value: unknown): CalendarDate | null =>\n typeof value === 'string' ? CalendarDate.of(value) : null;\n const servicePeriod = isRecord(voucherData.servicePeriod) ? voucherData.servicePeriod : {};\n\n const voucher = new Voucher({\n id: this.tenant.ids.next(),\n voucherNumber,\n voucherDate,\n due: date(voucherData.due),\n recurring: voucherData.recurring === true,\n economicYear: typeof voucherData.economicYear === 'number' ? voucherData.economicYear : null,\n serviceDate: date(voucherData.serviceDate),\n servicePeriodFrom: date(servicePeriod.from),\n servicePeriodTo: date(servicePeriod.to),\n kind: asString(voucherData.kind),\n partnerId,\n issuer: asString(voucherData.issuer),\n });\n this.tenant.vouchers.add(voucher);\n\n const expansion = this.tenant.tax.expand({\n date: voucherDate.iso,\n serviceDate: voucher.taxDate().iso,\n taxCode: input.taxCode ?? null,\n direction: input.direction ?? 'output',\n netLines: input.netLines ?? [],\n });\n\n const direction = input.direction === 'input' ? 'input' : 'output';\n const counterAccount = asString(input.counterAccount) ?? '';\n const netLines = Array.isArray(expansion.netLines) ? expansion.netLines : [];\n const taxLines = Array.isArray(expansion.taxLines) ? expansion.taxLines : [];\n\n const lines: Array<Record<string, unknown>> = [\n {\n account: counterAccount,\n side: direction === 'output' ? 'debit' : 'credit',\n money: expansion.grossTotal,\n },\n ...netLines,\n ...taxLines,\n ];\n\n const result = this.tenant.ledger.post({\n actor: input.actor ?? null,\n entryDate: input.entryDate ?? voucherDate.iso,\n voucherId: voucher.id.value,\n text: input.text ?? '',\n lines,\n });\n\n return {\n entry: JSON.parse(JSON.stringify(result.entry)) as Record<string, unknown>,\n openItemsCreated: result.openItemsCreated.map((item) => JSON.parse(JSON.stringify(item)) as unknown),\n grossTotal: expansion.grossTotal,\n taxLines: expansion.taxLines,\n voucherId: voucher.id.value,\n };\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { AssetRegisterProjection } from '../projection/asset-register.js';\nimport { MappingImporter } from '../mapping/mapping-importer.js';\nimport { AccountSheetProjection } from '../projection/account-sheet.js';\nimport { AuditLogProjection } from '../projection/audit-log.js';\nimport { BalanceSheetProjection } from '../projection/balance-sheet.js';\nimport { CashBasisProjection } from '../projection/cash-basis.js';\nimport { DatevExportProjection } from '../projection/datev-export.js';\nimport { JournalExportProjection } from '../projection/journal-export.js';\nimport { IncomeStatementProjection } from '../projection/income-statement.js';\nimport { EcSalesListProjection } from '../projection/ec-sales-list.js';\nimport { OpenItemsProjection } from '../projection/open-items.js';\nimport { TrialBalanceProjection } from '../projection/trial-balance.js';\nimport { VatReturnProjection } from '../projection/vat-return.js';\nimport { PostVoucherService } from './post-voucher-service.js';\nimport type { Tenant } from './tenant.js';\n\n/** Plain-JSON-Serialisierung über toJSON() (wie PHPs json_encode/decode). */\nfunction serialize(value: unknown): Record<string, unknown> {\n return JSON.parse(JSON.stringify(value)) as Record<string, unknown>;\n}\n\n/**\n * Generischer Einstieg in alle Operationen und Projektionen eines Mandanten —\n * die Schnittstelle für CLI und Konformitäts-Runner. Namen exakt nach api.md.\n * Wächst mit den Slices; Unimplementiertes meldet E_NOT_IMPLEMENTED.\n */\nexport class TenantOperations {\n constructor(private readonly tenant: Tenant) {}\n\n execute(op: string, input: Record<string, unknown>): Record<string, unknown> {\n const ledger = this.tenant.ledger;\n\n switch (op) {\n case 'expandTax':\n return this.tenant.tax.expand(input);\n case 'setTaxProfile':\n return serialize(this.tenant.tax.setProfile(input));\n case 'postVoucher':\n return new PostVoucherService(this.tenant).post(input);\n case 'post': {\n const result = ledger.post(input);\n return {\n ...serialize(result.entry),\n openItemsCreated: result.openItemsCreated.map((item) => serialize(item)),\n };\n }\n case 'correct':\n return serialize(ledger.correct(input));\n case 'settle':\n return { openItems: ledger.settle(input).map((item) => serialize(item)) };\n case 'finalize':\n return { finalizedCount: ledger.finalize(input) };\n case 'reverse':\n return serialize(ledger.reverse(input));\n case 'closePeriod':\n return ledger.closePeriod(input);\n case 'reopenPeriod':\n return ledger.reopenPeriod(input);\n case 'closeFiscalYear':\n return { fiscalYear: ledger.closeFiscalYear(input).year, status: 'closed' };\n case 'createAccount':\n return serialize(ledger.createAccount(input));\n case 'createFiscalYear': {\n const fiscalYear = ledger.createFiscalYear(input);\n return { year: fiscalYear.year, periodCount: fiscalYear.periods().length };\n }\n case 'lockAccount':\n return serialize(ledger.lockAccount(input));\n case 'importChartOfAccounts':\n return { importedCount: ledger.importChartOfAccounts(input) };\n case 'importMapping':\n return new MappingImporter(this.tenant.accounts, this.tenant.mappings).import(input);\n case 'createPartner':\n return serialize(this.tenant.partnerService.create(input));\n case 'updatePartner':\n return serialize(this.tenant.partnerService.update(input));\n case 'acquireAsset':\n return this.tenant.assetService.acquire(input);\n case 'disposeAsset':\n return this.tenant.assetService.dispose(input);\n case 'runDepreciation':\n return this.tenant.assetService.runDepreciation(input);\n case 'setAllocationScheme':\n return this.tenant.costing.setAllocationScheme(input);\n case 'runCosting': {\n const run = this.tenant.costing.run(input);\n return { runId: run.id.value, status: run.status(), version: run.version };\n }\n case 'releaseCosting': {\n const released = this.tenant.costing.release(input);\n return { runId: released.id.value, status: released.status() };\n }\n default:\n throw new DomainError('E_NOT_IMPLEMENTED', `Operation \"${op}\" ist nicht definiert`);\n }\n }\n\n project(name: string, params: Record<string, unknown>): Record<string, unknown> {\n const tenant = this.tenant;\n\n switch (name) {\n case 'trialBalance':\n return new TrialBalanceProjection(tenant.baseCurrency, tenant.accounts, tenant.journal).compute(params);\n case 'openItems':\n return new OpenItemsProjection(tenant.openItems, tenant.vouchers, tenant.journal).compute(params);\n case 'accountSheet':\n return new AccountSheetProjection(tenant.baseCurrency, tenant.accounts, tenant.journal).compute(params);\n case 'auditLog':\n return new AuditLogProjection(tenant.audit).compute(params);\n case 'assetRegister':\n return new AssetRegisterProjection(tenant.assets).compute(params);\n case 'costAllocationSheet':\n return tenant.costing.costAllocationSheet(params);\n case 'ecSalesList':\n return new EcSalesListProjection(\n tenant.baseCurrency,\n tenant.journal,\n tenant.vouchers,\n tenant.partners,\n tenant.tax.registryHandle(),\n ).compute(params);\n case 'incomeStatement':\n return new IncomeStatementProjection(\n tenant.baseCurrency,\n tenant.accounts,\n tenant.journal,\n tenant.mappings,\n ).compute(params);\n case 'balanceSheet':\n return new BalanceSheetProjection(\n tenant.baseCurrency,\n tenant.accounts,\n tenant.journal,\n tenant.mappings,\n ).compute(params);\n case 'vatReturn':\n return new VatReturnProjection(\n tenant.baseCurrency,\n tenant.journal,\n tenant.openItems,\n tenant.vouchers,\n tenant.accounts,\n tenant.tax.registryHandle(),\n tenant.tax.profile(),\n ).compute(params);\n case 'cashBasisReport':\n return new CashBasisProjection(\n tenant.baseCurrency,\n tenant.accounts,\n tenant.journal,\n tenant.openItems,\n tenant.vouchers,\n tenant.fiscalYears,\n tenant.mappings,\n ).compute(params);\n case 'journalExport':\n return new JournalExportProjection(\n tenant.id,\n tenant.name,\n tenant.baseCurrency,\n tenant.journal,\n tenant.accounts,\n tenant.vouchers,\n tenant.partners,\n tenant.audit,\n tenant.clock,\n ).compute(params);\n case 'datevExport':\n return new DatevExportProjection(\n tenant.journal,\n tenant.accounts,\n tenant.vouchers,\n tenant.partners,\n tenant.tax.registryHandle(),\n ).compute(params);\n default:\n throw new DomainError('E_NOT_IMPLEMENTED', `Projektion \"${name}\" ist nicht definiert`);\n }\n }\n}\n","import { DomainError } from '../domain-error.js';\nimport { Account } from '../ledger/account.js';\nimport { FiscalYear } from '../ledger/fiscal-year.js';\nimport { isAccountType } from '../ledger/types.js';\nimport { AccountNumber } from '../shared/account-number.js';\nimport { CalendarDate } from '../shared/calendar-date.js';\nimport type { Clock } from '../shared/clock.js';\nimport { Currency } from '../shared/currency.js';\nimport type { IdGenerator } from '../shared/id-generator.js';\nimport { TaxCodeRegistry } from '../tax/tax-code-registry.js';\nimport { TaxProfile } from '../tax/tax-profile.js';\nimport { Tenant } from './tenant.js';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\n/**\n * `createTenant` (SF-01): Mandant per Profil anlegen — sofort buchbar. Profile\n * sind versionierte Regelmodul-Daten; der Mandant pinnt die Version.\n */\nexport class TenantFactory {\n constructor(\n private readonly ruleModules: Record<string, unknown>,\n private readonly clock: Clock,\n private readonly ids: IdGenerator,\n ) {}\n\n create(input: Record<string, unknown>): { tenant: Tenant; result: Record<string, unknown> } {\n const profileId = asString(input.profile) ?? '';\n const profile = this.findById('profiles', profileId);\n if (profile === null) {\n throw new DomainError('E_PROFILE_UNKNOWN', `Profil \"${profileId}\" ist nicht vorhanden`);\n }\n\n const coaId = asString(profile.chartOfAccounts) ?? '';\n const coa = this.findById('chartsOfAccounts', coaId);\n if (coa === null) {\n throw new DomainError('E_PROFILE_UNKNOWN', `Kontenrahmen \"${coaId}\" des Profils fehlt`);\n }\n\n const wantedCodes = Array.isArray(profile.taxCodes) ? profile.taxCodes : [];\n const allTaxCodes = Array.isArray(this.ruleModules.taxCodes) ? this.ruleModules.taxCodes : [];\n const taxCodeData = allTaxCodes.filter(\n (code): code is Record<string, unknown> => isRecord(code) && wantedCodes.includes(code.code),\n );\n\n const defaults = isRecord(profile.defaults) ? profile.defaults : {};\n const taxProfile = TaxProfile.fromData(defaults);\n\n const tenant = Tenant.inMemory(\n asString(input.name) ?? 'Tenant',\n Currency.of(asString(input.baseCurrency) ?? 'EUR'),\n this.clock,\n this.ids,\n undefined,\n TaxCodeRegistry.fromData(taxCodeData),\n taxProfile,\n );\n\n let accountCount = 0;\n for (const accountData of Array.isArray(coa.accounts) ? coa.accounts : []) {\n if (!isRecord(accountData)) continue;\n const type = accountData.type;\n if (!isAccountType(type)) continue;\n tenant.accounts.add(\n new Account(\n tenant.ids.next(),\n AccountNumber.of(asString(accountData.number) ?? ''),\n asString(accountData.name) ?? '',\n type,\n asString(accountData.subtype),\n 'active',\n ),\n );\n accountCount++;\n }\n\n const year = typeof input.firstFiscalYear === 'number' ? input.firstFiscalYear : 0;\n if (year > 0) {\n const y = String(year).padStart(4, '0');\n tenant.fiscalYears.add(\n FiscalYear.create(tenant.ids.next(), year, CalendarDate.of(`${y}-01-01`), CalendarDate.of(`${y}-12-31`)),\n );\n }\n\n return {\n tenant,\n result: {\n id: tenant.id.value,\n name: tenant.name,\n profile: { id: profileId, version: asString(profile.version) ?? '' },\n accountCount,\n taxationMethod: taxProfile.taxationMethod(),\n },\n };\n }\n\n private findById(module: string, id: string): Record<string, unknown> | null {\n const list = Array.isArray(this.ruleModules[module]) ? (this.ruleModules[module] as unknown[]) : [];\n for (const candidate of list) {\n if (isRecord(candidate) && candidate.id === id) return candidate;\n }\n return null;\n }\n}\n"]}
|