@legalize-dev/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/retry.ts","../src/errors.ts","../src/env.ts","../src/resources/countries.ts","../src/resources/jurisdictions.ts","../src/pagination.ts","../src/resources/laws.ts","../src/resources/lawTypes.ts","../src/resources/reforms.ts","../src/resources/stats.ts","../src/resources/webhooks.ts","../src/version.ts","../src/client.ts","../src/webhooks.ts"],"names":["API","shouldRetry","delay"],"mappings":";;;;;;AAkBO,IAAM,mBAAA,GAAsB;AAC5B,IAAM,qBAAA,GAAwB;AAC9B,IAAM,iBAAA,GAAoB;AAC1B,IAAM,sBAAA,GAAyB;AAE/B,IAAM,cAAA,uBAA0C,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC;AAG7E,IAAM,kBAAA,uBAA8C,GAAA,CAAI;AAAA,EAC7D,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC;AAwBM,IAAM,cAAN,MAAkB;AAAA,EACd,UAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,mBAAA;AACxC,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,YAAA,IAAgB,qBAAA;AAC5C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,iBAAA;AACpC,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,sBAAA;AAC9C,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,KAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAA,CAAY,SAAiB,OAAA,EAAwD;AACnF,IAAA,IAAI,OAAA,IAAW,IAAA,CAAK,UAAA,EAAY,OAAO,KAAA;AACvC,IAAA,MAAM,MAAA,GAAA,CAAU,OAAA,CAAQ,MAAA,IAAU,KAAA,EAAO,WAAA,EAAY;AAErD,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAW;AAGhC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,OAAA,CAAQ,MAAM,GAAG,OAAO,KAAA;AAIhD,IAAA,IAAI,IAAA,CAAK,oBAAoB,OAAO,IAAA;AACpC,IAAA,OAAO,kBAAA,CAAmB,IAAI,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YAAA,CAAa,SAAiB,OAAA,EAA0C;AACtE,IAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,IAAa,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC/D,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,KAAK,QAAQ,CAAA;AAAA,IACnD;AACA,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,CAAI,IAAA,CAAK,eAAe,OAAO,CAAA;AACrE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,QAAQ,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAO,GAAI,MAAA;AAAA,EACzB;AACF;AAYO,SAAS,gBAAgB,MAAA,EAAuD;AACrF,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,EAAW,OAAO,MAAA;AACpD,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAGrB,EAAA,IAAI,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EACtB;AAGA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AACvB,EAAA,MAAM,KAAA,GAAA,CAAS,SAAS,KAAA,IAAS,GAAA;AACjC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAC1B;AAGO,SAAS,MAAM,OAAA,EAAgC;AACpD,EAAA,IAAI,OAAA,IAAW,CAAA,EAAG,OAAO,OAAA,CAAQ,OAAA,EAAQ;AACzC,EAAA,OAAO,IAAI,QAAQ,CAAC,OAAA,KAAY,WAAW,OAAA,EAAS,OAAA,GAAU,GAAI,CAAC,CAAA;AACrE;;;AClIO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACrB,IAAA,GAAe,eAAA;AAAA,EAEjC,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAI,OAAA,EAAS,UAAU,MAAA,EAAW;AAChC,MAAC,IAAA,CAA6B,QAAQ,OAAA,CAAQ,KAAA;AAAA,IAChD;AACA,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAcO,IAAM,QAAA,GAAN,cAAuB,aAAA,CAAc;AAAA,EACxB,IAAA,GAAe,UAAA;AAAA,EACxB,UAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EAET,YAAY,OAAA,EAA0B;AACpC,IAAA,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM,GAAI,MAAS,CAAA;AACzF,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AACpB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AACzB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA,EAES,QAAA,GAAmB;AAC1B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AACvE,IAAA,IAAI,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AACvB,IAAA,IAAI,KAAK,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,CAAA,CAAA,CAAG,CAAA;AAC/D,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,YAAA,CAAa,QAAA,EAAoB,IAAA,EAAe,IAAA,EAA0B;AAC/E,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,IAAA,MAAM,UAAA,GAAa,IAAA,KAAS,MAAA,GAAY,IAAA,GAAO,IAAA;AAC/C,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAO,GAAI,cAAA,CAAe,YAAY,QAAQ,CAAA;AACrE,IAAA,MAAM,SAAA,GACJ,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,KAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,MAAA;AAElF,IAAA,MAAM,UAAA,GAAa,eAAe,MAAM,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW;AAAA,MACzB,OAAA;AAAA,MACA,UAAA,EAAY,MAAA;AAAA,MACZ,IAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,MAAC,GAAA,CAA2C,CAAC,CAAA,GAAI,CAAA;AAAA,IACnD;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,QAAA,CAAS;AAAA,EAC9B,IAAA,GAAO,qBAAA;AAC3B;AACO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EACzB,IAAA,GAAO,gBAAA;AAC3B;AACO,IAAM,aAAA,GAAN,cAA4B,QAAA,CAAS;AAAA,EACxB,IAAA,GAAO,eAAA;AAC3B;AACO,IAAM,mBAAA,GAAN,cAAkC,QAAA,CAAS;AAAA,EAC9B,IAAA,GAAO,qBAAA;AAC3B;AACO,IAAM,eAAA,GAAN,cAA8B,QAAA,CAAS;AAAA,EAC1B,IAAA,GAAO,iBAAA;AAAA,EAChB,SAAyC,EAAC;AACrD;AACO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EACzB,IAAA,GAAO,gBAAA;AAAA,EAChB,UAAA;AAAA,EACA,KAAA;AACX;AACO,IAAM,WAAA,GAAN,cAA0B,QAAA,CAAS;AAAA,EACtB,IAAA,GAAe,aAAA;AACnC;AACO,IAAM,uBAAA,GAAN,cAAsC,WAAA,CAAY;AAAA,EACrC,IAAA,GAAe,yBAAA;AACnC;AAGO,IAAM,kBAAA,GAAN,cAAiC,aAAA,CAAc;AAAA,EAClC,IAAA,GAAe,oBAAA;AACnC;AAGO,IAAM,eAAA,GAAN,cAA8B,kBAAA,CAAmB;AAAA,EACpC,IAAA,GAAe,iBAAA;AACnC;AAgBO,IAAM,wBAAA,GAAN,cAAuC,aAAA,CAAc;AAAA,EACxC,IAAA,GAAe,0BAAA;AAAA,EACxB,MAAA;AAAA,EAET,YAAY,MAAA,EAAmC;AAC7C,IAAA,KAAA,CAAM,uCAAuC,CAAA;AAC7C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;AAUA,SAAS,cAAA,CAAe,MAAe,QAAA,EAAqC;AAC1E,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,OAAA,GAAU,EAAA;AAEd,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,SAAA,GAAY,QAAA,IAAY,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,OAAA;AAEzD,IAAA,IAAI,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3E,MAAA,MAAM,MAAA,GAAS,SAAA;AACf,MAAA,IAAA,GAAQ,MAAA,CAAO,SAAiC,MAAA,CAAO,IAAA;AACvD,MAAA,OAAA,GACG,MAAA,CAAO,OAAA,IACP,MAAA,CAAO,MAAA,IACR,EAAA;AACF,MAAA,KAAA,MAAW,GAAA,IAAO,CAAC,aAAA,EAAe,OAAA,EAAS,aAAa,CAAA,EAAG;AACzD,QAAA,IAAI,OAAO,MAAA,EAAQ;AAGjB,UAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,YAAA,MAAA,CAAO,UAAA,GAAa,OAAO,GAAG,CAAA;AAAA,UAChC,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AACnC,MAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAChB,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,QAAA,OAAA,GAAW,MAAM,GAAA,IAA8B,kBAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,kBAAA;AAAA,MACZ;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,SAAA,KAAc,QAAA,EAAU;AACxC,MAAA,OAAA,GAAU,SAAA;AAAA,IACZ;AAAA,EACF;AAIA,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,IAAA,MAAM,SAAS,eAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AAClE,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAA,CAAO,UAAA,GAAa,MAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO;AACjC;AAEA,SAAS,eAAe,MAAA,EAAyD;AAC/E,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,mBAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,mBAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,cAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,aAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,eAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,cAAA;AAC3B,EAAA,IAAI,MAAA,KAAW,KAAK,OAAO,uBAAA;AAC3B,EAAA,IAAI,MAAA,IAAU,GAAA,IAAO,MAAA,GAAS,GAAA,EAAK,OAAO,WAAA;AAC1C,EAAA,OAAO,QAAA;AACT;;;ACpOO,IAAM,gBAAA,GAAmB;AACzB,IAAM,mBAAA,GAAsB;AAC5B,IAAM,eAAA,GAAkB;AAExB,IAAM,UAAA,GAAa;AASnB,SAAS,cAAc,MAAA,EAAoC;AAChE,EAAA,IAAI,GAAA,GAAM,MAAA;AACV,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,gBAAA;AAC3B,IAAA,GAAA,GAAM,MAAA,IAAU,MAAA;AAAA,EAClB;AACA,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,MAC5B,OAAA,EAAS,2DAAA;AAAA,MACT,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAI,mBAAA,CAAoB;AAAA,MAC5B,OAAA,EAAS,iDAAiD,UAAU,CAAA,EAAA,CAAA;AAAA,MACpE,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,OAAO,GAAA;AACT;AAMO,SAAS,eAAe,OAAA,EAAqC;AAClE,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,iBAAA;AAC3B,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,gBAAA;AACT;AAMO,SAAS,kBAAkB,UAAA,EAAwC;AACxE,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,oBAAA;AAC3B,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,mBAAA;AACT;;;ACzEA,IAAM,GAAA,GAAM,SAAA;AAEL,IAAM,YAAN,MAAgB;AAAA,EACJ,MAAA;AAAA,EACjB,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,OAAA,GAAoC,EAAC,EAA2B;AACzE,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,CAAuB,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,UAAA,CAAA,EAAc;AAAA,MACnE,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AACF;;;ACdA,IAAMA,IAAAA,GAAM,SAAA;AAEL,IAAM,gBAAN,MAAoB;AAAA,EACR,MAAA;AAAA,EACjB,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,OAAA,EACA,OAAA,GAAoC,EAAC,EACR;AAC7B,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAA4B,KAAA,EAAO,GAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,cAAA,CAAA,EAAkB;AAAA,MACvF,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AACF;;;ACPO,IAAM,QAAA,GAAW;AAGjB,IAAM,eAAN,MAA0D;AAAA,EAC9C,SAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACT,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CACE,SAAA,EACA,OAAA,GAAoE,EAAC,EACrE;AACA,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,QAAA;AACnC,IAAA,IAAI,OAAA,GAAU,CAAA,IAAK,OAAA,GAAU,QAAA,EAAU;AACrC,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAa,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,WAAW,oBAAoB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,SAAA,IAAa,CAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA,EAEA,CAAC,MAAA,CAAO,aAAa,CAAA,GAA8B;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAAmC;AAEvC,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,OAAA,IAAW,KAAK,KAAA,EAAO;AAC1D,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAAA,MACxC;AAEA,MAAA,IAAI,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACvC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACvC,QAAA,IAAA,CAAK,SAAA,IAAa,CAAA;AAClB,QAAA,IAAA,CAAK,OAAA,IAAW,CAAA;AAChB,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAAA,MACpC;AAGA,MAAA,IAAI,KAAK,OAAA,GAAU,CAAA,IAAK,IAAA,CAAK,OAAA,IAAW,KAAK,KAAA,EAAO;AAClD,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAAA,MACxC;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAAA,MACxC;AAEA,MAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AACnE,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAAA,MACxC;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,OAAA;AACrC,MAAA,IAAA,CAAK,IAAA,IAAQ,CAAA;AAAA,IACf;AAAA,EACF;AACF;AAGO,IAAM,iBAAN,MAA4D;AAAA,EAChD,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACT,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EAER,WAAA,CACE,SAAA,EACA,OAAA,GAAoE,EAAC,EACrE;AACA,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,MAAM,IAAI,WAAW,oBAAoB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAa,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,WAAW,oBAAoB,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,WAAA,IAAe,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AAAA,EACd;AAAA,EAEA,CAAC,MAAA,CAAO,aAAa,CAAA,GAA8B;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAAmC;AACvC,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA,IAAa,IAAA,CAAK,OAAA,IAAW,KAAK,KAAA,EAAO;AAC1D,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAAA,MACxC;AAGA,MAAA,IAAI,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACvC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACvC,QAAA,IAAA,CAAK,SAAA,IAAa,CAAA;AAClB,QAAA,IAAA,CAAK,OAAA,IAAW,CAAA;AAChB,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAAA,MACpC;AAGA,MAAA,IAAI,KAAK,IAAA,EAAM,OAAO,EAAE,KAAA,EAAO,MAAA,EAAW,MAAM,IAAA,EAAK;AAErD,MAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAI,MAAM,KAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AACnE,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAW,IAAA,EAAM,IAAA,EAAK;AAAA,MACxC;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,MAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,MAAA,IAAA,CAAK,UAAU,KAAA,CAAM,MAAA;AAErB,MAAA,IAAI,IAAA,CAAK,MAAA,IAAU,KAAA,EAAO,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,WAAA,IAC7B,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,KAAA,OAAY,IAAA,GAAO,IAAA;AAAA,IAClD;AAAA,EACF;AACF;;;AClIA,IAAMA,IAAAA,GAAM,SAAA;AAEZ,SAAS,iBAAA,CACP,MACA,MAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,UAAU,IAAA,CAAK,OAAA;AAAA,IACf,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,WAAW,IAAA,CAAK,QAAA;AAAA,IAChB,SAAS,IAAA,CAAK,MAAA;AAAA,IACd,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,GAAG;AAAA,GACL;AACF;AAEO,IAAM,OAAN,MAAW;AAAA,EACC,MAAA;AAAA,EACjB,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,OAAA,EACA,OAAA,GAAqD,EAAC,EAC9B;AACxB,IAAA,MAAM,MAAA,GAAS,kBAAkB,OAAA,EAAS;AAAA,MACxC,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA;AAAA,MACtB,QAAA,EAAU,QAAQ,OAAA,IAAW;AAAA,KAC9B,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAuB,KAAA,EAAO,GAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,KAAA,CAAA,EAAS;AAAA,MACzE,MAAA;AAAA,MACA,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,OAAA,EACA,CAAA,EACA,OAAA,GAAuD,EAAC,EAChC;AACxB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,MAAK,EAAG;AACnB,MAAA,MAAM,IAAI,UAAU,oCAAoC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,MAAA,GAAS,kBAAkB,OAAA,EAAS;AAAA,MACxC,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA;AAAA,MACtB,QAAA,EAAU,QAAQ,OAAA,IAAW,EAAA;AAAA,MAC7B;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAuB,KAAA,EAAO,GAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,KAAA,CAAA,EAAS;AAAA,MACzE,MAAA;AAAA,MACA,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,IAAA,CACE,OAAA,EACA,OAAA,GAAqD,EAAC,EACd;AACxC,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AACnC,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,EAAc,GAAA,KAAsD;AAC3F,MAAA,MAAM,QAAA,GAAsD;AAAA,QAC1D,IAAA;AAAA,QACA,OAAA,EAAS,GAAA;AAAA,QACT,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,MAAM,OAAA,CAAQ;AAAA,OAChB;AACA,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,QAAA,CAAS,MAAA,GAAS,OAAA,CAAQ,MAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC9C,MAAA,OAAO,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAAA,IAClC,CAAA;AACA,IAAA,OAAO,IAAI,YAAA,CAAa,SAAA,EAAW,EAAE,OAAA,EAAS,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAM,GAAI,IAAK,CAAA;AAAA,EAC3F;AAAA;AAAA,EAGA,UAAA,CACE,OAAA,EACA,CAAA,EACA,OAAA,GAAqD,EAAC,EACd;AACxC,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,MAAK,EAAG;AACnB,MAAA,MAAM,IAAI,UAAU,oCAAoC,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AACnC,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,MAAM,SAAA,GAAY,OAAO,IAAA,EAAc,GAAA,KAAsD;AAC3F,MAAA,MAAM,UAAA,GAA0D;AAAA,QAC9D,IAAA;AAAA,QACA,OAAA,EAAS,GAAA;AAAA,QACT,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,MAAM,OAAA,CAAQ;AAAA,OAChB;AACA,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,UAAA,CAAW,MAAA,GAAS,OAAA,CAAQ,MAAA;AAChD,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,GAAG,UAAU,CAAA;AACrD,MAAA,OAAO,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAAA,IAClC,CAAA;AACA,IAAA,OAAO,IAAI,YAAA,CAAa,SAAA,EAAW,EAAE,OAAA,EAAS,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAM,GAAI,IAAK,CAAA;AAAA,EAC3F;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,OAAA,EACA,KAAA,EACA,OAAA,GAAoC,EAAC,EACjB;AACpB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAmB,KAAA,EAAO,CAAA,EAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA,EAAI;AAAA,MAC9E,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,OAAA,EACA,KAAA,EACA,OAAA,GAAoC,EAAC,EACnB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAiB,KAAA,EAAO,CAAA,EAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,KAAA,CAAA,EAAS;AAAA,MACjF,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAA,CACJ,OAAA,EACA,KAAA,EACA,OAAA,GAAoC,EAAC,EACX;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,KAAA;AAAA,MACA,CAAA,EAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,SAAS,KAAK,CAAA,QAAA,CAAA;AAAA,MAC/B,EAAE,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAG,KAC1D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,OAAA,EACA,OACA,GAAA,EACA,OAAA,GAAoC,EAAC,EACP;AAC9B,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,KAAA;AAAA,MACA,GAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,MAAA,EAAS,KAAK,OAAO,GAAG,CAAA,CAAA;AAAA,MACzC,EAAE,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAG,KAC1D;AAAA,EACF;AACF;;;ACzLA,IAAMA,IAAAA,GAAM,SAAA;AAEL,IAAM,WAAN,MAAe;AAAA,EACH,MAAA;AAAA,EACjB,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,OAAA,EAAiB,OAAA,GAAoC,EAAC,EAAsB;AACrF,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAkB,KAAA,EAAO,GAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,UAAA,CAAA,EAAc;AAAA,MACzE,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AACF;;;ACZA,IAAMA,IAAAA,GAAM,SAAA;AAEL,IAAM,UAAN,MAAc;AAAA,EACF,MAAA;AAAA,EACjB,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,OAAA,EACA,KAAA,EACA,OAAA,GAAwD,EAAC,EAC/B;AAC1B,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,KAAA,EAAO,QAAQ,KAAA,IAAS,GAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA,KAC5B;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,KAAA;AAAA,MACA,CAAA,EAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,SAAS,KAAK,CAAA,QAAA,CAAA;AAAA,MAC/B,EAAE,MAAA,EAAQ,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAG,KAClE;AAAA,EACF;AAAA;AAAA,EAGA,IAAA,CACE,OAAA,EACA,KAAA,EACA,OAAA,GAAwD,EAAC,EAC1B;AAC/B,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,MAAM,SAAA,GAAY,OAAO,QAAA,EAAkB,MAAA,KAAgD;AACzF,MAAA,MAAM,QAAA,GAAyD;AAAA,QAC7D,KAAA,EAAO,QAAA;AAAA,QACP;AAAA,OACF;AACA,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,QAAA,CAAS,MAAA,GAAS,OAAA,CAAQ,MAAA;AAC9C,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,OAAO,QAAQ,CAAA;AACrD,MAAA,OAAO,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAAA,IAClC,CAAA;AACA,IAAA,OAAO,IAAI,cAAA,CAAe,SAAA,EAAW,EAAE,KAAA,EAAO,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAM,GAAI,IAAK,CAAA;AAAA,EAC3F;AACF;;;AC7CA,IAAMA,IAAAA,GAAM,SAAA;AAEL,IAAM,QAAN,MAAY;AAAA,EACA,MAAA;AAAA,EACjB,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,OAAA,EACA,OAAA,GAAmD,EAAC,EAC5B;AACxB,IAAA,MAAM,MAAA,GAAkC,EAAE,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAa;AAC7E,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAuB,KAAA,EAAO,GAAGA,IAAG,CAAA,CAAA,EAAI,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,MAC1E,MAAA;AAAA,MACA,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AACF;;;ACNA,IAAMA,IAAAA,GAAM,SAAA;AAEZ,IAAM,iCAAiB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,SAAA,EAAW,SAAS,CAAC,CAAA;AAExD,IAAM,WAAN,MAAe;AAAA,EACH,MAAA;AAAA,EACjB,YAAY,MAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,OACJ,OAAA,EAC0B;AAC1B,IAAA,MAAM,IAAA,GAAgC;AAAA,MACpC,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,aAAa,OAAA,CAAQ,UAAA;AAAA,MACrB,SAAA,EAAW,QAAQ,SAAA,IAAa,IAAA;AAAA,MAChC,WAAA,EAAa,QAAQ,WAAA,IAAe;AAAA,KACtC;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,CAAyB,MAAA,EAAQ,CAAA,EAAGA,IAAG,CAAA,SAAA,CAAA,EAAa;AAAA,MACrE,IAAA,EAAM,IAAA;AAAA,MACN,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,OAAA,GAAoC,EAAC,EAA+B;AAC7E,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,CAA2B,KAAA,EAAO,CAAA,EAAGA,IAAG,CAAA,SAAA,CAAA,EAAa;AAAA,MACtE,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,UAAA,EACA,OAAA,GAAoC,EAAC,EACX;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAyB,KAAA,EAAO,GAAGA,IAAG,CAAA,UAAA,EAAa,UAAU,CAAA,CAAA,EAAI;AAAA,MAClF,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,UAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,OAAgC,EAAC;AACvC,IAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AAClD,IAAA,IAAI,OAAA,CAAQ,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,cAAc,OAAA,CAAQ,UAAA;AACjE,IAAA,IAAI,OAAA,CAAQ,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAC9D,IAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAClE,IAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAyB,OAAA,EAAS,GAAGA,IAAG,CAAA,UAAA,EAAa,UAAU,CAAA,CAAA,EAAI;AAAA,MACpF,IAAA,EAAM,IAAA;AAAA,MACN,GAAI,QAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,KAAW;AAAC,KACpD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,UAAA,EACA,OAAA,GAAoC,EAAC,EACH;AAClC,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,QAAA;AAAA,MACA,CAAA,EAAGA,IAAG,CAAA,UAAA,EAAa,UAAU,CAAA,CAAA;AAAA,MAC7B,EAAE,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAG,KAC1D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAA,CACJ,UAAA,EACA,OAAA,GAA+D,EAAC,EAChC;AAChC,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,IAAa,CAAC,eAAe,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AACvE,MAAA,MAAM,IAAI,SAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA;AAAA,MACtB,QAAQ,OAAA,CAAQ;AAAA,KAClB;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,KAAA;AAAA,MACA,CAAA,EAAGA,IAAG,CAAA,UAAA,EAAa,UAAU,CAAA,WAAA,CAAA;AAAA,MAC7B,EAAE,MAAA,EAAQ,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAG,KAClE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAA,CACJ,UAAA,EACA,UAAA,EACA,OAAA,GAAoC,EAAC,EACX;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,MAAA;AAAA,MACA,CAAA,EAAGA,IAAG,CAAA,UAAA,EAAa,UAAU,eAAe,UAAU,CAAA,MAAA,CAAA;AAAA,MACtD,EAAE,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAG,KAC1D;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,UAAA,EACA,OAAA,GAAoC,EAAC,EACX;AAC1B,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,MAAA;AAAA,MACA,CAAA,EAAGA,IAAG,CAAA,UAAA,EAAa,UAAU,CAAA,KAAA,CAAA;AAAA,MAC7B,EAAE,GAAI,OAAA,CAAQ,MAAA,GAAS,EAAE,QAAQ,OAAA,CAAQ,MAAA,EAAO,GAAI,EAAC;AAAG,KAC1D;AAAA,EACF;AACF;;;AChIO,IAAM,WAAA,GAAc;;;ACyCpB,SAAS,gBAAA,GAA2B;AAEzC,EAAA,OAAO,iBAAiB,WAAW,CAAA,MAAA,EAAS,QAAQ,OAAO,CAAA,CAAA,EAAO,aAAU,CAAA,CAAA;AAC9E;AAIA,SAAS,qBAAqB,CAAA,EAAmB;AAC/C,EAAA,IAAI,MAAM,CAAA,CAAE,MAAA;AACZ,EAAA,OAAO,MAAM,CAAA,IAAK,CAAA,CAAE,WAAW,GAAA,GAAM,CAAC,MAAM,EAAA,EAAc,GAAA,EAAA;AAC1D,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACvB;AA4CO,IAAM,WAAN,MAAe;AAAA,EACX,SAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAGA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EAEQ,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACT,aAAA,GAAiC,IAAA;AAAA,EAEzC,WAAA,CAAY,OAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,oBAAA,CAAqB,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAC,CAAA;AACpE,IAAA,IAAA,CAAK,WAAA,GAAc,iBAAA,CAAkB,OAAA,CAAQ,UAAU,CAAA;AACvD,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,OAAA,IAAW,eAAA;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,QAAQ,UAAU,CAAA;AAClE,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA,CAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAE1C,IAAA,IAAA,CAAK,WAAW,YAAA,CAAa,IAAA,CAAK,SAAS,IAAA,CAAK,WAAA,EAAa,QAAQ,cAAc,CAAA;AAEnF,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,IAAI,YAAA,GAAgC;AAClC,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,GAA0B,EAAC,EACf;AACZ,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,EAAY;AACvC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,MAAM,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AACnC,IAAA,IAAI,QAAQ,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,QAAQ,YAAY,CAAA;AACrE,IAAA,IAAI,OAAA,CAAQ,cAAA,EAAgB,OAAA,CAAQ,iBAAiB,IAAI,OAAA,CAAQ,cAAA;AAEjE,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,KAAS,MAAA;AACjC,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAEvC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,CAAS,KAAK,WAAA,EAAa,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,MAC5E,SAAS,GAAA,EAAK;AACZ,QAAA,MAAMC,YAAAA,GAAc,KAAK,MAAA,CAAO,WAAA,CAAY,SAAS,EAAE,MAAA,EAAQ,aAAa,CAAA;AAC5E,QAAA,IAAI,CAACA,YAAAA,EAAa;AAChB,UAAA,MAAM,mBAAmB,GAAG,CAAA;AAAA,QAC9B;AACA,QAAA,MAAMC,SAAQ,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,OAAA,EAAS,EAAE,CAAA;AAClD,QAAA,MAAM,MAAMA,MAAK,CAAA;AACjB,QAAA,OAAA,IAAW,CAAA;AACX,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,QAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AACrB,QAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,IAAA;AACpC,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,IAAI;AACF,UAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,QACxB,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM,IAAI,QAAA,CAAS;AAAA,YACjB,OAAA,EAAS,+BAAA;AAAA,YACT,YAAY,QAAA,CAAS,MAAA;AAAA,YACrB,IAAA,EAAM,IAAA;AAAA,YACN,QAAA;AAAA,YACA,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAA,EAAS;AAAA,QACnD,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AACrB,QAAA,MAAM,MAAM,kBAAkB,QAAQ,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,aAAa,eAAA,CAAgB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AACtE,MAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,aAAa,OAAA,EAAS,EAAE,YAAY,CAAA;AAE9D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,IAAA,EAAK;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAM,MAAM,KAAK,CAAA;AACjB,MAAA,OAAA,IAAW,CAAA;AAAA,IACb;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAAA,EAI7B;AAAA;AAAA,EAGA,OAAO,MAAA,CAAO,YAAY,CAAA,GAAmB;AAC3C,IAAA,MAAM,KAAK,KAAA,EAAM;AAAA,EACnB;AAAA;AAAA,EAIQ,QAAA,CAAS,MAAc,MAAA,EAA0C;AACvE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,KAAK,UAAA,CAAW,SAAS,KAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7D,MAAA,IAAA,GAAO,IAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAChD,MAAA,IAAA,GAAO,KAAK,QAAA,GAAW,CAAA;AAAA,IACzB;AACA,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,iBAAiB,MAAM,CAAA;AACrC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,EACnE;AAAA,EAEA,MAAc,QAAA,CACZ,GAAA,EACA,MAAA,EACA,OAAA,EACA,SACA,OAAA,EACmB;AACnB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,IAAA,CAAK,QAAA;AACvB,IAAA,MAAM,aAAA,GAAgB,WAAW,MAAM,UAAA,CAAW,MAAM,IAAI,aAAA,EAAe,CAAA,EAAG,SAAS,CAAA;AACvF,IAAA,IAAI,gBAAA;AACJ,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,IAAI,QAAQ,MAAA,CAAO,OAAA,aAAoB,KAAA,CAAM,OAAA,CAAQ,OAAO,MAAM,CAAA;AAClE,MAAA,gBAAA,GAAmB,MAAM,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,OAAQ,MAAM,CAAA;AAChE,MAAA,OAAA,CAAQ,OAAO,gBAAA,CAAiB,OAAA,EAAS,kBAAkB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAoB;AAAA,QACxB,MAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,QAAA,EAAU;AAAA,OACZ;AACA,MAAA,IAAI,SAAS,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAI,CAAA;AACpD,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,IAAI,CAAA;AAAA,IACpC,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,aAAa,CAAA;AAC1B,MAAA,IAAI,OAAA,CAAQ,UAAU,gBAAA,EAAkB;AACtC,QAAA,OAAA,CAAQ,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,gBAAgB,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACd,IAAA,GAAO,eAAA;AAAA,EACzB,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,mBAAmB,CAAA;AAAA,EAC3B;AACF,CAAA;AAEA,SAAS,kBAAA,CACP,QACA,UAAA,EACa;AACb,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,IAAI,UAAA,KAAe,MAAA,EAAW,OAAO,IAAI,WAAA,EAAY;AACrD,EAAA,OAAO,IAAI,WAAA,CAAY,EAAE,UAAA,EAAY,CAAA;AACvC;AAEA,SAAS,YAAA,CACP,MAAA,EACA,UAAA,EACA,KAAA,EACwB;AACxB,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,aAAA,EAAe,UAAU,MAAM,CAAA,CAAA;AAAA,IAC/B,cAAc,gBAAA,EAAiB;AAAA,IAC/B,sBAAA,EAAwB,UAAA;AAAA,IACxB,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,IAAI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS,KAAK,CAAA;AACvC,EAAA,OAAO,OAAA;AACT;AASO,SAAS,iBAAiB,MAAA,EAAyC;AACxE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,MAAA,UAAA,GAAa,QAAQ,MAAA,GAAS,OAAA;AAAA,IAChC,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/B,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,MAAA,UAAA,GAAa,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,OAAO,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,OAAO,KAAK,CAAA;AAAA,IAC3B;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAEA,eAAe,kBAAkB,QAAA,EAAuC;AACtE,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,EAAA,IAAI,IAAA,GAAgB,MAAA;AACpB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,QAAA,CAAS,YAAA,CAAa,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA;AACnD;AAEA,SAAS,mBAAmB,GAAA,EAAqB;AAC/C,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GACJ,GAAA,CAAI,IAAA,KAAS,YAAA,IAAiB,IAA0B,IAAA,KAAS,WAAA;AACnE,IAAA,MAAM,SAAA,GAAa,IAAsC,KAAA,EAAO,IAAA;AAChE,IAAA,MAAM,SAAA,GACJ,OAAA,KACC,GAAA,CAAI,OAAA,CAAQ,SAAS,WAAW,CAAA,IAC/B,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,KAC5C,SAAA,KAAc,eAAA,CAAA;AAClB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,IAAI,eAAA,CAAgB,mBAAA,EAAqB,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,IAChE;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,IAAI,kBAAA,CAAmB,iBAAA,EAAmB,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,IAAI,mBAAmB,GAAA,CAAI,OAAA,IAAW,mBAAmB,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,IAAI,mBAAmB,iBAAiB,CAAA;AACjD;AC9UO,IAAM,yBAAA,GAA4B;AACzC,IAAM,iBAAA,GAAoB,CAAC,IAAI,CAAA;AA8BxB,IAAM,OAAA,GAAN,MAAM,QAAA,CAAQ;AAAA;AAAA,EAEnB,OAAgB,SAAA,GAAY,yBAAA;AAAA;AAAA,EAG5B,OAAO,gBAAA,CAAiB,MAAA,EAAgB,OAAA,EAAuC,SAAA,EAA2B;AACxG,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,CAAO;AAAA,MAC3B,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AAAA,MAC7B,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA;AAAA,MACvB;AAAA,KACD,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,WAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACpE,IAAA,OAAO,MAAM,GAAG,CAAA,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,OAAO,OAAA,EAA6C;AACzD,IAAA,IAAI,CAAC,QAAQ,SAAA,IAAa,CAAC,QAAQ,SAAA,IAAa,CAAC,QAAQ,MAAA,EAAQ;AAC/D,MAAA,MAAM,IAAI,yBAAyB,gBAAgB,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA;AAGnD,IAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,QAAQ,SAAA,CAAU,IAAA,EAAM,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,yBAAyB,eAAe,CAAA;AAAA,IACpD;AACA,IAAA,MAAM,KAAK,QAAA,CAAS,OAAA,CAAQ,SAAA,CAAU,IAAA,IAAQ,EAAE,CAAA;AAChD,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,yBAAyB,eAAe,CAAA;AAAA,IACpD;AACA,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,IAAa,QAAA,CAAQ,SAAA;AACzC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,IAAO,IAAA,CAAK,KAAI,GAAI,GAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,EAAE,IAAI,GAAA,EAAK;AAClC,MAAA,MAAM,IAAI,yBAAyB,6BAA6B,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,WAAW,QAAA,CAAQ,gBAAA,CAAiB,QAAQ,MAAA,EAAQ,UAAA,EAAY,QAAQ,SAAS,CAAA;AACvF,IAAA,MAAM,cAAc,QAAA,CAAS,KAAA,CAAM,SAAS,OAAA,CAAQ,GAAG,IAAI,CAAC,CAAA;AAC5D,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,OAAA,CAAQ,SAAS,CAAA;AACvD,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAI,yBAAyB,oBAAoB,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,KAAK,CAAA;AAClD,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,WAAA,CAAY,MAAA,EAAQ;AAC3C,MAAA,IAAI,eAAA,CAAgB,WAAA,EAAa,OAAO,CAAA,EAAG;AACzC,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,yBAAyB,eAAe,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,yBAAyB,eAAe,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,CAAC,UAAU,OAAO,MAAA,KAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,MAAA,MAAM,IAAI,yBAAyB,eAAe,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,wBAAwB,MAAiC,CAAA;AAAA,EAClE;AACF;AAEA,SAAS,iBAAiB,OAAA,EAA+C;AACvE,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,OAAA;AACrC,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,SAAiB,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AACnE,EAAA,OAAO,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B;AAEA,SAAS,mBAAmB,MAAA,EAA0B;AACpD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AACvC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,KAAK,CAAA,EAAG;AACZ,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA,EAAG;AAEzC,IAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,EAAG;AACnC,IAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,wBAAwB,OAAA,EAAgD;AAC/E,EAAA,MAAM,SAAA,GACH,OAAA,CAAQ,UAAA,IACR,OAAA,CAAQ,IAAA,IACT,EAAA;AACF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,EAAA,IAAM,EAAE,CAAA;AAAA,IAC3B,IAAA,EAAM,OAAO,SAAS,CAAA;AAAA,IACtB,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,UAAA,IAAc,EAAE,CAAA;AAAA,IAC1C,MACE,OAAA,CAAQ,IAAA,IAAQ,OAAO,OAAA,CAAQ,IAAA,KAAS,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,GAC3E,EAAE,GAAI,OAAA,CAAQ,IAAA,KACd,EAAC;AAAA,IACP,GAAA,EAAK,EAAE,GAAG,OAAA;AAAQ,GACpB;AACF","file":"index.js","sourcesContent":["/**\n * Retry policy for transient failures.\n *\n * Retries happen on:\n * - Network errors (DNS, connect, read timeout, TLS)\n * - HTTP 429 (rate limit)\n * - HTTP 500, 502, 503, 504 (transient server issues)\n *\n * Retries do NOT happen on:\n * - 4xx other than 429 (caller error, retrying won't help)\n * - Non-idempotent methods by default (POST, PATCH): mutations are\n * never auto-retried. Only GET/HEAD/OPTIONS/PUT/DELETE are retried.\n * This prevents duplicate webhook creation and duplicate retry calls.\n *\n * The `Retry-After` header wins when present and non-negative. Otherwise\n * exponential backoff with full jitter, capped at `maxDelay`.\n */\n\nexport const DEFAULT_MAX_RETRIES = 3;\nexport const DEFAULT_INITIAL_DELAY = 0.5; // seconds\nexport const DEFAULT_MAX_DELAY = 30.0; // seconds — matches Python reference\nexport const DEFAULT_BACKOFF_FACTOR = 2.0;\n\nexport const RETRY_STATUSES: ReadonlySet<number> = new Set([429, 500, 502, 503, 504]);\n\n/** HTTP methods considered safe to auto-retry (idempotent). */\nexport const IDEMPOTENT_METHODS: ReadonlySet<string> = new Set([\n \"GET\",\n \"HEAD\",\n \"OPTIONS\",\n \"PUT\",\n \"DELETE\",\n]);\n\nexport interface RetryPolicyOptions {\n maxRetries?: number;\n initialDelay?: number;\n maxDelay?: number;\n backoffFactor?: number;\n /**\n * When true, retry POST/PATCH too. Default false — the SDK never\n * auto-retries mutations unless the caller opts in explicitly.\n */\n retryNonIdempotent?: boolean;\n}\n\n/**\n * Configuration for automatic retries.\n *\n * Immutable — construct a new instance to tweak. Matches the Python\n * `RetryPolicy` contract:\n * - `maxRetries`: total attempts is at most `maxRetries + 1`. 0 disables retries.\n * - `initialDelay`: seconds before the first retry (pre-jitter).\n * - `maxDelay`: cap on any single sleep in seconds.\n * - `backoffFactor`: multiplier applied to delay each attempt.\n */\nexport class RetryPolicy {\n readonly maxRetries: number;\n readonly initialDelay: number;\n readonly maxDelay: number;\n readonly backoffFactor: number;\n readonly retryNonIdempotent: boolean;\n\n constructor(options: RetryPolicyOptions = {}) {\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.initialDelay = options.initialDelay ?? DEFAULT_INITIAL_DELAY;\n this.maxDelay = options.maxDelay ?? DEFAULT_MAX_DELAY;\n this.backoffFactor = options.backoffFactor ?? DEFAULT_BACKOFF_FACTOR;\n this.retryNonIdempotent = options.retryNonIdempotent ?? false;\n }\n\n /**\n * Decide whether to retry given attempt index, HTTP status, and method.\n *\n * `status` is undefined when the failure was a transport error before\n * the server returned a status. Transport errors are retried for any\n * method (the request never hit the server, so the \"don't duplicate\n * mutations\" concern doesn't apply).\n */\n shouldRetry(attempt: number, options: { status?: number; method?: string }): boolean {\n if (attempt >= this.maxRetries) return false;\n const method = (options.method ?? \"GET\").toUpperCase();\n\n if (options.status === undefined) {\n // Transport error — safe to retry even for POST/PATCH, because the\n // request never reached the server.\n return true;\n }\n\n if (!RETRY_STATUSES.has(options.status)) return false;\n\n // Server returned a retryable status. Only retry idempotent methods\n // unless the caller opted in.\n if (this.retryNonIdempotent) return true;\n return IDEMPOTENT_METHODS.has(method);\n }\n\n /**\n * Seconds to wait before retry `attempt` (0-indexed).\n *\n * `Retry-After` wins unambiguously when present and non-negative: the\n * server is telling us exactly how long to wait. Otherwise we use\n * exponential backoff with full jitter:\n *\n * delay = random.uniform(0, min(maxDelay, initial * factor^attempt))\n *\n * Full jitter beats \"equal jitter\" and \"decorrelated jitter\" for\n * preventing thundering-herd recovery spikes.\n */\n computeDelay(attempt: number, options: { retryAfter?: number }): number {\n if (options.retryAfter !== undefined && options.retryAfter >= 0) {\n return Math.min(options.retryAfter, this.maxDelay);\n }\n const base = this.initialDelay * Math.pow(this.backoffFactor, attempt);\n const capped = Math.min(base, this.maxDelay);\n return Math.random() * capped;\n }\n}\n\n/**\n * Parse the `Retry-After` header into seconds.\n *\n * RFC 9110 allows two forms:\n * - A non-negative integer (delta-seconds): `Retry-After: 120`\n * - An HTTP-date: `Retry-After: Wed, 21 Oct 2025 07:28:00 GMT`\n *\n * Unparseable input returns `undefined` so the caller can fall back to\n * its own backoff. HTTP-date values in the past clamp to `0`.\n */\nexport function parseRetryAfter(header: string | null | undefined): number | undefined {\n if (header === null || header === undefined) return undefined;\n const trimmed = header.trim();\n if (!trimmed) return undefined;\n\n // Delta-seconds form: pure integer (possibly negative).\n if (/^-?\\d+$/.test(trimmed)) {\n const n = parseInt(trimmed, 10);\n return Math.max(0, n);\n }\n\n // HTTP-date form.\n const parsed = Date.parse(trimmed);\n if (Number.isNaN(parsed)) return undefined;\n const nowMs = Date.now();\n const delta = (parsed - nowMs) / 1000;\n return Math.max(0, delta);\n}\n\n/** Promise-based sleep — used by the client's retry loop. */\nexport function sleep(seconds: number): Promise<void> {\n if (seconds <= 0) return Promise.resolve();\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n}\n","/**\n * Error hierarchy for the Legalize SDK.\n *\n * The server returns three response shapes:\n *\n * 1. Structured dict from the API layer:\n * { \"detail\": { \"error\": \"quota_exceeded\", \"message\": \"...\", \"retry_after\": 3600, ... } }\n *\n * 2. FastAPI validation errors (422):\n * { \"detail\": [{ \"loc\": [...], \"msg\": \"...\", \"type\": \"...\" }, ...] }\n *\n * 3. Plain string detail for simple 404/400:\n * { \"detail\": \"Law not found: xyz\" }\n *\n * `APIError.fromResponse` normalizes all three into an instance of the\n * most specific subclass, keeping the raw body on `.body` and the parsed\n * payload on `.data`.\n */\n\nimport { parseRetryAfter } from \"./retry.js\";\n\n/** Base error for everything the SDK raises. */\nexport class LegalizeError extends Error {\n override readonly name: string = \"LegalizeError\";\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message);\n if (options?.cause !== undefined) {\n (this as { cause?: unknown }).cause = options.cause;\n }\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport interface APIErrorOptions {\n message: string;\n statusCode?: number;\n code?: string | undefined;\n body?: unknown;\n data?: unknown;\n requestId?: string | undefined;\n response?: Response | undefined;\n cause?: unknown;\n}\n\n/** Any non-2xx HTTP response. */\nexport class APIError extends LegalizeError {\n override readonly name: string = \"APIError\";\n readonly statusCode: number | undefined;\n readonly code: string | undefined;\n readonly body: unknown;\n readonly data: unknown;\n readonly requestId: string | undefined;\n readonly response: Response | undefined;\n\n constructor(options: APIErrorOptions) {\n super(options.message, options.cause !== undefined ? { cause: options.cause } : undefined);\n this.statusCode = options.statusCode;\n this.code = options.code;\n this.body = options.body;\n this.data = options.data;\n this.requestId = options.requestId;\n this.response = options.response;\n }\n\n override toString(): string {\n const parts: string[] = [];\n if (this.statusCode !== undefined) parts.push(`HTTP ${this.statusCode}`);\n if (this.code) parts.push(this.code);\n parts.push(this.message);\n if (this.requestId) parts.push(`(request_id=${this.requestId})`);\n return parts.join(\" \");\n }\n\n /**\n * Build the most specific APIError subclass for a response.\n *\n * `body` is the raw bytes of the response body (or the parsed JSON\n * object if already consumed). `data` is the parsed JSON, which\n * drives error-code dispatch. Reads `X-Request-Id` for support.\n */\n static fromResponse(response: Response, body: unknown, data?: unknown): APIError {\n const status = response.status;\n const parsedData = data !== undefined ? data : body;\n const { code, message, extras } = parseErrorBody(parsedData, response);\n const requestId =\n response.headers.get(\"x-request-id\") ?? response.headers.get(\"X-Request-Id\") ?? undefined;\n\n const ErrorClass = pickErrorClass(status);\n const err = new ErrorClass({\n message,\n statusCode: status,\n code,\n body,\n data: parsedData,\n requestId,\n response,\n });\n // Copy extras (retry_after, limit, errors, etc.) onto the error.\n for (const [k, v] of Object.entries(extras)) {\n (err as unknown as Record<string, unknown>)[k] = v;\n }\n return err;\n }\n}\n\nexport class AuthenticationError extends APIError {\n override readonly name = \"AuthenticationError\";\n}\nexport class ForbiddenError extends APIError {\n override readonly name = \"ForbiddenError\";\n}\nexport class NotFoundError extends APIError {\n override readonly name = \"NotFoundError\";\n}\nexport class InvalidRequestError extends APIError {\n override readonly name = \"InvalidRequestError\";\n}\nexport class ValidationError extends APIError {\n override readonly name = \"ValidationError\";\n readonly errors: Array<Record<string, unknown>> = [];\n}\nexport class RateLimitError extends APIError {\n override readonly name = \"RateLimitError\";\n readonly retryAfter: number | undefined;\n readonly limit: number | undefined;\n}\nexport class ServerError extends APIError {\n override readonly name: string = \"ServerError\";\n}\nexport class ServiceUnavailableError extends ServerError {\n override readonly name: string = \"ServiceUnavailableError\";\n}\n\n/** Transport failure, no response. */\nexport class APIConnectionError extends LegalizeError {\n override readonly name: string = \"APIConnectionError\";\n}\n\n/** Request exceeded timeout. */\nexport class APITimeoutError extends APIConnectionError {\n override readonly name: string = \"APITimeoutError\";\n}\n\nexport type WebhookVerificationReason =\n | \"missing_header\"\n | \"bad_timestamp\"\n | \"timestamp_outside_tolerance\"\n | \"no_valid_signature\"\n | \"bad_signature\";\n\n/**\n * Raised by Webhook.verify on any signature or timestamp failure.\n *\n * The message is intentionally generic so that an attacker probing the\n * endpoint can't distinguish \"bad signature\" from \"stale timestamp\". The\n * specific reason is available on `.reason` for server-side logging.\n */\nexport class WebhookVerificationError extends LegalizeError {\n override readonly name: string = \"WebhookVerificationError\";\n readonly reason: WebhookVerificationReason;\n\n constructor(reason: WebhookVerificationReason) {\n super(\"Webhook signature verification failed\");\n this.reason = reason;\n }\n}\n\n// --- internal parsing ----------------------------------------------------\n\ninterface ParsedErrorBody {\n code: string | undefined;\n message: string;\n extras: Record<string, unknown>;\n}\n\nfunction parseErrorBody(data: unknown, response: Response): ParsedErrorBody {\n const extras: Record<string, unknown> = {};\n let code: string | undefined;\n let message = \"\";\n\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const dataObj = data as Record<string, unknown>;\n const detailRaw = \"detail\" in dataObj ? dataObj.detail : dataObj;\n\n if (detailRaw && typeof detailRaw === \"object\" && !Array.isArray(detailRaw)) {\n const detail = detailRaw as Record<string, unknown>;\n code = (detail.error as string | undefined) ?? (detail.code as string | undefined);\n message =\n (detail.message as string | undefined) ??\n (detail.detail as string | undefined) ??\n \"\";\n for (const key of [\"retry_after\", \"limit\", \"upgrade_url\"]) {\n if (key in detail) {\n // translate snake_case → camelCase for the Node idiom, but\n // preserve the raw key too to match server responses literally.\n if (key === \"retry_after\") {\n extras.retryAfter = detail[key];\n } else {\n extras[key] = detail[key];\n }\n }\n }\n } else if (Array.isArray(detailRaw)) {\n extras.errors = detailRaw;\n if (detailRaw.length > 0) {\n const first = detailRaw[0] as Record<string, unknown>;\n message = (first.msg as string | undefined) ?? \"validation error\";\n } else {\n message = \"validation error\";\n }\n } else if (typeof detailRaw === \"string\") {\n message = detailRaw;\n }\n }\n\n // If server didn't put retry_after in the body, pull it from the\n // Retry-After header. Supports both delta-seconds and HTTP-date.\n if (extras.retryAfter === undefined) {\n const parsed = parseRetryAfter(response.headers.get(\"retry-after\"));\n if (parsed !== undefined) {\n extras.retryAfter = parsed;\n }\n }\n\n if (!message) {\n message = `HTTP ${response.status}`;\n }\n\n return { code, message, extras };\n}\n\nfunction pickErrorClass(status: number): new (opts: APIErrorOptions) => APIError {\n if (status === 400) return InvalidRequestError;\n if (status === 401) return AuthenticationError;\n if (status === 403) return ForbiddenError;\n if (status === 404) return NotFoundError;\n if (status === 422) return ValidationError;\n if (status === 429) return RateLimitError;\n if (status === 503) return ServiceUnavailableError;\n if (status >= 500 && status < 600) return ServerError;\n return APIError;\n}\n","/**\n * Environment-variable resolution helpers.\n *\n * Contract: see `sdk/ENVIRONMENT.md`. Summary:\n * - `LEGALIZE_API_KEY` — required (unless `apiKey` passed explicitly).\n * - `LEGALIZE_BASE_URL` — default \"https://legalize.dev\".\n * - `LEGALIZE_API_VERSION` — default \"v1\".\n *\n * Precedence: explicit arg > env var > default. Empty string = unset.\n * Prefix `LEGALIZE_` is mandatory; no aliases.\n */\n\nimport { AuthenticationError } from \"./errors.js\";\n\nexport const DEFAULT_BASE_URL = \"https://legalize.dev\";\nexport const DEFAULT_API_VERSION = \"v1\";\nexport const DEFAULT_TIMEOUT = 30_000; // ms\n\nexport const KEY_PREFIX = \"leg_\";\n\n/**\n * Resolve the API key from the explicit argument or the environment.\n *\n * Raises AuthenticationError synchronously if no key is available or the\n * key prefix is unrecognized. Catching obviously-bad inputs before the\n * first network call saves operators from debugging 401s later.\n */\nexport function resolveApiKey(apiKey: string | undefined): string {\n let key = apiKey;\n if (key === undefined) {\n const envKey = process.env.LEGALIZE_API_KEY;\n key = envKey || undefined;\n }\n if (!key) {\n throw new AuthenticationError({\n message: \"Missing API key. Pass apiKey=... or set LEGALIZE_API_KEY.\",\n statusCode: 401,\n code: \"missing_api_key\",\n });\n }\n if (!key.startsWith(KEY_PREFIX)) {\n throw new AuthenticationError({\n message: `API key format unrecognized. Keys start with \"${KEY_PREFIX}\".`,\n statusCode: 401,\n code: \"invalid_api_key\",\n });\n }\n return key;\n}\n\n/**\n * Resolve the base URL from the explicit argument, env, or default.\n * Empty strings are treated as unset.\n */\nexport function resolveBaseUrl(baseUrl: string | undefined): string {\n if (baseUrl !== undefined) {\n return baseUrl;\n }\n const envUrl = process.env.LEGALIZE_BASE_URL;\n if (envUrl && envUrl.length > 0) {\n return envUrl;\n }\n return DEFAULT_BASE_URL;\n}\n\n/**\n * Resolve the API version from the explicit argument, env, or default.\n * Empty strings are treated as unset.\n */\nexport function resolveApiVersion(apiVersion: string | undefined): string {\n if (apiVersion !== undefined) {\n return apiVersion;\n }\n const envVer = process.env.LEGALIZE_API_VERSION;\n if (envVer && envVer.length > 0) {\n return envVer;\n }\n return DEFAULT_API_VERSION;\n}\n","/** `/api/v1/countries` — list every country the API serves. */\n\nimport type { Legalize } from \"../client.js\";\nimport type { CountryInfo } from \"../types.js\";\n\nconst API = \"/api/v1\";\n\nexport class Countries {\n private readonly client: Legalize;\n constructor(client: Legalize) {\n this.client = client;\n }\n\n /** Return every country the API serves, with law counts. */\n async list(options: { signal?: AbortSignal } = {}): Promise<CountryInfo[]> {\n return this.client.request<CountryInfo[]>(\"GET\", `${API}/countries`, {\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n}\n","/** `/api/v1/{country}/jurisdictions` — regions/states within a country. */\n\nimport type { Legalize } from \"../client.js\";\nimport type { JurisdictionInfo } from \"../types.js\";\n\nconst API = \"/api/v1\";\n\nexport class Jurisdictions {\n private readonly client: Legalize;\n constructor(client: Legalize) {\n this.client = client;\n }\n\n /** List jurisdictions for a country (e.g. Spain's comunidades). */\n async list(\n country: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<JurisdictionInfo[]> {\n return this.client.request<JurisdictionInfo[]>(\"GET\", `${API}/${country}/jurisdictions`, {\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n}\n","/**\n * Pagination helpers — async iterators over page- and offset-based endpoints.\n *\n * The Legalize API uses two pagination styles:\n *\n * - page + perPage — laws list, webhook deliveries\n * - limit + offset — reforms\n *\n * Each paginated response carries `total` (true match count). That lets\n * iterators terminate without inferring end-of-stream.\n *\n * The iterators here are transport-agnostic: they delegate fetching to\n * a caller-supplied async callback.\n */\n\nexport const PAGE_MAX = 100;\n\n/** Async iterator over a page-based endpoint (page + perPage). */\nexport class PageIterator<T> implements AsyncIterableIterator<T> {\n private readonly fetchPage: (page: number, perPage: number) => Promise<[T[], number]>;\n private readonly perPage: number;\n private readonly limit: number | undefined;\n private page: number;\n private yielded: number;\n private buffer: T[];\n private bufferIdx: number;\n private total: number;\n private shortPage: boolean;\n\n constructor(\n fetchPage: (page: number, perPage: number) => Promise<[T[], number]>,\n options: { perPage?: number; limit?: number; startPage?: number } = {},\n ) {\n const perPage = options.perPage ?? PAGE_MAX;\n if (perPage < 1 || perPage > PAGE_MAX) {\n throw new RangeError(`perPage must be between 1 and ${PAGE_MAX}`);\n }\n if (options.limit !== undefined && options.limit < 0) {\n throw new RangeError(\"limit must be >= 0\");\n }\n this.fetchPage = fetchPage;\n this.perPage = perPage;\n this.limit = options.limit;\n this.page = options.startPage ?? 1;\n this.yielded = 0;\n this.buffer = [];\n this.bufferIdx = 0;\n this.total = 0;\n this.shortPage = false;\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n }\n\n async next(): Promise<IteratorResult<T>> {\n // Serve from the in-memory buffer first.\n while (true) {\n if (this.limit !== undefined && this.yielded >= this.limit) {\n return { value: undefined, done: true };\n }\n\n if (this.bufferIdx < this.buffer.length) {\n const item = this.buffer[this.bufferIdx]!;\n this.bufferIdx += 1;\n this.yielded += 1;\n return { value: item, done: false };\n }\n\n // Buffer exhausted. Decide whether to fetch the next page.\n if (this.yielded > 0 && this.yielded >= this.total) {\n return { value: undefined, done: true };\n }\n if (this.shortPage) {\n return { value: undefined, done: true };\n }\n\n const [items, total] = await this.fetchPage(this.page, this.perPage);\n if (items.length === 0) {\n return { value: undefined, done: true };\n }\n this.buffer = items;\n this.bufferIdx = 0;\n this.total = total;\n this.shortPage = items.length < this.perPage;\n this.page += 1;\n }\n }\n}\n\n/** Async iterator over a limit/offset-based endpoint (reforms). */\nexport class OffsetIterator<T> implements AsyncIterableIterator<T> {\n private readonly fetchPage: (limit: number, offset: number) => Promise<[T[], number]>;\n private readonly batch: number;\n private readonly limit: number | undefined;\n private offset: number;\n private yielded: number;\n private buffer: T[];\n private bufferIdx: number;\n private done: boolean;\n\n constructor(\n fetchPage: (limit: number, offset: number) => Promise<[T[], number]>,\n options: { batch?: number; limit?: number; startOffset?: number } = {},\n ) {\n const batch = options.batch ?? 100;\n if (batch < 1) {\n throw new RangeError(\"batch must be >= 1\");\n }\n if (options.limit !== undefined && options.limit < 0) {\n throw new RangeError(\"limit must be >= 0\");\n }\n this.fetchPage = fetchPage;\n this.batch = batch;\n this.limit = options.limit;\n this.offset = options.startOffset ?? 0;\n this.yielded = 0;\n this.buffer = [];\n this.bufferIdx = 0;\n this.done = false;\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n }\n\n async next(): Promise<IteratorResult<T>> {\n while (true) {\n if (this.limit !== undefined && this.yielded >= this.limit) {\n return { value: undefined, done: true };\n }\n\n // Serve from the current batch buffer first.\n if (this.bufferIdx < this.buffer.length) {\n const item = this.buffer[this.bufferIdx]!;\n this.bufferIdx += 1;\n this.yielded += 1;\n return { value: item, done: false };\n }\n\n // Buffer drained. If a prior batch told us we were done, stop.\n if (this.done) return { value: undefined, done: true };\n\n const [items, total] = await this.fetchPage(this.batch, this.offset);\n if (items.length === 0) {\n this.done = true;\n return { value: undefined, done: true };\n }\n this.buffer = items;\n this.bufferIdx = 0;\n this.offset += items.length;\n // Flag termination for the next round-trip; still serve this batch.\n if (this.offset >= total) this.done = true;\n else if (items.length < this.batch) this.done = true;\n }\n }\n}\n","/**\n * `/api/v1/{country}/laws` and sub-resources.\n *\n * Covers:\n * - `list` / `search` — listing vs. full-text search\n * - `iter` / `searchIter` — auto-paginated async iterators\n * - `retrieve` — full law with Markdown content\n * - `meta` — metadata only (fast, no GitHub fetch)\n * - `commits` — git commit history\n * - `atCommit` — time-travel to a specific SHA\n */\n\nimport type { Legalize } from \"../client.js\";\nimport { PageIterator } from \"../pagination.js\";\nimport type {\n CommitsResponse,\n LawAtCommitResponse,\n LawDetail,\n LawIterOptions,\n LawListOptions,\n LawMeta,\n LawSearchOptions,\n LawSearchResult,\n PaginatedLaws,\n} from \"../types.js\";\n\nconst API = \"/api/v1\";\n\nfunction buildFilterParams(\n opts: LawIterOptions | LawListOptions | LawSearchOptions,\n extras: Record<string, unknown>,\n): Record<string, unknown> {\n return {\n law_type: opts.lawType,\n year: opts.year,\n status: opts.status,\n jurisdiction: opts.jurisdiction,\n from_date: opts.fromDate,\n to_date: opts.toDate,\n sort: opts.sort,\n ...extras,\n };\n}\n\nexport class Laws {\n private readonly client: Legalize;\n constructor(client: Legalize) {\n this.client = client;\n }\n\n /** Return a single page of laws for a country. */\n async list(\n country: string,\n options: LawListOptions & { signal?: AbortSignal } = {},\n ): Promise<PaginatedLaws> {\n const params = buildFilterParams(options, {\n page: options.page ?? 1,\n per_page: options.perPage ?? 50,\n });\n return this.client.request<PaginatedLaws>(\"GET\", `${API}/${country}/laws`, {\n params,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** Full-text search for laws. `q` is required. */\n async search(\n country: string,\n q: string,\n options: LawSearchOptions & { signal?: AbortSignal } = {},\n ): Promise<PaginatedLaws> {\n if (!q || !q.trim()) {\n throw new TypeError(\"q must be a non-empty search query\");\n }\n const params = buildFilterParams(options, {\n page: options.page ?? 1,\n per_page: options.perPage ?? 50,\n q,\n });\n return this.client.request<PaginatedLaws>(\"GET\", `${API}/${country}/laws`, {\n params,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** Auto-paginate across every matching law. */\n iter(\n country: string,\n options: LawIterOptions & { signal?: AbortSignal } = {},\n ): AsyncIterableIterator<LawSearchResult> {\n const perPage = options.perPage ?? 100;\n const limit = options.limit;\n const fetchPage = async (page: number, per: number): Promise<[LawSearchResult[], number]> => {\n const listOpts: LawListOptions & { signal?: AbortSignal } = {\n page,\n perPage: per,\n lawType: options.lawType,\n year: options.year,\n status: options.status,\n jurisdiction: options.jurisdiction,\n fromDate: options.fromDate,\n toDate: options.toDate,\n sort: options.sort,\n };\n if (options.signal) listOpts.signal = options.signal;\n const resp = await this.list(country, listOpts);\n return [resp.results, resp.total];\n };\n return new PageIterator(fetchPage, { perPage, ...(limit !== undefined ? { limit } : {}) });\n }\n\n /** Auto-paginate across every match of a full-text search. */\n searchIter(\n country: string,\n q: string,\n options: LawIterOptions & { signal?: AbortSignal } = {},\n ): AsyncIterableIterator<LawSearchResult> {\n if (!q || !q.trim()) {\n throw new TypeError(\"q must be a non-empty search query\");\n }\n const perPage = options.perPage ?? 100;\n const limit = options.limit;\n const fetchPage = async (page: number, per: number): Promise<[LawSearchResult[], number]> => {\n const searchOpts: LawSearchOptions & { signal?: AbortSignal } = {\n page,\n perPage: per,\n lawType: options.lawType,\n year: options.year,\n status: options.status,\n jurisdiction: options.jurisdiction,\n fromDate: options.fromDate,\n toDate: options.toDate,\n sort: options.sort,\n };\n if (options.signal) searchOpts.signal = options.signal;\n const resp = await this.search(country, q, searchOpts);\n return [resp.results, resp.total];\n };\n return new PageIterator(fetchPage, { perPage, ...(limit !== undefined ? { limit } : {}) });\n }\n\n /** Fetch the full law including Markdown content. */\n async retrieve(\n country: string,\n lawId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<LawDetail> {\n return this.client.request<LawDetail>(\"GET\", `${API}/${country}/laws/${lawId}`, {\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** Fetch only the law metadata (no content). */\n async meta(\n country: string,\n lawId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<LawMeta> {\n return this.client.request<LawMeta>(\"GET\", `${API}/${country}/laws/${lawId}/meta`, {\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** Git commit history for the law. */\n async commits(\n country: string,\n lawId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<CommitsResponse> {\n return this.client.request<CommitsResponse>(\n \"GET\",\n `${API}/${country}/laws/${lawId}/commits`,\n { ...(options.signal ? { signal: options.signal } : {}) },\n );\n }\n\n /** Return the law's full text at a specific historical version. */\n async atCommit(\n country: string,\n lawId: string,\n sha: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<LawAtCommitResponse> {\n return this.client.request<LawAtCommitResponse>(\n \"GET\",\n `${API}/${country}/laws/${lawId}/at/${sha}`,\n { ...(options.signal ? { signal: options.signal } : {}) },\n );\n }\n}\n","/** `/api/v1/{country}/law-types` — law types per country. */\n\nimport type { Legalize } from \"../client.js\";\n\nconst API = \"/api/v1\";\n\nexport class LawTypes {\n private readonly client: Legalize;\n constructor(client: Legalize) {\n this.client = client;\n }\n\n /** List law type identifiers (e.g. `[\"constitucion\", \"ley\", \"real_decreto\"]`). */\n async list(country: string, options: { signal?: AbortSignal } = {}): Promise<string[]> {\n return this.client.request<string[]>(\"GET\", `${API}/${country}/law-types`, {\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n}\n","/** `/api/v1/{country}/laws/{law_id}/reforms` — reform history. */\n\nimport type { Legalize } from \"../client.js\";\nimport { OffsetIterator } from \"../pagination.js\";\nimport type { Reform, ReformIterOptions, ReformListOptions, ReformsResponse } from \"../types.js\";\n\nconst API = \"/api/v1\";\n\nexport class Reforms {\n private readonly client: Legalize;\n constructor(client: Legalize) {\n this.client = client;\n }\n\n /** Return a single page of reforms for a law. */\n async list(\n country: string,\n lawId: string,\n options: ReformListOptions & { signal?: AbortSignal } = {},\n ): Promise<ReformsResponse> {\n const params: Record<string, unknown> = {\n limit: options.limit ?? 100,\n offset: options.offset ?? 0,\n };\n return this.client.request<ReformsResponse>(\n \"GET\",\n `${API}/${country}/laws/${lawId}/reforms`,\n { params, ...(options.signal ? { signal: options.signal } : {}) },\n );\n }\n\n /** Auto-paginate across every reform for a law. */\n iter(\n country: string,\n lawId: string,\n options: ReformIterOptions & { signal?: AbortSignal } = {},\n ): AsyncIterableIterator<Reform> {\n const batch = options.batch ?? 100;\n const limit = options.limit;\n const fetchPage = async (limitArg: number, offset: number): Promise<[Reform[], number]> => {\n const listOpts: ReformListOptions & { signal?: AbortSignal } = {\n limit: limitArg,\n offset,\n };\n if (options.signal) listOpts.signal = options.signal;\n const resp = await this.list(country, lawId, listOpts);\n return [resp.reforms, resp.total];\n };\n return new OffsetIterator(fetchPage, { batch, ...(limit !== undefined ? { limit } : {}) });\n }\n}\n","/** `/api/v1/{country}/stats` — aggregate statistics for a country. */\n\nimport type { Legalize } from \"../client.js\";\nimport type { StatsOptions, StatsResponse } from \"../types.js\";\n\nconst API = \"/api/v1\";\n\nexport class Stats {\n private readonly client: Legalize;\n constructor(client: Legalize) {\n this.client = client;\n }\n\n /** Return aggregate stats for a country (and optionally a jurisdiction). */\n async retrieve(\n country: string,\n options: StatsOptions & { signal?: AbortSignal } = {},\n ): Promise<StatsResponse> {\n const params: Record<string, unknown> = { jurisdiction: options.jurisdiction };\n return this.client.request<StatsResponse>(\"GET\", `${API}/${country}/stats`, {\n params,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n}\n","/**\n * `/api/v1/webhooks` — endpoint management + delivery history + test ping.\n *\n * The management endpoints (this file) require Pro+ tier. The webhook\n * signature verification utility lives in `webhooks.ts` at the package\n * root — it runs on the recipient's server and doesn't touch this API.\n */\n\nimport type { Legalize } from \"../client.js\";\nimport type {\n WebhookCreateOptions,\n WebhookDeliveriesOptions,\n WebhookDeliveriesPage,\n WebhookDelivery,\n WebhookEndpoint,\n WebhookUpdateOptions,\n} from \"../types.js\";\n\nconst API = \"/api/v1\";\n\nconst VALID_STATUSES = new Set([\"failed\", \"success\", \"pending\"]);\n\nexport class Webhooks {\n private readonly client: Legalize;\n constructor(client: Legalize) {\n this.client = client;\n }\n\n /** Create a webhook endpoint. Returns the signing secret ONCE. */\n async create(\n options: WebhookCreateOptions & { signal?: AbortSignal },\n ): Promise<WebhookEndpoint> {\n const body: Record<string, unknown> = {\n url: options.url,\n event_types: options.eventTypes,\n countries: options.countries ?? null,\n description: options.description ?? \"\",\n };\n return this.client.request<WebhookEndpoint>(\"POST\", `${API}/webhooks`, {\n json: body,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** List all webhook endpoints for the authenticated org. */\n async list(options: { signal?: AbortSignal } = {}): Promise<WebhookEndpoint[]> {\n return this.client.request<WebhookEndpoint[]>(\"GET\", `${API}/webhooks`, {\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** Fetch a single endpoint by id. */\n async retrieve(\n endpointId: number,\n options: { signal?: AbortSignal } = {},\n ): Promise<WebhookEndpoint> {\n return this.client.request<WebhookEndpoint>(\"GET\", `${API}/webhooks/${endpointId}`, {\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** Patch mutable fields on a webhook endpoint. */\n async update(\n endpointId: number,\n options: WebhookUpdateOptions & { signal?: AbortSignal },\n ): Promise<WebhookEndpoint> {\n const body: Record<string, unknown> = {};\n if (options.url !== undefined) body.url = options.url;\n if (options.eventTypes !== undefined) body.event_types = options.eventTypes;\n if (options.countries !== undefined) body.countries = options.countries;\n if (options.description !== undefined) body.description = options.description;\n if (options.enabled !== undefined) body.enabled = options.enabled;\n return this.client.request<WebhookEndpoint>(\"PATCH\", `${API}/webhooks/${endpointId}`, {\n json: body,\n ...(options.signal ? { signal: options.signal } : {}),\n });\n }\n\n /** Delete a webhook endpoint. */\n async delete(\n endpointId: number,\n options: { signal?: AbortSignal } = {},\n ): Promise<Record<string, unknown>> {\n return this.client.request<Record<string, unknown>>(\n \"DELETE\",\n `${API}/webhooks/${endpointId}`,\n { ...(options.signal ? { signal: options.signal } : {}) },\n );\n }\n\n /** List delivery attempts for an endpoint, optionally filtered by status. */\n async deliveries(\n endpointId: number,\n options: WebhookDeliveriesOptions & { signal?: AbortSignal } = {},\n ): Promise<WebhookDeliveriesPage> {\n if (options.status !== undefined && !VALID_STATUSES.has(options.status)) {\n throw new TypeError(\n \"status must be 'failed', 'success', 'pending', or omitted\",\n );\n }\n const params: Record<string, unknown> = {\n page: options.page ?? 1,\n status: options.status,\n };\n return this.client.request<WebhookDeliveriesPage>(\n \"GET\",\n `${API}/webhooks/${endpointId}/deliveries`,\n { params, ...(options.signal ? { signal: options.signal } : {}) },\n );\n }\n\n /** Retry a failed delivery. */\n async retry(\n endpointId: number,\n deliveryId: number,\n options: { signal?: AbortSignal } = {},\n ): Promise<WebhookDelivery> {\n return this.client.request<WebhookDelivery>(\n \"POST\",\n `${API}/webhooks/${endpointId}/deliveries/${deliveryId}/retry`,\n { ...(options.signal ? { signal: options.signal } : {}) },\n );\n }\n\n /** Send a `test.ping` event to verify the endpoint is reachable. */\n async test(\n endpointId: number,\n options: { signal?: AbortSignal } = {},\n ): Promise<WebhookDelivery> {\n return this.client.request<WebhookDelivery>(\n \"POST\",\n `${API}/webhooks/${endpointId}/test`,\n { ...(options.signal ? { signal: options.signal } : {}) },\n );\n }\n}\n","/**\n * SDK version — MUST be kept in sync with the \"version\" field in package.json.\n *\n * The Node runtime doesn't resolve JSON imports cleanly across ESM/CJS dual\n * output without extra wiring, so we duplicate the literal here. The test\n * suite asserts they match so drift is caught immediately.\n */\nexport const SDK_VERSION = \"0.1.0\";\n","/**\n * HTTP client core — the `Legalize` class.\n *\n * Wraps the built-in `fetch` with:\n * - auth + identifying headers on every request\n * - query-param cleanup matching the Python reference\n * - retry policy with exponential backoff (see `retry.ts`)\n * - error hierarchy mapping (see `errors.ts`)\n * - per-request AbortSignal support\n * - `lastResponse` populated on success AND error, for inspecting\n * rate-limit headers and X-Request-Id after failures\n *\n * Design notes:\n * - No runtime deps. Node 20+ ships `fetch`, `AbortController`, and\n * `crypto.webcrypto` — we use only those.\n * - `follow_redirects` is effectively false: the server doesn't\n * redirect, and silently following one would hide misconfigurations.\n * `fetch` supports \"manual\" redirect mode so we use it.\n */\n\nimport * as os from \"node:os\";\n\nimport {\n APIConnectionError,\n APIError,\n APITimeoutError,\n} from \"./errors.js\";\nimport {\n DEFAULT_API_VERSION,\n DEFAULT_BASE_URL,\n DEFAULT_TIMEOUT,\n resolveApiKey,\n resolveApiVersion,\n resolveBaseUrl,\n} from \"./env.js\";\nimport { RetryPolicy, parseRetryAfter, sleep } from \"./retry.js\";\nimport { Countries } from \"./resources/countries.js\";\nimport { Jurisdictions } from \"./resources/jurisdictions.js\";\nimport { Laws } from \"./resources/laws.js\";\nimport { LawTypes } from \"./resources/lawTypes.js\";\nimport { Reforms } from \"./resources/reforms.js\";\nimport { Stats } from \"./resources/stats.js\";\nimport { Webhooks } from \"./resources/webhooks.js\";\nimport { SDK_VERSION } from \"./version.js\";\n\nexport { DEFAULT_API_VERSION, DEFAULT_BASE_URL, DEFAULT_TIMEOUT };\n\n/** Compose the User-Agent the SDK sends with every request. */\nexport function defaultUserAgent(): string {\n // Example: \"legalize-node/0.1.0 node/v20.10.0 darwin\"\n return `legalize-node/${SDK_VERSION} node/${process.version} ${os.platform()}`;\n}\n\n// O(n) non-regex trimmer — avoids polynomial backtracking on a\n// pathological base URL, even though the input is trusted.\nfunction stripTrailingSlashes(s: string): string {\n let end = s.length;\n while (end > 0 && s.charCodeAt(end - 1) === 47 /* \"/\" */) end--;\n return s.slice(0, end);\n}\n\n/** The fetch implementation the client uses. Global by default; overridable. */\nexport type FetchImpl = typeof fetch;\n\nexport interface LegalizeOptions {\n apiKey?: string;\n baseUrl?: string;\n apiVersion?: string;\n /** Timeout in milliseconds. Default 30000. */\n timeout?: number;\n maxRetries?: number;\n retry?: RetryPolicy;\n defaultHeaders?: Record<string, string>;\n /** Override fetch — primarily for tests. */\n fetch?: FetchImpl;\n}\n\nexport interface RequestOptions {\n params?: Record<string, unknown>;\n json?: unknown;\n extraHeaders?: Record<string, string>;\n signal?: AbortSignal;\n /**\n * Override the retry policy's idempotency check for this call.\n * POST/PATCH are NOT retried by default.\n */\n idempotencyKey?: string;\n}\n\n/**\n * Synchronous-API, promise-based client for the Legalize API.\n *\n * Example:\n *\n * import { Legalize } from \"@legalize-dev/sdk\";\n *\n * const client = new Legalize({ apiKey: \"leg_...\" });\n * const countries = await client.countries.list();\n *\n * Use `await using` (TS 5.2+) for deterministic cleanup:\n *\n * await using client = new Legalize({ apiKey: \"leg_...\" });\n */\nexport class Legalize {\n readonly countries: Countries;\n readonly jurisdictions: Jurisdictions;\n readonly lawTypes: LawTypes;\n readonly laws: Laws;\n readonly reforms: Reforms;\n readonly stats: Stats;\n readonly webhooks: Webhooks;\n\n /** Exposed for tests; treat as private otherwise. */\n readonly _apiKey: string;\n readonly _baseUrl: string;\n readonly _apiVersion: string;\n readonly _headers: Record<string, string>;\n\n private readonly _timeout: number;\n private readonly _retry: RetryPolicy;\n private readonly _fetch: FetchImpl;\n private _lastResponse: Response | null = null;\n\n constructor(options: LegalizeOptions = {}) {\n this._apiKey = resolveApiKey(options.apiKey);\n this._baseUrl = stripTrailingSlashes(resolveBaseUrl(options.baseUrl));\n this._apiVersion = resolveApiVersion(options.apiVersion);\n this._timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this._retry = resolveRetryPolicy(options.retry, options.maxRetries);\n this._fetch = options.fetch ?? globalThis.fetch;\n\n this._headers = buildHeaders(this._apiKey, this._apiVersion, options.defaultHeaders);\n\n this.countries = new Countries(this);\n this.jurisdictions = new Jurisdictions(this);\n this.lawTypes = new LawTypes(this);\n this.laws = new Laws(this);\n this.reforms = new Reforms(this);\n this.stats = new Stats(this);\n this.webhooks = new Webhooks(this);\n }\n\n /** The raw HTTP response from the most recent request, or null. */\n get lastResponse(): Response | null {\n return this._lastResponse;\n }\n\n /**\n * Execute a request and return the parsed JSON body (or null for 204).\n *\n * Throws an APIError subclass on non-2xx responses (after retries),\n * APITimeoutError on timeout, or APIConnectionError on transport\n * failure.\n */\n async request<T = unknown>(\n method: string,\n path: string,\n options: RequestOptions = {},\n ): Promise<T> {\n const upperMethod = method.toUpperCase();\n const url = this.buildUrl(path, options.params);\n const headers = { ...this._headers };\n if (options.extraHeaders) Object.assign(headers, options.extraHeaders);\n if (options.idempotencyKey) headers[\"Idempotency-Key\"] = options.idempotencyKey;\n\n const hasJson = options.json !== undefined;\n if (hasJson) headers[\"Content-Type\"] = \"application/json\";\n\n let attempt = 0;\n while (true) {\n let response: Response;\n try {\n response = await this.sendOnce(url, upperMethod, headers, options, hasJson);\n } catch (err) {\n const shouldRetry = this._retry.shouldRetry(attempt, { method: upperMethod });\n if (!shouldRetry) {\n throw wrapTransportError(err);\n }\n const delay = this._retry.computeDelay(attempt, {});\n await sleep(delay);\n attempt += 1;\n continue;\n }\n\n if (response.status >= 200 && response.status < 300) {\n this._lastResponse = response;\n if (response.status === 204) return null as T;\n const text = await response.text();\n if (!text) return null as T;\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new APIError({\n message: \"Server returned non-JSON body\",\n statusCode: response.status,\n body: text,\n response,\n cause: err,\n });\n }\n }\n\n // Non-2xx: decide whether to retry.\n const shouldRetry = this._retry.shouldRetry(attempt, {\n status: response.status,\n method: upperMethod,\n });\n if (!shouldRetry) {\n this._lastResponse = response;\n throw await errorFromResponse(response);\n }\n\n const retryAfter = parseRetryAfter(response.headers.get(\"retry-after\"));\n const delay = this._retry.computeDelay(attempt, { retryAfter });\n // Drain the response body so the socket can be reused.\n try {\n await response.text();\n } catch {\n /* no-op — best-effort drain */\n }\n await sleep(delay);\n attempt += 1;\n }\n }\n\n /** Release any resources held by the client. Kept for API symmetry. */\n async close(): Promise<void> {\n // Native fetch doesn't expose a connection pool to close; this is\n // a no-op. Declared async so callers can `await close()` without\n // rewriting if we later wire in a custom pool.\n }\n\n /** TS 5.2+ `using` / `await using` support. */\n async [Symbol.asyncDispose](): Promise<void> {\n await this.close();\n }\n\n // ---- internals --------------------------------------------------------\n\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n let base: string;\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n base = path;\n } else {\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n base = this._baseUrl + p;\n }\n if (!params) return base;\n const query = buildQueryString(params);\n if (!query) return base;\n return base.includes(\"?\") ? `${base}&${query}` : `${base}?${query}`;\n }\n\n private async sendOnce(\n url: string,\n method: string,\n headers: Record<string, string>,\n options: RequestOptions,\n hasJson: boolean,\n ): Promise<Response> {\n const controller = new AbortController();\n const timeoutMs = this._timeout;\n const timeoutHandle = setTimeout(() => controller.abort(new TimeoutSignal()), timeoutMs);\n let externalListener: (() => void) | undefined;\n if (options.signal) {\n if (options.signal.aborted) controller.abort(options.signal.reason);\n externalListener = () => controller.abort(options.signal!.reason);\n options.signal.addEventListener(\"abort\", externalListener, { once: true });\n }\n try {\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n redirect: \"manual\",\n };\n if (hasJson) init.body = JSON.stringify(options.json);\n return await this._fetch(url, init);\n } finally {\n clearTimeout(timeoutHandle);\n if (options.signal && externalListener) {\n options.signal.removeEventListener(\"abort\", externalListener);\n }\n }\n }\n}\n\nclass TimeoutSignal extends Error {\n override readonly name = \"TimeoutSignal\";\n constructor() {\n super(\"request timed out\");\n }\n}\n\nfunction resolveRetryPolicy(\n policy: RetryPolicy | undefined,\n maxRetries: number | undefined,\n): RetryPolicy {\n if (policy !== undefined) return policy;\n if (maxRetries === undefined) return new RetryPolicy();\n return new RetryPolicy({ maxRetries });\n}\n\nfunction buildHeaders(\n apiKey: string,\n apiVersion: string,\n extra: Record<string, string> | undefined,\n): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": defaultUserAgent(),\n \"Legalize-API-Version\": apiVersion,\n Accept: \"application/json\",\n };\n if (extra) Object.assign(headers, extra);\n return headers;\n}\n\n/**\n * Serialize query params matching the Python reference:\n * - undefined/null → dropped.\n * - booleans → \"true\" / \"false\".\n * - arrays → comma-joined; empty arrays dropped.\n * - everything else → String(value).\n */\nexport function buildQueryString(params: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n let serialized: string;\n if (typeof value === \"boolean\") {\n serialized = value ? \"true\" : \"false\";\n } else if (Array.isArray(value)) {\n if (value.length === 0) continue;\n serialized = value.map((v) => String(v)).join(\",\");\n } else {\n serialized = String(value);\n }\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(serialized)}`);\n }\n return parts.join(\"&\");\n}\n\nasync function errorFromResponse(response: Response): Promise<APIError> {\n const text = await response.text();\n let data: unknown = undefined;\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = undefined;\n }\n }\n return APIError.fromResponse(response, text, data);\n}\n\nfunction wrapTransportError(err: unknown): Error {\n if (err instanceof Error) {\n const isAbort =\n err.name === \"AbortError\" || (err as { code?: string }).code === \"ABORT_ERR\";\n const causeName = (err as { cause?: { name?: string } }).cause?.name;\n const isTimeout =\n isAbort &&\n (err.message.includes(\"timed out\") ||\n err.message.toLowerCase().includes(\"timeout\") ||\n causeName === \"TimeoutSignal\");\n if (isTimeout) {\n return new APITimeoutError(\"request timed out\", { cause: err });\n }\n if (isAbort) {\n return new APIConnectionError(\"request aborted\", { cause: err });\n }\n return new APIConnectionError(err.message || \"transport error\", { cause: err });\n }\n return new APIConnectionError(\"transport error\");\n}\n","/**\n * Webhook signature verification.\n *\n * Mirrors the server-side signer in the Legalize web backend. The scheme\n * is Stripe-shaped:\n *\n * - Signed content: `${timestamp}.${rawJsonBody}` — RAW bytes, never\n * a re-serialized JSON string. Reserialization will break the signature.\n * - Algorithm: HMAC-SHA256, hex-encoded.\n * - Header format: `v1=<hex>`. A future v2 scheme can coexist:\n * `X-Legalize-Signature: v1=<sig1>,v2=<sig2>`.\n * - Replay protection: reject if the header timestamp is more than\n * `tolerance` seconds away from `now`. Default 300 seconds.\n *\n * Usage (Express):\n *\n * import express from \"express\";\n * import { Webhook, WebhookVerificationError } from \"@legalize-dev/sdk\";\n *\n * app.post(\"/webhooks/legalize\",\n * express.raw({ type: \"application/json\" }),\n * (req, res) => {\n * try {\n * const event = Webhook.verify({\n * payload: req.body, // Buffer\n * sigHeader: req.header(\"X-Legalize-Signature\") ?? \"\",\n * timestamp: req.header(\"X-Legalize-Timestamp\") ?? \"\",\n * secret: process.env.LEGALIZE_WHSEC!,\n * });\n * if (event.type === \"law.updated\") { ... }\n * res.status(204).send();\n * } catch (err) {\n * res.status(400).send();\n * }\n * });\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\n\nimport { WebhookVerificationError } from \"./errors.js\";\n\nexport const DEFAULT_TOLERANCE_SECONDS = 300; // 5 minutes — matches server\nconst SUPPORTED_SCHEMES = [\"v1\"];\n\nexport interface WebhookEvent {\n /** Server-assigned event id (e.g. `evt_...`). */\n readonly id: string;\n /** Event type (`law.created`, `law.updated`, `law.repealed`, ...). */\n readonly type: string;\n /** Server-side timestamp (ISO-8601 string). */\n readonly createdAt: string;\n /** Event-specific payload body. */\n readonly data: Record<string, unknown>;\n /** The full decoded JSON body — useful for fields the SDK doesn't type. */\n readonly raw: Record<string, unknown>;\n}\n\nexport interface WebhookVerifyOptions {\n /** The raw request body bytes. Do NOT pass a re-serialized JSON string. */\n payload: Buffer | Uint8Array | string;\n /** The `X-Legalize-Signature` header value. May contain several `vN=<hex>` pairs. */\n sigHeader: string;\n /** The `X-Legalize-Timestamp` header value (Unix seconds, decimal string). */\n timestamp: string;\n /** The endpoint's signing secret. */\n secret: string;\n /** Seconds of clock skew accepted. Default 300. */\n tolerance?: number;\n /** Unit-test hook: override the reference wall clock (Unix seconds). */\n now?: number;\n}\n\nexport class Webhook {\n /** Default anti-replay tolerance. */\n static readonly TOLERANCE = DEFAULT_TOLERANCE_SECONDS;\n\n /** Compute the canonical `v1=<hex>` signature for (payload, timestamp). */\n static computeSignature(secret: string, payload: Buffer | Uint8Array | string, timestamp: string): string {\n const payloadBuf = normalizePayload(payload);\n const signed = Buffer.concat([\n Buffer.from(timestamp, \"utf8\"),\n Buffer.from(\".\", \"utf8\"),\n payloadBuf,\n ]);\n const sig = createHmac(\"sha256\", secret).update(signed).digest(\"hex\");\n return `v1=${sig}`;\n }\n\n /**\n * Verify a webhook delivery and return the parsed event.\n *\n * Signature verification happens BEFORE JSON parsing, to protect the\n * process from resource-exhaustion on unauthenticated bodies.\n *\n * Throws WebhookVerificationError on any failure. The `.reason`\n * field identifies which check tripped for server-side logging,\n * while the user-facing message stays generic.\n */\n static verify(options: WebhookVerifyOptions): WebhookEvent {\n if (!options.sigHeader || !options.timestamp || !options.secret) {\n throw new WebhookVerificationError(\"missing_header\");\n }\n\n const payloadBuf = normalizePayload(options.payload);\n\n // ---- timestamp (anti-replay) --------------------------------------\n if (!/^-?\\d+$/.test(options.timestamp.trim())) {\n throw new WebhookVerificationError(\"bad_timestamp\");\n }\n const ts = parseInt(options.timestamp.trim(), 10);\n if (Number.isNaN(ts)) {\n throw new WebhookVerificationError(\"bad_timestamp\");\n }\n const tol = options.tolerance ?? Webhook.TOLERANCE;\n const reference = options.now ?? Date.now() / 1000;\n if (Math.abs(reference - ts) > tol) {\n throw new WebhookVerificationError(\"timestamp_outside_tolerance\");\n }\n\n // ---- signature ----------------------------------------------------\n const expected = Webhook.computeSignature(options.secret, payloadBuf, options.timestamp);\n const expectedHex = expected.slice(expected.indexOf(\"=\") + 1);\n const candidates = extractSchemeHexes(options.sigHeader);\n if (candidates.length === 0) {\n throw new WebhookVerificationError(\"no_valid_signature\");\n }\n let match = false;\n const expectedBuf = Buffer.from(expectedHex, \"hex\");\n for (const candidate of candidates) {\n let candBuf: Buffer;\n try {\n candBuf = Buffer.from(candidate, \"hex\");\n } catch {\n continue;\n }\n if (candBuf.length !== expectedBuf.length) continue;\n if (timingSafeEqual(expectedBuf, candBuf)) {\n match = true;\n break;\n }\n }\n if (!match) {\n throw new WebhookVerificationError(\"bad_signature\");\n }\n\n // ---- parse --------------------------------------------------------\n let parsed: unknown;\n try {\n parsed = JSON.parse(payloadBuf.toString(\"utf8\"));\n } catch {\n throw new WebhookVerificationError(\"bad_signature\");\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new WebhookVerificationError(\"bad_signature\");\n }\n return webhookEventFromPayload(parsed as Record<string, unknown>);\n }\n}\n\nfunction normalizePayload(payload: Buffer | Uint8Array | string): Buffer {\n if (Buffer.isBuffer(payload)) return payload;\n if (typeof payload === \"string\") return Buffer.from(payload, \"utf8\");\n return Buffer.from(payload);\n}\n\nfunction extractSchemeHexes(header: string): string[] {\n const out: string[] = [];\n for (const rawPart of header.split(\",\")) {\n const part = rawPart.trim();\n const eq = part.indexOf(\"=\");\n if (eq < 0) continue;\n const scheme = part.slice(0, eq);\n const value = part.slice(eq + 1).trim();\n if (!value) continue;\n if (!SUPPORTED_SCHEMES.includes(scheme)) continue;\n // Hex validity is checked later via Buffer.from + length match.\n if (!/^[0-9a-fA-F]+$/.test(value)) continue;\n out.push(value);\n }\n return out;\n}\n\nfunction webhookEventFromPayload(payload: Record<string, unknown>): WebhookEvent {\n const eventType =\n (payload.event_type as string | undefined) ??\n (payload.type as string | undefined) ??\n \"\";\n return {\n id: String(payload.id ?? \"\"),\n type: String(eventType),\n createdAt: String(payload.created_at ?? \"\"),\n data:\n payload.data && typeof payload.data === \"object\" && !Array.isArray(payload.data)\n ? { ...(payload.data as Record<string, unknown>) }\n : {},\n raw: { ...payload },\n };\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@legalize-dev/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Official Node client for the Legalize API",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "type": "module",
9
+ "main": "./dist/index.cjs",
10
+ "module": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.js"
17
+ },
18
+ "require": {
19
+ "types": "./dist/index.d.cts",
20
+ "default": "./dist/index.cjs"
21
+ }
22
+ }
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "README.md",
27
+ "LICENSE",
28
+ "CHANGELOG.md"
29
+ ],
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "sideEffects": false,
34
+ "keywords": [
35
+ "legalize",
36
+ "legal",
37
+ "laws",
38
+ "api",
39
+ "sdk"
40
+ ],
41
+ "license": "MIT",
42
+ "repository": "github:legalize-dev/legalize-sdks",
43
+ "homepage": "https://legalize.dev/api/docs",
44
+ "bugs": "https://github.com/legalize-dev/legalize-sdks/issues",
45
+ "scripts": {
46
+ "build": "tsup",
47
+ "test": "vitest run --coverage",
48
+ "test:watch": "vitest",
49
+ "test:integration": "vitest run --config vitest.integration.config.ts",
50
+ "lint": "eslint .",
51
+ "typecheck": "tsc --noEmit",
52
+ "generate:types": "openapi-typescript ../openapi-sdk.json -o src/generated.ts",
53
+ "prepublishOnly": "npm run build"
54
+ },
55
+ "devDependencies": {
56
+ "@eslint/js": "^9",
57
+ "@types/node": "^22",
58
+ "@vitest/coverage-v8": "^4.1.4",
59
+ "eslint": "^9",
60
+ "openapi-typescript": "^7",
61
+ "prettier": "^3",
62
+ "tsup": "^8",
63
+ "typescript": "^5.4",
64
+ "typescript-eslint": "^8",
65
+ "vitest": "^4.1.4"
66
+ }
67
+ }