@bitgo-beta/sdk-coin-iota 1.0.0-alpha.43 → 1.0.0-alpha.44
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 -97
- 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 +124 -15
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +215 -66
- 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 +42 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +49 -8
- package/dist/src/lib/transferTransaction.d.ts +97 -1
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +220 -52
- package/dist/src/lib/utils.d.ts +107 -9
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +134 -46
- package/dist/test/resources/iota.d.ts +12 -0
- package/dist/test/resources/iota.d.ts.map +1 -1
- package/dist/test/resources/iota.js +21 -2
- 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 +75 -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 -107
- package/dist/test/unit/transactionBuilder/transferBuilder.js +384 -234
- package/dist/test/unit/transferTransaction.js +147 -275
- package/dist/test/unit/utils.js +171 -244
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -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,82 +113,229 @@ 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('
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
123
|
+
throw new sdk_core_1.InvalidTransactionError('Count of amounts does not match count of receivers');
|
|
124
|
+
}
|
|
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) {
|
|
138
|
+
this.gasPaymentObjects = inputObjects;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
this._paymentObjects = inputObjects;
|
|
142
|
+
}
|
|
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
|
+
}));
|
|
107
152
|
}
|
|
108
153
|
messageWithIntent(message) {
|
|
109
154
|
return (0, cryptography_1.messageWithIntent)('TransactionData', message);
|
|
110
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
|
+
*/
|
|
111
161
|
populateTxInputsAndCommands() {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
162
|
+
const sourceCoin = this.getConsolidatedSourceCoin();
|
|
163
|
+
this.splitAndTransferToRecipients(sourceCoin);
|
|
164
|
+
}
|
|
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;
|
|
127
184
|
}
|
|
185
|
+
// If no payment objects, only use gas objects if sender pays own gas
|
|
186
|
+
const senderPaysOwnGas = !this.gasSponsor || this.gasSponsor === this.sender;
|
|
187
|
+
return !senderPaysOwnGas;
|
|
128
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Consolidates payment objects into a single coin object.
|
|
191
|
+
* If multiple payment objects exist, they are merged in batches.
|
|
192
|
+
*/
|
|
193
|
+
consolidatePaymentObjects() {
|
|
194
|
+
if (!this.paymentObjects || this.paymentObjects.length === 0) {
|
|
195
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects are required');
|
|
196
|
+
}
|
|
197
|
+
const firstObject = this._iotaTransaction.object(transactions_1.Inputs.ObjectRef(this.paymentObjects[0]));
|
|
198
|
+
// Single object doesn't need consolidation
|
|
199
|
+
if (this.paymentObjects.length > 1) {
|
|
200
|
+
// Merge extra objects into the first one
|
|
201
|
+
this.mergeObjectsInBatches(firstObject, this.paymentObjects.slice(1), constants_1.MAX_INPUT_OBJECTS);
|
|
202
|
+
}
|
|
203
|
+
return firstObject;
|
|
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
|
+
*/
|
|
209
|
+
consolidateGasObjects() {
|
|
210
|
+
if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
|
|
211
|
+
throw new sdk_core_1.InvalidTransactionError('Gas payment objects are required');
|
|
212
|
+
}
|
|
213
|
+
const gasObject = this._iotaTransaction.gas;
|
|
214
|
+
if (this.gasPaymentObjects.length > constants_1.MAX_GAS_PAYMENT_OBJECTS) {
|
|
215
|
+
// Merge excess gas objects to stay within limits
|
|
216
|
+
this.mergeObjectsInBatches(gasObject, this.gasPaymentObjects, constants_1.MAX_INPUT_OBJECTS);
|
|
217
|
+
}
|
|
218
|
+
return gasObject;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Merges multiple coin objects into a target coin in batches.
|
|
222
|
+
* This is necessary because IOTA has limits on the number of objects per merge command.
|
|
223
|
+
*
|
|
224
|
+
* @param targetCoin - The coin to merge into
|
|
225
|
+
* @param objectsToMerge - Array of objects to merge
|
|
226
|
+
* @param batchSize - Maximum number of objects to merge per batch
|
|
227
|
+
* @returns The consolidated coin object
|
|
228
|
+
*/
|
|
229
|
+
mergeObjectsInBatches(targetCoin, objectsToMerge, batchSize) {
|
|
230
|
+
for (let startIndex = 0; startIndex < objectsToMerge.length; startIndex += batchSize) {
|
|
231
|
+
const batch = objectsToMerge.slice(startIndex, startIndex + batchSize);
|
|
232
|
+
const batchAsTransactionObjects = batch.map((obj) => this._iotaTransaction.object(transactions_1.Inputs.ObjectRef(obj)));
|
|
233
|
+
this._iotaTransaction.mergeCoins(targetCoin, batchAsTransactionObjects);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Splits the source coin into the amounts needed for each recipient and transfers them.
|
|
238
|
+
* This creates split coin commands for all recipient amounts, then transfer commands
|
|
239
|
+
* to send each split coin to the corresponding recipient.
|
|
240
|
+
*/
|
|
241
|
+
splitAndTransferToRecipients(sourceCoin) {
|
|
242
|
+
const recipientAmounts = this._recipients.map((recipient) => recipient.amount);
|
|
243
|
+
const splitCoins = this._iotaTransaction.splitCoins(sourceCoin, recipientAmounts);
|
|
244
|
+
this._recipients.forEach((recipient, index) => {
|
|
245
|
+
this._iotaTransaction.transferObjects([splitCoins[index]], recipient.address);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Validates all transfer transaction data before building.
|
|
250
|
+
* Checks recipients, payment objects, and ensures no duplicate object IDs.
|
|
251
|
+
*/
|
|
129
252
|
validateTxDataImplementation() {
|
|
130
|
-
|
|
253
|
+
this.validateRecipientsList();
|
|
254
|
+
this.validatePaymentObjectsExist();
|
|
255
|
+
this.validateNoDuplicateObjects();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Validates that recipients exist and don't exceed the maximum allowed.
|
|
259
|
+
*/
|
|
260
|
+
validateRecipientsList() {
|
|
261
|
+
if (!this.recipients || this.recipients.length === 0) {
|
|
131
262
|
throw new sdk_core_1.InvalidTransactionError('Transaction recipients are required');
|
|
132
263
|
}
|
|
133
264
|
if (this.recipients.length > constants_1.MAX_RECIPIENTS) {
|
|
134
265
|
throw new sdk_core_1.InvalidTransactionError(`Recipients count (${this.recipients.length}) exceeds maximum allowed (${constants_1.MAX_RECIPIENTS})`);
|
|
135
266
|
}
|
|
136
|
-
|
|
137
|
-
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Validates that either payment objects or gas objects exist for funding the transfer.
|
|
270
|
+
* When a gas sponsor is used, payment objects are required.
|
|
271
|
+
* Otherwise, either payment objects or gas objects can be used.
|
|
272
|
+
*/
|
|
273
|
+
validatePaymentObjectsExist() {
|
|
274
|
+
const hasPaymentObjects = this.paymentObjects && this.paymentObjects.length > 0;
|
|
275
|
+
if (hasPaymentObjects) {
|
|
276
|
+
return; // Payment objects exist, validation passes
|
|
138
277
|
}
|
|
139
|
-
//
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
278
|
+
// No payment objects - check if gas objects can be used instead
|
|
279
|
+
const hasGasSponsor = this.gasSponsor && this.gasSponsor !== this.sender;
|
|
280
|
+
if (hasGasSponsor) {
|
|
281
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects are required when using a gas sponsor');
|
|
282
|
+
}
|
|
283
|
+
// No gas sponsor - gas objects must exist
|
|
284
|
+
const hasGasObjects = this.gasPaymentObjects && this.gasPaymentObjects.length > 0;
|
|
285
|
+
if (!hasGasObjects) {
|
|
286
|
+
throw new sdk_core_1.InvalidTransactionError('Payment or Gas objects are required');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Validates that there are no duplicate object IDs within payment objects,
|
|
291
|
+
* gas payment objects, or between the two groups.
|
|
292
|
+
*/
|
|
293
|
+
validateNoDuplicateObjects() {
|
|
294
|
+
const paymentObjectIds = this.paymentObjects?.map((obj) => obj.objectId) ?? [];
|
|
295
|
+
// Check for duplicates within payment objects
|
|
296
|
+
this.checkForDuplicateIds(paymentObjectIds, 'payment objects');
|
|
297
|
+
if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
const gasObjectIds = this.gasPaymentObjects.map((gas) => gas.objectId);
|
|
301
|
+
// Check for duplicates within gas payment objects
|
|
302
|
+
this.checkForDuplicateIds(gasObjectIds, 'gas payment objects');
|
|
303
|
+
// Check for overlaps between payment and gas objects
|
|
304
|
+
const overlappingIds = paymentObjectIds.filter((id) => gasObjectIds.includes(id));
|
|
305
|
+
if (overlappingIds.length > 0) {
|
|
306
|
+
throw new sdk_core_1.InvalidTransactionError('Payment objects cannot be the same as gas payment objects: ' + overlappingIds.join(', '));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Helper to check for duplicate IDs in an array.
|
|
311
|
+
*/
|
|
312
|
+
checkForDuplicateIds(ids, objectType) {
|
|
313
|
+
const uniqueIds = new Set(ids);
|
|
314
|
+
if (uniqueIds.size !== ids.length) {
|
|
315
|
+
throw new sdk_core_1.InvalidTransactionError(`Duplicate object IDs found in ${objectType}`);
|
|
156
316
|
}
|
|
157
317
|
}
|
|
158
318
|
/**
|
|
159
319
|
* @inheritDoc
|
|
320
|
+
* Provides a human-readable explanation of the transfer transaction.
|
|
160
321
|
*/
|
|
161
|
-
explainTransactionImplementation(
|
|
322
|
+
explainTransactionImplementation(_json, explanationResult) {
|
|
162
323
|
const outputs = this.recipients.map((recipient) => recipient);
|
|
163
|
-
const
|
|
164
|
-
const outputAmount = outputAmountBN.toString();
|
|
324
|
+
const outputAmount = this.calculateTotalOutputAmount();
|
|
165
325
|
return {
|
|
166
326
|
...explanationResult,
|
|
167
327
|
outputAmount,
|
|
168
328
|
outputs,
|
|
169
329
|
};
|
|
170
330
|
}
|
|
331
|
+
/**
|
|
332
|
+
* Calculates the total amount being transferred to all recipients.
|
|
333
|
+
*/
|
|
334
|
+
calculateTotalOutputAmount() {
|
|
335
|
+
return this.recipients
|
|
336
|
+
.reduce((accumulator, current) => accumulator.plus(current.amount), new bignumber_js_1.default(0))
|
|
337
|
+
.toString();
|
|
338
|
+
}
|
|
171
339
|
}
|
|
172
340
|
exports.TransferTransaction = TransferTransaction;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBNkc7QUFFN0csK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBK0Y7QUFDL0Ysb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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QixDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLGtDQUF1QixDQUMvQiw2REFBNkQsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM3RyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxnQ0FBZ0MsQ0FDeEMsSUFBWSxFQUNaLGlCQUF5QztRQUV6QyxNQUFNLE9BQU8sR0FBMkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMzQyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUMxRCxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2pCLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0MsT0FBTztZQUNMLEdBQUcsaUJBQWlCO1lBQ3BCLFlBQVk7WUFDWixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5NRCxrREFtTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgdG9IZXgsIFRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCwgVHJhbnNmZXJUeERhdGEsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHtcbiAgSW5wdXRzIGFzIElvdGFJbnB1dHMsXG4gIFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQsXG4gIFRyYW5zYWN0aW9uIGFzIElvdGFUcmFuc2FjdGlvbixcbn0gZnJvbSAnQGlvdGEvaW90YS1zZGsvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IGZyb21CYXNlNjQgfSBmcm9tICdAaW90YS9pb3RhLXNkay91dGlscyc7XG5pbXBvcnQgeyBtZXNzYWdlV2l0aEludGVudCBhcyBpb3RhTWVzc2FnZVdpdGhJbnRlbnQgfSBmcm9tICdAaW90YS9pb3RhLXNkay9jcnlwdG9ncmFwaHknO1xuaW1wb3J0IHsgQmNzUmVhZGVyIH0gZnJvbSAnQGlvdGEvYmNzJztcbmltcG9ydCB7IE1BWF9JTlBVVF9PQkpFQ1RTLCBNQVhfUkVDSVBJRU5UUywgVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2ZlclRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIF9yZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdO1xuICBwcml2YXRlIF9wYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW107XG4gIH1cblxuICBnZXQgcmVjaXBpZW50cygpOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjaXBpZW50cztcbiAgfVxuXG4gIHNldCByZWNpcGllbnRzKHZhbHVlOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKSB7XG4gICAgdGhpcy5fcmVjaXBpZW50cyA9IHZhbHVlO1xuICAgIHRoaXMuX3JlYnVpbGRSZXF1aXJlZCA9IHRydWU7XG4gIH1cblxuICBnZXQgcGF5bWVudE9iamVjdHMoKTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bWVudE9iamVjdHM7XG4gIH1cblxuICBzZXQgcGF5bWVudE9iamVjdHModmFsdWU6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gdmFsdWU7XG4gICAgdGhpcy5fcmVidWlsZFJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWRkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lvdGFUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRoaXMucmVjaXBpZW50cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvciArIE51bWJlcihjdXJyZW50LmFtb3VudCksIDApO1xuICAgIHRoaXMuX291dHB1dHMgPSB0aGlzLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQsIGluZGV4KSA9PiAoe1xuICAgICAgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICB2YWx1ZTogcmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pKTtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRoaXMuc2VuZGVyLFxuICAgICAgICB2YWx1ZTogdG90YWxBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgdG9Kc29uKCk6IFRyYW5zZmVyVHhEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIudG9Kc29uKCksXG4gICAgICByZWNpcGllbnRzOiB0aGlzLnJlY2lwaWVudHMsXG4gICAgICBwYXltZW50T2JqZWN0czogdGhpcy5wYXltZW50T2JqZWN0cyxcbiAgICB9O1xuICB9XG5cbiAgcGFyc2VGcm9tSlNPTih0eERhdGE6IFRyYW5zZmVyVHhEYXRhKTogdm9pZCB7XG4gICAgc3VwZXIucGFyc2VGcm9tSlNPTih0eERhdGEpO1xuICAgIHRoaXMucmVjaXBpZW50cyA9IHR4RGF0YS5yZWNpcGllbnRzO1xuICAgIHRoaXMucGF5bWVudE9iamVjdHMgPSB0eERhdGEucGF5bWVudE9iamVjdHM7XG4gICAgdGhpcy51cGRhdGVJc1NpbXVsYXRlVHgoKTtcbiAgfVxuXG4gIHBhcnNlRnJvbUJyb2FkY2FzdFR4KHR4OiBzdHJpbmcgfCBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gSW90YVRyYW5zYWN0aW9uLmZyb20odHgpLmdldERhdGEoKTtcbiAgICBpZiAodHhEYXRhLmNvbW1hbmRzLmZpbHRlcigoY29tbWFuZCkgPT4gIVRSQU5TRkVSX1RSQU5TQUNUSU9OX0NPTU1BTkRTLmluY2x1ZGVzKGNvbW1hbmQuJGtpbmQpKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbW1hbmRzIGluIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBzdXBlci5wYXJzZUZyb21Ccm9hZGNhc3RUeCh0eCk7XG4gICAgY29uc3QgaW5wdXRPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBbXTtcbiAgICBjb25zdCBhbW91bnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlY2VpdmVyczogc3RyaW5nW10gPSBbXTtcbiAgICB0eERhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQuJGtpbmQgPT09ICdPYmplY3QnICYmICdJbW1Pck93bmVkT2JqZWN0JyBpbiBpbnB1dC5PYmplY3QpIHtcbiAgICAgICAgaW5wdXRPYmplY3RzLnB1c2goaW5wdXQuT2JqZWN0LkltbU9yT3duZWRPYmplY3QgYXMgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXQuJGtpbmQgPT09ICdQdXJlJyAmJiAnYnl0ZXMnIGluIGlucHV0LlB1cmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9tQmFzZTY0KGlucHV0LlB1cmUuYnl0ZXMpO1xuICAgICAgICBjb25zdCBoZXhWYWx1ZSA9ICcweCcgKyB0b0hleCh2YWx1ZSk7XG4gICAgICAgIGlmICh1dGlscy5pc1ZhbGlkQWRkcmVzcyhoZXhWYWx1ZSkpIHtcbiAgICAgICAgICByZWNlaXZlcnMucHVzaChoZXhWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW1vdW50cy5wdXNoKG5ldyBCY3NSZWFkZXIodmFsdWUpLnJlYWQ2NCgpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGFtb3VudHMubGVuZ3RoICE9PSByZWNlaXZlcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2NvdW50IG9mIGFtb3VudHMgZG9lcyBub3QgbWF0Y2ggY291bnQgb2YgcmVjZWl2ZXJzJyk7XG4gICAgfVxuICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gaW5wdXRPYmplY3RzO1xuICAgIHRoaXMucmVjaXBpZW50cyA9IFtdO1xuICAgIHJlY2VpdmVycy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9yZWNpcGllbnRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQsXG4gICAgICAgIGFtb3VudDogYW1vdW50c1tpbmRleF0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUlzU2ltdWxhdGVUeCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VXaXRoSW50ZW50KG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gaW90YU1lc3NhZ2VXaXRoSW50ZW50KCdUcmFuc2FjdGlvbkRhdGEnLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3B1bGF0ZVR4SW5wdXRzQW5kQ29tbWFuZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGF5bWVudE9iamVjdHMpIHtcbiAgICAgIGxldCBmaXJzdElucHV0T2JqOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50ID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChcbiAgICAgICAgSW90YUlucHV0cy5PYmplY3RSZWYodGhpcy5wYXltZW50T2JqZWN0c1swXSlcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGxldCBpZHggPSAxO1xuICAgICAgICB3aGlsZSAoaWR4IDwgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICBbZmlyc3RJbnB1dE9ial0gPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24ubWVyZ2VDb2lucyhcbiAgICAgICAgICAgIGZpcnN0SW5wdXRPYmosXG4gICAgICAgICAgICB0aGlzLnBheW1lbnRPYmplY3RzXG4gICAgICAgICAgICAgIC5zbGljZShpZHgsIGlkeCArIE1BWF9JTlBVVF9PQkpFQ1RTKVxuICAgICAgICAgICAgICAubWFwKChpbnB1dCkgPT4gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZihpbnB1dCkpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWR4ICs9IE1BWF9JTlBVVF9PQkpFQ1RTO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvaW5zID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLnNwbGl0Q29pbnMoXG4gICAgICAgIGZpcnN0SW5wdXRPYmosXG4gICAgICAgIHRoaXMuX3JlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IHJlY2lwaWVudC5hbW91bnQpXG4gICAgICApO1xuICAgICAgdGhpcy5fcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQsIGlkeCkgPT4ge1xuICAgICAgICB0aGlzLl9pb3RhVHJhbnNhY3Rpb24udHJhbnNmZXJPYmplY3RzKFtjb2luc1tpZHhdXSwgcmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVHhEYXRhSW1wbGVtZW50YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlY2lwaWVudHMgfHwgdGhpcy5yZWNpcGllbnRzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gcmVjaXBpZW50cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWNpcGllbnRzLmxlbmd0aCA+IE1BWF9SRUNJUElFTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBSZWNpcGllbnRzIGNvdW50ICgke3RoaXMucmVjaXBpZW50cy5sZW5ndGh9KSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCAoJHtNQVhfUkVDSVBJRU5UU30pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucGF5bWVudE9iamVjdHMgfHwgdGhpcy5wYXltZW50T2JqZWN0cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIG9iamVjdCBJRHMgaW4gcGF5bWVudCBvYmplY3RzXG4gICAgY29uc3QgcGF5bWVudE9iamVjdElkcyA9IHRoaXMucGF5bWVudE9iamVjdHMubWFwKChvYmopID0+IG9iai5vYmplY3RJZCk7XG4gICAgY29uc3QgdW5pcXVlUGF5bWVudElkcyA9IG5ldyBTZXQocGF5bWVudE9iamVjdElkcyk7XG4gICAgaWYgKHVuaXF1ZVBheW1lbnRJZHMuc2l6ZSAhPT0gcGF5bWVudE9iamVjdElkcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRHVwbGljYXRlIG9iamVjdCBJRHMgZm91bmQgaW4gcGF5bWVudCBvYmplY3RzJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2FzUGF5bWVudE9iamVjdHMgJiYgdGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnYXNPYmplY3RJZHMgPSB0aGlzLmdhc1BheW1lbnRPYmplY3RzLm1hcCgoZ2FzKSA9PiBnYXMub2JqZWN0SWQpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIG9iamVjdCBJRHMgaW4gZ2FzIHBheW1lbnQgb2JqZWN0c1xuICAgICAgY29uc3QgdW5pcXVlR2FzSWRzID0gbmV3IFNldChnYXNPYmplY3RJZHMpO1xuICAgICAgaWYgKHVuaXF1ZUdhc0lkcy5zaXplICE9PSBnYXNPYmplY3RJZHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRHVwbGljYXRlIG9iamVjdCBJRHMgZm91bmQgaW4gZ2FzIHBheW1lbnQgb2JqZWN0cycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkdXBsaWNhdGVzID0gdGhpcy5wYXltZW50T2JqZWN0cy5maWx0ZXIoKHBheW1lbnQpID0+IGdhc09iamVjdElkcy5pbmNsdWRlcyhwYXltZW50Lm9iamVjdElkKSk7XG4gICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAnUGF5bWVudCBvYmplY3RzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyBnYXMgcGF5bWVudCBvYmplY3RzOiAnICsgZHVwbGljYXRlcy5tYXAoKGQpID0+IGQub2JqZWN0SWQpLmpvaW4oJywgJylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByb3RlY3RlZCBleHBsYWluVHJhbnNhY3Rpb25JbXBsZW1lbnRhdGlvbihcbiAgICBqc29uOiBUeERhdGEsXG4gICAgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb25cbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IHRoaXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50KTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnRCTiA9IHRoaXMucmVjaXBpZW50cy5yZWR1Y2UoXG4gICAgICAoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGFjY3VtdWxhdG9yLnBsdXMoY3VycmVudC5hbW91bnQpLFxuICAgICAgbmV3IEJpZ051bWJlcigwKVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50Qk4udG9TdHJpbmcoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5leHBsYW5hdGlvblJlc3VsdCxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIG91dHB1dHMsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBNkc7QUFFN0csK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBd0g7QUFDeEgsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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QUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEYsUUFBUSxFQUFFLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBNVlELGtEQTRZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludmFsaWRUcmFuc2FjdGlvbkVycm9yLCB0b0hleCwgVHJhbnNhY3Rpb25SZWNpcGllbnQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUcmFuc2FjdGlvbk9iamVjdElucHV0LCBUcmFuc2ZlclR4RGF0YSwgVHhEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBJbnB1dHMgYXMgSW90YUlucHV0cyxcbiAgVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCxcbiAgVHJhbnNhY3Rpb24gYXMgSW90YVRyYW5zYWN0aW9uLFxufSBmcm9tICdAaW90YS9pb3RhLXNkay90cmFuc2FjdGlvbnMnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCB9IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL3V0aWxzJztcbmltcG9ydCB7IG1lc3NhZ2VXaXRoSW50ZW50IGFzIGlvdGFNZXNzYWdlV2l0aEludGVudCB9IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL2NyeXB0b2dyYXBoeSc7XG5pbXBvcnQgeyBCY3NSZWFkZXIgfSBmcm9tICdAaW90YS9iY3MnO1xuaW1wb3J0IHsgTUFYX0dBU19QQVlNRU5UX09CSkVDVFMsIE1BWF9JTlBVVF9PQkpFQ1RTLCBNQVhfUkVDSVBJRU5UUywgVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2ZlclRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIF9yZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdO1xuICBwcml2YXRlIF9wYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW107XG4gIH1cblxuICBnZXQgcmVjaXBpZW50cygpOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjaXBpZW50cztcbiAgfVxuXG4gIHNldCByZWNpcGllbnRzKHZhbHVlOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKSB7XG4gICAgdGhpcy5fcmVjaXBpZW50cyA9IHZhbHVlO1xuICAgIHRoaXMuX3JlYnVpbGRSZXF1aXJlZCA9IHRydWU7XG4gIH1cblxuICBnZXQgcGF5bWVudE9iamVjdHMoKTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bWVudE9iamVjdHM7XG4gIH1cblxuICBzZXQgcGF5bWVudE9iamVjdHModmFsdWU6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gdmFsdWU7XG4gICAgdGhpcy5fcmVidWlsZFJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWRkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lvdGFUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRoaXMucmVjaXBpZW50cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvciArIE51bWJlcihjdXJyZW50LmFtb3VudCksIDApO1xuICAgIHRoaXMuX291dHB1dHMgPSB0aGlzLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQsIGluZGV4KSA9PiAoe1xuICAgICAgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICB2YWx1ZTogcmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pKTtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRoaXMuc2VuZGVyLFxuICAgICAgICB2YWx1ZTogdG90YWxBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgdG9Kc29uKCk6IFRyYW5zZmVyVHhEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIudG9Kc29uKCksXG4gICAgICByZWNpcGllbnRzOiB0aGlzLnJlY2lwaWVudHMsXG4gICAgICBwYXltZW50T2JqZWN0czogdGhpcy5wYXltZW50T2JqZWN0cyxcbiAgICB9O1xuICB9XG5cbiAgcGFyc2VGcm9tSlNPTih0eERhdGE6IFRyYW5zZmVyVHhEYXRhKTogdm9pZCB7XG4gICAgc3VwZXIucGFyc2VGcm9tSlNPTih0eERhdGEpO1xuICAgIHRoaXMucmVjaXBpZW50cyA9IHR4RGF0YS5yZWNpcGllbnRzO1xuICAgIHRoaXMucGF5bWVudE9iamVjdHMgPSB0eERhdGEucGF5bWVudE9iamVjdHM7XG4gICAgdGhpcy51cGRhdGVJc1NpbXVsYXRlVHgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBmcm9tIGl0cyBicm9hZGNhc3QgZm9ybWF0IChiYXNlNjQgb3IgcmF3IGJ5dGVzKS5cbiAgICogRXh0cmFjdHMgcmVjaXBpZW50cywgYW1vdW50cywgYW5kIHBheW1lbnQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbiBkYXRhLlxuICAgKi9cbiAgcGFyc2VGcm9tQnJvYWRjYXN0VHgodHg6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSBJb3RhVHJhbnNhY3Rpb24uZnJvbSh0eCkuZ2V0RGF0YSgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2ZlckNvbW1hbmRzKHR4RGF0YSk7XG5cbiAgICBzdXBlci5wYXJzZUZyb21Ccm9hZGNhc3RUeCh0eCk7XG5cbiAgICBjb25zdCB7IGlucHV0T2JqZWN0cywgYW1vdW50cywgcmVjZWl2ZXJzIH0gPSB0aGlzLnBhcnNlVHJhbnNhY3Rpb25JbnB1dHModHhEYXRhKTtcbiAgICB0aGlzLnZhbGlkYXRlQW1vdW50c01hdGNoUmVjZWl2ZXJzKGFtb3VudHMsIHJlY2VpdmVycyk7XG4gICAgdGhpcy5hc3NpZ25QYXJzZWRPYmplY3RzKGlucHV0T2JqZWN0cyk7XG4gICAgdGhpcy5hc3NpZ25SZWNpcGllbnRzKHJlY2VpdmVycywgYW1vdW50cyk7XG4gICAgdGhpcy51cGRhdGVJc1NpbXVsYXRlVHgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb25seSBjb250YWlucyBzdXBwb3J0ZWQgdHJhbnNmZXIgY29tbWFuZHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNmZXJDb21tYW5kcyh0eERhdGE6IFJldHVyblR5cGU8SW90YVRyYW5zYWN0aW9uWydnZXREYXRhJ10+KTogdm9pZCB7XG4gICAgY29uc3QgaGFzVW5zdXBwb3J0ZWRDb21tYW5kcyA9IHR4RGF0YS5jb21tYW5kcy5zb21lKFxuICAgICAgKGNvbW1hbmQpID0+ICFUUkFOU0ZFUl9UUkFOU0FDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhjb21tYW5kLiRraW5kKVxuICAgICk7XG5cbiAgICBpZiAoaGFzVW5zdXBwb3J0ZWRDb21tYW5kcykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdVbnN1cHBvcnRlZCBjb21tYW5kcyBpbiB0aGUgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRyYW5zYWN0aW9uIGlucHV0cyB0byBleHRyYWN0IG9iamVjdHMsIGFtb3VudHMsIGFuZCByZWNlaXZlciBhZGRyZXNzZXMuXG4gICAqL1xuICBwcml2YXRlIHBhcnNlVHJhbnNhY3Rpb25JbnB1dHModHhEYXRhOiBSZXR1cm5UeXBlPElvdGFUcmFuc2FjdGlvblsnZ2V0RGF0YSddPik6IHtcbiAgICBpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcbiAgICBhbW91bnRzOiBzdHJpbmdbXTtcbiAgICByZWNlaXZlcnM6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCBpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGFtb3VudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVjZWl2ZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdHhEYXRhLmlucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgaWYgKGlucHV0LiRraW5kID09PSAnT2JqZWN0JyAmJiAnSW1tT3JPd25lZE9iamVjdCcgaW4gaW5wdXQuT2JqZWN0KSB7XG4gICAgICAgIGlucHV0T2JqZWN0cy5wdXNoKGlucHV0Lk9iamVjdC5JbW1Pck93bmVkT2JqZWN0IGFzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXQuJGtpbmQgPT09ICdQdXJlJyAmJiAnYnl0ZXMnIGluIGlucHV0LlB1cmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9tQmFzZTY0KGlucHV0LlB1cmUuYnl0ZXMpO1xuICAgICAgICBjb25zdCBoZXhWYWx1ZSA9ICcweCcgKyB0b0hleCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGhleFZhbHVlKSkge1xuICAgICAgICAgIHJlY2VpdmVycy5wdXNoKGhleFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbW91bnRzLnB1c2gobmV3IEJjc1JlYWRlcih2YWx1ZSkucmVhZDY0KCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7IGlucHV0T2JqZWN0cywgYW1vdW50cywgcmVjZWl2ZXJzIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIG51bWJlciBvZiBhbW91bnRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiByZWNlaXZlcnMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQW1vdW50c01hdGNoUmVjZWl2ZXJzKGFtb3VudHM6IHN0cmluZ1tdLCByZWNlaXZlcnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKGFtb3VudHMubGVuZ3RoICE9PSByZWNlaXZlcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0NvdW50IG9mIGFtb3VudHMgZG9lcyBub3QgbWF0Y2ggY291bnQgb2YgcmVjZWl2ZXJzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbnMgcGFyc2VkIGlucHV0IG9iamVjdHMgdG8gZWl0aGVyIGdhcyBwYXltZW50IG9iamVjdHMgb3IgcGF5bWVudCBvYmplY3RzLlxuICAgKiBJZiBubyBnYXMgb2JqZWN0cyBleGlzdCBhbmQgc2VuZGVyIHBheXMgb3duIGdhcywgb2JqZWN0cyBiZWNvbWUgZ2FzIG9iamVjdHMuXG4gICAqIE90aGVyd2lzZSwgdGhleSBiZWNvbWUgcGF5bWVudCBvYmplY3RzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NpZ25QYXJzZWRPYmplY3RzKGlucHV0T2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdKTogdm9pZCB7XG4gICAgaWYgKGlucHV0T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub0dhc09iamVjdHNFeGlzdCA9ICF0aGlzLmdhc1BheW1lbnRPYmplY3RzIHx8IHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID09PSAwO1xuICAgIGNvbnN0IHNlbmRlclBheXNPd25HYXMgPSAhdGhpcy5nYXNTcG9uc29yIHx8IHRoaXMuc2VuZGVyID09PSB0aGlzLmdhc1Nwb25zb3I7XG5cbiAgICBpZiAobm9HYXNPYmplY3RzRXhpc3QgJiYgc2VuZGVyUGF5c093bkdhcykge1xuICAgICAgdGhpcy5nYXNQYXltZW50T2JqZWN0cyA9IGlucHV0T2JqZWN0cztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGFzc2lnbnMgcmVjaXBpZW50cyBmcm9tIHBhcnNlZCBhZGRyZXNzZXMgYW5kIGFtb3VudHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2lnblJlY2lwaWVudHMocmVjZWl2ZXJzOiBzdHJpbmdbXSwgYW1vdW50czogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNpcGllbnRzID0gcmVjZWl2ZXJzLm1hcCgoYWRkcmVzcywgaW5kZXgpID0+ICh7XG4gICAgICBhZGRyZXNzLFxuICAgICAgYW1vdW50OiBhbW91bnRzW2luZGV4XSxcbiAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWVzc2FnZVdpdGhJbnRlbnQobWVzc2FnZTogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiBpb3RhTWVzc2FnZVdpdGhJbnRlbnQoJ1RyYW5zYWN0aW9uRGF0YScsIG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvcHVsYXRlcyB0aGUgSU9UQSB0cmFuc2FjdGlvbiB3aXRoIGlucHV0cyBhbmQgY29tbWFuZHMgZm9yIHRoZSB0cmFuc2Zlci5cbiAgICogVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9iamVjdHMgdG8gdXNlIGZvciBwYXltZW50IChlaXRoZXIgcGF5bWVudCBvYmplY3RzIG9yIGdhcyBvYmplY3RzKSxcbiAgICogY29uc29saWRhdGVzIHRoZW0gaW50byBhIHNpbmdsZSBjb2luLCBhbmQgdGhlbiBzcGxpdHMvdHJhbnNmZXJzIHRvIHJlY2lwaWVudHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcG9wdWxhdGVUeElucHV0c0FuZENvbW1hbmRzKCk6IHZvaWQge1xuICAgIGNvbnN0IHNvdXJjZUNvaW4gPSB0aGlzLmdldENvbnNvbGlkYXRlZFNvdXJjZUNvaW4oKTtcbiAgICB0aGlzLnNwbGl0QW5kVHJhbnNmZXJUb1JlY2lwaWVudHMoc291cmNlQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGljaCBvYmplY3RzIHRvIHVzZSBhcyB0aGUgcGF5bWVudCBzb3VyY2UgYW5kIGNvbnNvbGlkYXRlcyB0aGVtLlxuICAgKiBJZiBwYXltZW50IG9iamVjdHMgYXJlIHByb3ZpZGVkLCB1c2UgdGhvc2UuIE90aGVyd2lzZSwgaWYgdGhlIHNlbmRlciBpcyBwYXlpbmdcbiAgICogdGhlaXIgb3duIGdhcywgdXNlIHRoZSBnYXMgb2JqZWN0cyBmb3IgcGF5bWVudC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q29uc29saWRhdGVkU291cmNlQ29pbigpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAodGhpcy5oYXNQYXltZW50T2JqZWN0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25zb2xpZGF0ZVBheW1lbnRPYmplY3RzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnNvbGlkYXRlR2FzT2JqZWN0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBwYXltZW50IG9iamVjdHMgZXhpc3QgYW5kIGlmIGdhcyBvYmplY3RzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAqIEdhcyBvYmplY3RzIGFyZSB1c2VkIHdoZW46IG5vIHBheW1lbnQgb2JqZWN0cyBleGlzdCBBTkQgc2VuZGVyIHBheXMgdGhlaXIgb3duIGdhcy5cbiAgICovXG4gIHByaXZhdGUgaGFzUGF5bWVudE9iamVjdHMoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaGFzUGF5bWVudE9iamVjdHMgPSB0aGlzLnBheW1lbnRPYmplY3RzICYmIHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzUGF5bWVudE9iamVjdHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIG5vIHBheW1lbnQgb2JqZWN0cywgb25seSB1c2UgZ2FzIG9iamVjdHMgaWYgc2VuZGVyIHBheXMgb3duIGdhc1xuICAgIGNvbnN0IHNlbmRlclBheXNPd25HYXMgPSAhdGhpcy5nYXNTcG9uc29yIHx8IHRoaXMuZ2FzU3BvbnNvciA9PT0gdGhpcy5zZW5kZXI7XG4gICAgcmV0dXJuICFzZW5kZXJQYXlzT3duR2FzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBwYXltZW50IG9iamVjdHMgaW50byBhIHNpbmdsZSBjb2luIG9iamVjdC5cbiAgICogSWYgbXVsdGlwbGUgcGF5bWVudCBvYmplY3RzIGV4aXN0LCB0aGV5IGFyZSBtZXJnZWQgaW4gYmF0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAoIXRoaXMucGF5bWVudE9iamVjdHMgfHwgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2JqZWN0ID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZih0aGlzLnBheW1lbnRPYmplY3RzWzBdKSk7XG5cbiAgICAvLyBTaW5nbGUgb2JqZWN0IGRvZXNuJ3QgbmVlZCBjb25zb2xpZGF0aW9uXG4gICAgaWYgKHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID4gMSkge1xuICAgICAgLy8gTWVyZ2UgZXh0cmEgb2JqZWN0cyBpbnRvIHRoZSBmaXJzdCBvbmVcbiAgICAgIHRoaXMubWVyZ2VPYmplY3RzSW5CYXRjaGVzKGZpcnN0T2JqZWN0LCB0aGlzLnBheW1lbnRPYmplY3RzLnNsaWNlKDEpLCBNQVhfSU5QVVRfT0JKRUNUUyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0T2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBnYXMgcGF5bWVudCBvYmplY3RzIGludG8gYSBzaW5nbGUgY29pbiBvYmplY3QuXG4gICAqIElmIHRoZSBudW1iZXIgb2YgZ2FzIG9iamVjdHMgZXhjZWVkcyB0aGUgbWF4aW11bSwgdGhleSBhcmUgbWVyZ2VkIGluIGJhdGNoZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbnNvbGlkYXRlR2FzT2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAoIXRoaXMuZ2FzUGF5bWVudE9iamVjdHMgfHwgdGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignR2FzIHBheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBnYXNPYmplY3QgPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24uZ2FzO1xuXG4gICAgaWYgKHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID4gTUFYX0dBU19QQVlNRU5UX09CSkVDVFMpIHtcbiAgICAgIC8vIE1lcmdlIGV4Y2VzcyBnYXMgb2JqZWN0cyB0byBzdGF5IHdpdGhpbiBsaW1pdHNcbiAgICAgIHRoaXMubWVyZ2VPYmplY3RzSW5CYXRjaGVzKGdhc09iamVjdCwgdGhpcy5nYXNQYXltZW50T2JqZWN0cywgTUFYX0lOUFVUX09CSkVDVFMpO1xuICAgIH1cblxuICAgIHJldHVybiBnYXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIG11bHRpcGxlIGNvaW4gb2JqZWN0cyBpbnRvIGEgdGFyZ2V0IGNvaW4gaW4gYmF0Y2hlcy5cbiAgICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBJT1RBIGhhcyBsaW1pdHMgb24gdGhlIG51bWJlciBvZiBvYmplY3RzIHBlciBtZXJnZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0Q29pbiAtIFRoZSBjb2luIHRvIG1lcmdlIGludG9cbiAgICogQHBhcmFtIG9iamVjdHNUb01lcmdlIC0gQXJyYXkgb2Ygb2JqZWN0cyB0byBtZXJnZVxuICAgKiBAcGFyYW0gYmF0Y2hTaXplIC0gTWF4aW11bSBudW1iZXIgb2Ygb2JqZWN0cyB0byBtZXJnZSBwZXIgYmF0Y2hcbiAgICogQHJldHVybnMgVGhlIGNvbnNvbGlkYXRlZCBjb2luIG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZU9iamVjdHNJbkJhdGNoZXMoXG4gICAgdGFyZ2V0Q29pbjogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCxcbiAgICBvYmplY3RzVG9NZXJnZTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdLFxuICAgIGJhdGNoU2l6ZTogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGZvciAobGV0IHN0YXJ0SW5kZXggPSAwOyBzdGFydEluZGV4IDwgb2JqZWN0c1RvTWVyZ2UubGVuZ3RoOyBzdGFydEluZGV4ICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBvYmplY3RzVG9NZXJnZS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgYmF0Y2hTaXplKTtcbiAgICAgIGNvbnN0IGJhdGNoQXNUcmFuc2FjdGlvbk9iamVjdHMgPSBiYXRjaC5tYXAoKG9iaikgPT4gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZihvYmopKSk7XG5cbiAgICAgIHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5tZXJnZUNvaW5zKHRhcmdldENvaW4sIGJhdGNoQXNUcmFuc2FjdGlvbk9iamVjdHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdHMgdGhlIHNvdXJjZSBjb2luIGludG8gdGhlIGFtb3VudHMgbmVlZGVkIGZvciBlYWNoIHJlY2lwaWVudCBhbmQgdHJhbnNmZXJzIHRoZW0uXG4gICAqIFRoaXMgY3JlYXRlcyBzcGxpdCBjb2luIGNvbW1hbmRzIGZvciBhbGwgcmVjaXBpZW50IGFtb3VudHMsIHRoZW4gdHJhbnNmZXIgY29tbWFuZHNcbiAgICogdG8gc2VuZCBlYWNoIHNwbGl0IGNvaW4gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcmVjaXBpZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzcGxpdEFuZFRyYW5zZmVyVG9SZWNpcGllbnRzKHNvdXJjZUNvaW46IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWNpcGllbnRBbW91bnRzID0gdGhpcy5fcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50LmFtb3VudCk7XG4gICAgY29uc3Qgc3BsaXRDb2lucyA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5zcGxpdENvaW5zKHNvdXJjZUNvaW4sIHJlY2lwaWVudEFtb3VudHMpO1xuXG4gICAgdGhpcy5fcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9pb3RhVHJhbnNhY3Rpb24udHJhbnNmZXJPYmplY3RzKFtzcGxpdENvaW5zW2luZGV4XV0sIHJlY2lwaWVudC5hZGRyZXNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYWxsIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGRhdGEgYmVmb3JlIGJ1aWxkaW5nLlxuICAgKiBDaGVja3MgcmVjaXBpZW50cywgcGF5bWVudCBvYmplY3RzLCBhbmQgZW5zdXJlcyBubyBkdXBsaWNhdGUgb2JqZWN0IElEcy5cbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVR4RGF0YUltcGxlbWVudGF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVSZWNpcGllbnRzTGlzdCgpO1xuICAgIHRoaXMudmFsaWRhdGVQYXltZW50T2JqZWN0c0V4aXN0KCk7XG4gICAgdGhpcy52YWxpZGF0ZU5vRHVwbGljYXRlT2JqZWN0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHJlY2lwaWVudHMgZXhpc3QgYW5kIGRvbid0IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlY2lwaWVudHNMaXN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZWNpcGllbnRzIHx8IHRoaXMucmVjaXBpZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gcmVjaXBpZW50cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWNpcGllbnRzLmxlbmd0aCA+IE1BWF9SRUNJUElFTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBSZWNpcGllbnRzIGNvdW50ICgke3RoaXMucmVjaXBpZW50cy5sZW5ndGh9KSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCAoJHtNQVhfUkVDSVBJRU5UU30pYFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgZWl0aGVyIHBheW1lbnQgb2JqZWN0cyBvciBnYXMgb2JqZWN0cyBleGlzdCBmb3IgZnVuZGluZyB0aGUgdHJhbnNmZXIuXG4gICAqIFdoZW4gYSBnYXMgc3BvbnNvciBpcyB1c2VkLCBwYXltZW50IG9iamVjdHMgYXJlIHJlcXVpcmVkLlxuICAgKiBPdGhlcndpc2UsIGVpdGhlciBwYXltZW50IG9iamVjdHMgb3IgZ2FzIG9iamVjdHMgY2FuIGJlIHVzZWQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGF5bWVudE9iamVjdHNFeGlzdCgpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNQYXltZW50T2JqZWN0cyA9IHRoaXMucGF5bWVudE9iamVjdHMgJiYgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPiAwO1xuICAgIGlmIChoYXNQYXltZW50T2JqZWN0cykge1xuICAgICAgcmV0dXJuOyAvLyBQYXltZW50IG9iamVjdHMgZXhpc3QsIHZhbGlkYXRpb24gcGFzc2VzXG4gICAgfVxuXG4gICAgLy8gTm8gcGF5bWVudCBvYmplY3RzIC0gY2hlY2sgaWYgZ2FzIG9iamVjdHMgY2FuIGJlIHVzZWQgaW5zdGVhZFxuICAgIGNvbnN0IGhhc0dhc1Nwb25zb3IgPSB0aGlzLmdhc1Nwb25zb3IgJiYgdGhpcy5nYXNTcG9uc29yICE9PSB0aGlzLnNlbmRlcjtcbiAgICBpZiAoaGFzR2FzU3BvbnNvcikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdQYXltZW50IG9iamVjdHMgYXJlIHJlcXVpcmVkIHdoZW4gdXNpbmcgYSBnYXMgc3BvbnNvcicpO1xuICAgIH1cblxuICAgIC8vIE5vIGdhcyBzcG9uc29yIC0gZ2FzIG9iamVjdHMgbXVzdCBleGlzdFxuICAgIGNvbnN0IGhhc0dhc09iamVjdHMgPSB0aGlzLmdhc1BheW1lbnRPYmplY3RzICYmIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID4gMDtcbiAgICBpZiAoIWhhc0dhc09iamVjdHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvciBHYXMgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIGR1cGxpY2F0ZSBvYmplY3QgSURzIHdpdGhpbiBwYXltZW50IG9iamVjdHMsXG4gICAqIGdhcyBwYXltZW50IG9iamVjdHMsIG9yIGJldHdlZW4gdGhlIHR3byBncm91cHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTm9EdXBsaWNhdGVPYmplY3RzKCk6IHZvaWQge1xuICAgIGNvbnN0IHBheW1lbnRPYmplY3RJZHMgPSB0aGlzLnBheW1lbnRPYmplY3RzPy5tYXAoKG9iaikgPT4gb2JqLm9iamVjdElkKSA/PyBbXTtcblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGVzIHdpdGhpbiBwYXltZW50IG9iamVjdHNcbiAgICB0aGlzLmNoZWNrRm9yRHVwbGljYXRlSWRzKHBheW1lbnRPYmplY3RJZHMsICdwYXltZW50IG9iamVjdHMnKTtcblxuICAgIGlmICghdGhpcy5nYXNQYXltZW50T2JqZWN0cyB8fCB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGdhc09iamVjdElkcyA9IHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubWFwKChnYXMpID0+IGdhcy5vYmplY3RJZCk7XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlcyB3aXRoaW4gZ2FzIHBheW1lbnQgb2JqZWN0c1xuICAgIHRoaXMuY2hlY2tGb3JEdXBsaWNhdGVJZHMoZ2FzT2JqZWN0SWRzLCAnZ2FzIHBheW1lbnQgb2JqZWN0cycpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIG92ZXJsYXBzIGJldHdlZW4gcGF5bWVudCBhbmQgZ2FzIG9iamVjdHNcbiAgICBjb25zdCBvdmVybGFwcGluZ0lkcyA9IHBheW1lbnRPYmplY3RJZHMuZmlsdGVyKChpZCkgPT4gZ2FzT2JqZWN0SWRzLmluY2x1ZGVzKGlkKSk7XG4gICAgaWYgKG92ZXJsYXBwaW5nSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgJ1BheW1lbnQgb2JqZWN0cyBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgZ2FzIHBheW1lbnQgb2JqZWN0czogJyArIG92ZXJsYXBwaW5nSWRzLmpvaW4oJywgJylcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBjaGVjayBmb3IgZHVwbGljYXRlIElEcyBpbiBhbiBhcnJheS5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tGb3JEdXBsaWNhdGVJZHMoaWRzOiBzdHJpbmdbXSwgb2JqZWN0VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdW5pcXVlSWRzID0gbmV3IFNldChpZHMpO1xuICAgIGlmICh1bmlxdWVJZHMuc2l6ZSAhPT0gaWRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBEdXBsaWNhdGUgb2JqZWN0IElEcyBmb3VuZCBpbiAke29iamVjdFR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqIFByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGV4cGxhaW5UcmFuc2FjdGlvbkltcGxlbWVudGF0aW9uKFxuICAgIF9qc29uOiBUeERhdGEsXG4gICAgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb25cbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50KTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0aGlzLmNhbGN1bGF0ZVRvdGFsT3V0cHV0QW1vdW50KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgdG90YWwgYW1vdW50IGJlaW5nIHRyYW5zZmVycmVkIHRvIGFsbCByZWNpcGllbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUb3RhbE91dHB1dEFtb3VudCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlY2lwaWVudHNcbiAgICAgIC5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvci5wbHVzKGN1cnJlbnQuYW1vdW50KSwgbmV3IEJpZ051bWJlcigwKSlcbiAgICAgIC50b1N0cmluZygpO1xuICB9XG59XG4iXX0=
|
package/dist/src/lib/utils.d.ts
CHANGED
|
@@ -1,23 +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;
|
|
16
|
-
|
|
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
|
+
*/
|
|
17
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
|
+
*/
|
|
18
104
|
getAddressFromPublicKey(publicKey: string): string;
|
|
19
|
-
isValidRawTransaction(rawTransaction: string | Uint8Array): boolean;
|
|
20
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
|
+
*/
|
|
21
119
|
declare const utils: Utils;
|
|
22
120
|
export default utils;
|
|
23
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"}
|