@bitgo-beta/sdk-coin-iota 1.0.1-beta.323 → 1.0.1-beta.325
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 -70
- 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 +97 -1
- package/dist/src/lib/transferTransaction.d.ts.map +1 -1
- package/dist/src/lib/transferTransaction.js +223 -52
- 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 +334 -319
- 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,82 +113,232 @@ 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
|
+
return firstObject;
|
|
201
|
+
}
|
|
202
|
+
// Merge remaining objects into the first one
|
|
203
|
+
return this.mergeObjectsInBatches(firstObject, this.paymentObjects.slice(1), constants_1.MAX_INPUT_OBJECTS);
|
|
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 within the limit, no consolidation needed
|
|
215
|
+
if (this.gasPaymentObjects.length <= constants_1.MAX_GAS_PAYMENT_OBJECTS) {
|
|
216
|
+
return gasObject;
|
|
217
|
+
}
|
|
218
|
+
// Merge excess gas objects to stay within limits
|
|
219
|
+
return this.mergeObjectsInBatches(gasObject, this.gasPaymentObjects, constants_1.MAX_INPUT_OBJECTS);
|
|
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
|
+
*/
|
|
230
|
+
mergeObjectsInBatches(targetCoin, objectsToMerge, batchSize) {
|
|
231
|
+
let consolidatedCoin = targetCoin;
|
|
232
|
+
for (let startIndex = 0; startIndex < objectsToMerge.length; startIndex += batchSize) {
|
|
233
|
+
const batch = objectsToMerge.slice(startIndex, startIndex + batchSize);
|
|
234
|
+
const batchAsTransactionObjects = batch.map((obj) => this._iotaTransaction.object(transactions_1.Inputs.ObjectRef(obj)));
|
|
235
|
+
[consolidatedCoin] = this._iotaTransaction.mergeCoins(consolidatedCoin, batchAsTransactionObjects);
|
|
236
|
+
}
|
|
237
|
+
return consolidatedCoin;
|
|
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
|
+
*/
|
|
244
|
+
splitAndTransferToRecipients(sourceCoin) {
|
|
245
|
+
const recipientAmounts = this._recipients.map((recipient) => recipient.amount);
|
|
246
|
+
const splitCoins = this._iotaTransaction.splitCoins(sourceCoin, recipientAmounts);
|
|
247
|
+
this._recipients.forEach((recipient, index) => {
|
|
248
|
+
this._iotaTransaction.transferObjects([splitCoins[index]], recipient.address);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Validates all transfer transaction data before building.
|
|
253
|
+
* Checks recipients, payment objects, and ensures no duplicate object IDs.
|
|
254
|
+
*/
|
|
129
255
|
validateTxDataImplementation() {
|
|
130
|
-
|
|
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) {
|
|
131
265
|
throw new sdk_core_1.InvalidTransactionError('Transaction recipients are required');
|
|
132
266
|
}
|
|
133
267
|
if (this.recipients.length > constants_1.MAX_RECIPIENTS) {
|
|
134
268
|
throw new sdk_core_1.InvalidTransactionError(`Recipients count (${this.recipients.length}) exceeds maximum allowed (${constants_1.MAX_RECIPIENTS})`);
|
|
135
269
|
}
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
138
280
|
}
|
|
139
|
-
//
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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() {
|
|
297
|
+
const paymentObjectIds = this.paymentObjects?.map((obj) => obj.objectId) ?? [];
|
|
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}`);
|
|
156
319
|
}
|
|
157
320
|
}
|
|
158
321
|
/**
|
|
159
322
|
* @inheritDoc
|
|
323
|
+
* Provides a human-readable explanation of the transfer transaction.
|
|
160
324
|
*/
|
|
161
|
-
explainTransactionImplementation(
|
|
325
|
+
explainTransactionImplementation(_json, explanationResult) {
|
|
162
326
|
const outputs = this.recipients.map((recipient) => recipient);
|
|
163
|
-
const
|
|
164
|
-
const outputAmount = outputAmountBN.toString();
|
|
327
|
+
const outputAmount = this.calculateTotalOutputAmount();
|
|
165
328
|
return {
|
|
166
329
|
...explanationResult,
|
|
167
330
|
outputAmount,
|
|
168
331
|
outputs,
|
|
169
332
|
};
|
|
170
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
|
+
}
|
|
171
342
|
}
|
|
172
343
|
exports.TransferTransaction = TransferTransaction;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBNkc7QUFFN0csK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBK0Y7QUFDL0Ysb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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QixDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3BHLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLGtDQUF1QixDQUMvQiw2REFBNkQsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM3RyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxnQ0FBZ0MsQ0FDeEMsSUFBWSxFQUNaLGlCQUF5QztRQUV6QyxNQUFNLE9BQU8sR0FBMkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUMzQyxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUMxRCxJQUFJLHNCQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2pCLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0MsT0FBTztZQUNMLEdBQUcsaUJBQWlCO1lBQ3BCLFlBQVk7WUFDWixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5NRCxrREFtTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgdG9IZXgsIFRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCwgVHJhbnNmZXJUeERhdGEsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHtcbiAgSW5wdXRzIGFzIElvdGFJbnB1dHMsXG4gIFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQsXG4gIFRyYW5zYWN0aW9uIGFzIElvdGFUcmFuc2FjdGlvbixcbn0gZnJvbSAnQGlvdGEvaW90YS1zZGsvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IGZyb21CYXNlNjQgfSBmcm9tICdAaW90YS9pb3RhLXNkay91dGlscyc7XG5pbXBvcnQgeyBtZXNzYWdlV2l0aEludGVudCBhcyBpb3RhTWVzc2FnZVdpdGhJbnRlbnQgfSBmcm9tICdAaW90YS9pb3RhLXNkay9jcnlwdG9ncmFwaHknO1xuaW1wb3J0IHsgQmNzUmVhZGVyIH0gZnJvbSAnQGlvdGEvYmNzJztcbmltcG9ydCB7IE1BWF9JTlBVVF9PQkpFQ1RTLCBNQVhfUkVDSVBJRU5UUywgVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2ZlclRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIF9yZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdO1xuICBwcml2YXRlIF9wYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW107XG4gIH1cblxuICBnZXQgcmVjaXBpZW50cygpOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjaXBpZW50cztcbiAgfVxuXG4gIHNldCByZWNpcGllbnRzKHZhbHVlOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKSB7XG4gICAgdGhpcy5fcmVjaXBpZW50cyA9IHZhbHVlO1xuICAgIHRoaXMuX3JlYnVpbGRSZXF1aXJlZCA9IHRydWU7XG4gIH1cblxuICBnZXQgcGF5bWVudE9iamVjdHMoKTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF5bWVudE9iamVjdHM7XG4gIH1cblxuICBzZXQgcGF5bWVudE9iamVjdHModmFsdWU6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gdmFsdWU7XG4gICAgdGhpcy5fcmVidWlsZFJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWRkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lvdGFUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b3RhbEFtb3VudCA9IHRoaXMucmVjaXBpZW50cy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50KSA9PiBhY2N1bXVsYXRvciArIE51bWJlcihjdXJyZW50LmFtb3VudCksIDApO1xuICAgIHRoaXMuX291dHB1dHMgPSB0aGlzLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQsIGluZGV4KSA9PiAoe1xuICAgICAgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICB2YWx1ZTogcmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgIH0pKTtcbiAgICB0aGlzLl9pbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRoaXMuc2VuZGVyLFxuICAgICAgICB2YWx1ZTogdG90YWxBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgdG9Kc29uKCk6IFRyYW5zZmVyVHhEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIudG9Kc29uKCksXG4gICAgICByZWNpcGllbnRzOiB0aGlzLnJlY2lwaWVudHMsXG4gICAgICBwYXltZW50T2JqZWN0czogdGhpcy5wYXltZW50T2JqZWN0cyxcbiAgICB9O1xuICB9XG5cbiAgcGFyc2VGcm9tSlNPTih0eERhdGE6IFRyYW5zZmVyVHhEYXRhKTogdm9pZCB7XG4gICAgc3VwZXIucGFyc2VGcm9tSlNPTih0eERhdGEpO1xuICAgIHRoaXMucmVjaXBpZW50cyA9IHR4RGF0YS5yZWNpcGllbnRzO1xuICAgIHRoaXMucGF5bWVudE9iamVjdHMgPSB0eERhdGEucGF5bWVudE9iamVjdHM7XG4gICAgdGhpcy51cGRhdGVJc1NpbXVsYXRlVHgoKTtcbiAgfVxuXG4gIHBhcnNlRnJvbUJyb2FkY2FzdFR4KHR4OiBzdHJpbmcgfCBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gSW90YVRyYW5zYWN0aW9uLmZyb20odHgpLmdldERhdGEoKTtcbiAgICBpZiAodHhEYXRhLmNvbW1hbmRzLmZpbHRlcigoY29tbWFuZCkgPT4gIVRSQU5TRkVSX1RSQU5TQUNUSU9OX0NPTU1BTkRTLmluY2x1ZGVzKGNvbW1hbmQuJGtpbmQpKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbW1hbmRzIGluIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBzdXBlci5wYXJzZUZyb21Ccm9hZGNhc3RUeCh0eCk7XG4gICAgY29uc3QgaW5wdXRPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBbXTtcbiAgICBjb25zdCBhbW91bnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlY2VpdmVyczogc3RyaW5nW10gPSBbXTtcbiAgICB0eERhdGEuaW5wdXRzLmZvckVhY2goKGlucHV0KSA9PiB7XG4gICAgICBpZiAoaW5wdXQuJGtpbmQgPT09ICdPYmplY3QnICYmICdJbW1Pck93bmVkT2JqZWN0JyBpbiBpbnB1dC5PYmplY3QpIHtcbiAgICAgICAgaW5wdXRPYmplY3RzLnB1c2goaW5wdXQuT2JqZWN0LkltbU9yT3duZWRPYmplY3QgYXMgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5wdXQuJGtpbmQgPT09ICdQdXJlJyAmJiAnYnl0ZXMnIGluIGlucHV0LlB1cmUpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBmcm9tQmFzZTY0KGlucHV0LlB1cmUuYnl0ZXMpO1xuICAgICAgICBjb25zdCBoZXhWYWx1ZSA9ICcweCcgKyB0b0hleCh2YWx1ZSk7XG4gICAgICAgIGlmICh1dGlscy5pc1ZhbGlkQWRkcmVzcyhoZXhWYWx1ZSkpIHtcbiAgICAgICAgICByZWNlaXZlcnMucHVzaChoZXhWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW1vdW50cy5wdXNoKG5ldyBCY3NSZWFkZXIodmFsdWUpLnJlYWQ2NCgpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGFtb3VudHMubGVuZ3RoICE9PSByZWNlaXZlcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2NvdW50IG9mIGFtb3VudHMgZG9lcyBub3QgbWF0Y2ggY291bnQgb2YgcmVjZWl2ZXJzJyk7XG4gICAgfVxuICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gaW5wdXRPYmplY3RzO1xuICAgIHRoaXMucmVjaXBpZW50cyA9IFtdO1xuICAgIHJlY2VpdmVycy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9yZWNpcGllbnRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQsXG4gICAgICAgIGFtb3VudDogYW1vdW50c1tpbmRleF0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUlzU2ltdWxhdGVUeCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VXaXRoSW50ZW50KG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gaW90YU1lc3NhZ2VXaXRoSW50ZW50KCdUcmFuc2FjdGlvbkRhdGEnLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3B1bGF0ZVR4SW5wdXRzQW5kQ29tbWFuZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGF5bWVudE9iamVjdHMpIHtcbiAgICAgIGxldCBmaXJzdElucHV0T2JqOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50ID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChcbiAgICAgICAgSW90YUlucHV0cy5PYmplY3RSZWYodGhpcy5wYXltZW50T2JqZWN0c1swXSlcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGxldCBpZHggPSAxO1xuICAgICAgICB3aGlsZSAoaWR4IDwgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgICBbZmlyc3RJbnB1dE9ial0gPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24ubWVyZ2VDb2lucyhcbiAgICAgICAgICAgIGZpcnN0SW5wdXRPYmosXG4gICAgICAgICAgICB0aGlzLnBheW1lbnRPYmplY3RzXG4gICAgICAgICAgICAgIC5zbGljZShpZHgsIGlkeCArIE1BWF9JTlBVVF9PQkpFQ1RTKVxuICAgICAgICAgICAgICAubWFwKChpbnB1dCkgPT4gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZihpbnB1dCkpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWR4ICs9IE1BWF9JTlBVVF9PQkpFQ1RTO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvaW5zID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLnNwbGl0Q29pbnMoXG4gICAgICAgIGZpcnN0SW5wdXRPYmosXG4gICAgICAgIHRoaXMuX3JlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IHJlY2lwaWVudC5hbW91bnQpXG4gICAgICApO1xuICAgICAgdGhpcy5fcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQsIGlkeCkgPT4ge1xuICAgICAgICB0aGlzLl9pb3RhVHJhbnNhY3Rpb24udHJhbnNmZXJPYmplY3RzKFtjb2luc1tpZHhdXSwgcmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVHhEYXRhSW1wbGVtZW50YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlY2lwaWVudHMgfHwgdGhpcy5yZWNpcGllbnRzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gcmVjaXBpZW50cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZWNpcGllbnRzLmxlbmd0aCA+IE1BWF9SRUNJUElFTlRTKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBSZWNpcGllbnRzIGNvdW50ICgke3RoaXMucmVjaXBpZW50cy5sZW5ndGh9KSBleGNlZWRzIG1heGltdW0gYWxsb3dlZCAoJHtNQVhfUkVDSVBJRU5UU30pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucGF5bWVudE9iamVjdHMgfHwgdGhpcy5wYXltZW50T2JqZWN0cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIG9iamVjdCBJRHMgaW4gcGF5bWVudCBvYmplY3RzXG4gICAgY29uc3QgcGF5bWVudE9iamVjdElkcyA9IHRoaXMucGF5bWVudE9iamVjdHMubWFwKChvYmopID0+IG9iai5vYmplY3RJZCk7XG4gICAgY29uc3QgdW5pcXVlUGF5bWVudElkcyA9IG5ldyBTZXQocGF5bWVudE9iamVjdElkcyk7XG4gICAgaWYgKHVuaXF1ZVBheW1lbnRJZHMuc2l6ZSAhPT0gcGF5bWVudE9iamVjdElkcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRHVwbGljYXRlIG9iamVjdCBJRHMgZm91bmQgaW4gcGF5bWVudCBvYmplY3RzJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZ2FzUGF5bWVudE9iamVjdHMgJiYgdGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnYXNPYmplY3RJZHMgPSB0aGlzLmdhc1BheW1lbnRPYmplY3RzLm1hcCgoZ2FzKSA9PiBnYXMub2JqZWN0SWQpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIG9iamVjdCBJRHMgaW4gZ2FzIHBheW1lbnQgb2JqZWN0c1xuICAgICAgY29uc3QgdW5pcXVlR2FzSWRzID0gbmV3IFNldChnYXNPYmplY3RJZHMpO1xuICAgICAgaWYgKHVuaXF1ZUdhc0lkcy5zaXplICE9PSBnYXNPYmplY3RJZHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRHVwbGljYXRlIG9iamVjdCBJRHMgZm91bmQgaW4gZ2FzIHBheW1lbnQgb2JqZWN0cycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkdXBsaWNhdGVzID0gdGhpcy5wYXltZW50T2JqZWN0cy5maWx0ZXIoKHBheW1lbnQpID0+IGdhc09iamVjdElkcy5pbmNsdWRlcyhwYXltZW50Lm9iamVjdElkKSk7XG4gICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICAnUGF5bWVudCBvYmplY3RzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyBnYXMgcGF5bWVudCBvYmplY3RzOiAnICsgZHVwbGljYXRlcy5tYXAoKGQpID0+IGQub2JqZWN0SWQpLmpvaW4oJywgJylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByb3RlY3RlZCBleHBsYWluVHJhbnNhY3Rpb25JbXBsZW1lbnRhdGlvbihcbiAgICBqc29uOiBUeERhdGEsXG4gICAgZXhwbGFuYXRpb25SZXN1bHQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb25cbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IHRoaXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50KTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnRCTiA9IHRoaXMucmVjaXBpZW50cy5yZWR1Y2UoXG4gICAgICAoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGFjY3VtdWxhdG9yLnBsdXMoY3VycmVudC5hbW91bnQpLFxuICAgICAgbmV3IEJpZ051bWJlcigwKVxuICAgICk7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50Qk4udG9TdHJpbmcoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5leHBsYW5hdGlvblJlc3VsdCxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIG91dHB1dHMsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
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"}
|