@bitgo/sdk-core 37.5.0 → 37.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/src/api/types.d.ts +1 -0
  2. package/dist/src/api/types.d.ts.map +1 -1
  3. package/dist/src/api/types.js +1 -1
  4. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +14 -1
  5. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  6. package/dist/src/bitgo/baseCoin/baseCoin.js +16 -1
  7. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +57 -0
  8. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  9. package/dist/src/bitgo/baseCoin/iBaseCoin.js +1 -1
  10. package/dist/src/bitgo/defi/defiVault.d.ts +80 -0
  11. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  12. package/dist/src/bitgo/defi/defiVault.js +201 -0
  13. package/dist/src/bitgo/defi/iDefiVault.d.ts +59 -0
  14. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  15. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  16. package/dist/src/bitgo/defi/index.d.ts +3 -0
  17. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  18. package/dist/src/bitgo/defi/index.js +22 -0
  19. package/dist/src/bitgo/index.d.ts +1 -0
  20. package/dist/src/bitgo/index.d.ts.map +1 -1
  21. package/dist/src/bitgo/index.js +2 -1
  22. package/dist/src/bitgo/internal/keycard.d.ts +2 -1
  23. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  24. package/dist/src/bitgo/internal/keycard.js +6 -3
  25. package/dist/src/bitgo/keychain/iKeychains.d.ts +4 -1
  26. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  27. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  28. package/dist/src/bitgo/keychain/keychains.d.ts +2 -1
  29. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  30. package/dist/src/bitgo/keychain/keychains.js +8 -3
  31. package/dist/src/bitgo/tss/common.d.ts +2 -1
  32. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  33. package/dist/src/bitgo/tss/common.js +14 -4
  34. package/dist/src/bitgo/utils/messageTypes.d.ts +3 -1
  35. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -1
  36. package/dist/src/bitgo/utils/messageTypes.js +3 -1
  37. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  38. package/dist/src/bitgo/utils/mpcUtils.js +23 -3
  39. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +25 -0
  40. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -1
  41. package/dist/src/bitgo/utils/tss/addressVerification.js +31 -13
  42. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +25 -3
  43. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  44. package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
  45. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +5 -2
  46. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  47. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +25 -16
  48. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +8 -1
  49. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
  50. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +47 -49
  51. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +2 -2
  52. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  53. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +25 -15
  54. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +18 -1
  55. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  56. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +77 -33
  57. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +5 -0
  58. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  59. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  60. package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
  61. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  62. package/dist/src/bitgo/utils/tss/index.js +2 -1
  63. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  64. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  65. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  66. package/dist/src/bitgo/wallet/iWallet.d.ts +6 -1
  67. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  68. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  69. package/dist/src/bitgo/wallet/iWallets.d.ts +26 -1
  70. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  71. package/dist/src/bitgo/wallet/iWallets.js +1 -1
  72. package/dist/src/bitgo/wallet/wallet.d.ts +9 -3
  73. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  74. package/dist/src/bitgo/wallet/wallet.js +79 -9
  75. package/dist/src/bitgo/wallet/wallets.d.ts +12 -2
  76. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  77. package/dist/src/bitgo/wallet/wallets.js +179 -20
  78. package/dist/src/coins/ofc.d.ts +4 -0
  79. package/dist/src/coins/ofc.d.ts.map +1 -1
  80. package/dist/src/coins/ofc.js +17 -2
  81. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  82. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  83. package/dist/test/unit/bitgo/defi/defiVault.js +283 -0
  84. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +45 -1
  85. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  86. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  87. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  88. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +53 -1
  89. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +88 -3
  90. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  91. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  92. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  93. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  94. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  95. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  96. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  97. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  98. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
  99. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  100. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  101. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +320 -0
  102. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +16 -12
  103. package/dist/tsconfig.tsbuildinfo +1 -1
  104. package/package.json +3 -3
