@kamino-finance/klend-sdk 3.2.9 → 3.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README_KAMINO_MANAGER.md +60 -3
- package/dist/classes/manager.d.ts +15 -1
- package/dist/classes/manager.js +292 -0
- package/dist/classes/manager.js.map +1 -1
- package/dist/classes/obligation.d.ts +35 -0
- package/dist/classes/obligation.js +67 -35
- package/dist/classes/obligation.js.map +1 -1
- package/dist/classes/reserve.d.ts +7 -1
- package/dist/classes/reserve.js +74 -1
- package/dist/classes/reserve.js.map +1 -1
- package/dist/classes/shared.d.ts +12 -1
- package/dist/classes/shared.js.map +1 -1
- package/dist/classes/utils.d.ts +1 -0
- package/dist/classes/utils.js +8 -0
- package/dist/classes/utils.js.map +1 -1
- package/dist/client_kamino_manager.js +100 -0
- package/dist/client_kamino_manager.js.map +1 -1
- package/dist/utils/api.d.ts +7 -0
- package/dist/utils/api.js +8 -1
- package/dist/utils/api.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAm0BA,4CA4CC;AAED,sDAuBC;AAED,kEA0BC;AAED,sFAwvBC;AAED,0EAiGC;AAED,4DAQC;AA3wDD,yCAAyC;AACzC,6CAOyB;AACzB,4DAAiC;AACjC,oCAWkB;AAClB,qCAA0D;AAC1D,sDAAiE;AACjE,gDAA0G;AAC1G,mCAA+E;AAC/E,yCAAsC;AACtC,kDAAuB;AAGvB,gCAMgB;AAChB,0DAA4C;AAC5C,iDAAqD;AACrD,4EAA8E;AAEjE,QAAA,+BAA+B,GAAG,GAAG,CAAC;AAEnD,MAAa,aAAa;IAYxB,YACE,KAAc,EACd,OAAkB,EAClB,gBAAiC,EACjC,UAAsB,EACtB,oBAA4B;QAqF9B;;;WAGG;QACH,oBAAe,GAAG,GAAY,EAAE;YAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,KAAK,eAAO,EAAE,CAAC;gBACjE,OAAO,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC;QACzE,CAAC,CAAC;QAEF;;;WAGG;QACH,iBAAY,GAAG,GAAY,EAAE;YAC3B,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,EAAE,CAAC;QACtE,CAAC,CAAC;QAEF;;;WAGG;QACH,6BAAwB,GAAG,GAAY,EAAE;YACvC,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;QAC7E,CAAC,CAAC;QA0EF;;;WAGG;QACH,kBAAa,GAAG,GAAY,EAAE;YAC5B,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAClH,CAAC,CAAC;QAEF;;;WAGG;QACH,iBAAY,GAAG,GAAY,EAAE;YAC3B,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAC7F,CAAC,CAAC;QApMA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,EAAqB,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAA,wBAAgB,EAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IACnD,CAAC;IAED,MAAM,CAAC,UAAU,CACf,WAAgC,EAChC,OAAkB,EAClB,KAAc,EACd,gBAAiC,EACjC,UAAsB,EACtB,oBAA4B;QAE5B,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;QACtG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW;IAEX;;OAEG;IACH,cAAc;QACZ,OAAO,IAAA,wBAAgB,EAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,EAAE,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,2BAA2B;QACzB,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;;OAGG;IACH,qBAAqB;QACnB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,0BAA0B;QACxB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,SAAS,EAAE,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,0BAA0B;QACxB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,SAAS,EAAE,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,sBAAsB;QACpB,OAAO,IAAI,mBAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,SAAS,EAAE,CAAC;IAC9E,CAAC;IA6BD;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,2BAA2B,EAAE;aACtC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;aAC7B,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;aACtC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;aACtC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,IAAY,EAAE,cAAsB;QAC1D,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC7E,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,uBAAuB;QACrB,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC;QACnF,MAAM,KAAK,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,eAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACxG,OAAO,IAAI,mBAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,gCAAgC,CAAC,WAAmB,EAAE,cAAsB;QAC1E,MAAM,iBAAiB,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QAC5F,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAEtF,MAAM,gBAAgB,GAAG,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;QAE7F,MAAM,4BAA4B,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAEpE,OAAO,4BAA4B,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,yBAAyB;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;QAC9D,IAAI,eAAe,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACrD,OAAO,+BAAuB,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,oBAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,kCAAkC,CAAC,IAAY,EAAE,cAAsB;QACrE,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;QAC9D,IAAI,eAAe,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACrD,OAAO,+BAAuB,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,oBAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAkBD;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,oBAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED;;;OAGG;IACH,+BAA+B;QAC7B,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvF,CAAC;IAED;;;OAGG;IACH,8BAA8B,CAAC,IAAY;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,YAAY,GAAG,qBAAa,EAAE,CAAC;YACjC,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,4BAA4B;QAC1B,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpF,CAAC;IAED;;;OAGG;IACH,mCAAmC;QACjC,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpF,CAAC;IAED;;;OAGG;IACH,sCAAsC;QACpC,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,+CAA+C,CAAC,mBAA2B;QACzE,OAAO,IAAI,oBAAO,CAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CACnG,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,kDAAkD,CAAC,mBAA2B;QAC5E,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,kDAAkD,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpH,CAAC;IAED;;;OAGG;IACH,2BAA2B,CAAC,IAAY;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,YAAY,GAAG,qBAAa,EAAE,CAAC;YACjC,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,eAAe;QACb,OAAO,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,cAAsB;QACrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAE5D,MAAM,UAAU,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3E,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAC5E,OAAO,kBAAkB,GAAG,UAAU,GAAG,mBAAmB,CAAC;IAC/D,CAAC;IAED,yBAAyB,CAAC,IAAY,EAAE,cAAsB;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,WAAoB,CAAC;QACzB,IAAI,WAAoB,CAAC;QACzB,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YACjH,MAAM,cAAc,GAAG,IAAI,CAAC,2BAA2B,EAAE;iBACtD,GAAG,CAAC,OAAO,CAAC;iBACZ,GAAG,CAAC,kBAAkB,CAAC;iBACvB,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC;iBACtC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAC5B,WAAW,GAAG,OAAO,CAAC;YACtB,WAAW,GAAG,cAAc,CAAC;QAC/B,CAAC;QACD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IACtC,CAAC;IAED,mCAAmC,CACjC,IAAY,EACZ,cAAsB;QAEtB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,uBAAgC,CAAC;QACrC,IAAI,6BAAsC,CAAC;QAC3C,IAAI,sBAA+B,CAAC;QACpC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,uBAAuB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC5D,6BAA6B,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;YAC/C,sBAAsB,GAAG,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,gBAAgB,CACrF,YAAY,EACZ,cAAc,CACf,CAAC;YACF,uBAAuB,GAAG,kBAAkB,CAAC;YAC7C,6BAA6B,GAAG,mBAAmB,CAAC;YACpD,sBAAsB,GAAG,YAAY,CAAC;QACxC,CAAC;QACD,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,sBAAsB,EAAE,CAAC;IAC5F,CAAC;IAED,yBAAyB;QACvB,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IAED,4BAA4B,CAAC,IAAY,EAAE,cAAsB;QAC/D,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,WAAW,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAC/G,IAAI,EACJ,cAAc,CACf,CAAC;QACF,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,sBAAsB,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3E,CAAC;IAED,6BAA6B,CAC3B,MAAe,EACf,MAAkB,EAClB,IAAY,EACZ,cAAsB,EACtB,aAAuB;QAEvB,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAC7G,IAAI,EACJ,cAAc,CACf,CAAC;QAEF,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpE,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3D,OAAO,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpE,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3D,OAAO,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpE,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,aAAc,CAAC,CAAC;gBACnE,OAAO,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/D,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,aAAc,CAAC,CAAC;gBAC/D,IAAI,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,OAAO,gBAAgB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC/D,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpE,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,cAAc,GAAG,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACvD,OAAO,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpE,CAAC;YACD;gBACE,MAAM,KAAK,CAAC,uBAAuB,MAAM,gCAAgC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,iCAAiC,CAAC,MAAoB,EAAE,WAA0B,EAAE,IAAY;QAC9F,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;QAC5C,MAAM,qBAAqB,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAClD,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CACvG,CAAC;QAEF,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,kCAAkC,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;gBACrF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;gBAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;gBAC5D,OAAO,SAAU,CAAC,MAAM,GAAG,SAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,CAAC,CAAC,CAAC;YAEH,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,kCAAkC,CAAE,CAAC,EAAE,CAAC;QAC3F,CAAC;QAED,MAAM,uBAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,KAAK,CAAC,CAAC;QAE3G,MAAM,sBAAsB,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAClE,MAAM,wBAAwB,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAE7F,IAAI,eAAe,GAAG,oBAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;QAEpF,MAAM,iBAAiB,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1G,eAAe,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC,CAAC,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC;YACjD,CAAC,CAAC,eAAe,CAAC;QAEpB,IAAI,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAE7C,qBAAqB;QACrB,kBAAkB,GAAG,kBAAkB,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAE1D,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEjD,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,GAAG,GAAG,CAAC;QAC1F,MAAM,uBAAuB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAEjE,IAAI,qBAAqB,GAAG,CAAC,IAAI,uBAAuB,GAAG,qBAAqB,EAAE,CAAC;YACjF,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,qBAAqB,GAAG,CAAC,IAAI,uBAAuB,GAAG,qBAAqB,EAAE,CAAC;YACxF,MAAM,2BAA2B,GAAG,IAAI,oBAAO,CAAC,qBAAqB,GAAG,uBAAuB,CAAC,CAAC,GAAG,CAClG,IAAI,CAAC,cAAc,EAAE,CACtB,CAAC;YACF,eAAe,GAAG,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,oCAAoC,GAAG,IAAI,oBAAO,CAAC,eAAO,CAAC,CAAC;QAEhE,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,oCAAoC,GAAG,IAAI,CAAC,mCAAmC,EAAE,CAAC,GAAG,CACnF,IAAI,CAAC,sCAAsC,EAAE,CAC9C,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,8BAA8B,GAAG,IAAI,oBAAO,CAAC,eAAO,CAAC,CAAC;YAC1D,MAAM,+BAA+B,GAAG,WAAW;iBAChD,+CAA+C,CAAC,UAAU,GAAG,CAAC,CAAC;iBAC/D,GAAG,CAAC,WAAW,CAAC,kDAAkD,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;YAEvF,8BAA8B,GAAG,oBAAO,CAAC,GAAG,CAC1C,IAAI,oBAAO,CAAC,CAAC,CAAC,EACd,oBAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,8BAA8B,CAAC,CAC7E,CAAC;YACF,oCAAoC,GAAG,8BAA8B,CAAC;QACxE,CAAC;QAED,eAAe,GAAG,oBAAO,CAAC,GAAG,CAAC,eAAe,EAAE,oCAAoC,CAAC,CAAC;QAErF,OAAO,oBAAO,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACtD,CAAC;IAED,sBAAsB,CACpB,MAAe,EACf,MAAkB,EAClB,IAAY,EACZ,cAAsB,EACtB,aAAuB;QAEvB,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD,MAAM,cAAc,GAAG,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAC/G,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5E,OAAO,IAAA,qBAAa,EAAC,cAAc,EAAE,KAAK,CAAC,GAAG,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,QAAQ,EAAE,CAAC;IAClH,CAAC;IAED,sBAAsB,CACpB,MAAe,EACf,MAAkB,EAClB,IAAY,EACZ,cAAsB,EACtB,aAAuB;QAEvB,MAAM,cAAc,GAAG,IAAI,CAAC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAC/G,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;QAC5G,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAE5E,OAAO,cAAc,GAAG,kBAAkB,GAAG,mBAAmB,CAAC;IACnE,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,GAAG,wBAAgB,GAAG,IAAI,CAAC,oBAAoB,CAAC;IAC7D,CAAC;IAED,mBAAmB;QACjB,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAE5E,OAAO,IAAA,qBAAa,EAAC,kBAAkB,EAAE,KAAK,CAAC,GAAG,oBAAoB,CAAC;IACzE,CAAC;IAED,4BAA4B,CAAC,IAAY,EAAE,cAAsB;QAC/D,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACzD,MAAM,2BAA2B,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5E,OAAO,IAAA,qBAAa,EAAC,2BAA2B,EAAE,KAAK,CAAC,GAAG,oBAAoB,CAAC;IAClF,CAAC;IAED,kBAAkB,CAAC,IAAY,EAAE,cAAsB;QACrD,MAAM,UAAU,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3E,OAAO,UAAU,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,QAAQ,EAAE,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,wBAAwB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;IAC1C,CAAC;IAED,SAAS,CAAC,MAAkC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEK,IAAI,CAAC,gBAAiC;;YAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;YAClF,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,KAAK,CAAC,qCAAqC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,kBAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,KAAK,CAAC,mCAAmC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;YACxB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;YACzC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;KAAA;IAED,cAAc,CAAC,WAAmB;QAChC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAA,2BAAmB,EAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAA,2BAAmB,EAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAEO,iBAAiB,CAAC,UAAyB;QACjD,MAAM,eAAe,GAAG,IAAI,oBAAO,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAChH,IAAI,aAAa,GAAG,sBAAa,CAAC,MAAM,CAAC;QACzC,QAAQ,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC;gBACJ,aAAa,GAAG,sBAAa,CAAC,MAAM,CAAC;gBACrC,MAAM;YACR,KAAK,CAAC;gBACJ,aAAa,GAAG,sBAAa,CAAC,QAAQ,CAAC;gBACvC,MAAM;YACR,KAAK,CAAC;gBACJ,aAAa,GAAG,sBAAa,CAAC,MAAM,CAAC;gBACrC,MAAM;QACV,CAAC;QACD,OAAO;YACL,iBAAiB;YAEjB,MAAM,EAAE,aAAa;YACrB,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,UAAU;YAC5C,WAAW,EAAE,mBAAmB,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;YAC1E,cAAc,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,GAAG,GAAG;YACtD,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK;YACrE,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,sBAAsB,GAAG,KAAK;YACrE,oBAAoB,EAAE,UAAU,CAAC,MAAM,CAAC,uBAAuB,GAAG,GAAG;YACrE,gBAAgB,EAAE,UAAU,CAAC,MAAM,CAAC,mBAAmB,GAAG,GAAG;YAC7D,mBAAmB,EAAE,IAAI,oBAAO,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC3E,kBAAkB,EAAE,IAAI,oBAAO,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAEzE,eAAe;YACf,MAAM,EAAE,IAAA,wBAAgB,EAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1D,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE;YACtD,uBAAuB,EAAE,IAAI,CAAC,0BAA0B,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACpF,eAAe;YACf,uBAAuB,EAAE,UAAU,CAAC,SAAS,CAAC,uBAAuB,CAAC,QAAQ,EAAE;YAChF,sBAAsB,EAAE,UAAU,CAAC,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE;YAC9E,YAAY,EAAE,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE;SAC3D,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACK,gBAAgB,CACtB,YAAoB,EACpB,cAAsB;QAWtB,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,gBAAgB,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrF,MAAM,YAAY,GAAG,IAAI,oBAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;QAC7D,MAAM,qBAAqB,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAE9D,MAAM,sBAAsB,GAAG,IAAI,CAAC,6BAA6B,CAC/D,IAAI,oBAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAC1D,YAAY,CACb,CAAC;QACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,6BAA6B,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;QAEpG,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE7E,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE/D,MAAM,mBAAmB,GAAG,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/D,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAE5D,MAAM,kBAAkB,GAAG,mBAAmB;aAC3C,GAAG,CAAC,YAAY,CAAC;aACjB,GAAG,CAAC,eAAe,CAAC;aACpB,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC;QAE1C,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAE/E,OAAO;YACL,OAAO;YACP,UAAU;YACV,mBAAmB;YACnB,YAAY;YACZ,mBAAmB;YACnB,eAAe;YACf,kBAAkB;YAClB,mBAAmB;SACpB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,6BAA6B,CAAC,IAAa,EAAE,YAAoB;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAc,CAAC,CAAC;QACtC,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,CAAC;gBACJ,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC;YACxB,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,KAAK,CAAC;gBACJ,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,KAAK,CAAC;gBACJ,gDAAgD;gBAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC;QACzB,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEzE,OAAO,IAAI,oBAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACF;AA1wBD,sCA0wBC;AAED,MAAM,mBAAmB,GAAG,CAAC,MAA0B,EAAsB,EAAE;IAC7E,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,IAAI,MAAM,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,CAAC,kBAAkB,GAAG,8BAAsB,EAAE,aAAa,GAAG,8BAAsB,CAAC,CAAC,CAAC;QAElG,IAAI,kBAAkB,KAAK,8BAAsB,EAAE,CAAC;YAClD,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,SAAsB,gBAAgB,CACpC,UAAsB,EACtB,KAAgB,EAChB,aAAwB,EACxB,aAAwB,EACxB,cAAyB,EACzB,SAAoB;;QAEpB,MAAM,IAAI,GAAG,kBAAO,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QAErC,MAAM,eAAe,GAAG,uBAAa,CAAC,aAAa,CAAC;YAClD,UAAU,EAAE,KAAK;YACjB,gBAAgB,EAAE,cAAc;YAChC,QAAQ,EAAE,MAAM,UAAU,CAAC,iCAAiC,CAAC,IAAI,CAAC;YAClE,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,MAAM,EAAE,oBAAoB,EAAE,cAAc,EAAE,qBAAqB,EAAE,QAAQ,EAAE,GAAG,IAAA,mBAAW,EAC3F,SAAS,EACT,aAAa,EACb,aAAa,CACd,CAAC;QACF,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,GAAG,IAAA,4BAAoB,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAEnF,MAAM,QAAQ,GAAwB;YACpC,kBAAkB,EAAE,KAAK;YACzB,aAAa,EAAE,aAAa;YAC5B,sBAAsB,EAAE,sBAAsB;YAC9C,OAAO,EAAE,cAAc;YACvB,oBAAoB,EAAE,aAAa;YACnC,sBAAsB,EAAE,oBAAoB;YAC5C,WAAW,EAAE,QAAQ;YACrB,qBAAqB,EAAE,cAAc;YACrC,uBAAuB,EAAE,qBAAqB;YAC9C,qBAAqB,EAAE,4BAAgB;YACvC,sBAAsB,EAAE,4BAAgB;YACxC,aAAa,EAAE,uBAAa,CAAC,SAAS;YACtC,IAAI,EAAE,4BAAkB;SACzB,CAAC;QAEF,MAAM,aAAa,GAAG,IAAA,iBAAW,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAEvD,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAC1C,CAAC;CAAA;AAED,SAAgB,qBAAqB,CACnC,iBAAoC,EACpC,cAAyB,EACzB,iBAAyB,EACzB,KAAiB,EACjB,SAAoB;IAEpB,KAAK,CAAC;IACN,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC;QACtC,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,KAAK;KACtB,CAAC;IAEF,MAAM,QAAQ,GAAgC;QAC5C,kBAAkB,EAAE,iBAAiB,CAAC,KAAK,CAAC,kBAAkB;QAC9D,aAAa,EAAE,iBAAiB,CAAC,OAAO;QACxC,OAAO,EAAE,cAAc;KACxB,CAAC;IAEF,MAAM,EAAE,GAAG,IAAA,yBAAmB,EAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE1D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,2BAA2B,CACzC,iBAAoC,EACpC,cAAyB,EACzB,aAA4B,EAC5B,SAAoB;IAEpB,MAAM,MAAM,GAAG,qBAAa,CAAC,MAAM,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,KAAK,EAAE,KAAK;QACZ,cAAc,EAAE,IAAI;KACrB,CAAC;IAEF,MAAM,QAAQ,GAAgC;QAC5C,kBAAkB,EAAE,iBAAiB,CAAC,KAAK,CAAC,kBAAkB;QAC9D,aAAa,EAAE,iBAAiB,CAAC,OAAO;QACxC,OAAO,EAAE,cAAc;KACxB,CAAC;IAEF,MAAM,EAAE,GAAG,IAAA,yBAAmB,EAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE1D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,qCAAqC,CACnD,iBAAoC,EACpC,OAA4B,EAC5B,cAAyB,EACzB,aAA4B,EAC5B,SAAoB;IAEpB,MAAM,qBAAqB,GAA0C,EAAE,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9C,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wCAAqB,CAAC,aAAa;oBACzC,KAAK,EAAE,+BAA+B,CAAC,wCAAqB,CAAC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC;iBAC3G,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrE,IACE,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB;wBACzD,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB;wBAC5D,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa;4BACpD,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,EACvD,CAAC;wBACD,qBAAqB,CAAC,IAAI,CAAC;4BACzB,IAAI,EAAE,wCAAqB,CAAC,aAAa;4BACzC,KAAK,EAAE,+BAA+B,CACpC,wCAAqB,CAAC,aAAa,EACnC,aAAa,CAAC,eAAe,CAC9B;yBACF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,mBAAmB,CAAC,aAAa;oBACxD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,EAClD,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAC1C;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,sBAAsB,CAAC,aAAa;oBAC3D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,sBAAsB,CAAC,aAAa,EACrD,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAC7C;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/E,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,mBAAmB,CAAC,aAAa;oBACxD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,EAClD,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAC1C;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrF,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,sBAAsB,CAAC,aAAa;oBAC3D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,sBAAsB,CAAC,aAAa,EACrD,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAC7C;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,kBAAkB,CAAC,aAAa;oBACvD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,kBAAkB,CAAC,aAAa,EACjD,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,CACtC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvE,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,kBAAkB,CAAC,aAAa;oBACvD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,kBAAkB,CAAC,aAAa,EACjD,aAAa,CAAC,YAAY,CAAC,QAAQ,EAAE,CACtC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,iBAAiB,CAAC,aAAa;oBACtD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,iBAAiB,CAAC,aAAa,EAChD,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,CACrC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;gBACrE,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,iBAAiB,CAAC,aAAa;oBACtD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,iBAAiB,CAAC,aAAa,EAChD,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,CACrC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,wBAAwB,EAAE,CAAC;YAC5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,sBAAsB,CACrC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,sBAAsB,KAAK,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBAC1F,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,sBAAsB,CACrC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,wBAAwB,EAAE,CAAC;YAC5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,sBAAsB,CACrC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,sBAAsB,KAAK,aAAa,CAAC,sBAAsB,EAAE,CAAC;gBAC1F,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,sBAAsB,CACrC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,4BAA4B,EAAE,CAAC;YAChD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,gCAAgC,CAAC,aAAa;oBACrE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,gCAAgC,CAAC,aAAa,EAC/D,aAAa,CAAC,0BAA0B,CACzC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,0BAA0B,KAAK,aAAa,CAAC,0BAA0B,EAAE,CAAC;gBAClG,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,gCAAgC,CAAC,aAAa;oBACrE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,gCAAgC,CAAC,aAAa,EAC/D,aAAa,CAAC,0BAA0B,CACzC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,yBAAyB,EAAE,CAAC;YAC7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;oBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,aAAa,CAAC,uBAAuB,CACtC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,uBAAuB,KAAK,aAAa,CAAC,uBAAuB,EAAE,CAAC;gBAC5F,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;oBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,aAAa,CAAC,uBAAuB,CACtC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YACzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,sBAAsB,CAAC,aAAa;oBAC3D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,sBAAsB,CAAC,aAAa,EACrD,aAAa,CAAC,mBAAmB,CAClC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,mBAAmB,KAAK,aAAa,CAAC,mBAAmB,EAAE,CAAC;gBACpF,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,sBAAsB,CAAC,aAAa;oBAC3D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,sBAAsB,CAAC,aAAa,EACrD,aAAa,CAAC,mBAAmB,CAClC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,mBAAmB,CAAC,aAAa;oBACxD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,EAClD,aAAa,CAAC,MAAM,CACrB;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;gBAC1D,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,mBAAmB,CAAC,aAAa;oBACxD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,EAClD,aAAa,CAAC,MAAM,CACrB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,gCAAgC,EAAE,CAAC;YACpD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,0CAA0C,CAAC,aAAa;oBAC/E,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,0CAA0C,CAAC,aAAa,EACzE,aAAa,CAAC,8BAA8B,CAC7C;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,8BAA8B,KAAK,aAAa,CAAC,8BAA8B,EAAE,CAAC;gBAC1G,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,0CAA0C,CAAC,aAAa;oBAC/E,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,0CAA0C,CAAC,aAAa,EACzE,aAAa,CAAC,8BAA8B,CAC7C;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,qCAAqC,EAAE,CAAC;YACzD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,oCAAoC,CAAC,aAAa;oBACzE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,oCAAoC,CAAC,aAAa,EACnE,aAAa,CAAC,mCAAmC,CAClD;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IACL,OAAO,CAAC,MAAM,CAAC,mCAAmC,KAAK,aAAa,CAAC,mCAAmC,EACxG,CAAC;gBACD,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,oCAAoC,CAAC,aAAa;oBACzE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,oCAAoC,CAAC,aAAa,EACnE,aAAa,CAAC,mCAAmC,CAClD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,kCAAkC,EAAE,CAAC;YACtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,gCAAgC,CAAC,aAAa;oBACrE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,gCAAgC,CAAC,aAAa,EAC/D,aAAa,CAAC,gCAAgC,CAAC,QAAQ,EAAE,CAC1D;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gCAAgC,CAAC,EAAE,CAAC,aAAa,CAAC,gCAAgC,CAAC,EAAE,CAAC;gBAC/G,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,gCAAgC,CAAC,aAAa;oBACrE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,gCAAgC,CAAC,aAAa,EAC/D,aAAa,CAAC,gCAAgC,CAAC,QAAQ,EAAE,CAC1D;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,sBAAsB,EAAE,CAAC;YAC1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,0BAA0B,CAAC,aAAa;oBAC/D,KAAK,EAAE,+BAA+B,CAAC,wBAAgB,CAAC,0BAA0B,CAAC,aAAa,EAAE;wBAChG,aAAa,CAAC,oBAAoB,CAAC,cAAc,CAAC,QAAQ,EAAE;wBAC5D,aAAa,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,QAAQ,EAAE;qBAC1E,CAAC;iBACH,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,sCAAsC,CAAC,aAAa;oBAC3E,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,0BAA0B,CAAC,aAAa,EACzD,aAAa,CAAC,oBAAoB,CAAC,YAAY,CAAC,QAAQ,EAAE,CAC3D;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IACL,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,CAAC,oBAAoB,CAAC,cAAc,CAAC;gBACzG,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,EAAE,CACjE,aAAa,CAAC,oBAAoB,CAAC,2BAA2B,CAC/D,EACD,CAAC;gBACD,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,0BAA0B,CAAC,aAAa;oBAC/D,KAAK,EAAE,+BAA+B,CAAC,wBAAgB,CAAC,0BAA0B,CAAC,aAAa,EAAE;wBAChG,aAAa,CAAC,oBAAoB,CAAC,cAAc,CAAC,QAAQ,EAAE;wBAC5D,aAAa,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,QAAQ,EAAE;qBAC1E,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;iBAAM,IACL,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC,aAAa,CAAC,oBAAoB,CAAC,YAAY,CAAC,EACrG,CAAC;gBACD,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,sCAAsC,CAAC,aAAa;oBAC3E,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,0BAA0B,CAAC,aAAa,EACzD,aAAa,CAAC,oBAAoB,CAAC,YAAY,CAAC,QAAQ,EAAE,CAC3D;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;YACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,uBAAuB,CAAC,aAAa;oBAC5D,KAAK,EAAE,+BAA+B,CAAC,wBAAgB,CAAC,uBAAuB,CAAC,aAAa,EAAE;wBAC7F,aAAa,CAAC,iBAAiB,CAAC,cAAc,CAAC,QAAQ,EAAE;wBACzD,aAAa,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,QAAQ,EAAE;qBACvE,CAAC;iBACH,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,mCAAmC,CAAC,aAAa;oBACxE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,uBAAuB,CAAC,aAAa,EACtD,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,CACxD;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IACL,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,cAAc,CAAC;gBACnG,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,EAAE,CAC9D,aAAa,CAAC,iBAAiB,CAAC,2BAA2B,CAC5D,EACD,CAAC;gBACD,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,uBAAuB,CAAC,aAAa;oBAC5D,KAAK,EAAE,+BAA+B,CAAC,wBAAgB,CAAC,uBAAuB,CAAC,aAAa,EAAE;wBAC7F,aAAa,CAAC,iBAAiB,CAAC,cAAc,CAAC,QAAQ,EAAE;wBACzD,aAAa,CAAC,iBAAiB,CAAC,2BAA2B,CAAC,QAAQ,EAAE;qBACvE,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC3G,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,mCAAmC,CAAC,aAAa;oBACxE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,uBAAuB,CAAC,aAAa,EACtD,aAAa,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,CACxD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,oBAAoB,CAAC,aAAa;oBACzD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,EACnD,aAAa,CAAC,eAAe,CAC9B;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9D,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3E,qBAAqB,CAAC,IAAI,CAAC;4BACzB,IAAI,EAAE,wBAAgB,CAAC,oBAAoB,CAAC,aAAa;4BACzD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,EACnD,aAAa,CAAC,eAAe,CAC9B;yBACF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,kBAAkB,CAAC,aAAa;oBACvD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,kBAAkB,CAAC,aAAa,EACjD,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE,CACzC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,EAAE,CAAC;gBAC7E,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,kBAAkB,CAAC,aAAa;oBACvD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,kBAAkB,CAAC,aAAa,EACjD,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE,CACzC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,oBAAoB,CAAC,aAAa;oBACzD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,EACnD,aAAa,CAAC,cAAc,CAC7B;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,KAAK,aAAa,CAAC,cAAc,EAAE,CAAC;gBAC1E,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,oBAAoB,CAAC,aAAa;oBACzD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,EACnD,aAAa,CAAC,cAAc,CAC7B;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,2BAA2B,EAAE,CAAC;YAC/C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,yBAAyB,CACxC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,yBAAyB,KAAK,aAAa,CAAC,yBAAyB,EAAE,CAAC;gBAChG,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,yBAAyB,CACxC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YACzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;oBAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,aAAa,CAAC,mBAAmB,CAClC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAClE,IAAI,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;wBACnF,qBAAqB,CAAC,IAAI,CAAC;4BACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;4BAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,aAAa,CAAC,mBAAmB,CAClC;yBACF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,oBAAoB,EAAE,CAAC;YACxC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,wBAAwB,CAAC,aAAa;oBAC7D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,wBAAwB,CAAC,aAAa,EACvD,aAAa,CAAC,kBAAkB,CACjC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjE,IAAI,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;wBACjF,qBAAqB,CAAC,IAAI,CAAC;4BACzB,IAAI,EAAE,wBAAgB,CAAC,wBAAwB,CAAC,aAAa;4BAC7D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,wBAAwB,CAAC,aAAa,EACvD,aAAa,CAAC,kBAAkB,CACjC;yBACF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,kCAAkC,EAAE,CAAC;YACtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,gCAAgC,CAAC,QAAQ,EAAE,CAC1D;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gCAAgC,CAAC,EAAE,CAAC,aAAa,CAAC,gCAAgC,CAAC,EAAE,CAAC;gBAC/G,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;oBACjE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,EAC3D,aAAa,CAAC,gCAAgC,CAAC,QAAQ,EAAE,CAC1D;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,eAAe,CAAC,aAAa;oBACpD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,eAAe,CAAC,aAAa,EAC9C,aAAa,CAAC,SAAS,CACxB;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,KAAK,aAAa,CAAC,SAAS,EAAE,CAAC;gBAChE,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,eAAe,CAAC,aAAa;oBACpD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,eAAe,CAAC,aAAa,EAC9C,aAAa,CAAC,SAAS,CACxB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;YAC1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,mBAAmB,CAAC,aAAa;oBACxD,KAAK,EAAE,+BAA+B,CAAC,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC;iBAC3G,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;oBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CACrC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;oBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CACrC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,2BAA2B,CAAC,aAAa;oBAChE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,2BAA2B,CAAC,aAAa,EAC1D,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CACnC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;oBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAC1C;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,0BAA0B,CAAC,aAAa;oBAC/D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,0BAA0B,CAAC,aAAa,EACzD,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CACxC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;oBAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CACvC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;oBAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,SAAS,CAAC,kBAAkB,CAAC,UAAU,CACxC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,wBAAwB,CAAC,aAAa;oBAC7D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,wBAAwB,CAAC,aAAa,EACvD,SAAS,CAAC,kBAAkB,CAAC,SAAS,CACvC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,qBAAqB,CAAC,aAAa;oBAC1D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,qBAAqB,CAAC,aAAa,EACpD,SAAS,CAAC,wBAAwB,CAAC,eAAe,CACnD;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;oBAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,SAAS,CAAC,wBAAwB,CAAC,cAAc,CAClD;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,eAAe,CAAC,aAAa;oBACpD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,eAAe,CAAC,aAAa,EAC9C,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAClC;iBACF,CAAC,CAAC;gBACH,qBAAqB,CAAC,IAAI,CAAC;oBACzB,IAAI,EAAE,wBAAgB,CAAC,qBAAqB,CAAC,aAAa;oBAC1D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,qBAAqB,CAAC,aAAa,EACpD,SAAS,CAAC,eAAe,CAC1B;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/C,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3D,qBAAqB,CAAC,IAAI,CAAC;4BACzB,IAAI,EAAE,wBAAgB,CAAC,mBAAmB,CAAC,aAAa;4BACxD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,EAClD,SAAS,CAAC,IAAI,CACf;yBACF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC5E,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;wBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CACrC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC5E,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;wBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CACrC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxE,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,2BAA2B,CAAC,aAAa;wBAChE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,2BAA2B,CAAC,aAAa,EAC1D,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CACnC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC;oBACtF,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,6BAA6B,CAAC,aAAa;wBAClE,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,EAC5D,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE,CAC1C;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAClF,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,0BAA0B,CAAC,aAAa;wBAC/D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,0BAA0B,CAAC,aAAa,EACzD,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CACxC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAChF,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;wBAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CACvC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACxE,IACE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,EACxG,CAAC;wBACD,qBAAqB,CAAC,IAAI,CAAC;4BACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;4BAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,SAAS,CAAC,kBAAkB,CAAC,UAAU,CACxC;yBACF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvE,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC3G,qBAAqB,CAAC,IAAI,CAAC;4BACzB,IAAI,EAAE,wBAAgB,CAAC,wBAAwB,CAAC,aAAa;4BAC7D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,wBAAwB,CAAC,aAAa,EACvD,SAAS,CAAC,kBAAkB,CAAC,SAAS,CACvC;yBACF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IACE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,eAAe,CAAC,MAAM,CACvE,SAAS,CAAC,wBAAwB,CAAC,eAAe,CACnD,EACD,CAAC;oBACD,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,qBAAqB,CAAC,aAAa;wBAC1D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,qBAAqB,CAAC,aAAa,EACpD,SAAS,CAAC,wBAAwB,CAAC,eAAe,CACnD;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IACE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,cAAc,CAAC,MAAM,CACtE,SAAS,CAAC,wBAAwB,CAAC,cAAc,CAClD,EACD,CAAC;oBACD,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;wBAC9D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,EACxD,SAAS,CAAC,wBAAwB,CAAC,cAAc,CAClD;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChG,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,eAAe,CAAC,aAAa;wBACpD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,eAAe,CAAC,aAAa,EAC9C,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAClC;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,KAAK,SAAS,CAAC,eAAe,EAAE,CAAC;oBAC3E,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,qBAAqB,CAAC,aAAa;wBAC1D,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,qBAAqB,CAAC,aAAa,EACpD,SAAS,CAAC,eAAe,CAC1B;qBACF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC1G,qBAAqB,CAAC,IAAI,CAAC;wBACzB,IAAI,EAAE,wBAAgB,CAAC,oBAAoB,CAAC,aAAa;wBACzD,KAAK,EAAE,+BAA+B,CACpC,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,EACnD,SAAS,CAAC,kBAAkB,CAAC,SAAS,CACvC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,WAAW;IAEb,MAAM,IAAI,GAA6B,EAAE,CAAC;IAE1C,qBAAqB,CAAC,OAAO,CAAC,CAAC,uBAAuB,EAAE,EAAE;QACxD,IAAI,CAAC,IAAI,CACP,qBAAqB,CACnB,iBAAiB,EACjB,cAAc,EACd,uBAAuB,CAAC,IAAI,GAAG,CAAC,EAChC,uBAAuB,CAAC,KAAK,EAC7B,SAAS,CACV,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,+BAA+B,CAC7C,aAAqB,EACrB,KAAsD;IAEtD,IAAI,MAAc,CAAC;IACnB,IAAI,UAAU,GAAa,EAAE,CAAC;IAE9B,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,CAAC;QACzD,KAAK,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,CAAC;QAClE,KAAK,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,CAAC;QACjE,KAAK,wBAAgB,CAAC,sBAAsB,CAAC,aAAa,CAAC;QAC3D,KAAK,wBAAgB,CAAC,eAAe,CAAC,aAAa,CAAC;QACpD,KAAK,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,CAAC;QACxD,KAAK,wBAAgB,CAAC,0CAA0C,CAAC,aAAa,CAAC;QAC/E,KAAK,wBAAgB,CAAC,oCAAoC,CAAC,aAAa,CAAC;QACzE,KAAK,wBAAgB,CAAC,qBAAqB,CAAC,aAAa;YACvD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,WAAW,CAAC,KAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,CAAC;QACjE,KAAK,wBAAgB,CAAC,gCAAgC,CAAC,aAAa,CAAC;QACrE,KAAK,wBAAgB,CAAC,4BAA4B,CAAC,aAAa;YAC9D,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,aAAa,CAAC,KAAe,EAAE,CAAC,CAAC,CAAC;YACzC,MAAM;QACR,KAAK,wBAAgB,CAAC,mBAAmB,CAAC,aAAa,CAAC;QACxD,KAAK,wBAAgB,CAAC,sBAAsB,CAAC,aAAa,CAAC;QAC3D,KAAK,wBAAgB,CAAC,kBAAkB,CAAC,aAAa,CAAC;QACvD,KAAK,wBAAgB,CAAC,iBAAiB,CAAC,aAAa,CAAC;QACtD,KAAK,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,CAAC;QAClE,KAAK,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,CAAC;QAClE,KAAK,wBAAgB,CAAC,2BAA2B,CAAC,aAAa,CAAC;QAChE,KAAK,wBAAgB,CAAC,6BAA6B,CAAC,aAAa,CAAC;QAClE,KAAK,wBAAgB,CAAC,0BAA0B,CAAC,aAAa,CAAC;QAC/D,KAAK,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,CAAC;QAC9D,KAAK,wBAAgB,CAAC,mCAAmC,CAAC,aAAa,CAAC;QACxE,KAAK,wBAAgB,CAAC,sCAAsC,CAAC,aAAa,CAAC;QAC3E,KAAK,wBAAgB,CAAC,4BAA4B,CAAC,aAAa,CAAC;QACjE,KAAK,wBAAgB,CAAC,kBAAkB,CAAC,aAAa,CAAC;QACvD,KAAK,wBAAgB,CAAC,gCAAgC,CAAC,aAAa;YAClE,KAAK,GAAG,KAAe,CAAC;YACxB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM;QACR,KAAK,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,CAAC;QAC9D,KAAK,wBAAgB,CAAC,wBAAwB,CAAC,aAAa;YAC1D,UAAU,GAAG,KAAiB,CAAC;YAC/B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM;QACR,KAAK,wBAAgB,CAAC,mBAAmB,CAAC,aAAa;YACrD,UAAU,GAAG,KAAiB,CAAC;YAC/B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM;QACR,KAAK,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,CAAC;QACzD,KAAK,wBAAgB,CAAC,eAAe,CAAC,aAAa,CAAC;QACpD,KAAK,wBAAgB,CAAC,qBAAqB,CAAC,aAAa,CAAC;QAC1D,KAAK,wBAAgB,CAAC,yBAAyB,CAAC,aAAa,CAAC;QAC9D,KAAK,wBAAgB,CAAC,oBAAoB,CAAC,aAAa,CAAC;QACzD,KAAK,wBAAgB,CAAC,cAAc,CAAC,aAAa;YAChD,MAAM,GAAI,KAAmB,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM;QACR,KAAK,wBAAgB,CAAC,qBAAqB,CAAC,aAAa;YACvD,MAAM,GAAG,wBAAwB,CAAC,KAAwB,CAAC,CAAC;YAC5D,MAAM;QACR,KAAK,wBAAgB,CAAC,uBAAuB,CAAC,aAAa,CAAC;QAC5D,KAAK,wBAAgB,CAAC,0BAA0B,CAAC,aAAa;YAC5D,UAAU,GAAG,KAAiB,CAAC;YAC/B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,MAAM;QACR,KAAK,wBAAgB,CAAC,oBAAoB,CAAC,aAAa;YACtD,UAAU,GAAG,KAAiB,CAAC;YAC/B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM;QACR,KAAK,wBAAgB,CAAC,wBAAwB,CAAC,aAAa,CAAC;QAC7D,KAAK,wBAAgB,CAAC,yBAAyB,CAAC,aAAa;YAC3D,UAAU,GAAG,KAAiB,CAAC;YAC/B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM;QACR;YACE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,wBAAwB,CAAC,KAAsB;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport {\n AccountInfo,\n Connection,\n PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport {\n INITIAL_COLLATERAL_RATE,\n lendingMarketAuthPda,\n MarketWithAddress,\n ONE_HUNDRED_PCT_IN_BPS,\n reservePdas,\n SLOTS_PER_DAY,\n SLOTS_PER_SECOND,\n SLOTS_PER_YEAR,\n TokenOracleData,\n U64_MAX,\n} from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { BorrowRateCurve, CurvePointFields, ReserveConfig, UpdateConfigMode } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\nimport { KaminoMarket } from './market';\nimport {\n initReserve,\n InitReserveAccounts,\n updateReserveConfig,\n UpdateReserveConfigAccounts,\n UpdateReserveConfigArgs,\n} from '../lib';\nimport * as anchor from '@coral-xyz/anchor';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { UpdateBorrowRateCurve } from '../idl_codegen/types/UpdateConfigMode';\n\nexport const DEFAULT_RECENT_SLOT_DURATION_MS = 450;\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n private readonly recentSlotDurationMs: number;\n\n constructor(\n state: Reserve,\n address: PublicKey,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n this.recentSlotDurationMs = recentSlotDurationMs;\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection, recentSlotDurationMs);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the fixed interest rate allocated to the host\n */\n getFixedHostInterestRate = (): Decimal => {\n return new Decimal(this.state.config.hostFixedInterestRateBps).div(10_000);\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n const cumulativeBorrowRateBsf = this.state.liquidity.cumulativeBorrowRateBsf.value;\n const accSf = cumulativeBorrowRateBsf.reduce((prev, curr, i) => prev.add(curr.shln(i * 64)), new BN(0));\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number, referralFeeBps: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR(currentSlot, referralFeeBps));\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n /**\n *\n * @returns the max capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.depositWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.depositWithdrawalCap.currentTotal.toString());\n }\n }\n\n /**\n *\n * @returns the max capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.debtWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the borrow limit of the reserve outside the elevation group\n */\n getBorrowLimitOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.config.borrowLimitOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrowed amount of the reserve outside the elevation group\n */\n getBorrowedAmountOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.borrowedAmountOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrow limit against the collateral reserve in the elevation group\n */\n getBorrowLimitAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(\n this.state.config.borrowLimitAgainstThisCollateralInElevationGroup[elevationGroupIndex].toString()\n );\n }\n\n /**\n *\n * @returns the borrowed amount against the collateral reserve in the elevation group\n */\n getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(this.state.borrowedAmountsAgainstThisReserveInElevationGroups[elevationGroupIndex].toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.debtWithdrawalCap.currentTotal.toString());\n }\n }\n\n getBorrowFactor(): Decimal {\n return new Decimal(this.state.config.borrowFactorPct.toString()).div(100);\n }\n\n calculateSupplyAPR(slot: number, referralFeeBps: number) {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowRate * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n getEstimatedAccumulatedProtocolFees(\n slot: number,\n referralFeeBps: number\n ): { accumulatedProtocolFees: Decimal; compoundedVariableProtocolFee: Decimal; compoundedFixedHostFee: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let accumulatedProtocolFees: Decimal;\n let compoundedVariableProtocolFee: Decimal;\n let compoundedFixedHostFee: Decimal;\n if (slotsElapsed === 0) {\n accumulatedProtocolFees = this.getAccumulatedProtocolFees();\n compoundedVariableProtocolFee = new Decimal(0);\n compoundedFixedHostFee = new Decimal(0);\n } else {\n const { newAccProtocolFees, variableProtocolFee, fixedHostFee } = this.compoundInterest(\n slotsElapsed,\n referralFeeBps\n );\n accumulatedProtocolFees = newAccProtocolFees;\n compoundedVariableProtocolFee = variableProtocolFee;\n compoundedFixedHostFee = fixedHostFee;\n }\n return { accumulatedProtocolFees, compoundedVariableProtocolFee, compoundedFixedHostFee };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n getEstimatedUtilizationRatio(slot: number, referralFeeBps: number) {\n const { totalBorrow: estimatedTotalBorrowed, totalSupply: estimatedTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n if (estimatedTotalSupply.eq(0)) {\n return 0;\n }\n\n return estimatedTotalBorrowed.dividedBy(estimatedTotalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n getMaxBorrowAmountWithCollReserve(market: KaminoMarket, collReserve: KaminoReserve, slot: number): Decimal {\n const groupsColl = collReserve.state.config.elevationGroups;\n const groupsDebt = this.state.config.elevationGroups;\n const groups = market.state.elevationGroups;\n const commonElevationGroups = [...groupsColl].filter(\n (item) => groupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(this.address)\n );\n\n let eModeGroup = 0;\n\n if (commonElevationGroups.length !== 0) {\n const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n }\n\n const elevationGroupActivated = this.state.config.elevationGroups.includes(eModeGroup) && eModeGroup !== 0;\n\n const reserveAvailableAmount = this.getLiquidityAvailableAmount();\n const reserveBorrowCapRemained = this.stats.reserveBorrowLimit.sub(this.getBorrowedAmount());\n\n let maxBorrowAmount = Decimal.min(reserveAvailableAmount, reserveBorrowCapRemained);\n\n const debtWithdrawalCap = this.getDebtWithdrawalCapCapacity().sub(this.getDebtWithdrawalCapCurrent(slot));\n maxBorrowAmount = this.getDebtWithdrawalCapCapacity().gt(0)\n ? Decimal.min(maxBorrowAmount, debtWithdrawalCap)\n : maxBorrowAmount;\n\n let originationFeeRate = this.getBorrowFee();\n\n // Inclusive fee rate\n originationFeeRate = originationFeeRate.div(originationFeeRate.add(new Decimal(1)));\n const borrowFee = maxBorrowAmount.mul(originationFeeRate);\n\n maxBorrowAmount = maxBorrowAmount.sub(borrowFee);\n\n const utilizationRatioLimit = this.state.config.utilizationLimitBlockBorrowingAbove / 100;\n const currentUtilizationRatio = this.calculateUtilizationRatio();\n\n if (utilizationRatioLimit > 0 && currentUtilizationRatio > utilizationRatioLimit) {\n return new Decimal(0);\n } else if (utilizationRatioLimit > 0 && currentUtilizationRatio < utilizationRatioLimit) {\n const maxBorrowBasedOnUtilization = new Decimal(utilizationRatioLimit - currentUtilizationRatio).mul(\n this.getTotalSupply()\n );\n maxBorrowAmount = Decimal.min(maxBorrowAmount, maxBorrowBasedOnUtilization);\n }\n\n let borrowLimitDependentOnElevationGroup = new Decimal(U64_MAX);\n\n if (!elevationGroupActivated) {\n borrowLimitDependentOnElevationGroup = this.getBorrowLimitOutsideElevationGroup().sub(\n this.getBorrowedAmountOutsideElevationGroup()\n );\n } else {\n let maxDebtTakenAgainstCollaterals = new Decimal(U64_MAX);\n const maxDebtAllowedAgainstCollateral = collReserve\n .getBorrowLimitAgainstCollateralInElevationGroup(eModeGroup - 1)\n .sub(collReserve.getBorrowedAmountAgainstCollateralInElevationGroup(eModeGroup - 1));\n\n maxDebtTakenAgainstCollaterals = Decimal.max(\n new Decimal(0),\n Decimal.min(maxDebtAllowedAgainstCollateral, maxDebtTakenAgainstCollaterals)\n );\n borrowLimitDependentOnElevationGroup = maxDebtTakenAgainstCollaterals;\n }\n\n maxBorrowAmount = Decimal.min(maxBorrowAmount, borrowLimitDependentOnElevationGroup);\n\n return Decimal.max(new Decimal(0), maxBorrowAmount);\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve) * slotAdjustmentFactor + this.getFixedHostInterestRate().toNumber();\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n slotAdjustmentFactor(): number {\n return 1000 / SLOTS_PER_SECOND / this.recentSlotDurationMs;\n }\n\n calculateBorrowRate() {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n\n return getBorrowRate(currentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateEstimatedBorrowRate(slot: number, referralFeeBps: number) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const estimatedCurrentUtilization = this.getEstimatedUtilizationRatio(slot, referralFeeBps);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(estimatedCurrentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateBorrowAPR(slot: number, referralFeeBps: number) {\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n return borrowRate + this.getFixedHostInterestRate().toNumber();\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the token program of the reserve liquidity mint\n */\n getLiquidityTokenProgram(): PublicKey {\n return this.state.liquidity.tokenProgram;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateSupplyAPR(currentSlot, 0));\n }\n\n totalBorrowAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateBorrowAPR(currentSlot, 0));\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n variableProtocolFee: Decimal;\n fixedHostFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowRate();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n const fixedHostInterestRate = this.getFixedHostInterestRate();\n\n const compoundedInterestRate = this.approximateCompoundedInterest(\n new Decimal(currentBorrowRate).plus(fixedHostInterestRate),\n slotsElapsed\n );\n const compoundedFixedRate = this.approximateCompoundedInterest(fixedHostInterestRate, slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundedInterestRate);\n const fixedHostFee = previousDebt.mul(compoundedFixedRate).sub(previousDebt);\n\n const netNewDebt = newDebt.sub(previousDebt).sub(fixedHostFee);\n\n const variableProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = variableProtocolFee\n .add(fixedHostFee)\n .sub(maxReferralFees)\n .add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n variableProtocolFee,\n fixedHostFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n\nexport async function createReserveIxs(\n connection: Connection,\n owner: PublicKey,\n lendingMarket: PublicKey,\n liquidityMint: PublicKey,\n reserveAddress: PublicKey,\n programId: PublicKey\n): Promise<TransactionInstruction[]> {\n const size = Reserve.layout.span + 8;\n\n const createReserveIx = SystemProgram.createAccount({\n fromPubkey: owner,\n newAccountPubkey: reserveAddress,\n lamports: await connection.getMinimumBalanceForRentExemption(size),\n space: size,\n programId: programId,\n });\n\n const { liquiditySupplyVault, collateralMint, collateralSupplyVault, feeVault } = reservePdas(\n programId,\n lendingMarket,\n liquidityMint\n );\n const [lendingMarketAuthority, _] = lendingMarketAuthPda(lendingMarket, programId);\n\n const accounts: InitReserveAccounts = {\n lendingMarketOwner: owner,\n lendingMarket: lendingMarket,\n lendingMarketAuthority: lendingMarketAuthority,\n reserve: reserveAddress,\n reserveLiquidityMint: liquidityMint,\n reserveLiquiditySupply: liquiditySupplyVault,\n feeReceiver: feeVault,\n reserveCollateralMint: collateralMint,\n reserveCollateralSupply: collateralSupplyVault,\n liquidityTokenProgram: TOKEN_PROGRAM_ID,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n };\n\n const initReserveIx = initReserve(accounts, programId);\n\n return [createReserveIx, initReserveIx];\n}\n\nexport function updateReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n modeDiscriminator: number,\n value: Uint8Array,\n programId: PublicKey\n): TransactionInstruction {\n value;\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(modeDiscriminator),\n value: value,\n skipValidation: false,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function updateEntireReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n): TransactionInstruction {\n const layout = ReserveConfig.layout();\n const data = Buffer.alloc(1000);\n const len = layout.encode(reserveConfig.toEncodable(), data);\n const value = Uint8Array.from([...data.subarray(0, len)]);\n\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(25),\n value: value,\n skipValidation: true,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function parseForChangesReserveConfigAndGetIxs(\n marketWithAddress: MarketWithAddress,\n reserve: Reserve | undefined,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n) {\n const updateReserveIxnsArgs: { mode: number; value: Uint8Array }[] = [];\n for (const key in reserveConfig.toEncodable()) {\n if (key === 'borrowRateCurve') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(UpdateBorrowRateCurve.discriminator, reserveConfig.borrowRateCurve),\n });\n } else {\n for (let i = 0; i < reserveConfig.borrowRateCurve.points.length; i++) {\n if (\n reserve.config.borrowRateCurve.points[i].utilizationRateBps !==\n reserveConfig.borrowRateCurve.points[i].utilizationRateBps ||\n reserve.config.borrowRateCurve.points[i].borrowRateBps !==\n reserveConfig.borrowRateCurve.points[i].borrowRateBps\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateBorrowRateCurve.discriminator,\n reserveConfig.borrowRateCurve\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'fees') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.borrowFeeSf.eq(reserveConfig.fees.borrowFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.flashLoanFeeSf.eq(reserveConfig.fees.flashLoanFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n }\n } else if (key === 'depositLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n } else if (!reserve.config.depositLimit.eq(reserveConfig.depositLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n }\n } else if (key === 'borrowLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n } else if (!reserve.config.borrowLimit.eq(reserveConfig.borrowLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n }\n } else if (key === 'maxLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n } else if (reserve.config.maxLiquidationBonusBps !== reserveConfig.maxLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'minLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n } else if (reserve.config.minLiquidationBonusBps !== reserveConfig.minLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'badDebtLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n } else if (reserve.config.badDebtLiquidationBonusBps !== reserveConfig.badDebtLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'liquidationThresholdPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n } else if (reserve.config.liquidationThresholdPct !== reserveConfig.liquidationThresholdPct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n }\n } else if (key === 'protocolTakeRatePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n } else if (reserve.config.protocolTakeRatePct !== reserveConfig.protocolTakeRatePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n }\n } else if (key === 'status') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n } else if (reserve.config.status !== reserveConfig.status) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n }\n } else if (key === 'disableUsageAsCollOutsideEmode') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n } else if (reserve.config.disableUsageAsCollOutsideEmode !== reserveConfig.disableUsageAsCollOutsideEmode) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n }\n } else if (key === 'utilizationLimitBlockBorrowingAbove') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n } else if (\n reserve.config.utilizationLimitBlockBorrowingAbove !== reserveConfig.utilizationLimitBlockBorrowingAbove\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n }\n } else if (key === 'deleveragingThresholdSlotsPerBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingThresholdSlotsPerBps.eq(reserveConfig.deleveragingThresholdSlotsPerBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n }\n } else if (key === 'depositWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.configCapacity.eq(reserveConfig.depositWithdrawalCap.configCapacity) ||\n !reserve.config.depositWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.currentTotal.eq(reserveConfig.depositWithdrawalCap.currentTotal)\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'debtWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.debtWithdrawalCap.configCapacity.eq(reserveConfig.debtWithdrawalCap.configCapacity) ||\n !reserve.config.debtWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (!reserve.config.debtWithdrawalCap.currentTotal.eq(reserveConfig.debtWithdrawalCap.currentTotal)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'elevationGroups') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.elevationGroups.length; i++) {\n if (reserve.config.elevationGroups[i] !== reserveConfig.elevationGroups[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'borrowFactorPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n } else if (!reserve.config.borrowFactorPct.eq(reserveConfig.borrowFactorPct)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n }\n } else if (key === 'loanToValuePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n } else if (reserve.config.loanToValuePct !== reserveConfig.loanToValuePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n }\n } else if (key === 'protocolLiquidationFeePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n } else if (reserve.config.protocolLiquidationFeePct !== reserveConfig.protocolLiquidationFeePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n }\n } else if (key === 'multiplierSideBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierSideBoost.length; i++) {\n if (reserve.config.multiplierSideBoost[i] !== reserveConfig.multiplierSideBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'multiplierTagBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierTagBoost.length; i++) {\n if (reserve.config.multiplierTagBoost[i] !== reserveConfig.multiplierTagBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'deleveragingMarginCallPeriodSecs') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingMarginCallPeriodSecs.eq(reserveConfig.deleveragingMarginCallPeriodSecs)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n }\n } else if (key === 'assetTier') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n } else if (reserve.config.assetTier !== reserveConfig.assetTier) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n }\n } else if (key === 'tokenInfo') {\n const tokenInfo = reserveConfig.tokenInfo;\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n } else {\n for (let i = 0; i < tokenInfo.name.length; i++) {\n if (reserve.config.tokenInfo.name[i] !== tokenInfo.name[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoName.discriminator,\n tokenInfo.name\n ),\n });\n break;\n }\n }\n if (!reserve.config.tokenInfo.heuristic.lower.eq(tokenInfo.heuristic.lower)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.upper.eq(tokenInfo.heuristic.upper)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.exp.eq(tokenInfo.heuristic.exp)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxTwapDivergenceBps.eq(tokenInfo.maxTwapDivergenceBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgePriceSeconds.eq(tokenInfo.maxAgePriceSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgeTwapSeconds.eq(tokenInfo.maxAgeTwapSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.priceChain.length; i++) {\n if (\n reserve.config.tokenInfo.scopeConfiguration.priceChain[i] !== tokenInfo.scopeConfiguration.priceChain[i]\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n break;\n }\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.twapChain.length; i++) {\n if (reserve.config.tokenInfo.scopeConfiguration.twapChain[i] !== tokenInfo.scopeConfiguration.twapChain[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n break;\n }\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.priceAggregator.equals(\n tokenInfo.switchboardConfiguration.priceAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.twapAggregator.equals(\n tokenInfo.switchboardConfiguration.twapAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n }\n if (!reserve.config.tokenInfo.pythConfiguration.price.equals(tokenInfo.pythConfiguration.price)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n }\n if (reserve.config.tokenInfo.blockPriceUsage !== tokenInfo.blockPriceUsage) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n }\n if (!reserve.config.tokenInfo.scopeConfiguration.priceFeed.equals(tokenInfo.scopeConfiguration.priceFeed)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n tokenInfo.scopeConfiguration.priceFeed\n ),\n });\n }\n }\n }\n } // for loop\n\n const ixns: TransactionInstruction[] = [];\n\n updateReserveIxnsArgs.forEach((updateReserveConfigArgs) => {\n ixns.push(\n updateReserveConfigIx(\n marketWithAddress,\n reserveAddress,\n updateReserveConfigArgs.mode + 1,\n updateReserveConfigArgs.value,\n programId\n )\n );\n });\n\n return ixns;\n}\n\nexport function updateReserveConfigEncodedValue(\n discriminator: number,\n value: number | number[] | BorrowRateCurve | PublicKey\n): Uint8Array {\n let buffer: Buffer;\n let valueArray: number[] = [];\n\n switch (discriminator) {\n case UpdateConfigMode.UpdateLoanToValuePct.discriminator:\n case UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator:\n case UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator:\n case UpdateConfigMode.UpdateProtocolTakeRate.discriminator:\n case UpdateConfigMode.UpdateAssetTier.discriminator:\n case UpdateConfigMode.UpdateReserveStatus.discriminator:\n case UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator:\n case UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator:\n case UpdateConfigMode.UpdateBlockPriceUsage.discriminator:\n buffer = Buffer.alloc(1);\n buffer.writeUIntLE(value as number, 0, 1);\n break;\n case UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator:\n buffer = Buffer.alloc(2);\n buffer.writeUInt16LE(value as number, 0);\n break;\n case UpdateConfigMode.UpdateFeesBorrowFee.discriminator:\n case UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator:\n case UpdateConfigMode.UpdateDepositLimit.discriminator:\n case UpdateConfigMode.UpdateBorrowLimit.discriminator:\n case UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator:\n case UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator:\n case UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator:\n case UpdateConfigMode.UpdateBorrowFactor.discriminator:\n case UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator:\n value = value as number;\n buffer = Buffer.alloc(8);\n buffer.writeBigUint64LE(BigInt(value), 0);\n break;\n case UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator:\n case UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(8);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUInt16LE(valueArray[i], 2 * i);\n }\n break;\n case UpdateConfigMode.UpdateTokenInfoName.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(32);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateScopePriceFeed.discriminator:\n case UpdateConfigMode.UpdatePythPrice.discriminator:\n case UpdateConfigMode.UpdateSwitchboardFeed.discriminator:\n case UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator:\n case UpdateConfigMode.UpdateFarmCollateral.discriminator:\n case UpdateConfigMode.UpdateFarmDebt.discriminator:\n buffer = (value as PublicKey).toBuffer();\n break;\n case UpdateConfigMode.UpdateBorrowRateCurve.discriminator:\n buffer = serializeBorrowRateCurve(value as BorrowRateCurve);\n break;\n case UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(16);\n buffer.writeBigUint64LE(BigInt(valueArray[0]), 0);\n buffer.writeBigUInt64LE(BigInt(valueArray[1]), 8);\n break;\n case UpdateConfigMode.UpdateElevationGroup.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(20);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateMultiplierTagBoost.discriminator:\n case UpdateConfigMode.UpdateMultiplierSideBoost.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(2);\n buffer.writeUIntLE(valueArray[0], 0, 1);\n buffer.writeUIntLE(valueArray[1], 1, 1);\n break;\n default:\n buffer = Buffer.alloc(0);\n }\n\n return Uint8Array.from([...buffer]);\n}\n\nexport function serializeBorrowRateCurve(curve: BorrowRateCurve): Buffer {\n const buffer = Buffer.alloc(4 + 8 * curve.points.length);\n buffer.writeUInt32LE(curve.points.length, 0);\n for (let i = 0; i < curve.points.length; i++) {\n buffer.writeUInt32LE(curve.points[i].utilizationRateBps, 4 + 8 * i);\n buffer.writeUInt32LE(curve.points[i].borrowRateBps, 8 + 8 * i);\n }\n return buffer;\n}\n\nexport type ReserveWithAddress = {\n address: PublicKey;\n state: Reserve;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport {\n AccountInfo,\n Connection,\n PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n TransactionInstruction,\n} from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport {\n INITIAL_COLLATERAL_RATE,\n lendingMarketAuthPda,\n MarketWithAddress,\n ONE_HUNDRED_PCT_IN_BPS,\n reservePdas,\n SLOTS_PER_DAY,\n SLOTS_PER_SECOND,\n SLOTS_PER_YEAR,\n TokenOracleData,\n U64_MAX,\n} from '../utils';\nimport { ReserveDataType, ReserveFarmInfo, ReserveRewardYield, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { BorrowRateCurve, CurvePointFields, ReserveConfig, UpdateConfigMode } from '../idl_codegen/types';\nimport {\n calculateAPRFromAPY,\n calculateAPYFromAPR,\n getBorrowRate,\n lamportsToNumberDecimal,\n parseTokenSymbol,\n} from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\nimport { KaminoMarket } from './market';\nimport {\n initReserve,\n InitReserveAccounts,\n updateReserveConfig,\n UpdateReserveConfigAccounts,\n UpdateReserveConfigArgs,\n} from '../lib';\nimport * as anchor from '@coral-xyz/anchor';\nimport { TOKEN_PROGRAM_ID } from '@solana/spl-token';\nimport { UpdateBorrowRateCurve } from '../idl_codegen/types/UpdateConfigMode';\nimport { KaminoPrices } from '@kamino-finance/kliquidity-sdk';\nimport { FarmState, RewardInfo } from '@hubbleprotocol/farms-sdk';\n\nexport const DEFAULT_RECENT_SLOT_DURATION_MS = 450;\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n private farmData: ReserveFarmInfo = { fetched: false, farmStates: [] };\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n private readonly recentSlotDurationMs: number;\n\n constructor(\n state: Reserve,\n address: PublicKey,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n this.recentSlotDurationMs = recentSlotDurationMs;\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection,\n recentSlotDurationMs: number\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection, recentSlotDurationMs);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the fixed interest rate allocated to the host\n */\n getFixedHostInterestRate = (): Decimal => {\n return new Decimal(this.state.config.hostFixedInterestRateBps).div(10_000);\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n const cumulativeBorrowRateBsf = this.state.liquidity.cumulativeBorrowRateBsf.value;\n const accSf = cumulativeBorrowRateBsf.reduce((prev, curr, i) => prev.add(curr.shln(i * 64)), new BN(0));\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number, referralFeeBps: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR(currentSlot, referralFeeBps));\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n /**\n *\n * @returns the max capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.depositWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily deposit withdrawal cap\n */\n getDepositWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.depositWithdrawalCap.currentTotal.toString());\n }\n }\n\n /**\n *\n * @returns the max capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCapacity(): Decimal {\n return new Decimal(this.state.config.debtWithdrawalCap.configCapacity.toString());\n }\n\n /**\n *\n * @returns the borrow limit of the reserve outside the elevation group\n */\n getBorrowLimitOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.config.borrowLimitOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrowed amount of the reserve outside the elevation group\n */\n getBorrowedAmountOutsideElevationGroup(): Decimal {\n return new Decimal(this.state.borrowedAmountOutsideElevationGroup.toString());\n }\n\n /**\n *\n * @returns the borrow limit against the collateral reserve in the elevation group\n */\n getBorrowLimitAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(\n this.state.config.borrowLimitAgainstThisCollateralInElevationGroup[elevationGroupIndex].toString()\n );\n }\n\n /**\n *\n * @returns the borrowed amount against the collateral reserve in the elevation group\n */\n getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroupIndex: number): Decimal {\n return new Decimal(this.state.borrowedAmountsAgainstThisReserveInElevationGroups[elevationGroupIndex].toString());\n }\n\n /**\n *\n * @returns the current capacity of the daily debt withdrawal cap\n */\n getDebtWithdrawalCapCurrent(slot: number): Decimal {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n if (slotsElapsed > SLOTS_PER_DAY) {\n return new Decimal(0);\n } else {\n return new Decimal(this.state.config.debtWithdrawalCap.currentTotal.toString());\n }\n }\n\n getBorrowFactor(): Decimal {\n return new Decimal(this.state.config.borrowFactorPct.toString()).div(100);\n }\n\n calculateSupplyAPR(slot: number, referralFeeBps: number) {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowRate * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n getEstimatedAccumulatedProtocolFees(\n slot: number,\n referralFeeBps: number\n ): { accumulatedProtocolFees: Decimal; compoundedVariableProtocolFee: Decimal; compoundedFixedHostFee: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let accumulatedProtocolFees: Decimal;\n let compoundedVariableProtocolFee: Decimal;\n let compoundedFixedHostFee: Decimal;\n if (slotsElapsed === 0) {\n accumulatedProtocolFees = this.getAccumulatedProtocolFees();\n compoundedVariableProtocolFee = new Decimal(0);\n compoundedFixedHostFee = new Decimal(0);\n } else {\n const { newAccProtocolFees, variableProtocolFee, fixedHostFee } = this.compoundInterest(\n slotsElapsed,\n referralFeeBps\n );\n accumulatedProtocolFees = newAccProtocolFees;\n compoundedVariableProtocolFee = variableProtocolFee;\n compoundedFixedHostFee = fixedHostFee;\n }\n return { accumulatedProtocolFees, compoundedVariableProtocolFee, compoundedFixedHostFee };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n getEstimatedUtilizationRatio(slot: number, referralFeeBps: number) {\n const { totalBorrow: estimatedTotalBorrowed, totalSupply: estimatedTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n if (estimatedTotalSupply.eq(0)) {\n return 0;\n }\n\n return estimatedTotalBorrowed.dividedBy(estimatedTotalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n getMaxBorrowAmountWithCollReserve(market: KaminoMarket, collReserve: KaminoReserve, slot: number): Decimal {\n const groupsColl = collReserve.state.config.elevationGroups;\n const groupsDebt = this.state.config.elevationGroups;\n const groups = market.state.elevationGroups;\n const commonElevationGroups = [...groupsColl].filter(\n (item) => groupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(this.address)\n );\n\n let eModeGroup = 0;\n\n if (commonElevationGroups.length !== 0) {\n const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n }\n\n const elevationGroupActivated = this.state.config.elevationGroups.includes(eModeGroup) && eModeGroup !== 0;\n\n const reserveAvailableAmount = this.getLiquidityAvailableAmount();\n const reserveBorrowCapRemained = this.stats.reserveBorrowLimit.sub(this.getBorrowedAmount());\n\n let maxBorrowAmount = Decimal.min(reserveAvailableAmount, reserveBorrowCapRemained);\n\n const debtWithdrawalCap = this.getDebtWithdrawalCapCapacity().sub(this.getDebtWithdrawalCapCurrent(slot));\n maxBorrowAmount = this.getDebtWithdrawalCapCapacity().gt(0)\n ? Decimal.min(maxBorrowAmount, debtWithdrawalCap)\n : maxBorrowAmount;\n\n let originationFeeRate = this.getBorrowFee();\n\n // Inclusive fee rate\n originationFeeRate = originationFeeRate.div(originationFeeRate.add(new Decimal(1)));\n const borrowFee = maxBorrowAmount.mul(originationFeeRate);\n\n maxBorrowAmount = maxBorrowAmount.sub(borrowFee);\n\n const utilizationRatioLimit = this.state.config.utilizationLimitBlockBorrowingAbove / 100;\n const currentUtilizationRatio = this.calculateUtilizationRatio();\n\n if (utilizationRatioLimit > 0 && currentUtilizationRatio > utilizationRatioLimit) {\n return new Decimal(0);\n } else if (utilizationRatioLimit > 0 && currentUtilizationRatio < utilizationRatioLimit) {\n const maxBorrowBasedOnUtilization = new Decimal(utilizationRatioLimit - currentUtilizationRatio).mul(\n this.getTotalSupply()\n );\n maxBorrowAmount = Decimal.min(maxBorrowAmount, maxBorrowBasedOnUtilization);\n }\n\n let borrowLimitDependentOnElevationGroup = new Decimal(U64_MAX);\n\n if (!elevationGroupActivated) {\n borrowLimitDependentOnElevationGroup = this.getBorrowLimitOutsideElevationGroup().sub(\n this.getBorrowedAmountOutsideElevationGroup()\n );\n } else {\n let maxDebtTakenAgainstCollaterals = new Decimal(U64_MAX);\n const maxDebtAllowedAgainstCollateral = collReserve\n .getBorrowLimitAgainstCollateralInElevationGroup(eModeGroup - 1)\n .sub(collReserve.getBorrowedAmountAgainstCollateralInElevationGroup(eModeGroup - 1));\n\n maxDebtTakenAgainstCollaterals = Decimal.max(\n new Decimal(0),\n Decimal.min(maxDebtAllowedAgainstCollateral, maxDebtTakenAgainstCollaterals)\n );\n borrowLimitDependentOnElevationGroup = maxDebtTakenAgainstCollaterals;\n }\n\n maxBorrowAmount = Decimal.min(maxBorrowAmount, borrowLimitDependentOnElevationGroup);\n\n return Decimal.max(new Decimal(0), maxBorrowAmount);\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve) * slotAdjustmentFactor + this.getFixedHostInterestRate().toNumber();\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n slotAdjustmentFactor(): number {\n return 1000 / SLOTS_PER_SECOND / this.recentSlotDurationMs;\n }\n\n calculateBorrowRate() {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n\n return getBorrowRate(currentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateEstimatedBorrowRate(slot: number, referralFeeBps: number) {\n const slotAdjustmentFactor = this.slotAdjustmentFactor();\n const estimatedCurrentUtilization = this.getEstimatedUtilizationRatio(slot, referralFeeBps);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(estimatedCurrentUtilization, curve) * slotAdjustmentFactor;\n }\n\n calculateBorrowAPR(slot: number, referralFeeBps: number) {\n const borrowRate = this.calculateEstimatedBorrowRate(slot, referralFeeBps);\n return borrowRate + this.getFixedHostInterestRate().toNumber();\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the token program of the reserve liquidity mint\n */\n getLiquidityTokenProgram(): PublicKey {\n return this.state.liquidity.tokenProgram;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateSupplyAPR(currentSlot, 0));\n }\n\n totalBorrowAPY(currentSlot: number) {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n return calculateAPYFromAPR(this.calculateBorrowAPR(currentSlot, 0));\n }\n\n async loadFarmStates() {\n if (!this.farmData.fetched) {\n const farmStates = await FarmState.fetchMultiple(this.connection, [\n this.state.farmDebt,\n this.state.farmCollateral,\n ]);\n this.farmData.farmStates.push(...farmStates.filter((x) => x !== null));\n this.farmData.fetched = true;\n }\n }\n\n async getRewardYields(prices: KaminoPrices): Promise<ReserveRewardYield[]> {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadReserves.');\n }\n\n const isDebtReward = this.state.farmDebt.equals(this.address);\n await this.loadFarmStates();\n const yields: ReserveRewardYield[] = [];\n for (const farmState of this.farmData.farmStates) {\n for (const rewardInfo of farmState.rewardInfos.filter((x) => !x.token.mint.equals(PublicKey.default))) {\n const { apy, apr } = this.calculateRewardYield(prices, rewardInfo, isDebtReward);\n yields.push({ apy, apr, rewardInfo });\n }\n }\n return yields;\n }\n\n private calculateRewardYield(prices: KaminoPrices, rewardInfo: RewardInfo, isDebtReward: boolean) {\n const { decimals } = this.stats;\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n const mintAddress = this.getLiquidityMint();\n const totalAmount = isDebtReward\n ? lamportsToNumberDecimal(totalBorrows, decimals)\n : lamportsToNumberDecimal(totalSupply, decimals);\n const totalValue = totalAmount.mul(prices.spot[mintAddress.toString()].price);\n const rewardPerTimeUnitSecond = this.getRewardPerTimeUnitSecond(rewardInfo);\n const rewardsInYear = rewardPerTimeUnitSecond.mul(60 * 60 * 24 * 365);\n const rewardsInYearValue = rewardsInYear.mul(prices.spot[rewardInfo.token.mint.toString()].price);\n const apy = rewardsInYearValue.div(totalValue);\n return { apy, apr: calculateAPRFromAPY(apy) };\n }\n\n private getRewardPerTimeUnitSecond(reward: RewardInfo) {\n const now = new Decimal(new Date().getTime()).div(1000);\n let rewardPerTimeUnitSecond = new Decimal(0);\n for (let i = 0; i < reward.rewardScheduleCurve.points.length - 1; i++) {\n const { tsStart: tsStartThisPoint, rewardPerTimeUnit } = reward.rewardScheduleCurve.points[i];\n const { tsStart: tsStartNextPoint } = reward.rewardScheduleCurve.points[i + 1];\n\n const thisPeriodStart = new Decimal(tsStartThisPoint.toString());\n const thisPeriodEnd = new Decimal(tsStartNextPoint.toString());\n const rps = new Decimal(rewardPerTimeUnit.toString());\n if (thisPeriodStart <= now && thisPeriodEnd >= now) {\n rewardPerTimeUnitSecond = rps;\n break;\n } else if (thisPeriodStart > now && thisPeriodEnd > now) {\n rewardPerTimeUnitSecond = rps;\n break;\n }\n }\n\n const rewardTokenDecimals = reward.token.decimals.toNumber();\n const rewardAmountPerUnitDecimals = new Decimal(10).pow(reward.rewardsPerSecondDecimals.toString());\n const rewardAmountPerUnitLamports = new Decimal(10).pow(rewardTokenDecimals.toString());\n\n const rpsAdjusted = new Decimal(rewardPerTimeUnitSecond.toString())\n .div(rewardAmountPerUnitDecimals)\n .div(rewardAmountPerUnitLamports);\n\n return rewardPerTimeUnitSecond ? rpsAdjusted : new Decimal(0);\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValue: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n variableProtocolFee: Decimal;\n fixedHostFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowRate();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n const fixedHostInterestRate = this.getFixedHostInterestRate();\n\n const compoundedInterestRate = this.approximateCompoundedInterest(\n new Decimal(currentBorrowRate).plus(fixedHostInterestRate),\n slotsElapsed\n );\n const compoundedFixedRate = this.approximateCompoundedInterest(fixedHostInterestRate, slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundedInterestRate);\n const fixedHostFee = previousDebt.mul(compoundedFixedRate).sub(previousDebt);\n\n const netNewDebt = newDebt.sub(previousDebt).sub(fixedHostFee);\n\n const variableProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = variableProtocolFee\n .add(fixedHostFee)\n .sub(maxReferralFees)\n .add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n variableProtocolFee,\n fixedHostFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n\nexport async function createReserveIxs(\n connection: Connection,\n owner: PublicKey,\n lendingMarket: PublicKey,\n liquidityMint: PublicKey,\n reserveAddress: PublicKey,\n programId: PublicKey\n): Promise<TransactionInstruction[]> {\n const size = Reserve.layout.span + 8;\n\n const createReserveIx = SystemProgram.createAccount({\n fromPubkey: owner,\n newAccountPubkey: reserveAddress,\n lamports: await connection.getMinimumBalanceForRentExemption(size),\n space: size,\n programId: programId,\n });\n\n const { liquiditySupplyVault, collateralMint, collateralSupplyVault, feeVault } = reservePdas(\n programId,\n lendingMarket,\n liquidityMint\n );\n const [lendingMarketAuthority, _] = lendingMarketAuthPda(lendingMarket, programId);\n\n const accounts: InitReserveAccounts = {\n lendingMarketOwner: owner,\n lendingMarket: lendingMarket,\n lendingMarketAuthority: lendingMarketAuthority,\n reserve: reserveAddress,\n reserveLiquidityMint: liquidityMint,\n reserveLiquiditySupply: liquiditySupplyVault,\n feeReceiver: feeVault,\n reserveCollateralMint: collateralMint,\n reserveCollateralSupply: collateralSupplyVault,\n liquidityTokenProgram: TOKEN_PROGRAM_ID,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n };\n\n const initReserveIx = initReserve(accounts, programId);\n\n return [createReserveIx, initReserveIx];\n}\n\nexport function updateReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n modeDiscriminator: number,\n value: Uint8Array,\n programId: PublicKey\n): TransactionInstruction {\n value;\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(modeDiscriminator),\n value: value,\n skipValidation: false,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function updateEntireReserveConfigIx(\n marketWithAddress: MarketWithAddress,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n): TransactionInstruction {\n const layout = ReserveConfig.layout();\n const data = Buffer.alloc(1000);\n const len = layout.encode(reserveConfig.toEncodable(), data);\n const value = Uint8Array.from([...data.subarray(0, len)]);\n\n const args: UpdateReserveConfigArgs = {\n mode: new anchor.BN(25),\n value: value,\n skipValidation: true,\n };\n\n const accounts: UpdateReserveConfigAccounts = {\n lendingMarketOwner: marketWithAddress.state.lendingMarketOwner,\n lendingMarket: marketWithAddress.address,\n reserve: reserveAddress,\n };\n\n const ix = updateReserveConfig(args, accounts, programId);\n\n return ix;\n}\n\nexport function parseForChangesReserveConfigAndGetIxs(\n marketWithAddress: MarketWithAddress,\n reserve: Reserve | undefined,\n reserveAddress: PublicKey,\n reserveConfig: ReserveConfig,\n programId: PublicKey\n) {\n const updateReserveIxnsArgs: { mode: number; value: Uint8Array }[] = [];\n for (const key in reserveConfig.toEncodable()) {\n if (key === 'borrowRateCurve') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(UpdateBorrowRateCurve.discriminator, reserveConfig.borrowRateCurve),\n });\n } else {\n for (let i = 0; i < reserveConfig.borrowRateCurve.points.length; i++) {\n if (\n reserve.config.borrowRateCurve.points[i].utilizationRateBps !==\n reserveConfig.borrowRateCurve.points[i].utilizationRateBps ||\n reserve.config.borrowRateCurve.points[i].borrowRateBps !==\n reserveConfig.borrowRateCurve.points[i].borrowRateBps\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateBorrowRateCurve.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateBorrowRateCurve.discriminator,\n reserveConfig.borrowRateCurve\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'fees') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.borrowFeeSf.eq(reserveConfig.fees.borrowFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesBorrowFee.discriminator,\n reserveConfig.fees.borrowFeeSf.toNumber()\n ),\n });\n } else if (!reserve.config.fees.flashLoanFeeSf.eq(reserveConfig.fees.flashLoanFeeSf)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator,\n reserveConfig.fees.flashLoanFeeSf.toNumber()\n ),\n });\n }\n } else if (key === 'depositLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n } else if (!reserve.config.depositLimit.eq(reserveConfig.depositLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositLimit.discriminator,\n reserveConfig.depositLimit.toNumber()\n ),\n });\n }\n } else if (key === 'borrowLimit') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n } else if (!reserve.config.borrowLimit.eq(reserveConfig.borrowLimit)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowLimit.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowLimit.discriminator,\n reserveConfig.borrowLimit.toNumber()\n ),\n });\n }\n } else if (key === 'maxLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n } else if (reserve.config.maxLiquidationBonusBps !== reserveConfig.maxLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator,\n reserveConfig.maxLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'minLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n } else if (reserve.config.minLiquidationBonusBps !== reserveConfig.minLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator,\n reserveConfig.minLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'badDebtLiquidationBonusBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n } else if (reserve.config.badDebtLiquidationBonusBps !== reserveConfig.badDebtLiquidationBonusBps) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator,\n reserveConfig.badDebtLiquidationBonusBps\n ),\n });\n }\n } else if (key === 'liquidationThresholdPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n } else if (reserve.config.liquidationThresholdPct !== reserveConfig.liquidationThresholdPct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator,\n reserveConfig.liquidationThresholdPct\n ),\n });\n }\n } else if (key === 'protocolTakeRatePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n } else if (reserve.config.protocolTakeRatePct !== reserveConfig.protocolTakeRatePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolTakeRate.discriminator,\n reserveConfig.protocolTakeRatePct\n ),\n });\n }\n } else if (key === 'status') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n } else if (reserve.config.status !== reserveConfig.status) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateReserveStatus.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateReserveStatus.discriminator,\n reserveConfig.status\n ),\n });\n }\n } else if (key === 'disableUsageAsCollOutsideEmode') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n } else if (reserve.config.disableUsageAsCollOutsideEmode !== reserveConfig.disableUsageAsCollOutsideEmode) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator,\n reserveConfig.disableUsageAsCollOutsideEmode\n ),\n });\n }\n } else if (key === 'utilizationLimitBlockBorrowingAbove') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n } else if (\n reserve.config.utilizationLimitBlockBorrowingAbove !== reserveConfig.utilizationLimitBlockBorrowingAbove\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator,\n reserveConfig.utilizationLimitBlockBorrowingAbove\n ),\n });\n }\n } else if (key === 'deleveragingThresholdSlotsPerBps') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingThresholdSlotsPerBps.eq(reserveConfig.deleveragingThresholdSlotsPerBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator,\n reserveConfig.deleveragingThresholdSlotsPerBps.toNumber()\n ),\n });\n }\n } else if (key === 'depositWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.configCapacity.eq(reserveConfig.depositWithdrawalCap.configCapacity) ||\n !reserve.config.depositWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator, [\n reserveConfig.depositWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.depositWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (\n !reserve.config.depositWithdrawalCap.currentTotal.eq(reserveConfig.depositWithdrawalCap.currentTotal)\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator,\n reserveConfig.depositWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'debtWithdrawalCap') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n } else if (\n !reserve.config.debtWithdrawalCap.configCapacity.eq(reserveConfig.debtWithdrawalCap.configCapacity) ||\n !reserve.config.debtWithdrawalCap.configIntervalLengthSeconds.eq(\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator, [\n reserveConfig.debtWithdrawalCap.configCapacity.toNumber(),\n reserveConfig.debtWithdrawalCap.configIntervalLengthSeconds.toNumber(),\n ]),\n });\n } else if (!reserve.config.debtWithdrawalCap.currentTotal.eq(reserveConfig.debtWithdrawalCap.currentTotal)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator,\n reserveConfig.debtWithdrawalCap.currentTotal.toNumber()\n ),\n });\n }\n } else if (key === 'elevationGroups') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.elevationGroups.length; i++) {\n if (reserve.config.elevationGroups[i] !== reserveConfig.elevationGroups[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateElevationGroup.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateElevationGroup.discriminator,\n reserveConfig.elevationGroups\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'borrowFactorPct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n } else if (!reserve.config.borrowFactorPct.eq(reserveConfig.borrowFactorPct)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBorrowFactor.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBorrowFactor.discriminator,\n reserveConfig.borrowFactorPct.toNumber()\n ),\n });\n }\n } else if (key === 'loanToValuePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n } else if (reserve.config.loanToValuePct !== reserveConfig.loanToValuePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateLoanToValuePct.discriminator,\n reserveConfig.loanToValuePct\n ),\n });\n }\n } else if (key === 'protocolLiquidationFeePct') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n } else if (reserve.config.protocolLiquidationFeePct !== reserveConfig.protocolLiquidationFeePct) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator,\n reserveConfig.protocolLiquidationFeePct\n ),\n });\n }\n } else if (key === 'multiplierSideBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierSideBoost.length; i++) {\n if (reserve.config.multiplierSideBoost[i] !== reserveConfig.multiplierSideBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierSideBoost.discriminator,\n reserveConfig.multiplierSideBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'multiplierTagBoost') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n } else {\n for (let i = 0; i < reserveConfig.multiplierTagBoost.length; i++) {\n if (reserve.config.multiplierTagBoost[i] !== reserveConfig.multiplierTagBoost[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateMultiplierTagBoost.discriminator,\n reserveConfig.multiplierTagBoost\n ),\n });\n break;\n }\n }\n }\n } else if (key === 'deleveragingMarginCallPeriodSecs') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n } else if (!reserve.config.deleveragingMarginCallPeriodSecs.eq(reserveConfig.deleveragingMarginCallPeriodSecs)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator,\n reserveConfig.deleveragingMarginCallPeriodSecs.toNumber()\n ),\n });\n }\n } else if (key === 'assetTier') {\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n } else if (reserve.config.assetTier !== reserveConfig.assetTier) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateAssetTier.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateAssetTier.discriminator,\n reserveConfig.assetTier\n ),\n });\n }\n } else if (key === 'tokenInfo') {\n const tokenInfo = reserveConfig.tokenInfo;\n if (reserve === undefined) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(UpdateConfigMode.UpdateTokenInfoName.discriminator, tokenInfo.name),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n } else {\n for (let i = 0; i < tokenInfo.name.length; i++) {\n if (reserve.config.tokenInfo.name[i] !== tokenInfo.name[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoName.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoName.discriminator,\n tokenInfo.name\n ),\n });\n break;\n }\n }\n if (!reserve.config.tokenInfo.heuristic.lower.eq(tokenInfo.heuristic.lower)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator,\n tokenInfo.heuristic.lower.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.upper.eq(tokenInfo.heuristic.upper)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator,\n tokenInfo.heuristic.upper.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.heuristic.exp.eq(tokenInfo.heuristic.exp)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator,\n tokenInfo.heuristic.exp.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxTwapDivergenceBps.eq(tokenInfo.maxTwapDivergenceBps)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator,\n tokenInfo.maxTwapDivergenceBps.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgePriceSeconds.eq(tokenInfo.maxAgePriceSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator,\n tokenInfo.maxAgePriceSeconds.toNumber()\n ),\n });\n }\n if (!reserve.config.tokenInfo.maxAgeTwapSeconds.eq(tokenInfo.maxAgeTwapSeconds)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator,\n tokenInfo.maxAgeTwapSeconds.toNumber()\n ),\n });\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.priceChain.length; i++) {\n if (\n reserve.config.tokenInfo.scopeConfiguration.priceChain[i] !== tokenInfo.scopeConfiguration.priceChain[i]\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator,\n tokenInfo.scopeConfiguration.priceChain\n ),\n });\n break;\n }\n }\n for (let i = 0; i < tokenInfo.scopeConfiguration.twapChain.length; i++) {\n if (reserve.config.tokenInfo.scopeConfiguration.twapChain[i] !== tokenInfo.scopeConfiguration.twapChain[i]) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator,\n tokenInfo.scopeConfiguration.twapChain\n ),\n });\n break;\n }\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.priceAggregator.equals(\n tokenInfo.switchboardConfiguration.priceAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardFeed.discriminator,\n tokenInfo.switchboardConfiguration.priceAggregator\n ),\n });\n }\n if (\n !reserve.config.tokenInfo.switchboardConfiguration.twapAggregator.equals(\n tokenInfo.switchboardConfiguration.twapAggregator\n )\n ) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator,\n tokenInfo.switchboardConfiguration.twapAggregator\n ),\n });\n }\n if (!reserve.config.tokenInfo.pythConfiguration.price.equals(tokenInfo.pythConfiguration.price)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdatePythPrice.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdatePythPrice.discriminator,\n tokenInfo.pythConfiguration.price\n ),\n });\n }\n if (reserve.config.tokenInfo.blockPriceUsage !== tokenInfo.blockPriceUsage) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateBlockPriceUsage.discriminator,\n tokenInfo.blockPriceUsage\n ),\n });\n }\n if (!reserve.config.tokenInfo.scopeConfiguration.priceFeed.equals(tokenInfo.scopeConfiguration.priceFeed)) {\n updateReserveIxnsArgs.push({\n mode: UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n value: updateReserveConfigEncodedValue(\n UpdateConfigMode.UpdateScopePriceFeed.discriminator,\n tokenInfo.scopeConfiguration.priceFeed\n ),\n });\n }\n }\n }\n } // for loop\n\n const ixns: TransactionInstruction[] = [];\n\n updateReserveIxnsArgs.forEach((updateReserveConfigArgs) => {\n ixns.push(\n updateReserveConfigIx(\n marketWithAddress,\n reserveAddress,\n updateReserveConfigArgs.mode + 1,\n updateReserveConfigArgs.value,\n programId\n )\n );\n });\n\n return ixns;\n}\n\nexport function updateReserveConfigEncodedValue(\n discriminator: number,\n value: number | number[] | BorrowRateCurve | PublicKey\n): Uint8Array {\n let buffer: Buffer;\n let valueArray: number[] = [];\n\n switch (discriminator) {\n case UpdateConfigMode.UpdateLoanToValuePct.discriminator:\n case UpdateConfigMode.UpdateLiquidationThresholdPct.discriminator:\n case UpdateConfigMode.UpdateProtocolLiquidationFee.discriminator:\n case UpdateConfigMode.UpdateProtocolTakeRate.discriminator:\n case UpdateConfigMode.UpdateAssetTier.discriminator:\n case UpdateConfigMode.UpdateReserveStatus.discriminator:\n case UpdateConfigMode.UpdateDisableUsageAsCollateralOutsideEmode.discriminator:\n case UpdateConfigMode.UpdateBlockBorrowingAboveUtilization.discriminator:\n case UpdateConfigMode.UpdateBlockPriceUsage.discriminator:\n buffer = Buffer.alloc(1);\n buffer.writeUIntLE(value as number, 0, 1);\n break;\n case UpdateConfigMode.UpdateMaxLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateBadDebtLiquidationBonusBps.discriminator:\n case UpdateConfigMode.UpdateMinLiquidationBonusBps.discriminator:\n buffer = Buffer.alloc(2);\n buffer.writeUInt16LE(value as number, 0);\n break;\n case UpdateConfigMode.UpdateFeesBorrowFee.discriminator:\n case UpdateConfigMode.UpdateFeesFlashLoanFee.discriminator:\n case UpdateConfigMode.UpdateDepositLimit.discriminator:\n case UpdateConfigMode.UpdateBorrowLimit.discriminator:\n case UpdateConfigMode.UpdateTokenInfoLowerHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoUpperHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoExpHeuristic.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapDivergence.discriminator:\n case UpdateConfigMode.UpdateTokenInfoPriceMaxAge.discriminator:\n case UpdateConfigMode.UpdateTokenInfoTwapMaxAge.discriminator:\n case UpdateConfigMode.UpdateDebtWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCapCurrentTotal.discriminator:\n case UpdateConfigMode.DeleveragingMarginCallPeriod.discriminator:\n case UpdateConfigMode.UpdateBorrowFactor.discriminator:\n case UpdateConfigMode.DeleveragingThresholdSlotsPerBps.discriminator:\n value = value as number;\n buffer = Buffer.alloc(8);\n buffer.writeBigUint64LE(BigInt(value), 0);\n break;\n case UpdateConfigMode.UpdateTokenInfoScopeChain.discriminator:\n case UpdateConfigMode.UpdateTokenInfoScopeTwap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(8);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUInt16LE(valueArray[i], 2 * i);\n }\n break;\n case UpdateConfigMode.UpdateTokenInfoName.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(32);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateScopePriceFeed.discriminator:\n case UpdateConfigMode.UpdatePythPrice.discriminator:\n case UpdateConfigMode.UpdateSwitchboardFeed.discriminator:\n case UpdateConfigMode.UpdateSwitchboardTwapFeed.discriminator:\n case UpdateConfigMode.UpdateFarmCollateral.discriminator:\n case UpdateConfigMode.UpdateFarmDebt.discriminator:\n buffer = (value as PublicKey).toBuffer();\n break;\n case UpdateConfigMode.UpdateBorrowRateCurve.discriminator:\n buffer = serializeBorrowRateCurve(value as BorrowRateCurve);\n break;\n case UpdateConfigMode.UpdateDebtWithdrawalCap.discriminator:\n case UpdateConfigMode.UpdateDepositWithdrawalCap.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(16);\n buffer.writeBigUint64LE(BigInt(valueArray[0]), 0);\n buffer.writeBigUInt64LE(BigInt(valueArray[1]), 8);\n break;\n case UpdateConfigMode.UpdateElevationGroup.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(20);\n for (let i = 0; i < valueArray.length; i++) {\n buffer.writeUIntLE(valueArray[i], i, 1);\n }\n break;\n case UpdateConfigMode.UpdateMultiplierTagBoost.discriminator:\n case UpdateConfigMode.UpdateMultiplierSideBoost.discriminator:\n valueArray = value as number[];\n buffer = Buffer.alloc(2);\n buffer.writeUIntLE(valueArray[0], 0, 1);\n buffer.writeUIntLE(valueArray[1], 1, 1);\n break;\n default:\n buffer = Buffer.alloc(0);\n }\n\n return Uint8Array.from([...buffer]);\n}\n\nexport function serializeBorrowRateCurve(curve: BorrowRateCurve): Buffer {\n const buffer = Buffer.alloc(4 + 8 * curve.points.length);\n buffer.writeUInt32LE(curve.points.length, 0);\n for (let i = 0; i < curve.points.length; i++) {\n buffer.writeUInt32LE(curve.points[i].utilizationRateBps, 4 + 8 * i);\n buffer.writeUInt32LE(curve.points[i].borrowRateBps, 8 + 8 * i);\n }\n return buffer;\n}\n\nexport type ReserveWithAddress = {\n address: PublicKey;\n state: Reserve;\n};\n"]}
|