@bitgo-beta/unspents 0.13.2-beta.9 → 0.13.2-beta.900
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.
- package/.mocharc.js +1 -1
- package/CHANGELOG.md +541 -0
- package/bin/generate_tables.ts +94 -0
- package/dist/bin/generate_tables.d.ts +2 -0
- package/dist/bin/generate_tables.d.ts.map +1 -0
- package/dist/bin/generate_tables.js +107 -0
- package/dist/{codes.d.ts → src/codes.d.ts} +11 -10
- package/dist/src/codes.d.ts.map +1 -0
- package/dist/src/codes.js +182 -0
- package/dist/{dimensions.d.ts → src/dimensions.d.ts} +10 -11
- package/dist/src/dimensions.d.ts.map +1 -0
- package/dist/src/dimensions.js +500 -0
- package/dist/{index.d.ts → src/index.d.ts} +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +44 -0
- package/dist/{inputWeights.d.ts → src/inputWeights.d.ts} +4 -3
- package/dist/src/inputWeights.d.ts.map +1 -0
- package/dist/src/inputWeights.js +97 -0
- package/dist/{scriptSizes.d.ts → src/scriptSizes.d.ts} +1 -0
- package/dist/src/scriptSizes.d.ts.map +1 -0
- package/dist/src/scriptSizes.js +50 -0
- package/dist/{types.d.ts → src/types.d.ts} +1 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +39 -0
- package/dist/{virtualSizes.d.ts → src/virtualSizes.d.ts} +13 -12
- package/dist/src/virtualSizes.d.ts.map +1 -0
- package/dist/src/virtualSizes.js +114 -0
- package/dist/src/zcash.d.ts +9 -0
- package/dist/src/zcash.d.ts.map +1 -0
- package/dist/src/zcash.js +22 -0
- package/dist/test/chain.d.ts +2 -0
- package/dist/test/chain.d.ts.map +1 -0
- package/dist/test/chain.js +92 -0
- package/dist/test/dimensions.d.ts +2 -0
- package/dist/test/dimensions.d.ts.map +1 -0
- package/dist/test/dimensions.js +235 -0
- package/dist/test/signedTx/inputWeights.d.ts +2 -0
- package/dist/test/signedTx/inputWeights.d.ts.map +1 -0
- package/dist/test/signedTx/inputWeights.js +127 -0
- package/dist/test/signedTx/txCombinations.d.ts +3 -0
- package/dist/test/signedTx/txCombinations.d.ts.map +1 -0
- package/dist/test/signedTx/txCombinations.js +130 -0
- package/dist/test/signedTx/txGen.d.ts +74 -0
- package/dist/test/signedTx/txGen.d.ts.map +1 -0
- package/dist/test/signedTx/txGen.js +233 -0
- package/dist/test/testutils.d.ts +36 -0
- package/dist/test/testutils.d.ts.map +1 -0
- package/dist/test/testutils.js +190 -0
- package/dist/test/virtualSizes.d.ts +2 -0
- package/dist/test/virtualSizes.d.ts.map +1 -0
- package/dist/test/virtualSizes.js +18 -0
- package/dist/test/zcash.d.ts +2 -0
- package/dist/test/zcash.d.ts.map +1 -0
- package/dist/test/zcash.js +60 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/input-costs.md +14 -0
- package/package.json +7 -7
- package/dist/codes.js +0 -168
- package/dist/dimensions.js +0 -490
- package/dist/index.js +0 -30
- package/dist/inputWeights.js +0 -97
- package/dist/scriptSizes.js +0 -51
- package/dist/types.js +0 -25
- package/dist/virtualSizes.js +0 -114
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Dimensions = exports.OutputDimensions = exports.VirtualSizes = void 0;
|
|
37
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
38
|
+
const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
|
|
39
|
+
const { isChainCode, scriptTypeForChain } = utxo_lib_1.bitgo;
|
|
40
|
+
const scriptSizes_1 = require("./scriptSizes");
|
|
41
|
+
const types_1 = require("./types");
|
|
42
|
+
const virtualSizes_1 = require("./virtualSizes");
|
|
43
|
+
Object.defineProperty(exports, "VirtualSizes", { enumerable: true, get: function () { return virtualSizes_1.VirtualSizes; } });
|
|
44
|
+
/**
|
|
45
|
+
* Apply `f` to all properties of `d`
|
|
46
|
+
*/
|
|
47
|
+
function mapDimensions(d, f) {
|
|
48
|
+
return new Dimensions(Object.fromEntries(Object.entries(d).map(([key, value]) => [key, f(key, value)])));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Aggregate count and size of transaction outputs
|
|
52
|
+
*/
|
|
53
|
+
class OutputDimensions {
|
|
54
|
+
constructor({ count = 0, size = 0 } = { count: 0, size: 0 }) {
|
|
55
|
+
if (count === 0 || size === 0) {
|
|
56
|
+
if (count !== 0 || size !== 0) {
|
|
57
|
+
throw new Error(`count and size must both be zero if one is zero`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
this.count = count;
|
|
61
|
+
this.size = size;
|
|
62
|
+
Object.freeze(this);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.OutputDimensions = OutputDimensions;
|
|
66
|
+
const defaultUnspentParams = {
|
|
67
|
+
p2tr: {
|
|
68
|
+
// Default to recovery script paths, to make it easier for recovery case callers (WRW etc).
|
|
69
|
+
// WP can explicitly pass scriptPathLevel: 1 to use happy path.
|
|
70
|
+
scriptPathLevel: 2,
|
|
71
|
+
},
|
|
72
|
+
p2trMusig2: {
|
|
73
|
+
// Default to script path spend, to make it easier for recovery case callers (WRW etc).
|
|
74
|
+
// WP can explicitly pass scriptPathLevel: undefined to use key path.
|
|
75
|
+
scriptPathLevel: 1,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Dimensions of a BitGo wallet transactions.
|
|
80
|
+
*/
|
|
81
|
+
class Dimensions {
|
|
82
|
+
constructor(d = {}) {
|
|
83
|
+
/** Input counts for BitGo wallet multi-signature inputs */
|
|
84
|
+
this.nP2shInputs = 0;
|
|
85
|
+
this.nP2shP2wshInputs = 0;
|
|
86
|
+
this.nP2wshInputs = 0;
|
|
87
|
+
this.nP2trKeypathInputs = 0;
|
|
88
|
+
this.nP2trScriptPathLevel1Inputs = 0;
|
|
89
|
+
this.nP2trScriptPathLevel2Inputs = 0;
|
|
90
|
+
/* Input count for single-signature inputs (Replay Protection inputs) */
|
|
91
|
+
this.nP2shP2pkInputs = 0;
|
|
92
|
+
this.outputs = new OutputDimensions();
|
|
93
|
+
Object.entries(d).forEach(([key, value]) => this.setProperty(key, value));
|
|
94
|
+
Object.freeze(this);
|
|
95
|
+
}
|
|
96
|
+
setProperty(k, v) {
|
|
97
|
+
switch (k) {
|
|
98
|
+
case 'nP2shInputs':
|
|
99
|
+
case 'nP2shP2wshInputs':
|
|
100
|
+
case 'nP2wshInputs':
|
|
101
|
+
case 'nP2trKeypathInputs':
|
|
102
|
+
case 'nP2trScriptPathLevel1Inputs':
|
|
103
|
+
case 'nP2trScriptPathLevel2Inputs':
|
|
104
|
+
case 'nP2shP2pkInputs':
|
|
105
|
+
if (typeof v !== 'number') {
|
|
106
|
+
throw new Error(`property ${k} must be number`);
|
|
107
|
+
}
|
|
108
|
+
if (!Number.isSafeInteger(v) || v < 0) {
|
|
109
|
+
throw new Error(`property ${k} must be zero or positive integer`);
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case 'outputs':
|
|
113
|
+
if (!(v instanceof OutputDimensions)) {
|
|
114
|
+
v = new OutputDimensions(v);
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
throw new Error(`unknown property ${k}`);
|
|
119
|
+
}
|
|
120
|
+
this[k] = v;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* @deprecated use ZERO
|
|
124
|
+
* @return Dimensions for an empty transaction
|
|
125
|
+
*/
|
|
126
|
+
static zero() {
|
|
127
|
+
return this.ZERO;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* @param size
|
|
131
|
+
* @return Dimensions for a single output with given size
|
|
132
|
+
*/
|
|
133
|
+
static singleOutput(size) {
|
|
134
|
+
return Dimensions.sum({ outputs: { count: 1, size } });
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* @return Number of total inputs (p2sh + p2shP2wsh + p2wsh + p2tr)
|
|
138
|
+
*/
|
|
139
|
+
get nInputs() {
|
|
140
|
+
return (this.nP2shInputs +
|
|
141
|
+
this.nP2shP2wshInputs +
|
|
142
|
+
this.nP2wshInputs +
|
|
143
|
+
this.nP2trKeypathInputs +
|
|
144
|
+
this.nP2trScriptPathLevel1Inputs +
|
|
145
|
+
this.nP2trScriptPathLevel2Inputs +
|
|
146
|
+
this.nP2shP2pkInputs);
|
|
147
|
+
}
|
|
148
|
+
set nInputs(_) {
|
|
149
|
+
throw new Error('read-only property nInputs');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @return Number of total outputs
|
|
153
|
+
*/
|
|
154
|
+
get nOutputs() {
|
|
155
|
+
return this.outputs.count;
|
|
156
|
+
}
|
|
157
|
+
set nOutputs(_) {
|
|
158
|
+
throw new Error(`read-only property nOutputs`);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* @param args - Dimensions (can be partially defined)
|
|
162
|
+
* @return {Dimensions} sum of arguments
|
|
163
|
+
*/
|
|
164
|
+
static sum(...args) {
|
|
165
|
+
return args.reduce((a, b) => a.plus(b), new Dimensions());
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* @param chain
|
|
169
|
+
* @return {Number}
|
|
170
|
+
*/
|
|
171
|
+
static getOutputScriptLengthForChain(chain) {
|
|
172
|
+
switch (scriptTypeForChain(chain)) {
|
|
173
|
+
case 'p2wsh':
|
|
174
|
+
case 'p2tr':
|
|
175
|
+
case 'p2trMusig2':
|
|
176
|
+
return 34;
|
|
177
|
+
default:
|
|
178
|
+
return 23;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* @param scriptLength
|
|
183
|
+
* @return {Number} vSize of an output with script length
|
|
184
|
+
*/
|
|
185
|
+
static getVSizeForOutputWithScriptLength(scriptLength) {
|
|
186
|
+
if (!types_1.PositiveInteger.is(scriptLength)) {
|
|
187
|
+
throw new TypeError(`expected positive integer for scriptLength, got ${scriptLength}`);
|
|
188
|
+
}
|
|
189
|
+
return scriptLength + (0, scriptSizes_1.compactSize)(scriptLength) + virtualSizes_1.VirtualSizes.txOutputAmountSize;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* @return
|
|
193
|
+
*/
|
|
194
|
+
static fromScriptType(scriptType, params = {}) {
|
|
195
|
+
switch (scriptType) {
|
|
196
|
+
case 'p2sh':
|
|
197
|
+
case 'p2shP2wsh':
|
|
198
|
+
case 'p2wsh':
|
|
199
|
+
case 'p2shP2pk':
|
|
200
|
+
return Dimensions.SingleInput[scriptType];
|
|
201
|
+
case 'p2tr':
|
|
202
|
+
case 'taprootScriptPathSpend':
|
|
203
|
+
switch (params.scriptPathLevel) {
|
|
204
|
+
case 1:
|
|
205
|
+
return Dimensions.SingleInput.p2trScriptPathLevel1;
|
|
206
|
+
case 2:
|
|
207
|
+
return Dimensions.SingleInput.p2trScriptPathLevel2;
|
|
208
|
+
default:
|
|
209
|
+
throw new Error(`unexpected script path level`);
|
|
210
|
+
}
|
|
211
|
+
case 'p2trMusig2':
|
|
212
|
+
switch (params.scriptPathLevel) {
|
|
213
|
+
case undefined:
|
|
214
|
+
return Dimensions.SingleInput.p2trKeypath;
|
|
215
|
+
case 1:
|
|
216
|
+
return Dimensions.SingleInput.p2trScriptPathLevel1;
|
|
217
|
+
default:
|
|
218
|
+
throw new Error(`unexpected script path level`);
|
|
219
|
+
}
|
|
220
|
+
case 'taprootKeyPathSpend':
|
|
221
|
+
return Dimensions.SingleInput.p2trKeypath;
|
|
222
|
+
default:
|
|
223
|
+
throw new Error(`unexpected scriptType ${scriptType}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
static getAssumedDimension(params = {}, index) {
|
|
227
|
+
const { assumeUnsigned } = params;
|
|
228
|
+
if (!assumeUnsigned) {
|
|
229
|
+
throw new Error(`illegal input ${index}: empty script and assumeUnsigned not set`);
|
|
230
|
+
}
|
|
231
|
+
return assumeUnsigned;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* @param input - the transaction input to count
|
|
235
|
+
* @param params
|
|
236
|
+
* [param.assumeUnsigned] - default type for unsigned input
|
|
237
|
+
*/
|
|
238
|
+
static fromInput(input, params = {}) {
|
|
239
|
+
if (input.script?.length || input.witness?.length) {
|
|
240
|
+
const parsed = utxolib.bitgo.parseSignatureScript(input);
|
|
241
|
+
return Dimensions.fromScriptType(parsed.scriptType, parsed);
|
|
242
|
+
}
|
|
243
|
+
return Dimensions.getAssumedDimension(params, input.index);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create Dimensions from psbt input
|
|
247
|
+
* @param input - psbt input
|
|
248
|
+
*/
|
|
249
|
+
static fromPsbtInput(input) {
|
|
250
|
+
const parsed = utxo_lib_1.bitgo.parsePsbtInput(input);
|
|
251
|
+
return Dimensions.fromScriptType(parsed.scriptType, parsed);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* @param inputs - Array of inputs
|
|
255
|
+
* @param params - @see Dimensions.fromInput()
|
|
256
|
+
* @return {Dimensions} sum of the dimensions for each input (@see Dimensions.fromInput())
|
|
257
|
+
*/
|
|
258
|
+
static fromInputs(inputs, params) {
|
|
259
|
+
if (!Array.isArray(inputs)) {
|
|
260
|
+
throw new TypeError(`inputs must be array`);
|
|
261
|
+
}
|
|
262
|
+
return Dimensions.sum(...inputs.map((i) => Dimensions.fromInput(i, params)));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Create Dimensions from multiple psbt inputs
|
|
266
|
+
* @param inputs psbt input array
|
|
267
|
+
* @return {Dimensions} sum of the dimensions for each input (@see Dimensions.fromPsbtInput())
|
|
268
|
+
*/
|
|
269
|
+
static fromPsbtInputs(inputs) {
|
|
270
|
+
if (!Array.isArray(inputs)) {
|
|
271
|
+
throw new TypeError(`inputs must be array`);
|
|
272
|
+
}
|
|
273
|
+
return Dimensions.sum(...inputs.map((input, _) => Dimensions.fromPsbtInput(input)));
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* @param scriptLength {number} - size of the output script in bytes
|
|
277
|
+
* @return {Dimensions} - Dimensions of the output
|
|
278
|
+
*/
|
|
279
|
+
static fromOutputScriptLength(scriptLength) {
|
|
280
|
+
return Dimensions.sum({
|
|
281
|
+
outputs: {
|
|
282
|
+
count: 1,
|
|
283
|
+
size: Dimensions.getVSizeForOutputWithScriptLength(scriptLength),
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* @param output - a tx output
|
|
289
|
+
* @return Dimensions - the dimensions of the given output
|
|
290
|
+
*/
|
|
291
|
+
static fromOutput({ script }) {
|
|
292
|
+
if (!script) {
|
|
293
|
+
throw new Error('expected output script to be defined');
|
|
294
|
+
}
|
|
295
|
+
if (!Buffer.isBuffer(script)) {
|
|
296
|
+
throw new TypeError('expected script to be buffer, got ' + typeof script);
|
|
297
|
+
}
|
|
298
|
+
return Dimensions.fromOutputScriptLength(script.length);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* @param outputs - Array of outputs
|
|
302
|
+
* @return {Dimensions} sum of the dimensions for each output (@see Dimensions.fromOutput())
|
|
303
|
+
*/
|
|
304
|
+
static fromOutputs(outputs) {
|
|
305
|
+
if (!Array.isArray(outputs)) {
|
|
306
|
+
throw new TypeError(`outputs must be array`);
|
|
307
|
+
}
|
|
308
|
+
return Dimensions.sum(...outputs.map(Dimensions.fromOutput));
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Returns the dimensions of an output that will be created on a specific chain.
|
|
312
|
+
* Currently, this simply adds a default output.
|
|
313
|
+
*
|
|
314
|
+
* @param chain - Chain code as defined by utxolib.bitgo
|
|
315
|
+
* @return {Dimensions} - Dimensions for a single output on the given chain.
|
|
316
|
+
*/
|
|
317
|
+
static fromOutputOnChain(chain) {
|
|
318
|
+
return Dimensions.fromOutputScriptLength(Dimensions.getOutputScriptLengthForChain(chain));
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Return dimensions of an unspent according to `chain` parameter
|
|
322
|
+
* @param chain - Chain code as defined by utxo.chain
|
|
323
|
+
* @param params - Hint for unspents with variable input sizes (p2tr, p2trMusig2)
|
|
324
|
+
* @return {Dimensions} of the unspent
|
|
325
|
+
* @throws if the chain code is invalid or unsupported
|
|
326
|
+
*/
|
|
327
|
+
static fromUnspent({ chain }, params = defaultUnspentParams) {
|
|
328
|
+
if (!isChainCode(chain)) {
|
|
329
|
+
throw new TypeError('invalid chain code');
|
|
330
|
+
}
|
|
331
|
+
const scriptType = scriptTypeForChain(chain);
|
|
332
|
+
return Dimensions.fromScriptType(scriptType, scriptType === 'p2tr' ? params.p2tr : scriptType === 'p2trMusig2' ? params.p2trMusig2 : {});
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* @param unspents
|
|
336
|
+
* @param params - Hint for unspents with variable input sizes (p2tr, p2trMusig2)
|
|
337
|
+
* @return {Dimensions} sum of the dimensions for each unspent (@see Dimensions.fromUnspent())
|
|
338
|
+
*/
|
|
339
|
+
static fromUnspents(unspents, params = defaultUnspentParams) {
|
|
340
|
+
if (!Array.isArray(unspents)) {
|
|
341
|
+
throw new TypeError(`unspents must be array`);
|
|
342
|
+
}
|
|
343
|
+
// Convert the individual unspents into dimensions and sum them up
|
|
344
|
+
return Dimensions.sum(...unspents.map((u) => Dimensions.fromUnspent(u, params)));
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* @param transaction - bitcoin-like transaction
|
|
348
|
+
* @param [param.assumeUnsigned] - default type for unsigned inputs
|
|
349
|
+
* @return {Dimensions}
|
|
350
|
+
*/
|
|
351
|
+
static fromTransaction({ ins, outs, }, params) {
|
|
352
|
+
return Dimensions.fromInputs(ins, params).plus(Dimensions.fromOutputs(outs));
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Create Dimensions from psbt inputs and outputs
|
|
356
|
+
* @param psbt
|
|
357
|
+
* @return {Dimensions}
|
|
358
|
+
*/
|
|
359
|
+
static fromPsbt(psbt) {
|
|
360
|
+
return Dimensions.fromPsbtInputs(psbt.data.inputs).plus(Dimensions.fromOutputs(psbt.getUnsignedTx().outs));
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* @param dimensions (can be partially defined)
|
|
364
|
+
* @return new dimensions with argument added
|
|
365
|
+
*/
|
|
366
|
+
plus(dimensions) {
|
|
367
|
+
if (typeof dimensions !== 'object') {
|
|
368
|
+
throw new TypeError(`expected argument to be object`);
|
|
369
|
+
}
|
|
370
|
+
if (!(dimensions instanceof Dimensions)) {
|
|
371
|
+
dimensions = new Dimensions(dimensions);
|
|
372
|
+
}
|
|
373
|
+
// Catch instances where we try to initialize Dimensions from partial data using deprecated parameters
|
|
374
|
+
// using only "nOutputs".
|
|
375
|
+
if ('nOutputs' in dimensions) {
|
|
376
|
+
if (!('outputs' in dimensions)) {
|
|
377
|
+
throw new Error('deprecated partial addition: argument has key "nOutputs" but no "outputs"');
|
|
378
|
+
}
|
|
379
|
+
const { outputs, nOutputs } = dimensions;
|
|
380
|
+
if (outputs.count !== nOutputs) {
|
|
381
|
+
throw new Error('deprecated partial addition: inconsistent values for "nOutputs" and "outputs.count"');
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return mapDimensions(this, (key, v) => {
|
|
385
|
+
const w = dimensions[key] ?? Dimensions.ZERO[key];
|
|
386
|
+
if (key === 'outputs') {
|
|
387
|
+
const vOutputs = v;
|
|
388
|
+
const wOutputs = w;
|
|
389
|
+
return new OutputDimensions({
|
|
390
|
+
count: vOutputs.count + wOutputs.count,
|
|
391
|
+
size: vOutputs.size + wOutputs.size,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
return v + w;
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Multiply dimensions by a given factor
|
|
399
|
+
* @param factor - Positive integer
|
|
400
|
+
* @return {Dimensions}
|
|
401
|
+
*/
|
|
402
|
+
times(factor) {
|
|
403
|
+
if (!types_1.PositiveInteger.is(factor)) {
|
|
404
|
+
throw new TypeError(`expected factor to be positive integer`);
|
|
405
|
+
}
|
|
406
|
+
return mapDimensions(this, (key, value) => {
|
|
407
|
+
if (key === 'outputs') {
|
|
408
|
+
const vOutputs = value;
|
|
409
|
+
return {
|
|
410
|
+
count: vOutputs.count * factor,
|
|
411
|
+
size: vOutputs.size * factor,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
return value * factor;
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* @return Number of total inputs (p2sh, p2shP2wsh and p2wsh)
|
|
419
|
+
* @deprecated use `dimension.nInputs` instead
|
|
420
|
+
*/
|
|
421
|
+
getNInputs() {
|
|
422
|
+
return this.nInputs;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* @returns {boolean} true iff dimensions have one or more (p2sh)p2wsh inputs
|
|
426
|
+
*/
|
|
427
|
+
isSegwit() {
|
|
428
|
+
return (this.nP2wshInputs +
|
|
429
|
+
this.nP2shP2wshInputs +
|
|
430
|
+
this.nP2trKeypathInputs +
|
|
431
|
+
this.nP2trScriptPathLevel1Inputs +
|
|
432
|
+
this.nP2trScriptPathLevel2Inputs >
|
|
433
|
+
0);
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* @return {Number} overhead vsize, based on result isSegwit().
|
|
437
|
+
*/
|
|
438
|
+
getOverheadVSize() {
|
|
439
|
+
return this.isSegwit() ? virtualSizes_1.VirtualSizes.txSegOverheadVSize : virtualSizes_1.VirtualSizes.txOverheadSize;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* @returns {number} vsize of inputs, without transaction overhead
|
|
443
|
+
*/
|
|
444
|
+
getInputsVSize() {
|
|
445
|
+
const { txP2shInputSize, txP2shP2wshInputSize, txP2wshInputSize, txP2trKeypathInputSize, txP2trScriptPathLevel1InputSize, txP2trScriptPathLevel2InputSize, txP2shP2pkInputSize, } = virtualSizes_1.VirtualSizes;
|
|
446
|
+
const { nP2shInputs, nP2shP2wshInputs, nP2wshInputs, nP2trKeypathInputs, nP2trScriptPathLevel1Inputs, nP2trScriptPathLevel2Inputs, nP2shP2pkInputs, } = this;
|
|
447
|
+
const size = nP2shInputs * txP2shInputSize +
|
|
448
|
+
nP2shP2wshInputs * txP2shP2wshInputSize +
|
|
449
|
+
nP2wshInputs * txP2wshInputSize +
|
|
450
|
+
nP2trKeypathInputs * txP2trKeypathInputSize +
|
|
451
|
+
nP2shP2pkInputs * txP2shP2pkInputSize +
|
|
452
|
+
nP2trScriptPathLevel1Inputs * txP2trScriptPathLevel1InputSize +
|
|
453
|
+
nP2trScriptPathLevel2Inputs * txP2trScriptPathLevel2InputSize;
|
|
454
|
+
if (Number.isNaN(size)) {
|
|
455
|
+
throw new Error(`invalid size`);
|
|
456
|
+
}
|
|
457
|
+
return size;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* @returns {number} return vsize of outputs, without overhead
|
|
461
|
+
*/
|
|
462
|
+
getOutputsVSize() {
|
|
463
|
+
return this.outputs.size;
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Estimates the virtual size (1/4 weight) of a signed transaction as sum of
|
|
467
|
+
* overhead vsize, input vsize and output vsize.
|
|
468
|
+
* @returns {Number} The estimated vsize of the transaction dimensions.
|
|
469
|
+
*/
|
|
470
|
+
getVSize() {
|
|
471
|
+
return this.getOverheadVSize() + this.getInputsVSize() + this.getOutputsVSize();
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
exports.Dimensions = Dimensions;
|
|
475
|
+
Dimensions.ZERO = Object.freeze(new Dimensions());
|
|
476
|
+
Dimensions.SingleOutput = Object.freeze({
|
|
477
|
+
p2sh: Dimensions.singleOutput(virtualSizes_1.VirtualSizes.txP2shOutputSize),
|
|
478
|
+
p2shP2wsh: Dimensions.singleOutput(virtualSizes_1.VirtualSizes.txP2shP2wshOutputSize),
|
|
479
|
+
p2wsh: Dimensions.singleOutput(virtualSizes_1.VirtualSizes.txP2wshOutputSize),
|
|
480
|
+
p2tr: Dimensions.singleOutput(virtualSizes_1.VirtualSizes.txP2trOutputSize),
|
|
481
|
+
p2pkh: Dimensions.singleOutput(virtualSizes_1.VirtualSizes.txP2pkhOutputSize),
|
|
482
|
+
p2wpkh: Dimensions.singleOutput(virtualSizes_1.VirtualSizes.txP2wpkhOutputSize),
|
|
483
|
+
});
|
|
484
|
+
Dimensions.SingleInput = Object.freeze({
|
|
485
|
+
p2sh: Dimensions.sum({ nP2shInputs: 1 }),
|
|
486
|
+
p2shP2wsh: Dimensions.sum({ nP2shP2wshInputs: 1 }),
|
|
487
|
+
p2wsh: Dimensions.sum({ nP2wshInputs: 1 }),
|
|
488
|
+
p2trKeypath: Dimensions.sum({ nP2trKeypathInputs: 1 }),
|
|
489
|
+
p2trScriptPathLevel1: Dimensions.sum({ nP2trScriptPathLevel1Inputs: 1 }),
|
|
490
|
+
p2trScriptPathLevel2: Dimensions.sum({ nP2trScriptPathLevel2Inputs: 1 }),
|
|
491
|
+
p2shP2pk: Dimensions.sum({ nP2shP2pkInputs: 1 }),
|
|
492
|
+
});
|
|
493
|
+
Dimensions.ASSUME_P2SH = Dimensions.SingleInput.p2sh;
|
|
494
|
+
Dimensions.ASSUME_P2SH_P2WSH = Dimensions.SingleInput.p2shP2wsh;
|
|
495
|
+
Dimensions.ASSUME_P2WSH = Dimensions.SingleInput.p2wsh;
|
|
496
|
+
Dimensions.ASSUME_P2TR_KEYPATH = Dimensions.SingleInput.p2trKeypath;
|
|
497
|
+
Dimensions.ASSUME_P2TR_SCRIPTPATH_LEVEL1 = Dimensions.SingleInput.p2trScriptPathLevel1;
|
|
498
|
+
Dimensions.ASSUME_P2TR_SCRIPTPATH_LEVEL2 = Dimensions.SingleInput.p2trScriptPathLevel2;
|
|
499
|
+
Dimensions.ASSUME_P2SH_P2PK_INPUT = Dimensions.SingleInput.p2shP2pk;
|
|
500
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGltZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaW1lbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhEQUFnRDtBQUNoRCxtREFBNkM7QUFDN0MsTUFBTSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLGdCQUFLLENBQUM7QUFHbEQsK0NBQTRDO0FBQzVDLG1DQUEwQztBQUUxQyxpREFBOEM7QUFDckMsNkZBREEsMkJBQVksT0FDQTtBQUVyQjs7R0FFRztBQUNILFNBQVMsYUFBYSxDQUNwQixDQUFzQixFQUN0QixDQUFnRjtJQUVoRixPQUFPLElBQUksVUFBVSxDQUNuQixNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN0RyxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFVM0IsWUFBWSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsS0FBdUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7UUFDM0UsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FB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UyxBQUFuQyxDQUFvQztBQUNyRCx1QkFBWSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxBQUEvQixDQUFnQztBQUM1Qyw4QkFBbUIsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQUFBckMsQ0FBc0M7QUFDekQsd0NBQTZCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQUFBOUMsQ0FBK0M7QUFDNUUsd0NBQTZCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQUFBOUMsQ0FBK0M7QUFDNUUsaUNBQXNCLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEFBQWxDLENBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXRnbyB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmNvbnN0IHsgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiB9ID0gYml0Z287XG50eXBlIENoYWluQ29kZSA9IGJpdGdvLkNoYWluQ29kZTtcblxuaW1wb3J0IHsgY29tcGFjdFNpemUgfSBmcm9tICcuL3NjcmlwdFNpemVzJztcbmltcG9ydCB7IFBvc2l0aXZlSW50ZWdlciB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBWaXJ0dWFsU2l6ZXMgfSBmcm9tICcuL3ZpcnR1YWxTaXplcyc7XG5leHBvcnQgeyBWaXJ0dWFsU2l6ZXMgfTtcblxuLyoqXG4gKiBBcHBseSBgZmAgdG8gYWxsIHByb3BlcnRpZXMgb2YgYGRgXG4gKi9cbmZ1bmN0aW9uIG1hcERpbWVuc2lvbnMoXG4gIGQ6IFBhcnRpYWw8RGltZW5zaW9ucz4sXG4gIGY6IDxUIGV4dGVuZHMga2V5b2YgRGltZW5zaW9ucz4oa2V5OiBULCB2OiBEaW1lbnNpb25zW1RdIHwgdW5kZWZpbmVkKSA9PiB1bmtub3duXG4pOiBEaW1lbnNpb25zIHtcbiAgcmV0dXJuIG5ldyBEaW1lbnNpb25zKFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhkKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleSwgZihrZXkgYXMga2V5b2YgRGltZW5zaW9ucywgdmFsdWUpXSkpXG4gICk7XG59XG5cbi8qKlxuICogQWdncmVnYXRlIGNvdW50IGFuZCBzaXplIG9mIHRyYW5zYWN0aW9uIG91dHB1dHNcbiAqL1xuZXhwb3J0IGNsYXNzIE91dHB1dERpbWVuc2lvbnMge1xuICAvKipcbiAgICogTnVtYmVyIG9mIG91dHB1dHNcbiAgICovXG4gIGNvdW50OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZ2dyZWdhdGUgdlNpemVcbiAgICovXG4gIHNpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcih7IGNvdW50ID0gMCwgc2l6ZSA9IDAgfTogT3V0cHV0RGltZW5zaW9ucyA9IHsgY291bnQ6IDAsIHNpemU6IDAgfSkge1xuICAgIGlmIChjb3VudCA9PT0gMCB8fCBzaXplID09PSAwKSB7XG4gICAgICBpZiAoY291bnQgIT09IDAgfHwgc2l6ZSAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvdW50IGFuZCBzaXplIG11c3QgYm90aCBiZSB6ZXJvIGlmIG9uZSBpcyB6ZXJvYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb3VudCA9IGNvdW50O1xuICAgIHRoaXMuc2l6ZSA9IHNpemU7XG5cbiAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICB9XG59XG5cbmludGVyZmFjZSBGcm9tSW5wdXRQYXJhbXMge1xuICAvLyBJbiBjYXNlcyB3aGVyZSB0aGUgaW5wdXQgdHlwZSBpcyBhbWJpZ3VvdXMsIHdlIG11c3QgcHJvdmlkZSBhIGhpbnQgYWJvdXQgc3BlbmQgc2NyaXB0IHR5cGUuXG4gIGFzc3VtZVVuc2lnbmVkPzogRGltZW5zaW9ucztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGcm9tVW5zcGVudFBhcmFtcyB7XG4gIHAydHI6IHtcbiAgICBzY3JpcHRQYXRoTGV2ZWw/OiBudW1iZXI7XG4gIH07XG4gIHAydHJNdXNpZzI6IHtcbiAgICBzY3JpcHRQYXRoTGV2ZWw/OiBudW1iZXI7XG4gIH07XG59XG5cbmNvbnN0IGRlZmF1bHRVbnNwZW50UGFyYW1zOiBGcm9tVW5zcGVudFBhcmFtcyA9IHtcbiAgcDJ0cjoge1xuICAgIC8vIERlZmF1bHQgdG8gcmVjb3Zlcnkgc2NyaXB0IHBhdGhzLCB0byBtYWtlIGl0IGVhc2llciBmb3IgcmVjb3ZlcnkgY2FzZSBjYWxsZXJzIChXUlcgZXRjKS5cbiAgICAvLyBXUCBjYW4gZXhwbGljaXRseSBwYXNzIHNjcmlwdFBhdGhMZXZlbDogMSB0byB1c2UgaGFwcHkgcGF0aC5cbiAgICBzY3JpcHRQYXRoTGV2ZWw6IDIsXG4gIH0sXG4gIHAydHJNdXNpZzI6IHtcbiAgICAvLyBEZWZhdWx0IHRvIHNjcmlwdCBwYXRoIHNwZW5kLCB0byBtYWtlIGl0IGVhc2llciBmb3IgcmVjb3ZlcnkgY2FzZSBjYWxsZXJzIChXUlcgZXRjKS5cbiAgICAvLyBXUCBjYW4gZXhwbGljaXRseSBwYXNzIHNjcmlwdFBhdGhMZXZlbDogdW5kZWZpbmVkIHRvIHVzZSBrZXkgcGF0aC5cbiAgICBzY3JpcHRQYXRoTGV2ZWw6IDEsXG4gIH0sXG59O1xuXG4vKipcbiAqIERpbWVuc2lvbnMgb2YgYSBCaXRHbyB3YWxsZXQgdHJhbnNhY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9ucyB7XG4gIC8qKiBJbnB1dCBjb3VudHMgZm9yIEJpdEdvIHdhbGxldCBtdWx0aS1zaWduYXR1cmUgaW5wdXRzICovXG4gIHB1YmxpYyByZWFkb25seSBuUDJzaElucHV0czogbnVtYmVyID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IG5QMnNoUDJ3c2hJbnB1dHM6IG51bWJlciA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBuUDJ3c2hJbnB1dHM6IG51bWJlciA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBuUDJ0cktleXBhdGhJbnB1dHM6IG51bWJlciA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IG51bWJlciA9IDA7XG4gIHB1YmxpYyByZWFkb25seSBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHM6IG51bWJlciA9IDA7XG5cbiAgLyogSW5wdXQgY291bnQgZm9yIHNpbmdsZS1zaWduYXR1cmUgaW5wdXRzIChSZXBsYXkgUHJvdGVjdGlvbiBpbnB1dHMpICovXG4gIHB1YmxpYyByZWFkb25seSBuUDJzaFAycGtJbnB1dHM6IG51bWJlciA9IDA7XG5cbiAgcHVibGljIHJlYWRvbmx5IG91dHB1dHM6IE91dHB1dERpbWVuc2lvbnMgPSBuZXcgT3V0cHV0RGltZW5zaW9ucygpO1xuXG4gIGNvbnN0cnVjdG9yKGQ6IFBhcnRpYWw8RGltZW5zaW9ucz4gPSB7fSkge1xuICAgIE9iamVjdC5lbnRyaWVzKGQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4gdGhpcy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKSk7XG5cbiAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9wZXJ0eShrOiBzdHJpbmcsIHY6IHVua25vd24pOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGspIHtcbiAgICAgIGNhc2UgJ25QMnNoSW5wdXRzJzpcbiAgICAgIGNhc2UgJ25QMnNoUDJ3c2hJbnB1dHMnOlxuICAgICAgY2FzZSAnblAyd3NoSW5wdXRzJzpcbiAgICAgIGNhc2UgJ25QMnRyS2V5cGF0aElucHV0cyc6XG4gICAgICBjYXNlICduUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHMnOlxuICAgICAgY2FzZSAnblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzJzpcbiAgICAgIGNhc2UgJ25QMnNoUDJwa0lucHV0cyc6XG4gICAgICAgIGlmICh0eXBlb2YgdiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3BlcnR5ICR7a30gbXVzdCBiZSBudW1iZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHYpIHx8IHYgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBwcm9wZXJ0eSAke2t9IG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSBpbnRlZ2VyYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvdXRwdXRzJzpcbiAgICAgICAgaWYgKCEodiBpbnN0YW5jZW9mIE91dHB1dERpbWVuc2lvbnMpKSB7XG4gICAgICAgICAgdiA9IG5ldyBPdXRwdXREaW1lbnNpb25zKHYgYXMgT3V0cHV0RGltZW5zaW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gcHJvcGVydHkgJHtrfWApO1xuICAgIH1cblxuICAgICh0aGlzIGFzIGFueSlba10gPSB2O1xuICB9XG5cbiAgc3RhdGljIHJlYWRvbmx5IFpFUk8gPSBPYmplY3QuZnJlZXplKG5ldyBEaW1lbnNpb25zKCkpO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgWkVST1xuICAgKiBAcmV0dXJuIERpbWVuc2lvbnMgZm9yIGFuIGVtcHR5IHRyYW5zYWN0aW9uXG4gICAqL1xuICBzdGF0aWMgemVybygpOiBSZWFkb25seTxEaW1lbnNpb25zPiB7XG4gICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2l6ZVxuICAgKiBAcmV0dXJuIERpbWVuc2lvbnMgZm9yIGEgc2luZ2xlIG91dHB1dCB3aXRoIGdpdmVuIHNpemVcbiAgICovXG4gIHN0YXRpYyBzaW5nbGVPdXRwdXQoc2l6ZTogbnVtYmVyKTogRGltZW5zaW9ucyB7XG4gICAgcmV0dXJuIERpbWVuc2lvbnMuc3VtKHsgb3V0cHV0czogeyBjb3VudDogMSwgc2l6ZSB9IH0pO1xuICB9XG5cbiAgc3RhdGljIHJlYWRvbmx5IFNpbmdsZU91dHB1dCA9IE9iamVjdC5mcmVlemUoe1xuICAgIHAyc2g6IERpbWVuc2lvbnMuc2luZ2xlT3V0cHV0KFZpcnR1YWxTaXplcy50eFAyc2hPdXRwdXRTaXplKSxcbiAgICBwMnNoUDJ3c2g6IERpbWVuc2lvbnMuc2luZ2xlT3V0cHV0KFZpcnR1YWxTaXplcy50eFAyc2hQMndzaE91dHB1dFNpemUpLFxuICAgIHAyd3NoOiBEaW1lbnNpb25zLnNpbmdsZU91dHB1dChWaXJ0dWFsU2l6ZXMudHhQMndzaE91dHB1dFNpemUpLFxuICAgIHAydHI6IERpbWVuc2lvbnMuc2luZ2xlT3V0cHV0KFZpcnR1YWxTaXplcy50eFAydHJPdXRwdXRTaXplKSxcblxuICAgIHAycGtoOiBEaW1lbnNpb25zLnNpbmdsZU91dHB1dChWaXJ0dWFsU2l6ZXMudHhQMnBraE91dHB1dFNpemUpLFxuICAgIHAyd3BraDogRGltZW5zaW9ucy5zaW5nbGVPdXRwdXQoVmlydHVhbFNpemVzLnR4UDJ3cGtoT3V0cHV0U2l6ZSksXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJuIE51bWJlciBvZiB0b3RhbCBpbnB1dHMgKHAyc2ggKyBwMnNoUDJ3c2ggKyBwMndzaCArIHAydHIpXG4gICAqL1xuICBnZXQgbklucHV0cygpOiBudW1iZXIge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLm5QMnNoSW5wdXRzICtcbiAgICAgIHRoaXMublAyc2hQMndzaElucHV0cyArXG4gICAgICB0aGlzLm5QMndzaElucHV0cyArXG4gICAgICB0aGlzLm5QMnRyS2V5cGF0aElucHV0cyArXG4gICAgICB0aGlzLm5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0cyArXG4gICAgICB0aGlzLm5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0cyArXG4gICAgICB0aGlzLm5QMnNoUDJwa0lucHV0c1xuICAgICk7XG4gIH1cblxuICBzZXQgbklucHV0cyhfOiBudW1iZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlYWQtb25seSBwcm9wZXJ0eSBuSW5wdXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBOdW1iZXIgb2YgdG90YWwgb3V0cHV0c1xuICAgKi9cbiAgZ2V0IG5PdXRwdXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0cy5jb3VudDtcbiAgfVxuXG4gIHNldCBuT3V0cHV0cyhfOiBudW1iZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWQtb25seSBwcm9wZXJ0eSBuT3V0cHV0c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhcmdzIC0gRGltZW5zaW9ucyAoY2FuIGJlIHBhcnRpYWxseSBkZWZpbmVkKVxuICAgKiBAcmV0dXJuIHtEaW1lbnNpb25zfSBzdW0gb2YgYXJndW1lbnRzXG4gICAqL1xuICBzdGF0aWMgc3VtKC4uLmFyZ3M6IFBhcnRpYWw8RGltZW5zaW9ucz5bXSk6IERpbWVuc2lvbnMge1xuICAgIHJldHVybiBhcmdzLnJlZHVjZSgoYTogRGltZW5zaW9ucywgYjogUGFydGlhbDxEaW1lbnNpb25zPikgPT4gYS5wbHVzKGIpLCBuZXcgRGltZW5zaW9ucygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgc3RhdGljIGdldE91dHB1dFNjcmlwdExlbmd0aEZvckNoYWluKGNoYWluOiBDaGFpbkNvZGUpOiBudW1iZXIge1xuICAgIHN3aXRjaCAoc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSkge1xuICAgICAgY2FzZSAncDJ3c2gnOlxuICAgICAgY2FzZSAncDJ0cic6XG4gICAgICBjYXNlICdwMnRyTXVzaWcyJzpcbiAgICAgICAgcmV0dXJuIDM0O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDIzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NyaXB0TGVuZ3RoXG4gICAqIEByZXR1cm4ge051bWJlcn0gdlNpemUgb2YgYW4gb3V0cHV0IHdpdGggc2NyaXB0IGxlbmd0aFxuICAgKi9cbiAgc3RhdGljIGdldFZTaXplRm9yT3V0cHV0V2l0aFNjcmlwdExlbmd0aChzY3JpcHRMZW5ndGg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKCFQb3NpdGl2ZUludGVnZXIuaXMoc2NyaXB0TGVuZ3RoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgZXhwZWN0ZWQgcG9zaXRpdmUgaW50ZWdlciBmb3Igc2NyaXB0TGVuZ3RoLCBnb3QgJHtzY3JpcHRMZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBzY3JpcHRMZW5ndGggKyBjb21wYWN0U2l6ZShzY3JpcHRMZW5ndGgpICsgVmlydHVhbFNpemVzLnR4T3V0cHV0QW1vdW50U2l6ZTtcbiAgfVxuXG4gIHN0YXRpYyByZWFkb25seSBTaW5nbGVJbnB1dCA9IE9iamVjdC5mcmVlemUoe1xuICAgIHAyc2g6IERpbWVuc2lvbnMuc3VtKHsgblAyc2hJbnB1dHM6IDEgfSksXG4gICAgcDJzaFAyd3NoOiBEaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJ3c2hJbnB1dHM6IDEgfSksXG4gICAgcDJ3c2g6IERpbWVuc2lvbnMuc3VtKHsgblAyd3NoSW5wdXRzOiAxIH0pLFxuICAgIHAydHJLZXlwYXRoOiBEaW1lbnNpb25zLnN1bSh7IG5QMnRyS2V5cGF0aElucHV0czogMSB9KSxcbiAgICBwMnRyU2NyaXB0UGF0aExldmVsMTogRGltZW5zaW9ucy5zdW0oeyBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHM6IDEgfSksXG4gICAgcDJ0clNjcmlwdFBhdGhMZXZlbDI6IERpbWVuc2lvbnMuc3VtKHsgblAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzOiAxIH0pLFxuICAgIHAyc2hQMnBrOiBEaW1lbnNpb25zLnN1bSh7IG5QMnNoUDJwa0lucHV0czogMSB9KSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5cbiAgICovXG4gIHN0YXRpYyBmcm9tU2NyaXB0VHlwZShcbiAgICBzY3JpcHRUeXBlOiB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZSB8IHV0eG9saWIuYml0Z28uUGFyc2VkU2NyaXB0VHlwZTJPZjMgfCAncDJwa2gnLFxuICAgIHBhcmFtczoge1xuICAgICAgc2NyaXB0UGF0aExldmVsPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiBEaW1lbnNpb25zIHtcbiAgICBzd2l0Y2ggKHNjcmlwdFR5cGUpIHtcbiAgICAgIGNhc2UgJ3Ayc2gnOlxuICAgICAgY2FzZSAncDJzaFAyd3NoJzpcbiAgICAgIGNhc2UgJ3Ayd3NoJzpcbiAgICAgIGNhc2UgJ3Ayc2hQMnBrJzpcbiAgICAgICAgcmV0dXJuIERpbWVuc2lvbnMuU2luZ2xlSW5wdXRbc2NyaXB0VHlwZV07XG4gICAgICBjYXNlICdwMnRyJzpcbiAgICAgIGNhc2UgJ3RhcHJvb3RTY3JpcHRQYXRoU3BlbmQnOlxuICAgICAgICBzd2l0Y2ggKHBhcmFtcy5zY3JpcHRQYXRoTGV2ZWwpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gRGltZW5zaW9ucy5TaW5nbGVJbnB1dC5wMnRyU2NyaXB0UGF0aExldmVsMTtcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICByZXR1cm4gRGltZW5zaW9ucy5TaW5nbGVJbnB1dC5wMnRyU2NyaXB0UGF0aExldmVsMjtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHNjcmlwdCBwYXRoIGxldmVsYCk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgJ3AydHJNdXNpZzInOlxuICAgICAgICBzd2l0Y2ggKHBhcmFtcy5zY3JpcHRQYXRoTGV2ZWwpIHtcbiAgICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgICAgIHJldHVybiBEaW1lbnNpb25zLlNpbmdsZUlucHV0LnAydHJLZXlwYXRoO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBEaW1lbnNpb25zLlNpbmdsZUlucHV0LnAydHJTY3JpcHRQYXRoTGV2ZWwxO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgc2NyaXB0IHBhdGggbGV2ZWxgKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAndGFwcm9vdEtleVBhdGhTcGVuZCc6XG4gICAgICAgIHJldHVybiBEaW1lbnNpb25zLlNpbmdsZUlucHV0LnAydHJLZXlwYXRoO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHNjcmlwdFR5cGUgJHtzY3JpcHRUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZWFkb25seSBBU1NVTUVfUDJTSCA9IERpbWVuc2lvbnMuU2luZ2xlSW5wdXQucDJzaDtcbiAgc3RhdGljIHJlYWRvbmx5IEFTU1VNRV9QMlNIX1AyV1NIID0gRGltZW5zaW9ucy5TaW5nbGVJbnB1dC5wMnNoUDJ3c2g7XG4gIHN0YXRpYyByZWFkb25seSBBU1NVTUVfUDJXU0ggPSBEaW1lbnNpb25zLlNpbmdsZUlucHV0LnAyd3NoO1xuICBzdGF0aWMgcmVhZG9ubHkgQVNTVU1FX1AyVFJfS0VZUEFUSCA9IERpbWVuc2lvbnMuU2luZ2xlSW5wdXQucDJ0cktleXBhdGg7XG4gIHN0YXRpYyByZWFkb25seSBBU1NVTUVfUDJUUl9TQ1JJUFRQQVRIX0xFVkVMMSA9IERpbWVuc2lvbnMuU2luZ2xlSW5wdXQucDJ0clNjcmlwdFBhdGhMZXZlbDE7XG4gIHN0YXRpYyByZWFkb25seSBBU1NVTUVfUDJUUl9TQ1JJUFRQQVRIX0xFVkVMMiA9IERpbWVuc2lvbnMuU2luZ2xlSW5wdXQucDJ0clNjcmlwdFBhdGhMZXZlbDI7XG4gIHN0YXRpYyByZWFkb25seSBBU1NVTUVfUDJTSF9QMlBLX0lOUFVUID0gRGltZW5zaW9ucy5TaW5nbGVJbnB1dC5wMnNoUDJwaztcblxuICBwcml2YXRlIHN0YXRpYyBnZXRBc3N1bWVkRGltZW5zaW9uKHBhcmFtczogRnJvbUlucHV0UGFyYW1zID0ge30sIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCB7IGFzc3VtZVVuc2lnbmVkIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFhc3N1bWVVbnNpZ25lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbGxlZ2FsIGlucHV0ICR7aW5kZXh9OiBlbXB0eSBzY3JpcHQgYW5kIGFzc3VtZVVuc2lnbmVkIG5vdCBzZXRgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFzc3VtZVVuc2lnbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbnB1dCAtIHRoZSB0cmFuc2FjdGlvbiBpbnB1dCB0byBjb3VudFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgICAgICBbcGFyYW0uYXNzdW1lVW5zaWduZWRdIC0gZGVmYXVsdCB0eXBlIGZvciB1bnNpZ25lZCBpbnB1dFxuICAgKi9cbiAgc3RhdGljIGZyb21JbnB1dChpbnB1dDogdXR4b2xpYi5UeElucHV0LCBwYXJhbXM6IEZyb21JbnB1dFBhcmFtcyA9IHt9KTogRGltZW5zaW9ucyB7XG4gICAgaWYgKGlucHV0LnNjcmlwdD8ubGVuZ3RoIHx8IGlucHV0LndpdG5lc3M/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgcGFyc2VkID0gdXR4b2xpYi5iaXRnby5wYXJzZVNpZ25hdHVyZVNjcmlwdChpbnB1dCk7XG4gICAgICByZXR1cm4gRGltZW5zaW9ucy5mcm9tU2NyaXB0VHlwZShwYXJzZWQuc2NyaXB0VHlwZSwgcGFyc2VkIGFzIHsgc2NyaXB0UGF0aExldmVsPzogbnVtYmVyIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBEaW1lbnNpb25zLmdldEFzc3VtZWREaW1lbnNpb24ocGFyYW1zLCBpbnB1dC5pbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIERpbWVuc2lvbnMgZnJvbSBwc2J0IGlucHV0XG4gICAqIEBwYXJhbSBpbnB1dCAtIHBzYnQgaW5wdXRcbiAgICovXG4gIHN0YXRpYyBmcm9tUHNidElucHV0KGlucHV0OiBiaXRnby5Qc2J0SW5wdXRUeXBlKTogRGltZW5zaW9ucyB7XG4gICAgY29uc3QgcGFyc2VkID0gYml0Z28ucGFyc2VQc2J0SW5wdXQoaW5wdXQpO1xuICAgIHJldHVybiBEaW1lbnNpb25zLmZyb21TY3JpcHRUeXBlKHBhcnNlZC5zY3JpcHRUeXBlLCBwYXJzZWQgYXMgeyBzY3JpcHRQYXRoTGV2ZWw/OiBudW1iZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGlucHV0cyAtIEFycmF5IG9mIGlucHV0c1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gQHNlZSBEaW1lbnNpb25zLmZyb21JbnB1dCgpXG4gICAqIEByZXR1cm4ge0RpbWVuc2lvbnN9IHN1bSBvZiB0aGUgZGltZW5zaW9ucyBmb3IgZWFjaCBpbnB1dCAoQHNlZSBEaW1lbnNpb25zLmZyb21JbnB1dCgpKVxuICAgKi9cbiAgc3RhdGljIGZyb21JbnB1dHMoaW5wdXRzOiB1dHhvbGliLlR4SW5wdXRbXSwgcGFyYW1zPzogRnJvbUlucHV0UGFyYW1zKTogRGltZW5zaW9ucyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0cyBtdXN0IGJlIGFycmF5YCk7XG4gICAgfVxuICAgIHJldHVybiBEaW1lbnNpb25zLnN1bSguLi5pbnB1dHMubWFwKChpKSA9PiBEaW1lbnNpb25zLmZyb21JbnB1dChpLCBwYXJhbXMpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIERpbWVuc2lvbnMgZnJvbSBtdWx0aXBsZSBwc2J0IGlucHV0c1xuICAgKiBAcGFyYW0gaW5wdXRzIHBzYnQgaW5wdXQgYXJyYXlcbiAgICogQHJldHVybiB7RGltZW5zaW9uc30gc3VtIG9mIHRoZSBkaW1lbnNpb25zIGZvciBlYWNoIGlucHV0IChAc2VlIERpbWVuc2lvbnMuZnJvbVBzYnRJbnB1dCgpKVxuICAgKi9cbiAgc3RhdGljIGZyb21Qc2J0SW5wdXRzKGlucHV0czogYml0Z28uUHNidElucHV0VHlwZVtdKTogRGltZW5zaW9ucyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGlucHV0cyBtdXN0IGJlIGFycmF5YCk7XG4gICAgfVxuICAgIHJldHVybiBEaW1lbnNpb25zLnN1bSguLi5pbnB1dHMubWFwKChpbnB1dCwgXykgPT4gRGltZW5zaW9ucy5mcm9tUHNidElucHV0KGlucHV0KSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzY3JpcHRMZW5ndGgge251bWJlcn0gLSBzaXplIG9mIHRoZSBvdXRwdXQgc2NyaXB0IGluIGJ5dGVzXG4gICAqIEByZXR1cm4ge0RpbWVuc2lvbnN9IC0gRGltZW5zaW9ucyBvZiB0aGUgb3V0cHV0XG4gICAqL1xuICBzdGF0aWMgZnJvbU91dHB1dFNjcmlwdExlbmd0aChzY3JpcHRMZW5ndGg6IG51bWJlcik6IERpbWVuc2lvbnMge1xuICAgIHJldHVybiBEaW1lbnNpb25zLnN1bSh7XG4gICAgICBvdXRwdXRzOiB7XG4gICAgICAgIGNvdW50OiAxLFxuICAgICAgICBzaXplOiBEaW1lbnNpb25zLmdldFZTaXplRm9yT3V0cHV0V2l0aFNjcmlwdExlbmd0aChzY3JpcHRMZW5ndGgpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3V0cHV0IC0gYSB0eCBvdXRwdXRcbiAgICogQHJldHVybiBEaW1lbnNpb25zIC0gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGdpdmVuIG91dHB1dFxuICAgKi9cbiAgc3RhdGljIGZyb21PdXRwdXQoeyBzY3JpcHQgfTogeyBzY3JpcHQ6IEJ1ZmZlciB9KTogRGltZW5zaW9ucyB7XG4gICAgaWYgKCFzY3JpcHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgb3V0cHV0IHNjcmlwdCB0byBiZSBkZWZpbmVkJyk7XG4gICAgfVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHNjcmlwdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4cGVjdGVkIHNjcmlwdCB0byBiZSBidWZmZXIsIGdvdCAnICsgdHlwZW9mIHNjcmlwdCk7XG4gICAgfVxuICAgIHJldHVybiBEaW1lbnNpb25zLmZyb21PdXRwdXRTY3JpcHRMZW5ndGgoc2NyaXB0Lmxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG91dHB1dHMgLSBBcnJheSBvZiBvdXRwdXRzXG4gICAqIEByZXR1cm4ge0RpbWVuc2lvbnN9IHN1bSBvZiB0aGUgZGltZW5zaW9ucyBmb3IgZWFjaCBvdXRwdXQgKEBzZWUgRGltZW5zaW9ucy5mcm9tT3V0cHV0KCkpXG4gICAqL1xuICBzdGF0aWMgZnJvbU91dHB1dHMob3V0cHV0czogeyBzY3JpcHQ6IEJ1ZmZlciB9W10pOiBEaW1lbnNpb25zIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkob3V0cHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYG91dHB1dHMgbXVzdCBiZSBhcnJheWApO1xuICAgIH1cbiAgICByZXR1cm4gRGltZW5zaW9ucy5zdW0oLi4ub3V0cHV0cy5tYXAoRGltZW5zaW9ucy5mcm9tT3V0cHV0KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGltZW5zaW9ucyBvZiBhbiBvdXRwdXQgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb24gYSBzcGVjaWZpYyBjaGFpbi5cbiAgICogQ3VycmVudGx5LCB0aGlzIHNpbXBseSBhZGRzIGEgZGVmYXVsdCBvdXRwdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFpbiAtIENoYWluIGNvZGUgYXMgZGVmaW5lZCBieSB1dHhvbGliLmJpdGdvXG4gICAqIEByZXR1cm4ge0RpbWVuc2lvbnN9IC0gRGltZW5zaW9ucyBmb3IgYSBzaW5nbGUgb3V0cHV0IG9uIHRoZSBnaXZlbiBjaGFpbi5cbiAgICovXG4gIHN0YXRpYyBmcm9tT3V0cHV0T25DaGFpbihjaGFpbjogQ2hhaW5Db2RlKTogRGltZW5zaW9ucyB7XG4gICAgcmV0dXJuIERpbWVuc2lvbnMuZnJvbU91dHB1dFNjcmlwdExlbmd0aChEaW1lbnNpb25zLmdldE91dHB1dFNjcmlwdExlbmd0aEZvckNoYWluKGNoYWluKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGRpbWVuc2lvbnMgb2YgYW4gdW5zcGVudCBhY2NvcmRpbmcgdG8gYGNoYWluYCBwYXJhbWV0ZXJcbiAgICogQHBhcmFtIGNoYWluIC0gQ2hhaW4gY29kZSBhcyBkZWZpbmVkIGJ5IHV0eG8uY2hhaW5cbiAgICogQHBhcmFtIHBhcmFtcyAtIEhpbnQgZm9yIHVuc3BlbnRzIHdpdGggdmFyaWFibGUgaW5wdXQgc2l6ZXMgKHAydHIsIHAydHJNdXNpZzIpXG4gICAqIEByZXR1cm4ge0RpbWVuc2lvbnN9IG9mIHRoZSB1bnNwZW50XG4gICAqIEB0aHJvd3MgaWYgdGhlIGNoYWluIGNvZGUgaXMgaW52YWxpZCBvciB1bnN1cHBvcnRlZFxuICAgKi9cbiAgc3RhdGljIGZyb21VbnNwZW50KHsgY2hhaW4gfTogeyBjaGFpbjogbnVtYmVyIH0sIHBhcmFtczogRnJvbVVuc3BlbnRQYXJhbXMgPSBkZWZhdWx0VW5zcGVudFBhcmFtcyk6IERpbWVuc2lvbnMge1xuICAgIGlmICghaXNDaGFpbkNvZGUoY2hhaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGNoYWluIGNvZGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKTtcblxuICAgIHJldHVybiBEaW1lbnNpb25zLmZyb21TY3JpcHRUeXBlKFxuICAgICAgc2NyaXB0VHlwZSxcbiAgICAgIHNjcmlwdFR5cGUgPT09ICdwMnRyJyA/IHBhcmFtcy5wMnRyIDogc2NyaXB0VHlwZSA9PT0gJ3AydHJNdXNpZzInID8gcGFyYW1zLnAydHJNdXNpZzIgOiB7fVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHVuc3BlbnRzXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBIaW50IGZvciB1bnNwZW50cyB3aXRoIHZhcmlhYmxlIGlucHV0IHNpemVzIChwMnRyLCBwMnRyTXVzaWcyKVxuICAgKiBAcmV0dXJuIHtEaW1lbnNpb25zfSBzdW0gb2YgdGhlIGRpbWVuc2lvbnMgZm9yIGVhY2ggdW5zcGVudCAoQHNlZSBEaW1lbnNpb25zLmZyb21VbnNwZW50KCkpXG4gICAqL1xuICBzdGF0aWMgZnJvbVVuc3BlbnRzKHVuc3BlbnRzOiB7IGNoYWluOiBDaGFpbkNvZGUgfVtdLCBwYXJhbXM6IEZyb21VbnNwZW50UGFyYW1zID0gZGVmYXVsdFVuc3BlbnRQYXJhbXMpOiBEaW1lbnNpb25zIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodW5zcGVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGB1bnNwZW50cyBtdXN0IGJlIGFycmF5YCk7XG4gICAgfVxuICAgIC8vIENvbnZlcnQgdGhlIGluZGl2aWR1YWwgdW5zcGVudHMgaW50byBkaW1lbnNpb25zIGFuZCBzdW0gdGhlbSB1cFxuICAgIHJldHVybiBEaW1lbnNpb25zLnN1bSguLi51bnNwZW50cy5tYXAoKHUpID0+IERpbWVuc2lvbnMuZnJvbVVuc3BlbnQodSwgcGFyYW1zKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbiAtIGJpdGNvaW4tbGlrZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gW3BhcmFtLmFzc3VtZVVuc2lnbmVkXSAtIGRlZmF1bHQgdHlwZSBmb3IgdW5zaWduZWQgaW5wdXRzXG4gICAqIEByZXR1cm4ge0RpbWVuc2lvbnN9XG4gICAqL1xuICBzdGF0aWMgZnJvbVRyYW5zYWN0aW9uKFxuICAgIHtcbiAgICAgIGlucyxcbiAgICAgIG91dHMsXG4gICAgfToge1xuICAgICAgaW5zOiB1dHhvbGliLlR4SW5wdXRbXTtcbiAgICAgIG91dHM6IHV0eG9saWIuVHhPdXRwdXRbXTtcbiAgICB9LFxuICAgIHBhcmFtcz86IEZyb21JbnB1dFBhcmFtc1xuICApOiBEaW1lbnNpb25zIHtcbiAgICByZXR1cm4gRGltZW5zaW9ucy5mcm9tSW5wdXRzKGlucywgcGFyYW1zKS5wbHVzKERpbWVuc2lvbnMuZnJvbU91dHB1dHMob3V0cykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBEaW1lbnNpb25zIGZyb20gcHNidCBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICogQHBhcmFtIHBzYnRcbiAgICogQHJldHVybiB7RGltZW5zaW9uc31cbiAgICovXG4gIHN0YXRpYyBmcm9tUHNidChwc2J0OiBiaXRnby5VdHhvUHNidCk6IERpbWVuc2lvbnMge1xuICAgIHJldHVybiBEaW1lbnNpb25zLmZyb21Qc2J0SW5wdXRzKHBzYnQuZGF0YS5pbnB1dHMpLnBsdXMoRGltZW5zaW9ucy5mcm9tT3V0cHV0cyhwc2J0LmdldFVuc2lnbmVkVHgoKS5vdXRzKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGRpbWVuc2lvbnMgKGNhbiBiZSBwYXJ0aWFsbHkgZGVmaW5lZClcbiAgICogQHJldHVybiBuZXcgZGltZW5zaW9ucyB3aXRoIGFyZ3VtZW50IGFkZGVkXG4gICAqL1xuICBwbHVzKGRpbWVuc2lvbnM6IFBhcnRpYWw8RGltZW5zaW9ucz4pOiBEaW1lbnNpb25zIHtcbiAgICBpZiAodHlwZW9mIGRpbWVuc2lvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBleHBlY3RlZCBhcmd1bWVudCB0byBiZSBvYmplY3RgKTtcbiAgICB9XG5cbiAgICBpZiAoIShkaW1lbnNpb25zIGluc3RhbmNlb2YgRGltZW5zaW9ucykpIHtcbiAgICAgIGRpbWVuc2lvbnMgPSBuZXcgRGltZW5zaW9ucyhkaW1lbnNpb25zKTtcbiAgICB9XG5cbiAgICAvLyBDYXRjaCBpbnN0YW5jZXMgd2hlcmUgd2UgdHJ5IHRvIGluaXRpYWxpemUgRGltZW5zaW9ucyBmcm9tIHBhcnRpYWwgZGF0YSB1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnNcbiAgICAvLyB1c2luZyBvbmx5IFwibk91dHB1dHNcIi5cbiAgICBpZiAoJ25PdXRwdXRzJyBpbiBkaW1lbnNpb25zKSB7XG4gICAgICBpZiAoISgnb3V0cHV0cycgaW4gZGltZW5zaW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXByZWNhdGVkIHBhcnRpYWwgYWRkaXRpb246IGFyZ3VtZW50IGhhcyBrZXkgXCJuT3V0cHV0c1wiIGJ1dCBubyBcIm91dHB1dHNcIicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IG91dHB1dHMsIG5PdXRwdXRzIH0gPSBkaW1lbnNpb25zIGFzIERpbWVuc2lvbnM7XG5cbiAgICAgIGlmIChvdXRwdXRzLmNvdW50ICE9PSBuT3V0cHV0cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlcHJlY2F0ZWQgcGFydGlhbCBhZGRpdGlvbjogaW5jb25zaXN0ZW50IHZhbHVlcyBmb3IgXCJuT3V0cHV0c1wiIGFuZCBcIm91dHB1dHMuY291bnRcIicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXBEaW1lbnNpb25zKHRoaXMsIChrZXksIHYpID0+IHtcbiAgICAgIGNvbnN0IHcgPSBkaW1lbnNpb25zW2tleV0gPz8gRGltZW5zaW9ucy5aRVJPW2tleV07XG4gICAgICBpZiAoa2V5ID09PSAnb3V0cHV0cycpIHtcbiAgICAgICAgY29uc3Qgdk91dHB1dHMgPSB2IGFzIE91dHB1dERpbWVuc2lvbnM7XG4gICAgICAgIGNvbnN0IHdPdXRwdXRzID0gdyBhcyBPdXRwdXREaW1lbnNpb25zO1xuICAgICAgICByZXR1cm4gbmV3IE91dHB1dERpbWVuc2lvbnMoe1xuICAgICAgICAgIGNvdW50OiB2T3V0cHV0cy5jb3VudCArIHdPdXRwdXRzLmNvdW50LFxuICAgICAgICAgIHNpemU6IHZPdXRwdXRzLnNpemUgKyB3T3V0cHV0cy5zaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAodiBhcyBudW1iZXIpICsgKHcgYXMgbnVtYmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNdWx0aXBseSBkaW1lbnNpb25zIGJ5IGEgZ2l2ZW4gZmFjdG9yXG4gICAqIEBwYXJhbSBmYWN0b3IgLSBQb3NpdGl2ZSBpbnRlZ2VyXG4gICAqIEByZXR1cm4ge0RpbWVuc2lvbnN9XG4gICAqL1xuICB0aW1lcyhmYWN0b3I6IG51bWJlcik6IERpbWVuc2lvbnMge1xuICAgIGlmICghUG9zaXRpdmVJbnRlZ2VyLmlzKGZhY3RvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGV4cGVjdGVkIGZhY3RvciB0byBiZSBwb3NpdGl2ZSBpbnRlZ2VyYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcERpbWVuc2lvbnModGhpcywgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGlmIChrZXkgPT09ICdvdXRwdXRzJykge1xuICAgICAgICBjb25zdCB2T3V0cHV0cyA9IHZhbHVlIGFzIE91dHB1dERpbWVuc2lvbnM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY291bnQ6IHZPdXRwdXRzLmNvdW50ICogZmFjdG9yLFxuICAgICAgICAgIHNpemU6IHZPdXRwdXRzLnNpemUgKiBmYWN0b3IsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIG51bWJlcikgKiBmYWN0b3I7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBOdW1iZXIgb2YgdG90YWwgaW5wdXRzIChwMnNoLCBwMnNoUDJ3c2ggYW5kIHAyd3NoKVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYGRpbWVuc2lvbi5uSW5wdXRzYCBpbnN0ZWFkXG4gICAqL1xuICBnZXROSW5wdXRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubklucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZmYgZGltZW5zaW9ucyBoYXZlIG9uZSBvciBtb3JlIChwMnNoKXAyd3NoIGlucHV0c1xuICAgKi9cbiAgaXNTZWd3aXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMublAyd3NoSW5wdXRzICtcbiAgICAgICAgdGhpcy5uUDJzaFAyd3NoSW5wdXRzICtcbiAgICAgICAgdGhpcy5uUDJ0cktleXBhdGhJbnB1dHMgK1xuICAgICAgICB0aGlzLm5QMnRyU2NyaXB0UGF0aExldmVsMUlucHV0cyArXG4gICAgICAgIHRoaXMublAydHJTY3JpcHRQYXRoTGV2ZWwySW5wdXRzID5cbiAgICAgIDBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge051bWJlcn0gb3ZlcmhlYWQgdnNpemUsIGJhc2VkIG9uIHJlc3VsdCBpc1NlZ3dpdCgpLlxuICAgKi9cbiAgZ2V0T3ZlcmhlYWRWU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlzU2Vnd2l0KCkgPyBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplIDogVmlydHVhbFNpemVzLnR4T3ZlcmhlYWRTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHZzaXplIG9mIGlucHV0cywgd2l0aG91dCB0cmFuc2FjdGlvbiBvdmVyaGVhZFxuICAgKi9cbiAgZ2V0SW5wdXRzVlNpemUoKTogbnVtYmVyIHtcbiAgICBjb25zdCB7XG4gICAgICB0eFAyc2hJbnB1dFNpemUsXG4gICAgICB0eFAyc2hQMndzaElucHV0U2l6ZSxcbiAgICAgIHR4UDJ3c2hJbnB1dFNpemUsXG4gICAgICB0eFAydHJLZXlwYXRoSW5wdXRTaXplLFxuICAgICAgdHhQMnRyU2NyaXB0UGF0aExldmVsMUlucHV0U2l6ZSxcbiAgICAgIHR4UDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dFNpemUsXG4gICAgICB0eFAyc2hQMnBrSW5wdXRTaXplLFxuICAgIH0gPSBWaXJ0dWFsU2l6ZXM7XG5cbiAgICBjb25zdCB7XG4gICAgICBuUDJzaElucHV0cyxcbiAgICAgIG5QMnNoUDJ3c2hJbnB1dHMsXG4gICAgICBuUDJ3c2hJbnB1dHMsXG4gICAgICBuUDJ0cktleXBhdGhJbnB1dHMsXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHMsXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dHMsXG4gICAgICBuUDJzaFAycGtJbnB1dHMsXG4gICAgfSA9IHRoaXM7XG5cbiAgICBjb25zdCBzaXplID1cbiAgICAgIG5QMnNoSW5wdXRzICogdHhQMnNoSW5wdXRTaXplICtcbiAgICAgIG5QMnNoUDJ3c2hJbnB1dHMgKiB0eFAyc2hQMndzaElucHV0U2l6ZSArXG4gICAgICBuUDJ3c2hJbnB1dHMgKiB0eFAyd3NoSW5wdXRTaXplICtcbiAgICAgIG5QMnRyS2V5cGF0aElucHV0cyAqIHR4UDJ0cktleXBhdGhJbnB1dFNpemUgK1xuICAgICAgblAyc2hQMnBrSW5wdXRzICogdHhQMnNoUDJwa0lucHV0U2l6ZSArXG4gICAgICBuUDJ0clNjcmlwdFBhdGhMZXZlbDFJbnB1dHMgKiB0eFAydHJTY3JpcHRQYXRoTGV2ZWwxSW5wdXRTaXplICtcbiAgICAgIG5QMnRyU2NyaXB0UGF0aExldmVsMklucHV0cyAqIHR4UDJ0clNjcmlwdFBhdGhMZXZlbDJJbnB1dFNpemU7XG4gICAgaWYgKE51bWJlci5pc05hTihzaXplKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNpemVgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSByZXR1cm4gdnNpemUgb2Ygb3V0cHV0cywgd2l0aG91dCBvdmVyaGVhZFxuICAgKi9cbiAgZ2V0T3V0cHV0c1ZTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMub3V0cHV0cy5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyB0aGUgdmlydHVhbCBzaXplICgxLzQgd2VpZ2h0KSBvZiBhIHNpZ25lZCB0cmFuc2FjdGlvbiBhcyBzdW0gb2ZcbiAgICogb3ZlcmhlYWQgdnNpemUsIGlucHV0IHZzaXplIGFuZCBvdXRwdXQgdnNpemUuXG4gICAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBlc3RpbWF0ZWQgdnNpemUgb2YgdGhlIHRyYW5zYWN0aW9uIGRpbWVuc2lvbnMuXG4gICAqL1xuICBnZXRWU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldE92ZXJoZWFkVlNpemUoKSArIHRoaXMuZ2V0SW5wdXRzVlNpemUoKSArIHRoaXMuZ2V0T3V0cHV0c1ZTaXplKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,UAAU,MAAM,SAAS,CAAC;AAC7C,OAAO;AACL,sCAAsC;AACtC,KAAK;AACL,sCAAsC;AACtC,UAAU,GACX,CAAC;AAEF,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.CodesTypes = exports.Codes = void 0;
|
|
40
|
+
const codes_1 = __importStar(require("./codes")), CodesTypes = codes_1;
|
|
41
|
+
exports.Codes = codes_1.default;
|
|
42
|
+
exports.CodesTypes = CodesTypes;
|
|
43
|
+
__exportStar(require("./dimensions"), exports);
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQTZDO0FBRzNDLGdCQUhLLGVBQUssQ0FHTDtBQUVMLGdDQUFVO0FBR1osK0NBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvZGVzLCAqIGFzIENvZGVzVHlwZXMgZnJvbSAnLi9jb2Rlcyc7XG5leHBvcnQge1xuICAvKiogQGRlcHJlY2F0ZWQgLSB1c2UgdXR4b2xpYi5iaXRnbyAqL1xuICBDb2RlcyxcbiAgLyoqIEBkZXByZWNhdGVkIC0gdXNlIHV0eG9saWIuYml0Z28gKi9cbiAgQ29kZXNUeXBlcyxcbn07XG5cbmV4cG9ydCAqIGZyb20gJy4vZGltZW5zaW9ucyc7XG4iXX0=
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
* Defines input sizes for BitGo signature scripts.
|
|
3
3
|
*/
|
|
4
4
|
export declare function varSliceSize(someScript: Sized): number;
|
|
5
|
-
export
|
|
5
|
+
export type Sized = {
|
|
6
6
|
length: number;
|
|
7
7
|
};
|
|
8
|
-
export
|
|
8
|
+
export type Input = {
|
|
9
9
|
script: Sized;
|
|
10
10
|
witness: Sized[];
|
|
11
11
|
};
|
|
12
12
|
export declare function getInputByteLength(input: Input, allowWitness: boolean): number;
|
|
13
13
|
export declare function getInputWeight(input: Input): number;
|
|
14
|
-
export
|
|
14
|
+
export type InputComponents = {
|
|
15
15
|
script: number[];
|
|
16
16
|
witness: number[];
|
|
17
17
|
};
|
|
@@ -23,3 +23,4 @@ export declare const inputComponentsP2trKeySpend: InputComponents;
|
|
|
23
23
|
export declare const inputComponentsP2trScriptSpendLevel1: InputComponents;
|
|
24
24
|
export declare const inputComponentsP2trScriptSpendLevel2: InputComponents;
|
|
25
25
|
export declare const inputComponentsP2shP2pk: InputComponents;
|
|
26
|
+
//# sourceMappingURL=inputWeights.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputWeights.d.ts","sourceRoot":"","sources":["../../src/inputWeights.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wBAAgB,YAAY,CAAC,UAAU,EAAE,KAAK,GAAG,MAAM,CAItD;AAaD,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,KAAK,CAAC;IACd,OAAO,EAAE,KAAK,EAAE,CAAC;CAClB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM,CAM9E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnD;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAMnE;AAgCD,eAAO,MAAM,mBAAmB,EAAE,eAGjC,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAGlC,CAAC;AAGF,eAAO,MAAM,2BAA2B,EAAE,eAGzC,CAAC;AAEF,eAAO,MAAM,oCAAoC,EAAE,eAGlD,CAAC;AAEF,eAAO,MAAM,oCAAoC,EAAE,eAGlD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAGrC,CAAC"}
|