@bitgo/sdk-coin-flrp 1.9.1 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/permissionlessDelegatorTxBuilder.d.ts +41 -9
- package/dist/src/lib/permissionlessDelegatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessDelegatorTxBuilder.js +152 -18
- package/dist/test/resources/transactionData/multisigDelegationTx.d.ts +79 -0
- package/dist/test/resources/transactionData/multisigDelegationTx.d.ts.map +1 -0
- package/dist/test/resources/transactionData/multisigDelegationTx.js +94 -0
- package/dist/test/unit/lib/permissionlessDelegatorTxBuilder.js +772 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -2,7 +2,7 @@ import { TypeSymbols, Credential } from '@flarenetwork/flarejs';
|
|
|
2
2
|
import { TransactionType } from '@bitgo/sdk-core';
|
|
3
3
|
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
4
4
|
import { Transaction } from './transaction';
|
|
5
|
-
import {
|
|
5
|
+
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
|
|
6
6
|
import { FlrpFeeState } from '@bitgo/public-types';
|
|
7
7
|
import { Tx } from './iface';
|
|
8
8
|
/**
|
|
@@ -13,8 +13,11 @@ import { Tx } from './iface';
|
|
|
13
13
|
* - No BLS keys required
|
|
14
14
|
* - Delegates to an existing validator's nodeID
|
|
15
15
|
* - Rewards go to corresponding C-chain address
|
|
16
|
+
*
|
|
17
|
+
* Extends AtomicTransactionBuilder to inherit address sorting and credential management
|
|
18
|
+
* logic needed for proper multisig UTXO handling.
|
|
16
19
|
*/
|
|
17
|
-
export declare class PermissionlessDelegatorTxBuilder extends
|
|
20
|
+
export declare class PermissionlessDelegatorTxBuilder extends AtomicTransactionBuilder {
|
|
18
21
|
protected _nodeID: string;
|
|
19
22
|
protected _startTime: bigint;
|
|
20
23
|
protected _endTime: bigint;
|
|
@@ -73,14 +76,28 @@ export declare class PermissionlessDelegatorTxBuilder extends TransactionBuilder
|
|
|
73
76
|
* @param type TypeSymbol from parsed transaction
|
|
74
77
|
*/
|
|
75
78
|
verifyTxType(type: TypeSymbols): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Recover UTXOs from transaction inputs.
|
|
81
|
+
* Uses fromAddresses as proxy for UTXO addresses since we're reconstructing from a parsed transaction.
|
|
82
|
+
*
|
|
83
|
+
* @param inputs Array of TransferableInput from baseTx
|
|
84
|
+
* @param fromAddresses Wallet addresses to use as proxy for UTXO addresses
|
|
85
|
+
* @returns Array of decoded UTXO objects
|
|
86
|
+
* @private
|
|
87
|
+
*/
|
|
88
|
+
private recoverUtxosFromInputs;
|
|
76
89
|
protected buildImplementation(): Promise<Transaction>;
|
|
77
90
|
/**
|
|
78
|
-
* Get the user's address (index 0) for
|
|
91
|
+
* Get the user's address (index 0) for default reward address.
|
|
92
|
+
*
|
|
93
|
+
* BitGo Convention for fromAddresses:
|
|
94
|
+
* - Index 0: User key (signer in normal mode)
|
|
95
|
+
* - Index 1: BitGo key (always a signer)
|
|
96
|
+
* - Index 2: Backup key (signer in recovery mode)
|
|
79
97
|
*
|
|
80
|
-
* For delegation transactions,
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* 3. The user key is at index 0 in the fromAddresses array (BitGo convention: [user, bitgo, backup])
|
|
98
|
+
* For delegation transactions, the user's address at index 0 is used as the default
|
|
99
|
+
* reward address parameter (though the parameter has no on-chain effect - rewards
|
|
100
|
+
* go to C-chain addresses derived from the P-chain addresses in stake outputs).
|
|
84
101
|
*
|
|
85
102
|
* @returns Buffer containing the user's address
|
|
86
103
|
* @protected
|
|
@@ -91,11 +108,26 @@ export declare class PermissionlessDelegatorTxBuilder extends TransactionBuilder
|
|
|
91
108
|
* Uses pvm.e.newAddPermissionlessDelegatorTx (post-Etna API).
|
|
92
109
|
*
|
|
93
110
|
* Note: The rewardAddresses parameter is accepted by the API but does NOT affect
|
|
94
|
-
* where rewards are sent on-chain
|
|
95
|
-
*
|
|
111
|
+
* where rewards are sent on-chain. Rewards accrue to C-chain addresses derived
|
|
112
|
+
* from the P-chain addresses in the stake outputs. The stake outputs contain the
|
|
113
|
+
* addresses from fromAddressesBytes (sorted to match UTXO owner order).
|
|
96
114
|
* @protected
|
|
97
115
|
*/
|
|
98
116
|
protected buildFlareTransaction(): void;
|
|
117
|
+
/**
|
|
118
|
+
* Create a corrected AddPermissionlessDelegatorTx with the given change outputs.
|
|
119
|
+
* This is necessary because FlareJS's newAddPermissionlessDelegatorTx doesn't support setting
|
|
120
|
+
* the threshold and locktime for change outputs - it defaults to threshold=1.
|
|
121
|
+
*
|
|
122
|
+
* FlareJS declares baseTx.outputs as readonly, so we use Object.defineProperty
|
|
123
|
+
* to override the property with the corrected outputs. This is a workaround until
|
|
124
|
+
* FlareJS adds proper support for change output thresholds.
|
|
125
|
+
*
|
|
126
|
+
* @param originalTx - The original AddPermissionlessDelegatorTx
|
|
127
|
+
* @param correctedOutputs - The corrected change outputs with proper threshold
|
|
128
|
+
* @returns A new AddPermissionlessDelegatorTx with the corrected change outputs
|
|
129
|
+
*/
|
|
130
|
+
private createCorrectedDelegatorTx;
|
|
99
131
|
/**
|
|
100
132
|
* Verify if the transaction type matches AddPermissionlessDelegatorTx
|
|
101
133
|
* @param type TypeSymbol from parsed transaction
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissionlessDelegatorTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/permissionlessDelegatorTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAKX,UAAU,
|
|
1
|
+
{"version":3,"file":"permissionlessDelegatorTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/permissionlessDelegatorTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAKX,UAAU,EAKX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAuC,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,EAAE,EAAkB,MAAM,SAAS,CAAC;AAE7C;;;;;;;;;;;GAWG;AACH,qBAAa,gCAAiC,SAAQ,wBAAwB;IAC5E,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,SAAS,EAAE,YAAY,GAAG,SAAS,CAAC;gBAElC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAGD,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYpC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAQ/D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYzC;;;;;;;;OAQG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKpC;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM5B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKvC;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKrC;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOzC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAMtC;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IAkF9E;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAIxC;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;cAuBd,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAW3D;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,cAAc,IAAI,MAAM;IAYlC;;;;;;;;;OASG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IA0IvC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B;IAiBlC;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAI/C,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;CAIF"}
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.PermissionlessDelegatorTxBuilder = void 0;
|
|
7
7
|
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
8
8
|
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
9
|
-
const
|
|
9
|
+
const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
|
|
10
10
|
const utils_1 = __importDefault(require("./utils"));
|
|
11
11
|
/**
|
|
12
12
|
* Builder for AddPermissionlessDelegator transactions on Flare P-Chain.
|
|
@@ -16,8 +16,11 @@ const utils_1 = __importDefault(require("./utils"));
|
|
|
16
16
|
* - No BLS keys required
|
|
17
17
|
* - Delegates to an existing validator's nodeID
|
|
18
18
|
* - Rewards go to corresponding C-chain address
|
|
19
|
+
*
|
|
20
|
+
* Extends AtomicTransactionBuilder to inherit address sorting and credential management
|
|
21
|
+
* logic needed for proper multisig UTXO handling.
|
|
19
22
|
*/
|
|
20
|
-
class PermissionlessDelegatorTxBuilder extends
|
|
23
|
+
class PermissionlessDelegatorTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
21
24
|
constructor(coinConfig) {
|
|
22
25
|
super(coinConfig);
|
|
23
26
|
this.transaction._fee.fee = this.transaction._network.txFee;
|
|
@@ -41,6 +44,8 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
41
44
|
if (endTime < startTime) {
|
|
42
45
|
throw new sdk_core_1.BuildTransactionError('End date cannot be less than start date');
|
|
43
46
|
}
|
|
47
|
+
// Note: Minimum duration validation is handled by the network.
|
|
48
|
+
// Flare P-chain requires minimum 14 days for delegation.
|
|
44
49
|
}
|
|
45
50
|
validateStakeAmount(amount) {
|
|
46
51
|
const minDelegationStake = BigInt(this.transaction._network.minDelegationStake || this.transaction._network.minStake);
|
|
@@ -142,13 +147,39 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
142
147
|
if (rewardsOwner && rewardsOwner.addrs && rewardsOwner.addrs.length > 0) {
|
|
143
148
|
this.transaction._rewardAddresses = rewardsOwner.addrs.map((addr) => Buffer.from(addr.toBytes()));
|
|
144
149
|
}
|
|
150
|
+
// Recover UTXOs from baseTx inputs using stake output addresses as proxy
|
|
151
|
+
this.transaction._utxos = this.recoverUtxosFromInputs([...delegatorTx.baseTx.inputs], this.transaction._fromAddresses);
|
|
145
152
|
const credentials = parsedCredentials || [];
|
|
146
153
|
if (rawBytes && credentials.length > 0) {
|
|
147
154
|
this.transaction._rawSignedBytes = rawBytes;
|
|
148
155
|
}
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
|
|
156
|
+
// Compute addressesIndex to map wallet positions to sorted UTXO positions
|
|
157
|
+
// Force recompute to ensure fresh mapping from parsed transaction
|
|
158
|
+
this.computeAddressesIndex(true);
|
|
159
|
+
// Use parsed credentials if available, otherwise create new ones based on sigIndices
|
|
160
|
+
// The sigIndices from the parsed transaction (stored in addressesIndex) determine
|
|
161
|
+
// the correct credential ordering for on-chain verification
|
|
162
|
+
const txCredentials = credentials.length > 0
|
|
163
|
+
? credentials
|
|
164
|
+
: this.transaction._utxos.map((utxo) => {
|
|
165
|
+
const utxoThreshold = utxo.threshold || this.transaction._threshold;
|
|
166
|
+
const sigIndices = utxo.addressesIndex ?? [];
|
|
167
|
+
// Use sigIndices-based method if we have valid sigIndices from parsed transaction
|
|
168
|
+
if (sigIndices.length >= utxoThreshold && sigIndices.every((idx) => idx >= 0)) {
|
|
169
|
+
return this.createCredentialForUtxo(utxo, utxoThreshold, sigIndices);
|
|
170
|
+
}
|
|
171
|
+
return this.createCredentialForUtxo(utxo, utxoThreshold);
|
|
172
|
+
});
|
|
173
|
+
// Create addressMaps using sigIndices from parsed transaction for consistency
|
|
174
|
+
const addressMaps = this.transaction._utxos.map((utxo) => {
|
|
175
|
+
const utxoThreshold = utxo.threshold || this.transaction._threshold;
|
|
176
|
+
const sigIndices = utxo.addressesIndex ?? [];
|
|
177
|
+
if (sigIndices.length >= utxoThreshold && sigIndices.every((idx) => idx >= 0)) {
|
|
178
|
+
return this.createAddressMapForUtxo(utxo, utxoThreshold, sigIndices);
|
|
179
|
+
}
|
|
180
|
+
return this.createAddressMapForUtxo(utxo, utxoThreshold);
|
|
181
|
+
});
|
|
182
|
+
const unsignedTx = new flarejs_1.UnsignedTx(delegatorTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
|
|
152
183
|
this.transaction.setTransaction(unsignedTx);
|
|
153
184
|
return this;
|
|
154
185
|
}
|
|
@@ -159,6 +190,33 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
159
190
|
verifyTxType(type) {
|
|
160
191
|
return PermissionlessDelegatorTxBuilder.verifyTxType(type);
|
|
161
192
|
}
|
|
193
|
+
/**
|
|
194
|
+
* Recover UTXOs from transaction inputs.
|
|
195
|
+
* Uses fromAddresses as proxy for UTXO addresses since we're reconstructing from a parsed transaction.
|
|
196
|
+
*
|
|
197
|
+
* @param inputs Array of TransferableInput from baseTx
|
|
198
|
+
* @param fromAddresses Wallet addresses to use as proxy for UTXO addresses
|
|
199
|
+
* @returns Array of decoded UTXO objects
|
|
200
|
+
* @private
|
|
201
|
+
*/
|
|
202
|
+
recoverUtxosFromInputs(inputs, fromAddresses) {
|
|
203
|
+
const proxyAddresses = fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr)));
|
|
204
|
+
return inputs.map((input) => {
|
|
205
|
+
const utxoId = input.utxoID;
|
|
206
|
+
const transferInput = input.input;
|
|
207
|
+
const sigIndicies = transferInput.sigIndicies();
|
|
208
|
+
const utxo = {
|
|
209
|
+
outputID: 7, // SECP256K1 Transfer Output type
|
|
210
|
+
amount: input.amount().toString(),
|
|
211
|
+
txid: utils_1.default.cb58Encode(Buffer.from(utxoId.txID.toBytes())),
|
|
212
|
+
outputidx: utxoId.outputIdx.value().toString(),
|
|
213
|
+
threshold: sigIndicies.length || this.transaction._threshold,
|
|
214
|
+
addresses: proxyAddresses,
|
|
215
|
+
addressesIndex: sigIndicies,
|
|
216
|
+
};
|
|
217
|
+
return utxo;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
162
220
|
async buildImplementation() {
|
|
163
221
|
this.buildFlareTransaction();
|
|
164
222
|
this.transaction.setTransactionType(this.transactionType);
|
|
@@ -170,18 +228,22 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
170
228
|
return this.transaction;
|
|
171
229
|
}
|
|
172
230
|
/**
|
|
173
|
-
* Get the user's address (index 0) for
|
|
231
|
+
* Get the user's address (index 0) for default reward address.
|
|
232
|
+
*
|
|
233
|
+
* BitGo Convention for fromAddresses:
|
|
234
|
+
* - Index 0: User key (signer in normal mode)
|
|
235
|
+
* - Index 1: BitGo key (always a signer)
|
|
236
|
+
* - Index 2: Backup key (signer in recovery mode)
|
|
174
237
|
*
|
|
175
|
-
* For delegation transactions,
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
* 3. The user key is at index 0 in the fromAddresses array (BitGo convention: [user, bitgo, backup])
|
|
238
|
+
* For delegation transactions, the user's address at index 0 is used as the default
|
|
239
|
+
* reward address parameter (though the parameter has no on-chain effect - rewards
|
|
240
|
+
* go to C-chain addresses derived from the P-chain addresses in stake outputs).
|
|
179
241
|
*
|
|
180
242
|
* @returns Buffer containing the user's address
|
|
181
243
|
* @protected
|
|
182
244
|
*/
|
|
183
245
|
getUserAddress() {
|
|
184
|
-
const userIndex = 0;
|
|
246
|
+
const userIndex = 0; // BitGo convention: user is always at index 0
|
|
185
247
|
if (!this.transaction._fromAddresses || this.transaction._fromAddresses.length <= userIndex) {
|
|
186
248
|
throw new sdk_core_1.BuildTransactionError('User address (index 0) is required for delegation');
|
|
187
249
|
}
|
|
@@ -196,8 +258,9 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
196
258
|
* Uses pvm.e.newAddPermissionlessDelegatorTx (post-Etna API).
|
|
197
259
|
*
|
|
198
260
|
* Note: The rewardAddresses parameter is accepted by the API but does NOT affect
|
|
199
|
-
* where rewards are sent on-chain
|
|
200
|
-
*
|
|
261
|
+
* where rewards are sent on-chain. Rewards accrue to C-chain addresses derived
|
|
262
|
+
* from the P-chain addresses in the stake outputs. The stake outputs contain the
|
|
263
|
+
* addresses from fromAddressesBytes (sorted to match UTXO owner order).
|
|
201
264
|
* @protected
|
|
202
265
|
*/
|
|
203
266
|
buildFlareTransaction() {
|
|
@@ -226,20 +289,26 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
226
289
|
throw new sdk_core_1.BuildTransactionError('Fee state is required for delegation');
|
|
227
290
|
}
|
|
228
291
|
this.validateStakeDuration(this._startTime, this._endTime);
|
|
292
|
+
// Compute addressesIndex to map wallet key indices to sorted UTXO address positions
|
|
293
|
+
this.computeAddressesIndex();
|
|
229
294
|
// Convert decoded UTXOs to FlareJS Utxo objects
|
|
230
295
|
if (!this.transaction._utxos || this.transaction._utxos.length === 0) {
|
|
231
296
|
throw new sdk_core_1.BuildTransactionError('UTXOs are required for delegation');
|
|
232
297
|
}
|
|
233
298
|
const utxos = utils_1.default.decodedToUtxos(this.transaction._utxos, this.transaction._network.assetId);
|
|
234
|
-
//
|
|
235
|
-
// This ensures the C-chain reward address is derived from the user's public key
|
|
299
|
+
// Get user address for default reward address derivation
|
|
236
300
|
const userAddress = this.getUserAddress();
|
|
237
301
|
const rewardAddresses = this.transaction._rewardAddresses.length > 0 ? this.transaction._rewardAddresses : [userAddress];
|
|
238
302
|
// Use Etna (post-fork) API - pvm.e.newAddPermissionlessDelegatorTx
|
|
303
|
+
// IMPORTANT: Use getSigningAddresses() to get the correct 2 signing keys
|
|
304
|
+
// This ensures proper key selection for both normal and recovery modes:
|
|
305
|
+
// - Normal mode: user (index 0) + bitgo (index 1)
|
|
306
|
+
// - Recovery mode: backup (index 2) + bitgo (index 1)
|
|
307
|
+
const signingAddresses = this.getSigningAddresses();
|
|
239
308
|
const delegatorTx = flarejs_1.pvm.e.newAddPermissionlessDelegatorTx({
|
|
240
309
|
end: this._endTime,
|
|
241
310
|
feeState: this._feeState,
|
|
242
|
-
fromAddressesBytes:
|
|
311
|
+
fromAddressesBytes: signingAddresses,
|
|
243
312
|
nodeId: this._nodeID,
|
|
244
313
|
rewardAddresses: rewardAddresses,
|
|
245
314
|
start: this._startTime,
|
|
@@ -247,7 +316,72 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
247
316
|
utxos,
|
|
248
317
|
weight: this._stakeAmount,
|
|
249
318
|
}, this.transaction._context);
|
|
250
|
-
|
|
319
|
+
// Fix change output threshold bug (same as ExportInPTxBuilder)
|
|
320
|
+
const flareUnsignedTx = delegatorTx;
|
|
321
|
+
const innerTx = flareUnsignedTx.getTx();
|
|
322
|
+
const changeOutputs = innerTx.baseTx.outputs;
|
|
323
|
+
let correctedDelegatorTx = innerTx;
|
|
324
|
+
if (changeOutputs.length > 0 && this.transaction._threshold > 1) {
|
|
325
|
+
// Only apply fix for multisig wallets (threshold > 1)
|
|
326
|
+
const allWalletAddresses = this.transaction._fromAddresses.map((addr) => Buffer.from(addr));
|
|
327
|
+
const correctedChangeOutputs = changeOutputs.map((output) => {
|
|
328
|
+
const transferOut = output.output;
|
|
329
|
+
const assetIdStr = utils_1.default.flareIdString(Buffer.from(output.assetId.toBytes()).toString('hex')).toString();
|
|
330
|
+
return flarejs_1.TransferableOutput.fromNative(assetIdStr, transferOut.amount(), allWalletAddresses, this.transaction._locktime, this.transaction._threshold // Fix: use wallet's threshold instead of FlareJS's default (1)
|
|
331
|
+
);
|
|
332
|
+
});
|
|
333
|
+
correctedDelegatorTx = this.createCorrectedDelegatorTx(innerTx, correctedChangeOutputs);
|
|
334
|
+
}
|
|
335
|
+
// Recreate credentials and addressMaps from corrected transaction inputs
|
|
336
|
+
// This follows the same pattern as ExportInPTxBuilder to ensure proper signing
|
|
337
|
+
const utxosWithIndex = correctedDelegatorTx.baseTx.inputs.map((input) => {
|
|
338
|
+
const inputTxid = utils_1.default.cb58Encode(Buffer.from(input.utxoID.txID.toBytes()));
|
|
339
|
+
const inputOutputIdx = input.utxoID.outputIdx.value().toString();
|
|
340
|
+
const originalUtxo = this.transaction._utxos.find((utxo) => utxo.txid === inputTxid && utxo.outputidx === inputOutputIdx);
|
|
341
|
+
if (!originalUtxo) {
|
|
342
|
+
throw new sdk_core_1.BuildTransactionError(`Could not find matching UTXO for input ${inputTxid}:${inputOutputIdx}`);
|
|
343
|
+
}
|
|
344
|
+
const transferInput = input.input;
|
|
345
|
+
const actualSigIndices = transferInput.sigIndicies();
|
|
346
|
+
return {
|
|
347
|
+
...originalUtxo,
|
|
348
|
+
addressesIndex: originalUtxo.addressesIndex,
|
|
349
|
+
addresses: originalUtxo.addresses,
|
|
350
|
+
threshold: originalUtxo.threshold || this.transaction._threshold,
|
|
351
|
+
actualSigIndices,
|
|
352
|
+
};
|
|
353
|
+
});
|
|
354
|
+
this.transaction._utxos = utxosWithIndex;
|
|
355
|
+
const txCredentials = utxosWithIndex.map((utxo) => this.createCredentialForUtxo(utxo, utxo.threshold, utxo.actualSigIndices));
|
|
356
|
+
const addressMaps = utxosWithIndex.map((utxo) => this.createAddressMapForUtxo(utxo, utxo.threshold, utxo.actualSigIndices));
|
|
357
|
+
// Create new UnsignedTx with corrected change outputs and proper credentials
|
|
358
|
+
const fixedUnsignedTx = new flarejs_1.UnsignedTx(correctedDelegatorTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
|
|
359
|
+
this.transaction.setTransaction(fixedUnsignedTx);
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Create a corrected AddPermissionlessDelegatorTx with the given change outputs.
|
|
363
|
+
* This is necessary because FlareJS's newAddPermissionlessDelegatorTx doesn't support setting
|
|
364
|
+
* the threshold and locktime for change outputs - it defaults to threshold=1.
|
|
365
|
+
*
|
|
366
|
+
* FlareJS declares baseTx.outputs as readonly, so we use Object.defineProperty
|
|
367
|
+
* to override the property with the corrected outputs. This is a workaround until
|
|
368
|
+
* FlareJS adds proper support for change output thresholds.
|
|
369
|
+
*
|
|
370
|
+
* @param originalTx - The original AddPermissionlessDelegatorTx
|
|
371
|
+
* @param correctedOutputs - The corrected change outputs with proper threshold
|
|
372
|
+
* @returns A new AddPermissionlessDelegatorTx with the corrected change outputs
|
|
373
|
+
*/
|
|
374
|
+
createCorrectedDelegatorTx(originalTx, correctedOutputs) {
|
|
375
|
+
// FlareJS declares baseTx.outputs as `public readonly outputs: readonly TransferableOutput[]`
|
|
376
|
+
// We use Object.defineProperty to override the readonly property with our corrected outputs.
|
|
377
|
+
// This is necessary because FlareJS's newAddPermissionlessDelegatorTx doesn't support change output threshold/locktime.
|
|
378
|
+
Object.defineProperty(originalTx.baseTx, 'outputs', {
|
|
379
|
+
value: correctedOutputs,
|
|
380
|
+
writable: false,
|
|
381
|
+
enumerable: true,
|
|
382
|
+
configurable: true,
|
|
383
|
+
});
|
|
384
|
+
return originalTx;
|
|
251
385
|
}
|
|
252
386
|
/**
|
|
253
387
|
* Verify if the transaction type matches AddPermissionlessDelegatorTx
|
|
@@ -265,4 +399,4 @@ class PermissionlessDelegatorTxBuilder extends transactionBuilder_1.TransactionB
|
|
|
265
399
|
}
|
|
266
400
|
}
|
|
267
401
|
exports.PermissionlessDelegatorTxBuilder = PermissionlessDelegatorTxBuilder;
|
|
268
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVMrQjtBQUMvQiw4Q0FBdUY7QUFHdkYsNkRBQTBEO0FBQzFELG9EQUE0QjtBQUk1Qjs7Ozs7Ozs7R0FRRztBQUNILE1BQWEsZ0NBQWlDLFNBQVEsdUNBQWtCO0lBT3RFLFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsMEJBQTBCLENBQUM7SUFDcEQsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixjQUFjLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUN0RCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWM7UUFDaEMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDbkYsQ0FBQztRQUNGLElBQUksTUFBTSxHQUFHLGtCQUFrQixFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLGdDQUFxQixDQUM3QiwrQkFBK0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUNwRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxrQkFBa0I7SUFDbEI7Ozs7Ozs7O09BUUc7SUFDSCxhQUFhLENBQUMsT0FBZTtRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixHQUFHLENBQUMsZUFBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxNQUFjO1FBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLEtBQXNCO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxLQUFzQjtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsS0FBc0I7UUFDaEMsTUFBTSxXQUFXLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRLENBQUMsUUFBc0I7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxXQUFXLENBQUMsRUFBTSxFQUFFLFFBQWlCLEVBQUUsaUJBQWdDO1FBQ3JFLE1BQU0sV0FBVyxHQUFHLEVBQTRDLENBQUM7UUFFakUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxJQUFJLHVCQUFZLENBQUMscUVBQXFFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO1FBQ3hELElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3Qyw0Q0FBNEM7UUFDNUMsd0VBQXdFO1FBQ3hFLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDdkMsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLG1FQUFtRTtZQUNuRSxNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUF3QixDQUFDO1lBQ2pFLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUM7WUFDakQsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRyxDQUFDO1FBQ0gsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUM1RCxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLElBQUksRUFBRSxDQUFDO1FBRTVDLElBQUksUUFBUSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO1FBQzlDLENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsK0RBQStEO1FBQy9ELE1BQU0sVUFBVSxHQUFHLElBQUksb0JBQVUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLElBQUksZUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUVoRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLENBQUMsSUFBaUI7UUFDNUIsT0FBTyxnQ0FBZ0MsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVTLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNPLGNBQWM7UUFDdEIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUYsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHVEQUF1RCxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ08scUJBQXFCO1FBQzdCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUU1QywyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksZ0NBQXFCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixNQUFNLElBQUksZ0NBQXFCLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckYsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUzRCxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyRSxNQUFNLElBQUksZ0NBQXFCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsZUFBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRix5REFBeUQ7UUFDekQsZ0ZBQWdGO1FBQ2hGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUUxQyxNQUFNLGVBQWUsR0FDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5HLG1FQUFtRTtRQUNuRSxNQUFNLFdBQVcsR0FBRyxhQUFHLENBQUMsQ0FBQyxDQUFDLCtCQUErQixDQUN2RDtZQUNFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUNsQixRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDeEIsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDakMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3BCLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN0QixRQUFRLEVBQUUsb0JBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUU7WUFDaEQsS0FBSztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWTtTQUMxQixFQUNELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUMxQixDQUFDO1FBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBeUIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUFDLElBQWlCO1FBQ25DLE9BQU8sSUFBSSxLQUFLLHFCQUFXLENBQUMsNEJBQTRCLENBQUM7SUFDM0QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFjLFdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFjLFdBQVcsQ0FBQyxXQUF3QjtRQUNoRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0NBQ0Y7QUFwU0QsNEVBb1NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbiAgVHlwZVN5bWJvbHMsXG4gIHB2bSxcbiAgbmV0d29ya0lEcyxcbiAgVW5zaWduZWRUeCxcbiAgcHZtU2VyaWFsLFxuICBDcmVkZW50aWFsLFxuICBUcmFuc2Zlck91dHB1dCxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBGbHJwRmVlU3RhdGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IgdHJhbnNhY3Rpb25zIG9uIEZsYXJlIFAtQ2hhaW4uXG4gKlxuICogVGhpcyBidWlsZGVyIGNyZWF0ZXMgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMgd2hlcmUgYSB1c2VyIGRlbGVnYXRlcyBzdGFrZVxuICogdG8gYW4gZXhpc3RpbmcgdmFsaWRhdG9yLiBVbmxpa2UgQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3I6XG4gKiAtIE5vIEJMUyBrZXlzIHJlcXVpcmVkXG4gKiAtIERlbGVnYXRlcyB0byBhbiBleGlzdGluZyB2YWxpZGF0b3IncyBub2RlSURcbiAqIC0gUmV3YXJkcyBnbyB0byBjb3JyZXNwb25kaW5nIEMtY2hhaW4gYWRkcmVzc1xuICovXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX25vZGVJRDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHJvdGVjdGVkIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2ZlZVN0YXRlOiBGbHJwRmVlU3RhdGUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay50eEZlZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjtcbiAgfVxuXG4gIC8vIFZhbGlkYXRpb24gbWV0aG9kc1xuICB2YWxpZGF0ZU5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghbm9kZUlEKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIG5vZGVJRCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGVJRC5zdGFydHNXaXRoKCdOb2RlSUQtJykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgTm9kZUlEIHRhZycpO1xuICAgIH1cbiAgICBpZiAoIXV0aWxzLmlzVmFsaWROb2RlSUQobm9kZUlEKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogTm9kZUlEIGlzIG5vdCBpbiBjYjU4IGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VEdXJhdGlvbihzdGFydFRpbWU6IGJpZ2ludCwgZW5kVGltZTogYmlnaW50KTogdm9pZCB7XG4gICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCBkYXRlIGNhbm5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgZGF0ZScpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtaW5EZWxlZ2F0aW9uU3Rha2UgPSBCaWdJbnQoXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pbkRlbGVnYXRpb25TdGFrZSB8fCB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pblN0YWtlXG4gICAgKTtcbiAgICBpZiAoYW1vdW50IDwgbWluRGVsZWdhdGlvblN0YWtlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAnTWluaW11bSBkZWxlZ2F0aW9uIGFtb3VudCBpcyAnICsgTnVtYmVyKG1pbkRlbGVnYXRpb25TdGFrZSkgLyAxMDAwMDAwMDAwICsgJyBGTFIuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZGVyIG1ldGhvZHNcbiAgLyoqXG4gICAqXG4gICAqIE5PVEU6IE9uIEZsYXJlLCBzdGFraW5nIHJld2FyZHMgYXJlIGRpc3RyaWJ1dGVkIG9uIEMtY2hhaW4gKG5vdCBQLWNoYWluKS5cbiAgICogUmV3YXJkcyBnbyB0byB0aGUgQy1jaGFpbiBhZGRyZXNzIGRlcml2ZWQgZnJvbSB0aGUgc2FtZSBwdWJsaWMga2V5IGFzXG4gICAqIHRoZSBQLWNoYWluIHN0YWtpbmcgYWRkcmVzcy4gVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIHRoZSBGbGFyZUpTIEFQSVxuICAgKiBidXQgaGFzIE5PIG9uLWNoYWluIGVmZmVjdCBvbiByZXdhcmQgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyBQLWNoYWluIGFkZHJlc3MgaW4gQmVjaDMyIGZvcm1hdCAoZS5nLiwgXCJQLWZsYXJlMS4uLlwiIG9yIFwiUC1jb3N0d28xLi4uXCIpXG4gICAqL1xuICByZXdhcmRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IFt1dGlscy5wYXJzZUFkZHJlc3MoYWRkcmVzcyldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsaWRhdG9yIG5vZGUgSUQgdG8gZGVsZWdhdGUgdG9cbiAgICogQHBhcmFtIG5vZGVJRCBWYWxpZGF0b3Igbm9kZSBJRCBpbiBmb3JtYXQgXCJOb2RlSUQtLi4uXCJcbiAgICovXG4gIG5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVOb2RlSUQobm9kZUlEKTtcbiAgICB0aGlzLl9ub2RlSUQgPSBub2RlSUQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzdGFydCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIHN0YXJ0VGltZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGVuZCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIGVuZFRpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuX2VuZFRpbWUgPSBCaWdJbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgYW1vdW50IHRvIHN0YWtlL2RlbGVnYXRlXG4gICAqIEBwYXJhbSB2YWx1ZSBBbW91bnQgaW4gbmFub0ZMUiAod2VpKVxuICAgKi9cbiAgc3Rha2VBbW91bnQodmFsdWU6IGJpZ2ludCB8IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IHZhbHVlQmlnSW50ID0gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IHZhbHVlIDogQmlnSW50KHZhbHVlKTtcbiAgICB0aGlzLnZhbGlkYXRlU3Rha2VBbW91bnQodmFsdWVCaWdJbnQpO1xuICAgIHRoaXMuX3N0YWtlQW1vdW50ID0gdmFsdWVCaWdJbnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZlZVN0YXRlIEZlZSBzdGF0ZSBmcm9tIFAtY2hhaW5cbiAgICovXG4gIGZlZVN0YXRlKGZlZVN0YXRlOiBGbHJwRmVlU3RhdGUpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWVTdGF0ZSA9IGZlZVN0YXRlO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZVN0YXRlID0gZmVlU3RhdGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBidWlsZGVyIGZyb20gYSBwYXJzZWQgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeC5cbiAgICogVXNlZCB0byByZWNvbnN0cnVjdCB0aGUgYnVpbGRlciBzdGF0ZSBmcm9tIGEgcmF3IHRyYW5zYWN0aW9uIGZvciBzaWduaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdHggVGhlIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcmF3Qnl0ZXMgT3B0aW9uYWwgcmF3IHRyYW5zYWN0aW9uIGJ5dGVzXG4gICAqIEBwYXJhbSBwYXJzZWRDcmVkZW50aWFscyBPcHRpb25hbCBjcmVkZW50aWFscyBmcm9tIHRoZSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCwgcmF3Qnl0ZXM/OiBCdWZmZXIsIHBhcnNlZENyZWRlbnRpYWxzPzogQ3JlZGVudGlhbFtdKTogdGhpcyB7XG4gICAgY29uc3QgZGVsZWdhdG9yVHggPSB0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcblxuICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUoZGVsZWdhdG9yVHguX3R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB2YWxpZGF0b3IgaW5mbyAobm9kZUlELCBzdGFydFRpbWUsIGVuZFRpbWUsIHdlaWdodC9zdGFrZUFtb3VudClcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBkZWxlZ2F0b3JUeC5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yO1xuICAgIHRoaXMuX25vZGVJRCA9IHZhbGlkYXRvci5ub2RlSWQudG9TdHJpbmcoKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSB2YWxpZGF0b3Iuc3RhcnRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fZW5kVGltZSA9IHZhbGlkYXRvci5lbmRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fc3Rha2VBbW91bnQgPSB2YWxpZGF0b3Iud2VpZ2h0LnZhbHVlKCk7XG5cbiAgICAvLyBFeHRyYWN0IGZyb20gYWRkcmVzc2VzIGZyb20gc3Rha2Ugb3V0cHV0c1xuICAgIC8vIEluIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLCBzdGFrZSBvdXRwdXRzIGNvbnRhaW4gdGhlIG93bmVyIGFkZHJlc3Nlc1xuICAgIGNvbnN0IHN0YWtlT3V0cHV0cyA9IGRlbGVnYXRvclR4LnN0YWtlO1xuICAgIGlmIChzdGFrZU91dHB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RTdGFrZU91dHB1dCA9IHN0YWtlT3V0cHV0c1swXTtcbiAgICAgIC8vIFN0YWtlIG91dHB1dHMgdXNlIFRyYW5zZmVyT3V0cHV0IHR5cGUgd2l0aCBvdXRwdXRPd25lcnMgcHJvcGVydHlcbiAgICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0ID0gZmlyc3RTdGFrZU91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgICBjb25zdCBvdXRwdXRPd25lcnMgPSB0cmFuc2Zlck91dHB1dC5vdXRwdXRPd25lcnM7XG4gICAgICBpZiAob3V0cHV0T3duZXJzKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IG91dHB1dE93bmVycy50aHJlc2hvbGQudmFsdWUoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IG91dHB1dE93bmVycy5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCByZXdhcmQgYWRkcmVzc2VzIGZyb20gZGVsZWdhdG9yUmV3YXJkc093bmVyXG4gICAgY29uc3QgcmV3YXJkc093bmVyID0gZGVsZWdhdG9yVHguZ2V0RGVsZWdhdG9yUmV3YXJkc093bmVyKCk7XG4gICAgaWYgKHJld2FyZHNPd25lciAmJiByZXdhcmRzT3duZXIuYWRkcnMgJiYgcmV3YXJkc093bmVyLmFkZHJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IHJld2FyZHNPd25lci5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBwYXJzZWRDcmVkZW50aWFscyB8fCBbXTtcblxuICAgIGlmIChyYXdCeXRlcyAmJiBjcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yYXdTaWduZWRCeXRlcyA9IHJhd0J5dGVzO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgVW5zaWduZWRUeCB3aXRoIHBhcnNlZCBjcmVkZW50aWFsc1xuICAgIC8vIEFkZHJlc3NNYXBzIHdpbGwgYmUgZW1wdHkgYXMgdGhleSdyZSBjb21wdXRlZCBkdXJpbmcgc2lnbmluZ1xuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChkZWxlZ2F0b3JUeCwgW10sIG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXBzKFtdKSwgY3JlZGVudGlhbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YW5jZSBtZXRob2QgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHR5cGVcbiAgICogQHBhcmFtIHR5cGUgVHlwZVN5bWJvbCBmcm9tIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgdmVyaWZ5VHhUeXBlKHR5cGU6IFR5cGVTeW1ib2xzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eXBlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICBpZiAodGhpcy5oYXNTaWduZXIoKSkge1xuICAgICAgZm9yIChjb25zdCBrZXlQYWlyIG9mIHRoaXMuX3NpZ25lcikge1xuICAgICAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uLnNpZ24oa2V5UGFpcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcidzIGFkZHJlc3MgKGluZGV4IDApIGZvciBkZWxlZ2F0aW9uLlxuICAgKlxuICAgKiBGb3IgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMsIHdlIHVzZSBvbmx5IHRoZSB1c2VyIGtleSBiZWNhdXNlOlxuICAgKiAxLiBPbi1jaGFpbiByZXdhcmRzIGdvIHRvIHRoZSBDLWNoYWluIGFkZHJlc3MgZGVyaXZlZCBmcm9tIHRoZSBkZWxlZ2F0b3IncyBwdWJsaWMga2V5XG4gICAqIDIuIFVzaW5nIHRoZSB1c2VyIGtleSBlbnN1cmVzIHJld2FyZHMgZ28gdG8gdGhlIHVzZXIncyBjb3JyZXNwb25kaW5nIEMtY2hhaW4gYWRkcmVzc1xuICAgKiAzLiBUaGUgdXNlciBrZXkgaXMgYXQgaW5kZXggMCBpbiB0aGUgZnJvbUFkZHJlc3NlcyBhcnJheSAoQml0R28gY29udmVudGlvbjogW3VzZXIsIGJpdGdvLCBiYWNrdXBdKVxuICAgKlxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgdXNlcidzIGFkZHJlc3NcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVzZXJBZGRyZXNzKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgdXNlckluZGV4ID0gMDtcbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgfHwgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5sZW5ndGggPD0gdXNlckluZGV4KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVc2VyIGFkZHJlc3MgKGluZGV4IDApIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJBZGRyZXNzID0gQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1t1c2VySW5kZXhdKTtcbiAgICBpZiAodXNlckFkZHJlc3MubGVuZ3RoICE9PSAyMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB1c2VyIGFkZHJlc3MgbGVuZ3RoOiBleHBlY3RlZCAyMCBieXRlcywgZ290ICR7dXNlckFkZHJlc3MubGVuZ3RofWApO1xuICAgIH1cbiAgICByZXR1cm4gdXNlckFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHBlcm1pc3Npb25sZXNzIGRlbGVnYXRvciB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZUpTLlxuICAgKiBVc2VzIHB2bS5lLm5ld0FkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggKHBvc3QtRXRuYSBBUEkpLlxuICAgKlxuICAgKiBOb3RlOiBUaGUgcmV3YXJkQWRkcmVzc2VzIHBhcmFtZXRlciBpcyBhY2NlcHRlZCBieSB0aGUgQVBJIGJ1dCBkb2VzIE5PVCBhZmZlY3RcbiAgICogd2hlcmUgcmV3YXJkcyBhcmUgc2VudCBvbi1jaGFpbiAtIHJld2FyZHMgYWx3YXlzIGdvIHRvIHRoZSBDLWNoYWluIGFkZHJlc3NcbiAgICogZGVyaXZlZCBmcm9tIHRoZSBkZWxlZ2F0b3IncyBwdWJsaWMga2V5ICh1c2VyIGtleSBhdCBpbmRleCAwKS5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCF0aGlzLl9ub2RlSUQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vZGVJRCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU3RhcnQgdGltZSBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2VuZFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCB0aW1lIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3Rha2VBbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1N0YWtlIGFtb3VudCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2NvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0NvbnRleHQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzIHx8IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdGcm9tIGFkZHJlc3NlcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9mZWVTdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRmVlIHN0YXRlIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZVN0YWtlRHVyYXRpb24odGhpcy5fc3RhcnRUaW1lLCB0aGlzLl9lbmRUaW1lKTtcblxuICAgIC8vIENvbnZlcnQgZGVjb2RlZCBVVFhPcyB0byBGbGFyZUpTIFV0eG8gb2JqZWN0c1xuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MgfHwgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVVFhPcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgdXR4b3MgPSB1dGlscy5kZWNvZGVkVG9VdHhvcyh0aGlzLnRyYW5zYWN0aW9uLl91dHhvcywgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5hc3NldElkKTtcblxuICAgIC8vIFVzZSBvbmx5IHRoZSB1c2VyIGtleSAoaW5kZXggMCkgZm9yIGZyb21BZGRyZXNzZXNCeXRlc1xuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGUgQy1jaGFpbiByZXdhcmQgYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIHVzZXIncyBwdWJsaWMga2V5XG4gICAgY29uc3QgdXNlckFkZHJlc3MgPSB0aGlzLmdldFVzZXJBZGRyZXNzKCk7XG5cbiAgICBjb25zdCByZXdhcmRBZGRyZXNzZXMgPVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fcmV3YXJkQWRkcmVzc2VzLmxlbmd0aCA+IDAgPyB0aGlzLnRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMgOiBbdXNlckFkZHJlc3NdO1xuXG4gICAgLy8gVXNlIEV0bmEgKHBvc3QtZm9yaykgQVBJIC0gcHZtLmUubmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeFxuICAgIGNvbnN0IGRlbGVnYXRvclR4ID0gcHZtLmUubmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeChcbiAgICAgIHtcbiAgICAgICAgZW5kOiB0aGlzLl9lbmRUaW1lLFxuICAgICAgICBmZWVTdGF0ZTogdGhpcy5fZmVlU3RhdGUsXG4gICAgICAgIGZyb21BZGRyZXNzZXNCeXRlczogW3VzZXJBZGRyZXNzXSxcbiAgICAgICAgbm9kZUlkOiB0aGlzLl9ub2RlSUQsXG4gICAgICAgIHJld2FyZEFkZHJlc3NlczogcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgICBzdGFydDogdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgICBzdWJuZXRJZDogbmV0d29ya0lEcy5QcmltYXJ5TmV0d29ya0lELnRvU3RyaW5nKCksXG4gICAgICAgIHV0eG9zLFxuICAgICAgICB3ZWlnaHQ6IHRoaXMuX3N0YWtlQW1vdW50LFxuICAgICAgfSxcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2NvbnRleHRcbiAgICApO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihkZWxlZ2F0b3JUeCBhcyBVbnNpZ25lZFR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgaWYgdGhlIHRyYW5zYWN0aW9uIHR5cGUgbWF0Y2hlcyBBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4XG4gICAqIEBwYXJhbSB0eXBlIFR5cGVTeW1ib2wgZnJvbSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHlwZTogVHlwZVN5bWJvbHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gVHlwZVN5bWJvbHMuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cbn1cbiJdfQ==
|
|
402
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Blcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVkrQjtBQUMvQiw4Q0FBdUY7QUFHdkYseUVBQXNFO0FBQ3RFLG9EQUE0QjtBQUk1Qjs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQWEsZ0NBQWlDLFNBQVEsbURBQXdCO0lBTzVFLFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDOUQsQ0FBQztJQUVELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsMEJBQTBCLENBQUM7SUFDcEQsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixjQUFjLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksZ0NBQXFCLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsbURBQW1ELENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUN0RCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUN4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WUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0NBSUY7QUE1ZEQsNEVBNGRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbiAgVHlwZVN5bWJvbHMsXG4gIHB2bSxcbiAgbmV0d29ya0lEcyxcbiAgVW5zaWduZWRUeCxcbiAgcHZtU2VyaWFsLFxuICBDcmVkZW50aWFsLFxuICBUcmFuc2Zlck91dHB1dCxcbiAgVHJhbnNmZXJhYmxlT3V0cHV0LFxuICBUcmFuc2ZlcklucHV0LFxuICBUcmFuc2ZlcmFibGVJbnB1dCxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2F0b21pY1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBGbHJwRmVlU3RhdGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IFR4LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuXG4vKipcbiAqIEJ1aWxkZXIgZm9yIEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yIHRyYW5zYWN0aW9ucyBvbiBGbGFyZSBQLUNoYWluLlxuICpcbiAqIFRoaXMgYnVpbGRlciBjcmVhdGVzIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zIHdoZXJlIGEgdXNlciBkZWxlZ2F0ZXMgc3Rha2VcbiAqIHRvIGFuIGV4aXN0aW5nIHZhbGlkYXRvci4gVW5saWtlIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICogLSBObyBCTFMga2V5cyByZXF1aXJlZFxuICogLSBEZWxlZ2F0ZXMgdG8gYW4gZXhpc3RpbmcgdmFsaWRhdG9yJ3Mgbm9kZUlEXG4gKiAtIFJld2FyZHMgZ28gdG8gY29ycmVzcG9uZGluZyBDLWNoYWluIGFkZHJlc3NcbiAqXG4gKiBFeHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB0byBpbmhlcml0IGFkZHJlc3Mgc29ydGluZyBhbmQgY3JlZGVudGlhbCBtYW5hZ2VtZW50XG4gKiBsb2dpYyBuZWVkZWQgZm9yIHByb3BlciBtdWx0aXNpZyBVVFhPIGhhbmRsaW5nLlxuICovXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIgZXh0ZW5kcyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgX25vZGVJRDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHJvdGVjdGVkIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwcm90ZWN0ZWQgX2ZlZVN0YXRlOiBGbHJwRmVlU3RhdGUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay50eEZlZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjtcbiAgfVxuXG4gIC8vIFZhbGlkYXRpb24gbWV0aG9kc1xuICB2YWxpZGF0ZU5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghbm9kZUlEKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIG5vZGVJRCcpO1xuICAgIH1cbiAgICBpZiAoIW5vZGVJRC5zdGFydHNXaXRoKCdOb2RlSUQtJykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgTm9kZUlEIHRhZycpO1xuICAgIH1cbiAgICBpZiAoIXV0aWxzLmlzVmFsaWROb2RlSUQobm9kZUlEKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogTm9kZUlEIGlzIG5vdCBpbiBjYjU4IGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VEdXJhdGlvbihzdGFydFRpbWU6IGJpZ2ludCwgZW5kVGltZTogYmlnaW50KTogdm9pZCB7XG4gICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCBkYXRlIGNhbm5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgZGF0ZScpO1xuICAgIH1cbiAgICAvLyBOb3RlOiBNaW5pbXVtIGR1cmF0aW9uIHZhbGlkYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbmV0d29yay5cbiAgICAvLyBGbGFyZSBQLWNoYWluIHJlcXVpcmVzIG1pbmltdW0gMTQgZGF5cyBmb3IgZGVsZWdhdGlvbi5cbiAgfVxuXG4gIHZhbGlkYXRlU3Rha2VBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBjb25zdCBtaW5EZWxlZ2F0aW9uU3Rha2UgPSBCaWdJbnQoXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pbkRlbGVnYXRpb25TdGFrZSB8fCB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pblN0YWtlXG4gICAgKTtcbiAgICBpZiAoYW1vdW50IDwgbWluRGVsZWdhdGlvblN0YWtlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAnTWluaW11bSBkZWxlZ2F0aW9uIGFtb3VudCBpcyAnICsgTnVtYmVyKG1pbkRlbGVnYXRpb25TdGFrZSkgLyAxMDAwMDAwMDAwICsgJyBGTFIuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZGVyIG1ldGhvZHNcbiAgLyoqXG4gICAqXG4gICAqIE5PVEU6IE9uIEZsYXJlLCBzdGFraW5nIHJld2FyZHMgYXJlIGRpc3RyaWJ1dGVkIG9uIEMtY2hhaW4gKG5vdCBQLWNoYWluKS5cbiAgICogUmV3YXJkcyBnbyB0byB0aGUgQy1jaGFpbiBhZGRyZXNzIGRlcml2ZWQgZnJvbSB0aGUgc2FtZSBwdWJsaWMga2V5IGFzXG4gICAqIHRoZSBQLWNoYWluIHN0YWtpbmcgYWRkcmVzcy4gVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIHRoZSBGbGFyZUpTIEFQSVxuICAgKiBidXQgaGFzIE5PIG9uLWNoYWluIGVmZmVjdCBvbiByZXdhcmQgZGlzdHJpYnV0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyBQLWNoYWluIGFkZHJlc3MgaW4gQmVjaDMyIGZvcm1hdCAoZS5nLiwgXCJQLWZsYXJlMS4uLlwiIG9yIFwiUC1jb3N0d28xLi4uXCIpXG4gICAqL1xuICByZXdhcmRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IFt1dGlscy5wYXJzZUFkZHJlc3MoYWRkcmVzcyldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmFsaWRhdG9yIG5vZGUgSUQgdG8gZGVsZWdhdGUgdG9cbiAgICogQHBhcmFtIG5vZGVJRCBWYWxpZGF0b3Igbm9kZSBJRCBpbiBmb3JtYXQgXCJOb2RlSUQtLi4uXCJcbiAgICovXG4gIG5vZGVJRChub2RlSUQ6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVOb2RlSUQobm9kZUlEKTtcbiAgICB0aGlzLl9ub2RlSUQgPSBub2RlSUQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzdGFydCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIHN0YXJ0VGltZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGVuZCB0aW1lIGZvciB0aGUgZGVsZWdhdGlvbiBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlIFVuaXggdGltZXN0YW1wIGluIHNlY29uZHNcbiAgICovXG4gIGVuZFRpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuX2VuZFRpbWUgPSBCaWdJbnQodmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgYW1vdW50IHRvIHN0YWtlL2RlbGVnYXRlXG4gICAqIEBwYXJhbSB2YWx1ZSBBbW91bnQgaW4gbmFub0ZMUiAod2VpKVxuICAgKi9cbiAgc3Rha2VBbW91bnQodmFsdWU6IGJpZ2ludCB8IHN0cmluZyk6IHRoaXMge1xuICAgIGNvbnN0IHZhbHVlQmlnSW50ID0gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyA/IHZhbHVlIDogQmlnSW50KHZhbHVlKTtcbiAgICB0aGlzLnZhbGlkYXRlU3Rha2VBbW91bnQodmFsdWVCaWdJbnQpO1xuICAgIHRoaXMuX3N0YWtlQW1vdW50ID0gdmFsdWVCaWdJbnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGZlZVN0YXRlIEZlZSBzdGF0ZSBmcm9tIFAtY2hhaW5cbiAgICovXG4gIGZlZVN0YXRlKGZlZVN0YXRlOiBGbHJwRmVlU3RhdGUpOiB0aGlzIHtcbiAgICB0aGlzLl9mZWVTdGF0ZSA9IGZlZVN0YXRlO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZVN0YXRlID0gZmVlU3RhdGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBidWlsZGVyIGZyb20gYSBwYXJzZWQgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeC5cbiAgICogVXNlZCB0byByZWNvbnN0cnVjdCB0aGUgYnVpbGRlciBzdGF0ZSBmcm9tIGEgcmF3IHRyYW5zYWN0aW9uIGZvciBzaWduaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdHggVGhlIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcmF3Qnl0ZXMgT3B0aW9uYWwgcmF3IHRyYW5zYWN0aW9uIGJ5dGVzXG4gICAqIEBwYXJhbSBwYXJzZWRDcmVkZW50aWFscyBPcHRpb25hbCBjcmVkZW50aWFscyBmcm9tIHRoZSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCwgcmF3Qnl0ZXM/OiBCdWZmZXIsIHBhcnNlZENyZWRlbnRpYWxzPzogQ3JlZGVudGlhbFtdKTogdGhpcyB7XG4gICAgY29uc3QgZGVsZWdhdG9yVHggPSB0eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcblxuICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUoZGVsZWdhdG9yVHguX3R5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB2YWxpZGF0b3IgaW5mbyAobm9kZUlELCBzdGFydFRpbWUsIGVuZFRpbWUsIHdlaWdodC9zdGFrZUFtb3VudClcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBkZWxlZ2F0b3JUeC5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yO1xuICAgIHRoaXMuX25vZGVJRCA9IHZhbGlkYXRvci5ub2RlSWQudG9TdHJpbmcoKTtcbiAgICB0aGlzLl9zdGFydFRpbWUgPSB2YWxpZGF0b3Iuc3RhcnRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fZW5kVGltZSA9IHZhbGlkYXRvci5lbmRUaW1lLnZhbHVlKCk7XG4gICAgdGhpcy5fc3Rha2VBbW91bnQgPSB2YWxpZGF0b3Iud2VpZ2h0LnZhbHVlKCk7XG5cbiAgICAvLyBFeHRyYWN0IGZyb20gYWRkcmVzc2VzIGZyb20gc3Rha2Ugb3V0cHV0c1xuICAgIC8vIEluIGRlbGVnYXRpb24gdHJhbnNhY3Rpb25zLCBzdGFrZSBvdXRwdXRzIGNvbnRhaW4gdGhlIG93bmVyIGFkZHJlc3Nlc1xuICAgIGNvbnN0IHN0YWtlT3V0cHV0cyA9IGRlbGVnYXRvclR4LnN0YWtlO1xuICAgIGlmIChzdGFrZU91dHB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RTdGFrZU91dHB1dCA9IHN0YWtlT3V0cHV0c1swXTtcbiAgICAgIC8vIFN0YWtlIG91dHB1dHMgdXNlIFRyYW5zZmVyT3V0cHV0IHR5cGUgd2l0aCBvdXRwdXRPd25lcnMgcHJvcGVydHlcbiAgICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0ID0gZmlyc3RTdGFrZU91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgICBjb25zdCBvdXRwdXRPd25lcnMgPSB0cmFuc2Zlck91dHB1dC5vdXRwdXRPd25lcnM7XG4gICAgICBpZiAob3V0cHV0T3duZXJzKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IG91dHB1dE93bmVycy50aHJlc2hvbGQudmFsdWUoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IG91dHB1dE93bmVycy5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCByZXdhcmQgYWRkcmVzc2VzIGZyb20gZGVsZWdhdG9yUmV3YXJkc093bmVyXG4gICAgY29uc3QgcmV3YXJkc093bmVyID0gZGVsZWdhdG9yVHguZ2V0RGVsZWdhdG9yUmV3YXJkc093bmVyKCk7XG4gICAgaWYgKHJld2FyZHNPd25lciAmJiByZXdhcmRzT3duZXIuYWRkcnMgJiYgcmV3YXJkc093bmVyLmFkZHJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA9IHJld2FyZHNPd25lci5hZGRycy5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIudG9CeXRlcygpKSk7XG4gICAgfVxuXG4gICAgLy8gUmVjb3ZlciBVVFhPcyBmcm9tIGJhc2VUeCBpbnB1dHMgdXNpbmcgc3Rha2Ugb3V0cHV0IGFkZHJlc3NlcyBhcyBwcm94eVxuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zID0gdGhpcy5yZWNvdmVyVXR4b3NGcm9tSW5wdXRzKFxuICAgICAgWy4uLmRlbGVnYXRvclR4LmJhc2VUeC5pbnB1dHNdLFxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc1xuICAgICk7XG5cbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHBhcnNlZENyZWRlbnRpYWxzIHx8IFtdO1xuXG4gICAgaWYgKHJhd0J5dGVzICYmIGNyZWRlbnRpYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uX3Jhd1NpZ25lZEJ5dGVzID0gcmF3Qnl0ZXM7XG4gICAgfVxuXG4gICAgLy8gQ29tcHV0ZSBhZGRyZXNzZXNJbmRleCB0byBtYXAgd2FsbGV0IHBvc2l0aW9ucyB0byBzb3J0ZWQgVVRYTyBwb3NpdGlvbnNcbiAgICAvLyBGb3JjZSByZWNvbXB1dGUgdG8gZW5zdXJlIGZyZXNoIG1hcHBpbmcgZnJvbSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICB0aGlzLmNvbXB1dGVBZGRyZXNzZXNJbmRleCh0cnVlKTtcblxuICAgIC8vIFVzZSBwYXJzZWQgY3JlZGVudGlhbHMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY3JlYXRlIG5ldyBvbmVzIGJhc2VkIG9uIHNpZ0luZGljZXNcbiAgICAvLyBUaGUgc2lnSW5kaWNlcyBmcm9tIHRoZSBwYXJzZWQgdHJhbnNhY3Rpb24gKHN0b3JlZCBpbiBhZGRyZXNzZXNJbmRleCkgZGV0ZXJtaW5lXG4gICAgLy8gdGhlIGNvcnJlY3QgY3JlZGVudGlhbCBvcmRlcmluZyBmb3Igb24tY2hhaW4gdmVyaWZpY2F0aW9uXG4gICAgY29uc3QgdHhDcmVkZW50aWFscyA9XG4gICAgICBjcmVkZW50aWFscy5sZW5ndGggPiAwXG4gICAgICAgID8gY3JlZGVudGlhbHNcbiAgICAgICAgOiB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcy5tYXAoKHV0eG8pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHV0eG9UaHJlc2hvbGQgPSB1dHhvLnRocmVzaG9sZCB8fCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQ7XG4gICAgICAgICAgICBjb25zdCBzaWdJbmRpY2VzID0gdXR4by5hZGRyZXNzZXNJbmRleCA/PyBbXTtcbiAgICAgICAgICAgIC8vIFVzZSBzaWdJbmRpY2VzLWJhc2VkIG1ldGhvZCBpZiB3ZSBoYXZlIHZhbGlkIHNpZ0luZGljZXMgZnJvbSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgIGlmIChzaWdJbmRpY2VzLmxlbmd0aCA+PSB1dHhvVGhyZXNob2xkICYmIHNpZ0luZGljZXMuZXZlcnkoKGlkeCkgPT4gaWR4ID49IDApKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUNyZWRlbnRpYWxGb3JVdHhvKHV0eG8sIHV0eG9UaHJlc2hvbGQsIHNpZ0luZGljZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ3JlZGVudGlhbEZvclV0eG8odXR4bywgdXR4b1RocmVzaG9sZCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYWRkcmVzc01hcHMgdXNpbmcgc2lnSW5kaWNlcyBmcm9tIHBhcnNlZCB0cmFuc2FjdGlvbiBmb3IgY29uc2lzdGVuY3lcbiAgICBjb25zdCBhZGRyZXNzTWFwcyA9IHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zLm1hcCgodXR4bykgPT4ge1xuICAgICAgY29uc3QgdXR4b1RocmVzaG9sZCA9IHV0eG8udGhyZXNob2xkIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDtcbiAgICAgIGNvbnN0IHNpZ0luZGljZXMgPSB1dHhvLmFkZHJlc3Nlc0luZGV4ID8/IFtdO1xuICAgICAgaWYgKHNpZ0luZGljZXMubGVuZ3RoID49IHV0eG9UaHJlc2hvbGQgJiYgc2lnSW5kaWNlcy5ldmVyeSgoaWR4KSA9PiBpZHggPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQWRkcmVzc01hcEZvclV0eG8odXR4bywgdXR4b1RocmVzaG9sZCwgc2lnSW5kaWNlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVBZGRyZXNzTWFwRm9yVXR4byh1dHhvLCB1dHhvVGhyZXNob2xkKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChkZWxlZ2F0b3JUeCwgW10sIG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXBzKGFkZHJlc3NNYXBzKSwgdHhDcmVkZW50aWFscyk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHVuc2lnbmVkVHgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbmNlIG1ldGhvZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAcGFyYW0gdHlwZSBUeXBlU3ltYm9sIGZyb20gcGFyc2VkIHRyYW5zYWN0aW9uXG4gICAqL1xuICB2ZXJpZnlUeFR5cGUodHlwZTogVHlwZVN5bWJvbHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgVVRYT3MgZnJvbSB0cmFuc2FjdGlvbiBpbnB1dHMuXG4gICAqIFVzZXMgZnJvbUFkZHJlc3NlcyBhcyBwcm94eSBmb3IgVVRYTyBhZGRyZXNzZXMgc2luY2Ugd2UncmUgcmVjb25zdHJ1Y3RpbmcgZnJvbSBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBBcnJheSBvZiBUcmFuc2ZlcmFibGVJbnB1dCBmcm9tIGJhc2VUeFxuICAgKiBAcGFyYW0gZnJvbUFkZHJlc3NlcyBXYWxsZXQgYWRkcmVzc2VzIHRvIHVzZSBhcyBwcm94eSBmb3IgVVRYTyBhZGRyZXNzZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgZGVjb2RlZCBVVFhPIG9iamVjdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVjb3ZlclV0eG9zRnJvbUlucHV0cyhpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10sIGZyb21BZGRyZXNzZXM6IFVpbnQ4QXJyYXlbXSk6IERlY29kZWRVdHhvT2JqW10ge1xuICAgIGNvbnN0IHByb3h5QWRkcmVzc2VzID0gZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+XG4gICAgICB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5ocnAsIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYWxpYXMsIEJ1ZmZlci5mcm9tKGFkZHIpKVxuICAgICk7XG5cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHV0eG9JZCA9IGlucHV0LnV0eG9JRDtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5wdXQgPSBpbnB1dC5pbnB1dCBhcyBUcmFuc2ZlcklucHV0O1xuICAgICAgY29uc3Qgc2lnSW5kaWNpZXMgPSB0cmFuc2ZlcklucHV0LnNpZ0luZGljaWVzKCk7XG5cbiAgICAgIGNvbnN0IHV0eG86IERlY29kZWRVdHhvT2JqID0ge1xuICAgICAgICBvdXRwdXRJRDogNywgLy8gU0VDUDI1NksxIFRyYW5zZmVyIE91dHB1dCB0eXBlXG4gICAgICAgIGFtb3VudDogaW5wdXQuYW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgdHhpZDogdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh1dHhvSWQudHhJRC50b0J5dGVzKCkpKSxcbiAgICAgICAgb3V0cHV0aWR4OiB1dHhvSWQub3V0cHV0SWR4LnZhbHVlKCkudG9TdHJpbmcoKSxcbiAgICAgICAgdGhyZXNob2xkOiBzaWdJbmRpY2llcy5sZW5ndGggfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHByb3h5QWRkcmVzc2VzLFxuICAgICAgICBhZGRyZXNzZXNJbmRleDogc2lnSW5kaWNpZXMsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHV0eG87XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgdGhpcy5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgaWYgKHRoaXMuaGFzU2lnbmVyKCkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5UGFpciBvZiB0aGlzLl9zaWduZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cmFuc2FjdGlvbi5zaWduKGtleVBhaXIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIncyBhZGRyZXNzIChpbmRleCAwKSBmb3IgZGVmYXVsdCByZXdhcmQgYWRkcmVzcy5cbiAgICpcbiAgICogQml0R28gQ29udmVudGlvbiBmb3IgZnJvbUFkZHJlc3NlczpcbiAgICogLSBJbmRleCAwOiBVc2VyIGtleSAoc2lnbmVyIGluIG5vcm1hbCBtb2RlKVxuICAgKiAtIEluZGV4IDE6IEJpdEdvIGtleSAoYWx3YXlzIGEgc2lnbmVyKVxuICAgKiAtIEluZGV4IDI6IEJhY2t1cCBrZXkgKHNpZ25lciBpbiByZWNvdmVyeSBtb2RlKVxuICAgKlxuICAgKiBGb3IgZGVsZWdhdGlvbiB0cmFuc2FjdGlvbnMsIHRoZSB1c2VyJ3MgYWRkcmVzcyBhdCBpbmRleCAwIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHRcbiAgICogcmV3YXJkIGFkZHJlc3MgcGFyYW1ldGVyICh0aG91Z2ggdGhlIHBhcmFtZXRlciBoYXMgbm8gb24tY2hhaW4gZWZmZWN0IC0gcmV3YXJkc1xuICAgKiBnbyB0byBDLWNoYWluIGFkZHJlc3NlcyBkZXJpdmVkIGZyb20gdGhlIFAtY2hhaW4gYWRkcmVzc2VzIGluIHN0YWtlIG91dHB1dHMpLlxuICAgKlxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgdXNlcidzIGFkZHJlc3NcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVzZXJBZGRyZXNzKCk6IEJ1ZmZlciB7XG4gICAgY29uc3QgdXNlckluZGV4ID0gMDsgLy8gQml0R28gY29udmVudGlvbjogdXNlciBpcyBhbHdheXMgYXQgaW5kZXggMFxuICAgIGlmICghdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyB8fCB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLmxlbmd0aCA8PSB1c2VySW5kZXgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VzZXIgYWRkcmVzcyAoaW5kZXggMCkgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckFkZHJlc3MgPSBCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzW3VzZXJJbmRleF0pO1xuICAgIGlmICh1c2VyQWRkcmVzcy5sZW5ndGggIT09IDIwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHVzZXIgYWRkcmVzcyBsZW5ndGg6IGV4cGVjdGVkIDIwIGJ5dGVzLCBnb3QgJHt1c2VyQWRkcmVzcy5sZW5ndGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB1c2VyQWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgcGVybWlzc2lvbmxlc3MgZGVsZWdhdG9yIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMuXG4gICAqIFVzZXMgcHZtLmUubmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeCAocG9zdC1FdG5hIEFQSSkuXG4gICAqXG4gICAqIE5vdGU6IFRoZSByZXdhcmRBZGRyZXNzZXMgcGFyYW1ldGVyIGlzIGFjY2VwdGVkIGJ5IHRoZSBBUEkgYnV0IGRvZXMgTk9UIGFmZmVjdFxuICAgKiB3aGVyZSByZXdhcmRzIGFyZSBzZW50IG9uLWNoYWluLiBSZXdhcmRzIGFjY3J1ZSB0byBDLWNoYWluIGFkZHJlc3NlcyBkZXJpdmVkXG4gICAqIGZyb20gdGhlIFAtY2hhaW4gYWRkcmVzc2VzIGluIHRoZSBzdGFrZSBvdXRwdXRzLiBUaGUgc3Rha2Ugb3V0cHV0cyBjb250YWluIHRoZVxuICAgKiBhZGRyZXNzZXMgZnJvbSBmcm9tQWRkcmVzc2VzQnl0ZXMgKHNvcnRlZCB0byBtYXRjaCBVVFhPIG93bmVyIG9yZGVyKS5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCF0aGlzLl9ub2RlSUQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ05vZGVJRCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3N0YXJ0VGltZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignU3RhcnQgdGltZSBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2VuZFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCB0aW1lIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3Rha2VBbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1N0YWtlIGFtb3VudCBpcyByZXF1aXJlZCBmb3IgZGVsZWdhdGlvbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2NvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0NvbnRleHQgaXMgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzIHx8IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdGcm9tIGFkZHJlc3NlcyBhcmUgcmVxdWlyZWQgZm9yIGRlbGVnYXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9mZWVTdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRmVlIHN0YXRlIGlzIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZVN0YWtlRHVyYXRpb24odGhpcy5fc3RhcnRUaW1lLCB0aGlzLl9lbmRUaW1lKTtcblxuICAgIC8vIENvbXB1dGUgYWRkcmVzc2VzSW5kZXggdG8gbWFwIHdhbGxldCBrZXkgaW5kaWNlcyB0byBzb3J0ZWQgVVRYTyBhZGRyZXNzIHBvc2l0aW9uc1xuICAgIHRoaXMuY29tcHV0ZUFkZHJlc3Nlc0luZGV4KCk7XG5cbiAgICAvLyBDb252ZXJ0IGRlY29kZWQgVVRYT3MgdG8gRmxhcmVKUyBVdHhvIG9iamVjdHNcbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX3V0eG9zIHx8IHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBkZWxlZ2F0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHV0eG9zID0gdXRpbHMuZGVjb2RlZFRvVXR4b3ModGhpcy50cmFuc2FjdGlvbi5fdXR4b3MsIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYXNzZXRJZCk7XG5cbiAgICAvLyBHZXQgdXNlciBhZGRyZXNzIGZvciBkZWZhdWx0IHJld2FyZCBhZGRyZXNzIGRlcml2YXRpb25cbiAgICBjb25zdCB1c2VyQWRkcmVzcyA9IHRoaXMuZ2V0VXNlckFkZHJlc3MoKTtcblxuICAgIGNvbnN0IHJld2FyZEFkZHJlc3NlcyA9XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMubGVuZ3RoID4gMCA/IHRoaXMudHJhbnNhY3Rpb24uX3Jld2FyZEFkZHJlc3NlcyA6IFt1c2VyQWRkcmVzc107XG5cbiAgICAvLyBVc2UgRXRuYSAocG9zdC1mb3JrKSBBUEkgLSBwdm0uZS5uZXdBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4XG4gICAgLy8gSU1QT1JUQU5UOiBVc2UgZ2V0U2lnbmluZ0FkZHJlc3NlcygpIHRvIGdldCB0aGUgY29ycmVjdCAyIHNpZ25pbmcga2V5c1xuICAgIC8vIFRoaXMgZW5zdXJlcyBwcm9wZXIga2V5IHNlbGVjdGlvbiBmb3IgYm90aCBub3JtYWwgYW5kIHJlY292ZXJ5IG1vZGVzOlxuICAgIC8vIC0gTm9ybWFsIG1vZGU6IHVzZXIgKGluZGV4IDApICsgYml0Z28gKGluZGV4IDEpXG4gICAgLy8gLSBSZWNvdmVyeSBtb2RlOiBiYWNrdXAgKGluZGV4IDIpICsgYml0Z28gKGluZGV4IDEpXG4gICAgY29uc3Qgc2lnbmluZ0FkZHJlc3NlcyA9IHRoaXMuZ2V0U2lnbmluZ0FkZHJlc3NlcygpO1xuXG4gICAgY29uc3QgZGVsZWdhdG9yVHggPSBwdm0uZS5uZXdBZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4KFxuICAgICAge1xuICAgICAgICBlbmQ6IHRoaXMuX2VuZFRpbWUsXG4gICAgICAgIGZlZVN0YXRlOiB0aGlzLl9mZWVTdGF0ZSxcbiAgICAgICAgZnJvbUFkZHJlc3Nlc0J5dGVzOiBzaWduaW5nQWRkcmVzc2VzLFxuICAgICAgICBub2RlSWQ6IHRoaXMuX25vZGVJRCxcbiAgICAgICAgcmV3YXJkQWRkcmVzc2VzOiByZXdhcmRBZGRyZXNzZXMsXG4gICAgICAgIHN0YXJ0OiB0aGlzLl9zdGFydFRpbWUsXG4gICAgICAgIHN1Ym5ldElkOiBuZXR3b3JrSURzLlByaW1hcnlOZXR3b3JrSUQudG9TdHJpbmcoKSxcbiAgICAgICAgdXR4b3MsXG4gICAgICAgIHdlaWdodDogdGhpcy5fc3Rha2VBbW91bnQsXG4gICAgICB9LFxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fY29udGV4dFxuICAgICk7XG5cbiAgICAvLyBGaXggY2hhbmdlIG91dHB1dCB0aHJlc2hvbGQgYnVnIChzYW1lIGFzIEV4cG9ydEluUFR4QnVpbGRlcilcbiAgICBjb25zdCBmbGFyZVVuc2lnbmVkVHggPSBkZWxlZ2F0b3JUeCBhcyBVbnNpZ25lZFR4O1xuICAgIGNvbnN0IGlubmVyVHggPSBmbGFyZVVuc2lnbmVkVHguZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeDtcbiAgICBjb25zdCBjaGFuZ2VPdXRwdXRzID0gaW5uZXJUeC5iYXNlVHgub3V0cHV0cztcbiAgICBsZXQgY29ycmVjdGVkRGVsZWdhdG9yVHg6IHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4ID0gaW5uZXJUeDtcblxuICAgIGlmIChjaGFuZ2VPdXRwdXRzLmxlbmd0aCA+IDAgJiYgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkID4gMSkge1xuICAgICAgLy8gT25seSBhcHBseSBmaXggZm9yIG11bHRpc2lnIHdhbGxldHMgKHRocmVzaG9sZCA+IDEpXG4gICAgICBjb25zdCBhbGxXYWxsZXRBZGRyZXNzZXMgPSB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkcikpO1xuXG4gICAgICBjb25zdCBjb3JyZWN0ZWRDaGFuZ2VPdXRwdXRzID0gY2hhbmdlT3V0cHV0cy5tYXAoKG91dHB1dCkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zlck91dCA9IG91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG5cbiAgICAgICAgY29uc3QgYXNzZXRJZFN0ciA9IHV0aWxzLmZsYXJlSWRTdHJpbmcoQnVmZmVyLmZyb20ob3V0cHV0LmFzc2V0SWQudG9CeXRlcygpKS50b1N0cmluZygnaGV4JykpLnRvU3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBUcmFuc2ZlcmFibGVPdXRwdXQuZnJvbU5hdGl2ZShcbiAgICAgICAgICBhc3NldElkU3RyLFxuICAgICAgICAgIHRyYW5zZmVyT3V0LmFtb3VudCgpLFxuICAgICAgICAgIGFsbFdhbGxldEFkZHJlc3NlcyxcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSxcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgLy8gRml4OiB1c2Ugd2FsbGV0J3MgdGhyZXNob2xkIGluc3RlYWQgb2YgRmxhcmVKUydzIGRlZmF1bHQgKDEpXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgY29ycmVjdGVkRGVsZWdhdG9yVHggPSB0aGlzLmNyZWF0ZUNvcnJlY3RlZERlbGVnYXRvclR4KGlubmVyVHgsIGNvcnJlY3RlZENoYW5nZU91dHB1dHMpO1xuICAgIH1cblxuICAgIC8vIFJlY3JlYXRlIGNyZWRlbnRpYWxzIGFuZCBhZGRyZXNzTWFwcyBmcm9tIGNvcnJlY3RlZCB0cmFuc2FjdGlvbiBpbnB1dHNcbiAgICAvLyBUaGlzIGZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBFeHBvcnRJblBUeEJ1aWxkZXIgdG8gZW5zdXJlIHByb3BlciBzaWduaW5nXG4gICAgY29uc3QgdXR4b3NXaXRoSW5kZXggPSBjb3JyZWN0ZWREZWxlZ2F0b3JUeC5iYXNlVHguaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0VHhpZCA9IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKSk7XG4gICAgICBjb25zdCBpbnB1dE91dHB1dElkeCA9IGlucHV0LnV0eG9JRC5vdXRwdXRJZHgudmFsdWUoKS50b1N0cmluZygpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFV0eG8gPSB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcy5maW5kKFxuICAgICAgICAodXR4bykgPT4gdXR4by50eGlkID09PSBpbnB1dFR4aWQgJiYgdXR4by5vdXRwdXRpZHggPT09IGlucHV0T3V0cHV0SWR4XG4gICAgICApO1xuXG4gICAgICBpZiAoIW9yaWdpbmFsVXR4bykge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBDb3VsZCBub3QgZmluZCBtYXRjaGluZyBVVFhPIGZvciBpbnB1dCAke2lucHV0VHhpZH06JHtpbnB1dE91dHB1dElkeH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNmZXJJbnB1dCA9IGlucHV0LmlucHV0IGFzIFRyYW5zZmVySW5wdXQ7XG4gICAgICBjb25zdCBhY3R1YWxTaWdJbmRpY2VzID0gdHJhbnNmZXJJbnB1dC5zaWdJbmRpY2llcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcmlnaW5hbFV0eG8sXG4gICAgICAgIGFkZHJlc3Nlc0luZGV4OiBvcmlnaW5hbFV0eG8uYWRkcmVzc2VzSW5kZXgsXG4gICAgICAgIGFkZHJlc3Nlczogb3JpZ2luYWxVdHhvLmFkZHJlc3NlcyxcbiAgICAgICAgdGhyZXNob2xkOiBvcmlnaW5hbFV0eG8udGhyZXNob2xkIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCxcbiAgICAgICAgYWN0dWFsU2lnSW5kaWNlcyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHV0eG9zV2l0aEluZGV4O1xuXG4gICAgY29uc3QgdHhDcmVkZW50aWFscyA9IHV0eG9zV2l0aEluZGV4Lm1hcCgodXR4bykgPT5cbiAgICAgIHRoaXMuY3JlYXRlQ3JlZGVudGlhbEZvclV0eG8odXR4bywgdXR4by50aHJlc2hvbGQsIHV0eG8uYWN0dWFsU2lnSW5kaWNlcylcbiAgICApO1xuXG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSB1dHhvc1dpdGhJbmRleC5tYXAoKHV0eG8pID0+XG4gICAgICB0aGlzLmNyZWF0ZUFkZHJlc3NNYXBGb3JVdHhvKHV0eG8sIHV0eG8udGhyZXNob2xkLCB1dHhvLmFjdHVhbFNpZ0luZGljZXMpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBuZXcgVW5zaWduZWRUeCB3aXRoIGNvcnJlY3RlZCBjaGFuZ2Ugb3V0cHV0cyBhbmQgcHJvcGVyIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgZml4ZWRVbnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoXG4gICAgICBjb3JyZWN0ZWREZWxlZ2F0b3JUeCxcbiAgICAgIFtdLFxuICAgICAgbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLFxuICAgICAgdHhDcmVkZW50aWFsc1xuICAgICk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKGZpeGVkVW5zaWduZWRUeCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY29ycmVjdGVkIEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggd2l0aCB0aGUgZ2l2ZW4gY2hhbmdlIG91dHB1dHMuXG4gICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgRmxhcmVKUydzIG5ld0FkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggZG9lc24ndCBzdXBwb3J0IHNldHRpbmdcbiAgICogdGhlIHRocmVzaG9sZCBhbmQgbG9ja3RpbWUgZm9yIGNoYW5nZSBvdXRwdXRzIC0gaXQgZGVmYXVsdHMgdG8gdGhyZXNob2xkPTEuXG4gICAqXG4gICAqIEZsYXJlSlMgZGVjbGFyZXMgYmFzZVR4Lm91dHB1dHMgYXMgcmVhZG9ubHksIHNvIHdlIHVzZSBPYmplY3QuZGVmaW5lUHJvcGVydHlcbiAgICogdG8gb3ZlcnJpZGUgdGhlIHByb3BlcnR5IHdpdGggdGhlIGNvcnJlY3RlZCBvdXRwdXRzLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCB1bnRpbFxuICAgKiBGbGFyZUpTIGFkZHMgcHJvcGVyIHN1cHBvcnQgZm9yIGNoYW5nZSBvdXRwdXQgdGhyZXNob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsVHggLSBUaGUgb3JpZ2luYWwgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeFxuICAgKiBAcGFyYW0gY29ycmVjdGVkT3V0cHV0cyAtIFRoZSBjb3JyZWN0ZWQgY2hhbmdlIG91dHB1dHMgd2l0aCBwcm9wZXIgdGhyZXNob2xkXG4gICAqIEByZXR1cm5zIEEgbmV3IEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHggd2l0aCB0aGUgY29ycmVjdGVkIGNoYW5nZSBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvcnJlY3RlZERlbGVnYXRvclR4KFxuICAgIG9yaWdpbmFsVHg6IHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4LFxuICAgIGNvcnJlY3RlZE91dHB1dHM6IFRyYW5zZmVyYWJsZU91dHB1dFtdXG4gICk6IHB2bVNlcmlhbC5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4IHtcbiAgICAvLyBGbGFyZUpTIGRlY2xhcmVzIGJhc2VUeC5vdXRwdXRzIGFzIGBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0czogcmVhZG9ubHkgVHJhbnNmZXJhYmxlT3V0cHV0W11gXG4gICAgLy8gV2UgdXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0byBvdmVycmlkZSB0aGUgcmVhZG9ubHkgcHJvcGVydHkgd2l0aCBvdXIgY29ycmVjdGVkIG91dHB1dHMuXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBGbGFyZUpTJ3MgbmV3QWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3JUeCBkb2Vzbid0IHN1cHBvcnQgY2hhbmdlIG91dHB1dCB0aHJlc2hvbGQvbG9ja3RpbWUuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9yaWdpbmFsVHguYmFzZVR4LCAnb3V0cHV0cycsIHtcbiAgICAgIHZhbHVlOiBjb3JyZWN0ZWRPdXRwdXRzLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBvcmlnaW5hbFR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBpZiB0aGUgdHJhbnNhY3Rpb24gdHlwZSBtYXRjaGVzIEFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yVHhcbiAgICogQHBhcmFtIHR5cGUgVHlwZVN5bWJvbCBmcm9tIHBhcnNlZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgc3RhdGljIHZlcmlmeVR4VHlwZSh0eXBlOiBUeXBlU3ltYm9scyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlID09PSBUeXBlU3ltYm9scy5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvclR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8vIE5vdGU6IGNyZWF0ZUNyZWRlbnRpYWxGb3JVdHhvIGFuZCBjcmVhdGVBZGRyZXNzTWFwRm9yVXR4byBtZXRob2RzIGFyZSBpbmhlcml0ZWRcbiAgLy8gZnJvbSBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIgYW5kIHN1cHBvcnQgYm90aCBub3JtYWwgYW5kIHJlY292ZXJ5IHNpZ25pbmcgbW9kZXNcbn1cbiJdfQ==
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* This demonstrates the half-signing workflow for 2-of-3 multisig delegation transactions
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Test accounts for half-signing workflow
|
|
7
|
+
* These are the actual keys used to create and sign the on-chain transaction
|
|
8
|
+
*/
|
|
9
|
+
export declare const HALF_SIGN_TEST_ACCOUNTS: {
|
|
10
|
+
user: {
|
|
11
|
+
privateKey: string;
|
|
12
|
+
publicKey: string;
|
|
13
|
+
pChainAddress: string;
|
|
14
|
+
};
|
|
15
|
+
bitgo: {
|
|
16
|
+
privateKey: string;
|
|
17
|
+
publicKey: string;
|
|
18
|
+
pChainAddress: string;
|
|
19
|
+
};
|
|
20
|
+
backup: {
|
|
21
|
+
privateKey: string;
|
|
22
|
+
publicKey: string;
|
|
23
|
+
pChainAddress: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Transaction parameters for the multisig delegation
|
|
28
|
+
*/
|
|
29
|
+
export declare const MULTISIG_DELEGATION_PARAMS: {
|
|
30
|
+
nodeID: string;
|
|
31
|
+
stakeAmount: string;
|
|
32
|
+
duration: number;
|
|
33
|
+
startTime: number;
|
|
34
|
+
endTime: number;
|
|
35
|
+
rewardAddress: string;
|
|
36
|
+
multisigAddresses: string[];
|
|
37
|
+
threshold: number;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Unsigned transaction hex (before any signatures)
|
|
41
|
+
* Built with sorted fromAddresses to match UTXO owner order
|
|
42
|
+
*/
|
|
43
|
+
export declare const MULTISIG_DELEGATION_UNSIGNED_TX_HEX = "00000000001a0000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000253e89cc00000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef700000001707288abed3b4da8d181ee2922ac55e1f269845583cf9adff0caee5fd47ddc3c0000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000500002d7bdc49040000000002000000000000000100000000664b4924a25af8be5f07052b2c2e582f7c10a65400000000699c4cf00000000069aec1f000002d79883d200000000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000700002d79883d20000000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef70000000b0000000000000000000000010000000140c982503bb38f42bd88b8ba953281bca72fd0f1";
|
|
44
|
+
/**
|
|
45
|
+
* Half-signed transaction hex (signed by user key only)
|
|
46
|
+
* First signature slot filled, second slot empty
|
|
47
|
+
*/
|
|
48
|
+
export declare const MULTISIG_DELEGATION_HALF_SIGNED_TX_HEX = "00000000001a0000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000253e89cc00000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef700000001707288abed3b4da8d181ee2922ac55e1f269845583cf9adff0caee5fd47ddc3c0000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000500002d7bdc49040000000002000000000000000100000000664b4924a25af8be5f07052b2c2e582f7c10a65400000000699c4cf00000000069aec1f000002d79883d200000000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000700002d79883d20000000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef70000000b0000000000000000000000010000000140c982503bb38f42bd88b8ba953281bca72fd0f1000000010000000900000002d488c1469bf92cfdeb2c164e1608f9c1bef4aec0b39fe33088a97b74268a908a579f079d56728dcfbda297b6f5c7792e26f109914b65ed974dcd1ad155cb61d3010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
|
|
49
|
+
/**
|
|
50
|
+
* Fully signed transaction hex (signed by both user and bitgo keys)
|
|
51
|
+
* This transaction was successfully broadcast to Coston2 testnet
|
|
52
|
+
*/
|
|
53
|
+
export declare const MULTISIG_DELEGATION_FULLY_SIGNED_TX_HEX = "00000000001a0000007200000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd000000070000000253e89cc00000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef700000001707288abed3b4da8d181ee2922ac55e1f269845583cf9adff0caee5fd47ddc3c0000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000500002d7bdc49040000000002000000000000000100000000664b4924a25af8be5f07052b2c2e582f7c10a65400000000699c4cf00000000069aec1f000002d79883d200000000000000000000000000000000000000000000000000000000000000000000000000158734f94af871c3d131b56131b6fb7a0291eacadd261e69dfb42a9cdf6f7fddd0000000700002d79883d20000000000000000000000000010000000340c982503bb38f42bd88b8ba953281bca72fd0f16b50b020ff8556fc7f9f88efc17dad2c4fae01c7766cdb20a5bcd2dc7ff069d714911efd25c4aef70000000b0000000000000000000000010000000140c982503bb38f42bd88b8ba953281bca72fd0f1000000010000000900000002d488c1469bf92cfdeb2c164e1608f9c1bef4aec0b39fe33088a97b74268a908a579f079d56728dcfbda297b6f5c7792e26f109914b65ed974dcd1ad155cb61d30139507d355619359a57ce9f85b42c1d5daca3808db218513b45417f5c6bc1bc531bfefef6ae78309486fe114c6d64626b0ba619f453946a385dc8ff4a31b333b701";
|
|
54
|
+
/**
|
|
55
|
+
* On-chain transaction ID after broadcast
|
|
56
|
+
*/
|
|
57
|
+
export declare const MULTISIG_DELEGATION_TX_ID = "2hGeGfU7vAi7aMWAGSc5RHfRBpum2LWhxqypv2uxQvZXVrnEA5";
|
|
58
|
+
/**
|
|
59
|
+
* Address sorting information for the 2-of-3 multisig wallet
|
|
60
|
+
* After lexicographic sorting by hex value, the addresses remain in the same order:
|
|
61
|
+
* 1. user (P-costwo1grycy5pmkw8590vghzaf2v5phjnjl583cmc3f5) - sorted index 0
|
|
62
|
+
* 2. bitgo (P-costwo1ddgtqg8ls4t0clul3rhuzldd9386uqw85nr98f) - sorted index 1
|
|
63
|
+
* 3. backup (P-costwo1wekdkg99hnfdcllsd8t3fyg7l5jufthhfysjgp) - sorted index 2
|
|
64
|
+
*
|
|
65
|
+
* Keys needed for signing (first 2 in sorted order for threshold=2):
|
|
66
|
+
* - user (original index 0, sorted index 0)
|
|
67
|
+
* - bitgo (original index 1, sorted index 1)
|
|
68
|
+
*/
|
|
69
|
+
export declare const MULTISIG_ADDRESS_SORTING: {
|
|
70
|
+
original: string[];
|
|
71
|
+
sorted: string[];
|
|
72
|
+
addressesIndex: number[];
|
|
73
|
+
signingKeys: {
|
|
74
|
+
role: string;
|
|
75
|
+
originalIndex: number;
|
|
76
|
+
sortedIndex: number;
|
|
77
|
+
}[];
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=multisigDelegationTx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multisigDelegationTx.d.ts","sourceRoot":"","sources":["../../../../test/resources/transactionData/multisigDelegationTx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;CAgBnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;CAatC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mCAAmC,y/BACw8B,CAAC;AAEz/B;;;GAGG;AACH,eAAO,MAAM,sCAAsC,qxCACiuC,CAAC;AAErxC;;;GAGG;AACH,eAAO,MAAM,uCAAuC,qxCACguC,CAAC;AAErxC;;GAEG;AACH,eAAO,MAAM,yBAAyB,uDAAuD,CAAC;AAE9F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;;CAiBpC,CAAC"}
|