@bitgo-beta/sdk-core 8.2.1-beta.206 → 8.2.1-beta.2060

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 (761) hide show
  1. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
  2. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
  4. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  5. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
  6. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
  7. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
  8. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +43 -31
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +59 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +112 -10
  12. package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
  13. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
  14. package/dist/src/account-lib/baseCoin/errors.js +8 -2
  15. package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
  16. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
  17. package/dist/src/account-lib/baseCoin/iface.js +26 -18
  18. package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
  19. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
  20. package/dist/src/account-lib/baseCoin/index.js +8 -5
  21. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
  22. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  23. package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
  24. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
  25. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  26. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
  27. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
  28. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  29. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
  30. package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
  31. package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
  32. package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
  33. package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
  34. package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
  35. package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
  36. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
  37. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
  38. package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
  39. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
  40. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
  41. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
  42. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
  43. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
  44. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
  45. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
  46. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
  47. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
  48. package/dist/src/account-lib/index.d.ts +0 -1
  49. package/dist/src/account-lib/index.d.ts.map +1 -1
  50. package/dist/src/account-lib/index.js +23 -10
  51. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  52. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  53. package/dist/src/account-lib/mpc/index.js +6 -2
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
  55. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  56. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
  57. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  59. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  60. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
  62. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  63. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  65. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  66. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  67. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  69. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  70. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  71. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  72. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  73. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  74. package/dist/src/account-lib/mpc/util.js +24 -1
  75. package/dist/src/account-lib/staking/index.js +6 -2
  76. package/dist/src/account-lib/staking/utils.js +3 -3
  77. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  78. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  79. package/dist/src/account-lib/util/crypto.js +69 -38
  80. package/dist/src/api/bip32path.js +2 -3
  81. package/dist/src/api/index.js +6 -2
  82. package/dist/src/api/types.d.ts +37 -0
  83. package/dist/src/api/types.d.ts.map +1 -1
  84. package/dist/src/api/types.js +8 -1
  85. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -1
  86. package/dist/src/bitgo/address-book/address-book.js +20 -12
  87. package/dist/src/bitgo/address-book/index.js +6 -2
  88. package/dist/src/bitgo/address-book/types.d.ts +36 -36
  89. package/dist/src/bitgo/address-book/types.d.ts.map +1 -1
  90. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +123 -13
  91. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  92. package/dist/src/bitgo/baseCoin/baseCoin.js +200 -16
  93. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +296 -31
  94. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  95. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  96. package/dist/src/bitgo/baseCoin/index.js +6 -2
  97. package/dist/src/bitgo/bip32util.d.ts +3 -16
  98. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  99. package/dist/src/bitgo/bip32util.js +4 -56
  100. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  101. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  102. package/dist/src/bitgo/bitcoin.js +26 -13
  103. package/dist/src/bitgo/bitgoBase.d.ts +17 -4
  104. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  105. package/dist/src/bitgo/bitgoBase.js +1 -1
  106. package/dist/src/bitgo/coinFactory.d.ts +24 -3
  107. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  108. package/dist/src/bitgo/coinFactory.js +35 -3
  109. package/dist/src/bitgo/config.d.ts +3 -101
  110. package/dist/src/bitgo/config.d.ts.map +1 -1
  111. package/dist/src/bitgo/config.js +26 -15
  112. package/dist/src/bitgo/defi/defiVault.d.ts +171 -0
  113. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  114. package/dist/src/bitgo/defi/defiVault.js +445 -0
  115. package/dist/src/bitgo/defi/iDefiVault.d.ts +101 -0
  116. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  117. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  118. package/dist/src/bitgo/defi/index.d.ts +3 -0
  119. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  120. package/dist/src/bitgo/defi/index.js +22 -0
  121. package/dist/src/bitgo/ecdh.d.ts +0 -1
  122. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  123. package/dist/src/bitgo/ecdh.js +26 -13
  124. package/dist/src/bitgo/enterprise/enterprise.d.ts +9 -4
  125. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  126. package/dist/src/bitgo/enterprise/enterprise.js +47 -21
  127. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  128. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +5 -3
  129. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  130. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  131. package/dist/src/bitgo/enterprise/index.js +6 -2
  132. package/dist/src/bitgo/environments.d.ts +68 -3
  133. package/dist/src/bitgo/environments.d.ts.map +1 -1
  134. package/dist/src/bitgo/environments.js +414 -34
  135. package/dist/src/bitgo/errors.d.ts +182 -1
  136. package/dist/src/bitgo/errors.d.ts.map +1 -1
  137. package/dist/src/bitgo/errors.js +177 -3
  138. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  139. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  140. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  141. package/dist/src/bitgo/index.d.ts +5 -1
  142. package/dist/src/bitgo/index.d.ts.map +1 -1
  143. package/dist/src/bitgo/index.js +31 -11
  144. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  145. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  146. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  147. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  148. package/dist/src/bitgo/internal/index.js +6 -2
  149. package/dist/src/bitgo/internal/internal.js +5 -6
  150. package/dist/src/bitgo/internal/keycard.d.ts +13 -8
  151. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  152. package/dist/src/bitgo/internal/keycard.js +63 -48
  153. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
  154. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  155. package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
  156. package/dist/src/bitgo/keychain/iKeychains.d.ts +132 -11
  157. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  158. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  159. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  160. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  161. package/dist/src/bitgo/keychain/index.js +7 -2
  162. package/dist/src/bitgo/keychain/keychains.d.ts +59 -7
  163. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  164. package/dist/src/bitgo/keychain/keychains.js +298 -53
  165. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  166. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  167. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  168. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  169. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  170. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  171. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  172. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  173. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  174. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  175. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  176. package/dist/src/bitgo/market/index.js +6 -2
  177. package/dist/src/bitgo/market/markets.js +23 -9
  178. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +5 -1
  179. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  180. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  181. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  182. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  183. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  184. package/dist/src/bitgo/pendingApproval/pendingApproval.js +246 -111
  185. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  186. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  187. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  188. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  189. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  190. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  191. package/dist/src/bitgo/proofs/index.js +6 -0
  192. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  193. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  194. package/dist/src/bitgo/proofs/types.js +80 -0
  195. package/dist/src/bitgo/recovery/index.js +6 -2
  196. package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
  197. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  198. package/dist/src/bitgo/recovery/initiate.js +49 -41
  199. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +13 -0
  200. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  201. package/dist/src/bitgo/safe/derivableEd25519Pub.js +35 -0
  202. package/dist/src/bitgo/safe/iSafe.d.ts +95 -0
  203. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
  204. package/dist/src/bitgo/safe/iSafe.js +3 -0
  205. package/dist/src/bitgo/safe/iSafes.d.ts +94 -0
  206. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
  207. package/dist/src/bitgo/safe/iSafes.js +3 -0
  208. package/dist/src/bitgo/safe/index.d.ts +7 -0
  209. package/dist/src/bitgo/safe/index.d.ts.map +1 -0
  210. package/dist/src/bitgo/safe/index.js +23 -0
  211. package/dist/src/bitgo/safe/safe.d.ts +72 -0
  212. package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
  213. package/dist/src/bitgo/safe/safe.js +289 -0
  214. package/dist/src/bitgo/safe/safes.d.ts +107 -0
  215. package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
  216. package/dist/src/bitgo/safe/safes.js +317 -0
  217. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  218. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  219. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  220. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  221. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  222. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  223. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  224. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  225. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  226. package/dist/src/bitgo/staking/iStakingWallet.d.ts +165 -8
  227. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  228. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  229. package/dist/src/bitgo/staking/index.d.ts +3 -0
  230. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  231. package/dist/src/bitgo/staking/index.js +9 -2
  232. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  233. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  234. package/dist/src/bitgo/staking/stakingWallet.js +153 -7
  235. package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
  236. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  237. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  238. package/dist/src/bitgo/trading/index.d.ts +1 -0
  239. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  240. package/dist/src/bitgo/trading/index.js +7 -2
  241. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  242. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  243. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  244. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  245. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  246. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  247. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  248. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  249. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  250. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  251. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  252. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  253. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  254. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  255. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  256. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  257. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  258. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  259. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  260. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  261. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  262. package/dist/src/bitgo/trading/network/index.d.ts +2 -0
  263. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -1
  264. package/dist/src/bitgo/trading/network/index.js +8 -2
  265. package/dist/src/bitgo/trading/network/network.d.ts +4 -3
  266. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  267. package/dist/src/bitgo/trading/network/network.js +24 -27
  268. package/dist/src/bitgo/trading/network/types.d.ts +79 -46
  269. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  270. package/dist/src/bitgo/trading/network/types.js +1 -1
  271. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  272. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  273. package/dist/src/bitgo/trading/network/utils.js +54 -0
  274. package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
  275. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  276. package/dist/src/bitgo/trading/tradingAccount.js +55 -7
  277. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +49 -0
  278. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  279. package/dist/src/bitgo/tss/bitgoPubKeys.js +92 -0
  280. package/dist/src/bitgo/tss/common.d.ts +41 -6
  281. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  282. package/dist/src/bitgo/tss/common.js +127 -17
  283. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  284. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  285. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  286. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  287. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  288. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  289. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  290. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  291. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  292. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  293. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  294. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  295. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  296. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  297. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  298. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
  299. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  300. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
  301. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  302. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  303. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  304. package/dist/src/bitgo/tss/index.d.ts +3 -2
  305. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  306. package/dist/src/bitgo/tss/index.js +26 -10
  307. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +50 -0
  308. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  309. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +112 -0
  310. package/dist/src/bitgo/tss/types.d.ts +3 -3
  311. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  312. package/dist/src/bitgo/tss/types.js +2 -2
  313. package/dist/src/bitgo/types.d.ts +3 -3
  314. package/dist/src/bitgo/types.d.ts.map +1 -1
  315. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +10 -0
  316. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  317. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +76 -14
  318. package/dist/src/bitgo/utils/codecProps.js +24 -11
  319. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  320. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  321. package/dist/src/bitgo/utils/codecs.js +59 -0
  322. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  323. package/dist/src/bitgo/utils/decode.js +30 -16
  324. package/dist/src/bitgo/utils/index.d.ts +4 -2
  325. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  326. package/dist/src/bitgo/utils/index.js +27 -11
  327. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  328. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  329. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  330. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  331. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  332. package/dist/src/bitgo/utils/mpcUtils.js +189 -14
  333. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  334. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  335. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  336. package/dist/src/bitgo/utils/opengpgUtils.d.ts +11 -7
  337. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  338. package/dist/src/bitgo/utils/opengpgUtils.js +79 -62
  339. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  340. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  341. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  342. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  343. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  344. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  345. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  346. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  347. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  348. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  349. package/dist/src/bitgo/utils/triple.js +2 -3
  350. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  351. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  352. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  353. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +94 -17
  354. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  355. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +305 -45
  356. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +433 -55
  357. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  358. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  359. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  360. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  361. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  362. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  363. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  364. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  365. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
  366. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  367. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +173 -246
  368. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +240 -0
  369. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  370. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1076 -0
  371. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +16 -0
  372. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  373. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +37 -0
  374. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +69 -0
  375. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
  376. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +442 -0
  377. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +5 -0
  378. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  379. package/dist/src/bitgo/utils/tss/ecdsa/index.js +11 -2
  380. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  381. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  382. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  383. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +125 -0
  384. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  385. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  386. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  387. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  388. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  389. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  390. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  391. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  392. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +38 -11
  393. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  394. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
  395. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +209 -0
  396. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  397. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +875 -0
  398. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  399. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  400. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +16 -0
  401. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +25 -0
  402. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  403. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +241 -0
  404. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +5 -0
  405. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  406. package/dist/src/bitgo/utils/tss/eddsa/index.js +30 -8
  407. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +15 -7
  408. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  409. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  410. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +53 -0
  411. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  412. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +55 -0
  413. package/dist/src/bitgo/utils/tss/index.d.ts +6 -0
  414. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  415. package/dist/src/bitgo/utils/tss/index.js +30 -10
  416. package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts +40 -0
  417. package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
  418. package/dist/src/bitgo/utils/tss/keyShareEnvelope.js +103 -0
  419. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  420. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  421. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  422. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +41 -0
  423. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  424. package/dist/src/bitgo/utils/tss/recipientUtils.js +162 -0
  425. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
  426. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
  427. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +126 -0
  428. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
  429. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
  430. package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
  431. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +27 -0
  432. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  433. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +43 -0
  434. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +45 -0
  435. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
  436. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
  437. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
  438. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
  439. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
  440. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
  441. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
  442. package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
  443. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  444. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  445. package/dist/src/bitgo/utils/txRequest.js +49 -0
  446. package/dist/src/bitgo/utils/util.js +24 -10
  447. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  448. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  449. package/dist/src/bitgo/utils/wallet.js +48 -0
  450. package/dist/src/bitgo/v1Wallets.d.ts +170 -0
  451. package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
  452. package/dist/src/bitgo/v1Wallets.js +3 -0
  453. package/dist/src/bitgo/wallet/BuildParams.d.ts +89 -1
  454. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  455. package/dist/src/bitgo/wallet/BuildParams.js +90 -11
  456. package/dist/src/bitgo/wallet/iWallet.d.ts +583 -33
  457. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  458. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  459. package/dist/src/bitgo/wallet/iWallets.d.ts +310 -16
  460. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  461. package/dist/src/bitgo/wallet/iWallets.js +84 -3
  462. package/dist/src/bitgo/wallet/index.d.ts +1 -0
  463. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  464. package/dist/src/bitgo/wallet/index.js +7 -2
  465. package/dist/src/bitgo/wallet/safeKeychain.d.ts +75 -0
  466. package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -0
  467. package/dist/src/bitgo/wallet/safeKeychain.js +151 -0
  468. package/dist/src/bitgo/wallet/wallet.d.ts +359 -27
  469. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  470. package/dist/src/bitgo/wallet/wallet.js +2205 -390
  471. package/dist/src/bitgo/wallet/wallets.d.ts +99 -4
  472. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  473. package/dist/src/bitgo/wallet/wallets.js +1242 -156
  474. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  475. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  476. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  477. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  478. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  479. package/dist/src/bitgo/walletUtil/index.js +19 -0
  480. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  481. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  482. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  483. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  484. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  485. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  486. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  487. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  488. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  489. package/dist/src/bitgo/webhook/index.js +6 -2
  490. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  491. package/dist/src/coins/fiat.d.ts +45 -0
  492. package/dist/src/coins/fiat.d.ts.map +1 -0
  493. package/dist/src/coins/fiat.js +94 -0
  494. package/dist/src/coins/index.d.ts +1 -6
  495. package/dist/src/coins/index.d.ts.map +1 -1
  496. package/dist/src/coins/index.js +7 -8
  497. package/dist/src/coins/ofc.d.ts +21 -2
  498. package/dist/src/coins/ofc.d.ts.map +1 -1
  499. package/dist/src/coins/ofc.js +29 -3
  500. package/dist/src/coins/ofcToken.d.ts +15 -4
  501. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  502. package/dist/src/coins/ofcToken.js +43 -5
  503. package/dist/src/coins/susd.d.ts +3 -2
  504. package/dist/src/coins/susd.d.ts.map +1 -1
  505. package/dist/src/coins/susd.js +5 -1
  506. package/dist/src/common.js +27 -13
  507. package/dist/src/index.d.ts +9 -1
  508. package/dist/src/index.d.ts.map +1 -1
  509. package/dist/src/index.js +40 -11
  510. package/dist/src/lightning.d.ts +20 -0
  511. package/dist/src/lightning.d.ts.map +1 -0
  512. package/dist/src/lightning.js +13 -0
  513. package/dist/src/units.js +5 -6
  514. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  515. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  516. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  517. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  518. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  519. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  520. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  521. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  522. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  523. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  524. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  525. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  526. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  527. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  528. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  529. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  530. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  531. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  532. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  533. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  534. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  535. package/dist/test/unit/bitgo/defi/defiVault.js +863 -0
  536. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  537. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  538. package/dist/test/unit/bitgo/environment.js +38 -0
  539. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  540. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  541. package/dist/test/unit/bitgo/errors.js +262 -0
  542. package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
  543. package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
  544. package/dist/test/unit/bitgo/keychain/keychains.js +166 -0
  545. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  546. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  547. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  548. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts +2 -0
  549. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  550. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +133 -0
  551. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +72 -0
  552. package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
  553. package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
  554. package/dist/test/unit/bitgo/safe/safe.js +415 -0
  555. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
  556. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
  557. package/dist/test/unit/bitgo/safe/safeDerivation.js +75 -0
  558. package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
  559. package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
  560. package/dist/test/unit/bitgo/safe/safes.js +376 -0
  561. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  562. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  563. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  564. package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
  565. package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
  566. package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
  567. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  568. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  569. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  570. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
  571. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  572. package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
  573. package/dist/test/unit/bitgo/tss/common.d.ts +2 -0
  574. package/dist/test/unit/bitgo/tss/common.d.ts.map +1 -0
  575. package/dist/test/unit/bitgo/tss/common.js +77 -0
  576. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  577. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  578. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +181 -0
  579. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -4
  580. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  581. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  582. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  583. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts +2 -0
  584. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts.map +1 -0
  585. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.js +106 -0
  586. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  587. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  588. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  589. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  590. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  591. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  592. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  593. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  594. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  595. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
  596. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  597. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  598. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  599. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  600. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  601. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1068 -0
  602. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  603. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  604. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  605. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  606. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  607. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  608. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  609. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  610. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1937 -0
  611. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
  612. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  613. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +174 -0
  614. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  615. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  616. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  617. package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts +2 -0
  618. package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
  619. package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.js +83 -0
  620. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  621. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  622. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  623. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  624. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  625. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +434 -0
  626. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  627. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  628. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +80 -0
  629. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
  630. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
  631. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +279 -0
  632. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
  633. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
  634. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
  635. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  636. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  637. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  638. package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
  639. package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
  640. package/dist/test/unit/bitgo/utils/wallet.js +55 -0
  641. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  642. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  643. package/dist/test/unit/bitgo/wallet/BuildParams.js +141 -0
  644. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +79 -9
  645. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  646. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  647. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  648. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
  649. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
  650. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
  651. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  652. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  653. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  654. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  655. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  656. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  657. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  658. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  659. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  660. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
  661. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
  662. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
  663. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  664. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  665. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  666. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts +5 -0
  667. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts.map +1 -0
  668. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +671 -0
  669. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts +9 -0
  670. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts.map +1 -0
  671. package/dist/test/unit/bitgo/wallet/safeShareWallet.js +303 -0
  672. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  673. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  674. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  675. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  676. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  677. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  678. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  679. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  680. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +69 -0
  681. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  682. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  683. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  684. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  685. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  686. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +304 -0
  687. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  688. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  689. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  690. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  691. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  692. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +675 -0
  693. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
  694. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
  695. package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
  696. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  697. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  698. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  699. package/dist/test/unit/coins/ofc.d.ts +2 -0
  700. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  701. package/dist/test/unit/coins/ofc.js +124 -0
  702. package/dist/test/unit/lightning.d.ts +2 -0
  703. package/dist/test/unit/lightning.d.ts.map +1 -0
  704. package/dist/test/unit/lightning.js +23 -0
  705. package/dist/test/unit/units.d.ts.map +1 -1
  706. package/dist/test/unit/units.js +64 -64
  707. package/dist/tsconfig.tsbuildinfo +1 -1
  708. package/package.json +25 -22
  709. package/.eslintignore +0 -5
  710. package/CHANGELOG.md +0 -1712
  711. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  712. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  713. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  714. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +0 -49
  715. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +0 -1
  716. package/dist/src/account-lib/util/ed25519KeyDeriver.js +0 -87
  717. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  718. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  719. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  720. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  721. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  722. package/dist/src/bitgo/lightning/index.js +0 -17
  723. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  724. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  725. package/dist/src/bitgo/lightning/lightning.js +0 -111
  726. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  727. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  728. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  729. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  730. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  731. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  732. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  733. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  734. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  735. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  736. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  737. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  738. package/dist/src/coins/fiateur.d.ts +0 -31
  739. package/dist/src/coins/fiateur.d.ts.map +0 -1
  740. package/dist/src/coins/fiateur.js +0 -57
  741. package/dist/src/coins/fiatgbp.d.ts +0 -31
  742. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  743. package/dist/src/coins/fiatgbp.js +0 -57
  744. package/dist/src/coins/fiatusd.d.ts +0 -31
  745. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  746. package/dist/src/coins/fiatusd.js +0 -57
  747. package/dist/src/coins/tfiateur.d.ts +0 -11
  748. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  749. package/dist/src/coins/tfiateur.js +0 -17
  750. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  751. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  752. package/dist/src/coins/tfiatgbp.js +0 -17
  753. package/dist/src/coins/tfiatusd.d.ts +0 -11
  754. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  755. package/dist/src/coins/tfiatusd.js +0 -17
  756. package/dist/src/openssl/index.d.ts +0 -5
  757. package/dist/src/openssl/index.d.ts.map +0 -1
  758. package/dist/src/openssl/index.js +0 -9
  759. package/dist/test/unit/openssl.d.ts +0 -2
  760. package/dist/test/unit/openssl.d.ts.map +0 -1
  761. package/dist/test/unit/openssl.js +0 -39
