@bitgo-beta/sdk-coin-flrp 1.0.1-beta.265 → 1.0.1-beta.267

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 (120) hide show
  1. package/dist/src/flrp.d.ts +6 -75
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +13 -298
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +50 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +163 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +36 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +128 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +47 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +213 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +23 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +101 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +34 -84
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +119 -288
  25. package/dist/src/lib/iface.d.ts +50 -51
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +22 -10
  28. package/dist/src/lib/index.d.ts +2 -3
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +5 -6
  31. package/dist/src/lib/keyPair.d.ts +1 -1
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +9 -5
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
  37. package/dist/src/lib/transaction.d.ts +8 -74
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +61 -210
  40. package/dist/src/lib/transactionBuilder.d.ts +56 -34
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilder.js +112 -69
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +27 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +69 -75
  46. package/dist/src/lib/utils.d.ts +58 -157
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +134 -399
  49. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  50. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  51. package/dist/test/resources/transactionData/exportInC.js +30 -0
  52. package/dist/test/unit/lib/exportInCTxBuilder.js +92 -513
  53. package/dist/tsconfig.tsbuildinfo +1 -1
  54. package/package.json +9 -11
  55. package/dist/src/iface.d.ts +0 -25
  56. package/dist/src/iface.d.ts.map +0 -1
  57. package/dist/src/iface.js +0 -3
  58. package/dist/src/lib/constants.d.ts +0 -170
  59. package/dist/src/lib/constants.d.ts.map +0 -1
  60. package/dist/src/lib/constants.js +0 -227
  61. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  62. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  63. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  64. package/dist/src/lib/errors.d.ts +0 -8
  65. package/dist/src/lib/errors.d.ts.map +0 -1
  66. package/dist/src/lib/errors.js +0 -19
  67. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  68. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  69. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  70. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  71. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  72. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  73. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  74. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  75. package/dist/src/lib/importInCTxBuilder.js +0 -403
  76. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  77. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  78. package/dist/src/lib/importInPTxBuilder.js +0 -464
  79. package/dist/src/lib/types.d.ts +0 -78
  80. package/dist/src/lib/types.d.ts.map +0 -1
  81. package/dist/src/lib/types.js +0 -5
  82. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  83. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  84. package/dist/src/lib/validatorTxBuilder.js +0 -180
  85. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  86. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  87. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  88. package/dist/test/unit/flrp.d.ts +0 -2
  89. package/dist/test/unit/flrp.d.ts.map +0 -1
  90. package/dist/test/unit/flrp.js +0 -118
  91. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  92. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  93. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  94. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +0 -2
  95. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
  96. package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
  97. package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
  98. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
  99. package/dist/test/unit/lib/importInCTxBuilder.js +0 -258
  100. package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
  101. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
  102. package/dist/test/unit/lib/importInPTxBuilder.js +0 -501
  103. package/dist/test/unit/lib/transaction.d.ts +0 -2
  104. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  105. package/dist/test/unit/lib/transaction.js +0 -460
  106. package/dist/test/unit/lib/utils.d.ts +0 -2
  107. package/dist/test/unit/lib/utils.d.ts.map +0 -1
  108. package/dist/test/unit/lib/utils.js +0 -365
  109. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  110. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  111. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  112. package/dist/test/unit/smoke.d.ts +0 -2
  113. package/dist/test/unit/smoke.d.ts.map +0 -1
  114. package/dist/test/unit/smoke.js +0 -23
  115. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  116. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  117. package/dist/test/unit/transactionBuilder.test.js +0 -114
  118. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  119. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  120. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -1,318 +1,149 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AtomicTransactionBuilder = void 0;
4
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
4
+ const transactionBuilder_1 = require("./transactionBuilder");
5
+ const transaction_1 = require("./transaction");
5
6
  const flarejs_1 = require("@flarenetwork/flarejs");