@@ -22,6 +22,10 @@ export declare class Ofc extends BaseCoin {
22
22
  /**
23
23
  * Return boolean indicating whether input is valid public key for the coin.
24
24
  *
25
+ * OFC wallets hold keys in two formats: the user key is a BIP-32 base58 xpub,
26
+ * and the BitGo key (source: 'bitgo') is a base64-encoded SPKI (DER-wrapped)
27
+ * secp256k1 public key. Both are valid.
28
+ *
25
29
  * @param {String} pub the pub to be checked
26
30
  * @returns {Boolean} is it valid?
27
31
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ofc.d.ts","sourceRoot":"","sources":["../../../src/coins/ofc.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,OAAO,EAEP,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,EACP,MAAM,KAAK,CAAC;AAEb,qBAAa,GAAI,SAAQ,QAAQ;gBACnB,KAAK,EAAE,SAAS;IAI5B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ;IAIjD,QAAQ;IAIR;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAevC,SAAS;IAIT,WAAW;IAIX;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAInD;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQhC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,aAAa,IAAI,MAAM,GAAG,MAAM;IAI1B,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/D,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjF;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACnE;;;;OAIG;IACG,WAAW,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASzE,kBAAkB;IAClB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB;CAGlD"}
1
+ {"version":3,"file":"ofc.d.ts","sourceRoot":"","sources":["../../../src/coins/ofc.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,OAAO,EAEP,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,EACP,MAAM,KAAK,CAAC;AAEb,qBAAa,GAAI,SAAQ,QAAQ;gBACnB,KAAK,EAAE,SAAS;IAI5B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,QAAQ;IAIjD,QAAQ;IAIR;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAevC,SAAS;IAIT,WAAW;IAIX;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAInD;;;;;;;;;OASG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAkBhC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,aAAa,IAAI,MAAM,GAAG,MAAM;IAI1B,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/D,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrE,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjF;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACnE;;;;OAIG;IACG,WAAW,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASzE,kBAAkB;IAClB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB;CAGlD"}
@@ -52,12 +52,27 @@ class Ofc extends __1.BaseCoin {
52
52
  /**
53
53
  * Return boolean indicating whether input is valid public key for the coin.
54
54
  *
55
+ * OFC wallets hold keys in two formats: the user key is a BIP-32 base58 xpub,
56
+ * and the BitGo key (source: 'bitgo') is a base64-encoded SPKI (DER-wrapped)
57
+ * secp256k1 public key. Both are valid.
58
+ *
55
59
  * @param {String} pub the pub to be checked
56
60
  * @returns {Boolean} is it valid?
57
61
  */
58
62
  isValidPub(pub) {
63
+ // BIP-32 base58 xpub (user key)
64
+ try {
65
+ if (utxo_lib_1.bip32.fromBase58(pub).isNeutered()) {
66
+ return true;
67
+ }
68
+ }
69
+ catch (e) {
70
+ // not a BIP-32 key; fall through to the SPKI check
71
+ }
72
+ // base64-encoded SPKI DER secp256k1 public key (BitGo key)
59
73
  try {
60
- return utxo_lib_1.bip32.fromBase58(pub).isNeutered();
74
+ const key = (0, crypto_1.createPublicKey)({ key: Buffer.from(pub, 'base64'), format: 'der', type: 'spki' });
75
+ return key.asymmetricKeyType === 'ec' && key.asymmetricKeyDetails?.namedCurve === 'secp256k1';
61
76
  }
62
77
  catch (e) {
63
78
  return false;
@@ -94,4 +109,4 @@ class Ofc extends __1.BaseCoin {
94
109
  }
95
110
  }
96
111
  exports.Ofc = Ofc;
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvaW5zL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILG1DQUFxQztBQUNyQyw4Q0FBd0M7QUFDeEMsMkJBYWE7QUFFYixNQUFhLEdBQUksU0FBUSxZQUFRO0lBQy9CLFlBQVksS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0I7UUFDcEMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLElBQWE7UUFDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsMEVBQTBFO1lBQzFFLDBFQUEwRTtZQUMxRSxrRUFBa0U7WUFDbEUsSUFBSSxHQUFHLElBQUEsb0JBQVcsRUFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLGdCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUE0QjtRQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVLENBQUMsR0FBVztRQUNwQixJQUFJLENBQUM7WUFDSCxPQUFPLGdCQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE1BQU0sSUFBSSw2QkFBeUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQStCO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBNEI7UUFDaEQsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFnQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQThCO1FBQ2xELE1BQU0sSUFBSSw2QkFBeUIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFjRCxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQXFDLEVBQUUsT0FBZTtRQUN0RSxJQUFJLENBQUMsQ0FBQyxXQUFXLFlBQVksVUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbEcsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsTUFBK0I7UUFDL0MsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztDQUNGO0FBL0dELGtCQStHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBLZXlQYWlyLFxuICBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXQsXG59IGZyb20gJy4uLyc7XG5cbmV4cG9ydCBjbGFzcyBPZmMgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UpIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSk6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IE9mYyhiaXRnbyk7XG4gIH1cblxuICBnZXRDaGFpbigpIHtcbiAgICByZXR1cm4gJ29mYyc7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgc2VjcDI1NmsxIGtleSBwYWlyXG4gICAqXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IG9iamVjdCB3aXRoIGdlbmVyYXRlZCBwdWIgYW5kIHBydlxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGhhcyBib3RoIGEgbm9ybWFsIDI1NiBiaXQgcHJpdmF0ZSBrZXkgYW5kIGEgMjU2XG4gICAgICAvLyBiaXQgY2hhaW4gY29kZSwgYm90aCBvZiB3aGljaCBtdXN0IGJlIHJhbmRvbS4gNTEyIGJpdHMgaXMgdGhlcmVmb3JlIHRoZVxuICAgICAgLy8gbWF4aW11bSBlbnRyb3B5IGFuZCBnaXZlcyB1cyBtYXhpbXVtIHNlY3VyaXR5IGFnYWluc3QgY3JhY2tpbmcuXG4gICAgICBzZWVkID0gcmFuZG9tQnl0ZXMoNTEyIC8gOCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dGVuZGVkS2V5ID0gYmlwMzIuZnJvbVNlZWQoc2VlZCk7XG4gICAgY29uc3QgeHB1YiA9IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHViOiB4cHViLFxuICAgICAgcHJ2OiBleHRlbmRlZEtleS50b0Jhc2U1OCgpLFxuICAgIH07XG4gIH1cblxuICBnZXRGYW1pbHkoKSB7XG4gICAgcmV0dXJuICdvZmMnO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKSB7XG4gICAgcmV0dXJuICdPZmZjaGFpbic7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG0gb2YgbiB3YWxsZXQgc2lnbmVycy8ga2V5IGFtb3VudHMgYXJlIHZhbGlkIGZvciB0aGUgY29pblxuICAgKi9cbiAgaXNWYWxpZE1vZk5TZXR1cCh7IG0sIG4gfTogeyBtOiBudW1iZXI7IG46IG51bWJlciB9KSB7XG4gICAgcmV0dXJuIG0gPT09IDEgJiYgbiA9PT0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgdmFsaWQgcHVibGljIGtleSBmb3IgdGhlIGNvaW4uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWIgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHtCb29sZWFufSBpcyBpdCB2YWxpZD9cbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJpcDMyLmZyb21CYXNlNTgocHViKS5pc05ldXRlcmVkKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB8IHN0cmluZyB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgdXNpbmcgYSB0cmFkaW5nIHdhbGxldCdzIEJpdEdvIEtleVxuICAgKiBAcGFyYW0gd2FsbGV0IC0gdXNlcyB0aGUgQml0R28ga2V5IG9mIHRoaXMgdHJhZGluZyB3YWxsZXQgdG8gc2lnbiB0aGUgbWVzc2FnZSByZW1vdGVseSBpbiBhIEtNU1xuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uod2FsbGV0OiBXYWxsZXQsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPjtcbiAgLyoqXG4gICAqIFNpZ25zIGEgbWVzc2FnZSB1c2luZyB0aGUgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIGtleSAtIHVzZXMgdGhlIHByaXZhdGUga2V5IHRvIHNpZ24gdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleTogeyBwcnY6IHN0cmluZyB9LCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj47XG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleU9yV2FsbGV0OiB7IHBydjogc3RyaW5nIH0gfCBXYWxsZXQsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKCEoa2V5T3JXYWxsZXQgaW5zdGFuY2VvZiBXYWxsZXQpKSB7XG4gICAgICByZXR1cm4gc3VwZXIuc2lnbk1lc3NhZ2Uoa2V5T3JXYWxsZXQsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmVIZXhTdHJpbmcgPSBhd2FpdCBrZXlPcldhbGxldC50b1RyYWRpbmdBY2NvdW50KCkuc2lnblBheWxvYWQoeyBwYXlsb2FkOiBtZXNzYWdlIH0pO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShzaWduYXR1cmVIZXhTdHJpbmcsICdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleShwYXJhbXM6IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKSB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxufVxuIl19
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvaW5zL29mYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILG1DQUFzRDtBQUN0RCw4Q0FBd0M7QUFDeEMsMkJBYWE7QUFFYixNQUFhLEdBQUksU0FBUSxZQUFRO0lBQy9CLFlBQVksS0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0I7UUFDcEMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLElBQWE7UUFDM0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsMEVBQTBFO1lBQzFFLDBFQUEwRTtZQUMxRSxrRUFBa0U7WUFDbEUsSUFBSSxHQUFHLElBQUEsb0JBQVcsRUFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLGdCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUk7WUFDVCxHQUFHLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUE0QjtRQUNqRCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsVUFBVSxDQUFDLEdBQVc7UUFDcEIsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQztZQUNILElBQUksZ0JBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxtREFBbUQ7UUFDckQsQ0FBQztRQUNELDJEQUEyRDtRQUMzRCxJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxJQUFBLHdCQUFlLEVBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM5RixPQUFPLEdBQUcsQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLG9CQUFvQixFQUFFLFVBQVUsS0FBSyxXQUFXLENBQUM7UUFDaEcsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLE9BQWU7UUFDNUIsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBK0I7UUFDcEQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUE0QjtRQUNoRCxNQUFNLElBQUksNkJBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQWdDO1FBQ3RELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBOEI7UUFDbEQsTUFBTSxJQUFJLDZCQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQWNELEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBcUMsRUFBRSxPQUFlO1FBQ3RFLElBQUksQ0FBQyxDQUFDLFdBQVcsWUFBWSxVQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxNQUErQjtRQUMvQyxNQUFNLElBQUksNkJBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUE3SEQsa0JBNkhDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgY3JlYXRlUHVibGljS2V5LCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQge1xuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgS2V5UGFpcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0LFxufSBmcm9tICcuLi8nO1xuXG5leHBvcnQgY2xhc3MgT2ZjIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UpOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBPZmMoYml0Z28pO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKSB7XG4gICAgcmV0dXJuICdvZmMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHNlY3AyNTZrMSBrZXkgcGFpclxuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBnZW5lcmF0ZWQgcHViIGFuZCBwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgaWYgKCFzZWVkKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBwcml2YXRlIGtleSBoYXMgYm90aCBhIG5vcm1hbCAyNTYgYml0IHByaXZhdGUga2V5IGFuZCBhIDI1NlxuICAgICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAgIC8vIG1heGltdW0gZW50cm9weSBhbmQgZ2l2ZXMgdXMgbWF4aW11bSBzZWN1cml0eSBhZ2FpbnN0IGNyYWNraW5nLlxuICAgICAgc2VlZCA9IHJhbmRvbUJ5dGVzKDUxMiAvIDgpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbmRlZEtleSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIGNvbnN0IHhwdWIgPSBleHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogeHB1YixcbiAgICAgIHBydjogZXh0ZW5kZWRLZXkudG9CYXNlNTgoKSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0RmFtaWx5KCkge1xuICAgIHJldHVybiAnb2ZjJztcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiAnT2ZmY2hhaW4nO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBtIG9mIG4gd2FsbGV0IHNpZ25lcnMvIGtleSBhbW91bnRzIGFyZSB2YWxpZCBmb3IgdGhlIGNvaW5cbiAgICovXG4gIGlzVmFsaWRNb2ZOU2V0dXAoeyBtLCBuIH06IHsgbTogbnVtYmVyOyBuOiBudW1iZXIgfSkge1xuICAgIHJldHVybiBtID09PSAxICYmIG4gPT09IDE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBPRkMgd2FsbGV0cyBob2xkIGtleXMgaW4gdHdvIGZvcm1hdHM6IHRoZSB1c2VyIGtleSBpcyBhIEJJUC0zMiBiYXNlNTggeHB1YixcbiAgICogYW5kIHRoZSBCaXRHbyBrZXkgKHNvdXJjZTogJ2JpdGdvJykgaXMgYSBiYXNlNjQtZW5jb2RlZCBTUEtJIChERVItd3JhcHBlZClcbiAgICogc2VjcDI1NmsxIHB1YmxpYyBrZXkuIEJvdGggYXJlIHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQklQLTMyIGJhc2U1OCB4cHViICh1c2VyIGtleSlcbiAgICB0cnkge1xuICAgICAgaWYgKGJpcDMyLmZyb21CYXNlNTgocHViKS5pc05ldXRlcmVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gbm90IGEgQklQLTMyIGtleTsgZmFsbCB0aHJvdWdoIHRvIHRoZSBTUEtJIGNoZWNrXG4gICAgfVxuICAgIC8vIGJhc2U2NC1lbmNvZGVkIFNQS0kgREVSIHNlY3AyNTZrMSBwdWJsaWMga2V5IChCaXRHbyBrZXkpXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleSA9IGNyZWF0ZVB1YmxpY0tleSh7IGtleTogQnVmZmVyLmZyb20ocHViLCAnYmFzZTY0JyksIGZvcm1hdDogJ2RlcicsIHR5cGU6ICdzcGtpJyB9KTtcbiAgICAgIHJldHVybiBrZXkuYXN5bW1ldHJpY0tleVR5cGUgPT09ICdlYycgJiYga2V5LmFzeW1tZXRyaWNLZXlEZXRhaWxzPy5uYW1lZEN1cnZlID09PSAnc2VjcDI1NmsxJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgbWVzc2FnZSB1c2luZyBhIHRyYWRpbmcgd2FsbGV0J3MgQml0R28gS2V5XG4gICAqIEBwYXJhbSB3YWxsZXQgLSB1c2VzIHRoZSBCaXRHbyBrZXkgb2YgdGhpcyB0cmFkaW5nIHdhbGxldCB0byBzaWduIHRoZSBtZXNzYWdlIHJlbW90ZWx5IGluIGEgS01TXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZSh3YWxsZXQ6IFdhbGxldCwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+O1xuICAvKipcbiAgICogU2lnbnMgYSBtZXNzYWdlIHVzaW5nIHRoZSBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ga2V5IC0gdXNlcyB0aGUgcHJpdmF0ZSBrZXkgdG8gc2lnbiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5OiB7IHBydjogc3RyaW5nIH0sIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPjtcbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5T3JXYWxsZXQ6IHsgcHJ2OiBzdHJpbmcgfSB8IFdhbGxldCwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAoIShrZXlPcldhbGxldCBpbnN0YW5jZW9mIFdhbGxldCkpIHtcbiAgICAgIHJldHVybiBzdXBlci5zaWduTWVzc2FnZShrZXlPcldhbGxldCwgbWVzc2FnZSk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hdHVyZUhleFN0cmluZyA9IGF3YWl0IGtleU9yV2FsbGV0LnRvVHJhZGluZ0FjY291bnQoKS5zaWduUGF5bG9hZCh7IHBheWxvYWQ6IG1lc3NhZ2UgfSk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZUhleFN0cmluZywgJ2hleCcpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHBhcmFtczogQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMpIHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import 'should';
2
+ //# sourceMappingURL=defiVault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defiVault.d.ts","sourceRoot":"","sources":["../../../../../test/unit/bitgo/defi/defiVault.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,CAAC"}
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sinon_1 = __importDefault(require("sinon"));
7
+ const assert_1 = __importDefault(require("assert"));
8
+ require("should");
9
+ const src_1 = require("../../../../src");
10
+ describe('DefiVault', function () {
11
+ let wallet;
12
+ let defiVault;
13
+ let mockBitGo;
14
+ let mockBaseCoin;
15
+ // Helper to create a chainable request mock
16
+ function mockRequest(result) {
17
+ return {
18
+ send: sinon_1.default.stub().returnsThis(),
19
+ query: sinon_1.default.stub().returnsThis(),
20
+ result: sinon_1.default.stub().resolves(result),
21
+ };
22
+ }
23
+ beforeEach(function () {
24
+ mockBitGo = {
25
+ post: sinon_1.default.stub(),
26
+ get: sinon_1.default.stub(),
27
+ del: sinon_1.default.stub(),
28
+ url: sinon_1.default.stub().callsFake((path, version) => `https://bitgo.com/api/v${version}${path}`),
29
+ microservicesUrl: sinon_1.default.stub().callsFake((path) => `https://bitgo.com${path}`),
30
+ setRequestTracer: sinon_1.default.stub(),
31
+ };
32
+ mockBaseCoin = {
33
+ getFamily: sinon_1.default.stub().returns('eth'),
34
+ url: sinon_1.default.stub(),
35
+ keychains: sinon_1.default.stub(),
36
+ supportsTss: sinon_1.default.stub().returns(true),
37
+ getMPCAlgorithm: sinon_1.default.stub(),
38
+ };
39
+ const mockWalletData = {
40
+ id: 'test-wallet-id',
41
+ coin: 'eth',
42
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
43
+ };
44
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
45
+ defiVault = wallet.defi;
46
+ });
47
+ afterEach(function () {
48
+ sinon_1.default.restore();
49
+ });
50
+ describe('depositToVault', function () {
51
+ it('should call sendMany for approve and deposit on happy path', async function () {
52
+ const operationId = 'op-uuid-123';
53
+ // Mock sendMany for approve and deposit
54
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
55
+ sendManyStub.onFirstCall().resolves({
56
+ txRequest: {
57
+ txRequestId: 'txreq-approve-1',
58
+ intent: { intentType: 'defi-approve', operationId },
59
+ },
60
+ });
61
+ sendManyStub.onSecondCall().resolves({
62
+ txRequest: {
63
+ txRequestId: 'txreq-deposit-1',
64
+ intent: { intentType: 'defi-deposit', operationId },
65
+ },
66
+ });
67
+ const result = await defiVault.depositToVault({
68
+ vaultId: 'vlt-galaxy-usdc',
69
+ amount: '1000000',
70
+ });
71
+ result.operationId.should.equal(operationId);
72
+ result.txRequestIds.approve.should.equal('txreq-approve-1');
73
+ result.txRequestIds.deposit.should.equal('txreq-deposit-1');
74
+ // Verify sendMany was called with correct params for approve
75
+ sendManyStub.calledTwice.should.be.true();
76
+ const approveArgs = sendManyStub.firstCall.args[0];
77
+ approveArgs.type.should.equal('defiApprove');
78
+ approveArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
79
+ approveArgs.defiParams.amount.should.equal('1000000');
80
+ // Verify sendMany was called with correct params for deposit
81
+ const depositArgs = sendManyStub.secondCall.args[0];
82
+ depositArgs.type.should.equal('defiDeposit');
83
+ depositArgs.defiParams.operationId.should.equal(operationId);
84
+ });
85
+ // TODO(CGD-1709): Re-enable when active operation pre-flight check is restored
86
+ xit('should reject when an active operation already exists', async function () {
87
+ const preflightReq = mockRequest({
88
+ items: [{ operationId: 'existing-op-id', state: 'APPROVE_TX_REQUESTED' }],
89
+ });
90
+ mockBitGo.get.returns(preflightReq);
91
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), (err) => {
92
+ (err instanceof src_1.ActiveOperationExistsError).should.be.true();
93
+ err.operationId.should.equal('existing-op-id');
94
+ return true;
95
+ });
96
+ });
97
+ it('should propagate deposit sendMany failure without cleanup', async function () {
98
+ const operationId = 'op-uuid-456';
99
+ // Mock sendMany: approve succeeds, deposit fails
100
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
101
+ sendManyStub.onFirstCall().resolves({
102
+ txRequest: {
103
+ txRequestId: 'txreq-approve-2',
104
+ intent: { intentType: 'defi-approve', operationId },
105
+ },
106
+ });
107
+ sendManyStub.onSecondCall().rejects(new Error('deposit creation failed'));
108
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
109
+ message: 'deposit creation failed',
110
+ });
111
+ // SDK does not attempt cleanup — reconciler handles orphaned approvals
112
+ mockBitGo.del.called.should.be.false();
113
+ });
114
+ it('should throw if vaultId is missing', async function () {
115
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
116
+ message: 'vaultId is required',
117
+ });
118
+ });
119
+ it('should throw if amount is missing', async function () {
120
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
121
+ message: 'amount is required',
122
+ });
123
+ });
124
+ it('should pass clientIdempotencyKey and walletPassphrase when provided', async function () {
125
+ const operationId = 'op-uuid-789';
126
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
127
+ sendManyStub.onFirstCall().resolves({
128
+ txRequest: {
129
+ txRequestId: 'txreq-approve-3',
130
+ intent: { intentType: 'defi-approve', operationId },
131
+ },
132
+ });
133
+ sendManyStub.onSecondCall().resolves({
134
+ txRequest: {
135
+ txRequestId: 'txreq-deposit-3',
136
+ intent: { intentType: 'defi-deposit', operationId },
137
+ },
138
+ });
139
+ await defiVault.depositToVault({
140
+ vaultId: 'vlt-galaxy-usdc',
141
+ amount: '1000000',
142
+ clientIdempotencyKey: 'idem-key-123',
143
+ walletPassphrase: 'test-passphrase',
144
+ });
145
+ const approveArgs = sendManyStub.firstCall.args[0];
146
+ approveArgs.defiParams.clientIdempotencyKey.should.equal('idem-key-123');
147
+ approveArgs.walletPassphrase.should.equal('test-passphrase');
148
+ const depositArgs = sendManyStub.secondCall.args[0];
149
+ depositArgs.defiParams.clientIdempotencyKey.should.equal('idem-key-123');
150
+ depositArgs.walletPassphrase.should.equal('test-passphrase');
151
+ });
152
+ });
153
+ describe('resumeDeposit', function () {
154
+ it('should issue the deposit sendMany for a partial operation', async function () {
155
+ const operation = {
156
+ operationId: 'op-resume-1',
157
+ walletId: 'test-wallet-id',
158
+ vaultId: 'vlt-galaxy-usdc',
159
+ type: 'DEPOSIT',
160
+ assetAmount: '1000000',
161
+ state: 'APPROVE_TX_REQUESTED',
162
+ txRequestId: 'txreq-approve-existing',
163
+ associatedTxRequestId: undefined,
164
+ createdAt: '2026-05-14T07:12:00Z',
165
+ updatedAt: '2026-05-14T07:12:00Z',
166
+ };
167
+ // getOperation call
168
+ const getOpReq = mockRequest(operation);
169
+ mockBitGo.get.returns(getOpReq);
170
+ // deposit sendMany
171
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
172
+ sendManyStub.resolves({
173
+ txRequest: {
174
+ txRequestId: 'txreq-deposit-resume',
175
+ intent: { intentType: 'defi-deposit', operationId: 'op-resume-1' },
176
+ },
177
+ });
178
+ const result = await defiVault.resumeDeposit({ operationId: 'op-resume-1' });
179
+ result.operationId.should.equal('op-resume-1');
180
+ result.txRequestIds.approve.should.equal('txreq-approve-existing');
181
+ result.txRequestIds.deposit.should.equal('txreq-deposit-resume');
182
+ // Verify sendMany was called with correct defiParams
183
+ const depositArgs = sendManyStub.firstCall.args[0];
184
+ depositArgs.type.should.equal('defiDeposit');
185
+ depositArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
186
+ depositArgs.defiParams.amount.should.equal('1000000');
187
+ depositArgs.defiParams.operationId.should.equal('op-resume-1');
188
+ });
189
+ it('should throw if deposit txRequest already exists', async function () {
190
+ const operation = {
191
+ operationId: 'op-already-done',
192
+ walletId: 'test-wallet-id',
193
+ vaultId: 'vlt-galaxy-usdc',
194
+ type: 'DEPOSIT',
195
+ assetAmount: '1000000',
196
+ state: 'DEPOSIT_TX_REQUESTED',
197
+ txRequestId: 'txreq-approve-x',
198
+ associatedTxRequestId: 'txreq-deposit-x',
199
+ createdAt: '2026-05-14T07:12:00Z',
200
+ updatedAt: '2026-05-14T07:12:00Z',
201
+ };
202
+ const getOpReq = mockRequest(operation);
203
+ mockBitGo.get.returns(getOpReq);
204
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: 'op-already-done' }), {
205
+ message: 'Deposit txRequest already exists for this operation; nothing to resume',
206
+ });
207
+ });
208
+ it('should throw if operationId is missing', async function () {
209
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: '' }), { message: 'operationId is required' });
210
+ });
211
+ });
212
+ describe('getOperation', function () {
213
+ it('should fetch an operation by ID', async function () {
214
+ const operation = {
215
+ operationId: 'op-get-1',
216
+ walletId: 'test-wallet-id',
217
+ vaultId: 'vlt-galaxy-usdc',
218
+ type: 'DEPOSIT',
219
+ assetAmount: '1000000',
220
+ state: 'COMPLETED',
221
+ txRequestId: 'txreq-1',
222
+ associatedTxRequestId: 'txreq-2',
223
+ createdAt: '2026-05-14T07:12:00Z',
224
+ updatedAt: '2026-05-14T07:18:00Z',
225
+ };
226
+ const req = mockRequest(operation);
227
+ mockBitGo.get.returns(req);
228
+ const result = await defiVault.getOperation({ operationId: 'op-get-1' });
229
+ result.should.deepEqual(operation);
230
+ });
231
+ it('should throw if operationId is missing', async function () {
232
+ await assert_1.default.rejects(() => defiVault.getOperation({ operationId: '' }), { message: 'operationId is required' });
233
+ });
234
+ });
235
+ describe('listOperations', function () {
236
+ it('should list operations for a vault', async function () {
237
+ const listResult = {
238
+ items: [
239
+ {
240
+ operationId: 'op-1',
241
+ walletId: 'test-wallet-id',
242
+ vaultId: 'vlt-galaxy-usdc',
243
+ type: 'DEPOSIT',
244
+ assetAmount: '1000000',
245
+ state: 'COMPLETED',
246
+ createdAt: '2026-05-14T07:12:00Z',
247
+ updatedAt: '2026-05-14T07:18:00Z',
248
+ },
249
+ ],
250
+ nextCursor: 'cursor-abc',
251
+ };
252
+ const req = mockRequest(listResult);
253
+ mockBitGo.get.returns(req);
254
+ const result = await defiVault.listOperations({
255
+ vaultId: 'vlt-galaxy-usdc',
256
+ state: 'COMPLETED',
257
+ limit: 10,
258
+ });
259
+ result.items.length.should.equal(1);
260
+ result.nextCursor.should.equal('cursor-abc');
261
+ // Verify query params
262
+ const queryArgs = req.query.firstCall.args[0];
263
+ queryArgs.vaultId.should.equal('vlt-galaxy-usdc');
264
+ queryArgs.state.should.equal('COMPLETED');
265
+ queryArgs.limit.should.equal(10);
266
+ });
267
+ it('should throw if vaultId is missing', async function () {
268
+ await assert_1.default.rejects(() => defiVault.listOperations({ vaultId: '' }), { message: 'vaultId is required' });
269
+ });
270
+ });
271
+ describe('wallet.defi getter', function () {
272
+ it('should return a DefiVault instance', function () {
273
+ const defi = wallet.defi;
274
+ (defi instanceof src_1.DefiVault).should.be.true();
275
+ });
276
+ it('should return the same instance on subsequent calls', function () {
277
+ const defi1 = wallet.defi;
278
+ const defi2 = wallet.defi;
279
+ (defi1 === defi2).should.be.true();
280
+ });
281
+ });
282
+ });
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaVZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2RlZmkvZGVmaVZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIseUNBQWdGO0FBRWhGLFFBQVEsQ0FBQyxXQUFXLEVBQUU7SUFDcEIsSUFBSSxNQUFjLENBQUM7SUFDbkIsSUFBSSxTQUFvQixDQUFDO0lBQ3pCLElBQUksU0FBYyxDQUFDO0lBQ25CLElBQUksWUFBaUIsQ0FBQztJQUV0Qiw0Q0FBNEM7SUFDNUMsU0FBUyxXQUFXLENBQUMsTUFBVztRQUM5QixPQUFPO1lBQ0wsSUFBSSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDaEMsS0FBSyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDakMsTUFBTSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQsVUFBVSxDQUFDO1FBQ1QsU0FBUyxHQUFHO1lBQ1YsSUFBSSxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDbEIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsR0FBRyxFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsT0FBZSxFQUFFLEVBQUUsQ0FBQywwQkFBMEIsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO1lBQzFHLGdCQUFnQixFQUFFLGVBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztZQUN0Rixn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QUFJLENBQUM7WUFDMUIsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICdzaG91bGQnO1xuaW1wb3J0IHsgQWN0aXZlT3BlcmF0aW9uRXhpc3RzRXJyb3IsIERlZmlWYXVsdCwgV2FsbGV0IH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ0RlZmlWYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IHdhbGxldDogV2FsbGV0O1xuICBsZXQgZGVmaVZhdWx0OiBEZWZpVmF1bHQ7XG4gIGxldCBtb2NrQml0R286IGFueTtcbiAgbGV0IG1vY2tCYXNlQ29pbjogYW55O1xuXG4gIC8vIEhlbHBlciB0byBjcmVhdGUgYSBjaGFpbmFibGUgcmVxdWVzdCBtb2NrXG4gIGZ1bmN0aW9uIG1vY2tSZXF1ZXN0KHJlc3VsdDogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbmQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgcXVlcnk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzdWx0KSxcbiAgICB9O1xuICB9XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgICAgZ2V0OiBzaW5vbi5zdHViKCksXG4gICAgICBkZWw6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXIpID0+IGBodHRwczovL2JpdGdvLmNvbS9hcGkvdiR7dmVyc2lvbn0ke3BhdGh9YCksXG4gICAgICBtaWNyb3NlcnZpY2VzVXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IGBodHRwczovL2JpdGdvLmNvbSR7cGF0aH1gKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnZXRoJyksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHRydWUpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBjb2luOiAnZXRoJyxcbiAgICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICB9O1xuXG4gICAgd2FsbGV0ID0gbmV3IFdhbGxldChtb2NrQml0R28sIG1vY2tCYXNlQ29pbiwgbW9ja1dhbGxldERhdGEpO1xuICAgIGRlZmlWYXVsdCA9IHdhbGxldC5kZWZpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNpbm9uLnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlcG9zaXRUb1ZhdWx0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzZW5kTWFueSBmb3IgYXBwcm92ZSBhbmQgZGVwb3NpdCBvbiBoYXBweSBwYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSAnb3AtdXVpZC0xMjMnO1xuXG4gICAgICAvLyBNb2NrIHNlbmRNYW55IGZvciBhcHByb3ZlIGFuZCBkZXBvc2l0XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYXBwcm92ZS0xJyxcbiAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScsIG9wZXJhdGlvbklkIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtZGVwb3NpdC0xJyxcbiAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktZGVwb3NpdCcsIG9wZXJhdGlvbklkIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHtcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdElkcy5hcHByb3ZlLnNob3VsZC5lcXVhbCgndHhyZXEtYXBwcm92ZS0xJyk7XG4gICAgICByZXN1bHQudHhSZXF1ZXN0SWRzLmRlcG9zaXQuc2hvdWxkLmVxdWFsKCd0eHJlcS1kZXBvc2l0LTEnKTtcblxuICAgICAgLy8gVmVyaWZ5IHNlbmRNYW55IHdhcyBjYWxsZWQgd2l0aCBjb3JyZWN0IHBhcmFtcyBmb3IgYXBwcm92ZVxuICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZFR3aWNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBjb25zdCBhcHByb3ZlQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYXBwcm92ZUFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlBcHByb3ZlJyk7XG4gICAgICBhcHByb3ZlQXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgIGFwcHJvdmVBcmdzLmRlZmlQYXJhbXMuYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuXG4gICAgICAvLyBWZXJpZnkgc2VuZE1hbnkgd2FzIGNhbGxlZCB3aXRoIGNvcnJlY3QgcGFyYW1zIGZvciBkZXBvc2l0XG4gICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLnNlY29uZENhbGwuYXJnc1swXTtcbiAgICAgIGRlcG9zaXRBcmdzLnR5cGUuc2hvdWxkLmVxdWFsKCdkZWZpRGVwb3NpdCcpO1xuICAgICAgZGVwb3NpdEFyZ3MuZGVmaVBhcmFtcy5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgIH0pO1xuXG4gICAgLy8gVE9ETyhDR0QtMTcwOSk6IFJlLWVuYWJsZSB3aGVuIGFjdGl2ZSBvcGVyYXRpb24gcHJlLWZsaWdodCBjaGVjayBpcyByZXN0b3JlZFxuICAgIHhpdCgnc2hvdWxkIHJlamVjdCB3aGVuIGFuIGFjdGl2ZSBvcGVyYXRpb24gYWxyZWFkeSBleGlzdHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwcmVmbGlnaHRSZXEgPSBtb2NrUmVxdWVzdCh7XG4gICAgICAgIGl0ZW1zOiBbeyBvcGVyYXRpb25JZDogJ2V4aXN0aW5nLW9wLWlkJywgc3RhdGU6ICdBUFBST1ZFX1RYX1JFUVVFU1RFRCcgfV0sXG4gICAgICB9KTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhwcmVmbGlnaHRSZXEpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pLFxuICAgICAgICAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgIChlcnIgaW5zdGFuY2VvZiBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcikuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgICAgICAoZXJyIGFzIEFjdGl2ZU9wZXJhdGlvbkV4aXN0c0Vycm9yKS5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwoJ2V4aXN0aW5nLW9wLWlkJyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb3BhZ2F0ZSBkZXBvc2l0IHNlbmRNYW55IGZhaWx1cmUgd2l0aG91dCBjbGVhbnVwJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSAnb3AtdXVpZC00NTYnO1xuXG4gICAgICAvLyBNb2NrIHNlbmRNYW55OiBhcHByb3ZlIHN1Y2NlZWRzLCBkZXBvc2l0IGZhaWxzXG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYXBwcm92ZS0yJyxcbiAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScsIG9wZXJhdGlvbklkIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZWplY3RzKG5ldyBFcnJvcignZGVwb3NpdCBjcmVhdGlvbiBmYWlsZWQnKSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnZGVwb3NpdCBjcmVhdGlvbiBmYWlsZWQnLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNESyBkb2VzIG5vdCBhdHRlbXB0IGNsZWFudXAg4oCUIHJlY29uY2lsZXIgaGFuZGxlcyBvcnBoYW5lZCBhcHByb3ZhbHNcbiAgICAgIG1vY2tCaXRHby5kZWwuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAnJywgYW1vdW50OiAnMTAwMDAwMCcgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFtb3VudCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC0xJywgYW1vdW50OiAnJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnYW1vdW50IGlzIHJlcXVpcmVkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIGNsaWVudElkZW1wb3RlbmN5S2V5IGFuZCB3YWxsZXRQYXNzcGhyYXNlIHdoZW4gcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC11dWlkLTc4OSc7XG5cbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgIHNlbmRNYW55U3R1Yi5vbkZpcnN0Q2FsbCgpLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLTMnLFxuICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1hcHByb3ZlJywgb3BlcmF0aW9uSWQgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgc2VuZE1hbnlTdHViLm9uU2Vjb25kQ2FsbCgpLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LTMnLFxuICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1kZXBvc2l0Jywgb3BlcmF0aW9uSWQgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoe1xuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgIGNsaWVudElkZW1wb3RlbmN5S2V5OiAnaWRlbS1rZXktMTIzJyxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QtcGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXBwcm92ZUFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIGFwcHJvdmVBcmdzLmRlZmlQYXJhbXMuY2xpZW50SWRlbXBvdGVuY3lLZXkuc2hvdWxkLmVxdWFsKCdpZGVtLWtleS0xMjMnKTtcbiAgICAgIGFwcHJvdmVBcmdzLndhbGxldFBhc3NwaHJhc2Uuc2hvdWxkLmVxdWFsKCd0ZXN0LXBhc3NwaHJhc2UnKTtcblxuICAgICAgY29uc3QgZGVwb3NpdEFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5zZWNvbmRDYWxsLmFyZ3NbMF07XG4gICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLmNsaWVudElkZW1wb3RlbmN5S2V5LnNob3VsZC5lcXVhbCgnaWRlbS1rZXktMTIzJyk7XG4gICAgICBkZXBvc2l0QXJncy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgndGVzdC1wYXNzcGhyYXNlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXN1bWVEZXBvc2l0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaXNzdWUgdGhlIGRlcG9zaXQgc2VuZE1hbnkgZm9yIGEgcGFydGlhbCBvcGVyYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICAgIG9wZXJhdGlvbklkOiAnb3AtcmVzdW1lLTEnLFxuICAgICAgICB3YWxsZXRJZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgYXNzZXRBbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgc3RhdGU6ICdBUFBST1ZFX1RYX1JFUVVFU1RFRCcsXG4gICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYXBwcm92ZS1leGlzdGluZycsXG4gICAgICAgIGFzc29jaWF0ZWRUeFJlcXVlc3RJZDogdW5kZWZpbmVkLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIGdldE9wZXJhdGlvbiBjYWxsXG4gICAgICBjb25zdCBnZXRPcFJlcSA9IG1vY2tSZXF1ZXN0KG9wZXJhdGlvbik7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoZ2V0T3BSZXEpO1xuXG4gICAgICAvLyBkZXBvc2l0IHNlbmRNYW55XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWRlcG9zaXQtcmVzdW1lJyxcbiAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktZGVwb3NpdCcsIG9wZXJhdGlvbklkOiAnb3AtcmVzdW1lLTEnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LnJlc3VtZURlcG9zaXQoeyBvcGVyYXRpb25JZDogJ29wLXJlc3VtZS0xJyB9KTtcblxuICAgICAgcmVzdWx0Lm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbCgnb3AtcmVzdW1lLTEnKTtcbiAgICAgIHJlc3VsdC50eFJlcXVlc3RJZHMuYXBwcm92ZS5zaG91bGQuZXF1YWwoJ3R4cmVxLWFwcHJvdmUtZXhpc3RpbmcnKTtcbiAgICAgIHJlc3VsdC50eFJlcXVlc3RJZHMuZGVwb3NpdC5zaG91bGQuZXF1YWwoJ3R4cmVxLWRlcG9zaXQtcmVzdW1lJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBzZW5kTWFueSB3YXMgY2FsbGVkIHdpdGggY29ycmVjdCBkZWZpUGFyYW1zXG4gICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgZGVwb3NpdEFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlEZXBvc2l0Jyk7XG4gICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMuYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgZGVwb3NpdEFyZ3MuZGVmaVBhcmFtcy5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwoJ29wLXJlc3VtZS0xJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGRlcG9zaXQgdHhSZXF1ZXN0IGFscmVhZHkgZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgICBvcGVyYXRpb25JZDogJ29wLWFscmVhZHktZG9uZScsXG4gICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzdGF0ZTogJ0RFUE9TSVRfVFhfUkVRVUVTVEVEJyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLXgnLFxuICAgICAgICBhc3NvY2lhdGVkVHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LXgnLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldE9wUmVxID0gbW9ja1JlcXVlc3Qob3BlcmF0aW9uKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhnZXRPcFJlcSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5yZXN1bWVEZXBvc2l0KHsgb3BlcmF0aW9uSWQ6ICdvcC1hbHJlYWR5LWRvbmUnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdEZXBvc2l0IHR4UmVxdWVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBvcGVyYXRpb247IG5vdGhpbmcgdG8gcmVzdW1lJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBvcGVyYXRpb25JZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LnJlc3VtZURlcG9zaXQoeyBvcGVyYXRpb25JZDogJycgfSksIHsgbWVzc2FnZTogJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldE9wZXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZldGNoIGFuIG9wZXJhdGlvbiBieSBJRCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6ICdvcC1nZXQtMScsXG4gICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzdGF0ZTogJ0NPTVBMRVRFRCcsXG4gICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtMScsXG4gICAgICAgIGFzc29jaWF0ZWRUeFJlcXVlc3RJZDogJ3R4cmVxLTInLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTg6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcSA9IG1vY2tSZXF1ZXN0KG9wZXJhdGlvbik7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmdldE9wZXJhdGlvbih7IG9wZXJhdGlvbklkOiAnb3AtZ2V0LTEnIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwob3BlcmF0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgb3BlcmF0aW9uSWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5nZXRPcGVyYXRpb24oeyBvcGVyYXRpb25JZDogJycgfSksIHsgbWVzc2FnZTogJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xpc3RPcGVyYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbGlzdCBvcGVyYXRpb25zIGZvciBhIHZhdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGlzdFJlc3VsdCA9IHtcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogJ29wLTEnLFxuICAgICAgICAgICAgd2FsbGV0SWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgICAgIGFzc2V0QW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgICBzdGF0ZTogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjE4OjAwWicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbmV4dEN1cnNvcjogJ2N1cnNvci1hYmMnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gbW9ja1JlcXVlc3QobGlzdFJlc3VsdCk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0Lmxpc3RPcGVyYXRpb25zKHtcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHN0YXRlOiAnQ09NUExFVEVEJyxcbiAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5pdGVtcy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmVzdWx0Lm5leHRDdXJzb3IhLnNob3VsZC5lcXVhbCgnY3Vyc29yLWFiYycpO1xuXG4gICAgICAvLyBWZXJpZnkgcXVlcnkgcGFyYW1zXG4gICAgICBjb25zdCBxdWVyeUFyZ3MgPSByZXEucXVlcnkuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBxdWVyeUFyZ3MudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1nYWxheHktdXNkYycpO1xuICAgICAgcXVlcnlBcmdzLnN0YXRlLnNob3VsZC5lcXVhbCgnQ09NUExFVEVEJyk7XG4gICAgICBxdWVyeUFyZ3MubGltaXQuc2hvdWxkLmVxdWFsKDEwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdmF1bHRJZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0Lmxpc3RPcGVyYXRpb25zKHsgdmF1bHRJZDogJycgfSksIHsgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2FsbGV0LmRlZmkgZ2V0dGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgRGVmaVZhdWx0IGluc3RhbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVmaSA9IHdhbGxldC5kZWZpO1xuICAgICAgKGRlZmkgaW5zdGFuY2VvZiBEZWZpVmF1bHQpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZSBvbiBzdWJzZXF1ZW50IGNhbGxzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVmaTEgPSB3YWxsZXQuZGVmaTtcbiAgICAgIGNvbnN0IGRlZmkyID0gd2FsbGV0LmRlZmk7XG4gICAgICAoZGVmaTEgPT09IGRlZmkyKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
@@ -43,6 +43,7 @@ function getAddressVerificationModule() {
43
43
  const getExtractCommonKeychain = () => getAddressVerificationModule().extractCommonKeychain;
44
44
  const getVerifyEddsaTssWalletAddress = () => getAddressVerificationModule().verifyEddsaTssWalletAddress;
45
45
  const getVerifyMPCWalletAddress = () => getAddressVerificationModule().verifyMPCWalletAddress;
46
+ const getDeriveMPCWalletAddress = () => getAddressVerificationModule().deriveMPCWalletAddress;
46
47
  // RFC 8032 test vector: known valid Ed25519 public key + arbitrary chaincode = 128 hex chars.
47
48
  const TEST_PK = 'd75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a';
48
49
  const TEST_CHAINCODE = 'deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef';
@@ -200,4 +201,47 @@ describe('verifyMPCWalletAddress - ECDSA (secp256k1)', function () {
200
201
  result.should.be.false();
201
202
  });
202
203
  });
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc1ZlcmlmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvYWRkcmVzc1ZlcmlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxrQkFBZ0I7QUFDaEIsb0RBQTRFO0FBQzVFLDREQUEyRDtBQUUzRCxTQUFTLDRCQUE0QjtJQUNuQyxPQUFPLE9BQU8sQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLHdCQUF3QixHQUFHLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixFQUFFLENBQUMscUJBQXFCLENBQUM7QUFDNUYsTUFBTSw4QkFBOEIsR0FBRyxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0FBQ3hHLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztBQUU5Riw4RkFBOEY7QUFDOUYsTUFBTSxPQUFPLEdBQUcsa0VBQWtFLENBQUM7QUFDbkYsTUFBTSxjQUFjLEdBQUcsa0VBQWtFLENBQUM7QUFDMUYsTUFBTSxhQUFhLEdBQUcsT0FBTyxHQUFHLGNBQWMsQ0FBQztBQUUvQyxnR0FBZ0c7QUFDaEcsTUFBTSxRQUFRLEdBQUcsb0VBQW9FLENBQUM7QUFDdEYsTUFBTSxjQUFjLEdBQUcsUUFBUSxHQUFHLGNBQWMsQ0FBQztBQUVqRCxRQUFRLENBQUMsd0RBQXdELEVBQUU7SUFDakUsTUFBTSxjQUFjLEdBQ2xCLGtJQUFrSSxDQUFDO0lBRXJJLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtRQUNoQyxFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsRUFBRSxDQUFDO1lBQ3pELE1BQU0sU0FBUyxHQUFHLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUUvRSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixFQUFFLENBQUM7WUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsU0FBZ0IsQ0FBQyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7UUFDbkcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUU7WUFDcEQsTUFBTSxxQkFBcUIsR0FBRyx3QkFBd0IsRUFBRSxDQUFDO1lBQ3pELE1BQU0sU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLFNBQWdCLENBQUMsRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3hHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlFQUFpRSxFQUFFO1lBQ3BFLE1BQU0scUJBQXFCLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQztZQUN6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLEVBQUUsaURBQWlELENBQUMsQ0FBQztRQUMzRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQzVDLEVBQUUsQ0FBQywrQ0FBK0MsRUFBRTtZQUNsRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRWhFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxJQUFJLEdBQUcsSUFBQSwrQkFBaUIsRUFBQyxJQUFJLENBQUMsQ0FBQztnQkFFckMsOENBQThDO2dCQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUUzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFNUIsOEJBQThCO2dCQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtJQUN0QyxNQUFNLFNBQVMsR0FBRztRQUNoQixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUU7UUFDakMsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFO1FBQ2pDLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRTtLQUNsQyxDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO0lBQzVELE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVuRCxRQUFRLENBQUMsNENBQTRDLEVBQUU7UUFDckQsRUFBRSxDQUFDLHdFQUF3RSxFQUFFLEtBQUs7WUFDaEYsTUFBTSwyQkFBMkIsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sZUFBZSxHQUFHLElBQUEsaUNBQW1CLEVBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFL0UsTUFBTSxNQUFNLEdBQUcsTUFBTSwyQkFBMkIsQ0FDOUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxFQUMvRSxjQUFjLEVBQ2QsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3RUFBd0UsRUFBRSxLQUFLO1lBQ2hGLE1BQU0sMkJBQTJCLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztZQUNyRSxNQUFNLGVBQWUsR0FBRyxJQUFBLGlDQUFtQixFQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRS9FLE1BQU0sTUFBTSxHQUFHLE1BQU0sMkJBQTJCLENBQzlDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsRUFDL0UsY0FBYyxFQUNkLHVCQUF1QixDQUN4QixDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUUsS0FBSztZQUN6RCxNQUFNLDJCQUEyQixHQUFHLDhCQUE4QixFQUFFLENBQUM7WUFDckUsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLGlDQUFtQixFQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRWpGLE1BQU0sTUFBTSxHQUFHLE1BQU0sMkJBQTJCLENBQzlDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxFQUNqRixjQUFjLEVBQ2QsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpRUFBaUUsRUFBRSxLQUFLO1lBQ3pFLE1BQU0sMkJBQTJCLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztZQUNyRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsOEJBQThCO1lBRXJFLE1BQU0sTUFBTSxHQUFHLE1BQU0sMkJBQTJCLENBQzlDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsRUFDN0UsY0FBYyxFQUNkLHVCQUF1QixDQUN4QixDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUZBQWlGLEVBQUUsS0FBSztZQUN6RixNQUFNLDJCQUEyQixHQUFHLDhCQUE4QixFQUFFLENBQUM7WUFDckUsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUEsK0JBQWlCLEVBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsTUFBTSxlQUFlLEdBQUcsSUFBQSxpQ0FBbUIsRUFBQyxhQUFhLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFdkYsTUFBTSxNQUFNLEdBQUcsTUFBTSwyQkFBMkIsQ0FDOUM7Z0JBQ0UsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLFNBQVM7Z0JBQ1QsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsbUJBQW1CLEVBQUUsT0FBTztnQkFDNUIseUJBQXlCLEVBQUUsSUFBSTthQUNoQyxFQUNELGNBQWMsRUFDZCx1QkFBdUIsQ0FDeEIsQ0FBQztZQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJGQUEyRixFQUFFLEtBQUs7WUFDbkcsTUFBTSwyQkFBMkIsR0FBRyw4QkFBOEIsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQztZQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFBLCtCQUFpQixFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sZUFBZSxHQUFHLElBQUEsaUNBQW1CLEVBQUMsYUFBYSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXZGLE1BQU0sTUFBTSxHQUFHLE1BQU0sMkJBQTJCLENBQzlDO2dCQUNFLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixTQUFTO2dCQUNULEtBQUssRUFBRSxDQUFDO2dCQUNSLG1CQUFtQixFQUFFLE9BQU87Z0JBQzVCLHlCQUF5QixFQUFFLElBQUk7YUFDaEMsRUFDRCxjQUFjLEVBQ2QsdUJBQXVCLENBQ3hCLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQzVDLEVBQUUsQ0FBQyxzRUFBc0UsRUFBRSxLQUFLO1lBQzlFLE1BQU0sMkJBQTJCLEdBQUcsOEJBQThCLEVBQUUsQ0FBQztZQUNyRSw2RkFBNkY7WUFDN0Ysd0ZBQXdGO1lBQ3hGLDRCQUE0QjtZQUM1QixNQUFNLFlBQVksR0FBRyxJQUFBLGlDQUFtQixFQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTVFLE1BQU0sTUFBTSxHQUFHLE1BQU0sMkJBQTJCLENBQzlDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUM5QyxjQUFjLEVBQ2QsdUJBQXVCLENBQ3hCLENBQUM7WUFFRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsNENBQTRDLEVBQUU7SUFDckQsTUFBTSxjQUFjLEdBQUc7UUFDckIsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFO1FBQ2xDLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRTtRQUNsQyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUU7S0FDbkMsQ0FBQztJQUNGLDZEQUE2RDtJQUM3RCxNQUFNLG1CQUFtQixHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQztJQUNqRSxNQUFNLHVCQUF1QixHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFbkQsRUFBRSxDQUFDLG1GQUFtRixFQUFFLEtBQUs7UUFDM0YsTUFBTSxzQkFBc0IsR0FBRyx5QkFBeUIsRUFBRSxDQUFDO1FBQzNELE1BQU0sZUFBZSxHQUFHLElBQUksV0FBSyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekYsTUFBTSxNQUFNLEdBQUcsTUFBTSxzQkFBc0IsQ0FDekM7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixTQUFTLEVBQUUsY0FBYztZQUN6QixLQUFLLEVBQUUsQ0FBQztZQUNSLG1CQUFtQixFQUFFLE9BQU87WUFDNUIsUUFBUSxFQUFFLFdBQVc7U0FDdEIsRUFDRCxtQkFBbUIsRUFDbkIsdUJBQXVCLENBQ3hCLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLO1FBQ3pELE1BQU0sc0JBQXNCLEdBQUcseUJBQXlCLEVBQUUsQ0FBQztRQUMzRCxNQUFNLGVBQWUsR0FBRyxJQUFJLFdBQUssRUFBRSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXpGLE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQ3pDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUN4RixtQkFBbUIsRUFDbkIsdUJBQXVCLENBQ3hCLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxLQUFLO1FBQ3pELE1BQU0sc0JBQXNCLEdBQUcseUJBQXlCLEVBQUUsQ0FBQztRQUMzRCxNQUFNLGVBQWUsR0FBRyxJQUFJLFdBQUssRUFBRSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXpGLE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQXNCLENBQ3pDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUN4RixtQkFBbUIsRUFDbkIsdUJBQXVCLENBQ3hCLENBQUM7UUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBkZXJpdmVVbmhhcmRlbmVkTXBzLCBnZXREZXJpdmF0aW9uUGF0aCB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBFY2RzYSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9tcGMnO1xuXG5mdW5jdGlvbiBnZXRBZGRyZXNzVmVyaWZpY2F0aW9uTW9kdWxlKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9hZGRyZXNzVmVyaWZpY2F0aW9uJyk7XG59XG5cbmNvbnN0IGdldEV4dHJhY3RDb21tb25LZXljaGFpbiA9ICgpID0+IGdldEFkZHJlc3NWZXJpZmljYXRpb25Nb2R1bGUoKS5leHRyYWN0Q29tbW9uS2V5Y2hhaW47XG5jb25zdCBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSAoKSA9PiBnZXRBZGRyZXNzVmVyaWZpY2F0aW9uTW9kdWxlKCkudmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzO1xuY29uc3QgZ2V0VmVyaWZ5TVBDV2FsbGV0QWRkcmVzcyA9ICgpID0+IGdldEFkZHJlc3NWZXJpZmljYXRpb25Nb2R1bGUoKS52ZXJpZnlNUENXYWxsZXRBZGRyZXNzO1xuXG4vLyBSRkMgODAzMiB0ZXN0IHZlY3Rvcjoga25vd24gdmFsaWQgRWQyNTUxOSBwdWJsaWMga2V5ICsgYXJiaXRyYXJ5IGNoYWluY29kZSA9IDEyOCBoZXggY2hhcnMuXG5jb25zdCBURVNUX1BLID0gJ2Q3NWE5ODAxODJiMTBhYjdkNTRiZmVkM2M5NjQwNzNhMGVlMTcyZjNkYWE2MjMyNWFmMDIxYTY4ZjcwNzUxMWEnO1xuY29uc3QgVEVTVF9DSEFJTkNPREUgPSAnZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZic7XG5jb25zdCBURVNUX0tFWUNIQUlOID0gVEVTVF9QSyArIFRFU1RfQ0hBSU5DT0RFO1xuXG4vLyBzZWNwMjU2azEgZ2VuZXJhdG9yIHBvaW50IEcgKGNvbXByZXNzZWQsIDMzIGJ5dGVzID0gNjYgaGV4KSArIHNhbWUgY2hhaW5jb2RlID0gMTMwIGhleCBjaGFycy5cbmNvbnN0IEVDRFNBX1BLID0gJzAyNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCc7XG5jb25zdCBFQ0RTQV9LRVlDSEFJTiA9IEVDRFNBX1BLICsgVEVTVF9DSEFJTkNPREU7XG5cbmRlc2NyaWJlKCdUU1MgQWRkcmVzcyBWZXJpZmljYXRpb24gLSBEZXJpdmF0aW9uIFBhdGggd2l0aCBQcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvbW1vbktleWNoYWluID1cbiAgICAnOGVhMzJlY2FjZmM4M2VmZmJkMmUyNzkwZWU0NGZhN2M1OWI0ZDg2YzI5YTEyZjA5ZmI2MTNkODE5NWY5M2Y0ZTIxODc1Y2FkM2I5OGFkYWRhNDBjMDQwYzU0YzM1Njk0NjdkZjQxYTAyMDg4MWE2MTg0MDk2Mzc4NzAxODYyYmQnO1xuXG4gIGRlc2NyaWJlKCdleHRyYWN0Q29tbW9uS2V5Y2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IGNvbW1vbktleWNoYWluIGZyb20ga2V5Y2hhaW5zIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXh0cmFjdENvbW1vbktleWNoYWluID0gZ2V0RXh0cmFjdENvbW1vbktleWNoYWluKCk7XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBbeyBjb21tb25LZXljaGFpbiB9LCB7IGNvbW1vbktleWNoYWluIH0sIHsgY29tbW9uS2V5Y2hhaW4gfV07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RDb21tb25LZXljaGFpbihrZXljaGFpbnMpO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChjb21tb25LZXljaGFpbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIGtleWNoYWlucyBhcmUgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4dHJhY3RDb21tb25LZXljaGFpbiA9IGdldEV4dHJhY3RDb21tb25LZXljaGFpbigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBleHRyYWN0Q29tbW9uS2V5Y2hhaW4oW10pLCAvbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZXh0cmFjdENvbW1vbktleWNoYWluKHVuZGVmaW5lZCBhcyBhbnkpLCAvbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgY29tbW9uS2V5Y2hhaW4gaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4dHJhY3RDb21tb25LZXljaGFpbiA9IGdldEV4dHJhY3RDb21tb25LZXljaGFpbigpO1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gW3sgaWQ6ICcxJyB9XTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZXh0cmFjdENvbW1vbktleWNoYWluKGtleWNoYWlucyBhcyBhbnkpLCAvbWlzc2luZyByZXF1aXJlZCBwYXJhbSBjb21tb25LZXljaGFpbi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBrZXljaGFpbnMgaGF2ZSBtaXNtYXRjaGVkIGNvbW1vbktleWNoYWlucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4dHJhY3RDb21tb25LZXljaGFpbiA9IGdldEV4dHJhY3RDb21tb25LZXljaGFpbigpO1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gW3sgY29tbW9uS2V5Y2hhaW4gfSwgeyBjb21tb25LZXljaGFpbjogJ2RpZmZlcmVudC1rZXljaGFpbicgfV07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGV4dHJhY3RDb21tb25LZXljaGFpbihrZXljaGFpbnMpLCAvYWxsIGtleWNoYWlucyBtdXN0IGhhdmUgdGhlIHNhbWUgY29tbW9uS2V5Y2hhaW4vKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Rlcml2YXRpb24gUGF0aCBGb3JtYXQgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgY29ycmVjdCBkZXJpdmF0aW9uIHBhdGggZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGVzdFNlZWRzID0gWydzZWVkMScsICdzZWVkLTInLCAnMTIzNDUnLCAndGVzdF9zZWVkXzEyMyddO1xuXG4gICAgICB0ZXN0U2VlZHMuZm9yRWFjaCgoc2VlZCkgPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0RGVyaXZhdGlvblBhdGgoc2VlZCk7XG5cbiAgICAgICAgLy8gRXhwZWN0ZWQgZm9ybWF0OiBcIm0vOTk5OTk5L3twYXJ0MX0ve3BhcnQyfVwiXG4gICAgICAgIHBhdGguc2hvdWxkLm1hdGNoKC9ebVxcLzk5OTk5OVxcL1xcZCtcXC9cXGQrJC8pO1xuXG4gICAgICAgIHBhdGguc2hvdWxkLnN0YXJ0V2l0aCgnbS8nKTtcblxuICAgICAgICAvLyBTaG91bGQgaGF2ZSBleGFjdGx5IDMgcGFydHNcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIHBhcnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICAgIHBhcnRzWzBdLnNob3VsZC5lcXVhbCgnbScpO1xuICAgICAgICBwYXJ0c1sxXS5zaG91bGQuZXF1YWwoJzk5OTk5OScpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGtleWNoYWlucyA9IFtcbiAgICB7IGNvbW1vbktleWNoYWluOiBURVNUX0tFWUNIQUlOIH0sXG4gICAgeyBjb21tb25LZXljaGFpbjogVEVTVF9LRVlDSEFJTiB9LFxuICAgIHsgY29tbW9uS2V5Y2hhaW46IFRFU1RfS0VZQ0hBSU4gfSxcbiAgXTtcbiAgY29uc3QgaXNWYWxpZEFkZHJlc3MgPSAoYWRkcjogc3RyaW5nKSA9PiBhZGRyLmxlbmd0aCA9PT0gNjQ7XG4gIGNvbnN0IGdldEFkZHJlc3NGcm9tUHVibGljS2V5ID0gKHBrOiBzdHJpbmcpID0+IHBrO1xuXG4gIGRlc2NyaWJlKCdNUEN2MiB3YWxsZXRzIChTaWxlbmNlIExhYnMgLyBNUFMgZm9ybXVsYSknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3ZlcmlmaWVzIGEgY29ycmVjdCBhZGRyZXNzIGRlcml2ZWQgd2l0aCBkZXJpdmVVbmhhcmRlbmVkTXBzIGF0IGluZGV4IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IGRlcml2ZVVuaGFyZGVuZWRNcHMoVEVTVF9LRVlDSEFJTiwgJ20vMCcpLnNsaWNlKDAsIDY0KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgICB7IGFkZHJlc3M6IGV4cGVjdGVkQWRkcmVzcywga2V5Y2hhaW5zLCBpbmRleDogMCwgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyB9LFxuICAgICAgICBpc1ZhbGlkQWRkcmVzcyxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG4gICAgICByZXN1bHQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2ZXJpZmllcyBhIGNvcnJlY3QgYWRkcmVzcyBkZXJpdmVkIHdpdGggZGVyaXZlVW5oYXJkZW5lZE1wcyBhdCBpbmRleCAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSBkZXJpdmVVbmhhcmRlbmVkTXBzKFRFU1RfS0VZQ0hBSU4sICdtLzEnKS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyhcbiAgICAgICAgeyBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MsIGtleWNoYWlucywgaW5kZXg6IDEsIG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicgfSxcbiAgICAgICAgaXNWYWxpZEFkZHJlc3MsXG4gICAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhbiBhZGRyZXNzIGRlcml2ZWQgYXQgYSBkaWZmZXJlbnQgaW5kZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGFkZHJlc3NGcm9tSW5kZXgwID0gZGVyaXZlVW5oYXJkZW5lZE1wcyhURVNUX0tFWUNIQUlOLCAnbS8wJykuc2xpY2UoMCwgNjQpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICAgIHsgYWRkcmVzczogYWRkcmVzc0Zyb21JbmRleDAsIGtleWNoYWlucywgaW5kZXg6IDEsIG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicgfSxcbiAgICAgICAgaXNWYWxpZEFkZHJlc3MsXG4gICAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSByYW5kb20gYWRkcmVzcyB0aGF0IHdhcyBub3QgZGVyaXZlZCBmcm9tIHRoZSBrZXljaGFpbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyA9IGdldFZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcygpO1xuICAgICAgY29uc3QgcmFuZG9tQWRkcmVzcyA9ICdhYicucmVwZWF0KDMyKTsgLy8gNjQgaGV4IGNoYXJzLCB3cm9uZyBhZGRyZXNzXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyhcbiAgICAgICAgeyBhZGRyZXNzOiByYW5kb21BZGRyZXNzLCBrZXljaGFpbnMsIGluZGV4OiAwLCBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAnTVBDdjInIH0sXG4gICAgICAgIGlzVmFsaWRBZGRyZXNzLFxuICAgICAgICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleVxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2ZXJpZmllcyBhIGNvcnJlY3QgTVBDdjIgYWRkcmVzcyBmb3IgU01DIHdhbGxldCB1c2luZyBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBzZWVkID0gJ3NtYy1zZWVkLTEyMyc7XG4gICAgICBjb25zdCBwcmVmaXggPSBnZXREZXJpdmF0aW9uUGF0aChzZWVkKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IGRlcml2ZVVuaGFyZGVuZWRNcHMoVEVTVF9LRVlDSEFJTiwgYCR7cHJlZml4fS8wYCkuc2xpY2UoMCwgNjQpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MsXG4gICAgICAgICAga2V5Y2hhaW5zLFxuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicsXG4gICAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogc2VlZCxcbiAgICAgICAgfSxcbiAgICAgICAgaXNWYWxpZEFkZHJlc3MsXG4gICAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhbiBNUEN2MiBhZGRyZXNzIGRlcml2ZWQgYXQgdGhlIHdyb25nIGluZGV4IHdoZW4gZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBpcyBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IHNlZWQgPSAnc21jLXNlZWQtMTIzJztcbiAgICAgIGNvbnN0IHByZWZpeCA9IGdldERlcml2YXRpb25QYXRoKHNlZWQpO1xuICAgICAgY29uc3QgYWRkcmVzc0F0SW5kZXgxID0gZGVyaXZlVW5oYXJkZW5lZE1wcyhURVNUX0tFWUNIQUlOLCBgJHtwcmVmaXh9LzFgKS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyhcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3NBdEluZGV4MSxcbiAgICAgICAgICBrZXljaGFpbnMsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyxcbiAgICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBzZWVkLFxuICAgICAgICB9LFxuICAgICAgICBpc1ZhbGlkQWRkcmVzcyxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub24tTVBDdjIgd2FsbGV0cyAoTVBDdjEgZm9ybXVsYSknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3JlamVjdHMgYW4gTVBDdjItZGVyaXZlZCBhZGRyZXNzIHdoZW4gbXVsdGlzaWdUeXBlVmVyc2lvbiBpcyBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKCk7XG4gICAgICAvLyBNUEN2MiAoU2lsZW5jZSBMYWJzKSBhbmQgTVBDdjEgZm9ybXVsYXMgcHJvZHVjZSBkaWZmZXJlbnQgYWRkcmVzc2VzIGZvciB0aGUgc2FtZSBrZXljaGFpbi5cbiAgICAgIC8vIFdpdGhvdXQgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJywgdGhlIE1QQ3YxIGZvcm11bGEgaXMgdXNlZCwgc28gdGhlIE1QQ3YyLWRlcml2ZWRcbiAgICAgIC8vIGFkZHJlc3Mgc2hvdWxkIG5vdCBtYXRjaC5cbiAgICAgIGNvbnN0IG1wY3YyQWRkcmVzcyA9IGRlcml2ZVVuaGFyZGVuZWRNcHMoVEVTVF9LRVlDSEFJTiwgJ20vMCcpLnNsaWNlKDAsIDY0KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgICB7IGFkZHJlc3M6IG1wY3YyQWRkcmVzcywga2V5Y2hhaW5zLCBpbmRleDogMCB9LFxuICAgICAgICBpc1ZhbGlkQWRkcmVzcyxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3ZlcmlmeU1QQ1dhbGxldEFkZHJlc3MgLSBFQ0RTQSAoc2VjcDI1NmsxKScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZWNkc2FLZXljaGFpbnMgPSBbXG4gICAgeyBjb21tb25LZXljaGFpbjogRUNEU0FfS0VZQ0hBSU4gfSxcbiAgICB7IGNvbW1vbktleWNoYWluOiBFQ0RTQV9LRVlDSEFJTiB9LFxuICAgIHsgY29tbW9uS2V5Y2hhaW46IEVDRFNBX0tFWUNIQUlOIH0sXG4gIF07XG4gIC8vIHNlY3AyNTZrMSBjb21wcmVzc2VkIHB1YmxpYyBrZXkgaXMgMzMgYnl0ZXMgPSA2NiBoZXggY2hhcnNcbiAgY29uc3QgaXNWYWxpZEVjZHNhQWRkcmVzcyA9IChhZGRyOiBzdHJpbmcpID0+IGFkZHIubGVuZ3RoID09PSA2NjtcbiAgY29uc3QgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkgPSAocGs6IHN0cmluZykgPT4gcGs7XG5cbiAgaXQoJ2lnbm9yZXMgbXVsdGlzaWdUeXBlVmVyc2lvbiBNUEN2MiBhbmQgdXNlcyBFY2RzYSBkZXJpdmF0aW9uIGZvciBzZWNwMjU2azEgd2FsbGV0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB2ZXJpZnlNUENXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5TVBDV2FsbGV0QWRkcmVzcygpO1xuICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IG5ldyBFY2RzYSgpLmRlcml2ZVVuaGFyZGVuZWQoRUNEU0FfS0VZQ0hBSU4sICdtLzAnKS5zbGljZSgwLCA2Nik7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2ZXJpZnlNUENXYWxsZXRBZGRyZXNzKFxuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogZWNkc2FLZXljaGFpbnMsXG4gICAgICAgIGluZGV4OiAwLFxuICAgICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAnTVBDdjInLFxuICAgICAgICBrZXlDdXJ2ZTogJ3NlY3AyNTZrMScsXG4gICAgICB9LFxuICAgICAgaXNWYWxpZEVjZHNhQWRkcmVzcyxcbiAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgKTtcbiAgICByZXN1bHQuc2hvdWxkLmJlLnRydWUoKTtcbiAgfSk7XG5cbiAgaXQoJ3ZlcmlmaWVzIGEgY29ycmVjdCBzZWNwMjU2azEgYWRkcmVzcyBhdCBpbmRleCAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlNUENXYWxsZXRBZGRyZXNzKCk7XG4gICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzID0gbmV3IEVjZHNhKCkuZGVyaXZlVW5oYXJkZW5lZChFQ0RTQV9LRVlDSEFJTiwgJ20vMScpLnNsaWNlKDAsIDY2KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICB7IGFkZHJlc3M6IGV4cGVjdGVkQWRkcmVzcywga2V5Y2hhaW5zOiBlY2RzYUtleWNoYWlucywgaW5kZXg6IDEsIGtleUN1cnZlOiAnc2VjcDI1NmsxJyB9LFxuICAgICAgaXNWYWxpZEVjZHNhQWRkcmVzcyxcbiAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgKTtcbiAgICByZXN1bHQuc2hvdWxkLmJlLnRydWUoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYW4gYWRkcmVzcyBkZXJpdmVkIGF0IGEgZGlmZmVyZW50IGluZGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlNUENXYWxsZXRBZGRyZXNzKCk7XG4gICAgY29uc3QgYWRkcmVzc0F0SW5kZXgwID0gbmV3IEVjZHNhKCkuZGVyaXZlVW5oYXJkZW5lZChFQ0RTQV9LRVlDSEFJTiwgJ20vMCcpLnNsaWNlKDAsIDY2KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICB7IGFkZHJlc3M6IGFkZHJlc3NBdEluZGV4MCwga2V5Y2hhaW5zOiBlY2RzYUtleWNoYWlucywgaW5kZXg6IDEsIGtleUN1cnZlOiAnc2VjcDI1NmsxJyB9LFxuICAgICAgaXNWYWxpZEVjZHNhQWRkcmVzcyxcbiAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgKTtcbiAgICByZXN1bHQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gIH0pO1xufSk7XG4iXX0=
204
+ describe('deriveMPCWalletAddress', function () {
205
+ const getAddressFromPublicKey = (pk) => pk;
206
+ describe('ed25519 (MPCv2)', function () {
207
+ const keychains = [{ commonKeychain: TEST_KEYCHAIN }, { commonKeychain: TEST_KEYCHAIN }];
208
+ it('derives the address and path for the simple m/{index} path', async function () {
209
+ const deriveMPCWalletAddress = getDeriveMPCWalletAddress();
210
+ const expectedAddress = (0, sdk_lib_mpc_1.deriveUnhardenedMps)(TEST_KEYCHAIN, 'm/3').slice(0, 64);
211
+ const result = await deriveMPCWalletAddress({ keychains, index: 3, multisigTypeVersion: 'MPCv2', keyCurve: 'ed25519' }, getAddressFromPublicKey);
212
+ result.address.should.equal(expectedAddress);
213
+ result.derivationPath.should.equal('m/3');
214
+ });
215
+ it('uses the SMC prefix path when derivedFromParentWithSeed is set', async function () {
216
+ const deriveMPCWalletAddress = getDeriveMPCWalletAddress();
217
+ const seed = 'smc-seed-123';
218
+ const prefix = (0, sdk_lib_mpc_1.getDerivationPath)(seed);
219
+ const expectedAddress = (0, sdk_lib_mpc_1.deriveUnhardenedMps)(TEST_KEYCHAIN, `${prefix}/0`).slice(0, 64);
220
+ const result = await deriveMPCWalletAddress({ keychains, index: 0, multisigTypeVersion: 'MPCv2', derivedFromParentWithSeed: seed, keyCurve: 'ed25519' }, getAddressFromPublicKey);
221
+ result.address.should.equal(expectedAddress);
222
+ result.derivationPath.should.equal(`${prefix}/0`);
223
+ });
224
+ });
225
+ describe('secp256k1', function () {
226
+ const ecdsaKeychains = [{ commonKeychain: ECDSA_KEYCHAIN }, { commonKeychain: ECDSA_KEYCHAIN }];
227
+ it('derives the secp256k1 address (33-byte pubkey)', async function () {
228
+ const deriveMPCWalletAddress = getDeriveMPCWalletAddress();
229
+ const expectedAddress = new mpc_1.Ecdsa().deriveUnhardened(ECDSA_KEYCHAIN, 'm/2').slice(0, 66);
230
+ const result = await deriveMPCWalletAddress({ keychains: ecdsaKeychains, index: 2, keyCurve: 'secp256k1' }, getAddressFromPublicKey);
231
+ result.address.should.equal(expectedAddress);
232
+ result.derivationPath.should.equal('m/2');
233
+ });
234
+ });
235
+ describe('round-trip with verifyMPCWalletAddress', function () {
236
+ it('an address produced by deriveMPCWalletAddress verifies as true', async function () {
237
+ const deriveMPCWalletAddress = getDeriveMPCWalletAddress();
238
+ const verifyMPCWalletAddress = getVerifyMPCWalletAddress();
239
+ const ecdsaKeychains = [{ commonKeychain: ECDSA_KEYCHAIN }, { commonKeychain: ECDSA_KEYCHAIN }];
240
+ const isValidEcdsaAddress = (addr) => addr.length === 66;
241
+ const { address } = await deriveMPCWalletAddress({ keychains: ecdsaKeychains, index: 7, keyCurve: 'secp256k1' }, getAddressFromPublicKey);
242
+ const verified = await verifyMPCWalletAddress({ address, keychains: ecdsaKeychains, index: 7, keyCurve: 'secp256k1' }, isValidEcdsaAddress, getAddressFromPublicKey);
243
+ verified.should.be.true();
244
+ });
245
+ });
246
+ });
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc1ZlcmlmaWNhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9iaXRnby91dGlscy90c3MvYWRkcmVzc1ZlcmlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUNqQyxrQkFBZ0I7QUFDaEIsb0RBQTRFO0FBQzVFLDREQUEyRDtBQUUzRCxTQUFTLDRCQUE0QjtJQUNuQyxPQUFPLE9BQU8sQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLHdCQUF3QixHQUFHLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixFQUFFLENBQUMscUJBQXFCLENBQUM7QUFDNUYsTUFBTSw4QkFBOEIsR0FBRyxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0FBQ3hHLE1BQU0seUJBQXlCLEdBQUcsR0FBRyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztBQUM5RixNQUFNLHlCQUF5QixHQUFHLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixFQUFFLENBQUMsc0JBQXNCLENBQUM7QUFFOUYsOEZBQThGO0FBQzlGLE1BQU0sT0FBTyxHQUFHLGtFQUFrRSxDQUFDO0FBQ25GLE1BQU0sY0FBYyxHQUFHLGtFQUFrRSxDQUFDO0FBQzFGLE1BQU0sYUFBYSxHQUFHLE9BQU8sR0FBRyxjQUFjLENBQUM7QUFFL0MsZ0dBQWdHO0FBQ2hHLE1BQU0sUUFBUSxHQUFHLG9FQUFvRSxDQUFDO0FBQ3RGLE1BQU0sY0FBYyxHQUFHLFFBQVEsR0FBRyxjQUFjLENBQUM7QUFFakQsUUFBUSxDQUFDLHdEQUF3RCxFQUFFO0lBQ2pFLE1BQU0sY0FBYyxHQUNsQixrSUFBa0ksQ0FBQztJQUVySSxRQUFRLENBQUMsdUJBQXVCLEVBQUU7UUFDaEMsRUFBRSxDQUFDLG9E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TSxRQUFRLEdBQUcsTUFBTSxzQkFBc0IsQ0FDM0MsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFDdkUsbUJBQW1CLEVBQ25CLHVCQUF1QixDQUN4QixDQUFDO1lBRUYsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgeyBkZXJpdmVVbmhhcmRlbmVkTXBzLCBnZXREZXJpdmF0aW9uUGF0aCB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgeyBFY2RzYSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9tcGMnO1xuXG5mdW5jdGlvbiBnZXRBZGRyZXNzVmVyaWZpY2F0aW9uTW9kdWxlKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9hZGRyZXNzVmVyaWZpY2F0aW9uJyk7XG59XG5cbmNvbnN0IGdldEV4dHJhY3RDb21tb25LZXljaGFpbiA9ICgpID0+IGdldEFkZHJlc3NWZXJpZmljYXRpb25Nb2R1bGUoKS5leHRyYWN0Q29tbW9uS2V5Y2hhaW47XG5jb25zdCBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSAoKSA9PiBnZXRBZGRyZXNzVmVyaWZpY2F0aW9uTW9kdWxlKCkudmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzO1xuY29uc3QgZ2V0VmVyaWZ5TVBDV2FsbGV0QWRkcmVzcyA9ICgpID0+IGdldEFkZHJlc3NWZXJpZmljYXRpb25Nb2R1bGUoKS52ZXJpZnlNUENXYWxsZXRBZGRyZXNzO1xuY29uc3QgZ2V0RGVyaXZlTVBDV2FsbGV0QWRkcmVzcyA9ICgpID0+IGdldEFkZHJlc3NWZXJpZmljYXRpb25Nb2R1bGUoKS5kZXJpdmVNUENXYWxsZXRBZGRyZXNzO1xuXG4vLyBSRkMgODAzMiB0ZXN0IHZlY3Rvcjoga25vd24gdmFsaWQgRWQyNTUxOSBwdWJsaWMga2V5ICsgYXJiaXRyYXJ5IGNoYWluY29kZSA9IDEyOCBoZXggY2hhcnMuXG5jb25zdCBURVNUX1BLID0gJ2Q3NWE5ODAxODJiMTBhYjdkNTRiZmVkM2M5NjQwNzNhMGVlMTcyZjNkYWE2MjMyNWFmMDIxYTY4ZjcwNzUxMWEnO1xuY29uc3QgVEVTVF9DSEFJTkNPREUgPSAnZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZmRlYWRiZWVmZGVhZGJlZWZkZWFkYmVlZic7XG5jb25zdCBURVNUX0tFWUNIQUlOID0gVEVTVF9QSyArIFRFU1RfQ0hBSU5DT0RFO1xuXG4vLyBzZWNwMjU2azEgZ2VuZXJhdG9yIHBvaW50IEcgKGNvbXByZXNzZWQsIDMzIGJ5dGVzID0gNjYgaGV4KSArIHNhbWUgY2hhaW5jb2RlID0gMTMwIGhleCBjaGFycy5cbmNvbnN0IEVDRFNBX1BLID0gJzAyNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCc7XG5jb25zdCBFQ0RTQV9LRVlDSEFJTiA9IEVDRFNBX1BLICsgVEVTVF9DSEFJTkNPREU7XG5cbmRlc2NyaWJlKCdUU1MgQWRkcmVzcyBWZXJpZmljYXRpb24gLSBEZXJpdmF0aW9uIFBhdGggd2l0aCBQcmVmaXgnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvbW1vbktleWNoYWluID1cbiAgICAnOGVhMzJlY2FjZmM4M2VmZmJkMmUyNzkwZWU0NGZhN2M1OWI0ZDg2YzI5YTEyZjA5ZmI2MTNkODE5NWY5M2Y0ZTIxODc1Y2FkM2I5OGFkYWRhNDBjMDQwYzU0YzM1Njk0NjdkZjQxYTAyMDg4MWE2MTg0MDk2Mzc4NzAxODYyYmQnO1xuXG4gIGRlc2NyaWJlKCdleHRyYWN0Q29tbW9uS2V5Y2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IGNvbW1vbktleWNoYWluIGZyb20ga2V5Y2hhaW5zIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZXh0cmFjdENvbW1vbktleWNoYWluID0gZ2V0RXh0cmFjdENvbW1vbktleWNoYWluKCk7XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBbeyBjb21tb25LZXljaGFpbiB9LCB7IGNvbW1vbktleWNoYWluIH0sIHsgY29tbW9uS2V5Y2hhaW4gfV07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3RDb21tb25LZXljaGFpbihrZXljaGFpbnMpO1xuICAgICAgcmVzdWx0LnNob3VsZC5lcXVhbChjb21tb25LZXljaGFpbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGlmIGtleWNoYWlucyBhcmUgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4dHJhY3RDb21tb25LZXljaGFpbiA9IGdldEV4dHJhY3RDb21tb25LZXljaGFpbigpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBleHRyYWN0Q29tbW9uS2V5Y2hhaW4oW10pLCAvbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMvKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZXh0cmFjdENvbW1vbktleWNoYWluKHVuZGVmaW5lZCBhcyBhbnkpLCAvbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgaWYgY29tbW9uS2V5Y2hhaW4gaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4dHJhY3RDb21tb25LZXljaGFpbiA9IGdldEV4dHJhY3RDb21tb25LZXljaGFpbigpO1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gW3sgaWQ6ICcxJyB9XTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gZXh0cmFjdENvbW1vbktleWNoYWluKGtleWNoYWlucyBhcyBhbnkpLCAvbWlzc2luZyByZXF1aXJlZCBwYXJhbSBjb21tb25LZXljaGFpbi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBpZiBrZXljaGFpbnMgaGF2ZSBtaXNtYXRjaGVkIGNvbW1vbktleWNoYWlucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGV4dHJhY3RDb21tb25LZXljaGFpbiA9IGdldEV4dHJhY3RDb21tb25LZXljaGFpbigpO1xuICAgICAgY29uc3Qga2V5Y2hhaW5zID0gW3sgY29tbW9uS2V5Y2hhaW4gfSwgeyBjb21tb25LZXljaGFpbjogJ2RpZmZlcmVudC1rZXljaGFpbicgfV07XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGV4dHJhY3RDb21tb25LZXljaGFpbihrZXljaGFpbnMpLCAvYWxsIGtleWNoYWlucyBtdXN0IGhhdmUgdGhlIHNhbWUgY29tbW9uS2V5Y2hhaW4vKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Rlcml2YXRpb24gUGF0aCBGb3JtYXQgVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgY29ycmVjdCBkZXJpdmF0aW9uIHBhdGggZm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGVzdFNlZWRzID0gWydzZWVkMScsICdzZWVkLTInLCAnMTIzNDUnLCAndGVzdF9zZWVkXzEyMyddO1xuXG4gICAgICB0ZXN0U2VlZHMuZm9yRWFjaCgoc2VlZCkgPT4ge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0RGVyaXZhdGlvblBhdGgoc2VlZCk7XG5cbiAgICAgICAgLy8gRXhwZWN0ZWQgZm9ybWF0OiBcIm0vOTk5OTk5L3twYXJ0MX0ve3BhcnQyfVwiXG4gICAgICAgIHBhdGguc2hvdWxkLm1hdGNoKC9ebVxcLzk5OTk5OVxcL1xcZCtcXC9cXGQrJC8pO1xuXG4gICAgICAgIHBhdGguc2hvdWxkLnN0YXJ0V2l0aCgnbS8nKTtcblxuICAgICAgICAvLyBTaG91bGQgaGF2ZSBleGFjdGx5IDMgcGFydHNcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIHBhcnRzLmxlbmd0aC5zaG91bGQuZXF1YWwoNCk7XG4gICAgICAgIHBhcnRzWzBdLnNob3VsZC5lcXVhbCgnbScpO1xuICAgICAgICBwYXJ0c1sxXS5zaG91bGQuZXF1YWwoJzk5OTk5OScpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCd2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGtleWNoYWlucyA9IFtcbiAgICB7IGNvbW1vbktleWNoYWluOiBURVNUX0tFWUNIQUlOIH0sXG4gICAgeyBjb21tb25LZXljaGFpbjogVEVTVF9LRVlDSEFJTiB9LFxuICAgIHsgY29tbW9uS2V5Y2hhaW46IFRFU1RfS0VZQ0hBSU4gfSxcbiAgXTtcbiAgY29uc3QgaXNWYWxpZEFkZHJlc3MgPSAoYWRkcjogc3RyaW5nKSA9PiBhZGRyLmxlbmd0aCA9PT0gNjQ7XG4gIGNvbnN0IGdldEFkZHJlc3NGcm9tUHVibGljS2V5ID0gKHBrOiBzdHJpbmcpID0+IHBrO1xuXG4gIGRlc2NyaWJlKCdNUEN2MiB3YWxsZXRzIChTaWxlbmNlIExhYnMgLyBNUFMgZm9ybXVsYSknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3ZlcmlmaWVzIGEgY29ycmVjdCBhZGRyZXNzIGRlcml2ZWQgd2l0aCBkZXJpdmVVbmhhcmRlbmVkTXBzIGF0IGluZGV4IDAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IGRlcml2ZVVuaGFyZGVuZWRNcHMoVEVTVF9LRVlDSEFJTiwgJ20vMCcpLnNsaWNlKDAsIDY0KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgICB7IGFkZHJlc3M6IGV4cGVjdGVkQWRkcmVzcywga2V5Y2hhaW5zLCBpbmRleDogMCwgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyB9LFxuICAgICAgICBpc1ZhbGlkQWRkcmVzcyxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG4gICAgICByZXN1bHQuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2ZXJpZmllcyBhIGNvcnJlY3QgYWRkcmVzcyBkZXJpdmVkIHdpdGggZGVyaXZlVW5oYXJkZW5lZE1wcyBhdCBpbmRleCAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSBkZXJpdmVVbmhhcmRlbmVkTXBzKFRFU1RfS0VZQ0hBSU4sICdtLzEnKS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyhcbiAgICAgICAgeyBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MsIGtleWNoYWlucywgaW5kZXg6IDEsIG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicgfSxcbiAgICAgICAgaXNWYWxpZEFkZHJlc3MsXG4gICAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhbiBhZGRyZXNzIGRlcml2ZWQgYXQgYSBkaWZmZXJlbnQgaW5kZXgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGFkZHJlc3NGcm9tSW5kZXgwID0gZGVyaXZlVW5oYXJkZW5lZE1wcyhURVNUX0tFWUNIQUlOLCAnbS8wJykuc2xpY2UoMCwgNjQpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICAgIHsgYWRkcmVzczogYWRkcmVzc0Zyb21JbmRleDAsIGtleWNoYWlucywgaW5kZXg6IDEsIG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicgfSxcbiAgICAgICAgaXNWYWxpZEFkZHJlc3MsXG4gICAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS5mYWxzZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSByYW5kb20gYWRkcmVzcyB0aGF0IHdhcyBub3QgZGVyaXZlZCBmcm9tIHRoZSBrZXljaGFpbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyA9IGdldFZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcygpO1xuICAgICAgY29uc3QgcmFuZG9tQWRkcmVzcyA9ICdhYicucmVwZWF0KDMyKTsgLy8gNjQgaGV4IGNoYXJzLCB3cm9uZyBhZGRyZXNzXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyhcbiAgICAgICAgeyBhZGRyZXNzOiByYW5kb21BZGRyZXNzLCBrZXljaGFpbnMsIGluZGV4OiAwLCBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAnTVBDdjInIH0sXG4gICAgICAgIGlzVmFsaWRBZGRyZXNzLFxuICAgICAgICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleVxuICAgICAgKTtcbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcblxuICAgIGl0KCd2ZXJpZmllcyBhIGNvcnJlY3QgTVBDdjIgYWRkcmVzcyBmb3IgU01DIHdhbGxldCB1c2luZyBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBzZWVkID0gJ3NtYy1zZWVkLTEyMyc7XG4gICAgICBjb25zdCBwcmVmaXggPSBnZXREZXJpdmF0aW9uUGF0aChzZWVkKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IGRlcml2ZVVuaGFyZGVuZWRNcHMoVEVTVF9LRVlDSEFJTiwgYCR7cHJlZml4fS8wYCkuc2xpY2UoMCwgNjQpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MsXG4gICAgICAgICAga2V5Y2hhaW5zLFxuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicsXG4gICAgICAgICAgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDogc2VlZCxcbiAgICAgICAgfSxcbiAgICAgICAgaXNWYWxpZEFkZHJlc3MsXG4gICAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgICApO1xuICAgICAgcmVzdWx0LnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVqZWN0cyBhbiBNUEN2MiBhZGRyZXNzIGRlcml2ZWQgYXQgdGhlIHdyb25nIGluZGV4IHdoZW4gZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCBpcyBzZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IHNlZWQgPSAnc21jLXNlZWQtMTIzJztcbiAgICAgIGNvbnN0IHByZWZpeCA9IGdldERlcml2YXRpb25QYXRoKHNlZWQpO1xuICAgICAgY29uc3QgYWRkcmVzc0F0SW5kZXgxID0gZGVyaXZlVW5oYXJkZW5lZE1wcyhURVNUX0tFWUNIQUlOLCBgJHtwcmVmaXh9LzFgKS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyhcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3M6IGFkZHJlc3NBdEluZGV4MSxcbiAgICAgICAgICBrZXljaGFpbnMsXG4gICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJyxcbiAgICAgICAgICBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkOiBzZWVkLFxuICAgICAgICB9LFxuICAgICAgICBpc1ZhbGlkQWRkcmVzcyxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG4gICAgICByZXN1bHQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub24tTVBDdjIgd2FsbGV0cyAoTVBDdjEgZm9ybXVsYSknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3JlamVjdHMgYW4gTVBDdjItZGVyaXZlZCBhZGRyZXNzIHdoZW4gbXVsdGlzaWdUeXBlVmVyc2lvbiBpcyBub3Qgc2V0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKCk7XG4gICAgICAvLyBNUEN2MiAoU2lsZW5jZSBMYWJzKSBhbmQgTVBDdjEgZm9ybXVsYXMgcHJvZHVjZSBkaWZmZXJlbnQgYWRkcmVzc2VzIGZvciB0aGUgc2FtZSBrZXljaGFpbi5cbiAgICAgIC8vIFdpdGhvdXQgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJywgdGhlIE1QQ3YxIGZvcm11bGEgaXMgdXNlZCwgc28gdGhlIE1QQ3YyLWRlcml2ZWRcbiAgICAgIC8vIGFkZHJlc3Mgc2hvdWxkIG5vdCBtYXRjaC5cbiAgICAgIGNvbnN0IG1wY3YyQWRkcmVzcyA9IGRlcml2ZVVuaGFyZGVuZWRNcHMoVEVTVF9LRVlDSEFJTiwgJ20vMCcpLnNsaWNlKDAsIDY0KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgICB7IGFkZHJlc3M6IG1wY3YyQWRkcmVzcywga2V5Y2hhaW5zLCBpbmRleDogMCB9LFxuICAgICAgICBpc1ZhbGlkQWRkcmVzcyxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3ZlcmlmeU1QQ1dhbGxldEFkZHJlc3MgLSBFQ0RTQSAoc2VjcDI1NmsxKScsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZWNkc2FLZXljaGFpbnMgPSBbXG4gICAgeyBjb21tb25LZXljaGFpbjogRUNEU0FfS0VZQ0hBSU4gfSxcbiAgICB7IGNvbW1vbktleWNoYWluOiBFQ0RTQV9LRVlDSEFJTiB9LFxuICAgIHsgY29tbW9uS2V5Y2hhaW46IEVDRFNBX0tFWUNIQUlOIH0sXG4gIF07XG4gIC8vIHNlY3AyNTZrMSBjb21wcmVzc2VkIHB1YmxpYyBrZXkgaXMgMzMgYnl0ZXMgPSA2NiBoZXggY2hhcnNcbiAgY29uc3QgaXNWYWxpZEVjZHNhQWRkcmVzcyA9IChhZGRyOiBzdHJpbmcpID0+IGFkZHIubGVuZ3RoID09PSA2NjtcbiAgY29uc3QgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkgPSAocGs6IHN0cmluZykgPT4gcGs7XG5cbiAgaXQoJ2lnbm9yZXMgbXVsdGlzaWdUeXBlVmVyc2lvbiBNUEN2MiBhbmQgdXNlcyBFY2RzYSBkZXJpdmF0aW9uIGZvciBzZWNwMjU2azEgd2FsbGV0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB2ZXJpZnlNUENXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5TVBDV2FsbGV0QWRkcmVzcygpO1xuICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IG5ldyBFY2RzYSgpLmRlcml2ZVVuaGFyZGVuZWQoRUNEU0FfS0VZQ0hBSU4sICdtLzAnKS5zbGljZSgwLCA2Nik7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2ZXJpZnlNUENXYWxsZXRBZGRyZXNzKFxuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBleHBlY3RlZEFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogZWNkc2FLZXljaGFpbnMsXG4gICAgICAgIGluZGV4OiAwLFxuICAgICAgICBtdWx0aXNpZ1R5cGVWZXJzaW9uOiAnTVBDdjInLFxuICAgICAgICBrZXlDdXJ2ZTogJ3NlY3AyNTZrMScsXG4gICAgICB9LFxuICAgICAgaXNWYWxpZEVjZHNhQWRkcmVzcyxcbiAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgKTtcbiAgICByZXN1bHQuc2hvdWxkLmJlLnRydWUoKTtcbiAgfSk7XG5cbiAgaXQoJ3ZlcmlmaWVzIGEgY29ycmVjdCBzZWNwMjU2azEgYWRkcmVzcyBhdCBpbmRleCAxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlNUENXYWxsZXRBZGRyZXNzKCk7XG4gICAgY29uc3QgZXhwZWN0ZWRBZGRyZXNzID0gbmV3IEVjZHNhKCkuZGVyaXZlVW5oYXJkZW5lZChFQ0RTQV9LRVlDSEFJTiwgJ20vMScpLnNsaWNlKDAsIDY2KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICB7IGFkZHJlc3M6IGV4cGVjdGVkQWRkcmVzcywga2V5Y2hhaW5zOiBlY2RzYUtleWNoYWlucywgaW5kZXg6IDEsIGtleUN1cnZlOiAnc2VjcDI1NmsxJyB9LFxuICAgICAgaXNWYWxpZEVjZHNhQWRkcmVzcyxcbiAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgKTtcbiAgICByZXN1bHQuc2hvdWxkLmJlLnRydWUoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgYW4gYWRkcmVzcyBkZXJpdmVkIGF0IGEgZGlmZmVyZW50IGluZGV4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MgPSBnZXRWZXJpZnlNUENXYWxsZXRBZGRyZXNzKCk7XG4gICAgY29uc3QgYWRkcmVzc0F0SW5kZXgwID0gbmV3IEVjZHNhKCkuZGVyaXZlVW5oYXJkZW5lZChFQ0RTQV9LRVlDSEFJTiwgJ20vMCcpLnNsaWNlKDAsIDY2KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICB7IGFkZHJlc3M6IGFkZHJlc3NBdEluZGV4MCwga2V5Y2hhaW5zOiBlY2RzYUtleWNoYWlucywgaW5kZXg6IDEsIGtleUN1cnZlOiAnc2VjcDI1NmsxJyB9LFxuICAgICAgaXNWYWxpZEVjZHNhQWRkcmVzcyxcbiAgICAgIGdldEFkZHJlc3NGcm9tUHVibGljS2V5XG4gICAgKTtcbiAgICByZXN1bHQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdkZXJpdmVNUENXYWxsZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleSA9IChwazogc3RyaW5nKSA9PiBwaztcblxuICBkZXNjcmliZSgnZWQyNTUxOSAoTVBDdjIpJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGtleWNoYWlucyA9IFt7IGNvbW1vbktleWNoYWluOiBURVNUX0tFWUNIQUlOIH0sIHsgY29tbW9uS2V5Y2hhaW46IFRFU1RfS0VZQ0hBSU4gfV07XG5cbiAgICBpdCgnZGVyaXZlcyB0aGUgYWRkcmVzcyBhbmQgcGF0aCBmb3IgdGhlIHNpbXBsZSBtL3tpbmRleH0gcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRlcml2ZU1QQ1dhbGxldEFkZHJlc3MgPSBnZXREZXJpdmVNUENXYWxsZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBleHBlY3RlZEFkZHJlc3MgPSBkZXJpdmVVbmhhcmRlbmVkTXBzKFRFU1RfS0VZQ0hBSU4sICdtLzMnKS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcml2ZU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICAgIHsga2V5Y2hhaW5zLCBpbmRleDogMywgbXVsdGlzaWdUeXBlVmVyc2lvbjogJ01QQ3YyJywga2V5Q3VydmU6ICdlZDI1NTE5JyB9LFxuICAgICAgICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleVxuICAgICAgKTtcblxuICAgICAgcmVzdWx0LmFkZHJlc3Muc2hvdWxkLmVxdWFsKGV4cGVjdGVkQWRkcmVzcyk7XG4gICAgICByZXN1bHQuZGVyaXZhdGlvblBhdGguc2hvdWxkLmVxdWFsKCdtLzMnKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIHRoZSBTTUMgcHJlZml4IHBhdGggd2hlbiBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkIGlzIHNldCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRlcml2ZU1QQ1dhbGxldEFkZHJlc3MgPSBnZXREZXJpdmVNUENXYWxsZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCBzZWVkID0gJ3NtYy1zZWVkLTEyMyc7XG4gICAgICBjb25zdCBwcmVmaXggPSBnZXREZXJpdmF0aW9uUGF0aChzZWVkKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IGRlcml2ZVVuaGFyZGVuZWRNcHMoVEVTVF9LRVlDSEFJTiwgYCR7cHJlZml4fS8wYCkuc2xpY2UoMCwgNjQpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZXJpdmVNUENXYWxsZXRBZGRyZXNzKFxuICAgICAgICB7IGtleWNoYWlucywgaW5kZXg6IDAsIG11bHRpc2lnVHlwZVZlcnNpb246ICdNUEN2MicsIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ6IHNlZWQsIGtleUN1cnZlOiAnZWQyNTUxOScgfSxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdC5hZGRyZXNzLnNob3VsZC5lcXVhbChleHBlY3RlZEFkZHJlc3MpO1xuICAgICAgcmVzdWx0LmRlcml2YXRpb25QYXRoLnNob3VsZC5lcXVhbChgJHtwcmVmaXh9LzBgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NlY3AyNTZrMScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBlY2RzYUtleWNoYWlucyA9IFt7IGNvbW1vbktleWNoYWluOiBFQ0RTQV9LRVlDSEFJTiB9LCB7IGNvbW1vbktleWNoYWluOiBFQ0RTQV9LRVlDSEFJTiB9XTtcblxuICAgIGl0KCdkZXJpdmVzIHRoZSBzZWNwMjU2azEgYWRkcmVzcyAoMzMtYnl0ZSBwdWJrZXkpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVyaXZlTVBDV2FsbGV0QWRkcmVzcyA9IGdldERlcml2ZU1QQ1dhbGxldEFkZHJlc3MoKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkQWRkcmVzcyA9IG5ldyBFY2RzYSgpLmRlcml2ZVVuaGFyZGVuZWQoRUNEU0FfS0VZQ0hBSU4sICdtLzInKS5zbGljZSgwLCA2Nik7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlcml2ZU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICAgIHsga2V5Y2hhaW5zOiBlY2RzYUtleWNoYWlucywgaW5kZXg6IDIsIGtleUN1cnZlOiAnc2VjcDI1NmsxJyB9LFxuICAgICAgICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleVxuICAgICAgKTtcblxuICAgICAgcmVzdWx0LmFkZHJlc3Muc2hvdWxkLmVxdWFsKGV4cGVjdGVkQWRkcmVzcyk7XG4gICAgICByZXN1bHQuZGVyaXZhdGlvblBhdGguc2hvdWxkLmVxdWFsKCdtLzInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JvdW5kLXRyaXAgd2l0aCB2ZXJpZnlNUENXYWxsZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdhbiBhZGRyZXNzIHByb2R1Y2VkIGJ5IGRlcml2ZU1QQ1dhbGxldEFkZHJlc3MgdmVyaWZpZXMgYXMgdHJ1ZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRlcml2ZU1QQ1dhbGxldEFkZHJlc3MgPSBnZXREZXJpdmVNUENXYWxsZXRBZGRyZXNzKCk7XG4gICAgICBjb25zdCB2ZXJpZnlNUENXYWxsZXRBZGRyZXNzID0gZ2V0VmVyaWZ5TVBDV2FsbGV0QWRkcmVzcygpO1xuICAgICAgY29uc3QgZWNkc2FLZXljaGFpbnMgPSBbeyBjb21tb25LZXljaGFpbjogRUNEU0FfS0VZQ0hBSU4gfSwgeyBjb21tb25LZXljaGFpbjogRUNEU0FfS0VZQ0hBSU4gfV07XG4gICAgICBjb25zdCBpc1ZhbGlkRWNkc2FBZGRyZXNzID0gKGFkZHI6IHN0cmluZykgPT4gYWRkci5sZW5ndGggPT09IDY2O1xuXG4gICAgICBjb25zdCB7IGFkZHJlc3MgfSA9IGF3YWl0IGRlcml2ZU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICAgIHsga2V5Y2hhaW5zOiBlY2RzYUtleWNoYWlucywgaW5kZXg6IDcsIGtleUN1cnZlOiAnc2VjcDI1NmsxJyB9LFxuICAgICAgICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdmVyaWZpZWQgPSBhd2FpdCB2ZXJpZnlNUENXYWxsZXRBZGRyZXNzKFxuICAgICAgICB7IGFkZHJlc3MsIGtleWNoYWluczogZWNkc2FLZXljaGFpbnMsIGluZGV4OiA3LCBrZXlDdXJ2ZTogJ3NlY3AyNTZrMScgfSxcbiAgICAgICAgaXNWYWxpZEVjZHNhQWRkcmVzcyxcbiAgICAgICAgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXlcbiAgICAgICk7XG5cbiAgICAgIHZlcmlmaWVkLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ecdsaEncryptionVersion.d.ts.map