@bitgo-beta/sdk-coin-sol 7.6.4-beta.74 → 7.6.4-beta.741

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 (532) 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 +231 -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 +128 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +311 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +96 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +276 -0
  17. package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +13 -2
  18. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/customInstructionBuilder.js +392 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
  23. package/dist/cjs/src/lib/iface.d.ts +526 -0
  24. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/iface.js +7 -0
  26. package/dist/{src → cjs/src}/lib/index.d.ts +9 -0
  27. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/index.js +106 -0
  29. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  30. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/instructionParamsFactory.js +1280 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  34. package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
  35. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/keyPair.js +112 -0
  37. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  38. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  39. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  40. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  42. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  44. package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
  45. package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
  47. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  48. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  50. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  51. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  53. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
  54. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
  56. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +36 -0
  57. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  58. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +211 -0
  59. package/dist/cjs/src/lib/serialization/index.d.ts +5 -0
  60. package/dist/cjs/src/lib/serialization/index.d.ts.map +1 -0
  61. package/dist/cjs/src/lib/serialization/index.js +27 -0
  62. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  63. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  64. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  65. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  66. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  68. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  69. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
  71. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
  73. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  75. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
  77. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
  79. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  80. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  81. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  82. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
  83. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  84. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  85. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  86. package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
  87. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  88. package/dist/cjs/src/lib/tokenExtensions.js +109 -0
  89. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  90. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  91. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  92. package/dist/{src → cjs/src}/lib/transaction.d.ts +34 -1
  93. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  94. package/dist/cjs/src/lib/transaction.js +704 -0
  95. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +42 -1
  96. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  97. package/dist/cjs/src/lib/transactionBuilder.js +462 -0
  98. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +37 -0
  99. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  100. package/dist/cjs/src/lib/transactionBuilderFactory.js +249 -0
  101. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  102. package/dist/cjs/src/lib/transferBuilder.js +81 -0
  103. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  104. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  105. package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
  106. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  107. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  108. package/dist/cjs/src/lib/utils.js +665 -0
  109. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts +21 -0
  110. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  111. package/dist/cjs/src/lib/v1CustomInstructionBuilder.js +28 -0
  112. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts +36 -0
  113. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts.map +1 -0
  114. package/dist/cjs/src/lib/v1PaymentBuilder.js +70 -0
  115. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts +253 -0
  116. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts.map +1 -0
  117. package/dist/cjs/src/lib/v1TransactionBuilder.js +601 -0
  118. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  119. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  120. package/dist/cjs/src/register.d.ts +5 -0
  121. package/dist/cjs/src/register.d.ts.map +1 -0
  122. package/dist/cjs/src/register.js +29 -0
  123. package/dist/{src → cjs/src}/sol.d.ts +114 -3
  124. package/dist/cjs/src/sol.d.ts.map +1 -0
  125. package/dist/cjs/src/sol.js +1697 -0
  126. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  127. package/dist/cjs/src/solToken.d.ts.map +1 -0
  128. package/dist/cjs/src/solToken.js +79 -0
  129. package/dist/cjs/src/tsol.d.ts.map +1 -0
  130. package/dist/cjs/src/tsol.js +24 -0
  131. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  132. package/dist/cjs/test/fixtures/sol.js +1433 -0
  133. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  134. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  135. package/dist/cjs/test/resources/sol.js +320 -0
  136. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  137. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  139. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  140. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  141. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  142. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  143. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  144. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  145. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  146. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  147. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  148. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  150. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  151. package/dist/cjs/test/unit/keyPair.js +177 -0
  152. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  153. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  154. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  155. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  156. package/dist/cjs/test/unit/register.d.ts +2 -0
  157. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  158. package/dist/cjs/test/unit/register.js +65 -0
  159. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  160. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  162. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  163. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  164. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  165. package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
  166. package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
  167. package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
  168. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  169. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  170. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  171. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  172. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  174. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  175. package/dist/cjs/test/unit/sol.js +5364 -0
  176. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  177. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  178. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  179. package/dist/cjs/test/unit/solToken.js +37 -0
  180. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  181. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  182. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  183. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  184. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  185. package/dist/cjs/test/unit/tokenExtensions.js +73 -0
  186. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  187. package/dist/cjs/test/unit/transaction.js +1129 -0
  188. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  189. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  190. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  192. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  193. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  194. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  195. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  196. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  198. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  199. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  200. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
  201. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  202. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
  204. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  205. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  206. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
  207. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  208. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
  209. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  210. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  211. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  212. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  213. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  214. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  215. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  216. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  217. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  218. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  219. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  220. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  221. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  222. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  223. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  224. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  225. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  226. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  227. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
  228. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
  229. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
  230. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
  231. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
  232. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
  233. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  234. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  235. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  236. package/dist/cjs/test/unit/utils.js +628 -0
  237. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  239. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  240. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  241. package/dist/esm/index.d.ts +7 -0
  242. package/dist/esm/index.js +7 -0
  243. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  244. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  245. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  246. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  247. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  248. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  249. package/dist/esm/lib/confidentialTransferBuilder.d.ts +128 -0
  250. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  251. package/dist/esm/lib/confidentialTransferBuilder.js +304 -0
  252. package/dist/esm/lib/constants.d.ts +234 -0
  253. package/dist/esm/lib/constants.d.ts.map +1 -0
  254. package/dist/esm/lib/constants.js +273 -0
  255. package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
  256. package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
  257. package/dist/esm/lib/customInstructionBuilder.js +385 -0
  258. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  259. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  260. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  261. package/dist/esm/lib/iface.d.ts +526 -0
  262. package/dist/esm/lib/iface.d.ts.map +1 -0
  263. package/dist/esm/lib/iface.js +3 -0
  264. package/dist/esm/lib/index.d.ts +31 -0
  265. package/dist/esm/lib/index.d.ts.map +1 -0
  266. package/dist/esm/lib/index.js +31 -0
  267. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  268. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  269. package/dist/esm/lib/instructionParamsFactory.js +1272 -0
  270. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  271. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  272. package/dist/esm/lib/keyPair.d.ts +32 -0
  273. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  274. package/dist/esm/lib/keyPair.js +75 -0
  275. package/dist/esm/lib/messages/index.d.ts +2 -0
  276. package/dist/esm/lib/messages/index.js +2 -0
  277. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  278. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  279. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  280. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  281. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  282. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  283. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  284. package/dist/esm/lib/scaledUiAmount.js +108 -0
  285. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  286. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  287. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  288. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  289. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  290. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  291. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  292. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  293. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  294. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
  295. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  296. package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
  297. package/dist/esm/lib/serialization/index.d.ts +5 -0
  298. package/dist/esm/lib/serialization/index.d.ts.map +1 -0
  299. package/dist/esm/lib/serialization/index.js +5 -0
  300. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  301. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  302. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  303. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  304. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  305. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  306. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  307. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  308. package/dist/esm/lib/solInstructionFactory.js +1088 -0
  309. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  310. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  311. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  312. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  313. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  314. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  315. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  316. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  317. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  318. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  319. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  320. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  321. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  322. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  323. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  324. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  325. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  326. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  327. package/dist/esm/lib/token2022Resolve.js +194 -0
  328. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  329. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  330. package/dist/esm/lib/tokenExtensions.js +103 -0
  331. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  332. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  333. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  334. package/dist/esm/lib/transaction.d.ts +136 -0
  335. package/dist/esm/lib/transaction.d.ts.map +1 -0
  336. package/dist/esm/lib/transaction.js +697 -0
  337. package/dist/esm/lib/transactionBuilder.d.ts +169 -0
  338. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  339. package/dist/esm/lib/transactionBuilder.js +455 -0
  340. package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
  341. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  342. package/dist/esm/lib/transactionBuilderFactory.js +245 -0
  343. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  344. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  345. package/dist/esm/lib/transferBuilder.js +74 -0
  346. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  347. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  348. package/dist/esm/lib/transferBuilderV2.js +245 -0
  349. package/dist/esm/lib/utils.d.ts +205 -0
  350. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  351. package/dist/esm/lib/utils.js +627 -0
  352. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +21 -0
  353. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  354. package/dist/esm/lib/v1CustomInstructionBuilder.js +24 -0
  355. package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
  356. package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
  357. package/dist/esm/lib/v1PaymentBuilder.js +63 -0
  358. package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
  359. package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
  360. package/dist/esm/lib/v1TransactionBuilder.js +591 -0
  361. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  362. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  363. package/dist/esm/register.d.ts +5 -0
  364. package/dist/esm/register.d.ts.map +1 -0
  365. package/dist/esm/register.js +24 -0
  366. package/dist/esm/sol.d.ts +351 -0
  367. package/dist/esm/sol.d.ts.map +1 -0
  368. package/dist/esm/sol.js +1656 -0
  369. package/dist/esm/solToken.d.ts +44 -0
  370. package/dist/esm/solToken.d.ts.map +1 -0
  371. package/dist/esm/solToken.js +75 -0
  372. package/dist/esm/tsol.d.ts +11 -0
  373. package/dist/esm/tsol.js +20 -0
  374. package/package.json +37 -17
  375. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  376. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  377. package/dist/src/config/token2022StaticConfig.js +0 -50
  378. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  379. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  380. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  381. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  382. package/dist/src/lib/closeAtaBuilder.js +0 -69
  383. package/dist/src/lib/constants.d.ts.map +0 -1
  384. package/dist/src/lib/constants.js +0 -171
  385. package/dist/src/lib/customInstructionBuilder.js +0 -289
  386. package/dist/src/lib/iface.d.ts +0 -244
  387. package/dist/src/lib/iface.d.ts.map +0 -1
  388. package/dist/src/lib/iface.js +0 -7
  389. package/dist/src/lib/index.d.ts.map +0 -1
  390. package/dist/src/lib/index.js +0 -77
  391. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  392. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  393. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  394. package/dist/src/lib/keyPair.d.ts.map +0 -1
  395. package/dist/src/lib/keyPair.js +0 -63
  396. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  397. package/dist/src/lib/solInstructionFactory.js +0 -572
  398. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  399. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  400. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  401. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  402. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  403. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  404. package/dist/src/lib/token2022Config.d.ts +0 -44
  405. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  406. package/dist/src/lib/token2022Config.js +0 -27
  407. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  408. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  409. package/dist/src/lib/transaction.d.ts.map +0 -1
  410. package/dist/src/lib/transaction.js +0 -595
  411. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  412. package/dist/src/lib/transactionBuilder.js +0 -380
  413. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  414. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  415. package/dist/src/lib/transferBuilder.js +0 -70
  416. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  417. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  418. package/dist/src/lib/transferBuilderV2.js +0 -210
  419. package/dist/src/lib/utils.js +0 -589
  420. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  421. package/dist/src/register.d.ts +0 -3
  422. package/dist/src/register.d.ts.map +0 -1
  423. package/dist/src/register.js +0 -15
  424. package/dist/src/sol.d.ts.map +0 -1
  425. package/dist/src/sol.js +0 -1324
  426. package/dist/src/solToken.d.ts.map +0 -1
  427. package/dist/src/solToken.js +0 -69
  428. package/dist/src/tsol.js +0 -24
  429. package/dist/test/fixtures/sol.js +0 -1433
  430. package/dist/test/resources/sol.d.ts.map +0 -1
  431. package/dist/test/resources/sol.js +0 -320
  432. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  433. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  434. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  435. package/dist/test/unit/getBuilderFactory.js +0 -10
  436. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  437. package/dist/test/unit/instructionParamsFactory.js +0 -412
  438. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  439. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  440. package/dist/test/unit/keyPair.js +0 -177
  441. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  442. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  443. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  444. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  445. package/dist/test/unit/sol.js +0 -3180
  446. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  447. package/dist/test/unit/solInstructionFactory.js +0 -454
  448. package/dist/test/unit/solToken.d.ts.map +0 -1
  449. package/dist/test/unit/solToken.js +0 -31
  450. package/dist/test/unit/transaction.d.ts.map +0 -1
  451. package/dist/test/unit/transaction.js +0 -983
  452. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  453. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  454. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  455. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  456. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  457. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  458. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  459. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  460. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  461. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  462. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  463. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  464. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  465. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  466. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  467. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  468. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  469. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  470. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  471. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  472. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  473. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  474. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  475. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  476. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  477. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  478. package/dist/test/unit/utils.js +0 -517
  479. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  480. package/dist/test/unit/versionedTransaction.js +0 -207
  481. package/dist/tsconfig.tsbuildinfo +0 -1
  482. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  483. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  484. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  485. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  486. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  487. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  488. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  489. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  490. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  491. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  492. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  493. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  494. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  495. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  496. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  497. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  498. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  499. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  500. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  501. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  502. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  503. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  504. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  505. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  506. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  507. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  508. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  509. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  510. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  511. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  512. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  513. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  514. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  515. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  516. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  517. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  518. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  519. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  520. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  521. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  522. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  523. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  524. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  525. /package/dist/{src → esm}/index.d.ts.map +0 -0
  526. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  527. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  528. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  529. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  530. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  531. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  532. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,601 @@
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.V1TransactionBuilder = void 0;
7
+ exports.buildAdvanceNonceAccountInstruction = buildAdvanceNonceAccountInstruction;
8
+ exports.toV1TransactionInstruction = toV1TransactionInstruction;
9
+ exports.injectV1NonceAdvanceInstruction = injectV1NonceAdvanceInstruction;
10
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
11
+ const web3_js_1 = require("@solana/web3.js");
12
+ const bs58_1 = __importDefault(require("bs58"));
13
+ const tweetnacl_1 = __importDefault(require("tweetnacl"));
14
+ const assert_1 = __importDefault(require("assert"));
15
+ const transaction_1 = require("./transaction");
16
+ const constants_1 = require("./constants");
17
+ const solInstructionFactory_1 = require("./solInstructionFactory");
18
+ const compileTransactionMessage_1 = require("./serialization/compileTransactionMessage");
19
+ const wire_transaction_1 = require("./serialization/wire-transaction");
20
+ const parseWireTransaction_1 = require("./serialization/parseWireTransaction");
21
+ const message_1 = require("./serialization/codecs/v1/message");
22
+ const utils_1 = require("./utils");
23
+ const keyPair_1 = require("./keyPair");
24
+ /**
25
+ * Construct an AdvanceNonceAccount instruction for a durable nonce.
26
+ *
27
+ * The v0 path receives this instruction from web3.js / the Rust wasm core
28
+ * (`NonceSource` durable variant); the v1 path compiles via
29
+ * `compileTransactionMessage`, so the nonce instruction must be constructed in
30
+ * TypeScript and injected into the compile input. The nonce authority
31
+ * (`authWalletAddress`) MUST sign the instruction — it becomes a required
32
+ * signer of the compiled message.
33
+ *
34
+ * @param nonceAddress - the durable nonce account address
35
+ * @param authWalletAddress - the nonce authority (gas-tank root in BitGo's model)
36
+ * @returns the AdvanceNonceAccount instruction
37
+ */
38
+ function buildAdvanceNonceAccountInstruction(nonceAddress, authWalletAddress) {
39
+ (0, assert_1.default)(nonceAddress, 'Missing nonceAddress param');
40
+ (0, assert_1.default)(authWalletAddress, 'Missing authWalletAddress param');
41
+ return web3_js_1.SystemProgram.nonceAdvance({
42
+ noncePubkey: new web3_js_1.PublicKey(nonceAddress),
43
+ authorizedPubkey: new web3_js_1.PublicKey(authWalletAddress),
44
+ });
45
+ }
46
+ /**
47
+ * Map a v1 envelope instruction (index-based) into a web3.js TransactionInstruction
48
+ * (address-based), deriving each referenced account's signer/writable role from the
49
+ * message header (Solana role conventions: the last `numReadonlySignedAccounts`
50
+ * signers and last `numReadonlyUnsignedAccounts` non-signers are readonly).
51
+ *
52
+ * @param instruction - the envelope instruction (programIdIndex/accountKeyIndexes/data)
53
+ * @param data - the v1 envelope
54
+ * @returns the address-based instruction, ready for V1TransactionBuilder.addInstruction
55
+ */
56
+ function toV1TransactionInstruction(instruction, data) {
57
+ const { staticAccountKeys, messageHeader } = data;
58
+ const numRequiredSignatures = messageHeader.numRequiredSignatures;
59
+ const numAccounts = staticAccountKeys.length;
60
+ const isSigner = (index) => index < numRequiredSignatures;
61
+ const isWritable = (index) => isSigner(index)
62
+ ? index < numRequiredSignatures - messageHeader.numReadonlySignedAccounts
63
+ : index < numAccounts - messageHeader.numReadonlyUnsignedAccounts;
64
+ return new web3_js_1.TransactionInstruction({
65
+ programId: new web3_js_1.PublicKey(staticAccountKeys[instruction.programIdIndex]),
66
+ keys: instruction.accountKeyIndexes.map((accountIndex) => ({
67
+ pubkey: new web3_js_1.PublicKey(staticAccountKeys[accountIndex]),
68
+ isSigner: isSigner(accountIndex),
69
+ isWritable: isWritable(accountIndex),
70
+ })),
71
+ data: Buffer.from(bs58_1.default.decode(instruction.data)),
72
+ });
73
+ }
74
+ /**
75
+ * Inject an AdvanceNonceAccount instruction into a v1 envelope for durable nonce.
76
+ *
77
+ * v1 (SIMD-0296/0385) has no address lookup tables, so every account is a static
78
+ * key. The nonce authority MUST sign the AdvanceNonceAccount instruction (hard
79
+ * runtime requirement) and the nonce account MUST be writable; the system program
80
+ * and recent-blockhashes sysvar are readonly non-signers. The instruction is
81
+ * prepended and every instruction's account indexes are remapped to the rebuilt
82
+ * static key list; messageHeader grows accordingly so the wire-size estimate and
83
+ * account caps are correct.
84
+ *
85
+ * @param data - the v1 envelope (client-supplied, no nonce instruction)
86
+ * @param durableNonceParams - walletNonceAddress + authWalletAddress (gas-tank root)
87
+ * @returns a copy of the envelope with the nonce instruction injected
88
+ * @edge if the envelope already contains an AdvanceNonceAccount instruction, returns
89
+ * the envelope unchanged (idempotent - a durable-aware client may supply it)
90
+ */
91
+ function injectV1NonceAdvanceInstruction(data, durableNonceParams) {
92
+ const { walletNonceAddress, authWalletAddress } = durableNonceParams;
93
+ const SYSTEM_PROGRAM = web3_js_1.SystemProgram.programId.toBase58();
94
+ const SYSVAR_RECENT_BLOCKHASHES = web3_js_1.SYSVAR_RECENT_BLOCKHASHES_PUBKEY.toBase58();
95
+ // Idempotence: a durable-aware client may already include the nonce instruction.
96
+ const hasNonceAdvance = data.versionedInstructions.some((instruction) => {
97
+ const program = data.staticAccountKeys[instruction.programIdIndex];
98
+ return program === SYSTEM_PROGRAM && Buffer.from(bs58_1.default.decode(instruction.data))[0] === 4;
99
+ });
100
+ if (hasNonceAdvance) {
101
+ return data;
102
+ }
103
+ const { numRequiredSignatures, numReadonlySignedAccounts, numReadonlyUnsignedAccounts } = data.messageHeader;
104
+ const oldStaticLen = data.staticAccountKeys.length;
105
+ if (numReadonlySignedAccounts > numRequiredSignatures ||
106
+ numRequiredSignatures + numReadonlyUnsignedAccounts > oldStaticLen) {
107
+ throw new sdk_core_1.BuildTransactionError(`Invalid message header: readonly counts (${numReadonlySignedAccounts}, ${numReadonlyUnsignedAccounts}) ` +
108
+ `are inconsistent with ${numRequiredSignatures} required signatures and ${oldStaticLen} static account keys`);
109
+ }
110
+ // Split the static keys into the four v1 header sections.
111
+ const writableSigners = data.staticAccountKeys.slice(0, numRequiredSignatures - numReadonlySignedAccounts);
112
+ const readonlySigners = data.staticAccountKeys.slice(numRequiredSignatures - numReadonlySignedAccounts, numRequiredSignatures);
113
+ const writableNonSigners = data.staticAccountKeys.slice(numRequiredSignatures, oldStaticLen - numReadonlyUnsignedAccounts);
114
+ const readonlyNonSigners = data.staticAccountKeys.slice(oldStaticLen - numReadonlyUnsignedAccounts);
115
+ // The nonce authority must be a signer for AdvanceNonceAccount.
116
+ const authorityIsSigner = writableSigners.includes(authWalletAddress) || readonlySigners.includes(authWalletAddress);
117
+ if (!authorityIsSigner) {
118
+ const asReadonlyNonSigner = readonlyNonSigners.indexOf(authWalletAddress);
119
+ const asWritableNonSigner = writableNonSigners.indexOf(authWalletAddress);
120
+ if (asReadonlyNonSigner >= 0) {
121
+ readonlyNonSigners.splice(asReadonlyNonSigner, 1);
122
+ readonlySigners.push(authWalletAddress);
123
+ }
124
+ else if (asWritableNonSigner >= 0) {
125
+ writableNonSigners.splice(asWritableNonSigner, 1);
126
+ writableSigners.push(authWalletAddress);
127
+ }
128
+ else {
129
+ readonlySigners.push(authWalletAddress);
130
+ }
131
+ }
132
+ // The nonce account must be writable for AdvanceNonceAccount.
133
+ const nonceAsReadonlyNonSigner = readonlyNonSigners.indexOf(walletNonceAddress);
134
+ const nonceAsReadonlySigner = readonlySigners.indexOf(walletNonceAddress);
135
+ if (nonceAsReadonlyNonSigner >= 0) {
136
+ readonlyNonSigners.splice(nonceAsReadonlyNonSigner, 1);
137
+ writableNonSigners.push(walletNonceAddress);
138
+ }
139
+ else if (nonceAsReadonlySigner >= 0) {
140
+ readonlySigners.splice(nonceAsReadonlySigner, 1);
141
+ writableSigners.push(walletNonceAddress);
142
+ }
143
+ else if (!writableSigners.includes(walletNonceAddress) && !writableNonSigners.includes(walletNonceAddress)) {
144
+ writableNonSigners.push(walletNonceAddress);
145
+ }
146
+ // The system program and recent-blockhashes sysvar are readonly non-signers.
147
+ const isPresent = (key) => writableSigners.includes(key) ||
148
+ readonlySigners.includes(key) ||
149
+ writableNonSigners.includes(key) ||
150
+ readonlyNonSigners.includes(key);
151
+ if (!isPresent(SYSTEM_PROGRAM)) {
152
+ readonlyNonSigners.push(SYSTEM_PROGRAM);
153
+ }
154
+ if (!isPresent(SYSVAR_RECENT_BLOCKHASHES)) {
155
+ readonlyNonSigners.push(SYSVAR_RECENT_BLOCKHASHES);
156
+ }
157
+ const newStaticAccountKeys = [...writableSigners, ...readonlySigners, ...writableNonSigners, ...readonlyNonSigners];
158
+ // Remap every instruction index to the new key order (v1 has no lookup tables).
159
+ const indexMap = new Map();
160
+ data.staticAccountKeys.forEach((key, oldIdx) => indexMap.set(oldIdx, newStaticAccountKeys.indexOf(key)));
161
+ const remapIndex = (index) => {
162
+ const mapped = indexMap.get(index);
163
+ if (mapped === undefined) {
164
+ throw new sdk_core_1.BuildTransactionError(`Invalid account key index ${index} in versioned instruction`);
165
+ }
166
+ return mapped;
167
+ };
168
+ const nonceAdvanceInstruction = {
169
+ programIdIndex: newStaticAccountKeys.indexOf(SYSTEM_PROGRAM),
170
+ accountKeyIndexes: [
171
+ newStaticAccountKeys.indexOf(walletNonceAddress),
172
+ newStaticAccountKeys.indexOf(SYSVAR_RECENT_BLOCKHASHES),
173
+ newStaticAccountKeys.indexOf(authWalletAddress),
174
+ ],
175
+ data: '6vx8P', // base58 of SystemProgram AdvanceNonceAccount (0x04000000)
176
+ };
177
+ return {
178
+ ...data,
179
+ versionedInstructions: [
180
+ nonceAdvanceInstruction,
181
+ ...data.versionedInstructions.map((instruction) => ({
182
+ programIdIndex: remapIndex(instruction.programIdIndex),
183
+ accountKeyIndexes: instruction.accountKeyIndexes.map(remapIndex),
184
+ data: instruction.data,
185
+ })),
186
+ ],
187
+ staticAccountKeys: newStaticAccountKeys,
188
+ messageHeader: {
189
+ numRequiredSignatures: writableSigners.length + readonlySigners.length,
190
+ numReadonlySignedAccounts: readonlySigners.length,
191
+ numReadonlyUnsignedAccounts: readonlyNonSigners.length,
192
+ },
193
+ };
194
+ }
195
+ class V1TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
196
+ constructor(_coinConfig) {
197
+ super(_coinConfig);
198
+ this._instructionsData = [];
199
+ this._extraInstructions = [];
200
+ this._signers = [];
201
+ this._signatures = new Map();
202
+ this.transaction = new transaction_1.Transaction(_coinConfig);
203
+ }
204
+ /** @inheritdoc */
205
+ async buildImplementation() {
206
+ return this.buildV1();
207
+ }
208
+ /**
209
+ * Assemble the v1 transaction: derive instructions, inject the durable-nonce
210
+ * instruction when present, compile the message, and assemble the signed
211
+ * wire in message-signer order.
212
+ *
213
+ * @returns {Transaction} The built transaction holding the v1 message and wire bytes
214
+ */
215
+ buildV1() {
216
+ (0, assert_1.default)(this._sender, new sdk_core_1.BuildTransactionError('sender is required before building'));
217
+ (0, assert_1.default)(this._recentBlockhash, new sdk_core_1.BuildTransactionError('recent blockhash is required before building'));
218
+ (0, assert_1.default)(this._transactionConfig, 'transactionConfig is required to build a v1 transaction');
219
+ const instructions = [];
220
+ // Durable nonce: the AdvanceNonceAccount instruction MUST be part of the
221
+ // message (a bare nonce hash without the instruction is invalid). It is
222
+ // placed first, matching the v0 web3.js convention.
223
+ if (this._nonceInfo) {
224
+ instructions.push(buildAdvanceNonceAccountInstruction(this._nonceInfo.params.walletNonceAddress, this._nonceInfo.params.authWalletAddress));
225
+ }
226
+ for (const instruction of this._instructionsData) {
227
+ instructions.push(...(0, solInstructionFactory_1.solInstructionFactory)(instruction, this._zkProofProgramId));
228
+ }
229
+ if (this._memo) {
230
+ const memoData = {
231
+ type: constants_1.InstructionBuilderTypes.Memo,
232
+ params: { memo: this._memo },
233
+ };
234
+ this._instructionsData.push(memoData);
235
+ instructions.push(...(0, solInstructionFactory_1.solInstructionFactory)(memoData));
236
+ }
237
+ instructions.push(...this._extraInstructions);
238
+ const feePayer = this._feePayer ? new web3_js_1.PublicKey(this._feePayer) : new web3_js_1.PublicKey(this._sender);
239
+ const messageBytes = (0, compileTransactionMessage_1.compileTransactionMessage)({
240
+ version: 1,
241
+ instructions,
242
+ feePayer,
243
+ recentBlockhash: this._recentBlockhash,
244
+ transactionConfig: this._transactionConfig,
245
+ });
246
+ // Signer order comes from the compiled message: the first
247
+ // numSignerAccounts static accounts are the required signers (fee payer
248
+ // first, then the remaining signers in the compiled account order).
249
+ const decoded = (0, message_1.decodeV1Message)(messageBytes);
250
+ const signerAddresses = decoded.staticAccounts.slice(0, decoded.header.numSignerAccounts);
251
+ const signatures = [];
252
+ for (const address of signerAddresses) {
253
+ const keyPair = this._signers.find((signer) => signer.getKeys().pub === address);
254
+ if (keyPair) {
255
+ const secretKey = keyPair.getKeys(true).prv;
256
+ (0, assert_1.default)(secretKey instanceof Uint8Array, 'Missing private key');
257
+ signatures.push(tweetnacl_1.default.sign.detached(messageBytes, secretKey));
258
+ continue;
259
+ }
260
+ const external = this._signatures.get(address);
261
+ if (external) {
262
+ signatures.push(external);
263
+ continue;
264
+ }
265
+ // Missing signature: zero-fill the slot so the wire shape stays valid
266
+ // for partial-sign flows; the transaction is not broadcastable until
267
+ // every required signer has a signature.
268
+ signatures.push(new Uint8Array(64));
269
+ }
270
+ const v1Wire = (0, wire_transaction_1.serializeWireTransaction)(messageBytes, signatures);
271
+ this._transaction.v1TransactionBytes = v1Wire;
272
+ this._transaction.v1MessageBytes = messageBytes;
273
+ this._transaction.lamportsPerSignature = this._lamportsPerSignature;
274
+ // Populate a metadata-only SolTransaction so toJson / loadInputsAndOutputs
275
+ // work. The durable nonce is carried via nonceInfo, matching the v0 model.
276
+ const metaTx = new web3_js_1.Transaction();
277
+ metaTx.feePayer = feePayer;
278
+ metaTx.recentBlockhash = this._recentBlockhash;
279
+ if (this._nonceInfo) {
280
+ metaTx.nonceInfo = {
281
+ nonce: this._recentBlockhash,
282
+ nonceInstruction: buildAdvanceNonceAccountInstruction(this._nonceInfo.params.walletNonceAddress, this._nonceInfo.params.authWalletAddress),
283
+ };
284
+ }
285
+ metaTx.add(...instructions);
286
+ this._transaction.solTransaction = metaTx;
287
+ this._transaction.setTransactionType(this.transactionType);
288
+ this._transaction.setInstructionsData(this._instructionsData);
289
+ this._transaction.loadInputsAndOutputs();
290
+ return this._transaction;
291
+ }
292
+ /** @inheritdoc */
293
+ fromImplementation(rawTransaction) {
294
+ const tx = new transaction_1.Transaction(this._coinConfig);
295
+ const wireBytes = new Uint8Array(Buffer.from(rawTransaction, 'base64'));
296
+ const { messageBytes } = (0, parseWireTransaction_1.parseWireTransaction)(wireBytes);
297
+ tx.v1TransactionBytes = wireBytes;
298
+ tx.v1MessageBytes = messageBytes;
299
+ // Populate a metadata-only SolTransaction from the decoded message so
300
+ // toJson / loadInputsAndOutputs work.
301
+ const decoded = (0, message_1.decodeV1Message)(messageBytes);
302
+ tx.setTransactionType(this.transactionType);
303
+ const metaTx = new web3_js_1.Transaction();
304
+ metaTx.feePayer = new web3_js_1.PublicKey(decoded.staticAccounts[0]);
305
+ metaTx.recentBlockhash = decoded.blockhash;
306
+ const numWritableSigners = decoded.header.numSignerAccounts - decoded.header.numReadonlySignerAccounts;
307
+ const numWritableNonSigners = decoded.staticAccounts.length - decoded.header.numReadonlyNonSignerAccounts;
308
+ for (const compiled of decoded.compiledInstructions) {
309
+ metaTx.add(new web3_js_1.TransactionInstruction({
310
+ programId: new web3_js_1.PublicKey(decoded.staticAccounts[compiled.programAddressIndex]),
311
+ keys: compiled.accountIndices.map((index) => ({
312
+ pubkey: new web3_js_1.PublicKey(decoded.staticAccounts[index]),
313
+ isSigner: index < decoded.header.numSignerAccounts,
314
+ isWritable: index < numWritableSigners ||
315
+ (index >= decoded.header.numSignerAccounts && index < numWritableNonSigners),
316
+ })),
317
+ data: Buffer.from(compiled.data),
318
+ }));
319
+ }
320
+ tx.solTransaction = metaTx;
321
+ return tx;
322
+ }
323
+ // region Getters and Setters
324
+ /** @inheritdoc */
325
+ get transaction() {
326
+ return this._transaction;
327
+ }
328
+ /** @inheritdoc */
329
+ set transaction(transaction) {
330
+ this._transaction = transaction;
331
+ }
332
+ /** @inheritdoc */
333
+ signImplementation(key) {
334
+ this.validateKey(key);
335
+ this.checkDuplicatedSigner(key);
336
+ const prv = key.key;
337
+ const signer = new keyPair_1.KeyPair({ prv: prv });
338
+ this._signers.push(signer);
339
+ return this._transaction;
340
+ }
341
+ /** @inheritDoc */
342
+ addSignature(publicKey, signature) {
343
+ this._signatures.set(publicKey.pub, new Uint8Array(signature));
344
+ }
345
+ /**
346
+ * Sets the sender of this transaction.
347
+ * This account will be responsible for paying transaction fees.
348
+ *
349
+ * @param {string} senderAddress the account that is sending this transaction
350
+ * @returns {V1TransactionBuilder} This transaction builder
351
+ */
352
+ sender(senderAddress) {
353
+ (0, utils_1.validateAddress)(senderAddress, 'sender');
354
+ this._sender = senderAddress;
355
+ return this;
356
+ }
357
+ /**
358
+ * Set the transaction nonce.
359
+ * Requires both optional params in order to use the durable nonce.
360
+ *
361
+ * @param {string} blockHash The latest blockHash or the durable nonce hash
362
+ * @param {DurableNonceParams} [durableNonceParams] An object containing the walletNonceAddress and the authWalletAddress (required for durable nonce)
363
+ * @returns {V1TransactionBuilder} This transaction builder
364
+ */
365
+ nonce(blockHash, durableNonceParams) {
366
+ if (!blockHash || !(0, utils_1.isValidBlockId)(blockHash)) {
367
+ throw new sdk_core_1.BuildTransactionError('Invalid or missing blockHash, got: ' + blockHash);
368
+ }
369
+ if (durableNonceParams) {
370
+ (0, utils_1.validateAddress)(durableNonceParams.walletNonceAddress, 'walletNonceAddress');
371
+ (0, utils_1.validateAddress)(durableNonceParams.authWalletAddress, 'authWalletAddress');
372
+ if (durableNonceParams.walletNonceAddress === durableNonceParams.authWalletAddress) {
373
+ throw new sdk_core_1.BuildTransactionError('Invalid params: walletNonceAddress cannot be equal to authWalletAddress');
374
+ }
375
+ this._nonceInfo = {
376
+ type: constants_1.InstructionBuilderTypes.NonceAdvance,
377
+ params: durableNonceParams,
378
+ };
379
+ }
380
+ this._recentBlockhash = blockHash;
381
+ return this;
382
+ }
383
+ /**
384
+ * Set the intent instructions to build, using the shared instruction params
385
+ * representation consumed by `solInstructionFactory` (same as the v0 flows).
386
+ *
387
+ * @param {InstructionParams[]} instructions the instruction params
388
+ * @returns {V1TransactionBuilder} This transaction builder
389
+ */
390
+ instructions(instructions) {
391
+ this._instructionsData = [...instructions];
392
+ return this;
393
+ }
394
+ /**
395
+ * Append a pre-built instruction (e.g. an envelope-derived instruction or a
396
+ * custom instruction) to the transaction.
397
+ *
398
+ * @param {TransactionInstruction} instruction the instruction to append
399
+ * @returns {V1TransactionBuilder} This transaction builder
400
+ */
401
+ addInstruction(instruction) {
402
+ this._extraInstructions.push(instruction);
403
+ return this;
404
+ }
405
+ /**
406
+ * Set the v1 transaction config (compute unit limit, heap size, loaded
407
+ * accounts data size limit, and priority fee as total lamports). Required
408
+ * before building.
409
+ *
410
+ * @param {SolV1TransactionConfig} config the v1 transaction config
411
+ * @returns {V1TransactionBuilder} This transaction builder
412
+ */
413
+ transactionConfig(config) {
414
+ this._transactionConfig = {
415
+ computeUnitLimit: config.computeUnitLimit ?? null,
416
+ heapSize: config.heapSize ?? null,
417
+ loadedAccountsDataSizeLimit: config.loadedAccountsDataSizeLimit ?? null,
418
+ priorityFee: config.priorityFee ?? null,
419
+ };
420
+ return this;
421
+ }
422
+ /**
423
+ * Initialize the builder from a client-supplied v1 envelope
424
+ * (SolVersionedTransactionData). Sets the fee payer from staticAccountKeys[0],
425
+ * coerces the transaction config, and converts each envelope instruction to an
426
+ * address-based TransactionInstruction via {@link toV1TransactionInstruction}.
427
+ *
428
+ * @param data - the v1 envelope
429
+ * @returns {V1TransactionBuilder} This transaction builder
430
+ */
431
+ fromVersionedData(data) {
432
+ if (!data || typeof data !== 'object') {
433
+ throw new sdk_core_1.BuildTransactionError('VersionedTransactionData must be a valid object');
434
+ }
435
+ if (!Array.isArray(data.staticAccountKeys) || data.staticAccountKeys.length === 0) {
436
+ throw new sdk_core_1.BuildTransactionError('staticAccountKeys must be a non-empty array');
437
+ }
438
+ if (!Array.isArray(data.versionedInstructions)) {
439
+ throw new sdk_core_1.BuildTransactionError('versionedInstructions must be an array');
440
+ }
441
+ if (!data.messageHeader || typeof data.messageHeader !== 'object') {
442
+ throw new sdk_core_1.BuildTransactionError('messageHeader must be a valid object');
443
+ }
444
+ this._sender = data.staticAccountKeys[0];
445
+ this._transactionConfig = {
446
+ computeUnitLimit: data.transactionConfig?.computeUnitLimit ?? null,
447
+ heapSize: data.transactionConfig?.heapSize ?? null,
448
+ loadedAccountsDataSizeLimit: data.transactionConfig?.loadedAccountsDataSizeLimit ?? null,
449
+ priorityFee: data.transactionConfig?.priorityFee ?? null,
450
+ };
451
+ for (const instruction of data.versionedInstructions) {
452
+ this.addInstruction(toV1TransactionInstruction(instruction, data));
453
+ }
454
+ return this;
455
+ }
456
+ /**
457
+ * Set the priority fee (total lamports) on the v1 transaction config.
458
+ *
459
+ * @param {FeeOptions} feeOptions the priority fee
460
+ * @returns {V1TransactionBuilder} This transaction builder
461
+ */
462
+ setPriorityFee(feeOptions) {
463
+ if (!this._transactionConfig) {
464
+ this._transactionConfig = {
465
+ computeUnitLimit: null,
466
+ heapSize: null,
467
+ loadedAccountsDataSizeLimit: null,
468
+ priorityFee: null,
469
+ };
470
+ }
471
+ this._transactionConfig.priorityFee = Number(feeOptions.amount);
472
+ return this;
473
+ }
474
+ /**
475
+ * Set the fee (lamports per signature) for fee estimation.
476
+ *
477
+ * @param {FeeOptions} feeOptions the fee
478
+ * @returns {V1TransactionBuilder} This transaction builder
479
+ */
480
+ fee(feeOptions) {
481
+ this._lamportsPerSignature = Number(feeOptions.amount);
482
+ return this;
483
+ }
484
+ feePayer(feePayer) {
485
+ this._feePayer = feePayer;
486
+ return this;
487
+ }
488
+ /**
489
+ * Set the memo.
490
+ *
491
+ * @param {string} memo
492
+ * @returns {V1TransactionBuilder} This transaction builder
493
+ */
494
+ memo(memo) {
495
+ this.validateMemo(memo);
496
+ this._memo = memo;
497
+ return this;
498
+ }
499
+ /**
500
+ * Override the zk-elgamal-proof program id.
501
+ *
502
+ * Defaults to the canonical on-chain program id (`ZkE1Gama1Proof111...`)
503
+ * which is the same across mainnet, devnet, and testnet. Override only
504
+ * when targeting a custom deployment.
505
+ *
506
+ * @param {string} programId base58 encoded program id
507
+ * @returns {V1TransactionBuilder} This transaction builder
508
+ */
509
+ zkProofProgramId(programId) {
510
+ (0, assert_1.default)(programId, 'Missing programId param');
511
+ this._zkProofProgramId = programId;
512
+ return this;
513
+ }
514
+ // endregion
515
+ // region Validators
516
+ /** @inheritdoc */
517
+ validateAddress(address, addressFormat) {
518
+ if (!(0, utils_1.isValidAddress)(address.address)) {
519
+ throw new sdk_core_1.BuildTransactionError('Invalid address ' + address.address);
520
+ }
521
+ }
522
+ /** @inheritdoc */
523
+ validateKey(key) {
524
+ let keyPair;
525
+ try {
526
+ keyPair = new keyPair_1.KeyPair({ prv: key.key });
527
+ }
528
+ catch {
529
+ throw new sdk_core_1.BuildTransactionError('Invalid key');
530
+ }
531
+ if (!keyPair.getKeys().prv) {
532
+ throw new sdk_core_1.BuildTransactionError('Invalid key');
533
+ }
534
+ }
535
+ /** @inheritdoc */
536
+ validateRawTransaction(rawTransaction) {
537
+ if (!rawTransaction) {
538
+ throw new sdk_core_1.BuildTransactionError('Invalid raw transaction');
539
+ }
540
+ try {
541
+ (0, parseWireTransaction_1.parseWireTransaction)(new Uint8Array(Buffer.from(rawTransaction, 'base64')));
542
+ }
543
+ catch (e) {
544
+ throw new sdk_core_1.BuildTransactionError('Invalid raw transaction: ' + e.message);
545
+ }
546
+ }
547
+ /** @inheritdoc */
548
+ validateTransaction(transaction) {
549
+ this.validateSender();
550
+ this.validateNonce();
551
+ }
552
+ /** @inheritdoc */
553
+ validateValue(value) {
554
+ if (value.isLessThan(0)) {
555
+ throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
556
+ }
557
+ }
558
+ /**
559
+ * Validates the memo.
560
+ *
561
+ * @param {string} memo - the memo as string
562
+ */
563
+ validateMemo(memo) {
564
+ if (!memo) {
565
+ throw new sdk_core_1.BuildTransactionError('Invalid memo, got: ' + memo);
566
+ }
567
+ if (!(0, utils_1.isValidMemo)(memo)) {
568
+ throw new sdk_core_1.BuildTransactionError('Memo is too long');
569
+ }
570
+ }
571
+ /**
572
+ * Validates that the given key is not already in this._signers.
573
+ *
574
+ * @param {BaseKey} key - The key to check
575
+ */
576
+ checkDuplicatedSigner(key) {
577
+ this._signers.forEach((kp) => {
578
+ if (kp.getKeys().prv === key.key) {
579
+ throw new sdk_core_1.SigningError('Duplicated signer: ' + key.key);
580
+ }
581
+ });
582
+ }
583
+ /**
584
+ * Validates that the sender field is defined.
585
+ */
586
+ validateSender() {
587
+ if (this._sender === undefined) {
588
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing sender');
589
+ }
590
+ }
591
+ /**
592
+ * Validates that the nonce field is defined.
593
+ */
594
+ validateNonce() {
595
+ if (this._recentBlockhash === undefined) {
596
+ throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing nonce blockhash');
597
+ }
598
+ }
599
+ }
600
+ exports.V1TransactionBuilder = V1TransactionBuilder;
601
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjFUcmFuc2FjdGlvbkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3YxVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQWlEQSxrRkFVQztBQVlELGdFQXVCQztBQW1CRCwwRUEySEM7QUExT0QsbURBVzhCO0FBQzlCLDZDQU15QjtBQUN6QixnREFBMEI7QUFDMUIsMERBQTZCO0FBQzdCLG9EQUE0QjtBQUM1QiwrQ0FBNEM7QUFDNUMsMkNBQXNEO0FBRXRELG1FQUFnRTtBQUNoRSx5RkFBc0Y7QUFDdEYsdUVBQTRFO0FBQzVFLCtFQUE0RTtBQUM1RSwrREFBb0U7QUFDcEUsbUNBQXVGO0FBQ3ZGLHVDQUFvQztBQUVwQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsbUNBQW1DLENBQ2pELFlBQW9CLEVBQ3BCLGlCQUF5QjtJQUV6QixJQUFBLGdCQUFNLEVBQUMsWUFBWSxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFDbkQsSUFBQSxnQkFBTSxFQUFDLGlCQUFpQixFQUFFLGlDQUFpQyxDQUFDLENBQUM7SUFDN0QsT0FBTyx1QkFBYSxDQUFDLFlBQVksQ0FBQztRQUNoQyxXQUFXLEVBQUUsSUFBSSxtQkFBUyxDQUFDLFlBQVksQ0FBQztRQUN4QyxnQkFBZ0IsRUFBRSxJQUFJLG1CQUFTLENBQUMsaUJBQWlCLENBQUM7S0FDbkQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLDBCQUEwQixDQUN4QyxXQUFrRixFQUNsRixJQUFpQztJQUVqQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ2xELE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDO0lBQ2xFLE1BQU0sV0FBVyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztJQUU3QyxNQUFNLFFBQVEsR0FB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cEIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0NBRUY7QUEzZEQsb0RBMmRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUFkZHJlc3MsXG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgRmVlT3B0aW9ucyxcbiAgUHVibGljS2V5IGFzIEJhc2VQdWJsaWNLZXksXG4gIFNpZ25pbmdFcnJvcixcbiAgU29sVjFUcmFuc2FjdGlvbkNvbmZpZyxcbiAgU29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7XG4gIFB1YmxpY0tleSxcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgU1lTVkFSX1JFQ0VOVF9CTE9DS0hBU0hFU19QVUJLRVksXG4gIFRyYW5zYWN0aW9uIGFzIFNvbFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvblBhcmFtcywgTWVtbywgTm9uY2UgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IHNvbEluc3RydWN0aW9uRmFjdG9yeSB9IGZyb20gJy4vc29sSW5zdHJ1Y3Rpb25GYWN0b3J5JztcbmltcG9ydCB7IGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2UgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSc7XG5pbXBvcnQgeyBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24gfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vd2lyZS10cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBwYXJzZVdpcmVUcmFuc2FjdGlvbiB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9wYXJzZVdpcmVUcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBkZWNvZGVWMU1lc3NhZ2UgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vY29kZWNzL3YxL21lc3NhZ2UnO1xuaW1wb3J0IHsgaXNWYWxpZEFkZHJlc3MsIGlzVmFsaWRCbG9ja0lkLCBpc1ZhbGlkTWVtbywgdmFsaWRhdGVBZGRyZXNzIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYW4gQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbiBmb3IgYSBkdXJhYmxlIG5vbmNlLlxuICpcbiAqIFRoZSB2MCBwYXRoIHJlY2VpdmVzIHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSB3ZWIzLmpzIC8gdGhlIFJ1c3Qgd2FzbSBjb3JlXG4gKiAoYE5vbmNlU291cmNlYCBkdXJhYmxlIHZhcmlhbnQpOyB0aGUgdjEgcGF0aCBjb21waWxlcyB2aWFcbiAqIGBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlYCwgc28gdGhlIG5vbmNlIGluc3RydWN0aW9uIG11c3QgYmUgY29uc3RydWN0ZWQgaW5cbiAqIFR5cGVTY3JpcHQgYW5kIGluamVjdGVkIGludG8gdGhlIGNvbXBpbGUgaW5wdXQuIFRoZSBub25jZSBhdXRob3JpdHlcbiAqIChgYXV0aFdhbGxldEFkZHJlc3NgKSBNVVNUIHNpZ24gdGhlIGluc3RydWN0aW9uIOKAlCBpdCBiZWNvbWVzIGEgcmVxdWlyZWRcbiAqIHNpZ25lciBvZiB0aGUgY29tcGlsZWQgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gbm9uY2VBZGRyZXNzIC0gdGhlIGR1cmFibGUgbm9uY2UgYWNjb3VudCBhZGRyZXNzXG4gKiBAcGFyYW0gYXV0aFdhbGxldEFkZHJlc3MgLSB0aGUgbm9uY2UgYXV0aG9yaXR5IChnYXMtdGFuayByb290IGluIEJpdEdvJ3MgbW9kZWwpXG4gKiBAcmV0dXJucyB0aGUgQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBZHZhbmNlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24oXG4gIG5vbmNlQWRkcmVzczogc3RyaW5nLFxuICBhdXRoV2FsbGV0QWRkcmVzczogc3RyaW5nXG4pOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHtcbiAgYXNzZXJ0KG5vbmNlQWRkcmVzcywgJ01pc3Npbmcgbm9uY2VBZGRyZXNzIHBhcmFtJyk7XG4gIGFzc2VydChhdXRoV2FsbGV0QWRkcmVzcywgJ01pc3NpbmcgYXV0aFdhbGxldEFkZHJlc3MgcGFyYW0nKTtcbiAgcmV0dXJuIFN5c3RlbVByb2dyYW0ubm9uY2VBZHZhbmNlKHtcbiAgICBub25jZVB1YmtleTogbmV3IFB1YmxpY0tleShub25jZUFkZHJlc3MpLFxuICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aFdhbGxldEFkZHJlc3MpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBNYXAgYSB2MSBlbnZlbG9wZSBpbnN0cnVjdGlvbiAoaW5kZXgtYmFzZWQpIGludG8gYSB3ZWIzLmpzIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25cbiAqIChhZGRyZXNzLWJhc2VkKSwgZGVyaXZpbmcgZWFjaCByZWZlcmVuY2VkIGFjY291bnQncyBzaWduZXIvd3JpdGFibGUgcm9sZSBmcm9tIHRoZVxuICogbWVzc2FnZSBoZWFkZXIgKFNvbGFuYSByb2xlIGNvbnZlbnRpb25zOiB0aGUgbGFzdCBgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50c2BcbiAqIHNpZ25lcnMgYW5kIGxhc3QgYG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c2Agbm9uLXNpZ25lcnMgYXJlIHJlYWRvbmx5KS5cbiAqXG4gKiBAcGFyYW0gaW5zdHJ1Y3Rpb24gLSB0aGUgZW52ZWxvcGUgaW5zdHJ1Y3Rpb24gKHByb2dyYW1JZEluZGV4L2FjY291bnRLZXlJbmRleGVzL2RhdGEpXG4gKiBAcGFyYW0gZGF0YSAtIHRoZSB2MSBlbnZlbG9wZVxuICogQHJldHVybnMgdGhlIGFkZHJlc3MtYmFzZWQgaW5zdHJ1Y3Rpb24sIHJlYWR5IGZvciBWMVRyYW5zYWN0aW9uQnVpbGRlci5hZGRJbnN0cnVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9WMVRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oXG4gIGluc3RydWN0aW9uOiB7IHByb2dyYW1JZEluZGV4OiBudW1iZXI7IGFjY291bnRLZXlJbmRleGVzOiBudW1iZXJbXTsgZGF0YTogc3RyaW5nIH0sXG4gIGRhdGE6IFNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YVxuKTogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbiB7XG4gIGNvbnN0IHsgc3RhdGljQWNjb3VudEtleXMsIG1lc3NhZ2VIZWFkZXIgfSA9IGRhdGE7XG4gIGNvbnN0IG51bVJlcXVpcmVkU2lnbmF0dXJlcyA9IG1lc3NhZ2VIZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICBjb25zdCBudW1BY2NvdW50cyA9IHN0YXRpY0FjY291bnRLZXlzLmxlbmd0aDtcblxuICBjb25zdCBpc1NpZ25lciA9IChpbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PiBpbmRleCA8IG51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgY29uc3QgaXNXcml0YWJsZSA9IChpbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PlxuICAgIGlzU2lnbmVyKGluZGV4KVxuICAgICAgPyBpbmRleCA8IG51bVJlcXVpcmVkU2lnbmF0dXJlcyAtIG1lc3NhZ2VIZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50c1xuICAgICAgOiBpbmRleCA8IG51bUFjY291bnRzIC0gbWVzc2FnZUhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM7XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkoc3RhdGljQWNjb3VudEtleXNbaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXhdKSxcbiAgICBrZXlzOiBpbnN0cnVjdGlvbi5hY2NvdW50S2V5SW5kZXhlcy5tYXAoKGFjY291bnRJbmRleCkgPT4gKHtcbiAgICAgIHB1YmtleTogbmV3IFB1YmxpY0tleShzdGF0aWNBY2NvdW50S2V5c1thY2NvdW50SW5kZXhdKSxcbiAgICAgIGlzU2lnbmVyOiBpc1NpZ25lcihhY2NvdW50SW5kZXgpLFxuICAgICAgaXNXcml0YWJsZTogaXNXcml0YWJsZShhY2NvdW50SW5kZXgpLFxuICAgIH0pKSxcbiAgICBkYXRhOiBCdWZmZXIuZnJvbShiYXNlNTguZGVjb2RlKGluc3RydWN0aW9uLmRhdGEpKSxcbiAgfSk7XG59XG5cbi8qKlxuICogSW5qZWN0IGFuIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb24gaW50byBhIHYxIGVudmVsb3BlIGZvciBkdXJhYmxlIG5vbmNlLlxuICpcbiAqIHYxIChTSU1ELTAyOTYvMDM4NSkgaGFzIG5vIGFkZHJlc3MgbG9va3VwIHRhYmxlcywgc28gZXZlcnkgYWNjb3VudCBpcyBhIHN0YXRpY1xuICoga2V5LiBUaGUgbm9uY2UgYXV0aG9yaXR5IE1VU1Qgc2lnbiB0aGUgQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbiAoaGFyZFxuICogcnVudGltZSByZXF1aXJlbWVudCkgYW5kIHRoZSBub25jZSBhY2NvdW50IE1VU1QgYmUgd3JpdGFibGU7IHRoZSBzeXN0ZW0gcHJvZ3JhbVxuICogYW5kIHJlY2VudC1ibG9ja2hhc2hlcyBzeXN2YXIgYXJlIHJlYWRvbmx5IG5vbi1zaWduZXJzLiBUaGUgaW5zdHJ1Y3Rpb24gaXNcbiAqIHByZXBlbmRlZCBhbmQgZXZlcnkgaW5zdHJ1Y3Rpb24ncyBhY2NvdW50IGluZGV4ZXMgYXJlIHJlbWFwcGVkIHRvIHRoZSByZWJ1aWx0XG4gKiBzdGF0aWMga2V5IGxpc3Q7IG1lc3NhZ2VIZWFkZXIgZ3Jvd3MgYWNjb3JkaW5nbHkgc28gdGhlIHdpcmUtc2l6ZSBlc3RpbWF0ZSBhbmRcbiAqIGFjY291bnQgY2FwcyBhcmUgY29ycmVjdC5cbiAqXG4gKiBAcGFyYW0gZGF0YSAtIHRoZSB2MSBlbnZlbG9wZSAoY2xpZW50LXN1cHBsaWVkLCBubyBub25jZSBpbnN0cnVjdGlvbilcbiAqIEBwYXJhbSBkdXJhYmxlTm9uY2VQYXJhbXMgLSB3YWxsZXROb25jZUFkZHJlc3MgKyBhdXRoV2FsbGV0QWRkcmVzcyAoZ2FzLXRhbmsgcm9vdClcbiAqIEByZXR1cm5zIGEgY29weSBvZiB0aGUgZW52ZWxvcGUgd2l0aCB0aGUgbm9uY2UgaW5zdHJ1Y3Rpb24gaW5qZWN0ZWRcbiAqIEBlZGdlIGlmIHRoZSBlbnZlbG9wZSBhbHJlYWR5IGNvbnRhaW5zIGFuIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb24sIHJldHVybnNcbiAqICAgdGhlIGVudmVsb3BlIHVuY2hhbmdlZCAoaWRlbXBvdGVudCAtIGEgZHVyYWJsZS1hd2FyZSBjbGllbnQgbWF5IHN1cHBseSBpdClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFYxTm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24oXG4gIGRhdGE6IFNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgZHVyYWJsZU5vbmNlUGFyYW1zOiB7IHdhbGxldE5vbmNlQWRkcmVzczogc3RyaW5nOyBhdXRoV2FsbGV0QWRkcmVzczogc3RyaW5nIH1cbik6IFNvbFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB7XG4gIGNvbnN0IHsgd2FsbGV0Tm9uY2VBZGRyZXNzLCBhdXRoV2FsbGV0QWRkcmVzcyB9ID0gZHVyYWJsZU5vbmNlUGFyYW1zO1xuICBjb25zdCBTWVNURU1fUFJPR1JBTSA9IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLnRvQmFzZTU4KCk7XG4gIGNvbnN0IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMgPSBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWS50b0Jhc2U1OCgpO1xuXG4gIC8vIElkZW1wb3RlbmNlOiBhIGR1cmFibGUtYXdhcmUgY2xpZW50IG1heSBhbHJlYWR5IGluY2x1ZGUgdGhlIG5vbmNlIGluc3RydWN0aW9uLlxuICBjb25zdCBoYXNOb25jZUFkdmFuY2UgPSBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucy5zb21lKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IHByb2dyYW0gPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzW2luc3RydWN0aW9uLnByb2dyYW1JZEluZGV4XTtcbiAgICByZXR1cm4gcHJvZ3JhbSA9PT0gU1lTVEVNX1BST0dSQU0gJiYgQnVmZmVyLmZyb20oYmFzZTU4LmRlY29kZShpbnN0cnVjdGlvbi5kYXRhKSlbMF0gPT09IDQ7XG4gIH0pO1xuICBpZiAoaGFzTm9uY2VBZHZhbmNlKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBjb25zdCB7IG51bVJlcXVpcmVkU2lnbmF0dXJlcywgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cywgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzIH0gPSBkYXRhLm1lc3NhZ2VIZWFkZXI7XG4gIGNvbnN0IG9sZFN0YXRpY0xlbiA9IGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICBpZiAoXG4gICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyA+IG51bVJlcXVpcmVkU2lnbmF0dXJlcyB8fFxuICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyArIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyA+IG9sZFN0YXRpY0xlblxuICApIHtcbiAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgYEludmFsaWQgbWVzc2FnZSBoZWFkZXI6IHJlYWRvbmx5IGNvdW50cyAoJHtudW1SZWFkb25seVNpZ25lZEFjY291bnRzfSwgJHtudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHN9KSBgICtcbiAgICAgICAgYGFyZSBpbmNvbnNpc3RlbnQgd2l0aCAke251bVJlcXVpcmVkU2lnbmF0dXJlc30gcmVxdWlyZWQgc2lnbmF0dXJlcyBhbmQgJHtvbGRTdGF0aWNMZW59IHN0YXRpYyBhY2NvdW50IGtleXNgXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNwbGl0IHRoZSBzdGF0aWMga2V5cyBpbnRvIHRoZSBmb3VyIHYxIGhlYWRlciBzZWN0aW9ucy5cbiAgY29uc3Qgd3JpdGFibGVTaWduZXJzID0gZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZSgwLCBudW1SZXF1aXJlZFNpZ25hdHVyZXMgLSBudW1SZWFkb25seVNpZ25lZEFjY291bnRzKTtcbiAgY29uc3QgcmVhZG9ubHlTaWduZXJzID0gZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZShcbiAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMgLSBudW1SZWFkb25seVNpZ25lZEFjY291bnRzLFxuICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlc1xuICApO1xuICBjb25zdCB3cml0YWJsZU5vblNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKFxuICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyxcbiAgICBvbGRTdGF0aWNMZW4gLSBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHNcbiAgKTtcbiAgY29uc3QgcmVhZG9ubHlOb25TaWduZXJzID0gZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZShvbGRTdGF0aWNMZW4gLSBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMpO1xuXG4gIC8vIFRoZSBub25jZSBhdXRob3JpdHkgbXVzdCBiZSBhIHNpZ25lciBmb3IgQWR2YW5jZU5vbmNlQWNjb3VudC5cbiAgY29uc3QgYXV0aG9yaXR5SXNTaWduZXIgPSB3cml0YWJsZVNpZ25lcnMuaW5jbHVkZXMoYXV0aFdhbGxldEFkZHJlc3MpIHx8IHJlYWRvbmx5U2lnbmVycy5pbmNsdWRlcyhhdXRoV2FsbGV0QWRkcmVzcyk7XG4gIGlmICghYXV0aG9yaXR5SXNTaWduZXIpIHtcbiAgICBjb25zdCBhc1JlYWRvbmx5Tm9uU2lnbmVyID0gcmVhZG9ubHlOb25TaWduZXJzLmluZGV4T2YoYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgIGNvbnN0IGFzV3JpdGFibGVOb25TaWduZXIgPSB3cml0YWJsZU5vblNpZ25lcnMuaW5kZXhPZihhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgaWYgKGFzUmVhZG9ubHlOb25TaWduZXIgPj0gMCkge1xuICAgICAgcmVhZG9ubHlOb25TaWduZXJzLnNwbGljZShhc1JlYWRvbmx5Tm9uU2lnbmVyLCAxKTtcbiAgICAgIHJlYWRvbmx5U2lnbmVycy5wdXNoKGF1dGhXYWxsZXRBZGRyZXNzKTtcbiAgICB9IGVsc2UgaWYgKGFzV3JpdGFibGVOb25TaWduZXIgPj0gMCkge1xuICAgICAgd3JpdGFibGVOb25TaWduZXJzLnNwbGljZShhc1dyaXRhYmxlTm9uU2lnbmVyLCAxKTtcbiAgICAgIHdyaXRhYmxlU2lnbmVycy5wdXNoKGF1dGhXYWxsZXRBZGRyZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhZG9ubHlTaWduZXJzLnB1c2goYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSBub25jZSBhY2NvdW50IG11c3QgYmUgd3JpdGFibGUgZm9yIEFkdmFuY2VOb25jZUFjY291bnQuXG4gIGNvbnN0IG5vbmNlQXNSZWFkb25seU5vblNpZ25lciA9IHJlYWRvbmx5Tm9uU2lnbmVycy5pbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gIGNvbnN0IG5vbmNlQXNSZWFkb25seVNpZ25lciA9IHJlYWRvbmx5U2lnbmVycy5pbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gIGlmIChub25jZUFzUmVhZG9ubHlOb25TaWduZXIgPj0gMCkge1xuICAgIHJlYWRvbmx5Tm9uU2lnbmVycy5zcGxpY2Uobm9uY2VBc1JlYWRvbmx5Tm9uU2lnbmVyLCAxKTtcbiAgICB3cml0YWJsZU5vblNpZ25lcnMucHVzaCh3YWxsZXROb25jZUFkZHJlc3MpO1xuICB9IGVsc2UgaWYgKG5vbmNlQXNSZWFkb25seVNpZ25lciA+PSAwKSB7XG4gICAgcmVhZG9ubHlTaWduZXJzLnNwbGljZShub25jZUFzUmVhZG9ubHlTaWduZXIsIDEpO1xuICAgIHdyaXRhYmxlU2lnbmVycy5wdXNoKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gIH0gZWxzZSBpZiAoIXdyaXRhYmxlU2lnbmVycy5pbmNsdWRlcyh3YWxsZXROb25jZUFkZHJlc3MpICYmICF3cml0YWJsZU5vblNpZ25lcnMuaW5jbHVkZXMod2FsbGV0Tm9uY2VBZGRyZXNzKSkge1xuICAgIHdyaXRhYmxlTm9uU2lnbmVycy5wdXNoKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gIH1cblxuICAvLyBUaGUgc3lzdGVtIHByb2dyYW0gYW5kIHJlY2VudC1ibG9ja2hhc2hlcyBzeXN2YXIgYXJlIHJlYWRvbmx5IG5vbi1zaWduZXJzLlxuICBjb25zdCBpc1ByZXNlbnQgPSAoa2V5OiBzdHJpbmcpID0+XG4gICAgd3JpdGFibGVTaWduZXJzLmluY2x1ZGVzKGtleSkgfHxcbiAgICByZWFkb25seVNpZ25lcnMuaW5jbHVkZXMoa2V5KSB8fFxuICAgIHdyaXRhYmxlTm9uU2lnbmVycy5pbmNsdWRlcyhrZXkpIHx8XG4gICAgcmVhZG9ubHlOb25TaWduZXJzLmluY2x1ZGVzKGtleSk7XG4gIGlmICghaXNQcmVzZW50KFNZU1RFTV9QUk9HUkFNKSkge1xuICAgIHJlYWRvbmx5Tm9uU2lnbmVycy5wdXNoKFNZU1RFTV9QUk9HUkFNKTtcbiAgfVxuICBpZiAoIWlzUHJlc2VudChTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTKSkge1xuICAgIHJlYWRvbmx5Tm9uU2lnbmVycy5wdXNoKFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMpO1xuICB9XG5cbiAgY29uc3QgbmV3U3RhdGljQWNjb3VudEtleXMgPSBbLi4ud3JpdGFibGVTaWduZXJzLCAuLi5yZWFkb25seVNpZ25lcnMsIC4uLndyaXRhYmxlTm9uU2lnbmVycywgLi4ucmVhZG9ubHlOb25TaWduZXJzXTtcblxuICAvLyBSZW1hcCBldmVyeSBpbnN0cnVjdGlvbiBpbmRleCB0byB0aGUgbmV3IGtleSBvcmRlciAodjEgaGFzIG5vIGxvb2t1cCB0YWJsZXMpLlxuICBjb25zdCBpbmRleE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIGRhdGEuc3RhdGljQWNjb3VudEtleXMuZm9yRWFjaCgoa2V5LCBvbGRJZHgpID0+IGluZGV4TWFwLnNldChvbGRJZHgsIG5ld1N0YXRpY0FjY291bnRLZXlzLmluZGV4T2Yoa2V5KSkpO1xuICBjb25zdCByZW1hcEluZGV4ID0gKGluZGV4OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IG1hcHBlZCA9IGluZGV4TWFwLmdldChpbmRleCk7XG4gICAgaWYgKG1hcHBlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGFjY291bnQga2V5IGluZGV4ICR7aW5kZXh9IGluIHZlcnNpb25lZCBpbnN0cnVjdGlvbmApO1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGVkO1xuICB9O1xuXG4gIGNvbnN0IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uID0ge1xuICAgIHByb2dyYW1JZEluZGV4OiBuZXdTdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1RFTV9QUk9HUkFNKSxcbiAgICBhY2NvdW50S2V5SW5kZXhlczogW1xuICAgICAgbmV3U3RhdGljQWNjb3VudEtleXMuaW5kZXhPZih3YWxsZXROb25jZUFkZHJlc3MpLFxuICAgICAgbmV3U3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTKSxcbiAgICAgIG5ld1N0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoYXV0aFdhbGxldEFkZHJlc3MpLFxuICAgIF0sXG4gICAgZGF0YTogJzZ2eDhQJywgLy8gYmFzZTU4IG9mIFN5c3RlbVByb2dyYW0gQWR2YW5jZU5vbmNlQWNjb3VudCAoMHgwNDAwMDAwMClcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLmRhdGEsXG4gICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBbXG4gICAgICBub25jZUFkdmFuY2VJbnN0cnVjdGlvbixcbiAgICAgIC4uLmRhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLm1hcCgoaW5zdHJ1Y3Rpb24pID0+ICh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiByZW1hcEluZGV4KGluc3RydWN0aW9uLnByb2dyYW1JZEluZGV4KSxcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLm1hcChyZW1hcEluZGV4KSxcbiAgICAgICAgZGF0YTogaW5zdHJ1Y3Rpb24uZGF0YSxcbiAgICAgIH0pKSxcbiAgICBdLFxuICAgIHN0YXRpY0FjY291bnRLZXlzOiBuZXdTdGF0aWNBY2NvdW50S2V5cyxcbiAgICBtZXNzYWdlSGVhZGVyOiB7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IHdyaXRhYmxlU2lnbmVycy5sZW5ndGggKyByZWFkb25seVNpZ25lcnMubGVuZ3RoLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogcmVhZG9ubHlTaWduZXJzLmxlbmd0aCxcbiAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50czogcmVhZG9ubHlOb25TaWduZXJzLmxlbmd0aCxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEJhc2UgYnVpbGRlciBmb3IgU29sYW5hIHYxIChTSU1ELTAyOTYvMDM4NSkgdHJhbnNhY3Rpb25zLlxuICpcbiAqIFBhcmFsbGVsIHRvIHRoZSB2MCB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyfSwgd2hpY2ggaXMgYm91bmQgdG8gYVxuICogYEBzb2xhbmEvd2ViMy5qc2AgdjAgYFRyYW5zYWN0aW9uYCBhbmQgY2Fubm90IGVtaXQgYSB2MSB3aXJlLiBUaGlzIGJ1aWxkZXJcbiAqIG93bnMgdGhlIHYxIGFzc2VtYmx5OlxuICpcbiAqIC0gaW50ZW50LXRvLWluc3RydWN0aW9uIGRlcml2YXRpb24gdmlhIHRoZSBzaGFyZWQgYHNvbEluc3RydWN0aW9uRmFjdG9yeWBcbiAqICAgKHNhbWUgYEluc3RydWN0aW9uUGFyYW1zYCByZXByZXNlbnRhdGlvbiBhcyB0aGUgdjAgZmxvd3MpXG4gKiAtIGR1cmFibGUgbm9uY2U6IGBBZHZhbmNlTm9uY2VBY2NvdW50YCBpbnN0cnVjdGlvbiBpbmplY3Rpb24gKGZpcnN0KSBwbHVzIHRoZVxuICogICBub25jZSBoYXNoIGluIHRoZSBibG9ja2hhc2ggZmllbGRcbiAqIC0gdHJhbnNhY3Rpb24gY29uZmlnIChjb21wdXRlIHVuaXQgbGltaXQsIGhlYXAgc2l6ZSwgbG9hZGVkIGFjY291bnRzIGRhdGFcbiAqICAgc2l6ZSBsaW1pdCwgcHJpb3JpdHkgZmVlIGFzIHRvdGFsIGxhbXBvcnRzKVxuICogLSBzaWduZXIgbWFuYWdlbWVudDogcHJpdmF0ZS1rZXkgc2lnbmVycyAoYHNpZ25gKSBhbmQgZXh0ZXJuYWwgc2lnbmF0dXJlc1xuICogICAoYGFkZFNpZ25hdHVyZWApLCBhc3NlbWJsZWQgaW4gbWVzc2FnZS1zaWduZXIgb3JkZXJcbiAqIC0gbWVzc2FnZSBjb21waWxlIHZpYSBgY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZWAgYW5kIHNpZ25lZCB3aXJlIHZpYVxuICogICBgc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uYFxuICpcbiAqIFNpZ25hdHVyZSBhc3NlbWJseSBpcyBpbiBtZXNzYWdlLXNpZ25lciBvcmRlciAoZmVlIHBheWVyIGZpcnN0LCB0aGVuIHRoZVxuICogcmVtYWluaW5nIHNpZ25lcnMgaW4gdGhlIGNvbXBpbGVkIGFjY291bnQgb3JkZXIpLCBOT1QgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICogcmVxdWlyZWQgZm9yIG11bHRpLXNpZ25lciB2MSB0cmFuc2FjdGlvbnMgc3VjaCBhcyBkdXJhYmxlLW5vbmNlIENUXG4gKiAodXNlciArIGdhcy10YW5rIG5vbmNlIGF1dGhvcml0eSkuIE1pc3Npbmcgc2lnbmF0dXJlcyBhcmUgemVyby1maWxsZWQgaW5cbiAqIHRoZWlyIHNsb3RzIHNvIHRoZSB3aXJlIHNoYXBlIHN0YXlzIHZhbGlkIGZvciBwYXJ0aWFsLXNpZ24gZmxvd3M7IHRoZVxuICogYnJvYWRjYXN0YWJsZSB3aXJlIGlzIG9ubHkgcHJvZHVjZWQgb25jZSBldmVyeSByZXF1aXJlZCBzaWduZXIgaGFzIGFcbiAqIHNpZ25hdHVyZS5cbiAqL1xuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3Ige0BsaW5rIFYxVHJhbnNhY3Rpb25CdWlsZGVyLnRyYW5zYWN0aW9uQ29uZmlnfTogYWxsIGZpZWxkcyBvcHRpb25hbDtcbiAqIHVuc2V0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBudWxsICh0aGUgU0RLIHYxIHNlcmlhbGl6ZXIgY29udHJhY3QpLlxuICovXG5leHBvcnQgdHlwZSBWMVRyYW5zYWN0aW9uQ29uZmlnSW5wdXQgPSB7XG4gIGNvbXB1dGVVbml0TGltaXQ/OiBudW1iZXI7XG4gIGhlYXBTaXplPzogbnVtYmVyO1xuICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ/OiBudW1iZXI7XG4gIHByaW9yaXR5RmVlPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFYxVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9pbnN0cnVjdGlvbnNEYXRhOiBJbnN0cnVjdGlvblBhcmFtc1tdID0gW107XG4gIHByaXZhdGUgX2V4dHJhSW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfc2lnbmVyczogS2V5UGFpcltdID0gW107XG4gIHByaXZhdGUgX3NpZ25hdHVyZXM6IE1hcDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9sYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBfc2VuZGVyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfZmVlUGF5ZXI/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfcmVjZW50QmxvY2toYXNoOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfbm9uY2VJbmZvPzogTm9uY2U7XG4gIHByb3RlY3RlZCBfbWVtbz86IHN0cmluZztcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbkNvbmZpZz86IFNvbFYxVHJhbnNhY3Rpb25Db25maWc7XG4gIC8qKiBPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhlIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSBpZCAodXNlZCBieSBDVCBpbnN0cnVjdGlvbiBidWlsZGVycykgKi9cbiAgcHJvdGVjdGVkIF96a1Byb29mUHJvZ3JhbUlkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZTtcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkVjEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSB0aGUgdjEgdHJhbnNhY3Rpb246IGRlcml2ZSBpbnN0cnVjdGlvbnMsIGluamVjdCB0aGUgZHVyYWJsZS1ub25jZVxuICAgKiBpbnN0cnVjdGlvbiB3aGVuIHByZXNlbnQsIGNvbXBpbGUgdGhlIG1lc3NhZ2UsIGFuZCBhc3NlbWJsZSB0aGUgc2lnbmVkXG4gICAqIHdpcmUgaW4gbWVzc2FnZS1zaWduZXIgb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbn0gVGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGhvbGRpbmcgdGhlIHYxIG1lc3NhZ2UgYW5kIHdpcmUgYnl0ZXNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRWMSgpOiBUcmFuc2FjdGlvbiB7XG4gICAgYXNzZXJ0KHRoaXMuX3NlbmRlciwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignc2VuZGVyIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICBhc3NlcnQodGhpcy5fcmVjZW50QmxvY2toYXNoLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdyZWNlbnQgYmxvY2toYXNoIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICBhc3NlcnQodGhpcy5fdHJhbnNhY3Rpb25Db25maWcsICd0cmFuc2FjdGlvbkNvbmZpZyBpcyByZXF1aXJlZCB0byBidWlsZCBhIHYxIHRyYW5zYWN0aW9uJyk7XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gRHVyYWJsZSBub25jZTogdGhlIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb24gTVVTVCBiZSBwYXJ0IG9mIHRoZVxuICAgIC8vIG1lc3NhZ2UgKGEgYmFyZSBub25jZSBoYXNoIHdpdGhvdXQgdGhlIGluc3RydWN0aW9uIGlzIGludmFsaWQpLiBJdCBpc1xuICAgIC8vIHBsYWNlZCBmaXJzdCwgbWF0Y2hpbmcgdGhlIHYwIHdlYjMuanMgY29udmVudGlvbi5cbiAgICBpZiAodGhpcy5fbm9uY2VJbmZvKSB7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaChcbiAgICAgICAgYnVpbGRBZHZhbmNlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy53YWxsZXROb25jZUFkZHJlc3MsXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy5hdXRoV2FsbGV0QWRkcmVzc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSkge1xuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goLi4uc29sSW5zdHJ1Y3Rpb25GYWN0b3J5KGluc3RydWN0aW9uLCB0aGlzLl96a1Byb29mUHJvZ3JhbUlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21lbW8pIHtcbiAgICAgIGNvbnN0IG1lbW9EYXRhOiBNZW1vID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICBwYXJhbXM6IHsgbWVtbzogdGhpcy5fbWVtbyB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEucHVzaChtZW1vRGF0YSk7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5zb2xJbnN0cnVjdGlvbkZhY3RvcnkobWVtb0RhdGEpKTtcbiAgICB9XG5cbiAgICBpbnN0cnVjdGlvbnMucHVzaCguLi50aGlzLl9leHRyYUluc3RydWN0aW9ucyk7XG5cbiAgICBjb25zdCBmZWVQYXllciA9IHRoaXMuX2ZlZVBheWVyID8gbmV3IFB1YmxpY0tleSh0aGlzLl9mZWVQYXllcikgOiBuZXcgUHVibGljS2V5KHRoaXMuX3NlbmRlcik7XG4gICAgY29uc3QgbWVzc2FnZUJ5dGVzID0gY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgICAgZmVlUGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IHRoaXMuX3JlY2VudEJsb2NraGFzaCxcbiAgICAgIHRyYW5zYWN0aW9uQ29uZmlnOiB0aGlzLl90cmFuc2FjdGlvbkNvbmZpZyxcbiAgICB9KTtcblxuICAgIC8vIFNpZ25lciBvcmRlciBjb21lcyBmcm9tIHRoZSBjb21waWxlZCBtZXNzYWdlOiB0aGUgZmlyc3RcbiAgICAvLyBudW1TaWduZXJBY2NvdW50cyBzdGF0aWMgYWNjb3VudHMgYXJlIHRoZSByZXF1aXJlZCBzaWduZXJzIChmZWUgcGF5ZXJcbiAgICAvLyBmaXJzdCwgdGhlbiB0aGUgcmVtYWluaW5nIHNpZ25lcnMgaW4gdGhlIGNvbXBpbGVkIGFjY291bnQgb3JkZXIpLlxuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWMU1lc3NhZ2UobWVzc2FnZUJ5dGVzKTtcbiAgICBjb25zdCBzaWduZXJBZGRyZXNzZXMgPSBkZWNvZGVkLnN0YXRpY0FjY291bnRzLnNsaWNlKDAsIGRlY29kZWQuaGVhZGVyLm51bVNpZ25lckFjY291bnRzKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZXM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBzaWduZXJBZGRyZXNzZXMpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSB0aGlzLl9zaWduZXJzLmZpbmQoKHNpZ25lcikgPT4gc2lnbmVyLmdldEtleXMoKS5wdWIgPT09IGFkZHJlc3MpO1xuICAgICAgaWYgKGtleVBhaXIpIHtcbiAgICAgICAgY29uc3Qgc2VjcmV0S2V5ID0ga2V5UGFpci5nZXRLZXlzKHRydWUpLnBydjtcbiAgICAgICAgYXNzZXJ0KHNlY3JldEtleSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksICdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgICAgIHNpZ25hdHVyZXMucHVzaChuYWNsLnNpZ24uZGV0YWNoZWQobWVzc2FnZUJ5dGVzLCBzZWNyZXRLZXkpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlcm5hbCA9IHRoaXMuX3NpZ25hdHVyZXMuZ2V0KGFkZHJlc3MpO1xuICAgICAgaWYgKGV4dGVybmFsKSB7XG4gICAgICAgIHNpZ25hdHVyZXMucHVzaChleHRlcm5hbCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gTWlzc2luZyBzaWduYXR1cmU6IHplcm8tZmlsbCB0aGUgc2xvdCBzbyB0aGUgd2lyZSBzaGFwZSBzdGF5cyB2YWxpZFxuICAgICAgLy8gZm9yIHBhcnRpYWwtc2lnbiBmbG93czsgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBicm9hZGNhc3RhYmxlIHVudGlsXG4gICAgICAvLyBldmVyeSByZXF1aXJlZCBzaWduZXIgaGFzIGEgc2lnbmF0dXJlLlxuICAgICAgc2lnbmF0dXJlcy5wdXNoKG5ldyBVaW50OEFycmF5KDY0KSk7XG4gICAgfVxuXG4gICAgY29uc3QgdjFXaXJlID0gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG1lc3NhZ2VCeXRlcywgc2lnbmF0dXJlcyk7XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbi52MVRyYW5zYWN0aW9uQnl0ZXMgPSB2MVdpcmU7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24udjFNZXNzYWdlQnl0ZXMgPSBtZXNzYWdlQnl0ZXM7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24ubGFtcG9ydHNQZXJTaWduYXR1cmUgPSB0aGlzLl9sYW1wb3J0c1BlclNpZ25hdHVyZTtcblxuICAgIC8vIFBvcHVsYXRlIGEgbWV0YWRhdGEtb25seSBTb2xUcmFuc2FjdGlvbiBzbyB0b0pzb24gLyBsb2FkSW5wdXRzQW5kT3V0cHV0c1xuICAgIC8vIHdvcmsuIFRoZSBkdXJhYmxlIG5vbmNlIGlzIGNhcnJpZWQgdmlhIG5vbmNlSW5mbywgbWF0Y2hpbmcgdGhlIHYwIG1vZGVsLlxuICAgIGNvbnN0IG1ldGFUeCA9IG5ldyBTb2xUcmFuc2FjdGlvbigpO1xuICAgIG1ldGFUeC5mZWVQYXllciA9IGZlZVBheWVyO1xuICAgIG1ldGFUeC5yZWNlbnRCbG9ja2hhc2ggPSB0aGlzLl9yZWNlbnRCbG9ja2hhc2g7XG4gICAgaWYgKHRoaXMuX25vbmNlSW5mbykge1xuICAgICAgbWV0YVR4Lm5vbmNlSW5mbyA9IHtcbiAgICAgICAgbm9uY2U6IHRoaXMuX3JlY2VudEJsb2NraGFzaCxcbiAgICAgICAgbm9uY2VJbnN0cnVjdGlvbjogYnVpbGRBZHZhbmNlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy53YWxsZXROb25jZUFkZHJlc3MsXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy5hdXRoV2FsbGV0QWRkcmVzc1xuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gICAgbWV0YVR4LmFkZCguLi5pbnN0cnVjdGlvbnMpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNvbFRyYW5zYWN0aW9uID0gbWV0YVR4O1xuXG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRJbnN0cnVjdGlvbnNEYXRhKHRoaXMuX2luc3RydWN0aW9uc0RhdGEpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIGNvbnN0IHdpcmVCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuICAgIGNvbnN0IHsgbWVzc2FnZUJ5dGVzIH0gPSBwYXJzZVdpcmVUcmFuc2FjdGlvbih3aXJlQnl0ZXMpO1xuICAgIHR4LnYxVHJhbnNhY3Rpb25CeXRlcyA9IHdpcmVCeXRlcztcbiAgICB0eC52MU1lc3NhZ2VCeXRlcyA9IG1lc3NhZ2VCeXRlcztcblxuICAgIC8vIFBvcHVsYXRlIGEgbWV0YWRhdGEtb25seSBTb2xUcmFuc2FjdGlvbiBmcm9tIHRoZSBkZWNvZGVkIG1lc3NhZ2Ugc29cbiAgICAvLyB0b0pzb24gLyBsb2FkSW5wdXRzQW5kT3V0cHV0cyB3b3JrLlxuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWMU1lc3NhZ2UobWVzc2FnZUJ5dGVzKTtcbiAgICB0eC5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIGNvbnN0IG1ldGFUeCA9IG5ldyBTb2xUcmFuc2FjdGlvbigpO1xuICAgIG1ldGFUeC5mZWVQYXllciA9IG5ldyBQdWJsaWNLZXkoZGVjb2RlZC5zdGF0aWNBY2NvdW50c1swXSk7XG4gICAgbWV0YVR4LnJlY2VudEJsb2NraGFzaCA9IGRlY29kZWQuYmxvY2toYXNoO1xuICAgIGNvbnN0IG51bVdyaXRhYmxlU2lnbmVycyA9IGRlY29kZWQuaGVhZGVyLm51bVNpZ25lckFjY291bnRzIC0gZGVjb2RlZC5oZWFkZXIubnVtUmVhZG9ubHlTaWduZXJBY2NvdW50cztcbiAgICBjb25zdCBudW1Xcml0YWJsZU5vblNpZ25lcnMgPSBkZWNvZGVkLnN0YXRpY0FjY291bnRzLmxlbmd0aCAtIGRlY29kZWQuaGVhZGVyLm51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHM7XG4gICAgZm9yIChjb25zdCBjb21waWxlZCBvZiBkZWNvZGVkLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBtZXRhVHguYWRkKFxuICAgICAgICBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBuZXcgUHVibGljS2V5KGRlY29kZWQuc3RhdGljQWNjb3VudHNbY29tcGlsZWQucHJvZ3JhbUFkZHJlc3NJbmRleF0pLFxuICAgICAgICAgIGtleXM6IGNvbXBpbGVkLmFjY291bnRJbmRpY2VzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBwdWJrZXk6IG5ldyBQdWJsaWNLZXkoZGVjb2RlZC5zdGF0aWNBY2NvdW50c1tpbmRleF0pLFxuICAgICAgICAgICAgaXNTaWduZXI6IGluZGV4IDwgZGVjb2RlZC5oZWFkZXIubnVtU2lnbmVyQWNjb3VudHMsXG4gICAgICAgICAgICBpc1dyaXRhYmxlOlxuICAgICAgICAgICAgICBpbmRleCA8IG51bVdyaXRhYmxlU2lnbmVycyB8fFxuICAgICAgICAgICAgICAoaW5kZXggPj0gZGVjb2RlZC5oZWFkZXIubnVtU2lnbmVyQWNjb3VudHMgJiYgaW5kZXggPCBudW1Xcml0YWJsZU5vblNpZ25lcnMpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShjb21waWxlZC5kYXRhKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHR4LnNvbFRyYW5zYWN0aW9uID0gbWV0YVR4O1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLy8gcmVnaW9uIEdldHRlcnMgYW5kIFNldHRlcnNcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy52YWxpZGF0ZUtleShrZXkpO1xuICAgIHRoaXMuY2hlY2tEdXBsaWNhdGVkU2lnbmVyKGtleSk7XG4gICAgY29uc3QgcHJ2ID0ga2V5LmtleTtcbiAgICBjb25zdCBzaWduZXIgPSBuZXcgS2V5UGFpcih7IHBydjogcHJ2IH0pO1xuICAgIHRoaXMuX3NpZ25lcnMucHVzaChzaWduZXIpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFkZFNpZ25hdHVyZShwdWJsaWNLZXk6IEJhc2VQdWJsaWNLZXksIHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgdGhpcy5fc2lnbmF0dXJlcy5zZXQocHVibGljS2V5LnB1YiwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc2VuZGVyIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqIFRoaXMgYWNjb3VudCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBwYXlpbmcgdHJhbnNhY3Rpb24gZmVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbmRlckFkZHJlc3MgdGhlIGFjY291bnQgdGhhdCBpcyBzZW5kaW5nIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHNlbmRlcihzZW5kZXJBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgJ3NlbmRlcicpO1xuICAgIHRoaXMuX3NlbmRlciA9IHNlbmRlckFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiBub25jZS5cbiAgICogUmVxdWlyZXMgYm90aCBvcHRpb25hbCBwYXJhbXMgaW4gb3JkZXIgdG8gdXNlIHRoZSBkdXJhYmxlIG5vbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmxvY2tIYXNoIFRoZSBsYXRlc3QgYmxvY2tIYXNoIG9yIHRoZSBkdXJhYmxlIG5vbmNlIGhhc2hcbiAgICogQHBhcmFtIHtEdXJhYmxlTm9uY2VQYXJhbXN9IFtkdXJhYmxlTm9uY2VQYXJhbXNdIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB3YWxsZXROb25jZUFkZHJlc3MgYW5kIHRoZSBhdXRoV2FsbGV0QWRkcmVzcyAocmVxdWlyZWQgZm9yIGR1cmFibGUgbm9uY2UpXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBub25jZShibG9ja0hhc2g6IHN0cmluZywgZHVyYWJsZU5vbmNlUGFyYW1zPzogeyB3YWxsZXROb25jZUFkZHJlc3M6IHN0cmluZzsgYXV0aFdhbGxldEFkZHJlc3M6IHN0cmluZyB9KTogdGhpcyB7XG4gICAgaWYgKCFibG9ja0hhc2ggfHwgIWlzVmFsaWRCbG9ja0lkKGJsb2NrSGFzaCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBibG9ja0hhc2gsIGdvdDogJyArIGJsb2NrSGFzaCk7XG4gICAgfVxuICAgIGlmIChkdXJhYmxlTm9uY2VQYXJhbXMpIHtcbiAgICAgIHZhbGlkYXRlQWRkcmVzcyhkdXJhYmxlTm9uY2VQYXJhbXMud2FsbGV0Tm9uY2VBZGRyZXNzLCAnd2FsbGV0Tm9uY2VBZGRyZXNzJyk7XG4gICAgICB2YWxpZGF0ZUFkZHJlc3MoZHVyYWJsZU5vbmNlUGFyYW1zLmF1dGhXYWxsZXRBZGRyZXNzLCAnYXV0aFdhbGxldEFkZHJlc3MnKTtcbiAgICAgIGlmIChkdXJhYmxlTm9uY2VQYXJhbXMud2FsbGV0Tm9uY2VBZGRyZXNzID09PSBkdXJhYmxlTm9uY2VQYXJhbXMuYXV0aFdhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBwYXJhbXM6IHdhbGxldE5vbmNlQWRkcmVzcyBjYW5ub3QgYmUgZXF1YWwgdG8gYXV0aFdhbGxldEFkZHJlc3MnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vbmNlSW5mbyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICBwYXJhbXM6IGR1cmFibGVOb25jZVBhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuX3JlY2VudEJsb2NraGFzaCA9IGJsb2NrSGFzaDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGludGVudCBpbnN0cnVjdGlvbnMgdG8gYnVpbGQsIHVzaW5nIHRoZSBzaGFyZWQgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gICAqIHJlcHJlc2VudGF0aW9uIGNvbnN1bWVkIGJ5IGBzb2xJbnN0cnVjdGlvbkZhY3RvcnlgIChzYW1lIGFzIHRoZSB2MCBmbG93cykuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gaW5zdHJ1Y3Rpb25zIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uUGFyYW1zW10pOiB0aGlzIHtcbiAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gWy4uLmluc3RydWN0aW9uc107XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIGEgcHJlLWJ1aWx0IGluc3RydWN0aW9uIChlLmcuIGFuIGVudmVsb3BlLWRlcml2ZWQgaW5zdHJ1Y3Rpb24gb3IgYVxuICAgKiBjdXN0b20gaW5zdHJ1Y3Rpb24pIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYXBwZW5kXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBhZGRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IHRoaXMge1xuICAgIHRoaXMuX2V4dHJhSW5zdHJ1Y3Rpb25zLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdjEgdHJhbnNhY3Rpb24gY29uZmlnIChjb21wdXRlIHVuaXQgbGltaXQsIGhlYXAgc2l6ZSwgbG9hZGVkXG4gICAqIGFjY291bnRzIGRhdGEgc2l6ZSBsaW1pdCwgYW5kIHByaW9yaXR5IGZlZSBhcyB0b3RhbCBsYW1wb3J0cykuIFJlcXVpcmVkXG4gICAqIGJlZm9yZSBidWlsZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtTb2xWMVRyYW5zYWN0aW9uQ29uZmlnfSBjb25maWcgdGhlIHYxIHRyYW5zYWN0aW9uIGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgdHJhbnNhY3Rpb25Db25maWcoY29uZmlnOiBWMVRyYW5zYWN0aW9uQ29uZmlnSW5wdXQpOiB0aGlzIHtcbiAgICB0aGlzLl90cmFuc2FjdGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbXB1dGVVbml0TGltaXQ6IGNvbmZpZy5jb21wdXRlVW5pdExpbWl0ID8/IG51bGwsXG4gICAgICBoZWFwU2l6ZTogY29uZmlnLmhlYXBTaXplID8/IG51bGwsXG4gICAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IGNvbmZpZy5sb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQgPz8gbnVsbCxcbiAgICAgIHByaW9yaXR5RmVlOiBjb25maWcucHJpb3JpdHlGZWUgPz8gbnVsbCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGJ1aWxkZXIgZnJvbSBhIGNsaWVudC1zdXBwbGllZCB2MSBlbnZlbG9wZVxuICAgKiAoU29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKS4gU2V0cyB0aGUgZmVlIHBheWVyIGZyb20gc3RhdGljQWNjb3VudEtleXNbMF0sXG4gICAqIGNvZXJjZXMgdGhlIHRyYW5zYWN0aW9uIGNvbmZpZywgYW5kIGNvbnZlcnRzIGVhY2ggZW52ZWxvcGUgaW5zdHJ1Y3Rpb24gdG8gYW5cbiAgICogYWRkcmVzcy1iYXNlZCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHZpYSB7QGxpbmsgdG9WMVRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIHRoZSB2MSBlbnZlbG9wZVxuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgZnJvbVZlcnNpb25lZERhdGEoZGF0YTogU29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKTogdGhpcyB7XG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuc3RhdGljQWNjb3VudEtleXMpIHx8IGRhdGEuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdzdGF0aWNBY2NvdW50S2V5cyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5Jyk7XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3ZlcnNpb25lZEluc3RydWN0aW9ucyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmICghZGF0YS5tZXNzYWdlSGVhZGVyIHx8IHR5cGVvZiBkYXRhLm1lc3NhZ2VIZWFkZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdtZXNzYWdlSGVhZGVyIG11c3QgYmUgYSB2YWxpZCBvYmplY3QnKTtcbiAgICB9XG4gICAgdGhpcy5fc2VuZGVyID0gZGF0YS5zdGF0aWNBY2NvdW50S2V5c1swXTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbXB1dGVVbml0TGltaXQ6IGRhdGEudHJhbnNhY3Rpb25Db25maWc/LmNvbXB1dGVVbml0TGltaXQgPz8gbnVsbCxcbiAgICAgIGhlYXBTaXplOiBkYXRhLnRyYW5zYWN0aW9uQ29uZmlnPy5oZWFwU2l6ZSA/PyBudWxsLFxuICAgICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiBkYXRhLnRyYW5zYWN0aW9uQ29uZmlnPy5sb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQgPz8gbnVsbCxcbiAgICAgIHByaW9yaXR5RmVlOiBkYXRhLnRyYW5zYWN0aW9uQ29uZmlnPy5wcmlvcml0eUZlZSA/PyBudWxsLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBkYXRhLnZlcnNpb25lZEluc3RydWN0aW9ucykge1xuICAgICAgdGhpcy5hZGRJbnN0cnVjdGlvbih0b1YxVHJhbnNhY3Rpb25JbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHByaW9yaXR5IGZlZSAodG90YWwgbGFtcG9ydHMpIG9uIHRoZSB2MSB0cmFuc2FjdGlvbiBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7RmVlT3B0aW9uc30gZmVlT3B0aW9ucyB0aGUgcHJpb3JpdHkgZmVlXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBzZXRQcmlvcml0eUZlZShmZWVPcHRpb25zOiBGZWVPcHRpb25zKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLl90cmFuc2FjdGlvbkNvbmZpZykge1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb25Db25maWcgPSB7XG4gICAgICAgIGNvbXB1dGVVbml0TGltaXQ6IG51bGwsXG4gICAgICAgIGhlYXBTaXplOiBudWxsLFxuICAgICAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IG51bGwsXG4gICAgICAgIHByaW9yaXR5RmVlOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25Db25maWcucHJpb3JpdHlGZWUgPSBOdW1iZXIoZmVlT3B0aW9ucy5hbW91bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmVlIChsYW1wb3J0cyBwZXIgc2lnbmF0dXJlKSBmb3IgZmVlIGVzdGltYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7RmVlT3B0aW9uc30gZmVlT3B0aW9ucyB0aGUgZmVlXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBmZWUoZmVlT3B0aW9uczogRmVlT3B0aW9ucyk6IHRoaXMge1xuICAgIHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID0gTnVtYmVyKGZlZU9wdGlvbnMuYW1vdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZlZVBheWVyKGZlZVBheWVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWVQYXllciA9IGZlZVBheWVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWVtby5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lbW9cbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIG1lbW8obWVtbzogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZU1lbW8obWVtbyk7XG4gICAgdGhpcy5fbWVtbyA9IG1lbW87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSBpZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGNhbm9uaWNhbCBvbi1jaGFpbiBwcm9ncmFtIGlkIChgWmtFMUdhbWExUHJvb2YxMTEuLi5gKVxuICAgKiB3aGljaCBpcyB0aGUgc2FtZSBhY3Jvc3MgbWFpbm5ldCwgZGV2bmV0LCBhbmQgdGVzdG5ldC4gT3ZlcnJpZGUgb25seVxuICAgKiB3aGVuIHRhcmdldGluZyBhIGN1c3RvbSBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvZ3JhbUlkIGJhc2U1OCBlbmNvZGVkIHByb2dyYW0gaWRcbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHprUHJvb2ZQcm9ncmFtSWQocHJvZ3JhbUlkOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBhc3NlcnQocHJvZ3JhbUlkLCAnTWlzc2luZyBwcm9ncmFtSWQgcGFyYW0nKTtcbiAgICB0aGlzLl96a1Byb29mUHJvZ3JhbUlkID0gcHJvZ3JhbUlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8vIHJlZ2lvbiBWYWxpZGF0b3JzXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUFkZHJlc3MoYWRkcmVzczogQmFzZUFkZHJlc3MsIGFkZHJlc3NGb3JtYXQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWlzVmFsaWRBZGRyZXNzKGFkZHJlc3MuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgYWRkcmVzcyAnICsgYWRkcmVzcy5hZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoa2V5OiBCYXNlS2V5KTogdm9pZCB7XG4gICAgbGV0IGtleVBhaXI6IEtleVBhaXI7XG4gICAgdHJ5IHtcbiAgICAgIGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjoga2V5LmtleSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXlQYWlyLmdldEtleXMoKS5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQga2V5Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBwYXJzZVdpcmVUcmFuc2FjdGlvbihuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2Jhc2U2NCcpKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb246ICcgKyAoZSBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVTZW5kZXIoKTtcbiAgICB0aGlzLnZhbGlkYXRlTm9uY2UoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVZhbHVlKHZhbHVlOiBCaWdOdW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUuaXNMZXNzVGhhbigwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWVtby5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lbW8gLSB0aGUgbWVtbyBhcyBzdHJpbmdcbiAgICovXG4gIHZhbGlkYXRlTWVtbyhtZW1vOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIW1lbW8pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgbWVtbywgZ290OiAnICsgbWVtbyk7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZE1lbW8obWVtbykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ01lbW8gaXMgdG9vIGxvbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGlzLl9zaWduZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VLZXl9IGtleSAtIFRoZSBrZXkgdG8gY2hlY2tcbiAgICovXG4gIHByaXZhdGUgY2hlY2tEdXBsaWNhdGVkU2lnbmVyKGtleTogQmFzZUtleSkge1xuICAgIHRoaXMuX3NpZ25lcnMuZm9yRWFjaCgoa3ApID0+IHtcbiAgICAgIGlmIChrcC5nZXRLZXlzKCkucHJ2ID09PSBrZXkua2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ0R1cGxpY2F0ZWQgc2lnbmVyOiAnICsga2V5LmtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHNlbmRlciBmaWVsZCBpcyBkZWZpbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlbmRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fc2VuZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgc2VuZGVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBub25jZSBmaWVsZCBpcyBkZWZpbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU5vbmNlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yZWNlbnRCbG9ja2hhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBub25jZSBibG9ja2hhc2gnKTtcbiAgICB9XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG59XG4iXX0=