utxo-lib 1.1.5 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of utxo-lib might be problematic. Click here for more details.

Files changed (250) hide show
  1. package/index.js +47 -0
  2. package/package.json +6 -80
  3. package/LICENSE +0 -21
  4. package/README.md +0 -59
  5. package/dist/src/address.d.ts +0 -11
  6. package/dist/src/address.d.ts.map +0 -1
  7. package/dist/src/address.js +0 -37
  8. package/dist/src/addressFormat.d.ts +0 -53
  9. package/dist/src/addressFormat.d.ts.map +0 -1
  10. package/dist/src/addressFormat.js +0 -110
  11. package/dist/src/bitgo/Musig2.d.ts +0 -51
  12. package/dist/src/bitgo/Musig2.d.ts.map +0 -1
  13. package/dist/src/bitgo/Musig2.js +0 -175
  14. package/dist/src/bitgo/Unspent.d.ts +0 -95
  15. package/dist/src/bitgo/Unspent.d.ts.map +0 -1
  16. package/dist/src/bitgo/Unspent.js +0 -138
  17. package/dist/src/bitgo/UtxoPsbt.d.ts +0 -132
  18. package/dist/src/bitgo/UtxoPsbt.d.ts.map +0 -1
  19. package/dist/src/bitgo/UtxoPsbt.js +0 -469
  20. package/dist/src/bitgo/UtxoTransaction.d.ts +0 -22
  21. package/dist/src/bitgo/UtxoTransaction.d.ts.map +0 -1
  22. package/dist/src/bitgo/UtxoTransaction.js +0 -97
  23. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -26
  24. package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +0 -1
  25. package/dist/src/bitgo/UtxoTransactionBuilder.js +0 -67
  26. package/dist/src/bitgo/bbc/DashPsbt.d.ts +0 -12
  27. package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +0 -1
  28. package/dist/src/bitgo/bbc/DashPsbt.js +0 -27
  29. package/dist/src/bitgo/bbc/DashTransaction.d.ts +0 -39
  30. package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +0 -1
  31. package/dist/src/bitgo/bbc/DashTransaction.js +0 -109
  32. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +0 -14
  33. package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +0 -1
  34. package/dist/src/bitgo/bbc/DashTransactionBuilder.js +0 -28
  35. package/dist/src/bitgo/bbc/index.d.ts +0 -4
  36. package/dist/src/bitgo/bbc/index.d.ts.map +0 -1
  37. package/dist/src/bitgo/bbc/index.js +0 -16
  38. package/dist/src/bitgo/bitcoincash/address.d.ts +0 -35
  39. package/dist/src/bitgo/bitcoincash/address.d.ts.map +0 -1
  40. package/dist/src/bitgo/bitcoincash/address.js +0 -151
  41. package/dist/src/bitgo/bitcoincash/index.d.ts +0 -2
  42. package/dist/src/bitgo/bitcoincash/index.d.ts.map +0 -1
  43. package/dist/src/bitgo/bitcoincash/index.js +0 -14
  44. package/dist/src/bitgo/dash/DashPsbt.d.ts +0 -12
  45. package/dist/src/bitgo/dash/DashPsbt.d.ts.map +0 -1
  46. package/dist/src/bitgo/dash/DashPsbt.js +0 -27
  47. package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -39
  48. package/dist/src/bitgo/dash/DashTransaction.d.ts.map +0 -1
  49. package/dist/src/bitgo/dash/DashTransaction.js +0 -109
  50. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -14
  51. package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +0 -1
  52. package/dist/src/bitgo/dash/DashTransactionBuilder.js +0 -28
  53. package/dist/src/bitgo/dash/index.d.ts +0 -4
  54. package/dist/src/bitgo/dash/index.d.ts.map +0 -1
  55. package/dist/src/bitgo/dash/index.js +0 -16
  56. package/dist/src/bitgo/index.d.ts +0 -17
  57. package/dist/src/bitgo/index.d.ts.map +0 -1
  58. package/dist/src/bitgo/index.js +0 -30
  59. package/dist/src/bitgo/keyutil.d.ts +0 -17
  60. package/dist/src/bitgo/keyutil.d.ts.map +0 -1
  61. package/dist/src/bitgo/keyutil.js +0 -37
  62. package/dist/src/bitgo/nonStandardHalfSigned.d.ts +0 -7
  63. package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +0 -1
  64. package/dist/src/bitgo/nonStandardHalfSigned.js +0 -56
  65. package/dist/src/bitgo/outputScripts.d.ts +0 -84
  66. package/dist/src/bitgo/outputScripts.d.ts.map +0 -1
  67. package/dist/src/bitgo/outputScripts.js +0 -297
  68. package/dist/src/bitgo/parseInput.d.ts +0 -92
  69. package/dist/src/bitgo/parseInput.d.ts.map +0 -1
  70. package/dist/src/bitgo/parseInput.js +0 -344
  71. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -24
  72. package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +0 -1
  73. package/dist/src/bitgo/psbt/fromHalfSigned.js +0 -91
  74. package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -6
  75. package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +0 -1
  76. package/dist/src/bitgo/psbt/scriptTypes.js +0 -23
  77. package/dist/src/bitgo/signature.d.ts +0 -84
  78. package/dist/src/bitgo/signature.d.ts.map +0 -1
  79. package/dist/src/bitgo/signature.js +0 -222
  80. package/dist/src/bitgo/tnumber.d.ts +0 -9
  81. package/dist/src/bitgo/tnumber.d.ts.map +0 -1
  82. package/dist/src/bitgo/tnumber.js +0 -31
  83. package/dist/src/bitgo/transaction.d.ts +0 -29
  84. package/dist/src/bitgo/transaction.d.ts.map +0 -1
  85. package/dist/src/bitgo/transaction.js +0 -231
  86. package/dist/src/bitgo/types.d.ts +0 -5
  87. package/dist/src/bitgo/types.d.ts.map +0 -1
  88. package/dist/src/bitgo/types.js +0 -12
  89. package/dist/src/bitgo/wallet/Psbt.d.ts +0 -47
  90. package/dist/src/bitgo/wallet/Psbt.d.ts.map +0 -1
  91. package/dist/src/bitgo/wallet/Psbt.js +0 -232
  92. package/dist/src/bitgo/wallet/Unspent.d.ts +0 -47
  93. package/dist/src/bitgo/wallet/Unspent.d.ts.map +0 -1
  94. package/dist/src/bitgo/wallet/Unspent.js +0 -154
  95. package/dist/src/bitgo/wallet/WalletKeys.d.ts +0 -72
  96. package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +0 -1
  97. package/dist/src/bitgo/wallet/WalletKeys.js +0 -104
  98. package/dist/src/bitgo/wallet/WalletOutput.d.ts +0 -18
  99. package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +0 -1
  100. package/dist/src/bitgo/wallet/WalletOutput.js +0 -69
  101. package/dist/src/bitgo/wallet/WalletScripts.d.ts +0 -7
  102. package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +0 -1
  103. package/dist/src/bitgo/wallet/WalletScripts.js +0 -15
  104. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +0 -19
  105. package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +0 -1
  106. package/dist/src/bitgo/wallet/WalletUnspentSigner.js +0 -47
  107. package/dist/src/bitgo/wallet/chains.d.ts +0 -57
  108. package/dist/src/bitgo/wallet/chains.d.ts.map +0 -1
  109. package/dist/src/bitgo/wallet/chains.js +0 -106
  110. package/dist/src/bitgo/wallet/index.d.ts +0 -8
  111. package/dist/src/bitgo/wallet/index.d.ts.map +0 -1
  112. package/dist/src/bitgo/wallet/index.js +0 -20
  113. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +0 -26
  114. package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +0 -1
  115. package/dist/src/bitgo/zcash/ZcashBufferutils.js +0 -157
  116. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -36
  117. package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +0 -1
  118. package/dist/src/bitgo/zcash/ZcashPsbt.js +0 -146
  119. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +0 -61
  120. package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +0 -1
  121. package/dist/src/bitgo/zcash/ZcashTransaction.js +0 -341
  122. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -21
  123. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +0 -1
  124. package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +0 -105
  125. package/dist/src/bitgo/zcash/address.d.ts +0 -8
  126. package/dist/src/bitgo/zcash/address.d.ts.map +0 -1
  127. package/dist/src/bitgo/zcash/address.js +0 -57
  128. package/dist/src/bitgo/zcash/hashZip0244.d.ts +0 -27
  129. package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +0 -1
  130. package/dist/src/bitgo/zcash/hashZip0244.js +0 -184
  131. package/dist/src/bitgo/zcash/index.d.ts +0 -4
  132. package/dist/src/bitgo/zcash/index.d.ts.map +0 -1
  133. package/dist/src/bitgo/zcash/index.js +0 -16
  134. package/dist/src/classify.d.ts +0 -19
  135. package/dist/src/classify.d.ts.map +0 -1
  136. package/dist/src/classify.js +0 -89
  137. package/dist/src/index.d.ts +0 -13
  138. package/dist/src/index.d.ts.map +0 -1
  139. package/dist/src/index.js +0 -36
  140. package/dist/src/networks.d.ts +0 -115
  141. package/dist/src/networks.d.ts.map +0 -1
  142. package/dist/src/networks.js +0 -458
  143. package/dist/src/noble_ecc.d.ts +0 -28
  144. package/dist/src/noble_ecc.d.ts.map +0 -1
  145. package/dist/src/noble_ecc.js +0 -168
  146. package/dist/src/payments/index.d.ts +0 -4
  147. package/dist/src/payments/index.d.ts.map +0 -1
  148. package/dist/src/payments/index.js +0 -8
  149. package/dist/src/payments/p2tr.d.ts +0 -3
  150. package/dist/src/payments/p2tr.d.ts.map +0 -1
  151. package/dist/src/payments/p2tr.js +0 -348
  152. package/dist/src/payments/p2tr_ns.d.ts +0 -3
  153. package/dist/src/payments/p2tr_ns.d.ts.map +0 -1
  154. package/dist/src/payments/p2tr_ns.js +0 -134
  155. package/dist/src/taproot.d.ts +0 -141
  156. package/dist/src/taproot.d.ts.map +0 -1
  157. package/dist/src/taproot.js +0 -384
  158. package/dist/src/templates/multisig/index.d.ts +0 -4
  159. package/dist/src/templates/multisig/index.d.ts.map +0 -1
  160. package/dist/src/templates/multisig/index.js +0 -8
  161. package/dist/src/templates/multisig/input.d.ts +0 -7
  162. package/dist/src/templates/multisig/input.d.ts.map +0 -1
  163. package/dist/src/templates/multisig/input.js +0 -25
  164. package/dist/src/templates/multisig/output.d.ts +0 -7
  165. package/dist/src/templates/multisig/output.d.ts.map +0 -1
  166. package/dist/src/templates/multisig/output.js +0 -38
  167. package/dist/src/templates/nulldata.d.ts +0 -10
  168. package/dist/src/templates/nulldata.d.ts.map +0 -1
  169. package/dist/src/templates/nulldata.js +0 -17
  170. package/dist/src/templates/pubkey/index.d.ts +0 -4
  171. package/dist/src/templates/pubkey/index.d.ts.map +0 -1
  172. package/dist/src/templates/pubkey/index.js +0 -8
  173. package/dist/src/templates/pubkey/input.d.ts +0 -7
  174. package/dist/src/templates/pubkey/input.d.ts.map +0 -1
  175. package/dist/src/templates/pubkey/input.js +0 -14
  176. package/dist/src/templates/pubkey/output.d.ts +0 -7
  177. package/dist/src/templates/pubkey/output.d.ts.map +0 -1
  178. package/dist/src/templates/pubkey/output.js +0 -15
  179. package/dist/src/templates/pubkeyhash/index.d.ts +0 -4
  180. package/dist/src/templates/pubkeyhash/index.d.ts.map +0 -1
  181. package/dist/src/templates/pubkeyhash/index.js +0 -8
  182. package/dist/src/templates/pubkeyhash/input.d.ts +0 -7
  183. package/dist/src/templates/pubkeyhash/input.d.ts.map +0 -1
  184. package/dist/src/templates/pubkeyhash/input.js +0 -16
  185. package/dist/src/templates/pubkeyhash/output.d.ts +0 -6
  186. package/dist/src/templates/pubkeyhash/output.d.ts.map +0 -1
  187. package/dist/src/templates/pubkeyhash/output.js +0 -20
  188. package/dist/src/templates/scripthash/index.d.ts +0 -4
  189. package/dist/src/templates/scripthash/index.d.ts.map +0 -1
  190. package/dist/src/templates/scripthash/index.js +0 -8
  191. package/dist/src/templates/scripthash/input.d.ts +0 -6
  192. package/dist/src/templates/scripthash/input.d.ts.map +0 -1
  193. package/dist/src/templates/scripthash/input.js +0 -43
  194. package/dist/src/templates/scripthash/output.d.ts +0 -6
  195. package/dist/src/templates/scripthash/output.d.ts.map +0 -1
  196. package/dist/src/templates/scripthash/output.js +0 -15
  197. package/dist/src/templates/taproot/index.d.ts +0 -4
  198. package/dist/src/templates/taproot/index.d.ts.map +0 -1
  199. package/dist/src/templates/taproot/index.js +0 -8
  200. package/dist/src/templates/taproot/input.d.ts +0 -6
  201. package/dist/src/templates/taproot/input.d.ts.map +0 -1
  202. package/dist/src/templates/taproot/input.js +0 -23
  203. package/dist/src/templates/taproot/output.d.ts +0 -6
  204. package/dist/src/templates/taproot/output.d.ts.map +0 -1
  205. package/dist/src/templates/taproot/output.js +0 -15
  206. package/dist/src/templates/taprootnofn/index.d.ts +0 -4
  207. package/dist/src/templates/taprootnofn/index.d.ts.map +0 -1
  208. package/dist/src/templates/taprootnofn/index.js +0 -8
  209. package/dist/src/templates/taprootnofn/input.d.ts +0 -7
  210. package/dist/src/templates/taprootnofn/input.d.ts.map +0 -1
  211. package/dist/src/templates/taprootnofn/input.js +0 -24
  212. package/dist/src/templates/taprootnofn/output.d.ts +0 -7
  213. package/dist/src/templates/taprootnofn/output.d.ts.map +0 -1
  214. package/dist/src/templates/taprootnofn/output.js +0 -28
  215. package/dist/src/templates/witnesscommitment/index.d.ts +0 -3
  216. package/dist/src/templates/witnesscommitment/index.d.ts.map +0 -1
  217. package/dist/src/templates/witnesscommitment/index.js +0 -6
  218. package/dist/src/templates/witnesscommitment/output.d.ts +0 -8
  219. package/dist/src/templates/witnesscommitment/output.d.ts.map +0 -1
  220. package/dist/src/templates/witnesscommitment/output.js +0 -31
  221. package/dist/src/templates/witnesspubkeyhash/index.d.ts +0 -4
  222. package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +0 -1
  223. package/dist/src/templates/witnesspubkeyhash/index.js +0 -8
  224. package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -7
  225. package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +0 -1
  226. package/dist/src/templates/witnesspubkeyhash/input.js +0 -19
  227. package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -6
  228. package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +0 -1
  229. package/dist/src/templates/witnesspubkeyhash/output.js +0 -15
  230. package/dist/src/templates/witnessscripthash/index.d.ts +0 -4
  231. package/dist/src/templates/witnessscripthash/index.d.ts.map +0 -1
  232. package/dist/src/templates/witnessscripthash/index.js +0 -8
  233. package/dist/src/templates/witnessscripthash/input.d.ts +0 -6
  234. package/dist/src/templates/witnessscripthash/input.d.ts.map +0 -1
  235. package/dist/src/templates/witnessscripthash/input.js +0 -35
  236. package/dist/src/templates/witnessscripthash/output.d.ts +0 -6
  237. package/dist/src/templates/witnessscripthash/output.d.ts.map +0 -1
  238. package/dist/src/templates/witnessscripthash/output.js +0 -15
  239. package/dist/src/testutil/index.d.ts +0 -3
  240. package/dist/src/testutil/index.d.ts.map +0 -1
  241. package/dist/src/testutil/index.js +0 -15
  242. package/dist/src/testutil/keys.d.ts +0 -10
  243. package/dist/src/testutil/keys.d.ts.map +0 -1
  244. package/dist/src/testutil/keys.js +0 -40
  245. package/dist/src/testutil/mock.d.ts +0 -21
  246. package/dist/src/testutil/mock.d.ts.map +0 -1
  247. package/dist/src/testutil/mock.js +0 -86
  248. package/dist/src/transaction_builder.d.ts +0 -47
  249. package/dist/src/transaction_builder.d.ts.map +0 -1
  250. package/dist/src/transaction_builder.js +0 -1084
