@bitgo-beta/sdk-coin-hbar 1.0.2-beta.200 → 1.0.2-beta.2000
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/hbar.d.ts +82 -11
- package/dist/src/hbar.d.ts.map +1 -1
- package/dist/src/hbar.js +392 -25
- package/dist/src/hbarToken.d.ts +4 -1
- package/dist/src/hbarToken.d.ts.map +1 -1
- package/dist/src/hbarToken.js +12 -3
- package/dist/src/index.js +6 -2
- package/dist/src/lib/accountUpdateBuilder.d.ts +41 -0
- package/dist/src/lib/accountUpdateBuilder.d.ts.map +1 -0
- package/dist/src/lib/accountUpdateBuilder.js +100 -0
- package/dist/src/lib/coinTransferBuilder.d.ts +1 -1
- package/dist/src/lib/coinTransferBuilder.d.ts.map +1 -1
- package/dist/src/lib/coinTransferBuilder.js +12 -28
- package/dist/src/lib/constants.d.ts +2 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +3 -2
- package/dist/src/lib/iface.d.ts +9 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +26 -10
- package/dist/src/lib/keyPair.d.ts +1 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +7 -7
- package/dist/src/lib/tokenAssociateBuilder.js +9 -28
- package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
- package/dist/src/lib/tokenTransferBuilder.js +15 -31
- package/dist/src/lib/transaction.d.ts +7 -1
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +94 -41
- package/dist/src/lib/transactionBuilder.d.ts +1 -1
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +18 -37
- package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +12 -3
- package/dist/src/lib/transferBuilder.d.ts +1 -1
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +5 -24
- package/dist/src/lib/utils.d.ts +18 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +112 -41
- package/dist/src/lib/walletInitializationBuilder.js +12 -28
- package/dist/src/seedValidator.js +24 -10
- package/dist/test/fixtures/hbar.d.ts +6 -0
- package/dist/test/fixtures/hbar.d.ts.map +1 -0
- package/dist/test/fixtures/hbar.js +9 -0
- package/dist/test/resources/hbar.d.ts +67 -0
- package/dist/test/resources/hbar.d.ts.map +1 -0
- package/dist/test/resources/hbar.js +73 -0
- package/dist/test/unit/fixtures/hbarBackupKey.d.ts +4 -0
- package/dist/test/unit/fixtures/hbarBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/hbarBackupKey.js +10 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/hbar.d.ts +2 -0
- package/dist/test/unit/hbar.d.ts.map +1 -0
- package/dist/test/unit/hbar.js +1496 -0
- package/dist/test/unit/hbarToken.d.ts +2 -0
- package/dist/test/unit/hbarToken.d.ts.map +1 -0
- package/dist/test/unit/hbarToken.js +34 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +179 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +94 -0
- package/dist/test/unit/transactionBuilder/accountUpdateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/accountUpdateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/accountUpdateBuilder.js +221 -0
- package/dist/test/unit/transactionBuilder/tokenAssociateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenAssociateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenAssociateBuilder.js +215 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +329 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +353 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitialization.js +214 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +275 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +17 -14
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -94
package/dist/src/hbar.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -11,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
11
15
|
}) : function(o, v) {
|
|
12
16
|
o["default"] = v;
|
|
13
17
|
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
21
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
36
|
exports.Hbar = void 0;
|
|
23
37
|
/**
|
|
@@ -31,6 +45,8 @@ const seedValidator_1 = require("./seedValidator");
|
|
|
31
45
|
const lib_1 = require("./lib");
|
|
32
46
|
const Utils = __importStar(require("./lib/utils"));
|
|
33
47
|
const _ = __importStar(require("lodash"));
|
|
48
|
+
const sdk_1 = require("@hashgraph/sdk");
|
|
49
|
+
const keyPair_1 = require("./lib/keyPair");
|
|
34
50
|
class Hbar extends sdk_core_1.BaseCoin {
|
|
35
51
|
constructor(bitgo, staticsCoin) {
|
|
36
52
|
super(bitgo);
|
|
@@ -73,12 +89,11 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
73
89
|
return false;
|
|
74
90
|
}
|
|
75
91
|
}
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
*/
|
|
92
|
+
/** inheritdoc */
|
|
93
|
+
deriveKeyWithSeed() {
|
|
94
|
+
throw new sdk_core_1.NotSupported('method deriveKeyWithSeed not supported for eddsa curve');
|
|
95
|
+
}
|
|
96
|
+
/** inheritdoc */
|
|
82
97
|
generateKeyPair(seed) {
|
|
83
98
|
const keyPair = seed ? new lib_1.KeyPair({ seed }) : new lib_1.KeyPair();
|
|
84
99
|
const keys = keyPair.getKeys();
|
|
@@ -90,6 +105,15 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
90
105
|
prv: keys.prv,
|
|
91
106
|
};
|
|
92
107
|
}
|
|
108
|
+
/** inheritdoc */
|
|
109
|
+
generateRootKeyPair(seed) {
|
|
110
|
+
const keyPair = seed ? new lib_1.KeyPair({ seed }) : new lib_1.KeyPair();
|
|
111
|
+
const keys = keyPair.getKeys(true);
|
|
112
|
+
if (!keys.prv) {
|
|
113
|
+
throw new Error('Missing prv in key generation.');
|
|
114
|
+
}
|
|
115
|
+
return { prv: keys.prv + keys.pub, pub: keys.pub };
|
|
116
|
+
}
|
|
93
117
|
async parseTransaction(params) {
|
|
94
118
|
return {};
|
|
95
119
|
}
|
|
@@ -104,10 +128,157 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
104
128
|
const { address, baseAddress } = params;
|
|
105
129
|
return Utils.isSameBaseAddress(address, baseAddress);
|
|
106
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Verify a token enablement transaction with strict validation
|
|
133
|
+
* @param txHex - The transaction hex to verify
|
|
134
|
+
* @param expectedToken - Object containing tokenId (preferred) or tokenName
|
|
135
|
+
* @param expectedAccountId - The expected account ID that will enable the token
|
|
136
|
+
* @throws Error if the transaction is not a valid token enablement transaction
|
|
137
|
+
*/
|
|
138
|
+
async verifyTokenEnablementTransaction(txHex, expectedToken, expectedAccountId) {
|
|
139
|
+
if (!txHex || !expectedAccountId || (!expectedToken.tokenId && !expectedToken.tokenName)) {
|
|
140
|
+
const missing = [];
|
|
141
|
+
if (!txHex)
|
|
142
|
+
missing.push('txHex');
|
|
143
|
+
if (!expectedAccountId)
|
|
144
|
+
missing.push('expectedAccountId');
|
|
145
|
+
if (!expectedToken.tokenId && !expectedToken.tokenName)
|
|
146
|
+
missing.push('expectedToken.tokenId|tokenName');
|
|
147
|
+
throw new Error(`Missing required parameters: ${missing.join(', ')}`);
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const transaction = new lib_1.Transaction(statics_1.coins.get(this.getChain()));
|
|
151
|
+
transaction.fromRawTransaction(txHex);
|
|
152
|
+
const raw = transaction.toJson();
|
|
153
|
+
const explainedTx = await this.explainTransaction({ txHex });
|
|
154
|
+
this.validateTxStructureStrict(explainedTx);
|
|
155
|
+
this.validateNoTransfers(raw);
|
|
156
|
+
this.validateAccountIdMatches(explainedTx, raw, expectedAccountId);
|
|
157
|
+
this.validateTokenEnablementTarget(explainedTx, raw, expectedToken);
|
|
158
|
+
this.validateAssociateInstructionOnly(raw);
|
|
159
|
+
this.validateTxHexAgainstExpected(txHex, expectedToken, expectedAccountId);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
throw new Error(`Invalid token enablement transaction: ${error.message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
validateTxStructureStrict(ex) {
|
|
166
|
+
if (!ex.outputs || ex.outputs.length === 0) {
|
|
167
|
+
throw new Error('Invalid token enablement transaction: missing required token association output');
|
|
168
|
+
}
|
|
169
|
+
if (ex.outputs.length !== 1) {
|
|
170
|
+
throw new Error(`Expected exactly 1 output, got ${ex.outputs.length}`);
|
|
171
|
+
}
|
|
172
|
+
const out0 = ex.outputs[0];
|
|
173
|
+
if (out0.amount !== '0') {
|
|
174
|
+
throw new Error(`Expected output amount '0', got ${out0.amount}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
validateNoTransfers(raw) {
|
|
178
|
+
if (raw.instructionsData?.params?.recipients?.length && raw.instructionsData.params.recipients.length > 0) {
|
|
179
|
+
const hasNonZeroTransfers = raw.instructionsData.params.recipients.some((recipient) => recipient.amount && recipient.amount !== '0');
|
|
180
|
+
if (hasNonZeroTransfers) {
|
|
181
|
+
throw new Error('Transaction contains transfers; not a pure token enablement.');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (raw.amount && raw.amount !== '0') {
|
|
185
|
+
throw new Error('Transaction contains transfers; not a pure token enablement.');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
validateAccountIdMatches(ex, raw, expectedAccountId) {
|
|
189
|
+
if (ex.outputs && ex.outputs.length > 0) {
|
|
190
|
+
const out0 = ex.outputs[0];
|
|
191
|
+
const normalizedOutput = Utils.getAddressDetails(out0.address).address;
|
|
192
|
+
const normalizedExpected = Utils.getAddressDetails(expectedAccountId).address;
|
|
193
|
+
if (normalizedOutput !== normalizedExpected) {
|
|
194
|
+
throw new Error(`Expected account ${expectedAccountId}, got ${out0.address}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const assocAcct = raw.instructionsData?.params?.accountId;
|
|
198
|
+
if (assocAcct) {
|
|
199
|
+
const normalizedAssoc = Utils.getAddressDetails(assocAcct).address;
|
|
200
|
+
const normalizedExpected = Utils.getAddressDetails(expectedAccountId).address;
|
|
201
|
+
if (normalizedAssoc !== normalizedExpected) {
|
|
202
|
+
throw new Error(`Associate account ${assocAcct} does not match expected ${expectedAccountId}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
validateTokenEnablementTarget(ex, raw, expected) {
|
|
207
|
+
if (ex.outputs && ex.outputs.length > 0) {
|
|
208
|
+
const out0 = ex.outputs[0];
|
|
209
|
+
const explainedName = out0.tokenName;
|
|
210
|
+
if (expected.tokenName) {
|
|
211
|
+
if (explainedName !== expected.tokenName) {
|
|
212
|
+
throw new Error(`Expected token name ${expected.tokenName}, got ${explainedName}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (expected.tokenId && explainedName) {
|
|
216
|
+
const actualTokenId = Utils.getHederaTokenIdFromName(explainedName);
|
|
217
|
+
if (!actualTokenId) {
|
|
218
|
+
throw new Error(`Unable to resolve tokenId for token name ${explainedName}`);
|
|
219
|
+
}
|
|
220
|
+
if (actualTokenId !== expected.tokenId) {
|
|
221
|
+
throw new Error(`Expected tokenId ${expected.tokenId}, but transaction contains tokenId ${actualTokenId} (${explainedName})`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
throw new Error('Transaction missing token information in outputs');
|
|
227
|
+
}
|
|
228
|
+
const tokenNames = raw.instructionsData?.params?.tokenNames || [];
|
|
229
|
+
if (tokenNames.length !== 1) {
|
|
230
|
+
throw new Error(`Expected exactly 1 token to associate, got ${tokenNames.length}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
validateTxHexAgainstExpected(txHex, expectedToken, expectedAccountId) {
|
|
234
|
+
const transaction = new lib_1.Transaction(statics_1.coins.get(this.getChain()));
|
|
235
|
+
transaction.fromRawTransaction(txHex);
|
|
236
|
+
const txBody = transaction.txBody;
|
|
237
|
+
if (!txBody.tokenAssociate) {
|
|
238
|
+
throw new Error('Transaction is not a TokenAssociate transaction');
|
|
239
|
+
}
|
|
240
|
+
const actualAccountId = Utils.stringifyAccountId(txBody.tokenAssociate.account);
|
|
241
|
+
const normalizedActual = Utils.getAddressDetails(actualAccountId).address;
|
|
242
|
+
const normalizedExpected = Utils.getAddressDetails(expectedAccountId).address;
|
|
243
|
+
if (normalizedActual !== normalizedExpected) {
|
|
244
|
+
throw new Error(`TxHex account ${actualAccountId} does not match expected ${expectedAccountId}`);
|
|
245
|
+
}
|
|
246
|
+
const actualTokens = txBody.tokenAssociate.tokens || [];
|
|
247
|
+
if (actualTokens.length !== 1) {
|
|
248
|
+
throw new Error(`TxHex contains ${actualTokens.length} tokens, expected exactly 1`);
|
|
249
|
+
}
|
|
250
|
+
const actualTokenId = Utils.stringifyTokenId(actualTokens[0]);
|
|
251
|
+
if (expectedToken.tokenId) {
|
|
252
|
+
if (actualTokenId !== expectedToken.tokenId) {
|
|
253
|
+
throw new Error(`TxHex tokenId ${actualTokenId} does not match expected ${expectedToken.tokenId}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (expectedToken.tokenName) {
|
|
257
|
+
const expectedTokenId = Utils.getHederaTokenIdFromName(expectedToken.tokenName);
|
|
258
|
+
if (!expectedTokenId) {
|
|
259
|
+
throw new Error(`Unable to resolve tokenId for expected token name ${expectedToken.tokenName}`);
|
|
260
|
+
}
|
|
261
|
+
if (actualTokenId !== expectedTokenId) {
|
|
262
|
+
throw new Error(`TxHex tokenId ${actualTokenId} does not match expected tokenId ${expectedTokenId} for token ${expectedToken.tokenName}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
validateAssociateInstructionOnly(raw) {
|
|
267
|
+
const instructionType = String(raw.instructionsData?.type || '').toLowerCase();
|
|
268
|
+
if (instructionType === 'contractexecute' ||
|
|
269
|
+
instructionType === 'contractcall' ||
|
|
270
|
+
instructionType === 'precompile') {
|
|
271
|
+
throw new Error(`Contract-based token association not allowed for blind enablement; got ${instructionType}`);
|
|
272
|
+
}
|
|
273
|
+
const isNativeAssociate = instructionType === 'tokenassociate' || instructionType === 'associate' || instructionType === 'associate_token';
|
|
274
|
+
if (!isNativeAssociate) {
|
|
275
|
+
throw new Error(`Only native TokenAssociate is allowed for blind enablement; got ${instructionType || 'unknown'}`);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
107
278
|
async verifyTransaction(params) {
|
|
108
279
|
// asset name to transfer amount map
|
|
109
280
|
const coinConfig = statics_1.coins.get(this.getChain());
|
|
110
|
-
const { txParams
|
|
281
|
+
const { txParams, txPrebuild, memo, verification } = params;
|
|
111
282
|
const transaction = new lib_1.Transaction(coinConfig);
|
|
112
283
|
if (!txPrebuild.txHex) {
|
|
113
284
|
throw new Error('missing required tx prebuild property txHex');
|
|
@@ -122,10 +293,27 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
122
293
|
if (!txParams.recipients) {
|
|
123
294
|
throw new Error('missing required tx params property recipients');
|
|
124
295
|
}
|
|
296
|
+
if (txParams.type === 'enabletoken' && verification?.verifyTokenEnablement) {
|
|
297
|
+
const r0 = txParams.recipients[0];
|
|
298
|
+
const expectedToken = {};
|
|
299
|
+
if (r0.tokenName) {
|
|
300
|
+
expectedToken.tokenName = r0.tokenName;
|
|
301
|
+
const tokenId = Utils.getHederaTokenIdFromName(r0.tokenName);
|
|
302
|
+
if (tokenId) {
|
|
303
|
+
expectedToken.tokenId = tokenId;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (!expectedToken.tokenName && !expectedToken.tokenId) {
|
|
307
|
+
throw new Error('Token enablement request missing token information');
|
|
308
|
+
}
|
|
309
|
+
await this.verifyTokenEnablementTransaction(txPrebuild.txHex, expectedToken, r0.address);
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
125
312
|
// for enabletoken, recipient output amount is 0
|
|
126
313
|
const recipients = txParams.recipients.map((recipient) => ({
|
|
127
314
|
...recipient,
|
|
128
315
|
amount: txParams.type === 'enabletoken' ? '0' : recipient.amount,
|
|
316
|
+
address: Utils.getAddressDetails(recipient.address).address,
|
|
129
317
|
}));
|
|
130
318
|
if (coinConfig.isToken) {
|
|
131
319
|
recipients.forEach((recipient) => {
|
|
@@ -136,7 +324,7 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
136
324
|
});
|
|
137
325
|
}
|
|
138
326
|
// verify recipients from params and explainedTx
|
|
139
|
-
const filteredRecipients = recipients
|
|
327
|
+
const filteredRecipients = recipients?.map((recipient) => _.pick(recipient, ['address', 'amount', 'tokenName']));
|
|
140
328
|
const filteredOutputs = explainedTx.outputs.map((output) => _.pick(output, ['address', 'amount', 'tokenName']));
|
|
141
329
|
if (!_.isEqual(filteredOutputs, filteredRecipients)) {
|
|
142
330
|
throw new Error('Tx outputs does not match with expected txParams recipients');
|
|
@@ -149,7 +337,6 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
149
337
|
* @param params
|
|
150
338
|
* @param params.txPrebuild {Object} prebuild object returned by platform
|
|
151
339
|
* @param params.prv {String} user prv
|
|
152
|
-
* @param params.wallet.addressVersion {String} this is the version of the Algorand multisig address generation format
|
|
153
340
|
* @returns Promise<SignedTransaction>
|
|
154
341
|
*/
|
|
155
342
|
async signTransaction(params) {
|
|
@@ -186,7 +373,124 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
186
373
|
* @param params
|
|
187
374
|
*/
|
|
188
375
|
async recover(params) {
|
|
189
|
-
|
|
376
|
+
const isUnsignedSweep = (params.backupKey.startsWith(keyPair_1.PUBLIC_KEY_PREFIX) && params.userKey.startsWith(keyPair_1.PUBLIC_KEY_PREFIX)) ||
|
|
377
|
+
(Utils.isValidPublicKey(params.userKey) && Utils.isValidPublicKey(params.backupKey));
|
|
378
|
+
// Validate the root address
|
|
379
|
+
if (!this.isValidAddress(params.rootAddress)) {
|
|
380
|
+
throw new Error('invalid rootAddress, got: ' + params.rootAddress);
|
|
381
|
+
}
|
|
382
|
+
// Validate the destination address
|
|
383
|
+
if (!this.isValidAddress(params.recoveryDestination)) {
|
|
384
|
+
throw new Error('invalid recoveryDestination, got: ' + params.recoveryDestination);
|
|
385
|
+
}
|
|
386
|
+
// Validate nodeId
|
|
387
|
+
if (params.nodeId && !Utils.isValidAddress(params.nodeId)) {
|
|
388
|
+
throw new Error('invalid nodeId, got: ' + params.nodeId);
|
|
389
|
+
}
|
|
390
|
+
// validate fee
|
|
391
|
+
if (params.maxFee && !Utils.isValidAmount(params.maxFee)) {
|
|
392
|
+
throw new Error('invalid maxFee, got: ' + params.maxFee);
|
|
393
|
+
}
|
|
394
|
+
// validate startTime
|
|
395
|
+
if (params.startTime) {
|
|
396
|
+
Utils.validateStartTime(params.startTime);
|
|
397
|
+
}
|
|
398
|
+
if (isUnsignedSweep && !params.startTime) {
|
|
399
|
+
throw new Error('start time is required for unsigned sweep');
|
|
400
|
+
}
|
|
401
|
+
if (!isUnsignedSweep && !params.walletPassphrase) {
|
|
402
|
+
throw new Error('walletPassphrase is required for non-bitgo recovery');
|
|
403
|
+
}
|
|
404
|
+
let userPrv;
|
|
405
|
+
let backUp;
|
|
406
|
+
if (!isUnsignedSweep) {
|
|
407
|
+
try {
|
|
408
|
+
userPrv = this.bitgo.decrypt({ input: params.userKey, password: params.walletPassphrase });
|
|
409
|
+
backUp = this.bitgo.decrypt({ input: params.backupKey, password: params.walletPassphrase });
|
|
410
|
+
}
|
|
411
|
+
catch (e) {
|
|
412
|
+
throw new Error('unable to decrypt userKey or backupKey with the walletPassphrase provided, got error: ' + e.message);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// validate userKey for unsigned sweep
|
|
416
|
+
if (isUnsignedSweep && !Utils.isValidPublicKey(params.userKey)) {
|
|
417
|
+
throw new Error('invalid userKey, got: ' + params.userKey);
|
|
418
|
+
}
|
|
419
|
+
// validate backupKey for unsigned sweep
|
|
420
|
+
if (isUnsignedSweep && !Utils.isValidPublicKey(params.backupKey)) {
|
|
421
|
+
throw new Error('invalid backupKey, got: ' + params.backupKey);
|
|
422
|
+
}
|
|
423
|
+
const { address: destinationAddress, memoId } = Utils.getAddressDetails(params.recoveryDestination);
|
|
424
|
+
const nodeId = params.nodeId ? params.nodeId : '0.0.3';
|
|
425
|
+
const client = this.getHbarClient();
|
|
426
|
+
const balance = await this.getAccountBalance(params.rootAddress, client);
|
|
427
|
+
const fee = params.maxFee ? params.maxFee : '10000000'; // default fee to 1 hbar
|
|
428
|
+
const nativeBalance = sdk_1.Hbar.fromString(balance.hbars).toTinybars().toString();
|
|
429
|
+
const spendableAmount = new bignumber_js_1.BigNumber(nativeBalance).minus(fee);
|
|
430
|
+
let txBuilder;
|
|
431
|
+
if (!params.tokenId) {
|
|
432
|
+
if (spendableAmount.isZero() || spendableAmount.isNegative()) {
|
|
433
|
+
throw new Error(`Insufficient balance to recover, got balance: ${nativeBalance} fee: ${fee}`);
|
|
434
|
+
}
|
|
435
|
+
txBuilder = this.getBuilderFactory().getTransferBuilder();
|
|
436
|
+
txBuilder.send({ address: destinationAddress, amount: spendableAmount.toString() });
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
if (spendableAmount.isNegative()) {
|
|
440
|
+
throw new Error(`Insufficient native balance to recover tokens, got native balance: ${nativeBalance} fee: ${fee}`);
|
|
441
|
+
}
|
|
442
|
+
const tokenBalance = balance.tokens.find((token) => token.tokenId === params.tokenId);
|
|
443
|
+
const token = Utils.getHederaTokenNameFromId(params.tokenId);
|
|
444
|
+
if (!token) {
|
|
445
|
+
throw new Error(`Unsupported token: ${params.tokenId}`);
|
|
446
|
+
}
|
|
447
|
+
if (!tokenBalance || new bignumber_js_1.BigNumber(tokenBalance.balance).isZero()) {
|
|
448
|
+
throw new Error(`Insufficient balance to recover token: ${params.tokenId} for account: ${params.rootAddress}`);
|
|
449
|
+
}
|
|
450
|
+
txBuilder = this.getBuilderFactory().getTokenTransferBuilder();
|
|
451
|
+
txBuilder.send({ address: destinationAddress, amount: tokenBalance.balance, tokenName: token.name });
|
|
452
|
+
}
|
|
453
|
+
txBuilder.node({ nodeId });
|
|
454
|
+
txBuilder.fee({ fee });
|
|
455
|
+
txBuilder.source({ address: params.rootAddress });
|
|
456
|
+
txBuilder.validDuration(180);
|
|
457
|
+
if (memoId) {
|
|
458
|
+
txBuilder.memo(memoId);
|
|
459
|
+
}
|
|
460
|
+
if (params.startTime) {
|
|
461
|
+
txBuilder.startTime(Utils.normalizeStarttime(params.startTime));
|
|
462
|
+
}
|
|
463
|
+
if (isUnsignedSweep) {
|
|
464
|
+
const tx = await txBuilder.build();
|
|
465
|
+
const txJson = tx.toJson();
|
|
466
|
+
return {
|
|
467
|
+
txHex: tx.toBroadcastFormat(),
|
|
468
|
+
coin: this.getChain(),
|
|
469
|
+
id: txJson.id,
|
|
470
|
+
startTime: txJson.startTime,
|
|
471
|
+
validDuration: txJson.validDuration,
|
|
472
|
+
nodeId: txJson.node,
|
|
473
|
+
memo: txJson.memo,
|
|
474
|
+
userKey: params.userKey,
|
|
475
|
+
backupKey: params.backupKey,
|
|
476
|
+
bitgoKey: params.bitgoKey,
|
|
477
|
+
maxFee: fee,
|
|
478
|
+
address: params.rootAddress,
|
|
479
|
+
recipients: txJson.instructionsData.params.recipients,
|
|
480
|
+
amount: txJson.amount,
|
|
481
|
+
json: txJson,
|
|
482
|
+
};
|
|
483
|
+
}
|
|
484
|
+
txBuilder.sign({ key: userPrv });
|
|
485
|
+
txBuilder.sign({ key: backUp });
|
|
486
|
+
const tx = await txBuilder.build();
|
|
487
|
+
return {
|
|
488
|
+
tx: tx.toBroadcastFormat(),
|
|
489
|
+
id: tx.toJson().id,
|
|
490
|
+
coin: this.getChain(),
|
|
491
|
+
startTime: tx.toJson().startTime,
|
|
492
|
+
nodeId: tx.toJson().node,
|
|
493
|
+
};
|
|
190
494
|
}
|
|
191
495
|
/**
|
|
192
496
|
* Explain a Hedera transaction from txHex
|
|
@@ -197,9 +501,6 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
197
501
|
if (!txHex) {
|
|
198
502
|
throw new Error('missing explain tx parameters');
|
|
199
503
|
}
|
|
200
|
-
if (!params.feeInfo) {
|
|
201
|
-
throw new Error('missing fee information');
|
|
202
|
-
}
|
|
203
504
|
const factory = this.getBuilderFactory();
|
|
204
505
|
const txBuilder = factory.from(txHex);
|
|
205
506
|
const tx = await txBuilder.build();
|
|
@@ -241,6 +542,14 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
241
542
|
});
|
|
242
543
|
});
|
|
243
544
|
break;
|
|
545
|
+
case 'cryptoUpdateAccount':
|
|
546
|
+
const updateParams = txJson.instructionsData.params;
|
|
547
|
+
outputs.push({
|
|
548
|
+
address: updateParams.accountId,
|
|
549
|
+
amount: '0',
|
|
550
|
+
memo,
|
|
551
|
+
});
|
|
552
|
+
break;
|
|
244
553
|
default:
|
|
245
554
|
throw new Error('Transaction format outside of cryptoTransfer not supported for explanation.');
|
|
246
555
|
}
|
|
@@ -260,9 +569,9 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
260
569
|
id: txJson.id,
|
|
261
570
|
outputs,
|
|
262
571
|
outputAmount: outputAmount.toString(),
|
|
263
|
-
changeOutputs: [],
|
|
264
|
-
changeAmount: '0',
|
|
265
|
-
fee: params.feeInfo,
|
|
572
|
+
changeOutputs: [], // account based does not use change outputs
|
|
573
|
+
changeAmount: '0', // account base does not make change
|
|
574
|
+
fee: params.feeInfo?.fee || txJson.fee, // in the instance no feeInfo is passed in as a param, show the fee given by the txJSON
|
|
266
575
|
timestamp: txJson.startTime,
|
|
267
576
|
expiration: txJson.validDuration,
|
|
268
577
|
};
|
|
@@ -287,6 +596,13 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
287
596
|
isValidPub(pub) {
|
|
288
597
|
return Utils.isValidPublicKey(pub);
|
|
289
598
|
}
|
|
599
|
+
supportsDeriveKeyWithSeed() {
|
|
600
|
+
return false;
|
|
601
|
+
}
|
|
602
|
+
/** inherited doc */
|
|
603
|
+
getDefaultMultisigType() {
|
|
604
|
+
return sdk_core_1.multisigTypes.onchain;
|
|
605
|
+
}
|
|
290
606
|
getTokenEnablementConfig() {
|
|
291
607
|
return {
|
|
292
608
|
requiresTokenEnablement: true,
|
|
@@ -296,6 +612,57 @@ class Hbar extends sdk_core_1.BaseCoin {
|
|
|
296
612
|
getBuilderFactory() {
|
|
297
613
|
return new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
|
|
298
614
|
}
|
|
615
|
+
getHbarClient() {
|
|
616
|
+
const client = this.bitgo.getEnv() === 'prod' ? sdk_1.Client.forMainnet() : sdk_1.Client.forTestnet();
|
|
617
|
+
return client;
|
|
618
|
+
}
|
|
619
|
+
async getAccountBalance(accountId, client) {
|
|
620
|
+
try {
|
|
621
|
+
const balance = await new sdk_1.AccountBalanceQuery().setAccountId(accountId).execute(client);
|
|
622
|
+
return balance.toJSON();
|
|
623
|
+
}
|
|
624
|
+
catch (e) {
|
|
625
|
+
throw new Error('Failed to get account balance, error: ' + e.message);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
async broadcastTransaction({ serializedSignedTransaction, startTime, }) {
|
|
629
|
+
try {
|
|
630
|
+
const hbarTx = sdk_1.Transaction.fromBytes(Utils.toUint8Array(serializedSignedTransaction));
|
|
631
|
+
if (startTime) {
|
|
632
|
+
Utils.isValidTimeString(startTime);
|
|
633
|
+
while (!Utils.shouldBroadcastNow(startTime)) {
|
|
634
|
+
await Utils.sleep(1000);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
return this.clientBroadcastTransaction(hbarTx);
|
|
638
|
+
}
|
|
639
|
+
catch (e) {
|
|
640
|
+
throw new Error('Failed to broadcast transaction, error: ' + e.message);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
async clientBroadcastTransaction(hbarTx) {
|
|
644
|
+
const client = this.getHbarClient();
|
|
645
|
+
const transactionResponse = await hbarTx.execute(client);
|
|
646
|
+
const transactionReceipt = await transactionResponse.getReceipt(client);
|
|
647
|
+
return { txId: transactionResponse.transactionId.toString(), status: transactionReceipt.status.toString() };
|
|
648
|
+
}
|
|
649
|
+
/** @inheritDoc */
|
|
650
|
+
auditDecryptedKey({ prv, publicKey, multiSigType }) {
|
|
651
|
+
if (multiSigType === 'tss') {
|
|
652
|
+
throw new Error('Unsupported multiSigType');
|
|
653
|
+
}
|
|
654
|
+
let hbarKeyPair;
|
|
655
|
+
try {
|
|
656
|
+
hbarKeyPair = new lib_1.KeyPair({ prv });
|
|
657
|
+
}
|
|
658
|
+
catch (e) {
|
|
659
|
+
throw new Error(`Invalid private key: ${e.message}`);
|
|
660
|
+
}
|
|
661
|
+
const genPubKey = hbarKeyPair.getKeys().pub;
|
|
662
|
+
if (publicKey && publicKey !== genPubKey) {
|
|
663
|
+
throw new Error('Invalid public key');
|
|
664
|
+
}
|
|
665
|
+
}
|
|
299
666
|
}
|
|
300
667
|
exports.Hbar = Hbar;
|
|
301
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILGlEQUFxRjtBQUNyRixtREFpQjhCO0FBQzlCLCtDQUF5QztBQUN6QyxxREFBdUM7QUFDdkMsbURBQWdEO0FBQ2hELCtCQUF1RjtBQUN2RixtREFBcUM7QUFDckMsMENBQTRCO0FBMEM1QixNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFZLEtBQWdCLEVBQUUsV0FBdUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSTtZQUNGLE9BQU8sS0FBSyxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ25EO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLElBQWE7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQVcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBVyxFQUFFLENBQUM7UUFDckUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQStCO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBNEI7UUFDaEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBb0M7UUFDMUQsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDOUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQzFFLE1BQU0sV0FBVyxHQUFHLElBQUksaUJBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDaEU7UUFFRCxXQUFXLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE1BQU0sZUFBZSxHQUE4QjtZQUNqRCxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7WUFDdkIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPO1lBQzNCLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRW5FLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztTQUNuRTtRQUVELGdEQUFnRDtRQUNoRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RCxHQUFHLFNBQVM7WUFDWixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU07U0FDakUsQ0FBQyxDQUFDLENBQUM7UUFDSixJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUU7WUFDdEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUMvQixJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRTtvQkFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2lCQUNqRTtnQkFDRCxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDeEMsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELGdEQUFnRDtRQUNoRCxNQUFNLGtCQUFrQixHQUFHLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakgsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEgsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLEVBQUU7WUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1NBQ2hGO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQWtDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sV0FBVyxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTVDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1NBQzNEO1FBRUQsTUFBTSxRQUFRLEdBQUc7WUFDZixLQUFLLEVBQUUsV0FBVyxDQUFDLGlCQUFpQixFQUFFO1NBQ3ZDLENBQUM7UUFDRixPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFZLEVBQUUsT0FBd0I7UUFDdEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQzFFLDZCQUE2QjtRQUM3QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQVc7UUFDdkIsTUFBTSxJQUFJLG9DQUF5QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFpQztRQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7U0FDNUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUUzQixJQUFJLFlBQVksR0FBRyxJQUFJLHdCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQTRFLEVBQUUsQ0FBQztRQUM1RiwrQ0FBK0M7UUFDL0MsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2YsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQzFCO1FBRUQsUUFBUSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO1lBQ3BDLEtBQUssZ0JBQWdCO2dCQUNuQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7Z0JBQ25FLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7d0JBQ3hCLDZDQUE2Qzt3QkFDN0MsWUFBWSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUNwRDtvQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNYLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTzt3QkFDMUIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO3dCQUNuQyxJQUFJO3dCQUNKLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJOzRCQUN6QixTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7eUJBQy9CLENBQUM7cUJBQ0gsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU07WUFFUixLQUFLLGdCQUFnQjtnQkFDbkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO2dCQUMvRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDM0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUNYLE9BQU8sRUFBRSxTQUFTO3dCQUNsQixNQUFNLEVBQUUsR0FBRzt3QkFDWCxJQUFJO3dCQUNKLFNBQVMsRUFBRSxLQUFLO3FCQUNqQixDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTtZQUVSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkVBQTZFLENBQUMsQ0FBQztTQUNsRztRQUVELE1BQU0sWUFBWSxHQUFHO1lBQ25CLElBQUk7WUFDSixjQUFjO1lBQ2QsY0FBYztZQUNkLFNBQVM7WUFDVCxlQUFlO1lBQ2YsS0FBSztZQUNMLFdBQVc7WUFDWCxZQUFZO1lBQ1osTUFBTTtTQUNQLENBQUM7UUFFRixPQUFPO1lBQ0wsWUFBWTtZQUNaLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNiLE9BQU87WUFDUCxZQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUNyQyxhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsR0FBRztZQUNqQixHQUFHLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzNCLFVBQVUsRUFBRSxNQUFNLENBQUMsYUFBYTtTQUMxQixDQUFDO0lBQ1gsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sNkJBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsb0JBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsc0JBQXNCLENBQUMsSUFBWTtRQUNqQyxtRUFBbUU7UUFDbkUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksNkJBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1RSxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSw2QkFBYSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSxvQkFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksYUFBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVGLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDbEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQ2pCO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBVztRQUNwQixPQUFPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE9BQU87WUFDTCx1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLGdDQUFnQyxFQUFFLElBQUk7U0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsT0FBTyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0NBQ0Y7QUFyVEQsb0JBcVRDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IHsgQ29pbkZhbWlseSwgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgS2V5UGFpcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMgYXMgQmFzZVZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uRmVlLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCBhcyBSZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQgYXMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIE1lbW8sXG4gIFRva2VuRW5hYmxlbWVudENvbmZpZyxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIHN0ZWxsYXIgZnJvbSAnc3RlbGxhci1zZGsnO1xuaW1wb3J0IHsgU2VlZFZhbGlkYXRvciB9IGZyb20gJy4vc2VlZFZhbGlkYXRvcic7XG5pbXBvcnQgeyBLZXlQYWlyIGFzIEhiYXJLZXlQYWlyLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBUcmFuc2FjdGlvbiB9IGZyb20gJy4vbGliJztcbmltcG9ydCAqIGFzIFV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGludGVyZmFjZSBIYmFyU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkO1xuICBwcnY6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeEluZm8ge1xuICByZWNpcGllbnRzOiBSZWNpcGllbnRbXTtcbiAgZnJvbTogc3RyaW5nO1xuICB0eGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25QcmVidWlsZCBleHRlbmRzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvOiBUeEluZm87XG4gIGZlZUluZm86IFRyYW5zYWN0aW9uRmVlO1xuICBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhIZXg/OiBzdHJpbmc7XG4gIGhhbGZTaWduZWQ/OiB7XG4gICAgdHhIZXg6IHN0cmluZztcbiAgfTtcbiAgZmVlSW5mbzogVHJhbnNhY3Rpb25GZWU7XG4gIC8vIFRPRE8oQkctMjQ4MDkpOiBnZXQgdGhlIG1lbW8gZnJvbSB0aGUgdG9Kc29uXG4gIG1lbW8/OiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGJhclZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIG1lbW8/OiBNZW1vO1xufVxuXG5pbnRlcmZhY2UgVmVyaWZ5QWRkcmVzc09wdGlvbnMgZXh0ZW5kcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMge1xuICBiYXNlQWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgSGJhciBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIGdldENoYWluKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IENvaW5GYW1pbHkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCkge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgSGJhcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBva2F5IHRvIHNlbmQgMCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGlzIGlzIGEgdmFsaWQgYmFzZTU4IG9yIGhleCBhZGRyZXNzXG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFV0aWxzLmlzVmFsaWRBZGRyZXNzV2l0aFBheW1lbnRJZChhZGRyZXNzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIEhlZGVyYSBIYXNoZ3JhcGgga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiwgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IEhiYXJLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBIYmFyS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcblxuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5cGFpciBnZW5lcmF0aW9uIGZhaWxlZCB0byBnZW5lcmF0ZSBhIHBydicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhZGRyZXNzIGlzIHZhbGlkLCB0aGVuIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSBiYXNlIGFkZHJlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7VmVyaWZ5QWRkcmVzc09wdGlvbnN9IHBhcmFtc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmFkZHJlc3MgLSB0aGUgYWRkcmVzcyB0byB2ZXJpZnlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyAtIHRoZSBiYXNlIGFkZHJlc3MgZnJvbSB0aGUgd2FsbGV0XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgYWRkcmVzcywgYmFzZUFkZHJlc3MgfSA9IHBhcmFtcztcbiAgICByZXR1cm4gVXRpbHMuaXNTYW1lQmFzZUFkZHJlc3MoYWRkcmVzcywgYmFzZUFkZHJlc3MpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBIYmFyVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gYXNzZXQgbmFtZSB0byB0cmFuc2ZlciBhbW91bnQgbWFwXG4gICAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpO1xuICAgIGNvbnN0IHsgdHhQYXJhbXM6IHR4UGFyYW1zLCB0eFByZWJ1aWxkOiB0eFByZWJ1aWxkLCBtZW1vOiBtZW1vIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbkNvbmZpZyk7XG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgZXhwbGFpblR4UGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsXG4gICAgICBmZWVJbmZvOiB0eFByZWJ1aWxkLmZlZUluZm8sXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH07XG4gICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluVHhQYXJhbXMpO1xuXG4gICAgaWYgKCF0eFBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcGFyYW1zIHByb3BlcnR5IHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICAvLyBmb3IgZW5hYmxldG9rZW4sIHJlY2lwaWVudCBvdXRwdXQgYW1vdW50IGlzIDBcbiAgICBjb25zdCByZWNpcGllbnRzID0gdHhQYXJhbXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gKHtcbiAgICAgIC4uLnJlY2lwaWVudCxcbiAgICAgIGFtb3VudDogdHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZXRva2VuJyA/ICcwJyA6IHJlY2lwaWVudC5hbW91bnQsXG4gICAgfSkpO1xuICAgIGlmIChjb2luQ29uZmlnLmlzVG9rZW4pIHtcbiAgICAgIHJlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIGlmIChyZWNpcGllbnQudG9rZW5OYW1lICE9PSB1bmRlZmluZWQgJiYgcmVjaXBpZW50LnRva2VuTmFtZSAhPT0gY29pbkNvbmZpZy5uYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgdG9rZW4gbmFtZSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIHJlY2lwaWVudC50b2tlbk5hbWUgPSBjb2luQ29uZmlnLm5hbWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgcmVjaXBpZW50cyBmcm9tIHBhcmFtcyBhbmQgZXhwbGFpbmVkVHhcbiAgICBjb25zdCBmaWx0ZXJlZFJlY2lwaWVudHMgPSByZWNpcGllbnRzPy5tYXAoKHJlY2lwaWVudCkgPT4gXy5waWNrKHJlY2lwaWVudCwgWydhZGRyZXNzJywgJ2Ftb3VudCcsICd0b2tlbk5hbWUnXSkpO1xuICAgIGNvbnN0IGZpbHRlcmVkT3V0cHV0cyA9IGV4cGxhaW5lZFR4Lm91dHB1dHMubWFwKChvdXRwdXQpID0+IF8ucGljayhvdXRwdXQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcblxuICAgIGlmICghXy5pc0VxdWFsKGZpbHRlcmVkT3V0cHV0cywgZmlsdGVyZWRSZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQge09iamVjdH0gcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHBsYXRmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHtTdHJpbmd9IHVzZXIgcHJ2XG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0LmFkZHJlc3NWZXJzaW9uIHtTdHJpbmd9IHRoaXMgaXMgdGhlIHZlcnNpb24gb2YgdGhlIEFsZ29yYW5kIG11bHRpc2lnIGFkZHJlc3MgZ2VuZXJhdGlvbiBmb3JtYXRcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj5cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IEhiYXJTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4KTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogcGFyYW1zLnBydiB9KTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWVzc2FnZWQgcGFzc2VkIHRvIHNpZ25NZXNzYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICB0eEhleDogdHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICB9O1xuICAgIHJldHVybiB0cmFuc2FjdGlvbi5zaWduYXR1cmUubGVuZ3RoID49IDIgPyByZXNwb25zZSA6IHsgaGFsZlNpZ25lZDogcmVzcG9uc2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIG1lc3NhZ2Ugd2l0aCBwcml2YXRlIGtleVxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEByZXR1cm4ge0J1ZmZlcn0gQSBzaWduYXR1cmUgb3ZlciB0aGUgZ2l2ZW4gbWVzc2FnZSB1c2luZyB0aGUgZ2l2ZW4ga2V5XG4gICAqL1xuICBhc3luYyBzaWduTWVzc2FnZShrZXk6IEtleVBhaXIsIG1lc3NhZ2U6IHN0cmluZyB8IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgbXNnID0gQnVmZmVyLmlzQnVmZmVyKG1lc3NhZ2UpID8gbWVzc2FnZS50b1N0cmluZygndXRmOCcpIDogbWVzc2FnZTtcbiAgICAvLyByZWNvbnN0aXR1dGUga2V5cyBhbmQgc2lnblxuICAgIHJldHVybiBCdWZmZXIuZnJvbShuZXcgSGJhcktleVBhaXIoeyBwcnY6IGtleS5wcnYgfSkuc2lnbk1lc3NhZ2UobXNnKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHby5cbiAgICogV2UgbmVlZCB0byBkbyB0aHJlZSBxdWVyaWVzIGR1cmluZyB0aGlzOlxuICAgKiAxKSBOb2RlIHF1ZXJ5IC0gaG93IG11Y2ggbW9uZXkgaXMgaW4gdGhlIGFjY291bnRcbiAgICogMikgQnVpbGQgdHJhbnNhY3Rpb24gLSBidWlsZCBvdXIgdHJhbnNhY3Rpb24gZm9yIHRoZSBhbW91bnRcbiAgICogMykgU2VuZCBzaWduZWQgYnVpbGQgLSBzZW5kIG91ciBzaWduZWQgYnVpbGQgdG8gYSBwdWJsaWMgbm9kZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gYSBIZWRlcmEgdHJhbnNhY3Rpb24gZnJvbSB0eEhleFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgdHhIZXggPSBwYXJhbXMudHhIZXggfHwgKHBhcmFtcy5oYWxmU2lnbmVkICYmIHBhcmFtcy5oYWxmU2lnbmVkLnR4SGV4KTtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgZXhwbGFpbiB0eCBwYXJhbWV0ZXJzJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMuZmVlSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGZlZSBpbmZvcm1hdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgY29uc3Qgb3V0cHV0czogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nOyBtZW1vOiBzdHJpbmc7IHRva2VuTmFtZT86IHN0cmluZyB9W10gPSBbXTtcbiAgICAvLyBUT0RPKEJHLTI0ODA5KTogZ2V0IHRoZSBtZW1vIGZyb20gdGhlIHRvSnNvblxuICAgIGxldCBtZW1vID0gJyc7XG4gICAgaWYgKHBhcmFtcy5tZW1vKSB7XG4gICAgICBtZW1vID0gcGFyYW1zLm1lbW8udmFsdWU7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS50eXBlKSB7XG4gICAgICBjYXNlICdjcnlwdG9UcmFuc2Zlcic6XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcbiAgICAgICAgcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXJlY2lwaWVudC50b2tlbk5hbWUpIHtcbiAgICAgICAgICAgIC8vIHRva2VuIHRyYW5zZmVyIGRvZXNuJ3QgY2hhbmdlIG91dHB1dEFtb3VudFxuICAgICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogcmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgbWVtbyxcbiAgICAgICAgICAgIC4uLihyZWNpcGllbnQudG9rZW5OYW1lICYmIHtcbiAgICAgICAgICAgICAgdG9rZW5OYW1lOiByZWNpcGllbnQudG9rZW5OYW1lLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndG9rZW5Bc3NvY2lhdGUnOlxuICAgICAgICBjb25zdCB0b2tlbnMgPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMudG9rZW5OYW1lcyB8fCBbXTtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gdHhKc29uLmluc3RydWN0aW9uc0RhdGEucGFyYW1zLmFjY291bnRJZDtcbiAgICAgICAgdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGFjY291bnRJZCxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgbWVtbyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBmb3JtYXQgb3V0c2lkZSBvZiBjcnlwdG9UcmFuc2ZlciBub3Qgc3VwcG9ydGVkIGZvciBleHBsYW5hdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICdvdXRwdXRzJyxcbiAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICdmZWUnLFxuICAgICAgJ3RpbWVzdGFtcCcsXG4gICAgICAnZXhwaXJhdGlvbicsXG4gICAgICAnbWVtbycsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSwgLy8gYWNjb3VudCBiYXNlZCBkb2VzIG5vdCB1c2UgY2hhbmdlIG91dHB1dHNcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLCAvLyBhY2NvdW50IGJhc2UgZG9lcyBub3QgbWFrZSBjaGFuZ2VcbiAgICAgIGZlZTogcGFyYW1zLmZlZUluZm8sXG4gICAgICB0aW1lc3RhbXA6IHR4SnNvbi5zdGFydFRpbWUsXG4gICAgICBleHBpcmF0aW9uOiB0eEpzb24udmFsaWREdXJhdGlvbixcbiAgICB9IGFzIGFueTtcbiAgfVxuXG4gIGlzU3RlbGxhclNlZWQoc2VlZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFNlZWRWYWxpZGF0b3IuaXNWYWxpZEVkMjU1MTlTZWVkRm9yQ29pbihzZWVkLCBDb2luRmFtaWx5LlhMTSk7XG4gIH1cblxuICBjb252ZXJ0RnJvbVN0ZWxsYXJTZWVkKHNlZWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIC8vIGFzc3VtZSB0aGlzIGlzIGEgdHJ1c3QgY3VzdG9kaWFsIHNlZWQgaWYgaXRzIGEgdmFsaWQgZWQyNTUxOSBwcnZcbiAgICBpZiAoIXRoaXMuaXNTdGVsbGFyU2VlZChzZWVkKSB8fCBTZWVkVmFsaWRhdG9yLmhhc0NvbXBldGluZ1NlZWRGb3JtYXRzKHNlZWQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoU2VlZFZhbGlkYXRvci5pc1ZhbGlkRWQyNTUxOVNlZWRGb3JDb2luKHNlZWQsIENvaW5GYW1pbHkuWExNKSkge1xuICAgICAgY29uc3Qga2V5RnJvbVNlZWQgPSBuZXcgSGJhcktleVBhaXIoeyBzZWVkOiBzdGVsbGFyLlN0cktleS5kZWNvZGVFZDI1NTE5U2VjcmV0U2VlZChzZWVkKSB9KTtcbiAgICAgIGNvbnN0IGtleXMgPSBrZXlGcm9tU2VlZC5nZXRLZXlzKCk7XG4gICAgICBpZiAoa2V5cyAhPT0gdW5kZWZpbmVkICYmIGtleXMucHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXlzLnBydjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gVXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgcHVibGljIGdldFRva2VuRW5hYmxlbWVudENvbmZpZygpOiBUb2tlbkVuYWJsZW1lbnRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1aXJlc1Rva2VuRW5hYmxlbWVudDogdHJ1ZSxcbiAgICAgIHN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cbn1cbiJdfQ==
|
|
668
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsaURBQXFGO0FBQ3JGLG1EQXNCOEI7QUFDOUIsK0NBQXlDO0FBQ3pDLHFEQUF1QztBQUN2QyxtREFBZ0Q7QUFDaEQsK0JBQXFIO0FBQ3JILG1EQUFxQztBQUNyQywwQ0FBNEI7QUFDNUIsd0NBTXdCO0FBQ3hCLDJDQUFrRDtBQWdIbEQsTUFBYSxJQUFLLFNBQVEsbUJBQVE7SUFHaEMsWUFBWSxLQUFnQixFQUFFLFdBQXVDO1FBQ25FLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3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TyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQzVDLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXp1QkQsb0JBeXVCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IENvaW5GYW1pbHksIEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEtleVBhaXIsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zIGFzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQgYXMgUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkIGFzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBNZW1vLFxuICBUb2tlbkVuYWJsZW1lbnRDb25maWcsXG4gIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3VsdCxcbiAgTm90U3VwcG9ydGVkLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgc3RlbGxhciBmcm9tICdzdGVsbGFyLXNkayc7XG5pbXBvcnQgeyBTZWVkVmFsaWRhdG9yIH0gZnJvbSAnLi9zZWVkVmFsaWRhdG9yJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSGJhcktleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFRyYW5zYWN0aW9uLCBSZWNpcGllbnQgYXMgSGVkZXJhUmVjaXBpZW50IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBUcmFuc2FjdGlvbiBhcyBIYmFyVHJhbnNhY3Rpb24sXG4gIEFjY291bnRCYWxhbmNlUXVlcnksXG4gIEFjY291bnRCYWxhbmNlSnNvbixcbiAgSGJhciBhcyBIYmFyVW5pdCxcbn0gZnJvbSAnQGhhc2hncmFwaC9zZGsnO1xuaW1wb3J0IHsgUFVCTElDX0tFWV9QUkVGSVggfSBmcm9tICcuL2xpYi9rZXlQYWlyJztcblxuLy8gSGVkZXJhLXNwZWNpZmljIHRyYW5zYWN0aW9uIGRhdGEgaW50ZXJmYWNlIGZvciByYXcgdHJhbnNhY3Rpb24gdmFsaWRhdGlvblxuaW50ZXJmYWNlIEhlZGVyYVJhd1RyYW5zYWN0aW9uRGF0YSB7XG4gIGlkPzogc3RyaW5nO1xuICBmcm9tPzogc3RyaW5nO1xuICBmZWU/OiBudW1iZXI7XG4gIHN0YXJ0VGltZT86IHN0cmluZztcbiAgdmFsaWREdXJhdGlvbj86IHN0cmluZztcbiAgbm9kZT86IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbiAgYW1vdW50Pzogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnNEYXRhPzoge1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkPzogc3RyaW5nO1xuICAgIHBhcmFtcz86IHtcbiAgICAgIGFjY291bnRJZD86IHN0cmluZztcbiAgICAgIHRva2VuTmFtZXM/OiBzdHJpbmdbXTtcbiAgICAgIHJlY2lwaWVudHM/OiBBcnJheTx7XG4gICAgICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICAgICAgYW1vdW50OiBzdHJpbmc7XG4gICAgICAgIHRva2VuTmFtZT86IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgaW50ZXJmYWNlIEhiYXJTaWduVHJhbnNhY3Rpb25PcHRpb25zIGV4dGVuZHMgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR4SW5mbyB7XG4gIHJlY2lwaWVudHM6IFJlY2lwaWVudFtdO1xuICBmcm9tOiBzdHJpbmc7XG4gIHR4aWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblByZWJ1aWxkIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm86IFR4SW5mbztcbiAgZmVlSW5mbzogVHJhbnNhY3Rpb25GZWU7XG4gIHNvdXJjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eEhleD86IHN0cmluZztcbiAgaGFsZlNpZ25lZD86IHtcbiAgICB0eEhleDogc3RyaW5nO1xuICB9O1xuICBmZWVJbmZvPzogVHJhbnNhY3Rpb25GZWU7XG4gIC8vIFRPRE8oQkctMjQ4MDkpOiBnZXQgdGhlIG1lbW8gZnJvbSB0aGUgdG9Kc29uXG4gIG1lbW8/OiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGJhclZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIG1lbW8/OiBNZW1vO1xufVxuXG5pbnRlcmZhY2UgVmVyaWZ5QWRkcmVzc09wdGlvbnMgZXh0ZW5kcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMge1xuICBiYXNlQWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5T3B0aW9ucyB7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIHJvb3RBZGRyZXNzOiBzdHJpbmc7XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAgYml0Z29LZXk/OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIG1heEZlZT86IHN0cmluZztcbiAgbm9kZUlkPzogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG4gIHRva2VuSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlcnlJbmZvIHtcbiAgaWQ6IHN0cmluZztcbiAgdHg6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xuICBzdGFydFRpbWU6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2ZmbGluZVZhdWx0VHhJbmZvIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk/OiBzdHJpbmc7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xuICBtYXhGZWU6IHN0cmluZztcbiAgcmVjaXBpZW50czogUmVjaXBpZW50W107XG4gIGFtb3VudDogc3RyaW5nO1xuICBzdGFydFRpbWU6IHN0cmluZztcbiAgdmFsaWREdXJhdGlvbjogc3RyaW5nO1xuICBub2RlSWQ6IHN0cmluZztcbiAgbWVtbzogc3RyaW5nO1xuICBqc29uPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb2FkY2FzdFRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMge1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQgZXh0ZW5kcyBCYXNlQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQge1xuICBzdGF0dXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBIYmFyIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogQ29pbkZhbWlseSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBIYmFyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyB2YWx1ZSBvZiAwXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCAwIHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoaXMgaXMgYSB2YWxpZCBiYXNlNTggb3IgaGV4IGFkZHJlc3NcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gVXRpbHMuaXNWYWxpZEFkZHJlc3NXaXRoUGF5bWVudElkKGFkZHJlc3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogaW5oZXJpdGRvYyAqL1xuICBkZXJpdmVLZXlXaXRoU2VlZCgpOiB7IGRlcml2YXRpb25QYXRoOiBzdHJpbmc7IGtleTogc3RyaW5nIH0ge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ21ldGhvZCBkZXJpdmVLZXlXaXRoU2VlZCBub3Qgc3VwcG9ydGVkIGZvciBlZGRzYSBjdXJ2ZScpO1xuICB9XG5cbiAgLyoqIGluaGVyaXRkb2MgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBIYmFyS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSGJhcktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleXBhaXIgZ2VuZXJhdGlvbiBmYWlsZWQgdG8gZ2VuZXJhdGUgYSBwcnYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZG9jICovXG4gIGdlbmVyYXRlUm9vdEtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IEhiYXJLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBIYmFyS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXModHJ1ZSk7XG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHJ2OiBrZXlzLnBydiArIGtleXMucHViLCBwdWI6IGtleXMucHViIH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgaXMgdmFsaWQsIHRoZW4gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIGJhc2UgYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtWZXJpZnlBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBhZGRyZXNzIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmJhc2VBZGRyZXNzIC0gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB3YWxsZXRcbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBiYXNlQWRkcmVzcyB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzLCBiYXNlQWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGEgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbiB3aXRoIHN0cmljdCB2YWxpZGF0aW9uXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFRva2VuIC0gT2JqZWN0IGNvbnRhaW5pbmcgdG9rZW5JZCAocHJlZmVycmVkKSBvciB0b2tlbk5hbWVcbiAgICogQHBhcmFtIGV4cGVjdGVkQWNjb3VudElkIC0gVGhlIGV4cGVjdGVkIGFjY291bnQgSUQgdGhhdCB3aWxsIGVuYWJsZSB0aGUgdG9rZW5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGEgdmFsaWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VG9rZW5FbmFibGVtZW50VHJhbnNhY3Rpb24oXG4gICAgdHhIZXg6IHN0cmluZyxcbiAgICBleHBlY3RlZFRva2VuOiB7IHRva2VuSWQ/OiBzdHJpbmc7IHRva2VuTmFtZT86IHN0cmluZyB9LFxuICAgIGV4cGVjdGVkQWNjb3VudElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0eEhleCB8fCAhZXhwZWN0ZWRBY2NvdW50SWQgfHwgKCFleHBlY3RlZFRva2VuLnRva2VuSWQgJiYgIWV4cGVjdGVkVG9rZW4udG9rZW5OYW1lKSkge1xuICAgICAgY29uc3QgbWlzc2luZzogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghdHhIZXgpIG1pc3NpbmcucHVzaCgndHhIZXgnKTtcbiAgICAgIGlmICghZXhwZWN0ZWRBY2NvdW50SWQpIG1pc3NpbmcucHVzaCgnZXhwZWN0ZWRBY2NvdW50SWQnKTtcbiAgICAgIGlmICghZXhwZWN0ZWRUb2tlbi50b2tlbklkICYmICFleHBlY3RlZFRva2VuLnRva2VuTmFtZSkgbWlzc2luZy5wdXNoKCdleHBlY3RlZFRva2VuLnRva2VuSWR8dG9rZW5OYW1lJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyczogJHttaXNzaW5nLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICAgIHRyYW5zYWN0aW9uLmZyb21SYXdUcmFuc2FjdGlvbih0eEhleCk7XG4gICAgICBjb25zdCByYXcgPSB0cmFuc2FjdGlvbi50b0pzb24oKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4IH0pO1xuXG4gICAgICB0aGlzLnZhbGlkYXRlVHhTdHJ1Y3R1cmVTdHJpY3QoZXhwbGFpbmVkVHgpO1xuICAgICAgdGhpcy52YWxpZGF0ZU5vVHJhbnNmZXJzKHJhdyk7XG4gICAgICB0aGlzLnZhbGlkYXRlQWNjb3VudElkTWF0Y2hlcyhleHBsYWluZWRUeCwgcmF3LCBleHBlY3RlZEFjY291bnRJZCk7XG4gICAgICB0aGlzLnZhbGlkYXRlVG9rZW5FbmFibGVtZW50VGFyZ2V0KGV4cGxhaW5lZFR4LCByYXcsIGV4cGVjdGVkVG9rZW4pO1xuICAgICAgdGhpcy52YWxpZGF0ZUFzc29jaWF0ZUluc3RydWN0aW9uT25seShyYXcpO1xuICAgICAgdGhpcy52YWxpZGF0ZVR4SGV4QWdhaW5zdEV4cGVjdGVkKHR4SGV4LCBleHBlY3RlZFRva2VuLCBleHBlY3RlZEFjY291bnRJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVR4U3RydWN0dXJlU3RyaWN0KGV4OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFleC5vdXRwdXRzIHx8IGV4Lm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbjogbWlzc2luZyByZXF1aXJlZCB0b2tlbiBhc3NvY2lhdGlvbiBvdXRwdXQnKTtcbiAgICB9XG4gICAgaWYgKGV4Lm91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBvdXRwdXQsIGdvdCAke2V4Lm91dHB1dHMubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBvdXQwID0gZXgub3V0cHV0c1swXTtcbiAgICBpZiAob3V0MC5hbW91bnQgIT09ICcwJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvdXRwdXQgYW1vdW50ICcwJywgZ290ICR7b3V0MC5hbW91bnR9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZU5vVHJhbnNmZXJzKHJhdzogSGVkZXJhUmF3VHJhbnNhY3Rpb25EYXRhKTogdm9pZCB7XG4gICAgaWYgKHJhdy5pbnN0cnVjdGlvbnNEYXRhPy5wYXJhbXM/LnJlY2lwaWVudHM/Lmxlbmd0aCAmJiByYXcuaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoYXNOb25aZXJvVHJhbnNmZXJzID0gcmF3Lmluc3RydWN0aW9uc0RhdGEucGFyYW1zLnJlY2lwaWVudHMuc29tZShcbiAgICAgICAgKHJlY2lwaWVudDogSGVkZXJhUmVjaXBpZW50KSA9PiByZWNpcGllbnQuYW1vdW50ICYmIHJlY2lwaWVudC5hbW91bnQgIT09ICcwJ1xuICAgICAgKTtcbiAgICAgIGlmIChoYXNOb25aZXJvVHJhbnNmZXJzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gY29udGFpbnMgdHJhbnNmZXJzOyBub3QgYSBwdXJlIHRva2VuIGVuYWJsZW1lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJhdy5hbW91bnQgJiYgcmF3LmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGNvbnRhaW5zIHRyYW5zZmVyczsgbm90IGEgcHVyZSB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBY2NvdW50SWRNYXRjaGVzKFxuICAgIGV4OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIHJhdzogSGVkZXJhUmF3VHJhbnNhY3Rpb25EYXRhLFxuICAgIGV4cGVjdGVkQWNjb3VudElkOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgaWYgKGV4Lm91dHB1dHMgJiYgZXgub3V0cHV0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvdXQwID0gZXgub3V0cHV0c1swXTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXQgPSBVdGlscy5nZXRBZGRyZXNzRGV0YWlscyhvdXQwLmFkZHJlc3MpLmFkZHJlc3M7XG4gICAgICBjb25zdCBub3JtYWxpemVkRXhwZWN0ZWQgPSBVdGlscy5nZXRBZGRyZXNzRGV0YWlscyhleHBlY3RlZEFjY291bnRJZCkuYWRkcmVzcztcbiAgICAgIGlmIChub3JtYWxpemVkT3V0cHV0ICE9PSBub3JtYWxpemVkRXhwZWN0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhY2NvdW50ICR7ZXhwZWN0ZWRBY2NvdW50SWR9LCBnb3QgJHtvdXQwLmFkZHJlc3N9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXNzb2NBY2N0ID0gcmF3Lmluc3RydWN0aW9uc0RhdGE/LnBhcmFtcz8uYWNjb3VudElkO1xuICAgIGlmIChhc3NvY0FjY3QpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRBc3NvYyA9IFV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGFzc29jQWNjdCkuYWRkcmVzcztcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBlY3RlZCA9IFV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGV4cGVjdGVkQWNjb3VudElkKS5hZGRyZXNzO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRBc3NvYyAhPT0gbm9ybWFsaXplZEV4cGVjdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzb2NpYXRlIGFjY291bnQgJHthc3NvY0FjY3R9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICR7ZXhwZWN0ZWRBY2NvdW50SWR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRva2VuRW5hYmxlbWVudFRhcmdldChcbiAgICBleDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgICByYXc6IEhlZGVyYVJhd1RyYW5zYWN0aW9uRGF0YSxcbiAgICBleHBlY3RlZDogeyB0b2tlbklkPzogc3RyaW5nOyB0b2tlbk5hbWU/OiBzdHJpbmcgfVxuICApOiB2b2lkIHtcbiAgICBpZiAoZXgub3V0cHV0cyAmJiBleC5vdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG91dDAgPSBleC5vdXRwdXRzWzBdO1xuICAgICAgY29uc3QgZXhwbGFpbmVkTmFtZSA9IG91dDAudG9rZW5OYW1lO1xuXG4gICAgICBpZiAoZXhwZWN0ZWQudG9rZW5OYW1lKSB7XG4gICAgICAgIGlmIChleHBsYWluZWROYW1lICE9PSBleHBlY3RlZC50b2tlbk5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRva2VuIG5hbWUgJHtleHBlY3RlZC50b2tlbk5hbWV9LCBnb3QgJHtleHBsYWluZWROYW1lfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChleHBlY3RlZC50b2tlbklkICYmIGV4cGxhaW5lZE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWN0dWFsVG9rZW5JZCA9IFV0aWxzLmdldEhlZGVyYVRva2VuSWRGcm9tTmFtZShleHBsYWluZWROYW1lKTtcbiAgICAgICAgaWYgKCFhY3R1YWxUb2tlbklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0b2tlbklkIGZvciB0b2tlbiBuYW1lICR7ZXhwbGFpbmVkTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0dWFsVG9rZW5JZCAhPT0gZXhwZWN0ZWQudG9rZW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0b2tlbklkICR7ZXhwZWN0ZWQudG9rZW5JZH0sIGJ1dCB0cmFuc2FjdGlvbiBjb250YWlucyB0b2tlbklkICR7YWN0dWFsVG9rZW5JZH0gKCR7ZXhwbGFpbmVkTmFtZX0pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBtaXNzaW5nIHRva2VuIGluZm9ybWF0aW9uIGluIG91dHB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbk5hbWVzID0gcmF3Lmluc3RydWN0aW9uc0RhdGE/LnBhcmFtcz8udG9rZW5OYW1lcyB8fCBbXTtcbiAgICBpZiAodG9rZW5OYW1lcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSAxIHRva2VuIHRvIGFzc29jaWF0ZSwgZ290ICR7dG9rZW5OYW1lcy5sZW5ndGh9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVR4SGV4QWdhaW5zdEV4cGVjdGVkKFxuICAgIHR4SGV4OiBzdHJpbmcsXG4gICAgZXhwZWN0ZWRUb2tlbjogeyB0b2tlbklkPzogc3RyaW5nOyB0b2tlbk5hbWU/OiBzdHJpbmcgfSxcbiAgICBleHBlY3RlZEFjY291bnRJZDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24odHhIZXgpO1xuXG4gICAgY29uc3QgdHhCb2R5ID0gdHJhbnNhY3Rpb24udHhCb2R5O1xuICAgIGlmICghdHhCb2R5LnRva2VuQXNzb2NpYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIG5vdCBhIFRva2VuQXNzb2NpYXRlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsQWNjb3VudElkID0gVXRpbHMuc3RyaW5naWZ5QWNjb3VudElkKHR4Qm9keS50b2tlbkFzc29jaWF0ZS5hY2NvdW50ISk7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFjdHVhbCA9IFV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGFjdHVhbEFjY291bnRJZCkuYWRkcmVzcztcbiAgICBjb25zdCBub3JtYWxpemVkRXhwZWN0ZWQgPSBVdGlscy5nZXRBZGRyZXNzRGV0YWlscyhleHBlY3RlZEFjY291bnRJZCkuYWRkcmVzcztcbiAgICBpZiAobm9ybWFsaXplZEFjdHVhbCAhPT0gbm9ybWFsaXplZEV4cGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR4SGV4IGFjY291bnQgJHthY3R1YWxBY2NvdW50SWR9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICR7ZXhwZWN0ZWRBY2NvdW50SWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVG9rZW5zID0gdHhCb2R5LnRva2VuQXNzb2NpYXRlLnRva2VucyB8fCBbXTtcbiAgICBpZiAoYWN0dWFsVG9rZW5zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeEhleCBjb250YWlucyAke2FjdHVhbFRva2Vucy5sZW5ndGh9IHRva2VucywgZXhwZWN0ZWQgZXhhY3RseSAxYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVG9rZW5JZCA9IFV0aWxzLnN0cmluZ2lmeVRva2VuSWQoYWN0dWFsVG9rZW5zWzBdKTtcblxuICAgIGlmIChleHBlY3RlZFRva2VuLnRva2VuSWQpIHtcbiAgICAgIGlmIChhY3R1YWxUb2tlbklkICE9PSBleHBlY3RlZFRva2VuLnRva2VuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeEhleCB0b2tlbklkICR7YWN0dWFsVG9rZW5JZH0gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgJHtleHBlY3RlZFRva2VuLnRva2VuSWR9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkVG9rZW4udG9rZW5OYW1lKSB7XG4gICAgICBjb25zdCBleHBlY3RlZFRva2VuSWQgPSBVdGlscy5nZXRIZWRlcmFUb2tlbklkRnJvbU5hbWUoZXhwZWN0ZWRUb2tlbi50b2tlbk5hbWUpO1xuICAgICAgaWYgKCFleHBlY3RlZFRva2VuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0b2tlbklkIGZvciBleHBlY3RlZCB0b2tlbiBuYW1lICR7ZXhwZWN0ZWRUb2tlbi50b2tlbk5hbWV9YCk7XG4gICAgICB9XG4gICAgICBpZiAoYWN0dWFsVG9rZW5JZCAhPT0gZXhwZWN0ZWRUb2tlbklkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVHhIZXggdG9rZW5JZCAke2FjdHVhbFRva2VuSWR9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHRva2VuSWQgJHtleHBlY3RlZFRva2VuSWR9IGZvciB0b2tlbiAke2V4cGVjdGVkVG9rZW4udG9rZW5OYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQXNzb2NpYXRlSW5zdHJ1Y3Rpb25Pbmx5KHJhdzogSGVkZXJhUmF3VHJhbnNhY3Rpb25EYXRhKTogdm9pZCB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlID0gU3RyaW5nKHJhdy5pbnN0cnVjdGlvbnNEYXRhPy50eXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udHJhY3RleGVjdXRlJyB8fFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udHJhY3RjYWxsJyB8fFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSAncHJlY29tcGlsZSdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udHJhY3QtYmFzZWQgdG9rZW4gYXNzb2NpYXRpb24gbm90IGFsbG93ZWQgZm9yIGJsaW5kIGVuYWJsZW1lbnQ7IGdvdCAke2luc3RydWN0aW9uVHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc05hdGl2ZUFzc29jaWF0ZSA9XG4gICAgICBpbnN0cnVjdGlvblR5cGUgPT09ICd0b2tlbmFzc29jaWF0ZScgfHwgaW5zdHJ1Y3Rpb25UeXBlID09PSAnYXNzb2NpYXRlJyB8fCBpbnN0cnVjdGlvblR5cGUgPT09ICdhc3NvY2lhdGVfdG9rZW4nO1xuICAgIGlmICghaXNOYXRpdmVBc3NvY2lhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE9ubHkgbmF0aXZlIFRva2VuQXNzb2NpYXRlIGlzIGFsbG93ZWQgZm9yIGJsaW5kIGVuYWJsZW1lbnQ7IGdvdCAke2luc3RydWN0aW9uVHlwZSB8fCAndW5rbm93bid9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IEhiYXJWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBhc3NldCBuYW1lIHRvIHRyYW5zZmVyIGFtb3VudCBtYXBcbiAgICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSk7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgbWVtbywgdmVyaWZpY2F0aW9uIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbkNvbmZpZyk7XG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgZXhwbGFpblR4UGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsXG4gICAgICBmZWVJbmZvOiB0eFByZWJ1aWxkLmZlZUluZm8sXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH07XG4gICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluVHhQYXJhbXMpO1xuXG4gICAgaWYgKCF0eFBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcGFyYW1zIHByb3BlcnR5IHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAodHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZXRva2VuJyAmJiB2ZXJpZmljYXRpb24/LnZlcmlmeVRva2VuRW5hYmxlbWVudCkge1xuICAgICAgY29uc3QgcjAgPSB0eFBhcmFtcy5yZWNpcGllbnRzWzBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUb2tlbjogeyB0b2tlbklkPzogc3RyaW5nOyB0b2tlbk5hbWU/OiBzdHJpbmcgfSA9IHt9O1xuXG4gICAgICBpZiAocjAudG9rZW5OYW1lKSB7XG4gICAgICAgIGV4cGVjdGVkVG9rZW4udG9rZW5OYW1lID0gcjAudG9rZW5OYW1lO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gVXRpbHMuZ2V0SGVkZXJhVG9rZW5JZEZyb21OYW1lKHIwLnRva2VuTmFtZSk7XG4gICAgICAgIGlmICh0b2tlbklkKSB7XG4gICAgICAgICAgZXhwZWN0ZWRUb2tlbi50b2tlbklkID0gdG9rZW5JZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4cGVjdGVkVG9rZW4udG9rZW5OYW1lICYmICFleHBlY3RlZFRva2VuLnRva2VuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBlbmFibGVtZW50IHJlcXVlc3QgbWlzc2luZyB0b2tlbiBpbmZvcm1hdGlvbicpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnZlcmlmeVRva2VuRW5hYmxlbWVudFRyYW5zYWN0aW9uKHR4UHJlYnVpbGQudHhIZXgsIGV4cGVjdGVkVG9rZW4sIHIwLmFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVuYWJsZXRva2VuLCByZWNpcGllbnQgb3V0cHV0IGFtb3VudCBpcyAwXG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+ICh7XG4gICAgICAuLi5yZWNpcGllbnQsXG4gICAgICBhbW91bnQ6IHR4UGFyYW1zLnR5cGUgPT09ICdlbmFibGV0b2tlbicgPyAnMCcgOiByZWNpcGllbnQuYW1vdW50LFxuICAgICAgYWRkcmVzczogVXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocmVjaXBpZW50LmFkZHJlc3MpLmFkZHJlc3MsXG4gICAgfSkpO1xuICAgIGlmIChjb2luQ29uZmlnLmlzVG9rZW4pIHtcbiAgICAgIHJlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIGlmIChyZWNpcGllbnQudG9rZW5OYW1lICE9PSB1bmRlZmluZWQgJiYgcmVjaXBpZW50LnRva2VuTmFtZSAhPT0gY29pbkNvbmZpZy5uYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgdG9rZW4gbmFtZSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIHJlY2lwaWVudC50b2tlbk5hbWUgPSBjb2luQ29uZmlnLm5hbWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgcmVjaXBpZW50cyBmcm9tIHBhcmFtcyBhbmQgZXhwbGFpbmVkVHhcbiAgICBjb25zdCBmaWx0ZXJlZFJlY2lwaWVudHMgPSByZWNpcGllbnRzPy5tYXAoKHJlY2lwaWVudCkgPT4gXy5waWNrKHJlY2lwaWVudCwgWydhZGRyZXNzJywgJ2Ftb3VudCcsICd0b2tlbk5hbWUnXSkpO1xuICAgIGNvbnN0IGZpbHRlcmVkT3V0cHV0cyA9IGV4cGxhaW5lZFR4Lm91dHB1dHMubWFwKChvdXRwdXQpID0+IF8ucGljayhvdXRwdXQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcblxuICAgIGlmICghXy5pc0VxdWFsKGZpbHRlcmVkT3V0cHV0cywgZmlsdGVyZWRSZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQge09iamVjdH0gcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHBsYXRmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHtTdHJpbmd9IHVzZXIgcHJ2XG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBIYmFyU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbShwYXJhbXMudHhQcmVidWlsZC50eEhleCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHBhcmFtcy5wcnYgfSk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lc3NhZ2VkIHBhc3NlZCB0byBzaWduTWVzc2FnZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgdHhIZXg6IHRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgfTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA+PSAyID8gcmVzcG9uc2UgOiB7IGhhbGZTaWduZWQ6IHJlc3BvbnNlIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBtZXNzYWdlIHdpdGggcHJpdmF0ZSBrZXlcbiAgICpcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtCdWZmZXJ9IEEgc2lnbmF0dXJlIG92ZXIgdGhlIGdpdmVuIG1lc3NhZ2UgdXNpbmcgdGhlIGdpdmVuIGtleVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5OiBLZXlQYWlyLCBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IG1zZyA9IEJ1ZmZlci5pc0J1ZmZlcihtZXNzYWdlKSA/IG1lc3NhZ2UudG9TdHJpbmcoJ3V0ZjgnKSA6IG1lc3NhZ2U7XG4gICAgLy8gcmVjb25zdGl0dXRlIGtleXMgYW5kIHNpZ25cbiAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IEhiYXJLZXlQYWlyKHsgcHJ2OiBrZXkucHJ2IH0pLnNpZ25NZXNzYWdlKG1zZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R28uXG4gICAqIFdlIG5lZWQgdG8gZG8gdGhyZWUgcXVlcmllcyBkdXJpbmcgdGhpczpcbiAgICogMSkgTm9kZSBxdWVyeSAtIGhvdyBtdWNoIG1vbmV5IGlzIGluIHRoZSBhY2NvdW50XG4gICAqIDIpIEJ1aWxkIHRyYW5zYWN0aW9uIC0gYnVpbGQgb3VyIHRyYW5zYWN0aW9uIGZvciB0aGUgYW1vdW50XG4gICAqIDMpIFNlbmQgc2lnbmVkIGJ1aWxkIC0gc2VuZCBvdXIgc2lnbmVkIGJ1aWxkIHRvIGEgcHVibGljIG5vZGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IE9mZmxpbmVWYXVsdFR4SW5mbz4ge1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9XG4gICAgICAocGFyYW1zLmJhY2t1cEtleS5zdGFydHNXaXRoKFBVQkxJQ19LRVlfUFJFRklYKSAmJiBwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKFBVQkxJQ19LRVlfUFJFRklYKSkgfHxcbiAgICAgIChVdGlscy5pc1ZhbGlkUHVibGljS2V5KHBhcmFtcy51c2VyS2V5KSAmJiBVdGlscy5pc1ZhbGlkUHVibGljS2V5KHBhcmFtcy5iYWNrdXBLZXkpKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByb290IGFkZHJlc3NcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJvb3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJvb3RBZGRyZXNzLCBnb3Q6ICcgKyBwYXJhbXMucm9vdEFkZHJlc3MpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24sIGdvdDogJyArIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBub2RlSWRcbiAgICBpZiAocGFyYW1zLm5vZGVJZCAmJiAhVXRpbHMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLm5vZGVJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBub2RlSWQsIGdvdDogJyArIHBhcmFtcy5ub2RlSWQpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGZlZVxuICAgIGlmIChwYXJhbXMubWF4RmVlICYmICFVdGlscy5pc1ZhbGlkQW1vdW50KHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4RmVlLCBnb3Q6ICcgKyBwYXJhbXMubWF4RmVlKTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBzdGFydFRpbWVcblxuICAgIGlmIChwYXJhbXMuc3RhcnRUaW1lKSB7XG4gICAgICBVdGlscy52YWxpZGF0ZVN0YXJ0VGltZShwYXJhbXMuc3RhcnRUaW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwICYmICFwYXJhbXMuc3RhcnRUaW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IHRpbWUgaXMgcmVxdWlyZWQgZm9yIHVuc2lnbmVkIHN3ZWVwJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1Vuc2lnbmVkU3dlZXAgJiYgIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgaXMgcmVxdWlyZWQgZm9yIG5vbi1iaXRnbyByZWNvdmVyeScpO1xuICAgIH1cblxuICAgIGxldCB1c2VyUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJhY2tVcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICB0cnkge1xuICAgICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHBhcmFtcy51c2VyS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICAgIGJhY2tVcCA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBwYXJhbXMuYmFja3VwS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAndW5hYmxlIHRvIGRlY3J5cHQgdXNlcktleSBvciBiYWNrdXBLZXkgd2l0aCB0aGUgd2FsbGV0UGFzc3BocmFzZSBwcm92aWRlZCwgZ290IGVycm9yOiAnICsgZS5tZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgdXNlcktleSBmb3IgdW5zaWduZWQgc3dlZXBcbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwICYmICFVdGlscy5pc1ZhbGlkUHVibGljS2V5KHBhcmFtcy51c2VyS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVzZXJLZXksIGdvdDogJyArIHBhcmFtcy51c2VyS2V5KTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBiYWNrdXBLZXkgZm9yIHVuc2lnbmVkIHN3ZWVwXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCAmJiAhVXRpbHMuaXNWYWxpZFB1YmxpY0tleShwYXJhbXMuYmFja3VwS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJhY2t1cEtleSwgZ290OiAnICsgcGFyYW1zLmJhY2t1cEtleSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhZGRyZXNzOiBkZXN0aW5hdGlvbkFkZHJlc3MsIG1lbW9JZCB9ID0gVXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgIGNvbnN0IG5vZGVJZCA9IHBhcmFtcy5ub2RlSWQgPyBwYXJhbXMubm9kZUlkIDogJzAuMC4zJztcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmdldEhiYXJDbGllbnQoKTtcbiAgICBjb25zdCBiYWxhbmNlID0gYXdhaXQgdGhpcy5nZXRBY2NvdW50QmFsYW5jZShwYXJhbXMucm9vdEFkZHJlc3MsIGNsaWVudCk7XG4gICAgY29uc3QgZmVlID0gcGFyYW1zLm1heEZlZSA/IHBhcmFtcy5tYXhGZWUgOiAnMTAwMDAwMDAnOyAvLyBkZWZhdWx0IGZlZSB0byAxIGhiYXJcbiAgICBjb25zdCBuYXRpdmVCYWxhbmNlID0gSGJhclVuaXQuZnJvbVN0cmluZyhiYWxhbmNlLmhiYXJzKS50b1RpbnliYXJzKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBzcGVuZGFibGVBbW91bnQgPSBuZXcgQmlnTnVtYmVyKG5hdGl2ZUJhbGFuY2UpLm1pbnVzKGZlZSk7XG5cbiAgICBsZXQgdHhCdWlsZGVyO1xuICAgIGlmICghcGFyYW1zLnRva2VuSWQpIHtcbiAgICAgIGlmIChzcGVuZGFibGVBbW91bnQuaXNaZXJvKCkgfHwgc3BlbmRhYmxlQW1vdW50LmlzTmVnYXRpdmUoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3VmZmljaWVudCBiYWxhbmNlIHRvIHJlY292ZXIsIGdvdCBiYWxhbmNlOiAke25hdGl2ZUJhbGFuY2V9IGZlZTogJHtmZWV9YCk7XG4gICAgICB9XG4gICAgICB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXJGYWN0b3J5KCkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50OiBzcGVuZGFibGVBbW91bnQudG9TdHJpbmcoKSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNwZW5kYWJsZUFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnN1ZmZpY2llbnQgbmF0aXZlIGJhbGFuY2UgdG8gcmVjb3ZlciB0b2tlbnMsIGdvdCBuYXRpdmUgYmFsYW5jZTogJHtuYXRpdmVCYWxhbmNlfSBmZWU6ICR7ZmVlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRva2VuQmFsYW5jZSA9IGJhbGFuY2UudG9rZW5zLmZpbmQoKHRva2VuKSA9PiB0b2tlbi50b2tlbklkID09PSBwYXJhbXMudG9rZW5JZCk7XG4gICAgICBjb25zdCB0b2tlbiA9IFV0aWxzLmdldEhlZGVyYVRva2VuTmFtZUZyb21JZChwYXJhbXMudG9rZW5JZCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdG9rZW46ICR7cGFyYW1zLnRva2VuSWR9YCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRva2VuQmFsYW5jZSB8fCBuZXcgQmlnTnVtYmVyKHRva2VuQmFsYW5jZS5iYWxhbmNlKS5pc1plcm8oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3VmZmljaWVudCBiYWxhbmNlIHRvIHJlY292ZXIgdG9rZW46ICR7cGFyYW1zLnRva2VuSWR9IGZvciBhY2NvdW50OiAke3BhcmFtcy5yb290QWRkcmVzc31gKTtcbiAgICAgIH1cbiAgICAgIHR4QnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlckZhY3RvcnkoKS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBkZXN0aW5hdGlvbkFkZHJlc3MsIGFtb3VudDogdG9rZW5CYWxhbmNlLmJhbGFuY2UsIHRva2VuTmFtZTogdG9rZW4ubmFtZSB9KTtcbiAgICB9XG5cbiAgICB0eEJ1aWxkZXIubm9kZSh7IG5vZGVJZCB9KTtcbiAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlIH0pO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBwYXJhbXMucm9vdEFkZHJlc3MgfSk7XG4gICAgdHhCdWlsZGVyLnZhbGlkRHVyYXRpb24oMTgwKTtcbiAgICBpZiAobWVtb0lkKSB7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vSWQpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc3RhcnRUaW1lKSB7XG4gICAgICB0eEJ1aWxkZXIuc3RhcnRUaW1lKFV0aWxzLm5vcm1hbGl6ZVN0YXJ0dGltZShwYXJhbXMuc3RhcnRUaW1lKSk7XG4gICAgfVxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4SGV4OiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICAgIHN0YXJ0VGltZTogdHhKc29uLnN0YXJ0VGltZSxcbiAgICAgICAgdmFsaWREdXJhdGlvbjogdHhKc29uLnZhbGlkRHVyYXRpb24sXG4gICAgICAgIG5vZGVJZDogdHhKc29uLm5vZGUsXG4gICAgICAgIG1lbW86IHR4SnNvbi5tZW1vLFxuICAgICAgICB1c2VyS2V5OiBwYXJhbXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBwYXJhbXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogcGFyYW1zLmJpdGdvS2V5LFxuICAgICAgICBtYXhGZWU6IGZlZSxcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLnJvb3RBZGRyZXNzLFxuICAgICAgICByZWNpcGllbnRzOiB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50cyxcbiAgICAgICAgYW1vdW50OiB0eEpzb24uYW1vdW50LFxuICAgICAgICBqc29uOiB0eEpzb24sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB1c2VyUHJ2IH0pO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBiYWNrVXAgfSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4OiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgaWQ6IHR4LnRvSnNvbigpLmlkLFxuICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgc3RhcnRUaW1lOiB0eC50b0pzb24oKS5zdGFydFRpbWUsXG4gICAgICBub2RlSWQ6IHR4LnRvSnNvbigpLm5vZGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsYWluIGEgSGVkZXJhIHRyYW5zYWN0aW9uIGZyb20gdHhIZXhcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4SGV4IHx8IChwYXJhbXMuaGFsZlNpZ25lZCAmJiBwYXJhbXMuaGFsZlNpZ25lZC50eEhleCk7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGV4cGxhaW4gdHggcGFyYW1ldGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgY29uc3Qgb3V0cHV0czogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nOyBtZW1vOiBzdHJpbmc7IHRva2VuTmFtZT86IHN0cmluZyB9W10gPSBbXTtcbiAgICAvLyBUT0RPKEJHLTI0ODA5KTogZ2V0IHRoZSBtZW1vIGZyb20gdGhlIHRvSnNvblxuICAgIGxldCBtZW1vID0gJyc7XG4gICAgaWYgKHBhcmFtcy5tZW1vKSB7XG4gICAgICBtZW1vID0gcGFyYW1zLm1lbW8udmFsdWU7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS50eXBlKSB7XG4gICAgICBjYXNlICdjcnlwdG9UcmFuc2Zlcic6XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcbiAgICAgICAgcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXJlY2lwaWVudC50b2tlbk5hbWUpIHtcbiAgICAgICAgICAgIC8vIHRva2VuIHRyYW5zZmVyIGRvZXNuJ3QgY2hhbmdlIG91dHB1dEFtb3VudFxuICAgICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogcmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgbWVtbyxcbiAgICAgICAgICAgIC4uLihyZWNpcGllbnQudG9rZW5OYW1lICYmIHtcbiAgICAgICAgICAgICAgdG9rZW5OYW1lOiByZWNpcGllbnQudG9rZW5OYW1lLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndG9rZW5Bc3NvY2lhdGUnOlxuICAgICAgICBjb25zdCB0b2tlbnMgPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMudG9rZW5OYW1lcyB8fCBbXTtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gdHhKc29uLmluc3RydWN0aW9uc0RhdGEucGFyYW1zLmFjY291bnRJZDtcbiAgICAgICAgdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGFjY291bnRJZCxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgbWVtbyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY3J5cHRvVXBkYXRlQWNjb3VudCc6XG4gICAgICAgIGNvbnN0IHVwZGF0ZVBhcmFtcyA9IHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcztcbiAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiB1cGRhdGVQYXJhbXMuYWNjb3VudElkLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIG1lbW8sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBmb3JtYXQgb3V0c2lkZSBvZiBjcnlwdG9UcmFuc2ZlciBub3Qgc3VwcG9ydGVkIGZvciBleHBsYW5hdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICdvdXRwdXRzJyxcbiAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICdmZWUnLFxuICAgICAgJ3RpbWVzdGFtcCcsXG4gICAgICAnZXhwaXJhdGlvbicsXG4gICAgICAnbWVtbycsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSwgLy8gYWNjb3VudCBiYXNlZCBkb2VzIG5vdCB1c2UgY2hhbmdlIG91dHB1dHNcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLCAvLyBhY2NvdW50IGJhc2UgZG9lcyBub3QgbWFrZSBjaGFuZ2VcbiAgICAgIGZlZTogcGFyYW1zLmZlZUluZm8/LmZlZSB8fCB0eEpzb24uZmVlLCAvLyBpbiB0aGUgaW5zdGFuY2Ugbm8gZmVlSW5mbyBpcyBwYXNzZWQgaW4gYXMgYSBwYXJhbSwgc2hvdyB0aGUgZmVlIGdpdmVuIGJ5IHRoZSB0eEpTT05cbiAgICAgIHRpbWVzdGFtcDogdHhKc29uLnN0YXJ0VGltZSxcbiAgICAgIGV4cGlyYXRpb246IHR4SnNvbi52YWxpZER1cmF0aW9uLFxuICAgIH0gYXMgYW55O1xuICB9XG5cbiAgaXNTdGVsbGFyU2VlZChzZWVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gU2VlZFZhbGlkYXRvci5pc1ZhbGlkRWQyNTUxOVNlZWRGb3JDb2luKHNlZWQsIENvaW5GYW1pbHkuWExNKTtcbiAgfVxuXG4gIGNvbnZlcnRGcm9tU3RlbGxhclNlZWQoc2VlZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gYXNzdW1lIHRoaXMgaXMgYSB0cnVzdCBjdXN0b2RpYWwgc2VlZCBpZiBpdHMgYSB2YWxpZCBlZDI1NTE5IHBydlxuICAgIGlmICghdGhpcy5pc1N0ZWxsYXJTZWVkKHNlZWQpIHx8IFNlZWRWYWxpZGF0b3IuaGFzQ29tcGV0aW5nU2VlZEZvcm1hdHMoc2VlZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChTZWVkVmFsaWRhdG9yLmlzVmFsaWRFZDI1NTE5U2VlZEZvckNvaW4oc2VlZCwgQ29pbkZhbWlseS5YTE0pKSB7XG4gICAgICBjb25zdCBrZXlGcm9tU2VlZCA9IG5ldyBIYmFyS2V5UGFpcih7IHNlZWQ6IHN0ZWxsYXIuU3RyS2V5LmRlY29kZUVkMjU1MTlTZWNyZXRTZWVkKHNlZWQpIH0pO1xuICAgICAgY29uc3Qga2V5cyA9IGtleUZyb21TZWVkLmdldEtleXMoKTtcbiAgICAgIGlmIChrZXlzICE9PSB1bmRlZmluZWQgJiYga2V5cy5wcnYpIHtcbiAgICAgICAgcmV0dXJuIGtleXMucHJ2O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICBzdXBwb3J0c0Rlcml2ZUtleVdpdGhTZWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy5vbmNoYWluO1xuICB9XG5cbiAgcHVibGljIGdldFRva2VuRW5hYmxlbWVudENvbmZpZygpOiBUb2tlbkVuYWJsZW1lbnRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1aXJlc1Rva2VuRW5hYmxlbWVudDogdHJ1ZSxcbiAgICAgIHN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEhiYXJDbGllbnQoKTogQ2xpZW50IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmJpdGdvLmdldEVudigpID09PSAncHJvZCcgPyBDbGllbnQuZm9yTWFpbm5ldCgpIDogQ2xpZW50LmZvclRlc3RuZXQoKTtcbiAgICByZXR1cm4gY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkOiBzdHJpbmcsIGNsaWVudDogQ2xpZW50KTogUHJvbWlzZTxBY2NvdW50QmFsYW5jZUpzb24+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IG5ldyBBY2NvdW50QmFsYW5jZVF1ZXJ5KCkuc2V0QWNjb3VudElkKGFjY291bnRJZCkuZXhlY3V0ZShjbGllbnQpO1xuXG4gICAgICByZXR1cm4gYmFsYW5jZS50b0pTT04oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgYWNjb3VudCBiYWxhbmNlLCBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnJvYWRjYXN0VHJhbnNhY3Rpb24oe1xuICAgIHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbixcbiAgICBzdGFydFRpbWUsXG4gIH06IEJyb2FkY2FzdFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8QnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGJhclR4ID0gSGJhclRyYW5zYWN0aW9uLmZyb21CeXRlcyhVdGlscy50b1VpbnQ4QXJyYXkoc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uKSk7XG5cbiAgICAgIGlmIChzdGFydFRpbWUpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFRpbWVTdHJpbmcoc3RhcnRUaW1lKTtcbiAgICAgICAgd2hpbGUgKCFVdGlscy5zaG91bGRCcm9hZGNhc3ROb3coc3RhcnRUaW1lKSkge1xuICAgICAgICAgIGF3YWl0IFV0aWxzLnNsZWVwKDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNsaWVudEJyb2FkY2FzdFRyYW5zYWN0aW9uKGhiYXJUeCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gYnJvYWRjYXN0IHRyYW5zYWN0aW9uLCBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2xpZW50QnJvYWRjYXN0VHJhbnNhY3Rpb24oaGJhclR4OiBIYmFyVHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmdldEhiYXJDbGllbnQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblJlc3BvbnNlID0gYXdhaXQgaGJhclR4LmV4ZWN1dGUoY2xpZW50KTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblJlY2VpcHQgPSBhd2FpdCB0cmFuc2FjdGlvblJlc3BvbnNlLmdldFJlY2VpcHQoY2xpZW50KTtcblxuICAgIHJldHVybiB7IHR4SWQ6IHRyYW5zYWN0aW9uUmVzcG9uc2UudHJhbnNhY3Rpb25JZC50b1N0cmluZygpLCBzdGF0dXM6IHRyYW5zYWN0aW9uUmVjZWlwdC5zdGF0dXMudG9TdHJpbmcoKSB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgcHJ2LCBwdWJsaWNLZXksIG11bHRpU2lnVHlwZSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cblxuICAgIGxldCBoYmFyS2V5UGFpcjtcblxuICAgIHRyeSB7XG4gICAgICBoYmFyS2V5UGFpciA9IG5ldyBIYmFyS2V5UGFpcih7IHBydiB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBrZXk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBjb25zdCBnZW5QdWJLZXkgPSBoYmFyS2V5UGFpci5nZXRLZXlzKCkucHViO1xuICAgIGlmIChwdWJsaWNLZXkgJiYgcHVibGljS2V5ICE9PSBnZW5QdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJsaWMga2V5Jyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|