@bitgo-beta/sdk-core 8.2.1-beta.175 → 8.2.1-beta.1750

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 (628) 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 +41 -29
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +41 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +72 -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.js +23 -9
  49. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  50. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  51. package/dist/src/account-lib/mpc/index.js +6 -2
  52. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
  53. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
  55. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  56. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  57. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  59. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
  60. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  62. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  63. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  65. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  66. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  67. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  69. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  70. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  71. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  72. package/dist/src/account-lib/mpc/util.js +24 -1
  73. package/dist/src/account-lib/staking/index.js +6 -2
  74. package/dist/src/account-lib/staking/utils.js +3 -3
  75. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  76. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  77. package/dist/src/account-lib/util/crypto.js +69 -38
  78. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
  79. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  80. package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
  81. package/dist/src/api/bip32path.js +2 -3
  82. package/dist/src/api/index.js +6 -2
  83. package/dist/src/api/types.d.ts +20 -0
  84. package/dist/src/api/types.d.ts.map +1 -1
  85. package/dist/src/api/types.js +1 -1
  86. package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
  87. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  88. package/dist/src/bitgo/address-book/address-book.js +139 -0
  89. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  90. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  91. package/dist/src/bitgo/address-book/index.js +19 -0
  92. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  93. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  94. package/dist/src/bitgo/address-book/types.js +3 -0
  95. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +97 -11
  96. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  97. package/dist/src/bitgo/baseCoin/baseCoin.js +152 -16
  98. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +181 -28
  99. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  100. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  101. package/dist/src/bitgo/baseCoin/index.js +6 -2
  102. package/dist/src/bitgo/bip32util.d.ts +3 -16
  103. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  104. package/dist/src/bitgo/bip32util.js +4 -56
  105. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  106. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  107. package/dist/src/bitgo/bitcoin.js +26 -13
  108. package/dist/src/bitgo/bitgoBase.d.ts +7 -1
  109. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  110. package/dist/src/bitgo/bitgoBase.js +1 -1
  111. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  112. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  113. package/dist/src/bitgo/coinFactory.js +26 -3
  114. package/dist/src/bitgo/config.d.ts +3 -95
  115. package/dist/src/bitgo/config.d.ts.map +1 -1
  116. package/dist/src/bitgo/config.js +26 -15
  117. package/dist/src/bitgo/ecdh.d.ts +0 -1
  118. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  119. package/dist/src/bitgo/ecdh.js +26 -13
  120. package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -13
  121. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  122. package/dist/src/bitgo/enterprise/enterprise.js +39 -34
  123. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  124. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -6
  125. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  126. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  127. package/dist/src/bitgo/enterprise/index.js +6 -2
  128. package/dist/src/bitgo/environments.d.ts +68 -5
  129. package/dist/src/bitgo/environments.d.ts.map +1 -1
  130. package/dist/src/bitgo/environments.js +389 -40
  131. package/dist/src/bitgo/errors.d.ts +175 -0
  132. package/dist/src/bitgo/errors.d.ts.map +1 -1
  133. package/dist/src/bitgo/errors.js +166 -2
  134. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  135. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  136. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  137. package/dist/src/bitgo/index.d.ts +3 -1
  138. package/dist/src/bitgo/index.d.ts.map +1 -1
  139. package/dist/src/bitgo/index.js +29 -11
  140. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  141. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  142. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  143. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  144. package/dist/src/bitgo/internal/index.js +6 -2
  145. package/dist/src/bitgo/internal/internal.js +5 -6
  146. package/dist/src/bitgo/internal/keycard.js +6 -7
  147. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +24 -0
  148. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  149. package/dist/src/bitgo/keychain/decryptKeychain.js +67 -0
  150. package/dist/src/bitgo/keychain/iKeychains.d.ts +87 -8
  151. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  152. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  153. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  154. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  155. package/dist/src/bitgo/keychain/index.js +7 -2
  156. package/dist/src/bitgo/keychain/keychains.d.ts +29 -4
  157. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  158. package/dist/src/bitgo/keychain/keychains.js +182 -43
  159. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  160. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  161. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  162. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  163. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  164. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  165. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  166. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  167. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  168. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  169. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  170. package/dist/src/bitgo/market/index.js +6 -2
  171. package/dist/src/bitgo/market/markets.js +23 -9
  172. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
  173. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  174. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  175. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  176. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  177. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  178. package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
  179. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  180. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  181. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  182. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  183. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  184. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  185. package/dist/src/bitgo/proofs/index.js +6 -0
  186. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  187. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  188. package/dist/src/bitgo/proofs/types.js +80 -0
  189. package/dist/src/bitgo/recovery/index.js +6 -2
  190. package/dist/src/bitgo/recovery/initiate.d.ts +8 -1
  191. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  192. package/dist/src/bitgo/recovery/initiate.js +14 -8
  193. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +132 -0
  194. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  195. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  196. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  197. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  198. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  199. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  200. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  201. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  202. package/dist/src/bitgo/staking/iStakingWallet.d.ts +173 -7
  203. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  204. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  205. package/dist/src/bitgo/staking/index.d.ts +3 -0
  206. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  207. package/dist/src/bitgo/staking/index.js +9 -2
  208. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  209. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  210. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  211. package/dist/src/bitgo/trading/iTradingAccount.d.ts +14 -33
  212. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  213. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  214. package/dist/src/bitgo/trading/index.d.ts +1 -15
  215. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  216. package/dist/src/bitgo/trading/index.js +7 -17
  217. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  218. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  219. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  220. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  221. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  222. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  223. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  224. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  225. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  226. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  227. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  228. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  229. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  230. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  231. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  232. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  233. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  234. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  235. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  236. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  237. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  238. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  239. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  240. package/dist/src/bitgo/trading/network/index.js +21 -0
  241. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  242. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  243. package/dist/src/bitgo/trading/network/network.js +99 -0
  244. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  245. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  246. package/dist/src/bitgo/trading/network/types.js +3 -0
  247. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  248. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  249. package/dist/src/bitgo/trading/network/utils.js +54 -0
  250. package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -33
  251. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  252. package/dist/src/bitgo/trading/tradingAccount.js +56 -97
  253. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
  254. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  255. package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
  256. package/dist/src/bitgo/tss/common.d.ts +39 -6
  257. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  258. package/dist/src/bitgo/tss/common.js +112 -17
  259. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  260. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  261. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  262. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  263. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  264. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  265. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  266. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  267. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  268. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  269. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  270. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  271. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  272. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  273. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  274. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
  275. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  276. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
  277. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  278. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  279. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  280. package/dist/src/bitgo/tss/index.d.ts +3 -2
  281. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  282. package/dist/src/bitgo/tss/index.js +26 -10
  283. package/dist/src/bitgo/tss/types.d.ts +3 -3
  284. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  285. package/dist/src/bitgo/tss/types.js +2 -2
  286. package/dist/src/bitgo/types.d.ts +3 -3
  287. package/dist/src/bitgo/types.d.ts.map +1 -1
  288. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
  289. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  290. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
  291. package/dist/src/bitgo/utils/codecProps.js +24 -11
  292. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  293. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  294. package/dist/src/bitgo/utils/codecs.js +59 -0
  295. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  296. package/dist/src/bitgo/utils/decode.js +30 -16
  297. package/dist/src/bitgo/utils/index.d.ts +4 -2
  298. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  299. package/dist/src/bitgo/utils/index.js +27 -11
  300. package/dist/src/bitgo/utils/messageTypes.d.ts +38 -0
  301. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  302. package/dist/src/bitgo/utils/messageTypes.js +15 -0
  303. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  304. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  305. package/dist/src/bitgo/utils/mpcUtils.js +82 -14
  306. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  307. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  308. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  309. package/dist/src/bitgo/utils/opengpgUtils.d.ts +12 -9
  310. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  311. package/dist/src/bitgo/utils/opengpgUtils.js +77 -64
  312. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  313. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  314. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  315. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  316. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  317. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  318. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  319. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  320. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  321. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  322. package/dist/src/bitgo/utils/triple.js +2 -3
  323. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +37 -0
  324. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  325. package/dist/src/bitgo/utils/tss/addressVerification.js +75 -0
  326. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +59 -17
  327. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  328. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +219 -45
  329. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +335 -44
  330. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  331. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  332. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  333. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  334. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  335. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  336. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  337. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  338. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +21 -51
  339. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  340. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +149 -240
  341. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +213 -0
  342. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  343. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1048 -0
  344. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  345. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  346. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
  347. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  348. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  349. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  350. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  351. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  352. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  353. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  354. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  355. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  356. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  357. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  358. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  359. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +28 -11
  360. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  361. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +208 -103
  362. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +52 -0
  363. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  364. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +350 -0
  365. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  366. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  367. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
  368. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +3 -0
  369. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  370. package/dist/src/bitgo/utils/tss/eddsa/index.js +28 -8
  371. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +7 -7
  372. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  373. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  374. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  375. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  376. package/dist/src/bitgo/utils/tss/index.d.ts +1 -0
  377. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  378. package/dist/src/bitgo/utils/tss/index.js +24 -9
  379. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  380. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  381. package/dist/src/bitgo/utils/txRequest.js +49 -0
  382. package/dist/src/bitgo/utils/util.js +24 -10
  383. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  384. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  385. package/dist/src/bitgo/utils/wallet.js +48 -0
  386. package/dist/src/bitgo/wallet/BuildParams.d.ts +47 -1
  387. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  388. package/dist/src/bitgo/wallet/BuildParams.js +55 -11
  389. package/dist/src/bitgo/wallet/iWallet.d.ts +446 -21
  390. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  391. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  392. package/dist/src/bitgo/wallet/iWallets.d.ts +145 -19
  393. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  394. package/dist/src/bitgo/wallet/iWallets.js +63 -3
  395. package/dist/src/bitgo/wallet/index.js +6 -2
  396. package/dist/src/bitgo/wallet/wallet.d.ts +336 -23
  397. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  398. package/dist/src/bitgo/wallet/wallet.js +1678 -347
  399. package/dist/src/bitgo/wallet/wallets.d.ts +100 -9
  400. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  401. package/dist/src/bitgo/wallet/wallets.js +1040 -203
  402. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  403. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  404. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  405. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  406. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  407. package/dist/src/bitgo/walletUtil/index.js +19 -0
  408. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  409. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  410. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  411. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  412. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  413. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  414. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  415. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  416. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  417. package/dist/src/bitgo/webhook/index.js +6 -2
  418. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  419. package/dist/src/coins/fiat.d.ts +45 -0
  420. package/dist/src/coins/fiat.d.ts.map +1 -0
  421. package/dist/src/coins/fiat.js +94 -0
  422. package/dist/src/coins/index.d.ts +1 -6
  423. package/dist/src/coins/index.d.ts.map +1 -1
  424. package/dist/src/coins/index.js +7 -8
  425. package/dist/src/coins/ofc.d.ts +3 -2
  426. package/dist/src/coins/ofc.d.ts.map +1 -1
  427. package/dist/src/coins/ofc.js +6 -2
  428. package/dist/src/coins/ofcToken.d.ts +2 -1
  429. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  430. package/dist/src/coins/ofcToken.js +27 -2
  431. package/dist/src/coins/susd.d.ts +3 -2
  432. package/dist/src/coins/susd.d.ts.map +1 -1
  433. package/dist/src/coins/susd.js +5 -1
  434. package/dist/src/common.js +27 -13
  435. package/dist/src/index.d.ts +6 -1
  436. package/dist/src/index.d.ts.map +1 -1
  437. package/dist/src/index.js +32 -11
  438. package/dist/src/lightning.d.ts +2 -0
  439. package/dist/src/lightning.d.ts.map +1 -0
  440. package/dist/src/lightning.js +13 -0
  441. package/dist/src/units.js +5 -6
  442. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  443. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  444. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  445. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  446. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  447. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  448. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  449. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  450. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  451. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  452. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  453. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  454. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  455. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  456. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  457. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  458. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  459. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  460. package/dist/test/unit/bitgo/environment.js +38 -0
  461. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  462. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  463. package/dist/test/unit/bitgo/errors.js +262 -0
  464. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  465. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  466. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  467. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  468. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  469. package/dist/test/unit/bitgo/trading/tradingAccount.js +183 -0
  470. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
  471. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  472. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  473. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  474. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  475. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  476. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  477. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  478. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  479. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  480. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +85 -0
  481. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  482. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  483. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +465 -0
  484. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  485. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  486. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  487. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  488. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  489. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +239 -0
  490. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  491. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  492. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  493. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  494. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  495. package/dist/test/unit/bitgo/wallet/BuildParams.js +68 -0
  496. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
  497. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  498. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  499. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  500. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  501. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  502. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  503. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  504. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  505. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +62 -0
  506. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  507. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  508. package/dist/test/unit/bitgo/wallet/resourceManagement.js +326 -0
  509. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  510. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  511. package/dist/test/unit/bitgo/wallet/tokenApproval.js +135 -0
  512. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  513. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  514. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  515. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  516. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  517. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  518. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  519. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  520. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +276 -0
  521. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  522. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  523. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  524. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  525. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  526. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +200 -0
  527. package/dist/test/unit/lightning.d.ts +2 -0
  528. package/dist/test/unit/lightning.d.ts.map +1 -0
  529. package/dist/test/unit/lightning.js +23 -0
  530. package/dist/test/unit/units.d.ts.map +1 -1
  531. package/dist/test/unit/units.js +64 -64
  532. package/dist/tsconfig.tsbuildinfo +1 -1
  533. package/package.json +24 -21
  534. package/.eslintignore +0 -5
  535. package/CHANGELOG.md +0 -1367
  536. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  537. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  538. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  539. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  540. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  541. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  542. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  543. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  544. package/dist/src/bitgo/lightning/index.js +0 -17
  545. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  546. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  547. package/dist/src/bitgo/lightning/lightning.js +0 -111
  548. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  549. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  550. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  551. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  552. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  553. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  554. package/dist/src/bitgo/trading/affirmation.d.ts +0 -35
  555. package/dist/src/bitgo/trading/affirmation.d.ts.map +0 -1
  556. package/dist/src/bitgo/trading/affirmation.js +0 -53
  557. package/dist/src/bitgo/trading/affirmations.d.ts +0 -23
  558. package/dist/src/bitgo/trading/affirmations.d.ts.map +0 -1
  559. package/dist/src/bitgo/trading/affirmations.js +0 -45
  560. package/dist/src/bitgo/trading/iAffirmation.d.ts +0 -15
  561. package/dist/src/bitgo/trading/iAffirmation.d.ts.map +0 -1
  562. package/dist/src/bitgo/trading/iAffirmation.js +0 -13
  563. package/dist/src/bitgo/trading/iAffirmations.d.ts +0 -10
  564. package/dist/src/bitgo/trading/iAffirmations.d.ts.map +0 -1
  565. package/dist/src/bitgo/trading/iAffirmations.js +0 -3
  566. package/dist/src/bitgo/trading/iSettlement.d.ts +0 -25
  567. package/dist/src/bitgo/trading/iSettlement.d.ts.map +0 -1
  568. package/dist/src/bitgo/trading/iSettlement.js +0 -17
  569. package/dist/src/bitgo/trading/iSettlements.d.ts +0 -19
  570. package/dist/src/bitgo/trading/iSettlements.d.ts.map +0 -1
  571. package/dist/src/bitgo/trading/iSettlements.js +0 -3
  572. package/dist/src/bitgo/trading/iTradingPartner.d.ts +0 -14
  573. package/dist/src/bitgo/trading/iTradingPartner.d.ts.map +0 -1
  574. package/dist/src/bitgo/trading/iTradingPartner.js +0 -17
  575. package/dist/src/bitgo/trading/iTradingPartners.d.ts +0 -15
  576. package/dist/src/bitgo/trading/iTradingPartners.d.ts.map +0 -1
  577. package/dist/src/bitgo/trading/iTradingPartners.js +0 -9
  578. package/dist/src/bitgo/trading/lock.d.ts +0 -16
  579. package/dist/src/bitgo/trading/lock.d.ts.map +0 -1
  580. package/dist/src/bitgo/trading/lock.js +0 -12
  581. package/dist/src/bitgo/trading/payload.d.ts +0 -22
  582. package/dist/src/bitgo/trading/payload.d.ts.map +0 -1
  583. package/dist/src/bitgo/trading/payload.js +0 -3
  584. package/dist/src/bitgo/trading/settlement.d.ts +0 -16
  585. package/dist/src/bitgo/trading/settlement.d.ts.map +0 -1
  586. package/dist/src/bitgo/trading/settlement.js +0 -21
  587. package/dist/src/bitgo/trading/settlements.d.ts +0 -32
  588. package/dist/src/bitgo/trading/settlements.d.ts.map +0 -1
  589. package/dist/src/bitgo/trading/settlements.js +0 -61
  590. package/dist/src/bitgo/trading/trade.d.ts +0 -29
  591. package/dist/src/bitgo/trading/trade.d.ts.map +0 -1
  592. package/dist/src/bitgo/trading/trade.js +0 -11
  593. package/dist/src/bitgo/trading/tradingPartner.d.ts +0 -26
  594. package/dist/src/bitgo/trading/tradingPartner.d.ts.map +0 -1
  595. package/dist/src/bitgo/trading/tradingPartner.js +0 -31
  596. package/dist/src/bitgo/trading/tradingPartners.d.ts +0 -24
  597. package/dist/src/bitgo/trading/tradingPartners.d.ts.map +0 -1
  598. package/dist/src/bitgo/trading/tradingPartners.js +0 -32
  599. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  600. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  601. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  602. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  603. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  604. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  605. package/dist/src/coins/fiateur.d.ts +0 -31
  606. package/dist/src/coins/fiateur.d.ts.map +0 -1
  607. package/dist/src/coins/fiateur.js +0 -57
  608. package/dist/src/coins/fiatgbp.d.ts +0 -31
  609. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  610. package/dist/src/coins/fiatgbp.js +0 -57
  611. package/dist/src/coins/fiatusd.d.ts +0 -31
  612. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  613. package/dist/src/coins/fiatusd.js +0 -57
  614. package/dist/src/coins/tfiateur.d.ts +0 -11
  615. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  616. package/dist/src/coins/tfiateur.js +0 -17
  617. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  618. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  619. package/dist/src/coins/tfiatgbp.js +0 -17
  620. package/dist/src/coins/tfiatusd.d.ts +0 -11
  621. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  622. package/dist/src/coins/tfiatusd.js +0 -17
  623. package/dist/src/openssl/index.d.ts +0 -5
  624. package/dist/src/openssl/index.d.ts.map +0 -1
  625. package/dist/src/openssl/index.js +0 -9
  626. package/dist/test/unit/openssl.d.ts +0 -2
  627. package/dist/test/unit/openssl.d.ts.map +0 -1
  628. package/dist/test/unit/openssl.js +0 -39
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[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);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -11,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
11
15
  }) : function(o, v) {
12
16
  o["default"] = v;
13
17
  });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
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
+ })();
21
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
22
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
37
  };
@@ -26,34 +40,38 @@ exports.Wallet = exports.ManageUnspentsOptions = void 0;
26
40
  /**
27
41
  * @prettier
28
42
  */
43
+ const public_types_1 = require("@bitgo/public-types");
44
+ const statics_1 = require("@bitgo-beta/statics");
29
45
  const assert_1 = __importDefault(require("assert"));
30
- const bignumber_js_1 = require("bignumber.js");
46
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
47
+ const t = __importStar(require("io-ts"));
31
48
  const _ = __importStar(require("lodash"));
32
49
  const common = __importStar(require("../../common"));
50
+ const address_book_1 = require("../address-book");
33
51
  const bitcoin_1 = require("../bitcoin");
34
52
  const ecdh_1 = require("../ecdh");
35
53
  const errors_1 = require("../errors");
54
+ const internal_1 = require("../internal");
36
55
  const internal = __importStar(require("../internal/internal"));
37
- const keycard_1 = require("../internal/keycard");
56
+ const keychain_1 = require("../keychain");
57
+ const lightningWalletUtil_1 = require("../lightning/lightningWalletUtil");
38
58
  const pendingApproval_1 = require("../pendingApproval");
39
- const tradingAccount_1 = require("../trading/tradingAccount");
59
+ const staking_1 = require("../staking");
60
+ const trading_1 = require("../trading");
61
+ const tss_1 = require("../tss");
40
62
  const utils_1 = require("../utils");
41
- const stakingWallet_1 = require("../staking/stakingWallet");
42
- const lightning_1 = require("../lightning");
43
- const eddsa_1 = __importDefault(require("../utils/tss/eddsa"));
63
+ const postWithCodec_1 = require("../utils/postWithCodec");
44
64
  const ecdsa_1 = require("../utils/tss/ecdsa");
45
- const tss_1 = require("../tss");
46
- const statics_1 = require("@bitgo-beta/statics");
65
+ const eddsa_1 = __importStar(require("../utils/tss/eddsa"));
66
+ const txRequest_1 = require("../utils/txRequest");
47
67
  const BuildParams_1 = require("./BuildParams");
48
- const postWithCodec_1 = require("../utils/postWithCodec");
49
- const public_types_1 = require("@bitgo/public-types");
50
68
  const debug = require('debug')('bitgo:v2:wallet');
51
69
  const whitelistedSendParams = public_types_1.TxSendBody.type.types.flatMap((t) => Object.keys(t.props));
52
70
  var ManageUnspentsOptions;
53
71
  (function (ManageUnspentsOptions) {
54
72
  ManageUnspentsOptions[ManageUnspentsOptions["BUILD_ONLY"] = 0] = "BUILD_ONLY";
55
73
  ManageUnspentsOptions[ManageUnspentsOptions["BUILD_SIGN_SEND"] = 1] = "BUILD_SIGN_SEND";
56
- })(ManageUnspentsOptions = exports.ManageUnspentsOptions || (exports.ManageUnspentsOptions = {}));
74
+ })(ManageUnspentsOptions || (exports.ManageUnspentsOptions = ManageUnspentsOptions = {}));
57
75
  function isPrebuildTransactionResult(prebuildTx) {
58
76
  if (!prebuildTx || typeof prebuildTx === 'string') {
59
77
  return false;
@@ -70,13 +88,23 @@ class Wallet {
70
88
  const userDetails = _.find(walletData.users, { user: userId });
71
89
  this._permissions = _.get(userDetails, 'permissions');
72
90
  }
73
- if ((baseCoin === null || baseCoin === void 0 ? void 0 : baseCoin.supportsTss()) && this._wallet.multisigType === 'tss') {
91
+ if (baseCoin?.supportsTss() && this._wallet.multisigType === 'tss') {
74
92
  switch (baseCoin.getMPCAlgorithm()) {
75
93
  case 'ecdsa':
76
- this.tssUtils = new ecdsa_1.EcdsaUtils(bitgo, baseCoin, this);
94
+ if (walletData.multisigTypeVersion === 'MPCv2') {
95
+ this.tssUtils = new ecdsa_1.EcdsaMPCv2Utils(bitgo, baseCoin, this);
96
+ }
97
+ else {
98
+ this.tssUtils = new ecdsa_1.EcdsaUtils(bitgo, baseCoin, this);
99
+ }
77
100
  break;
78
101
  case 'eddsa':
79
- this.tssUtils = new eddsa_1.default(bitgo, baseCoin, this);
102
+ if (walletData.multisigTypeVersion === 'MPCv2') {
103
+ this.tssUtils = new eddsa_1.EddsaMPCv2Utils(bitgo, baseCoin, this);
104
+ }
105
+ else {
106
+ this.tssUtils = new eddsa_1.default(bitgo, baseCoin, this);
107
+ }
80
108
  break;
81
109
  default:
82
110
  this.tssUtils = undefined;
@@ -118,6 +146,8 @@ class Wallet {
118
146
  prebuildConsolidateAccountParams() {
119
147
  return [
120
148
  'consolidateAddresses',
149
+ 'nftCollectionId',
150
+ 'nftId',
121
151
  'feeRate',
122
152
  'maxFeeRate',
123
153
  'memo',
@@ -125,6 +155,7 @@ class Wallet {
125
155
  'validToBlock',
126
156
  'preview',
127
157
  'keepAlive',
158
+ 'apiVersion',
128
159
  ];
129
160
  }
130
161
  /**
@@ -170,11 +201,14 @@ class Wallet {
170
201
  return this._wallet.coin;
171
202
  }
172
203
  type() {
173
- return this._wallet.type;
204
+ return this._wallet.type || 'hot';
174
205
  }
175
206
  multisigType() {
176
207
  return this._wallet.multisigType;
177
208
  }
209
+ multisigTypeVersion() {
210
+ return this._wallet.multisigTypeVersion;
211
+ }
178
212
  subType() {
179
213
  return this._wallet.subType;
180
214
  }
@@ -184,6 +218,12 @@ class Wallet {
184
218
  label() {
185
219
  return this._wallet.label;
186
220
  }
221
+ flags() {
222
+ return this._wallet.walletFlags ?? [];
223
+ }
224
+ flag(name) {
225
+ return this.flags().find((flag) => flag.name === name)?.value;
226
+ }
187
227
  /**
188
228
  * Get the public object ids for the keychains on this wallet.
189
229
  */
@@ -194,7 +234,7 @@ class Wallet {
194
234
  * Get a receive address for this wallet
195
235
  */
196
236
  receiveAddress() {
197
- return this._wallet.receiveAddress.address;
237
+ return this._wallet.receiveAddress?.address;
198
238
  }
199
239
  /**
200
240
  * Get the wallet id of the wallet that this wallet was migrated from.
@@ -262,6 +302,43 @@ class Wallet {
262
302
  .query(query)
263
303
  .result();
264
304
  }
305
+ /**
306
+ * Return a list of nft tokens for this wallet. Will always return undefined if the wallet
307
+ * was not initialized with the allTokens flag.
308
+ *
309
+ * @returns {NftBalance[] | undefined}
310
+ */
311
+ nftBalances() {
312
+ if (this._wallet.nfts) {
313
+ return Object.values(this._wallet.nfts).map((nftData) => nftData);
314
+ }
315
+ return undefined;
316
+ }
317
+ /**
318
+ * Return a list of unsupported nft tokens for this wallet. Will always return undefined if the wallet
319
+ * was not initialized with the allTokens flag.
320
+ *
321
+ * @returns {NftBalance[] | undefined}
322
+ */
323
+ unsupportedNftBalances() {
324
+ if (this._wallet.unsupportedNfts) {
325
+ return Object.values(this._wallet.unsupportedNfts).map((nftData) => nftData);
326
+ }
327
+ return undefined;
328
+ }
329
+ /**
330
+ * Returns a list of the wallets nft & unsupported nfts.
331
+ *
332
+ * @returns {NftBalance[]}
333
+ */
334
+ async getNftBalances() {
335
+ const walletData = await this.bitgo.get(this.url()).query({ allTokens: true }).result();
336
+ const supportedNfts = walletData?.nfts ? Object.values(walletData.nfts).map((balance) => balance) : [];
337
+ const unsupportedNfts = walletData?.unsupportedNfts
338
+ ? Object.values(walletData.unsupportedNfts).map((balance) => balance)
339
+ : [];
340
+ return [...supportedNfts, ...unsupportedNfts];
341
+ }
265
342
  /**
266
343
  * List the transactions for a given wallet
267
344
  * @param params
@@ -270,18 +347,22 @@ class Wallet {
270
347
  */
271
348
  async getTransaction(params = {}) {
272
349
  common.validateParams(params, ['txHash'], []);
273
- const query = {};
350
+ const paginatedOptions = {};
274
351
  if (!_.isUndefined(params.prevId)) {
275
352
  if (!_.isString(params.prevId)) {
276
353
  throw new Error('invalid prevId argument, expecting string');
277
354
  }
278
- query.prevId = params.prevId;
355
+ paginatedOptions.prevId = params.prevId;
279
356
  }
280
357
  if (!_.isUndefined(params.limit)) {
281
358
  if (!_.isInteger(params.limit) || params.limit < 1) {
282
359
  throw new Error('invalid limit argument, expecting positive integer');
283
360
  }
284
- query.limit = params.limit;
361
+ paginatedOptions.limit = params.limit;
362
+ }
363
+ const query = paginatedOptions;
364
+ if (params.includeRbf) {
365
+ query['includeRbf'] = params.includeRbf;
285
366
  }
286
367
  return await this.bitgo
287
368
  .get(this.url('/tx/' + params.txHash))
@@ -381,6 +462,12 @@ class Wallet {
381
462
  }
382
463
  query.type = params.type;
383
464
  }
465
+ if (!_.isNil(params.decorateUtxoSpecificFields)) {
466
+ if (!_.isBoolean(params.decorateUtxoSpecificFields)) {
467
+ throw new Error('invalid includeHex argument, expecting boolean');
468
+ }
469
+ query.decorateUtxoSpecificFields = params.decorateUtxoSpecificFields;
470
+ }
384
471
  return await this.bitgo.get(this.url('/transfer')).query(query).result();
385
472
  }
386
473
  /**
@@ -447,6 +534,7 @@ class Wallet {
447
534
  'prevId',
448
535
  'segwit',
449
536
  'target',
537
+ 'unspentIds',
450
538
  ]);
451
539
  return this.bitgo.get(this.url('/unspents')).query(query).result();
452
540
  }
@@ -482,8 +570,15 @@ class Wallet {
482
570
  * with each transaction composed of 200 unspents, except for the last transaction which may have fewer unspents.
483
571
  */
484
572
  async manageUnspents(routeName, params = {}, option = ManageUnspentsOptions.BUILD_SIGN_SEND) {
573
+ if (this._wallet.type === 'custodial' && routeName === 'consolidate') {
574
+ return this.initiateTransaction({ ...params, type: 'consolidate' });
575
+ }
576
+ else if (this._wallet.type === 'custodial' && routeName === 'fanout') {
577
+ return this.initiateTransaction({ ...params, type: 'fanout' });
578
+ }
485
579
  common.validateParams(params, [], ['walletPassphrase', 'xprv']);
486
580
  const reqId = new utils_1.RequestTracer();
581
+ const fanoutInputFormat = params.maxNumInputsToUse ? 'maxNumInputsToUse' : 'unspents';
487
582
  const filteredParams = _.pick(params, [
488
583
  'feeRate',
489
584
  'maxFeeRate',
@@ -497,7 +592,7 @@ class Wallet {
497
592
  'targetAddress',
498
593
  'txFormat',
499
594
  'bulk',
500
- routeName === 'consolidate' ? 'limit' : 'maxNumInputsToUse',
595
+ routeName === 'consolidate' ? 'limit' : fanoutInputFormat,
501
596
  'numUnspentsToMake',
502
597
  ]);
503
598
  this.bitgo.setRequestTracer(reqId);
@@ -511,24 +606,75 @@ class Wallet {
511
606
  const keychains = (await this.baseCoin
512
607
  .keychains()
513
608
  .getKeysForSigning({ wallet: this, reqId }));
609
+ // Validate that the platform-built transaction matches user parameters
610
+ const txPrebuilds = Array.isArray(buildResponse) ? buildResponse : [buildResponse];
611
+ await Promise.all(txPrebuilds.map((txPrebuild) => this.baseCoin.verifyTransaction({
612
+ txParams: params,
613
+ txPrebuild,
614
+ wallet: this,
615
+ verification: {
616
+ ...(params.verification ?? {}),
617
+ keychains: {
618
+ user: keychains[0],
619
+ backup: keychains[1],
620
+ bitgo: keychains[2],
621
+ },
622
+ },
623
+ reqId,
624
+ })));
514
625
  const transactionParams = {
515
626
  ...params,
516
627
  keychain: keychains[0],
517
628
  pubs: keychains.map((k) => {
518
- assert_1.default(k.pub);
629
+ (0, assert_1.default)(k.pub);
519
630
  return k.pub;
520
631
  }),
632
+ // Building PSBTs with the bulk flag does not include the previous transaction for non-segwit inputs.
633
+ // Manually override the signing and validating to not fail.
634
+ allowNonSegwitSigningWithoutPrevTx: !!params.bulk,
521
635
  };
522
- const txPrebuilds = Array.isArray(buildResponse) ? buildResponse : [buildResponse];
523
636
  const selectParams = _.pick(params, ['comment', 'otp', 'bulk']);
524
637
  const response = await Promise.all(txPrebuilds.map(async (txPrebuild) => {
525
- const signedTransaction = await this.signTransaction({ ...transactionParams, txPrebuild });
526
- const finalTxParams = _.extend({}, signedTransaction, selectParams, { type: routeName });
638
+ const signedTransaction = await this.signTransaction({
639
+ ...transactionParams,
640
+ txPrebuild,
641
+ });
642
+ const finalTxParams = _.extend({}, signedTransaction, selectParams, {
643
+ type: routeName,
644
+ });
527
645
  this.bitgo.setRequestTracer(reqId);
528
- return this.sendTransaction(finalTxParams);
646
+ return this.sendTransaction(finalTxParams, reqId);
529
647
  }));
530
648
  return Array.isArray(buildResponse) ? response : response[0];
531
649
  }
650
+ /**
651
+ * Manage the unspent reservations on the wallet
652
+ *
653
+ * @param params.create - create a new reservation
654
+ * @param params.modify - modify an existing reservation
655
+ * @param params.delete - delete an existing reservation
656
+ */
657
+ async manageUnspentReservations(params) {
658
+ const filteredParams = _.pick(params, ['create', 'modify', 'delete']);
659
+ this.bitgo.setRequestTracer(new utils_1.RequestTracer());
660
+ // The URL cannot contain the coinName, so we remove it from the URL
661
+ const url = this.url(`/reservedunspents`).replace(`/${this.baseCoin.getChain()}`, '');
662
+ if (filteredParams.create) {
663
+ const filteredCreateParams = _.pick(params.create, ['unspentIds', 'expireTime']);
664
+ return this.bitgo.post(url).send(filteredCreateParams).result();
665
+ }
666
+ else if (filteredParams.modify) {
667
+ const filteredModifyParams = _.pick(params.modify, ['unspentIds', 'changes']);
668
+ return this.bitgo.put(url).send(filteredModifyParams).result();
669
+ }
670
+ else if (filteredParams.delete) {
671
+ const filteredDeleteParams = _.pick(params.delete, ['id']);
672
+ return this.bitgo.del(url).query(filteredDeleteParams).result();
673
+ }
674
+ else {
675
+ throw new Error('Did not detect a creation, modification, or deletion request.');
676
+ }
677
+ }
532
678
  /**
533
679
  * Consolidate unspents on a wallet
534
680
  *
@@ -570,9 +716,11 @@ class Wallet {
570
716
  * @param {Number} params.maxFeeRate - The max limit for a fee rate in satoshis/kB
571
717
  * @param {Number} params.maxNumInputsToUse - the number of unspents you want to use in the transaction
572
718
  * @param {Number} params.numUnspentsToMake - the number of new unspents to make
719
+ *
720
+ * @param {ManageUnspentsOptions} option - flag to toggle build and send or build only
573
721
  */
574
- async fanoutUnspents(params = {}) {
575
- return this.manageUnspents('fanout', params);
722
+ async fanoutUnspents(params = {}, option = ManageUnspentsOptions.BUILD_SIGN_SEND) {
723
+ return this.manageUnspents('fanout', params, option);
576
724
  }
577
725
  /**
578
726
  * Set the token flush thresholds for the wallet. Updates the wallet.
@@ -679,17 +827,21 @@ class Wallet {
679
827
  if (this.confirmedBalanceString() !== this.balanceString()) {
680
828
  throw new Error('cannot sweep when unconfirmed funds exist on the wallet, please wait until all inbound transactions confirm');
681
829
  }
682
- const value = this.spendableBalanceString();
683
- if (_.isUndefined(value) || value === '0') {
830
+ const value = await this.bitgo.get(this.url('/maximumSpendable')).result();
831
+ const maximumSpendable = new bignumber_js_1.default(value.maximumSpendable);
832
+ if (value === undefined || maximumSpendable.isZero()) {
684
833
  throw new Error('no funds to sweep');
685
834
  }
686
- params.recipients = [
687
- {
688
- address: params.address,
689
- amount: value,
690
- },
691
- ];
692
- return this.sendMany(params);
835
+ const sendManyParams = {
836
+ ...params,
837
+ recipients: [
838
+ {
839
+ address: params.address || '', // Ensure address is always a string
840
+ amount: maximumSpendable.toString(),
841
+ },
842
+ ],
843
+ };
844
+ return this.sendMany(sendManyParams);
693
845
  }
694
846
  // the following flow works for all UTXO coins
695
847
  const reqId = new utils_1.RequestTracer();
@@ -699,10 +851,20 @@ class Wallet {
699
851
  'maxFeeRate',
700
852
  'feeTxConfirmTarget',
701
853
  'allowPartialSweep',
854
+ 'txFormat',
702
855
  ]);
703
856
  this.bitgo.setRequestTracer(reqId);
704
857
  const response = await this.bitgo.post(this.url('/sweepWallet')).send(filteredParams).result();
705
- // TODO(BG-3588): add txHex validation to protect man in the middle attacks replacing the txHex
858
+ const transaction = await this.baseCoin.explainTransaction(response);
859
+ if (transaction?.outputs.length) {
860
+ const invalidOutputAddress = transaction.outputs.find((output) => output.address !== params.address);
861
+ if (invalidOutputAddress) {
862
+ throw new Error(`invalid sweep destination ${invalidOutputAddress.address}, specified ${params.address}`);
863
+ }
864
+ }
865
+ else {
866
+ throw new Error('invalid transaction, no destination address');
867
+ }
706
868
  const keychains = (await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId }));
707
869
  const transactionParams = {
708
870
  ...params,
@@ -717,7 +879,7 @@ class Wallet {
717
879
  const selectParams = _.pick(params, ['otp']);
718
880
  const finalTxParams = _.extend({}, signedTransaction, selectParams);
719
881
  this.bitgo.setRequestTracer(reqId);
720
- return this.sendTransaction(finalTxParams);
882
+ return this.sendTransaction(finalTxParams, reqId);
721
883
  }
722
884
  /**
723
885
  * Freeze a given wallet
@@ -827,6 +989,43 @@ class Wallet {
827
989
  .query(query)
828
990
  .result();
829
991
  }
992
+ /**
993
+ * List the addresses sorted by balance for a given wallet
994
+ * @param params
995
+ * @returns {*}
996
+ */
997
+ async addressesByBalance(params) {
998
+ const query = {
999
+ token: params.token,
1000
+ nftCollectionId: params.nftCollectionId,
1001
+ nftId: params.nftId,
1002
+ };
1003
+ query.sort = params.sort ?? -1;
1004
+ query.page = params.page ?? 1;
1005
+ query.limit = params.limit ?? 500;
1006
+ if (!_.isNumber(query.sort)) {
1007
+ throw new Error('invalid sort argument, expecting number');
1008
+ }
1009
+ if (!_.isNumber(query.page)) {
1010
+ throw new Error('invalid page argument, expecting number');
1011
+ }
1012
+ if (!_.isNumber(query.limit)) {
1013
+ throw new Error('invalid limit argument, expecting number');
1014
+ }
1015
+ if (query.limit < 1 || query.limit > 500) {
1016
+ throw new Error('limit argument must be between 1 and 500');
1017
+ }
1018
+ // Assert that either both nftCollectionId and nftId are provided or neither are provided
1019
+ const hasNftCollectionId = !_.isUndefined(query.nftCollectionId);
1020
+ const hasNftId = !_.isUndefined(query.nftId);
1021
+ if (hasNftCollectionId !== hasNftId) {
1022
+ throw new Error('nftCollectionId and nftId must both be provided or both be omitted');
1023
+ }
1024
+ return this.bitgo
1025
+ .get(this.baseCoin.url('/wallet/' + this._wallet.id + '/addresses/balances'))
1026
+ .query(query)
1027
+ .result();
1028
+ }
830
1029
  /**
831
1030
  * Get a single wallet address by its id
832
1031
  * @param params
@@ -874,7 +1073,7 @@ class Wallet {
874
1073
  async createAddress(params = {}) {
875
1074
  const addressParams = {};
876
1075
  const reqId = new utils_1.RequestTracer();
877
- const { chain, gasPrice, label, lowPriority, forwarderVersion, format, count = 1, baseAddress, allowSkipVerifyAddress = true, onToken, } = params;
1076
+ const { chain, gasPrice, label, lowPriority, forwarderVersion, format, count = 1, baseAddress, allowSkipVerifyAddress = true, onToken, evmKeyRingReferenceAddress, } = params;
878
1077
  if (!_.isUndefined(chain)) {
879
1078
  if (!_.isInteger(chain)) {
880
1079
  throw new Error('chain has to be an integer');
@@ -888,14 +1087,11 @@ class Wallet {
888
1087
  addressParams.gasPrice = gasPrice;
889
1088
  }
890
1089
  if (!_.isUndefined(forwarderVersion)) {
891
- if (!_.isInteger(forwarderVersion) || forwarderVersion < 0 || forwarderVersion > 3) {
892
- throw new Error('forwarderVersion has to be an integer 0, 1, 2 or 3');
1090
+ if (!_.isInteger(forwarderVersion) || forwarderVersion < 0 || forwarderVersion > 5) {
1091
+ throw new Error('forwarderVersion has to be an integer 0, 1, 2, 3, 4 or 5');
893
1092
  }
894
1093
  addressParams.forwarderVersion = forwarderVersion;
895
1094
  }
896
- else if (this._wallet.multisigType === 'tss' && this.baseCoin.getMPCAlgorithm() === 'ecdsa') {
897
- addressParams.forwarderVersion = 3;
898
- }
899
1095
  if (!_.isUndefined(label)) {
900
1096
  if (!_.isString(label)) {
901
1097
  throw new Error('label has to be a string');
@@ -932,9 +1128,6 @@ class Wallet {
932
1128
  if (!_.isString(onToken)) {
933
1129
  throw new Error('onToken has to be a string');
934
1130
  }
935
- if (!statics_1.ofcTokens.includes(onToken)) {
936
- throw new Error('Unknown OFC token');
937
- }
938
1131
  addressParams.onToken = onToken;
939
1132
  }
940
1133
  else {
@@ -944,27 +1137,45 @@ class Wallet {
944
1137
  throw new Error('onToken has to be a string');
945
1138
  }
946
1139
  }
1140
+ if (!_.isUndefined(evmKeyRingReferenceAddress)) {
1141
+ if (!_.isString(evmKeyRingReferenceAddress)) {
1142
+ throw new Error('evmKeyRingReferenceAddress has to be a string');
1143
+ }
1144
+ if (!this.baseCoin.isEVM()) {
1145
+ throw new Error('evmKeyRingReferenceAddress is only supported for EVM chains');
1146
+ }
1147
+ if (!this.baseCoin.isValidAddress(evmKeyRingReferenceAddress)) {
1148
+ throw new Error('evmKeyRingReferenceAddress must be a valid address');
1149
+ }
1150
+ addressParams.evmKeyRingReferenceAddress = evmKeyRingReferenceAddress;
1151
+ }
947
1152
  // get keychains for address verification
948
1153
  const keychains = await Promise.all(this._wallet.keys.map((k) => this.baseCoin.keychains().get({ id: k, reqId })));
949
1154
  const rootAddress = _.get(this._wallet, 'receiveAddress.address');
950
1155
  const newAddresses = _.times(count, async () => {
951
- var _a;
952
1156
  this.bitgo.setRequestTracer(reqId);
953
1157
  const newAddress = (await this.bitgo
954
1158
  .post(this.baseCoin.url('/wallet/' + this._wallet.id + '/address'))
955
1159
  .send(addressParams)
956
1160
  .result());
957
- // infer its address type
958
- if (_.isObject(newAddress.coinSpecific)) {
959
- newAddress.addressType = utils_1.inferAddressType(newAddress);
960
- }
961
1161
  newAddress.keychains = keychains;
962
- newAddress.baseAddress = baseAddress !== null && baseAddress !== void 0 ? baseAddress : _.get(this._wallet, 'coinSpecific.baseAddress');
963
- const verificationData = _.merge({}, newAddress, { rootAddress });
1162
+ newAddress.baseAddress = baseAddress ?? _.get(this._wallet, 'coinSpecific.baseAddress');
1163
+ newAddress.format = addressParams.format;
1164
+ const verificationData = _.merge({}, newAddress, {
1165
+ rootAddress,
1166
+ walletVersion: _.get(this._wallet, 'coinSpecific.walletVersion'),
1167
+ });
964
1168
  if (verificationData.error) {
965
1169
  throw new errors_1.AddressGenerationError(verificationData.error);
966
1170
  }
967
- verificationData.impliedForwarderVersion = forwarderVersion !== null && forwarderVersion !== void 0 ? forwarderVersion : (_a = verificationData.coinSpecific) === null || _a === void 0 ? void 0 : _a.forwarderVersion;
1171
+ verificationData.impliedForwarderVersion = forwarderVersion ?? verificationData.coinSpecific?.forwarderVersion;
1172
+ // For SMC (Self-Managed Custodial) wallets, pass derivedFromParentWithSeed from user keychain
1173
+ // The verification function will compute the derivation prefix internally
1174
+ // Custodial wallets don't need this as their commonKeychain already accounts for the prefix
1175
+ if (this.multisigType() === 'tss' && this.type() === 'cold' && this._wallet.keys.length > keychain_1.KeyIndices.USER) {
1176
+ const userKeychain = keychains[keychain_1.KeyIndices.USER];
1177
+ verificationData.derivedFromParentWithSeed = userKeychain?.derivedFromParentWithSeed;
1178
+ }
968
1179
  // This condition was added in first place because in celo, when verifyAddress method was called on addresses which were having pendingChainInitialization as true, it used to throw some error
969
1180
  // In case of forwarder version 1 eth addresses, addresses need to be verified even if the pendingChainInitialization flag is true
970
1181
  if (verificationData.coinSpecific &&
@@ -972,7 +1183,7 @@ class Wallet {
972
1183
  // can't verify addresses which are pending chain initialization, as the address is hidden
973
1184
  let isWalletAddress = false;
974
1185
  try {
975
- isWalletAddress = await this.baseCoin.isWalletAddress(verificationData);
1186
+ isWalletAddress = await this.baseCoin.isWalletAddress(verificationData, this);
976
1187
  }
977
1188
  catch (e) {
978
1189
  if (!(e instanceof errors_1.MethodNotImplementedError)) {
@@ -1011,6 +1222,69 @@ class Wallet {
1011
1222
  const url = this.url('/address/' + encodeURIComponent(address));
1012
1223
  return this.bitgo.put(url).send(putParams).result();
1013
1224
  }
1225
+ /**
1226
+ * Get account resources for the given addresses
1227
+ * @param params - options object containing addresses and optional destinationAddress
1228
+ * @returns {Promise<GetAccountResourcesResponse>} - response from WP API
1229
+ */
1230
+ async getAccountResources(params) {
1231
+ const { addresses, destinationAddress } = params;
1232
+ if (!Array.isArray(addresses)) {
1233
+ throw new Error('addresses must be an array');
1234
+ }
1235
+ if (addresses.length === 0) {
1236
+ throw new Error('addresses array cannot be empty');
1237
+ }
1238
+ const body = { addresses };
1239
+ if (destinationAddress) {
1240
+ body.destinationAddress = destinationAddress;
1241
+ }
1242
+ return this.bitgo.post(this.url('/getAccountResources')).send(body).result();
1243
+ }
1244
+ /**
1245
+ * Get resource delegations for this wallet
1246
+ * @param params - optional filters: type, resource, limit, nextBatchPrevId
1247
+ * @returns {Promise<GetResourceDelegationsResponse>} - response from WP API
1248
+ */
1249
+ async getResourceDelegations(params) {
1250
+ const queryParams = {};
1251
+ if (params?.type !== undefined)
1252
+ queryParams.type = params.type;
1253
+ if (params?.resource !== undefined)
1254
+ queryParams.resource = params.resource;
1255
+ if (params?.limit !== undefined)
1256
+ queryParams.limit = params.limit;
1257
+ if (params?.nextBatchPrevId !== undefined)
1258
+ queryParams.nextBatchPrevId = params.nextBatchPrevId;
1259
+ return this.bitgo.get(this.url('/resourcedelegations')).query(queryParams).result();
1260
+ }
1261
+ async updateWalletBuildDefaults(params) {
1262
+ common.validateParams(params, [], ['minFeeRate', 'changeAddressType', 'txFormat']);
1263
+ return this.updateWallet({
1264
+ buildDefaults: {
1265
+ minFeeRate: params.minFeeRate,
1266
+ changeAddressType: params.changeAddressType,
1267
+ txFormat: params.txFormat,
1268
+ },
1269
+ });
1270
+ }
1271
+ async updateWallet(params) {
1272
+ const filteredParams = _.pick(params, ['coinSpecific', 'buildDefaults', 'label']);
1273
+ const { coinSpecific, ...rest } = filteredParams;
1274
+ return this.bitgo
1275
+ .put(this.url())
1276
+ .send({
1277
+ ...rest,
1278
+ ...(coinSpecific
1279
+ ? {
1280
+ coinSpecific: {
1281
+ [this.baseCoin.getChain()]: coinSpecific,
1282
+ },
1283
+ }
1284
+ : {}),
1285
+ })
1286
+ .result();
1287
+ }
1014
1288
  /**
1015
1289
  * List webhooks on this wallet
1016
1290
  * @param params
@@ -1076,16 +1350,15 @@ class Wallet {
1076
1350
  return this.bitgo.del(this.url('/webhooks')).send(params).result();
1077
1351
  }
1078
1352
  /**
1079
- * Gets the user key chain for this wallet
1353
+ * Gets the user keychain for this wallet
1080
1354
  *
1081
- * The user key chain is the first keychain of the wallet and usually has the encrypted prv stored on BitGo.
1355
+ * The user keychain is the first keychain of the wallet and usually has the encrypted prv stored on BitGo.
1082
1356
  * Useful when trying to get the users' keychain from the server before decrypting to sign a transaction.
1083
- * @param params
1084
1357
  */
1085
- async getEncryptedUserKeychain(params = {}) {
1358
+ async getEncryptedUserKeychain() {
1086
1359
  const tryKeyChain = async (index) => {
1087
1360
  if (!this._wallet.keys || index >= this._wallet.keys.length) {
1088
- throw new Error('No encrypted keychains on this wallet.');
1361
+ throw new errors_1.MissingEncryptedKeychainError();
1089
1362
  }
1090
1363
  const params = { id: this._wallet.keys[index] };
1091
1364
  const keychain = await this.baseCoin.keychains().get(params);
@@ -1118,23 +1391,33 @@ class Wallet {
1118
1391
  if (params.prv) {
1119
1392
  return params.prv;
1120
1393
  }
1121
- const userKeychain = (await this.getEncryptedUserKeychain());
1122
- const userEncryptedPrv = userKeychain.encryptedPrv;
1123
- let userPrv;
1124
- try {
1125
- userPrv = this.bitgo.decrypt({ input: userEncryptedPrv, password: params.walletPassphrase });
1394
+ const userKeychain = await this.getEncryptedUserKeychain();
1395
+ if (!params.walletPassphrase) {
1396
+ throw new Error('wallet passphrase was not provided');
1126
1397
  }
1127
- catch (e) {
1128
- throw new Error('error decrypting wallet passphrase');
1398
+ const userPrv = await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, userKeychain, params.walletPassphrase);
1399
+ if (!userPrv) {
1400
+ throw new Error('error decrypting wallet private key');
1129
1401
  }
1130
1402
  return userPrv;
1131
1403
  }
1404
+ isMultiUserKeyWallet() {
1405
+ return this._wallet.coinSpecific?.features?.includes('multi-key-user-key') ?? false;
1406
+ }
1132
1407
  /**
1133
1408
  * Send an encrypted wallet share to BitGo.
1134
1409
  * @param params
1135
1410
  */
1136
1411
  async createShare(params = {}) {
1137
1412
  common.validateParams(params, ['user', 'permissions'], []);
1413
+ const isMultiUserKeyWallet = this.isMultiUserKeyWallet();
1414
+ if (isMultiUserKeyWallet) {
1415
+ if (params.keychain && !_.isEmpty(params.keychain)) {
1416
+ throw new Error('keychain property must not be provided for multi-key-user-key wallets');
1417
+ }
1418
+ // Remove keychain from params if presents
1419
+ return await this.bitgo.post(this.url('/share')).send(_.omit(params, 'keychain')).result();
1420
+ }
1138
1421
  if (params.keychain && !_.isEmpty(params.keychain)) {
1139
1422
  if (!params.keychain.pub ||
1140
1423
  !params.keychain.encryptedPrv ||
@@ -1146,13 +1429,200 @@ class Wallet {
1146
1429
  }
1147
1430
  return this.bitgo.post(this.url('/share')).send(params).result();
1148
1431
  }
1432
+ /**
1433
+ * Shares a wallet with multiple users by creating bulk wallet shares.
1434
+ *
1435
+ * @async
1436
+ * @param {BulkWalletShareOptions} params - The options for sharing wallets in bulk.
1437
+ * @param {Array<ShareOption>} params.shareOptions - An array of share option objects containing user and permissions information.
1438
+ * @param {Object} [params.shareOptions[].keychain] - The keychain object used to share the wallet.
1439
+ * @param {string} [params.shareOptions[].keychain.toPubKey] - The recipient's public key.
1440
+ * @param {string} [params.shareOptions[].keychain.path] - The derivation path of the keychain.
1441
+ * @param {string} params.shareOptions[].user - The user to share the wallet with.
1442
+ * @param {string} params.shareOptions[].permissions - The permissions granted to the user.
1443
+ * @param {string} [params.walletPassphrase] - The wallet passphrase used to decrypt the keychain.
1444
+ * @throws {Error} If `shareOptions` is empty, or if required keychain parameters (`toPubKey` and `path`) are missing when needed.
1445
+ * @throws {Error} If unable to decrypt the user keychain.
1446
+ * @returns {Promise<CreateBulkWalletShareListResponse>} A promise that resolves with the response of the bulk wallet share creation.
1447
+ */
1448
+ async createBulkWalletShare(params) {
1449
+ if (params.keyShareOptions.length === 0) {
1450
+ throw new Error('No share options provided');
1451
+ }
1452
+ const bulkCreateShareOptions = [];
1453
+ // Check if any share option needs a keychain (has 'spend' permission)
1454
+ const anyNeedsKeychain = params.keyShareOptions.some((opt) => opt.permissions && opt.permissions.includes('spend'));
1455
+ // Fetch and decrypt the keychain ONCE for all users
1456
+ let decryptedKeychain;
1457
+ if (anyNeedsKeychain) {
1458
+ try {
1459
+ decryptedKeychain = await this.getDecryptedKeychainForSharing(params.walletPassphrase);
1460
+ }
1461
+ catch (e) {
1462
+ if (e instanceof errors_1.MissingEncryptedKeychainError) {
1463
+ decryptedKeychain = undefined;
1464
+ }
1465
+ else {
1466
+ throw e;
1467
+ }
1468
+ }
1469
+ }
1470
+ for (const shareOption of params.keyShareOptions) {
1471
+ try {
1472
+ common.validateParams(shareOption, ['userId', 'pubKey', 'path'], []);
1473
+ }
1474
+ catch (e) {
1475
+ if (!shareOption.pubKey) {
1476
+ throw new errors_1.NeedUserSignupError(shareOption.userId);
1477
+ }
1478
+ throw e;
1479
+ }
1480
+ const needsKeychain = shareOption.permissions && shareOption.permissions.includes('spend');
1481
+ if (needsKeychain && decryptedKeychain) {
1482
+ const sharedKeychain = this.encryptPrvForUser(decryptedKeychain.prv, decryptedKeychain.pub, shareOption.pubKey, shareOption.path);
1483
+ bulkCreateShareOptions.push({
1484
+ user: shareOption.userId,
1485
+ permissions: shareOption.permissions,
1486
+ keychain: sharedKeychain,
1487
+ });
1488
+ }
1489
+ }
1490
+ return await this.createBulkKeyShares(bulkCreateShareOptions);
1491
+ }
1492
+ /**
1493
+ * Creates bulk wallet share entries for specified share options.
1494
+ * Filters out share options that do not contain valid keychain information or have missing keychain fields.
1495
+ * If all share options are invalid or empty, it throws an error.
1496
+ * Sends a POST request to create the wallet shares for valid share options.
1497
+ *
1498
+ * @async
1499
+ * @param {BulkCreateShareOption[]} [params=[]] - The array of share options to process.
1500
+ * Keychain entries must include the following fields: `pub`, `encryptedPrv`, `fromPubKey`, `toPubKey`, and `path`.
1501
+ * @returns {Promise<CreateBulkWalletShareListResponse>} A promise resolving to the result of the wallet shares creation.
1502
+ * @throws {Error} Throws an error if no valid share options are provided.
1503
+ */
1504
+ async createBulkKeyShares(params = []) {
1505
+ params = params.filter((shareOption) => {
1506
+ try {
1507
+ common.validateParams(shareOption.keychain, ['pub', 'encryptedPrv', 'fromPubKey', 'toPubKey', 'path'], []);
1508
+ return true;
1509
+ }
1510
+ catch (e) {
1511
+ // Exclude share options with invalid keychain
1512
+ return false;
1513
+ }
1514
+ });
1515
+ if (!params || Object.keys(params).length === 0) {
1516
+ throw new Error('shareOptions cannot be empty');
1517
+ }
1518
+ const url = this.bitgo.url(`/wallet/${this._wallet.id}/walletshares`, 2);
1519
+ return this.bitgo.post(url).send({ shareOptions: params }).result();
1520
+ }
1521
+ /**
1522
+ * Gets keychain with encrypted private key to be shared for wallet sharing.
1523
+ */
1524
+ async getEncryptedWalletKeychainForWalletSharing() {
1525
+ if (this.baseCoin.getFamily() === 'lnbtc') {
1526
+ // lightning coin does not use user key to sign the transactions from SDK.
1527
+ // it uses user auth key instead.
1528
+ return await (0, lightningWalletUtil_1.getLightningAuthKey)(this, 'userAuth');
1529
+ }
1530
+ else {
1531
+ return await this.getEncryptedUserKeychain();
1532
+ }
1533
+ }
1534
+ /**
1535
+ * Fetches and decrypts the wallet keychain for sharing.
1536
+ * This method fetches the keychain once and decrypts it, returning the decrypted
1537
+ * private key and public key info needed for sharing with multiple users.
1538
+ *
1539
+ * @param walletPassphrase - The passphrase to decrypt the keychain
1540
+ * @returns Object containing decrypted prv and pub, or undefined for cold wallets
1541
+ */
1542
+ async getDecryptedKeychainForSharing(walletPassphrase) {
1543
+ const keychain = await this.getEncryptedWalletKeychainForWalletSharing();
1544
+ if (!keychain.encryptedPrv) {
1545
+ return undefined;
1546
+ }
1547
+ if (!walletPassphrase) {
1548
+ throw new Error('Missing walletPassphrase argument');
1549
+ }
1550
+ const prv = await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, keychain, walletPassphrase);
1551
+ if (!prv) {
1552
+ throw new errors_1.IncorrectPasswordError('Password shared is incorrect for this wallet');
1553
+ }
1554
+ // Only one of pub/commonPub/commonKeychain should be present in the keychain
1555
+ let pub = keychain.pub ?? keychain.commonPub;
1556
+ if (keychain.commonKeychain) {
1557
+ pub =
1558
+ this.baseCoin.getMPCAlgorithm() === 'eddsa'
1559
+ ? eddsa_1.default.getPublicKeyFromCommonKeychain(keychain.commonKeychain)
1560
+ : ecdsa_1.EcdsaUtils.getPublicKeyFromCommonKeychain(keychain.commonKeychain);
1561
+ }
1562
+ if (!pub) {
1563
+ throw new Error('Unable to determine public key from keychain');
1564
+ }
1565
+ return { prv, pub };
1566
+ }
1567
+ /**
1568
+ * Encrypts a decrypted private key for sharing with a specific user.
1569
+ * This is the pure encryption step - no API calls, no decryption.
1570
+ *
1571
+ * @param decryptedPrv - The already-decrypted private key
1572
+ * @param pub - The wallet's public key
1573
+ * @param userPubkey - The recipient user's public key
1574
+ * @param path - The key path
1575
+ * @returns The encrypted keychain for the recipient with all required fields
1576
+ */
1577
+ encryptPrvForUser(decryptedPrv, pub, userPubkey, path) {
1578
+ const eckey = (0, bitcoin_1.makeRandomKey)();
1579
+ const secret = (0, ecdh_1.getSharedSecret)(eckey, Buffer.from(userPubkey, 'hex')).toString('hex');
1580
+ const newEncryptedPrv = this.bitgo.encrypt({ password: secret, input: decryptedPrv });
1581
+ const keychain = {
1582
+ pub,
1583
+ encryptedPrv: newEncryptedPrv,
1584
+ fromPubKey: eckey.publicKey.toString('hex'),
1585
+ toPubKey: userPubkey,
1586
+ path: path,
1587
+ };
1588
+ (0, assert_1.default)(keychain.pub, 'pub must be defined for sharing');
1589
+ (0, assert_1.default)(keychain.encryptedPrv, 'encryptedPrv must be defined for sharing');
1590
+ (0, assert_1.default)(keychain.fromPubKey, 'fromPubKey must be defined for sharing');
1591
+ (0, assert_1.default)(keychain.toPubKey, 'toPubKey must be defined for sharing');
1592
+ (0, assert_1.default)(keychain.path, 'path must be defined for sharing');
1593
+ return keychain;
1594
+ }
1595
+ /**
1596
+ * Prepares a keychain for sharing with another user.
1597
+ * Fetches the wallet keychain, decrypts it, and encrypts it for the recipient.
1598
+ *
1599
+ * @param walletPassphrase - The passphrase to decrypt the keychain
1600
+ * @param pubkey - The recipient's public key
1601
+ * @param path - The key path
1602
+ * @returns The encrypted keychain for the recipient
1603
+ */
1604
+ async prepareSharedKeychain(walletPassphrase, pubkey, path) {
1605
+ try {
1606
+ const decryptedKeychain = await this.getDecryptedKeychainForSharing(walletPassphrase);
1607
+ if (!decryptedKeychain) {
1608
+ return {};
1609
+ }
1610
+ return this.encryptPrvForUser(decryptedKeychain.prv, decryptedKeychain.pub, pubkey, path);
1611
+ }
1612
+ catch (e) {
1613
+ if (e instanceof errors_1.MissingEncryptedKeychainError) {
1614
+ // ignore this error because this looks like a cold wallet
1615
+ return {};
1616
+ }
1617
+ throw e;
1618
+ }
1619
+ }
1149
1620
  /**
1150
1621
  * Share this wallet with another BitGo user.
1151
1622
  * @param params
1152
1623
  * @returns {*}
1153
1624
  */
1154
1625
  async shareWallet(params = {}) {
1155
- var _a;
1156
1626
  common.validateParams(params, ['email', 'permissions'], ['walletPassphrase', 'message']);
1157
1627
  if (params.reshare !== undefined && !_.isBoolean(params.reshare)) {
1158
1628
  throw new Error('Expected reshare to be a boolean.');
@@ -1160,58 +1630,24 @@ class Wallet {
1160
1630
  if (params.skipKeychain !== undefined && !_.isBoolean(params.skipKeychain)) {
1161
1631
  throw new Error('Expected skipKeychain to be a boolean. ');
1162
1632
  }
1163
- const needsKeychain = !params.skipKeychain && params.permissions && params.permissions.indexOf('spend') !== -1;
1633
+ // Check if this is a multi-key-user-key OFC wallet
1634
+ // For multi-key-user-key wallets, skip keychain preparation regardless of other conditions
1635
+ const needsKeychain = !this.isMultiUserKeyWallet() &&
1636
+ !params.skipKeychain &&
1637
+ params.permissions &&
1638
+ params.permissions.indexOf('spend') !== -1;
1164
1639
  if (params.disableEmail !== undefined && !_.isBoolean(params.disableEmail)) {
1165
1640
  throw new Error('Expected disableEmail to be a boolean.');
1166
1641
  }
1167
1642
  if (!_.isString(params.email)) {
1168
1643
  throw new Error('missing required string parameter email');
1169
1644
  }
1170
- const sharing = (await this.bitgo.getSharingKey({ email: params.email.toLowerCase() }));
1645
+ const sharing = (await this.bitgo.getSharingKey({
1646
+ email: params.email.toLowerCase(),
1647
+ }));
1171
1648
  let sharedKeychain;
1172
1649
  if (needsKeychain) {
1173
- try {
1174
- const keychain = (await this.getEncryptedUserKeychain({}));
1175
- // Decrypt the user key with a passphrase
1176
- if (keychain.encryptedPrv) {
1177
- if (!params.walletPassphrase) {
1178
- throw new Error('Missing walletPassphrase argument');
1179
- }
1180
- try {
1181
- keychain.prv = this.bitgo.decrypt({ password: params.walletPassphrase, input: keychain.encryptedPrv });
1182
- }
1183
- catch (e) {
1184
- throw new Error('Unable to decrypt user keychain');
1185
- }
1186
- const eckey = bitcoin_1.makeRandomKey();
1187
- const secret = ecdh_1.getSharedSecret(eckey, Buffer.from(sharing.pubkey, 'hex')).toString('hex');
1188
- const newEncryptedPrv = this.bitgo.encrypt({ password: secret, input: keychain.prv });
1189
- // Only one of pub/commonPub/commonKeychain should be present in the keychain
1190
- let pub = (_a = keychain.pub) !== null && _a !== void 0 ? _a : keychain.commonPub;
1191
- if (keychain.commonKeychain) {
1192
- pub =
1193
- this.baseCoin.getMPCAlgorithm() === 'eddsa'
1194
- ? eddsa_1.default.getPublicKeyFromCommonKeychain(keychain.commonKeychain)
1195
- : ecdsa_1.EcdsaUtils.getPublicKeyFromCommonKeychain(keychain.commonKeychain);
1196
- }
1197
- sharedKeychain = {
1198
- pub,
1199
- encryptedPrv: newEncryptedPrv,
1200
- fromPubKey: eckey.publicKey.toString('hex'),
1201
- toPubKey: sharing.pubkey,
1202
- path: sharing.path,
1203
- };
1204
- }
1205
- }
1206
- catch (e) {
1207
- if (e.message === 'No encrypted keychains on this wallet.') {
1208
- sharedKeychain = {};
1209
- // ignore this error because this looks like a cold wallet
1210
- }
1211
- else {
1212
- throw e;
1213
- }
1214
- }
1650
+ sharedKeychain = await this.prepareSharedKeychain(params.walletPassphrase, sharing.pubkey, sharing.path);
1215
1651
  }
1216
1652
  const options = {
1217
1653
  user: sharing.userId,
@@ -1219,13 +1655,9 @@ class Wallet {
1219
1655
  reshare: params.reshare,
1220
1656
  message: params.message,
1221
1657
  disableEmail: params.disableEmail,
1658
+ skipKeychain: Object.keys(sharedKeychain ?? {}).length === 0,
1659
+ keychain: Object.keys(sharedKeychain ?? {}).length === 0 ? undefined : sharedKeychain,
1222
1660
  };
1223
- if (sharedKeychain) {
1224
- options.keychain = sharedKeychain;
1225
- }
1226
- else if (params.skipKeychain) {
1227
- options.keychain = {};
1228
- }
1229
1661
  return await this.createShare(options);
1230
1662
  }
1231
1663
  /**
@@ -1276,10 +1708,10 @@ class Wallet {
1276
1708
  */
1277
1709
  async prebuildTransaction(params = {}) {
1278
1710
  if (this._wallet.multisigType === 'tss') {
1279
- return this.prebuildTransactionTss(params);
1711
+ return this.prebuildTransactionTxRequests(params);
1280
1712
  }
1281
1713
  // Whitelist params to build tx
1282
- const whitelistedParams = _.pick(params, this.prebuildWhitelistedParams());
1714
+ const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, this.prebuildWhitelistedParams()));
1283
1715
  debug('prebuilding transaction: %O', whitelistedParams);
1284
1716
  if (params.reqId) {
1285
1717
  this.bitgo.setRequestTracer(params.reqId);
@@ -1303,13 +1735,19 @@ class Wallet {
1303
1735
  if (!_.isUndefined(blockHeight)) {
1304
1736
  buildResponse.blockHeight = blockHeight;
1305
1737
  }
1306
- let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(buildResponse, { wallet: this, buildParams: whitelistedParams })));
1738
+ let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(buildResponse, {
1739
+ wallet: this,
1740
+ buildParams: whitelistedParams,
1741
+ })));
1307
1742
  delete prebuild.wallet;
1308
1743
  delete prebuild.buildParams;
1309
1744
  prebuild = _.extend({}, prebuild, { walletId: this.id() });
1310
1745
  if (this._wallet && this._wallet.coinSpecific && !params.walletContractAddress) {
1311
- prebuild = _.extend({}, prebuild, { walletContractAddress: this._wallet.coinSpecific.baseAddress });
1746
+ prebuild = _.extend({}, prebuild, {
1747
+ walletContractAddress: this._wallet.coinSpecific.baseAddress,
1748
+ });
1312
1749
  }
1750
+ prebuild = _.extend({}, prebuild, { reqId: params.reqId });
1313
1751
  debug('final transaction prebuild: %O', prebuild);
1314
1752
  return prebuild;
1315
1753
  }
@@ -1324,21 +1762,21 @@ class Wallet {
1324
1762
  throw new Error('getUserKeyAndSignTssTransaction is only supported for TSS wallets');
1325
1763
  }
1326
1764
  const reqId = new utils_1.RequestTracer();
1327
- const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId });
1328
1765
  // Doing a sanity check for password here to avoid doing further work if we know it's wrong
1766
+ const keychains = await this.getKeychainsAndValidatePassphrase({
1767
+ reqId,
1768
+ walletPassphrase,
1769
+ });
1329
1770
  const userKeychain = keychains[0];
1330
1771
  if (!userKeychain || !userKeychain.encryptedPrv) {
1331
1772
  throw new Error('the user keychain does not have property encryptedPrv');
1332
1773
  }
1333
- try {
1334
- this.bitgo.decrypt({ input: userKeychain.encryptedPrv, password: walletPassphrase });
1335
- }
1336
- catch (e) {
1337
- const error = new Error(`unable to decrypt keychain with the given wallet passphrase. Error: ${JSON.stringify(e)}`);
1338
- error.code = 'wallet_passphrase_incorrect';
1339
- throw error;
1340
- }
1341
- return this.signTransaction({ txPrebuild: { txRequestId }, walletPassphrase, reqId, keychain: userKeychain });
1774
+ return this.signTransaction({
1775
+ txPrebuild: { txRequestId },
1776
+ walletPassphrase,
1777
+ reqId,
1778
+ keychain: userKeychain,
1779
+ });
1342
1780
  }
1343
1781
  /**
1344
1782
  * Sign a transaction
@@ -1346,10 +1784,12 @@ class Wallet {
1346
1784
  * - txPrebuild
1347
1785
  * - [keychain / key] (object) or prv (string)
1348
1786
  * - walletPassphrase
1787
+ * - verifyTxParams (optional) - when provided, the transaction will be verified before signing
1788
+ * - txParams: transaction parameters used for verification
1789
+ * - verification: optional verification options
1349
1790
  * @return {*}
1350
1791
  */
1351
1792
  async signTransaction(params = {}) {
1352
- var _a;
1353
1793
  const { txPrebuild, apiVersion, txRequestId } = params;
1354
1794
  if (_.isFunction(params.customCommitmentGeneratingFunction) &&
1355
1795
  _.isFunction(params.customGShareGeneratingFunction) &&
@@ -1364,6 +1804,12 @@ class Wallet {
1364
1804
  // invoke external signer TSS for ECDSA workflow
1365
1805
  return this.signTransactionTssExternalSignerECDSA(this.baseCoin, params);
1366
1806
  }
1807
+ if (_.isFunction(params.customMPCv2SigningRound1GenerationFunction) &&
1808
+ _.isFunction(params.customMPCv2SigningRound2GenerationFunction) &&
1809
+ _.isFunction(params.customMPCv2SigningRound3GenerationFunction)) {
1810
+ // invoke external signer TSS for ECDSA MPCv2workflow
1811
+ return this.signTransactionTssExternalSignerECDSAMPCv2(this.baseCoin, params);
1812
+ }
1367
1813
  if (!txPrebuild || typeof txPrebuild !== 'object') {
1368
1814
  if (this.multisigType() === 'onchain') {
1369
1815
  throw new Error('txPrebuild is required for on-chain multisig wallets');
@@ -1374,19 +1820,52 @@ class Wallet {
1374
1820
  // We only do this if we're not using the external signer TSS flow
1375
1821
  params.txPrebuild = { txRequestId };
1376
1822
  }
1823
+ // Verify transaction if verifyTxParams is provided
1824
+ if (params.verifyTxParams && txPrebuild?.txHex) {
1825
+ const verifyParams = {
1826
+ txPrebuild: { ...txPrebuild },
1827
+ txParams: params.verifyTxParams.txParams,
1828
+ wallet: this,
1829
+ verification: params.verifyTxParams.verification,
1830
+ reqId: params.reqId,
1831
+ walletType: this.multisigType(),
1832
+ };
1833
+ await this.baseCoin.verifyTransaction(verifyParams);
1834
+ }
1835
+ if (params.walletPassphrase &&
1836
+ !(params.keychain || params.key) &&
1837
+ (this.type() === 'hot' || this.type() === undefined)) {
1838
+ // this logic should only apply to hot wallets
1839
+ if (!_.isString(params.walletPassphrase)) {
1840
+ throw new Error('walletPassphrase must be a string');
1841
+ }
1842
+ const keychains = await this.getKeychainsAndValidatePassphrase({
1843
+ reqId: params.reqId,
1844
+ walletPassphrase: params.walletPassphrase,
1845
+ });
1846
+ const userKeychain = keychains[0];
1847
+ if (!userKeychain || !userKeychain.encryptedPrv) {
1848
+ throw new Error('the user keychain does not have property encryptedPrv');
1849
+ }
1850
+ params.keychain = userKeychain;
1851
+ }
1377
1852
  const presign = await this.baseCoin.presignTransaction({
1378
1853
  ...params,
1379
1854
  walletData: this._wallet,
1380
1855
  tssUtils: this.tssUtils,
1381
1856
  });
1382
1857
  if (this.multisigType() === 'tss') {
1383
- return this.signTransactionTss({ ...presign, prv: this.getUserPrv(presign), apiVersion });
1858
+ return this.signTransactionTss({
1859
+ ...presign,
1860
+ prv: await this.getUserPrvAsync(presign),
1861
+ apiVersion,
1862
+ });
1384
1863
  }
1385
1864
  let { pubs } = params;
1386
1865
  if (!pubs && this.baseCoin.keyIdsForSigning().length > 1) {
1387
1866
  const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this });
1388
1867
  pubs = keychains.map((k) => {
1389
- assert_1.default(k.pub);
1868
+ (0, assert_1.default)(k.pub);
1390
1869
  return k.pub;
1391
1870
  });
1392
1871
  }
@@ -1398,18 +1877,23 @@ class Wallet {
1398
1877
  };
1399
1878
  if (_.isFunction(params.customSigningFunction)) {
1400
1879
  if (typeof this.baseCoin.signWithCustomSigningFunction === 'function') {
1401
- return this.baseCoin.signWithCustomSigningFunction(params.customSigningFunction, signTransactionParams);
1880
+ (0, assert_1.default)(pubs, 'pubs are required for custom signing');
1881
+ return this.baseCoin.signWithCustomSigningFunction(params.customSigningFunction, {
1882
+ ...signTransactionParams,
1883
+ pubs,
1884
+ });
1402
1885
  }
1403
1886
  const keys = await this.baseCoin.keychains().getKeysForSigning({ wallet: this });
1404
1887
  const signTransactionParamsWithSeed = {
1405
1888
  ...signTransactionParams,
1406
- derivationSeed: (_a = keys[0]) === null || _a === void 0 ? void 0 : _a.derivedFromParentWithSeed,
1889
+ derivationSeed: keys[0]?.derivedFromParentWithSeed,
1407
1890
  };
1408
1891
  return params.customSigningFunction(signTransactionParamsWithSeed);
1409
1892
  }
1410
1893
  return this.baseCoin.signTransaction({
1411
1894
  ...signTransactionParams,
1412
- prv: this.getUserPrv(presign),
1895
+ prv: await this.getUserPrvAsync(presign),
1896
+ wallet: this,
1413
1897
  });
1414
1898
  }
1415
1899
  /**
@@ -1433,13 +1917,16 @@ class Wallet {
1433
1917
  params.typedData.typedDataEncoded = this.baseCoin.encodeTypedData(params.typedData);
1434
1918
  }
1435
1919
  const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
1436
- const userPrvOptions = { ...params, keychain: keychains[0] };
1437
- assert_1.default(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1920
+ const userPrvOptions = {
1921
+ ...params,
1922
+ keychain: keychains[0],
1923
+ };
1924
+ (0, assert_1.default)(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1438
1925
  const presign = {
1439
1926
  ...params,
1440
1927
  walletData: this._wallet,
1441
1928
  tssUtils: this.tssUtils,
1442
- prv: this.getUserPrv(userPrvOptions),
1929
+ prv: await this.getUserPrvAsync(userPrvOptions),
1443
1930
  keychain: keychains[0],
1444
1931
  backupKeychain: keychains.length > 1 ? keychains[1] : null,
1445
1932
  bitgoKeychain: keychains.length > 2 ? keychains[2] : null,
@@ -1458,8 +1945,8 @@ class Wallet {
1458
1945
  if (!this.baseCoin.supportsMessageSigning()) {
1459
1946
  throw new Error(`Message signing not supported for ${this.baseCoin.getFullName()}`);
1460
1947
  }
1461
- if (!params.message) {
1462
- throw new Error('message required to sign message');
1948
+ if (!params.message || !params.message.messageStandardType) {
1949
+ throw new Error('message and type required to sign message');
1463
1950
  }
1464
1951
  if (this._wallet.multisigType !== 'tss') {
1465
1952
  throw new Error('Message signing only supported for TSS wallets');
@@ -1468,13 +1955,16 @@ class Wallet {
1468
1955
  params.message.messageEncoded = this.baseCoin.encodeMessage(params.message.messageRaw);
1469
1956
  }
1470
1957
  const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
1471
- const userPrvOptions = { ...params, keychain: keychains[0] };
1472
- assert_1.default(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1958
+ const userPrvOptions = {
1959
+ ...params,
1960
+ keychain: keychains[0],
1961
+ };
1962
+ (0, assert_1.default)(keychains[0].commonKeychain, 'Unable to find commonKeychain in keychains');
1473
1963
  const presign = {
1474
1964
  ...params,
1475
1965
  walletData: this._wallet,
1476
1966
  tssUtils: this.tssUtils,
1477
- prv: this.getUserPrv(userPrvOptions),
1967
+ prv: await this.getUserPrvAsync(userPrvOptions),
1478
1968
  keychain: keychains[0],
1479
1969
  backupKeychain: keychains.length > 1 ? keychains[1] : null,
1480
1970
  bitgoKeychain: keychains.length > 2 ? keychains[2] : null,
@@ -1483,7 +1973,45 @@ class Wallet {
1483
1973
  return this.signMessageTss(presign);
1484
1974
  }
1485
1975
  /**
1486
- * Get the user private key from either a derivation or an encrypted keychain
1976
+ * Prepares and creates a sign message request for TSS wallets, that can be used later for signing.
1977
+ *
1978
+ * @param params - Parameters for creating the sign message request
1979
+ * @returns Promise<TxRequest> - The created transaction request for signing a message
1980
+ */
1981
+ async buildSignMessageRequest(params) {
1982
+ if (this._wallet.multisigType !== 'tss') {
1983
+ throw new Error('Message signing only supported for TSS wallets');
1984
+ }
1985
+ if (!this.baseCoin.supportsMessageSigning()) {
1986
+ throw new Error(`Message signing not supported for ${this.baseCoin.getFullName()}`);
1987
+ }
1988
+ if (!params.message?.messageRaw || !params.message?.messageStandardType) {
1989
+ throw new Error('message and type required to create message sign request');
1990
+ }
1991
+ const messageRaw = params.message.messageRaw;
1992
+ const messageStandardType = params.message.messageStandardType;
1993
+ const reqId = params.reqId || new utils_1.RequestTracer();
1994
+ try {
1995
+ const intentOption = {
1996
+ custodianMessageId: params.custodianMessageId,
1997
+ reqId,
1998
+ intentType: 'signMessage',
1999
+ isTss: true,
2000
+ messageRaw,
2001
+ messageStandardType,
2002
+ signerAddress: params.message.signerAddress,
2003
+ };
2004
+ if (!this.tssUtils) {
2005
+ throw new Error('TSS utilities not available for this wallet');
2006
+ }
2007
+ return await this.tssUtils.buildSignMessageRequest(intentOption);
2008
+ }
2009
+ catch (error) {
2010
+ throw new Error(`Failed to create message sign request: ${error}`);
2011
+ }
2012
+ }
2013
+ /**
2014
+ * Get the user private key from either a derivation or an encrypted keychain (sync, v1 only).
1487
2015
  * @param [params.keychain / params.key] (object) or params.prv (string)
1488
2016
  * @param params.walletPassphrase (string)
1489
2017
  */
@@ -1493,9 +2021,6 @@ class Wallet {
1493
2021
  if (userPrv && typeof userPrv !== 'string') {
1494
2022
  throw new Error('prv must be a string');
1495
2023
  }
1496
- // use the `derivedFromParentWithSeed` property from the user keychain as the `coldDerivationSeed`
1497
- // if no other `coldDerivationSeed` was explicitly provided
1498
- // Only for onchain multisig wallets, TSS key derivation happens during the signing process
1499
2024
  if (params.coldDerivationSeed === undefined &&
1500
2025
  params.keychain !== undefined &&
1501
2026
  params.keychain.derivedFromParentWithSeed !== undefined &&
@@ -1503,8 +2028,10 @@ class Wallet {
1503
2028
  params.coldDerivationSeed = params.keychain.derivedFromParentWithSeed;
1504
2029
  }
1505
2030
  if (userPrv && params.coldDerivationSeed) {
1506
- // the derivation only makes sense when a key already exists
1507
- const derivation = this.baseCoin.deriveKeyWithSeed({ key: userPrv, seed: params.coldDerivationSeed });
2031
+ const derivation = this.baseCoin.deriveKeyWithSeed({
2032
+ key: userPrv,
2033
+ seed: params.coldDerivationSeed,
2034
+ });
1508
2035
  userPrv = derivation.key;
1509
2036
  }
1510
2037
  else if (!userPrv) {
@@ -1518,29 +2045,73 @@ class Wallet {
1518
2045
  if (!params.walletPassphrase) {
1519
2046
  throw new Error('walletPassphrase property missing');
1520
2047
  }
1521
- userPrv = this.bitgo.decrypt({ input: userEncryptedPrv, password: params.walletPassphrase });
2048
+ userPrv = (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, userKeychain, params.walletPassphrase);
2049
+ if (!userPrv) {
2050
+ throw new Error('failed to decrypt user keychain');
2051
+ }
1522
2052
  }
1523
2053
  return userPrv;
1524
2054
  }
1525
2055
  /**
1526
- * Get a transaction prebuild from BitGo, validate it, and then decrypt the user key and sign the transaction
1527
- * @param params
2056
+ * Async version of getUserPrv that supports both v1 (SJCL) and v2 (Argon2id) envelopes.
2057
+ * @param [params.keychain / params.key] (object) or params.prv (string)
2058
+ * @param params.walletPassphrase (string)
1528
2059
  */
1529
- async prebuildAndSignTransaction(params = {}) {
1530
- var _a, _b, _c;
1531
- if (params.eip1559 && params.gasPrice) {
1532
- const error = new Error('Only one of params.eip1559 and params.gasPrice may be specified');
1533
- error.code = 'both_gasPrice_and_eip1559gasModel_specified';
1534
- throw error;
2060
+ async getUserPrvAsync(params = {}) {
2061
+ const userKeychain = params.keychain || params.key;
2062
+ let userPrv = params.prv;
2063
+ if (userPrv && typeof userPrv !== 'string') {
2064
+ throw new Error('prv must be a string');
1535
2065
  }
1536
- if (params.prebuildTx && params.recipients) {
1537
- const error = new Error('Only one of prebuildTx and recipients may be specified');
1538
- error.code = 'both_prebuildtx_and_recipients_specified';
1539
- throw error;
2066
+ if (params.coldDerivationSeed === undefined &&
2067
+ params.keychain !== undefined &&
2068
+ params.keychain.derivedFromParentWithSeed !== undefined &&
2069
+ this.multisigType() === 'onchain') {
2070
+ params.coldDerivationSeed = params.keychain.derivedFromParentWithSeed;
1540
2071
  }
1541
- if (params.recipients && !Array.isArray(params.recipients)) {
1542
- const error = new Error('expecting recipients array');
1543
- error.code = 'recipients_not_array';
2072
+ if (userPrv && params.coldDerivationSeed) {
2073
+ const derivation = this.baseCoin.deriveKeyWithSeed({
2074
+ key: userPrv,
2075
+ seed: params.coldDerivationSeed,
2076
+ });
2077
+ userPrv = derivation.key;
2078
+ }
2079
+ else if (!userPrv) {
2080
+ if (!userKeychain || typeof userKeychain !== 'object') {
2081
+ throw new Error('keychain must be an object');
2082
+ }
2083
+ const userEncryptedPrv = userKeychain.encryptedPrv;
2084
+ if (!userEncryptedPrv) {
2085
+ throw new Error('keychain does not have property encryptedPrv');
2086
+ }
2087
+ if (!params.walletPassphrase) {
2088
+ throw new Error('walletPassphrase property missing');
2089
+ }
2090
+ userPrv = await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, userKeychain, params.walletPassphrase);
2091
+ if (!userPrv) {
2092
+ throw new Error('failed to decrypt user keychain');
2093
+ }
2094
+ }
2095
+ return userPrv;
2096
+ }
2097
+ /**
2098
+ * Get a transaction prebuild from BitGo, validate it, and then decrypt the user key and sign the transaction
2099
+ * @param params
2100
+ */
2101
+ async prebuildAndSignTransaction(params = {}) {
2102
+ if (params.eip1559 && params.gasPrice) {
2103
+ const error = new Error('Only one of params.eip1559 and params.gasPrice may be specified');
2104
+ error.code = 'both_gasPrice_and_eip1559gasModel_specified';
2105
+ throw error;
2106
+ }
2107
+ if (params.prebuildTx && params.recipients) {
2108
+ const error = new Error('Only one of prebuildTx and recipients may be specified');
2109
+ error.code = 'both_prebuildtx_and_recipients_specified';
2110
+ throw error;
2111
+ }
2112
+ if (params.recipients && !Array.isArray(params.recipients)) {
2113
+ const error = new Error('expecting recipients array');
2114
+ error.code = 'recipients_not_array';
1544
2115
  throw error;
1545
2116
  }
1546
2117
  if (_.isArray(this._permissions) && !this._permissions.includes('spend')) {
@@ -1558,26 +2129,17 @@ class Wallet {
1558
2129
  error.code = 'recipients_not_allowed_for_fillnonce_and_acceleration_tx_type';
1559
2130
  throw error;
1560
2131
  }
1561
- const supportedTxRequestVersions = ((_a = this.tssUtils) === null || _a === void 0 ? void 0 : _a.supportedTxRequestVersions()) || [];
1562
- if (params.apiVersion && !supportedTxRequestVersions.includes(params.apiVersion)) {
1563
- throw new Error(`prebuildAndSignTransaction params.apiVersion=${params.apiVersion} must be one of ${supportedTxRequestVersions}`);
2132
+ if (params.apiVersion) {
2133
+ (0, txRequest_1.validateTxRequestApiVersion)(this, params.apiVersion);
1564
2134
  }
1565
- const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId: params.reqId });
1566
2135
  // Doing a sanity check for password here to avoid doing further work if we know it's wrong
1567
- // we ignore this check with if customSigningFunction is provided
1568
- // which means that the user is handling the signing in external signing mode
1569
- try {
1570
- if (keychains[0].encryptedPrv && !params.customSigningFunction && params.walletPassphrase) {
1571
- this.bitgo.decrypt({ input: keychains[0].encryptedPrv, password: params.walletPassphrase });
1572
- }
1573
- }
1574
- catch (e) {
1575
- const error = new Error(`unable to decrypt keychain with the given wallet passphrase. Error: ${JSON.stringify(e)}`);
1576
- error.code = 'wallet_passphrase_incorrect';
1577
- throw error;
1578
- }
2136
+ const keychains = await this.getKeychainsAndValidatePassphrase({
2137
+ reqId: params.reqId,
2138
+ walletPassphrase: params.walletPassphrase,
2139
+ customSigningFunction: params.customSigningFunction,
2140
+ });
1579
2141
  let txPrebuildQuery;
1580
- if (isPrebuildTransactionResult(params.prebuildTx) && ((_b = params.prebuildTx.buildParams) === null || _b === void 0 ? void 0 : _b.preview)) {
2142
+ if (isPrebuildTransactionResult(params.prebuildTx) && params.prebuildTx.buildParams?.preview) {
1581
2143
  // If we prebuilt the txRequest with preview=true, then we should rebuild with preview=false to persist the request
1582
2144
  txPrebuildQuery = this.prebuildTransaction({
1583
2145
  ...params,
@@ -1591,10 +2153,10 @@ class Wallet {
1591
2153
  const txPrebuild = (await txPrebuildQuery);
1592
2154
  try {
1593
2155
  await this.baseCoin.verifyTransaction({
1594
- txParams: txPrebuild.buildParams || params,
2156
+ txParams: { ...txPrebuild.buildParams, ...params },
1595
2157
  txPrebuild,
1596
2158
  wallet: this,
1597
- verification: (_c = params.verification) !== null && _c !== void 0 ? _c : {},
2159
+ verification: params.verification ?? {},
1598
2160
  reqId: params.reqId,
1599
2161
  walletType: this._wallet.multisigType,
1600
2162
  });
@@ -1602,7 +2164,15 @@ class Wallet {
1602
2164
  catch (e) {
1603
2165
  console.error('transaction prebuild failed local validation:', e.message);
1604
2166
  console.error('transaction params:', _.omit(params, ['keychain', 'prv', 'passphrase', 'walletPassphrase', 'key', 'wallet']));
1605
- console.error('transaction prebuild:', txPrebuild);
2167
+ // Sanitize to remove _token from bitgo
2168
+ const sanitizedPrebuild = {
2169
+ ..._.omit(txPrebuild, ['wallet']),
2170
+ wallet: {
2171
+ ...this,
2172
+ bitgo: _.omit(this.bitgo, ['_token']),
2173
+ },
2174
+ };
2175
+ console.error('transaction prebuild:', sanitizedPrebuild);
1606
2176
  console.trace(e);
1607
2177
  throw e;
1608
2178
  }
@@ -1610,10 +2180,7 @@ class Wallet {
1610
2180
  const signingParams = {
1611
2181
  ...params,
1612
2182
  txPrebuild,
1613
- wallet: {
1614
- // this is the version of the multisig address at wallet creation time
1615
- addressVersion: this._wallet.coinSpecific.addressVersion,
1616
- },
2183
+ wallet: this,
1617
2184
  keychain: keychains[0],
1618
2185
  backupKeychain: keychains.length > 1 ? keychains[1] : null,
1619
2186
  bitgoKeychain: keychains.length > 2 ? keychains[2] : null,
@@ -1621,13 +2188,13 @@ class Wallet {
1621
2188
  };
1622
2189
  if (this._wallet.multisigType === 'onchain') {
1623
2190
  signingParams.pubs = keychains.map((k) => {
1624
- assert_1.default(k.pub);
2191
+ (0, assert_1.default)(k.pub);
1625
2192
  return k.pub;
1626
2193
  });
1627
2194
  }
1628
2195
  if (signingParams.txPrebuild.txRequestId) {
1629
- assert_1.default(this.tssUtils, 'tssUtils must be defined for TSS wallets');
1630
- const txRequest = await this.tssUtils.getTxRequest(signingParams.txPrebuild.txRequestId);
2196
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined for TSS wallets');
2197
+ const txRequest = await this.tssUtils.getTxRequest(signingParams.txPrebuild.txRequestId, params.reqId);
1631
2198
  if (this.tssUtils.isPendingApprovalTxRequestFull(txRequest)) {
1632
2199
  return txRequest;
1633
2200
  }
@@ -1646,19 +2213,73 @@ class Wallet {
1646
2213
  confirmedBalance: this.confirmedBalance(),
1647
2214
  spendableBalance: this.spendableBalance(),
1648
2215
  };
1649
- error.txParams = _.omit(params, ['keychain', 'prv', 'passphrase', 'walletPassphrase', 'key']);
2216
+ error.txParams = {
2217
+ ..._.omit(params, ['keychain', 'prv', 'passphrase', 'walletPassphrase', 'key', 'wallet']),
2218
+ wallet: {
2219
+ ...this,
2220
+ bitgo: _.omit(this.bitgo, ['_token']),
2221
+ },
2222
+ };
1650
2223
  }
1651
2224
  throw error;
1652
2225
  }
1653
2226
  }
1654
2227
  /**
1655
- * Accelerate a transaction's confirmation using Child-Pays-For-Parent (CPFP)
2228
+ * Accelerate a transaction's confirmation using Child-Pays-For-Parent (CPFP) or Replace-By-Fee (RBF)
1656
2229
  * @param params
1657
2230
  */
1658
2231
  async accelerateTransaction(params = {}) {
2232
+ this.validateAccelerationParams(params);
2233
+ params.recipients = [];
2234
+ return await this.submitTransaction({
2235
+ ...(await this.prebuildAndSignTransaction(params)),
2236
+ ...BuildParams_1.BuildParams.encode(params),
2237
+ });
2238
+ }
2239
+ validateAccelerationParams(params) {
2240
+ if (!params.cpfpTxIds && !params.rbfTxIds) {
2241
+ const error = new Error('must pass cpfpTxIds or rbfTxIds');
2242
+ error.code = 'cpfptxids_or_rbftxids_required';
2243
+ throw error;
2244
+ }
2245
+ if (params.cpfpTxIds && params.rbfTxIds) {
2246
+ const error = new Error('cannot specify both cpfpTxIds and rbfTxIds');
2247
+ error.code = 'cannot_specify_both_cpfp_and_rbf_txids';
2248
+ throw error;
2249
+ }
2250
+ if (params.cpfpTxIds) {
2251
+ this.validateCpfpParams(params);
2252
+ }
2253
+ if (params.rbfTxIds) {
2254
+ this.validateRbfParams(params);
2255
+ }
2256
+ if (params.recipients !== undefined) {
2257
+ if (!Array.isArray(params.recipients) || params.recipients.length !== 0) {
2258
+ throw new Error(`invalid value for 'recipients': must be empty array when set`);
2259
+ }
2260
+ }
2261
+ }
2262
+ validateRbfParams(params) {
2263
+ if (!Array.isArray(params.rbfTxIds) || params.rbfTxIds.length !== 1) {
2264
+ const error = new Error('expecting rbfTxIds to be an array of length 1');
2265
+ error.code = 'rbftxids_not_array';
2266
+ throw error;
2267
+ }
2268
+ if (!params.feeMultiplier) {
2269
+ const error = new Error('feeMultiplier must be set');
2270
+ error.code = 'feemultiplier_not_set';
2271
+ throw error;
2272
+ }
2273
+ if (params.feeMultiplier <= 1) {
2274
+ const error = new Error('feeMultiplier must be a greater than 1');
2275
+ error.code = 'feemultiplier_greater_than_one';
2276
+ throw error;
2277
+ }
2278
+ }
2279
+ validateCpfpParams(params) {
1659
2280
  // TODO(BG-9349): change the last check to > 0 and the error message once platform allows multiple transactions to
1660
- // be bumped in the same CPFP transaction
1661
- if (_.isUndefined(params.cpfpTxIds) || !Array.isArray(params.cpfpTxIds) || params.cpfpTxIds.length !== 1) {
2281
+ // be bumped in the same CPFP transaction
2282
+ if (!Array.isArray(params.cpfpTxIds) || params.cpfpTxIds.length !== 1) {
1662
2283
  const error = new Error('expecting cpfpTxIds to be an array of length 1');
1663
2284
  error.code = 'cpfptxids_not_array';
1664
2285
  throw error;
@@ -1691,24 +2312,15 @@ class Wallet {
1691
2312
  throw error;
1692
2313
  }
1693
2314
  }
1694
- if (params.recipients !== undefined) {
1695
- if (!Array.isArray(params.recipients) || params.recipients.length !== 0) {
1696
- throw new Error(`invalid value for 'recipients': must be empty array when set`);
1697
- }
1698
- }
1699
- params.recipients = [];
1700
- return await this.submitTransaction({
1701
- ...(await this.prebuildAndSignTransaction(params)),
1702
- ...BuildParams_1.BuildParams.encode(params),
1703
- });
1704
2315
  }
1705
2316
  /**
1706
2317
  * Submit a half-signed transaction to BitGo
1707
2318
  * @param params
1708
2319
  * - txHex: transaction hex to submit
1709
2320
  * - halfSigned: object containing transaction (txHex or txBase64) to submit
2321
+ * @param reqId - request tracer request id
1710
2322
  */
1711
- async submitTransaction(params = {}) {
2323
+ async submitTransaction(params = {}, reqId) {
1712
2324
  common.validateParams(params, [], ['otp', 'txHex', 'txRequestId']);
1713
2325
  const hasTxHex = !!params.txHex;
1714
2326
  const hasHalfSigned = !!params.halfSigned;
@@ -1718,7 +2330,7 @@ class Wallet {
1718
2330
  else if (!params.txRequestId && ((hasTxHex && hasHalfSigned) || (!hasTxHex && !hasHalfSigned))) {
1719
2331
  throw new Error('must supply either txHex or halfSigned, but not both');
1720
2332
  }
1721
- return this.sendTransaction(params);
2333
+ return this.sendTransaction(params, reqId);
1722
2334
  }
1723
2335
  /**
1724
2336
  * Send coins to a recipient
@@ -1743,13 +2355,15 @@ class Wallet {
1743
2355
  throw new Error('missing required parameter address');
1744
2356
  }
1745
2357
  const coin = this.baseCoin;
1746
- const amount = new bignumber_js_1.BigNumber(params.amount);
1747
- if (amount.isNegative()) {
1748
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1749
- }
1750
- if (!coin.valuelessTransferAllowed() && amount.isZero()) {
1751
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1752
- }
2358
+ const amount = new bignumber_js_1.default(params.amount);
2359
+ const isAmountNegative = amount.isNegative();
2360
+ const isAmountZero = amount.isZero();
2361
+ const isAmountDecimal = !amount.isInteger();
2362
+ _.some([isAmountNegative, !coin.valuelessTransferAllowed() && isAmountZero, isAmountDecimal], (condition) => {
2363
+ if (condition) {
2364
+ throw new Error('invalid argument for amount - Integer greater than zero or numeric string expected');
2365
+ }
2366
+ });
1753
2367
  const recipients = [
1754
2368
  {
1755
2369
  address: params.address,
@@ -1762,9 +2376,125 @@ class Wallet {
1762
2376
  if (params.data && coin.transactionDataAllowed()) {
1763
2377
  recipients[0].data = params.data;
1764
2378
  }
1765
- const sendManyOptions = Object.assign({}, params, { recipients });
2379
+ const sendManyOptions = Object.assign({}, params, {
2380
+ recipients,
2381
+ });
1766
2382
  return this.sendMany(sendManyOptions);
1767
2383
  }
2384
+ /**
2385
+ * Send an ERC-721 NFT or ERC-1155 NFT(s).
2386
+ *
2387
+ * This function constructs the appropriate call data for an ERC-721/1155 token transfer,
2388
+ * and calls the token contract with the data, and amount 0. This transaction will always produce
2389
+ * a pending approval.
2390
+ *
2391
+ * @param sendOptions Options to specify how the transaction should be sent.
2392
+ * @param sendNftOptions Options to specify the NFT(s) to be sent.
2393
+ *
2394
+ * @return A pending approval for the transaction.
2395
+ */
2396
+ async sendNft(sendOptions, sendNftOptions) {
2397
+ const nftCollections = await this.getNftBalances();
2398
+ const { tokenContractAddress, recipientAddress, type } = sendNftOptions;
2399
+ const nftBalance = nftCollections.find((c) => c.metadata.tokenContractAddress === tokenContractAddress);
2400
+ if (!nftBalance) {
2401
+ throw new Error(`Collection not found for token contract ${tokenContractAddress}`);
2402
+ }
2403
+ if (!this.baseCoin.isValidAddress(recipientAddress)) {
2404
+ throw new Error(`Invalid recipient address ${recipientAddress}`);
2405
+ }
2406
+ const baseAddress = this.coinSpecific()?.baseAddress || this.coinSpecific()?.rootAddress;
2407
+ if (!baseAddress) {
2408
+ throw new Error('Missing base address for wallet');
2409
+ }
2410
+ if (nftBalance.type !== type) {
2411
+ throw new Error(`Specified NFT type ${type} does not match collection type ${nftBalance.type}`);
2412
+ }
2413
+ switch (sendNftOptions.type) {
2414
+ case 'ERC721': {
2415
+ if (!nftBalance.collections[sendNftOptions.tokenId]) {
2416
+ throw new Error(`Token ${sendNftOptions.tokenId} not found in collection ${tokenContractAddress} or does not have a spendable balance`);
2417
+ }
2418
+ const data = this.baseCoin.buildNftTransferData({
2419
+ ...sendNftOptions,
2420
+ fromAddress: baseAddress,
2421
+ });
2422
+ let recipient;
2423
+ if (this.baseCoin.getFamily() === 'vet') {
2424
+ recipient = {
2425
+ address: recipientAddress,
2426
+ amount: '1',
2427
+ tokenData: data,
2428
+ };
2429
+ }
2430
+ else if (this.baseCoin.getFamily() === 'hbarevm') {
2431
+ recipient = {
2432
+ address: sendNftOptions.tokenContractAddress,
2433
+ amount: '0',
2434
+ data,
2435
+ tokenName: nftBalance.metadata.name,
2436
+ };
2437
+ }
2438
+ else {
2439
+ recipient = {
2440
+ address: sendNftOptions.tokenContractAddress,
2441
+ amount: '0',
2442
+ data,
2443
+ };
2444
+ }
2445
+ return this.sendMany({
2446
+ ...sendOptions,
2447
+ recipients: [recipient],
2448
+ });
2449
+ }
2450
+ case 'ERC1155': {
2451
+ const entries = sendNftOptions.entries;
2452
+ for (const entry of entries) {
2453
+ if (!nftBalance.collections[entry.tokenId]) {
2454
+ throw new Error(`Token ${entry.tokenId} not found in collection ${sendNftOptions.tokenContractAddress} or does not have a spendable balance`);
2455
+ }
2456
+ if (nftBalance.collections[entry.tokenId] < entry.amount) {
2457
+ throw new Error(`Amount ${entry.amount} exceeds spendable balance of ${nftBalance.collections[entry.tokenId]} for token ${entry.tokenId}`);
2458
+ }
2459
+ }
2460
+ const data = this.baseCoin.buildNftTransferData({
2461
+ ...sendNftOptions,
2462
+ fromAddress: baseAddress,
2463
+ });
2464
+ return this.sendMany({
2465
+ ...sendOptions,
2466
+ recipients: [
2467
+ {
2468
+ address: sendNftOptions.tokenContractAddress,
2469
+ amount: '0',
2470
+ data: data,
2471
+ },
2472
+ ],
2473
+ });
2474
+ }
2475
+ case utils_1.TokenType.DIGITAL_ASSET: {
2476
+ if (!nftBalance.collections[sendNftOptions.tokenId]) {
2477
+ throw new Error(`Token ${sendNftOptions.tokenId} not found in collection ${tokenContractAddress} or does not have a spendable balance`);
2478
+ }
2479
+ const tokenData = {
2480
+ tokenType: sendNftOptions.type,
2481
+ tokenQuantity: '1', // This NFT standard will always have quantity of 1
2482
+ tokenContractAddress,
2483
+ tokenId: sendNftOptions.tokenId,
2484
+ };
2485
+ return this.sendMany({
2486
+ ...sendOptions,
2487
+ recipients: [
2488
+ {
2489
+ address: recipientAddress,
2490
+ amount: '1', // the amount needs to be non-zero for the transaction to be valid, it is ignored
2491
+ tokenData,
2492
+ },
2493
+ ],
2494
+ });
2495
+ }
2496
+ }
2497
+ }
1768
2498
  /**
1769
2499
  * Send money to multiple recipients
1770
2500
  * 1. Gets the user keychain by checking the wallet for a key which has an encrypted prv
@@ -1806,28 +2536,23 @@ class Wallet {
1806
2536
  this.bitgo.setRequestTracer(reqId);
1807
2537
  const coin = this.baseCoin;
1808
2538
  if (_.isObject(params.recipients)) {
1809
- params.recipients.map(function (recipient) {
1810
- const amount = new bignumber_js_1.BigNumber(recipient.amount);
1811
- if (amount.isNegative()) {
1812
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1813
- }
1814
- if (!coin.valuelessTransferAllowed() && amount.isZero()) {
1815
- throw new Error('invalid argument for amount - positive number greater than zero or numeric string expected');
1816
- }
2539
+ params.recipients.forEach(function (recipient) {
2540
+ coin.checkRecipient(recipient);
1817
2541
  });
1818
2542
  }
1819
2543
  if (this._wallet.multisigType === 'tss') {
1820
- return this.sendManyTss(params);
2544
+ return this.sendManyTxRequests(params);
1821
2545
  }
1822
2546
  const selectParams = _.pick(params, [...this.prebuildWhitelistedParams(), 'comment', 'otp', 'hop']);
1823
2547
  if (this._wallet.type === 'custodial') {
1824
2548
  const extraParams = await this.baseCoin.getExtraPrebuildParams(Object.assign(params, { wallet: this }));
1825
2549
  Object.assign(selectParams, extraParams);
1826
- return this.initiateTransaction(selectParams);
2550
+ return this.initiateTransaction(selectParams, reqId);
1827
2551
  }
1828
2552
  const halfSignedTransaction = await this.prebuildAndSignTransaction(params);
1829
- const finalTxParams = _.extend({}, halfSignedTransaction, selectParams);
1830
- return this.sendTransaction(finalTxParams);
2553
+ const extraParams = await this.baseCoin.getExtraPrebuildParams(Object.assign(params, { wallet: this }));
2554
+ const finalTxParams = _.extend({}, halfSignedTransaction, selectParams, extraParams);
2555
+ return this.sendTransaction(finalTxParams, reqId);
1831
2556
  }
1832
2557
  /**
1833
2558
  * Recover an unsupported token from a BitGo multisig wallet
@@ -1976,17 +2701,34 @@ class Wallet {
1976
2701
  if (this.baseCoin.getFamily() !== 'ofc') {
1977
2702
  throw new Error('Can only convert an Offchain (OFC) wallet to a trading account');
1978
2703
  }
1979
- return new tradingAccount_1.TradingAccount(this._wallet.enterprise, this, this.bitgo);
2704
+ return new trading_1.TradingAccount(this._wallet.enterprise, this, this.bitgo);
2705
+ }
2706
+ /**
2707
+ * Get the address book for this wallet
2708
+ */
2709
+ toAddressBook() {
2710
+ if (this.baseCoin.getFamily() !== 'ofc') {
2711
+ throw new Error('Can only use an Offchain (OFC) wallet for the address book');
2712
+ }
2713
+ return new address_book_1.AddressBook(this._wallet.enterprise, this.bitgo, this);
1980
2714
  }
1981
2715
  /**
1982
2716
  * Create a staking wallet from this wallet
1983
2717
  */
1984
2718
  toStakingWallet() {
1985
- var _a;
1986
- const isEthTss = this.baseCoin.getFamily() == 'eth' && ((_a = this._wallet.coinSpecific) === null || _a === void 0 ? void 0 : _a.walletVersion)
2719
+ const isEthTss = this.baseCoin.getFamily() == 'eth' && this._wallet.coinSpecific?.walletVersion
1987
2720
  ? this._wallet.coinSpecific.walletVersion >= 3
1988
2721
  : false;
1989
- return new stakingWallet_1.StakingWallet(this, isEthTss);
2722
+ return new staking_1.StakingWallet(this, isEthTss);
2723
+ }
2724
+ /**
2725
+ * Create a go staking wallet from this wallet
2726
+ */
2727
+ toGoStakingWallet() {
2728
+ if (this.baseCoin.getFamily() !== 'ofc') {
2729
+ throw new Error('Can only convert an Offchain (OFC) wallet to a staking wallet');
2730
+ }
2731
+ return new staking_1.GoStakingWallet(this);
1990
2732
  }
1991
2733
  /**
1992
2734
  * Creates and downloads PDF keycard for wallet (requires response from wallets.generateWallet)
@@ -2041,7 +2783,7 @@ class Wallet {
2041
2783
  const coinShortName = this.baseCoin.type;
2042
2784
  const coinName = this.baseCoin.getFullName();
2043
2785
  const walletLabel = this._wallet.label;
2044
- const doc = keycard_1.drawKeycard({
2786
+ const doc = (0, internal_1.drawKeycard)({
2045
2787
  jsPDF,
2046
2788
  QRCode,
2047
2789
  encrypt: this.bitgo.encrypt,
@@ -2080,10 +2822,16 @@ class Wallet {
2080
2822
  .post(this.baseCoin.url('/wallet/' + this.id() + '/consolidateAccount/build'))
2081
2823
  .send(whitelistedParams)
2082
2824
  .result());
2825
+ if (buildResponse.length === 0) {
2826
+ throw new Error('No receive addresses with balance found to consolidate.');
2827
+ }
2083
2828
  // we need to step over each prebuild now - should be in an array in the body
2084
2829
  const consolidations = [];
2085
2830
  for (const consolidateAccountBuild of buildResponse) {
2086
- let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(consolidateAccountBuild, { wallet: this, buildParams: whitelistedParams })));
2831
+ let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(consolidateAccountBuild, {
2832
+ wallet: this,
2833
+ buildParams: whitelistedParams,
2834
+ })));
2087
2835
  delete prebuild.wallet;
2088
2836
  delete prebuild.buildParams;
2089
2837
  prebuild = _.extend({}, prebuild, { walletId: this.id() });
@@ -2105,7 +2853,7 @@ class Wallet {
2105
2853
  }
2106
2854
  if (this._wallet.type === 'custodial' && this._wallet.multisigType !== 'tss') {
2107
2855
  params.type = 'consolidate';
2108
- return this.initiateTransaction(params);
2856
+ return this.initiateTransaction(params, params.reqId);
2109
2857
  }
2110
2858
  // one of a set of consolidation transactions
2111
2859
  if (typeof params.prebuildTx === 'string' || params.prebuildTx === undefined) {
@@ -2118,13 +2866,13 @@ class Wallet {
2118
2866
  if (!params.prebuildTx.txRequestId) {
2119
2867
  throw new Error('Consolidation request missing txRequestId.');
2120
2868
  }
2121
- return await this.sendManyTss(params);
2869
+ return await this.sendManyTxRequests(params);
2122
2870
  }
2123
2871
  const signedPrebuild = (await this.prebuildAndSignTransaction(params));
2124
2872
  // decorate with our consolidation id
2125
2873
  signedPrebuild.consolidateId = params.prebuildTx.consolidateId;
2126
2874
  delete signedPrebuild.wallet;
2127
- return await this.submitTransaction(signedPrebuild);
2875
+ return await this.submitTransaction(signedPrebuild, params.reqId);
2128
2876
  }
2129
2877
  /**
2130
2878
  * Builds and sends a set of account consolidations. This is intended to flush many balances to the root wallet balance.
@@ -2135,22 +2883,53 @@ class Wallet {
2135
2883
  if (!this.baseCoin.allowsAccountConsolidations()) {
2136
2884
  throw new Error(`${this.baseCoin.getFullName()} does not allow account consolidations.`);
2137
2885
  }
2886
+ const apiVersion = params.apiVersion ??
2887
+ (this.tssUtils && this.tssUtils.supportedTxRequestVersions().includes('full') ? 'full' : undefined);
2888
+ // Doing a sanity check for password here to avoid doing further work if we know it's wrong
2889
+ await this.getKeychainsAndValidatePassphrase({
2890
+ reqId: params.reqId,
2891
+ walletPassphrase: params.walletPassphrase,
2892
+ customSigningFunction: params.customSigningFunction,
2893
+ });
2138
2894
  // this gives us a set of account consolidation transactions
2139
- const unsignedBuilds = (await this.buildAccountConsolidations(params));
2895
+ const unsignedBuilds = await this.buildAccountConsolidations({
2896
+ ...params,
2897
+ apiVersion: apiVersion,
2898
+ });
2140
2899
  if (unsignedBuilds && unsignedBuilds.length > 0) {
2900
+ // Get wallet's base address to validate destination addresses
2901
+ const baseAddress = this._wallet.coinSpecific?.baseAddress || this._wallet.coinSpecific?.rootAddress;
2902
+ // Validate all transactions
2903
+ for (const build of unsignedBuilds) {
2904
+ if (baseAddress) {
2905
+ debug('verifying txHex', JSON.stringify(build));
2906
+ //Verify transactions send funds to the base address
2907
+ if (!(await this.baseCoin.verifyTransaction({
2908
+ txPrebuild: build,
2909
+ txParams: params,
2910
+ verification: {
2911
+ consolidationToBaseAddress: true,
2912
+ },
2913
+ wallet: this,
2914
+ walletType: this._wallet.multisigType,
2915
+ }))) {
2916
+ throw new Error('Found output that does not consolidate funds to base address');
2917
+ }
2918
+ }
2919
+ }
2141
2920
  const successfulTxs = [];
2142
- const failedTxs = new Array();
2921
+ const failedTxs = [];
2143
2922
  for (const unsignedBuild of unsignedBuilds) {
2144
2923
  // fold any of the parameters we used to build this transaction into the unsignedBuild
2145
2924
  const unsignedBuildWithOptions = Object.assign({}, params);
2925
+ unsignedBuildWithOptions.apiVersion = apiVersion;
2146
2926
  unsignedBuildWithOptions.prebuildTx = unsignedBuild;
2147
2927
  try {
2148
2928
  const sendTx = await this.sendAccountConsolidation(unsignedBuildWithOptions);
2149
2929
  successfulTxs.push(sendTx);
2150
2930
  }
2151
2931
  catch (e) {
2152
- console.dir(e);
2153
- failedTxs.push(e);
2932
+ failedTxs.push({ message: e.message, name: e.name });
2154
2933
  }
2155
2934
  }
2156
2935
  return {
@@ -2159,6 +2938,206 @@ class Wallet {
2159
2938
  };
2160
2939
  }
2161
2940
  }
2941
+ /**
2942
+ * Shared build logic for resource delegation and undelegation.
2943
+ * POSTs to the given endpoint and post-processes each prebuild.
2944
+ */
2945
+ async buildResourceManagementTransactions(type, params) {
2946
+ if (!this.baseCoin.supportsResourceDelegation()) {
2947
+ throw new Error(`${this.baseCoin.getFullName()} does not support resource delegation.`);
2948
+ }
2949
+ if (type === 'delegateResource') {
2950
+ const delegationParams = params;
2951
+ if (!delegationParams.delegations || delegationParams.delegations.length === 0) {
2952
+ throw new Error('delegations must be a non-empty array.');
2953
+ }
2954
+ }
2955
+ else {
2956
+ const undelegationParams = params;
2957
+ if (!undelegationParams.undelegations || undelegationParams.undelegations.length === 0) {
2958
+ throw new Error('undelegations must be a non-empty array.');
2959
+ }
2960
+ }
2961
+ const endpoint = type === 'delegateResource' ? '/delegateResources/build' : '/undelegateResources/build';
2962
+ const whitelistedParams = type === 'delegateResource'
2963
+ ? _.pick(params, ['delegations', 'apiVersion'])
2964
+ : _.pick(params, ['undelegations', 'apiVersion']);
2965
+ debug('prebuilding resource management transactions (%s): %O', endpoint, whitelistedParams);
2966
+ if (params.reqId) {
2967
+ this.bitgo.setRequestTracer(params.reqId);
2968
+ }
2969
+ const buildResponse = (await this.bitgo
2970
+ .post(this.baseCoin.url('/wallet/' + this.id() + endpoint))
2971
+ .send(whitelistedParams)
2972
+ .result());
2973
+ if (!Array.isArray(buildResponse.transactions)) {
2974
+ throw new Error(`Unexpected response from ${endpoint}: missing transactions array`);
2975
+ }
2976
+ const buildFailures = [];
2977
+ if (buildResponse.errors?.length > 0) {
2978
+ debug('build errors from %s: %O', endpoint, buildResponse.errors);
2979
+ for (const err of buildResponse.errors) {
2980
+ buildFailures.push({
2981
+ message: err.error ?? err.message ?? String(err),
2982
+ receiverAddress: err.receiverAddress,
2983
+ });
2984
+ }
2985
+ }
2986
+ const prebuilds = [];
2987
+ for (const rawTx of buildResponse.transactions) {
2988
+ let prebuild = (await this.baseCoin.postProcessPrebuild(Object.assign(rawTx, { wallet: this, buildParams: params })));
2989
+ delete prebuild.wallet;
2990
+ delete prebuild.buildParams;
2991
+ prebuild = _.extend({}, prebuild, { walletId: this.id() });
2992
+ debug('final resource management transaction prebuild: %O', prebuild);
2993
+ prebuilds.push(prebuild);
2994
+ }
2995
+ return { prebuilds, buildFailures };
2996
+ }
2997
+ /**
2998
+ * Shared signing logic for a single resource management transaction (delegation or undelegation).
2999
+ * Signing flow by wallet type (mirrors sendAccountConsolidation):
3000
+ * - TSS (hot or custodial) → sendManyTxRequests (requires txRequestId on prebuildTx)
3001
+ * - Custodial non-TSS → initiateTransaction (BitGo auto-signs with its key)
3002
+ * - Hot non-TSS → prebuildAndSignTransaction + submitTransaction
3003
+ */
3004
+ async sendResourceManagementTransaction(type, params) {
3005
+ // Custodial non-TSS: BitGo holds the key, send for BitGo approval and signing.
3006
+ // The /tx/initiate API builds and signs server-side. Promote stakingParams and
3007
+ // recipients from the prebuild to the top level so they survive the TxSendBody
3008
+ // whitelist applied inside initiateTransaction.
3009
+ if (this._wallet.type === 'custodial' && this._wallet.multisigType !== 'tss') {
3010
+ params.type = type;
3011
+ if (typeof params.prebuildTx === 'object' && params.prebuildTx) {
3012
+ if (params.prebuildTx.stakingParams) {
3013
+ params.stakingParams = params.prebuildTx.stakingParams;
3014
+ }
3015
+ if (params.prebuildTx.recipients) {
3016
+ params.recipients = params.prebuildTx.recipients;
3017
+ }
3018
+ }
3019
+ return this.initiateTransaction(params, params.reqId);
3020
+ }
3021
+ if (typeof params.prebuildTx === 'string' || params.prebuildTx === undefined) {
3022
+ throw new Error('Invalid prebuild for resource management transaction.');
3023
+ }
3024
+ // TSS path (hot or custodial): signing service holds the key shares
3025
+ if (this._wallet.multisigType === 'tss') {
3026
+ if (!params.prebuildTx.txRequestId) {
3027
+ throw new Error('Resource management request missing txRequestId for TSS wallet.');
3028
+ }
3029
+ return await this.sendManyTxRequests(params);
3030
+ }
3031
+ // Hot non-TSS: user holds the key, sign locally and submit
3032
+ const signedPrebuild = (await this.prebuildAndSignTransaction(params));
3033
+ delete signedPrebuild.wallet;
3034
+ // Relay stakingParams from the prebuild so send.ts can populate it on the transfer document
3035
+ if (typeof params.prebuildTx === 'object' && params.prebuildTx.stakingParams) {
3036
+ signedPrebuild.stakingParams = params.prebuildTx.stakingParams;
3037
+ }
3038
+ return await this.submitTransaction(signedPrebuild, params.reqId);
3039
+ }
3040
+ /**
3041
+ * Shared build → sign → send loop for resource delegation and undelegation.
3042
+ * Validates the wallet passphrase upfront, then sends each transaction individually.
3043
+ * Returns { success, failure } so partial success is handled gracefully.
3044
+ */
3045
+ async sendResourceManagementTransactions(type, params) {
3046
+ if (!this.baseCoin.supportsResourceDelegation()) {
3047
+ throw new Error(`${this.baseCoin.getFullName()} does not support resource delegation.`);
3048
+ }
3049
+ const apiVersion = params.apiVersion ??
3050
+ (this.tssUtils && this.tssUtils.supportedTxRequestVersions().includes('full') ? 'full' : undefined);
3051
+ // Validate passphrase upfront to fail fast before building N transactions
3052
+ await this.getKeychainsAndValidatePassphrase({
3053
+ reqId: params.reqId,
3054
+ walletPassphrase: params.walletPassphrase,
3055
+ customSigningFunction: params.customSigningFunction,
3056
+ });
3057
+ const { prebuilds: unsignedBuilds, buildFailures } = await this.buildResourceManagementTransactions(type, {
3058
+ ...params,
3059
+ apiVersion,
3060
+ });
3061
+ const successfulTxs = [];
3062
+ const failedTxs = [...buildFailures];
3063
+ const entries = type === 'delegateResource'
3064
+ ? params.delegations
3065
+ : params.undelegations;
3066
+ for (let i = 0; i < unsignedBuilds.length; i++) {
3067
+ const unsignedBuild = unsignedBuilds[i];
3068
+ const receiverAddress = entries[i]?.receiverAddress;
3069
+ const unsignedBuildWithOptions = {
3070
+ ...params,
3071
+ apiVersion,
3072
+ prebuildTx: unsignedBuild,
3073
+ };
3074
+ try {
3075
+ const sendTx = await this.sendResourceManagementTransaction(type, unsignedBuildWithOptions);
3076
+ successfulTxs.push(sendTx);
3077
+ }
3078
+ catch (e) {
3079
+ const message = e instanceof Error ? e.message : String(e);
3080
+ failedTxs.push({ message, receiverAddress });
3081
+ }
3082
+ }
3083
+ return { success: successfulTxs, failure: failedTxs };
3084
+ }
3085
+ /**
3086
+ * Builds a set of resource delegation transactions for the given delegation entries.
3087
+ * Each entry delegates resources (e.g. ENERGY, BANDWIDTH) from this wallet's root address
3088
+ * to a receiver address. Modelled after buildAccountConsolidations.
3089
+ *
3090
+ * @param params.delegations - Array of { receiverAddress, amount, resource } entries
3091
+ * @returns Unsigned prebuild transaction results, one per delegation entry
3092
+ */
3093
+ async buildResourceDelegations(params) {
3094
+ return this.buildResourceManagementTransactions('delegateResource', params);
3095
+ }
3096
+ /**
3097
+ * Signs and sends a single resource delegation transaction.
3098
+ * @param params.prebuildTx - A single prebuild result from buildResourceDelegations
3099
+ */
3100
+ async sendResourceDelegation(params = {}) {
3101
+ if (!this.baseCoin.supportsResourceDelegation()) {
3102
+ throw new Error(`${this.baseCoin.getFullName()} does not support resource delegation.`);
3103
+ }
3104
+ return this.sendResourceManagementTransaction('delegateResource', params);
3105
+ }
3106
+ /**
3107
+ * Builds, signs, and sends all resource delegation transactions in a single call.
3108
+ * @param params.delegations - Array of { receiverAddress, amount, resource } entries
3109
+ */
3110
+ async sendResourceDelegations(params) {
3111
+ return this.sendResourceManagementTransactions('delegateResource', params);
3112
+ }
3113
+ /**
3114
+ * Builds a set of resource undelegation transactions for the given entries.
3115
+ * Each entry reclaims delegated resources from this wallet's root address back from
3116
+ * a receiver address. Modelled after buildResourceDelegations.
3117
+ *
3118
+ * @param params.undelegations - Array of { receiverAddress, amount, resource } entries
3119
+ * @returns Unsigned prebuild transaction results, one per undelegation entry
3120
+ */
3121
+ async buildResourceUndelegations(params) {
3122
+ return this.buildResourceManagementTransactions('undelegateResource', params);
3123
+ }
3124
+ /**
3125
+ * Signs and sends a single resource undelegation transaction.
3126
+ * @param params.prebuildTx - A single prebuild result from buildResourceUndelegations
3127
+ */
3128
+ async sendResourceUndelegation(params = {}) {
3129
+ if (!this.baseCoin.supportsResourceDelegation()) {
3130
+ throw new Error(`${this.baseCoin.getFullName()} does not support resource delegation.`);
3131
+ }
3132
+ return this.sendResourceManagementTransaction('undelegateResource', params);
3133
+ }
3134
+ /**
3135
+ * Builds, signs, and sends all resource undelegation transactions in a single call.
3136
+ * @param params.undelegations - Array of { receiverAddress, amount, resource } entries
3137
+ */
3138
+ async sendResourceUndelegations(params) {
3139
+ return this.sendResourceManagementTransactions('undelegateResource', params);
3140
+ }
2162
3141
  /**
2163
3142
  * Builds a set of transactions that enables the specified tokens
2164
3143
  * @param params -
@@ -2170,6 +3149,10 @@ class Wallet {
2170
3149
  if (!teConfig.requiresTokenEnablement) {
2171
3150
  throw new Error(`${this.baseCoin.getFullName()} does not require token enablements`);
2172
3151
  }
3152
+ // Validate wallet type if coin requires it
3153
+ if (typeof teConfig.validateWallet === 'function' && this._wallet.type) {
3154
+ teConfig.validateWallet(this._wallet.type);
3155
+ }
2173
3156
  if (params.enableTokens.length === 0) {
2174
3157
  throw new Error('No tokens are being specified');
2175
3158
  }
@@ -2191,7 +3174,9 @@ class Wallet {
2191
3174
  return results.flat();
2192
3175
  }
2193
3176
  const buildParams = _.pick(params, this.prebuildWhitelistedParams());
2194
- buildParams.type = 'enabletoken';
3177
+ if (!buildParams.type) {
3178
+ buildParams.type = 'enabletoken';
3179
+ }
2195
3180
  // Check if we build with intent
2196
3181
  if (this._wallet.multisigType === 'tss') {
2197
3182
  return [await this.prebuildTransaction(buildParams)];
@@ -2199,11 +3184,10 @@ class Wallet {
2199
3184
  else {
2200
3185
  // Rewrite tokens into recipients for buildTransaction
2201
3186
  buildParams.recipients = params.enableTokens.map((token) => {
2202
- var _a, _b;
2203
3187
  // If token has non address, take the first wallet address is stored in its coin-specific property
2204
3188
  // In account-based coin implementations that use wallet contracts, the address is called baseAddress (e.g. eth-like, xtz)
2205
3189
  // for others it's called rootAddress (e.g. xrp, xlm, algo, trx)
2206
- const address = token.address || ((_a = this._wallet.coinSpecific) === null || _a === void 0 ? void 0 : _a.baseAddress) || ((_b = this._wallet.coinSpecific) === null || _b === void 0 ? void 0 : _b.rootAddress);
3190
+ const address = token.address || this._wallet.coinSpecific?.baseAddress || this._wallet.coinSpecific?.rootAddress;
2207
3191
  if (!address) {
2208
3192
  throw new Error('Wallet does not have base address, must specify with token param');
2209
3193
  }
@@ -2219,6 +3203,27 @@ class Wallet {
2219
3203
  return [prebuildTx];
2220
3204
  }
2221
3205
  }
3206
+ /**
3207
+ * Builds wallet initialization
3208
+ * @param {PrebuildTransactionOptions} params
3209
+ * @returns {Promise<PrebuildTransactionResult>}
3210
+ */
3211
+ async buildWalletInitialization(params) {
3212
+ if (!this.baseCoin.requiresWalletInitializationTransaction()) {
3213
+ throw new Error(`Wallet initialization is not required for ${this.baseCoin.getFullName()}`);
3214
+ }
3215
+ if (this._wallet.multisigType !== 'tss') {
3216
+ throw new Error('Wallet initialization transaction is only supported for TSS wallets');
3217
+ }
3218
+ if (params.reqId) {
3219
+ this.bitgo.setRequestTracer(params.reqId);
3220
+ }
3221
+ const buildParams = _.pick(params, this.prebuildWhitelistedParams());
3222
+ if (!buildParams.type) {
3223
+ buildParams.type = 'createAccount';
3224
+ }
3225
+ return await this.prebuildTransaction(buildParams);
3226
+ }
2222
3227
  /**
2223
3228
  * Signs and sends a single unsigned token enablement transaction
2224
3229
  * @param params
@@ -2227,25 +3232,31 @@ class Wallet {
2227
3232
  * - The response from initiating the transaction for custodial wallets
2228
3233
  */
2229
3234
  async sendTokenEnablement(params = {}) {
2230
- var _a, _b;
2231
3235
  const teConfig = this.baseCoin.getTokenEnablementConfig();
3236
+ params.verification = params.verification ?? {};
3237
+ params.verification.verifyTokenEnablement = params.verification.verifyTokenEnablement ?? true;
2232
3238
  if (!teConfig.requiresTokenEnablement) {
2233
3239
  throw new Error(`${this.baseCoin.getFullName()} does not require token enablement transactions`);
2234
3240
  }
2235
- if (typeof params.prebuildTx === 'string' || ((_b = (_a = params.prebuildTx) === null || _a === void 0 ? void 0 : _a.buildParams) === null || _b === void 0 ? void 0 : _b.type) !== 'enabletoken') {
3241
+ // Validate wallet type if coin requires it
3242
+ if (teConfig.validateWallet && this._wallet.type) {
3243
+ teConfig.validateWallet(this._wallet.type);
3244
+ }
3245
+ if (typeof params.prebuildTx === 'string' || params.prebuildTx?.buildParams?.type !== 'enabletoken') {
2236
3246
  throw new Error('Invalid build of token enablement.');
2237
3247
  }
2238
3248
  if (this._wallet.multisigType === 'tss') {
2239
- return await this.sendManyTss(params);
3249
+ return await this.sendManyTxRequests(params);
2240
3250
  }
2241
3251
  else {
2242
3252
  switch (this._wallet.type) {
2243
3253
  case 'hot':
2244
3254
  case 'cold':
2245
3255
  const signedPrebuild = await this.prebuildAndSignTransaction(params);
2246
- return await this.submitTransaction(signedPrebuild);
3256
+ return await this.submitTransaction(signedPrebuild, params.reqId);
2247
3257
  case 'custodial':
2248
- return this.initiateTransaction(params.prebuildTx.buildParams);
3258
+ case 'backing':
3259
+ return this.initiateTransaction(params.prebuildTx.buildParams, params.reqId);
2249
3260
  }
2250
3261
  }
2251
3262
  }
@@ -2283,13 +3294,30 @@ class Wallet {
2283
3294
  };
2284
3295
  }
2285
3296
  /**
2286
- * Create lightning for btc/tbtc from this wallet
3297
+ * The chain canton, requires the wallet to be initialized by sending out a transaction
3298
+ * to be onboarded onto the validator.
3299
+ * Builds, Signs and sends a transaction that initializes the canton wallet
3300
+ * @param params
2287
3301
  */
2288
- lightning() {
2289
- if (!this.baseCoin.supportsLightning()) {
2290
- throw new Error(`Lightning not supported for ${this.coin()}`);
3302
+ async sendWalletInitialization(params = {}) {
3303
+ const prebuildTx = await this.buildWalletInitialization(params);
3304
+ const unsignedBuildWithOptions = {
3305
+ ...params,
3306
+ prebuildTx,
3307
+ };
3308
+ const successfulTxs = [];
3309
+ const failedTxs = new Array();
3310
+ try {
3311
+ const sendTx = await this.sendManyTxRequests(unsignedBuildWithOptions);
3312
+ successfulTxs.push(sendTx);
3313
+ }
3314
+ catch (e) {
3315
+ failedTxs.push(e);
2291
3316
  }
2292
- return new lightning_1.Lightning(this.bitgo, this);
3317
+ return {
3318
+ success: successfulTxs,
3319
+ failure: failedTxs,
3320
+ };
2293
3321
  }
2294
3322
  /* MARK: TSS Helpers */
2295
3323
  /**
@@ -2297,34 +3325,34 @@ class Wallet {
2297
3325
  *
2298
3326
  * @param params prebuild transaction options
2299
3327
  */
2300
- async prebuildTransactionTss(params = {}) {
2301
- var _a, _b, _c;
3328
+ async prebuildTransactionTxRequests(params = {}) {
2302
3329
  const reqId = params.reqId || new utils_1.RequestTracer();
2303
3330
  this.bitgo.setRequestTracer(reqId);
2304
- if (params.apiVersion === 'lite' &&
2305
- (this._wallet.type === 'custodial' || this._wallet.type === 'cold' || this.baseCoin.getMPCAlgorithm() === 'ecdsa')) {
2306
- throw new Error(`Custodial and ECDSA MPC algorithm must always use 'full' api version`);
2307
- }
2308
- const apiVersion = params.apiVersion ||
2309
- (this._wallet.type === 'custodial' || this._wallet.type === 'cold' || this.baseCoin.getMPCAlgorithm() === 'ecdsa'
2310
- ? 'full'
2311
- : 'lite');
3331
+ const apiVersion = (0, txRequest_1.getTxRequestApiVersion)(this, params.apiVersion);
2312
3332
  // Two options different implementations of fees seems to now be supported, for now we will support both to be backwards compatible
2313
3333
  // TODO(BG-59685): deprecate one of these so that we have a single way to pass fees
2314
3334
  let feeOptions;
2315
3335
  if (params.feeOptions) {
2316
- feeOptions = params.feeOptions;
3336
+ feeOptions = params.feeToken ? { ...params.feeOptions, feeToken: params.feeToken } : params.feeOptions;
2317
3337
  }
2318
3338
  else if (params.gasPrice !== undefined || params.eip1559 !== undefined) {
2319
3339
  feeOptions =
2320
3340
  params.gasPrice !== undefined
2321
- ? { gasPrice: params.gasPrice, gasLimit: params.gasLimit }
3341
+ ? {
3342
+ gasPrice: params.gasPrice,
3343
+ gasLimit: params.gasLimit,
3344
+ ...(params.feeToken !== undefined && { feeToken: params.feeToken }),
3345
+ }
2322
3346
  : {
2323
- maxFeePerGas: Number((_a = params.eip1559) === null || _a === void 0 ? void 0 : _a.maxFeePerGas),
2324
- maxPriorityFeePerGas: Number((_b = params.eip1559) === null || _b === void 0 ? void 0 : _b.maxPriorityFeePerGas),
3347
+ maxFeePerGas: Number(params.eip1559?.maxFeePerGas),
3348
+ maxPriorityFeePerGas: Number(params.eip1559?.maxPriorityFeePerGas),
2325
3349
  gasLimit: params.gasLimit,
3350
+ ...(params.feeToken !== undefined && { feeToken: params.feeToken }),
2326
3351
  };
2327
3352
  }
3353
+ else if (params.feeToken !== undefined) {
3354
+ feeOptions = { feeToken: params.feeToken };
3355
+ }
2328
3356
  else if (params.gasLimit !== undefined) {
2329
3357
  feeOptions = { gasLimit: params.gasLimit };
2330
3358
  }
@@ -2343,7 +3371,11 @@ class Wallet {
2343
3371
  memo: params.memo,
2344
3372
  nonce: params.nonce,
2345
3373
  feeOptions,
3374
+ feeToken: params.feeToken,
2346
3375
  custodianTransactionId: params.custodianTransactionId,
3376
+ unspents: params.unspents,
3377
+ senderAddress: params.senderAddress,
3378
+ isTestTransaction: params.isTestTransaction,
2347
3379
  }, apiVersion, params.preview);
2348
3380
  break;
2349
3381
  case 'transfertoken':
@@ -2354,6 +3386,9 @@ class Wallet {
2354
3386
  recipients: params.recipients || [],
2355
3387
  nonce: params.nonce,
2356
3388
  feeOptions,
3389
+ feeToken: params.feeToken,
3390
+ unspents: params.unspents,
3391
+ sequenceId: params.sequenceId,
2357
3392
  }, apiVersion, params.preview);
2358
3393
  break;
2359
3394
  case 'enabletoken':
@@ -2365,6 +3400,14 @@ class Wallet {
2365
3400
  memo: params.memo,
2366
3401
  }, apiVersion, params.preview);
2367
3402
  break;
3403
+ case 'closeAssociatedTokenAccount':
3404
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3405
+ reqId,
3406
+ intentType: 'closeAssociatedTokenAccount',
3407
+ recipients: params.recipients || [],
3408
+ memo: params.memo,
3409
+ }, apiVersion, params.preview);
3410
+ break;
2368
3411
  case 'acceleration':
2369
3412
  txRequest = await this.tssUtils.prebuildTxWithIntent({
2370
3413
  reqId,
@@ -2373,6 +3416,7 @@ class Wallet {
2373
3416
  lowFeeTxid: params.lowFeeTxid,
2374
3417
  receiveAddress: params.receiveAddress,
2375
3418
  feeOptions,
3419
+ feeToken: params.feeToken,
2376
3420
  }, apiVersion, params.preview);
2377
3421
  break;
2378
3422
  case 'fillNonce':
@@ -2383,6 +3427,76 @@ class Wallet {
2383
3427
  nonce: params.nonce,
2384
3428
  receiveAddress: params.receiveAddress,
2385
3429
  feeOptions,
3430
+ feeToken: params.feeToken,
3431
+ }, apiVersion, params.preview);
3432
+ break;
3433
+ case 'tokenApproval':
3434
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3435
+ reqId,
3436
+ intentType: 'tokenApproval',
3437
+ tokenName: params.tokenName,
3438
+ feeToken: params.feeToken,
3439
+ }, apiVersion, params.preview);
3440
+ break;
3441
+ case 'createAccount':
3442
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3443
+ reqId,
3444
+ intentType: 'createAccount',
3445
+ recipients: params.recipients || [],
3446
+ }, apiVersion, params.preview);
3447
+ break;
3448
+ case 'transferAccept': {
3449
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3450
+ reqId,
3451
+ intentType: 'transferAccept',
3452
+ txRequestId: params.txRequestId,
3453
+ sequenceId: params.txRequestId,
3454
+ }, apiVersion, params.preview);
3455
+ break;
3456
+ }
3457
+ case 'transferReject': {
3458
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3459
+ reqId,
3460
+ intentType: 'transferReject',
3461
+ txRequestId: params.txRequestId,
3462
+ sequenceId: params.txRequestId,
3463
+ }, apiVersion, params.preview);
3464
+ break;
3465
+ }
3466
+ case 'transferOfferWithdrawn': {
3467
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3468
+ reqId,
3469
+ intentType: 'transferOfferWithdrawn',
3470
+ transferOfferId: params.transferOfferId,
3471
+ sequenceId: params.transferOfferId,
3472
+ }, apiVersion, params.preview);
3473
+ break;
3474
+ }
3475
+ case 'customTx':
3476
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3477
+ reqId,
3478
+ intentType: 'customTx',
3479
+ sequenceId: params.sequenceId,
3480
+ comment: params.comment,
3481
+ solInstructions: params.solInstructions,
3482
+ solVersionedTransactionData: params.solVersionedTransactionData,
3483
+ aptosCustomTransactionParams: params.aptosCustomTransactionParams,
3484
+ recipients: params.recipients || [],
3485
+ nonce: params.nonce,
3486
+ memo: params.memo,
3487
+ feeOptions,
3488
+ }, apiVersion, params.preview);
3489
+ break;
3490
+ case 'bridgeFunds':
3491
+ txRequest = await this.tssUtils.prebuildTxWithIntent({
3492
+ reqId,
3493
+ intentType: 'bridgeFunds',
3494
+ sequenceId: params.sequenceId,
3495
+ comment: params.comment,
3496
+ amount: params.intentAmount,
3497
+ nonce: params.nonce,
3498
+ feeOptions,
3499
+ feeToken: params.feeToken,
2386
3500
  }, apiVersion, params.preview);
2387
3501
  break;
2388
3502
  default:
@@ -2390,7 +3504,7 @@ class Wallet {
2390
3504
  }
2391
3505
  let unsignedTx;
2392
3506
  if (txRequest.apiVersion === 'full') {
2393
- if (((_c = txRequest.transactions) === null || _c === void 0 ? void 0 : _c.length) !== 1) {
3507
+ if (txRequest.transactions?.length !== 1) {
2394
3508
  throw new Error(`Expected a single unsigned tx for tx request with id: ${txRequest.txRequestId}`);
2395
3509
  }
2396
3510
  unsignedTx = txRequest.transactions[0].unsignedTx;
@@ -2409,6 +3523,9 @@ class Wallet {
2409
3523
  txHex: unsignedTx.serializedTxHex,
2410
3524
  buildParams: whitelistedParams,
2411
3525
  feeInfo: unsignedTx.feeInfo,
3526
+ ...(txRequest.pendingApprovalId && {
3527
+ pendingApprovalId: txRequest.pendingApprovalId,
3528
+ }),
2412
3529
  };
2413
3530
  }
2414
3531
  /**
@@ -2436,17 +3553,67 @@ class Wallet {
2436
3553
  if (!params.customGShareGeneratingFunction) {
2437
3554
  throw new Error('Generator function for G share required to sign transactions with External Signer.');
2438
3555
  }
2439
- assert_1.default(this.tssUtils, 'tssUtils must be defined');
3556
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
2440
3557
  // adding this to rebuild the transaction just before signing for EdDSA transaction using external signer
2441
- await this.tssUtils.deleteSignatureShares(txRequestId);
3558
+ const reqId = params.reqId || undefined;
3559
+ await this.tssUtils.deleteSignatureShares(txRequestId, reqId);
2442
3560
  try {
2443
- const signedTxRequest = await this.tssUtils.signEddsaTssUsingExternalSigner(txRequestId, params.customCommitmentGeneratingFunction, params.customRShareGeneratingFunction, params.customGShareGeneratingFunction);
3561
+ const signedTxRequest = await this.tssUtils.signEddsaTssUsingExternalSigner(txRequestId, params.customCommitmentGeneratingFunction, params.customRShareGeneratingFunction, params.customGShareGeneratingFunction, reqId);
2444
3562
  return signedTxRequest;
2445
3563
  }
2446
3564
  catch (e) {
2447
3565
  throw new Error('failed to sign transaction ' + e);
2448
3566
  }
2449
3567
  }
3568
+ /**
3569
+ * Signs and sends a transaction request from a TSS (hot) wallet, or a SMC (cold) wallet with an external signer.
3570
+ * Meant to be used for a transaction request where the signing process is aborted.
3571
+ *
3572
+ * @param params
3573
+ * txRequestId - The ID of the transaction request.
3574
+ * walletPassphrase - The passphrase for the wallet.
3575
+ * isTxRequestFull - Flag indicating if the transaction request is full.
3576
+ * @returns A promise that resolves to a SignedTransaction.
3577
+ */
3578
+ async signAndSendTxRequest(params) {
3579
+ if (params.isTxRequestFull) {
3580
+ await this.tssUtils?.deleteSignatureShares(params.txRequestId);
3581
+ }
3582
+ const ret = await this.getUserKeyAndSignTssTransaction({
3583
+ walletPassphrase: params.walletPassphrase,
3584
+ txRequestId: params.txRequestId,
3585
+ });
3586
+ if (!params.isTxRequestFull) {
3587
+ // It is assumed that if its not a full tx request, then it is a lite tx request
3588
+ const submitTx = await this.submitTransaction({
3589
+ txRequestId: params.txRequestId,
3590
+ });
3591
+ return submitTx;
3592
+ }
3593
+ return ret;
3594
+ }
3595
+ /**
3596
+ * Ensures signature shares are in a clean state before signing a transaction.
3597
+ * Automatically deletes signature shares for Full TxRequests before signing to prevent
3598
+ * issues with stale or partial signatures.
3599
+ * Use this for Express API and other integrations that need automatic cleanup of signatures.
3600
+ *
3601
+ * @param params - signing options
3602
+ * @returns signed transaction
3603
+ */
3604
+ async ensureCleanSigSharesAndSignTransaction(params = {}) {
3605
+ const txRequestId = params.txRequestId || params.txPrebuild?.txRequestId;
3606
+ if (txRequestId && this.tssUtils && this.multisigType() === 'tss') {
3607
+ const txRequest = await this.tssUtils.getTxRequest(txRequestId);
3608
+ // Always clean signature shares for Full TxRequests before signing
3609
+ const isFull = txRequest.apiVersion === 'full' &&
3610
+ ((txRequest.transactions ?? []).length > 0 || (txRequest.messages ?? []).length > 0);
3611
+ if (isFull) {
3612
+ await this.tssUtils.deleteSignatureShares(txRequestId);
3613
+ }
3614
+ }
3615
+ return this.signTransaction(params);
3616
+ }
2450
3617
  /**
2451
3618
  * Signs a transaction from a TSS ECDSA wallet using external signer.
2452
3619
  *
@@ -2476,11 +3643,10 @@ class Wallet {
2476
3643
  throw new Error('Generator function for S share required to sign transactions with External Signer.');
2477
3644
  }
2478
3645
  try {
2479
- assert_1.default(this.tssUtils, 'tssUtils must be defined');
3646
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
2480
3647
  const signedTxRequest = await this.tssUtils.signEcdsaTssUsingExternalSigner({
2481
3648
  txRequest: txRequestId,
2482
- prv: '',
2483
- reqId: new utils_1.RequestTracer(),
3649
+ reqId: params.reqId || new utils_1.RequestTracer(),
2484
3650
  }, utils_1.RequestType.tx, params.customPaillierModulusGeneratingFunction, params.customKShareGeneratingFunction, params.customMuDeltaShareGeneratingFunction, params.customSShareGeneratingFunction);
2485
3651
  return signedTxRequest;
2486
3652
  }
@@ -2488,6 +3654,43 @@ class Wallet {
2488
3654
  throw new Error('failed to sign transaction ' + e);
2489
3655
  }
2490
3656
  }
3657
+ /**
3658
+ * Signs a transaction from a TSS ECDSA wallet using external signer.
3659
+ *
3660
+ * @param params signing options
3661
+ */
3662
+ async signTransactionTssExternalSignerECDSAMPCv2(coin, params = {}) {
3663
+ let txRequestId = '';
3664
+ if (params.txRequestId) {
3665
+ txRequestId = params.txRequestId;
3666
+ }
3667
+ else if (params.txPrebuild && params.txPrebuild.txRequestId) {
3668
+ txRequestId = params.txPrebuild.txRequestId;
3669
+ }
3670
+ else {
3671
+ throw new Error('TxRequestId required to sign TSS transactions with External Signer.');
3672
+ }
3673
+ if (!params.customMPCv2SigningRound1GenerationFunction) {
3674
+ throw new Error('Generator function for MPCv2 Round 1 share required to sign transactions with External Signer.');
3675
+ }
3676
+ if (!params.customMPCv2SigningRound2GenerationFunction) {
3677
+ throw new Error('Generator function for MPCv2 Round 2 share required to sign transactions with External Signer.');
3678
+ }
3679
+ if (!params.customMPCv2SigningRound3GenerationFunction) {
3680
+ throw new Error('Generator function for MPCv2 Round 3 share required to sign transactions with External Signer.');
3681
+ }
3682
+ try {
3683
+ (0, assert_1.default)(this.tssUtils, 'tssUtils must be defined');
3684
+ const signedTxRequest = await this.tssUtils.signEcdsaMPCv2TssUsingExternalSigner({
3685
+ txRequest: txRequestId,
3686
+ reqId: params.reqId || new utils_1.RequestTracer(),
3687
+ }, params.customMPCv2SigningRound1GenerationFunction, params.customMPCv2SigningRound2GenerationFunction, params.customMPCv2SigningRound3GenerationFunction);
3688
+ return signedTxRequest;
3689
+ }
3690
+ catch (e) {
3691
+ throw new Error('failed to sign transaction ' + e);
3692
+ }
3693
+ }
2491
3694
  /**
2492
3695
  * Signs a transaction from a TSS wallet.
2493
3696
  *
@@ -2503,26 +3706,14 @@ class Wallet {
2503
3706
  if (!params.prv) {
2504
3707
  throw new Error('prv required to sign transactions with TSS');
2505
3708
  }
2506
- // If only the getHashFunction() is defined for the coin use it otherwise
2507
- // pass undefined hash, default hash will be used in that case.
2508
- let hash;
2509
- try {
2510
- hash = this.baseCoin.getHashFunction();
2511
- }
2512
- catch (err) {
2513
- hash = undefined;
2514
- }
2515
3709
  try {
2516
- const signedTxRequest = await this.tssUtils.signTxRequest({
3710
+ return await this.tssUtils.signTxRequest({
2517
3711
  txRequest: params.txPrebuild.txRequestId,
3712
+ txParams: params.txPrebuild.buildParams,
2518
3713
  prv: params.prv,
2519
3714
  reqId: params.reqId || new utils_1.RequestTracer(),
2520
3715
  apiVersion: params.apiVersion,
2521
- hash,
2522
3716
  });
2523
- return {
2524
- txRequestId: signedTxRequest.txRequestId,
2525
- };
2526
3717
  }
2527
3718
  catch (e) {
2528
3719
  throw new Error('failed to sign transaction ' + e);
@@ -2534,7 +3725,6 @@ class Wallet {
2534
3725
  * @param params signing options
2535
3726
  */
2536
3727
  async signMessageTss(params = {}) {
2537
- var _a, _b, _c, _d;
2538
3728
  if (!params.reqId) {
2539
3729
  params.reqId = new utils_1.RequestTracer();
2540
3730
  }
@@ -2543,37 +3733,45 @@ class Wallet {
2543
3733
  }
2544
3734
  try {
2545
3735
  let txRequest;
2546
- assert_1.default(params.message, 'message required for message signing');
3736
+ (0, assert_1.default)(params.message, 'message required for message signing');
3737
+ const messageRaw = params.message.messageRaw;
2547
3738
  if (!params.message.txRequestId) {
2548
3739
  const intentOption = {
2549
3740
  custodianMessageId: params.custodianMessageId,
2550
3741
  reqId: params.reqId,
2551
3742
  intentType: 'signMessage',
2552
3743
  isTss: true,
2553
- messageRaw: params.message.messageRaw,
2554
- messageEncoded: Buffer.from((_b = (_a = params.message) === null || _a === void 0 ? void 0 : _a.messageEncoded) !== null && _b !== void 0 ? _b : '').toString('hex'),
3744
+ messageRaw,
3745
+ messageStandardType: params.message.messageStandardType,
3746
+ signerAddress: params.message.signerAddress,
2555
3747
  };
2556
- txRequest = await this.tssUtils.createTxRequestWithIntentForMessageSigning(intentOption);
3748
+ txRequest = await this.tssUtils.buildSignMessageRequest(intentOption);
2557
3749
  params.message.txRequestId = txRequest.txRequestId;
2558
3750
  }
2559
3751
  else {
2560
- txRequest = await tss_1.getTxRequest(this.bitgo, this.id(), params.message.txRequestId);
3752
+ txRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), params.message.txRequestId, params.reqId);
2561
3753
  }
3754
+ (0, assert_1.default)(txRequest.messages && txRequest.messages.length > 0, 'Unable to find messages in txRequest for message signing');
3755
+ const messageEncoded = txRequest.messages[0].messageEncoded;
2562
3756
  const signedMessageRequest = await this.tssUtils.signTxRequestForMessage({
2563
3757
  txRequest,
2564
3758
  prv: params.prv,
2565
3759
  reqId: params.reqId || new utils_1.RequestTracer(),
2566
- messageRaw: params.message.messageRaw,
2567
- messageEncoded: params.message.messageEncoded,
2568
- bufferToSign: Buffer.from((_c = params.message.messageEncoded) !== null && _c !== void 0 ? _c : ''),
3760
+ messageRaw,
3761
+ messageEncoded,
3762
+ bufferToSign: Buffer.from(messageEncoded, 'hex'),
2569
3763
  });
2570
- assert_1.default(signedMessageRequest.messages, 'Unable to find messages in signedMessageRequest');
2571
- assert_1.default(signedMessageRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedMessageRequest.messages');
2572
- assert_1.default(signedMessageRequest.messages[0].txHash, 'Unable to find txHash in signedMessageRequest.messages');
3764
+ (0, assert_1.default)(signedMessageRequest.messages, 'Unable to find messages in signedMessageRequest');
3765
+ if (this.baseCoin.getFamily() === statics_1.CoinFamily.ETH) {
3766
+ (0, assert_1.default)(signedMessageRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedMessageRequest.messages');
3767
+ }
3768
+ (0, assert_1.default)(signedMessageRequest.messages[0].txHash, 'Unable to find txHash in signedMessageRequest.messages');
2573
3769
  return {
2574
3770
  coin: this.coin(),
2575
3771
  txHash: signedMessageRequest.messages[0].txHash,
2576
- messageRaw: (_d = params.message) === null || _d === void 0 ? void 0 : _d.messageRaw,
3772
+ signature: signedMessageRequest.messages[0].txHash,
3773
+ messageRaw,
3774
+ messageEncoded,
2577
3775
  txRequestId: signedMessageRequest.txRequestId,
2578
3776
  };
2579
3777
  }
@@ -2595,7 +3793,7 @@ class Wallet {
2595
3793
  }
2596
3794
  try {
2597
3795
  let txRequest;
2598
- assert_1.default(params.typedData, 'typedData required for typed data signing');
3796
+ (0, assert_1.default)(params.typedData, 'typedData required for typed data signing');
2599
3797
  if (!params.typedData.txRequestId) {
2600
3798
  const intentOptions = {
2601
3799
  custodianMessageId: params.custodianMessageId,
@@ -2609,7 +3807,7 @@ class Wallet {
2609
3807
  params.typedData.txRequestId = txRequest.txRequestId;
2610
3808
  }
2611
3809
  else {
2612
- txRequest = await tss_1.getTxRequest(this.bitgo, this.id(), params.typedData.txRequestId);
3810
+ txRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), params.typedData.txRequestId, params.reqId);
2613
3811
  }
2614
3812
  const signedTypedDataRequest = await this.tssUtils.signTxRequestForMessage({
2615
3813
  txRequest,
@@ -2619,13 +3817,15 @@ class Wallet {
2619
3817
  messageEncoded: params.typedData.typedDataEncoded.toString('hex'),
2620
3818
  bufferToSign: params.typedData.typedDataEncoded,
2621
3819
  });
2622
- assert_1.default(signedTypedDataRequest.messages, 'Unable to find messages in signedTypedDataRequest');
2623
- assert_1.default(signedTypedDataRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedTypedDataRequest.messages');
2624
- assert_1.default(signedTypedDataRequest.messages[0].txHash, 'Unable to find txHash in signedTypedDataRequest.messages');
3820
+ (0, assert_1.default)(signedTypedDataRequest.messages, 'Unable to find messages in signedTypedDataRequest');
3821
+ (0, assert_1.default)(signedTypedDataRequest.messages[0].combineSigShare, 'Unable to find combineSigShare in signedTypedDataRequest.messages');
3822
+ (0, assert_1.default)(signedTypedDataRequest.messages[0].txHash, 'Unable to find txHash in signedTypedDataRequest.messages');
2625
3823
  return {
2626
3824
  coin: this.coin(),
2627
3825
  txHash: signedTypedDataRequest.messages[0].txHash,
3826
+ signature: signedTypedDataRequest.messages[0].txHash,
2628
3827
  messageRaw: params.typedData.typedDataRaw,
3828
+ messageEncoded: params.typedData.typedDataEncoded.toString('hex'),
2629
3829
  txRequestId: signedTypedDataRequest.txRequestId,
2630
3830
  };
2631
3831
  }
@@ -2638,29 +3838,40 @@ class Wallet {
2638
3838
  *
2639
3839
  * @param params send options
2640
3840
  */
2641
- async sendManyTss(params = {}) {
2642
- var _a, _b, _c;
2643
- const { apiVersion } = params;
2644
- const supportedTxRequestVersions = (_b = (_a = this.tssUtils) === null || _a === void 0 ? void 0 : _a.supportedTxRequestVersions()) !== null && _b !== void 0 ? _b : [];
2645
- const onlySupportsTxRequestFull = supportedTxRequestVersions.length === 1 && supportedTxRequestVersions.includes('full');
2646
- if (apiVersion === 'lite' && onlySupportsTxRequestFull) {
2647
- throw new Error('TxRequest Lite API is not supported for this wallet');
2648
- }
3841
+ async sendManyTxRequests(params = {}) {
3842
+ params.apiVersion = (0, txRequest_1.getTxRequestApiVersion)(this, params.apiVersion);
2649
3843
  const signedTransaction = (await this.prebuildAndSignTransaction(params));
2650
3844
  if (!signedTransaction.txRequestId) {
2651
3845
  throw new Error('txRequestId missing from signed transaction');
2652
3846
  }
2653
- // TODO: BG-51122 Remove conditional when moved to txRequestFull for everything
2654
- if (this._wallet.type === 'custodial') {
2655
- await this.bitgo
3847
+ if (params.apiVersion === 'full') {
3848
+ const latestTxRequest = await (0, tss_1.getTxRequest)(this.bitgo, this.id(), signedTransaction.txRequestId, params.reqId);
3849
+ const reqId = params.reqId || new utils_1.RequestTracer();
3850
+ this.bitgo.setRequestTracer(reqId);
3851
+ const transfer = await this.bitgo
2656
3852
  .post(this.bitgo.url('/wallet/' + this._wallet.id + '/txrequests/' + signedTransaction.txRequestId + '/transfers', 2))
2657
- .send();
2658
- }
2659
- // ECDSA TSS uses TxRequestFull
2660
- if (apiVersion === 'full' || onlySupportsTxRequestFull) {
2661
- return tss_1.getTxRequest(this.bitgo, this.id(), signedTransaction.txRequestId);
3853
+ .send()
3854
+ .result();
3855
+ if (latestTxRequest.state === 'pendingApproval') {
3856
+ const pendingApprovals = new pendingApproval_1.PendingApprovals(this.bitgo, this.baseCoin);
3857
+ const pendingApproval = await pendingApprovals.get({
3858
+ id: latestTxRequest.pendingApprovalId,
3859
+ });
3860
+ return {
3861
+ pendingApproval: pendingApproval.toJSON(),
3862
+ txRequest: latestTxRequest,
3863
+ };
3864
+ }
3865
+ return {
3866
+ transfer,
3867
+ txRequest: latestTxRequest,
3868
+ txid: (latestTxRequest.transactions ?? [])[0]?.signedTx?.id,
3869
+ tx: (latestTxRequest.transactions ?? [])[0]?.signedTx?.tx,
3870
+ status: transfer.state,
3871
+ };
2662
3872
  }
2663
- return (_c = this.tssUtils) === null || _c === void 0 ? void 0 : _c.sendTxRequest(signedTransaction.txRequestId);
3873
+ const reqId = params.reqId || undefined;
3874
+ return this.tssUtils?.sendTxRequest(signedTransaction.txRequestId, reqId);
2664
3875
  }
2665
3876
  /**
2666
3877
  * Send funds from a fee address to a forwarder. Only supports eth-like coins.
@@ -2678,6 +3889,21 @@ class Wallet {
2678
3889
  this._wallet = await this.bitgo.post(url).send(params).result();
2679
3890
  return this._wallet;
2680
3891
  }
3892
+ /**
3893
+ * Send funds from a fee address to a forwarder.
3894
+ *
3895
+ * @param {Object} params - parameters object
3896
+ * @param {List} params.forwarders - list of fund forwarder options
3897
+ * @returns {*}
3898
+ */
3899
+ async fundForwarders(params) {
3900
+ if (_.isUndefined(params.forwarders) || params.forwarders.length == 0) {
3901
+ throw new Error('fund forwarder options required');
3902
+ }
3903
+ const url = this.url('/fundforwarders');
3904
+ this._wallet = await this.bitgo.post(url).send(params).result();
3905
+ return this._wallet;
3906
+ }
2681
3907
  /**
2682
3908
  * Gets forwarder's balance
2683
3909
  * @param params - optional query parameters
@@ -2686,11 +3912,11 @@ class Wallet {
2686
3912
  */
2687
3913
  async getForwarderBalance(params) {
2688
3914
  const query = {};
2689
- if (params === null || params === void 0 ? void 0 : params.maximumBalance) {
2690
- query.maximumBalance = params === null || params === void 0 ? void 0 : params.maximumBalance;
3915
+ if (params?.maximumBalance) {
3916
+ query.maximumBalance = params?.maximumBalance;
2691
3917
  }
2692
- if (params === null || params === void 0 ? void 0 : params.minimumBalance) {
2693
- query.minimumBalance = params === null || params === void 0 ? void 0 : params.minimumBalance;
3918
+ if (params?.minimumBalance) {
3919
+ query.minimumBalance = params?.minimumBalance;
2694
3920
  }
2695
3921
  const url = this.url(`/forwarders/balances`);
2696
3922
  const response = await this.bitgo.get(url).query(query).result();
@@ -2708,20 +3934,125 @@ class Wallet {
2708
3934
  const url = this.bitgo.url(`/wallet/${this.id()}/challenges`, 2);
2709
3935
  return await this.bitgo.get(url).query({}).result();
2710
3936
  }
2711
- sendTransaction(params) {
3937
+ sendTransaction(params, reqId) {
2712
3938
  // extract the whitelisted params from the top level, in case
2713
3939
  // other invalid params are present that would fail encoding
2714
3940
  // and fall back to the body params
2715
- const whitelistedParams = _.pick(params, whitelistedSendParams);
2716
- return postWithCodec_1.postWithCodec(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/send'), public_types_1.TxSendBody, whitelistedParams).result();
3941
+ const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, whitelistedSendParams));
3942
+ const reqTracer = reqId || new utils_1.RequestTracer();
3943
+ this.bitgo.setRequestTracer(reqTracer);
3944
+ return (0, postWithCodec_1.postWithCodec)(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/send'), t.intersection([public_types_1.TxSendBody, t.partial({ locktime: t.number })]), whitelistedParams).result();
2717
3945
  }
2718
- initiateTransaction(params) {
3946
+ initiateTransaction(params, reqId) {
2719
3947
  // extract the whitelisted params from the top level, in case
2720
3948
  // other invalid params are present that would fail encoding
2721
3949
  // and fall back to the body params
2722
- const whitelistedParams = _.pick(params, whitelistedSendParams);
2723
- return postWithCodec_1.postWithCodec(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/initiate'), public_types_1.TxSendBody, whitelistedParams).result();
3950
+ const whitelistedParams = this.baseCoin.preprocessBuildParams(_.pick(params, whitelistedSendParams));
3951
+ const reqTracer = reqId || new utils_1.RequestTracer();
3952
+ this.bitgo.setRequestTracer(reqTracer);
3953
+ return (0, postWithCodec_1.postWithCodec)(this.bitgo, this.baseCoin.url('/wallet/' + this.id() + '/tx/initiate'), public_types_1.TxSendBody, whitelistedParams).result();
3954
+ }
3955
+ /**
3956
+ * Get wallet keychains and validate passphrase if necessary
3957
+ * @param {PrebuildTransactionOptions} params - prebuild transaction options
3958
+ * @param {string} params.walletPassphrase - wallet passphrase
3959
+ * @param {string} params.reqId - request id for tracing purposes
3960
+ * @param {Function} params.customSigningFunction - custom signing function for external signing
3961
+ * @returns {Promise<Keychain[]>}
3962
+ */
3963
+ async getKeychainsAndValidatePassphrase({ customSigningFunction, walletPassphrase, reqId, }) {
3964
+ const keychains = await this.baseCoin.keychains().getKeysForSigning({ wallet: this, reqId });
3965
+ // Doing a sanity check for password here to avoid doing further work if we know it's wrong
3966
+ // we ignore this check with if customSigningFunction is provided
3967
+ // which means that the user is handling the signing in external signing mode
3968
+ if (!customSigningFunction && keychains?.[0]?.encryptedPrv && walletPassphrase) {
3969
+ if (!(await (0, keychain_1.decryptKeychainPrivateKeyAsync)(this.bitgo, keychains[0], walletPassphrase))) {
3970
+ const error = new Error(`unable to decrypt keychain with the given wallet passphrase`);
3971
+ error.code = 'wallet_passphrase_incorrect';
3972
+ throw error;
3973
+ }
3974
+ }
3975
+ return keychains;
3976
+ }
3977
+ /**
3978
+ * Approve token for use with a batcher contract
3979
+ * This function builds, signs, and sends a token approval transaction
3980
+ *
3981
+ * @param {string} walletPassphrase - The passphrase to be used to decrypt the user key
3982
+ * @param {string} tokenName - The name of the token to be approved
3983
+ * @returns {Promise<any>} The transaction details
3984
+ */
3985
+ async approveErc20Token(walletPassphrase, tokenName) {
3986
+ const reqId = new utils_1.RequestTracer();
3987
+ this.bitgo.setRequestTracer(reqId);
3988
+ let tokenApprovalBuild;
3989
+ try {
3990
+ const url = this.baseCoin.url(`/wallet/${this.id()}/token/approval/build`);
3991
+ tokenApprovalBuild = await this.bitgo
3992
+ .post(url)
3993
+ .send({
3994
+ tokenName: tokenName,
3995
+ })
3996
+ .result();
3997
+ }
3998
+ catch (e) {
3999
+ throw e;
4000
+ }
4001
+ const keychains = await this.getKeychainsAndValidatePassphrase({
4002
+ reqId,
4003
+ walletPassphrase,
4004
+ });
4005
+ const signingParams = {
4006
+ txPrebuild: tokenApprovalBuild,
4007
+ keychain: keychains[0],
4008
+ walletPassphrase,
4009
+ reqId,
4010
+ };
4011
+ const halfSignedTransaction = await this.signTransaction(signingParams);
4012
+ const finalTxParams = _.extend({}, halfSignedTransaction);
4013
+ return this.sendTransaction(finalTxParams, reqId);
4014
+ }
4015
+ /**
4016
+ * Build token approval transaction for ERC20 tokens
4017
+ * If walletPassphrase is provided, also signs and sends the transaction
4018
+ *
4019
+ * @param {string} tokenName - The name of the token to be approved
4020
+ * @param {string} [walletPassphrase] - Optional wallet passphrase for signing and sending
4021
+ * @returns {Promise<BuildTokenApprovalResponse | SubmitTransactionResponse>} The token approval build response or transaction details if signed
4022
+ */
4023
+ async buildErc20TokenApproval(tokenName, walletPassphrase) {
4024
+ const reqId = new utils_1.RequestTracer();
4025
+ this.bitgo.setRequestTracer(reqId);
4026
+ let tokenApprovalBuild;
4027
+ const url = this.baseCoin.url(`/wallet/${this.id()}/token/approval/build`);
4028
+ try {
4029
+ tokenApprovalBuild = await this.bitgo
4030
+ .post(url)
4031
+ .send({
4032
+ tokenName: tokenName,
4033
+ })
4034
+ .result();
4035
+ }
4036
+ catch (error) {
4037
+ throw new Error(`error building erc20 token approval tx: ${error}`);
4038
+ }
4039
+ if (!walletPassphrase) {
4040
+ return tokenApprovalBuild;
4041
+ }
4042
+ const keychains = await this.getKeychainsAndValidatePassphrase({
4043
+ reqId,
4044
+ walletPassphrase,
4045
+ });
4046
+ const signingParams = {
4047
+ txPrebuild: tokenApprovalBuild,
4048
+ keychain: keychains[0],
4049
+ walletPassphrase,
4050
+ reqId,
4051
+ };
4052
+ const halfSignedTransaction = await this.signTransaction(signingParams);
4053
+ const finalTxParams = _.extend({}, halfSignedTransaction);
4054
+ return this.sendTransaction(finalTxParams, reqId);
2724
4055
  }
2725
4056
  }
2726
4057
  exports.Wallet = Wallet;
2727
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsb0RBQTRCO0FBQzVCLCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIscURBQXVDO0FBU3ZDLHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBQThFO0FBQzlFLCtEQUFpRDtBQUNqRCxpREFBa0Q7QUFFbEQsd0RBQXVFO0FBQ3ZFLDhEQUEyRDtBQUMzRCxvQ0FRa0I7QUF5RGxCLDREQUF5RDtBQUN6RCw0Q0FBeUM7QUFDekMsK0RBQTRDO0FBQzVDLDhDQUFnRDtBQUNoRCxnQ0FBc0M7QUFFdEMsaURBQWdEO0FBQ2hELCtDQUE0RDtBQUM1RCwwREFBdUQ7QUFDdkQsc0RBQWlEO0FBRWpELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixHQUFyQiw2QkFBcUIsS0FBckIsNkJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDakQsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE9BQVEsVUFBd0MsQ0FBQyxRQUFRLEtBQUssU0FBUyxD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QUM7SUFFTyxtQkFBbUIsQ0FBQyxNQUFrQjtRQUM1Qyw2REFBNkQ7UUFDN0QsNERBQTREO1FBQzVELG1DQUFtQztRQUNuQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDaEUsT0FBTyw2QkFBYSxDQUNsQixJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLEVBQzFELHlCQUFVLEVBQ1YsaUJBQWlCLENBQ2xCLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUE5Z0dELHdCQThnR0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgY29tbW9uIGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQge1xuICBJQmFzZUNvaW4sXG4gIFNpZ25lZE1lc3NhZ2UsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduZWRUcmFuc2FjdGlvblJlcXVlc3QsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zLFxufSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBtYWtlUmFuZG9tS2V5IH0gZnJvbSAnLi4vYml0Y29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgZ2V0U2hhcmVkU2VjcmV0IH0gZnJvbSAnLi4vZWNkaCc7XG5pbXBvcnQgeyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yLCBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCAqIGFzIGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2ludGVybmFsJztcbmltcG9ydCB7IGRyYXdLZXljYXJkIH0gZnJvbSAnLi4vaW50ZXJuYWwva2V5Y2FyZCc7XG5pbXBvcnQgeyBLZXljaGFpbiB9IGZyb20gJy4uL2tleWNoYWluJztcbmltcG9ydCB7IElQZW5kaW5nQXBwcm92YWwsIFBlbmRpbmdBcHByb3ZhbCB9IGZyb20gJy4uL3BlbmRpbmdBcHByb3ZhbCc7XG5pbXBvcnQgeyBUcmFkaW5nQWNjb3VudCB9IGZyb20gJy4uL3RyYWRpbmcvdHJhZGluZ0FjY291bnQnO1xuaW1wb3J0IHtcbiAgaW5mZXJBZGRyZXNzVHlwZSxcbiAgUmVxdWVzdFRyYWNlcixcbiAgVHhSZXF1ZXN0LFxuICBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gIEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhLFxuICBSZXF1ZXN0VHlwZSxcbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQWRkcmVzc2VzT3B0aW9ucyxcbiAgQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMsXG4gIENoYW5nZUZlZU9wdGlvbnMsXG4gIENvbnNvbGlkYXRlVW5zcGVudHNPcHRpb25zLFxuICBDcmVhdGVBZGRyZXNzT3B0aW9ucyxcbiAgQ3JlYXRlUG9saWN5UnVsZU9wdGlvbnMsXG4gIENyZWF0ZVNoYXJlT3B0aW9ucyxcbiAgQ3Jvc3NDaGFpblVUWE8sXG4gIERlcGxveUZvcndhcmRlcnNPcHRpb25zLFxuICBEb3dubG9hZEtleWNhcmRPcHRpb25zLFxuICBGYW5vdXRVbnNwZW50c09wdGlvbnMsXG4gIEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyxcbiAgRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMsXG4gIEZvcndhcmRlckJhbGFuY2UsXG4gIEZvcndhcmRlckJhbGFuY2VPcHRpb25zLFxuICBGcmVlemVPcHRpb25zLFxuICBGdW5kRm9yd2FyZGVyc09wdGlvbnMsXG4gIEdldEFkZHJlc3NPcHRpb25zLFxuICBHZXRQcnZPcHRpb25zLFxuICBHZXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEdldFRyYW5zZmVyT3B0aW9ucyxcbiAgR2V0VXNlclBydk9wdGlvbnMsXG4gIElXYWxsZXQsXG4gIE1heGltdW1TcGVuZGFibGUsXG4gIE1heGltdW1TcGVuZGFibGVPcHRpb25zLFxuICBNb2RpZnlXZWJob29rT3B0aW9ucyxcbiAgUGFnaW5hdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQsXG4gIFJlY292ZXJUb2tlbk9wdGlvbnMsXG4gIFJlbW92ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBSZW1vdmVVc2VyT3B0aW9ucyxcbiAgU2VuZE1hbnlPcHRpb25zLFxuICBTZW5kT3B0aW9ucyxcbiAgU2hhcmVXYWxsZXRPcHRpb25zLFxuICBTaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1YldhbGxldFR5cGUsXG4gIFN3ZWVwT3B0aW9ucyxcbiAgVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zLFxuICBUcmFuc2ZlckNvbW1lbnRPcHRpb25zLFxuICBUcmFuc2ZlcnNPcHRpb25zLFxuICBVbnNwZW50c09wdGlvbnMsXG4gIFVwZGF0ZUFkZHJlc3NPcHRpb25zLFxuICBXYWxsZXRDb2luU3BlY2lmaWMsXG4gIFdhbGxldERhdGEsXG4gIFdhbGxldEVjZHNhQ2hhbGxlbmdlcyxcbiAgV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyxcbiAgV2FsbGV0VHlwZSxcbn0gZnJvbSAnLi9pV2FsbGV0JztcbmltcG9ydCB7IFN0YWtpbmdXYWxsZXQgfSBmcm9tICcuLi9zdGFraW5nL3N0YWtpbmdXYWxsZXQnO1xuaW1wb3J0IHsgTGlnaHRuaW5nIH0gZnJvbSAnLi4vbGlnaHRuaW5nJztcbmltcG9ydCBFZGRzYVV0aWxzIGZyb20gJy4uL3V0aWxzL3Rzcy9lZGRzYSc7XG5pbXBvcnQgeyBFY2RzYVV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvdHNzL2VjZHNhJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdCB9IGZyb20gJy4uL3Rzcyc7XG5pbXBvcnQgeyBIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IG9mY1Rva2VucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgYnVpbGRQYXJhbUtleXMsIEJ1aWxkUGFyYW1zIH0gZnJvbSAnLi9CdWlsZFBhcmFtcyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBUeFNlbmRCb2R5IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYml0Z286djI6d2FsbGV0Jyk7XG5cbnR5cGUgTWFuYWdlVW5zcGVudHMgPSAnY29uc29saWRhdGUnIHwgJ2Zhbm91dCc7XG5cbmNvbnN0IHdoaXRlbGlzdGVkU2VuZFBhcmFtcyA9IFR4U2VuZEJvZHkudHlwZS50eXBlcy5mbGF0TWFwKCh0KSA9PiBPYmplY3Qua2V5cyh0LnByb3BzKSk7XG5cbmV4cG9ydCBlbnVtIE1hbmFnZVVuc3BlbnRzT3B0aW9ucyB7XG4gIEJVSUxEX09OTFksXG4gIEJVSUxEX1NJR05fU0VORCxcbn1cblxuZnVuY3Rpb24gaXNQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KFxuICBwcmVidWlsZFR4OiBzdHJpbmcgfCBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4pOiBwcmVidWlsZFR4IGlzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQge1xuICBpZiAoIXByZWJ1aWxkVHggfHwgdHlwZW9mIHByZWJ1aWxkVHggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAocHJlYnVpbGRUeCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KS53YWxsZXRJZCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFZGRzYVV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZWRkc2EnOlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSBuZXcgRWRkc2FVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgVVJMIHVzaW5nIHRoaXMgd2FsbGV0J3MgaWQgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIEJpdEdvIEFQSSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBleHRyYSBBUEkgc3BlY2lmaWMgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgd2FsbGV0IGlkXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoaXMgd2FsbGV0J3MgaWRcbiAgICovXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgZm9yIHNwZW5kaW5nIGZ1bmRzIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIGFwcHJvdmFsc1JlcXVpcmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5hcHByb3ZhbHNSZXF1aXJlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgYmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgY29kZWMgaW5zdGVhZDogdC5leGFjdChCdWlsZFBhcmFtcykuZW5jb2RlKHYpICovXG4gIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBidWlsZFBhcmFtS2V5cztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgc3RyaWN0IHN1Yi1zZXQgb2YgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtc1xuICAgKi9cbiAgcHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbXG4gICAgICAnY29uc29saWRhdGVBZGRyZXNzZXMnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21lbW8nLFxuICAgICAgJ3ZhbGlkRnJvbUJsb2NrJyxcbiAgICAgICd2YWxpZFRvQmxvY2snLFxuICAgICAgJ3ByZXZpZXcnLFxuICAgICAgJ2tlZXBBbGl2ZScsXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIHNwZW5kYWJsZUJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgYmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuYmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbmZpcm1lZCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgY29uZmlybWVkQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29uZmlybWVkQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZW5kYWJsZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYmFsYW5jZXMgaGF2ZSB0aGUgcG90ZW50aWFsIHRvIG92ZXJmbG93IHN0YW5kYXJkIGphdmFzY3JpcHQgbnVtYmVyc1xuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvaW4gaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgY29pbiB0aGlzIHdhbGxldCBob2xkc1xuICAgKi9cbiAgY29pbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pbjtcbiAgfVxuXG4gIHR5cGUoKTogV2FsbGV0VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC50eXBlO1xuICB9XG5cbiAgbXVsdGlzaWdUeXBlKCk6ICdvbmNoYWluJyB8ICd0c3MnIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZTtcbiAgfVxuXG4gIHN1YlR5cGUoKTogU3ViV2FsbGV0VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zdWJUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFiZWwgKG5hbWUpIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5sYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBvYmplY3QgaWRzIGZvciB0aGUga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LlxuICAgKi9cbiAgcHVibGljIGtleUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5rZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlY2VpdmUgYWRkcmVzcyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlQWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucmVjZWl2ZUFkZHJlc3MuYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAtIHR4SGFzaCB0aGUgdHJhbnNhY3Rpb24gaGFzaCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24ocGFyYW1zOiBHZXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eEhhc2gnXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoJy90eC8nICsgcGFyYW1zLnR4SGFzaCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNmZXJzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJzKHBhcmFtczogVHJhbnNmZXJzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogVHJhbnNmZXJzT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoTGFiZWwpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuc2VhcmNoTGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWFyY2hMYWJlbCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2VhcmNoTGFiZWwgPSBwYXJhbXMuc2VhcmNoTGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICBwYXJhbXMuYWRkcmVzcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlR3RlKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlR3RlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlR3RlID0gcGFyYW1zLmRhdGVHdGU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlTHQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUx0IGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlTHQgPSBwYXJhbXMuZGF0ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlR3RlID0gcGFyYW1zLnZhbHVlR3RlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlTHQgPSBwYXJhbXMudmFsdWVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVIZXggPSBwYXJhbXMuaW5jbHVkZUhleDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnN0YXRlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICBwYXJhbXMuc3RhdGUuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBzdGF0ZSBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudHlwZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmJ1bGsgLSBpZiBzZXQgdG8gVHJ1ZSwgdGhpcyBlbmFibGVzIHRoZSBjb25zb2xpZGF0aW9uIG9mIGxhcmdlIG51bWJlciBvZiB1bnNwZW50cyBieSBjcmVhdGluZyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggdHJhbnNhY3Rpb24gY29tcG9zZWQgb2YgMjAwIHVuc3BlbnRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHdoaWNoIG1heSBoYXZlIGZld2VyIHVuc3BlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYW5hZ2VVbnNwZW50cyhcbiAgICByb3V0ZU5hbWU6IE1hbmFnZVVuc3BlbnRzLFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgfCBGYW5vdXRVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhGZWVQZXJjZW50YWdlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgJ21pbkNvbmZpcm1zJyxcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ3RhcmdldEFkZHJlc3MnLFxuICAgICAgJ3R4Rm9ybWF0JyxcbiAgICAgICdidWxrJyxcblxuICAgICAgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnID8gJ2xpbWl0JyA6ICdtYXhOdW1JbnB1dHNUb1VzZScsXG4gICAgICAnbnVtVW5zcGVudHNUb01ha2UnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCBidWlsZFJlc3BvbnNlOiBUcmFuc2FjdGlvblByZWJ1aWxkIHwgVHJhbnNhY3Rpb25QcmVidWlsZFtdID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3JvdXRlTmFtZX1VbnNwZW50c2ApKVxuICAgICAgLnNlbmQoZmlsdGVyZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBpZiAob3B0aW9uID09PSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfT05MWSkge1xuICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KSkgYXMgdW5rbm93biBhcyBLZXljaGFpbltdO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgcHViczoga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgICAgICBhc3NlcnQoay5wdWIpO1xuICAgICAgICByZXR1cm4gay5wdWI7XG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgdHhQcmVidWlsZHMgPSBBcnJheS5pc0FycmF5KGJ1aWxkUmVzcG9uc2UpID8gYnVpbGRSZXNwb25zZSA6IFtidWlsZFJlc3BvbnNlXTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY29tbWVudCcsICdvdHAnLCAnYnVsayddKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0eFByZWJ1aWxkcy5tYXAoYXN5bmMgKHR4UHJlYnVpbGQpID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7IC4uLnRyYW5zYWN0aW9uUGFyYW1zLCB0eFByZWJ1aWxkIH0pO1xuICAgICAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIHNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMsIHsgdHlwZTogcm91dGVOYW1lIH0pO1xuICAgICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcyk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShidWlsZFJlc3BvbnNlKSA/IHJlc3BvbnNlIDogcmVzcG9uc2VbMF07XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlLiBJdCBpcyBub3QgYXBwbGljYWJsZSBmb3IgaWYgYnVsayBjb25zb2xpZGF0ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYnVsayAtIGlmIHNldCB0byBUcnVlLCB0aGlzIGVuYWJsZXMgdGhlIGNvbnNvbGlkYXRpb24gb2YgbGFyZ2UgbnVtYmVyIG9mIHVuc3BlbnRzIGJ5IGNyZWF0aW5nIG11bHRpcGxlIHRyYW5zYWN0aW9ucyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZWFjaCB0cmFuc2FjdGlvbiBjb21wb3NlZCBvZiAyMDAgdW5zcGVudHMsIGV4Y2VwdCBmb3IgdGhlIGxhc3QgdHJhbnNhY3Rpb24gd2hpY2ggbWF5IGhhdmUgZmV3ZXIgdW5zcGVudHMuXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLm1hbmFnZVVuc3BlbnRzKCdjb25zb2xpZGF0ZScsIHBhcmFtcywgb3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2Zhbm91dCcsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGUgd2FsbGV0LiBVcGRhdGVzIHRoZSB3YWxsZXQuXG4gICAqIFRva2VucyB3aWxsIG9ubHkgYmUgZmx1c2hlZCBmcm9tIGZvcndhcmRlciBjb250cmFjdHMgaWYgdGhlIGJhbGFuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgZGVmaW5lZCBoZXJlLlxuICAgKiBAcGFyYW0gdGhyZXNob2xkcyB7T2JqZWN0fSAtIHBhaXJzIG9mIHsgW3Rva2VuTmFtZV06IHRocmVzaG9sZCB9IChiYXNlIHVuaXRzKVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlVG9rZW5GbHVzaFRocmVzaG9sZHModGhyZXNob2xkczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cblxuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wdXQodGhpcy51cmwoKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgdG9rZW5GbHVzaFRocmVzaG9sZHM6IHRocmVzaG9sZHMsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG4gIC8qKlxuICAgICAgKiBVcGRhdGVzIHRoZSB3YWxsZXQuIFNldHMgZmxhZ3MgZm9yIGRlcGxveUZvcndhcmRlcnNNYW51YWxseSBhbmQgZmx1c2hGb3J3YXJkZXJzTWFudWFsbHkgb2YgdGhlIHdhbGxldC5cbiAgICAgICogQHBhcmFtIGZvcndhcmRlckZsYWdzIHtPYmplY3R9IC0ge1xuICAgICAgICBcImNvaW5TcGVjaWZpY1wiOiB7XG4gICAgICAgICAgW2NvaW5OYW1lXToge1xuICAgICAgICAgICAgXCJkZXBsb3lGb3J3YXJkZXJzTWFudWFsbHlcIjoge0Jvb2xlYW59LFxuICAgICAgICAgICAgXCJmbHVzaEZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICovXG4gIGFzeW5jIHVwZGF0ZUZvcndhcmRlcnMoZm9yd2FyZGVyRmxhZ3M6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZChmb3J3YXJkZXJGbGFncykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVG8gbWFudWFsbHkgZGVwbG95IGFuIEVUSCBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtIGFkZHJlc3NJZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5pZF0gLSBhZGRyZXNzSWQgY291bGQgYmUgcmVjZWl2ZWQgYWxzbyBhcyBpZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBkZXBsb3lGb3J3YXJkZXJzKHBhcmFtczogRGVwbG95Rm9yd2FyZGVyc09wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS9kZXBsb3ltZW50YCk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogVG8gbWFudWFsbHkgZm9yd2FyZCB0b2tlbnMgZnJvbSBhbiBFVEggb3IgQ0VMTyBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRva2VuTmFtZSAtIE5hbWUgb2YgdG9rZW4gdGhhdCBuZWVkcyB0byBiZSBmb3J3YXJkZWQgZnJvbSB0aGUgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmdhc1ByaWNlXSAtIEV4cGxpY2l0IGdhcyBwcmljZSB0byB1c2Ugd2hlbiBmb3J3YXJkaW5nIHRva2VuIGZyb20gdGhlIGZvcndhcmRlciBjb250cmFjdCAoRVRIIGFuZCBDZWxvIG9ubHkpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGVzdGltYXRlZCBuZXR3b3JrIGdhcyBwcmljZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZWlwMTU1OV0gLSBTcGVjaWZ5IGVpcDE1NTkgZmVlIHBhcmFtZXRlcnMgaW4gdG9rZW4gZm9yd2FyZGluZyB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge09iamVjdH0gSHR0cCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgZmx1c2hGb3J3YXJkZXJUb2tlbihwYXJhbXM6IEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0vdG9rZW5mb3J3YXJkYCk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogU3dlZXAgZnVuZHMgZm9yIGEgd2FsbGV0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFkZHJlc3MgLSBUaGUgYWRkcmVzcyB0byBzZW5kIGFsbCB0aGUgZnVuZHMgaW4gdGhlIHdhbGxldCB0b1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBFc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoaW4gdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtwYXJhbXMubWF4RmVlUmF0ZV0gLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXJhbXMuYWxsb3dQYXJ0aWFsU3dlZXBdIC0gYWxsb3dzIHN3ZWVwaW5nIDIwMCB1bnNwZW50cyB3aGVuIHRoZSB3YWxsZXQgaGFzIG1vcmUgdGhhbiB0aGF0XG4gICAqIEByZXR1cm5zIHR4SGV4IHtTdHJpbmd9IHRoZSB0eEhleCBvZiB0aGUgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBzd2VlcChwYXJhbXM6IFN3ZWVwT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2JywgJ290cCddKTtcblxuICAgIC8vIFRoZSBzd2VlcCBBUEkgZW5kcG9pbnQgaXMgb25seSBhdmFpbGFibGUgdG8gdXR4by1iYXNlZCBjb2luc1xuXG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN3ZWVwV2l0aFNlbmRNYW55KCkpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpcm1lZEJhbGFuY2VTdHJpbmcoKSAhPT0gdGhpcy5iYWxhbmNlU3RyaW5nKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdjYW5ub3Qgc3dlZXAgd2hlbiB1bmNvbmZpcm1lZCBmdW5kcyBleGlzdCBvbiB0aGUgd2FsbGV0LCBwbGVhc2Ugd2FpdCB1bnRpbCBhbGwgaW5ib3VuZCB0cmFuc2FjdGlvbnMgY29uZmlybSdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNwZW5kYWJsZUJhbGFuY2VTdHJpbmcoKTtcbiAgICAgIGlmIChfLmlzVW5kZWZpbmVkKHZhbHVlKSB8fCB2YWx1ZSA9PT0gJzAnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZnVuZHMgdG8gc3dlZXAnKTtcbiAgICAgIH1cbiAgICAgIChwYXJhbXMgYXMgYW55KS5yZWNpcGllbnRzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHBhcmFtcyk7XG4gICAgfVxuICAgIC8vIHRoZSBmb2xsb3dpbmcgZmxvdyB3b3JrcyBmb3IgYWxsIFVUWE8gY29pbnNcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuICAgICAgJ2FsbG93UGFydGlhbFN3ZWVwJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc3dlZXBXYWxsZXQnKSkuc2VuZChmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG5cbiAgICAvLyBUT0RPKEJHLTM1ODgpOiBhZGQgdHhIZXggdmFsaWRhdGlvbiB0byBwcm90ZWN0IG1hbiBpbiB0aGUgbWlkZGxlIGF0dGFja3MgcmVwbGFjaW5nIHRoZSB0eEhleFxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyBhbnk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHVzZXJLZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHBydjogcGFyYW1zLnhwcnYsXG4gICAgfTtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKTtcblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnb3RwJ10pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgc2lnbmVkVHJhbnNhY3Rpb24sIHNlbGVjdFBhcmFtcyk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb246IHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb21tZW50IG9mIGEgdHJhbnNmZXJcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQ29tbWVudChwYXJhbXM6IFRyYW5zZmVyQ29tbWVudE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ2NvbW1lbnQnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCArICcvY29tbWVudCcpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3NlcyhwYXJhbXM6IEFkZHJlc3Nlc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNPcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLm1pbmUpIHtcbiAgICAgIHF1ZXJ5Lm1pbmUgPSAhIXBhcmFtcy5taW5lO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxhYmVsQ29udGFpbnMpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWxDb250YWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxhYmVsQ29udGFpbnMgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxhYmVsQ29udGFpbnMgPSBwYXJhbXMubGFiZWxDb250YWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFpbnMpKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgbnVtYmVycycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW5zID0gcGFyYW1zLmNoYWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVCYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVCYWxhbmNlcyA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZXM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG9rZW5zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG9rZW5zID0gcGFyYW1zLmluY2x1ZGVUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgPSBwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmV0dXJuQmFsYW5jZXNGb3JUb2tlbiBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucmV0dXJuQmFsYW5jZXNGb3JUb2tlbiA9IHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBlbmRpbmdEZXBsb3ltZW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkucGVuZGluZ0RlcGxveW1lbnQgPSBwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHdhbGxldCBhZGRyZXNzIGJ5IGl0cyBpZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0QWRkcmVzcyhwYXJhbXM6IEdldEFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2FkZHJlc3MnLCAnaWQnXSk7XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLl93YWxsZXQuaWR9L2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvbmUgb3IgbW9yZSBuZXcgYWRkcmVzcyhlcykgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBJZiB0aGUgYGNvdW50YCBmaWVsZCBpcyBkZWZpbmVkIGFuZCBncmVhdGVyIHRoYW4gMSwgYW4gb2JqZWN0IHdpdGggYSBzaW5nbGVcbiAgICogYXJyYXkgcHJvcGVydHkgbmFtZWQgYGFkZHJlc3Nlc2AgY29udGFpbmluZyBgY291bnRgIGFkZHJlc3Mgb2JqZWN0c1xuICAgKiB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UsIGEgc2luZ2xlIGFkZHJlc3Mgb2JqZWN0IGlzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY2hhaW4gb24gd2hpY2ggdGhlIG5ldyBhZGRyZXNzIHNob3VsZCBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSB7KE51bWJlcnxTdHJpbmcpfSBwYXJhbXMuZ2FzUHJpY2UgZ2FzIHByaWNlIGZvciBuZXcgYWRkcmVzcyBjcmVhdGlvbiwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub25Ub2tlbiBtYW5kYXRvcnkgaW4gY2FzZSBvZiB0aGUgT0ZDIHdhbGxldCwgdGhlIG5hbWUgb2YgdG9rZW4gdG8gY3JlYXRlIGFkZHJlc3MgZm9yXG4gICAqIEFkZHJlc3MgdmVyaWZpY2F0aW9uIGNhbiBiZSBza2lwcGVkIHdoZW4gZm9yd2FyZGVyVmVyc2lvbiBpcyAwIGFuZCBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBpcyB0cnVlIE9SXG4gICAqIGlmICdjb2luU3BlY2lmaWMnIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwb25zZSBmcm9tIGFwaSBjYWxsIHRvIGNyZWF0ZSBhZGRyZXNzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBZGRyZXNzKHBhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgYWRkcmVzc1BhcmFtczogQ3JlYXRlQWRkcmVzc09wdGlvbnMgPSB7fTtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBjaGFpbixcbiAgICAgIGdhc1ByaWNlLFxuICAgICAgbGFiZWwsXG4gICAgICBsb3dQcmlvcml0eSxcbiAgICAgIGZvcndhcmRlclZlcnNpb24sXG4gICAgICBmb3JtYXQsXG4gICAgICBjb3VudCA9IDEsXG4gICAgICBiYXNlQWRkcmVzcyxcbiAgICAgIGFsbG93U2tpcFZlcmlmeUFkZHJlc3MgPSB0cnVlLFxuICAgICAgb25Ub2tlbixcbiAgICB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGNoYWluKSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihjaGFpbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFpbiBoYXMgdG8gYmUgYW4gaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5jaGFpbiA9IGNoYWluO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChnYXNQcmljZSkpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZ2FzUHJpY2UpICYmIChpc05hTihOdW1iZXIoZ2FzUHJpY2UpKSB8fCAhXy5pc1N0cmluZyhnYXNQcmljZSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2FzUHJpY2UgaGFzIHRvIGJlIGFuIGludGVnZXIgb3IgbnVtZXJpYyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZ2FzUHJpY2UgPSBnYXNQcmljZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZm9yd2FyZGVyVmVyc2lvbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoZm9yd2FyZGVyVmVyc2lvbikgfHwgZm9yd2FyZGVyVmVyc2lvbiA8IDAgfHwgZm9yd2FyZGVyVmVyc2lvbiA+IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkZXJWZXJzaW9uIGhhcyB0byBiZSBhbiBpbnRlZ2VyIDAsIDEsIDIgb3IgMycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5mb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnICYmIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpIHtcbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IDM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYXNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhiYXNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4oYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGxvd1NraXBWZXJpZnlBZGRyZXNzIGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGNvdW50KSB8fCBjb3VudCA8PSAwIHx8IGNvdW50ID4gMjUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdW50IGhhcyB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDI1MCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsb3dQcmlvcml0eSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4obG93UHJpb3JpdHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbG93UHJpb3JpdHkgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sb3dQcmlvcml0eSA9IGxvd1ByaW9yaXR5O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3JtYXQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnb2ZjJykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG9uVG9rZW4pKSB7XG4gICAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9mY1Rva2Vucy5pbmNsdWRlcyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBPRkMgdG9rZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzUGFyYW1zLm9uVG9rZW4gPSBvblRva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgT0ZDIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGtleWNoYWlucyBmb3IgYWRkcmVzcyB2ZXJpZmljYXRpb25cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl93YWxsZXQua2V5cy5tYXAoKGspID0+IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGssIHJlcUlkIH0pKSk7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSBfLmdldCh0aGlzLl93YWxsZXQsICdyZWNlaXZlQWRkcmVzcy5hZGRyZXNzJyk7XG5cbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSBfLnRpbWVzKGNvdW50LCBhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3MnKSlcbiAgICAgICAgLnNlbmQoYWRkcmVzc1BhcmFtcylcbiAgICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICAgIC8vIGluZmVyIGl0cyBhZGRyZXNzIHR5cGVcbiAgICAgIGlmIChfLmlzT2JqZWN0KG5ld0FkZHJlc3MuY29pblNwZWNpZmljKSkge1xuICAgICAgICBuZXdBZGRyZXNzLmFkZHJlc3NUeXBlID0gaW5mZXJBZGRyZXNzVHlwZShuZXdBZGRyZXNzKTtcbiAgICAgIH1cblxuICAgICAgbmV3QWRkcmVzcy5rZXljaGFpbnMgPSBrZXljaGFpbnM7XG4gICAgICBuZXdBZGRyZXNzLmJhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3MgPz8gXy5nZXQodGhpcy5fd2FsbGV0LCAnY29pblNwZWNpZmljLmJhc2VBZGRyZXNzJyk7XG5cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkRhdGE6IFZlcmlmeUFkZHJlc3NPcHRpb25zID0gXy5tZXJnZSh7fSwgbmV3QWRkcmVzcywgeyByb290QWRkcmVzcyB9KTtcblxuICAgICAgaWYgKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IodmVyaWZpY2F0aW9uRGF0YS5lcnJvcik7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWNhdGlvbkRhdGEuaW1wbGllZEZvcndhcmRlclZlcnNpb24gPSBmb3J3YXJkZXJWZXJzaW9uID8/IHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljPy5mb3J3YXJkZXJWZXJzaW9uO1xuICAgICAgLy8gVGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIGZpcnN0IHBsYWNlIGJlY2F1c2UgaW4gY2Vsbywgd2hlbiB2ZXJpZnlBZGRyZXNzIG1ldGhvZCB3YXMgY2FsbGVkIG9uIGFkZHJlc3NlcyB3aGljaCB3ZXJlIGhhdmluZyBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBhcyB0cnVlLCBpdCB1c2VkIHRvIHRocm93IHNvbWUgZXJyb3JcbiAgICAgIC8vIEluIGNhc2Ugb2YgZm9yd2FyZGVyIHZlcnNpb24gMSBldGggYWRkcmVzc2VzLCBhZGRyZXNzZXMgbmVlZCB0byBiZSB2ZXJpZmllZCBldmVuIGlmIHRoZSBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBmbGFnIGlzIHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMgJiZcbiAgICAgICAgKCF2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYy5wZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiB8fCB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID09PSAxKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGNhbid0IHZlcmlmeSBhZGRyZXNzZXMgd2hpY2ggYXJlIHBlbmRpbmcgY2hhaW4gaW5pdGlhbGl6YXRpb24sIGFzIHRoZSBhZGRyZXNzIGlzIGhpZGRlblxuICAgICAgICBsZXQgaXNXYWxsZXRBZGRyZXNzID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5pc1dhbGxldEFkZHJlc3ModmVyaWZpY2F0aW9uRGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZJWE1FKEJHLTQzMjI1KTogaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzV2FsbGV0QWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgd2FsbGV0IGFkZHJlc3NgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIHNraXBwZWQgZm9yIGNvdW50ID0gJHtjb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld0FkZHJlc3M7XG4gICAgfSk7XG5cbiAgICBpZiAobmV3QWRkcmVzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ld0FkZHJlc3Nlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzc2VzOiBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzZXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHByb3BlcnRpZXMgb24gYW4gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWRkcmVzcyhwYXJhbXM6IFVwZGF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcblxuICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1dFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnbGFiZWwnXSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChwdXRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5IGNoYWluIGZvciB0aGlzIHdhbGxldFxuICAgKlxuICAgKiBUaGUgdXNlciBrZXkgY2hhaW4gaXMgdGhlIGZpcnN0IGtleWNoYWluIG9mIHRoZSB3YWxsZXQgYW5kIHVzdWFsbHkgaGFzIHRoZSBlbmNyeXB0ZWQgcHJ2IHN0b3JlZCBvbiBCaXRHby5cbiAgICogVXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdXNlcnMnIGtleWNoYWluIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgZGVjcnlwdGluZyB0byBzaWduIGEgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldEVuY3J5cHRlZFVzZXJLZXljaGFpbihwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTx7IGVuY3J5cHRlZFBydjogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0cnlLZXlDaGFpbiA9IGFzeW5jIChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IGVuY3J5cHRlZFBydjogc3RyaW5nIH0+ID0+IHtcbiAgICAgIGlmICghdGhpcy5fd2FsbGV0LmtleXMgfHwgaW5kZXggPj0gdGhpcy5fd2FsbGV0LmtleXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyB7IGVuY3J5cHRlZFBydjogc3RyaW5nIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gKGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkpIGFzIGFueTtcbiAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcblxuICAgIGxldCB1c2VyUHJ2O1xuICAgIHRyeSB7XG4gICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHVzZXJFbmNyeXB0ZWRQcnYsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Vycm9yIGRlY3J5cHRpbmcgd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGVuY3J5cHRlZCB3YWxsZXQgc2hhcmUgdG8gQml0R28uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVNoYXJlKHBhcmFtczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnB1YiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFBydiB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLmZyb21QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSBwdWIsIGVuY3J5cHRlZFBydiwgZnJvbVB1YktleSwgdG9QdWJLZXksIHBhdGgnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIHRoaXMgd2FsbGV0IHdpdGggYW5vdGhlciBCaXRHbyB1c2VyLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2hhcmVXYWxsZXQocGFyYW1zOiBTaGFyZVdhbGxldE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAnbWVzc2FnZSddKTtcblxuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPSAhcGFyYW1zLnNraXBLZXljaGFpbiAmJiBwYXJhbXMucGVybWlzc2lvbnMgJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7IGVtYWlsOiBwYXJhbXMuZW1haWwudG9Mb3dlckNhc2UoKSB9KSkgYXMgYW55O1xuICAgIGxldCBzaGFyZWRLZXljaGFpbjtcbiAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW4gPSAoYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oe30pKSBhcyBhbnk7XG4gICAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICAgIGlmIChrZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAga2V5Y2hhaW4ucHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDoga2V5Y2hhaW4uZW5jcnlwdGVkUHJ2IH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVja2V5ID0gbWFrZVJhbmRvbUtleSgpO1xuICAgICAgICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChlY2tleSwgQnVmZmVyLmZyb20oc2hhcmluZy5wdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi5wcnYgfSk7XG4gICAgICAgICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICAgICAgICBsZXQgcHViID0ga2V5Y2hhaW4ucHViID8/IGtleWNoYWluLmNvbW1vblB1YjtcbiAgICAgICAgICBpZiAoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgICAgIHB1YiA9XG4gICAgICAgICAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYSdcbiAgICAgICAgICAgICAgICA/IEVkZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKVxuICAgICAgICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgIHB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgIHBhdGg6IHNoYXJpbmcucGF0aCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpIHtcbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHt9O1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICB9O1xuXG4gICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0gc2hhcmVkS2V5Y2hhaW47XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVzZXIgZnJvbSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHVzZXJJZCBJZCBvZiB0aGUgdXNlciB0byByZW1vdmVcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVVzZXIocGFyYW1zOiBSZW1vdmVVc2VyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1c2VySWQgPSBwYXJhbXMudXNlcklkO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3VzZXIvJyArIHVzZXJJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgKHVuc2lnbmVkIHRyYW5zYWN0aW9uKSBmcm9tIEJpdEdvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gTWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyB1bnNwZW50cyBnb2luZyBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIG9uIGNoYW5nZSAoaW50ZXJuYWwpIGlucHV0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXQuIElmIHRoZSB3YWxsZXTigJlzIGN1cnJlbnQgdW5zcGVudCBjb3VudCBpcyBsb3dlciB0aGFuIHRoZSB0YXJnZXQsIHVwIHRvIGZvdXIgYWRkaXRpb25hbCBjaGFuZ2Ugb3V0cHV0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIGxhcmdlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc0xpbWl0IC0gQ3VzdG9tIGdhcyBsaW1pdCB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub25QYXJ0aWNpcGF0aW9uIC0gKEFsZ29yYW5kKSBOb24gcGFydGljaXBhdGluZyBrZXkgcmVnIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRGcm9tQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtaW5pbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZFRvQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtYXhpbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIEJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gdG8gY29uZm9ybSB3aXRoIGluc3RhbnQgc2VuZGluZyBjb2luLXNwZWNpZmljIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5rZWVwQWxpdmUgLSAoUG9sa2Fkb3QpIGtlZXAgYWRkcmVzcyBhbGl2ZSBieSBzZW5kaW5nIHRoZSBhZGRyZXNzIG1pbmltdW0gZnVuZGluZyBhbW91bnQsIHVzZWQgZHVyaW5nIHdhbGxldCBjb25zb2xpZGF0aW9uLCB0cnVlIGJ5IGRlZmF1bHRcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbS50cmFuc2ZlcklkIC0gdHJhbnNmZXIgSWQgdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgY2FzcGVyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFkZHJlc3NUeXBlIC0gVGhlIHR5cGUgb2YgYWRkcmVzcyB0byBjcmVhdGUgZm9yIGNoYW5nZS4gT25lIG9mIGBwMnNoYCwgYHAyc2hQMndzaGAsIGFuZCBgcDJ3c2hgLiBDYXNlLXNlbnNpdGl2ZS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaG9wIC0gQnVpbGQgdGhpcyBhcyBhbiBFdGhlcmV1bSBob3AgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcy5yZXNlcnZhdGlvbiAtIE9iamVjdCB0byByZXNlcnZlIHRoZSB1bnNwZW50cyB0aGF0IHRoaXMgdHggYnVpbGQgdXNlcy4gRm9ybWF0IGlzIHJlc2VydmF0aW9uID0geyBleHBpcmVUaW1lOiBJU09EYXRlU3RyaW5nLCBwZW5kaW5nQXBwcm92YWxJZDogU3RyaW5nIH1cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIFRoZSBwYXNzcGhyYXNlIHRvIHRoZSB3YWxsZXQgdXNlciBrZXksIHRvIHNpZ24gY29tbWl0bWVudCBkYXRhIGZvciBFdGhlcmV1bSBob3AgdHJhbnNhY3Rpb25zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzIC0gVGhlIGNvbnRyYWN0IGFkZHJlc3MgdXNlZCBhcyB0aGUgXCJ0b1wiIGZpZWxkIG9mIGEgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBwcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvblRzcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgT2JqZWN0LmFzc2lnbih3aGl0ZWxpc3RlZFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgb2ZmbGluZVZlcmlmaWNhdGlvbjogcGFyYW1zLm9mZmxpbmVWZXJpZmljYXRpb24gPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICBjb25zdCBidWlsZFF1ZXJ5ID0gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvYnVpbGQnKSlcbiAgICAgIC5xdWVyeShxdWVyeVBhcmFtcylcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuXG4gICAgY29uc3QgYmxvY2tIZWlnaHRRdWVyeSA9IF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KVxuICAgICAgPyAodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmdldExhdGVzdEJsb2NrSGVpZ2h0KHBhcmFtcy5yZXFJZClcbiAgICAgIDogUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgcXVlcmllcyA9IFtidWlsZFF1ZXJ5LCBibG9ja0hlaWdodFF1ZXJ5XTtcbiAgICBjb25zdCBbYnVpbGRSZXNwb25zZSwgYmxvY2tIZWlnaHRdID0gKGF3YWl0IFByb21pc2UuYWxsKHF1ZXJpZXMpKSBhcyBhbnk7XG4gICAgZGVidWcoJ3Bvc3Rwcm9jZXNzaW5nIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIGJ1aWxkUmVzcG9uc2UpO1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChibG9ja0hlaWdodCkpIHtcbiAgICAgIGJ1aWxkUmVzcG9uc2UuYmxvY2tIZWlnaHQgPSBibG9ja0hlaWdodDtcbiAgICB9XG4gICAgbGV0IHByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgIE9iamVjdC5hc3NpZ24oYnVpbGRSZXNwb25zZSwgeyB3YWxsZXQ6IHRoaXMsIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzIH0pO1xuICAgIH1cbiAgICBkZWJ1ZygnZmluYWwgdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuICAgIHJldHVybiBwcmVidWlsZCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFVzZXIgS2V5Y2hhaW4gYW5kIHNpZ24gYSBUU1MgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHR4UmVxdWVzdElkIFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlkXG4gICAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIFRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcmV0dXJuIFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBhc3luYyBnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uKHtcbiAgICB0eFJlcXVlc3RJZCxcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICB9OiB7XG4gICAgdHhSZXF1ZXN0SWQ6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFVzZXJLZXlBbmRTaWduVHNzVHJhbnNhY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgIXVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgdW5hYmxlIHRvIGRlY3J5cHQga2V5Y2hhaW4gd2l0aCB0aGUgZ2l2ZW4gd2FsbGV0IHBhc3NwaHJhc2UuIEVycm9yOiAke0pTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICk7XG4gICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24oeyB0eFByZWJ1aWxkOiB7IHR4UmVxdWVzdElkIH0sIHdhbGxldFBhc3NwaHJhc2UsIHJlcUlkLCBrZXljaGFpbjogdXNlcktleWNoYWluIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhQcmVidWlsZFxuICAgKiAtIFtrZXljaGFpbiAvIGtleV0gKG9iamVjdCkgb3IgcHJ2IChzdHJpbmcpXG4gICAqIC0gd2FsbGV0UGFzc3BocmFzZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgYXBpVmVyc2lvbiwgdHhSZXF1ZXN0SWQgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQSh0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmICghdHhQcmVidWlsZCB8fCB0eXBlb2YgdHhQcmVidWlsZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIGlzIHJlcXVpcmVkIGZvciBvbi1jaGFpbiBtdWx0aXNpZyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBvciB0eFJlcXVlc3RJZCBpcyByZXF1aXJlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGV4dGVybmFsIHNpZ25lciBUU1MgZmxvd1xuICAgICAgcGFyYW1zLnR4UHJlYnVpbGQgPSB7IHR4UmVxdWVzdElkIH07XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3MoeyAuLi5wcmVzaWduLCBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSwgYXBpVmVyc2lvbiB9KTtcbiAgICB9XG5cbiAgICBsZXQgeyBwdWJzIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwdWJzICYmIHRoaXMuYmFzZUNvaW4ua2V5SWRzRm9yU2lnbmluZygpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBwdWJzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgICAgICBhc3NlcnQoay5wdWIpO1xuICAgICAgICByZXR1cm4gay5wdWI7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25QYXJhbXMgPSB7XG4gICAgICAuLi5wcmVzaWduLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi50eFByZWJ1aWxkLCB3YWxsZXRJZDogdGhpcy5pZCgpIH0sXG4gICAgICBwdWJzLFxuICAgICAgY29pbjogdGhpcy5iYXNlQ29pbixcbiAgICB9O1xuXG4gICAgaWYgKF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKSkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VDb2luLnNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sIHNpZ25UcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXlzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcyB9KTtcbiAgICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtc1dpdGhTZWVkID0ge1xuICAgICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICAgIGRlcml2YXRpb25TZWVkOiBrZXlzWzBdPy5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkLFxuICAgICAgfTtcbiAgICAgIHJldHVybiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHNpZ25UcmFuc2FjdGlvblBhcmFtc1dpdGhTZWVkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvaW4uc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0eXBlZCBzdHJ1Y3R1cmVkIGRhdGEgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHNpZ25UeXBlZERhdGEocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1NpZ25pbmdUeXBlZERhdGEoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduIHR5cGVkIGRhdGEgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlZCBkYXRhIHJlcXVpcmVkYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpZ25pbmcgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGVkRGF0YS50eXBlZERhdGFSYXcgbXVzdCBiZSBKU09OIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKSkge1xuICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEocGFyYW1zLnR5cGVkRGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgY29uc3QgdXNlclBydk9wdGlvbnM6IEdldFVzZXJQcnZPcHRpb25zID0geyAuLi5wYXJhbXMsIGtleWNoYWluOiBrZXljaGFpbnNbMF0gfTtcbiAgICBhc3NlcnQoa2V5Y2hhaW5zWzBdLmNvbW1vbktleWNoYWluLCAnVW5hYmxlIHRvIGZpbmQgY29tbW9uS2V5Y2hhaW4gaW4ga2V5Y2hhaW5zJyk7XG4gICAgY29uc3QgcHJlc2lnbiA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgICAgcHJ2OiB0aGlzLmdldFVzZXJQcnYodXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICBwdWI6IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5zaWduVHlwZWREYXRhVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqICBTaWduIGEgbWVzc2FnZSB1c2luZyBUU1NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIE1lc3NhZ2VcbiAgICogLSBjdXN0b2RpYW5NZXNzYWdlSWRcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNNZXNzYWdlU2lnbmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2Ugc2lnbmluZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMubWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZScpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZSkpIHtcbiAgICAgIHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVNZXNzYWdlKHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VSYXcpO1xuICAgIH1cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuICAgIGNvbnN0IHVzZXJQcnZPcHRpb25zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHsgLi4ucGFyYW1zLCBrZXljaGFpbjoga2V5Y2hhaW5zWzBdIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogdGhpcy5nZXRVc2VyUHJ2KHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnNpZ25NZXNzYWdlVHNzKHByZXNpZ24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlciBwcml2YXRlIGtleSBmcm9tIGVpdGhlciBhIGRlcml2YXRpb24gb3IgYW4gZW5jcnlwdGVkIGtleWNoYWluXG4gICAqIEBwYXJhbSBbcGFyYW1zLmtleWNoYWluIC8gcGFyYW1zLmtleV0gKG9iamVjdCkgb3IgcGFyYW1zLnBydiAoc3RyaW5nKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgKHN0cmluZylcbiAgICovXG4gIGdldFVzZXJQcnYocGFyYW1zOiBHZXRVc2VyUHJ2T3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBwYXJhbXMua2V5Y2hhaW4gfHwgcGFyYW1zLmtleTtcbiAgICBsZXQgdXNlclBydiA9IHBhcmFtcy5wcnY7XG4gICAgaWYgKHVzZXJQcnYgJiYgdHlwZW9mIHVzZXJQcnYgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gdXNlIHRoZSBgZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZGAgcHJvcGVydHkgZnJvbSB0aGUgdXNlciBrZXljaGFpbiBhcyB0aGUgYGNvbGREZXJpdmF0aW9uU2VlZGBcbiAgICAvLyBpZiBubyBvdGhlciBgY29sZERlcml2YXRpb25TZWVkYCB3YXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgIC8vIE9ubHkgZm9yIG9uY2hhaW4gbXVsdGlzaWcgd2FsbGV0cywgVFNTIGtleSBkZXJpdmF0aW9uIGhhcHBlbnMgZHVyaW5nIHRoZSBzaWduaW5nIHByb2Nlc3NcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLm11bHRpc2lnVHlwZSgpID09PSAnb25jaGFpbidcbiAgICApIHtcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPSBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDtcbiAgICB9XG5cbiAgICBpZiAodXNlclBydiAmJiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkKSB7XG4gICAgICAvLyB0aGUgZGVyaXZhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gYSBrZXkgYWxyZWFkeSBleGlzdHNcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHsga2V5OiB1c2VyUHJ2LCBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkIH0pO1xuICAgICAgdXNlclBydiA9IGRlcml2YXRpb24ua2V5O1xuICAgIH0gZWxzZSBpZiAoIXVzZXJQcnYpIHtcbiAgICAgIGlmICghdXNlcktleWNoYWluIHx8IHR5cGVvZiB1c2VyS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW4gbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXJFbmNyeXB0ZWRQcnYgPSB1c2VyS2V5Y2hhaW4uZW5jcnlwdGVkUHJ2O1xuICAgICAgaWYgKCF1c2VyRW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICAgIH1cbiAgICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIHByb3BlcnR5IG1pc3NpbmcnKTtcbiAgICAgIH1cblxuICAgICAgdXNlclBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gQml0R28sIHZhbGlkYXRlIGl0LCBhbmQgdGhlbiBkZWNyeXB0IHRoZSB1c2VyIGtleSBhbmQgc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkgJiYgcGFyYW1zLmdhc1ByaWNlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwYXJhbXMuZWlwMTU1OSBhbmQgcGFyYW1zLmdhc1ByaWNlIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9nYXNQcmljZV9hbmRfZWlwMTU1OWdhc01vZGVsX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnByZWJ1aWxkVHggJiYgcGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHByZWJ1aWxkVHggYW5kIHJlY2lwaWVudHMgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX3ByZWJ1aWxkdHhfYW5kX3JlY2lwaWVudHNfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAhQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIGFycmF5Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2lwaWVudHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzQXJyYXkodGhpcy5fcGVybWlzc2lvbnMpICYmICF0aGlzLl9wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbm8gc3BlbmQgcGVybWlzc2lvbiBvbiB0aGlzIHdhbGxldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICd1c2VyX25vdF9hbGxvd2VkX3RvX3NwZW5kX2Zyb21fd2FsbGV0JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjZWl2ZUFkZHJlc3MgJiYgKHBhcmFtcy50eXBlID09PSAndHJhbnNmZXInIHx8IHBhcmFtcy50eXBlID09PSAndHJhbnNmZXJUb2tlbicpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKGBjYW5ub3QgdXNlIHJlY2VpdmUgYWRkcmVzcyBmb3IgVFNTIHRyYW5zYWN0aW9ucyBvZiB0eXBlICR7cGFyYW1zLnR5cGV9YCk7XG4gICAgICBlcnJvci5jb2RlID0gJ3JlY2VpdmVfYWRkcmVzc19ub3RfYWxsb3dlZF9mb3JfdHNzX3dpdGhkcmF3YWxzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAocGFyYW1zLnR5cGUgPT09ICdmaWxsTm9uY2UnIHx8IHBhcmFtcy50eXBlID09PSAnYWNjZWxlcmF0aW9uJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCBwcm92aWRlIHJlY2lwaWVudHMgZm9yIHRyYW5zYWN0aW9uIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYWxsb3dlZF9mb3JfZmlsbG5vbmNlX2FuZF9hY2NlbGVyYXRpb25fdHhfdHlwZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY29uc3Qgc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMgPSB0aGlzLnRzc1V0aWxzPy5zdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucygpIHx8IFtdO1xuICAgIGlmIChwYXJhbXMuYXBpVmVyc2lvbiAmJiAhc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMuaW5jbHVkZXMocGFyYW1zLmFwaVZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbiBwYXJhbXMuYXBpVmVyc2lvbj0ke3BhcmFtcy5hcGlWZXJzaW9ufSBtdXN0IGJlIG9uZSBvZiAke3N1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICAvLyB3ZSBpZ25vcmUgdGhpcyBjaGVjayB3aXRoIGlmIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBpcyBwcm92aWRlZFxuICAgIC8vICB3aGljaCBtZWFucyB0aGF0IHRoZSB1c2VyIGlzIGhhbmRsaW5nIHRoZSBzaWduaW5nIGluIGV4dGVybmFsIHNpZ25pbmcgbW9kZVxuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiAmJiAhcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDoga2V5Y2hhaW5zWzBdLmVuY3J5cHRlZFBydiBhcyBzdHJpbmcsIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgdW5hYmxlIHRvIGRlY3J5cHQga2V5Y2hhaW4gd2l0aCB0aGUgZ2l2ZW4gd2FsbGV0IHBhc3NwaHJhc2UuIEVycm9yOiAke0pTT04uc3RyaW5naWZ5KGUpfWBcbiAgICAgICk7XG4gICAgICBlcnJvci5jb2RlID0gJ3dhbGxldF9wYXNzcGhyYXNlX2luY29ycmVjdCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBsZXQgdHhQcmVidWlsZFF1ZXJ5OiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgfCBzdHJpbmc+O1xuICAgIGlmIChpc1ByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQocGFyYW1zLnByZWJ1aWxkVHgpICYmIHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zPy5wcmV2aWV3KSB7XG4gICAgICAvLyBJZiB3ZSBwcmVidWlsdCB0aGUgdHhSZXF1ZXN0IHdpdGggcHJldmlldz10cnVlLCB0aGVuIHdlIHNob3VsZCByZWJ1aWxkIHdpdGggcHJldmlldz1mYWxzZSB0byBwZXJzaXN0IHRoZSByZXF1ZXN0XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24oe1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIC4uLnsgLi4ucGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMsIHByZXZpZXc6IGZhbHNlIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIHByZWJ1aWxkIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGluZyBhbiBleHBsaWNpdCB0eFxuICAgIGNvbnN0IHR4UHJlYnVpbGQgPSAoYXdhaXQgdHhQcmVidWlsZFF1ZXJ5KSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFBhcmFtczogdHhQcmVidWlsZC5idWlsZFBhcmFtcyB8fCBwYXJhbXMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgdmVyaWZpY2F0aW9uOiBwYXJhbXMudmVyaWZpY2F0aW9uID8/IHt9LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgICB3YWxsZXRUeXBlOiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQgZmFpbGVkIGxvY2FsIHZhbGlkYXRpb246JywgZS5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICd0cmFuc2FjdGlvbiBwYXJhbXM6JyxcbiAgICAgICAgXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleScsICd3YWxsZXQnXSlcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZDonLCB0eFByZWJ1aWxkKTtcbiAgICAgIGNvbnNvbGUudHJhY2UoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBwYXNzIG91ciB0aHJlZSBrZXlzXG4gICAgY29uc3Qgc2lnbmluZ1BhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQsXG4gICAgICB3YWxsZXQ6IHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgbXVsdGlzaWcgYWRkcmVzcyBhdCB3YWxsZXQgY3JlYXRpb24gdGltZVxuICAgICAgICBhZGRyZXNzVmVyc2lvbjogdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy5hZGRyZXNzVmVyc2lvbixcbiAgICAgIH0sXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgYmFja3VwS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAxID8ga2V5Y2hhaW5zWzFdIDogbnVsbCxcbiAgICAgIGJpdGdvS2V5Y2hhaW46IGtleWNoYWlucy5sZW5ndGggPiAyID8ga2V5Y2hhaW5zWzJdIDogbnVsbCxcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICBzaWduaW5nUGFyYW1zLnB1YnMgPSBrZXljaGFpbnMubWFwKChrKSA9PiB7XG4gICAgICAgIGFzc2VydChrLnB1Yik7XG4gICAgICAgIHJldHVybiBrLnB1YjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgICAgY29uc3QgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5nZXRUeFJlcXVlc3Qoc2lnbmluZ1BhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKTtcbiAgICAgIGlmICh0aGlzLnRzc1V0aWxzLmlzUGVuZGluZ0FwcHJvdmFsVHhSZXF1ZXN0RnVsbCh0eFJlcXVlc3QpKSB7XG4gICAgICAgIHJldHVybiB0eFJlcXVlc3Q7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2luc3VmZmljaWVudCBmdW5kcycpKSB7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnaW5zdWZmaWNpZW50X2Z1bmRzJztcbiAgICAgICAgZXJyb3Iud2FsbGV0QmFsYW5jZXMgPSB7XG4gICAgICAgICAgYmFsYW5jZVN0cmluZzogdGhpcy5iYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZVN0cmluZzogdGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZzogdGhpcy5zcGVuZGFibGVCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgYmFsYW5jZTogdGhpcy5iYWxhbmNlKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZTogdGhpcy5jb25maXJtZWRCYWxhbmNlKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZTogdGhpcy5zcGVuZGFibGVCYWxhbmNlKCksXG4gICAgICAgIH07XG4gICAgICAgIGVycm9yLnR4UGFyYW1zID0gXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleSddKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlbGVyYXRlIGEgdHJhbnNhY3Rpb24ncyBjb25maXJtYXRpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhY2NlbGVyYXRlVHJhbnNhY3Rpb24ocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIFRPRE8oQkctOTM0OSk6IGNoYW5nZSB0aGUgbGFzdCBjaGVjayB0byA+IDAgYW5kIHRoZSBlcnJvciBtZXNzYWdlIG9uY2UgcGxhdGZvcm0gYWxsb3dzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyB0b1xuICAgIC8vICAgICAgICAgICAgICAgIGJlIGJ1bXBlZCBpbiB0aGUgc2FtZSBDUEZQIHRyYW5zYWN0aW9uXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmNwZnBUeElkcykgfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zLmNwZnBUeElkcykgfHwgcGFyYW1zLmNwZnBUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBjcGZwVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuY3BmcEZlZVJhdGUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vQ3BmcEZlZVJhdGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vQ3BmcEZlZVJhdGUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5jcGZwRmVlUmF0ZSkgfHwgcGFyYW1zLmNwZnBGZWVSYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vTWF4RmVlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9NYXhGZWUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4RmVlKSB8fCBwYXJhbXMubWF4RmVlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykgfHwgcGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBmb3IgJ3JlY2lwaWVudHMnOiBtdXN0IGJlIGVtcHR5IGFycmF5IHdoZW4gc2V0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyYW1zLnJlY2lwaWVudHMgPSBbXTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLihhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpLFxuICAgICAgLi4uQnVpbGRQYXJhbXMuZW5jb2RlKHBhcmFtcyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4SGV4OiB0cmFuc2FjdGlvbiBoZXggdG8gc3VibWl0XG4gICAqIC0gaGFsZlNpZ25lZDogb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gKHR4SGV4IG9yIHR4QmFzZTY0KSB0byBzdWJtaXRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdFRyYW5zYWN0aW9uKHBhcmFtczogU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ290cCcsICd0eEhleCcsICd0eFJlcXVlc3RJZCddKTtcbiAgICBjb25zdCBoYXNUeEhleCA9ICEhcGFyYW1zLnR4SGV4O1xuICAgIGNvbnN0IGhhc0hhbGZTaWduZWQgPSAhIXBhcmFtcy5oYWxmU2lnbmVkO1xuXG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCAmJiAoaGFzVHhIZXggfHwgaGFzSGFsZlNpZ25lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZXhhY3RseSBvbmUgb2YgdHhSZXF1ZXN0SWQsIHR4SGV4LCBvciBoYWxmU2lnbmVkJyk7XG4gICAgfSBlbHNlIGlmICghcGFyYW1zLnR4UmVxdWVzdElkICYmICgoaGFzVHhIZXggJiYgaGFzSGFsZlNpZ25lZCkgfHwgKCFoYXNUeEhleCAmJiAhaGFzSGFsZlNpZ25lZCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0eEhleCBvciBoYWxmU2lnbmVkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuICAgIGlmIChhbW91bnQuaXNOZWdhdGl2ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7IHJlY2lwaWVudHMgfSk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoc2VuZE1hbnlPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIG1vbmV5IHRvIG11bHRpcGxlIHJlY2lwaWVudHNcbiAgICogMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHBydlxuICAgKiAyLiBEZWNyeXB0cyB1c2VyIGtleVxuICAgKiAzLiBDcmVhdGVzIHRoZSB0cmFuc2FjdGlvbiB3aXRoIGRlZmF1bHQgZmVlXG4gICAqIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4gICAqIDUuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuICAgKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gICAqIEBwYXJhbSB7e2FkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmd9fSBwYXJhbXMucmVjaXBpZW50cyAtIGxpc3Qgb2YgcmVjaXBpZW50cyBhbmQgbmVjZXNzYXJ5IHJlY2lwaWVudCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm51bUJsb2NrcyAtIEVzdGltYXRlcyB0aGUgYXBwcm94aW1hdGUgZmVlIHBlciBraWxvYnl0ZSBuZWNlc3NhcnkgZm9yIGEgdHJhbnNhY3Rpb24gY29uZmlybWF0aW9uIHdpdGhpbiBudW1CbG9ja3MgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIHRoZSBkZXNpcmVkIGZlZVJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvdGhpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlcyBtaW5Db25maXJtcyBvbiBjaGFuZ2UgaW5wdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgLSBUaGUgZGVzaXJlZCBjb3VudCBvZiB1bnNwZW50cyBpbiB0aGUgd2FsbGV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgc21hbGxlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jb21tZW50IC0gQW55IGFkZGl0aW9uYWwgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY2hhbmdlQWRkcmVzcyAtIFNwZWNpZmllcyB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGNoYW5nZSBvdXRwdXRcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIFNlbmQgdGhpcyB0cmFuc2FjdGlvbiB1c2luZyBjb2luLXNwZWNpZmljIGluc3RhbnQgc2VuZGluZyBtZXRob2QgKGlmIGF2YWlsYWJsZSlcbiAgICogQHBhcmFtIHt7dmFsdWU6IFN0cmluZywgdHlwZTogU3RyaW5nfX0gcGFyYW1zLm1lbW8gLSBNZW1vIHRvIHVzZSBpbiB0cmFuc2FjdGlvbiAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHlwZSAtIFR5cGUgb2YgdGhlIHRyYW5zYWN0aW9uIChlLmcuIHRydXN0bGluZSlcbiAgICogQHBhcmFtIHt7dG9rZW46IHBhcmFtcywgYWN0aW9uOiBTdHJpbmcsIGxpbWl0OiBTdHJpbmd9W119IG9wdGlvbnMudHJ1c3RsaW5lcyAtIEFycmF5IG9mIHRydXN0bGluZXMgdG8gbWFuYWdlIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kTWFueShwYXJhbXM6IFNlbmRNYW55T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydjb21tZW50JywgJ290cCddKTtcbiAgICBkZWJ1Zygnc2VuZE1hbnkgY2FsbGVkJyk7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBwYXJhbXMucmVxSWQgPSByZXFJZDtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IGNvaW4gPSB0aGlzLmJhc2VDb2luO1xuICAgIGlmIChfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMubWFwKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gbmV3IEJpZ051bWJlcihyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgICAgaWYgKGFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29pbi52YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSAmJiBhbW91bnQuaXNaZXJvKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIHBvc2l0aXZlIG51bWJlciBncmVhdGVyIHRoYW4gemVybyBvciBudW1lcmljIHN0cmluZyBleHBlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWy4uLnRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpLCAnY29tbWVudCcsICdvdHAnLCAnaG9wJ10pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHNlbGVjdFBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGFuIHVuc3VwcG9ydGVkIHRva2VuIGZyb20gYSBCaXRHbyBtdWx0aXNpZyB3YWxsZXRcbiAgICogcGFyYW1zIGFyZSB2YWxpZGF0ZWQgaW4gRXRoLnByb3RvdHlwZS5yZWNvdmVyVG9rZW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB1bnN1cHBvcnRlZCB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY2lwaWVudCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyByZWNvdmVyZWQgdG9rZW5zIHNob3VsZCBiZSBzZW50IHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgdGhlIHhwcnZcbiAgICovXG4gIGFzeW5jIHJlY292ZXJUb2tlbihwYXJhbXM6IFJlY292ZXJUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHJlY292ZXJ5IG9ubHkgc3VwcG9ydGVkIGZvciBldGggd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodG9rZW5Db250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciB0b2tlbkNvbnRyYWN0QWRkcmVzcycpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlY2lwaWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHJlY2lwaWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJUb2tlbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9LCBwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnJlY292ZXJUb2tlbihyZWNvdmVyVG9rZW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gbWV0YWRhdGEgZm9yIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nIG9yIGF0dGVtcHRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHR4aWQsIHdhbGxldElkLCB0eCwgYW5kIGZlZSAoaWYgc3VwcG9ydGVkIGZvciBjb2luKVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGludGVybmFsLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LCB0aGlzLmJhc2VDb2luLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGZlZSBvbiB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB0eGlkIHRvIHRoZSBnaXZlbiBuZXcgZmVlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eGlkIFRoZSB0cmFuc2FjdGlvbiBJZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2FjdGlvbiB3aG9zZSBmZWUgaXMgdG8gYmUgY2hhbmdlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5mZWVdIE9wdGlvbmFsIC0gVGhlIG5ldyBmZWUgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZWlwMTU1OV0gT3B0aW9uYWwgLSB0aGUgZWlwMTU1OSB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBuZXcgdHJhbnNhY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGZlZSByYXRlXG4gICAqL1xuICBhc3luYyBjaGFuZ2VGZWUocGFyYW1zOiBDaGFuZ2VGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMuZmVlKSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnLCAnZmVlJ10sIFtdKTtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMuZWlwMTU1OSwgWydtYXhGZWVQZXJHYXMnLCAnbWF4UHJpb3JpdHlGZWVQZXJHYXMnXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2NoYW5nZUZlZScpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm8gZnJvbSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVybCBUaGUgVXJsIHRvIHJldHJpZXZlIGluZm8gZnJvbVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFBheW1lbnRJbmZvKHBhcmFtczogeyB1cmw/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcGF5bWVudEluZm8nKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGpzb24gcGF5bWVudCByZXNwb25zZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucGF5bWVudFVybCAtIFRoZSB1cmwgdG8gc2VuZCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IG9mIHRoZSBwYXltZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVtbyB7U3RyaW5nfSAtIEEgbWVtbyBzdXBwbGllZCBieSB0aGUgbWVyY2hhbnQsIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRyYW5zZmVyIGFzIHRoZSBjb21tZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZXhwaXJlcyB7U3RyaW5nfSAtIElTTyBEYXRlIGZvcm1hdCBvZiB3aGVuIHRoZSBwYXltZW50IHJlcXVlc3QgZXhwaXJlc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXIgUGF5bWVudCBBY2tcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNlbmRQYXltZW50UmVzcG9uc2UocGFyYW1zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NlbmRQYXltZW50JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvbGljeVJ1bGUocGFyYW1zOiBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZXRQb2xpY3lSdWxlKHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgUG9saWN5IFJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBvbGljeVJ1bGUocGFyYW1zOiBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjcm9zc0NoYWluIFVUWE9zXG4gICAqIEN1cnJlbnRseSBvbmx5IGZvciBBVkFYXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlQ2hhaW4gdGhlIHNvdXJjZWNoYWluIHRvIHBpY2sgVVRYT3MsIGlmIG5vdCBnaXZlbiwgdGhlbiBwaWNrIGZyb20gYWxsIGF2YWlsYWJsZSBjaGFpbnMgW1AsIENdXG4gICAqL1xuICBmZXRjaENyb3NzQ2hhaW5VVFhPcyhwYXJhbXM6IEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyk6IFByb21pc2U8Q3Jvc3NDaGFpblVUWE9bXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgWydzb3VyY2VDaGFpbiddKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9jcm9zc0NoYWluVW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYSBKU09OIHJlcHJlc2VudGFibGUgdmVyc2lvbiBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9KU09OKCk6IFdhbGxldERhdGEge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdHJhZGluZyBhY2NvdW50IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvVHJhZGluZ0FjY291bnQoKTogVHJhZGluZ0FjY291bnQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHRyYWRpbmcgYWNjb3VudCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRyYWRpbmdBY2NvdW50KHRoaXMuX3dhbGxldC5lbnRlcnByaXNlLCB0aGlzLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1N0YWtpbmdXYWxsZXQoKTogU3Rha2luZ1dhbGxldCB7XG4gICAgY29uc3QgaXNFdGhUc3MgPVxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PSAnZXRoJyAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy53YWxsZXRWZXJzaW9uXG4gICAgICAgID8gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy53YWxsZXRWZXJzaW9uID49IDNcbiAgICAgICAgOiBmYWxzZTtcbiAgICByZXR1cm4gbmV3IFN0YWtpbmdXYWxsZXQodGhpcywgaXNFdGhUc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGRvd25sb2FkcyBQREYga2V5Y2FyZCBmb3Igd2FsbGV0IChyZXF1aXJlcyByZXNwb25zZSBmcm9tIHdhbGxldHMuZ2VuZXJhdGVXYWxsZXQpXG4gICAqXG4gICAqIE5vdGU6IHRoaXMgaXMgZXhhbXBsZSBjb2RlIGFuZCBpcyBub3QgdGhlIHZlcnNpb24gdXNlZCBvbiBiaXRnby5jb21cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICoganNQREYgLSBhbiBpbnN0YW5jZSBvZiB0aGUganNQREYgbGlicmFyeVxuICAgKiAgICogUVJDb2RlIC0gYW4gaW5zdGFuY2Ugb2YgdGhlIFFSaW91cyBsaWJyYXJ5XG4gICAqICAgKiB1c2VyS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgdXNlciBrZXljaGFpblxuICAgKiAgICogYmFja3VwS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYmFja3VwIGtleWNoYWluXG4gICAqICAgKiBiaXRnb0tleWNoYWluIC0gYSB3YWxsZXQncyBwcml2YXRlIGJpdGdvIGtleWNoYWluXG4gICAqICAgKiBwYXNzcGhyYXNlIC0gdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqICAgKiBwYXNzY29kZUVuY3J5cHRpb25Db2RlIC0gdGhlIGVuY3J5cHRpb24gc2VjcmV0IHVzZWQgZm9yIEJveCBEXG4gICAqICAgKiBhY3RpdmF0aW9uQ29kZSAtIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIHNpeC1kaWdpdCBhY3RpdmF0aW9uIGNvZGVcbiAgICogICAqIHdhbGxldEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3Mgc2lnbmluZyBrZXlcbiAgICogICAqIGJhY2t1cEtleUlEIC0gdGhlIEtleSBJRCB1c2VkIGZvciBkZXJpdmluZyBhIGNvbGQgd2FsbGV0J3MgYmFja3VwIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRvd25sb2FkS2V5Y2FyZChwYXJhbXM6IERvd25sb2FkS2V5Y2FyZE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cubG9jYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGRvd25sb2FkS2V5Y2FyZCBmdW5jdGlvbiBpcyBvbmx5IGNhbGxhYmxlIHdpdGhpbiBhIGJyb3dzZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gR3JhYiBwYXJhbWV0ZXJzIHdpdGggZGVmYXVsdCBmb3IgYWN0aXZhdGlvbkNvZGVcbiAgICBjb25zdCB7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICAgIGFjdGl2YXRpb25Db2RlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogOTAwMDAwICsgMTAwMDAwKS50b1N0cmluZygpLFxuICAgIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIWpzUERGIHx8IHR5cGVvZiBqc1BERiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcGFzcyBpbiBhIHZhbGlkIGpzUERGIGluc3RhbmNlJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUga2V5Y2hhaW5zXG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGtleWNoYWluIG11c3QgaGF2ZSBhICd1c2VyJyBwcm9wZXJ0eWApO1xuICAgIH1cblxuICAgIGlmICghYmFja3VwS2V5Y2hhaW4gfHwgdHlwZW9mIGJhY2t1cEtleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWNrdXAga2V5Y2hhaW4gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFiaXRnb0tleWNoYWluIHx8IHR5cGVvZiBiaXRnb0tleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaXRnbyBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAod2FsbGV0S2V5SUQgJiYgdHlwZW9mIHdhbGxldEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGJhY2t1cEtleUlEICYmIHR5cGVvZiBiYWNrdXBLZXlJRCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5SUQgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFjdGl2YXRpb24gY29kZSBpZiBwcm92aWRlZFxuICAgIGlmICh0eXBlb2YgYWN0aXZhdGlvbkNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gQ29kZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2YXRpb25Db2RlLmxlbmd0aCAhPT0gNikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmF0aW9uIGNvZGUgbXVzdCBiZSBzaXggY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvaW5TaG9ydE5hbWUgPSB0aGlzLmJhc2VDb2luLnR5cGU7XG4gICAgY29uc3QgY29pbk5hbWUgPSB0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCk7XG4gICAgY29uc3Qgd2FsbGV0TGFiZWwgPSB0aGlzLl93YWxsZXQubGFiZWw7XG5cbiAgICBjb25zdCBkb2MgPSBkcmF3S2V5Y2FyZCh7XG4gICAgICBqc1BERixcbiAgICAgIFFSQ29kZSxcbiAgICAgIGVuY3J5cHQ6IHRoaXMuYml0Z28uZW5jcnlwdCxcbiAgICAgIGNvaW5TaG9ydE5hbWUsXG4gICAgICBjb2luTmFtZSxcbiAgICAgIGFjdGl2YXRpb25Db2RlLFxuICAgICAgd2FsbGV0TGFiZWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgcGFzc2NvZGVFbmNyeXB0aW9uQ29kZSxcbiAgICAgIHVzZXJLZXljaGFpbixcbiAgICAgIGJhY2t1cEtleWNoYWluLFxuICAgICAgYml0Z29LZXljaGFpbixcbiAgICAgIHdhbGxldEtleUlELFxuICAgICAgYmFja3VwS2V5SUQsXG4gICAgfSk7XG5cbiAgICAvLyBTYXZlIHRoZSBQREYgb24gdGhlIHVzZXIncyBicm93c2VyXG4gICAgZG9jLnNhdmUoYEJpdEdvIEtleWNhcmQgZm9yICR7d2FsbGV0TGFiZWx9LnBkZmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9ucyBmb3IgYSB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBidWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhcbiAgICBwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRDb25zb2xpZGF0ZUFjY291bnRQYXJhbXMoKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb246ICVPJywgd2hpdGVsaXN0ZWRQYXJhbXMpO1xuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb3VsZCByZXR1cm4gMTAwIGJ1aWxkIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IGJ1aWxkUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvY29uc29saWRhdGVBY2NvdW50L2J1aWxkJykpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgLy8gd2UgbmVlZCB0byBzdGVwIG92ZXIgZWFjaCBwcmVidWlsZCBub3cgLSBzaG91bGQgYmUgaW4gYW4gYXJyYXkgaW4gdGhlIGJvZHlcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uczogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zb2xpZGF0ZUFjY291bnRCdWlsZCBvZiBidWlsZFJlc3BvbnNlKSB7XG4gICAgICBsZXQgcHJlYnVpbGQ6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5wb3N0UHJvY2Vzc1ByZWJ1aWxkKFxuICAgICAgICBPYmplY3QuYXNzaWduKGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkLCB7IHdhbGxldDogdGhpcywgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zIH0pXG4gICAgICApKSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuXG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgICAgZGVidWcoJ2ZpbmFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuXG4gICAgICBjb25zb2xpZGF0aW9ucy5wdXNoKHByZWJ1aWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGlkYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBwcmVidWlsZFR4ICAgLSB0aGlzIGlzIHRoZSBwcmUtYnVpbGQgY29uc29saWRhdGlvbiB0eC4gdGhpcyBpcyBhIG5vcm1hbGx5IGJ1aWx0IHR4IHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIG9mIGNvbnNvbGlkYXRlSWQuXG4gICAqICAgICB2ZXJpZmljYXRpb24gLSBub3JtYWwga2V5Y2hhaW5zLCBldGMuIGZvciB2ZXJpZmljYXRpb25cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgcGFyYW1zLnR5cGUgPSAnY29uc29saWRhdGUnO1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbihwYXJhbXMgYXMgVHhTZW5kQm9keSk7XG4gICAgfVxuXG4gICAgLy8gb25lIG9mIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJ1aWxkIG9mIGFjY291bnQgY29uc29saWRhdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LmNvbnNvbGlkYXRlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgY29uc29saWRhdGlvbiBpZCBvbiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC50eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnNvbGlkYXRpb24gcmVxdWVzdCBtaXNzaW5nIHR4UmVxdWVzdElkLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVRzcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuXG4gICAgLy8gZGVjb3JhdGUgd2l0aCBvdXIgY29uc29saWRhdGlvbiBpZFxuICAgIHNpZ25lZFByZWJ1aWxkLmNvbnNvbGlkYXRlSWQgPSBwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkO1xuXG4gICAgZGVsZXRlIHNpZ25lZFByZWJ1aWxkLndhbGxldDtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGFjY291bnQgY29uc29saWRhdGlvbnMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gZmx1c2ggbWFueSBiYWxhbmNlcyB0byB0aGUgcm9vdCB3YWxsZXQgYmFsYW5jZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgICBjb25zb2xpZGF0ZUFkZHJlc3NlcyAtIHRoZXNlIGFyZSB0aGUgb24tY2hhaW4gcmVjZWl2ZSBhZGRyZXNzZXMgd2Ugd2FudCB0byBwaWNrIGEgY29uc29saWRhdGlvbiBhbW91bnQgZnJvbVxuICAgKi9cbiAgYXN5bmMgc2VuZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXM6IEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBnaXZlcyB1cyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSAoYXdhaXQgdGhpcy5idWlsZEFjY291bnRDb25zb2xpZGF0aW9ucyhwYXJhbXMpKSBhcyBhbnk7XG4gICAgaWYgKHVuc2lnbmVkQnVpbGRzICYmIHVuc2lnbmVkQnVpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgICAgLy8gZm9sZCBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgd2UgdXNlZCB0byBidWlsZCB0aGlzIHRyYW5zYWN0aW9uIGludG8gdGhlIHVuc2lnbmVkQnVpbGRcbiAgICAgICAgY29uc3QgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMpO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMucHJlYnVpbGRUeCA9IHVuc2lnbmVkQnVpbGQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kQWNjb3VudENvbnNvbGlkYXRpb24odW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZGlyKGUpO1xuICAgICAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkVG9rZW5FbmFibGVtZW50cyhcbiAgICBwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudHNgKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRva2VucyBhcmUgYmVpbmcgc3BlY2lmaWVkJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNwZWNpZnkgcmVjaXBpZW50cyBmb3IgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBTcGxpdCBxdWVyeSBpZiB3ZSBjYW4ndCBlbmFibGUgbXVsdGlwbGUgdG9rZW5zIGluIG9uZSB0eFxuICAgIGlmICghdGVDb25maWcuc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHMgJiYgcGFyYW1zLmVuYWJsZVRva2Vucy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBxdWVyaWVzID0gcGFyYW1zLmVuYWJsZVRva2Vucy5tYXAoYXN5bmMgKGVuYWJsZVRva2VuKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyh7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIGVuYWJsZVRva2VuczogW2VuYWJsZVRva2VuXSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKTtcbiAgICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgYnVpbGRQYXJhbXMudHlwZSA9ICdlbmFibGV0b2tlbic7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYnVpbGQgd2l0aCBpbnRlbnRcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJld3JpdGUgdG9rZW5zIGludG8gcmVjaXBpZW50cyBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICAgICAgYnVpbGRQYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKCh0b2tlbikgPT4ge1xuICAgICAgICAvLyBJZiB0b2tlbiBoYXMgbm9uIGFkZHJlc3MsIHRha2UgdGhlIGZpcnN0IHdhbGxldCBhZGRyZXNzIGlzIHN0b3JlZCBpbiBpdHMgY29pbi1zcGVjaWZpYyBwcm9wZXJ0eVxuICAgICAgICAvLyBJbiBhY2NvdW50LWJhc2VkIGNvaW4gaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIHdhbGxldCBjb250cmFjdHMsIHRoZSBhZGRyZXNzIGlzIGNhbGxlZCBiYXNlQWRkcmVzcyAoZS5nLiBldGgtbGlrZSwgeHR6KVxuICAgICAgICAvLyBmb3Igb3RoZXJzIGl0J3MgY2FsbGVkIHJvb3RBZGRyZXNzIChlLmcuIHhycCwgeGxtLCBhbGdvLCB0cngpXG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgICAgIHRva2VuLmFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8ucm9vdEFkZHJlc3M7XG4gICAgICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgYmFzZSBhZGRyZXNzLCBtdXN0IHNwZWNpZnkgd2l0aCB0b2tlbiBwYXJhbScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBidWlsZFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgICAgIHByZWJ1aWxkVHguYnVpbGRQYXJhbXMgPSBidWlsZFBhcmFtcztcbiAgICAgIHJldHVybiBbcHJlYnVpbGRUeF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHNpbmdsZSB1bnNpZ25lZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBob3QvY29sZCB3YWxsZXRzXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBpbml0aWF0aW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgY3VzdG9kaWFsIHdhbGxldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVG9rZW5FbmFibGVtZW50KHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBpZiAoIXRlQ29uZmlnLnJlcXVpcmVzVG9rZW5FbmFibGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCByZXF1aXJlIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zYCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHg/LmJ1aWxkUGFyYW1zPy50eXBlICE9PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaG90JzpcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQpO1xuICAgICAgICBjYXNlICdjdXN0b2RpYWwnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGNoYWlucyByZXF1aXJlIHRva2VucyB0byBiZSBlbmFibGVkIGJlZm9yZSB0aGV5IGNhbiBiZSByZWNlaXZlZC9zZW50LlxuICAgKiBUaGlzIGlzIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcyB0b2tlbnMuXG4gICAqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVyblxuICAgKiAgICBzdWNjZXNzOiBTdWNjZXNzZnVsIHJlc3BvbnNlcyBmcm9tIHNlbmRUb2tlbkVuYWJsZW1lbnRcbiAgICogICAgZmFpbHVyZTogRXJyb3JzIGZyb20gZmFpbGVkIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBhbnlbXTtcbiAgICBmYWlsdXJlOiBFcnJvcltdO1xuICB9PiB7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyhwYXJhbXMpO1xuXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcmVidWlsZFR4OiB1bnNpZ25lZEJ1aWxkLFxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZFRva2VuRW5hYmxlbWVudCh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbGlnaHRuaW5nIGZvciBidGMvdGJ0YyBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgbGlnaHRuaW5nKCk6IExpZ2h0bmluZyB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTGlnaHRuaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGlnaHRuaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5jb2luKCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTGlnaHRuaW5nKHRoaXMuYml0Z28sIHRoaXMpO1xuICB9XG5cbiAgLyogTUFSSzogVFNTIEhlbHBlcnMgKi9cblxuICAvKipcbiAgICogUHJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZm9yIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmFwaVZlcnNpb24gPT09ICdsaXRlJyAmJlxuICAgICAgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyB8fCB0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2NvbGQnIHx8IHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYScpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEN1c3RvZGlhbCBhbmQgRUNEU0EgTVBDIGFsZ29yaXRobSBtdXN0IGFsd2F5cyB1c2UgJ2Z1bGwnIGFwaSB2ZXJzaW9uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9XG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiB8fFxuICAgICAgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyB8fCB0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2NvbGQnIHx8IHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlY2RzYSdcbiAgICAgICAgPyAnZnVsbCdcbiAgICAgICAgOiAnbGl0ZScpO1xuICAgIC8vIFR3byBvcHRpb25zIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVlcyBzZWVtcyB0byBub3cgYmUgc3VwcG9ydGVkLCBmb3Igbm93IHdlIHdpbGwgc3VwcG9ydCBib3RoIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlXG4gICAgLy8gVE9ETyhCRy01OTY4NSk6IGRlcHJlY2F0ZSBvbmUgb2YgdGhlc2Ugc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHdheSB0byBwYXNzIGZlZXNcbiAgICBsZXQgZmVlT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmZlZU9wdGlvbnMpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSBwYXJhbXMuZmVlT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5laXAxNTU5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPVxuICAgICAgICBwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBnYXNQcmljZTogcGFyYW1zLmdhc1ByaWNlLCBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0IH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbWF4RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heEZlZVBlckdhcyksXG4gICAgICAgICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiBOdW1iZXIocGFyYW1zLmVpcDE1NTk/Lm1heFByaW9yaXR5RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCxcbiAgICAgICAgICAgIH07XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzTGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9IHsgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGN1c3RvZGlhblRyYW5zYWN0aW9uSWQ6IHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RyYW5zZmVydG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ZpbGxOb25jZSc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2ZpbGxOb25jZScsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICByZWNlaXZlQWRkcmVzczogcGFyYW1zLnJlY2VpdmVBZGRyZXNzLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cblxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR4UmVxdWVzdC51bnNpZ25lZFR4cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldElkOiB0aGlzLmlkKCksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgZmVlSW5mbzogdW5zaWduZWRUeC5mZWVJbmZvLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVkRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EoXG4gICAgcGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30sXG4gICAgY29pbjogSUJhc2VDb2luXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIGNvbW1pdG1lbnQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgUiBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBHIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgLy8gYWRkaW5nIHRoaXMgdG8gcmVidWlsZCB0aGUgdHJhbnNhY3Rpb24ganVzdCBiZWZvcmUgc2lnbmluZyBmb3IgRWREU0EgdHJhbnNhY3Rpb24gdXNpbmcgZXh0ZXJuYWwgc2lnbmVyXG4gICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVkZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgIHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25lZFR4UmVxdWVzdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIEVDRFNBIHdhbGxldCB1c2luZyBleHRlcm5hbCBzaWduZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRUNEU0EoXG4gICAgY29pbjogSUJhc2VDb2luLFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgbGV0IHR4UmVxdWVzdElkID0gJyc7XG4gICAgaWYgKHBhcmFtcy50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMudHhQcmVidWlsZCAmJiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIFRTUyB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tUGFpbGxpZXJNb2R1bHVzR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgcGFpbGxpZXIgbW9kdWx1cyByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBLIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE11RGVsdGEgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgUyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVjZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAge1xuICAgICAgICAgIHR4UmVxdWVzdDogdHhSZXF1ZXN0SWQsXG4gICAgICAgICAgcHJ2OiAnJyxcbiAgICAgICAgICByZXFJZDogbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICAgIHBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IHRoZSBnZXRIYXNoRnVuY3Rpb24oKSBpcyBkZWZpbmVkIGZvciB0aGUgY29pbiB1c2UgaXQgb3RoZXJ3aXNlXG4gICAgLy8gcGFzcyB1bmRlZmluZWQgaGFzaCwgZGVmYXVsdCBoYXNoIHdpbGwgYmUgdXNlZCBpbiB0aGF0IGNhc2UuXG4gICAgbGV0IGhhc2g6IEhhc2ggfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhhc2ggPSB0aGlzLmJhc2VDb2luLmdldEhhc2hGdW5jdGlvbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaGFzaCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3Qoe1xuICAgICAgICB0eFJlcXVlc3Q6IHBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkLFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgICAgIGhhc2gsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRUeFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIG1lc3NhZ2UgZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25NZXNzYWdlVHNzKHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZE1lc3NhZ2U+IHtcbiAgICBpZiAoIXBhcmFtcy5yZXFJZCkge1xuICAgICAgcGFyYW1zLnJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gbWVzc2FnZSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy5tZXNzYWdlLCAnbWVzc2FnZSByZXF1aXJlZCBmb3IgbWVzc2FnZSBzaWduaW5nJyk7XG4gICAgICBpZiAoIXBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbjogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlUmF3OiBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3LFxuICAgICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBCdWZmZXIuZnJvbShwYXJhbXMubWVzc2FnZT8ubWVzc2FnZUVuY29kZWQgPz8gJycpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvck1lc3NhZ2VTaWduaW5nKGludGVudE9wdGlvbik7XG4gICAgICAgIHBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkID0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMuaWQoKSwgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRNZXNzYWdlUmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnNpZ25UeFJlcXVlc3RGb3JNZXNzYWdlKHtcbiAgICAgICAgdHhSZXF1ZXN0LFxuICAgICAgICBwcnY6IHBhcmFtcy5wcnYsXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2UubWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICBidWZmZXJUb1NpZ246IEJ1ZmZlci5mcm9tKHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VFbmNvZGVkID8/ICcnKSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0uY29tYmluZVNpZ1NoYXJlLFxuICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXMnKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvaW46IHRoaXMuY29pbigpLFxuICAgICAgICB0eEhhc2g6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VSYXcsXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRNZXNzYWdlUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiBtZXNzYWdlICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0eXBlZCBkYXRhIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UeXBlZERhdGFUc3MocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHlwZWQgZGF0YSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlZERhdGEsICd0eXBlZERhdGEgcmVxdWlyZWQgZm9yIHR5cGVkIGRhdGEgc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbnM6IEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25UeXBlZFN0cnVjdHVyZWREYXRhJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICB0eXBlZERhdGFSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICAgIHR5cGVkRGF0YUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5jcmVhdGVUeFJlcXVlc3RXaXRoSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyhpbnRlbnRPcHRpb25zKTtcbiAgICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduZWRUeXBlZERhdGFSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdEZvck1lc3NhZ2Uoe1xuICAgICAgICB0eFJlcXVlc3QsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgICBtZXNzYWdlUmF3OiBKU09OLnN0cmluZ2lmeShwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YVJhdyksXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgYnVmZmVyVG9TaWduOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QnKTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS5jb21iaW5lU2lnU2hhcmUsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBjb21iaW5lU2lnU2hhcmUgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcydcbiAgICAgICk7XG4gICAgICBhc3NlcnQoc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsICdVbmFibGUgdG8gZmluZCB0eEhhc2ggaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC5tZXNzYWdlc1swXS50eEhhc2gsXG4gICAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkVHlwZWREYXRhUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0eXBlZCBkYXRhICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRNYW55VHNzKHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgYXBpVmVyc2lvbiB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zID0gdGhpcy50c3NVdGlscz8uc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMoKSA/PyBbXTtcbiAgICBjb25zdCBvbmx5U3VwcG9ydHNUeFJlcXVlc3RGdWxsID1cbiAgICAgIHN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zLmxlbmd0aCA9PT0gMSAmJiBzdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucy5pbmNsdWRlcygnZnVsbCcpO1xuICAgIGlmIChhcGlWZXJzaW9uID09PSAnbGl0ZScgJiYgb25seVN1cHBvcnRzVHhSZXF1ZXN0RnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeFJlcXVlc3QgTGl0ZSBBUEkgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdDtcbiAgICBpZiAoIXNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIG1pc3NpbmcgZnJvbSBzaWduZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBCRy01MTEyMiBSZW1vdmUgY29uZGl0aW9uYWwgd2hlbiBtb3ZlZCB0byB0eFJlcXVlc3RGdWxsIGZvciBldmVyeXRoaW5nXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJykge1xuICAgICAgYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdChcbiAgICAgICAgICB0aGlzLmJpdGdvLnVybChcbiAgICAgICAgICAgICcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4cmVxdWVzdHMvJyArIHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkICsgJy90cmFuc2ZlcnMnLFxuICAgICAgICAgICAgMlxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc2VuZCgpO1xuICAgIH1cblxuICAgIC8vIEVDRFNBIFRTUyB1c2VzIFR4UmVxdWVzdEZ1bGxcbiAgICBpZiAoYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnIHx8IG9ubHlTdXBwb3J0c1R4UmVxdWVzdEZ1bGwpIHtcbiAgICAgIHJldHVybiBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHNzVXRpbHM/LnNlbmRUeFJlcXVlc3Qoc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgZnVuZHMgZnJvbSBhIGZlZSBhZGRyZXNzIHRvIGEgZm9yd2FyZGVyLiBPbmx5IHN1cHBvcnRzIGV0aC1saWtlIGNvaW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5mb3J3YXJkZXJBZGRyZXNzIC0gQWRkcmVzcyBvZiB0aGUgZm9yd2FyZGVyIHRvIHNlbmQgZnVuZHMgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYW1vdW50IC0gQW1vdW50IHRvIHNlbmQgdGhlIGZvcndhcmRlciAob3B0aW9uYWwpLiBJZiBub3QgZ2l2ZW4sIGRlZmF1bHRzIHRvIHNlbmRpbmcgYW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBuZWVkZWQgZm9yIGEgZnVuZCByZWNvdmVyeVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmdW5kRm9yd2FyZGVyKHBhcmFtczogRnVuZEZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kRm9yd2FyZGVyJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBmb3J3YXJkZXIncyBiYWxhbmNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBvcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIExpc3Qgb2YgZm9yd2FyZGVyIGFkZHJlc3MgYW5kIGJhbGFuY2VcbiAgICogaWYgcGFyYW1zIGlzIG5vdCBzZXQgdGhlbiByZXR1cm5zIGxvdyBiYWxhbmNlIGZvcndhcmRlcnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRGb3J3YXJkZXJCYWxhbmNlKHBhcmFtcz86IEZvcndhcmRlckJhbGFuY2VPcHRpb25zKTogUHJvbWlzZTxGb3J3YXJkZXJCYWxhbmNlW10+IHtcbiAgICBjb25zdCBxdWVyeTogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMgPSB7fTtcbiAgICBpZiAocGFyYW1zPy5tYXhpbXVtQmFsYW5jZSkge1xuICAgICAgcXVlcnkubWF4aW11bUJhbGFuY2UgPSBwYXJhbXM/Lm1heGltdW1CYWxhbmNlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/Lm1pbmltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5taW5pbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWluaW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9mb3J3YXJkZXJzL2JhbGFuY2VzYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgRm9yd2FyZGVyQmFsYW5jZVtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVjZHNhIHRzcyBjaGFsbGVuZ2VzIGZvciBhIHdhbGxldC5cbiAgICogVGhlc2UgYXJlIHN0YXRpYyBjaGFsbGVuZ2VzIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIGJ5IGFuIGVudGVycHJpc2UgYWRtaW4uXG4gICAqIENhbGxlcnMgc2hvdWxkIHZlcmlmeSB0aGF0IGFuIGVudGVycHJpc2UgYWRtaW4gc2lnbmVkIHRoZSBjaGFsbGVuZ2UgdmFsdWVzIGJlZm9yZSB1c2luZyB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxXYWxsZXRFY2RzYUNoYWxsZW5nZXM+fVxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhbGxlbmdlc0ZvckVjZHNhU2lnbmluZygpOiBQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz4ge1xuICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IGEgY29pbiBzcGVjaWZpYyByb3V0ZSwgd2UgY2Fubm90IHVzZSB0aGlzLnVybCguLilcbiAgICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMuaWQoKX0vY2hhbGxlbmdlc2AsIDIpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHt9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZFRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSkge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9zZW5kJyksXG4gICAgICBUeFNlbmRCb2R5LFxuICAgICAgd2hpdGVsaXN0ZWRQYXJhbXNcbiAgICApLnJlc3VsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtczogVHhTZW5kQm9keSkge1xuICAgIC8vIGV4dHJhY3QgdGhlIHdoaXRlbGlzdGVkIHBhcmFtcyBmcm9tIHRoZSB0b3AgbGV2ZWwsIGluIGNhc2VcbiAgICAvLyBvdGhlciBpbnZhbGlkIHBhcmFtcyBhcmUgcHJlc2VudCB0aGF0IHdvdWxkIGZhaWwgZW5jb2RpbmdcbiAgICAvLyBhbmQgZmFsbCBiYWNrIHRvIHRoZSBib2R5IHBhcmFtc1xuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgd2hpdGVsaXN0ZWRTZW5kUGFyYW1zKTtcbiAgICByZXR1cm4gcG9zdFdpdGhDb2RlYyhcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9pbml0aWF0ZScpLFxuICAgICAgVHhTZW5kQm9keSxcbiAgICAgIHdoaXRlbGlzdGVkUGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgfVxufVxuIl19
4058
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCxzREFBMEU7QUFDMUUsaURBQWlEO0FBQ2pELG9EQUE0QjtBQUM1QixnRUFBcUM7QUFDckMseUNBQTJCO0FBQzNCLDBDQUE0QjtBQUU1QixxREFBdUM7QUFDdkMsa0RBQTREO0FBVTVELHdDQUEyQztBQUUzQyxrQ0FBMEM7QUFDMUMsc0NBTW1CO0FBRW5CLDBDQUEwQztBQUMxQywrREFBaUQ7QUFDakQsMENBTXFCO0FBQ3JCLDBFQUF1RTtBQUN2RSx3REFBeUY7QUFDekYsd0NBQTREO0FBQzVELHdDQUE0QztBQUM1QyxnQ0FBc0M7QUFDdEMsb0NBU2tCO0FBQ2xCLDBEQUF1RDtBQUN2RCw4Q0FBaUU7QUFDakUsNERBQWlFO0FBQ2pFLGtEQUF5RjtBQUN6RiwrQ0FBNEQ7QUFtRjVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQU0scUJBQXFCLEdBQUcseUJBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUV6RixJQUFZLHFCQUdYO0FBSEQsV0FBWSxxQkFBcUI7SUFDL0IsNkVBQVUsQ0FBQTtJQUNWLHVGQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLHFCQUFxQixxQ0FBckIscUJBQXFCLFFBR2hDO0FBRUQsU0FBUywyQkFBMkIsQ0FDbEMsVUFBMEQ7SUFFMUQsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNs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QUFLO1lBQ0wsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQztRQUVILE1BQU0sYUFBYSxHQUFHO1lBQ3BCLFVBQVUsRUFBRSxrQkFBa0I7WUFDOUIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsZ0JBQWdCO1lBQ2hCLEtBQUs7U0FDTixDQUFDO1FBRUYsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUUxRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRjtBQTVpSkQsd0JBNGlKQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IFR4U2VuZEJvZHksIHR5cGUgQWRkcmVzc1F1ZXJ5UmVzdWx0IH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBDb2luRmFtaWx5IH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IElSZXF1ZXN0VHJhY2VyIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHsgQWRkcmVzc0Jvb2ssIElBZGRyZXNzQm9vayB9IGZyb20gJy4uL2FkZHJlc3MtYm9vayc7XG5pbXBvcnQge1xuICBJQmFzZUNvaW4sXG4gIE5GVFRyYW5zZmVyT3B0aW9ucyxcbiAgU2lnbmVkTWVzc2FnZSxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25lZFRyYW5zYWN0aW9uUmVxdWVzdCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG59IGZyb20gJy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IG1ha2VSYW5kb21LZXkgfSBmcm9tICcuLi9iaXRjb2luJztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJy4uL2JpdGdvQmFzZSc7XG5pbXBvcnQgeyBnZXRTaGFyZWRTZWNyZXQgfSBmcm9tICcuLi9lY2RoJztcbmltcG9ydCB7XG4gIEFkZHJlc3NHZW5lcmF0aW9uRXJyb3IsXG4gIEluY29ycmVjdFBhc3N3b3JkRXJyb3IsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yLFxuICBOZWVkVXNlclNpZ251cEVycm9yLFxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgU3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZSB9IGZyb20gJy4uL2luc2NyaXB0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBkcmF3S2V5Y2FyZCB9IGZyb20gJy4uL2ludGVybmFsJztcbmltcG9ydCAqIGFzIGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2ludGVybmFsJztcbmltcG9ydCB7XG4gIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXksXG4gIGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlBc3luYyxcbiAgS2V5Y2hhaW4sXG4gIEtleWNoYWluV2l0aEVuY3J5cHRlZFBydixcbiAgS2V5SW5kaWNlcyxcbn0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgZ2V0TGlnaHRuaW5nQXV0aEtleSB9IGZyb20gJy4uL2xpZ2h0bmluZy9saWdodG5pbmdXYWxsZXRVdGlsJztcbmltcG9ydCB7IElQZW5kaW5nQXBwcm92YWwsIFBlbmRpbmdBcHByb3ZhbCwgUGVuZGluZ0FwcHJvdmFscyB9IGZyb20gJy4uL3BlbmRpbmdBcHByb3ZhbCc7XG5pbXBvcnQgeyBHb1N0YWtpbmdXYWxsZXQsIFN0YWtpbmdXYWxsZXQgfSBmcm9tICcuLi9zdGFraW5nJztcbmltcG9ydCB7IFRyYWRpbmdBY2NvdW50IH0gZnJvbSAnLi4vdHJhZGluZyc7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi90c3MnO1xuaW1wb3J0IHtcbiAgRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uLFxuICBJbnRlbnRPcHRpb25zRm9yTWVzc2FnZSxcbiAgSW50ZW50T3B0aW9uc0ZvclR5cGVkRGF0YSxcbiAgUmVxdWVzdFRyYWNlcixcbiAgUmVxdWVzdFR5cGUsXG4gIFRva2VuVHJhbnNmZXJSZWNpcGllbnRQYXJhbXMsXG4gIFRva2VuVHlwZSxcbiAgVHhSZXF1ZXN0LFxufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBFY2RzYU1QQ3YyVXRpbHMsIEVjZHNhVXRpbHMgfSBmcm9tICcuLi91dGlscy90c3MvZWNkc2EnO1xuaW1wb3J0IEVkZHNhVXRpbHMsIHsgRWRkc2FNUEN2MlV0aWxzIH0gZnJvbSAnLi4vdXRpbHMvdHNzL2VkZHNhJztcbmltcG9ydCB7IGdldFR4UmVxdWVzdEFwaVZlcnNpb24sIHZhbGlkYXRlVHhSZXF1ZXN0QXBpVmVyc2lvbiB9IGZyb20gJy4uL3V0aWxzL3R4UmVxdWVzdCc7XG5pbXBvcnQgeyBidWlsZFBhcmFtS2V5cywgQnVpbGRQYXJhbXMgfSBmcm9tICcuL0J1aWxkUGFyYW1zJztcbmltcG9ydCB7XG4gIEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEFkZHJlc3Nlc0J5QmFsYW5jZU9wdGlvbnMsXG4gIEFkZHJlc3Nlc09wdGlvbnMsXG4gIEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQnVpbGRSZXNvdXJjZURlbGVnYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJ1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25SZXN1bHQsXG4gIEJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFJlc291cmNlTWFuYWdlbWVudFNlbmRSZXN1bHQsXG4gIEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyxcbiAgQnVsa0NyZWF0ZVNoYXJlT3B0aW9uLFxuICBCdWxrV2FsbGV0U2hhcmVLZXljaGFpbixcbiAgQnVsa1dhbGxldFNoYXJlT3B0aW9ucyxcbiAgQ2hhbmdlRmVlT3B0aW9ucyxcbiAgQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMsXG4gIENyZWF0ZUFkZHJlc3NPcHRpb25zLFxuICBDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2UsXG4gIENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBDcmVhdGVTaGFyZU9wdGlvbnMsXG4gIENyb3NzQ2hhaW5VVFhPLFxuICBEZWNyeXB0ZWRLZXljaGFpbkRhdGEsXG4gIERlcGxveUZvcndhcmRlcnNPcHRpb25zLFxuICBEb3dubG9hZEtleWNhcmRPcHRpb25zLFxuICBGYW5vdXRVbnNwZW50c09wdGlvbnMsXG4gIEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyxcbiAgRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMsXG4gIEZvcndhcmRlckJhbGFuY2UsXG4gIEZvcndhcmRlckJhbGFuY2VPcHRpb25zLFxuICBGcmVlemVPcHRpb25zLFxuICBGdW5kRm9yd2FyZGVyUGFyYW1zLFxuICBGdW5kRm9yd2FyZGVyc09wdGlvbnMsXG4gIEdldEFkZHJlc3NPcHRpb25zLFxuICBHZXRQcnZPcHRpb25zLFxuICBHZXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEdldFRyYW5zZmVyT3B0aW9ucyxcbiAgR2V0VXNlclBydk9wdGlvbnMsXG4gIHR5cGUgSVdhbGxldCxcbiAgTWFuYWdlVW5zcGVudFJlc2VydmF0aW9uT3B0aW9ucyxcbiAgTWF4aW11bVNwZW5kYWJsZSxcbiAgTWF4aW11bVNwZW5kYWJsZU9wdGlvbnMsXG4gIE1vZGlmeVdlYmhvb2tPcHRpb25zLFxuICBOZnRCYWxhbmNlLFxuICBQYWdpbmF0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCxcbiAgUmVjb3ZlclRva2VuT3B0aW9ucyxcbiAgUmVtb3ZlUG9saWN5UnVsZU9wdGlvbnMsXG4gIFJlbW92ZVVzZXJPcHRpb25zLFxuICBTZW5kTWFueU9wdGlvbnMsXG4gIFNlbmRORlRPcHRpb25zLFxuICBTZW5kTkZUUmVzdWx0LFxuICBTZW5kT3B0aW9ucyxcbiAgU2hhcmVkS2V5Q2hhaW4sXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2lnbkFuZFNlbmRUeFJlcXVlc3RPcHRpb25zLFxuICBTaW11bGF0ZVdlYmhvb2tPcHRpb25zLFxuICBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1YldhbGxldFR5cGUsXG4gIFN3ZWVwT3B0aW9ucyxcbiAgVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zLFxuICBUcmFuc2ZlckNvbW1lbnRPcHRpb25zLFxuICBUcmFuc2ZlcnNPcHRpb25zLFxuICBVbnNwZW50c09wdGlvbnMsXG4gIFVwZGF0ZUFkZHJlc3NPcHRpb25zLFxuICBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zLFxuICBVcGRhdGVXYWxsZXRPcHRpb25zLFxuICBXYWxsZXRDb2luU3BlY2lmaWMsXG4gIFdhbGxldERhdGEsXG4gIFdhbGxldEVjZHNhQ2hhbGxlbmdlcyxcbiAgV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyxcbiAgV2FsbGV0VHlwZSxcbiAgQnVpbGRUb2tlbkFwcHJvdmFsUmVzcG9uc2UsXG4gIFdhbGxldEluaXRSZXN1bHQsXG4gIEdldEFjY291bnRSZXNvdXJjZXNPcHRpb25zLFxuICBHZXRBY2NvdW50UmVzb3VyY2VzUmVzcG9uc2UsXG4gIEdldFJlc291cmNlRGVsZWdhdGlvbnNPcHRpb25zLFxuICBHZXRSZXNvdXJjZURlbGVnYXRpb25zUmVzcG9uc2UsXG59IGZyb20gJy4vaVdhbGxldCc7XG5cbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnZGVidWcnKSgnYml0Z286djI6d2FsbGV0Jyk7XG5cbnR5cGUgTWFuYWdlVW5zcGVudHMgPSAnY29uc29saWRhdGUnIHwgJ2Zhbm91dCc7XG5cbmNvbnN0IHdoaXRlbGlzdGVkU2VuZFBhcmFtcyA9IFR4U2VuZEJvZHkudHlwZS50eXBlcy5mbGF0TWFwKCh0KSA9PiBPYmplY3Qua2V5cyh0LnByb3BzKSk7XG5cbmV4cG9ydCBlbnVtIE1hbmFnZVVuc3BlbnRzT3B0aW9ucyB7XG4gIEJVSUxEX09OTFksXG4gIEJVSUxEX1NJR05fU0VORCxcbn1cblxuZnVuY3Rpb24gaXNQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KFxuICBwcmVidWlsZFR4OiBzdHJpbmcgfCBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0IHwgdW5kZWZpbmVkXG4pOiBwcmVidWlsZFR4IGlzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQge1xuICBpZiAoIXByZWJ1aWxkVHggfHwgdHlwZW9mIHByZWJ1aWxkVHggPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAocHJlYnVpbGRUeCBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0KS53YWxsZXRJZCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgV2FsbGV0IGltcGxlbWVudHMgSVdhbGxldCB7XG4gIHB1YmxpYyByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvaW46IElCYXNlQ29pbjtcbiAgcHVibGljIF93YWxsZXQ6IFdhbGxldERhdGE7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHNzVXRpbHM6IEVjZHNhVXRpbHMgfCBFY2RzYU1QQ3YyVXRpbHMgfCBFZGRzYVV0aWxzIHwgRWRkc2FNUEN2MlV0aWxzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IF9wZXJtaXNzaW9ucz86IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGJhc2VDb2luOiBJQmFzZUNvaW4sIHdhbGxldERhdGE6IGFueSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLmJhc2VDb2luID0gYmFzZUNvaW47XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0RGF0YTtcbiAgICBjb25zdCB1c2VySWQgPSBfLmdldChiaXRnbywgJ191c2VyLmlkJyk7XG4gICAgaWYgKF8uaXNTdHJpbmcodXNlcklkKSkge1xuICAgICAgY29uc3QgdXNlckRldGFpbHMgPSBfLmZpbmQod2FsbGV0RGF0YS51c2VycywgeyB1c2VyOiB1c2VySWQgfSk7XG4gICAgICB0aGlzLl9wZXJtaXNzaW9ucyA9IF8uZ2V0KHVzZXJEZXRhaWxzLCAncGVybWlzc2lvbnMnKTtcbiAgICB9XG4gICAgaWYgKGJhc2VDb2luPy5zdXBwb3J0c1RzcygpICYmIHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBzd2l0Y2ggKGJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpKSB7XG4gICAgICAgIGNhc2UgJ2VjZHNhJzpcbiAgICAgICAgICBpZiAod2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVjZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VkZHNhJzpcbiAgICAgICAgICBpZiAod2FsbGV0RGF0YS5tdWx0aXNpZ1R5cGVWZXJzaW9uID09PSAnTVBDdjInKSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVkZHNhTVBDdjJVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRzc1V0aWxzID0gbmV3IEVkZHNhVXRpbHMoYml0Z28sIGJhc2VDb2luLCB0aGlzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBVUkwgdXNpbmcgdGhpcyB3YWxsZXQncyBpZCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgQml0R28gQVBJIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGV4dHJhIEFQSSBzcGVjaWZpYyBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSB3YWxsZXQgaWRcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArIGV4dHJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhpcyB3YWxsZXQncyBpZFxuICAgKi9cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBmb3Igc3BlbmRpbmcgZnVuZHMgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYXBwcm92YWxzUmVxdWlyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBjb2RlYyBpbnN0ZWFkOiB0LmV4YWN0KEJ1aWxkUGFyYW1zKS5lbmNvZGUodikgKi9cbiAgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGJ1aWxkUGFyYW1LZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBzdHJpY3Qgc3ViLXNldCBvZiBwcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zXG4gICAqL1xuICBwcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdjb25zb2xpZGF0ZUFkZHJlc3NlcycsXG4gICAgICAnbmZ0Q29sbGVjdGlvbklkJyxcbiAgICAgICduZnRJZCcsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWVtbycsXG4gICAgICAndmFsaWRGcm9tQmxvY2snLFxuICAgICAgJ3ZhbGlkVG9CbG9jaycsXG4gICAgICAncHJldmlldycsXG4gICAgICAna2VlcEFsaXZlJyxcbiAgICAgICdhcGlWZXJzaW9uJyxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBiYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29pbiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBjb2luIHRoaXMgd2FsbGV0IGhvbGRzXG4gICAqL1xuICBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luO1xuICB9XG5cbiAgdHlwZSgpOiBXYWxsZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LnR5cGUgfHwgJ2hvdCc7XG4gIH1cblxuICBtdWx0aXNpZ1R5cGUoKTogJ29uY2hhaW4nIHwgJ3Rzcycge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlO1xuICB9XG5cbiAgbXVsdGlzaWdUeXBlVmVyc2lvbigpOiAnTVBDdjInIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb247XG4gIH1cblxuICBzdWJUeXBlKCk6IFN1YldhbGxldFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3ViVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhYmVsIChuYW1lKSBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQubGFiZWw7XG4gIH1cblxuICBwdWJsaWMgZmxhZ3MoKTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LndhbGxldEZsYWdzID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGZsYWcobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbGFncygpLmZpbmQoKGZsYWcpID0+IGZsYWcubmFtZSA9PT0gbmFtZSk/LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHVibGljIG9iamVjdCBpZHMgZm9yIHRoZSBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuXG4gICAqL1xuICBwdWJsaWMga2V5SWRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmtleXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcmVjZWl2ZSBhZGRyZXNzIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIHJlY2VpdmVBZGRyZXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5yZWNlaXZlQWRkcmVzcz8uYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiBuZnQgdG9rZW5zIGZvciB0aGlzIHdhbGxldC4gV2lsbCBhbHdheXMgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgd2FsbGV0XG4gICAqIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWxsVG9rZW5zIGZsYWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICBuZnRCYWxhbmNlcygpOiBOZnRCYWxhbmNlW10gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl93YWxsZXQubmZ0cykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fd2FsbGV0Lm5mdHMpLm1hcCgobmZ0RGF0YSkgPT4gbmZ0RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgbGlzdCBvZiB1bnN1cHBvcnRlZCBuZnQgdG9rZW5zIGZvciB0aGlzIHdhbGxldC4gV2lsbCBhbHdheXMgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgd2FsbGV0XG4gICAqIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWxsVG9rZW5zIGZsYWcuXG4gICAqXG4gICAqIEByZXR1cm5zIHtOZnRCYWxhbmNlW10gfCB1bmRlZmluZWR9XG4gICAqL1xuICB1bnN1cHBvcnRlZE5mdEJhbGFuY2VzKCk6IE5mdEJhbGFuY2VbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC51bnN1cHBvcnRlZE5mdHMpIHtcbiAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuX3dhbGxldC51bnN1cHBvcnRlZE5mdHMpLm1hcCgobmZ0RGF0YSkgPT4gbmZ0RGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIHdhbGxldHMgbmZ0ICYgdW5zdXBwb3J0ZWQgbmZ0cy5cbiAgICpcbiAgICogQHJldHVybnMge05mdEJhbGFuY2VbXX1cbiAgICovXG4gIGFzeW5jIGdldE5mdEJhbGFuY2VzKCk6IFByb21pc2U8TmZ0QmFsYW5jZVtdPiB7XG4gICAgY29uc3Qgd2FsbGV0RGF0YTogUGFydGlhbDxXYWxsZXREYXRhPiA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHsgYWxsVG9rZW5zOiB0cnVlIH0pLnJlc3VsdCgpO1xuXG4gICAgY29uc3Qgc3VwcG9ydGVkTmZ0cyA9IHdhbGxldERhdGE/Lm5mdHMgPyBPYmplY3QudmFsdWVzKHdhbGxldERhdGEubmZ0cykubWFwKChiYWxhbmNlKSA9PiBiYWxhbmNlKSA6IFtdO1xuXG4gICAgY29uc3QgdW5zdXBwb3J0ZWROZnRzID0gd2FsbGV0RGF0YT8udW5zdXBwb3J0ZWROZnRzXG4gICAgICA/IE9iamVjdC52YWx1ZXMod2FsbGV0RGF0YS51bnN1cHBvcnRlZE5mdHMpLm1hcCgoYmFsYW5jZSkgPT4gYmFsYW5jZSlcbiAgICAgIDogW107XG4gICAgcmV0dXJuIFsuLi5zdXBwb3J0ZWROZnRzLCAuLi51bnN1cHBvcnRlZE5mdHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgLSB0eEhhc2ggdGhlIHRyYW5zYWN0aW9uIGhhc2ggdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uKHBhcmFtczogR2V0VHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHhIYXNoJ10sIFtdKTtcblxuICAgIGNvbnN0IHBhZ2luYXRlZE9wdGlvbnM6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcGFnaW5hdGVkT3B0aW9ucy5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubGltaXQpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkgfHwgcGFyYW1zLmxpbWl0IDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICB9XG4gICAgICBwYWdpbmF0ZWRPcHRpb25zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFnaW5hdGVkT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmluY2x1ZGVSYmYpIHtcbiAgICAgIHF1ZXJ5WydpbmNsdWRlUmJmJ10gPSBwYXJhbXMuaW5jbHVkZVJiZjtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLnVybCgnL3R4LycgKyBwYXJhbXMudHhIYXNoKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2ZlcnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlcnMocGFyYW1zOiBUcmFuc2ZlcnNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBUcmFuc2ZlcnNPcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hbGxUb2tlbnMpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbFRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFsbFRva2VucyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFsbFRva2VucyA9IHBhcmFtcy5hbGxUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2hMYWJlbCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5zZWFyY2hMYWJlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlYXJjaExhYmVsIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWFyY2hMYWJlbCA9IHBhcmFtcy5zZWFyY2hMYWJlbDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIGlmICghXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuYWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFkZHJlc3MgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cbiAgICAgIGlmIChfLmlzQXJyYXkocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHBhcmFtcy5hZGRyZXNzLmZvckVhY2goKGFkZHJlc3MpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgYWRkcmVzcyBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVHdGUpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUd0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGRhdGVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVHdGUgPSBwYXJhbXMuZGF0ZUd0ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmRhdGVMdCkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5kYXRlTHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmRhdGVMdCA9IHBhcmFtcy5kYXRlTHQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUd0ZSkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YWx1ZUd0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVHdGUgPSBwYXJhbXMudmFsdWVHdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy52YWx1ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVMdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkudmFsdWVMdCA9IHBhcmFtcy52YWx1ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZUhleCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlSGV4IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZUhleCA9IHBhcmFtcy5pbmNsdWRlSGV4O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuc3RhdGUpKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZyBvciBhcnJheScpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbXMuc3RhdGUpKSB7XG4gICAgICAgIHBhcmFtcy5zdGF0ZS5mb3JFYWNoKChzdGF0ZSkgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdGF0ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzdGF0ZSBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIHN0YXRlIHN0cmluZ3MnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcXVlcnkuc3RhdGUgPSBwYXJhbXMuc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy50eXBlKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy50eXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHlwZSBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuZGVjb3JhdGVVdHhvU3BlY2lmaWNGaWVsZHMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVIZXggYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcyA9IHBhcmFtcy5kZWNvcmF0ZVV0eG9TcGVjaWZpY0ZpZWxkcztcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3Vuc3BlbnRJZHMnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmJ1bGsgLSBpZiBzZXQgdG8gVHJ1ZSwgdGhpcyBlbmFibGVzIHRoZSBjb25zb2xpZGF0aW9uIG9mIGxhcmdlIG51bWJlciBvZiB1bnNwZW50cyBieSBjcmVhdGluZyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGVhY2ggdHJhbnNhY3Rpb24gY29tcG9zZWQgb2YgMjAwIHVuc3BlbnRzLCBleGNlcHQgZm9yIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHdoaWNoIG1heSBoYXZlIGZld2VyIHVuc3BlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYW5hZ2VVbnNwZW50cyhcbiAgICByb3V0ZU5hbWU6IE1hbmFnZVVuc3BlbnRzLFxuICAgIHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgfCBGYW5vdXRVbnNwZW50c09wdGlvbnMgPSB7fSxcbiAgICBvcHRpb24gPSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfU0lHTl9TRU5EXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcgJiYgcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB0eXBlOiAnY29uc29saWRhdGUnIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnICYmIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24oeyAuLi5wYXJhbXMsIHR5cGU6ICdmYW5vdXQnIH0pO1xuICAgIH1cblxuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmYW5vdXRJbnB1dEZvcm1hdCA9IHBhcmFtcy5tYXhOdW1JbnB1dHNUb1VzZSA/ICdtYXhOdW1JbnB1dHNUb1VzZScgOiAndW5zcGVudHMnO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heEZlZVBlcmNlbnRhZ2UnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG5cbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAndGFyZ2V0QWRkcmVzcycsXG4gICAgICAndHhGb3JtYXQnLFxuICAgICAgJ2J1bGsnLFxuXG4gICAgICByb3V0ZU5hbWUgPT09ICdjb25zb2xpZGF0ZScgPyAnbGltaXQnIDogZmFub3V0SW5wdXRGb3JtYXQsXG4gICAgICAnbnVtVW5zcGVudHNUb01ha2UnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG5cbiAgICBjb25zdCBidWlsZFJlc3BvbnNlOiBUcmFuc2FjdGlvblByZWJ1aWxkIHwgVHJhbnNhY3Rpb25QcmVidWlsZFtdID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3JvdXRlTmFtZX1VbnNwZW50c2ApKVxuICAgICAgLnNlbmQoZmlsdGVyZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBpZiAob3B0aW9uID09PSBNYW5hZ2VVbnNwZW50c09wdGlvbnMuQlVJTERfT05MWSkge1xuICAgICAgcmV0dXJuIGJ1aWxkUmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gKGF3YWl0IHRoaXMuYmFzZUNvaW5cbiAgICAgIC5rZXljaGFpbnMoKVxuICAgICAgLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KSkgYXMgdW5rbm93biBhcyBLZXljaGFpbltdO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcGxhdGZvcm0tYnVpbHQgdHJhbnNhY3Rpb24gbWF0Y2hlcyB1c2VyIHBhcmFtZXRlcnNcbiAgICBjb25zdCB0eFByZWJ1aWxkcyA9IEFycmF5LmlzQXJyYXkoYnVpbGRSZXNwb25zZSkgPyBidWlsZFJlc3BvbnNlIDogW2J1aWxkUmVzcG9uc2VdO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHhQcmVidWlsZHMubWFwKCh0eFByZWJ1aWxkKSA9PlxuICAgICAgICB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFBhcmFtczogcGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgLi4uKHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30pLFxuICAgICAgICAgICAga2V5Y2hhaW5zOiB7XG4gICAgICAgICAgICAgIHVzZXI6IGtleWNoYWluc1swXSxcbiAgICAgICAgICAgICAgYmFja3VwOiBrZXljaGFpbnNbMV0sXG4gICAgICAgICAgICAgIGJpdGdvOiBrZXljaGFpbnNbMl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxSWQsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHB1YnM6IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSksXG4gICAgICAvLyBCdWlsZGluZyBQU0JUcyB3aXRoIHRoZSBidWxrIGZsYWcgZG9lcyBub3QgaW5jbHVkZSB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24gZm9yIG5vbi1zZWd3aXQgaW5wdXRzLlxuICAgICAgLy8gTWFudWFsbHkgb3ZlcnJpZGUgdGhlIHNpZ25pbmcgYW5kIHZhbGlkYXRpbmcgdG8gbm90IGZhaWwuXG4gICAgICBhbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4OiAhIXBhcmFtcy5idWxrLFxuICAgIH07XG5cbiAgICBjb25zdCBzZWxlY3RQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvbW1lbnQnLCAnb3RwJywgJ2J1bGsnXSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHhQcmVidWlsZHMubWFwKGFzeW5jICh0eFByZWJ1aWxkKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgICAgIC4uLnRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIHNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMsIHtcbiAgICAgICAgICB0eXBlOiByb3V0ZU5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYnVpbGRSZXNwb25zZSkgPyByZXNwb25zZSA6IHJlc3BvbnNlWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbmFnZSB0aGUgdW5zcGVudCByZXNlcnZhdGlvbnMgb24gdGhlIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLmNyZWF0ZSAtIGNyZWF0ZSBhIG5ldyByZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLm1vZGlmeSAtIG1vZGlmeSBhbiBleGlzdGluZyByZXNlcnZhdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLmRlbGV0ZSAtIGRlbGV0ZSBhbiBleGlzdGluZyByZXNlcnZhdGlvblxuICAgKi9cbiAgYXN5bmMgbWFuYWdlVW5zcGVudFJlc2VydmF0aW9ucyhwYXJhbXM6IE1hbmFnZVVuc3BlbnRSZXNlcnZhdGlvbk9wdGlvbnMpOiBQcm9taXNlPHtcbiAgICB1bnNwZW50czoge1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIHdhbGxldElkOiBzdHJpbmc7XG4gICAgICBleHBpcmVUaW1lOiBzdHJpbmc7XG4gICAgICB1c2VySWQ/OiBzdHJpbmc7XG4gICAgfVtdO1xuICB9PiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NyZWF0ZScsICdtb2RpZnknLCAnZGVsZXRlJ10pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihuZXcgUmVxdWVzdFRyYWNlcigpKTtcbiAgICAvLyBUaGUgVVJMIGNhbm5vdCBjb250YWluIHRoZSBjb2luTmFtZSwgc28gd2UgcmVtb3ZlIGl0IGZyb20gdGhlIFVSTFxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvcmVzZXJ2ZWR1bnNwZW50c2ApLnJlcGxhY2UoYC8ke3RoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKX1gLCAnJyk7XG4gICAgaWYgKGZpbHRlcmVkUGFyYW1zLmNyZWF0ZSkge1xuICAgICAgY29uc3QgZmlsdGVyZWRDcmVhdGVQYXJhbXMgPSBfLnBpY2socGFyYW1zLmNyZWF0ZSwgWyd1bnNwZW50SWRzJywgJ2V4cGlyZVRpbWUnXSk7XG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChmaWx0ZXJlZENyZWF0ZVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJlZFBhcmFtcy5tb2RpZnkpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkTW9kaWZ5UGFyYW1zID0gXy5waWNrKHBhcmFtcy5tb2RpZnksIFsndW5zcGVudElkcycsICdjaGFuZ2VzJ10pO1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChmaWx0ZXJlZE1vZGlmeVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIGlmIChmaWx0ZXJlZFBhcmFtcy5kZWxldGUpIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGVsZXRlUGFyYW1zID0gXy5waWNrKHBhcmFtcy5kZWxldGUsIFsnaWQnXSk7XG4gICAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodXJsKS5xdWVyeShmaWx0ZXJlZERlbGV0ZVBhcmFtcykucmVzdWx0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGlkIG5vdCBkZXRlY3QgYSBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uLCBvciBkZWxldGlvbiByZXF1ZXN0LicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2UuIEl0IGlzIG5vdCBhcHBsaWNhYmxlIGZvciBpZiBidWxrIGNvbnNvbGlkYXRlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5idWxrIC0gaWYgc2V0IHRvIFRydWUsIHRoaXMgZW5hYmxlcyB0aGUgY29uc29saWRhdGlvbiBvZiBsYXJnZSBudW1iZXIgb2YgdW5zcGVudHMgYnkgY3JlYXRpbmcgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBlYWNoIHRyYW5zYWN0aW9uIGNvbXBvc2VkIG9mIDIwMCB1bnNwZW50cywgZXhjZXB0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiB3aGljaCBtYXkgaGF2ZSBmZXdlciB1bnNwZW50cy5cbiAgICovXG4gIGFzeW5jIGNvbnNvbGlkYXRlVW5zcGVudHMoXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyA9IHt9LFxuICAgIG9wdGlvbiA9IE1hbmFnZVVuc3BlbnRzT3B0aW9ucy5CVUlMRF9TSUdOX1NFTkRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2NvbnNvbGlkYXRlJywgcGFyYW1zLCBvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXIgfCBTdHJpbmd9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHByb3BvcnRpb24gb2YgYW4gdW5zcGVudCB5b3UgYXJlIHdpbGxpbmcgdG8gbG9zZSB0byBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSBUaGUgbWF4IGxpbWl0IGZvciBhIGZlZSByYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgLSB0aGUgbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1VbnNwZW50c1RvTWFrZSAtIHRoZSBudW1iZXIgb2YgbmV3IHVuc3BlbnRzIHRvIG1ha2VcbiAgICpcbiAgICogQHBhcmFtIHtNYW5hZ2VVbnNwZW50c09wdGlvbnN9IG9wdGlvbiAtIGZsYWcgdG8gdG9nZ2xlIGJ1aWxkIGFuZCBzZW5kIG9yIGJ1aWxkIG9ubHlcbiAgICovXG4gIGFzeW5jIGZhbm91dFVuc3BlbnRzKFxuICAgIHBhcmFtczogRmFub3V0VW5zcGVudHNPcHRpb25zID0ge30sXG4gICAgb3B0aW9uID0gTWFuYWdlVW5zcGVudHNPcHRpb25zLkJVSUxEX1NJR05fU0VORFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnZmFub3V0JywgcGFyYW1zLCBvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdG9rZW4gZmx1c2ggdGhyZXNob2xkcyBmb3IgdGhlIHdhbGxldC4gVXBkYXRlcyB0aGUgd2FsbGV0LlxuICAgKiBUb2tlbnMgd2lsbCBvbmx5IGJlIGZsdXNoZWQgZnJvbSBmb3J3YXJkZXIgY29udHJhY3RzIGlmIHRoZSBiYWxhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdGhyZXNob2xkIGRlZmluZWQgaGVyZS5cbiAgICogQHBhcmFtIHRocmVzaG9sZHMge09iamVjdH0gLSBwYWlycyBvZiB7IFt0b2tlbk5hbWVdOiB0aHJlc2hvbGQgfSAoYmFzZSB1bml0cylcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVRva2VuRmx1c2hUaHJlc2hvbGRzKHRocmVzaG9sZHM6IGFueSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ2V0aCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMudXJsKCkpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIHRva2VuRmx1c2hUaHJlc2hvbGRzOiB0aHJlc2hvbGRzLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuICAvKipcbiAgICAgICogVXBkYXRlcyB0aGUgd2FsbGV0LiBTZXRzIGZsYWdzIGZvciBkZXBsb3lGb3J3YXJkZXJzTWFudWFsbHkgYW5kIGZsdXNoRm9yd2FyZGVyc01hbnVhbGx5IG9mIHRoZSB3YWxsZXQuXG4gICAgICAqIEBwYXJhbSBmb3J3YXJkZXJGbGFncyB7T2JqZWN0fSAtIHtcbiAgICAgICAgXCJjb2luU3BlY2lmaWNcIjoge1xuICAgICAgICAgIFtjb2luTmFtZV06IHtcbiAgICAgICAgICAgIFwiZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufSxcbiAgICAgICAgICAgIFwiZmx1c2hGb3J3YXJkZXJzTWFudWFsbHlcIjoge0Jvb2xlYW59XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAqL1xuICBhc3luYyB1cGRhdGVGb3J3YXJkZXJzKGZvcndhcmRlckZsYWdzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQoZm9yd2FyZGVyRmxhZ3MpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGRlcGxveSBhbiBFVEggYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHJldHVybnMge09iamVjdH0gSHR0cCByZXNwb25zZVxuICAgKi9cbiAgYXN5bmMgZGVwbG95Rm9yd2FyZGVycyhwYXJhbXM6IERlcGxveUZvcndhcmRlcnNPcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoYC9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX0vZGVwbG95bWVudGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIG1hbnVhbGx5IGZvcndhcmQgdG9rZW5zIGZyb20gYW4gRVRIIG9yIENFTE8gYWRkcmVzc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50b2tlbk5hbWUgLSBOYW1lIG9mIHRva2VuIHRoYXQgbmVlZHMgdG8gYmUgZm9yd2FyZGVkIGZyb20gdGhlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5hZGRyZXNzXSAtIGFkZHJlc3NJZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5pZF0gLSBhZGRyZXNzSWQgY291bGQgYmUgcmVjZWl2ZWQgYWxzbyBhcyBpZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5nYXNQcmljZV0gLSBFeHBsaWNpdCBnYXMgcHJpY2UgdG8gdXNlIHdoZW4gZm9yd2FyZGluZyB0b2tlbiBmcm9tIHRoZSBmb3J3YXJkZXIgY29udHJhY3QgKEVUSCBhbmQgQ2VsbyBvbmx5KS4gSWYgbm90IGdpdmVuLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBlc3RpbWF0ZWQgbmV0d29yayBnYXMgcHJpY2UuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmVpcDE1NTldIC0gU3BlY2lmeSBlaXAxNTU5IGZlZSBwYXJhbWV0ZXJzIGluIHRva2VuIGZvcndhcmRpbmcgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGZsdXNoRm9yd2FyZGVyVG9rZW4ocGFyYW1zOiBGbHVzaEZvcndhcmRlclRva2VuT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L3Rva2VuZm9yd2FyZGApO1xuICAgIHRoaXMuX3dhbGxldCA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFN3ZWVwIGZ1bmRzIGZvciBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gc2VuZCBhbGwgdGhlIGZ1bmRzIGluIHRoZSB3YWxsZXQgdG9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHVzZXJzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMueHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSBpZiB0aGUgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMub3RwIC0gVHdvIGZhY3RvciBhdXRoIGNvZGUgdG8gZW5hYmxlIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gRXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aGluIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZGVzaXJlZCBmZWUgcmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLm1heEZlZVJhdGVdIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtCb29sZWFufSBbcGFyYW1zLmFsbG93UGFydGlhbFN3ZWVwXSAtIGFsbG93cyBzd2VlcGluZyAyMDAgdW5zcGVudHMgd2hlbiB0aGUgd2FsbGV0IGhhcyBtb3JlIHRoYW4gdGhhdFxuICAgKiBAcmV0dXJucyB0eEhleCB7U3RyaW5nfSB0aGUgdHhIZXggb2YgdGhlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgc3dlZXAocGFyYW1zOiBTd2VlcE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydicsICdvdHAnXSk7XG5cbiAgICAvLyBUaGUgc3dlZXAgQVBJIGVuZHBvaW50IGlzIG9ubHkgYXZhaWxhYmxlIHRvIHV0eG8tYmFzZWQgY29pbnNcblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zd2VlcFdpdGhTZW5kTWFueSgpKSB7XG4gICAgICBpZiAodGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCkgIT09IHRoaXMuYmFsYW5jZVN0cmluZygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnY2Fubm90IHN3ZWVwIHdoZW4gdW5jb25maXJtZWQgZnVuZHMgZXhpc3Qgb24gdGhlIHdhbGxldCwgcGxlYXNlIHdhaXQgdW50aWwgYWxsIGluYm91bmQgdHJhbnNhY3Rpb25zIGNvbmZpcm0nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5yZXN1bHQoKTtcbiAgICAgIGNvbnN0IG1heGltdW1TcGVuZGFibGUgPSBuZXcgQmlnTnVtYmVyKHZhbHVlLm1heGltdW1TcGVuZGFibGUpO1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgbWF4aW11bVNwZW5kYWJsZS5pc1plcm8oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGZ1bmRzIHRvIHN3ZWVwJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbmRNYW55UGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzIHx8ICcnLCAvLyBFbnN1cmUgYWRkcmVzcyBpcyBhbHdheXMgYSBzdHJpbmdcbiAgICAgICAgICAgIGFtb3VudDogbWF4aW11bVNwZW5kYWJsZS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueVBhcmFtcyk7XG4gICAgfVxuICAgIC8vIHRoZSBmb2xsb3dpbmcgZmxvdyB3b3JrcyBmb3IgYWxsIFVUWE8gY29pbnNcblxuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdmZWVSYXRlJyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdmZWVUeENvbmZpcm1UYXJnZXQnLFxuICAgICAgJ2FsbG93UGFydGlhbFN3ZWVwJyxcbiAgICAgICd0eEZvcm1hdCcsXG4gICAgXSk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3N3ZWVwV2FsbGV0JykpLnNlbmQoZmlsdGVyZWRQYXJhbXMpLnJlc3VsdCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5leHBsYWluVHJhbnNhY3Rpb24ocmVzcG9uc2UpO1xuICAgIGlmICh0cmFuc2FjdGlvbj8ub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGludmFsaWRPdXRwdXRBZGRyZXNzID0gdHJhbnNhY3Rpb24ub3V0cHV0cy5maW5kKChvdXRwdXQpID0+IG91dHB1dC5hZGRyZXNzICE9PSBwYXJhbXMuYWRkcmVzcyk7XG4gICAgICBpZiAoaW52YWxpZE91dHB1dEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHN3ZWVwIGRlc3RpbmF0aW9uICR7aW52YWxpZE91dHB1dEFkZHJlc3MuYWRkcmVzc30sIHNwZWNpZmllZCAke3BhcmFtcy5hZGRyZXNzfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdHJhbnNhY3Rpb24sIG5vIGRlc3RpbmF0aW9uIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIGFueTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHJ2OiBwYXJhbXMueHBydixcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLnNlbmRUcmFuc2FjdGlvbihmaW5hbFR4UGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogRnJlZXplIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmR1cmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb246IHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9mcmVlemUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjb21tZW50IG9mIGEgdHJhbnNmZXJcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQ29tbWVudChwYXJhbXM6IFRyYW5zZmVyQ29tbWVudE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ2NvbW1lbnQnXSk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHJhbnNmZXIvJyArIHBhcmFtcy5pZCArICcvY29tbWVudCcpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgdGhlIGFkZHJlc3NlcyBmb3IgYSBnaXZlbiB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGFkZHJlc3NlcyhwYXJhbXM6IEFkZHJlc3Nlc09wdGlvbnMgPSB7fSk6IFByb21pc2U8QWRkcmVzc1F1ZXJ5UmVzdWx0PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICAgIGNvbnN0IHF1ZXJ5OiBBZGRyZXNzZXNPcHRpb25zID0ge307XG5cbiAgICBpZiAocGFyYW1zLm1pbmUpIHtcbiAgICAgIHF1ZXJ5Lm1pbmUgPSAhIXBhcmFtcy5taW5lO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMucHJldklkKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcmV2SWQgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnByZXZJZCA9IHBhcmFtcy5wcmV2SWQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zb3J0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxhYmVsQ29udGFpbnMpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMubGFiZWxDb250YWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxhYmVsQ29udGFpbnMgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxhYmVsQ29udGFpbnMgPSBwYXJhbXMubGFiZWxDb250YWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFpbnMpKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYXJyYXkgb2YgbnVtYmVycycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuY2hhaW5zID0gcGFyYW1zLmNoYWlucztcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVCYWxhbmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVCYWxhbmNlcyBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVCYWxhbmNlcyA9IHBhcmFtcy5pbmNsdWRlQmFsYW5jZXM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG9rZW5zKSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY2x1ZGVUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG9rZW5zID0gcGFyYW1zLmluY2x1ZGVUb2tlbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlVG90YWxBZGRyZXNzQ291bnQgPSBwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmV0dXJuQmFsYW5jZXNGb3JUb2tlbiBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucmV0dXJuQmFsYW5jZXNGb3JUb2tlbiA9IHBhcmFtcy5yZXR1cm5CYWxhbmNlc0ZvclRva2VuO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5wZW5kaW5nRGVwbG95bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBlbmRpbmdEZXBsb3ltZW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkucGVuZGluZ0RlcGxveW1lbnQgPSBwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvYWRkcmVzc2VzJykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgYWRkcmVzc2VzIHNvcnRlZCBieSBiYWxhbmNlIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgYWRkcmVzc2VzQnlCYWxhbmNlKHBhcmFtczogQWRkcmVzc2VzQnlCYWxhbmNlT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IEFkZHJlc3Nlc0J5QmFsYW5jZU9wdGlvbnMgPSB7XG4gICAgICB0b2tlbjogcGFyYW1zLnRva2VuLFxuICAgICAgbmZ0Q29sbGVjdGlvbklkOiBwYXJhbXMubmZ0Q29sbGVjdGlvbklkLFxuICAgICAgbmZ0SWQ6IHBhcmFtcy5uZnRJZCxcbiAgICB9O1xuICAgIHF1ZXJ5LnNvcnQgPSBwYXJhbXMuc29ydCA/PyAtMTtcbiAgICBxdWVyeS5wYWdlID0gcGFyYW1zLnBhZ2UgPz8gMTtcbiAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdCA/PyA1MDA7XG5cbiAgICBpZiAoIV8uaXNOdW1iZXIocXVlcnkuc29ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihxdWVyeS5wYWdlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHBhZ2UgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTnVtYmVyKHF1ZXJ5LmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmIChxdWVyeS5saW1pdCA8IDEgfHwgcXVlcnkubGltaXQgPiA1MDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbGltaXQgYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUwMCcpO1xuICAgIH1cblxuICAgIC8vIEFzc2VydCB0aGF0IGVpdGhlciBib3RoIG5mdENvbGxlY3Rpb25JZCBhbmQgbmZ0SWQgYXJlIHByb3ZpZGVkIG9yIG5laXRoZXIgYXJlIHByb3ZpZGVkXG4gICAgY29uc3QgaGFzTmZ0Q29sbGVjdGlvbklkID0gIV8uaXNVbmRlZmluZWQocXVlcnkubmZ0Q29sbGVjdGlvbklkKTtcbiAgICBjb25zdCBoYXNOZnRJZCA9ICFfLmlzVW5kZWZpbmVkKHF1ZXJ5Lm5mdElkKTtcbiAgICBpZiAoaGFzTmZ0Q29sbGVjdGlvbklkICE9PSBoYXNOZnRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCduZnRDb2xsZWN0aW9uSWQgYW5kIG5mdElkIG11c3QgYm90aCBiZSBwcm92aWRlZCBvciBib3RoIGJlIG9taXR0ZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzZXMvYmFsYW5jZXMnKSlcbiAgICAgIC5xdWVyeShxdWVyeSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzaW5nbGUgd2FsbGV0IGFkZHJlc3MgYnkgaXRzIGlkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBnZXRBZGRyZXNzKHBhcmFtczogR2V0QWRkcmVzc09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnYWRkcmVzcycsICdpZCddKTtcbiAgICBsZXQgcXVlcnk7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5hZGRyZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeSA9IHBhcmFtcy5pZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybChgL3dhbGxldC8ke3RoaXMuX3dhbGxldC5pZH0vYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YCkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9uZSBvciBtb3JlIG5ldyBhZGRyZXNzKGVzKSBmb3IgdXNlIHdpdGggdGhpcyB3YWxsZXQuXG4gICAqXG4gICAqIElmIHRoZSBgY291bnRgIGZpZWxkIGlzIGRlZmluZWQgYW5kIGdyZWF0ZXIgdGhhbiAxLCBhbiBvYmplY3Qgd2l0aCBhIHNpbmdsZVxuICAgKiBhcnJheSBwcm9wZXJ0eSBuYW1lZCBgYWRkcmVzc2VzYCBjb250YWluaW5nIGBjb3VudGAgYWRkcmVzcyBvYmplY3RzXG4gICAqIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBzaW5nbGUgYWRkcmVzcyBvYmplY3QgaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5jaGFpbiBvbiB3aGljaCB0aGUgbmV3IGFkZHJlc3Mgc2hvdWxkIGJlIGNyZWF0ZWRcbiAgICogQHBhcmFtIHsoTnVtYmVyfFN0cmluZyl9IHBhcmFtcy5nYXNQcmljZSBnYXMgcHJpY2UgZm9yIG5ldyBhZGRyZXNzIGNyZWF0aW9uLCBpZiBhcHBsaWNhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubGFiZWwgbGFiZWwgZm9yIHRoZSBuZXcgYWRkcmVzcyhlcylcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5jb3VudD0xIG51bWJlciBvZiBuZXcgYWRkcmVzc2VzIHdoaWNoIHNob3VsZCBiZSBjcmVhdGVkIChtYXhpbXVtIDI1MClcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mb3J3YXJkZXJWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIGFkZHJlc3MgdG8gY3JlYXRlLCBpZiBhcHBsaWNhYmxlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmxvd1ByaW9yaXR5IEV0aGVyZXVtLXNwZWNpZmljIHBhcmFtIHRvIGNyZWF0ZSBhZGRyZXNzIHVzaW5nIGxvdyBwcmlvcml0eSBmZWUgYWRkcmVzc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmJhc2VBZGRyZXNzIGJhc2UgYWRkcmVzcyBvZiB0aGUgd2FsbGV0KG9wdGlvbmFsIHBhcmFtZXRlcilcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyBXaGVuIHNldCB0byBmYWxzZSwgaXQgdGhyb3dzIGVycm9yIGlmIGFkZHJlc3MgdmVyaWZpY2F0aW9uIGlzIHNraXBwZWQgZm9yIGFueSByZWFzb24uIERlZmF1bHQgaXMgdHJ1ZS5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vblRva2VuIG1hbmRhdG9yeSBpbiBjYXNlIG9mIHRoZSBPRkMgd2FsbGV0LCB0aGUgbmFtZSBvZiB0b2tlbiB0byBjcmVhdGUgYWRkcmVzcyBmb3JcbiAgICogQWRkcmVzcyB2ZXJpZmljYXRpb24gY2FuIGJlIHNraXBwZWQgd2hlbiBmb3J3YXJkZXJWZXJzaW9uIGlzIDAgYW5kIHBlbmRpbmdDaGFpbkluaXRpYWxpemF0aW9uIGlzIHRydWUgT1JcbiAgICogaWYgJ2NvaW5TcGVjaWZpYycgaXMgbm90IHBhcnQgb2YgdGhlIHJlc3BvbnNlIGZyb20gYXBpIGNhbGwgdG8gY3JlYXRlIGFkZHJlc3NcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFkZHJlc3MocGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzUGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNoYWluLFxuICAgICAgZ2FzUHJpY2UsXG4gICAgICBsYWJlbCxcbiAgICAgIGxvd1ByaW9yaXR5LFxuICAgICAgZm9yd2FyZGVyVmVyc2lvbixcbiAgICAgIGZvcm1hdCxcbiAgICAgIGNvdW50ID0gMSxcbiAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyA9IHRydWUsXG4gICAgICBvblRva2VuLFxuICAgICAgZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3MsXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChjaGFpbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoY2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW4gaGFzIHRvIGJlIGFuIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZ2FzUHJpY2UpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGdhc1ByaWNlKSAmJiAoaXNOYU4oTnVtYmVyKGdhc1ByaWNlKSkgfHwgIV8uaXNTdHJpbmcoZ2FzUHJpY2UpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dhc1ByaWNlIGhhcyB0byBiZSBhbiBpbnRlZ2VyIG9yIG51bWVyaWMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2U7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcndhcmRlclZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGZvcndhcmRlclZlcnNpb24pIHx8IGZvcndhcmRlclZlcnNpb24gPCAwIHx8IGZvcndhcmRlclZlcnNpb24gPiA1KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyVmVyc2lvbiBoYXMgdG8gYmUgYW4gaW50ZWdlciAwLCAxLCAyLCAzLCA0IG9yIDUnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb247XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYXNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhiYXNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4oYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGxvd1NraXBWZXJpZnlBZGRyZXNzIGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGNvdW50KSB8fCBjb3VudCA8PSAwIHx8IGNvdW50ID4gMjUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdW50IGhhcyB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDI1MCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsb3dQcmlvcml0eSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4obG93UHJpb3JpdHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbG93UHJpb3JpdHkgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sb3dQcmlvcml0eSA9IGxvd1ByaW9yaXR5O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3JtYXQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnb2ZjJykge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKG9uVG9rZW4pKSB7XG4gICAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb25Ub2tlbiBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRyZXNzUGFyYW1zLm9uVG9rZW4gPSBvblRva2VuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvblRva2VuIGlzIGEgbWFuZGF0b3J5IHBhcmFtZXRlciBmb3IgT0ZDIHdhbGxldHMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghXy5pc1N0cmluZyhvblRva2VuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uVG9rZW4gaGFzIHRvIGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzRVZNKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldm1LZXlSaW5nUmVmZXJlbmNlQWRkcmVzcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgRVZNIGNoYWlucycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmJhc2VDb2luLmlzVmFsaWRBZGRyZXNzKGV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzIG11c3QgYmUgYSB2YWxpZCBhZGRyZXNzJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmV2bUtleVJpbmdSZWZlcmVuY2VBZGRyZXNzID0gZXZtS2V5UmluZ1JlZmVyZW5jZUFkZHJlc3M7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGtleWNoYWlucyBmb3IgYWRkcmVzcyB2ZXJpZmljYXRpb25cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl93YWxsZXQua2V5cy5tYXAoKGspID0+IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IGssIHJlcUlkIH0pKSk7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSBfLmdldCh0aGlzLl93YWxsZXQsICdyZWNlaXZlQWRkcmVzcy5hZGRyZXNzJyk7XG5cbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSBfLnRpbWVzKGNvdW50LCBhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3MnKSlcbiAgICAgICAgLnNlbmQoYWRkcmVzc1BhcmFtcylcbiAgICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICAgIG5ld0FkZHJlc3Mua2V5Y2hhaW5zID0ga2V5Y2hhaW5zO1xuICAgICAgbmV3QWRkcmVzcy5iYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzID8/IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ2NvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcycpO1xuICAgICAgbmV3QWRkcmVzcy5mb3JtYXQgPSBhZGRyZXNzUGFyYW1zLmZvcm1hdDtcblxuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uRGF0YTogVmVyaWZ5QWRkcmVzc09wdGlvbnMgPSBfLm1lcmdlKHt9LCBuZXdBZGRyZXNzLCB7XG4gICAgICAgIHJvb3RBZGRyZXNzLFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiBfLmdldCh0aGlzLl93YWxsZXQsICdjb2luU3BlY2lmaWMud2FsbGV0VmVyc2lvbicpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh2ZXJpZmljYXRpb25EYXRhLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbiA/PyB2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYz8uZm9yd2FyZGVyVmVyc2lvbjtcblxuICAgICAgLy8gRm9yIFNNQyAoU2VsZi1NYW5hZ2VkIEN1c3RvZGlhbCkgd2FsbGV0cywgcGFzcyBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkIGZyb20gdXNlciBrZXljaGFpblxuICAgICAgLy8gVGhlIHZlcmlmaWNhdGlvbiBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGRlcml2YXRpb24gcHJlZml4IGludGVybmFsbHlcbiAgICAgIC8vIEN1c3RvZGlhbCB3YWxsZXRzIGRvbid0IG5lZWQgdGhpcyBhcyB0aGVpciBjb21tb25LZXljaGFpbiBhbHJlYWR5IGFjY291bnRzIGZvciB0aGUgcHJlZml4XG4gICAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycgJiYgdGhpcy50eXBlKCkgPT09ICdjb2xkJyAmJiB0aGlzLl93YWxsZXQua2V5cy5sZW5ndGggPiBLZXlJbmRpY2VzLlVTRVIpIHtcbiAgICAgICAgY29uc3QgdXNlcktleWNoYWluID0ga2V5Y2hhaW5zW0tleUluZGljZXMuVVNFUl0gYXMgS2V5Y2hhaW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCA9IHVzZXJLZXljaGFpbj8uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZDtcbiAgICAgIH1cblxuICAgICAgLy8gVGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIGZpcnN0IHBsYWNlIGJlY2F1c2UgaW4gY2Vsbywgd2hlbiB2ZXJpZnlBZGRyZXNzIG1ldGhvZCB3YXMgY2FsbGVkIG9uIGFkZHJlc3NlcyB3aGljaCB3ZXJlIGhhdmluZyBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBhcyB0cnVlLCBpdCB1c2VkIHRvIHRocm93IHNvbWUgZXJyb3JcbiAgICAgIC8vIEluIGNhc2Ugb2YgZm9yd2FyZGVyIHZlcnNpb24gMSBldGggYWRkcmVzc2VzLCBhZGRyZXNzZXMgbmVlZCB0byBiZSB2ZXJpZmllZCBldmVuIGlmIHRoZSBwZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiBmbGFnIGlzIHRydWVcbiAgICAgIGlmIChcbiAgICAgICAgdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMgJiZcbiAgICAgICAgKCF2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYy5wZW5kaW5nQ2hhaW5Jbml0aWFsaXphdGlvbiB8fCB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID09PSAxKVxuICAgICAgKSB7XG4gICAgICAgIC8vIGNhbid0IHZlcmlmeSBhZGRyZXNzZXMgd2hpY2ggYXJlIHBlbmRpbmcgY2hhaW4gaW5pdGlhbGl6YXRpb24sIGFzIHRoZSBhZGRyZXNzIGlzIGhpZGRlblxuICAgICAgICBsZXQgaXNXYWxsZXRBZGRyZXNzID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5pc1dhbGxldEFkZHJlc3ModmVyaWZpY2F0aW9uRGF0YSwgdGhpcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcikpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZJWE1FKEJHLTQzMjI1KTogaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5XG4gICAgICAgICAgaXNXYWxsZXRBZGRyZXNzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzV2FsbGV0QWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm90IGEgd2FsbGV0IGFkZHJlc3NgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIHNraXBwZWQgZm9yIGNvdW50ID0gJHtjb3VudH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld0FkZHJlc3M7XG4gICAgfSk7XG5cbiAgICBpZiAobmV3QWRkcmVzc2VzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5ld0FkZHJlc3Nlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzc2VzOiBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzZXMpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHByb3BlcnRpZXMgb24gYW4gYWRkcmVzc1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWRkcmVzcyhwYXJhbXM6IFVwZGF0ZUFkZHJlc3NPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBwYXJhbXMuYWRkcmVzcztcblxuICAgIGlmICghXy5pc1N0cmluZyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1dFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnbGFiZWwnXSk7XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzLycgKyBlbmNvZGVVUklDb21wb25lbnQoYWRkcmVzcykpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZChwdXRQYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhY2NvdW50IHJlc291cmNlcyBmb3IgdGhlIGdpdmVuIGFkZHJlc3Nlc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhZGRyZXNzZXMgYW5kIG9wdGlvbmFsIGRlc3RpbmF0aW9uQWRkcmVzc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxHZXRBY2NvdW50UmVzb3VyY2VzUmVzcG9uc2U+fSAtIHJlc3BvbnNlIGZyb20gV1AgQVBJXG4gICAqL1xuICBhc3luYyBnZXRBY2NvdW50UmVzb3VyY2VzKHBhcmFtczogR2V0QWNjb3VudFJlc291cmNlc09wdGlvbnMpOiBQcm9taXNlPEdldEFjY291bnRSZXNvdXJjZXNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgYWRkcmVzc2VzLCBkZXN0aW5hdGlvbkFkZHJlc3MgfSA9IHBhcmFtcztcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhZGRyZXNzZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3NlcyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzc2VzIGFycmF5IGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHk6IEdldEFjY291bnRSZXNvdXJjZXNPcHRpb25zID0geyBhZGRyZXNzZXMgfTtcbiAgICBpZiAoZGVzdGluYXRpb25BZGRyZXNzKSB7XG4gICAgICBib2R5LmRlc3RpbmF0aW9uQWRkcmVzcyA9IGRlc3RpbmF0aW9uQWRkcmVzcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZ2V0QWNjb3VudFJlc291cmNlcycpKS5zZW5kKGJvZHkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXNvdXJjZSBkZWxlZ2F0aW9ucyBmb3IgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcyAtIG9wdGlvbmFsIGZpbHRlcnM6IHR5cGUsIHJlc291cmNlLCBsaW1pdCwgbmV4dEJhdGNoUHJldklkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEdldFJlc291cmNlRGVsZWdhdGlvbnNSZXNwb25zZT59IC0gcmVzcG9uc2UgZnJvbSBXUCBBUElcbiAgICovXG4gIGFzeW5jIGdldFJlc291cmNlRGVsZWdhdGlvbnMocGFyYW1zPzogR2V0UmVzb3VyY2VEZWxlZ2F0aW9uc09wdGlvbnMpOiBQcm9taXNlPEdldFJlc291cmNlRGVsZWdhdGlvbnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG4gICAgaWYgKHBhcmFtcz8udHlwZSAhPT0gdW5kZWZpbmVkKSBxdWVyeVBhcmFtcy50eXBlID0gcGFyYW1zLnR5cGU7XG4gICAgaWYgKHBhcmFtcz8ucmVzb3VyY2UgIT09IHVuZGVmaW5lZCkgcXVlcnlQYXJhbXMucmVzb3VyY2UgPSBwYXJhbXMucmVzb3VyY2U7XG4gICAgaWYgKHBhcmFtcz8ubGltaXQgIT09IHVuZGVmaW5lZCkgcXVlcnlQYXJhbXMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgaWYgKHBhcmFtcz8ubmV4dEJhdGNoUHJldklkICE9PSB1bmRlZmluZWQpIHF1ZXJ5UGFyYW1zLm5leHRCYXRjaFByZXZJZCA9IHBhcmFtcy5uZXh0QmF0Y2hQcmV2SWQ7XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9yZXNvdXJjZWRlbGVnYXRpb25zJykpLnF1ZXJ5KHF1ZXJ5UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVdhbGxldEJ1aWxkRGVmYXVsdHMocGFyYW1zOiBVcGRhdGVCdWlsZERlZmF1bHRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnbWluRmVlUmF0ZScsICdjaGFuZ2VBZGRyZXNzVHlwZScsICd0eEZvcm1hdCddKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVXYWxsZXQoe1xuICAgICAgYnVpbGREZWZhdWx0czoge1xuICAgICAgICBtaW5GZWVSYXRlOiBwYXJhbXMubWluRmVlUmF0ZSxcbiAgICAgICAgY2hhbmdlQWRkcmVzc1R5cGU6IHBhcmFtcy5jaGFuZ2VBZGRyZXNzVHlwZSxcbiAgICAgICAgdHhGb3JtYXQ6IHBhcmFtcy50eEZvcm1hdCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVXYWxsZXQocGFyYW1zOiBVcGRhdGVXYWxsZXRPcHRpb25zKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2NvaW5TcGVjaWZpYycsICdidWlsZERlZmF1bHRzJywgJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHsgY29pblNwZWNpZmljLCAuLi5yZXN0IH0gPSBmaWx0ZXJlZFBhcmFtcztcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICAuLi5yZXN0LFxuICAgICAgICAuLi4oY29pblNwZWNpZmljXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICAgIFt0aGlzLmJhc2VDb2luLmdldENoYWluKCldOiBjb2luU3BlY2lmaWMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgd2ViaG9va3Mgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgbGlzdFdlYmhvb2tzKHBhcmFtczogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKHBhcmFtcy5wcmV2SWQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNmZXIgYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpIGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICAgKiAtIHRyYW5zZmVySWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNmZXIgd2ViaG9va3MpIGlkIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNmZXJcbiAgICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaW11bGF0ZVdlYmhvb2socGFyYW1zOiBTaW11bGF0ZVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2ViaG9va0lkJ10sIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IGhhc1RyYW5zZmVySWQgPSAhIXBhcmFtcy50cmFuc2ZlcklkO1xuICAgIGNvbnN0IGhhc1BlbmRpbmdBcHByb3ZhbElkID0gISFwYXJhbXMucGVuZGluZ0FwcHJvdmFsSWQ7XG4gICAgaWYgKCFoYXNUcmFuc2ZlcklkICYmICFoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCcpO1xuICAgIH1cblxuICAgIGlmIChoYXNUcmFuc2ZlcklkICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGVpdGhlciB0cmFuc2ZlcklkIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgICB9XG5cbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gICAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgICAvLyBvbmx5IHRha2UgdGhlIHRyYW5zZmVySWQgYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsndHJhbnNmZXJJZCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICAgIGNvbnN0IHdlYmhvb2tJZCA9IHBhcmFtcy53ZWJob29rSWQ7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHdlYmhvb2sgdG8gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWRkV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSB3ZWJob29rIGZyb20gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgcmVtb3ZlV2ViaG9vayhwYXJhbXM6IE1vZGlmeVdlYmhvb2tPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gZm9yIHRoaXMgd2FsbGV0XG4gICAqXG4gICAqIFRoZSB1c2VyIGtleWNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8S2V5Y2hhaW5XaXRoRW5jcnlwdGVkUHJ2PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyBpZDogdGhpcy5fd2FsbGV0LmtleXNbaW5kZXhdIH07XG5cbiAgICAgIGNvbnN0IGtleWNoYWluID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXQocGFyYW1zKTtcbiAgICAgIC8vIElmIHdlIGZpbmQgdGhlIHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbiBhcyBLZXljaGFpbldpdGhFbmNyeXB0ZWRQcnY7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVuZW5jcnlwdGVkIHByaXZhdGUga2V5IGZvciB0aGlzIHdhbGxldCAoYmUgY2FyZWZ1bCEpXG4gICAqIFJlcXVpcmVzIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGdldFBydihwYXJhbXM6IEdldFBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdwcnYnXSk7XG5cbiAgICAvLyBQcmVwYXJlIHNpZ25pbmcga2V5XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBlaXRoZXIgcHJvdmlkZSBwcnYgb3Igd2FsbGV0IHBhc3NwaHJhc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnBydikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFfLmlzU3RyaW5nKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXRQYXNzcGhyYXNlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnBydikge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wcnY7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleWNoYWluID0gYXdhaXQgdGhpcy5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKTtcbiAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBwYXNzcGhyYXNlIHdhcyBub3QgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXNlclBydiA9IGF3YWl0IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlBc3luYyh0aGlzLmJpdGdvLCB1c2VyS2V5Y2hhaW4sIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXJyb3IgZGVjcnlwdGluZyB3YWxsZXQgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICBwcml2YXRlIGlzTXVsdGlVc2VyS2V5V2FsbGV0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy5mZWF0dXJlcz8uaW5jbHVkZXMoJ211bHRpLWtleS11c2VyLWtleScpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gZW5jcnlwdGVkIHdhbGxldCBzaGFyZSB0byBCaXRHby5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlU2hhcmUocGFyYW1zOiBDcmVhdGVTaGFyZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJywgJ3Blcm1pc3Npb25zJ10sIFtdKTtcblxuICAgIGNvbnN0IGlzTXVsdGlVc2VyS2V5V2FsbGV0ID0gdGhpcy5pc011bHRpVXNlcktleVdhbGxldCgpO1xuXG4gICAgaWYgKGlzTXVsdGlVc2VyS2V5V2FsbGV0KSB7XG4gICAgICBpZiAocGFyYW1zLmtleWNoYWluICYmICFfLmlzRW1wdHkocGFyYW1zLmtleWNoYWluKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIHByb3BlcnR5IG11c3Qgbm90IGJlIHByb3ZpZGVkIGZvciBtdWx0aS1rZXktdXNlci1rZXkgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIGtleWNoYWluIGZyb20gcGFyYW1zIGlmIHByZXNlbnRzXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvc2hhcmUnKSkuc2VuZChfLm9taXQocGFyYW1zLCAna2V5Y2hhaW4nKSkucmVzdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4udG9QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlcyBrZXljaGFpbiBwYXJhbWV0ZXJzIC0gcHViLCBlbmNyeXB0ZWRQcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZXMgYSB3YWxsZXQgd2l0aCBtdWx0aXBsZSB1c2VycyBieSBjcmVhdGluZyBidWxrIHdhbGxldCBzaGFyZXMuXG4gICAqXG4gICAqIEBhc3luY1xuICAgKiBAcGFyYW0ge0J1bGtXYWxsZXRTaGFyZU9wdGlvbnN9IHBhcmFtcyAtIFRoZSBvcHRpb25zIGZvciBzaGFyaW5nIHdhbGxldHMgaW4gYnVsay5cbiAgICogQHBhcmFtIHtBcnJheTxTaGFyZU9wdGlvbj59IHBhcmFtcy5zaGFyZU9wdGlvbnMgLSBBbiBhcnJheSBvZiBzaGFyZSBvcHRpb24gb2JqZWN0cyBjb250YWluaW5nIHVzZXIgYW5kIHBlcm1pc3Npb25zIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5zaGFyZU9wdGlvbnNbXS5rZXljaGFpbl0gLSBUaGUga2V5Y2hhaW4gb2JqZWN0IHVzZWQgdG8gc2hhcmUgdGhlIHdhbGxldC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuc2hhcmVPcHRpb25zW10ua2V5Y2hhaW4udG9QdWJLZXldIC0gVGhlIHJlY2lwaWVudCdzIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLnNoYXJlT3B0aW9uc1tdLmtleWNoYWluLnBhdGhdIC0gVGhlIGRlcml2YXRpb24gcGF0aCBvZiB0aGUga2V5Y2hhaW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc2hhcmVPcHRpb25zW10udXNlciAtIFRoZSB1c2VyIHRvIHNoYXJlIHRoZSB3YWxsZXQgd2l0aC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zaGFyZU9wdGlvbnNbXS5wZXJtaXNzaW9ucyAtIFRoZSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy53YWxsZXRQYXNzcGhyYXNlXSAtIFRoZSB3YWxsZXQgcGFzc3BocmFzZSB1c2VkIHRvIGRlY3J5cHQgdGhlIGtleWNoYWluLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgYHNoYXJlT3B0aW9uc2AgaXMgZW1wdHksIG9yIGlmIHJlcXVpcmVkIGtleWNoYWluIHBhcmFtZXRlcnMgKGB0b1B1YktleWAgYW5kIGBwYXRoYCkgYXJlIG1pc3Npbmcgd2hlbiBuZWVkZWQuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB1bmFibGUgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXljaGFpbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2Ugb2YgdGhlIGJ1bGsgd2FsbGV0IHNoYXJlIGNyZWF0aW9uLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlQnVsa1dhbGxldFNoYXJlKHBhcmFtczogQnVsa1dhbGxldFNoYXJlT3B0aW9ucyk6IFByb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPiB7XG4gICAgaWYgKHBhcmFtcy5rZXlTaGFyZU9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNoYXJlIG9wdGlvbnMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWxrQ3JlYXRlU2hhcmVPcHRpb25zOiBCdWxrQ3JlYXRlU2hhcmVPcHRpb25bXSA9IFtdO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IHNoYXJlIG9wdGlvbiBuZWVkcyBhIGtleWNoYWluIChoYXMgJ3NwZW5kJyBwZXJtaXNzaW9uKVxuICAgIGNvbnN0IGFueU5lZWRzS2V5Y2hhaW4gPSBwYXJhbXMua2V5U2hhcmVPcHRpb25zLnNvbWUoKG9wdCkgPT4gb3B0LnBlcm1pc3Npb25zICYmIG9wdC5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKSk7XG5cbiAgICAvLyBGZXRjaCBhbmQgZGVjcnlwdCB0aGUga2V5Y2hhaW4gT05DRSBmb3IgYWxsIHVzZXJzXG4gICAgbGV0IGRlY3J5cHRlZEtleWNoYWluOiBEZWNyeXB0ZWRLZXljaGFpbkRhdGEgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYW55TmVlZHNLZXljaGFpbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVjcnlwdGVkS2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWlzc2luZ0VuY3J5cHRlZEtleWNoYWluRXJyb3IpIHtcbiAgICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzaGFyZU9wdGlvbiBvZiBwYXJhbXMua2V5U2hhcmVPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb21tb24udmFsaWRhdGVQYXJhbXMoc2hhcmVPcHRpb24sIFsndXNlcklkJywgJ3B1YktleScsICdwYXRoJ10sIFtdKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCFzaGFyZU9wdGlvbi5wdWJLZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTmVlZFVzZXJTaWdudXBFcnJvcihzaGFyZU9wdGlvbi51c2VySWQpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPSBzaGFyZU9wdGlvbi5wZXJtaXNzaW9ucyAmJiBzaGFyZU9wdGlvbi5wZXJtaXNzaW9ucy5pbmNsdWRlcygnc3BlbmQnKTtcblxuICAgICAgaWYgKG5lZWRzS2V5Y2hhaW4gJiYgZGVjcnlwdGVkS2V5Y2hhaW4pIHtcbiAgICAgICAgY29uc3Qgc2hhcmVkS2V5Y2hhaW4gPSB0aGlzLmVuY3J5cHRQcnZGb3JVc2VyKFxuICAgICAgICAgIGRlY3J5cHRlZEtleWNoYWluLnBydixcbiAgICAgICAgICBkZWNyeXB0ZWRLZXljaGFpbi5wdWIsXG4gICAgICAgICAgc2hhcmVPcHRpb24ucHViS2V5LFxuICAgICAgICAgIHNoYXJlT3B0aW9uLnBhdGhcbiAgICAgICAgKTtcblxuICAgICAgICBidWxrQ3JlYXRlU2hhcmVPcHRpb25zLnB1c2goe1xuICAgICAgICAgIHVzZXI6IHNoYXJlT3B0aW9uLnVzZXJJZCxcbiAgICAgICAgICBwZXJtaXNzaW9uczogc2hhcmVPcHRpb24ucGVybWlzc2lvbnMsXG4gICAgICAgICAga2V5Y2hhaW46IHNoYXJlZEtleWNoYWluLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVCdWxrS2V5U2hhcmVzKGJ1bGtDcmVhdGVTaGFyZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYnVsayB3YWxsZXQgc2hhcmUgZW50cmllcyBmb3Igc3BlY2lmaWVkIHNoYXJlIG9wdGlvbnMuXG4gICAqIEZpbHRlcnMgb3V0IHNoYXJlIG9wdGlvbnMgdGhhdCBkbyBub3QgY29udGFpbiB2YWxpZCBrZXljaGFpbiBpbmZvcm1hdGlvbiBvciBoYXZlIG1pc3Npbmcga2V5Y2hhaW4gZmllbGRzLlxuICAgKiBJZiBhbGwgc2hhcmUgb3B0aW9ucyBhcmUgaW52YWxpZCBvciBlbXB0eSwgaXQgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBTZW5kcyBhIFBPU1QgcmVxdWVzdCB0byBjcmVhdGUgdGhlIHdhbGxldCBzaGFyZXMgZm9yIHZhbGlkIHNoYXJlIG9wdGlvbnMuXG4gICAqXG4gICAqIEBhc3luY1xuICAgKiBAcGFyYW0ge0J1bGtDcmVhdGVTaGFyZU9wdGlvbltdfSBbcGFyYW1zPVtdXSAtIFRoZSBhcnJheSBvZiBzaGFyZSBvcHRpb25zIHRvIHByb2Nlc3MuXG4gICAqICAgS2V5Y2hhaW4gZW50cmllcyBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBmaWVsZHM6IGBwdWJgLCBgZW5jcnlwdGVkUHJ2YCwgYGZyb21QdWJLZXlgLCBgdG9QdWJLZXlgLCBhbmQgYHBhdGhgLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDcmVhdGVCdWxrV2FsbGV0U2hhcmVMaXN0UmVzcG9uc2U+fSBBIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXN1bHQgb2YgdGhlIHdhbGxldCBzaGFyZXMgY3JlYXRpb24uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgbm8gdmFsaWQgc2hhcmUgb3B0aW9ucyBhcmUgcHJvdmlkZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVCdWxrS2V5U2hhcmVzKHBhcmFtczogQnVsa0NyZWF0ZVNoYXJlT3B0aW9uW10gPSBbXSk6IFByb21pc2U8Q3JlYXRlQnVsa1dhbGxldFNoYXJlTGlzdFJlc3BvbnNlPiB7XG4gICAgcGFyYW1zID0gcGFyYW1zLmZpbHRlcigoc2hhcmVPcHRpb24pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhzaGFyZU9wdGlvbi5rZXljaGFpbiwgWydwdWInLCAnZW5jcnlwdGVkUHJ2JywgJ2Zyb21QdWJLZXknLCAndG9QdWJLZXknLCAncGF0aCddLCBbXSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeGNsdWRlIHNoYXJlIG9wdGlvbnMgd2l0aCBpbnZhbGlkIGtleWNoYWluXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghcGFyYW1zIHx8IE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NoYXJlT3B0aW9ucyBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMuX3dhbGxldC5pZH0vd2FsbGV0c2hhcmVzYCwgMik7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQoeyBzaGFyZU9wdGlvbnM6IHBhcmFtcyB9KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGtleWNoYWluIHdpdGggZW5jcnlwdGVkIHByaXZhdGUga2V5IHRvIGJlIHNoYXJlZCBmb3Igd2FsbGV0IHNoYXJpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEVuY3J5cHRlZFdhbGxldEtleWNoYWluRm9yV2FsbGV0U2hhcmluZygpOiBQcm9taXNlPEtleWNoYWluV2l0aEVuY3J5cHRlZFBydj4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpID09PSAnbG5idGMnKSB7XG4gICAgICAvLyBsaWdodG5pbmcgY29pbiBkb2VzIG5vdCB1c2UgdXNlciBrZXkgdG8gc2lnbiB0aGUgdHJhbnNhY3Rpb25zIGZyb20gU0RLLlxuICAgICAgLy8gaXQgdXNlcyB1c2VyIGF1dGgga2V5IGluc3RlYWQuXG4gICAgICByZXR1cm4gYXdhaXQgZ2V0TGlnaHRuaW5nQXV0aEtleSh0aGlzLCAndXNlckF1dGgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIGRlY3J5cHRzIHRoZSB3YWxsZXQga2V5Y2hhaW4gZm9yIHNoYXJpbmcuXG4gICAqIFRoaXMgbWV0aG9kIGZldGNoZXMgdGhlIGtleWNoYWluIG9uY2UgYW5kIGRlY3J5cHRzIGl0LCByZXR1cm5pbmcgdGhlIGRlY3J5cHRlZFxuICAgKiBwcml2YXRlIGtleSBhbmQgcHVibGljIGtleSBpbmZvIG5lZWRlZCBmb3Igc2hhcmluZyB3aXRoIG11bHRpcGxlIHVzZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIGtleWNoYWluXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGRlY3J5cHRlZCBwcnYgYW5kIHB1Yiwgb3IgdW5kZWZpbmVkIGZvciBjb2xkIHdhbGxldHNcbiAgICovXG4gIGFzeW5jIGdldERlY3J5cHRlZEtleWNoYWluRm9yU2hhcmluZyhcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxEZWNyeXB0ZWRLZXljaGFpbkRhdGEgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkV2FsbGV0S2V5Y2hhaW5Gb3JXYWxsZXRTaGFyaW5nKCk7XG5cbiAgICBpZiAoIWtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIXdhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB3YWxsZXRQYXNzcGhyYXNlIGFyZ3VtZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJ2ID0gYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleUFzeW5jKHRoaXMuYml0Z28sIGtleWNoYWluLCB3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IEluY29ycmVjdFBhc3N3b3JkRXJyb3IoJ1Bhc3N3b3JkIHNoYXJlZCBpcyBpbmNvcnJlY3QgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgLy8gT25seSBvbmUgb2YgcHViL2NvbW1vblB1Yi9jb21tb25LZXljaGFpbiBzaG91bGQgYmUgcHJlc2VudCBpbiB0aGUga2V5Y2hhaW5cbiAgICBsZXQgcHViID0ga2V5Y2hhaW4ucHViID8/IGtleWNoYWluLmNvbW1vblB1YjtcbiAgICBpZiAoa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgIHB1YiA9XG4gICAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYSdcbiAgICAgICAgICA/IEVkZHNhVXRpbHMuZ2V0UHVibGljS2V5RnJvbUNvbW1vbktleWNoYWluKGtleWNoYWluLmNvbW1vbktleWNoYWluKVxuICAgICAgICAgIDogRWNkc2FVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgIH1cblxuICAgIGlmICghcHViKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXRlcm1pbmUgcHVibGljIGtleSBmcm9tIGtleWNoYWluJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcHJ2LCBwdWIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNyeXB0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSBmb3Igc2hhcmluZyB3aXRoIGEgc3BlY2lmaWMgdXNlci5cbiAgICogVGhpcyBpcyB0aGUgcHVyZSBlbmNyeXB0aW9uIHN0ZXAgLSBubyBBUEkgY2FsbHMsIG5vIGRlY3J5cHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkZWNyeXB0ZWRQcnYgLSBUaGUgYWxyZWFkeS1kZWNyeXB0ZWQgcHJpdmF0ZSBrZXlcbiAgICogQHBhcmFtIHB1YiAtIFRoZSB3YWxsZXQncyBwdWJsaWMga2V5XG4gICAqIEBwYXJhbSB1c2VyUHVia2V5IC0gVGhlIHJlY2lwaWVudCB1c2VyJ3MgcHVibGljIGtleVxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBrZXkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgZW5jcnlwdGVkIGtleWNoYWluIGZvciB0aGUgcmVjaXBpZW50IHdpdGggYWxsIHJlcXVpcmVkIGZpZWxkc1xuICAgKi9cbiAgZW5jcnlwdFBydkZvclVzZXIoZGVjcnlwdGVkUHJ2OiBzdHJpbmcsIHB1Yjogc3RyaW5nLCB1c2VyUHVia2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IEJ1bGtXYWxsZXRTaGFyZUtleWNoYWluIHtcbiAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHVzZXJQdWJrZXksICdoZXgnKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IG5ld0VuY3J5cHRlZFBydiA9IHRoaXMuYml0Z28uZW5jcnlwdCh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBkZWNyeXB0ZWRQcnYgfSk7XG5cbiAgICBjb25zdCBrZXljaGFpbjogQnVsa1dhbGxldFNoYXJlS2V5Y2hhaW4gPSB7XG4gICAgICBwdWIsXG4gICAgICBlbmNyeXB0ZWRQcnY6IG5ld0VuY3J5cHRlZFBydixcbiAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICB0b1B1YktleTogdXNlclB1YmtleSxcbiAgICAgIHBhdGg6IHBhdGgsXG4gICAgfTtcblxuICAgIGFzc2VydChrZXljaGFpbi5wdWIsICdwdWIgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLmVuY3J5cHRlZFBydiwgJ2VuY3J5cHRlZFBydiBtdXN0IGJlIGRlZmluZWQgZm9yIHNoYXJpbmcnKTtcbiAgICBhc3NlcnQoa2V5Y2hhaW4uZnJvbVB1YktleSwgJ2Zyb21QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnRvUHViS2V5LCAndG9QdWJLZXkgbXVzdCBiZSBkZWZpbmVkIGZvciBzaGFyaW5nJyk7XG4gICAgYXNzZXJ0KGtleWNoYWluLnBhdGgsICdwYXRoIG11c3QgYmUgZGVmaW5lZCBmb3Igc2hhcmluZycpO1xuXG4gICAgcmV0dXJuIGtleWNoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGEga2V5Y2hhaW4gZm9yIHNoYXJpbmcgd2l0aCBhbm90aGVyIHVzZXIuXG4gICAqIEZldGNoZXMgdGhlIHdhbGxldCBrZXljaGFpbiwgZGVjcnlwdHMgaXQsIGFuZCBlbmNyeXB0cyBpdCBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSBrZXljaGFpblxuICAgKiBAcGFyYW0gcHVia2V5IC0gVGhlIHJlY2lwaWVudCdzIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHBhdGggLSBUaGUga2V5IHBhdGhcbiAgICogQHJldHVybnMgVGhlIGVuY3J5cHRlZCBrZXljaGFpbiBmb3IgdGhlIHJlY2lwaWVudFxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZVNoYXJlZEtleWNoYWluKFxuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwdWJrZXk6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxTaGFyZWRLZXlDaGFpbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWNyeXB0ZWRLZXljaGFpbiA9IGF3YWl0IHRoaXMuZ2V0RGVjcnlwdGVkS2V5Y2hhaW5Gb3JTaGFyaW5nKHdhbGxldFBhc3NwaHJhc2UpO1xuICAgICAgaWYgKCFkZWNyeXB0ZWRLZXljaGFpbikge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNyeXB0UHJ2Rm9yVXNlcihkZWNyeXB0ZWRLZXljaGFpbi5wcnYsIGRlY3J5cHRlZEtleWNoYWluLnB1YiwgcHVia2V5LCBwYXRoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE1pc3NpbmdFbmNyeXB0ZWRLZXljaGFpbkVycm9yKSB7XG4gICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgdGhpcyB3YWxsZXQgd2l0aCBhbm90aGVyIEJpdEdvIHVzZXIuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzaGFyZVdhbGxldChwYXJhbXM6IFNoYXJlV2FsbGV0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10pO1xuICAgIGlmIChwYXJhbXMucmVzaGFyZSAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMucmVzaGFyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5za2lwS2V5Y2hhaW4gIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNraXBLZXljaGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIG11bHRpLWtleS11c2VyLWtleSBPRkMgd2FsbGV0XG4gICAgLy8gRm9yIG11bHRpLWtleS11c2VyLWtleSB3YWxsZXRzLCBza2lwIGtleWNoYWluIHByZXBhcmF0aW9uIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgY29uZGl0aW9uc1xuICAgIGNvbnN0IG5lZWRzS2V5Y2hhaW4gPVxuICAgICAgIXRoaXMuaXNNdWx0aVVzZXJLZXlXYWxsZXQoKSAmJlxuICAgICAgIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiZcbiAgICAgIHBhcmFtcy5wZXJtaXNzaW9ucyAmJlxuICAgICAgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gICAgaWYgKHBhcmFtcy5kaXNhYmxlRW1haWwgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmRpc2FibGVFbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmVtYWlsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZW1haWwnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaGFyaW5nID0gKGF3YWl0IHRoaXMuYml0Z28uZ2V0U2hhcmluZ0tleSh7XG4gICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCksXG4gICAgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHNoYXJlZEtleWNoYWluID0gYXdhaXQgdGhpcy5wcmVwYXJlU2hhcmVkS2V5Y2hhaW4ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIHNoYXJpbmcucHVia2V5LCBzaGFyaW5nLnBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHtcbiAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgIHJlc2hhcmU6IHBhcmFtcy5yZXNoYXJlLFxuICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICBza2lwS2V5Y2hhaW46IE9iamVjdC5rZXlzKHNoYXJlZEtleWNoYWluID8/IHt9KS5sZW5ndGggPT09IDAsXG4gICAgICBrZXljaGFpbjogT2JqZWN0LmtleXMoc2hhcmVkS2V5Y2hhaW4gPz8ge30pLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHNoYXJlZEtleWNoYWluLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVTaGFyZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdXNlciBmcm9tIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdXNlcklkIElkIG9mIHRoZSB1c2VyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlVXNlcihwYXJhbXM6IFJlbW92ZVVzZXJPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcklkJ10sIFtdKTtcblxuICAgIGNvbnN0IHVzZXJJZCA9IHBhcmFtcy51c2VySWQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvdXNlci8nICsgdXNlcklkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSB0cmFuc2FjdGlvbiBwcmVidWlsZCAodW5zaWduZWQgdHJhbnNhY3Rpb24pIGZyb20gQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogc3RyaW5nfX0gcGFyYW1zLnJlY2lwaWVudHMgLSBsaXN0IG9mIHJlY2lwaWVudHMgYW5kIG5lY2Vzc2FyeSByZWNpcGllbnQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgLSBFc3RpbWF0ZXMgdGhlIGFwcHJveGltYXRlIGZlZSBwZXIga2lsb2J5dGUgbmVjZXNzYXJ5IGZvciBhIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvbiB3aXRoaW4gbnVtQmxvY2tzIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSB0aGUgZGVzaXJlZCBmZWVSYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBiYXNlIHVuaXRzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBNaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIHVuc3BlbnRzIGdvaW5nIGludG8gdGhpcyB0cmFuc2FjdGlvbiBzaG91bGQgaGF2ZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBFbmZvcmNlIG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnMgb24gY2hhbmdlIChpbnRlcm5hbCkgaW5wdXRzLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIC0gVGhlIGRlc2lyZWQgY291bnQgb2YgdW5zcGVudHMgaW4gdGhlIHdhbGxldC4gSWYgdGhlIHdhbGxldOKAmXMgY3VycmVudCB1bnNwZW50IGNvdW50IGlzIGxvd2VyIHRoYW4gdGhlIHRhcmdldCwgdXAgdG8gZm91ciBhZGRpdGlvbmFsIGNoYW5nZSBvdXRwdXRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIHNtYWxsZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBiYXNlIHVuaXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyIHwgU3RyaW5nfSBwYXJhbXMubWF4VmFsdWUgLSBJZ25vcmUgdW5zcGVudHMgbGFyZ2VyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzTGltaXQgLSBDdXN0b20gZ2FzIGxpbWl0IHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNoYW5nZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjaGFuZ2Ugb3V0cHV0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vblBhcnRpY2lwYXRpb24gLSAoQWxnb3JhbmQpIE5vbiBwYXJ0aWNpcGF0aW5nIGtleSByZWcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZEZyb21CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1pbmltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnZhbGlkVG9CbG9jayAtIChBbGdvcmFuZCkgVGhlIG1heGltdW0gcm91bmQgdGhpcyB3aWxsIHJ1biBvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gQnVpbGQgdGhpcyB0cmFuc2FjdGlvbiB0byBjb25mb3JtIHdpdGggaW5zdGFudCBzZW5kaW5nIGNvaW4tc3BlY2lmaWMgbWV0aG9kIChpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmtlZXBBbGl2ZSAtIChQb2xrYWRvdCkga2VlcCBhZGRyZXNzIGFsaXZlIGJ5IHNlbmRpbmcgdGhlIGFkZHJlc3MgbWluaW11bSBmdW5kaW5nIGFtb3VudCwgdXNlZCBkdXJpbmcgd2FsbGV0IGNvbnNvbGlkYXRpb24sIHRydWUgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtLnRyYW5zZmVySWQgLSB0cmFuc2ZlciBJZCB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBjYXNwZXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzc1R5cGUgLSBUaGUgdHlwZSBvZiBhZGRyZXNzIHRvIGNyZWF0ZSBmb3IgY2hhbmdlLiBPbmUgb2YgYHAyc2hgLCBgcDJzaFAyd3NoYCwgYW5kIGBwMndzaGAuIENhc2Utc2Vuc2l0aXZlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ob3AgLSBCdWlsZCB0aGlzIGFzIGFuIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLnJlc2VydmF0aW9uIC0gT2JqZWN0IHRvIHJlc2VydmUgdGhlIHVuc3BlbnRzIHRoYXQgdGhpcyB0eCBidWlsZCB1c2VzLiBGb3JtYXQgaXMgcmVzZXJ2YXRpb24gPSB7IGV4cGlyZVRpbWU6IElTT0RhdGVTdHJpbmcsIHBlbmRpbmdBcHByb3ZhbElkOiBTdHJpbmcgfVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgVGhlIHBhc3NwaHJhc2UgdG8gdGhlIHdhbGxldCB1c2VyIGtleSwgdG8gc2lnbiBjb21taXRtZW50IGRhdGEgZm9yIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyB1c2VkIGFzIHRoZSBcInRvXCIgZmllbGQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFdoaXRlbGlzdCBwYXJhbXMgdG8gYnVpbGQgdHhcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKSk7XG4gICAgZGVidWcoJ3ByZWJ1aWxkaW5nIHRyYW5zYWN0aW9uOiAlTycsIHdoaXRlbGlzdGVkUGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBleHRyYVBhcmFtcyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4uZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhPYmplY3QuYXNzaWduKHBhcmFtcywgeyB3YWxsZXQ6IHRoaXMgfSkpO1xuICAgIE9iamVjdC5hc3NpZ24od2hpdGVsaXN0ZWRQYXJhbXMsIGV4dHJhUGFyYW1zKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHtcbiAgICAgIG9mZmxpbmVWZXJpZmljYXRpb246IHBhcmFtcy5vZmZsaW5lVmVyaWZpY2F0aW9uID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGRRdWVyeSA9IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2J1aWxkJykpXG4gICAgICAucXVlcnkocXVlcnlQYXJhbXMpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcblxuICAgIGNvbnN0IGJsb2NrSGVpZ2h0UXVlcnkgPSBfLmlzRnVuY3Rpb24oKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodClcbiAgICAgID8gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5nZXRMYXRlc3RCbG9ja0hlaWdodChwYXJhbXMucmVxSWQpXG4gICAgICA6IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIGNvbnN0IHF1ZXJpZXMgPSBbYnVpbGRRdWVyeSwgYmxvY2tIZWlnaHRRdWVyeV07XG4gICAgY29uc3QgW2J1aWxkUmVzcG9uc2UsIGJsb2NrSGVpZ2h0XSA9IChhd2FpdCBQcm9taXNlLmFsbChxdWVyaWVzKSkgYXMgYW55O1xuICAgIGRlYnVnKCdwb3N0cHJvY2Vzc2luZyB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBidWlsZFJlc3BvbnNlKTtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYmxvY2tIZWlnaHQpKSB7XG4gICAgICBidWlsZFJlc3BvbnNlLmJsb2NrSGVpZ2h0ID0gYmxvY2tIZWlnaHQ7XG4gICAgfVxuICAgIGxldCBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICBPYmplY3QuYXNzaWduKGJ1aWxkUmVzcG9uc2UsIHtcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICB9KVxuICAgICkpIGFzIGFueTtcbiAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgIGRlbGV0ZSBwcmVidWlsZC5idWlsZFBhcmFtcztcbiAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgIGlmICh0aGlzLl93YWxsZXQgJiYgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYyAmJiAhcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcykge1xuICAgICAgcHJlYnVpbGQgPSBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHtcbiAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmJhc2VBZGRyZXNzLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgZGVidWcoJ2ZpbmFsIHRyYW5zYWN0aW9uIHByZWJ1aWxkOiAlTycsIHByZWJ1aWxkKTtcbiAgICByZXR1cm4gcHJlYnVpbGQgYXMgUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBVc2VyIEtleWNoYWluIGFuZCBzaWduIGEgVFNTIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFJlcXVlc3RJZCBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBpZFxuICAgKiBAcGFyYW0gd2FsbGV0UGFzc3BocmFzZSBUaGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHJldHVybiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgdHhSZXF1ZXN0SWQsXG4gICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgfToge1xuICAgIHR4UmVxdWVzdElkOiBzdHJpbmc7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICB9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRVc2VyS2V5QW5kU2lnblRzc1RyYW5zYWN0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcbiAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgIXVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndGhlIHVzZXIga2V5Y2hhaW4gZG9lcyBub3QgaGF2ZSBwcm9wZXJ0eSBlbmNyeXB0ZWRQcnYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdHhQcmVidWlsZDogeyB0eFJlcXVlc3RJZCB9LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgICAga2V5Y2hhaW46IHVzZXJLZXljaGFpbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4UHJlYnVpbGRcbiAgICogLSBba2V5Y2hhaW4gLyBrZXldIChvYmplY3QpIG9yIHBydiAoc3RyaW5nKVxuICAgKiAtIHdhbGxldFBhc3NwaHJhc2VcbiAgICogLSB2ZXJpZnlUeFBhcmFtcyAob3B0aW9uYWwpIC0gd2hlbiBwcm92aWRlZCwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHNpZ25pbmdcbiAgICogICAtIHR4UGFyYW1zOiB0cmFuc2FjdGlvbiBwYXJhbWV0ZXJzIHVzZWQgZm9yIHZlcmlmaWNhdGlvblxuICAgKiAgIC0gdmVyaWZpY2F0aW9uOiBvcHRpb25hbCB2ZXJpZmljYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgYXBpVmVyc2lvbiwgdHhSZXF1ZXN0SWQgfSA9IHBhcmFtcztcblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tQ29tbWl0bWVudEdlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pXG4gICAgKSB7XG4gICAgICAvLyBpbnZva2UgZXh0ZXJuYWwgc2lnbmVyIFRTUyBmb3IgRWREU0Egd29ya2Zsb3dcbiAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvblRzc0V4dGVybmFsU2lnbmVyRWREU0EocGFyYW1zLCB0aGlzLmJhc2VDb2luKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikgJiZcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSB3b3JrZmxvd1xuICAgICAgcmV0dXJuIHRoaXMuc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQSh0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIF8uaXNGdW5jdGlvbihwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGlvbkZ1bmN0aW9uKSAmJlxuICAgICAgXy5pc0Z1bmN0aW9uKHBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW9uRnVuY3Rpb24pICYmXG4gICAgICBfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvbilcbiAgICApIHtcbiAgICAgIC8vIGludm9rZSBleHRlcm5hbCBzaWduZXIgVFNTIGZvciBFQ0RTQSBNUEN2MndvcmtmbG93XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBTVBDdjIodGhpcy5iYXNlQ29pbiwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQgfHwgdHlwZW9mIHR4UHJlYnVpbGQgIT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ29uY2hhaW4nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhQcmVidWlsZCBpcyByZXF1aXJlZCBmb3Igb24tY2hhaW4gbXVsdGlzaWcgd2FsbGV0cycpO1xuICAgICAgfVxuICAgICAgaWYgKCF0eFJlcXVlc3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgb3IgdHhSZXF1ZXN0SWQgaXMgcmVxdWlyZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICB9XG4gICAgICAvLyBXZSBvbmx5IGRvIHRoaXMgaWYgd2UncmUgbm90IHVzaW5nIHRoZSBleHRlcm5hbCBzaWduZXIgVFNTIGZsb3dcbiAgICAgIHBhcmFtcy50eFByZWJ1aWxkID0geyB0eFJlcXVlc3RJZCB9O1xuICAgIH1cblxuICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBpZiB2ZXJpZnlUeFBhcmFtcyBpcyBwcm92aWRlZFxuICAgIGlmIChwYXJhbXMudmVyaWZ5VHhQYXJhbXMgJiYgdHhQcmVidWlsZD8udHhIZXgpIHtcbiAgICAgIGNvbnN0IHZlcmlmeVBhcmFtcyA9IHtcbiAgICAgICAgdHhQcmVidWlsZDogeyAuLi50eFByZWJ1aWxkIH0sXG4gICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudmVyaWZ5VHhQYXJhbXMudHhQYXJhbXMsXG4gICAgICAgIHdhbGxldDogdGhpcyBhcyBJV2FsbGV0LFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZnlUeFBhcmFtcy52ZXJpZmljYXRpb24sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFR5cGU6IHRoaXMubXVsdGlzaWdUeXBlKCkgYXMgJ29uY2hhaW4nIHwgJ3RzcycsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHZlcmlmeVBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiZcbiAgICAgICEocGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXkpICYmXG4gICAgICAodGhpcy50eXBlKCkgPT09ICdob3QnIHx8IHRoaXMudHlwZSgpID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICAvLyB0aGlzIGxvZ2ljIHNob3VsZCBvbmx5IGFwcGx5IHRvIGhvdCB3YWxsZXRzXG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB1c2VyS2V5Y2hhaW4gPSBrZXljaGFpbnNbMF07XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCAhdXNlcktleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSB1c2VyIGtleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBwYXJhbXMua2V5Y2hhaW4gPSB1c2VyS2V5Y2hhaW47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3Moe1xuICAgICAgICAuLi5wcmVzaWduLFxuICAgICAgICBwcnY6IGF3YWl0IHRoaXMuZ2V0VXNlclBydkFzeW5jKHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IHsgcHVicyB9ID0gcGFyYW1zO1xuICAgIGlmICghcHVicyAmJiB0aGlzLmJhc2VDb2luLmtleUlkc0ZvclNpZ25pbmcoKS5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgICAgcHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnblRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucHJlc2lnbixcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4udHhQcmVidWlsZCwgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhc3NlcnQocHVicywgJ3B1YnMgYXJlIHJlcXVpcmVkIGZvciBjdXN0b20gc2lnbmluZycpO1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi5zaWduV2l0aEN1c3RvbVNpZ25pbmdGdW5jdGlvbihwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLCB7XG4gICAgICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgIHB1YnMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBjb25zdCBzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCA9IHtcbiAgICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uU2VlZDoga2V5c1swXT8uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCxcbiAgICAgIH07XG4gICAgICByZXR1cm4gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbihzaWduVHJhbnNhY3Rpb25QYXJhbXNXaXRoU2VlZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IGF3YWl0IHRoaXMuZ2V0VXNlclBydkFzeW5jKHByZXNpZ24gYXMgR2V0VXNlclBydk9wdGlvbnMpLFxuICAgICAgd2FsbGV0OiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0eXBlZCBzdHJ1Y3R1cmVkIGRhdGEgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHNpZ25UeXBlZERhdGEocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1NpZ25pbmdUeXBlZERhdGEoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaWduIHR5cGVkIGRhdGEgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnR5cGVkRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlZCBkYXRhIHJlcXVpcmVkYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIHNpZ25pbmcgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGVkRGF0YS50eXBlZERhdGFSYXcgbXVzdCBiZSBKU09OIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAoXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlVHlwZWREYXRhKSkge1xuICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFFbmNvZGVkID0gKHRoaXMuYmFzZUNvaW4gYXMgYW55KS5lbmNvZGVUeXBlZERhdGEocGFyYW1zLnR5cGVkRGF0YSk7XG4gICAgfVxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkOiBwYXJhbXMucmVxSWQgfSk7XG4gICAgY29uc3QgdXNlclBydk9wdGlvbnM6IEdldFVzZXJQcnZPcHRpb25zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICB9O1xuICAgIGFzc2VydChrZXljaGFpbnNbMF0uY29tbW9uS2V5Y2hhaW4sICdVbmFibGUgdG8gZmluZCBjb21tb25LZXljaGFpbiBpbiBrZXljaGFpbnMnKTtcbiAgICBjb25zdCBwcmVzaWduID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgd2FsbGV0RGF0YTogdGhpcy5fd2FsbGV0LFxuICAgICAgdHNzVXRpbHM6IHRoaXMudHNzVXRpbHMsXG4gICAgICBwcnY6IGF3YWl0IHRoaXMuZ2V0VXNlclBydkFzeW5jKHVzZXJQcnZPcHRpb25zKSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViOiBrZXljaGFpbnMubWFwKChrKSA9PiBrLnB1YiksXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnblR5cGVkRGF0YVRzcyhwcmVzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgU2lnbiBhIG1lc3NhZ2UgdXNpbmcgVFNTXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSBNZXNzYWdlXG4gICAqIC0gY3VzdG9kaWFuTWVzc2FnZUlkXG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShwYXJhbXM6IFdhbGxldFNpZ25NZXNzYWdlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRNZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTWVzc2FnZVNpZ25pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZXNzYWdlIHNpZ25pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2UgfHwgIXBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSBhbmQgdHlwZSByZXF1aXJlZCB0byBzaWduIG1lc3NhZ2UnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2Ugc2lnbmluZyBvbmx5IHN1cHBvcnRlZCBmb3IgVFNTIHdhbGxldHMnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNGdW5jdGlvbigodGhpcy5iYXNlQ29pbiBhcyBhbnkpLmVuY29kZU1lc3NhZ2UpKSB7XG4gICAgICBwYXJhbXMubWVzc2FnZS5tZXNzYWdlRW5jb2RlZCA9ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZW5jb2RlTWVzc2FnZShwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3KTtcbiAgICB9XG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQ6IHBhcmFtcy5yZXFJZCB9KTtcbiAgICBjb25zdCB1c2VyUHJ2T3B0aW9uczogR2V0VXNlclBydk9wdGlvbnMgPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgIH07XG4gICAgYXNzZXJ0KGtleWNoYWluc1swXS5jb21tb25LZXljaGFpbiwgJ1VuYWJsZSB0byBmaW5kIGNvbW1vbktleWNoYWluIGluIGtleWNoYWlucycpO1xuICAgIGNvbnN0IHByZXNpZ24gPSB7XG4gICAgICAuLi5wYXJhbXMsXG4gICAgICB3YWxsZXREYXRhOiB0aGlzLl93YWxsZXQsXG4gICAgICB0c3NVdGlsczogdGhpcy50c3NVdGlscyxcbiAgICAgIHBydjogYXdhaXQgdGhpcy5nZXRVc2VyUHJ2QXN5bmModXNlclBydk9wdGlvbnMpLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIGJhY2t1cEtleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMSA/IGtleWNoYWluc1sxXSA6IG51bGwsXG4gICAgICBiaXRnb0tleWNoYWluOiBrZXljaGFpbnMubGVuZ3RoID4gMiA/IGtleWNoYWluc1syXSA6IG51bGwsXG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuc2lnbk1lc3NhZ2VUc3MocHJlc2lnbik7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYW5kIGNyZWF0ZXMgYSBzaWduIG1lc3NhZ2UgcmVxdWVzdCBmb3IgVFNTIHdhbGxldHMsIHRoYXQgY2FuIGJlIHVzZWQgbGF0ZXIgZm9yIHNpZ25pbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciBjcmVhdGluZyB0aGUgc2lnbiBtZXNzYWdlIHJlcXVlc3RcbiAgICogQHJldHVybnMgUHJvbWlzZTxUeFJlcXVlc3Q+IC0gVGhlIGNyZWF0ZWQgdHJhbnNhY3Rpb24gcmVxdWVzdCBmb3Igc2lnbmluZyBhIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIGJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KHBhcmFtczogV2FsbGV0U2lnbk1lc3NhZ2VPcHRpb25zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSAhPT0gJ3RzcycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBzaWduaW5nIG9ubHkgc3VwcG9ydGVkIGZvciBUU1Mgd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c01lc3NhZ2VTaWduaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWVzc2FnZSBzaWduaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfWApO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLm1lc3NhZ2U/Lm1lc3NhZ2VSYXcgfHwgIXBhcmFtcy5tZXNzYWdlPy5tZXNzYWdlU3RhbmRhcmRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgYW5kIHR5cGUgcmVxdWlyZWQgdG8gY3JlYXRlIG1lc3NhZ2Ugc2lnbiByZXF1ZXN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VSYXcgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3O1xuICAgIGNvbnN0IG1lc3NhZ2VTdGFuZGFyZFR5cGUgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlU3RhbmRhcmRUeXBlO1xuXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlbnRPcHRpb246IEludGVudE9wdGlvbnNGb3JNZXNzYWdlID0ge1xuICAgICAgICBjdXN0b2RpYW5NZXNzYWdlSWQ6IHBhcmFtcy5jdXN0b2RpYW5NZXNzYWdlSWQsXG4gICAgICAgIHJlcUlkLFxuICAgICAgICBpbnRlbnRUeXBlOiAnc2lnbk1lc3NhZ2UnLFxuICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZVN0YW5kYXJkVHlwZSxcbiAgICAgICAgc2lnbmVyQWRkcmVzczogcGFyYW1zLm1lc3NhZ2Uuc2lnbmVyQWRkcmVzcyxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGhpcy50c3NVdGlscykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RTUyB1dGlsaXRpZXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB3YWxsZXQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRzc1V0aWxzLmJ1aWxkU2lnbk1lc3NhZ2VSZXF1ZXN0KGludGVudE9wdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBtZXNzYWdlIHNpZ24gcmVxdWVzdDogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VyIHByaXZhdGUga2V5IGZyb20gZWl0aGVyIGEgZGVyaXZhdGlvbiBvciBhbiBlbmNyeXB0ZWQga2V5Y2hhaW4gKHN5bmMsIHYxIG9ubHkpLlxuICAgKiBAcGFyYW0gW3BhcmFtcy5rZXljaGFpbiAvIHBhcmFtcy5rZXldIChvYmplY3QpIG9yIHBhcmFtcy5wcnYgKHN0cmluZylcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIChzdHJpbmcpXG4gICAqL1xuICBnZXRVc2VyUHJ2KHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICdvbmNoYWluJ1xuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAga2V5OiB1c2VyUHJ2LFxuICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuICAgICAgdXNlclBydiA9IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgdXNlcktleWNoYWluLCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG4gICAgICBpZiAoIXVzZXJQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1c2VyUHJ2O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIHZlcnNpb24gb2YgZ2V0VXNlclBydiB0aGF0IHN1cHBvcnRzIGJvdGggdjEgKFNKQ0wpIGFuZCB2MiAoQXJnb24yaWQpIGVudmVsb3Blcy5cbiAgICogQHBhcmFtIFtwYXJhbXMua2V5Y2hhaW4gLyBwYXJhbXMua2V5XSAob2JqZWN0KSBvciBwYXJhbXMucHJ2IChzdHJpbmcpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAoc3RyaW5nKVxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlclBydkFzeW5jKHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLmtleWNoYWluICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMubXVsdGlzaWdUeXBlKCkgPT09ICdvbmNoYWluJ1xuICAgICkge1xuICAgICAgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCA9IHBhcmFtcy5rZXljaGFpbi5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICAgIH1cblxuICAgIGlmICh1c2VyUHJ2ICYmIHBhcmFtcy5jb2xkRGVyaXZhdGlvblNlZWQpIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb24gPSB0aGlzLmJhc2VDb2luLmRlcml2ZUtleVdpdGhTZWVkKHtcbiAgICAgICAga2V5OiB1c2VyUHJ2LFxuICAgICAgICBzZWVkOiBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkLFxuICAgICAgfSk7XG4gICAgICB1c2VyUHJ2ID0gZGVyaXZhdGlvbi5rZXk7XG4gICAgfSBlbHNlIGlmICghdXNlclBydikge1xuICAgICAgaWYgKCF1c2VyS2V5Y2hhaW4gfHwgdHlwZW9mIHVzZXJLZXljaGFpbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG4gICAgICBpZiAoIXVzZXJFbmNyeXB0ZWRQcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdrZXljaGFpbiBkb2VzIG5vdCBoYXZlIHByb3BlcnR5IGVuY3J5cHRlZFBydicpO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgcHJvcGVydHkgbWlzc2luZycpO1xuICAgICAgfVxuICAgICAgdXNlclBydiA9IGF3YWl0IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXlBc3luYyh0aGlzLmJpdGdvLCB1c2VyS2V5Y2hhaW4sIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIGlmICghdXNlclBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBCaXRHbywgdmFsaWRhdGUgaXQsIGFuZCB0aGVuIGRlY3J5cHQgdGhlIHVzZXIga2V5IGFuZCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBwcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChwYXJhbXMuZWlwMTU1OSAmJiBwYXJhbXMuZ2FzUHJpY2UpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ09ubHkgb25lIG9mIHBhcmFtcy5laXAxNTU5IGFuZCBwYXJhbXMuZ2FzUHJpY2UgbWF5IGJlIHNwZWNpZmllZCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdib3RoX2dhc1ByaWNlX2FuZF9laXAxNTU5Z2FzTW9kZWxfc3BlY2lmaWVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJlYnVpbGRUeCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcHJlYnVpbGRUeCBhbmQgcmVjaXBpZW50cyBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfcHJlYnVpbGR0eF9hbmRfcmVjaXBpZW50c19zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgYXJyYXknKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjaXBpZW50c19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucykgJiYgIXRoaXMuX3Blcm1pc3Npb25zLmluY2x1ZGVzKCdzcGVuZCcpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdubyBzcGVuZCBwZXJtaXNzaW9uIG9uIHRoaXMgd2FsbGV0Jyk7XG4gICAgICBlcnJvci5jb2RlID0gJ3VzZXJfbm90X2FsbG93ZWRfdG9fc3BlbmRfZnJvbV93YWxsZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNlaXZlQWRkcmVzcyAmJiAocGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlcicgfHwgcGFyYW1zLnR5cGUgPT09ICd0cmFuc2ZlclRva2VuJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoYGNhbm5vdCB1c2UgcmVjZWl2ZSBhZGRyZXNzIGZvciBUU1MgdHJhbnNhY3Rpb25zIG9mIHR5cGUgJHtwYXJhbXMudHlwZX1gKTtcbiAgICAgIGVycm9yLmNvZGUgPSAncmVjZWl2ZV9hZGRyZXNzX25vdF9hbGxvd2VkX2Zvcl90c3Nfd2l0aGRyYXdhbHMnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmIChwYXJhbXMudHlwZSA9PT0gJ2ZpbGxOb25jZScgfHwgcGFyYW1zLnR5cGUgPT09ICdhY2NlbGVyYXRpb24nKSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihgY2Fubm90IHByb3ZpZGUgcmVjaXBpZW50cyBmb3IgdHJhbnNhY3Rpb24gdHlwZSAke3BhcmFtcy50eXBlfWApO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hbGxvd2VkX2Zvcl9maWxsbm9uY2VfYW5kX2FjY2VsZXJhdGlvbl90eF90eXBlJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFwaVZlcnNpb24pIHtcbiAgICAgIHZhbGlkYXRlVHhSZXF1ZXN0QXBpVmVyc2lvbih0aGlzLCBwYXJhbXMuYXBpVmVyc2lvbik7XG4gICAgfVxuXG4gICAgLy8gRG9pbmcgYSBzYW5pdHkgY2hlY2sgZm9yIHBhc3N3b3JkIGhlcmUgdG8gYXZvaWQgZG9pbmcgZnVydGhlciB3b3JrIGlmIHdlIGtub3cgaXQncyB3cm9uZ1xuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB9KTtcblxuICAgIGxldCB0eFByZWJ1aWxkUXVlcnk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCB8IHN0cmluZz47XG4gICAgaWYgKGlzUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdChwYXJhbXMucHJlYnVpbGRUeCkgJiYgcGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXM/LnByZXZpZXcpIHtcbiAgICAgIC8vIElmIHdlIHByZWJ1aWx0IHRoZSB0eFJlcXVlc3Qgd2l0aCBwcmV2aWV3PXRydWUsIHRoZW4gd2Ugc2hvdWxkIHJlYnVpbGQgd2l0aCBwcmV2aWV3PWZhbHNlIHRvIHBlcnNpc3QgdGhlIHJlcXVlc3RcbiAgICAgIHR4UHJlYnVpbGRRdWVyeSA9IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgLi4ueyAuLi5wYXJhbXMucHJlYnVpbGRUeC5idWlsZFBhcmFtcywgcHJldmlldzogZmFsc2UgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eFByZWJ1aWxkUXVlcnkgPSBwYXJhbXMucHJlYnVpbGRUeCA/IFByb21pc2UucmVzb2x2ZShwYXJhbXMucHJlYnVpbGRUeCkgOiB0aGlzLnByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgcHJlYnVpbGQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuIGV4cGxpY2l0IHR4XG4gICAgY29uc3QgdHhQcmVidWlsZCA9IChhd2FpdCB0eFByZWJ1aWxkUXVlcnkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB7IC4uLnR4UHJlYnVpbGQuYnVpbGRQYXJhbXMsIC4uLnBhcmFtcyB9LFxuICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgIHZlcmlmaWNhdGlvbjogcGFyYW1zLnZlcmlmaWNhdGlvbiA/PyB7fSxcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkIGZhaWxlZCBsb2NhbCB2YWxpZGF0aW9uOicsIGUubWVzc2FnZSk7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAndHJhbnNhY3Rpb24gcGFyYW1zOicsXG4gICAgICAgIF8ub21pdChwYXJhbXMsIFsna2V5Y2hhaW4nLCAncHJ2JywgJ3Bhc3NwaHJhc2UnLCAnd2FsbGV0UGFzc3BocmFzZScsICdrZXknLCAnd2FsbGV0J10pXG4gICAgICApO1xuICAgICAgLy8gU2FuaXRpemUgdG8gcmVtb3ZlIF90b2tlbiBmcm9tIGJpdGdvXG4gICAgICBjb25zdCBzYW5pdGl6ZWRQcmVidWlsZCA9IHtcbiAgICAgICAgLi4uXy5vbWl0KHR4UHJlYnVpbGQsIFsnd2FsbGV0J10pLFxuICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAuLi50aGlzLFxuICAgICAgICAgIGJpdGdvOiBfLm9taXQodGhpcy5iaXRnbywgWydfdG9rZW4nXSksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc29sZS5lcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQ6Jywgc2FuaXRpemVkUHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAnb25jaGFpbicpIHtcbiAgICAgIHNpZ25pbmdQYXJhbXMucHVicyA9IGtleWNoYWlucy5tYXAoKGspID0+IHtcbiAgICAgICAgYXNzZXJ0KGsucHViKTtcbiAgICAgICAgcmV0dXJuIGsucHViO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25pbmdQYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgYXNzZXJ0KHRoaXMudHNzVXRpbHMsICd0c3NVdGlscyBtdXN0IGJlIGRlZmluZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgICBjb25zdCB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLmdldFR4UmVxdWVzdChzaWduaW5nUGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICBpZiAodGhpcy50c3NVdGlscy5pc1BlbmRpbmdBcHByb3ZhbFR4UmVxdWVzdEZ1bGwodHhSZXF1ZXN0KSkge1xuICAgICAgICByZXR1cm4gdHhSZXF1ZXN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdpbnN1ZmZpY2llbnQgZnVuZHMnKSkge1xuICAgICAgICBlcnJvci5jb2RlID0gJ2luc3VmZmljaWVudF9mdW5kcyc7XG4gICAgICAgIGVycm9yLndhbGxldEJhbGFuY2VzID0ge1xuICAgICAgICAgIGJhbGFuY2VTdHJpbmc6IHRoaXMuYmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2VTdHJpbmc6IHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2VTdHJpbmc6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpLFxuICAgICAgICAgIGJhbGFuY2U6IHRoaXMuYmFsYW5jZSgpLFxuICAgICAgICAgIGNvbmZpcm1lZEJhbGFuY2U6IHRoaXMuY29uZmlybWVkQmFsYW5jZSgpLFxuICAgICAgICAgIHNwZW5kYWJsZUJhbGFuY2U6IHRoaXMuc3BlbmRhYmxlQmFsYW5jZSgpLFxuICAgICAgICB9O1xuICAgICAgICBlcnJvci50eFBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5fLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKSxcbiAgICAgICAgICB3YWxsZXQ6IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBiaXRnbzogXy5vbWl0KHRoaXMuYml0Z28sIFsnX3Rva2VuJ10pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZWxlcmF0ZSBhIHRyYW5zYWN0aW9uJ3MgY29uZmlybWF0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUCkgb3IgUmVwbGFjZS1CeS1GZWUgKFJCRilcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnZhbGlkYXRlQWNjZWxlcmF0aW9uUGFyYW1zKHBhcmFtcyk7XG5cbiAgICBwYXJhbXMucmVjaXBpZW50cyA9IFtdO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oe1xuICAgICAgLi4uKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSksXG4gICAgICAuLi5CdWlsZFBhcmFtcy5lbmNvZGUocGFyYW1zKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBY2NlbGVyYXRpb25QYXJhbXMocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zKSB7XG4gICAgaWYgKCFwYXJhbXMuY3BmcFR4SWRzICYmICFwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ211c3QgcGFzcyBjcGZwVHhJZHMgb3IgcmJmVHhJZHMnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX29yX3JiZnR4aWRzX3JlcXVpcmVkJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzICYmIHBhcmFtcy5yYmZUeElkcykge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBjcGZwVHhJZHMgYW5kIHJiZlR4SWRzJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2Nhbm5vdF9zcGVjaWZ5X2JvdGhfY3BmcF9hbmRfcmJmX3R4aWRzJztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuY3BmcFR4SWRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmJmVHhJZHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVSYmZQYXJhbXMocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5yZWNpcGllbnRzKSB8fCBwYXJhbXMucmVjaXBpZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZhbHVlIGZvciAncmVjaXBpZW50cyc6IG11c3QgYmUgZW1wdHkgYXJyYXkgd2hlbiBzZXRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUmJmUGFyYW1zKHBhcmFtczogQWNjZWxlcmF0ZVRyYW5zYWN0aW9uT3B0aW9ucykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmJmVHhJZHMpIHx8IHBhcmFtcy5yYmZUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyByYmZUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyYmZ0eGlkc19ub3RfYXJyYXknO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuZmVlTXVsdGlwbGllcikge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZmVlTXVsdGlwbGllciBtdXN0IGJlIHNldCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdmZWVtdWx0aXBsaWVyX25vdF9zZXQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5mZWVNdWx0aXBsaWVyIDw9IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2ZlZU11bHRpcGxpZXIgbXVzdCBiZSBhIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2ZlZW11bHRpcGxpZXJfZ3JlYXRlcl90aGFuX29uZSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQ3BmcFBhcmFtcyhwYXJhbXM6IEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMpIHtcbiAgICAvLyBUT0RPKEJHLTkzNDkpOiBjaGFuZ2UgdGhlIGxhc3QgY2hlY2sgdG8gPiAwIGFuZCB0aGUgZXJyb3IgbWVzc2FnZSBvbmNlIHBsYXRmb3JtIGFsbG93cyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgdG9cbiAgICAvLyBiZSBidW1wZWQgaW4gdGhlIHNhbWUgQ1BGUCB0cmFuc2FjdGlvblxuICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuY3BmcFR4SWRzKSB8fCBwYXJhbXMuY3BmcFR4SWRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignZXhwZWN0aW5nIGNwZnBUeElkcyB0byBiZSBhbiBhcnJheSBvZiBsZW5ndGggMScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdjcGZwdHhpZHNfbm90X2FycmF5JztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5jcGZwRmVlUmF0ZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9DcGZwRmVlUmF0ZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9DcGZwRmVlUmF0ZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfc2V0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmNwZnBGZWVSYXRlKSB8fCBwYXJhbXMuY3BmcEZlZVJhdGUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2NwZnBGZWVSYXRlIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ2NwZnBmZWVyYXRlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLm1heEZlZSkpIHtcbiAgICAgIGlmIChwYXJhbXMubm9NYXhGZWUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignbWF4RmVlIG11c3QgYmUgc2V0IHVubGVzcyBub01heEZlZSBpcyBzZXQnKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhGZWUpIHx8IHBhcmFtcy5tYXhGZWUgPCAwKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdtYXhmZWVfbm90X25vbm5lZ2F0aXZlX2ludGVnZXInO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0IGEgaGFsZi1zaWduZWQgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHR4SGV4OiB0cmFuc2FjdGlvbiBoZXggdG8gc3VibWl0XG4gICAqIC0gaGFsZlNpZ25lZDogb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gKHR4SGV4IG9yIHR4QmFzZTY0KSB0byBzdWJtaXRcbiAgICogQHBhcmFtIHJlcUlkIC0gcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKi9cbiAgYXN5bmMgc3VibWl0VHJhbnNhY3Rpb24ocGFyYW1zOiBTdWJtaXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSwgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcik6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnb3RwJywgJ3R4SGV4JywgJ3R4UmVxdWVzdElkJ10pO1xuICAgIGNvbnN0IGhhc1R4SGV4ID0gISFwYXJhbXMudHhIZXg7XG4gICAgY29uc3QgaGFzSGFsZlNpZ25lZCA9ICEhcGFyYW1zLmhhbGZTaWduZWQ7XG5cbiAgICBpZiAocGFyYW1zLnR4UmVxdWVzdElkICYmIChoYXNUeEhleCB8fCBoYXNIYWxmU2lnbmVkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiB0eFJlcXVlc3RJZCwgdHhIZXgsIG9yIGhhbGZTaWduZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKChoYXNUeEhleCAmJiBoYXNIYWxmU2lnbmVkKSB8fCAoIWhhc1R4SGV4ICYmICFoYXNIYWxmU2lnbmVkKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGV4IG9yIGhhbGZTaWduZWQsIGJ1dCBub3QgYm90aCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24ocGFyYW1zLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBjb2lucyB0byBhIHJlY2lwaWVudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcy93ZWkvYmFzZSB2YWx1ZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBwYXJhbXMubWVzc2FnZSAtIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYXR0YWNoIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuZGF0YSAtIFtFdGhlcmV1bSBTcGVjaWZpY10gb3B0aW9uYWwgZGF0YSB0byBwYXNzIHRvIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCAtIFtFdGhlcmV1bS9NTUkgU3BlY2lmaWNdIGlkIG9mIHRyYW5zYWN0aW9uIGNyZWF0ZWQgdmlhIG1ldGFtYXNrXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gdGhlIG1pbmltdW0gY29uZmlybWF0aW9uIHRocmVzaG9sZCBmb3IgaW5wdXRzXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gd2hldGhlciB0byBlbmZvcmNlIG1pbkNvbmZpcm1zIGZvciBjaGFuZ2UgaW5wdXRzXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZChwYXJhbXM6IFNlbmRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnLCAnZGF0YSddKTtcblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFtb3VudCcpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG5cbiAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHBhcmFtcy5hbW91bnQpO1xuXG4gICAgY29uc3QgaXNBbW91bnROZWdhdGl2ZSA9IGFtb3VudC5pc05lZ2F0aXZlKCk7XG4gICAgY29uc3QgaXNBbW91bnRaZXJvID0gYW1vdW50LmlzWmVybygpO1xuICAgIGNvbnN0IGlzQW1vdW50RGVjaW1hbCA9ICFhbW91bnQuaXNJbnRlZ2VyKCk7XG5cbiAgICBfLnNvbWUoW2lzQW1vdW50TmVnYXRpdmUsICFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGlzQW1vdW50WmVybywgaXNBbW91bnREZWNpbWFsXSwgKGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGFtb3VudCAtIEludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlY2lwaWVudHM6IFNlbmRNYW55T3B0aW9uc1sncmVjaXBpZW50cyddID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuICAgIGlmIChwYXJhbXMudG9rZW5OYW1lKSB7XG4gICAgICByZWNpcGllbnRzWzBdLnRva2VuTmFtZSA9IHBhcmFtcy50b2tlbk5hbWU7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZGF0YSAmJiBjb2luLnRyYW5zYWN0aW9uRGF0YUFsbG93ZWQoKSkge1xuICAgICAgcmVjaXBpZW50c1swXS5kYXRhID0gcGFyYW1zLmRhdGE7XG4gICAgfVxuICAgIGNvbnN0IHNlbmRNYW55T3B0aW9uczogU2VuZE1hbnlPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zLCB7XG4gICAgICByZWNpcGllbnRzLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHNlbmRNYW55T3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBFUkMtNzIxIE5GVCBvciBFUkMtMTE1NSBORlQocykuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUgY2FsbCBkYXRhIGZvciBhbiBFUkMtNzIxLzExNTUgdG9rZW4gdHJhbnNmZXIsXG4gICAqIGFuZCBjYWxscyB0aGUgdG9rZW4gY29udHJhY3Qgd2l0aCB0aGUgZGF0YSwgYW5kIGFtb3VudCAwLiBUaGlzIHRyYW5zYWN0aW9uIHdpbGwgYWx3YXlzIHByb2R1Y2VcbiAgICogYSBwZW5kaW5nIGFwcHJvdmFsLlxuICAgKlxuICAgKiBAcGFyYW0gc2VuZE9wdGlvbnMgT3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHNlbnQuXG4gICAqIEBwYXJhbSBzZW5kTmZ0T3B0aW9ucyBPcHRpb25zIHRvIHNwZWNpZnkgdGhlIE5GVChzKSB0byBiZSBzZW50LlxuICAgKlxuICAgKiBAcmV0dXJuIEEgcGVuZGluZyBhcHByb3ZhbCBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgc2VuZE5mdChzZW5kT3B0aW9uczogU2VuZE5GVE9wdGlvbnMsIHNlbmROZnRPcHRpb25zOiBORlRUcmFuc2Zlck9wdGlvbnMpOiBQcm9taXNlPFNlbmRORlRSZXN1bHQ+IHtcbiAgICBjb25zdCBuZnRDb2xsZWN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0TmZ0QmFsYW5jZXMoKTtcbiAgICBjb25zdCB7IHRva2VuQ29udHJhY3RBZGRyZXNzLCByZWNpcGllbnRBZGRyZXNzLCB0eXBlIH0gPSBzZW5kTmZ0T3B0aW9ucztcblxuICAgIGNvbnN0IG5mdEJhbGFuY2UgPSBuZnRDb2xsZWN0aW9ucy5maW5kKChjKSA9PiBjLm1ldGFkYXRhLnRva2VuQ29udHJhY3RBZGRyZXNzID09PSB0b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgaWYgKCFuZnRCYWxhbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbGxlY3Rpb24gbm90IGZvdW5kIGZvciB0b2tlbiBjb250cmFjdCAke3Rva2VuQ29udHJhY3RBZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5iYXNlQ29pbi5pc1ZhbGlkQWRkcmVzcyhyZWNpcGllbnRBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzICR7cmVjaXBpZW50QWRkcmVzc31gKTtcbiAgICB9XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB0aGlzLmNvaW5TcGVjaWZpYygpPy5iYXNlQWRkcmVzcyB8fCB0aGlzLmNvaW5TcGVjaWZpYygpPy5yb290QWRkcmVzcztcbiAgICBpZiAoIWJhc2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYmFzZSBhZGRyZXNzIGZvciB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAobmZ0QmFsYW5jZS50eXBlICE9PSB0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBORlQgdHlwZSAke3R5cGV9IGRvZXMgbm90IG1hdGNoIGNvbGxlY3Rpb24gdHlwZSAke25mdEJhbGFuY2UudHlwZX1gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNlbmROZnRPcHRpb25zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ0VSQzcyMSc6IHtcbiAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW3NlbmROZnRPcHRpb25zLnRva2VuSWRdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRva2VuICR7c2VuZE5mdE9wdGlvbnMudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHt0b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5iYXNlQ29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgLi4uc2VuZE5mdE9wdGlvbnMsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGJhc2VBZGRyZXNzLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHJlY2lwaWVudDtcbiAgICAgICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgPT09ICd2ZXQnKSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogcmVjaXBpZW50QWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogJzEnLFxuICAgICAgICAgICAgdG9rZW5EYXRhOiBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gJ2hiYXJldm0nKSB7XG4gICAgICAgICAgcmVjaXBpZW50ID0ge1xuICAgICAgICAgICAgYWRkcmVzczogc2VuZE5mdE9wdGlvbnMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IG5mdEJhbGFuY2UubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlY2lwaWVudCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkoe1xuICAgICAgICAgIC4uLnNlbmRPcHRpb25zLFxuICAgICAgICAgIHJlY2lwaWVudHM6IFtyZWNpcGllbnRdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSQzExNTUnOiB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBzZW5kTmZ0T3B0aW9ucy5lbnRyaWVzO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIW5mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRva2VuICR7ZW50cnkudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHtzZW5kTmZ0T3B0aW9ucy50b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF0gPCBlbnRyeS5hbW91bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFtb3VudCAke2VudHJ5LmFtb3VudH0gZXhjZWVkcyBzcGVuZGFibGUgYmFsYW5jZSBvZiAke25mdEJhbGFuY2UuY29sbGVjdGlvbnNbZW50cnkudG9rZW5JZF19IGZvciB0b2tlbiAke1xuICAgICAgICAgICAgICAgIGVudHJ5LnRva2VuSWRcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYmFzZUNvaW4uYnVpbGROZnRUcmFuc2ZlckRhdGEoe1xuICAgICAgICAgIC4uLnNlbmROZnRPcHRpb25zLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBiYXNlQWRkcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHtcbiAgICAgICAgICAuLi5zZW5kT3B0aW9ucyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IHNlbmROZnRPcHRpb25zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVG9rZW5UeXBlLkRJR0lUQUxfQVNTRVQ6IHtcbiAgICAgICAgaWYgKCFuZnRCYWxhbmNlLmNvbGxlY3Rpb25zW3NlbmROZnRPcHRpb25zLnRva2VuSWRdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRva2VuICR7c2VuZE5mdE9wdGlvbnMudG9rZW5JZH0gbm90IGZvdW5kIGluIGNvbGxlY3Rpb24gJHt0b2tlbkNvbnRyYWN0QWRkcmVzc30gb3IgZG9lcyBub3QgaGF2ZSBhIHNwZW5kYWJsZSBiYWxhbmNlYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW5EYXRhOiBUb2tlblRyYW5zZmVyUmVjaXBpZW50UGFyYW1zID0ge1xuICAgICAgICAgIHRva2VuVHlwZTogc2VuZE5mdE9wdGlvbnMudHlwZSxcbiAgICAgICAgICB0b2tlblF1YW50aXR5OiAnMScsIC8vIFRoaXMgTkZUIHN0YW5kYXJkIHdpbGwgYWx3YXlzIGhhdmUgcXVhbnRpdHkgb2YgMVxuICAgICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgIHRva2VuSWQ6IHNlbmROZnRPcHRpb25zLnRva2VuSWQsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55KHtcbiAgICAgICAgICAuLi5zZW5kT3B0aW9ucyxcbiAgICAgICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudEFkZHJlc3MsXG4gICAgICAgICAgICAgIGFtb3VudDogJzEnLCAvLyB0aGUgYW1vdW50IG5lZWRzIHRvIGJlIG5vbi16ZXJvIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gYmUgdmFsaWQsIGl0IGlzIGlnbm9yZWRcbiAgICAgICAgICAgICAgdG9rZW5EYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBtb25leSB0byBtdWx0aXBsZSByZWNpcGllbnRzXG4gICAqIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCBwcnZcbiAgICogMi4gRGVjcnlwdHMgdXNlciBrZXlcbiAgICogMy4gQ3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWZhdWx0IGZlZVxuICAgKiA0LiBTaWducyB0cmFuc2FjdGlvbiB3aXRoIGRlY3J5cHRlZCB1c2VyIGtleVxuICAgKiA1LiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmFtc1xuICAgKiBAcGFyYW0ge3thZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogc3RyaW5nfX0gcGFyYW1zLnJlY2lwaWVudHMgLSBsaXN0IG9mIHJlY2lwaWVudHMgYW5kIG5lY2Vzc2FyeSByZWNpcGllbnQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5udW1CbG9ja3MgLSBFc3RpbWF0ZXMgdGhlIGFwcHJveGltYXRlIGZlZSBwZXIga2lsb2J5dGUgbmVjZXNzYXJ5IGZvciBhIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvbiB3aXRoaW4gbnVtQmxvY2tzIGJsb2Nrc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSB0aGUgZGVzaXJlZCBmZWVSYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3RoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZXMgbWluQ29uZmlybXMgb24gY2hhbmdlIGlucHV0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIC0gVGhlIGRlc2lyZWQgY291bnQgb2YgdW5zcGVudHMgaW4gdGhlIHdhbGxldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1pblZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIHNtYWxsZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlciB8IFN0cmluZ30gcGFyYW1zLm1heFZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIGxhcmdlciB0aGFuIHRoaXMgYW1vdW50IG9mIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuc2VxdWVuY2VJZCAtIFRoZSBzZXF1ZW5jZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sYXN0TGVkZ2VyU2VxdWVuY2UgLSBBYnNvbHV0ZSBtYXggbGVkZ2VyIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5sZWRnZXJTZXF1ZW5jZURlbHRhIC0gUmVsYXRpdmUgbGVkZ2VyIGhlaWdodCAoaW4gcmVsYXRpb24gdG8gdGhlIGN1cnJlbnQgbGVkZ2VyKSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgaW4sIHdoZXJlYWZ0ZXIgaXQgd2lsbCBiZSByZWplY3RlZC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5nYXNQcmljZSAtIEN1c3RvbSBnYXMgcHJpY2UgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMubm9TcGxpdENoYW5nZSAtIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXJhbXMudW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gdXNlIGluIHRoZSB0cmFuc2FjdGlvbi4gRWFjaCB1bnNwZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBwcmV2VHhJZDpuT3V0cHV0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuY29tbWVudCAtIEFueSBhZGRpdGlvbmFsIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNoYW5nZUFkZHJlc3MgLSBTcGVjaWZpZXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjaGFuZ2Ugb3V0cHV0XG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmluc3RhbnQgLSBTZW5kIHRoaXMgdHJhbnNhY3Rpb24gdXNpbmcgY29pbi1zcGVjaWZpYyBpbnN0YW50IHNlbmRpbmcgbWV0aG9kIChpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSB7e3ZhbHVlOiBTdHJpbmcsIHR5cGU6IFN0cmluZ319IHBhcmFtcy5tZW1vIC0gTWVtbyB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnR5cGUgLSBUeXBlIG9mIHRoZSB0cmFuc2FjdGlvbiAoZS5nLiB0cnVzdGxpbmUpXG4gICAqIEBwYXJhbSB7e3Rva2VuOiBwYXJhbXMsIGFjdGlvbjogU3RyaW5nLCBsaW1pdDogU3RyaW5nfVtdfSBvcHRpb25zLnRydXN0bGluZXMgLSBBcnJheSBvZiB0cnVzdGxpbmVzIHRvIG1hbmFnZSAoc3VwcG9ydGVkIGJ5IFN0ZWxsYXIpXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2VuZE1hbnkocGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnY29tbWVudCcsICdvdHAnXSk7XG4gICAgZGVidWcoJ3NlbmRNYW55IGNhbGxlZCcpO1xuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgcGFyYW1zLnJlcUlkID0gcmVxSWQ7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBjb2luID0gdGhpcy5iYXNlQ29pbjtcbiAgICBpZiAoXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICAgIHBhcmFtcy5yZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgICBjb2luLmNoZWNrUmVjaXBpZW50KHJlY2lwaWVudCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsuLi50aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSwgJ2NvbW1lbnQnLCAnb3RwJywgJ2hvcCddKTtcblxuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIGNvbnN0IGV4dHJhUGFyYW1zID0gYXdhaXQgdGhpcy5iYXNlQ29pbi5nZXRFeHRyYVByZWJ1aWxkUGFyYW1zKE9iamVjdC5hc3NpZ24ocGFyYW1zLCB7IHdhbGxldDogdGhpcyB9KSk7XG4gICAgICBPYmplY3QuYXNzaWduKHNlbGVjdFBhcmFtcywgZXh0cmFQYXJhbXMpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbihzZWxlY3RQYXJhbXMsIHJlcUlkKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGFuIHVuc3VwcG9ydGVkIHRva2VuIGZyb20gYSBCaXRHbyBtdWx0aXNpZyB3YWxsZXRcbiAgICogcGFyYW1zIGFyZSB2YWxpZGF0ZWQgaW4gRXRoLnByb3RvdHlwZS5yZWNvdmVyVG9rZW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB1bnN1cHBvcnRlZCB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY2lwaWVudCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyByZWNvdmVyZWQgdG9rZW5zIHNob3VsZCBiZSBzZW50IHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgdGhlIHhwcnZcbiAgICovXG4gIGFzeW5jIHJlY292ZXJUb2tlbihwYXJhbXM6IFJlY292ZXJUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHJlY292ZXJ5IG9ubHkgc3VwcG9ydGVkIGZvciBldGggd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodG9rZW5Db250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciB0b2tlbkNvbnRyYWN0QWRkcmVzcycpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlY2lwaWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHJlY2lwaWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJUb2tlbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9LCBwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnJlY292ZXJUb2tlbihyZWNvdmVyVG9rZW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gbWV0YWRhdGEgZm9yIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nIG9yIGF0dGVtcHRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHR4aWQsIHdhbGxldElkLCB0eCwgYW5kIGZlZSAoaWYgc3VwcG9ydGVkIGZvciBjb2luKVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGludGVybmFsLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LCB0aGlzLmJhc2VDb2luLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGZlZSBvbiB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB0eGlkIHRvIHRoZSBnaXZlbiBuZXcgZmVlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eGlkIFRoZSB0cmFuc2FjdGlvbiBJZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2FjdGlvbiB3aG9zZSBmZWUgaXMgdG8gYmUgY2hhbmdlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5mZWVdIE9wdGlvbmFsIC0gVGhlIG5ldyBmZWUgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZWlwMTU1OV0gT3B0aW9uYWwgLSB0aGUgZWlwMTU1OSB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBuZXcgdHJhbnNhY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGZlZSByYXRlXG4gICAqL1xuICBhc3luYyBjaGFuZ2VGZWUocGFyYW1zOiBDaGFuZ2VGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMuZmVlKSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnLCAnZmVlJ10sIFtdKTtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMuZWlwMTU1OSwgWydtYXhGZWVQZXJHYXMnLCAnbWF4UHJpb3JpdHlGZWVQZXJHYXMnXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2NoYW5nZUZlZScpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm8gZnJvbSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVybCBUaGUgVXJsIHRvIHJldHJpZXZlIGluZm8gZnJvbVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFBheW1lbnRJbmZvKHBhcmFtczogeyB1cmw/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcGF5bWVudEluZm8nKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGpzb24gcGF5bWVudCByZXNwb25zZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucGF5bWVudFVybCAtIFRoZSB1cmwgdG8gc2VuZCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IG9mIHRoZSBwYXltZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVtbyB7U3RyaW5nfSAtIEEgbWVtbyBzdXBwbGllZCBieSB0aGUgbWVyY2hhbnQsIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRyYW5zZmVyIGFzIHRoZSBjb21tZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZXhwaXJlcyB7U3RyaW5nfSAtIElTTyBEYXRlIGZvcm1hdCBvZiB3aGVuIHRoZSBwYXltZW50IHJlcXVlc3QgZXhwaXJlc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXIgUGF5bWVudCBBY2tcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNlbmRQYXltZW50UmVzcG9uc2UocGFyYW1zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NlbmRQYXltZW50JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvbGljeVJ1bGUocGFyYW1zOiBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZXRQb2xpY3lSdWxlKHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgUG9saWN5IFJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBvbGljeVJ1bGUocGFyYW1zOiBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjcm9zc0NoYWluIFVUWE9zXG4gICAqIEN1cnJlbnRseSBvbmx5IGZvciBBVkFYXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlQ2hhaW4gdGhlIHNvdXJjZWNoYWluIHRvIHBpY2sgVVRYT3MsIGlmIG5vdCBnaXZlbiwgdGhlbiBwaWNrIGZyb20gYWxsIGF2YWlsYWJsZSBjaGFpbnMgW1AsIENdXG4gICAqL1xuICBmZXRjaENyb3NzQ2hhaW5VVFhPcyhwYXJhbXM6IEZldGNoQ3Jvc3NDaGFpblVUWE9zT3B0aW9ucyk6IFByb21pc2U8Q3Jvc3NDaGFpblVUWE9bXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5waWNrKHBhcmFtcywgWydzb3VyY2VDaGFpbiddKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9jcm9zc0NoYWluVW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYSBKU09OIHJlcHJlc2VudGFibGUgdmVyc2lvbiBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9KU09OKCk6IFdhbGxldERhdGEge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdHJhZGluZyBhY2NvdW50IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvVHJhZGluZ0FjY291bnQoKTogVHJhZGluZ0FjY291bnQge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnb2ZjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSBjb252ZXJ0IGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCB0byBhIHRyYWRpbmcgYWNjb3VudCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRyYWRpbmdBY2NvdW50KHRoaXMuX3dhbGxldC5lbnRlcnByaXNlLCB0aGlzLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFkZHJlc3MgYm9vayBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvQWRkcmVzc0Jvb2soKTogSUFkZHJlc3NCb29rIHtcbiAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSAhPT0gJ29mYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgdXNlIGFuIE9mZmNoYWluIChPRkMpIHdhbGxldCBmb3IgdGhlIGFkZHJlc3MgYm9vaycpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFkZHJlc3NCb29rKHRoaXMuX3dhbGxldC5lbnRlcnByaXNlLCB0aGlzLmJpdGdvLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFraW5nIHdhbGxldCBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b1N0YWtpbmdXYWxsZXQoKTogU3Rha2luZ1dhbGxldCB7XG4gICAgY29uc3QgaXNFdGhUc3MgPVxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PSAnZXRoJyAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljPy53YWxsZXRWZXJzaW9uXG4gICAgICAgID8gdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYy53YWxsZXRWZXJzaW9uID49IDNcbiAgICAgICAgOiBmYWxzZTtcbiAgICByZXR1cm4gbmV3IFN0YWtpbmdXYWxsZXQodGhpcywgaXNFdGhUc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGdvIHN0YWtpbmcgd2FsbGV0IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvR29TdGFraW5nV2FsbGV0KCk6IEdvU3Rha2luZ1dhbGxldCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IGNvbnZlcnQgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IHRvIGEgc3Rha2luZyB3YWxsZXQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBHb1N0YWtpbmdXYWxsZXQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZG93bmxvYWRzIFBERiBrZXljYXJkIGZvciB3YWxsZXQgKHJlcXVpcmVzIHJlc3BvbnNlIGZyb20gd2FsbGV0cy5nZW5lcmF0ZVdhbGxldClcbiAgICpcbiAgICogTm90ZTogdGhpcyBpcyBleGFtcGxlIGNvZGUgYW5kIGlzIG5vdCB0aGUgdmVyc2lvbiB1c2VkIG9uIGJpdGdvLmNvbVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgKiBqc1BERiAtIGFuIGluc3RhbmNlIG9mIHRoZSBqc1BERiBsaWJyYXJ5XG4gICAqICAgKiBRUkNvZGUgLSBhbiBpbnN0YW5jZSBvZiB0aGUgUVJpb3VzIGxpYnJhcnlcbiAgICogICAqIHVzZXJLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSB1c2VyIGtleWNoYWluXG4gICAqICAgKiBiYWNrdXBLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiYWNrdXAga2V5Y2hhaW5cbiAgICogICAqIGJpdGdvS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYml0Z28ga2V5Y2hhaW5cbiAgICogICAqIHBhc3NwaHJhc2UgLSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogICAqIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgLSB0aGUgZW5jcnlwdGlvbiBzZWNyZXQgdXNlZCBmb3IgQm94IERcbiAgICogICAqIGFjdGl2YXRpb25Db2RlIC0gYSByYW5kb21seSBnZW5lcmF0ZWQgc2l4LWRpZ2l0IGFjdGl2YXRpb24gY29kZVxuICAgKiAgICogd2FsbGV0S2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBzaWduaW5nIGtleVxuICAgKiAgICogYmFja3VwS2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBiYWNrdXAga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZG93bmxvYWRLZXljYXJkKHBhcmFtczogRG93bmxvYWRLZXljYXJkT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cgfHwgIXdpbmRvdy5sb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZG93bmxvYWRLZXljYXJkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGFibGUgd2l0aGluIGEgYnJvd3Nlci4nKTtcbiAgICB9XG5cbiAgICAvLyBHcmFiIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IGZvciBhY3RpdmF0aW9uQ29kZVxuICAgIGNvbnN0IHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgICAgYWN0aXZhdGlvbkNvZGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5MDAwMDAgKyAxMDAwMDApLnRvU3RyaW5nKCksXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghanNQREYgfHwgdHlwZW9mIGpzUERGICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwYXNzIGluIGEgdmFsaWQganNQREYgaW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBrZXljaGFpbnNcbiAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXYWxsZXQga2V5Y2hhaW4gbXVzdCBoYXZlIGEgJ3VzZXInIHByb3BlcnR5YCk7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrdXBLZXljaGFpbiB8fCB0eXBlb2YgYmFja3VwS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhY2t1cCBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4gfHwgdHlwZW9mIGJpdGdvS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdGdvIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICh3YWxsZXRLZXlJRCAmJiB0eXBlb2Ygd2FsbGV0S2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYmFja3VwS2V5SUQgJiYgdHlwZW9mIGJhY2t1cEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWNrdXBLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYWN0aXZhdGlvbiBjb2RlIGlmIHByb3ZpZGVkXG4gICAgaWYgKHR5cGVvZiBhY3RpdmF0aW9uQ29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBDb2RlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZhdGlvbkNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gY29kZSBtdXN0IGJlIHNpeCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pblNob3J0TmFtZSA9IHRoaXMuYmFzZUNvaW4udHlwZTtcbiAgICBjb25zdCBjb2luTmFtZSA9IHRoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKTtcbiAgICBjb25zdCB3YWxsZXRMYWJlbCA9IHRoaXMuX3dhbGxldC5sYWJlbDtcblxuICAgIGNvbnN0IGRvYyA9IGRyYXdLZXljYXJkKHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgZW5jcnlwdDogdGhpcy5iaXRnby5lbmNyeXB0LFxuICAgICAgY29pblNob3J0TmFtZSxcbiAgICAgIGNvaW5OYW1lLFxuICAgICAgYWN0aXZhdGlvbkNvZGUsXG4gICAgICB3YWxsZXRMYWJlbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICB9KTtcblxuICAgIC8vIFNhdmUgdGhlIFBERiBvbiB0aGUgdXNlcidzIGJyb3dzZXJcbiAgICBkb2Muc2F2ZShgQml0R28gS2V5Y2FyZCBmb3IgJHt3YWxsZXRMYWJlbH0ucGRmYCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIGJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zKFxuICAgIHBhcmFtczogQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbjogJU8nLCB3aGl0ZWxpc3RlZFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNvdWxkIHJldHVybiAxMDAgYnVpbGQgdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgYnVpbGRSZXNwb25zZSA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKSlcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICBpZiAoYnVpbGRSZXNwb25zZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVjZWl2ZSBhZGRyZXNzZXMgd2l0aCBiYWxhbmNlIGZvdW5kIHRvIGNvbnNvbGlkYXRlLicpO1xuICAgIH1cblxuICAgIC8vIHdlIG5lZWQgdG8gc3RlcCBvdmVyIGVhY2ggcHJlYnVpbGQgbm93IC0gc2hvdWxkIGJlIGluIGFuIGFycmF5IGluIHRoZSBib2R5XG4gICAgY29uc3QgY29uc29saWRhdGlvbnM6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uc29saWRhdGVBY2NvdW50QnVpbGQgb2YgYnVpbGRSZXNwb25zZSkge1xuICAgICAgbGV0IHByZWJ1aWxkOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0ID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjb25zb2xpZGF0ZUFjY291bnRCdWlsZCwge1xuICAgICAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICAgIH0pXG4gICAgICApKSBhcyBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0O1xuXG4gICAgICBkZWxldGUgcHJlYnVpbGQud2FsbGV0O1xuICAgICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuXG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRJZDogdGhpcy5pZCgpIH0pO1xuICAgICAgZGVidWcoJ2ZpbmFsIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgcHJlYnVpbGQpO1xuXG4gICAgICBjb25zb2xpZGF0aW9ucy5wdXNoKHByZWJ1aWxkKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGlkYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnMgZm9yIGEgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICBwcmVidWlsZFR4ICAgLSB0aGlzIGlzIHRoZSBwcmUtYnVpbGQgY29uc29saWRhdGlvbiB0eC4gdGhpcyBpcyBhIG5vcm1hbGx5IGJ1aWx0IHR4IHdpdGhcbiAgICogICAgICAgICAgICAgICAgICAgIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIG9mIGNvbnNvbGlkYXRlSWQuXG4gICAqICAgICB2ZXJpZmljYXRpb24gLSBub3JtYWwga2V5Y2hhaW5zLCBldGMuIGZvciB2ZXJpZmljYXRpb25cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgcGFyYW1zLnR5cGUgPSAnY29uc29saWRhdGUnO1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhdGVUcmFuc2FjdGlvbihwYXJhbXMgYXMgVHhTZW5kQm9keSwgcGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyBvbmUgb2YgYSBzZXQgb2YgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbnNcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHguY29uc29saWRhdGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmluZCBjb25zb2xpZGF0aW9uIGlkIG9uIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LnR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc29saWRhdGlvbiByZXF1ZXN0IG1pc3NpbmcgdHhSZXF1ZXN0SWQuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuXG4gICAgLy8gZGVjb3JhdGUgd2l0aCBvdXIgY29uc29saWRhdGlvbiBpZFxuICAgIHNpZ25lZFByZWJ1aWxkLmNvbnNvbGlkYXRlSWQgPSBwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkO1xuXG4gICAgZGVsZXRlIHNpZ25lZFByZWJ1aWxkLndhbGxldDtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkLCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgc2VuZHMgYSBzZXQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9ucy4gVGhpcyBpcyBpbnRlbmRlZCB0byBmbHVzaCBtYW55IGJhbGFuY2VzIHRvIHRoZSByb290IHdhbGxldCBiYWxhbmNlLlxuICAgKiBAcGFyYW0gcGFyYW1zIC1cbiAgICogICAgIGNvbnNvbGlkYXRlQWRkcmVzc2VzIC0gdGhlc2UgYXJlIHRoZSBvbi1jaGFpbiByZWNlaXZlIGFkZHJlc3NlcyB3ZSB3YW50IHRvIHBpY2sgYSBjb25zb2xpZGF0aW9uIGFtb3VudCBmcm9tXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb25zKHBhcmFtczogQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5hbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKX0gZG9lcyBub3QgYWxsb3cgYWNjb3VudCBjb25zb2xpZGF0aW9ucy5gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGlWZXJzaW9uID1cbiAgICAgIHBhcmFtcy5hcGlWZXJzaW9uID8/XG4gICAgICAodGhpcy50c3NVdGlscyAmJiB0aGlzLnRzc1V0aWxzLnN1cHBvcnRlZFR4UmVxdWVzdFZlcnNpb25zKCkuaW5jbHVkZXMoJ2Z1bGwnKSA/ICdmdWxsJyA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyBEb2luZyBhIHNhbml0eSBjaGVjayBmb3IgcGFzc3dvcmQgaGVyZSB0byBhdm9pZCBkb2luZyBmdXJ0aGVyIHdvcmsgaWYgd2Uga25vdyBpdCdzIHdyb25nXG4gICAgYXdhaXQgdGhpcy5nZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uOiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uLFxuICAgIH0pO1xuXG4gICAgLy8gdGhpcyBnaXZlcyB1cyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgfSk7XG4gICAgaWYgKHVuc2lnbmVkQnVpbGRzICYmIHVuc2lnbmVkQnVpbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEdldCB3YWxsZXQncyBiYXNlIGFkZHJlc3MgdG8gdmFsaWRhdGUgZGVzdGluYXRpb24gYWRkcmVzc2VzXG4gICAgICBjb25zdCBiYXNlQWRkcmVzcyA9IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmJhc2VBZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LnJvb3RBZGRyZXNzO1xuICAgICAgLy8gVmFsaWRhdGUgYWxsIHRyYW5zYWN0aW9uc1xuICAgICAgZm9yIChjb25zdCBidWlsZCBvZiB1bnNpZ25lZEJ1aWxkcykge1xuICAgICAgICBpZiAoYmFzZUFkZHJlc3MpIHtcbiAgICAgICAgICBkZWJ1ZygndmVyaWZ5aW5nIHR4SGV4JywgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICAgICAgICAvL1ZlcmlmeSB0cmFuc2FjdGlvbnMgc2VuZCBmdW5kcyB0byB0aGUgYmFzZSBhZGRyZXNzXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShhd2FpdCB0aGlzLmJhc2VDb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgICAgdHhQcmVidWlsZDogYnVpbGQsXG4gICAgICAgICAgICAgIHR4UGFyYW1zOiBwYXJhbXMsXG4gICAgICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgICAgIGNvbnNvbGlkYXRpb25Ub0Jhc2VBZGRyZXNzOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICAgICAgICAgIHdhbGxldFR5cGU6IHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgb3V0cHV0IHRoYXQgZG9lcyBub3QgY29uc29saWRhdGUgZnVuZHMgdG8gYmFzZSBhZGRyZXNzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgZmFpbGVkVHhzOiB7IG1lc3NhZ2U6IHN0cmluZzsgbmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICAgIC8vIGZvbGQgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIHdlIHVzZWQgdG8gYnVpbGQgdGhpcyB0cmFuc2FjdGlvbiBpbnRvIHRoZSB1bnNpZ25lZEJ1aWxkXG4gICAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKTtcbiAgICAgICAgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zLmFwaVZlcnNpb24gPSBhcGlWZXJzaW9uO1xuICAgICAgICB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMucHJlYnVpbGRUeCA9IHVuc2lnbmVkQnVpbGQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kQWNjb3VudENvbnNvbGlkYXRpb24odW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWxlZFR4cy5wdXNoKHsgbWVzc2FnZTogZS5tZXNzYWdlLCBuYW1lOiBlLm5hbWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgICAgZmFpbHVyZTogZmFpbGVkVHhzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIGJ1aWxkIGxvZ2ljIGZvciByZXNvdXJjZSBkZWxlZ2F0aW9uIGFuZCB1bmRlbGVnYXRpb24uXG4gICAqIFBPU1RzIHRvIHRoZSBnaXZlbiBlbmRwb2ludCBhbmQgcG9zdC1wcm9jZXNzZXMgZWFjaCBwcmVidWlsZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbnMoXG4gICAgdHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnIHwgJ3VuZGVsZWdhdGVSZXNvdXJjZScsXG4gICAgcGFyYW1zOiBCdWlsZFJlc291cmNlRGVsZWdhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyB8IEJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25UcmFuc2FjdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxCdWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzUmVzb3VyY2VEZWxlZ2F0aW9uKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi5gKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ2RlbGVnYXRlUmVzb3VyY2UnKSB7XG4gICAgICBjb25zdCBkZWxlZ2F0aW9uUGFyYW1zID0gcGFyYW1zIGFzIEJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9uVHJhbnNhY3Rpb25PcHRpb25zO1xuICAgICAgaWYgKCFkZWxlZ2F0aW9uUGFyYW1zLmRlbGVnYXRpb25zIHx8IGRlbGVnYXRpb25QYXJhbXMuZGVsZWdhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGVsZWdhdGlvbnMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheS4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdW5kZWxlZ2F0aW9uUGFyYW1zID0gcGFyYW1zIGFzIEJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25UcmFuc2FjdGlvbk9wdGlvbnM7XG4gICAgICBpZiAoIXVuZGVsZWdhdGlvblBhcmFtcy51bmRlbGVnYXRpb25zIHx8IHVuZGVsZWdhdGlvblBhcmFtcy51bmRlbGVnYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZGVsZWdhdGlvbnMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheS4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IHR5cGUgPT09ICdkZWxlZ2F0ZVJlc291cmNlJyA/ICcvZGVsZWdhdGVSZXNvdXJjZXMvYnVpbGQnIDogJy91bmRlbGVnYXRlUmVzb3VyY2VzL2J1aWxkJztcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9XG4gICAgICB0eXBlID09PSAnZGVsZWdhdGVSZXNvdXJjZSdcbiAgICAgICAgPyBfLnBpY2socGFyYW1zIGFzIEJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9uVHJhbnNhY3Rpb25PcHRpb25zLCBbJ2RlbGVnYXRpb25zJywgJ2FwaVZlcnNpb24nXSlcbiAgICAgICAgOiBfLnBpY2socGFyYW1zIGFzIEJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMsIFsndW5kZWxlZ2F0aW9ucycsICdhcGlWZXJzaW9uJ10pO1xuICAgIGRlYnVnKCdwcmVidWlsZGluZyByZXNvdXJjZSBtYW5hZ2VtZW50IHRyYW5zYWN0aW9ucyAoJXMpOiAlTycsIGVuZHBvaW50LCB3aGl0ZWxpc3RlZFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZFJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBlbmRwb2ludCkpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgeyB0cmFuc2FjdGlvbnM6IGFueVtdOyBlcnJvcnM6IGFueVtdIH07XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYnVpbGRSZXNwb25zZS50cmFuc2FjdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSAke2VuZHBvaW50fTogbWlzc2luZyB0cmFuc2FjdGlvbnMgYXJyYXlgKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZEZhaWx1cmVzOiB7IG1lc3NhZ2U6IHN0cmluZzsgcmVjZWl2ZXJBZGRyZXNzPzogc3RyaW5nIH1bXSA9IFtdO1xuICAgIGlmIChidWlsZFJlc3BvbnNlLmVycm9ycz8ubGVuZ3RoID4gMCkge1xuICAgICAgZGVidWcoJ2J1aWxkIGVycm9ycyBmcm9tICVzOiAlTycsIGVuZHBvaW50LCBidWlsZFJlc3BvbnNlLmVycm9ycyk7XG4gICAgICBmb3IgKGNvbnN0IGVyciBvZiBidWlsZFJlc3BvbnNlLmVycm9ycykge1xuICAgICAgICBidWlsZEZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgIG1lc3NhZ2U6IGVyci5lcnJvciA/PyBlcnIubWVzc2FnZSA/PyBTdHJpbmcoZXJyKSxcbiAgICAgICAgICByZWNlaXZlckFkZHJlc3M6IGVyci5yZWNlaXZlckFkZHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByZWJ1aWxkczogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdID0gW107XG4gICAgZm9yIChjb25zdCByYXdUeCBvZiBidWlsZFJlc3BvbnNlLnRyYW5zYWN0aW9ucykge1xuICAgICAgbGV0IHByZWJ1aWxkOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0ID0gKGF3YWl0IHRoaXMuYmFzZUNvaW4ucG9zdFByb2Nlc3NQcmVidWlsZChcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyYXdUeCwgeyB3YWxsZXQ6IHRoaXMsIGJ1aWxkUGFyYW1zOiBwYXJhbXMgfSlcbiAgICAgICkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG5cbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgICBkZWJ1ZygnZmluYWwgcmVzb3VyY2UgbWFuYWdlbWVudCB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG4gICAgICBwcmVidWlsZHMucHVzaChwcmVidWlsZCk7XG4gICAgfVxuICAgIHJldHVybiB7IHByZWJ1aWxkcywgYnVpbGRGYWlsdXJlcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBzaWduaW5nIGxvZ2ljIGZvciBhIHNpbmdsZSByZXNvdXJjZSBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uIChkZWxlZ2F0aW9uIG9yIHVuZGVsZWdhdGlvbikuXG4gICAqIFNpZ25pbmcgZmxvdyBieSB3YWxsZXQgdHlwZSAobWlycm9ycyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb24pOlxuICAgKiAgIC0gVFNTIChob3Qgb3IgY3VzdG9kaWFsKSAgICDihpIgc2VuZE1hbnlUeFJlcXVlc3RzICAocmVxdWlyZXMgdHhSZXF1ZXN0SWQgb24gcHJlYnVpbGRUeClcbiAgICogICAtIEN1c3RvZGlhbCBub24tVFNTICAgICAgICAg4oaSIGluaXRpYXRlVHJhbnNhY3Rpb24gKEJpdEdvIGF1dG8tc2lnbnMgd2l0aCBpdHMga2V5KVxuICAgKiAgIC0gSG90IG5vbi1UU1MgICAgICAgICAgICAgICDihpIgcHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24gKyBzdWJtaXRUcmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24oXG4gICAgdHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnIHwgJ3VuZGVsZWdhdGVSZXNvdXJjZScsXG4gICAgcGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxSZXNvdXJjZU1hbmFnZW1lbnRTZW5kUmVzdWx0PiB7XG4gICAgLy8gQ3VzdG9kaWFsIG5vbi1UU1M6IEJpdEdvIGhvbGRzIHRoZSBrZXksIHNlbmQgZm9yIEJpdEdvIGFwcHJvdmFsIGFuZCBzaWduaW5nLlxuICAgIC8vIFRoZSAvdHgvaW5pdGlhdGUgQVBJIGJ1aWxkcyBhbmQgc2lnbnMgc2VydmVyLXNpZGUuIFByb21vdGUgc3Rha2luZ1BhcmFtcyBhbmRcbiAgICAvLyByZWNpcGllbnRzIGZyb20gdGhlIHByZWJ1aWxkIHRvIHRoZSB0b3AgbGV2ZWwgc28gdGhleSBzdXJ2aXZlIHRoZSBUeFNlbmRCb2R5XG4gICAgLy8gd2hpdGVsaXN0IGFwcGxpZWQgaW5zaWRlIGluaXRpYXRlVHJhbnNhY3Rpb24uXG4gICAgaWYgKHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyAmJiB0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgcGFyYW1zLnR5cGUgPSB0eXBlO1xuICAgICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ29iamVjdCcgJiYgcGFyYW1zLnByZWJ1aWxkVHgpIHtcbiAgICAgICAgaWYgKHBhcmFtcy5wcmVidWlsZFR4LnN0YWtpbmdQYXJhbXMpIHtcbiAgICAgICAgICBwYXJhbXMuc3Rha2luZ1BhcmFtcyA9IHBhcmFtcy5wcmVidWlsZFR4LnN0YWtpbmdQYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5wcmVidWlsZFR4LnJlY2lwaWVudHMpIHtcbiAgICAgICAgICBwYXJhbXMucmVjaXBpZW50cyA9IHBhcmFtcy5wcmVidWlsZFR4LnJlY2lwaWVudHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmluaXRpYXRlVHJhbnNhY3Rpb24ocGFyYW1zIGFzIFR4U2VuZEJvZHksIHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByZWJ1aWxkIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50IHRyYW5zYWN0aW9uLicpO1xuICAgIH1cblxuICAgIC8vIFRTUyBwYXRoIChob3Qgb3IgY3VzdG9kaWFsKTogc2lnbmluZyBzZXJ2aWNlIGhvbGRzIHRoZSBrZXkgc2hhcmVzXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICBpZiAoIXBhcmFtcy5wcmVidWlsZFR4LnR4UmVxdWVzdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzb3VyY2UgbWFuYWdlbWVudCByZXF1ZXN0IG1pc3NpbmcgdHhSZXF1ZXN0SWQgZm9yIFRTUyB3YWxsZXQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBIb3Qgbm9uLVRTUzogdXNlciBob2xkcyB0aGUga2V5LCBzaWduIGxvY2FsbHkgYW5kIHN1Ym1pdFxuICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgYW55O1xuICAgIGRlbGV0ZSBzaWduZWRQcmVidWlsZC53YWxsZXQ7XG4gICAgLy8gUmVsYXkgc3Rha2luZ1BhcmFtcyBmcm9tIHRoZSBwcmVidWlsZCBzbyBzZW5kLnRzIGNhbiBwb3B1bGF0ZSBpdCBvbiB0aGUgdHJhbnNmZXIgZG9jdW1lbnRcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnb2JqZWN0JyAmJiBwYXJhbXMucHJlYnVpbGRUeC5zdGFraW5nUGFyYW1zKSB7XG4gICAgICBzaWduZWRQcmVidWlsZC5zdGFraW5nUGFyYW1zID0gcGFyYW1zLnByZWJ1aWxkVHguc3Rha2luZ1BhcmFtcztcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQsIHBhcmFtcy5yZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIGJ1aWxkIOKGkiBzaWduIOKGkiBzZW5kIGxvb3AgZm9yIHJlc291cmNlIGRlbGVnYXRpb24gYW5kIHVuZGVsZWdhdGlvbi5cbiAgICogVmFsaWRhdGVzIHRoZSB3YWxsZXQgcGFzc3BocmFzZSB1cGZyb250LCB0aGVuIHNlbmRzIGVhY2ggdHJhbnNhY3Rpb24gaW5kaXZpZHVhbGx5LlxuICAgKiBSZXR1cm5zIHsgc3VjY2VzcywgZmFpbHVyZSB9IHNvIHBhcnRpYWwgc3VjY2VzcyBpcyBoYW5kbGVkIGdyYWNlZnVsbHkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbnMoXG4gICAgdHlwZTogJ2RlbGVnYXRlUmVzb3VyY2UnIHwgJ3VuZGVsZWdhdGVSZXNvdXJjZScsXG4gICAgcGFyYW1zOiBCdWlsZFJlc291cmNlRGVsZWdhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyB8IEJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25UcmFuc2FjdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IFJlc291cmNlTWFuYWdlbWVudFNlbmRSZXN1bHRbXTsgZmFpbHVyZTogeyBtZXNzYWdlOiBzdHJpbmc7IHJlY2VpdmVyQWRkcmVzcz86IHN0cmluZyB9W10gfT4ge1xuICAgIGlmICghdGhpcy5iYXNlQ29pbi5zdXBwb3J0c1Jlc291cmNlRGVsZWdhdGlvbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBzdXBwb3J0IHJlc291cmNlIGRlbGVnYXRpb24uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9XG4gICAgICBwYXJhbXMuYXBpVmVyc2lvbiA/P1xuICAgICAgKHRoaXMudHNzVXRpbHMgJiYgdGhpcy50c3NVdGlscy5zdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucygpLmluY2x1ZGVzKCdmdWxsJykgPyAnZnVsbCcgOiB1bmRlZmluZWQpO1xuXG4gICAgLy8gVmFsaWRhdGUgcGFzc3BocmFzZSB1cGZyb250IHRvIGZhaWwgZmFzdCBiZWZvcmUgYnVpbGRpbmcgTiB0cmFuc2FjdGlvbnNcbiAgICBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZDogcGFyYW1zLnJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBjdXN0b21TaWduaW5nRnVuY3Rpb246IHBhcmFtcy5jdXN0b21TaWduaW5nRnVuY3Rpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHByZWJ1aWxkczogdW5zaWduZWRCdWlsZHMsIGJ1aWxkRmFpbHVyZXMgfSA9IGF3YWl0IHRoaXMuYnVpbGRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbnModHlwZSwge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgYXBpVmVyc2lvbixcbiAgICB9KTtcbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBSZXNvdXJjZU1hbmFnZW1lbnRTZW5kUmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBmYWlsZWRUeHM6IHsgbWVzc2FnZTogc3RyaW5nOyByZWNlaXZlckFkZHJlc3M/OiBzdHJpbmcgfVtdID0gWy4uLmJ1aWxkRmFpbHVyZXNdO1xuXG4gICAgY29uc3QgZW50cmllcyA9XG4gICAgICB0eXBlID09PSAnZGVsZWdhdGVSZXNvdXJjZSdcbiAgICAgICAgPyAocGFyYW1zIGFzIEJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9uVHJhbnNhY3Rpb25PcHRpb25zKS5kZWxlZ2F0aW9uc1xuICAgICAgICA6IChwYXJhbXMgYXMgQnVpbGRSZXNvdXJjZVVuZGVsZWdhdGlvblRyYW5zYWN0aW9uT3B0aW9ucykudW5kZWxlZ2F0aW9ucztcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5zaWduZWRCdWlsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGQgPSB1bnNpZ25lZEJ1aWxkc1tpXTtcbiAgICAgIGNvbnN0IHJlY2VpdmVyQWRkcmVzcyA9IGVudHJpZXNbaV0/LnJlY2VpdmVyQWRkcmVzcztcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb24odHlwZSwgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSk7XG4gICAgICAgIGZhaWxlZFR4cy5wdXNoKHsgbWVzc2FnZSwgcmVjZWl2ZXJBZGRyZXNzIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsIGZhaWx1cmU6IGZhaWxlZFR4cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiByZXNvdXJjZSBkZWxlZ2F0aW9uIHRyYW5zYWN0aW9ucyBmb3IgdGhlIGdpdmVuIGRlbGVnYXRpb24gZW50cmllcy5cbiAgICogRWFjaCBlbnRyeSBkZWxlZ2F0ZXMgcmVzb3VyY2VzIChlLmcuIEVORVJHWSwgQkFORFdJRFRIKSBmcm9tIHRoaXMgd2FsbGV0J3Mgcm9vdCBhZGRyZXNzXG4gICAqIHRvIGEgcmVjZWl2ZXIgYWRkcmVzcy4gTW9kZWxsZWQgYWZ0ZXIgYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMuZGVsZWdhdGlvbnMgLSBBcnJheSBvZiB7IHJlY2VpdmVyQWRkcmVzcywgYW1vdW50LCByZXNvdXJjZSB9IGVudHJpZXNcbiAgICogQHJldHVybnMgVW5zaWduZWQgcHJlYnVpbGQgdHJhbnNhY3Rpb24gcmVzdWx0cywgb25lIHBlciBkZWxlZ2F0aW9uIGVudHJ5XG4gICAqL1xuICBhc3luYyBidWlsZFJlc291cmNlRGVsZWdhdGlvbnMoXG4gICAgcGFyYW1zOiBCdWlsZFJlc291cmNlRGVsZWdhdGlvblRyYW5zYWN0aW9uT3B0aW9uc1xuICApOiBQcm9taXNlPEJ1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucygnZGVsZWdhdGVSZXNvdXJjZScsIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYW5kIHNlbmRzIGEgc2luZ2xlIHJlc291cmNlIGRlbGVnYXRpb24gdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMucHJlYnVpbGRUeCAtIEEgc2luZ2xlIHByZWJ1aWxkIHJlc3VsdCBmcm9tIGJ1aWxkUmVzb3VyY2VEZWxlZ2F0aW9uc1xuICAgKi9cbiAgYXN5bmMgc2VuZFJlc291cmNlRGVsZWdhdGlvbihwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSZXNvdXJjZU1hbmFnZW1lbnRTZW5kUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzUmVzb3VyY2VEZWxlZ2F0aW9uKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9uKCdkZWxlZ2F0ZVJlc291cmNlJywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYWxsIHJlc291cmNlIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zIGluIGEgc2luZ2xlIGNhbGwuXG4gICAqIEBwYXJhbSBwYXJhbXMuZGVsZWdhdGlvbnMgLSBBcnJheSBvZiB7IHJlY2VpdmVyQWRkcmVzcywgYW1vdW50LCByZXNvdXJjZSB9IGVudHJpZXNcbiAgICovXG4gIGFzeW5jIHNlbmRSZXNvdXJjZURlbGVnYXRpb25zKFxuICAgIHBhcmFtczogQnVpbGRSZXNvdXJjZURlbGVnYXRpb25UcmFuc2FjdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IFJlc291cmNlTWFuYWdlbWVudFNlbmRSZXN1bHRbXTsgZmFpbHVyZTogeyBtZXNzYWdlOiBzdHJpbmc7IHJlY2VpdmVyQWRkcmVzcz86IHN0cmluZyB9W10gfT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRSZXNvdXJjZU1hbmFnZW1lbnRUcmFuc2FjdGlvbnMoJ2RlbGVnYXRlUmVzb3VyY2UnLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiByZXNvdXJjZSB1bmRlbGVnYXRpb24gdHJhbnNhY3Rpb25zIGZvciB0aGUgZ2l2ZW4gZW50cmllcy5cbiAgICogRWFjaCBlbnRyeSByZWNsYWltcyBkZWxlZ2F0ZWQgcmVzb3VyY2VzIGZyb20gdGhpcyB3YWxsZXQncyByb290IGFkZHJlc3MgYmFjayBmcm9tXG4gICAqIGEgcmVjZWl2ZXIgYWRkcmVzcy4gTW9kZWxsZWQgYWZ0ZXIgYnVpbGRSZXNvdXJjZURlbGVnYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLnVuZGVsZWdhdGlvbnMgLSBBcnJheSBvZiB7IHJlY2VpdmVyQWRkcmVzcywgYW1vdW50LCByZXNvdXJjZSB9IGVudHJpZXNcbiAgICogQHJldHVybnMgVW5zaWduZWQgcHJlYnVpbGQgdHJhbnNhY3Rpb24gcmVzdWx0cywgb25lIHBlciB1bmRlbGVnYXRpb24gZW50cnlcbiAgICovXG4gIGFzeW5jIGJ1aWxkUmVzb3VyY2VVbmRlbGVnYXRpb25zKFxuICAgIHBhcmFtczogQnVpbGRSZXNvdXJjZVVuZGVsZWdhdGlvblRyYW5zYWN0aW9uT3B0aW9uc1xuICApOiBQcm9taXNlPEJ1aWxkUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWlsZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9ucygndW5kZWxlZ2F0ZVJlc291cmNlJywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSBzaW5nbGUgcmVzb3VyY2UgdW5kZWxlZ2F0aW9uIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zLnByZWJ1aWxkVHggLSBBIHNpbmdsZSBwcmVidWlsZCByZXN1bHQgZnJvbSBidWlsZFJlc291cmNlVW5kZWxlZ2F0aW9uc1xuICAgKi9cbiAgYXN5bmMgc2VuZFJlc291cmNlVW5kZWxlZ2F0aW9uKFxuICAgIHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxSZXNvdXJjZU1hbmFnZW1lbnRTZW5kUmVzdWx0PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzUmVzb3VyY2VEZWxlZ2F0aW9uKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHN1cHBvcnQgcmVzb3VyY2UgZGVsZWdhdGlvbi5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VuZFJlc291cmNlTWFuYWdlbWVudFRyYW5zYWN0aW9uKCd1bmRlbGVnYXRlUmVzb3VyY2UnLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhbGwgcmVzb3VyY2UgdW5kZWxlZ2F0aW9uIHRyYW5zYWN0aW9ucyBpbiBhIHNpbmdsZSBjYWxsLlxuICAgKiBAcGFyYW0gcGFyYW1zLnVuZGVsZWdhdGlvbnMgLSBBcnJheSBvZiB7IHJlY2VpdmVyQWRkcmVzcywgYW1vdW50LCByZXNvdXJjZSB9IGVudHJpZXNcbiAgICovXG4gIGFzeW5jIHNlbmRSZXNvdXJjZVVuZGVsZWdhdGlvbnMoXG4gICAgcGFyYW1zOiBCdWlsZFJlc291cmNlVW5kZWxlZ2F0aW9uVHJhbnNhY3Rpb25PcHRpb25zXG4gICk6IFByb21pc2U8eyBzdWNjZXNzOiBSZXNvdXJjZU1hbmFnZW1lbnRTZW5kUmVzdWx0W107IGZhaWx1cmU6IHsgbWVzc2FnZTogc3RyaW5nOyByZWNlaXZlckFkZHJlc3M/OiBzdHJpbmcgfVtdIH0+IHtcbiAgICByZXR1cm4gdGhpcy5zZW5kUmVzb3VyY2VNYW5hZ2VtZW50VHJhbnNhY3Rpb25zKCd1bmRlbGVnYXRlUmVzb3VyY2UnLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVybnMgVW5zaWduZWQgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGJ1aWxkVG9rZW5FbmFibGVtZW50cyhcbiAgICBwYXJhbXM6IEJ1aWxkVG9rZW5FbmFibGVtZW50T3B0aW9ucyA9IHsgZW5hYmxlVG9rZW5zOiBbXSB9XG4gICk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdFtdPiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudHNgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB3YWxsZXQgdHlwZSBpZiBjb2luIHJlcXVpcmVzIGl0XG4gICAgaWYgKHR5cGVvZiB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzLl93YWxsZXQudHlwZSkge1xuICAgICAgdGVDb25maWcudmFsaWRhdGVXYWxsZXQodGhpcy5fd2FsbGV0LnR5cGUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB0b2tlbnMgYXJlIGJlaW5nIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBzcGVjaWZ5IHJlY2lwaWVudHMgZm9yIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgcXVlcnkgaWYgd2UgY2FuJ3QgZW5hYmxlIG11bHRpcGxlIHRva2VucyBpbiBvbmUgdHhcbiAgICBpZiAoIXRlQ29uZmlnLnN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzICYmIHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKGFzeW5jIChlbmFibGVUb2tlbikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRva2VuRW5hYmxlbWVudHMoe1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICBlbmFibGVUb2tlbnM6IFtlbmFibGVUb2tlbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcmllcyk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5mbGF0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIGlmICghYnVpbGRQYXJhbXMudHlwZSkge1xuICAgICAgYnVpbGRQYXJhbXMudHlwZSA9ICdlbmFibGV0b2tlbic7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHdlIGJ1aWxkIHdpdGggaW50ZW50XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gW2F3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXdyaXRlIHRva2VucyBpbnRvIHJlY2lwaWVudHMgZm9yIGJ1aWxkVHJhbnNhY3Rpb25cbiAgICAgIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgPSBwYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgLy8gSWYgdG9rZW4gaGFzIG5vbiBhZGRyZXNzLCB0YWtlIHRoZSBmaXJzdCB3YWxsZXQgYWRkcmVzcyBpcyBzdG9yZWQgaW4gaXRzIGNvaW4tc3BlY2lmaWMgcHJvcGVydHlcbiAgICAgICAgLy8gSW4gYWNjb3VudC1iYXNlZCBjb2luIGltcGxlbWVudGF0aW9ucyB0aGF0IHVzZSB3YWxsZXQgY29udHJhY3RzLCB0aGUgYWRkcmVzcyBpcyBjYWxsZWQgYmFzZUFkZHJlc3MgKGUuZy4gZXRoLWxpa2UsIHh0eilcbiAgICAgICAgLy8gZm9yIG90aGVycyBpdCdzIGNhbGxlZCByb290QWRkcmVzcyAoZS5nLiB4cnAsIHhsbSwgYWxnbywgdHJ4KVxuICAgICAgICBjb25zdCBhZGRyZXNzID1cbiAgICAgICAgICB0b2tlbi5hZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LmJhc2VBZGRyZXNzIHx8IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM/LnJvb3RBZGRyZXNzO1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBkb2VzIG5vdCBoYXZlIGJhc2UgYWRkcmVzcywgbXVzdCBzcGVjaWZ5IHdpdGggdG9rZW4gcGFyYW0nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBkZWxldGUgYnVpbGRQYXJhbXMuZW5hYmxlVG9rZW5zO1xuICAgICAgY29uc3QgcHJlYnVpbGRUeCA9IGF3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyk7XG4gICAgICBwcmVidWlsZFR4LmJ1aWxkUGFyYW1zID0gYnVpbGRQYXJhbXM7XG4gICAgICByZXR1cm4gW3ByZWJ1aWxkVHhdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgd2FsbGV0IGluaXRpYWxpemF0aW9uXG4gICAqIEBwYXJhbSB7UHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnN9IHBhcmFtc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0Pn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBidWlsZFdhbGxldEluaXRpYWxpemF0aW9uKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4ucmVxdWlyZXNXYWxsZXRJbml0aWFsaXphdGlvblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgV2FsbGV0IGluaXRpYWxpemF0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlICE9PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHJhbnNhY3Rpb24gaXMgb25seSBzdXBwb3J0ZWQgZm9yIFRTUyB3YWxsZXRzJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBidWlsZFBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgaWYgKCFidWlsZFBhcmFtcy50eXBlKSB7XG4gICAgICBidWlsZFBhcmFtcy50eXBlID0gJ2NyZWF0ZUFjY291bnQnO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhbmQgc2VuZHMgYSBzaW5nbGUgdW5zaWduZWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgaG90L2NvbGQgd2FsbGV0c1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudChwYXJhbXM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB0ZUNvbmZpZyA9IHRoaXMuYmFzZUNvaW4uZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk7XG4gICAgcGFyYW1zLnZlcmlmaWNhdGlvbiA9IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge307XG4gICAgcGFyYW1zLnZlcmlmaWNhdGlvbi52ZXJpZnlUb2tlbkVuYWJsZW1lbnQgPSBwYXJhbXMudmVyaWZpY2F0aW9uLnZlcmlmeVRva2VuRW5hYmxlbWVudCA/PyB0cnVlO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnNgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB3YWxsZXQgdHlwZSBpZiBjb2luIHJlcXVpcmVzIGl0XG4gICAgaWYgKHRlQ29uZmlnLnZhbGlkYXRlV2FsbGV0ICYmIHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICB0ZUNvbmZpZy52YWxpZGF0ZVdhbGxldCh0aGlzLl93YWxsZXQudHlwZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHg/LmJ1aWxkUGFyYW1zPy50eXBlICE9PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHhSZXF1ZXN0cyhwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHRoaXMuX3dhbGxldC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2hvdCc6XG4gICAgICAgIGNhc2UgJ2NvbGQnOlxuICAgICAgICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkLCBwYXJhbXMucmVxSWQpO1xuICAgICAgICBjYXNlICdjdXN0b2RpYWwnOlxuICAgICAgICBjYXNlICdiYWNraW5nJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWF0ZVRyYW5zYWN0aW9uKHBhcmFtcy5wcmVidWlsZFR4LmJ1aWxkUGFyYW1zLCBwYXJhbXMucmVxSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGNoYWlucyByZXF1aXJlIHRva2VucyB0byBiZSBlbmFibGVkIGJlZm9yZSB0aGV5IGNhbiBiZSByZWNlaXZlZC9zZW50LlxuICAgKiBUaGlzIGlzIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcyB0b2tlbnMuXG4gICAqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVyblxuICAgKiAgICBzdWNjZXNzOiBTdWNjZXNzZnVsIHJlc3BvbnNlcyBmcm9tIHNlbmRUb2tlbkVuYWJsZW1lbnRcbiAgICogICAgZmFpbHVyZTogRXJyb3JzIGZyb20gZmFpbGVkIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBhbnlbXTtcbiAgICBmYWlsdXJlOiBFcnJvcltdO1xuICB9PiB7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyhwYXJhbXMpO1xuXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcmVidWlsZFR4OiB1bnNpZ25lZEJ1aWxkLFxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZFRva2VuRW5hYmxlbWVudCh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2hhaW4gY2FudG9uLCByZXF1aXJlcyB0aGUgd2FsbGV0IHRvIGJlIGluaXRpYWxpemVkIGJ5IHNlbmRpbmcgb3V0IGEgdHJhbnNhY3Rpb25cbiAgICogdG8gYmUgb25ib2FyZGVkIG9udG8gdGhlIHZhbGlkYXRvci5cbiAgICogQnVpbGRzLCBTaWducyBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBjYW50b24gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kV2FsbGV0SW5pdGlhbGl6YXRpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxXYWxsZXRJbml0UmVzdWx0PiB7XG4gICAgY29uc3QgcHJlYnVpbGRUeCA9IGF3YWl0IHRoaXMuYnVpbGRXYWxsZXRJbml0aWFsaXphdGlvbihwYXJhbXMpO1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcHJlYnVpbGRUeCxcbiAgICB9O1xuICAgIGNvbnN0IHN1Y2Nlc3NmdWxUeHM6IFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kTWFueVR4UmVxdWVzdHModW5zaWduZWRCdWlsZFdpdGhPcHRpb25zKTtcbiAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGZhaWxlZFR4cy5wdXNoKGUpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyogTUFSSzogVFNTIEhlbHBlcnMgKi9cblxuICAvKipcbiAgICogUHJlYnVpbGRzIGEgdHJhbnNhY3Rpb24gZm9yIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBwcmVidWlsZCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKFxuICAgIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IGdldFR4UmVxdWVzdEFwaVZlcnNpb24odGhpcywgcGFyYW1zLmFwaVZlcnNpb24pO1xuICAgIC8vIFR3byBvcHRpb25zIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgZmVlcyBzZWVtcyB0byBub3cgYmUgc3VwcG9ydGVkLCBmb3Igbm93IHdlIHdpbGwgc3VwcG9ydCBib3RoIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlXG4gICAgLy8gVE9ETyhCRy01OTY4NSk6IGRlcHJlY2F0ZSBvbmUgb2YgdGhlc2Ugc28gdGhhdCB3ZSBoYXZlIGEgc2luZ2xlIHdheSB0byBwYXNzIGZlZXNcbiAgICBsZXQgZmVlT3B0aW9ucztcbiAgICBpZiAocGFyYW1zLmZlZU9wdGlvbnMpIHtcbiAgICAgIGZlZU9wdGlvbnMgPSBwYXJhbXMuZmVlVG9rZW4gPyB7IC4uLnBhcmFtcy5mZWVPcHRpb25zLCBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0gOiBwYXJhbXMuZmVlT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5nYXNQcmljZSAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5laXAxNTU5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZlZU9wdGlvbnMgPVxuICAgICAgICBwYXJhbXMuZ2FzUHJpY2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBnYXNQcmljZTogcGFyYW1zLmdhc1ByaWNlLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgICAuLi4ocGFyYW1zLmZlZVRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0pLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtYXhGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4RmVlUGVyR2FzKSxcbiAgICAgICAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IE51bWJlcihwYXJhbXMuZWlwMTU1OT8ubWF4UHJpb3JpdHlGZWVQZXJHYXMpLFxuICAgICAgICAgICAgICBnYXNMaW1pdDogcGFyYW1zLmdhc0xpbWl0LFxuICAgICAgICAgICAgICAuLi4ocGFyYW1zLmZlZVRva2VuICE9PSB1bmRlZmluZWQgJiYgeyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH0pLFxuICAgICAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5mZWVUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmZWVPcHRpb25zID0geyBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuIH07XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuZ2FzTGltaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmVlT3B0aW9ucyA9IHsgZ2FzTGltaXQ6IHBhcmFtcy5nYXNMaW1pdCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWVPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgZmVlT3B0aW9ucyxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgICBjdXN0b2RpYW5UcmFuc2FjdGlvbklkOiBwYXJhbXMuY3VzdG9kaWFuVHJhbnNhY3Rpb25JZCxcbiAgICAgICAgICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzOiBwYXJhbXMuc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIGlzVGVzdFRyYW5zYWN0aW9uOiBwYXJhbXMuaXNUZXN0VHJhbnNhY3Rpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJ0b2tlbic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaXNUc3M6IHBhcmFtcy5pc1RzcyxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0cmFuc2ZlclRva2VuJyxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbm9uY2U6IHBhcmFtcy5ub25jZSxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgICAgdW5zcGVudHM6IHBhcmFtcy51bnNwZW50cyxcbiAgICAgICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdjbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY2NlbGVyYXRpb24nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBsb3dGZWVUeGlkOiBwYXJhbXMubG93RmVlVHhpZCxcbiAgICAgICAgICAgIHJlY2VpdmVBZGRyZXNzOiBwYXJhbXMucmVjZWl2ZUFkZHJlc3MsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaWxsTm9uY2UnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdmaWxsTm9uY2UnLFxuICAgICAgICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgcmVjZWl2ZUFkZHJlc3M6IHBhcmFtcy5yZWNlaXZlQWRkcmVzcyxcbiAgICAgICAgICAgIGZlZU9wdGlvbnMsXG4gICAgICAgICAgICBmZWVUb2tlbjogcGFyYW1zLmZlZVRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Rva2VuQXBwcm92YWwnOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICd0b2tlbkFwcHJvdmFsJyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogcGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICAgIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY3JlYXRlQWNjb3VudCc6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ2NyZWF0ZUFjY291bnQnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndHJhbnNmZXJBY2NlcHQnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyQWNjZXB0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJSZWplY3QnOiB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3RyYW5zZmVyUmVqZWN0JyxcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndHJhbnNmZXJPZmZlcldpdGhkcmF3bic6IHtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAndHJhbnNmZXJPZmZlcldpdGhkcmF3bicsXG4gICAgICAgICAgICB0cmFuc2Zlck9mZmVySWQ6IHBhcmFtcy50cmFuc2Zlck9mZmVySWQsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMudHJhbnNmZXJPZmZlcklkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2N1c3RvbVR4JzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnY3VzdG9tVHgnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHNvbEluc3RydWN0aW9uczogcGFyYW1zLnNvbEluc3RydWN0aW9ucyxcbiAgICAgICAgICAgIHNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YTogcGFyYW1zLnNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgICAgICAgICAgIGFwdG9zQ3VzdG9tVHJhbnNhY3Rpb25QYXJhbXM6IHBhcmFtcy5hcHRvc0N1c3RvbVRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JyaWRnZUZ1bmRzJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnYnJpZGdlRnVuZHMnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIGFtb3VudDogcGFyYW1zLmludGVudEFtb3VudCxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgICBmZWVPcHRpb25zLFxuICAgICAgICAgICAgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zPy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cblxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR4UmVxdWVzdC51bnNpZ25lZFR4cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHNpbmdsZSB1bnNpZ25lZCB0eCBmb3IgdHggcmVxdWVzdCB3aXRoIGlkOiAke3R4UmVxdWVzdC50eFJlcXVlc3RJZH1gKTtcbiAgICAgIH1cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudW5zaWduZWRUeHNbMF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCB0aGlzLnByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXMoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdhbGxldElkOiB0aGlzLmlkKCksXG4gICAgICB3YWxsZXQ6IHRoaXMsXG4gICAgICB0eFJlcXVlc3RJZDogdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgdHhIZXg6IHVuc2lnbmVkVHguc2VyaWFsaXplZFR4SGV4LFxuICAgICAgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zLFxuICAgICAgZmVlSW5mbzogdW5zaWduZWRUeC5mZWVJbmZvLFxuICAgICAgLi4uKHR4UmVxdWVzdC5wZW5kaW5nQXBwcm92YWxJZCAmJiB7XG4gICAgICAgIHBlbmRpbmdBcHByb3ZhbElkOiB0eFJlcXVlc3QucGVuZGluZ0FwcHJvdmFsSWQsXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFZERTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVkRFNBKFxuICAgIHBhcmFtczogV2FsbGV0U2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9LFxuICAgIGNvaW46IElCYXNlQ29pblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbUNvbW1pdG1lbnRHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBjb21taXRtZW50IHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFIgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgRyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIC8vIGFkZGluZyB0aGlzIHRvIHJlYnVpbGQgdGhlIHRyYW5zYWN0aW9uIGp1c3QgYmVmb3JlIHNpZ25pbmcgZm9yIEVkRFNBIHRyYW5zYWN0aW9uIHVzaW5nIGV4dGVybmFsIHNpZ25lclxuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLnRzc1V0aWxzLmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyh0eFJlcXVlc3RJZCwgcmVxSWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuc2lnbkVkZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICAgICAgdHhSZXF1ZXN0SWQsXG4gICAgICAgIHBhcmFtcy5jdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICBwYXJhbXMuY3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgICAgICByZXFJZFxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIHJlcXVlc3QgZnJvbSBhIFRTUyAoaG90KSB3YWxsZXQsIG9yIGEgU01DIChjb2xkKSB3YWxsZXQgd2l0aCBhbiBleHRlcm5hbCBzaWduZXIuXG4gICAqIE1lYW50IHRvIGJlIHVzZWQgZm9yIGEgdHJhbnNhY3Rpb24gcmVxdWVzdCB3aGVyZSB0aGUgc2lnbmluZyBwcm9jZXNzIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogICAgdHhSZXF1ZXN0SWQgLSBUaGUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqICAgIHdhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSBmb3IgdGhlIHdhbGxldC5cbiAgICogICAgaXNUeFJlcXVlc3RGdWxsIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IGlzIGZ1bGwuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgU2lnbmVkVHJhbnNhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnbkFuZFNlbmRUeFJlcXVlc3QocGFyYW1zOiBTaWduQW5kU2VuZFR4UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHBhcmFtcy5pc1R4UmVxdWVzdEZ1bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMudHNzVXRpbHM/LmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyhwYXJhbXMudHhSZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJldCA9IGF3YWl0IHRoaXMuZ2V0VXNlcktleUFuZFNpZ25Uc3NUcmFuc2FjdGlvbih7XG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHR4UmVxdWVzdElkOiBwYXJhbXMudHhSZXF1ZXN0SWQsXG4gICAgfSk7XG4gICAgaWYgKCFwYXJhbXMuaXNUeFJlcXVlc3RGdWxsKSB7XG4gICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgaXRzIG5vdCBhIGZ1bGwgdHggcmVxdWVzdCwgdGhlbiBpdCBpcyBhIGxpdGUgdHggcmVxdWVzdFxuICAgICAgY29uc3Qgc3VibWl0VHggPSBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHBhcmFtcy50eFJlcXVlc3RJZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN1Ym1pdFR4O1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc2lnbmF0dXJlIHNoYXJlcyBhcmUgaW4gYSBjbGVhbiBzdGF0ZSBiZWZvcmUgc2lnbmluZyBhIHRyYW5zYWN0aW9uLlxuICAgKiBBdXRvbWF0aWNhbGx5IGRlbGV0ZXMgc2lnbmF0dXJlIHNoYXJlcyBmb3IgRnVsbCBUeFJlcXVlc3RzIGJlZm9yZSBzaWduaW5nIHRvIHByZXZlbnRcbiAgICogaXNzdWVzIHdpdGggc3RhbGUgb3IgcGFydGlhbCBzaWduYXR1cmVzLlxuICAgKiBVc2UgdGhpcyBmb3IgRXhwcmVzcyBBUEkgYW5kIG90aGVyIGludGVncmF0aW9ucyB0aGF0IG5lZWQgYXV0b21hdGljIGNsZWFudXAgb2Ygc2lnbmF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIHNpZ25pbmcgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnN1cmVDbGVhblNpZ1NoYXJlc0FuZFNpZ25UcmFuc2FjdGlvbihcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgVHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdHhSZXF1ZXN0SWQgPSBwYXJhbXMudHhSZXF1ZXN0SWQgfHwgcGFyYW1zLnR4UHJlYnVpbGQ/LnR4UmVxdWVzdElkO1xuXG4gICAgaWYgKHR4UmVxdWVzdElkICYmIHRoaXMudHNzVXRpbHMgJiYgdGhpcy5tdWx0aXNpZ1R5cGUoKSA9PT0gJ3RzcycpIHtcbiAgICAgIGNvbnN0IHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMuZ2V0VHhSZXF1ZXN0KHR4UmVxdWVzdElkKTtcblxuICAgICAgLy8gQWx3YXlzIGNsZWFuIHNpZ25hdHVyZSBzaGFyZXMgZm9yIEZ1bGwgVHhSZXF1ZXN0cyBiZWZvcmUgc2lnbmluZ1xuICAgICAgY29uc3QgaXNGdWxsID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyAmJlxuICAgICAgICAoKHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pLmxlbmd0aCA+IDAgfHwgKHR4UmVxdWVzdC5tZXNzYWdlcyA/PyBbXSkubGVuZ3RoID4gMCk7XG5cbiAgICAgIGlmIChpc0Z1bGwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50c3NVdGlscy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyBFQ0RTQSB3YWxsZXQgdXNpbmcgZXh0ZXJuYWwgc2lnbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3NFeHRlcm5hbFNpZ25lckVDRFNBKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVBhaWxsaWVyTW9kdWx1c0dlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIHBhaWxsaWVyIG1vZHVsdXMgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgSyBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNdURlbHRhIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIFMgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydCh0aGlzLnRzc1V0aWxzLCAndHNzVXRpbHMgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzLnNpZ25FY2RzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdElkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdFR5cGUudHgsXG4gICAgICAgIHBhcmFtcy5jdXN0b21QYWlsbGllck1vZHVsdXNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgICAgIHBhcmFtcy5jdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgICAgICk7XG4gICAgICByZXR1cm4gc2lnbmVkVHhSZXF1ZXN0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1MgRUNEU0Egd2FsbGV0IHVzaW5nIGV4dGVybmFsIHNpZ25lci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnblRyYW5zYWN0aW9uVHNzRXh0ZXJuYWxTaWduZXJFQ0RTQU1QQ3YyKFxuICAgIGNvaW46IElCYXNlQ29pbixcbiAgICBwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGxldCB0eFJlcXVlc3RJZCA9ICcnO1xuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UmVxdWVzdElkO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnR4UHJlYnVpbGQgJiYgcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHR4UmVxdWVzdElkID0gcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHhSZXF1ZXN0SWQgcmVxdWlyZWQgdG8gc2lnbiBUU1MgdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpb25GdW5jdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgZnVuY3Rpb24gZm9yIE1QQ3YyIFJvdW5kIDEgc2hhcmUgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBFeHRlcm5hbCBTaWduZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuY3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBmdW5jdGlvbiBmb3IgTVBDdjIgUm91bmQgMiBzaGFyZSByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIEV4dGVybmFsIFNpZ25lci4nKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5jdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW9uRnVuY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGZ1bmN0aW9uIGZvciBNUEN2MiBSb3VuZCAzIHNoYXJlIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggRXh0ZXJuYWwgU2lnbmVyLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQodGhpcy50c3NVdGlscywgJ3Rzc1V0aWxzIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscy5zaWduRWNkc2FNUEN2MlRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgICAgIHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHR4UmVxdWVzdElkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKSxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRpb25GdW5jdGlvbixcbiAgICAgICAgcGFyYW1zLmN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpb25GdW5jdGlvblxuICAgICAgKTtcbiAgICAgIHJldHVybiBzaWduZWRUeFJlcXVlc3Q7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzcyhwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdCh7XG4gICAgICAgIHR4UmVxdWVzdDogcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsXG4gICAgICAgIHR4UGFyYW1zOiBwYXJhbXMudHhQcmVidWlsZC5idWlsZFBhcmFtcyxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiB0cmFuc2FjdGlvbiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgbWVzc2FnZSBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzaWduaW5nIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2lnbk1lc3NhZ2VUc3MocGFyYW1zOiBXYWxsZXRTaWduTWVzc2FnZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiBtZXNzYWdlIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCB0eFJlcXVlc3Q7XG4gICAgICBhc3NlcnQocGFyYW1zLm1lc3NhZ2UsICdtZXNzYWdlIHJlcXVpcmVkIGZvciBtZXNzYWdlIHNpZ25pbmcnKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VSYXcgPSBwYXJhbXMubWVzc2FnZS5tZXNzYWdlUmF3O1xuXG4gICAgICBpZiAoIXBhcmFtcy5tZXNzYWdlLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbjogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25NZXNzYWdlJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlUmF3LFxuICAgICAgICAgIG1lc3NhZ2VTdGFuZGFyZFR5cGU6IHBhcmFtcy5tZXNzYWdlLm1lc3NhZ2VTdGFuZGFyZFR5cGUsXG4gICAgICAgICAgc2lnbmVyQWRkcmVzczogcGFyYW1zLm1lc3NhZ2Uuc2lnbmVyQWRkcmVzcyxcbiAgICAgICAgfTtcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuYnVpbGRTaWduTWVzc2FnZVJlcXVlc3QoaW50ZW50T3B0aW9uKTtcbiAgICAgICAgcGFyYW1zLm1lc3NhZ2UudHhSZXF1ZXN0SWQgPSB0eFJlcXVlc3QudHhSZXF1ZXN0SWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBwYXJhbXMubWVzc2FnZS50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0KFxuICAgICAgICB0eFJlcXVlc3QubWVzc2FnZXMgJiYgdHhSZXF1ZXN0Lm1lc3NhZ2VzLmxlbmd0aCA+IDAsXG4gICAgICAgICdVbmFibGUgdG8gZmluZCBtZXNzYWdlcyBpbiB0eFJlcXVlc3QgZm9yIG1lc3NhZ2Ugc2lnbmluZydcbiAgICAgICk7XG4gICAgICBjb25zdCBtZXNzYWdlRW5jb2RlZCA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5tZXNzYWdlRW5jb2RlZDtcblxuICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkLFxuICAgICAgICBidWZmZXJUb1NpZ246IEJ1ZmZlci5mcm9tKG1lc3NhZ2VFbmNvZGVkLCAnaGV4JyksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcywgJ1VuYWJsZSB0byBmaW5kIG1lc3NhZ2VzIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Jyk7XG4gICAgICBpZiAodGhpcy5iYXNlQ29pbi5nZXRGYW1pbHkoKSA9PT0gQ29pbkZhbWlseS5FVEgpIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgY29tYmluZVNpZ1NoYXJlIGluIHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCwgJ1VuYWJsZSB0byBmaW5kIHR4SGFzaCBpbiBzaWduZWRNZXNzYWdlUmVxdWVzdC5tZXNzYWdlcycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29pbjogdGhpcy5jb2luKCksXG4gICAgICAgIHR4SGFzaDogc2lnbmVkTWVzc2FnZVJlcXVlc3QubWVzc2FnZXNbMF0udHhIYXNoLFxuICAgICAgICBzaWduYXR1cmU6IHNpZ25lZE1lc3NhZ2VSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdyxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQsXG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRNZXNzYWdlUmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2lnbiBtZXNzYWdlICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0eXBlZCBkYXRhIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UeXBlZERhdGFUc3MocGFyYW1zOiBXYWxsZXRTaWduVHlwZWREYXRhT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkTWVzc2FnZT4ge1xuICAgIGlmICghcGFyYW1zLnJlcUlkKSB7XG4gICAgICBwYXJhbXMucmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJ2IHJlcXVpcmVkIHRvIHNpZ24gdHlwZWQgZGF0YSB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgdHhSZXF1ZXN0O1xuICAgICAgYXNzZXJ0KHBhcmFtcy50eXBlZERhdGEsICd0eXBlZERhdGEgcmVxdWlyZWQgZm9yIHR5cGVkIGRhdGEgc2lnbmluZycpO1xuICAgICAgaWYgKCFwYXJhbXMudHlwZWREYXRhLnR4UmVxdWVzdElkKSB7XG4gICAgICAgIGNvbnN0IGludGVudE9wdGlvbnM6IEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEgPSB7XG4gICAgICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICAgICAgaW50ZW50VHlwZTogJ3NpZ25UeXBlZFN0cnVjdHVyZWREYXRhJyxcbiAgICAgICAgICBpc1RzczogdHJ1ZSxcbiAgICAgICAgICB0eXBlZERhdGFSYXc6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3LFxuICAgICAgICAgIHR5cGVkRGF0YUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB9O1xuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5jcmVhdGVUeFJlcXVlc3RXaXRoSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyhpbnRlbnRPcHRpb25zKTtcbiAgICAgICAgcGFyYW1zLnR5cGVkRGF0YS50eFJlcXVlc3RJZCA9IHR4UmVxdWVzdC50eFJlcXVlc3RJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLmlkKCksIHBhcmFtcy50eXBlZERhdGEudHhSZXF1ZXN0SWQsIHBhcmFtcy5yZXFJZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZSh7XG4gICAgICAgIHR4UmVxdWVzdCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICAgIG1lc3NhZ2VSYXc6IEpTT04uc3RyaW5naWZ5KHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhUmF3KSxcbiAgICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBidWZmZXJUb1NpZ246IHBhcmFtcy50eXBlZERhdGEudHlwZWREYXRhRW5jb2RlZCEsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydChzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gc2lnbmVkVHlwZWREYXRhUmVxdWVzdCcpO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmNvbWJpbmVTaWdTaGFyZSxcbiAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGNvbWJpbmVTaWdTaGFyZSBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydChzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCwgJ1VuYWJsZSB0byBmaW5kIHR4SGFzaCBpbiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2luOiB0aGlzLmNvaW4oKSxcbiAgICAgICAgdHhIYXNoOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduZWRUeXBlZERhdGFSZXF1ZXN0Lm1lc3NhZ2VzWzBdLnR4SGFzaCxcbiAgICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLnR5cGVkRGF0YS50eXBlZERhdGFSYXcsXG4gICAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhLnR5cGVkRGF0YUVuY29kZWQhLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6IHNpZ25lZFR5cGVkRGF0YVJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHlwZWQgZGF0YSAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNlbmQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWFueVR4UmVxdWVzdHMocGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcGFyYW1zLmFwaVZlcnNpb24gPSBnZXRUeFJlcXVlc3RBcGlWZXJzaW9uKHRoaXMsIHBhcmFtcy5hcGlWZXJzaW9uKTtcblxuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0O1xuICAgIGlmICghc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgbWlzc2luZyBmcm9tIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnKSB7XG4gICAgICBjb25zdCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy5pZCgpLCBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCwgcGFyYW1zLnJlcUlkKTtcbiAgICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgICAgY29uc3QgdHJhbnNmZXI6IHtcbiAgICAgICAgc3RhdGU6IHN0cmluZztcbiAgICAgICAgcGVuZGluZ0FwcHJvdmFsPzogc3RyaW5nO1xuICAgICAgICB0eGlkPzogc3RyaW5nO1xuICAgICAgfSA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QoXG4gICAgICAgICAgdGhpcy5iaXRnby51cmwoXG4gICAgICAgICAgICAnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eHJlcXVlc3RzLycgKyBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCArICcvdHJhbnNmZXJzJyxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnNlbmQoKVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgICBpZiAobGF0ZXN0VHhSZXF1ZXN0LnN0YXRlID09PSAncGVuZGluZ0FwcHJvdmFsJykge1xuICAgICAgICBjb25zdCBwZW5kaW5nQXBwcm92YWxzID0gbmV3IFBlbmRpbmdBcHByb3ZhbHModGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbik7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdBcHByb3ZhbCA9IGF3YWl0IHBlbmRpbmdBcHByb3ZhbHMuZ2V0KHtcbiAgICAgICAgICBpZDogbGF0ZXN0VHhSZXF1ZXN0LnBlbmRpbmdBcHByb3ZhbElkLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHBlbmRpbmdBcHByb3ZhbC50b0pTT04oKSxcbiAgICAgICAgICB0eFJlcXVlc3Q6IGxhdGVzdFR4UmVxdWVzdCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zZmVyLFxuICAgICAgICB0eFJlcXVlc3Q6IGxhdGVzdFR4UmVxdWVzdCxcbiAgICAgICAgdHhpZDogKGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgPz8gW10pWzBdPy5zaWduZWRUeD8uaWQsXG4gICAgICAgIHR4OiAobGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyA/PyBbXSlbMF0/LnNpZ25lZFR4Py50eCxcbiAgICAgICAgc3RhdHVzOiB0cmFuc2Zlci5zdGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVxSWQgPSBwYXJhbXMucmVxSWQgfHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnRzc1V0aWxzPy5zZW5kVHhSZXF1ZXN0KHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkLCByZXFJZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBmdW5kcyBmcm9tIGEgZmVlIGFkZHJlc3MgdG8gYSBmb3J3YXJkZXIuIE9ubHkgc3VwcG9ydHMgZXRoLWxpa2UgY29pbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmZvcndhcmRlckFkZHJlc3MgLSBBZGRyZXNzIG9mIHRoZSBmb3J3YXJkZXIgdG8gc2VuZCBmdW5kcyB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5hbW91bnQgLSBBbW91bnQgdG8gc2VuZCB0aGUgZm9yd2FyZGVyIChvcHRpb25hbCkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gc2VuZGluZyBhbiBlc3RpbWF0ZSBvZiB0aGUgYW1vdW50IG5lZWRlZCBmb3IgYSBmdW5kIHJlY292ZXJ5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZ1bmRGb3J3YXJkZXIocGFyYW1zOiBGdW5kRm9yd2FyZGVyc09wdGlvbnMpOiBQcm9taXNlPFdhbGxldERhdGE+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yd2FyZGVyQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9mdW5kRm9yd2FyZGVyJyk7XG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQ7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBmdW5kcyBmcm9tIGEgZmVlIGFkZHJlc3MgdG8gYSBmb3J3YXJkZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdFxuICAgKiBAcGFyYW0ge0xpc3R9IHBhcmFtcy5mb3J3YXJkZXJzIC0gbGlzdCBvZiBmdW5kIGZvcndhcmRlciBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZ1bmRGb3J3YXJkZXJzKHBhcmFtczogRnVuZEZvcndhcmRlclBhcmFtcyk6IFByb21pc2U8V2FsbGV0RGF0YT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5mb3J3YXJkZXJzKSB8fCBwYXJhbXMuZm9yd2FyZGVycy5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmdW5kIGZvcndhcmRlciBvcHRpb25zIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvZnVuZGZvcndhcmRlcnMnKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGZvcndhcmRlcidzIGJhbGFuY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgTGlzdCBvZiBmb3J3YXJkZXIgYWRkcmVzcyBhbmQgYmFsYW5jZVxuICAgKiBpZiBwYXJhbXMgaXMgbm90IHNldCB0aGVuIHJldHVybnMgbG93IGJhbGFuY2UgZm9yd2FyZGVyc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEZvcndhcmRlckJhbGFuY2UocGFyYW1zPzogRm9yd2FyZGVyQmFsYW5jZU9wdGlvbnMpOiBQcm9taXNlPEZvcndhcmRlckJhbGFuY2VbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBGb3J3YXJkZXJCYWxhbmNlT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXM/Lm1heGltdW1CYWxhbmNlKSB7XG4gICAgICBxdWVyeS5tYXhpbXVtQmFsYW5jZSA9IHBhcmFtcz8ubWF4aW11bUJhbGFuY2U7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcz8ubWluaW11bUJhbGFuY2UpIHtcbiAgICAgIHF1ZXJ5Lm1pbmltdW1CYWxhbmNlID0gcGFyYW1zPy5taW5pbXVtQmFsYW5jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2ZvcndhcmRlcnMvYmFsYW5jZXNgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHVybCkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICAgIHJldHVybiByZXNwb25zZSBhcyBGb3J3YXJkZXJCYWxhbmNlW107XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZWNkc2EgdHNzIGNoYWxsZW5nZXMgZm9yIGEgd2FsbGV0LlxuICAgKiBUaGVzZSBhcmUgc3RhdGljIGNoYWxsZW5nZXMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgYnkgYW4gZW50ZXJwcmlzZSBhZG1pbi5cbiAgICogQ2FsbGVycyBzaG91bGQgdmVyaWZ5IHRoYXQgYW4gZW50ZXJwcmlzZSBhZG1pbiBzaWduZWQgdGhlIGNoYWxsZW5nZSB2YWx1ZXMgYmVmb3JlIHVzaW5nIHRoZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFdhbGxldEVjZHNhQ2hhbGxlbmdlcz59XG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VzRm9yRWNkc2FTaWduaW5nKCk6IFByb21pc2U8V2FsbGV0RWNkc2FDaGFsbGVuZ2VzPiB7XG4gICAgLy8gbm90ZTogdGhpcyBpcyBub3QgYSBjb2luIHNwZWNpZmljIHJvdXRlLCB3ZSBjYW5ub3QgdXNlIHRoaXMudXJsKC4uKVxuICAgIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy5pZCgpfS9jaGFsbGVuZ2VzYCwgMik7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHVybCkucXVlcnkoe30pLnJlc3VsdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kVHJhbnNhY3Rpb24ocGFyYW1zOiBUeFNlbmRCb2R5LCByZXFJZD86IElSZXF1ZXN0VHJhY2VyKSB7XG4gICAgLy8gZXh0cmFjdCB0aGUgd2hpdGVsaXN0ZWQgcGFyYW1zIGZyb20gdGhlIHRvcCBsZXZlbCwgaW4gY2FzZVxuICAgIC8vIG90aGVyIGludmFsaWQgcGFyYW1zIGFyZSBwcmVzZW50IHRoYXQgd291bGQgZmFpbCBlbmNvZGluZ1xuICAgIC8vIGFuZCBmYWxsIGJhY2sgdG8gdGhlIGJvZHkgcGFyYW1zXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB0aGlzLmJhc2VDb2luLnByZXByb2Nlc3NCdWlsZFBhcmFtcyhfLnBpY2socGFyYW1zLCB3aGl0ZWxpc3RlZFNlbmRQYXJhbXMpKTtcbiAgICBjb25zdCByZXFUcmFjZXIgPSByZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXIpO1xuICAgIHJldHVybiBwb3N0V2l0aENvZGVjKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L3NlbmQnKSxcbiAgICAgIHQuaW50ZXJzZWN0aW9uKFtUeFNlbmRCb2R5LCB0LnBhcnRpYWwoeyBsb2NrdGltZTogdC5udW1iZXIgfSldKSxcbiAgICAgIHdoaXRlbGlzdGVkUGFyYW1zXG4gICAgKS5yZXN1bHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhdGVUcmFuc2FjdGlvbihwYXJhbXM6IFR4U2VuZEJvZHksIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpIHtcbiAgICAvLyBleHRyYWN0IHRoZSB3aGl0ZWxpc3RlZCBwYXJhbXMgZnJvbSB0aGUgdG9wIGxldmVsLCBpbiBjYXNlXG4gICAgLy8gb3RoZXIgaW52YWxpZCBwYXJhbXMgYXJlIHByZXNlbnQgdGhhdCB3b3VsZCBmYWlsIGVuY29kaW5nXG4gICAgLy8gYW5kIGZhbGwgYmFjayB0byB0aGUgYm9keSBwYXJhbXNcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHRoaXMuYmFzZUNvaW4ucHJlcHJvY2Vzc0J1aWxkUGFyYW1zKF8ucGljayhwYXJhbXMsIHdoaXRlbGlzdGVkU2VuZFBhcmFtcykpO1xuICAgIGNvbnN0IHJlcVRyYWNlciA9IHJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcVRyYWNlcik7XG4gICAgcmV0dXJuIHBvc3RXaXRoQ29kZWMoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvaW5pdGlhdGUnKSxcbiAgICAgIFR4U2VuZEJvZHksXG4gICAgICB3aGl0ZWxpc3RlZFBhcmFtc1xuICAgICkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdhbGxldCBrZXljaGFpbnMgYW5kIHZhbGlkYXRlIHBhc3NwaHJhc2UgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSB7UHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnN9IHBhcmFtcyAtIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5yZXFJZCAtIHJlcXVlc3QgaWQgZm9yIHRyYWNpbmcgcHVycG9zZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbiAtIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uIGZvciBleHRlcm5hbCBzaWduaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleWNoYWluW10+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRLZXljaGFpbnNBbmRWYWxpZGF0ZVBhc3NwaHJhc2Uoe1xuICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbixcbiAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgIHJlcUlkLFxuICB9OiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyAmIFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEtleWNoYWluW10+IHtcbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZCB9KTtcblxuICAgIC8vIERvaW5nIGEgc2FuaXR5IGNoZWNrIGZvciBwYXNzd29yZCBoZXJlIHRvIGF2b2lkIGRvaW5nIGZ1cnRoZXIgd29yayBpZiB3ZSBrbm93IGl0J3Mgd3JvbmdcbiAgICAvLyB3ZSBpZ25vcmUgdGhpcyBjaGVjayB3aXRoIGlmIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBpcyBwcm92aWRlZFxuICAgIC8vICB3aGljaCBtZWFucyB0aGF0IHRoZSB1c2VyIGlzIGhhbmRsaW5nIHRoZSBzaWduaW5nIGluIGV4dGVybmFsIHNpZ25pbmcgbW9kZVxuICAgIGlmICghY3VzdG9tU2lnbmluZ0Z1bmN0aW9uICYmIGtleWNoYWlucz8uWzBdPy5lbmNyeXB0ZWRQcnYgJiYgd2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgaWYgKCEoYXdhaXQgZGVjcnlwdEtleWNoYWluUHJpdmF0ZUtleUFzeW5jKHRoaXMuYml0Z28sIGtleWNoYWluc1swXSwgd2FsbGV0UGFzc3BocmFzZSkpKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciAmIHsgY29kZT86IHN0cmluZyB9ID0gbmV3IEVycm9yKFxuICAgICAgICAgIGB1bmFibGUgdG8gZGVjcnlwdCBrZXljaGFpbiB3aXRoIHRoZSBnaXZlbiB3YWxsZXQgcGFzc3BocmFzZWBcbiAgICAgICAgKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICd3YWxsZXRfcGFzc3BocmFzZV9pbmNvcnJlY3QnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleWNoYWlucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHByb3ZlIHRva2VuIGZvciB1c2Ugd2l0aCBhIGJhdGNoZXIgY29udHJhY3RcbiAgICogVGhpcyBmdW5jdGlvbiBidWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSB0b2tlbiBhcHByb3ZhbCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0b2tlbiB0byBiZSBhcHByb3ZlZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICAgKi9cbiAgYXN5bmMgYXBwcm92ZUVyYzIwVG9rZW4od2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLCB0b2tlbk5hbWU6IHN0cmluZyk6IFByb21pc2U8U3VibWl0VHJhbnNhY3Rpb25SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuXG4gICAgbGV0IHRva2VuQXBwcm92YWxCdWlsZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoYC93YWxsZXQvJHt0aGlzLmlkKCl9L3Rva2VuL2FwcHJvdmFsL2J1aWxkYCk7XG4gICAgICB0b2tlbkFwcHJvdmFsQnVpbGQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHVybClcbiAgICAgICAgLnNlbmQoe1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmdldEtleWNoYWluc0FuZFZhbGlkYXRlUGFzc3BocmFzZSh7XG4gICAgICByZXFJZCxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgdHhQcmVidWlsZDogdG9rZW5BcHByb3ZhbEJ1aWxkLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICByZXFJZCxcbiAgICB9O1xuXG4gICAgY29uc3QgaGFsZlNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oc2lnbmluZ1BhcmFtcyk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24pO1xuXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKGZpbmFsVHhQYXJhbXMsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0b2tlbiBhcHByb3ZhbCB0cmFuc2FjdGlvbiBmb3IgRVJDMjAgdG9rZW5zXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgcHJvdmlkZWQsIGFsc28gc2lnbnMgYW5kIHNlbmRzIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5OYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRva2VuIHRvIGJlIGFwcHJvdmVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbd2FsbGV0UGFzc3BocmFzZV0gLSBPcHRpb25hbCB3YWxsZXQgcGFzc3BocmFzZSBmb3Igc2lnbmluZyBhbmQgc2VuZGluZ1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSB8IFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2U+fSBUaGUgdG9rZW4gYXBwcm92YWwgYnVpbGQgcmVzcG9uc2Ugb3IgdHJhbnNhY3Rpb24gZGV0YWlscyBpZiBzaWduZWRcbiAgICovXG4gIGFzeW5jIGJ1aWxkRXJjMjBUb2tlbkFwcHJvdmFsKFxuICAgIHRva2VuTmFtZTogc3RyaW5nLFxuICAgIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxCdWlsZFRva2VuQXBwcm92YWxSZXNwb25zZSB8IFN1Ym1pdFRyYW5zYWN0aW9uUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXFJZCA9IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcblxuICAgIGxldCB0b2tlbkFwcHJvdmFsQnVpbGQ6IEJ1aWxkVG9rZW5BcHByb3ZhbFJlc3BvbnNlO1xuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5pZCgpfS90b2tlbi9hcHByb3ZhbC9idWlsZGApO1xuICAgIHRyeSB7XG4gICAgICB0b2tlbkFwcHJvdmFsQnVpbGQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KHVybClcbiAgICAgICAgLnNlbmQoe1xuICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lLFxuICAgICAgICB9KVxuICAgICAgICAucmVzdWx0KCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXJyb3IgYnVpbGRpbmcgZXJjMjAgdG9rZW4gYXBwcm92YWwgdHg6ICR7ZXJyb3J9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF3YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICByZXR1cm4gdG9rZW5BcHByb3ZhbEJ1aWxkO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuZ2V0S2V5Y2hhaW5zQW5kVmFsaWRhdGVQYXNzcGhyYXNlKHtcbiAgICAgIHJlcUlkLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25pbmdQYXJhbXMgPSB7XG4gICAgICB0eFByZWJ1aWxkOiB0b2tlbkFwcHJvdmFsQnVpbGQsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHJlcUlkLFxuICAgIH07XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICBjb25zdCBmaW5hbFR4UGFyYW1zID0gXy5leHRlbmQoe30sIGhhbGZTaWduZWRUcmFuc2FjdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24oZmluYWxUeFBhcmFtcywgcmVxSWQpO1xuICB9XG59XG4iXX0=