@bitgo-beta/sdk-coin-sol 7.6.4-beta.66 → 7.6.4-beta.660

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 (434) hide show
  1. package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
  2. package/dist/cjs/src/bigint-buffer-guard.js +29 -0
  3. package/dist/cjs/src/index.d.ts.map +1 -0
  4. package/dist/{src → cjs/src}/index.js +1 -1
  5. package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
  6. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  7. package/dist/cjs/src/lib/ataInitializationBuilder.js +223 -0
  8. package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
  11. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +93 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +212 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +88 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +267 -0
  17. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  18. package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
  19. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.js +297 -0
  22. package/dist/cjs/src/lib/iface.d.ts +526 -0
  23. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  24. package/dist/cjs/src/lib/iface.js +7 -0
  25. package/dist/{src → cjs/src}/lib/index.d.ts +4 -0
  26. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/index.js +91 -0
  28. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  29. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  30. package/dist/cjs/src/lib/instructionParamsFactory.js +1220 -0
  31. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  33. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  34. package/dist/cjs/src/lib/keyPair.js +63 -0
  35. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  36. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  37. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  38. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  39. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  40. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  42. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  43. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  44. package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
  45. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/stakingActivateBuilder.js +120 -0
  47. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  48. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  49. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  50. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +208 -0
  51. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/stakingDelegateBuilder.js +120 -0
  53. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  54. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  55. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  56. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +78 -0
  57. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  58. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  59. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  60. package/dist/cjs/src/lib/tokenExtensions.d.ts +31 -0
  61. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  62. package/dist/cjs/src/lib/tokenExtensions.js +112 -0
  63. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  64. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  65. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  66. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/transaction.js +615 -0
  68. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +2 -0
  69. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/transactionBuilder.js +380 -0
  71. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +14 -0
  72. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  73. package/dist/cjs/src/lib/transactionBuilderFactory.js +222 -0
  74. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  75. package/dist/cjs/src/lib/transferBuilder.js +70 -0
  76. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  77. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/transferBuilderV2.js +254 -0
  79. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  80. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  81. package/dist/cjs/src/lib/utils.js +657 -0
  82. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  83. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  84. package/dist/cjs/src/register.d.ts +5 -0
  85. package/dist/cjs/src/register.d.ts.map +1 -0
  86. package/dist/cjs/src/register.js +29 -0
  87. package/dist/{src → cjs/src}/sol.d.ts +112 -3
  88. package/dist/cjs/src/sol.d.ts.map +1 -0
  89. package/dist/cjs/src/sol.js +1619 -0
  90. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  91. package/dist/cjs/src/solToken.d.ts.map +1 -0
  92. package/dist/cjs/src/solToken.js +79 -0
  93. package/dist/cjs/src/tsol.d.ts.map +1 -0
  94. package/dist/cjs/src/tsol.js +24 -0
  95. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  96. package/dist/cjs/test/fixtures/sol.js +1433 -0
  97. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  98. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  99. package/dist/cjs/test/resources/sol.js +320 -0
  100. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  101. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  102. package/dist/cjs/test/unit/explainTransactionWasm.js +26 -0
  103. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  104. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  105. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  106. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  107. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  108. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  109. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  110. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  111. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  112. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  113. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  114. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  115. package/dist/cjs/test/unit/keyPair.js +177 -0
  116. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  117. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  118. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  119. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  120. package/dist/cjs/test/unit/register.d.ts +2 -0
  121. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  122. package/dist/cjs/test/unit/register.js +65 -0
  123. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  124. package/dist/cjs/test/unit/sol.js +4816 -0
  125. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  126. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  127. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  128. package/dist/cjs/test/unit/solToken.js +37 -0
  129. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  130. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  131. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  132. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  133. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  134. package/dist/cjs/test/unit/tokenExtensions.js +32 -0
  135. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  136. package/dist/cjs/test/unit/transaction.js +1108 -0
  137. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  139. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  140. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  141. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  142. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  143. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  144. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  145. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  146. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
  147. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  148. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  149. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  150. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  151. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  152. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  153. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  154. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  155. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  156. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  157. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  158. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  159. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  160. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  161. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  162. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  163. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  164. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +286 -0
  165. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  166. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  167. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  168. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  169. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  170. package/dist/cjs/test/unit/utils.js +557 -0
  171. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  172. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  173. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  174. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  175. package/dist/esm/index.d.ts +7 -0
  176. package/dist/esm/index.js +7 -0
  177. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  178. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  179. package/dist/esm/lib/ataInitializationBuilder.js +183 -0
  180. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  181. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  182. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  183. package/dist/esm/lib/confidentialTransferBuilder.d.ts +93 -0
  184. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  185. package/dist/esm/lib/confidentialTransferBuilder.js +205 -0
  186. package/dist/esm/lib/constants.d.ts +226 -0
  187. package/dist/esm/lib/constants.d.ts.map +1 -0
  188. package/dist/esm/lib/constants.js +264 -0
  189. package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
  190. package/dist/esm/lib/customInstructionBuilder.js +282 -0
  191. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  192. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  193. package/dist/esm/lib/explainTransactionWasm.js +291 -0
  194. package/dist/esm/lib/iface.d.ts +526 -0
  195. package/dist/esm/lib/iface.d.ts.map +1 -0
  196. package/dist/esm/lib/iface.js +3 -0
  197. package/dist/esm/lib/index.d.ts +26 -0
  198. package/dist/esm/lib/index.d.ts.map +1 -0
  199. package/dist/esm/lib/index.js +26 -0
  200. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  201. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  202. package/dist/esm/lib/instructionParamsFactory.js +1212 -0
  203. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  204. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  205. package/dist/esm/lib/keyPair.d.ts +26 -0
  206. package/dist/esm/lib/keyPair.js +59 -0
  207. package/dist/esm/lib/messages/index.d.ts +2 -0
  208. package/dist/esm/lib/messages/index.js +2 -0
  209. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  210. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  211. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  212. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  213. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  214. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  215. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  216. package/dist/esm/lib/solInstructionFactory.js +1088 -0
  217. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  218. package/dist/esm/lib/stakingActivateBuilder.js +113 -0
  219. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  220. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  221. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  222. package/dist/{src → esm}/lib/stakingDeactivateBuilder.js +31 -38
  223. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  224. package/dist/esm/lib/stakingDelegateBuilder.js +113 -0
  225. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  226. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  227. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  228. package/dist/esm/lib/stakingWithdrawBuilder.js +71 -0
  229. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  230. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  231. package/dist/esm/lib/token2022Resolve.js +194 -0
  232. package/dist/esm/lib/tokenExtensions.d.ts +31 -0
  233. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  234. package/dist/esm/lib/tokenExtensions.js +105 -0
  235. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  236. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  237. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  238. package/dist/esm/lib/transaction.d.ts +103 -0
  239. package/dist/esm/lib/transaction.d.ts.map +1 -0
  240. package/dist/esm/lib/transaction.js +608 -0
  241. package/dist/esm/lib/transactionBuilder.d.ts +130 -0
  242. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  243. package/dist/esm/lib/transactionBuilder.js +373 -0
  244. package/dist/esm/lib/transactionBuilderFactory.d.ts +129 -0
  245. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  246. package/dist/esm/lib/transactionBuilderFactory.js +218 -0
  247. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  248. package/dist/esm/lib/transferBuilder.js +63 -0
  249. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  250. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  251. package/dist/esm/lib/transferBuilderV2.js +247 -0
  252. package/dist/esm/lib/utils.d.ts +205 -0
  253. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  254. package/dist/esm/lib/utils.js +619 -0
  255. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  256. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  257. package/dist/esm/register.d.ts +5 -0
  258. package/dist/esm/register.d.ts.map +1 -0
  259. package/dist/esm/register.js +24 -0
  260. package/dist/esm/sol.d.ts +349 -0
  261. package/dist/esm/sol.d.ts.map +1 -0
  262. package/dist/esm/sol.js +1578 -0
  263. package/dist/esm/solToken.d.ts +44 -0
  264. package/dist/esm/solToken.d.ts.map +1 -0
  265. package/dist/esm/solToken.js +75 -0
  266. package/dist/esm/tsol.d.ts +11 -0
  267. package/dist/esm/tsol.js +20 -0
  268. package/package.json +36 -16
  269. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  270. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  271. package/dist/src/config/token2022StaticConfig.js +0 -50
  272. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  273. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  274. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  275. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  276. package/dist/src/lib/closeAtaBuilder.js +0 -69
  277. package/dist/src/lib/constants.d.ts.map +0 -1
  278. package/dist/src/lib/constants.js +0 -171
  279. package/dist/src/lib/customInstructionBuilder.js +0 -289
  280. package/dist/src/lib/iface.d.ts +0 -244
  281. package/dist/src/lib/iface.d.ts.map +0 -1
  282. package/dist/src/lib/iface.js +0 -7
  283. package/dist/src/lib/index.d.ts.map +0 -1
  284. package/dist/src/lib/index.js +0 -77
  285. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  286. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  287. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  288. package/dist/src/lib/keyPair.js +0 -63
  289. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  290. package/dist/src/lib/solInstructionFactory.js +0 -572
  291. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  292. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  293. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  294. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  295. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  296. package/dist/src/lib/token2022Config.d.ts +0 -44
  297. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  298. package/dist/src/lib/token2022Config.js +0 -27
  299. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  300. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  301. package/dist/src/lib/transaction.d.ts.map +0 -1
  302. package/dist/src/lib/transaction.js +0 -595
  303. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  304. package/dist/src/lib/transactionBuilder.js +0 -380
  305. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  306. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  307. package/dist/src/lib/transferBuilder.js +0 -70
  308. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  309. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  310. package/dist/src/lib/transferBuilderV2.js +0 -210
  311. package/dist/src/lib/utils.js +0 -589
  312. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  313. package/dist/src/register.d.ts +0 -3
  314. package/dist/src/register.d.ts.map +0 -1
  315. package/dist/src/register.js +0 -15
  316. package/dist/src/sol.d.ts.map +0 -1
  317. package/dist/src/sol.js +0 -1324
  318. package/dist/src/solToken.d.ts.map +0 -1
  319. package/dist/src/solToken.js +0 -69
  320. package/dist/src/tsol.js +0 -24
  321. package/dist/test/fixtures/sol.js +0 -1433
  322. package/dist/test/resources/sol.d.ts.map +0 -1
  323. package/dist/test/resources/sol.js +0 -320
  324. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  325. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  326. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  327. package/dist/test/unit/getBuilderFactory.js +0 -10
  328. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  329. package/dist/test/unit/instructionParamsFactory.js +0 -412
  330. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  331. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  332. package/dist/test/unit/keyPair.js +0 -177
  333. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  334. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  335. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  336. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  337. package/dist/test/unit/sol.js +0 -3180
  338. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  339. package/dist/test/unit/solInstructionFactory.js +0 -454
  340. package/dist/test/unit/solToken.d.ts.map +0 -1
  341. package/dist/test/unit/solToken.js +0 -31
  342. package/dist/test/unit/transaction.d.ts.map +0 -1
  343. package/dist/test/unit/transaction.js +0 -983
  344. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  345. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  346. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  347. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  348. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  349. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  350. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  351. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  352. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  353. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  354. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  355. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  356. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  357. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  358. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  359. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  360. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  361. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  362. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  363. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  364. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  365. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  366. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  367. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  368. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  369. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  370. package/dist/test/unit/utils.js +0 -517
  371. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  372. package/dist/test/unit/versionedTransaction.js +0 -207
  373. package/dist/tsconfig.tsbuildinfo +0 -1
  374. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  375. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  376. /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
  377. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  378. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  379. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  380. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  381. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  382. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  383. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  384. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  385. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  386. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  387. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  388. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  389. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  390. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  391. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  392. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  393. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  394. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  395. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  396. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  397. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  398. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  399. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  400. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  401. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  402. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  403. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  404. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  405. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  406. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  407. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  408. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  409. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  410. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  411. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  412. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  413. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  414. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  415. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  416. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  417. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  418. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  419. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  420. /package/dist/{src → esm}/index.d.ts.map +0 -0
  421. /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
  422. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  423. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  424. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  425. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  426. /package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +0 -0
  427. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  428. /package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +0 -0
  429. /package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +0 -0
  430. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  431. /package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +0 -0
  432. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  433. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  434. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,615 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Transaction = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const web3_js_1 = require("@solana/web3.js");
