@bitgo-beta/unspents 0.13.2-beta.52 → 0.13.2-beta.521

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/.mocharc.js +1 -1
  2. package/CHANGELOG.md +459 -0
  3. package/bin/generate_tables.ts +94 -0
  4. package/dist/bin/generate_tables.d.ts +2 -0
  5. package/dist/bin/generate_tables.d.ts.map +1 -0
  6. package/dist/bin/generate_tables.js +98 -0
  7. package/dist/{codes.d.ts → src/codes.d.ts} +3 -2
  8. package/dist/src/codes.d.ts.map +1 -0
  9. package/dist/src/codes.js +172 -0
  10. package/dist/{dimensions.d.ts → src/dimensions.d.ts} +5 -3
  11. package/dist/src/dimensions.d.ts.map +1 -0
  12. package/dist/src/dimensions.js +492 -0
  13. package/dist/{index.d.ts → src/index.d.ts} +1 -0
  14. package/dist/src/index.d.ts.map +1 -0
  15. package/dist/{index.js → src/index.js} +6 -2
  16. package/dist/{inputWeights.d.ts → src/inputWeights.d.ts} +4 -3
  17. package/dist/src/inputWeights.d.ts.map +1 -0
  18. package/dist/src/inputWeights.js +97 -0
  19. package/dist/{scriptSizes.d.ts → src/scriptSizes.d.ts} +1 -0
  20. package/dist/src/scriptSizes.d.ts.map +1 -0
  21. package/dist/src/scriptSizes.js +51 -0
  22. package/dist/{types.d.ts → src/types.d.ts} +1 -0
  23. package/dist/src/types.d.ts.map +1 -0
  24. package/dist/{types.js → src/types.js} +6 -2
  25. package/dist/{virtualSizes.d.ts → src/virtualSizes.d.ts} +13 -12
  26. package/dist/src/virtualSizes.d.ts.map +1 -0
  27. package/dist/src/virtualSizes.js +114 -0
  28. package/dist/src/zcash.d.ts +9 -0
  29. package/dist/src/zcash.d.ts.map +1 -0
  30. package/dist/src/zcash.js +24 -0
  31. package/dist/test/chain.d.ts +2 -0
  32. package/dist/test/chain.d.ts.map +1 -0
  33. package/dist/test/chain.js +92 -0
  34. package/dist/test/dimensions.d.ts +2 -0
  35. package/dist/test/dimensions.d.ts.map +1 -0
  36. package/dist/test/dimensions.js +225 -0
  37. package/dist/test/signedTx/inputWeights.d.ts +2 -0
  38. package/dist/test/signedTx/inputWeights.d.ts.map +1 -0
  39. package/dist/test/signedTx/inputWeights.js +117 -0
  40. package/dist/test/signedTx/txCombinations.d.ts +3 -0
  41. package/dist/test/signedTx/txCombinations.d.ts.map +1 -0
  42. package/dist/test/signedTx/txCombinations.js +120 -0
  43. package/dist/test/signedTx/txGen.d.ts +75 -0
  44. package/dist/test/signedTx/txGen.d.ts.map +1 -0
  45. package/dist/test/signedTx/txGen.js +223 -0
  46. package/dist/test/testutils.d.ts +36 -0
  47. package/dist/test/testutils.d.ts.map +1 -0
  48. package/dist/test/testutils.js +180 -0
  49. package/dist/test/virtualSizes.d.ts +2 -0
  50. package/dist/test/virtualSizes.d.ts.map +1 -0
  51. package/dist/test/virtualSizes.js +18 -0
  52. package/dist/test/zcash.d.ts +2 -0
  53. package/dist/test/zcash.d.ts.map +1 -0
  54. package/dist/test/zcash.js +60 -0
  55. package/dist/tsconfig.build.tsbuildinfo +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -0
  57. package/docs/input-costs.md +13 -0
  58. package/package.json +7 -7
  59. package/dist/codes.js +0 -168
  60. package/dist/dimensions.js +0 -485
  61. package/dist/inputWeights.js +0 -97
  62. package/dist/scriptSizes.js +0 -51
  63. package/dist/virtualSizes.js +0 -114
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
27
+ const should = __importStar(require("should"));
28
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
29
+ const { chainCodes, chainCodesP2sh, chainCodesP2shP2wsh, chainCodesP2tr, chainCodesP2trMusig2, chainCodesP2wsh } = utxo_lib_1.bitgo;
30
+ const src_1 = require("../src");
31
+ const testutils_1 = require("./testutils");
32
+ describe('Dimensions Attributes', function () {
33
+ it('has read-only nInputs and nOutputs', function () {
34
+ should.throws(() => (src_1.Dimensions.ZERO.nInputs = 1), /read-only/);
35
+ should.throws(() => (src_1.Dimensions.ZERO.nOutputs = 1), /read-only/);
36
+ });
37
+ });
38
+ describe('Output Dimensions', function () {
39
+ it('instantiates', function () {
40
+ const dims = new src_1.OutputDimensions({ size: 0, count: 0 });
41
+ should.throws(() => (dims.count += 1));
42
+ });
43
+ });
44
+ describe('Dimensions Arithmetic', function () {
45
+ it('sums correctly', function () {
46
+ src_1.Dimensions.zero()
47
+ .plus({ nP2shInputs: 1 })
48
+ .should.eql(new src_1.Dimensions({
49
+ nP2shInputs: 1,
50
+ nP2shP2wshInputs: 0,
51
+ nP2wshInputs: 0,
52
+ nP2trKeypathInputs: 0,
53
+ nP2trScriptPathLevel1Inputs: 0,
54
+ nP2trScriptPathLevel2Inputs: 0,
55
+ nP2shP2pkInputs: 0,
56
+ outputs: { size: 0, count: 0 },
57
+ }));
58
+ const components = [
59
+ { nP2shInputs: 1 },
60
+ { nP2shP2wshInputs: 2 },
61
+ { nP2wshInputs: 3 },
62
+ { nP2trKeypathInputs: 4 },
63
+ { nP2trScriptPathLevel1Inputs: 5 },
64
+ { nP2trScriptPathLevel2Inputs: 6 },
65
+ { outputs: { size: 23, count: 1 } },
66
+ { outputs: { size: 44, count: 2 } },
67
+ { outputs: { size: 0, count: 0 } },
68
+ ];
69
+ components.forEach((component) => should.doesNotThrow(() => src_1.Dimensions.sum(component)));
70
+ const sum = components.reduce((a, b) => a.plus(b), src_1.Dimensions.zero());
71
+ sum.should.eql(src_1.Dimensions.sum(...components));
72
+ sum.should.eql(new src_1.Dimensions({
73
+ nP2shInputs: 1,
74
+ nP2shP2wshInputs: 2,
75
+ nP2wshInputs: 3,
76
+ nP2trKeypathInputs: 4,
77
+ nP2trScriptPathLevel1Inputs: 5,
78
+ nP2trScriptPathLevel2Inputs: 6,
79
+ nP2shP2pkInputs: 0,
80
+ outputs: { size: 67, count: 3 },
81
+ }));
82
+ sum.nOutputs.should.eql(sum.outputs.count);
83
+ });
84
+ it('provides some typical output sizes', function () {
85
+ [
86
+ [src_1.Dimensions.SingleOutput.p2sh, src_1.VirtualSizes.txP2shOutputSize],
87
+ [src_1.Dimensions.SingleOutput.p2shP2wsh, src_1.VirtualSizes.txP2shP2wshOutputSize],
88
+ [src_1.Dimensions.SingleOutput.p2wsh, src_1.VirtualSizes.txP2wshOutputSize],
89
+ [src_1.Dimensions.SingleOutput.p2pkh, src_1.VirtualSizes.txP2pkhOutputSize],
90
+ [src_1.Dimensions.SingleOutput.p2wpkh, src_1.VirtualSizes.txP2wpkhOutputSize],
91
+ [src_1.Dimensions.SingleOutput.p2tr, src_1.VirtualSizes.txP2trOutputSize],
92
+ ].forEach(([dims, size]) => {
93
+ dims.getOutputsVSize().should.eql(size);
94
+ });
95
+ });
96
+ it('prevents sum of invalid data', function () {
97
+ should.doesNotThrow(() => src_1.Dimensions.sum({ outputs: { count: 0, size: 0 } }));
98
+ should.doesNotThrow(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 1 } }));
99
+ should.throws(() => src_1.Dimensions.sum({ nOutputs: 1 }));
100
+ should.throws(() => src_1.Dimensions.sum({ nOutputs: 1, outputs: { count: 2, size: 1 } }));
101
+ // @ts-ignore
102
+ should.throws(() => src_1.Dimensions.sum({ nP2shInputs: 1 }, { nP2shInputs: 'foo' }));
103
+ should.throws(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 0 } }));
104
+ should.throws(() => src_1.Dimensions.sum({ outputs: { count: 0, size: 1 } }));
105
+ should.throws(() => src_1.Dimensions.sum({ outputs: { count: 1, size: 1 } }, { outputs: { count: 1, size: 0 } }));
106
+ });
107
+ it('counts inputs correctly', function () {
108
+ Object.entries(src_1.Dimensions.SingleInput).forEach(([key, value]) => {
109
+ value.nInputs.should.eql(1, key);
110
+ });
111
+ });
112
+ it('multiplies correctly', function () {
113
+ const d = new src_1.Dimensions({
114
+ nP2shInputs: 1,
115
+ nP2shP2wshInputs: 2,
116
+ nP2wshInputs: 3,
117
+ nP2trKeypathInputs: 4,
118
+ nP2trScriptPathLevel1Inputs: 5,
119
+ nP2trScriptPathLevel2Inputs: 6,
120
+ nP2shP2pkInputs: 7,
121
+ outputs: { count: 1, size: 22 },
122
+ }).times(3);
123
+ d.should.eql(new src_1.Dimensions({
124
+ nP2shInputs: 3,
125
+ nP2shP2wshInputs: 6,
126
+ nP2wshInputs: 9,
127
+ nP2trKeypathInputs: 12,
128
+ nP2trScriptPathLevel1Inputs: 15,
129
+ nP2trScriptPathLevel2Inputs: 18,
130
+ nP2shP2pkInputs: 21,
131
+ outputs: { count: 3, size: 66 },
132
+ }));
133
+ d.getNInputs().should.eql(84);
134
+ d.nInputs.should.eql(84);
135
+ });
136
+ });
137
+ describe('Dimensions from unspent types', function () {
138
+ it('determines unspent size according to chain', function () {
139
+ chainCodesP2sh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2shInputs: 1 })));
140
+ chainCodesP2shP2wsh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2shP2wshInputs: 1 })));
141
+ chainCodesP2wsh.forEach((chain) => src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2wshInputs: 1 })));
142
+ chainCodesP2tr.forEach((chain) => {
143
+ src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel2Inputs: 1 }));
144
+ src_1.Dimensions.fromUnspent({ chain }, { p2tr: { scriptPathLevel: 1 }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 }));
145
+ });
146
+ chainCodesP2trMusig2.forEach((chain) => {
147
+ src_1.Dimensions.fromUnspent({ chain }).should.eql(src_1.Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 }));
148
+ src_1.Dimensions.fromUnspent({ chain }, { p2tr: { scriptPathLevel: undefined }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(src_1.Dimensions.sum({ nP2trKeypathInputs: 1 }));
149
+ });
150
+ src_1.Dimensions.fromUnspents(chainCodes.map((chain) => ({ chain }))).should.eql(new src_1.Dimensions({
151
+ nP2shP2wshInputs: 2,
152
+ nP2shInputs: 2,
153
+ nP2wshInputs: 2,
154
+ nP2trKeypathInputs: 0,
155
+ nP2trScriptPathLevel1Inputs: 2,
156
+ nP2trScriptPathLevel2Inputs: 2,
157
+ nP2shP2pkInputs: 0,
158
+ outputs: { count: 0, size: 0 },
159
+ }));
160
+ src_1.Dimensions.fromUnspents(chainCodes.map((chain) => ({ chain })), { p2tr: { scriptPathLevel: 1 }, p2trMusig2: { scriptPathLevel: undefined } }).should.eql(new src_1.Dimensions({
161
+ nP2shP2wshInputs: 2,
162
+ nP2shInputs: 2,
163
+ nP2wshInputs: 2,
164
+ nP2trKeypathInputs: 2,
165
+ nP2trScriptPathLevel1Inputs: 2,
166
+ nP2trScriptPathLevel2Inputs: 0,
167
+ nP2shP2pkInputs: 0,
168
+ outputs: { count: 0, size: 0 },
169
+ }));
170
+ });
171
+ it('calculates output dimensions dynamically', function () {
172
+ const expectedSizes = new Map([
173
+ [testutils_1.UnspentTypeScript2of3.p2sh, src_1.VirtualSizes.txP2shOutputSize],
174
+ [testutils_1.UnspentTypeScript2of3.p2shP2wsh, src_1.VirtualSizes.txP2shP2wshOutputSize],
175
+ [testutils_1.UnspentTypeScript2of3.p2wsh, src_1.VirtualSizes.txP2wshOutputSize],
176
+ [testutils_1.UnspentTypeScript2of3.p2tr, src_1.VirtualSizes.txP2trOutputSize],
177
+ [testutils_1.UnspentTypeScript2of3.p2trMusig2, src_1.VirtualSizes.txP2trOutputSize],
178
+ [testutils_1.UnspentTypeScript2of3.taprootKeyPathSpend, src_1.VirtualSizes.txP2trOutputSize],
179
+ [testutils_1.UnspentTypePubKeyHash.p2pkh, src_1.VirtualSizes.txP2pkhOutputSize],
180
+ [testutils_1.UnspentTypePubKeyHash.p2wpkh, src_1.VirtualSizes.txP2wpkhOutputSize],
181
+ ]);
182
+ [...Object.keys(testutils_1.UnspentTypeScript2of3), ...Object.keys(testutils_1.UnspentTypePubKeyHash)].forEach((type) => (0, testutils_1.getOutputDimensionsForUnspentType)(type).outputs.size.should.eql(expectedSizes.get(type)));
183
+ });
184
+ });
185
+ describe('Dimensions estimates', function () {
186
+ it('calculates vsizes', function () {
187
+ function dim(nP2shInputs, nP2shP2wshInputs, nP2wshInputs, nOutputs) {
188
+ return src_1.Dimensions.sum({
189
+ nP2shInputs,
190
+ nP2shP2wshInputs,
191
+ nP2wshInputs,
192
+ }, (0, testutils_1.getOutputDimensionsForUnspentType)(testutils_1.UnspentTypePubKeyHash.p2pkh).times(nOutputs));
193
+ }
194
+ function dimP2tr(nP2trKeypathInputs, nP2trScriptPathLevel1Inputs, nP2trScriptPathLevel2Inputs, nOutputs) {
195
+ return src_1.Dimensions.sum({
196
+ nP2trKeypathInputs,
197
+ nP2trScriptPathLevel1Inputs,
198
+ nP2trScriptPathLevel2Inputs,
199
+ }, (0, testutils_1.getOutputDimensionsForUnspentType)(testutils_1.UnspentTypePubKeyHash.p2pkh).times(nOutputs));
200
+ }
201
+ const vectors = [
202
+ [dim(1, 0, 0, 1), [false, 10, 298, 34, 342]],
203
+ [dim(0, 1, 0, 1), [true, 11, 140, 34, 185]],
204
+ [dim(0, 0, 1, 1), [true, 11, 105, 34, 150]],
205
+ [dim(2, 0, 0, 1), [false, 10, 596, 34, 640]],
206
+ [dim(0, 2, 0, 1), [true, 11, 280, 34, 325]],
207
+ [dim(0, 0, 2, 1), [true, 11, 210, 34, 255]],
208
+ [dim(1, 1, 1, 1), [true, 11, 543, 34, 588]],
209
+ [dim(1, 1, 1, 2), [true, 11, 543, 68, 622]],
210
+ [dimP2tr(1, 0, 0, 1), [true, 11, 58, 34, 103]],
211
+ [dimP2tr(0, 1, 0, 1), [true, 11, 108, 34, 153]],
212
+ [dimP2tr(0, 0, 1, 1), [true, 11, 116, 34, 161]],
213
+ ];
214
+ vectors.forEach(([dimensions, props]) => {
215
+ [
216
+ dimensions.isSegwit(),
217
+ dimensions.getOverheadVSize(),
218
+ dimensions.getInputsVSize(),
219
+ dimensions.getOutputsVSize(),
220
+ dimensions.getVSize(),
221
+ ].should.eql(props);
222
+ });
223
+ });
224
+ });
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZGltZW5zaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQXNEO0FBQ3RELCtDQUFpQztBQUNqQyxtREFBNkM7QUFDN0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxHQUM5RyxnQkFBSyxDQUFDO0FBQ1IsZ0NBQW9FO0FBRXBFLDJDQUE4RztBQUU5RyxRQUFRLENBQUMsdUJBQXVCLEVBQUU7SUFDaEMsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBRSxnQkFBVSxDQUFDLElBQVksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDekUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFFLGdCQUFVLENBQUMsSUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFO0lBQzVCLEVBQUUsQ0FBQyxjQUFjLEVBQUU7UUFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxzQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLHVC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QUE4QjtZQUN6QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUUzQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNoRCxDQUFDO1FBRUYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDdEM7Z0JBQ0UsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsVUFBVSxDQUFDLGdCQUFnQixFQUFFO2dCQUM3QixVQUFVLENBQUMsY0FBYyxFQUFFO2dCQUMzQixVQUFVLENBQUMsZUFBZSxFQUFFO2dCQUM1QixVQUFVLENBQUMsUUFBUSxFQUFFO2FBQ3RCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbmltcG9ydCAqIGFzIHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgYml0Z28gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5jb25zdCB7IGNoYWluQ29kZXMsIGNoYWluQ29kZXNQMnNoLCBjaGFpbkNvZGVzUDJzaFAyd3NoLCBjaGFpbkNvZGVzUDJ0ciwgY2hhaW5Db2Rlc1AydHJNdXNpZzIsIGNoYWluQ29kZXNQMndzaCB9ID1cbiAgYml0Z287XG5pbXBvcnQgeyBEaW1lbnNpb25zLCBPdXRwdXREaW1lbnNpb25zLCBWaXJ0dWFsU2l6ZXMgfSBmcm9tICcuLi9zcmMnO1xuXG5pbXBvcnQgeyBnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUsIFVuc3BlbnRUeXBlUHViS2V5SGFzaCwgVW5zcGVudFR5cGVTY3JpcHQyb2YzIH0gZnJvbSAnLi90ZXN0dXRpbHMnO1xuXG5kZXNjcmliZSgnRGltZW5zaW9ucyBBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKCkge1xuICBpdCgnaGFzIHJlYWQtb25seSBuSW5wdXRzIGFuZCBuT3V0cHV0cycsIGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGQudGhyb3dzKCgpID0+ICgoRGltZW5zaW9ucy5aRVJPIGFzIGFueSkubklucHV0cyA9IDEpLCAvcmVhZC1vbmx5Lyk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiAoKERpbWVuc2lvbnMuWkVSTyBhcyBhbnkpLm5PdXRwdXRzID0gMSksIC9yZWFkLW9ubHkvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ091dHB1dCBEaW1lbnNpb25zJywgZnVuY3Rpb24gKCkge1xuICBpdCgnaW5zdGFudGlhdGVzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGRpbXMgPSBuZXcgT3V0cHV0RGltZW5zaW9ucyh7IHNpemU6IDAsIGNvdW50OiAwIH0pO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gKGRpbXMuY291bnQgKz0gMSkpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRGltZW5zaW9ucyBBcml0aG1ldGljJywgZnVuY3Rpb24gKCkge1xuICBpdCgnc3VtcyBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgRGltZW5zaW9ucy56ZXJvKClcbiAgICAgIC5wbHVzKHsgblAyc2hJbnB1dHM6IDEgfSlcbiAgICAgIC5zaG91bGQuZXFsKFxuICAgICAgICBuZXcgRGltZW5zaW9ucyh7XG4gICAgICAgICAgblAyc2hJbnB1dHM6IDEsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogMCxcbiAgICAgICAgICBuUDJ3c2hJbnB1dHM6IDAsXG4gICAgICAgICAgblAydHJLZXlwYXRoSW5wdXRzOiAwLFxuICAgICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogMCxcbiAgICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDAsXG4gICAgICAgICAgblAyc2hQMnBrSW5wdXRzOiAwLFxuICAgICAgICAgIG91dHB1dHM6IHsgc2l6ZTogMCwgY291bnQ6IDAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gW1xuICAgICAgeyBuUDJzaElucHV0czogMSB9LFxuICAgICAgeyBuUDJzaFAyd3NoSW5wdXRzOiAyIH0sXG4gICAgICB7IG5QMndzaElucHV0czogMyB9LFxuICAgICAgeyBuUDJ0cktleXBhdGhJbnB1dHM6IDQgfSxcbiAgICAgIHsgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiA1IH0sXG4gICAgICB7IG5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0czogNiB9LFxuICAgICAgeyBvdXRwdXRzOiB7IHNpemU6IDIzLCBjb3VudDogMSB9IH0sXG4gICAgICB7IG91dHB1dHM6IHsgc2l6ZTogNDQsIGNvdW50OiAyIH0gfSxcbiAgICAgIHsgb3V0cHV0czogeyBzaXplOiAwLCBjb3VudDogMCB9IH0sXG4gICAgXTtcblxuICAgIGNvbXBvbmVudHMuZm9yRWFjaCgoY29tcG9uZW50KSA9PiBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IERpbWVuc2lvbnMuc3VtKGNvbXBvbmVudCkpKTtcblxuICAgIGNvbnN0IHN1bSA9IGNvbXBvbmVudHMucmVkdWNlKChhLCBiKSA9PiBhLnBsdXMoYiksIERpbWVuc2lvbnMuemVybygpKTtcblxuICAgIHN1bS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKC4uLmNvbXBvbmVudHMpKTtcblxuICAgIHN1bS5zaG91bGQuZXFsKFxuICAgICAgbmV3IERpbWVuc2lvbnMoe1xuICAgICAgICBuUDJzaElucHV0czogMSxcbiAgICAgICAgblAyc2hQMndzaElucHV0czogMixcbiAgICAgICAgblAyd3NoSW5wdXRzOiAzLFxuICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDQsXG4gICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogNSxcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiA2LFxuICAgICAgICBuUDJzaFAycGtJbnB1dHM6IDAsXG4gICAgICAgIG91dHB1dHM6IHsgc2l6ZTogNjcsIGNvdW50OiAzIH0sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBzdW0ubk91dHB1dHMuc2hvdWxkLmVxbChzdW0ub3V0cHV0cy5jb3VudCk7XG4gIH0pO1xuXG4gIGl0KCdwcm92aWRlcyBzb21lIHR5cGljYWwgb3V0cHV0IHNpemVzJywgZnVuY3Rpb24gKCkge1xuICAgIChcbiAgICAgIFtcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAyc2gsIFZpcnR1YWxTaXplcy50eFAyc2hPdXRwdXRTaXplXSxcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAyc2hQMndzaCwgVmlydHVhbFNpemVzLnR4UDJzaFAyd3NoT3V0cHV0U2l6ZV0sXG4gICAgICAgIFtEaW1lbnNpb25zLlNpbmdsZU91dHB1dC5wMndzaCwgVmlydHVhbFNpemVzLnR4UDJ3c2hPdXRwdXRTaXplXSxcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAycGtoLCBWaXJ0dWFsU2l6ZXMudHhQMnBraE91dHB1dFNpemVdLFxuICAgICAgICBbRGltZW5zaW9ucy5TaW5nbGVPdXRwdXQucDJ3cGtoLCBWaXJ0dWFsU2l6ZXMudHhQMndwa2hPdXRwdXRTaXplXSxcbiAgICAgICAgW0RpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAydHIsIFZpcnR1YWxTaXplcy50eFAydHJPdXRwdXRTaXplXSxcbiAgICAgIF0gYXMgW0RpbWVuc2lvbnMsIG51bWJlcl1bXVxuICAgICkuZm9yRWFjaCgoW2RpbXMsIHNpemVdKSA9PiB7XG4gICAgICBkaW1zLmdldE91dHB1dHNWU2l6ZSgpLnNob3VsZC5lcWwoc2l6ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdwcmV2ZW50cyBzdW0gb2YgaW52YWxpZCBkYXRhJywgZnVuY3Rpb24gKCkge1xuICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAwLCBzaXplOiAwIH0gfSkpO1xuICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAxIH0gfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBuT3V0cHV0czogMSB9KSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBEaW1lbnNpb25zLnN1bSh7IG5PdXRwdXRzOiAxLCBvdXRwdXRzOiB7IGNvdW50OiAyLCBzaXplOiAxIH0gfSkpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzaG91bGQudGhyb3dzKCgpID0+IERpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IDEgfSwgeyBuUDJzaElucHV0czogJ2ZvbycgfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAwIH0gfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAwLCBzaXplOiAxIH0gfSkpO1xuICAgIHNob3VsZC50aHJvd3MoKCkgPT4gRGltZW5zaW9ucy5zdW0oeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAxIH0gfSwgeyBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAwIH0gfSkpO1xuICB9KTtcblxuICBpdCgnY291bnRzIGlucHV0cyBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgT2JqZWN0LmVudHJpZXMoRGltZW5zaW9ucy5TaW5nbGVJbnB1dCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICB2YWx1ZS5uSW5wdXRzLnNob3VsZC5lcWwoMSwga2V5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ211bHRpcGxpZXMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGQgPSBuZXcgRGltZW5zaW9ucyh7XG4gICAgICBuUDJzaElucHV0czogMSxcbiAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDIsXG4gICAgICBuUDJ3c2hJbnB1dHM6IDMsXG4gICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDQsXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDUsXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDYsXG4gICAgICBuUDJzaFAycGtJbnB1dHM6IDcsXG4gICAgICBvdXRwdXRzOiB7IGNvdW50OiAxLCBzaXplOiAyMiB9LFxuICAgIH0pLnRpbWVzKDMpO1xuXG4gICAgZC5zaG91bGQuZXFsKFxuICAgICAgbmV3IERpbWVuc2lvbnMoe1xuICAgICAgICBuUDJzaElucHV0czogMyxcbiAgICAgICAgblAyc2hQMndzaElucHV0czogNixcbiAgICAgICAgblAyd3NoSW5wdXRzOiA5LFxuICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IDEyLFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDE1LFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDE4LFxuICAgICAgICBuUDJzaFAycGtJbnB1dHM6IDIxLFxuICAgICAgICBvdXRwdXRzOiB7IGNvdW50OiAzLCBzaXplOiA2NiB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgZC5nZXROSW5wdXRzKCkuc2hvdWxkLmVxbCg4NCk7XG4gICAgZC5uSW5wdXRzLnNob3VsZC5lcWwoODQpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRGltZW5zaW9ucyBmcm9tIHVuc3BlbnQgdHlwZXMnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdkZXRlcm1pbmVzIHVuc3BlbnQgc2l6ZSBhY2NvcmRpbmcgdG8gY2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgY2hhaW5Db2Rlc1Ayc2guZm9yRWFjaCgoY2hhaW4pID0+IERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoeyBjaGFpbiB9KS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IDEgfSkpKTtcblxuICAgIGNoYWluQ29kZXNQMnNoUDJ3c2guZm9yRWFjaCgoY2hhaW4pID0+XG4gICAgICBEaW1lbnNpb25zLmZyb21VbnNwZW50KHsgY2hhaW4gfSkuc2hvdWxkLmVxbChEaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJ3c2hJbnB1dHM6IDEgfSkpXG4gICAgKTtcblxuICAgIGNoYWluQ29kZXNQMndzaC5mb3JFYWNoKChjaGFpbikgPT5cbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoeyBjaGFpbiB9KS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAyd3NoSW5wdXRzOiAxIH0pKVxuICAgICk7XG5cbiAgICBjaGFpbkNvZGVzUDJ0ci5mb3JFYWNoKChjaGFpbikgPT4ge1xuICAgICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudCh7IGNoYWluIH0pLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDEgfSkpO1xuICAgICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudChcbiAgICAgICAgeyBjaGFpbiB9LFxuICAgICAgICB7IHAydHI6IHsgc2NyaXB0UGF0aExldmVsOiAxIH0sIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSB9XG4gICAgICApLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDEgfSkpO1xuICAgIH0pO1xuXG4gICAgY2hhaW5Db2Rlc1AydHJNdXNpZzIuZm9yRWFjaCgoY2hhaW4pID0+IHtcbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoeyBjaGFpbiB9KS5zaG91bGQuZXFsKERpbWVuc2lvbnMuc3VtKHsgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAxIH0pKTtcbiAgICAgIERpbWVuc2lvbnMuZnJvbVVuc3BlbnQoXG4gICAgICAgIHsgY2hhaW4gfSxcbiAgICAgICAgeyBwMnRyOiB7IHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIH0sIHAydHJNdXNpZzI6IHsgc2NyaXB0UGF0aExldmVsOiB1bmRlZmluZWQgfSB9XG4gICAgICApLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oeyBuUDJ0cktleXBhdGhJbnB1dHM6IDEgfSkpO1xuICAgIH0pO1xuXG4gICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudHMoY2hhaW5Db2Rlcy5tYXAoKGNoYWluKSA9PiAoeyBjaGFpbiB9KSkpLnNob3VsZC5lcWwoXG4gICAgICBuZXcgRGltZW5zaW9ucyh7XG4gICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnNoSW5wdXRzOiAyLFxuICAgICAgICBuUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnRyS2V5cGF0aElucHV0czogMCxcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAyLFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDIsXG4gICAgICAgIG5QMnNoUDJwa0lucHV0czogMCxcbiAgICAgICAgb3V0cHV0czogeyBjb3VudDogMCwgc2l6ZTogMCB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgRGltZW5zaW9ucy5mcm9tVW5zcGVudHMoXG4gICAgICBjaGFpbkNvZGVzLm1hcCgoY2hhaW4pID0+ICh7IGNoYWluIH0pKSxcbiAgICAgIHsgcDJ0cjogeyBzY3JpcHRQYXRoTGV2ZWw6IDEgfSwgcDJ0ck11c2lnMjogeyBzY3JpcHRQYXRoTGV2ZWw6IHVuZGVmaW5lZCB9IH1cbiAgICApLnNob3VsZC5lcWwoXG4gICAgICBuZXcgRGltZW5zaW9ucyh7XG4gICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnNoSW5wdXRzOiAyLFxuICAgICAgICBuUDJ3c2hJbnB1dHM6IDIsXG4gICAgICAgIG5QMnRyS2V5cGF0aElucHV0czogMixcbiAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzOiAyLFxuICAgICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IDAsXG4gICAgICAgIG5QMnNoUDJwa0lucHV0czogMCxcbiAgICAgICAgb3V0cHV0czogeyBjb3VudDogMCwgc2l6ZTogMCB9LFxuICAgICAgfSlcbiAgICApO1xuICB9KTtcblxuICBpdCgnY2FsY3VsYXRlcyBvdXRwdXQgZGltZW5zaW9ucyBkeW5hbWljYWxseScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBleHBlY3RlZFNpemVzID0gbmV3IE1hcChbXG4gICAgICBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2gsIFZpcnR1YWxTaXplcy50eFAyc2hPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJzaFAyd3NoLCBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ3c2gsIFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZV0sXG4gICAgICBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAydHIsIFZpcnR1YWxTaXplcy50eFAydHJPdXRwdXRTaXplXSxcbiAgICAgIFtVbnNwZW50VHlwZVNjcmlwdDJvZjMucDJ0ck11c2lnMiwgVmlydHVhbFNpemVzLnR4UDJ0ck91dHB1dFNpemVdLFxuICAgICAgW1Vuc3BlbnRUeXBlU2NyaXB0Mm9mMy50YXByb290S2V5UGF0aFNwZW5kLCBWaXJ0dWFsU2l6ZXMudHhQMnRyT3V0cHV0U2l6ZV0sXG4gICAgICBbVW5zcGVudFR5cGVQdWJLZXlIYXNoLnAycGtoLCBWaXJ0dWFsU2l6ZXMudHhQMnBraE91dHB1dFNpemVdLFxuICAgICAgW1Vuc3BlbnRUeXBlUHViS2V5SGFzaC5wMndwa2gsIFZpcnR1YWxTaXplcy50eFAyd3BraE91dHB1dFNpemVdLFxuICAgIF0pO1xuXG4gICAgWy4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlU2NyaXB0Mm9mMyksIC4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlUHViS2V5SGFzaCldLmZvckVhY2goKHR5cGUpID0+XG4gICAgICBnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUodHlwZSkub3V0cHV0cy5zaXplLnNob3VsZC5lcWwoZXhwZWN0ZWRTaXplcy5nZXQodHlwZSBhcyBhbnkpKVxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdEaW1lbnNpb25zIGVzdGltYXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgaXQoJ2NhbGN1bGF0ZXMgdnNpemVzJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRpbShuUDJzaElucHV0czogbnVtYmVyLCBuUDJzaFAyd3NoSW5wdXRzOiBudW1iZXIsIG5QMndzaElucHV0czogbnVtYmVyLCBuT3V0cHV0czogbnVtYmVyKTogRGltZW5zaW9ucyB7XG4gICAgICByZXR1cm4gRGltZW5zaW9ucy5zdW0oXG4gICAgICAgIHtcbiAgICAgICAgICBuUDJzaElucHV0cyxcbiAgICAgICAgICBuUDJzaFAyd3NoSW5wdXRzLFxuICAgICAgICAgIG5QMndzaElucHV0cyxcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMnBraCkudGltZXMobk91dHB1dHMpXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpbVAydHIoXG4gICAgICBuUDJ0cktleXBhdGhJbnB1dHM6IG51bWJlcixcbiAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0czogbnVtYmVyLFxuICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiBudW1iZXIsXG4gICAgICBuT3V0cHV0czogbnVtYmVyXG4gICAgKTogRGltZW5zaW9ucyB7XG4gICAgICByZXR1cm4gRGltZW5zaW9ucy5zdW0oXG4gICAgICAgIHtcbiAgICAgICAgICBuUDJ0cktleXBhdGhJbnB1dHMsXG4gICAgICAgICAgblAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRzLFxuICAgICAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0cyxcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKFVuc3BlbnRUeXBlUHViS2V5SGFzaC5wMnBraCkudGltZXMobk91dHB1dHMpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZlY3RvcnM6IFtEaW1lbnNpb25zLCB1bmtub3duW11dW10gPSBbXG4gICAgICBbZGltKDEsIDAsIDAsIDEpLCBbZmFsc2UsIDEwLCAyOTgsIDM0LCAzNDJdXSxcbiAgICAgIFtkaW0oMCwgMSwgMCwgMSksIFt0cnVlLCAxMSwgMTQwLCAzNCwgMTg1XV0sXG4gICAgICBbZGltKDAsIDAsIDEsIDEpLCBbdHJ1ZSwgMTEsIDEwNSwgMzQsIDE1MF1dLFxuICAgICAgW2RpbSgyLCAwLCAwLCAxKSwgW2ZhbHNlLCAxMCwgNTk2LCAzNCwgNjQwXV0sXG4gICAgICBbZGltKDAsIDIsIDAsIDEpLCBbdHJ1ZSwgMTEsIDI4MCwgMzQsIDMyNV1dLFxuICAgICAgW2RpbSgwLCAwLCAyLCAxKSwgW3RydWUsIDExLCAyMTAsIDM0LCAyNTVdXSxcbiAgICAgIFtkaW0oMSwgMSwgMSwgMSksIFt0cnVlLCAxMSwgNTQzLCAzNCwgNTg4XV0sXG4gICAgICBbZGltKDEsIDEsIDEsIDIpLCBbdHJ1ZSwgMTEsIDU0MywgNjgsIDYyMl1dLFxuXG4gICAgICBbZGltUDJ0cigxLCAwLCAwLCAxKSwgW3RydWUsIDExLCA1OCwgMzQsIDEwM11dLFxuICAgICAgW2RpbVAydHIoMCwgMSwgMCwgMSksIFt0cnVlLCAxMSwgMTA4LCAzNCwgMTUzXV0sXG4gICAgICBbZGltUDJ0cigwLCAwLCAxLCAxKSwgW3RydWUsIDExLCAxMTYsIDM0LCAxNjFdXSxcbiAgICBdO1xuXG4gICAgdmVjdG9ycy5mb3JFYWNoKChbZGltZW5zaW9ucywgcHJvcHNdKSA9PiB7XG4gICAgICBbXG4gICAgICAgIGRpbWVuc2lvbnMuaXNTZWd3aXQoKSxcbiAgICAgICAgZGltZW5zaW9ucy5nZXRPdmVyaGVhZFZTaXplKCksXG4gICAgICAgIGRpbWVuc2lvbnMuZ2V0SW5wdXRzVlNpemUoKSxcbiAgICAgICAgZGltZW5zaW9ucy5nZXRPdXRwdXRzVlNpemUoKSxcbiAgICAgICAgZGltZW5zaW9ucy5nZXRWU2l6ZSgpLFxuICAgICAgXS5zaG91bGQuZXFsKHByb3BzKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inputWeights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputWeights.d.ts","sourceRoot":"","sources":["../../../test/signedTx/inputWeights.ts"],"names":[],"mappings":""}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const assert = __importStar(require("assert"));
27
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
28
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
29
+ const inputWeights_1 = require("../../src/inputWeights");
30
+ const scriptSizes_1 = require("../../src/scriptSizes");
31
+ const testutils_1 = require("../testutils");
32
+ describe('Input Script Sizes (Worst-Case)', function () {
33
+ const keys = [1, 2, 3].map((v) => utxo_lib_1.bip32.fromSeed(Buffer.alloc(16, `test/${v}`)));
34
+ const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]);
35
+ function getLargestInputWithType(inputType, signKeys, inputCount = 100) {
36
+ const signerName = signKeys[0];
37
+ const cosignerName = signKeys.length > 1 ? signKeys[1] : signerName;
38
+ const inputScriptTypes = Array.from({ length: inputCount }).fill(inputType);
39
+ const outputScriptTypes = [testutils_1.UnspentTypeScript2of3.p2sh];
40
+ return (0, testutils_1.getSignedTransaction)(rootWalletKeys, signerName, cosignerName, inputScriptTypes, outputScriptTypes).ins.reduce((a, b) => ((0, inputWeights_1.getInputWeight)(a) > (0, inputWeights_1.getInputWeight)(b) ? a : b));
41
+ }
42
+ function getInputComponents(input) {
43
+ const decompiled = utxolib.script.decompile(input.script);
44
+ if (!decompiled) {
45
+ throw new Error();
46
+ }
47
+ const script = decompiled.map((v) => {
48
+ if (!Buffer.isBuffer(v)) {
49
+ return { length: 1 };
50
+ }
51
+ return { length: v.length + (0, scriptSizes_1.pushdataEncodingLength)(v.length) };
52
+ });
53
+ const witness = (input.witness || []).map((v) => ({ length: v.length }));
54
+ const scriptSize = script.reduce((a, b) => a + b.length, 0);
55
+ assert.strictEqual(scriptSize, input.script.length, utxolib.script.toASM(decompiled));
56
+ return {
57
+ script: script.map((v) => v.length),
58
+ witness: witness.map((v) => v.length),
59
+ };
60
+ }
61
+ function runTestComponentSizes(inputType, signKeys) {
62
+ const signKeysStr = signKeys.join(',');
63
+ describe(`inputType=${inputType} signKeys=${signKeysStr}`, function () {
64
+ it(`component sizes`, function () {
65
+ this.timeout(10000);
66
+ let expectedComponents;
67
+ switch (inputType) {
68
+ case 'p2sh':
69
+ expectedComponents = inputWeights_1.inputComponentsP2sh;
70
+ break;
71
+ case 'p2shP2wsh':
72
+ expectedComponents = inputWeights_1.inputComponentsP2shP2wsh;
73
+ break;
74
+ case 'p2wsh':
75
+ expectedComponents = inputWeights_1.inputComponentsP2wsh;
76
+ break;
77
+ case 'p2shP2pk':
78
+ expectedComponents = inputWeights_1.inputComponentsP2shP2pk;
79
+ break;
80
+ case 'p2tr':
81
+ if (signKeys[1] === 'bitgo') {
82
+ expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel1;
83
+ }
84
+ else if (signKeys[1] === 'backup') {
85
+ expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel2;
86
+ }
87
+ else {
88
+ throw new Error(`unexpected cosigner`);
89
+ }
90
+ break;
91
+ case 'p2trMusig2':
92
+ // assumes only script path
93
+ expectedComponents = inputWeights_1.inputComponentsP2trScriptSpendLevel1;
94
+ break;
95
+ case 'taprootKeyPathSpend':
96
+ expectedComponents = inputWeights_1.inputComponentsP2trKeySpend;
97
+ break;
98
+ default:
99
+ throw new Error(`invalid inputType ${inputType}`);
100
+ }
101
+ const input = getLargestInputWithType(inputType, signKeys, inputType === 'p2tr' || inputType === 'p2trMusig2' || inputType === 'taprootKeyPathSpend' ? 10 : 100);
102
+ const components = getInputComponents(input);
103
+ assert.deepStrictEqual(components, expectedComponents);
104
+ assert.strictEqual((0, inputWeights_1.getInputComponentsWeight)(components), (0, inputWeights_1.getInputWeight)(input));
105
+ });
106
+ });
107
+ }
108
+ (0, testutils_1.getInputScriptTypes)().forEach((inputType) => {
109
+ if (inputType !== 'p2trMusig2') {
110
+ runTestComponentSizes(inputType, inputType === 'p2shP2pk' ? ['user'] : ['user', 'bitgo']);
111
+ }
112
+ if (inputType !== 'p2shP2pk' && inputType !== 'taprootKeyPathSpend') {
113
+ runTestComponentSizes(inputType, ['user', 'backup']);
114
+ }
115
+ });
116
+ });
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRXZWlnaHRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9zaWduZWRUeC9pbnB1dFdlaWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUFpQztBQUdqQyw4REFBZ0Q7QUFDaEQsbURBQTZEO0FBQzdELHlEQVdnQztBQUNoQyx1REFBK0Q7QUFDL0QsNENBTXNCO0FBRXRCLFFBQVEsQ0FBQyxpQ0FBaUMsRUFBRTtJQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBcUIsQ0FBQztJQUNyRyxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJGLFNBQVMsdUJBQXVCLENBQzlCLFNBQWlCLEVBQ2pCLFFBQWlDLEVBQ2pDLFVBQVUsR0FBRyxHQUFHO1FBRWhCLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FB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Q0FBQztJQUVELElBQUEsK0JBQW1CLEdBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFpQixFQUFFLEVBQUU7UUFDbEQsSUFBSSxTQUFTLEtBQUssWUFBWSxFQUFFO1lBQzlCLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxTQUFTLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzNGO1FBQ0QsSUFBSSxTQUFTLEtBQUssVUFBVSxJQUFJLFNBQVMsS0FBSyxxQkFBcUIsRUFBRTtZQUNuRSxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUN0RDtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcblxuaW1wb3J0ICogYXMgbW9jaGEgZnJvbSAnbW9jaGEnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQge1xuICBnZXRJbnB1dENvbXBvbmVudHNXZWlnaHQsXG4gIGdldElucHV0V2VpZ2h0LFxuICBJbnB1dENvbXBvbmVudHMsXG4gIGlucHV0Q29tcG9uZW50c1Ayc2gsXG4gIGlucHV0Q29tcG9uZW50c1Ayc2hQMnBrLFxuICBpbnB1dENvbXBvbmVudHNQMnNoUDJ3c2gsXG4gIGlucHV0Q29tcG9uZW50c1AydHJLZXlTcGVuZCxcbiAgaW5wdXRDb21wb25lbnRzUDJ0clNjcmlwdFNwZW5kTGV2ZWwxLFxuICBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDIsXG4gIGlucHV0Q29tcG9uZW50c1Ayd3NoLFxufSBmcm9tICcuLi8uLi9zcmMvaW5wdXRXZWlnaHRzJztcbmltcG9ydCB7IHB1c2hkYXRhRW5jb2RpbmdMZW5ndGggfSBmcm9tICcuLi8uLi9zcmMvc2NyaXB0U2l6ZXMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5wdXRTY3JpcHRUeXBlcyxcbiAgZ2V0U2lnbmVkVHJhbnNhY3Rpb24sXG4gIElucHV0U2NyaXB0VHlwZSxcbiAgVGVzdFVuc3BlbnRUeXBlLFxuICBVbnNwZW50VHlwZVNjcmlwdDJvZjMsXG59IGZyb20gJy4uL3Rlc3R1dGlscyc7XG5cbmRlc2NyaWJlKCdJbnB1dCBTY3JpcHQgU2l6ZXMgKFdvcnN0LUNhc2UpJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBrZXlzID0gWzEsIDIsIDNdLm1hcCgodikgPT4gYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDE2LCBgdGVzdC8ke3Z9YCkpKSBhcyBCSVAzMkludGVyZmFjZVtdO1xuICBjb25zdCByb290V2FsbGV0S2V5cyA9IG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKFtrZXlzWzBdLCBrZXlzWzFdLCBrZXlzWzJdXSk7XG5cbiAgZnVuY3Rpb24gZ2V0TGFyZ2VzdElucHV0V2l0aFR5cGUoXG4gICAgaW5wdXRUeXBlOiBzdHJpbmcsXG4gICAgc2lnbktleXM6IHV0eG9saWIuYml0Z28uS2V5TmFtZVtdLFxuICAgIGlucHV0Q291bnQgPSAxMDBcbiAgKTogdXR4b2xpYi5UeElucHV0IHtcbiAgICBjb25zdCBzaWduZXJOYW1lID0gc2lnbktleXNbMF07XG4gICAgY29uc3QgY29zaWduZXJOYW1lID0gc2lnbktleXMubGVuZ3RoID4gMSA/IHNpZ25LZXlzWzFdIDogc2lnbmVyTmFtZTtcbiAgICBjb25zdCBpbnB1dFNjcmlwdFR5cGVzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5wdXRDb3VudCB9KS5maWxsKGlucHV0VHlwZSkgYXMgSW5wdXRTY3JpcHRUeXBlW107XG4gICAgY29uc3Qgb3V0cHV0U2NyaXB0VHlwZXMgPSBbVW5zcGVudFR5cGVTY3JpcHQyb2YzLnAyc2hdIGFzIFRlc3RVbnNwZW50VHlwZVtdO1xuICAgIHJldHVybiBnZXRTaWduZWRUcmFuc2FjdGlvbihcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAgc2lnbmVyTmFtZSxcbiAgICAgIGNvc2lnbmVyTmFtZSxcbiAgICAgIGlucHV0U2NyaXB0VHlwZXMsXG4gICAgICBvdXRwdXRTY3JpcHRUeXBlc1xuICAgICkuaW5zLnJlZHVjZSgoYSwgYikgPT4gKGdldElucHV0V2VpZ2h0KGEpID4gZ2V0SW5wdXRXZWlnaHQoYikgPyBhIDogYikpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5wdXRDb21wb25lbnRzKGlucHV0OiB1dHhvbGliLlR4SW5wdXQpOiBJbnB1dENvbXBvbmVudHMge1xuICAgIGNvbnN0IGRlY29tcGlsZWQgPSB1dHhvbGliLnNjcmlwdC5kZWNvbXBpbGUoaW5wdXQuc2NyaXB0KTtcbiAgICBpZiAoIWRlY29tcGlsZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjcmlwdCA9IGRlY29tcGlsZWQubWFwKCh2KSA9PiB7XG4gICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih2KSkge1xuICAgICAgICByZXR1cm4geyBsZW5ndGg6IDEgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGxlbmd0aDogdi5sZW5ndGggKyBwdXNoZGF0YUVuY29kaW5nTGVuZ3RoKHYubGVuZ3RoKSB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHdpdG5lc3MgPSAoaW5wdXQud2l0bmVzcyB8fCBbXSkubWFwKCh2KSA9PiAoeyBsZW5ndGg6IHYubGVuZ3RoIH0pKTtcblxuICAgIGNvbnN0IHNjcmlwdFNpemUgPSBzY3JpcHQucmVkdWNlKChhLCBiKSA9PiBhICsgYi5sZW5ndGgsIDApO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHRTaXplLCBpbnB1dC5zY3JpcHQubGVuZ3RoLCB1dHhvbGliLnNjcmlwdC50b0FTTShkZWNvbXBpbGVkKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2NyaXB0OiBzY3JpcHQubWFwKCh2KSA9PiB2Lmxlbmd0aCksXG4gICAgICB3aXRuZXNzOiB3aXRuZXNzLm1hcCgodikgPT4gdi5sZW5ndGgpLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBydW5UZXN0Q29tcG9uZW50U2l6ZXMoaW5wdXRUeXBlOiBzdHJpbmcsIHNpZ25LZXlzOiB1dHhvbGliLmJpdGdvLktleU5hbWVbXSkge1xuICAgIGNvbnN0IHNpZ25LZXlzU3RyID0gc2lnbktleXMuam9pbignLCcpO1xuXG4gICAgZGVzY3JpYmUoYGlucHV0VHlwZT0ke2lucHV0VHlwZX0gc2lnbktleXM9JHtzaWduS2V5c1N0cn1gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgY29tcG9uZW50IHNpemVzYCwgZnVuY3Rpb24gKHRoaXM6IG1vY2hhLkNvbnRleHQpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG4gICAgICAgIGxldCBleHBlY3RlZENvbXBvbmVudHM7XG4gICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7XG4gICAgICAgICAgY2FzZSAncDJzaCc6XG4gICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnNoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncDJzaFAyd3NoJzpcbiAgICAgICAgICAgIGV4cGVjdGVkQ29tcG9uZW50cyA9IGlucHV0Q29tcG9uZW50c1Ayc2hQMndzaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3Ayd3NoJzpcbiAgICAgICAgICAgIGV4cGVjdGVkQ29tcG9uZW50cyA9IGlucHV0Q29tcG9uZW50c1Ayd3NoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAncDJzaFAycGsnOlxuICAgICAgICAgICAgZXhwZWN0ZWRDb21wb25lbnRzID0gaW5wdXRDb21wb25lbnRzUDJzaFAycGs7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdwMnRyJzpcbiAgICAgICAgICAgIGlmIChzaWduS2V5c1sxXSA9PT0gJ2JpdGdvJykge1xuICAgICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNpZ25LZXlzWzFdID09PSAnYmFja3VwJykge1xuICAgICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgY29zaWduZXJgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3AydHJNdXNpZzInOlxuICAgICAgICAgICAgLy8gYXNzdW1lcyBvbmx5IHNjcmlwdCBwYXRoXG4gICAgICAgICAgICBleHBlY3RlZENvbXBvbmVudHMgPSBpbnB1dENvbXBvbmVudHNQMnRyU2NyaXB0U3BlbmRMZXZlbDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICd0YXByb290S2V5UGF0aFNwZW5kJzpcbiAgICAgICAgICAgIGV4cGVjdGVkQ29tcG9uZW50cyA9IGlucHV0Q29tcG9uZW50c1AydHJLZXlTcGVuZDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5wdXRUeXBlICR7aW5wdXRUeXBlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRMYXJnZXN0SW5wdXRXaXRoVHlwZShcbiAgICAgICAgICBpbnB1dFR5cGUsXG4gICAgICAgICAgc2lnbktleXMsXG4gICAgICAgICAgaW5wdXRUeXBlID09PSAncDJ0cicgfHwgaW5wdXRUeXBlID09PSAncDJ0ck11c2lnMicgfHwgaW5wdXRUeXBlID09PSAndGFwcm9vdEtleVBhdGhTcGVuZCcgPyAxMCA6IDEwMFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gZ2V0SW5wdXRDb21wb25lbnRzKGlucHV0KTtcbiAgICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChjb21wb25lbnRzLCBleHBlY3RlZENvbXBvbmVudHMpO1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZ2V0SW5wdXRDb21wb25lbnRzV2VpZ2h0KGNvbXBvbmVudHMpLCBnZXRJbnB1dFdlaWdodChpbnB1dCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRJbnB1dFNjcmlwdFR5cGVzKCkuZm9yRWFjaCgoaW5wdXRUeXBlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoaW5wdXRUeXBlICE9PSAncDJ0ck11c2lnMicpIHtcbiAgICAgIHJ1blRlc3RDb21wb25lbnRTaXplcyhpbnB1dFR5cGUsIGlucHV0VHlwZSA9PT0gJ3Ayc2hQMnBrJyA/IFsndXNlciddIDogWyd1c2VyJywgJ2JpdGdvJ10pO1xuICAgIH1cbiAgICBpZiAoaW5wdXRUeXBlICE9PSAncDJzaFAycGsnICYmIGlucHV0VHlwZSAhPT0gJ3RhcHJvb3RLZXlQYXRoU3BlbmQnKSB7XG4gICAgICBydW5UZXN0Q29tcG9uZW50U2l6ZXMoaW5wdXRUeXBlLCBbJ3VzZXInLCAnYmFja3VwJ10pO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ import * as utxolib from '@bitgo-beta/utxo-lib';
2
+ export type InputScriptType = utxolib.bitgo.outputScripts.ScriptType | 'taprootKeyPathSpend';
3
+ //# sourceMappingURL=txCombinations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txCombinations.d.ts","sourceRoot":"","sources":["../../../test/signedTx/txCombinations.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,GAAG,qBAAqB,CAAC"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const should_1 = __importDefault(require("should"));
30
+ const src_1 = require("../../src");
31
+ const testutils_1 = require("../testutils");
32
+ const txGen_1 = require("./txGen");
33
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
34
+ const keys = [1, 2, 3].map((v) => utxolib.bip32.fromSeed(Buffer.alloc(16, `test/2/${v}`), utxolib.networks.bitcoin));
35
+ const rootWalletKeys = new utxolib.bitgo.RootWalletKeys([keys[0], keys[1], keys[2]]);
36
+ const testDimensionsFromTx = (txCombo) => {
37
+ const { inputTypes, outputTypes, expectedDims } = txCombo;
38
+ describe(`Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
39
+ const nInputs = inputTypes.length;
40
+ const outputDims = src_1.Dimensions.sum(...outputTypes.map(testutils_1.getOutputDimensionsForUnspentType));
41
+ it(`calculates dimensions from unsigned transaction`, function () {
42
+ const unsignedTx = txCombo.getUnsignedTx();
43
+ // does not work for unsigned transactions
44
+ should_1.default.throws(() => src_1.Dimensions.fromTransaction(unsignedTx));
45
+ // unless explicitly allowed
46
+ src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH }).should.eql(src_1.Dimensions.sum({ nP2shInputs: nInputs }, outputDims));
47
+ src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2SH_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2shP2wshInputs: nInputs }, outputDims));
48
+ src_1.Dimensions.fromTransaction(unsignedTx, { assumeUnsigned: src_1.Dimensions.ASSUME_P2WSH }).should.eql(src_1.Dimensions.sum({ nP2wshInputs: nInputs }, outputDims));
49
+ });
50
+ it(`calculates dimensions for signed transaction`, function () {
51
+ const dimensions = src_1.Dimensions.fromTransaction(txCombo.getSignedTx());
52
+ dimensions.should.eql(expectedDims);
53
+ });
54
+ it(`calculates dimensions for signed input of transaction`, function () {
55
+ const signedTx = txCombo.getSignedTx();
56
+ // test Dimensions.fromInput()
57
+ inputTypes.forEach((input, i) => src_1.Dimensions.fromInput(signedTx.ins[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
58
+ });
59
+ });
60
+ };
61
+ const testDimensionsFromPsbt = (keys, inputTypes, outputTypes, expectedDims) => {
62
+ describe(`Psbt Combination inputs=${inputTypes}; outputs=${outputTypes}`, function () {
63
+ ['unsigned', 'halfsigned', 'fullysigned'].forEach((s) => {
64
+ it(`calculates dimensions from ${s} psbt`, function () {
65
+ const dimensions = src_1.Dimensions.fromPsbt((0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, s));
66
+ dimensions.should.eql(expectedDims);
67
+ });
68
+ });
69
+ it(`calculates dimensions for signed input of psbt`, function () {
70
+ const signedPsbt = (0, testutils_1.constructPsbt)(keys, inputTypes, outputTypes, 'fullysigned');
71
+ inputTypes.forEach((input, i) => src_1.Dimensions.fromPsbtInput(signedPsbt.data.inputs[i]).should.eql(src_1.Dimensions.sum((0, testutils_1.getInputDimensionsForUnspentType)(input))));
72
+ });
73
+ });
74
+ };
75
+ describe(`Dimensions for transaction combinations`, function () {
76
+ // p2trMusig2 is supported only with PSBT
77
+ const scriptTypes = utxolib.bitgo.outputScripts.scriptTypes2Of3.filter((t) => t !== 'p2trMusig2');
78
+ const params = {
79
+ inputTypes: [...scriptTypes, testutils_1.UnspentTypeP2shP2pk],
80
+ maxNInputs: 2,
81
+ outputTypes: [...scriptTypes, ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
82
+ maxNOutputs: 2,
83
+ };
84
+ (0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
85
+ const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
86
+ const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
87
+ testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims)));
88
+ // Doubling the inputs should yield twice the input dims
89
+ testDimensionsFromTx(new txGen_1.TxCombo(keys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims)));
90
+ // Same for outputs
91
+ testDimensionsFromTx(new txGen_1.TxCombo(keys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims)));
92
+ });
93
+ });
94
+ describe(`Dimensions for PSBT combinations`, function () {
95
+ const params = {
96
+ inputTypes: [
97
+ ...utxolib.bitgo.outputScripts.scriptTypes2Of3,
98
+ utxolib.bitgo.outputScripts.scriptTypeP2shP2pk,
99
+ 'taprootKeyPathSpend',
100
+ ],
101
+ maxNInputs: 1,
102
+ outputTypes: [...Object.keys(testutils_1.UnspentTypeScript2of3), ...Object.keys(testutils_1.UnspentTypePubKeyHash)],
103
+ maxNOutputs: 1,
104
+ };
105
+ it(`does not work for unknown psbt input`, function () {
106
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network: utxolib.networks.bitcoin });
107
+ psbt.addInput({ hash: Buffer.alloc(32), index: 0 });
108
+ should_1.default.throws(() => src_1.Dimensions.fromPsbt(psbt));
109
+ });
110
+ (0, txGen_1.runCombinations)(params, (inputTypeCombo, outputTypeCombo) => {
111
+ const expectedInputDims = src_1.Dimensions.sum(...inputTypeCombo.map(testutils_1.getInputDimensionsForUnspentType));
112
+ const expectedOutputDims = src_1.Dimensions.sum(...outputTypeCombo.map(testutils_1.getOutputDimensionsForUnspentType));
113
+ testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, outputTypeCombo, expectedInputDims.plus(expectedOutputDims));
114
+ // Doubling the inputs should yield twice the input dims
115
+ testDimensionsFromPsbt(rootWalletKeys, [...inputTypeCombo, ...inputTypeCombo], outputTypeCombo, expectedInputDims.plus(expectedInputDims).plus(expectedOutputDims));
116
+ // Same for outputs
117
+ testDimensionsFromPsbt(rootWalletKeys, inputTypeCombo, [...outputTypeCombo, ...outputTypeCombo], expectedInputDims.plus(expectedOutputDims).plus(expectedOutputDims));
118
+ });
119
+ });
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhDb21iaW5hdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3NpZ25lZFR4L3R4Q29tYmluYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQXVDO0FBRXZDLDRDQVFzQjtBQUV0QixtQ0FBbUQ7QUFDbkQsOERBQWdEO0FBSWhELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FDdEQsQ0FBQztBQUU5QixNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXJGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFZLEVBQUUsRUFBRTtJQUM1QyxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFFMUQsUUFBUSxDQUFDLHNCQUFzQixVQUFVLGFBQWEsV0FBVyxFQUFFLEVBQUU7UUFDbkUsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxnQkFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsNkNBQWlDLENBQUMsQ0FBQyxDQUFDO1FBRXpGLEVBQUUsQ0FBQyxpREFBaUQs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Q0FBQyxrQkFBa0IsQ0FBQyxDQUNwRSxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5pbXBvcnQge1xuICBjb25zdHJ1Y3RQc2J0LFxuICBnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSxcbiAgZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlLFxuICBUZXN0VW5zcGVudFR5cGUsXG4gIFVuc3BlbnRUeXBlUDJzaFAycGssXG4gIFVuc3BlbnRUeXBlUHViS2V5SGFzaCxcbiAgVW5zcGVudFR5cGVTY3JpcHQyb2YzLFxufSBmcm9tICcuLi90ZXN0dXRpbHMnO1xuXG5pbXBvcnQgeyBydW5Db21iaW5hdGlvbnMsIFR4Q29tYm8gfSBmcm9tICcuL3R4R2VuJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuXG5leHBvcnQgdHlwZSBJbnB1dFNjcmlwdFR5cGUgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZSB8ICd0YXByb290S2V5UGF0aFNwZW5kJztcblxuY29uc3Qga2V5cyA9IFsxLCAyLCAzXS5tYXAoKHYpID0+XG4gIHV0eG9saWIuYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmFsbG9jKDE2LCBgdGVzdC8yLyR7dn1gKSwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKVxuKSBhcyB1dHhvbGliLkJJUDMySW50ZXJmYWNlW107XG5cbmNvbnN0IHJvb3RXYWxsZXRLZXlzID0gbmV3IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMoW2tleXNbMF0sIGtleXNbMV0sIGtleXNbMl1dKTtcblxuY29uc3QgdGVzdERpbWVuc2lvbnNGcm9tVHggPSAodHhDb21ibzogYW55KSA9PiB7XG4gIGNvbnN0IHsgaW5wdXRUeXBlcywgb3V0cHV0VHlwZXMsIGV4cGVjdGVkRGltcyB9ID0gdHhDb21ibztcblxuICBkZXNjcmliZShgQ29tYmluYXRpb24gaW5wdXRzPSR7aW5wdXRUeXBlc307IG91dHB1dHM9JHtvdXRwdXRUeXBlc31gLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbklucHV0cyA9IGlucHV0VHlwZXMubGVuZ3RoO1xuICAgIGNvbnN0IG91dHB1dERpbXMgPSBEaW1lbnNpb25zLnN1bSguLi5vdXRwdXRUeXBlcy5tYXAoZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG5cbiAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZyb20gdW5zaWduZWQgdHJhbnNhY3Rpb25gLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gdHhDb21iby5nZXRVbnNpZ25lZFR4KCk7XG5cbiAgICAgIC8vIGRvZXMgbm90IHdvcmsgZm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9uc1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBEaW1lbnNpb25zLmZyb21UcmFuc2FjdGlvbih1bnNpZ25lZFR4KSk7XG5cbiAgICAgIC8vIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWRcbiAgICAgIERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkVHgsIHsgYXNzdW1lVW5zaWduZWQ6IERpbWVuc2lvbnMuQVNTVU1FX1AyU0ggfSkuc2hvdWxkLmVxbChcbiAgICAgICAgRGltZW5zaW9ucy5zdW0oeyBuUDJzaElucHV0czogbklucHV0cyB9LCBvdXRwdXREaW1zKVxuICAgICAgKTtcblxuICAgICAgRGltZW5zaW9ucy5mcm9tVHJhbnNhY3Rpb24odW5zaWduZWRUeCwgeyBhc3N1bWVVbnNpZ25lZDogRGltZW5zaW9ucy5BU1NVTUVfUDJTSF9QMldTSCB9KS5zaG91bGQuZXFsKFxuICAgICAgICBEaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJ3c2hJbnB1dHM6IG5JbnB1dHMgfSwgb3V0cHV0RGltcylcbiAgICAgICk7XG5cbiAgICAgIERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkVHgsIHsgYXNzdW1lVW5zaWduZWQ6IERpbWVuc2lvbnMuQVNTVU1FX1AyV1NIIH0pLnNob3VsZC5lcWwoXG4gICAgICAgIERpbWVuc2lvbnMuc3VtKHsgblAyd3NoSW5wdXRzOiBuSW5wdXRzIH0sIG91dHB1dERpbXMpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoYGNhbGN1bGF0ZXMgZGltZW5zaW9ucyBmb3Igc2lnbmVkIHRyYW5zYWN0aW9uYCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGltZW5zaW9ucyA9IERpbWVuc2lvbnMuZnJvbVRyYW5zYWN0aW9uKHR4Q29tYm8uZ2V0U2lnbmVkVHgoKSk7XG4gICAgICBkaW1lbnNpb25zLnNob3VsZC5lcWwoZXhwZWN0ZWREaW1zKTtcbiAgICB9KTtcblxuICAgIGl0KGBjYWxjdWxhdGVzIGRpbWVuc2lvbnMgZm9yIHNpZ25lZCBpbnB1dCBvZiB0cmFuc2FjdGlvbmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4ID0gdHhDb21iby5nZXRTaWduZWRUeCgpO1xuXG4gICAgICAvLyB0ZXN0IERpbWVuc2lvbnMuZnJvbUlucHV0KClcbiAgICAgIGlucHV0VHlwZXMuZm9yRWFjaCgoaW5wdXQ6IGFueSwgaTogbnVtYmVyKSA9PlxuICAgICAgICBEaW1lbnNpb25zLmZyb21JbnB1dChzaWduZWRUeC5pbnNbaV0pLnNob3VsZC5lcWwoRGltZW5zaW9ucy5zdW0oZ2V0SW5wdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUoaW5wdXQpKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuY29uc3QgdGVzdERpbWVuc2lvbnNGcm9tUHNidCA9IChcbiAga2V5czogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyxcbiAgaW5wdXRUeXBlczogSW5wdXRTY3JpcHRUeXBlW10sXG4gIG91dHB1dFR5cGVzOiBUZXN0VW5zcGVudFR5cGVbXSxcbiAgZXhwZWN0ZWREaW1zOiBEaW1lbnNpb25zXG4pID0+IHtcbiAgZGVzY3JpYmUoYFBzYnQgQ29tYmluYXRpb24gaW5wdXRzPSR7aW5wdXRUeXBlc307IG91dHB1dHM9JHtvdXRwdXRUeXBlc31gLCBmdW5jdGlvbiAoKSB7XG4gICAgKFsndW5zaWduZWQnLCAnaGFsZnNpZ25lZCcsICdmdWxseXNpZ25lZCddIGFzIGNvbnN0KS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZyb20gJHtzfSBwc2J0YCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkaW1lbnNpb25zID0gRGltZW5zaW9ucy5mcm9tUHNidChjb25zdHJ1Y3RQc2J0KGtleXMsIGlucHV0VHlwZXMsIG91dHB1dFR5cGVzLCBzKSk7XG4gICAgICAgIGRpbWVuc2lvbnMuc2hvdWxkLmVxbChleHBlY3RlZERpbXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdChgY2FsY3VsYXRlcyBkaW1lbnNpb25zIGZvciBzaWduZWQgaW5wdXQgb2YgcHNidGAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFBzYnQgPSBjb25zdHJ1Y3RQc2J0KGtleXMsIGlucHV0VHlwZXMsIG91dHB1dFR5cGVzLCAnZnVsbHlzaWduZWQnKTtcblxuICAgICAgaW5wdXRUeXBlcy5mb3JFYWNoKChpbnB1dDogYW55LCBpOiBudW1iZXIpID0+XG4gICAgICAgIERpbWVuc2lvbnMuZnJvbVBzYnRJbnB1dChzaWduZWRQc2J0LmRhdGEuaW5wdXRzW2ldKS5zaG91bGQuZXFsKFxuICAgICAgICAgIERpbWVuc2lvbnMuc3VtKGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKGlucHV0KSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5kZXNjcmliZShgRGltZW5zaW9ucyBmb3IgdHJhbnNhY3Rpb24gY29tYmluYXRpb25zYCwgZnVuY3Rpb24gKCkge1xuICAvLyBwMnRyTXVzaWcyIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggUFNCVFxuICBjb25zdCBzY3JpcHRUeXBlcyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMuZmlsdGVyKCh0KSA9PiB0ICE9PSAncDJ0ck11c2lnMicpO1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgaW5wdXRUeXBlczogWy4uLnNjcmlwdFR5cGVzLCBVbnNwZW50VHlwZVAyc2hQMnBrXSBhcyBJbnB1dFNjcmlwdFR5cGVbXSxcbiAgICBtYXhOSW5wdXRzOiAyLFxuICAgIG91dHB1dFR5cGVzOiBbLi4uc2NyaXB0VHlwZXMsIC4uLk9iamVjdC5rZXlzKFVuc3BlbnRUeXBlUHViS2V5SGFzaCldIGFzIFRlc3RVbnNwZW50VHlwZVtdLFxuICAgIG1heE5PdXRwdXRzOiAyLFxuICB9O1xuXG4gIHJ1bkNvbWJpbmF0aW9ucyhwYXJhbXMsIChpbnB1dFR5cGVDb21ibzogSW5wdXRTY3JpcHRUeXBlW10sIG91dHB1dFR5cGVDb21ibzogVGVzdFVuc3BlbnRUeXBlW10pID0+IHtcbiAgICBjb25zdCBleHBlY3RlZElucHV0RGltcyA9IERpbWVuc2lvbnMuc3VtKC4uLmlucHV0VHlwZUNvbWJvLm1hcChnZXRJbnB1dERpbWVuc2lvbnNGb3JVbnNwZW50VHlwZSkpO1xuICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0RGltcyA9IERpbWVuc2lvbnMuc3VtKC4uLm91dHB1dFR5cGVDb21iby5tYXAoZ2V0T3V0cHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG5cbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21UeChcbiAgICAgIG5ldyBUeENvbWJvKGtleXMsIGlucHV0VHlwZUNvbWJvLCBvdXRwdXRUeXBlQ29tYm8sIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKSlcbiAgICApO1xuXG4gICAgLy8gRG91YmxpbmcgdGhlIGlucHV0cyBzaG91bGQgeWllbGQgdHdpY2UgdGhlIGlucHV0IGRpbXNcbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21UeChcbiAgICAgIG5ldyBUeENvbWJvKFxuICAgICAgICBrZXlzLFxuICAgICAgICBbLi4uaW5wdXRUeXBlQ29tYm8sIC4uLmlucHV0VHlwZUNvbWJvXSxcbiAgICAgICAgb3V0cHV0VHlwZUNvbWJvLFxuICAgICAgICBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkSW5wdXREaW1zKS5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcylcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gU2FtZSBmb3Igb3V0cHV0c1xuICAgIHRlc3REaW1lbnNpb25zRnJvbVR4KFxuICAgICAgbmV3IFR4Q29tYm8oXG4gICAgICAgIGtleXMsXG4gICAgICAgIGlucHV0VHlwZUNvbWJvLFxuICAgICAgICBbLi4ub3V0cHV0VHlwZUNvbWJvLCAuLi5vdXRwdXRUeXBlQ29tYm9dLFxuICAgICAgICBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcykucGx1cyhleHBlY3RlZE91dHB1dERpbXMpXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoYERpbWVuc2lvbnMgZm9yIFBTQlQgY29tYmluYXRpb25zYCwgZnVuY3Rpb24gKCkge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgaW5wdXRUeXBlczogW1xuICAgICAgLi4udXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mMyxcbiAgICAgIHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlUDJzaFAycGssXG4gICAgICAndGFwcm9vdEtleVBhdGhTcGVuZCcsXG4gICAgXSBhcyBJbnB1dFNjcmlwdFR5cGVbXSxcbiAgICBtYXhOSW5wdXRzOiAxLFxuICAgIG91dHB1dFR5cGVzOiBbLi4uT2JqZWN0LmtleXMoVW5zcGVudFR5cGVTY3JpcHQyb2YzKSwgLi4uT2JqZWN0LmtleXMoVW5zcGVudFR5cGVQdWJLZXlIYXNoKV0sXG4gICAgbWF4Tk91dHB1dHM6IDEsXG4gIH07XG5cbiAgaXQoYGRvZXMgbm90IHdvcmsgZm9yIHVua25vd24gcHNidCBpbnB1dGAsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0Rm9yTmV0d29yayh7IG5ldHdvcms6IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiB9KTtcbiAgICBwc2J0LmFkZElucHV0KHsgaGFzaDogQnVmZmVyLmFsbG9jKDMyKSwgaW5kZXg6IDAgfSk7XG4gICAgc2hvdWxkLnRocm93cygoKSA9PiBEaW1lbnNpb25zLmZyb21Qc2J0KHBzYnQpKTtcbiAgfSk7XG5cbiAgcnVuQ29tYmluYXRpb25zKHBhcmFtcywgKGlucHV0VHlwZUNvbWJvOiBJbnB1dFNjcmlwdFR5cGVbXSwgb3V0cHV0VHlwZUNvbWJvOiBUZXN0VW5zcGVudFR5cGVbXSkgPT4ge1xuICAgIGNvbnN0IGV4cGVjdGVkSW5wdXREaW1zID0gRGltZW5zaW9ucy5zdW0oLi4uaW5wdXRUeXBlQ29tYm8ubWFwKGdldElucHV0RGltZW5zaW9uc0ZvclVuc3BlbnRUeXBlKSk7XG4gICAgY29uc3QgZXhwZWN0ZWRPdXRwdXREaW1zID0gRGltZW5zaW9ucy5zdW0oLi4ub3V0cHV0VHlwZUNvbWJvLm1hcChnZXRPdXRwdXREaW1lbnNpb25zRm9yVW5zcGVudFR5cGUpKTtcblxuICAgIHRlc3REaW1lbnNpb25zRnJvbVBzYnQocm9vdFdhbGxldEtleXMsIGlucHV0VHlwZUNvbWJvLCBvdXRwdXRUeXBlQ29tYm8sIGV4cGVjdGVkSW5wdXREaW1zLnBsdXMoZXhwZWN0ZWRPdXRwdXREaW1zKSk7XG5cbiAgICAvLyBEb3VibGluZyB0aGUgaW5wdXRzIHNob3VsZCB5aWVsZCB0d2ljZSB0aGUgaW5wdXQgZGltc1xuICAgIHRlc3REaW1lbnNpb25zRnJvbVBzYnQoXG4gICAgICByb290V2FsbGV0S2V5cyxcbiAgICAgIFsuLi5pbnB1dFR5cGVDb21ibywgLi4uaW5wdXRUeXBlQ29tYm9dLFxuICAgICAgb3V0cHV0VHlwZUNvbWJvLFxuICAgICAgZXhwZWN0ZWRJbnB1dERpbXMucGx1cyhleHBlY3RlZElucHV0RGltcykucGx1cyhleHBlY3RlZE91dHB1dERpbXMpXG4gICAgKTtcblxuICAgIC8vIFNhbWUgZm9yIG91dHB1dHNcbiAgICB0ZXN0RGltZW5zaW9uc0Zyb21Qc2J0KFxuICAgICAgcm9vdFdhbGxldEtleXMsXG4gICAgICBpbnB1dFR5cGVDb21ibyxcbiAgICAgIFsuLi5vdXRwdXRUeXBlQ29tYm8sIC4uLm91dHB1dFR5cGVDb21ib10sXG4gICAgICBleHBlY3RlZElucHV0RGltcy5wbHVzKGV4cGVjdGVkT3V0cHV0RGltcykucGx1cyhleHBlY3RlZE91dHB1dERpbXMpXG4gICAgKTtcbiAgfSk7XG59KTtcbiJdfQ==