@nulvless/nulvless-js 0.1.7 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +32 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -27
- package/dist/index.d.ts +47 -27
- package/dist/index.mjs +32 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/exceptions/nulvless.exception.ts","../src/http.ts","../src/session/tabChannel.ts","../src/auth/base.ts","../src/auth/factors/index.ts","../src/auth/users/index.ts","../src/auth/sessions/index.ts","../src/auth/security/index.ts","../src/auth/challenges/index.ts","../src/auth/grants/index.ts","../src/auth/oauth/index.ts","../src/auth/admin/index.ts","../src/session/stored.ts","../src/auth/accounts.ts","../src/auth/emitter.ts","../src/auth/index.ts","../src/comms/templates/index.ts","../src/comms/index.ts","../src/session/locks.ts","../src/session/refreshFailure.ts","../src/session/manager.ts","../src/storage/adapters/local.ts","../src/storage/adapters/session.ts","../src/storage/adapters/memory.ts","../src/storage/adapters/cache.ts","../src/storage/index.ts","../src/client.ts","../src/helpers/forward-user-headers.ts","../src/helpers/auth-cache-headers.ts","../src/index.ts"],"names":[],"mappings":";AAmBO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAClC,IAAA;AAAA,EACA,WAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAA4B,IAAA,EAAiB,WAAA,EAAqB;AAC5E,IAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,OAAO,CAAA,GAAI,QAAQ,IAAA,CAAK,IAAI,IAAI,OAAO,CAAA;AAC3D,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AACF;;;ACrBA,IAAM,WAAA,GAAc,qBAAA;AAmBpB,SAAS,qBACP,KAAA,EACoC;AACpC,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,EAAM,GAAI,KAAA;AACjD;AAEA,SAAS,gBAAgB,OAAA,EAA4E;AACnG,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA2C;AAE9D,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACxD,MAAA,MAAA,CAAO,IAAI,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,CAAA;AAC3C;AAEA,SAAS,UAAA,CAAW,SAA6C,IAAA,EAAkC;AACjG,EAAA,MAAM,MAAA,GAAS,KAAK,WAAA,EAAY;AAEhC,EAAA,OAAO,OAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,EAAE,IAAA,CAAK,CAAC,CAAC,GAAG,MAAM,GAAA,CAAI,WAAA,EAAY,KAAM,MAAM,IAAI,CAAC,CAAA;AACxF;AAEO,SAAS,KAAA,CAAM,YAAkC,MAAA,EAAwC;AAC9F,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,IAAA,EAAM,MAAM,KAAA,KAAU,IAAA,GAAO,kBAAA,CAAmB,MAAA,CAAO,OAAO,KAAA,GAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;AAC1G;AAEA,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACnC,YAAY,IAAA,EAAc;AACxB,IAAA,KAAA,CAAM,CAAA,uCAAA,EAA0C,IAAI,CAAA,CAAE,CAAA;AACtD,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AAqBA,SAAS,OAAA,CAAQ,KAAc,OAAA,EAAiC;AAC9D,EAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,IAAA,OAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAS,GAAA,CAAI,OAAA,EAAS,aAAa,GAAA,EAAI;AAAA,EACxE;AACA,EAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,iBAAA;AAAA,MACN,OAAA,EAAS,CAAA,wBAAA,EAA2B,OAAA,IAAW,CAAC,CAAA,EAAA,CAAA;AAAA,MAChD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AAAA,IAC9C,WAAA,EAAa;AAAA,GACf;AACF;AAEA,SAAS,mBAAA,CACP,MACA,QAAA,EACyC;AACzC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,QAAA,EAAS;AAAA,EACpD;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA;AAEf,EAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,MAAM,MAAM,QAAA,GAAW,MAAA,CAAO,MAAM,CAAA,GAAI,eAAA;AAEnE,EAAA,MAAM,OAAA,GACJ,OAAO,MAAA,CAAO,SAAS,MAAM,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAC,CAAA,GACnE,MAAA,CAAO,SAAS,CAAA,GACjB,QAAA;AAEN,EAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AACzB;AAEO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACT,cAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,EAAA,EAAsB;AACtC,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AAAA,EACxB;AAAA,EAEA,iBAAiB,OAAA,EAA2C;AAC1D,IAAA,OACE,UAAA,CAAW,OAAA,EAAS,eAAe,CAAA,KAAM,MAAA,IACzC,UAAA,CAAW,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,eAAe,CAAA,KAAM,MAAA;AAAA,EAE/E;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,OAAA,EAAiE;AAC1F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiE;AAC3G,IAAA,OAAO,IAAA,CAAK,KAAQ,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiE;AAC1G,IAAA,OAAO,IAAA,CAAK,KAAQ,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,KAAA,CAAS,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiE;AAC5G,IAAA,OAAO,IAAA,CAAK,KAAQ,OAAA,EAAS,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,MAAA,CAAU,IAAA,EAAc,OAAA,EAAiE;AAC7F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAQ,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAA,CACN,MAAA,EACA,IAAA,EACA,OAAA,EACS;AACT,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,eAAe,GAAG,OAAO,KAAA;AAClD,IAAA,IAAI,MAAA,KAAW,KAAK,OAAO,IAAA;AAC3B,IAAA,IAAI,MAAA,KAAW,OAAO,CAAC,2BAAA,EAA6B,iCAAiC,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA;AAC9G,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,KAAQ,MAAA,EAAoB,IAAA,EAAc,UAAuB,EAAC,EAAG,UAAU,KAAA,EAAmC;AAC9H,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,QAAQ,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,UAAU,CAAA;AAEtG,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,OAAO,WAAA,IAAe,KAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,OAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,aAAA,GACJ,OAAA,IAAW,OAAA,GAAU,CAAA,GACjB,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,EAAM,EAAG,OAAO,CAAA,GAC5C,MAAA;AAEN,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAgB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,KAAK,CAAA;AAC7C,MAAA,MAAM,OAAoB,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,WAAW,MAAA,EAAO;AAEvE,MAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,CAAA,EAAW;AAC9B,QAAA,MAAM,WAAA,GAAc,UAAA,CAAW,OAAA,EAAS,cAAc,CAAA;AAEtD,QAAA,IAAI,gBAAgB,mCAAA,EAAqC;AACvD,UAAA,IAAA,CAAK,OAAO,IAAI,eAAA,CAAgB,OAAA,CAAQ,IAA8B,EAAE,QAAA,EAAS;AAAA,QACnF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,QACzC;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACtC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAE1C,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAgB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,MAC7F;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,KAAY,mBAAA,CAAoB,IAAA,EAAM,SAAS,UAAU,CAAA;AACvE,QAAA,MAAM,QAAuB,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,EAAa,SAAS,MAAA,EAAO;AAG3E,QAAA,IACE,CAAC,OAAA,IACD,IAAA,CAAK,MAAA,CAAO,cAAA,IACZ,IAAA,CAAK,sBAAA,CAAuB,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA,EAC1D;AACA,UAAA,MAAM,eAAA,GAAkB,SAAS,MAAA,KAAW,GAAA;AAC5C,UAAA,MAAM,eAAe,UAAA,CAAW,OAAA,EAAS,eAAe,CAAA,EAAG,OAAA,CAAQ,eAAe,EAAE,CAAA;AACpF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe;AAAA,YAChD,eAAA;AAAA,YACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB;AAAC,WACxC,CAAA;AACD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,OAAO,IAAA,CAAK,IAAA;AAAA,cACV,MAAA;AAAA,cACA,IAAA;AAAA,cACA,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,cAC9F;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,IAAA,KAAS,yBAAA,EAA2B;AACjE,UAAA,IAAA,CAAK,cAAA,IAAiB;AAAA,QACxB;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,IAAI,iBAAA,CAAkB,OAAA,EAAS,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QAC5D;AAEA,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAAA,MAC7B;AAEA,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAW,KAAA,EAAO,IAAA,EAAK;AAAA,IACxC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,mBAAmB,MAAM,GAAA;AAE5C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;AAElC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,IAAI,iBAAA,CAAkB,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA,EAAM,MAAM,WAAW,CAAA;AAAA,MAC1E;AAEA,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,aAAa,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAA6B;AAC1D,IAAA,IAAI,YAAY,IAAA,CAAK,IAAI,GAAG,MAAM,IAAI,iBAAiB,IAAI,CAAA;AAE3D,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,CAAA;AAExE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,UAAU,MAAA,EAAW;AACzB,QAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACpD,QAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,UAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA,GAAO,GAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEQ,YAAA,CACN,KAAA,EACA,gBAAA,EACA,KAAA,EACA,UAAA,EACwB;AACxB,IAAA,MAAM,WAAW,gBAAA,IAAmB,IAAK,IAAA,CAAK,MAAA,CAAO,YAAW,IAAK,OAAA;AAErE,IAAA,OAAO,YAAA;AAAA,MACL;AAAA,QACE,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,aAAa,EAAC,GAAI,EAAE,gBAAA,EAAkB,IAAA,CAAK,OAAO,MAAA,EAAO;AAAA,QAC7D,UAAA,EAAY,QAAA;AAAA,QACZ,GAAI,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,MAAA,GAC1B,EAAE,mBAAA,EAAqB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,KACnD,EAAC;AAAA,QACL,GAAI,KAAA,GAAQ,EAAE,gBAAA,EAAkB,KAAA,KAAU;AAAC,OAC7C;AAAA,MACA,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,MACxC;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,QAAA,EAAsC;AAC5D,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,IAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AAE1C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;;;ACtTO,IAAM,aAAN,MAAoB;AAAA,EACjB,OAAA;AAAA,EAER,WAAA,CAAY,MAAc,SAAA,EAA6C;AACrE,IAAA,MAAM,OAAQ,UAAA,CAAyD,gBAAA;AAEvE,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAA,GAAU,IAAI,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,SAAA,EAAW,CAAA,KAAA,KAAS;AAChD,MAAA,SAAA,CAAU,MAAM,IAAqB,CAAA;AAAA,IACvC,CAAC,CAAA;AAEA,IAAC,IAAA,CAAK,QAA8C,KAAA,IAAQ;AAAA,EAC/D;AAAA,EAEA,KAAK,OAAA,EAA8B;AACjC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAA,EAAS,YAAY,OAAO,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AACF,CAAA;;;AC5CA,IAAM,gBAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EAAa;AACf,CAAA;AAEA,eAAsB,aAAA,CACpB,IAAA,EACA,QAAA,EACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,EAAC,EAAE;AAE5E,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAE7B,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,GAAG,gBAAA,EAAiB,EAAE;AAE/D,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAG,EAAE;AACnE;AAEO,IAAe,gBAAf,MAA6B;AAAA,EAClC,WAAA,CACqB,MACA,QAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAClB;AAAA,EAFkB,IAAA;AAAA,EACA,QAAA;AAAA,EAGX,OAAO,OAAA,EAAqD;AACpE,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACxD;AACF,CAAA;;;AChBO,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAK/C,MAAM,KAAK,OAAA,EAAiE;AAC1E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,UAAA,EAAY;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EAC8C;AAC9C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAyB,gBAAA,EAAkB;AAAA,MAC1D,GAAG,OAAA;AAAA,MACH,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAA,CAAoB,MAAA,EAAgB,OAAA,EAAyD;AACjG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAa,gBAAA,EAAkB;AAAA,MAC9C,GAAG,OAAA;AAAA,MACH,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,MAAA,CAAO,MAAA,EAA4B,OAAA,EAAqE;AAC5G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAM,GAAI,MAAA;AACrC,IAAA,MAAM,IAAA,GAAO,EAAE,GAAI,IAAA,GAAO,EAAE,IAAA,EAAK,GAAI,EAAC,EAAI,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,EAAC,EAAG;AACtE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAuB,KAAA,CAAA,SAAA,EAAiB,IAAI,IAAI,IAAA,EAAM;AAAA,MACrE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,MAAA,EAA4B,OAAA,EAAyD;AAChG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,UAAA,EAAY,MAAA,EAAQ;AAAA,MAC9C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QAAA,CAAS,MAAA,EAA8B,OAAA,EAA+D;AAC1G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAmB,KAAA,CAAA,SAAA,EAAiB,EAAE,CAAA,CAAA,EAAI;AAAA,MACzD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAEF;;;AChHO,IAAM,WAAA,GAAN,cAA0B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAK7C,MAAM,GAAG,OAAA,EAAyD;AAChE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,WAAA,EAAa;AAAA,MACtC,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,QAAA,EAAU,MAAA,EAAQ;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CAAc,IAAA,EAAqB,OAAA,EAA+D;AACtG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,mBAAA,EAAqB;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,GAAI,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAK,KAAM;AAAC,KACnC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EACoC;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAgB,0BAAA,EAA4B,EAAE,OAAM,EAAG;AAAA,MACtE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EACoC;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAgB,0BAAA,EAA4B,KAAA,EAAO;AAAA,MAClE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CAAe,MAAA,EAA+B,OAAA,EAAyD;AAC3G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,0BAAA,EAA4B,MAAA,EAAQ;AAAA,MAC9D,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,MAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAI,OAAA,EAAQ,GAAI,MAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAY,KAAA,CAAA,kBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,EAAE,SAAQ,EAAG;AAAA,MACxE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,MAAA,EACA,OAAA,EACmC;AACnC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAiB,KAAA,CAAA,kBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI;AAAA,MAChE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAA,CACJ,MAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAwB,yBAAA,EAA2B,EAAE,OAAM,EAAG;AAAA,MAC7E,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,MAAA,EAA+B,OAAA,EAAyD;AAC/G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,4BAAA,EAA8B,MAAA,EAAQ;AAAA,MACjE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAA,CACJ,MAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAwB,yBAAA,EAA2B,KAAA,EAAO;AAAA,MACzE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,MAAA,EAA+B,OAAA,EAAyD;AAC/G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,4BAAA,EAA8B,MAAA,EAAQ;AAAA,MACjE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;ACjNO,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAA,EAChD,WAAA,CACE,IAAA,EACA,QAAA,EACiB,OAAA,EAGjB;AACA,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AAJH,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAKnB;AAAA,EALmB,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnB,MAAM,KAAK,OAAA,EAA8D;AACvE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,WAAA,EAAa;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CAAO,MAAA,EAA6B,OAAA,EAAyD;AACjG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,UAAA,EAAkB,EAAE,CAAA,CAAA,EAAI;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,IAAA,CACJ,MAAA,EACA,OAAA,EACmD;AACnD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,wBAAA,EAA0B;AAAA,MACvE,GAAG,OAAA;AAAA,MACH,GAAI,SAAS,EAAE,KAAA,EAAO,EAAE,MAAA,EAAO,KAAM,EAAC;AAAA,MACtC,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,UAAA,CACJ,MAAA,EACA,OAAA,EACwC;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,yBAAyB,MAAA,EAAQ;AAAA,QACnE,GAAG,OAAA;AAAA,QACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,OACjD;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,SAAA,CAAU,MAAA,EAAgB,OAAA,EAAyD;AACvF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,gBAAA,EAAkB;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;AC9HO,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhD,MAAM,cAAA,CAAe,MAAA,EAA8B,OAAA,EAAyD;AAC1G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,IAAA,EAAK,GAAI,MAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,oBAAA,EAAsB,IAAA,EAAM;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;ACbO,IAAM,gBAAA,GAAN,cAA+B,aAAA,CAAc;AAAA,EAClD,WAAA,CACE,IAAA,EACA,QAAA,EACiB,OAAA,EAGjB;AACA,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AAJH,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAKnB;AAAA,EALmB,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBnB,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,EACmD;AACnD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA+B,oBAAoB,MAAA,CAAO,IAAI,IAAI,MAAA,EAAW;AAAA,MAC5F,GAAG,OAAA;AAAA,MACH,GAAI,MAAA,CAAO,SAAA,GAAY,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,EAAE,GAAI,EAAC;AAAA,MACrE,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAe,OAAA,EAA8D;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,aAAA,EAAe,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAM,EAAG,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CACE,QACA,OAAA,EACmD;AACnD,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,KAAA,CAAA,YAAA,EAAoB,OAAO,IAAI,CAAA,CAAA;AAAA,MAC/B,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM;AAAA,MACtB,MAAA,CAAO,SAAA,GACH,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,EAAE,GACrD;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,EACwC;AACxC,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAM,IAAA,CAAK,KAAK,IAAA,CAAoB,oBAAA,EAAsB,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,EAChG;AACF,CAAA;;;AC3EO,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,MAAM,IAAA,CAAK,OAAA,EAAkB,OAAA,EAA4D;AACvF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,SAAA,EAAW;AAAA,MACvC,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,GAAI,UAAU,EAAE,KAAA,EAAO,EAAE,OAAA,EAAQ,KAAM;AAAC,KACzC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,CAAW,QAAA,EAAkB,OAAA,EAAiE;AAClG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,iBAAA,EAAmB;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,KAAA,EAAO,EAAE,QAAA;AAAS,KACnB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,MAAA,CAAO,MAAA,EAAsB,OAAA,EAA4D;AAC7F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,IAAA,EAAK,GAAI,MAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,iBAAA,EAAmB;AAAA,MAChD,GAAG,IAAA;AAAA,MACH,GAAI,SAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB;AAAC,KACxE,EAAG;AAAA,MACD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,EAAA,EAAY,OAAA,EAA0D;AAC9E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,KAAA,CAAA,QAAA,EAAgB,EAAE,CAAA,CAAA,EAAI;AAAA,MAChD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,MAAA,EAA2B,OAAA,EAA0D;AAChG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAc,KAAA,CAAA,QAAA,EAAgB,EAAE,CAAA,OAAA,CAAA,EAAW;AAAA,MAC1D,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,EAAA,EAAY,OAAA,EAA0D;AACjF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,WAAW,MAAA,EAAW;AAAA,MACpE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,EAAA,EAAY,OAAA,EAA0D;AACjF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,WAAW,MAAA,EAAW;AAAA,MACpE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,CAAM,MAAA,EAA0B,OAAA,EAA0D;AAC9F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,UAAU,MAAA,EAAW;AAAA,MACnE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,EAAA,EAAY,MAAA,EAA2B,OAAA,EAA0D;AAC5G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,IAAA,EAAK,GAAI,MAAA;AAC3B,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,IAAI,IAAA,EAAM;AAAA,MACxD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,CAAM,MAAA,EAA0B,OAAA,EAA0D;AAC9F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,UAAU,MAAA,EAAW;AAAA,MACnE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;AC3JO,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAInD,MAAM,KAAK,OAAA,EAAqE;AAC9E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAsB,oBAAA,EAAsB;AAAA,MAC3D,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CAAO,QAAA,EAAkB,OAAA,EAAyD;AACtF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAa,oBAAA,EAAsB;AAAA,MAClD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA;AAAS,KAC9B,CAAA;AAAA,EACH;AACF;AAkBO,IAAM,WAAA,GAAN,cAA0B,aAAA,CAAc;AAAA;AAAA,EAEpC,MAAA;AAAA,EAET,WAAA,CAAY,MAAkB,QAAA,EAAwC;AACpE,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,iBAAA,CAAkB,IAAA,EAAM,QAAQ,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,SAAA,CAAU,MAAA,EAA8B,OAAA,EAAoE;AAChH,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC9C,IAAA,IAAI,SAAA,CAAU,OAAO,OAAO,EAAE,MAAM,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA,EAAM;AAEjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAA,CAAU,KAAK,sBAAsB,CAAA;AACzD,IAAA,MAAM,KAAA,GAA4C;AAAA,MAChD,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,aAAA,EAAe,OAAO,aAAA,IAAiB,MAAA;AAAA,MACvC,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,uBAAuB,MAAA,CAAO,qBAAA;AAAA,MAC9B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,MAAA,CAAO,OAAA,KAAY,SAAY,MAAA,GAAY,MAAA,CAAO,OAAO,OAAO;AAAA,KAC3E;AACA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,IAAI,UAAU,MAAA,EAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,GAAA,CAAI,QAAA,EAAS;AAAA,IACtC;AAEA,IAAA,OAAO,EAAE,MAAM,EAAE,GAAA,EAAK,IAAI,QAAA,EAAS,EAAE,EAAG,KAAA,EAAO,IAAA,EAAK;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,oBAAA,CACE,QACA,OAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,cAAA;AAAA,MACA,EAAE,UAAA,EAAY,oBAAA,EAAsB,GAAG,MAAA,EAAO;AAAA,MAC9C,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA;AAAK,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAA,CACE,QACA,OAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,cAAA;AAAA,MACA,EAAE,UAAA,EAAY,eAAA,EAAiB,GAAG,MAAA,EAAO;AAAA,MACzC,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA;AAAK,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAA,CAAS,QAAgC,OAAA,EAA6D;AAEpG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,iBAAA,EAAmB,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,gBAAA,CAAiB,eAAA,EAAyB,OAAA,EAAuE;AACrH,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,KAAA,CAAA,sBAAA,EAA8B,eAAe,CAAA,CAAA,EAAI;AAAA,MACxF,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OAAA,CACJ,eAAA,EACA,MAAA,EACA,OAAA,EAC6C;AAC7C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAyB,KAAA,CAAA,sBAAA,EAA8B,eAAe,CAAA,QAAA,CAAA,EAAY,EAAE,QAAO,EAAG;AAAA,MAC7G,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAS,OAAA,EAAkE;AAC/E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,iBAAA,EAAmB;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAA,EAAmE;AAE3E,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAoB,mCAAA,EAAqC,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAA,EAA8D;AAEjE,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAe,wBAAA,EAA0B,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAC5F;AACF;;;AC9NA,IAAM,mBAAN,MAAuB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,MAAA,CAAO,QAA+B,OAAA,EAAyD;AAC7F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,cAAA,EAAgB,QAAQ,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,QAA8B,OAAA,EAAoE;AACrG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAqB,cAAA,EAAgB;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,GAAI,MAAA,GAAS,EAAE,KAAA,EAAO,MAAA,KAAwD;AAAC,KAChF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAgB,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAU,KAAA,CAAA,aAAA,EAAqB,MAAM,IAAI,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,MAAA,EAAgB,MAAA,EAA+B,OAAA,EAAyD;AAC7G,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,MAAM,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,QAAgB,OAAA,EAAyD;AAC9E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,MAAM,IAAI,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAgB,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,MAAM,CAAA,IAAA,CAAA,EAAQ,QAAW,OAAO,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,QAAgB,OAAA,EAAyD;AAC7E,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,MAAM,CAAA,MAAA,CAAA,EAAU,QAAW,OAAO,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAgB,OAAA,EAA8D;AACxF,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAe,KAAA,CAAA,aAAA,EAAqB,MAAM,aAAa,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,QAAgB,OAAA,EAAyD;AAClF,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,MAAM,aAAa,OAAO,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,MAAA,EAAgB,SAAA,EAAmB,OAAA,EAA4D;AAC3G,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAgB,KAAA,CAAA,aAAA,EAAqB,MAAM,CAAA,UAAA,EAAa,SAAS,IAAI,OAAO,CAAA;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,QAAgB,OAAA,EAAiE;AAC1F,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAkB,KAAA,CAAA,aAAA,EAAqB,MAAM,YAAY,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAA,EAAgB,QAAA,EAAkB,OAAA,EAAyD;AACtG,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,MAAM,CAAA,SAAA,EAAY,QAAQ,IAAI,OAAO,CAAA;AAAA,EAC1F;AACF,CAAA;AAKA,IAAM,mBAAN,MAAuB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,IAAA,CAAK,SAAkB,OAAA,EAA2D;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAY,cAAA,EAAgB;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,GAAI,UAAU,EAAE,KAAA,EAAO,EAAE,OAAA,EAAQ,KAAM;AAAC,KACzC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,QAA0B,OAAA,EAAyD;AACxF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,cAAA,EAAgB,QAAQ,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,OAAA,EAAiB,MAAA,EAA0B,OAAA,EAAyD;AACzG,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,OAAO,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,SAAiB,OAAA,EAAyD;AAC/E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,OAAO,IAAI,OAAO,CAAA;AAAA,EACvE;AACF,CAAA;AAMA,IAAM,oBAAN,MAAwB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,IAAA,CAAK,QAA+B,OAAA,EAAqE;AACvG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAsB,eAAA,EAAiB;AAAA,MACtD,GAAG,OAAA;AAAA,MACH,GAAI,MAAA,GAAS,EAAE,KAAA,EAAO,MAAA,KAAwD;AAAC,KAChF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAwB,OAAA,EAA0D;AACpF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAY,eAAA,EAAiB,QAAQ,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,SAAiB,OAAA,EAAyD;AAC/E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,cAAA,EAAsB,OAAO,IAAI,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAA,CAAiB,UAAkB,OAAA,EAAyD;AAC1F,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,iBAAA,EAAyB,QAAQ,WAAW,OAAO,CAAA;AAAA,EACnF;AACF,CAAA;AAQA,IAAM,0BAAN,MAA8B;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,MAAA,CAAO,QAAgC,OAAA,EAA6D;AAClG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,sBAAA,EAAwB,QAAQ,OAAO,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAA,EAA+D;AAClE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,sBAAA,EAAwB,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,IAAY,OAAA,EAA6D;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAc,KAAA,CAAA,qBAAA,EAA6B,EAAE,IAAI,OAAO,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CAAO,EAAA,EAAY,MAAA,EAA8B,OAAA,EAA6D;AAC5G,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAc,6BAA6B,EAAE,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,IAAY,OAAA,EAAyD;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,qBAAA,EAA6B,EAAE,IAAI,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CAAiB,IAAY,OAAA,EAA6D;AACxF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAe,6BAA6B,EAAE,CAAA,kBAAA,CAAA,EAAsB,QAAW,OAAO,CAAA;AAAA,EACzG;AACF,CAAA;AAcO,IAAM,cAAN,MAAkB;AAAA,EAMvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,CAAiB,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,CAAiB,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,iBAAA,CAAkB,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,uBAAA,CAAwB,IAAI,CAAA;AAAA,EACtD;AAAA,EAL6B,IAAA;AAAA,EALpB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAQX;;;AChRA,IAAM,0BAAA,GAA6B,IAAA;AAE5B,SAAS,gBAAgB,IAAA,EAA+D;AAC7F,EAAA,OAAO;AAAA,IACL,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,GAAI,KAAK,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,IAAA,CAAK,aAAA,EAAc,GAAI,EAAC;AAAA,IAChF,YAAY,IAAA,CAAK,GAAA,EAAI,GAAA,CAAK,IAAA,CAAK,cAAc,0BAAA,IAA8B,GAAA;AAAA,IAC3E,UAAA,EAAY,KAAK,UAAA,IAAc,QAAA;AAAA,IAC/B,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI;AAAC,GACvD;AACF;AAEO,SAAS,gBAAgB,MAAA,EAAsC;AACpE,EAAA,OAAO;AAAA,IACL,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,GAAI,OAAO,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,MAAA,CAAO,aAAA,EAAc,GAAI,EAAC;AAAA,IACpF,GAAI,OAAO,UAAA,GAAa,EAAE,YAAY,MAAA,CAAO,UAAA,KAA2D,EAAC;AAAA,IACzG,UAAA,EAAY,KAAK,KAAA,CAAA,CAAO,MAAA,CAAO,aAAa,IAAA,CAAK,GAAA,MAAS,GAAI,CAAA;AAAA,IAC9D,GAAI,OAAO,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK,GAAI;AAAC,GAC3D;AACF;;;ACRA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,MAAM,MAAA,GAAS,QAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAA,CAAW,IAAK,MAAA,CAAO,MAAA,GAAS,CAAA,IAAM,CAAA,EAAI,GAAG,CAAA;AACjF,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,MAAM,GAAG,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAEtE,EAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,KAAK,CAAA;AACvC;AAEO,SAAS,cAAc,IAAA,EAAoC;AAChE,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,OAAO,KAAK,IAAA,CAAK,EAAA;AACpC,EAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAC,CAAA;AAC5E,IAAA,OAAO,OAAO,OAAA,CAAQ,KAAK,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,EAC/D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACmB,SACA,WAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAChB;AAAA,EAFgB,OAAA;AAAA,EACA,WAAA;AAAA,EAGnB,MAAc,OAAA,GAAgC;AAC5C,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,WAAW,CAAA;AACvD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,GAAA,EAAiC;AACtD,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,aAAa,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,KAAK,IAAA,EAA6C;AACtD,IAAA,MAAM,MAAA,GAAS,cAAc,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,cAAc,OAAO,IAAA;AAE1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,GAAA,CAAI,MAAM,IAAI,eAAA,CAAgB,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,CAAA;AAC1E,IAAA,MAAM,IAAA,CAAK,SAAS,GAAG,CAAA;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,OAAO,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,EACxB;AAAA,EAEA,MAAM,IAAA,GAAgC;AACpC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,OAAO,MAAA,CAAO,QAAQ,GAAG,CAAA,CAAE,IAAI,CAAC,CAAC,MAAA,EAAQ,OAAO,CAAA,MAAO;AAAA,MACrD,MAAA;AAAA,MACA,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,UAAA,EAAY,KAAK,KAAA,CAAA,CAAO,OAAA,CAAQ,aAAa,IAAA,CAAK,GAAA,MAAS,GAAI,CAAA;AAAA,MAC/D,GAAI,QAAQ,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,OAAA,CAAQ,aAAA,EAAc,GAAI,EAAC;AAAA,MACtF,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,KAC7D,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,OAAO,MAAA,EAA+B;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,OAAO,IAAI,MAAM,CAAA;AACjB,IAAA,MAAM,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,EACzB;AACF,CAAA;;;ACnDO,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAEX,SAAA,uBAAgB,GAAA,EAA0C;AAAA,EAE3E,EAAA,CAA+B,OAAU,OAAA,EAAiD;AACxF,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,OAAO,MAAM;AAAE,MAAA,GAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAAE,CAAA;AAAA,EACtC;AAAA,EAEA,QACK,IAAA,EACG;AACN,IAAA,MAAM,CAAC,KAAA,EAAO,OAAO,CAAA,GAAI,IAAA;AACzB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,MAAW,WAAW,GAAA,EAAK;AACzB,MAAA,IAAI;AACF,QAAA;AAAC,QAAC,QAAiC,OAAO,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,KAAK,CAAA,iBAAA,CAAA,EAAqB,KAAK,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAAgC;AACjD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAAA,EACF;AACF;;;AC3BO,IAAM,aAAN,MAAiB;AAAA,EAgBtB,WAAA,CACqB,MACA,OAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAInB,IAAA,OAAA,EAAS,YAAA;AAAA,MAAa,CAAC,kBACrB,IAAA,CAAK,IAAA,CAAK,KAAoB,QAAA,EAAU,EAAE,eAAc,EAAG;AAAA,QACzD,KAAA,EAAO,EAAE,UAAA,EAAY,eAAA;AAAgB,OACtC;AAAA,KACH;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,EAAS,eAAc,IAAK,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAE5E,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,aAAA,CAAc,IAAA,EAAM,KAAK,SAAS,CAAA;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAA,EAAM,KAAK,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,WAAW,IAAI,cAAA;AAAA,MAAe,IAAA;AAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MAAW,CAAC,MAAA,KACxD,IAAA,CAAK,cAAA,CAAe,MAAM;AAAA,KAC5B;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAA,EAAM,KAAK,SAAS,CAAA;AACvD,IAAA,IAAA,CAAK,aAAa,IAAI,gBAAA;AAAA,MAAiB,IAAA;AAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MAAW,CAAC,MAAA,KAC5D,IAAA,CAAK,cAAA,CAAe,MAAM;AAAA,KAC5B;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAA,EAAM,KAAK,SAAS,CAAA;AAAA,EACnD;AAAA,EAvBqB,IAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAhBZ,OAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EAEU,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCnB,MAAM,cAAA,GAAyC;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,EAAS,aAAA,EAAc,IAAK,IAAA;AAAA,EAC1C;AAAA,EAEA,MAAgB,eAAe,MAAA,EAA+E;AAC5G,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,IAAA,CAAK,YAAA,IAAgB,KAAK,OAAA,EAAS;AAC7D,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,MAAA,CAAO,MAAA,EAAsB,OAAA,EAAkE;AACnG,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,SAAA,EAAW,QAAQ,OAAO;AAAA,KAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,MAAA,CAAO,MAAA,EAAsB,OAAA,EAAkE;AACnG,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,UAAU,MAAA,EAAQ;AAAA,QACpD,GAAG,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,UAAA,EAAY,UAAA;AAAW,OACjC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAA,CAAc,QAA6B,OAAA,EAA8D;AACvG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAgB,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,SAAA,CACJ,QAAA,EACA,OAAA,EACmE;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC7B,eAAe,QAAQ,CAAA,UAAA,CAAA;AAAA,MACvB,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,GAAI,OAAA,EAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,EAAa,GAAI,IAAI;AAAE,KACpG;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AAClD,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAA,CACJ,QAAA,EACA,OAAA,EACmE;AACnE,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC7B,eAAe,QAAQ,CAAA,QAAA,CAAA;AAAA,MACvB;AAAA,QACE,GAAG,OAAA;AAAA,QACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,QAChD,KAAA,EAAO,EAAE,GAAI,OAAA,EAAS,YAAA,GAAe,EAAE,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAa,GAAI,EAAC;AAAG;AACpF,KACF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AAClD,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,iBAAA,CACJ,QAAA,EACA,OAAA,EACA,OAAA,EACwC;AACxC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,KAAA,CAAA,QAAA,EAAgB,QAAQ,CAAA,SAAA,CAAA,EAAa;AAAA,QACtE,GAAG,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA;AAAQ,OAC5B;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,oBAAA,CAAqB,IAAA,EAAc,OAAA,EAAkE;AACzG,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,KAAK,IAAA,CAAK,IAAA;AAAA,QACd,QAAA;AAAA,QACA,EAAE,IAAA,EAAK;AAAA,QACP;AAAA,UACE,GAAG,OAAA;AAAA,UACH,KAAA,EAAO,EAAE,UAAA,EAAY,oBAAA,EAAqB;AAAA,UAC1C,OAAA,EAAS;AAAA,YACP,GAAG,OAAA,EAAS,OAAA;AAAA,YACZ,cAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,OAAA,EAAgE;AAC/E,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,UAAA,EAAY;AAAA,MAC5C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAA,CAAO,QAAsB,OAAA,EAAiE;AAC5F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAmB,SAAA,EAAW,QAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,eAAA,CAAgB,MAAA,EAA+B,OAAA,EAAkE;AACrH,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,OAAe,OAAA,EAAyD;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,WAAA,EAAa,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAM,EAAG,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CAAa,MAAA,EAA4B,OAAA,EAAkE;AAC/G,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,UAAU,MAAA,EAAQ;AAAA,QACpD,GAAG,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,UAAA,EAAY,eAAA;AAAgB,OACtC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,QAAuB,OAAA,EAAyD;AACtF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,UAAA,EAAY;AAAA,MACtC,GAAG,MAAA;AAAA,MACH,GAAI,SAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB;AAAC,OACrE,OAAO,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,QAA6B,OAAA,EAAyD;AAClG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,yBAAA,EAA2B,QAAQ,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CAAO,KAAA,EAAsB,OAAA,EAA6D;AAC9F,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAc,mBAAA,EAAqB;AAAA,MAClD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,KAAA,EAAO;AAAA,QACL,GAAI,OAAO,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa,EAAC;AAAA,QACtD,GAAI,KAAA,EAAO,MAAA,GAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI,EAAC;AAAA,QAC1D,GAAI,KAAA,EAAO,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI,EAAC;AAAA,QACvD,GAAI,KAAA,EAAO,4BAAA,KAAiC,MAAA,GACxC,EAAE,4BAAA,EAA8B,MAAA,CAAO,KAAA,CAAM,4BAA4B,CAAA,EAAE,GAC3E;AAAC;AACP,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,OAAA,EAA4D;AAC3E,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,UAAA,EAAY;AAAA,MACxC,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAA,CAAQ,KAAA,EAAsB,OAAA,EAAyD;AAC3F,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,YAAY,MAAA,EAAW;AAAA,MAC/D,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,GAAI,QAAQ,EAAE,KAAA,EAAO,EAAE,KAAA,EAAM,KAAM;AAAC,KACrC,CAAA;AAED,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,IAC5B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAMO,IAAM,iBAAA,GAAN,cAAgC,UAAA,CAAW;AAAA,EAC/B,eAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EAEjB,WAAA,CACE,MACA,OAAA,EACA,OAAA,EACA,aACA,SAAA,GAAY,KAAA,EACZ,cAAc,IAAA,EACd;AACA,IAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,CAAgB,OAAA,EAAS,WAAW,CAAA;AAC/D,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,gBAAA,EAAiB;AAEpC,IAAA,IAAA,CAAK,OAAO,IAAI,UAAA,CAAiC,CAAA,cAAA,EAAiB,WAAW,IAAI,CAAA,OAAA,KAAW;AAC1F,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA;AAAA,QACX,OAAA,CAAQ,KAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACV;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACpC,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,KAAK,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAAA,MACrC;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,iBAAA,EAAmB,IAAI,CAAA;AACzC,MAAA,IAAA,CAAK,KAAK,IAAA,CAAK,EAAE,OAAO,iBAAA,EAAmB,OAAA,EAAS,MAAM,CAAA;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,iBAAA,CAAkB,CAAC,MAAA,KAAW;AACpC,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,cAAA,EAAgB,MAAA,GAAS,gBAAgB,MAAM,CAAA,GAAI,EAAE,CAAA;AAAA,IACzE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,kBAAkB,MAAM;AAC3B,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,gBAAA,EAAiB;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,GAAyC;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,EAAS,YAAA,EAAa,IAAK,IAAA;AAAA,EACzC;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAS,eAAA,EAAgB;AAC9B,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,EAAA,CACE,OACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,MAAyB,eAAe,MAAA,EAA+E;AACrH,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA;AAE7C,IAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AACd,MAAA,IAAI,GAAA,CAAI,KAAK,YAAA,EAAc;AACzB,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,QAC1C;AACA,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,GAAA,CAAI,IAAI,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW;AAC7B,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,GAAA,CAAI,IAAI,CAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,GAAA,GAAqC;AACzC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAS,GAAA,EAAI;AACvC,IAAA,OAAO,MAAA,GAAS,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAI,IAAA,EAAoC;AAC5C,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,IAAI,IAAA,EAAoC;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,YAAA,EAAc;AAC3C,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAO,MAAA,EAAkC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,KAAA;AAE5B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAW,MAAM,CAAA;AAE3D,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,IAAA,MAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AAEhD,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,kBAAA,EAAoB,EAAE,QAAQ,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAA,GAAgC;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,SAAkB,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,EAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,MAAA,EAA+B;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,QAAQ,OAAA,EAAQ;AAC5C,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAS,GAAA,EAAI;AAEvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EAC5B;AAAA,EAEA,MAAe,OAAA,CAAQ,KAAA,EAAsB,OAAA,EAAyD;AAEpG,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAS,GAAA,EAAI;AACvC,IAAA,MAAM,MAAA,GAAS,MAAA,GACV,MAAA,CAAO,IAAA,EAAM,EAAA,IAAM,aAAA,CAAc,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAc,CAAA,GACvE,IAAA;AAEJ,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAO,OAAO,CAAA;AAEjD,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAAA,MAC1C;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,YAAA,EAAc,EAAE,GAAI,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,EAAC,EAAI,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAYO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA;AAAA,EAEtC,MAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,EAAM,KAAK,SAAS,CAAA;AACnD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAI,CAAA;AAAA,EACnC;AACF;;;AChqBA,SAAS,YAAA,CAAa,OAAA,EAA8B,IAAA,EAAc,QAAA,EAAqC;AACrG,EAAA,OAAO,QAAA,GAAW,KAAA,CAAA,WAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,KAAA,CAAA,WAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACzG;AAgBO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7B,MAAA,CAAO,QAA8B,OAAA,EAA6D;AAChG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,YAAA,EAAc,QAAQ,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAA,CACE,OAAA,EACA,IAAA,EACA,MAAA,EACA,UACA,OAAA,EACmC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAgB,YAAA,CAAa,SAAS,IAAA,EAAM,QAAQ,CAAA,EAAG,MAAA,EAAQ,OAAO,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CACE,OAAA,EACA,IAAA,EACA,QAAA,EACA,OAAA,EACmC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAiB,YAAA,CAAa,SAAS,IAAA,EAAM,QAAQ,GAAG,OAAO,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,GAAA,CACE,OAAA,EACA,IAAA,EACA,QAAA,EACA,OAAA,EACmC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAc,YAAA,CAAa,SAAS,IAAA,EAAM,QAAQ,GAAG,OAAO,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAA,CAAK,SAA2B,OAAA,EAAuE;AACrG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,YAAA,EAAc;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,KAAA,EAAO;AAAA,QACL,GAAI,SAAS,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,QAC5D,GAAI,SAAS,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU,GAAI,EAAC;AAAA,QAC3E,GAAI,SAAS,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,QAC9C,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,QACvD,GAAI,SAAS,QAAA,GAAW,EAAE,UAAU,OAAA,CAAQ,QAAA,KAAa;AAAC;AAC5D,KACD,CAAA;AAAA,EACH;AACF;;;AC3GO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc7B,IAAA,CAAK,QAAyB,OAAA,EAAyD;AACrF,IAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,gBAAe,GAAI,MAAA;AAE3D,IAAA,MAAM,IAAA,GAAO,WACT,KAAA,CAAA,qBAAA,EAA6B,QAAQ,IAAI,QAAQ,CAAA,CAAA,GACjD,6BAA6B,QAAQ,CAAA,CAAA;AAEzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,IAAA,EAAM,EAAE,OAAO,EAAA,EAAI,MAAA,EAAQ,cAAA,EAAe,EAAG,OAAO,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAA,CAAK,OAAe,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAW,6BAA6B,EAAE,KAAA,IAAS,OAAO,CAAA;AAAA,EAC7E;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc7B,IAAA,CAAK,QAAuB,OAAA,EAAyD;AACnF,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,gBAAe,GAAI,MAAA;AAE9D,IAAA,MAAM,IAAA,GAAO,WACT,KAAA,CAAA,mBAAA,EAA2B,QAAQ,IAAI,QAAQ,CAAA,CAAA,GAC/C,2BAA2B,QAAQ,CAAA,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAW,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAe,EAAG,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAA,CAAK,OAAe,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAW,2BAA2B,EAAE,KAAA,IAAS,OAAO,CAAA;AAAA,EAC3E;AACF;AAEO,IAAM,cAAN,MAAkB;AAAA,EACd,KAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,SAAA,CAAU,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,IAAI,CAAA;AAAA,EAC3C;AACF;;;AC9EA,IAAM,aAAA,uBAAoB,GAAA,EAA8B;AAExD,SAAS,QAAA,GAAkC;AACzC,EAAA,MAAM,OAAA,GAAW,WAA0D,SAAA,EAAW,KAAA;AAEtF,EAAA,OAAO,OAAO,OAAA,EAAS,OAAA,KAAY,UAAA,GAAa,OAAA,GAAU,IAAA;AAC5D;AAEA,eAAsB,YAAA,CACpB,IAAA,EACA,IAAA,EACA,OAAA,GAAuB,EAAC,EACC;AACzB,EAAA,MAAM,UAAU,QAAA,EAAS;AAEzB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAQ,MAAM,OAAA,CAAQ,OAAA;AAAA,MACpB,IAAA;AAAA,MACA,EAAE,IAAA,EAAM,WAAA,EAAa,GAAI,OAAA,CAAQ,YAAA,GAAe,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,EAAC,EAAG;AAAA,MAC5E,OAAM,IAAA,KAAS,IAAA,KAAS,IAAA,GAAO,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,MAAM,MAAK;AAAE,KACnF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAEvC,EAAA,IAAI,QAAA,IAAY,QAAQ,YAAA,EAAc;AACpC,IAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,EACtB;AAEA,EAAA,MAAM,GAAA,GAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,OAAA,EAAQ,EAAG,MAAM,MAAM,MAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,MAAM,MAAS,CAAA;AAEtC,EAAA,aAAA,CAAc,GAAA,CAAI,MAAM,IAAI,CAAA;AAE5B,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,MAAM,GAAA,EAAI;AAAA,EACvC,CAAA,SAAE;AACA,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,KAAM,IAAA,EAAM;AACpC,MAAA,aAAA,CAAc,OAAO,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF;AACF;;;ACrDA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,cAAA;AAAA,EACA,yBAAA;AAAA,EACA,4BAAA;AAAA,EACA,+BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,mBAAmB,KAAA,EAA+B;AAChE,EAAA,OACE,KAAA,CAAM,WAAA,KAAgB,CAAA,IACtB,KAAA,CAAM,WAAA,KAAgB,OACtB,KAAA,CAAM,WAAA,KAAgB,GAAA,IACtB,KAAA,CAAM,WAAA,IAAe,GAAA;AAEzB;AAEO,SAAS,iBAAiB,KAAA,EAA+B;AAC9D,EAAA,OAAO,cAAc,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,MAAM,WAAA,KAAgB,GAAA;AAChE;;;ACbA,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,mBAAA,GAAsB,GAAA;AAE5B,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,gCAAA,GAAmC,CAAA;AAYzC,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACvD;AAEA,SAAS,gBAAA,GAA4B;AACnC,EAAA,OAAQ,UAAA,CAAmD,UAAU,MAAA,KAAW,IAAA;AAClF;AAEA,SAAS,SAAA,GAAqB;AAC5B,EAAA,MAAM,KAAA,GAAQ,UAAA;AAEd,EAAA,OAAO,OAAO,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,OAAO,MAAM,QAAA,KAAa,WAAA;AAC1E;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAW1B,WAAA,CACmB,SACjB,UAAA,EACA;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,oBAAoB,UAAU,CAAA,CAAA;AAAA,EAChD;AAAA,EALmB,OAAA;AAAA,EAXX,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACS,UAAA;AAAA,EACA,QAAA;AAAA,EAET,QAAA,GAA0C,IAAA;AAAA,EAC1C,MAAA;AAAA,EACA,kBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcR,aAAa,EAAA,EAAqB;AAChC,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AAAA,EACnB;AAAA;AAAA,EAGA,oBAAoB,EAAA,EAA4B;AAC9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,EAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,EAAA,EAA0B;AAC1C,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AAAA,EACxB;AAAA,EAEA,MAAM,KAAK,IAAA,EAAoC;AAC7C,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAExB,IAAA,MAAM,OAAA,GAAU,gBAAgB,EAAE,GAAG,MAAM,YAAA,EAAc,IAAA,CAAK,cAAc,CAAA;AAE5E,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,GAAA,GAAqC;AACzC,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,UAAU,CAAA;AAEtD,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEQ,YAAY,OAAA,EAAiC;AACnD,IAAA,OAAO,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAAA,EAC3C;AAAA,EAEQ,QAAQ,OAAA,EAAiD;AAC/D,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA,CAAE,QAAQ,MAAM;AAC9D,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,MAAc,oBAAoB,OAAA,EAAiD;AACjF,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,IAAA,CAAK,UAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAExF,IAAA,OAAO,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAAA,EACvC;AAAA,EAEA,MAAc,mBAAmB,OAAA,EAAiD;AAChF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,IAAA,CAAK,cAAA,GAAiB,IAAI,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,YAAA,GAC3B,OAAA,CAAQ,YAAA,KAAiB,QAAQ,YAAA,GACjC,CAAC,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAE7B,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,OAAA,CAAQ,YAAA;AAAA,IACjB;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,IAAiB,CAAC,KAAK,SAAA,EAAW;AAC7C,MAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,IAAA,CAAK,cAAA,GAAiB,OAAO,CAAA;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAc,aAAA,CACZ,OAAA,EACA,OAAA,EACwB;AACxB,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,gCAAA,EAAkC,WAAW,CAAA,EAAG;AAC/E,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,KAAA,CAAM,wBAAA,GAA2B,CAAA,KAAM,OAAA,GAAU,CAAA,CAAE,CAAA;AAAA,MAC3D;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAW,QAAQ,aAAc,CAAA;AAE3D,MAAA,IAAI,MAAA,CAAO,MAAM,YAAA,EAAc;AAC7B,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC3B,QAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,IAAI,CAAA;AAEnC,QAAA,OAAO,OAAO,IAAA,CAAK,YAAA;AAAA,MACrB;AAEA,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,MAAA,IAAI,KAAA,IAAS,kBAAA,CAAmB,KAAK,CAAA,EAAG;AACtC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,eAAA,KAAoB,CAAC,KAAA,IAAS,gBAAA,CAAiB,KAAK,CAAA,CAAA,EAAI;AAClE,QAAA,MAAM,KAAK,KAAA,EAAM;AACjB,QAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAA,CACJ,OAAA,GAAgE,EAAC,EACzC;AACxB,IAAA,MAAM,eAAe,OAAA,CAAQ,YAAA,IAAA,CAAiB,MAAM,IAAA,CAAK,KAAI,GAAI,YAAA;AAEjE,IAAA,OAAO,KAAK,OAAA,CAAQ;AAAA,MAClB,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,MAC5C,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB;AAAC,KACtD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,GAAwC;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,SAAU,OAAA,CAAQ,YAAA;AAE/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAE,eAAA,EAAiB,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,CAAC,SAAA,EAAU,EAAG;AAEjC,IAAA,IAAA,CAAK,SAAS,WAAA,CAAY,MAAM,KAAK,IAAA,CAAK,IAAA,IAAQ,mBAAmB,CAAA;AAEpE,IAAC,IAAA,CAAK,OAA6C,KAAA,IAAQ;AAE5D,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAI,CAAC,gBAAA,EAAiB,EAAG,KAAK,KAAK,IAAA,EAAK;AAAA,IAC1C,CAAA;AAEC,IAAC,WAAiC,QAAA,CAAS,gBAAA;AAAA,MAC1C,kBAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,aAAA,CAAc,KAAK,MAAM,CAAA;AACzB,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAChB;AAEA,IAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,SAAA,EAAU,EAAG;AACzC,MAAC,WAAiC,QAAA,CAAS,mBAAA;AAAA,QAC1C,kBAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,IAAA,GAAsB;AAClC,IAAA,IAAI,gBAAA,EAAiB,IAAK,IAAA,CAAK,QAAA,EAAU;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,MAAA,IAAI,CAAC,OAAA,EAAS,aAAA,IAAiB,CAAC,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAE3D,MAAA,MAAM,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,MAAM,IAAA,CAAK,mBAAmB,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA,EAAG;AAAA,QAC1F,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,IAClE;AAAA,EACF;AACF;;;AC3QO,IAAM,sBAAN,MAAqD;AAAA,EAC1D,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,OAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,YAAA,CAAa,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,EAC7B;AACF,CAAA;;;ACZO,IAAM,wBAAN,MAAuD;AAAA,EAC5D,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,OAAO,cAAA,CAAe,QAAQ,GAAG,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,cAAA,CAAe,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,cAAA,CAAe,WAAW,GAAG,CAAA;AAAA,EAC/B;AACF,CAAA;;;ACPO,IAAM,uBAAN,MAAsD;AAAA,EAC1C,KAAA,uBAAY,GAAA,EAAoB;AAAA,EAEjD,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAAA,EAChC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,EACvB;AACF,CAAA;;;ACpBA,IAAM,UAAA,GAAa,UAAA;AAWZ,IAAM,sBAAN,MAAqD;AAAA,EAClD,IAAI,CAAA,EAAmB;AAC7B,IAAA,OAAO,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAChD,IAAA,OAAO,QAAA,GAAW,QAAA,CAAS,IAAA,EAAK,GAAI,IAAA;AAAA,EACtC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,MAAM,KAAA,CAAM,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,IAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,MAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAClC;AACF,CAAA;;;ACTO,IAAM,OAAA,GAAU;AAAA;AAAA,EAErB,KAAA,EAAO,IAAI,mBAAA,EAAoB;AAAA;AAAA,EAE/B,OAAA,EAAS,IAAI,qBAAA,EAAsB;AAAA;AAAA,EAEnC,MAAA,EAAQ,IAAI,oBAAA,EAAqB;AAAA;AAAA,EAEjC,KAAA,EAAO,IAAI,mBAAA;AACb;;;ACzBA,SAAS,cAAA,GAAkC;AACzC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,OAAA,CAAQ,KAAA,GAAQ,IAAI,oBAAA,EAAqB;AAClF;AAQO,IAAM,iBAAN,MAAqB;AAAA,EACjB,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,SAAA,EAAmB,OAAA,EAAyB;AACvE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAC1D,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,WAAA,EAAa,KAAA,IAAS,OAAO,SAAS,CAAA,MAAA,CAAA;AAChE,IAAA,MAAM,WAAA,GAAc,OAAA,EAAS,WAAA,EAAa,QAAA,IAAY,GAAG,QAAQ,CAAA,SAAA,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,IAAW,cAAA,EAAe;AACnD,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,CAAe,OAAA,EAAS,QAAQ,CAAA;AACpD,IAAA,IAAA,CAAK,OAAO,IAAI,iBAAA;AAAA,MACd,IAAI,UAAA,CAAW;AAAA,QACb,OAAA,EAAS,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,QAChB,MAAA,EAAQ,SAAA;AAAA,QACR,GAAG,OAAA;AAAA,QACH,gBAAgB,CAAC,EAAE,iBAAiB,YAAA,EAAa,KAC/C,QAAQ,YAAA,CAAa;AAAA,UACnB,eAAA;AAAA,UACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB;AAAC,SACxC;AAAA,OACJ,CAAA;AAAA,MACD,OAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAS,SAAA,IAAa,KAAA;AAAA,MACtB,SAAS,WAAA,IAAe;AAAA,KAC1B;AAAA,EACF;AACF;AAQO,IAAM,uBAAN,MAA2B;AAAA,EACvB,IAAA;AAAA,EACA,KAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,OAAA,EAA+B;AAC9E,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,gBAAA,CAAiB,IAAI,WAAW,EAAE,OAAA,EAAS,CAAA,EAAG,IAAI,SAAS,MAAA,EAAQ,UAAA,EAAY,GAAG,OAAA,EAAS,CAAC,CAAA;AAC5G,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAI,WAAW,EAAE,OAAA,EAAS,CAAA,EAAG,IAAI,UAAU,MAAA,EAAQ,UAAA,EAAY,GAAG,OAAA,EAAS,CAAC,CAAA;AAAA,EAC3G;AACF;;;AC1DA,IAAM,gBAAA,GAAmB;AAAA,EACvB,eAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AA4BO,SAAS,mBACd,GAAA,EACwB;AACxB,EAAA,MAAM,SAAiC,EAAC;AAGxC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,GAAA,YAAe,OAAA,EAAS;AAC5D,IAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,IAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAAA,IACzB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,cAAe,GAAA,CAAiC,OAAA;AACtD,EAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,IAAA,MAAM,GAAA,GAAM,YAAY,GAAG,CAAA;AAC3B,IAAA,IAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAK,GAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAA;AACT;;;AC7DO,IAAM,kBAAA,GAAqB;AAAA,EAChC,eAAA,EAAiB,yDAAA;AAAA,EACjB,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAUA,SAAS,eAAe,QAAA,EAAiD;AACvE,EAAA,OAAO,OAAQ,SAA8B,SAAA,KAAc,UAAA;AAC7D;AAEA,SAAS,cAAc,QAAA,EAAgD;AACrE,EAAA,MAAM,UAAW,QAAA,CAA6B,OAAA;AAE9C,EAAA,OAAO,OAAO,SAAS,GAAA,KAAQ,UAAA;AACjC;AA2CO,SAAS,sBAAyB,QAAA,EAAgB;AACvD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA;AAEjD,EAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,EAAG;AAC3B,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,SAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,EACvE,CAAA,MAAA,IAAW,cAAA,CAAe,QAAQ,CAAA,EAAG;AACnC,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,SAAS,QAAA,CAAS,SAAA,CAAU,MAAM,KAAK,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,QAAA;AACT;;;ACrCO,SAAS,YAAA,CACd,GAAA,EACA,SAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAO,IAAI,cAAA,CAAe,GAAA,EAAK,SAAA,EAAW,OAAO,CAAA;AACnD;AAmBO,SAAS,kBAAA,CACd,GAAA,EACA,UAAA,EACA,OAAA,EACsB;AACtB,EAAA,OAAO,IAAI,oBAAA,CAAqB,GAAA,EAAK,UAAA,EAAY,OAAO,CAAA;AAC1D","file":"index.mjs","sourcesContent":["import type { ErrorCode } from '../error-codes'\n\n/**\n * Thrown when `throwErrors: true` is set and the API returns an error response.\n *\n * Mirrors the same `{ code, message, status_code }` shape returned by default —\n * the only difference is delivery: exception vs. discriminated union.\n *\n * @example\n * import { NulvlessException } from '@nulvless/nulvless-js'\n *\n * try {\n * const { data } = await nulvless.auth.signIn({ email, password })\n * } catch (err) {\n * if (err instanceof NulvlessException) {\n * console.error(err.code, err.status_code, err.message)\n * }\n * }\n */\nexport class NulvlessException extends Error {\n readonly code: ErrorCode\n readonly status_code: number\n\n constructor(message: string | string[], code: ErrorCode, status_code: number) {\n super(Array.isArray(message) ? message.join(', ') : message)\n this.name = 'NulvlessException'\n this.code = code\n this.status_code = status_code\n }\n}\n","import type { ClientOptions, Language, NulvlessError, NulvlessResult } from './types'\nimport { NulvlessException } from './exceptions/nulvless.exception'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n\ntype QueryValue = string | number | boolean\ntype QueryParams = Record<string, QueryValue | QueryValue[] | undefined>\n\nconst DOT_SEGMENT = /(^|\\/)\\.{1,2}(\\/|$)/\n\ninterface SendOptions {\n query?: QueryParams\n /** Override or add headers for this request. Merged over client-level headers. */\n headers?: Record<string, string>\n body?: unknown\n /** Override the language header for this request. */\n language?: () => Language\n /** Override the throwErrors strategy for this request. */\n throwErrors?: boolean\n /** Abort this request after the given number of milliseconds. Overrides the client-level timeout. */\n timeout?: number\n /** Single-use sudo nonce, sent as the `nlv-sudo-nonce` header. */\n nonce?: string | undefined\n /** Omit the `x-platform-key` header — for public endpoints that don't require it. */\n skipApiKey?: boolean\n}\n\nfunction resolveConfigHeaders(\n value: Record<string, string> | (() => Record<string, string>) | undefined,\n): Record<string, string> | undefined {\n return typeof value === 'function' ? value() : value\n}\n\nfunction mergeHeaders(...sources: Array<Record<string, string> | undefined>): Record<string, string> {\n const merged = new Map<string, [name: string, value: string]>()\n\n for (const source of sources) {\n for (const [name, value] of Object.entries(source ?? {})) {\n merged.set(name.toLowerCase(), [name, value])\n }\n }\n\n return Object.fromEntries(merged.values())\n}\n\nfunction findHeader(headers: Record<string, string> | undefined, name: string): string | undefined {\n const wanted = name.toLowerCase()\n\n return Object.entries(headers ?? {}).find(([key]) => key.toLowerCase() === wanted)?.[1]\n}\n\nexport function route(strings: TemplateStringsArray, ...values: Array<string | number>): string {\n return strings.reduce((path, part, index) => path + encodeURIComponent(String(values[index - 1])) + part)\n}\n\nclass InvalidPathError extends Error {\n constructor(path: string) {\n super(`Path parameters cannot be \".\" or \"..\": ${path}`)\n this.name = 'InvalidPathError'\n }\n}\n\nexport interface HttpClientConfig extends ClientOptions {\n baseUrl: string\n apiKey: string\n /**\n * Called when a request fails with a retryable auth error (401 or specific 403 codes).\n * Should return a fresh access token, or `null` if refresh is not possible.\n * The request is retried once with the new token.\n *\n * `deauthOnFailure` is `true` for 401/unauthorized (token is invalid — clear session\n * and notify if refresh fails) and `false` for 403/forbidden_resource_access (token\n * is valid but lacks the scope — refresh once to pick up new scopes, but never\n * deauthenticate; surface the API error instead).\n */\n onTokenExpired?: (context: {\n deauthOnFailure: boolean\n expiredToken?: string\n }) => Promise<string | null>\n}\n\nfunction toError(err: unknown, timeout?: number): NulvlessError {\n if (err instanceof InvalidPathError) {\n return { code: 'invalid_path', message: err.message, status_code: 400 }\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return {\n code: 'request_timeout',\n message: `Request timed out after ${timeout ?? 0}ms`,\n status_code: 408,\n }\n }\n return {\n code: 'network_error',\n message: err instanceof Error ? err.message : 'Network request failed',\n status_code: 0,\n }\n}\n\nfunction extractErrorPayload(\n body: unknown,\n fallback: string,\n): Pick<NulvlessError, 'code' | 'message'> {\n if (typeof body !== 'object' || body === null) {\n return { code: 'unknown_error', message: fallback }\n }\n\n const record = body as Record<string, unknown>\n\n const code = typeof record['code'] === 'string' ? record['code'] : 'unknown_error'\n\n const message =\n typeof record['message'] === 'string' || Array.isArray(record['message'])\n ? (record['message'] as string | string[])\n : fallback\n\n return { code, message }\n}\n\nexport class HttpClient {\n private readonly config: HttpClientConfig\n private onSudoRequired?: () => void\n\n constructor(config: HttpClientConfig) {\n this.config = {\n ...config,\n baseUrl: config.baseUrl.replace(/\\/+$/, ''),\n }\n }\n\n /**\n * Injected after construction to avoid circular dependency.\n * Called when a request fails with `403 protected_action_denied`,\n * indicating the user must enable sudo mode before retrying.\n */\n setOnSudoRequired(cb: () => void): void {\n this.onSudoRequired = cb\n }\n\n hasAuthorization(headers?: Record<string, string>): boolean {\n return (\n findHeader(headers, 'Authorization') !== undefined ||\n findHeader(resolveConfigHeaders(this.config.headers), 'Authorization') !== undefined\n )\n }\n\n async get<T>(path: string, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('GET', path, options)\n }\n\n async post<T>(path: string, body?: unknown, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('POST', path, { ...options, body })\n }\n\n async put<T>(path: string, body?: unknown, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('PUT', path, { ...options, body })\n }\n\n async patch<T>(path: string, body?: unknown, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('PATCH', path, { ...options, body })\n }\n\n async delete<T>(path: string, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('DELETE', path, options)\n }\n\n /**\n * Returns `true` when the error warrants a single token-refresh retry:\n * - Any 401 on an authenticated request\n * - 403 with `forbidden_access_waiting_accept` or `forbidden_resource_access` codes\n */\n private shouldRetryWithRefresh(\n status: number,\n code: string,\n headers: Record<string, string>,\n ): boolean {\n if (!findHeader(headers, 'Authorization')) return false\n if (status === 401) return true\n if (status === 403 && ['forbidden_resource_access', 'forbidden_access_waiting_accept'].includes(code)) return true\n return false\n }\n\n private async send<T>(method: HttpMethod, path: string, options: SendOptions = {}, isRetry = false): Promise<NulvlessResult<T>> {\n const headers = this.buildHeaders(options.headers, options.language, options.nonce, options.skipApiKey)\n\n const shouldThrow = options.throwErrors ?? this.config.throwErrors ?? false\n\n const timeout = options.timeout ?? this.config.timeout\n const controller = new AbortController()\n const timeoutHandle =\n timeout && timeout > 0\n ? setTimeout(() => controller.abort(), timeout)\n : undefined\n\n const start = Date.now()\n\n if (this.config.debug) {\n console.debug(`[nulvless] → ${method} ${path}`)\n }\n\n try {\n const url = this.buildUrl(path, options.query)\n const init: RequestInit = { method, headers, signal: controller.signal }\n\n if (options.body !== undefined) {\n const contentType = findHeader(headers, 'Content-Type')\n\n if (contentType === 'application/x-www-form-urlencoded') {\n init.body = new URLSearchParams(options.body as Record<string, string>).toString()\n } else {\n init.body = JSON.stringify(options.body)\n }\n }\n\n const response = await fetch(url, init)\n const body = await this.parseBody(response)\n\n if (this.config.debug) {\n console.debug(`[nulvless] ← ${method} ${path} ${response.status} (${Date.now() - start}ms)`)\n }\n\n if (!response.ok) {\n const { code, message } = extractErrorPayload(body, response.statusText)\n const error: NulvlessError = { code, message, status_code: response.status }\n\n // Reactive refresh: on specific 401/403 responses, refresh once and retry.\n if (\n !isRetry &&\n this.config.onTokenExpired &&\n this.shouldRetryWithRefresh(response.status, code, headers)\n ) {\n const deauthOnFailure = response.status === 401\n const expiredToken = findHeader(headers, 'Authorization')?.replace(/^Bearer\\s+/i, '')\n const newToken = await this.config.onTokenExpired({\n deauthOnFailure,\n ...(expiredToken ? { expiredToken } : {}),\n })\n if (newToken) {\n return this.send<T>(\n method,\n path,\n { ...options, headers: mergeHeaders(options.headers, { Authorization: `Bearer ${newToken}` }) },\n true,\n )\n }\n }\n\n if (response.status === 403 && code === 'protected_action_denied') {\n this.onSudoRequired?.()\n }\n\n if (shouldThrow) {\n throw new NulvlessException(message, code, response.status)\n }\n\n return { data: null, error }\n }\n\n return { data: body as T, error: null }\n } catch (err) {\n if (err instanceof NulvlessException) throw err\n\n const error = toError(err, timeout)\n\n if (shouldThrow) {\n throw new NulvlessException(error.message, error.code, error.status_code)\n }\n\n return { data: null, error }\n } finally {\n clearTimeout(timeoutHandle)\n }\n }\n\n private buildUrl(path: string, query?: QueryParams): string {\n if (DOT_SEGMENT.test(path)) throw new InvalidPathError(path)\n\n const url = new URL(`${this.config.baseUrl}/${path.replace(/^\\/+/, '')}`)\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue\n const values = Array.isArray(value) ? value : [value]\n for (const v of values) {\n url.searchParams.append(Array.isArray(value) ? `${key}[]` : key, String(v))\n }\n }\n }\n\n return url.toString()\n }\n\n private buildHeaders(\n extra?: Record<string, string>,\n languageOverride?: () => Language,\n nonce?: string,\n skipApiKey?: boolean,\n ): Record<string, string> {\n const language = languageOverride?.() ?? this.config.language?.() ?? 'en-US'\n\n return mergeHeaders(\n {\n 'Content-Type': 'application/json',\n ...(skipApiKey ? {} : { 'x-platform-key': this.config.apiKey }),\n 'nlv-lang': language,\n ...(this.config.trackUser !== undefined\n ? { 'nlv-user-tracking': String(this.config.trackUser) }\n : {}),\n ...(nonce ? { 'nlv-sudo-nonce': nonce } : {}),\n },\n resolveConfigHeaders(this.config.headers),\n extra,\n )\n }\n\n private async parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? ''\n if (!contentType.includes('json')) return null\n\n try {\n return await response.json()\n } catch {\n return null\n }\n }\n}\n","export interface TabMessage<T> {\n event: string\n payload: T\n}\n\ninterface Channel {\n postMessage(message: unknown): void\n close(): void\n addEventListener(type: 'message', handler: (event: { data: unknown }) => void): void\n}\n\ninterface ChannelConstructor {\n new (name: string): Channel\n}\n\nexport class TabChannel<T> {\n private channel: Channel | null\n\n constructor(name: string, onMessage: (message: TabMessage<T>) => void) {\n const Ctor = (globalThis as { BroadcastChannel?: ChannelConstructor }).BroadcastChannel\n\n if (!Ctor) {\n this.channel = null\n return\n }\n\n try {\n this.channel = new Ctor(name)\n } catch {\n this.channel = null\n return\n }\n\n this.channel.addEventListener('message', event => {\n onMessage(event.data as TabMessage<T>)\n })\n\n ;(this.channel as unknown as { unref?: () => void }).unref?.()\n }\n\n post(message: TabMessage<T>): void {\n try {\n this.channel?.postMessage(message)\n } catch {\n this.channel = null\n }\n }\n\n close(): void {\n this.channel?.close()\n }\n}\n","import type { HttpClient } from '../http'\nimport type { NulvlessError, RequestOptions } from '../types'\n\nexport type BearerResolution =\n | { ok: true; headers: Record<string, string> }\n | { ok: false; error: NulvlessError }\n\nconst NO_SESSION_ERROR: NulvlessError = {\n code: 'no_session',\n message: 'No active session.',\n status_code: 401,\n}\n\nexport async function resolveBearer(\n http: HttpClient,\n getToken: () => Promise<string | null>,\n options?: RequestOptions,\n): Promise<BearerResolution> {\n if (http.hasAuthorization(options?.headers)) return { ok: true, headers: {} }\n\n const token = await getToken()\n\n if (!token) return { ok: false, error: { ...NO_SESSION_ERROR } }\n\n return { ok: true, headers: { Authorization: `Bearer ${token}` } }\n}\n\nexport abstract class AuthSubClient {\n constructor(\n protected readonly http: HttpClient,\n protected readonly getToken: () => Promise<string | null>,\n ) {}\n\n protected bearer(options?: RequestOptions): Promise<BearerResolution> {\n return resolveBearer(this.http, this.getToken, options)\n }\n}\n","import { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n AuthMethod,\n EnableFactorParams,\n EnrollFactorParams,\n FactorEnrollment,\n Nonce,\n UnenrollFactorParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * MFA factor management.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class FactorsClient extends AuthSubClient {\n\n /**\n * Lists all configured MFA factors for the authenticated user.\n */\n async list(options?: RequestOptions): Promise<NulvlessResult<AuthMethod[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<AuthMethod[]>('/factors', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns the user's recovery codes.\n *\n * Requires sudo: `MANAGE_MFA`.\n */\n async getRecoveryCodes(\n params?: Nonce,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ codes: string[] }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<{ codes: string[] }>('/factors/codes', {\n ...options,\n nonce: params?.nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Deletes (invalidates) the user's recovery codes.\n *\n * Requires sudo: `MANAGE_MFA`.\n */\n async deleteRecoveryCodes(params?: Nonce, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.delete<null>('/factors/codes', {\n ...options,\n nonce: params?.nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Begins enrolling a new MFA factor. Returns credentials needed to configure\n * the factor on the user's device.\n *\n * For TOTP: use `secret` for manual entry or `url` to generate a QR code.\n * For SMS: pass `phone` to send the codes to a number other than the user's.\n *\n * A user holds up to 10 authenticator apps and SMS factors combined, and one\n * email factor and one set of recovery codes.\n *\n * After the user configures their device, call `enable` with the `token` and\n * the first OTP code to activate the factor.\n *\n * Requires sudo: `MANAGE_MFA`.\n *\n * @example\n * const { data } = await nulvless.auth.factors.enroll({ type: 'totp', name: 'My Authenticator' })\n * // data.url → QR code provisioning URL\n * // data.secret → manual entry secret\n * // data.token → pass to factors.enable\n */\n async enroll(params: EnrollFactorParams, options?: RequestOptions): Promise<NulvlessResult<FactorEnrollment>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, type, name, phone } = params\n const body = { ...(name ? { name } : {}), ...(phone ? { phone } : {}) }\n return this.http.post<FactorEnrollment>(route`/factors/${type}`, body, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Activates a pending factor enrollment by confirming the first OTP code.\n *\n * Pass the `token` from `enroll` and the code generated by the user's device.\n */\n async enable(params: EnableFactorParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<null>('/factors', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Unenrolls (removes) an MFA factor by its ID.\n *\n * Use `factors.list()` to retrieve the factor `id` before calling this.\n * Returns the removed factor.\n *\n * Requires sudo: `MANAGE_MFA`.\n *\n * @example\n * const { data: factors } = await nulvless.auth.factors.list()\n * const totp = factors?.find(f => f.type === 'totp')\n * if (totp?.id) await nulvless.auth.factors.unenroll({ id: totp.id })\n */\n async unenroll(params: UnenrollFactorParams, options?: RequestOptions): Promise<NulvlessResult<AuthMethod>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<AuthMethod>(route`/factors/${id}`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n}\n","import { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n AddEmailIdentityParams,\n AddPhoneIdentityParams,\n Challenge,\n Identity,\n IdentityType,\n RemoveIdentityParams,\n SendOTPToUpdateEmailParams,\n SendOTPToUpdatePhoneParams,\n UpdateIdentityParams,\n User,\n UserProfile,\n VerifyChallengeParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Current-user management.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class UsersClient extends AuthSubClient {\n\n /**\n * Returns the authenticated user's full profile.\n */\n async me(options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<User>('/users/me', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Updates the authenticated user's profile fields.\n *\n * Omit fields to leave them unchanged.\n */\n async update(\n params: { username?: string; profile?: UserProfile },\n options?: RequestOptions,\n ): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<User>('/users', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Lists all identities (email, phone, OAuth) linked to the authenticated user.\n *\n * @param type Filter by identity type: `'email'`, `'phone'`, or `'oauth'`.\n */\n async getIdentities(type?: IdentityType, options?: RequestOptions): Promise<NulvlessResult<Identity[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Identity[]>('/users/identities', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n ...(type ? { query: { type } } : {}),\n })\n }\n\n /**\n * Initiates adding a new email identity. Sends an OTP to the provided address.\n *\n * Complete the flow with `verifyIdentity`.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async addEmailIdentity(\n params: AddEmailIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Challenge>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, email } = params\n return this.http.post<Challenge>('/users/identities/emails', { email }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Initiates adding a new phone identity. Sends an OTP to the provided number.\n *\n * Complete the flow with `verifyIdentity`.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async addPhoneIdentity(\n params: AddPhoneIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Challenge>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, phone } = params\n return this.http.post<Challenge>('/users/identities/phones', phone, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Confirms an identity addition by submitting the OTP received via\n * `addEmailIdentity` or `addPhoneIdentity`.\n */\n async verifyIdentity(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<User>('/users/identities/verify', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Updates an identity — currently used to set an identity as primary.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async updateIdentity(\n params: UpdateIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id, primary } = params\n return this.http.patch<User>(route`/users/identities/${id}`, { primary }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Unlinks (removes) an identity from the authenticated user.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async removeIdentity(\n params: RemoveIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Identity>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<Identity>(route`/users/identities/${id}`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Sends an OTP to the new email address to initiate an email change.\n *\n * Complete the flow with `confirmEmailUpdate`.\n *\n * Requires sudo: `MANAGE_CREDENTIALS`.\n */\n async sendOTPToUpdateEmail(\n params: SendOTPToUpdateEmailParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ token: string }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, email } = params\n return this.http.post<{ token: string }>('/users/emails/code/send', { email }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Confirms an email change by submitting the OTP received via `sendOTPToUpdateEmail`.\n */\n async confirmEmailUpdate(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<User>('/users/emails/code/confirm', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Sends an OTP to the new phone number to initiate a phone change.\n *\n * Complete the flow with `confirmPhoneUpdate`.\n *\n * Requires sudo: `MANAGE_CREDENTIALS`.\n */\n async sendOTPToUpdatePhone(\n params: SendOTPToUpdatePhoneParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ token: string }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, phone } = params\n return this.http.post<{ token: string }>('/users/phones/code/send', phone, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Confirms a phone change by submitting the OTP received via `sendOTPToUpdatePhone`.\n */\n async confirmPhoneUpdate(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<User>('/users/phones/code/confirm', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n Authenticated,\n Challenge,\n Nonce,\n RevokeSessionParams,\n Session,\n SudoMethod,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Active session management for the authenticated user.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class SessionsClient extends AuthSubClient {\n constructor(\n http: HttpClient,\n getToken: () => Promise<string | null>,\n private readonly persist: (\n result: NulvlessResult<Authenticated>,\n ) => Promise<NulvlessResult<Authenticated>>,\n ) {\n super(http, getToken)\n }\n\n /**\n * Returns all active sessions for the authenticated user across all devices.\n * The current session is marked with `is_current_session: true`.\n */\n async list(options?: RequestOptions): Promise<NulvlessResult<Session[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Session[]>('/sessions', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Revokes (invalidates) a specific session by its ID.\n *\n * Use `auth.getSession()` to get the current session ID.\n *\n * Requires sudo: `MANAGE_SESSIONS`.\n */\n async revoke(params: RevokeSessionParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<null>(route`/sessions/${id}`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Starts a sudo elevation by requesting a verification challenge.\n *\n * The available methods are derived from what the user has (TOTP if active,\n * email OTP, SMS OTP). Pass `method` to request a specific one; if omitted and\n * the user has a single method it is emitted automatically, otherwise an empty\n * challenge is returned so the user can pick which one to send.\n *\n * Prompt the user for the code, then call `sudoVerify({ code })` to complete\n * the elevation. The verify response carries `sudo.expires_in` (seconds until\n * sudo mode expires) alongside the refreshed session tokens.\n *\n * @example\n * const { data } = await nulvless.auth.sessions.sudo() // or sudo('email_otp')\n * // prompt the user for the code, then call sudoVerify({ code })\n */\n async sudo(\n method?: SudoMethod,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ challenge: Challenge }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<{ challenge: Challenge }>('/sessions/sudo/request', {\n ...options,\n ...(method ? { query: { method } } : {}),\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Completes a sudo elevation started by `sudo()`. Submit the `code` the user\n * received (or read from their authenticator) — the pending sudo challenge is\n * resolved by the current session, so no challenge token is needed.\n *\n * On success the session is re-issued with sudo mode active and stored\n * automatically; `data.sudo.expires_in` carries the seconds until it expires.\n *\n * @example\n * const { data } = await nulvless.auth.sessions.sudoVerify({ code })\n * // data.sudo?.expires_in → 300\n */\n async sudoVerify(\n params: { code: string },\n options?: RequestOptions,\n ): Promise<NulvlessResult<Authenticated>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.persist(\n await this.http.post<Authenticated>('/sessions/sudo/verify', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n }),\n )\n }\n\n /**\n * Verifies that sudo mode is currently active for the session.\n *\n * Returns `204 No Content` on success. Returns an error if sudo is not active.\n *\n * @example\n * const { error } = await nulvless.auth.sessions.checkSudo()\n * if (error) {\n * // Start the sudo flow: sessions.sudo() → sessions.sudoVerify\n * }\n */\n async checkSudo(params?: Nonce, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<null>('/sessions/sudo', {\n ...options,\n nonce: params?.nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { NulvlessResult, RequestOptions } from '../../types'\nimport type { ChangePasswordParams } from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Account security operations (password).\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class SecurityClient extends AuthSubClient {\n\n /**\n * Changes the authenticated user's password.\n *\n * @example\n * await nulvless.auth.security.changePassword({\n * password: 'current-password',\n * new_password: 'new-password',\n * })\n */\n async changePassword(params: ChangePasswordParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, ...body } = params\n return this.http.put<null>('/security/password', body, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n Authenticated,\n Challenge,\n ChangeChallengeParams,\n CreateChallengeParams,\n VerifyChallengeParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Challenge lifecycle — create, inspect, switch method, and verify.\n *\n * Mirrors the `/challenges` resource. Used by MFA, OTP sign-in, sign-up\n * confirmation and step-up (sudo) flows.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n */\nexport class ChallengesClient extends AuthSubClient {\n constructor(\n http: HttpClient,\n getToken: () => Promise<string | null>,\n private readonly persist: (\n result: NulvlessResult<Authenticated>,\n ) => Promise<NulvlessResult<Authenticated>>,\n ) {\n super(http, getToken)\n }\n\n /**\n * Creates a verification challenge for the given MFA method (step-up).\n *\n * Requires an authenticated session. Prompt the user for the code, then call\n * `verify({ token, code })`.\n *\n * A `totp` challenge accepts a code from any of the user's authenticator\n * apps. For `sms_otp`, pass `factor_id` to pick which phone receives it.\n *\n * @example\n * const { data } = await nulvless.auth.challenges.create({ type: 'totp' })\n * const { data: sms } = await nulvless.auth.challenges.create({ type: 'sms_otp', factor_id })\n */\n async create(\n params: CreateChallengeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ challenge: Challenge }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<{ challenge: Challenge }>(route`/challenges/${params.type}`, undefined, {\n ...options,\n ...(params.factor_id ? { query: { factor_id: params.factor_id } } : {}),\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Retrieves the current state of a challenge by its token.\n */\n get(token: string, options?: RequestOptions): Promise<NulvlessResult<Challenge>> {\n return this.http.get<Challenge>('/challenges', { ...options, query: { token } })\n }\n\n /**\n * Switches the preferred MFA method for an ongoing challenge.\n *\n * @example\n * const { data } = await nulvless.auth.challenges.change({ token, type: 'totp' })\n */\n change(\n params: ChangeChallengeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ challenge: Challenge }>> {\n return this.http.patch<{ challenge: Challenge }>(\n route`/challenges/${params.type}`,\n { token: params.token },\n params.factor_id\n ? { ...options, query: { factor_id: params.factor_id } }\n : options,\n )\n }\n\n /**\n * Verifies a challenge by submitting the token and the code entered by the user.\n *\n * Used for OTP sign-in, MFA verification after `signIn`, and sign-up\n * confirmation. Session is stored automatically when the response contains an\n * access token.\n */\n async verify(\n params: VerifyChallengeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Authenticated>> {\n return this.persist(await this.http.post<Authenticated>('/challenges/verify', params, options))\n }\n}\n","import { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n BlockGrantParams,\n InviteParams,\n Grant,\n GrantMembers,\n LeaveGrantParams,\n RevokeGrantParams,\n UpdateGrantParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Grant management for the authenticated user.\n *\n * Available on `createServerClient` only (requires private key `sk_`).\n *\n * All methods require authentication. Pass `options.headers.Authorization` to\n * forward the user's bearer token on each server-side call.\n */\nexport class GrantsClient extends AuthSubClient {\n\n /**\n * Returns all grants granted to the authenticated user, optionally\n * filtered by context.\n */\n async list(context?: string, options?: RequestOptions): Promise<NulvlessResult<Grant[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Grant[]>('/grants', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n ...(context ? { query: { context } } : {}),\n })\n }\n\n /**\n * Returns all grants for a given resource, grouped by status\n * (granted, invited, requested, blocked).\n *\n * The authenticated user must own or manage the resource.\n */\n async getMembers(resource: string, options?: RequestOptions): Promise<NulvlessResult<GrantMembers>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<GrantMembers>('/grants/members', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: { resource },\n })\n }\n\n /**\n * Creates grant invitations for one or more users on a resource.\n *\n * Each invite sends a notification to the target email address.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n *\n * @example\n * await nulvless.auth.grants.invite({\n * resource: 'project-123',\n * invites: [{ email: 'user@example.com', scopes: ['read', 'write'] }],\n * })\n */\n async invite(params: InviteParams, options?: RequestOptions): Promise<NulvlessResult<Grant[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, ...body } = params\n return this.http.post<Grant[]>('/grants/invites', {\n ...body,\n ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}),\n }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns a single grant by ID.\n */\n async get(id: string, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Grant>(route`/grants/${id}`, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Revokes (removes) a grant.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async revoke(params: RevokeGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<Grant>(route`/grants/${id}/revoke`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Accepts a pending invitation (`status: 'invited'`).\n */\n async accept(id: string, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<Grant>(route`/grants/${id}/accept`, undefined, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Cancels a pending invitation or request (`status: 'invited'` or `'requested'`).\n */\n async cancel(id: string, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<Grant>(route`/grants/${id}/cancel`, undefined, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Blocks a grant.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async block(params: BlockGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.patch<Grant>(route`/grants/${id}/block`, undefined, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Updates the scopes of an existing grant.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async update(id: string, params: UpdateGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, ...body } = params\n return this.http.patch<Grant>(route`/grants/${id}`, body, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Removes the authenticated user from a resource they were granted access to.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async leave(params: LeaveGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.patch<Grant>(route`/grants/${id}/leave`, undefined, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n ExchangeOAuthCodeParams,\n OAuthApp,\n OAuthAuthorization,\n OAuthAuthorizeParams,\n OAuthConsentAction,\n OAuthConsentResult,\n OAuthDiscovery,\n OAuthJWKS,\n OAuthTokenResponse,\n OAuthUserGrant,\n OAuthUserInfo,\n RefreshOAuthTokenParams,\n RegisterOAuthAppParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Manages the OAuth apps the authenticated user has authorized\n * (`/user/oauth/grants`). Requires authentication (bearer token).\n */\nexport class OAuthGrantsClient extends AuthSubClient {\n /**\n * Lists the apps the authenticated user has granted access to.\n */\n async list(options?: RequestOptions): Promise<NulvlessResult<OAuthUserGrant[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<OAuthUserGrant[]>('/user/oauth/grants', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Revokes a previously granted app by its public `client_id`.\n * Also invalidates the app's active sessions for this user.\n */\n async revoke(clientId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.delete<null>('/user/oauth/grants', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: { client_id: clientId },\n })\n }\n}\n\n/**\n * The project's OAuth 2.1 / OpenID Connect provider surface — the project\n * acting as an identity provider for third-party applications.\n *\n * Available with both public (`pk_`) and private (`sk_`) keys.\n *\n * Method scopes:\n * - `token`, `register` — platform key only (no bearer token).\n * - `getAuthorization`, `consent`, `userinfo`, and the `grants` namespace —\n * authenticated user (bearer token).\n * - `discovery`, `jwks` — public OIDC metadata (no auth).\n *\n * The `/oauth/authorize` entry point is a browser redirect (302), not a JSON\n * API — build it from `discovery().authorization_endpoint` and redirect the\n * user agent there.\n */\nexport class OAuthClient extends AuthSubClient {\n /** Apps the authenticated user has authorized — list and revoke. */\n readonly grants: OAuthGrantsClient\n\n constructor(http: HttpClient, getToken: () => Promise<string | null>) {\n super(http, getToken)\n this.grants = new OAuthGrantsClient(http, getToken)\n }\n\n /**\n * Builds the OAuth authorization URL and, in the browser, redirects the user\n * agent to it. On the server the URL is returned for manual handling.\n *\n * Mirrors `auth.authorize` (social sign-in): redirects automatically in the\n * browser, returns `data.url` on the server. The endpoint itself is a 302\n * redirect, so the URL is composed from the discovery `authorization_endpoint`.\n *\n * PKCE is required (RFC 7636, https://www.rfc-editor.org/rfc/rfc7636): provide\n * `code_challenge` = BASE64URL(SHA256(code_verifier)) with\n * `code_challenge_method: 'S256'`. Send the `code_verifier` later to\n * `exchangeCodeForToken`.\n *\n * @example\n * // Browser — redirects automatically\n * await nulvless.auth.oauth.authorize({ client_id, redirect_uri, code_challenge, code_challenge_method: 'S256' })\n *\n * // Server — use the returned URL\n * const { data } = await nulvless.auth.oauth.authorize(params)\n * return Response.redirect(data.url)\n */\n async authorize(params: OAuthAuthorizeParams, options?: RequestOptions): Promise<NulvlessResult<{ url: string }>> {\n const discovery = await this.discovery(options)\n if (discovery.error) return { data: null, error: discovery.error }\n\n const url = new URL(discovery.data.authorization_endpoint)\n const query: Record<string, string | undefined> = {\n client_id: params.client_id,\n redirect_uri: params.redirect_uri,\n response_type: params.response_type ?? 'code',\n code_challenge: params.code_challenge,\n code_challenge_method: params.code_challenge_method,\n scope: params.scope,\n state: params.state,\n resource: params.resource,\n nonce: params.nonce,\n prompt: params.prompt,\n max_age: params.max_age === undefined ? undefined : String(params.max_age),\n }\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, value)\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = url.toString()\n }\n\n return { data: { url: url.toString() }, error: null }\n }\n\n /**\n * Exchanges an authorization code for tokens\n * (`POST /oauth/token`, `grant_type=authorization_code`).\n *\n * Called by the relying-party app after the user is redirected back with the\n * `code`. PKCE `code_verifier` is required; `client_secret` only for\n * confidential clients. Public endpoint — no platform key.\n */\n exchangeCodeForToken(\n params: ExchangeOAuthCodeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<OAuthTokenResponse>> {\n return this.http.post<OAuthTokenResponse>(\n '/oauth/token',\n { grant_type: 'authorization_code', ...params },\n { ...options, skipApiKey: true },\n )\n }\n\n /**\n * Refreshes an access token using a refresh token\n * (`POST /oauth/token`, `grant_type=refresh_token`).\n *\n * `client_secret` only for confidential clients. Public endpoint — no\n * platform key.\n */\n refreshToken(\n params: RefreshOAuthTokenParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<OAuthTokenResponse>> {\n return this.http.post<OAuthTokenResponse>(\n '/oauth/token',\n { grant_type: 'refresh_token', ...params },\n { ...options, skipApiKey: true },\n )\n }\n\n /**\n * Dynamically registers a new OAuth app (RFC 7591, `POST /oauth/register`).\n *\n * Requires the OAuth server to be enabled with dynamic client registration\n * allowed. For server-side managed registration use `admin.oauthClients`.\n */\n register(params: RegisterOAuthAppParams, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n // Public endpoint (RFC 7591), gated server-side by config — no platform key.\n return this.http.post<OAuthApp>('/oauth/register', params, { ...options, skipApiKey: true })\n }\n\n /**\n * Loads a pending authorization for the consent screen\n * (`GET /oauth/authorizations/:id`).\n *\n * Claims the authorization for the authenticated user. When a matching\n * consent already exists it is auto-approved and `redirect.uri` is returned.\n *\n * Requires authentication.\n */\n async getAuthorization(authorizationId: string, options?: RequestOptions): Promise<NulvlessResult<OAuthAuthorization>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<OAuthAuthorization>(route`/oauth/authorizations/${authorizationId}`, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Approves or denies a pending authorization\n * (`POST /oauth/authorizations/:id/consent`).\n *\n * Returns the `redirect.uri` to send the user agent back to (carrying the\n * authorization `code` on approve, or `error=access_denied` on deny).\n *\n * Requires authentication.\n */\n async consent(\n authorizationId: string,\n action: OAuthConsentAction,\n options?: RequestOptions,\n ): Promise<NulvlessResult<OAuthConsentResult>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<OAuthConsentResult>(route`/oauth/authorizations/${authorizationId}/consent`, { action }, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns OIDC UserInfo claims for the access token (`GET /oauth/userinfo`).\n *\n * The access token must have been issued with the `openid` scope.\n *\n * Requires authentication.\n */\n async userinfo(options?: RequestOptions): Promise<NulvlessResult<OAuthUserInfo>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<OAuthUserInfo>('/oauth/userinfo', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns the OpenID Connect discovery document\n * (`GET /.well-known/openid-configuration`). Public — no auth required.\n */\n discovery(options?: RequestOptions): Promise<NulvlessResult<OAuthDiscovery>> {\n // Public OIDC metadata — no platform key.\n return this.http.get<OAuthDiscovery>('/.well-known/openid-configuration', { ...options, skipApiKey: true })\n }\n\n /**\n * Returns the JSON Web Key Set used to verify issued tokens\n * (`GET /.well-known/jwks.json`). Public — no auth required.\n */\n jwks(options?: RequestOptions): Promise<NulvlessResult<OAuthJWKS>> {\n // Public OIDC metadata — no platform key.\n return this.http.get<OAuthJWKS>('/.well-known/jwks.json', { ...options, skipApiKey: true })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n AdminCreateUserParams,\n AdminUpdateUserParams,\n AuthMethod,\n CreateRoleParams,\n OAuthApp,\n Paginated,\n PaginateGrantsParams,\n PaginateUsersParams,\n Grant,\n RegisterOAuthAppParams,\n Role,\n Session,\n SetGrantParams,\n UpdateOAuthAppParams,\n UpdateRoleParams,\n User,\n} from '../types'\n\n/**\n * Admin operations on platform users.\n * Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminUsersClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Creates a new user bypassing normal sign-up flows.\n */\n create(params: AdminCreateUserParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.post<User>('/admin/users', params, options)\n }\n\n /**\n * Lists users with pagination and optional filters.\n */\n list(params?: PaginateUsersParams, options?: RequestOptions): Promise<NulvlessResult<Paginated<User>>> {\n return this.http.get<Paginated<User>>('/admin/users', {\n ...options,\n ...(params ? { query: params as Record<string, string | number | boolean> } : {}),\n })\n }\n\n /**\n * Returns a single user by ID.\n */\n get(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.get<User>(route`/admin/users/${userId}`, options)\n }\n\n /**\n * Updates a user's profile fields.\n */\n update(userId: string, params: AdminUpdateUserParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.patch<User>(route`/admin/users/${userId}`, params, options)\n }\n\n /**\n * Permanently deletes a user.\n */\n delete(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.delete<User>(route`/admin/users/${userId}`, options)\n }\n\n /**\n * Bans a user, preventing them from signing in.\n */\n ban(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.patch<User>(route`/admin/users/${userId}/ban`, undefined, options)\n }\n\n /**\n * Lifts a ban on a user.\n */\n unban(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.patch<User>(route`/admin/users/${userId}/unban`, undefined, options)\n }\n\n /**\n * Returns all active sessions for a specific user.\n */\n getSessions(userId: string, options?: RequestOptions): Promise<NulvlessResult<Session[]>> {\n return this.http.get<Session[]>(route`/admin/users/${userId}/sessions`, options)\n }\n\n /**\n * Invalidates all sessions for a specific user (signs them out everywhere).\n */\n signOutAll(userId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/users/${userId}/sessions`, options)\n }\n\n /**\n * Invalidates a specific session for a user.\n */\n revokeSession(userId: string, sessionId: string, options?: RequestOptions): Promise<NulvlessResult<Session>> {\n return this.http.delete<Session>(route`/admin/users/${userId}/sessions/${sessionId}`, options)\n }\n\n /**\n * Returns all configured MFA factors for a specific user.\n */\n getFactors(userId: string, options?: RequestOptions): Promise<NulvlessResult<AuthMethod[]>> {\n return this.http.get<AuthMethod[]>(route`/admin/users/${userId}/factors`, options)\n }\n\n /**\n * Removes a specific MFA factor from a user.\n */\n removeFactor(userId: string, factorId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/users/${userId}/factors/${factorId}`, options)\n }\n}\n\n/**\n * Role management. Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminRolesClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Returns all roles, optionally filtered by context.\n */\n list(context?: string, options?: RequestOptions): Promise<NulvlessResult<Role[]>> {\n return this.http.get<Role[]>('/admin/roles', {\n ...options,\n ...(context ? { query: { context } } : {}),\n })\n }\n\n /**\n * Creates a new role with the given scopes.\n */\n create(params: CreateRoleParams, options?: RequestOptions): Promise<NulvlessResult<Role>> {\n return this.http.post<Role>('/admin/roles', params, options)\n }\n\n /**\n * Updates an existing role.\n */\n update(role_id: string, params: UpdateRoleParams, options?: RequestOptions): Promise<NulvlessResult<Role>> {\n return this.http.patch<Role>(route`/admin/roles/${role_id}`, params, options)\n }\n\n /**\n * Deletes a role.\n */\n delete(role_id: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/roles/${role_id}`, options)\n }\n}\n\n/**\n * Platform-level grant management.\n * Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminGrantsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists grants with pagination and optional filters.\n */\n list(params?: PaginateGrantsParams, options?: RequestOptions): Promise<NulvlessResult<Paginated<Grant>>> {\n return this.http.get<Paginated<Grant>>('/admin/grants', {\n ...options,\n ...(params ? { query: params as Record<string, string | number | boolean> } : {}),\n })\n }\n\n /**\n * Creates or upserts a grant for a user on a resource.\n */\n set(params: SetGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n return this.http.post<Grant>('/admin/grants', params, options)\n }\n\n /**\n * Deletes a grant by ID.\n */\n delete(grantId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/grants/${grantId}`, options)\n }\n\n /**\n * Removes all grants associated with a resource.\n *\n * Use with caution — this will revoke access for all users on the resource.\n */\n deleteByResource(resource: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/resources/${resource}/grants`, options)\n }\n}\n\n/**\n * Manage the project's OAuth applications (clients) — the third-party apps\n * allowed to authenticate users through the project's OAuth server.\n *\n * Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminOAuthClientsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Registers a new OAuth app. For confidential apps the response includes a\n * one-time `client_secret` — store it securely, it is never returned again.\n */\n create(params: RegisterOAuthAppParams, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.post<OAuthApp>('/admin/oauth/clients', params, options)\n }\n\n /**\n * Lists all registered OAuth apps.\n */\n list(options?: RequestOptions): Promise<NulvlessResult<OAuthApp[]>> {\n return this.http.get<OAuthApp[]>('/admin/oauth/clients', options)\n }\n\n /**\n * Returns a single OAuth app by its internal id.\n */\n get(id: string, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.get<OAuthApp>(route`/admin/oauth/clients/${id}`, options)\n }\n\n /**\n * Updates an OAuth app. `client_type` is immutable and the secret rotates via\n * `regenerateSecret` — neither can be changed here.\n */\n update(id: string, params: UpdateOAuthAppParams, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.put<OAuthApp>(route`/admin/oauth/clients/${id}`, params, options)\n }\n\n /**\n * Deletes an OAuth app.\n */\n delete(id: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/oauth/clients/${id}`, options)\n }\n\n /**\n * Rotates the client secret (confidential apps only). The new `client_secret`\n * is returned once — the previous one stops working immediately.\n */\n regenerateSecret(id: string, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.post<OAuthApp>(route`/admin/oauth/clients/${id}/regenerate_secret`, undefined, options)\n }\n}\n\n/**\n * Admin namespace — platform management operations.\n *\n * Available on `createServerClient` only (requires private key `sk_`).\n * No bearer token is required for any method in this namespace.\n *\n * Sub-namespaces:\n * - `admin.users` — create, list, update, delete users; manage sessions & factors\n * - `admin.roles` — create, list, update, delete roles\n * - `admin.grants` — set, list, delete platform grants\n * - `admin.oauthClients` — register and manage OAuth apps (clients)\n */\nexport class AdminClient {\n readonly users: AdminUsersClient\n readonly roles: AdminRolesClient\n readonly grants: AdminGrantsClient\n readonly oauthClients: AdminOAuthClientsClient\n\n constructor(private readonly http: HttpClient) {\n this.users = new AdminUsersClient(http)\n this.roles = new AdminRolesClient(http)\n this.grants = new AdminGrantsClient(http)\n this.oauthClients = new AdminOAuthClientsClient(http)\n }\n}\n","import type { Authenticated } from '../auth/types'\nimport type { StoredSession } from './types'\n\nconst DEFAULT_EXPIRES_IN_SECONDS = 3600\n\nexport function toStoredSession(auth: Authenticated & { access_token: string }): StoredSession {\n return {\n access_token: auth.access_token,\n ...(auth.refresh_token !== undefined ? { refresh_token: auth.refresh_token } : {}),\n expires_at: Date.now() + (auth.expires_in ?? DEFAULT_EXPIRES_IN_SECONDS) * 1000,\n token_type: auth.token_type ?? 'bearer',\n ...(auth.user !== undefined ? { user: auth.user } : {}),\n }\n}\n\nexport function toAuthenticated(stored: StoredSession): Authenticated {\n return {\n access_token: stored.access_token,\n ...(stored.refresh_token !== undefined ? { refresh_token: stored.refresh_token } : {}),\n ...(stored.token_type ? { token_type: stored.token_type as NonNullable<Authenticated['token_type']> } : {}),\n expires_in: Math.round((stored.expires_at - Date.now()) / 1000),\n ...(stored.user !== undefined ? { user: stored.user } : {}),\n }\n}\n","import type { NulvlessStorage } from '../storage/types'\nimport type { StoredSession } from '../session/types'\nimport type { Authenticated, User } from './types'\nimport { toStoredSession } from '../session/stored'\n\nexport interface AccountEntry {\n userId: string\n access_token: string\n expires_in: number\n refresh_token?: string\n user?: User\n}\n\ntype AccountsMap = Record<string, StoredSession>\n\nfunction decodeBase64Url(segment: string): string {\n const base64 = segment.replace(/-/g, '+').replace(/_/g, '/')\n const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n const bytes = Uint8Array.from(atob(padded), char => char.charCodeAt(0))\n\n return new TextDecoder().decode(bytes)\n}\n\nexport function extractUserId(auth: Authenticated): string | null {\n if (auth.user?.id) return auth.user.id\n if (!auth.access_token) return null\n try {\n const payload = JSON.parse(decodeBase64Url(auth.access_token.split('.')[1]!)) as Record<string, unknown>\n return typeof payload['sub'] === 'string' ? payload['sub'] : null\n } catch {\n return null\n }\n}\n\nexport class AccountsManager {\n constructor(\n private readonly storage: NulvlessStorage,\n private readonly accountsKey: string,\n ) {}\n\n private async readMap(): Promise<AccountsMap> {\n const raw = await this.storage.getItem(this.accountsKey)\n if (!raw) return {}\n try {\n return JSON.parse(raw) as AccountsMap\n } catch {\n return {}\n }\n }\n\n private async writeMap(map: AccountsMap): Promise<void> {\n await this.storage.setItem(this.accountsKey, JSON.stringify(map))\n }\n\n async save(auth: Authenticated): Promise<string | null> {\n const userId = extractUserId(auth)\n if (!userId || !auth.access_token) return null\n\n const map = await this.readMap()\n map[userId] = toStoredSession({ ...auth, access_token: auth.access_token })\n await this.writeMap(map)\n return userId\n }\n\n async getSession(userId: string): Promise<StoredSession | null> {\n const map = await this.readMap()\n return map[userId] ?? null\n }\n\n async list(): Promise<AccountEntry[]> {\n const map = await this.readMap()\n return Object.entries(map).map(([userId, session]) => ({\n userId,\n access_token: session.access_token,\n expires_in: Math.round((session.expires_at - Date.now()) / 1000),\n ...(session.refresh_token !== undefined ? { refresh_token: session.refresh_token } : {}),\n ...(session.user !== undefined ? { user: session.user } : {}),\n }))\n }\n\n async remove(userId: string): Promise<void> {\n const map = await this.readMap()\n delete map[userId]\n await this.writeMap(map)\n }\n}\n","import type { Authenticated } from './types'\n\nexport interface AuthEvents {\n /** Emitted when a sign-in or sign-up succeeds and an access token is stored. */\n 'signed-in': Authenticated\n /** Emitted after `signOut` succeeds. */\n 'signed-out': { userId?: string }\n /** Emitted when the server returns a challenge (MFA/OTP) with no access token. */\n 'challenge': Authenticated\n /** Emitted after the access token is refreshed automatically. */\n 'token-refreshed': Authenticated\n /** Emitted when `switch()` succeeds. */\n 'account-switched': { userId: string }\n /**\n * Emitted when the SDK cannot authenticate the user:\n * - there is no refresh token, or\n * - a refresh attempt was rejected by the server (401 / `unauthorized`).\n *\n * The payload carries the failed session (its `user` when known), so\n * multi-user callers can remove the right entry from the accounts store.\n */\n 'unauthorized': Authenticated\n /**\n * Emitted when any request fails with `403 protected_action_denied`,\n * meaning the action requires an active sudo session.\n * Run the sudo flow (`auth.sessions.sudo()` → `auth.challenges.verify()`)\n * to activate sudo mode, then retry.\n */\n 'sudo-required': void\n}\n\ntype Listener<T> = T extends void ? () => void : (payload: T) => void\ntype UnsubscribeFn = () => void\n\nexport class AuthEventEmitter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly listeners = new Map<keyof AuthEvents, Set<Listener<any>>>()\n\n on<K extends keyof AuthEvents>(event: K, handler: Listener<AuthEvents[K]>): UnsubscribeFn {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(handler)\n return () => { set!.delete(handler) }\n }\n\n emit<K extends keyof AuthEvents>(\n ...args: AuthEvents[K] extends void ? [event: K] : [event: K, payload: AuthEvents[K]]\n ): void {\n const [event, payload] = args\n const set = this.listeners.get(event)\n if (!set) return\n for (const handler of set) {\n try {\n ;(handler as (p: unknown) => void)(payload)\n } catch (error) {\n console.error(`[nulvless] '${event}' listener failed`, error)\n }\n }\n }\n\n removeAllListeners(event?: keyof AuthEvents): void {\n if (event) {\n this.listeners.delete(event)\n } else {\n this.listeners.clear()\n }\n }\n}\n","import type { HttpClient } from '../http'\nimport { route } from '../http'\nimport type { NulvlessResult, RequestOptions } from '../types'\nimport type { SessionManager } from '../session/manager'\nimport { TabChannel } from '../session/tabChannel'\nimport type {\n AuthMethods,\n Authenticated,\n Challenge,\n LookupParams,\n LookupResult,\n OAuthProvider,\n RecoverParams,\n RefreshTokenParams,\n ResetPasswordParams,\n Session,\n SignInParams,\n SignInWithOTPParams,\n SignOutScope,\n SignUpParams,\n VerifyChallengeParams,\n VerifyParams,\n Verified,\n} from './types'\nimport { FactorsClient } from './factors'\nimport { UsersClient } from './users'\nimport { SessionsClient } from './sessions'\nimport { SecurityClient } from './security'\nimport { ChallengesClient } from './challenges'\nimport { GrantsClient } from './grants'\nimport { OAuthClient } from './oauth'\nimport { AdminClient } from './admin'\nimport { AccountsManager, extractUserId } from './accounts'\nimport type { AccountEntry } from './accounts'\nimport { AuthEventEmitter } from './emitter'\nimport type { AuthEvents } from './emitter'\nimport type { NulvlessStorage } from '../storage/types'\nimport { toAuthenticated } from '../session/stored'\nimport { resolveBearer } from './base'\n\n/**\n * Auth methods accessible with both public (`pk_`) and private (`sk_`) keys.\n */\nexport class AuthClient {\n /** MFA factor management — enroll, enable, disable, recovery codes. */\n readonly factors: FactorsClient\n /** Current-user management — profile, identities, credential updates. */\n readonly users: UsersClient\n /** Active session management — list, revoke, sudo mode. */\n readonly sessions: SessionsClient\n /** Account security — change password. */\n readonly security: SecurityClient\n /** Challenge lifecycle — create, get, change, verify (MFA / OTP / step-up). */\n readonly challenges: ChallengesClient\n /** OAuth server (project as OIDC provider) — token, consent, userinfo, grants, discovery. */\n readonly oauth: OAuthClient\n\n protected readonly _getToken: () => Promise<string | null>\n\n constructor(\n protected readonly http: HttpClient,\n protected readonly session?: SessionManager,\n ) {\n // Inject refresh function into SessionManager after construction\n // to avoid circular dependency.\n session?.setRefreshFn((refresh_token) =>\n this.http.post<Authenticated>('/token', { refresh_token }, {\n query: { grant_type: 'refresh_token' },\n }),\n )\n\n this._getToken = () => this.session?.getValidToken() ?? Promise.resolve(null)\n\n this.factors = new FactorsClient(http, this._getToken)\n this.users = new UsersClient(http, this._getToken)\n this.sessions = new SessionsClient(http, this._getToken, (result) =>\n this.persistSession(result),\n )\n this.security = new SecurityClient(http, this._getToken)\n this.challenges = new ChallengesClient(http, this._getToken, (result) =>\n this.persistSession(result),\n )\n this.oauth = new OAuthClient(http, this._getToken)\n }\n\n /**\n * Returns the current active access token from storage.\n * Refreshes automatically if the token is expired or about to expire.\n * Returns `null` when there is no active session.\n */\n async getAccessToken(): Promise<string | null> {\n return this.session?.getValidToken() ?? null\n }\n\n protected async persistSession(result: NulvlessResult<Authenticated>): Promise<NulvlessResult<Authenticated>> {\n if (!result.error && result.data.access_token && this.session) {\n await this.session.save(result.data)\n }\n\n return result\n }\n\n /**\n * Creates a new user account.\n *\n * At least one of `email`, `phone`, or `username` must be provided.\n *\n * Check the response in this order:\n * 1. `data.access_token` → authenticated immediately — session stored automatically.\n * 2. `data.challenge` → MFA/OTP step required — call `verifyChallenge`.\n * 3. `data.user` only → pending email/phone confirmation.\n */\n async signUp(params: SignUpParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>('/signup', params, options),\n )\n }\n\n /**\n * Signs in with password (`grant_type=password`).\n *\n * At least one of `email`, `phone`, or `username` must be provided.\n *\n * Check the response in this order:\n * 1. `data.access_token` → signed in — session stored automatically.\n * 2. `data.challenge` → MFA step required — call `verifyChallenge`.\n */\n async signIn(params: SignInParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>('/token', params, {\n ...options,\n query: { grant_type: 'password' },\n }),\n )\n }\n\n /**\n * Requests a one-time password sent to the user's email or phone.\n *\n * Returns a `Challenge` (`202 Accepted`). Pass the received code to `verifyChallenge`.\n *\n * At least one of `email` or `phone` must be provided.\n */\n signInWithOTP(params: SignInWithOTPParams, options?: RequestOptions): Promise<NulvlessResult<Challenge>> {\n return this.http.post<Challenge>('/otp', params, options)\n }\n\n /**\n * Initiates an OAuth sign-in flow for the given provider.\n *\n * In a browser environment the user is redirected automatically to the\n * authorization URL. On the server the URL is returned for manual handling.\n *\n * After the redirect, the server-side callback exchanges the code automatically\n * and redirects back to `options.redirect_uri`. For server-side code exchange, use `exchangeCodeForToken`.\n *\n * @example\n * // Browser — redirects automatically\n * await nulvless.auth.authorize('google', { redirect_uri: 'https://myapp.com/callback' })\n *\n * // Server — use the returned URL\n * const { data } = await nulvless.auth.authorize('google', { redirect_uri: 'https://myapp.com/callback' })\n * return Response.redirect(data.url)\n */\n async authorize(\n provider: OAuthProvider,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ url: string; provider: OAuthProvider }>> {\n const result = await this.http.get<{ url: string; provider: OAuthProvider }>(\n route`/oauth/${provider}/authorize`,\n { ...options, query: { ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}) } },\n )\n\n if (!result.error && typeof window !== 'undefined') {\n window.location.href = result.data.url\n }\n\n return result\n }\n\n /**\n * Initiates an OAuth flow to connect a new provider to the authenticated user's account.\n *\n * Same behaviour as `authorize`, but for users who are already signed in — the resulting\n * provider identity is linked to the current account instead of starting a sign-in flow.\n *\n * In a browser environment the user is redirected automatically to the\n * authorization URL. On the server the URL is returned for manual handling.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n *\n * @example\n * await nulvless.auth.connect('github', { redirect_uri: 'https://myapp.com/settings/connections' })\n */\n async connect(\n provider: OAuthProvider,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ url: string; provider: OAuthProvider }>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n const result = await this.http.get<{ url: string; provider: OAuthProvider }>(\n route`/oauth/${provider}/connect`,\n {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: { ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}) },\n },\n )\n\n if (!result.error && typeof window !== 'undefined') {\n window.location.href = result.data.url\n }\n\n return result\n }\n\n /**\n * Signs in with an ID token issued by a third-party OAuth provider.\n *\n * Useful for mobile apps where you obtain the ID token natively (e.g. Google Sign-In SDK).\n *\n * Session is stored automatically when the response contains an access token.\n *\n * @example\n * const { data } = await nulvless.auth.signInWithIdToken('google', googleIdToken)\n */\n async signInWithIdToken(\n provider: OAuthProvider,\n idToken: string,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.get<Authenticated>(route`/signin/${provider}/id_token`, {\n ...options,\n query: { id_token: idToken },\n }),\n )\n }\n\n /**\n * Exchanges an OAuth authorization code for an access token\n * (`grant_type=authorization_code`).\n *\n * Must be called with `Content-Type: application/x-www-form-urlencoded`.\n * The `code` must be the authorization code received from the OAuth callback.\n *\n * Session is stored automatically when the response contains an access token.\n *\n * @example\n * const { data } = await nulvless.auth.exchangeCodeForToken('auth-code-from-callback')\n */\n async exchangeCodeForToken(code: string, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>(\n '/token',\n { code },\n {\n ...options,\n query: { grant_type: 'authorization_code' },\n headers: {\n ...options?.headers,\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n },\n ),\n )\n }\n\n /**\n * Returns all sign-in methods, MFA factors, and OAuth providers configured\n * for the authenticated user on this platform.\n *\n * Requires authentication.\n */\n async getMethods(options?: RequestOptions): Promise<NulvlessResult<AuthMethods>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n return this.http.get<AuthMethods>('/methods', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Looks up whether an identifier exists and which sign-in method applies.\n *\n * Useful for adaptive sign-in UIs. May return a `challenge` directly\n * when the user's method is OTP-only.\n *\n * At least one of `email`, `phone`, or `username` must be provided.\n */\n lookup(params: LookupParams, options?: RequestOptions): Promise<NulvlessResult<LookupResult>> {\n return this.http.post<LookupResult>('/lookup', params, options)\n }\n\n /**\n * Verifies a challenge by submitting the token and the code entered by the user.\n *\n * Used for:\n * - OTP sign-in (`signInWithOTP` flow)\n * - MFA verification after `signIn`\n * - Sign-up confirmation (`signUp` challenge flow)\n *\n * Convenience alias for `auth.challenges.verify`. Session is stored\n * automatically when the response contains an access token. For the rest of\n * the challenge lifecycle (create, get, change) use `auth.challenges`.\n */\n async verifyChallenge(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.challenges.verify(params, options)\n }\n\n /**\n * Activates an account via the confirmation link sent to the user's email/phone.\n */\n activate(token: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.get<null>('/activate', { ...options, query: { token } })\n }\n\n /**\n * Refreshes the access token using a refresh token (`grant_type=refresh_token`).\n * Session is updated automatically in storage.\n */\n async refreshToken(params: RefreshTokenParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>('/token', params, {\n ...options,\n query: { grant_type: 'refresh_token' },\n }),\n )\n }\n\n /**\n * Sends a password-recovery email to the user.\n */\n recover(params: RecoverParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/recover', {\n ...params,\n ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}),\n }, options)\n }\n\n /**\n * Resets the user's password using the token from the recovery email.\n */\n resetPassword(params: ResetPasswordParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/recover/reset-password', params, options)\n }\n\n /**\n * Validates the current session and optionally checks a grant.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n */\n async verify(grant?: VerifyParams, options?: RequestOptions): Promise<NulvlessResult<Verified>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n return this.http.get<Verified>('/session/validate', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: {\n ...(grant?.resource ? { resource: grant.resource } : {}),\n ...(grant?.scopes ? { scopes: grant.scopes.join(' ') } : {}),\n ...(grant?.roles ? { roles: grant.roles.join(' ') } : {}),\n ...(grant?.reject_assurance_level_error !== undefined\n ? { reject_assurance_level_error: String(grant.reject_assurance_level_error) }\n : {}),\n },\n })\n }\n\n /**\n * Returns the current session details.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n */\n async getSession(options?: RequestOptions): Promise<NulvlessResult<Session>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n return this.http.get<Session>('/session', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Signs out the user and clears the stored session.\n *\n * - `'local'` (default) — invalidates only the current session.\n * - `'global'` — invalidates all sessions across all devices.\n * - `'others'` — invalidates all sessions except the current one.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n */\n async signOut(scope?: SignOutScope, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n const result = await this.http.post<null>('/signout', undefined, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n ...(scope ? { query: { scope } } : {}),\n })\n\n if (!result.error) {\n await this.session?.clear()\n }\n\n return result\n }\n}\n\n/**\n * Auth client for browser use (`createClient` / public key).\n * Extends `AuthClient` with session management and multi-account helpers.\n */\nexport class AuthBrowserClient extends AuthClient {\n private readonly accountsManager: AccountsManager\n private readonly emitter: AuthEventEmitter\n private readonly multiUser: boolean\n private readonly tabs: TabChannel<Authenticated | null>\n\n constructor(\n http: HttpClient,\n session: SessionManager,\n storage: NulvlessStorage,\n accountsKey: string,\n multiUser = false,\n autoRefresh = true,\n ) {\n super(http, session)\n this.multiUser = multiUser\n this.accountsManager = new AccountsManager(storage, accountsKey)\n this.emitter = new AuthEventEmitter()\n\n this.tabs = new TabChannel<Authenticated | null>(`nulvless.auth.${accountsKey}`, message => {\n this.emitter.emit(\n message.event as 'token-refreshed',\n message.payload as Authenticated,\n )\n })\n\n session.setOnTokenRefreshed((auth) => {\n if (this.multiUser) {\n void this.accountsManager.save(auth)\n }\n\n this.emitter.emit('token-refreshed', auth)\n this.tabs.post({ event: 'token-refreshed', payload: auth })\n })\n\n session.setOnUnauthorized((failed) => {\n this.emitter.emit('unauthorized', failed ? toAuthenticated(failed) : {})\n })\n\n http.setOnSudoRequired(() => {\n this.emitter.emit('sudo-required')\n })\n\n if (autoRefresh) {\n session.startAutoRefresh()\n }\n }\n\n /**\n * Renews the access token now, sharing the attempt with any refresh already\n * in flight. Returns the new token, or `null` when the session could not be\n * recovered.\n */\n async refreshSession(): Promise<string | null> {\n return this.session?.forceRefresh() ?? null\n }\n\n /** Releases the refresh timer and the cross-tab channel. */\n dispose(): void {\n this.session?.stopAutoRefresh()\n this.tabs.close()\n }\n\n /**\n * Subscribes to an auth event.\n *\n * Returns an unsubscribe function — call it to stop listening.\n *\n * @example\n * const off = nulvless.auth.on('signed-in', (session) => {\n * console.log('signed in as', session.user?.id)\n * })\n * off() // unsubscribe\n */\n on<K extends keyof AuthEvents>(\n event: K,\n handler: AuthEvents[K] extends void ? () => void : (payload: AuthEvents[K]) => void,\n ): () => void {\n return this.emitter.on(event, handler)\n }\n\n protected override async persistSession(result: NulvlessResult<Authenticated>): Promise<NulvlessResult<Authenticated>> {\n const out = await super.persistSession(result)\n\n if (!out.error) {\n if (out.data.access_token) {\n if (this.multiUser) {\n await this.accountsManager.save(out.data)\n }\n this.emitter.emit('signed-in', out.data)\n } else if (out.data.challenge) {\n this.emitter.emit('challenge', out.data)\n }\n }\n\n return out\n }\n\n /**\n * Returns the session currently stored in storage, or `null` if there is none.\n *\n * `expires_in` is the number of seconds remaining until expiry (may be negative\n * if the token is already expired).\n *\n * @example\n * const session = await nulvless.auth.get()\n * if (session) {\n * console.log(session.access_token, session.expires_in)\n * }\n */\n async get(): Promise<Authenticated | null> {\n const stored = await this.session?.get()\n return stored ? toAuthenticated(stored) : null\n }\n\n /**\n * Manually persists a session as the active session.\n *\n * Use this when you obtain an `Authenticated` outside the normal SDK flow\n * (e.g. server-side login, custom OAuth callback) and want the SDK to treat\n * it as the active session.\n *\n * @example\n * await nulvless.auth.set({ access_token: 'eyJ...', refresh_token: 'rt_...', expires_in: 3600 })\n */\n async set(data: Authenticated): Promise<void> {\n if (data.access_token) {\n await this.session?.save(data)\n }\n }\n\n /**\n * Adds an account to the accounts store without switching the active session.\n *\n * The account is identified by the `user.id` in the response, or by the `sub`\n * claim in the access token JWT.\n *\n * Call this after a sign-in to register additional accounts. Accounts are\n * also saved automatically whenever a sign-in / sign-up succeeds.\n *\n * @example\n * const { data } = await nulvless.auth.signIn(params)\n * // already saved automatically — or add manually:\n * await nulvless.auth.add(data)\n */\n async add(auth: Authenticated): Promise<void> {\n if (!this.multiUser || !auth.access_token) return\n await this.accountsManager.save(auth)\n }\n\n /**\n * Switches the active session to a previously saved account.\n *\n * Returns `true` on success, `false` if the account is not found.\n *\n * @example\n * const ok = await nulvless.auth.switch('user-id-123')\n */\n async switch(userId: string): Promise<boolean> {\n if (!this.multiUser) return false\n\n const stored = await this.accountsManager.getSession(userId)\n\n if (!stored) return false\n\n await this.session?.save(toAuthenticated(stored))\n\n this.emitter.emit('account-switched', { userId })\n return true\n }\n\n /**\n * Returns all accounts currently saved in the accounts store.\n *\n * @example\n * const accounts = await nulvless.auth.list()\n * // [{ userId: '...', access_token: '...', expires_in: 3540 }]\n */\n list(): Promise<AccountEntry[]> {\n if (!this.multiUser) return Promise.resolve([])\n return this.accountsManager.list()\n }\n\n /**\n * Removes a saved account from the accounts store.\n *\n * Does not affect the active session.\n *\n * @example\n * await nulvless.auth.remove('user-id-123')\n */\n remove(userId: string): Promise<void> {\n if (!this.multiUser) return Promise.resolve()\n return this.accountsManager.remove(userId)\n }\n\n /**\n * Drops the active session without ending it on the server.\n *\n * The account stays in the accounts store, so `switch` brings it back. Use\n * this when the user leaves the authenticated area to pick or add another\n * account: with no active session the automatic refresh goes quiet instead\n * of keeping a session warm that nothing is using.\n *\n * @example\n * await nulvless.auth.deselect()\n * // later\n * await nulvless.auth.switch('user-id-123')\n */\n async deselect(): Promise<void> {\n const stored = await this.session?.get()\n\n if (!stored) return\n\n if (this.multiUser) {\n await this.accountsManager.save(toAuthenticated(stored))\n }\n\n await this.session?.clear()\n }\n\n override async signOut(scope?: SignOutScope, options?: RequestOptions): Promise<NulvlessResult<null>> {\n // Capture userId before the session is cleared\n const stored = await this.session?.get()\n const userId = stored\n ? (stored.user?.id ?? extractUserId({ access_token: stored.access_token }))\n : null\n\n const result = await super.signOut(scope, options)\n\n if (!result.error) {\n if (this.multiUser && userId) {\n await this.accountsManager.remove(userId)\n }\n this.emitter.emit('signed-out', { ...(userId ? { userId } : {}) })\n }\n\n return result\n }\n}\n\n/**\n * Auth methods exclusive to private (`sk_`) keys.\n * Extends `AuthClient` — all public methods and sub-namespaces are available here too.\n *\n * Additional sub-namespaces:\n * - `auth.grants` — grant management (invite, revoke, accept, etc.)\n * - `auth.admin` — platform administration (users, roles, grants)\n *\n * Never use in browser code.\n */\nexport class AuthServerClient extends AuthClient {\n /** User-facing grant management — invite, accept, revoke, etc. */\n readonly grants: GrantsClient\n /** Platform administration — manage users, roles, and grants server-side. */\n readonly admin: AdminClient\n\n constructor(http: HttpClient) {\n super(http)\n this.grants = new GrantsClient(http, this._getToken)\n this.admin = new AdminClient(http)\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n CreateTemplateParams,\n NotificationChannel,\n PaginatedTemplates,\n Template,\n TemplateFilters,\n TemplateLanguage,\n UpdateTemplateParams,\n} from '../types'\n\nfunction templatePath(channel: NotificationChannel, slug: string, language?: TemplateLanguage): string {\n return language ? route`/templates/${channel}/${slug}/${language}` : route`/templates/${channel}/${slug}`\n}\n\n/**\n * Template management for the notifications service.\n *\n * Available on `createServerClient` only (requires private key).\n *\n * @example\n * const { data } = await nulvless.comms.templates.create({\n * slug: 'welcome',\n * channel: 'email',\n * language: 'en-US',\n * subject: 'Welcome!',\n * content: '<h1>Hello {{name}}</h1>',\n * })\n */\nexport class TemplatesClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Creates a new notification template.\n *\n * - `email` channel: `subject` required, `url` not allowed.\n * - `sms` channel: `subject` and `url` not allowed.\n * - `webhook` channel: `url` required, `subject` not allowed.\n */\n create(params: CreateTemplateParams, options?: RequestOptions): Promise<NulvlessResult<Template>> {\n return this.http.post<Template>('/templates', params, options)\n }\n\n /**\n * Updates an existing template.\n *\n * `language` defaults to `'en-US'` when omitted.\n *\n * @example\n * await nulvless.comms.templates.update('email', 'welcome', { subject: 'Welcome aboard!' })\n */\n update(\n channel: NotificationChannel,\n slug: string,\n params: UpdateTemplateParams,\n language?: TemplateLanguage,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Template>> {\n return this.http.patch<Template>(templatePath(channel, slug, language), params, options)\n }\n\n /**\n * Deletes a template.\n *\n * `language` defaults to `'en-US'` when omitted.\n */\n delete(\n channel: NotificationChannel,\n slug: string,\n language?: TemplateLanguage,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Template>> {\n return this.http.delete<Template>(templatePath(channel, slug, language), options)\n }\n\n /**\n * Returns a template by channel and slug, falling back to the common template\n * if no custom one exists.\n *\n * `language` defaults to `'en-US'` when omitted.\n *\n * The response includes `common: true` when the returned template is the\n * platform-level fallback rather than a custom override.\n */\n get(\n channel: NotificationChannel,\n slug: string,\n language?: TemplateLanguage,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Template>> {\n return this.http.get<Template>(templatePath(channel, slug, language), options)\n }\n\n /**\n * Returns a paginated list of templates, optionally filtered by channel and language.\n *\n * @example\n * const { data } = await nulvless.comms.templates.list({ channel: 'email', page_size: 20 })\n */\n list(filters?: TemplateFilters, options?: RequestOptions): Promise<NulvlessResult<PaginatedTemplates>> {\n return this.http.get<PaginatedTemplates>('/templates', {\n ...options,\n query: {\n ...(filters?.page !== undefined ? { page: filters.page } : {}),\n ...(filters?.page_size !== undefined ? { page_size: filters.page_size } : {}),\n ...(filters?.sort ? { sort: filters.sort } : {}),\n ...(filters?.channel ? { channel: filters.channel } : {}),\n ...(filters?.language ? { language: filters.language } : {}),\n },\n })\n }\n}\n","import type { HttpClient } from '../http'\nimport { route } from '../http'\nimport type { NulvlessResult, RequestOptions } from '../types'\nimport type { SendEmailParams, SendSMSParams } from './types'\nimport { TemplatesClient } from './templates'\n\nexport class EmailClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a transactional email using a pre-configured template.\n *\n * Returns `null` on success — the API responds with `200` and no body.\n *\n * @example\n * const { error } = await nulvless.comms.email.send({\n * to: 'user@example.com',\n * template: 'welcome',\n * params: { name: 'Gleisson' },\n * })\n */\n send(params: SendEmailParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const { to, template, language, params: templateParams } = params\n\n const path = language\n ? route`/notifications/email/${template}/${language}`\n : route`/notifications/email/${template}`\n\n return this.http.post<null>(path, { email: to, params: templateParams }, options)\n }\n\n /**\n * Sends a test email to validate the platform's email provider configuration.\n *\n * Returns `null` on success.\n *\n * @example\n * const { error } = await nulvless.comms.email.test('user@example.com')\n */\n test(email: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/notifications/test/email', { email }, options)\n }\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a transactional SMS using a pre-configured template.\n *\n * Returns `null` on success — the API responds with `200` and no body.\n *\n * @example\n * const { error } = await nulvless.comms.sms.send({\n * phone: { country_code: '+55', number: '11999999999' },\n * template: 'verification-code',\n * params: { code: '123456' },\n * })\n */\n send(params: SendSMSParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const { phone, template, language, params: templateParams } = params\n\n const path = language\n ? route`/notifications/sms/${template}/${language}`\n : route`/notifications/sms/${template}`\n\n return this.http.post<null>(path, { phone, params: templateParams }, options)\n }\n\n /**\n * Sends a test SMS to validate the platform's SMS provider configuration.\n *\n * Returns `null` on success.\n *\n * @example\n * const { error } = await nulvless.comms.sms.test('user@example.com')\n */\n test(email: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/notifications/test/sms', { email }, options)\n }\n}\n\nexport class CommsClient {\n readonly email: EmailClient\n readonly sms: SmsClient\n readonly templates: TemplatesClient\n\n constructor(http: HttpClient) {\n this.email = new EmailClient(http)\n this.sms = new SmsClient(http)\n this.templates = new TemplatesClient(http)\n }\n}\n","export type LockOutcome<T> = { ran: true; value: T } | { ran: false }\n\ninterface LockOptions {\n skipWhenBusy?: boolean\n}\n\ninterface WebLockManager {\n request(\n name: string,\n options: { mode: 'exclusive'; ifAvailable?: boolean },\n task: (lock: unknown | null) => Promise<unknown>,\n ): Promise<unknown>\n}\n\nconst pendingByName = new Map<string, Promise<unknown>>()\n\nfunction webLocks(): WebLockManager | null {\n const manager = (globalThis as { navigator?: { locks?: WebLockManager } }).navigator?.locks\n\n return typeof manager?.request === 'function' ? manager : null\n}\n\nexport async function runExclusive<T>(\n name: string,\n task: () => Promise<T>,\n options: LockOptions = {},\n): Promise<LockOutcome<T>> {\n const manager = webLocks()\n\n if (manager) {\n return (await manager.request(\n name,\n { mode: 'exclusive', ...(options.skipWhenBusy ? { ifAvailable: true } : {}) },\n async lock => (lock === null ? { ran: false } : { ran: true, value: await task() }),\n )) as LockOutcome<T>\n }\n\n const previous = pendingByName.get(name)\n\n if (previous && options.skipWhenBusy) {\n return { ran: false }\n }\n\n const run = (previous ?? Promise.resolve()).catch(() => undefined).then(task)\n const slot = run.catch(() => undefined)\n\n pendingByName.set(name, slot)\n\n try {\n return { ran: true, value: await run }\n } finally {\n if (pendingByName.get(name) === slot) {\n pendingByName.delete(name)\n }\n }\n}\n","import type { NulvlessError } from '../types'\n\nconst REFUSAL_CODES = new Set([\n 'unauthorized',\n 'refresh_token_not_found',\n 'refresh_token_already_used',\n 'refresh_token_not_issued_here',\n 'user_banned',\n])\n\nexport function isTemporaryFailure(error: NulvlessError): boolean {\n return (\n error.status_code === 0 ||\n error.status_code === 408 ||\n error.status_code === 429 ||\n error.status_code >= 500\n )\n}\n\nexport function isSessionRefused(error: NulvlessError): boolean {\n return REFUSAL_CODES.has(error.code) || error.status_code === 401\n}\n","import type { NulvlessStorage } from '../storage/types'\nimport type { NulvlessResult } from '../types'\nimport type { Authenticated } from '../auth/types'\nimport type { StoredSession } from './types'\nimport { runExclusive } from './locks'\nimport { isSessionRefused, isTemporaryFailure } from './refreshFailure'\nimport { toStoredSession } from './stored'\n\nconst REFRESH_MARGIN_IN_MS = 90_000\nconst TICK_INTERVAL_IN_MS = 30_000\n\nconst RETRY_BACKOFF_BASE_IN_MS = 200\nconst MAX_RETRIES_ON_TEMPORARY_FAILURE = 3\n\ntype RefreshFn = (refresh_token: string) => Promise<NulvlessResult<Authenticated>>\ntype TokenRefreshedCb = (auth: Authenticated) => void\n/** Receives the session that could not be recovered (null when none was stored). */\ntype UnauthorizedCb = (session: StoredSession | null) => void\n\nexport interface RefreshRequest {\n deauthOnFailure?: boolean\n expiredToken?: string\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction documentIsHidden(): boolean {\n return (globalThis as { document?: { hidden?: boolean } }).document?.hidden === true\n}\n\nfunction isBrowser(): boolean {\n const scope = globalThis as { window?: unknown; document?: unknown }\n\n return typeof scope.window !== 'undefined' && typeof scope.document !== 'undefined'\n}\n\nexport class SessionManager {\n private refreshFn?: RefreshFn\n private onTokenRefreshed?: TokenRefreshedCb\n private onUnauthorized?: UnauthorizedCb\n private readonly sessionKey: string\n private readonly lockName: string\n\n private inFlight: Promise<string | null> | null = null\n private ticker: ReturnType<typeof setInterval> | undefined\n private onVisibilityChange: (() => void) | undefined\n\n constructor(\n private readonly storage: NulvlessStorage,\n sessionKey: string,\n ) {\n this.sessionKey = sessionKey\n this.lockName = `nulvless.session.${sessionKey}`\n }\n\n /**\n * Injected by `AuthClient` after construction to avoid circular dependency.\n * Called automatically when the access token is about to expire.\n */\n setRefreshFn(fn: RefreshFn): void {\n this.refreshFn = fn\n }\n\n /** Called after a successful automatic token refresh. */\n setOnTokenRefreshed(cb: TokenRefreshedCb): void {\n this.onTokenRefreshed = cb\n }\n\n /**\n * Called when the SDK cannot recover the session:\n * - no refresh token present, or\n * - the refresh request was refused by the server.\n */\n setOnUnauthorized(cb: UnauthorizedCb): void {\n this.onUnauthorized = cb\n }\n\n async save(auth: Authenticated): Promise<void> {\n if (!auth.access_token) return\n\n const session = toStoredSession({ ...auth, access_token: auth.access_token })\n\n await this.storage.setItem(this.sessionKey, JSON.stringify(session))\n }\n\n async get(): Promise<StoredSession | null> {\n const raw = await this.storage.getItem(this.sessionKey)\n\n if (!raw) return null\n\n try {\n return JSON.parse(raw) as StoredSession\n } catch {\n return null\n }\n }\n\n async clear(): Promise<void> {\n await this.storage.removeItem(this.sessionKey)\n }\n\n private expiresSoon(session: StoredSession): boolean {\n return session.expires_at - Date.now() < REFRESH_MARGIN_IN_MS\n }\n\n private refresh(request: RefreshRequest): Promise<string | null> {\n if (this.inFlight) {\n return this.inFlight\n }\n\n this.inFlight = this.runExclusiveRefresh(request).finally(() => {\n this.inFlight = null\n })\n\n return this.inFlight\n }\n\n private async runExclusiveRefresh(request: RefreshRequest): Promise<string | null> {\n const outcome = await runExclusive(this.lockName, () => this.refreshHoldingLock(request))\n\n return outcome.ran ? outcome.value : null\n }\n\n private async refreshHoldingLock(request: RefreshRequest): Promise<string | null> {\n const session = await this.get()\n\n if (!session) {\n if (request.deauthOnFailure) this.onUnauthorized?.(null)\n return null\n }\n\n const alreadyRenewed = request.expiredToken\n ? session.access_token !== request.expiredToken\n : !this.expiresSoon(session)\n\n if (alreadyRenewed) {\n return session.access_token\n }\n\n if (!session.refresh_token || !this.refreshFn) {\n if (request.deauthOnFailure) this.onUnauthorized?.(session)\n return null\n }\n\n return this.callRefreshFn(session, request)\n }\n\n private async callRefreshFn(\n session: StoredSession,\n request: RefreshRequest,\n ): Promise<string | null> {\n for (let attempt = 0; attempt <= MAX_RETRIES_ON_TEMPORARY_FAILURE; attempt += 1) {\n if (attempt > 0) {\n await sleep(RETRY_BACKOFF_BASE_IN_MS * 2 ** (attempt - 1))\n }\n\n const result = await this.refreshFn!(session.refresh_token!)\n\n if (result.data?.access_token) {\n await this.save(result.data)\n this.onTokenRefreshed?.(result.data)\n\n return result.data.access_token\n }\n\n const error = result.error\n\n if (error && isTemporaryFailure(error)) {\n continue\n }\n\n if (request.deauthOnFailure && (!error || isSessionRefused(error))) {\n await this.clear()\n this.onUnauthorized?.(session)\n }\n\n return null\n }\n\n return null\n }\n\n /**\n * Forces a token refresh regardless of expiry.\n * Used for reactive refresh after a 401/403 response.\n *\n * Returns the new access token, or `null` if refresh fails.\n *\n * `deauthOnFailure` (default `true`) controls side effects when the refresh\n * itself is refused: clearing the stored session and invoking `onUnauthorized`.\n * Pass `false` for soft refreshes (e.g. 403/forbidden_resource_access) where\n * the session must remain intact so the caller can surface the API error.\n */\n async forceRefresh(\n options: { deauthOnFailure?: boolean; expiredToken?: string } = {},\n ): Promise<string | null> {\n const expiredToken = options.expiredToken ?? (await this.get())?.access_token\n\n return this.refresh({\n deauthOnFailure: options.deauthOnFailure ?? true,\n ...(expiredToken !== undefined ? { expiredToken } : {}),\n })\n }\n\n /**\n * Returns a valid access token, refreshing it automatically if it is\n * expired or about to expire (within the refresh margin).\n *\n * Returns `null` when there is no session or the refresh fails.\n */\n async getValidToken(): Promise<string | null> {\n const session = await this.get()\n\n if (!session) return null\n\n if (!this.expiresSoon(session)) return session.access_token\n\n return this.refresh({ deauthOnFailure: true })\n }\n\n startAutoRefresh(): void {\n if (this.ticker || !isBrowser()) return\n\n this.ticker = setInterval(() => void this.tick(), TICK_INTERVAL_IN_MS)\n\n ;(this.ticker as unknown as { unref?: () => void }).unref?.()\n\n this.onVisibilityChange = () => {\n if (!documentIsHidden()) void this.tick()\n }\n\n ;(globalThis as unknown as Window).document.addEventListener(\n 'visibilitychange',\n this.onVisibilityChange,\n )\n }\n\n stopAutoRefresh(): void {\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = undefined\n }\n\n if (this.onVisibilityChange && isBrowser()) {\n ;(globalThis as unknown as Window).document.removeEventListener(\n 'visibilitychange',\n this.onVisibilityChange,\n )\n }\n\n this.onVisibilityChange = undefined\n }\n\n private async tick(): Promise<void> {\n if (documentIsHidden() || this.inFlight) return\n\n try {\n const session = await this.get()\n\n if (!session?.refresh_token || !this.expiresSoon(session)) return\n\n await runExclusive(this.lockName, () => this.refreshHoldingLock({ deauthOnFailure: true }), {\n skipWhenBusy: true,\n })\n } catch (error) {\n console.error('[nulvless] scheduled token renewal failed', error)\n }\n }\n}\n","import type { NulvlessStorage } from '../types'\n\n/** Persists in `localStorage`. Data survives page reloads and browser restarts. */\nexport class LocalStorageAdapter implements NulvlessStorage {\n async getItem(key: string): Promise<string | null> {\n return localStorage.getItem(key)\n }\n\n async setItem(key: string, value: string): Promise<void> {\n localStorage.setItem(key, value)\n }\n\n async removeItem(key: string): Promise<void> {\n localStorage.removeItem(key)\n }\n}\n","import type { NulvlessStorage } from '../types'\n\n/** Persists in `sessionStorage`. Data is cleared when the tab or browser is closed. */\nexport class SessionStorageAdapter implements NulvlessStorage {\n async getItem(key: string): Promise<string | null> {\n return sessionStorage.getItem(key)\n }\n\n async setItem(key: string, value: string): Promise<void> {\n sessionStorage.setItem(key, value)\n }\n\n async removeItem(key: string): Promise<void> {\n sessionStorage.removeItem(key)\n }\n}\n","import type { NulvlessStorage } from '../types'\n\n/**\n * Persists in memory (plain `Map`). Data is lost on page reload.\n *\n * Useful for SSR environments, tests, or situations where persistent\n * storage is not available or desired.\n */\nexport class MemoryStorageAdapter implements NulvlessStorage {\n private readonly store = new Map<string, string>()\n\n async getItem(key: string): Promise<string | null> {\n return this.store.get(key) ?? null\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.store.set(key, value)\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key)\n }\n}\n","import type { NulvlessStorage } from '../types'\n\nconst CACHE_NAME = 'nulvless'\n\n/**\n * Persists using the browser's Cache Storage API.\n *\n * Available in modern browsers and service workers. Data survives page\n * reloads but can be cleared by the browser under storage pressure.\n *\n * Keys are mapped to fake URLs (`https://nulvless.storage/<key>`) since\n * the Cache API uses URLs as identifiers.\n */\nexport class CacheStorageAdapter implements NulvlessStorage {\n private key(k: string): string {\n return `https://nulvless.storage/${encodeURIComponent(k)}`\n }\n\n async getItem(key: string): Promise<string | null> {\n const cache = await caches.open(CACHE_NAME)\n const response = await cache.match(this.key(key))\n return response ? response.text() : null\n }\n\n async setItem(key: string, value: string): Promise<void> {\n const cache = await caches.open(CACHE_NAME)\n await cache.put(this.key(key), new Response(value))\n }\n\n async removeItem(key: string): Promise<void> {\n const cache = await caches.open(CACHE_NAME)\n await cache.delete(this.key(key))\n }\n}\n","export type { NulvlessStorage } from './types'\nexport { LocalStorageAdapter } from './adapters/local'\nexport { SessionStorageAdapter } from './adapters/session'\nexport { MemoryStorageAdapter } from './adapters/memory'\nexport { CacheStorageAdapter } from './adapters/cache'\n\nimport { LocalStorageAdapter } from './adapters/local'\nimport { SessionStorageAdapter } from './adapters/session'\nimport { MemoryStorageAdapter } from './adapters/memory'\nimport { CacheStorageAdapter } from './adapters/cache'\n\n/**\n * Built-in storage adapters for session persistence.\n *\n * @example\n * import { Storage } from '@nulvless/nulvless-js'\n *\n * const nulvless = createClient(url, key, {\n * storage: Storage.Local, // localStorage — survives reloads\n * storage: Storage.Session, // sessionStorage — cleared on tab close\n * storage: Storage.Memory, // in-memory — useful for SSR / tests\n * storage: Storage.Cache, // Cache Storage API — browser / service workers\n * })\n */\nexport const Storage = {\n /** `localStorage` — data survives page reloads and browser restarts. */\n Local: new LocalStorageAdapter(),\n /** `sessionStorage` — data is cleared when the tab or browser is closed. */\n Session: new SessionStorageAdapter(),\n /** In-memory `Map` — data is lost on page reload. Good for SSR and tests. */\n Memory: new MemoryStorageAdapter(),\n /** Cache Storage API — survives reloads, available in service workers. */\n Cache: new CacheStorageAdapter(),\n} as const\n","import { HttpClient } from './http'\nimport type { ClientOptions, ServerClientOptions } from './types'\nimport { AuthBrowserClient, AuthServerClient } from './auth'\nimport { CommsClient } from './comms'\nimport { SessionManager } from './session/manager'\nimport { MemoryStorageAdapter, Storage } from './storage'\nimport type { NulvlessStorage } from './storage/types'\n\nfunction defaultStorage(): NulvlessStorage {\n return typeof window !== 'undefined' ? Storage.Local : new MemoryStorageAdapter()\n}\n\n/**\n * Browser client — use with a public key (`pk_...`).\n *\n * Only exposes endpoints that accept public keys.\n * Safe to instantiate in frontend code.\n */\nexport class NulvlessClient {\n readonly auth: AuthBrowserClient\n\n constructor(baseUrl: string, publicKey: string, options?: ClientOptions) {\n const base = baseUrl.replace(/\\/+$/, '')\n const subdomain = new URL(base).hostname.split('.')[0] ?? 'app'\n const tokenKey = options?.storageKeys?.token ?? `nlv-${subdomain}-token`\n const accountsKey = options?.storageKeys?.accounts ?? `${tokenKey}-accounts`\n const storage = options?.storage ?? defaultStorage()\n const session = new SessionManager(storage, tokenKey)\n this.auth = new AuthBrowserClient(\n new HttpClient({\n baseUrl: `${base}/auth`,\n apiKey: publicKey,\n ...options,\n onTokenExpired: ({ deauthOnFailure, expiredToken }) =>\n session.forceRefresh({\n deauthOnFailure,\n ...(expiredToken ? { expiredToken } : {}),\n }),\n }),\n session,\n storage,\n accountsKey,\n options?.multiUser ?? false,\n options?.autoRefresh ?? true,\n )\n }\n}\n\n/**\n * Server client — use with a private key (`sk_...`).\n *\n * Has access to everything in `NulvlessClient` plus private-only endpoints.\n * Never instantiate in browser code — the private key must stay secret.\n */\nexport class NulvlessServerClient {\n readonly auth: AuthServerClient\n readonly comms: CommsClient\n\n constructor(baseUrl: string, privateKey: string, options?: ServerClientOptions) {\n const base = baseUrl.replace(/\\/+$/, '')\n this.auth = new AuthServerClient(new HttpClient({ baseUrl: `${base}/auth`, apiKey: privateKey, ...options }))\n this.comms = new CommsClient(new HttpClient({ baseUrl: `${base}/comms`, apiKey: privateKey, ...options }))\n }\n}\n","/**\n * Headers extracted from the user's browser request and forwarded to the\n * auth service so it can build an accurate session fingerprint (device,\n * browser, OS, IP-based location, etc.).\n */\nconst TRACKING_HEADERS = [\n 'authorization',\n 'user-agent',\n 'host',\n 'origin',\n 'referer',\n 'accept',\n 'accept-language',\n 'sec-fetch-dest',\n 'x-forwarded-for',\n 'x-forwarded-host',\n 'x-forwarded-proto',\n 'cloudfront-forwarded-proto',\n] as const\n\ntype NodeHeaders = Record<string, string | string[] | undefined>\n\n/**\n * Extracts user browser headers from an incoming server request and returns\n * them as a plain `Record<string, string>` ready to pass via `options.headers`.\n *\n * Accepts:\n * - **Web `Request`** — Next.js App Router, Cloudflare Workers, Deno\n * - **Node.js `IncomingMessage`** — Express, Next.js Pages Router, Fastify raw\n *\n * @example\n * // Next.js App Router\n * export async function POST(request: Request) {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(request),\n * })\n * }\n *\n * @example\n * // Express / Next.js Pages Router\n * app.post('/login', async (req, res) => {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(req),\n * })\n * })\n */\nexport function forwardUserHeaders(\n req: Request | { headers: NodeHeaders },\n): Record<string, string> {\n const result: Record<string, string> = {}\n\n // Web Request API (Next.js App Router, Workers, Deno)\n if (typeof Request !== 'undefined' && req instanceof Request) {\n for (const key of TRACKING_HEADERS) {\n const val = req.headers.get(key)\n if (val) result[key] = val\n }\n return result\n }\n\n // Node.js IncomingMessage (Express, Next.js Pages Router)\n const nodeHeaders = (req as { headers: NodeHeaders }).headers\n for (const key of TRACKING_HEADERS) {\n const val = nodeHeaders[key]\n if (val) result[key] = Array.isArray(val) ? val[0]! : val\n }\n\n return result\n}\n","/**\n * Headers that keep a response carrying auth state out of every cache.\n *\n * `no-store` alone covers HTTP/1.1; `Pragma` and `Expires` cover HTTP/1.0 caches\n * and proxies that predate it. RFC 6749 §5.1 and OpenID Connect Core §3.1.3.3\n * both require the first two on any response carrying a token.\n */\nexport const AUTH_CACHE_HEADERS = {\n 'Cache-Control': 'private, no-cache, no-store, must-revalidate, max-age=0',\n Expires: '0',\n Pragma: 'no-cache',\n} as const\n\ninterface WebResponseLike {\n headers: { set(name: string, value: string): void }\n}\n\ninterface NodeResponseLike {\n setHeader(name: string, value: string): unknown\n}\n\nfunction isNodeResponse(response: unknown): response is NodeResponseLike {\n return typeof (response as NodeResponseLike).setHeader === 'function'\n}\n\nfunction isWebResponse(response: unknown): response is WebResponseLike {\n const headers = (response as WebResponseLike).headers\n\n return typeof headers?.set === 'function'\n}\n\n/**\n * Marks a response as carrying auth state so no cache stores it, and returns it\n * so the call can be inlined into a `return`.\n *\n * Apply this to **your own** response whenever it sets, rotates or clears a\n * session — sign-in, refresh, sign-out. A CDN that caches such a response serves\n * one visitor's session cookie to the next, signing them in as someone else; it\n * is a failure that has happened in production on CloudFront, Vercel Edge and\n * Cloudflare. The usual protection does not apply here: shared caches are barred\n * from reusing responses to requests carrying `Authorization`, but yours is\n * authenticated by cookie, which carries no such rule.\n *\n * Accepts a Web `Response` (Next.js App Router, Workers, Deno) or a Node\n * `ServerResponse` (Express, Next.js Pages Router). Use {@link AUTH_CACHE_HEADERS}\n * directly where a framework takes a plain header map instead.\n *\n * @example\n * // Next.js App Router\n * export async function POST(request: Request) {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(request),\n * })\n *\n * const response = NextResponse.json({ ok: true })\n * response.cookies.set('session', data.access_token)\n *\n * return applyAuthCacheHeaders(response)\n * }\n *\n * @example\n * // Express\n * app.post('/login', async (req, res) => {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(req),\n * })\n *\n * applyAuthCacheHeaders(res)\n * res.cookie('session', data.access_token, { httpOnly: true, sameSite: 'lax' })\n * res.json({ ok: true })\n * })\n */\nexport function applyAuthCacheHeaders<T>(response: T): T {\n const entries = Object.entries(AUTH_CACHE_HEADERS)\n\n if (isWebResponse(response)) {\n for (const [name, value] of entries) response.headers.set(name, value)\n } else if (isNodeResponse(response)) {\n for (const [name, value] of entries) response.setHeader(name, value)\n }\n\n return response\n}\n","export { NulvlessClient, NulvlessServerClient } from './client'\nexport { AuthClient, AuthBrowserClient, AuthServerClient } from './auth'\nexport type { AccountEntry } from './auth/accounts'\nexport { AuthEventEmitter } from './auth/emitter'\nexport type { AuthEvents } from './auth/emitter'\nexport { FactorsClient } from './auth/factors'\nexport { UsersClient } from './auth/users'\nexport { SessionsClient } from './auth/sessions'\nexport { SecurityClient } from './auth/security'\nexport { GrantsClient } from './auth/grants'\nexport { OAuthClient, OAuthGrantsClient } from './auth/oauth'\nexport { AdminClient } from './auth/admin'\nexport { CommsClient, EmailClient, SmsClient } from './comms'\nexport { TemplatesClient } from './comms/templates'\nexport { HttpClient } from './http'\nexport { NulvlessException } from './exceptions/nulvless.exception'\nexport { Storage } from './storage'\nexport { forwardUserHeaders } from './helpers/forward-user-headers'\nexport { applyAuthCacheHeaders, AUTH_CACHE_HEADERS } from './helpers/auth-cache-headers'\nexport { SessionManager } from './session/manager'\nexport type { NulvlessStorage } from './storage/types'\nexport type { StoredSession } from './session/types'\nexport type * from './types'\nexport type * from './error-codes'\nexport type * from './auth/types'\nexport type * from './comms/types'\n\nimport type { ClientOptions, ServerClientOptions } from './types'\nimport { NulvlessClient, NulvlessServerClient } from './client'\n\n/**\n * Creates a browser-safe client using a public key (`pk_...`).\n *\n * Exposes: `.auth`\n *\n * @example\n * import { createClient } from '@nulvless/nulvless-js'\n *\n * const nulvless = createClient('https://auth.example.com', 'pk_live_...')\n *\n * const { data, error } = await nulvless.auth.signIn({\n * email: 'user@example.com',\n * password: 'secret',\n * })\n */\nexport function createClient(\n url: string,\n publicKey: string,\n options?: ClientOptions,\n): NulvlessClient {\n return new NulvlessClient(url, publicKey, options)\n}\n\n/**\n * Creates a server-side client using a private key (`sk_...`).\n * Never use this in browser code.\n *\n * Exposes: `.auth`, `.comms`\n *\n * @example\n * import { createServerClient } from '@nulvless/nulvless-js'\n *\n * const nulvless = createServerClient('https://api.example.com', 'sk_live_...')\n *\n * const { error } = await nulvless.comms.email.send({\n * to: 'user@example.com',\n * template: 'welcome',\n * params: { name: 'Gleisson' },\n * })\n */\nexport function createServerClient(\n url: string,\n privateKey: string,\n options?: ServerClientOptions,\n): NulvlessServerClient {\n return new NulvlessServerClient(url, privateKey, options)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/exceptions/nulvless.exception.ts","../src/http.ts","../src/session/tabChannel.ts","../src/auth/base.ts","../src/auth/factors/index.ts","../src/auth/users/index.ts","../src/auth/sessions/index.ts","../src/auth/security/index.ts","../src/auth/challenges/index.ts","../src/auth/grants/index.ts","../src/auth/oauth/index.ts","../src/auth/admin/index.ts","../src/session/stored.ts","../src/auth/accounts.ts","../src/auth/emitter.ts","../src/auth/index.ts","../src/comms/templates/index.ts","../src/comms/index.ts","../src/session/locks.ts","../src/session/refreshFailure.ts","../src/session/manager.ts","../src/storage/adapters/local.ts","../src/storage/adapters/session.ts","../src/storage/adapters/memory.ts","../src/storage/adapters/cache.ts","../src/storage/index.ts","../src/client.ts","../src/helpers/forward-user-headers.ts","../src/helpers/auth-cache-headers.ts","../src/index.ts"],"names":[],"mappings":";AAmBO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAClC,IAAA;AAAA,EACA,WAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAA4B,IAAA,EAAiB,WAAA,EAAqB;AAC5E,IAAA,KAAA,CAAM,KAAA,CAAM,QAAQ,OAAO,CAAA,GAAI,QAAQ,IAAA,CAAK,IAAI,IAAI,OAAO,CAAA;AAC3D,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AACF;;;ACrBA,IAAM,WAAA,GAAc,qBAAA;AAmBpB,SAAS,qBACP,KAAA,EACoC;AACpC,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,EAAM,GAAI,KAAA;AACjD;AAEA,SAAS,gBAAgB,OAAA,EAA4E;AACnG,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA2C;AAE9D,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA,EAAG;AACxD,MAAA,MAAA,CAAO,IAAI,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,CAAA;AAC3C;AAEA,SAAS,UAAA,CAAW,SAA6C,IAAA,EAAkC;AACjG,EAAA,MAAM,MAAA,GAAS,KAAK,WAAA,EAAY;AAEhC,EAAA,OAAO,OAAO,OAAA,CAAQ,OAAA,IAAW,EAAE,EAAE,IAAA,CAAK,CAAC,CAAC,GAAG,MAAM,GAAA,CAAI,WAAA,EAAY,KAAM,MAAM,IAAI,CAAC,CAAA;AACxF;AAEO,SAAS,KAAA,CAAM,YAAkC,MAAA,EAAwC;AAC9F,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,IAAA,EAAM,MAAM,KAAA,KAAU,IAAA,GAAO,kBAAA,CAAmB,MAAA,CAAO,OAAO,KAAA,GAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;AAC1G;AAEA,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EACnC,YAAY,IAAA,EAAc;AACxB,IAAA,KAAA,CAAM,CAAA,uCAAA,EAA0C,IAAI,CAAA,CAAE,CAAA;AACtD,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AAqBA,SAAS,OAAA,CAAQ,KAAc,OAAA,EAAiC;AAC9D,EAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,IAAA,OAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAS,GAAA,CAAI,OAAA,EAAS,aAAa,GAAA,EAAI;AAAA,EACxE;AACA,EAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,iBAAA;AAAA,MACN,OAAA,EAAS,CAAA,wBAAA,EAA2B,OAAA,IAAW,CAAC,CAAA,EAAA,CAAA;AAAA,MAChD,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,OAAA,EAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AAAA,IAC9C,WAAA,EAAa;AAAA,GACf;AACF;AAEA,SAAS,mBAAA,CACP,MACA,QAAA,EACyC;AACzC,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,QAAA,EAAS;AAAA,EACpD;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA;AAEf,EAAA,MAAM,IAAA,GAAO,OAAO,MAAA,CAAO,MAAM,MAAM,QAAA,GAAW,MAAA,CAAO,MAAM,CAAA,GAAI,eAAA;AAEnE,EAAA,MAAM,OAAA,GACJ,OAAO,MAAA,CAAO,SAAS,MAAM,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAC,CAAA,GACnE,MAAA,CAAO,SAAS,CAAA,GACjB,QAAA;AAEN,EAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AACzB;AAEO,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACT,cAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,EAAA,EAAsB;AACtC,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AAAA,EACxB;AAAA,EAEA,iBAAiB,OAAA,EAA2C;AAC1D,IAAA,OACE,UAAA,CAAW,OAAA,EAAS,eAAe,CAAA,KAAM,MAAA,IACzC,UAAA,CAAW,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAG,eAAe,CAAA,KAAM,MAAA;AAAA,EAE/E;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,OAAA,EAAiE;AAC1F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiE;AAC3G,IAAA,OAAO,IAAA,CAAK,KAAQ,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiE;AAC1G,IAAA,OAAO,IAAA,CAAK,KAAQ,KAAA,EAAO,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,KAAA,CAAS,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAiE;AAC5G,IAAA,OAAO,IAAA,CAAK,KAAQ,OAAA,EAAS,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAM,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,MAAA,CAAU,IAAA,EAAc,OAAA,EAAiE;AAC7F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAQ,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAA,CACN,MAAA,EACA,IAAA,EACA,OAAA,EACS;AACT,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,eAAe,GAAG,OAAO,KAAA;AAClD,IAAA,IAAI,MAAA,KAAW,KAAK,OAAO,IAAA;AAC3B,IAAA,IAAI,MAAA,KAAW,OAAO,CAAC,2BAAA,EAA6B,iCAAiC,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,IAAA;AAC9G,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAc,KAAQ,MAAA,EAAoB,IAAA,EAAc,UAAuB,EAAC,EAAG,UAAU,KAAA,EAAmC;AAC9H,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,QAAQ,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,UAAU,CAAA;AAEtG,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,OAAO,WAAA,IAAe,KAAA;AAEtE,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,MAAA,CAAO,OAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,aAAA,GACJ,OAAA,IAAW,OAAA,GAAU,CAAA,GACjB,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,EAAM,EAAG,OAAO,CAAA,GAC5C,MAAA;AAEN,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAgB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,KAAK,CAAA;AAC7C,MAAA,MAAM,OAAoB,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,WAAW,MAAA,EAAO;AAEvE,MAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,CAAA,EAAW;AAC9B,QAAA,MAAM,WAAA,GAAc,UAAA,CAAW,OAAA,EAAS,cAAc,CAAA;AAEtD,QAAA,IAAI,gBAAgB,mCAAA,EAAqC;AACvD,UAAA,IAAA,CAAK,OAAO,IAAI,eAAA,CAAgB,OAAA,CAAQ,IAA8B,EAAE,QAAA,EAAS;AAAA,QACnF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,QACzC;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACtC,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAE1C,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kBAAA,EAAgB,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,CAAA,GAAA,CAAK,CAAA;AAAA,MAC7F;AAEA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,KAAY,mBAAA,CAAoB,IAAA,EAAM,SAAS,UAAU,CAAA;AACvE,QAAA,MAAM,QAAuB,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,EAAa,SAAS,MAAA,EAAO;AAG3E,QAAA,IACE,CAAC,OAAA,IACD,IAAA,CAAK,MAAA,CAAO,cAAA,IACZ,IAAA,CAAK,sBAAA,CAAuB,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA,EAC1D;AACA,UAAA,MAAM,eAAA,GAAkB,SAAS,MAAA,KAAW,GAAA;AAC5C,UAAA,MAAM,eAAe,UAAA,CAAW,OAAA,EAAS,eAAe,CAAA,EAAG,OAAA,CAAQ,eAAe,EAAE,CAAA;AACpF,UAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe;AAAA,YAChD,eAAA;AAAA,YACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB;AAAC,WACxC,CAAA;AACD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,OAAO,IAAA,CAAK,IAAA;AAAA,cACV,MAAA;AAAA,cACA,IAAA;AAAA,cACA,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI,CAAA,EAAE;AAAA,cAC9F;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,IAAO,IAAA,KAAS,yBAAA,EAA2B;AACjE,UAAA,IAAA,CAAK,cAAA,IAAiB;AAAA,QACxB;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,IAAI,iBAAA,CAAkB,OAAA,EAAS,IAAA,EAAM,SAAS,MAAM,CAAA;AAAA,QAC5D;AAEA,QAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAAA,MAC7B;AAEA,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAW,KAAA,EAAO,IAAA,EAAK;AAAA,IACxC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,mBAAmB,MAAM,GAAA;AAE5C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;AAElC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,IAAI,iBAAA,CAAkB,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA,EAAM,MAAM,WAAW,CAAA;AAAA,MAC1E;AAEA,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAM;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,aAAa,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAA6B;AAC1D,IAAA,IAAI,YAAY,IAAA,CAAK,IAAI,GAAG,MAAM,IAAI,iBAAiB,IAAI,CAAA;AAE3D,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,CAAE,CAAA;AAExE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,IAAI,UAAU,MAAA,EAAW;AACzB,QAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AACpD,QAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,UAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA,GAAO,GAAA,EAAK,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEQ,YAAA,CACN,KAAA,EACA,gBAAA,EACA,KAAA,EACA,UAAA,EACwB;AACxB,IAAA,MAAM,WAAW,gBAAA,IAAmB,IAAK,IAAA,CAAK,MAAA,CAAO,YAAW,IAAK,OAAA;AAErE,IAAA,OAAO,YAAA;AAAA,MACL;AAAA,QACE,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,aAAa,EAAC,GAAI,EAAE,gBAAA,EAAkB,IAAA,CAAK,OAAO,MAAA,EAAO;AAAA,QAC7D,UAAA,EAAY,QAAA;AAAA,QACZ,GAAI,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,MAAA,GAC1B,EAAE,mBAAA,EAAqB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,KACnD,EAAC;AAAA,QACL,GAAI,KAAA,GAAQ,EAAE,gBAAA,EAAkB,KAAA,KAAU;AAAC,OAC7C;AAAA,MACA,oBAAA,CAAqB,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AAAA,MACxC;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,QAAA,EAAsC;AAC5D,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,IAAA,IAAI,CAAC,WAAA,CAAY,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AAE1C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF;;;ACtTO,IAAM,aAAN,MAAoB;AAAA,EACjB,OAAA;AAAA,EAER,WAAA,CAAY,MAAc,SAAA,EAA6C;AACrE,IAAA,MAAM,OAAQ,UAAA,CAAyD,gBAAA;AAEvE,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAA,GAAU,IAAI,IAAA,CAAK,IAAI,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,SAAA,EAAW,CAAA,KAAA,KAAS;AAChD,MAAA,SAAA,CAAU,MAAM,IAAqB,CAAA;AAAA,IACvC,CAAC,CAAA;AAEA,IAAC,IAAA,CAAK,QAA8C,KAAA,IAAQ;AAAA,EAC/D;AAAA,EAEA,KAAK,OAAA,EAA8B;AACjC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAA,EAAS,YAAY,OAAO,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AACF,CAAA;;;AC5CA,IAAM,gBAAA,GAAkC;AAAA,EACtC,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS,oBAAA;AAAA,EACT,WAAA,EAAa;AACf,CAAA;AAEA,eAAsB,aAAA,CACpB,IAAA,EACA,QAAA,EACA,OAAA,EAC2B;AAC3B,EAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,EAAC,EAAE;AAE5E,EAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,EAAS;AAE7B,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,GAAG,gBAAA,EAAiB,EAAE;AAE/D,EAAA,OAAO,EAAE,IAAI,IAAA,EAAM,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAG,EAAE;AACnE;AAEO,IAAe,gBAAf,MAA6B;AAAA,EAClC,WAAA,CACqB,MACA,QAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAClB;AAAA,EAFkB,IAAA;AAAA,EACA,QAAA;AAAA,EAGX,OAAO,OAAA,EAAqD;AACpE,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EACxD;AACF,CAAA;;;AChBO,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAK/C,MAAM,KAAK,OAAA,EAAiE;AAC1E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,UAAA,EAAY;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EAC8C;AAC9C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAyB,gBAAA,EAAkB;AAAA,MAC1D,GAAG,OAAA;AAAA,MACH,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAA,CAAoB,MAAA,EAAgB,OAAA,EAAyD;AACjG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAa,gBAAA,EAAkB;AAAA,MAC9C,GAAG,OAAA;AAAA,MACH,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,MAAA,CAAO,MAAA,EAA4B,OAAA,EAAqE;AAC5G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAM,GAAI,MAAA;AACrC,IAAA,MAAM,IAAA,GAAO,EAAE,GAAI,IAAA,GAAO,EAAE,IAAA,EAAK,GAAI,EAAC,EAAI,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,EAAC,EAAG;AACtE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAuB,KAAA,CAAA,SAAA,EAAiB,IAAI,IAAI,IAAA,EAAM;AAAA,MACrE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,MAAA,EAA4B,OAAA,EAAyD;AAChG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,UAAA,EAAY,MAAA,EAAQ;AAAA,MAC9C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QAAA,CAAS,MAAA,EAA8B,OAAA,EAA+D;AAC1G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAmB,KAAA,CAAA,SAAA,EAAiB,EAAE,CAAA,CAAA,EAAI;AAAA,MACzD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAEF;;;AChHO,IAAM,WAAA,GAAN,cAA0B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAK7C,MAAM,GAAG,OAAA,EAAyD;AAChE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,WAAA,EAAa;AAAA,MACtC,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,QAAA,EAAU,MAAA,EAAQ;AAAA,MAC7C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CAAc,IAAA,EAAqB,OAAA,EAA+D;AACtG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,mBAAA,EAAqB;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,GAAI,OAAO,EAAE,KAAA,EAAO,EAAE,IAAA,EAAK,KAAM;AAAC,KACnC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EACoC;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAgB,0BAAA,EAA4B,EAAE,OAAM,EAAG;AAAA,MACtE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EACoC;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAgB,0BAAA,EAA4B,KAAA,EAAO;AAAA,MAClE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CAAe,MAAA,EAA+B,OAAA,EAAyD;AAC3G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,0BAAA,EAA4B,MAAA,EAAQ;AAAA,MAC9D,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,MAAA,EACA,OAAA,EAC+B;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAI,OAAA,EAAQ,GAAI,MAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAY,KAAA,CAAA,kBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI,EAAE,SAAQ,EAAG;AAAA,MACxE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,MAAA,EACA,OAAA,EACmC;AACnC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAiB,KAAA,CAAA,kBAAA,EAA0B,EAAE,CAAA,CAAA,EAAI;AAAA,MAChE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAA,CACJ,MAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAwB,yBAAA,EAA2B,EAAE,OAAM,EAAG;AAAA,MAC7E,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,MAAA,EAA+B,OAAA,EAAyD;AAC/G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,4BAAA,EAA8B,MAAA,EAAQ;AAAA,MACjE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAA,CACJ,MAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,MAAA;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAwB,yBAAA,EAA2B,KAAA,EAAO;AAAA,MACzE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,MAAA,EAA+B,OAAA,EAAyD;AAC/G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAY,4BAAA,EAA8B,MAAA,EAAQ;AAAA,MACjE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;ACjNO,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAA,EAChD,WAAA,CACE,IAAA,EACA,QAAA,EACiB,OAAA,EAGjB;AACA,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AAJH,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAKnB;AAAA,EALmB,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnB,MAAM,KAAK,OAAA,EAA8D;AACvE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,WAAA,EAAa;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CAAO,MAAA,EAA6B,OAAA,EAAyD;AACjG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,UAAA,EAAkB,EAAE,CAAA,CAAA,EAAI;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,IAAA,CACJ,MAAA,EACA,OAAA,EACmD;AACnD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,wBAAA,EAA0B;AAAA,MACvE,GAAG,OAAA;AAAA,MACH,GAAI,SAAS,EAAE,KAAA,EAAO,EAAE,MAAA,EAAO,KAAM,EAAC;AAAA,MACtC,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,UAAA,CACJ,MAAA,EACA,OAAA,EACwC;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,yBAAyB,MAAA,EAAQ;AAAA,QACnE,GAAG,OAAA;AAAA,QACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,OACjD;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,SAAA,CAAU,MAAA,EAAgB,OAAA,EAAyD;AACvF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,gBAAA,EAAkB;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,OAAO,MAAA,EAAQ,KAAA;AAAA,MACf,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;AC9HO,IAAM,cAAA,GAAN,cAA6B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhD,MAAM,cAAA,CAAe,MAAA,EAA8B,OAAA,EAAyD;AAC1G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,IAAA,EAAK,GAAI,MAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,oBAAA,EAAsB,IAAA,EAAM;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;ACbO,IAAM,gBAAA,GAAN,cAA+B,aAAA,CAAc;AAAA,EAClD,WAAA,CACE,IAAA,EACA,QAAA,EACiB,OAAA,EAGjB;AACA,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AAJH,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAKnB;AAAA,EALmB,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBnB,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,EACmD;AACnD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA+B,oBAAoB,MAAA,CAAO,IAAI,IAAI,MAAA,EAAW;AAAA,MAC5F,GAAG,OAAA;AAAA,MACH,GAAI,MAAA,CAAO,SAAA,GAAY,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,EAAE,GAAI,EAAC;AAAA,MACrE,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,OAAe,OAAA,EAA8D;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,aAAA,EAAe,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAM,EAAG,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CACE,QACA,OAAA,EACmD;AACnD,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,MACf,KAAA,CAAA,YAAA,EAAoB,OAAO,IAAI,CAAA,CAAA;AAAA,MAC/B,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM;AAAA,MACtB,MAAA,CAAO,SAAA,GACH,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,EAAE,GACrD;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAA,CACJ,MAAA,EACA,OAAA,EACwC;AACxC,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAM,IAAA,CAAK,KAAK,IAAA,CAAoB,oBAAA,EAAsB,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,EAChG;AACF,CAAA;;;AC3EO,IAAM,YAAA,GAAN,cAA2B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,MAAM,IAAA,CAAK,OAAA,EAAkB,OAAA,EAA4D;AACvF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,SAAA,EAAW;AAAA,MACvC,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,GAAI,UAAU,EAAE,KAAA,EAAO,EAAE,OAAA,EAAQ,KAAM;AAAC,KACzC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAA,CAAW,QAAA,EAAkB,OAAA,EAAiE;AAClG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAkB,iBAAA,EAAmB;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,KAAA,EAAO,EAAE,QAAA;AAAS,KACnB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,MAAA,CAAO,MAAA,EAAsB,OAAA,EAA4D;AAC7F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,IAAA,EAAK,GAAI,MAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,iBAAA,EAAmB;AAAA,MAChD,GAAG,IAAA;AAAA,MACH,GAAI,SAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB;AAAC,KACxE,EAAG;AAAA,MACD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CAAI,EAAA,EAAY,OAAA,EAA0D;AAC9E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAW,KAAA,CAAA,QAAA,EAAgB,EAAE,CAAA,CAAA,EAAI;AAAA,MAChD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,MAAA,EAA2B,OAAA,EAA0D;AAChG,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAc,KAAA,CAAA,QAAA,EAAgB,EAAE,CAAA,OAAA,CAAA,EAAW;AAAA,MAC1D,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,EAAA,EAAY,OAAA,EAA0D;AACjF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,WAAW,MAAA,EAAW;AAAA,MACpE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,EAAA,EAAY,OAAA,EAA0D;AACjF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,WAAW,MAAA,EAAW;AAAA,MACpE,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,CAAM,MAAA,EAA0B,OAAA,EAA0D;AAC9F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,UAAU,MAAA,EAAW;AAAA,MACnE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,EAAA,EAAY,MAAA,EAA2B,OAAA,EAA0D;AAC5G,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAG,IAAA,EAAK,GAAI,MAAA;AAC3B,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,IAAI,IAAA,EAAM;AAAA,MACxD,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,CAAM,MAAA,EAA0B,OAAA,EAA0D;AAC9F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,MAAA;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAa,KAAA,CAAA,QAAA,EAAgB,EAAE,UAAU,MAAA,EAAW;AAAA,MACnE,GAAG,OAAA;AAAA,MACH,KAAA;AAAA,MACA,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AACF;;;AC3JO,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAInD,MAAM,KAAK,OAAA,EAAqE;AAC9E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAsB,oBAAA,EAAsB;AAAA,MAC3D,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CAAO,QAAA,EAAkB,OAAA,EAAyD;AACtF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAa,oBAAA,EAAsB;AAAA,MAClD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA;AAAS,KAC9B,CAAA;AAAA,EACH;AACF;AAkBO,IAAM,WAAA,GAAN,cAA0B,aAAA,CAAc;AAAA;AAAA,EAEpC,MAAA;AAAA,EAET,WAAA,CAAY,MAAkB,QAAA,EAAwC;AACpE,IAAA,KAAA,CAAM,MAAM,QAAQ,CAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,iBAAA,CAAkB,IAAA,EAAM,QAAQ,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,SAAA,CAAU,MAAA,EAA8B,OAAA,EAAoE;AAChH,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC9C,IAAA,IAAI,SAAA,CAAU,OAAO,OAAO,EAAE,MAAM,IAAA,EAAM,KAAA,EAAO,UAAU,KAAA,EAAM;AAEjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAA,CAAU,KAAK,sBAAsB,CAAA;AACzD,IAAA,MAAM,KAAA,GAA4C;AAAA,MAChD,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,aAAA,EAAe,OAAO,aAAA,IAAiB,MAAA;AAAA,MACvC,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,uBAAuB,MAAA,CAAO,qBAAA;AAAA,MAC9B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAS,MAAA,CAAO,OAAA,KAAY,SAAY,MAAA,GAAY,MAAA,CAAO,OAAO,OAAO;AAAA,KAC3E;AACA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,IAAI,UAAU,MAAA,EAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,GAAA,CAAI,QAAA,EAAS;AAAA,IACtC;AAEA,IAAA,OAAO,EAAE,MAAM,EAAE,GAAA,EAAK,IAAI,QAAA,EAAS,EAAE,EAAG,KAAA,EAAO,IAAA,EAAK;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,oBAAA,CACE,QACA,OAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,cAAA;AAAA,MACA,EAAE,UAAA,EAAY,oBAAA,EAAsB,GAAG,MAAA,EAAO;AAAA,MAC9C,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA;AAAK,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAA,CACE,QACA,OAAA,EAC6C;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,cAAA;AAAA,MACA,EAAE,UAAA,EAAY,eAAA,EAAiB,GAAG,MAAA,EAAO;AAAA,MACzC,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA;AAAK,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAA,CAAS,QAAgC,OAAA,EAA6D;AAEpG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,iBAAA,EAAmB,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,gBAAA,CAAiB,eAAA,EAAyB,OAAA,EAAuE;AACrH,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,KAAA,CAAA,sBAAA,EAA8B,eAAe,CAAA,CAAA,EAAI;AAAA,MACxF,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OAAA,CACJ,eAAA,EACA,MAAA,EACA,OAAA,EAC6C;AAC7C,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAyB,KAAA,CAAA,sBAAA,EAA8B,eAAe,CAAA,QAAA,CAAA,EAAY,EAAE,QAAO,EAAG;AAAA,MAC7G,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,SAAS,OAAA,EAAkE;AAC/E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,iBAAA,EAAmB;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAA,EAAmE;AAE3E,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAoB,mCAAA,EAAqC,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,OAAA,EAA8D;AAEjE,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAe,wBAAA,EAA0B,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,CAAA;AAAA,EAC5F;AACF;;;AC9NA,IAAM,mBAAN,MAAuB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,MAAA,CAAO,QAA+B,OAAA,EAAyD;AAC7F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,cAAA,EAAgB,QAAQ,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,QAA8B,OAAA,EAAoE;AACrG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAqB,cAAA,EAAgB;AAAA,MACpD,GAAG,OAAA;AAAA,MACH,GAAI,MAAA,GAAS,EAAE,KAAA,EAAO,MAAA,KAAwD;AAAC,KAChF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAgB,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAU,KAAA,CAAA,aAAA,EAAqB,MAAM,IAAI,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,MAAA,EAAgB,MAAA,EAA+B,OAAA,EAAyD;AAC7G,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,MAAM,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,QAAgB,OAAA,EAAyD;AAC9E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,MAAM,IAAI,OAAO,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAgB,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,MAAM,CAAA,IAAA,CAAA,EAAQ,QAAW,OAAO,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,QAAgB,OAAA,EAAyD;AAC7E,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,MAAM,CAAA,MAAA,CAAA,EAAU,QAAW,OAAO,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAgB,OAAA,EAA8D;AACxF,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAe,KAAA,CAAA,aAAA,EAAqB,MAAM,aAAa,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,QAAgB,OAAA,EAAyD;AAClF,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,MAAM,aAAa,OAAO,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,MAAA,EAAgB,SAAA,EAAmB,OAAA,EAA4D;AAC3G,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAgB,KAAA,CAAA,aAAA,EAAqB,MAAM,CAAA,UAAA,EAAa,SAAS,IAAI,OAAO,CAAA;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,QAAgB,OAAA,EAAiE;AAC1F,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAkB,KAAA,CAAA,aAAA,EAAqB,MAAM,YAAY,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAA,EAAgB,QAAA,EAAkB,OAAA,EAAyD;AACtG,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,MAAM,CAAA,SAAA,EAAY,QAAQ,IAAI,OAAO,CAAA;AAAA,EAC1F;AACF,CAAA;AAKA,IAAM,mBAAN,MAAuB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,IAAA,CAAK,SAAkB,OAAA,EAA2D;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAY,cAAA,EAAgB;AAAA,MAC3C,GAAG,OAAA;AAAA,MACH,GAAI,UAAU,EAAE,KAAA,EAAO,EAAE,OAAA,EAAQ,KAAM;AAAC,KACzC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,QAA0B,OAAA,EAAyD;AACxF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,cAAA,EAAgB,QAAQ,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,OAAA,EAAiB,MAAA,EAA0B,OAAA,EAAyD;AACzG,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA,CAAY,qBAAqB,OAAO,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,SAAiB,OAAA,EAAyD;AAC/E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,aAAA,EAAqB,OAAO,IAAI,OAAO,CAAA;AAAA,EACvE;AACF,CAAA;AAMA,IAAM,oBAAN,MAAwB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,IAAA,CAAK,QAA+B,OAAA,EAAqE;AACvG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAsB,eAAA,EAAiB;AAAA,MACtD,GAAG,OAAA;AAAA,MACH,GAAI,MAAA,GAAS,EAAE,KAAA,EAAO,MAAA,KAAwD;AAAC,KAChF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,QAAwB,OAAA,EAA0D;AACpF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAY,eAAA,EAAiB,QAAQ,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,SAAiB,OAAA,EAAyD;AAC/E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,cAAA,EAAsB,OAAO,IAAI,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAA,CAAiB,UAAkB,OAAA,EAAyD;AAC1F,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,iBAAA,EAAyB,QAAQ,WAAW,OAAO,CAAA;AAAA,EACnF;AACF,CAAA;AAQA,IAAM,0BAAN,MAA8B;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,MAAA,CAAO,QAAgC,OAAA,EAA6D;AAClG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,sBAAA,EAAwB,QAAQ,OAAO,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAA,EAA+D;AAClE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,sBAAA,EAAwB,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAI,IAAY,OAAA,EAA6D;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAc,KAAA,CAAA,qBAAA,EAA6B,EAAE,IAAI,OAAO,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CAAO,EAAA,EAAY,MAAA,EAA8B,OAAA,EAA6D;AAC5G,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAc,6BAA6B,EAAE,CAAA,CAAA,EAAI,QAAQ,OAAO,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,IAAY,OAAA,EAAyD;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA,CAAa,KAAA,CAAA,qBAAA,EAA6B,EAAE,IAAI,OAAO,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,CAAiB,IAAY,OAAA,EAA6D;AACxF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAe,6BAA6B,EAAE,CAAA,kBAAA,CAAA,EAAsB,QAAW,OAAO,CAAA;AAAA,EACzG;AACF,CAAA;AAcO,IAAM,cAAN,MAAkB;AAAA,EAMvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,CAAiB,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,CAAiB,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,iBAAA,CAAkB,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,uBAAA,CAAwB,IAAI,CAAA;AAAA,EACtD;AAAA,EAL6B,IAAA;AAAA,EALpB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAQX;;;AChRA,IAAM,0BAAA,GAA6B,IAAA;AAE5B,SAAS,gBAAgB,IAAA,EAA+D;AAC7F,EAAA,OAAO;AAAA,IACL,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,GAAI,KAAK,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,IAAA,CAAK,aAAA,EAAc,GAAI,EAAC;AAAA,IAChF,YAAY,IAAA,CAAK,GAAA,EAAI,GAAA,CAAK,IAAA,CAAK,cAAc,0BAAA,IAA8B,GAAA;AAAA,IAC3E,UAAA,EAAY,KAAK,UAAA,IAAc,QAAA;AAAA,IAC/B,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI;AAAC,GACvD;AACF;AAEO,SAAS,gBAAgB,MAAA,EAAsC;AACpE,EAAA,OAAO;AAAA,IACL,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,GAAI,OAAO,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,MAAA,CAAO,aAAA,EAAc,GAAI,EAAC;AAAA,IACpF,GAAI,OAAO,UAAA,GAAa,EAAE,YAAY,MAAA,CAAO,UAAA,KAA2D,EAAC;AAAA,IACzG,UAAA,EAAY,KAAK,KAAA,CAAA,CAAO,MAAA,CAAO,aAAa,IAAA,CAAK,GAAA,MAAS,GAAI,CAAA;AAAA,IAC9D,GAAI,OAAO,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK,GAAI;AAAC,GAC3D;AACF;;;ACRA,SAAS,gBAAgB,OAAA,EAAyB;AAChD,EAAA,MAAM,MAAA,GAAS,QAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAA,CAAW,IAAK,MAAA,CAAO,MAAA,GAAS,CAAA,IAAM,CAAA,EAAI,GAAG,CAAA;AACjF,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,MAAM,GAAG,CAAA,IAAA,KAAQ,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAEtE,EAAA,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,KAAK,CAAA;AACvC;AAEO,SAAS,cAAc,IAAA,EAAoC;AAChE,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,OAAO,KAAK,IAAA,CAAK,EAAA;AACpC,EAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAE,CAAC,CAAA;AAC5E,IAAA,OAAO,OAAO,OAAA,CAAQ,KAAK,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,EAC/D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,WAAA,CACmB,SACA,WAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAChB;AAAA,EAFgB,OAAA;AAAA,EACA,WAAA;AAAA,EAGnB,MAAc,OAAA,GAAgC;AAC5C,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,WAAW,CAAA;AACvD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,GAAA,EAAiC;AACtD,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,aAAa,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,KAAK,IAAA,EAA6C;AACtD,IAAA,MAAM,MAAA,GAAS,cAAc,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,CAAK,cAAc,OAAO,IAAA;AAE1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,GAAA,CAAI,MAAM,IAAI,eAAA,CAAgB,EAAE,GAAG,IAAA,EAAM,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,CAAA;AAC1E,IAAA,MAAM,IAAA,CAAK,SAAS,GAAG,CAAA;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,OAAO,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,EACxB;AAAA,EAEA,MAAM,IAAA,GAAgC;AACpC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,OAAO,MAAA,CAAO,QAAQ,GAAG,CAAA,CAAE,IAAI,CAAC,CAAC,MAAA,EAAQ,OAAO,CAAA,MAAO;AAAA,MACrD,MAAA;AAAA,MACA,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,UAAA,EAAY,KAAK,KAAA,CAAA,CAAO,OAAA,CAAQ,aAAa,IAAA,CAAK,GAAA,MAAS,GAAI,CAAA;AAAA,MAC/D,GAAI,QAAQ,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,OAAA,CAAQ,aAAA,EAAc,GAAI,EAAC;AAAA,MACtF,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI;AAAC,KAC7D,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,OAAO,MAAA,EAA+B;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,OAAO,IAAI,MAAM,CAAA;AACjB,IAAA,MAAM,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,EACzB;AACF,CAAA;;;ACnDO,IAAM,mBAAN,MAAuB;AAAA;AAAA,EAEX,SAAA,uBAAgB,GAAA,EAA0C;AAAA,EAE3E,EAAA,CAA+B,OAAU,OAAA,EAAiD;AACxF,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,OAAO,MAAM;AAAE,MAAA,GAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAAE,CAAA;AAAA,EACtC;AAAA,EAEA,QACK,IAAA,EACG;AACN,IAAA,MAAM,CAAC,KAAA,EAAO,OAAO,CAAA,GAAI,IAAA;AACzB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,MAAW,WAAW,GAAA,EAAK;AACzB,MAAA,IAAI;AACF,QAAA;AAAC,QAAC,QAAiC,OAAO,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,KAAK,CAAA,iBAAA,CAAA,EAAqB,KAAK,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAAgC;AACjD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AAAA,EACF;AACF;;;AC3BO,IAAM,aAAN,MAAiB;AAAA,EAgBtB,WAAA,CACqB,MACA,OAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAInB,IAAA,OAAA,EAAS,YAAA;AAAA,MAAa,CAAC,kBACrB,IAAA,CAAK,IAAA,CAAK,KAAoB,QAAA,EAAU,EAAE,eAAc,EAAG;AAAA,QACzD,KAAA,EAAO,EAAE,UAAA,EAAY,eAAA;AAAgB,OACtC;AAAA,KACH;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,MAAM,IAAA,CAAK,OAAA,EAAS,eAAc,IAAK,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAE5E,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,aAAA,CAAc,IAAA,EAAM,KAAK,SAAS,CAAA;AACrD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAA,EAAM,KAAK,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,WAAW,IAAI,cAAA;AAAA,MAAe,IAAA;AAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MAAW,CAAC,MAAA,KACxD,IAAA,CAAK,cAAA,CAAe,MAAM;AAAA,KAC5B;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe,IAAA,EAAM,KAAK,SAAS,CAAA;AACvD,IAAA,IAAA,CAAK,aAAa,IAAI,gBAAA;AAAA,MAAiB,IAAA;AAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MAAW,CAAC,MAAA,KAC5D,IAAA,CAAK,cAAA,CAAe,MAAM;AAAA,KAC5B;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAA,EAAM,KAAK,SAAS,CAAA;AAAA,EACnD;AAAA,EAvBqB,IAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAhBZ,OAAA;AAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,UAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EAEU,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCnB,MAAM,cAAA,GAAyC;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,EAAS,aAAA,EAAc,IAAK,IAAA;AAAA,EAC1C;AAAA,EAEA,MAAgB,eAAe,MAAA,EAA+E;AAC5G,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,IAAA,CAAK,YAAA,IAAgB,KAAK,OAAA,EAAS;AAC7D,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,MAAA,CAAO,MAAA,EAAsB,OAAA,EAAkE;AACnG,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,SAAA,EAAW,QAAQ,OAAO;AAAA,KAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,MAAA,CAAO,MAAA,EAAsB,OAAA,EAAkE;AACnG,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,UAAU,MAAA,EAAQ;AAAA,QACpD,GAAG,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,UAAA,EAAY,UAAA;AAAW,OACjC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAA,CAAc,QAA6B,OAAA,EAA8D;AACvG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAgB,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,SAAA,CACJ,QAAA,EACA,OAAA,EACmE;AACnE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC7B,eAAe,QAAQ,CAAA,UAAA,CAAA;AAAA,MACvB,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,GAAI,OAAA,EAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,EAAa,GAAI,IAAI;AAAE,KACpG;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AAClD,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAM,OAAA,CACJ,QAAA,EACA,OAAA,EACmE;AACnE,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA;AAAA,MAC7B,eAAe,QAAQ,CAAA,QAAA,CAAA;AAAA,MACvB;AAAA,QACE,GAAG,OAAA;AAAA,QACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,QAChD,KAAA,EAAO,EAAE,GAAI,OAAA,EAAS,YAAA,GAAe,EAAE,YAAA,EAAc,OAAA,CAAQ,YAAA,EAAa,GAAI,EAAC;AAAG;AACpF,KACF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,OAAO,WAAW,WAAA,EAAa;AAClD,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,GAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,iBAAA,CACJ,QAAA,EACA,OAAA,EACA,OAAA,EACwC;AACxC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,KAAA,CAAA,QAAA,EAAgB,QAAQ,CAAA,SAAA,CAAA,EAAa;AAAA,QACtE,GAAG,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA;AAAQ,OAC5B;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,oBAAA,CAAqB,IAAA,EAAc,OAAA,EAAkE;AACzG,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,KAAK,IAAA,CAAK,IAAA;AAAA,QACd,QAAA;AAAA,QACA,EAAE,IAAA,EAAK;AAAA,QACP;AAAA,UACE,GAAG,OAAA;AAAA,UACH,KAAA,EAAO,EAAE,UAAA,EAAY,oBAAA,EAAqB;AAAA,UAC1C,OAAA,EAAS;AAAA,YACP,GAAG,OAAA,EAAS,OAAA;AAAA,YACZ,cAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,OAAA,EAAgE;AAC/E,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,UAAA,EAAY;AAAA,MAC5C,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAA,CAAO,QAAsB,OAAA,EAAiE;AAC5F,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAmB,SAAA,EAAW,QAAQ,OAAO,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,eAAA,CAAgB,MAAA,EAA+B,OAAA,EAAkE;AACrH,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,OAAe,OAAA,EAAyD;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAU,WAAA,EAAa,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAM,EAAG,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAA,CAAa,MAAA,EAA4B,OAAA,EAAkE;AAC/G,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACV,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,UAAU,MAAA,EAAQ;AAAA,QACpD,GAAG,OAAA;AAAA,QACH,KAAA,EAAO,EAAE,UAAA,EAAY,eAAA;AAAgB,OACtC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,QAAuB,OAAA,EAAyD;AACtF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,UAAA,EAAY;AAAA,MACtC,GAAG,MAAA;AAAA,MACH,GAAI,SAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB;AAAC,OACrE,OAAO,CAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,QAA6B,OAAA,EAAyD;AAClG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,yBAAA,EAA2B,QAAQ,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,CAAO,KAAA,EAAsB,OAAA,EAA6D;AAC9F,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAc,mBAAA,EAAqB;AAAA,MAClD,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,KAAA,EAAO;AAAA,QACL,GAAI,OAAO,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa,EAAC;AAAA,QACtD,GAAI,KAAA,EAAO,MAAA,GAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI,EAAC;AAAA,QAC1D,GAAI,KAAA,EAAO,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAE,GAAI,EAAC;AAAA,QACvD,GAAI,KAAA,EAAO,4BAAA,KAAiC,MAAA,GACxC,EAAE,4BAAA,EAA8B,MAAA,CAAO,KAAA,CAAM,4BAA4B,CAAA,EAAE,GAC3E;AAAC;AACP,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAAW,OAAA,EAA4D;AAC3E,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,UAAA,EAAY;AAAA,MACxC,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA;AAAQ,KACjD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,OAAA,CAAQ,KAAA,EAAsB,OAAA,EAAyD;AAC3F,IAAA,MAAM,OAAO,MAAM,aAAA,CAAc,KAAK,IAAA,EAAM,IAAA,CAAK,WAAW,OAAO,CAAA;AACnE,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAErD,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,YAAY,MAAA,EAAW;AAAA,MAC/D,GAAG,OAAA;AAAA,MACH,SAAS,EAAE,GAAG,SAAS,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AAAA,MAChD,GAAI,QAAQ,EAAE,KAAA,EAAO,EAAE,KAAA,EAAM,KAAM;AAAC,KACrC,CAAA;AAED,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,IAC5B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAMO,IAAM,iBAAA,GAAN,cAAgC,UAAA,CAAW;AAAA,EAC/B,eAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EAEjB,WAAA,CACE,MACA,OAAA,EACA,OAAA,EACA,aACA,SAAA,GAAY,KAAA,EACZ,cAAc,IAAA,EACd;AACA,IAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,CAAgB,OAAA,EAAS,WAAW,CAAA;AAC/D,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,gBAAA,EAAiB;AAEpC,IAAA,IAAA,CAAK,OAAO,IAAI,UAAA,CAAiC,CAAA,cAAA,EAAiB,WAAW,IAAI,CAAA,OAAA,KAAW;AAC1F,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA;AAAA,QACX,OAAA,CAAQ,KAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACV;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACpC,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,KAAK,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAAA,MACrC;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,iBAAA,EAAmB,IAAI,CAAA;AACzC,MAAA,IAAA,CAAK,KAAK,IAAA,CAAK,EAAE,OAAO,iBAAA,EAAmB,OAAA,EAAS,MAAM,CAAA;AAAA,IAC5D,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,iBAAA,CAAkB,CAAC,MAAA,KAAW;AACpC,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,cAAA,EAAgB,MAAA,GAAS,gBAAgB,MAAM,CAAA,GAAI,EAAE,CAAA;AAAA,IACzE,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,kBAAkB,MAAM;AAC3B,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,eAAe,CAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,gBAAA,EAAiB;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,GAAyC;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,EAAS,YAAA,EAAa,IAAK,IAAA;AAAA,EACzC;AAAA;AAAA,EAGA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAS,eAAA,EAAgB;AAC9B,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,EAAA,CACE,OACA,OAAA,EACY;AACZ,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,MAAyB,eAAe,MAAA,EAA+E;AACrH,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA;AAE7C,IAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AACd,MAAA,IAAI,GAAA,CAAI,KAAK,YAAA,EAAc;AACzB,QAAA,IAAI,KAAK,SAAA,EAAW;AAClB,UAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,QAC1C;AACA,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,GAAA,CAAI,IAAI,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW;AAC7B,QAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,GAAA,CAAI,IAAI,CAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,GAAA,GAAqC;AACzC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAS,GAAA,EAAI;AACvC,IAAA,OAAO,MAAA,GAAS,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAI,IAAA,EAAoC;AAC5C,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,IAAI,IAAA,EAAoC;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,YAAA,EAAc;AAC3C,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAO,MAAA,EAAkC;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,KAAA;AAE5B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAW,MAAM,CAAA;AAE3D,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,IAAA,MAAM,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AAEhD,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,kBAAA,EAAoB,EAAE,QAAQ,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAA,GAAgC;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,SAAkB,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,gBAAgB,IAAA,EAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,MAAA,EAA+B;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,QAAQ,OAAA,EAAQ;AAC5C,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAS,GAAA,EAAI;AAEvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAC,CAAA;AAAA,IACzD;AAEA,IAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EAC5B;AAAA,EAEA,MAAe,OAAA,CAAQ,KAAA,EAAsB,OAAA,EAAyD;AAEpG,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,EAAS,GAAA,EAAI;AACvC,IAAA,MAAM,MAAA,GAAS,MAAA,GACV,MAAA,CAAO,IAAA,EAAM,EAAA,IAAM,aAAA,CAAc,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAc,CAAA,GACvE,IAAA;AAEJ,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,OAAO,OAAO,CAAA;AAEjD,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,MAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,QAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAAA,MAC1C;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,YAAA,EAAc,EAAE,GAAI,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,EAAC,EAAI,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAYO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA;AAAA,EAEtC,MAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM,IAAI,CAAA;AACV,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,EAAM,KAAK,SAAS,CAAA;AACnD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAI,CAAA;AAAA,EACnC;AACF;;;ACjpBO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7B,MAAA,CAAO,QAA8B,OAAA,EAA6D;AAChG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAe,YAAA,EAAc,QAAQ,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CACE,OAAA,EACA,IAAA,EACA,MAAA,EACA,OAAA,EACmC;AACnC,IAAA,OAAO,IAAA,CAAK,KAAK,KAAA,CAAgB,KAAA,CAAA,WAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,CACE,OAAA,EACA,IAAA,EACA,QAAA,EACA,QACA,OAAA,EACmC;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAc,KAAA,CAAA,WAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,MAAA,EAAQ,OAAO,CAAA;AAAA,EAClG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAA,CACE,OAAA,EACA,IAAA,EACA,QAAA,EACA,OAAA,EACmC;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAiB,KAAA,CAAA,WAAA,EAAmB,OAAO,IAAI,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,OAAA,EAA8B,IAAA,EAAc,OAAA,EAA6D;AAC9G,IAAA,OAAO,IAAA,CAAK,KAAK,MAAA,CAAiB,KAAA,CAAA,WAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,IAAI,IAAI,OAAO,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GAAA,CAAI,OAAA,EAA8B,IAAA,EAAc,OAAA,EAA6D;AAC3G,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAc,KAAA,CAAA,WAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,IAAI,IAAI,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAA,CAAK,SAA2B,OAAA,EAAuE;AACrG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,YAAA,EAAc;AAAA,MACrD,GAAG,OAAA;AAAA,MACH,KAAA,EAAO;AAAA,QACL,GAAI,SAAS,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK,GAAI,EAAC;AAAA,QAC5D,GAAI,SAAS,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAU,GAAI,EAAC;AAAA,QAC3E,GAAI,SAAS,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,QAC9C,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,OAAA,KAAY,EAAC;AAAA,QACvD,GAAI,SAAS,QAAA,GAAW,EAAE,UAAU,OAAA,CAAQ,QAAA,KAAa;AAAC;AAC5D,KACD,CAAA;AAAA,EACH;AACF;;;ACzHO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc7B,IAAA,CAAK,QAAyB,OAAA,EAAyD;AACrF,IAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,gBAAe,GAAI,MAAA;AAE3D,IAAA,MAAM,IAAA,GAAO,WACT,KAAA,CAAA,qBAAA,EAA6B,QAAQ,IAAI,QAAQ,CAAA,CAAA,GACjD,6BAA6B,QAAQ,CAAA,CAAA;AAEzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAW,IAAA,EAAM,EAAE,OAAO,EAAA,EAAI,MAAA,EAAQ,cAAA,EAAe,EAAG,OAAO,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAA,CAAK,OAAe,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAW,6BAA6B,EAAE,KAAA,IAAS,OAAO,CAAA;AAAA,EAC7E;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAc7B,IAAA,CAAK,QAAuB,OAAA,EAAyD;AACnF,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,gBAAe,GAAI,MAAA;AAE9D,IAAA,MAAM,IAAA,GAAO,WACT,KAAA,CAAA,mBAAA,EAA2B,QAAQ,IAAI,QAAQ,CAAA,CAAA,GAC/C,2BAA2B,QAAQ,CAAA,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAW,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,cAAA,EAAe,EAAG,OAAO,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAA,CAAK,OAAe,OAAA,EAAyD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAW,2BAA2B,EAAE,KAAA,IAAS,OAAO,CAAA;AAAA,EAC3E;AACF;AAEO,IAAM,cAAN,MAAkB;AAAA,EACd,KAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EAET,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,SAAA,CAAU,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,eAAA,CAAgB,IAAI,CAAA;AAAA,EAC3C;AACF;;;AC9EA,IAAM,aAAA,uBAAoB,GAAA,EAA8B;AAExD,SAAS,QAAA,GAAkC;AACzC,EAAA,MAAM,OAAA,GAAW,WAA0D,SAAA,EAAW,KAAA;AAEtF,EAAA,OAAO,OAAO,OAAA,EAAS,OAAA,KAAY,UAAA,GAAa,OAAA,GAAU,IAAA;AAC5D;AAEA,eAAsB,YAAA,CACpB,IAAA,EACA,IAAA,EACA,OAAA,GAAuB,EAAC,EACC;AACzB,EAAA,MAAM,UAAU,QAAA,EAAS;AAEzB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAQ,MAAM,OAAA,CAAQ,OAAA;AAAA,MACpB,IAAA;AAAA,MACA,EAAE,IAAA,EAAM,WAAA,EAAa,GAAI,OAAA,CAAQ,YAAA,GAAe,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,EAAC,EAAG;AAAA,MAC5E,OAAM,IAAA,KAAS,IAAA,KAAS,IAAA,GAAO,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,MAAM,MAAK;AAAE,KACnF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAEvC,EAAA,IAAI,QAAA,IAAY,QAAQ,YAAA,EAAc;AACpC,IAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,EACtB;AAEA,EAAA,MAAM,GAAA,GAAA,CAAO,QAAA,IAAY,OAAA,CAAQ,OAAA,EAAQ,EAAG,MAAM,MAAM,MAAS,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC5E,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,MAAM,MAAS,CAAA;AAEtC,EAAA,aAAA,CAAc,GAAA,CAAI,MAAM,IAAI,CAAA;AAE5B,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,MAAM,GAAA,EAAI;AAAA,EACvC,CAAA,SAAE;AACA,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,KAAM,IAAA,EAAM;AACpC,MAAA,aAAA,CAAc,OAAO,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF;AACF;;;ACrDA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,cAAA;AAAA,EACA,yBAAA;AAAA,EACA,4BAAA;AAAA,EACA,+BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,mBAAmB,KAAA,EAA+B;AAChE,EAAA,OACE,KAAA,CAAM,WAAA,KAAgB,CAAA,IACtB,KAAA,CAAM,WAAA,KAAgB,OACtB,KAAA,CAAM,WAAA,KAAgB,GAAA,IACtB,KAAA,CAAM,WAAA,IAAe,GAAA;AAEzB;AAEO,SAAS,iBAAiB,KAAA,EAA+B;AAC9D,EAAA,OAAO,cAAc,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,MAAM,WAAA,KAAgB,GAAA;AAChE;;;ACbA,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,mBAAA,GAAsB,GAAA;AAE5B,IAAM,wBAAA,GAA2B,GAAA;AACjC,IAAM,gCAAA,GAAmC,CAAA;AAYzC,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACvD;AAEA,SAAS,gBAAA,GAA4B;AACnC,EAAA,OAAQ,UAAA,CAAmD,UAAU,MAAA,KAAW,IAAA;AAClF;AAEA,SAAS,SAAA,GAAqB;AAC5B,EAAA,MAAM,KAAA,GAAQ,UAAA;AAEd,EAAA,OAAO,OAAO,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,OAAO,MAAM,QAAA,KAAa,WAAA;AAC1E;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAW1B,WAAA,CACmB,SACjB,UAAA,EACA;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGjB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,QAAA,GAAW,oBAAoB,UAAU,CAAA,CAAA;AAAA,EAChD;AAAA,EALmB,OAAA;AAAA,EAXX,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACS,UAAA;AAAA,EACA,QAAA;AAAA,EAET,QAAA,GAA0C,IAAA;AAAA,EAC1C,MAAA;AAAA,EACA,kBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcR,aAAa,EAAA,EAAqB;AAChC,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AAAA,EACnB;AAAA;AAAA,EAGA,oBAAoB,EAAA,EAA4B;AAC9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,EAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,EAAA,EAA0B;AAC1C,IAAA,IAAA,CAAK,cAAA,GAAiB,EAAA;AAAA,EACxB;AAAA,EAEA,MAAM,KAAK,IAAA,EAAoC;AAC7C,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AAExB,IAAA,MAAM,OAAA,GAAU,gBAAgB,EAAE,GAAG,MAAM,YAAA,EAAc,IAAA,CAAK,cAAc,CAAA;AAE5E,IAAA,MAAM,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,GAAA,GAAqC;AACzC,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,KAAK,UAAU,CAAA;AAEtD,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/C;AAAA,EAEQ,YAAY,OAAA,EAAiC;AACnD,IAAA,OAAO,OAAA,CAAQ,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,oBAAA;AAAA,EAC3C;AAAA,EAEQ,QAAQ,OAAA,EAAiD;AAC/D,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA,CAAE,QAAQ,MAAM;AAC9D,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,MAAc,oBAAoB,OAAA,EAAiD;AACjF,IAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,IAAA,CAAK,UAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAExF,IAAA,OAAO,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAAA,EACvC;AAAA,EAEA,MAAc,mBAAmB,OAAA,EAAiD;AAChF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,IAAA,CAAK,cAAA,GAAiB,IAAI,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,YAAA,GAC3B,OAAA,CAAQ,YAAA,KAAiB,QAAQ,YAAA,GACjC,CAAC,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAE7B,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,OAAA,CAAQ,YAAA;AAAA,IACjB;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,IAAiB,CAAC,KAAK,SAAA,EAAW;AAC7C,MAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,IAAA,CAAK,cAAA,GAAiB,OAAO,CAAA;AAC1D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAc,aAAA,CACZ,OAAA,EACA,OAAA,EACwB;AACxB,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,gCAAA,EAAkC,WAAW,CAAA,EAAG;AAC/E,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,KAAA,CAAM,wBAAA,GAA2B,CAAA,KAAM,OAAA,GAAU,CAAA,CAAE,CAAA;AAAA,MAC3D;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAW,QAAQ,aAAc,CAAA;AAE3D,MAAA,IAAI,MAAA,CAAO,MAAM,YAAA,EAAc;AAC7B,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC3B,QAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,IAAI,CAAA;AAEnC,QAAA,OAAO,OAAO,IAAA,CAAK,YAAA;AAAA,MACrB;AAEA,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AAErB,MAAA,IAAI,KAAA,IAAS,kBAAA,CAAmB,KAAK,CAAA,EAAG;AACtC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,eAAA,KAAoB,CAAC,KAAA,IAAS,gBAAA,CAAiB,KAAK,CAAA,CAAA,EAAI;AAClE,QAAA,MAAM,KAAK,KAAA,EAAM;AACjB,QAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,MAC/B;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,YAAA,CACJ,OAAA,GAAgE,EAAC,EACzC;AACxB,IAAA,MAAM,eAAe,OAAA,CAAQ,YAAA,IAAA,CAAiB,MAAM,IAAA,CAAK,KAAI,GAAI,YAAA;AAEjE,IAAA,OAAO,KAAK,OAAA,CAAQ;AAAA,MAClB,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,MAC5C,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB;AAAC,KACtD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,aAAA,GAAwC;AAC5C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,SAAU,OAAA,CAAQ,YAAA;AAE/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAE,eAAA,EAAiB,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEA,gBAAA,GAAyB;AACvB,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,CAAC,SAAA,EAAU,EAAG;AAEjC,IAAA,IAAA,CAAK,SAAS,WAAA,CAAY,MAAM,KAAK,IAAA,CAAK,IAAA,IAAQ,mBAAmB,CAAA;AAEpE,IAAC,IAAA,CAAK,OAA6C,KAAA,IAAQ;AAE5D,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAI,CAAC,gBAAA,EAAiB,EAAG,KAAK,KAAK,IAAA,EAAK;AAAA,IAC1C,CAAA;AAEC,IAAC,WAAiC,QAAA,CAAS,gBAAA;AAAA,MAC1C,kBAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,aAAA,CAAc,KAAK,MAAM,CAAA;AACzB,MAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,IAChB;AAEA,IAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,SAAA,EAAU,EAAG;AACzC,MAAC,WAAiC,QAAA,CAAS,mBAAA;AAAA,QAC1C,kBAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACP;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,IAAA,GAAsB;AAClC,IAAA,IAAI,gBAAA,EAAiB,IAAK,IAAA,CAAK,QAAA,EAAU;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,GAAA,EAAI;AAE/B,MAAA,IAAI,CAAC,OAAA,EAAS,aAAA,IAAiB,CAAC,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAE3D,MAAA,MAAM,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,MAAM,IAAA,CAAK,mBAAmB,EAAE,eAAA,EAAiB,IAAA,EAAM,CAAA,EAAG;AAAA,QAC1F,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,IAClE;AAAA,EACF;AACF;;;AC3QO,IAAM,sBAAN,MAAqD;AAAA,EAC1D,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,OAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,YAAA,CAAa,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,YAAA,CAAa,WAAW,GAAG,CAAA;AAAA,EAC7B;AACF,CAAA;;;ACZO,IAAM,wBAAN,MAAuD;AAAA,EAC5D,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,OAAO,cAAA,CAAe,QAAQ,GAAG,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,cAAA,CAAe,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,cAAA,CAAe,WAAW,GAAG,CAAA;AAAA,EAC/B;AACF,CAAA;;;ACPO,IAAM,uBAAN,MAAsD;AAAA,EAC1C,KAAA,uBAAY,GAAA,EAAoB;AAAA,EAEjD,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAAA,EAChC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,EACvB;AACF,CAAA;;;ACpBA,IAAM,UAAA,GAAa,UAAA;AAWZ,IAAM,sBAAN,MAAqD;AAAA,EAClD,IAAI,CAAA,EAAmB;AAC7B,IAAA,OAAO,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAqC;AACjD,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAChD,IAAA,OAAO,QAAA,GAAW,QAAA,CAAS,IAAA,EAAK,GAAI,IAAA;AAAA,EACtC;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAa,KAAA,EAA8B;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,MAAM,KAAA,CAAM,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,IAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,WAAW,GAAA,EAA4B;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AAC1C,IAAA,MAAM,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAClC;AACF,CAAA;;;ACTO,IAAM,OAAA,GAAU;AAAA;AAAA,EAErB,KAAA,EAAO,IAAI,mBAAA,EAAoB;AAAA;AAAA,EAE/B,OAAA,EAAS,IAAI,qBAAA,EAAsB;AAAA;AAAA,EAEnC,MAAA,EAAQ,IAAI,oBAAA,EAAqB;AAAA;AAAA,EAEjC,KAAA,EAAO,IAAI,mBAAA;AACb;;;ACzBA,SAAS,cAAA,GAAkC;AACzC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,OAAA,CAAQ,KAAA,GAAQ,IAAI,oBAAA,EAAqB;AAClF;AAQO,IAAM,iBAAN,MAAqB;AAAA,EACjB,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,SAAA,EAAmB,OAAA,EAAyB;AACvE,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,SAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,KAAA;AAC1D,IAAA,MAAM,QAAA,GAAW,OAAA,EAAS,WAAA,EAAa,KAAA,IAAS,OAAO,SAAS,CAAA,MAAA,CAAA;AAChE,IAAA,MAAM,WAAA,GAAc,OAAA,EAAS,WAAA,EAAa,QAAA,IAAY,GAAG,QAAQ,CAAA,SAAA,CAAA;AACjE,IAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,IAAW,cAAA,EAAe;AACnD,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,CAAe,OAAA,EAAS,QAAQ,CAAA;AACpD,IAAA,IAAA,CAAK,OAAO,IAAI,iBAAA;AAAA,MACd,IAAI,UAAA,CAAW;AAAA,QACb,OAAA,EAAS,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,QAChB,MAAA,EAAQ,SAAA;AAAA,QACR,GAAG,OAAA;AAAA,QACH,gBAAgB,CAAC,EAAE,iBAAiB,YAAA,EAAa,KAC/C,QAAQ,YAAA,CAAa;AAAA,UACnB,eAAA;AAAA,UACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB;AAAC,SACxC;AAAA,OACJ,CAAA;AAAA,MACD,OAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAS,SAAA,IAAa,KAAA;AAAA,MACtB,SAAS,WAAA,IAAe;AAAA,KAC1B;AAAA,EACF;AACF;AAQO,IAAM,uBAAN,MAA2B;AAAA,EACvB,IAAA;AAAA,EACA,KAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,OAAA,EAA+B;AAC9E,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,gBAAA,CAAiB,IAAI,WAAW,EAAE,OAAA,EAAS,CAAA,EAAG,IAAI,SAAS,MAAA,EAAQ,UAAA,EAAY,GAAG,OAAA,EAAS,CAAC,CAAA;AAC5G,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,IAAI,WAAW,EAAE,OAAA,EAAS,CAAA,EAAG,IAAI,UAAU,MAAA,EAAQ,UAAA,EAAY,GAAG,OAAA,EAAS,CAAC,CAAA;AAAA,EAC3G;AACF;;;AC1DA,IAAM,gBAAA,GAAmB;AAAA,EACvB,eAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AA4BO,SAAS,mBACd,GAAA,EACwB;AACxB,EAAA,MAAM,SAAiC,EAAC;AAGxC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,GAAA,YAAe,OAAA,EAAS;AAC5D,IAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC/B,MAAA,IAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAAA,IACzB;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,cAAe,GAAA,CAAiC,OAAA;AACtD,EAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,IAAA,MAAM,GAAA,GAAM,YAAY,GAAG,CAAA;AAC3B,IAAA,IAAI,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAK,GAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAA;AACT;;;AC7DO,IAAM,kBAAA,GAAqB;AAAA,EAChC,eAAA,EAAiB,yDAAA;AAAA,EACjB,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAUA,SAAS,eAAe,QAAA,EAAiD;AACvE,EAAA,OAAO,OAAQ,SAA8B,SAAA,KAAc,UAAA;AAC7D;AAEA,SAAS,cAAc,QAAA,EAAgD;AACrE,EAAA,MAAM,UAAW,QAAA,CAA6B,OAAA;AAE9C,EAAA,OAAO,OAAO,SAAS,GAAA,KAAQ,UAAA;AACjC;AA2CO,SAAS,sBAAyB,QAAA,EAAgB;AACvD,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA;AAEjD,EAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,EAAG;AAC3B,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,SAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,EACvE,CAAA,MAAA,IAAW,cAAA,CAAe,QAAQ,CAAA,EAAG;AACnC,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,SAAS,QAAA,CAAS,SAAA,CAAU,MAAM,KAAK,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,QAAA;AACT;;;ACrCO,SAAS,YAAA,CACd,GAAA,EACA,SAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAO,IAAI,cAAA,CAAe,GAAA,EAAK,SAAA,EAAW,OAAO,CAAA;AACnD;AAmBO,SAAS,kBAAA,CACd,GAAA,EACA,UAAA,EACA,OAAA,EACsB;AACtB,EAAA,OAAO,IAAI,oBAAA,CAAqB,GAAA,EAAK,UAAA,EAAY,OAAO,CAAA;AAC1D","file":"index.mjs","sourcesContent":["import type { ErrorCode } from '../error-codes'\n\n/**\n * Thrown when `throwErrors: true` is set and the API returns an error response.\n *\n * Mirrors the same `{ code, message, status_code }` shape returned by default —\n * the only difference is delivery: exception vs. discriminated union.\n *\n * @example\n * import { NulvlessException } from '@nulvless/nulvless-js'\n *\n * try {\n * const { data } = await nulvless.auth.signIn({ email, password })\n * } catch (err) {\n * if (err instanceof NulvlessException) {\n * console.error(err.code, err.status_code, err.message)\n * }\n * }\n */\nexport class NulvlessException extends Error {\n readonly code: ErrorCode\n readonly status_code: number\n\n constructor(message: string | string[], code: ErrorCode, status_code: number) {\n super(Array.isArray(message) ? message.join(', ') : message)\n this.name = 'NulvlessException'\n this.code = code\n this.status_code = status_code\n }\n}\n","import type { ClientOptions, Language, NulvlessError, NulvlessResult } from './types'\nimport { NulvlessException } from './exceptions/nulvless.exception'\n\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n\ntype QueryValue = string | number | boolean\ntype QueryParams = Record<string, QueryValue | QueryValue[] | undefined>\n\nconst DOT_SEGMENT = /(^|\\/)\\.{1,2}(\\/|$)/\n\ninterface SendOptions {\n query?: QueryParams\n /** Override or add headers for this request. Merged over client-level headers. */\n headers?: Record<string, string>\n body?: unknown\n /** Override the language header for this request. */\n language?: () => Language\n /** Override the throwErrors strategy for this request. */\n throwErrors?: boolean\n /** Abort this request after the given number of milliseconds. Overrides the client-level timeout. */\n timeout?: number\n /** Single-use sudo nonce, sent as the `nlv-sudo-nonce` header. */\n nonce?: string | undefined\n /** Omit the `x-platform-key` header — for public endpoints that don't require it. */\n skipApiKey?: boolean\n}\n\nfunction resolveConfigHeaders(\n value: Record<string, string> | (() => Record<string, string>) | undefined,\n): Record<string, string> | undefined {\n return typeof value === 'function' ? value() : value\n}\n\nfunction mergeHeaders(...sources: Array<Record<string, string> | undefined>): Record<string, string> {\n const merged = new Map<string, [name: string, value: string]>()\n\n for (const source of sources) {\n for (const [name, value] of Object.entries(source ?? {})) {\n merged.set(name.toLowerCase(), [name, value])\n }\n }\n\n return Object.fromEntries(merged.values())\n}\n\nfunction findHeader(headers: Record<string, string> | undefined, name: string): string | undefined {\n const wanted = name.toLowerCase()\n\n return Object.entries(headers ?? {}).find(([key]) => key.toLowerCase() === wanted)?.[1]\n}\n\nexport function route(strings: TemplateStringsArray, ...values: Array<string | number>): string {\n return strings.reduce((path, part, index) => path + encodeURIComponent(String(values[index - 1])) + part)\n}\n\nclass InvalidPathError extends Error {\n constructor(path: string) {\n super(`Path parameters cannot be \".\" or \"..\": ${path}`)\n this.name = 'InvalidPathError'\n }\n}\n\nexport interface HttpClientConfig extends ClientOptions {\n baseUrl: string\n apiKey: string\n /**\n * Called when a request fails with a retryable auth error (401 or specific 403 codes).\n * Should return a fresh access token, or `null` if refresh is not possible.\n * The request is retried once with the new token.\n *\n * `deauthOnFailure` is `true` for 401/unauthorized (token is invalid — clear session\n * and notify if refresh fails) and `false` for 403/forbidden_resource_access (token\n * is valid but lacks the scope — refresh once to pick up new scopes, but never\n * deauthenticate; surface the API error instead).\n */\n onTokenExpired?: (context: {\n deauthOnFailure: boolean\n expiredToken?: string\n }) => Promise<string | null>\n}\n\nfunction toError(err: unknown, timeout?: number): NulvlessError {\n if (err instanceof InvalidPathError) {\n return { code: 'invalid_path', message: err.message, status_code: 400 }\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return {\n code: 'request_timeout',\n message: `Request timed out after ${timeout ?? 0}ms`,\n status_code: 408,\n }\n }\n return {\n code: 'network_error',\n message: err instanceof Error ? err.message : 'Network request failed',\n status_code: 0,\n }\n}\n\nfunction extractErrorPayload(\n body: unknown,\n fallback: string,\n): Pick<NulvlessError, 'code' | 'message'> {\n if (typeof body !== 'object' || body === null) {\n return { code: 'unknown_error', message: fallback }\n }\n\n const record = body as Record<string, unknown>\n\n const code = typeof record['code'] === 'string' ? record['code'] : 'unknown_error'\n\n const message =\n typeof record['message'] === 'string' || Array.isArray(record['message'])\n ? (record['message'] as string | string[])\n : fallback\n\n return { code, message }\n}\n\nexport class HttpClient {\n private readonly config: HttpClientConfig\n private onSudoRequired?: () => void\n\n constructor(config: HttpClientConfig) {\n this.config = {\n ...config,\n baseUrl: config.baseUrl.replace(/\\/+$/, ''),\n }\n }\n\n /**\n * Injected after construction to avoid circular dependency.\n * Called when a request fails with `403 protected_action_denied`,\n * indicating the user must enable sudo mode before retrying.\n */\n setOnSudoRequired(cb: () => void): void {\n this.onSudoRequired = cb\n }\n\n hasAuthorization(headers?: Record<string, string>): boolean {\n return (\n findHeader(headers, 'Authorization') !== undefined ||\n findHeader(resolveConfigHeaders(this.config.headers), 'Authorization') !== undefined\n )\n }\n\n async get<T>(path: string, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('GET', path, options)\n }\n\n async post<T>(path: string, body?: unknown, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('POST', path, { ...options, body })\n }\n\n async put<T>(path: string, body?: unknown, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('PUT', path, { ...options, body })\n }\n\n async patch<T>(path: string, body?: unknown, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('PATCH', path, { ...options, body })\n }\n\n async delete<T>(path: string, options?: Omit<SendOptions, 'body'>): Promise<NulvlessResult<T>> {\n return this.send<T>('DELETE', path, options)\n }\n\n /**\n * Returns `true` when the error warrants a single token-refresh retry:\n * - Any 401 on an authenticated request\n * - 403 with `forbidden_access_waiting_accept` or `forbidden_resource_access` codes\n */\n private shouldRetryWithRefresh(\n status: number,\n code: string,\n headers: Record<string, string>,\n ): boolean {\n if (!findHeader(headers, 'Authorization')) return false\n if (status === 401) return true\n if (status === 403 && ['forbidden_resource_access', 'forbidden_access_waiting_accept'].includes(code)) return true\n return false\n }\n\n private async send<T>(method: HttpMethod, path: string, options: SendOptions = {}, isRetry = false): Promise<NulvlessResult<T>> {\n const headers = this.buildHeaders(options.headers, options.language, options.nonce, options.skipApiKey)\n\n const shouldThrow = options.throwErrors ?? this.config.throwErrors ?? false\n\n const timeout = options.timeout ?? this.config.timeout\n const controller = new AbortController()\n const timeoutHandle =\n timeout && timeout > 0\n ? setTimeout(() => controller.abort(), timeout)\n : undefined\n\n const start = Date.now()\n\n if (this.config.debug) {\n console.debug(`[nulvless] → ${method} ${path}`)\n }\n\n try {\n const url = this.buildUrl(path, options.query)\n const init: RequestInit = { method, headers, signal: controller.signal }\n\n if (options.body !== undefined) {\n const contentType = findHeader(headers, 'Content-Type')\n\n if (contentType === 'application/x-www-form-urlencoded') {\n init.body = new URLSearchParams(options.body as Record<string, string>).toString()\n } else {\n init.body = JSON.stringify(options.body)\n }\n }\n\n const response = await fetch(url, init)\n const body = await this.parseBody(response)\n\n if (this.config.debug) {\n console.debug(`[nulvless] ← ${method} ${path} ${response.status} (${Date.now() - start}ms)`)\n }\n\n if (!response.ok) {\n const { code, message } = extractErrorPayload(body, response.statusText)\n const error: NulvlessError = { code, message, status_code: response.status }\n\n // Reactive refresh: on specific 401/403 responses, refresh once and retry.\n if (\n !isRetry &&\n this.config.onTokenExpired &&\n this.shouldRetryWithRefresh(response.status, code, headers)\n ) {\n const deauthOnFailure = response.status === 401\n const expiredToken = findHeader(headers, 'Authorization')?.replace(/^Bearer\\s+/i, '')\n const newToken = await this.config.onTokenExpired({\n deauthOnFailure,\n ...(expiredToken ? { expiredToken } : {}),\n })\n if (newToken) {\n return this.send<T>(\n method,\n path,\n { ...options, headers: mergeHeaders(options.headers, { Authorization: `Bearer ${newToken}` }) },\n true,\n )\n }\n }\n\n if (response.status === 403 && code === 'protected_action_denied') {\n this.onSudoRequired?.()\n }\n\n if (shouldThrow) {\n throw new NulvlessException(message, code, response.status)\n }\n\n return { data: null, error }\n }\n\n return { data: body as T, error: null }\n } catch (err) {\n if (err instanceof NulvlessException) throw err\n\n const error = toError(err, timeout)\n\n if (shouldThrow) {\n throw new NulvlessException(error.message, error.code, error.status_code)\n }\n\n return { data: null, error }\n } finally {\n clearTimeout(timeoutHandle)\n }\n }\n\n private buildUrl(path: string, query?: QueryParams): string {\n if (DOT_SEGMENT.test(path)) throw new InvalidPathError(path)\n\n const url = new URL(`${this.config.baseUrl}/${path.replace(/^\\/+/, '')}`)\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue\n const values = Array.isArray(value) ? value : [value]\n for (const v of values) {\n url.searchParams.append(Array.isArray(value) ? `${key}[]` : key, String(v))\n }\n }\n }\n\n return url.toString()\n }\n\n private buildHeaders(\n extra?: Record<string, string>,\n languageOverride?: () => Language,\n nonce?: string,\n skipApiKey?: boolean,\n ): Record<string, string> {\n const language = languageOverride?.() ?? this.config.language?.() ?? 'en-US'\n\n return mergeHeaders(\n {\n 'Content-Type': 'application/json',\n ...(skipApiKey ? {} : { 'x-platform-key': this.config.apiKey }),\n 'nlv-lang': language,\n ...(this.config.trackUser !== undefined\n ? { 'nlv-user-tracking': String(this.config.trackUser) }\n : {}),\n ...(nonce ? { 'nlv-sudo-nonce': nonce } : {}),\n },\n resolveConfigHeaders(this.config.headers),\n extra,\n )\n }\n\n private async parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? ''\n if (!contentType.includes('json')) return null\n\n try {\n return await response.json()\n } catch {\n return null\n }\n }\n}\n","export interface TabMessage<T> {\n event: string\n payload: T\n}\n\ninterface Channel {\n postMessage(message: unknown): void\n close(): void\n addEventListener(type: 'message', handler: (event: { data: unknown }) => void): void\n}\n\ninterface ChannelConstructor {\n new (name: string): Channel\n}\n\nexport class TabChannel<T> {\n private channel: Channel | null\n\n constructor(name: string, onMessage: (message: TabMessage<T>) => void) {\n const Ctor = (globalThis as { BroadcastChannel?: ChannelConstructor }).BroadcastChannel\n\n if (!Ctor) {\n this.channel = null\n return\n }\n\n try {\n this.channel = new Ctor(name)\n } catch {\n this.channel = null\n return\n }\n\n this.channel.addEventListener('message', event => {\n onMessage(event.data as TabMessage<T>)\n })\n\n ;(this.channel as unknown as { unref?: () => void }).unref?.()\n }\n\n post(message: TabMessage<T>): void {\n try {\n this.channel?.postMessage(message)\n } catch {\n this.channel = null\n }\n }\n\n close(): void {\n this.channel?.close()\n }\n}\n","import type { HttpClient } from '../http'\nimport type { NulvlessError, RequestOptions } from '../types'\n\nexport type BearerResolution =\n | { ok: true; headers: Record<string, string> }\n | { ok: false; error: NulvlessError }\n\nconst NO_SESSION_ERROR: NulvlessError = {\n code: 'no_session',\n message: 'No active session.',\n status_code: 401,\n}\n\nexport async function resolveBearer(\n http: HttpClient,\n getToken: () => Promise<string | null>,\n options?: RequestOptions,\n): Promise<BearerResolution> {\n if (http.hasAuthorization(options?.headers)) return { ok: true, headers: {} }\n\n const token = await getToken()\n\n if (!token) return { ok: false, error: { ...NO_SESSION_ERROR } }\n\n return { ok: true, headers: { Authorization: `Bearer ${token}` } }\n}\n\nexport abstract class AuthSubClient {\n constructor(\n protected readonly http: HttpClient,\n protected readonly getToken: () => Promise<string | null>,\n ) {}\n\n protected bearer(options?: RequestOptions): Promise<BearerResolution> {\n return resolveBearer(this.http, this.getToken, options)\n }\n}\n","import { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n AuthMethod,\n EnableFactorParams,\n EnrollFactorParams,\n FactorEnrollment,\n Nonce,\n UnenrollFactorParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * MFA factor management.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class FactorsClient extends AuthSubClient {\n\n /**\n * Lists all configured MFA factors for the authenticated user.\n */\n async list(options?: RequestOptions): Promise<NulvlessResult<AuthMethod[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<AuthMethod[]>('/factors', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns the user's recovery codes.\n *\n * Requires sudo: `MANAGE_MFA`.\n */\n async getRecoveryCodes(\n params?: Nonce,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ codes: string[] }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<{ codes: string[] }>('/factors/codes', {\n ...options,\n nonce: params?.nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Deletes (invalidates) the user's recovery codes.\n *\n * Requires sudo: `MANAGE_MFA`.\n */\n async deleteRecoveryCodes(params?: Nonce, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.delete<null>('/factors/codes', {\n ...options,\n nonce: params?.nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Begins enrolling a new MFA factor. Returns credentials needed to configure\n * the factor on the user's device.\n *\n * For TOTP: use `secret` for manual entry or `url` to generate a QR code.\n * For SMS: pass `phone` to send the codes to a number other than the user's.\n *\n * A user holds up to 10 authenticator apps and SMS factors combined, and one\n * email factor and one set of recovery codes.\n *\n * After the user configures their device, call `enable` with the `token` and\n * the first OTP code to activate the factor.\n *\n * Requires sudo: `MANAGE_MFA`.\n *\n * @example\n * const { data } = await nulvless.auth.factors.enroll({ type: 'totp', name: 'My Authenticator' })\n * // data.url → QR code provisioning URL\n * // data.secret → manual entry secret\n * // data.token → pass to factors.enable\n */\n async enroll(params: EnrollFactorParams, options?: RequestOptions): Promise<NulvlessResult<FactorEnrollment>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, type, name, phone } = params\n const body = { ...(name ? { name } : {}), ...(phone ? { phone } : {}) }\n return this.http.post<FactorEnrollment>(route`/factors/${type}`, body, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Activates a pending factor enrollment by confirming the first OTP code.\n *\n * Pass the `token` from `enroll` and the code generated by the user's device.\n */\n async enable(params: EnableFactorParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<null>('/factors', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Unenrolls (removes) an MFA factor by its ID.\n *\n * Use `factors.list()` to retrieve the factor `id` before calling this.\n * Returns the removed factor.\n *\n * Requires sudo: `MANAGE_MFA`.\n *\n * @example\n * const { data: factors } = await nulvless.auth.factors.list()\n * const totp = factors?.find(f => f.type === 'totp')\n * if (totp?.id) await nulvless.auth.factors.unenroll({ id: totp.id })\n */\n async unenroll(params: UnenrollFactorParams, options?: RequestOptions): Promise<NulvlessResult<AuthMethod>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<AuthMethod>(route`/factors/${id}`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n}\n","import { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n AddEmailIdentityParams,\n AddPhoneIdentityParams,\n Challenge,\n Identity,\n IdentityType,\n RemoveIdentityParams,\n SendOTPToUpdateEmailParams,\n SendOTPToUpdatePhoneParams,\n UpdateIdentityParams,\n User,\n UserProfile,\n VerifyChallengeParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Current-user management.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class UsersClient extends AuthSubClient {\n\n /**\n * Returns the authenticated user's full profile.\n */\n async me(options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<User>('/users/me', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Updates the authenticated user's profile fields.\n *\n * Omit fields to leave them unchanged.\n */\n async update(\n params: { username?: string; profile?: UserProfile },\n options?: RequestOptions,\n ): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<User>('/users', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Lists all identities (email, phone, OAuth) linked to the authenticated user.\n *\n * @param type Filter by identity type: `'email'`, `'phone'`, or `'oauth'`.\n */\n async getIdentities(type?: IdentityType, options?: RequestOptions): Promise<NulvlessResult<Identity[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Identity[]>('/users/identities', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n ...(type ? { query: { type } } : {}),\n })\n }\n\n /**\n * Initiates adding a new email identity. Sends an OTP to the provided address.\n *\n * Complete the flow with `verifyIdentity`.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async addEmailIdentity(\n params: AddEmailIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Challenge>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, email } = params\n return this.http.post<Challenge>('/users/identities/emails', { email }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Initiates adding a new phone identity. Sends an OTP to the provided number.\n *\n * Complete the flow with `verifyIdentity`.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async addPhoneIdentity(\n params: AddPhoneIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Challenge>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, phone } = params\n return this.http.post<Challenge>('/users/identities/phones', phone, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Confirms an identity addition by submitting the OTP received via\n * `addEmailIdentity` or `addPhoneIdentity`.\n */\n async verifyIdentity(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<User>('/users/identities/verify', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Updates an identity — currently used to set an identity as primary.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async updateIdentity(\n params: UpdateIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id, primary } = params\n return this.http.patch<User>(route`/users/identities/${id}`, { primary }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Unlinks (removes) an identity from the authenticated user.\n *\n * Requires sudo: `MANAGE_IDENTITIES`.\n */\n async removeIdentity(\n params: RemoveIdentityParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Identity>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<Identity>(route`/users/identities/${id}`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Sends an OTP to the new email address to initiate an email change.\n *\n * Complete the flow with `confirmEmailUpdate`.\n *\n * Requires sudo: `MANAGE_CREDENTIALS`.\n */\n async sendOTPToUpdateEmail(\n params: SendOTPToUpdateEmailParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ token: string }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, email } = params\n return this.http.post<{ token: string }>('/users/emails/code/send', { email }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Confirms an email change by submitting the OTP received via `sendOTPToUpdateEmail`.\n */\n async confirmEmailUpdate(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<User>('/users/emails/code/confirm', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Sends an OTP to the new phone number to initiate a phone change.\n *\n * Complete the flow with `confirmPhoneUpdate`.\n *\n * Requires sudo: `MANAGE_CREDENTIALS`.\n */\n async sendOTPToUpdatePhone(\n params: SendOTPToUpdatePhoneParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ token: string }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, phone } = params\n return this.http.post<{ token: string }>('/users/phones/code/send', phone, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Confirms a phone change by submitting the OTP received via `sendOTPToUpdatePhone`.\n */\n async confirmPhoneUpdate(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<User>('/users/phones/code/confirm', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n Authenticated,\n Challenge,\n Nonce,\n RevokeSessionParams,\n Session,\n SudoMethod,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Active session management for the authenticated user.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class SessionsClient extends AuthSubClient {\n constructor(\n http: HttpClient,\n getToken: () => Promise<string | null>,\n private readonly persist: (\n result: NulvlessResult<Authenticated>,\n ) => Promise<NulvlessResult<Authenticated>>,\n ) {\n super(http, getToken)\n }\n\n /**\n * Returns all active sessions for the authenticated user across all devices.\n * The current session is marked with `is_current_session: true`.\n */\n async list(options?: RequestOptions): Promise<NulvlessResult<Session[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Session[]>('/sessions', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Revokes (invalidates) a specific session by its ID.\n *\n * Use `auth.getSession()` to get the current session ID.\n *\n * Requires sudo: `MANAGE_SESSIONS`.\n */\n async revoke(params: RevokeSessionParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<null>(route`/sessions/${id}`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Starts a sudo elevation by requesting a verification challenge.\n *\n * The available methods are derived from what the user has (TOTP if active,\n * email OTP, SMS OTP). Pass `method` to request a specific one; if omitted and\n * the user has a single method it is emitted automatically, otherwise an empty\n * challenge is returned so the user can pick which one to send.\n *\n * Prompt the user for the code, then call `sudoVerify({ code })` to complete\n * the elevation. The verify response carries `sudo.expires_in` (seconds until\n * sudo mode expires) alongside the refreshed session tokens.\n *\n * @example\n * const { data } = await nulvless.auth.sessions.sudo() // or sudo('email_otp')\n * // prompt the user for the code, then call sudoVerify({ code })\n */\n async sudo(\n method?: SudoMethod,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ challenge: Challenge }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<{ challenge: Challenge }>('/sessions/sudo/request', {\n ...options,\n ...(method ? { query: { method } } : {}),\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Completes a sudo elevation started by `sudo()`. Submit the `code` the user\n * received (or read from their authenticator) — the pending sudo challenge is\n * resolved by the current session, so no challenge token is needed.\n *\n * On success the session is re-issued with sudo mode active and stored\n * automatically; `data.sudo.expires_in` carries the seconds until it expires.\n *\n * @example\n * const { data } = await nulvless.auth.sessions.sudoVerify({ code })\n * // data.sudo?.expires_in → 300\n */\n async sudoVerify(\n params: { code: string },\n options?: RequestOptions,\n ): Promise<NulvlessResult<Authenticated>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.persist(\n await this.http.post<Authenticated>('/sessions/sudo/verify', params, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n }),\n )\n }\n\n /**\n * Verifies that sudo mode is currently active for the session.\n *\n * Returns `204 No Content` on success. Returns an error if sudo is not active.\n *\n * @example\n * const { error } = await nulvless.auth.sessions.checkSudo()\n * if (error) {\n * // Start the sudo flow: sessions.sudo() → sessions.sudoVerify\n * }\n */\n async checkSudo(params?: Nonce, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<null>('/sessions/sudo', {\n ...options,\n nonce: params?.nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { NulvlessResult, RequestOptions } from '../../types'\nimport type { ChangePasswordParams } from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Account security operations (password).\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n *\n * All methods require authentication. Pass `options.headers.Authorization` on\n * the server, or rely on the configured storage for automatic token injection.\n */\nexport class SecurityClient extends AuthSubClient {\n\n /**\n * Changes the authenticated user's password.\n *\n * @example\n * await nulvless.auth.security.changePassword({\n * password: 'current-password',\n * new_password: 'new-password',\n * })\n */\n async changePassword(params: ChangePasswordParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, ...body } = params\n return this.http.put<null>('/security/password', body, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n Authenticated,\n Challenge,\n ChangeChallengeParams,\n CreateChallengeParams,\n VerifyChallengeParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Challenge lifecycle — create, inspect, switch method, and verify.\n *\n * Mirrors the `/challenges` resource. Used by MFA, OTP sign-in, sign-up\n * confirmation and step-up (sudo) flows.\n *\n * Available on both `createClient` (browser) and `createServerClient` (server).\n */\nexport class ChallengesClient extends AuthSubClient {\n constructor(\n http: HttpClient,\n getToken: () => Promise<string | null>,\n private readonly persist: (\n result: NulvlessResult<Authenticated>,\n ) => Promise<NulvlessResult<Authenticated>>,\n ) {\n super(http, getToken)\n }\n\n /**\n * Creates a verification challenge for the given MFA method (step-up).\n *\n * Requires an authenticated session. Prompt the user for the code, then call\n * `verify({ token, code })`.\n *\n * A `totp` challenge accepts a code from any of the user's authenticator\n * apps. For `sms_otp`, pass `factor_id` to pick which phone receives it.\n *\n * @example\n * const { data } = await nulvless.auth.challenges.create({ type: 'totp' })\n * const { data: sms } = await nulvless.auth.challenges.create({ type: 'sms_otp', factor_id })\n */\n async create(\n params: CreateChallengeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ challenge: Challenge }>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<{ challenge: Challenge }>(route`/challenges/${params.type}`, undefined, {\n ...options,\n ...(params.factor_id ? { query: { factor_id: params.factor_id } } : {}),\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Retrieves the current state of a challenge by its token.\n */\n get(token: string, options?: RequestOptions): Promise<NulvlessResult<Challenge>> {\n return this.http.get<Challenge>('/challenges', { ...options, query: { token } })\n }\n\n /**\n * Switches the preferred MFA method for an ongoing challenge.\n *\n * @example\n * const { data } = await nulvless.auth.challenges.change({ token, type: 'totp' })\n */\n change(\n params: ChangeChallengeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ challenge: Challenge }>> {\n return this.http.patch<{ challenge: Challenge }>(\n route`/challenges/${params.type}`,\n { token: params.token },\n params.factor_id\n ? { ...options, query: { factor_id: params.factor_id } }\n : options,\n )\n }\n\n /**\n * Verifies a challenge by submitting the token and the code entered by the user.\n *\n * Used for OTP sign-in, MFA verification after `signIn`, and sign-up\n * confirmation. Session is stored automatically when the response contains an\n * access token.\n */\n async verify(\n params: VerifyChallengeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Authenticated>> {\n return this.persist(await this.http.post<Authenticated>('/challenges/verify', params, options))\n }\n}\n","import { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n BlockGrantParams,\n InviteParams,\n Grant,\n GrantMembers,\n LeaveGrantParams,\n RevokeGrantParams,\n UpdateGrantParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Grant management for the authenticated user.\n *\n * Available on `createServerClient` only (requires private key `sk_`).\n *\n * All methods require authentication. Pass `options.headers.Authorization` to\n * forward the user's bearer token on each server-side call.\n */\nexport class GrantsClient extends AuthSubClient {\n\n /**\n * Returns all grants granted to the authenticated user, optionally\n * filtered by context.\n */\n async list(context?: string, options?: RequestOptions): Promise<NulvlessResult<Grant[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Grant[]>('/grants', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n ...(context ? { query: { context } } : {}),\n })\n }\n\n /**\n * Returns all grants for a given resource, grouped by status\n * (granted, invited, requested, blocked).\n *\n * The authenticated user must own or manage the resource.\n */\n async getMembers(resource: string, options?: RequestOptions): Promise<NulvlessResult<GrantMembers>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<GrantMembers>('/grants/members', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: { resource },\n })\n }\n\n /**\n * Creates grant invitations for one or more users on a resource.\n *\n * Each invite sends a notification to the target email address.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n *\n * @example\n * await nulvless.auth.grants.invite({\n * resource: 'project-123',\n * invites: [{ email: 'user@example.com', scopes: ['read', 'write'] }],\n * })\n */\n async invite(params: InviteParams, options?: RequestOptions): Promise<NulvlessResult<Grant[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, ...body } = params\n return this.http.post<Grant[]>('/grants/invites', {\n ...body,\n ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}),\n }, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns a single grant by ID.\n */\n async get(id: string, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<Grant>(route`/grants/${id}`, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Revokes (removes) a grant.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async revoke(params: RevokeGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.delete<Grant>(route`/grants/${id}/revoke`, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Accepts a pending invitation (`status: 'invited'`).\n */\n async accept(id: string, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<Grant>(route`/grants/${id}/accept`, undefined, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Cancels a pending invitation or request (`status: 'invited'` or `'requested'`).\n */\n async cancel(id: string, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.patch<Grant>(route`/grants/${id}/cancel`, undefined, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Blocks a grant.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async block(params: BlockGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.patch<Grant>(route`/grants/${id}/block`, undefined, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Updates the scopes of an existing grant.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async update(id: string, params: UpdateGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, ...body } = params\n return this.http.patch<Grant>(route`/grants/${id}`, body, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Removes the authenticated user from a resource they were granted access to.\n *\n * Requires sudo: `MANAGE_GRANTS`.\n */\n async leave(params: LeaveGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n const { nonce, id } = params\n return this.http.patch<Grant>(route`/grants/${id}/leave`, undefined, {\n ...options,\n nonce,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n ExchangeOAuthCodeParams,\n OAuthApp,\n OAuthAuthorization,\n OAuthAuthorizeParams,\n OAuthConsentAction,\n OAuthConsentResult,\n OAuthDiscovery,\n OAuthJWKS,\n OAuthTokenResponse,\n OAuthUserGrant,\n OAuthUserInfo,\n RefreshOAuthTokenParams,\n RegisterOAuthAppParams,\n} from '../types'\nimport { AuthSubClient } from '../base'\n\n/**\n * Manages the OAuth apps the authenticated user has authorized\n * (`/user/oauth/grants`). Requires authentication (bearer token).\n */\nexport class OAuthGrantsClient extends AuthSubClient {\n /**\n * Lists the apps the authenticated user has granted access to.\n */\n async list(options?: RequestOptions): Promise<NulvlessResult<OAuthUserGrant[]>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<OAuthUserGrant[]>('/user/oauth/grants', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Revokes a previously granted app by its public `client_id`.\n * Also invalidates the app's active sessions for this user.\n */\n async revoke(clientId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.delete<null>('/user/oauth/grants', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: { client_id: clientId },\n })\n }\n}\n\n/**\n * The project's OAuth 2.1 / OpenID Connect provider surface — the project\n * acting as an identity provider for third-party applications.\n *\n * Available with both public (`pk_`) and private (`sk_`) keys.\n *\n * Method scopes:\n * - `token`, `register` — platform key only (no bearer token).\n * - `getAuthorization`, `consent`, `userinfo`, and the `grants` namespace —\n * authenticated user (bearer token).\n * - `discovery`, `jwks` — public OIDC metadata (no auth).\n *\n * The `/oauth/authorize` entry point is a browser redirect (302), not a JSON\n * API — build it from `discovery().authorization_endpoint` and redirect the\n * user agent there.\n */\nexport class OAuthClient extends AuthSubClient {\n /** Apps the authenticated user has authorized — list and revoke. */\n readonly grants: OAuthGrantsClient\n\n constructor(http: HttpClient, getToken: () => Promise<string | null>) {\n super(http, getToken)\n this.grants = new OAuthGrantsClient(http, getToken)\n }\n\n /**\n * Builds the OAuth authorization URL and, in the browser, redirects the user\n * agent to it. On the server the URL is returned for manual handling.\n *\n * Mirrors `auth.authorize` (social sign-in): redirects automatically in the\n * browser, returns `data.url` on the server. The endpoint itself is a 302\n * redirect, so the URL is composed from the discovery `authorization_endpoint`.\n *\n * PKCE is required (RFC 7636, https://www.rfc-editor.org/rfc/rfc7636): provide\n * `code_challenge` = BASE64URL(SHA256(code_verifier)) with\n * `code_challenge_method: 'S256'`. Send the `code_verifier` later to\n * `exchangeCodeForToken`.\n *\n * @example\n * // Browser — redirects automatically\n * await nulvless.auth.oauth.authorize({ client_id, redirect_uri, code_challenge, code_challenge_method: 'S256' })\n *\n * // Server — use the returned URL\n * const { data } = await nulvless.auth.oauth.authorize(params)\n * return Response.redirect(data.url)\n */\n async authorize(params: OAuthAuthorizeParams, options?: RequestOptions): Promise<NulvlessResult<{ url: string }>> {\n const discovery = await this.discovery(options)\n if (discovery.error) return { data: null, error: discovery.error }\n\n const url = new URL(discovery.data.authorization_endpoint)\n const query: Record<string, string | undefined> = {\n client_id: params.client_id,\n redirect_uri: params.redirect_uri,\n response_type: params.response_type ?? 'code',\n code_challenge: params.code_challenge,\n code_challenge_method: params.code_challenge_method,\n scope: params.scope,\n state: params.state,\n resource: params.resource,\n nonce: params.nonce,\n prompt: params.prompt,\n max_age: params.max_age === undefined ? undefined : String(params.max_age),\n }\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined) url.searchParams.set(key, value)\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = url.toString()\n }\n\n return { data: { url: url.toString() }, error: null }\n }\n\n /**\n * Exchanges an authorization code for tokens\n * (`POST /oauth/token`, `grant_type=authorization_code`).\n *\n * Called by the relying-party app after the user is redirected back with the\n * `code`. PKCE `code_verifier` is required; `client_secret` only for\n * confidential clients. Public endpoint — no platform key.\n */\n exchangeCodeForToken(\n params: ExchangeOAuthCodeParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<OAuthTokenResponse>> {\n return this.http.post<OAuthTokenResponse>(\n '/oauth/token',\n { grant_type: 'authorization_code', ...params },\n { ...options, skipApiKey: true },\n )\n }\n\n /**\n * Refreshes an access token using a refresh token\n * (`POST /oauth/token`, `grant_type=refresh_token`).\n *\n * `client_secret` only for confidential clients. Public endpoint — no\n * platform key.\n */\n refreshToken(\n params: RefreshOAuthTokenParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<OAuthTokenResponse>> {\n return this.http.post<OAuthTokenResponse>(\n '/oauth/token',\n { grant_type: 'refresh_token', ...params },\n { ...options, skipApiKey: true },\n )\n }\n\n /**\n * Dynamically registers a new OAuth app (RFC 7591, `POST /oauth/register`).\n *\n * Requires the OAuth server to be enabled with dynamic client registration\n * allowed. For server-side managed registration use `admin.oauthClients`.\n */\n register(params: RegisterOAuthAppParams, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n // Public endpoint (RFC 7591), gated server-side by config — no platform key.\n return this.http.post<OAuthApp>('/oauth/register', params, { ...options, skipApiKey: true })\n }\n\n /**\n * Loads a pending authorization for the consent screen\n * (`GET /oauth/authorizations/:id`).\n *\n * Claims the authorization for the authenticated user. When a matching\n * consent already exists it is auto-approved and `redirect.uri` is returned.\n *\n * Requires authentication.\n */\n async getAuthorization(authorizationId: string, options?: RequestOptions): Promise<NulvlessResult<OAuthAuthorization>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<OAuthAuthorization>(route`/oauth/authorizations/${authorizationId}`, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Approves or denies a pending authorization\n * (`POST /oauth/authorizations/:id/consent`).\n *\n * Returns the `redirect.uri` to send the user agent back to (carrying the\n * authorization `code` on approve, or `error=access_denied` on deny).\n *\n * Requires authentication.\n */\n async consent(\n authorizationId: string,\n action: OAuthConsentAction,\n options?: RequestOptions,\n ): Promise<NulvlessResult<OAuthConsentResult>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.post<OAuthConsentResult>(route`/oauth/authorizations/${authorizationId}/consent`, { action }, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns OIDC UserInfo claims for the access token (`GET /oauth/userinfo`).\n *\n * The access token must have been issued with the `openid` scope.\n *\n * Requires authentication.\n */\n async userinfo(options?: RequestOptions): Promise<NulvlessResult<OAuthUserInfo>> {\n const auth = await this.bearer(options)\n if (!auth.ok) return { data: null, error: auth.error }\n return this.http.get<OAuthUserInfo>('/oauth/userinfo', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Returns the OpenID Connect discovery document\n * (`GET /.well-known/openid-configuration`). Public — no auth required.\n */\n discovery(options?: RequestOptions): Promise<NulvlessResult<OAuthDiscovery>> {\n // Public OIDC metadata — no platform key.\n return this.http.get<OAuthDiscovery>('/.well-known/openid-configuration', { ...options, skipApiKey: true })\n }\n\n /**\n * Returns the JSON Web Key Set used to verify issued tokens\n * (`GET /.well-known/jwks.json`). Public — no auth required.\n */\n jwks(options?: RequestOptions): Promise<NulvlessResult<OAuthJWKS>> {\n // Public OIDC metadata — no platform key.\n return this.http.get<OAuthJWKS>('/.well-known/jwks.json', { ...options, skipApiKey: true })\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n AdminCreateUserParams,\n AdminUpdateUserParams,\n AuthMethod,\n CreateRoleParams,\n OAuthApp,\n Paginated,\n PaginateGrantsParams,\n PaginateUsersParams,\n Grant,\n RegisterOAuthAppParams,\n Role,\n Session,\n SetGrantParams,\n UpdateOAuthAppParams,\n UpdateRoleParams,\n User,\n} from '../types'\n\n/**\n * Admin operations on platform users.\n * Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminUsersClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Creates a new user bypassing normal sign-up flows.\n */\n create(params: AdminCreateUserParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.post<User>('/admin/users', params, options)\n }\n\n /**\n * Lists users with pagination and optional filters.\n */\n list(params?: PaginateUsersParams, options?: RequestOptions): Promise<NulvlessResult<Paginated<User>>> {\n return this.http.get<Paginated<User>>('/admin/users', {\n ...options,\n ...(params ? { query: params as Record<string, string | number | boolean> } : {}),\n })\n }\n\n /**\n * Returns a single user by ID.\n */\n get(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.get<User>(route`/admin/users/${userId}`, options)\n }\n\n /**\n * Updates a user's profile fields.\n */\n update(userId: string, params: AdminUpdateUserParams, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.patch<User>(route`/admin/users/${userId}`, params, options)\n }\n\n /**\n * Permanently deletes a user.\n */\n delete(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.delete<User>(route`/admin/users/${userId}`, options)\n }\n\n /**\n * Bans a user, preventing them from signing in.\n */\n ban(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.patch<User>(route`/admin/users/${userId}/ban`, undefined, options)\n }\n\n /**\n * Lifts a ban on a user.\n */\n unban(userId: string, options?: RequestOptions): Promise<NulvlessResult<User>> {\n return this.http.patch<User>(route`/admin/users/${userId}/unban`, undefined, options)\n }\n\n /**\n * Returns all active sessions for a specific user.\n */\n getSessions(userId: string, options?: RequestOptions): Promise<NulvlessResult<Session[]>> {\n return this.http.get<Session[]>(route`/admin/users/${userId}/sessions`, options)\n }\n\n /**\n * Invalidates all sessions for a specific user (signs them out everywhere).\n */\n signOutAll(userId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/users/${userId}/sessions`, options)\n }\n\n /**\n * Invalidates a specific session for a user.\n */\n revokeSession(userId: string, sessionId: string, options?: RequestOptions): Promise<NulvlessResult<Session>> {\n return this.http.delete<Session>(route`/admin/users/${userId}/sessions/${sessionId}`, options)\n }\n\n /**\n * Returns all configured MFA factors for a specific user.\n */\n getFactors(userId: string, options?: RequestOptions): Promise<NulvlessResult<AuthMethod[]>> {\n return this.http.get<AuthMethod[]>(route`/admin/users/${userId}/factors`, options)\n }\n\n /**\n * Removes a specific MFA factor from a user.\n */\n removeFactor(userId: string, factorId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/users/${userId}/factors/${factorId}`, options)\n }\n}\n\n/**\n * Role management. Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminRolesClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Returns all roles, optionally filtered by context.\n */\n list(context?: string, options?: RequestOptions): Promise<NulvlessResult<Role[]>> {\n return this.http.get<Role[]>('/admin/roles', {\n ...options,\n ...(context ? { query: { context } } : {}),\n })\n }\n\n /**\n * Creates a new role with the given scopes.\n */\n create(params: CreateRoleParams, options?: RequestOptions): Promise<NulvlessResult<Role>> {\n return this.http.post<Role>('/admin/roles', params, options)\n }\n\n /**\n * Updates an existing role.\n */\n update(role_id: string, params: UpdateRoleParams, options?: RequestOptions): Promise<NulvlessResult<Role>> {\n return this.http.patch<Role>(route`/admin/roles/${role_id}`, params, options)\n }\n\n /**\n * Deletes a role.\n */\n delete(role_id: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/roles/${role_id}`, options)\n }\n}\n\n/**\n * Platform-level grant management.\n * Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminGrantsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Lists grants with pagination and optional filters.\n */\n list(params?: PaginateGrantsParams, options?: RequestOptions): Promise<NulvlessResult<Paginated<Grant>>> {\n return this.http.get<Paginated<Grant>>('/admin/grants', {\n ...options,\n ...(params ? { query: params as Record<string, string | number | boolean> } : {}),\n })\n }\n\n /**\n * Creates or upserts a grant for a user on a resource.\n */\n set(params: SetGrantParams, options?: RequestOptions): Promise<NulvlessResult<Grant>> {\n return this.http.post<Grant>('/admin/grants', params, options)\n }\n\n /**\n * Deletes a grant by ID.\n */\n delete(grantId: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/grants/${grantId}`, options)\n }\n\n /**\n * Removes all grants associated with a resource.\n *\n * Use with caution — this will revoke access for all users on the resource.\n */\n deleteByResource(resource: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/resources/${resource}/grants`, options)\n }\n}\n\n/**\n * Manage the project's OAuth applications (clients) — the third-party apps\n * allowed to authenticate users through the project's OAuth server.\n *\n * Requires private key (`sk_`). No bearer token needed.\n */\nclass AdminOAuthClientsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Registers a new OAuth app. For confidential apps the response includes a\n * one-time `client_secret` — store it securely, it is never returned again.\n */\n create(params: RegisterOAuthAppParams, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.post<OAuthApp>('/admin/oauth/clients', params, options)\n }\n\n /**\n * Lists all registered OAuth apps.\n */\n list(options?: RequestOptions): Promise<NulvlessResult<OAuthApp[]>> {\n return this.http.get<OAuthApp[]>('/admin/oauth/clients', options)\n }\n\n /**\n * Returns a single OAuth app by its internal id.\n */\n get(id: string, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.get<OAuthApp>(route`/admin/oauth/clients/${id}`, options)\n }\n\n /**\n * Updates an OAuth app. `client_type` is immutable and the secret rotates via\n * `regenerateSecret` — neither can be changed here.\n */\n update(id: string, params: UpdateOAuthAppParams, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.put<OAuthApp>(route`/admin/oauth/clients/${id}`, params, options)\n }\n\n /**\n * Deletes an OAuth app.\n */\n delete(id: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.delete<null>(route`/admin/oauth/clients/${id}`, options)\n }\n\n /**\n * Rotates the client secret (confidential apps only). The new `client_secret`\n * is returned once — the previous one stops working immediately.\n */\n regenerateSecret(id: string, options?: RequestOptions): Promise<NulvlessResult<OAuthApp>> {\n return this.http.post<OAuthApp>(route`/admin/oauth/clients/${id}/regenerate_secret`, undefined, options)\n }\n}\n\n/**\n * Admin namespace — platform management operations.\n *\n * Available on `createServerClient` only (requires private key `sk_`).\n * No bearer token is required for any method in this namespace.\n *\n * Sub-namespaces:\n * - `admin.users` — create, list, update, delete users; manage sessions & factors\n * - `admin.roles` — create, list, update, delete roles\n * - `admin.grants` — set, list, delete platform grants\n * - `admin.oauthClients` — register and manage OAuth apps (clients)\n */\nexport class AdminClient {\n readonly users: AdminUsersClient\n readonly roles: AdminRolesClient\n readonly grants: AdminGrantsClient\n readonly oauthClients: AdminOAuthClientsClient\n\n constructor(private readonly http: HttpClient) {\n this.users = new AdminUsersClient(http)\n this.roles = new AdminRolesClient(http)\n this.grants = new AdminGrantsClient(http)\n this.oauthClients = new AdminOAuthClientsClient(http)\n }\n}\n","import type { Authenticated } from '../auth/types'\nimport type { StoredSession } from './types'\n\nconst DEFAULT_EXPIRES_IN_SECONDS = 3600\n\nexport function toStoredSession(auth: Authenticated & { access_token: string }): StoredSession {\n return {\n access_token: auth.access_token,\n ...(auth.refresh_token !== undefined ? { refresh_token: auth.refresh_token } : {}),\n expires_at: Date.now() + (auth.expires_in ?? DEFAULT_EXPIRES_IN_SECONDS) * 1000,\n token_type: auth.token_type ?? 'bearer',\n ...(auth.user !== undefined ? { user: auth.user } : {}),\n }\n}\n\nexport function toAuthenticated(stored: StoredSession): Authenticated {\n return {\n access_token: stored.access_token,\n ...(stored.refresh_token !== undefined ? { refresh_token: stored.refresh_token } : {}),\n ...(stored.token_type ? { token_type: stored.token_type as NonNullable<Authenticated['token_type']> } : {}),\n expires_in: Math.round((stored.expires_at - Date.now()) / 1000),\n ...(stored.user !== undefined ? { user: stored.user } : {}),\n }\n}\n","import type { NulvlessStorage } from '../storage/types'\nimport type { StoredSession } from '../session/types'\nimport type { Authenticated, User } from './types'\nimport { toStoredSession } from '../session/stored'\n\nexport interface AccountEntry {\n userId: string\n access_token: string\n expires_in: number\n refresh_token?: string\n user?: User\n}\n\ntype AccountsMap = Record<string, StoredSession>\n\nfunction decodeBase64Url(segment: string): string {\n const base64 = segment.replace(/-/g, '+').replace(/_/g, '/')\n const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n const bytes = Uint8Array.from(atob(padded), char => char.charCodeAt(0))\n\n return new TextDecoder().decode(bytes)\n}\n\nexport function extractUserId(auth: Authenticated): string | null {\n if (auth.user?.id) return auth.user.id\n if (!auth.access_token) return null\n try {\n const payload = JSON.parse(decodeBase64Url(auth.access_token.split('.')[1]!)) as Record<string, unknown>\n return typeof payload['sub'] === 'string' ? payload['sub'] : null\n } catch {\n return null\n }\n}\n\nexport class AccountsManager {\n constructor(\n private readonly storage: NulvlessStorage,\n private readonly accountsKey: string,\n ) {}\n\n private async readMap(): Promise<AccountsMap> {\n const raw = await this.storage.getItem(this.accountsKey)\n if (!raw) return {}\n try {\n return JSON.parse(raw) as AccountsMap\n } catch {\n return {}\n }\n }\n\n private async writeMap(map: AccountsMap): Promise<void> {\n await this.storage.setItem(this.accountsKey, JSON.stringify(map))\n }\n\n async save(auth: Authenticated): Promise<string | null> {\n const userId = extractUserId(auth)\n if (!userId || !auth.access_token) return null\n\n const map = await this.readMap()\n map[userId] = toStoredSession({ ...auth, access_token: auth.access_token })\n await this.writeMap(map)\n return userId\n }\n\n async getSession(userId: string): Promise<StoredSession | null> {\n const map = await this.readMap()\n return map[userId] ?? null\n }\n\n async list(): Promise<AccountEntry[]> {\n const map = await this.readMap()\n return Object.entries(map).map(([userId, session]) => ({\n userId,\n access_token: session.access_token,\n expires_in: Math.round((session.expires_at - Date.now()) / 1000),\n ...(session.refresh_token !== undefined ? { refresh_token: session.refresh_token } : {}),\n ...(session.user !== undefined ? { user: session.user } : {}),\n }))\n }\n\n async remove(userId: string): Promise<void> {\n const map = await this.readMap()\n delete map[userId]\n await this.writeMap(map)\n }\n}\n","import type { Authenticated } from './types'\n\nexport interface AuthEvents {\n /** Emitted when a sign-in or sign-up succeeds and an access token is stored. */\n 'signed-in': Authenticated\n /** Emitted after `signOut` succeeds. */\n 'signed-out': { userId?: string }\n /** Emitted when the server returns a challenge (MFA/OTP) with no access token. */\n 'challenge': Authenticated\n /** Emitted after the access token is refreshed automatically. */\n 'token-refreshed': Authenticated\n /** Emitted when `switch()` succeeds. */\n 'account-switched': { userId: string }\n /**\n * Emitted when the SDK cannot authenticate the user:\n * - there is no refresh token, or\n * - a refresh attempt was rejected by the server (401 / `unauthorized`).\n *\n * The payload carries the failed session (its `user` when known), so\n * multi-user callers can remove the right entry from the accounts store.\n */\n 'unauthorized': Authenticated\n /**\n * Emitted when any request fails with `403 protected_action_denied`,\n * meaning the action requires an active sudo session.\n * Run the sudo flow (`auth.sessions.sudo()` → `auth.challenges.verify()`)\n * to activate sudo mode, then retry.\n */\n 'sudo-required': void\n}\n\ntype Listener<T> = T extends void ? () => void : (payload: T) => void\ntype UnsubscribeFn = () => void\n\nexport class AuthEventEmitter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly listeners = new Map<keyof AuthEvents, Set<Listener<any>>>()\n\n on<K extends keyof AuthEvents>(event: K, handler: Listener<AuthEvents[K]>): UnsubscribeFn {\n let set = this.listeners.get(event)\n if (!set) {\n set = new Set()\n this.listeners.set(event, set)\n }\n set.add(handler)\n return () => { set!.delete(handler) }\n }\n\n emit<K extends keyof AuthEvents>(\n ...args: AuthEvents[K] extends void ? [event: K] : [event: K, payload: AuthEvents[K]]\n ): void {\n const [event, payload] = args\n const set = this.listeners.get(event)\n if (!set) return\n for (const handler of set) {\n try {\n ;(handler as (p: unknown) => void)(payload)\n } catch (error) {\n console.error(`[nulvless] '${event}' listener failed`, error)\n }\n }\n }\n\n removeAllListeners(event?: keyof AuthEvents): void {\n if (event) {\n this.listeners.delete(event)\n } else {\n this.listeners.clear()\n }\n }\n}\n","import type { HttpClient } from '../http'\nimport { route } from '../http'\nimport type { NulvlessResult, RequestOptions } from '../types'\nimport type { SessionManager } from '../session/manager'\nimport { TabChannel } from '../session/tabChannel'\nimport type {\n AuthMethods,\n Authenticated,\n Challenge,\n LookupParams,\n LookupResult,\n OAuthProvider,\n RecoverParams,\n RefreshTokenParams,\n ResetPasswordParams,\n Session,\n SignInParams,\n SignInWithOTPParams,\n SignOutScope,\n SignUpParams,\n VerifyChallengeParams,\n VerifyParams,\n Verified,\n} from './types'\nimport { FactorsClient } from './factors'\nimport { UsersClient } from './users'\nimport { SessionsClient } from './sessions'\nimport { SecurityClient } from './security'\nimport { ChallengesClient } from './challenges'\nimport { GrantsClient } from './grants'\nimport { OAuthClient } from './oauth'\nimport { AdminClient } from './admin'\nimport { AccountsManager, extractUserId } from './accounts'\nimport type { AccountEntry } from './accounts'\nimport { AuthEventEmitter } from './emitter'\nimport type { AuthEvents } from './emitter'\nimport type { NulvlessStorage } from '../storage/types'\nimport { toAuthenticated } from '../session/stored'\nimport { resolveBearer } from './base'\n\n/**\n * Auth methods accessible with both public (`pk_`) and private (`sk_`) keys.\n */\nexport class AuthClient {\n /** MFA factor management — enroll, enable, disable, recovery codes. */\n readonly factors: FactorsClient\n /** Current-user management — profile, identities, credential updates. */\n readonly users: UsersClient\n /** Active session management — list, revoke, sudo mode. */\n readonly sessions: SessionsClient\n /** Account security — change password. */\n readonly security: SecurityClient\n /** Challenge lifecycle — create, get, change, verify (MFA / OTP / step-up). */\n readonly challenges: ChallengesClient\n /** OAuth server (project as OIDC provider) — token, consent, userinfo, grants, discovery. */\n readonly oauth: OAuthClient\n\n protected readonly _getToken: () => Promise<string | null>\n\n constructor(\n protected readonly http: HttpClient,\n protected readonly session?: SessionManager,\n ) {\n // Inject refresh function into SessionManager after construction\n // to avoid circular dependency.\n session?.setRefreshFn((refresh_token) =>\n this.http.post<Authenticated>('/token', { refresh_token }, {\n query: { grant_type: 'refresh_token' },\n }),\n )\n\n this._getToken = () => this.session?.getValidToken() ?? Promise.resolve(null)\n\n this.factors = new FactorsClient(http, this._getToken)\n this.users = new UsersClient(http, this._getToken)\n this.sessions = new SessionsClient(http, this._getToken, (result) =>\n this.persistSession(result),\n )\n this.security = new SecurityClient(http, this._getToken)\n this.challenges = new ChallengesClient(http, this._getToken, (result) =>\n this.persistSession(result),\n )\n this.oauth = new OAuthClient(http, this._getToken)\n }\n\n /**\n * Returns the current active access token from storage.\n * Refreshes automatically if the token is expired or about to expire.\n * Returns `null` when there is no active session.\n */\n async getAccessToken(): Promise<string | null> {\n return this.session?.getValidToken() ?? null\n }\n\n protected async persistSession(result: NulvlessResult<Authenticated>): Promise<NulvlessResult<Authenticated>> {\n if (!result.error && result.data.access_token && this.session) {\n await this.session.save(result.data)\n }\n\n return result\n }\n\n /**\n * Creates a new user account.\n *\n * At least one of `email`, `phone`, or `username` must be provided.\n *\n * Check the response in this order:\n * 1. `data.access_token` → authenticated immediately — session stored automatically.\n * 2. `data.challenge` → MFA/OTP step required — call `verifyChallenge`.\n * 3. `data.user` only → pending email/phone confirmation.\n */\n async signUp(params: SignUpParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>('/signup', params, options),\n )\n }\n\n /**\n * Signs in with password (`grant_type=password`).\n *\n * At least one of `email`, `phone`, or `username` must be provided.\n *\n * Check the response in this order:\n * 1. `data.access_token` → signed in — session stored automatically.\n * 2. `data.challenge` → MFA step required — call `verifyChallenge`.\n */\n async signIn(params: SignInParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>('/token', params, {\n ...options,\n query: { grant_type: 'password' },\n }),\n )\n }\n\n /**\n * Requests a one-time password sent to the user's email or phone.\n *\n * Returns a `Challenge` (`202 Accepted`). Pass the received code to `verifyChallenge`.\n *\n * At least one of `email` or `phone` must be provided.\n */\n signInWithOTP(params: SignInWithOTPParams, options?: RequestOptions): Promise<NulvlessResult<Challenge>> {\n return this.http.post<Challenge>('/otp', params, options)\n }\n\n /**\n * Initiates an OAuth sign-in flow for the given provider.\n *\n * In a browser environment the user is redirected automatically to the\n * authorization URL. On the server the URL is returned for manual handling.\n *\n * After the redirect, the server-side callback exchanges the code automatically\n * and redirects back to `options.redirect_uri`. For server-side code exchange, use `exchangeCodeForToken`.\n *\n * @example\n * // Browser — redirects automatically\n * await nulvless.auth.authorize('google', { redirect_uri: 'https://myapp.com/callback' })\n *\n * // Server — use the returned URL\n * const { data } = await nulvless.auth.authorize('google', { redirect_uri: 'https://myapp.com/callback' })\n * return Response.redirect(data.url)\n */\n async authorize(\n provider: OAuthProvider,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ url: string; provider: OAuthProvider }>> {\n const result = await this.http.get<{ url: string; provider: OAuthProvider }>(\n route`/oauth/${provider}/authorize`,\n { ...options, query: { ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}) } },\n )\n\n if (!result.error && typeof window !== 'undefined') {\n window.location.href = result.data.url\n }\n\n return result\n }\n\n /**\n * Initiates an OAuth flow to connect a new provider to the authenticated user's account.\n *\n * Same behaviour as `authorize`, but for users who are already signed in — the resulting\n * provider identity is linked to the current account instead of starting a sign-in flow.\n *\n * In a browser environment the user is redirected automatically to the\n * authorization URL. On the server the URL is returned for manual handling.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n *\n * @example\n * await nulvless.auth.connect('github', { redirect_uri: 'https://myapp.com/settings/connections' })\n */\n async connect(\n provider: OAuthProvider,\n options?: RequestOptions,\n ): Promise<NulvlessResult<{ url: string; provider: OAuthProvider }>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n const result = await this.http.get<{ url: string; provider: OAuthProvider }>(\n route`/oauth/${provider}/connect`,\n {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: { ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}) },\n },\n )\n\n if (!result.error && typeof window !== 'undefined') {\n window.location.href = result.data.url\n }\n\n return result\n }\n\n /**\n * Signs in with an ID token issued by a third-party OAuth provider.\n *\n * Useful for mobile apps where you obtain the ID token natively (e.g. Google Sign-In SDK).\n *\n * Session is stored automatically when the response contains an access token.\n *\n * @example\n * const { data } = await nulvless.auth.signInWithIdToken('google', googleIdToken)\n */\n async signInWithIdToken(\n provider: OAuthProvider,\n idToken: string,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.get<Authenticated>(route`/signin/${provider}/id_token`, {\n ...options,\n query: { id_token: idToken },\n }),\n )\n }\n\n /**\n * Exchanges an OAuth authorization code for an access token\n * (`grant_type=authorization_code`).\n *\n * Must be called with `Content-Type: application/x-www-form-urlencoded`.\n * The `code` must be the authorization code received from the OAuth callback.\n *\n * Session is stored automatically when the response contains an access token.\n *\n * @example\n * const { data } = await nulvless.auth.exchangeCodeForToken('auth-code-from-callback')\n */\n async exchangeCodeForToken(code: string, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>(\n '/token',\n { code },\n {\n ...options,\n query: { grant_type: 'authorization_code' },\n headers: {\n ...options?.headers,\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n },\n ),\n )\n }\n\n /**\n * Returns all sign-in methods, MFA factors, and OAuth providers configured\n * for the authenticated user on this platform.\n *\n * Requires authentication.\n */\n async getMethods(options?: RequestOptions): Promise<NulvlessResult<AuthMethods>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n return this.http.get<AuthMethods>('/methods', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Looks up whether an identifier exists and which sign-in method applies.\n *\n * Useful for adaptive sign-in UIs. May return a `challenge` directly\n * when the user's method is OTP-only.\n *\n * At least one of `email`, `phone`, or `username` must be provided.\n */\n lookup(params: LookupParams, options?: RequestOptions): Promise<NulvlessResult<LookupResult>> {\n return this.http.post<LookupResult>('/lookup', params, options)\n }\n\n /**\n * Verifies a challenge by submitting the token and the code entered by the user.\n *\n * Used for:\n * - OTP sign-in (`signInWithOTP` flow)\n * - MFA verification after `signIn`\n * - Sign-up confirmation (`signUp` challenge flow)\n *\n * Convenience alias for `auth.challenges.verify`. Session is stored\n * automatically when the response contains an access token. For the rest of\n * the challenge lifecycle (create, get, change) use `auth.challenges`.\n */\n async verifyChallenge(params: VerifyChallengeParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.challenges.verify(params, options)\n }\n\n /**\n * Activates an account via the confirmation link sent to the user's email/phone.\n */\n activate(token: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.get<null>('/activate', { ...options, query: { token } })\n }\n\n /**\n * Refreshes the access token using a refresh token (`grant_type=refresh_token`).\n * Session is updated automatically in storage.\n */\n async refreshToken(params: RefreshTokenParams, options?: RequestOptions): Promise<NulvlessResult<Authenticated>> {\n return this.persistSession(\n await this.http.post<Authenticated>('/token', params, {\n ...options,\n query: { grant_type: 'refresh_token' },\n }),\n )\n }\n\n /**\n * Sends a password-recovery email to the user.\n */\n recover(params: RecoverParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/recover', {\n ...params,\n ...(options?.redirect_uri ? { redirect_uri: options.redirect_uri } : {}),\n }, options)\n }\n\n /**\n * Resets the user's password using the token from the recovery email.\n */\n resetPassword(params: ResetPasswordParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/recover/reset-password', params, options)\n }\n\n /**\n * Validates the current session and optionally checks a grant.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n */\n async verify(grant?: VerifyParams, options?: RequestOptions): Promise<NulvlessResult<Verified>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n return this.http.get<Verified>('/session/validate', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n query: {\n ...(grant?.resource ? { resource: grant.resource } : {}),\n ...(grant?.scopes ? { scopes: grant.scopes.join(' ') } : {}),\n ...(grant?.roles ? { roles: grant.roles.join(' ') } : {}),\n ...(grant?.reject_assurance_level_error !== undefined\n ? { reject_assurance_level_error: String(grant.reject_assurance_level_error) }\n : {}),\n },\n })\n }\n\n /**\n * Returns the current session details.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n */\n async getSession(options?: RequestOptions): Promise<NulvlessResult<Session>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n return this.http.get<Session>('/session', {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n })\n }\n\n /**\n * Signs out the user and clears the stored session.\n *\n * - `'local'` (default) — invalidates only the current session.\n * - `'global'` — invalidates all sessions across all devices.\n * - `'others'` — invalidates all sessions except the current one.\n *\n * Requires authentication. Token is resolved automatically from storage\n * (browser) or from `options.headers.Authorization` (server).\n */\n async signOut(scope?: SignOutScope, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const auth = await resolveBearer(this.http, this._getToken, options)\n if (!auth.ok) return { data: null, error: auth.error }\n\n const result = await this.http.post<null>('/signout', undefined, {\n ...options,\n headers: { ...options?.headers, ...auth.headers },\n ...(scope ? { query: { scope } } : {}),\n })\n\n if (!result.error) {\n await this.session?.clear()\n }\n\n return result\n }\n}\n\n/**\n * Auth client for browser use (`createClient` / public key).\n * Extends `AuthClient` with session management and multi-account helpers.\n */\nexport class AuthBrowserClient extends AuthClient {\n private readonly accountsManager: AccountsManager\n private readonly emitter: AuthEventEmitter\n private readonly multiUser: boolean\n private readonly tabs: TabChannel<Authenticated | null>\n\n constructor(\n http: HttpClient,\n session: SessionManager,\n storage: NulvlessStorage,\n accountsKey: string,\n multiUser = false,\n autoRefresh = true,\n ) {\n super(http, session)\n this.multiUser = multiUser\n this.accountsManager = new AccountsManager(storage, accountsKey)\n this.emitter = new AuthEventEmitter()\n\n this.tabs = new TabChannel<Authenticated | null>(`nulvless.auth.${accountsKey}`, message => {\n this.emitter.emit(\n message.event as 'token-refreshed',\n message.payload as Authenticated,\n )\n })\n\n session.setOnTokenRefreshed((auth) => {\n if (this.multiUser) {\n void this.accountsManager.save(auth)\n }\n\n this.emitter.emit('token-refreshed', auth)\n this.tabs.post({ event: 'token-refreshed', payload: auth })\n })\n\n session.setOnUnauthorized((failed) => {\n this.emitter.emit('unauthorized', failed ? toAuthenticated(failed) : {})\n })\n\n http.setOnSudoRequired(() => {\n this.emitter.emit('sudo-required')\n })\n\n if (autoRefresh) {\n session.startAutoRefresh()\n }\n }\n\n /**\n * Renews the access token now, sharing the attempt with any refresh already\n * in flight. Returns the new token, or `null` when the session could not be\n * recovered.\n */\n async refreshSession(): Promise<string | null> {\n return this.session?.forceRefresh() ?? null\n }\n\n /** Releases the refresh timer and the cross-tab channel. */\n dispose(): void {\n this.session?.stopAutoRefresh()\n this.tabs.close()\n }\n\n /**\n * Subscribes to an auth event.\n *\n * Returns an unsubscribe function — call it to stop listening.\n *\n * @example\n * const off = nulvless.auth.on('signed-in', (session) => {\n * console.log('signed in as', session.user?.id)\n * })\n * off() // unsubscribe\n */\n on<K extends keyof AuthEvents>(\n event: K,\n handler: AuthEvents[K] extends void ? () => void : (payload: AuthEvents[K]) => void,\n ): () => void {\n return this.emitter.on(event, handler)\n }\n\n protected override async persistSession(result: NulvlessResult<Authenticated>): Promise<NulvlessResult<Authenticated>> {\n const out = await super.persistSession(result)\n\n if (!out.error) {\n if (out.data.access_token) {\n if (this.multiUser) {\n await this.accountsManager.save(out.data)\n }\n this.emitter.emit('signed-in', out.data)\n } else if (out.data.challenge) {\n this.emitter.emit('challenge', out.data)\n }\n }\n\n return out\n }\n\n /**\n * Returns the session currently stored in storage, or `null` if there is none.\n *\n * `expires_in` is the number of seconds remaining until expiry (may be negative\n * if the token is already expired).\n *\n * @example\n * const session = await nulvless.auth.get()\n * if (session) {\n * console.log(session.access_token, session.expires_in)\n * }\n */\n async get(): Promise<Authenticated | null> {\n const stored = await this.session?.get()\n return stored ? toAuthenticated(stored) : null\n }\n\n /**\n * Manually persists a session as the active session.\n *\n * Use this when you obtain an `Authenticated` outside the normal SDK flow\n * (e.g. server-side login, custom OAuth callback) and want the SDK to treat\n * it as the active session.\n *\n * @example\n * await nulvless.auth.set({ access_token: 'eyJ...', refresh_token: 'rt_...', expires_in: 3600 })\n */\n async set(data: Authenticated): Promise<void> {\n if (data.access_token) {\n await this.session?.save(data)\n }\n }\n\n /**\n * Adds an account to the accounts store without switching the active session.\n *\n * The account is identified by the `user.id` in the response, or by the `sub`\n * claim in the access token JWT.\n *\n * Call this after a sign-in to register additional accounts. Accounts are\n * also saved automatically whenever a sign-in / sign-up succeeds.\n *\n * @example\n * const { data } = await nulvless.auth.signIn(params)\n * // already saved automatically — or add manually:\n * await nulvless.auth.add(data)\n */\n async add(auth: Authenticated): Promise<void> {\n if (!this.multiUser || !auth.access_token) return\n await this.accountsManager.save(auth)\n }\n\n /**\n * Switches the active session to a previously saved account.\n *\n * Returns `true` on success, `false` if the account is not found.\n *\n * @example\n * const ok = await nulvless.auth.switch('user-id-123')\n */\n async switch(userId: string): Promise<boolean> {\n if (!this.multiUser) return false\n\n const stored = await this.accountsManager.getSession(userId)\n\n if (!stored) return false\n\n await this.session?.save(toAuthenticated(stored))\n\n this.emitter.emit('account-switched', { userId })\n return true\n }\n\n /**\n * Returns all accounts currently saved in the accounts store.\n *\n * @example\n * const accounts = await nulvless.auth.list()\n * // [{ userId: '...', access_token: '...', expires_in: 3540 }]\n */\n list(): Promise<AccountEntry[]> {\n if (!this.multiUser) return Promise.resolve([])\n return this.accountsManager.list()\n }\n\n /**\n * Removes a saved account from the accounts store.\n *\n * Does not affect the active session.\n *\n * @example\n * await nulvless.auth.remove('user-id-123')\n */\n remove(userId: string): Promise<void> {\n if (!this.multiUser) return Promise.resolve()\n return this.accountsManager.remove(userId)\n }\n\n /**\n * Drops the active session without ending it on the server.\n *\n * The account stays in the accounts store, so `switch` brings it back. Use\n * this when the user leaves the authenticated area to pick or add another\n * account: with no active session the automatic refresh goes quiet instead\n * of keeping a session warm that nothing is using.\n *\n * @example\n * await nulvless.auth.deselect()\n * // later\n * await nulvless.auth.switch('user-id-123')\n */\n async deselect(): Promise<void> {\n const stored = await this.session?.get()\n\n if (!stored) return\n\n if (this.multiUser) {\n await this.accountsManager.save(toAuthenticated(stored))\n }\n\n await this.session?.clear()\n }\n\n override async signOut(scope?: SignOutScope, options?: RequestOptions): Promise<NulvlessResult<null>> {\n // Capture userId before the session is cleared\n const stored = await this.session?.get()\n const userId = stored\n ? (stored.user?.id ?? extractUserId({ access_token: stored.access_token }))\n : null\n\n const result = await super.signOut(scope, options)\n\n if (!result.error) {\n if (this.multiUser && userId) {\n await this.accountsManager.remove(userId)\n }\n this.emitter.emit('signed-out', { ...(userId ? { userId } : {}) })\n }\n\n return result\n }\n}\n\n/**\n * Auth methods exclusive to private (`sk_`) keys.\n * Extends `AuthClient` — all public methods and sub-namespaces are available here too.\n *\n * Additional sub-namespaces:\n * - `auth.grants` — grant management (invite, revoke, accept, etc.)\n * - `auth.admin` — platform administration (users, roles, grants)\n *\n * Never use in browser code.\n */\nexport class AuthServerClient extends AuthClient {\n /** User-facing grant management — invite, accept, revoke, etc. */\n readonly grants: GrantsClient\n /** Platform administration — manage users, roles, and grants server-side. */\n readonly admin: AdminClient\n\n constructor(http: HttpClient) {\n super(http)\n this.grants = new GrantsClient(http, this._getToken)\n this.admin = new AdminClient(http)\n }\n}\n","import type { HttpClient } from '../../http'\nimport { route } from '../../http'\nimport type { NulvlessResult, RequestOptions } from '../../types'\nimport type {\n CreateTemplateParams,\n NotificationChannel,\n PaginatedTemplates,\n Template,\n TemplateFilters,\n TemplateLanguage,\n TranslationParams,\n UpdateTemplateParams,\n} from '../types'\n\n/**\n * Template management for the notifications service.\n *\n * Available on `createServerClient` only (requires private key).\n *\n * @example\n * const { data } = await nulvless.comms.templates.create({\n * slug: 'welcome',\n * channel: 'email',\n * language: 'en-US',\n * subject: 'Welcome!',\n * content: '<h1>Hello {{name}}</h1>',\n * })\n */\nexport class TemplatesClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Creates a new notification template.\n *\n * - `email` channel: `subject` required, `url` not allowed.\n * - `sms` channel: `subject` and `url` not allowed.\n * - `webhook` channel: `url` required, `subject` not allowed.\n */\n create(params: CreateTemplateParams, options?: RequestOptions): Promise<NulvlessResult<Template>> {\n return this.http.post<Template>('/templates', params, options)\n }\n\n /**\n * Updates the name, description, URL or config of a template.\n *\n * @example\n * await nulvless.comms.templates.update('email', 'welcome', { name: 'Welcome' })\n */\n update(\n channel: NotificationChannel,\n slug: string,\n params: UpdateTemplateParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Template>> {\n return this.http.patch<Template>(route`/templates/${channel}/${slug}`, params, options)\n }\n\n /**\n * Creates or replaces a template translation.\n *\n * @example\n * await nulvless.comms.templates.putTranslation('email', 'welcome', 'pt-BR', { subject: 'Olá!', content: '<h1>Olá {{name}}</h1>' })\n */\n putTranslation(\n channel: NotificationChannel,\n slug: string,\n language: TemplateLanguage,\n params: TranslationParams,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Template>> {\n return this.http.put<Template>(route`/templates/${channel}/${slug}/${language}`, params, options)\n }\n\n /**\n * Deletes a template translation.\n *\n * @example\n * await nulvless.comms.templates.deleteTranslation('email', 'welcome', 'pt-BR')\n */\n deleteTranslation(\n channel: NotificationChannel,\n slug: string,\n language: TemplateLanguage,\n options?: RequestOptions,\n ): Promise<NulvlessResult<Template>> {\n return this.http.delete<Template>(route`/templates/${channel}/${slug}/${language}`, options)\n }\n\n /**\n * Deletes a template and its translations.\n *\n * @example\n * await nulvless.comms.templates.delete('email', 'welcome')\n */\n delete(channel: NotificationChannel, slug: string, options?: RequestOptions): Promise<NulvlessResult<Template>> {\n return this.http.delete<Template>(route`/templates/${channel}/${slug}`, options)\n }\n\n /**\n * Returns a template by channel and slug, falling back to the common template\n * if no custom one exists.\n *\n * @example\n * const { data } = await nulvless.comms.templates.get('email', 'welcome')\n */\n get(channel: NotificationChannel, slug: string, options?: RequestOptions): Promise<NulvlessResult<Template>> {\n return this.http.get<Template>(route`/templates/${channel}/${slug}`, options)\n }\n\n /**\n * Returns a paginated list of templates, optionally filtered by channel.\n *\n * @example\n * const { data } = await nulvless.comms.templates.list({ channel: 'email', page_size: 20 })\n */\n list(filters?: TemplateFilters, options?: RequestOptions): Promise<NulvlessResult<PaginatedTemplates>> {\n return this.http.get<PaginatedTemplates>('/templates', {\n ...options,\n query: {\n ...(filters?.page !== undefined ? { page: filters.page } : {}),\n ...(filters?.page_size !== undefined ? { page_size: filters.page_size } : {}),\n ...(filters?.sort ? { sort: filters.sort } : {}),\n ...(filters?.channel ? { channel: filters.channel } : {}),\n ...(filters?.authored ? { authored: filters.authored } : {}),\n },\n })\n }\n}\n","import type { HttpClient } from '../http'\nimport { route } from '../http'\nimport type { NulvlessResult, RequestOptions } from '../types'\nimport type { SendEmailParams, SendSMSParams } from './types'\nimport { TemplatesClient } from './templates'\n\nexport class EmailClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a transactional email using a pre-configured template.\n *\n * Returns `null` on success — the API responds with `200` and no body.\n *\n * @example\n * const { error } = await nulvless.comms.email.send({\n * to: 'user@example.com',\n * template: 'welcome',\n * params: { name: 'Gleisson' },\n * })\n */\n send(params: SendEmailParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const { to, template, language, params: templateParams } = params\n\n const path = language\n ? route`/notifications/email/${template}/${language}`\n : route`/notifications/email/${template}`\n\n return this.http.post<null>(path, { email: to, params: templateParams }, options)\n }\n\n /**\n * Sends a test email to validate the platform's email provider configuration.\n *\n * Returns `null` on success.\n *\n * @example\n * const { error } = await nulvless.comms.email.test('user@example.com')\n */\n test(email: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/notifications/test/email', { email }, options)\n }\n}\n\nexport class SmsClient {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Sends a transactional SMS using a pre-configured template.\n *\n * Returns `null` on success — the API responds with `200` and no body.\n *\n * @example\n * const { error } = await nulvless.comms.sms.send({\n * phone: { country_code: '+55', number: '11999999999' },\n * template: 'verification-code',\n * params: { code: '123456' },\n * })\n */\n send(params: SendSMSParams, options?: RequestOptions): Promise<NulvlessResult<null>> {\n const { phone, template, language, params: templateParams } = params\n\n const path = language\n ? route`/notifications/sms/${template}/${language}`\n : route`/notifications/sms/${template}`\n\n return this.http.post<null>(path, { phone, params: templateParams }, options)\n }\n\n /**\n * Sends a test SMS to validate the platform's SMS provider configuration.\n *\n * Returns `null` on success.\n *\n * @example\n * const { error } = await nulvless.comms.sms.test('user@example.com')\n */\n test(email: string, options?: RequestOptions): Promise<NulvlessResult<null>> {\n return this.http.post<null>('/notifications/test/sms', { email }, options)\n }\n}\n\nexport class CommsClient {\n readonly email: EmailClient\n readonly sms: SmsClient\n readonly templates: TemplatesClient\n\n constructor(http: HttpClient) {\n this.email = new EmailClient(http)\n this.sms = new SmsClient(http)\n this.templates = new TemplatesClient(http)\n }\n}\n","export type LockOutcome<T> = { ran: true; value: T } | { ran: false }\n\ninterface LockOptions {\n skipWhenBusy?: boolean\n}\n\ninterface WebLockManager {\n request(\n name: string,\n options: { mode: 'exclusive'; ifAvailable?: boolean },\n task: (lock: unknown | null) => Promise<unknown>,\n ): Promise<unknown>\n}\n\nconst pendingByName = new Map<string, Promise<unknown>>()\n\nfunction webLocks(): WebLockManager | null {\n const manager = (globalThis as { navigator?: { locks?: WebLockManager } }).navigator?.locks\n\n return typeof manager?.request === 'function' ? manager : null\n}\n\nexport async function runExclusive<T>(\n name: string,\n task: () => Promise<T>,\n options: LockOptions = {},\n): Promise<LockOutcome<T>> {\n const manager = webLocks()\n\n if (manager) {\n return (await manager.request(\n name,\n { mode: 'exclusive', ...(options.skipWhenBusy ? { ifAvailable: true } : {}) },\n async lock => (lock === null ? { ran: false } : { ran: true, value: await task() }),\n )) as LockOutcome<T>\n }\n\n const previous = pendingByName.get(name)\n\n if (previous && options.skipWhenBusy) {\n return { ran: false }\n }\n\n const run = (previous ?? Promise.resolve()).catch(() => undefined).then(task)\n const slot = run.catch(() => undefined)\n\n pendingByName.set(name, slot)\n\n try {\n return { ran: true, value: await run }\n } finally {\n if (pendingByName.get(name) === slot) {\n pendingByName.delete(name)\n }\n }\n}\n","import type { NulvlessError } from '../types'\n\nconst REFUSAL_CODES = new Set([\n 'unauthorized',\n 'refresh_token_not_found',\n 'refresh_token_already_used',\n 'refresh_token_not_issued_here',\n 'user_banned',\n])\n\nexport function isTemporaryFailure(error: NulvlessError): boolean {\n return (\n error.status_code === 0 ||\n error.status_code === 408 ||\n error.status_code === 429 ||\n error.status_code >= 500\n )\n}\n\nexport function isSessionRefused(error: NulvlessError): boolean {\n return REFUSAL_CODES.has(error.code) || error.status_code === 401\n}\n","import type { NulvlessStorage } from '../storage/types'\nimport type { NulvlessResult } from '../types'\nimport type { Authenticated } from '../auth/types'\nimport type { StoredSession } from './types'\nimport { runExclusive } from './locks'\nimport { isSessionRefused, isTemporaryFailure } from './refreshFailure'\nimport { toStoredSession } from './stored'\n\nconst REFRESH_MARGIN_IN_MS = 90_000\nconst TICK_INTERVAL_IN_MS = 30_000\n\nconst RETRY_BACKOFF_BASE_IN_MS = 200\nconst MAX_RETRIES_ON_TEMPORARY_FAILURE = 3\n\ntype RefreshFn = (refresh_token: string) => Promise<NulvlessResult<Authenticated>>\ntype TokenRefreshedCb = (auth: Authenticated) => void\n/** Receives the session that could not be recovered (null when none was stored). */\ntype UnauthorizedCb = (session: StoredSession | null) => void\n\nexport interface RefreshRequest {\n deauthOnFailure?: boolean\n expiredToken?: string\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction documentIsHidden(): boolean {\n return (globalThis as { document?: { hidden?: boolean } }).document?.hidden === true\n}\n\nfunction isBrowser(): boolean {\n const scope = globalThis as { window?: unknown; document?: unknown }\n\n return typeof scope.window !== 'undefined' && typeof scope.document !== 'undefined'\n}\n\nexport class SessionManager {\n private refreshFn?: RefreshFn\n private onTokenRefreshed?: TokenRefreshedCb\n private onUnauthorized?: UnauthorizedCb\n private readonly sessionKey: string\n private readonly lockName: string\n\n private inFlight: Promise<string | null> | null = null\n private ticker: ReturnType<typeof setInterval> | undefined\n private onVisibilityChange: (() => void) | undefined\n\n constructor(\n private readonly storage: NulvlessStorage,\n sessionKey: string,\n ) {\n this.sessionKey = sessionKey\n this.lockName = `nulvless.session.${sessionKey}`\n }\n\n /**\n * Injected by `AuthClient` after construction to avoid circular dependency.\n * Called automatically when the access token is about to expire.\n */\n setRefreshFn(fn: RefreshFn): void {\n this.refreshFn = fn\n }\n\n /** Called after a successful automatic token refresh. */\n setOnTokenRefreshed(cb: TokenRefreshedCb): void {\n this.onTokenRefreshed = cb\n }\n\n /**\n * Called when the SDK cannot recover the session:\n * - no refresh token present, or\n * - the refresh request was refused by the server.\n */\n setOnUnauthorized(cb: UnauthorizedCb): void {\n this.onUnauthorized = cb\n }\n\n async save(auth: Authenticated): Promise<void> {\n if (!auth.access_token) return\n\n const session = toStoredSession({ ...auth, access_token: auth.access_token })\n\n await this.storage.setItem(this.sessionKey, JSON.stringify(session))\n }\n\n async get(): Promise<StoredSession | null> {\n const raw = await this.storage.getItem(this.sessionKey)\n\n if (!raw) return null\n\n try {\n return JSON.parse(raw) as StoredSession\n } catch {\n return null\n }\n }\n\n async clear(): Promise<void> {\n await this.storage.removeItem(this.sessionKey)\n }\n\n private expiresSoon(session: StoredSession): boolean {\n return session.expires_at - Date.now() < REFRESH_MARGIN_IN_MS\n }\n\n private refresh(request: RefreshRequest): Promise<string | null> {\n if (this.inFlight) {\n return this.inFlight\n }\n\n this.inFlight = this.runExclusiveRefresh(request).finally(() => {\n this.inFlight = null\n })\n\n return this.inFlight\n }\n\n private async runExclusiveRefresh(request: RefreshRequest): Promise<string | null> {\n const outcome = await runExclusive(this.lockName, () => this.refreshHoldingLock(request))\n\n return outcome.ran ? outcome.value : null\n }\n\n private async refreshHoldingLock(request: RefreshRequest): Promise<string | null> {\n const session = await this.get()\n\n if (!session) {\n if (request.deauthOnFailure) this.onUnauthorized?.(null)\n return null\n }\n\n const alreadyRenewed = request.expiredToken\n ? session.access_token !== request.expiredToken\n : !this.expiresSoon(session)\n\n if (alreadyRenewed) {\n return session.access_token\n }\n\n if (!session.refresh_token || !this.refreshFn) {\n if (request.deauthOnFailure) this.onUnauthorized?.(session)\n return null\n }\n\n return this.callRefreshFn(session, request)\n }\n\n private async callRefreshFn(\n session: StoredSession,\n request: RefreshRequest,\n ): Promise<string | null> {\n for (let attempt = 0; attempt <= MAX_RETRIES_ON_TEMPORARY_FAILURE; attempt += 1) {\n if (attempt > 0) {\n await sleep(RETRY_BACKOFF_BASE_IN_MS * 2 ** (attempt - 1))\n }\n\n const result = await this.refreshFn!(session.refresh_token!)\n\n if (result.data?.access_token) {\n await this.save(result.data)\n this.onTokenRefreshed?.(result.data)\n\n return result.data.access_token\n }\n\n const error = result.error\n\n if (error && isTemporaryFailure(error)) {\n continue\n }\n\n if (request.deauthOnFailure && (!error || isSessionRefused(error))) {\n await this.clear()\n this.onUnauthorized?.(session)\n }\n\n return null\n }\n\n return null\n }\n\n /**\n * Forces a token refresh regardless of expiry.\n * Used for reactive refresh after a 401/403 response.\n *\n * Returns the new access token, or `null` if refresh fails.\n *\n * `deauthOnFailure` (default `true`) controls side effects when the refresh\n * itself is refused: clearing the stored session and invoking `onUnauthorized`.\n * Pass `false` for soft refreshes (e.g. 403/forbidden_resource_access) where\n * the session must remain intact so the caller can surface the API error.\n */\n async forceRefresh(\n options: { deauthOnFailure?: boolean; expiredToken?: string } = {},\n ): Promise<string | null> {\n const expiredToken = options.expiredToken ?? (await this.get())?.access_token\n\n return this.refresh({\n deauthOnFailure: options.deauthOnFailure ?? true,\n ...(expiredToken !== undefined ? { expiredToken } : {}),\n })\n }\n\n /**\n * Returns a valid access token, refreshing it automatically if it is\n * expired or about to expire (within the refresh margin).\n *\n * Returns `null` when there is no session or the refresh fails.\n */\n async getValidToken(): Promise<string | null> {\n const session = await this.get()\n\n if (!session) return null\n\n if (!this.expiresSoon(session)) return session.access_token\n\n return this.refresh({ deauthOnFailure: true })\n }\n\n startAutoRefresh(): void {\n if (this.ticker || !isBrowser()) return\n\n this.ticker = setInterval(() => void this.tick(), TICK_INTERVAL_IN_MS)\n\n ;(this.ticker as unknown as { unref?: () => void }).unref?.()\n\n this.onVisibilityChange = () => {\n if (!documentIsHidden()) void this.tick()\n }\n\n ;(globalThis as unknown as Window).document.addEventListener(\n 'visibilitychange',\n this.onVisibilityChange,\n )\n }\n\n stopAutoRefresh(): void {\n if (this.ticker) {\n clearInterval(this.ticker)\n this.ticker = undefined\n }\n\n if (this.onVisibilityChange && isBrowser()) {\n ;(globalThis as unknown as Window).document.removeEventListener(\n 'visibilitychange',\n this.onVisibilityChange,\n )\n }\n\n this.onVisibilityChange = undefined\n }\n\n private async tick(): Promise<void> {\n if (documentIsHidden() || this.inFlight) return\n\n try {\n const session = await this.get()\n\n if (!session?.refresh_token || !this.expiresSoon(session)) return\n\n await runExclusive(this.lockName, () => this.refreshHoldingLock({ deauthOnFailure: true }), {\n skipWhenBusy: true,\n })\n } catch (error) {\n console.error('[nulvless] scheduled token renewal failed', error)\n }\n }\n}\n","import type { NulvlessStorage } from '../types'\n\n/** Persists in `localStorage`. Data survives page reloads and browser restarts. */\nexport class LocalStorageAdapter implements NulvlessStorage {\n async getItem(key: string): Promise<string | null> {\n return localStorage.getItem(key)\n }\n\n async setItem(key: string, value: string): Promise<void> {\n localStorage.setItem(key, value)\n }\n\n async removeItem(key: string): Promise<void> {\n localStorage.removeItem(key)\n }\n}\n","import type { NulvlessStorage } from '../types'\n\n/** Persists in `sessionStorage`. Data is cleared when the tab or browser is closed. */\nexport class SessionStorageAdapter implements NulvlessStorage {\n async getItem(key: string): Promise<string | null> {\n return sessionStorage.getItem(key)\n }\n\n async setItem(key: string, value: string): Promise<void> {\n sessionStorage.setItem(key, value)\n }\n\n async removeItem(key: string): Promise<void> {\n sessionStorage.removeItem(key)\n }\n}\n","import type { NulvlessStorage } from '../types'\n\n/**\n * Persists in memory (plain `Map`). Data is lost on page reload.\n *\n * Useful for SSR environments, tests, or situations where persistent\n * storage is not available or desired.\n */\nexport class MemoryStorageAdapter implements NulvlessStorage {\n private readonly store = new Map<string, string>()\n\n async getItem(key: string): Promise<string | null> {\n return this.store.get(key) ?? null\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.store.set(key, value)\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key)\n }\n}\n","import type { NulvlessStorage } from '../types'\n\nconst CACHE_NAME = 'nulvless'\n\n/**\n * Persists using the browser's Cache Storage API.\n *\n * Available in modern browsers and service workers. Data survives page\n * reloads but can be cleared by the browser under storage pressure.\n *\n * Keys are mapped to fake URLs (`https://nulvless.storage/<key>`) since\n * the Cache API uses URLs as identifiers.\n */\nexport class CacheStorageAdapter implements NulvlessStorage {\n private key(k: string): string {\n return `https://nulvless.storage/${encodeURIComponent(k)}`\n }\n\n async getItem(key: string): Promise<string | null> {\n const cache = await caches.open(CACHE_NAME)\n const response = await cache.match(this.key(key))\n return response ? response.text() : null\n }\n\n async setItem(key: string, value: string): Promise<void> {\n const cache = await caches.open(CACHE_NAME)\n await cache.put(this.key(key), new Response(value))\n }\n\n async removeItem(key: string): Promise<void> {\n const cache = await caches.open(CACHE_NAME)\n await cache.delete(this.key(key))\n }\n}\n","export type { NulvlessStorage } from './types'\nexport { LocalStorageAdapter } from './adapters/local'\nexport { SessionStorageAdapter } from './adapters/session'\nexport { MemoryStorageAdapter } from './adapters/memory'\nexport { CacheStorageAdapter } from './adapters/cache'\n\nimport { LocalStorageAdapter } from './adapters/local'\nimport { SessionStorageAdapter } from './adapters/session'\nimport { MemoryStorageAdapter } from './adapters/memory'\nimport { CacheStorageAdapter } from './adapters/cache'\n\n/**\n * Built-in storage adapters for session persistence.\n *\n * @example\n * import { Storage } from '@nulvless/nulvless-js'\n *\n * const nulvless = createClient(url, key, {\n * storage: Storage.Local, // localStorage — survives reloads\n * storage: Storage.Session, // sessionStorage — cleared on tab close\n * storage: Storage.Memory, // in-memory — useful for SSR / tests\n * storage: Storage.Cache, // Cache Storage API — browser / service workers\n * })\n */\nexport const Storage = {\n /** `localStorage` — data survives page reloads and browser restarts. */\n Local: new LocalStorageAdapter(),\n /** `sessionStorage` — data is cleared when the tab or browser is closed. */\n Session: new SessionStorageAdapter(),\n /** In-memory `Map` — data is lost on page reload. Good for SSR and tests. */\n Memory: new MemoryStorageAdapter(),\n /** Cache Storage API — survives reloads, available in service workers. */\n Cache: new CacheStorageAdapter(),\n} as const\n","import { HttpClient } from './http'\nimport type { ClientOptions, ServerClientOptions } from './types'\nimport { AuthBrowserClient, AuthServerClient } from './auth'\nimport { CommsClient } from './comms'\nimport { SessionManager } from './session/manager'\nimport { MemoryStorageAdapter, Storage } from './storage'\nimport type { NulvlessStorage } from './storage/types'\n\nfunction defaultStorage(): NulvlessStorage {\n return typeof window !== 'undefined' ? Storage.Local : new MemoryStorageAdapter()\n}\n\n/**\n * Browser client — use with a public key (`pk_...`).\n *\n * Only exposes endpoints that accept public keys.\n * Safe to instantiate in frontend code.\n */\nexport class NulvlessClient {\n readonly auth: AuthBrowserClient\n\n constructor(baseUrl: string, publicKey: string, options?: ClientOptions) {\n const base = baseUrl.replace(/\\/+$/, '')\n const subdomain = new URL(base).hostname.split('.')[0] ?? 'app'\n const tokenKey = options?.storageKeys?.token ?? `nlv-${subdomain}-token`\n const accountsKey = options?.storageKeys?.accounts ?? `${tokenKey}-accounts`\n const storage = options?.storage ?? defaultStorage()\n const session = new SessionManager(storage, tokenKey)\n this.auth = new AuthBrowserClient(\n new HttpClient({\n baseUrl: `${base}/auth`,\n apiKey: publicKey,\n ...options,\n onTokenExpired: ({ deauthOnFailure, expiredToken }) =>\n session.forceRefresh({\n deauthOnFailure,\n ...(expiredToken ? { expiredToken } : {}),\n }),\n }),\n session,\n storage,\n accountsKey,\n options?.multiUser ?? false,\n options?.autoRefresh ?? true,\n )\n }\n}\n\n/**\n * Server client — use with a private key (`sk_...`).\n *\n * Has access to everything in `NulvlessClient` plus private-only endpoints.\n * Never instantiate in browser code — the private key must stay secret.\n */\nexport class NulvlessServerClient {\n readonly auth: AuthServerClient\n readonly comms: CommsClient\n\n constructor(baseUrl: string, privateKey: string, options?: ServerClientOptions) {\n const base = baseUrl.replace(/\\/+$/, '')\n this.auth = new AuthServerClient(new HttpClient({ baseUrl: `${base}/auth`, apiKey: privateKey, ...options }))\n this.comms = new CommsClient(new HttpClient({ baseUrl: `${base}/comms`, apiKey: privateKey, ...options }))\n }\n}\n","/**\n * Headers extracted from the user's browser request and forwarded to the\n * auth service so it can build an accurate session fingerprint (device,\n * browser, OS, IP-based location, etc.).\n */\nconst TRACKING_HEADERS = [\n 'authorization',\n 'user-agent',\n 'host',\n 'origin',\n 'referer',\n 'accept',\n 'accept-language',\n 'sec-fetch-dest',\n 'x-forwarded-for',\n 'x-forwarded-host',\n 'x-forwarded-proto',\n 'cloudfront-forwarded-proto',\n] as const\n\ntype NodeHeaders = Record<string, string | string[] | undefined>\n\n/**\n * Extracts user browser headers from an incoming server request and returns\n * them as a plain `Record<string, string>` ready to pass via `options.headers`.\n *\n * Accepts:\n * - **Web `Request`** — Next.js App Router, Cloudflare Workers, Deno\n * - **Node.js `IncomingMessage`** — Express, Next.js Pages Router, Fastify raw\n *\n * @example\n * // Next.js App Router\n * export async function POST(request: Request) {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(request),\n * })\n * }\n *\n * @example\n * // Express / Next.js Pages Router\n * app.post('/login', async (req, res) => {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(req),\n * })\n * })\n */\nexport function forwardUserHeaders(\n req: Request | { headers: NodeHeaders },\n): Record<string, string> {\n const result: Record<string, string> = {}\n\n // Web Request API (Next.js App Router, Workers, Deno)\n if (typeof Request !== 'undefined' && req instanceof Request) {\n for (const key of TRACKING_HEADERS) {\n const val = req.headers.get(key)\n if (val) result[key] = val\n }\n return result\n }\n\n // Node.js IncomingMessage (Express, Next.js Pages Router)\n const nodeHeaders = (req as { headers: NodeHeaders }).headers\n for (const key of TRACKING_HEADERS) {\n const val = nodeHeaders[key]\n if (val) result[key] = Array.isArray(val) ? val[0]! : val\n }\n\n return result\n}\n","/**\n * Headers that keep a response carrying auth state out of every cache.\n *\n * `no-store` alone covers HTTP/1.1; `Pragma` and `Expires` cover HTTP/1.0 caches\n * and proxies that predate it. RFC 6749 §5.1 and OpenID Connect Core §3.1.3.3\n * both require the first two on any response carrying a token.\n */\nexport const AUTH_CACHE_HEADERS = {\n 'Cache-Control': 'private, no-cache, no-store, must-revalidate, max-age=0',\n Expires: '0',\n Pragma: 'no-cache',\n} as const\n\ninterface WebResponseLike {\n headers: { set(name: string, value: string): void }\n}\n\ninterface NodeResponseLike {\n setHeader(name: string, value: string): unknown\n}\n\nfunction isNodeResponse(response: unknown): response is NodeResponseLike {\n return typeof (response as NodeResponseLike).setHeader === 'function'\n}\n\nfunction isWebResponse(response: unknown): response is WebResponseLike {\n const headers = (response as WebResponseLike).headers\n\n return typeof headers?.set === 'function'\n}\n\n/**\n * Marks a response as carrying auth state so no cache stores it, and returns it\n * so the call can be inlined into a `return`.\n *\n * Apply this to **your own** response whenever it sets, rotates or clears a\n * session — sign-in, refresh, sign-out. A CDN that caches such a response serves\n * one visitor's session cookie to the next, signing them in as someone else; it\n * is a failure that has happened in production on CloudFront, Vercel Edge and\n * Cloudflare. The usual protection does not apply here: shared caches are barred\n * from reusing responses to requests carrying `Authorization`, but yours is\n * authenticated by cookie, which carries no such rule.\n *\n * Accepts a Web `Response` (Next.js App Router, Workers, Deno) or a Node\n * `ServerResponse` (Express, Next.js Pages Router). Use {@link AUTH_CACHE_HEADERS}\n * directly where a framework takes a plain header map instead.\n *\n * @example\n * // Next.js App Router\n * export async function POST(request: Request) {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(request),\n * })\n *\n * const response = NextResponse.json({ ok: true })\n * response.cookies.set('session', data.access_token)\n *\n * return applyAuthCacheHeaders(response)\n * }\n *\n * @example\n * // Express\n * app.post('/login', async (req, res) => {\n * const { data } = await nulvless.auth.signIn(params, {\n * headers: forwardUserHeaders(req),\n * })\n *\n * applyAuthCacheHeaders(res)\n * res.cookie('session', data.access_token, { httpOnly: true, sameSite: 'lax' })\n * res.json({ ok: true })\n * })\n */\nexport function applyAuthCacheHeaders<T>(response: T): T {\n const entries = Object.entries(AUTH_CACHE_HEADERS)\n\n if (isWebResponse(response)) {\n for (const [name, value] of entries) response.headers.set(name, value)\n } else if (isNodeResponse(response)) {\n for (const [name, value] of entries) response.setHeader(name, value)\n }\n\n return response\n}\n","export { NulvlessClient, NulvlessServerClient } from './client'\nexport { AuthClient, AuthBrowserClient, AuthServerClient } from './auth'\nexport type { AccountEntry } from './auth/accounts'\nexport { AuthEventEmitter } from './auth/emitter'\nexport type { AuthEvents } from './auth/emitter'\nexport { FactorsClient } from './auth/factors'\nexport { UsersClient } from './auth/users'\nexport { SessionsClient } from './auth/sessions'\nexport { SecurityClient } from './auth/security'\nexport { GrantsClient } from './auth/grants'\nexport { OAuthClient, OAuthGrantsClient } from './auth/oauth'\nexport { AdminClient } from './auth/admin'\nexport { CommsClient, EmailClient, SmsClient } from './comms'\nexport { TemplatesClient } from './comms/templates'\nexport { HttpClient } from './http'\nexport { NulvlessException } from './exceptions/nulvless.exception'\nexport { Storage } from './storage'\nexport { forwardUserHeaders } from './helpers/forward-user-headers'\nexport { applyAuthCacheHeaders, AUTH_CACHE_HEADERS } from './helpers/auth-cache-headers'\nexport { SessionManager } from './session/manager'\nexport type { NulvlessStorage } from './storage/types'\nexport type { StoredSession } from './session/types'\nexport type * from './types'\nexport type * from './error-codes'\nexport type * from './auth/types'\nexport type * from './comms/types'\n\nimport type { ClientOptions, ServerClientOptions } from './types'\nimport { NulvlessClient, NulvlessServerClient } from './client'\n\n/**\n * Creates a browser-safe client using a public key (`pk_...`).\n *\n * Exposes: `.auth`\n *\n * @example\n * import { createClient } from '@nulvless/nulvless-js'\n *\n * const nulvless = createClient('https://auth.example.com', 'pk_live_...')\n *\n * const { data, error } = await nulvless.auth.signIn({\n * email: 'user@example.com',\n * password: 'secret',\n * })\n */\nexport function createClient(\n url: string,\n publicKey: string,\n options?: ClientOptions,\n): NulvlessClient {\n return new NulvlessClient(url, publicKey, options)\n}\n\n/**\n * Creates a server-side client using a private key (`sk_...`).\n * Never use this in browser code.\n *\n * Exposes: `.auth`, `.comms`\n *\n * @example\n * import { createServerClient } from '@nulvless/nulvless-js'\n *\n * const nulvless = createServerClient('https://api.example.com', 'sk_live_...')\n *\n * const { error } = await nulvless.comms.email.send({\n * to: 'user@example.com',\n * template: 'welcome',\n * params: { name: 'Gleisson' },\n * })\n */\nexport function createServerClient(\n url: string,\n privateKey: string,\n options?: ServerClientOptions,\n): NulvlessServerClient {\n return new NulvlessServerClient(url, privateKey, options)\n}\n"]}
|