@@ -1,1084 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TransactionBuilder = void 0;
4
- const types = require("bitcoinjs-lib/src/types");
5
- const _1 = require("./");
6
- const bufferutils = require("bitcoinjs-lib/src/bufferutils");
7
- const classify = require("./classify");
8
- const _2 = require("./");
9
- const _3 = require("./");
10
- const _4 = require("./");
11
- const _5 = require("./");
12
- const _6 = require("./");
13
- const _7 = require("./");
14
- const _8 = require("./");
15
- const noble_ecc_1 = require("./noble_ecc");
16
- const typeforce = require('typeforce');
17
- const tfFullSigner = (obj) => {
18
- return typeforce.Buffer(obj.publicKey) && typeof obj.sign === 'function' && typeof obj.signSchnorr === 'function';
19
- };
20
- const SCRIPT_TYPES = classify.types;
21
- const PREVOUT_TYPES = new Set([
22
- // Raw
23
- 'p2pkh',
24
- 'p2pk',
25
- 'p2wpkh',
26
- 'p2ms',
27
- // P2SH wrapped
28
- 'p2sh-p2pkh',
29
- 'p2sh-p2pk',
30
- 'p2sh-p2wpkh',
31
- 'p2sh-p2ms',
32
- // P2WSH wrapped
33
- 'p2wsh-p2pkh',
34
- 'p2wsh-p2pk',
35
- 'p2wsh-p2ms',
36
- // P2SH-P2WSH wrapper
37
- 'p2sh-p2wsh-p2pkh',
38
- 'p2sh-p2wsh-p2pk',
39
- 'p2sh-p2wsh-p2ms',
40
- // P2TR KeyPath
41
- 'p2tr',
42
- // P2TR ScriptPath
43
- 'p2tr-p2ns',
44
- ]);
45
- function tfMessage(type, value, message) {
46
- try {
47
- typeforce(type, value);
48
- }
49
- catch (err) {
50
- throw new Error(message);
51
- }
52
- }
53
- function txIsString(tx) {
54
- return typeof tx === 'string' || tx instanceof String;
55
- }
56
- function txIsTransaction(tx) {
57
- return tx instanceof _8.Transaction;
58
- }
59
- class TransactionBuilder {
60
- // WARNING: maximumFeeRate is __NOT__ to be relied on,
61
- // it's just another potential safety mechanism (safety in-depth)
62
- constructor(network = _3.networks.bitcoin, maximumFeeRate = 2500) {
63
- this.network = network;
64
- this.maximumFeeRate = maximumFeeRate;
65
- this.__PREV_TX_SET = {};
66
- this.__INPUTS = [];
67
- this.__TX = new _8.Transaction();
68
- this.__TX.version = 2;
69
- this.__USE_LOW_R = false;
70
- console.warn('Deprecation Warning: TransactionBuilder will be removed in the future. ' +
71
- '(v6.x.x or later) Please use the Psbt class instead. Examples of usage ' +
72
- 'are available in the transactions-psbt.js integration test file on our ' +
73
- 'Github. A high level explanation is available in the psbt.ts and psbt.js ' +
74
- 'files as well.');
75
- }
76
- static fromTransaction(transaction, network, prevOutputs) {
77
- const txb = new TransactionBuilder(network);
78
- // Copy transaction fields
79
- txb.setVersion(transaction.version);
80
- txb.setLockTime(transaction.locktime);
81
- // Copy outputs (done first to avoid signature invalidation)
82
- transaction.outs.forEach((txOut) => {
83
- txb.addOutput(txOut.script, txOut.value);
84
- });
85
- // Copy inputs
86
- transaction.ins.forEach((txIn) => {
87
- txb.__addInputUnsafe(txIn.hash, txIn.index, {
88
- sequence: txIn.sequence,
89
- script: txIn.script,
90
- witness: txIn.witness,
91
- });
92
- });
93
- // fix some things not possible through the public API
94
- txb.__INPUTS.forEach((input, i) => {
95
- fixMultisigOrder(input, transaction, i, prevOutputs);
96
- });
97
- return txb;
98
- }
99
- setLowR(setting) {
100
- typeforce(typeforce.maybe(typeforce.Boolean), setting);
101
- if (setting === undefined) {
102
- setting = true;
103
- }
104
- this.__USE_LOW_R = setting;
105
- return setting;
106
- }
107
- setLockTime(locktime) {
108
- typeforce(types.UInt32, locktime);
109
- // if any signatures exist, throw
110
- if (this.__INPUTS.some((input) => {
111
- if (!input.signatures)
112
- return false;
113
- return input.signatures.some((s) => s !== undefined);
114
- })) {
115
- throw new Error('No, this would invalidate signatures');
116
- }
117
- this.__TX.locktime = locktime;
118
- }
119
- setVersion(version) {
120
- typeforce(types.UInt32, version);
121
- // XXX: this might eventually become more complex depending on what the versions represent
122
- this.__TX.version = version;
123
- }
124
- addInput(txHash, vout, sequence, prevOutScript, value) {
125
- if (!this.__canModifyInputs()) {
126
- throw new Error('No, this would invalidate signatures');
127
- }
128
- // is it a hex string?
129
- if (txIsString(txHash)) {
130
- // transaction hashs's are displayed in reverse order, un-reverse it
131
- txHash = bufferutils.reverseBuffer(Buffer.from(txHash, 'hex'));
132
- // is it a Transaction object?
133
- }
134
- else if (txIsTransaction(txHash)) {
135
- const txOut = txHash.outs[vout];
136
- prevOutScript = txOut.script;
137
- value = txOut.value;
138
- txHash = txHash.getHash(false);
139
- }
140
- return this.__addInputUnsafe(txHash, vout, {
141
- sequence,
142
- prevOutScript,
143
- value,
144
- });
145
- }
146
- addOutput(scriptPubKey, value) {
147
- if (!this.__canModifyOutputs()) {
148
- throw new Error('No, this would invalidate signatures');
149
- }
150
- // Attempt to get a script if it's a base58 or bech32 address string
151
- if (typeof scriptPubKey === 'string') {
152
- scriptPubKey = _1.address.toOutputScript(scriptPubKey, this.network);
153
- }
154
- return this.__TX.addOutput(scriptPubKey, value);
155
- }
156
- build() {
157
- return this.__build(false);
158
- }
159
- buildIncomplete() {
160
- return this.__build(true);
161
- }
162
- sign(signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex) {
163
- trySign(getSigningData(this.network, this.__INPUTS, this.__needsOutputs.bind(this), this.__TX, signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex, this.__USE_LOW_R));
164
- }
165
- __addInputUnsafe(txHash, vout, options) {
166
- if (_8.Transaction.isCoinbaseHash(txHash)) {
167
- throw new Error('coinbase inputs not supported');
168
- }
169
- const prevTxOut = txHash.toString('hex') + ':' + vout;
170
- if (this.__PREV_TX_SET[prevTxOut] !== undefined)
171
- throw new Error('Duplicate TxOut: ' + prevTxOut);
172
- let input = {};
173
- // derive what we can from the scriptSig
174
- if (options.script !== undefined || options.witness !== undefined) {
175
- input = expandInput(options.script, options.witness);
176
- }
177
- // if an input value was given, retain it
178
- if (options.value !== undefined) {
179
- input.value = options.value;
180
- }
181
- // derive what we can from the previous transactions output script
182
- if (!input.prevOutScript && options.prevOutScript) {
183
- let prevOutType;
184
- if (!input.pubkeys && !input.signatures) {
185
- const expanded = expandOutput(options.prevOutScript);
186
- if (expanded.pubkeys) {
187
- input.pubkeys = expanded.pubkeys;
188
- input.signatures = expanded.signatures;
189
- }
190
- prevOutType = expanded.type;
191
- }
192
- input.prevOutScript = options.prevOutScript;
193
- input.prevOutType = prevOutType || classify.output(options.prevOutScript);
194
- }
195
- const vin = this.__TX.addInput(txHash, vout, options.sequence, options.scriptSig);
196
- this.__INPUTS[vin] = input;
197
- this.__PREV_TX_SET[prevTxOut] = true;
198
- return vin;
199
- }
200
- __build(allowIncomplete) {
201
- if (!allowIncomplete) {
202
- if (!this.__TX.ins.length)
203
- throw new Error('Transaction has no inputs');
204
- if (!this.__TX.outs.length)
205
- throw new Error('Transaction has no outputs');
206
- }
207
- const tx = this.__TX.clone();
208
- // create script signatures from inputs
209
- this.__INPUTS.forEach((input, i) => {
210
- if (!input.prevOutType && !allowIncomplete)
211
- throw new Error('Transaction is not complete');
212
- const result = build(input.prevOutType, input, allowIncomplete);
213
- if (!result) {
214
- if (!allowIncomplete && input.prevOutType === SCRIPT_TYPES.NONSTANDARD)
215
- throw new Error('Unknown input type');
216
- if (!allowIncomplete)
217
- throw new Error('Not enough information');
218
- return;
219
- }
220
- if (result.input) {
221
- tx.setInputScript(i, result.input);
222
- }
223
- tx.setWitness(i, result.witness);
224
- });
225
- if (!allowIncomplete) {
226
- // do not rely on this, its merely a last resort
227
- if (this.__overMaximumFees(tx.virtualSize())) {
228
- throw new Error('Transaction has absurd fees');
229
- }
230
- }
231
- return tx;
232
- }
233
- __canModifyInputs() {
234
- return this.__INPUTS.every((input) => {
235
- if (!input.signatures)
236
- return true;
237
- return input.signatures.every((signature) => {
238
- if (!signature)
239
- return true;
240
- const hashType = signatureHashType(signature);
241
- // if SIGHASH_ANYONECANPAY is set, signatures would not
242
- // be invalidated by more inputs
243
- return (hashType & _8.Transaction.SIGHASH_ANYONECANPAY) !== 0;
244
- });
245
- });
246
- }
247
- __needsOutputs(signingHashType) {
248
- if (signingHashType === _8.Transaction.SIGHASH_ALL || signingHashType === _8.Transaction.SIGHASH_DEFAULT) {
249
- return this.__TX.outs.length === 0;
250
- }
251
- // if inputs are being signed with SIGHASH_NONE, we don't strictly need outputs
252
- // .build() will fail, but .buildIncomplete() is OK
253
- return (this.__TX.outs.length === 0 &&
254
- this.__INPUTS.some((input) => {
255
- if (!input.signatures)
256
- return false;
257
- return input.signatures.some((signature) => {
258
- if (!signature)
259
- return false; // no signature, no issue
260
- const hashType = signatureHashType(signature);
261
- if (hashType & _8.Transaction.SIGHASH_NONE)
262
- return false; // SIGHASH_NONE doesn't care about outputs
263
- return true; // SIGHASH_* does care
264
- });
265
- }));
266
- }
267
- __canModifyOutputs() {
268
- const nInputs = this.__TX.ins.length;
269
- const nOutputs = this.__TX.outs.length;
270
- return this.__INPUTS.every((input) => {
271
- if (input.signatures === undefined)
272
- return true;
273
- return input.signatures.every((signature) => {
274
- if (!signature)
275
- return true;
276
- const hashType = signatureHashType(signature);
277
- const hashTypeMod = hashType & 0x1f;
278
- if (hashTypeMod === _8.Transaction.SIGHASH_NONE)
279
- return true;
280
- if (hashTypeMod === _8.Transaction.SIGHASH_SINGLE) {
281
- // if SIGHASH_SINGLE is set, and nInputs > nOutputs
282
- // some signatures would be invalidated by the addition
283
- // of more outputs
284
- return nInputs <= nOutputs;
285
- }
286
- return false;
287
- });
288
- });
289
- }
290
- __overMaximumFees(bytes) {
291
- // not all inputs will have .value defined
292
- const incoming = this.__INPUTS.reduce((a, x) => a + (typeof x.value !== 'undefined' ? BigInt(x.value) : BigInt(0)), BigInt(0));
293
- // but all outputs do, and if we have any input value
294
- // we can immediately determine if the outputs are too small
295
- const outgoing = this.__TX.outs.reduce((a, x) => a + BigInt(x.value), BigInt(0));
296
- const fee = incoming - outgoing;
297
- const feeRate = Number(fee) / bytes; // assume fee fits within number
298
- return feeRate > this.maximumFeeRate;
299
- }
300
- }
301
- exports.TransactionBuilder = TransactionBuilder;
302
- function expandInput(scriptSig, witnessStack = [], type, scriptPubKey) {
303
- if (scriptSig && scriptSig.length === 0 && witnessStack.length === 0)
304
- return {};
305
- if (!type) {
306
- let ssType = scriptSig ? classify.input(scriptSig, true) : undefined;
307
- let wsType = classify.witness(witnessStack, true);
308
- if (ssType === SCRIPT_TYPES.NONSTANDARD)
309
- ssType = undefined;
310
- if (wsType === SCRIPT_TYPES.NONSTANDARD)
311
- wsType = undefined;
312
- type = ssType || wsType;
313
- }
314
- switch (type) {
315
- case SCRIPT_TYPES.P2WPKH: {
316
- const { output, pubkey, signature } = _4.payments.p2wpkh({
317
- witness: witnessStack,
318
- });
319
- return {
320
- prevOutScript: output,
321
- prevOutType: SCRIPT_TYPES.P2WPKH,
322
- pubkeys: [pubkey],
323
- signatures: [signature],
324
- };
325
- }
326
- case SCRIPT_TYPES.P2PKH: {
327
- const { output, pubkey, signature } = _4.payments.p2pkh({
328
- input: scriptSig,
329
- });
330
- return {
331
- prevOutScript: output,
332
- prevOutType: SCRIPT_TYPES.P2PKH,
333
- pubkeys: [pubkey],
334
- signatures: [signature],
335
- };
336
- }
337
- case SCRIPT_TYPES.P2PK: {
338
- const { signature } = _4.payments.p2pk({ input: scriptSig });
339
- return {
340
- prevOutType: SCRIPT_TYPES.P2PK,
341
- pubkeys: [undefined],
342
- signatures: [signature],
343
- };
344
- }
345
- case SCRIPT_TYPES.P2MS: {
346
- const { m, pubkeys, signatures } = _4.payments.p2ms({
347
- input: scriptSig,
348
- output: scriptPubKey,
349
- }, { allowIncomplete: true });
350
- return {
351
- prevOutType: SCRIPT_TYPES.P2MS,
352
- pubkeys,
353
- signatures,
354
- maxSignatures: m,
355
- };
356
- }
357
- case SCRIPT_TYPES.P2TR_NS: {
358
- const { n, pubkeys, signatures } = _1.p2trPayments.p2tr_ns({
359
- // Witness signatures are reverse of pubkeys, because it's a stack
360
- signatures: witnessStack.length ? witnessStack.reverse() : undefined,
361
- output: scriptPubKey,
362
- }, { allowIncomplete: true, eccLib: noble_ecc_1.ecc });
363
- return {
364
- prevOutType: SCRIPT_TYPES.P2TR_NS,
365
- pubkeys,
366
- signatures,
367
- maxSignatures: n,
368
- };
369
- }
370
- }
371
- if (type === SCRIPT_TYPES.P2SH) {
372
- const { output, redeem } = _4.payments.p2sh({
373
- input: scriptSig,
374
- witness: witnessStack,
375
- });
376
- const outputType = classify.output(redeem.output);
377
- const expanded = expandInput(redeem.input, redeem.witness, outputType, redeem.output);
378
- if (!expanded.prevOutType)
379
- return {};
380
- return {
381
- prevOutScript: output,
382
- prevOutType: SCRIPT_TYPES.P2SH,
383
- redeemScript: redeem.output,
384
- redeemScriptType: expanded.prevOutType,
385
- witnessScript: expanded.witnessScript,
386
- witnessScriptType: expanded.witnessScriptType,
387
- pubkeys: expanded.pubkeys,
388
- signatures: expanded.signatures,
389
- };
390
- }
391
- if (type === SCRIPT_TYPES.P2WSH) {
392
- const { output, redeem } = _4.payments.p2wsh({
393
- input: scriptSig,
394
- witness: witnessStack,
395
- });
396
- const outputType = classify.output(redeem.output);
397
- let expanded;
398
- if (outputType === SCRIPT_TYPES.P2WPKH) {
399
- expanded = expandInput(redeem.input, redeem.witness, outputType);
400
- }
401
- else {
402
- expanded = expandInput(_5.script.compile(redeem.witness), [], outputType, redeem.output);
403
- }
404
- if (!expanded.prevOutType)
405
- return {};
406
- return {
407
- prevOutScript: output,
408
- prevOutType: SCRIPT_TYPES.P2WSH,
409
- witnessScript: redeem.output,
410
- witnessScriptType: expanded.prevOutType,
411
- pubkeys: expanded.pubkeys,
412
- signatures: expanded.signatures,
413
- };
414
- }
415
- if (type === SCRIPT_TYPES.P2TR) {
416
- const parsedWitness = _7.taproot.parseTaprootWitness(witnessStack);
417
- if (parsedWitness.spendType === 'Key') {
418
- // key path spend, nothing to expand
419
- const { signature, annex } = parsedWitness;
420
- return {
421
- prevOutType: SCRIPT_TYPES.P2TR,
422
- signatures: [signature],
423
- annex,
424
- };
425
- }
426
- else {
427
- // script path spend
428
- const { tapscript, controlBlock, annex } = parsedWitness;
429
- const prevOutScript = _1.p2trPayments.p2tr({
430
- redeems: [{ output: tapscript }],
431
- redeemIndex: 0,
432
- controlBlock,
433
- annex,
434
- }, { eccLib: noble_ecc_1.ecc }).output;
435
- const witnessScriptType = classify.output(tapscript);
436
- const { pubkeys, signatures } = expandInput(undefined, parsedWitness.scriptSig, witnessScriptType, tapscript);
437
- return {
438
- prevOutScript,
439
- prevOutType: SCRIPT_TYPES.P2TR,
440
- witnessScript: tapscript,
441
- witnessScriptType,
442
- controlBlock,
443
- annex,
444
- pubkeys,
445
- signatures,
446
- };
447
- }
448
- }
449
- return {
450
- prevOutType: SCRIPT_TYPES.NONSTANDARD,
451
- prevOutScript: scriptSig,
452
- };
453
- }
454
- // could be done in expandInput, but requires the original Transaction for hashForSignature
455
- function fixMultisigOrder(input, transaction, vin, prevOutputs) {
456
- if (input.redeemScriptType !== SCRIPT_TYPES.P2MS || !input.redeemScript)
457
- return;
458
- if (input.pubkeys.length === input.signatures.length)
459
- return;
460
- const prevOutput = prevOutputs && prevOutputs[vin];
461
- const unmatched = input.signatures.concat();
462
- input.signatures = input.pubkeys.map((pubKey) => {
463
- const keyPair = noble_ecc_1.ECPair.fromPublicKey(pubKey);
464
- let match;
465
- // check for a signature
466
- unmatched.some((signature, i) => {
467
- // skip if undefined || OP_0
468
- if (!signature)
469
- return false;
470
- // TODO: avoid O(n) hashForSignature
471
- const parsed = _5.script.signature.decode(signature);
472
- const hash = transaction.hashForSignature(vin, input.redeemScript, parsed.hashType, prevOutput === null || prevOutput === void 0 ? void 0 : prevOutput.value);
473
- // skip if signature does not match pubKey
474
- if (!keyPair.verify(hash, parsed.signature))
475
- return false;
476
- // remove matched signature from unmatched
477
- unmatched[i] = undefined;
478
- match = signature;
479
- return true;
480
- });
481
- return match;
482
- });
483
- }
484
- function expandOutput(script, ourPubKey, controlBlock) {
485
- typeforce(types.Buffer, script);
486
- const type = classify.output(script);
487
- switch (type) {
488
- case SCRIPT_TYPES.P2PKH: {
489
- if (!ourPubKey)
490
- return { type };
491
- // does our hash160(pubKey) match the output scripts?
492
- const pkh1 = _4.payments.p2pkh({ output: script }).hash;
493
- const pkh2 = _2.crypto.hash160(ourPubKey);
494
- if (!pkh1.equals(pkh2))
495
- return { type };
496
- return {
497
- type,
498
- pubkeys: [ourPubKey],
499
- signatures: [undefined],
500
- };
501
- }
502
- case SCRIPT_TYPES.P2WPKH: {
503
- if (!ourPubKey)
504
- return { type };
505
- // does our hash160(pubKey) match the output scripts?
506
- const wpkh1 = _4.payments.p2wpkh({ output: script }).hash;
507
- const wpkh2 = _2.crypto.hash160(ourPubKey);
508
- if (!wpkh1.equals(wpkh2))
509
- return { type };
510
- return {
511
- type,
512
- pubkeys: [ourPubKey],
513
- signatures: [undefined],
514
- };
515
- }
516
- case SCRIPT_TYPES.P2TR: {
517
- if (!ourPubKey)
518
- return { type };
519
- // HACK ourPubKey to BIP340-style
520
- if (ourPubKey.length === 33)
521
- ourPubKey = ourPubKey.slice(1);
522
- // TODO: support multiple pubkeys
523
- const p2tr = _1.p2trPayments.p2tr({ pubkey: ourPubKey, controlBlock }, { eccLib: noble_ecc_1.ecc });
524
- // Does tweaked output for a single pubkey match?
525
- if (!script.equals(p2tr.output))
526
- return { type };
527
- // P2TR KeyPath, single key
528
- return {
529
- type,
530
- pubkeys: [ourPubKey],
531
- signatures: [undefined],
532
- };
533
- }
534
- case SCRIPT_TYPES.P2TR_NS: {
535
- const p2trNs = _1.p2trPayments.p2tr_ns({ output: script }, { eccLib: noble_ecc_1.ecc });
536
- // P2TR ScriptPath
537
- return {
538
- type,
539
- pubkeys: p2trNs.pubkeys,
540
- signatures: p2trNs.pubkeys.map(() => undefined),
541
- maxSignatures: p2trNs.pubkeys.length,
542
- };
543
- }
544
- case SCRIPT_TYPES.P2PK: {
545
- const p2pk = _4.payments.p2pk({ output: script });
546
- return {
547
- type,
548
- pubkeys: [p2pk.pubkey],
549
- signatures: [undefined],
550
- };
551
- }
552
- case SCRIPT_TYPES.P2MS: {
553
- const p2ms = _4.payments.p2ms({ output: script });
554
- return {
555
- type,
556
- pubkeys: p2ms.pubkeys,
557
- signatures: p2ms.pubkeys.map(() => undefined),
558
- maxSignatures: p2ms.m,
559
- };
560
- }
561
- }
562
- return { type };
563
- }
564
- function prepareInput(input, ourPubKey, redeemScript, witnessScript, controlBlock, annex) {
565
- if (redeemScript && witnessScript) {
566
- const p2wsh = _4.payments.p2wsh({
567
- redeem: { output: witnessScript },
568
- });
569
- const p2wshAlt = _4.payments.p2wsh({ output: redeemScript });
570
- const p2sh = _4.payments.p2sh({ redeem: { output: redeemScript } });
571
- const p2shAlt = _4.payments.p2sh({ redeem: p2wsh });
572
- // enforces P2SH(P2WSH(...))
573
- if (!p2wsh.hash.equals(p2wshAlt.hash))
574
- throw new Error('Witness script inconsistent with prevOutScript');
575
- if (!p2sh.hash.equals(p2shAlt.hash))
576
- throw new Error('Redeem script inconsistent with prevOutScript');
577
- const expanded = expandOutput(p2wsh.redeem.output, ourPubKey);
578
- if (!expanded.pubkeys) {
579
- throw new Error(expanded.type + ' not supported as witnessScript (' + _5.script.toASM(witnessScript) + ')');
580
- }
581
- if (input.signatures && input.signatures.some((x) => x !== undefined)) {
582
- expanded.signatures = input.signatures;
583
- }
584
- const signScript = witnessScript;
585
- if (expanded.type === SCRIPT_TYPES.P2WPKH)
586
- throw new Error('P2SH(P2WSH(P2WPKH)) is a consensus failure');
587
- return {
588
- redeemScript,
589
- redeemScriptType: SCRIPT_TYPES.P2WSH,
590
- witnessScript,
591
- witnessScriptType: expanded.type,
592
- prevOutType: SCRIPT_TYPES.P2SH,
593
- prevOutScript: p2sh.output,
594
- witnessVersion: 0,
595
- signScript,
596
- signType: expanded.type,
597
- pubkeys: expanded.pubkeys,
598
- signatures: expanded.signatures,
599
- maxSignatures: expanded.maxSignatures,
600
- };
601
- }
602
- if (redeemScript) {
603
- const p2sh = _4.payments.p2sh({ redeem: { output: redeemScript } });
604
- if (input.prevOutScript) {
605
- let p2shAlt;
606
- try {
607
- p2shAlt = _4.payments.p2sh({ output: input.prevOutScript });
608
- }
609
- catch (e) {
610
- throw new Error('PrevOutScript must be P2SH');
611
- }
612
- if (!p2sh.hash.equals(p2shAlt.hash))
613
- throw new Error('Redeem script inconsistent with prevOutScript');
614
- }
615
- const expanded = expandOutput(p2sh.redeem.output, ourPubKey);
616
- if (!expanded.pubkeys) {
617
- throw new Error(expanded.type + ' not supported as redeemScript (' + _5.script.toASM(redeemScript) + ')');
618
- }
619
- if (input.signatures && input.signatures.some((x) => x !== undefined)) {
620
- expanded.signatures = input.signatures;
621
- }
622
- let signScript = redeemScript;
623
- if (expanded.type === SCRIPT_TYPES.P2WPKH) {
624
- signScript = _4.payments.p2pkh({ pubkey: expanded.pubkeys[0] }).output;
625
- }
626
- return {
627
- redeemScript,
628
- redeemScriptType: expanded.type,
629
- prevOutType: SCRIPT_TYPES.P2SH,
630
- prevOutScript: p2sh.output,
631
- witnessVersion: expanded.type === SCRIPT_TYPES.P2WPKH ? 0 : undefined,
632
- signScript,
633
- signType: expanded.type,
634
- pubkeys: expanded.pubkeys,
635
- signatures: expanded.signatures,
636
- maxSignatures: expanded.maxSignatures,
637
- };
638
- }
639
- if (witnessScript && controlBlock) {
640
- // P2TR ScriptPath
641
- /* tslint:disable-next-line:no-shadowed-variable */
642
- let prevOutScript = input.prevOutScript;
643
- if (!prevOutScript) {
644
- prevOutScript = _1.p2trPayments.p2tr({
645
- redeems: [{ output: witnessScript }],
646
- redeemIndex: 0,
647
- controlBlock,
648
- annex,
649
- }, { eccLib: noble_ecc_1.ecc }).output;
650
- }
651
- const expanded = expandOutput(witnessScript, ourPubKey);
652
- if (!expanded.pubkeys) {
653
- throw new Error(expanded.type + ' not supported as witnessScript (' + _5.script.toASM(witnessScript) + ')');
654
- }
655
- if (input.signatures && input.signatures.some((x) => x !== undefined)) {
656
- expanded.signatures = input.signatures;
657
- }
658
- return {
659
- witnessScript,
660
- witnessScriptType: expanded.type,
661
- prevOutType: SCRIPT_TYPES.P2TR,
662
- prevOutScript,
663
- witnessVersion: 1,
664
- signScript: witnessScript,
665
- signType: expanded.type,
666
- pubkeys: expanded.pubkeys,
667
- signatures: expanded.signatures,
668
- maxSignatures: expanded.maxSignatures,
669
- controlBlock,
670
- annex,
671
- };
672
- }
673
- if (witnessScript) {
674
- const p2wsh = _4.payments.p2wsh({ redeem: { output: witnessScript } });
675
- if (input.prevOutScript) {
676
- const p2wshAlt = _4.payments.p2wsh({ output: input.prevOutScript });
677
- if (!p2wsh.hash.equals(p2wshAlt.hash))
678
- throw new Error('Witness script inconsistent with prevOutScript');
679
- }
680
- const expanded = expandOutput(p2wsh.redeem.output, ourPubKey);
681
- if (!expanded.pubkeys) {
682
- throw new Error(expanded.type + ' not supported as witnessScript (' + _5.script.toASM(witnessScript) + ')');
683
- }
684
- if (input.signatures && input.signatures.some((x) => x !== undefined)) {
685
- expanded.signatures = input.signatures;
686
- }
687
- const signScript = witnessScript;
688
- if (expanded.type === SCRIPT_TYPES.P2WPKH)
689
- throw new Error('P2WSH(P2WPKH) is a consensus failure');
690
- return {
691
- witnessScript,
692
- witnessScriptType: expanded.type,
693
- prevOutType: SCRIPT_TYPES.P2WSH,
694
- prevOutScript: p2wsh.output,
695
- witnessVersion: 0,
696
- signScript,
697
- signType: expanded.type,
698
- pubkeys: expanded.pubkeys,
699
- signatures: expanded.signatures,
700
- maxSignatures: expanded.maxSignatures,
701
- };
702
- }
703
- if (input.prevOutType && input.prevOutScript) {
704
- // embedded scripts are not possible without extra information
705
- if (input.prevOutType === SCRIPT_TYPES.P2SH) {
706
- throw new Error('PrevOutScript is ' + input.prevOutType + ', requires redeemScript');
707
- }
708
- if (input.prevOutType === SCRIPT_TYPES.P2WSH) {
709
- throw new Error('PrevOutScript is ' + input.prevOutType + ', requires witnessScript');
710
- }
711
- const expanded = expandOutput(input.prevOutScript, ourPubKey);
712
- if (!expanded.pubkeys) {
713
- throw new Error(expanded.type + ' not supported (' + _5.script.toASM(input.prevOutScript) + ')');
714
- }
715
- if (input.signatures && input.signatures.some((x) => x !== undefined)) {
716
- expanded.signatures = input.signatures;
717
- }
718
- let signScript = input.prevOutScript;
719
- if (expanded.type === SCRIPT_TYPES.P2WPKH) {
720
- signScript = _4.payments.p2pkh({ pubkey: expanded.pubkeys[0] }).output;
721
- }
722
- let witnessVersion;
723
- if (expanded.type === SCRIPT_TYPES.P2WPKH) {
724
- witnessVersion = 0;
725
- }
726
- else if (expanded.type === SCRIPT_TYPES.P2TR) {
727
- witnessVersion = 1;
728
- }
729
- return {
730
- prevOutType: expanded.type,
731
- prevOutScript: input.prevOutScript,
732
- witnessVersion,
733
- signScript,
734
- signType: expanded.type,
735
- pubkeys: expanded.pubkeys,
736
- signatures: expanded.signatures,
737
- maxSignatures: expanded.maxSignatures,
738
- };
739
- }
740
- const prevOutScript = _4.payments.p2pkh({ pubkey: ourPubKey }).output;
741
- return {
742
- prevOutType: SCRIPT_TYPES.P2PKH,
743
- prevOutScript,
744
- signScript: prevOutScript,
745
- signType: SCRIPT_TYPES.P2PKH,
746
- pubkeys: [ourPubKey],
747
- signatures: [undefined],
748
- };
749
- }
750
- function build(type, input, allowIncomplete) {
751
- const pubkeys = (input.pubkeys || []);
752
- let signatures = (input.signatures || []);
753
- switch (type) {
754
- case SCRIPT_TYPES.P2PKH: {
755
- if (pubkeys.length === 0)
756
- break;
757
- if (signatures.length === 0)
758
- break;
759
- return _4.payments.p2pkh({ pubkey: pubkeys[0], signature: signatures[0] });
760
- }
761
- case SCRIPT_TYPES.P2WPKH: {
762
- if (pubkeys.length === 0)
763
- break;
764
- if (signatures.length === 0)
765
- break;
766
- return _4.payments.p2wpkh({ pubkey: pubkeys[0], signature: signatures[0] });
767
- }
768
- case SCRIPT_TYPES.P2PK: {
769
- if (pubkeys.length === 0)
770
- break;
771
- if (signatures.length === 0)
772
- break;
773
- return _4.payments.p2pk({ signature: signatures[0] });
774
- }
775
- case SCRIPT_TYPES.P2MS: {
776
- const m = input.maxSignatures;
777
- if (allowIncomplete) {
778
- signatures = signatures.map((x) => x || _6.opcodes.OP_0);
779
- }
780
- else {
781
- signatures = signatures.filter((x) => x);
782
- }
783
- // if the transaction is not not complete (complete), or if signatures.length === m, validate
784
- // otherwise, the number of OP_0's may be >= m, so don't validate (boo)
785
- const validate = !allowIncomplete || m === signatures.length;
786
- return _4.payments.p2ms({ m, pubkeys, signatures }, { allowIncomplete, validate });
787
- }
788
- case SCRIPT_TYPES.P2SH: {
789
- const redeem = build(input.redeemScriptType, input, allowIncomplete);
790
- if (!redeem)
791
- return;
792
- return _4.payments.p2sh({
793
- redeem: {
794
- output: redeem.output || input.redeemScript,
795
- input: redeem.input,
796
- witness: redeem.witness,
797
- },
798
- });
799
- }
800
- case SCRIPT_TYPES.P2WSH: {
801
- const redeem = build(input.witnessScriptType, input, allowIncomplete);
802
- if (!redeem)
803
- return;
804
- return _4.payments.p2wsh({
805
- redeem: {
806
- output: input.witnessScript,
807
- input: redeem.input,
808
- witness: redeem.witness,
809
- },
810
- });
811
- }
812
- case SCRIPT_TYPES.P2TR: {
813
- if (input.witnessScriptType === SCRIPT_TYPES.P2TR_NS) {
814
- // ScriptPath
815
- const redeem = build(input.witnessScriptType, input, allowIncomplete);
816
- return _1.p2trPayments.p2tr({
817
- output: input.prevOutScript,
818
- controlBlock: input.controlBlock,
819
- annex: input.annex,
820
- redeems: [redeem],
821
- redeemIndex: 0,
822
- }, { eccLib: noble_ecc_1.ecc });
823
- }
824
- // KeyPath
825
- if (signatures.length === 0)
826
- break;
827
- return _1.p2trPayments.p2tr({ pubkeys, signature: signatures[0] }, { eccLib: noble_ecc_1.ecc });
828
- }
829
- case SCRIPT_TYPES.P2TR_NS: {
830
- const m = input.maxSignatures;
831
- if (allowIncomplete) {
832
- signatures = signatures.map((x) => x || _6.opcodes.OP_0);
833
- }
834
- else {
835
- signatures = signatures.filter((x) => x);
836
- }
837
- // if the transaction is not not complete (complete), or if signatures.length === m, validate
838
- // otherwise, the number of OP_0's may be >= m, so don't validate (boo)
839
- const validate = !allowIncomplete || m === signatures.length;
840
- return _1.p2trPayments.p2tr_ns({ pubkeys, signatures }, { allowIncomplete, validate, eccLib: noble_ecc_1.ecc });
841
- }
842
- }
843
- }
844
- function canSign(input) {
845
- return (input.signScript !== undefined &&
846
- input.signType !== undefined &&
847
- input.pubkeys !== undefined &&
848
- input.signatures !== undefined &&
849
- input.signatures.length === input.pubkeys.length &&
850
- input.pubkeys.length > 0 &&
851
- (input.witnessVersion === undefined || input.value !== undefined));
852
- }
853
- function signatureHashType(buffer) {
854
- if (_5.script.isCanonicalSchnorrSignature(buffer) && buffer.length === 64) {
855
- return _8.Transaction.SIGHASH_DEFAULT;
856
- }
857
- return buffer.readUInt8(buffer.length - 1);
858
- }
859
- function checkSignArgs(inputs, signParams) {
860
- if (!PREVOUT_TYPES.has(signParams.prevOutScriptType)) {
861
- throw new TypeError(`Unknown prevOutScriptType "${signParams.prevOutScriptType}"`);
862
- }
863
- tfMessage(typeforce.Number, signParams.vin, `sign must include vin parameter as Number (input index)`);
864
- tfMessage(tfFullSigner, signParams.keyPair, `sign must include keyPair parameter as Signer interface`);
865
- tfMessage(typeforce.maybe(typeforce.Number), signParams.hashType, `sign hashType parameter must be a number`);
866
- const prevOutType = (inputs[signParams.vin] || []).prevOutType;
867
- const posType = signParams.prevOutScriptType;
868
- switch (posType) {
869
- case 'p2pkh':
870
- if (prevOutType && prevOutType !== 'pubkeyhash') {
871
- throw new TypeError(`input #${signParams.vin} is not of type p2pkh: ${prevOutType}`);
872
- }
873
- tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
874
- tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
875
- tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
876
- break;
877
- case 'p2pk':
878
- if (prevOutType && prevOutType !== 'pubkey') {
879
- throw new TypeError(`input #${signParams.vin} is not of type p2pk: ${prevOutType}`);
880
- }
881
- tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
882
- tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
883
- tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
884
- break;
885
- case 'p2wpkh':
886
- if (prevOutType && prevOutType !== 'witnesspubkeyhash') {
887
- throw new TypeError(`input #${signParams.vin} is not of type p2wpkh: ${prevOutType}`);
888
- }
889
- tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
890
- tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
891
- tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessValue`);
892
- break;
893
- case 'p2ms':
894
- if (prevOutType && prevOutType !== 'multisig') {
895
- throw new TypeError(`input #${signParams.vin} is not of type p2ms: ${prevOutType}`);
896
- }
897
- tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
898
- tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
899
- tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
900
- break;
901
- case 'p2sh-p2wpkh':
902
- if (prevOutType && prevOutType !== 'scripthash') {
903
- throw new TypeError(`input #${signParams.vin} is not of type p2sh-p2wpkh: ${prevOutType}`);
904
- }
905
- tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
906
- tfMessage(typeforce.Buffer, signParams.redeemScript, `${posType} requires redeemScript`);
907
- tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessValue`);
908
- break;
909
- case 'p2sh-p2ms':
910
- case 'p2sh-p2pk':
911
- case 'p2sh-p2pkh':
912
- if (prevOutType && prevOutType !== 'scripthash') {
913
- throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
914
- }
915
- tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
916
- tfMessage(typeforce.Buffer, signParams.redeemScript, `${posType} requires redeemScript`);
917
- tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
918
- break;
919
- case 'p2wsh-p2ms':
920
- case 'p2wsh-p2pk':
921
- case 'p2wsh-p2pkh':
922
- if (prevOutType && prevOutType !== 'witnessscripthash') {
923
- throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
924
- }
925
- tfMessage(typeforce.Buffer, signParams.witnessScript, `${posType} requires witnessScript`);
926
- tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
927
- tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessValue`);
928
- break;
929
- case 'p2sh-p2wsh-p2ms':
930
- case 'p2sh-p2wsh-p2pk':
931
- case 'p2sh-p2wsh-p2pkh':
932
- if (prevOutType && prevOutType !== 'scripthash') {
933
- throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
934
- }
935
- tfMessage(typeforce.Buffer, signParams.witnessScript, `${posType} requires witnessScript`);
936
- tfMessage(typeforce.Buffer, signParams.redeemScript, `${posType} requires witnessScript`);
937
- tfMessage(types.Satoshi, signParams.witnessValue, `${posType} requires witnessScript`);
938
- break;
939
- case 'p2tr':
940
- if (prevOutType && prevOutType !== 'taproot') {
941
- throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
942
- }
943
- tfMessage(typeforce.value(undefined), signParams.witnessScript, `${posType} requires NO witnessScript`);
944
- tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
945
- tfMessage(typeforce.value(undefined), signParams.witnessValue, `${posType} requires NO witnessValue`);
946
- break;
947
- case 'p2tr-p2ns':
948
- if (prevOutType && prevOutType !== 'taproot') {
949
- throw new TypeError(`input #${signParams.vin} is not of type ${posType}: ${prevOutType}`);
950
- }
951
- inputs[signParams.vin].prevOutType = inputs[signParams.vin].prevOutType || 'taproot';
952
- tfMessage(typeforce.Buffer, signParams.witnessScript, `${posType} requires witnessScript`);
953
- tfMessage(typeforce.Buffer, signParams.controlBlock, `${posType} requires controlBlock`);
954
- tfMessage(typeforce.value(undefined), signParams.redeemScript, `${posType} requires NO redeemScript`);
955
- break;
956
- }
957
- }
958
- function trySign({ input, ourPubKey, keyPair, signatureHash, hashType, useLowR, taptreeRoot, }) {
959
- if (input.witnessVersion === 1 && ourPubKey.length === 33)
960
- ourPubKey = ourPubKey.slice(1);
961
- // enforce in order signing of public keys
962
- let signed = false;
963
- for (const [i, pubKey] of input.pubkeys.entries()) {
964
- if (!ourPubKey.equals(pubKey))
965
- continue;
966
- if (input.signatures[i] && input.signatures[i].length > 0)
967
- throw new Error('Signature already exists');
968
- // TODO: add tests
969
- if (ourPubKey.length !== 33 && input.witnessVersion === 0) {
970
- throw new Error('BIP143 (Witness v0) inputs require compressed pubkeys');
971
- }
972
- else if (ourPubKey.length !== 32 && input.witnessVersion === 1) {
973
- throw new Error('BIP341 (Witness v1) inputs require x-only pubkeys');
974
- }
975
- if (input.witnessVersion === 1) {
976
- if (!input.witnessScript) {
977
- // FIXME: Workaround for not having proper tweaking support for key path
978
- if (!keyPair.privateKey) {
979
- throw new Error(`unexpected keypair`);
980
- }
981
- const privateKey = _7.taproot.tapTweakPrivkey(noble_ecc_1.ecc, ourPubKey, keyPair.privateKey, taptreeRoot);
982
- keyPair = noble_ecc_1.ECPair.fromPrivateKey(Buffer.from(privateKey));
983
- }
984
- // https://github.com/bitcoin/bips/blob/master/bip-0341.mediawiki#common-signature-message
985
- const signature = keyPair.signSchnorr(signatureHash);
986
- // SIGHASH_DEFAULT is omitted from the signature
987
- if (hashType === _8.Transaction.SIGHASH_DEFAULT) {
988
- input.signatures[i] = Buffer.from(signature);
989
- }
990
- else {
991
- input.signatures[i] = Buffer.concat([signature, Buffer.of(hashType)]);
992
- }
993
- }
994
- else {
995
- const signature = keyPair.sign(signatureHash, useLowR);
996
- input.signatures[i] = _5.script.signature.encode(signature, hashType);
997
- }
998
- signed = true;
999
- }
1000
- if (!signed)
1001
- throw new Error('Key pair cannot sign for this input');
1002
- }
1003
- function getSigningData(network, inputs, needsOutputs, tx, signParams, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex, useLowR) {
1004
- let vin;
1005
- if (typeof signParams === 'number') {
1006
- console.warn('DEPRECATED: TransactionBuilder sign method arguments ' + 'will change in v6, please use the TxbSignArg interface');
1007
- vin = signParams;
1008
- }
1009
- else if (typeof signParams === 'object') {
1010
- checkSignArgs(inputs, signParams);
1011
- ({ vin, keyPair, redeemScript, hashType, witnessValue, witnessScript, controlBlock, annex } = signParams);
1012
- }
1013
- else {
1014
- throw new TypeError('TransactionBuilder sign first arg must be TxbSignArg or number');
1015
- }
1016
- if (keyPair === undefined) {
1017
- throw new Error('sign requires keypair');
1018
- }
1019
- if (!inputs[vin])
1020
- throw new Error('No input at index: ' + vin);
1021
- const input = inputs[vin];
1022
- // if redeemScript was previously provided, enforce consistency
1023
- if (input.redeemScript !== undefined && redeemScript && !input.redeemScript.equals(redeemScript)) {
1024
- throw new Error('Inconsistent redeemScript');
1025
- }
1026
- const ourPubKey = keyPair.publicKey || (keyPair.getPublicKey && keyPair.getPublicKey());
1027
- if (!canSign(input)) {
1028
- if (witnessValue !== undefined) {
1029
- if (input.value !== undefined && input.value !== witnessValue) {
1030
- throw new Error('Input did not match witnessValue');
1031
- }
1032
- typeforce(types.Satoshi, witnessValue);
1033
- input.value = witnessValue;
1034
- }
1035
- if (!canSign(input)) {
1036
- const prepared = prepareInput(input, ourPubKey, redeemScript, witnessScript, controlBlock, annex);
1037
- // updates inline
1038
- Object.assign(input, prepared);
1039
- }
1040
- if (!canSign(input))
1041
- throw Error(input.prevOutType + ' not supported');
1042
- }
1043
- // hashType can be 0 in Taproot, so can't use hashType || SIGHASH_ALL
1044
- if (input.witnessVersion === 1) {
1045
- hashType = hashType === undefined ? _8.Transaction.SIGHASH_DEFAULT : hashType;
1046
- }
1047
- else {
1048
- hashType = hashType || _8.Transaction.SIGHASH_ALL;
1049
- }
1050
- if (needsOutputs(hashType))
1051
- throw new Error('Transaction needs outputs');
1052
- // TODO: This is not the best place to do this, but might stick with it until PSBT
1053
- let leafHash;
1054
- let taptreeRoot;
1055
- if (controlBlock && witnessScript) {
1056
- leafHash = _7.taproot.getTapleafHash(noble_ecc_1.ecc, controlBlock, witnessScript);
1057
- taptreeRoot = _7.taproot.getTaptreeRoot(noble_ecc_1.ecc, controlBlock, witnessScript, leafHash);
1058
- }
1059
- // ready to sign
1060
- let signatureHash;
1061
- switch (input.witnessVersion) {
1062
- case undefined:
1063
- signatureHash = tx.hashForSignature(vin, input.signScript, hashType, input.value);
1064
- break;
1065
- case 0:
1066
- signatureHash = tx.hashForWitnessV0(vin, input.signScript, input.value, hashType);
1067
- break;
1068
- case 1:
1069
- signatureHash = tx.hashForWitnessV1(vin, inputs.map(({ prevOutScript }) => prevOutScript), inputs.map(({ value }) => value), hashType, leafHash);
1070
- break;
1071
- default:
1072
- throw new TypeError('Unsupported witness version');
1073
- }
1074
- return {
1075
- input,
1076
- ourPubKey,
1077
- keyPair,
1078
- signatureHash,
1079
- hashType,
1080
- useLowR: !!useLowR,
1081
- taptreeRoot,
1082
- };
1083
- }
1084
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25fYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFuc2FjdGlvbl9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUFpRDtBQUNqRCx5QkFBdUQ7QUFDdkQsNkRBQTZEO0FBQzdELHVDQUF1QztBQUN2Qyx5QkFBdUM7QUFDdkMseUJBQThCO0FBRTlCLHlCQUE4QjtBQUU5Qix5QkFBdUM7QUFDdkMseUJBQW9DO0FBQ3BDLHlCQUE2QjtBQUM3Qix5QkFBMkM7QUFDM0MsMkNBQW9EO0FBVXBELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV2QyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVEsRUFBVyxFQUFFO0lBQ3pDLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxPQUFPLEdBQUcsQ0FBQyxXQUFXLEtBQUssVUFBVSxDQUFDO0FBQ3BILENBQUMsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7QUFFcEMsTUFBTSxhQUFhLEdBQWdCLElBQUksR0FBRyxDQUFDO0lBQ3pDLE1BQU07SUFDTixPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixNQUFNO0lBQ04sZUFBZTtJQUNmLFlBQVk7SUFDWixXQUFXO0lBQ1gsYUFBYTtJQUNiLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLFlBQVk7SUFDWixZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixNQUFNO0lBQ04sa0JBQWtCO0lBQ2xCLFdBQVc7Q0FDWixDQUFDLENBQUM7QUFrREgsU0FBUyxTQUFTLENBQUMsSUFBUyxFQUFFLEtBQVUsRUFBRSxPQUFlO0lBQ3ZE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cnQgKiBhcyB0eXBlcyBmcm9tICdiaXRjb2luanMtbGliL3NyYy90eXBlcyc7XG5pbXBvcnQgeyBhZGRyZXNzIGFzIGJhZGRyZXNzLCBwMnRyUGF5bWVudHMgfSBmcm9tICcuLyc7XG5pbXBvcnQgKiBhcyBidWZmZXJ1dGlscyBmcm9tICdiaXRjb2luanMtbGliL3NyYy9idWZmZXJ1dGlscyc7XG5pbXBvcnQgKiBhcyBjbGFzc2lmeSBmcm9tICcuL2NsYXNzaWZ5JztcbmltcG9ydCB7IGNyeXB0byBhcyBiY3J5cHRvIH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgbmV0d29ya3MgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgcGF5bWVudHMgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBQYXltZW50IH0gZnJvbSAnLi8nO1xuaW1wb3J0IHsgc2NyaXB0IGFzIGJzY3JpcHQgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBvcGNvZGVzIGFzIG9wcyB9IGZyb20gJy4vJztcbmltcG9ydCB7IHRhcHJvb3QgfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBUeE91dHB1dCwgVHJhbnNhY3Rpb24gfSBmcm9tICcuLyc7XG5pbXBvcnQgeyBFQ1BhaXIsIGVjYyBhcyBlY2NMaWIgfSBmcm9tICcuL25vYmxlX2VjYyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmVyIHtcbiAgcHJpdmF0ZUtleT86IEJ1ZmZlcjtcbiAgcHVibGljS2V5OiBCdWZmZXI7XG4gIGdldFB1YmxpY0tleT8oKTogQnVmZmVyO1xuICBzaWduKGhhc2g6IEJ1ZmZlciwgbG93Uj86IGJvb2xlYW4pOiBCdWZmZXI7XG4gIHNpZ25TY2hub3JyKGhhc2g6IEJ1ZmZlcik6IEJ1ZmZlcjtcbn1cblxuY29uc3QgdHlwZWZvcmNlID0gcmVxdWlyZSgndHlwZWZvcmNlJyk7XG5cbmNvbnN0IHRmRnVsbFNpZ25lciA9IChvYmo6IGFueSk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gdHlwZWZvcmNlLkJ1ZmZlcihvYmoucHVibGljS2V5KSAmJiB0eXBlb2Ygb2JqLnNpZ24gPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zaWduU2Nobm9yciA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbmNvbnN0IFNDUklQVF9UWVBFUyA9IGNsYXNzaWZ5LnR5cGVzO1xuXG5jb25zdCBQUkVWT1VUX1RZUEVTOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAvLyBSYXdcbiAgJ3AycGtoJyxcbiAgJ3AycGsnLFxuICAncDJ3cGtoJyxcbiAgJ3AybXMnLFxuICAvLyBQMlNIIHdyYXBwZWRcbiAgJ3Ayc2gtcDJwa2gnLFxuICAncDJzaC1wMnBrJyxcbiAgJ3Ayc2gtcDJ3cGtoJyxcbiAgJ3Ayc2gtcDJtcycsXG4gIC8vIFAyV1NIIHdyYXBwZWRcbiAgJ3Ayd3NoLXAycGtoJyxcbiAgJ3Ayd3NoLXAycGsnLFxuICAncDJ3c2gtcDJtcycsXG4gIC8vIFAyU0gtUDJXU0ggd3JhcHBlclxuICAncDJzaC1wMndzaC1wMnBraCcsXG4gICdwMnNoLXAyd3NoLXAycGsnLFxuICAncDJzaC1wMndzaC1wMm1zJyxcbiAgLy8gUDJUUiBLZXlQYXRoXG4gICdwMnRyJyxcbiAgLy8gUDJUUiBTY3JpcHRQYXRoXG4gICdwMnRyLXAybnMnLFxuXSk7XG5cbnR5cGUgTWF5YmVCdWZmZXIgPSBCdWZmZXIgfCB1bmRlZmluZWQ7XG50eXBlIFR4YlNpZ25hdHVyZXMgPSBCdWZmZXJbXSB8IE1heWJlQnVmZmVyW107XG50eXBlIFR4YlB1YmtleXMgPSBNYXliZUJ1ZmZlcltdO1xudHlwZSBUeGJXaXRuZXNzID0gQnVmZmVyW107XG50eXBlIFR4YlNjcmlwdFR5cGUgPSBzdHJpbmc7XG50eXBlIFR4YlNjcmlwdCA9IEJ1ZmZlcjtcblxuaW50ZXJmYWNlIFR4YklucHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdmFsdWU/OiBUTnVtYmVyO1xuICB3aXRuZXNzVmVyc2lvbj86IG51bWJlcjtcbiAgc2lnblNjcmlwdD86IFR4YlNjcmlwdDtcbiAgc2lnblR5cGU/OiBUeGJTY3JpcHRUeXBlO1xuICBwcmV2T3V0U2NyaXB0PzogVHhiU2NyaXB0O1xuICByZWRlZW1TY3JpcHQ/OiBUeGJTY3JpcHQ7XG4gIHJlZGVlbVNjcmlwdFR5cGU/OiBUeGJTY3JpcHRUeXBlO1xuICBwcmV2T3V0VHlwZT86IFR4YlNjcmlwdFR5cGU7XG4gIHB1YmtleXM/OiBUeGJQdWJrZXlzO1xuICBzaWduYXR1cmVzPzogVHhiU2lnbmF0dXJlcztcbiAgd2l0bmVzcz86IFR4YldpdG5lc3M7XG4gIHdpdG5lc3NTY3JpcHQ/OiBUeGJTY3JpcHQ7XG4gIHdpdG5lc3NTY3JpcHRUeXBlPzogVHhiU2NyaXB0VHlwZTtcbiAgY29udHJvbEJsb2NrPzogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbiAgc2NyaXB0PzogVHhiU2NyaXB0O1xuICBzZXF1ZW5jZT86IG51bWJlcjtcbiAgc2NyaXB0U2lnPzogVHhiU2NyaXB0O1xuICBtYXhTaWduYXR1cmVzPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgVHhiT3V0cHV0IHtcbiAgdHlwZTogc3RyaW5nO1xuICBwdWJrZXlzPzogVHhiUHVia2V5cztcbiAgc2lnbmF0dXJlcz86IFR4YlNpZ25hdHVyZXM7XG4gIG1heFNpZ25hdHVyZXM/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBUeGJTaWduQXJnPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgcHJldk91dFNjcmlwdFR5cGU6IHN0cmluZztcbiAgdmluOiBudW1iZXI7XG4gIGtleVBhaXI6IFNpZ25lcjtcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyO1xuICBoYXNoVHlwZT86IG51bWJlcjtcbiAgd2l0bmVzc1ZhbHVlPzogVE51bWJlcjtcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcjtcbiAgY29udHJvbEJsb2NrPzogQnVmZmVyO1xuICBhbm5leD86IEJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdGZNZXNzYWdlKHR5cGU6IGFueSwgdmFsdWU6IGFueSwgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgdHlwZWZvcmNlKHR5cGUsIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHR4SXNTdHJpbmc8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIHR4OiBCdWZmZXIgfCBzdHJpbmcgfCBUcmFuc2FjdGlvbjxUTnVtYmVyPlxuKTogdHggaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB0eCA9PT0gJ3N0cmluZycgfHwgdHggaW5zdGFuY2VvZiBTdHJpbmc7XG59XG5cbmZ1bmN0aW9uIHR4SXNUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgdHg6IEJ1ZmZlciB8IHN0cmluZyB8IFRyYW5zYWN0aW9uPFROdW1iZXI+XG4pOiB0eCBpcyBUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gIHJldHVybiB0eCBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uO1xufVxuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgc3RhdGljIGZyb21UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb248VE51bWJlcj4sXG4gICAgbmV0d29yaz86IE5ldHdvcmssXG4gICAgcHJldk91dHB1dHM/OiBUeE91dHB1dDxUTnVtYmVyPltdXG4gICk6IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPiB7XG4gICAgY29uc3QgdHhiID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcjxUTnVtYmVyPihuZXR3b3JrKTtcblxuICAgIC8vIENvcHkgdHJhbnNhY3Rpb24gZmllbGRzXG4gICAgdHhiLnNldFZlcnNpb24odHJhbnNhY3Rpb24udmVyc2lvbik7XG4gICAgdHhiLnNldExvY2tUaW1lKHRyYW5zYWN0aW9uLmxvY2t0aW1lKTtcblxuICAgIC8vIENvcHkgb3V0cHV0cyAoZG9uZSBmaXJzdCB0byBhdm9pZCBzaWduYXR1cmUgaW52YWxpZGF0aW9uKVxuICAgIHRyYW5zYWN0aW9uLm91dHMuZm9yRWFjaCgodHhPdXQpID0+IHtcbiAgICAgIHR4Yi5hZGRPdXRwdXQodHhPdXQuc2NyaXB0LCAodHhPdXQgYXMgVHhPdXRwdXQ8VE51bWJlcj4pLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIENvcHkgaW5wdXRzXG4gICAgdHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKHR4SW4pID0+IHtcbiAgICAgIHR4Yi5fX2FkZElucHV0VW5zYWZlKHR4SW4uaGFzaCwgdHhJbi5pbmRleCwge1xuICAgICAgICBzZXF1ZW5jZTogdHhJbi5zZXF1ZW5jZSxcbiAgICAgICAgc2NyaXB0OiB0eEluLnNjcmlwdCxcbiAgICAgICAgd2l0bmVzczogdHhJbi53aXRuZXNzLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBmaXggc29tZSB0aGluZ3Mgbm90IHBvc3NpYmxlIHRocm91Z2ggdGhlIHB1YmxpYyBBUElcbiAgICB0eGIuX19JTlBVVFMuZm9yRWFjaCgoaW5wdXQsIGkpID0+IHtcbiAgICAgIGZpeE11bHRpc2lnT3JkZXI8VE51bWJlcj4oaW5wdXQsIHRyYW5zYWN0aW9uLCBpLCBwcmV2T3V0cHV0cyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHhiO1xuICB9XG5cbiAgcHJpdmF0ZSBfX1BSRVZfVFhfU0VUOiB7IFtpbmRleDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICBwcml2YXRlIF9fSU5QVVRTOiBBcnJheTxUeGJJbnB1dDxUTnVtYmVyPj47XG4gIHByaXZhdGUgX19UWDogVHJhbnNhY3Rpb248VE51bWJlcj47XG4gIHByaXZhdGUgX19VU0VfTE9XX1I6IGJvb2xlYW47XG5cbiAgLy8gV0FSTklORzogbWF4aW11bUZlZVJhdGUgaXMgX19OT1RfXyB0byBiZSByZWxpZWQgb24sXG4gIC8vICAgICAgICAgIGl0J3MganVzdCBhbm90aGVyIHBvdGVudGlhbCBzYWZldHkgbWVjaGFuaXNtIChzYWZldHkgaW4tZGVwdGgpXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuZXR3b3JrOiBOZXR3b3JrID0gbmV0d29ya3MuYml0Y29pbiwgcHVibGljIG1heGltdW1GZWVSYXRlOiBudW1iZXIgPSAyNTAwKSB7XG4gICAgdGhpcy5fX1BSRVZfVFhfU0VUID0ge307XG4gICAgdGhpcy5fX0lOUFVUUyA9IFtdO1xuICAgIHRoaXMuX19UWCA9IG5ldyBUcmFuc2FjdGlvbjxUTnVtYmVyPigpO1xuICAgIHRoaXMuX19UWC52ZXJzaW9uID0gMjtcbiAgICB0aGlzLl9fVVNFX0xPV19SID0gZmFsc2U7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RlcHJlY2F0aW9uIFdhcm5pbmc6IFRyYW5zYWN0aW9uQnVpbGRlciB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gJyArXG4gICAgICAgICcodjYueC54IG9yIGxhdGVyKSBQbGVhc2UgdXNlIHRoZSBQc2J0IGNsYXNzIGluc3RlYWQuIEV4YW1wbGVzIG9mIHVzYWdlICcgK1xuICAgICAgICAnYXJlIGF2YWlsYWJsZSBpbiB0aGUgdHJhbnNhY3Rpb25zLXBzYnQuanMgaW50ZWdyYXRpb24gdGVzdCBmaWxlIG9uIG91ciAnICtcbiAgICAgICAgJ0dpdGh1Yi4gQSBoaWdoIGxldmVsIGV4cGxhbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHNidC50cyBhbmQgcHNidC5qcyAnICtcbiAgICAgICAgJ2ZpbGVzIGFzIHdlbGwuJ1xuICAgICk7XG4gIH1cblxuICBzZXRMb3dSKHNldHRpbmc/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgdHlwZWZvcmNlKHR5cGVmb3JjZS5tYXliZSh0eXBlZm9yY2UuQm9vbGVhbiksIHNldHRpbmcpO1xuICAgIGlmIChzZXR0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNldHRpbmcgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl9fVVNFX0xPV19SID0gc2V0dGluZztcbiAgICByZXR1cm4gc2V0dGluZztcbiAgfVxuXG4gIHNldExvY2tUaW1lKGxvY2t0aW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0eXBlZm9yY2UodHlwZXMuVUludDMyLCBsb2NrdGltZSk7XG5cbiAgICAvLyBpZiBhbnkgc2lnbmF0dXJlcyBleGlzdCwgdGhyb3dcbiAgICBpZiAoXG4gICAgICB0aGlzLl9fSU5QVVRTLnNvbWUoKGlucHV0KSA9PiB7XG4gICAgICAgIGlmICghaW5wdXQuc2lnbmF0dXJlcykgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHMpID0+IHMgIT09IHVuZGVmaW5lZCk7XG4gICAgICB9KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObywgdGhpcyB3b3VsZCBpbnZhbGlkYXRlIHNpZ25hdHVyZXMnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9fVFgubG9ja3RpbWUgPSBsb2NrdGltZTtcbiAgfVxuXG4gIHNldFZlcnNpb24odmVyc2lvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgdHlwZWZvcmNlKHR5cGVzLlVJbnQzMiwgdmVyc2lvbik7XG5cbiAgICAvLyBYWFg6IHRoaXMgbWlnaHQgZXZlbnR1YWxseSBiZWNvbWUgbW9yZSBjb21wbGV4IGRlcGVuZGluZyBvbiB3aGF0IHRoZSB2ZXJzaW9ucyByZXByZXNlbnRcbiAgICB0aGlzLl9fVFgudmVyc2lvbiA9IHZlcnNpb247XG4gIH1cblxuICBhZGRJbnB1dChcbiAgICB0eEhhc2g6IEJ1ZmZlciB8IHN0cmluZyB8IFRyYW5zYWN0aW9uPFROdW1iZXI+LFxuICAgIHZvdXQ6IG51bWJlcixcbiAgICBzZXF1ZW5jZT86IG51bWJlcixcbiAgICBwcmV2T3V0U2NyaXB0PzogQnVmZmVyLFxuICAgIHZhbHVlPzogVE51bWJlclxuICApOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fX2Nhbk1vZGlmeUlucHV0cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vLCB0aGlzIHdvdWxkIGludmFsaWRhdGUgc2lnbmF0dXJlcycpO1xuICAgIH1cblxuICAgIC8vIGlzIGl0IGEgaGV4IHN0cmluZz9cbiAgICBpZiAodHhJc1N0cmluZyh0eEhhc2gpKSB7XG4gICAgICAvLyB0cmFuc2FjdGlvbiBoYXNocydzIGFyZSBkaXNwbGF5ZWQgaW4gcmV2ZXJzZSBvcmRlciwgdW4tcmV2ZXJzZSBpdFxuICAgICAgdHhIYXNoID0gYnVmZmVydXRpbHMucmV2ZXJzZUJ1ZmZlcihCdWZmZXIuZnJvbSh0eEhhc2gsICdoZXgnKSk7XG5cbiAgICAgIC8vIGlzIGl0IGEgVHJhbnNhY3Rpb24gb2JqZWN0P1xuICAgIH0gZWxzZSBpZiAodHhJc1RyYW5zYWN0aW9uKHR4SGFzaCkpIHtcbiAgICAgIGNvbnN0IHR4T3V0ID0gdHhIYXNoLm91dHNbdm91dF07XG4gICAgICBwcmV2T3V0U2NyaXB0ID0gdHhPdXQuc2NyaXB0O1xuICAgICAgdmFsdWUgPSAodHhPdXQgYXMgVHhPdXRwdXQ8VE51bWJlcj4pLnZhbHVlO1xuXG4gICAgICB0eEhhc2ggPSB0eEhhc2guZ2V0SGFzaChmYWxzZSkgYXMgQnVmZmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fYWRkSW5wdXRVbnNhZmUodHhIYXNoLCB2b3V0LCB7XG4gICAgICBzZXF1ZW5jZSxcbiAgICAgIHByZXZPdXRTY3JpcHQsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFkZE91dHB1dChzY3JpcHRQdWJLZXk6IHN0cmluZyB8IEJ1ZmZlciwgdmFsdWU6IFROdW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5fX2Nhbk1vZGlmeU91dHB1dHMoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObywgdGhpcyB3b3VsZCBpbnZhbGlkYXRlIHNpZ25hdHVyZXMnKTtcbiAgICB9XG5cbiAgICAvLyBBdHRlbXB0IHRvIGdldCBhIHNjcmlwdCBpZiBpdCdzIGEgYmFzZTU4IG9yIGJlY2gzMiBhZGRyZXNzIHN0cmluZ1xuICAgIGlmICh0eXBlb2Ygc2NyaXB0UHViS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgc2NyaXB0UHViS2V5ID0gYmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoc2NyaXB0UHViS2V5LCB0aGlzLm5ldHdvcmspO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9fVFguYWRkT3V0cHV0KHNjcmlwdFB1YktleSwgdmFsdWUpO1xuICB9XG5cbiAgYnVpbGQoKTogVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9fYnVpbGQoZmFsc2UpO1xuICB9XG5cbiAgYnVpbGRJbmNvbXBsZXRlKCk6IFRyYW5zYWN0aW9uPFROdW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5fX2J1aWxkKHRydWUpO1xuICB9XG5cbiAgc2lnbihcbiAgICBzaWduUGFyYW1zOiBudW1iZXIgfCBUeGJTaWduQXJnPFROdW1iZXI+LFxuICAgIGtleVBhaXI/OiBTaWduZXIsXG4gICAgcmVkZWVtU2NyaXB0PzogQnVmZmVyLFxuICAgIGhhc2hUeXBlPzogbnVtYmVyLFxuICAgIHdpdG5lc3NWYWx1ZT86IFROdW1iZXIsXG4gICAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcixcbiAgICBjb250cm9sQmxvY2s/OiBCdWZmZXIsXG4gICAgYW5uZXg/OiBCdWZmZXJcbiAgKTogdm9pZCB7XG4gICAgdHJ5U2lnbjxUTnVtYmVyPihcbiAgICAgIGdldFNpZ25pbmdEYXRhPFROdW1iZXI+KFxuICAgICAgICB0aGlzLm5ldHdvcmssXG4gICAgICAgIHRoaXMuX19JTlBVVFMsXG4gICAgICAgIHRoaXMuX19uZWVkc091dHB1dHMuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5fX1RYLFxuICAgICAgICBzaWduUGFyYW1zLFxuICAgICAgICBrZXlQYWlyLFxuICAgICAgICByZWRlZW1TY3JpcHQsXG4gICAgICAgIGhhc2hUeXBlLFxuICAgICAgICB3aXRuZXNzVmFsdWUsXG4gICAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICAgIGNvbnRyb2xCbG9jayxcbiAgICAgICAgYW5uZXgsXG4gICAgICAgIHRoaXMuX19VU0VfTE9XX1JcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2FkZElucHV0VW5zYWZlKHR4SGFzaDogQnVmZmVyLCB2b3V0OiBudW1iZXIsIG9wdGlvbnM6IFR4YklucHV0PFROdW1iZXI+KTogbnVtYmVyIHtcbiAgICBpZiAoVHJhbnNhY3Rpb24uaXNDb2luYmFzZUhhc2godHhIYXNoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb2luYmFzZSBpbnB1dHMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZUeE91dCA9IHR4SGFzaC50b1N0cmluZygnaGV4JykgKyAnOicgKyB2b3V0O1xuICAgIGlmICh0aGlzLl9fUFJFVl9UWF9TRVRbcHJldlR4T3V0XSAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSBUeE91dDogJyArIHByZXZUeE91dCk7XG5cbiAgICBsZXQgaW5wdXQ6IFR4YklucHV0PFROdW1iZXI+ID0ge307XG5cbiAgICAvLyBkZXJpdmUgd2hhdCB3ZSBjYW4gZnJvbSB0aGUgc2NyaXB0U2lnXG4gICAgaWYgKG9wdGlvbnMuc2NyaXB0ICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy53aXRuZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlucHV0ID0gZXhwYW5kSW5wdXQ8VE51bWJlcj4ob3B0aW9ucy5zY3JpcHQsIG9wdGlvbnMud2l0bmVzcyk7XG4gICAgfVxuXG4gICAgLy8gaWYgYW4gaW5wdXQgdmFsdWUgd2FzIGdpdmVuLCByZXRhaW4gaXRcbiAgICBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnB1dC52YWx1ZSA9IG9wdGlvbnMudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gZGVyaXZlIHdoYXQgd2UgY2FuIGZyb20gdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9ucyBvdXRwdXQgc2NyaXB0XG4gICAgaWYgKCFpbnB1dC5wcmV2T3V0U2NyaXB0ICYmIG9wdGlvbnMucHJldk91dFNjcmlwdCkge1xuICAgICAgbGV0IHByZXZPdXRUeXBlO1xuXG4gICAgICBpZiAoIWlucHV0LnB1YmtleXMgJiYgIWlucHV0LnNpZ25hdHVyZXMpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQob3B0aW9ucy5wcmV2T3V0U2NyaXB0KTtcbiAgICAgICAgaWYgKGV4cGFuZGVkLnB1YmtleXMpIHtcbiAgICAgICAgICBpbnB1dC5wdWJrZXlzID0gZXhwYW5kZWQucHVia2V5cztcbiAgICAgICAgICBpbnB1dC5zaWduYXR1cmVzID0gZXhwYW5kZWQuc2lnbmF0dXJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZPdXRUeXBlID0gZXhwYW5kZWQudHlwZTtcbiAgICAgIH1cblxuICAgICAgaW5wdXQucHJldk91dFNjcmlwdCA9IG9wdGlvbnMucHJldk91dFNjcmlwdDtcbiAgICAgIGlucHV0LnByZXZPdXRUeXBlID0gcHJldk91dFR5cGUgfHwgY2xhc3NpZnkub3V0cHV0KG9wdGlvbnMucHJldk91dFNjcmlwdCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmluID0gdGhpcy5fX1RYLmFkZElucHV0KHR4SGFzaCwgdm91dCwgb3B0aW9ucy5zZXF1ZW5jZSwgb3B0aW9ucy5zY3JpcHRTaWcpO1xuICAgIHRoaXMuX19JTlBVVFNbdmluXSA9IGlucHV0O1xuICAgIHRoaXMuX19QUkVWX1RYX1NFVFtwcmV2VHhPdXRdID0gdHJ1ZTtcbiAgICByZXR1cm4gdmluO1xuICB9XG5cbiAgcHJpdmF0ZSBfX2J1aWxkKGFsbG93SW5jb21wbGV0ZT86IGJvb2xlYW4pOiBUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgaWYgKCFhbGxvd0luY29tcGxldGUpIHtcbiAgICAgIGlmICghdGhpcy5fX1RYLmlucy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vIGlucHV0cycpO1xuICAgICAgaWYgKCF0aGlzLl9fVFgub3V0cy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaGFzIG5vIG91dHB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eCA9IHRoaXMuX19UWC5jbG9uZSgpO1xuXG4gICAgLy8gY3JlYXRlIHNjcmlwdCBzaWduYXR1cmVzIGZyb20gaW5wdXRzXG4gICAgdGhpcy5fX0lOUFVUUy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgICAgaWYgKCFpbnB1dC5wcmV2T3V0VHlwZSAmJiAhYWxsb3dJbmNvbXBsZXRlKSB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIG5vdCBjb21wbGV0ZScpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZDxUTnVtYmVyPihpbnB1dC5wcmV2T3V0VHlwZSEsIGlucHV0LCBhbGxvd0luY29tcGxldGUpO1xuICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgaWYgKCFhbGxvd0luY29tcGxldGUgJiYgaW5wdXQucHJldk91dFR5cGUgPT09IFNDUklQVF9UWVBFUy5OT05TVEFOREFSRCkgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGlucHV0IHR5cGUnKTtcbiAgICAgICAgaWYgKCFhbGxvd0luY29tcGxldGUpIHRocm93IG5ldyBFcnJvcignTm90IGVub3VnaCBpbmZvcm1hdGlvbicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQuaW5wdXQpIHtcbiAgICAgICAgdHguc2V0SW5wdXRTY3JpcHQoaSwgcmVzdWx0LmlucHV0KTtcbiAgICAgIH1cbiAgICAgIHR4LnNldFdpdG5lc3MoaSwgcmVzdWx0LndpdG5lc3MhKTtcbiAgICB9KTtcblxuICAgIGlmICghYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgICAvLyBkbyBub3QgcmVseSBvbiB0aGlzLCBpdHMgbWVyZWx5IGEgbGFzdCByZXNvcnRcbiAgICAgIGlmICh0aGlzLl9fb3Zlck1heGltdW1GZWVzKHR4LnZpcnR1YWxTaXplKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaGFzIGFic3VyZCBmZWVzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgcHJpdmF0ZSBfX2Nhbk1vZGlmeUlucHV0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fX0lOUFVUUy5ldmVyeSgoaW5wdXQpID0+IHtcbiAgICAgIGlmICghaW5wdXQuc2lnbmF0dXJlcykgcmV0dXJuIHRydWU7XG5cbiAgICAgIHJldHVybiBpbnB1dC5zaWduYXR1cmVzLmV2ZXJ5KChzaWduYXR1cmUpID0+IHtcbiAgICAgICAgaWYgKCFzaWduYXR1cmUpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBoYXNoVHlwZSA9IHNpZ25hdHVyZUhhc2hUeXBlKHNpZ25hdHVyZSk7XG5cbiAgICAgICAgLy8gaWYgU0lHSEFTSF9BTllPTkVDQU5QQVkgaXMgc2V0LCBzaWduYXR1cmVzIHdvdWxkIG5vdFxuICAgICAgICAvLyBiZSBpbnZhbGlkYXRlZCBieSBtb3JlIGlucHV0c1xuICAgICAgICByZXR1cm4gKGhhc2hUeXBlICYgVHJhbnNhY3Rpb24uU0lHSEFTSF9BTllPTkVDQU5QQVkpICE9PSAwO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9fbmVlZHNPdXRwdXRzKHNpZ25pbmdIYXNoVHlwZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKHNpZ25pbmdIYXNoVHlwZSA9PT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9BTEwgfHwgc2lnbmluZ0hhc2hUeXBlID09PSBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fVFgub3V0cy5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLy8gaWYgaW5wdXRzIGFyZSBiZWluZyBzaWduZWQgd2l0aCBTSUdIQVNIX05PTkUsIHdlIGRvbid0IHN0cmljdGx5IG5lZWQgb3V0cHV0c1xuICAgIC8vIC5idWlsZCgpIHdpbGwgZmFpbCwgYnV0IC5idWlsZEluY29tcGxldGUoKSBpcyBPS1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9fVFgub3V0cy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHRoaXMuX19JTlBVVFMuc29tZSgoaW5wdXQpID0+IHtcbiAgICAgICAgaWYgKCFpbnB1dC5zaWduYXR1cmVzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIGlucHV0LnNpZ25hdHVyZXMuc29tZSgoc2lnbmF0dXJlKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaWduYXR1cmUpIHJldHVybiBmYWxzZTsgLy8gbm8gc2lnbmF0dXJlLCBubyBpc3N1ZVxuICAgICAgICAgIGNvbnN0IGhhc2hUeXBlID0gc2lnbmF0dXJlSGFzaFR5cGUoc2lnbmF0dXJlKTtcbiAgICAgICAgICBpZiAoaGFzaFR5cGUgJiBUcmFuc2FjdGlvbi5TSUdIQVNIX05PTkUpIHJldHVybiBmYWxzZTsgLy8gU0lHSEFTSF9OT05FIGRvZXNuJ3QgY2FyZSBhYm91dCBvdXRwdXRzXG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFNJR0hBU0hfKiBkb2VzIGNhcmVcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9fY2FuTW9kaWZ5T3V0cHV0cygpOiBib29sZWFuIHtcbiAgICBjb25zdCBuSW5wdXRzID0gdGhpcy5fX1RYLmlucy5sZW5ndGg7XG4gICAgY29uc3Qgbk91dHB1dHMgPSB0aGlzLl9fVFgub3V0cy5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5fX0lOUFVUUy5ldmVyeSgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC5zaWduYXR1cmVzID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuXG4gICAgICByZXR1cm4gaW5wdXQuc2lnbmF0dXJlcy5ldmVyeSgoc2lnbmF0dXJlKSA9PiB7XG4gICAgICAgIGlmICghc2lnbmF0dXJlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgaGFzaFR5cGUgPSBzaWduYXR1cmVIYXNoVHlwZShzaWduYXR1cmUpO1xuXG4gICAgICAgIGNvbnN0IGhhc2hUeXBlTW9kID0gaGFzaFR5cGUgJiAweDFmO1xuICAgICAgICBpZiAoaGFzaFR5cGVNb2QgPT09IFRyYW5zYWN0aW9uLlNJR0hBU0hfTk9ORSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChoYXNoVHlwZU1vZCA9PT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9TSU5HTEUpIHtcbiAgICAgICAgICAvLyBpZiBTSUdIQVNIX1NJTkdMRSBpcyBzZXQsIGFuZCBuSW5wdXRzID4gbk91dHB1dHNcbiAgICAgICAgICAvLyBzb21lIHNpZ25hdHVyZXMgd291bGQgYmUgaW52YWxpZGF0ZWQgYnkgdGhlIGFkZGl0aW9uXG4gICAgICAgICAgLy8gb2YgbW9yZSBvdXRwdXRzXG4gICAgICAgICAgcmV0dXJuIG5JbnB1dHMgPD0gbk91dHB1dHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9fb3Zlck1heGltdW1GZWVzKGJ5dGVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAvLyBub3QgYWxsIGlucHV0cyB3aWxsIGhhdmUgLnZhbHVlIGRlZmluZWRcbiAgICBjb25zdCBpbmNvbWluZyA9IHRoaXMuX19JTlBVVFMucmVkdWNlKFxuICAgICAgKGEsIHgpID0+IGEgKyAodHlwZW9mIHgudmFsdWUgIT09ICd1bmRlZmluZWQnID8gQmlnSW50KHgudmFsdWUpIDogQmlnSW50KDApKSxcbiAgICAgIEJpZ0ludCgwKVxuICAgICk7XG5cbiAgICAvLyBidXQgYWxsIG91dHB1dHMgZG8sIGFuZCBpZiB3ZSBoYXZlIGFueSBpbnB1dCB2YWx1ZVxuICAgIC8vIHdlIGNhbiBpbW1lZGlhdGVseSBkZXRlcm1pbmUgaWYgdGhlIG91dHB1dHMgYXJlIHRvbyBzbWFsbFxuICAgIGNvbnN0IG91dGdvaW5nID0gdGhpcy5fX1RYLm91dHMucmVkdWNlKChhLCB4KSA9PiBhICsgQmlnSW50KCh4IGFzIFR4T3V0cHV0PFROdW1iZXI+KS52YWx1ZSksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgZmVlID0gaW5jb21pbmcgLSBvdXRnb2luZztcbiAgICBjb25zdCBmZWVSYXRlID0gTnVtYmVyKGZlZSkgLyBieXRlczsgLy8gYXNzdW1lIGZlZSBmaXRzIHdpdGhpbiBudW1iZXJcblxuICAgIHJldHVybiBmZWVSYXRlID4gdGhpcy5tYXhpbXVtRmVlUmF0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHBhbmRJbnB1dDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgc2NyaXB0U2lnPzogQnVmZmVyLFxuICB3aXRuZXNzU3RhY2s6IEJ1ZmZlcltdID0gW10sXG4gIHR5cGU/OiBzdHJpbmcsXG4gIHNjcmlwdFB1YktleT86IEJ1ZmZlclxuKTogVHhiSW5wdXQ8VE51bWJlcj4ge1xuICBpZiAoc2NyaXB0U2lnICYmIHNjcmlwdFNpZy5sZW5ndGggPT09IDAgJiYgd2l0bmVzc1N0YWNrLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuICBpZiAoIXR5cGUpIHtcbiAgICBsZXQgc3NUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBzY3JpcHRTaWcgPyBjbGFzc2lmeS5pbnB1dChzY3JpcHRTaWcsIHRydWUpIDogdW5kZWZpbmVkO1xuICAgIGxldCB3c1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGNsYXNzaWZ5LndpdG5lc3Mod2l0bmVzc1N0YWNrLCB0cnVlKTtcbiAgICBpZiAoc3NUeXBlID09PSBTQ1JJUFRfVFlQRVMuTk9OU1RBTkRBUkQpIHNzVHlwZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAod3NUeXBlID09PSBTQ1JJUFRfVFlQRVMuTk9OU1RBTkRBUkQpIHdzVHlwZSA9IHVuZGVmaW5lZDtcbiAgICB0eXBlID0gc3NUeXBlIHx8IHdzVHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyV1BLSDoge1xuICAgICAgY29uc3QgeyBvdXRwdXQsIHB1YmtleSwgc2lnbmF0dXJlIH0gPSBwYXltZW50cy5wMndwa2goe1xuICAgICAgICB3aXRuZXNzOiB3aXRuZXNzU3RhY2ssXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJldk91dFNjcmlwdDogb3V0cHV0LFxuICAgICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyV1BLSCxcbiAgICAgICAgcHVia2V5czogW3B1YmtleV0sXG4gICAgICAgIHNpZ25hdHVyZXM6IFtzaWduYXR1cmVdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlBLSDoge1xuICAgICAgY29uc3QgeyBvdXRwdXQsIHB1YmtleSwgc2lnbmF0dXJlIH0gPSBwYXltZW50cy5wMnBraCh7XG4gICAgICAgIGlucHV0OiBzY3JpcHRTaWcsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJldk91dFNjcmlwdDogb3V0cHV0LFxuICAgICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyUEtILFxuICAgICAgICBwdWJrZXlzOiBbcHVia2V5XSxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyUEs6IHtcbiAgICAgIGNvbnN0IHsgc2lnbmF0dXJlIH0gPSBwYXltZW50cy5wMnBrKHsgaW5wdXQ6IHNjcmlwdFNpZyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMlBLLFxuICAgICAgICBwdWJrZXlzOiBbdW5kZWZpbmVkXSxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyTVM6IHtcbiAgICAgIGNvbnN0IHsgbSwgcHVia2V5cywgc2lnbmF0dXJlcyB9ID0gcGF5bWVudHMucDJtcyhcbiAgICAgICAge1xuICAgICAgICAgIGlucHV0OiBzY3JpcHRTaWcsXG4gICAgICAgICAgb3V0cHV0OiBzY3JpcHRQdWJLZXksXG4gICAgICAgIH0sXG4gICAgICAgIHsgYWxsb3dJbmNvbXBsZXRlOiB0cnVlIH1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJNUyxcbiAgICAgICAgcHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlcyxcbiAgICAgICAgbWF4U2lnbmF0dXJlczogbSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJUUl9OUzoge1xuICAgICAgY29uc3QgeyBuLCBwdWJrZXlzLCBzaWduYXR1cmVzIH0gPSBwMnRyUGF5bWVudHMucDJ0cl9ucyhcbiAgICAgICAge1xuICAgICAgICAgIC8vIFdpdG5lc3Mgc2lnbmF0dXJlcyBhcmUgcmV2ZXJzZSBvZiBwdWJrZXlzLCBiZWNhdXNlIGl0J3MgYSBzdGFja1xuICAgICAgICAgIHNpZ25hdHVyZXM6IHdpdG5lc3NTdGFjay5sZW5ndGggPyB3aXRuZXNzU3RhY2sucmV2ZXJzZSgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG91dHB1dDogc2NyaXB0UHViS2V5LFxuICAgICAgICB9LFxuICAgICAgICB7IGFsbG93SW5jb21wbGV0ZTogdHJ1ZSwgZWNjTGliIH1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJUUl9OUyxcbiAgICAgICAgcHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlcyxcbiAgICAgICAgbWF4U2lnbmF0dXJlczogbixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgPT09IFNDUklQVF9UWVBFUy5QMlNIKSB7XG4gICAgY29uc3QgeyBvdXRwdXQsIHJlZGVlbSB9ID0gcGF5bWVudHMucDJzaCh7XG4gICAgICBpbnB1dDogc2NyaXB0U2lnLFxuICAgICAgd2l0bmVzczogd2l0bmVzc1N0YWNrLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3V0cHV0VHlwZSA9IGNsYXNzaWZ5Lm91dHB1dChyZWRlZW0hLm91dHB1dCEpO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gZXhwYW5kSW5wdXQ8VE51bWJlcj4ocmVkZWVtIS5pbnB1dCEsIHJlZGVlbSEud2l0bmVzcyEsIG91dHB1dFR5cGUsIHJlZGVlbSEub3V0cHV0KTtcbiAgICBpZiAoIWV4cGFuZGVkLnByZXZPdXRUeXBlKSByZXR1cm4ge307XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJldk91dFNjcmlwdDogb3V0cHV0LFxuICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMlNILFxuICAgICAgcmVkZWVtU2NyaXB0OiByZWRlZW0hLm91dHB1dCxcbiAgICAgIHJlZGVlbVNjcmlwdFR5cGU6IGV4cGFuZGVkLnByZXZPdXRUeXBlLFxuICAgICAgd2l0bmVzc1NjcmlwdDogZXhwYW5kZWQud2l0bmVzc1NjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHRUeXBlOiBleHBhbmRlZC53aXRuZXNzU2NyaXB0VHlwZSxcblxuICAgICAgcHVia2V5czogZXhwYW5kZWQucHVia2V5cyxcbiAgICAgIHNpZ25hdHVyZXM6IGV4cGFuZGVkLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXU0gpIHtcbiAgICBjb25zdCB7IG91dHB1dCwgcmVkZWVtIH0gPSBwYXltZW50cy5wMndzaCh7XG4gICAgICBpbnB1dDogc2NyaXB0U2lnLFxuICAgICAgd2l0bmVzczogd2l0bmVzc1N0YWNrLFxuICAgIH0pO1xuICAgIGNvbnN0IG91dHB1dFR5cGUgPSBjbGFzc2lmeS5vdXRwdXQocmVkZWVtIS5vdXRwdXQhKTtcbiAgICBsZXQgZXhwYW5kZWQ7XG4gICAgaWYgKG91dHB1dFR5cGUgPT09IFNDUklQVF9UWVBFUy5QMldQS0gpIHtcbiAgICAgIGV4cGFuZGVkID0gZXhwYW5kSW5wdXQ8VE51bWJlcj4ocmVkZWVtIS5pbnB1dCEsIHJlZGVlbSEud2l0bmVzcyEsIG91dHB1dFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBhbmRlZCA9IGV4cGFuZElucHV0PFROdW1iZXI+KGJzY3JpcHQuY29tcGlsZShyZWRlZW0hLndpdG5lc3MhKSwgW10sIG91dHB1dFR5cGUsIHJlZGVlbSEub3V0cHV0KTtcbiAgICB9XG4gICAgaWYgKCFleHBhbmRlZC5wcmV2T3V0VHlwZSkgcmV0dXJuIHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByZXZPdXRTY3JpcHQ6IG91dHB1dCxcbiAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJXU0gsXG4gICAgICB3aXRuZXNzU2NyaXB0OiByZWRlZW0hLm91dHB1dCxcbiAgICAgIHdpdG5lc3NTY3JpcHRUeXBlOiBleHBhbmRlZC5wcmV2T3V0VHlwZSxcblxuICAgICAgcHVia2V5czogZXhwYW5kZWQucHVia2V5cyxcbiAgICAgIHNpZ25hdHVyZXM6IGV4cGFuZGVkLnNpZ25hdHVyZXMsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJUUikge1xuICAgIGNvbnN0IHBhcnNlZFdpdG5lc3MgPSB0YXByb290LnBhcnNlVGFwcm9vdFdpdG5lc3Mod2l0bmVzc1N0YWNrKTtcbiAgICBpZiAocGFyc2VkV2l0bmVzcy5zcGVuZFR5cGUgPT09ICdLZXknKSB7XG4gICAgICAvLyBrZXkgcGF0aCBzcGVuZCwgbm90aGluZyB0byBleHBhbmRcbiAgICAgIGNvbnN0IHsgc2lnbmF0dXJlLCBhbm5leCB9ID0gcGFyc2VkV2l0bmVzcztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJUUixcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICAgIGFubmV4LFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gc2NyaXB0IHBhdGggc3BlbmRcbiAgICAgIGNvbnN0IHsgdGFwc2NyaXB0LCBjb250cm9sQmxvY2ssIGFubmV4IH0gPSBwYXJzZWRXaXRuZXNzO1xuICAgICAgY29uc3QgcHJldk91dFNjcmlwdCA9IHAydHJQYXltZW50cy5wMnRyKFxuICAgICAgICB7XG4gICAgICAgICAgcmVkZWVtczogW3sgb3V0cHV0OiB0YXBzY3JpcHQgfV0sXG4gICAgICAgICAgcmVkZWVtSW5kZXg6IDAsXG4gICAgICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgICAgIGFubmV4LFxuICAgICAgICB9LFxuICAgICAgICB7IGVjY0xpYiB9XG4gICAgICApLm91dHB1dDtcbiAgICAgIGNvbnN0IHdpdG5lc3NTY3JpcHRUeXBlID0gY2xhc3NpZnkub3V0cHV0KHRhcHNjcmlwdCk7XG4gICAgICBjb25zdCB7IHB1YmtleXMsIHNpZ25hdHVyZXMgfSA9IGV4cGFuZElucHV0PFROdW1iZXI+KFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHBhcnNlZFdpdG5lc3Muc2NyaXB0U2lnLFxuICAgICAgICB3aXRuZXNzU2NyaXB0VHlwZSxcbiAgICAgICAgdGFwc2NyaXB0XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmV2T3V0U2NyaXB0LFxuICAgICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyVFIsXG4gICAgICAgIHdpdG5lc3NTY3JpcHQ6IHRhcHNjcmlwdCxcbiAgICAgICAgd2l0bmVzc1NjcmlwdFR5cGUsXG5cbiAgICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgICBhbm5leCxcblxuICAgICAgICBwdWJrZXlzLFxuICAgICAgICBzaWduYXR1cmVzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuTk9OU1RBTkRBUkQsXG4gICAgcHJldk91dFNjcmlwdDogc2NyaXB0U2lnLFxuICB9O1xufVxuXG4vLyBjb3VsZCBiZSBkb25lIGluIGV4cGFuZElucHV0LCBidXQgcmVxdWlyZXMgdGhlIG9yaWdpbmFsIFRyYW5zYWN0aW9uIGZvciBoYXNoRm9yU2lnbmF0dXJlXG5mdW5jdGlvbiBmaXhNdWx0aXNpZ09yZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBpbnB1dDogVHhiSW5wdXQ8VE51bWJlcj4sXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgdmluOiBudW1iZXIsXG4gIHByZXZPdXRwdXRzPzogVHhPdXRwdXQ8VE51bWJlcj5bXVxuKTogdm9pZCB7XG4gIGlmIChpbnB1dC5yZWRlZW1TY3JpcHRUeXBlICE9PSBTQ1JJUFRfVFlQRVMuUDJNUyB8fCAhaW5wdXQucmVkZWVtU2NyaXB0KSByZXR1cm47XG4gIGlmIChpbnB1dC5wdWJrZXlzIS5sZW5ndGggPT09IGlucHV0LnNpZ25hdHVyZXMhLmxlbmd0aCkgcmV0dXJuO1xuICBjb25zdCBwcmV2T3V0cHV0ID0gcHJldk91dHB1dHMgJiYgcHJldk91dHB1dHNbdmluXTtcblxuICBjb25zdCB1bm1hdGNoZWQgPSBpbnB1dC5zaWduYXR1cmVzIS5jb25jYXQoKTtcblxuICBpbnB1dC5zaWduYXR1cmVzID0gaW5wdXQucHVia2V5cyEubWFwKChwdWJLZXkpID0+IHtcbiAgICBjb25zdCBrZXlQYWlyID0gRUNQYWlyLmZyb21QdWJsaWNLZXkocHViS2V5ISk7XG4gICAgbGV0IG1hdGNoOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBjaGVjayBmb3IgYSBzaWduYXR1cmVcbiAgICB1bm1hdGNoZWQuc29tZSgoc2lnbmF0dXJlLCBpKSA9PiB7XG4gICAgICAvLyBza2lwIGlmIHVuZGVmaW5lZCB8fCBPUF8wXG4gICAgICBpZiAoIXNpZ25hdHVyZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBUT0RPOiBhdm9pZCBPKG4pIGhhc2hGb3JTaWduYXR1cmVcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGJzY3JpcHQuc2lnbmF0dXJlLmRlY29kZShzaWduYXR1cmUpO1xuICAgICAgY29uc3QgaGFzaCA9IHRyYW5zYWN0aW9uLmhhc2hGb3JTaWduYXR1cmUodmluLCBpbnB1dC5yZWRlZW1TY3JpcHQhLCBwYXJzZWQuaGFzaFR5cGUsIHByZXZPdXRwdXQ/LnZhbHVlKTtcblxuICAgICAgLy8gc2tpcCBpZiBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggcHViS2V5XG4gICAgICBpZiAoIWtleVBhaXIudmVyaWZ5KGhhc2gsIHBhcnNlZC5zaWduYXR1cmUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIHJlbW92ZSBtYXRjaGVkIHNpZ25hdHVyZSBmcm9tIHVubWF0Y2hlZFxuICAgICAgdW5tYXRjaGVkW2ldID0gdW5kZWZpbmVkO1xuICAgICAgbWF0Y2ggPSBzaWduYXR1cmU7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kT3V0cHV0KHNjcmlwdDogQnVmZmVyLCBvdXJQdWJLZXk/OiBCdWZmZXIsIGNvbnRyb2xCbG9jaz86IEJ1ZmZlcik6IFR4Yk91dHB1dCB7XG4gIHR5cGVmb3JjZSh0eXBlcy5CdWZmZXIsIHNjcmlwdCk7XG4gIGNvbnN0IHR5cGUgPSBjbGFzc2lmeS5vdXRwdXQoc2NyaXB0KTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlBLSDoge1xuICAgICAgaWYgKCFvdXJQdWJLZXkpIHJldHVybiB7IHR5cGUgfTtcblxuICAgICAgLy8gZG9lcyBvdXIgaGFzaDE2MChwdWJLZXkpIG1hdGNoIHRoZSBvdXRwdXQgc2NyaXB0cz9cbiAgICAgIGNvbnN0IHBraDEgPSBwYXltZW50cy5wMnBraCh7IG91dHB1dDogc2NyaXB0IH0pLmhhc2g7XG4gICAgICBjb25zdCBwa2gyID0gYmNyeXB0by5oYXNoMTYwKG91clB1YktleSk7XG4gICAgICBpZiAoIXBraDEhLmVxdWFscyhwa2gyKSkgcmV0dXJuIHsgdHlwZSB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwdWJrZXlzOiBbb3VyUHViS2V5XSxcbiAgICAgICAgc2lnbmF0dXJlczogW3VuZGVmaW5lZF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyV1BLSDoge1xuICAgICAgaWYgKCFvdXJQdWJLZXkpIHJldHVybiB7IHR5cGUgfTtcblxuICAgICAgLy8gZG9lcyBvdXIgaGFzaDE2MChwdWJLZXkpIG1hdGNoIHRoZSBvdXRwdXQgc2NyaXB0cz9cbiAgICAgIGNvbnN0IHdwa2gxID0gcGF5bWVudHMucDJ3cGtoKHsgb3V0cHV0OiBzY3JpcHQgfSkuaGFzaDtcbiAgICAgIGNvbnN0IHdwa2gyID0gYmNyeXB0by5oYXNoMTYwKG91clB1YktleSk7XG4gICAgICBpZiAoIXdwa2gxIS5lcXVhbHMod3BraDIpKSByZXR1cm4geyB0eXBlIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHB1YmtleXM6IFtvdXJQdWJLZXldLFxuICAgICAgICBzaWduYXR1cmVzOiBbdW5kZWZpbmVkXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJUUjoge1xuICAgICAgaWYgKCFvdXJQdWJLZXkpIHJldHVybiB7IHR5cGUgfTtcbiAgICAgIC8vIEhBQ0sgb3VyUHViS2V5IHRvIEJJUDM0MC1zdHlsZVxuICAgICAgaWYgKG91clB1YktleS5sZW5ndGggPT09IDMzKSBvdXJQdWJLZXkgPSBvdXJQdWJLZXkuc2xpY2UoMSk7XG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG11bHRpcGxlIHB1YmtleXNcbiAgICAgIGNvbnN0IHAydHIgPSBwMnRyUGF5bWVudHMucDJ0cih7IHB1YmtleTogb3VyUHViS2V5LCBjb250cm9sQmxvY2sgfSwgeyBlY2NMaWIgfSk7XG5cbiAgICAgIC8vIERvZXMgdHdlYWtlZCBvdXRwdXQgZm9yIGEgc2luZ2xlIHB1YmtleSBtYXRjaD9cbiAgICAgIGlmICghc2NyaXB0LmVxdWFscyhwMnRyLm91dHB1dCEpKSByZXR1cm4geyB0eXBlIH07XG5cbiAgICAgIC8vIFAyVFIgS2V5UGF0aCwgc2luZ2xlIGtleVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZSxcbiAgICAgICAgcHVia2V5czogW291clB1YktleV0sXG4gICAgICAgIHNpZ25hdHVyZXM6IFt1bmRlZmluZWRdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlRSX05TOiB7XG4gICAgICBjb25zdCBwMnRyTnMgPSBwMnRyUGF5bWVudHMucDJ0cl9ucyh7IG91dHB1dDogc2NyaXB0IH0sIHsgZWNjTGliIH0pO1xuICAgICAgLy8gUDJUUiBTY3JpcHRQYXRoXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwdWJrZXlzOiBwMnRyTnMucHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlczogcDJ0ck5zLnB1YmtleXMhLm1hcCgoKTogdW5kZWZpbmVkID0+IHVuZGVmaW5lZCksXG4gICAgICAgIG1heFNpZ25hdHVyZXM6IHAydHJOcy5wdWJrZXlzIS5sZW5ndGgsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyUEs6IHtcbiAgICAgIGNvbnN0IHAycGsgPSBwYXltZW50cy5wMnBrKHsgb3V0cHV0OiBzY3JpcHQgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBwdWJrZXlzOiBbcDJway5wdWJrZXldLFxuICAgICAgICBzaWduYXR1cmVzOiBbdW5kZWZpbmVkXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJNUzoge1xuICAgICAgY29uc3QgcDJtcyA9IHBheW1lbnRzLnAybXMoeyBvdXRwdXQ6IHNjcmlwdCB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGUsXG4gICAgICAgIHB1YmtleXM6IHAybXMucHVia2V5cyxcbiAgICAgICAgc2lnbmF0dXJlczogcDJtcy5wdWJrZXlzIS5tYXAoKCk6IHVuZGVmaW5lZCA9PiB1bmRlZmluZWQpLFxuICAgICAgICBtYXhTaWduYXR1cmVzOiBwMm1zLm0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHR5cGUgfTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUlucHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICBpbnB1dDogVHhiSW5wdXQ8VE51bWJlcj4sXG4gIG91clB1YktleTogQnVmZmVyLFxuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXIsXG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXIsXG4gIGNvbnRyb2xCbG9jaz86IEJ1ZmZlcixcbiAgYW5uZXg/OiBCdWZmZXJcbik6IFR4YklucHV0PFROdW1iZXI+IHtcbiAgaWYgKHJlZGVlbVNjcmlwdCAmJiB3aXRuZXNzU2NyaXB0KSB7XG4gICAgY29uc3QgcDJ3c2ggPSBwYXltZW50cy5wMndzaCh7XG4gICAgICByZWRlZW06IHsgb3V0cHV0OiB3aXRuZXNzU2NyaXB0IH0sXG4gICAgfSkgYXMgUGF5bWVudDtcbiAgICBjb25zdCBwMndzaEFsdCA9IHBheW1lbnRzLnAyd3NoKHsgb3V0cHV0OiByZWRlZW1TY3JpcHQgfSkgYXMgUGF5bWVudDtcbiAgICBjb25zdCBwMnNoID0gcGF5bWVudHMucDJzaCh7IHJlZGVlbTogeyBvdXRwdXQ6IHJlZGVlbVNjcmlwdCB9IH0pIGFzIFBheW1lbnQ7XG4gICAgY29uc3QgcDJzaEFsdCA9IHBheW1lbnRzLnAyc2goeyByZWRlZW06IHAyd3NoIH0pIGFzIFBheW1lbnQ7XG5cbiAgICAvLyBlbmZvcmNlcyBQMlNIKFAyV1NIKC4uLikpXG4gICAgaWYgKCFwMndzaC5oYXNoIS5lcXVhbHMocDJ3c2hBbHQuaGFzaCEpKSB0aHJvdyBuZXcgRXJyb3IoJ1dpdG5lc3Mgc2NyaXB0IGluY29uc2lzdGVudCB3aXRoIHByZXZPdXRTY3JpcHQnKTtcbiAgICBpZiAoIXAyc2guaGFzaCEuZXF1YWxzKHAyc2hBbHQuaGFzaCEpKSB0aHJvdyBuZXcgRXJyb3IoJ1JlZGVlbSBzY3JpcHQgaW5jb25zaXN0ZW50IHdpdGggcHJldk91dFNjcmlwdCcpO1xuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQocDJ3c2gucmVkZWVtIS5vdXRwdXQhLCBvdXJQdWJLZXkpO1xuICAgIGlmICghZXhwYW5kZWQucHVia2V5cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cGFuZGVkLnR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgYXMgd2l0bmVzc1NjcmlwdCAoJyArIGJzY3JpcHQudG9BU00od2l0bmVzc1NjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25TY3JpcHQgPSB3aXRuZXNzU2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB0aHJvdyBuZXcgRXJyb3IoJ1AyU0goUDJXU0goUDJXUEtIKSkgaXMgYSBjb25zZW5zdXMgZmFpbHVyZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdFR5cGU6IFNDUklQVF9UWVBFUy5QMldTSCxcblxuICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHRUeXBlOiBleHBhbmRlZC50eXBlLFxuXG4gICAgICBwcmV2T3V0VHlwZTogU0NSSVBUX1RZUEVTLlAyU0gsXG4gICAgICBwcmV2T3V0U2NyaXB0OiBwMnNoLm91dHB1dCxcblxuICAgICAgd2l0bmVzc1ZlcnNpb246IDAsXG4gICAgICBzaWduU2NyaXB0LFxuICAgICAgc2lnblR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHB1YmtleXM6IGV4cGFuZGVkLnB1YmtleXMsXG4gICAgICBzaWduYXR1cmVzOiBleHBhbmRlZC5zaWduYXR1cmVzLFxuICAgICAgbWF4U2lnbmF0dXJlczogZXhwYW5kZWQubWF4U2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKHJlZGVlbVNjcmlwdCkge1xuICAgIGNvbnN0IHAyc2ggPSBwYXltZW50cy5wMnNoKHsgcmVkZWVtOiB7IG91dHB1dDogcmVkZWVtU2NyaXB0IH0gfSkgYXMgUGF5bWVudDtcblxuICAgIGlmIChpbnB1dC5wcmV2T3V0U2NyaXB0KSB7XG4gICAgICBsZXQgcDJzaEFsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHAyc2hBbHQgPSBwYXltZW50cy5wMnNoKHsgb3V0cHV0OiBpbnB1dC5wcmV2T3V0U2NyaXB0IH0pIGFzIFBheW1lbnQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHJldk91dFNjcmlwdCBtdXN0IGJlIFAyU0gnKTtcbiAgICAgIH1cbiAgICAgIGlmICghcDJzaC5oYXNoIS5lcXVhbHMocDJzaEFsdC5oYXNoISkpIHRocm93IG5ldyBFcnJvcignUmVkZWVtIHNjcmlwdCBpbmNvbnNpc3RlbnQgd2l0aCBwcmV2T3V0U2NyaXB0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQocDJzaC5yZWRlZW0hLm91dHB1dCEsIG91clB1YktleSk7XG4gICAgaWYgKCFleHBhbmRlZC5wdWJrZXlzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXhwYW5kZWQudHlwZSArICcgbm90IHN1cHBvcnRlZCBhcyByZWRlZW1TY3JpcHQgKCcgKyBic2NyaXB0LnRvQVNNKHJlZGVlbVNjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGxldCBzaWduU2NyaXB0ID0gcmVkZWVtU2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB7XG4gICAgICBzaWduU2NyaXB0ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGV4cGFuZGVkLnB1YmtleXNbMF0gfSkub3V0cHV0ITtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcmVkZWVtU2NyaXB0LFxuICAgICAgcmVkZWVtU2NyaXB0VHlwZTogZXhwYW5kZWQudHlwZSxcblxuICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMlNILFxuICAgICAgcHJldk91dFNjcmlwdDogcDJzaC5vdXRwdXQsXG5cbiAgICAgIHdpdG5lc3NWZXJzaW9uOiBleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIID8gMCA6IHVuZGVmaW5lZCxcbiAgICAgIHNpZ25TY3JpcHQsXG4gICAgICBzaWduVHlwZTogZXhwYW5kZWQudHlwZSxcblxuICAgICAgcHVia2V5czogZXhwYW5kZWQucHVia2V5cyxcbiAgICAgIHNpZ25hdHVyZXM6IGV4cGFuZGVkLnNpZ25hdHVyZXMsXG4gICAgICBtYXhTaWduYXR1cmVzOiBleHBhbmRlZC5tYXhTaWduYXR1cmVzLFxuICAgIH07XG4gIH1cblxuICBpZiAod2l0bmVzc1NjcmlwdCAmJiBjb250cm9sQmxvY2spIHtcbiAgICAvLyBQMlRSIFNjcmlwdFBhdGhcbiAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc2hhZG93ZWQtdmFyaWFibGUgKi9cbiAgICBsZXQgcHJldk91dFNjcmlwdCA9IGlucHV0LnByZXZPdXRTY3JpcHQ7XG4gICAgaWYgKCFwcmV2T3V0U2NyaXB0KSB7XG4gICAgICBwcmV2T3V0U2NyaXB0ID0gcDJ0clBheW1lbnRzLnAydHIoXG4gICAgICAgIHtcbiAgICAgICAgICByZWRlZW1zOiBbeyBvdXRwdXQ6IHdpdG5lc3NTY3JpcHQgfV0sXG4gICAgICAgICAgcmVkZWVtSW5kZXg6IDAsXG4gICAgICAgICAgY29udHJvbEJsb2NrLFxuICAgICAgICAgIGFubmV4LFxuICAgICAgICB9LFxuICAgICAgICB7IGVjY0xpYiB9XG4gICAgICApLm91dHB1dDtcbiAgICB9XG5cbiAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZE91dHB1dCh3aXRuZXNzU2NyaXB0LCBvdXJQdWJLZXkpO1xuICAgIGlmICghZXhwYW5kZWQucHVia2V5cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cGFuZGVkLnR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgYXMgd2l0bmVzc1NjcmlwdCAoJyArIGJzY3JpcHQudG9BU00od2l0bmVzc1NjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB3aXRuZXNzU2NyaXB0LFxuICAgICAgd2l0bmVzc1NjcmlwdFR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJUUixcbiAgICAgIHByZXZPdXRTY3JpcHQsXG5cbiAgICAgIHdpdG5lc3NWZXJzaW9uOiAxLFxuICAgICAgc2lnblNjcmlwdDogd2l0bmVzc1NjcmlwdCxcbiAgICAgIHNpZ25UeXBlOiBleHBhbmRlZC50eXBlLFxuXG4gICAgICBwdWJrZXlzOiBleHBhbmRlZC5wdWJrZXlzLFxuICAgICAgc2lnbmF0dXJlczogZXhwYW5kZWQuc2lnbmF0dXJlcyxcbiAgICAgIG1heFNpZ25hdHVyZXM6IGV4cGFuZGVkLm1heFNpZ25hdHVyZXMsXG5cbiAgICAgIGNvbnRyb2xCbG9jayxcbiAgICAgIGFubmV4LFxuICAgIH07XG4gIH1cblxuICBpZiAod2l0bmVzc1NjcmlwdCkge1xuICAgIGNvbnN0IHAyd3NoID0gcGF5bWVudHMucDJ3c2goeyByZWRlZW06IHsgb3V0cHV0OiB3aXRuZXNzU2NyaXB0IH0gfSk7XG5cbiAgICBpZiAoaW5wdXQucHJldk91dFNjcmlwdCkge1xuICAgICAgY29uc3QgcDJ3c2hBbHQgPSBwYXltZW50cy5wMndzaCh7IG91dHB1dDogaW5wdXQucHJldk91dFNjcmlwdCB9KTtcbiAgICAgIGlmICghcDJ3c2guaGFzaCEuZXF1YWxzKHAyd3NoQWx0Lmhhc2ghKSkgdGhyb3cgbmV3IEVycm9yKCdXaXRuZXNzIHNjcmlwdCBpbmNvbnNpc3RlbnQgd2l0aCBwcmV2T3V0U2NyaXB0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQocDJ3c2gucmVkZWVtIS5vdXRwdXQhLCBvdXJQdWJLZXkpO1xuICAgIGlmICghZXhwYW5kZWQucHVia2V5cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGV4cGFuZGVkLnR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQgYXMgd2l0bmVzc1NjcmlwdCAoJyArIGJzY3JpcHQudG9BU00od2l0bmVzc1NjcmlwdCkgKyAnKScpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuc2lnbmF0dXJlcyAmJiBpbnB1dC5zaWduYXR1cmVzLnNvbWUoKHgpID0+IHggIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIGV4cGFuZGVkLnNpZ25hdHVyZXMgPSBpbnB1dC5zaWduYXR1cmVzO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25TY3JpcHQgPSB3aXRuZXNzU2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB0aHJvdyBuZXcgRXJyb3IoJ1AyV1NIKFAyV1BLSCkgaXMgYSBjb25zZW5zdXMgZmFpbHVyZScpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICB3aXRuZXNzU2NyaXB0VHlwZTogZXhwYW5kZWQudHlwZSxcblxuICAgICAgcHJldk91dFR5cGU6IFNDUklQVF9UWVBFUy5QMldTSCxcbiAgICAgIHByZXZPdXRTY3JpcHQ6IHAyd3NoLm91dHB1dCxcblxuICAgICAgd2l0bmVzc1ZlcnNpb246IDAsXG4gICAgICBzaWduU2NyaXB0LFxuICAgICAgc2lnblR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHB1YmtleXM6IGV4cGFuZGVkLnB1YmtleXMsXG4gICAgICBzaWduYXR1cmVzOiBleHBhbmRlZC5zaWduYXR1cmVzLFxuICAgICAgbWF4U2lnbmF0dXJlczogZXhwYW5kZWQubWF4U2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlucHV0LnByZXZPdXRUeXBlICYmIGlucHV0LnByZXZPdXRTY3JpcHQpIHtcbiAgICAvLyBlbWJlZGRlZCBzY3JpcHRzIGFyZSBub3QgcG9zc2libGUgd2l0aG91dCBleHRyYSBpbmZvcm1hdGlvblxuICAgIGlmIChpbnB1dC5wcmV2T3V0VHlwZSA9PT0gU0NSSVBUX1RZUEVTLlAyU0gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJldk91dFNjcmlwdCBpcyAnICsgaW5wdXQucHJldk91dFR5cGUgKyAnLCByZXF1aXJlcyByZWRlZW1TY3JpcHQnKTtcbiAgICB9XG4gICAgaWYgKGlucHV0LnByZXZPdXRUeXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXU0gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHJldk91dFNjcmlwdCBpcyAnICsgaW5wdXQucHJldk91dFR5cGUgKyAnLCByZXF1aXJlcyB3aXRuZXNzU2NyaXB0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRPdXRwdXQoaW5wdXQucHJldk91dFNjcmlwdCwgb3VyUHViS2V5KTtcbiAgICBpZiAoIWV4cGFuZGVkLnB1YmtleXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihleHBhbmRlZC50eXBlICsgJyBub3Qgc3VwcG9ydGVkICgnICsgYnNjcmlwdC50b0FTTShpbnB1dC5wcmV2T3V0U2NyaXB0KSArICcpJyk7XG4gICAgfVxuICAgIGlmIChpbnB1dC5zaWduYXR1cmVzICYmIGlucHV0LnNpZ25hdHVyZXMuc29tZSgoeCkgPT4geCAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgZXhwYW5kZWQuc2lnbmF0dXJlcyA9IGlucHV0LnNpZ25hdHVyZXM7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25TY3JpcHQgPSBpbnB1dC5wcmV2T3V0U2NyaXB0O1xuICAgIGlmIChleHBhbmRlZC50eXBlID09PSBTQ1JJUFRfVFlQRVMuUDJXUEtIKSB7XG4gICAgICBzaWduU2NyaXB0ID0gcGF5bWVudHMucDJwa2goeyBwdWJrZXk6IGV4cGFuZGVkLnB1YmtleXNbMF0gfSkub3V0cHV0IGFzIEJ1ZmZlcjtcbiAgICB9XG5cbiAgICBsZXQgd2l0bmVzc1ZlcnNpb247XG4gICAgaWYgKGV4cGFuZGVkLnR5cGUgPT09IFNDUklQVF9UWVBFUy5QMldQS0gpIHtcbiAgICAgIHdpdG5lc3NWZXJzaW9uID0gMDtcbiAgICB9IGVsc2UgaWYgKGV4cGFuZGVkLnR5cGUgPT09IFNDUklQVF9UWVBFUy5QMlRSKSB7XG4gICAgICB3aXRuZXNzVmVyc2lvbiA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByZXZPdXRUeXBlOiBleHBhbmRlZC50eXBlLFxuICAgICAgcHJldk91dFNjcmlwdDogaW5wdXQucHJldk91dFNjcmlwdCxcblxuICAgICAgd2l0bmVzc1ZlcnNpb24sXG4gICAgICBzaWduU2NyaXB0LFxuICAgICAgc2lnblR5cGU6IGV4cGFuZGVkLnR5cGUsXG5cbiAgICAgIHB1YmtleXM6IGV4cGFuZGVkLnB1YmtleXMsXG4gICAgICBzaWduYXR1cmVzOiBleHBhbmRlZC5zaWduYXR1cmVzLFxuICAgICAgbWF4U2lnbmF0dXJlczogZXhwYW5kZWQubWF4U2lnbmF0dXJlcyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHJldk91dFNjcmlwdCA9IHBheW1lbnRzLnAycGtoKHsgcHVia2V5OiBvdXJQdWJLZXkgfSkub3V0cHV0O1xuICByZXR1cm4ge1xuICAgIHByZXZPdXRUeXBlOiBTQ1JJUFRfVFlQRVMuUDJQS0gsXG4gICAgcHJldk91dFNjcmlwdCxcblxuICAgIHNpZ25TY3JpcHQ6IHByZXZPdXRTY3JpcHQsXG4gICAgc2lnblR5cGU6IFNDUklQVF9UWVBFUy5QMlBLSCxcblxuICAgIHB1YmtleXM6IFtvdXJQdWJLZXldLFxuICAgIHNpZ25hdHVyZXM6IFt1bmRlZmluZWRdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgdHlwZTogc3RyaW5nLFxuICBpbnB1dDogVHhiSW5wdXQ8VE51bWJlcj4sXG4gIGFsbG93SW5jb21wbGV0ZT86IGJvb2xlYW5cbik6IFBheW1lbnQgfCB1bmRlZmluZWQge1xuICBjb25zdCBwdWJrZXlzID0gKGlucHV0LnB1YmtleXMgfHwgW10pIGFzIEJ1ZmZlcltdO1xuICBsZXQgc2lnbmF0dXJlcyA9IChpbnB1dC5zaWduYXR1cmVzIHx8IFtdKSBhcyBCdWZmZXJbXTtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlBLSDoge1xuICAgICAgaWYgKHB1YmtleXMubGVuZ3RoID09PSAwKSBicmVhaztcbiAgICAgIGlmIChzaWduYXR1cmVzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG5cbiAgICAgIHJldHVybiBwYXltZW50cy5wMnBraCh7IHB1YmtleTogcHVia2V5c1swXSwgc2lnbmF0dXJlOiBzaWduYXR1cmVzWzBdIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMldQS0g6IHtcbiAgICAgIGlmIChwdWJrZXlzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPT09IDApIGJyZWFrO1xuXG4gICAgICByZXR1cm4gcGF5bWVudHMucDJ3cGtoKHsgcHVia2V5OiBwdWJrZXlzWzBdLCBzaWduYXR1cmU6IHNpZ25hdHVyZXNbMF0gfSk7XG4gICAgfVxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyUEs6IHtcbiAgICAgIGlmIChwdWJrZXlzLmxlbmd0aCA9PT0gMCkgYnJlYWs7XG4gICAgICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPT09IDApIGJyZWFrO1xuXG4gICAgICByZXR1cm4gcGF5bWVudHMucDJwayh7IHNpZ25hdHVyZTogc2lnbmF0dXJlc1swXSB9KTtcbiAgICB9XG4gICAgY2FzZSBTQ1JJUFRfVFlQRVMuUDJNUzoge1xuICAgICAgY29uc3QgbSA9IGlucHV0Lm1heFNpZ25hdHVyZXM7XG4gICAgICBpZiAoYWxsb3dJbmNvbXBsZXRlKSB7XG4gICAgICAgIHNpZ25hdHVyZXMgPSBzaWduYXR1cmVzLm1hcCgoeCkgPT4geCB8fCBvcHMuT1BfMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWduYXR1cmVzID0gc2lnbmF0dXJlcy5maWx0ZXIoKHgpID0+IHgpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IG5vdCBjb21wbGV0ZSAoY29tcGxldGUpLCBvciBpZiBzaWduYXR1cmVzLmxlbmd0aCA9PT0gbSwgdmFsaWRhdGVcbiAgICAgIC8vIG90aGVyd2lzZSwgdGhlIG51bWJlciBvZiBPUF8wJ3MgbWF5IGJlID49IG0sIHNvIGRvbid0IHZhbGlkYXRlIChib28pXG4gICAgICBjb25zdCB2YWxpZGF0ZSA9ICFhbGxvd0luY29tcGxldGUgfHwgbSA9PT0gc2lnbmF0dXJlcy5sZW5ndGg7XG4gICAgICByZXR1cm4gcGF5bWVudHMucDJtcyh7IG0sIHB1YmtleXMsIHNpZ25hdHVyZXMgfSwgeyBhbGxvd0luY29tcGxldGUsIHZhbGlkYXRlIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlNIOiB7XG4gICAgICBjb25zdCByZWRlZW0gPSBidWlsZDxUTnVtYmVyPihpbnB1dC5yZWRlZW1TY3JpcHRUeXBlISwgaW5wdXQsIGFsbG93SW5jb21wbGV0ZSk7XG4gICAgICBpZiAoIXJlZGVlbSkgcmV0dXJuO1xuXG4gICAgICByZXR1cm4gcGF5bWVudHMucDJzaCh7XG4gICAgICAgIHJlZGVlbToge1xuICAgICAgICAgIG91dHB1dDogcmVkZWVtLm91dHB1dCB8fCBpbnB1dC5yZWRlZW1TY3JpcHQsXG4gICAgICAgICAgaW5wdXQ6IHJlZGVlbS5pbnB1dCxcbiAgICAgICAgICB3aXRuZXNzOiByZWRlZW0ud2l0bmVzcyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMldTSDoge1xuICAgICAgY29uc3QgcmVkZWVtID0gYnVpbGQ8VE51bWJlcj4oaW5wdXQud2l0bmVzc1NjcmlwdFR5cGUhLCBpbnB1dCwgYWxsb3dJbmNvbXBsZXRlKTtcbiAgICAgIGlmICghcmVkZWVtKSByZXR1cm47XG5cbiAgICAgIHJldHVybiBwYXltZW50cy5wMndzaCh7XG4gICAgICAgIHJlZGVlbToge1xuICAgICAgICAgIG91dHB1dDogaW5wdXQud2l0bmVzc1NjcmlwdCxcbiAgICAgICAgICBpbnB1dDogcmVkZWVtLmlucHV0LFxuICAgICAgICAgIHdpdG5lc3M6IHJlZGVlbS53aXRuZXNzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgU0NSSVBUX1RZUEVTLlAyVFI6IHtcbiAgICAgIGlmIChpbnB1dC53aXRuZXNzU2NyaXB0VHlwZSA9PT0gU0NSSVBUX1RZUEVTLlAyVFJfTlMpIHtcbiAgICAgICAgLy8gU2NyaXB0UGF0aFxuICAgICAgICBjb25zdCByZWRlZW0gPSBidWlsZDxUTnVtYmVyPihpbnB1dC53aXRuZXNzU2NyaXB0VHlwZSEsIGlucHV0LCBhbGxvd0luY29tcGxldGUpO1xuICAgICAgICByZXR1cm4gcDJ0clBheW1lbnRzLnAydHIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3V0cHV0OiBpbnB1dC5wcmV2T3V0U2NyaXB0LFxuICAgICAgICAgICAgY29udHJvbEJsb2NrOiBpbnB1dC5jb250cm9sQmxvY2ssXG4gICAgICAgICAgICBhbm5leDogaW5wdXQuYW5uZXgsXG4gICAgICAgICAgICByZWRlZW1zOiBbcmVkZWVtIV0sXG4gICAgICAgICAgICByZWRlZW1JbmRleDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgZWNjTGliIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gS2V5UGF0aFxuICAgICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID09PSAwKSBicmVhaztcblxuICAgICAgcmV0dXJuIHAydHJQYXltZW50cy5wMnRyKHsgcHVia2V5cywgc2lnbmF0dXJlOiBzaWduYXR1cmVzWzBdIH0sIHsgZWNjTGliIH0pO1xuICAgIH1cbiAgICBjYXNlIFNDUklQVF9UWVBFUy5QMlRSX05TOiB7XG4gICAgICBjb25zdCBtID0gaW5wdXQubWF4U2lnbmF0dXJlcztcbiAgICAgIGlmIChhbGxvd0luY29tcGxldGUpIHtcbiAgICAgICAgc2lnbmF0dXJlcyA9IHNpZ25hdHVyZXMubWFwKCh4KSA9PiB4IHx8IG9wcy5PUF8wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hdHVyZXMgPSBzaWduYXR1cmVzLmZpbHRlcigoeCkgPT4geCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBub3Qgbm90IGNvbXBsZXRlIChjb21wbGV0ZSksIG9yIGlmIHNpZ25hdHVyZXMubGVuZ3RoID09PSBtLCB2YWxpZGF0ZVxuICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgbnVtYmVyIG9mIE9QXzAncyBtYXkgYmUgPj0gbSwgc28gZG9uJ3QgdmFsaWRhdGUgKGJvbylcbiAgICAgIGNvbnN0IHZhbGlkYXRlID0gIWFsbG93SW5jb21wbGV0ZSB8fCBtID09PSBzaWduYXR1cmVzLmxlbmd0aDtcbiAgICAgIHJldHVybiBwMnRyUGF5bWVudHMucDJ0cl9ucyh7IHB1YmtleXMsIHNpZ25hdHVyZXMgfSwgeyBhbGxvd0luY29tcGxldGUsIHZhbGlkYXRlLCBlY2NMaWIgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNhblNpZ248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oaW5wdXQ6IFR4YklucHV0PFROdW1iZXI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaW5wdXQuc2lnblNjcmlwdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgaW5wdXQuc2lnblR5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LnB1YmtleXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LnNpZ25hdHVyZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgIGlucHV0LnNpZ25hdHVyZXMubGVuZ3RoID09PSBpbnB1dC5wdWJrZXlzLmxlbmd0aCAmJlxuICAgIGlucHV0LnB1YmtleXMubGVuZ3RoID4gMCAmJlxuICAgIChpbnB1dC53aXRuZXNzVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGlucHV0LnZhbHVlICE9PSB1bmRlZmluZWQpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hdHVyZUhhc2hUeXBlKGJ1ZmZlcjogQnVmZmVyKTogbnVtYmVyIHtcbiAgaWYgKGJzY3JpcHQuaXNDYW5vbmljYWxTY2hub3JyU2lnbmF0dXJlKGJ1ZmZlcikgJiYgYnVmZmVyLmxlbmd0aCA9PT0gNjQpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUO1xuICB9XG4gIHJldHVybiBidWZmZXIucmVhZFVJbnQ4KGJ1ZmZlci5sZW5ndGggLSAxKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tTaWduQXJnczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgaW5wdXRzOiBBcnJheTxUeGJJbnB1dDxUTnVtYmVyPj4sXG4gIHNpZ25QYXJhbXM6IFR4YlNpZ25Bcmc8VE51bWJlcj5cbik6IHZvaWQge1xuICBpZiAoIVBSRVZPVVRfVFlQRVMuaGFzKHNpZ25QYXJhbXMucHJldk91dFNjcmlwdFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBwcmV2T3V0U2NyaXB0VHlwZSBcIiR7c2lnblBhcmFtcy5wcmV2T3V0U2NyaXB0VHlwZX1cImApO1xuICB9XG4gIHRmTWVzc2FnZSh0eXBlZm9yY2UuTnVtYmVyLCBzaWduUGFyYW1zLnZpbiwgYHNpZ24gbXVzdCBpbmNsdWRlIHZpbiBwYXJhbWV0ZXIgYXMgTnVtYmVyIChpbnB1dCBpbmRleClgKTtcbiAgdGZNZXNzYWdlKHRmRnVsbFNpZ25lciwgc2lnblBhcmFtcy5rZXlQYWlyLCBgc2lnbiBtdXN0IGluY2x1ZGUga2V5UGFpciBwYXJhbWV0ZXIgYXMgU2lnbmVyIGludGVyZmFjZWApO1xuICB0Zk1lc3NhZ2UodHlwZWZvcmNlLm1heWJlKHR5cGVmb3JjZS5OdW1iZXIpLCBzaWduUGFyYW1zLmhhc2hUeXBlLCBgc2lnbiBoYXNoVHlwZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlcmApO1xuICBjb25zdCBwcmV2T3V0VHlwZSA9IChpbnB1dHNbc2lnblBhcmFtcy52aW5dIHx8IFtdKS5wcmV2T3V0VHlwZTtcbiAgY29uc3QgcG9zVHlwZSA9IHNpZ25QYXJhbXMucHJldk91dFNjcmlwdFR5cGU7XG4gIHN3aXRjaCAocG9zVHlwZSkge1xuICAgIGNhc2UgJ3AycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3B1YmtleWhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMnBraDogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy53aXRuZXNzU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMucmVkZWVtU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyByZWRlZW1TY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy53aXRuZXNzVmFsdWUsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHdpdG5lc3NWYWx1ZWApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncDJwayc6XG4gICAgICBpZiAocHJldk91dFR5cGUgJiYgcHJldk91dFR5cGUgIT09ICdwdWJrZXknKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMnBrOiAke3ByZXZPdXRUeXBlfWApO1xuICAgICAgfVxuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy5yZWRlZW1TY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHJlZGVlbVNjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLndpdG5lc3NWYWx1ZSwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1ZhbHVlYCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwMndwa2gnOlxuICAgICAgaWYgKHByZXZPdXRUeXBlICYmIHByZXZPdXRUeXBlICE9PSAnd2l0bmVzc3B1YmtleWhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMndwa2g6ICR7cHJldk91dFR5cGV9YCk7XG4gICAgICB9XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZXMuU2F0b3NoaSwgc2lnblBhcmFtcy53aXRuZXNzVmFsdWUsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NWYWx1ZWApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncDJtcyc6XG4gICAgICBpZiAocHJldk91dFR5cGUgJiYgcHJldk91dFR5cGUgIT09ICdtdWx0aXNpZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW5wdXQgIyR7c2lnblBhcmFtcy52aW59IGlzIG5vdCBvZiB0eXBlIHAybXM6ICR7cHJldk91dFR5cGV9YCk7XG4gICAgICB9XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayc2gtcDJ3cGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3NjcmlwdGhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSBwMnNoLXAyd3BraDogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy53aXRuZXNzU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLkJ1ZmZlciwgc2lnblBhcmFtcy5yZWRlZW1TY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHJlZGVlbVNjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVzLlNhdG9zaGksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayc2gtcDJtcyc6XG4gICAgY2FzZSAncDJzaC1wMnBrJzpcbiAgICBjYXNlICdwMnNoLXAycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3NjcmlwdGhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSAke3Bvc1R5cGV9OiAke3ByZXZPdXRUeXBlfWApO1xuICAgICAgfVxuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayd3NoLXAybXMnOlxuICAgIGNhc2UgJ3Ayd3NoLXAycGsnOlxuICAgIGNhc2UgJ3Ayd3NoLXAycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3dpdG5lc3NzY3JpcHRoYXNoJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnB1dCAjJHtzaWduUGFyYW1zLnZpbn0gaXMgbm90IG9mIHR5cGUgJHtwb3NUeXBlfTogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UudmFsdWUodW5kZWZpbmVkKSwgc2lnblBhcmFtcy5yZWRlZW1TY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIE5PIHJlZGVlbVNjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVzLlNhdG9zaGksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Ayc2gtcDJ3c2gtcDJtcyc6XG4gICAgY2FzZSAncDJzaC1wMndzaC1wMnBrJzpcbiAgICBjYXNlICdwMnNoLXAyd3NoLXAycGtoJzpcbiAgICAgIGlmIChwcmV2T3V0VHlwZSAmJiBwcmV2T3V0VHlwZSAhPT0gJ3NjcmlwdGhhc2gnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0ICMke3NpZ25QYXJhbXMudmlufSBpcyBub3Qgb2YgdHlwZSAke3Bvc1R5cGV9OiAke3ByZXZPdXRUeXBlfWApO1xuICAgICAgfVxuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS5CdWZmZXIsIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS5CdWZmZXIsIHNpZ25QYXJhbXMucmVkZWVtU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyB3aXRuZXNzU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZXMuU2F0b3NoaSwgc2lnblBhcmFtcy53aXRuZXNzVmFsdWUsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3AydHInOlxuICAgICAgaWYgKHByZXZPdXRUeXBlICYmIHByZXZPdXRUeXBlICE9PSAndGFwcm9vdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW5wdXQgIyR7c2lnblBhcmFtcy52aW59IGlzIG5vdCBvZiB0eXBlICR7cG9zVHlwZX06ICR7cHJldk91dFR5cGV9YCk7XG4gICAgICB9XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1NjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gd2l0bmVzc1NjcmlwdGApO1xuICAgICAgdGZNZXNzYWdlKHR5cGVmb3JjZS52YWx1ZSh1bmRlZmluZWQpLCBzaWduUGFyYW1zLnJlZGVlbVNjcmlwdCwgYCR7cG9zVHlwZX0gcmVxdWlyZXMgTk8gcmVkZWVtU2NyaXB0YCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMud2l0bmVzc1ZhbHVlLCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyB3aXRuZXNzVmFsdWVgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3AydHItcDJucyc6XG4gICAgICBpZiAocHJldk91dFR5cGUgJiYgcHJldk91dFR5cGUgIT09ICd0YXByb290Jykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnB1dCAjJHtzaWduUGFyYW1zLnZpbn0gaXMgbm90IG9mIHR5cGUgJHtwb3NUeXBlfTogJHtwcmV2T3V0VHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIGlucHV0c1tzaWduUGFyYW1zLnZpbl0ucHJldk91dFR5cGUgPSBpbnB1dHNbc2lnblBhcmFtcy52aW5dLnByZXZPdXRUeXBlIHx8ICd0YXByb290JztcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLndpdG5lc3NTY3JpcHQsIGAke3Bvc1R5cGV9IHJlcXVpcmVzIHdpdG5lc3NTY3JpcHRgKTtcbiAgICAgIHRmTWVzc2FnZSh0eXBlZm9yY2UuQnVmZmVyLCBzaWduUGFyYW1zLmNvbnRyb2xCbG9jaywgYCR7cG9zVHlwZX0gcmVxdWlyZXMgY29udHJvbEJsb2NrYCk7XG4gICAgICB0Zk1lc3NhZ2UodHlwZWZvcmNlLnZhbHVlKHVuZGVmaW5lZCksIHNpZ25QYXJhbXMucmVkZWVtU2NyaXB0LCBgJHtwb3NUeXBlfSByZXF1aXJlcyBOTyByZWRlZW1TY3JpcHRgKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRyeVNpZ248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oe1xuICBpbnB1dCxcbiAgb3VyUHViS2V5LFxuICBrZXlQYWlyLFxuICBzaWduYXR1cmVIYXNoLFxuICBoYXNoVHlwZSxcbiAgdXNlTG93UixcbiAgdGFwdHJlZVJvb3QsXG59OiBTaWduaW5nRGF0YTxUTnVtYmVyPik6IHZvaWQge1xuICBpZiAoaW5wdXQud2l0bmVzc1ZlcnNpb24gPT09IDEgJiYgb3VyUHViS2V5Lmxlbmd0aCA9PT0gMzMpIG91clB1YktleSA9IG91clB1YktleS5zbGljZSgxKTtcbiAgLy8gZW5mb3JjZSBpbiBvcmRlciBzaWduaW5nIG9mIHB1YmxpYyBrZXlzXG4gIGxldCBzaWduZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaSwgcHViS2V5XSBvZiBpbnB1dC5wdWJrZXlzIS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoIW91clB1YktleS5lcXVhbHMocHViS2V5ISkpIGNvbnRpbnVlO1xuICAgIGlmIChpbnB1dC5zaWduYXR1cmVzIVtpXSAmJiBpbnB1dC5zaWduYXR1cmVzIVtpXSEubGVuZ3RoID4gMCkgdGhyb3cgbmV3IEVycm9yKCdTaWduYXR1cmUgYWxyZWFkeSBleGlzdHMnKTtcblxuICAgIC8vIFRPRE86IGFkZCB0ZXN0c1xuICAgIGlmIChvdXJQdWJLZXkubGVuZ3RoICE9PSAzMyAmJiBpbnB1dC53aXRuZXNzVmVyc2lvbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCSVAxNDMgKFdpdG5lc3MgdjApIGlucHV0cyByZXF1aXJlIGNvbXByZXNzZWQgcHVia2V5cycpO1xuICAgIH0gZWxzZSBpZiAob3VyUHViS2V5Lmxlbmd0aCAhPT0gMzIgJiYgaW5wdXQud2l0bmVzc1ZlcnNpb24gPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQklQMzQxIChXaXRuZXNzIHYxKSBpbnB1dHMgcmVxdWlyZSB4LW9ubHkgcHVia2V5cycpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC53aXRuZXNzVmVyc2lvbiA9PT0gMSkge1xuICAgICAgaWYgKCFpbnB1dC53aXRuZXNzU2NyaXB0KSB7XG4gICAgICAgIC8vIEZJWE1FOiBXb3JrYXJvdW5kIGZvciBub3QgaGF2aW5nIHByb3BlciB0d2Vha2luZyBzdXBwb3J0IGZvciBrZXkgcGF0aFxuICAgICAgICBpZiAoIWtleVBhaXIucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBrZXlwYWlyYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IHRhcHJvb3QudGFwVHdlYWtQcml2a2V5KGVjY0xpYiwgb3VyUHViS2V5LCBrZXlQYWlyLnByaXZhdGVLZXksIHRhcHRyZWVSb290KTtcbiAgICAgICAga2V5UGFpciA9IEVDUGFpci5mcm9tUHJpdmF0ZUtleShCdWZmZXIuZnJvbShwcml2YXRlS2V5KSk7XG4gICAgICB9XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYml0Y29pbi9iaXBzL2Jsb2IvbWFzdGVyL2JpcC0wMzQxLm1lZGlhd2lraSNjb21tb24tc2lnbmF0dXJlLW1lc3NhZ2VcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnblNjaG5vcnIoc2lnbmF0dXJlSGFzaCk7XG4gICAgICAvLyBTSUdIQVNIX0RFRkFVTFQgaXMgb21pdHRlZCBmcm9tIHRoZSBzaWduYXR1cmVcbiAgICAgIGlmIChoYXNoVHlwZSA9PT0gVHJhbnNhY3Rpb24uU0lHSEFTSF9ERUZBVUxUKSB7XG4gICAgICAgIGlucHV0LnNpZ25hdHVyZXMhW2ldID0gQnVmZmVyLmZyb20oc2lnbmF0dXJlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlucHV0LnNpZ25hdHVyZXMhW2ldID0gQnVmZmVyLmNvbmNhdChbc2lnbmF0dXJlLCBCdWZmZXIub2YoaGFzaFR5cGUpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnbihzaWduYXR1cmVIYXNoLCB1c2VMb3dSKTtcbiAgICAgIGlucHV0LnNpZ25hdHVyZXMhW2ldID0gYnNjcmlwdC5zaWduYXR1cmUuZW5jb2RlKHNpZ25hdHVyZSwgaGFzaFR5cGUpO1xuICAgIH1cbiAgICBzaWduZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFzaWduZWQpIHRocm93IG5ldyBFcnJvcignS2V5IHBhaXIgY2Fubm90IHNpZ24gZm9yIHRoaXMgaW5wdXQnKTtcbn1cblxuaW50ZXJmYWNlIFNpZ25pbmdEYXRhPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgaW5wdXQ6IFR4YklucHV0PFROdW1iZXI+O1xuICBvdXJQdWJLZXk6IEJ1ZmZlcjtcbiAga2V5UGFpcjogU2lnbmVyO1xuICBzaWduYXR1cmVIYXNoOiBCdWZmZXI7XG4gIGhhc2hUeXBlOiBudW1iZXI7XG4gIHVzZUxvd1I6IGJvb2xlYW47XG4gIHRhcHRyZWVSb290PzogQnVmZmVyO1xufVxuXG50eXBlIEhhc2hUeXBlQ2hlY2sgPSAoaGFzaFR5cGU6IG51bWJlcikgPT4gYm9vbGVhbjtcblxuZnVuY3Rpb24gZ2V0U2lnbmluZ0RhdGE8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIGlucHV0czogQXJyYXk8VHhiSW5wdXQ8VE51bWJlcj4+LFxuICBuZWVkc091dHB1dHM6IEhhc2hUeXBlQ2hlY2ssXG4gIHR4OiBUcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgc2lnblBhcmFtczogbnVtYmVyIHwgVHhiU2lnbkFyZzxUTnVtYmVyPixcbiAga2V5UGFpcj86IFNpZ25lcixcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyLFxuICBoYXNoVHlwZT86IG51bWJlcixcbiAgd2l0bmVzc1ZhbHVlPzogVE51bWJlcixcbiAgd2l0bmVzc1NjcmlwdD86IEJ1ZmZlcixcbiAgY29udHJvbEJsb2NrPzogQnVmZmVyLFxuICBhbm5leD86IEJ1ZmZlcixcbiAgdXNlTG93Uj86IGJvb2xlYW5cbik6IFNpZ25pbmdEYXRhPFROdW1iZXI+IHtcbiAgbGV0IHZpbjogbnVtYmVyO1xuICBpZiAodHlwZW9mIHNpZ25QYXJhbXMgPT09ICdudW1iZXInKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RFUFJFQ0FURUQ6IFRyYW5zYWN0aW9uQnVpbGRlciBzaWduIG1ldGhvZCBhcmd1bWVudHMgJyArICd3aWxsIGNoYW5nZSBpbiB2NiwgcGxlYXNlIHVzZSB0aGUgVHhiU2lnbkFyZyBpbnRlcmZhY2UnXG4gICAgKTtcbiAgICB2aW4gPSBzaWduUGFyYW1zO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzaWduUGFyYW1zID09PSAnb2JqZWN0Jykge1xuICAgIGNoZWNrU2lnbkFyZ3M8VE51bWJlcj4oaW5wdXRzLCBzaWduUGFyYW1zKTtcbiAgICAoeyB2aW4sIGtleVBhaXIsIHJlZGVlbVNjcmlwdCwgaGFzaFR5cGUsIHdpdG5lc3NWYWx1ZSwgd2l0bmVzc1NjcmlwdCwgY29udHJvbEJsb2NrLCBhbm5leCB9ID0gc2lnblBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVHJhbnNhY3Rpb25CdWlsZGVyIHNpZ24gZmlyc3QgYXJnIG11c3QgYmUgVHhiU2lnbkFyZyBvciBudW1iZXInKTtcbiAgfVxuICBpZiAoa2V5UGFpciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzaWduIHJlcXVpcmVzIGtleXBhaXInKTtcbiAgfVxuICBpZiAoIWlucHV0c1t2aW5dKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGlucHV0IGF0IGluZGV4OiAnICsgdmluKTtcblxuICBjb25zdCBpbnB1dCA9IGlucHV0c1t2aW5dO1xuXG4gIC8vIGlmIHJlZGVlbVNjcmlwdCB3YXMgcHJldmlvdXNseSBwcm92aWRlZCwgZW5mb3JjZSBjb25zaXN0ZW5jeVxuICBpZiAoaW5wdXQucmVkZWVtU2NyaXB0ICE9PSB1bmRlZmluZWQgJiYgcmVkZWVtU2NyaXB0ICYmICFpbnB1dC5yZWRlZW1TY3JpcHQuZXF1YWxzKHJlZGVlbVNjcmlwdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29uc2lzdGVudCByZWRlZW1TY3JpcHQnKTtcbiAgfVxuXG4gIGNvbnN0IG91clB1YktleSA9IGtleVBhaXIucHVibGljS2V5IHx8IChrZXlQYWlyLmdldFB1YmxpY0tleSAmJiBrZXlQYWlyLmdldFB1YmxpY0tleSgpKTtcbiAgaWYgKCFjYW5TaWduPFROdW1iZXI+KGlucHV0KSkge1xuICAgIGlmICh3aXRuZXNzVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlucHV0LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgaW5wdXQudmFsdWUgIT09IHdpdG5lc3NWYWx1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRpZCBub3QgbWF0Y2ggd2l0bmVzc1ZhbHVlJyk7XG4gICAgICB9XG4gICAgICB0eXBlZm9yY2UodHlwZXMuU2F0b3NoaSwgd2l0bmVzc1ZhbHVlKTtcbiAgICAgIGlucHV0LnZhbHVlID0gd2l0bmVzc1ZhbHVlO1xuICAgIH1cblxuICAgIGlmICghY2FuU2lnbjxUTnVtYmVyPihpbnB1dCkpIHtcbiAgICAgIGNvbnN0IHByZXBhcmVkID0gcHJlcGFyZUlucHV0PFROdW1iZXI+KGlucHV0LCBvdXJQdWJLZXksIHJlZGVlbVNjcmlwdCwgd2l0bmVzc1NjcmlwdCwgY29udHJvbEJsb2NrLCBhbm5leCk7XG5cbiAgICAgIC8vIHVwZGF0ZXMgaW5saW5lXG4gICAgICBPYmplY3QuYXNzaWduKGlucHV0LCBwcmVwYXJlZCk7XG4gICAgfVxuXG4gICAgaWYgKCFjYW5TaWduPFROdW1iZXI+KGlucHV0KSkgdGhyb3cgRXJyb3IoaW5wdXQucHJldk91dFR5cGUgKyAnIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuXG4gIC8vIGhhc2hUeXBlIGNhbiBiZSAwIGluIFRhcHJvb3QsIHNvIGNhbid0IHVzZSBoYXNoVHlwZSB8fCBTSUdIQVNIX0FMTFxuICBpZiAoaW5wdXQud2l0bmVzc1ZlcnNpb24gPT09IDEpIHtcbiAgICBoYXNoVHlwZSA9IGhhc2hUeXBlID09PSB1bmRlZmluZWQgPyBUcmFuc2FjdGlvbi5TSUdIQVNIX0RFRkFVTFQgOiBoYXNoVHlwZTtcbiAgfSBlbHNlIHtcbiAgICBoYXNoVHlwZSA9IGhhc2hUeXBlIHx8IFRyYW5zYWN0aW9uLlNJR0hBU0hfQUxMO1xuICB9XG4gIGlmIChuZWVkc091dHB1dHMoaGFzaFR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIG5lZWRzIG91dHB1dHMnKTtcblxuICAvLyBUT0RPOiBUaGlzIGlzIG5vdCB0aGUgYmVzdCBwbGFjZSB0byBkbyB0aGlzLCBidXQgbWlnaHQgc3RpY2sgd2l0aCBpdCB1bnRpbCBQU0JUXG4gIGxldCBsZWFmSGFzaDtcbiAgbGV0IHRhcHRyZWVSb290O1xuICBpZiAoY29udHJvbEJsb2NrICYmIHdpdG5lc3NTY3JpcHQpIHtcbiAgICBsZWFmSGFzaCA9IHRhcHJvb3QuZ2V0VGFwbGVhZkhhc2goZWNjTGliLCBjb250cm9sQmxvY2ssIHdpdG5lc3NTY3JpcHQpO1xuICAgIHRhcHRyZWVSb290ID0gdGFwcm9vdC5nZXRUYXB0cmVlUm9vdChlY2NMaWIsIGNvbnRyb2xCbG9jaywgd2l0bmVzc1NjcmlwdCwgbGVhZkhhc2gpO1xuICB9XG5cbiAgLy8gcmVhZHkgdG8gc2lnblxuICBsZXQgc2lnbmF0dXJlSGFzaDogQnVmZmVyO1xuICBzd2l0Y2ggKGlucHV0LndpdG5lc3NWZXJzaW9uKSB7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBzaWduYXR1cmVIYXNoID0gdHguaGFzaEZvclNpZ25hdHVyZSh2aW4sIGlucHV0LnNpZ25TY3JpcHQgYXMgQnVmZmVyLCBoYXNoVHlwZSwgaW5wdXQudmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAwOlxuICAgICAgc2lnbmF0dXJlSGFzaCA9IHR4Lmhhc2hGb3JXaXRuZXNzVjAodmluLCBpbnB1dC5zaWduU2NyaXB0IGFzIEJ1ZmZlciwgaW5wdXQudmFsdWUgYXMgVE51bWJlciwgaGFzaFR5cGUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc2lnbmF0dXJlSGFzaCA9IHR4Lmhhc2hGb3JXaXRuZXNzVjEoXG4gICAgICAgIHZpbixcbiAgICAgICAgaW5wdXRzLm1hcCgoeyBwcmV2T3V0U2NyaXB0IH0pID0+IHByZXZPdXRTY3JpcHQgYXMgQnVmZmVyKSxcbiAgICAgICAgaW5wdXRzLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSBhcyBUTnVtYmVyKSxcbiAgICAgICAgaGFzaFR5cGUsXG4gICAgICAgIGxlYWZIYXNoXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vuc3VwcG9ydGVkIHdpdG5lc3MgdmVyc2lvbicpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpbnB1dCxcbiAgICBvdXJQdWJLZXksXG4gICAga2V5UGFpcixcbiAgICBzaWduYXR1cmVIYXNoLFxuICAgIGhhc2hUeXBlLFxuICAgIHVzZUxvd1I6ICEhdXNlTG93UixcbiAgICB0YXB0cmVlUm9vdCxcbiAgfTtcbn1cbiJdfQ==