blockintel-gate-sdk 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/crypto.ts","../src/utils/canonicalJson.ts","../src/auth/HmacSigner.ts","../src/auth/ApiKeyAuth.ts","../src/types/errors.ts","../src/http/retry.ts","../src/http/HttpClient.ts","../src/utils/time.ts","../src/stepup/stepup.ts","../src/circuit/CircuitBreaker.ts","../src/metrics/MetricsCollector.ts","../src/kms/wrapAwsSdkV3KmsClient.ts","../src/client/GateClient.ts"],"names":["crypto","GateErrorCode","createHash","SignCommand","uuidv4"],"mappings":";;;;;;;;;;;;;;;;AASA,eAAsB,UAAA,CAAW,QAAgB,OAAA,EAAkC;AAMjF,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAIlD,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA;AACrC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAE1C,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,MAC9B,KAAA;AAAA,MACA,OAAA;AAAA,MACA,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,MAChC,KAAA;AAAA,MACA,CAAC,MAAM;AAAA,KACT;AAEA,IAAA,MAAM,YAAY,MAAM,MAAA,CAAO,OAAO,IAAA,CAAK,MAAA,EAAQ,KAAK,WAAW,CAAA;AACnE,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,SAAS,CAAC,CAAA;AACtD,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EACtE;AAGA,EAAA,IAAI,OAAO,cAAY,WAAA,EAAa;AAClC,IAAA,MAAMA,OAAAA,GAAS,UAAQ,QAAQ,CAAA;AAE/B,IAAA,MAAM,IAAA,GAAOA,OAAAA,CAAO,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,CAAO,SAAS,MAAM,CAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AACjE;;;AC9BO,SAAS,iBAAiB,GAAA,EAAsB;AACrD,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC3B;AAEA,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,QAAQ,SAAA,EAAW;AACvD,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,QAAQ,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS,gBAAA,CAAiB,IAAI,CAAC,CAAA;AACtD,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC9B,MAAA,MAAM,KAAA,GAAS,IAAgC,GAAG,CAAA;AAClD,MAAA,MAAM,cAAA,GAAiB,iBAAiB,KAAK,CAAA;AAC7C,MAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,IAAI,cAAc,CAAA,CAAA;AAAA,IACjD,CAAC,CAAA;AACD,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAC5B;AAGA,EAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3B;AAKA,eAAsB,UAAU,KAAA,EAAgC;AAC9D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAClD,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AACjC,IAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAC7D,IAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,UAAU,CAAC,CAAA;AACvD,IAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EACtE;AAIA,EAAA,IAAI,OAAO,cAAY,WAAA,EAAa;AAClC,IAAA,MAAMA,OAAAA,GAAS,UAAQ,QAAQ,CAAA;AAC/B,IAAA,OAAOA,OAAAA,CAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,KAAA,EAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAC7D;;;ACvBO,IAAM,aAAN,MAAiB;AAAA,EACL,KAAA;AAAA,EACA,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAErB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAOU;AAC1B,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAU,WAAA,EAAa,SAAA,EAAW,MAAK,GAAI,MAAA;AAGjE,IAAA,MAAM,QAAA,GAAW,IAAA,GAAO,gBAAA,CAAiB,IAAI,CAAA,GAAI,EAAA;AACjD,IAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAU,QAAQ,CAAA;AAGzC,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,IAAA;AAAA,MACA,OAAO,WAAA,EAAY;AAAA,MACnB,IAAA;AAAA,MACA,QAAA;AAAA,MACA,IAAA,CAAK,KAAA;AAAA,MACL,OAAO,WAAW,CAAA;AAAA,MAClB,SAAA;AAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAGX,IAAA,MAAM,SAAA,GAAY,MAAM,UAAA,CAAW,IAAA,CAAK,QAAQ,aAAa,CAAA;AAE7D,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,QAAA;AAAA,MACpB,iBAAiB,IAAA,CAAK,KAAA;AAAA,MACtB,qBAAA,EAAuB,OAAO,WAAW,CAAA;AAAA,MACzC,mBAAA,EAAqB,SAAA;AAAA,MACrB,kBAAA,EAAoB;AAAA,KACtB;AAAA,EACF;AACF,CAAA;;;AC7EO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAErB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,MAAA,EAII;AAChB,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,SAAA,EAAU,GAAI,MAAA;AAE7C,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,MAAA;AAAA,MAClB,kBAAA,EAAoB,QAAA;AAAA,MACpB,mBAAA,EAAqB,SAAA;AAAA,MACrB,qBAAA,EAAuB,OAAO,WAAW;AAAA,KAC3C;AAAA,EACF;AACF,CAAA;;;AC1CO,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,eAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,eAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,eAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,qBAAA,CAAA,GAAsB,qBAAA;AACtB,EAAAA,eAAA,YAAA,CAAA,GAAa,YAAA;AAbH,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAmBL,IAAM,SAAA,GAAN,cAAwB,KAAA,CAAM;AAAA,EACnB,IAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CACE,IAAA,EACA,OAAA,EACA,OAAA,EAOA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAS,OAAA,EAAS,MAAA;AACvB,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,YAAY,OAAA,EAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,gBAAgB,OAAA,EAAS,aAAA;AAC9B,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,IACvB;AACA,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AAAA,EAEA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,eAAe,IAAA,CAAK;AAAA,KACtB;AAAA,EACF;AACF;AAMO,IAAM,wBAAA,GAAN,cAAuC,SAAA,CAAU;AAAA,EACtD,YAAY,SAAA,EAAoB;AAC9B,IAAA,KAAA;AAAA,MACE,wBAAA;AAAA,MACA,mHAAA;AAAA,MACA,EAAE,SAAA;AAAU,KACd;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;AAMO,IAAM,sBAAA,GAAN,cAAqC,SAAA,CAAU;AAAA,EACpC,SAAA;AAAA,EACA,UAAA;AAAA,EAEhB,WAAA,CACE,UAAA,EACA,SAAA,EACA,aAAA,EACA,SAAA,EACA;AACA,IAAA,KAAA;AAAA,MACE,SAAA;AAAA,MACA,wBAAwB,UAAU,CAAA,CAAA;AAAA,MAClC,EAAE,aAAA,EAAe,SAAA,EAAW,SAAS,EAAE,UAAA,EAAY,WAAU;AAAE,KACjE;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AACF;AAMO,IAAM,0BAAA,GAAN,cAAyC,SAAA,CAAU;AAAA,EACxD,WAAA,CAAY,SAAiB,SAAA,EAAoB;AAC/C,IAAA,KAAA,CAAM,qBAAA,4BAAmC,OAAA,EAAS,EAAE,SAAA,EAAW,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,4BAAA;AAAA,EACd;AACF;AAMO,IAAM,mBAAA,GAAN,cAAkC,SAAA,CAAU;AAAA,EACjD,WAAA,CAAY,OAAA,EAAiB,MAAA,EAAgB,SAAA,EAAoB;AAC/D,IAAA,KAAA;AAAA,MACE,MAAA,KAAW,MAAM,cAAA,sBAA6B,WAAA;AAAA,MAC9C,OAAA;AAAA,MACA,EAAE,QAAQ,SAAA;AAAU,KACtB;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAMO,IAAM,6BAAA,GAAN,cAA4C,SAAA,CAAU;AAAA,EAC3C,eAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EAEhB,WAAA,CACE,eAAA,EACA,SAAA,EACA,WAAA,EACA,SAAA,EACA;AACA,IAAA,KAAA;AAAA,MACE,wBAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA,QACE,SAAA;AAAA,QACA,OAAA,EAAS,EAAE,eAAA,EAAiB,SAAA,EAAW,WAAA;AAAY;AACrD,KACF;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,+BAAA;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AACF;;;ACvJA,IAAM,qBAAA,GAAgD;AAAA,EACpD,WAAA,EAAa,CAAA;AAAA,EACb,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,GAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;AAKO,SAAS,kBAAkB,MAAA,EAAyB;AAEzD,EAAA,OAAO,MAAA,KAAW,GAAA,IAAQ,MAAA,IAAU,GAAA,IAAO,MAAA,GAAS,GAAA;AACtD;AAKO,SAAS,iBAAiB,KAAA,EAAyB;AAExD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAC1C,IAAA,OACE,OAAA,CAAQ,SAAS,SAAS,CAAA,IAC1B,QAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,OAAA,CAAQ,QAAA,CAAS,YAAY,KAC7B,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,SAAS,WAAW,CAAA,IAC5B,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA;AAAA,EAEjC;AACA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,qBAAA,CACd,SACA,OAAA,EACQ;AACR,EAAA,MAAM,gBAAA,GAAmB,QAAQ,WAAA,GAAc,IAAA,CAAK,IAAI,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAC,CAAA;AACnF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA,GAAM,gBAAA;AACrC,EAAA,MAAM,QAAQ,gBAAA,GAAmB,MAAA;AACjC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAA,CAAQ,UAAU,CAAA;AAC3C;AAKA,SAAS,qBAAqB,KAAA,EAAyB;AACrD,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,EAAO;AACzD,IAAA,MAAM,SAAA,GAAY,KAAA;AAElB,IAAA,IAAI,SAAA,CAAU,IAAA,KAAS,cAAA,IAAkB,SAAA,CAAU,SAAS,cAAA,EAAgB;AAC1E,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAA,CAAU,MAAA,IAAU,iBAAA,CAAkB,SAAA,CAAU,MAAM,CAAA,EAAG;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,gBAAA,CACpB,EAAA,EACA,OAAA,GAAwB,EAAC,EACb;AACZ,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,qBAAA,EAAuB,GAAG,OAAA,EAAQ;AACpD,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,aAAa,OAAA,EAAA,EAAW;AAC5D,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAGZ,MAAA,IAAI,OAAA,IAAW,KAAK,WAAA,EAAa;AAC/B,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,iBAAiB,QAAA,IAAY,CAAC,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,EAAG;AACjE,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,WAAA,GACH,KAAA,YAAiB,QAAA,IAAY,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA,IAC5D,gBAAA,CAAiB,KAAK,CAAA,IACtB,oBAAA,CAAqB,KAAK,CAAA;AAE5B,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,OAAA,EAAS,IAAI,CAAA;AACjD,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;;;ACzFO,IAAM,aAAN,MAAiB;AAAA,EACL,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,IAAA;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,2BAAA;AACrC,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAG3B,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA,IACvC;AAGA,IAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,CAAI,aAAa,YAAA,EAAc;AAC3E,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,IAAK,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AAC/E,QAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,OAAA,EAAqC;AACpD,IAAA,MAAM,EAAE,QAAQ,IAAA,EAAM,OAAA,GAAU,EAAC,EAAG,IAAA,EAAM,WAAU,GAAI,OAAA;AAExD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,IAAI,CAAA,CAAA;AAGlC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AAErE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,QACrB,YAAY;AACV,UAAA,MAAM,YAAA,GAA4B;AAAA,YAChC,MAAA;AAAA,YACA,OAAA,EAAS;AAAA,cACP,GAAG,OAAA;AAAA,cACH,cAAc,IAAA,CAAK,SAAA;AAAA,cACnB,cAAA,EAAgB;AAAA,aAClB;AAAA,YACA,QAAQ,UAAA,CAAW;AAAA,WACrB;AAEA,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,YAAA,CAAa,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzC;AAEA,UAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,YAAY,CAAA;AAGzC,UAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5C,YAAA,MAAM,GAAA;AAAA,UACR;AAGA,UAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,iBAAA,CAAkB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC7C,YAAA,MAAM,GAAA;AAAA,UACR;AAEA,UAAA,OAAO,GAAA;AAAA,QACT,CAAA;AAAA,QACA;AAAA,UACE,GAAG,IAAA,CAAK;AAAA;AAAA;AAEV,OACF;AAEA,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,IAAI,IAAA;AACJ,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAEvD,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC3D,QAAA,IAAI;AACF,UAAA,IAAA,GAAQ,MAAM,SAAS,IAAA,EAAK;AAAA,QAC9B,SAAS,UAAA,EAAY;AACnB,UAAA,MAAM,IAAI,SAAA;AAAA,YAAA,kBAAA;AAAA,YAER,+BAAA;AAAA,YACA;AAAA,cACE,QAAQ,QAAA,CAAS,MAAA;AAAA,cACjB,SAAA;AAAA,cACA,KAAA,EAAO,UAAA,YAAsB,KAAA,GAAQ,UAAA,GAAa,KAAA;AAAA;AACpD,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,kBAAA;AAAA,UAER,4BAA4B,WAAW,CAAA,CAAA;AAAA,UACvC;AAAA,YACE,QAAQ,QAAA,CAAS,MAAA;AAAA,YACjB,SAAS,EAAE,IAAA,EAAM,KAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,YACxC;AAAA;AACF,SACF;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA;AACxD,QAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,KAAA,CAAA;AAElE,QAAA,MAAM,IAAI,UAAU,SAAA,EAAW,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA,EAAI;AAAA,UAChF,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,aAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,SAAA,CAAA,SAAA,gBAAiC,CAAA,sBAAA,EAAyB,IAAA,CAAK,SAAS,CAAA,EAAA,CAAA,EAAM;AAAA,UACtF;AAAA,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AACrD,QAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,MAAA;AAE/D,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,EAAK;AAC9B,UAAA,IAAI;AACF,YAAA,OAAA,GAAU,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,UAC3B,CAAA,CAAA,MAAQ;AACN,YAAA,OAAA,GAAU,EAAE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,UAC3C;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAEA,QAAA,MAAM,IAAI,UAAU,SAAA,EAAW,CAAA,KAAA,EAAQ,MAAM,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,UAAU,CAAA,CAAA,EAAI;AAAA,UAC1E,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,aAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,eAAA;AAAA,UAER,kBAAkB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,UACxE;AAAA,YACE,SAAA;AAAA,YACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA;AAC1C,SACF;AAAA,MACF;AAGA,MAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,MAAM,IAAI,SAAA;AAAA,QAAA,eAAA;AAAA,QAER,qBAAqB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAC3E;AAAA,UACE,SAAA;AAAA,UACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ;AAAA;AAC1C,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAA,EAA+B;AACvD,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,cAAA;AACpB,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,WAAA;AACpB,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,WAAA;AACpB,IAAA,IAAI,WAAW,GAAA,EAAK,OAAA,cAAA;AACpB,IAAA,IAAI,MAAA,IAAU,GAAA,IAAO,MAAA,GAAS,GAAA,EAAK,OAAA,cAAA;AACnC,IAAA,OAAA,eAAA;AAAA,EACF;AACF,CAAA;;;AC7NO,SAAS,KAAA,GAAgB;AAC9B,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;AAKO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACrC;AAKO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;AAKO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;;;ACTA,IAAM,2BAAA,GAA8B,GAAA;AACpC,IAAM,mBAAA,GAAsB,IAAA;AAC5B,IAAM,uBAAA,GAA0B,GAAA;AAChC,IAAM,uBAAA,GAA0B,GAAA;AAChC,IAAM,2BAAA,GAA8B,GAAA;AAK7B,IAAM,eAAN,MAAmB;AAAA,EACP,UAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EAEjB,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,2BAAA;AACrD,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,mBAAA;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,uBAAA;AAC7C,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,uBAAA;AAC7C,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,2BAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,SAAA,EAAkD;AAChE,IAAA,MAAM,IAAA,GAAO,mCAAmC,kBAAA,CAAmB,IAAA,CAAK,QAAQ,CAAC,CAAA,WAAA,EAAc,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA;AAE5H,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAQxC;AAAA,QACA,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,QAAA,GAAiC;AAAA,QACrC,QAAQ,WAAA,CAAY,MAAA;AAAA,QACpB,QAAA,EAAU,WAAA,CAAY,SAAA,IAAa,WAAA,CAAY,QAAA;AAAA,QAC/C,SAAA,EAAW,WAAA,CAAY,UAAA,IAAc,WAAA,CAAY,SAAA;AAAA,QACjD,UAAU,WAAA,CAAY,QAAA;AAAA,QACtB,WAAA,EAAa,WAAA,CAAY,YAAA,IAAgB,WAAA,CAAY,WAAA;AAAA,QACrD,aAAA,EAAe,WAAA,CAAY,cAAA,IAAkB,WAAA,CAAY,aAAA;AAAA,QACzD,WAAA,EAAa,WAAA,CAAY,aAAA,IAAiB,WAAA,CAAY,WAAA;AAAA,QACtD,KAAK,WAAA,CAAY;AAAA,OACnB;AAGA,MAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,MAAA,IAAI,QAAA,CAAS,GAAA,KAAQ,KAAA,CAAA,IAAa,QAAA,CAAS,OAAO,GAAA,EAAK;AACrD,QAAA,OAAO;AAAA,UACL,GAAG,QAAA;AAAA,UACH,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,WAAA,kBAAkC;AACxE,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,WAAA;AAAA,UAER,8BAA8B,SAAS,CAAA,CAAA;AAAA,UACvC,EAAE,SAAA;AAAU,SACd;AAAA,MACF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CACJ,SAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,SAAA;AAC7C,IAAA,MAAM,UAAA,GAAa,OAAA,EAAS,UAAA,IAAc,IAAA,CAAK,iBAAA;AAE/C,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,iBAAA;AAAA,UAER,kCAAkC,SAAS,CAAA,EAAA,CAAA;AAAA,UAC3C,EAAE,SAAA;AAAU,SACd;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAG7C,QAAA,MAAM,MAAM,eAAA,EAAgB;AAC5B,QAAA,IAAI,MAAA,CAAO,GAAA,KAAQ,KAAA,CAAA,IAAa,MAAA,CAAO,OAAO,GAAA,EAAK;AACjD,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,SAAA;AAAA,YACR,SAAA;AAAA,YACA,SAAA;AAAA,YACA,eAAe,MAAA,CAAO;AAAA,WACxB;AAAA,QACF;AAGA,QAAA,IACE,MAAA,CAAO,WAAW,UAAA,IAClB,MAAA,CAAO,WAAW,QAAA,IAClB,MAAA,CAAO,WAAW,SAAA,EAClB;AACA,UAAA,OAAO;AAAA,YACL,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,SAAA;AAAA,YACA,SAAA;AAAA,YACA,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,aAAa,MAAA,CAAO,WAAA;AAAA,YACpB,eAAe,MAAA,CAAO;AAAA,WACxB;AAAA,QACF;AAGA,QAAA,MAAM,MAAM,UAAU,CAAA;AAAA,MACxB,SAAS,KAAA,EAAO;AAEd,QAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,WAAA,kBAAkC;AACxE,UAAA,MAAM,KAAA;AAAA,QACR;AAIA,QAAA,MAAM,WAAA,GAAc,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,CAAA;AAC9C,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,MAAM,IAAI,SAAA;AAAA,YAAA,iBAAA;AAAA,YAER,kCAAkC,SAAS,CAAA,EAAA,CAAA;AAAA,YAC3C,EAAE,SAAA,EAAW,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA;AAAU,WACjE;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,UAAA,EAA6B;AACpC,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,IACd;AACA,IAAA,OAAO,KAAA,CAAM,UAAA,EAAY,IAAA,CAAK,aAAA,EAAe,KAAK,aAAa,CAAA;AAAA,EACjE;AACF,CAAA;;;ACvKO,IAAM,iBAAN,MAAqB;AAAA,EAClB,KAAA,GAAsB,QAAA;AAAA,EACtB,QAAA,GAAW,CAAA;AAAA,EACX,SAAA,GAAY,CAAA;AAAA,EACZ,eAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA,GAAc,CAAA;AAAA,EAEL,aAAA;AAAA,EACA,UAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,4BAAA,IAAgC,CAAA;AAC5D,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,GAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAW,EAAA,EAAkC;AAEjD,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACzB,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,eAAA,GAC9B,GAAA,GAAM,KAAK,eAAA,GACX,QAAA;AAEJ,MAAA,IAAI,oBAAA,IAAwB,KAAK,UAAA,EAAY;AAC3C,QAAA,IAAA,CAAK,KAAA,GAAQ,WAAA;AACb,QAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,MAClB,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,uBAAA;AAAA,UACR,CAAA,0CAAA,EAA6C,IAAA,CAAK,UAAA,GAAa,oBAAoB,CAAA,EAAA;AAAA,SACrF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAA,EAAU;AACf,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,SAAA,EAAA;AACL,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEhC,IAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa;AAE9B,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,MAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,IAClB,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AAElC,MAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAAA,IAClB;AAAA,EACF;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,QAAA,EAAA;AACL,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,EAAI;AAEhC,IAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa;AAE9B,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,WAAA,EAAA;AAAA,IACP,WAAW,IAAA,CAAK,KAAA,KAAU,YAAY,IAAA,CAAK,QAAA,IAAY,KAAK,aAAA,EAAe;AAEzE,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,WAAA,EAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAoC;AAClC,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AACF,CAAA;AAKO,IAAM,uBAAA,GAAN,cAAsC,KAAA,CAAM;AAAA,EACjD,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AAAA,EACd;AACF,CAAA;;;AClHO,IAAM,mBAAN,MAAuB;AAAA,EACpB,aAAA,GAAgB,CAAA;AAAA,EAChB,YAAA,GAAe,CAAA;AAAA,EACf,YAAA,GAAe,CAAA;AAAA,EACf,WAAA,GAAc,CAAA;AAAA,EACd,aAAA,GAAgB,CAAA;AAAA,EAChB,WAAA,GAAc,CAAA;AAAA,EACd,uBAAA,GAA0B,CAAA;AAAA,EAC1B,YAAsB,EAAC;AAAA,EAEd,UAAA,GAAa,GAAA;AAAA;AAAA,EACb,QAAuB,EAAC;AAAA;AAAA;AAAA;AAAA,EAKzC,aAAA,CAAc,UAAiD,SAAA,EAAyB;AACtF,IAAA,IAAA,CAAK,aAAA,EAAA;AAEL,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,IAAA,CAAK,YAAA,EAAA;AAAA,IACP,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,MAAA,IAAA,CAAK,YAAA,EAAA;AAAA,IACP,CAAA,MAAA,IAAW,aAAa,iBAAA,EAAmB;AACzC,MAAA,IAAA,CAAK,WAAA,EAAA;AAAA,IACP;AAGA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,SAAS,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AAC3C,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,aAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,WAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAAiC;AAC/B,IAAA,IAAA,CAAK,uBAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAsB;AACpB,IAAA,OAAO;AAAA,MACL,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,yBAAyB,IAAA,CAAK,uBAAA;AAAA,MAC9B,SAAA,EAAW,CAAC,GAAG,IAAA,CAAK,SAAS;AAAA;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,IAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,OAAO,CAAA;AAAA,MACd,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,uBAAA,GAA0B,CAAA;AAC/B,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACpB;AACF,CAAA;ACvCO,SAAS,aAAA,CACd,SAAA,EACA,UAAA,EACA,OAAA,GAAgC,EAAC,EACf;AAClB,EAAA,MAAM,cAAA,GAAiD;AAAA,IACrD,IAAA,EAAM,QAAQ,IAAA,IAAQ,SAAA;AAAA,IACtB,UAAA,EAAY,OAAA,CAAQ,UAAA,KAAe,MAAM;AAAA,IAAC,CAAA,CAAA;AAAA,IAC1C,eAAA,EAAiB,QAAQ,eAAA,IAAmB;AAAA,GAC9C;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,SAAA,EAAW;AAAA,IACnC,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,MAAA,IAAI,SAAS,MAAA,EAAQ;AAEnB,QAAA,OAAO,eAAgB,OAAA,EAAc;AAEnC,UAAA,IAAI,WAAW,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,aAAA,EAAe;AAChF,YAAA,OAAO,MAAM,iBAAA;AAAA,cACX,OAAA;AAAA,cACA,MAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAGA,UAAA,OAAO,MAAO,MAAA,CAAe,IAAA,CAAK,OAAO,CAAA;AAAA,QAC3C,CAAA;AAAA,MACF;AAGA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AAGD,EAAA,OAAA,CAAQ,eAAA,GAAkB,SAAA;AAC1B,EAAA,OAAA,CAAQ,WAAA,GAAc,UAAA;AACtB,EAAA,OAAA,CAAQ,eAAA,GAAkB,cAAA;AAE1B,EAAA,OAAO,OAAA;AACT;AAUA,SAAS,uBAAuB,OAAA,EAO9B;AAGA,EAAA,MAAM,OAAA,GAAW,OAAA,CAAgB,KAAA,EAAO,OAAA,IAAY,OAAA,CAAgB,OAAA;AACpE,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,MAAM,gBAAgB,OAAA,YAAmB,MAAA,GACrC,OAAA,GACA,MAAA,CAAO,KAAK,OAAc,CAAA;AAC9B,EAAA,MAAM,WAAA,GAAcC,oBAAW,QAAQ,CAAA,CAAE,OAAO,aAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAE3E,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,OAAA;AAAA,IACf,SAAA,EAAW,MAAA;AAAA;AAAA,IACX,WAAA,EAAa,WAAA;AAAA,IACb,QAAA,EAAU;AAAA;AAAA,GACZ;AACF;AAKA,eAAe,iBAAA,CACb,OAAA,EACA,cAAA,EACA,UAAA,EACA,OAAA,EACc;AAEd,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,eAAA,CAAgB,OAAO,CAAA;AAIhD,EAAA,MAAM,QAAA,GAAY,OAAA,CAAgB,KAAA,EAAO,KAAA,IAAU,QAAgB,KAAA,IAAS,SAAA;AAG5E,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,QAAA;AAAA,IACA,cAAA,EAAgB;AAAA;AAAA,GAClB;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,QAAA,CAAS;AAAA,MACzC,QAAA;AAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,OAAA,CAAQ,WAAW,OAAA,EAAS,EAAE,QAAA,EAAU,QAAA,EAAU,SAAS,CAAA;AAE3D,IAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAE9B,MAAA,OAAO,MAAM,cAAA,CAAe,IAAA,CAAK,IAAIC,qBAAA,CAAY,OAAO,CAAC,CAAA;AAAA,IAC3D;AAGA,IAAA,OAAO,MAAM,cAAA,CAAe,IAAA,CAAK,IAAIA,qBAAA,CAAY,OAAO,CAAC,CAAA;AAAA,EAC3D,SAAS,KAAA,EAAY;AAEnB,IAAA,IAAI,iBAAiB,sBAAA,EAAwB;AAC3C,MAAA,OAAA,CAAQ,WAAW,OAAA,EAAS,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AACxD,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,IAAI,iBAAiB,6BAAA,EAA+B;AAClD,MAAA,OAAA,CAAQ,WAAW,iBAAA,EAAmB,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA;AAClE,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;AClMO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EAEjB,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAC/B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,QAC/B,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,QACnB,MAAA,EAAQ,OAAO,IAAA,CAAK;AAAA,OACrB,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,QAC/B,MAAA,EAAQ,OAAO,IAAA,CAAK;AAAA,OACrB,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW;AAAA,MAC/B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAGD,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa;AAAA,QACnC,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,iBAAA,EAAmB,OAAO,MAAA,EAAQ,iBAAA;AAAA,QAClC,SAAA,EAAW,OAAO,MAAA,EAAQ;AAAA,OAC3B,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA;AAAA,IAChE;AAGA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,gBAAA,EAAiB;AACpC,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAA,CACJ,GAAA,EACA,IAAA,EACoC;AACpC,IAAA,MAAM,SAAA,GAAY,IAAA,EAAM,SAAA,IAAaC,OAAA,EAAO;AAC5C,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,WAAA,IAAe,KAAA,EAAM;AAC7C,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,YAAA,IAAgB,kBAAA;AAGjD,IAAA,MAAM,iBAAiB,YAAgD;AAErE,MAAA,MAAM,QAAA,GAAgB,EAAE,GAAG,GAAA,CAAI,QAAA,EAAS;AAExC,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,CAAC,QAAA,CAAS,SAAA,EAAW;AACtC,QAAA,QAAA,CAAS,YAAY,QAAA,CAAS,EAAA;AAC9B,QAAA,OAAO,QAAA,CAAS,EAAA;AAAA,MAClB;AAEA,MAAA,IAAI,CAAC,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,OAAA,EAAS;AAC/C,QAAA,QAAA,CAAS,aAAA,GAAgB,KAAA;AAAA,MAC3B;AAEA,MAAA,IAAI,QAAA,CAAS,IAAA,IAAQ,CAAC,QAAA,CAAS,WAAA,EAAa;AAC1C,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MAClB;AAGA,MAAA,MAAM,cAAA,GAAsB;AAAA,QAC1B,GAAG,GAAA,CAAI,cAAA;AAAA,QACP,gBAAgB,GAAA,CAAI,cAAA,EAAgB,cAAA,IAAkB,GAAA,CAAI,gBAAgB,QAAA,IAAY;AAAA,OACxF;AAGA,MAAA,MAAM,IAAA,GAAY;AAAA,QAChB,SAAA;AAAA,QACA,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,QACtB,WAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA;AAAA,QAEA,GAAA,EAAK;AAAA,UACH,IAAA,EAAM,qBAAA;AAAA,UACN,OAAA,EAAS;AAAA;AACX,OACF;AAGA,MAAA,IAAI,OAAA;AAEJ,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY;AAAA,UACpD,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,mBAAA;AAAA,UACN,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,WAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,OAAA,GAAU,EAAE,GAAG,WAAA,EAAY;AAAA,MAC7B,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,UAAA,CAAW,aAAA,CAAc;AAAA,UAClD,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,WAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,OAAA,GAAU,EAAE,GAAG,aAAA,EAAc;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,MAChD;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAavC;AAAA,QACD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAGD,MAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,YAAY,IAAA,EAAM;AAC7C,QAAA,MAAM,IAAI,SAAA;AAAA,UAAA,kBAAA;AAAA,UAER,oEAAA;AAAA,UACA;AAAA,YACE,SAAA;AAAA,YACA,OAAA,EAAS;AAAA;AACX,SACF;AAAA,MACF;AAEA,MAAA,MAAM,eAAe,WAAA,CAAY,IAAA;AAGjC,MAAA,MAAM,MAAA,GAAoC;AAAA,QACxC,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,WAAA,EAAa,YAAA,CAAa,YAAA,IAAgB,YAAA,CAAa,eAAe,EAAC;AAAA,QACvE,aAAA,EAAe,YAAA,CAAa,cAAA,IAAkB,YAAA,CAAa,aAAA;AAAA,QAC3D,aAAA,EAAe,YAAA,CAAa,cAAA,IAAkB,YAAA,CAAa,aAAA;AAAA,QAC3D,MAAA,EAAQ,aAAa,OAAA,GACjB;AAAA,UACE,WAAW,YAAA,CAAa,OAAA,CAAQ,UAAA,KAAe,YAAA,CAAa,QAAQ,SAAA,IAAa,EAAA,CAAA;AAAA,UACjF,UAAA,EAAY,YAAA,CAAa,OAAA,CAAQ,WAAA,IAAe,aAAa,MAAA,EAAQ;AAAA,YAEvE,YAAA,CAAa;AAAA,OACnB;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG/B,MAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAE/B,QAAA,MAAM,SAAA,GAAa,aAAqB,WAAA,IAAe,SAAA;AACvD,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA,IAAK,kBAAA;AAC5C,QAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA;AAC7C,QAAA,MAAM,IAAI,sBAAA,CAAuB,UAAA,EAAY,SAAA,EAAW,MAAA,CAAO,eAAe,SAAS,CAAA;AAAA,MACzF;AAEA,MAAA,IAAI,MAAA,CAAO,aAAa,iBAAA,EAAmB;AAEzC,QAAA,IAAI,KAAK,MAAA,CAAO,YAAA,IAAgB,IAAA,CAAK,YAAA,IAAgB,OAAO,MAAA,EAAQ;AAElE,UAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,SAAA;AACnD,UAAA,MAAM,WAAA,GAAe,aAAa,OAAA,EAAiB,aAAA;AACnD,UAAA,MAAM,YAAY,CAAA,gCAAA,EAAmC,IAAA,CAAK,MAAA,CAAO,QAAQ,cAAc,eAAe,CAAA,CAAA;AACtG,UAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,iBAAA,EAAmB,SAAS,CAAA;AACvD,UAAA,MAAM,IAAI,6BAAA,CAA8B,eAAA,EAAiB,SAAA,EAAW,aAAa,SAAS,CAAA;AAAA,QAC5F,CAAA,MAAO;AAEL,UAAA,MAAM,SAAA,GAAa,aAAqB,WAAA,IAAe,SAAA;AACvD,UAAA,MAAM,UAAA,GAAa,iBAAA;AACnB,UAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA;AAC7C,UAAA,MAAM,IAAI,sBAAA,CAAuB,UAAA,EAAY,SAAA,EAAW,MAAA,CAAO,eAAe,SAAS,CAAA;AAAA,QACzF;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,OAAA,EAAS,SAAS,CAAA;AAC7C,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAGA,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,cAAc,CAAA;AAAA,MACzD;AACA,MAAA,OAAO,MAAM,cAAA,EAAe;AAAA,IAC9B,SAAS,KAAA,EAAY;AAInB,MAAA,IAAI,iBAAiB,uBAAA,EAAyB;AAC5C,QAAA,IAAA,CAAK,QAAQ,wBAAA,EAAyB;AACtC,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,OAAO,SAAS,CAAA;AACzE,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,cAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,KAAA,YAAiB,SAAA,KAAc,KAAA,CAAM,IAAA,KAAA,cAAA,uBAAuC,MAAM,IAAA,KAAA,WAAA,iBAAA,EAAmC;AACvH,QAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,QAAA,MAAM,IAAI,mBAAA;AAAA,UACR,KAAA,CAAM,OAAA;AAAA,UACN,MAAM,MAAA,IAAU,GAAA;AAAA,UAChB;AAAA,SACF;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,SAAA,gBAAgC;AACtE,QAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,OAAO,SAAS,CAAA;AACzE,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,cAAA;AAAA,QACT;AACA,QAAA,MAAM,IAAI,0BAAA,CAA2B,CAAA,iBAAA,EAAoB,KAAA,CAAM,OAAO,IAAI,SAAS,CAAA;AAAA,MACrF;AAGA,MAAA,IAAI,KAAA,YAAiB,SAAA,IAAa,KAAA,CAAM,IAAA,KAAA,cAAA,qBAAqC;AAC3E,QAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,OAAO,SAAS,CAAA;AACzE,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,cAAA;AAAA,QACT;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAI,KAAA,YAAiB,sBAAA,IAA0B,KAAA,YAAiB,6BAAA,EAA+B;AAC7F,QAAA,MAAM,KAAA;AAAA,MACR;AAGA,MAAA,IAAA,CAAK,QAAQ,WAAA,EAAY;AACzB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,IAAA,EACA,KAAA,EACA,SAAA,EACkC;AAClC,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAG/B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAE/B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,SAAS,kBAAA,EAAoB;AAG/B,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAyD;AACvD,IAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,EAAW;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAA4E;AAC1E,IAAA,OAAO,IAAA,CAAK,cAAA,EAAgB,UAAA,EAAW,IAAK,IAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,IAAA,EAGY;AAChC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,wBAAA,CAAyB,IAAA,CAAK,SAAS,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,QAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa;AAAA,MAC9B,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,QAAA;AAAA,MACA,iBAAA,EAAmB,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,iBAAA;AAAA,MACvC,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AAAA,KAChC,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,IAAA,EAIK;AAC7B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,MAAM,IAAI,wBAAA,CAAyB,IAAA,CAAK,SAAS,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW;AAAA,MACrD,SAAA,EAAW,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,OAAO,MAAA,EAAQ,SAAA;AAAA,MACjD,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,OAAO,MAAA,EAAQ;AAAA,KACpD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,aAAA,CACE,WACA,OAAA,EACkB;AAClB,IAAA,OAAO,aAAA,CAAc,SAAA,EAAkB,IAAA,EAAM,OAAO,CAAA;AAAA,EACtD;AACF;AAKO,SAAS,iBAAiB,MAAA,EAAsC;AACrE,EAAA,OAAO,IAAI,WAAW,MAAM,CAAA;AAC9B","file":"index.cjs","sourcesContent":["/**\n * BlockIntel Gate SDK - Crypto Utilities\n * \n * HMAC-SHA256 implementation using Web Crypto API or Node.js crypto\n */\n\n/**\n * Compute HMAC-SHA256 signature\n */\nexport async function hmacSha256(secret: string, message: string): Promise<string> {\n // Hot Path uses base64 string directly in Node.js crypto.createHmac('sha256', secret)\n // This treats the base64 string as UTF-8 bytes\n // Bootstrap encrypts base64 string as UTF-8 bytes, Hot Path decrypts to base64 string\n // So we need to match this behavior: encode base64 string as UTF-8 bytes\n \n if (typeof crypto !== 'undefined' && crypto.subtle) {\n // Web Crypto API (Node 18+ or browser)\n // For Web Crypto, we need bytes, so encode the base64 string as UTF-8 bytes\n // This matches Node.js crypto.createHmac treating the base64 string as UTF-8\n const encoder = new TextEncoder();\n const keyData = encoder.encode(secret); // Encode base64 string as UTF-8 bytes\n const messageData = encoder.encode(message);\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n const signature = await crypto.subtle.sign('HMAC', key, messageData);\n const hashArray = Array.from(new Uint8Array(signature));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n // Fallback for Node < 18\n if (typeof require !== 'undefined') {\n const crypto = require('crypto');\n // Use base64 string directly (matches Hot Path behavior)\n const hmac = crypto.createHmac('sha256', secret);\n hmac.update(message, 'utf8');\n return hmac.digest('hex');\n }\n\n throw new Error('HMAC-SHA256 not available in this environment');\n}\n\n","/**\n * BlockIntel Gate SDK - Canonical JSON Utilities\n * \n * Implements deterministic JSON serialization for HMAC signing.\n * Ensures stable key ordering and no whitespace.\n */\n\n/**\n * Sort object keys recursively and produce canonical JSON string\n * \n * Rules:\n * - All keys sorted alphabetically (case-sensitive)\n * - No whitespace between tokens\n * - UTF-8 encoding\n * - Stable ordering for arrays and nested objects\n */\nexport function canonicalizeJson(obj: unknown): string {\n if (obj === null || obj === undefined) {\n return 'null';\n }\n\n if (typeof obj === 'string') {\n return JSON.stringify(obj);\n }\n\n if (typeof obj === 'number' || typeof obj === 'boolean') {\n return String(obj);\n }\n\n if (Array.isArray(obj)) {\n const items = obj.map((item) => canonicalizeJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof obj === 'object') {\n const keys = Object.keys(obj).sort();\n const pairs = keys.map((key) => {\n const value = (obj as Record<string, unknown>)[key];\n const canonicalValue = canonicalizeJson(value);\n return `${JSON.stringify(key)}:${canonicalValue}`;\n });\n return `{${pairs.join(',')}}`;\n }\n\n // Fallback to JSON.stringify for any other type\n return JSON.stringify(obj);\n}\n\n/**\n * Compute SHA-256 hash of canonical JSON\n */\nexport async function sha256Hex(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n // Fallback for Node < 18 or environments without Web Crypto\n // In Node 18+, crypto.subtle is available globally\n if (typeof require !== 'undefined') {\n const crypto = require('crypto');\n return crypto.createHash('sha256').update(input, 'utf8').digest('hex');\n }\n\n throw new Error('SHA-256 not available in this environment');\n}\n\n","/**\n * BlockIntel Gate SDK - HMAC v1 Signer\n * \n * Implements canonical request signing for Gate Hot Path API.\n * \n * Signing Algorithm (v1):\n * 1. Create canonical signing string:\n * v1\\n\n * <HTTP_METHOD>\\n\n * <PATH>\\n\n * <TENANT_ID>\\n\n * <KEY_ID>\\n\n * <TIMESTAMP_MS>\\n\n * <REQUEST_ID_AS_NONCE>\\n\n * <SHA256_HEX_OF_BODY>\n * \n * 2. Compute HMAC-SHA256(secret, signingString) as hex\n * \n * 3. Include headers:\n * - X-GATE-TENANT-ID\n * - X-GATE-KEY-ID\n * - X-GATE-TIMESTAMP-MS\n * - X-GATE-REQUEST-ID (used as nonce in canonical string)\n * - X-GATE-SIGNATURE (hex string)\n */\n\nimport { hmacSha256 } from '../utils/crypto.js';\nimport { canonicalizeJson, sha256Hex } from '../utils/canonicalJson.js';\n\nexport interface HmacSignerConfig {\n keyId: string;\n secret: string;\n}\n\nexport interface SigningHeaders {\n 'X-GATE-TENANT-ID': string;\n 'X-GATE-KEY-ID': string;\n 'X-GATE-TIMESTAMP-MS': string;\n 'X-GATE-REQUEST-ID': string;\n 'X-GATE-SIGNATURE': string;\n}\n\n/**\n * HMAC v1 signer for Gate API requests\n */\nexport class HmacSigner {\n private readonly keyId: string;\n private readonly secret: string;\n\n constructor(config: HmacSignerConfig) {\n this.keyId = config.keyId;\n this.secret = config.secret;\n\n if (!this.secret || this.secret.length === 0) {\n throw new Error('HMAC secret cannot be empty');\n }\n }\n\n /**\n * Sign a request and return headers\n */\n async signRequest(params: {\n method: string;\n path: string;\n tenantId: string;\n timestampMs: number;\n requestId: string;\n body?: unknown;\n }): Promise<SigningHeaders> {\n const { method, path, tenantId, timestampMs, requestId, body } = params;\n\n // Canonicalize body\n const bodyJson = body ? canonicalizeJson(body) : '';\n const bodyHash = await sha256Hex(bodyJson);\n\n // Construct canonical signing string (matches Hot Path format)\n const signingString = [\n 'v1',\n method.toUpperCase(),\n path,\n tenantId,\n this.keyId,\n String(timestampMs),\n requestId, // Used as nonce in canonical string\n bodyHash,\n ].join('\\n');\n\n // Compute signature (returns hex)\n const signature = await hmacSha256(this.secret, signingString);\n\n return {\n 'X-GATE-TENANT-ID': tenantId,\n 'X-GATE-KEY-ID': this.keyId,\n 'X-GATE-TIMESTAMP-MS': String(timestampMs),\n 'X-GATE-REQUEST-ID': requestId,\n 'X-GATE-SIGNATURE': signature,\n };\n }\n}\n\n","/**\n * BlockIntel Gate SDK - API Key Authentication\n * \n * Simple API key authentication using X-API-KEY header.\n * Still includes tenant/request/timestamp headers for replay semantics.\n */\n\nexport interface ApiKeyAuthConfig {\n apiKey: string;\n}\n\nexport interface ApiKeyHeaders {\n 'X-API-KEY': string;\n 'X-GATE-TENANT-ID': string;\n 'X-GATE-REQUEST-ID': string;\n 'X-GATE-TIMESTAMP-MS': string;\n}\n\n/**\n * API Key authenticator for Gate API requests\n */\nexport class ApiKeyAuth {\n private readonly apiKey: string;\n\n constructor(config: ApiKeyAuthConfig) {\n this.apiKey = config.apiKey;\n\n if (!this.apiKey || this.apiKey.length === 0) {\n throw new Error('API key cannot be empty');\n }\n }\n\n /**\n * Create headers for API key authentication\n */\n createHeaders(params: {\n tenantId: string;\n timestampMs: number;\n requestId: string;\n }): ApiKeyHeaders {\n const { tenantId, timestampMs, requestId } = params;\n\n return {\n 'X-API-KEY': this.apiKey,\n 'X-GATE-TENANT-ID': tenantId,\n 'X-GATE-REQUEST-ID': requestId,\n 'X-GATE-TIMESTAMP-MS': String(timestampMs),\n };\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Error Types\n */\n\n/**\n * Gate error codes\n */\nexport enum GateErrorCode {\n NETWORK_ERROR = 'NETWORK_ERROR',\n TIMEOUT = 'TIMEOUT',\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n FORBIDDEN = 'FORBIDDEN',\n RATE_LIMITED = 'RATE_LIMITED',\n SERVER_ERROR = 'SERVER_ERROR',\n INVALID_RESPONSE = 'INVALID_RESPONSE',\n STEP_UP_NOT_CONFIGURED = 'STEP_UP_NOT_CONFIGURED',\n STEP_UP_TIMEOUT = 'STEP_UP_TIMEOUT',\n BLOCKED = 'BLOCKED',\n SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE',\n AUTH_ERROR = 'AUTH_ERROR',\n}\n\n/**\n * Base Gate error class\n */\nexport class GateError extends Error {\n public readonly code: GateErrorCode;\n public readonly status?: number;\n public readonly details?: Record<string, unknown>;\n public readonly requestId?: string;\n public readonly correlationId?: string;\n\n constructor(\n code: GateErrorCode,\n message: string,\n options?: {\n status?: number;\n details?: Record<string, unknown>;\n requestId?: string;\n correlationId?: string;\n cause?: Error;\n }\n ) {\n super(message);\n this.name = 'GateError';\n this.code = code;\n this.status = options?.status;\n this.details = options?.details;\n this.requestId = options?.requestId;\n this.correlationId = options?.correlationId;\n if (options?.cause) {\n this.cause = options.cause;\n }\n Error.captureStackTrace(this, this.constructor);\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n status: this.status,\n details: this.details,\n requestId: this.requestId,\n correlationId: this.correlationId,\n };\n }\n}\n\n/**\n * Step-up not configured error\n * Thrown when REQUIRE_STEP_UP is returned but SDK is not configured for step-up\n */\nexport class StepUpNotConfiguredError extends GateError {\n constructor(requestId?: string) {\n super(\n GateErrorCode.STEP_UP_NOT_CONFIGURED,\n 'Step-up is required but not configured in SDK. Enable step-up in client config or treat REQUIRE_STEP_UP as BLOCK.',\n { requestId }\n );\n this.name = 'StepUpNotConfiguredError';\n }\n}\n\n/**\n * Blocked error\n * Thrown when transaction is BLOCKED by Gate\n */\nexport class BlockIntelBlockedError extends GateError {\n public readonly receiptId?: string;\n public readonly reasonCode: string;\n\n constructor(\n reasonCode: string,\n receiptId?: string,\n correlationId?: string,\n requestId?: string\n ) {\n super(\n GateErrorCode.BLOCKED,\n `Transaction blocked: ${reasonCode}`,\n { correlationId, requestId, details: { reasonCode, receiptId } }\n );\n this.name = 'BlockIntelBlockedError';\n this.receiptId = receiptId;\n this.reasonCode = reasonCode;\n }\n}\n\n/**\n * Service unavailable error\n * Thrown when fail-safe mode is BLOCK_ON_TIMEOUT and service is unavailable\n */\nexport class BlockIntelUnavailableError extends GateError {\n constructor(message: string, requestId?: string) {\n super(GateErrorCode.SERVICE_UNAVAILABLE, message, { requestId });\n this.name = 'BlockIntelUnavailableError';\n }\n}\n\n/**\n * Auth error\n * Thrown on 401/403 - always fails CLOSED (never silently allows)\n */\nexport class BlockIntelAuthError extends GateError {\n constructor(message: string, status: number, requestId?: string) {\n super(\n status === 401 ? GateErrorCode.UNAUTHORIZED : GateErrorCode.FORBIDDEN,\n message,\n { status, requestId }\n );\n this.name = 'BlockIntelAuthError';\n }\n}\n\n/**\n * Step-up required error\n * Thrown when REQUIRE_STEP_UP is returned and step-up is enabled\n */\nexport class BlockIntelStepUpRequiredError extends GateError {\n public readonly stepUpRequestId: string;\n public readonly statusUrl?: string;\n public readonly expiresAtMs?: number;\n\n constructor(\n stepUpRequestId: string,\n statusUrl?: string,\n expiresAtMs?: number,\n requestId?: string\n ) {\n super(\n GateErrorCode.STEP_UP_NOT_CONFIGURED,\n 'Step-up approval required',\n {\n requestId,\n details: { stepUpRequestId, statusUrl, expiresAtMs },\n }\n );\n this.name = 'BlockIntelStepUpRequiredError';\n this.stepUpRequestId = stepUpRequestId;\n this.statusUrl = statusUrl;\n this.expiresAtMs = expiresAtMs;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Retry Logic\n * \n * Exponential backoff with jitter for retryable requests.\n */\n\nexport interface RetryOptions {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n}\n\nconst DEFAULT_RETRY_OPTIONS: Required<RetryOptions> = {\n maxAttempts: 3,\n baseDelayMs: 100,\n maxDelayMs: 800,\n factor: 2,\n};\n\n/**\n * Determine if an HTTP status code is retryable\n */\nexport function isRetryableStatus(status: number): boolean {\n // Retry on 429 (rate limit) and 5xx (server errors)\n return status === 429 || (status >= 500 && status < 600);\n}\n\n/**\n * Determine if an error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n // Network errors, timeouts, connection errors\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('network') ||\n message.includes('timeout') ||\n message.includes('connection') ||\n message.includes('econnrefused') ||\n message.includes('enotfound') ||\n message.includes('econnreset')\n );\n }\n return false;\n}\n\n/**\n * Calculate delay with exponential backoff and jitter\n */\nexport function calculateBackoffDelay(\n attempt: number,\n options: Required<RetryOptions>\n): number {\n const exponentialDelay = options.baseDelayMs * Math.pow(options.factor, attempt - 1);\n const jitter = Math.random() * 0.3 * exponentialDelay; // 0-30% jitter\n const delay = exponentialDelay + jitter;\n return Math.min(delay, options.maxDelayMs);\n}\n\n/**\n * Check if an error is a GateError with retryable status\n */\nfunction isRetryableGateError(error: unknown): boolean {\n if (error && typeof error === 'object' && 'code' in error) {\n const gateError = error as { code: string; status?: number };\n // Retry on SERVER_ERROR or RATE_LIMITED codes\n if (gateError.code === 'SERVER_ERROR' || gateError.code === 'RATE_LIMITED') {\n return true;\n }\n // Also check status if available\n if (gateError.status && isRetryableStatus(gateError.status)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retryWithBackoff<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const opts = { ...DEFAULT_RETRY_OPTIONS, ...options };\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Don't retry if we've exhausted attempts\n if (attempt >= opts.maxAttempts) {\n break;\n }\n\n // Don't retry on non-retryable Response errors\n if (error instanceof Response && !isRetryableStatus(error.status)) {\n throw error;\n }\n\n // Check if it's a retryable error (Response, network error, or GateError with retryable status)\n const isRetryable =\n (error instanceof Response && isRetryableStatus(error.status)) ||\n isRetryableError(error) ||\n isRetryableGateError(error);\n\n if (!isRetryable) {\n throw error;\n }\n\n // Wait before retrying\n const delay = calculateBackoffDelay(attempt, opts);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n\n","/**\n * BlockIntel Gate SDK - HTTP Client\n * \n * Fetch wrapper with timeout, retry, and error handling.\n */\n\nimport { GateError, GateErrorCode } from '../types/errors.js';\nimport { retryWithBackoff, isRetryableStatus, isRetryableError } from './retry.js';\n\nexport interface HttpClientConfig {\n baseUrl: string;\n timeoutMs?: number;\n userAgent?: string;\n retryOptions?: {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n factor?: number;\n };\n}\n\nexport interface RequestOptions {\n method: string;\n path: string;\n headers?: Record<string, string>;\n body?: unknown;\n requestId?: string;\n}\n\n/**\n * HTTP client with retry and timeout support\n */\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly userAgent: string;\n private readonly retryOptions: Parameters<typeof retryWithBackoff>[1];\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.timeoutMs = config.timeoutMs ?? 15000;\n this.userAgent = config.userAgent ?? 'blockintel-gate-sdk/0.1.0';\n this.retryOptions = config.retryOptions;\n\n // Validate baseUrl\n if (!this.baseUrl) {\n throw new Error('baseUrl is required');\n }\n\n // Validate HTTPS in production (allow http only for localhost)\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'production') {\n if (!this.baseUrl.startsWith('https://') && !this.baseUrl.includes('localhost')) {\n throw new Error('baseUrl must use HTTPS in production (except localhost)');\n }\n }\n }\n\n /**\n * Make an HTTP request with retry and timeout\n */\n async request<T>(options: RequestOptions): Promise<T> {\n const { method, path, headers = {}, body, requestId } = options;\n\n const url = `${this.baseUrl}${path}`;\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const response = await retryWithBackoff(\n async () => {\n const fetchOptions: RequestInit = {\n method,\n headers: {\n ...headers,\n 'User-Agent': this.userAgent,\n 'Content-Type': 'application/json',\n },\n signal: controller.signal,\n };\n\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const res = await fetch(url, fetchOptions);\n\n // Throw Response for retryable errors so retry logic can handle it\n if (!res.ok && isRetryableStatus(res.status)) {\n throw res;\n }\n\n // Don't retry non-retryable status codes\n if (!res.ok && !isRetryableStatus(res.status)) {\n throw res;\n }\n\n return res;\n },\n {\n ...this.retryOptions,\n // Custom retry logic that handles Response objects\n }\n );\n\n clearTimeout(timeoutId);\n\n // Parse response\n let data: T;\n const contentType = response.headers.get('content-type');\n\n if (contentType && contentType.includes('application/json')) {\n try {\n data = (await response.json()) as T;\n } catch (parseError) {\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n 'Failed to parse JSON response',\n {\n status: response.status,\n requestId,\n cause: parseError instanceof Error ? parseError : undefined,\n }\n );\n }\n } else {\n const text = await response.text();\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n `Unexpected content type: ${contentType}`,\n {\n status: response.status,\n details: { body: text.substring(0, 200) },\n requestId,\n }\n );\n }\n\n // Check for errors\n if (!response.ok) {\n const errorCode = this.statusToErrorCode(response.status);\n const correlationId = response.headers.get('X-Correlation-ID') ?? undefined;\n\n throw new GateError(errorCode, `HTTP ${response.status}: ${response.statusText}`, {\n status: response.status,\n correlationId,\n requestId,\n details: data as Record<string, unknown>,\n });\n }\n\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Handle abort (timeout)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new GateError(GateErrorCode.TIMEOUT, `Request timeout after ${this.timeoutMs}ms`, {\n requestId,\n });\n }\n\n // Handle Response errors (non-ok responses)\n if (error instanceof Response) {\n const errorCode = this.statusToErrorCode(error.status);\n const correlationId = error.headers.get('X-Correlation-ID') ?? undefined;\n\n let details: Record<string, unknown> | undefined;\n try {\n const text = await error.text();\n try {\n details = JSON.parse(text);\n } catch {\n details = { body: text.substring(0, 200) };\n }\n } catch {\n // Ignore parsing errors\n }\n\n throw new GateError(errorCode, `HTTP ${error.status}: ${error.statusText}`, {\n status: error.status,\n correlationId,\n requestId,\n details,\n });\n }\n\n // Handle network errors\n if (isRetryableError(error)) {\n throw new GateError(\n GateErrorCode.NETWORK_ERROR,\n `Network error: ${error instanceof Error ? error.message : String(error)}`,\n {\n requestId,\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n\n // Re-throw GateError as-is\n if (error instanceof GateError) {\n throw error;\n }\n\n // Unknown error\n throw new GateError(\n GateErrorCode.NETWORK_ERROR,\n `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,\n {\n requestId,\n cause: error instanceof Error ? error : undefined,\n }\n );\n }\n }\n\n /**\n * Map HTTP status code to GateErrorCode\n */\n private statusToErrorCode(status: number): GateErrorCode {\n if (status === 401) return GateErrorCode.UNAUTHORIZED;\n if (status === 403) return GateErrorCode.FORBIDDEN;\n if (status === 404) return GateErrorCode.NOT_FOUND;\n if (status === 429) return GateErrorCode.RATE_LIMITED;\n if (status >= 500 && status < 600) return GateErrorCode.SERVER_ERROR;\n return GateErrorCode.NETWORK_ERROR;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Time Utilities\n */\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function nowMs(): number {\n return Date.now();\n}\n\n/**\n * Get current timestamp in seconds (epoch)\n */\nexport function nowEpochSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Clamp a value between min and max\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Sleep for specified milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n","/**\n * BlockIntel Gate SDK - Step-Up Polling\n * \n * Polls Gate Hot Path step-up status endpoint until decision is reached.\n */\n\nimport { GateError, GateErrorCode } from '../types/errors.js';\nimport { StepUpStatusResponse, GateStepUpStatus, StepUpFinalResult } from '../types/contracts.js';\nimport { nowEpochSeconds, clamp, sleep } from '../utils/time.js';\nimport { HttpClient } from '../http/HttpClient.js';\n\nexport interface StepUpPollingConfig {\n httpClient: HttpClient;\n tenantId: string;\n pollingIntervalMs?: number;\n maxWaitMs?: number;\n ttlMinSeconds?: number;\n ttlMaxSeconds?: number;\n ttlDefaultSeconds?: number;\n}\n\nconst DEFAULT_POLLING_INTERVAL_MS = 250;\nconst DEFAULT_MAX_WAIT_MS = 15000;\nconst DEFAULT_TTL_MIN_SECONDS = 300;\nconst DEFAULT_TTL_MAX_SECONDS = 900;\nconst DEFAULT_TTL_DEFAULT_SECONDS = 600;\n\n/**\n * Step-up polling helper\n */\nexport class StepUpPoller {\n private readonly httpClient: HttpClient;\n private readonly tenantId: string;\n private readonly pollingIntervalMs: number;\n private readonly maxWaitMs: number;\n private readonly ttlMinSeconds: number;\n private readonly ttlMaxSeconds: number;\n private readonly ttlDefaultSeconds: number;\n\n constructor(config: StepUpPollingConfig) {\n this.httpClient = config.httpClient;\n this.tenantId = config.tenantId;\n this.pollingIntervalMs = config.pollingIntervalMs ?? DEFAULT_POLLING_INTERVAL_MS;\n this.maxWaitMs = config.maxWaitMs ?? DEFAULT_MAX_WAIT_MS;\n this.ttlMinSeconds = config.ttlMinSeconds ?? DEFAULT_TTL_MIN_SECONDS;\n this.ttlMaxSeconds = config.ttlMaxSeconds ?? DEFAULT_TTL_MAX_SECONDS;\n this.ttlDefaultSeconds = config.ttlDefaultSeconds ?? DEFAULT_TTL_DEFAULT_SECONDS;\n }\n\n /**\n * Get current step-up status\n */\n async getStatus(requestId: string): Promise<StepUpStatusResponse> {\n const path = `/defense/stepup/status?tenantId=${encodeURIComponent(this.tenantId)}&requestId=${encodeURIComponent(requestId)}`;\n\n try {\n // API returns snake_case, convert to camelCase\n const apiResponse = await this.httpClient.request<\n StepUpStatusResponse & {\n tenant_id?: string;\n request_id?: string;\n reason_codes?: string[];\n correlation_id?: string;\n expires_at_ms?: number;\n }\n >({\n method: 'GET',\n path,\n requestId,\n });\n\n const response: StepUpStatusResponse = {\n status: apiResponse.status,\n tenantId: apiResponse.tenant_id ?? apiResponse.tenantId,\n requestId: apiResponse.request_id ?? apiResponse.requestId,\n decision: apiResponse.decision,\n reasonCodes: apiResponse.reason_codes ?? apiResponse.reasonCodes,\n correlationId: apiResponse.correlation_id ?? apiResponse.correlationId,\n expiresAtMs: apiResponse.expires_at_ms ?? apiResponse.expiresAtMs,\n ttl: apiResponse.ttl,\n };\n\n // Check if expired based on TTL\n const now = nowEpochSeconds();\n if (response.ttl !== undefined && response.ttl <= now) {\n return {\n ...response,\n status: 'EXPIRED',\n };\n }\n\n return response;\n } catch (error) {\n if (error instanceof GateError && error.code === GateErrorCode.NOT_FOUND) {\n throw new GateError(\n GateErrorCode.NOT_FOUND,\n `Step-up request not found: ${requestId}`,\n { requestId }\n );\n }\n throw error;\n }\n }\n\n /**\n * Wait for step-up decision with polling\n * \n * Polls until status is APPROVED, DENIED, or EXPIRED, or timeout is reached.\n */\n async awaitDecision(\n requestId: string,\n options?: { maxWaitMs?: number; intervalMs?: number }\n ): Promise<StepUpFinalResult> {\n const startTime = Date.now();\n const maxWaitMs = options?.maxWaitMs ?? this.maxWaitMs;\n const intervalMs = options?.intervalMs ?? this.pollingIntervalMs;\n\n while (true) {\n const elapsedMs = Date.now() - startTime;\n\n // Check timeout\n if (elapsedMs >= maxWaitMs) {\n throw new GateError(\n GateErrorCode.STEP_UP_TIMEOUT,\n `Step-up decision timeout after ${maxWaitMs}ms`,\n { requestId }\n );\n }\n\n try {\n const status = await this.getStatus(requestId);\n\n // Check if expired\n const now = nowEpochSeconds();\n if (status.ttl !== undefined && status.ttl <= now) {\n return {\n status: 'EXPIRED',\n requestId,\n elapsedMs,\n correlationId: status.correlationId,\n };\n }\n\n // Check if decision reached\n if (\n status.status === 'APPROVED' ||\n status.status === 'DENIED' ||\n status.status === 'EXPIRED'\n ) {\n return {\n status: status.status,\n requestId,\n elapsedMs,\n decision: status.decision,\n reasonCodes: status.reasonCodes,\n correlationId: status.correlationId,\n };\n }\n\n // Status is PENDING, wait and poll again\n await sleep(intervalMs);\n } catch (error) {\n // If NOT_FOUND, throw immediately (don't retry)\n if (error instanceof GateError && error.code === GateErrorCode.NOT_FOUND) {\n throw error;\n }\n\n // For other errors, wait and retry\n // But still respect timeout\n const remainingMs = maxWaitMs - (Date.now() - startTime);\n if (remainingMs <= 0) {\n throw new GateError(\n GateErrorCode.STEP_UP_TIMEOUT,\n `Step-up decision timeout after ${maxWaitMs}ms`,\n { requestId, cause: error instanceof Error ? error : undefined }\n );\n }\n\n await sleep(Math.min(intervalMs, remainingMs));\n }\n }\n }\n\n /**\n * Clamp TTL to guardrails\n */\n clampTtl(ttlSeconds?: number): number {\n if (ttlSeconds === undefined) {\n return this.ttlDefaultSeconds;\n }\n return clamp(ttlSeconds, this.ttlMinSeconds, this.ttlMaxSeconds);\n }\n}\n\n","/**\n * Circuit Breaker for SDK\n * \n * Prevents cascading failures by opening the circuit after consecutive failures.\n */\n\nexport type CircuitState = 'CLOSED' | 'OPEN' | 'HALF_OPEN';\n\nexport interface CircuitBreakerConfig {\n tripAfterConsecutiveFailures?: number; // Default: 5\n coolDownMs?: number; // Default: 30000 (30 seconds)\n}\n\nexport interface CircuitBreakerMetrics {\n failures: number;\n successes: number;\n state: CircuitState;\n lastFailureTime?: number;\n lastSuccessTime?: number;\n tripsToOpen: number;\n}\n\n/**\n * Circuit Breaker implementation\n */\nexport class CircuitBreaker {\n private state: CircuitState = 'CLOSED';\n private failures = 0;\n private successes = 0;\n private lastFailureTime?: number;\n private lastSuccessTime?: number;\n private tripsToOpen = 0;\n \n private readonly tripThreshold: number;\n private readonly coolDownMs: number;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.tripThreshold = config.tripAfterConsecutiveFailures ?? 5;\n this.coolDownMs = config.coolDownMs ?? 30000; // 30 seconds\n }\n\n /**\n * Execute function with circuit breaker protection\n */\n async execute<T>(fn: () => Promise<T>): Promise<T> {\n // Check if circuit should transition from OPEN to HALF_OPEN\n if (this.state === 'OPEN') {\n const now = Date.now();\n const timeSinceLastFailure = this.lastFailureTime \n ? now - this.lastFailureTime \n : Infinity;\n \n if (timeSinceLastFailure >= this.coolDownMs) {\n this.state = 'HALF_OPEN';\n this.failures = 0; // Reset failures for half-open probe\n } else {\n throw new CircuitBreakerOpenError(\n `Circuit breaker is OPEN. Will retry after ${this.coolDownMs - timeSinceLastFailure}ms`\n );\n }\n }\n\n try {\n const result = await fn();\n this.onSuccess();\n return result;\n } catch (error) {\n this.onFailure();\n throw error;\n }\n }\n\n private onSuccess(): void {\n this.successes++;\n this.lastSuccessTime = Date.now();\n\n if (this.state === 'HALF_OPEN') {\n // Successful probe - close circuit\n this.state = 'CLOSED';\n this.failures = 0;\n } else if (this.state === 'CLOSED') {\n // Success in closed state - reset failure count\n this.failures = 0;\n }\n }\n\n private onFailure(): void {\n this.failures++;\n this.lastFailureTime = Date.now();\n\n if (this.state === 'HALF_OPEN') {\n // Failed probe - open circuit again\n this.state = 'OPEN';\n this.tripsToOpen++;\n } else if (this.state === 'CLOSED' && this.failures >= this.tripThreshold) {\n // Too many failures - open circuit\n this.state = 'OPEN';\n this.tripsToOpen++;\n }\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): CircuitBreakerMetrics {\n return {\n failures: this.failures,\n successes: this.successes,\n state: this.state,\n lastFailureTime: this.lastFailureTime,\n lastSuccessTime: this.lastSuccessTime,\n tripsToOpen: this.tripsToOpen,\n };\n }\n\n /**\n * Reset circuit breaker to CLOSED state\n */\n reset(): void {\n this.state = 'CLOSED';\n this.failures = 0;\n this.successes = 0;\n this.lastFailureTime = undefined;\n this.lastSuccessTime = undefined;\n this.tripsToOpen = 0;\n }\n}\n\n/**\n * Circuit Breaker Open Error\n */\nexport class CircuitBreakerOpenError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\n","/**\n * Metrics Collector for SDK\n * \n * Collects counters and latency metrics for observability.\n */\n\nexport interface Metrics {\n requestsTotal: number;\n allowedTotal: number;\n blockedTotal: number;\n stepupTotal: number;\n timeoutsTotal: number;\n errorsTotal: number;\n circuitBreakerOpenTotal: number;\n latencyMs: number[]; // Histogram samples\n}\n\nexport type MetricsHook = (metrics: Metrics) => void | Promise<void>;\n\n/**\n * Metrics Collector\n */\nexport class MetricsCollector {\n private requestsTotal = 0;\n private allowedTotal = 0;\n private blockedTotal = 0;\n private stepupTotal = 0;\n private timeoutsTotal = 0;\n private errorsTotal = 0;\n private circuitBreakerOpenTotal = 0;\n private latencyMs: number[] = [];\n\n private readonly maxSamples = 1000; // Keep last 1000 samples\n private readonly hooks: MetricsHook[] = [];\n\n /**\n * Record a request\n */\n recordRequest(decision: 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP', latencyMs: number): void {\n this.requestsTotal++;\n \n if (decision === 'ALLOW') {\n this.allowedTotal++;\n } else if (decision === 'BLOCK') {\n this.blockedTotal++;\n } else if (decision === 'REQUIRE_STEP_UP') {\n this.stepupTotal++;\n }\n\n // Add latency sample (keep rolling window)\n this.latencyMs.push(latencyMs);\n if (this.latencyMs.length > this.maxSamples) {\n this.latencyMs.shift(); // Remove oldest sample\n }\n\n this.emitMetrics();\n }\n\n /**\n * Record a timeout\n */\n recordTimeout(): void {\n this.timeoutsTotal++;\n this.errorsTotal++;\n this.emitMetrics();\n }\n\n /**\n * Record an error\n */\n recordError(): void {\n this.errorsTotal++;\n this.emitMetrics();\n }\n\n /**\n * Record circuit breaker open\n */\n recordCircuitBreakerOpen(): void {\n this.circuitBreakerOpenTotal++;\n this.emitMetrics();\n }\n\n /**\n * Get current metrics snapshot\n */\n getMetrics(): Metrics {\n return {\n requestsTotal: this.requestsTotal,\n allowedTotal: this.allowedTotal,\n blockedTotal: this.blockedTotal,\n stepupTotal: this.stepupTotal,\n timeoutsTotal: this.timeoutsTotal,\n errorsTotal: this.errorsTotal,\n circuitBreakerOpenTotal: this.circuitBreakerOpenTotal,\n latencyMs: [...this.latencyMs], // Copy array\n };\n }\n\n /**\n * Register a metrics hook (e.g., for Prometheus/OpenTelemetry export)\n */\n registerHook(hook: MetricsHook): void {\n this.hooks.push(hook);\n }\n\n /**\n * Emit metrics to all registered hooks\n */\n private emitMetrics(): void {\n const metrics = this.getMetrics();\n for (const hook of this.hooks) {\n try {\n hook(metrics);\n } catch (error) {\n // Don't throw - metrics hooks should not break SDK\n console.error('Error in metrics hook:', error);\n }\n }\n }\n\n /**\n * Reset all metrics\n */\n reset(): void {\n this.requestsTotal = 0;\n this.allowedTotal = 0;\n this.blockedTotal = 0;\n this.stepupTotal = 0;\n this.timeoutsTotal = 0;\n this.errorsTotal = 0;\n this.circuitBreakerOpenTotal = 0;\n this.latencyMs = [];\n }\n}\n\n","/**\n * BlockIntel Gate SDK - AWS SDK v3 KMS Wrapper\n * \n * Wraps AWS SDK v3 KMSClient to intercept SignCommand calls and enforce Gate policies.\n */\n\nimport { KMSClient, SignCommand, SignCommandInput } from '@aws-sdk/client-kms';\nimport { GateClient } from '../client/GateClient.js';\nimport { BlockIntelBlockedError, BlockIntelStepUpRequiredError } from '../types/errors.js';\nimport { createHash } from 'crypto';\n\n/**\n * KMS wrapper options\n */\nexport interface WrapKmsClientOptions {\n /**\n * Wrapper mode\n * - \"enforce\": Block if Gate denies, require step-up approval\n * - \"dry-run\": Evaluate but always allow KMS call (for testing)\n */\n mode?: 'enforce' | 'dry-run';\n\n /**\n * Callback invoked when a decision is made\n */\n onDecision?: (decision: 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP', details: any) => void;\n\n /**\n * Custom hook to extract transaction intent from SignCommand\n * If not provided, uses default extraction (minimal txIntent from message hash)\n */\n extractTxIntent?: (command: SignCommandInput) => {\n toAddress?: string;\n networkFamily?: 'EVM' | 'BTC' | 'SOL' | 'OTHER';\n chainId?: number;\n [key: string]: any;\n };\n}\n\n/**\n * Wrapped KMS client type (proxy that intercepts send calls)\n */\nexport interface WrappedKmsClient extends KMSClient {\n /**\n * Intercepted send method (overrides KMSClient.send)\n */\n send<T>(command: T): Promise<any>;\n\n /**\n * Original KMS client (for fallback or direct access)\n */\n _originalClient: KMSClient;\n\n /**\n * Gate client used for evaluation\n */\n _gateClient: GateClient;\n\n /**\n * Wrapper options\n */\n _wrapperOptions: Required<WrapKmsClientOptions>;\n}\n\n/**\n * Wrap AWS SDK v3 KMS client to intercept SignCommand calls\n * \n * @param kmsClient - AWS SDK v3 KMSClient instance\n * @param gateClient - Gate client for evaluation\n * @param options - Wrapper options\n * @returns Proxy object that intercepts send() calls\n * \n * @example\n * ```typescript\n * import { KMSClient } from '@aws-sdk/client-kms';\n * import { GateClient, wrapKmsClient } from 'blockintel-gate-sdk';\n * \n * const kms = new KMSClient({});\n * const gate = new GateClient({\n * baseUrl: process.env.GATE_BASE_URL!,\n * tenantId: process.env.GATE_TENANT_ID!,\n * auth: { mode: 'hmac', keyId: process.env.GATE_KEY_ID!, secret: process.env.GATE_HMAC_SECRET! },\n * });\n * \n * const protectedKms = wrapKmsClient(kms, gate);\n * \n * // Now calls to protectedKms.send(new SignCommand(...)) will be intercepted\n * const result = await protectedKms.send(new SignCommand({\n * KeyId: 'alias/my-key',\n * Message: Buffer.from('...'),\n * MessageType: 'RAW',\n * SigningAlgorithm: 'ECDSA_SHA_256',\n * }));\n * ```\n */\nexport function wrapKmsClient(\n kmsClient: KMSClient,\n gateClient: GateClient,\n options: WrapKmsClientOptions = {}\n): WrappedKmsClient {\n const defaultOptions: Required<WrapKmsClientOptions> = {\n mode: options.mode || 'enforce',\n onDecision: options.onDecision || (() => {}),\n extractTxIntent: options.extractTxIntent || defaultExtractTxIntent,\n };\n\n // Create proxy that intercepts send() calls\n const wrapped = new Proxy(kmsClient, {\n get(target, prop, receiver) {\n if (prop === 'send') {\n // Intercept send() method\n return async function (command: any) {\n // Check if this is a SignCommand\n if (command && command.constructor && command.constructor.name === 'SignCommand') {\n return await handleSignCommand(\n command,\n target as KMSClient,\n gateClient,\n defaultOptions\n );\n }\n\n // Not a SignCommand - pass through to original client\n return await (target as any).send(command);\n };\n }\n\n // All other properties pass through\n return Reflect.get(target, prop, receiver);\n },\n }) as WrappedKmsClient;\n\n // Attach metadata for introspection\n wrapped._originalClient = kmsClient;\n wrapped._gateClient = gateClient;\n wrapped._wrapperOptions = defaultOptions;\n\n return wrapped;\n}\n\n/**\n * Default transaction intent extraction from SignCommand\n * \n * Extracts minimal txIntent from KMS SignCommand:\n * - Uses Message hash as payloadHash\n * - Sets networkFamily to 'OTHER' (unknown)\n * - Sets signerId from KeyId\n */\nfunction defaultExtractTxIntent(command: SignCommandInput): {\n toAddress?: string;\n networkFamily?: 'EVM' | 'BTC' | 'SOL' | 'OTHER';\n chainId?: number;\n payloadHash?: string;\n dataHash?: string;\n [key: string]: any;\n} {\n // Compute SHA256 hash of message\n // SignCommand.Message can be accessed via input property or directly\n const message = (command as any).input?.Message ?? (command as any).Message;\n if (!message) {\n throw new Error('SignCommand missing required Message property');\n }\n const messageBuffer = message instanceof Buffer \n ? message \n : Buffer.from(message as any);\n const messageHash = createHash('sha256').update(messageBuffer).digest('hex');\n\n return {\n networkFamily: 'OTHER',\n toAddress: undefined, // Unknown from KMS message alone\n payloadHash: messageHash,\n dataHash: messageHash, // Backward compatibility\n };\n}\n\n/**\n * Handle intercepted SignCommand\n */\nasync function handleSignCommand(\n command: SignCommandInput,\n originalClient: KMSClient,\n gateClient: GateClient,\n options: Required<WrapKmsClientOptions>\n): Promise<any> {\n // Extract transaction intent\n const txIntent = options.extractTxIntent(command);\n\n // Extract signer ID from KeyId\n // SignCommand.KeyId can be accessed via input property or directly\n const signerId = (command as any).input?.KeyId ?? (command as any).KeyId ?? 'unknown';\n\n // Build signing context\n const signingContext = {\n signerId,\n actorPrincipal: 'kms-signer', // Default - can be customized via extractTxIntent\n };\n\n try {\n // Call Gate evaluate()\n const decision = await gateClient.evaluate({\n txIntent: txIntent as any, // Type assertion - txIntent may have extra fields\n signingContext,\n });\n\n // Decision is ALLOW (evaluate() doesn't throw)\n options.onDecision('ALLOW', { decision, signerId, command });\n\n if (options.mode === 'dry-run') {\n // Dry-run mode: evaluate but still allow\n return await originalClient.send(new SignCommand(command));\n }\n\n // Enforce mode: forward to real KMS\n return await originalClient.send(new SignCommand(command));\n } catch (error: any) {\n // Handle Gate errors\n if (error instanceof BlockIntelBlockedError) {\n options.onDecision('BLOCK', { error, signerId, command });\n throw error; // Re-throw to block KMS call\n }\n\n if (error instanceof BlockIntelStepUpRequiredError) {\n options.onDecision('REQUIRE_STEP_UP', { error, signerId, command });\n throw error; // Re-throw to prevent KMS call until step-up approved\n }\n\n // Other errors (network, auth, etc.) - re-throw\n throw error;\n }\n}\n\n","/**\n * BlockIntel Gate SDK - Gate Client\n * \n * Main client for interacting with Gate Hot Path API.\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { HmacSigner } from '../auth/HmacSigner.js';\nimport { ApiKeyAuth } from '../auth/ApiKeyAuth.js';\nimport { HttpClient } from '../http/HttpClient.js';\nimport { StepUpPoller } from '../stepup/stepup.js';\nimport {\n GateClientConfig,\n DefenseEvaluateRequestV2,\n DefenseEvaluateResponseV2,\n StepUpStatusResponse,\n StepUpFinalResult,\n} from '../types/contracts.js';\nimport {\n GateError,\n GateErrorCode,\n StepUpNotConfiguredError,\n BlockIntelBlockedError,\n BlockIntelUnavailableError,\n BlockIntelAuthError,\n BlockIntelStepUpRequiredError,\n} from '../types/errors.js';\nimport { CircuitBreaker, CircuitBreakerOpenError } from '../circuit/CircuitBreaker.js';\nimport { MetricsCollector } from '../metrics/MetricsCollector.js';\nimport { nowMs } from '../utils/time.js';\nimport { wrapKmsClient, WrapKmsClientOptions, WrappedKmsClient } from '../kms/wrapAwsSdkV3KmsClient.js';\n\n/**\n * Gate Client for Hot Path API\n */\nexport class GateClient {\n private readonly config: GateClientConfig;\n private readonly httpClient: HttpClient;\n private readonly hmacSigner?: HmacSigner;\n private readonly apiKeyAuth?: ApiKeyAuth;\n private readonly stepUpPoller?: StepUpPoller;\n private readonly circuitBreaker?: CircuitBreaker;\n private readonly metrics: MetricsCollector;\n\n constructor(config: GateClientConfig) {\n this.config = config;\n\n // Initialize auth\n if (config.auth.mode === 'hmac') {\n this.hmacSigner = new HmacSigner({\n keyId: config.auth.keyId,\n secret: config.auth.secret,\n });\n } else {\n this.apiKeyAuth = new ApiKeyAuth({\n apiKey: config.auth.apiKey,\n });\n }\n\n // Initialize HTTP client\n this.httpClient = new HttpClient({\n baseUrl: config.baseUrl,\n timeoutMs: config.timeoutMs,\n userAgent: config.userAgent,\n });\n\n // Initialize step-up poller if enabled\n if (config.enableStepUp) {\n this.stepUpPoller = new StepUpPoller({\n httpClient: this.httpClient,\n tenantId: config.tenantId,\n pollingIntervalMs: config.stepUp?.pollingIntervalMs,\n maxWaitMs: config.stepUp?.maxWaitMs,\n });\n }\n\n // Initialize circuit breaker if configured\n if (config.circuitBreaker) {\n this.circuitBreaker = new CircuitBreaker(config.circuitBreaker);\n }\n\n // Initialize metrics collector\n this.metrics = new MetricsCollector();\n if (config.onMetrics) {\n this.metrics.registerHook(config.onMetrics);\n }\n }\n\n /**\n * Evaluate a transaction defense request\n * \n * Implements:\n * - Circuit breaker protection\n * - Fail-safe modes (ALLOW_ON_TIMEOUT, BLOCK_ON_TIMEOUT, BLOCK_ON_ANOMALY)\n * - Metrics collection\n * - Error handling (BLOCK → BlockIntelBlockedError, REQUIRE_STEP_UP → BlockIntelStepUpRequiredError)\n */\n async evaluate(\n req: DefenseEvaluateRequestV2,\n opts?: { requestId?: string }\n ): Promise<DefenseEvaluateResponseV2> {\n const requestId = opts?.requestId ?? uuidv4();\n const timestampMs = req.timestampMs ?? nowMs();\n const startTime = Date.now();\n const failSafeMode = this.config.failSafeMode ?? 'ALLOW_ON_TIMEOUT';\n\n // Wrap request with circuit breaker if enabled\n const executeRequest = async (): Promise<DefenseEvaluateResponseV2> => {\n // Transform txIntent: map 'to' to 'toAddress', add 'networkFamily' if missing\n const txIntent: any = { ...req.txIntent };\n // Map 'to' to 'toAddress' (Hot Path expects toAddress, not to)\n if (txIntent.to && !txIntent.toAddress) {\n txIntent.toAddress = txIntent.to;\n delete txIntent.to; // Remove 'to' to avoid duplicate fields in canonical JSON\n }\n // Infer networkFamily from chainId if not provided\n if (!txIntent.networkFamily && txIntent.chainId) {\n txIntent.networkFamily = 'EVM';\n }\n // Remove 'from' if present (Hot Path doesn't use it in v2 contract)\n if (txIntent.from && !txIntent.fromAddress) {\n delete txIntent.from;\n }\n \n // Ensure signingContext has actorPrincipal (required by Hot Path)\n const signingContext: any = {\n ...req.signingContext,\n actorPrincipal: req.signingContext?.actorPrincipal || req.signingContext?.signerId || 'unknown',\n };\n \n // Prepare request body (Hot Path expects camelCase at top level)\n const body: any = {\n requestId: requestId,\n tenantId: this.config.tenantId,\n timestampMs: timestampMs,\n txIntent: txIntent,\n signingContext: signingContext,\n // Add SDK info (required by Hot Path validation)\n sdk: {\n name: 'blockintel-gate-sdk',\n version: '0.1.0',\n },\n };\n\n // Prepare headers (required headers are automatically added by ApiKeyAuth/HmacSigner)\n let headers: Record<string, string>;\n\n if (this.hmacSigner) {\n const hmacHeaders = await this.hmacSigner.signRequest({\n method: 'POST',\n path: '/defense/evaluate',\n tenantId: this.config.tenantId,\n timestampMs,\n requestId,\n body,\n });\n headers = { ...hmacHeaders };\n } else if (this.apiKeyAuth) {\n const apiKeyHeaders = this.apiKeyAuth.createHeaders({\n tenantId: this.config.tenantId,\n timestampMs,\n requestId,\n });\n headers = { ...apiKeyHeaders };\n } else {\n throw new Error('No authentication configured');\n }\n\n // Make request (API returns { success: true, data: { ... } } format)\n const apiResponse = await this.httpClient.request<{\n success: boolean;\n data?: DefenseEvaluateResponseV2 & {\n reason_codes?: string[];\n policy_version?: string;\n correlation_id?: string;\n step_up?: {\n request_id?: string;\n ttl_seconds?: number;\n expires_at_ms?: number;\n };\n };\n error?: any;\n }>({\n method: 'POST',\n path: '/defense/evaluate',\n headers,\n body,\n requestId,\n });\n\n // Extract data from wrapped response (Hot Path returns { success: true, data: { ... } })\n if (!apiResponse.success || !apiResponse.data) {\n throw new GateError(\n GateErrorCode.INVALID_RESPONSE,\n 'Invalid response format: expected { success: true, data: { ... } }',\n {\n requestId,\n details: apiResponse,\n }\n );\n }\n\n const responseData = apiResponse.data;\n\n // Convert snake_case to camelCase if needed\n const result: DefenseEvaluateResponseV2 = {\n decision: responseData.decision as 'ALLOW' | 'BLOCK' | 'REQUIRE_STEP_UP',\n reasonCodes: responseData.reason_codes ?? responseData.reasonCodes ?? [],\n policyVersion: responseData.policy_version ?? responseData.policyVersion,\n correlationId: responseData.correlation_id ?? responseData.correlationId,\n stepUp: responseData.step_up\n ? {\n requestId: responseData.step_up.request_id ?? (responseData.stepUp?.requestId ?? ''),\n ttlSeconds: responseData.step_up.ttl_seconds ?? responseData.stepUp?.ttlSeconds,\n }\n : responseData.stepUp,\n };\n\n const latencyMs = Date.now() - startTime;\n\n // Handle decision types\n if (result.decision === 'BLOCK') {\n // BLOCK → throw BlockIntelBlockedError\n const receiptId = (responseData as any).decision_id || requestId;\n const reasonCode = result.reasonCodes[0] || 'POLICY_VIOLATION';\n this.metrics.recordRequest('BLOCK', latencyMs);\n throw new BlockIntelBlockedError(reasonCode, receiptId, result.correlationId, requestId);\n }\n\n if (result.decision === 'REQUIRE_STEP_UP') {\n // REQUIRE_STEP_UP handling\n if (this.config.enableStepUp && this.stepUpPoller && result.stepUp) {\n // Step-up is enabled - throw BlockIntelStepUpRequiredError\n const stepUpRequestId = result.stepUp.requestId || requestId;\n const expiresAtMs = (responseData.step_up as any)?.expires_at_ms;\n const statusUrl = `/defense/stepup/status?tenantId=${this.config.tenantId}&requestId=${stepUpRequestId}`;\n this.metrics.recordRequest('REQUIRE_STEP_UP', latencyMs);\n throw new BlockIntelStepUpRequiredError(stepUpRequestId, statusUrl, expiresAtMs, requestId);\n } else {\n // Step-up not enabled - treat as BLOCK\n const receiptId = (responseData as any).decision_id || requestId;\n const reasonCode = 'STEPUP_REQUIRED';\n this.metrics.recordRequest('BLOCK', latencyMs);\n throw new BlockIntelBlockedError(reasonCode, receiptId, result.correlationId, requestId);\n }\n }\n\n // ALLOW - record metrics and return\n this.metrics.recordRequest('ALLOW', latencyMs);\n return result;\n };\n\n // Execute with circuit breaker if enabled\n try {\n if (this.circuitBreaker) {\n return await this.circuitBreaker.execute(executeRequest);\n }\n return await executeRequest();\n } catch (error: any) {\n const latencyMs = Date.now() - startTime;\n\n // Handle circuit breaker open\n if (error instanceof CircuitBreakerOpenError) {\n this.metrics.recordCircuitBreakerOpen();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw error;\n }\n\n // Handle auth failures (401/403) - always fail CLOSED (BLOCK)\n if (error instanceof GateError && (error.code === GateErrorCode.UNAUTHORIZED || error.code === GateErrorCode.FORBIDDEN)) {\n this.metrics.recordError();\n throw new BlockIntelAuthError(\n error.message,\n error.status || 401,\n requestId\n );\n }\n\n // Handle timeout errors\n if (error instanceof GateError && error.code === GateErrorCode.TIMEOUT) {\n this.metrics.recordTimeout();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw new BlockIntelUnavailableError(`Service timeout: ${error.message}`, requestId);\n }\n\n // Handle 5xx server errors - treat as timeout bucket for fail-safe\n if (error instanceof GateError && error.code === GateErrorCode.SERVER_ERROR) {\n this.metrics.recordError();\n const failSafeResult = this.handleFailSafe(failSafeMode, error, requestId);\n if (failSafeResult) {\n return failSafeResult;\n }\n throw error;\n }\n\n // Re-throw BlockIntelBlockedError and BlockIntelStepUpRequiredError as-is\n if (error instanceof BlockIntelBlockedError || error instanceof BlockIntelStepUpRequiredError) {\n throw error;\n }\n\n // Other errors - record and re-throw\n this.metrics.recordError();\n throw error;\n }\n }\n\n /**\n * Handle fail-safe modes for timeouts/errors\n */\n private handleFailSafe(\n mode: 'ALLOW_ON_TIMEOUT' | 'BLOCK_ON_TIMEOUT' | 'BLOCK_ON_ANOMALY',\n error: Error,\n requestId: string\n ): DefenseEvaluateResponseV2 | null {\n if (mode === 'ALLOW_ON_TIMEOUT') {\n // Trading bots: ALLOW on timeout with degraded flag\n // TODO: Attach header \"X-BlockIntel-Degraded: true\" to logs if possible\n return {\n decision: 'ALLOW',\n reasonCodes: ['FAIL_SAFE_ALLOW'],\n correlationId: requestId,\n };\n }\n\n if (mode === 'BLOCK_ON_TIMEOUT') {\n // Fail CLOSED - don't return, let error propagate\n return null;\n }\n\n if (mode === 'BLOCK_ON_ANOMALY') {\n // BLOCK only on explicit BLOCK/REQUIRE_STEP_UP decisions, not network hiccups\n // On timeout: ALLOW gracefully\n return {\n decision: 'ALLOW',\n reasonCodes: ['FAIL_SAFE_ALLOW'],\n correlationId: requestId,\n };\n }\n\n return null;\n }\n\n /**\n * Get current metrics\n */\n getMetrics(): ReturnType<MetricsCollector['getMetrics']> {\n return this.metrics.getMetrics();\n }\n\n /**\n * Get circuit breaker metrics (if enabled)\n */\n getCircuitBreakerMetrics(): ReturnType<CircuitBreaker['getMetrics']> | null {\n return this.circuitBreaker?.getMetrics() || null;\n }\n\n /**\n * Get step-up status\n */\n async getStepUpStatus(args: {\n requestId: string;\n tenantId?: string;\n }): Promise<StepUpStatusResponse> {\n if (!this.stepUpPoller) {\n throw new StepUpNotConfiguredError(args.requestId);\n }\n\n const tenantId = args.tenantId ?? this.config.tenantId;\n const poller = new StepUpPoller({\n httpClient: this.httpClient,\n tenantId,\n pollingIntervalMs: this.config.stepUp?.pollingIntervalMs,\n maxWaitMs: this.config.stepUp?.maxWaitMs,\n });\n\n return poller.getStatus(args.requestId);\n }\n\n /**\n * Wait for step-up decision with polling\n */\n async awaitStepUpDecision(args: {\n requestId: string;\n maxWaitMs?: number;\n intervalMs?: number;\n }): Promise<StepUpFinalResult> {\n if (!this.stepUpPoller) {\n throw new StepUpNotConfiguredError(args.requestId);\n }\n\n return this.stepUpPoller.awaitDecision(args.requestId, {\n maxWaitMs: args.maxWaitMs ?? this.config.stepUp?.maxWaitMs,\n intervalMs: args.intervalMs ?? this.config.stepUp?.pollingIntervalMs,\n });\n }\n\n /**\n * Wrap AWS SDK v3 KMS client to intercept SignCommand calls\n * \n * @param kmsClient - AWS SDK v3 KMSClient instance\n * @param options - Wrapper options\n * @returns Wrapped KMS client that enforces Gate policies\n * \n * @example\n * ```typescript\n * import { KMSClient } from '@aws-sdk/client-kms';\n * \n * const kms = new KMSClient({});\n * const protectedKms = gateClient.wrapKmsClient(kms);\n * \n * // Now SignCommand calls will be intercepted and evaluated by Gate\n * const result = await protectedKms.send(new SignCommand({ ... }));\n * ```\n */\n wrapKmsClient<T extends typeof import('@aws-sdk/client-kms').KMSClient>(\n kmsClient: InstanceType<T>,\n options?: WrapKmsClientOptions\n ): WrappedKmsClient {\n return wrapKmsClient(kmsClient as any, this, options);\n }\n}\n\n/**\n * Create a Gate client instance\n */\nexport function createGateClient(config: GateClientConfig): GateClient {\n return new GateClient(config);\n}\n\n"]}