@keetanetwork/anchor 0.0.20 → 0.0.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,cAAc,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,YAAY,MAAM,6BAA6B,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,oCAAoC,EAAE,kCAAkC,EAAwH,MAAM,sCAAsC,CAAC;AAKtP,MAAM,eAAe,GAAsC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;AAkBtF,MAAM,yBAAyB,40CAAsC,CAAC;AA8OtE,SAAS,uBAAuB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,MAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACpF,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC;YAClG,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAc;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;IACR,CAAC;IAED,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,MAAK,CAAC,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACtF,MAAK,CAAC,IAAI,KAAK,CAAC,2DAA2D,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YAChD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAK,CAAC,IAAI,KAAK,CAAC,2DAA2D,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC;YACpG,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAK,CAAC,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACnH,MAAK,CAAC,IAAI,KAAK,CAAC,yDAAyD,OAAO,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5E,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAK,CAAC,IAAI,KAAK,CAAC,+DAA+D,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC;YACrG,CAAC;YAED,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAK,CAAC,IAAI,KAAK,CAAC,wBAAwB,SAAS,yBAAyB,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;YACrG,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC/C,gDAAgD;IAChD,4BAA4B,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC9C,gDAAgD;IAChD,4BAA4B,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kCAAkC,CAAC,KAAc;IACzD,gDAAgD;IAChD,4BAA4B,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAc;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,cAAc,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACpF,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzG,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC;gBAClG,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAK,CAAC,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QACpE,MAAK,CAAC,IAAI,KAAK,CAAC,gDAAgD,OAAO,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;AACF,CAAC;AAED,MAAM,iCAAiC,GAAG,UAAS,KAAc;IAChE,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACpC,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/B,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChC,+BAA+B,CAAC,KAAK,CAAC,CAAC;IAEvC,OAAM,CAAC,KAAK,CAAC,CAAC;AAEf,CAAC,CAAC;AACF,MAAM,6BAA6B,GAAG,UAAS,KAAc;IAC5D,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChC,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACvC,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,KAAK,WAAU,KAAc;IACjE,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE/B,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAK,CAAC,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC;IAClC,mEAAmE;IACnE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5C,MAAK,CAAC,IAAI,KAAK,CAAC,4CAA4C,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,8DAA8D;IAC9D,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9B,8DAA8D;IAC9D,aAAa;IACb,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,wCAAwC,GAAG,KAAK,WAAU,KAAc;IAC7E,kCAAkC,CAAC,KAAK,CAAC,CAAC;IAC1C,mCAAmC;IACnC,0CAA0C;IAC1C,wBAAwB;IACxB,IAAI,CAAC,CAAC,iBAAiB,IAAI,KAAK,CAAC,EAAE,CAAC;QACnC,MAAK,CAAC,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC;IAC7C,mEAAmE;IACnE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5C,MAAK,CAAC,IAAI,KAAK,CAAC,uDAAuD,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,yEAAyE;IACzE,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9B,yEAAyE;IACzE,aAAa;IACb,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,aAAa;AAEb,qBAAqB;AAErB,KAAK,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,mEAAmE;IACnE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,OAAM,CAAC;QACN,GAAG,KAAK;QACR,UAAU;KACV,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CAAC,KAA0B;IACnE,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,KAAK,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,OAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5B,OAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACP,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;AACF,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAAc,EAAE,QAAsD;IACxG,oDAAoD;IACpD,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACjE,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,WAAU,IAAI;QACjF,OAAM,CAAC,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC,CAAC;IAEJ,KAAK,MAAM,iBAAiB,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QACxD,MAAM,0BAA0B,GAAG,gCAAgC,CAAC,iBAAiB,CAAC,CAAC;QACvF,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAC9D,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACF,CAAC;IAED,OAAM,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,KAAc,EAAE,QAAoD;IACrG,oDAAoD;IACpD,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,gBAAgB,GAAG,MAAM,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACpC,SAAS;QACV,CAAC;QAED,oJAAoJ;QACpJ,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAuB,CAAC,EAAE,CAAC;YAC7D,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC;AAED,aAAa;AAEb,SAAS,+BAA+B,CAAC,KAAyB;IACjE,IAAI,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,OAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,aAAa,8MAA0B,CAAC;AAwB7C,CAAC;AAID,CAAC;AAID,CAAC;AAID,CAAC;AAsCF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AA8DpD,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","sourcesContent":["import * as KeetaNetClient from '@keetanetwork/keetanet-client';\nimport type { GenericAccount as KeetaNetGenericAccount } from '@keetanetwork/keetanet-client/lib/account.js';\nimport * as CurrencyInfo from '@keetanetwork/currency-info';\nimport type { Logger } from './log/index.ts';\nimport type { JSONSerializable } from './utils/json.ts';\nimport { assertNever } from './utils/never.js';\nimport { Buffer } from './utils/buffer.js';\nimport crypto from './utils/crypto.js';\n\nimport { createIs, createAssert } from 'typia';\nimport { convertAssetLocationInputToCanonical, convertAssetSearchInputToCanonical, type MovableAssetSearchInput, type AssetLocationString, type AssetWithRailsMetadata, type Rail, type SupportedAssets } from '../services/asset-movement/common.js';\n\ntype ExternalURL = { external: '2b828e33-2692-46e9-817e-9b93d63f28fd'; url: string; };\n\ntype KeetaNetAccount = InstanceType<typeof KeetaNetClient.lib.Account>;\nconst KeetaNetAccount: typeof KeetaNetClient.lib.Account = KeetaNetClient.lib.Account;\ntype KeetaNetAccountTokenPublicKeyString = ReturnType<InstanceType<typeof KeetaNetClient.lib.Account<typeof KeetaNetAccount.AccountKeyAlgorithm.TOKEN>>['publicKeyString']['get']>;\n\n/**\n * Canonical form of a currency code for use in the ServiceMetadata\n * Which is either the ISO currency code (e.g. \"USD\", \"EUR\", \"JPY\")\n * or a cryptocurrency code prefixed with a dollar sign (e.g. \"$BTC\", \"$ETH\")\n */\ntype ServiceMetadataCurrencyCodeCanonical = CurrencyInfo.ISOCurrencyCode | `$${string}`;\n/**\n * Input types which can be used to search for which token represents\n * a given currency or cryptocurrency.\n */\ntype CurrencySearchInput = ServiceMetadataCurrencyCodeCanonical | CurrencyInfo.ISOCurrencyNumber | CurrencyInfo.Currency;\ntype CurrencySearchCanonical = ServiceMetadataCurrencyCodeCanonical;\ntype CountrySearchInput = CurrencyInfo.ISOCountryCode | CurrencyInfo.ISOCountryNumber | CurrencyInfo.Country;\ntype CountrySearchCanonical = CurrencyInfo.ISOCountryCode; /* XXX:TODO */\n\nconst isCurrencySearchCanonical = createIs<CurrencySearchCanonical>();\n\n// #region Global Service Metadata\n/**\n * Service Metadata General Structure\n */\ntype ServiceMetadata = {\n\tversion: number;\n\t/**\n\t * Map of the currency code to the token public key which\n\t * represents that currency.\n\t */\n\tcurrencyMap: {\n\t\t[currencyCode in ServiceMetadataCurrencyCodeCanonical]?: KeetaNetAccountTokenPublicKeyString;\n\t};\n\tservices: {\n\t\tbanking?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\tcreateAccount?: string;\n\t\t\t\t};\n\t\t\t\tcurrencyCodes: string[];\n\t\t\t\tcountryCodes: string[];\n\t\t\t\tkycProviders?: string[];\n\t\t\t};\n\t\t};\n\t\tkyc?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Check if the KYC provider can\n\t\t\t\t\t * service a more specific locality\n\t\t\t\t\t * (optional)\n\t\t\t\t\t */\n\t\t\t\t\tcheckLocality?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Request an estimate for a KYC\n\t\t\t\t\t * verification (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Begin the KYC verification process\n\t\t\t\t\t * with this KYC provider\n\t\t\t\t\t */\n\t\t\t\t\tcreateVerification?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the certificate for the\n\t\t\t\t\t * KYC verification\n\t\t\t\t\t */\n\t\t\t\t\tgetCertificates?: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Country codes which this KYC provider can\n\t\t\t\t * validate accounts in. If this is not\n\t\t\t\t * specified, then the KYC provider can\n\t\t\t\t * validate accounts in any country.\n\t\t\t\t */\n\t\t\t\tcountryCodes?: string[];\n\t\t\t\t/**\n\t\t\t\t * The Certificate Authority (CA) Certificate\n\t\t\t\t * that this KYC provider uses to sign KYC\n\t\t\t\t * certificates. This is used to identify the\n\t\t\t\t * KYC provider.\n\t\t\t\t */\n\t\t\t\tca: string;\n\t\t\t};\n\t\t};\n\t\t/**\n\t\t * Foreign Exchange (FX) services\n\t\t *\n\t\t * This is used to identify service providers which\n\t\t * can convert currency from one currency to another.\n\t\t */\n\t\tfx?: {\n\t\t\t/**\n\t\t\t * Provider ID which identifies the FX provider\n\t\t\t */\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Get an estimate for a currency\n\t\t\t\t\t * conversion (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get a quote for a currency\n\t\t\t\t\t * conversion\n\t\t\t\t\t */\n\t\t\t\t\tgetQuote: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Create an exchange to convert\n\t\t\t\t\t * currency\n\t\t\t\t\t */\n\t\t\t\t\tcreateExchange: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the status of an exchange\n\t\t\t\t\t * which was previously created\n\t\t\t\t\t */\n\t\t\t\t\tgetExchangeStatus: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Path for which can be used to identify which\n\t\t\t\t * currencies this FX provider can convert\n\t\t\t\t * between.\n\t\t\t\t */\n\t\t\t\tfrom: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency code which this FX provider can\n\t\t\t\t\t * convert from\n\t\t\t\t\t */\n\t\t\t\t\tcurrencyCodes: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency codes which this FX provider can\n\t\t\t\t\t * convert to from the `from.currencyCode`\n\t\t\t\t\t */\n\t\t\t\t\tto: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * KYC providers which this FX provider\n\t\t\t\t\t * supports (DN) -- if not specified,\n\t\t\t\t\t * then it does not require KYC.\n\t\t\t\t\t */\n\t\t\t\t\tkycProviders?: string[];\n\t\t\t\t}[];\n\t\t\t}\n\t\t};\n\t\tassetMovement?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\tinitiateTransfer?: string;\n\t\t\t\t\tgetTransferStatus?: string;\n\t\t\t\t\tcreatePersistentForwarding?: string;\n\t\t\t\t\tlistTransactions?: string\n\t\t\t\t};\n\n\t\t\t\tsupportedAssets: {\n\t\t\t\t\tasset: KeetaNetAccountTokenPublicKeyString;\n\n\t\t\t\t\tpaths: {\n\t\t\t\t\t\tpair: [ AssetWithRailsMetadata, AssetWithRailsMetadata ]\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * KYC providers which this Asset Movement Provider\n\t\t\t\t\t\t * supports (DN) -- if not specified,\n\t\t\t\t\t\t * then it does not require KYC.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tkycProviders?: string[];\n\t\t\t\t\t}[];\n\t\t\t\t}[];\n\t\t\t}\n\t\t};\n\t\tcards?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype ServiceMetadataExternalizable = ToJSONValuizable<ServiceMetadata>;\n\n/**\n * Types of services which can be resolved\n */\ntype Services = keyof ServiceMetadata['services'];\n\n/**\n * Search criteria for each service type\n */\ntype ServiceSearchCriteria<T extends Services> = {\n\t'banking': {\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ALL of the following currencies.\n\t\t */\n\t\tcurrencyCodes?: CurrencySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ANY of the following countries.\n\t\t */\n\t\tcountryCodes?: CountrySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts verified by ANY of the following KYC providers\n\t\t * (DN).\n\t\t */\n\t\tkycProviders?: string[]; /* XXX:TODO */\n\t};\n\t'fx': {\n\t\t/**\n\t\t * Search for a provider which can convert from the following\n\t\t * input currency\n\t\t */\n\t\tinputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which can convert to the following\n\t\t * output currency\n\t\t */\n\t\toutputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which supports ANY of the following\n\t\t * KYC providers\n\t\t */\n\t\tkycProviders?: string[];\n\t};\n\t'kyc': {\n\t\t/**\n\t\t * Search for a KYC provider which can verify accounts in ALL\n\t\t * of the following countries.\n\t\t */\n\t\tcountryCodes: CountrySearchInput[];\n\t};\n\t'assetMovement': {\n\t\tasset?: MovableAssetSearchInput;\n\t\tfrom?: AssetLocationString;\n\t\tto?: AssetLocationString;\n\t\trail?: Rail;\n\t\t/**\n\t\t * Search for a provider which supports ANY of the following\n\t\t * KYC providers\n\t\t */\n\t\tkycProviders?: string[];\n\t};\n\t'cards': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n}[T];\n\ntype ResolverLookupServiceResults<Service extends Services> = { [id: string]: ToValuizableObject<NonNullable<ServiceMetadata['services'][Service]>[string]> };\n\ntype ServicesMetadataLookupMap = {\n\t[Service in Services]: {\n\t\tcriteria: ServiceSearchCriteria<Service>;\n\t\tresults: ResolverLookupServiceResults<Service>;\n\t};\n};\n\nfunction assertValidCountryCodes(input: unknown): asserts input is { countryCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\tthrow(new Error('Expected \"countryCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.countryCodes !== 'function' && !Array.isArray(input.countryCodes)) {\n\t\tthrow(new Error(`Expected \"countryCodes\" to be an array | function, got ${typeof input.countryCodes}`));\n\t}\n\n\tif (Array.isArray(input.countryCodes)) {\n\t\tfor (const countryCode of input.countryCodes) {\n\t\t\tif (typeof countryCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"countryCodes\" to be an array of strings, got ${typeof countryCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOptionalCountryCodes(input: unknown): asserts input is { countryCodes?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\treturn;\n\t}\n\n\tassertValidCountryCodes(input);\n}\n\nfunction assertValidCurrencyCodes(input: unknown): asserts input is { currencyCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['currencyCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('currencyCodes' in input)) {\n\t\tthrow(new Error('Expected \"currencyCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.currencyCodes !== 'function' && !Array.isArray(input.currencyCodes)) {\n\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array | function, got ${typeof input.currencyCodes}`));\n\t}\n\n\tif (Array.isArray(input.currencyCodes)) {\n\t\tfor (const currencyCode of input.currencyCodes) {\n\t\t\tif (typeof currencyCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array of strings, got ${typeof currencyCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsBanking(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['operations'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('operations' in input)) {\n\t\tthrow(new Error('Expected \"operations\" key in KYC service, but it was not found'));\n\t}\n\n\tif ((typeof input.operations !== 'object' || input.operations === null) && typeof input.operations !== 'function') {\n\t\tthrow(new Error(`Expected \"operations\" to be an object | function, got ${typeof input.operations}`));\n\t}\n\n\tif (typeof input.operations !== 'function') {\n\t\tfor (const [operation, operationValue] of Object.entries(input.operations)) {\n\t\t\tif (typeof operation !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations\" to be an object with string keys, got ${typeof operation}`));\n\t\t\t}\n\n\t\t\tif (typeof operationValue !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations.${operation}\" to be a string, got ${typeof operationValue}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsKYC(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOperationsFX(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['fx']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOperationsAssetMovement(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['assetMovement']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOptionalKYCProviders(input: unknown): asserts input is { kycProviders?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['kycProviders'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif ('kycProviders' in input) {\n\t\tif (typeof input.kycProviders !== 'function' && !Array.isArray(input.kycProviders)) {\n\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array | function, got ${typeof input.kycProviders}`));\n\t\t}\n\n\t\tif (Array.isArray(input.kycProviders)) {\n\t\t\tfor (const kycProvider of input.kycProviders) {\n\t\t\t\tif (typeof kycProvider !== 'string') {\n\t\t\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array of strings, got ${typeof kycProvider}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidCA(input: unknown): asserts input is { ca: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['ca'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('ca' in input)) {\n\t\tthrow(new Error('Expected \"ca\" key in KYC service, but it was not found'));\n\t}\n\n\tif (typeof input.ca !== 'string' && typeof input.ca !== 'function') {\n\t\tthrow(new Error(`Expected \"ca\" to be a string | function, got ${typeof input.ca}`));\n\t}\n}\n\nconst assertResolverLookupBankingResult = function(input: unknown): ResolverLookupServiceResults<'banking'>[string] {\n\tassertValidOperationsBanking(input);\n\tassertValidCountryCodes(input);\n\tassertValidCurrencyCodes(input);\n\tassertValidOptionalKYCProviders(input);\n\n\treturn(input);\n\n};\nconst assertResolverLookupKYCResult = function(input: unknown): ResolverLookupServiceResults<'kyc'>[string] {\n\tassertValidOperationsKYC(input);\n\tassertValidOptionalCountryCodes(input);\n\tassertValidCA(input);\n\n\treturn(input);\n};\n\nconst assertResolverLookupFXResult = async function(input: unknown): Promise<ResolverLookupServiceResults<'fx'>[string]> {\n\tassertValidOperationsFX(input);\n\n\tif (!('from' in input)) {\n\t\tthrow(new Error('Expected \"from\" key in FX service, but it was not found'));\n\t}\n\n\tconst fromUnrealized = input.from;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(fromUnrealized)) {\n\t\tthrow(new Error(`Expected \"from\" to be an Valuizable, got ${typeof fromUnrealized}`));\n\t}\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\tawait fromUnrealized('array');\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\t// @ts-ignore\n\treturn(input);\n};\n\nconst assertResolverLookupAssetMovementResults = async function(input: unknown): Promise<ResolverLookupServiceResults<'assetMovement'>[string]> {\n\tassertValidOperationsAssetMovement(input);\n\t// assertValidOperationsKYC(input);\n\t// assertValidOptionalCountryCodes(input);\n\t// assertValidCA(input);\n\tif (!('supportedAssets' in input)) {\n\t\tthrow(new Error('Expected \"supportedAssets\" key in asset movement service, but it was not found'));\n\t}\n\n\tconst fromUnrealized = input.supportedAssets;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(fromUnrealized)) {\n\t\tthrow(new Error(`Expected \"supportedAssets\" to be an Valuizable, got ${typeof fromUnrealized}`));\n\t}\n\n\t// XXX:TODO: Perform deeper validation of the \"supportedAssets\" structure\n\tawait fromUnrealized('array');\n\n\t// XXX:TODO: Perform deeper validation of the \"supportedAssets\" structure\n\t// @ts-ignore\n\treturn(input);\n};\n\n// #endregion\n\n// #region Validation\n\nasync function isValidOperations(input: unknown): Promise<{ operations: ValuizableMethod } | false> {\n\tif (typeof input !== 'object' || input === null) {\n\t\treturn(false);\n\t}\n\n\tif (!('operations' in input)) {\n\t\treturn(false);\n\t}\n\n\tconst operations = input.operations;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(operations)) {\n\t\treturn(false);\n\t}\n\n\treturn({\n\t\t...input,\n\t\toperations\n\t});\n}\n\nfunction convertToCurrencySearchCanonical(input: CurrencySearchInput): CurrencySearchCanonical {\n\tif (CurrencyInfo.Currency.isCurrencyCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Currency.isISOCurrencyNumber(input)) {\n\t\tinput = new CurrencyInfo.Currency(input);\n\t\treturn(input.code);\n\t} else if (typeof input === 'string') {\n\t\treturn(input);\n\t} else if (input === null) {\n\t\tthrow(new Error('Invalid currency input: null'));\n\t} else if ('code' in input) {\n\t\treturn(input.code);\n\t} else {\n\t\tthrow(new Error(`Invalid currency input: ${input}`));\n\t}\n}\n\nasync function hasAllCurrencyCodes(input: unknown, criteria: { currencyCodes: CurrencySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCurrencyCodes(input);\n\n\tconst currencyCodes = await input.currencyCodes?.('array') ?? [];\n\tconst inputCurrencyCodes = await Promise.all(currencyCodes.map(async function(item) {\n\t\treturn(await item?.('primitive'));\n\t}));\n\n\tfor (const checkCurrencyCode of criteria.currencyCodes) {\n\t\tconst checkCurrencyCodeCanonical = convertToCurrencySearchCanonical(checkCurrencyCode);\n\t\tif (!inputCurrencyCodes.includes(checkCurrencyCodeCanonical)) {\n\t\t\treturn(false);\n\t\t}\n\t}\n\n\treturn(true);\n}\n\nasync function hasAnyCountryCodes(input: unknown, criteria: { countryCodes: CountrySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCountryCodes(input);\n\n\tconst countryCodes = await input.countryCodes?.('array') ?? [];\n\n\tfor (const countryCode of countryCodes) {\n\t\tconst countryCodeValue = await countryCode?.('primitive');\n\t\tif (countryCodeValue === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\tif (criteria.countryCodes.includes(countryCodeValue as any)) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\n\treturn(false);\n}\n\n// #endregion\n\nfunction convertToCountrySearchCanonical(input: CountrySearchInput): CountrySearchCanonical {\n\tif (CurrencyInfo.Country.isCountryCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Country.isISOCountryNumber(input)) {\n\t\tinput = new CurrencyInfo.Country(input);\n\t}\n\n\treturn(input.code);\n}\n\n/**\n * Check if a value is an ExternalURL\n */\nconst isExternalURL = createIs<ExternalURL>();\n\ntype JSONSerializablePrimitive = Exclude<JSONSerializable, object>;\ntype ValuizeInput = JSONSerializablePrimitive | ValuizableObject | ValuizableArray;\ntype ValuizableArray = (ValuizableMethod | undefined)[];\ntype ValuizableObject = { [key: string]: ValuizableMethod | undefined };\n\ntype ValuizableKind = 'any' | 'object' | 'array' | 'primitive' | 'string' | 'number' | 'boolean';\n\ninterface ValuizableMethodBase {\n\t(expect?: ValuizableKind): Promise<ValuizeInput>;\n\t(expect: 'any'): Promise<ValuizeInput>;\n}\n\ninterface ToValuizableExpectPrimitive<Primitive extends JSONSerializablePrimitive = JSONSerializablePrimitive> extends ValuizableMethodBase {\n\t(expect: 'primitive'): Promise<Primitive>;\n}\n\ninterface ValuizableMethod extends ValuizableMethodBase, ToValuizableExpectPrimitive {\n\t(expect: 'object'): Promise<ValuizableObject>;\n\t(expect: 'array'): Promise<ValuizableArray>;\n\t(expect: 'string'): Promise<string>;\n\t(expect: 'number'): Promise<number>;\n\t(expect: 'boolean'): Promise<boolean>;\n};\n\ninterface ToValuizableExpectString extends ValuizableMethodBase, ToValuizableExpectPrimitive<string> {\n\t(expect: 'string'): Promise<string>;\n};\n\ninterface ToValuizableExpectNumber extends ValuizableMethodBase, ToValuizableExpectPrimitive<number> {\n\t(expect: 'number'): Promise<number>;\n};\n\ninterface ToValuizableExpectBoolean extends ValuizableMethodBase, ToValuizableExpectPrimitive<boolean> {\n\t(expect: 'boolean'): Promise<boolean>;\n};\n\ninterface ToValuizableExpectObject<T> extends ValuizableMethodBase {\n\t(expect: 'object'): Promise<T>;\n}\n\ninterface ToValuizableExpectArray<T extends unknown[]> extends ValuizableMethodBase {\n\t(expect: 'array'): Promise<T>;\n}\n\n/* eslint-disable @stylistic/indent */\ntype ToValuizable<T> =\n\tT extends string ? ToValuizableExpectString :\n\tT extends number ? ToValuizableExpectNumber :\n\tT extends boolean ? ToValuizableExpectBoolean :\n\tT extends JSONSerializablePrimitive ? ToValuizableExpectPrimitive<T> :\n\tT extends unknown[] ? ToValuizableExpectArray<{ [K in keyof T]: ToValuizable<T[K]> }> :\n\tT extends object ? ToValuizableExpectObject<ToValuizableObject<T>> :\n\tT extends undefined ? undefined :\n\tnever;\n\ntype ToValuizableObject<T extends object> = {\n\t[K in keyof T]: ToValuizable<T[K]>;\n};\n\ntype ToJSONValuizableObject<T extends object> = {\n\t[K in keyof T]: (\n\t\tT[K] extends object ?\n\t\t\tToJSONValuizableObject<T[K]> :\n\t\tT[K] extends (object | undefined) ?\n\t\t\tToJSONValuizableObject<NonNullable<T[K]>> | undefined :\n\t\tT[K]\n\t) | ExternalURL;\n};\ntype ToJSONValuizable<T> = ToJSONValuizableObject<{ tmp: T }>['tmp'];\n\ntype ValuizeResolvable = JSONSerializablePrimitive | ValuizableObject | ValuizableArray | ValuizableMethod;\n\n/*\n * Access token to share with the Metadata object to allow it to\n * access the mutable stats object.\n */\nconst statsAccessToken = Symbol('statsAccessToken');\n\n/**\n * A cache object\n */\ntype URLCacheObject = Map<string, {\n\tpass: true;\n\tvalue: JSONSerializable;\n\texpires: Date;\n} | {\n\tpass: false;\n\terror: unknown;\n\texpires: Date;\n}>;\n\n\ntype ResolverConfig = {\n\t/**\n\t * The \"root\" account to use as the basis for all lookups. It should\n\t * contain the authoritative information for resolving in its\n\t * Metadata.\n\t */\n\troot: KeetaNetGenericAccount;\n\t/**\n\t * A KeetaNet Client to access the network using.\n\t */\n\tclient: KeetaNetClient.Client | KeetaNetClient.UserClient;\n\t/**\n\t * A list of trusted Certificate Authorities to use when connecting to\n\t * external HTTPS services.\n\t */\n\ttrustedCAs: string[]; /* XXX:TODO */\n\t/**\n\t * Logger to use for debugging\n\t */\n\tlogger?: Logger;\n\t/**\n\t * ID for this instance of the resolver\n\t */\n\tid?: string;\n\t/**\n\t * Caching Parameters\n\t */\n\tcache?: Omit<NonNullable<MetadataConfig['cache']>, 'instance'>;\n}\n\n\ntype MetadataConfig = {\n\ttrustedCAs: ResolverConfig['trustedCAs'];\n\tclient: KeetaNetClient.Client;\n\tlogger?: ResolverConfig['logger'];\n\tresolver: Resolver;\n\tcache?: {\n\t\tinstance: URLCacheObject;\n\t\tpositiveTTL?: number;\n\t\tnegativeTTL?: number;\n\t};\n\tparent?: Metadata;\n};\n\ntype ValuizableInstance = { value: ValuizableMethod };\n\nconst assertServiceMetadata = createAssert<ToJSONValuizable<ServiceMetadata>>();\nconst assertKeetaSupportedAssets = createAssert<SupportedAssets[]>();\n\nclass Metadata implements ValuizableInstance {\n\treadonly #cache: Required<NonNullable<MetadataConfig['cache']>>;\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #url: URL;\n\treadonly #resolver: Resolver;\n\treadonly #stats: ResolverStats;\n\tprivate readonly seenURLs: Set<string>;\n\n\tprivate static readonly instanceTypeID = 'Metadata:c85b3d67-9548-4042-9862-f6e6677690ac';\n\n\tstatic isInstance(value: unknown): value is Metadata {\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn(false);\n\t\t}\n\t\tif (!('instanceID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(value.instanceID === Metadata.instanceTypeID);\n\t}\n\n\t/**\n\t * Format the supplied Metadata as appropriate to be included\n\t * within the Metadata field of a KeetaNet acccount to serve\n\t * as the Metadata for the Resolver.\n\t */\n\tstatic formatMetadata(metadata: ToJSONValuizable<ServiceMetadata>): string;\n\t// eslint-disable-next-line @typescript-eslint/unified-signatures\n\tstatic formatMetadata(metadata: JSONSerializable): string;\n\tstatic formatMetadata(metadata: JSONSerializable | ToJSONValuizable<ServiceMetadata>): string {\n\t\tconst metadataBytes = Buffer.from(JSON.stringify(metadata), 'utf-8');\n\t\tconst metadataCompressed = KeetaNetClient.lib.Utils.Buffer.ZlibDeflate(KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(metadataBytes));\n\t\tconst metadataEncoded = Buffer.from(metadataCompressed).toString('base64');\n\n\t\treturn(metadataEncoded);\n\t}\n\n\t/**\n\t * Assert that the supplied value is a valid Metadata Root Object\n\t */\n\tstatic assertMetadata(value: unknown): asserts value is ToJSONValuizable<ServiceMetadata> {\n\t\tassertServiceMetadata(value);\n\t}\n\n\t/**\n\t * Check if the supplied value is a Valuizable method which can\n\t * be called to resolve a Valuizable value.\n\t */\n\tstatic isValuizable(value: unknown): value is ValuizableMethod {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (typeof value !== 'function') {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// @ts-ignore\n\t\tif (!('instanceTypeID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (value.instanceTypeID === Metadata.instanceTypeID) {\n\t\t\treturn(true);\n\t\t}\n\n\t\tif (value.instanceTypeID === 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd') {\n\t\t\treturn(true);\n\t\t}\n\n\t\treturn(false);\n\t}\n\n\t/**\n\t * Recursively resolve a Valuizable value into a fully\n\t * realized JSONSerializable value. This will walk the\n\t * entire structure, calling each Valuizable method\n\t * and replacing it with the returned value.\n\t *\n\t * This should only be used in cases where the entire\n\t * structure needs to be fully realized, as it\n\t * can be quite expensive.\n\t */\n\tstatic async fullyResolveValuizable(value: ValuizeResolvable, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;\n\t// eslint-disable-next-line @typescript-eslint/unified-signatures,@typescript-eslint/no-explicit-any\n\tstatic async fullyResolveValuizable(value: any, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;\n\tstatic async fullyResolveValuizable(value: ValuizeResolvable, invalidReplacement: JSONSerializable = null): Promise<JSONSerializable> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tconst newArray: JSONSerializable[] = [];\n\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\tconst entry = value[i];\n\t\t\t\t\tif (Metadata.isValuizable(entry)) {\n\t\t\t\t\t\tconst newEntry = await Metadata.fullyResolveValuizable(entry);\n\t\t\t\t\t\tnewArray.push(newEntry);\n\t\t\t\t\t} else if (entry === undefined) {\n\t\t\t\t\t\tthrow(new Error(`Array entry ${i} is undefined, which is not valid in JSON`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(newArray);\n\t\t\t} else {\n\t\t\t\tconst newObject: { [key: string]: JSONSerializable; } = {};\n\t\t\t\tfor (const key in value) {\n\t\t\t\t\t/*\n\t\t\t\t\t * Since `key` is the index of the array or\n\t\t\t\t\t * object, it is safe to use it to index\n\t\t\t\t\t * into the array or object.\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst entry = value[key];\n\t\t\t\t\tif (Metadata.isValuizable(entry)) {\n\t\t\t\t\t\tconst newEntry = await Metadata.fullyResolveValuizable(entry);\n\t\t\t\t\t\tnewObject[key] = newEntry;\n\t\t\t\t\t} else if (entry === undefined) {\n\t\t\t\t\t\tthrow(new Error(`Object key \"${key}\" is undefined, which is not valid in JSON`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(newObject);\n\t\t\t}\n\t\t}\n\n\t\tif (Metadata.isValuizable(value)) {\n\t\t\ttry {\n\t\t\t\tconst retval = await value('any');\n\t\t\t\treturn(await Metadata.fullyResolveValuizable(retval));\n\t\t\t} catch {\n\t\t\t\treturn(invalidReplacement);\n\t\t\t}\n\t\t}\n\n\t\tswitch (typeof value) {\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\treturn(value);\n\t\t\tcase 'object':\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn(value);\n\t\t\t\t}\n\t\t\t\tassertNever(value);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassertNever(value);\n\t\t}\n\n\t\tthrow(new Error('invalid input'));\n\t}\n\n\tconstructor(url: string | URL, config: MetadataConfig) {\n\t\t/*\n\t\t * Define an \"instanceTypeID\" as an unenumerable property to\n\t\t * ensure that we can identify this object as an instance of\n\t\t * Metadata, but we do not need to serialize it.\n\t\t */\n\t\tObject.defineProperty(this, 'instanceTypeID', {\n\t\t\tvalue: Metadata.instanceTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t\tthis.#url = new URL(url);\n\t\tthis.#cache = {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tinstance: config.cache?.instance ?? new Map() satisfies URLCacheObject as URLCacheObject,\n\t\t\tpositiveTTL: config.cache?.positiveTTL ?? 60 * 1000,\n\t\t\tnegativeTTL: config.cache?.negativeTTL ?? 5 * 1000\n\t\t};\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#client = config.client;\n\t\tthis.#logger = config.logger;\n\t\tthis.#resolver = config.resolver;\n\t\tthis.#stats = this.#resolver._mutableStats(statsAccessToken);\n\t\tif (config.parent !== undefined) {\n\t\t\tthis.seenURLs = config.parent.seenURLs;\n\t\t} else {\n\t\t\tthis.seenURLs = new Set();\n\t\t}\n\t}\n\n\t/**\n\t * @param metadata Metadata to parse -- base64 encoded string or ArrayBuffer\n\t */\n\tprivate async parseMetadata(metadata: string | ArrayBuffer): Promise<JSONSerializable> {\n\t\tif (typeof metadata === 'string') {\n\t\t\tmetadata = KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(Buffer.from(metadata, 'base64'));\n\t\t}\n\n\t\t/*\n\t\t * Attempt to decompress the metadata. If it fails, then\n\t\t * assume it is not compressed.\n\t\t */\n\t\tlet metadataUncompressed: ArrayBuffer;\n\t\ttry {\n\t\t\tmetadataUncompressed = KeetaNetClient.lib.Utils.Buffer.ZlibInflate(metadata);\n\t\t} catch {\n\t\t\tmetadataUncompressed = metadata;\n\t\t}\n\n\t\tconst metadataBytes = Buffer.from(metadataUncompressed);\n\t\tconst metadataDecoded = metadataBytes.toString('utf-8');\n\n\t\t/*\n\t\t * JSON.parse() will always return a JSONSerializable,\n\t\t * and not `unknown`, so we can safely cast it.\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst retval = await this.resolveValue(JSON.parse(metadataDecoded) as JSONSerializable);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readKeetaNetURL(url: URL): Promise<JSONSerializable> {\n\t\tconst accountString = url.hostname;\n\t\tconst path = url.pathname;\n\n\t\tthis.#stats.keetanet.reads++;\n\n\t\tif (path !== '/metadata') {\n\t\t\tthrow(new Error(`Unsupported path: ${path}`));\n\t\t}\n\n\t\tlet account: KeetaNetGenericAccount | string;\n\t\ttry {\n\t\t\taccount = KeetaNetClient.lib.Account.fromPublicKeyString(accountString);\n\t\t} catch {\n\t\t\treturn('');\n\t\t}\n\n\t\tconst accountInfo = await this.#client.getAccountInfo(account);\n\t\tconst metadata = accountInfo.info.metadata;\n\t\tif (metadata === '') {\n\t\t\treturn('');\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Account info for', accountString, '=', accountInfo.info);\n\t\tconst retval = await this.parseMetadata(metadata);\n\t\treturn(retval);\n\t}\n\n\tprivate async readHTTPSURL(url: URL): Promise<JSONSerializable> {\n\t\tthis.#stats.https.reads++;\n\n\t\tconst results = await fetch(url.toString(), {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Accept': 'application/json'\n\t\t\t}\n\t\t});\n\n\t\tif (!results.ok) {\n\t\t\tthrow(new Error(`Error HTTP status ${results.status} ${results.statusText} for ${url.toString()}`));\n\t\t}\n\n\t\tif (results.status === 204) {\n\t\t\t/*\n\t\t\t * 204 No Content is a valid response, so we return an empty\n\t\t\t * object.\n\t\t\t */\n\t\t\treturn({});\n\t\t}\n\n\t\tif (results.status !== 200) {\n\t\t\tthrow(new Error(`Unexpected HTTP status ${results.status} for ${url.toString()}`));\n\t\t}\n\n\t\tconst metadata = await (await results.blob()).arrayBuffer();\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', metadata);\n\n\t\tconst retval = await this.parseMetadata(metadata);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readURL(url: URL) {\n\t\tthis.#stats.reads++;\n\n\t\tconst cacheKey = url.toString();\n\t\t/*\n\t\t * To ensure any circular references are handled correctly, we\n\t\t * keep track of a chain of accessed URLs. If we see the same\n\t\t * URL twice, then we have a circular reference.\n\t\t */\n\t\tif (this.seenURLs.has(cacheKey)) {\n\t\t\treturn(null);\n\t\t}\n\t\tthis.seenURLs.add(cacheKey);\n\n\t\t/*\n\t\t * Verify that the cache entry is still valid. If it is not,\n\t\t * then remove it from the cache.\n\t\t */\n\t\tlet cacheVal = this.#cache.instance.get(cacheKey);\n\n\t\tif (this.#cache.instance.has(cacheKey) && cacheVal !== undefined) {\n\t\t\tif (cacheVal.expires < new Date()) {\n\t\t\t\tthis.#cache.instance.delete(cacheKey);\n\t\t\t\tcacheVal = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif (cacheVal !== undefined) {\n\t\t\tthis.#stats.cache.hit++;\n\n\t\t\tif (cacheVal.pass) {\n\t\t\t\treturn(cacheVal.value);\n\t\t\t} else {\n\t\t\t\tthrow(cacheVal.error);\n\t\t\t}\n\t\t}\n\n\t\tthis.#stats.cache.miss++;\n\n\t\tlet retval: JSONSerializable;\n\t\ttry {\n\t\t\tconst protocol = url.protocol;\n\t\t\tif (protocol === 'keetanet:') {\n\t\t\t\tretval = await this.readKeetaNetURL(url);\n\t\t\t} else if (protocol === 'https:') {\n\t\t\t\tretval = await this.readHTTPSURL(url);\n\t\t\t} else {\n\t\t\t\tthis.#stats.unsupported.reads++;\n\t\t\t\tthrow(new Error(`Unsupported protocol: ${protocol}`));\n\t\t\t}\n\t\t} catch (readError) {\n\t\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\t\tpass: false,\n\t\t\t\terror: readError,\n\t\t\t\texpires: new Date(Date.now() + this.#cache.negativeTTL)\n\t\t\t});\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), 'failed:', readError);\n\t\t\tthrow(readError);\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', retval);\n\n\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\tpass: true,\n\t\t\tvalue: retval,\n\t\t\texpires: new Date(Date.now() + this.#cache.positiveTTL)\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tprivate async resolveValue<T extends ExternalURL | undefined>(value: T): Promise<JSONSerializable>;\n\tprivate async resolveValue<T extends JSONSerializable | undefined>(value: T): Promise<T>;\n\tprivate async resolveValue<T extends JSONSerializable | ExternalURL | undefined>(value: T): Promise<T | JSONSerializable> {\n\t\tif (value === undefined) {\n\t\t\treturn(value);\n\t\t}\n\n\t\t/*\n\t\t * If the value passed in is a reference to an external URL, then\n\t\t * we need to read that URL (and continue to resolve it).\n\t\t */\n\t\tif (isExternalURL(value)) {\n\t\t\tconst url = new URL(value.url);\n\t\t\tconst retval = await this.readURL(url);\n\n\t\t\treturn(await this.resolveValue(retval));\n\t\t}\n\n\t\treturn(value);\n\t}\n\n\tprivate assertValuizableKind(input: ValuizeInput, expect: ValuizableKind) {\n\t\tswitch (expect) {\n\t\t\tcase 'any':\n\t\t\t\treturn(input);\n\t\t\tcase 'object':\n\t\t\t\tif (typeof input !== 'object') {\n\t\t\t\t\tthrow(new Error(`expected an object, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\tif (input === null) {\n\t\t\t\t\tthrow(new Error('expected an object, got null'));\n\t\t\t\t}\n\n\t\t\t\tif (Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error('expected an object, got an array'));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'array':\n\t\t\t\tif (!Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error(`expected an array, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'primitive':\n\t\t\t\tif ((typeof input === 'object' && input !== null) || input === undefined) {\n\t\t\t\t\tthrow(new Error(`expected a primitive, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\tif (typeof input !== expect) {\n\t\t\t\t\tthrow(new Error(`expected a ${expect}, got ${typeof input}`));\n\t\t\t\t}\n\t\t\t\treturn(input);\n\t\t\tdefault:\n\t\t\t\tassertNever(expect);\n\t\t}\n\t}\n\n\tprivate async valuize(value: JSONSerializable): Promise<ValuizeInput> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tlet newValue: ValuizableObject | ValuizableArray;\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tnewValue = [];\n\t\t\t} else {\n\t\t\t\tnewValue = {};\n\t\t\t}\n\t\t\tfor (const key in value) {\n\t\t\t\t/*\n\t\t\t\t * Since `key` is the index of the array or\n\t\t\t\t * object, it is safe to use it to index\n\t\t\t\t * into the array or object.\n\t\t\t\t */\n\t\t\t\t// @ts-ignore\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tconst keyValue: JSONSerializable = value[key];\n\n\t\t\t\tif (isExternalURL(keyValue)) {\n\t\t\t\t\tif (Array.isArray(newValue)) {\n\t\t\t\t\t\tthrow(new Error('internal error: newValue is an array, but it should be an object since it is an external field, which can only be an object'));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newMetadataObject = new Metadata(keyValue.url, {\n\t\t\t\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\t\t\t\tclient: this.#client,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tresolver: this.#resolver,\n\t\t\t\t\t\tcache: this.#cache,\n\t\t\t\t\t\tparent: this\n\t\t\t\t\t});\n\n\t\t\t\t\tconst newValuizableObject: ValuizableMethod = newMetadataObject.value.bind(newMetadataObject);\n\n\t\t\t\t\tObject.defineProperty(newValuizableObject, 'instanceTypeID', {\n\t\t\t\t\t\tvalue: 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd',\n\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t});\n\n\t\t\t\t\tnewValue[key] = newValuizableObject;\n\t\t\t\t} else {\n\t\t\t\t\t/*\n\t\t\t\t\t * This is safe because `assertValuizableKind` will\n\t\t\t\t\t * ensure the correct output type\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst newValueEntry: ValuizableMethod = async (expect: ValuizableKind = 'any') => {\n\t\t\t\t\t\tconst retval = this.assertValuizableKind(await this.valuize(keyValue), expect);\n\t\t\t\t\t\treturn(retval);\n\t\t\t\t\t};\n\n\t\t\t\t\tObject.defineProperty(newValueEntry, 'instanceTypeID', {\n\t\t\t\t\t\tvalue: 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd',\n\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TypeScript doesn't track that `key`\n\t\t\t\t\t * is a valid index regardless of the\n\t\t\t\t\t * type of `newValue` is an array or an\n\t\t\t\t\t * object, so we need to use `@ts-ignore`\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tnewValue[key] = newValueEntry;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(newValue);\n\t\t} else {\n\t\t\treturn(value);\n\t\t}\n\t}\n\n\tasync value(expect: 'object'): Promise<ValuizableObject>;\n\tasync value(expect: 'array'): Promise<ValuizableArray>;\n\tasync value(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n\tasync value(expect: 'string'): Promise<string>;\n\tasync value(expect: 'number'): Promise<number>;\n\tasync value(expect: 'boolean'): Promise<boolean>;\n\tasync value(expect: 'any'): Promise<ValuizeInput>;\n\tasync value(expect?: ValuizableKind): Promise<ValuizeInput>;\n\tasync value(expect: ValuizableKind = 'any'): Promise<ValuizeInput> {\n\t\tconst value = await this.readURL(this.#url);\n\n\t\tconst retval = this.assertValuizableKind(await this.valuize(value), expect);\n\n\t\treturn(retval);\n\t}\n}\n\ntype ResolverStats = {\n\tkeetanet: {\n\t\treads: number;\n\t};\n\thttps: {\n\t\treads: number;\n\t};\n\tunsupported: {\n\t\treads: number;\n\t};\n\treads: number;\n\tcache: {\n\t\thit: number;\n\t\tmiss: number;\n\t}\n};\n\nclass Resolver {\n\treadonly #root: ResolverConfig['root'];\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #stats: ResolverStats;\n\treadonly #metadataCache: NonNullable<MetadataConfig['cache']>;\n\n\treadonly id: string;\n\n\tstatic readonly Metadata: typeof Metadata = Metadata;\n\n\tprivate readonly lookupMap: {\n\t\t[Service in Services]: {\n\t\t\tsearch: (input: ValuizableObject | undefined, criteria: ServiceSearchCriteria<Service>) => Promise<ResolverLookupServiceResults<Service> | undefined>;\n\t\t};\n\t} = {\n\t\t'banking': {\n\t\t\tsearch: this.lookupBankingServices.bind(this)\n\t\t},\n\t\t'kyc': {\n\t\t\tsearch: this.lookupKYCServices.bind(this)\n\t\t},\n\t\t'fx': {\n\t\t\tsearch: this.lookupFXServices.bind(this)\n\t\t},\n\t\t'assetMovement': {\n\t\t\tsearch: this.lookupAssetMovementServices.bind(this)\n\t\t},\n\t\t'cards': {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tsearch: async (_input: ValuizableObject | undefined, _criteria: ServiceSearchCriteria<'cards'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t}\n\t};\n\n\n\tconstructor(config: ResolverConfig) {\n\t\tthis.#root = config.root;\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#logger = config.logger;\n\t\tthis.#metadataCache = {\n\t\t\t...config.cache,\n\t\t\tinstance: new Map()\n\t\t};\n\n\t\tthis.id = config.id ?? crypto.randomUUID();\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Creating resolver with root account', this.#root.publicKeyString.get());\n\n\t\tif (KeetaNetClient.Client.isInstance(config.client)) {\n\t\t\tthis.#client = config.client;\n\t\t} else {\n\t\t\tthis.#client = config.client.client;\n\t\t}\n\n\t\tthis.#stats = {\n\t\t\tkeetanet: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\thttps: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\tunsupported: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\treads: 0,\n\t\t\tcache: {\n\t\t\t\thit: 0,\n\t\t\t\tmiss: 0\n\t\t\t}\n\t\t};\n\t}\n\n\t/** @internal */\n\t_mutableStats(accessToken: symbol) {\n\t\tif (accessToken !== statsAccessToken) {\n\t\t\tthrow(new Error('Invalid access token'));\n\t\t}\n\n\t\treturn(this.#stats);\n\t}\n\n\tget stats(): ResolverStats {\n\t\treturn(structuredClone(this.#stats));\n\t}\n\n\tprivate async lookupBankingServices(bankingServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'banking'>) {\n\t\tif (bankingServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tlet canonicalCurrencyCriteria;\n\t\tif ('currencyCodes' in criteria) {\n\t\t\tcanonicalCurrencyCriteria = {\n\t\t\t\tcurrencyCodes: criteria.currencyCodes.map(convertToCurrencySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tlet canonicalCountryCriteria;\n\t\tif ('countryCodes' in criteria) {\n\t\t\tcanonicalCountryCriteria = {\n\t\t\t\tcountryCodes: criteria.countryCodes.map(convertToCountrySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'banking'> = {};\n\t\tfor (const checkBankingServiceID in bankingServices) {\n\t\t\ttry {\n\t\t\t\tconst checkBankingService = await isValidOperations(await bankingServices[checkBankingServiceID]?.('object'));\n\t\t\t\tif (!checkBankingService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCurrencyCriteria !== undefined && 'currencyCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAllCurrencyCodes(checkBankingService, canonicalCurrencyCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCountryCriteria !== undefined && 'countryCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAnyCountryCodes(checkBankingService, canonicalCountryCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkBankingServiceID] = assertResolverLookupBankingResult(checkBankingService);\n\t\t\t} catch (checkBankingServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking banking service', checkBankingServiceID, ':', checkBankingServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupKYCServices(kycServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'kyc'>) {\n\t\tif (kycServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'kyc'> = {};\n\t\tfor (const checkKYCServiceID in kycServices) {\n\t\t\ttry {\n\t\t\t\tconst checkKYCService = await kycServices[checkKYCServiceID]?.('object');\n\t\t\t\tif (checkKYCService === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!('operations' in checkKYCService)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (criteria.countryCodes !== undefined) {\n\t\t\t\t\tlet acceptable = true;\n\t\t\t\t\t/*\n\t\t\t\t\t * If the KYC service does not have a countryCodes\n\t\t\t\t\t * property, then it can validate accounts in any\n\t\t\t\t\t * country, so we skip this check.\n\t\t\t\t\t */\n\t\t\t\t\tif ('countryCodes' in checkKYCService) {\n\t\t\t\t\t\tconst countryCodes = await checkKYCService.countryCodes?.('array') ?? [];\n\t\t\t\t\t\tconst checkKYCServiceCountryCodes = await Promise.all(countryCodes.map(async function(item) {\n\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t}));\n\t\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Checking country codes:', criteria.countryCodes, 'against', checkKYCServiceCountryCodes, 'for', checkKYCServiceID);\n\n\t\t\t\t\t\tfor (const checkCountryCode of criteria.countryCodes) {\n\t\t\t\t\t\t\tconst checkCountryCodeCanonical = convertToCountrySearchCanonical(checkCountryCode);\n\t\t\t\t\t\t\tif (!checkKYCServiceCountryCodes.includes(checkCountryCodeCanonical)) {\n\t\t\t\t\t\t\t\tacceptable = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!acceptable) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkKYCServiceID] = assertResolverLookupKYCResult(checkKYCService);\n\t\t\t} catch (checkKYCServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking KYC service', checkKYCServiceID, ':', checkKYCServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupFXServices(fxServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'fx'>): Promise<ResolverLookupServiceResults<'fx'> | undefined> {\n\t\tif (fxServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst isCurrencySearchInput = createIs<CurrencySearchInput>();\n\t\t// if currency code is provided then convert to canonical format otherwise token public key string was provided\n\t\tconst canonicalInputCurrencyCriteria = isCurrencySearchInput(criteria.inputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.inputCurrencyCode) : criteria.inputCurrencyCode;\n\t\tconst canonicalOutputCurrencyCriteria = isCurrencySearchInput(criteria.outputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.outputCurrencyCode) : criteria.outputCurrencyCode;\n\t\t// if search criteria is not provided then set token to undefined\n\t\tconst inputToken = canonicalInputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalInputCurrencyCriteria) : undefined;\n\t\tconst outputToken = canonicalOutputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalOutputCurrencyCriteria) : undefined;\n\t\tif (criteria.inputCurrencyCode !== undefined && inputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Input currency code', canonicalInputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tif (criteria.outputCurrencyCode !== undefined && outputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Output currency code', canonicalOutputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'fx'> = {};\n\t\tfor (const checkFXServiceID in fxServices) {\n\t\t\ttry {\n\t\t\t\tconst checkFXService = await assertResolverLookupFXResult(await fxServices[checkFXServiceID]?.('object'));\n\t\t\t\tif (!checkFXService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst fromUnrealized: ToValuizable<NonNullable<ServiceMetadata['services']['fx']>[string]['from']> = checkFXService.from;\n\t\t\t\tconst from = await fromUnrealized?.('array');\n\t\t\t\tif (from === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet acceptable = false;\n\t\t\t\tfor (const fromEntryUnrealized of from) {\n\t\t\t\t\tconst fromEntry = await fromEntryUnrealized?.('object');\n\n\t\t\t\t\tif (inputToken) {\n\t\t\t\t\t\tconst fromCurrencyCodes = await fromEntry.currencyCodes?.('array') ?? [];\n\t\t\t\t\t\tconst fromCurrencyCodesValues = await Promise.all(fromCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If inputToken was provided, check if it matches providers supported input currencies\n\t\t\t\t\t\tif (!fromCurrencyCodesValues.includes(inputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (outputToken) {\n\t\t\t\t\t\tconst toCurrencyCodes = await fromEntry.to?.('array') ?? [];\n\t\t\t\t\t\tconst toCurrencyCodesValues = await Promise.all(toCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If outputToken was provided, check if it matches providers supported output currencies\n\t\t\t\t\t\tif (!toCurrencyCodesValues.includes(outputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* XXX:TODO: Check kycProviders */\n\t\t\t\t\tacceptable = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (!acceptable) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tretval[checkFXServiceID] = await assertResolverLookupFXResult(checkFXService);\n\t\t\t} catch (checkFXServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking FX service', checkFXServiceID, ':', checkFXServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync filterSupportedAssets(assetService: ValuizableObject, criteria: ServiceSearchCriteria<'assetMovement'> = {}): Promise<SupportedAssets[]> {\n\t\tif (criteria.rail !== undefined) {\n\t\t\tthrow(new Error('Asset movement service does not support rail search criteria'));\n\t\t}\n\t\tconst assetCanonical = criteria.asset ? convertAssetSearchInputToCanonical(criteria.asset) : undefined;\n\t\tconst fromCanonical = criteria.from ? convertAssetLocationInputToCanonical(criteria.from) : undefined;\n\t\tconst toCanonical = criteria.to ? convertAssetLocationInputToCanonical(criteria.to) : undefined;\n\n\t\tconst resolvedService = await Metadata.fullyResolveValuizable(assetService.supportedAssets);\n\t\tconst supportedAssets = assertKeetaSupportedAssets(resolvedService);\n\n\t\tconst filteredAssetMovement: SupportedAssets[] = [];\n\t\tfor (const supportedAsset of supportedAssets) {\n\t\t\tif (assetCanonical && supportedAsset.asset !== assetCanonical) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (fromCanonical) {\n\t\t\t\tlet fromMatch = false;\n\t\t\t\tfor (const path of supportedAsset.paths) {\n\t\t\t\t\tfor (const pair of path.pair) {\n\t\t\t\t\t\tif (pair.location === fromCanonical) {\n\t\t\t\t\t\t\tconst commonPairMatch = pair.rails.common && pair.rails.common.length > 0;\n\t\t\t\t\t\t\tconst outboundPairMatch = pair.rails.outbound && pair.rails.outbound.length > 0;\n\t\t\t\t\t\t\tif (commonPairMatch || outboundPairMatch) {\n\t\t\t\t\t\t\t\tfromMatch = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!fromMatch) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (toCanonical) {\n\t\t\t\tlet toMatch = false;\n\t\t\t\tfor (const path of supportedAsset.paths) {\n\t\t\t\t\tfor (const pair of path.pair) {\n\t\t\t\t\t\tif (pair.location === toCanonical) {\n\t\t\t\t\t\t\tconst commonPairMatch = pair.rails.common && pair.rails.common.length > 0;\n\t\t\t\t\t\t\tconst inboundPairMatch = pair.rails.inbound && pair.rails.inbound.length > 0;\n\t\t\t\t\t\t\tif (commonPairMatch || inboundPairMatch) {\n\t\t\t\t\t\t\t\ttoMatch = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!toMatch) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfilteredAssetMovement.push(supportedAsset);\n\t\t}\n\t\treturn(filteredAssetMovement);\n\t}\n\n\tprivate async lookupAssetMovementServices(assetServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'assetMovement'>) {\n\t\tif (assetServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'assetMovement'> = {};\n\t\tfor (const checkAssetMovementServiceID in assetServices) {\n\t\t\tconst checkAssetMovementService = await assetServices[checkAssetMovementServiceID]?.('object');\n\n\t\t\tif (checkAssetMovementService === undefined) {\n\t\t\t\treturn(undefined);\n\t\t\t}\n\n\t\t\tif (!('operations' in checkAssetMovementService)) {\n\t\t\t\treturn(undefined);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst supportedAssets = await this.filterSupportedAssets(checkAssetMovementService, criteria);\n\t\t\t\tif (supportedAssets.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tretval[checkAssetMovementServiceID] = await assertResolverLookupAssetMovementResults(checkAssetMovementService);\n\t\t\t} catch (parseError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking AssetMovement service', checkAssetMovementServiceID, ':', parseError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any asset movement services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync #getRootMetadata() {\n\t\tconst rootURL = new URL(`keetanet://${this.#root.publicKeyString.get()}/metadata`);\n\t\tconst metadata = new Metadata(rootURL, {\n\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\tclient: this.#client,\n\t\t\tlogger: this.#logger,\n\t\t\tresolver: this,\n\t\t\tcache: this.#metadataCache\n\t\t});\n\t\tconst rootMetadata = await metadata.value('object');\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Root Metadata:', rootMetadata);\n\n\t\tif (!('version' in rootMetadata)) {\n\t\t\tthrow(new Error('Root metadata is missing \"version\" property'));\n\t\t}\n\n\t\tconst rootMetadataVersion = await rootMetadata.version?.('primitive');\n\t\tif (rootMetadataVersion !== 1) {\n\t\t\tthrow(new Error(`Unsupported metadata version: ${rootMetadataVersion}`));\n\t\t}\n\n\t\treturn(rootMetadata);\n\t}\n\n\tasync getRootMetadata(): Promise<ToValuizable<ServiceMetadata>> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\treturn(rootMetadata as unknown as ToValuizable<ServiceMetadata>);\n\t}\n\n\tasync listTransferableAssets(): Promise<KeetaNetAccountTokenPublicKeyString[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\t\tconst servicesFn = rootMetadata.services;\n\t\tif (servicesFn === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst services = await servicesFn('object');\n\t\tif (!('assetMovement' in services) || services.assetMovement === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"assetMovement\" property'));\n\t\t}\n\t\tconst assetMovementServices = await services.assetMovement('object');\n\t\tconst allAssets = new Set<KeetaNetAccountTokenPublicKeyString>();\n\t\tawait Promise.all(Object.values(assetMovementServices).map(async function(service) {\n\t\t\tif (service === undefined) {\n\t\t\t\tthrow(new Error('assetMovement has undefined service entry'));\n\t\t\t}\n\t\t\tconst serviceEntry = await service('object');\n\t\t\tif (!('supportedAssets' in serviceEntry) || serviceEntry.supportedAssets === undefined) {\n\t\t\t\tthrow(new Error('service entry is missing \"supportedAssets\"'));\n\t\t\t}\n\n\t\t\tconst supportedAssets = await serviceEntry.supportedAssets('array');\n\t\t\tawait Promise.all(supportedAssets.map(async function(supportedAsset) {\n\t\t\t\tif (supportedAsset === undefined) {\n\t\t\t\t\tthrow(new Error('supportedAsset entry is undefined'));\n\t\t\t\t}\n\t\t\t\tconst assetEntry = await supportedAsset('object');\n\t\t\t\tif (!('asset' in assetEntry) || assetEntry.asset === undefined) {\n\t\t\t\t\tthrow(new Error('asset is missing from supportedAsset entry'));\n\t\t\t\t}\n\t\t\t\tconst asset = await assetEntry.asset('string');\n\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(asset);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\t\t\t\tallAssets.add(checkTokenObject.publicKeyString.get());\n\t\t\t}));\n\t\t}));\n\n\t\treturn([...allAssets]);\n\t}\n\n\tasync listTokens(): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tconst retval: { token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[] = [];\n\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\tretval.push({\n\t\t\t\t\ttoken: checkTokenObject.publicKeyString.get(),\n\t\t\t\t\tcurrency: checkCurrencyCode\n\t\t\t\t});\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', checkCurrencyCode, 'is invalid:', validationError);\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync listSupportedKYCCountries(): Promise<CurrencyInfo.Country[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedServicesProperty = rootMetadata.services;\n\t\tif (definedServicesProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst definedServices = await definedServicesProperty('object');\n\n\t\tconst kycServicesProperty = definedServices.kyc;\n\t\tif (kycServicesProperty === undefined) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst kycServices = await kycServicesProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Listing supported KYC countries from', Object.keys(kycServices));\n\n\t\tconst allCountryCodes = new Set<CurrencyInfo.ISOCountryCode>();\n\t\tfor (const kycServiceID in kycServices) {\n\t\t\ttry {\n\t\t\t\tconst kycService = await kycServices[kycServiceID]?.('object');\n\t\t\t\tif (kycService === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * If the KYC service does not have a countryCodes\n\t\t\t\t * property, then it can validate accounts in any\n\t\t\t\t * country, so we add all countries and stop processing\n\t\t\t\t * other services since we already have all possible countries.\n\t\t\t\t */\n\t\t\t\tif (!('countryCodes' in kycService)) {\n\t\t\t\t\tfor (const countryCode of CurrencyInfo.Country.allCountryCodes) {\n\t\t\t\t\t\tallCountryCodes.add(countryCode);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst countryCodes = await kycService.countryCodes?.('array') ?? [];\n\t\t\t\tconst countryCodesValues = await Promise.all(countryCodes.map(async function(item) {\n\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t}));\n\n\t\t\t\tfor (const countryCode of countryCodesValues) {\n\t\t\t\t\tif (countryCode === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Validate that it's a valid country code\n\t\t\t\t\t\tconst validatedCountryCode = CurrencyInfo.Country.assertCountryCode(countryCode);\n\t\t\t\t\t\tallCountryCodes.add(validatedCountryCode);\n\t\t\t\t\t} catch (validationError) {\n\t\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Invalid country code', countryCode, 'in service', kycServiceID, ':', validationError);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (kycServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error processing KYC service', kycServiceID, ':', kycServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tconst retval = Array.from(allCountryCodes).map(function(countryCode) {\n\t\t\treturn(new CurrencyInfo.Country(countryCode));\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tasync lookupToken(currencyCode: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; } | null> {\n\t\tlet tokenPublicKey: KeetaNetAccountTokenPublicKeyString | undefined;\n\t\tif (typeof currencyCode === 'string') {\n\t\t\ttry {\n\t\t\t\tconst token = KeetaNetAccount.fromPublicKeyString(currencyCode);\n\t\t\t\tif (token.isToken()) {\n\t\t\t\t\ttokenPublicKey = token.publicKeyString.get();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* Ignored */\n\t\t\t}\n\t\t}\n\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tlet currencyCodeFound: CurrencySearchCanonical | undefined;\n\t\tif (tokenPublicKey === undefined) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing forward lookup for currency code', currencyCode);\n\n\t\t\t/*\n\t\t\t * Perform a forward lookup from the currency code\n\t\t\t * to the token public key\n\t\t\t */\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\t\tconst currencyCodeCanonical = convertToCurrencySearchCanonical(currencyCode as unknown as any);\n\t\t\tif (currencyCodeCanonical === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst checkToken = await definedCurrenciesMap[currencyCodeCanonical]?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Validating token public key for currency code', currencyCodeCanonical, ':', checkToken, typeof checkToken);\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\ttokenPublicKey = checkTokenObject.publicKeyString.get();\n\t\t\t\tcurrencyCodeFound = currencyCodeCanonical;\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', currencyCodeCanonical, 'is invalid:', validationError);\n\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing reverse lookup for token public key', tokenPublicKey);\n\n\t\t\t/*\n\t\t\t * Perform a reverse lookup from the token public key\n\t\t\t * to the currency code\n\t\t\t */\n\t\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\t\tif (checkToken === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (checkToken === tokenPublicKey) {\n\t\t\t\t\tif (isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\t\t\tcurrencyCodeFound = checkCurrencyCode;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currencyCodeFound === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t}\n\n\t\treturn({\n\t\t\ttoken: tokenPublicKey,\n\t\t\tcurrency: currencyCodeFound\n\t\t});\n\t}\n\n\tasync lookup<T extends keyof ServicesMetadataLookupMap>(service: T, criteria: ServicesMetadataLookupMap[T]['criteria']): Promise<ServicesMetadataLookupMap[T]['results'] | undefined> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedServicesProperty = rootMetadata.services;\n\t\tif (definedServicesProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst definedServices = await definedServicesProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Looking up', service, 'with criteria:', criteria, 'in', definedServices);\n\n\t\tconst serviceLookup = this.lookupMap[service].search;\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\treturn(await serviceLookup(await definedServices[service]?.('object'), criteria as any));\n\t}\n\n\tclearCache(): void {\n\t\tthis.#metadataCache.instance.clear();\n\t\tthis.#stats.cache.hit = 0;\n\t\tthis.#stats.cache.miss = 0;\n\t\tthis.#stats.https.reads = 0;\n\t\tthis.#stats.keetanet.reads = 0;\n\t\tthis.#stats.unsupported.reads = 0;\n\t\tthis.#stats.reads = 0;\n\t}\n}\n\nexport default Resolver;\nexport type {\n\tServiceMetadata,\n\tServiceMetadataExternalizable,\n\tServiceSearchCriteria,\n\tServices\n};\n"]}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/lib/resolver.ts"],"names":[],"mappings":";;AAAA,OAAO,KAAK,cAAc,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,YAAY,MAAM,6BAA6B,CAAC;AAI5D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,MAAM,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,oCAAoC,EAAE,kCAAkC,EAAwH,MAAM,sCAAsC,CAAC;AAKtP,MAAM,eAAe,GAAsC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;AAkBtF,MAAM,yBAAyB,40CAAsC,CAAC;AA8OtE,SAAS,uBAAuB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,MAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACpF,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YAC9C,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC;YAClG,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAc;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO;IACR,CAAC;IAED,uBAAuB,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,eAAe,IAAI,KAAK,CAAC,EAAE,CAAC;QACjC,MAAK,CAAC,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACtF,MAAK,CAAC,IAAI,KAAK,CAAC,2DAA2D,OAAO,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QACxC,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YAChD,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAK,CAAC,IAAI,KAAK,CAAC,2DAA2D,OAAO,YAAY,EAAE,CAAC,CAAC,CAAC;YACpG,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAK,CAAC,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACnH,MAAK,CAAC,IAAI,KAAK,CAAC,yDAAyD,OAAO,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5C,KAAK,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5E,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAK,CAAC,IAAI,KAAK,CAAC,+DAA+D,OAAO,SAAS,EAAE,CAAC,CAAC,CAAC;YACrG,CAAC;YAED,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;gBACxC,MAAK,CAAC,IAAI,KAAK,CAAC,wBAAwB,SAAS,yBAAyB,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;YACrG,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC/C,gDAAgD;IAChD,4BAA4B,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC9C,gDAAgD;IAChD,4BAA4B,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,kCAAkC,CAAC,KAAc;IACzD,gDAAgD;IAChD,4BAA4B,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAc;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,cAAc,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACpF,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACzG,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YACvC,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9C,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAK,CAAC,IAAI,KAAK,CAAC,0DAA0D,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC;gBAClG,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAK,CAAC,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;QACpE,MAAK,CAAC,IAAI,KAAK,CAAC,gDAAgD,OAAO,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACrF,CAAC;AACF,CAAC;AAED,MAAM,iCAAiC,GAAG,UAAS,KAAc;IAChE,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACpC,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/B,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChC,+BAA+B,CAAC,KAAK,CAAC,CAAC;IAEvC,OAAM,CAAC,KAAK,CAAC,CAAC;AAEf,CAAC,CAAC;AACF,MAAM,6BAA6B,GAAG,UAAS,KAAc;IAC5D,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChC,+BAA+B,CAAC,KAAK,CAAC,CAAC;IACvC,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,KAAK,WAAU,KAAc;IACjE,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE/B,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAK,CAAC,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC;IAClC,mEAAmE;IACnE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5C,MAAK,CAAC,IAAI,KAAK,CAAC,4CAA4C,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,8DAA8D;IAC9D,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9B,8DAA8D;IAC9D,aAAa;IACb,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,wCAAwC,GAAG,KAAK,WAAU,KAAc;IAC7E,kCAAkC,CAAC,KAAK,CAAC,CAAC;IAC1C,mCAAmC;IACnC,0CAA0C;IAC1C,wBAAwB;IACxB,IAAI,CAAC,CAAC,iBAAiB,IAAI,KAAK,CAAC,EAAE,CAAC;QACnC,MAAK,CAAC,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC;IAC7C,mEAAmE;IACnE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5C,MAAK,CAAC,IAAI,KAAK,CAAC,uDAAuD,OAAO,cAAc,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,yEAAyE;IACzE,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAE9B,yEAAyE;IACzE,aAAa;IACb,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,aAAa;AAEb,qBAAqB;AAErB,KAAK,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACpC,mEAAmE;IACnE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QACxC,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAED,OAAM,CAAC;QACN,GAAG,KAAK;QACR,UAAU;KACV,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CAAC,KAA0B;IACnE,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,KAAK,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,OAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC5B,OAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACP,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;AACF,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,KAAc,EAAE,QAAsD;IACxG,oDAAoD;IACpD,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACjE,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,WAAU,IAAI;QACjF,OAAM,CAAC,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC,CAAC;IAEJ,KAAK,MAAM,iBAAiB,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QACxD,MAAM,0BAA0B,GAAG,gCAAgC,CAAC,iBAAiB,CAAC,CAAC;QACvF,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAC9D,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACF,CAAC;IAED,OAAM,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,KAAc,EAAE,QAAoD;IACrG,oDAAoD;IACpD,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,gBAAgB,GAAG,MAAM,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACpC,SAAS;QACV,CAAC;QAED,oJAAoJ;QACpJ,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAuB,CAAC,EAAE,CAAC;YAC7D,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;IACF,CAAC;IAED,OAAM,CAAC,KAAK,CAAC,CAAC;AACf,CAAC;AAED,aAAa;AAEb,SAAS,+BAA+B,CAAC,KAAyB;IACjE,IAAI,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,KAAK,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,OAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,aAAa,8MAA0B,CAAC;AAwB7C,CAAC;AAID,CAAC;AAID,CAAC;AAID,CAAC;AAsCF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAqEpD,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAoD,CAAC;AAChF,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAoC,CAAC;AAErE;;GAEG;AACH,MAAM,qCAAqC,GAAG,gDAAgD,CAAC;AAE/F,MAAM,QAAQ;IACJ,MAAM,CAAiD;IACvD,WAAW,CAA+B;IAC1C,OAAO,CAAwB;IAC/B,OAAO,CAAqB;IAC5B,IAAI,CAAM;IACV,SAAS,CAAW;IACpB,MAAM,CAAgB;IACd,QAAQ,CAAc;IAE/B,MAAM,CAAU,cAAc,GAAG,+CAA+C,CAAC;IAEzF,MAAM,CAAC,UAAU,CAAC,KAAc;QAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QACD,IAAI,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QAED,OAAM,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAUD,MAAM,CAAC,cAAc,CAAC,QAA8D;QACnF,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,kBAAkB,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC;QAC3I,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE3E,OAAM,CAAC,eAAe,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAc;QACnC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,KAAc;QACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YACjC,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QAED,aAAa;QACb,IAAI,CAAC,CAAC,gBAAgB,IAAI,KAAK,CAAC,EAAE,CAAC;YAClC,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QAED,IAAI,KAAK,CAAC,cAAc,KAAK,QAAQ,CAAC,cAAc,EAAE,CAAC;YACtD,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAED,IAAI,KAAK,CAAC,cAAc,KAAK,qCAAqC,EAAE,CAAC;YACpE,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QAED,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAeD,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,KAAwB,EAAE,qBAAuC,IAAI;QACxG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAuB,EAAE,CAAC;gBACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACvB,IAAI,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;wBAC9D,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzB,CAAC;yBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBAChC,MAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBAC/E,CAAC;yBAAM,CAAC;wBACP,WAAW,CAAC,KAAK,CAAC,CAAC;oBACpB,CAAC;gBACF,CAAC;gBAED,OAAM,CAAC,QAAQ,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACP,MAAM,SAAS,GAAyC,EAAE,CAAC;gBAC3D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;oBACzB;;;;uBAIG;oBACH,aAAa;oBACb,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;oBACzB,IAAI,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;wBAClC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;wBAC9D,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;oBAC3B,CAAC;yBAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBAChC,MAAK,CAAC,IAAI,KAAK,CAAC,eAAe,GAAG,4CAA4C,CAAC,CAAC,CAAC;oBAClF,CAAC;yBAAM,CAAC;wBACP,WAAW,CAAC,KAAK,CAAC,CAAC;oBACpB,CAAC;gBACF,CAAC;gBAED,OAAM,CAAC,SAAS,CAAC,CAAC;YACnB,CAAC;QACF,CAAC;QAED,IAAI,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBAClC,OAAM,CAAC,MAAM,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACR,OAAM,CAAC,kBAAkB,CAAC,CAAC;YAC5B,CAAC;QACF,CAAC;QAED,QAAQ,OAAO,KAAK,EAAE,CAAC;YACtB,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACb,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,KAAK,QAAQ;gBACZ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAM,CAAC,KAAK,CAAC,CAAC;gBACf,CAAC;gBACD,WAAW,CAAC,KAAK,CAAC,CAAC;gBACnB,MAAM;YACP;gBACC,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,MAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,YAAY,GAAiB,EAAE,MAAsB;QACpD;;;;WAIG;QACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,EAAE;YAC7C,KAAK,EAAE,QAAQ,CAAC,cAAc;YAC9B,UAAU,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG;YACb,yEAAyE;YACzE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,IAAI,GAAG,EAA6C;YACxF,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,EAAE,GAAG,IAAI;YACnD,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC,GAAG,IAAI;SAClD,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACxC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,QAA8B;QACzD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClC,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjG,CAAC;QAED;;;WAGG;QACH,IAAI,oBAAiC,CAAC;QACtC,IAAI,CAAC;YACJ,oBAAoB,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACR,oBAAoB,GAAG,QAAQ,CAAC;QACjC,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAExD;;;WAGG;QACH,yEAAyE;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAqB,CAAC,CAAC;QAExF,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,GAAQ;QACrC,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAE7B,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC1B,MAAK,CAAC,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,IAAI,OAAwC,CAAC;QAC7C,IAAI,CAAC;YACJ,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACR,OAAM,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3C,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YACrB,OAAM,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/G,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,GAAQ;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAE1B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACR,QAAQ,EAAE,kBAAkB;aAC5B;SACD,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YACjB,MAAK,CAAC,IAAI,KAAK,CAAC,qBAAqB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,QAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACrG,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B;;;eAGG;YACH,OAAM,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAK,CAAC,IAAI,KAAK,CAAC,0BAA0B,OAAO,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAE5D,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAEhG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAElD,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,GAAQ;QAC7B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAChC;;;;WAIG;QACH,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAM,CAAC,IAAI,CAAC,CAAC;QACd,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE5B;;;WAGG;QACH,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClE,IAAI,QAAQ,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACtC,QAAQ,GAAG,SAAS,CAAC;YACtB,CAAC;QACF,CAAC;QAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAExB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,OAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACP,MAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEzB,IAAI,MAAwB,CAAC;QAC7B,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC9B,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;gBAC9B,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAK,CAAC,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACF,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAClC,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;aACvD,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YACvG,MAAK,CAAC,SAAS,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAE9F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;YAClC,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;SACvD,CAAC,CAAC;QAEH,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAIO,KAAK,CAAC,YAAY,CAAuD,KAAQ;QACxF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;QAED;;;WAGG;QACH,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEvC,OAAM,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;QACzC,CAAC;QAED,OAAM,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEO,oBAAoB,CAAC,KAAmB,EAAE,MAAsB;QACvE,QAAQ,MAAM,EAAE,CAAC;YAChB,KAAK,KAAK;gBACT,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,KAAK,QAAQ;gBACZ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC/B,MAAK,CAAC,IAAI,KAAK,CAAC,2BAA2B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC7D,CAAC;gBAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAK,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAClD,CAAC;gBAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,MAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBACtD,CAAC;gBAED,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,KAAK,OAAO;gBACX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,0BAA0B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAED,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,KAAK,WAAW;gBACf,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC1E,MAAK,CAAC,IAAI,KAAK,CAAC,6BAA6B,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;gBAED,OAAM,CAAC,KAAK,CAAC,CAAC;YACf,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS;gBACb,IAAI,OAAO,KAAK,KAAK,MAAM,EAAE,CAAC;oBAC7B,MAAK,CAAC,IAAI,KAAK,CAAC,cAAc,MAAM,SAAS,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC/D,CAAC;gBACD,OAAM,CAAC,KAAK,CAAC,CAAC;YACf;gBACC,WAAW,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,KAAuB;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,IAAI,QAA4C,CAAC;YACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,QAAQ,GAAG,EAAE,CAAC;YACf,CAAC;iBAAM,CAAC;gBACP,QAAQ,GAAG,EAAE,CAAC;YACf,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;gBACzB;;;;mBAIG;gBACH,aAAa;gBACb,mEAAmE;gBACnE,MAAM,QAAQ,GAAqB,KAAK,CAAC,GAAG,CAAC,CAAC;gBAE9C,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7B,MAAK,CAAC,IAAI,KAAK,CAAC,6HAA6H,CAAC,CAAC,CAAC;oBACjJ,CAAC;oBAED,MAAM,iBAAiB,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE;wBACpD,UAAU,EAAE,IAAI,CAAC,WAAW;wBAC5B,MAAM,EAAE,IAAI,CAAC,OAAO;wBACpB,MAAM,EAAE,IAAI,CAAC,OAAO;wBACpB,QAAQ,EAAE,IAAI,CAAC,SAAS;wBACxB,KAAK,EAAE,IAAI,CAAC,MAAM;wBAClB,MAAM,EAAE,IAAI;qBACZ,CAAC,CAAC;oBAEH,MAAM,mBAAmB,GAAqB,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAE9F,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE,gBAAgB,EAAE;wBAC5D,KAAK,EAAE,qCAAqC;wBAC5C,UAAU,EAAE,KAAK;qBACjB,CAAC,CAAC;oBAEH,QAAQ,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACP;;;uBAGG;oBACH,aAAa;oBACb,MAAM,aAAa,GAAqB,KAAK,EAAE,SAAyB,KAAK,EAAE,EAAE;wBAChF,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;wBAC/E,OAAM,CAAC,MAAM,CAAC,CAAC;oBAChB,CAAC,CAAC;oBAEF,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,gBAAgB,EAAE;wBACtD,KAAK,EAAE,qCAAqC;wBAC5C,UAAU,EAAE,KAAK;qBACjB,CAAC,CAAC;oBAEH;;;;;uBAKG;oBACH,aAAa;oBACb,QAAQ,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC;gBAC/B,CAAC;YACF,CAAC;YAED,OAAM,CAAC,QAAQ,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACP,OAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACF,CAAC;IAUD,KAAK,CAAC,KAAK,CAAC,SAAyB,KAAK;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QAE5E,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;;AAoBF,MAAM,QAAQ;IACJ,MAAM,CAA2B;IACjC,WAAW,CAA+B;IAC1C,OAAO,CAAwB;IAC/B,OAAO,CAAqB;IAC5B,MAAM,CAAgB;IACtB,cAAc,CAAuC;IAErD,EAAE,CAAS;IAEpB,MAAM,CAAU,QAAQ,GAAoB,QAAQ,CAAC;IAEpC,SAAS,GAItB;QACH,SAAS,EAAE;YACV,MAAM,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;SAC7C;QACD,KAAK,EAAE;YACN,MAAM,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;SACzC;QACD,IAAI,EAAE;YACL,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;SACxC;QACD,eAAe,EAAE;YAChB,MAAM,EAAE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC;SACnD;QACD,OAAO,EAAE;YACR,6DAA6D;YAC7D,MAAM,EAAE,KAAK,EAAE,MAAoC,EAAE,SAAyC,EAAE,EAAE;gBACjG,MAAK,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACrC,CAAC;SACD;KACD,CAAC;IAGF,YAAY,MAAsB;QACjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,cAAc,GAAG;YACrB,GAAG,MAAM,CAAC,KAAK;YACf,QAAQ,EAAE,IAAI,GAAG,EAAE;SACnB,CAAC;QAEF,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAE3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1F,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,wCAAwC,EAAE,kBAAkB,CAAC,CAAC;QAEzG,IAAI,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,MAAM,GAAG;YACb,QAAQ,EAAE;gBACT,KAAK,EAAE,CAAC;aACR;YACD,KAAK,EAAE;gBACN,KAAK,EAAE,CAAC;aACR;YACD,WAAW,EAAE;gBACZ,KAAK,EAAE,CAAC;aACR;YACD,KAAK,EAAE,CAAC;YACR,KAAK,EAAE;gBACN,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC;aACP;SACD,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,aAAa,CAAC,WAAmB;QAChC,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YACtC,MAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,OAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,KAAK;QACR,OAAM,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,eAA6C,EAAE,QAA0C;QAC5H,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YACnC,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,yBAAyB,CAAC;QAC9B,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;YACjC,yBAAyB,GAAG;gBAC3B,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,gCAAgC,CAAC;aAC3E,CAAA;QACF,CAAC;QAED,IAAI,wBAAwB,CAAC;QAC7B,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;YAChC,wBAAwB,GAAG;gBAC1B,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,+BAA+B,CAAC;aACxE,CAAA;QACF,CAAC;QAED,MAAM,MAAM,GAA4C,EAAE,CAAC;QAC3D,KAAK,MAAM,qBAAqB,IAAI,eAAe,EAAE,CAAC;YACrD,IAAI,CAAC;gBACJ,MAAM,mBAAmB,GAAG,MAAM,iBAAiB,CAAC,MAAM,eAAe,CAAC,qBAAqB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9G,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC1B,SAAS;gBACV,CAAC;gBAED,IAAI,yBAAyB,KAAK,SAAS,IAAI,eAAe,IAAI,mBAAmB,EAAE,CAAC;oBACvF,IAAI,CAAC,CAAC,MAAM,mBAAmB,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC;wBAClF,SAAS;oBACV,CAAC;gBACF,CAAC;gBAED,IAAI,wBAAwB,KAAK,SAAS,IAAI,cAAc,IAAI,mBAAmB,EAAE,CAAC;oBACrF,IAAI,CAAC,CAAC,MAAM,kBAAkB,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC;wBAChF,SAAS;oBACV,CAAC;gBACF,CAAC;gBAED,MAAM,CAAC,qBAAqB,CAAC,GAAG,iCAAiC,CAAC,mBAAmB,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,wBAAwB,EAAE,CAAC;gBACnC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,GAAG,EAAE,wBAAwB,EAAE,cAAc,CAAC,CAAC;YACpJ,CAAC;QACF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC;;;eAGG;YACH,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,WAAyC,EAAE,QAAsC;QAChH,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAwC,EAAE,CAAC;QACvD,KAAK,MAAM,iBAAiB,IAAI,WAAW,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACJ,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACzE,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACnC,SAAS;gBACV,CAAC;gBAED,IAAI,CAAC,CAAC,YAAY,IAAI,eAAe,CAAC,EAAE,CAAC;oBACxC,SAAS;gBACV,CAAC;gBAED,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACzC,IAAI,UAAU,GAAG,IAAI,CAAC;oBACtB;;;;uBAIG;oBACH,IAAI,cAAc,IAAI,eAAe,EAAE,CAAC;wBACvC,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;wBACzE,MAAM,2BAA2B,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,WAAU,IAAI;4BACzF,OAAM,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;wBAChC,CAAC,CAAC,CAAC,CAAC;wBACJ,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,yBAAyB,EAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,2BAA2B,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;wBAE/J,KAAK,MAAM,gBAAgB,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;4BACtD,MAAM,yBAAyB,GAAG,+BAA+B,CAAC,gBAAgB,CAAC,CAAC;4BACpF,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;gCACtE,UAAU,GAAG,KAAK,CAAC;gCACnB,MAAM;4BACP,CAAC;wBACF,CAAC;oBACF,CAAC;oBAED,IAAI,CAAC,UAAU,EAAE,CAAC;wBACjB,SAAS;oBACV,CAAC;gBACF,CAAC;gBAED,MAAM,CAAC,iBAAiB,CAAC,GAAG,6BAA6B,CAAC,eAAe,CAAC,CAAC;YAC5E,CAAC;YAAC,OAAO,oBAAoB,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,GAAG,EAAE,oBAAoB,EAAE,cAAc,CAAC,CAAC;YACxI,CAAC;QACF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC;;;eAGG;YACH,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,UAAwC,EAAE,QAAqC;QAC7G,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,qBAAqB,u/JAAkC,CAAC;QAC9D,+GAA+G;QAC/G,MAAM,8BAA8B,GAAG,qBAAqB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACrL,MAAM,+BAA+B,GAAG,qBAAqB,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACzL,iEAAiE;QACjE,MAAM,UAAU,GAAG,8BAA8B,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrI,MAAM,WAAW,GAAG,+BAA+B,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxI,IAAI,QAAQ,CAAC,iBAAiB,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACrE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,8BAA8B,EAAE,kCAAkC,CAAC,CAAC;YACtI,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,QAAQ,CAAC,kBAAkB,KAAK,SAAS,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACvE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,kCAAkC,CAAC,CAAC;YACxI,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAuC,EAAE,CAAC;QACtD,KAAK,MAAM,gBAAgB,IAAI,UAAU,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACJ,MAAM,cAAc,GAAG,MAAM,4BAA4B,CAAC,MAAM,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1G,IAAI,CAAC,cAAc,EAAE,CAAC;oBACrB,SAAS;gBACV,CAAC;gBAED,MAAM,cAAc,GAAiF,cAAc,CAAC,IAAI,CAAC;gBACzH,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC;gBAC7C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACxB,SAAS;gBACV,CAAC;gBAED,IAAI,UAAU,GAAG,KAAK,CAAC;gBACvB,KAAK,MAAM,mBAAmB,IAAI,IAAI,EAAE,CAAC;oBACxC,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC,QAAQ,CAAC,CAAC;oBAExD,IAAI,UAAU,EAAE,CAAC;wBAChB,MAAM,iBAAiB,GAAG,MAAM,SAAS,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;wBACzE,MAAM,uBAAuB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,WAAU,IAAI;4BAC1F,IAAI,CAAC;gCACJ,OAAM,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;4BAChC,CAAC;4BAAC,MAAM,CAAC;gCACR,OAAM,CAAC,SAAS,CAAC,CAAC;4BACnB,CAAC;wBACF,CAAC,CAAC,CAAC,CAAC;wBAEJ,uFAAuF;wBACvF,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;4BACzD,SAAS;wBACV,CAAC;oBACF,CAAC;oBAED,IAAI,WAAW,EAAE,CAAC;wBACjB,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;wBAC5D,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,WAAU,IAAI;4BACtF,IAAI,CAAC;gCACJ,OAAM,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;4BAChC,CAAC;4BAAC,MAAM,CAAC;gCACR,OAAM,CAAC,SAAS,CAAC,CAAC;4BACnB,CAAC;wBACF,CAAC,CAAC,CAAC,CAAC;wBAEJ,yFAAyF;wBACzF,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;4BACxD,SAAS;wBACV,CAAC;oBACF,CAAC;oBAED,kCAAkC;oBAClC,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACP,CAAC;gBAED,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjB,SAAS;gBACV,CAAC;gBAED,MAAM,CAAC,gBAAgB,CAAC,GAAG,MAAM,4BAA4B,CAAC,cAAc,CAAC,CAAC;YAC/E,CAAC;YAAC,OAAO,mBAAmB,EAAE,CAAC;gBAC9B,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;YACrI,CAAC;QACF,CAAC;QAED,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,YAA8B,EAAE,WAAmD,EAAE;QAChH,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACjC,MAAK,CAAC,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,kCAAkC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvG,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,oCAAoC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtG,MAAM,WAAW,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEhG,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,sBAAsB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QAC5F,MAAM,eAAe,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;QAEpE,MAAM,qBAAqB,GAAsB,EAAE,CAAC;QACpD,KAAK,MAAM,cAAc,IAAI,eAAe,EAAE,CAAC;YAC9C,IAAI,cAAc,IAAI,cAAc,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;gBAC/D,SAAS;YACV,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBACnB,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;oBACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;4BACrC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;4BAC1E,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;4BAChF,IAAI,eAAe,IAAI,iBAAiB,EAAE,CAAC;gCAC1C,SAAS,GAAG,IAAI,CAAC;4BAClB,CAAC;wBACF,CAAC;oBACF,CAAC;gBACF,CAAC;gBACD,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,SAAS;gBACV,CAAC;YACF,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;oBACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;4BACnC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;4BAC1E,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;4BAC7E,IAAI,eAAe,IAAI,gBAAgB,EAAE,CAAC;gCACzC,OAAO,GAAG,IAAI,CAAC;4BAChB,CAAC;wBACF,CAAC;oBACF,CAAC;gBACF,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,SAAS;gBACV,CAAC;YACF,CAAC;YACD,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;QACD,OAAM,CAAC,qBAAqB,CAAC,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,2BAA2B,CAAC,aAA2C,EAAE,QAAgD;QACtI,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACjC,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAkD,EAAE,CAAC;QACjE,KAAK,MAAM,2BAA2B,IAAI,aAAa,EAAE,CAAC;YACzD,MAAM,yBAAyB,GAAG,MAAM,aAAa,CAAC,2BAA2B,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YAE/F,IAAI,yBAAyB,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAM,CAAC,SAAS,CAAC,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,CAAC,YAAY,IAAI,yBAAyB,CAAC,EAAE,CAAC;gBAClD,OAAM,CAAC,SAAS,CAAC,CAAC;YACnB,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAAC;gBAC9F,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClC,SAAS;gBACV,CAAC;gBACD,MAAM,CAAC,2BAA2B,CAAC,GAAG,MAAM,wCAAwC,CAAC,yBAAyB,CAAC,CAAC;YACjH,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,sCAAsC,EAAE,2BAA2B,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YAClJ,CAAC;QACF,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC;;;eAGG;YACH,OAAM,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gBAAgB;QACrB,gCAAgC;QAChC,MAAM,eAAe,GAAuB,EAAE,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC7E,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE;gBACtC,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,IAAI,CAAC,cAAc;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC;gBACJ,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpD,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;gBAE/G,IAAI,CAAC,CAAC,SAAS,IAAI,YAAY,CAAC,EAAE,CAAC;oBAClC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,mBAAmB,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,yCAAyC,CAAC,CAAC;oBACvI,SAAS;gBACV,CAAC;gBAED,MAAM,mBAAmB,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC,CAAC;gBACtE,IAAI,mBAAmB,KAAK,CAAC,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;oBACjJ,SAAS;gBACV,CAAC;gBAED,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YACnI,CAAC;QACF,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAK,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,kCAAkC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;QAEvG,+CAA+C;QAC/C,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,oEAAoE;YACpE,OAAM,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,CAAC;QAC7B,CAAC;QAED,8DAA8D;QAC9D,OAAM,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC;IACxD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,kBAAkB,CAAC,aAAiC;QACzD,+DAA+D;QAC/D,MAAM,cAAc,GAAqB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjE,uEAAuE;QACvE,2DAA2D;QAC3D,MAAM,2BAA2B,GAAqB,KAAK,EAAE,SAAyB,KAAK,EAAE,EAAE;YAC9F,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC7C,MAAK,CAAC,IAAI,KAAK,CAAC,qDAAqD,MAAM,EAAE,CAAC,CAAC,CAAC;YACjF,CAAC;YAED,6EAA6E;YAC7E,MAAM,iBAAiB,GAAqB,EAAE,CAAC;YAC/C,6DAA6D;YAC7D,KAAK,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC5B,SAAS;gBACV,CAAC;gBACD,IAAI,aAAa,IAAI,QAAQ,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACrE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACzD,KAAK,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;wBACtE,iBAAiB,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC;oBAC9C,CAAC;gBACF,CAAC;YACF,CAAC;YAED,OAAM,CAAC,iBAAiB,CAAC,CAAC;QAC3B,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,2BAA2B,EAAE,gBAAgB,EAAE;YACpE,KAAK,EAAE,qCAAqC;YAC5C,UAAU,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,oEAAoE;QACpE,2DAA2D;QAC3D,MAAM,wBAAwB,GAAqB,KAAK,EAAE,SAAyB,KAAK,EAAE,EAAE;YAC3F,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC7C,MAAK,CAAC,IAAI,KAAK,CAAC,iDAAiD,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;YAED,+EAA+E;YAC/E,MAAM,cAAc,GAAqB,EAAE,CAAC;YAC5C,6DAA6D;YAC7D,KAAK,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC5B,SAAS;gBACV,CAAC;gBACD,IAAI,UAAU,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC/D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACnD,KAAK,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpE,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;4BAChC,SAAS;wBACV,CAAC;wBAED,8BAA8B;wBAC9B,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;wBAEpD,8DAA8D;wBAC9D,IAAI,CAAC,CAAC,WAAW,IAAI,cAAc,CAAC,EAAE,CAAC;4BACtC,cAAc,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;wBAC5C,CAAC;6BAAM,CAAC;4BACP,wDAAwD;4BACxD,MAAM,mBAAmB,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;4BAC1E,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;gCACvC,cAAc,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC;gCAC3C,SAAS;4BACV,CAAC;4BAED,MAAM,iBAAiB,GAAqB,EAAE,GAAG,mBAAmB,EAAE,CAAC;4BACvE,KAAK,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gCACzE,kEAAkE;gCAClE,yEAAyE;gCACzE,iDAAiD;gCACjD,iBAAiB,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC;4BAC9C,CAAC;4BAED,sDAAsD;4BACtD,2DAA2D;4BAC3D,MAAM,2BAA2B,GAAqB,KAAK,EAAE,SAAyB,KAAK,EAAE,EAAE;gCAC9F,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oCAC7C,OAAM,CAAC,iBAAiB,CAAC,CAAC;gCAC3B,CAAC;gCACD,MAAK,CAAC,IAAI,KAAK,CAAC,qDAAqD,MAAM,EAAE,CAAC,CAAC,CAAC;4BACjF,CAAC,CAAC;4BACF,MAAM,CAAC,cAAc,CAAC,2BAA2B,EAAE,gBAAgB,EAAE;gCACpE,KAAK,EAAE,qCAAqC;gCAC5C,UAAU,EAAE,KAAK;6BACjB,CAAC,CAAC;4BACH,cAAc,CAAC,WAAW,CAAC,GAAG,2BAA2B,CAAC;wBAC3D,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;YAED,OAAM,CAAC,cAAc,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,wBAAwB,EAAE,gBAAgB,EAAE;YACjE,KAAK,EAAE,qCAAqC;YAC5C,UAAU,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,cAAc,CAAC,WAAW,GAAG,2BAA2B,CAAC;QACzD,cAAc,CAAC,QAAQ,GAAG,wBAAwB,CAAC;QAEnD,OAAM,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEnD;;;;;;;;;;;WAWG;QACH,gJAAgJ;QAChJ,OAAO,YAAoB,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,sBAAsB;QAC3B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC;QACzC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAK,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,eAAe,IAAI,QAAQ,CAAC,IAAI,QAAQ,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YAC5E,MAAK,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,qBAAqB,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAuC,CAAC;QACjE,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,GAAG,CAAC,KAAK,WAAU,OAAO;YAChF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,CAAC,CAAC,iBAAiB,IAAI,YAAY,CAAC,IAAI,YAAY,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBACxF,MAAK,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YACpE,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,WAAU,cAAc;gBAClE,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBAClC,MAAK,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBACvD,CAAC;gBACD,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAClD,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAChE,MAAK,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAE/C,MAAM,gBAAgB,GAAG,eAAe,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACpE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;oBACjC,MAAK,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBACzC,CAAC;gBACD,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,CAAC;QAEJ,OAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,UAAU;QACf,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEnD;;WAEG;QACH,MAAM,4BAA4B,GAAG,YAAY,CAAC,WAAW,CAAC;QAC9D,IAAI,4BAA4B,KAAK,SAAS,EAAE,CAAC;YAChD,MAAK,CAAC,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,oBAAoB,GAAG,MAAM,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;QAE5F,MAAM,MAAM,GAAyF,EAAE,CAAC;QACxG,KAAK,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAC5F,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YACxD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,SAAS;YACV,CAAC;YAED,IAAI,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACnD,SAAS;YACV,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,gBAAgB,GAAG,eAAe,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACzE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;oBACjC,MAAK,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBACzC,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,gBAAgB,CAAC,eAAe,CAAC,GAAG,EAAE;oBAC7C,QAAQ,EAAE,iBAAiB;iBAC3B,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,eAAe,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,oCAAoC,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;YACrI,CAAC;QACF,CAAC;QAED,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC9B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEnD;;WAEG;QACH,MAAM,uBAAuB,GAAG,YAAY,CAAC,QAAQ,CAAC;QACtD,IAAI,uBAAuB,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAK,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAEhE,MAAM,mBAAmB,GAAG,eAAe,CAAC,GAAG,CAAC;QAChD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACvC,OAAM,CAAC,EAAE,CAAC,CAAC;QACZ,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAExD,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,sCAAsC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAE7G,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC/D,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE,CAAC;YACxC,IAAI,CAAC;gBACJ,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;gBAC/D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC9B,SAAS;gBACV,CAAC;gBAED;;;;;mBAKG;gBACH,IAAI,CAAC,CAAC,cAAc,IAAI,UAAU,CAAC,EAAE,CAAC;oBACrC,KAAK,MAAM,WAAW,IAAI,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;wBAChE,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBAClC,CAAC;oBACD,MAAM;gBACP,CAAC;gBAED,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpE,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,WAAU,IAAI;oBAChF,OAAM,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC,CAAC;gBAEJ,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE,CAAC;oBAC9C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;wBAC/B,SAAS;oBACV,CAAC;oBAED,IAAI,CAAC;wBACJ,0CAA0C;wBAC1C,MAAM,oBAAoB,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;wBACjF,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;oBAC3C,CAAC;oBAAC,OAAO,eAAe,EAAE,CAAC;wBAC1B,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;oBACnI,CAAC;gBACF,CAAC;YACF,CAAC;YAAC,OAAO,eAAe,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,8BAA8B,EAAE,YAAY,EAAE,GAAG,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;YAChI,CAAC;QACF,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,UAAS,WAAW;YAClE,OAAM,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,YAAuE;QACxF,IAAI,cAA+D,CAAC;QACpE,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC;gBACJ,MAAM,KAAK,GAAG,eAAe,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;gBAChE,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;oBACrB,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAC9C,CAAC;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,aAAa;YACd,CAAC;QACF,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEnD;;WAEG;QACH,MAAM,4BAA4B,GAAG,YAAY,CAAC,WAAW,CAAC;QAC9D,IAAI,4BAA4B,KAAK,SAAS,EAAE,CAAC;YAChD,MAAK,CAAC,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,oBAAoB,GAAG,MAAM,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,yBAAyB,EAAE,oBAAoB,CAAC,CAAC;QAE5F,IAAI,iBAAsD,CAAC;QAC3D,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,6CAA6C,EAAE,YAAY,CAAC,CAAC;YAExG;;;eAGG;YACH,oJAAoJ;YACpJ,MAAM,qBAAqB,GAAG,gCAAgC,CAAC,YAA8B,CAAC,CAAC;YAC/F,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBACzC,OAAM,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,qBAAqB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACjF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAM,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,+CAA+C,EAAE,qBAAqB,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,UAAU,CAAC,CAAC;YACvJ,IAAI,CAAC;gBACJ,MAAM,gBAAgB,GAAG,eAAe,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACzE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;oBACjC,MAAK,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBACzC,CAAC;gBAED,cAAc,GAAG,gBAAgB,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBACxD,iBAAiB,GAAG,qBAAqB,CAAC;YAC3C,CAAC;YAAC,OAAO,eAAe,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,oCAAoC,EAAE,qBAAqB,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;gBAExI,OAAM,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;QACF,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,gDAAgD,EAAE,cAAc,CAAC,CAAC;YAE7G;;;eAGG;YACH,KAAK,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC5F,MAAM,UAAU,GAAG,MAAM,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC9B,SAAS;gBACV,CAAC;gBAED,IAAI,UAAU,KAAK,cAAc,EAAE,CAAC;oBACnC,IAAI,yBAAyB,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBAClD,iBAAiB,GAAG,iBAAiB,CAAC;wBACtC,MAAM;oBACP,CAAC;gBACF,CAAC;YACF,CAAC;YAED,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAM,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;QACF,CAAC;QAED,OAAM,CAAC;YACN,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,iBAAiB;SAC3B,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAA4C,OAAU,EAAE,QAAkD;QACrH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEnD;;WAEG;QACH,MAAM,uBAAuB,GAAG,YAAY,CAAC,QAAQ,CAAC;QACtD,IAAI,uBAAuB,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAK,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAEhE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,IAAI,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QAErH,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QACrD,oJAAoJ;QACpJ,OAAM,CAAC,MAAM,aAAa,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAe,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,UAAU;QACT,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACvB,CAAC;;AAGF,eAAe,QAAQ,CAAC","sourcesContent":["import * as KeetaNetClient from '@keetanetwork/keetanet-client';\nimport type { GenericAccount as KeetaNetGenericAccount } from '@keetanetwork/keetanet-client/lib/account.js';\nimport * as CurrencyInfo from '@keetanetwork/currency-info';\nimport type { Logger } from './log/index.ts';\nimport type { JSONSerializable } from './utils/json.ts';\nimport type { DeepPartial } from './utils/types.ts';\nimport { assertNever } from './utils/never.js';\nimport { Buffer } from './utils/buffer.js';\nimport crypto from './utils/crypto.js';\n\nimport { createIs, createAssert } from 'typia';\nimport { convertAssetLocationInputToCanonical, convertAssetSearchInputToCanonical, type MovableAssetSearchInput, type AssetLocationString, type AssetWithRailsMetadata, type Rail, type SupportedAssets } from '../services/asset-movement/common.js';\n\ntype ExternalURL = { external: '2b828e33-2692-46e9-817e-9b93d63f28fd'; url: string; };\n\ntype KeetaNetAccount = InstanceType<typeof KeetaNetClient.lib.Account>;\nconst KeetaNetAccount: typeof KeetaNetClient.lib.Account = KeetaNetClient.lib.Account;\ntype KeetaNetAccountTokenPublicKeyString = ReturnType<InstanceType<typeof KeetaNetClient.lib.Account<typeof KeetaNetAccount.AccountKeyAlgorithm.TOKEN>>['publicKeyString']['get']>;\n\n/**\n * Canonical form of a currency code for use in the ServiceMetadata\n * Which is either the ISO currency code (e.g. \"USD\", \"EUR\", \"JPY\")\n * or a cryptocurrency code prefixed with a dollar sign (e.g. \"$BTC\", \"$ETH\")\n */\ntype ServiceMetadataCurrencyCodeCanonical = CurrencyInfo.ISOCurrencyCode | `$${string}`;\n/**\n * Input types which can be used to search for which token represents\n * a given currency or cryptocurrency.\n */\ntype CurrencySearchInput = ServiceMetadataCurrencyCodeCanonical | CurrencyInfo.ISOCurrencyNumber | CurrencyInfo.Currency;\ntype CurrencySearchCanonical = ServiceMetadataCurrencyCodeCanonical;\ntype CountrySearchInput = CurrencyInfo.ISOCountryCode | CurrencyInfo.ISOCountryNumber | CurrencyInfo.Country;\ntype CountrySearchCanonical = CurrencyInfo.ISOCountryCode; /* XXX:TODO */\n\nconst isCurrencySearchCanonical = createIs<CurrencySearchCanonical>();\n\n// #region Global Service Metadata\n/**\n * Service Metadata General Structure\n */\ntype ServiceMetadata = {\n\tversion: number;\n\t/**\n\t * Map of the currency code to the token public key which\n\t * represents that currency.\n\t */\n\tcurrencyMap: {\n\t\t[currencyCode in ServiceMetadataCurrencyCodeCanonical]?: KeetaNetAccountTokenPublicKeyString;\n\t};\n\tservices: {\n\t\tbanking?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\tcreateAccount?: string;\n\t\t\t\t};\n\t\t\t\tcurrencyCodes: string[];\n\t\t\t\tcountryCodes: string[];\n\t\t\t\tkycProviders?: string[];\n\t\t\t};\n\t\t};\n\t\tkyc?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Check if the KYC provider can\n\t\t\t\t\t * service a more specific locality\n\t\t\t\t\t * (optional)\n\t\t\t\t\t */\n\t\t\t\t\tcheckLocality?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Request an estimate for a KYC\n\t\t\t\t\t * verification (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Begin the KYC verification process\n\t\t\t\t\t * with this KYC provider\n\t\t\t\t\t */\n\t\t\t\t\tcreateVerification?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the certificate for the\n\t\t\t\t\t * KYC verification\n\t\t\t\t\t */\n\t\t\t\t\tgetCertificates?: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Country codes which this KYC provider can\n\t\t\t\t * validate accounts in. If this is not\n\t\t\t\t * specified, then the KYC provider can\n\t\t\t\t * validate accounts in any country.\n\t\t\t\t */\n\t\t\t\tcountryCodes?: string[];\n\t\t\t\t/**\n\t\t\t\t * The Certificate Authority (CA) Certificate\n\t\t\t\t * that this KYC provider uses to sign KYC\n\t\t\t\t * certificates. This is used to identify the\n\t\t\t\t * KYC provider.\n\t\t\t\t */\n\t\t\t\tca: string;\n\t\t\t};\n\t\t};\n\t\t/**\n\t\t * Foreign Exchange (FX) services\n\t\t *\n\t\t * This is used to identify service providers which\n\t\t * can convert currency from one currency to another.\n\t\t */\n\t\tfx?: {\n\t\t\t/**\n\t\t\t * Provider ID which identifies the FX provider\n\t\t\t */\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Get an estimate for a currency\n\t\t\t\t\t * conversion (optional)\n\t\t\t\t\t */\n\t\t\t\t\tgetEstimate?: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get a quote for a currency\n\t\t\t\t\t * conversion\n\t\t\t\t\t */\n\t\t\t\t\tgetQuote: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Create an exchange to convert\n\t\t\t\t\t * currency\n\t\t\t\t\t */\n\t\t\t\t\tcreateExchange: string;\n\t\t\t\t\t/**\n\t\t\t\t\t * Get the status of an exchange\n\t\t\t\t\t * which was previously created\n\t\t\t\t\t */\n\t\t\t\t\tgetExchangeStatus: string;\n\t\t\t\t};\n\t\t\t\t/**\n\t\t\t\t * Path for which can be used to identify which\n\t\t\t\t * currencies this FX provider can convert\n\t\t\t\t * between.\n\t\t\t\t */\n\t\t\t\tfrom: {\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency code which this FX provider can\n\t\t\t\t\t * convert from\n\t\t\t\t\t */\n\t\t\t\t\tcurrencyCodes: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * Currency codes which this FX provider can\n\t\t\t\t\t * convert to from the `from.currencyCode`\n\t\t\t\t\t */\n\t\t\t\t\tto: KeetaNetAccountTokenPublicKeyString[];\n\t\t\t\t\t/**\n\t\t\t\t\t * KYC providers which this FX provider\n\t\t\t\t\t * supports (DN) -- if not specified,\n\t\t\t\t\t * then it does not require KYC.\n\t\t\t\t\t */\n\t\t\t\t\tkycProviders?: string[];\n\t\t\t\t}[];\n\t\t\t}\n\t\t};\n\t\tassetMovement?: {\n\t\t\t[id: string]: {\n\t\t\t\toperations: {\n\t\t\t\t\tinitiateTransfer?: string;\n\t\t\t\t\tgetTransferStatus?: string;\n\t\t\t\t\tcreatePersistentForwarding?: string;\n\t\t\t\t\tlistTransactions?: string\n\t\t\t\t};\n\n\t\t\t\tsupportedAssets: {\n\t\t\t\t\tasset: KeetaNetAccountTokenPublicKeyString;\n\n\t\t\t\t\tpaths: {\n\t\t\t\t\t\tpair: [ AssetWithRailsMetadata, AssetWithRailsMetadata ]\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * KYC providers which this Asset Movement Provider\n\t\t\t\t\t\t * supports (DN) -- if not specified,\n\t\t\t\t\t\t * then it does not require KYC.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tkycProviders?: string[];\n\t\t\t\t\t}[];\n\t\t\t\t}[];\n\t\t\t}\n\t\t};\n\t\tcards?: {\n\t\t\t[id: string]: {\n\t\t\t\t/* XXX:TODO */\n\t\t\t\tworkInProgress?: true;\n\t\t\t};\n\t\t};\n\t};\n};\n\ntype ServiceMetadataExternalizable = ToJSONValuizable<ServiceMetadata>;\n\n/**\n * Types of services which can be resolved\n */\ntype Services = keyof ServiceMetadata['services'];\n\n/**\n * Search criteria for each service type\n */\ntype ServiceSearchCriteria<T extends Services> = {\n\t'banking': {\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ALL of the following currencies.\n\t\t */\n\t\tcurrencyCodes?: CurrencySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts in ANY of the following countries.\n\t\t */\n\t\tcountryCodes?: CountrySearchInput[];\n\t\t/**\n\t\t * Search for a banking provider which supports creating\n\t\t * accounts verified by ANY of the following KYC providers\n\t\t * (DN).\n\t\t */\n\t\tkycProviders?: string[]; /* XXX:TODO */\n\t};\n\t'fx': {\n\t\t/**\n\t\t * Search for a provider which can convert from the following\n\t\t * input currency\n\t\t */\n\t\tinputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which can convert to the following\n\t\t * output currency\n\t\t */\n\t\toutputCurrencyCode?: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString;\n\t\t/**\n\t\t * Search for a provider which supports ANY of the following\n\t\t * KYC providers\n\t\t */\n\t\tkycProviders?: string[];\n\t};\n\t'kyc': {\n\t\t/**\n\t\t * Search for a KYC provider which can verify accounts in ALL\n\t\t * of the following countries.\n\t\t */\n\t\tcountryCodes: CountrySearchInput[];\n\t};\n\t'assetMovement': {\n\t\tasset?: MovableAssetSearchInput;\n\t\tfrom?: AssetLocationString;\n\t\tto?: AssetLocationString;\n\t\trail?: Rail;\n\t\t/**\n\t\t * Search for a provider which supports ANY of the following\n\t\t * KYC providers\n\t\t */\n\t\tkycProviders?: string[];\n\t};\n\t'cards': {\n\t\t/* XXX:TODO */\n\t\tworkInProgress: true;\n\t};\n}[T];\n\ntype ResolverLookupServiceResults<Service extends Services> = { [id: string]: ToValuizableObject<NonNullable<ServiceMetadata['services'][Service]>[string]> };\n\ntype ServicesMetadataLookupMap = {\n\t[Service in Services]: {\n\t\tcriteria: ServiceSearchCriteria<Service>;\n\t\tresults: ResolverLookupServiceResults<Service>;\n\t};\n};\n\nfunction assertValidCountryCodes(input: unknown): asserts input is { countryCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\tthrow(new Error('Expected \"countryCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.countryCodes !== 'function' && !Array.isArray(input.countryCodes)) {\n\t\tthrow(new Error(`Expected \"countryCodes\" to be an array | function, got ${typeof input.countryCodes}`));\n\t}\n\n\tif (Array.isArray(input.countryCodes)) {\n\t\tfor (const countryCode of input.countryCodes) {\n\t\t\tif (typeof countryCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"countryCodes\" to be an array of strings, got ${typeof countryCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOptionalCountryCodes(input: unknown): asserts input is { countryCodes?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['countryCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('countryCodes' in input)) {\n\t\treturn;\n\t}\n\n\tassertValidCountryCodes(input);\n}\n\nfunction assertValidCurrencyCodes(input: unknown): asserts input is { currencyCodes: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['currencyCodes'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('currencyCodes' in input)) {\n\t\tthrow(new Error('Expected \"currencyCodes\" to be present, but it was not found'));\n\t}\n\n\tif (typeof input.currencyCodes !== 'function' && !Array.isArray(input.currencyCodes)) {\n\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array | function, got ${typeof input.currencyCodes}`));\n\t}\n\n\tif (Array.isArray(input.currencyCodes)) {\n\t\tfor (const currencyCode of input.currencyCodes) {\n\t\t\tif (typeof currencyCode !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"currencyCodes\" to be an array of strings, got ${typeof currencyCode}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsBanking(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['operations'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('operations' in input)) {\n\t\tthrow(new Error('Expected \"operations\" key in KYC service, but it was not found'));\n\t}\n\n\tif ((typeof input.operations !== 'object' || input.operations === null) && typeof input.operations !== 'function') {\n\t\tthrow(new Error(`Expected \"operations\" to be an object | function, got ${typeof input.operations}`));\n\t}\n\n\tif (typeof input.operations !== 'function') {\n\t\tfor (const [operation, operationValue] of Object.entries(input.operations)) {\n\t\t\tif (typeof operation !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations\" to be an object with string keys, got ${typeof operation}`));\n\t\t\t}\n\n\t\t\tif (typeof operationValue !== 'string') {\n\t\t\t\tthrow(new Error(`Expected \"operations.${operation}\" to be a string, got ${typeof operationValue}`));\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidOperationsKYC(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOperationsFX(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['fx']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOperationsAssetMovement(input: unknown): asserts input is { operations: ToValuizableObject<NonNullable<ServiceMetadata['services']['assetMovement']>[string]>['operations'] } {\n\t/* XXX:TODO: Validate the specific operations */\n\tassertValidOperationsBanking(input);\n}\n\nfunction assertValidOptionalKYCProviders(input: unknown): asserts input is { kycProviders?: ToValuizableObject<NonNullable<ServiceMetadata['services']['banking']>[string]>['kycProviders'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif ('kycProviders' in input) {\n\t\tif (typeof input.kycProviders !== 'function' && !Array.isArray(input.kycProviders)) {\n\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array | function, got ${typeof input.kycProviders}`));\n\t\t}\n\n\t\tif (Array.isArray(input.kycProviders)) {\n\t\t\tfor (const kycProvider of input.kycProviders) {\n\t\t\t\tif (typeof kycProvider !== 'string') {\n\t\t\t\t\tthrow(new Error(`Expected \"kycProviders\" to be an array of strings, got ${typeof kycProvider}`));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction assertValidCA(input: unknown): asserts input is { ca: ToValuizableObject<NonNullable<ServiceMetadata['services']['kyc']>[string]>['ca'] } {\n\tif (typeof input !== 'object' || input === null) {\n\t\tthrow(new Error(`Expected an object, got ${typeof input}`));\n\t}\n\n\tif (!('ca' in input)) {\n\t\tthrow(new Error('Expected \"ca\" key in KYC service, but it was not found'));\n\t}\n\n\tif (typeof input.ca !== 'string' && typeof input.ca !== 'function') {\n\t\tthrow(new Error(`Expected \"ca\" to be a string | function, got ${typeof input.ca}`));\n\t}\n}\n\nconst assertResolverLookupBankingResult = function(input: unknown): ResolverLookupServiceResults<'banking'>[string] {\n\tassertValidOperationsBanking(input);\n\tassertValidCountryCodes(input);\n\tassertValidCurrencyCodes(input);\n\tassertValidOptionalKYCProviders(input);\n\n\treturn(input);\n\n};\nconst assertResolverLookupKYCResult = function(input: unknown): ResolverLookupServiceResults<'kyc'>[string] {\n\tassertValidOperationsKYC(input);\n\tassertValidOptionalCountryCodes(input);\n\tassertValidCA(input);\n\n\treturn(input);\n};\n\nconst assertResolverLookupFXResult = async function(input: unknown): Promise<ResolverLookupServiceResults<'fx'>[string]> {\n\tassertValidOperationsFX(input);\n\n\tif (!('from' in input)) {\n\t\tthrow(new Error('Expected \"from\" key in FX service, but it was not found'));\n\t}\n\n\tconst fromUnrealized = input.from;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(fromUnrealized)) {\n\t\tthrow(new Error(`Expected \"from\" to be an Valuizable, got ${typeof fromUnrealized}`));\n\t}\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\tawait fromUnrealized('array');\n\n\t// XXX:TODO: Perform deeper validation of the \"from\" structure\n\t// @ts-ignore\n\treturn(input);\n};\n\nconst assertResolverLookupAssetMovementResults = async function(input: unknown): Promise<ResolverLookupServiceResults<'assetMovement'>[string]> {\n\tassertValidOperationsAssetMovement(input);\n\t// assertValidOperationsKYC(input);\n\t// assertValidOptionalCountryCodes(input);\n\t// assertValidCA(input);\n\tif (!('supportedAssets' in input)) {\n\t\tthrow(new Error('Expected \"supportedAssets\" key in asset movement service, but it was not found'));\n\t}\n\n\tconst fromUnrealized = input.supportedAssets;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(fromUnrealized)) {\n\t\tthrow(new Error(`Expected \"supportedAssets\" to be an Valuizable, got ${typeof fromUnrealized}`));\n\t}\n\n\t// XXX:TODO: Perform deeper validation of the \"supportedAssets\" structure\n\tawait fromUnrealized('array');\n\n\t// XXX:TODO: Perform deeper validation of the \"supportedAssets\" structure\n\t// @ts-ignore\n\treturn(input);\n};\n\n// #endregion\n\n// #region Validation\n\nasync function isValidOperations(input: unknown): Promise<{ operations: ValuizableMethod } | false> {\n\tif (typeof input !== 'object' || input === null) {\n\t\treturn(false);\n\t}\n\n\tif (!('operations' in input)) {\n\t\treturn(false);\n\t}\n\n\tconst operations = input.operations;\n\t// eslint-disable-next-line @typescript-eslint/no-use-before-define\n\tif (!Metadata.isValuizable(operations)) {\n\t\treturn(false);\n\t}\n\n\treturn({\n\t\t...input,\n\t\toperations\n\t});\n}\n\nfunction convertToCurrencySearchCanonical(input: CurrencySearchInput): CurrencySearchCanonical {\n\tif (CurrencyInfo.Currency.isCurrencyCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Currency.isISOCurrencyNumber(input)) {\n\t\tinput = new CurrencyInfo.Currency(input);\n\t\treturn(input.code);\n\t} else if (typeof input === 'string') {\n\t\treturn(input);\n\t} else if (input === null) {\n\t\tthrow(new Error('Invalid currency input: null'));\n\t} else if ('code' in input) {\n\t\treturn(input.code);\n\t} else {\n\t\tthrow(new Error(`Invalid currency input: ${input}`));\n\t}\n}\n\nasync function hasAllCurrencyCodes(input: unknown, criteria: { currencyCodes: CurrencySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCurrencyCodes(input);\n\n\tconst currencyCodes = await input.currencyCodes?.('array') ?? [];\n\tconst inputCurrencyCodes = await Promise.all(currencyCodes.map(async function(item) {\n\t\treturn(await item?.('primitive'));\n\t}));\n\n\tfor (const checkCurrencyCode of criteria.currencyCodes) {\n\t\tconst checkCurrencyCodeCanonical = convertToCurrencySearchCanonical(checkCurrencyCode);\n\t\tif (!inputCurrencyCodes.includes(checkCurrencyCodeCanonical)) {\n\t\t\treturn(false);\n\t\t}\n\t}\n\n\treturn(true);\n}\n\nasync function hasAnyCountryCodes(input: unknown, criteria: { countryCodes: CountrySearchCanonical[] }): Promise<boolean> {\n\t// XXX:TODO: Avoid using exceptions for flow-control\n\tassertValidCountryCodes(input);\n\n\tconst countryCodes = await input.countryCodes?.('array') ?? [];\n\n\tfor (const countryCode of countryCodes) {\n\t\tconst countryCodeValue = await countryCode?.('primitive');\n\t\tif (countryCodeValue === undefined) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\tif (criteria.countryCodes.includes(countryCodeValue as any)) {\n\t\t\treturn(true);\n\t\t}\n\t}\n\n\treturn(false);\n}\n\n// #endregion\n\nfunction convertToCountrySearchCanonical(input: CountrySearchInput): CountrySearchCanonical {\n\tif (CurrencyInfo.Country.isCountryCode(input)) {\n\t\treturn(input);\n\t} else if (CurrencyInfo.Country.isISOCountryNumber(input)) {\n\t\tinput = new CurrencyInfo.Country(input);\n\t}\n\n\treturn(input.code);\n}\n\n/**\n * Check if a value is an ExternalURL\n */\nconst isExternalURL = createIs<ExternalURL>();\n\ntype JSONSerializablePrimitive = Exclude<JSONSerializable, object>;\ntype ValuizeInput = JSONSerializablePrimitive | ValuizableObject | ValuizableArray;\ntype ValuizableArray = (ValuizableMethod | undefined)[];\ntype ValuizableObject = { [key: string]: ValuizableMethod | undefined };\n\ntype ValuizableKind = 'any' | 'object' | 'array' | 'primitive' | 'string' | 'number' | 'boolean';\n\ninterface ValuizableMethodBase {\n\t(expect?: ValuizableKind): Promise<ValuizeInput>;\n\t(expect: 'any'): Promise<ValuizeInput>;\n}\n\ninterface ToValuizableExpectPrimitive<Primitive extends JSONSerializablePrimitive = JSONSerializablePrimitive> extends ValuizableMethodBase {\n\t(expect: 'primitive'): Promise<Primitive>;\n}\n\ninterface ValuizableMethod extends ValuizableMethodBase, ToValuizableExpectPrimitive {\n\t(expect: 'object'): Promise<ValuizableObject>;\n\t(expect: 'array'): Promise<ValuizableArray>;\n\t(expect: 'string'): Promise<string>;\n\t(expect: 'number'): Promise<number>;\n\t(expect: 'boolean'): Promise<boolean>;\n};\n\ninterface ToValuizableExpectString extends ValuizableMethodBase, ToValuizableExpectPrimitive<string> {\n\t(expect: 'string'): Promise<string>;\n};\n\ninterface ToValuizableExpectNumber extends ValuizableMethodBase, ToValuizableExpectPrimitive<number> {\n\t(expect: 'number'): Promise<number>;\n};\n\ninterface ToValuizableExpectBoolean extends ValuizableMethodBase, ToValuizableExpectPrimitive<boolean> {\n\t(expect: 'boolean'): Promise<boolean>;\n};\n\ninterface ToValuizableExpectObject<T> extends ValuizableMethodBase {\n\t(expect: 'object'): Promise<T>;\n}\n\ninterface ToValuizableExpectArray<T extends unknown[]> extends ValuizableMethodBase {\n\t(expect: 'array'): Promise<T>;\n}\n\n/* eslint-disable @stylistic/indent */\ntype ToValuizable<T> =\n\tT extends string ? ToValuizableExpectString :\n\tT extends number ? ToValuizableExpectNumber :\n\tT extends boolean ? ToValuizableExpectBoolean :\n\tT extends JSONSerializablePrimitive ? ToValuizableExpectPrimitive<T> :\n\tT extends unknown[] ? ToValuizableExpectArray<{ [K in keyof T]: ToValuizable<T[K]> }> :\n\tT extends object ? ToValuizableExpectObject<ToValuizableObject<T>> :\n\tT extends undefined ? undefined :\n\tnever;\n\ntype ToValuizableObject<T extends object> = {\n\t[K in keyof T]: ToValuizable<T[K]>;\n};\n\ntype ToJSONValuizableObject<T extends object> = {\n\t[K in keyof T]: (\n\t\tT[K] extends object ?\n\t\t\tToJSONValuizableObject<T[K]> :\n\t\tT[K] extends (object | undefined) ?\n\t\t\tToJSONValuizableObject<NonNullable<T[K]>> | undefined :\n\t\tT[K]\n\t) | ExternalURL;\n};\ntype ToJSONValuizable<T> = ToJSONValuizableObject<{ tmp: T }>['tmp'];\n\ntype ValuizeResolvable = JSONSerializablePrimitive | ValuizableObject | ValuizableArray | ValuizableMethod;\n\n/*\n * Access token to share with the Metadata object to allow it to\n * access the mutable stats object.\n */\nconst statsAccessToken = Symbol('statsAccessToken');\n\n/**\n * A cache object\n */\ntype URLCacheObject = Map<string, {\n\tpass: true;\n\tvalue: JSONSerializable;\n\texpires: Date;\n} | {\n\tpass: false;\n\terror: unknown;\n\texpires: Date;\n}>;\n\n\ntype ResolverConfig = {\n\t/**\n\t * The \"root\" account(s) to use as the basis for all lookups. It should\n\t * contain the authoritative information for resolving in its\n\t * Metadata.\n\t *\n\t * Can be either:\n\t * - A single KeetaNetGenericAccount\n\t * - An array of KeetaNetGenericAccount in priority order (highest priority first)\n\t *\n\t * When an array is provided, the resolver will merge results from all roots,\n\t * with entries from higher priority roots taking precedence over lower priority ones.\n\t */\n\troot: KeetaNetGenericAccount | KeetaNetGenericAccount[];\n\t/**\n\t * A KeetaNet Client to access the network using.\n\t */\n\tclient: KeetaNetClient.Client | KeetaNetClient.UserClient;\n\t/**\n\t * A list of trusted Certificate Authorities to use when connecting to\n\t * external HTTPS services.\n\t */\n\ttrustedCAs: string[]; /* XXX:TODO */\n\t/**\n\t * Logger to use for debugging\n\t */\n\tlogger?: Logger;\n\t/**\n\t * ID for this instance of the resolver\n\t */\n\tid?: string;\n\t/**\n\t * Caching Parameters\n\t */\n\tcache?: Omit<NonNullable<MetadataConfig['cache']>, 'instance'>;\n}\n\n\ntype MetadataConfig = {\n\ttrustedCAs: ResolverConfig['trustedCAs'];\n\tclient: KeetaNetClient.Client;\n\tlogger?: ResolverConfig['logger'];\n\tresolver: Resolver;\n\tcache?: {\n\t\tinstance: URLCacheObject;\n\t\tpositiveTTL?: number;\n\t\tnegativeTTL?: number;\n\t};\n\tparent?: Metadata;\n};\n\ntype ValuizableInstance = { value: ValuizableMethod };\n\nconst assertServiceMetadata = createAssert<ToJSONValuizable<ServiceMetadata>>();\nconst assertKeetaSupportedAssets = createAssert<SupportedAssets[]>();\n\n/**\n * Instance type ID for anonymous Valuizable methods created dynamically\n */\nconst ANONYMOUS_VALUIZABLE_INSTANCE_TYPE_ID = 'Anonymous:6e69d6db-9263-466d-9c96-4b92ced498bd';\n\nclass Metadata implements ValuizableInstance {\n\treadonly #cache: Required<NonNullable<MetadataConfig['cache']>>;\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #url: URL;\n\treadonly #resolver: Resolver;\n\treadonly #stats: ResolverStats;\n\tprivate readonly seenURLs: Set<string>;\n\n\tprivate static readonly instanceTypeID = 'Metadata:c85b3d67-9548-4042-9862-f6e6677690ac';\n\n\tstatic isInstance(value: unknown): value is Metadata {\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn(false);\n\t\t}\n\t\tif (!('instanceID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\treturn(value.instanceID === Metadata.instanceTypeID);\n\t}\n\n\t/**\n\t * Format the supplied Metadata as appropriate to be included\n\t * within the Metadata field of a KeetaNet acccount to serve\n\t * as the Metadata for the Resolver.\n\t */\n\tstatic formatMetadata(metadata: ToJSONValuizable<ServiceMetadata>): string;\n\t// eslint-disable-next-line @typescript-eslint/unified-signatures\n\tstatic formatMetadata(metadata: JSONSerializable): string;\n\tstatic formatMetadata(metadata: JSONSerializable | ToJSONValuizable<ServiceMetadata>): string {\n\t\tconst metadataBytes = Buffer.from(JSON.stringify(metadata), 'utf-8');\n\t\tconst metadataCompressed = KeetaNetClient.lib.Utils.Buffer.ZlibDeflate(KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(metadataBytes));\n\t\tconst metadataEncoded = Buffer.from(metadataCompressed).toString('base64');\n\n\t\treturn(metadataEncoded);\n\t}\n\n\t/**\n\t * Assert that the supplied value is a valid Metadata Root Object\n\t */\n\tstatic assertMetadata(value: unknown): asserts value is ToJSONValuizable<ServiceMetadata> {\n\t\tassertServiceMetadata(value);\n\t}\n\n\t/**\n\t * Check if the supplied value is a Valuizable method which can\n\t * be called to resolve a Valuizable value.\n\t */\n\tstatic isValuizable(value: unknown): value is ValuizableMethod {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (typeof value !== 'function') {\n\t\t\treturn(false);\n\t\t}\n\n\t\t// @ts-ignore\n\t\tif (!('instanceTypeID' in value)) {\n\t\t\treturn(false);\n\t\t}\n\n\t\tif (value.instanceTypeID === Metadata.instanceTypeID) {\n\t\t\treturn(true);\n\t\t}\n\n\t\tif (value.instanceTypeID === ANONYMOUS_VALUIZABLE_INSTANCE_TYPE_ID) {\n\t\t\treturn(true);\n\t\t}\n\n\t\treturn(false);\n\t}\n\n\t/**\n\t * Recursively resolve a Valuizable value into a fully\n\t * realized JSONSerializable value. This will walk the\n\t * entire structure, calling each Valuizable method\n\t * and replacing it with the returned value.\n\t *\n\t * This should only be used in cases where the entire\n\t * structure needs to be fully realized, as it\n\t * can be quite expensive.\n\t */\n\tstatic async fullyResolveValuizable(value: ValuizeResolvable, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;\n\t// eslint-disable-next-line @typescript-eslint/unified-signatures,@typescript-eslint/no-explicit-any\n\tstatic async fullyResolveValuizable(value: any, invalidReplacement?: JSONSerializable): Promise<JSONSerializable>;\n\tstatic async fullyResolveValuizable(value: ValuizeResolvable, invalidReplacement: JSONSerializable = null): Promise<JSONSerializable> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tconst newArray: JSONSerializable[] = [];\n\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\tconst entry = value[i];\n\t\t\t\t\tif (Metadata.isValuizable(entry)) {\n\t\t\t\t\t\tconst newEntry = await Metadata.fullyResolveValuizable(entry);\n\t\t\t\t\t\tnewArray.push(newEntry);\n\t\t\t\t\t} else if (entry === undefined) {\n\t\t\t\t\t\tthrow(new Error(`Array entry ${i} is undefined, which is not valid in JSON`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(newArray);\n\t\t\t} else {\n\t\t\t\tconst newObject: { [key: string]: JSONSerializable; } = {};\n\t\t\t\tfor (const key in value) {\n\t\t\t\t\t/*\n\t\t\t\t\t * Since `key` is the index of the array or\n\t\t\t\t\t * object, it is safe to use it to index\n\t\t\t\t\t * into the array or object.\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst entry = value[key];\n\t\t\t\t\tif (Metadata.isValuizable(entry)) {\n\t\t\t\t\t\tconst newEntry = await Metadata.fullyResolveValuizable(entry);\n\t\t\t\t\t\tnewObject[key] = newEntry;\n\t\t\t\t\t} else if (entry === undefined) {\n\t\t\t\t\t\tthrow(new Error(`Object key \"${key}\" is undefined, which is not valid in JSON`));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tassertNever(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn(newObject);\n\t\t\t}\n\t\t}\n\n\t\tif (Metadata.isValuizable(value)) {\n\t\t\ttry {\n\t\t\t\tconst retval = await value('any');\n\t\t\t\treturn(await Metadata.fullyResolveValuizable(retval));\n\t\t\t} catch {\n\t\t\t\treturn(invalidReplacement);\n\t\t\t}\n\t\t}\n\n\t\tswitch (typeof value) {\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\treturn(value);\n\t\t\tcase 'object':\n\t\t\t\tif (value === null) {\n\t\t\t\t\treturn(value);\n\t\t\t\t}\n\t\t\t\tassertNever(value);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tassertNever(value);\n\t\t}\n\n\t\tthrow(new Error('invalid input'));\n\t}\n\n\tconstructor(url: string | URL, config: MetadataConfig) {\n\t\t/*\n\t\t * Define an \"instanceTypeID\" as an unenumerable property to\n\t\t * ensure that we can identify this object as an instance of\n\t\t * Metadata, but we do not need to serialize it.\n\t\t */\n\t\tObject.defineProperty(this, 'instanceTypeID', {\n\t\t\tvalue: Metadata.instanceTypeID,\n\t\t\tenumerable: false\n\t\t});\n\t\tthis.#url = new URL(url);\n\t\tthis.#cache = {\n\t\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\t\tinstance: config.cache?.instance ?? new Map() satisfies URLCacheObject as URLCacheObject,\n\t\t\tpositiveTTL: config.cache?.positiveTTL ?? 60 * 1000,\n\t\t\tnegativeTTL: config.cache?.negativeTTL ?? 5 * 1000\n\t\t};\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#client = config.client;\n\t\tthis.#logger = config.logger;\n\t\tthis.#resolver = config.resolver;\n\t\tthis.#stats = this.#resolver._mutableStats(statsAccessToken);\n\t\tif (config.parent !== undefined) {\n\t\t\tthis.seenURLs = config.parent.seenURLs;\n\t\t} else {\n\t\t\tthis.seenURLs = new Set();\n\t\t}\n\t}\n\n\t/**\n\t * @param metadata Metadata to parse -- base64 encoded string or ArrayBuffer\n\t */\n\tprivate async parseMetadata(metadata: string | ArrayBuffer): Promise<JSONSerializable> {\n\t\tif (typeof metadata === 'string') {\n\t\t\tmetadata = KeetaNetClient.lib.Utils.Helper.bufferToArrayBuffer(Buffer.from(metadata, 'base64'));\n\t\t}\n\n\t\t/*\n\t\t * Attempt to decompress the metadata. If it fails, then\n\t\t * assume it is not compressed.\n\t\t */\n\t\tlet metadataUncompressed: ArrayBuffer;\n\t\ttry {\n\t\t\tmetadataUncompressed = KeetaNetClient.lib.Utils.Buffer.ZlibInflate(metadata);\n\t\t} catch {\n\t\t\tmetadataUncompressed = metadata;\n\t\t}\n\n\t\tconst metadataBytes = Buffer.from(metadataUncompressed);\n\t\tconst metadataDecoded = metadataBytes.toString('utf-8');\n\n\t\t/*\n\t\t * JSON.parse() will always return a JSONSerializable,\n\t\t * and not `unknown`, so we can safely cast it.\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n\t\tconst retval = await this.resolveValue(JSON.parse(metadataDecoded) as JSONSerializable);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readKeetaNetURL(url: URL): Promise<JSONSerializable> {\n\t\tconst accountString = url.hostname;\n\t\tconst path = url.pathname;\n\n\t\tthis.#stats.keetanet.reads++;\n\n\t\tif (path !== '/metadata') {\n\t\t\tthrow(new Error(`Unsupported path: ${path}`));\n\t\t}\n\n\t\tlet account: KeetaNetGenericAccount | string;\n\t\ttry {\n\t\t\taccount = KeetaNetClient.lib.Account.fromPublicKeyString(accountString);\n\t\t} catch {\n\t\t\treturn('');\n\t\t}\n\n\t\tconst accountInfo = await this.#client.getAccountInfo(account);\n\t\tconst metadata = accountInfo.info.metadata;\n\t\tif (metadata === '') {\n\t\t\treturn('');\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Account info for', accountString, '=', accountInfo.info);\n\t\tconst retval = await this.parseMetadata(metadata);\n\t\treturn(retval);\n\t}\n\n\tprivate async readHTTPSURL(url: URL): Promise<JSONSerializable> {\n\t\tthis.#stats.https.reads++;\n\n\t\tconst results = await fetch(url.toString(), {\n\t\t\tmethod: 'GET',\n\t\t\theaders: {\n\t\t\t\t'Accept': 'application/json'\n\t\t\t}\n\t\t});\n\n\t\tif (!results.ok) {\n\t\t\tthrow(new Error(`Error HTTP status ${results.status} ${results.statusText} for ${url.toString()}`));\n\t\t}\n\n\t\tif (results.status === 204) {\n\t\t\t/*\n\t\t\t * 204 No Content is a valid response, so we return an empty\n\t\t\t * object.\n\t\t\t */\n\t\t\treturn({});\n\t\t}\n\n\t\tif (results.status !== 200) {\n\t\t\tthrow(new Error(`Unexpected HTTP status ${results.status} for ${url.toString()}`));\n\t\t}\n\n\t\tconst metadata = await (await results.blob()).arrayBuffer();\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', metadata);\n\n\t\tconst retval = await this.parseMetadata(metadata);\n\n\t\treturn(retval);\n\t}\n\n\tprivate async readURL(url: URL) {\n\t\tthis.#stats.reads++;\n\n\t\tconst cacheKey = url.toString();\n\t\t/*\n\t\t * To ensure any circular references are handled correctly, we\n\t\t * keep track of a chain of accessed URLs. If we see the same\n\t\t * URL twice, then we have a circular reference.\n\t\t */\n\t\tif (this.seenURLs.has(cacheKey)) {\n\t\t\treturn(null);\n\t\t}\n\t\tthis.seenURLs.add(cacheKey);\n\n\t\t/*\n\t\t * Verify that the cache entry is still valid. If it is not,\n\t\t * then remove it from the cache.\n\t\t */\n\t\tlet cacheVal = this.#cache.instance.get(cacheKey);\n\n\t\tif (this.#cache.instance.has(cacheKey) && cacheVal !== undefined) {\n\t\t\tif (cacheVal.expires < new Date()) {\n\t\t\t\tthis.#cache.instance.delete(cacheKey);\n\t\t\t\tcacheVal = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif (cacheVal !== undefined) {\n\t\t\tthis.#stats.cache.hit++;\n\n\t\t\tif (cacheVal.pass) {\n\t\t\t\treturn(cacheVal.value);\n\t\t\t} else {\n\t\t\t\tthrow(cacheVal.error);\n\t\t\t}\n\t\t}\n\n\t\tthis.#stats.cache.miss++;\n\n\t\tlet retval: JSONSerializable;\n\t\ttry {\n\t\t\tconst protocol = url.protocol;\n\t\t\tif (protocol === 'keetanet:') {\n\t\t\t\tretval = await this.readKeetaNetURL(url);\n\t\t\t} else if (protocol === 'https:') {\n\t\t\t\tretval = await this.readHTTPSURL(url);\n\t\t\t} else {\n\t\t\t\tthis.#stats.unsupported.reads++;\n\t\t\t\tthrow(new Error(`Unsupported protocol: ${protocol}`));\n\t\t\t}\n\t\t} catch (readError) {\n\t\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\t\tpass: false,\n\t\t\t\terror: readError,\n\t\t\t\texpires: new Date(Date.now() + this.#cache.negativeTTL)\n\t\t\t});\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), 'failed:', readError);\n\t\t\tthrow(readError);\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.#resolver.id}`, 'Read URL', url.toString(), ':', retval);\n\n\t\tthis.#cache.instance.set(cacheKey, {\n\t\t\tpass: true,\n\t\t\tvalue: retval,\n\t\t\texpires: new Date(Date.now() + this.#cache.positiveTTL)\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tprivate async resolveValue<T extends ExternalURL | undefined>(value: T): Promise<JSONSerializable>;\n\tprivate async resolveValue<T extends JSONSerializable | undefined>(value: T): Promise<T>;\n\tprivate async resolveValue<T extends JSONSerializable | ExternalURL | undefined>(value: T): Promise<T | JSONSerializable> {\n\t\tif (value === undefined) {\n\t\t\treturn(value);\n\t\t}\n\n\t\t/*\n\t\t * If the value passed in is a reference to an external URL, then\n\t\t * we need to read that URL (and continue to resolve it).\n\t\t */\n\t\tif (isExternalURL(value)) {\n\t\t\tconst url = new URL(value.url);\n\t\t\tconst retval = await this.readURL(url);\n\n\t\t\treturn(await this.resolveValue(retval));\n\t\t}\n\n\t\treturn(value);\n\t}\n\n\tprivate assertValuizableKind(input: ValuizeInput, expect: ValuizableKind) {\n\t\tswitch (expect) {\n\t\t\tcase 'any':\n\t\t\t\treturn(input);\n\t\t\tcase 'object':\n\t\t\t\tif (typeof input !== 'object') {\n\t\t\t\t\tthrow(new Error(`expected an object, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\tif (input === null) {\n\t\t\t\t\tthrow(new Error('expected an object, got null'));\n\t\t\t\t}\n\n\t\t\t\tif (Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error('expected an object, got an array'));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'array':\n\t\t\t\tif (!Array.isArray(input)) {\n\t\t\t\t\tthrow(new Error(`expected an array, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'primitive':\n\t\t\t\tif ((typeof input === 'object' && input !== null) || input === undefined) {\n\t\t\t\t\tthrow(new Error(`expected a primitive, got ${typeof input}`));\n\t\t\t\t}\n\n\t\t\t\treturn(input);\n\t\t\tcase 'string':\n\t\t\tcase 'number':\n\t\t\tcase 'boolean':\n\t\t\t\tif (typeof input !== expect) {\n\t\t\t\t\tthrow(new Error(`expected a ${expect}, got ${typeof input}`));\n\t\t\t\t}\n\t\t\t\treturn(input);\n\t\t\tdefault:\n\t\t\t\tassertNever(expect);\n\t\t}\n\t}\n\n\tprivate async valuize(value: JSONSerializable): Promise<ValuizeInput> {\n\t\tif (typeof value === 'object' && value !== null) {\n\t\t\tlet newValue: ValuizableObject | ValuizableArray;\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tnewValue = [];\n\t\t\t} else {\n\t\t\t\tnewValue = {};\n\t\t\t}\n\t\t\tfor (const key in value) {\n\t\t\t\t/*\n\t\t\t\t * Since `key` is the index of the array or\n\t\t\t\t * object, it is safe to use it to index\n\t\t\t\t * into the array or object.\n\t\t\t\t */\n\t\t\t\t// @ts-ignore\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\t\t\t\tconst keyValue: JSONSerializable = value[key];\n\n\t\t\t\tif (isExternalURL(keyValue)) {\n\t\t\t\t\tif (Array.isArray(newValue)) {\n\t\t\t\t\t\tthrow(new Error('internal error: newValue is an array, but it should be an object since it is an external field, which can only be an object'));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst newMetadataObject = new Metadata(keyValue.url, {\n\t\t\t\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\t\t\t\tclient: this.#client,\n\t\t\t\t\t\tlogger: this.#logger,\n\t\t\t\t\t\tresolver: this.#resolver,\n\t\t\t\t\t\tcache: this.#cache,\n\t\t\t\t\t\tparent: this\n\t\t\t\t\t});\n\n\t\t\t\t\tconst newValuizableObject: ValuizableMethod = newMetadataObject.value.bind(newMetadataObject);\n\n\t\t\t\t\tObject.defineProperty(newValuizableObject, 'instanceTypeID', {\n\t\t\t\t\t\tvalue: ANONYMOUS_VALUIZABLE_INSTANCE_TYPE_ID,\n\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t});\n\n\t\t\t\t\tnewValue[key] = newValuizableObject;\n\t\t\t\t} else {\n\t\t\t\t\t/*\n\t\t\t\t\t * This is safe because `assertValuizableKind` will\n\t\t\t\t\t * ensure the correct output type\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tconst newValueEntry: ValuizableMethod = async (expect: ValuizableKind = 'any') => {\n\t\t\t\t\t\tconst retval = this.assertValuizableKind(await this.valuize(keyValue), expect);\n\t\t\t\t\t\treturn(retval);\n\t\t\t\t\t};\n\n\t\t\t\t\tObject.defineProperty(newValueEntry, 'instanceTypeID', {\n\t\t\t\t\t\tvalue: ANONYMOUS_VALUIZABLE_INSTANCE_TYPE_ID,\n\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t});\n\n\t\t\t\t\t/*\n\t\t\t\t\t * TypeScript doesn't track that `key`\n\t\t\t\t\t * is a valid index regardless of the\n\t\t\t\t\t * type of `newValue` is an array or an\n\t\t\t\t\t * object, so we need to use `@ts-ignore`\n\t\t\t\t\t */\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tnewValue[key] = newValueEntry;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(newValue);\n\t\t} else {\n\t\t\treturn(value);\n\t\t}\n\t}\n\n\tasync value(expect: 'object'): Promise<ValuizableObject>;\n\tasync value(expect: 'array'): Promise<ValuizableArray>;\n\tasync value(expect: 'primitive'): Promise<JSONSerializablePrimitive>;\n\tasync value(expect: 'string'): Promise<string>;\n\tasync value(expect: 'number'): Promise<number>;\n\tasync value(expect: 'boolean'): Promise<boolean>;\n\tasync value(expect: 'any'): Promise<ValuizeInput>;\n\tasync value(expect?: ValuizableKind): Promise<ValuizeInput>;\n\tasync value(expect: ValuizableKind = 'any'): Promise<ValuizeInput> {\n\t\tconst value = await this.readURL(this.#url);\n\n\t\tconst retval = this.assertValuizableKind(await this.valuize(value), expect);\n\n\t\treturn(retval);\n\t}\n}\n\ntype ResolverStats = {\n\tkeetanet: {\n\t\treads: number;\n\t};\n\thttps: {\n\t\treads: number;\n\t};\n\tunsupported: {\n\t\treads: number;\n\t};\n\treads: number;\n\tcache: {\n\t\thit: number;\n\t\tmiss: number;\n\t}\n};\n\nclass Resolver {\n\treadonly #roots: KeetaNetGenericAccount[];\n\treadonly #trustedCAs: ResolverConfig['trustedCAs'];\n\treadonly #client: KeetaNetClient.Client;\n\treadonly #logger: Logger | undefined;\n\treadonly #stats: ResolverStats;\n\treadonly #metadataCache: NonNullable<MetadataConfig['cache']>;\n\n\treadonly id: string;\n\n\tstatic readonly Metadata: typeof Metadata = Metadata;\n\n\tprivate readonly lookupMap: {\n\t\t[Service in Services]: {\n\t\t\tsearch: (input: ValuizableObject | undefined, criteria: ServiceSearchCriteria<Service>) => Promise<ResolverLookupServiceResults<Service> | undefined>;\n\t\t};\n\t} = {\n\t\t'banking': {\n\t\t\tsearch: this.lookupBankingServices.bind(this)\n\t\t},\n\t\t'kyc': {\n\t\t\tsearch: this.lookupKYCServices.bind(this)\n\t\t},\n\t\t'fx': {\n\t\t\tsearch: this.lookupFXServices.bind(this)\n\t\t},\n\t\t'assetMovement': {\n\t\t\tsearch: this.lookupAssetMovementServices.bind(this)\n\t\t},\n\t\t'cards': {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t\tsearch: async (_input: ValuizableObject | undefined, _criteria: ServiceSearchCriteria<'cards'>) => {\n\t\t\t\tthrow(new Error('not implemented'));\n\t\t\t}\n\t\t}\n\t};\n\n\n\tconstructor(config: ResolverConfig) {\n\t\tthis.#roots = Array.isArray(config.root) ? config.root : [config.root];\n\t\tthis.#trustedCAs = config.trustedCAs;\n\t\tthis.#logger = config.logger;\n\t\tthis.#metadataCache = {\n\t\t\t...config.cache,\n\t\t\tinstance: new Map()\n\t\t};\n\n\t\tthis.id = config.id ?? crypto.randomUUID();\n\n\t\tconst rootAccountStrings = this.#roots.map(root => root.publicKeyString.get()).join(', ');\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Creating resolver with root account(s)', rootAccountStrings);\n\n\t\tif (KeetaNetClient.Client.isInstance(config.client)) {\n\t\t\tthis.#client = config.client;\n\t\t} else {\n\t\t\tthis.#client = config.client.client;\n\t\t}\n\n\t\tthis.#stats = {\n\t\t\tkeetanet: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\thttps: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\tunsupported: {\n\t\t\t\treads: 0\n\t\t\t},\n\t\t\treads: 0,\n\t\t\tcache: {\n\t\t\t\thit: 0,\n\t\t\t\tmiss: 0\n\t\t\t}\n\t\t};\n\t}\n\n\t/** @internal */\n\t_mutableStats(accessToken: symbol) {\n\t\tif (accessToken !== statsAccessToken) {\n\t\t\tthrow(new Error('Invalid access token'));\n\t\t}\n\n\t\treturn(this.#stats);\n\t}\n\n\tget stats(): ResolverStats {\n\t\treturn(structuredClone(this.#stats));\n\t}\n\n\tprivate async lookupBankingServices(bankingServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'banking'>) {\n\t\tif (bankingServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tlet canonicalCurrencyCriteria;\n\t\tif ('currencyCodes' in criteria) {\n\t\t\tcanonicalCurrencyCriteria = {\n\t\t\t\tcurrencyCodes: criteria.currencyCodes.map(convertToCurrencySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tlet canonicalCountryCriteria;\n\t\tif ('countryCodes' in criteria) {\n\t\t\tcanonicalCountryCriteria = {\n\t\t\t\tcountryCodes: criteria.countryCodes.map(convertToCountrySearchCanonical)\n\t\t\t}\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'banking'> = {};\n\t\tfor (const checkBankingServiceID in bankingServices) {\n\t\t\ttry {\n\t\t\t\tconst checkBankingService = await isValidOperations(await bankingServices[checkBankingServiceID]?.('object'));\n\t\t\t\tif (!checkBankingService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCurrencyCriteria !== undefined && 'currencyCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAllCurrencyCodes(checkBankingService, canonicalCurrencyCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (canonicalCountryCriteria !== undefined && 'countryCodes' in checkBankingService) {\n\t\t\t\t\tif (!(await hasAnyCountryCodes(checkBankingService, canonicalCountryCriteria))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkBankingServiceID] = assertResolverLookupBankingResult(checkBankingService);\n\t\t\t} catch (checkBankingServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking banking service', checkBankingServiceID, ':', checkBankingServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupKYCServices(kycServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'kyc'>) {\n\t\tif (kycServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'kyc'> = {};\n\t\tfor (const checkKYCServiceID in kycServices) {\n\t\t\ttry {\n\t\t\t\tconst checkKYCService = await kycServices[checkKYCServiceID]?.('object');\n\t\t\t\tif (checkKYCService === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (!('operations' in checkKYCService)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (criteria.countryCodes !== undefined) {\n\t\t\t\t\tlet acceptable = true;\n\t\t\t\t\t/*\n\t\t\t\t\t * If the KYC service does not have a countryCodes\n\t\t\t\t\t * property, then it can validate accounts in any\n\t\t\t\t\t * country, so we skip this check.\n\t\t\t\t\t */\n\t\t\t\t\tif ('countryCodes' in checkKYCService) {\n\t\t\t\t\t\tconst countryCodes = await checkKYCService.countryCodes?.('array') ?? [];\n\t\t\t\t\t\tconst checkKYCServiceCountryCodes = await Promise.all(countryCodes.map(async function(item) {\n\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t}));\n\t\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Checking country codes:', criteria.countryCodes, 'against', checkKYCServiceCountryCodes, 'for', checkKYCServiceID);\n\n\t\t\t\t\t\tfor (const checkCountryCode of criteria.countryCodes) {\n\t\t\t\t\t\t\tconst checkCountryCodeCanonical = convertToCountrySearchCanonical(checkCountryCode);\n\t\t\t\t\t\t\tif (!checkKYCServiceCountryCodes.includes(checkCountryCodeCanonical)) {\n\t\t\t\t\t\t\t\tacceptable = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!acceptable) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tretval[checkKYCServiceID] = assertResolverLookupKYCResult(checkKYCService);\n\t\t\t} catch (checkKYCServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking KYC service', checkKYCServiceID, ':', checkKYCServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any banking services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tprivate async lookupFXServices(fxServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'fx'>): Promise<ResolverLookupServiceResults<'fx'> | undefined> {\n\t\tif (fxServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst isCurrencySearchInput = createIs<CurrencySearchInput>();\n\t\t// if currency code is provided then convert to canonical format otherwise token public key string was provided\n\t\tconst canonicalInputCurrencyCriteria = isCurrencySearchInput(criteria.inputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.inputCurrencyCode) : criteria.inputCurrencyCode;\n\t\tconst canonicalOutputCurrencyCriteria = isCurrencySearchInput(criteria.outputCurrencyCode) ? convertToCurrencySearchCanonical(criteria.outputCurrencyCode) : criteria.outputCurrencyCode;\n\t\t// if search criteria is not provided then set token to undefined\n\t\tconst inputToken = canonicalInputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalInputCurrencyCriteria) : undefined;\n\t\tconst outputToken = canonicalOutputCurrencyCriteria !== undefined ? await this.lookupToken(canonicalOutputCurrencyCriteria) : undefined;\n\t\tif (criteria.inputCurrencyCode !== undefined && inputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Input currency code', canonicalInputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tif (criteria.outputCurrencyCode !== undefined && outputToken === null) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Output currency code', canonicalOutputCurrencyCriteria, 'could not be resolved to a token');\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'fx'> = {};\n\t\tfor (const checkFXServiceID in fxServices) {\n\t\t\ttry {\n\t\t\t\tconst checkFXService = await assertResolverLookupFXResult(await fxServices[checkFXServiceID]?.('object'));\n\t\t\t\tif (!checkFXService) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst fromUnrealized: ToValuizable<NonNullable<ServiceMetadata['services']['fx']>[string]['from']> = checkFXService.from;\n\t\t\t\tconst from = await fromUnrealized?.('array');\n\t\t\t\tif (from === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet acceptable = false;\n\t\t\t\tfor (const fromEntryUnrealized of from) {\n\t\t\t\t\tconst fromEntry = await fromEntryUnrealized?.('object');\n\n\t\t\t\t\tif (inputToken) {\n\t\t\t\t\t\tconst fromCurrencyCodes = await fromEntry.currencyCodes?.('array') ?? [];\n\t\t\t\t\t\tconst fromCurrencyCodesValues = await Promise.all(fromCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If inputToken was provided, check if it matches providers supported input currencies\n\t\t\t\t\t\tif (!fromCurrencyCodesValues.includes(inputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (outputToken) {\n\t\t\t\t\t\tconst toCurrencyCodes = await fromEntry.to?.('array') ?? [];\n\t\t\t\t\t\tconst toCurrencyCodesValues = await Promise.all(toCurrencyCodes.map(async function(item) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\treturn(undefined);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t// If outputToken was provided, check if it matches providers supported output currencies\n\t\t\t\t\t\tif (!toCurrencyCodesValues.includes(outputToken.token)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t/* XXX:TODO: Check kycProviders */\n\t\t\t\t\tacceptable = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (!acceptable) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tretval[checkFXServiceID] = await assertResolverLookupFXResult(checkFXService);\n\t\t\t} catch (checkFXServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking FX service', checkFXServiceID, ':', checkFXServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync filterSupportedAssets(assetService: ValuizableObject, criteria: ServiceSearchCriteria<'assetMovement'> = {}): Promise<SupportedAssets[]> {\n\t\tif (criteria.rail !== undefined) {\n\t\t\tthrow(new Error('Asset movement service does not support rail search criteria'));\n\t\t}\n\t\tconst assetCanonical = criteria.asset ? convertAssetSearchInputToCanonical(criteria.asset) : undefined;\n\t\tconst fromCanonical = criteria.from ? convertAssetLocationInputToCanonical(criteria.from) : undefined;\n\t\tconst toCanonical = criteria.to ? convertAssetLocationInputToCanonical(criteria.to) : undefined;\n\n\t\tconst resolvedService = await Metadata.fullyResolveValuizable(assetService.supportedAssets);\n\t\tconst supportedAssets = assertKeetaSupportedAssets(resolvedService);\n\n\t\tconst filteredAssetMovement: SupportedAssets[] = [];\n\t\tfor (const supportedAsset of supportedAssets) {\n\t\t\tif (assetCanonical && supportedAsset.asset !== assetCanonical) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (fromCanonical) {\n\t\t\t\tlet fromMatch = false;\n\t\t\t\tfor (const path of supportedAsset.paths) {\n\t\t\t\t\tfor (const pair of path.pair) {\n\t\t\t\t\t\tif (pair.location === fromCanonical) {\n\t\t\t\t\t\t\tconst commonPairMatch = pair.rails.common && pair.rails.common.length > 0;\n\t\t\t\t\t\t\tconst outboundPairMatch = pair.rails.outbound && pair.rails.outbound.length > 0;\n\t\t\t\t\t\t\tif (commonPairMatch || outboundPairMatch) {\n\t\t\t\t\t\t\t\tfromMatch = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!fromMatch) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (toCanonical) {\n\t\t\t\tlet toMatch = false;\n\t\t\t\tfor (const path of supportedAsset.paths) {\n\t\t\t\t\tfor (const pair of path.pair) {\n\t\t\t\t\t\tif (pair.location === toCanonical) {\n\t\t\t\t\t\t\tconst commonPairMatch = pair.rails.common && pair.rails.common.length > 0;\n\t\t\t\t\t\t\tconst inboundPairMatch = pair.rails.inbound && pair.rails.inbound.length > 0;\n\t\t\t\t\t\t\tif (commonPairMatch || inboundPairMatch) {\n\t\t\t\t\t\t\t\ttoMatch = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!toMatch) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfilteredAssetMovement.push(supportedAsset);\n\t\t}\n\t\treturn(filteredAssetMovement);\n\t}\n\n\tprivate async lookupAssetMovementServices(assetServices: ValuizableObject | undefined, criteria: ServiceSearchCriteria<'assetMovement'>) {\n\t\tif (assetServices === undefined) {\n\t\t\treturn(undefined);\n\t\t}\n\n\t\tconst retval: ResolverLookupServiceResults<'assetMovement'> = {};\n\t\tfor (const checkAssetMovementServiceID in assetServices) {\n\t\t\tconst checkAssetMovementService = await assetServices[checkAssetMovementServiceID]?.('object');\n\n\t\t\tif (checkAssetMovementService === undefined) {\n\t\t\t\treturn(undefined);\n\t\t\t}\n\n\t\t\tif (!('operations' in checkAssetMovementService)) {\n\t\t\t\treturn(undefined);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst supportedAssets = await this.filterSupportedAssets(checkAssetMovementService, criteria);\n\t\t\t\tif (supportedAssets.length === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tretval[checkAssetMovementServiceID] = await assertResolverLookupAssetMovementResults(checkAssetMovementService);\n\t\t\t} catch (parseError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error checking AssetMovement service', checkAssetMovementServiceID, ':', parseError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(retval).length === 0) {\n\t\t\t/*\n\t\t\t * If we didn't find any asset movement services, then we return\n\t\t\t * undefined to indicate that no services were found.\n\t\t\t */\n\t\t\treturn(undefined);\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync #getRootMetadata(): Promise<ValuizableObject> {\n\t\t// Fetch metadata from all roots\n\t\tconst allRootMetadata: ValuizableObject[] = [];\n\n\t\tfor (const root of this.#roots) {\n\t\t\tconst rootURL = new URL(`keetanet://${root.publicKeyString.get()}/metadata`);\n\t\t\tconst metadata = new Metadata(rootURL, {\n\t\t\t\ttrustedCAs: this.#trustedCAs,\n\t\t\t\tclient: this.#client,\n\t\t\t\tlogger: this.#logger,\n\t\t\t\tresolver: this,\n\t\t\t\tcache: this.#metadataCache\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst rootMetadata = await metadata.value('object');\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Root Metadata for', root.publicKeyString.get(), ':', rootMetadata);\n\n\t\t\t\tif (!('version' in rootMetadata)) {\n\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Root metadata for', root.publicKeyString.get(), 'is missing \"version\" property, skipping');\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst rootMetadataVersion = await rootMetadata.version?.('primitive');\n\t\t\t\tif (rootMetadataVersion !== 1) {\n\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Unsupported metadata version', rootMetadataVersion, 'for', root.publicKeyString.get(), ', skipping');\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tallRootMetadata.push(rootMetadata);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error fetching metadata for', root.publicKeyString.get(), ':', error, ' -- skipping');\n\t\t\t}\n\t\t}\n\n\t\tif (allRootMetadata.length === 0) {\n\t\t\tthrow(new Error('No valid root metadata found'));\n\t\t}\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Total valid root metadata count:', allRootMetadata.length);\n\n\t\t// If there's only one root, return it directly\n\t\tif (allRootMetadata.length === 1) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\treturn(allRootMetadata[0]!);\n\t\t}\n\n\t\t// Merge metadata from multiple roots (highest priority first)\n\t\treturn(await this.#mergeRootMetadata(allRootMetadata));\n\t}\n\n\t/**\n\t * Merge metadata from multiple roots with priority ordering.\n\t * The first entry in the array has the highest priority.\n\t *\n\t * This method creates lazy Valuizable wrappers that defer the actual\n\t * merging work until the values are accessed.\n\t */\n\tasync #mergeRootMetadata(metadataArray: ValuizableObject[]): Promise<ValuizableObject> {\n\t\t// Start with the first (highest priority) metadata as the base\n\t\tconst mergedMetadata: ValuizableObject = { ...metadataArray[0] };\n\n\t\t// Create lazy Valuizable wrapper for currencyMap that merges on demand\n\t\t// @ts-ignore - Complex ValuizableMethod type compatibility\n\t\tconst mergedCurrencyMapValuizable: ValuizableMethod = async (expect: ValuizableKind = 'any') => {\n\t\t\tif (expect !== 'object' && expect !== 'any') {\n\t\t\t\tthrow(new Error(`Expected object type for merged currency map, got ${expect}`));\n\t\t\t}\n\n\t\t\t// Merge currencyMap: higher priority currencies override lower priority ones\n\t\t\tconst mergedCurrencyMap: ValuizableObject = {};\n\t\t\t// Iterate in reverse order so higher priority ones overwrite\n\t\t\tfor (let i = metadataArray.length - 1; i >= 0; i--) {\n\t\t\t\tconst metadata = metadataArray[i];\n\t\t\t\tif (metadata === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ('currencyMap' in metadata && metadata.currencyMap !== undefined) {\n\t\t\t\t\tconst currencyMap = await metadata.currencyMap('object');\n\t\t\t\t\tfor (const [currencyCode, tokenValue] of Object.entries(currencyMap)) {\n\t\t\t\t\t\tmergedCurrencyMap[currencyCode] = tokenValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(mergedCurrencyMap);\n\t\t};\n\t\tObject.defineProperty(mergedCurrencyMapValuizable, 'instanceTypeID', {\n\t\t\tvalue: ANONYMOUS_VALUIZABLE_INSTANCE_TYPE_ID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\t// Create lazy Valuizable wrapper for services that merges on demand\n\t\t// @ts-ignore - Complex ValuizableMethod type compatibility\n\t\tconst mergedServicesValuizable: ValuizableMethod = async (expect: ValuizableKind = 'any') => {\n\t\t\tif (expect !== 'object' && expect !== 'any') {\n\t\t\t\tthrow(new Error(`Expected object type for merged services, got ${expect}`));\n\t\t\t}\n\n\t\t\t// Merge services: higher priority service entries override lower priority ones\n\t\t\tconst mergedServices: ValuizableObject = {};\n\t\t\t// Iterate in reverse order so higher priority ones overwrite\n\t\t\tfor (let i = metadataArray.length - 1; i >= 0; i--) {\n\t\t\t\tconst metadata = metadataArray[i];\n\t\t\t\tif (metadata === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ('services' in metadata && metadata.services !== undefined) {\n\t\t\t\t\tconst services = await metadata.services('object');\n\t\t\t\t\tfor (const [serviceType, serviceValue] of Object.entries(services)) {\n\t\t\t\t\t\tif (serviceValue === undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get the service type object\n\t\t\t\t\t\tconst serviceTypeObj = await serviceValue('object');\n\n\t\t\t\t\t\t// If this service type doesn't exist in merged yet, create it\n\t\t\t\t\t\tif (!(serviceType in mergedServices)) {\n\t\t\t\t\t\t\tmergedServices[serviceType] = serviceValue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Merge individual service IDs within this service type\n\t\t\t\t\t\t\tconst existingServiceType = await mergedServices[serviceType]?.('object');\n\t\t\t\t\t\t\tif (existingServiceType === undefined) {\n\t\t\t\t\t\t\t\tmergedServices[serviceType] = serviceValue;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst mergedServiceType: ValuizableObject = { ...existingServiceType };\n\t\t\t\t\t\t\tfor (const [serviceId, serviceConfig] of Object.entries(serviceTypeObj)) {\n\t\t\t\t\t\t\t\t// Overwrite with current entry. Since we iterate in reverse order\n\t\t\t\t\t\t\t\t// (low priority to high priority), higher priority entries (lower index)\n\t\t\t\t\t\t\t\t// will be written last and thus take precedence.\n\t\t\t\t\t\t\t\tmergedServiceType[serviceId] = serviceConfig;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Create a new Valuizable for the merged service type\n\t\t\t\t\t\t\t// @ts-ignore - Complex ValuizableMethod type compatibility\n\t\t\t\t\t\t\tconst mergedServiceTypeValuizable: ValuizableMethod = async (expect: ValuizableKind = 'any') => {\n\t\t\t\t\t\t\t\tif (expect === 'object' || expect === 'any') {\n\t\t\t\t\t\t\t\t\treturn(mergedServiceType);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthrow(new Error(`Expected object type for merged service type, got ${expect}`));\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tObject.defineProperty(mergedServiceTypeValuizable, 'instanceTypeID', {\n\t\t\t\t\t\t\t\tvalue: ANONYMOUS_VALUIZABLE_INSTANCE_TYPE_ID,\n\t\t\t\t\t\t\t\tenumerable: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tmergedServices[serviceType] = mergedServiceTypeValuizable;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn(mergedServices);\n\t\t};\n\t\tObject.defineProperty(mergedServicesValuizable, 'instanceTypeID', {\n\t\t\tvalue: ANONYMOUS_VALUIZABLE_INSTANCE_TYPE_ID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tmergedMetadata.currencyMap = mergedCurrencyMapValuizable;\n\t\tmergedMetadata.services = mergedServicesValuizable;\n\n\t\treturn(mergedMetadata);\n\t}\n\n\tasync getRootMetadata(): Promise<ToValuizableObject<Pick<ServiceMetadata, 'version'> & DeepPartial<Omit<ServiceMetadata, 'version'>>>> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * #getRootMetadata validates that the version type exists\n\t\t * and the return type for this function is complicated\n\t\t * but everything is a partial or a function (which is\n\t\t * correct because we processed it through the Metadata\n\t\t * class).\n\t\t *\n\t\t * To avoid repeating the complicated type, we just\n\t\t * cast as `any` here since it does not affect runtime\n\t\t * behavior or the types (because the type is already\n\t\t * asserted in the function signature).\n\t\t */\n\t\t// eslint-disable-next-line @typescript-eslint/consistent-type-assertions,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-explicit-any\n\t\treturn(rootMetadata as any);\n\t}\n\n\tasync listTransferableAssets(): Promise<KeetaNetAccountTokenPublicKeyString[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\t\tconst servicesFn = rootMetadata.services;\n\t\tif (servicesFn === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst services = await servicesFn('object');\n\t\tif (!('assetMovement' in services) || services.assetMovement === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"assetMovement\" property'));\n\t\t}\n\t\tconst assetMovementServices = await services.assetMovement('object');\n\t\tconst allAssets = new Set<KeetaNetAccountTokenPublicKeyString>();\n\t\tawait Promise.all(Object.values(assetMovementServices).map(async function(service) {\n\t\t\tif (service === undefined) {\n\t\t\t\tthrow(new Error('assetMovement has undefined service entry'));\n\t\t\t}\n\t\t\tconst serviceEntry = await service('object');\n\t\t\tif (!('supportedAssets' in serviceEntry) || serviceEntry.supportedAssets === undefined) {\n\t\t\t\tthrow(new Error('service entry is missing \"supportedAssets\"'));\n\t\t\t}\n\n\t\t\tconst supportedAssets = await serviceEntry.supportedAssets('array');\n\t\t\tawait Promise.all(supportedAssets.map(async function(supportedAsset) {\n\t\t\t\tif (supportedAsset === undefined) {\n\t\t\t\t\tthrow(new Error('supportedAsset entry is undefined'));\n\t\t\t\t}\n\t\t\t\tconst assetEntry = await supportedAsset('object');\n\t\t\t\tif (!('asset' in assetEntry) || assetEntry.asset === undefined) {\n\t\t\t\t\tthrow(new Error('asset is missing from supportedAsset entry'));\n\t\t\t\t}\n\t\t\t\tconst asset = await assetEntry.asset('string');\n\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(asset);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\t\t\t\tallAssets.add(checkTokenObject.publicKeyString.get());\n\t\t\t}));\n\t\t}));\n\n\t\treturn([...allAssets]);\n\t}\n\n\tasync listTokens(): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tconst retval: { token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; }[] = [];\n\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\tretval.push({\n\t\t\t\t\ttoken: checkTokenObject.publicKeyString.get(),\n\t\t\t\t\tcurrency: checkCurrencyCode\n\t\t\t\t});\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', checkCurrencyCode, 'is invalid:', validationError);\n\t\t\t}\n\t\t}\n\n\t\treturn(retval);\n\t}\n\n\tasync listSupportedKYCCountries(): Promise<CurrencyInfo.Country[]> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedServicesProperty = rootMetadata.services;\n\t\tif (definedServicesProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst definedServices = await definedServicesProperty('object');\n\n\t\tconst kycServicesProperty = definedServices.kyc;\n\t\tif (kycServicesProperty === undefined) {\n\t\t\treturn([]);\n\t\t}\n\n\t\tconst kycServices = await kycServicesProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Listing supported KYC countries from', Object.keys(kycServices));\n\n\t\tconst allCountryCodes = new Set<CurrencyInfo.ISOCountryCode>();\n\t\tfor (const kycServiceID in kycServices) {\n\t\t\ttry {\n\t\t\t\tconst kycService = await kycServices[kycServiceID]?.('object');\n\t\t\t\tif (kycService === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * If the KYC service does not have a countryCodes\n\t\t\t\t * property, then it can validate accounts in any\n\t\t\t\t * country, so we add all countries and stop processing\n\t\t\t\t * other services since we already have all possible countries.\n\t\t\t\t */\n\t\t\t\tif (!('countryCodes' in kycService)) {\n\t\t\t\t\tfor (const countryCode of CurrencyInfo.Country.allCountryCodes) {\n\t\t\t\t\t\tallCountryCodes.add(countryCode);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tconst countryCodes = await kycService.countryCodes?.('array') ?? [];\n\t\t\t\tconst countryCodesValues = await Promise.all(countryCodes.map(async function(item) {\n\t\t\t\t\treturn(await item?.('string'));\n\t\t\t\t}));\n\n\t\t\t\tfor (const countryCode of countryCodesValues) {\n\t\t\t\t\tif (countryCode === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Validate that it's a valid country code\n\t\t\t\t\t\tconst validatedCountryCode = CurrencyInfo.Country.assertCountryCode(countryCode);\n\t\t\t\t\t\tallCountryCodes.add(validatedCountryCode);\n\t\t\t\t\t} catch (validationError) {\n\t\t\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Invalid country code', countryCode, 'in service', kycServiceID, ':', validationError);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (kycServiceError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Error processing KYC service', kycServiceID, ':', kycServiceError, ' -- ignoring');\n\t\t\t}\n\t\t}\n\n\t\tconst retval = Array.from(allCountryCodes).map(function(countryCode) {\n\t\t\treturn(new CurrencyInfo.Country(countryCode));\n\t\t});\n\n\t\treturn(retval);\n\t}\n\n\tasync lookupToken(currencyCode: CurrencySearchInput | KeetaNetAccountTokenPublicKeyString): Promise<{ token: KeetaNetAccountTokenPublicKeyString; currency: CurrencySearchCanonical; } | null> {\n\t\tlet tokenPublicKey: KeetaNetAccountTokenPublicKeyString | undefined;\n\t\tif (typeof currencyCode === 'string') {\n\t\t\ttry {\n\t\t\t\tconst token = KeetaNetAccount.fromPublicKeyString(currencyCode);\n\t\t\t\tif (token.isToken()) {\n\t\t\t\t\ttokenPublicKey = token.publicKeyString.get();\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t/* Ignored */\n\t\t\t}\n\t\t}\n\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedCurrenciesMapProperty = rootMetadata.currencyMap;\n\t\tif (definedCurrenciesMapProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"currencyMap\" property'));\n\t\t}\n\t\tconst definedCurrenciesMap = await definedCurrenciesMapProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Defined Currencies Map:', definedCurrenciesMap);\n\n\t\tlet currencyCodeFound: CurrencySearchCanonical | undefined;\n\t\tif (tokenPublicKey === undefined) {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing forward lookup for currency code', currencyCode);\n\n\t\t\t/*\n\t\t\t * Perform a forward lookup from the currency code\n\t\t\t * to the token public key\n\t\t\t */\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\t\tconst currencyCodeCanonical = convertToCurrencySearchCanonical(currencyCode as unknown as any);\n\t\t\tif (currencyCodeCanonical === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tconst checkToken = await definedCurrenciesMap[currencyCodeCanonical]?.('string');\n\t\t\tif (checkToken === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Validating token public key for currency code', currencyCodeCanonical, ':', checkToken, typeof checkToken);\n\t\t\ttry {\n\t\t\t\tconst checkTokenObject = KeetaNetAccount.fromPublicKeyString(checkToken);\n\t\t\t\tif (!checkTokenObject.isToken()) {\n\t\t\t\t\tthrow(new Error('Not a token account'));\n\t\t\t\t}\n\n\t\t\t\ttokenPublicKey = checkTokenObject.publicKeyString.get();\n\t\t\t\tcurrencyCodeFound = currencyCodeCanonical;\n\t\t\t} catch (validationError) {\n\t\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Token public key for currency code', currencyCodeCanonical, 'is invalid:', validationError);\n\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Performing reverse lookup for token public key', tokenPublicKey);\n\n\t\t\t/*\n\t\t\t * Perform a reverse lookup from the token public key\n\t\t\t * to the currency code\n\t\t\t */\n\t\t\tfor (const [checkCurrencyCode, checkTokenProperty] of Object.entries(definedCurrenciesMap)) {\n\t\t\t\tconst checkToken = await checkTokenProperty?.('string');\n\t\t\t\tif (checkToken === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (checkToken === tokenPublicKey) {\n\t\t\t\t\tif (isCurrencySearchCanonical(checkCurrencyCode)) {\n\t\t\t\t\t\tcurrencyCodeFound = checkCurrencyCode;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currencyCodeFound === undefined) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t}\n\n\t\treturn({\n\t\t\ttoken: tokenPublicKey,\n\t\t\tcurrency: currencyCodeFound\n\t\t});\n\t}\n\n\tasync lookup<T extends keyof ServicesMetadataLookupMap>(service: T, criteria: ServicesMetadataLookupMap[T]['criteria']): Promise<ServicesMetadataLookupMap[T]['results'] | undefined> {\n\t\tconst rootMetadata = await this.#getRootMetadata();\n\n\t\t/*\n\t\t * Get the services object\n\t\t */\n\t\tconst definedServicesProperty = rootMetadata.services;\n\t\tif (definedServicesProperty === undefined) {\n\t\t\tthrow(new Error('Root metadata is missing \"services\" property'));\n\t\t}\n\t\tconst definedServices = await definedServicesProperty('object');\n\n\t\tthis.#logger?.debug(`Resolver:${this.id}`, 'Looking up', service, 'with criteria:', criteria, 'in', definedServices);\n\n\t\tconst serviceLookup = this.lookupMap[service].search;\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any\n\t\treturn(await serviceLookup(await definedServices[service]?.('object'), criteria as any));\n\t}\n\n\tclearCache(): void {\n\t\tthis.#metadataCache.instance.clear();\n\t\tthis.#stats.cache.hit = 0;\n\t\tthis.#stats.cache.miss = 0;\n\t\tthis.#stats.https.reads = 0;\n\t\tthis.#stats.keetanet.reads = 0;\n\t\tthis.#stats.unsupported.reads = 0;\n\t\tthis.#stats.reads = 0;\n\t}\n}\n\nexport default Resolver;\nexport type {\n\tServiceMetadata,\n\tServiceMetadataExternalizable,\n\tServiceSearchCriteria,\n\tServices\n};\n"]}
@@ -0,0 +1,4 @@
1
+ export type DeepPartial<T> = T extends (...args: any[]) => any ? T : T extends (infer U)[] ? DeepPartial<U>[] : T extends object ? {
2
+ [P in keyof T]?: DeepPartial<T[P]>;
3
+ } : T;
4
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,CAAC,CAAC,IAExB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,CAAC,GACpC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GACvC,CAAC,SAAS,MAAM,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACxD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map