@bitgo-beta/sdk-coin-sol 7.6.4-beta.75 → 7.6.4-beta.751

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