@bitgo-beta/sdk-coin-sol 7.6.4-beta.726 → 7.6.4-beta.727
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/LICENSE +191 -0
- package/dist/cjs/src/lib/index.d.ts +1 -1
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +4 -2
- package/dist/cjs/src/lib/v1TransactionBuilder.d.ts +58 -2
- package/dist/cjs/src/lib/v1TransactionBuilder.d.ts.map +1 -1
- package/dist/cjs/src/lib/v1TransactionBuilder.js +188 -23
- package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +70 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/lib/index.d.ts +1 -1
- package/dist/esm/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +2 -2
- package/dist/esm/lib/v1TransactionBuilder.d.ts +58 -2
- package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -1
- package/dist/esm/lib/v1TransactionBuilder.js +187 -24
- package/package.json +7 -7
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseTransactionBuilder, BuildTransactionError, SigningError, } from '@bitgo-beta/sdk-core';
|
|
2
|
-
import { PublicKey, SystemProgram, Transaction as SolTransaction, TransactionInstruction } from '@solana/web3.js';
|
|
2
|
+
import { PublicKey, SystemProgram, SYSVAR_RECENT_BLOCKHASHES_PUBKEY, Transaction as SolTransaction, TransactionInstruction, } from '@solana/web3.js';
|
|
3
|
+
import base58 from 'bs58';
|
|
3
4
|
import nacl from 'tweetnacl';
|
|
4
5
|
import assert from 'assert';
|
|
5
6
|
import { Transaction } from './transaction';
|
|
@@ -34,31 +35,154 @@ export function buildAdvanceNonceAccountInstruction(nonceAddress, authWalletAddr
|
|
|
34
35
|
});
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
|
-
*
|
|
38
|
+
* Map a v1 envelope instruction (index-based) into a web3.js TransactionInstruction
|
|
39
|
+
* (address-based), deriving each referenced account's signer/writable role from the
|
|
40
|
+
* message header (Solana role conventions: the last `numReadonlySignedAccounts`
|
|
41
|
+
* signers and last `numReadonlyUnsignedAccounts` non-signers are readonly).
|
|
38
42
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
43
|
+
* @param instruction - the envelope instruction (programIdIndex/accountKeyIndexes/data)
|
|
44
|
+
* @param data - the v1 envelope
|
|
45
|
+
* @returns the address-based instruction, ready for V1TransactionBuilder.addInstruction
|
|
46
|
+
*/
|
|
47
|
+
export function toV1TransactionInstruction(instruction, data) {
|
|
48
|
+
const { staticAccountKeys, messageHeader } = data;
|
|
49
|
+
const numRequiredSignatures = messageHeader.numRequiredSignatures;
|
|
50
|
+
const numAccounts = staticAccountKeys.length;
|
|
51
|
+
const isSigner = (index) => index < numRequiredSignatures;
|
|
52
|
+
const isWritable = (index) => isSigner(index)
|
|
53
|
+
? index < numRequiredSignatures - messageHeader.numReadonlySignedAccounts
|
|
54
|
+
: index < numAccounts - messageHeader.numReadonlyUnsignedAccounts;
|
|
55
|
+
return new TransactionInstruction({
|
|
56
|
+
programId: new PublicKey(staticAccountKeys[instruction.programIdIndex]),
|
|
57
|
+
keys: instruction.accountKeyIndexes.map((accountIndex) => ({
|
|
58
|
+
pubkey: new PublicKey(staticAccountKeys[accountIndex]),
|
|
59
|
+
isSigner: isSigner(accountIndex),
|
|
60
|
+
isWritable: isWritable(accountIndex),
|
|
61
|
+
})),
|
|
62
|
+
data: Buffer.from(base58.decode(instruction.data)),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Inject an AdvanceNonceAccount instruction into a v1 envelope for durable nonce.
|
|
42
67
|
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* (`addSignature`), assembled in message-signer order
|
|
51
|
-
* - message compile via `compileTransactionMessage` and signed wire via
|
|
52
|
-
* `serializeWireTransaction`
|
|
68
|
+
* v1 (SIMD-0296/0385) has no address lookup tables, so every account is a static
|
|
69
|
+
* key. The nonce authority MUST sign the AdvanceNonceAccount instruction (hard
|
|
70
|
+
* runtime requirement) and the nonce account MUST be writable; the system program
|
|
71
|
+
* and recent-blockhashes sysvar are readonly non-signers. The instruction is
|
|
72
|
+
* prepended and every instruction's account indexes are remapped to the rebuilt
|
|
73
|
+
* static key list; messageHeader grows accordingly so the wire-size estimate and
|
|
74
|
+
* account caps are correct.
|
|
53
75
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* broadcastable wire is only produced once every required signer has a
|
|
60
|
-
* signature.
|
|
76
|
+
* @param data - the v1 envelope (client-supplied, no nonce instruction)
|
|
77
|
+
* @param durableNonceParams - walletNonceAddress + authWalletAddress (gas-tank root)
|
|
78
|
+
* @returns a copy of the envelope with the nonce instruction injected
|
|
79
|
+
* @edge if the envelope already contains an AdvanceNonceAccount instruction, returns
|
|
80
|
+
* the envelope unchanged (idempotent - a durable-aware client may supply it)
|
|
61
81
|
*/
|
|
82
|
+
export function injectV1NonceAdvanceInstruction(data, durableNonceParams) {
|
|
83
|
+
const { walletNonceAddress, authWalletAddress } = durableNonceParams;
|
|
84
|
+
const SYSTEM_PROGRAM = SystemProgram.programId.toBase58();
|
|
85
|
+
const SYSVAR_RECENT_BLOCKHASHES = SYSVAR_RECENT_BLOCKHASHES_PUBKEY.toBase58();
|
|
86
|
+
// Idempotence: a durable-aware client may already include the nonce instruction.
|
|
87
|
+
const hasNonceAdvance = data.versionedInstructions.some((instruction) => {
|
|
88
|
+
const program = data.staticAccountKeys[instruction.programIdIndex];
|
|
89
|
+
return program === SYSTEM_PROGRAM && Buffer.from(base58.decode(instruction.data))[0] === 4;
|
|
90
|
+
});
|
|
91
|
+
if (hasNonceAdvance) {
|
|
92
|
+
return data;
|
|
93
|
+
}
|
|
94
|
+
const { numRequiredSignatures, numReadonlySignedAccounts, numReadonlyUnsignedAccounts } = data.messageHeader;
|
|
95
|
+
const oldStaticLen = data.staticAccountKeys.length;
|
|
96
|
+
if (numReadonlySignedAccounts > numRequiredSignatures ||
|
|
97
|
+
numRequiredSignatures + numReadonlyUnsignedAccounts > oldStaticLen) {
|
|
98
|
+
throw new BuildTransactionError(`Invalid message header: readonly counts (${numReadonlySignedAccounts}, ${numReadonlyUnsignedAccounts}) ` +
|
|
99
|
+
`are inconsistent with ${numRequiredSignatures} required signatures and ${oldStaticLen} static account keys`);
|
|
100
|
+
}
|
|
101
|
+
// Split the static keys into the four v1 header sections.
|
|
102
|
+
const writableSigners = data.staticAccountKeys.slice(0, numRequiredSignatures - numReadonlySignedAccounts);
|
|
103
|
+
const readonlySigners = data.staticAccountKeys.slice(numRequiredSignatures - numReadonlySignedAccounts, numRequiredSignatures);
|
|
104
|
+
const writableNonSigners = data.staticAccountKeys.slice(numRequiredSignatures, oldStaticLen - numReadonlyUnsignedAccounts);
|
|
105
|
+
const readonlyNonSigners = data.staticAccountKeys.slice(oldStaticLen - numReadonlyUnsignedAccounts);
|
|
106
|
+
// The nonce authority must be a signer for AdvanceNonceAccount.
|
|
107
|
+
const authorityIsSigner = writableSigners.includes(authWalletAddress) || readonlySigners.includes(authWalletAddress);
|
|
108
|
+
if (!authorityIsSigner) {
|
|
109
|
+
const asReadonlyNonSigner = readonlyNonSigners.indexOf(authWalletAddress);
|
|
110
|
+
const asWritableNonSigner = writableNonSigners.indexOf(authWalletAddress);
|
|
111
|
+
if (asReadonlyNonSigner >= 0) {
|
|
112
|
+
readonlyNonSigners.splice(asReadonlyNonSigner, 1);
|
|
113
|
+
readonlySigners.push(authWalletAddress);
|
|
114
|
+
}
|
|
115
|
+
else if (asWritableNonSigner >= 0) {
|
|
116
|
+
writableNonSigners.splice(asWritableNonSigner, 1);
|
|
117
|
+
writableSigners.push(authWalletAddress);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
readonlySigners.push(authWalletAddress);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// The nonce account must be writable for AdvanceNonceAccount.
|
|
124
|
+
const nonceAsReadonlyNonSigner = readonlyNonSigners.indexOf(walletNonceAddress);
|
|
125
|
+
const nonceAsReadonlySigner = readonlySigners.indexOf(walletNonceAddress);
|
|
126
|
+
if (nonceAsReadonlyNonSigner >= 0) {
|
|
127
|
+
readonlyNonSigners.splice(nonceAsReadonlyNonSigner, 1);
|
|
128
|
+
writableNonSigners.push(walletNonceAddress);
|
|
129
|
+
}
|
|
130
|
+
else if (nonceAsReadonlySigner >= 0) {
|
|
131
|
+
readonlySigners.splice(nonceAsReadonlySigner, 1);
|
|
132
|
+
writableSigners.push(walletNonceAddress);
|
|
133
|
+
}
|
|
134
|
+
else if (!writableSigners.includes(walletNonceAddress) && !writableNonSigners.includes(walletNonceAddress)) {
|
|
135
|
+
writableNonSigners.push(walletNonceAddress);
|
|
136
|
+
}
|
|
137
|
+
// The system program and recent-blockhashes sysvar are readonly non-signers.
|
|
138
|
+
const isPresent = (key) => writableSigners.includes(key) ||
|
|
139
|
+
readonlySigners.includes(key) ||
|
|
140
|
+
writableNonSigners.includes(key) ||
|
|
141
|
+
readonlyNonSigners.includes(key);
|
|
142
|
+
if (!isPresent(SYSTEM_PROGRAM)) {
|
|
143
|
+
readonlyNonSigners.push(SYSTEM_PROGRAM);
|
|
144
|
+
}
|
|
145
|
+
if (!isPresent(SYSVAR_RECENT_BLOCKHASHES)) {
|
|
146
|
+
readonlyNonSigners.push(SYSVAR_RECENT_BLOCKHASHES);
|
|
147
|
+
}
|
|
148
|
+
const newStaticAccountKeys = [...writableSigners, ...readonlySigners, ...writableNonSigners, ...readonlyNonSigners];
|
|
149
|
+
// Remap every instruction index to the new key order (v1 has no lookup tables).
|
|
150
|
+
const indexMap = new Map();
|
|
151
|
+
data.staticAccountKeys.forEach((key, oldIdx) => indexMap.set(oldIdx, newStaticAccountKeys.indexOf(key)));
|
|
152
|
+
const remapIndex = (index) => {
|
|
153
|
+
const mapped = indexMap.get(index);
|
|
154
|
+
if (mapped === undefined) {
|
|
155
|
+
throw new BuildTransactionError(`Invalid account key index ${index} in versioned instruction`);
|
|
156
|
+
}
|
|
157
|
+
return mapped;
|
|
158
|
+
};
|
|
159
|
+
const nonceAdvanceInstruction = {
|
|
160
|
+
programIdIndex: newStaticAccountKeys.indexOf(SYSTEM_PROGRAM),
|
|
161
|
+
accountKeyIndexes: [
|
|
162
|
+
newStaticAccountKeys.indexOf(walletNonceAddress),
|
|
163
|
+
newStaticAccountKeys.indexOf(SYSVAR_RECENT_BLOCKHASHES),
|
|
164
|
+
newStaticAccountKeys.indexOf(authWalletAddress),
|
|
165
|
+
],
|
|
166
|
+
data: '6vx8P', // base58 of SystemProgram AdvanceNonceAccount (0x04000000)
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
...data,
|
|
170
|
+
versionedInstructions: [
|
|
171
|
+
nonceAdvanceInstruction,
|
|
172
|
+
...data.versionedInstructions.map((instruction) => ({
|
|
173
|
+
programIdIndex: remapIndex(instruction.programIdIndex),
|
|
174
|
+
accountKeyIndexes: instruction.accountKeyIndexes.map(remapIndex),
|
|
175
|
+
data: instruction.data,
|
|
176
|
+
})),
|
|
177
|
+
],
|
|
178
|
+
staticAccountKeys: newStaticAccountKeys,
|
|
179
|
+
messageHeader: {
|
|
180
|
+
numRequiredSignatures: writableSigners.length + readonlySigners.length,
|
|
181
|
+
numReadonlySignedAccounts: readonlySigners.length,
|
|
182
|
+
numReadonlyUnsignedAccounts: readonlyNonSigners.length,
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
62
186
|
export class V1TransactionBuilder extends BaseTransactionBuilder {
|
|
63
187
|
constructor(_coinConfig) {
|
|
64
188
|
super(_coinConfig);
|
|
@@ -278,7 +402,46 @@ export class V1TransactionBuilder extends BaseTransactionBuilder {
|
|
|
278
402
|
* @returns {V1TransactionBuilder} This transaction builder
|
|
279
403
|
*/
|
|
280
404
|
transactionConfig(config) {
|
|
281
|
-
this._transactionConfig =
|
|
405
|
+
this._transactionConfig = {
|
|
406
|
+
computeUnitLimit: config.computeUnitLimit ?? null,
|
|
407
|
+
heapSize: config.heapSize ?? null,
|
|
408
|
+
loadedAccountsDataSizeLimit: config.loadedAccountsDataSizeLimit ?? null,
|
|
409
|
+
priorityFee: config.priorityFee ?? null,
|
|
410
|
+
};
|
|
411
|
+
return this;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Initialize the builder from a client-supplied v1 envelope
|
|
415
|
+
* (SolVersionedTransactionData). Sets the fee payer from staticAccountKeys[0],
|
|
416
|
+
* coerces the transaction config, and converts each envelope instruction to an
|
|
417
|
+
* address-based TransactionInstruction via {@link toV1TransactionInstruction}.
|
|
418
|
+
*
|
|
419
|
+
* @param data - the v1 envelope
|
|
420
|
+
* @returns {V1TransactionBuilder} This transaction builder
|
|
421
|
+
*/
|
|
422
|
+
fromVersionedData(data) {
|
|
423
|
+
if (!data || typeof data !== 'object') {
|
|
424
|
+
throw new BuildTransactionError('VersionedTransactionData must be a valid object');
|
|
425
|
+
}
|
|
426
|
+
if (!Array.isArray(data.staticAccountKeys) || data.staticAccountKeys.length === 0) {
|
|
427
|
+
throw new BuildTransactionError('staticAccountKeys must be a non-empty array');
|
|
428
|
+
}
|
|
429
|
+
if (!Array.isArray(data.versionedInstructions)) {
|
|
430
|
+
throw new BuildTransactionError('versionedInstructions must be an array');
|
|
431
|
+
}
|
|
432
|
+
if (!data.messageHeader || typeof data.messageHeader !== 'object') {
|
|
433
|
+
throw new BuildTransactionError('messageHeader must be a valid object');
|
|
434
|
+
}
|
|
435
|
+
this._sender = data.staticAccountKeys[0];
|
|
436
|
+
this._transactionConfig = {
|
|
437
|
+
computeUnitLimit: data.transactionConfig?.computeUnitLimit ?? null,
|
|
438
|
+
heapSize: data.transactionConfig?.heapSize ?? null,
|
|
439
|
+
loadedAccountsDataSizeLimit: data.transactionConfig?.loadedAccountsDataSizeLimit ?? null,
|
|
440
|
+
priorityFee: data.transactionConfig?.priorityFee ?? null,
|
|
441
|
+
};
|
|
442
|
+
for (const instruction of data.versionedInstructions) {
|
|
443
|
+
this.addInstruction(toV1TransactionInstruction(instruction, data));
|
|
444
|
+
}
|
|
282
445
|
return this;
|
|
283
446
|
}
|
|
284
447
|
/**
|
|
@@ -425,4 +588,4 @@ export class V1TransactionBuilder extends BaseTransactionBuilder {
|
|
|
425
588
|
}
|
|
426
589
|
}
|
|
427
590
|
}
|
|
428
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjFUcmFuc2FjdGlvbkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3YxVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIscUJBQXFCLEVBR3JCLFlBQVksR0FHYixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFdBQVcsSUFBSSxjQUFjLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsSCxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxtQ0FBbUMsQ0FDakQsWUFBb0IsRUFDcEIsaUJBQXlCO0lBRXpCLE1BQU0sQ0FBQyxZQUFZLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUNuRCxNQUFNLENB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QixDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0sscUJBQXFCLENBQUMsR0FBWTtRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQzNCLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxZQUFZLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlQWRkcmVzcyxcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uQnVpbGRlcixcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBGZWVPcHRpb25zLFxuICBQdWJsaWNLZXkgYXMgQmFzZVB1YmxpY0tleSxcbiAgU2lnbmluZ0Vycm9yLFxuICBTb2xWMVRyYW5zYWN0aW9uQ29uZmlnLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IFB1YmxpY0tleSwgU3lzdGVtUHJvZ3JhbSwgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEluc3RydWN0aW9uUGFyYW1zLCBNZW1vLCBOb25jZSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgc29sSW5zdHJ1Y3Rpb25GYWN0b3J5IH0gZnJvbSAnLi9zb2xJbnN0cnVjdGlvbkZhY3RvcnknO1xuaW1wb3J0IHsgY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlJztcbmltcG9ydCB7IHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbiB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi93aXJlLXRyYW5zYWN0aW9uJztcbmltcG9ydCB7IHBhcnNlV2lyZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3BhcnNlV2lyZVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IGRlY29kZVYxTWVzc2FnZSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb2RlY3MvdjEvbWVzc2FnZSc7XG5pbXBvcnQgeyBpc1ZhbGlkQWRkcmVzcywgaXNWYWxpZEJsb2NrSWQsIGlzVmFsaWRNZW1vLCB2YWxpZGF0ZUFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uIGZvciBhIGR1cmFibGUgbm9uY2UuXG4gKlxuICogVGhlIHYwIHBhdGggcmVjZWl2ZXMgdGhpcyBpbnN0cnVjdGlvbiBmcm9tIHdlYjMuanMgLyB0aGUgUnVzdCB3YXNtIGNvcmVcbiAqIChgTm9uY2VTb3VyY2VgIGR1cmFibGUgdmFyaWFudCk7IHRoZSB2MSBwYXRoIGNvbXBpbGVzIHZpYVxuICogYGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2VgLCBzbyB0aGUgbm9uY2UgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBjb25zdHJ1Y3RlZCBpblxuICogVHlwZVNjcmlwdCBhbmQgaW5qZWN0ZWQgaW50byB0aGUgY29tcGlsZSBpbnB1dC4gVGhlIG5vbmNlIGF1dGhvcml0eVxuICogKGBhdXRoV2FsbGV0QWRkcmVzc2ApIE1VU1Qgc2lnbiB0aGUgaW5zdHJ1Y3Rpb24g4oCUIGl0IGJlY29tZXMgYSByZXF1aXJlZFxuICogc2lnbmVyIG9mIHRoZSBjb21waWxlZCBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBub25jZUFkZHJlc3MgLSB0aGUgZHVyYWJsZSBub25jZSBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSBhdXRoV2FsbGV0QWRkcmVzcyAtIHRoZSBub25jZSBhdXRob3JpdHkgKGdhcy10YW5rIHJvb3QgaW4gQml0R28ncyBtb2RlbClcbiAqIEByZXR1cm5zIHRoZSBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFkdmFuY2VOb25jZUFjY291bnRJbnN0cnVjdGlvbihcbiAgbm9uY2VBZGRyZXNzOiBzdHJpbmcsXG4gIGF1dGhXYWxsZXRBZGRyZXNzOiBzdHJpbmdcbik6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICBhc3NlcnQobm9uY2VBZGRyZXNzLCAnTWlzc2luZyBub25jZUFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGF1dGhXYWxsZXRBZGRyZXNzLCAnTWlzc2luZyBhdXRoV2FsbGV0QWRkcmVzcyBwYXJhbScpO1xuICByZXR1cm4gU3lzdGVtUHJvZ3JhbS5ub25jZUFkdmFuY2Uoe1xuICAgIG5vbmNlUHVia2V5OiBuZXcgUHVibGljS2V5KG5vbmNlQWRkcmVzcyksXG4gICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoV2FsbGV0QWRkcmVzcyksXG4gIH0pO1xufVxuXG4vKipcbiAqIEJhc2UgYnVpbGRlciBmb3IgU29sYW5hIHYxIChTSU1ELTAyOTYvMDM4NSkgdHJhbnNhY3Rpb25zLlxuICpcbiAqIFBhcmFsbGVsIHRvIHRoZSB2MCB7QGxpbmsgVHJhbnNhY3Rpb25CdWlsZGVyfSwgd2hpY2ggaXMgYm91bmQgdG8gYVxuICogYEBzb2xhbmEvd2ViMy5qc2AgdjAgYFRyYW5zYWN0aW9uYCBhbmQgY2Fubm90IGVtaXQgYSB2MSB3aXJlLiBUaGlzIGJ1aWxkZXJcbiAqIG93bnMgdGhlIHYxIGFzc2VtYmx5OlxuICpcbiAqIC0gaW50ZW50LXRvLWluc3RydWN0aW9uIGRlcml2YXRpb24gdmlhIHRoZSBzaGFyZWQgYHNvbEluc3RydWN0aW9uRmFjdG9yeWBcbiAqICAgKHNhbWUgYEluc3RydWN0aW9uUGFyYW1zYCByZXByZXNlbnRhdGlvbiBhcyB0aGUgdjAgZmxvd3MpXG4gKiAtIGR1cmFibGUgbm9uY2U6IGBBZHZhbmNlTm9uY2VBY2NvdW50YCBpbnN0cnVjdGlvbiBpbmplY3Rpb24gKGZpcnN0KSBwbHVzIHRoZVxuICogICBub25jZSBoYXNoIGluIHRoZSBibG9ja2hhc2ggZmllbGRcbiAqIC0gdHJhbnNhY3Rpb24gY29uZmlnIChjb21wdXRlIHVuaXQgbGltaXQsIGhlYXAgc2l6ZSwgbG9hZGVkIGFjY291bnRzIGRhdGFcbiAqICAgc2l6ZSBsaW1pdCwgcHJpb3JpdHkgZmVlIGFzIHRvdGFsIGxhbXBvcnRzKVxuICogLSBzaWduZXIgbWFuYWdlbWVudDogcHJpdmF0ZS1rZXkgc2lnbmVycyAoYHNpZ25gKSBhbmQgZXh0ZXJuYWwgc2lnbmF0dXJlc1xuICogICAoYGFkZFNpZ25hdHVyZWApLCBhc3NlbWJsZWQgaW4gbWVzc2FnZS1zaWduZXIgb3JkZXJcbiAqIC0gbWVzc2FnZSBjb21waWxlIHZpYSBgY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZWAgYW5kIHNpZ25lZCB3aXJlIHZpYVxuICogICBgc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uYFxuICpcbiAqIFNpZ25hdHVyZSBhc3NlbWJseSBpcyBpbiBtZXNzYWdlLXNpZ25lciBvcmRlciAoZmVlIHBheWVyIGZpcnN0LCB0aGVuIHRoZVxuICogcmVtYWluaW5nIHNpZ25lcnMgaW4gdGhlIGNvbXBpbGVkIGFjY291bnQgb3JkZXIpLCBOT1QgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICogcmVxdWlyZWQgZm9yIG11bHRpLXNpZ25lciB2MSB0cmFuc2FjdGlvbnMgc3VjaCBhcyBkdXJhYmxlLW5vbmNlIENUXG4gKiAodXNlciArIGdhcy10YW5rIG5vbmNlIGF1dGhvcml0eSkuIE1pc3Npbmcgc2lnbmF0dXJlcyBhcmUgemVyby1maWxsZWQgaW5cbiAqIHRoZWlyIHNsb3RzIHNvIHRoZSB3aXJlIHNoYXBlIHN0YXlzIHZhbGlkIGZvciBwYXJ0aWFsLXNpZ24gZmxvd3M7IHRoZVxuICogYnJvYWRjYXN0YWJsZSB3aXJlIGlzIG9ubHkgcHJvZHVjZWQgb25jZSBldmVyeSByZXF1aXJlZCBzaWduZXIgaGFzIGFcbiAqIHNpZ25hdHVyZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFYxVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9pbnN0cnVjdGlvbnNEYXRhOiBJbnN0cnVjdGlvblBhcmFtc1tdID0gW107XG4gIHByaXZhdGUgX2V4dHJhSW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfc2lnbmVyczogS2V5UGFpcltdID0gW107XG4gIHByaXZhdGUgX3NpZ25hdHVyZXM6IE1hcDxzdHJpbmcsIFVpbnQ4QXJyYXk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9sYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBfc2VuZGVyOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfZmVlUGF5ZXI/OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfcmVjZW50QmxvY2toYXNoOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfbm9uY2VJbmZvPzogTm9uY2U7XG4gIHByb3RlY3RlZCBfbWVtbz86IHN0cmluZztcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbkNvbmZpZz86IFNvbFYxVHJhbnNhY3Rpb25Db25maWc7XG4gIC8qKiBPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhlIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSBpZCAodXNlZCBieSBDVCBpbnN0cnVjdGlvbiBidWlsZGVycykgKi9cbiAgcHJvdGVjdGVkIF96a1Byb29mUHJvZ3JhbUlkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZTtcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkVjEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSB0aGUgdjEgdHJhbnNhY3Rpb246IGRlcml2ZSBpbnN0cnVjdGlvbnMsIGluamVjdCB0aGUgZHVyYWJsZS1ub25jZVxuICAgKiBpbnN0cnVjdGlvbiB3aGVuIHByZXNlbnQsIGNvbXBpbGUgdGhlIG1lc3NhZ2UsIGFuZCBhc3NlbWJsZSB0aGUgc2lnbmVkXG4gICAqIHdpcmUgaW4gbWVzc2FnZS1zaWduZXIgb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtUcmFuc2FjdGlvbn0gVGhlIGJ1aWx0IHRyYW5zYWN0aW9uIGhvbGRpbmcgdGhlIHYxIG1lc3NhZ2UgYW5kIHdpcmUgYnl0ZXNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRWMSgpOiBUcmFuc2FjdGlvbiB7XG4gICAgYXNzZXJ0KHRoaXMuX3NlbmRlciwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignc2VuZGVyIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICBhc3NlcnQodGhpcy5fcmVjZW50QmxvY2toYXNoLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdyZWNlbnQgYmxvY2toYXNoIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICBhc3NlcnQodGhpcy5fdHJhbnNhY3Rpb25Db25maWcsICd0cmFuc2FjdGlvbkNvbmZpZyBpcyByZXF1aXJlZCB0byBidWlsZCBhIHYxIHRyYW5zYWN0aW9uJyk7XG5cbiAgICBjb25zdCBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuXG4gICAgLy8gRHVyYWJsZSBub25jZTogdGhlIEFkdmFuY2VOb25jZUFjY291bnQgaW5zdHJ1Y3Rpb24gTVVTVCBiZSBwYXJ0IG9mIHRoZVxuICAgIC8vIG1lc3NhZ2UgKGEgYmFyZSBub25jZSBoYXNoIHdpdGhvdXQgdGhlIGluc3RydWN0aW9uIGlzIGludmFsaWQpLiBJdCBpc1xuICAgIC8vIHBsYWNlZCBmaXJzdCwgbWF0Y2hpbmcgdGhlIHYwIHdlYjMuanMgY29udmVudGlvbi5cbiAgICBpZiAodGhpcy5fbm9uY2VJbmZvKSB7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaChcbiAgICAgICAgYnVpbGRBZHZhbmNlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy53YWxsZXROb25jZUFkZHJlc3MsXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy5hdXRoV2FsbGV0QWRkcmVzc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSkge1xuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goLi4uc29sSW5zdHJ1Y3Rpb25GYWN0b3J5KGluc3RydWN0aW9uLCB0aGlzLl96a1Byb29mUHJvZ3JhbUlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21lbW8pIHtcbiAgICAgIGNvbnN0IG1lbW9EYXRhOiBNZW1vID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICBwYXJhbXM6IHsgbWVtbzogdGhpcy5fbWVtbyB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEucHVzaChtZW1vRGF0YSk7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5zb2xJbnN0cnVjdGlvbkZhY3RvcnkobWVtb0RhdGEpKTtcbiAgICB9XG5cbiAgICBpbnN0cnVjdGlvbnMucHVzaCguLi50aGlzLl9leHRyYUluc3RydWN0aW9ucyk7XG5cbiAgICBjb25zdCBmZWVQYXllciA9IHRoaXMuX2ZlZVBheWVyID8gbmV3IFB1YmxpY0tleSh0aGlzLl9mZWVQYXllcikgOiBuZXcgUHVibGljS2V5KHRoaXMuX3NlbmRlcik7XG4gICAgY29uc3QgbWVzc2FnZUJ5dGVzID0gY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgaW5zdHJ1Y3Rpb25zLFxuICAgICAgZmVlUGF5ZXIsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IHRoaXMuX3JlY2VudEJsb2NraGFzaCxcbiAgICAgIHRyYW5zYWN0aW9uQ29uZmlnOiB0aGlzLl90cmFuc2FjdGlvbkNvbmZpZyxcbiAgICB9KTtcblxuICAgIC8vIFNpZ25lciBvcmRlciBjb21lcyBmcm9tIHRoZSBjb21waWxlZCBtZXNzYWdlOiB0aGUgZmlyc3RcbiAgICAvLyBudW1TaWduZXJBY2NvdW50cyBzdGF0aWMgYWNjb3VudHMgYXJlIHRoZSByZXF1aXJlZCBzaWduZXJzIChmZWUgcGF5ZXJcbiAgICAvLyBmaXJzdCwgdGhlbiB0aGUgcmVtYWluaW5nIHNpZ25lcnMgaW4gdGhlIGNvbXBpbGVkIGFjY291bnQgb3JkZXIpLlxuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWMU1lc3NhZ2UobWVzc2FnZUJ5dGVzKTtcbiAgICBjb25zdCBzaWduZXJBZGRyZXNzZXMgPSBkZWNvZGVkLnN0YXRpY0FjY291bnRzLnNsaWNlKDAsIGRlY29kZWQuaGVhZGVyLm51bVNpZ25lckFjY291bnRzKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZXM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiBzaWduZXJBZGRyZXNzZXMpIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSB0aGlzLl9zaWduZXJzLmZpbmQoKHNpZ25lcikgPT4gc2lnbmVyLmdldEtleXMoKS5wdWIgPT09IGFkZHJlc3MpO1xuICAgICAgaWYgKGtleVBhaXIpIHtcbiAgICAgICAgY29uc3Qgc2VjcmV0S2V5ID0ga2V5UGFpci5nZXRLZXlzKHRydWUpLnBydjtcbiAgICAgICAgYXNzZXJ0KHNlY3JldEtleSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksICdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgICAgIHNpZ25hdHVyZXMucHVzaChuYWNsLnNpZ24uZGV0YWNoZWQobWVzc2FnZUJ5dGVzLCBzZWNyZXRLZXkpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlcm5hbCA9IHRoaXMuX3NpZ25hdHVyZXMuZ2V0KGFkZHJlc3MpO1xuICAgICAgaWYgKGV4dGVybmFsKSB7XG4gICAgICAgIHNpZ25hdHVyZXMucHVzaChleHRlcm5hbCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gTWlzc2luZyBzaWduYXR1cmU6IHplcm8tZmlsbCB0aGUgc2xvdCBzbyB0aGUgd2lyZSBzaGFwZSBzdGF5cyB2YWxpZFxuICAgICAgLy8gZm9yIHBhcnRpYWwtc2lnbiBmbG93czsgdGhlIHRyYW5zYWN0aW9uIGlzIG5vdCBicm9hZGNhc3RhYmxlIHVudGlsXG4gICAgICAvLyBldmVyeSByZXF1aXJlZCBzaWduZXIgaGFzIGEgc2lnbmF0dXJlLlxuICAgICAgc2lnbmF0dXJlcy5wdXNoKG5ldyBVaW50OEFycmF5KDY0KSk7XG4gICAgfVxuXG4gICAgY29uc3QgdjFXaXJlID0gc2VyaWFsaXplV2lyZVRyYW5zYWN0aW9uKG1lc3NhZ2VCeXRlcywgc2lnbmF0dXJlcyk7XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbi52MVRyYW5zYWN0aW9uQnl0ZXMgPSB2MVdpcmU7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24udjFNZXNzYWdlQnl0ZXMgPSBtZXNzYWdlQnl0ZXM7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24ubGFtcG9ydHNQZXJTaWduYXR1cmUgPSB0aGlzLl9sYW1wb3J0c1BlclNpZ25hdHVyZTtcblxuICAgIC8vIFBvcHVsYXRlIGEgbWV0YWRhdGEtb25seSBTb2xUcmFuc2FjdGlvbiBzbyB0b0pzb24gLyBsb2FkSW5wdXRzQW5kT3V0cHV0c1xuICAgIC8vIHdvcmsuIFRoZSBkdXJhYmxlIG5vbmNlIGlzIGNhcnJpZWQgdmlhIG5vbmNlSW5mbywgbWF0Y2hpbmcgdGhlIHYwIG1vZGVsLlxuICAgIGNvbnN0IG1ldGFUeCA9IG5ldyBTb2xUcmFuc2FjdGlvbigpO1xuICAgIG1ldGFUeC5mZWVQYXllciA9IGZlZVBheWVyO1xuICAgIG1ldGFUeC5yZWNlbnRCbG9ja2hhc2ggPSB0aGlzLl9yZWNlbnRCbG9ja2hhc2g7XG4gICAgaWYgKHRoaXMuX25vbmNlSW5mbykge1xuICAgICAgbWV0YVR4Lm5vbmNlSW5mbyA9IHtcbiAgICAgICAgbm9uY2U6IHRoaXMuX3JlY2VudEJsb2NraGFzaCxcbiAgICAgICAgbm9uY2VJbnN0cnVjdGlvbjogYnVpbGRBZHZhbmNlTm9uY2VBY2NvdW50SW5zdHJ1Y3Rpb24oXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy53YWxsZXROb25jZUFkZHJlc3MsXG4gICAgICAgICAgdGhpcy5fbm9uY2VJbmZvLnBhcmFtcy5hdXRoV2FsbGV0QWRkcmVzc1xuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9XG4gICAgbWV0YVR4LmFkZCguLi5pbnN0cnVjdGlvbnMpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNvbFRyYW5zYWN0aW9uID0gbWV0YVR4O1xuXG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKHRoaXMudHJhbnNhY3Rpb25UeXBlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRJbnN0cnVjdGlvbnNEYXRhKHRoaXMuX2luc3RydWN0aW9uc0RhdGEpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIGNvbnN0IHdpcmVCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuICAgIGNvbnN0IHsgbWVzc2FnZUJ5dGVzIH0gPSBwYXJzZVdpcmVUcmFuc2FjdGlvbih3aXJlQnl0ZXMpO1xuICAgIHR4LnYxVHJhbnNhY3Rpb25CeXRlcyA9IHdpcmVCeXRlcztcbiAgICB0eC52MU1lc3NhZ2VCeXRlcyA9IG1lc3NhZ2VCeXRlcztcblxuICAgIC8vIFBvcHVsYXRlIGEgbWV0YWRhdGEtb25seSBTb2xUcmFuc2FjdGlvbiBmcm9tIHRoZSBkZWNvZGVkIG1lc3NhZ2Ugc29cbiAgICAvLyB0b0pzb24gLyBsb2FkSW5wdXRzQW5kT3V0cHV0cyB3b3JrLlxuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVWMU1lc3NhZ2UobWVzc2FnZUJ5dGVzKTtcbiAgICB0eC5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIGNvbnN0IG1ldGFUeCA9IG5ldyBTb2xUcmFuc2FjdGlvbigpO1xuICAgIG1ldGFUeC5mZWVQYXllciA9IG5ldyBQdWJsaWNLZXkoZGVjb2RlZC5zdGF0aWNBY2NvdW50c1swXSk7XG4gICAgbWV0YVR4LnJlY2VudEJsb2NraGFzaCA9IGRlY29kZWQuYmxvY2toYXNoO1xuICAgIGNvbnN0IG51bVdyaXRhYmxlU2lnbmVycyA9IGRlY29kZWQuaGVhZGVyLm51bVNpZ25lckFjY291bnRzIC0gZGVjb2RlZC5oZWFkZXIubnVtUmVhZG9ubHlTaWduZXJBY2NvdW50cztcbiAgICBjb25zdCBudW1Xcml0YWJsZU5vblNpZ25lcnMgPSBkZWNvZGVkLnN0YXRpY0FjY291bnRzLmxlbmd0aCAtIGRlY29kZWQuaGVhZGVyLm51bVJlYWRvbmx5Tm9uU2lnbmVyQWNjb3VudHM7XG4gICAgZm9yIChjb25zdCBjb21waWxlZCBvZiBkZWNvZGVkLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBtZXRhVHguYWRkKFxuICAgICAgICBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBuZXcgUHVibGljS2V5KGRlY29kZWQuc3RhdGljQWNjb3VudHNbY29tcGlsZWQucHJvZ3JhbUFkZHJlc3NJbmRleF0pLFxuICAgICAgICAgIGtleXM6IGNvbXBpbGVkLmFjY291bnRJbmRpY2VzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgICAgICBwdWJrZXk6IG5ldyBQdWJsaWNLZXkoZGVjb2RlZC5zdGF0aWNBY2NvdW50c1tpbmRleF0pLFxuICAgICAgICAgICAgaXNTaWduZXI6IGluZGV4IDwgZGVjb2RlZC5oZWFkZXIubnVtU2lnbmVyQWNjb3VudHMsXG4gICAgICAgICAgICBpc1dyaXRhYmxlOlxuICAgICAgICAgICAgICBpbmRleCA8IG51bVdyaXRhYmxlU2lnbmVycyB8fFxuICAgICAgICAgICAgICAoaW5kZXggPj0gZGVjb2RlZC5oZWFkZXIubnVtU2lnbmVyQWNjb3VudHMgJiYgaW5kZXggPCBudW1Xcml0YWJsZU5vblNpZ25lcnMpLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBkYXRhOiBCdWZmZXIuZnJvbShjb21waWxlZC5kYXRhKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHR4LnNvbFRyYW5zYWN0aW9uID0gbWV0YVR4O1xuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLy8gcmVnaW9uIEdldHRlcnMgYW5kIFNldHRlcnNcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgdGhpcy52YWxpZGF0ZUtleShrZXkpO1xuICAgIHRoaXMuY2hlY2tEdXBsaWNhdGVkU2lnbmVyKGtleSk7XG4gICAgY29uc3QgcHJ2ID0ga2V5LmtleTtcbiAgICBjb25zdCBzaWduZXIgPSBuZXcgS2V5UGFpcih7IHBydjogcHJ2IH0pO1xuICAgIHRoaXMuX3NpZ25lcnMucHVzaChzaWduZXIpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGFkZFNpZ25hdHVyZShwdWJsaWNLZXk6IEJhc2VQdWJsaWNLZXksIHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgdGhpcy5fc2lnbmF0dXJlcy5zZXQocHVibGljS2V5LnB1YiwgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc2VuZGVyIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqIFRoaXMgYWNjb3VudCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBwYXlpbmcgdHJhbnNhY3Rpb24gZmVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbmRlckFkZHJlc3MgdGhlIGFjY291bnQgdGhhdCBpcyBzZW5kaW5nIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHNlbmRlcihzZW5kZXJBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB2YWxpZGF0ZUFkZHJlc3Moc2VuZGVyQWRkcmVzcywgJ3NlbmRlcicpO1xuICAgIHRoaXMuX3NlbmRlciA9IHNlbmRlckFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiBub25jZS5cbiAgICogUmVxdWlyZXMgYm90aCBvcHRpb25hbCBwYXJhbXMgaW4gb3JkZXIgdG8gdXNlIHRoZSBkdXJhYmxlIG5vbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmxvY2tIYXNoIFRoZSBsYXRlc3QgYmxvY2tIYXNoIG9yIHRoZSBkdXJhYmxlIG5vbmNlIGhhc2hcbiAgICogQHBhcmFtIHtEdXJhYmxlTm9uY2VQYXJhbXN9IFtkdXJhYmxlTm9uY2VQYXJhbXNdIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSB3YWxsZXROb25jZUFkZHJlc3MgYW5kIHRoZSBhdXRoV2FsbGV0QWRkcmVzcyAocmVxdWlyZWQgZm9yIGR1cmFibGUgbm9uY2UpXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBub25jZShibG9ja0hhc2g6IHN0cmluZywgZHVyYWJsZU5vbmNlUGFyYW1zPzogeyB3YWxsZXROb25jZUFkZHJlc3M6IHN0cmluZzsgYXV0aFdhbGxldEFkZHJlc3M6IHN0cmluZyB9KTogdGhpcyB7XG4gICAgaWYgKCFibG9ja0hhc2ggfHwgIWlzVmFsaWRCbG9ja0lkKGJsb2NrSGFzaCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyBibG9ja0hhc2gsIGdvdDogJyArIGJsb2NrSGFzaCk7XG4gICAgfVxuICAgIGlmIChkdXJhYmxlTm9uY2VQYXJhbXMpIHtcbiAgICAgIHZhbGlkYXRlQWRkcmVzcyhkdXJhYmxlTm9uY2VQYXJhbXMud2FsbGV0Tm9uY2VBZGRyZXNzLCAnd2FsbGV0Tm9uY2VBZGRyZXNzJyk7XG4gICAgICB2YWxpZGF0ZUFkZHJlc3MoZHVyYWJsZU5vbmNlUGFyYW1zLmF1dGhXYWxsZXRBZGRyZXNzLCAnYXV0aFdhbGxldEFkZHJlc3MnKTtcbiAgICAgIGlmIChkdXJhYmxlTm9uY2VQYXJhbXMud2FsbGV0Tm9uY2VBZGRyZXNzID09PSBkdXJhYmxlTm9uY2VQYXJhbXMuYXV0aFdhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBwYXJhbXM6IHdhbGxldE5vbmNlQWRkcmVzcyBjYW5ub3QgYmUgZXF1YWwgdG8gYXV0aFdhbGxldEFkZHJlc3MnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25vbmNlSW5mbyA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICBwYXJhbXM6IGR1cmFibGVOb25jZVBhcmFtcyxcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuX3JlY2VudEJsb2NraGFzaCA9IGJsb2NrSGFzaDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGludGVudCBpbnN0cnVjdGlvbnMgdG8gYnVpbGQsIHVzaW5nIHRoZSBzaGFyZWQgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gICAqIHJlcHJlc2VudGF0aW9uIGNvbnN1bWVkIGJ5IGBzb2xJbnN0cnVjdGlvbkZhY3RvcnlgIChzYW1lIGFzIHRoZSB2MCBmbG93cykuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gaW5zdHJ1Y3Rpb25zIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uUGFyYW1zW10pOiB0aGlzIHtcbiAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gWy4uLmluc3RydWN0aW9uc107XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIGEgcHJlLWJ1aWx0IGluc3RydWN0aW9uIChlLmcuIGFuIGVudmVsb3BlLWRlcml2ZWQgaW5zdHJ1Y3Rpb24gb3IgYVxuICAgKiBjdXN0b20gaW5zdHJ1Y3Rpb24pIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9ufSBpbnN0cnVjdGlvbiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYXBwZW5kXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBhZGRJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbik6IHRoaXMge1xuICAgIHRoaXMuX2V4dHJhSW5zdHJ1Y3Rpb25zLnB1c2goaW5zdHJ1Y3Rpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdjEgdHJhbnNhY3Rpb24gY29uZmlnIChjb21wdXRlIHVuaXQgbGltaXQsIGhlYXAgc2l6ZSwgbG9hZGVkXG4gICAqIGFjY291bnRzIGRhdGEgc2l6ZSBsaW1pdCwgYW5kIHByaW9yaXR5IGZlZSBhcyB0b3RhbCBsYW1wb3J0cykuIFJlcXVpcmVkXG4gICAqIGJlZm9yZSBidWlsZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtTb2xWMVRyYW5zYWN0aW9uQ29uZmlnfSBjb25maWcgdGhlIHYxIHRyYW5zYWN0aW9uIGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgdHJhbnNhY3Rpb25Db25maWcoY29uZmlnOiBTb2xWMVRyYW5zYWN0aW9uQ29uZmlnKTogdGhpcyB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25Db25maWcgPSBjb25maWc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBwcmlvcml0eSBmZWUgKHRvdGFsIGxhbXBvcnRzKSBvbiB0aGUgdjEgdHJhbnNhY3Rpb24gY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0ge0ZlZU9wdGlvbnN9IGZlZU9wdGlvbnMgdGhlIHByaW9yaXR5IGZlZVxuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgc2V0UHJpb3JpdHlGZWUoZmVlT3B0aW9uczogRmVlT3B0aW9ucyk6IHRoaXMge1xuICAgIGlmICghdGhpcy5fdHJhbnNhY3Rpb25Db25maWcpIHtcbiAgICAgIHRoaXMuX3RyYW5zYWN0aW9uQ29uZmlnID0ge1xuICAgICAgICBjb21wdXRlVW5pdExpbWl0OiBudWxsLFxuICAgICAgICBoZWFwU2l6ZTogbnVsbCxcbiAgICAgICAgbG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0OiBudWxsLFxuICAgICAgICBwcmlvcml0eUZlZTogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMuX3RyYW5zYWN0aW9uQ29uZmlnLnByaW9yaXR5RmVlID0gTnVtYmVyKGZlZU9wdGlvbnMuYW1vdW50KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZlZSAobGFtcG9ydHMgcGVyIHNpZ25hdHVyZSkgZm9yIGZlZSBlc3RpbWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0ZlZU9wdGlvbnN9IGZlZU9wdGlvbnMgdGhlIGZlZVxuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgZmVlKGZlZU9wdGlvbnM6IEZlZU9wdGlvbnMpOiB0aGlzIHtcbiAgICB0aGlzLl9sYW1wb3J0c1BlclNpZ25hdHVyZSA9IE51bWJlcihmZWVPcHRpb25zLmFtb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmZWVQYXllcihmZWVQYXllcjogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fZmVlUGF5ZXIgPSBmZWVQYXllcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1lbW8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZW1vXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBtZW1vKG1lbW86IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVNZW1vKG1lbW8pO1xuICAgIHRoaXMuX21lbW8gPSBtZW1vO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB6ay1lbGdhbWFsLXByb29mIHByb2dyYW0gaWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRoZSBjYW5vbmljYWwgb24tY2hhaW4gcHJvZ3JhbSBpZCAoYFprRTFHYW1hMVByb29mMTExLi4uYClcbiAgICogd2hpY2ggaXMgdGhlIHNhbWUgYWNyb3NzIG1haW5uZXQsIGRldm5ldCwgYW5kIHRlc3RuZXQuIE92ZXJyaWRlIG9ubHlcbiAgICogd2hlbiB0YXJnZXRpbmcgYSBjdXN0b20gZGVwbG95bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb2dyYW1JZCBiYXNlNTggZW5jb2RlZCBwcm9ncmFtIGlkXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICB6a1Byb29mUHJvZ3JhbUlkKHByb2dyYW1JZDogc3RyaW5nKTogdGhpcyB7XG4gICAgYXNzZXJ0KHByb2dyYW1JZCwgJ01pc3NpbmcgcHJvZ3JhbUlkIHBhcmFtJyk7XG4gICAgdGhpcy5femtQcm9vZlByb2dyYW1JZCA9IHByb2dyYW1JZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvLyBlbmRyZWdpb25cblxuICAvLyByZWdpb24gVmFsaWRhdG9yc1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IEJhc2VBZGRyZXNzLCBhZGRyZXNzRm9ybWF0Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGFkZHJlc3MgJyArIGFkZHJlc3MuYWRkcmVzcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlS2V5KGtleTogQmFzZUtleSk6IHZvaWQge1xuICAgIGxldCBrZXlQYWlyOiBLZXlQYWlyO1xuICAgIHRyeSB7XG4gICAgICBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IGtleS5rZXkgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGtleScpO1xuICAgIH1cblxuICAgIGlmICgha2V5UGFpci5nZXRLZXlzKCkucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGtleScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcGFyc2VXaXJlVHJhbnNhY3Rpb24obmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgcmF3IHRyYW5zYWN0aW9uOiAnICsgKGUgYXMgRXJyb3IpLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uPzogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlU2VuZGVyKCk7XG4gICAgdGhpcy52YWxpZGF0ZU5vbmNlKCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1lbW8uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZW1vIC0gdGhlIG1lbW8gYXMgc3RyaW5nXG4gICAqL1xuICB2YWxpZGF0ZU1lbW8obWVtbzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFtZW1vKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIG1lbW8sIGdvdDogJyArIG1lbW8pO1xuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRNZW1vKG1lbW8pKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdNZW1vIGlzIHRvbyBsb25nJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBnaXZlbiBrZXkgaXMgbm90IGFscmVhZHkgaW4gdGhpcy5fc2lnbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtCYXNlS2V5fSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRHVwbGljYXRlZFNpZ25lcihrZXk6IEJhc2VLZXkpIHtcbiAgICB0aGlzLl9zaWduZXJzLmZvckVhY2goKGtwKSA9PiB7XG4gICAgICBpZiAoa3AuZ2V0S2V5cygpLnBydiA9PT0ga2V5LmtleSkge1xuICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdEdXBsaWNhdGVkIHNpZ25lcjogJyArIGtleS5rZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBzZW5kZXIgZmllbGQgaXMgZGVmaW5lZC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZW5kZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3NlbmRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHNlbmRlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgbm9uY2UgZmllbGQgaXMgZGVmaW5lZC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVOb25jZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcmVjZW50QmxvY2toYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgfVxuICB9XG4gIC8vIGVuZHJlZ2lvblxufVxuIl19
|
|
591
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjFUcmFuc2FjdGlvbkJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3YxVHJhbnNhY3Rpb25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIscUJBQXFCLEVBR3JCLFlBQVksR0FJYixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGdDQUFnQyxFQUNoQyxXQUFXLElBQUksY0FBYyxFQUM3QixzQkFBc0IsR0FDdkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLE1BQU0sTUFBTSxNQUFNLENBQUM7QUFDMUIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN2RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsbUNBQW1DLENBQ2pELFlBQW9CLEVBQ3BCLGlCQUF5QjtJQUV6QixNQUFN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LGtCQUFrQixDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0sscUJBQXFCLENBQUMsR0FBWTtRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1lBQzNCLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxZQUFZLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlQWRkcmVzcyxcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uQnVpbGRlcixcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBGZWVPcHRpb25zLFxuICBQdWJsaWNLZXkgYXMgQmFzZVB1YmxpY0tleSxcbiAgU2lnbmluZ0Vycm9yLFxuICBTb2xWMVRyYW5zYWN0aW9uQ29uZmlnLFxuICBTb2xWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHtcbiAgUHVibGljS2V5LFxuICBTeXN0ZW1Qcm9ncmFtLFxuICBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWSxcbiAgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgYmFzZTU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEluc3RydWN0aW9uUGFyYW1zLCBNZW1vLCBOb25jZSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgc29sSW5zdHJ1Y3Rpb25GYWN0b3J5IH0gZnJvbSAnLi9zb2xJbnN0cnVjdGlvbkZhY3RvcnknO1xuaW1wb3J0IHsgY29tcGlsZVRyYW5zYWN0aW9uTWVzc2FnZSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlJztcbmltcG9ydCB7IHNlcmlhbGl6ZVdpcmVUcmFuc2FjdGlvbiB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi93aXJlLXRyYW5zYWN0aW9uJztcbmltcG9ydCB7IHBhcnNlV2lyZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL3BhcnNlV2lyZVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IGRlY29kZVYxTWVzc2FnZSB9IGZyb20gJy4vc2VyaWFsaXphdGlvbi9jb2RlY3MvdjEvbWVzc2FnZSc7XG5pbXBvcnQgeyBpc1ZhbGlkQWRkcmVzcywgaXNWYWxpZEJsb2NrSWQsIGlzVmFsaWRNZW1vLCB2YWxpZGF0ZUFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhbiBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uIGZvciBhIGR1cmFibGUgbm9uY2UuXG4gKlxuICogVGhlIHYwIHBhdGggcmVjZWl2ZXMgdGhpcyBpbnN0cnVjdGlvbiBmcm9tIHdlYjMuanMgLyB0aGUgUnVzdCB3YXNtIGNvcmVcbiAqIChgTm9uY2VTb3VyY2VgIGR1cmFibGUgdmFyaWFudCk7IHRoZSB2MSBwYXRoIGNvbXBpbGVzIHZpYVxuICogYGNvbXBpbGVUcmFuc2FjdGlvbk1lc3NhZ2VgLCBzbyB0aGUgbm9uY2UgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBjb25zdHJ1Y3RlZCBpblxuICogVHlwZVNjcmlwdCBhbmQgaW5qZWN0ZWQgaW50byB0aGUgY29tcGlsZSBpbnB1dC4gVGhlIG5vbmNlIGF1dGhvcml0eVxuICogKGBhdXRoV2FsbGV0QWRkcmVzc2ApIE1VU1Qgc2lnbiB0aGUgaW5zdHJ1Y3Rpb24g4oCUIGl0IGJlY29tZXMgYSByZXF1aXJlZFxuICogc2lnbmVyIG9mIHRoZSBjb21waWxlZCBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBub25jZUFkZHJlc3MgLSB0aGUgZHVyYWJsZSBub25jZSBhY2NvdW50IGFkZHJlc3NcbiAqIEBwYXJhbSBhdXRoV2FsbGV0QWRkcmVzcyAtIHRoZSBub25jZSBhdXRob3JpdHkgKGdhcy10YW5rIHJvb3QgaW4gQml0R28ncyBtb2RlbClcbiAqIEByZXR1cm5zIHRoZSBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFkdmFuY2VOb25jZUFjY291bnRJbnN0cnVjdGlvbihcbiAgbm9uY2VBZGRyZXNzOiBzdHJpbmcsXG4gIGF1dGhXYWxsZXRBZGRyZXNzOiBzdHJpbmdcbik6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24ge1xuICBhc3NlcnQobm9uY2VBZGRyZXNzLCAnTWlzc2luZyBub25jZUFkZHJlc3MgcGFyYW0nKTtcbiAgYXNzZXJ0KGF1dGhXYWxsZXRBZGRyZXNzLCAnTWlzc2luZyBhdXRoV2FsbGV0QWRkcmVzcyBwYXJhbScpO1xuICByZXR1cm4gU3lzdGVtUHJvZ3JhbS5ub25jZUFkdmFuY2Uoe1xuICAgIG5vbmNlUHVia2V5OiBuZXcgUHVibGljS2V5KG5vbmNlQWRkcmVzcyksXG4gICAgYXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoV2FsbGV0QWRkcmVzcyksXG4gIH0pO1xufVxuXG4vKipcbiAqIE1hcCBhIHYxIGVudmVsb3BlIGluc3RydWN0aW9uIChpbmRleC1iYXNlZCkgaW50byBhIHdlYjMuanMgVHJhbnNhY3Rpb25JbnN0cnVjdGlvblxuICogKGFkZHJlc3MtYmFzZWQpLCBkZXJpdmluZyBlYWNoIHJlZmVyZW5jZWQgYWNjb3VudCdzIHNpZ25lci93cml0YWJsZSByb2xlIGZyb20gdGhlXG4gKiBtZXNzYWdlIGhlYWRlciAoU29sYW5hIHJvbGUgY29udmVudGlvbnM6IHRoZSBsYXN0IGBudW1SZWFkb25seVNpZ25lZEFjY291bnRzYFxuICogc2lnbmVycyBhbmQgbGFzdCBgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzYCBub24tc2lnbmVycyBhcmUgcmVhZG9ubHkpLlxuICpcbiAqIEBwYXJhbSBpbnN0cnVjdGlvbiAtIHRoZSBlbnZlbG9wZSBpbnN0cnVjdGlvbiAocHJvZ3JhbUlkSW5kZXgvYWNjb3VudEtleUluZGV4ZXMvZGF0YSlcbiAqIEBwYXJhbSBkYXRhIC0gdGhlIHYxIGVudmVsb3BlXG4gKiBAcmV0dXJucyB0aGUgYWRkcmVzcy1iYXNlZCBpbnN0cnVjdGlvbiwgcmVhZHkgZm9yIFYxVHJhbnNhY3Rpb25CdWlsZGVyLmFkZEluc3RydWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1YxVHJhbnNhY3Rpb25JbnN0cnVjdGlvbihcbiAgaW5zdHJ1Y3Rpb246IHsgcHJvZ3JhbUlkSW5kZXg6IG51bWJlcjsgYWNjb3VudEtleUluZGV4ZXM6IG51bWJlcltdOyBkYXRhOiBzdHJpbmcgfSxcbiAgZGF0YTogU29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhXG4pOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHtcbiAgY29uc3QgeyBzdGF0aWNBY2NvdW50S2V5cywgbWVzc2FnZUhlYWRlciB9ID0gZGF0YTtcbiAgY29uc3QgbnVtUmVxdWlyZWRTaWduYXR1cmVzID0gbWVzc2FnZUhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7XG4gIGNvbnN0IG51bUFjY291bnRzID0gc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuXG4gIGNvbnN0IGlzU2lnbmVyID0gKGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IGluZGV4IDwgbnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICBjb25zdCBpc1dyaXRhYmxlID0gKGluZGV4OiBudW1iZXIpOiBib29sZWFuID0+XG4gICAgaXNTaWduZXIoaW5kZXgpXG4gICAgICA/IGluZGV4IDwgbnVtUmVxdWlyZWRTaWduYXR1cmVzIC0gbWVzc2FnZUhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzXG4gICAgICA6IGluZGV4IDwgbnVtQWNjb3VudHMgLSBtZXNzYWdlSGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cztcblxuICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgIHByb2dyYW1JZDogbmV3IFB1YmxpY0tleShzdGF0aWNBY2NvdW50S2V5c1tpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleF0pLFxuICAgIGtleXM6IGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLm1hcCgoYWNjb3VudEluZGV4KSA9PiAoe1xuICAgICAgcHVia2V5OiBuZXcgUHVibGljS2V5KHN0YXRpY0FjY291bnRLZXlzW2FjY291bnRJbmRleF0pLFxuICAgICAgaXNTaWduZXI6IGlzU2lnbmVyKGFjY291bnRJbmRleCksXG4gICAgICBpc1dyaXRhYmxlOiBpc1dyaXRhYmxlKGFjY291bnRJbmRleCksXG4gICAgfSkpLFxuICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGJhc2U1OC5kZWNvZGUoaW5zdHJ1Y3Rpb24uZGF0YSkpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbmplY3QgYW4gQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbiBpbnRvIGEgdjEgZW52ZWxvcGUgZm9yIGR1cmFibGUgbm9uY2UuXG4gKlxuICogdjEgKFNJTUQtMDI5Ni8wMzg1KSBoYXMgbm8gYWRkcmVzcyBsb29rdXAgdGFibGVzLCBzbyBldmVyeSBhY2NvdW50IGlzIGEgc3RhdGljXG4gKiBrZXkuIFRoZSBub25jZSBhdXRob3JpdHkgTVVTVCBzaWduIHRoZSBBZHZhbmNlTm9uY2VBY2NvdW50IGluc3RydWN0aW9uIChoYXJkXG4gKiBydW50aW1lIHJlcXVpcmVtZW50KSBhbmQgdGhlIG5vbmNlIGFjY291bnQgTVVTVCBiZSB3cml0YWJsZTsgdGhlIHN5c3RlbSBwcm9ncmFtXG4gKiBhbmQgcmVjZW50LWJsb2NraGFzaGVzIHN5c3ZhciBhcmUgcmVhZG9ubHkgbm9uLXNpZ25lcnMuIFRoZSBpbnN0cnVjdGlvbiBpc1xuICogcHJlcGVuZGVkIGFuZCBldmVyeSBpbnN0cnVjdGlvbidzIGFjY291bnQgaW5kZXhlcyBhcmUgcmVtYXBwZWQgdG8gdGhlIHJlYnVpbHRcbiAqIHN0YXRpYyBrZXkgbGlzdDsgbWVzc2FnZUhlYWRlciBncm93cyBhY2NvcmRpbmdseSBzbyB0aGUgd2lyZS1zaXplIGVzdGltYXRlIGFuZFxuICogYWNjb3VudCBjYXBzIGFyZSBjb3JyZWN0LlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gdGhlIHYxIGVudmVsb3BlIChjbGllbnQtc3VwcGxpZWQsIG5vIG5vbmNlIGluc3RydWN0aW9uKVxuICogQHBhcmFtIGR1cmFibGVOb25jZVBhcmFtcyAtIHdhbGxldE5vbmNlQWRkcmVzcyArIGF1dGhXYWxsZXRBZGRyZXNzIChnYXMtdGFuayByb290KVxuICogQHJldHVybnMgYSBjb3B5IG9mIHRoZSBlbnZlbG9wZSB3aXRoIHRoZSBub25jZSBpbnN0cnVjdGlvbiBpbmplY3RlZFxuICogQGVkZ2UgaWYgdGhlIGVudmVsb3BlIGFscmVhZHkgY29udGFpbnMgYW4gQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbiwgcmV0dXJuc1xuICogICB0aGUgZW52ZWxvcGUgdW5jaGFuZ2VkIChpZGVtcG90ZW50IC0gYSBkdXJhYmxlLWF3YXJlIGNsaWVudCBtYXkgc3VwcGx5IGl0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0VjFOb25jZUFkdmFuY2VJbnN0cnVjdGlvbihcbiAgZGF0YTogU29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhLFxuICBkdXJhYmxlTm9uY2VQYXJhbXM6IHsgd2FsbGV0Tm9uY2VBZGRyZXNzOiBzdHJpbmc7IGF1dGhXYWxsZXRBZGRyZXNzOiBzdHJpbmcgfVxuKTogU29sVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIHtcbiAgY29uc3QgeyB3YWxsZXROb25jZUFkZHJlc3MsIGF1dGhXYWxsZXRBZGRyZXNzIH0gPSBkdXJhYmxlTm9uY2VQYXJhbXM7XG4gIGNvbnN0IFNZU1RFTV9QUk9HUkFNID0gU3lzdGVtUHJvZ3JhbS5wcm9ncmFtSWQudG9CYXNlNTgoKTtcbiAgY29uc3QgU1lTVkFSX1JFQ0VOVF9CTE9DS0hBU0hFUyA9IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfUFVCS0VZLnRvQmFzZTU4KCk7XG5cbiAgLy8gSWRlbXBvdGVuY2U6IGEgZHVyYWJsZS1hd2FyZSBjbGllbnQgbWF5IGFscmVhZHkgaW5jbHVkZSB0aGUgbm9uY2UgaW5zdHJ1Y3Rpb24uXG4gIGNvbnN0IGhhc05vbmNlQWR2YW5jZSA9IGRhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLnNvbWUoKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IGRhdGEuc3RhdGljQWNjb3VudEtleXNbaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXhdO1xuICAgIHJldHVybiBwcm9ncmFtID09PSBTWVNURU1fUFJPR1JBTSAmJiBCdWZmZXIuZnJvbShiYXNlNTguZGVjb2RlKGluc3RydWN0aW9uLmRhdGEpKVswXSA9PT0gNDtcbiAgfSk7XG4gIGlmIChoYXNOb25jZUFkdmFuY2UpIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0IHsgbnVtUmVxdWlyZWRTaWduYXR1cmVzLCBudW1SZWFkb25seVNpZ25lZEFjY291bnRzLCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMgfSA9IGRhdGEubWVzc2FnZUhlYWRlcjtcbiAgY29uc3Qgb2xkU3RhdGljTGVuID0gZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGg7XG4gIGlmIChcbiAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzID4gbnVtUmVxdWlyZWRTaWduYXR1cmVzIHx8XG4gICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzICsgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzID4gb2xkU3RhdGljTGVuXG4gICkge1xuICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICBgSW52YWxpZCBtZXNzYWdlIGhlYWRlcjogcmVhZG9ubHkgY291bnRzICgke251bVJlYWRvbmx5U2lnbmVkQWNjb3VudHN9LCAke251bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c30pIGAgK1xuICAgICAgICBgYXJlIGluY29uc2lzdGVudCB3aXRoICR7bnVtUmVxdWlyZWRTaWduYXR1cmVzfSByZXF1aXJlZCBzaWduYXR1cmVzIGFuZCAke29sZFN0YXRpY0xlbn0gc3RhdGljIGFjY291bnQga2V5c2BcbiAgICApO1xuICB9XG5cbiAgLy8gU3BsaXQgdGhlIHN0YXRpYyBrZXlzIGludG8gdGhlIGZvdXIgdjEgaGVhZGVyIHNlY3Rpb25zLlxuICBjb25zdCB3cml0YWJsZVNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKDAsIG51bVJlcXVpcmVkU2lnbmF0dXJlcyAtIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMpO1xuICBjb25zdCByZWFkb25seVNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKFxuICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlcyAtIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsXG4gICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzXG4gICk7XG4gIGNvbnN0IHdyaXRhYmxlTm9uU2lnbmVycyA9IGRhdGEuc3RhdGljQWNjb3VudEtleXMuc2xpY2UoXG4gICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzLFxuICAgIG9sZFN0YXRpY0xlbiAtIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c1xuICApO1xuICBjb25zdCByZWFkb25seU5vblNpZ25lcnMgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzLnNsaWNlKG9sZFN0YXRpY0xlbiAtIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyk7XG5cbiAgLy8gVGhlIG5vbmNlIGF1dGhvcml0eSBtdXN0IGJlIGEgc2lnbmVyIGZvciBBZHZhbmNlTm9uY2VBY2NvdW50LlxuICBjb25zdCBhdXRob3JpdHlJc1NpZ25lciA9IHdyaXRhYmxlU2lnbmVycy5pbmNsdWRlcyhhdXRoV2FsbGV0QWRkcmVzcykgfHwgcmVhZG9ubHlTaWduZXJzLmluY2x1ZGVzKGF1dGhXYWxsZXRBZGRyZXNzKTtcbiAgaWYgKCFhdXRob3JpdHlJc1NpZ25lcikge1xuICAgIGNvbnN0IGFzUmVhZG9ubHlOb25TaWduZXIgPSByZWFkb25seU5vblNpZ25lcnMuaW5kZXhPZihhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgY29uc3QgYXNXcml0YWJsZU5vblNpZ25lciA9IHdyaXRhYmxlTm9uU2lnbmVycy5pbmRleE9mKGF1dGhXYWxsZXRBZGRyZXNzKTtcbiAgICBpZiAoYXNSZWFkb25seU5vblNpZ25lciA+PSAwKSB7XG4gICAgICByZWFkb25seU5vblNpZ25lcnMuc3BsaWNlKGFzUmVhZG9ubHlOb25TaWduZXIsIDEpO1xuICAgICAgcmVhZG9ubHlTaWduZXJzLnB1c2goYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgIH0gZWxzZSBpZiAoYXNXcml0YWJsZU5vblNpZ25lciA+PSAwKSB7XG4gICAgICB3cml0YWJsZU5vblNpZ25lcnMuc3BsaWNlKGFzV3JpdGFibGVOb25TaWduZXIsIDEpO1xuICAgICAgd3JpdGFibGVTaWduZXJzLnB1c2goYXV0aFdhbGxldEFkZHJlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWFkb25seVNpZ25lcnMucHVzaChhdXRoV2FsbGV0QWRkcmVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIG5vbmNlIGFjY291bnQgbXVzdCBiZSB3cml0YWJsZSBmb3IgQWR2YW5jZU5vbmNlQWNjb3VudC5cbiAgY29uc3Qgbm9uY2VBc1JlYWRvbmx5Tm9uU2lnbmVyID0gcmVhZG9ubHlOb25TaWduZXJzLmluZGV4T2Yod2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgY29uc3Qgbm9uY2VBc1JlYWRvbmx5U2lnbmVyID0gcmVhZG9ubHlTaWduZXJzLmluZGV4T2Yod2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgaWYgKG5vbmNlQXNSZWFkb25seU5vblNpZ25lciA+PSAwKSB7XG4gICAgcmVhZG9ubHlOb25TaWduZXJzLnNwbGljZShub25jZUFzUmVhZG9ubHlOb25TaWduZXIsIDEpO1xuICAgIHdyaXRhYmxlTm9uU2lnbmVycy5wdXNoKHdhbGxldE5vbmNlQWRkcmVzcyk7XG4gIH0gZWxzZSBpZiAobm9uY2VBc1JlYWRvbmx5U2lnbmVyID49IDApIHtcbiAgICByZWFkb25seVNpZ25lcnMuc3BsaWNlKG5vbmNlQXNSZWFkb25seVNpZ25lciwgMSk7XG4gICAgd3JpdGFibGVTaWduZXJzLnB1c2god2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgfSBlbHNlIGlmICghd3JpdGFibGVTaWduZXJzLmluY2x1ZGVzKHdhbGxldE5vbmNlQWRkcmVzcykgJiYgIXdyaXRhYmxlTm9uU2lnbmVycy5pbmNsdWRlcyh3YWxsZXROb25jZUFkZHJlc3MpKSB7XG4gICAgd3JpdGFibGVOb25TaWduZXJzLnB1c2god2FsbGV0Tm9uY2VBZGRyZXNzKTtcbiAgfVxuXG4gIC8vIFRoZSBzeXN0ZW0gcHJvZ3JhbSBhbmQgcmVjZW50LWJsb2NraGFzaGVzIHN5c3ZhciBhcmUgcmVhZG9ubHkgbm9uLXNpZ25lcnMuXG4gIGNvbnN0IGlzUHJlc2VudCA9IChrZXk6IHN0cmluZykgPT5cbiAgICB3cml0YWJsZVNpZ25lcnMuaW5jbHVkZXMoa2V5KSB8fFxuICAgIHJlYWRvbmx5U2lnbmVycy5pbmNsdWRlcyhrZXkpIHx8XG4gICAgd3JpdGFibGVOb25TaWduZXJzLmluY2x1ZGVzKGtleSkgfHxcbiAgICByZWFkb25seU5vblNpZ25lcnMuaW5jbHVkZXMoa2V5KTtcbiAgaWYgKCFpc1ByZXNlbnQoU1lTVEVNX1BST0dSQU0pKSB7XG4gICAgcmVhZG9ubHlOb25TaWduZXJzLnB1c2goU1lTVEVNX1BST0dSQU0pO1xuICB9XG4gIGlmICghaXNQcmVzZW50KFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMpKSB7XG4gICAgcmVhZG9ubHlOb25TaWduZXJzLnB1c2goU1lTVkFSX1JFQ0VOVF9CTE9DS0hBU0hFUyk7XG4gIH1cblxuICBjb25zdCBuZXdTdGF0aWNBY2NvdW50S2V5cyA9IFsuLi53cml0YWJsZVNpZ25lcnMsIC4uLnJlYWRvbmx5U2lnbmVycywgLi4ud3JpdGFibGVOb25TaWduZXJzLCAuLi5yZWFkb25seU5vblNpZ25lcnNdO1xuXG4gIC8vIFJlbWFwIGV2ZXJ5IGluc3RydWN0aW9uIGluZGV4IHRvIHRoZSBuZXcga2V5IG9yZGVyICh2MSBoYXMgbm8gbG9va3VwIHRhYmxlcykuXG4gIGNvbnN0IGluZGV4TWFwID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5mb3JFYWNoKChrZXksIG9sZElkeCkgPT4gaW5kZXhNYXAuc2V0KG9sZElkeCwgbmV3U3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihrZXkpKSk7XG4gIGNvbnN0IHJlbWFwSW5kZXggPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgY29uc3QgbWFwcGVkID0gaW5kZXhNYXAuZ2V0KGluZGV4KTtcbiAgICBpZiAobWFwcGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgYWNjb3VudCBrZXkgaW5kZXggJHtpbmRleH0gaW4gdmVyc2lvbmVkIGluc3RydWN0aW9uYCk7XG4gICAgfVxuICAgIHJldHVybiBtYXBwZWQ7XG4gIH07XG5cbiAgY29uc3Qgbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gPSB7XG4gICAgcHJvZ3JhbUlkSW5kZXg6IG5ld1N0YXRpY0FjY291bnRLZXlzLmluZGV4T2YoU1lTVEVNX1BST0dSQU0pLFxuICAgIGFjY291bnRLZXlJbmRleGVzOiBbXG4gICAgICBuZXdTdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKHdhbGxldE5vbmNlQWRkcmVzcyksXG4gICAgICBuZXdTdGF0aWNBY2NvdW50S2V5cy5pbmRleE9mKFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVMpLFxuICAgICAgbmV3U3RhdGljQWNjb3VudEtleXMuaW5kZXhPZihhdXRoV2FsbGV0QWRkcmVzcyksXG4gICAgXSxcbiAgICBkYXRhOiAnNnZ4OFAnLCAvLyBiYXNlNTggb2YgU3lzdGVtUHJvZ3JhbSBBZHZhbmNlTm9uY2VBY2NvdW50ICgweDA0MDAwMDAwKVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uZGF0YSxcbiAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IFtcbiAgICAgIG5vbmNlQWR2YW5jZUluc3RydWN0aW9uLFxuICAgICAgLi4uZGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4gKHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IHJlbWFwSW5kZXgoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXgpLFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMubWFwKHJlbWFwSW5kZXgpLFxuICAgICAgICBkYXRhOiBpbnN0cnVjdGlvbi5kYXRhLFxuICAgICAgfSkpLFxuICAgIF0sXG4gICAgc3RhdGljQWNjb3VudEtleXM6IG5ld1N0YXRpY0FjY291bnRLZXlzLFxuICAgIG1lc3NhZ2VIZWFkZXI6IHtcbiAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogd3JpdGFibGVTaWduZXJzLmxlbmd0aCArIHJlYWRvbmx5U2lnbmVycy5sZW5ndGgsXG4gICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiByZWFkb25seVNpZ25lcnMubGVuZ3RoLFxuICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiByZWFkb25seU5vblNpZ25lcnMubGVuZ3RoLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQmFzZSBidWlsZGVyIGZvciBTb2xhbmEgdjEgKFNJTUQtMDI5Ni8wMzg1KSB0cmFuc2FjdGlvbnMuXG4gKlxuICogUGFyYWxsZWwgdG8gdGhlIHYwIHtAbGluayBUcmFuc2FjdGlvbkJ1aWxkZXJ9LCB3aGljaCBpcyBib3VuZCB0byBhXG4gKiBgQHNvbGFuYS93ZWIzLmpzYCB2MCBgVHJhbnNhY3Rpb25gIGFuZCBjYW5ub3QgZW1pdCBhIHYxIHdpcmUuIFRoaXMgYnVpbGRlclxuICogb3ducyB0aGUgdjEgYXNzZW1ibHk6XG4gKlxuICogLSBpbnRlbnQtdG8taW5zdHJ1Y3Rpb24gZGVyaXZhdGlvbiB2aWEgdGhlIHNoYXJlZCBgc29sSW5zdHJ1Y3Rpb25GYWN0b3J5YFxuICogICAoc2FtZSBgSW5zdHJ1Y3Rpb25QYXJhbXNgIHJlcHJlc2VudGF0aW9uIGFzIHRoZSB2MCBmbG93cylcbiAqIC0gZHVyYWJsZSBub25jZTogYEFkdmFuY2VOb25jZUFjY291bnRgIGluc3RydWN0aW9uIGluamVjdGlvbiAoZmlyc3QpIHBsdXMgdGhlXG4gKiAgIG5vbmNlIGhhc2ggaW4gdGhlIGJsb2NraGFzaCBmaWVsZFxuICogLSB0cmFuc2FjdGlvbiBjb25maWcgKGNvbXB1dGUgdW5pdCBsaW1pdCwgaGVhcCBzaXplLCBsb2FkZWQgYWNjb3VudHMgZGF0YVxuICogICBzaXplIGxpbWl0LCBwcmlvcml0eSBmZWUgYXMgdG90YWwgbGFtcG9ydHMpXG4gKiAtIHNpZ25lciBtYW5hZ2VtZW50OiBwcml2YXRlLWtleSBzaWduZXJzIChgc2lnbmApIGFuZCBleHRlcm5hbCBzaWduYXR1cmVzXG4gKiAgIChgYWRkU2lnbmF0dXJlYCksIGFzc2VtYmxlZCBpbiBtZXNzYWdlLXNpZ25lciBvcmRlclxuICogLSBtZXNzYWdlIGNvbXBpbGUgdmlhIGBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlYCBhbmQgc2lnbmVkIHdpcmUgdmlhXG4gKiAgIGBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb25gXG4gKlxuICogU2lnbmF0dXJlIGFzc2VtYmx5IGlzIGluIG1lc3NhZ2Utc2lnbmVyIG9yZGVyIChmZWUgcGF5ZXIgZmlyc3QsIHRoZW4gdGhlXG4gKiByZW1haW5pbmcgc2lnbmVycyBpbiB0aGUgY29tcGlsZWQgYWNjb3VudCBvcmRlciksIE5PVCBpbnNlcnRpb24gb3JkZXIg4oCUXG4gKiByZXF1aXJlZCBmb3IgbXVsdGktc2lnbmVyIHYxIHRyYW5zYWN0aW9ucyBzdWNoIGFzIGR1cmFibGUtbm9uY2UgQ1RcbiAqICh1c2VyICsgZ2FzLXRhbmsgbm9uY2UgYXV0aG9yaXR5KS4gTWlzc2luZyBzaWduYXR1cmVzIGFyZSB6ZXJvLWZpbGxlZCBpblxuICogdGhlaXIgc2xvdHMgc28gdGhlIHdpcmUgc2hhcGUgc3RheXMgdmFsaWQgZm9yIHBhcnRpYWwtc2lnbiBmbG93czsgdGhlXG4gKiBicm9hZGNhc3RhYmxlIHdpcmUgaXMgb25seSBwcm9kdWNlZCBvbmNlIGV2ZXJ5IHJlcXVpcmVkIHNpZ25lciBoYXMgYVxuICogc2lnbmF0dXJlLlxuICovXG4vKipcbiAqIElucHV0IHNoYXBlIGZvciB7QGxpbmsgVjFUcmFuc2FjdGlvbkJ1aWxkZXIudHJhbnNhY3Rpb25Db25maWd9OiBhbGwgZmllbGRzIG9wdGlvbmFsO1xuICogdW5zZXQgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG51bGwgKHRoZSBTREsgdjEgc2VyaWFsaXplciBjb250cmFjdCkuXG4gKi9cbmV4cG9ydCB0eXBlIFYxVHJhbnNhY3Rpb25Db25maWdJbnB1dCA9IHtcbiAgY29tcHV0ZVVuaXRMaW1pdD86IG51bWJlcjtcbiAgaGVhcFNpemU/OiBudW1iZXI7XG4gIGxvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdD86IG51bWJlcjtcbiAgcHJpb3JpdHlGZWU/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVjFUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIHByaXZhdGUgX2luc3RydWN0aW9uc0RhdGE6IEluc3RydWN0aW9uUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfZXh0cmFJbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSA9IFtdO1xuICBwcml2YXRlIF9zaWduZXJzOiBLZXlQYWlyW10gPSBbXTtcbiAgcHJpdmF0ZSBfc2lnbmF0dXJlczogTWFwPHN0cmluZywgVWludDhBcnJheT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2xhbXBvcnRzUGVyU2lnbmF0dXJlOiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIF9zZW5kZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9mZWVQYXllcj86IHN0cmluZztcbiAgcHJvdGVjdGVkIF9yZWNlbnRCbG9ja2hhc2g6IHN0cmluZztcbiAgcHJvdGVjdGVkIF9ub25jZUluZm8/OiBOb25jZTtcbiAgcHJvdGVjdGVkIF9tZW1vPzogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uQ29uZmlnPzogU29sVjFUcmFuc2FjdGlvbkNvbmZpZztcbiAgLyoqIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgemstZWxnYW1hbC1wcm9vZiBwcm9ncmFtIGlkICh1c2VkIGJ5IENUIGluc3RydWN0aW9uIGJ1aWxkZXJzKSAqL1xuICBwcm90ZWN0ZWQgX3prUHJvb2ZQcm9ncmFtSWQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRWMSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIHRoZSB2MSB0cmFuc2FjdGlvbjogZGVyaXZlIGluc3RydWN0aW9ucywgaW5qZWN0IHRoZSBkdXJhYmxlLW5vbmNlXG4gICAqIGluc3RydWN0aW9uIHdoZW4gcHJlc2VudCwgY29tcGlsZSB0aGUgbWVzc2FnZSwgYW5kIGFzc2VtYmxlIHRoZSBzaWduZWRcbiAgICogd2lyZSBpbiBtZXNzYWdlLXNpZ25lciBvcmRlci5cbiAgICpcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9ufSBUaGUgYnVpbHQgdHJhbnNhY3Rpb24gaG9sZGluZyB0aGUgdjEgbWVzc2FnZSBhbmQgd2lyZSBieXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFYxKCk6IFRyYW5zYWN0aW9uIHtcbiAgICBhc3NlcnQodGhpcy5fc2VuZGVyLCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdzZW5kZXIgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIGFzc2VydCh0aGlzLl9yZWNlbnRCbG9ja2hhc2gsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3JlY2VudCBibG9ja2hhc2ggaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIGFzc2VydCh0aGlzLl90cmFuc2FjdGlvbkNvbmZpZywgJ3RyYW5zYWN0aW9uQ29uZmlnIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgdjEgdHJhbnNhY3Rpb24nKTtcblxuICAgIGNvbnN0IGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdID0gW107XG5cbiAgICAvLyBEdXJhYmxlIG5vbmNlOiB0aGUgQWR2YW5jZU5vbmNlQWNjb3VudCBpbnN0cnVjdGlvbiBNVVNUIGJlIHBhcnQgb2YgdGhlXG4gICAgLy8gbWVzc2FnZSAoYSBiYXJlIG5vbmNlIGhhc2ggd2l0aG91dCB0aGUgaW5zdHJ1Y3Rpb24gaXMgaW52YWxpZCkuIEl0IGlzXG4gICAgLy8gcGxhY2VkIGZpcnN0LCBtYXRjaGluZyB0aGUgdjAgd2ViMy5qcyBjb252ZW50aW9uLlxuICAgIGlmICh0aGlzLl9ub25jZUluZm8pIHtcbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKFxuICAgICAgICBidWlsZEFkdmFuY2VOb25jZUFjY291bnRJbnN0cnVjdGlvbihcbiAgICAgICAgICB0aGlzLl9ub25jZUluZm8ucGFyYW1zLndhbGxldE5vbmNlQWRkcmVzcyxcbiAgICAgICAgICB0aGlzLl9ub25jZUluZm8ucGFyYW1zLmF1dGhXYWxsZXRBZGRyZXNzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhKSB7XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaCguLi5zb2xJbnN0cnVjdGlvbkZhY3RvcnkoaW5zdHJ1Y3Rpb24sIHRoaXMuX3prUHJvb2ZQcm9ncmFtSWQpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWVtbykge1xuICAgICAgY29uc3QgbWVtb0RhdGE6IE1lbW8gPSB7XG4gICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgIHBhcmFtczogeyBtZW1vOiB0aGlzLl9tZW1vIH0sXG4gICAgICB9O1xuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YS5wdXNoKG1lbW9EYXRhKTtcbiAgICAgIGluc3RydWN0aW9ucy5wdXNoKC4uLnNvbEluc3RydWN0aW9uRmFjdG9yeShtZW1vRGF0YSkpO1xuICAgIH1cblxuICAgIGluc3RydWN0aW9ucy5wdXNoKC4uLnRoaXMuX2V4dHJhSW5zdHJ1Y3Rpb25zKTtcblxuICAgIGNvbnN0IGZlZVBheWVyID0gdGhpcy5fZmVlUGF5ZXIgPyBuZXcgUHVibGljS2V5KHRoaXMuX2ZlZVBheWVyKSA6IG5ldyBQdWJsaWNLZXkodGhpcy5fc2VuZGVyKTtcbiAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSBjb21waWxlVHJhbnNhY3Rpb25NZXNzYWdlKHtcbiAgICAgIHZlcnNpb246IDEsXG4gICAgICBpbnN0cnVjdGlvbnMsXG4gICAgICBmZWVQYXllcixcbiAgICAgIHJlY2VudEJsb2NraGFzaDogdGhpcy5fcmVjZW50QmxvY2toYXNoLFxuICAgICAgdHJhbnNhY3Rpb25Db25maWc6IHRoaXMuX3RyYW5zYWN0aW9uQ29uZmlnLFxuICAgIH0pO1xuXG4gICAgLy8gU2lnbmVyIG9yZGVyIGNvbWVzIGZyb20gdGhlIGNvbXBpbGVkIG1lc3NhZ2U6IHRoZSBmaXJzdFxuICAgIC8vIG51bVNpZ25lckFjY291bnRzIHN0YXRpYyBhY2NvdW50cyBhcmUgdGhlIHJlcXVpcmVkIHNpZ25lcnMgKGZlZSBwYXllclxuICAgIC8vIGZpcnN0LCB0aGVuIHRoZSByZW1haW5pbmcgc2lnbmVycyBpbiB0aGUgY29tcGlsZWQgYWNjb3VudCBvcmRlcikuXG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVYxTWVzc2FnZShtZXNzYWdlQnl0ZXMpO1xuICAgIGNvbnN0IHNpZ25lckFkZHJlc3NlcyA9IGRlY29kZWQuc3RhdGljQWNjb3VudHMuc2xpY2UoMCwgZGVjb2RlZC5oZWFkZXIubnVtU2lnbmVyQWNjb3VudHMpO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlczogVWludDhBcnJheVtdID0gW107XG4gICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHNpZ25lckFkZHJlc3Nlcykge1xuICAgICAgY29uc3Qga2V5UGFpciA9IHRoaXMuX3NpZ25lcnMuZmluZCgoc2lnbmVyKSA9PiBzaWduZXIuZ2V0S2V5cygpLnB1YiA9PT0gYWRkcmVzcyk7XG4gICAgICBpZiAoa2V5UGFpcikge1xuICAgICAgICBjb25zdCBzZWNyZXRLZXkgPSBrZXlQYWlyLmdldEtleXModHJ1ZSkucHJ2O1xuICAgICAgICBhc3NlcnQoc2VjcmV0S2V5IGluc3RhbmNlb2YgVWludDhBcnJheSwgJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICAgICAgc2lnbmF0dXJlcy5wdXNoKG5hY2wuc2lnbi5kZXRhY2hlZChtZXNzYWdlQnl0ZXMsIHNlY3JldEtleSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dGVybmFsID0gdGhpcy5fc2lnbmF0dXJlcy5nZXQoYWRkcmVzcyk7XG4gICAgICBpZiAoZXh0ZXJuYWwpIHtcbiAgICAgICAgc2lnbmF0dXJlcy5wdXNoKGV4dGVybmFsKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBNaXNzaW5nIHNpZ25hdHVyZTogemVyby1maWxsIHRoZSBzbG90IHNvIHRoZSB3aXJlIHNoYXBlIHN0YXlzIHZhbGlkXG4gICAgICAvLyBmb3IgcGFydGlhbC1zaWduIGZsb3dzOyB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGJyb2FkY2FzdGFibGUgdW50aWxcbiAgICAgIC8vIGV2ZXJ5IHJlcXVpcmVkIHNpZ25lciBoYXMgYSBzaWduYXR1cmUuXG4gICAgICBzaWduYXR1cmVzLnB1c2gobmV3IFVpbnQ4QXJyYXkoNjQpKTtcbiAgICB9XG5cbiAgICBjb25zdCB2MVdpcmUgPSBzZXJpYWxpemVXaXJlVHJhbnNhY3Rpb24obWVzc2FnZUJ5dGVzLCBzaWduYXR1cmVzKTtcblxuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnYxVHJhbnNhY3Rpb25CeXRlcyA9IHYxV2lyZTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi52MU1lc3NhZ2VCeXRlcyA9IG1lc3NhZ2VCeXRlcztcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5sYW1wb3J0c1BlclNpZ25hdHVyZSA9IHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlO1xuXG4gICAgLy8gUG9wdWxhdGUgYSBtZXRhZGF0YS1vbmx5IFNvbFRyYW5zYWN0aW9uIHNvIHRvSnNvbiAvIGxvYWRJbnB1dHNBbmRPdXRwdXRzXG4gICAgLy8gd29yay4gVGhlIGR1cmFibGUgbm9uY2UgaXMgY2FycmllZCB2aWEgbm9uY2VJbmZvLCBtYXRjaGluZyB0aGUgdjAgbW9kZWwuXG4gICAgY29uc3QgbWV0YVR4ID0gbmV3IFNvbFRyYW5zYWN0aW9uKCk7XG4gICAgbWV0YVR4LmZlZVBheWVyID0gZmVlUGF5ZXI7XG4gICAgbWV0YVR4LnJlY2VudEJsb2NraGFzaCA9IHRoaXMuX3JlY2VudEJsb2NraGFzaDtcbiAgICBpZiAodGhpcy5fbm9uY2VJbmZvKSB7XG4gICAgICBtZXRhVHgubm9uY2VJbmZvID0ge1xuICAgICAgICBub25jZTogdGhpcy5fcmVjZW50QmxvY2toYXNoLFxuICAgICAgICBub25jZUluc3RydWN0aW9uOiBidWlsZEFkdmFuY2VOb25jZUFjY291bnRJbnN0cnVjdGlvbihcbiAgICAgICAgICB0aGlzLl9ub25jZUluZm8ucGFyYW1zLndhbGxldE5vbmNlQWRkcmVzcyxcbiAgICAgICAgICB0aGlzLl9ub25jZUluZm8ucGFyYW1zLmF1dGhXYWxsZXRBZGRyZXNzXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH1cbiAgICBtZXRhVHguYWRkKC4uLmluc3RydWN0aW9ucyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc29sVHJhbnNhY3Rpb24gPSBtZXRhVHg7XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLnNldEluc3RydWN0aW9uc0RhdGEodGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24ubG9hZElucHV0c0FuZE91dHB1dHMoKTtcblxuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZyk7XG4gICAgY29uc3Qgd2lyZUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgY29uc3QgeyBtZXNzYWdlQnl0ZXMgfSA9IHBhcnNlV2lyZVRyYW5zYWN0aW9uKHdpcmVCeXRlcyk7XG4gICAgdHgudjFUcmFuc2FjdGlvbkJ5dGVzID0gd2lyZUJ5dGVzO1xuICAgIHR4LnYxTWVzc2FnZUJ5dGVzID0gbWVzc2FnZUJ5dGVzO1xuXG4gICAgLy8gUG9wdWxhdGUgYSBtZXRhZGF0YS1vbmx5IFNvbFRyYW5zYWN0aW9uIGZyb20gdGhlIGRlY29kZWQgbWVzc2FnZSBzb1xuICAgIC8vIHRvSnNvbiAvIGxvYWRJbnB1dHNBbmRPdXRwdXRzIHdvcmsuXG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVYxTWVzc2FnZShtZXNzYWdlQnl0ZXMpO1xuICAgIHR4LnNldFRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG4gICAgY29uc3QgbWV0YVR4ID0gbmV3IFNvbFRyYW5zYWN0aW9uKCk7XG4gICAgbWV0YVR4LmZlZVBheWVyID0gbmV3IFB1YmxpY0tleShkZWNvZGVkLnN0YXRpY0FjY291bnRzWzBdKTtcbiAgICBtZXRhVHgucmVjZW50QmxvY2toYXNoID0gZGVjb2RlZC5ibG9ja2hhc2g7XG4gICAgY29uc3QgbnVtV3JpdGFibGVTaWduZXJzID0gZGVjb2RlZC5oZWFkZXIubnVtU2lnbmVyQWNjb3VudHMgLSBkZWNvZGVkLmhlYWRlci5udW1SZWFkb25seVNpZ25lckFjY291bnRzO1xuICAgIGNvbnN0IG51bVdyaXRhYmxlTm9uU2lnbmVycyA9IGRlY29kZWQuc3RhdGljQWNjb3VudHMubGVuZ3RoIC0gZGVjb2RlZC5oZWFkZXIubnVtUmVhZG9ubHlOb25TaWduZXJBY2NvdW50cztcbiAgICBmb3IgKGNvbnN0IGNvbXBpbGVkIG9mIGRlY29kZWQuY29tcGlsZWRJbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1ldGFUeC5hZGQoXG4gICAgICAgIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgICAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkoZGVjb2RlZC5zdGF0aWNBY2NvdW50c1tjb21waWxlZC5wcm9ncmFtQWRkcmVzc0luZGV4XSksXG4gICAgICAgICAga2V5czogY29tcGlsZWQuYWNjb3VudEluZGljZXMubWFwKChpbmRleCkgPT4gKHtcbiAgICAgICAgICAgIHB1YmtleTogbmV3IFB1YmxpY0tleShkZWNvZGVkLnN0YXRpY0FjY291bnRzW2luZGV4XSksXG4gICAgICAgICAgICBpc1NpZ25lcjogaW5kZXggPCBkZWNvZGVkLmhlYWRlci5udW1TaWduZXJBY2NvdW50cyxcbiAgICAgICAgICAgIGlzV3JpdGFibGU6XG4gICAgICAgICAgICAgIGluZGV4IDwgbnVtV3JpdGFibGVTaWduZXJzIHx8XG4gICAgICAgICAgICAgIChpbmRleCA+PSBkZWNvZGVkLmhlYWRlci5udW1TaWduZXJBY2NvdW50cyAmJiBpbmRleCA8IG51bVdyaXRhYmxlTm9uU2lnbmVycyksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKGNvbXBpbGVkLmRhdGEpLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgdHguc29sVHJhbnNhY3Rpb24gPSBtZXRhVHg7XG5cbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvLyByZWdpb24gR2V0dGVycyBhbmQgU2V0dGVyc1xuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKGtleTogQmFzZUtleSk6IFRyYW5zYWN0aW9uIHtcbiAgICB0aGlzLnZhbGlkYXRlS2V5KGtleSk7XG4gICAgdGhpcy5jaGVja0R1cGxpY2F0ZWRTaWduZXIoa2V5KTtcbiAgICBjb25zdCBwcnYgPSBrZXkua2V5O1xuICAgIGNvbnN0IHNpZ25lciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBwcnYgfSk7XG4gICAgdGhpcy5fc2lnbmVycy5wdXNoKHNpZ25lcik7XG5cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYWRkU2lnbmF0dXJlKHB1YmxpY0tleTogQmFzZVB1YmxpY0tleSwgc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduYXR1cmVzLnNldChwdWJsaWNLZXkucHViLCBuZXcgVWludDhBcnJheShzaWduYXR1cmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZW5kZXIgb2YgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICogVGhpcyBhY2NvdW50IHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIHBheWluZyB0cmFuc2FjdGlvbiBmZWVzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VuZGVyQWRkcmVzcyB0aGUgYWNjb3VudCB0aGF0IGlzIHNlbmRpbmcgdGhpcyB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgc2VuZGVyKHNlbmRlckFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHZhbGlkYXRlQWRkcmVzcyhzZW5kZXJBZGRyZXNzLCAnc2VuZGVyJyk7XG4gICAgdGhpcy5fc2VuZGVyID0gc2VuZGVyQWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIG5vbmNlLlxuICAgKiBSZXF1aXJlcyBib3RoIG9wdGlvbmFsIHBhcmFtcyBpbiBvcmRlciB0byB1c2UgdGhlIGR1cmFibGUgbm9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBibG9ja0hhc2ggVGhlIGxhdGVzdCBibG9ja0hhc2ggb3IgdGhlIGR1cmFibGUgbm9uY2UgaGFzaFxuICAgKiBAcGFyYW0ge0R1cmFibGVOb25jZVBhcmFtc30gW2R1cmFibGVOb25jZVBhcmFtc10gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHdhbGxldE5vbmNlQWRkcmVzcyBhbmQgdGhlIGF1dGhXYWxsZXRBZGRyZXNzIChyZXF1aXJlZCBmb3IgZHVyYWJsZSBub25jZSlcbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIG5vbmNlKGJsb2NrSGFzaDogc3RyaW5nLCBkdXJhYmxlTm9uY2VQYXJhbXM/OiB7IHdhbGxldE5vbmNlQWRkcmVzczogc3RyaW5nOyBhdXRoV2FsbGV0QWRkcmVzczogc3RyaW5nIH0pOiB0aGlzIHtcbiAgICBpZiAoIWJsb2NrSGFzaCB8fCAhaXNWYWxpZEJsb2NrSWQoYmxvY2tIYXNoKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBvciBtaXNzaW5nIGJsb2NrSGFzaCwgZ290OiAnICsgYmxvY2tIYXNoKTtcbiAgICB9XG4gICAgaWYgKGR1cmFibGVOb25jZVBhcmFtcykge1xuICAgICAgdmFsaWRhdGVBZGRyZXNzKGR1cmFibGVOb25jZVBhcmFtcy53YWxsZXROb25jZUFkZHJlc3MsICd3YWxsZXROb25jZUFkZHJlc3MnKTtcbiAgICAgIHZhbGlkYXRlQWRkcmVzcyhkdXJhYmxlTm9uY2VQYXJhbXMuYXV0aFdhbGxldEFkZHJlc3MsICdhdXRoV2FsbGV0QWRkcmVzcycpO1xuICAgICAgaWYgKGR1cmFibGVOb25jZVBhcmFtcy53YWxsZXROb25jZUFkZHJlc3MgPT09IGR1cmFibGVOb25jZVBhcmFtcy5hdXRoV2FsbGV0QWRkcmVzcykge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHBhcmFtczogd2FsbGV0Tm9uY2VBZGRyZXNzIGNhbm5vdCBiZSBlcXVhbCB0byBhdXRoV2FsbGV0QWRkcmVzcycpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbm9uY2VJbmZvID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgIHBhcmFtczogZHVyYWJsZU5vbmNlUGFyYW1zLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5fcmVjZW50QmxvY2toYXNoID0gYmxvY2tIYXNoO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaW50ZW50IGluc3RydWN0aW9ucyB0byBidWlsZCwgdXNpbmcgdGhlIHNoYXJlZCBpbnN0cnVjdGlvbiBwYXJhbXNcbiAgICogcmVwcmVzZW50YXRpb24gY29uc3VtZWQgYnkgYHNvbEluc3RydWN0aW9uRmFjdG9yeWAgKHNhbWUgYXMgdGhlIHYwIGZsb3dzKS5cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBpbnN0cnVjdGlvbnMgdGhlIGluc3RydWN0aW9uIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25QYXJhbXNbXSk6IHRoaXMge1xuICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBbLi4uaW5zdHJ1Y3Rpb25zXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgYSBwcmUtYnVpbHQgaW5zdHJ1Y3Rpb24gKGUuZy4gYW4gZW52ZWxvcGUtZGVyaXZlZCBpbnN0cnVjdGlvbiBvciBhXG4gICAqIGN1c3RvbSBpbnN0cnVjdGlvbikgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb259IGluc3RydWN0aW9uIHRoZSBpbnN0cnVjdGlvbiB0byBhcHBlbmRcbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGFkZEluc3RydWN0aW9uKGluc3RydWN0aW9uOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uKTogdGhpcyB7XG4gICAgdGhpcy5fZXh0cmFJbnN0cnVjdGlvbnMucHVzaChpbnN0cnVjdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2MSB0cmFuc2FjdGlvbiBjb25maWcgKGNvbXB1dGUgdW5pdCBsaW1pdCwgaGVhcCBzaXplLCBsb2FkZWRcbiAgICogYWNjb3VudHMgZGF0YSBzaXplIGxpbWl0LCBhbmQgcHJpb3JpdHkgZmVlIGFzIHRvdGFsIGxhbXBvcnRzKS4gUmVxdWlyZWRcbiAgICogYmVmb3JlIGJ1aWxkaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge1NvbFYxVHJhbnNhY3Rpb25Db25maWd9IGNvbmZpZyB0aGUgdjEgdHJhbnNhY3Rpb24gY29uZmlnXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICB0cmFuc2FjdGlvbkNvbmZpZyhjb25maWc6IFYxVHJhbnNhY3Rpb25Db25maWdJbnB1dCk6IHRoaXMge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uQ29uZmlnID0ge1xuICAgICAgY29tcHV0ZVVuaXRMaW1pdDogY29uZmlnLmNvbXB1dGVVbml0TGltaXQgPz8gbnVsbCxcbiAgICAgIGhlYXBTaXplOiBjb25maWcuaGVhcFNpemUgPz8gbnVsbCxcbiAgICAgIGxvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdDogY29uZmlnLmxvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdCA/PyBudWxsLFxuICAgICAgcHJpb3JpdHlGZWU6IGNvbmZpZy5wcmlvcml0eUZlZSA/PyBudWxsLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgYnVpbGRlciBmcm9tIGEgY2xpZW50LXN1cHBsaWVkIHYxIGVudmVsb3BlXG4gICAqIChTb2xWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEpLiBTZXRzIHRoZSBmZWUgcGF5ZXIgZnJvbSBzdGF0aWNBY2NvdW50S2V5c1swXSxcbiAgICogY29lcmNlcyB0aGUgdHJhbnNhY3Rpb24gY29uZmlnLCBhbmQgY29udmVydHMgZWFjaCBlbnZlbG9wZSBpbnN0cnVjdGlvbiB0byBhblxuICAgKiBhZGRyZXNzLWJhc2VkIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gdmlhIHtAbGluayB0b1YxVHJhbnNhY3Rpb25JbnN0cnVjdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gdGhlIHYxIGVudmVsb3BlXG4gICAqIEByZXR1cm5zIHtWMVRyYW5zYWN0aW9uQnVpbGRlcn0gVGhpcyB0cmFuc2FjdGlvbiBidWlsZGVyXG4gICAqL1xuICBmcm9tVmVyc2lvbmVkRGF0YShkYXRhOiBTb2xWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEpOiB0aGlzIHtcbiAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCcpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5zdGF0aWNBY2NvdW50S2V5cykgfHwgZGF0YS5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3N0YXRpY0FjY291bnRLZXlzIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndmVyc2lvbmVkSW5zdHJ1Y3Rpb25zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCFkYXRhLm1lc3NhZ2VIZWFkZXIgfHwgdHlwZW9mIGRhdGEubWVzc2FnZUhlYWRlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ21lc3NhZ2VIZWFkZXIgbXVzdCBiZSBhIHZhbGlkIG9iamVjdCcpO1xuICAgIH1cbiAgICB0aGlzLl9zZW5kZXIgPSBkYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uQ29uZmlnID0ge1xuICAgICAgY29tcHV0ZVVuaXRMaW1pdDogZGF0YS50cmFuc2FjdGlvbkNvbmZpZz8uY29tcHV0ZVVuaXRMaW1pdCA/PyBudWxsLFxuICAgICAgaGVhcFNpemU6IGRhdGEudHJhbnNhY3Rpb25Db25maWc/LmhlYXBTaXplID8/IG51bGwsXG4gICAgICBsb2FkZWRBY2NvdW50c0RhdGFTaXplTGltaXQ6IGRhdGEudHJhbnNhY3Rpb25Db25maWc/LmxvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdCA/PyBudWxsLFxuICAgICAgcHJpb3JpdHlGZWU6IGRhdGEudHJhbnNhY3Rpb25Db25maWc/LnByaW9yaXR5RmVlID8/IG51bGwsXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGRhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICB0aGlzLmFkZEluc3RydWN0aW9uKHRvVjFUcmFuc2FjdGlvbkluc3RydWN0aW9uKGluc3RydWN0aW9uLCBkYXRhKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcHJpb3JpdHkgZmVlICh0b3RhbCBsYW1wb3J0cykgb24gdGhlIHYxIHRyYW5zYWN0aW9uIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHtGZWVPcHRpb25zfSBmZWVPcHRpb25zIHRoZSBwcmlvcml0eSBmZWVcbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIHNldFByaW9yaXR5RmVlKGZlZU9wdGlvbnM6IEZlZU9wdGlvbnMpOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMuX3RyYW5zYWN0aW9uQ29uZmlnKSB7XG4gICAgICB0aGlzLl90cmFuc2FjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgY29tcHV0ZVVuaXRMaW1pdDogbnVsbCxcbiAgICAgICAgaGVhcFNpemU6IG51bGwsXG4gICAgICAgIGxvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdDogbnVsbCxcbiAgICAgICAgcHJpb3JpdHlGZWU6IG51bGwsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLl90cmFuc2FjdGlvbkNvbmZpZy5wcmlvcml0eUZlZSA9IE51bWJlcihmZWVPcHRpb25zLmFtb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBmZWUgKGxhbXBvcnRzIHBlciBzaWduYXR1cmUpIGZvciBmZWUgZXN0aW1hdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtGZWVPcHRpb25zfSBmZWVPcHRpb25zIHRoZSBmZWVcbiAgICogQHJldHVybnMge1YxVHJhbnNhY3Rpb25CdWlsZGVyfSBUaGlzIHRyYW5zYWN0aW9uIGJ1aWxkZXJcbiAgICovXG4gIGZlZShmZWVPcHRpb25zOiBGZWVPcHRpb25zKTogdGhpcyB7XG4gICAgdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmUgPSBOdW1iZXIoZmVlT3B0aW9ucy5hbW91bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZmVlUGF5ZXIoZmVlUGF5ZXI6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuX2ZlZVBheWVyID0gZmVlUGF5ZXI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtZW1vLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtb1xuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgbWVtbyhtZW1vOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlTWVtbyhtZW1vKTtcbiAgICB0aGlzLl9tZW1vID0gbWVtbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgemstZWxnYW1hbC1wcm9vZiBwcm9ncmFtIGlkLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0aGUgY2Fub25pY2FsIG9uLWNoYWluIHByb2dyYW0gaWQgKGBaa0UxR2FtYTFQcm9vZjExMS4uLmApXG4gICAqIHdoaWNoIGlzIHRoZSBzYW1lIGFjcm9zcyBtYWlubmV0LCBkZXZuZXQsIGFuZCB0ZXN0bmV0LiBPdmVycmlkZSBvbmx5XG4gICAqIHdoZW4gdGFyZ2V0aW5nIGEgY3VzdG9tIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9ncmFtSWQgYmFzZTU4IGVuY29kZWQgcHJvZ3JhbSBpZFxuICAgKiBAcmV0dXJucyB7VjFUcmFuc2FjdGlvbkJ1aWxkZXJ9IFRoaXMgdHJhbnNhY3Rpb24gYnVpbGRlclxuICAgKi9cbiAgemtQcm9vZlByb2dyYW1JZChwcm9ncmFtSWQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGFzc2VydChwcm9ncmFtSWQsICdNaXNzaW5nIHByb2dyYW1JZCBwYXJhbScpO1xuICAgIHRoaXMuX3prUHJvb2ZQcm9ncmFtSWQgPSBwcm9ncmFtSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcywgYWRkcmVzc0Zvcm1hdD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzICcgKyBhZGRyZXNzLmFkZHJlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUtleShrZXk6IEJhc2VLZXkpOiB2b2lkIHtcbiAgICBsZXQga2V5UGFpcjogS2V5UGFpcjtcbiAgICB0cnkge1xuICAgICAga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIWtleVBhaXIuZ2V0S2V5cygpLnBydikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBrZXknKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFyYXdUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCByYXcgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlV2lyZVRyYW5zYWN0aW9uKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHJhdyB0cmFuc2FjdGlvbjogJyArIChlIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZVNlbmRlcigpO1xuICAgIHRoaXMudmFsaWRhdGVOb25jZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlVmFsdWUodmFsdWU6IEJpZ051bWJlcik6IHZvaWQge1xuICAgIGlmICh2YWx1ZS5pc0xlc3NUaGFuKDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZW1vLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtbyAtIHRoZSBtZW1vIGFzIHN0cmluZ1xuICAgKi9cbiAgdmFsaWRhdGVNZW1vKG1lbW86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghbWVtbykge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBtZW1vLCBnb3Q6ICcgKyBtZW1vKTtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkTWVtbyhtZW1vKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWVtbyBpcyB0b28gbG9uZycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCBhbHJlYWR5IGluIHRoaXMuX3NpZ25lcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7QmFzZUtleX0ga2V5IC0gVGhlIGtleSB0byBjaGVja1xuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0R1cGxpY2F0ZWRTaWduZXIoa2V5OiBCYXNlS2V5KSB7XG4gICAgdGhpcy5fc2lnbmVycy5mb3JFYWNoKChrcCkgPT4ge1xuICAgICAgaWYgKGtwLmdldEtleXMoKS5wcnYgPT09IGtleS5rZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignRHVwbGljYXRlZCBzaWduZXI6ICcgKyBrZXkua2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgc2VuZGVyIGZpZWxkIGlzIGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VuZGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZW5kZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBzZW5kZXInKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIG5vbmNlIGZpZWxkIGlzIGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTm9uY2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3JlY2VudEJsb2NraGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIG5vbmNlIGJsb2NraGFzaCcpO1xuICAgIH1cbiAgfVxuICAvLyBlbmRyZWdpb25cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitgo-beta/sdk-coin-sol",
|
|
3
|
-
"version": "7.6.4-beta.
|
|
3
|
+
"version": "7.6.4-beta.727",
|
|
4
4
|
"description": "BitGo SDK coin library for Sol",
|
|
5
5
|
"main": "./dist/cjs/src/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -56,10 +56,10 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@bitgo-beta/logger": "1.0.1-beta.
|
|
60
|
-
"@bitgo-beta/sdk-core": "8.2.1-beta.
|
|
61
|
-
"@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.
|
|
62
|
-
"@bitgo-beta/statics": "15.1.1-beta.
|
|
59
|
+
"@bitgo-beta/logger": "1.0.1-beta.525",
|
|
60
|
+
"@bitgo-beta/sdk-core": "8.2.1-beta.2095",
|
|
61
|
+
"@bitgo-beta/sdk-lib-mpc": "8.2.0-beta.2105",
|
|
62
|
+
"@bitgo-beta/statics": "15.1.1-beta.2125",
|
|
63
63
|
"@bitgo/public-types": "6.79.0",
|
|
64
64
|
"@bitgo/wasm-solana": "^2.6.0",
|
|
65
65
|
"@solana/buffer-layout": "^4.0.1",
|
|
@@ -73,11 +73,11 @@
|
|
|
73
73
|
"tweetnacl": "^1.0.3"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@bitgo-beta/sdk-api": "1.10.1-beta.
|
|
76
|
+
"@bitgo-beta/sdk-api": "1.10.1-beta.2084",
|
|
77
77
|
"@bitgo-beta/sdk-test": "^9.1.83",
|
|
78
78
|
"@types/lodash": "^4.14.121"
|
|
79
79
|
},
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "70bf0260c777cd9c3870c46710f410256ceb30b7",
|
|
81
81
|
"files": [
|
|
82
82
|
"dist/cjs",
|
|
83
83
|
"dist/esm"
|