@@ -0,0 +1,875 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.EddsaMPCv2RecoveryFunctions = exports.EddsaMPCv2Utils = void 0;
40
+ exports.isEddsaMpcV1SigningMaterial = isEddsaMpcV1SigningMaterial;
41
+ exports.getEddsaMpcV2RecoveryKeySharesFromReducedKey = getEddsaMpcV2RecoveryKeySharesFromReducedKey;
42
+ exports.signRecoveryEddsaMPCv2 = signRecoveryEddsaMPCv2;
43
+ exports.getEddsaSigningMaterial = getEddsaSigningMaterial;
44
+ exports.isEddsaSigningMaterial = isEddsaSigningMaterial;
45
+ exports.signEddsaMpcV2RecoveryTx = signEddsaMpcV2RecoveryTx;
46
+ const assert_1 = __importDefault(require("assert"));
47
+ const sjcl = __importStar(require("@bitgo-beta/sjcl"));
48
+ const pgp = __importStar(require("openpgp"));
49
+ const io_ts_types_1 = require("io-ts-types");
50
+ const public_types_1 = require("@bitgo/public-types");
51
+ const ed25519_1 = require("@noble/curves/ed25519");
52
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
53
+ const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
54
+ const common_1 = require("../../../tss/common");
55
+ const codecs_1 = require("../../codecs");
56
+ const eddsaMPCv2_1 = require("../../../tss/eddsa/eddsaMPCv2");
57
+ const eddsa_1 = require("../../../tss/eddsa/eddsa");
58
+ const opengpgUtils_1 = require("../../opengpgUtils");
59
+ const typesMPCv2_1 = require("../ecdsa/typesMPCv2");
60
+ const baseTypes_1 = require("../baseTypes");
61
+ const base_1 = require("./base");
62
+ const recipientUtils_1 = require("../recipientUtils");
63
+ const eddsaMPCv2KeyGenSender_1 = require("./eddsaMPCv2KeyGenSender");
64
+ const keyShareEnvelope_1 = require("../keyShareEnvelope");
65
+ class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
66
+ /** @inheritdoc */
67
+ async createKeychains(params) {
68
+ const userKeyPair = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
69
+ const userGpgKey = await pgp.readPrivateKey({ armoredKey: userKeyPair.privateKey });
70
+ const userGpgPublicKey = userKeyPair.publicKey;
71
+ const [userPk, userSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(userGpgKey);
72
+ const backupKeyPair = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
73
+ const backupGpgKey = await pgp.readPrivateKey({ armoredKey: backupKeyPair.privateKey });
74
+ const backupGpgPublicKey = backupKeyPair.publicKey;
75
+ const [backupPk, backupSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(backupGpgKey);
76
+ // Get the BitGo EdDSA MPCv2 public key (ed25519). Using the default mpcv2PublicKey (secp256k1)
77
+ // here would cause a WASM "Invalid Input" error, so we require the dedicated eddsaMpcv2PublicKey.
78
+ const { eddsaMpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise, true);
79
+ const bitgoPublicGpgKey = eddsaMpcv2PublicKey ?? this.bitgoEddsaMpcv2PublicGpgKey;
80
+ (0, assert_1.default)(bitgoPublicGpgKey, 'Failed to get BitGo EdDSA MPCv2 GPG public key');
81
+ const bitgoPublicGpgKeyArmored = bitgoPublicGpgKey.armor();
82
+ if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
83
+ (0, assert_1.default)((0, bitgoPubKeys_1.isBitgoEddsaMpcv2PubKey)(bitgoPublicGpgKeyArmored), 'Invalid BitGo GPG public key');
84
+ }
85
+ const bitgoKeyObj = await pgp.readKey({ armoredKey: bitgoPublicGpgKeyArmored });
86
+ const bitgoPk = await sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(bitgoKeyObj);
87
+ // Create DKG sessions for user (party 0) and backup (party 1)
88
+ const { userDkg, backupDkg } = await this.getUserAndBackupSession(params.retrofit);
89
+ // #region round 1
90
+ await userDkg.initDkg(userSk, [backupPk, bitgoPk]);
91
+ await backupDkg.initDkg(backupSk, [userPk, bitgoPk]);
92
+ const userMsg1 = userDkg.getFirstMessage();
93
+ const backupMsg1 = backupDkg.getFirstMessage();
94
+ const userSignedMsg1 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(userMsg1.payload), userGpgKey);
95
+ const backupSignedMsg1 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(backupMsg1.payload), backupGpgKey);
96
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
97
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupGpgPublicKey), 'Backup GPG public key is required');
98
+ const { sessionId, bitgoMsg1 } = await this.sendKeyGenerationRound1(params.enterprise, {
99
+ userGpgPublicKey,
100
+ backupGpgPublicKey,
101
+ userMsg1: userSignedMsg1,
102
+ backupMsg1: backupSignedMsg1,
103
+ ...(params.retrofit?.walletId ? { walletId: params.retrofit.walletId } : {}),
104
+ }, params.safeId);
105
+ // #endregion
106
+ // #region round 2
107
+ const bitgoRawMsg1Bytes = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(bitgoMsg1, bitgoKeyObj);
108
+ const bitgoDeserializedMsg1 = {
109
+ from: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
110
+ payload: new Uint8Array(bitgoRawMsg1Bytes),
111
+ };
112
+ const round1Messages = [userMsg1, backupMsg1, bitgoDeserializedMsg1];
113
+ const userRound2Msgs = userDkg.handleIncomingMessages(round1Messages);
114
+ const backupRound2Msgs = backupDkg.handleIncomingMessages(round1Messages);
115
+ (0, assert_1.default)(userRound2Msgs.length === 1, 'User round 1 should produce exactly one round 2 message');
116
+ (0, assert_1.default)(backupRound2Msgs.length === 1, 'Backup round 1 should produce exactly one round 2 message');
117
+ const userMsg2 = userRound2Msgs[0];
118
+ const backupMsg2 = backupRound2Msgs[0];
119
+ const userSignedMsg2 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(userMsg2.payload), userGpgKey);
120
+ const backupSignedMsg2 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(backupMsg2.payload), backupGpgKey);
121
+ const { sessionId: sessionIdRound2, commonPublicKeychain, bitgoMsg2, } = await this.sendKeyGenerationRound2(params.enterprise, {
122
+ sessionId,
123
+ userMsg2: userSignedMsg2,
124
+ backupMsg2: backupSignedMsg2,
125
+ });
126
+ // #endregion
127
+ // #region keychain creation
128
+ assert_1.default.equal(sessionId, sessionIdRound2, 'Round 1 and round 2 session IDs do not match');
129
+ const bitgoRawMsg2Bytes = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(bitgoMsg2, bitgoKeyObj);
130
+ const bitgoDeserializedMsg2 = {
131
+ from: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
132
+ payload: new Uint8Array(bitgoRawMsg2Bytes),
133
+ };
134
+ const round2Messages = [userMsg2, backupMsg2, bitgoDeserializedMsg2];
135
+ const userFinalMsgs = userDkg.handleIncomingMessages(round2Messages);
136
+ const backupFinalMsgs = backupDkg.handleIncomingMessages(round2Messages);
137
+ (0, assert_1.default)(userFinalMsgs.length === 0, 'WASM round 2 should produce no output messages for user');
138
+ (0, assert_1.default)(backupFinalMsgs.length === 0, 'WASM round 2 should produce no output messages for backup');
139
+ const userCommonKeychain = userDkg.getCommonKeychain();
140
+ const backupCommonKeychain = backupDkg.getCommonKeychain();
141
+ assert_1.default.equal(userCommonKeychain, commonPublicKeychain, 'User computed keychain does not match BitGo common keychain');
142
+ assert_1.default.equal(backupCommonKeychain, commonPublicKeychain, 'Backup computed keychain does not match BitGo common keychain');
143
+ const userPrivateMaterial = userDkg.getKeyShare();
144
+ const backupPrivateMaterial = backupDkg.getKeyShare();
145
+ const userReducedPrivateMaterial = userDkg.getReducedKeyShare();
146
+ const backupReducedPrivateMaterial = backupDkg.getReducedKeyShare();
147
+ const userKeychainPromise = this.addUserKeychain(userCommonKeychain, userPrivateMaterial, userReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.webauthnInfo, params.encryptionVersion, params.enterprise, params.safeId);
148
+ const backupKeychainPromise = this.addBackupKeychain(backupCommonKeychain, backupPrivateMaterial, backupReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.encryptionVersion, params.enterprise, params.safeId);
149
+ const bitgoKeychainPromise = this.addBitgoKeychain(userCommonKeychain, params.safeId);
150
+ const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
151
+ userKeychainPromise,
152
+ backupKeychainPromise,
153
+ bitgoKeychainPromise,
154
+ ]);
155
+ // #endregion
156
+ return {
157
+ userKeychain,
158
+ backupKeychain,
159
+ bitgoKeychain,
160
+ };
161
+ }
162
+ async createKeychainsWithExternalSigner(params) {
163
+ const { enterprise, callbacks } = params;
164
+ const { eddsaMpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(enterprise, true);
165
+ const bitgoPublicGpgKey = eddsaMpcv2PublicKey ?? this.bitgoEddsaMpcv2PublicGpgKey;
166
+ (0, assert_1.default)(bitgoPublicGpgKey, 'Failed to get BitGo EdDSA MPCv2 GPG public key');
167
+ const bitgoPublicGpgKeyArmored = bitgoPublicGpgKey.armor();
168
+ if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
169
+ (0, assert_1.default)((0, bitgoPubKeys_1.isBitgoEddsaMpcv2PubKey)(bitgoPublicGpgKeyArmored), 'Invalid BitGo EdDSA MPCv2 GPG public key');
170
+ }
171
+ // Round 0: both parties generate GPG keys
172
+ const { userGpgPublicKey, backupGpgPublicKey, userState, backupState } = await callbacks.initializeCallback({
173
+ enterprise,
174
+ bitgoPublicGpgKey: bitgoPublicGpgKeyArmored,
175
+ });
176
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
177
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupGpgPublicKey), 'Backup GPG public key is required');
178
+ // Round 1: both parties run DKG round 1
179
+ const { userSignedMsg1, backupSignedMsg1, userState: userStateAfter1, backupState: backupStateAfter1, } = await callbacks.round1Callback({
180
+ bitgoPublicGpgKey: bitgoPublicGpgKeyArmored,
181
+ userGpgPublicKey,
182
+ backupGpgPublicKey,
183
+ userState,
184
+ backupState,
185
+ });
186
+ const { sessionId, bitgoMsg1 } = await this.sendKeyGenerationRound1(enterprise, {
187
+ userGpgPublicKey,
188
+ backupGpgPublicKey,
189
+ userMsg1: userSignedMsg1,
190
+ backupMsg1: backupSignedMsg1,
191
+ });
192
+ // Round 2: both parties run DKG round 2
193
+ const { userSignedMsg2, backupSignedMsg2, userState: userStateAfter2, backupState: backupStateAfter2, } = await callbacks.round2Callback({
194
+ bitgoMsg1,
195
+ userSignedMsg1,
196
+ backupSignedMsg1,
197
+ userState: userStateAfter1,
198
+ backupState: backupStateAfter1,
199
+ });
200
+ const { sessionId: sessionIdRound2, commonPublicKeychain: bitgoCommonKeychain, bitgoMsg2, } = await this.sendKeyGenerationRound2(enterprise, {
201
+ sessionId,
202
+ userMsg2: userSignedMsg2,
203
+ backupMsg2: backupSignedMsg2,
204
+ });
205
+ assert_1.default.strictEqual(sessionId, sessionIdRound2, 'Round 1 and round 2 session IDs do not match');
206
+ // Finalize: both parties verify and derive the common keychain
207
+ const { commonKeychain } = await callbacks.finalizeCallback({
208
+ bitgoMsg2,
209
+ bitgoCommonKeychain,
210
+ userState: userStateAfter2,
211
+ backupState: backupStateAfter2,
212
+ });
213
+ assert_1.default.strictEqual(commonKeychain, bitgoCommonKeychain, 'Common keychains do not match');
214
+ const keychains = this.baseCoin.keychains();
215
+ const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
216
+ keychains.add({ source: 'user', keyType: 'tss', commonKeychain, isMPCv2: true, enterprise }),
217
+ keychains.add({ source: 'backup', keyType: 'tss', commonKeychain, isMPCv2: true, enterprise }),
218
+ this.addBitgoKeychain(commonKeychain),
219
+ ]);
220
+ return { userKeychain, backupKeychain, bitgoKeychain };
221
+ }
222
+ // #region keychain utils
223
+ async createParticipantKeychain(participantIndex, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId) {
224
+ let source;
225
+ let encryptedPrv = undefined;
226
+ let reducedEncryptedPrv = undefined;
227
+ let privateMaterialBase64 = undefined;
228
+ switch (participantIndex) {
229
+ case typesMPCv2_1.MPCv2PartiesEnum.USER:
230
+ case typesMPCv2_1.MPCv2PartiesEnum.BACKUP:
231
+ source = participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER ? 'user' : 'backup';
232
+ (0, assert_1.default)(privateMaterial, `Private material is required for ${source} keychain`);
233
+ (0, assert_1.default)(reducedPrivateMaterial, `Reduced private material is required for ${source} keychain`);
234
+ (0, assert_1.default)(passphrase, `Passphrase is required for ${source} keychain`);
235
+ privateMaterialBase64 = privateMaterial.toString('base64');
236
+ encryptedPrv = await this.bitgo.encrypt({
237
+ input: privateMaterialBase64,
238
+ password: passphrase,
239
+ encryptionVersion,
240
+ });
241
+ // Encrypts the CBOR-encoded ReducedKeyShare (which contains the party's public
242
+ // key) with the wallet passphrase. The result is stored as reducedEncryptedPrv
243
+ // on the key card QR code and represents a second copy of key material
244
+ // beyond the server-stored encryptedPrv.
245
+ reducedEncryptedPrv = await this.bitgo.encrypt({
246
+ // Buffer.toString('base64') can not be used here as it does not work on the browser.
247
+ // The browser deals with a Buffer as Uint8Array, therefore in the browser .toString('base64') just creates a comma separated string of the array values.
248
+ input: btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(reducedPrivateMaterial)))),
249
+ password: passphrase,
250
+ encryptionVersion,
251
+ });
252
+ break;
253
+ case typesMPCv2_1.MPCv2PartiesEnum.BITGO:
254
+ source = 'bitgo';
255
+ break;
256
+ default:
257
+ throw new Error('Invalid participant index');
258
+ }
259
+ const keychainParams = {
260
+ source,
261
+ keyType: 'tss',
262
+ commonKeychain,
263
+ encryptedPrv,
264
+ originalPasscodeEncryptionCode,
265
+ isMPCv2: true,
266
+ safeId,
267
+ enterprise,
268
+ };
269
+ if (webauthnInfo && participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER && privateMaterialBase64) {
270
+ // Send the passkey as `webauthnInfo`; the deprecated `webauthnDevices` array is ignored by POST /key.
271
+ (0, assert_1.default)(enterprise, 'enterprise is required to attach a webauthn device to the user keychain');
272
+ keychainParams.webauthnInfo = {
273
+ otpDeviceId: webauthnInfo.otpDeviceId,
274
+ prfSalt: webauthnInfo.prfSalt,
275
+ encryptedPrv: await this.bitgo.encrypt({
276
+ input: privateMaterialBase64,
277
+ password: webauthnInfo.passphrase,
278
+ encryptionVersion,
279
+ }),
280
+ enterpriseId: enterprise,
281
+ };
282
+ }
283
+ const keychains = this.baseCoin.keychains();
284
+ return { ...(await keychains.add(keychainParams)), reducedEncryptedPrv };
285
+ }
286
+ async addUserKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId) {
287
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise, safeId);
288
+ }
289
+ async addBackupKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, encryptionVersion, enterprise, safeId) {
290
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, undefined, encryptionVersion, enterprise, safeId);
291
+ }
292
+ async addBitgoKeychain(commonKeychain, safeId) {
293
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain, undefined, undefined, undefined, undefined, undefined, undefined, undefined, safeId);
294
+ }
295
+ // #endregion
296
+ async sendKeyGenerationRound1(enterprise, payload, safeId) {
297
+ return this.sendKeyGenerationRound1BySender((0, eddsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise, safeId), payload);
298
+ }
299
+ async sendKeyGenerationRound1BySender(senderFn, payload) {
300
+ return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], payload);
301
+ }
302
+ async sendKeyGenerationRound2(enterprise, payload) {
303
+ return this.sendKeyGenerationRound2BySender((0, eddsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
304
+ }
305
+ async sendKeyGenerationRound2BySender(senderFn, payload) {
306
+ return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2'], payload);
307
+ }
308
+ // #endregion
309
+ // #region sign tx request
310
+ /**
311
+ * Signs the transaction associated with the transaction request.
312
+ * @param {string | TxRequest} params.txRequest - transaction request object or id
313
+ * @param {string} params.prv - decrypted private key
314
+ * @param {string} params.reqId - request id
315
+ * @returns {Promise<TxRequest>} fully signed TxRequest
316
+ */
317
+ async signTxRequest(params) {
318
+ this.bitgo.setRequestTracer(params.reqId);
319
+ return this.signRequestBase(params, baseTypes_1.RequestType.tx);
320
+ }
321
+ /**
322
+ * Signs the message associated with the transaction request.
323
+ * @param {string | TxRequest} params.txRequest - transaction request object or id
324
+ * @param {string} params.prv - decrypted private key
325
+ * @param {string} params.reqId - request id
326
+ * @returns {Promise<TxRequest>} fully signed TxRequest
327
+ */
328
+ async signTxRequestForMessage(params) {
329
+ this.bitgo.setRequestTracer(params.reqId);
330
+ return this.signRequestBase(params, baseTypes_1.RequestType.message);
331
+ }
332
+ /**
333
+ * Full 3-round EdDSA MPCv2 (MPS) online signing orchestration.
334
+ *
335
+ * Protocol overview:
336
+ * WASM Round 0 → getFirstMessage() (produces userMsg1)
337
+ * API Round 1 → send userMsg1 / recv bitgoMsg1
338
+ * WASM Round 1 → handleIncomingMessages([userMsg1, bitgoMsg1]) (produces userMsg2)
339
+ * API Round 2 → send userMsg2 / recv bitgoMsg2
340
+ * WASM Round 2 → handleIncomingMessages([userMsg2, bitgoMsg2]) (produces userMsg3)
341
+ * API Round 3 → send userMsg3 (WP finalises; no BitGo msg returned to client)
342
+ */
343
+ async signRequestBase(params, requestType) {
344
+ const userKeyShare = Buffer.from(params.prv, 'base64');
345
+ const txRequest = typeof params.txRequest === 'string'
346
+ ? await (0, common_1.getTxRequest)(this.bitgo, this.wallet.id(), params.txRequest, params.reqId)
347
+ : params.txRequest;
348
+ let txOrMessageToSign;
349
+ let derivationPath;
350
+ let bufferContent;
351
+ // One fresh ed25519 GPG key pair per signing session, reused across all signing rounds.
352
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
353
+ const userGpgPrvKey = await pgp.readPrivateKey({ armoredKey: userGpgKey.privateKey });
354
+ const bitgoGpgPubKey = await this.pickBitgoPubGpgKeyForSigning(true, params.reqId, txRequest.enterpriseId, true);
355
+ (0, assert_1.default)(bitgoGpgPubKey, 'Missing BitGo GPG key for MPCv2');
356
+ if (requestType === baseTypes_1.RequestType.tx) {
357
+ (0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
358
+ const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
359
+ txOrMessageToSign = unsignedTx.signableHex;
360
+ (0, assert_1.default)(txOrMessageToSign, 'Missing signableHex in unsignedTx');
361
+ derivationPath = unsignedTx.derivationPath;
362
+ bufferContent = Buffer.from(txOrMessageToSign, 'hex');
363
+ await this.baseCoin.verifyTransaction({
364
+ txPrebuild: { txHex: unsignedTx.serializedTxHex ?? txOrMessageToSign },
365
+ txParams: (0, recipientUtils_1.resolveEffectiveTxParams)(txRequest, params.txParams, this.baseCoin.getChain()),
366
+ wallet: this.wallet,
367
+ walletType: this.wallet.multisigType(),
368
+ });
369
+ }
370
+ else if (requestType === baseTypes_1.RequestType.message) {
371
+ (0, assert_1.default)(txRequest.messages && txRequest.messages.length > 0, 'Unable to find messages in txRequest');
372
+ txOrMessageToSign = txRequest.messages[0].messageEncoded;
373
+ (0, assert_1.default)(txOrMessageToSign, 'Missing messageEncoded in messages[0]');
374
+ derivationPath = txRequest.messages[0].derivationPath || 'm/0';
375
+ bufferContent = Buffer.from(txOrMessageToSign, 'hex');
376
+ }
377
+ else {
378
+ throw new Error('Invalid request type');
379
+ }
380
+ // ── WASM Round 0 ──────────────────────────────────────────────────────────
381
+ const partyId = params.mpcv2PartyId ?? typesMPCv2_1.MPCv2PartiesEnum.USER;
382
+ const signerShareType = partyId === typesMPCv2_1.MPCv2PartiesEnum.USER ? baseTypes_1.SignatureShareType.USER : baseTypes_1.SignatureShareType.BACKUP;
383
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(partyId);
384
+ await userDsg.initDsg(userKeyShare, bufferContent, derivationPath, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
385
+ const userMsg1 = userDsg.getFirstMessage();
386
+ // ── API Round 1 ───────────────────────────────────────────────────────────
387
+ const signatureShareRound1 = await (0, eddsaMPCv2_1.getSignatureShareRoundOne)(userMsg1, userGpgPrvKey, partyId);
388
+ let latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
389
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest object after round 1');
390
+ const signatureShares1 = requestType === baseTypes_1.RequestType.tx
391
+ ? latestTxRequest.transactions[0].signatureShares
392
+ : latestTxRequest.messages[0].signatureShares;
393
+ const bitgoShareRoundOne = (0, common_1.getBitgoSignatureShare)(signatureShares1, signerShareType, 'round1Output');
394
+ const parsedBitGoToUserSigShareRoundOne = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound1Output, JSON.parse(bitgoShareRoundOne.share), 'Unexpected signature share response. Unable to parse data.');
395
+ if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
396
+ throw new Error('Unexpected signature share response. Unable to parse data.');
397
+ }
398
+ const bitgoDeserializedMsg1 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundOne)(parsedBitGoToUserSigShareRoundOne, bitgoGpgPubKey);
399
+ // ── WASM Round 1 ──────────────────────────────────────────────────────────
400
+ const [userMsg2] = userDsg.handleIncomingMessages([userMsg1, bitgoDeserializedMsg1]);
401
+ (0, assert_1.default)(userMsg2, 'WASM round 1 produced no message');
402
+ // ── API Round 2 ───────────────────────────────────────────────────────────
403
+ const signatureShareRoundTwo = await (0, eddsaMPCv2_1.getSignatureShareRoundTwo)(userMsg2, userGpgPrvKey, partyId);
404
+ latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundTwo], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
405
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest object after round 2');
406
+ const txRequestSignatureShares = requestType === baseTypes_1.RequestType.tx
407
+ ? latestTxRequest.transactions[0].signatureShares
408
+ : latestTxRequest.messages[0].signatureShares;
409
+ const bitgoShareRoundTwo = (0, common_1.getBitgoSignatureShare)(txRequestSignatureShares, signerShareType, 'round2Output');
410
+ const parsedBitGoToUserSigShareRoundTwo = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound2Output, JSON.parse(bitgoShareRoundTwo.share), 'Unexpected signature share response. Unable to parse data.');
411
+ if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
412
+ throw new Error('Unexpected signature share response. Unable to parse data.');
413
+ }
414
+ const bitgoDeserializedMsg2 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundTwo)(parsedBitGoToUserSigShareRoundTwo, bitgoGpgPubKey);
415
+ // ── WASM Round 2 ──────────────────────────────────────────────────────────
416
+ const [userMsg3] = userDsg.handleIncomingMessages([userMsg2, bitgoDeserializedMsg2]);
417
+ (0, assert_1.default)(userMsg3, 'WASM round 2 produced no message');
418
+ // ── API Round 3 ───────────────────────────────────────────────────────────
419
+ // No BitGo response to verify; WP finalises the signing server-side
420
+ const signatureShareRound3 = await (0, eddsaMPCv2_1.getSignatureShareRoundThree)(userMsg3, userGpgPrvKey, partyId);
421
+ const round3TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
422
+ (0, assert_1.default)(round3TxRequest?.txRequestId === txRequest.txRequestId, 'Invalid txRequest object after round 3');
423
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequest.walletId, txRequest.txRequestId, requestType, params.reqId);
424
+ }
425
+ // #endregion
426
+ // #region external signer
427
+ // #region KeyGenRound1Share
428
+ async createOfflineKeyGenRound1Share(params) {
429
+ const { walletPassphrase, encryptedUserGpgPrvKey, bitgoGpgPubKey, counterPartyGpgPubKey } = params;
430
+ const partyId = params.partyId ?? typesMPCv2_1.MPCv2PartiesEnum.USER;
431
+ const decryptedGpgPrvKey = await this.bitgo.decrypt({ input: encryptedUserGpgPrvKey, password: walletPassphrase });
432
+ const gpgPrvKey = await pgp.readPrivateKey({ armoredKey: decryptedGpgPrvKey });
433
+ const [, ownSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(gpgPrvKey);
434
+ if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
435
+ (0, assert_1.default)((0, bitgoPubKeys_1.isBitgoEddsaMpcv2PubKey)(bitgoGpgPubKey), 'Invalid BitGo GPG public key');
436
+ }
437
+ const bitgoKeyObj = await pgp.readKey({ armoredKey: bitgoGpgPubKey });
438
+ const bitgoPk = await sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(bitgoKeyObj);
439
+ const counterPartyKeyObj = await pgp.readKey({ armoredKey: counterPartyGpgPubKey });
440
+ const counterPartyPk = await sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(counterPartyKeyObj);
441
+ const dkg = new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, partyId);
442
+ await dkg.initDkg(ownSk, [counterPartyPk, bitgoPk]);
443
+ const msg1 = dkg.getFirstMessage();
444
+ const signedMsg1 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(msg1.payload), gpgPrvKey);
445
+ const sessionPayload = JSON.stringify({
446
+ dkgSession: dkg.getSession(),
447
+ ownMsgPayload: Buffer.from(msg1.payload).toString('base64'),
448
+ ownMsgFrom: msg1.from,
449
+ });
450
+ const encryptedRound1Session = await this.bitgo.encrypt({
451
+ input: sessionPayload,
452
+ password: walletPassphrase,
453
+ adata: `${EddsaMPCv2Utils.MPS_DKG_KEYGEN_ROUND1_STATE}:${partyId}`,
454
+ encryptionVersion: 1,
455
+ });
456
+ return { signedMsg1, encryptedRound1Session };
457
+ }
458
+ // #endregion
459
+ // #region Round1Share
460
+ async createOfflineRound1Share(params) {
461
+ const { prv, walletPassphrase, txRequest, encryptedPrv } = params;
462
+ const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
463
+ const adata = `${signableHex}:${derivationPath}`;
464
+ const userKeyShare = Buffer.from(prv, 'base64');
465
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
466
+ const userGpgPrvKey = await pgp.readPrivateKey({ armoredKey: userGpgKey.privateKey });
467
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
468
+ await userDsg.initDsg(userKeyShare, Buffer.from(signableHex, 'hex'), derivationPath, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
469
+ const userMsg1 = userDsg.getFirstMessage();
470
+ const signatureShareRound1 = await (0, eddsaMPCv2_1.getSignatureShareRoundOne)(userMsg1, userGpgPrvKey);
471
+ const sessionPayload = JSON.stringify({
472
+ dsgSession: userDsg.getSession(),
473
+ userMsgPayload: Buffer.from(userMsg1.payload).toString('base64'),
474
+ });
475
+ const userGpgPubKey = userGpgKey.publicKey;
476
+ const useV2 = encryptedPrv !== undefined && (0, baseTypes_1.isV2Envelope)(encryptedPrv);
477
+ if (useV2) {
478
+ const session = await this.bitgo.createEncryptionSession(walletPassphrase);
479
+ try {
480
+ const encryptedRound1Session = await session.encrypt(sessionPayload, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE}:${adata}`);
481
+ const encryptedUserGpgPrvKey = await session.encrypt(userGpgKey.privateKey, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY}:${adata}`);
482
+ return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
483
+ }
484
+ finally {
485
+ session.destroy();
486
+ }
487
+ }
488
+ const encryptedRound1Session = await this.bitgo.encrypt({
489
+ input: sessionPayload,
490
+ password: walletPassphrase,
491
+ adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE}:${adata}`,
492
+ encryptionVersion: 1,
493
+ });
494
+ const encryptedUserGpgPrvKey = await this.bitgo.encrypt({
495
+ input: userGpgKey.privateKey,
496
+ password: walletPassphrase,
497
+ adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY}:${adata}`,
498
+ encryptionVersion: 1,
499
+ });
500
+ return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
501
+ }
502
+ // #endregion
503
+ // #region Round2Share
504
+ async createOfflineRound2Share(params) {
505
+ const { walletPassphrase, encryptedUserGpgPrvKey, encryptedRound1Session, bitgoPublicGpgKey, txRequest } = params;
506
+ const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
507
+ const adata = `${signableHex}:${derivationPath}`;
508
+ const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound1Session);
509
+ const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY);
510
+ const transactions = txRequest.transactions;
511
+ (0, assert_1.default)(Array.isArray(transactions) && transactions.length === 1, 'txRequest must have exactly one transaction');
512
+ const signatureShares = transactions[0].signatureShares;
513
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 1 txRequest');
514
+ const bitgoShareRoundOne = (0, common_1.getBitgoSignatureShare)(signatureShares, baseTypes_1.SignatureShareType.USER, 'round1Output');
515
+ const parsedBitGoToUserSigShareRoundOne = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound1Output, JSON.parse(bitgoShareRoundOne.share), 'Unexpected signature share response. Unable to parse data.');
516
+ if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
517
+ throw new Error('Unexpected signature share response. Unable to parse data.');
518
+ }
519
+ const bitgoDeserializedMsg1 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundOne)(parsedBitGoToUserSigShareRoundOne, bitgoGpgKey);
520
+ this.validateAdata(adata, encryptedRound1Session, EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE);
521
+ const decryptedRound1Session = await this.bitgo.decrypt({
522
+ input: encryptedRound1Session,
523
+ password: walletPassphrase,
524
+ });
525
+ const { dsgSession, userMsgPayload } = JSON.parse(decryptedRound1Session);
526
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
527
+ await userDsg.restoreSession(dsgSession);
528
+ const userMsg1 = {
529
+ from: typesMPCv2_1.MPCv2PartiesEnum.USER,
530
+ payload: new Uint8Array(Buffer.from(userMsgPayload, 'base64')),
531
+ };
532
+ const [userMsg2] = userDsg.handleIncomingMessages([userMsg1, bitgoDeserializedMsg1]);
533
+ (0, assert_1.default)(userMsg2, 'DSG handleIncomingMessages produced no round-2 output');
534
+ const signatureShareRound2 = await (0, eddsaMPCv2_1.getSignatureShareRoundTwo)(userMsg2, userGpgPrvKey);
535
+ const sessionPayload = JSON.stringify({
536
+ dsgSession: userDsg.getSession(),
537
+ userMsgPayload: Buffer.from(userMsg2.payload).toString('base64'),
538
+ });
539
+ if (useV2) {
540
+ const session = await this.bitgo.createEncryptionSession(walletPassphrase);
541
+ try {
542
+ const encryptedRound2Session = await session.encrypt(sessionPayload, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE}:${adata}`);
543
+ return { signatureShareRound2, encryptedRound2Session };
544
+ }
545
+ finally {
546
+ session.destroy();
547
+ }
548
+ }
549
+ const encryptedRound2Session = await this.bitgo.encrypt({
550
+ input: sessionPayload,
551
+ password: walletPassphrase,
552
+ adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE}:${adata}`,
553
+ encryptionVersion: 1,
554
+ });
555
+ return { signatureShareRound2, encryptedRound2Session };
556
+ }
557
+ // #endregion
558
+ // #region Round3Share
559
+ async createOfflineRound3Share(params) {
560
+ const { walletPassphrase, encryptedUserGpgPrvKey, encryptedRound2Session, bitgoPublicGpgKey, txRequest } = params;
561
+ const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
562
+ const adata = `${signableHex}:${derivationPath}`;
563
+ const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY);
564
+ const transactions = txRequest.transactions;
565
+ (0, assert_1.default)(Array.isArray(transactions) && transactions.length === 1, 'txRequest must have exactly one transaction');
566
+ const signatureShares = transactions[0].signatureShares;
567
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 2 txRequest');
568
+ const bitgoShareRoundTwo = (0, common_1.getBitgoSignatureShare)(signatureShares, baseTypes_1.SignatureShareType.USER, 'round2Output');
569
+ const parsedBitGoToUserSigShareRoundTwo = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound2Output, JSON.parse(bitgoShareRoundTwo.share), 'Unexpected signature share response. Unable to parse data.');
570
+ if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
571
+ throw new Error('Unexpected signature share response. Unable to parse data.');
572
+ }
573
+ const bitgoDeserializedMsg2 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundTwo)(parsedBitGoToUserSigShareRoundTwo, bitgoGpgKey);
574
+ this.validateAdata(adata, encryptedRound2Session, EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE);
575
+ const decryptedRound2Session = await this.bitgo.decrypt({
576
+ input: encryptedRound2Session,
577
+ password: walletPassphrase,
578
+ });
579
+ const { dsgSession, userMsgPayload } = JSON.parse(decryptedRound2Session);
580
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
581
+ await userDsg.restoreSession(dsgSession);
582
+ const userMsg2 = {
583
+ from: typesMPCv2_1.MPCv2PartiesEnum.USER,
584
+ payload: new Uint8Array(Buffer.from(userMsgPayload, 'base64')),
585
+ };
586
+ const [userMsg3] = userDsg.handleIncomingMessages([userMsg2, bitgoDeserializedMsg2]);
587
+ (0, assert_1.default)(userMsg3, 'DSG handleIncomingMessages produced no round-3 output');
588
+ const signatureShareRound3 = await (0, eddsaMPCv2_1.getSignatureShareRoundThree)(userMsg3, userGpgPrvKey);
589
+ return { signatureShareRound3 };
590
+ }
591
+ // #endregion
592
+ /** @inheritdoc */
593
+ async signEddsaMPCv2TssUsingExternalSigner(params, externalSignerEddsaMPCv2SigningRound1Generator, externalSignerEddsaMPCv2SigningRound2Generator, externalSignerEddsaMPCv2SigningRound3Generator, requestType = baseTypes_1.RequestType.tx) {
594
+ const { txRequest, reqId } = params;
595
+ // TODO(WP-2176): Add support for message signing
596
+ (0, assert_1.default)(requestType === baseTypes_1.RequestType.tx, 'Only transaction signing is supported for external signer, got: ' + requestType);
597
+ let txRequestResolved;
598
+ if (typeof txRequest === 'string') {
599
+ txRequestResolved = await (0, common_1.getTxRequest)(this.bitgo, this.wallet.id(), txRequest, reqId);
600
+ }
601
+ else {
602
+ txRequestResolved = txRequest;
603
+ }
604
+ const bitgoPublicGpgKey = await this.pickBitgoPubGpgKeyForSigning(true, reqId, txRequestResolved.enterpriseId, true);
605
+ if (!bitgoPublicGpgKey) {
606
+ throw new Error('Missing BitGo GPG key for MPCv2');
607
+ }
608
+ // round 1
609
+ const { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey } = await externalSignerEddsaMPCv2SigningRound1Generator({ txRequest: txRequestResolved });
610
+ const round1TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
611
+ // round 2
612
+ const { signatureShareRound2, encryptedRound2Session } = await externalSignerEddsaMPCv2SigningRound2Generator({
613
+ txRequest: round1TxRequest,
614
+ encryptedRound1Session,
615
+ encryptedUserGpgPrvKey,
616
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
617
+ });
618
+ const round2TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound2], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
619
+ (0, assert_1.default)(round2TxRequest.transactions && round2TxRequest.transactions[0].signatureShares, 'Missing signature shares in round 2 txRequest');
620
+ // round 3
621
+ const { signatureShareRound3 } = await externalSignerEddsaMPCv2SigningRound3Generator({
622
+ txRequest: round2TxRequest,
623
+ encryptedRound2Session,
624
+ encryptedUserGpgPrvKey,
625
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
626
+ });
627
+ await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
628
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, requestType, reqId);
629
+ }
630
+ // #endregion
631
+ // #region retrofit
632
+ async getUserAndBackupSession(retrofit) {
633
+ if (retrofit) {
634
+ const { userRetrofitData, backupRetrofitData } = await this.getMpcV2RetrofitDataFromMpcV1Keys({
635
+ mpcv1UserKeyShare: retrofit.decryptedUserKey,
636
+ mpcv1BackupKeyShare: retrofit.decryptedBackupKey,
637
+ });
638
+ return {
639
+ userDkg: new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER, userRetrofitData),
640
+ backupDkg: new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP, backupRetrofitData),
641
+ };
642
+ }
643
+ return {
644
+ userDkg: new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER),
645
+ backupDkg: new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP),
646
+ };
647
+ }
648
+ async getMpcV2RetrofitDataFromMpcV1Keys(params) {
649
+ const MPC = await (0, eddsa_1.getInitializedMpcInstance)();
650
+ const userRetrofitData = EddsaMPCv2Utils.getMpcV2RetrofitDataFromMpcV1Key(params.mpcv1UserKeyShare, typesMPCv2_1.MPCv2PartiesEnum.USER, MPC);
651
+ const backupRetrofitData = EddsaMPCv2Utils.getMpcV2RetrofitDataFromMpcV1Key(params.mpcv1BackupKeyShare, typesMPCv2_1.MPCv2PartiesEnum.BACKUP, MPC);
652
+ (0, assert_1.default)(userRetrofitData.expectedPk === backupRetrofitData.expectedPk, 'MPCv1 user and backup keys combine to different aggregate public keys');
653
+ (0, assert_1.default)(userRetrofitData.chainCode === backupRetrofitData.chainCode, 'MPCv1 user and backup keys combine to different chain codes');
654
+ return { userRetrofitData, backupRetrofitData };
655
+ }
656
+ static getMpcV2RetrofitDataFromMpcV1Key(mpcv1PartyKeyShare, mpcv1PartyIndex, mpc) {
657
+ const signingMaterial = JSON.parse(mpcv1PartyKeyShare);
658
+ (0, assert_1.default)(signingMaterial.uShare, 'MPCv1 key material missing uShare');
659
+ (0, assert_1.default)(signingMaterial.bitgoYShare, 'MPCv1 key material missing bitgoYShare');
660
+ let pShare;
661
+ switch (mpcv1PartyIndex) {
662
+ case typesMPCv2_1.MPCv2PartiesEnum.USER:
663
+ (0, assert_1.default)(signingMaterial.backupYShare, 'User MPCv1 key material missing backupYShare');
664
+ pShare = mpc.keyCombine(signingMaterial.uShare, [
665
+ signingMaterial.bitgoYShare,
666
+ signingMaterial.backupYShare,
667
+ ]).pShare;
668
+ break;
669
+ case typesMPCv2_1.MPCv2PartiesEnum.BACKUP:
670
+ (0, assert_1.default)(signingMaterial.userYShare, 'Backup MPCv1 key material missing userYShare');
671
+ pShare = mpc.keyCombine(signingMaterial.uShare, [
672
+ signingMaterial.bitgoYShare,
673
+ signingMaterial.userYShare,
674
+ ]).pShare;
675
+ break;
676
+ default:
677
+ throw new Error('Invalid participant index');
678
+ }
679
+ return {
680
+ s_i_0: pShare.u,
681
+ expectedPk: pShare.y,
682
+ chainCode: pShare.chaincode,
683
+ };
684
+ }
685
+ }
686
+ exports.EddsaMPCv2Utils = EddsaMPCv2Utils;
687
+ EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY = 'MPS_DSG_SIGNING_USER_GPG_KEY';
688
+ EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE = 'MPS_DSG_SIGNING_ROUND1_STATE';
689
+ EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE = 'MPS_DSG_SIGNING_ROUND2_STATE';
690
+ EddsaMPCv2Utils.MPS_DKG_KEYGEN_ROUND1_STATE = 'MPS_DKG_KEYGEN_ROUND1_STATE';
691
+ /**
692
+ * Detect whether an encrypted keycard contains MPCv1 signing material.
693
+ *
694
+ * Decrypts the keycard and checks for the JSON shape produced by the MPCv1 TSS
695
+ * key-generation flow (uShare.seed + bitgoYShare.u + backupYShare.u / userYShare.u).
696
+ * Returns false for MPCv2 CBOR keycards, wrong passwords, or any decryption error.
697
+ *
698
+ * @param encryptedKeyShare encrypted user or backup keycard
699
+ * @param walletPassphrase passphrase used to encrypt the keycard
700
+ * @param bitgo optional BitGoBase instance; when provided, decrypts via
701
+ * bitgo.decrypt (supports both v1 SJCL and v2 Argon2id envelopes);
702
+ * when absent, falls back to sjcl.decrypt (v1 only)
703
+ */
704
+ function parseEddsaMpcV1Material(decrypted) {
705
+ try {
706
+ const m = JSON.parse(decrypted);
707
+ if (typeof m?.uShare?.seed === 'string' &&
708
+ typeof m?.bitgoYShare?.u === 'string' &&
709
+ (typeof m?.backupYShare?.u === 'string' || typeof m?.userYShare?.u === 'string')) {
710
+ return decrypted;
711
+ }
712
+ }
713
+ catch {
714
+ // Not JSON → MPCv2 CBOR
715
+ }
716
+ return null;
717
+ }
718
+ async function isEddsaMpcV1SigningMaterial(encryptedKeyShare, walletPassphrase, bitgo) {
719
+ const decrypted = bitgo
720
+ ? await bitgo.decrypt({ input: encryptedKeyShare, password: walletPassphrase })
721
+ : sjcl.decrypt(walletPassphrase, encryptedKeyShare);
722
+ return parseEddsaMpcV1Material(decrypted) !== null;
723
+ }
724
+ /**
725
+ * Get EdDSA MPCv2 recovery key shares from encrypted reduced user and backup keys.
726
+ *
727
+ * The encrypted inputs are the `reducedEncryptedPrv` values stored on EdDSA MPCv2
728
+ * key cards. They decrypt either to CBOR-encoded reduced shares (legacy cards) or to
729
+ * the versioned safe-root envelope `{ version: 1, prvKeyShare, vrf }`, where the signing
730
+ * share stays reduced and `vrf` is the complete serialized VRF keyshare. Legacy cards
731
+ * have no VRF material and recover as before.
732
+ *
733
+ * @param encryptedUserKey encrypted EdDSA MPCv2 reduced user key
734
+ * @param encryptedBackupKey encrypted EdDSA MPCv2 reduced backup key
735
+ * @param walletPassphrase password for user and backup keys
736
+ * @returns EdDSA MPCv2 recovery key shares and common keychain
737
+ */
738
+ async function getEddsaMpcV2RecoveryKeySharesFromReducedKey(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo) {
739
+ const decodeKey = async (encryptedKey) => {
740
+ const decrypted = bitgo
741
+ ? await bitgo.decrypt({ input: encryptedKey, password: walletPassphrase })
742
+ : sjcl.decrypt(walletPassphrase, encryptedKey);
743
+ const parsed = (0, keyShareEnvelope_1.parseMpcV2KeyShareEnvelope)(decrypted);
744
+ let reduced;
745
+ try {
746
+ reduced = sdk_lib_mpc_1.MPSTypes.getDecodedReducedKeyShare(parsed.signingKeyShare);
747
+ }
748
+ catch {
749
+ throw new Error('EdDSA MPCv2 recovery: unable to decode reduced key share from keycard material. The encrypted key may be corrupted, malformed, or not an EdDSA MPCv2 reduced key.');
750
+ }
751
+ if (!reduced.keyShare?.length || !reduced.pub?.length || !reduced.rootChainCode?.length) {
752
+ throw new Error('EdDSA MPCv2 recovery: reduced key share is missing keyShare, pub, or rootChainCode. This keycard may be public-only and cannot be used for recovery.');
753
+ }
754
+ return { reduced, vrfKeyShare: parsed.vrfKeyShare };
755
+ };
756
+ const [userDecoded, backupDecoded] = await Promise.all([decodeKey(encryptedUserKey), decodeKey(encryptedBackupKey)]);
757
+ const userReduced = userDecoded.reduced;
758
+ const backupReduced = backupDecoded.reduced;
759
+ const userPub = Buffer.from(userReduced.pub).toString('hex');
760
+ const backupPub = Buffer.from(backupReduced.pub).toString('hex');
761
+ if (userPub !== backupPub) {
762
+ throw new Error('EdDSA MPCv2 recovery: user and backup pub keys do not match');
763
+ }
764
+ const userChainCode = Buffer.from(userReduced.rootChainCode).toString('hex');
765
+ const backupChainCode = Buffer.from(backupReduced.rootChainCode).toString('hex');
766
+ if (userChainCode !== backupChainCode) {
767
+ throw new Error('EdDSA MPCv2 recovery: user and backup rootChainCodes do not match');
768
+ }
769
+ const hasUserVrf = userDecoded.vrfKeyShare !== undefined;
770
+ const hasBackupVrf = backupDecoded.vrfKeyShare !== undefined;
771
+ if (hasUserVrf !== hasBackupVrf) {
772
+ throw new Error('EdDSA MPCv2 recovery: keyshare envelopes must either both contain VRF keyshares or both omit them');
773
+ }
774
+ return {
775
+ userKeyShare: Buffer.from(userReduced.keyShare),
776
+ backupKeyShare: Buffer.from(backupReduced.keyShare),
777
+ commonKeyChain: userPub + userChainCode,
778
+ userVrfKeyShare: userDecoded.vrfKeyShare,
779
+ backupVrfKeyShare: backupDecoded.vrfKeyShare,
780
+ };
781
+ }
782
+ /**
783
+ * Sign a message for recovery using EdDSA MPCv2 (MPS) with user and backup key shares.
784
+ *
785
+ * Runs the MPS DSG protocol locally to round 3, then verifies the resulting
786
+ * Ed25519 signature against the public key derived from the common keychain.
787
+ *
788
+ * @param message raw bytes to sign
789
+ * @param derivationPath BIP-32-style derivation path, e.g. `"m/0"`
790
+ * @param userKeyShare opaque MPS signing key-share bytes for the user party
791
+ * @param backupKeyShare opaque MPS signing key-share bytes for the backup party
792
+ * @param commonKeyChain 128-hex-char string: 32-byte pub + 32-byte rootChainCode
793
+ * @returns 64-byte Ed25519 signature Buffer
794
+ */
795
+ async function signRecoveryEddsaMPCv2(message, derivationPath, userKeyShare, backupKeyShare, commonKeyChain) {
796
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
797
+ const backupDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
798
+ const signature = (await sdk_lib_mpc_1.MPSUtil.executeTillRound(3, userDsg, backupDsg, userKeyShare, backupKeyShare, message, derivationPath));
799
+ // Use Eddsa.deriveUnhardened (BIP32-Ed25519), which matches what DSG uses
800
+ // internally for path derivation since wasm-mps 1.9.0.
801
+ const mpc = await (0, eddsa_1.getInitializedMpcInstance)();
802
+ const derivedKeychain = mpc.deriveUnhardened(commonKeyChain, derivationPath);
803
+ const publicKeyBytes = Buffer.from(derivedKeychain.slice(0, 64), 'hex');
804
+ const verified = ed25519_1.ed25519.verify(new Uint8Array(signature), new Uint8Array(message), new Uint8Array(publicKeyBytes));
805
+ if (!verified) {
806
+ throw new Error('EdDSA MPCv2 recovery signature verification failed');
807
+ }
808
+ return signature;
809
+ }
810
+ /**
811
+ * Detects MPCv1 vs MPCv2 keycard format and returns typed signing material.
812
+ * For v1: decrypts once and returns the plaintext as userPrv.
813
+ * For v2: returns the encrypted key as-is for use with signEddsaMpcV2RecoveryTx.
814
+ * When bitgo is omitted, falls back to sjcl (v1 only).
815
+ */
816
+ async function getEddsaSigningMaterial(userKey, walletPassphrase, bitgo) {
817
+ const normalized = userKey.replace(/\s/g, '');
818
+ let decrypted;
819
+ try {
820
+ decrypted = bitgo
821
+ ? await bitgo.decrypt({ input: normalized, password: walletPassphrase })
822
+ : sjcl.decrypt(walletPassphrase, normalized);
823
+ }
824
+ catch (e) {
825
+ throw new Error(`Error decrypting user keychain: ${e instanceof Error ? e.message : String(e)}`);
826
+ }
827
+ const userPrv = parseEddsaMpcV1Material(decrypted);
828
+ return userPrv !== null ? { version: 'v1', userPrv } : { version: 'v2', encryptedUserKey: normalized };
829
+ }
830
+ /**
831
+ * Type guard validating that a value has the shape of EddsaSigningMaterial.
832
+ *
833
+ * Coin `recover()` implementations accept an optional precomputed signing-material
834
+ * parameter (set by recoverConsolidations() to avoid re-decrypting the keycard per
835
+ * scanned index). Some callers pass an unrelated second positional argument to
836
+ * recover() for other purposes (e.g. openSSLBytes for EVM-like coins); validating
837
+ * the shape here prevents that from being misinterpreted as signing material.
838
+ */
839
+ function isEddsaSigningMaterial(value) {
840
+ if (typeof value !== 'object' || value === null) {
841
+ return false;
842
+ }
843
+ if (!('version' in value)) {
844
+ return false;
845
+ }
846
+ if (value.version === 'v1') {
847
+ return 'userPrv' in value && typeof value.userPrv === 'string';
848
+ }
849
+ if (value.version === 'v2') {
850
+ return 'encryptedUserKey' in value && typeof value.encryptedUserKey === 'string';
851
+ }
852
+ return false;
853
+ }
854
+ /**
855
+ * Full MPCv2 recovery signing flow: decrypt key shares → validate commonKeyChain → MPS DSG.
856
+ * Returns raw 64-byte Ed25519 signature Buffer.
857
+ * Caller is responsible for any coin-specific envelope
858
+ * (e.g. 0x00 Substrate prefix, SUI flag+pubkey wrapper, or raw for NEAR/ADA/TON).
859
+ */
860
+ async function signEddsaMpcV2RecoveryTx(params) {
861
+ const { userKeyShare, backupKeyShare, commonKeyChain } = await getEddsaMpcV2RecoveryKeySharesFromReducedKey(params.userKey, params.backupKey, params.walletPassphrase, params.bitgo);
862
+ if (commonKeyChain.toLowerCase() !== params.bitgoKey.toLowerCase()) {
863
+ throw new Error('EdDSA MPCv2 recovery: commonKeyChain from keycard does not match bitgoKey');
864
+ }
865
+ return signRecoveryEddsaMPCv2(params.message, params.derivationPath, userKeyShare, backupKeyShare, commonKeyChain);
866
+ }
867
+ exports.EddsaMPCv2RecoveryFunctions = {
868
+ isEddsaMpcV1SigningMaterial,
869
+ getEddsaMpcV2RecoveryKeySharesFromReducedKey,
870
+ signRecoveryEddsaMPCv2,
871
+ getEddsaSigningMaterial,
872
+ isEddsaSigningMaterial,
873
+ signEddsaMpcV2RecoveryTx,
874
+ };
875
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErcUNBLGtFQVNDO0FBZ0JELG9HQTJEQztBQWVELHdEQWdDQztBQWVELDBEQWdCQztBQVdELHdEQWNDO0FBUUQsNERBbUJDO0FBcjRDRCxvREFBNEI7QUFDNUIsdURBQXlDO0FBQ3pDLDZDQUErQjtBQUMvQiw2Q0FBNkM7QUFDN0Msc0RBUzZCO0FBRTdCLG1EQUFnRDtBQUNoRCx5REFBZ0c7QUFTaEcsNERBQXFHO0FBQ3JHLGdEQUFnSDtBQUNoSCx5Q0FBK0M7QUFDL0MsOERBTXVDO0FBQ3ZDLG9EQUFxRTtBQUNyRSxxREFBd0Q7QUFDeEQsb0RBQXVEO0FBQ3ZELDRDQWFzQjtBQUd0QixpQ0FBd0M7QUFDeEMsc0RBQTZEO0FBQzdELHFFQUE2RjtBQUU3RiwwREFBaUU7QUFHakUsTUFBYSxlQUFnQixTQUFRLHFCQUFjO0lBTWpELGtCQUFrQjtJQUNsQixLQUFLLENBQUMsZUFBZSxDQUFDLE1BU3JCO1FBQ0MsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDL0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLHNCQUFRLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFMUUsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFBLGlDQUFrQixFQUFDLFNB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Q0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsd0JBQXdCLENBQUMsTUFROUM7SUFDQyxNQUFNLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLDRDQUE0QyxDQUN6RyxNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxTQUFTLEVBQ2hCLE1BQU0sQ0FBQyxnQkFBZ0IsRUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FDYixDQUFDO0lBQ0YsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1FBQ25FLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNySCxDQUFDO0FBRVksUUFBQSwyQkFBMkIsR0FBRztJQUN6QywyQkFBMkI7SUFDM0IsNENBQTRDO0lBQzVDLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLHdCQUF3QjtDQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28tYmV0YS9zamNsJztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IE5vbkVtcHR5U3RyaW5nIH0gZnJvbSAnaW8tdHMtdHlwZXMnO1xuaW1wb3J0IHtcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZSxcbiAgRWRkc2FNUEN2MktleUdlblJvdW5kMlJlcXVlc3QsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZSxcbiAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gIE1QQ3YyS2V5R2VuU3RhdGVFbnVtLFxuICBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxufSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IEVkZHNhTVBDdjJLZXlHZW5DYWxsYmFja3MgfSBmcm9tICcuLi8uLi8uLi93YWxsZXQvaVdhbGxldHMnO1xuaW1wb3J0IHsgZWQyNTUxOSB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOSc7XG5pbXBvcnQgeyBFZGRzYU1QU0RrZywgRWRkc2FNUFNEc2csIE1QU0NvbW1zLCBNUFNUeXBlcywgTVBTVXRpbCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQge1xuICBBZGRLZXljaGFpbk9wdGlvbnMsXG4gIERlY3J5cHRlZFJldHJvZml0UGF5bG9hZCxcbiAgS2V5Y2hhaW4sXG4gIEtleVR5cGUsXG4gIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8sXG59IGZyb20gJy4uLy4uLy4uL2tleWNoYWluJztcbmltcG9ydCB7IGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcsIGlzQml0Z29FZGRzYU1wY3YyUHViS2V5IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2JpdGdvUHViS2V5cyc7XG5pbXBvcnQgeyBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlLCBnZXRUeFJlcXVlc3QsIHNlbmRTaWduYXR1cmVTaGFyZVYyLCBzZW5kVHhSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vLi4vdHNzL2NvbW1vbic7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuLi8uLi9jb2RlY3MnO1xuaW1wb3J0IHtcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byxcbiAgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlLFxuICB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lLFxuICB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVHdvLFxufSBmcm9tICcuLi8uLi8uLi90c3MvZWRkc2EvZWRkc2FNUEN2Mic7XG5pbXBvcnQgeyBnZXRJbml0aWFsaXplZE1wY0luc3RhbmNlIH0gZnJvbSAnLi4vLi4vLi4vdHNzL2VkZHNhL2VkZHNhJztcbmltcG9ydCB7IGdlbmVyYXRlR1BHS2V5UGFpciB9IGZyb20gJy4uLy4uL29wZW5ncGdVdGlscyc7XG5pbXBvcnQgeyBNUEN2MlBhcnRpZXNFbnVtIH0gZnJvbSAnLi4vZWNkc2EvdHlwZXNNUEN2Mic7XG5pbXBvcnQge1xuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBSZXF1ZXN0VHlwZSxcbiAgU2lnbmF0dXJlU2hhcmVSZWNvcmQsXG4gIFNpZ25hdHVyZVNoYXJlVHlwZSxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlV2l0aFBydixcbiAgVFNTUGFyYW1zV2l0aFBydixcbiAgVHhSZXF1ZXN0LFxuICBpc1YyRW52ZWxvcGUsXG59IGZyb20gJy4uL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBFbmNyeXB0aW9uVmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgQmFzZUVkZHNhVXRpbHMgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zIH0gZnJvbSAnLi4vcmVjaXBpZW50VXRpbHMnO1xuaW1wb3J0IHsgRWRkc2FNUEN2MktleUdlblNlbmRGbiwgS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSB9IGZyb20gJy4vZWRkc2FNUEN2MktleUdlblNlbmRlcic7XG5pbXBvcnQgeyBFZGRzYU1QQ3YyUmVjb3ZlcnlLZXlTaGFyZXMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlTXBjVjJLZXlTaGFyZUVudmVsb3BlIH0gZnJvbSAnLi4va2V5U2hhcmVFbnZlbG9wZSc7XG5pbXBvcnQgeyBTaWduaW5nTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi8uLi90c3MnO1xuXG5leHBvcnQgY2xhc3MgRWRkc2FNUEN2MlV0aWxzIGV4dGVuZHMgQmFzZUVkZHNhVXRpbHMge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZID0gJ01QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFID0gJ01QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFID0gJ01QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNUFNfREtHX0tFWUdFTl9ST1VORDFfU1RBVEUgPSAnTVBTX0RLR19LRVlHRU5fUk9VTkQxX1NUQVRFJztcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlOiBzdHJpbmc7XG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nO1xuICAgIHJldHJvZml0PzogRGVjcnlwdGVkUmV0cm9maXRQYXlsb2FkO1xuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm87XG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbjtcbiAgICAvLyBXYWxsZXQgU2FmZXMgdjEgKEBleHBlcmltZW50YWwpOiB0YWdzIHRoZSByZXN1bHRpbmcgdXNlci9iYWNrdXAvYml0Z28gcm9vdCBrZXlzIHdpdGggdGhpcyBzYWZlLlxuICAgIHNhZmVJZD86IHN0cmluZztcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIGNvbnN0IHVzZXJLZXlQYWlyID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHVzZXJLZXlQYWlyLnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgdXNlckdwZ1B1YmxpY0tleSA9IHVzZXJLZXlQYWlyLnB1YmxpY0tleTtcbiAgICBjb25zdCBbdXNlclBrLCB1c2VyU2tdID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlLZXlQYWlyKHVzZXJHcGdLZXkpO1xuXG4gICAgY29uc3QgYmFja3VwS2V5UGFpciA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IGJhY2t1cEdwZ0tleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IGJhY2t1cEtleVBhaXIucHJpdmF0ZUtleSB9KTtcbiAgICBjb25zdCBiYWNrdXBHcGdQdWJsaWNLZXkgPSBiYWNrdXBLZXlQYWlyLnB1YmxpY0tleTtcbiAgICBjb25zdCBbYmFja3VwUGssIGJhY2t1cFNrXSA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5S2V5UGFpcihiYWNrdXBHcGdLZXkpO1xuXG4gICAgLy8gR2V0IHRoZSBCaXRHbyBFZERTQSBNUEN2MiBwdWJsaWMga2V5IChlZDI1NTE5KS4gVXNpbmcgdGhlIGRlZmF1bHQgbXBjdjJQdWJsaWNLZXkgKHNlY3AyNTZrMSlcbiAgICAvLyBoZXJlIHdvdWxkIGNhdXNlIGEgV0FTTSBcIkludmFsaWQgSW5wdXRcIiBlcnJvciwgc28gd2UgcmVxdWlyZSB0aGUgZGVkaWNhdGVkIGVkZHNhTXBjdjJQdWJsaWNLZXkuXG4gICAgY29uc3QgeyBlZGRzYU1wY3YyUHVibGljS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhwYXJhbXMuZW50ZXJwcmlzZSwgdHJ1ZSk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBlZGRzYU1wY3YyUHVibGljS2V5ID8/IHRoaXMuYml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5O1xuICAgIGFzc2VydChiaXRnb1B1YmxpY0dwZ0tleSwgJ0ZhaWxlZCB0byBnZXQgQml0R28gRWREU0EgTVBDdjIgR1BHIHB1YmxpYyBrZXknKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQgPSBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpO1xuXG4gICAgaWYgKGVudlJlcXVpcmVzQml0Z29QdWJHcGdLZXlDb25maWcodGhpcy5iaXRnby5nZXRFbnYoKSkpIHtcbiAgICAgIGFzc2VydChpc0JpdGdvRWRkc2FNcGN2MlB1YktleShiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvS2V5T2JqID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQgfSk7XG4gICAgY29uc3QgYml0Z29QayA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5UHVibGljS2V5KGJpdGdvS2V5T2JqKTtcblxuICAgIC8vIENyZWF0ZSBES0cgc2Vzc2lvbnMgZm9yIHVzZXIgKHBhcnR5IDApIGFuZCBiYWNrdXAgKHBhcnR5IDEpXG4gICAgY29uc3QgeyB1c2VyRGtnLCBiYWNrdXBEa2cgfSA9IGF3YWl0IHRoaXMuZ2V0VXNlckFuZEJhY2t1cFNlc3Npb24ocGFyYW1zLnJldHJvZml0KTtcblxuICAgIC8vICNyZWdpb24gcm91bmQgMVxuICAgIGF3YWl0IHVzZXJEa2cuaW5pdERrZyh1c2VyU2ssIFtiYWNrdXBQaywgYml0Z29Qa10pO1xuICAgIGF3YWl0IGJhY2t1cERrZy5pbml0RGtnKGJhY2t1cFNrLCBbdXNlclBrLCBiaXRnb1BrXSk7XG5cbiAgICBjb25zdCB1c2VyTXNnMSA9IHVzZXJEa2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG4gICAgY29uc3QgYmFja3VwTXNnMSA9IGJhY2t1cERrZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICAgIGNvbnN0IHVzZXJTaWduZWRNc2cxID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCksIHVzZXJHcGdLZXkpO1xuICAgIGNvbnN0IGJhY2t1cFNpZ25lZE1zZzEgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbShiYWNrdXBNc2cxLnBheWxvYWQpLCBiYWNrdXBHcGdLZXkpO1xuXG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKHVzZXJHcGdQdWJsaWNLZXkpLCAnVXNlciBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyhiYWNrdXBHcGdQdWJsaWNLZXkpLCAnQmFja3VwIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgICAgcGFyYW1zLmVudGVycHJpc2UsXG4gICAgICB7XG4gICAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgICAgdXNlck1zZzE6IHVzZXJTaWduZWRNc2cxLFxuICAgICAgICBiYWNrdXBNc2cxOiBiYWNrdXBTaWduZWRNc2cxLFxuICAgICAgICAuLi4ocGFyYW1zLnJldHJvZml0Py53YWxsZXRJZCA/IHsgd2FsbGV0SWQ6IHBhcmFtcy5yZXRyb2ZpdC53YWxsZXRJZCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHBhcmFtcy5zYWZlSWRcbiAgICApO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24gcm91bmQgMlxuICAgIGNvbnN0IGJpdGdvUmF3TXNnMUJ5dGVzID0gYXdhaXQgTVBTQ29tbXMudmVyaWZ5TXBzTWVzc2FnZShiaXRnb01zZzEsIGJpdGdvS2V5T2JqKTtcbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzE6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLFxuICAgICAgcGF5bG9hZDogbmV3IFVpbnQ4QXJyYXkoYml0Z29SYXdNc2cxQnl0ZXMpLFxuICAgIH07XG5cbiAgICBjb25zdCByb3VuZDFNZXNzYWdlczogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZXMgPSBbdXNlck1zZzEsIGJhY2t1cE1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV07XG5cbiAgICBjb25zdCB1c2VyUm91bmQyTXNncyA9IHVzZXJEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDFNZXNzYWdlcyk7XG4gICAgY29uc3QgYmFja3VwUm91bmQyTXNncyA9IGJhY2t1cERrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMU1lc3NhZ2VzKTtcblxuICAgIGFzc2VydCh1c2VyUm91bmQyTXNncy5sZW5ndGggPT09IDEsICdVc2VyIHJvdW5kIDEgc2hvdWxkIHByb2R1Y2UgZXhhY3RseSBvbmUgcm91bmQgMiBtZXNzYWdlJyk7XG4gICAgYXNzZXJ0KGJhY2t1cFJvdW5kMk1zZ3MubGVuZ3RoID09PSAxLCAnQmFja3VwIHJvdW5kIDEgc2hvdWxkIHByb2R1Y2UgZXhhY3RseSBvbmUgcm91bmQgMiBtZXNzYWdlJyk7XG5cbiAgICBjb25zdCB1c2VyTXNnMiA9IHVzZXJSb3VuZDJNc2dzWzBdO1xuICAgIGNvbnN0IGJhY2t1cE1zZzIgPSBiYWNrdXBSb3VuZDJNc2dzWzBdO1xuXG4gICAgY29uc3QgdXNlclNpZ25lZE1zZzIgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKSwgdXNlckdwZ0tleSk7XG4gICAgY29uc3QgYmFja3VwU2lnbmVkTXNnMiA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKGJhY2t1cE1zZzIucGF5bG9hZCksIGJhY2t1cEdwZ0tleSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluLFxuICAgICAgYml0Z29Nc2cyLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKHBhcmFtcy5lbnRlcnByaXNlLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICB1c2VyTXNnMjogdXNlclNpZ25lZE1zZzIsXG4gICAgICBiYWNrdXBNc2cyOiBiYWNrdXBTaWduZWRNc2cyLFxuICAgIH0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIC8vICNyZWdpb24ga2V5Y2hhaW4gY3JlYXRpb25cbiAgICBhc3NlcnQuZXF1YWwoc2Vzc2lvbklkLCBzZXNzaW9uSWRSb3VuZDIsICdSb3VuZCAxIGFuZCByb3VuZCAyIHNlc3Npb24gSURzIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3QgYml0Z29SYXdNc2cyQnl0ZXMgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKGJpdGdvTXNnMiwgYml0Z29LZXlPYmopO1xuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMjogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShiaXRnb1Jhd01zZzJCeXRlcyksXG4gICAgfTtcblxuICAgIGNvbnN0IHJvdW5kMk1lc3NhZ2VzOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IFt1c2VyTXNnMiwgYmFja3VwTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXTtcblxuICAgIGNvbnN0IHVzZXJGaW5hbE1zZ3MgPSB1c2VyRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQyTWVzc2FnZXMpO1xuICAgIGNvbnN0IGJhY2t1cEZpbmFsTXNncyA9IGJhY2t1cERrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMk1lc3NhZ2VzKTtcblxuICAgIGFzc2VydCh1c2VyRmluYWxNc2dzLmxlbmd0aCA9PT0gMCwgJ1dBU00gcm91bmQgMiBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQgbWVzc2FnZXMgZm9yIHVzZXInKTtcbiAgICBhc3NlcnQoYmFja3VwRmluYWxNc2dzLmxlbmd0aCA9PT0gMCwgJ1dBU00gcm91bmQgMiBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQgbWVzc2FnZXMgZm9yIGJhY2t1cCcpO1xuXG4gICAgY29uc3QgdXNlckNvbW1vbktleWNoYWluID0gdXNlckRrZy5nZXRDb21tb25LZXljaGFpbigpO1xuICAgIGNvbnN0IGJhY2t1cENvbW1vbktleWNoYWluID0gYmFja3VwRGtnLmdldENvbW1vbktleWNoYWluKCk7XG5cbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICB1c2VyQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICdVc2VyIGNvbXB1dGVkIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvIGNvbW1vbiBrZXljaGFpbidcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIGJhY2t1cENvbW1vbktleWNoYWluLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICAnQmFja3VwIGNvbXB1dGVkIGtleWNoYWluIGRvZXMgbm90IG1hdGNoIEJpdEdvIGNvbW1vbiBrZXljaGFpbidcbiAgICApO1xuXG4gICAgY29uc3QgdXNlclByaXZhdGVNYXRlcmlhbCA9IHVzZXJEa2cuZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBQcml2YXRlTWF0ZXJpYWwgPSBiYWNrdXBEa2cuZ2V0S2V5U2hhcmUoKTtcbiAgICBjb25zdCB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IHVzZXJEa2cuZ2V0UmVkdWNlZEtleVNoYXJlKCk7XG4gICAgY29uc3QgYmFja3VwUmVkdWNlZFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cERrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcblxuICAgIGNvbnN0IHVzZXJLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZFVzZXJLZXljaGFpbihcbiAgICAgIHVzZXJDb21tb25LZXljaGFpbixcbiAgICAgIHVzZXJQcml2YXRlTWF0ZXJpYWwsXG4gICAgICB1c2VyUmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhcmFtcy5wYXNzcGhyYXNlLFxuICAgICAgcGFyYW1zLm9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHBhcmFtcy53ZWJhdXRobkluZm8sXG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIHBhcmFtcy5zYWZlSWRcbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cEtleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgICBiYWNrdXBDb21tb25LZXljaGFpbixcbiAgICAgIGJhY2t1cFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIGJhY2t1cFJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXJhbXMucGFzc3BocmFzZSxcbiAgICAgIHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBwYXJhbXMuZW50ZXJwcmlzZSxcbiAgICAgIHBhcmFtcy5zYWZlSWRcbiAgICApO1xuICAgIGNvbnN0IGJpdGdvS2V5Y2hhaW5Qcm9taXNlID0gdGhpcy5hZGRCaXRnb0tleWNoYWluKHVzZXJDb21tb25LZXljaGFpbiwgcGFyYW1zLnNhZmVJZCk7XG5cbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB1c2VyS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYmFja3VwS2V5Y2hhaW5Qcm9taXNlLFxuICAgICAgYml0Z29LZXljaGFpblByb21pc2UsXG4gICAgXSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlS2V5Y2hhaW5zV2l0aEV4dGVybmFsU2lnbmVyKHBhcmFtczoge1xuICAgIGVudGVycHJpc2U6IHN0cmluZztcbiAgICBjYWxsYmFja3M6IEVkZHNhTVBDdjJLZXlHZW5DYWxsYmFja3M7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCB7IGVudGVycHJpc2UsIGNhbGxiYWNrcyB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBlZGRzYU1wY3YyUHVibGljS2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhlbnRlcnByaXNlLCB0cnVlKTtcbiAgICBjb25zdCBiaXRnb1B1YmxpY0dwZ0tleSA9IGVkZHNhTXBjdjJQdWJsaWNLZXkgPz8gdGhpcy5iaXRnb0VkZHNhTXBjdjJQdWJsaWNHcGdLZXk7XG4gICAgYXNzZXJ0KGJpdGdvUHVibGljR3BnS2V5LCAnRmFpbGVkIHRvIGdldCBCaXRHbyBFZERTQSBNUEN2MiBHUEcgcHVibGljIGtleScpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCA9IGJpdGdvUHVibGljR3BnS2V5LmFybW9yKCk7XG5cbiAgICBpZiAoZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgYXNzZXJ0KGlzQml0Z29FZGRzYU1wY3YyUHViS2V5KGJpdGdvUHVibGljR3BnS2V5QXJtb3JlZCksICdJbnZhbGlkIEJpdEdvIEVkRFNBIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgfVxuXG4gICAgLy8gUm91bmQgMDogYm90aCBwYXJ0aWVzIGdlbmVyYXRlIEdQRyBrZXlzXG4gICAgY29uc3QgeyB1c2VyR3BnUHVibGljS2V5LCBiYWNrdXBHcGdQdWJsaWNLZXksIHVzZXJTdGF0ZSwgYmFja3VwU3RhdGUgfSA9IGF3YWl0IGNhbGxiYWNrcy5pbml0aWFsaXplQ2FsbGJhY2soe1xuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQsXG4gICAgfSk7XG5cbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXModXNlckdwZ1B1YmxpY0tleSksICdVc2VyIEdQRyBwdWJsaWMga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgYXNzZXJ0KE5vbkVtcHR5U3RyaW5nLmlzKGJhY2t1cEdwZ1B1YmxpY0tleSksICdCYWNrdXAgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcblxuICAgIC8vIFJvdW5kIDE6IGJvdGggcGFydGllcyBydW4gREtHIHJvdW5kIDFcbiAgICBjb25zdCB7XG4gICAgICB1c2VyU2lnbmVkTXNnMSxcbiAgICAgIGJhY2t1cFNpZ25lZE1zZzEsXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMSxcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMSxcbiAgICB9ID0gYXdhaXQgY2FsbGJhY2tzLnJvdW5kMUNhbGxiYWNrKHtcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleUFybW9yZWQsXG4gICAgICB1c2VyR3BnUHVibGljS2V5LFxuICAgICAgYmFja3VwR3BnUHVibGljS2V5LFxuICAgICAgdXNlclN0YXRlLFxuICAgICAgYmFja3VwU3RhdGUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHNlc3Npb25JZCwgYml0Z29Nc2cxIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKGVudGVycHJpc2UsIHtcbiAgICAgIHVzZXJHcGdQdWJsaWNLZXksXG4gICAgICBiYWNrdXBHcGdQdWJsaWNLZXksXG4gICAgICB1c2VyTXNnMTogdXNlclNpZ25lZE1zZzEsXG4gICAgICBiYWNrdXBNc2cxOiBiYWNrdXBTaWduZWRNc2cxLFxuICAgIH0pO1xuXG4gICAgLy8gUm91bmQgMjogYm90aCBwYXJ0aWVzIHJ1biBES0cgcm91bmQgMlxuICAgIGNvbnN0IHtcbiAgICAgIHVzZXJTaWduZWRNc2cyLFxuICAgICAgYmFja3VwU2lnbmVkTXNnMixcbiAgICAgIHVzZXJTdGF0ZTogdXNlclN0YXRlQWZ0ZXIyLFxuICAgICAgYmFja3VwU3RhdGU6IGJhY2t1cFN0YXRlQWZ0ZXIyLFxuICAgIH0gPSBhd2FpdCBjYWxsYmFja3Mucm91bmQyQ2FsbGJhY2soe1xuICAgICAgYml0Z29Nc2cxLFxuICAgICAgdXNlclNpZ25lZE1zZzEsXG4gICAgICBiYWNrdXBTaWduZWRNc2cxLFxuICAgICAgdXNlclN0YXRlOiB1c2VyU3RhdGVBZnRlcjEsXG4gICAgICBiYWNrdXBTdGF0ZTogYmFja3VwU3RhdGVBZnRlcjEsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JZFJvdW5kMixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluOiBiaXRnb0NvbW1vbktleWNoYWluLFxuICAgICAgYml0Z29Nc2cyLFxuICAgIH0gPSBhd2FpdCB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQyKGVudGVycHJpc2UsIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB1c2VyU2lnbmVkTXNnMixcbiAgICAgIGJhY2t1cE1zZzI6IGJhY2t1cFNpZ25lZE1zZzIsXG4gICAgfSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHNlc3Npb25JZCwgc2Vzc2lvbklkUm91bmQyLCAnUm91bmQgMSBhbmQgcm91bmQgMiBzZXNzaW9uIElEcyBkbyBub3QgbWF0Y2gnKTtcblxuICAgIC8vIEZpbmFsaXplOiBib3RoIHBhcnRpZXMgdmVyaWZ5IGFuZCBkZXJpdmUgdGhlIGNvbW1vbiBrZXljaGFpblxuICAgIGNvbnN0IHsgY29tbW9uS2V5Y2hhaW4gfSA9IGF3YWl0IGNhbGxiYWNrcy5maW5hbGl6ZUNhbGxiYWNrKHtcbiAgICAgIGJpdGdvTXNnMixcbiAgICAgIGJpdGdvQ29tbW9uS2V5Y2hhaW4sXG4gICAgICB1c2VyU3RhdGU6IHVzZXJTdGF0ZUFmdGVyMixcbiAgICAgIGJhY2t1cFN0YXRlOiBiYWNrdXBTdGF0ZUFmdGVyMixcbiAgICB9KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29tbW9uS2V5Y2hhaW4sIGJpdGdvQ29tbW9uS2V5Y2hhaW4sICdDb21tb24ga2V5Y2hhaW5zIGRvIG5vdCBtYXRjaCcpO1xuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKTtcbiAgICBjb25zdCBbdXNlcktleWNoYWluLCBiYWNrdXBLZXljaGFpbiwgYml0Z29LZXljaGFpbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBrZXljaGFpbnMuYWRkKHsgc291cmNlOiAndXNlcicsIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsIGNvbW1vbktleWNoYWluLCBpc01QQ3YyOiB0cnVlLCBlbnRlcnByaXNlIH0pLFxuICAgICAga2V5Y2hhaW5zLmFkZCh7IHNvdXJjZTogJ2JhY2t1cCcsIGtleVR5cGU6ICd0c3MnIGFzIEtleVR5cGUsIGNvbW1vbktleWNoYWluLCBpc01QQ3YyOiB0cnVlLCBlbnRlcnByaXNlIH0pLFxuICAgICAgdGhpcy5hZGRCaXRnb0tleWNoYWluKGNvbW1vbktleWNoYWluKSxcbiAgICBdKTtcblxuICAgIHJldHVybiB7IHVzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW4gfTtcbiAgfVxuXG4gIC8vICNyZWdpb24ga2V5Y2hhaW4gdXRpbHNcbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICBwYXJ0aWNpcGFudEluZGV4OiBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIGVudGVycHJpc2U/OiBzdHJpbmcsXG4gICAgc2FmZUlkPzogc3RyaW5nXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICBsZXQgc291cmNlOiBzdHJpbmc7XG4gICAgbGV0IGVuY3J5cHRlZFBydjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCByZWR1Y2VkRW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHByaXZhdGVNYXRlcmlhbEJhc2U2NDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgc3dpdGNoIChwYXJ0aWNpcGFudEluZGV4KSB7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVA6XG4gICAgICAgIHNvdXJjZSA9IHBhcnRpY2lwYW50SW5kZXggPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/ICd1c2VyJyA6ICdiYWNrdXAnO1xuICAgICAgICBhc3NlcnQocHJpdmF0ZU1hdGVyaWFsLCBgUHJpdmF0ZSBtYXRlcmlhbCBpcyByZXF1aXJlZCBmb3IgJHtzb3VyY2V9IGtleWNoYWluYCk7XG4gICAgICAgIGFzc2VydChyZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLCBgUmVkdWNlZCBwcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHBhc3NwaHJhc2UsIGBQYXNzcGhyYXNlIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0ID0gcHJpdmF0ZU1hdGVyaWFsLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgICAgZW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogcHJpdmF0ZU1hdGVyaWFsQmFzZTY0LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gRW5jcnlwdHMgdGhlIENCT1ItZW5jb2RlZCBSZWR1Y2VkS2V5U2hhcmUgKHdoaWNoIGNvbnRhaW5zIHRoZSBwYXJ0eSdzIHB1YmxpY1xuICAgICAgICAvLyBrZXkpIHdpdGggdGhlIHdhbGxldCBwYXNzcGhyYXNlLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBhcyByZWR1Y2VkRW5jcnlwdGVkUHJ2XG4gICAgICAgIC8vIG9uIHRoZSBrZXkgY2FyZCBRUiBjb2RlIGFuZCByZXByZXNlbnRzIGEgc2Vjb25kIGNvcHkgb2Yga2V5IG1hdGVyaWFsXG4gICAgICAgIC8vIGJleW9uZCB0aGUgc2VydmVyLXN0b3JlZCBlbmNyeXB0ZWRQcnYuXG4gICAgICAgIHJlZHVjZWRFbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgICAgICAgIC8vIEJ1ZmZlci50b1N0cmluZygnYmFzZTY0JykgY2FuIG5vdCBiZSB1c2VkIGhlcmUgYXMgaXQgZG9lcyBub3Qgd29yayBvbiB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICBpbnB1dDogYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkocmVkdWNlZFByaXZhdGVNYXRlcmlhbCkpKSksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTzpcbiAgICAgICAgc291cmNlID0gJ2JpdGdvJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgaXNNUEN2MjogdHJ1ZSxcbiAgICAgIHNhZmVJZCxcbiAgICAgIGVudGVycHJpc2UsXG4gICAgfTtcblxuICAgIGlmICh3ZWJhdXRobkluZm8gJiYgcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSICYmIHByaXZhdGVNYXRlcmlhbEJhc2U2NCkge1xuICAgICAgLy8gU2VuZCB0aGUgcGFzc2tleSBhcyBgd2ViYXV0aG5JbmZvYDsgdGhlIGRlcHJlY2F0ZWQgYHdlYmF1dGhuRGV2aWNlc2AgYXJyYXkgaXMgaWdub3JlZCBieSBQT1NUIC9rZXkuXG4gICAgICBhc3NlcnQoZW50ZXJwcmlzZSwgJ2VudGVycHJpc2UgaXMgcmVxdWlyZWQgdG8gYXR0YWNoIGEgd2ViYXV0aG4gZGV2aWNlIHRvIHRoZSB1c2VyIGtleWNoYWluJyk7XG4gICAgICBrZXljaGFpblBhcmFtcy53ZWJhdXRobkluZm8gPSB7XG4gICAgICAgIG90cERldmljZUlkOiB3ZWJhdXRobkluZm8ub3RwRGV2aWNlSWQsXG4gICAgICAgIHByZlNhbHQ6IHdlYmF1dGhuSW5mby5wcmZTYWx0LFxuICAgICAgICBlbmNyeXB0ZWRQcnY6IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICBwYXNzd29yZDogd2ViYXV0aG5JbmZvLnBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pLFxuICAgICAgICBlbnRlcnByaXNlSWQ6IGVudGVycHJpc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgcmV0dXJuIHsgLi4uKGF3YWl0IGtleWNoYWlucy5hZGQoa2V5Y2hhaW5QYXJhbXMpKSwgcmVkdWNlZEVuY3J5cHRlZFBydiB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZFVzZXJLZXljaGFpbihcbiAgICBjb21tb25LZXljaGFpbjogc3RyaW5nLFxuICAgIHByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmcsXG4gICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlPzogc3RyaW5nLFxuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8sXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nLFxuICAgIHNhZmVJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgcHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3ZWJhdXRobkluZm8sXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIGVudGVycHJpc2UsXG4gICAgICBzYWZlSWRcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFkZEJhY2t1cEtleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbixcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nLFxuICAgIHNhZmVJZD86IHN0cmluZ1xuICApOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgICAgY29tbW9uS2V5Y2hhaW4sXG4gICAgICBwcml2YXRlTWF0ZXJpYWwsXG4gICAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgZW50ZXJwcmlzZSxcbiAgICAgIHNhZmVJZFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYWRkQml0Z29LZXljaGFpbihjb21tb25LZXljaGFpbjogc3RyaW5nLCBzYWZlSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICAgIE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHNhZmVJZFxuICAgICk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdCAmIHsgd2FsbGV0SWQ/OiBzdHJpbmcgfSxcbiAgICBzYWZlSWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKEtleUdlblNlbmRlckZvckVudGVycHJpc2UodGhpcy5iaXRnbywgZW50ZXJwcmlzZSwgc2FmZUlkKSwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3QgJiB7IHdhbGxldElkPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHBheWxvYWQpO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIoXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0XG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDJCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm48RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPixcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXSwgcGF5bG9hZCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxsIDMtcm91bmQgRWREU0EgTVBDdjIgKE1QUykgb25saW5lIHNpZ25pbmcgb3JjaGVzdHJhdGlvbi5cbiAgICpcbiAgICogUHJvdG9jb2wgb3ZlcnZpZXc6XG4gICAqICAgV0FTTSBSb3VuZCAwICDihpIgZ2V0Rmlyc3RNZXNzYWdlKCkgICAgICAocHJvZHVjZXMgdXNlck1zZzEpXG4gICAqICAgQVBJICBSb3VuZCAxICDihpIgc2VuZCB1c2VyTXNnMSAvIHJlY3YgYml0Z29Nc2cxXG4gICAqICAgV0FTTSBSb3VuZCAxICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvTXNnMV0pICAocHJvZHVjZXMgdXNlck1zZzIpXG4gICAqICAgQVBJICBSb3VuZCAyICDihpIgc2VuZCB1c2VyTXNnMiAvIHJlY3YgYml0Z29Nc2cyXG4gICAqICAgV0FTTSBSb3VuZCAyICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvTXNnMl0pICAocHJvZHVjZXMgdXNlck1zZzMpXG4gICAqICAgQVBJICBSb3VuZCAzICDihpIgc2VuZCB1c2VyTXNnMyAoV1AgZmluYWxpc2VzOyBubyBCaXRHbyBtc2cgcmV0dXJuZWQgdG8gY2xpZW50KVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHR4T3JNZXNzYWdlVG9TaWduO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcbiAgICBsZXQgYnVmZmVyQ29udGVudDtcbiAgICAvLyBPbmUgZnJlc2ggZWQyNTUxOSBHUEcga2V5IHBhaXIgcGVyIHNpZ25pbmcgc2Vzc2lvbiwgcmV1c2VkIGFjcm9zcyBhbGwgc2lnbmluZyByb3VuZHMuXG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgYml0Z29HcGdQdWJLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcodHJ1ZSwgcGFyYW1zLnJlcUlkLCB0eFJlcXVlc3QuZW50ZXJwcmlzZUlkLCB0cnVlKTtcbiAgICBhc3NlcnQoYml0Z29HcGdQdWJLZXksICdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHMhWzBdO1xuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4O1xuICAgICAgYXNzZXJ0KHR4T3JNZXNzYWdlVG9TaWduLCAnTWlzc2luZyBzaWduYWJsZUhleCBpbiB1bnNpZ25lZFR4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCA/PyB0eE9yTWVzc2FnZVRvU2lnbiB9LFxuICAgICAgICB0eFBhcmFtczogcmVzb2x2ZUVmZmVjdGl2ZVR4UGFyYW1zKHR4UmVxdWVzdCwgcGFyYW1zLnR4UGFyYW1zLCB0aGlzLmJhc2VDb2luLmdldENoYWluKCkpLFxuICAgICAgICB3YWxsZXQ6IHRoaXMud2FsbGV0LFxuICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGUoKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLm1lc3NhZ2UpIHtcbiAgICAgIGFzc2VydCh0eFJlcXVlc3QubWVzc2FnZXMgJiYgdHhSZXF1ZXN0Lm1lc3NhZ2VzLmxlbmd0aCA+IDAsICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiB0eFJlcXVlc3QnKTtcbiAgICAgIHR4T3JNZXNzYWdlVG9TaWduID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzWzBdLm1lc3NhZ2VFbmNvZGVkO1xuICAgICAgYXNzZXJ0KHR4T3JNZXNzYWdlVG9TaWduLCAnTWlzc2luZyBtZXNzYWdlRW5jb2RlZCBpbiBtZXNzYWdlc1swXScpO1xuICAgICAgZGVyaXZhdGlvblBhdGggPSB0eFJlcXVlc3QubWVzc2FnZXNbMF0uZGVyaXZhdGlvblBhdGggfHwgJ20vMCc7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlcXVlc3QgdHlwZScpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBXQVNNIFJvdW5kIDAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3QgcGFydHlJZCA9IHBhcmFtcy5tcGN2MlBhcnR5SWQgPz8gTVBDdjJQYXJ0aWVzRW51bS5VU0VSO1xuICAgIGNvbnN0IHNpZ25lclNoYXJlVHlwZSA9IHBhcnR5SWQgPT09IE1QQ3YyUGFydGllc0VudW0uVVNFUiA/IFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSIDogU2lnbmF0dXJlU2hhcmVUeXBlLkJBQ0tVUDtcbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhwYXJ0eUlkKTtcbiAgICBhd2FpdCB1c2VyRHNnLmluaXREc2codXNlcktleVNoYXJlLCBidWZmZXJDb250ZW50LCBkZXJpdmF0aW9uUGF0aCwgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyk7XG4gICAgY29uc3QgdXNlck1zZzEgPSB1c2VyRHNnLmdldEZpcnN0TWVzc2FnZSgpO1xuXG4gICAgLy8g4pSA4pSAIEFQSSBSb3VuZCAxIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQxID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZE9uZSh1c2VyTXNnMSwgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgbGV0IGxhdGVzdFR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBhc3NlcnQobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMsICdJbnZhbGlkIHR4UmVxdWVzdCBvYmplY3QgYWZ0ZXIgcm91bmQgMScpO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzMSA9XG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHhcbiAgICAgICAgPyBsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS5zaWduYXR1cmVTaGFyZXNcbiAgICAgICAgOiBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZE9uZSA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUoc2lnbmF0dXJlU2hhcmVzMSwgc2lnbmVyU2hhcmVUeXBlLCAncm91bmQxT3V0cHV0Jyk7XG4gICAgY29uc3QgcGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lID0gZGVjb2RlV2l0aENvZGVjKFxuICAgICAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQxT3V0cHV0LFxuICAgICAgSlNPTi5wYXJzZShiaXRnb1NoYXJlUm91bmRPbmUuc2hhcmUpLFxuICAgICAgJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nXG4gICAgKTtcblxuICAgIGlmIChwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUudHlwZSAhPT0gJ3JvdW5kMU91dHB1dCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMSA9IGF3YWl0IHZlcmlmeVBlZXJNZXNzYWdlUm91bmRPbmUocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLCBiaXRnb0dwZ1B1YktleSk7XG5cbiAgICAvLyDilIDilIAgV0FTTSBSb3VuZCAxIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IFt1c2VyTXNnMl0gPSB1c2VyRHNnLmhhbmRsZUluY29taW5nTWVzc2FnZXMoW3VzZXJNc2cxLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzFdKTtcbiAgICBhc3NlcnQodXNlck1zZzIsICdXQVNNIHJvdW5kIDEgcHJvZHVjZWQgbm8gbWVzc2FnZScpO1xuXG4gICAgLy8g4pSA4pSAIEFQSSBSb3VuZCAyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmRUd28gPSBhd2FpdCBnZXRTaWduYXR1cmVTaGFyZVJvdW5kVHdvKHVzZXJNc2cyLCB1c2VyR3BnUHJ2S2V5LCBwYXJ0eUlkKTtcbiAgICBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZFR3b10sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHBhcmFtcy5yZXFJZFxuICAgICk7XG5cbiAgICBhc3NlcnQobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMsICdJbnZhbGlkIHR4UmVxdWVzdCBvYmplY3QgYWZ0ZXIgcm91bmQgMicpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzID1cbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eFxuICAgICAgICA/IGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnNpZ25hdHVyZVNoYXJlc1xuICAgICAgICA6IGxhdGVzdFR4UmVxdWVzdC5tZXNzYWdlcyFbMF0uc2lnbmF0dXJlU2hhcmVzO1xuXG4gICAgY29uc3QgYml0Z29TaGFyZVJvdW5kVHdvID0gZ2V0Qml0Z29TaWduYXR1cmVTaGFyZSh0eFJlcXVlc3RTaWduYXR1cmVTaGFyZXMsIHNpZ25lclNoYXJlVHlwZSwgJ3JvdW5kMk91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kVHdvLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLnR5cGUgIT09ICdyb3VuZDJPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzIgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVHdvKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3bywgYml0Z29HcGdQdWJLZXkpO1xuXG4gICAgLy8g4pSA4pSAIFdBU00gUm91bmQgMiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBbdXNlck1zZzNdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2czLCAnV0FTTSByb3VuZCAyIHByb2R1Y2VkIG5vIG1lc3NhZ2UnKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBObyBCaXRHbyByZXNwb25zZSB0byB2ZXJpZnk7IFdQIGZpbmFsaXNlcyB0aGUgc2lnbmluZyBzZXJ2ZXItc2lkZVxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJNc2czLCB1c2VyR3BnUHJ2S2V5LCBwYXJ0eUlkKTtcbiAgICBjb25zdCByb3VuZDNUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDNdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuICAgIGFzc2VydChyb3VuZDNUeFJlcXVlc3Q/LnR4UmVxdWVzdElkID09PSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsICdJbnZhbGlkIHR4UmVxdWVzdCBvYmplY3QgYWZ0ZXIgcm91bmQgMycpO1xuXG4gICAgcmV0dXJuIHNlbmRUeFJlcXVlc3QodGhpcy5iaXRnbywgdHhSZXF1ZXN0LndhbGxldElkLCB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gZXh0ZXJuYWwgc2lnbmVyXG5cbiAgLy8gI3JlZ2lvbiBLZXlHZW5Sb3VuZDFTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lS2V5R2VuUm91bmQxU2hhcmUocGFyYW1zOiB7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBiaXRnb0dwZ1B1YktleTogc3RyaW5nO1xuICAgIGNvdW50ZXJQYXJ0eUdwZ1B1YktleTogc3RyaW5nO1xuICAgIHBhcnR5SWQ/OiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgfCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDtcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25lZE1zZzE6IE1QU1R5cGVzLk1QU1NpZ25lZE1lc3NhZ2U7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgeyB3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBiaXRnb0dwZ1B1YktleSwgY291bnRlclBhcnR5R3BnUHViS2V5IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGFydHlJZCA9IHBhcmFtcy5wYXJ0eUlkID8/IE1QQ3YyUGFydGllc0VudW0uVVNFUjtcblxuICAgIGNvbnN0IGRlY3J5cHRlZEdwZ1BydktleSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICBjb25zdCBncGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBkZWNyeXB0ZWRHcGdQcnZLZXkgfSk7XG5cbiAgICBjb25zdCBbLCBvd25Ta10gPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOUtleVBhaXIoZ3BnUHJ2S2V5KTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICBhc3NlcnQoaXNCaXRnb0VkZHNhTXBjdjJQdWJLZXkoYml0Z29HcGdQdWJLZXkpLCAnSW52YWxpZCBCaXRHbyBHUEcgcHVibGljIGtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvS2V5T2JqID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBiaXRnb0dwZ1B1YktleSB9KTtcbiAgICBjb25zdCBiaXRnb1BrID0gYXdhaXQgTVBTQ29tbXMuZXh0cmFjdEVkMjU1MTlQdWJsaWNLZXkoYml0Z29LZXlPYmopO1xuXG4gICAgY29uc3QgY291bnRlclBhcnR5S2V5T2JqID0gYXdhaXQgcGdwLnJlYWRLZXkoeyBhcm1vcmVkS2V5OiBjb3VudGVyUGFydHlHcGdQdWJLZXkgfSk7XG4gICAgY29uc3QgY291bnRlclBhcnR5UGsgPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOVB1YmxpY0tleShjb3VudGVyUGFydHlLZXlPYmopO1xuXG4gICAgY29uc3QgZGtnID0gbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBwYXJ0eUlkKTtcbiAgICBhd2FpdCBka2cuaW5pdERrZyhvd25TaywgW2NvdW50ZXJQYXJ0eVBrLCBiaXRnb1BrXSk7XG5cbiAgICBjb25zdCBtc2cxID0gZGtnLmdldEZpcnN0TWVzc2FnZSgpO1xuICAgIGNvbnN0IHNpZ25lZE1zZzEgPSBhd2FpdCBNUFNDb21tcy5kZXRhY2hTaWduTXBzTWVzc2FnZShCdWZmZXIuZnJvbShtc2cxLnBheWxvYWQpLCBncGdQcnZLZXkpO1xuXG4gICAgY29uc3Qgc2Vzc2lvblBheWxvYWQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBka2dTZXNzaW9uOiBka2cuZ2V0U2Vzc2lvbigpLFxuICAgICAgb3duTXNnUGF5bG9hZDogQnVmZmVyLmZyb20obXNnMS5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICBvd25Nc2dGcm9tOiBtc2cxLmZyb20sXG4gICAgfSk7XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfREtHX0tFWUdFTl9ST1VORDFfU1RBVEV9OiR7cGFydHlJZH1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduZWRNc2cxLCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUm91bmQxU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlckdwZ1B1YktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgdHhSZXF1ZXN0LCBlbmNyeXB0ZWRQcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKFxuICAgICAgdHhSZXF1ZXN0LFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGF0YSA9IGAke3NpZ25hYmxlSGV4fToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgdXNlckdwZ1BydktleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSB9KTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXdhaXQgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgQnVmZmVyLmZyb20oc2lnbmFibGVIZXgsICdoZXgnKSwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJLZXkgPSB1c2VyR3BnS2V5LnB1YmxpY0tleTtcblxuICAgIGNvbnN0IHVzZVYyID0gZW5jcnlwdGVkUHJ2ICE9PSB1bmRlZmluZWQgJiYgaXNWMkVudmVsb3BlKGVuY3J5cHRlZFBydik7XG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgICBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQxX1NUQVRFfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcbiAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiB1c2VyR3BnS2V5LnByaXZhdGVLZXksXG4gICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhOiBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb246IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIFJvdW5kMlNoYXJlXG4gIGFzeW5jIGNyZWF0ZU9mZmxpbmVSb3VuZDJTaGFyZShwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbjogc3RyaW5nO1xuICB9KTogUHJvbWlzZTx7XG4gICAgc2lnbmF0dXJlU2hhcmVSb3VuZDI6IFNpZ25hdHVyZVNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFJvdW5kMlNlc3Npb246IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHsgd2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgYml0Z29QdWJsaWNHcGdLZXksIHR4UmVxdWVzdCB9ID0gcGFyYW1zO1xuXG4gICAgY29uc3QgeyBzaWduYWJsZUhleCwgZGVyaXZhdGlvblBhdGggfSA9IHRoaXMuZ2V0U2lnbmFibGVIZXhBbmREZXJpdmF0aW9uUGF0aChcbiAgICAgIHR4UmVxdWVzdCxcbiAgICAgICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0J1xuICAgICk7XG4gICAgY29uc3QgYWRhdGEgPSBgJHtzaWduYWJsZUhleH06JHtkZXJpdmF0aW9uUGF0aH1gO1xuXG4gICAgY29uc3QgdXNlVjIgPSBpc1YyRW52ZWxvcGUoZW5jcnlwdGVkUm91bmQxU2Vzc2lvbik7XG5cbiAgICBjb25zdCB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH0gPSBhd2FpdCB0aGlzLmdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleSxcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGEsXG4gICAgICBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWVxuICAgICk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zO1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHRyYW5zYWN0aW9ucykgJiYgdHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMSwgJ3R4UmVxdWVzdCBtdXN0IGhhdmUgZXhhY3RseSBvbmUgdHJhbnNhY3Rpb24nKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZXMgPSB0cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzO1xuICAgIGFzc2VydChzaWduYXR1cmVTaGFyZXMsICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMSB0eFJlcXVlc3QnKTtcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZE9uZSA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUoc2lnbmF0dXJlU2hhcmVzLCBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiwgJ3JvdW5kMU91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kT25lLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzEgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSwgYml0Z29HcGdLZXkpO1xuXG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURSk7XG5cbiAgICBjb25zdCBkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGRzZ1Nlc3Npb24sIHVzZXJNc2dQYXlsb2FkIH0gPSBKU09OLnBhcnNlKGRlY3J5cHRlZFJvdW5kMVNlc3Npb24pIGFzIHtcbiAgICAgIGRzZ1Nlc3Npb246IHN0cmluZztcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXdhaXQgdXNlckRzZy5yZXN0b3JlU2Vzc2lvbihkc2dTZXNzaW9uKTtcbiAgICBjb25zdCB1c2VyTXNnMTogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHVzZXJNc2dQYXlsb2FkLCAnYmFzZTY0JykpLFxuICAgIH07XG5cbiAgICBjb25zdCBbdXNlck1zZzJdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLCAnRFNHIGhhbmRsZUluY29taW5nTWVzc2FnZXMgcHJvZHVjZWQgbm8gcm91bmQtMiBvdXRwdXQnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQyID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byh1c2VyTXNnMiwgdXNlckdwZ1BydktleSk7XG4gICAgY29uc3Qgc2Vzc2lvblBheWxvYWQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkc2dTZXNzaW9uOiB1c2VyRHNnLmdldFNlc3Npb24oKSxcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBCdWZmZXIuZnJvbSh1c2VyTXNnMi5wYXlsb2FkKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfSk7XG5cbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmNyZWF0ZUVuY3J5cHRpb25TZXNzaW9uKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHNlc3Npb24uZW5jcnlwdChcbiAgICAgICAgICBzZXNzaW9uUGF5bG9hZCxcbiAgICAgICAgICBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0KHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUm91bmQzU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kM1NoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMzogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHsgYml0Z29HcGdLZXksIHVzZXJHcGdQcnZLZXkgfSA9IGF3YWl0IHRoaXMuZ2V0Qml0Z29BbmRVc2VyR3BnS2V5cyhcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5LFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YSxcbiAgICAgIEVkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfVVNFUl9HUEdfS0VZXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnM7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodHJhbnNhY3Rpb25zKSAmJiB0cmFuc2FjdGlvbnMubGVuZ3RoID09PSAxLCAndHhSZXF1ZXN0IG11c3QgaGF2ZSBleGFjdGx5IG9uZSB0cmFuc2FjdGlvbicpO1xuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlcyA9IHRyYW5zYWN0aW9uc1swXS5zaWduYXR1cmVTaGFyZXM7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZVNoYXJlcywgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCcpO1xuXG4gICAgY29uc3QgYml0Z29TaGFyZVJvdW5kVHdvID0gZ2V0Qml0Z29TaWduYXR1cmVTaGFyZShzaWduYXR1cmVTaGFyZXMsIFNpZ25hdHVyZVNoYXJlVHlwZS5VU0VSLCAncm91bmQyT3V0cHV0Jyk7XG5cbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28gPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZFR3by5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byhwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sIGJpdGdvR3BnS2V5KTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiwgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUpO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBkc2dTZXNzaW9uLCB1c2VyTXNnUGF5bG9hZCB9ID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSb3VuZDJTZXNzaW9uKSBhcyB7XG4gICAgICBkc2dTZXNzaW9uOiBzdHJpbmc7XG4gICAgICB1c2VyTXNnUGF5bG9hZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGF3YWl0IHVzZXJEc2cucmVzdG9yZVNlc3Npb24oZHNnU2Vzc2lvbik7XG4gICAgY29uc3QgdXNlck1zZzI6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1c2VyTXNnUGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW3VzZXJNc2czXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvRGVzZXJpYWxpemVkTXNnMl0pO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ0RTRyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIHByb2R1Y2VkIG5vIHJvdW5kLTMgb3V0cHV0Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyTXNnMywgdXNlckdwZ1BydktleSk7XG5cbiAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMyB9O1xuICB9XG4gIC8vICNlbmRyZWdpb25cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYXN5bmMgc2lnbkVkZHNhTVBDdjJUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgICBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdG9yOiBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yOiBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yOiBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUgPSBSZXF1ZXN0VHlwZS50eFxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhSZXF1ZXN0LCByZXFJZCB9ID0gcGFyYW1zO1xuXG4gICAgLy8gVE9ETyhXUC0yMTc2KTogQWRkIHN1cHBvcnQgZm9yIG1lc3NhZ2Ugc2lnbmluZ1xuICAgIGFzc2VydChcbiAgICAgIHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS50eCxcbiAgICAgICdPbmx5IHRyYW5zYWN0aW9uIHNpZ25pbmcgaXMgc3VwcG9ydGVkIGZvciBleHRlcm5hbCBzaWduZXIsIGdvdDogJyArIHJlcXVlc3RUeXBlXG4gICAgKTtcblxuICAgIGxldCB0eFJlcXVlc3RSZXNvbHZlZDogVHhSZXF1ZXN0O1xuICAgIGlmICh0eXBlb2YgdHhSZXF1ZXN0ID09PSAnc3RyaW5nJykge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0LCByZXFJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkID0gdHhSZXF1ZXN0O1xuICAgIH1cblxuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gYXdhaXQgdGhpcy5waWNrQml0Z29QdWJHcGdLZXlGb3JTaWduaW5nKFxuICAgICAgdHJ1ZSxcbiAgICAgIHJlcUlkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQuZW50ZXJwcmlzZUlkLFxuICAgICAgdHJ1ZVxuICAgICk7XG5cbiAgICBpZiAoIWJpdGdvUHVibGljR3BnS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgQml0R28gR1BHIGtleSBmb3IgTVBDdjInKTtcbiAgICB9XG5cbiAgICAvLyByb3VuZCAxXG4gICAgY29uc3QgeyBzaWduYXR1cmVTaGFyZVJvdW5kMSwgdXNlckdwZ1B1YktleSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgZW5jcnlwdGVkVXNlckdwZ1BydktleSB9ID1cbiAgICAgIGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3IoeyB0eFJlcXVlc3Q6IHR4UmVxdWVzdFJlc29sdmVkIH0pO1xuICAgIGNvbnN0IHJvdW5kMVR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDJcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQxVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBjb25zdCByb3VuZDJUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQyXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG4gICAgYXNzZXJ0KFxuICAgICAgcm91bmQyVHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyAmJiByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcyxcbiAgICAgICdNaXNzaW5nIHNpZ25hdHVyZSBzaGFyZXMgaW4gcm91bmQgMiB0eFJlcXVlc3QnXG4gICAgKTtcblxuICAgIC8vIHJvdW5kIDNcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH0gPSBhd2FpdCBleHRlcm5hbFNpZ25lckVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yKHtcbiAgICAgIHR4UmVxdWVzdDogcm91bmQyVHhSZXF1ZXN0LFxuICAgICAgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksXG4gICAgICBiaXRnb1B1YmxpY0dwZ0tleTogYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKSxcbiAgICB9KTtcbiAgICBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdQdWJLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICByZXFJZFxuICAgICk7XG5cbiAgICByZXR1cm4gc2VuZFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0eFJlcXVlc3RSZXNvbHZlZC53YWxsZXRJZCwgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCByZXFJZCk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gcmV0cm9maXRcblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlckFuZEJhY2t1cFNlc3Npb24ocmV0cm9maXQ/OiBEZWNyeXB0ZWRSZXRyb2ZpdFBheWxvYWQpOiBQcm9taXNlPHtcbiAgICB1c2VyRGtnOiBFZGRzYU1QU0RrZy5ES0c7XG4gICAgYmFja3VwRGtnOiBFZGRzYU1QU0RrZy5ES0c7XG4gIH0+IHtcbiAgICBpZiAocmV0cm9maXQpIHtcbiAgICAgIGNvbnN0IHsgdXNlclJldHJvZml0RGF0YSwgYmFja3VwUmV0cm9maXREYXRhIH0gPSBhd2FpdCB0aGlzLmdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5cyh7XG4gICAgICAgIG1wY3YxVXNlcktleVNoYXJlOiByZXRyb2ZpdC5kZWNyeXB0ZWRVc2VyS2V5LFxuICAgICAgICBtcGN2MUJhY2t1cEtleVNoYXJlOiByZXRyb2ZpdC5kZWNyeXB0ZWRCYWNrdXBLZXksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVzZXJEa2c6IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSLCB1c2VyUmV0cm9maXREYXRhKSxcbiAgICAgICAgYmFja3VwRGtnOiBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLCBiYWNrdXBSZXRyb2ZpdERhdGEpLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJEa2c6IG5ldyBFZGRzYU1QU0RrZy5ES0coMywgMiwgTVBDdjJQYXJ0aWVzRW51bS5VU0VSKSxcbiAgICAgIGJhY2t1cERrZzogbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCksXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldE1wY1YyUmV0cm9maXREYXRhRnJvbU1wY1YxS2V5cyhwYXJhbXM6IHsgbXBjdjFVc2VyS2V5U2hhcmU6IHN0cmluZzsgbXBjdjFCYWNrdXBLZXlTaGFyZTogc3RyaW5nIH0pOiBQcm9taXNlPHtcbiAgICB1c2VyUmV0cm9maXREYXRhOiBNUFNUeXBlcy5FZGRzYVJldHJvZml0RGF0YTtcbiAgICBiYWNrdXBSZXRyb2ZpdERhdGE6IE1QU1R5cGVzLkVkZHNhUmV0cm9maXREYXRhO1xuICB9PiB7XG4gICAgY29uc3QgTVBDID0gYXdhaXQgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuICAgIGNvbnN0IHVzZXJSZXRyb2ZpdERhdGEgPSBFZGRzYU1QQ3YyVXRpbHMuZ2V0TXBjVjJSZXRyb2ZpdERhdGFGcm9tTXBjVjFLZXkoXG4gICAgICBwYXJhbXMubXBjdjFVc2VyS2V5U2hhcmUsXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBNUENcbiAgICApO1xuICAgIGNvbnN0IGJhY2t1cFJldHJvZml0RGF0YSA9IEVkZHNhTVBDdjJVdGlscy5nZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleShcbiAgICAgIHBhcmFtcy5tcGN2MUJhY2t1cEtleVNoYXJlLFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBNUENcbiAgICApO1xuXG4gICAgYXNzZXJ0KFxuICAgICAgdXNlclJldHJvZml0RGF0YS5leHBlY3RlZFBrID09PSBiYWNrdXBSZXRyb2ZpdERhdGEuZXhwZWN0ZWRQayxcbiAgICAgICdNUEN2MSB1c2VyIGFuZCBiYWNrdXAga2V5cyBjb21iaW5lIHRvIGRpZmZlcmVudCBhZ2dyZWdhdGUgcHVibGljIGtleXMnXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICB1c2VyUmV0cm9maXREYXRhLmNoYWluQ29kZSA9PT0gYmFja3VwUmV0cm9maXREYXRhLmNoYWluQ29kZSxcbiAgICAgICdNUEN2MSB1c2VyIGFuZCBiYWNrdXAga2V5cyBjb21iaW5lIHRvIGRpZmZlcmVudCBjaGFpbiBjb2RlcydcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgdXNlclJldHJvZml0RGF0YSwgYmFja3VwUmV0cm9maXREYXRhIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRNcGNWMlJldHJvZml0RGF0YUZyb21NcGNWMUtleShcbiAgICBtcGN2MVBhcnR5S2V5U2hhcmU6IHN0cmluZyxcbiAgICBtcGN2MVBhcnR5SW5kZXg6IE1QQ3YyUGFydGllc0VudW0uVVNFUiB8IE1QQ3YyUGFydGllc0VudW0uQkFDS1VQLFxuICAgIG1wYzogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBnZXRJbml0aWFsaXplZE1wY0luc3RhbmNlPj5cbiAgKTogTVBTVHlwZXMuRWRkc2FSZXRyb2ZpdERhdGEge1xuICAgIGNvbnN0IHNpZ25pbmdNYXRlcmlhbDogU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShtcGN2MVBhcnR5S2V5U2hhcmUpO1xuICAgIGFzc2VydChzaWduaW5nTWF0ZXJpYWwudVNoYXJlLCAnTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgdVNoYXJlJyk7XG4gICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iaXRnb1lTaGFyZSwgJ01QQ3YxIGtleSBtYXRlcmlhbCBtaXNzaW5nIGJpdGdvWVNoYXJlJyk7XG5cbiAgICBsZXQgcFNoYXJlO1xuICAgIHN3aXRjaCAobXBjdjFQYXJ0eUluZGV4KSB7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uVVNFUjpcbiAgICAgICAgYXNzZXJ0KHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmUsICdVc2VyIE1QQ3YxIGtleSBtYXRlcmlhbCBtaXNzaW5nIGJhY2t1cFlTaGFyZScpO1xuICAgICAgICBwU2hhcmUgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwudVNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvWVNoYXJlLFxuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC5iYWNrdXBZU2hhcmUsXG4gICAgICAgIF0pLnBTaGFyZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1QQ3YyUGFydGllc0VudW0uQkFDS1VQOlxuICAgICAgICBhc3NlcnQoc2lnbmluZ01hdGVyaWFsLnVzZXJZU2hhcmUsICdCYWNrdXAgTVBDdjEga2V5IG1hdGVyaWFsIG1pc3NpbmcgdXNlcllTaGFyZScpO1xuICAgICAgICBwU2hhcmUgPSBtcGMua2V5Q29tYmluZShzaWduaW5nTWF0ZXJpYWwudVNoYXJlLCBbXG4gICAgICAgICAgc2lnbmluZ01hdGVyaWFsLmJpdGdvWVNoYXJlLFxuICAgICAgICAgIHNpZ25pbmdNYXRlcmlhbC51c2VyWVNoYXJlLFxuICAgICAgICBdKS5wU2hhcmU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50IGluZGV4Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNfaV8wOiBwU2hhcmUudSxcbiAgICAgIGV4cGVjdGVkUGs6IHBTaGFyZS55LFxuICAgICAgY2hhaW5Db2RlOiBwU2hhcmUuY2hhaW5jb2RlLFxuICAgIH07XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG59XG5cbi8qKlxuICogRGV0ZWN0IHdoZXRoZXIgYW4gZW5jcnlwdGVkIGtleWNhcmQgY29udGFpbnMgTVBDdjEgc2lnbmluZyBtYXRlcmlhbC5cbiAqXG4gKiBEZWNyeXB0cyB0aGUga2V5Y2FyZCBhbmQgY2hlY2tzIGZvciB0aGUgSlNPTiBzaGFwZSBwcm9kdWNlZCBieSB0aGUgTVBDdjEgVFNTXG4gKiBrZXktZ2VuZXJhdGlvbiBmbG93ICh1U2hhcmUuc2VlZCArIGJpdGdvWVNoYXJlLnUgKyBiYWNrdXBZU2hhcmUudSAvIHVzZXJZU2hhcmUudSkuXG4gKiBSZXR1cm5zIGZhbHNlIGZvciBNUEN2MiBDQk9SIGtleWNhcmRzLCB3cm9uZyBwYXNzd29yZHMsIG9yIGFueSBkZWNyeXB0aW9uIGVycm9yLlxuICpcbiAqIEBwYXJhbSBlbmNyeXB0ZWRLZXlTaGFyZSBlbmNyeXB0ZWQgdXNlciBvciBiYWNrdXAga2V5Y2FyZFxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgdGhlIGtleWNhcmRcbiAqIEBwYXJhbSBiaXRnbyBvcHRpb25hbCBCaXRHb0Jhc2UgaW5zdGFuY2U7IHdoZW4gcHJvdmlkZWQsIGRlY3J5cHRzIHZpYVxuICogICBiaXRnby5kZWNyeXB0IChzdXBwb3J0cyBib3RoIHYxIFNKQ0wgYW5kIHYyIEFyZ29uMmlkIGVudmVsb3Blcyk7XG4gKiAgIHdoZW4gYWJzZW50LCBmYWxscyBiYWNrIHRvIHNqY2wuZGVjcnlwdCAodjEgb25seSlcbiAqL1xuZnVuY3Rpb24gcGFyc2VFZGRzYU1wY1YxTWF0ZXJpYWwoZGVjcnlwdGVkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtID0gSlNPTi5wYXJzZShkZWNyeXB0ZWQpO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBtPy51U2hhcmU/LnNlZWQgPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2YgbT8uYml0Z29ZU2hhcmU/LnUgPT09ICdzdHJpbmcnICYmXG4gICAgICAodHlwZW9mIG0/LmJhY2t1cFlTaGFyZT8udSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG0/LnVzZXJZU2hhcmU/LnUgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIGRlY3J5cHRlZDtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vdCBKU09OIOKGkiBNUEN2MiBDQk9SXG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0VkZHNhTXBjVjFTaWduaW5nTWF0ZXJpYWwoXG4gIGVuY3J5cHRlZEtleVNoYXJlOiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBkZWNyeXB0ZWQgPSBiaXRnb1xuICAgID8gYXdhaXQgYml0Z28uZGVjcnlwdCh7IGlucHV0OiBlbmNyeXB0ZWRLZXlTaGFyZSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSlcbiAgICA6IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRLZXlTaGFyZSk7XG4gIHJldHVybiBwYXJzZUVkZHNhTXBjVjFNYXRlcmlhbChkZWNyeXB0ZWQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIEdldCBFZERTQSBNUEN2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGZyb20gZW5jcnlwdGVkIHJlZHVjZWQgdXNlciBhbmQgYmFja3VwIGtleXMuXG4gKlxuICogVGhlIGVuY3J5cHRlZCBpbnB1dHMgYXJlIHRoZSBgcmVkdWNlZEVuY3J5cHRlZFBydmAgdmFsdWVzIHN0b3JlZCBvbiBFZERTQSBNUEN2MlxuICoga2V5IGNhcmRzLiBUaGV5IGRlY3J5cHQgZWl0aGVyIHRvIENCT1ItZW5jb2RlZCByZWR1Y2VkIHNoYXJlcyAobGVnYWN5IGNhcmRzKSBvciB0b1xuICogdGhlIHZlcnNpb25lZCBzYWZlLXJvb3QgZW52ZWxvcGUgYHsgdmVyc2lvbjogMSwgcHJ2S2V5U2hhcmUsIHZyZiB9YCwgd2hlcmUgdGhlIHNpZ25pbmdcbiAqIHNoYXJlIHN0YXlzIHJlZHVjZWQgYW5kIGB2cmZgIGlzIHRoZSBjb21wbGV0ZSBzZXJpYWxpemVkIFZSRiBrZXlzaGFyZS4gTGVnYWN5IGNhcmRzXG4gKiBoYXZlIG5vIFZSRiBtYXRlcmlhbCBhbmQgcmVjb3ZlciBhcyBiZWZvcmUuXG4gKlxuICogQHBhcmFtIGVuY3J5cHRlZFVzZXJLZXkgZW5jcnlwdGVkIEVkRFNBIE1QQ3YyIHJlZHVjZWQgdXNlciBrZXlcbiAqIEBwYXJhbSBlbmNyeXB0ZWRCYWNrdXBLZXkgZW5jcnlwdGVkIEVkRFNBIE1QQ3YyIHJlZHVjZWQgYmFja3VwIGtleVxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3dvcmQgZm9yIHVzZXIgYW5kIGJhY2t1cCBrZXlzXG4gKiBAcmV0dXJucyBFZERTQSBNUEN2MiByZWNvdmVyeSBrZXkgc2hhcmVzIGFuZCBjb21tb24ga2V5Y2hhaW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVkZHNhTXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5KFxuICBlbmNyeXB0ZWRVc2VyS2V5OiBzdHJpbmcsXG4gIGVuY3J5cHRlZEJhY2t1cEtleTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nLFxuICBiaXRnbz86IEJpdEdvQmFzZVxuKTogUHJvbWlzZTxFZGRzYU1QQ3YyUmVjb3ZlcnlLZXlTaGFyZXM+IHtcbiAgY29uc3QgZGVjb2RlS2V5ID0gYXN5bmMgKFxuICAgIGVuY3J5cHRlZEtleTogc3RyaW5nXG4gICk6IFByb21pc2U8eyByZWR1Y2VkOiBNUFNUeXBlcy5FZGRzYVJlZHVjZWRLZXlTaGFyZTsgdnJmS2V5U2hhcmU/OiBCdWZmZXIgfT4gPT4ge1xuICAgIGNvbnN0IGRlY3J5cHRlZCA9IGJpdGdvXG4gICAgICA/IGF3YWl0IGJpdGdvLmRlY3J5cHQoeyBpbnB1dDogZW5jcnlwdGVkS2V5LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KVxuICAgICAgOiBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkS2V5KTtcbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZU1wY1YyS2V5U2hhcmVFbnZlbG9wZShkZWNyeXB0ZWQpO1xuICAgIGxldCByZWR1Y2VkOiBNUFNUeXBlcy5FZGRzYVJlZHVjZWRLZXlTaGFyZTtcbiAgICB0cnkge1xuICAgICAgcmVkdWNlZCA9IE1QU1R5cGVzLmdldERlY29kZWRSZWR1Y2VkS2V5U2hhcmUocGFyc2VkLnNpZ25pbmdLZXlTaGFyZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFZERTQSBNUEN2MiByZWNvdmVyeTogdW5hYmxlIHRvIGRlY29kZSByZWR1Y2VkIGtleSBzaGFyZSBmcm9tIGtleWNhcmQgbWF0ZXJpYWwuIFRoZSBlbmNyeXB0ZWQga2V5IG1heSBiZSBjb3JydXB0ZWQsIG1hbGZvcm1lZCwgb3Igbm90IGFuIEVkRFNBIE1QQ3YyIHJlZHVjZWQga2V5LidcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcmVkdWNlZC5rZXlTaGFyZT8ubGVuZ3RoIHx8ICFyZWR1Y2VkLnB1Yj8ubGVuZ3RoIHx8ICFyZWR1Y2VkLnJvb3RDaGFpbkNvZGU/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRWREU0EgTVBDdjIgcmVjb3Zlcnk6IHJlZHVjZWQga2V5IHNoYXJlIGlzIG1pc3Npbmcga2V5U2hhcmUsIHB1Yiwgb3Igcm9vdENoYWluQ29kZS4gVGhpcyBrZXljYXJkIG1heSBiZSBwdWJsaWMtb25seSBhbmQgY2Fubm90IGJlIHVzZWQgZm9yIHJlY292ZXJ5LidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7IHJlZHVjZWQsIHZyZktleVNoYXJlOiBwYXJzZWQudnJmS2V5U2hhcmUgfTtcbiAgfTtcblxuICBjb25zdCBbdXNlckRlY29kZWQsIGJhY2t1cERlY29kZWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2RlY29kZUtleShlbmNyeXB0ZWRVc2VyS2V5KSwgZGVjb2RlS2V5KGVuY3J5cHRlZEJhY2t1cEtleSldKTtcbiAgY29uc3QgdXNlclJlZHVjZWQgPSB1c2VyRGVjb2RlZC5yZWR1Y2VkO1xuICBjb25zdCBiYWNrdXBSZWR1Y2VkID0gYmFja3VwRGVjb2RlZC5yZWR1Y2VkO1xuXG4gIGNvbnN0IHVzZXJQdWIgPSBCdWZmZXIuZnJvbSh1c2VyUmVkdWNlZC5wdWIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgYmFja3VwUHViID0gQnVmZmVyLmZyb20oYmFja3VwUmVkdWNlZC5wdWIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgaWYgKHVzZXJQdWIgIT09IGJhY2t1cFB1Yikge1xuICAgIHRocm93IG5ldyBFcnJvcignRWREU0EgTVBDdjIgcmVjb3Zlcnk6IHVzZXIgYW5kIGJhY2t1cCBwdWIga2V5cyBkbyBub3QgbWF0Y2gnKTtcbiAgfVxuXG4gIGNvbnN0IHVzZXJDaGFpbkNvZGUgPSBCdWZmZXIuZnJvbSh1c2VyUmVkdWNlZC5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbnN0IGJhY2t1cENoYWluQ29kZSA9IEJ1ZmZlci5mcm9tKGJhY2t1cFJlZHVjZWQucm9vdENoYWluQ29kZSkudG9TdHJpbmcoJ2hleCcpO1xuICBpZiAodXNlckNoYWluQ29kZSAhPT0gYmFja3VwQ2hhaW5Db2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogdXNlciBhbmQgYmFja3VwIHJvb3RDaGFpbkNvZGVzIGRvIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgY29uc3QgaGFzVXNlclZyZiA9IHVzZXJEZWNvZGVkLnZyZktleVNoYXJlICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IGhhc0JhY2t1cFZyZiA9IGJhY2t1cERlY29kZWQudnJmS2V5U2hhcmUgIT09IHVuZGVmaW5lZDtcbiAgaWYgKGhhc1VzZXJWcmYgIT09IGhhc0JhY2t1cFZyZikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdFZERTQSBNUEN2MiByZWNvdmVyeToga2V5c2hhcmUgZW52ZWxvcGVzIG11c3QgZWl0aGVyIGJvdGggY29udGFpbiBWUkYga2V5c2hhcmVzIG9yIGJvdGggb21pdCB0aGVtJ1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB1c2VyS2V5U2hhcmU6IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLmtleVNoYXJlKSxcbiAgICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyLmZyb20oYmFja3VwUmVkdWNlZC5rZXlTaGFyZSksXG4gICAgY29tbW9uS2V5Q2hhaW46IHVzZXJQdWIgKyB1c2VyQ2hhaW5Db2RlLFxuICAgIHVzZXJWcmZLZXlTaGFyZTogdXNlckRlY29kZWQudnJmS2V5U2hhcmUsXG4gICAgYmFja3VwVnJmS2V5U2hhcmU6IGJhY2t1cERlY29kZWQudnJmS2V5U2hhcmUsXG4gIH07XG59XG5cbi8qKlxuICogU2lnbiBhIG1lc3NhZ2UgZm9yIHJlY292ZXJ5IHVzaW5nIEVkRFNBIE1QQ3YyIChNUFMpIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXMuXG4gKlxuICogUnVucyB0aGUgTVBTIERTRyBwcm90b2NvbCBsb2NhbGx5IHRvIHJvdW5kIDMsIHRoZW4gdmVyaWZpZXMgdGhlIHJlc3VsdGluZ1xuICogRWQyNTUxOSBzaWduYXR1cmUgYWdhaW5zdCB0aGUgcHVibGljIGtleSBkZXJpdmVkIGZyb20gdGhlIGNvbW1vbiBrZXljaGFpbi5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSByYXcgYnl0ZXMgdG8gc2lnblxuICogQHBhcmFtIGRlcml2YXRpb25QYXRoIEJJUC0zMi1zdHlsZSBkZXJpdmF0aW9uIHBhdGgsIGUuZy4gYFwibS8wXCJgXG4gKiBAcGFyYW0gdXNlcktleVNoYXJlIG9wYXF1ZSBNUFMgc2lnbmluZyBrZXktc2hhcmUgYnl0ZXMgZm9yIHRoZSB1c2VyIHBhcnR5XG4gKiBAcGFyYW0gYmFja3VwS2V5U2hhcmUgb3BhcXVlIE1QUyBzaWduaW5nIGtleS1zaGFyZSBieXRlcyBmb3IgdGhlIGJhY2t1cCBwYXJ0eVxuICogQHBhcmFtIGNvbW1vbktleUNoYWluIDEyOC1oZXgtY2hhciBzdHJpbmc6IDMyLWJ5dGUgcHViICsgMzItYnl0ZSByb290Q2hhaW5Db2RlXG4gKiBAcmV0dXJucyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIEJ1ZmZlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnblJlY292ZXJ5RWRkc2FNUEN2MihcbiAgbWVzc2FnZTogQnVmZmVyLFxuICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcixcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcixcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZ1xuKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0coTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgY29uc3QgYmFja3VwRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG5cbiAgY29uc3Qgc2lnbmF0dXJlID0gKGF3YWl0IE1QU1V0aWwuZXhlY3V0ZVRpbGxSb3VuZChcbiAgICAzLFxuICAgIHVzZXJEc2csXG4gICAgYmFja3VwRHNnLFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBtZXNzYWdlLFxuICAgIGRlcml2YXRpb25QYXRoXG4gICkpIGFzIEJ1ZmZlcjtcblxuICAvLyBVc2UgRWRkc2EuZGVyaXZlVW5oYXJkZW5lZCAoQklQMzItRWQyNTUxOSksIHdoaWNoIG1hdGNoZXMgd2hhdCBEU0cgdXNlc1xuICAvLyBpbnRlcm5hbGx5IGZvciBwYXRoIGRlcml2YXRpb24gc2luY2Ugd2FzbS1tcHMgMS45LjAuXG4gIGNvbnN0IG1wYyA9IGF3YWl0IGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgY29uc3QgZGVyaXZlZEtleWNoYWluID0gbXBjLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Q2hhaW4sIGRlcml2YXRpb25QYXRoKTtcbiAgY29uc3QgcHVibGljS2V5Qnl0ZXMgPSBCdWZmZXIuZnJvbShkZXJpdmVkS2V5Y2hhaW4uc2xpY2UoMCwgNjQpLCAnaGV4Jyk7XG5cbiAgY29uc3QgdmVyaWZpZWQgPSBlZDI1NTE5LnZlcmlmeShuZXcgVWludDhBcnJheShzaWduYXR1cmUpLCBuZXcgVWludDhBcnJheShtZXNzYWdlKSwgbmV3IFVpbnQ4QXJyYXkocHVibGljS2V5Qnl0ZXMpKTtcbiAgaWYgKCF2ZXJpZmllZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRWREU0EgTVBDdjIgcmVjb3Zlcnkgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQnKTtcbiAgfVxuXG4gIHJldHVybiBzaWduYXR1cmU7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiByZXByZXNlbnRpbmcgRWREU0Egc2lnbmluZyBtYXRlcmlhbCBkZXRlY3RlZCBmcm9tIGEga2V5Y2FyZC5cbiAqIHYxOiBNUEN2MSBKU09OIGtleWNhcmQg4oCUIHVzZXJQcnYgaXMgdGhlIGRlY3J5cHRlZCBwbGFpbnRleHQuXG4gKiB2MjogTVBDdjIgQ0JPUiBrZXljYXJkIOKAlCBlbmNyeXB0ZWRVc2VyS2V5IGlzIHJldHVybmVkIGFzLWlzIGZvciBNUFMgRFNHLlxuICovXG5leHBvcnQgdHlwZSBFZGRzYVNpZ25pbmdNYXRlcmlhbCA9IHsgdmVyc2lvbjogJ3YxJzsgdXNlclBydjogc3RyaW5nIH0gfCB7IHZlcnNpb246ICd2Mic7IGVuY3J5cHRlZFVzZXJLZXk6IHN0cmluZyB9O1xuXG4vKipcbiAqIERldGVjdHMgTVBDdjEgdnMgTVBDdjIga2V5Y2FyZCBmb3JtYXQgYW5kIHJldHVybnMgdHlwZWQgc2lnbmluZyBtYXRlcmlhbC5cbiAqIEZvciB2MTogZGVjcnlwdHMgb25jZSBhbmQgcmV0dXJucyB0aGUgcGxhaW50ZXh0IGFzIHVzZXJQcnYuXG4gKiBGb3IgdjI6IHJldHVybnMgdGhlIGVuY3J5cHRlZCBrZXkgYXMtaXMgZm9yIHVzZSB3aXRoIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeC5cbiAqIFdoZW4gYml0Z28gaXMgb21pdHRlZCwgZmFsbHMgYmFjayB0byBzamNsICh2MSBvbmx5KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsKFxuICB1c2VyS2V5OiBzdHJpbmcsXG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8RWRkc2FTaWduaW5nTWF0ZXJpYWw+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgbGV0IGRlY3J5cHRlZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGRlY3J5cHRlZCA9IGJpdGdvXG4gICAgICA/IGF3YWl0IGJpdGdvLmRlY3J5cHQoeyBpbnB1dDogbm9ybWFsaXplZCwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSlcbiAgICAgIDogc2pjbC5kZWNyeXB0KHdhbGxldFBhc3NwaHJhc2UsIG5vcm1hbGl6ZWQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIHVzZXIga2V5Y2hhaW46ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpfWApO1xuICB9XG4gIGNvbnN0IHVzZXJQcnYgPSBwYXJzZUVkZHNhTXBjVjFNYXRlcmlhbChkZWNyeXB0ZWQpO1xuICByZXR1cm4gdXNlclBydiAhPT0gbnVsbCA/IHsgdmVyc2lvbjogJ3YxJywgdXNlclBydiB9IDogeyB2ZXJzaW9uOiAndjInLCBlbmNyeXB0ZWRVc2VyS2V5OiBub3JtYWxpemVkIH07XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB2YWxpZGF0aW5nIHRoYXQgYSB2YWx1ZSBoYXMgdGhlIHNoYXBlIG9mIEVkZHNhU2lnbmluZ01hdGVyaWFsLlxuICpcbiAqIENvaW4gYHJlY292ZXIoKWAgaW1wbGVtZW50YXRpb25zIGFjY2VwdCBhbiBvcHRpb25hbCBwcmVjb21wdXRlZCBzaWduaW5nLW1hdGVyaWFsXG4gKiBwYXJhbWV0ZXIgKHNldCBieSByZWNvdmVyQ29uc29saWRhdGlvbnMoKSB0byBhdm9pZCByZS1kZWNyeXB0aW5nIHRoZSBrZXljYXJkIHBlclxuICogc2Nhbm5lZCBpbmRleCkuIFNvbWUgY2FsbGVycyBwYXNzIGFuIHVucmVsYXRlZCBzZWNvbmQgcG9zaXRpb25hbCBhcmd1bWVudCB0b1xuICogcmVjb3ZlcigpIGZvciBvdGhlciBwdXJwb3NlcyAoZS5nLiBvcGVuU1NMQnl0ZXMgZm9yIEVWTS1saWtlIGNvaW5zKTsgdmFsaWRhdGluZ1xuICogdGhlIHNoYXBlIGhlcmUgcHJldmVudHMgdGhhdCBmcm9tIGJlaW5nIG1pc2ludGVycHJldGVkIGFzIHNpZ25pbmcgbWF0ZXJpYWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VkZHNhU2lnbmluZ01hdGVyaWFsKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRWRkc2FTaWduaW5nTWF0ZXJpYWwge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoISgndmVyc2lvbicgaW4gdmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh2YWx1ZS52ZXJzaW9uID09PSAndjEnKSB7XG4gICAgcmV0dXJuICd1c2VyUHJ2JyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudXNlclBydiA9PT0gJ3N0cmluZyc7XG4gIH1cbiAgaWYgKHZhbHVlLnZlcnNpb24gPT09ICd2MicpIHtcbiAgICByZXR1cm4gJ2VuY3J5cHRlZFVzZXJLZXknIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5lbmNyeXB0ZWRVc2VyS2V5ID09PSAnc3RyaW5nJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRnVsbCBNUEN2MiByZWNvdmVyeSBzaWduaW5nIGZsb3c6IGRlY3J5cHQga2V5IHNoYXJlcyDihpIgdmFsaWRhdGUgY29tbW9uS2V5Q2hhaW4g4oaSIE1QUyBEU0cuXG4gKiBSZXR1cm5zIHJhdyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIEJ1ZmZlci5cbiAqIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYW55IGNvaW4tc3BlY2lmaWMgZW52ZWxvcGVcbiAqIChlLmcuIDB4MDAgU3Vic3RyYXRlIHByZWZpeCwgU1VJIGZsYWcrcHVia2V5IHdyYXBwZXIsIG9yIHJhdyBmb3IgTkVBUi9BREEvVE9OKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeChwYXJhbXM6IHtcbiAgbWVzc2FnZTogQnVmZmVyO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gIGJpdGdvS2V5OiBzdHJpbmc7XG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG4gIGJpdGdvPzogQml0R29CYXNlO1xufSk6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHsgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW4gfSA9IGF3YWl0IGdldEVkZHNhTXBjVjJSZWNvdmVyeUtleVNoYXJlc0Zyb21SZWR1Y2VkS2V5KFxuICAgIHBhcmFtcy51c2VyS2V5LFxuICAgIHBhcmFtcy5iYWNrdXBLZXksXG4gICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgcGFyYW1zLmJpdGdvXG4gICk7XG4gIGlmIChjb21tb25LZXlDaGFpbi50b0xvd2VyQ2FzZSgpICE9PSBwYXJhbXMuYml0Z29LZXkudG9Mb3dlckNhc2UoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRWREU0EgTVBDdjIgcmVjb3Zlcnk6IGNvbW1vbktleUNoYWluIGZyb20ga2V5Y2FyZCBkb2VzIG5vdCBtYXRjaCBiaXRnb0tleScpO1xuICB9XG4gIHJldHVybiBzaWduUmVjb3ZlcnlFZGRzYU1QQ3YyKHBhcmFtcy5tZXNzYWdlLCBwYXJhbXMuZGVyaXZhdGlvblBhdGgsIHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIGNvbW1vbktleUNoYWluKTtcbn1cblxuZXhwb3J0IGNvbnN0IEVkZHNhTVBDdjJSZWNvdmVyeUZ1bmN0aW9ucyA9IHtcbiAgaXNFZGRzYU1wY1YxU2lnbmluZ01hdGVyaWFsLFxuICBnZXRFZGRzYU1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleSxcbiAgc2lnblJlY292ZXJ5RWRkc2FNUEN2MixcbiAgZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIGlzRWRkc2FTaWduaW5nTWF0ZXJpYWwsXG4gIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeCxcbn07XG4iXX0=