@bitgo-beta/sdk-coin-iota 1.0.1-beta.324 → 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.
Files changed (42) hide show
  1. package/dist/src/iota.d.ts +123 -27
  2. package/dist/src/iota.d.ts.map +1 -1
  3. package/dist/src/iota.js +217 -103
  4. package/dist/src/lib/constants.d.ts +50 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +68 -4
  7. package/dist/src/lib/iface.d.ts +141 -1
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -1
  10. package/dist/src/lib/keyPair.d.ts +100 -6
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +103 -10
  13. package/dist/src/lib/transaction.d.ts +117 -14
  14. package/dist/src/lib/transaction.d.ts.map +1 -1
  15. package/dist/src/lib/transaction.js +190 -67
  16. package/dist/src/lib/transactionBuilder.d.ts +73 -34
  17. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  18. package/dist/src/lib/transactionBuilder.js +90 -45
  19. package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
  20. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  21. package/dist/src/lib/transactionBuilderFactory.js +103 -16
  22. package/dist/src/lib/transferBuilder.d.ts +43 -0
  23. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/transferBuilder.js +50 -5
  25. package/dist/src/lib/transferTransaction.d.ts +93 -2
  26. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  27. package/dist/src/lib/transferTransaction.js +180 -51
  28. package/dist/src/lib/utils.d.ts +107 -8
  29. package/dist/src/lib/utils.d.ts.map +1 -1
  30. package/dist/src/lib/utils.js +134 -23
  31. package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
  32. package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
  33. package/dist/test/unit/helpers/testHelpers.js +176 -0
  34. package/dist/test/unit/iota.js +47 -152
  35. package/dist/test/unit/keyPair.js +34 -61
  36. package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
  37. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -108
  38. package/dist/test/unit/transactionBuilder/transferBuilder.js +296 -762
  39. package/dist/test/unit/transferTransaction.js +106 -353
  40. package/dist/test/unit/utils.js +171 -197
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +7 -7
package/dist/src/iota.js CHANGED
@@ -45,6 +45,10 @@ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
45
45
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
46
46
  const _ = __importStar(require("lodash"));
47
47
  const transferTransaction_1 = require("./lib/transferTransaction");
