utxo-lib 1.0.1

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 (249) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/src/address.d.ts +11 -0
  4. package/dist/src/address.d.ts.map +1 -0
  5. package/dist/src/address.js +37 -0
  6. package/dist/src/addressFormat.d.ts +53 -0
  7. package/dist/src/addressFormat.d.ts.map +1 -0
  8. package/dist/src/addressFormat.js +110 -0
  9. package/dist/src/bitgo/Musig2.d.ts +51 -0
  10. package/dist/src/bitgo/Musig2.d.ts.map +1 -0
  11. package/dist/src/bitgo/Musig2.js +175 -0
  12. package/dist/src/bitgo/Unspent.d.ts +95 -0
  13. package/dist/src/bitgo/Unspent.d.ts.map +1 -0
  14. package/dist/src/bitgo/Unspent.js +138 -0
  15. package/dist/src/bitgo/UtxoPsbt.d.ts +132 -0
  16. package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -0
  17. package/dist/src/bitgo/UtxoPsbt.js +469 -0
  18. package/dist/src/bitgo/UtxoTransaction.d.ts +22 -0
  19. package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -0
  20. package/dist/src/bitgo/UtxoTransaction.js +97 -0
  21. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +26 -0
  22. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -0
  23. package/dist/src/bitgo/UtxoTransactionBuilder.js +67 -0
  24. package/dist/src/bitgo/bbc/DashPsbt.d.ts +12 -0
  25. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +1 -0
  26. package/dist/src/bitgo/bbc/DashPsbt.js +27 -0
  27. package/dist/src/bitgo/bbc/DashTransaction.d.ts +39 -0
  28. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +1 -0
  29. package/dist/src/bitgo/bbc/DashTransaction.js +109 -0
  30. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +14 -0
  31. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +1 -0
  32. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +28 -0
  33. package/dist/src/bitgo/bbc/index.d.ts +4 -0
  34. package/dist/src/bitgo/bbc/index.d.ts.map +1 -0
  35. package/dist/src/bitgo/bbc/index.js +16 -0
  36. package/dist/src/bitgo/bitcoincash/address.d.ts +35 -0
  37. package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -0
  38. package/dist/src/bitgo/bitcoincash/address.js +151 -0
  39. package/dist/src/bitgo/bitcoincash/index.d.ts +2 -0
  40. package/dist/src/bitgo/bitcoincash/index.d.ts.map +1 -0
  41. package/dist/src/bitgo/bitcoincash/index.js +14 -0
  42. package/dist/src/bitgo/dash/DashPsbt.d.ts +12 -0
  43. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -0
  44. package/dist/src/bitgo/dash/DashPsbt.js +27 -0
  45. package/dist/src/bitgo/dash/DashTransaction.d.ts +39 -0
  46. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -0
  47. package/dist/src/bitgo/dash/DashTransaction.js +109 -0
  48. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +14 -0
  49. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -0
  50. package/dist/src/bitgo/dash/DashTransactionBuilder.js +28 -0
  51. package/dist/src/bitgo/dash/index.d.ts +4 -0
  52. package/dist/src/bitgo/dash/index.d.ts.map +1 -0
  53. package/dist/src/bitgo/dash/index.js +16 -0
  54. package/dist/src/bitgo/index.d.ts +17 -0
  55. package/dist/src/bitgo/index.d.ts.map +1 -0
  56. package/dist/src/bitgo/index.js +30 -0
  57. package/dist/src/bitgo/keyutil.d.ts +17 -0
  58. package/dist/src/bitgo/keyutil.d.ts.map +1 -0
  59. package/dist/src/bitgo/keyutil.js +37 -0
  60. package/dist/src/bitgo/nonStandardHalfSigned.d.ts +7 -0
  61. package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +1 -0
  62. package/dist/src/bitgo/nonStandardHalfSigned.js +56 -0
  63. package/dist/src/bitgo/outputScripts.d.ts +84 -0
  64. package/dist/src/bitgo/outputScripts.d.ts.map +1 -0
  65. package/dist/src/bitgo/outputScripts.js +297 -0
  66. package/dist/src/bitgo/parseInput.d.ts +92 -0
  67. package/dist/src/bitgo/parseInput.d.ts.map +1 -0
  68. package/dist/src/bitgo/parseInput.js +344 -0
  69. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +24 -0
  70. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -0
  71. package/dist/src/bitgo/psbt/fromHalfSigned.js +91 -0
  72. package/dist/src/bitgo/psbt/scriptTypes.d.ts +6 -0
  73. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -0
  74. package/dist/src/bitgo/psbt/scriptTypes.js +23 -0
  75. package/dist/src/bitgo/signature.d.ts +84 -0
  76. package/dist/src/bitgo/signature.d.ts.map +1 -0
  77. package/dist/src/bitgo/signature.js +222 -0
  78. package/dist/src/bitgo/tnumber.d.ts +9 -0
  79. package/dist/src/bitgo/tnumber.d.ts.map +1 -0
  80. package/dist/src/bitgo/tnumber.js +31 -0
  81. package/dist/src/bitgo/transaction.d.ts +29 -0
  82. package/dist/src/bitgo/transaction.d.ts.map +1 -0
  83. package/dist/src/bitgo/transaction.js +247 -0
  84. package/dist/src/bitgo/types.d.ts +5 -0
  85. package/dist/src/bitgo/types.d.ts.map +1 -0
  86. package/dist/src/bitgo/types.js +12 -0
  87. package/dist/src/bitgo/wallet/Psbt.d.ts +47 -0
  88. package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -0
  89. package/dist/src/bitgo/wallet/Psbt.js +232 -0
  90. package/dist/src/bitgo/wallet/Unspent.d.ts +47 -0
  91. package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -0
  92. package/dist/src/bitgo/wallet/Unspent.js +154 -0
  93. package/dist/src/bitgo/wallet/WalletKeys.d.ts +72 -0
  94. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -0
  95. package/dist/src/bitgo/wallet/WalletKeys.js +104 -0
  96. package/dist/src/bitgo/wallet/WalletOutput.d.ts +18 -0
  97. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -0
  98. package/dist/src/bitgo/wallet/WalletOutput.js +69 -0
  99. package/dist/src/bitgo/wallet/WalletScripts.d.ts +7 -0
  100. package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +1 -0
  101. package/dist/src/bitgo/wallet/WalletScripts.js +15 -0
  102. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +19 -0
  103. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +1 -0
  104. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +47 -0
  105. package/dist/src/bitgo/wallet/chains.d.ts +57 -0
  106. package/dist/src/bitgo/wallet/chains.d.ts.map +1 -0
  107. package/dist/src/bitgo/wallet/chains.js +106 -0
  108. package/dist/src/bitgo/wallet/index.d.ts +8 -0
  109. package/dist/src/bitgo/wallet/index.d.ts.map +1 -0
  110. package/dist/src/bitgo/wallet/index.js +20 -0
  111. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +26 -0
  112. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -0
  113. package/dist/src/bitgo/zcash/ZcashBufferutils.js +157 -0
  114. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +36 -0
  115. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -0
  116. package/dist/src/bitgo/zcash/ZcashPsbt.js +146 -0
  117. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +61 -0
  118. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -0
  119. package/dist/src/bitgo/zcash/ZcashTransaction.js +341 -0
  120. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +21 -0
  121. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -0
  122. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +105 -0
  123. package/dist/src/bitgo/zcash/address.d.ts +8 -0
  124. package/dist/src/bitgo/zcash/address.d.ts.map +1 -0
  125. package/dist/src/bitgo/zcash/address.js +57 -0
  126. package/dist/src/bitgo/zcash/hashZip0244.d.ts +27 -0
  127. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -0
  128. package/dist/src/bitgo/zcash/hashZip0244.js +184 -0
  129. package/dist/src/bitgo/zcash/index.d.ts +4 -0
  130. package/dist/src/bitgo/zcash/index.d.ts.map +1 -0
  131. package/dist/src/bitgo/zcash/index.js +16 -0
  132. package/dist/src/classify.d.ts +19 -0
  133. package/dist/src/classify.d.ts.map +1 -0
  134. package/dist/src/classify.js +89 -0
  135. package/dist/src/index.d.ts +13 -0
  136. package/dist/src/index.d.ts.map +1 -0
  137. package/dist/src/index.js +36 -0
  138. package/dist/src/networks.d.ts +119 -0
  139. package/dist/src/networks.d.ts.map +1 -0
  140. package/dist/src/networks.js +477 -0
  141. package/dist/src/noble_ecc.d.ts +28 -0
  142. package/dist/src/noble_ecc.d.ts.map +1 -0
  143. package/dist/src/noble_ecc.js +168 -0
  144. package/dist/src/payments/index.d.ts +4 -0
  145. package/dist/src/payments/index.d.ts.map +1 -0
  146. package/dist/src/payments/index.js +8 -0
  147. package/dist/src/payments/p2tr.d.ts +3 -0
  148. package/dist/src/payments/p2tr.d.ts.map +1 -0
  149. package/dist/src/payments/p2tr.js +348 -0
  150. package/dist/src/payments/p2tr_ns.d.ts +3 -0
  151. package/dist/src/payments/p2tr_ns.d.ts.map +1 -0
  152. package/dist/src/payments/p2tr_ns.js +134 -0
  153. package/dist/src/taproot.d.ts +141 -0
  154. package/dist/src/taproot.d.ts.map +1 -0
  155. package/dist/src/taproot.js +384 -0
  156. package/dist/src/templates/multisig/index.d.ts +4 -0
  157. package/dist/src/templates/multisig/index.d.ts.map +1 -0
  158. package/dist/src/templates/multisig/index.js +8 -0
  159. package/dist/src/templates/multisig/input.d.ts +7 -0
  160. package/dist/src/templates/multisig/input.d.ts.map +1 -0
  161. package/dist/src/templates/multisig/input.js +25 -0
  162. package/dist/src/templates/multisig/output.d.ts +7 -0
  163. package/dist/src/templates/multisig/output.d.ts.map +1 -0
  164. package/dist/src/templates/multisig/output.js +38 -0
  165. package/dist/src/templates/nulldata.d.ts +10 -0
  166. package/dist/src/templates/nulldata.d.ts.map +1 -0
  167. package/dist/src/templates/nulldata.js +17 -0
  168. package/dist/src/templates/pubkey/index.d.ts +4 -0
  169. package/dist/src/templates/pubkey/index.d.ts.map +1 -0
  170. package/dist/src/templates/pubkey/index.js +8 -0
  171. package/dist/src/templates/pubkey/input.d.ts +7 -0
  172. package/dist/src/templates/pubkey/input.d.ts.map +1 -0
  173. package/dist/src/templates/pubkey/input.js +14 -0
  174. package/dist/src/templates/pubkey/output.d.ts +7 -0
  175. package/dist/src/templates/pubkey/output.d.ts.map +1 -0
  176. package/dist/src/templates/pubkey/output.js +15 -0
  177. package/dist/src/templates/pubkeyhash/index.d.ts +4 -0
  178. package/dist/src/templates/pubkeyhash/index.d.ts.map +1 -0
  179. package/dist/src/templates/pubkeyhash/index.js +8 -0
  180. package/dist/src/templates/pubkeyhash/input.d.ts +7 -0
  181. package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -0
  182. package/dist/src/templates/pubkeyhash/input.js +16 -0
  183. package/dist/src/templates/pubkeyhash/output.d.ts +6 -0
  184. package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -0
  185. package/dist/src/templates/pubkeyhash/output.js +20 -0
  186. package/dist/src/templates/scripthash/index.d.ts +4 -0
  187. package/dist/src/templates/scripthash/index.d.ts.map +1 -0
  188. package/dist/src/templates/scripthash/index.js +8 -0
  189. package/dist/src/templates/scripthash/input.d.ts +6 -0
  190. package/dist/src/templates/scripthash/input.d.ts.map +1 -0
  191. package/dist/src/templates/scripthash/input.js +43 -0
  192. package/dist/src/templates/scripthash/output.d.ts +6 -0
  193. package/dist/src/templates/scripthash/output.d.ts.map +1 -0
  194. package/dist/src/templates/scripthash/output.js +15 -0
  195. package/dist/src/templates/taproot/index.d.ts +4 -0
  196. package/dist/src/templates/taproot/index.d.ts.map +1 -0
  197. package/dist/src/templates/taproot/index.js +8 -0
  198. package/dist/src/templates/taproot/input.d.ts +6 -0
  199. package/dist/src/templates/taproot/input.d.ts.map +1 -0
  200. package/dist/src/templates/taproot/input.js +23 -0
  201. package/dist/src/templates/taproot/output.d.ts +6 -0
  202. package/dist/src/templates/taproot/output.d.ts.map +1 -0
  203. package/dist/src/templates/taproot/output.js +15 -0
  204. package/dist/src/templates/taprootnofn/index.d.ts +4 -0
  205. package/dist/src/templates/taprootnofn/index.d.ts.map +1 -0
  206. package/dist/src/templates/taprootnofn/index.js +8 -0
  207. package/dist/src/templates/taprootnofn/input.d.ts +7 -0
  208. package/dist/src/templates/taprootnofn/input.d.ts.map +1 -0
  209. package/dist/src/templates/taprootnofn/input.js +24 -0
  210. package/dist/src/templates/taprootnofn/output.d.ts +7 -0
  211. package/dist/src/templates/taprootnofn/output.d.ts.map +1 -0
  212. package/dist/src/templates/taprootnofn/output.js +28 -0
  213. package/dist/src/templates/witnesscommitment/index.d.ts +3 -0
  214. package/dist/src/templates/witnesscommitment/index.d.ts.map +1 -0
  215. package/dist/src/templates/witnesscommitment/index.js +6 -0
  216. package/dist/src/templates/witnesscommitment/output.d.ts +8 -0
  217. package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -0
  218. package/dist/src/templates/witnesscommitment/output.js +31 -0
  219. package/dist/src/templates/witnesspubkeyhash/index.d.ts +4 -0
  220. package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +1 -0
  221. package/dist/src/templates/witnesspubkeyhash/index.js +8 -0
  222. package/dist/src/templates/witnesspubkeyhash/input.d.ts +7 -0
  223. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -0
  224. package/dist/src/templates/witnesspubkeyhash/input.js +19 -0
  225. package/dist/src/templates/witnesspubkeyhash/output.d.ts +6 -0
  226. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -0
  227. package/dist/src/templates/witnesspubkeyhash/output.js +15 -0
  228. package/dist/src/templates/witnessscripthash/index.d.ts +4 -0
  229. package/dist/src/templates/witnessscripthash/index.d.ts.map +1 -0
  230. package/dist/src/templates/witnessscripthash/index.js +8 -0
  231. package/dist/src/templates/witnessscripthash/input.d.ts +6 -0
  232. package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -0
  233. package/dist/src/templates/witnessscripthash/input.js +35 -0
  234. package/dist/src/templates/witnessscripthash/output.d.ts +6 -0
  235. package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -0
  236. package/dist/src/templates/witnessscripthash/output.js +15 -0
  237. package/dist/src/testutil/index.d.ts +3 -0
  238. package/dist/src/testutil/index.d.ts.map +1 -0
  239. package/dist/src/testutil/index.js +15 -0
  240. package/dist/src/testutil/keys.d.ts +10 -0
  241. package/dist/src/testutil/keys.d.ts.map +1 -0
  242. package/dist/src/testutil/keys.js +40 -0
  243. package/dist/src/testutil/mock.d.ts +21 -0
  244. package/dist/src/testutil/mock.d.ts.map +1 -0
  245. package/dist/src/testutil/mock.js +86 -0
  246. package/dist/src/transaction_builder.d.ts +47 -0
  247. package/dist/src/transaction_builder.d.ts.map +1 -0
  248. package/dist/src/transaction_builder.js +1084 -0
  249. package/package.json +87 -0
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ // Taproot-specific key aggregation and taptree logic as defined in:
3
+ // https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
4
+ // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTweakedOutputKey = exports.getTaptreeRoot = exports.getTapleafHash = exports.parseControlBlock = exports.parseTaprootWitness = exports.getControlBlock = exports.getHuffmanTaptree = exports.getDepthFirstTaptree = exports.tapTweakPubkey = exports.tapTweakPrivkey = exports.hashTapBranch = exports.hashTapLeaf = exports.serializeScriptSize = exports.aggregateMuSigPubkeys = exports.INITIAL_TAPSCRIPT_VERSION = exports.EVEN_Y_COORD_PREFIX = void 0;
7
+ const assert = require("assert");
8
+ const FastPriorityQueue = require("fastpriorityqueue");
9
+ const bitcoinjs_lib_1 = require("bitcoinjs-lib");
10
+ const varuint = require('varuint-bitcoin');
11
+ /**
12
+ * The 0x02 prefix indicating an even Y coordinate which is implicitly assumed
13
+ * on all 32 byte x-only pub keys as defined in BIP340.
14
+ */
15
+ exports.EVEN_Y_COORD_PREFIX = Buffer.of(0x02);
16
+ exports.INITIAL_TAPSCRIPT_VERSION = 0xc0;
17
+ /**
18
+ * Aggregates a list of public keys into a single MuSig2* public key
19
+ * according to the MuSig2 paper.
20
+ * @param ecc Elliptic curve implementation
21
+ * @param pubkeys The list of pub keys to aggregate
22
+ * @returns a 32 byte Buffer representing the aggregate key
23
+ */
24
+ function aggregateMuSigPubkeys(ecc, pubkeys) {
25
+ // TODO: Consider enforcing key uniqueness.
26
+ assert(pubkeys.length > 1, 'at least two pubkeys are required for musig key aggregation');
27
+ // Sort the keys in ascending order
28
+ pubkeys.sort(Buffer.compare);
29
+ // In MuSig all signers contribute key material to a single signing key,
30
+ // using the equation
31
+ //
32
+ // P = sum_i µ_i * P_i
33
+ //
34
+ // where `P_i` is the public key of the `i`th signer and `µ_i` is a so-called
35
+ // _MuSig coefficient_ computed according to the following equation
36
+ //
37
+ // L = H(P_1 || P_2 || ... || P_n)
38
+ // µ_i = H(L || P_i)
39
+ const L = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg list', Buffer.concat(pubkeys));
40
+ const secondUniquePubkey = pubkeys.find((pubkey) => !pubkeys[0].equals(pubkey));
41
+ const tweakedPubkeys = pubkeys.map((pubkey) => {
42
+ const xyPubkey = Buffer.concat([exports.EVEN_Y_COORD_PREFIX, pubkey]);
43
+ if (secondUniquePubkey !== undefined && secondUniquePubkey.equals(pubkey)) {
44
+ // The second unique key in the pubkey list given to ''KeyAgg'' (as well
45
+ // as any keys identical to this key) gets the constant KeyAgg
46
+ // coefficient 1 which saves an exponentiation (see the MuSig2* appendix
47
+ // in the MuSig2 paper).
48
+ return xyPubkey;
49
+ }
50
+ const c = bitcoinjs_lib_1.crypto.taggedHash('KeyAgg coefficient', Buffer.concat([L, pubkey]));
51
+ const tweakedPubkey = ecc.pointMultiply(xyPubkey, c);
52
+ if (!tweakedPubkey) {
53
+ throw new Error('Failed to multiply pubkey by coefficient');
54
+ }
55
+ return tweakedPubkey;
56
+ });
57
+ const aggregatePubkey = tweakedPubkeys.reduce((prev, curr) => {
58
+ const next = ecc.pointAdd(prev, curr);
59
+ if (!next)
60
+ throw new Error('Failed to sum pubkeys');
61
+ return next;
62
+ });
63
+ return aggregatePubkey.slice(1);
64
+ }
65
+ exports.aggregateMuSigPubkeys = aggregateMuSigPubkeys;
66
+ /**
67
+ * Encodes the length of a script as a bitcoin variable length integer.
68
+ * @param script
69
+ * @returns
70
+ */
71
+ function serializeScriptSize(script) {
72
+ return varuint.encode(script.length);
73
+ }
74
+ exports.serializeScriptSize = serializeScriptSize;
75
+ /**
76
+ * Gets a tapleaf tagged hash from a script.
77
+ * @param script
78
+ * @returns
79
+ */
80
+ function hashTapLeaf(script, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
81
+ const size = serializeScriptSize(script);
82
+ return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), size, script]));
83
+ }
84
+ exports.hashTapLeaf = hashTapLeaf;
85
+ /**
86
+ * Creates a lexicographically sorted tapbranch from two child taptree nodes
87
+ * and returns its tagged hash.
88
+ * @param child1
89
+ * @param child2
90
+ * @returns the tagged tapbranch hash
91
+ */
92
+ function hashTapBranch(child1, child2) {
93
+ // sort the children lexicographically
94
+ const sortedChildren = [child1, child2].sort(Buffer.compare);
95
+ return bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat(sortedChildren));
96
+ }
97
+ exports.hashTapBranch = hashTapBranch;
98
+ function calculateTapTweak(pubkey, taptreeRoot) {
99
+ if (taptreeRoot) {
100
+ return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.concat([pubkey, taptreeRoot]));
101
+ }
102
+ // If the spending conditions do not require a script path, the output key should commit to an
103
+ // unspendable script path instead of having no script path.
104
+ // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#cite_note-22
105
+ return bitcoinjs_lib_1.crypto.taggedHash('TapTweak', Buffer.from(pubkey));
106
+ }
107
+ /**
108
+ * Tweaks a privkey, using the tagged hash of its pubkey, and (optionally) a taptree root
109
+ * @param ecc Elliptic curve implementation
110
+ * @param pubkey public key, used to calculate the tweak
111
+ * @param privkey the privkey to tweak
112
+ * @param taptreeRoot the taptree root tagged hash
113
+ * @returns {Buffer} the tweaked privkey
114
+ */
115
+ function tapTweakPrivkey(ecc, pubkey, privkey, taptreeRoot) {
116
+ const tapTweak = calculateTapTweak(pubkey, taptreeRoot);
117
+ const point = ecc.pointFromScalar(privkey);
118
+ if (!point)
119
+ throw new Error('Invalid private key');
120
+ if (point[0] % 2 === 1)
121
+ privkey = ecc.privateNegate(privkey);
122
+ const result = ecc.privateAdd(privkey, tapTweak);
123
+ if (!result)
124
+ throw new Error('Invalid private key');
125
+ return result;
126
+ }
127
+ exports.tapTweakPrivkey = tapTweakPrivkey;
128
+ /**
129
+ * Tweaks an internal pubkey, using the tagged hash of itself, and (optionally) a taptree root
130
+ * @param ecc Elliptic curve implementation
131
+ * @param pubkey the internal pubkey to tweak
132
+ * @param taptreeRoot the taptree root tagged hash
133
+ * @returns {TweakedPubkey} the tweaked pubkey
134
+ */
135
+ function tapTweakPubkey(ecc, pubkey, taptreeRoot) {
136
+ const tapTweak = calculateTapTweak(pubkey, taptreeRoot);
137
+ const result = ecc.xOnlyPointAddTweak(pubkey, tapTweak);
138
+ if (!result)
139
+ throw new Error('Invalid pubkey');
140
+ return result;
141
+ }
142
+ exports.tapTweakPubkey = tapTweakPubkey;
143
+ function recurseTaptree(leaves, targetDepth = 0) {
144
+ const { value, done } = leaves.next();
145
+ assert(!done, 'insufficient leaves to reconstruct tap tree');
146
+ const [index, leaf] = value;
147
+ const tree = {
148
+ root: hashTapLeaf(leaf.script, leaf.leafVersion),
149
+ paths: [],
150
+ };
151
+ tree.paths[index] = [];
152
+ for (let depth = leaf.depth; depth > targetDepth; depth--) {
153
+ const sibling = recurseTaptree(leaves, depth);
154
+ tree.paths.forEach((path) => path.push(sibling.root));
155
+ sibling.paths.forEach((path) => path.push(tree.root));
156
+ tree.root = hashTapBranch(tree.root, sibling.root);
157
+ // Merge disjoint sparse arrays of paths into tree.paths
158
+ Object.assign(tree.paths, sibling.paths);
159
+ }
160
+ return tree;
161
+ }
162
+ /**
163
+ * Gets the root hash and hash-paths of a taptree from the depth-first
164
+ * construction used in BIP-0371 PSBTs
165
+ * @param tree
166
+ * @returns {Taptree} the tree, represented by its root hash, and the paths to
167
+ * that root from each of the input scripts
168
+ */
169
+ function getDepthFirstTaptree(tree) {
170
+ const iter = tree.leaves.entries();
171
+ const ret = recurseTaptree(iter);
172
+ assert(iter.next().done, 'invalid tap tree, no path to some leaves');
173
+ return ret;
174
+ }
175
+ exports.getDepthFirstTaptree = getDepthFirstTaptree;
176
+ /**
177
+ * Gets the root hash of a taptree using a weighted Huffman construction from a
178
+ * list of scripts and corresponding weights.
179
+ * @param scripts
180
+ * @param weights
181
+ * @returns {Taptree} the tree, represented by its root hash, and the paths to that root from each of the input scripts
182
+ */
183
+ function getHuffmanTaptree(scripts, weights) {
184
+ assert(scripts.length > 0, 'at least one script is required to construct a tap tree');
185
+ // Create a queue/heap of the provided scripts prioritized according to their
186
+ // corresponding weights.
187
+ const queue = new FastPriorityQueue((a, b) => {
188
+ return a.weight < b.weight;
189
+ });
190
+ scripts.forEach((script, index) => {
191
+ const weight = weights[index] || 1;
192
+ assert(weight > 0, 'script weight must be a positive value');
193
+ queue.add({
194
+ weight,
195
+ taggedHash: hashTapLeaf(script),
196
+ paths: { [index]: [] },
197
+ });
198
+ });
199
+ // Now that we have a queue of weighted scripts, we begin a loop whereby we
200
+ // remove the two lowest weighted items from the queue. We create a tap branch
201
+ // node from the two items, and add the branch back to the queue with the
202
+ // combined weight of both its children. Each loop reduces the number of items
203
+ // in the queue by one, and we repeat until we are left with only one item -
204
+ // this becomes the tap tree root.
205
+ //
206
+ // For example, if we begin with scripts A, B, C, D with weights 6, 3, 1, 1
207
+ // After first loop: A(6), B(3), CD(1 + 1)
208
+ // After second loop: A(6), B[CD](3 + 2)
209
+ // Final loop: A[B[CD]](6+5)
210
+ // The final tree will look like:
211
+ //
212
+ // A[B[CD]]
213
+ // / \
214
+ // A B[CD]
215
+ // / \
216
+ // B [CD]
217
+ // / \
218
+ // C D
219
+ //
220
+ // This ensures that the spending conditions we believe to have the highest
221
+ // probability of being used are further up the tree than less likely scripts,
222
+ // thereby reducing the size of the merkle proofs for the more likely scripts.
223
+ while (queue.size > 1) {
224
+ // We can safely expect two polls to return non-null elements since we've
225
+ // checked that the queue has at least two elements before looping.
226
+ const child1 = queue.poll();
227
+ const child2 = queue.poll();
228
+ Object.values(child1.paths).forEach((path) => path.push(child2.taggedHash));
229
+ Object.values(child2.paths).forEach((path) => path.push(child1.taggedHash));
230
+ queue.add({
231
+ taggedHash: hashTapBranch(child1.taggedHash, child2.taggedHash),
232
+ weight: child1.weight + child2.weight,
233
+ paths: { ...child1.paths, ...child2.paths },
234
+ });
235
+ }
236
+ // After the while loop above completes we should have exactly one element
237
+ // remaining in the queue, which we can safely extract below.
238
+ const rootNode = queue.poll();
239
+ const paths = Object.entries(rootNode.paths).reduce((acc, [index, path]) => {
240
+ acc[Number(index)] = path; // TODO: Why doesn't TS know it's a number?
241
+ return acc;
242
+ }, Array(scripts.length));
243
+ return { root: rootNode.taggedHash, paths };
244
+ }
245
+ exports.getHuffmanTaptree = getHuffmanTaptree;
246
+ function getControlBlock(parity, pubkey, path, leafVersion = exports.INITIAL_TAPSCRIPT_VERSION) {
247
+ const parityVersion = leafVersion + parity;
248
+ return Buffer.concat([Buffer.of(parityVersion), pubkey, ...path]);
249
+ }
250
+ exports.getControlBlock = getControlBlock;
251
+ /**
252
+ * Parses a taproot witness stack and extracts key data elements.
253
+ * @param witnessStack
254
+ * @returns {ScriptPathWitness|KeyPathWitness} an object representing the
255
+ * parsed witness for a script path or key path spend.
256
+ * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
257
+ */
258
+ function parseTaprootWitness(witnessStack) {
259
+ let annex;
260
+ if (witnessStack.length >= 2 && witnessStack[witnessStack.length - 1][0] === 0x50) {
261
+ // If there are at least two witness elements, and the first byte of the last element is
262
+ // 0x50, this last element is called annex a and is removed from the witness stack
263
+ annex = witnessStack[witnessStack.length - 1];
264
+ witnessStack = witnessStack.slice(0, -1);
265
+ }
266
+ if (witnessStack.length < 1) {
267
+ throw new Error('witness stack must have at least one element');
268
+ }
269
+ else if (witnessStack.length === 1) {
270
+ // key path spend
271
+ const signature = witnessStack[0];
272
+ if (!bitcoinjs_lib_1.script.isCanonicalSchnorrSignature(signature)) {
273
+ throw new Error('invalid signature');
274
+ }
275
+ return { spendType: 'Key', signature, annex };
276
+ }
277
+ // script path spend
278
+ // second to last element is the tapscript
279
+ const tapscript = witnessStack[witnessStack.length - 2];
280
+ const tapscriptChunks = bitcoinjs_lib_1.script.decompile(tapscript);
281
+ if (!tapscriptChunks || tapscriptChunks.length === 0) {
282
+ throw new Error('tapscript is not a valid script');
283
+ }
284
+ // The last stack element is called the control block c, and must have length 33 + 32m,
285
+ // for a value of m that is an integer between 0 and 128, inclusive
286
+ const controlBlock = witnessStack[witnessStack.length - 1];
287
+ if (controlBlock.length < 33 || controlBlock.length > 33 + 32 * 128 || controlBlock.length % 32 !== 1) {
288
+ throw new Error('invalid control block length');
289
+ }
290
+ return {
291
+ spendType: 'Script',
292
+ scriptSig: witnessStack.slice(0, -2),
293
+ tapscript,
294
+ controlBlock,
295
+ annex,
296
+ };
297
+ }
298
+ exports.parseTaprootWitness = parseTaprootWitness;
299
+ /**
300
+ * Parses a taproot control block.
301
+ * @param ecc Elliptic curve implementation
302
+ * @param controlBlock the control block to parse
303
+ * @returns {ControlBlock} the parsed control block
304
+ * @throws {Error} if the witness stack does not conform to the BIP 341 script validation rules
305
+ */
306
+ function parseControlBlock(ecc, controlBlock) {
307
+ if ((controlBlock.length - 1) % 32 !== 0) {
308
+ throw new TypeError('Invalid control block length');
309
+ }
310
+ const parity = controlBlock[0] & 0x01;
311
+ // Let p = c[1:33] and let P = lift_x(int(p)) where lift_x and [:] are defined as in BIP340.
312
+ // Fail if this point is not on the curve
313
+ const internalPubkey = controlBlock.slice(1, 33);
314
+ if (!ecc.isXOnlyPoint(internalPubkey)) {
315
+ throw new Error('internal pubkey is not an EC point');
316
+ }
317
+ // The leaf version cannot be 0x50 as that would result in ambiguity with the annex.
318
+ const leafVersion = controlBlock[0] & 0xfe;
319
+ if (leafVersion === 0x50) {
320
+ throw new Error('invalid leaf version');
321
+ }
322
+ const path = [];
323
+ for (let j = 33; j < controlBlock.length; j += 32) {
324
+ path.push(controlBlock.slice(j, j + 32));
325
+ }
326
+ return {
327
+ parity,
328
+ internalPubkey,
329
+ leafVersion,
330
+ path,
331
+ };
332
+ }
333
+ exports.parseControlBlock = parseControlBlock;
334
+ /**
335
+ * Calculates the tapleaf hash from a control block and script.
336
+ * @param ecc Elliptic curve implementation
337
+ * @param controlBlock the control block, either raw or parsed
338
+ * @param tapscript the leaf script corresdponding to the control block
339
+ * @returns {Buffer} the tapleaf hash
340
+ */
341
+ function getTapleafHash(ecc, controlBlock, tapscript) {
342
+ if (Buffer.isBuffer(controlBlock)) {
343
+ controlBlock = parseControlBlock(ecc, controlBlock);
344
+ }
345
+ const { leafVersion } = controlBlock;
346
+ return bitcoinjs_lib_1.crypto.taggedHash('TapLeaf', Buffer.concat([Buffer.of(leafVersion), serializeScriptSize(tapscript), tapscript]));
347
+ }
348
+ exports.getTapleafHash = getTapleafHash;
349
+ /**
350
+ * Calculates the taptree root hash from a control block and script.
351
+ * @param ecc Elliptic curve implementation
352
+ * @param controlBlock the control block, either raw or parsed
353
+ * @param tapscript the leaf script corresdponding to the control block
354
+ * @param tapleafHash the leaf hash if already calculated
355
+ * @returns {Buffer} the taptree root hash
356
+ */
357
+ function getTaptreeRoot(ecc, controlBlock, tapscript, tapleafHash) {
358
+ if (Buffer.isBuffer(controlBlock)) {
359
+ controlBlock = parseControlBlock(ecc, controlBlock);
360
+ }
361
+ const { path } = controlBlock;
362
+ tapleafHash = tapleafHash || getTapleafHash(ecc, controlBlock, tapscript);
363
+ // `taptreeMerkleHash` begins as our tapscript tapleaf hash and its value iterates
364
+ // through its parent tapbranch hashes until it ends up as the taptree root hash
365
+ let taptreeMerkleHash = tapleafHash;
366
+ for (const taptreeSiblingHash of path) {
367
+ taptreeMerkleHash =
368
+ Buffer.compare(taptreeMerkleHash, taptreeSiblingHash) === -1
369
+ ? bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat([taptreeMerkleHash, taptreeSiblingHash]))
370
+ : bitcoinjs_lib_1.crypto.taggedHash('TapBranch', Buffer.concat([taptreeSiblingHash, taptreeMerkleHash]));
371
+ }
372
+ return taptreeMerkleHash;
373
+ }
374
+ exports.getTaptreeRoot = getTaptreeRoot;
375
+ function getTweakedOutputKey(payment) {
376
+ var _a;
377
+ assert(payment.output);
378
+ if (payment.output.length === 34) {
379
+ return (_a = payment.output) === null || _a === void 0 ? void 0 : _a.subarray(2);
380
+ }
381
+ throw new Error(`invalid p2tr tweaked output key size ${payment.output.length}`);
382
+ }
383
+ exports.getTweakedOutputKey = getTweakedOutputKey;
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwcm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXByb290LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvRUFBb0U7QUFDcEUsaUVBQWlFO0FBQ2pFLGlFQUFpRTs7O0FBR2pFLGlDQUFrQztBQUNsQyx1REFBd0Q7QUFDeEQsaURBQTRGO0FBQzVGLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTNDOzs7R0FHRztBQUNVLFFBQUEsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QyxRQUFBLHlCQUF5QixHQUFHLElBQUksQ0FBQztBQVk5Qzs7Ozs7O0dBTUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxHQUEyQixFQUFFLE9BQWlCO0lBQ2xGLDJDQUEyQztJQUMzQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsNkRBQTZELENBQUMsQ0FBQztJQUUxRixtQ0FBbUM7SUFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFN0Isd0VBQXdFO0lBQ3hFLHFCQUFxQjtJQUNyQixFQUFFO0lBQ0YsMEJBQTBCO0lBQzFCLEVBQUU7SUFDRiw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLEVBQUU7SUFDRixrQ0FBa0M7SUFDbEMsb0JBQW9CO0lBRXBCLE1BQU0sQ0FBQyxHQUFHLHNCQUFPLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFFcEUsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVoRixNQUFNLGNBQWMsR0FBaUIsT0FB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QUFrRjtJQUNsRixnRkFBZ0Y7SUFDaEYsSUFBSSxpQkFBaUIsR0FBRyxXQUFXLENBQUM7SUFDcEMsS0FBSyxNQUFNLGtCQUFrQixJQUFJLElBQUksRUFBRTtRQUNyQyxpQkFBaUI7WUFDZixNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsc0JBQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pGLENBQUMsQ0FBQyxzQkFBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9GO0lBRUQsT0FBTyxpQkFBaUIsQ0FBQztBQUMzQixDQUFDO0FBeEJELHdDQXdCQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLE9BQTBCOztJQUM1RCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZCLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ2hDLE9BQU8sTUFBQSxPQUFPLENBQUMsTUFBTSwwQ0FBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbkYsQ0FBQztBQU5ELGtEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGFwcm9vdC1zcGVjaWZpYyBrZXkgYWdncmVnYXRpb24gYW5kIHRhcHRyZWUgbG9naWMgYXMgZGVmaW5lZCBpbjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraVxuXG5pbXBvcnQgeyBUYXBUcmVlIGFzIFBzYnRUYXBUcmVlLCBUYXBMZWFmIGFzIFBzYnRUYXBMZWFmIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7XG5pbXBvcnQgRmFzdFByaW9yaXR5UXVldWUgPSByZXF1aXJlKCdmYXN0cHJpb3JpdHlxdWV1ZScpO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQsIGNyeXB0byBhcyBiY3J5cHRvLCBwYXltZW50cyBhcyBicGF5bWVudHMgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmNvbnN0IHZhcnVpbnQgPSByZXF1aXJlKCd2YXJ1aW50LWJpdGNvaW4nKTtcblxuLyoqXG4gKiBUaGUgMHgwMiBwcmVmaXggaW5kaWNhdGluZyBhbiBldmVuIFkgY29vcmRpbmF0ZSB3aGljaCBpcyBpbXBsaWNpdGx5IGFzc3VtZWRcbiAqIG9uIGFsbCAzMiBieXRlIHgtb25seSBwdWIga2V5cyBhcyBkZWZpbmVkIGluIEJJUDM0MC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVWRU5fWV9DT09SRF9QUkVGSVggPSBCdWZmZXIub2YoMHgwMik7XG5leHBvcnQgY29uc3QgSU5JVElBTF9UQVBTQ1JJUFRfVkVSU0lPTiA9IDB4YzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlueVNlY3AyNTZrMUludGVyZmFjZSB7XG4gIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbjtcbiAgeE9ubHlQb2ludEFkZFR3ZWFrKHA6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHwgbnVsbDtcbiAgcG9pbnRGcm9tU2NhbGFyKHNrOiBVaW50OEFycmF5LCBjb21wcmVzc2VkPzogYm9vbGVhbik6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwb2ludE11bHRpcGx5KGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHwgbnVsbDtcbiAgcG9pbnRBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkgfCBudWxsO1xuICBwcml2YXRlQWRkKGQ6IFVpbnQ4QXJyYXksIHR3ZWFrOiBVaW50OEFycmF5KTogVWludDhBcnJheSB8IG51bGw7XG4gIHByaXZhdGVOZWdhdGUoZDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlcyBhIGxpc3Qgb2YgcHVibGljIGtleXMgaW50byBhIHNpbmdsZSBNdVNpZzIqIHB1YmxpYyBrZXlcbiAqIGFjY29yZGluZyB0byB0aGUgTXVTaWcyIHBhcGVyLlxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleXMgVGhlIGxpc3Qgb2YgcHViIGtleXMgdG8gYWdncmVnYXRlXG4gKiBAcmV0dXJucyBhIDMyIGJ5dGUgQnVmZmVyIHJlcHJlc2VudGluZyB0aGUgYWdncmVnYXRlIGtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlTXVTaWdQdWJrZXlzKGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSwgcHVia2V5czogQnVmZmVyW10pOiBVaW50OEFycmF5IHtcbiAgLy8gVE9ETzogQ29uc2lkZXIgZW5mb3JjaW5nIGtleSB1bmlxdWVuZXNzLlxuICBhc3NlcnQocHVia2V5cy5sZW5ndGggPiAxLCAnYXQgbGVhc3QgdHdvIHB1YmtleXMgYXJlIHJlcXVpcmVkIGZvciBtdXNpZyBrZXkgYWdncmVnYXRpb24nKTtcblxuICAvLyBTb3J0IHRoZSBrZXlzIGluIGFzY2VuZGluZyBvcmRlclxuICBwdWJrZXlzLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIC8vIEluIE11U2lnIGFsbCBzaWduZXJzIGNvbnRyaWJ1dGUga2V5IG1hdGVyaWFsIHRvIGEgc2luZ2xlIHNpZ25pbmcga2V5LFxuICAvLyB1c2luZyB0aGUgZXF1YXRpb25cbiAgLy9cbiAgLy8gICAgIFAgPSBzdW1faSDCtV9pICogUF9pXG4gIC8vXG4gIC8vIHdoZXJlIGBQX2lgIGlzIHRoZSBwdWJsaWMga2V5IG9mIHRoZSBgaWB0aCBzaWduZXIgYW5kIGDCtV9pYCBpcyBhIHNvLWNhbGxlZFxuICAvLyBfTXVTaWcgY29lZmZpY2llbnRfIGNvbXB1dGVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGVxdWF0aW9uXG4gIC8vXG4gIC8vIEwgPSBIKFBfMSB8fCBQXzIgfHwgLi4uIHx8IFBfbilcbiAgLy8gwrVfaSA9IEgoTCB8fCBQX2kpXG5cbiAgY29uc3QgTCA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGxpc3QnLCBCdWZmZXIuY29uY2F0KHB1YmtleXMpKTtcblxuICBjb25zdCBzZWNvbmRVbmlxdWVQdWJrZXkgPSBwdWJrZXlzLmZpbmQoKHB1YmtleSkgPT4gIXB1YmtleXNbMF0uZXF1YWxzKHB1YmtleSkpO1xuXG4gIGNvbnN0IHR3ZWFrZWRQdWJrZXlzOiBVaW50OEFycmF5W10gPSBwdWJrZXlzLm1hcCgocHVia2V5KSA9PiB7XG4gICAgY29uc3QgeHlQdWJrZXkgPSBCdWZmZXIuY29uY2F0KFtFVkVOX1lfQ09PUkRfUFJFRklYLCBwdWJrZXldKTtcblxuICAgIGlmIChzZWNvbmRVbmlxdWVQdWJrZXkgIT09IHVuZGVmaW5lZCAmJiBzZWNvbmRVbmlxdWVQdWJrZXkuZXF1YWxzKHB1YmtleSkpIHtcbiAgICAgIC8vIFRoZSBzZWNvbmQgdW5pcXVlIGtleSBpbiB0aGUgcHVia2V5IGxpc3QgZ2l2ZW4gdG8gJydLZXlBZ2cnJyAoYXMgd2VsbFxuICAgICAgLy8gYXMgYW55IGtleXMgaWRlbnRpY2FsIHRvIHRoaXMga2V5KSBnZXRzIHRoZSBjb25zdGFudCBLZXlBZ2dcbiAgICAgIC8vIGNvZWZmaWNpZW50IDEgd2hpY2ggc2F2ZXMgYW4gZXhwb25lbnRpYXRpb24gKHNlZSB0aGUgTXVTaWcyKiBhcHBlbmRpeFxuICAgICAgLy8gaW4gdGhlIE11U2lnMiBwYXBlcikuXG4gICAgICByZXR1cm4geHlQdWJrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgYyA9IGJjcnlwdG8udGFnZ2VkSGFzaCgnS2V5QWdnIGNvZWZmaWNpZW50JywgQnVmZmVyLmNvbmNhdChbTCwgcHVia2V5XSkpO1xuXG4gICAgY29uc3QgdHdlYWtlZFB1YmtleSA9IGVjYy5wb2ludE11bHRpcGx5KHh5UHVia2V5LCBjKTtcbiAgICBpZiAoIXR3ZWFrZWRQdWJrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIG11bHRpcGx5IHB1YmtleSBieSBjb2VmZmljaWVudCcpO1xuICAgIH1cbiAgICByZXR1cm4gdHdlYWtlZFB1YmtleTtcbiAgfSk7XG4gIGNvbnN0IGFnZ3JlZ2F0ZVB1YmtleSA9IHR3ZWFrZWRQdWJrZXlzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBlY2MucG9pbnRBZGQocHJldiwgY3Vycik7XG4gICAgaWYgKCFuZXh0KSB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzdW0gcHVia2V5cycpO1xuICAgIHJldHVybiBuZXh0O1xuICB9KTtcblxuICByZXR1cm4gYWdncmVnYXRlUHVia2V5LnNsaWNlKDEpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIGxlbmd0aCBvZiBhIHNjcmlwdCBhcyBhIGJpdGNvaW4gdmFyaWFibGUgbGVuZ3RoIGludGVnZXIuXG4gKiBAcGFyYW0gc2NyaXB0XG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU2NyaXB0U2l6ZShzY3JpcHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gIHJldHVybiB2YXJ1aW50LmVuY29kZShzY3JpcHQubGVuZ3RoKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgdGFwbGVhZiB0YWdnZWQgaGFzaCBmcm9tIGEgc2NyaXB0LlxuICogQHBhcmFtIHNjcmlwdFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUYXBMZWFmKHNjcmlwdDogQnVmZmVyLCBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT04pOiBCdWZmZXIge1xuICBjb25zdCBzaXplID0gc2VyaWFsaXplU2NyaXB0U2l6ZShzY3JpcHQpO1xuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBMZWFmJywgQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKGxlYWZWZXJzaW9uKSwgc2l6ZSwgc2NyaXB0XSkpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQgdGFwYnJhbmNoIGZyb20gdHdvIGNoaWxkIHRhcHRyZWUgbm9kZXNcbiAqIGFuZCByZXR1cm5zIGl0cyB0YWdnZWQgaGFzaC5cbiAqIEBwYXJhbSBjaGlsZDFcbiAqIEBwYXJhbSBjaGlsZDJcbiAqIEByZXR1cm5zIHRoZSB0YWdnZWQgdGFwYnJhbmNoIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hUYXBCcmFuY2goY2hpbGQxOiBCdWZmZXIsIGNoaWxkMjogQnVmZmVyKTogQnVmZmVyIHtcbiAgLy8gc29ydCB0aGUgY2hpbGRyZW4gbGV4aWNvZ3JhcGhpY2FsbHlcbiAgY29uc3Qgc29ydGVkQ2hpbGRyZW4gPSBbY2hpbGQxLCBjaGlsZDJdLnNvcnQoQnVmZmVyLmNvbXBhcmUpO1xuXG4gIHJldHVybiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoc29ydGVkQ2hpbGRyZW4pKTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlVGFwVHdlYWsocHVia2V5OiBVaW50OEFycmF5LCB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHRhcHRyZWVSb290KSB7XG4gICAgcmV0dXJuIGJjcnlwdG8udGFnZ2VkSGFzaCgnVGFwVHdlYWsnLCBCdWZmZXIuY29uY2F0KFtwdWJrZXksIHRhcHRyZWVSb290XSkpO1xuICB9XG4gIC8vIElmIHRoZSBzcGVuZGluZyBjb25kaXRpb25zIGRvIG5vdCByZXF1aXJlIGEgc2NyaXB0IHBhdGgsIHRoZSBvdXRwdXQga2V5IHNob3VsZCBjb21taXQgdG8gYW5cbiAgLy8gdW5zcGVuZGFibGUgc2NyaXB0IHBhdGggaW5zdGVhZCBvZiBoYXZpbmcgbm8gc2NyaXB0IHBhdGguXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDEubWVkaWF3aWtpI2NpdGVfbm90ZS0yMlxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKCdUYXBUd2VhaycsIEJ1ZmZlci5mcm9tKHB1YmtleSkpO1xufVxuXG4vKipcbiAqIFR3ZWFrcyBhIHByaXZrZXksIHVzaW5nIHRoZSB0YWdnZWQgaGFzaCBvZiBpdHMgcHVia2V5LCBhbmQgKG9wdGlvbmFsbHkpIGEgdGFwdHJlZSByb290XG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gcHVia2V5IHB1YmxpYyBrZXksIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0d2Vha1xuICogQHBhcmFtIHByaXZrZXkgdGhlIHByaXZrZXkgdG8gdHdlYWtcbiAqIEBwYXJhbSB0YXB0cmVlUm9vdCB0aGUgdGFwdHJlZSByb290IHRhZ2dlZCBoYXNoXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdHdlYWtlZCBwcml2a2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YXBUd2Vha1ByaXZrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICBwcml2a2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IFVpbnQ4QXJyYXlcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCB0YXBUd2VhayA9IGNhbGN1bGF0ZVRhcFR3ZWFrKHB1YmtleSwgdGFwdHJlZVJvb3QpO1xuXG4gIGNvbnN0IHBvaW50ID0gZWNjLnBvaW50RnJvbVNjYWxhcihwcml2a2V5KTtcbiAgaWYgKCFwb2ludCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIGlmIChwb2ludFswXSAlIDIgPT09IDEpIHByaXZrZXkgPSBlY2MucHJpdmF0ZU5lZ2F0ZShwcml2a2V5KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnByaXZhdGVBZGQocHJpdmtleSwgdGFwVHdlYWspO1xuICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHByaXZhdGUga2V5Jyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgcGFyaXR5OiAxIHwgMDtcbiAgeE9ubHlQdWJrZXk6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogVHdlYWtzIGFuIGludGVybmFsIHB1YmtleSwgdXNpbmcgdGhlIHRhZ2dlZCBoYXNoIG9mIGl0c2VsZiwgYW5kIChvcHRpb25hbGx5KSBhIHRhcHRyZWUgcm9vdFxuICogQHBhcmFtIGVjYyBFbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvblxuICogQHBhcmFtIHB1YmtleSB0aGUgaW50ZXJuYWwgcHVia2V5IHRvIHR3ZWFrXG4gKiBAcGFyYW0gdGFwdHJlZVJvb3QgdGhlIHRhcHRyZWUgcm9vdCB0YWdnZWQgaGFzaFxuICogQHJldHVybnMge1R3ZWFrZWRQdWJrZXl9IHRoZSB0d2Vha2VkIHB1YmtleVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFwVHdlYWtQdWJrZXkoXG4gIGVjYzogVGlueVNlY3AyNTZrMUludGVyZmFjZSxcbiAgcHVia2V5OiBVaW50OEFycmF5LFxuICB0YXB0cmVlUm9vdD86IEJ1ZmZlclxuKTogWE9ubHlQb2ludEFkZFR3ZWFrUmVzdWx0IHtcbiAgY29uc3QgdGFwVHdlYWsgPSBjYWxjdWxhdGVUYXBUd2VhayhwdWJrZXksIHRhcHRyZWVSb290KTtcbiAgY29uc3QgcmVzdWx0ID0gZWNjLnhPbmx5UG9pbnRBZGRUd2VhayhwdWJrZXksIHRhcFR3ZWFrKTtcbiAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJrZXknKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYXB0cmVlIHtcbiAgcm9vdDogQnVmZmVyO1xuICBwYXRoczogQnVmZmVyW11bXTtcbn1cblxuaW50ZXJmYWNlIFdlaWdodGVkVGFwU2NyaXB0IHtcbiAgLyoqIEEgVGFwTGVhZiBvciBUYXBCcmFuY2ggdGFnZ2VkIGhhc2ggKi9cbiAgdGFnZ2VkSGFzaDogQnVmZmVyO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgcGF0aHM6IHtcbiAgICBbaW5kZXg6IG51bWJlcl06IEJ1ZmZlcltdO1xuICB9O1xufVxuXG5mdW5jdGlvbiByZWN1cnNlVGFwdHJlZShsZWF2ZXM6IEl0ZXJhdG9yPFtudW1iZXIsIFBzYnRUYXBMZWFmXT4sIHRhcmdldERlcHRoID0gMCk6IFRhcHRyZWUge1xuICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBsZWF2ZXMubmV4dCgpO1xuICBhc3NlcnQoIWRvbmUsICdpbnN1ZmZpY2llbnQgbGVhdmVzIHRvIHJlY29uc3RydWN0IHRhcCB0cmVlJyk7XG4gIGNvbnN0IFtpbmRleCwgbGVhZl0gPSB2YWx1ZTtcbiAgY29uc3QgdHJlZTogVGFwdHJlZSA9IHtcbiAgICByb290OiBoYXNoVGFwTGVhZihsZWFmLnNjcmlwdCwgbGVhZi5sZWFmVmVyc2lvbiksXG4gICAgcGF0aHM6IFtdLFxuICB9O1xuICB0cmVlLnBhdGhzW2luZGV4XSA9IFtdO1xuICBmb3IgKGxldCBkZXB0aCA9IGxlYWYuZGVwdGg7IGRlcHRoID4gdGFyZ2V0RGVwdGg7IGRlcHRoLS0pIHtcbiAgICBjb25zdCBzaWJsaW5nID0gcmVjdXJzZVRhcHRyZWUobGVhdmVzLCBkZXB0aCk7XG4gICAgdHJlZS5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2goc2libGluZy5yb290KSk7XG4gICAgc2libGluZy5wYXRocy5mb3JFYWNoKChwYXRoKSA9PiBwYXRoLnB1c2godHJlZS5yb290KSk7XG4gICAgdHJlZS5yb290ID0gaGFzaFRhcEJyYW5jaCh0cmVlLnJvb3QsIHNpYmxpbmcucm9vdCk7XG4gICAgLy8gTWVyZ2UgZGlzam9pbnQgc3BhcnNlIGFycmF5cyBvZiBwYXRocyBpbnRvIHRyZWUucGF0aHNcbiAgICBPYmplY3QuYXNzaWduKHRyZWUucGF0aHMsIHNpYmxpbmcucGF0aHMpO1xuICB9XG4gIHJldHVybiB0cmVlO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHJvb3QgaGFzaCBhbmQgaGFzaC1wYXRocyBvZiBhIHRhcHRyZWUgZnJvbSB0aGUgZGVwdGgtZmlyc3RcbiAqIGNvbnN0cnVjdGlvbiB1c2VkIGluIEJJUC0wMzcxIFBTQlRzXG4gKiBAcGFyYW0gdHJlZVxuICogQHJldHVybnMge1RhcHRyZWV9IHRoZSB0cmVlLCByZXByZXNlbnRlZCBieSBpdHMgcm9vdCBoYXNoLCBhbmQgdGhlIHBhdGhzIHRvXG4gKiB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXB0aEZpcnN0VGFwdHJlZSh0cmVlOiBQc2J0VGFwVHJlZSk6IFRhcHRyZWUge1xuICBjb25zdCBpdGVyID0gdHJlZS5sZWF2ZXMuZW50cmllcygpO1xuICBjb25zdCByZXQgPSByZWN1cnNlVGFwdHJlZShpdGVyKTtcbiAgYXNzZXJ0KGl0ZXIubmV4dCgpLmRvbmUsICdpbnZhbGlkIHRhcCB0cmVlLCBubyBwYXRoIHRvIHNvbWUgbGVhdmVzJyk7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcm9vdCBoYXNoIG9mIGEgdGFwdHJlZSB1c2luZyBhIHdlaWdodGVkIEh1ZmZtYW4gY29uc3RydWN0aW9uIGZyb20gYVxuICogbGlzdCBvZiBzY3JpcHRzIGFuZCBjb3JyZXNwb25kaW5nIHdlaWdodHMuXG4gKiBAcGFyYW0gc2NyaXB0c1xuICogQHBhcmFtIHdlaWdodHNcbiAqIEByZXR1cm5zIHtUYXB0cmVlfSB0aGUgdHJlZSwgcmVwcmVzZW50ZWQgYnkgaXRzIHJvb3QgaGFzaCwgYW5kIHRoZSBwYXRocyB0byB0aGF0IHJvb3QgZnJvbSBlYWNoIG9mIHRoZSBpbnB1dCBzY3JpcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWZmbWFuVGFwdHJlZShzY3JpcHRzOiBCdWZmZXJbXSwgd2VpZ2h0czogQXJyYXk8bnVtYmVyIHwgdW5kZWZpbmVkPik6IFRhcHRyZWUge1xuICBhc3NlcnQoc2NyaXB0cy5sZW5ndGggPiAwLCAnYXQgbGVhc3Qgb25lIHNjcmlwdCBpcyByZXF1aXJlZCB0byBjb25zdHJ1Y3QgYSB0YXAgdHJlZScpO1xuXG4gIC8vIENyZWF0ZSBhIHF1ZXVlL2hlYXAgb2YgdGhlIHByb3ZpZGVkIHNjcmlwdHMgcHJpb3JpdGl6ZWQgYWNjb3JkaW5nIHRvIHRoZWlyXG4gIC8vIGNvcnJlc3BvbmRpbmcgd2VpZ2h0cy5cbiAgY29uc3QgcXVldWUgPSBuZXcgRmFzdFByaW9yaXR5UXVldWU8V2VpZ2h0ZWRUYXBTY3JpcHQ+KChhLCBiKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIGEud2VpZ2h0IDwgYi53ZWlnaHQ7XG4gIH0pO1xuICBzY3JpcHRzLmZvckVhY2goKHNjcmlwdCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCB3ZWlnaHQgPSB3ZWlnaHRzW2luZGV4XSB8fCAxO1xuICAgIGFzc2VydCh3ZWlnaHQgPiAwLCAnc2NyaXB0IHdlaWdodCBtdXN0IGJlIGEgcG9zaXRpdmUgdmFsdWUnKTtcblxuICAgIHF1ZXVlLmFkZCh7XG4gICAgICB3ZWlnaHQsXG4gICAgICB0YWdnZWRIYXNoOiBoYXNoVGFwTGVhZihzY3JpcHQpLFxuICAgICAgcGF0aHM6IHsgW2luZGV4XTogW10gfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIHF1ZXVlIG9mIHdlaWdodGVkIHNjcmlwdHMsIHdlIGJlZ2luIGEgbG9vcCB3aGVyZWJ5IHdlXG4gIC8vIHJlbW92ZSB0aGUgdHdvIGxvd2VzdCB3ZWlnaHRlZCBpdGVtcyBmcm9tIHRoZSBxdWV1ZS4gV2UgY3JlYXRlIGEgdGFwIGJyYW5jaFxuICAvLyBub2RlIGZyb20gdGhlIHR3byBpdGVtcywgYW5kIGFkZCB0aGUgYnJhbmNoIGJhY2sgdG8gdGhlIHF1ZXVlIHdpdGggdGhlXG4gIC8vIGNvbWJpbmVkIHdlaWdodCBvZiBib3RoIGl0cyBjaGlsZHJlbi4gRWFjaCBsb29wIHJlZHVjZXMgdGhlIG51bWJlciBvZiBpdGVtc1xuICAvLyBpbiB0aGUgcXVldWUgYnkgb25lLCBhbmQgd2UgcmVwZWF0IHVudGlsIHdlIGFyZSBsZWZ0IHdpdGggb25seSBvbmUgaXRlbSAtXG4gIC8vIHRoaXMgYmVjb21lcyB0aGUgdGFwIHRyZWUgcm9vdC5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUsIGlmIHdlIGJlZ2luIHdpdGggc2NyaXB0cyBBLCBCLCBDLCBEIHdpdGggd2VpZ2h0cyA2LCAzLCAxLCAxXG4gIC8vIEFmdGVyIGZpcnN0IGxvb3A6IEEoNiksIEIoMyksIENEKDEgKyAxKVxuICAvLyBBZnRlciBzZWNvbmQgbG9vcDogQSg2KSwgQltDRF0oMyArIDIpXG4gIC8vIEZpbmFsIGxvb3A6IEFbQltDRF1dKDYrNSlcbiAgLy8gVGhlIGZpbmFsIHRyZWUgd2lsbCBsb29rIGxpa2U6XG4gIC8vXG4gIC8vICAgICAgICBBW0JbQ0RdXVxuICAvLyAgICAgICAvICAgICAgICBcXFxuICAvLyAgICAgIEEgICAgICAgICBCW0NEXVxuICAvLyAgICAgICAgICAgICAgIC8gICAgIFxcXG4gIC8vICAgICAgICAgICAgICBCICAgICAgW0NEXVxuICAvLyAgICAgICAgICAgICAgICAgICAgLyAgICBcXFxuICAvLyAgICAgICAgICAgICAgICAgICBDICAgICAgRFxuICAvL1xuICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BlbmRpbmcgY29uZGl0aW9ucyB3ZSBiZWxpZXZlIHRvIGhhdmUgdGhlIGhpZ2hlc3RcbiAgLy8gcHJvYmFiaWxpdHkgb2YgYmVpbmcgdXNlZCBhcmUgZnVydGhlciB1cCB0aGUgdHJlZSB0aGFuIGxlc3MgbGlrZWx5IHNjcmlwdHMsXG4gIC8vIHRoZXJlYnkgcmVkdWNpbmcgdGhlIHNpemUgb2YgdGhlIG1lcmtsZSBwcm9vZnMgZm9yIHRoZSBtb3JlIGxpa2VseSBzY3JpcHRzLlxuICB3aGlsZSAocXVldWUuc2l6ZSA+IDEpIHtcbiAgICAvLyBXZSBjYW4gc2FmZWx5IGV4cGVjdCB0d28gcG9sbHMgdG8gcmV0dXJuIG5vbi1udWxsIGVsZW1lbnRzIHNpbmNlIHdlJ3ZlXG4gICAgLy8gY2hlY2tlZCB0aGF0IHRoZSBxdWV1ZSBoYXMgYXQgbGVhc3QgdHdvIGVsZW1lbnRzIGJlZm9yZSBsb29waW5nLlxuICAgIGNvbnN0IGNoaWxkMSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcbiAgICBjb25zdCBjaGlsZDIgPSBxdWV1ZS5wb2xsKCkgYXMgV2VpZ2h0ZWRUYXBTY3JpcHQ7XG5cbiAgICBPYmplY3QudmFsdWVzKGNoaWxkMS5wYXRocykuZm9yRWFjaCgocGF0aCkgPT4gcGF0aC5wdXNoKGNoaWxkMi50YWdnZWRIYXNoKSk7XG4gICAgT2JqZWN0LnZhbHVlcyhjaGlsZDIucGF0aHMpLmZvckVhY2goKHBhdGgpID0+IHBhdGgucHVzaChjaGlsZDEudGFnZ2VkSGFzaCkpO1xuXG4gICAgcXVldWUuYWRkKHtcbiAgICAgIHRhZ2dlZEhhc2g6IGhhc2hUYXBCcmFuY2goY2hpbGQxLnRhZ2dlZEhhc2gsIGNoaWxkMi50YWdnZWRIYXNoKSxcbiAgICAgIHdlaWdodDogY2hpbGQxLndlaWdodCArIGNoaWxkMi53ZWlnaHQsXG4gICAgICBwYXRoczogeyAuLi5jaGlsZDEucGF0aHMsIC4uLmNoaWxkMi5wYXRocyB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gQWZ0ZXIgdGhlIHdoaWxlIGxvb3AgYWJvdmUgY29tcGxldGVzIHdlIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGVsZW1lbnRcbiAgLy8gcmVtYWluaW5nIGluIHRoZSBxdWV1ZSwgd2hpY2ggd2UgY2FuIHNhZmVseSBleHRyYWN0IGJlbG93LlxuICBjb25zdCByb290Tm9kZSA9IHF1ZXVlLnBvbGwoKSBhcyBXZWlnaHRlZFRhcFNjcmlwdDtcblxuICBjb25zdCBwYXRocyA9IE9iamVjdC5lbnRyaWVzKHJvb3ROb2RlLnBhdGhzKS5yZWR1Y2UoKGFjYywgW2luZGV4LCBwYXRoXSkgPT4ge1xuICAgIGFjY1tOdW1iZXIoaW5kZXgpXSA9IHBhdGg7IC8vIFRPRE86IFdoeSBkb2Vzbid0IFRTIGtub3cgaXQncyBhIG51bWJlcj9cbiAgICByZXR1cm4gYWNjO1xuICB9LCBBcnJheShzY3JpcHRzLmxlbmd0aCkpO1xuICByZXR1cm4geyByb290OiByb290Tm9kZS50YWdnZWRIYXNoLCBwYXRocyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbEJsb2NrKFxuICBwYXJpdHk6IDAgfCAxLFxuICBwdWJrZXk6IFVpbnQ4QXJyYXksXG4gIHBhdGg6IEJ1ZmZlcltdLFxuICBsZWFmVmVyc2lvbiA9IElOSVRJQUxfVEFQU0NSSVBUX1ZFUlNJT05cbik6IEJ1ZmZlciB7XG4gIGNvbnN0IHBhcml0eVZlcnNpb24gPSBsZWFmVmVyc2lvbiArIHBhcml0eTtcblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLm9mKHBhcml0eVZlcnNpb24pLCBwdWJrZXksIC4uLnBhdGhdKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXlQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ0tleSc7XG4gIHNpZ25hdHVyZTogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRQYXRoV2l0bmVzcyB7XG4gIHNwZW5kVHlwZTogJ1NjcmlwdCc7XG4gIHNjcmlwdFNpZzogQnVmZmVyW107XG4gIHRhcHNjcmlwdDogQnVmZmVyO1xuICBjb250cm9sQmxvY2s6IEJ1ZmZlcjtcbiAgYW5uZXg/OiBCdWZmZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbEJsb2NrIHtcbiAgcGFyaXR5OiBudW1iZXI7XG4gIGludGVybmFsUHVia2V5OiBCdWZmZXI7XG4gIGxlYWZWZXJzaW9uOiBudW1iZXI7XG4gIHBhdGg6IEJ1ZmZlcltdO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHRhcHJvb3Qgd2l0bmVzcyBzdGFjayBhbmQgZXh0cmFjdHMga2V5IGRhdGEgZWxlbWVudHMuXG4gKiBAcGFyYW0gd2l0bmVzc1N0YWNrXG4gKiBAcmV0dXJucyB7U2NyaXB0UGF0aFdpdG5lc3N8S2V5UGF0aFdpdG5lc3N9IGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlXG4gKiBwYXJzZWQgd2l0bmVzcyBmb3IgYSBzY3JpcHQgcGF0aCBvciBrZXkgcGF0aCBzcGVuZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcHJvb3RXaXRuZXNzKHdpdG5lc3NTdGFjazogQnVmZmVyW10pOiBTY3JpcHRQYXRoV2l0bmVzcyB8IEtleVBhdGhXaXRuZXNzIHtcbiAgbGV0IGFubmV4O1xuICBpZiAod2l0bmVzc1N0YWNrLmxlbmd0aCA+PSAyICYmIHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMV1bMF0gPT09IDB4NTApIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHdpdG5lc3MgZWxlbWVudHMsIGFuZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgbGFzdCBlbGVtZW50IGlzXG4gICAgLy8gMHg1MCwgdGhpcyBsYXN0IGVsZW1lbnQgaXMgY2FsbGVkIGFubmV4IGEgYW5kIGlzIHJlbW92ZWQgZnJvbSB0aGUgd2l0bmVzcyBzdGFja1xuICAgIGFubmV4ID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgICB3aXRuZXNzU3RhY2sgPSB3aXRuZXNzU3RhY2suc2xpY2UoMCwgLTEpO1xuICB9XG5cbiAgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3aXRuZXNzIHN0YWNrIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudCcpO1xuICB9IGVsc2UgaWYgKHdpdG5lc3NTdGFjay5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBrZXkgcGF0aCBzcGVuZFxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IHdpdG5lc3NTdGFja1swXTtcbiAgICBpZiAoIWJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKHNpZ25hdHVyZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3BlbmRUeXBlOiAnS2V5Jywgc2lnbmF0dXJlLCBhbm5leCB9O1xuICB9XG5cbiAgLy8gc2NyaXB0IHBhdGggc3BlbmRcbiAgLy8gc2Vjb25kIHRvIGxhc3QgZWxlbWVudCBpcyB0aGUgdGFwc2NyaXB0XG4gIGNvbnN0IHRhcHNjcmlwdCA9IHdpdG5lc3NTdGFja1t3aXRuZXNzU3RhY2subGVuZ3RoIC0gMl07XG4gIGNvbnN0IHRhcHNjcmlwdENodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHRhcHNjcmlwdCk7XG5cbiAgaWYgKCF0YXBzY3JpcHRDaHVua3MgfHwgdGFwc2NyaXB0Q2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFwc2NyaXB0IGlzIG5vdCBhIHZhbGlkIHNjcmlwdCcpO1xuICB9XG5cbiAgLy8gVGhlIGxhc3Qgc3RhY2sgZWxlbWVudCBpcyBjYWxsZWQgdGhlIGNvbnRyb2wgYmxvY2sgYywgYW5kIG11c3QgaGF2ZSBsZW5ndGggMzMgKyAzMm0sXG4gIC8vIGZvciBhIHZhbHVlIG9mIG0gdGhhdCBpcyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTI4LCBpbmNsdXNpdmVcbiAgY29uc3QgY29udHJvbEJsb2NrID0gd2l0bmVzc1N0YWNrW3dpdG5lc3NTdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKGNvbnRyb2xCbG9jay5sZW5ndGggPCAzMyB8fCBjb250cm9sQmxvY2subGVuZ3RoID4gMzMgKyAzMiAqIDEyOCB8fCBjb250cm9sQmxvY2subGVuZ3RoICUgMzIgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3BlbmRUeXBlOiAnU2NyaXB0JyxcbiAgICBzY3JpcHRTaWc6IHdpdG5lc3NTdGFjay5zbGljZSgwLCAtMiksXG4gICAgdGFwc2NyaXB0LFxuICAgIGNvbnRyb2xCbG9jayxcbiAgICBhbm5leCxcbiAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSB0YXByb290IGNvbnRyb2wgYmxvY2suXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrIHRvIHBhcnNlXG4gKiBAcmV0dXJucyB7Q29udHJvbEJsb2NrfSB0aGUgcGFyc2VkIGNvbnRyb2wgYmxvY2tcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgd2l0bmVzcyBzdGFjayBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBCSVAgMzQxIHNjcmlwdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbnRyb2xCbG9jayhlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsIGNvbnRyb2xCbG9jazogQnVmZmVyKTogQ29udHJvbEJsb2NrIHtcbiAgaWYgKChjb250cm9sQmxvY2subGVuZ3RoIC0gMSkgJSAzMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgY29udHJvbCBibG9jayBsZW5ndGgnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcml0eSA9IGNvbnRyb2xCbG9ja1swXSAmIDB4MDE7XG5cbiAgLy8gTGV0IHAgPSBjWzE6MzNdIGFuZCBsZXQgUCA9IGxpZnRfeChpbnQocCkpIHdoZXJlIGxpZnRfeCBhbmQgWzpdIGFyZSBkZWZpbmVkIGFzIGluIEJJUDM0MC5cbiAgLy8gRmFpbCBpZiB0aGlzIHBvaW50IGlzIG5vdCBvbiB0aGUgY3VydmVcbiAgY29uc3QgaW50ZXJuYWxQdWJrZXkgPSBjb250cm9sQmxvY2suc2xpY2UoMSwgMzMpO1xuICBpZiAoIWVjYy5pc1hPbmx5UG9pbnQoaW50ZXJuYWxQdWJrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm5hbCBwdWJrZXkgaXMgbm90IGFuIEVDIHBvaW50Jyk7XG4gIH1cblxuICAvLyBUaGUgbGVhZiB2ZXJzaW9uIGNhbm5vdCBiZSAweDUwIGFzIHRoYXQgd291bGQgcmVzdWx0IGluIGFtYmlndWl0eSB3aXRoIHRoZSBhbm5leC5cbiAgY29uc3QgbGVhZlZlcnNpb24gPSBjb250cm9sQmxvY2tbMF0gJiAweGZlO1xuICBpZiAobGVhZlZlcnNpb24gPT09IDB4NTApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGVhZiB2ZXJzaW9uJyk7XG4gIH1cblxuICBjb25zdCBwYXRoOiBCdWZmZXJbXSA9IFtdO1xuICBmb3IgKGxldCBqID0gMzM7IGogPCBjb250cm9sQmxvY2subGVuZ3RoOyBqICs9IDMyKSB7XG4gICAgcGF0aC5wdXNoKGNvbnRyb2xCbG9jay5zbGljZShqLCBqICsgMzIpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFyaXR5LFxuICAgIGludGVybmFsUHVia2V5LFxuICAgIGxlYWZWZXJzaW9uLFxuICAgIHBhdGgsXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwbGVhZiBoYXNoIGZyb20gYSBjb250cm9sIGJsb2NrIGFuZCBzY3JpcHQuXG4gKiBAcGFyYW0gZWNjIEVsbGlwdGljIGN1cnZlIGltcGxlbWVudGF0aW9uXG4gKiBAcGFyYW0gY29udHJvbEJsb2NrIHRoZSBjb250cm9sIGJsb2NrLCBlaXRoZXIgcmF3IG9yIHBhcnNlZFxuICogQHBhcmFtIHRhcHNjcmlwdCB0aGUgbGVhZiBzY3JpcHQgY29ycmVzZHBvbmRpbmcgdG8gdGhlIGNvbnRyb2wgYmxvY2tcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IHRoZSB0YXBsZWFmIGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcGxlYWZIYXNoKFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlclxuKTogQnVmZmVyIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250cm9sQmxvY2spKSB7XG4gICAgY29udHJvbEJsb2NrID0gcGFyc2VDb250cm9sQmxvY2soZWNjLCBjb250cm9sQmxvY2spO1xuICB9XG4gIGNvbnN0IHsgbGVhZlZlcnNpb24gfSA9IGNvbnRyb2xCbG9jaztcblxuICByZXR1cm4gYmNyeXB0by50YWdnZWRIYXNoKFxuICAgICdUYXBMZWFmJyxcbiAgICBCdWZmZXIuY29uY2F0KFtCdWZmZXIub2YobGVhZlZlcnNpb24pLCBzZXJpYWxpemVTY3JpcHRTaXplKHRhcHNjcmlwdCksIHRhcHNjcmlwdF0pXG4gICk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgdGFwdHJlZSByb290IGhhc2ggZnJvbSBhIGNvbnRyb2wgYmxvY2sgYW5kIHNjcmlwdC5cbiAqIEBwYXJhbSBlY2MgRWxsaXB0aWMgY3VydmUgaW1wbGVtZW50YXRpb25cbiAqIEBwYXJhbSBjb250cm9sQmxvY2sgdGhlIGNvbnRyb2wgYmxvY2ssIGVpdGhlciByYXcgb3IgcGFyc2VkXG4gKiBAcGFyYW0gdGFwc2NyaXB0IHRoZSBsZWFmIHNjcmlwdCBjb3JyZXNkcG9uZGluZyB0byB0aGUgY29udHJvbCBibG9ja1xuICogQHBhcmFtIHRhcGxlYWZIYXNoIHRoZSBsZWFmIGhhc2ggaWYgYWxyZWFkeSBjYWxjdWxhdGVkXG4gKiBAcmV0dXJucyB7QnVmZmVyfSB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcHRyZWVSb290KFxuICBlY2M6IFRpbnlTZWNwMjU2azFJbnRlcmZhY2UsXG4gIGNvbnRyb2xCbG9jazogQnVmZmVyIHwgQ29udHJvbEJsb2NrLFxuICB0YXBzY3JpcHQ6IEJ1ZmZlcixcbiAgdGFwbGVhZkhhc2g/OiBCdWZmZXJcbik6IEJ1ZmZlciB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY29udHJvbEJsb2NrKSkge1xuICAgIGNvbnRyb2xCbG9jayA9IHBhcnNlQ29udHJvbEJsb2NrKGVjYywgY29udHJvbEJsb2NrKTtcbiAgfVxuICBjb25zdCB7IHBhdGggfSA9IGNvbnRyb2xCbG9jaztcblxuICB0YXBsZWFmSGFzaCA9IHRhcGxlYWZIYXNoIHx8IGdldFRhcGxlYWZIYXNoKGVjYywgY29udHJvbEJsb2NrLCB0YXBzY3JpcHQpO1xuXG4gIC8vIGB0YXB0cmVlTWVya2xlSGFzaGAgYmVnaW5zIGFzIG91ciB0YXBzY3JpcHQgdGFwbGVhZiBoYXNoIGFuZCBpdHMgdmFsdWUgaXRlcmF0ZXNcbiAgLy8gdGhyb3VnaCBpdHMgcGFyZW50IHRhcGJyYW5jaCBoYXNoZXMgdW50aWwgaXQgZW5kcyB1cCBhcyB0aGUgdGFwdHJlZSByb290IGhhc2hcbiAgbGV0IHRhcHRyZWVNZXJrbGVIYXNoID0gdGFwbGVhZkhhc2g7XG4gIGZvciAoY29uc3QgdGFwdHJlZVNpYmxpbmdIYXNoIG9mIHBhdGgpIHtcbiAgICB0YXB0cmVlTWVya2xlSGFzaCA9XG4gICAgICBCdWZmZXIuY29tcGFyZSh0YXB0cmVlTWVya2xlSGFzaCwgdGFwdHJlZVNpYmxpbmdIYXNoKSA9PT0gLTFcbiAgICAgICAgPyBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVNZXJrbGVIYXNoLCB0YXB0cmVlU2libGluZ0hhc2hdKSlcbiAgICAgICAgOiBiY3J5cHRvLnRhZ2dlZEhhc2goJ1RhcEJyYW5jaCcsIEJ1ZmZlci5jb25jYXQoW3RhcHRyZWVTaWJsaW5nSGFzaCwgdGFwdHJlZU1lcmtsZUhhc2hdKSk7XG4gIH1cblxuICByZXR1cm4gdGFwdHJlZU1lcmtsZUhhc2g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUd2Vha2VkT3V0cHV0S2V5KHBheW1lbnQ6IGJwYXltZW50cy5QYXltZW50KTogQnVmZmVyIHtcbiAgYXNzZXJ0KHBheW1lbnQub3V0cHV0KTtcbiAgaWYgKHBheW1lbnQub3V0cHV0Lmxlbmd0aCA9PT0gMzQpIHtcbiAgICByZXR1cm4gcGF5bWVudC5vdXRwdXQ/LnN1YmFycmF5KDIpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBwMnRyIHR3ZWFrZWQgb3V0cHV0IGtleSBzaXplICR7cGF5bWVudC5vdXRwdXQubGVuZ3RofWApO1xufVxuIl19
@@ -0,0 +1,4 @@
1
+ import * as input from './input';
2
+ import * as output from './output';
3
+ export { input, output };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.output = exports.input = void 0;
4
+ const input = require("./input");
5
+ exports.input = input;
6
+ const output = require("./output");
7
+ exports.output = output;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlDQUFpQztBQUd4QixzQkFBSztBQUZkLG1DQUFtQztBQUVuQix3QkFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlucHV0IGZyb20gJy4vaW5wdXQnO1xuaW1wb3J0ICogYXMgb3V0cHV0IGZyb20gJy4vb3V0cHV0JztcblxuZXhwb3J0IHsgaW5wdXQsIG91dHB1dCB9O1xuIl19
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Stack } from '../../';
3
+ export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
+ export declare namespace check {
5
+ var toJSON: () => string;
6
+ }
7
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/input.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQ/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAUhF;yBAVe,KAAK"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ // OP_0 [signatures ...]
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.check = void 0;
5
+ const __1 = require("../../");
6
+ const __2 = require("../../");
7
+ function partialSignature(value) {
8
+ return value === __2.opcodes.OP_0 || __1.script.isCanonicalScriptSignature(value);
9
+ }
10
+ function check(script, allowIncomplete) {
11
+ const chunks = __1.script.decompile(script);
12
+ if (chunks.length < 2)
13
+ return false;
14
+ if (chunks[0] !== __2.opcodes.OP_0)
15
+ return false;
16
+ if (allowIncomplete) {
17
+ return chunks.slice(1).every(partialSignature);
18
+ }
19
+ return chunks.slice(1).every(__1.script.isCanonicalScriptSignature);
20
+ }
21
+ exports.check = check;
22
+ check.toJSON = () => {
23
+ return 'multisig input';
24
+ };
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL211bHRpc2lnL2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3QkFBd0I7OztBQUd4Qiw4QkFBMkM7QUFDM0MsOEJBQWlDO0FBRWpDLFNBQVMsZ0JBQWdCLENBQUMsS0FBc0I7SUFDOUMsT0FBTyxLQUFLLEtBQUssV0FBTyxDQUFDLElBQUksSUFBSSxVQUFPLENBQUMsMEJBQTBCLENBQUMsS0FBZSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFPLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRTdDLElBQUksZUFBZSxFQUFFO1FBQ25CLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUNoRDtJQUVELE9BQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQWMsQ0FBQyxLQUFLLENBQUMsVUFBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFDakYsQ0FBQztBQVZELHNCQVVDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBPUF8wIFtzaWduYXR1cmVzIC4uLl1cblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLy4uLyc7XG5cbmZ1bmN0aW9uIHBhcnRpYWxTaWduYXR1cmUodmFsdWU6IG51bWJlciB8IEJ1ZmZlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgPT09IG9wY29kZXMuT1BfMCB8fCBic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKHZhbHVlIGFzIEJ1ZmZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IFN0YWNrLCBhbGxvd0luY29tcGxldGU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNodW5rcyA9IGJzY3JpcHQuZGVjb21waWxlKHNjcmlwdCkgYXMgU3RhY2s7XG4gIGlmIChjaHVua3MubGVuZ3RoIDwgMikgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzWzBdICE9PSBvcGNvZGVzLk9QXzApIHJldHVybiBmYWxzZTtcblxuICBpZiAoYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgcmV0dXJuIGNodW5rcy5zbGljZSgxKS5ldmVyeShwYXJ0aWFsU2lnbmF0dXJlKTtcbiAgfVxuXG4gIHJldHVybiAoY2h1bmtzLnNsaWNlKDEpIGFzIEJ1ZmZlcltdKS5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsU2NyaXB0U2lnbmF0dXJlKTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpc2lnIGlucHV0Jztcbn07XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Stack } from '../../';
3
+ export declare function check(script: Buffer | Stack, allowIncomplete?: boolean): boolean;
4
+ export declare namespace check {
5
+ var toJSON: () => string;
6
+ }
7
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/templates/multisig/output.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAM/B,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAkBhF;yBAlBe,KAAK"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ // m [pubKeys ...] n OP_CHECKMULTISIG
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.check = void 0;
5
+ const __1 = require("../../");
6
+ const __2 = require("../../");
7
+ const types = require("bitcoinjs-lib/src/types");
8
+ const OP_INT_BASE = __2.opcodes.OP_RESERVED; // OP_1 - 1
9
+ function check(script, allowIncomplete) {
10
+ const chunks = __1.script.decompile(script);
11
+ if (chunks.length < 4)
12
+ return false;
13
+ if (chunks[chunks.length - 1] !== __2.opcodes.OP_CHECKMULTISIG)
14
+ return false;
15
+ if (!types.Number(chunks[0]))
16
+ return false;
17
+ if (!types.Number(chunks[chunks.length - 2]))
18
+ return false;
19
+ const m = chunks[0] - OP_INT_BASE;
20
+ const n = chunks[chunks.length - 2] - OP_INT_BASE;
21
+ if (m <= 0)
22
+ return false;
23
+ if (n > 16)
24
+ return false;
25
+ if (m > n)
26
+ return false;
27
+ if (n !== chunks.length - 3)
28
+ return false;
29
+ if (allowIncomplete)
30
+ return true;
31
+ const keys = chunks.slice(1, -2);
32
+ return keys.every(__1.script.isCanonicalPubKey);
33
+ }
34
+ exports.check = check;
35
+ check.toJSON = () => {
36
+ return 'multi-sig output';
37
+ };
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RlbXBsYXRlcy9tdWx0aXNpZy9vdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHFDQUFxQzs7O0FBR3JDLDhCQUEyQztBQUMzQyw4QkFBaUM7QUFDakMsaURBQWlEO0FBQ2pELE1BQU0sV0FBVyxHQUFHLFdBQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXO0FBRXBELFNBQWdCLEtBQUssQ0FBQyxNQUFzQixFQUFFLGVBQXlCO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLFVBQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFVLENBQUM7SUFFbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6RSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQVksR0FBRyxXQUFXLENBQUM7SUFDOUMsTUFBTSxDQUFDLEdBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFZLEdBQUcsV0FBVyxDQUFDO0lBRTlELElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN6QixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7SUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFsQkQsc0JBa0JDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBtIFtwdWJLZXlzIC4uLl0gbiBPUF9DSEVDS01VTFRJU0lHXG5cbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IHNjcmlwdCBhcyBic2NyaXB0IH0gZnJvbSAnLi4vLi4vJztcbmltcG9ydCB7IG9wY29kZXMgfSBmcm9tICcuLi8uLi8nO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnYml0Y29pbmpzLWxpYi9zcmMvdHlwZXMnO1xuY29uc3QgT1BfSU5UX0JBU0UgPSBvcGNvZGVzLk9QX1JFU0VSVkVEOyAvLyBPUF8xIC0gMVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2soc2NyaXB0OiBCdWZmZXIgfCBTdGFjaywgYWxsb3dJbmNvbXBsZXRlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBjaHVua3MgPSBic2NyaXB0LmRlY29tcGlsZShzY3JpcHQpIGFzIFN0YWNrO1xuXG4gIGlmIChjaHVua3MubGVuZ3RoIDwgNCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAxXSAhPT0gb3Bjb2Rlcy5PUF9DSEVDS01VTFRJU0lHKSByZXR1cm4gZmFsc2U7XG4gIGlmICghdHlwZXMuTnVtYmVyKGNodW5rc1swXSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0eXBlcy5OdW1iZXIoY2h1bmtzW2NodW5rcy5sZW5ndGggLSAyXSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbSA9IChjaHVua3NbMF0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuICBjb25zdCBuID0gKGNodW5rc1tjaHVua3MubGVuZ3RoIC0gMl0gYXMgbnVtYmVyKSAtIE9QX0lOVF9CQVNFO1xuXG4gIGlmIChtIDw9IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gPiAxNikgcmV0dXJuIGZhbHNlO1xuICBpZiAobSA+IG4pIHJldHVybiBmYWxzZTtcbiAgaWYgKG4gIT09IGNodW5rcy5sZW5ndGggLSAzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChhbGxvd0luY29tcGxldGUpIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGtleXMgPSBjaHVua3Muc2xpY2UoMSwgLTIpIGFzIEJ1ZmZlcltdO1xuICByZXR1cm4ga2V5cy5ldmVyeShic2NyaXB0LmlzQ2Fub25pY2FsUHViS2V5KTtcbn1cbmNoZWNrLnRvSlNPTiA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gJ211bHRpLXNpZyBvdXRwdXQnO1xufTtcbiJdfQ==
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ export declare function check(script: Buffer | Array<number | Buffer>): boolean;
3
+ export declare namespace check {
4
+ var toJSON: () => string;
5
+ }
6
+ declare const output: {
7
+ check: typeof check;
8
+ };
9
+ export { output };
10
+ //# sourceMappingURL=nulldata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nulldata.d.ts","sourceRoot":"","sources":["../../../src/templates/nulldata.ts"],"names":[],"mappings":";AAIA,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAItE;yBAJe,KAAK;;;AASrB,QAAA,MAAM,MAAM;;CAAY,CAAC;AAEzB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.output = exports.check = void 0;
4
+ // OP_RETURN {data}
5
+ const __1 = require("../");
6
+ const __2 = require("../");
7
+ function check(script) {
8
+ const buffer = __1.script.compile(script);
9
+ return buffer.length > 1 && buffer[0] === __2.opcodes.OP_RETURN;
10
+ }
11
+ exports.check = check;
12
+ check.toJSON = () => {
13
+ return 'null data output';
14
+ };
15
+ const output = { check };
16
+ exports.output = output;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVsbGRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGVzL251bGxkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1CQUFtQjtBQUNuQiwyQkFBd0M7QUFDeEMsMkJBQThCO0FBRTlCLFNBQWdCLEtBQUssQ0FBQyxNQUF1QztJQUMzRCxNQUFNLE1BQU0sR0FBRyxVQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXZDLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQU8sQ0FBQyxTQUFTLENBQUM7QUFDOUQsQ0FBQztBQUpELHNCQUlDO0FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFXLEVBQUU7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRixNQUFNLE1BQU0sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0FBRWhCLHdCQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gT1BfUkVUVVJOIHtkYXRhfVxuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLi8nO1xuaW1wb3J0IHsgb3Bjb2RlcyB9IGZyb20gJy4uLyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayhzY3JpcHQ6IEJ1ZmZlciB8IEFycmF5PG51bWJlciB8IEJ1ZmZlcj4pOiBib29sZWFuIHtcbiAgY29uc3QgYnVmZmVyID0gYnNjcmlwdC5jb21waWxlKHNjcmlwdCk7XG5cbiAgcmV0dXJuIGJ1ZmZlci5sZW5ndGggPiAxICYmIGJ1ZmZlclswXSA9PT0gb3Bjb2Rlcy5PUF9SRVRVUk47XG59XG5jaGVjay50b0pTT04gPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuICdudWxsIGRhdGEgb3V0cHV0Jztcbn07XG5cbmNvbnN0IG91dHB1dCA9IHsgY2hlY2sgfTtcblxuZXhwb3J0IHsgb3V0cHV0IH07XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import * as input from './input';
2
+ import * as output from './output';
3
+ export { input, output };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/templates/pubkey/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.output = exports.input = void 0;
4
+ const input = require("./input");
5
+ exports.input = input;
6
+ const output = require("./output");
7
+ exports.output = output;
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVtcGxhdGVzL3B1YmtleS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpQ0FBaUM7QUFHeEIsc0JBQUs7QUFGZCxtQ0FBbUM7QUFFbkIsd0JBQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBpbnB1dCBmcm9tICcuL2lucHV0JztcbmltcG9ydCAqIGFzIG91dHB1dCBmcm9tICcuL291dHB1dCc7XG5cbmV4cG9ydCB7IGlucHV0LCBvdXRwdXQgfTtcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /// <reference types="node" />
2
+ import { Stack } from '../../';
3
+ export declare function check(script: Buffer | Stack): boolean;
4
+ export declare namespace check {
5
+ var toJSON: () => string;
6
+ }
7
+ //# sourceMappingURL=input.d.ts.map