@bitgo-beta/utxo-core 1.0.1-alpha.2 → 1.0.1-alpha.200

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 (352) hide show
  1. package/dist/cjs/src/Output.d.ts +43 -0
  2. package/dist/cjs/src/Output.d.ts.map +1 -0
  3. package/dist/cjs/src/Output.js +60 -0
  4. package/dist/cjs/src/bip322/index.d.ts +5 -0
  5. package/dist/cjs/src/bip322/index.d.ts.map +1 -0
  6. package/dist/cjs/src/bip322/index.js +21 -0
  7. package/dist/cjs/src/bip322/toSign.d.ts +25 -0
  8. package/dist/cjs/src/bip322/toSign.d.ts.map +1 -0
  9. package/dist/cjs/src/bip322/toSign.js +125 -0
  10. package/dist/cjs/src/bip322/toSpend.d.ts +22 -0
  11. package/dist/cjs/src/bip322/toSpend.d.ts.map +1 -0
  12. package/dist/cjs/src/bip322/toSpend.js +72 -0
  13. package/dist/cjs/src/bip322/utils.d.ts +18 -0
  14. package/dist/cjs/src/bip322/utils.d.ts.map +1 -0
  15. package/dist/cjs/src/bip322/utils.js +115 -0
  16. package/dist/cjs/src/bip322/verify.d.ts +12 -0
  17. package/dist/cjs/src/bip322/verify.d.ts.map +1 -0
  18. package/dist/cjs/src/bip322/verify.js +113 -0
  19. package/dist/cjs/src/bip32utils.d.ts +12 -0
  20. package/dist/cjs/src/bip32utils.d.ts.map +1 -0
  21. package/dist/cjs/src/bip32utils.js +15 -0
  22. package/dist/cjs/src/bip65/index.d.ts +2 -0
  23. package/dist/cjs/src/bip65/index.d.ts.map +1 -0
  24. package/dist/{src/testutil → cjs/src/bip65}/index.js +2 -4
  25. package/dist/cjs/src/bip65/locktime.d.ts +8 -0
  26. package/dist/cjs/src/bip65/locktime.d.ts.map +1 -0
  27. package/dist/cjs/src/bip65/locktime.js +37 -0
  28. package/dist/{src → cjs/src}/descriptor/DescriptorMap.d.ts +1 -1
  29. package/dist/cjs/src/descriptor/DescriptorMap.d.ts.map +1 -0
  30. package/dist/cjs/src/descriptor/DescriptorMap.js +9 -0
  31. package/dist/cjs/src/descriptor/Output.d.ts +23 -0
  32. package/dist/cjs/src/descriptor/Output.d.ts.map +1 -0
  33. package/dist/cjs/src/descriptor/Output.js +41 -0
  34. package/dist/{src → cjs/src}/descriptor/VirtualSize.d.ts +3 -1
  35. package/dist/cjs/src/descriptor/VirtualSize.d.ts.map +1 -0
  36. package/dist/cjs/src/descriptor/VirtualSize.js +100 -0
  37. package/dist/{src → cjs/src}/descriptor/address.d.ts +2 -2
  38. package/dist/cjs/src/descriptor/address.d.ts.map +1 -0
  39. package/dist/{src → cjs/src}/descriptor/address.js +2 -2
  40. package/dist/cjs/src/descriptor/derive.d.ts +13 -0
  41. package/dist/cjs/src/descriptor/derive.d.ts.map +1 -0
  42. package/dist/cjs/src/descriptor/derive.js +45 -0
  43. package/dist/cjs/src/descriptor/fromFixedScriptWallet.d.ts +16 -0
  44. package/dist/cjs/src/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
  45. package/dist/cjs/src/descriptor/fromFixedScriptWallet.js +88 -0
  46. package/dist/cjs/src/descriptor/index.d.ts +11 -0
  47. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  48. package/dist/cjs/src/descriptor/index.js +27 -0
  49. package/dist/cjs/src/descriptor/parse/PatternMatcher.d.ts +14 -0
  50. package/dist/cjs/src/descriptor/parse/PatternMatcher.d.ts.map +1 -0
  51. package/dist/cjs/src/descriptor/parse/PatternMatcher.js +60 -0
  52. package/dist/{src → cjs/src}/descriptor/psbt/assertSatisfiable.d.ts +1 -1
  53. package/dist/cjs/src/descriptor/psbt/assertSatisfiable.d.ts.map +1 -0
  54. package/dist/cjs/src/descriptor/psbt/assertSatisfiable.js +74 -0
  55. package/dist/cjs/src/descriptor/psbt/createPsbt.d.ts +23 -0
  56. package/dist/cjs/src/descriptor/psbt/createPsbt.d.ts.map +1 -0
  57. package/dist/cjs/src/descriptor/psbt/createPsbt.js +107 -0
  58. package/dist/{src → cjs/src}/descriptor/psbt/findDescriptors.d.ts +7 -3
  59. package/dist/cjs/src/descriptor/psbt/findDescriptors.d.ts.map +1 -0
  60. package/dist/cjs/src/descriptor/psbt/findDescriptors.js +98 -0
  61. package/dist/{src → cjs/src}/descriptor/psbt/index.d.ts +1 -0
  62. package/dist/cjs/src/descriptor/psbt/index.d.ts.map +1 -0
  63. package/dist/{src → cjs/src}/descriptor/psbt/index.js +2 -1
  64. package/dist/{src → cjs/src}/descriptor/psbt/parse.d.ts +2 -2
  65. package/dist/cjs/src/descriptor/psbt/parse.d.ts.map +1 -0
  66. package/dist/cjs/src/descriptor/psbt/parse.js +87 -0
  67. package/dist/cjs/src/descriptor/psbt/sign.d.ts +26 -0
  68. package/dist/cjs/src/descriptor/psbt/sign.d.ts.map +1 -0
  69. package/dist/cjs/src/descriptor/psbt/sign.js +42 -0
  70. package/dist/{src → cjs/src}/descriptor/psbt/wrap.d.ts +1 -1
  71. package/dist/cjs/src/descriptor/psbt/wrap.d.ts.map +1 -0
  72. package/dist/cjs/src/descriptor/psbt/wrap.js +76 -0
  73. package/dist/cjs/src/dustThreshold.d.ts +4 -0
  74. package/dist/cjs/src/dustThreshold.d.ts.map +1 -0
  75. package/dist/cjs/src/dustThreshold.js +134 -0
  76. package/dist/cjs/src/index.d.ts +10 -0
  77. package/dist/cjs/src/index.d.ts.map +1 -0
  78. package/dist/{src → cjs/src}/index.js +12 -2
  79. package/dist/cjs/src/paygo/attestation.d.ts +11 -0
  80. package/dist/cjs/src/paygo/attestation.d.ts.map +1 -0
  81. package/dist/cjs/src/paygo/attestation.js +58 -0
  82. package/dist/cjs/src/paygo/index.d.ts +3 -0
  83. package/dist/cjs/src/paygo/index.d.ts.map +1 -0
  84. package/dist/cjs/src/paygo/index.js +19 -0
  85. package/dist/cjs/src/paygo/parsePayGoAttestation.d.ts +16 -0
  86. package/dist/cjs/src/paygo/parsePayGoAttestation.d.ts.map +1 -0
  87. package/dist/cjs/src/paygo/parsePayGoAttestation.js +50 -0
  88. package/dist/cjs/src/paygo/psbt/Errors.d.ts +22 -0
  89. package/dist/cjs/src/paygo/psbt/Errors.d.ts.map +1 -0
  90. package/dist/cjs/src/paygo/psbt/Errors.js +44 -0
  91. package/dist/cjs/src/paygo/psbt/index.d.ts +2 -0
  92. package/dist/cjs/src/paygo/psbt/index.d.ts.map +1 -0
  93. package/dist/cjs/src/paygo/psbt/index.js +18 -0
  94. package/dist/cjs/src/paygo/psbt/payGoAddressProof.d.ts +29 -0
  95. package/dist/cjs/src/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
  96. package/dist/cjs/src/paygo/psbt/payGoAddressProof.js +124 -0
  97. package/dist/{src → cjs/src}/testutil/descriptor/descriptors.d.ts +5 -2
  98. package/dist/cjs/src/testutil/descriptor/descriptors.d.ts.map +1 -0
  99. package/dist/cjs/src/testutil/descriptor/descriptors.js +162 -0
  100. package/dist/cjs/src/testutil/descriptor/index.d.ts.map +1 -0
  101. package/dist/{src → cjs/src}/testutil/descriptor/index.js +1 -1
  102. package/dist/{src → cjs/src}/testutil/descriptor/mock.utils.d.ts +6 -4
  103. package/dist/cjs/src/testutil/descriptor/mock.utils.d.ts.map +1 -0
  104. package/dist/cjs/src/testutil/descriptor/mock.utils.js +92 -0
  105. package/dist/cjs/src/testutil/descriptor/psbt.utils.d.ts.map +1 -0
  106. package/dist/cjs/src/testutil/descriptor/psbt.utils.js +21 -0
  107. package/dist/cjs/src/testutil/fixtures.utils.d.ts.map +1 -0
  108. package/dist/cjs/src/testutil/fixtures.utils.js +127 -0
  109. package/dist/cjs/src/testutil/generatePayGoAttestationProof.utils.d.ts +12 -0
  110. package/dist/cjs/src/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -0
  111. package/dist/cjs/src/testutil/generatePayGoAttestationProof.utils.js +38 -0
  112. package/dist/cjs/src/testutil/index.d.ts +6 -0
  113. package/dist/cjs/src/testutil/index.d.ts.map +1 -0
  114. package/dist/cjs/src/testutil/index.js +22 -0
  115. package/dist/{src → cjs/src}/testutil/key.utils.d.ts +1 -1
  116. package/dist/cjs/src/testutil/key.utils.d.ts.map +1 -0
  117. package/dist/cjs/src/testutil/key.utils.js +60 -0
  118. package/dist/cjs/src/testutil/toPlainObject.utils.d.ts.map +1 -0
  119. package/dist/cjs/src/testutil/toPlainObject.utils.js +89 -0
  120. package/dist/cjs/src/testutil/trimMessagePrefix.d.ts +11 -0
  121. package/dist/cjs/src/testutil/trimMessagePrefix.d.ts.map +1 -0
  122. package/dist/cjs/src/testutil/trimMessagePrefix.js +60 -0
  123. package/dist/cjs/src/xOnlyPubkey.d.ts +2 -0
  124. package/dist/cjs/src/xOnlyPubkey.d.ts.map +1 -0
  125. package/dist/cjs/src/xOnlyPubkey.js +18 -0
  126. package/dist/cjs/test/Output.d.ts +2 -0
  127. package/dist/cjs/test/Output.d.ts.map +1 -0
  128. package/dist/cjs/test/Output.js +70 -0
  129. package/dist/cjs/test/bip322/bip322.utils.d.ts +7 -0
  130. package/dist/cjs/test/bip322/bip322.utils.d.ts.map +1 -0
  131. package/dist/cjs/test/bip322/bip322.utils.js +16 -0
  132. package/dist/cjs/test/bip322/toSign.d.ts +2 -0
  133. package/dist/cjs/test/bip322/toSign.d.ts.map +1 -0
  134. package/dist/cjs/test/bip322/toSign.js +133 -0
  135. package/dist/cjs/test/bip322/toSpend.d.ts +2 -0
  136. package/dist/cjs/test/bip322/toSpend.d.ts.map +1 -0
  137. package/dist/cjs/test/bip322/toSpend.js +70 -0
  138. package/dist/cjs/test/bip322/utils.d.ts +2 -0
  139. package/dist/cjs/test/bip322/utils.d.ts.map +1 -0
  140. package/dist/cjs/test/bip322/utils.js +79 -0
  141. package/dist/cjs/test/bip322/verify.d.ts +2 -0
  142. package/dist/cjs/test/bip322/verify.d.ts.map +1 -0
  143. package/dist/cjs/test/bip322/verify.js +293 -0
  144. package/dist/cjs/test/bip32utils.d.ts +2 -0
  145. package/dist/cjs/test/bip32utils.d.ts.map +1 -0
  146. package/dist/cjs/test/bip32utils.js +62 -0
  147. package/dist/cjs/test/bip65/locktime.d.ts +2 -0
  148. package/dist/cjs/test/bip65/locktime.d.ts.map +1 -0
  149. package/dist/cjs/test/bip65/locktime.js +22 -0
  150. package/dist/cjs/test/descriptor/Output.d.ts +2 -0
  151. package/dist/cjs/test/descriptor/Output.d.ts.map +1 -0
  152. package/dist/cjs/test/descriptor/Output.js +44 -0
  153. package/dist/cjs/test/descriptor/derive.d.ts +2 -0
  154. package/dist/cjs/test/descriptor/derive.d.ts.map +1 -0
  155. package/dist/cjs/test/descriptor/derive.js +27 -0
  156. package/dist/cjs/test/descriptor/fromFixedScriptWallet.d.ts +2 -0
  157. package/dist/cjs/test/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
  158. package/dist/cjs/test/descriptor/fromFixedScriptWallet.js +145 -0
  159. package/dist/cjs/test/descriptor/parse/PatternMatcher.d.ts +2 -0
  160. package/dist/cjs/test/descriptor/parse/PatternMatcher.d.ts.map +1 -0
  161. package/dist/cjs/test/descriptor/parse/PatternMatcher.js +120 -0
  162. package/dist/cjs/test/descriptor/psbt/VirtualSize.d.ts +2 -0
  163. package/dist/cjs/test/descriptor/psbt/VirtualSize.d.ts.map +1 -0
  164. package/dist/cjs/test/descriptor/psbt/VirtualSize.js +71 -0
  165. package/dist/cjs/test/descriptor/psbt/assertSatisfiable.d.ts +2 -0
  166. package/dist/cjs/test/descriptor/psbt/assertSatisfiable.d.ts.map +1 -0
  167. package/dist/cjs/test/descriptor/psbt/assertSatisfiable.js +56 -0
  168. package/dist/cjs/test/descriptor/psbt/findDescriptors.d.ts +2 -0
  169. package/dist/cjs/test/descriptor/psbt/findDescriptors.d.ts.map +1 -0
  170. package/dist/cjs/test/descriptor/psbt/findDescriptors.js +70 -0
  171. package/dist/cjs/test/descriptor/psbt/psbt.d.ts +2 -0
  172. package/dist/cjs/test/descriptor/psbt/psbt.d.ts.map +1 -0
  173. package/dist/cjs/test/descriptor/psbt/psbt.js +211 -0
  174. package/dist/cjs/test/dustThreshold.d.ts +2 -0
  175. package/dist/cjs/test/dustThreshold.d.ts.map +1 -0
  176. package/dist/cjs/test/dustThreshold.js +110 -0
  177. package/dist/cjs/test/paygo/attestation.d.ts +2 -0
  178. package/dist/cjs/test/paygo/attestation.d.ts.map +1 -0
  179. package/dist/cjs/test/paygo/attestation.js +23 -0
  180. package/dist/cjs/test/paygo/parsePayGoAttestation.d.ts +2 -0
  181. package/dist/cjs/test/paygo/parsePayGoAttestation.d.ts.map +1 -0
  182. package/dist/cjs/test/paygo/parsePayGoAttestation.js +75 -0
  183. package/dist/cjs/test/paygo/psbt/payGoAddressProof.d.ts +9 -0
  184. package/dist/cjs/test/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
  185. package/dist/cjs/test/paygo/psbt/payGoAddressProof.js +163 -0
  186. package/dist/cjs/test/xOnlyPubkey.d.ts +2 -0
  187. package/dist/cjs/test/xOnlyPubkey.d.ts.map +1 -0
  188. package/dist/cjs/test/xOnlyPubkey.js +18 -0
  189. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  190. package/dist/esm/Output.d.ts +43 -0
  191. package/dist/esm/Output.d.ts.map +1 -0
  192. package/dist/esm/Output.js +53 -0
  193. package/dist/esm/bip322/index.d.ts +5 -0
  194. package/dist/esm/bip322/index.d.ts.map +1 -0
  195. package/dist/esm/bip322/index.js +5 -0
  196. package/dist/esm/bip322/toSign.d.ts +25 -0
  197. package/dist/esm/bip322/toSign.d.ts.map +1 -0
  198. package/dist/esm/bip322/toSign.js +119 -0
  199. package/dist/esm/bip322/toSpend.d.ts +22 -0
  200. package/dist/esm/bip322/toSpend.d.ts.map +1 -0
  201. package/dist/esm/bip322/toSpend.js +66 -0
  202. package/dist/esm/bip322/utils.d.ts +18 -0
  203. package/dist/esm/bip322/utils.d.ts.map +1 -0
  204. package/dist/esm/bip322/utils.js +77 -0
  205. package/dist/esm/bip322/verify.d.ts +12 -0
  206. package/dist/esm/bip322/verify.d.ts.map +1 -0
  207. package/dist/esm/bip322/verify.js +74 -0
  208. package/dist/esm/bip32utils.d.ts +12 -0
  209. package/dist/esm/bip32utils.d.ts.map +1 -0
  210. package/dist/esm/bip32utils.js +12 -0
  211. package/dist/esm/bip65/index.d.ts +2 -0
  212. package/dist/esm/bip65/index.d.ts.map +1 -0
  213. package/dist/esm/bip65/index.js +2 -0
  214. package/dist/esm/bip65/locktime.d.ts +8 -0
  215. package/dist/esm/bip65/locktime.d.ts.map +1 -0
  216. package/dist/esm/bip65/locktime.js +34 -0
  217. package/dist/esm/descriptor/DescriptorMap.d.ts +9 -0
  218. package/dist/{src → esm}/descriptor/DescriptorMap.d.ts.map +1 -1
  219. package/dist/esm/descriptor/DescriptorMap.js +6 -0
  220. package/dist/esm/descriptor/Output.d.ts +23 -0
  221. package/dist/esm/descriptor/Output.d.ts.map +1 -0
  222. package/dist/esm/descriptor/Output.js +32 -0
  223. package/dist/esm/descriptor/VirtualSize.d.ts +23 -0
  224. package/dist/esm/descriptor/VirtualSize.d.ts.map +1 -0
  225. package/dist/esm/descriptor/VirtualSize.js +94 -0
  226. package/dist/esm/descriptor/address.d.ts +5 -0
  227. package/dist/esm/descriptor/address.d.ts.map +1 -0
  228. package/dist/esm/descriptor/address.js +11 -0
  229. package/dist/esm/descriptor/derive.d.ts +13 -0
  230. package/dist/esm/descriptor/derive.d.ts.map +1 -0
  231. package/dist/esm/descriptor/derive.js +38 -0
  232. package/dist/esm/descriptor/fromFixedScriptWallet.d.ts +16 -0
  233. package/dist/esm/descriptor/fromFixedScriptWallet.d.ts.map +1 -0
  234. package/dist/esm/descriptor/fromFixedScriptWallet.js +51 -0
  235. package/dist/esm/descriptor/index.d.ts +11 -0
  236. package/dist/esm/descriptor/index.d.ts.map +1 -0
  237. package/dist/esm/descriptor/index.js +11 -0
  238. package/dist/esm/descriptor/parse/PatternMatcher.d.ts +14 -0
  239. package/dist/esm/descriptor/parse/PatternMatcher.d.ts.map +1 -0
  240. package/dist/esm/descriptor/parse/PatternMatcher.js +56 -0
  241. package/dist/esm/descriptor/psbt/assertSatisfiable.d.ts +20 -0
  242. package/dist/{src → esm}/descriptor/psbt/assertSatisfiable.d.ts.map +1 -1
  243. package/dist/esm/descriptor/psbt/assertSatisfiable.js +69 -0
  244. package/dist/esm/descriptor/psbt/createPsbt.d.ts +23 -0
  245. package/dist/esm/descriptor/psbt/createPsbt.d.ts.map +1 -0
  246. package/dist/esm/descriptor/psbt/createPsbt.js +69 -0
  247. package/dist/esm/descriptor/psbt/findDescriptors.d.ts +26 -0
  248. package/dist/esm/descriptor/psbt/findDescriptors.d.ts.map +1 -0
  249. package/dist/esm/descriptor/psbt/findDescriptors.js +94 -0
  250. package/dist/esm/descriptor/psbt/index.d.ts +7 -0
  251. package/dist/{src → esm}/descriptor/psbt/index.d.ts.map +1 -1
  252. package/dist/esm/descriptor/psbt/index.js +7 -0
  253. package/dist/esm/descriptor/psbt/parse.d.ts +27 -0
  254. package/dist/esm/descriptor/psbt/parse.d.ts.map +1 -0
  255. package/dist/esm/descriptor/psbt/parse.js +51 -0
  256. package/dist/esm/descriptor/psbt/sign.d.ts +26 -0
  257. package/dist/esm/descriptor/psbt/sign.d.ts.map +1 -0
  258. package/dist/esm/descriptor/psbt/sign.js +34 -0
  259. package/dist/esm/descriptor/psbt/wrap.d.ts +12 -0
  260. package/dist/{src → esm}/descriptor/psbt/wrap.d.ts.map +1 -1
  261. package/dist/esm/descriptor/psbt/wrap.js +38 -0
  262. package/dist/esm/dustThreshold.d.ts +4 -0
  263. package/dist/esm/dustThreshold.d.ts.map +1 -0
  264. package/dist/esm/dustThreshold.js +97 -0
  265. package/dist/esm/index.d.ts +10 -0
  266. package/dist/esm/index.d.ts.map +1 -0
  267. package/dist/esm/index.js +10 -0
  268. package/dist/esm/paygo/attestation.d.ts +11 -0
  269. package/dist/esm/paygo/attestation.d.ts.map +1 -0
  270. package/dist/esm/paygo/attestation.js +18 -0
  271. package/dist/esm/paygo/index.d.ts +3 -0
  272. package/dist/esm/paygo/index.d.ts.map +1 -0
  273. package/dist/esm/paygo/index.js +3 -0
  274. package/dist/esm/paygo/parsePayGoAttestation.d.ts +16 -0
  275. package/dist/esm/paygo/parsePayGoAttestation.d.ts.map +1 -0
  276. package/dist/esm/paygo/parsePayGoAttestation.js +43 -0
  277. package/dist/esm/paygo/psbt/Errors.d.ts +22 -0
  278. package/dist/esm/paygo/psbt/Errors.d.ts.map +1 -0
  279. package/dist/esm/paygo/psbt/Errors.js +35 -0
  280. package/dist/esm/paygo/psbt/index.d.ts +2 -0
  281. package/dist/esm/paygo/psbt/index.d.ts.map +1 -0
  282. package/dist/esm/paygo/psbt/index.js +2 -0
  283. package/dist/esm/paygo/psbt/payGoAddressProof.d.ts +29 -0
  284. package/dist/esm/paygo/psbt/payGoAddressProof.d.ts.map +1 -0
  285. package/dist/esm/paygo/psbt/payGoAddressProof.js +85 -0
  286. package/dist/esm/testutil/descriptor/descriptors.d.ts +13 -0
  287. package/dist/esm/testutil/descriptor/descriptors.d.ts.map +1 -0
  288. package/dist/esm/testutil/descriptor/descriptors.js +150 -0
  289. package/dist/esm/testutil/descriptor/index.d.ts +4 -0
  290. package/dist/esm/testutil/descriptor/index.js +4 -0
  291. package/dist/esm/testutil/descriptor/mock.utils.d.ts +36 -0
  292. package/dist/esm/testutil/descriptor/mock.utils.d.ts.map +1 -0
  293. package/dist/esm/testutil/descriptor/mock.utils.js +53 -0
  294. package/dist/esm/testutil/descriptor/psbt.utils.d.ts +4 -0
  295. package/dist/{src → esm}/testutil/descriptor/psbt.utils.d.ts.map +1 -1
  296. package/dist/esm/testutil/descriptor/psbt.utils.js +17 -0
  297. package/dist/esm/testutil/fixtures.utils.d.ts +15 -0
  298. package/dist/{src → esm}/testutil/fixtures.utils.js +5 -42
  299. package/dist/esm/testutil/generatePayGoAttestationProof.utils.d.ts +12 -0
  300. package/dist/esm/testutil/generatePayGoAttestationProof.utils.d.ts.map +1 -0
  301. package/dist/esm/testutil/generatePayGoAttestationProof.utils.js +32 -0
  302. package/dist/esm/testutil/index.d.ts +6 -0
  303. package/dist/{src → esm}/testutil/index.d.ts.map +1 -1
  304. package/dist/esm/testutil/index.js +6 -0
  305. package/dist/esm/testutil/key.utils.d.ts +16 -0
  306. package/dist/{src → esm}/testutil/key.utils.d.ts.map +1 -1
  307. package/dist/esm/testutil/key.utils.js +22 -0
  308. package/dist/esm/testutil/toPlainObject.utils.d.ts +11 -0
  309. package/dist/{src → esm}/testutil/toPlainObject.utils.d.ts.map +1 -1
  310. package/dist/esm/testutil/toPlainObject.utils.js +85 -0
  311. package/dist/esm/testutil/trimMessagePrefix.d.ts +11 -0
  312. package/dist/esm/testutil/trimMessagePrefix.d.ts.map +1 -0
  313. package/dist/esm/testutil/trimMessagePrefix.js +24 -0
  314. package/dist/esm/xOnlyPubkey.d.ts +2 -0
  315. package/dist/esm/xOnlyPubkey.d.ts.map +1 -0
  316. package/dist/esm/xOnlyPubkey.js +15 -0
  317. package/package.json +51 -22
  318. package/dist/src/descriptor/DescriptorMap.js +0 -12
  319. package/dist/src/descriptor/Output.d.ts +0 -24
  320. package/dist/src/descriptor/Output.d.ts.map +0 -1
  321. package/dist/src/descriptor/Output.js +0 -22
  322. package/dist/src/descriptor/VirtualSize.d.ts.map +0 -1
  323. package/dist/src/descriptor/VirtualSize.js +0 -87
  324. package/dist/src/descriptor/address.d.ts.map +0 -1
  325. package/dist/src/descriptor/index.d.ts +0 -9
  326. package/dist/src/descriptor/index.d.ts.map +0 -1
  327. package/dist/src/descriptor/index.js +0 -49
  328. package/dist/src/descriptor/psbt/assertSatisfiable.js +0 -74
  329. package/dist/src/descriptor/psbt/createPsbt.d.ts +0 -15
  330. package/dist/src/descriptor/psbt/createPsbt.d.ts.map +0 -1
  331. package/dist/src/descriptor/psbt/createPsbt.js +0 -82
  332. package/dist/src/descriptor/psbt/findDescriptors.d.ts.map +0 -1
  333. package/dist/src/descriptor/psbt/findDescriptors.js +0 -85
  334. package/dist/src/descriptor/psbt/parse.d.ts.map +0 -1
  335. package/dist/src/descriptor/psbt/parse.js +0 -87
  336. package/dist/src/descriptor/psbt/wrap.js +0 -76
  337. package/dist/src/index.d.ts +0 -3
  338. package/dist/src/index.d.ts.map +0 -1
  339. package/dist/src/testutil/descriptor/descriptors.d.ts.map +0 -1
  340. package/dist/src/testutil/descriptor/descriptors.js +0 -105
  341. package/dist/src/testutil/descriptor/mock.utils.d.ts.map +0 -1
  342. package/dist/src/testutil/descriptor/mock.utils.js +0 -87
  343. package/dist/src/testutil/descriptor/psbt.utils.js +0 -20
  344. package/dist/src/testutil/index.d.ts +0 -4
  345. package/dist/src/testutil/key.utils.js +0 -59
  346. package/dist/src/testutil/toPlainObject.utils.js +0 -75
  347. /package/dist/{src → cjs/src}/testutil/descriptor/index.d.ts +0 -0
  348. /package/dist/{src → cjs/src}/testutil/descriptor/psbt.utils.d.ts +0 -0
  349. /package/dist/{src → cjs/src}/testutil/fixtures.utils.d.ts +0 -0
  350. /package/dist/{src → cjs/src}/testutil/toPlainObject.utils.d.ts +0 -0
  351. /package/dist/{src → esm}/testutil/descriptor/index.d.ts.map +0 -0
  352. /package/dist/{src → esm}/testutil/fixtures.utils.d.ts.map +0 -0
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const assert_1 = __importDefault(require("assert"));
7
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
8
+ const bip322_1 = require("../../src/bip322");
9
+ const bip322_utils_1 = require("./bip322.utils");
10
+ describe('to_spend', function () {
11
+ describe('Message hashing', function () {
12
+ // Test vectors from BIP322
13
+ // Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#message-hashing
14
+ const fixtures = [
15
+ {
16
+ message: '',
17
+ hash: 'c90c269c4f8fcbe6880f72a721ddfbf1914268a794cbb21cfafee13770ae19f1',
18
+ },
19
+ {
20
+ message: 'Hello World',
21
+ hash: 'f0eb03b1a75ac6d9847f55c624a99169b5dccba2a31f5b23bea77ba270de0a7a',
22
+ },
23
+ ];
24
+ fixtures.forEach(({ message, hash }) => {
25
+ it(`should hash the message "${message}"`, function () {
26
+ const result = (0, bip322_1.hashMessageWithTag)(Buffer.from(message));
27
+ assert_1.default.deepStrictEqual(result.toString('hex'), hash, `Hash for message "${message}" does not match expected value`);
28
+ });
29
+ });
30
+ });
31
+ describe('build to_spend transaction', function () {
32
+ const scriptPubKey = bip322_utils_1.BIP322_PAYMENT_P2WPKH_FIXTURE.output;
33
+ // Source: https://github.com/bitcoin/bips/blob/master/bip-0322.mediawiki#transaction-hashes
34
+ const fixtures = [
35
+ {
36
+ message: '',
37
+ txid: 'c5680aa69bb8d860bf82d4e9cd3504b55dde018de765a91bb566283c545a99a7',
38
+ },
39
+ {
40
+ message: 'Hello World',
41
+ txid: 'b79d196740ad5217771c1098fc4a4b51e0535c32236c71f1ea4d61a2d603352b',
42
+ },
43
+ ];
44
+ fixtures.forEach(({ message, txid }) => {
45
+ it(`should build a to_spend transaction for message "${message}"`, function () {
46
+ const result = (0, bip322_1.buildToSpendTransaction)(scriptPubKey, Buffer.from(message));
47
+ const computedTxid = result.getId();
48
+ assert_1.default.strictEqual(computedTxid, txid, `Transaction ID for message "${message}" does not match expected value`);
49
+ });
50
+ });
51
+ });
52
+ describe('buildToSpendTransactionFromChainAndIndex', function () {
53
+ describe('should build a to_spend transaction for a non-Taproot chain', function () {
54
+ function run(chain) {
55
+ it(`scriptType: ${utxo_lib_1.bitgo.scriptTypeForChain(chain)}, chain ${chain}`, function () {
56
+ const tx = (0, bip322_1.buildToSpendTransactionFromChainAndIndex)(utxo_lib_1.testutil.getDefaultWalletKeys(), 20, 0, Buffer.from('Hello World'));
57
+ const expectedScriptPubKey = utxo_lib_1.bitgo.outputScripts
58
+ .createOutputScript2of3(utxo_lib_1.testutil.getDefaultWalletKeys().deriveForChainAndIndex(20, 0).publicKeys, 'p2wsh')
59
+ .scriptPubKey.toString();
60
+ const scriptPubKeyFromTx = tx.outs[0].script.toString();
61
+ assert_1.default.deepStrictEqual(scriptPubKeyFromTx, expectedScriptPubKey, 'ScriptPubKey does not match expected value');
62
+ });
63
+ }
64
+ [0, 1, 10, 11, 20, 21].forEach((chain) => {
65
+ run(chain);
66
+ });
67
+ });
68
+ });
69
+ });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9TcGVuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvYmlwMzIyL3RvU3BlbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsbURBQXVEO0FBRXZELDZDQUkwQjtBQUUxQixpREFBK0Q7QUFFL0QsUUFBUSxDQUFDLFVBQVUsRUFBRTtJQUNuQixRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsMkJBQTJCO1FBQzNCLHlGQUF5RjtRQUN6RixNQUFNLFFBQVEsR0FBRztZQUNmO2dCQUNFLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxrRUFBa0U7YUFDekU7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsSUFBSSxFQUFFLGtFQUFrRTthQUN6RTtTQUNGLENBQUM7UUFDRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUNyQyxFQUFFLENBQUMsNEJBQTRCLE9BQU8sR0FBRyxFQUFFO2dCQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFrQixFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDeEQsZ0JBQU0sQ0FBQyxlQUFlLENBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQ3RCLElBQUksRUFDSixxQkFBcUIsT0FBTyxpQ0FBaUMsQ0FDOUQsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtRQUNyQyxNQUFNLFlBQVksR0FBRyw0Q0FBNkIsQ0FBQyxNQUFnQixDQUFDO1FBRXBFLDRGQUE0RjtRQUM1RixNQUFNLFFBQVEsR0FBRztZQUNmO2dCQUNFLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRSxrRUFBa0U7YUFDekU7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsSUFBSSxFQUFFLGtFQUFrRTthQUN6RTtTQUNGLENBQUM7UUFFRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUNyQyxFQUFFLENBQUMsb0RBQW9ELE9BQU8sR0FBRyxFQUFFO2dCQUNqRSxNQUFNLE1BQU0sR0FBRyxJQUFBLGdDQUF1QixFQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNFLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDcEMsZ0JBQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSwrQkFBK0IsT0FBTyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQ2xILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywwQ0FBMEMsRUFBRTtRQUNuRCxRQUFRLENBQUMsNkRBQTZELEVBQUU7WUFDdEUsU0FBUyxHQUFHLENBQUMsS0FBc0I7Z0JBQ2pDLEVBQUUsQ0FBQyxlQUFlLGdCQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUU7b0JBQ25FLE1BQU0sRUFBRSxHQUFHLElBQUEsaURBQXdDLEVBQ2pELG1CQUFRLENBQUMsb0JBQW9CLEVBQUUsRUFDL0IsRUFBRSxFQUNGLENBQUMsRUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUMzQixDQUFDO29CQUNGLE1BQU0sb0JBQW9CLEdBQUcsZ0JBQUssQ0FBQyxhQUFhO3lCQUM3QyxzQkFBc0IsQ0FBQyxtQkFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUM7eUJBQ3pHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDeEQsZ0JBQU0sQ0FBQyxlQUFlLENBQ3BCLGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsNENBQTRDLENBQzdDLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDOUQsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IHRlc3R1dGlsLCBiaXRnbyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHtcbiAgYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb24sXG4gIGhhc2hNZXNzYWdlV2l0aFRhZyxcbiAgYnVpbGRUb1NwZW5kVHJhbnNhY3Rpb25Gcm9tQ2hhaW5BbmRJbmRleCxcbn0gZnJvbSAnLi4vLi4vc3JjL2JpcDMyMic7XG5cbmltcG9ydCB7IEJJUDMyMl9QQVlNRU5UX1AyV1BLSF9GSVhUVVJFIH0gZnJvbSAnLi9iaXAzMjIudXRpbHMnO1xuXG5kZXNjcmliZSgndG9fc3BlbmQnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdNZXNzYWdlIGhhc2hpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGVzdCB2ZWN0b3JzIGZyb20gQklQMzIyXG4gICAgLy8gU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzIyLm1lZGlhd2lraSNtZXNzYWdlLWhhc2hpbmdcbiAgICBjb25zdCBmaXh0dXJlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbWVzc2FnZTogJycsXG4gICAgICAgIGhhc2g6ICdjOTBjMjY5YzRmOGZjYmU2ODgwZjcyYTcyMWRkZmJmMTkxNDI2OGE3OTRjYmIyMWNmYWZlZTEzNzcwYWUxOWYxJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICdIZWxsbyBXb3JsZCcsXG4gICAgICAgIGhhc2g6ICdmMGViMDNiMWE3NWFjNmQ5ODQ3ZjU1YzYyNGE5OTE2OWI1ZGNjYmEyYTMxZjViMjNiZWE3N2JhMjcwZGUwYTdhJyxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBmaXh0dXJlcy5mb3JFYWNoKCh7IG1lc3NhZ2UsIGhhc2ggfSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCBoYXNoIHRoZSBtZXNzYWdlIFwiJHttZXNzYWdlfVwiYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBoYXNoTWVzc2FnZVdpdGhUYWcoQnVmZmVyLmZyb20obWVzc2FnZSkpO1xuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICAgIHJlc3VsdC50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaGFzaCxcbiAgICAgICAgICBgSGFzaCBmb3IgbWVzc2FnZSBcIiR7bWVzc2FnZX1cIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZWBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQgdG9fc3BlbmQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc2NyaXB0UHViS2V5ID0gQklQMzIyX1BBWU1FTlRfUDJXUEtIX0ZJWFRVUkUub3V0cHV0IGFzIEJ1ZmZlcjtcblxuICAgIC8vIFNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDMyMi5tZWRpYXdpa2kjdHJhbnNhY3Rpb24taGFzaGVzXG4gICAgY29uc3QgZml4dHVyZXMgPSBbXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICB0eGlkOiAnYzU2ODBhYTY5YmI4ZDg2MGJmODJkNGU5Y2QzNTA0YjU1ZGRlMDE4ZGU3NjVhOTFiYjU2NjI4M2M1NDVhOTlhNycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZXNzYWdlOiAnSGVsbG8gV29ybGQnLFxuICAgICAgICB0eGlkOiAnYjc5ZDE5Njc0MGFkNTIxNzc3MWMxMDk4ZmM0YTRiNTFlMDUzNWMzMjIzNmM3MWYxZWE0ZDYxYTJkNjAzMzUyYicsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBmaXh0dXJlcy5mb3JFYWNoKCh7IG1lc3NhZ2UsIHR4aWQgfSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCBidWlsZCBhIHRvX3NwZW5kIHRyYW5zYWN0aW9uIGZvciBtZXNzYWdlIFwiJHttZXNzYWdlfVwiYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBidWlsZFRvU3BlbmRUcmFuc2FjdGlvbihzY3JpcHRQdWJLZXksIEJ1ZmZlci5mcm9tKG1lc3NhZ2UpKTtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRUeGlkID0gcmVzdWx0LmdldElkKCk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb21wdXRlZFR4aWQsIHR4aWQsIGBUcmFuc2FjdGlvbiBJRCBmb3IgbWVzc2FnZSBcIiR7bWVzc2FnZX1cIiBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZWApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdidWlsZFRvU3BlbmRUcmFuc2FjdGlvbkZyb21DaGFpbkFuZEluZGV4JywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCdzaG91bGQgYnVpbGQgYSB0b19zcGVuZCB0cmFuc2FjdGlvbiBmb3IgYSBub24tVGFwcm9vdCBjaGFpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZ1bmN0aW9uIHJ1bihjaGFpbjogYml0Z28uQ2hhaW5Db2RlKSB7XG4gICAgICAgIGl0KGBzY3JpcHRUeXBlOiAke2JpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbil9LCBjaGFpbiAke2NoYWlufWAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB0eCA9IGJ1aWxkVG9TcGVuZFRyYW5zYWN0aW9uRnJvbUNoYWluQW5kSW5kZXgoXG4gICAgICAgICAgICB0ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpLFxuICAgICAgICAgICAgMjAsXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgQnVmZmVyLmZyb20oJ0hlbGxvIFdvcmxkJylcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkU2NyaXB0UHViS2V5ID0gYml0Z28ub3V0cHV0U2NyaXB0c1xuICAgICAgICAgICAgLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjModGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKS5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KDIwLCAwKS5wdWJsaWNLZXlzLCAncDJ3c2gnKVxuICAgICAgICAgICAgLnNjcmlwdFB1YktleS50b1N0cmluZygpO1xuICAgICAgICAgIGNvbnN0IHNjcmlwdFB1YktleUZyb21UeCA9IHR4Lm91dHNbMF0uc2NyaXB0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgICAgIHNjcmlwdFB1YktleUZyb21UeCxcbiAgICAgICAgICAgIGV4cGVjdGVkU2NyaXB0UHViS2V5LFxuICAgICAgICAgICAgJ1NjcmlwdFB1YktleSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB2YWx1ZSdcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgKFswLCAxLCAxMCwgMTEsIDIwLCAyMV0gYXMgYml0Z28uQ2hhaW5Db2RlW10pLmZvckVhY2goKGNoYWluKSA9PiB7XG4gICAgICAgIHJ1bihjaGFpbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../test/bip322/utils.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
41
+ const bip322_1 = require("../../src/bip322");
42
+ const bip322_utils_1 = require("./bip322.utils");
43
+ describe('BIP322 Proof utils', function () {
44
+ it('should add a BIP322 proof message to a PSBT input', function () {
45
+ const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
46
+ const proprietaryKeyVals = utxolib.bitgo.getPsbtInputProprietaryKeyVals(psbt.data.inputs[0], {
47
+ identifier: utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER,
48
+ subtype: utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE,
49
+ });
50
+ assert_1.default.ok(proprietaryKeyVals.length === 1);
51
+ assert_1.default.ok(proprietaryKeyVals[0].value.equals(Buffer.from('Hello World')));
52
+ assert_1.default.ok(proprietaryKeyVals[0].key.keydata.length === 0); // keydata should be empty
53
+ assert_1.default.ok(proprietaryKeyVals[0].key.identifier === utxolib.bitgo.PSBT_PROPRIETARY_IDENTIFIER);
54
+ assert_1.default.ok(proprietaryKeyVals[0].key.subtype === utxolib.bitgo.ProprietaryKeySubtype.BIP322_MESSAGE);
55
+ });
56
+ it('should return the input index of a BIP322 proof message', function () {
57
+ const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
58
+ const messageBuffer = (0, bip322_1.getBip322ProofMessageAtIndex)(psbt, 0);
59
+ assert_1.default.ok(messageBuffer, 'Message buffer should not be undefined');
60
+ assert_1.default.deepStrictEqual(messageBuffer.toString('utf-8'), 'Hello World', 'Message does not match expected value');
61
+ });
62
+ describe('isBip322ProofCheck', function () {
63
+ it('should work for PSBTs', function () {
64
+ const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
65
+ assert_1.default.ok((0, bip322_1.isBip322ProofCheck)(psbt), 'Expected PSBT to be a valid BIP322 proof');
66
+ assert_1.default.deepEqual((0, bip322_1.isBip322ProofCheck)(utxolib.testutil.constructPsbt([{ scriptType: 'taprootKeyPathSpend', value: BigInt(1000) }], [{ scriptType: 'p2sh', value: BigInt(900) }], utxolib.networks.bitcoin, utxolib.testutil.getDefaultWalletKeys(), 'unsigned')), false);
67
+ });
68
+ it('should work for Transactions', function () {
69
+ const psbt = utxolib.bitgo.createPsbtFromBuffer(bip322_utils_1.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.toBuffer(), utxolib.networks.bitcoin);
70
+ // Cannot extract the transaction because it has no signatures
71
+ const tx = psbt.getUnsignedTx();
72
+ assert_1.default.ok((0, bip322_1.isBip322ProofCheck)(tx), 'Expected Transaction to be a valid BIP322 proof');
73
+ assert_1.default.deepEqual((0, bip322_1.isBip322ProofCheck)(utxolib.testutil
74
+ .constructPsbt([{ scriptType: 'taprootKeyPathSpend', value: BigInt(1000) }], [{ scriptType: 'p2sh', value: BigInt(900) }], utxolib.networks.bitcoin, utxolib.testutil.getDefaultWalletKeys(), 'unsigned')
75
+ .getUnsignedTx()), false);
76
+ });
77
+ });
78
+ });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2JpcDMyMi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFFaEQsNkNBQW9GO0FBRXBGLGlEQUF3RTtBQUV4RSxRQUFRLENBQUMsb0JBQW9CLEVBQUU7SUFDN0IsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1FBQ3RELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQzdDLHFEQUFzQyxDQUFDLFFBQVEsRUFBRSxFQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDekIsQ0FBQztRQUVGLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzRixVQUFVLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkI7WUFDckQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYztTQUM1RCxDQUFDLENBQUM7UUFFSCxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0MsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxnQkFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtRQUNyRixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUM5RixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEcsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMseURBQXlELEVBQUU7UUFDNUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FDN0MscURBQXNDLENBQUMsUUFBUSxFQUFFLEVBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUN6QixDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsSUFBQSxxQ0FBNEIsRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDbkUsZ0JBQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxhQUFhLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztJQUNsSCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtRQUM3QixFQUFFLENBQUMsdUJBQXVCLEVBQUU7WUFDMUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FDN0MscURBQXNDLENBQUMsUUFBUSxFQUFFLEVBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUN6QixDQUFDO1lBQ0YsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSwyQkFBa0IsRUFBQyxJQUFJLENBQUMsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO1lBQ2hGLGdCQUFNLENBQUMsU0FBUyxDQUNkLElBQUEsMkJBQWtCLEVBQ2hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUM1QixDQUFDLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUM1RCxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsRUFDdkMsVUFBVSxDQUNYLENBQ0YsRUFDRCxLQUFLLENBQ04sQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQzdDLHFEQUFzQyxDQUFDLFFBQVEsRUFBRSxFQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDekIsQ0FBQztZQUNGLDhEQUE4RDtZQUM5RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDaEMsZ0JBQU0sQ0FBQyxFQUFFLENBQUMsSUFBQSwyQkFBa0IsRUFBQyxFQUFFLENBQUMsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1lBQ3JGLGdCQUFNLENBQUMsU0FBUyxDQUNkLElBQUEsMkJBQWtCLEVBQ2hCLE9BQU8sQ0FBQyxRQUFRO2lCQUNiLGFBQWEsQ0FDWixDQUFDLEVBQUUsVUFBVSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUM1RCxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFDNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsRUFDdkMsVUFBVSxDQUNYO2lCQUNBLGFBQWEsRUFBRSxDQUNuQixFQUNELEtBQUssQ0FDTixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHsgZ2V0QmlwMzIyUHJvb2ZNZXNzYWdlQXRJbmRleCwgaXNCaXAzMjJQcm9vZkNoZWNrIH0gZnJvbSAnLi4vLi4vc3JjL2JpcDMyMic7XG5cbmltcG9ydCB7IEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JUIH0gZnJvbSAnLi9iaXAzMjIudXRpbHMnO1xuXG5kZXNjcmliZSgnQklQMzIyIFByb29mIHV0aWxzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc2hvdWxkIGFkZCBhIEJJUDMyMiBwcm9vZiBtZXNzYWdlIHRvIGEgUFNCVCBpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihcbiAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5cbiAgICApO1xuXG4gICAgY29uc3QgcHJvcHJpZXRhcnlLZXlWYWxzID0gdXR4b2xpYi5iaXRnby5nZXRQc2J0SW5wdXRQcm9wcmlldGFyeUtleVZhbHMocHNidC5kYXRhLmlucHV0c1swXSwge1xuICAgICAgaWRlbnRpZmllcjogdXR4b2xpYi5iaXRnby5QU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgICBzdWJ0eXBlOiB1dHhvbGliLmJpdGdvLlByb3ByaWV0YXJ5S2V5U3VidHlwZS5CSVAzMjJfTUVTU0FHRSxcbiAgICB9KTtcblxuICAgIGFzc2VydC5vayhwcm9wcmlldGFyeUtleVZhbHMubGVuZ3RoID09PSAxKTtcbiAgICBhc3NlcnQub2socHJvcHJpZXRhcnlLZXlWYWxzWzBdLnZhbHVlLmVxdWFscyhCdWZmZXIuZnJvbSgnSGVsbG8gV29ybGQnKSkpO1xuICAgIGFzc2VydC5vayhwcm9wcmlldGFyeUtleVZhbHNbMF0ua2V5LmtleWRhdGEubGVuZ3RoID09PSAwKTsgLy8ga2V5ZGF0YSBzaG91bGQgYmUgZW1wdHlcbiAgICBhc3NlcnQub2socHJvcHJpZXRhcnlLZXlWYWxzWzBdLmtleS5pZGVudGlmaWVyID09PSB1dHhvbGliLmJpdGdvLlBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUik7XG4gICAgYXNzZXJ0Lm9rKHByb3ByaWV0YXJ5S2V5VmFsc1swXS5rZXkuc3VidHlwZSA9PT0gdXR4b2xpYi5iaXRnby5Qcm9wcmlldGFyeUtleVN1YnR5cGUuQklQMzIyX01FU1NBR0UpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0aGUgaW5wdXQgaW5kZXggb2YgYSBCSVAzMjIgcHJvb2YgbWVzc2FnZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihcbiAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5cbiAgICApO1xuXG4gICAgY29uc3QgbWVzc2FnZUJ1ZmZlciA9IGdldEJpcDMyMlByb29mTWVzc2FnZUF0SW5kZXgocHNidCwgMCk7XG4gICAgYXNzZXJ0Lm9rKG1lc3NhZ2VCdWZmZXIsICdNZXNzYWdlIGJ1ZmZlciBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCcpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobWVzc2FnZUJ1ZmZlci50b1N0cmluZygndXRmLTgnKSwgJ0hlbGxvIFdvcmxkJywgJ01lc3NhZ2UgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWUnKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzQmlwMzIyUHJvb2ZDaGVjaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHdvcmsgZm9yIFBTQlRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoXG4gICAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pblxuICAgICAgKTtcbiAgICAgIGFzc2VydC5vayhpc0JpcDMyMlByb29mQ2hlY2socHNidCksICdFeHBlY3RlZCBQU0JUIHRvIGJlIGEgdmFsaWQgQklQMzIyIHByb29mJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICBpc0JpcDMyMlByb29mQ2hlY2soXG4gICAgICAgICAgdXR4b2xpYi50ZXN0dXRpbC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICAgICAgW3sgc2NyaXB0VHlwZTogJ3RhcHJvb3RLZXlQYXRoU3BlbmQnLCB2YWx1ZTogQmlnSW50KDEwMDApIH1dLFxuICAgICAgICAgICAgW3sgc2NyaXB0VHlwZTogJ3Ayc2gnLCB2YWx1ZTogQmlnSW50KDkwMCkgfV0sXG4gICAgICAgICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gICAgICAgICAgICB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCksXG4gICAgICAgICAgICAndW5zaWduZWQnXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgd29yayBmb3IgVHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoXG4gICAgICAgIEJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULnRvQnVmZmVyKCksXG4gICAgICAgIHV0eG9saWIubmV0d29ya3MuYml0Y29pblxuICAgICAgKTtcbiAgICAgIC8vIENhbm5vdCBleHRyYWN0IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0IGhhcyBubyBzaWduYXR1cmVzXG4gICAgICBjb25zdCB0eCA9IHBzYnQuZ2V0VW5zaWduZWRUeCgpO1xuICAgICAgYXNzZXJ0Lm9rKGlzQmlwMzIyUHJvb2ZDaGVjayh0eCksICdFeHBlY3RlZCBUcmFuc2FjdGlvbiB0byBiZSBhIHZhbGlkIEJJUDMyMiBwcm9vZicpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgaXNCaXAzMjJQcm9vZkNoZWNrKFxuICAgICAgICAgIHV0eG9saWIudGVzdHV0aWxcbiAgICAgICAgICAgIC5jb25zdHJ1Y3RQc2J0KFxuICAgICAgICAgICAgICBbeyBzY3JpcHRUeXBlOiAndGFwcm9vdEtleVBhdGhTcGVuZCcsIHZhbHVlOiBCaWdJbnQoMTAwMCkgfV0sXG4gICAgICAgICAgICAgIFt7IHNjcmlwdFR5cGU6ICdwMnNoJywgdmFsdWU6IEJpZ0ludCg5MDApIH1dLFxuICAgICAgICAgICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gICAgICAgICAgICAgIHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKSxcbiAgICAgICAgICAgICAgJ3Vuc2lnbmVkJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmdldFVuc2lnbmVkVHgoKVxuICAgICAgICApLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../../test/bip322/verify.ts"],"names":[],"mappings":""}
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const assert = __importStar(require("assert"));
37
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
38
+ const bip322 = __importStar(require("../../src/bip322"));
39
+ const testutils = __importStar(require("./bip322.utils"));
40
+ const opReturnOutput = { value: 0n, script: Buffer.from('6a', 'hex') };
41
+ describe('Verify BIP322 proofs', function () {
42
+ describe('assertBaseTx', function () {
43
+ it('should pass for a valid bip322 transaction', function () {
44
+ assert.doesNotThrow(() => bip322.assertBaseTx(testutils.BIP322_FIXTURE_HELLO_WORLD_TOSIGN_PSBT.getUnsignedTx()));
45
+ });
46
+ it('should reject if the outputs are not conformed correctly', function () {
47
+ let psbt = utxolib.bitgo.createPsbtForNetwork({
48
+ network: utxolib.networks.bitcoin,
49
+ });
50
+ psbt.addOutput(opReturnOutput);
51
+ psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
52
+ psbt.setVersion(0);
53
+ psbt.setLocktime(0);
54
+ assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction must have exactly 1 output./);
55
+ psbt = utxolib.bitgo.createPsbtForNetwork({
56
+ network: utxolib.networks.bitcoin,
57
+ });
58
+ psbt.setVersion(0);
59
+ psbt.setLocktime(0);
60
+ psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
61
+ assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction output value must be 0./);
62
+ psbt = utxolib.bitgo.createPsbtForNetwork({
63
+ network: utxolib.networks.bitcoin,
64
+ });
65
+ psbt.setVersion(0);
66
+ psbt.setLocktime(0);
67
+ psbt.addOutput({
68
+ value: 0n,
69
+ script: utxolib.bitgo.outputScripts.createOutputScript2of3(utxolib.testutil.getDefaultWalletKeys().deriveForChainAndIndex(0, 0).publicKeys, 'p2wsh', utxolib.networks.bitcoin).scriptPubKey,
70
+ });
71
+ assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction output script must be OP_RETURN./);
72
+ });
73
+ it('should reject if version is not 0', function () {
74
+ const psbt = utxolib.bitgo.createPsbtForNetwork({
75
+ network: utxolib.networks.bitcoin,
76
+ });
77
+ psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
78
+ psbt.setVersion(1);
79
+ assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction version must be 0./);
80
+ });
81
+ it('should reject if locktime is not 0', function () {
82
+ const psbt = utxolib.bitgo.createPsbtForNetwork({
83
+ network: utxolib.networks.bitcoin,
84
+ });
85
+ psbt.setVersion(0);
86
+ psbt.addOutput({ value: 1n, script: Buffer.from('6a', 'hex') });
87
+ psbt.setLocktime(1);
88
+ assert.throws(() => bip322.assertBaseTx(psbt.getUnsignedTx()), /Transaction locktime must be 0./);
89
+ });
90
+ });
91
+ describe('assertTxInput', function () {
92
+ it('should fail if input index is out of range', function () {
93
+ const tx = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin }).getUnsignedTx();
94
+ assert.throws(() => bip322.assertTxInput(tx, 1, [], { address: '', message: '', pubkeys: [], scriptType: 'p2wsh' }, false), /inputIndex 1 is out of range for tx with 0 inputs./);
95
+ });
96
+ it('should fail if txInput index is not 0', function () {
97
+ const psbt = utxolib.bitgo.createPsbtForNetwork({
98
+ network: utxolib.networks.bitcoin,
99
+ });
100
+ psbt.setVersion(0);
101
+ psbt.setLocktime(0);
102
+ psbt.addOutput(opReturnOutput);
103
+ psbt.addInput({
104
+ index: 1,
105
+ hash: Buffer.alloc(32),
106
+ });
107
+ assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], { address: '', message: '', pubkeys: [], scriptType: 'p2wsh' }, false), /transaction input 0 must have index=0./);
108
+ });
109
+ it('should fail if txInput sequence is not 0', function () {
110
+ const psbt = utxolib.bitgo.createPsbtForNetwork({
111
+ network: utxolib.networks.bitcoin,
112
+ });
113
+ psbt.setVersion(0);
114
+ psbt.setLocktime(0);
115
+ psbt.addOutput(opReturnOutput);
116
+ psbt.addInput({
117
+ index: 0,
118
+ hash: Buffer.alloc(32),
119
+ sequence: 1,
120
+ });
121
+ assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], { address: '', message: '', pubkeys: [], scriptType: 'p2wsh' }, false), /transaction input 0 sequence must be 0./);
122
+ });
123
+ it('should fail if the scriptPubKey created by the public keys does not match the address provided in the messageInfo', function () {
124
+ const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
125
+ const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
126
+ const message = 'to be or not to be';
127
+ bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, {
128
+ chain: 20,
129
+ index: 0,
130
+ });
131
+ assert.ok(psbt.data.inputs[0]?.witnessUtxo?.script);
132
+ const address = utxolib.address.fromOutputScript(psbt.data.inputs[0].witnessUtxo.script, utxolib.networks.bitcoin);
133
+ const wrongPublicKeys = rootWalletKeys.deriveForChainAndIndex(20, 1).publicKeys.map((p) => p.toString('hex'));
134
+ assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], { address, message, pubkeys: wrongPublicKeys, scriptType: 'p2wsh' }, false), /Address does not match derived scriptPubKey for input 0./);
135
+ });
136
+ it('should fail if the txid of the input does not match the derived to_spend transaction', function () {
137
+ const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
138
+ const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
139
+ const message = 'to be or not to be';
140
+ const output = utxolib.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys, 'p2wsh', psbt.network);
141
+ bip322.addBip322Input(psbt, message, output);
142
+ assert.ok(psbt.data.inputs[0]?.witnessUtxo?.script);
143
+ const address = utxolib.address.fromOutputScript(output.scriptPubKey, utxolib.networks.bitcoin);
144
+ const pubkeys = rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys.map((p) => p.toString('hex'));
145
+ assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], {
146
+ address,
147
+ message: 'that is the question',
148
+ pubkeys,
149
+ scriptType: 'p2wsh',
150
+ }, false));
151
+ });
152
+ describe('checkSignature=true', function () {
153
+ it('should fail if the scriptType is not a 2of3 script', function () {
154
+ const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
155
+ const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
156
+ const message = 'to be or not to be';
157
+ const derivedWalletKeys = rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys;
158
+ const output = utxolib.payments.p2pkh({
159
+ pubkey: rootWalletKeys.publicKeys[0],
160
+ network: psbt.network,
161
+ }).output;
162
+ assert.ok(output);
163
+ bip322.addBip322Input(psbt, message, {
164
+ scriptPubKey: Buffer.from(output),
165
+ });
166
+ psbt.signAllInputs(rootWalletKeys.user);
167
+ assert.throws(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], {
168
+ // Make the messageInfo self consistent, but not match the non-2of3 address in the PSBT
169
+ address: utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedWalletKeys, 'p2wsh', psbt.network)
170
+ .scriptPubKey, psbt.network),
171
+ message,
172
+ pubkeys: derivedWalletKeys.map((k) => k.toString('hex')),
173
+ scriptType: 'p2wsh',
174
+ }, false));
175
+ });
176
+ utxolib.bitgo.outputScripts.scriptTypes2Of3.forEach((scriptType) => {
177
+ describe(scriptType + ' address', function () {
178
+ it('should pass with a full signed tx', function () {
179
+ const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
180
+ const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
181
+ const message = 'to be or not to be';
182
+ const chainCode = utxolib.bitgo.getExternalChainCode(scriptType);
183
+ const derivedWalletKeys = rootWalletKeys.deriveForChainAndIndex(chainCode, 0).publicKeys;
184
+ const address = utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedWalletKeys, scriptType, psbt.network)
185
+ .scriptPubKey, psbt.network);
186
+ bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, { chain: chainCode, index: 0 });
187
+ if (scriptType === 'p2trMusig2') {
188
+ psbt.setAllInputsMusig2NonceHD(rootWalletKeys.user);
189
+ psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo);
190
+ }
191
+ psbt.signAllInputsHD(rootWalletKeys.user);
192
+ psbt.signAllInputsHD(rootWalletKeys.bitgo);
193
+ psbt.validateSignaturesOfAllInputs();
194
+ psbt.finalizeAllInputs();
195
+ const tx = psbt.extractTransaction();
196
+ assert.doesNotThrow(() => bip322.assertTxInput(tx, 0, [
197
+ {
198
+ value: 0n,
199
+ script: utxolib.address.toOutputScript(address, psbt.network),
200
+ },
201
+ ], {
202
+ // Make the messageInfo self consistent, but not match the non-2of3 address in the PSBT
203
+ address,
204
+ message,
205
+ pubkeys: derivedWalletKeys.map((k) => k.toString('hex')),
206
+ scriptType,
207
+ }, true));
208
+ });
209
+ });
210
+ });
211
+ });
212
+ describe('checkSignature=false', function () {
213
+ it('should not throw if the input is not signed', function () {
214
+ const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
215
+ const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
216
+ const message = 'to be or not to be';
217
+ const output = utxolib.bitgo.outputScripts.createOutputScript2of3(rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys, 'p2wsh', psbt.network);
218
+ bip322.addBip322Input(psbt, message, output);
219
+ const address = utxolib.address.fromOutputScript(output.scriptPubKey, utxolib.networks.bitcoin);
220
+ assert.doesNotThrow(() => bip322.assertTxInput(psbt.getUnsignedTx(), 0, [], {
221
+ address,
222
+ message,
223
+ pubkeys: rootWalletKeys.deriveForChainAndIndex(20, 0).publicKeys.map((p) => p.toString('hex')),
224
+ scriptType: 'p2wsh',
225
+ }, false));
226
+ });
227
+ });
228
+ });
229
+ describe('assertBip322TxProof', function () {
230
+ const messageInfo = [];
231
+ let tx;
232
+ before(function () {
233
+ const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
234
+ const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
235
+ utxolib.bitgo.outputScripts.scriptTypes2Of3.forEach((scriptType, index) => {
236
+ const chain = utxolib.bitgo.getExternalChainCode(scriptType);
237
+ const message = `message for ${scriptType}`;
238
+ const derivedKeys = rootWalletKeys.deriveForChainAndIndex(chain, index).publicKeys;
239
+ messageInfo.push({
240
+ address: utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedKeys, scriptType, psbt.network).scriptPubKey, psbt.network),
241
+ message,
242
+ pubkeys: derivedKeys.map((p) => p.toString('hex')),
243
+ scriptType,
244
+ });
245
+ bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, { chain, index });
246
+ });
247
+ psbt.setAllInputsMusig2NonceHD(rootWalletKeys.user);
248
+ psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo);
249
+ psbt.signAllInputsHD(rootWalletKeys.user);
250
+ psbt.signAllInputsHD(rootWalletKeys.bitgo);
251
+ assert.ok(psbt.validateSignaturesOfAllInputs(), `All signatures on the inputs should be valid`);
252
+ psbt.finalizeAllInputs();
253
+ tx = psbt.extractTransaction();
254
+ });
255
+ it('should pass if the messageInfo matches the transaction', function () {
256
+ assert.doesNotThrow(() => bip322.assertBip322TxProof(tx, messageInfo));
257
+ });
258
+ it('should fail if the messageInfo does not match the transaction', function () {
259
+ assert.throws(() => bip322.assertBip322TxProof(tx, messageInfo.map((m) => ({ ...m, message: m.message + ' altered' }))));
260
+ });
261
+ });
262
+ describe('assertBip322PsbtProof', function () {
263
+ const messageInfo = [];
264
+ const rootWalletKeys = utxolib.testutil.getDefaultWalletKeys();
265
+ const psbt = bip322.createBaseToSignPsbt(rootWalletKeys);
266
+ before(function () {
267
+ utxolib.bitgo.outputScripts.scriptTypes2Of3.forEach((scriptType, index) => {
268
+ const chain = utxolib.bitgo.getExternalChainCode(scriptType);
269
+ const message = `message for ${scriptType}`;
270
+ const derivedKeys = rootWalletKeys.deriveForChainAndIndex(chain, index).publicKeys;
271
+ messageInfo.push({
272
+ address: utxolib.address.fromOutputScript(utxolib.bitgo.outputScripts.createOutputScript2of3(derivedKeys, scriptType, psbt.network).scriptPubKey, psbt.network),
273
+ message,
274
+ pubkeys: derivedKeys.map((p) => p.toString('hex')),
275
+ scriptType,
276
+ });
277
+ bip322.addBip322InputWithChainAndIndex(psbt, message, rootWalletKeys, { chain, index });
278
+ });
279
+ psbt.setAllInputsMusig2NonceHD(rootWalletKeys.user);
280
+ psbt.setAllInputsMusig2NonceHD(rootWalletKeys.bitgo);
281
+ psbt.signAllInputsHD(rootWalletKeys.user);
282
+ psbt.signAllInputsHD(rootWalletKeys.bitgo);
283
+ assert.ok(psbt.validateSignaturesOfAllInputs(), `All signatures on the inputs should be valid`);
284
+ });
285
+ it('should work when the message info matches what is in the PSBT', function () {
286
+ assert.doesNotThrow(() => bip322.assertBip322PsbtProof(psbt, messageInfo));
287
+ });
288
+ it('should fail when the message info does not match what is in the PSBT', function () {
289
+ assert.throws(() => bip322.assertBip322PsbtProof(psbt, messageInfo.map((m) => ({ ...m, message: m.message + ' altered' }))));
290
+ });
291
+ });
292
+ });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9iaXAzMjIvdmVyaWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQWlDO0FBRWpDLDhEQUFnRDtBQUVoRCx5REFBMkM7QUFFM0MsMERBQTRDO0FBRTVDLE1BQU0sY0FBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUV2RSxRQUFRLENBQUMsc0JBQXNCLEVBQUU7SUFDL0IsUUFBUSxDQUFDLGNBQWMsRUFBRTtRQUN2QixFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbkgsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMERBQTBELEVBQUU7WUFDN0QsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDNUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUNsQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1lBRTFHLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDO2dCQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQ2xDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1lBRXRHLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDO2dCQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQ2xDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLEtBQUssRUFBRSxFQUFFO2dCQUNULE1BQU0sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FDeEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQy9FLE9BQU8sRUFDUCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDekIsQ0FBQyxZQUFZO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLDhDQUE4QyxDQUFDLENBQUM7UUFDakgsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUNBQW1DLEVBQUU7WUFDdEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDOUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUNsQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDbkcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDOUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUNsQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGVBQWUsRUFBRTtRQUN4QixFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckcsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUM1RyxvREFBb0QsQ0FDckQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7Z0JBQzlDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU87YUFDbEMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDWixLQUFLLEVBQUUsQ0FBQztnQkFDUixJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7YUFDdkIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FDSCxNQUFNLENBQUMsYUFBYSxDQUNsQixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3BCLENBQUMsRUFDRCxFQUFFLEVBQ0YsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQzlELEtBQUssQ0FDTixFQUNILHdDQUF3QyxDQUN6QyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQztnQkFDOUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTzthQUNsQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNaLEtBQUssRUFBRSxDQUFDO2dCQUNSLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsUUFBUSxFQUFFLENBQUM7YUFDWixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxDQUNYLEdBQUcsRUFBRSxDQUNILE1BQU0sQ0FBQyxhQUFhLENBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFDcEIsQ0FBQyxFQUNELEVBQUUsRUFDRixFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFDOUQsS0FBSyxDQUNOLEVBQ0gseUNBQXlDLENBQzFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtSEFBbUgsRUFBRTtZQUN0SCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDO1lBQ3JDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRTtnQkFDcEUsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFLENBQUM7YUFDVCxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUN0QyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDekIsQ0FBQztZQUNGLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlHLE1BQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFLENBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUNwQixDQUFDLEVBQ0QsRUFBRSxFQUNGLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFDbkUsS0FBSyxDQUNOLEVBQ0gsMERBQTBELENBQzNELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzRkFBc0YsRUFBRTtZQUN6RixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDO1lBRXJDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUMvRCxjQUFjLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFDdkQsT0FBTyxFQUNQLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQztZQUNGLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0RyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUNqQixNQUFNLENBQUMsYUFBYSxDQUNsQixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQ3BCLENBQUMsRUFDRCxFQUFFLEVBQ0Y7Z0JBQ0UsT0FBTztnQkFDUCxPQUFPLEVBQUUsc0JBQXNCO2dCQUMvQixPQUFPO2dCQUNQLFVBQVUsRUFBRSxPQUFPO2FBQ3BCLEVBQ0QsS0FBSyxDQUNOLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLHFCQUFxQixFQUFFO1lBQzlCLEVBQUUsQ0FBQyxvREFBb0QsRUFBRTtnQkFDdkQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDO2dCQUNyQyxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUVsRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDcEMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUNwQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQ3RCLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQ1YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO29CQUNuQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQ2xDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FDakIsTUFBTSxDQUFDLGFBQWEsQ0FDbEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUNwQixDQUFDLEVBQ0QsRUFBRSxFQUNGO29CQUNFLHVGQUF1RjtvQkFDdkYsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDO3lCQUN6RixZQUFZLEVBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FDYjtvQkFDRCxPQUFPO29CQUNQLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hELFVBQVUsRUFBRSxPQUFPO2lCQUNwQixFQUNELEtBQUssQ0FDTixDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtnQkFDakUsUUFBUSxDQUFDLFVBQVUsR0FBRyxVQUFVLEVBQUU7b0JBQ2hDLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTt3QkFDdEMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3dCQUMvRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUM7d0JBQ3pELE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDO3dCQUNyQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUNqRSxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO3dCQUN6RixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQzs2QkFDNUYsWUFBWSxFQUNmLElBQUksQ0FBQyxPQUFPLENBQ2IsQ0FBQzt3QkFFRixNQUFNLENBQUMsK0JBQStCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN0RyxJQUFJLFVBQVUsS0FBSyxZQUFZLEVBQUUsQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDcEQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdkQsQ0FBQzt3QkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBRTNDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO3dCQUNyQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDekIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7d0JBRXJDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQ3ZCLE1BQU0sQ0FBQyxhQUFhLENBQ2xCLEVBQUUsRUFDRixDQUFDLEVBQ0Q7NEJBQ0U7Z0NBQ0UsS0FBSyxFQUFFLEVBQUU7Z0NBQ1QsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDOzZCQUM5RDt5QkFDRixFQUNEOzRCQUNFLHVGQUF1Rjs0QkFDdkYsT0FBTzs0QkFDUCxPQUFPOzRCQUNQLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3hELFVBQVU7eUJBQ1gsRUFDRCxJQUFJLENBQ0wsQ0FDRixDQUFDO29CQUNKLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixFQUFFLENBQUMsNkNBQTZDLEVBQUU7Z0JBQ2hELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQztnQkFFckMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQy9ELGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUN2RCxPQUFPLEVBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FDYixDQUFDO2dCQUNGLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2hHLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQ3ZCLE1BQU0sQ0FBQyxhQUFhLENBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFDcEIsQ0FBQyxFQUNELEVBQUUsRUFDRjtvQkFDRSxPQUFPO29CQUNQLE9BQU87b0JBQ1AsT0FBTyxFQUFFLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUYsVUFBVSxFQUFFLE9BQU87aUJBQ3BCLEVBQ0QsS0FBSyxDQUNOLENBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtRQUM5QixNQUFNLFdBQVcsR0FBeUIsRUFBRSxDQUFDO1FBQzdDLElBQUksRUFBeUMsQ0FBQztRQUM5QyxNQUFNLENBQUM7WUFDTCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sT0FBTyxHQUFHLGVBQWUsVUFBVSxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUNuRixXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNmLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUN2QyxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQ3RHLElBQUksQ0FBQyxPQUFPLENBQ2I7b0JBQ0QsT0FBTztvQkFDUCxPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbEQsVUFBVTtpQkFDWCxDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLCtCQUErQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDMUYsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMseUJBQXlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1lBQ2hHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyx3REFBd0QsRUFBRTtZQUMzRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRTtZQUNsRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUNqQixNQUFNLENBQUMsbUJBQW1CLENBQ3hCLEVBQUUsRUFDRixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUNwRSxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHVCQUF1QixFQUFFO1FBQ2hDLE1BQU0sV0FBVyxHQUF5QixFQUFFLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUM7WUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN4RSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLE9BQU8sR0FBRyxlQUFlLFVBQVUsRUFBRSxDQUFDO2dCQUM1QyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFDbkYsV0FBVyxDQUFDLElBQUksQ0FBQztvQkFDZixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FDdkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUN0RyxJQUFJLENBQUMsT0FBTyxDQUNiO29CQUNELE9BQU87b0JBQ1AsT0FBTyxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xELFVBQVU7aUJBQ1gsQ0FBQyxDQUFDO2dCQUVILE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMseUJBQXlCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEVBQUUsOENBQThDLENBQUMsQ0FBQztRQUNsRyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRTtZQUNsRSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzRUFBc0UsRUFBRTtZQUN6RSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUNqQixNQUFNLENBQUMscUJBQXFCLENBQzFCLElBQUksRUFDSixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUNwRSxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmltcG9ydCAqIGFzIGJpcDMyMiBmcm9tICcuLi8uLi9zcmMvYmlwMzIyJztcblxuaW1wb3J0ICogYXMgdGVzdHV0aWxzIGZyb20gJy4vYmlwMzIyLnV0aWxzJztcblxuY29uc3Qgb3BSZXR1cm5PdXRwdXQgPSB7IHZhbHVlOiAwbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfTtcblxuZGVzY3JpYmUoJ1ZlcmlmeSBCSVAzMjIgcHJvb2ZzJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnYXNzZXJ0QmFzZVR4JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcGFzcyBmb3IgYSB2YWxpZCBiaXAzMjIgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGJpcDMyMi5hc3NlcnRCYXNlVHgodGVzdHV0aWxzLkJJUDMyMl9GSVhUVVJFX0hFTExPX1dPUkxEX1RPU0lHTl9QU0JULmdldFVuc2lnbmVkVHgoKSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaWYgdGhlIG91dHB1dHMgYXJlIG5vdCBjb25mb3JtZWQgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LmFkZE91dHB1dChvcFJldHVybk91dHB1dCk7XG4gICAgICBwc2J0LmFkZE91dHB1dCh7IHZhbHVlOiAxbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMCk7XG4gICAgICBwc2J0LnNldExvY2t0aW1lKDApO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBiaXAzMjIuYXNzZXJ0QmFzZVR4KHBzYnQuZ2V0VW5zaWduZWRUeCgpKSwgL1RyYW5zYWN0aW9uIG11c3QgaGF2ZSBleGFjdGx5IDEgb3V0cHV0Li8pO1xuXG4gICAgICBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7XG4gICAgICAgIG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgIH0pO1xuICAgICAgcHNidC5zZXRWZXJzaW9uKDApO1xuICAgICAgcHNidC5zZXRMb2NrdGltZSgwKTtcbiAgICAgIHBzYnQuYWRkT3V0cHV0KHsgdmFsdWU6IDFuLCBzY3JpcHQ6IEJ1ZmZlci5mcm9tKCc2YScsICdoZXgnKSB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYmlwMzIyLmFzc2VydEJhc2VUeChwc2J0LmdldFVuc2lnbmVkVHgoKSksIC9UcmFuc2FjdGlvbiBvdXRwdXQgdmFsdWUgbXVzdCBiZSAwLi8pO1xuXG4gICAgICBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7XG4gICAgICAgIG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgIH0pO1xuICAgICAgcHNidC5zZXRWZXJzaW9uKDApO1xuICAgICAgcHNidC5zZXRMb2NrdGltZSgwKTtcbiAgICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgICAgdmFsdWU6IDBuLFxuICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgICAgICAgIHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKS5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KDAsIDApLnB1YmxpY0tleXMsXG4gICAgICAgICAgJ3Ayd3NoJyxcbiAgICAgICAgICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5cbiAgICAgICAgKS5zY3JpcHRQdWJLZXksXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gYmlwMzIyLmFzc2VydEJhc2VUeChwc2J0LmdldFVuc2lnbmVkVHgoKSksIC9UcmFuc2FjdGlvbiBvdXRwdXQgc2NyaXB0IG11c3QgYmUgT1BfUkVUVVJOLi8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaWYgdmVyc2lvbiBpcyBub3QgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LmFkZE91dHB1dCh7IHZhbHVlOiAxbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGJpcDMyMi5hc3NlcnRCYXNlVHgocHNidC5nZXRVbnNpZ25lZFR4KCkpLCAvVHJhbnNhY3Rpb24gdmVyc2lvbiBtdXN0IGJlIDAuLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBpZiBsb2NrdGltZSBpcyBub3QgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMCk7XG4gICAgICBwc2J0LmFkZE91dHB1dCh7IHZhbHVlOiAxbiwgc2NyaXB0OiBCdWZmZXIuZnJvbSgnNmEnLCAnaGV4JykgfSk7XG4gICAgICBwc2J0LnNldExvY2t0aW1lKDEpO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBiaXAzMjIuYXNzZXJ0QmFzZVR4KHBzYnQuZ2V0VW5zaWduZWRUeCgpKSwgL1RyYW5zYWN0aW9uIGxvY2t0aW1lIG11c3QgYmUgMC4vKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VydFR4SW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIGlucHV0IGluZGV4IGlzIG91dCBvZiByYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiB9KS5nZXRVbnNpZ25lZFR4KCk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiBiaXAzMjIuYXNzZXJ0VHhJbnB1dCh0eCwgMSwgW10sIHsgYWRkcmVzczogJycsIG1lc3NhZ2U6ICcnLCBwdWJrZXlzOiBbXSwgc2NyaXB0VHlwZTogJ3Ayd3NoJyB9LCBmYWxzZSksXG4gICAgICAgIC9pbnB1dEluZGV4IDEgaXMgb3V0IG9mIHJhbmdlIGZvciB0eCB3aXRoIDAgaW5wdXRzLi9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdHhJbnB1dCBpbmRleCBpcyBub3QgMCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHtcbiAgICAgICAgbmV0d29yazogdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luLFxuICAgICAgfSk7XG4gICAgICBwc2J0LnNldFZlcnNpb24oMCk7XG4gICAgICBwc2J0LnNldExvY2t0aW1lKDApO1xuICAgICAgcHNidC5hZGRPdXRwdXQob3BSZXR1cm5PdXRwdXQpO1xuICAgICAgcHNidC5hZGRJbnB1dCh7XG4gICAgICAgIGluZGV4OiAxLFxuICAgICAgICBoYXNoOiBCdWZmZXIuYWxsb2MoMzIpLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJpcDMyMi5hc3NlcnRUeElucHV0KFxuICAgICAgICAgICAgcHNidC5nZXRVbnNpZ25lZFR4KCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB7IGFkZHJlc3M6ICcnLCBtZXNzYWdlOiAnJywgcHVia2V5czogW10sIHNjcmlwdFR5cGU6ICdwMndzaCcgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKSxcbiAgICAgICAgL3RyYW5zYWN0aW9uIGlucHV0IDAgbXVzdCBoYXZlIGluZGV4PTAuL1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCBpZiB0eElucHV0IHNlcXVlbmNlIGlzIG5vdCAwJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoe1xuICAgICAgICBuZXR3b3JrOiB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4sXG4gICAgICB9KTtcbiAgICAgIHBzYnQuc2V0VmVyc2lvbigwKTtcbiAgICAgIHBzYnQuc2V0TG9ja3RpbWUoMCk7XG4gICAgICBwc2J0LmFkZE91dHB1dChvcFJldHVybk91dHB1dCk7XG4gICAgICBwc2J0LmFkZElucHV0KHtcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIGhhc2g6IEJ1ZmZlci5hbGxvYygzMiksXG4gICAgICAgIHNlcXVlbmNlOiAxLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgIGJpcDMyMi5hc3NlcnRUeElucHV0KFxuICAgICAgICAgICAgcHNidC5nZXRVbnNpZ25lZFR4KCksXG4gICAgICAgICAgICAwLFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB7IGFkZHJlc3M6ICcnLCBtZXNzYWdlOiAnJywgcHVia2V5czogW10sIHNjcmlwdFR5cGU6ICdwMndzaCcgfSxcbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgKSxcbiAgICAgICAgL3RyYW5zYWN0aW9uIGlucHV0IDAgc2VxdWVuY2UgbXVzdCBiZSAwLi9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIHNjcmlwdFB1YktleSBjcmVhdGVkIGJ5IHRoZSBwdWJsaWMga2V5cyBkb2VzIG5vdCBtYXRjaCB0aGUgYWRkcmVzcyBwcm92aWRlZCBpbiB0aGUgbWVzc2FnZUluZm8nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcbiAgICAgIGNvbnN0IHBzYnQgPSBiaXAzMjIuY3JlYXRlQmFzZVRvU2lnblBzYnQocm9vdFdhbGxldEtleXMpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICd0byBiZSBvciBub3QgdG8gYmUnO1xuICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0V2l0aENoYWluQW5kSW5kZXgocHNidCwgbWVzc2FnZSwgcm9vdFdhbGxldEtleXMsIHtcbiAgICAgICAgY2hhaW46IDIwLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0Lm9rKHBzYnQuZGF0YS5pbnB1dHNbMF0/LndpdG5lc3NVdHhvPy5zY3JpcHQpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICBwc2J0LmRhdGEuaW5wdXRzWzBdLndpdG5lc3NVdHhvLnNjcmlwdCxcbiAgICAgICAgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luXG4gICAgICApO1xuICAgICAgY29uc3Qgd3JvbmdQdWJsaWNLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCgyMCwgMSkucHVibGljS2V5cy5tYXAoKHApID0+IHAudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+XG4gICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICBwc2J0LmdldFVuc2lnbmVkVHgoKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHsgYWRkcmVzcywgbWVzc2FnZSwgcHVia2V5czogd3JvbmdQdWJsaWNLZXlzLCBzY3JpcHRUeXBlOiAncDJ3c2gnIH0sXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICksXG4gICAgICAgIC9BZGRyZXNzIGRvZXMgbm90IG1hdGNoIGRlcml2ZWQgc2NyaXB0UHViS2V5IGZvciBpbnB1dCAwLi9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgaWYgdGhlIHR4aWQgb2YgdGhlIGlucHV0IGRvZXMgbm90IG1hdGNoIHRoZSBkZXJpdmVkIHRvX3NwZW5kIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG4gICAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndG8gYmUgb3Igbm90IHRvIGJlJztcblxuICAgICAgY29uc3Qgb3V0cHV0ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoXG4gICAgICAgIHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoMjAsIDApLnB1YmxpY0tleXMsXG4gICAgICAgICdwMndzaCcsXG4gICAgICAgIHBzYnQubmV0d29ya1xuICAgICAgKTtcbiAgICAgIGJpcDMyMi5hZGRCaXAzMjJJbnB1dChwc2J0LCBtZXNzYWdlLCBvdXRwdXQpO1xuICAgICAgYXNzZXJ0Lm9rKHBzYnQuZGF0YS5pbnB1dHNbMF0/LndpdG5lc3NVdHhvPy5zY3JpcHQpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dC5zY3JpcHRQdWJLZXksIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gICAgICBjb25zdCBwdWJrZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCgyMCwgMCkucHVibGljS2V5cy5tYXAoKHApID0+IHAudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT5cbiAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgcHNidC5nZXRVbnNpZ25lZFR4KCksXG4gICAgICAgICAgMCxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgICAgbWVzc2FnZTogJ3RoYXQgaXMgdGhlIHF1ZXN0aW9uJyxcbiAgICAgICAgICAgIHB1YmtleXMsXG4gICAgICAgICAgICBzY3JpcHRUeXBlOiAncDJ3c2gnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFsc2VcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjaGVja1NpZ25hdHVyZT10cnVlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBzY3JpcHRUeXBlIGlzIG5vdCBhIDJvZjMgc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcbiAgICAgICAgY29uc3QgcHNidCA9IGJpcDMyMi5jcmVhdGVCYXNlVG9TaWduUHNidChyb290V2FsbGV0S2V5cyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndG8gYmUgb3Igbm90IHRvIGJlJztcbiAgICAgICAgY29uc3QgZGVyaXZlZFdhbGxldEtleXMgPSByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KDIwLCAwKS5wdWJsaWNLZXlzO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHV0eG9saWIucGF5bWVudHMucDJwa2goe1xuICAgICAgICAgIHB1YmtleTogcm9vdFdhbGxldEtleXMucHVibGljS2V5c1swXSxcbiAgICAgICAgICBuZXR3b3JrOiBwc2J0Lm5ldHdvcmssXG4gICAgICAgIH0pLm91dHB1dDtcbiAgICAgICAgYXNzZXJ0Lm9rKG91dHB1dCk7XG4gICAgICAgIGJpcDMyMi5hZGRCaXAzMjJJbnB1dChwc2J0LCBtZXNzYWdlLCB7XG4gICAgICAgICAgc2NyaXB0UHViS2V5OiBCdWZmZXIuZnJvbShvdXRwdXQpLFxuICAgICAgICB9KTtcbiAgICAgICAgcHNidC5zaWduQWxsSW5wdXRzKHJvb3RXYWxsZXRLZXlzLnVzZXIpO1xuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICBwc2J0LmdldFVuc2lnbmVkVHgoKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgbWVzc2FnZUluZm8gc2VsZiBjb25zaXN0ZW50LCBidXQgbm90IG1hdGNoIHRoZSBub24tMm9mMyBhZGRyZXNzIGluIHRoZSBQU0JUXG4gICAgICAgICAgICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICAgICAgICAgIHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKGRlcml2ZWRXYWxsZXRLZXlzLCAncDJ3c2gnLCBwc2J0Lm5ldHdvcmspXG4gICAgICAgICAgICAgICAgICAuc2NyaXB0UHViS2V5LFxuICAgICAgICAgICAgICAgIHBzYnQubmV0d29ya1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICBwdWJrZXlzOiBkZXJpdmVkV2FsbGV0S2V5cy5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICAgICAgc2NyaXB0VHlwZTogJ3Ayd3NoJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzLmZvckVhY2goKHNjcmlwdFR5cGUpID0+IHtcbiAgICAgICAgZGVzY3JpYmUoc2NyaXB0VHlwZSArICcgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHBhc3Mgd2l0aCBhIGZ1bGwgc2lnbmVkIHR4JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSB1dHhvbGliLnRlc3R1dGlsLmdldERlZmF1bHRXYWxsZXRLZXlzKCk7XG4gICAgICAgICAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndG8gYmUgb3Igbm90IHRvIGJlJztcbiAgICAgICAgICAgIGNvbnN0IGNoYWluQ29kZSA9IHV0eG9saWIuYml0Z28uZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoc2NyaXB0VHlwZSk7XG4gICAgICAgICAgICBjb25zdCBkZXJpdmVkV2FsbGV0S2V5cyA9IHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoY2hhaW5Db2RlLCAwKS5wdWJsaWNLZXlzO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICAgICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhkZXJpdmVkV2FsbGV0S2V5cywgc2NyaXB0VHlwZSwgcHNidC5uZXR3b3JrKVxuICAgICAgICAgICAgICAgIC5zY3JpcHRQdWJLZXksXG4gICAgICAgICAgICAgIHBzYnQubmV0d29ya1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0V2l0aENoYWluQW5kSW5kZXgocHNidCwgbWVzc2FnZSwgcm9vdFdhbGxldEtleXMsIHsgY2hhaW46IGNoYWluQ29kZSwgaW5kZXg6IDAgfSk7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInKSB7XG4gICAgICAgICAgICAgIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChyb290V2FsbGV0S2V5cy51c2VyKTtcbiAgICAgICAgICAgICAgcHNidC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHJvb3RXYWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKHJvb3RXYWxsZXRLZXlzLnVzZXIpO1xuICAgICAgICAgICAgcHNidC5zaWduQWxsSW5wdXRzSEQocm9vdFdhbGxldEtleXMuYml0Z28pO1xuXG4gICAgICAgICAgICBwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCk7XG4gICAgICAgICAgICBwc2J0LmZpbmFsaXplQWxsSW5wdXRzKCk7XG4gICAgICAgICAgICBjb25zdCB0eCA9IHBzYnQuZXh0cmFjdFRyYW5zYWN0aW9uKCk7XG5cbiAgICAgICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT5cbiAgICAgICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICAgICAgdHgsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwbixcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgcHNidC5uZXR3b3JrKSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAvLyBNYWtlIHRoZSBtZXNzYWdlSW5mbyBzZWxmIGNvbnNpc3RlbnQsIGJ1dCBub3QgbWF0Y2ggdGhlIG5vbi0yb2YzIGFkZHJlc3MgaW4gdGhlIFBTQlRcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgcHVia2V5czogZGVyaXZlZFdhbGxldEtleXMubWFwKChrKSA9PiBrLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgICAgICAgICBzY3JpcHRUeXBlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NoZWNrU2lnbmF0dXJlPWZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBub3QgdGhyb3cgaWYgdGhlIGlucHV0IGlzIG5vdCBzaWduZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi50ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICAgICAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9ICd0byBiZSBvciBub3QgdG8gYmUnO1xuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5jcmVhdGVPdXRwdXRTY3JpcHQyb2YzKFxuICAgICAgICAgIHJvb3RXYWxsZXRLZXlzLmRlcml2ZUZvckNoYWluQW5kSW5kZXgoMjAsIDApLnB1YmxpY0tleXMsXG4gICAgICAgICAgJ3Ayd3NoJyxcbiAgICAgICAgICBwc2J0Lm5ldHdvcmtcbiAgICAgICAgKTtcbiAgICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0KHBzYnQsIG1lc3NhZ2UsIG91dHB1dCk7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXQuc2NyaXB0UHViS2V5LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+XG4gICAgICAgICAgYmlwMzIyLmFzc2VydFR4SW5wdXQoXG4gICAgICAgICAgICBwc2J0LmdldFVuc2lnbmVkVHgoKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgcHVia2V5czogcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleCgyMCwgMCkucHVibGljS2V5cy5tYXAoKHApID0+IHAudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICAgICAgc2NyaXB0VHlwZTogJ3Ayd3NoJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXNzZXJ0QmlwMzIyVHhQcm9vZicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtZXNzYWdlSW5mbzogYmlwMzIyLk1lc3NhZ2VJbmZvW10gPSBbXTtcbiAgICBsZXQgdHg6IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludD47XG4gICAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi50ZXN0dXRpbC5nZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuICAgICAgY29uc3QgcHNidCA9IGJpcDMyMi5jcmVhdGVCYXNlVG9TaWduUHNidChyb290V2FsbGV0S2V5cyk7XG4gICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuc2NyaXB0VHlwZXMyT2YzLmZvckVhY2goKHNjcmlwdFR5cGUsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYWluID0gdXR4b2xpYi5iaXRnby5nZXRFeHRlcm5hbENoYWluQ29kZShzY3JpcHRUeXBlKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBtZXNzYWdlIGZvciAke3NjcmlwdFR5cGV9YDtcbiAgICAgICAgY29uc3QgZGVyaXZlZEtleXMgPSByb290V2FsbGV0S2V5cy5kZXJpdmVGb3JDaGFpbkFuZEluZGV4KGNoYWluLCBpbmRleCkucHVibGljS2V5cztcbiAgICAgICAgbWVzc2FnZUluZm8ucHVzaCh7XG4gICAgICAgICAgYWRkcmVzczogdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQoXG4gICAgICAgICAgICB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhkZXJpdmVkS2V5cywgc2NyaXB0VHlwZSwgcHNidC5uZXR3b3JrKS5zY3JpcHRQdWJLZXksXG4gICAgICAgICAgICBwc2J0Lm5ldHdvcmtcbiAgICAgICAgICApLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgcHVia2V5czogZGVyaXZlZEtleXMubWFwKChwKSA9PiBwLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgc2NyaXB0VHlwZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYmlwMzIyLmFkZEJpcDMyMklucHV0V2l0aENoYWluQW5kSW5kZXgocHNidCwgbWVzc2FnZSwgcm9vdFdhbGxldEtleXMsIHsgY2hhaW4sIGluZGV4IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChyb290V2FsbGV0S2V5cy51c2VyKTtcbiAgICAgIHBzYnQuc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChyb290V2FsbGV0S2V5cy5iaXRnbyk7XG4gICAgICBwc2J0LnNpZ25BbGxJbnB1dHNIRChyb290V2FsbGV0S2V5cy51c2VyKTtcbiAgICAgIHBzYnQuc2lnbkFsbElucHV0c0hEKHJvb3RXYWxsZXRLZXlzLmJpdGdvKTtcbiAgICAgIGFzc2VydC5vayhwc2J0LnZhbGlkYXRlU2lnbmF0dXJlc09mQWxsSW5wdXRzKCksIGBBbGwgc2lnbmF0dXJlcyBvbiB0aGUgaW5wdXRzIHNob3VsZCBiZSB2YWxpZGApO1xuICAgICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICAgICAgdHggPSBwc2J0LmV4dHJhY3RUcmFuc2FjdGlvbigpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcGFzcyBpZiB0aGUgbWVzc2FnZUluZm8gbWF0Y2hlcyB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGJpcDMyMi5hc3NlcnRCaXAzMjJUeFByb29mKHR4LCBtZXNzYWdlSW5mbykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIGlmIHRoZSBtZXNzYWdlSW5mbyBkb2VzIG5vdCBtYXRjaCB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGJpcDMyMi5hc3NlcnRCaXAzMjJUeFByb29mKFxuICAgICAgICAgIHR4LFxuICAgICAgICAgIG1lc3NhZ2VJbmZvLm1hcCgobSkgPT4gKHsgLi4ubSwgbWVzc2FnZTogbS5tZXNzYWdlICsgJyBhbHRlcmVkJyB9KSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VydEJpcDMyMlBzYnRQcm9vZicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtZXNzYWdlSW5mbzogYmlwMzIyLk1lc3NhZ2VJbmZvW10gPSBbXTtcbiAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IHV0eG9saWIudGVzdHV0aWwuZ2V0RGVmYXVsdFdhbGxldEtleXMoKTtcbiAgICBjb25zdCBwc2J0ID0gYmlwMzIyLmNyZWF0ZUJhc2VUb1NpZ25Qc2J0KHJvb3RXYWxsZXRLZXlzKTtcbiAgICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgICAgdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMy5mb3JFYWNoKChzY3JpcHRUeXBlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFpbiA9IHV0eG9saWIuYml0Z28uZ2V0RXh0ZXJuYWxDaGFpbkNvZGUoc2NyaXB0VHlwZSk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgbWVzc2FnZSBmb3IgJHtzY3JpcHRUeXBlfWA7XG4gICAgICAgIGNvbnN0IGRlcml2ZWRLZXlzID0gcm9vdFdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbiwgaW5kZXgpLnB1YmxpY0tleXM7XG4gICAgICAgIG1lc3NhZ2VJbmZvLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KFxuICAgICAgICAgICAgdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoZGVyaXZlZEtleXMsIHNjcmlwdFR5cGUsIHBzYnQubmV0d29yaykuc2NyaXB0UHViS2V5LFxuICAgICAgICAgICAgcHNidC5uZXR3b3JrXG4gICAgICAgICAgKSxcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIHB1YmtleXM6IGRlcml2ZWRLZXlzLm1hcCgocCkgPT4gcC50b1N0cmluZygnaGV4JykpLFxuICAgICAgICAgIHNjcmlwdFR5cGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJpcDMyMi5hZGRCaXAzMjJJbnB1dFdpdGhDaGFpbkFuZEluZGV4KHBzYnQsIG1lc3NhZ2UsIHJvb3RXYWxsZXRLZXlzLCB7IGNoYWluLCBpbmRleCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQocm9vdFdhbGxldEtleXMudXNlcik7XG4gICAgICBwc2J0LnNldEFsbElucHV0c011c2lnMk5vbmNlSEQocm9vdFdhbGxldEtleXMuYml0Z28pO1xuICAgICAgcHNidC5zaWduQWxsSW5wdXRzSEQocm9vdFdhbGxldEtleXMudXNlcik7XG4gICAgICBwc2J0LnNpZ25BbGxJbnB1dHNIRChyb290V2FsbGV0S2V5cy5iaXRnbyk7XG4gICAgICBhc3NlcnQub2socHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZkFsbElucHV0cygpLCBgQWxsIHNpZ25hdHVyZXMgb24gdGhlIGlucHV0cyBzaG91bGQgYmUgdmFsaWRgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgd29yayB3aGVuIHRoZSBtZXNzYWdlIGluZm8gbWF0Y2hlcyB3aGF0IGlzIGluIHRoZSBQU0JUJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiBiaXAzMjIuYXNzZXJ0QmlwMzIyUHNidFByb29mKHBzYnQsIG1lc3NhZ2VJbmZvKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgd2hlbiB0aGUgbWVzc2FnZSBpbmZvIGRvZXMgbm90IG1hdGNoIHdoYXQgaXMgaW4gdGhlIFBTQlQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+XG4gICAgICAgIGJpcDMyMi5hc3NlcnRCaXAzMjJQc2J0UHJvb2YoXG4gICAgICAgICAgcHNidCxcbiAgICAgICAgICBtZXNzYWdlSW5mby5tYXAoKG0pID0+ICh7IC4uLm0sIG1lc3NhZ2U6IG0ubWVzc2FnZSArICcgYWx0ZXJlZCcgfSkpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bip32utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bip32utils.d.ts","sourceRoot":"","sources":["../../../test/bip32utils.ts"],"names":[],"mappings":""}