9
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
10
+ const bs58_1 = __importDefault(require("bs58"));
11
+ const _1 = require(".");
12
+ const constants_1 = require("./constants");
13
+ const instructionParamsFactory_1 = require("./instructionParamsFactory");
14
+ const utils_1 = require("./utils");
15
+ const public_types_1 = require("@bitgo/public-types");
16
+ class Transaction extends sdk_core_1.BaseTransaction {
17
+ constructor(_coinConfig) {
18
+ super(_coinConfig);
19
+ this._instructionsData = [];
20
+ this._useTokenAddressTokenName = false;
21
+ }
22
+ get solTransaction() {
23
+ return this._solTransaction;
24
+ }
25
+ set solTransaction(tx) {
26
+ this._solTransaction = tx;
27
+ }
28
+ get numberOfRequiredSignatures() {
29
+ return this._solTransaction.compileMessage().header.numRequiredSignatures;
30
+ }
31
+ get numberOfATACreationInstructions() {
32
+ return this._solTransaction.instructions.filter((instruction) => (0, utils_1.getInstructionType)(instruction) === constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount).length;
33
+ }
34
+ /** @inheritDoc */
35
+ get signablePayload() {
36
+ if (this._versionedTransaction) {
37
+ return Buffer.from(this._versionedTransaction.message.serialize());
38
+ }
39
+ return this._solTransaction.serializeMessage();
40
+ }
41
+ /** @inheritDoc **/
42
+ get id() {
43
+ // Solana transaction ID === first signature: https://docs.solana.com/terminology#transaction-id
44
+ if (this._versionedTransaction) {
45
+ const sig = this._versionedTransaction.signatures?.[0];
46
+ // Check if signature exists and is not a placeholder signature (all zeros)
47
+ if (sig && sig.some((byte) => byte !== 0)) {
48
+ return bs58_1.default.encode(sig);
49
+ }
50
+ }
51
+ if (this._solTransaction.signature) {
52
+ return bs58_1.default.encode(this._solTransaction.signature);
53
+ }
54
+ return constants_1.UNAVAILABLE_TEXT;
55
+ }
56
+ get lamportsPerSignature() {
57
+ return this._lamportsPerSignature;
58
+ }
59
+ set lamportsPerSignature(lamportsPerSignature) {
60
+ this._lamportsPerSignature = lamportsPerSignature;
61
+ }
62
+ get tokenAccountRentExemptAmount() {
63
+ return this._tokenAccountRentExemptAmount;
64
+ }
65
+ set tokenAccountRentExemptAmount(tokenAccountRentExemptAmount) {
66
+ this._tokenAccountRentExemptAmount = tokenAccountRentExemptAmount;
67
+ }
68
+ /** @inheritDoc */
69
+ get signature() {
70
+ const signatures = [];
71
+ if (this._versionedTransaction) {
72
+ // Handle VersionedTransaction signatures
73
+ for (const sig of this._versionedTransaction.signatures) {
74
+ // Filters out placeholder signatures
75
+ if (sig && sig.some((b) => b !== 0)) {
76
+ signatures.push(bs58_1.default.encode(sig));
77
+ }
78
+ }
79
+ }
80
+ else {
81
+ // Handle legacy transaction signatures
82
+ for (const solSignature of this._solTransaction.signatures) {
83
+ if (solSignature.signature) {
84
+ signatures.push(bs58_1.default.encode(solSignature.signature));
85
+ }
86
+ }
87
+ }
88
+ return signatures;
89
+ }
90
+ /**
91
+ * Set the transaction type.
92
+ *
93
+ * @param {TransactionType} transactionType The transaction type to be set.
94
+ */
95
+ setTransactionType(transactionType) {
96
+ this._type = transactionType;
97
+ }
98
+ /**
99
+ * Set the instructionData.
100
+ *
101
+ * @param {InstructionParams[]} instructionData The instruction data to be set.
102
+ */
103
+ setInstructionsData(instructionData) {
104
+ this._instructionsData = instructionData;
105
+ }
106
+ get useTokenAddressTokenName() {
107
+ return this._useTokenAddressTokenName;
108
+ }
109
+ setUseTokenAddressTokenName(value) {
110
+ this._useTokenAddressTokenName = value;
111
+ }
112
+ /**
113
+ * Check if this transaction is a VersionedTransaction
114
+ * @returns {boolean} True if this is a VersionedTransaction
115
+ */
116
+ isVersionedTransaction() {
117
+ return !!this._versionedTransaction || !!this._versionedTransactionData;
118
+ }
119
+ /**
120
+ * Get the original VersionedTransaction if this transaction was parsed from one
121
+ * @returns {VersionedTransaction | undefined} The VersionedTransaction or undefined
122
+ */
123
+ get versionedTransaction() {
124
+ return this._versionedTransaction;
125
+ }
126
+ /**
127
+ * Set a built VersionedTransaction
128
+ * @param {VersionedTransaction} versionedTx The VersionedTransaction to set
129
+ */
130
+ set versionedTransaction(versionedTx) {
131
+ this._versionedTransaction = versionedTx;
132
+ }
133
+ /**
134
+ * Get the stored VersionedTransactionData
135
+ * @returns {VersionedTransactionData | undefined} The stored data or undefined
136
+ */
137
+ getVersionedTransactionData() {
138
+ return this._versionedTransactionData;
139
+ }
140
+ /**
141
+ * Set the VersionedTransactionData for this transaction
142
+ * @param {VersionedTransactionData | undefined} data The versioned transaction data to store, or undefined to clear
143
+ */
144
+ setVersionedTransactionData(data) {
145
+ this._versionedTransactionData = data;
146
+ }
147
+ /** @inheritdoc */
148
+ canSign() {
149
+ return true;
150
+ }
151
+ /**
152
+ * Signs transaction.
153
+ *
154
+ * @param {KeyPair} keyPair Signer keys.
155
+ */
156
+ async sign(keyPair) {
157
+ // Convert to array and build signers list
158
+ const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
159
+ const signers = [];
160
+ for (const kp of keyPairs) {
161
+ const keys = kp.getKeys(true);
162
+ if (!keys.prv) {
163
+ throw new sdk_core_1.SigningError('Missing private key');
164
+ }
165
+ signers.push({ publicKey: new web3_js_1.PublicKey(keys.pub), secretKey: keys.prv });
166
+ }
167
+ if (this._versionedTransaction) {
168
+ if (!this._versionedTransaction.message.recentBlockhash) {
169
+ throw new sdk_core_1.SigningError('Nonce is required before signing');
170
+ }
171
+ this._versionedTransaction.sign(signers);
172
+ return;
173
+ }
174
+ if (!this._solTransaction || !this._solTransaction.recentBlockhash) {
175
+ throw new sdk_core_1.SigningError('Nonce is required before signing');
176
+ }
177
+ if (!this._solTransaction || !this._solTransaction.feePayer) {
178
+ throw new sdk_core_1.SigningError('feePayer is required before signing');
179
+ }
180
+ this._solTransaction.partialSign(...signers);
181
+ }
182
+ /** @inheritdoc */
183
+ toBroadcastFormat() {
184
+ if (this._versionedTransaction) {
185
+ // VersionedTransaction.serialize() doesn't need requireAllSignatures parameter
186
+ // It automatically handles whatever signatures are present
187
+ return Buffer.from(this._versionedTransaction.serialize()).toString('base64');
188
+ }
189
+ if (!this._solTransaction) {
190
+ throw new sdk_core_1.ParseTransactionError('Empty transaction');
191
+ }
192
+ // The signatures can have null signatures (which means they are required but yet unsigned)
193
+ // In order to be able to serializer the txs, we have to change the requireAllSignatures based
194
+ // on if the TX is fully signed or not
195
+ const requireAllSignatures = (0, utils_1.requiresAllSignatures)(this._solTransaction.signatures);
196
+ // Based on the recomendation encoding found here https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
197
+ // We use base64 encoding
198
+ return this._solTransaction.serialize({ requireAllSignatures }).toString('base64');
199
+ }
200
+ /**
201
+ * Sets this transaction payload
202
+ *
203
+ * @param rawTransaction
204
+ */
205
+ fromRawTransaction(rawTransaction) {
206
+ try {
207
+ (0, utils_1.isValidRawTransaction)(rawTransaction);
208
+ this._solTransaction = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
209
+ if (this._solTransaction.signature && this._solTransaction.signature !== null) {
210
+ this._id = bs58_1.default.encode(this._solTransaction.signature);
211
+ }
212
+ const transactionType = (0, utils_1.getTransactionType)(this._solTransaction);
213
+ switch (transactionType) {
214
+ case sdk_core_1.TransactionType.WalletInitialization:
215
+ this.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
216
+ break;
217
+ case sdk_core_1.TransactionType.Send:
218
+ this.setTransactionType(sdk_core_1.TransactionType.Send);
219
+ break;
220
+ case sdk_core_1.TransactionType.StakingActivate:
221
+ this.setTransactionType(sdk_core_1.TransactionType.StakingActivate);
222
+ break;
223
+ case sdk_core_1.TransactionType.StakingDeactivate:
224
+ this.setTransactionType(sdk_core_1.TransactionType.StakingDeactivate);
225
+ break;
226
+ case sdk_core_1.TransactionType.StakingWithdraw:
227
+ this.setTransactionType(sdk_core_1.TransactionType.StakingWithdraw);
228
+ break;
229
+ case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
230
+ this.setTransactionType(sdk_core_1.TransactionType.AssociatedTokenAccountInitialization);
231
+ break;
232
+ case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
233
+ this.setTransactionType(sdk_core_1.TransactionType.CloseAssociatedTokenAccount);
234
+ break;
235
+ case sdk_core_1.TransactionType.StakingAuthorize:
236
+ this.setTransactionType(sdk_core_1.TransactionType.StakingAuthorize);
237
+ break;
238
+ case sdk_core_1.TransactionType.StakingAuthorizeRaw:
239
+ this.setTransactionType(sdk_core_1.TransactionType.StakingAuthorizeRaw);
240
+ break;
241
+ case sdk_core_1.TransactionType.StakingDelegate:
242
+ this.setTransactionType(sdk_core_1.TransactionType.StakingDelegate);
243
+ break;
244
+ case sdk_core_1.TransactionType.CustomTx:
245
+ this.setTransactionType(sdk_core_1.TransactionType.CustomTx);
246
+ break;
247
+ case sdk_core_1.TransactionType.ConfidentialTransfer:
248
+ this.setTransactionType(sdk_core_1.TransactionType.ConfidentialTransfer);
249
+ break;
250
+ }
251
+ if (transactionType !== sdk_core_1.TransactionType.StakingAuthorizeRaw) {
252
+ this.loadInputsAndOutputs();
253
+ }
254
+ }
255
+ catch (e) {
256
+ throw e;
257
+ }
258
+ }
259
+ /** @inheritdoc */
260
+ toJson() {
261
+ if (!this._solTransaction) {
262
+ throw new sdk_core_1.ParseTransactionError('Empty transaction');
263
+ }
264
+ let durableNonce;
265
+ if (this._solTransaction.nonceInfo) {
266
+ const nonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
267
+ durableNonce = {
268
+ walletNonceAddress: nonceInstruction.noncePubkey.toString(),
269
+ authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
270
+ };
271
+ }
272
+ const instructionData = (0, instructionParamsFactory_1.instructionParamsFactory)(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
273
+ if (this._type) {
274
+ if (!durableNonce &&
275
+ instructionData.length > 1 &&
276
+ instructionData[0].type === constants_1.InstructionBuilderTypes.NonceAdvance) {
277
+ durableNonce = instructionData[0].params;
278
+ }
279
+ }
280
+ const result = {
281
+ id: this._solTransaction.signature ? this.id : undefined,
282
+ feePayer: this._solTransaction.feePayer?.toString(),
283
+ lamportsPerSignature: this.lamportsPerSignature,
284
+ nonce: this.getNonce(),
285
+ durableNonce: durableNonce,
286
+ numSignatures: this.signature.length,
287
+ instructionsData: instructionData,
288
+ };
289
+ return result;
290
+ }
291
+ /**
292
+ * Get the nonce from the Solana Transaction
293
+ * Throws if not set
294
+ */
295
+ getNonce() {
296
+ if (this._solTransaction.recentBlockhash) {
297
+ return this._solTransaction.recentBlockhash;
298
+ }
299
+ else if (this._solTransaction.nonceInfo) {
300
+ return this._solTransaction.nonceInfo.nonce;
301
+ }
302
+ else {
303
+ throw new sdk_core_1.InvalidTransactionError('Nonce is not set');
304
+ }
305
+ }
306
+ /**
307
+ * Load the input and output data on this transaction.
308
+ */
309
+ loadInputsAndOutputs() {
310
+ if (!this._solTransaction || this._solTransaction.instructions?.length === 0) {
311
+ return;
312
+ }
313
+ const outputs = [];
314
+ const inputs = [];
315
+ const instructionParams = (0, instructionParamsFactory_1.instructionParamsFactory)(this.type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
316
+ for (const instruction of instructionParams) {
317
+ switch (instruction.type) {
318
+ case constants_1.InstructionBuilderTypes.CreateNonceAccount:
319
+ inputs.push({
320
+ address: instruction.params.fromAddress,
321
+ value: instruction.params.amount,
322
+ coin: this._coinConfig.name,
323
+ });
324
+ break;
325
+ case constants_1.InstructionBuilderTypes.Transfer:
326
+ inputs.push({
327
+ address: instruction.params.fromAddress,
328
+ value: instruction.params.amount,
329
+ coin: this._coinConfig.name,
330
+ });
331
+ outputs.push({
332
+ address: instruction.params.toAddress,
333
+ value: instruction.params.amount,
334
+ coin: this._coinConfig.name,
335
+ });
336
+ break;
337
+ case constants_1.InstructionBuilderTypes.TokenTransfer:
338
+ inputs.push({
339
+ address: instruction.params.fromAddress,
340
+ value: instruction.params.amount,
341
+ coin: instruction.params.tokenName,
342
+ });
343
+ outputs.push({
344
+ address: instruction.params.toAddress,
345
+ value: instruction.params.amount,
346
+ coin: instruction.params.tokenName,
347
+ });
348
+ break;
349
+ case constants_1.InstructionBuilderTypes.StakingActivate:
350
+ inputs.push({
351
+ address: instruction.params.fromAddress,
352
+ value: instruction.params.amount,
353
+ coin: this._coinConfig.name,
354
+ });
355
+ if (instruction.params.stakingType !== public_types_1.SolStakingTypeEnum.JITO) {
356
+ outputs.push({
357
+ address: instruction.params.stakingAddress,
358
+ value: instruction.params.amount,
359
+ coin: this._coinConfig.name,
360
+ });
361
+ }
362
+ break;
363
+ case constants_1.InstructionBuilderTypes.StakingDeactivate:
364
+ if (instruction.params.amount &&
365
+ instruction.params.unstakingAddress &&
366
+ instruction.params.stakingType !== public_types_1.SolStakingTypeEnum.JITO) {
367
+ inputs.push({
368
+ address: instruction.params.stakingAddress,
369
+ value: instruction.params.amount,
370
+ coin: this._coinConfig.name,
371
+ });
372
+ outputs.push({
373
+ address: instruction.params.unstakingAddress,
374
+ value: instruction.params.amount,
375
+ coin: this._coinConfig.name,
376
+ });
377
+ }
378
+ break;
379
+ case constants_1.InstructionBuilderTypes.StakingWithdraw:
380
+ inputs.push({
381
+ address: instruction.params.stakingAddress,
382
+ value: instruction.params.amount,
383
+ coin: this._coinConfig.name,
384
+ });
385
+ outputs.push({
386
+ address: instruction.params.fromAddress,
387
+ value: instruction.params.amount,
388
+ coin: this._coinConfig.name,
389
+ });
390
+ break;
391
+ case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
392
+ break;
393
+ case constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount:
394
+ break;
395
+ case constants_1.InstructionBuilderTypes.StakingAuthorize:
396
+ break;
397
+ case constants_1.InstructionBuilderTypes.StakingDelegate:
398
+ break;
399
+ case constants_1.InstructionBuilderTypes.SetComputeUnitLimit:
400
+ break;
401
+ case constants_1.InstructionBuilderTypes.SetPriorityFee:
402
+ break;
403
+ case constants_1.InstructionBuilderTypes.CustomInstruction:
404
+ break;
405
+ }
406
+ }
407
+ this._outputs = outputs;
408
+ this._inputs = inputs;
409
+ }
410
+ /** @inheritDoc */
411
+ explainTransaction() {
412
+ // Testnet uses WASM-based parsing (no @solana/web3.js dependency).
413
+ // This validates the WASM path against production traffic before
414
+ // replacing the legacy implementation for all networks.
415
+ if (this._coinConfig.name === 'tsol') {
416
+ // explainTransaction should work on unsigned/partially-signed transactions
417
+ // (e.g., during parseTransaction round-trips where null signatures become
418
+ // zero-filled buffers). Use serialize without signature validation since
419
+ // we only need to read the transaction, not broadcast it.
420
+ const txBase64 = Buffer.from(this._solTransaction.serialize({ verifySignatures: false, requireAllSignatures: false })).toString('base64');
421
+ return (0, _1.explainSolTransaction)({
422
+ txBase64,
423
+ feeInfo: this._lamportsPerSignature ? { fee: this._lamportsPerSignature.toString() } : undefined,
424
+ tokenAccountRentExemptAmount: this._tokenAccountRentExemptAmount,
425
+ coinName: this._coinConfig.name,
426
+ });
427
+ }
428
+ if ((0, utils_1.validateRawMsgInstruction)(this._solTransaction.instructions)) {
429
+ return this.explainRawMsgAuthorizeTransaction();
430
+ }
431
+ const decodedInstructions = (0, instructionParamsFactory_1.instructionParamsFactory)(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
432
+ let memo = undefined;
433
+ let durableNonce = undefined;
434
+ let outputAmount = new bignumber_js_1.default(0);
435
+ const outputs = [];
436
+ // Create a separate array for token enablements
437
+ const tokenEnablements = [];
438
+ for (const instruction of decodedInstructions) {
439
+ switch (instruction.type) {
440
+ case constants_1.InstructionBuilderTypes.NonceAdvance:
441
+ durableNonce = instruction.params;
442
+ break;
443
+ case constants_1.InstructionBuilderTypes.Memo:
444
+ memo = instruction.params.memo;
445
+ break;
446
+ case constants_1.InstructionBuilderTypes.Transfer:
447
+ const transferInstruction = instruction;
448
+ outputs.push({
449
+ address: transferInstruction.params.toAddress,
450
+ amount: transferInstruction.params.amount,
451
+ });
452
+ outputAmount = outputAmount.plus(transferInstruction.params.amount);
453
+ break;
454
+ case constants_1.InstructionBuilderTypes.TokenTransfer:
455
+ const tokenTransferInstruction = instruction;
456
+ outputs.push({
457
+ address: tokenTransferInstruction.params.toAddress,
458
+ amount: tokenTransferInstruction.params.amount,
459
+ tokenName: tokenTransferInstruction.params.tokenName,
460
+ });
461
+ break;
462
+ case constants_1.InstructionBuilderTypes.CreateNonceAccount:
463
+ const createInstruction = instruction;
464
+ outputs.push({
465
+ address: createInstruction.params.nonceAddress,
466
+ amount: createInstruction.params.amount,
467
+ });
468
+ outputAmount = outputAmount.plus(createInstruction.params.amount);
469
+ break;
470
+ case constants_1.InstructionBuilderTypes.StakingActivate:
471
+ const stakingActivateInstruction = instruction;
472
+ outputs.push({
473
+ address: stakingActivateInstruction.params.stakingAddress,
474
+ amount: stakingActivateInstruction.params.amount,
475
+ });
476
+ outputAmount = outputAmount.plus(stakingActivateInstruction.params.amount);
477
+ break;
478
+ case constants_1.InstructionBuilderTypes.StakingWithdraw:
479
+ const stakingWithdrawInstruction = instruction;
480
+ outputs.push({
481
+ address: stakingWithdrawInstruction.params.fromAddress,
482
+ amount: stakingWithdrawInstruction.params.amount,
483
+ });
484
+ outputAmount = outputAmount.plus(stakingWithdrawInstruction.params.amount);
485
+ break;
486
+ case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
487
+ // Process token enablement instructions and collect them in the tokenEnablements array
488
+ const ataInit = instruction;
489
+ tokenEnablements.push({
490
+ address: ataInit.params.ataAddress,
491
+ tokenName: ataInit.params.tokenName,
492
+ tokenAddress: ataInit.params.mintAddress,
493
+ });
494
+ break;
495
+ case constants_1.InstructionBuilderTypes.CustomInstruction:
496
+ // Custom instructions are arbitrary and cannot be explained
497
+ break;
498
+ default:
499
+ continue;
500
+ }
501
+ // After deserializing a transaction, durable nonce details are populated in the nonceInfo field
502
+ if (!durableNonce && this._solTransaction.nonceInfo) {
503
+ const nonceAdvanceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
504
+ durableNonce = {
505
+ authWalletAddress: nonceAdvanceInstruction.authorizedPubkey.toString(),
506
+ walletNonceAddress: nonceAdvanceInstruction.noncePubkey.toString(),
507
+ };
508
+ }
509
+ }
510
+ return this.getExplainedTransaction(outputAmount, outputs, memo, durableNonce, tokenEnablements);
511
+ }
512
+ calculateFee() {
513
+ if (this.lamportsPerSignature || this.tokenAccountRentExemptAmount) {
514
+ const signatureFees = this.lamportsPerSignature
515
+ ? new bignumber_js_1.default(this.lamportsPerSignature).multipliedBy(this.numberOfRequiredSignatures).toFixed(0)
516
+ : 0;
517
+ const rentFees = this.tokenAccountRentExemptAmount
518
+ ? new bignumber_js_1.default(this.tokenAccountRentExemptAmount).multipliedBy(this.numberOfATACreationInstructions).toFixed(0)
519
+ : 0;
520
+ return new bignumber_js_1.default(signatureFees).plus(rentFees).toFixed(0);
521
+ }
522
+ return constants_1.UNAVAILABLE_TEXT;
523
+ }
524
+ getExplainedTransaction(outputAmount, outputs, memo = undefined, durableNonce = undefined, tokenEnablements = []) {
525
+ const feeString = this.calculateFee();
526
+ // Create displayOrder with tokenEnablements always included
527
+ const displayOrder = [
528
+ 'id',
529
+ 'type',
530
+ 'blockhash',
531
+ 'durableNonce',
532
+ 'outputAmount',
533
+ 'changeAmount',
534
+ 'outputs',
535
+ 'changeOutputs',
536
+ 'tokenEnablements',
537
+ 'fee',
538
+ 'memo',
539
+ ];
540
+ // Create the base explanation object with tokenEnablements always included
541
+ const explanation = {
542
+ displayOrder,
543
+ id: this.id,
544
+ type: sdk_core_1.TransactionType[this.type].toString(),
545
+ changeOutputs: [],
546
+ changeAmount: '0',
547
+ outputAmount: outputAmount.toFixed(0),
548
+ outputs: outputs,
549
+ fee: {
550
+ fee: feeString,
551
+ feeRate: this.lamportsPerSignature,
552
+ },
553
+ memo: memo,
554
+ blockhash: this.getNonce(),
555
+ durableNonce: durableNonce,
556
+ tokenEnablements: tokenEnablements,
557
+ };
558
+ return explanation;
559
+ }
560
+ explainRawMsgAuthorizeTransaction() {
561
+ const { instructions } = this._solTransaction;
562
+ const nonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instructions[0]);
563
+ const durableNonce = {
564
+ walletNonceAddress: nonceInstruction.noncePubkey.toString(),
565
+ authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
566
+ };
567
+ const data = instructions[1].data.toString('hex');
568
+ const stakingAuthorizeParams = data === constants_1.validInstructionData
569
+ ? {
570
+ stakingAddress: instructions[1].keys[0].pubkey.toString(),
571
+ oldWithdrawAddress: instructions[1].keys[2].pubkey.toString(),
572
+ newWithdrawAddress: instructions[1].keys[3].pubkey.toString(),
573
+ custodianAddress: instructions[1].keys[4].pubkey.toString(),
574
+ }
575
+ : {
576
+ stakingAddress: instructions[1].keys[0].pubkey.toString(),
577
+ oldWithdrawAddress: '',
578
+ newWithdrawAddress: '',
579
+ oldStakingAuthorityAddress: instructions[1].keys[2].pubkey.toString(),
580
+ newStakingAuthorityAddress: instructions[1].keys[3].pubkey.toString(),
581
+ };
582
+ const feeString = this.calculateFee();
583
+ return {
584
+ displayOrder: [
585
+ 'id',
586
+ 'type',
587
+ 'blockhash',
588
+ 'durableNonce',
589
+ 'outputAmount',
590
+ 'changeAmount',
591
+ 'outputs',
592
+ 'changeOutputs',
593
+ 'tokenEnablements',
594
+ 'fee',
595
+ 'memo',
596
+ ],
597
+ id: this.id,
598
+ type: sdk_core_1.TransactionType[this.type].toString(),
599
+ changeOutputs: [],
600
+ changeAmount: '0',
601
+ outputAmount: 0,
602
+ outputs: [],
603
+ fee: {
604
+ fee: feeString,
605
+ feeRate: this.lamportsPerSignature,
606
+ },
607
+ blockhash: this.getNonce(),
608
+ durableNonce: durableNonce,
609
+ stakingAuthorize: stakingAuthorizeParams,
610
+ tokenEnablements: [], // Always include tokenEnablements as an empty array for consistency
611
+ };
612
+ }
613
+ }
614
+ exports.Transaction = Transaction;
615
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVM4QjtBQUU5Qiw2Q0FPeUI7QUFDekIsZ0VBQXFDO0FBQ3JDLGdEQUEwQjtBQUMxQix3QkFBbUQ7QUFDbkQsMkNBS3FCO0FBaUJyQix5RUFBc0U7QUFDdEUsbUNBTWlCO0FBQ2pCLHNEQUF5RDtBQUV6RCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQVU5QyxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQU5YLHNCQUFpQixHQUF3QixFQUFFLENBQUM7UUFDOUMsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBTTFDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLGNBQWMsQ0FBQyxFQUFrQjtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBWSwwQkFBMEI7UUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBWSwrQkFBK0I7UUFDekMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQzdDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFdBQVcsQ0FBQyxLQUFLLHFDQUF5QixDQUFDLGdDQUFnQyxDQUNoSCxDQUFDLE1BQU0sQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxlQUFlO1FBQ2pCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDL0IsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxx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QUU7YUFDdEUsQ0FBQztRQUNSLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxPQUFPO1lBQ0wsWUFBWSxFQUFFO2dCQUNaLElBQUk7Z0JBQ0osTUFBTTtnQkFDTixXQUFXO2dCQUNYLGNBQWM7Z0JBQ2QsY0FBYztnQkFDZCxjQUFjO2dCQUNkLFNBQVM7Z0JBQ1QsZUFBZTtnQkFDZixrQkFBa0I7Z0JBQ2xCLEtBQUs7Z0JBQ0wsTUFBTTthQUNQO1lBQ0QsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLDBCQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUMzQyxhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsR0FBRztZQUNqQixZQUFZLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxFQUFFO1lBQ1gsR0FBRyxFQUFFO2dCQUNILEdBQUcsRUFBRSxTQUFTO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CO2FBQ25DO1lBQ0QsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDMUIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsZ0JBQWdCLEVBQUUsc0JBQXNCO1lBQ3hDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxvRUFBb0U7U0FDM0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTVxQkQsa0NBNHFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBJVG9rZW5FbmFibGVtZW50LFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmxvY2toYXNoLFxuICBQdWJsaWNLZXksXG4gIFNpZ25lcixcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFN5c3RlbUluc3RydWN0aW9uLFxuICBWZXJzaW9uZWRUcmFuc2FjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCBiYXNlNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgeyBleHBsYWluU29sVHJhbnNhY3Rpb24sIEtleVBhaXIgfSBmcm9tICcuJztcbmltcG9ydCB7XG4gIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLFxuICBVTkFWQUlMQUJMRV9URVhULFxuICB2YWxpZEluc3RydWN0aW9uRGF0YSxcbiAgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQXRhSW5pdCxcbiAgRHVyYWJsZU5vbmNlUGFyYW1zLFxuICBJbnN0cnVjdGlvblBhcmFtcyxcbiAgTWVtbyxcbiAgTm9uY2UsXG4gIFN0YWtpbmdBY3RpdmF0ZSxcbiAgU3Rha2luZ0F1dGhvcml6ZVBhcmFtcyxcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICBUb2tlblRyYW5zZmVyLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUcmFuc2ZlcixcbiAgVHhEYXRhLFxuICBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEsXG4gIFdhbGxldEluaXQsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5IH0gZnJvbSAnLi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnknO1xuaW1wb3J0IHtcbiAgZ2V0SW5zdHJ1Y3Rpb25UeXBlLFxuICBnZXRUcmFuc2FjdGlvblR5cGUsXG4gIGlzVmFsaWRSYXdUcmFuc2FjdGlvbixcbiAgcmVxdWlyZXNBbGxTaWduYXR1cmVzLFxuICB2YWxpZGF0ZVJhd01zZ0luc3RydWN0aW9uLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFNvbFN0YWtpbmdUeXBlRW51bSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX3NvbFRyYW5zYWN0aW9uOiBTb2xUcmFuc2FjdGlvbjtcbiAgcHJpdmF0ZSBfbGFtcG9ydHNQZXJTaWduYXR1cmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHJvdGVjdGVkIF9pbnN0cnVjdGlvbnNEYXRhOiBJbnN0cnVjdGlvblBhcmFtc1tdID0gW107XG4gIHByaXZhdGUgX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSA9IGZhbHNlO1xuICBwcml2YXRlIF92ZXJzaW9uZWRUcmFuc2FjdGlvbjogVmVyc2lvbmVkVHJhbnNhY3Rpb24gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YTogVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIGdldCBzb2xUcmFuc2FjdGlvbigpOiBTb2xUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgc2V0IHNvbFRyYW5zYWN0aW9uKHR4OiBTb2xUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICBwcml2YXRlIGdldCBudW1iZXJPZlJlcXVpcmVkU2lnbmF0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5jb21waWxlTWVzc2FnZSgpLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7XG4gIH1cblxuICBwcml2YXRlIGdldCBudW1iZXJPZkFUQUNyZWF0aW9uSW5zdHJ1Y3Rpb25zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucy5maWx0ZXIoXG4gICAgICAoaW5zdHJ1Y3Rpb24pID0+IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikgPT09IFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnRcbiAgICApLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgaWYgKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24ubWVzc2FnZS5zZXJpYWxpemUoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zZXJpYWxpemVNZXNzYWdlKCk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKiovXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIC8vIFNvbGFuYSB0cmFuc2FjdGlvbiBJRCA9PT0gZmlyc3Qgc2lnbmF0dXJlOiBodHRwczovL2RvY3Muc29sYW5hLmNvbS90ZXJtaW5vbG9neSN0cmFuc2FjdGlvbi1pZFxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgY29uc3Qgc2lnID0gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlcz8uWzBdO1xuICAgICAgLy8gQ2hlY2sgaWYgc2lnbmF0dXJlIGV4aXN0cyBhbmQgaXMgbm90IGEgcGxhY2Vob2xkZXIgc2lnbmF0dXJlIChhbGwgemVyb3MpXG4gICAgICBpZiAoc2lnICYmIHNpZy5zb21lKChieXRlKSA9PiBieXRlICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gYmFzZTU4LmVuY29kZShzaWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUpIHtcbiAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVOQVZBSUxBQkxFX1RFWFQ7XG4gIH1cblxuICBnZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBzZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUobGFtcG9ydHNQZXJTaWduYXR1cmU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID0gbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBnZXQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50O1xuICB9XG5cbiAgc2V0IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQodG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCA9IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgLy8gSGFuZGxlIFZlcnNpb25lZFRyYW5zYWN0aW9uIHNpZ25hdHVyZXNcbiAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZXMpIHtcbiAgICAgICAgLy8gRmlsdGVycyBvdXQgcGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgICBpZiAoc2lnICYmIHNpZy5zb21lKChiKSA9PiBiICE9PSAwKSkge1xuICAgICAgICAgIHNpZ25hdHVyZXMucHVzaChiYXNlNTguZW5jb2RlKHNpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBsZWdhY3kgdHJhbnNhY3Rpb24gc2lnbmF0dXJlc1xuICAgICAgZm9yIChjb25zdCBzb2xTaWduYXR1cmUgb2YgdGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcykge1xuICAgICAgICBpZiAoc29sU2lnbmF0dXJlLnNpZ25hdHVyZSkge1xuICAgICAgICAgIHNpZ25hdHVyZXMucHVzaChiYXNlNTguZW5jb2RlKHNvbFNpZ25hdHVyZS5zaWduYXR1cmUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaWduYXR1cmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXQuXG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaW5zdHJ1Y3Rpb25EYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RydWN0aW9uUGFyYW1zW119IGluc3RydWN0aW9uRGF0YSBUaGUgaW5zdHJ1Y3Rpb24gZGF0YSB0byBiZSBzZXQuXG4gICAqL1xuICBzZXRJbnN0cnVjdGlvbnNEYXRhKGluc3RydWN0aW9uRGF0YTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSk6IHZvaWQge1xuICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBpbnN0cnVjdGlvbkRhdGE7XG4gIH1cblxuICBnZXQgdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU7XG4gIH1cblxuICBzZXRVc2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGEgVmVyc2lvbmVkVHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBpcyBhIFZlcnNpb25lZFRyYW5zYWN0aW9uXG4gICAqL1xuICBpc1ZlcnNpb25lZFRyYW5zYWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uIHx8ICEhdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3JpZ2luYWwgVmVyc2lvbmVkVHJhbnNhY3Rpb24gaWYgdGhpcyB0cmFuc2FjdGlvbiB3YXMgcGFyc2VkIGZyb20gb25lXG4gICAqIEByZXR1cm5zIHtWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZH0gVGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0IHZlcnNpb25lZFRyYW5zYWN0aW9uKCk6IFZlcnNpb25lZFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgYnVpbHQgVmVyc2lvbmVkVHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtWZXJzaW9uZWRUcmFuc2FjdGlvbn0gdmVyc2lvbmVkVHggVGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uIHRvIHNldFxuICAgKi9cbiAgc2V0IHZlcnNpb25lZFRyYW5zYWN0aW9uKHZlcnNpb25lZFR4OiBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uID0gdmVyc2lvbmVkVHg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdG9yZWQgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhXG4gICAqIEByZXR1cm5zIHtWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWR9IFRoZSBzdG9yZWQgZGF0YSBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSgpOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgZm9yIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWR9IGRhdGEgVGhlIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhIHRvIHN0b3JlLCBvciB1bmRlZmluZWQgdG8gY2xlYXJcbiAgICovXG4gIHNldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpciBTaWduZXIga2V5cy5cbiAgICovXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcltdIHwgS2V5UGFpcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENvbnZlcnQgdG8gYXJyYXkgYW5kIGJ1aWxkIHNpZ25lcnMgbGlzdFxuICAgIGNvbnN0IGtleVBhaXJzID0ga2V5UGFpciBpbnN0YW5jZW9mIEFycmF5ID8ga2V5UGFpciA6IFtrZXlQYWlyXTtcbiAgICBjb25zdCBzaWduZXJzOiBTaWduZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga3Agb2Yga2V5UGFpcnMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBrcC5nZXRLZXlzKHRydWUpO1xuICAgICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgICB9XG4gICAgICBzaWduZXJzLnB1c2goeyBwdWJsaWNLZXk6IG5ldyBQdWJsaWNLZXkoa2V5cy5wdWIpLCBzZWNyZXRLZXk6IGtleXMucHJ2IGFzIFVpbnQ4QXJyYXkgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICBpZiAoIXRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLm1lc3NhZ2UucmVjZW50QmxvY2toYXNoKSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ05vbmNlIGlzIHJlcXVpcmVkIGJlZm9yZSBzaWduaW5nJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5zaWduKHNpZ25lcnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24gfHwgIXRoaXMuX3NvbFRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTm9uY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbiB8fCAhdGhpcy5fc29sVHJhbnNhY3Rpb24uZmVlUGF5ZXIpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ2ZlZVBheWVyIGlzIHJlcXVpcmVkIGJlZm9yZSBzaWduaW5nJyk7XG4gICAgfVxuICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnBhcnRpYWxTaWduKC4uLnNpZ25lcnMpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICAvLyBWZXJzaW9uZWRUcmFuc2FjdGlvbi5zZXJpYWxpemUoKSBkb2Vzbid0IG5lZWQgcmVxdWlyZUFsbFNpZ25hdHVyZXMgcGFyYW1ldGVyXG4gICAgICAvLyBJdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgd2hhdGV2ZXIgc2lnbmF0dXJlcyBhcmUgcHJlc2VudFxuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLnNlcmlhbGl6ZSgpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgLy8gVGhlIHNpZ25hdHVyZXMgY2FuIGhhdmUgbnVsbCBzaWduYXR1cmVzICh3aGljaCBtZWFucyB0aGV5IGFyZSByZXF1aXJlZCBidXQgeWV0IHVuc2lnbmVkKVxuICAgIC8vIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gc2VyaWFsaXplciB0aGUgdHhzLCB3ZSBoYXZlIHRvIGNoYW5nZSB0aGUgcmVxdWlyZUFsbFNpZ25hdHVyZXMgYmFzZWRcbiAgICAvLyBvbiBpZiB0aGUgVFggaXMgZnVsbHkgc2lnbmVkIG9yIG5vdFxuICAgIGNvbnN0IHJlcXVpcmVBbGxTaWduYXR1cmVzID0gcmVxdWlyZXNBbGxTaWduYXR1cmVzKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZXMpO1xuICAgIC8vIEJhc2VkIG9uIHRoZSByZWNvbWVuZGF0aW9uIGVuY29kaW5nIGZvdW5kIGhlcmUgaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vZGV2ZWxvcGluZy9jbGllbnRzL2pzb25ycGMtYXBpI3NlbmR0cmFuc2FjdGlvblxuICAgIC8vIFdlIHVzZSBiYXNlNjQgZW5jb2RpbmdcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgcmVxdWlyZUFsbFNpZ25hdHVyZXMgfSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhpcyB0cmFuc2FjdGlvbiBwYXlsb2FkXG4gICAqXG4gICAqIEBwYXJhbSByYXdUcmFuc2FjdGlvblxuICAgKi9cbiAgZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uID0gU29sVHJhbnNhY3Rpb24uZnJvbShCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2Jhc2U2NCcpKTtcbiAgICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUgJiYgdGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2lkID0gYmFzZTU4LmVuY29kZSh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25UeXBlID0gZ2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMuX3NvbFRyYW5zYWN0aW9uKTtcbiAgICAgIHN3aXRjaCAodHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplUmF3OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplUmF3KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Db25maWRlbnRpYWxUcmFuc2ZlcjpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQ29uZmlkZW50aWFsVHJhbnNmZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHRyYW5zYWN0aW9uVHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXcpIHtcbiAgICAgICAgdGhpcy5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgbGV0IGR1cmFibGVOb25jZTogRHVyYWJsZU5vbmNlUGFyYW1zIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8pIHtcbiAgICAgIGNvbnN0IG5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UodGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvLm5vbmNlSW5zdHJ1Y3Rpb24pO1xuICAgICAgZHVyYWJsZU5vbmNlID0ge1xuICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IG5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICAgICAgdGhpcy5fdHlwZSxcbiAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucyxcbiAgICAgIHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEsXG4gICAgICB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWVcbiAgICApO1xuICAgIGlmICh0aGlzLl90eXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFkdXJhYmxlTm9uY2UgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhWzBdLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZVxuICAgICAgKSB7XG4gICAgICAgIGR1cmFibGVOb25jZSA9IGluc3RydWN0aW9uRGF0YVswXS5wYXJhbXM7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogVHhEYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSA/IHRoaXMuaWQgOiB1bmRlZmluZWQsXG4gICAgICBmZWVQYXllcjogdGhpcy5fc29sVHJhbnNhY3Rpb24uZmVlUGF5ZXI/LnRvU3RyaW5nKCksXG4gICAgICBsYW1wb3J0c1BlclNpZ25hdHVyZTogdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSxcbiAgICAgIG5vbmNlOiB0aGlzLmdldE5vbmNlKCksXG4gICAgICBkdXJhYmxlTm9uY2U6IGR1cmFibGVOb25jZSxcbiAgICAgIG51bVNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlLmxlbmd0aCxcbiAgICAgIGluc3RydWN0aW9uc0RhdGE6IGluc3RydWN0aW9uRGF0YSxcbiAgICB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBub25jZSBmcm9tIHRoZSBTb2xhbmEgVHJhbnNhY3Rpb25cbiAgICogVGhyb3dzIGlmIG5vdCBzZXRcbiAgICovXG4gIHByaXZhdGUgZ2V0Tm9uY2UoKTogQmxvY2toYXNoIHtcbiAgICBpZiAodGhpcy5fc29sVHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvLm5vbmNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ05vbmNlIGlzIG5vdCBzZXQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG9uIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBsb2FkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uIHx8IHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dHM6IEVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBpbnB1dHM6IEVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBpbnN0cnVjdGlvblBhcmFtcyA9IGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShcbiAgICAgIHRoaXMudHlwZSxcbiAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucyxcbiAgICAgIHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEsXG4gICAgICB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWVcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvblBhcmFtcykge1xuICAgICAgc3dpdGNoIChpbnN0cnVjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50OlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyOlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ1R5cGUgIT09IFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPKSB7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCAmJlxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnVuc3Rha2luZ0FkZHJlc3MgJiZcbiAgICAgICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nVHlwZSAhPT0gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE9cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMudW5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldENvbXB1dGVVbml0TGltaXQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0UHJpb3JpdHlGZWU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb246XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMgPSBvdXRwdXRzO1xuICAgIHRoaXMuX2lucHV0cyA9IGlucHV0cztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgLy8gVGVzdG5ldCB1c2VzIFdBU00tYmFzZWQgcGFyc2luZyAobm8gQHNvbGFuYS93ZWIzLmpzIGRlcGVuZGVuY3kpLlxuICAgIC8vIFRoaXMgdmFsaWRhdGVzIHRoZSBXQVNNIHBhdGggYWdhaW5zdCBwcm9kdWN0aW9uIHRyYWZmaWMgYmVmb3JlXG4gICAgLy8gcmVwbGFjaW5nIHRoZSBsZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBuZXR3b3Jrcy5cbiAgICBpZiAodGhpcy5fY29pbkNvbmZpZy5uYW1lID09PSAndHNvbCcpIHtcbiAgICAgIC8vIGV4cGxhaW5UcmFuc2FjdGlvbiBzaG91bGQgd29yayBvbiB1bnNpZ25lZC9wYXJ0aWFsbHktc2lnbmVkIHRyYW5zYWN0aW9uc1xuICAgICAgLy8gKGUuZy4sIGR1cmluZyBwYXJzZVRyYW5zYWN0aW9uIHJvdW5kLXRyaXBzIHdoZXJlIG51bGwgc2lnbmF0dXJlcyBiZWNvbWVcbiAgICAgIC8vIHplcm8tZmlsbGVkIGJ1ZmZlcnMpLiBVc2Ugc2VyaWFsaXplIHdpdGhvdXQgc2lnbmF0dXJlIHZhbGlkYXRpb24gc2luY2VcbiAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byByZWFkIHRoZSB0cmFuc2FjdGlvbiwgbm90IGJyb2FkY2FzdCBpdC5cbiAgICAgIGNvbnN0IHR4QmFzZTY0ID0gQnVmZmVyLmZyb20oXG4gICAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlLCByZXF1aXJlQWxsU2lnbmF0dXJlczogZmFsc2UgfSlcbiAgICAgICkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgcmV0dXJuIGV4cGxhaW5Tb2xUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4QmFzZTY0LFxuICAgICAgICBmZWVJbmZvOiB0aGlzLl9sYW1wb3J0c1BlclNpZ25hdHVyZSA/IHsgZmVlOiB0aGlzLl9sYW1wb3J0c1BlclNpZ25hdHVyZS50b1N0cmluZygpIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ6IHRoaXMuX3Rva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQsXG4gICAgICAgIGNvaW5OYW1lOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVSYXdNc2dJbnN0cnVjdGlvbih0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leHBsYWluUmF3TXNnQXV0aG9yaXplVHJhbnNhY3Rpb24oKTtcbiAgICB9XG4gICAgY29uc3QgZGVjb2RlZEluc3RydWN0aW9ucyA9IGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShcbiAgICAgIHRoaXMuX3R5cGUsXG4gICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMsXG4gICAgICB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhLFxuICAgICAgdGhpcy5fdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lXG4gICAgKTtcblxuICAgIGxldCBtZW1vOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGR1cmFibGVOb25jZTogRHVyYWJsZU5vbmNlUGFyYW1zIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgbGV0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IFtdO1xuICAgIC8vIENyZWF0ZSBhIHNlcGFyYXRlIGFycmF5IGZvciB0b2tlbiBlbmFibGVtZW50c1xuICAgIGNvbnN0IHRva2VuRW5hYmxlbWVudHM6IElUb2tlbkVuYWJsZW1lbnRbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBkZWNvZGVkSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBzd2l0Y2ggKGluc3RydWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2U6XG4gICAgICAgICAgZHVyYWJsZU5vbmNlID0gKGluc3RydWN0aW9uIGFzIE5vbmNlKS5wYXJhbXM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbzpcbiAgICAgICAgICBtZW1vID0gKGluc3RydWN0aW9uIGFzIE1lbW8pLnBhcmFtcy5tZW1vO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRyYW5zZmVyOlxuICAgICAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBUcmFuc2ZlcjtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXModHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyOlxuICAgICAgICAgIGNvbnN0IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFRva2VuVHJhbnNmZXI7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlTm9uY2VBY2NvdW50OlxuICAgICAgICAgIGNvbnN0IGNyZWF0ZUluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgV2FsbGV0SW5pdDtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogY3JlYXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLm5vbmNlQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogY3JlYXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQucGx1cyhjcmVhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgICAgY29uc3Qgc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBTdGFraW5nQWN0aXZhdGU7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQucGx1cyhzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBTdGFraW5nV2l0aGRyYXc7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQucGx1cyhzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICAgIC8vIFByb2Nlc3MgdG9rZW4gZW5hYmxlbWVudCBpbnN0cnVjdGlvbnMgYW5kIGNvbGxlY3QgdGhlbSBpbiB0aGUgdG9rZW5FbmFibGVtZW50cyBhcnJheVxuICAgICAgICAgIGNvbnN0IGF0YUluaXQgPSBpbnN0cnVjdGlvbiBhcyBBdGFJbml0O1xuICAgICAgICAgIHRva2VuRW5hYmxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBhdGFJbml0LnBhcmFtcy5hdGFBZGRyZXNzLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBhdGFJbml0LnBhcmFtcy50b2tlbk5hbWUsXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6IGF0YUluaXQucGFyYW1zLm1pbnRBZGRyZXNzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uOlxuICAgICAgICAgIC8vIEN1c3RvbSBpbnN0cnVjdGlvbnMgYXJlIGFyYml0cmFyeSBhbmQgY2Fubm90IGJlIGV4cGxhaW5lZFxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciBkZXNlcmlhbGl6aW5nIGEgdHJhbnNhY3Rpb24sIGR1cmFibGUgbm9uY2UgZGV0YWlscyBhcmUgcG9wdWxhdGVkIGluIHRoZSBub25jZUluZm8gZmllbGRcbiAgICAgIGlmICghZHVyYWJsZU5vbmNlICYmIHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mbykge1xuICAgICAgICBjb25zdCBub25jZUFkdmFuY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShcbiAgICAgICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2VJbnN0cnVjdGlvblxuICAgICAgICApO1xuICAgICAgICBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RXhwbGFpbmVkVHJhbnNhY3Rpb24ob3V0cHV0QW1vdW50LCBvdXRwdXRzLCBtZW1vLCBkdXJhYmxlTm9uY2UsIHRva2VuRW5hYmxlbWVudHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVGZWUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSB8fCB0aGlzLnRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZUZlZXMgPSB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlXG4gICAgICAgID8gbmV3IEJpZ051bWJlcih0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlKS5tdWx0aXBsaWVkQnkodGhpcy5udW1iZXJPZlJlcXVpcmVkU2lnbmF0dXJlcykudG9GaXhlZCgwKVxuICAgICAgICA6IDA7XG4gICAgICBjb25zdCByZW50RmVlcyA9IHRoaXMudG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudFxuICAgICAgICA/IG5ldyBCaWdOdW1iZXIodGhpcy50b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50KS5tdWx0aXBsaWVkQnkodGhpcy5udW1iZXJPZkFUQUNyZWF0aW9uSW5zdHJ1Y3Rpb25zKS50b0ZpeGVkKDApXG4gICAgICAgIDogMDtcbiAgICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKHNpZ25hdHVyZUZlZXMpLnBsdXMocmVudEZlZXMpLnRvRml4ZWQoMCk7XG4gICAgfVxuICAgIHJldHVybiBVTkFWQUlMQUJMRV9URVhUO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEV4cGxhaW5lZFRyYW5zYWN0aW9uKFxuICAgIG91dHB1dEFtb3VudDogQmlnTnVtYmVyLFxuICAgIG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10sXG4gICAgbWVtbzogdW5kZWZpbmVkIHwgc3RyaW5nID0gdW5kZWZpbmVkLFxuICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkIHwgRHVyYWJsZU5vbmNlUGFyYW1zID0gdW5kZWZpbmVkLFxuICAgIHRva2VuRW5hYmxlbWVudHM6IElUb2tlbkVuYWJsZW1lbnRbXSA9IFtdXG4gICk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IGZlZVN0cmluZyA9IHRoaXMuY2FsY3VsYXRlRmVlKCk7XG5cbiAgICAvLyBDcmVhdGUgZGlzcGxheU9yZGVyIHdpdGggdG9rZW5FbmFibGVtZW50cyBhbHdheXMgaW5jbHVkZWRcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAnb3V0cHV0cycsXG4gICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAnZmVlJyxcbiAgICAgICdtZW1vJyxcbiAgICBdO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBiYXNlIGV4cGxhbmF0aW9uIG9iamVjdCB3aXRoIHRva2VuRW5hYmxlbWVudHMgYWx3YXlzIGluY2x1ZGVkXG4gICAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZVt0aGlzLnR5cGVdLnRvU3RyaW5nKCksXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgb3V0cHV0QW1vdW50OiBvdXRwdXRBbW91bnQudG9GaXhlZCgwKSxcbiAgICAgIG91dHB1dHM6IG91dHB1dHMsXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiBmZWVTdHJpbmcsXG4gICAgICAgIGZlZVJhdGU6IHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUsXG4gICAgICB9LFxuICAgICAgbWVtbzogbWVtbyxcbiAgICAgIGJsb2NraGFzaDogdGhpcy5nZXROb25jZSgpLFxuICAgICAgZHVyYWJsZU5vbmNlOiBkdXJhYmxlTm9uY2UsXG4gICAgICB0b2tlbkVuYWJsZW1lbnRzOiB0b2tlbkVuYWJsZW1lbnRzLFxuICAgIH07XG5cbiAgICByZXR1cm4gZXhwbGFuYXRpb247XG4gIH1cblxuICBwcml2YXRlIGV4cGxhaW5SYXdNc2dBdXRob3JpemVUcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB7IGluc3RydWN0aW9ucyB9ID0gdGhpcy5fc29sVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgbm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbnNbMF0pO1xuICAgIGNvbnN0IGR1cmFibGVOb25jZSA9IHtcbiAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IG5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgIH07XG4gICAgY29uc3QgZGF0YSA9IGluc3RydWN0aW9uc1sxXS5kYXRhLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzdGFraW5nQXV0aG9yaXplUGFyYW1zOiBTdGFraW5nQXV0aG9yaXplUGFyYW1zID1cbiAgICAgIGRhdGEgPT09IHZhbGlkSW5zdHJ1Y3Rpb25EYXRhXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb2xkV2l0aGRyYXdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld1dpdGhkcmF3QWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBjdXN0b2RpYW5BZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgb2xkV2l0aGRyYXdBZGRyZXNzOiAnJyxcbiAgICAgICAgICAgIG5ld1dpdGhkcmF3QWRkcmVzczogJycsXG4gICAgICAgICAgICBvbGRTdGFraW5nQXV0aG9yaXR5QWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdTdGFraW5nQXV0aG9yaXR5QWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfTtcbiAgICBjb25zdCBmZWVTdHJpbmcgPSB0aGlzLmNhbGN1bGF0ZUZlZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgJ2ZlZScsXG4gICAgICAgICdtZW1vJyxcbiAgICAgIF0sXG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZVt0aGlzLnR5cGVdLnRvU3RyaW5nKCksXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgb3V0cHV0QW1vdW50OiAwLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiBmZWVTdHJpbmcsXG4gICAgICAgIGZlZVJhdGU6IHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUsXG4gICAgICB9LFxuICAgICAgYmxvY2toYXNoOiB0aGlzLmdldE5vbmNlKCksXG4gICAgICBkdXJhYmxlTm9uY2U6IGR1cmFibGVOb25jZSxcbiAgICAgIHN0YWtpbmdBdXRob3JpemU6IHN0YWtpbmdBdXRob3JpemVQYXJhbXMsXG4gICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSwgLy8gQWx3YXlzIGluY2x1ZGUgdG9rZW5FbmFibGVtZW50cyBhcyBhbiBlbXB0eSBhcnJheSBmb3IgY29uc2lzdGVuY3lcbiAgICB9O1xuICB9XG59XG4iXX0=