@bitgo-beta/sdk-coin-iota 1.0.1-beta.324 → 1.0.1-beta.326
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/dist/src/iota.d.ts +123 -27
- package/dist/src/iota.d.ts.map +1 -1
- package/dist/src/iota.js +217 -103
- package/dist/src/lib/constants.d.ts +50 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +68 -4
- package/dist/src/lib/iface.d.ts +141 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/keyPair.d.ts +100 -6
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +103 -10
- package/dist/src/lib/transaction.d.ts +117 -14
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +190 -67
- package/dist/src/lib/transactionBuilder.d.ts +73 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +90 -45
- package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +103 -16
- package/dist/src/lib/transferBuilder.d.ts +43 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +50 -5
- package/dist/src/lib/transferTransaction.d.ts +93 -2
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +180 -51
- package/dist/src/lib/utils.d.ts +107 -8
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +134 -23
- package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
- package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
- package/dist/test/unit/helpers/testHelpers.js +176 -0
- package/dist/test/unit/iota.js +47 -152
- package/dist/test/unit/keyPair.js +34 -61
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -108
- package/dist/test/unit/transactionBuilder/transferBuilder.js +296 -762
- package/dist/test/unit/transferTransaction.js +106 -353
- package/dist/test/unit/utils.js +171 -197
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -68,12 +68,33 @@ class TransferTransaction extends transaction_1.Transaction {
|
|
|
68
68
|
this.paymentObjects = txData.paymentObjects;
|
|
69
69
|
this.updateIsSimulateTx();
|
|
70
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Parses a transfer transaction from its broadcast format (base64 or raw bytes).
|
|
73
|
+
* Extracts recipients, amounts, and payment objects from the transaction data.
|
|
74
|
+
*/
|
|
71
75
|
parseFromBroadcastTx(tx) {
|
|
72
76
|
const txData = transactions_1.Transaction.from(tx).getData();
|
|
73
|
-
|
|
77
|
+
this.validateTransferCommands(txData);
|
|
78
|
+
super.parseFromBroadcastTx(tx);
|
|
79
|
+
const { inputObjects, amounts, receivers } = this.parseTransactionInputs(txData);
|
|
80
|
+
this.validateAmountsMatchReceivers(amounts, receivers);
|
|
81
|
+
this.assignParsedObjects(inputObjects);
|
|
82
|
+
this.assignRecipients(receivers, amounts);
|
|
83
|
+
this.updateIsSimulateTx();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Validates that the transaction only contains supported transfer commands.
|
|
87
|
+
*/
|
|
88
|
+
validateTransferCommands(txData) {
|
|
89
|
+
const hasUnsupportedCommands = txData.commands.some((command) => !constants_1.TRANSFER_TRANSACTION_COMMANDS.includes(command.$kind));
|
|
90
|
+
if (hasUnsupportedCommands) {
|
|
74
91
|
throw new sdk_core_1.InvalidTransactionError('Unsupported commands in the transaction');
|
|
75
92
|
}
|
|
76
|
-
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Parses transaction inputs to extract objects, amounts, and receiver addresses.
|
|
96
|
+
*/
|
|
97
|
+
parseTransactionInputs(txData) {
|
|
77
98
|
const inputObjects = [];
|
|
78
99
|
const amounts = [];
|
|
79
100
|
const receivers = [];
|
|
@@ -92,59 +113,120 @@ class TransferTransaction extends transaction_1.Transaction {
|
|
|
92
113
|
}
|
|
93
114
|
}
|
|
94
115
|
});
|
|
116
|
+
return { inputObjects, amounts, receivers };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Validates that the number of amounts matches the number of receivers.
|
|
120
|
+
*/
|
|
121
|
+
validateAmountsMatchReceivers(amounts, receivers) {
|
|
95
122
|
if (amounts.length !== receivers.length) {
|
|
96
|
-
throw new sdk_core_1.InvalidTransactionError('
|
|
123
|
+
throw new sdk_core_1.InvalidTransactionError('Count of amounts does not match count of receivers');
|
|
97
124
|
}
|
|
98
|
-
|
|
99
|
-
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Assigns parsed input objects to either gas payment objects or payment objects.
|
|
128
|
+
* If no gas objects exist and sender pays own gas, objects become gas objects.
|
|
129
|
+
* Otherwise, they become payment objects.
|
|
130
|
+
*/
|
|
131
|
+
assignParsedObjects(inputObjects) {
|
|
132
|
+
if (inputObjects.length === 0) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const noGasObjectsExist = !this.gasPaymentObjects || this.gasPaymentObjects.length === 0;
|
|
136
|
+
const senderPaysOwnGas = !this.gasSponsor || this.sender === this.gasSponsor;
|
|
137
|
+
if (noGasObjectsExist && senderPaysOwnGas) {
|
|
100
138
|
this.gasPaymentObjects = inputObjects;
|
|
101
139
|
}
|
|
102
|
-
else
|
|
140
|
+
else {
|
|
103
141
|
this._paymentObjects = inputObjects;
|
|
104
142
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Creates and assigns recipients from parsed addresses and amounts.
|
|
146
|
+
*/
|
|
147
|
+
assignRecipients(receivers, amounts) {
|
|
148
|
+
this._recipients = receivers.map((address, index) => ({
|
|
149
|
+
address,
|
|
150
|
+
amount: amounts[index],
|
|
151
|
+
}));
|
|
113
152
|
}
|
|
114
153
|
messageWithIntent(message) {
|
|
115
154
|
return (0, cryptography_1.messageWithIntent)('TransactionData', message);
|
|
116
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Populates the IOTA transaction with inputs and commands for the transfer.
|
|
158
|
+
* This determines which objects to use for payment (either payment objects or gas objects),
|
|
159
|
+
* consolidates them into a single coin, and then splits/transfers to recipients.
|
|
160
|
+
*/
|
|
117
161
|
populateTxInputsAndCommands() {
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
: this.consolidatePaymentObjects();
|
|
121
|
-
this.splitAndTransferToRecipients(consolidatedCoin);
|
|
162
|
+
const sourceCoin = this.getConsolidatedSourceCoin();
|
|
163
|
+
this.splitAndTransferToRecipients(sourceCoin);
|
|
122
164
|
}
|
|
123
|
-
|
|
124
|
-
|
|
165
|
+
/**
|
|
166
|
+
* Determines which objects to use as the payment source and consolidates them.
|
|
167
|
+
* If payment objects are provided, use those. Otherwise, if the sender is paying
|
|
168
|
+
* their own gas, use the gas objects for payment.
|
|
169
|
+
*/
|
|
170
|
+
getConsolidatedSourceCoin() {
|
|
171
|
+
if (this.hasPaymentObjects()) {
|
|
172
|
+
return this.consolidatePaymentObjects();
|
|
173
|
+
}
|
|
174
|
+
return this.consolidateGasObjects();
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Checks if payment objects exist and if gas objects should be used instead.
|
|
178
|
+
* Gas objects are used when: no payment objects exist AND sender pays their own gas.
|
|
179
|
+
*/
|
|
180
|
+
hasPaymentObjects() {
|
|
181
|
+
const hasPaymentObjects = this.paymentObjects && this.paymentObjects.length > 0;
|
|
182
|
+
if (hasPaymentObjects) {
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
// If no payment objects, only use gas objects if sender pays own gas
|
|
125
186
|
const senderPaysOwnGas = !this.gasSponsor || this.gasSponsor === this.sender;
|
|
126
|
-
return !
|
|
187
|
+
return !senderPaysOwnGas;
|
|
127
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Consolidates payment objects into a single coin object.
|
|
191
|
+
* If multiple payment objects exist, they are merged in batches.
|
|
192
|
+
*/
|
|
128
193
|
consolidatePaymentObjects() {
|
|
129
194
|
if (!this.paymentObjects || this.paymentObjects.length === 0) {
|
|
130
195
|
throw new sdk_core_1.InvalidTransactionError('Payment objects are required');
|
|
131
196
|
}
|
|
132
197
|
const firstObject = this._iotaTransaction.object(transactions_1.Inputs.ObjectRef(this.paymentObjects[0]));
|
|
198
|
+
// Single object doesn't need consolidation
|
|
133
199
|
if (this.paymentObjects.length === 1) {
|
|
134
200
|
return firstObject;
|
|
135
201
|
}
|
|
202
|
+
// Merge remaining objects into the first one
|
|
136
203
|
return this.mergeObjectsInBatches(firstObject, this.paymentObjects.slice(1), constants_1.MAX_INPUT_OBJECTS);
|
|
137
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* Consolidates gas payment objects into a single coin object.
|
|
207
|
+
* If the number of gas objects exceeds the maximum, they are merged in batches.
|
|
208
|
+
*/
|
|
138
209
|
consolidateGasObjects() {
|
|
139
210
|
if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
|
|
140
211
|
throw new sdk_core_1.InvalidTransactionError('Gas payment objects are required');
|
|
141
212
|
}
|
|
142
213
|
const gasObject = this._iotaTransaction.gas;
|
|
214
|
+
// If within the limit, no consolidation needed
|
|
143
215
|
if (this.gasPaymentObjects.length <= constants_1.MAX_GAS_PAYMENT_OBJECTS) {
|
|
144
216
|
return gasObject;
|
|
145
217
|
}
|
|
218
|
+
// Merge excess gas objects to stay within limits
|
|
146
219
|
return this.mergeObjectsInBatches(gasObject, this.gasPaymentObjects, constants_1.MAX_INPUT_OBJECTS);
|
|
147
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Merges multiple coin objects into a target coin in batches.
|
|
223
|
+
* This is necessary because IOTA has limits on the number of objects per merge command.
|
|
224
|
+
*
|
|
225
|
+
* @param targetCoin - The coin to merge into
|
|
226
|
+
* @param objectsToMerge - Array of objects to merge
|
|
227
|
+
* @param batchSize - Maximum number of objects to merge per batch
|
|
228
|
+
* @returns The consolidated coin object
|
|
229
|
+
*/
|
|
148
230
|
mergeObjectsInBatches(targetCoin, objectsToMerge, batchSize) {
|
|
149
231
|
let consolidatedCoin = targetCoin;
|
|
150
232
|
for (let startIndex = 0; startIndex < objectsToMerge.length; startIndex += batchSize) {
|
|
@@ -154,6 +236,11 @@ class TransferTransaction extends transaction_1.Transaction {
|
|
|
154
236
|
}
|
|
155
237
|
return consolidatedCoin;
|
|
156
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Splits the source coin into the amounts needed for each recipient and transfers them.
|
|
241
|
+
* This creates split coin commands for all recipient amounts, then transfer commands
|
|
242
|
+
* to send each split coin to the corresponding recipient.
|
|
243
|
+
*/
|
|
157
244
|
splitAndTransferToRecipients(sourceCoin) {
|
|
158
245
|
const recipientAmounts = this._recipients.map((recipient) => recipient.amount);
|
|
159
246
|
const splitCoins = this._iotaTransaction.splitCoins(sourceCoin, recipientAmounts);
|
|
@@ -161,55 +248,97 @@ class TransferTransaction extends transaction_1.Transaction {
|
|
|
161
248
|
this._iotaTransaction.transferObjects([splitCoins[index]], recipient.address);
|
|
162
249
|
});
|
|
163
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Validates all transfer transaction data before building.
|
|
253
|
+
* Checks recipients, payment objects, and ensures no duplicate object IDs.
|
|
254
|
+
*/
|
|
164
255
|
validateTxDataImplementation() {
|
|
165
|
-
|
|
256
|
+
this.validateRecipientsList();
|
|
257
|
+
this.validatePaymentObjectsExist();
|
|
258
|
+
this.validateNoDuplicateObjects();
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Validates that recipients exist and don't exceed the maximum allowed.
|
|
262
|
+
*/
|
|
263
|
+
validateRecipientsList() {
|
|
264
|
+
if (!this.recipients || this.recipients.length === 0) {
|
|
166
265
|
throw new sdk_core_1.InvalidTransactionError('Transaction recipients are required');
|
|
167
266
|
}
|
|
168
267
|
if (this.recipients.length > constants_1.MAX_RECIPIENTS) {
|
|
169
268
|
throw new sdk_core_1.InvalidTransactionError(`Recipients count (${this.recipients.length}) exceeds maximum allowed (${constants_1.MAX_RECIPIENTS})`);
|
|
170
269
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Validates that either payment objects or gas objects exist for funding the transfer.
|
|
273
|
+
* When a gas sponsor is used, payment objects are required.
|
|
274
|
+
* Otherwise, either payment objects or gas objects can be used.
|
|
275
|
+
*/
|
|
276
|
+
validatePaymentObjectsExist() {
|
|
277
|
+
const hasPaymentObjects = this.paymentObjects && this.paymentObjects.length > 0;
|
|
278
|
+
if (hasPaymentObjects) {
|
|
279
|
+
return; // Payment objects exist, validation passes
|
|
180
280
|
}
|
|
181
|
-
//
|
|
281
|
+
// No payment objects - check if gas objects can be used instead
|
|
282
|
+
const hasGasSponsor = this.gasSponsor && this.gasSponsor !== this.sender;
|
|
283
|
+
if (hasGasSponsor) {
|
|
284
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects are required when using a gas sponsor');
|
|
285
|
+
}
|
|
286
|
+
// No gas sponsor - gas objects must exist
|
|
287
|
+
const hasGasObjects = this.gasPaymentObjects && this.gasPaymentObjects.length > 0;
|
|
288
|
+
if (!hasGasObjects) {
|
|
289
|
+
throw new sdk_core_1.InvalidTransactionError('Payment or Gas objects are required');
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Validates that there are no duplicate object IDs within payment objects,
|
|
294
|
+
* gas payment objects, or between the two groups.
|
|
295
|
+
*/
|
|
296
|
+
validateNoDuplicateObjects() {
|
|
182
297
|
const paymentObjectIds = this.paymentObjects?.map((obj) => obj.objectId) ?? [];
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
298
|
+
// Check for duplicates within payment objects
|
|
299
|
+
this.checkForDuplicateIds(paymentObjectIds, 'payment objects');
|
|
300
|
+
if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const gasObjectIds = this.gasPaymentObjects.map((gas) => gas.objectId);
|
|
304
|
+
// Check for duplicates within gas payment objects
|
|
305
|
+
this.checkForDuplicateIds(gasObjectIds, 'gas payment objects');
|
|
306
|
+
// Check for overlaps between payment and gas objects
|
|
307
|
+
const overlappingIds = paymentObjectIds.filter((id) => gasObjectIds.includes(id));
|
|
308
|
+
if (overlappingIds.length > 0) {
|
|
309
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects cannot be the same as gas payment objects: ' + overlappingIds.join(', '));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Helper to check for duplicate IDs in an array.
|
|
314
|
+
*/
|
|
315
|
+
checkForDuplicateIds(ids, objectType) {
|
|
316
|
+
const uniqueIds = new Set(ids);
|
|
317
|
+
if (uniqueIds.size !== ids.length) {
|
|
318
|
+
throw new sdk_core_1.InvalidTransactionError(`Duplicate object IDs found in ${objectType}`);
|
|
198
319
|
}
|
|
199
320
|
}
|
|
200
321
|
/**
|
|
201
322
|
* @inheritDoc
|
|
323
|
+
* Provides a human-readable explanation of the transfer transaction.
|
|
202
324
|
*/
|
|
203
|
-
explainTransactionImplementation(
|
|
325
|
+
explainTransactionImplementation(_json, explanationResult) {
|
|
204
326
|
const outputs = this.recipients.map((recipient) => recipient);
|
|
205
|
-
const
|
|
206
|
-
const outputAmount = outputAmountBN.toString();
|
|
327
|
+
const outputAmount = this.calculateTotalOutputAmount();
|
|
207
328
|
return {
|
|
208
329
|
...explanationResult,
|
|
209
330
|
outputAmount,
|
|
210
331
|
outputs,
|
|
211
332
|
};
|
|
212
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* Calculates the total amount being transferred to all recipients.
|
|
336
|
+
*/
|
|
337
|
+
calculateTotalOutputAmount() {
|
|
338
|
+
return this.recipients
|
|
339
|
+
.reduce((accumulator, current) => accumulator.plus(current.amount), new bignumber_js_1.default(0))
|
|
340
|
+
.toString();
|
|
341
|
+
}
|
|
213
342
|
}
|
|
214
343
|
exports.TransferTransaction = TransferTransaction;
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBNkc7QUFFN0csK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBd0g7QUFDeEgsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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LE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4RixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FDL0IsNkRBQTZELEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDdEYsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ08sZ0NBQWdDLENBQ3hDLElBQVksRUFDWixpQkFBeUM7UUFFekMsTUFBTSxPQUFPLEdBQTJCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDM0MsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDMUQsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUNqQixDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRS9DLE9BQU87WUFDTCxHQUFHLGlCQUFpQjtZQUNwQixZQUFZO1lBQ1osT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2UEQsa0RBdVBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIHRvSGV4LCBUcmFuc2FjdGlvblJlY2lwaWVudCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQsIFRyYW5zZmVyVHhEYXRhLCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7XG4gIElucHV0cyBhcyBJb3RhSW5wdXRzLFxuICBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50LFxuICBUcmFuc2FjdGlvbiBhcyBJb3RhVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBmcm9tQmFzZTY0IH0gZnJvbSAnQGlvdGEvaW90YS1zZGsvdXRpbHMnO1xuaW1wb3J0IHsgbWVzc2FnZVdpdGhJbnRlbnQgYXMgaW90YU1lc3NhZ2VXaXRoSW50ZW50IH0gZnJvbSAnQGlvdGEvaW90YS1zZGsvY3J5cHRvZ3JhcGh5JztcbmltcG9ydCB7IEJjc1JlYWRlciB9IGZyb20gJ0Bpb3RhL2Jjcyc7XG5pbXBvcnQgeyBNQVhfR0FTX1BBWU1FTlRfT0JKRUNUUywgTUFYX0lOUFVUX09CSkVDVFMsIE1BWF9SRUNJUElFTlRTLCBUUkFOU0ZFUl9UUkFOU0FDVElPTl9DT01NQU5EUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zZmVyVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX3JlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gIHByaXZhdGUgX3BheW1lbnRPYmplY3RzPzogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIHRoaXMuX2lucHV0cyA9IFtdO1xuICAgIHRoaXMuX291dHB1dHMgPSBbXTtcbiAgfVxuXG4gIGdldCByZWNpcGllbnRzKCk6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9yZWNpcGllbnRzO1xuICB9XG5cbiAgc2V0IHJlY2lwaWVudHModmFsdWU6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pIHtcbiAgICB0aGlzLl9yZWNpcGllbnRzID0gdmFsdWU7XG4gICAgdGhpcy5fcmVidWlsZFJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBwYXltZW50T2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXltZW50T2JqZWN0cztcbiAgfVxuXG4gIHNldCBwYXltZW50T2JqZWN0cyh2YWx1ZTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSB2YWx1ZTtcbiAgICB0aGlzLl9yZWJ1aWxkUmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhZGRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW90YVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsQW1vdW50ID0gdGhpcy5yZWNpcGllbnRzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGFjY3VtdWxhdG9yICsgTnVtYmVyKGN1cnJlbnQuYW1vdW50KSwgMCk7XG4gICAgdGhpcy5fb3V0cHV0cyA9IHRoaXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCwgaW5kZXgpID0+ICh7XG4gICAgICBhZGRyZXNzOiByZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiByZWNpcGllbnQuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSkpO1xuICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGhpcy5zZW5kZXIsXG4gICAgICAgIHZhbHVlOiB0b3RhbEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICB0b0pzb24oKTogVHJhbnNmZXJUeERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci50b0pzb24oKSxcbiAgICAgIHJlY2lwaWVudHM6IHRoaXMucmVjaXBpZW50cyxcbiAgICAgIHBheW1lbnRPYmplY3RzOiB0aGlzLnBheW1lbnRPYmplY3RzLFxuICAgIH07XG4gIH1cblxuICBwYXJzZUZyb21KU09OKHR4RGF0YTogVHJhbnNmZXJUeERhdGEpOiB2b2lkIHtcbiAgICBzdXBlci5wYXJzZUZyb21KU09OKHR4RGF0YSk7XG4gICAgdGhpcy5yZWNpcGllbnRzID0gdHhEYXRhLnJlY2lwaWVudHM7XG4gICAgdGhpcy5wYXltZW50T2JqZWN0cyA9IHR4RGF0YS5wYXltZW50T2JqZWN0cztcbiAgICB0aGlzLnVwZGF0ZUlzU2ltdWxhdGVUeCgpO1xuICB9XG5cbiAgcGFyc2VGcm9tQnJvYWRjYXN0VHgodHg6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSBJb3RhVHJhbnNhY3Rpb24uZnJvbSh0eCkuZ2V0RGF0YSgpO1xuICAgIGlmICh0eERhdGEuY29tbWFuZHMuZmlsdGVyKChjb21tYW5kKSA9PiAhVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZC4ka2luZCkpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVW5zdXBwb3J0ZWQgY29tbWFuZHMgaW4gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHN1cGVyLnBhcnNlRnJvbUJyb2FkY2FzdFR4KHR4KTtcbiAgICBjb25zdCBpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGFtb3VudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVjZWl2ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4RGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ09iamVjdCcgJiYgJ0ltbU9yT3duZWRPYmplY3QnIGluIGlucHV0Lk9iamVjdCkge1xuICAgICAgICBpbnB1dE9iamVjdHMucHVzaChpbnB1dC5PYmplY3QuSW1tT3JPd25lZE9iamVjdCBhcyBUcmFuc2FjdGlvbk9iamVjdElucHV0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ1B1cmUnICYmICdieXRlcycgaW4gaW5wdXQuUHVyZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZyb21CYXNlNjQoaW5wdXQuUHVyZS5ieXRlcyk7XG4gICAgICAgIGNvbnN0IGhleFZhbHVlID0gJzB4JyArIHRvSGV4KHZhbHVlKTtcbiAgICAgICAgaWYgKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGhleFZhbHVlKSkge1xuICAgICAgICAgIHJlY2VpdmVycy5wdXNoKGhleFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbW91bnRzLnB1c2gobmV3IEJjc1JlYWRlcih2YWx1ZSkucmVhZDY0KCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYW1vdW50cy5sZW5ndGggIT09IHJlY2VpdmVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignY291bnQgb2YgYW1vdW50cyBkb2VzIG5vdCBtYXRjaCBjb3VudCBvZiByZWNlaXZlcnMnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLmdhc1BheW1lbnRPYmplY3RzIHx8IHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID09PSAwKSAmJlxuICAgICAgKCF0aGlzLmdhc1Nwb25zb3IgfHwgdGhpcy5zZW5kZXIgPT09IHRoaXMuZ2FzU3BvbnNvcilcbiAgICApIHtcbiAgICAgIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfSBlbHNlIGlmIChpbnB1dE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfVxuICAgIHRoaXMucmVjaXBpZW50cyA9IFtdO1xuICAgIHJlY2VpdmVycy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9yZWNpcGllbnRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQsXG4gICAgICAgIGFtb3VudDogYW1vdW50c1tpbmRleF0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUlzU2ltdWxhdGVUeCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VXaXRoSW50ZW50KG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gaW90YU1lc3NhZ2VXaXRoSW50ZW50KCdUcmFuc2FjdGlvbkRhdGEnLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3B1bGF0ZVR4SW5wdXRzQW5kQ29tbWFuZHMoKTogdm9pZCB7XG4gICAgY29uc3QgY29uc29saWRhdGVkQ29pbiA9IHRoaXMuc2hvdWxkVXNlR2FzT2JqZWN0c0ZvclBheW1lbnQoKVxuICAgICAgPyB0aGlzLmNvbnNvbGlkYXRlR2FzT2JqZWN0cygpXG4gICAgICA6IHRoaXMuY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpO1xuICAgIHRoaXMuc3BsaXRBbmRUcmFuc2ZlclRvUmVjaXBpZW50cyhjb25zb2xpZGF0ZWRDb2luKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVXNlR2FzT2JqZWN0c0ZvclBheW1lbnQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF5bWVudE9iamVjdEV4aXN0cyA9IHRoaXMucGF5bWVudE9iamVjdHMgJiYgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHNlbmRlclBheXNPd25HYXMgPSAhdGhpcy5nYXNTcG9uc29yIHx8IHRoaXMuZ2FzU3BvbnNvciA9PT0gdGhpcy5zZW5kZXI7XG4gICAgcmV0dXJuICFwYXltZW50T2JqZWN0RXhpc3RzICYmIHNlbmRlclBheXNPd25HYXMgJiYgQm9vbGVhbih0aGlzLmdhc1BheW1lbnRPYmplY3RzKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAoIXRoaXMucGF5bWVudE9iamVjdHMgfHwgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2JqZWN0ID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZih0aGlzLnBheW1lbnRPYmplY3RzWzBdKSk7XG5cbiAgICBpZiAodGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdE9iamVjdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tZXJnZU9iamVjdHNJbkJhdGNoZXMoZmlyc3RPYmplY3QsIHRoaXMucGF5bWVudE9iamVjdHMuc2xpY2UoMSksIE1BWF9JTlBVVF9PQkpFQ1RTKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc29saWRhdGVHYXNPYmplY3RzKCk6IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQge1xuICAgIGlmICghdGhpcy5nYXNQYXltZW50T2JqZWN0cyB8fCB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdHYXMgcGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGdhc09iamVjdCA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5nYXM7XG5cbiAgICBpZiAodGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPD0gTUFYX0dBU19QQVlNRU5UX09CSkVDVFMpIHtcbiAgICAgIHJldHVybiBnYXNPYmplY3Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RzSW5CYXRjaGVzKGdhc09iamVjdCwgdGhpcy5nYXNQYXltZW50T2JqZWN0cywgTUFYX0lOUFVUX09CSkVDVFMpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZU9iamVjdHNJbkJhdGNoZXMoXG4gICAgdGFyZ2V0Q29pbjogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCxcbiAgICBvYmplY3RzVG9NZXJnZTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdLFxuICAgIGJhdGNoU2l6ZTogbnVtYmVyXG4gICk6IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQge1xuICAgIGxldCBjb25zb2xpZGF0ZWRDb2luID0gdGFyZ2V0Q29pbjtcblxuICAgIGZvciAobGV0IHN0YXJ0SW5kZXggPSAwOyBzdGFydEluZGV4IDwgb2JqZWN0c1RvTWVyZ2UubGVuZ3RoOyBzdGFydEluZGV4ICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBvYmplY3RzVG9NZXJnZS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgYmF0Y2hTaXplKTtcbiAgICAgIGNvbnN0IGJhdGNoQXNUcmFuc2FjdGlvbk9iamVjdHMgPSBiYXRjaC5tYXAoKG9iaikgPT4gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZihvYmopKSk7XG5cbiAgICAgIFtjb25zb2xpZGF0ZWRDb2luXSA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5tZXJnZUNvaW5zKGNvbnNvbGlkYXRlZENvaW4sIGJhdGNoQXNUcmFuc2FjdGlvbk9iamVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zb2xpZGF0ZWRDb2luO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdEFuZFRyYW5zZmVyVG9SZWNpcGllbnRzKHNvdXJjZUNvaW46IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWNpcGllbnRBbW91bnRzID0gdGhpcy5fcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50LmFtb3VudCk7XG4gICAgY29uc3Qgc3BsaXRDb2lucyA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5zcGxpdENvaW5zKHNvdXJjZUNvaW4sIHJlY2lwaWVudEFtb3VudHMpO1xuXG4gICAgdGhpcy5fcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9pb3RhVHJhbnNhY3Rpb24udHJhbnNmZXJPYmplY3RzKFtzcGxpdENvaW5zW2luZGV4XV0sIHJlY2lwaWVudC5hZGRyZXNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVR4RGF0YUltcGxlbWVudGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZWNpcGllbnRzIHx8IHRoaXMucmVjaXBpZW50cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHJlY2lwaWVudHMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVjaXBpZW50cy5sZW5ndGggPiBNQVhfUkVDSVBJRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgUmVjaXBpZW50cyBjb3VudCAoJHt0aGlzLnJlY2lwaWVudHMubGVuZ3RofSkgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgKCR7TUFYX1JFQ0lQSUVOVFN9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBheW1lbnRPYmplY3RzIHx8IHRoaXMucGF5bWVudE9iamVjdHM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKCF0aGlzLmdhc1Nwb25zb3IgfHwgdGhpcy5nYXNTcG9uc29yID09PSB0aGlzLnNlbmRlcikge1xuICAgICAgICBpZiAoIXRoaXMuZ2FzUGF5bWVudE9iamVjdHMgfHwgdGhpcy5nYXNQYXltZW50T2JqZWN0cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdQYXltZW50IG9yIEdhcyBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIG9iamVjdCBJRHMgaW4gcGF5bWVudCBvYmplY3RzXG4gICAgY29uc3QgcGF5bWVudE9iamVjdElkcyA9IHRoaXMucGF5bWVudE9iamVjdHM/Lm1hcCgob2JqKSA9PiBvYmoub2JqZWN0SWQpID8/IFtdO1xuICAgIGNvbnN0IHVuaXF1ZVBheW1lbnRJZHMgPSBuZXcgU2V0KHBheW1lbnRPYmplY3RJZHMpO1xuICAgIGlmICh1bmlxdWVQYXltZW50SWRzLnNpemUgIT09IHBheW1lbnRPYmplY3RJZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0R1cGxpY2F0ZSBvYmplY3QgSURzIGZvdW5kIGluIHBheW1lbnQgb2JqZWN0cycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdhc1BheW1lbnRPYmplY3RzICYmIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ2FzT2JqZWN0SWRzID0gdGhpcy5nYXNQYXltZW50T2JqZWN0cy5tYXAoKGdhcykgPT4gZ2FzLm9iamVjdElkKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBvYmplY3QgSURzIGluIGdhcyBwYXltZW50IG9iamVjdHNcbiAgICAgIGNvbnN0IHVuaXF1ZUdhc0lkcyA9IG5ldyBTZXQoZ2FzT2JqZWN0SWRzKTtcbiAgICAgIGlmICh1bmlxdWVHYXNJZHMuc2l6ZSAhPT0gZ2FzT2JqZWN0SWRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0R1cGxpY2F0ZSBvYmplY3QgSURzIGZvdW5kIGluIGdhcyBwYXltZW50IG9iamVjdHMnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHVwbGljYXRlcyA9IHBheW1lbnRPYmplY3RJZHMuZmlsdGVyKChwYXltZW50KSA9PiBnYXNPYmplY3RJZHMuaW5jbHVkZXMocGF5bWVudCkpO1xuICAgICAgaWYgKGR1cGxpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ1BheW1lbnQgb2JqZWN0cyBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgZ2FzIHBheW1lbnQgb2JqZWN0czogJyArIGR1cGxpY2F0ZXMuam9pbignLCAnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJvdGVjdGVkIGV4cGxhaW5UcmFuc2FjdGlvbkltcGxlbWVudGF0aW9uKFxuICAgIGpzb246IFR4RGF0YSxcbiAgICBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvblxuICApOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gdGhpcy5yZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiByZWNpcGllbnQpO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudEJOID0gdGhpcy5yZWNpcGllbnRzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IucGx1cyhjdXJyZW50LmFtb3VudCksXG4gICAgICBuZXcgQmlnTnVtYmVyKDApXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnRCTi50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgb3V0cHV0cyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
344
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBNkc7QUFFN0csK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBd0g7QUFDeEgsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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Q0ssMEJBQTBCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVU7YUFDbkIsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFFBQVEsRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQWpaRCxrREFpWkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgdG9IZXgsIFRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCwgVHJhbnNmZXJUeERhdGEsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHtcbiAgSW5wdXRzIGFzIElvdGFJbnB1dHMsXG4gIFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQsXG4gIFRyYW5zYWN0aW9uIGFzIElvdGFUcmFuc2FjdGlvbixcbn0gZnJvbSAnQGlvdGEvaW90YS1zZGsvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IGZyb21CYXNlNjQgfSBmcm9tICdAaW90YS9pb3RhLXNkay91dGlscyc7XG5pbXBvcnQgeyBtZXNzYWdlV2l0aEludGVudCBhcyBpb3RhTWVzc2FnZVdpdGhJbnRlbnQgfSBmcm9tICdAaW90YS9pb3RhLXNkay9jcnlwdG9ncmFwaHknO1xuaW1wb3J0IHsgQmNzUmVhZGVyIH0gZnJvbSAnQGlvdGEvYmNzJztcbmltcG9ydCB7IE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTLCBNQVhfSU5QVVRfT0JKRUNUUywgTUFYX1JFQ0lQSUVOVFMsIFRSQU5TRkVSX1RSQU5TQUNUSU9OX0NPTU1BTkRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSBfcmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgcHJpdmF0ZSBfcGF5bWVudE9iamVjdHM/OiBUcmFuc2FjdGlvbk9iamVjdElucHV0W107XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgdGhpcy5faW5wdXRzID0gW107XG4gICAgdGhpcy5fb3V0cHV0cyA9IFtdO1xuICB9XG5cbiAgZ2V0IHJlY2lwaWVudHMoKTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY2lwaWVudHM7XG4gIH1cblxuICBzZXQgcmVjaXBpZW50cyh2YWx1ZTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSkge1xuICAgIHRoaXMuX3JlY2lwaWVudHMgPSB2YWx1ZTtcbiAgICB0aGlzLl9yZWJ1aWxkUmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0IHBheW1lbnRPYmplY3RzKCk6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BheW1lbnRPYmplY3RzO1xuICB9XG5cbiAgc2V0IHBheW1lbnRPYmplY3RzKHZhbHVlOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYXltZW50T2JqZWN0cyA9IHZhbHVlO1xuICAgIHRoaXMuX3JlYnVpbGRSZXF1aXJlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFkZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pb3RhVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdG90YWxBbW91bnQgPSB0aGlzLnJlY2lwaWVudHMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IgKyBOdW1iZXIoY3VycmVudC5hbW91bnQpLCAwKTtcbiAgICB0aGlzLl9vdXRwdXRzID0gdGhpcy5yZWNpcGllbnRzLm1hcCgocmVjaXBpZW50LCBpbmRleCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHJlY2lwaWVudC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICB9KSk7XG4gICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0aGlzLnNlbmRlcixcbiAgICAgICAgdmFsdWU6IHRvdGFsQW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUcmFuc2ZlclR4RGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnRvSnNvbigpLFxuICAgICAgcmVjaXBpZW50czogdGhpcy5yZWNpcGllbnRzLFxuICAgICAgcGF5bWVudE9iamVjdHM6IHRoaXMucGF5bWVudE9iamVjdHMsXG4gICAgfTtcbiAgfVxuXG4gIHBhcnNlRnJvbUpTT04odHhEYXRhOiBUcmFuc2ZlclR4RGF0YSk6IHZvaWQge1xuICAgIHN1cGVyLnBhcnNlRnJvbUpTT04odHhEYXRhKTtcbiAgICB0aGlzLnJlY2lwaWVudHMgPSB0eERhdGEucmVjaXBpZW50cztcbiAgICB0aGlzLnBheW1lbnRPYmplY3RzID0gdHhEYXRhLnBheW1lbnRPYmplY3RzO1xuICAgIHRoaXMudXBkYXRlSXNTaW11bGF0ZVR4KCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBpdHMgYnJvYWRjYXN0IGZvcm1hdCAoYmFzZTY0IG9yIHJhdyBieXRlcykuXG4gICAqIEV4dHJhY3RzIHJlY2lwaWVudHMsIGFtb3VudHMsIGFuZCBwYXltZW50IG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gZGF0YS5cbiAgICovXG4gIHBhcnNlRnJvbUJyb2FkY2FzdFR4KHR4OiBzdHJpbmcgfCBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gSW90YVRyYW5zYWN0aW9uLmZyb20odHgpLmdldERhdGEoKTtcbiAgICB0aGlzLnZhbGlkYXRlVHJhbnNmZXJDb21tYW5kcyh0eERhdGEpO1xuXG4gICAgc3VwZXIucGFyc2VGcm9tQnJvYWRjYXN0VHgodHgpO1xuXG4gICAgY29uc3QgeyBpbnB1dE9iamVjdHMsIGFtb3VudHMsIHJlY2VpdmVycyB9ID0gdGhpcy5wYXJzZVRyYW5zYWN0aW9uSW5wdXRzKHR4RGF0YSk7XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudHNNYXRjaFJlY2VpdmVycyhhbW91bnRzLCByZWNlaXZlcnMpO1xuICAgIHRoaXMuYXNzaWduUGFyc2VkT2JqZWN0cyhpbnB1dE9iamVjdHMpO1xuICAgIHRoaXMuYXNzaWduUmVjaXBpZW50cyhyZWNlaXZlcnMsIGFtb3VudHMpO1xuICAgIHRoaXMudXBkYXRlSXNTaW11bGF0ZVR4KCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9ubHkgY29udGFpbnMgc3VwcG9ydGVkIHRyYW5zZmVyIGNvbW1hbmRzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zZmVyQ29tbWFuZHModHhEYXRhOiBSZXR1cm5UeXBlPElvdGFUcmFuc2FjdGlvblsnZ2V0RGF0YSddPik6IHZvaWQge1xuICAgIGNvbnN0IGhhc1Vuc3VwcG9ydGVkQ29tbWFuZHMgPSB0eERhdGEuY29tbWFuZHMuc29tZShcbiAgICAgIChjb21tYW5kKSA9PiAhVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZC4ka2luZClcbiAgICApO1xuXG4gICAgaWYgKGhhc1Vuc3VwcG9ydGVkQ29tbWFuZHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVW5zdXBwb3J0ZWQgY29tbWFuZHMgaW4gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0cmFuc2FjdGlvbiBpbnB1dHMgdG8gZXh0cmFjdCBvYmplY3RzLCBhbW91bnRzLCBhbmQgcmVjZWl2ZXIgYWRkcmVzc2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVRyYW5zYWN0aW9uSW5wdXRzKHR4RGF0YTogUmV0dXJuVHlwZTxJb3RhVHJhbnNhY3Rpb25bJ2dldERhdGEnXT4pOiB7XG4gICAgaW5wdXRPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W107XG4gICAgYW1vdW50czogc3RyaW5nW107XG4gICAgcmVjZWl2ZXJzOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgaW5wdXRPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBbXTtcbiAgICBjb25zdCBhbW91bnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlY2VpdmVyczogc3RyaW5nW10gPSBbXTtcblxuICAgIHR4RGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ09iamVjdCcgJiYgJ0ltbU9yT3duZWRPYmplY3QnIGluIGlucHV0Lk9iamVjdCkge1xuICAgICAgICBpbnB1dE9iamVjdHMucHVzaChpbnB1dC5PYmplY3QuSW1tT3JPd25lZE9iamVjdCBhcyBUcmFuc2FjdGlvbk9iamVjdElucHV0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LiRraW5kID09PSAnUHVyZScgJiYgJ2J5dGVzJyBpbiBpbnB1dC5QdXJlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZnJvbUJhc2U2NChpbnB1dC5QdXJlLmJ5dGVzKTtcbiAgICAgICAgY29uc3QgaGV4VmFsdWUgPSAnMHgnICsgdG9IZXgodmFsdWUpO1xuXG4gICAgICAgIGlmICh1dGlscy5pc1ZhbGlkQWRkcmVzcyhoZXhWYWx1ZSkpIHtcbiAgICAgICAgICByZWNlaXZlcnMucHVzaChoZXhWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW1vdW50cy5wdXNoKG5ldyBCY3NSZWFkZXIodmFsdWUpLnJlYWQ2NCgpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBpbnB1dE9iamVjdHMsIGFtb3VudHMsIHJlY2VpdmVycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBudW1iZXIgb2YgYW1vdW50cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFtb3VudHNNYXRjaFJlY2VpdmVycyhhbW91bnRzOiBzdHJpbmdbXSwgcmVjZWl2ZXJzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChhbW91bnRzLmxlbmd0aCAhPT0gcmVjZWl2ZXJzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdDb3VudCBvZiBhbW91bnRzIGRvZXMgbm90IG1hdGNoIGNvdW50IG9mIHJlY2VpdmVycycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25zIHBhcnNlZCBpbnB1dCBvYmplY3RzIHRvIGVpdGhlciBnYXMgcGF5bWVudCBvYmplY3RzIG9yIHBheW1lbnQgb2JqZWN0cy5cbiAgICogSWYgbm8gZ2FzIG9iamVjdHMgZXhpc3QgYW5kIHNlbmRlciBwYXlzIG93biBnYXMsIG9iamVjdHMgYmVjb21lIGdhcyBvYmplY3RzLlxuICAgKiBPdGhlcndpc2UsIHRoZXkgYmVjb21lIHBheW1lbnQgb2JqZWN0cy5cbiAgICovXG4gIHByaXZhdGUgYXNzaWduUGFyc2VkT2JqZWN0cyhpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSk6IHZvaWQge1xuICAgIGlmIChpbnB1dE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9HYXNPYmplY3RzRXhpc3QgPSAhdGhpcy5nYXNQYXltZW50T2JqZWN0cyB8fCB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBzZW5kZXJQYXlzT3duR2FzID0gIXRoaXMuZ2FzU3BvbnNvciB8fCB0aGlzLnNlbmRlciA9PT0gdGhpcy5nYXNTcG9uc29yO1xuXG4gICAgaWYgKG5vR2FzT2JqZWN0c0V4aXN0ICYmIHNlbmRlclBheXNPd25HYXMpIHtcbiAgICAgIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gaW5wdXRPYmplY3RzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBhc3NpZ25zIHJlY2lwaWVudHMgZnJvbSBwYXJzZWQgYWRkcmVzc2VzIGFuZCBhbW91bnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NpZ25SZWNpcGllbnRzKHJlY2VpdmVyczogc3RyaW5nW10sIGFtb3VudHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5fcmVjaXBpZW50cyA9IHJlY2VpdmVycy5tYXAoKGFkZHJlc3MsIGluZGV4KSA9PiAoe1xuICAgICAgYWRkcmVzcyxcbiAgICAgIGFtb3VudDogYW1vdW50c1tpbmRleF0sXG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VXaXRoSW50ZW50KG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gaW90YU1lc3NhZ2VXaXRoSW50ZW50KCdUcmFuc2FjdGlvbkRhdGEnLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZXMgdGhlIElPVEEgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMgYW5kIGNvbW1hbmRzIGZvciB0aGUgdHJhbnNmZXIuXG4gICAqIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvYmplY3RzIHRvIHVzZSBmb3IgcGF5bWVudCAoZWl0aGVyIHBheW1lbnQgb2JqZWN0cyBvciBnYXMgb2JqZWN0cyksXG4gICAqIGNvbnNvbGlkYXRlcyB0aGVtIGludG8gYSBzaW5nbGUgY29pbiwgYW5kIHRoZW4gc3BsaXRzL3RyYW5zZmVycyB0byByZWNpcGllbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBvcHVsYXRlVHhJbnB1dHNBbmRDb21tYW5kcygpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VDb2luID0gdGhpcy5nZXRDb25zb2xpZGF0ZWRTb3VyY2VDb2luKCk7XG4gICAgdGhpcy5zcGxpdEFuZFRyYW5zZmVyVG9SZWNpcGllbnRzKHNvdXJjZUNvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hpY2ggb2JqZWN0cyB0byB1c2UgYXMgdGhlIHBheW1lbnQgc291cmNlIGFuZCBjb25zb2xpZGF0ZXMgdGhlbS5cbiAgICogSWYgcGF5bWVudCBvYmplY3RzIGFyZSBwcm92aWRlZCwgdXNlIHRob3NlLiBPdGhlcndpc2UsIGlmIHRoZSBzZW5kZXIgaXMgcGF5aW5nXG4gICAqIHRoZWlyIG93biBnYXMsIHVzZSB0aGUgZ2FzIG9iamVjdHMgZm9yIHBheW1lbnQuXG4gICAqL1xuICBwcml2YXRlIGdldENvbnNvbGlkYXRlZFNvdXJjZUNvaW4oKTogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCB7XG4gICAgaWYgKHRoaXMuaGFzUGF5bWVudE9iamVjdHMoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25zb2xpZGF0ZUdhc09iamVjdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgcGF5bWVudCBvYmplY3RzIGV4aXN0IGFuZCBpZiBnYXMgb2JqZWN0cyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgKiBHYXMgb2JqZWN0cyBhcmUgdXNlZCB3aGVuOiBubyBwYXltZW50IG9iamVjdHMgZXhpc3QgQU5EIHNlbmRlciBwYXlzIHRoZWlyIG93biBnYXMuXG4gICAqL1xuICBwcml2YXRlIGhhc1BheW1lbnRPYmplY3RzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc1BheW1lbnRPYmplY3RzID0gdGhpcy5wYXltZW50T2JqZWN0cyAmJiB0aGlzLnBheW1lbnRPYmplY3RzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1BheW1lbnRPYmplY3RzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBwYXltZW50IG9iamVjdHMsIG9ubHkgdXNlIGdhcyBvYmplY3RzIGlmIHNlbmRlciBwYXlzIG93biBnYXNcbiAgICBjb25zdCBzZW5kZXJQYXlzT3duR2FzID0gIXRoaXMuZ2FzU3BvbnNvciB8fCB0aGlzLmdhc1Nwb25zb3IgPT09IHRoaXMuc2VuZGVyO1xuICAgIHJldHVybiAhc2VuZGVyUGF5c093bkdhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZXMgcGF5bWVudCBvYmplY3RzIGludG8gYSBzaW5nbGUgY29pbiBvYmplY3QuXG4gICAqIElmIG11bHRpcGxlIHBheW1lbnQgb2JqZWN0cyBleGlzdCwgdGhleSBhcmUgbWVyZ2VkIGluIGJhdGNoZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbnNvbGlkYXRlUGF5bWVudE9iamVjdHMoKTogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCB7XG4gICAgaWYgKCF0aGlzLnBheW1lbnRPYmplY3RzIHx8IHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9iamVjdCA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5vYmplY3QoSW90YUlucHV0cy5PYmplY3RSZWYodGhpcy5wYXltZW50T2JqZWN0c1swXSkpO1xuXG4gICAgLy8gU2luZ2xlIG9iamVjdCBkb2Vzbid0IG5lZWQgY29uc29saWRhdGlvblxuICAgIGlmICh0aGlzLnBheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGZpcnN0T2JqZWN0O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHJlbWFpbmluZyBvYmplY3RzIGludG8gdGhlIGZpcnN0IG9uZVxuICAgIHJldHVybiB0aGlzLm1lcmdlT2JqZWN0c0luQmF0Y2hlcyhmaXJzdE9iamVjdCwgdGhpcy5wYXltZW50T2JqZWN0cy5zbGljZSgxKSwgTUFYX0lOUFVUX09CSkVDVFMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBnYXMgcGF5bWVudCBvYmplY3RzIGludG8gYSBzaW5nbGUgY29pbiBvYmplY3QuXG4gICAqIElmIHRoZSBudW1iZXIgb2YgZ2FzIG9iamVjdHMgZXhjZWVkcyB0aGUgbWF4aW11bSwgdGhleSBhcmUgbWVyZ2VkIGluIGJhdGNoZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbnNvbGlkYXRlR2FzT2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAoIXRoaXMuZ2FzUGF5bWVudE9iamVjdHMgfHwgdGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignR2FzIHBheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBnYXNPYmplY3QgPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24uZ2FzO1xuXG4gICAgLy8gSWYgd2l0aGluIHRoZSBsaW1pdCwgbm8gY29uc29saWRhdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPD0gTUFYX0dBU19QQVlNRU5UX09CSkVDVFMpIHtcbiAgICAgIHJldHVybiBnYXNPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgZXhjZXNzIGdhcyBvYmplY3RzIHRvIHN0YXkgd2l0aGluIGxpbWl0c1xuICAgIHJldHVybiB0aGlzLm1lcmdlT2JqZWN0c0luQmF0Y2hlcyhnYXNPYmplY3QsIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMsIE1BWF9JTlBVVF9PQkpFQ1RTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgbXVsdGlwbGUgY29pbiBvYmplY3RzIGludG8gYSB0YXJnZXQgY29pbiBpbiBiYXRjaGVzLlxuICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIElPVEEgaGFzIGxpbWl0cyBvbiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgcGVyIG1lcmdlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXRDb2luIC0gVGhlIGNvaW4gdG8gbWVyZ2UgaW50b1xuICAgKiBAcGFyYW0gb2JqZWN0c1RvTWVyZ2UgLSBBcnJheSBvZiBvYmplY3RzIHRvIG1lcmdlXG4gICAqIEBwYXJhbSBiYXRjaFNpemUgLSBNYXhpbXVtIG51bWJlciBvZiBvYmplY3RzIHRvIG1lcmdlIHBlciBiYXRjaFxuICAgKiBAcmV0dXJucyBUaGUgY29uc29saWRhdGVkIGNvaW4gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIG1lcmdlT2JqZWN0c0luQmF0Y2hlcyhcbiAgICB0YXJnZXRDb2luOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50LFxuICAgIG9iamVjdHNUb01lcmdlOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10sXG4gICAgYmF0Y2hTaXplOiBudW1iZXJcbiAgKTogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCB7XG4gICAgbGV0IGNvbnNvbGlkYXRlZENvaW4gPSB0YXJnZXRDb2luO1xuXG4gICAgZm9yIChsZXQgc3RhcnRJbmRleCA9IDA7IHN0YXJ0SW5kZXggPCBvYmplY3RzVG9NZXJnZS5sZW5ndGg7IHN0YXJ0SW5kZXggKz0gYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IG9iamVjdHNUb01lcmdlLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBiYXRjaFNpemUpO1xuICAgICAgY29uc3QgYmF0Y2hBc1RyYW5zYWN0aW9uT2JqZWN0cyA9IGJhdGNoLm1hcCgob2JqKSA9PiB0aGlzLl9pb3RhVHJhbnNhY3Rpb24ub2JqZWN0KElvdGFJbnB1dHMuT2JqZWN0UmVmKG9iaikpKTtcblxuICAgICAgW2NvbnNvbGlkYXRlZENvaW5dID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm1lcmdlQ29pbnMoY29uc29saWRhdGVkQ29pbiwgYmF0Y2hBc1RyYW5zYWN0aW9uT2JqZWN0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnNvbGlkYXRlZENvaW47XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBzb3VyY2UgY29pbiBpbnRvIHRoZSBhbW91bnRzIG5lZWRlZCBmb3IgZWFjaCByZWNpcGllbnQgYW5kIHRyYW5zZmVycyB0aGVtLlxuICAgKiBUaGlzIGNyZWF0ZXMgc3BsaXQgY29pbiBjb21tYW5kcyBmb3IgYWxsIHJlY2lwaWVudCBhbW91bnRzLCB0aGVuIHRyYW5zZmVyIGNvbW1hbmRzXG4gICAqIHRvIHNlbmQgZWFjaCBzcGxpdCBjb2luIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlY2lwaWVudC5cbiAgICovXG4gIHByaXZhdGUgc3BsaXRBbmRUcmFuc2ZlclRvUmVjaXBpZW50cyhzb3VyY2VDb2luOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmVjaXBpZW50QW1vdW50cyA9IHRoaXMuX3JlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IHJlY2lwaWVudC5hbW91bnQpO1xuICAgIGNvbnN0IHNwbGl0Q29pbnMgPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24uc3BsaXRDb2lucyhzb3VyY2VDb2luLCByZWNpcGllbnRBbW91bnRzKTtcblxuICAgIHRoaXMuX3JlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50LCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy5faW90YVRyYW5zYWN0aW9uLnRyYW5zZmVyT2JqZWN0cyhbc3BsaXRDb2luc1tpbmRleF1dLCByZWNpcGllbnQuYWRkcmVzcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFsbCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBkYXRhIGJlZm9yZSBidWlsZGluZy5cbiAgICogQ2hlY2tzIHJlY2lwaWVudHMsIHBheW1lbnQgb2JqZWN0cywgYW5kIGVuc3VyZXMgbm8gZHVwbGljYXRlIG9iamVjdCBJRHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVUeERhdGFJbXBsZW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlUmVjaXBpZW50c0xpc3QoKTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bWVudE9iamVjdHNFeGlzdCgpO1xuICAgIHRoaXMudmFsaWRhdGVOb0R1cGxpY2F0ZU9iamVjdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCByZWNpcGllbnRzIGV4aXN0IGFuZCBkb24ndCBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZWNpcGllbnRzTGlzdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVjaXBpZW50cyB8fCB0aGlzLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHJlY2lwaWVudHMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVjaXBpZW50cy5sZW5ndGggPiBNQVhfUkVDSVBJRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgUmVjaXBpZW50cyBjb3VudCAoJHt0aGlzLnJlY2lwaWVudHMubGVuZ3RofSkgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgKCR7TUFYX1JFQ0lQSUVOVFN9KWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGVpdGhlciBwYXltZW50IG9iamVjdHMgb3IgZ2FzIG9iamVjdHMgZXhpc3QgZm9yIGZ1bmRpbmcgdGhlIHRyYW5zZmVyLlxuICAgKiBXaGVuIGEgZ2FzIHNwb25zb3IgaXMgdXNlZCwgcGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZC5cbiAgICogT3RoZXJ3aXNlLCBlaXRoZXIgcGF5bWVudCBvYmplY3RzIG9yIGdhcyBvYmplY3RzIGNhbiBiZSB1c2VkLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBheW1lbnRPYmplY3RzRXhpc3QoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzUGF5bWVudE9iamVjdHMgPSB0aGlzLnBheW1lbnRPYmplY3RzICYmIHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzUGF5bWVudE9iamVjdHMpIHtcbiAgICAgIHJldHVybjsgLy8gUGF5bWVudCBvYmplY3RzIGV4aXN0LCB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgIH1cblxuICAgIC8vIE5vIHBheW1lbnQgb2JqZWN0cyAtIGNoZWNrIGlmIGdhcyBvYmplY3RzIGNhbiBiZSB1c2VkIGluc3RlYWRcbiAgICBjb25zdCBoYXNHYXNTcG9uc29yID0gdGhpcy5nYXNTcG9uc29yICYmIHRoaXMuZ2FzU3BvbnNvciAhPT0gdGhpcy5zZW5kZXI7XG4gICAgaWYgKGhhc0dhc1Nwb25zb3IpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCB3aGVuIHVzaW5nIGEgZ2FzIHNwb25zb3InKTtcbiAgICB9XG5cbiAgICAvLyBObyBnYXMgc3BvbnNvciAtIGdhcyBvYmplY3RzIG11c3QgZXhpc3RcbiAgICBjb25zdCBoYXNHYXNPYmplY3RzID0gdGhpcy5nYXNQYXltZW50T2JqZWN0cyAmJiB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA+IDA7XG4gICAgaWYgKCFoYXNHYXNPYmplY3RzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb3IgR2FzIG9iamVjdHMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgb2JqZWN0IElEcyB3aXRoaW4gcGF5bWVudCBvYmplY3RzLFxuICAgKiBnYXMgcGF5bWVudCBvYmplY3RzLCBvciBiZXR3ZWVuIHRoZSB0d28gZ3JvdXBzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU5vRHVwbGljYXRlT2JqZWN0cygpOiB2b2lkIHtcbiAgICBjb25zdCBwYXltZW50T2JqZWN0SWRzID0gdGhpcy5wYXltZW50T2JqZWN0cz8ubWFwKChvYmopID0+IG9iai5vYmplY3RJZCkgPz8gW107XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlcyB3aXRoaW4gcGF5bWVudCBvYmplY3RzXG4gICAgdGhpcy5jaGVja0ZvckR1cGxpY2F0ZUlkcyhwYXltZW50T2JqZWN0SWRzLCAncGF5bWVudCBvYmplY3RzJyk7XG5cbiAgICBpZiAoIXRoaXMuZ2FzUGF5bWVudE9iamVjdHMgfHwgdGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBnYXNPYmplY3RJZHMgPSB0aGlzLmdhc1BheW1lbnRPYmplY3RzLm1hcCgoZ2FzKSA9PiBnYXMub2JqZWN0SWQpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZXMgd2l0aGluIGdhcyBwYXltZW50IG9iamVjdHNcbiAgICB0aGlzLmNoZWNrRm9yRHVwbGljYXRlSWRzKGdhc09iamVjdElkcywgJ2dhcyBwYXltZW50IG9iamVjdHMnKTtcblxuICAgIC8vIENoZWNrIGZvciBvdmVybGFwcyBiZXR3ZWVuIHBheW1lbnQgYW5kIGdhcyBvYmplY3RzXG4gICAgY29uc3Qgb3ZlcmxhcHBpbmdJZHMgPSBwYXltZW50T2JqZWN0SWRzLmZpbHRlcigoaWQpID0+IGdhc09iamVjdElkcy5pbmNsdWRlcyhpZCkpO1xuICAgIGlmIChvdmVybGFwcGluZ0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICdQYXltZW50IG9iamVjdHMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIGdhcyBwYXltZW50IG9iamVjdHM6ICcgKyBvdmVybGFwcGluZ0lkcy5qb2luKCcsICcpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBJRHMgaW4gYW4gYXJyYXkuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRm9yRHVwbGljYXRlSWRzKGlkczogc3RyaW5nW10sIG9iamVjdFR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVuaXF1ZUlkcyA9IG5ldyBTZXQoaWRzKTtcbiAgICBpZiAodW5pcXVlSWRzLnNpemUgIT09IGlkcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgRHVwbGljYXRlIG9iamVjdCBJRHMgZm91bmQgaW4gJHtvYmplY3RUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKiBQcm92aWRlcyBhIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBleHBsYWluVHJhbnNhY3Rpb25JbXBsZW1lbnRhdGlvbihcbiAgICBfanNvbjogVHhEYXRhLFxuICAgIGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uXG4gICk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IHJlY2lwaWVudCk7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdGhpcy5jYWxjdWxhdGVUb3RhbE91dHB1dEFtb3VudCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgb3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHRvdGFsIGFtb3VudCBiZWluZyB0cmFuc2ZlcnJlZCB0byBhbGwgcmVjaXBpZW50cy5cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVG90YWxPdXRwdXRBbW91bnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWNpcGllbnRzXG4gICAgICAucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IucGx1cyhjdXJyZW50LmFtb3VudCksIG5ldyBCaWdOdW1iZXIoMCkpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxufVxuIl19
|
package/dist/src/lib/utils.d.ts
CHANGED
|
@@ -1,22 +1,121 @@
|
|
|
1
1
|
import { BaseUtils } from '@bitgo-beta/sdk-core';
|
|
2
|
+
/**
|
|
3
|
+
* Utility class for IOTA-specific validation and conversion operations.
|
|
4
|
+
* Implements the BaseUtils interface and provides methods for validating
|
|
5
|
+
* addresses, keys, signatures, and transaction data.
|
|
6
|
+
*/
|
|
2
7
|
export declare class Utils implements BaseUtils {
|
|
3
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Validates an IOTA address format.
|
|
10
|
+
* IOTA addresses are 64-character hex strings prefixed with '0x'.
|
|
11
|
+
*
|
|
12
|
+
* @param address - The address to validate
|
|
13
|
+
* @returns true if the address is valid
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* utils.isValidAddress('0x1234...') // true
|
|
18
|
+
* utils.isValidAddress('invalid') // false
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
4
21
|
isValidAddress(address: string): boolean;
|
|
5
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Validates an IOTA block ID (digest).
|
|
24
|
+
* Block IDs are 32-byte base58-encoded strings.
|
|
25
|
+
*
|
|
26
|
+
* @param hash - The block ID to validate
|
|
27
|
+
* @returns true if the block ID is valid
|
|
28
|
+
*/
|
|
6
29
|
isValidBlockId(hash: string): boolean;
|
|
7
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* Validates an IOTA transaction ID (digest).
|
|
32
|
+
* Transaction IDs are 32-byte base58-encoded strings.
|
|
33
|
+
*
|
|
34
|
+
* @param txId - The transaction ID to validate
|
|
35
|
+
* @returns true if the transaction ID is valid
|
|
36
|
+
*/
|
|
37
|
+
isValidTransactionId(txId: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Validates an Ed25519 private key format.
|
|
40
|
+
*
|
|
41
|
+
* @param key - The private key to validate (hex string)
|
|
42
|
+
* @returns true if the private key is valid
|
|
43
|
+
*/
|
|
8
44
|
isValidPrivateKey(key: string): boolean;
|
|
9
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Validates an Ed25519 public key format.
|
|
47
|
+
*
|
|
48
|
+
* @param key - The public key to validate (hex string)
|
|
49
|
+
* @returns true if the public key is valid
|
|
50
|
+
*/
|
|
10
51
|
isValidPublicKey(key: string): boolean;
|
|
11
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* Validates an IOTA signature format.
|
|
54
|
+
* Signatures must be base64-encoded and exactly 64 bytes when decoded.
|
|
55
|
+
*
|
|
56
|
+
* @param signature - The base64-encoded signature to validate
|
|
57
|
+
* @returns true if the signature is valid
|
|
58
|
+
*/
|
|
12
59
|
isValidSignature(signature: string): boolean;
|
|
13
|
-
/**
|
|
14
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Validates a raw IOTA transaction format.
|
|
62
|
+
* Attempts to parse the transaction using the IOTA SDK.
|
|
63
|
+
*
|
|
64
|
+
* @param rawTransaction - The raw transaction (base64 string or Uint8Array)
|
|
65
|
+
* @returns true if the transaction can be parsed
|
|
66
|
+
*/
|
|
67
|
+
isValidRawTransaction(rawTransaction: string | Uint8Array): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Validates a hex string with a specific length requirement.
|
|
70
|
+
* Checks for '0x' or '0X' prefix followed by the specified number of hex characters.
|
|
71
|
+
*
|
|
72
|
+
* @param value - The hex string to validate
|
|
73
|
+
* @param length - The required length (number of hex characters, excluding prefix)
|
|
74
|
+
* @returns true if the hex string matches the format and length
|
|
75
|
+
*/
|
|
15
76
|
isValidHex(value: string, length: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Converts a value to a base64-encoded string.
|
|
79
|
+
* Handles both Uint8Array and hex string inputs.
|
|
80
|
+
*
|
|
81
|
+
* @param value - The value to encode (Uint8Array or hex string)
|
|
82
|
+
* @returns Base64-encoded string
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* utils.getBase64String(new Uint8Array([1, 2, 3]))
|
|
87
|
+
* utils.getBase64String('0x010203')
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
16
90
|
getBase64String(value: string | Uint8Array): string;
|
|
91
|
+
/**
|
|
92
|
+
* Derives an IOTA address from an Ed25519 public key.
|
|
93
|
+
* Uses the IOTA SDK's address derivation algorithm.
|
|
94
|
+
*
|
|
95
|
+
* @param publicKey - The Ed25519 public key (hex string)
|
|
96
|
+
* @returns The derived IOTA address
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const address = utils.getAddressFromPublicKey('8c26e54e36c902c5...')
|
|
101
|
+
* // Returns: '0x9882188ba3e8070a...'
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
17
104
|
getAddressFromPublicKey(publicKey: string): string;
|
|
18
|
-
isValidRawTransaction(rawTransaction: string | Uint8Array): boolean;
|
|
19
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Singleton instance of the Utils class.
|
|
108
|
+
* Use this for all IOTA utility operations throughout the SDK.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* import utils from './utils';
|
|
113
|
+
*
|
|
114
|
+
* if (utils.isValidAddress(address)) {
|
|
115
|
+
* // Process valid address
|
|
116
|
+
* }
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
20
119
|
declare const utils: Utils;
|
|
21
120
|
export default utils;
|
|
22
121
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8D,MAAM,sBAAsB,CAAC;AAW7G,qBAAa,KAAM,YAAW,SAAS;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8D,MAAM,sBAAsB,CAAC;AAW7G;;;;GAIG;AACH,qBAAa,KAAM,YAAW,SAAS;IAKrC;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC;;;;;;OAMG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ3C;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQtC;;;;;;OAMG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAU5C;;;;;;OAMG;IACH,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IAanE;;;;;;;OAOG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlD;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAOnD;;;;;;;;;;;;OAYG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAInD;AAED;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}
|