6
- const constants_1 = require("./constants");
7
- const utils_1 = require("./utils");
8
- /**
9
- * Flare P-chain atomic transaction builder with FlareJS credential support.
10
- * This provides the foundation for building Flare P-chain transactions with proper
11
- * credential handling using FlareJS Credential and Signature classes.
12
- */
13
- class AtomicTransactionBuilder {
14
- constructor(coinConfig) {
15
- this._utxos = [];
16
- this.transaction = {
17
- _network: {},
18
- _networkID: constants_1.DEFAULT_NETWORK_ID,
19
- _blockchainID: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
20
- _assetId: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
21
- _fromAddresses: [],
22
- _to: [],
23
- _locktime: constants_1.DEFAULT_LOCKTIME,
24
- _threshold: constants_1.DEFAULT_THRESHOLD,
25
- _fee: { fee: constants_1.AMOUNT_STRING_ZERO },
26
- hasCredentials: false,
27
- setTransaction: function (_tx) {
28
- this._tx = _tx;
29
- },
30
- };
31
- this._coinConfig = coinConfig;
32
- }
33
- /**
34
- * Get the asset ID for Flare network transactions
35
- * @returns Buffer containing the asset ID
36
- */
37
- getAssetId() {
38
- // Use the asset ID from transaction if already set
39
- if (this.transaction._assetId && this.transaction._assetId.length > 0) {
40
- return this.transaction._assetId;
41
- }
42
- // For native FLR transactions, return zero-filled buffer as placeholder
43
- // In a real implementation, this would be obtained from the network configuration
44
- // or FlareJS API to get the actual native asset ID
45
- return Buffer.alloc(constants_1.ASSET_ID_LENGTH);
46
- }
47
- validateAmount(amount) {
48
- if (amount <= constants_1.ZERO_BIGINT) {
49
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_AMOUNT_POSITIVE);
50
- }
7
+ class AtomicTransactionBuilder extends transactionBuilder_1.TransactionBuilder {
8
+ constructor(_coinConfig) {
9
+ super(_coinConfig);
10
+ this.recoverSigner = false;
11
+ this.transaction = new transaction_1.Transaction(_coinConfig);
51
12
  }
52
13
  /**
53
- * Validates that credentials array is properly formed
54
- * @param credentials - Array of credentials to validate
14
+ * Create inputs and outputs from UTXOs
15
+ * @param {bigint} amount Amount to transfer
16
+ * @return {
17
+ * inputs: TransferableInput[];
18
+ * outputs: TransferableInput[];
19
+ * credentials: Credential[];
20
+ * }
21
+ * @protected
55
22
  */
56
- validateCredentials(credentials) {
57
- if (!Array.isArray(credentials)) {
58
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_CREDENTIALS_ARRAY);
59
- }
60
- credentials.forEach((credential, index) => {
61
- if (!(credential instanceof flarejs_1.Credential)) {
62
- throw new sdk_core_1.BuildTransactionError(`Invalid credential at index ${index}`);
23
+ createInputOutput(amount) {
24
+ const sender = this.transaction._fromAddresses.slice();
25
+ if (this.recoverSigner) {
26
+ // switch first and last signer
27
+ const tmp = sender.pop();
28
+ sender.push(sender[0]);
29
+ if (tmp) {
30
+ sender[0] = tmp;
63
31
  }
64
- });
65
- }
66
- /**
67
- * Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
68
- * Based on AVAX P-chain implementation adapted for FlareJS.
69
- *
70
- * Note: This is a simplified implementation that creates the core structure.
71
- * The FlareJS type system integration will be refined in future iterations.
72
- *
73
- * @param total - Total amount needed including fees
74
- * @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
75
- */
76
- createInputOutput(total) {
77
- if (!this._utxos || this._utxos.length === constants_1.ZERO_NUMBER) {
78
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED);
79
32
  }
33
+ let totalAmount = BigInt(0);
80
34
  const inputs = [];
81
35
  const outputs = [];
82
36
  const credentials = [];
83
- let inputSum = 0n;
84
- const addressIndices = {};
85
- let nextAddressIndex = 0;
86
- // Sort UTXOs by amount in descending order for optimal coin selection
87
- const sortedUtxos = [...this._utxos].sort((a, b) => {
88
- const amountA = BigInt(a.amount);
89
- const amountB = BigInt(b.amount);
90
- if (amountA > amountB)
91
- return -1;
92
- if (amountA < amountB)
93
- return 1;
94
- return 0;
95
- });
96
- // Process UTXOs to create inputs and credentials
97
- for (const utxo of sortedUtxos) {
37
+ this.transaction._utxos.forEach((utxo) => {
98
38
  const utxoAmount = BigInt(utxo.amount);
99
- if (inputSum >= total) {
100
- break; // We have enough inputs
101
- }
102
- // Track input sum
103
- inputSum += utxoAmount;
104
- // Track address indices for signature ordering (mimics AVAX pattern)
105
- const addressIndexArray = [];
106
- for (const address of utxo.addresses) {
107
- if (!(address in addressIndices)) {
108
- addressIndices[address] = nextAddressIndex++;
109
- }
110
- addressIndexArray.push(addressIndices[address]);
111
- }
112
- // Store address indices on the UTXO for credential creation
113
- utxo.addressesIndex = addressIndexArray;
114
- // Create TransferableInput for atomic transactions
115
- const transferableInput = {
116
- txID: Buffer.from(utxo.txid || constants_1.AMOUNT_STRING_ZERO.repeat(constants_1.TRANSACTION_ID_HEX_LENGTH), constants_1.HEX_ENCODING),
117
- outputIndex: parseInt(utxo.outputidx || constants_1.AMOUNT_STRING_ZERO, constants_1.DECIMAL_RADIX),
118
- assetID: this.getAssetId(),
119
- input: {
120
- amount: utxoAmount,
121
- addressIndices: addressIndexArray,
122
- threshold: utxo.threshold,
39
+ totalAmount += utxoAmount;
40
+ // Create input
41
+ const input = {
42
+ _type: flarejs_1.TypeSymbols.Input,
43
+ amount: () => utxoAmount,
44
+ sigIndices: sender.map((_, i) => i),
45
+ toBytes: () => new Uint8Array(),
46
+ };
47
+ // Create asset with Amounter interface
48
+ const assetId = {
49
+ _type: flarejs_1.TypeSymbols.BaseTx,
50
+ amount: () => utxoAmount,
51
+ toBytes: () => {
52
+ const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
53
+ return bytes;
123
54
  },
124
55
  };
125
- // Store the input (type assertion for compatibility)
56
+ // Create TransferableInput
57
+ const transferableInput = new flarejs_1.TransferableInput({
58
+ _type: flarejs_1.TypeSymbols.UTXOID,
59
+ txID: new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.txid, 'hex'))),
60
+ outputIdx: new flarejs_1.Int(Number(utxo.outputidx)),
61
+ ID: () => utxo.txid,
62
+ toBytes: () => {
63
+ const txIdBytes = new Uint8Array(Buffer.from(utxo.txid, 'hex'));
64
+ const outputIdxBytes = new Uint8Array(4);
65
+ new DataView(outputIdxBytes.buffer).setInt32(0, Number(utxo.outputidx), true);
66
+ return Buffer.concat([txIdBytes, outputIdxBytes]);
67
+ },
68
+ }, new flarejs_1.Id(new Uint8Array(Buffer.from(utxo.outputidx.toString()))), assetId);
69
+ // Set input properties
70
+ Object.assign(transferableInput, { input });
126
71
  inputs.push(transferableInput);
127
- // Create credential with placeholder signatures
128
- // In a real implementation, these would be actual signatures
129
- const signatures = Array.from({ length: utxo.threshold }, () => '');
130
- const credential = this.createFlareCredential(0, signatures);
131
- credentials.push(credential);
132
- }
133
- // Verify we have enough inputs
134
- if (inputSum < total) {
135
- throw new sdk_core_1.BuildTransactionError(`Insufficient funds: need ${total}, have ${inputSum}`);
136
- }
137
- // Create change output if we have excess input amount
138
- if (inputSum > total) {
139
- const changeAmount = inputSum - total;
140
- // Create change output for atomic transactions
141
- const changeOutput = {
142
- assetID: this.getAssetId(),
143
- output: {
144
- amount: changeAmount,
145
- addresses: this.transaction._fromAddresses,
146
- threshold: 1,
147
- locktime: 0n,
72
+ // Create empty credential for each input
73
+ const emptySignatures = sender.map(() => Buffer.alloc(0));
74
+ credentials.push({ signatures: emptySignatures });
75
+ });
76
+ // Create output if there is change
77
+ if (totalAmount > amount) {
78
+ const changeAmount = totalAmount - amount;
79
+ const output = {
80
+ _type: flarejs_1.TypeSymbols.BaseTx,
81
+ amount: () => changeAmount,
82
+ addresses: sender,
83
+ locktime: this.transaction._locktime,
84
+ threshold: this.transaction._threshold,
85
+ toBytes: () => new Uint8Array(),
86
+ };
87
+ // Create asset with Amounter interface
88
+ const assetId = {
89
+ _type: flarejs_1.TypeSymbols.BaseTx,
90
+ amount: () => changeAmount,
91
+ toBytes: () => {
92
+ const bytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
93
+ return bytes;
148
94
  },
149
95
  };
150
- // Add the change output (type assertion for compatibility)
151
- outputs.push(changeOutput);
152
- }
153
- return { inputs, outputs, credentials };
154
- }
155
- /**
156
- * Set UTXOs for the transaction. This is required for creating inputs and outputs.
157
- *
158
- * @param utxos - Array of decoded UTXO objects
159
- * @returns this builder instance for chaining
160
- */
161
- utxos(utxos) {
162
- this._utxos = utxos;
163
- return this;
164
- }
165
- /**
166
- * Flare equivalent of Avalanche's SelectCredentialClass
167
- * Creates a credential with the provided signatures
168
- *
169
- * @param credentialId - The credential ID (not used in FlareJS but kept for compatibility)
170
- * @param signatures - Array of signature hex strings or empty strings for placeholders
171
- * @returns Credential instance
172
- */
173
- createFlareCredential(_credentialId, signatures) {
174
- if (!Array.isArray(signatures)) {
175
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_ARRAY);
176
- }
177
- if (signatures.length === constants_1.ZERO_NUMBER) {
178
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_EMPTY);
179
- }
180
- const sigs = signatures.map((sig, index) => {
181
- // Handle empty/placeholder signatures
182
- if (!sig || sig.length === 0) {
183
- return new flarejs_1.Signature(new Uint8Array(constants_1.SECP256K1_SIGNATURE_LENGTH));
184
- }
185
- // Validate hex string format
186
- const cleanSig = sig.startsWith(constants_1.HEX_PREFIX) ? sig.slice(constants_1.HEX_PREFIX_LENGTH) : sig;
187
- if (!(0, utils_1.createFlexibleHexRegex)().test(cleanSig)) {
188
- throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
189
- }
190
- // Convert to buffer and validate length
191
- const sigBuffer = Buffer.from(cleanSig, constants_1.HEX_ENCODING);
192
- if (sigBuffer.length > constants_1.SECP256K1_SIGNATURE_LENGTH) {
193
- throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${constants_1.SECP256K1_SIGNATURE_LENGTH})`);
194
- }
195
- // Create fixed-length buffer and copy signature data
196
- const fixedLengthBuffer = Buffer.alloc(constants_1.SECP256K1_SIGNATURE_LENGTH);
197
- sigBuffer.copy(fixedLengthBuffer);
198
- try {
199
- return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
200
- }
201
- catch (error) {
202
- throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
203
- }
204
- });
205
- try {
206
- return new flarejs_1.Credential(sigs);
207
- }
208
- catch (error) {
209
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_CREATE_CREDENTIAL_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
210
- }
211
- }
212
- /**
213
- * Base initBuilder used by concrete builders. For now just returns this so fluent API works.
214
- */
215
- initBuilder(_tx) {
216
- return this;
96
+ // Create TransferableOutput
97
+ const transferableOutput = new flarejs_1.TransferableInput({
98
+ _type: flarejs_1.TypeSymbols.UTXOID,
99
+ txID: new flarejs_1.Id(new Uint8Array(32)),
100
+ outputIdx: new flarejs_1.Int(0),
101
+ ID: () => '',
102
+ toBytes: () => {
103
+ const txIdBytes = new Uint8Array(32);
104
+ const outputIdxBytes = new Uint8Array(4);
105
+ return Buffer.concat([txIdBytes, outputIdxBytes]);
106
+ },
107
+ }, new flarejs_1.Id(new Uint8Array([0])), assetId);
108
+ // Set output properties
109
+ Object.assign(transferableOutput, { output });
110
+ outputs.push(transferableOutput);
111
+ }
112
+ return {
113
+ inputs,
114
+ outputs,
115
+ credentials,
116
+ };
217
117
  }
218
- /**
219
- * Sign transaction with private key using FlareJS compatibility
220
- */
221
- sign(params) {
222
- // FlareJS signing implementation with atomic transaction support
223
- try {
224
- // Validate private key format (placeholder implementation)
225
- if (!params.key || params.key.length < constants_1.PRIVATE_KEY_HEX_LENGTH) {
226
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_PRIVATE_KEY);
118
+ /** @inheritdoc */
119
+ async buildImplementation() {
120
+ this.buildFlareTransaction();
121
+ this.setTransactionType(this.transactionType);
122
+ if (this.hasSigner()) {
123
+ // Sign sequentially to ensure proper order
124
+ for (const keyPair of this._signer) {
125
+ await this.transaction.sign(keyPair);
227
126
  }
228
- // Create signature structure
229
- const signature = {
230
- privateKey: params.key,
231
- signingMethod: constants_1.SIGNING_METHOD,
232
- };
233
- // Store signature for FlareJS compatibility
234
- this.transaction._signature = signature;
235
- this.transaction.hasCredentials = true;
236
- return this;
237
- }
238
- catch (error) {
239
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FLAREJS_SIGNING_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
240
127
  }
128
+ return this.transaction;
241
129
  }
242
130
  /**
243
- * Build the transaction using FlareJS compatibility
131
+ * Fee is fix for AVM atomic tx.
132
+ *
133
+ * @returns network.txFee
134
+ * @protected
244
135
  */
245
- async build() {
246
- // FlareJS UnsignedTx creation with atomic transaction support
247
- try {
248
- // Validate transaction requirements
249
- if (!this._utxos || this._utxos.length === 0) {
250
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED_BUILD);
251
- }
252
- // Create FlareJS transaction structure with atomic support
253
- const transaction = {
254
- _id: `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
255
- _inputs: [],
256
- _outputs: [],
257
- _type: this.transactionType,
258
- signature: [],
259
- fromAddresses: this.transaction._fromAddresses,
260
- validationErrors: [],
261
- // FlareJS methods with atomic support
262
- toBroadcastFormat: () => `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
263
- toJson: () => ({
264
- type: this.transactionType,
265
- }),
266
- explainTransaction: () => ({
267
- type: this.transactionType,
268
- inputs: [],
269
- outputs: [],
270
- outputAmount: constants_1.AMOUNT_STRING_ZERO,
271
- rewardAddresses: [],
272
- id: `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
273
- changeOutputs: [],
274
- changeAmount: constants_1.AMOUNT_STRING_ZERO,
275
- fee: { fee: this.transaction._fee.fee },
276
- }),
277
- isTransactionForCChain: false,
278
- loadInputsAndOutputs: () => {
279
- /* FlareJS atomic transaction loading */
280
- },
281
- inputs: () => [],
282
- outputs: () => [],
283
- fee: () => ({ fee: this.transaction._fee.fee }),
284
- feeRate: () => 0,
285
- id: () => `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
286
- type: this.transactionType,
287
- };
288
- return transaction;
289
- }
290
- catch (error) {
291
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_BUILD_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
292
- }
136
+ get fixedFee() {
137
+ return this.transaction._network.txFee;
293
138
  }
294
139
  /**
295
- * Parse and explain a transaction from hex using FlareJS compatibility
140
+ * Set the transaction type
141
+ *
142
+ * @param {TransactionType} transactionType The transaction type to be set
296
143
  */
297
- explainTransaction() {
298
- // FlareJS transaction parsing with atomic support
299
- try {
300
- return {
301
- type: this.transactionType,
302
- inputs: [],
303
- outputs: [],
304
- outputAmount: constants_1.AMOUNT_STRING_ZERO,
305
- rewardAddresses: [],
306
- id: `${constants_1.FLARE_ATOMIC_PARSED_PREFIX}${Date.now()}`,
307
- changeOutputs: [],
308
- changeAmount: constants_1.AMOUNT_STRING_ZERO,
309
- fee: { fee: this.transaction._fee.fee },
310
- };
311
- }
312
- catch (error) {
313
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_PARSE_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
314
- }
144
+ setTransactionType(transactionType) {
145
+ this.transaction._type = transactionType;
315
146
  }
316
147
  }
317
148
  exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUVyRywyQ0FnQ3FCO0FBQ3JCLG1DQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBc0Isd0JBQXdCO0lBcUM1QyxZQUFZLFVBQWdDO1FBaENsQyxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQWNqQjtZQUNGLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLDhCQUFrQjtZQUM5QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUN6QyxjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSw0QkFBZ0I7WUFDM0IsVUFBVSxFQUFFLDZCQUFpQjtZQUM3QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsOEJBQWtCLEVBQUU7WUFDakMsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLFVBQVUsR0FBWTtnQkFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7OztPQUdHO0lBQ08sVUFBVTtRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFD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QUUsOEJBQWtCO2dCQUNoQyxlQUFlLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsc0NBQTBCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoRCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtnQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLEdBQUcsdUNBQTJCLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFYRCw0REEwWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSwgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCwgU2lnbmF0dXJlLCBUcmFuc2ZlcmFibGVJbnB1dCwgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBBU1NFVF9JRF9MRU5HVEgsXG4gIFRSQU5TQUNUSU9OX0lEX0hFWF9MRU5HVEgsXG4gIFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgsXG4gIFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RILFxuICBUUkFOU0FDVElPTl9JRF9QUkVGSVgsXG4gIERFRkFVTFRfTkVUV09SS19JRCxcbiAgRU1QVFlfQlVGRkVSX1NJWkUsXG4gIEhFWF9QUkVGSVgsXG4gIEhFWF9QUkVGSVhfTEVOR1RILFxuICBERUNJTUFMX1JBRElYLFxuICBTSUdOSU5HX01FVEhPRCxcbiAgQU1PVU5UX1NUUklOR19aRVJPLFxuICBERUZBVUxUX0xPQ0tUSU1FLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgWkVST19CSUdJTlQsXG4gIFpFUk9fTlVNQkVSLFxuICBFUlJPUl9BTU9VTlRfUE9TSVRJVkUsXG4gIEVSUk9SX0NSRURFTlRJQUxTX0FSUkFZLFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRCxcbiAgRVJST1JfU0lHTkFUVVJFU19BUlJBWSxcbiAgRVJST1JfU0lHTkFUVVJFU19FTVBUWSxcbiAgRVJST1JfSU5WQUxJRF9QUklWQVRFX0tFWSxcbiAgRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQsXG4gIEVSUk9SX0VOSEFOQ0VEX0JVSUxEX0ZBSUxFRCxcbiAgRVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVELFxuICBFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVELFxuICBFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUQsXG4gIEVSUk9SX1VOS05PV04sXG4gIEZMQVJFX0FUT01JQ19QUkVGSVgsXG4gIEZMQVJFX0FUT01JQ19QQVJTRURfUFJFRklYLFxuICBIRVhfRU5DT0RJTkcsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXggfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBfc2lnbmF0dXJlPzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiBERUZBVUxUX05FVFdPUktfSUQsXG4gICAgX2Jsb2NrY2hhaW5JRDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfZnJvbUFkZHJlc3NlczogW10sXG4gICAgX3RvOiBbXSxcbiAgICBfbG9ja3RpbWU6IERFRkFVTFRfTE9DS1RJTUUsXG4gICAgX3RocmVzaG9sZDogREVGQVVMVF9USFJFU0hPTEQsXG4gICAgX2ZlZTogeyBmZWU6IEFNT1VOVF9TVFJJTkdfWkVSTyB9LFxuICAgIGhhc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBzZXRUcmFuc2FjdGlvbjogZnVuY3Rpb24gKF90eDogdW5rbm93bikge1xuICAgICAgdGhpcy5fdHggPSBfdHg7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHRoaXMuX2NvaW5Db25maWcgPSBjb2luQ29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFzc2V0IElEIGZvciBGbGFyZSBuZXR3b3JrIHRyYW5zYWN0aW9uc1xuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgYXNzZXQgSURcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBc3NldElkKCk6IEJ1ZmZlciB7XG4gICAgLy8gVXNlIHRoZSBhc3NldCBJRCBmcm9tIHRyYW5zYWN0aW9uIGlmIGFscmVhZHkgc2V0XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQgJiYgdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbmF0aXZlIEZMUiB0cmFuc2FjdGlvbnMsIHJldHVybiB6ZXJvLWZpbGxlZCBidWZmZXIgYXMgcGxhY2Vob2xkZXJcbiAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAgLy8gb3IgRmxhcmVKUyBBUEkgdG8gZ2V0IHRoZSBhY3R1YWwgbmF0aXZlIGFzc2V0IElEXG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpO1xuICB9XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IFpFUk9fQklHSU5UKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0FNT1VOVF9QT1NJVElWRSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGNyZWRlbnRpYWxzIGFycmF5IGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgLSBBcnJheSBvZiBjcmVkZW50aWFscyB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ3JlZGVudGlhbHMoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjcmVkZW50aWFscykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfQ1JFREVOVElBTFNfQVJSQVkpO1xuICAgIH1cblxuICAgIGNyZWRlbnRpYWxzLmZvckVhY2goKGNyZWRlbnRpYWwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIShjcmVkZW50aWFsIGluc3RhbmNlb2YgQ3JlZGVudGlhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBjcmVkZW50aWFsIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBpbnB1dHMsIG91dHB1dHMsIGFuZCBjcmVkZW50aWFscyBmb3IgRmxhcmUgUC1jaGFpbiBhdG9taWMgdHJhbnNhY3Rpb25zLlxuICAgKiBCYXNlZCBvbiBBVkFYIFAtY2hhaW4gaW1wbGVtZW50YXRpb24gYWRhcHRlZCBmb3IgRmxhcmVKUy5cbiAgICpcbiAgICogTm90ZTogVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIHRoZSBjb3JlIHN0cnVjdHVyZS5cbiAgICogVGhlIEZsYXJlSlMgdHlwZSBzeXN0ZW0gaW50ZWdyYXRpb24gd2lsbCBiZSByZWZpbmVkIGluIGZ1dHVyZSBpdGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdG90YWwgLSBUb3RhbCBhbW91bnQgbmVlZGVkIGluY2x1ZGluZyBmZWVzXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIFRyYW5zZmVyYWJsZUlucHV0W10sIFRyYW5zZmVyYWJsZU91dHB1dFtdLCBhbmQgQ3JlZGVudGlhbFtdXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQodG90YWw6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLl91dHhvcyB8fCB0aGlzLl91dHhvcy5sZW5ndGggPT09IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1VUWE9TX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0IGZvciBhdG9taWMgdHJhbnNhY3Rpb25zXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IHtcbiAgICAgICAgdHhJRDogQnVmZmVyLmZyb20odXR4by50eGlkIHx8IEFNT1VOVF9TVFJJTkdfWkVSTy5yZXBlYXQoVFJBTlNBQ1RJT05fSURfSEVYX0xFTkdUSCksIEhFWF9FTkNPRElORyksXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCB8fCBBTU9VTlRfU1RSSU5HX1pFUk8sIERFQ0lNQUxfUkFESVgpLFxuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gICAgICAgICAgYWRkcmVzc0luZGljZXM6IGFkZHJlc3NJbmRleEFycmF5LFxuICAgICAgICAgIHRocmVzaG9sZDogdXR4by50aHJlc2hvbGQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgaW5wdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGVzZSB3b3VsZCBiZSBhY3R1YWwgc2lnbmF0dXJlc1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHV0eG8udGhyZXNob2xkIH0sICgpID0+ICcnKTtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSB0aGlzLmNyZWF0ZUZsYXJlQ3JlZGVudGlhbCgwLCBzaWduYXR1cmVzKTtcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goY3JlZGVudGlhbCk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHdlIGhhdmUgZW5vdWdoIGlucHV0c1xuICAgIGlmIChpbnB1dFN1bSA8IHRvdGFsKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnN1ZmZpY2llbnQgZnVuZHM6IG5lZWQgJHt0b3RhbH0sIGhhdmUgJHtpbnB1dFN1bX1gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBpZiB3ZSBoYXZlIGV4Y2VzcyBpbnB1dCBhbW91bnRcbiAgICBpZiAoaW5wdXRTdW0gPiB0b3RhbCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gaW5wdXRTdW0gLSB0b3RhbDtcblxuICAgICAgLy8gQ3JlYXRlIGNoYW5nZSBvdXRwdXQgZm9yIGF0b21pYyB0cmFuc2FjdGlvbnNcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IHtcbiAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICAgIGFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgbG9ja3RpbWU6IDBuLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBjaGFuZ2Ugb3V0cHV0ICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIG91dHB1dHMucHVzaChjaGFuZ2VPdXRwdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfU0lHTkFUVVJFU19BUlJBWSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID09PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9TSUdOQVRVUkVTX0VNUFRZKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKEhFWF9QUkVGSVgpID8gc2lnLnNsaWNlKEhFWF9QUkVGSVhfTEVOR1RIKSA6IHNpZztcbiAgICAgIGlmICghY3JlYXRlRmxleGlibGVIZXhSZWdleCgpLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCBIRVhfRU5DT0RJTkcpO1xuICAgICAgaWYgKHNpZ0J1ZmZlci5sZW5ndGggPiBTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBTaWduYXR1cmUgdG9vIGxvbmcgYXQgaW5kZXggJHtpbmRleH06ICR7c2lnQnVmZmVyLmxlbmd0aH0gYnl0ZXMgKG1heCAke1NFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIfSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBmaXhlZC1sZW5ndGggYnVmZmVyIGFuZCBjb3B5IHNpZ25hdHVyZSBkYXRhXG4gICAgICBjb25zdCBmaXhlZExlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCk7XG4gICAgICBzaWdCdWZmZXIuY29weShmaXhlZExlbmd0aEJ1ZmZlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KGZpeGVkTGVuZ3RoQnVmZmVyKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQ3JlZGVudGlhbChzaWdzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfQ1JFQVRFX0NSRURFTlRJQUxfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgdXNpbmcgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBzaWduKHBhcmFtczogeyBrZXk6IHN0cmluZyB9KTogdGhpcyB7XG4gICAgLy8gRmxhcmVKUyBzaWduaW5nIGltcGxlbWVudGF0aW9uIHdpdGggYXRvbWljIHRyYW5zYWN0aW9uIHN1cHBvcnRcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChwbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbilcbiAgICAgIGlmICghcGFyYW1zLmtleSB8fCBwYXJhbXMua2V5Lmxlbmd0aCA8IFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9JTlZBTElEX1BSSVZBVEVfS0VZKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hdHVyZSBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHtcbiAgICAgICAgcHJpdmF0ZUtleTogcGFyYW1zLmtleSxcbiAgICAgICAgc2lnbmluZ01ldGhvZDogU0lHTklOR19NRVRIT0QsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSBzaWduYXR1cmUgZm9yIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBGbGFyZUpTIFVuc2lnbmVkVHggY3JlYXRpb24gd2l0aCBhdG9taWMgdHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0cmFuc2FjdGlvbiByZXF1aXJlbWVudHNcbiAgICAgIGlmICghdGhpcy5fdXR4b3MgfHwgdGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgRmxhcmVKUyB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB7XG4gICAgICAgIF9pZDogYCR7VFJBTlNBQ1RJT05fSURfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBfaW5wdXRzOiBbXSxcbiAgICAgICAgX291dHB1dHM6IFtdLFxuICAgICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgIHNpZ25hdHVyZTogW10gYXMgc3RyaW5nW10sXG5cbiAgICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogW10sXG5cbiAgICAgICAgLy8gRmxhcmVKUyBtZXRob2RzIHdpdGggYXRvbWljIHN1cHBvcnRcbiAgICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+IGAke1RSQU5TQUNUSU9OX0lEX1BSRUZJWH0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgdG9Kc29uOiAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICB9KSxcblxuICAgICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICAgIGlkOiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICAgIGNoYW5nZUFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICAgIGZlZTogeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgaXNUcmFuc2FjdGlvbkZvckNDaGFpbjogZmFsc2UsXG4gICAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgICAgLyogRmxhcmVKUyBhdG9taWMgdHJhbnNhY3Rpb24gbG9hZGluZyAqL1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dHM6ICgpID0+IFtdLFxuICAgICAgICBvdXRwdXRzOiAoKSA9PiBbXSxcbiAgICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSksXG4gICAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICAgIGlkOiAoKSA9PiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBCYXNlVHJhbnNhY3Rpb247XG5cbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCB1c2luZyBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICAvLyBGbGFyZUpTIHRyYW5zYWN0aW9uIHBhcnNpbmcgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICBpZDogYCR7RkxBUkVfQVRPTUlDX1BBUlNFRF9QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsNkRBQTBEO0FBQzFELCtDQUE0QztBQUM1QyxtREFBZ0Y7QUFVaEYsTUFBc0Isd0JBQXlCLFNBQVEsdUNBQWtCO0lBSXZFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSFgsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFJOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNPLGlCQUFpQixDQUFDLE1BQWM7UUFLeEMsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLFdBQTJCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLCtCQUErQjtZQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBd0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sV0FBVyxHQUFVLEVBQUUsQ0FBQztRQUU3QixJQUFJLENBQUMsV0FBMkIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMs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TEQsNERBaUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zZmVyYWJsZUlucHV0LCBJbnQsIElkLCBUeXBlU3ltYm9scyB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuXG4vLyBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBjYW4gcHJvdmlkZSBhbiBhbW91bnRcbmludGVyZmFjZSBBbW91bnRlciB7XG4gIF90eXBlOiBUeXBlU3ltYm9scztcbiAgYW1vdW50OiAoKSA9PiBiaWdpbnQ7XG4gIHRvQnl0ZXM6ICgpID0+IFVpbnQ4QXJyYXk7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyO1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW5wdXRzIGFuZCBvdXRwdXRzIGZyb20gVVRYT3NcbiAgICogQHBhcmFtIHtiaWdpbnR9IGFtb3VudCBBbW91bnQgdG8gdHJhbnNmZXJcbiAgICogQHJldHVybiB7XG4gICAqICAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAqICAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgKiAgICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICogfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQoYW1vdW50OiBiaWdpbnQpOiB7XG4gICAgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgIG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgY3JlZGVudGlhbHM6IGFueVtdO1xuICB9IHtcbiAgICBjb25zdCBzZW5kZXIgPSAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Zyb21BZGRyZXNzZXMuc2xpY2UoKTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogYW55W10gPSBbXTtcblxuICAgICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fdXR4b3MuZm9yRWFjaCgodXR4bzogRGVjb2RlZFV0eG9PYmopID0+IHtcbiAgICAgIGNvbnN0IHV0eG9BbW91bnQgPSBCaWdJbnQodXR4by5hbW91bnQpO1xuICAgICAgdG90YWxBbW91bnQgKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gQ3JlYXRlIGlucHV0XG4gICAgICBjb25zdCBpbnB1dCA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLklucHV0LFxuICAgICAgICBhbW91bnQ6ICgpID0+IHV0eG9BbW91bnQsXG4gICAgICAgIHNpZ0luZGljZXM6IHNlbmRlci5tYXAoKF8sIGkpID0+IGkpLFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIGFzc2V0IHdpdGggQW1vdW50ZXIgaW50ZXJmYWNlXG4gICAgICBjb25zdCBhc3NldElkOiBBbW91bnRlciA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLkJhc2VUeCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiB1dHhvQW1vdW50LFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2Fzc2V0SWQsICdoZXgnKSk7XG4gICAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0XG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IG5ldyBUcmFuc2ZlcmFibGVJbnB1dChcbiAgICAgICAge1xuICAgICAgICAgIF90eXBlOiBUeXBlU3ltYm9scy5VVFhPSUQsXG4gICAgICAgICAgdHhJRDogbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHV0eG8udHhpZCwgJ2hleCcpKSksXG4gICAgICAgICAgb3V0cHV0SWR4OiBuZXcgSW50KE51bWJlcih1dHhvLm91dHB1dGlkeCkpLFxuICAgICAgICAgIElEOiAoKSA9PiB1dHhvLnR4aWQsXG4gICAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXR4by50eGlkLCAnaGV4JykpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SWR4Qnl0ZXMgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgICAgIG5ldyBEYXRhVmlldyhvdXRwdXRJZHhCeXRlcy5idWZmZXIpLnNldEludDMyKDAsIE51bWJlcih1dHhvLm91dHB1dGlkeCksIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW3R4SWRCeXRlcywgb3V0cHV0SWR4Qnl0ZXNdKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odXR4by5vdXRwdXRpZHgudG9TdHJpbmcoKSkpKSxcbiAgICAgICAgYXNzZXRJZFxuICAgICAgKTtcblxuICAgICAgLy8gU2V0IGlucHV0IHByb3BlcnRpZXNcbiAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNmZXJhYmxlSW5wdXQsIHsgaW5wdXQgfSk7XG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbXB0eSBjcmVkZW50aWFsIGZvciBlYWNoIGlucHV0XG4gICAgICBjb25zdCBlbXB0eVNpZ25hdHVyZXMgPSBzZW5kZXIubWFwKCgpID0+IEJ1ZmZlci5hbGxvYygwKSk7XG4gICAgICBjcmVkZW50aWFscy5wdXNoKHsgc2lnbmF0dXJlczogZW1wdHlTaWduYXR1cmVzIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIG91dHB1dCBpZiB0aGVyZSBpcyBjaGFuZ2VcbiAgICBpZiAodG90YWxBbW91bnQgPiBhbW91bnQpIHtcbiAgICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHRvdGFsQW1vdW50IC0gYW1vdW50O1xuICAgICAgY29uc3Qgb3V0cHV0ID0ge1xuICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuQmFzZVR4LFxuICAgICAgICBhbW91bnQ6ICgpID0+IGNoYW5nZUFtb3VudCxcbiAgICAgICAgYWRkcmVzc2VzOiBzZW5kZXIsXG4gICAgICAgIGxvY2t0aW1lOiAodGhpcy50cmFuc2FjdGlvbiBhcyBUcmFuc2FjdGlvbikuX2xvY2t0aW1lLFxuICAgICAgICB0aHJlc2hvbGQ6ICh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fdGhyZXNob2xkLFxuICAgICAgICB0b0J5dGVzOiAoKSA9PiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIGFzc2V0IHdpdGggQW1vdW50ZXIgaW50ZXJmYWNlXG4gICAgICBjb25zdCBhc3NldElkOiBBbW91bnRlciA9IHtcbiAgICAgICAgX3R5cGU6IFR5cGVTeW1ib2xzLkJhc2VUeCxcbiAgICAgICAgYW1vdW50OiAoKSA9PiBjaGFuZ2VBbW91bnQsXG4gICAgICAgIHRvQnl0ZXM6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCh0aGlzLnRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uKS5fYXNzZXRJZCwgJ2hleCcpKTtcbiAgICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgVHJhbnNmZXJhYmxlT3V0cHV0XG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVPdXRwdXQgPSBuZXcgVHJhbnNmZXJhYmxlSW5wdXQoXG4gICAgICAgIHtcbiAgICAgICAgICBfdHlwZTogVHlwZVN5bWJvbHMuVVRYT0lELFxuICAgICAgICAgIHR4SUQ6IG5ldyBJZChuZXcgVWludDhBcnJheSgzMikpLFxuICAgICAgICAgIG91dHB1dElkeDogbmV3IEludCgwKSxcbiAgICAgICAgICBJRDogKCkgPT4gJycsXG4gICAgICAgICAgdG9CeXRlczogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SWR4Qnl0ZXMgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KFt0eElkQnl0ZXMsIG91dHB1dElkeEJ5dGVzXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KFswXSkpLFxuICAgICAgICBhc3NldElkXG4gICAgICApO1xuXG4gICAgICAvLyBTZXQgb3V0cHV0IHByb3BlcnRpZXNcbiAgICAgIE9iamVjdC5hc3NpZ24odHJhbnNmZXJhYmxlT3V0cHV0LCB7IG91dHB1dCB9KTtcbiAgICAgIG91dHB1dHMucHVzaCh0cmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBvdXRwdXRzLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgaWYgKHRoaXMuaGFzU2lnbmVyKCkpIHtcbiAgICAgIC8vIFNpZ24gc2VxdWVudGlhbGx5IHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJcbiAgICAgIGZvciAoY29uc3Qga2V5UGFpciBvZiB0aGlzLl9zaWduZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGF2YXggdHJhbnNhY3Rpb24uIHRyYW5zYWN0aW9uIGZpZWxkIGlzIGNoYW5nZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBGZWUgaXMgZml4IGZvciBBVk0gYXRvbWljIHR4LlxuICAgKlxuICAgKiBAcmV0dXJucyBuZXR3b3JrLnR4RmVlXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZml4ZWRGZWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay50eEZlZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cbn1cbiJdfQ==