48
+ /**
49
+ * IOTA coin implementation.
50
+ * Supports TSS (Threshold Signature Scheme) with EDDSA algorithm.
51
+ */
48
52
  class Iota extends sdk_core_1.BaseCoin {
49
53
  constructor(bitgo, staticsCoin) {
50
54
  super(bitgo);
@@ -53,9 +57,15 @@ class Iota extends sdk_core_1.BaseCoin {
53
57
  }
54
58
  this._staticsCoin = staticsCoin;
55
59
  }
60
+ /**
61
+ * Factory method to create an IOTA coin instance.
62
+ */
56
63
  static createInstance(bitgo, staticsCoin) {
57
64
  return new Iota(bitgo, staticsCoin);
58
65
  }
66
+ // ========================================
67
+ // Coin Configuration Methods
68
+ // ========================================
59
69
  getBaseFactor() {
60
70
  return Math.pow(10, this._staticsCoin.decimalPlaces);
61
71
  }
@@ -68,130 +78,100 @@ class Iota extends sdk_core_1.BaseCoin {
68
78
  getFullName() {
69
79
  return this._staticsCoin.fullName;
70
80
  }
71
- /** @inheritDoc */
81
+ // ========================================
82
+ // Multi-Signature and TSS Support
83
+ // ========================================
72
84
  supportsTss() {
73
85
  return true;
74
86
  }
75
- /** inherited doc */
76
87
  getDefaultMultisigType() {
77
88
  return sdk_core_1.multisigTypes.tss;
78
89
  }
79
90
  getMPCAlgorithm() {
80
91
  return sdk_core_1.MPCType.EDDSA;
81
92
  }
93
+ // ========================================
94
+ // Address and Public Key Validation
95
+ // ========================================
82
96
  /**
83
- * Check if an address is valid
84
- * @param address the address to be validated
97
+ * Validates an IOTA address.
98
+ * @param address - The address to validate (64-character hex string)
85
99
  * @returns true if the address is valid
86
100
  */
87
101
  isValidAddress(address) {
88
- // IOTA addresses are 64-character hex strings
89
102
  return utils_1.default.isValidAddress(address);
90
103
  }
91
104
  /**
92
- * @inheritDoc
105
+ * Validates a public key.
106
+ * @param pub - The public key to validate
107
+ * @returns true if the public key is valid
108
+ */
109
+ isValidPub(pub) {
110
+ return utils_1.default.isValidPublicKey(pub);
111
+ }
112
+ /**
113
+ * Verifies if an address belongs to a TSS wallet.
114
+ * @param params - Verification parameters including wallet address and user/backup public keys
115
+ * @returns true if the address belongs to the wallet
116
+ */
117
+ async isWalletAddress(params) {
118
+ return (0, sdk_core_1.verifyEddsaTssWalletAddress)(params, (address) => this.isValidAddress(address), (publicKey) => utils_1.default.getAddressFromPublicKey(publicKey));
119
+ }
120
+ // ========================================
121
+ // Transaction Explanation and Verification
122
+ // ========================================
123
+ /**
124
+ * Explains a transaction by parsing its hex representation.
125
+ * @param params - Parameters containing the transaction hex
126
+ * @returns Detailed explanation of the transaction
127
+ * @throws Error if txHex is missing or transaction cannot be explained
93
128
  */
94
129
  async explainTransaction(params) {
95
- const rawTx = params.txHex;
96
- if (!rawTx) {
97
- throw new Error('missing required tx prebuild property txHex');
98
- }
130
+ const rawTx = this.validateAndExtractTxHex(params.txHex, 'explain');
99
131
  const transaction = await this.rebuildTransaction(rawTx);
100
- if (!transaction) {
101
- throw new Error('failed to explain transaction');
102
- }
103
132
  return transaction.explainTransaction();
104
133
  }
105
134
  /**
106
- * Verifies that a transaction prebuild complies with the original intention
107
- * @param params
135
+ * Verifies that a transaction prebuild matches the original transaction parameters.
136
+ * Ensures recipients and amounts align with the intended transaction.
137
+ *
138
+ * @param params - Verification parameters containing prebuild and original params
139
+ * @returns true if verification succeeds
140
+ * @throws Error if verification fails
108
141
  */
109
142
  async verifyTransaction(params) {
110
- const { txPrebuild: txPrebuild, txParams: txParams } = params;
111
- const rawTx = txPrebuild.txHex;
112
- if (!rawTx) {
113
- throw new Error('missing required tx prebuild property txHex');
114
- }
143
+ const { txPrebuild, txParams } = params;
144
+ const rawTx = this.validateAndExtractTxHex(txPrebuild.txHex, 'verify');
115
145
  const transaction = await this.rebuildTransaction(rawTx);
116
- if (!transaction) {
117
- throw new Error('failed to verify transaction');
118
- }
146
+ this.validateTransactionType(transaction);
119
147
  if (txParams.recipients !== undefined) {
120
- if (!(transaction instanceof transferTransaction_1.TransferTransaction)) {
121
- throw new Error('Tx not a transfer transaction');
122
- }
123
- const txData = transaction.toJson();
124
- if (!txData.recipients) {
125
- throw new Error('Tx recipients does not match with expected txParams recipients');
126
- }
127
- const normalizeRecipient = (recipient) => _.pick(recipient, ['address', 'amount', 'tokenName']);
128
- const txDataRecipients = txData.recipients.map(normalizeRecipient);
129
- const txParamsRecipients = txParams.recipients.map(normalizeRecipient);
130
- const allRecipientsMatch = txParamsRecipients.every((expectedRecipient) => txDataRecipients.some((actualRecipient) => _.isEqual(expectedRecipient, actualRecipient)));
131
- if (!allRecipientsMatch) {
132
- throw new Error('Tx recipients does not match with expected txParams recipients');
133
- }
148
+ this.verifyTransactionRecipients(transaction, txParams.recipients);
134
149
  }
135
150
  return true;
136
151
  }
137
152
  /**
138
- * Check if an address belongs to a wallet
139
- * @param params
140
- */
141
- async isWalletAddress(params) {
142
- return (0, sdk_core_1.verifyEddsaTssWalletAddress)(params, (address) => this.isValidAddress(address), (publicKey) => utils_1.default.getAddressFromPublicKey(publicKey));
143
- }
144
- /**
145
- * Parse a transaction
146
- * @param params
153
+ * Parses a transaction and extracts inputs, outputs, and fees.
154
+ * @param params - Parameters containing the transaction hex
155
+ * @returns Parsed transaction with inputs, outputs, and fee information
147
156
  */
148
157
  async parseTransaction(params) {
149
158
  const transactionExplanation = await this.explainTransaction({ txHex: params.txHex });
150
- if (!transactionExplanation) {
151
- throw new Error('Invalid transaction');
152
- }
153
- let fee = new bignumber_js_1.default(0);
154
- if (transactionExplanation.outputs.length <= 0) {
155
- return {
156
- inputs: [],
157
- outputs: [],
158
- fee,
159
- };
160
- }
161
- const senderAddress = transactionExplanation.outputs[0].address;
162
- if (transactionExplanation.fee.fee !== '') {
163
- fee = new bignumber_js_1.default(transactionExplanation.fee.fee);
159
+ if (!transactionExplanation || transactionExplanation.outputs.length === 0) {
160
+ return this.createEmptyParsedTransaction();
164
161
  }
165
- const outputAmount = transactionExplanation.sponsor
166
- ? new bignumber_js_1.default(transactionExplanation.outputAmount).toFixed()
167
- : new bignumber_js_1.default(transactionExplanation.outputAmount).plus(fee).toFixed(); // assume 1 sender, who is also the fee payer
168
- const inputs = [
169
- {
170
- address: senderAddress,
171
- amount: outputAmount,
172
- },
173
- ];
174
- if (transactionExplanation.sponsor) {
175
- inputs.push({
176
- address: transactionExplanation.sponsor,
177
- amount: fee.toFixed(),
178
- });
179
- }
180
- const outputs = transactionExplanation.outputs.map((output) => {
181
- return {
182
- address: output.address,
183
- amount: new bignumber_js_1.default(output.amount).toFixed(),
184
- };
185
- });
186
- return {
187
- inputs,
188
- outputs,
189
- fee,
190
- };
162
+ const fee = this.calculateTransactionFee(transactionExplanation);
163
+ const inputs = this.buildTransactionInputs(transactionExplanation, fee);
164
+ const outputs = this.buildTransactionOutputs(transactionExplanation);
165
+ return { inputs, outputs, fee };
191
166
  }
167
+ // ========================================
168
+ // Key Generation and Signing
169
+ // ========================================
192
170
  /**
193
- * Generate a key pair
194
- * @param seed Optional seed to generate key pair from
171
+ * Generates a key pair for IOTA transactions.
172
+ * @param seed - Optional seed to generate deterministic key pair
173
+ * @returns Key pair with public and private keys
174
+ * @throws Error if private key generation fails
195
175
  */
196
176
  generateKeyPair(seed) {
197
177
  const keyPair = seed ? new lib_1.KeyPair({ seed }) : new lib_1.KeyPair();
@@ -205,22 +185,16 @@ class Iota extends sdk_core_1.BaseCoin {
205
185
  };
206
186
  }
207
187
  /**
208
- * Check if a public key is valid
209
- * @param pub Public key to check
210
- */
211
- isValidPub(pub) {
212
- return utils_1.default.isValidPublicKey(pub);
213
- }
214
- /**
215
- * Sign a transaction
216
- * @param params
188
+ * Signs a transaction (not implemented for IOTA).
189
+ * IOTA transactions are signed externally using TSS.
217
190
  */
218
191
  async signTransaction(params) {
219
192
  throw new Error('Method not implemented.');
220
193
  }
221
194
  /**
222
- * Audit a decrypted private key to ensure it's valid
223
- * @param params
195
+ * Audits a decrypted private key to ensure it's valid for the given public key.
196
+ * @param params - Parameters containing multiSigType, private key, and public key
197
+ * @throws Error if multiSigType is not TSS or if key validation fails
224
198
  */
225
199
  auditDecryptedKey({ multiSigType, prv, publicKey }) {
226
200
  if (multiSigType !== sdk_core_1.multisigTypes.tss) {
@@ -228,18 +202,158 @@ class Iota extends sdk_core_1.BaseCoin {
228
202
  }
229
203
  (0, sdk_lib_mpc_1.auditEddsaPrivateKey)(prv, publicKey ?? '');
230
204
  }
231
- /** @inheritDoc */
205
+ /**
206
+ * Extracts the signable payload from a serialized transaction.
207
+ * @param serializedTx - The serialized transaction hex
208
+ * @returns Buffer containing the signable payload
209
+ */
232
210
  async getSignablePayload(serializedTx) {
233
211
  const rebuiltTransaction = await this.rebuildTransaction(serializedTx);
234
212
  return rebuiltTransaction.signablePayload;
235
213
  }
236
- /** inherited doc */
214
+ /**
215
+ * Sets coin-specific fields in the transaction intent.
216
+ * @param intent - The populated intent object to modify
217
+ * @param params - Parameters containing unspents data
218
+ */
237
219
  setCoinSpecificFieldsInIntent(intent, params) {
238
220
  intent.unspents = params.unspents;
239
221
  }
222
+ // ========================================
223
+ // Private Helper Methods
224
+ // ========================================
225
+ /**
226
+ * Validates and extracts transaction hex from parameters.
227
+ * @param txHex - The transaction hex to validate
228
+ * @param operation - The operation being performed (for error messages)
229
+ * @returns The validated transaction hex
230
+ * @throws Error if txHex is missing
231
+ */
232
+ validateAndExtractTxHex(txHex, operation) {
233
+ if (!txHex) {
234
+ throw new Error(`missing required tx prebuild property txHex for ${operation} operation`);
235
+ }
236
+ return txHex;
237
+ }
238
+ /**
239
+ * Validates that the transaction is a TransferTransaction.
240
+ * @param transaction - The transaction to validate
241
+ * @throws Error if transaction is not a TransferTransaction
242
+ */
243
+ validateTransactionType(transaction) {
244
+ if (!(transaction instanceof transferTransaction_1.TransferTransaction)) {
245
+ throw new Error('Tx not a transfer transaction');
246
+ }
247
+ }
248
+ /**
249
+ * Verifies that transaction recipients match the expected recipients.
250
+ * @param transaction - The transfer transaction to verify
251
+ * @param expectedRecipients - The expected recipients from transaction params
252
+ * @throws Error if recipients don't match
253
+ */
254
+ verifyTransactionRecipients(transaction, expectedRecipients) {
255
+ const txData = transaction.toJson();
256
+ if (!txData.recipients) {
257
+ throw new Error('Tx recipients does not match with expected txParams recipients');
258
+ }
259
+ const actualRecipients = this.normalizeRecipients(txData.recipients);
260
+ const expected = this.normalizeRecipients(expectedRecipients);
261
+ if (!this.recipientsMatch(expected, actualRecipients)) {
262
+ throw new Error('Tx recipients does not match with expected txParams recipients');
263
+ }
264
+ }
265
+ /**
266
+ * Normalizes recipients by extracting only relevant fields.
267
+ * @param recipients - Recipients to normalize
268
+ * @returns Normalized recipients with address, amount, and tokenName only
269
+ */
270
+ normalizeRecipients(recipients) {
271
+ return recipients.map((recipient) => _.pick(recipient, ['address', 'amount', 'tokenName']));
272
+ }
273
+ /**
274
+ * Checks if expected recipients match actual recipients.
275
+ * @param expected - Expected recipients
276
+ * @param actual - Actual recipients from transaction
277
+ * @returns true if all expected recipients are found in actual recipients
278
+ */
279
+ recipientsMatch(expected, actual) {
280
+ return expected.every((expectedRecipient) => actual.some((actualRecipient) => _.isEqual(expectedRecipient, actualRecipient)));
281
+ }
282
+ /**
283
+ * Creates an empty parsed transaction result.
284
+ * Used when transaction has no outputs.
285
+ */
286
+ createEmptyParsedTransaction() {
287
+ return {
288
+ inputs: [],
289
+ outputs: [],
290
+ fee: new bignumber_js_1.default(0),
291
+ };
292
+ }
293
+ /**
294
+ * Calculates the transaction fee from the explanation.
295
+ * @param explanation - The transaction explanation
296
+ * @returns The fee as a BigNumber
297
+ */
298
+ calculateTransactionFee(explanation) {
299
+ if (explanation.fee.fee === '') {
300
+ return new bignumber_js_1.default(0);
301
+ }
302
+ return new bignumber_js_1.default(explanation.fee.fee);
303
+ }
304
+ /**
305
+ * Builds the inputs array for a parsed transaction.
306
+ * Includes sender input and optionally sponsor input if present.
307
+ *
308
+ * @param explanation - The transaction explanation
309
+ * @param fee - The calculated transaction fee
310
+ * @returns Array of transaction inputs
311
+ */
312
+ buildTransactionInputs(explanation, fee) {
313
+ const senderAddress = explanation.outputs[0].address;
314
+ const outputAmount = new bignumber_js_1.default(explanation.outputAmount);
315
+ // If there's a sponsor, sender only pays for outputs
316
+ // Otherwise, sender pays for outputs + fee
317
+ const senderAmount = explanation.sponsor ? outputAmount.toFixed() : outputAmount.plus(fee).toFixed();
318
+ const inputs = [
319
+ {
320
+ address: senderAddress,
321
+ amount: senderAmount,
322
+ },
323
+ ];
324
+ // Add sponsor input if present
325
+ if (explanation.sponsor) {
326
+ inputs.push({
327
+ address: explanation.sponsor,
328
+ amount: fee.toFixed(),
329
+ });
330
+ }
331
+ return inputs;
332
+ }
333
+ /**
334
+ * Builds the outputs array for a parsed transaction.
335
+ * @param explanation - The transaction explanation
336
+ * @returns Array of transaction outputs
337
+ */
338
+ buildTransactionOutputs(explanation) {
339
+ return explanation.outputs.map((output) => ({
340
+ address: output.address,
341
+ amount: new bignumber_js_1.default(output.amount).toFixed(),
342
+ }));
343
+ }
344
+ /**
345
+ * Creates a transaction builder factory instance.
346
+ * @returns TransactionBuilderFactory for this coin
347
+ */
240
348
  getTxBuilderFactory() {
241
349
  return new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
242
350
  }
351
+ /**
352
+ * Rebuilds a transaction from its hex representation.
353
+ * @param txHex - The transaction hex to rebuild
354
+ * @returns The rebuilt transaction
355
+ * @throws Error if transaction cannot be rebuilt
356
+ */
243
357
  async rebuildTransaction(txHex) {
244
358
  const txBuilderFactory = this.getTxBuilderFactory();
245
359
  try {
@@ -247,9 +361,9 @@ class Iota extends sdk_core_1.BaseCoin {
247
361
  return (await txBuilder.build());
248
362
  }
249
363
  catch (err) {
250
- throw new Error(`Failed to rebuild transaction ${err.toString()}`);
364
+ throw new Error(`Failed to rebuild transaction: ${err.toString()}`);
251
365
  }
252
366
  }
253
367
  }
254
368
  exports.Iota = Iota;
255
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQWtCOEI7QUFDOUIsaURBQXFGO0FBQ3JGLHdEQUFnQztBQUNoQywrQkFBdUY7QUFDdkYseURBQStEO0FBQy9ELGdFQUFxQztBQUNyQywwQ0FBNEI7QUFPNUIsbUVBQWdFO0FBRWhFLE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBR2hDLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFF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QUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQWE7UUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0MsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFnQixDQUFDO1FBQ2xELENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBM1BELG9CQTJQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBLZXlQYWlyLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBNUENBbGdvcml0aG0sXG4gIFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBNUENUeXBlLFxuICBQb3B1bGF0ZWRJbnRlbnQsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBDb2luRmFtaWx5LCBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSW90YUtleVBhaXIsIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHsgYXVkaXRFZGRzYVByaXZhdGVLZXkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstbGliLW1wYyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zLFxuICBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyVHhEYXRhLFxufSBmcm9tICcuL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBJb3RhKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIGdldENoYWluKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IENvaW5GYW1pbHkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMudHNzO1xuICB9XG5cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuIE1QQ1R5cGUuRUREU0E7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYWRkcmVzcyBpcyB2YWxpZFxuICAgKiBAcGFyYW0gYWRkcmVzcyB0aGUgYWRkcmVzcyB0byBiZSB2YWxpZGF0ZWRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gSU9UQSBhZGRyZXNzZXMgYXJlIDY0LWNoYXJhY3RlciBoZXggc3RyaW5nc1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHJhd1R4ID0gcGFyYW1zLnR4SGV4O1xuICAgIGlmICghcmF3VHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH1cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBleHBsYWluIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgY29tcGxpZXMgd2l0aCB0aGUgb3JpZ2luYWwgaW50ZW50aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFByZWJ1aWxkOiB0eFByZWJ1aWxkLCB0eFBhcmFtczogdHhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCFyYXdUeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIGlmICghdHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHZlcmlmeSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoISh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zZmVyVHJhbnNhY3Rpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHggbm90IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHR4RGF0YSA9IHRyYW5zYWN0aW9uLnRvSnNvbigpIGFzIFRyYW5zZmVyVHhEYXRhO1xuXG4gICAgICBpZiAoIXR4RGF0YS5yZWNpcGllbnRzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplUmVjaXBpZW50ID0gKHJlY2lwaWVudDogVHJhbnNhY3Rpb25SZWNpcGllbnQpID0+XG4gICAgICAgIF8ucGljayhyZWNpcGllbnQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pO1xuICAgICAgY29uc3QgdHhEYXRhUmVjaXBpZW50cyA9IHR4RGF0YS5yZWNpcGllbnRzLm1hcChub3JtYWxpemVSZWNpcGllbnQpO1xuICAgICAgY29uc3QgdHhQYXJhbXNSZWNpcGllbnRzID0gdHhQYXJhbXMucmVjaXBpZW50cy5tYXAobm9ybWFsaXplUmVjaXBpZW50KTtcblxuICAgICAgY29uc3QgYWxsUmVjaXBpZW50c01hdGNoID0gdHhQYXJhbXNSZWNpcGllbnRzLmV2ZXJ5KChleHBlY3RlZFJlY2lwaWVudCkgPT5cbiAgICAgICAgdHhEYXRhUmVjaXBpZW50cy5zb21lKChhY3R1YWxSZWNpcGllbnQpID0+IF8uaXNFcXVhbChleHBlY3RlZFJlY2lwaWVudCwgYWN0dWFsUmVjaXBpZW50KSlcbiAgICAgICk7XG5cbiAgICAgIGlmICghYWxsUmVjaXBpZW50c01hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYWRkcmVzcyBiZWxvbmdzIHRvIGEgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyhcbiAgICAgIHBhcmFtcyxcbiAgICAgIChhZGRyZXNzKSA9PiB0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLFxuICAgICAgKHB1YmxpY0tleSkgPT4gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkocHVibGljS2V5KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogSW90YVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24gPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiBwYXJhbXMudHhIZXggfSk7XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uRXhwbGFuYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGxldCBmZWUgPSBuZXcgQmlnTnVtYmVyKDApO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggPD0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGZlZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzO1xuICAgIGlmICh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLmZlZS5mZWUgIT09ICcnKSB7XG4gICAgICBmZWUgPSBuZXcgQmlnTnVtYmVyKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uZmVlLmZlZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5zcG9uc29yXG4gICAgICA/IG5ldyBCaWdOdW1iZXIodHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5vdXRwdXRBbW91bnQpLnRvRml4ZWQoKVxuICAgICAgOiBuZXcgQmlnTnVtYmVyKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0QW1vdW50KS5wbHVzKGZlZSkudG9GaXhlZCgpOyAvLyBhc3N1bWUgMSBzZW5kZXIsIHdobyBpcyBhbHNvIHRoZSBmZWUgcGF5ZXJcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBvdXRwdXRBbW91bnQsXG4gICAgICB9LFxuICAgIF07XG4gICAgaWYgKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uc3BvbnNvcikge1xuICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLnNwb25zb3IsXG4gICAgICAgIGFtb3VudDogZmVlLnRvRml4ZWQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHM6IHtcbiAgICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICAgIGFtb3VudDogc3RyaW5nO1xuICAgIH1bXSA9IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KS50b0ZpeGVkKCksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBmZWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIGtleSBwYWlyXG4gICAqIEBwYXJhbSBzZWVkIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUga2V5IHBhaXIgZnJvbVxuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqIEBwYXJhbSBwdWIgUHVibGljIGtleSB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGl0IGEgZGVjcnlwdGVkIHByaXZhdGUga2V5IHRvIGVuc3VyZSBpdCdzIHZhbGlkXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXN5bmMgZ2V0U2lnbmFibGVQYXlsb2FkKHNlcmlhbGl6ZWRUeDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpO1xuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgc2V0Q29pblNwZWNpZmljRmllbGRzSW5JbnRlbnQoaW50ZW50OiBQb3B1bGF0ZWRJbnRlbnQsIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zKTogdm9pZCB7XG4gICAgaW50ZW50LnVuc3BlbnRzID0gcGFyYW1zLnVuc3BlbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUeEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRUcmFuc2FjdGlvbih0eEhleDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4QnVpbGRlckZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHhCdWlsZGVyRmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICAgIHJldHVybiAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVidWlsZCB0cmFuc2FjdGlvbiAke2Vyci50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxufVxuIl19
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQWtCOEI7QUFDOUIsaURBQXFGO0FBQ3JGLHdEQUFnQztBQUNoQywrQkFBdUY7QUFDdkYseURBQStEO0FBQy9ELGdFQUFxQztBQUNyQywwQ0FBNEI7QUFPNUIsbUVBQWdFO0FBRWhFOzs7R0FHRztBQUNILE1BQWEsSUFBSyxTQUFRLG1CQUFRO0lBR2hDLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsNkJBQTZCO0lBQzdCLDJDQUEyQztJQUUzQyxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BD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QUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBYTtRQUM1QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxPQUFPLENBQUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQWdCLENBQUM7UUFDbEQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFuWUQsb0JBbVlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXVkaXREZWNyeXB0ZWRLZXlQYXJhbXMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEtleVBhaXIsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIE1QQ0FsZ29yaXRobSxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIE1QQ1R5cGUsXG4gIFBvcHVsYXRlZEludGVudCxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBJb3RhS2V5UGFpciwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBhdWRpdEVkZHNhUHJpdmF0ZUtleSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIElvdGFQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVHJhbnNmZXJUeERhdGEsXG59IGZyb20gJy4vbGliL2lmYWNlJztcbmltcG9ydCB7IFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuL2xpYi90cmFuc2ZlclRyYW5zYWN0aW9uJztcblxuLyoqXG4gKiBJT1RBIGNvaW4gaW1wbGVtZW50YXRpb24uXG4gKiBTdXBwb3J0cyBUU1MgKFRocmVzaG9sZCBTaWduYXR1cmUgU2NoZW1lKSB3aXRoIEVERFNBIGFsZ29yaXRobS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvdGEgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBJT1RBIGNvaW4gaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgSW90YShiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb2luIENvbmZpZ3VyYXRpb24gTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IENvaW5GYW1pbHkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTXVsdGktU2lnbmF0dXJlIGFuZCBUU1MgU3VwcG9ydFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMudHNzO1xuICB9XG5cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuIE1QQ1R5cGUuRUREU0E7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkZHJlc3MgYW5kIFB1YmxpYyBLZXkgVmFsaWRhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBJT1RBIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gdmFsaWRhdGUgKDY0LWNoYXJhY3RlciBoZXggc3RyaW5nKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgcHVibGljIGtleS5cbiAgICogQHBhcmFtIHB1YiAtIFRoZSBwdWJsaWMga2V5IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHB1YmxpYyBrZXkgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIGFuIGFkZHJlc3MgYmVsb25ncyB0byBhIFRTUyB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBWZXJpZmljYXRpb24gcGFyYW1ldGVycyBpbmNsdWRpbmcgd2FsbGV0IGFkZHJlc3MgYW5kIHVzZXIvYmFja3VwIHB1YmxpYyBrZXlzXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgYmVsb25ncyB0byB0aGUgd2FsbGV0XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICBwYXJhbXMsXG4gICAgICAoYWRkcmVzcykgPT4gdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSxcbiAgICAgIChwdWJsaWNLZXkpID0+IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUcmFuc2FjdGlvbiBFeHBsYW5hdGlvbiBhbmQgVmVyaWZpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwbGFpbnMgYSB0cmFuc2FjdGlvbiBieSBwYXJzaW5nIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBEZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0eEhleCBpcyBtaXNzaW5nIG9yIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSBleHBsYWluZWRcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgocGFyYW1zLnR4SGV4LCAnZXhwbGFpbicpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gcGFyYW1ldGVycy5cbiAgICogRW5zdXJlcyByZWNpcGllbnRzIGFuZCBhbW91bnRzIGFsaWduIHdpdGggdGhlIGludGVuZGVkIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgY29udGFpbmluZyBwcmVidWlsZCBhbmQgb3JpZ2luYWwgcGFyYW1zXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmVyaWZpY2F0aW9uIGZhaWxzXG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgdHhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhQcmVidWlsZC50eEhleCwgJ3ZlcmlmeScpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgdGhpcy52YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbik7XG5cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyh0cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uLCB0eFBhcmFtcy5yZWNpcGllbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0cmFuc2FjdGlvbiBhbmQgZXh0cmFjdHMgaW5wdXRzLCBvdXRwdXRzLCBhbmQgZmVlcy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEByZXR1cm5zIFBhcnNlZCB0cmFuc2FjdGlvbiB3aXRoIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IElvdGFQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogcGFyYW1zLnR4SGV4IH0pO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbkV4cGxhbmF0aW9uIHx8IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWUgPSB0aGlzLmNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuYnVpbGRUcmFuc2FjdGlvbklucHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBmZWUpO1xuICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25PdXRwdXRzKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuXG4gICAgcmV0dXJuIHsgaW5wdXRzLCBvdXRwdXRzLCBmZWUgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gS2V5IEdlbmVyYXRpb24gYW5kIFNpZ25pbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBrZXkgcGFpciBmb3IgSU9UQSB0cmFuc2FjdGlvbnMuXG4gICAqIEBwYXJhbSBzZWVkIC0gT3B0aW9uYWwgc2VlZCB0byBnZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGtleSBwYWlyXG4gICAqIEByZXR1cm5zIEtleSBwYWlyIHdpdGggcHVibGljIGFuZCBwcml2YXRlIGtleXNcbiAgICogQHRocm93cyBFcnJvciBpZiBwcml2YXRlIGtleSBnZW5lcmF0aW9uIGZhaWxzXG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IElvdGFLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBJb3RhS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcblxuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiAobm90IGltcGxlbWVudGVkIGZvciBJT1RBKS5cbiAgICogSU9UQSB0cmFuc2FjdGlvbnMgYXJlIHNpZ25lZCBleHRlcm5hbGx5IHVzaW5nIFRTUy5cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGl0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSB0byBlbnN1cmUgaXQncyB2YWxpZCBmb3IgdGhlIGdpdmVuIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgbXVsdGlTaWdUeXBlLCBwcml2YXRlIGtleSwgYW5kIHB1YmxpYyBrZXlcbiAgICogQHRocm93cyBFcnJvciBpZiBtdWx0aVNpZ1R5cGUgaXMgbm90IFRTUyBvciBpZiBrZXkgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHBydiwgcHVibGljS2V5IH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gbXVsdGlzaWdUeXBlcy50c3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgc2lnbmFibGUgcGF5bG9hZCBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHNlcmlhbGl6ZWRUeCAtIFRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmFibGUgcGF5bG9hZFxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmFibGVQYXlsb2FkKHNlcmlhbGl6ZWRUeDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpO1xuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByaXZhdGUgSGVscGVyIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGV4dHJhY3RzIHRyYW5zYWN0aW9uIGhleCBmcm9tIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZ1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEV4dHJhY3RUeEhleCh0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uYCk7XG4gICAgfVxuICAgIHJldHVybiB0eEhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgYSBUcmFuc2ZlclRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNhY3Rpb24gdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB0cmFuc2FjdGlvbiBpcyBub3QgYSBUcmFuc2ZlclRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICghKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNmZXJUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggbm90IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0cmFuc2FjdGlvbiByZWNpcGllbnRzIG1hdGNoIHRoZSBleHBlY3RlZCByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFJlY2lwaWVudHMgLSBUaGUgZXhwZWN0ZWQgcmVjaXBpZW50cyBmcm9tIHRyYW5zYWN0aW9uIHBhcmFtc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHJlY2lwaWVudHMgZG9uJ3QgbWF0Y2hcbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5VHJhbnNhY3Rpb25SZWNpcGllbnRzKFxuICAgIHRyYW5zYWN0aW9uOiBUcmFuc2ZlclRyYW5zYWN0aW9uLFxuICAgIGV4cGVjdGVkUmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSB0cmFuc2FjdGlvbi50b0pzb24oKSBhcyBUcmFuc2ZlclR4RGF0YTtcblxuICAgIGlmICghdHhEYXRhLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxSZWNpcGllbnRzID0gdGhpcy5ub3JtYWxpemVSZWNpcGllbnRzKHR4RGF0YS5yZWNpcGllbnRzKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyhleHBlY3RlZFJlY2lwaWVudHMpO1xuXG4gICAgaWYgKCF0aGlzLnJlY2lwaWVudHNNYXRjaChleHBlY3RlZCwgYWN0dWFsUmVjaXBpZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyByZWNpcGllbnRzIGJ5IGV4dHJhY3Rpbmcgb25seSByZWxldmFudCBmaWVsZHMuXG4gICAqIEBwYXJhbSByZWNpcGllbnRzIC0gUmVjaXBpZW50cyB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCByZWNpcGllbnRzIHdpdGggYWRkcmVzcywgYW1vdW50LCBhbmQgdG9rZW5OYW1lIG9ubHlcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplUmVjaXBpZW50cyhyZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSB7XG4gICAgcmV0dXJuIHJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IF8ucGljayhyZWNpcGllbnQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZXhwZWN0ZWQgcmVjaXBpZW50cyBtYXRjaCBhY3R1YWwgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIGV4cGVjdGVkIC0gRXhwZWN0ZWQgcmVjaXBpZW50c1xuICAgKiBAcGFyYW0gYWN0dWFsIC0gQWN0dWFsIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBleHBlY3RlZCByZWNpcGllbnRzIGFyZSBmb3VuZCBpbiBhY3R1YWwgcmVjaXBpZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQ6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10sIGFjdHVhbDogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleHBlY3RlZC5ldmVyeSgoZXhwZWN0ZWRSZWNpcGllbnQpID0+XG4gICAgICBhY3R1YWwuc29tZSgoYWN0dWFsUmVjaXBpZW50KSA9PiBfLmlzRXF1YWwoZXhwZWN0ZWRSZWNpcGllbnQsIGFjdHVhbFJlY2lwaWVudCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHBhcnNlZCB0cmFuc2FjdGlvbiByZXN1bHQuXG4gICAqIFVzZWQgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gb3V0cHV0cy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRW1wdHlQYXJzZWRUcmFuc2FjdGlvbigpOiBQYXJzZWRUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZTogbmV3IEJpZ051bWJlcigwKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBmcm9tIHRoZSBleHBsYW5hdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBmZWUgYXMgYSBCaWdOdW1iZXJcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVHJhbnNhY3Rpb25GZWUoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBCaWdOdW1iZXIge1xuICAgIGlmIChleHBsYW5hdGlvbi5mZWUuZmVlID09PSAnJykge1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKGV4cGxhbmF0aW9uLmZlZS5mZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgaW5wdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogSW5jbHVkZXMgc2VuZGVyIGlucHV0IGFuZCBvcHRpb25hbGx5IHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEBwYXJhbSBmZWUgLSBUaGUgY2FsY3VsYXRlZCB0cmFuc2FjdGlvbiBmZWVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gaW5wdXRzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVHJhbnNhY3Rpb25JbnB1dHMoXG4gICAgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gICAgZmVlOiBCaWdOdW1iZXJcbiAgKTogQXJyYXk8e1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICBhbW91bnQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3M7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBhIHNwb25zb3IsIHNlbmRlciBvbmx5IHBheXMgZm9yIG91dHB1dHNcbiAgICAvLyBPdGhlcndpc2UsIHNlbmRlciBwYXlzIGZvciBvdXRwdXRzICsgZmVlXG4gICAgY29uc3Qgc2VuZGVyQW1vdW50ID0gZXhwbGFuYXRpb24uc3BvbnNvciA/IG91dHB1dEFtb3VudC50b0ZpeGVkKCkgOiBvdXRwdXRBbW91bnQucGx1cyhmZWUpLnRvRml4ZWQoKTtcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBzZW5kZXJBbW91bnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICAvLyBBZGQgc3BvbnNvciBpbnB1dCBpZiBwcmVzZW50XG4gICAgaWYgKGV4cGxhbmF0aW9uLnNwb25zb3IpIHtcbiAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogZXhwbGFuYXRpb24uc3BvbnNvcixcbiAgICAgICAgYW1vdW50OiBmZWUudG9GaXhlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG91dHB1dHMgYXJyYXkgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gb3V0cHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uT3V0cHV0cyhleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICByZXR1cm4gZXhwbGFuYXRpb24ub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLnRvRml4ZWQoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmFjdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBmb3IgdGhpcyBjb2luXG4gICAqL1xuICBwcml2YXRlIGdldFR4QnVpbGRlckZhY3RvcnkoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkcyBhIHRyYW5zYWN0aW9uIGZyb20gaXRzIGhleCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCB0byByZWJ1aWxkXG4gICAqIEByZXR1cm5zIFRoZSByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gY2Fubm90IGJlIHJlYnVpbHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFRyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyRmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0eEJ1aWxkZXJGYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgcmV0dXJuIChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uOiAke2Vyci50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,12 +1,61 @@
1
+ /**
2
+ * Length of IOTA addresses in characters (excluding 0x prefix).
3
+ * IOTA uses 64-character hexadecimal addresses.
4
+ */
1
5
  export declare const IOTA_ADDRESS_LENGTH = 64;
6
+ /**
7
+ * Length of transaction digest in bytes.
8
+ * Used for transaction IDs and hashes.
9
+ */
2
10
  export declare const IOTA_TRANSACTION_DIGEST_LENGTH = 32;
11
+ /**
12
+ * Length of block digest in bytes.
13
+ * Used for block IDs and references.
14
+ */
3
15
  export declare const IOTA_BLOCK_DIGEST_LENGTH = 32;
16
+ /**
17
+ * Length of Ed25519 signatures in bytes.
18
+ * IOTA uses Ed25519 for transaction signing.
19
+ */
4
20
  export declare const IOTA_SIGNATURE_LENGTH = 64;
21
+ /**
22
+ * Length of Ed25519 public keys in bytes.
23
+ * Standard Ed25519 key size.
24
+ */
5
25
  export declare const IOTA_KEY_BYTES_LENGTH = 32;
26
+ /**
27
+ * Maximum number of input objects allowed in a single transaction.
28
+ * This limit ensures transactions can be processed efficiently by the network.
29
+ */
6
30
  export declare const MAX_INPUT_OBJECTS = 2048;
31
+ /**
32
+ * Maximum number of gas payment objects allowed per transaction.
33
+ * When exceeded, objects must be merged before the transaction can be built.
34
+ * This prevents transaction size from becoming too large.
35
+ */
7
36
  export declare const MAX_GAS_PAYMENT_OBJECTS = 256;
37
+ /**
38
+ * Maximum number of recipients in a transfer transaction.
39
+ * Limits the number of outputs to keep transaction size manageable.
40
+ */
41
+ export declare const MAX_RECIPIENTS = 256;
42
+ /**
43
+ * Maximum gas budget allowed for a transaction.
44
+ * Used for dry-run simulations to estimate gas costs.
45
+ * Set to a very high value (50 billion) to ensure simulation completes.
46
+ */
8
47
  export declare const MAX_GAS_BUDGET = 50000000000;
48
+ /**
49
+ * Maximum gas price for simulated transactions.
50
+ * Used when building dry-run transactions for gas estimation.
51
+ */
9
52
  export declare const MAX_GAS_PRICE = 100000;
10
- export declare const MAX_RECIPIENTS = 256;
53
+ /**
54
+ * Valid command types for transfer transactions.
55
+ * Transfer transactions can only contain these three command types:
56
+ * - SplitCoins: Split a coin into multiple coins with specified amounts
57
+ * - MergeCoins: Merge multiple coins into a single coin
58
+ * - TransferObjects: Transfer coins/objects to recipients
59
+ */
11
60
  export declare const TRANSFER_TRANSACTION_COMMANDS: string[];
12
61
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,cAAc,cAAc,CAAC;AAC1C,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,6BAA6B,UAAkD,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;;;GAGG;AACH,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAM3C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;;GAGG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAMxC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAMlC;;;;GAIG;AACH,eAAO,MAAM,cAAc,cAAc,CAAC;AAE1C;;;GAGG;AACH,eAAO,MAAM,aAAa,SAAS,CAAC;AAMpC;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,UAAkD,CAAC"}