@bitgo-beta/sdk-api 1.10.1-beta.1790 → 1.10.1-beta.1791
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/package.json +8 -8
- package/dist/src/v1/wallet.d.ts.map +1 -1
- package/dist/src/v1/wallet.js +19 -10
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
package/dist/src/v1/wallet.js
CHANGED
|
@@ -1546,7 +1546,10 @@ Wallet.prototype.createAndSignTransaction = function (params, callback) {
|
|
|
1546
1546
|
const safeUserKey = lodash_1.default.get(this.wallet, 'private.userPrivKey');
|
|
1547
1547
|
if (lodash_1.default.isString(safeUserKey) && lodash_1.default.isString(params.walletPassphrase)) {
|
|
1548
1548
|
// @ts-expect-error - no implicit this
|
|
1549
|
-
transaction.signingKey = this.bitgo.
|
|
1549
|
+
transaction.signingKey = await this.bitgo.decryptAsync({
|
|
1550
|
+
password: params.walletPassphrase,
|
|
1551
|
+
input: safeUserKey,
|
|
1552
|
+
});
|
|
1550
1553
|
}
|
|
1551
1554
|
else {
|
|
1552
1555
|
throw e;
|
|
@@ -1599,10 +1602,13 @@ Wallet.prototype.getAndPrepareSigningKeychain = function (params, callback) {
|
|
|
1599
1602
|
const self = this;
|
|
1600
1603
|
// Caller provided a wallet passphrase
|
|
1601
1604
|
if (params.walletPassphrase) {
|
|
1602
|
-
return self.getEncryptedUserKeychain().then(function (keychain) {
|
|
1605
|
+
return self.getEncryptedUserKeychain().then(async function (keychain) {
|
|
1603
1606
|
// Decrypt the user key with a passphrase
|
|
1604
1607
|
try {
|
|
1605
|
-
keychain.xprv = self.bitgo.
|
|
1608
|
+
keychain.xprv = await self.bitgo.decryptAsync({
|
|
1609
|
+
password: params.walletPassphrase,
|
|
1610
|
+
input: keychain.encryptedXprv,
|
|
1611
|
+
});
|
|
1606
1612
|
}
|
|
1607
1613
|
catch (e) {
|
|
1608
1614
|
throw new Error('Unable to decrypt user keychain');
|
|
@@ -2039,21 +2045,24 @@ Wallet.prototype.shareWallet = function (params, callback) {
|
|
|
2039
2045
|
.then(function (result) {
|
|
2040
2046
|
sharing = result;
|
|
2041
2047
|
if (needsKeychain) {
|
|
2042
|
-
return self.getEncryptedUserKeychain({}).then(function (keychain) {
|
|
2048
|
+
return self.getEncryptedUserKeychain({}).then(async function (keychain) {
|
|
2043
2049
|
// Decrypt the user key with a passphrase
|
|
2044
2050
|
if (keychain.encryptedXprv) {
|
|
2045
2051
|
if (!params.walletPassphrase) {
|
|
2046
2052
|
throw new Error('Missing walletPassphrase argument');
|
|
2047
2053
|
}
|
|
2048
2054
|
try {
|
|
2049
|
-
keychain.xprv = self.bitgo.
|
|
2055
|
+
keychain.xprv = await self.bitgo.decryptAsync({
|
|
2056
|
+
password: params.walletPassphrase,
|
|
2057
|
+
input: keychain.encryptedXprv,
|
|
2058
|
+
});
|
|
2050
2059
|
}
|
|
2051
2060
|
catch (e) {
|
|
2052
2061
|
throw new Error('Unable to decrypt user keychain');
|
|
2053
2062
|
}
|
|
2054
2063
|
const eckey = (0, sdk_core_1.makeRandomKey)();
|
|
2055
2064
|
const secret = (0, sdk_core_1.getSharedSecret)(eckey, Buffer.from(sharing.pubkey, 'hex')).toString('hex');
|
|
2056
|
-
const newEncryptedXprv = self.bitgo.
|
|
2065
|
+
const newEncryptedXprv = await self.bitgo.encryptAsync({ password: secret, input: keychain.xprv });
|
|
2057
2066
|
sharedKeychain = {
|
|
2058
2067
|
xpub: keychain.xpub,
|
|
2059
2068
|
encryptedXprv: newEncryptedXprv,
|
|
@@ -2286,9 +2295,9 @@ Wallet.prototype.recover = async function (params) {
|
|
|
2286
2295
|
(0, assert_1.default)(parsedUnsignedTx.ins.length === params.unspents.length);
|
|
2287
2296
|
(0, assert_1.default)(parsedUnsignedTx.outs.length === 1);
|
|
2288
2297
|
(0, assert_1.default)(lodash_1.default.sumBy(params.unspents, 'value') - lodash_1.default.sumBy(parsedUnsignedTx.outs, 'value') === Number(approximateTxFee));
|
|
2289
|
-
const plainUserKey = this.bitgo.
|
|
2298
|
+
const plainUserKey = await this.bitgo.decryptAsync({ password: params.walletPassphrase, input: params.userKey });
|
|
2290
2299
|
const halfSignedTx = await this.signTransaction({ ...unsignedTx, signingKey: plainUserKey });
|
|
2291
|
-
const plainBackupKey = this.bitgo.
|
|
2300
|
+
const plainBackupKey = await this.bitgo.decryptAsync({ password: params.walletPassphrase, input: params.backupKey });
|
|
2292
2301
|
const fullSignedTx = await this.signTransaction({
|
|
2293
2302
|
...unsignedTx,
|
|
2294
2303
|
transactionHex: halfSignedTx.tx,
|
|
@@ -2338,7 +2347,7 @@ Wallet.prototype.sweep = async function (params) {
|
|
|
2338
2347
|
(0, assert_1.default)(parsedUnsignedTx.ins.length === params.unspents.length);
|
|
2339
2348
|
(0, assert_1.default)(parsedUnsignedTx.outs.length === 1);
|
|
2340
2349
|
(0, assert_1.default)(lodash_1.default.sumBy(params.unspents, 'value') - lodash_1.default.sumBy(parsedUnsignedTx.outs, 'value') === Number(approximateTxFee));
|
|
2341
|
-
const plainUserKey = this.bitgo.
|
|
2350
|
+
const plainUserKey = await this.bitgo.decryptAsync({ password: params.walletPassphrase, input: params.userKey });
|
|
2342
2351
|
const halfSignedTx = await this.signTransaction({ ...unsignedTx, signingKey: plainUserKey });
|
|
2343
2352
|
return await this.sendTransaction({
|
|
2344
2353
|
tx: halfSignedTx.tx,
|
|
@@ -2347,4 +2356,4 @@ Wallet.prototype.sweep = async function (params) {
|
|
|
2347
2356
|
});
|
|
2348
2357
|
};
|
|
2349
2358
|
module.exports = Wallet;
|
|
2350
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsbURBQW9EO0FBQ3BELG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFDaEQsbURBQTZDO0FBQzdDLG1EQU84QjtBQUM5QixvREFBdUI7QUFDdkIseUNBQTZDO0FBQzdDLGtDQUFxQztBQUVyQyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzNELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELCtDQUErQztBQUMvQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUVsQyxTQUFTLGFBQWEsQ0FBQyxLQUFVLEVBQUUsZUFBeUI7SUFDMUQsK0JBQStCO0lBQy9CLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsTUFBTSxPQUFPLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzdELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsdUJBQXVCLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtC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VSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFFN0YsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDaEMsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFO1FBQ25CLGlCQUFpQixFQUFFLElBQUk7UUFDdkIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO0tBQ2hCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLGlCQUFTLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gV2FsbGV0IE9iamVjdFxuLy8gQml0R28gYWNjZXNzb3IgZm9yIGEgc3BlY2lmaWMgd2FsbGV0XG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cblxuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHtcbiAgY29tbW9uLFxuICBFcnJvck5vSW5wdXRUb1JlY292ZXIsXG4gIGdldE5ldHdvcmssXG4gIGdldFNoYXJlZFNlY3JldCxcbiAgbWFrZVJhbmRvbUtleSxcbiAgc2FuaXRpemVMZWdhY3lQYXRoLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc2lnblBzYnRSZXF1ZXN0IH0gZnJvbSAnLi9zaWduUHNidCc7XG5pbXBvcnQgeyB0cnlQcm9taXNlIH0gZnJvbSAnLi4vdXRpbCc7XG5cbmNvbnN0IFRyYW5zYWN0aW9uQnVpbGRlciA9IHJlcXVpcmUoJy4vdHJhbnNhY3Rpb25CdWlsZGVyJyk7XG5jb25zdCBQZW5kaW5nQXBwcm92YWwgPSByZXF1aXJlKCcuL3BlbmRpbmdhcHByb3ZhbCcpO1xuXG4vLyBQU0JUIHJvbGxvdXQ6IDAlIG9uIG1haW5uZXQsIDEwMCUgb24gdGVzdG5ldFxuY29uc3QgVjFfUFNCVF9ST0xMT1VUX1BFUkNFTlQgPSAwO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQc2J0KGJpdGdvOiBhbnksIGV4cGxpY2l0VXNlUHNidD86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgLy8gRXhwbGljaXQgc2V0dGluZyBhbHdheXMgd2luc1xuICBpZiAoZXhwbGljaXRVc2VQc2J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXhwbGljaXRVc2VQc2J0O1xuICB9XG5cbiAgLy8gVGVzdG5ldDogYWx3YXlzIFBTQlRcbiAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldPy5uZXR3b3JrO1xuICBpZiAobmV0d29yayAhPT0gJ2JpdGNvaW4nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBNYWlubmV0OiAxMCUgcm9sbG91dFxuICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIDEwMCA8IFYxX1BTQlRfUk9MTE9VVF9QRVJDRU5UO1xufVxuXG5jb25zdCB7IGdldEV4dGVybmFsQ2hhaW5Db2RlLCBnZXRJbnRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiB9ID0gdXR4b2xpYi5iaXRnbztcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCdzdXBlcmFnZW50Jyk7XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IFdhbGxldCA9IGZ1bmN0aW9uIChiaXRnbywgd2FsbGV0KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICh0aGlzLmJpdGdvIGFzIGFueSkgPSBiaXRnbztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMua2V5Y2hhaW5zID0gW107XG5cbiAgaWYgKHdhbGxldC5wcml2YXRlKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICB0aGlzLmtleWNoYWlucyA9IHdhbGxldC5wcml2YXRlLmtleWNoYWlucztcbiAgfVxufTtcblxuV2FsbGV0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldDtcbn07XG5cbi8vXG4vLyBpZFxuLy8gR2V0IHRoZSBpZCBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuaWQ7XG59O1xuXG4vL1xuLy8gbGFiZWxcbi8vIEdldCB0aGUgbGFiZWwgb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5sYWJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmxhYmVsO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5iYWxhbmNlO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vLyBUaGlzIGlzIHRoZSB0b3RhbCBvZiBhbGwgdW5zcGVudHMgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHVuY29uZmlybWVkIGFuZCBleHRlcm5hbFxuLy9cbldhbGxldC5wcm90b3R5cGUuc3BlbmRhYmxlQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY29uZmlybWVkQmFsYW5jZVxuLy8gR2V0IHRoZSBjb25maXJtZWRCYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuY29uZmlybWVkQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY2FuU2VuZEluc3RhbnRcbi8vIFJldHVybnMgaWYgdGhlIHdhbGxldCBjYW4gc2VuZCBpbnN0YW50IHRyYW5zYWN0aW9uc1xuLy8gVGhpcyBpcyBpbXBhY3RlZCBieSB0aGUgY2hvaWNlIG9mIGJhY2t1cCBrZXkgcHJvdmlkZXJcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNhblNlbmRJbnN0YW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQgJiYgdGhpcy53YWxsZXQuY2FuU2VuZEluc3RhbnQ7XG59O1xuXG4vL1xuLy8gaW5zdGFudCBiYWxhbmNlXG4vLyBHZXQgdGhlIGluc3RhbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vIFRoaXMgaXMgdGhlIHRvdGFsIG9mIGFsbCB1bnNwZW50cyB0aGF0IG1heSBiZSBzcGVudCBpbnN0YW50bHkuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5pbnN0YW50QmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNhblNlbmRJbnN0YW50KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhbiBpbnN0YW50IHdhbGxldCcpO1xuICB9XG4gIHJldHVybiB0aGlzLndhbGxldC5pbnN0YW50QmFsYW5jZTtcbn07XG5cbi8vXG4vLyB1bmNvbmZpcm1lZFNlbmRzXG4vLyBHZXQgdGhlIGJhbGFuY2Ugb2YgdW5jb25maXJtZWRTZW5kcyBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuY29uZmlybWVkU2VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC51bmNvbmZpcm1lZFNlbmRzO1xufTtcblxuLy9cbi8vIHVuY29uZmlybWVkUmVjZWl2ZXNcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB1bmNvbmZpcm1lZFJlY2VpdmVzIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bmNvbmZpcm1lZFJlY2VpdmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQudW5jb25maXJtZWRSZWNlaXZlcztcbn07XG5cbi8vXG4vLyB0eXBlXG4vLyBHZXQgdGhlIHR5cGUgb2YgdGhpcyB3YWxsZXQsIGUuZy4gJ3NhZmVoZCdcbi8vXG5XYWxsZXQucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC50eXBlO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS51cmwgPSBmdW5jdGlvbiAoZXh0cmEpIHtcbiAgZXh0cmEgPSBleHRyYSB8fCAnJztcbiAgcmV0dXJuIHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG59O1xuXG4vL1xuLy8gcGVuZGluZ0FwcHJvdmFsc1xuLy8gcmV0dXJucyB0aGUgcGVuZGluZyBhcHByb3ZhbHMgbGlzdCBmb3IgdGhpcyB3YWxsZXQgYXMgcGVuZGluZyBhcHByb3ZhbCBvYmplY3RzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5wZW5kaW5nQXBwcm92YWxzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnBlbmRpbmdBcHByb3ZhbHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwoc2VsZi5iaXRnbywgcCwgc2VsZik7XG4gIH0pO1xufTtcblxuLy9cbi8vIGFwcHJvdmFsc1JlcXVpcmVkXG4vLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzIHJlcXVpcmVkIHRvIGFwcHJvdmUgcGVuZGluZyBhcHByb3ZhbHMgaW52b2x2aW5nIHRoaXMgd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkIHx8IDE7XG59O1xuXG4vL1xuLy8gZ2V0XG4vLyBSZWZldGNoZXMgdGhpcyB3YWxsZXQgYW5kIHJldHVybnMgaXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogUHJvbWlzZTxhbnk+IHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoKSlcbiAgICAgIC5yZXN1bHQoKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBzZWxmLndhbGxldCA9IHJlcztcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9KVxuICApXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB1cGRhdGVBcHByb3ZhbHNSZXF1aXJlZFxuLy8gVXBkYXRlcyB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBvbiBhIHBlbmRpbmcgYXBwcm92YWwgaW52b2x2aW5nIHRoaXMgd2FsbGV0LlxuLy8gVGhlIGFwcHJvdmFscyByZXF1aXJlZCBpcyBieSBkZWZhdWx0IDEsIGJ1dCB0aGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZVxuLy8gbnVtYmVyIHN1Y2ggdGhhdCAxIDw9IGFwcHJvdmFsc1JlcXVpcmVkIDw9IHdhbGxldEFkbWlucy5sZW5ndGggLSAxXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51cGRhdGVBcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogUHJvbWlzZTxhbnk+IHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKFxuICAgIHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgIV8uaXNJbnRlZ2VyKHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCkgfHxcbiAgICBwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQgPCAxXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcHByb3ZhbHNSZXF1aXJlZDogbXVzdCBiZSBhIG5vbnplcm8gcG9zaXRpdmUgbnVtYmVyJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgY29uc3QgY3VycmVudEFwcHJvdmFsc1JlcXVpcmVkID0gdGhpcy5hcHByb3ZhbHNSZXF1aXJlZCgpO1xuICBpZiAoY3VycmVudEFwcHJvdmFsc1JlcXVpcmVkID09PSBwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQpIHtcbiAgICAvLyBuby1vcCwganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgd2FsbGV0XG4gICAgcmV0dXJuIHRyeVByb21pc2UoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYud2FsbGV0O1xuICAgIH0pXG4gICAgICAudGhlbihjYWxsYmFjaylcbiAgICAgIC5jYXRjaChjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb3JyZWN0IGNoYWluIGZvciBjaGFuZ2UsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gc2Vnd2l0XG4gKi9cbldhbGxldC5wcm90b3R5cGUuZ2V0Q2hhbmdlQ2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGxldCB1c2VTZWd3aXRDaGFuZ2UgPSAhIXRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZW5hYmxlU2Vnd2l0O1xuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdENoYW5nZSkpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXRDaGFuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlZ3dpdENoYW5nZSBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgIH1cblxuICAgIC8vIGlmIHNlZ3dpdCBpcyBkaXNhYmxlZCB0aHJvdWdoIHRoZSBjb25zdGFudHMsIHNlZ3dpdCBjaGFuZ2Ugc2hvdWxkIHN0aWxsIG5vdCBiZSBjcmVhdGVkXG4gICAgdXNlU2Vnd2l0Q2hhbmdlID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQgJiYgcGFyYW1zLnNlZ3dpdENoYW5nZTtcbiAgfVxuICByZXR1cm4gdXNlU2Vnd2l0Q2hhbmdlID8gZ2V0SW50ZXJuYWxDaGFpbkNvZGUoJ3Ayc2hQMndzaCcpIDogZ2V0SW50ZXJuYWxDaGFpbkNvZGUoJ3Ayc2gnKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVBZGRyZXNzXG4vLyBDcmVhdGVzIGEgbmV3IGFkZHJlc3MgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlQWRkcmVzcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAodGhpcy50eXBlKCkgPT09ICdzYWZlJykge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IGFyZSB1c2luZyBhIGxlZ2FjeSB3YWxsZXQgdGhhdCBjYW5ub3QgY3JlYXRlIGEgbmV3IGFkZHJlc3MnKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdG8gY2xpZW50LXNpZGUgYWRkcmVzcyB2YWxpZGF0aW9uIG9uLCBmb3Igc2FmZXR5LiBVc2UgdmFsaWRhdGU9ZmFsc2UgdG8gZGlzYWJsZS5cbiAgY29uc3Qgc2hvdWxkVmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy52YWxpZGF0ZSA6IHRoaXMuYml0Z28uZ2V0VmFsaWRhdGUoKTtcblxuICBjb25zdCBhbGxvd0V4aXN0aW5nID0gcGFyYW1zLmFsbG93RXhpc3Rpbmc7XG4gIGlmICh0eXBlb2YgYWxsb3dFeGlzdGluZyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcGFyYW1zLmFsbG93RXhpc3RpbmcgPSBhbGxvd0V4aXN0aW5nID09PSAndHJ1ZSc7XG4gIH1cblxuICBjb25zdCBpc1NlZ3dpdCA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZW5hYmxlU2Vnd2l0O1xuICBjb25zdCBkZWZhdWx0Q2hhaW4gPSBpc1NlZ3dpdCA/IGdldEV4dGVybmFsQ2hhaW5Db2RlKCdwMnNoUDJ3c2gnKSA6IGdldEV4dGVybmFsQ2hhaW5Db2RlKCdwMnNoJyk7XG5cbiAgbGV0IGNoYWluID0gcGFyYW1zLmNoYWluO1xuICBpZiAoY2hhaW4gPT09IG51bGwgfHwgY2hhaW4gPT09IHVuZGVmaW5lZCkge1xuICAgIGNoYWluID0gZGVmYXVsdENoYWluO1xuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoJy9hZGRyZXNzLycgKyBjaGFpbikpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChhZGRyKSB7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgICAgICAgIHNlbGYudmFsaWRhdGVBZGRyZXNzKGFkZHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgfSlcbiAgKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGFkZHJlc3MgbG9jYWxseSB3aXRob3V0IGNhbGxpbmcgc2VydmVyXG4gKiBAcGFyYW0gcGFyYW1zXG4gKlxuICovXG5XYWxsZXQucHJvdG90eXBlLmdlbmVyYXRlQWRkcmVzcyA9IGZ1bmN0aW9uICh7IHNlZ3dpdCwgcGF0aCwga2V5Y2hhaW5zLCB0aHJlc2hvbGQgfSkge1xuICBjb25zdCBpc1NlZ3dpdCA9ICEhc2Vnd2l0O1xuICBsZXQgc2lnbmF0dXJlVGhyZXNob2xkID0gMjtcbiAgaWYgKF8uaXNJbnRlZ2VyKHRocmVzaG9sZCkpIHtcbiAgICBzaWduYXR1cmVUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG4gICAgaWYgKHNpZ25hdHVyZVRocmVzaG9sZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBoYXMgdG8gYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXRoUmVnZXggPSAvXlxcLzE/WzAxXVxcL1xcZCskLztcbiAgaWYgKCFwYXRoLm1hdGNoKHBhdGhSZWdleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHBhdGg6ICcgKyBwYXRoKTtcbiAgfVxuXG4gIGxldCByb290S2V5cyA9IHRoaXMua2V5Y2hhaW5zO1xuICBpZiAoQXJyYXkuaXNBcnJheShrZXljaGFpbnMpKSB7XG4gICAgcm9vdEtleXMgPSBrZXljaGFpbnM7XG4gIH1cblxuICBjb25zdCBuZXR3b3JrID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS5uZXR3b3JrO1xuXG4gIGNvbnN0IGRlcml2ZWRLZXlzID0gcm9vdEtleXMubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgY29uc3QgaGRub2RlID0gYmlwMzIuZnJvbUJhc2U1OChrLnhwdWIpO1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gay5wYXRoICsgKGsud2FsbGV0U3ViUGF0aCB8fCAnJykgKyBwYXRoO1xuICAgIHJldHVybiBoZG5vZGUuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgoZGVyaXZhdGlvblBhdGgpKS5wdWJsaWNLZXk7XG4gIH0pO1xuXG4gIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICBjb25zdCBub3JtYWxpemVkUGF0aENvbXBvbmVudHMgPSBfLm1hcChwYXRoQ29tcG9uZW50cywgKGNvbXBvbmVudCkgPT4ge1xuICAgIGlmIChjb21wb25lbnQgJiYgY29tcG9uZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBwYXJzZUludChjb21wb25lbnQsIDEwKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBwYXRoRGV0YWlscyA9IF8uZmlsdGVyKG5vcm1hbGl6ZWRQYXRoQ29tcG9uZW50cywgXy5pc0ludGVnZXIpO1xuXG4gIGNvbnN0IGFkZHJlc3NEZXRhaWxzOiBhbnkgPSB7XG4gICAgY2hhaW5QYXRoOiBwYXRoLFxuICAgIHBhdGg6IHBhdGgsXG4gICAgY2hhaW46IHBhdGhEZXRhaWxzWzBdLFxuICAgIGluZGV4OiBwYXRoRGV0YWlsc1sxXSxcbiAgICB3YWxsZXQ6IHRoaXMuaWQoKSxcbiAgfTtcblxuICBjb25zdCB7XG4gICAgc2NyaXB0UHViS2V5OiBvdXRwdXRTY3JpcHQsXG4gICAgcmVkZWVtU2NyaXB0LFxuICAgIHdpdG5lc3NTY3JpcHQsXG4gIH0gPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhkZXJpdmVkS2V5cywgaXNTZWd3aXQgPyAncDJzaFAyd3NoJyA6ICdwMnNoJyk7XG5cbiAgYWRkcmVzc0RldGFpbHMud2l0bmVzc1NjcmlwdCA9IHdpdG5lc3NTY3JpcHQ/LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMucmVkZWVtU2NyaXB0ID0gcmVkZWVtU2NyaXB0Py50b1N0cmluZygnaGV4Jyk7XG4gIGFkZHJlc3NEZXRhaWxzLm91dHB1dFNjcmlwdCA9IG91dHB1dFNjcmlwdC50b1N0cmluZygnaGV4Jyk7XG4gIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIGdldE5ldHdvcmsobmV0d29yaykpO1xuXG4gIHJldHVybiBhZGRyZXNzRGV0YWlscztcbn07XG5cbi8vXG4vLyB2YWxpZGF0ZUFkZHJlc3Ncbi8vIFZhbGlkYXRlcyBhbiBhZGRyZXNzIGFuZCBwYXRoIGJ5IGNhbGN1bGF0aW5nIGl0IGxvY2FsbHkgZnJvbSB0aGUga2V5Y2hhaW4geHB1YnNcbi8vXG5XYWxsZXQucHJvdG90eXBlLnZhbGlkYXRlQWRkcmVzcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJywgJ3BhdGgnXSwgW10pO1xuICBjb25zdCBpc1NlZ3dpdCA9ICEhcGFyYW1zLndpdG5lc3NTY3JpcHQgJiYgcGFyYW1zLndpdG5lc3NTY3JpcHQubGVuZ3RoID4gMDtcblxuICBjb25zdCBnZW5lcmF0ZWRBZGRyZXNzID0gdGhpcy5nZW5lcmF0ZUFkZHJlc3MoeyBwYXRoOiBwYXJhbXMucGF0aCwgc2Vnd2l0OiBpc1NlZ3dpdCB9KTtcbiAgaWYgKGdlbmVyYXRlZEFkZHJlc3MuYWRkcmVzcyAhPT0gcGFyYW1zLmFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiAnICsgcGFyYW1zLmFkZHJlc3MgKyAnIHZzLiAnICsgZ2VuZXJhdGVkQWRkcmVzcy5hZGRyZXNzKTtcbiAgfVxufTtcblxuLy9cbi8vIGFkZHJlc3Nlc1xuLy8gR2V0cyB0aGUgYWRkcmVzc2VzIG9mIGEgSEQgd2FsbGV0LlxuLy8gT3B0aW9ucyBpbmNsdWRlOlxuLy8gIGxpbWl0OiB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyB0byBnZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFkZHJlc3NlcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgcXVlcnk6IGFueSA9IHt9O1xuICBpZiAocGFyYW1zLmRldGFpbHMpIHtcbiAgICBxdWVyeS5kZXRhaWxzID0gMTtcbiAgfVxuXG4gIGNvbnN0IGNoYWluID0gcGFyYW1zLmNoYWluO1xuICBpZiAoY2hhaW4gIT09IG51bGwgJiYgY2hhaW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoYWluKSkge1xuICAgICAgcXVlcnkuY2hhaW4gPSBfLnVuaXEoXy5maWx0ZXIoY2hhaW4sIF8uaXNJbnRlZ2VyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGFpbiAhPT0gMCAmJiBjaGFpbiAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW4gYXJndW1lbnQsIGV4cGVjdGluZyAwIG9yIDEnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWluID0gY2hhaW47XG4gICAgfVxuICB9XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgfVxuICBpZiAocGFyYW1zLnNraXApIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5za2lwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkuc2tpcCA9IHBhcmFtcy5za2lwO1xuICB9XG4gIGlmIChwYXJhbXMuc29ydCkge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuc29ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LnNvcnQgPSBwYXJhbXMuc29ydDtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzc2VzJyk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuc3RhdHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdsaW1pdD0nICsgcGFyYW1zLmxpbWl0KTtcbiAgfVxuICBsZXQgcXVlcnkgPSAnJztcbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSAnPycgKyBhcmdzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvc3RhdHMnICsgcXVlcnkpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMge1dhbGxldH1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyB3aGVuIHNldCB0byB0cnVlLCBncGsgcmV0dXJucyB0aGUgcHJpdmF0ZSBkYXRhIG9mIHNhZmUgd2FsbGV0c1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5leHRlbmQoe30sIF8ucGljayhwYXJhbXMsIFsnZ3BrJ10pKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHRoaXMud2FsbGV0ID0gcmVzO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gYWRkcmVzc1xuLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBhZGRyZXNzIG9uIGEgSEQgd2FsbGV0LlxuLy8gSW5mb3JtYXRpb24gaW5jbHVkZXMgaW5kZXgsIHBhdGgsIHJlZGVlbVNjcmlwdCwgc2VudCwgcmVjZWl2ZWQsIHR4Q291bnQgYW5kIGJhbGFuY2Vcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBhZGRyZXNzOiB0aGUgYWRkcmVzcyBvbiB0aGlzIHdhbGxldCB0byBnZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzc2VzLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEZyZWV6ZSB0aGUgd2FsbGV0IGZvciBhIGR1cmF0aW9uIG9mIGNob2ljZSwgc3RvcHBpbmcgQml0R28gZnJvbSBzaWduaW5nIGFueSB0cmFuc2FjdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIGR1cmF0aW9uIHRvIGZyZWV6ZSB0aGUgd2FsbGV0IGZvciBpbiBzZWNvbmRzLCBkZWZhdWx0cyB0byAzNjAwLlxuICovXG5XYWxsZXQucHJvdG90eXBlLmZyZWV6ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb24gLSBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ZyZWV6ZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVcbi8vIERlbGV0ZXMgdGhlIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gbGFiZWxzXG4vLyBMaXN0IHRoZSBsYWJlbHMgZm9yIHRoZSBhZGRyZXNzZXMgaW4gYSBnaXZlbiB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmxhYmVscyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgnbGFiZWxzJykpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVuYW1lIGEgd2FsbGV0XG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgLSBsYWJlbDogdGhlIHdhbGxldCdzIGludGVuZGVkIG5ldyBuYW1lXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnNldFdhbGxldE5hbWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2V0TGFiZWxcbi8vIFNldHMgYSBsYWJlbCBvbiB0aGUgcHJvdmlkZWQgYWRkcmVzc1xuLy9cbldhbGxldC5wcm90b3R5cGUuc2V0TGFiZWwgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdsYWJlbCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghc2VsZi5iaXRnby52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MgfSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcGFyYW1zLmFkZHJlc3MpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSArICcvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZCh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVMYWJlbFxuLy8gRGVsZXRlcyB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVMYWJlbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzZWxmLmJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuYWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpICsgJy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVuc3BlbnRzXG4vLyBMaXN0IEFMTCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHBhZ2VkIGxpc3Qgb2YgYWxsIHVuc3BlbnRzXG4vL1xuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICBsaW1pdDogIHRoZSBvcHRpb25hbCBsaW1pdCBvZiB1bnNwZW50cyB0byBjb2xsZWN0IGluIEJUQ1xuLy8gICBtaW5Db25mOiBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbi8vICAgdGFyZ2V0OiB0aGUgYW1vdW50IG9mIGJ0YyB0byBmaW5kIHRvIHNwZW5kXG4vLyAgIGluc3RhbnQ6IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuLy9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFsbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBjb25zdCBnZXRVbnNwZW50c0JhdGNoID0gZnVuY3Rpb24gKHNraXAsIGxpbWl0Pykge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcbiAgICBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHF1ZXJ5T2JqZWN0LnNraXAgPSBza2lwO1xuICAgIH1cbiAgICBpZiAobGltaXQgJiYgbGltaXQgPiAwKSB7XG4gICAgICBxdWVyeU9iamVjdC5saW1pdCA9IGxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnVuc3BlbnRzUGFnZWQocXVlcnlPYmplY3QpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gVGhlIEFQSSBoYXMgaXRzIG93biBsaW1pdCBoYW5kbGluZy4gRm9yIGV4YW1wbGUsIHRoZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBsaW1pdHMgYmlnZ2VyIHRoYW4gNTAwLiBJZiB0aGUgbGltaXRcbiAgICAgIC8vIHNwZWNpZmllZCBoZXJlIGlzIGJpZ2dlciB0aGFuIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBkbyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIG5lY2Vzc2FyeSBsaW1pdCBhZGp1c3RtZW50LlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudW5zcGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHJlc3VsdC51bnNwZW50c1tpXTtcbiAgICAgICAgYWxsVW5zcGVudHMucHVzaCh1bnNwZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gT3VyIGxpbWl0IGFkanVzdG1lbnQgbWFrZXMgc3VyZSB0aGF0IHdlIG5ldmVyIGZldGNoIG1vcmUgdW5zcGVudHMgdGhhbiB3ZSBuZWVkLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGl0IHRoZVxuICAgICAgLy8gbGltaXQsIHdlIGhpdCBpdCBwcmVjaXNlbHlcbiAgICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gcGFyYW1zLmxpbWl0KSB7XG4gICAgICAgIHJldHVybiBhbGxVbnNwZW50czsgLy8gd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gYW55IGZ1cnRoZXIgdW5zcGVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG90YWxVbnNwZW50Q291bnQgPSByZXN1bHQudG90YWw7XG4gICAgICAvLyBpZiBubyB0YXJnZXQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgU0RLIGluZGljYXRlcyB0aGF0IHRoZXJlIGhhcyBiZWVuIGEgbGltaXQsIHdlIG5lZWQgdG8gZmV0Y2ggYW5vdGhlciBiYXRjaFxuICAgICAgaWYgKCFwYXJhbXMudGFyZ2V0ICYmIHRvdGFsVW5zcGVudENvdW50ICYmIHRvdGFsVW5zcGVudENvdW50ID4gYWxsVW5zcGVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIG5leHQgYmF0Y2hcbiAgICAgICAgLy8gbGV0J3MganVzdCBvZmZzZXQgdGhlIGN1cnJlbnQgc2tpcCBieSB0aGUgY291bnRcbiAgICAgICAgY29uc3QgbmV3U2tpcCA9IHNraXAgKyByZXN1bHQuY291bnQ7XG4gICAgICAgIGxldCBuZXdMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobGltaXQgPiAwKSB7XG4gICAgICAgICAgLy8gd2Ugc2V0IHRoZSBuZXcgbGltaXQgdG8gYmUgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgbWlzc2luZyB1bnNwZW50cyB0byBoaXQgb3VyIG93biBsaW1pdFxuICAgICAgICAgIG5ld0xpbWl0ID0gbGltaXQgLSBhbGxVbnNwZW50cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2gobmV3U2tpcCwgbmV3TGltaXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsVW5zcGVudHM7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2goMCwgcGFyYW1zLmxpbWl0KS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIExpc3QgdGhlIHVuc3BlbnRzIChwYWdlZCkgZm9yIGEgZ2l2ZW4gd2FsbGV0LCByZXR1cm5pbmcgdGhlIHJlc3VsdCBhcyBhbiBvYmplY3Qgb2YgdW5zcGVudHMsIGNvdW50LCBza2lwIGFuZCB0b3RhbFxuICogVGhpcyBtZXRob2QgbWF5IG5vdCByZXR1cm4gYWxsIHRoZSB1bnNwZW50cyBhcyB0aGUgbGlzdCBpcyBwYWdlZCBieSB0aGUgQVBJXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zLmxpbWl0IHRoZSBvcHRpb25hbCBsaW1pdCBvZiB1bnNwZW50cyB0byBjb2xsZWN0IGluIEJUQ1xuICogQHBhcmFtIHBhcmFtcy5za2lwIGluZGV4IGluIGxpc3Qgb2YgdW5zcGVudHMgdG8gc3RhcnQgcGFnaW5nIGZyb21cbiAqIEBwYXJhbSBwYXJhbXMubWluQ29uZmlybXMgb25seSBpbmNsdWRlIHJlc3VsdHMgd2l0aCB0aGlzIG51bWJlciBvZiBjb25maXJtYXRpb25zXG4gKiBAcGFyYW0gcGFyYW1zLnRhcmdldCB0aGUgYW1vdW50IG9mIGJ0YyB0byBmaW5kIHRvIHNwZW5kXG4gKiBAcGFyYW0gcGFyYW1zLmluc3RhbnQgb25seSBmaW5kIGluc3RhbnQgdHJhbnNhY3Rpb25zIChtdXN0IHNwZWNpZnkgYSB0YXJnZXQpXG4gKiBAcGFyYW0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIGRlc2lyZWQgbnVtYmVyIG9mIHVuc3BlbnRzIHRvIGhhdmUgaW4gdGhlIHdhbGxldCBhZnRlciB0aGUgdHggZ29lcyB0aHJvdWdoIChyZXF1aXJlcyB0YXJnZXQpXG4gKiBAcGFyYW0gcGFyYW1zLm1pblNpemUgbWluaW11bSB1bnNwZW50IHNpemUgaW4gc2F0b3NoaXNcbiAqIEBwYXJhbSBwYXJhbXMuc2Vnd2l0IHJlcXVlc3Qgc2Vnd2l0IHVuc3BlbnRzIChkZWZhdWx0cyB0byB0cnVlIGlmIHVuZGVmaW5lZClcbiAqIEBwYXJhbSBwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQgYWxsb3cgc2Vnd2l0IHVuc3BlbnRzIGZvciBsZWRnZXIgZGV2aWNlcyAoZGVmYXVsdHMgdG8gZmFsc2UgaWYgdW5kZWZpbmVkKVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS51bnNwZW50c1BhZ2VkID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNraXApICYmICFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pbkNvbmZpcm1zKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLm1pbkNvbmZpcm1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5Db25maXJtcyAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkgJiYgIV8uaXNOdW1iZXIocGFyYW1zLnRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFyZ2V0IC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuaW5zdGFudCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnN0YW50IGZsYWcgLSBzaG91bGQgYmUgYm9vbGVhbicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2Vnd2l0IGZsYWcgLSBzaG91bGQgYmUgYm9vbGVhbicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpICYmICFfLmlzSW50ZWdlcihwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcmdldFdhbGxldFVuc3BlbnRzIGZsYWcgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5TaXplKSAmJiAhXy5pc051bWJlcihwYXJhbXMubWluU2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQ6IG1pblNpemUgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuaW5zdGFudCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pbkNvbmZpcm1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignb25seSBvbmUgb2YgaW5zdGFudCBhbmQgbWluQ29uZmlybXMgbWF5IGJlIGRlZmluZWQnKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRXYWxsZXRVbnNwZW50cyBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIHRhcmdldCcpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50OiBhbGxvd0xlZGdlclNlZ3dpdCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICB9XG5cbiAgY29uc3QgcXVlcnlPYmplY3QgPSBfLmNsb25lRGVlcChwYXJhbXMpO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSkge1xuICAgIC8vIHNraXAgYW5kIGxpbWl0IGFyZSB1bmF2YWlsYWJsZSB3aGVuIGEgdGFyZ2V0IGlzIHNwZWNpZmllZFxuICAgIGRlbGV0ZSBxdWVyeU9iamVjdC5za2lwO1xuICAgIGRlbGV0ZSBxdWVyeU9iamVjdC5saW1pdDtcbiAgfVxuXG4gIHF1ZXJ5T2JqZWN0LnNlZ3dpdCA9IHRydWU7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0KSkge1xuICAgIHF1ZXJ5T2JqZWN0LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSkge1xuICAgIHF1ZXJ5T2JqZWN0LmFsbG93TGVkZ2VyU2Vnd2l0ID0gcGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0O1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3Vuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5T2JqZWN0KS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uc1xuLy8gTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuLy8gT3B0aW9ucyBpbmNsdWRlOlxuLy8gICAgIFRPRE86ICBBZGQgaXRlcmF0b3JzIGZvciBzdGFydC9jb3VudC9ldGNcbldhbGxldC5wcm90b3R5cGUudHJhbnNhY3Rpb25zID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdsaW1pdD0nICsgcGFyYW1zLmxpbWl0KTtcbiAgfVxuICBpZiAocGFyYW1zLnNraXApIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5za2lwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdza2lwPScgKyBwYXJhbXMuc2tpcCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5taW5IZWlnaHQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5IZWlnaHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluSGVpZ2h0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbWluSGVpZ2h0PScgKyBwYXJhbXMubWluSGVpZ2h0KTtcbiAgfVxuICBpZiAocGFyYW1zLm1heEhlaWdodCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1heEhlaWdodCkgfHwgcGFyYW1zLm1heEhlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXhIZWlnaHQgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbWF4SGVpZ2h0PScgKyBwYXJhbXMubWF4SGVpZ2h0KTtcbiAgfVxuICBpZiAocGFyYW1zLm1pbkNvbmZpcm1zKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWluQ29uZmlybXMpIHx8IHBhcmFtcy5taW5Db25maXJtcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5Db25maXJtcyBhcmd1bWVudCwgZXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtaW5Db25maXJtcz0nICsgcGFyYW1zLm1pbkNvbmZpcm1zKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmNvbXBhY3QpKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuY29tcGFjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjb21wYWN0IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2NvbXBhY3Q9JyArIHBhcmFtcy5jb21wYWN0KTtcbiAgfVxuICBsZXQgcXVlcnkgPSAnJztcbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSAnPycgKyBhcmdzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgnICsgcXVlcnkpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uXG4vLyBHZXQgYSB0cmFuc2FjdGlvbiBieSBJRCBmb3IgYSBnaXZlbiB3YWxsZXRcbldhbGxldC5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3R4LycgKyBwYXJhbXMuaWQpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHBvbGxGb3JUcmFuc2FjdGlvblxuLy8gUG9sbCBhIHRyYW5zYWN0aW9uIHVudGlsIHN1Y2Nlc3NmdWwgb3IgdGltZXMgb3V0XG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBpZDogdGhlIHR4aWRcbi8vICAgZGVsYXk6IGRlbGF5IGJldHdlZW4gcG9sbHMgaW4gbXMgKGRlZmF1bHQ6IDEwMDApXG4vLyAgIHRpbWVvdXQ6IHRpbWVvdXQgaW4gbXMgKGRlZmF1bHQ6IDEwMDAwKVxuV2FsbGV0LnByb3RvdHlwZS5wb2xsRm9yVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG4gIGlmIChwYXJhbXMuZGVsYXkgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmRlbGF5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkZWxheSBwYXJhbWV0ZXInKTtcbiAgfVxuICBpZiAocGFyYW1zLnRpbWVvdXQgJiYgIV8uaXNOdW1iZXIocGFyYW1zLnRpbWVvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRpbWVvdXQgcGFyYW1ldGVyJyk7XG4gIH1cbiAgcGFyYW1zLmRlbGF5ID0gcGFyYW1zLmRlbGF5IHx8IDEwMDA7XG4gIHBhcmFtcy50aW1lb3V0ID0gcGFyYW1zLnRpbWVvdXQgfHwgMTAwMDA7XG5cbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuXG4gIGNvbnN0IGRvTmV4dFBvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHNlbGZcbiAgICAgIC5nZXRUcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCB8fCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHN0YXJ0LnZhbHVlT2YoKSA+IHBhcmFtcy50aW1lb3V0KSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBwYXJhbXMuZGVsYXkpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZG9OZXh0UG9sbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBkb05leHRQb2xsKCk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWRcbi8vIEdldCBhIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkIGZvciBhIGdpdmVuIHdhbGxldFxuV2FsbGV0LnByb3RvdHlwZS5nZXRXYWxsZXRUcmFuc2FjdGlvbkJ5U2VxdWVuY2VJZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eC9zZXF1ZW5jZS8nICsgcGFyYW1zLnNlcXVlbmNlSWQpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIEtleSBjaGFpbnNcbi8vIEdldHMgdGhlIHVzZXIga2V5IGNoYWluIGZvciB0aGlzIHdhbGxldFxuLy8gVGhlIHVzZXIga2V5IGNoYWluIGlzIHR5cGljYWxseSB0aGUgZmlyc3Qga2V5Y2hhaW4gb2YgdGhlIHdhbGxldCBhbmQgaGFzIHRoZSBlbmNyeXB0ZWQgeHByaXYgc3RvcmVkIG9uIEJpdEdvLlxuLy8gVXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdXNlcnMnIGtleWNoYWluIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgZGVjcnlwdGluZyB0byBzaWduIGEgdHJhbnNhY3Rpb24uXG5XYWxsZXQucHJvdG90eXBlLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB0cnlLZXlDaGFpbihpbmRleCkge1xuICAgICAgaWYgKCFzZWxmLmtleWNoYWlucyB8fCBpbmRleCA+PSBzZWxmLmtleWNoYWlucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdub19lbmNyeXB0ZWRfa2V5Y2hhaW5fb25fd2FsbGV0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgeHB1Yjogc2VsZi5rZXljaGFpbnNbaW5kZXhdLnhwdWIgfTtcblxuICAgICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCBzZWxmLmJpdGdvLmtleWNoYWlucygpLmdldChwYXJhbXMpO1xuICAgICAgLy8gSWYgd2UgZmluZCB0aGUgeHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoID0gc2VsZi5rZXljaGFpbnNbaW5kZXhdLnBhdGg7XG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oMCk7XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlVHJhbnNhY3Rpb25cbi8vIENyZWF0ZSBhIHRyYW5zYWN0aW9uICh1bnNpZ25lZCkuIFRvIHNpZ24gaXQsIGRvIHNpZ25UcmFuc2FjdGlvblxuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIG9iamVjdCBvZiByZWNpcGllbnQgYWRkcmVzc2VzIGFuZCB0aGUgYW1vdW50IHRvIHNlbmQgdG8gZWFjaCBlLmcuIHthZGRyZXNzOjE1MDAsIGFkZHJlc3MyOjE1MDB9XG4vLyAgIGZlZSAgICAgIC0gdGhlIGJsb2NrY2hhaW4gZmVlIHRvIHNlbmQgKG9wdGlvbmFsKVxuLy8gICBmZWVSYXRlICAtIHRoZSBmZWUgcGVyIGtiIHRvIHNlbmQgKG9wdGlvbmFsKVxuLy8gICBtaW5Db25maXJtcyAtIG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1zIHRvIHVzZSB3aGVuIGdhdGhlcmluZyB1bnNwZW50c1xuLy8gICBmb3JjZUNoYW5nZUF0RW5kIC0gZm9yY2UgY2hhbmdlIGFkZHJlc3MgdG8gYmUgbGFzdCBvdXRwdXQgKG9wdGlvbmFsKVxuLy8gICBub1NwbGl0Q2hhbmdlIC0gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4vLyAgIGNoYW5nZUFkZHJlc3MgLSBvdmVycmlkZSB0aGUgY2hhbmdlIGFkZHJlc3MgKG9wdGlvbmFsKVxuLy8gICB2YWxpZGF0ZSAtIGV4dHJhIHZlcmlmaWNhdGlvbiBvZiBjaGFuZ2UgYWRkcmVzc2VzICh3aGljaCBhcmUgYWx3YXlzIHZlcmlmaWVkIHNlcnZlci1zaWRlKSAoZGVmYXVsdHMgdG8gZ2xvYmFsIGNvbmZpZylcbi8vIFJldHVybnM6XG4vLyAgIGNhbGxiYWNrKGVyciwgeyB0cmFuc2FjdGlvbkhleDogc3RyaW5nLCB1bnNwZW50czogW2lucHV0c10sIGZlZTogc2F0b3NoaXMgfSlcbldhbGxldC5wcm90b3R5cGUuY3JlYXRlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKFxuICAgICghXy5pc051bWJlcihwYXJhbXMuZmVlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlKSkgfHxcbiAgICAoIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSkgfHxcbiAgICAoIV8uaXNOdW1iZXIocGFyYW1zLm1pbkNvbmZpcm1zKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kKSkgfHxcbiAgICAoIV8uaXNTdHJpbmcocGFyYW1zLmNoYW5nZUFkZHJlc3MpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSkgfHxcbiAgICAoIV8uaXNCb29sZWFuKHBhcmFtcy52YWxpZGF0ZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLnZhbGlkYXRlKSkgfHxcbiAgICAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuaW5zdGFudCkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgb2JqZWN0Jyk7XG4gIH1cblxuICBwYXJhbXMudmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy52YWxpZGF0ZSA6IHRoaXMuYml0Z28uZ2V0VmFsaWRhdGUoKTtcbiAgcGFyYW1zLndhbGxldCA9IHRoaXM7XG5cbiAgLy8gQXBwbHkgUFNCVCByb2xsb3V0IGxvZ2ljIChyZXNwZWN0cyBleHBsaWNpdCB1c2VQc2J0IGlmIHNldClcbiAgY29uc3Qgd2FudHNQc2J0ID0gc2hvdWxkVXNlUHNidCh0aGlzLmJpdGdvLCBwYXJhbXMudXNlUHNidCk7XG5cbiAgaWYgKHdhbnRzUHNidCkge1xuICAgIC8vIFRyeSBQU0JUIGZpcnN0LCBmYWxsIGJhY2sgdG8gbGVnYWN5IG9uIGZhaWx1cmVcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB1c2VQc2J0OiB0cnVlIH0pXG4gICAgICAudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgcmVzdWx0LnBzYnRBdHRlbXB0ID0geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChwc2J0RXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIC8vIFBTQlQgZmFpbGVkIC0gZmFsbCBiYWNrIHRvIGxlZ2FjeSBhbmQgY2FwdHVyZSBlcnJvciBmb3IgYmFja2VuZCByZXBvcnRpbmdcbiAgICAgICAgY29uc29sZS53YXJuKCdQU0JUIHRyYW5zYWN0aW9uIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGxlZ2FjeScpO1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB1c2VQc2J0OiBmYWxzZSB9KS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIHJlc3VsdC5wc2J0QXR0ZW1wdCA9IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgc3RhY2s6IHBzYnRFcnJvci5zdGFjaz8uc3BsaXQoJ1xcbicpLnNsaWNlKDAsIDUpLmpvaW4oJ1xcbicpLCAvLyBGaXJzdCA1IGxpbmVzIG9ubHlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBwYXRoXG4gIHBhcmFtcy51c2VQc2J0ID0gZmFsc2U7XG4gIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2lnblRyYW5zYWN0aW9uXG4vLyBTaWduIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYW5zYWN0aW9uIHdpdGggYSBrZXljaGFpblxuLy8gUGFyYW1ldGVyczpcbi8vIHRyYW5zYWN0aW9uSGV4IC0gc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbi8vIHVuc3BlbnRzIC0gYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoXG4vLyAgICAgICAgICAgIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZSBpbmRleCBhcyB0aGUgaW5wdXRzIGluIHRoZVxuLy8gICAgICAgICAgICB0cmFuc2FjdGlvbkhleFxuLy8ga2V5Y2hhaW4gLSBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC5cbi8vIHNpZ25pbmdLZXkgLSBGb3IgbGVnYWN5IHNhZmUgd2FsbGV0cywgdGhlIHByaXZhdGUga2V5IHN0cmluZy5cbi8vIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB0cmFuc2FjdGlvbilcbldhbGxldC5wcm90b3R5cGUuc2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG5cbiAgLy8gUm91dGUgdG8gUFNCVCBzaWduaW5nIGlmIHBhcmFtcy5wc2J0IGV4aXN0cyBPUiBpZiB0cmFuc2FjdGlvbkhleCBjb250YWlucyBhIFBTQlRcbiAgLy8gVXNlIHV0eG9saWIuYml0Z28uaXNQc2J0KCkgdG8gYXV0by1kZXRlY3QgUFNCVCBmb3JtYXQgaW4gdHJhbnNhY3Rpb25IZXhcbiAgaWYgKHBhcmFtcy5wc2J0IHx8IChwYXJhbXMudHJhbnNhY3Rpb25IZXggJiYgdXR4b2xpYi5iaXRnby5pc1BzYnQocGFyYW1zLnRyYW5zYWN0aW9uSGV4KSkpIHtcbiAgICBjb25zdCBwc2J0SGV4ID0gcGFyYW1zLnBzYnQgfHwgcGFyYW1zLnRyYW5zYWN0aW9uSGV4O1xuICAgIHJldHVybiB0cnlQcm9taXNlKCgpID0+IHNpZ25Qc2J0UmVxdWVzdCh7IHBzYnQ6IHBzYnRIZXgsIGtleWNoYWluOiBwYXJhbXMua2V5Y2hhaW4gfSkpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB7IHR4OiByZXN1bHQucHNidCB9O1xuICAgICAgfSlcbiAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHJhbnNhY3Rpb25IZXgnXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSB1bnNwZW50cyBhcnJheScpO1xuICB9XG5cbiAgaWYgKCghXy5pc09iamVjdChwYXJhbXMua2V5Y2hhaW4pIHx8ICFwYXJhbXMua2V5Y2hhaW4ueHBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnNpZ25pbmdLZXkpKSB7XG4gICAgLy8gYWxsb3cgcGFzc2luZyBpbiBhIFdJRiBwcml2YXRlIGtleSBmb3IgbGVnYWN5IHNhZmUgd2FsbGV0IHN1cHBvcnRcbiAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3Rpbmcga2V5Y2hhaW4gb2JqZWN0IHdpdGggeHBydiBvciBzaWduaW5nS2V5IFdJRicpO1xuICAgIGVycm9yLmNvZGUgPSAnbWlzc2luZ19rZXljaGFpbl9vcl9zaWduaW5nS2V5JztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHBhcmFtcy52YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuICBwYXJhbXMuYml0Z28gPSB0aGlzLmJpdGdvO1xuICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLnNpZ25UcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHg6IHJlc3VsdC50cmFuc2FjdGlvbkhleCxcbiAgICAgIH07XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRcbi8vIFNlbmQgYSB0cmFuc2FjdGlvbiB0byB0aGUgQml0Y29pbiBuZXR3b3JrIHZpYSBCaXRHby5cbi8vIE9uZSBvZiB0aGUga2V5cyBpcyB0eXBpY2FsbHkgc2lnbmVkLCBhbmQgQml0R28gd2lsbCBzaWduIHRoZSBvdGhlciAoaWYgYXBwcm92ZWQpIGFuZCByZWxheSBpdCB0byB0aGUgUDJQIG5ldHdvcmsuXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICB0eCAgLSB0aGUgaGV4IGVuY29kZWQsIHNpZ25lZCB0cmFuc2FjdGlvbiB0byBzZW5kXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4J10sIFsnbWVzc2FnZScsICdvdHAnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcvdHgvc2VuZCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHtcbiAgICAgIGlmIChib2R5LnBlbmRpbmdBcHByb3ZhbCkge1xuICAgICAgICByZXR1cm4gXy5leHRlbmQoYm9keSwgeyBzdGF0dXM6ICdwZW5kaW5nQXBwcm92YWwnIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm9keS5vdHApIHtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKGJvZHksIHsgc3RhdHVzOiAnb3RwJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnYWNjZXB0ZWQnLFxuICAgICAgICB0eDogYm9keS50cmFuc2FjdGlvbixcbiAgICAgICAgaGFzaDogYm9keS50cmFuc2FjdGlvbkhhc2gsXG4gICAgICAgIGluc3RhbnQ6IGJvZHkuaW5zdGFudCxcbiAgICAgICAgaW5zdGFudElkOiBib2R5Lmluc3RhbnRJZCxcbiAgICAgIH07XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTaGFyZSB0aGUgd2FsbGV0IHdpdGggYW4gZXhpc3RpbmcgQml0R28gdXNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIFRoZSByZWNpcGllbnQncyB1c2VyIGlkLCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHVzZXIgcmVjb3JkIGluIG91ciBkYXRhYmFzZS5cbiAqIEBwYXJhbSB7a2V5Y2hhaW59IGtleWNoYWluIFRoZSBrZXljaGFpbiB0byBiZSBzaGFyZWQgd2l0aCB0aGUgcmVjaXBpZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb25zIEEgY29tbWEtc2VwYXJhdGVkIHZhbHVlIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgcmVjaXBpZW50J3MgcGVybWlzc2lvbnMgaWYgdGhlIHNoYXJlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhpcyBzaGFyZS5cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVTaGFyZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJywgJ3Blcm1pc3Npb25zJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICBpZiAoXG4gICAgICAhcGFyYW1zLmtleWNoYWluLnhwdWIgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnRvUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMga2V5Y2hhaW4gcGFyYW1ldGVycyAtIHhwdWIsIGVuY3J5cHRlZFhwcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVJbnZpdGVcbi8vIGludml0ZSBhIG5vbiBCaXRHbyBjdXN0b21lciB0byBqb2luIGEgd2FsbGV0XG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBlbWFpbCAtIHRoZSByZWNpcGllbnQncyBlbWFpbCBhZGRyZXNzXG4vLyAgIHBlcm1pc3Npb25zIC0gdGhlIHJlY2lwaWVudCdzIHBlcm1pc3Npb25zIGlmIHRoZSBzaGFyZSBpcyBhY2NlcHRlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUludml0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICB0b0VtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgfTtcblxuICBpZiAocGFyYW1zLm1lc3NhZ2UpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvaW52aXRlJykpLnNlbmQob3B0aW9ucykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjb25maXJtSW52aXRlQW5kU2hhcmVXYWxsZXRcbi8vIGNvbmZpcm0gbXkgaW52aXRlIG9uIHRoaXMgd2FsbGV0IHRvIGEgcmVjaXBpZW50IHdobyBoYXNcbi8vIHN1YnNlcXVlbnRseSBzaWduZWQgdXAgYnkgY3JlYXRpbmcgdGhlIGFjdHVhbCB3YWxsZXQgc2hhcmVcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHdhbGxldEludml0ZUlkIC0gdGhlIHdhbGxldCBpbnZpdGUgaWRcbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHJlcXVpcmVkIGlmIHRoZSB3YWxsZXQgc2hhcmUgc3VjY2VzcyBpcyBleHBlY3RlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNvbmZpcm1JbnZpdGVBbmRTaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRJbnZpdGVJZCddLCBbJ3dhbGxldFBhc3NwaHJhc2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC53YWxsZXRzKClcbiAgICAubGlzdEludml0ZXMoKVxuICAgIC50aGVuKGZ1bmN0aW9uIChpbnZpdGVzKSB7XG4gICAgICBjb25zdCBvdXRnb2luZyA9IGludml0ZXMub3V0Z29pbmc7XG4gICAgICBjb25zdCBpbnZpdGUgPSBfLmZpbmQob3V0Z29pbmcsIGZ1bmN0aW9uIChvdXQpIHtcbiAgICAgICAgcmV0dXJuIG91dC5pZCA9PT0gcGFyYW1zLndhbGxldEludml0ZUlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoIWludml0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBpbnZpdGUgbm90IGZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVtYWlsOiBpbnZpdGUudG9FbWFpbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IGludml0ZS5wZXJtaXNzaW9ucyxcbiAgICAgICAgbWVzc2FnZTogaW52aXRlLm1lc3NhZ2UsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNlbGYuc2hhcmVXYWxsZXQob3B0aW9ucyk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0aW52aXRlLycgKyBwYXJhbXMud2FsbGV0SW52aXRlSWQpKTtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2VuZENvaW5zXG4vLyBTZW5kIGNvaW5zIHRvIGEgZGVzdGluYXRpb24gYWRkcmVzcyBmcm9tIHRoaXMgd2FsbGV0IHVzaW5nIHRoZSB1c2VyIGtleS5cbi8vIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJpdlxuLy8gMi4gRGVjcnlwdHMgdXNlciBrZXlcbi8vIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbi8vIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4vLyAzLiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBhZGRyZXNzIC0gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Ncbi8vICAgYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcyB0byBiZSBzZW50XG4vLyAgIG1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kQ29pbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBwYXJhbXMucmVjaXBpZW50cyA9IHt9O1xuICBwYXJhbXMucmVjaXBpZW50c1twYXJhbXMuYWRkcmVzc10gPSBwYXJhbXMuYW1vdW50O1xuXG4gIHJldHVybiB0aGlzLnNlbmRNYW55KHBhcmFtcykudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRNYW55XG4vLyBTZW5kIGNvaW5zIHRvIG11bHRpcGxlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBmcm9tIHRoaXMgd2FsbGV0IHVzaW5nIHRoZSB1c2VyIGtleS5cbi8vIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJpdlxuLy8gMi4gRGVjcnlwdHMgdXNlciBrZXlcbi8vIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbi8vIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4vLyAzLiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gYXJyYXkgb2YgeyBhZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyLCB0cmF2ZWxJbmZvOiBvYmplY3QgfSB0byBzZW5kIHRvXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIHhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRNYW55ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydtZXNzYWdlJywgJ290cCddLCBjYWxsYmFjayk7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlUmF0ZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGluc3RhbnQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gIH1cblxuICBsZXQgYml0Z29GZWU7XG4gIGxldCB0cmF2ZWxJbmZvcztcbiAgbGV0IGZpbmFsUmVzdWx0O1xuICBsZXQgdW5zcGVudHNVc2VkO1xuXG4gIGNvbnN0IGFjY2VwdGVkQnVpbGRQYXJhbXMgPSBbXG4gICAgJ251bUJsb2NrcycsXG4gICAgJ2ZlZVJhdGUnLFxuICAgICdtaW5Db25maXJtcycsXG4gICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgJ3RhcmdldFdhbGxldFVuc3BlbnRzJyxcbiAgICAnbWVzc2FnZScsXG4gICAgJ21pblZhbHVlJyxcbiAgICAnbWF4VmFsdWUnLFxuICAgICdub1NwbGl0Q2hhbmdlJyxcbiAgICAnY29tbWVudCcsXG4gIF07XG4gIGNvbnN0IHByZXNlcnZlZEJ1aWxkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgYWNjZXB0ZWRCdWlsZFBhcmFtcyk7XG5cbiAgLy8gR2V0IHRoZSB1c2VyIGtleWNoYWluXG4gIGNvbnN0IHJldFByb21pc2UgPSB0aGlzLmNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHRyYW5zYWN0aW9uKSB7XG4gICAgICAvLyBTZW5kIHRoZSB0cmFuc2FjdGlvblxuICAgICAgYml0Z29GZWUgPSB0cmFuc2FjdGlvbi5iaXRnb0ZlZTtcbiAgICAgIHRyYXZlbEluZm9zID0gdHJhbnNhY3Rpb24udHJhdmVsSW5mb3M7XG4gICAgICB1bnNwZW50c1VzZWQgPSB0cmFuc2FjdGlvbi51bnNwZW50cztcbiAgICAgIHJldHVybiBzZWxmLnNlbmRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4OiB0cmFuc2FjdGlvbi50eCxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgICAgb3RwOiBwYXJhbXMub3RwLFxuICAgICAgICAvLyBUaGUgYmVsb3cgcGFyYW1zIGFyZSBmb3IgbG9nZ2luZyBvbmx5LCBhbmQgZG8gbm90IGltcGFjdCB0aGUgQVBJIGNhbGxcbiAgICAgICAgZXN0aW1hdGVkU2l6ZTogdHJhbnNhY3Rpb24uZXN0aW1hdGVkU2l6ZSxcbiAgICAgICAgYnVpbGRQYXJhbXM6IHByZXNlcnZlZEJ1aWxkUGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBjb25zdCB0eCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHJlc3VsdC50eCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICAgIGNvbnN0IGlucHV0c1N1bSA9IF8uc3VtQnkodW5zcGVudHNVc2VkLCAndmFsdWUnKTtcbiAgICAgIGNvbnN0IG91dHB1dHNTdW0gPSBfLnN1bUJ5KHR4Lm91dHMsICd2YWx1ZScpO1xuICAgICAgY29uc3QgZmVlVXNlZCA9IGlucHV0c1N1bSAtIG91dHB1dHNTdW07XG4gICAgICBpZiAoaXNOYU4oZmVlVXNlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZlZVVzZWQnKTtcbiAgICAgIH1cbiAgICAgIChyZXN1bHQuZmVlID0gZmVlVXNlZCksIChyZXN1bHQuZmVlUmF0ZSA9IChmZWVVc2VkICogMTAwMCkgLyB0eC52aXJ0dWFsU2l6ZSgpKTtcbiAgICAgIHJlc3VsdC50cmF2ZWxJbmZvcyA9IHRyYXZlbEluZm9zO1xuICAgICAgaWYgKGJpdGdvRmVlKSB7XG4gICAgICAgIHJlc3VsdC5iaXRnb0ZlZSA9IGJpdGdvRmVlO1xuICAgICAgfVxuICAgICAgZmluYWxSZXN1bHQgPSByZXN1bHQ7XG5cbiAgICAgIC8vIEhhbmRsZSBzZW5kaW5nIHRyYXZlbCBpbmZvcyBpZiB0aGV5IGV4aXN0LCBidXQgbWFrZSBzdXJlIHdlIG5ldmVyIGZhaWwgaGVyZS5cbiAgICAgIC8vIEVycm9yIG9yIHJlc3VsdCAod2l0aCBwb3NzaWJsZSBzdWItZXJyb3JzKSB3aWxsIGJlIHByb3ZpZGVkIGluIHRyYXZlbFJlc3VsdFxuICAgICAgaWYgKHRyYXZlbEluZm9zICYmIHRyYXZlbEluZm9zLmxlbmd0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBzZWxmXG4gICAgICAgICAgICAucG9sbEZvclRyYW5zYWN0aW9uKHsgaWQ6IHJlc3VsdC5oYXNoIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmLmJpdGdvLnRyYXZlbFJ1bGUoKS5zZW5kTWFueShyZXN1bHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0gcmVzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIGNhdGNoIGFzeW5jIGVycm9yc1xuICAgICAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSB7IGVycm9yOiBlcnIubWVzc2FnZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGNhdGNoIHN5bmNocm9ub3VzIGVycm9yc1xuICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHsgZXJyb3I6IGVyci5tZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmaW5hbFJlc3VsdDtcbiAgICB9KTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXRQcm9taXNlKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEFjY2VsZXJhdGUgYSBzdHVjayB0cmFuc2FjdGlvbiB1c2luZyBDaGlsZC1QYXlzLUZvci1QYXJlbnQgKENQRlApLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc3R1Y2sgdHJhbnNhY3Rpb25zIHdoaWNoIGhhdmUgbm8gdW5jb25maXJtZWQgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBJbnB1dCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRyYW5zYWN0aW9uSUQgLSBJRCBvZiB0cmFuc2FjdGlvbiB0byBhY2NlbGVyYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBOZXcgZWZmZWN0aXZlIGZlZSByYXRlIGZvciBzdHVjayB0cmFuc2FjdGlvbiAoc2F0IHBlciAxMDAwIGJ5dGVzKVxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgLSBNYXhpbXVtIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlIGZyb20gdGhlIHdhbGxldCB0byBjb3ZlciBhbnkgY2hpbGQgZmVlcyB0aGF0IHRoZSBwYXJlbnQgdW5zcGVudCBvdXRwdXQgY2Fubm90IGNvdmVyLiBEZWZhdWx0cyB0byAxMDAuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB3YWxsZXQgcHJpdmF0ZSBrZXkuIE9uZSBvZiBlaXRoZXIgd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGlzIHJlcXVpcmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gVGhlIHByaXZhdGUga2V5IGZvciB0aGUgd2FsbGV0LiBPbmUgb2YgZWl0aGVyIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBpcyByZXF1aXJlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyBSZXN1bHQgb2Ygc2VuZFRyYW5zYWN0aW9uKCkgb24gdGhlIGNoaWxkIHRyYW5zYWN0aW9uXG4gKi9cbldhbGxldC5wcm90b3R5cGUuYWNjZWxlcmF0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXN0aW1hdGUgYSB0cmFuc2FjdGlvbnMgc2l6ZSBpbiB2aXJ0dWFsIGJ5dGVzLlxuICAgKiBBY3R1YWwgdHJhbnNhY3Rpb25zIG1heSBiZSBzbGlnaHRseSBmZXdlciB2aXJ0dWFsIGJ5dGVzLCBkdWUgdG9cbiAgICogdGhlIGZhY3QgdGhhdCB2YWxpZCBFQ1NEQSBzaWduYXR1cmVzIGhhdmUgYSB2YXJpYWJsZSBsZW5ndGhcbiAgICogYmV0d2VlbiA4IGFuZCA3MyB2aXJ0dWFsIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzLnNlZ3dpdCBUaGUgbnVtYmVyIG9mIHNlZ3dpdCBpbnB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBpbnB1dHMuUDJTSCBUaGUgbnVtYmVyIG9mIFAyU0ggaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5wdXRzLlAyUEtIIFRoZSBudW1iZXIgb2YgUDJQS0ggaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgY29uc3QgZXN0aW1hdGVUeFZTaXplID0gKGlucHV0cykgPT4ge1xuICAgIGNvbnN0IHNlZ3dpdCA9IGlucHV0cy5zZWd3aXQgfHwgMDtcbiAgICBjb25zdCBQMlNIID0gaW5wdXRzLlAyU0ggfHwgMDtcbiAgICBjb25zdCBQMlBLSCA9IGlucHV0cy5QMlBLSCB8fCAwO1xuXG4gICAgY29uc3QgY2hpbGRGZWVJbmZvID0gVHJhbnNhY3Rpb25CdWlsZGVyLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyh7XG4gICAgICBuUDJzaElucHV0czogUDJTSCxcbiAgICAgIG5QMnBraElucHV0czogUDJQS0gsXG4gICAgICBuUDJzaFAyd3NoSW5wdXRzOiBzZWd3aXQsXG4gICAgICBuT3V0cHV0czogMSxcbiAgICAgIGZlZVJhdGU6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2hpbGRGZWVJbmZvLnNpemU7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoYXQgc2hvdWxkIGJlIHBhaWQgaW4gZmVlcyBieSB0aGUgY2hpbGQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBJbnB1dHMgdG8gdGhlIGNoaWxkIHRyYW5zYWN0aW9uIHdoaWNoIGFyZSBwYXNzZWQgdG8gZXN0aW1hdGVUeFZTaXplXG4gICAqIEBwYXJhbSBwYXJlbnRGZWUgVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgcGFyZW50IHR4IG9yaWdpbmFsbHkgcGFpZCBpbiBmZWVzXG4gICAqIEBwYXJhbSBwYXJlbnRWU2l6ZSBUaGUgbnVtYmVyIG9mIHZpcnR1YWwgYnl0ZXMgaW4gdGhlIHBhcmVudCB0eFxuICAgKiBAcGFyYW0gZmVlUmF0ZSBUaGUgbmV3IGZlZSByYXRlIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5IHRoZSBjb21iaW5lZCBDUEZQIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIGNoaWxkIHR4IHNob3VsZCBwYXkgaW4gZmVlc1xuICAgKi9cbiAgY29uc3QgZXN0aW1hdGVDaGlsZEZlZSA9ICh7IGlucHV0cywgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgZmVlUmF0ZSB9KSA9PiB7XG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIG1vcmUgd2UgKnNob3VsZCogaGF2ZSBwYWlkIGluIHBhcmVudCBmZWVzLFxuICAgIC8vIGhhZCB0aGUgcGFyZW50IGJlZW4gb3JpZ2luYWxseSBzZW50IHdpdGggdGhlIG5ldyBmZWUgcmF0ZVxuICAgIGNvbnN0IGFkZGl0aW9uYWxQYXJlbnRGZWUgPSBfLmNlaWwoKHBhcmVudFZTaXplICogZmVlUmF0ZSkgLyAxMDAwKSAtIHBhcmVudEZlZTtcblxuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCB3ZSB3b3VsZCBwYXkgaW4gZmVlcyBmb3IgdGhlIGNoaWxkLFxuICAgIC8vIGlmIGl0IHdlcmUgb25seSBwYXlpbmcgZm9yIGl0c2VsZiBhdCB0aGUgbmV3IGZlZSByYXRlXG4gICAgY29uc3QgY2hpbGRGZWUgPSAoZXN0aW1hdGVUeFZTaXplKGlucHV0cykgKiBmZWVSYXRlKSAvIDEwMDA7XG5cbiAgICByZXR1cm4gXy5jZWlsKGNoaWxkRmVlICsgYWRkaXRpb25hbFBhcmVudEZlZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlIHRvIHBheSB0aGUgY2hpbGQgdHggZmVlcy5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdGhlIHBhcmVudCB0eCBvdXRwdXQgaXMgbm90IHN1ZmZpY2llbnQgdG9cbiAgICogY292ZXIgdGhlIHRvdGFsIGZlZXMgd2hpY2ggc2hvdWxkIGJlIHBhaWQgYnkgdGhlIGNoaWxkIHR4LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIElucHV0cyB0byB0aGUgY2hpbGQgdHJhbnNhY3Rpb24gd2hpY2ggYXJlIHBhc3NlZCB0byBlc3RpbWF0ZVR4VlNpemVcbiAgICogQHBhcmFtIHBhcmVudE91dHB1dFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IGZyb20gdGhlIHBhcmVudCB0eCB3aGljaCB3ZSBhcmUgdXNpbmcgYXMgYW4gaW5wdXQgdG8gdGhlIGNoaWxkIHR4XG4gICAqIEBwYXJhbSBwYXJlbnRGZWUgVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgcGFyZW50IHR4IG9yaWdpbmFsbHkgcGFpZCBpbiBmZWVzXG4gICAqIEBwYXJhbSBwYXJlbnRWU2l6ZSBUaGUgbnVtYmVyIG9mIHZpcnR1YWwgYnl0ZXMgaW4gdGhlIHBhcmVudCB0eFxuICAgKiBAcGFyYW0gbWF4VW5zcGVudHMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZGl0aW9uYWwgdW5zcGVudHMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gY292ZXIgdGhlIHJlbWFpbmluZyBjaGlsZCBmZWVzXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSwgdGhlIHVwZGF0ZWQgbnVtYmVyIG9mIHNhdG9zaGlzIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5XG4gICAqICAgICAgICAgIHRoZSBjaGlsZCB0eCwgYW5kIHRoZSB1cGRhdGVkIGlucHV0cyBmb3IgdGhlIGNoaWxkIHR4LlxuICAgKi9cbiAgY29uc3QgZmluZEFkZGl0aW9uYWxVbnNwZW50cyA9ICh7IGlucHV0cywgcGFyZW50T3V0cHV0VmFsdWUsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIG1heFVuc3BlbnRzIH0pID0+IHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY29GaW5kQWRkaXRpb25hbFVuc3BlbnRzKCkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAvLyBhc2sgdGhlIHNlcnZlciBmb3IgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWUsIGFzc3VtaW5nXG4gICAgICAvLyB0aGF0IGl0IGNhbiBiZSBkb25lIHdpdGhvdXQgYWRkaXRpb25hbCB1bnNwZW50cyAod2hpY2ggaXMgbm90IHBvc3NpYmxlLFxuICAgICAgLy8gc2luY2UgaWYgdGhhdCB3ZXJlIHRoZSBjYXNlLCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzIHdvdWxkIG5vdCBoYXZlIGJlZW5cbiAgICAgIC8vIGNhbGxlZCBpbiB0aGUgZmlyc3QgcGxhY2UuIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgYmVmb3JlIHJldHVybmluZylcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgbGV0IHVuY292ZXJlZENoaWxkRmVlID0gY3VycmVudENoaWxkRmVlRXN0aW1hdGUgLSBwYXJlbnRPdXRwdXRWYWx1ZTtcblxuICAgICAgd2hpbGUgKHVuY292ZXJlZENoaWxkRmVlID4gMCAmJiBhZGRpdGlvbmFsVW5zcGVudHMubGVuZ3RoIDwgbWF4VW5zcGVudHMpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGdldCBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkIGZlZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9IChhd2FpdCB0aGlzLnVuc3BlbnRzKHtcbiAgICAgICAgICBtaW5Db25maXJtczogMSxcbiAgICAgICAgICB0YXJnZXQ6IHVuY292ZXJlZENoaWxkRmVlLFxuICAgICAgICAgIGxpbWl0OiBtYXhVbnNwZW50cyAtIGFkZGl0aW9uYWxVbnNwZW50cy5sZW5ndGgsXG4gICAgICAgIH0pKSBhcyBhbnk7XG5cbiAgICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgdW5zcGVudHMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFkZGl0aW9uYWxVbnNwZW50VmFsdWUgPSAwO1xuXG4gICAgICAgIC8vIGNvbnN1bWUgYWxsIHVuc3BlbnRzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIsIGV2ZW4gaWYgd2UgZG9uJ3QgbmVlZFxuICAgICAgICAvLyBhbGwgb2YgdGhlbSB0byBjb3ZlciB0aGUgY2hpbGQgZmVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNlcnZlciB3aWxsXG4gICAgICAgIC8vIHJldHVybiBlbm91Z2ggdW5zcGVudCB2YWx1ZSB0byBlbnN1cmUgdGhhdCB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50XG4gICAgICAgIC8vIGlzIGFjaGlldmVkIGZvciB0aGUgY2hpbGQgdHgsIGFuZCB3ZSBjYW4ndCBsZWF2ZSBvdXQgdGhvc2UgdW5zcGVudHNcbiAgICAgICAgLy8gb3IgZWxzZSB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50IGNvbnN0cmFpbnQgY291bGQgYmUgdmlvbGF0ZWRcbiAgICAgICAgXy5mb3JFYWNoKHVuc3BlbnRzLCAodW5zcGVudCkgPT4ge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY2hpbGQgdHggaW5wdXRzXG4gICAgICAgICAgY29uc3QgdW5zcGVudENoYWluID0gZ2V0Q2hhaW4odW5zcGVudCk7XG4gICAgICAgICAgaWYgKGlzQ2hhaW5Db2RlKHVuc3BlbnRDaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnRDaGFpbikgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICAgICAgICBpbnB1dHMuc2Vnd2l0Kys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0cy5QMlNIKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRzLnB1c2godW5zcGVudCk7XG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRWYWx1ZSArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgICB1bmNvdmVyZWRDaGlsZEZlZSA9IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlIC0gcGFyZW50T3V0cHV0VmFsdWUgLSBhZGRpdGlvbmFsVW5zcGVudFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5jb3ZlcmVkQ2hpbGRGZWUgPiAwKSB7XG4gICAgICAgIC8vIFVuYWJsZSB0byBmaW5kIGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgY2hpbGQgZmVlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdWZmaWNpZW50IGNvbmZpcm1lZCB1bnNwZW50cyBhdmFpbGFibGUgdG8gY292ZXIgdGhlIGNoaWxkIGZlZWApO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3VuZCBlbm91Z2ggdW5zcGVudHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZGl0aW9uYWw6IGFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgbmV3Q2hpbGRGZWU6IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlLFxuICAgICAgICBuZXdJbnB1dHM6IGlucHV0cyxcbiAgICAgIH07XG4gICAgfS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGEgZnVsbCBjb3B5IChpbmNsdWRpbmcgd2l0bmVzcyBkYXRhKSBvZiBhbiBhcmJpdHJhcnkgdHggdXNpbmcgb25seSB0aGUgdHggaWQuXG4gICAqXG4gICAqIFdlIGhhdmUgdG8gdXNlIGFuIGV4dGVybmFsIHNlcnZpY2UgZm9yIHRoaXMgKGN1cnJlbnRseSBibG9ja3N0cmVhbS5pbmZvKSwgc2luY2VcbiAgICogdGhlIHYxIGluZGV4ZXIgc2VydmljZSAoYmFzZWQgb24gYml0Y29pbmopIGRvZXMgbm90IGhhdmUgc2Vnd2l0IHN1cHBvcnQgYW5kXG4gICAqIGRvZXMgbm90IHJldHVybiBhbnkgc2Vnd2l0IHJlbGF0ZWQgZmllbGRzIGluIHRoZSB0eCBoZXguXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnRUeElkIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZ2V0IHRoZSBmdWxsIGhleCBvZlxuICAgKiBAcmV0dXJucyB7Qmx1ZWJpcmQ8YW55Pn0gVGhlIGZ1bGwgaGV4IGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRQYXJlbnRUeEhleCh7IHBhcmVudFR4SWQgfTogeyBwYXJlbnRUeElkOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZXhwbG9yZXJCYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tzZWxmLmJpdGdvLmdldEVudigpXS5idGNFeHBsb3JlckJhc2VVcmw7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5nZXQoYCR7ZXhwbG9yZXJCYXNlVXJsfS90eC8ke3BhcmVudFR4SWR9L2hleGApO1xuXG4gICAgaWYgKCFyZXN1bHQudGV4dCB8fCAhLyhbYS1mMC05XXsyfSkrLy50ZXN0KHJlc3VsdC50ZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBzdWNjZXNzZnVsbHkgcmVjZWl2ZSBwYXJlbnQgdHggaGV4LiBSZWNlaXZlZCAnJHtfLnRydW5jYXRlKHJlc3VsdC50ZXh0LCB7IGxlbmd0aDogMTAwIH0pfScgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjaGFpbiBmcm9tIGFuIHVuc3BlbnQgb3IgdHggb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gb3V0cHV0T3JVbnNwZW50IFRoZSBvdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBjaGFpbiBzaG91bGQgYmUgZGV0ZXJtaW5lZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY2hhaW4gZm9yIHRoZSBnaXZlbiBvdXRwdXQgb3IgdW5zcGVudFxuICAgKi9cbiAgY29uc3QgZ2V0Q2hhaW4gPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgaWYgKG91dHB1dE9yVW5zcGVudC5jaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LmNoYWluO1xuICAgIH1cblxuICAgIGlmIChvdXRwdXRPclVuc3BlbnQuY2hhaW5QYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfLnRvTnVtYmVyKG91dHB1dE9yVW5zcGVudC5jaGFpblBhdGguc3BsaXQoJy8nKVsxXSk7XG4gICAgfVxuXG4gICAgLy8gbm8gd2F5IHRvIHRlbGwgdGhlIGNoYWluLCBsZXQncyBqdXN0IGJsb3cgdXAgbm93IGluc3RlYWRcbiAgICAvLyBvZiBibG93aW5nIHVwIGxhdGVyIHdoZW4gdGhlIHVuZGVmaW5lZCByZXR1cm4gdmFsdWUgaXMgdXNlZC5cbiAgICAvLyBOb3RlOiBmb3IgdW5zcGVudHMgdGhlIGZpZWxkIHRvIHVzZSBpcyAnYWRkcmVzcycsIGJ1dCBmb3Igb3V0cHV0c1xuICAgIC8vIHRoZSBmaWVsZCB0byB1c2UgaXMgJ2FjY291bnQnXG4gICAgdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBnZXQgY2hhaW4gZm9yIG91dHB1dCBvbiBhY2NvdW50ICR7b3V0cHV0T3JVbnNwZW50LmFjY291bnQgfHwgb3V0cHV0T3JVbnNwZW50LmFkZHJlc3N9YCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCB2YWx1ZSBjb250cmlidXRpb24gYW4gb3V0cHV0IG9yIHVuc3BlbnQgd2lsbFxuICAgKiBjb250cmlidXRlIHRvIGEgdHJhbnNhY3Rpb24sIHdlcmUgaXQgdG8gYmUgdXNlZC4gRWFjaCB0eXBlIG9mIG91dHB1dCBvciB1bnNwZW50XG4gICAqIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBjb250cmlidXRpb24gc2luY2UgZWFjaCB0eXBlIGhhcyBhIGRpZmZlcmVudCBudW1iZXJcbiAgICogb2YgdmlydHVhbCBieXRlcywgYW5kIHRodXMgd2lsbCBjYXVzZSBhIGRpZmZlcmVudCBmZWUgdG8gYmUgcGFpZC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dE9yVW5zcGVudCBPdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBlZmZlY3RpdmUgdmFsdWUgc2hvdWxkIGJlIGRldGVybWluZWRcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGFjdHVhbCBudW1iZXIgb2Ygc2F0b3NoaXMgdGhhdCB0aGlzIHVuc3BlbnQgb3Igb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgIHdvdWxkIGNvbnRyaWJ1dGUgdG8gYSB0cmFuc2FjdGlvbiwgd2VyZSBpdCB0byBiZSB1c2VkLlxuICAgKi9cbiAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgY29uc3QgY2hhaW4gPSBnZXRDaGFpbihvdXRwdXRPclVuc3BlbnQpO1xuICAgIGlmIChpc0NoYWluQ29kZShjaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSBpcyBpbiBieXRlcywgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRvIGtCXG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LnZhbHVlIC0gKFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gICAgfVxuICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgaXMgaW4gYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrQlxuICAgIHJldHVybiBvdXRwdXRPclVuc3BlbnQudmFsdWUgLSAoVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvcm91dGluZSB3aGljaCBhY3R1YWxseSBpbXBsZW1lbnRzIHRoZSBhY2NlbGVyYXRlVHJhbnNhY3Rpb24gYWxnb3JpdGhtXG4gICAqXG4gICAqIERlc2NyaWJlZCBhdCBhIGhpZ2ggbGV2ZWwsIHRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czpcbiAgICogMSkgRmluZCBhcHByb3ByaWF0ZSBvdXRwdXQgZnJvbSBwYXJlbnQgdHJhbnNhY3Rpb24gdG8gdXNlIGFzIGNoaWxkIHRyYW5zYWN0aW9uIGlucHV0XG4gICAqIDIpIEZpbmQgdW5zcGVudCBjb3JyZXNwb25kaW5nIHRvIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXQuIElmIG5vdCBmb3VuZCwgcmV0dXJuIHRvIHN0ZXAgMS5cbiAgICogMykgRGV0ZXJtaW5lIGlmIHBhcmVudCB0cmFuc2FjdGlvbiB1bnNwZW50IGNhbiBjb3ZlciBlbnRpcmUgY2hpbGQgZmVlLCBwbHVzIG1pbmltdW0gY2hhbmdlXG4gICAqIDQpIElmIHllcywgZ28gdG8gc3RlcCA2XG4gICAqIDUpIE90aGVyd2lzZSwgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIGZyb20gdGhlIHdhbGxldCB0byB1c2UgdG8gY292ZXIgdGhlIHJlbWFpbmluZyBjaGlsZCBmZWVcbiAgICogNikgQ3JlYXRlIGFuZCBzaWduIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiwgdXNpbmcgdGhlIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXRcbiAgICogICAgKGFuZCwgaWYgbmVjZXNzYXJ5LCBhZGRpdGlvbmFsIHdhbGxldCB1bnNwZW50cykgYXMgaW5wdXRzXG4gICAqIDcpIEJyb2FkY2FzdCB0aGUgbmV3IGNoaWxkIHRyYW5zYWN0aW9uXG4gICAqL1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY29BY2NlbGVyYXRlVHJhbnNhY3Rpb24oKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHJhbnNhY3Rpb25JRCddLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgLy8gdmFsaWRhdGUgZmVlIHJhdGVcbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNGaW5pdGUocGFyYW1zLmZlZVJhdGUpIHx8IHBhcmFtcy5mZWVSYXRlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIgZm9yIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG1heFVuc3BlbnRzXG4gICAgaWYgKHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYnkgZGVmYXVsdCwgdXNlIGF0IG1vc3QgMTAwIGFkZGl0aW9uYWwgdW5zcGVudHMgKG5vdCBpbmNsdWRpbmcgdGhlIHVuc3BlbnQgb3V0cHV0IGZyb20gdGhlIHBhcmVudCB0eClcbiAgICAgIHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPSAxMDA7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzKSB8fCBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzIDw9IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdFeHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlciBmb3IgcGFyYW1ldGVyOiBtYXhBZGRpdGlvbmFsVW5zcGVudHMnKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHBhcmVudFR4ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbih7IGlkOiBwYXJhbXMudHJhbnNhY3Rpb25JRCB9KTtcbiAgICBpZiAocGFyZW50VHguY29uZmlybWF0aW9ucyA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gJHtwYXJhbXMudHJhbnNhY3Rpb25JRH0gaXMgYWxyZWFkeSBjb25maXJtZWQgYW5kIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgb3V0cHV0cyBmcm9tIHRoZSBwYXJlbnQgdHggd2hpY2ggYXJlIHRvIG91ciB3YWxsZXRcbiAgICBjb25zdCB3YWxsZXRPdXRwdXRzID0gXy5maWx0ZXIocGFyZW50VHgub3V0cHV0cywgKG91dHB1dCkgPT4gb3V0cHV0LmlzTWluZSk7XG5cbiAgICBpZiAod2FsbGV0T3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9IGNvbnRhaW5zIG5vIG91dHB1dHMgdG8gdGhpcyB3YWxsZXQsIGFuZCB0aHVzIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdXNlIGFuIG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgd2l0aCBsYXJnZXN0IGVmZmVjdGl2ZSB2YWx1ZSxcbiAgICAvLyBidXQgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBvdXRwdXQgaXMgYWN0dWFsbHkgdW5zcGVudC5cbiAgICAvLyBBbiBvdXRwdXQgY291bGQgYmUgc3BlbnQgYWxyZWFkeSBpZiB0aGUgb3V0cHV0IHdhcyB1c2VkIGluIGFcbiAgICAvLyBjaGlsZCB0eCB3aGljaCBpdHNlbGYgaGFzIGJlY29tZSBzdHVjayBkdWUgdG8gbG93IGZlZXMgYW5kIGlzXG4gICAgLy8gYWxzbyB1bmNvbmZpcm1lZC5cbiAgICBjb25zdCBzb3J0ZWRPdXRwdXRzID0gXy5zb3J0Qnkod2FsbGV0T3V0cHV0cywgZWZmZWN0aXZlVmFsdWUpO1xuICAgIGxldCBwYXJlbnRVbnNwZW50VG9Vc2U7XG4gICAgbGV0IG91dHB1dFRvVXNlO1xuXG4gICAgd2hpbGUgKHNvcnRlZE91dHB1dHMubGVuZ3RoID4gMCAmJiBwYXJlbnRVbnNwZW50VG9Vc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0cHV0VG9Vc2UgPSBzb3J0ZWRPdXRwdXRzLnBvcCgpO1xuXG4gICAgICAvLyBmaW5kIHRoZSB1bnNwZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYXJ0aWN1bGFyIG91dHB1dFxuICAgICAgLy8gVE9ETzogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzIHVuc3BlbnQ/XG4gICAgICAvLyBUT0RPOiBUaGUgYmVzdCB3ZSBjYW4gZG8gaGVyZSBpcyBzZXQgbWluU2l6ZSA9IG1heFNpemUgPSBvdXRwdXRUb1VzZS52YWx1ZVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHVuc3BlbnRzUmVzdWx0ID0gYXdhaXQgdGhpcy51bnNwZW50cyh7XG4gICAgICAgIG1pblNpemU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgICBtYXhTaXplOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXJlbnRVbnNwZW50VG9Vc2UgPSBfLmZpbmQodW5zcGVudHNSZXN1bHQsICh1bnNwZW50KSA9PiB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB1bnNwZW50IGJlbG9uZ3MgdG8gdGhlIGdpdmVuIHR4aWRcbiAgICAgICAgaWYgKHVuc3BlbnQudHhfaGFzaCAhPT0gcGFyYW1zLnRyYW5zYWN0aW9uSUQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBzdXJlIHVuc3BlbnQgaGFzIGNvcnJlY3Qgdl9vdXQgaW5kZXhcbiAgICAgICAgcmV0dXJuIHVuc3BlbnQudHhfb3V0cHV0X24gPT09IG91dHB1dFRvVXNlLnZvdXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50VW5zcGVudFRvVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdW5zcGVudCBvdXRwdXQgZnJvbSBwYXJlbnQgdHggdG8gdXNlIGFzIGNoaWxkIGlucHV0YCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBmdWxsIGhleCBmb3IgdGhlIHBhcmVudCB0eCBhbmQgZGVjb2RlIGl0IHRvIGdldCBpdHMgdnNpemVcbiAgICBjb25zdCBwYXJlbnRUeEhleCA9IGF3YWl0IGdldFBhcmVudFR4SGV4KHsgcGFyZW50VHhJZDogcGFyYW1zLnRyYW5zYWN0aW9uSUQgfSk7XG4gICAgY29uc3QgZGVjb2RlZFBhcmVudCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHBhcmVudFR4SGV4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGNvbnN0IHBhcmVudFZTaXplID0gZGVjb2RlZFBhcmVudC52aXJ0dWFsU2l6ZSgpO1xuXG4gICAgLy8gbWFrZSBzdXJlIGlkIGZyb20gZGVjb2RlZCB0eCBhbmQgZ2l2ZW4gdHggaWQgbWF0Y2hcbiAgICAvLyB0aGlzIHNob3VsZCBjYXRjaCBwcm9ibGVtcyBlbWFuYXRpbmcgZnJvbSB0aGUgdXNlIG9mIGFuIGV4dGVybmFsIHNlcnZpY2VcbiAgICAvLyBmb3IgZ2V0dGluZyB0aGUgY29tcGxldGUgcGFyZW50IHR4IGhleFxuICAgIGlmIChkZWNvZGVkUGFyZW50LmdldElkKCkgIT09IHBhcmFtcy50cmFuc2FjdGlvbklEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWNvZGVkIHRyYW5zYWN0aW9uIGlkIGlzICR7ZGVjb2RlZFBhcmVudC5nZXRJZCgpfSwgd2hpY2ggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gdHhpZCAke3BhcmFtcy50cmFuc2FjdGlvbklEfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIG5ldyBmZWUgcmF0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHBhcmVudCdzIGN1cnJlbnQgZmVlIHJhdGVcbiAgICAvLyB2aXJ0dWFsU2l6ZSBpcyByZXR1cm5lZCBpbiB2Ynl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrdkJcbiAgICBjb25zdCBwYXJlbnRSYXRlID0gKDEwMDAgKiBwYXJlbnRUeC5mZWUpIC8gcGFyZW50VlNpemU7XG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlIDw9IHBhcmVudFJhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBsb3dlciBmZWUgcmF0ZSEgKFBhcmVudCB0eCBmZWUgcmF0ZSBpcyAke3BhcmVudFJhdGV9IHNhdC9rQiwgYW5kIHJlcXVlc3RlZCBmZWUgcmF0ZSB3YXMgJHtwYXJhbXMuZmVlUmF0ZX0gc2F0L2tCKWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHBhcmVudCBvdXRwdXQgY2FuIGNvdmVyIGNoaWxkIGZlZVxuICAgIGNvbnN0IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID1cbiAgICAgIGlzQ2hhaW5Db2RlKG91dHB1dFRvVXNlLmNoYWluKSAmJiBzY3JpcHRUeXBlRm9yQ2hhaW4ob3V0cHV0VG9Vc2UuY2hhaW4pID09PSAncDJzaFAyd3NoJztcblxuICAgIGxldCBjaGlsZElucHV0cyA9IHtcbiAgICAgIHNlZ3dpdDogaXNQYXJlbnRPdXRwdXRTZWd3aXQgPyAxIDogMCxcbiAgICAgIFAyU0g6IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID8gMCA6IDEsXG4gICAgfTtcblxuICAgIGxldCBjaGlsZEZlZSA9IGVzdGltYXRlQ2hpbGRGZWUoe1xuICAgICAgaW5wdXRzOiBjaGlsZElucHV0cyxcbiAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUsXG4gICAgICBwYXJlbnRWU2l6ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuc3BlbnRzVG9Vc2UgPSBbcGFyZW50VW5zcGVudFRvVXNlXTtcblxuICAgIC8vIHRyeSB0byBnZXQgdGhlIG1pbiBjaGFuZ2Ugc2l6ZSBmcm9tIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDAuMSBCVENcbiAgICAvLyBUT0RPOiBtaW5DaGFuZ2VTaXplIGlzIG5vdCBjdXJyZW50bHkgYSBjb25zdGFudCBkZWZpbmVkIG9uIHRoZSBjbGllbnQgYW5kIHNob3VsZCBiZSBhZGRlZFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgbWluQ2hhbmdlU2l6ZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluQ2hhbmdlU2l6ZSB8fCAxZTc7XG5cbiAgICBpZiAob3V0cHV0VG9Vc2UudmFsdWUgPCBjaGlsZEZlZSArIG1pbkNoYW5nZVNpemUpIHtcbiAgICAgIC8vIHBhcmVudCBvdXRwdXQgY2Fubm90IGNvdmVyIGNoaWxkIGZlZSBwbHVzIHRoZSBtaW5pbXVtIGNoYW5nZSxcbiAgICAgIC8vIG11c3QgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBkaWZmZXJlbmNlXG4gICAgICBjb25zdCB7IGFkZGl0aW9uYWwsIG5ld0NoaWxkRmVlLCBuZXdJbnB1dHMgfSA9IGF3YWl0IGZpbmRBZGRpdGlvbmFsVW5zcGVudHMoe1xuICAgICAgICBpbnB1dHM6IGNoaWxkSW5wdXRzLFxuICAgICAgICBwYXJlbnRPdXRwdXRWYWx1ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgICBtYXhVbnNwZW50czogcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgcGFyZW50VlNpemUsXG4gICAgICB9KTtcbiAgICAgIGNoaWxkRmVlID0gbmV3Q2hpbGRGZWU7XG4gICAgICBjaGlsZElucHV0cyA9IG5ld0lucHV0cztcbiAgICAgIHVuc3BlbnRzVG9Vc2UucHVzaCguLi5hZGRpdGlvbmFsKTtcbiAgICB9XG5cbiAgICAvLyBzYW5pdHkgY2hlY2sgdGhlIGZlZSByYXRlIHdlJ3JlIHBheWluZyBmb3IgdGhlIGNvbWJpbmVkIHR4XG4gICAgLy8gdG8gbWFrZSBzdXJlIGl0J3MgdW5kZXIgdGhlIG1heCBmZWUgcmF0ZS4gT25seSB0aGUgY2hpbGQgdHhcbiAgICAvLyBjYW4gYnJlYWsgdGhpcyBsaW1pdCwgYnV0IHRoZSBjb21iaW5lZCB0eCBzaGFsbCBub3RcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IG1heEZlZVJhdGUgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLm1heEZlZVJhdGU7XG4gICAgY29uc3QgY2hpbGRWU2l6ZSA9IGVzdGltYXRlVHhWU2l6ZShjaGlsZElucHV0cyk7XG4gICAgY29uc3QgY29tYmluZWRWU2l6ZSA9IGNoaWxkVlNpemUgKyBwYXJlbnRWU2l6ZTtcbiAgICBjb25zdCBjb21iaW5lZEZlZSA9IHBhcmVudFR4LmZlZSArIGNoaWxkRmVlO1xuICAgIC8vIGNvbWJpbmVkIGZlZSByYXRlIG11c3QgYmUgaW4gc2F0L2tCLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnRcbiAgICBjb25zdCBjb21iaW5lZEZlZVJhdGUgPSAoMTAwMCAqIGNvbWJpbmVkRmVlKSAvIGNvbWJpbmVkVlNpemU7XG5cbiAgICBpZiAoY29tYmluZWRGZWVSYXRlID4gbWF4RmVlUmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNhY3Rpb24gY2Fubm90IGJlIGFjY2VsZXJhdGVkLiBDb21iaW5lZCBmZWUgcmF0ZSBvZiAke2NvbWJpbmVkRmVlUmF0ZX0gc2F0L2tCIGV4Y2VlZHMgbWF4aW11bSBmZWUgcmF0ZSBvZiAke21heEZlZVJhdGV9IHNhdC9rQmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgbmV3IGNoYW5nZSBhZGRyZXNzIGFuZCBkZXRlcm1pbmUgY2hhbmdlIGFtb3VudC5cbiAgICAvLyB0aGUgdHggYnVpbGRlciB3aWxsIHJlamVjdCB0cmFuc2FjdGlvbnMgd2hpY2ggaGF2ZSBubyByZWNpcGllbnRzLFxuICAgIC8vIGFuZCBzdWNoIHplcm8tb3V0cHV0IHRyYW5zYWN0aW9ucyBhcmUgZm9yYmlkZGVuIGJ5IHRoZSBCaXRjb2luIHByb3RvY29sLFxuICAgIC8vIHNvIHdlIG5lZWQgYXQgbGVhc3QgYSBzaW5nbGUgcmVjaXBpZW50IGZvciB0aGUgY2hhbmdlIHdoaWNoIHdvbid0IGJlIHBydW5lZC5cbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBfLnN1bUJ5KHVuc3BlbnRzVG9Vc2UsICh1bnNwZW50KSA9PiB1bnNwZW50LnZhbHVlKSAtIGNoaWxkRmVlO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSB0aGlzLmdldENoYW5nZUNoYWluKHt9KTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSBhd2FpdCB0aGlzLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4gfSk7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGNoaWxkIHR4IGFuZCBicm9hZGNhc3RcbiAgICAvLyBVc2UgbGVnYWN5IGZvcm1hdCAtIFBTQlQgcm9sbG91dCBhcHBsaWVzIHRvIHVzZXItZmFjaW5nIGNyZWF0ZVRyYW5zYWN0aW9uIG9ubHlcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdW5zcGVudHM6IHVuc3BlbnRzVG9Vc2UsXG4gICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBjaGFuZ2VBbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZmVlOiBjaGlsZEZlZSxcbiAgICAgIGJpdGdvRmVlOiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgYWRkcmVzczogJycsXG4gICAgICB9LFxuICAgICAgeHBydjogcGFyYW1zLnhwcnYsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHVzZVBzYnQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gY2hpbGQgZmVlIHJhdGUgbXVzdCBiZSBpbiBzYXQva0IsIHNvIHdlIG5lZWQgdG8gY29udmVydFxuICAgIGNvbnN0IGNoaWxkRmVlUmF0ZSA9ICgxMDAwICogY2hpbGRGZWUpIC8gY2hpbGRWU2l6ZTtcbiAgICBpZiAoY2hpbGRGZWVSYXRlID4gbWF4RmVlUmF0ZSkge1xuICAgICAgLy8gY29tYmluZWQgdHggaXMgd2l0aGluIG1heCBmZWUgcmF0ZSBsaW1pdHMsIGJ1dCB0aGUgY2hpbGQgdHggaXMgbm90LlxuICAgICAgLy8gaW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgaWdub3JlTWF4RmVlUmF0ZSBmbGFnIHRvIGdldCB0aGUgY2hpbGQgdHggdG8gYmUgYWNjZXB0ZWRcbiAgICAgIHR4Lmlnbm9yZU1heEZlZVJhdGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKHR4KTtcbiAgfVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVBbmRTaWduVHJhbnNhY3Rpb25cbi8vIElOVEVSTkFMIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgc2lnbiBhIHRyYW5zYWN0aW9uXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIGFycmF5IG9mIHsgYWRkcmVzcywgYW1vdW50IH0gdG8gc2VuZCB0b1xuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZVJhdGUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmR5bmFtaWNGZWVDb25maXJtVGFyZ2V0ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5keW5hbWljRmVlQ29uZmlybVRhcmdldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgY29uZmlybVRhcmdldCAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGluc3RhbnQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiAobGVnYWN5IGZvcm1hdCBieSBkZWZhdWx0LCBQU0JUIHdoZW4gdXNlUHNidDogdHJ1ZSlcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcbiAgICBjb25zdCBmZWUgPSB0cmFuc2FjdGlvbi5mZWU7XG4gICAgY29uc3QgZmVlUmF0ZSA9IHRyYW5zYWN0aW9uLmZlZVJhdGU7XG4gICAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IHRyYW5zYWN0aW9uLmVzdGltYXRlZFNpemU7XG4gICAgY29uc3QgYml0Z29GZWUgPSB0cmFuc2FjdGlvbi5iaXRnb0ZlZTtcbiAgICBjb25zdCB0cmF2ZWxJbmZvcyA9IHRyYW5zYWN0aW9uLnRyYXZlbEluZm9zO1xuICAgIGNvbnN0IHVuc3BlbnRzID0gdHJhbnNhY3Rpb24udW5zcGVudHM7XG5cbiAgICAvLyBTaWduIHRoZSB0cmFuc2FjdGlvblxuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW4ocGFyYW1zKTtcbiAgICAgIHRyYW5zYWN0aW9uLmtleWNoYWluID0ga2V5Y2hhaW47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gJ25vX2VuY3J5cHRlZF9rZXljaGFpbl9vbl93YWxsZXQnKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIG1pZ2h0IGJlIGEgc2FmZSB3YWxsZXQsIHNvIGxldCdzIHJldHJpZXZlIHRoZSBwcml2YXRlIGtleSBpbmZvXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHsgZ3BrOiB0cnVlIH0pO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHNhZmVVc2VyS2V5ID0gXy5nZXQodGhpcy53YWxsZXQsICdwcml2YXRlLnVzZXJQcml2S2V5Jyk7XG4gICAgICBpZiAoXy5pc1N0cmluZyhzYWZlVXNlcktleSkgJiYgXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgICAgdHJhbnNhY3Rpb24uc2lnbmluZ0tleSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IHNhZmVVc2VyS2V5IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbi5mZWVTaW5nbGVLZXlXSUYgPSBwYXJhbXMuZmVlU2luZ2xlS2V5V0lGO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgLy8gc2lnblRyYW5zYWN0aW9uIGF1dG8tZGV0ZWN0cyBQU0JUIHZzIGxlZ2FjeSBmcm9tIHRyYW5zYWN0aW9uSGV4XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBfLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIGZlZSxcbiAgICAgIGZlZVJhdGUsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgIGJpdGdvRmVlLFxuICAgICAgdHJhdmVsSW5mb3MsXG4gICAgICBlc3RpbWF0ZWRTaXplLFxuICAgICAgdW5zcGVudHMsXG4gICAgICBwc2J0QXR0ZW1wdDogdHJhbnNhY3Rpb24ucHNidEF0dGVtcHQsIC8vIFByb3BhZ2F0ZSBQU0JUIGF0dGVtcHQgaW5mbyBmb3IgZXJyb3IgcmVwb3J0aW5nXG4gICAgfSk7XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpblxuLy8gSU5URVJOQUwgZnVuY3Rpb24gdG8gZ2V0IHRoZSB1c2VyIGtleWNoYWluIGZvciBzaWduaW5nLlxuLy8gQ2FsbGVyIG11c3QgcHJvdmlkZXIgZWl0aGVyIGEga2V5Y2hhaW4sIG9yIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBhcyBhIHN0cmluZ1xuLy8gSWYgdGhlIGNhbGxlciBwcm92aWRlcyB0aGUga2V5Y2hhaW4gd2l0aCB4cHJ2LCBpdCBpcyBzaW1wbHkgcmV0dXJuZWQuXG4vLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVzIHRoZSBlbmNyeXB0ZWQgeHBydiAod2FsbGV0UGFzc3BocmFzZSksIHRoZW4gZmV0Y2ggdGhlIGtleWNoYWluIG9iamVjdCBhbmQgZGVjcnlwdFxuLy8gT3RoZXJ3aXNlIGlmIHRoZSB4cHJ2IGlzIHByb3ZpZGVkLCBmZXRjaCB0aGUga2V5Y2hhaW4gb2JqZWN0IGFuZCBhdWdtZW50IGl0IHdpdGggdGhlIHhwcnYuXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAga2V5Y2hhaW4gLSBrZXljaGFpbiB3aXRoIHhwcnZcbi8vICAgeHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybVxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gUmV0dXJuczpcbi8vICAgS2V5Y2hhaW4gb2JqZWN0IGNvbnRhaW5pbmcgeHBydiwgeHB1YiBhbmQgcGF0aHNcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG5cbiAgLy8gSWYga2V5Y2hhaW4gd2l0aCB4cHJ2IGlzIGFscmVhZHkgcHJvdmlkZWQsIHVzZSBpdFxuICBpZiAoXy5pc09iamVjdChwYXJhbXMua2V5Y2hhaW4pICYmIHBhcmFtcy5rZXljaGFpbi54cHJ2KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwYXJhbXMua2V5Y2hhaW4pO1xuICB9XG5cbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgaWYgKChwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJiBwYXJhbXMueHBydikgfHwgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAmJiAhcGFyYW1zLnhwcnYpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHByb3ZpZGUgZXhhY3RseSBvbmUgb2YgeHBydiBvciB3YWxsZXRQYXNzcGhyYXNlJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICAvLyBDYWxsZXIgcHJvdmlkZWQgYSB3YWxsZXQgcGFzc3BocmFzZVxuICBpZiAocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICByZXR1cm4gc2VsZi5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oKS50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgLy8gRGVjcnlwdCB0aGUgdXNlciBrZXkgd2l0aCBhIHBhc3NwaHJhc2VcbiAgICAgIHRyeSB7XG4gICAgICAgIGtleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleWNoYWluLnhwdWIgJiYgYmlwMzIuZnJvbUJhc2U1OChrZXljaGFpbi54cHJ2KS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgIT09IGtleWNoYWluLnhwdWIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZXJpdmVkIHhwdWIgZG9lcyBub3QgbWF0Y2ggc3RvcmVkIHhwdWInKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIENhbGxlciBwcm92aWRlZCBhbiB4cHJ2IC0gdmFsaWRhdGUgYW5kIGNvbnN0cnVjdCBrZXljaGFpbiBvYmplY3RcbiAgbGV0IHhwdWI7XG4gIHRyeSB7XG4gICAgeHB1YiA9IGJpcDMyLmZyb21CYXNlNTgocGFyYW1zLnhwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIHRoZSB4cHJ2Jyk7XG4gIH1cblxuICBpZiAoeHB1YiA9PT0gcGFyYW1zLnhwcnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3hwcnYgcHJvdmlkZWQgd2FzIG5vdCBhIHByaXZhdGUga2V5IChmb3VuZCB4cHViIGluc3RlYWQpJyk7XG4gIH1cblxuICBjb25zdCB3YWxsZXRYcHVicyA9IF8ubWFwKHNlbGYua2V5Y2hhaW5zLCAneHB1YicpO1xuICBpZiAoIV8uaW5jbHVkZXMod2FsbGV0WHB1YnMsIHhwdWIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd4cHJ2IHByb3ZpZGVkIHdhcyBub3QgYSBrZXljaGFpbiBvbiB0aGlzIHdhbGxldCEnKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUga2V5Y2hhaW4gb2JqZWN0IGZyb20gYml0Z28gdG8gZmluZCB0aGUgcGF0aCBhbmQgKHBvdGVudGlhbCkgd2FsbGV0IHN0cnVjdHVyZVxuICByZXR1cm4gc2VsZi5iaXRnb1xuICAgIC5rZXljaGFpbnMoKVxuICAgIC5nZXQoeyB4cHViOiB4cHViIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBrZXljaGFpbi54cHJ2ID0gcGFyYW1zLnhwcnY7XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIFRha2VzIGEgd2FsbGV0J3MgdW5zcGVudHMgYW5kIGZhbnMgdGhlbSBvdXQgaW50byBhIGxhcmdlciBudW1iZXIgb2YgZXF1YWxseSBzaXplZCB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogIHRhcmdldDogc2V0IGhvdyBtYW55IHVuc3BlbnRzIHlvdSB3YW50IHRvIGhhdmUgaW4gdGhlIGVuZFxuICogIG1pbkNvbmZpcm1zOiBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtcyB0aGUgdW5zcGVudHMgbXVzdCBoYXZlXG4gKiAgeHBydjogcHJpdmF0ZSBrZXkgdG8gc2lnbiB0cmFuc2FjdGlvblxuICogIHdhbGxldFBhc3NwaHJhc2U6IHdhbGxldCBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIHdhbGxldCdzIHByaXZhdGUga2V5XG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLmZhbk91dFVuc3BlbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHJldHVybiAoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGlucHV0cyBmb3IgZmFub3V0IHRyYW5zYWN0aW9uXG4gICAgLy8gKHdoZW4gZmFubmluZyBvdXQsIHdlIHRha2UgYWxsIHRoZSB1bnNwZW50cyBhbmQgbWFrZSBhIGJpZ2dlciBudW1iZXIgb2Ygb3V0cHV0cylcbiAgICBjb25zdCBNQVhfRkFOT1VUX0lOUFVUX0NPVU5UID0gODA7XG4gICAgLy8gbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0cyBmb3IgZmFub3V0IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgTUFYX0ZBTk9VVF9PVVRQVVRfQ09VTlQgPSAzMDA7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddLCBjYWxsYmFjayk7XG4gICAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBwYXJhbXMudGFyZ2V0O1xuICAgIC8vIHRoZSB0YXJnZXQgbXVzdCBiZSBkZWZpbmVkLCBiZSBhIG51bWJlciwgYmUgYXQgbGVhc3QgdHdvLCBhbmQgYmUgYSBuYXR1cmFsIG51bWJlclxuICAgIGlmICghXy5pc051bWJlcih0YXJnZXQpIHx8IHRhcmdldCA8IDIgfHwgdGFyZ2V0ICUgMSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGlmICh0YXJnZXQgPiBNQVhfRkFOT1VUX09VVFBVVF9DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYW4gb3V0IHRhcmdldCB0b28gaGlnaCcpO1xuICAgIH1cblxuICAgIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgICBpZiAobWluQ29uZmlybXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWluQ29uZmlybXMgPSAxO1xuICAgIH1cbiAgICBpZiAoIV8uaXNOdW1iZXIobWluQ29uZmlybXMpIHx8IG1pbkNvbmZpcm1zIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW5Db25maXJtcyBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyID49IDAnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdCBhIG5hdHVyYWwgbnVtYmVyIE4gaW50byBuIGFsbW9zdCBlcXVhbGx5IHNpemVkICjCsTEpIG5hdHVyYWwgbnVtYmVycy5cbiAgICAgKiBJbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlIHNpemVzIG9mIHRoZSBwYXJ0cywgd2UgY2FsY3VsYXRlIGZsb29yKE4vbiksIGFuZCB0aHVzIGhhdmUgdGhlIGJhc2Ugc2l6ZSBvZiBhbGwgcGFydHMuXG4gICAgICogSWYgTiAlIG4gIT09IDAsIHRoaXMgbGVhdmVzIHVzIHdpdGggYSByZW1haW5kZXIgciB3aGVyZSByIDwgbi4gV2UgZGlzdHJpYnV0ZSByIGVxdWFsbHkgYW1vbmcgdGhlIG4gcGFydHMgYnlcbiAgICAgKiBhZGRpbmcgMSB0byB0aGUgZmlyc3QgciBwYXJ0cy5cbiAgICAgKiBAcGFyYW0gdG90YWxcbiAgICAgKiBAcGFyYW0gcGFydENvdW50XG4gICAgICogQHJldHVybnMge0FycmF5fVxuICAgICAqL1xuICAgIGNvbnN0IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMgPSBmdW5jdGlvbiAodG90YWwsIHBhcnRDb3VudCkge1xuICAgICAgY29uc3QgcGFydFNpemUgPSBNYXRoLmZsb29yKHRvdGFsIC8gcGFydENvdW50KTtcbiAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHRvdGFsIC0gcGFydFNpemUgKiBwYXJ0Q291bnQ7XG4gICAgICAvLyBpbml0aWFsaXplIHBsYWNlaG9sZGVyIGFycmF5XG4gICAgICBjb25zdCBhbG1vc3RFcXVhbFBhcnRzID0gbmV3IEFycmF5KHBhcnRDb3VudCk7XG4gICAgICAvLyBmaWxsIHRoZSBmaXJzdCByZW1haW5kZXIgcGFydHMgd2l0aCB0aGUgdmFsdWUgcGFydFNpemUrMVxuICAgICAgXy5maWxsKGFsbW9zdEVxdWFsUGFydHMsIHBhcnRTaXplICsgMSwgMCwgcmVtYWluZGVyKTtcbiAgICAgIC8vIGZpbGwgdGhlIHJlbWFpbmluZyBwYXJ0cyB3aXRoIHRoZSB2YWx1ZSBwYXJ0U2l6ZVxuICAgICAgXy5maWxsKGFsbW9zdEVxdWFsUGFydHMsIHBhcnRTaXplLCByZW1haW5kZXIpO1xuICAgICAgLy8gYXNzZXJ0IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYWxtb3N0IGVxdWFsIHBhcnRzXG4gICAgICAvLyBUT0RPOiBhZGQgY2hlY2sgZm9yIHRoZSBiaWdnZXN0IGRldmlhdGlvbiBiZXR3ZWVuIGFueSB0d28gcGFydHMgYW5kIG1ha2Ugc3VyZSBpdCdzIDw9IDFcbiAgICAgIGlmIChfKGFsbW9zdEVxdWFsUGFydHMpLnN1bSgpICE9PSB0b3RhbCB8fCBfKGFsbW9zdEVxdWFsUGFydHMpLnNpemUoKSAhPT0gcGFydENvdW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncGFydCBzdW0gb3IgcGFydCBjb3VudCBtaXNtYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFsbW9zdEVxdWFsUGFydHM7XG4gICAgfTtcblxuICAgIC8vIGZpcnN0LCBsZXQncyB0YWtlIGFsbCB0aGUgd2FsbGV0J3MgdW5zcGVudHMgKHdpdGggbWluIGNvbmZpcm1zIGlmIG5lY2Vzc2FyeSlcbiAgICBjb25zdCBhbGxVbnNwZW50cyA9IChhd2FpdCBzZWxmLnVuc3BlbnRzKHsgbWluQ29uZmlybXM6IG1pbkNvbmZpcm1zIH0pKSBhcyBhbnk7XG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdW5zcGVudHMgdG8gYnJhbmNoIG91dCcpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgY29uc29saWRhdGlvbiBpcyBlc3NlbnRpYWxseSBqdXN0IGEgd2FzdGUgb2YgbW9uZXlcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoID49IHRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYW4gb3V0IHRhcmdldCBoYXMgdG8gYmUgYmlnZ2VyIHRoYW4gY3VycmVudCBudW1iZXIgb2YgdW5zcGVudHMnKTtcbiAgICB9XG5cbiAgICAvLyB3ZSBoYXZlIGF0IHRoZSB2ZXJ5IG1pbmltdW0gODEgaW5wdXRzLCBhbmQgODEgb3V0cHV0cy4gVGhhdCB0cmFuc2FjdGlvbiB3aWxsIGJlIGJpZ1xuICAgIC8vIGluIHRoZSBtZWRpdW0gcnVuLCB0aGlzIGFsZ29yaXRobSBjb3VsZCBiZSByZXdvcmtlZCB0byBvbmx5IHdvcmsgd2l0aCBhIHN1YnNldCBvZiB0aGUgdHJhbnNhY3Rpb25zXG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA+IE1BWF9GQU5PVVRfSU5QVVRfQ09VTlQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVG9vIG1hbnkgdW5zcGVudHMnKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGlzIGFsbCB0aGUgbW9uZXkgdGhhdCBpcyBjdXJyZW50bHkgaW4gdGhlIHdhbGxldFxuICAgIGNvbnN0IGdyb3NzQW1vdW50ID0gXyhhbGxVbnNwZW50cykubWFwKCd2YWx1ZScpLnN1bSgpO1xuXG4gICAgLy8gaW4gb3JkZXIgdG8gbm90IG1vZGlmeSB0aGUgcGFyYW1zIG9iamVjdCwgd2UgY3JlYXRlIGEgY29weVxuICAgIGNvbnN0IHR4UGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gICAgdHhQYXJhbXMudW5zcGVudHMgPSBhbGxVbnNwZW50cztcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0ge307XG5cbiAgICAvLyBjcmVhdGUgdGFyZ2V0IGFtb3VudCBvZiBuZXcgYWRkcmVzc2VzIGZvciB0aGlzIHdhbGxldFxuICAgIGNvbnN0IG5ld0FkZHJlc3NQcm9taXNlcyA9IF8ucmFuZ2UodGFyZ2V0KS5tYXAoKCkgPT5cbiAgICAgIHNlbGYuY3JlYXRlQWRkcmVzcyh7IGNoYWluOiBzZWxmLmdldENoYW5nZUNoYWluKHBhcmFtcyksIHZhbGlkYXRlOiB2YWxpZGF0ZSB9KVxuICAgICk7XG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc1Byb21pc2VzKTtcbiAgICAvLyBsZXQncyBmaW5kIGEgbmljZSwgZXF1YWwgZGlzdHJpYnV0aW9uIG9mIG91ciBTYXRvc2hpcyBhbW9uZyB0aGUgbmV3IGFkZHJlc3Nlc1xuICAgIGNvbnN0IHNwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMoZ3Jvc3NBbW91bnQsIHRhcmdldCk7XG4gICAgLy8gbWFwIHRoZSBuZXdseSBjcmVhdGVkIGFkZHJlc3NlcyB0byB0aGUgYWxtb3N0IGNvbXBvbmVudHMgYW1vdW50cyB3ZSBqdXN0IGNhbGN1bGF0ZWRcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCBzcGxpdEFtb3VudHMpO1xuICAgIHR4UGFyYW1zLm5vU3BsaXRDaGFuZ2UgPSB0cnVlO1xuICAgIC8vIGF0dGVtcHQgdG8gY3JlYXRlIGEgdHJhbnNhY3Rpb24uIEFzIGl0IGlzIGEgd2FsbGV0LXN3ZWVwaW5nIHRyYW5zYWN0aW9uIHdpdGggbm8gZmVlLCB3ZSBleHBlY3QgaXQgdG8gZmFpbFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gYXMgZXhwZWN0ZWQsIHRoZSB0cmFuc2FjdGlvbiBjcmVhdGlvbiBkaWQgaW5kZWVkIGZhaWwgZHVlIHRvIGluc3VmZmljaWVudCBmZWVzXG4gICAgICAvLyB0aGUgZXJyb3Igc3VnZ2VzdHMgYSBmZWUgdmFsdWUgd2hpY2ggd2UgdGhlbiB1c2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgdG90YWxGZWUgPSBiYXNlRmVlO1xuICAgICAgaWYgKGVycm9yLnJlc3VsdC5iaXRnb0ZlZSAmJiBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50KSB7XG4gICAgICAgIHRvdGFsRmVlICs9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHR4UGFyYW1zLmJpdGdvRmVlID0gZXJyb3IucmVzdWx0LmJpdGdvRmVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG4gICAgICB0eFBhcmFtcy5mZWUgPSBiYXNlRmVlO1xuICAgICAgLy8gaW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGVxdWFsIGRpc3RyaWJ1dGlvbiwgd2UgbmVlZCB0byBzdWJ0cmFjdCB0aGUgZmVlIGZyb20gdGhlIGN1bXVsYXRpdmUgZnVuZHNcbiAgICAgIC8vIGluIGNhc2Ugc29tZSB1bnNwZW50cyBnb3QgcHJ1bmVkLCB3ZSBuZWVkIHRvIHVzZSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWU7IC8vIGFmdGVyIGZlZXNcbiAgICAgIC8vIHRoYXQgbWVhbnMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGhhcyB0byBiZSByZWNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1NwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMobmV0QW1vdW50LCB0YXJnZXQpO1xuICAgICAgLy8gYW5kIHRoZSBkaXN0cmlidXRpb24gYWdhaW4gbWFwcGVkIHRvIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCByZW1haW5pbmdTcGxpdEFtb3VudHMpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgdGltZSwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIHNob3VsZCB3b3JrXG4gICAgbGV0IGZhbm91dFR4O1xuICAgIHRyeSB7XG4gICAgICBmYW5vdXRUeCA9IGF3YWl0IHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgIGUubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbm91dFR4KS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG4gIH0pKClcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0byBmYW4gb3V0IG9yIGNvYWxlc2NlIGEgd2FsbGV0J3MgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMge1JlcXVlc3R8UHJvbWlzZS48VD58Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5yZWdyb3VwVW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbnN0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gIGlmICghXy5pc051bWJlcih0YXJnZXQpIHx8IHRhcmdldCA8IDEgfHwgdGFyZ2V0ICUgMSAhPT0gMCkge1xuICAgIC8vIHRoZSB0YXJnZXQgbXVzdCBiZSBkZWZpbmVkLCBiZSBhIG51bWJlciwgYmUgYXQgbGVhc3Qgb25lLCBhbmQgYmUgYSBuYXR1cmFsIG51bWJlclxuICAgIHRocm93IG5ldyBFcnJvcignVGFyZ2V0IG5lZWRzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICB9XG5cbiAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICBpZiAobWluQ29uZmlybXMgPT09IHVuZGVmaW5lZCkge1xuICAgIG1pbkNvbmZpcm1zID0gMTtcbiAgfVxuICBpZiAoIV8uaXNOdW1iZXIobWluQ29uZmlybXMpIHx8IG1pbkNvbmZpcm1zIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluQ29uZmlybXMgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBlcXVhbCB0byBvciBiaWdnZXIgdGhhbiAwJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHNlbGYudW5zcGVudHMoeyBtaW5Db25maXJtczogbWluQ29uZmlybXMgfSkudGhlbihmdW5jdGlvbiAodW5zcGVudHMpIHtcbiAgICBpZiAodW5zcGVudHMubGVuZ3RoID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiB1bnNwZW50cztcbiAgICB9IGVsc2UgaWYgKHVuc3BlbnRzLmxlbmd0aCA+IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHNlbGYuY29uc29saWRhdGVVbnNwZW50cyhwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9IGVsc2UgaWYgKHVuc3BlbnRzLmxlbmd0aCA8IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHNlbGYuZmFuT3V0VW5zcGVudHMocGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogQ29uc29saWRhdGUgYSB3YWxsZXQncyB1bnNwZW50cyBpbnRvIGZld2VyIHVuc3BlbnRzXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgdGFyZ2V0OiBzZXQgaG93IG1hbnkgdW5zcGVudHMgeW91IHdhbnQgdG8gaGF2ZSBpbiB0aGUgZW5kXG4gKiAgbWF4SW5wdXRDb3VudFBlckNvbnNvbGlkYXRpb246IHNldCBob3cgbWFueSBtYXhpbXVtIGlucHV0cyBhcmUgdG8gYmUgcGVybWl0dGVkIHBlciBjb25zb2xpZGF0aW9uIGJhdGNoXG4gKiAgeHBydjogcHJpdmF0ZSBrZXkgdG8gc2lnbiB0cmFuc2FjdGlvblxuICogIHdhbGxldFBhc3NwaHJhc2U6IHdhbGxldCBwYXNzcGhyYXNlIHRvIGRlY3J5cHQgdGhlIHdhbGxldCdzIHByaXZhdGUga2V5XG4gKiAgbWF4SXRlcmF0aW9uQ291bnQ6IG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIHVudGlsIGZ1bmN0aW9uIHN0b3BzXG4gKiAgcHJvZ3Jlc3NDYWxsYmFjazogbWV0aG9kIHRvIGJlIGNhbGxlZCB3aXRoIG9iamVjdCBvdXRsaW5pbmcgY3VycmVudCBwcm9ncmVzcyBkZXRhaWxzXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLmNvbnNvbGlkYXRlVW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddLCBjYWxsYmFjayk7XG4gIGNvbnN0IHZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlID09PSB1bmRlZmluZWQgPyB0cnVlIDogcGFyYW1zLnZhbGlkYXRlO1xuXG4gIGxldCB0YXJnZXQgPSBwYXJhbXMudGFyZ2V0O1xuICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0YXJnZXQgPSAxO1xuICB9IGVsc2UgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMSB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCBvbmUsIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLm1heFNpemUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1heFNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtYXhTaXplIHNob3VsZCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5taW5TaXplICYmICFfLmlzTnVtYmVyKHBhcmFtcy5taW5TaXplKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluU2l6ZSBzaG91bGQgYmUgYSBudW1iZXInKTtcbiAgfVxuXG4gIC8vIG1heGltdW0gbnVtYmVyIG9mIGlucHV0cyBwZXIgdHJhbnNhY3Rpb24gZm9yIGNvbnNvbGlkYXRpb25cbiAgY29uc3QgTUFYX0lOUFVUX0NPVU5UID0gMjAwO1xuICBsZXQgbWF4SW5wdXRDb3VudCA9IHBhcmFtcy5tYXhJbnB1dENvdW50UGVyQ29uc29saWRhdGlvbjtcbiAgaWYgKG1heElucHV0Q291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIG51bGwgb3IgdW5pZGVudGlmaWVkLCBiZWNhdXNlIGVxdWFsaXR5IHRvIHplcm8gcmV0dXJucyB0cnVlIGluIGlmKCEgY2xhdXNlXG4gICAgbWF4SW5wdXRDb3VudCA9IE1BWF9JTlBVVF9DT1VOVDtcbiAgfVxuICBpZiAodHlwZW9mIG1heElucHV0Q291bnQgIT09ICdudW1iZXInIHx8IG1heElucHV0Q291bnQgPCAyIHx8IG1heElucHV0Q291bnQgJSAxICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGNvbnNvbGlkYXRpb24gaW5wdXQgY291bnQgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBlcXVhbCB0byBvciBiaWdnZXIgdGhhbiAyJyk7XG4gIH0gZWxzZSBpZiAobWF4SW5wdXRDb3VudCA+IE1BWF9JTlBVVF9DT1VOVCkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSBjb25zb2xpZGF0aW9uIGlucHV0IGNvdW50IGNhbm5vdCBiZSBiaWdnZXIgdGhhbiAnICsgTUFYX0lOUFVUX0NPVU5UKTtcbiAgfVxuXG4gIGNvbnN0IG1heEl0ZXJhdGlvbkNvdW50ID0gcGFyYW1zLm1heEl0ZXJhdGlvbkNvdW50IHx8IC0xO1xuICBpZiAoXG4gICAgKHBhcmFtcy5tYXhJdGVyYXRpb25Db3VudCAmJiAoIV8uaXNOdW1iZXIobWF4SXRlcmF0aW9uQ291bnQpIHx8IG1heEl0ZXJhdGlvbkNvdW50IDwgMSkpIHx8XG4gICAgbWF4SXRlcmF0aW9uQ291bnQgJSAxICE9PSAwXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWF4aW11bSBpdGVyYXRpb24gY291bnQgbmVlZHMgdG8gYmUgYW4gaW50ZWdlciBlcXVhbCB0byBvciBiaWdnZXIgdGhhbiAxJyk7XG4gIH1cblxuICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWluQ29uZmlybXMgPSAxO1xuICB9XG4gIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5Db25maXJtcyBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDAnKTtcbiAgfVxuXG4gIGxldCBtaW5TaXplID0gcGFyYW1zLm1pblNpemUgfHwgMDtcbiAgaWYgKHBhcmFtcy5mZWVSYXRlKSB7XG4gICAgLy8gZmVlIHJhdGUgaXMgaW4gc2F0b3NoaXMgcGVyIGtCLCBpbnB1dCBzaXplIGluIGJ5dGVzXG4gICAgY29uc3QgZmVlQmFzZWRNaW5TaXplID0gTWF0aC5jZWlsKChWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplICogcGFyYW1zLmZlZVJhdGUpIC8gMTAwMCk7XG4gICAgaWYgKHBhcmFtcy5taW5TaXplICYmIG1pblNpemUgPCBmZWVCYXNlZE1pblNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJvdmlkZWQgbWluU2l6ZSB0b28gbG93IGR1ZSB0byB0b28gaGlnaCBmZWUgcmF0ZScpO1xuICAgIH1cbiAgICBtaW5TaXplID0gTWF0aC5tYXgoZmVlQmFzZWRNaW5TaXplLCBtaW5TaXplKTtcblxuICAgIGlmICghcGFyYW1zLm1pblNpemUpIHtcbiAgICAgIC8vIGZlZSByYXRlLWJhc2VkIG1pbiBzaXplIG5lZWRzIG5vIGxvZ2dpbmcgaWYgaXQgd2FzIHNldCBleHBsaWNpdGx5XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ09ubHkgY29uc29saWRhdGluZyB1bnNwZW50cyBsYXJnZXIgdGhhbiAnICtcbiAgICAgICAgICBtaW5TaXplICtcbiAgICAgICAgICAnIHNhdG9zaGlzIHRvIGF2b2lkIHdhc3RpbmcgbW9uZXkgb24gZmVlcy4gVG8gY29uc29saWRhdGUgc21hbGxlciB1bnNwZW50cywgdXNlIGEgbG93ZXIgZmVlIHJhdGUuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBsZXQgaXRlcmF0aW9uQ291bnQgPSAwO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBsZXQgY29uc29saWRhdGlvbkluZGV4ID0gMDtcblxuICAvKipcbiAgICogQ29uc29saWRhdGUgb25lIGJhdGNoIG9mIHVwIHRvIE1BWF9JTlBVVF9DT1VOVCB1bnNwZW50cy5cbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBydW5OZXh0Q29uc29saWRhdGlvbigpIHtcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGZhbHNlO1xuICAgIGl0ZXJhdGlvbkNvdW50Kys7XG4gICAgLypcbiAgICAgV2UgdGFrZSBhIG1heGltdW0gb2YgdW5zcGVudEJ1bGtTaXplTGltaXQgdW5zcGVudHMgZnJvbSB0aGUgd2FsbGV0LiBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN3aXBlIHRoZSB3YWxsZXRcbiAgICAgY2xlYW4gb2YgYWxsIGV4Y2Vzc2l2ZSB1bnNwZW50cywgc28gd2UgYWRkIDEgdG8gdGhlIHRhcmdldCB1bnNwZW50IGNvdW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IG1pc3NlZCBhbnl0aGluZy5cbiAgICAgSW4gY2FzZSB0aGVyZSBhcmUgZXZlbiBtb3JlIHVuc3BlbnRzIHRoYW4gdGhhdCwgdG8gbWFrZSB0aGUgY29uc29saWRhdGlvbiBhcyBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBleHBhbmQgb3VyXG4gICAgIHNlbGVjdGlvbiB0byBpbmNsdWRlIGFzIG1hbnkgYXMgdGhlIG1heGltdW0gcGVybWlzc2libGUgbnVtYmVyIG9mIGlucHV0cyBwZXIgY29uc29saWRhdGlvbiBiYXRjaC5cbiAgICAgU2hvdWxkIHRoZSB0YXJnZXQgbnVtYmVyIG9mIHVuc3BlbnRzIGJlIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBpZiBpbnB1dHMgcGVyIGNvbnNvbGlkYXRpb24sXG4gICAgIHdlIHN0aWxsIHdhbnQgdG8gZmV0Y2ggdGhlbSBhbGwgc2ltcGx5IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgY29uc29saWRhdGlvbiBjYW4gYmUgcGVyZm9ybWVkXG4gICAgIGF0IGFsbCwgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBudW1iZXIgb2YgYWxsIHVuc3BlbnRzIGJlaW5nIGhpZ2hlciB0aGFuIHRoZSB0YXJnZXQuXG4gICAgIEluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIHVuc3BlbnRzIHZlcnNpb24gU0RLLCB3ZSB3aWxsIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiB1bnNwZW50cyB3aXRob3V0IGhhdmluZyB0byBmZXRjaFxuICAgICB0aGVtLCBhbmQgdGhlcmVmb3JlIHdpbGwgYmUgYWJsZSB0byBzaW1wbGlmeSB0aGlzIG1ldGhvZC5cbiAgICAgKi9cblxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7XG4gICAgICBsaW1pdDogdGFyZ2V0ICsgbWF4SW5wdXRDb3VudCxcbiAgICAgIG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyxcbiAgICAgIG1pblNpemU6IG1pblNpemUsXG4gICAgfTtcbiAgICBpZiAocGFyYW1zLm1heFNpemUpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLm1heFNpemUgPSBwYXJhbXMubWF4U2l6ZTtcbiAgICB9XG4gICAgY29uc3QgYWxsVW5zcGVudHMgPSAoYXdhaXQgc2VsZi51bnNwZW50cyhxdWVyeVBhcmFtcykpIGFzIGFueTtcbiAgICAvLyB0aGlzIGNvbnNvbGlkYXRpb24gaXMgZXNzZW50aWFsbHkganVzdCBhIHdhc3RlIG9mIG1vbmV5XG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA8PSB0YXJnZXQpIHtcbiAgICAgIGlmIChpdGVyYXRpb25Db3VudCA8PSAxKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IGl0ZXJhdGlvbiwgc28gdGhlIG1ldGhvZCBpcyBpbmNvcnJlY3RcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXdlciB1bnNwZW50cyB0aGFuIGNvbnNvbGlkYXRpb24gdGFyZ2V0LiBVc2UgZmFuT3V0VW5zcGVudHMgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGl0J3MgYSBsYXRlciBpdGVyYXRpb24sIHNvIHRoZSB0YXJnZXQgbWF5IGhhdmUgYmVlbiBzdXJwYXNzZWQgKGR1ZSB0byBjb25maXJtYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvbmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxVbnNwZW50c0NvdW50ID0gYWxsVW5zcGVudHMubGVuZ3RoO1xuXG4gICAgLy8gaG93IG1hbnkgb2YgdGhlIHVuc3BlbnRzIGRvIHdlIHdhbnQgdG8gY29uc29saWRhdGU/XG4gICAgLy8gdGhlICsxIGlzIGJlY2F1c2UgdGhlIGNvbnNvbGlkYXRlZCBibG9jayBiZWNvbWVzIGEgbmV3IHVuc3BlbnQgbGF0ZXJcbiAgICBsZXQgdGFyZ2V0SW5wdXRDb3VudCA9IGFsbFVuc3BlbnRzQ291bnQgLSB0YXJnZXQgKyAxO1xuICAgIHRhcmdldElucHV0Q291bnQgPSBNYXRoLm1pbih0YXJnZXRJbnB1dENvdW50LCBhbGxVbnNwZW50cy5sZW5ndGgpO1xuXG4gICAgLy8gaWYgdGhlIHRhcmdldElucHV0Q291bnQgcmVxdWlyZXMgbW9yZSBpbnB1dHMgdGhhbiB3ZSBhbGxvdyBwZXIgYmF0Y2gsIHdlIHJlZHVjZSB0aGUgbnVtYmVyXG4gICAgY29uc3QgaW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIG1heElucHV0Q291bnQpO1xuXG4gICAgLy8gaWYgZWl0aGVyIHRoZSBudW1iZXIgb2YgaW5wdXRzIGxlZnQgdG8gY29hbGVzY2UgZXF1YWxzIHRoZSBudW1iZXIgd2Ugd2lsbCBjb2FsZXNjZSBpbiB0aGlzIGl0ZXJhdGlvblxuICAgIC8vIG9yIGlmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBtYXRjaGVzIHRoZSBtYXhpbXVtIHBlcm1pdHRlZCBudW1iZXJcbiAgICBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGlucHV0Q291bnQgPT09IHRhcmdldElucHV0Q291bnQgfHwgaXRlcmF0aW9uQ291bnQgPT09IG1heEl0ZXJhdGlvbkNvdW50O1xuXG4gICAgY29uc3QgY3VycmVudENodW5rID0gYWxsVW5zcGVudHMuc3BsaWNlKDAsIGlucHV0Q291bnQpO1xuICAgIGNvbnN0IGNoYW5nZUNoYWluID0gc2VsZi5nZXRDaGFuZ2VDaGFpbihwYXJhbXMpO1xuICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkpIGFzIGFueTtcbiAgICBjb25zdCB0eFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIGNvbnN0IGN1cnJlbnRBZGRyZXNzID0gbmV3QWRkcmVzcztcbiAgICAvLyB0aGUgdG90YWwgYW1vdW50IHRoYXQgd2UgYXJlIGNvbnNvbGlkYXRpbmcgd2l0aGluIHRoaXMgYmF0Y2hcbiAgICBjb25zdCBncm9zc0Ftb3VudCA9IF8oY3VycmVudENodW5rKS5tYXAoJ3ZhbHVlJykuc3VtKCk7IC8vIGJlZm9yZSBmZWVzXG5cbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGN1cnJlbnRDaHVuaztcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0ge307XG4gICAgdHhQYXJhbXMucmVjaXBpZW50c1tuZXdBZGRyZXNzLmFkZHJlc3NdID0gZ3Jvc3NBbW91bnQ7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG5cbiAgICBpZiAodHhQYXJhbXMudW5zcGVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgIH1cblxuICAgIC8vIGxldCdzIGF0dGVtcHQgdG8gY3JlYXRlIHRoaXMgdHJhbnNhY3Rpb24uIFdlIGV4cGVjdCBpdCB0byBmYWlsIGJlY2F1c2Ugbm8gZmVlIGlzIHNldC5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIHRoaXMgZXJyb3Igc2hvdWxkIG9jY3VyIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHNcbiAgICAgIC8vIGhvd2V2ZXIsIGxldCdzIG1ha2Ugc3VyZSBpdCB3YXNuJ3Qgc29tZXRoaW5nIGVsc2VcbiAgICAgIGlmICghZXJyb3IuZmVlICYmICghZXJyb3IucmVzdWx0IHx8ICFlcnJvci5yZXN1bHQuZmVlKSkge1xuICAgICAgICAvLyBpZiB0aGUgZXJyb3IgZG9lcyBub3QgY29udGFpbiBhIGZlZSBwcm9wZXJ0eSwgaXQgaXMgc29tZXRoaW5nIGVsc2UgdGhhdCBoYXMgZ29uZSBhd3J5LCBhbmQgd2UgdGhyb3cgaXRcbiAgICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgICBlcnJvci5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFzZUZlZSA9IGVycm9yLmZlZSB8fCBlcnJvci5yZXN1bHQuZmVlO1xuICAgICAgbGV0IGJpdGdvRmVlID0gMDtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50O1xuICAgICAgICB0b3RhbEZlZSArPSBiaXRnb0ZlZTtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBuZXQgYW1vdW50IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbWluaW11bSBvdXRwdXQgc2l6ZVxuICAgICAgY29uc3QgbmV0QW1vdW50ID0gTWF0aC5tYXgoZXJyb3IucmVzdWx0LmF2YWlsYWJsZSAtIHRvdGFsRmVlLCBzZWxmLmJpdGdvLmdldENvbnN0YW50cygpLm1pbk91dHB1dFNpemUpO1xuICAgICAgLy8gTmVlZCB0byBjbGVhciB0aGVzZSBvdXQgc2luY2Ugb25seSAxIG1heSBiZSBzZXRcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWU7XG4gICAgICB0eFBhcmFtcy5vcmlnaW5hbEZlZVJhdGUgPSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0O1xuXG4gICAgICAvLyB3ZSBzZXQgdGhlIGZlZSBleHBsaWNpdGx5XG4gICAgICB0eFBhcmFtcy5mZWUgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gbmV0QW1vdW50IC0gYml0Z29GZWU7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBuZXRBbW91bnQ7XG4gICAgfVxuICAgIC8vIHRoaXMgdHJhbnNhY3Rpb24sIG9uIHRoZSBvdGhlciBoYW5kLCBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIG5vIGlzc3VlcywgYmVjYXVzZSBhbiBhcHByb3ByaWF0ZSBmZWUgaXMgc2V0XG4gICAgbGV0IHNlbnRUeDtcbiAgICB0cnkge1xuICAgICAgc2VudFR4ID0gYXdhaXQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goc2VudFR4KTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5wcm9ncmVzc0NhbGxiYWNrKSkge1xuICAgICAgcGFyYW1zLnByb2dyZXNzQ2FsbGJhY2soe1xuICAgICAgICB0eGlkOiBzZW50VHguaGFzaCxcbiAgICAgICAgZGVzdGluYXRpb246IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGdyb3NzQW1vdW50LFxuICAgICAgICBmZWU6IHNlbnRUeC5mZWUsXG4gICAgICAgIGlucHV0Q291bnQ6IGlucHV0Q291bnQsXG4gICAgICAgIGluZGV4OiBjb25zb2xpZGF0aW9uSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc29saWRhdGlvbkluZGV4Kys7XG4gICAgaWYgKCFpc0ZpbmFsQ29uc29saWRhdGlvbikge1xuICAgICAgLy8gdGhpcyBsYXN0IGNvbnNvbGlkYXRpb24gaGFzIG5vdCB5ZXQgYnJvdWdodCB0aGUgdW5zcGVudHMgY291bnQgZG93biB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnRcbiAgICAgIC8vIHRoZXJlZm9yZSwgd2UgcHJvY2VlZCBieSBjb25zb2xpZGF0aW5nIHlldCBhbm90aGVyIGJhdGNoXG4gICAgICAvLyBiZWZvcmUgd2UgZG8gdGhhdCwgd2Ugd2FpdCAxIHNlY29uZCBzbyB0aGF0IHRoZSBuZXdseSBjcmVhdGVkIHVuc3BlbnQgd2lsbCBiZSBmZXRjaGVkIGluIHRoZSBuZXh0IGJhdGNoXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goLi4uKChhd2FpdCBydW5OZXh0Q29uc29saWRhdGlvbigpKSBhcyBhbnkpKTtcbiAgICB9XG4gICAgLy8gdGhpcyBpcyB0aGUgZmluYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbi4gV2UgcmV0dXJuIGFsbCB0aGUgb25lcyB3ZSd2ZSBoYWQgc28gZmFyXG4gICAgcmV0dXJuIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnM7XG4gIH1cblxuICByZXR1cm4gcnVuTmV4dENvbnNvbGlkYXRpb24oKVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdEb25lJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5yZXNoYXJlICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5yZXNoYXJlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLnNraXBLZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2tpcEtleWNoYWluKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gIH1cbiAgY29uc3QgbmVlZHNLZXljaGFpbiA9ICFwYXJhbXMuc2tpcEtleWNoYWluICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICBpZiAocGFyYW1zLmRpc2FibGVFbWFpbCAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUVtYWlsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBsZXQgc2hhcmluZztcbiAgbGV0IHNoYXJlZEtleWNoYWluO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC5nZXRTaGFyaW5nS2V5KHsgZW1haWw6IHBhcmFtcy5lbWFpbC50b0xvd2VyQ2FzZSgpIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgc2hhcmluZyA9IHJlc3VsdDtcblxuICAgICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KS50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGtleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWNrZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFhwcnYgPSBzZWxmLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ueHBydiB9KTtcblxuICAgICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgICAgIHhwdWI6IGtleWNoYWluLnhwdWIsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZFhwcnY6IG5ld0VuY3J5cHRlZFhwcnYsXG4gICAgICAgICAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgICAgcGF0aDogc2hhcmluZy5wYXRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgICAgICB1c2VyOiBhbnk7XG4gICAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICAgIHJlc2hhcmU6IGJvb2xlYW47XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgZGlzYWJsZUVtYWlsOiBhbnk7XG4gICAgICAgIGtleWNoYWluPzogYW55O1xuICAgICAgICBza2lwS2V5Y2hhaW4/OiBib29sZWFuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuICAgICAgICB1c2VyOiBzaGFyaW5nLnVzZXJJZCxcbiAgICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICAgICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICB9O1xuICAgICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSBzaGFyZWRLZXljaGFpbjtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNraXBLZXljaGFpbikge1xuICAgICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlVXNlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMudXJsKCcvdXNlci8nICsgcGFyYW1zLnVzZXIpKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5nZXRQb2xpY3kgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wb2xpY3knKSkuc2VuZCgpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmdldFBvbGljeVN0YXR1cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeS9zdGF0dXMnKSkuc2VuZCgpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnNldFBvbGljeVJ1bGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnLCAndHlwZSddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMuY29uZGl0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGNvbmRpdGlvbnMgb2JqZWN0Jyk7XG4gIH1cblxuICBpZiAoIV8uaXNPYmplY3QocGFyYW1zLmFjdGlvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBhY3Rpb24gb2JqZWN0Jyk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnJlbW92ZVBvbGljeVJ1bGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmxpc3RXZWJob29rcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQoKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTaW11bGF0ZSB3YWxsZXQgd2ViaG9vaywgY3VycmVudGx5IGZvciB3ZWJob29rcyBvZiB0eXBlIHRyYW5zYWN0aW9uIGFuZCBwZW5kaW5nIGFwcHJvdmFsXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAtIHdlYmhvb2tJZCAocmVxdWlyZWQpOiBpZCBvZiB0aGUgd2ViaG9vayB0byBiZSBzaW11bGF0ZWRcbiAqIC0gdHhIYXNoIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHRyYW5zYWN0aW9uIHdlYmhvb2tzKSBoYXNoIG9mIHRoZSBzaW11bGF0ZWQgdHJhbnNhY3Rpb25cbiAqIC0gcGVuZGluZ0FwcHJvdmFsSWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgcGVuZGluZyBhcHByb3ZhbCB3ZWJob29rcykgaWQgb2YgdGhlIHNpbXVsYXRlZCBwZW5kaW5nIGFwcHJvdmFsXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnNpbXVsYXRlV2ViaG9vayA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3ZWJob29rSWQnXSwgWyd0eEhhc2gnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGhhc1R4SGFzaCA9ICEhcGFyYW1zLnR4SGFzaDtcbiAgY29uc3QgaGFzUGVuZGluZ0FwcHJvdmFsSWQgPSAhIXBhcmFtcy5wZW5kaW5nQXBwcm92YWxJZDtcblxuICBpZiAoKGhhc1R4SGFzaCAmJiBoYXNQZW5kaW5nQXBwcm92YWxJZCkgfHwgKCFoYXNUeEhhc2ggJiYgIWhhc1BlbmRpbmdBcHByb3ZhbElkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHR4SGFzaCBvciBwZW5kaW5nQXBwcm92YWxJZCwgYnV0IG5vdCBib3RoJyk7XG4gIH1cblxuICAvLyBkZXBlbmRpbmcgb24gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0LCB0aGUgdHhIYXNoIGhhcyB0byBhZGhlcmUgdG8gaXRzIHJlc3BlY3RpdmUgZm9ybWF0XG4gIC8vIGJ1dCB0aGUgc2VydmVyIHRha2VzIGNhcmUgb2YgdGhhdFxuXG4gIC8vIG9ubHkgdGFrZSB0aGUgdHhIYXNoIGFuZCBwZW5kaW5nQXBwcm92YWxJZCBwcm9wZXJ0aWVzXG4gIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgWyd0eEhhc2gnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgY29uc3Qgd2ViaG9va0lkID0gcGFyYW1zLndlYmhvb2tJZDtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuYWRkV2ViaG9vayA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnLCAndHlwZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnJlbW92ZVdlYmhvb2sgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXJsJywgJ3R5cGUnXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmVzdGltYXRlRmVlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5hbW91bnQgJiYgcGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggYW1vdW50IGFzIHdlbGwgYXMgcmVjaXBpZW50cycpO1xuICB9XG4gIGlmIChwYXJhbXMucmVjaXBpZW50cyAmJiAhXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY2lwaWVudHMgbXVzdCBiZSBhcnJheSBvZiB7IGFkZHJlc3M6IGFiYywgYW1vdW50OiAxMDAwMDAgfSBvYmplY3RzJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5hbW91bnQgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYW1vdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gIH1cblxuICBjb25zdCByZWNpcGllbnRzID0gcGFyYW1zLnJlY2lwaWVudHMgfHwgW107XG5cbiAgaWYgKHBhcmFtcy5hbW91bnQpIHtcbiAgICAvLyBvbmx5IHRoZSBhbW91bnQgd2FzIHBhc3NlZCBpbiwgc28gd2UgbmVlZCB0byBtYWtlIGEgZmFsc2UgcmVjaXBpZW50IHRvIHJ1biBjcmVhdGVUcmFuc2FjdGlvbiB3aXRoXG4gICAgcmVjaXBpZW50cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5iaXRnby5lbnZdLnNpZ25pbmdBZGRyZXNzLCAvLyBhbnkgYWRkcmVzcyB3aWxsIGRvXG4gICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICB0cmFuc2FjdGlvblBhcmFtcy5hbW91bnQgPSB1bmRlZmluZWQ7XG4gIHRyYW5zYWN0aW9uUGFyYW1zLnJlY2lwaWVudHMgPSByZWNpcGllbnRzO1xuXG4gIHJldHVybiB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uUGFyYW1zKS50aGVuKGZ1bmN0aW9uICh0eCkge1xuICAgIHJldHVybiB7XG4gICAgICBlc3RpbWF0ZWRTaXplOiB0eC5lc3RpbWF0ZWRTaXplLFxuICAgICAgZmVlOiB0eC5mZWUsXG4gICAgICBmZWVSYXRlOiB0eC5mZWVSYXRlLFxuICAgIH07XG4gIH0pO1xufTtcblxuLy8gTm90IGZ1bGx5IGltcGxlbWVudGVkIC8gcmVsZWFzZWQgb24gU0RLLiBUZXN0aW5nIGZvciBub3cuXG5XYWxsZXQucHJvdG90eXBlLnVwZGF0ZVBvbGljeVJ1bGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnLCAndHlwZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZGVsZXRlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBnZXRCaXRHb0ZlZVxuLy8gR2V0IHRoZSByZXF1aXJlZCBvbi10cmFuc2FjdGlvbiBCaXRHbyBmZWVcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldEJpdEdvRmVlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5hbW91bnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFtb3VudCBhcmd1bWVudCcpO1xuICB9XG4gIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluc3RhbnQgYXJndW1lbnQnKTtcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvYmlsbGluZy9mZWUnKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLypcbiAqIEBwYXJhbXNcbiAqICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlIG9mIHdhbGxldCB1c2VkIHRvIGRlY3J5cHQgdGhlIGVuY3J5cHRlZCBrZXlzXG4gKiAgdW5zcGVudHM6IGFycmF5IG9mIHVuc3BlbnRzIHRvIHJlY292ZXJcbiAqICByZWNvdmVyeURlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIHJlY292ZXIgZnVuZHMgdG9cbiAqICBmZWVSYXRlOiBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICogIHVzZXJLZXk6IGVuY3J5cHRlZCB1c2VyIGtleVxuICogIGJhY2t1cEtleTogZW5jcnlwdGVkIGJhY2t1cCBrZXlcbiAqICovXG5XYWxsZXQucHJvdG90eXBlLnJlY292ZXIgPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXRQYXNzcGhyYXNlJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1bnNwZW50cycpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZlZVJhdGUnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlcktleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdXNlcktleScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5iYWNrdXBLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJhY2t1cEtleScpO1xuICB9XG5cbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IEJpZ0ludCh1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW0ocGFyYW1zLnVuc3BlbnRzKSk7XG4gIGlmICh0b3RhbElucHV0QW1vdW50IDw9IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBFcnJvck5vSW5wdXRUb1JlY292ZXIoKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNpemUgPSBWaXJ0dWFsU2l6ZXMudHhQMndzaE91dHB1dFNpemU7XG4gIGNvbnN0IGFwcHJveGltYXRlU2l6ZSA9XG4gICAgVmlydHVhbFNpemVzLnR4U2VnT3ZlcmhlYWRWU2l6ZSArIG91dHB1dFNpemUgKyBWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplICogcGFyYW1zLnVuc3BlbnRzLmxlbmd0aDtcbiAgY29uc3QgYXBwcm94aW1hdGVUeEZlZSA9IEJpZ0ludChhcHByb3hpbWF0ZVNpemUgKiBwYXJhbXMuZmVlUmF0ZSk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlVHhGZWU7XG4gIGNvbnN0IHJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiBOdW1iZXIocmVjb3ZlcnlBbW91bnQpIH1dO1xuXG4gIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICB1bnNwZW50czogcGFyYW1zLnVuc3BlbnRzLFxuICAgIHJlY2lwaWVudHMsXG4gICAgZmVlOiBOdW1iZXIoYXBwcm94aW1hdGVUeEZlZSksXG4gIH0pO1xuXG4gIGNvbnN0IHBhcnNlZFVuc2lnbmVkVHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleCh1bnNpZ25lZFR4LnRyYW5zYWN0aW9uSGV4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5pbnMubGVuZ3RoID09PSBwYXJhbXMudW5zcGVudHMubGVuZ3RoKTtcbiAgYXNzZXJ0KHBhcnNlZFVuc2lnbmVkVHgub3V0cy5sZW5ndGggPT09IDEpO1xuICBhc3NlcnQoXy5zdW1CeShwYXJhbXMudW5zcGVudHMsICd2YWx1ZScpIC0gXy5zdW1CeShwYXJzZWRVbnNpZ25lZFR4Lm91dHMsICd2YWx1ZScpID09PSBOdW1iZXIoYXBwcm94aW1hdGVUeEZlZSkpO1xuXG4gIGNvbnN0IHBsYWluVXNlcktleSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IHBhcmFtcy51c2VyS2V5IH0pO1xuICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7IC4uLnVuc2lnbmVkVHgsIHNpZ25pbmdLZXk6IHBsYWluVXNlcktleSB9KTtcblxuICBjb25zdCBwbGFpbkJhY2t1cEtleSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IHBhcmFtcy5iYWNrdXBLZXkgfSk7XG4gIGNvbnN0IGZ1bGxTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAuLi51bnNpZ25lZFR4LFxuICAgIHRyYW5zYWN0aW9uSGV4OiBoYWxmU2lnbmVkVHgudHgsXG4gICAgc2lnbmluZ0tleTogcGxhaW5CYWNrdXBLZXksXG4gIH0pO1xuICByZXR1cm4gZnVsbFNpZ25lZFR4LnR4O1xufTtcblxuLypcbiAqIEBwYXJhbXNcbiAqICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlIG9mIHdhbGxldCB1c2VkIHRvIGRlY3J5cHQgdGhlIGVuY3J5cHRlZCBrZXlzXG4gKiAgdW5zcGVudHM6IGFycmF5IG9mIHVuc3BlbnRzIHRvIHJlY292ZXJcbiAqICByZWNvdmVyeURlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIHJlY292ZXIgZnVuZHMgdG9cbiAqICBmZWVSYXRlOiBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICogIHVzZXJLZXk6IGVuY3J5cHRlZCB1c2VyIGtleVxuICogKi9cbldhbGxldC5wcm90b3R5cGUuc3dlZXAgPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXRQYXNzcGhyYXNlJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1bnNwZW50cycpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZlZVJhdGUnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlcktleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdXNlcktleScpO1xuICB9XG5cbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IEJpZ0ludCh1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW0ocGFyYW1zLnVuc3BlbnRzKSk7XG4gIGlmICh0b3RhbElucHV0QW1vdW50IDw9IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBFcnJvck5vSW5wdXRUb1JlY292ZXIoKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNpemUgPSBWaXJ0dWFsU2l6ZXMudHhQMndzaE91dHB1dFNpemU7XG4gIGNvbnN0IGFwcHJveGltYXRlU2l6ZSA9XG4gICAgVmlydHVhbFNpemVzLnR4U2VnT3ZlcmhlYWRWU2l6ZSArIG91dHB1dFNpemUgKyBWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplICogcGFyYW1zLnVuc3BlbnRzLmxlbmd0aDtcbiAgY29uc3QgYXBwcm94aW1hdGVUeEZlZSA9IEJpZ0ludChhcHByb3hpbWF0ZVNpemUgKiBwYXJhbXMuZmVlUmF0ZSk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlVHhGZWU7XG4gIGNvbnN0IHJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiBOdW1iZXIocmVjb3ZlcnlBbW91bnQpIH1dO1xuXG4gIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICB1bnNwZW50czogcGFyYW1zLnVuc3BlbnRzLFxuICAgIHJlY2lwaWVudHMsXG4gICAgZmVlOiBOdW1iZXIoYXBwcm94aW1hdGVUeEZlZSksXG4gIH0pO1xuXG4gIGNvbnN0IHBhcnNlZFVuc2lnbmVkVHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleCh1bnNpZ25lZFR4LnRyYW5zYWN0aW9uSGV4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5pbnMubGVuZ3RoID09PSBwYXJhbXMudW5zcGVudHMubGVuZ3RoKTtcbiAgYXNzZXJ0KHBhcnNlZFVuc2lnbmVkVHgub3V0cy5sZW5ndGggPT09IDEpO1xuICBhc3NlcnQoXy5zdW1CeShwYXJhbXMudW5zcGVudHMsICd2YWx1ZScpIC0gXy5zdW1CeShwYXJzZWRVbnNpZ25lZFR4Lm91dHMsICd2YWx1ZScpID09PSBOdW1iZXIoYXBwcm94aW1hdGVUeEZlZSkpO1xuXG4gIGNvbnN0IHBsYWluVXNlcktleSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IHBhcmFtcy51c2VyS2V5IH0pO1xuICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbih7IC4uLnVuc2lnbmVkVHgsIHNpZ25pbmdLZXk6IHBsYWluVXNlcktleSB9KTtcblxuICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kVHJhbnNhY3Rpb24oe1xuICAgIHR4OiBoYWxmU2lnbmVkVHgudHgsXG4gICAgc3VwcHJlc3NCcm9hZGNhc3Q6IHRydWUsXG4gICAgb3RwOiBwYXJhbXMub3RwLFxuICB9KTtcbn07XG5cbmV4cG9ydCA9IFdhbGxldDtcbiJdfQ==
|
|
2359
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsbURBQW9EO0FBQ3BELG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFDaEQsbURBQTZDO0FBQzdDLG1EQU84QjtBQUM5QixvREFBdUI7QUFDdkIseUNBQTZDO0FBQzdDLGtDQUFxQztBQUVyQyxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQzNELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRXJELCtDQUErQztBQUMvQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUVsQyxTQUFTLGFBQWEsQ0FBQyxLQUFVLEVBQUUsZUFBeUI7SUFDMUQsK0JBQStCO0lBQy9CLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsTUFBTSxPQUFPLEdBQUcsaUJBQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQzdELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsdUJBQXVCLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsa0JBQWtC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TSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFFN0YsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDaEMsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFO1FBQ25CLGlCQUFpQixFQUFFLElBQUk7UUFDdkIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO0tBQ2hCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLGlCQUFTLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gV2FsbGV0IE9iamVjdFxuLy8gQml0R28gYWNjZXNzb3IgZm9yIGEgc3BlY2lmaWMgd2FsbGV0XG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cblxuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHtcbiAgY29tbW9uLFxuICBFcnJvck5vSW5wdXRUb1JlY292ZXIsXG4gIGdldE5ldHdvcmssXG4gIGdldFNoYXJlZFNlY3JldCxcbiAgbWFrZVJhbmRvbUtleSxcbiAgc2FuaXRpemVMZWdhY3lQYXRoLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc2lnblBzYnRSZXF1ZXN0IH0gZnJvbSAnLi9zaWduUHNidCc7XG5pbXBvcnQgeyB0cnlQcm9taXNlIH0gZnJvbSAnLi4vdXRpbCc7XG5cbmNvbnN0IFRyYW5zYWN0aW9uQnVpbGRlciA9IHJlcXVpcmUoJy4vdHJhbnNhY3Rpb25CdWlsZGVyJyk7XG5jb25zdCBQZW5kaW5nQXBwcm92YWwgPSByZXF1aXJlKCcuL3BlbmRpbmdhcHByb3ZhbCcpO1xuXG4vLyBQU0JUIHJvbGxvdXQ6IDAlIG9uIG1haW5uZXQsIDEwMCUgb24gdGVzdG5ldFxuY29uc3QgVjFfUFNCVF9ST0xMT1VUX1BFUkNFTlQgPSAwO1xuXG5mdW5jdGlvbiBzaG91bGRVc2VQc2J0KGJpdGdvOiBhbnksIGV4cGxpY2l0VXNlUHNidD86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgLy8gRXhwbGljaXQgc2V0dGluZyBhbHdheXMgd2luc1xuICBpZiAoZXhwbGljaXRVc2VQc2J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZXhwbGljaXRVc2VQc2J0O1xuICB9XG5cbiAgLy8gVGVzdG5ldDogYWx3YXlzIFBTQlRcbiAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbYml0Z28uZ2V0RW52KCldPy5uZXR3b3JrO1xuICBpZiAobmV0d29yayAhPT0gJ2JpdGNvaW4nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBNYWlubmV0OiAxMCUgcm9sbG91dFxuICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIDEwMCA8IFYxX1BTQlRfUk9MTE9VVF9QRVJDRU5UO1xufVxuXG5jb25zdCB7IGdldEV4dGVybmFsQ2hhaW5Db2RlLCBnZXRJbnRlcm5hbENoYWluQ29kZSwgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiB9ID0gdXR4b2xpYi5iaXRnbztcbmNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKCdzdXBlcmFnZW50Jyk7XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IFdhbGxldCA9IGZ1bmN0aW9uIChiaXRnbywgd2FsbGV0KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICh0aGlzLmJpdGdvIGFzIGFueSkgPSBiaXRnbztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gIHRoaXMua2V5Y2hhaW5zID0gW107XG5cbiAgaWYgKHdhbGxldC5wcml2YXRlKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICB0aGlzLmtleWNoYWlucyA9IHdhbGxldC5wcml2YXRlLmtleWNoYWlucztcbiAgfVxufTtcblxuV2FsbGV0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldDtcbn07XG5cbi8vXG4vLyBpZFxuLy8gR2V0IHRoZSBpZCBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmlkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuaWQ7XG59O1xuXG4vL1xuLy8gbGFiZWxcbi8vIEdldCB0aGUgbGFiZWwgb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5sYWJlbCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmxhYmVsO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmJhbGFuY2UgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5iYWxhbmNlO1xufTtcblxuLy9cbi8vIGJhbGFuY2Vcbi8vIEdldCB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vLyBUaGlzIGlzIHRoZSB0b3RhbCBvZiBhbGwgdW5zcGVudHMgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHVuY29uZmlybWVkIGFuZCBleHRlcm5hbFxuLy9cbldhbGxldC5wcm90b3R5cGUuc3BlbmRhYmxlQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnNwZW5kYWJsZUJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY29uZmlybWVkQmFsYW5jZVxuLy8gR2V0IHRoZSBjb25maXJtZWRCYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuY29uZmlybWVkQmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG59O1xuXG4vL1xuLy8gY2FuU2VuZEluc3RhbnRcbi8vIFJldHVybnMgaWYgdGhlIHdhbGxldCBjYW4gc2VuZCBpbnN0YW50IHRyYW5zYWN0aW9uc1xuLy8gVGhpcyBpcyBpbXBhY3RlZCBieSB0aGUgY2hvaWNlIG9mIGJhY2t1cCBrZXkgcHJvdmlkZXJcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNhblNlbmRJbnN0YW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQgJiYgdGhpcy53YWxsZXQuY2FuU2VuZEluc3RhbnQ7XG59O1xuXG4vL1xuLy8gaW5zdGFudCBiYWxhbmNlXG4vLyBHZXQgdGhlIGluc3RhbnQgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vIFRoaXMgaXMgdGhlIHRvdGFsIG9mIGFsbCB1bnNwZW50cyB0aGF0IG1heSBiZSBzcGVudCBpbnN0YW50bHkuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5pbnN0YW50QmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmNhblNlbmRJbnN0YW50KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBhbiBpbnN0YW50IHdhbGxldCcpO1xuICB9XG4gIHJldHVybiB0aGlzLndhbGxldC5pbnN0YW50QmFsYW5jZTtcbn07XG5cbi8vXG4vLyB1bmNvbmZpcm1lZFNlbmRzXG4vLyBHZXQgdGhlIGJhbGFuY2Ugb2YgdW5jb25maXJtZWRTZW5kcyBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuY29uZmlybWVkU2VuZHMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC51bmNvbmZpcm1lZFNlbmRzO1xufTtcblxuLy9cbi8vIHVuY29uZmlybWVkUmVjZWl2ZXNcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB1bmNvbmZpcm1lZFJlY2VpdmVzIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bmNvbmZpcm1lZFJlY2VpdmVzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQudW5jb25maXJtZWRSZWNlaXZlcztcbn07XG5cbi8vXG4vLyB0eXBlXG4vLyBHZXQgdGhlIHR5cGUgb2YgdGhpcyB3YWxsZXQsIGUuZy4gJ3NhZmVoZCdcbi8vXG5XYWxsZXQucHJvdG90eXBlLnR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC50eXBlO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS51cmwgPSBmdW5jdGlvbiAoZXh0cmEpIHtcbiAgZXh0cmEgPSBleHRyYSB8fCAnJztcbiAgcmV0dXJuIHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyBleHRyYSk7XG59O1xuXG4vL1xuLy8gcGVuZGluZ0FwcHJvdmFsc1xuLy8gcmV0dXJucyB0aGUgcGVuZGluZyBhcHByb3ZhbHMgbGlzdCBmb3IgdGhpcyB3YWxsZXQgYXMgcGVuZGluZyBhcHByb3ZhbCBvYmplY3RzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5wZW5kaW5nQXBwcm92YWxzID0gZnVuY3Rpb24gKCkge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnBlbmRpbmdBcHByb3ZhbHMubWFwKGZ1bmN0aW9uIChwKSB7XG4gICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwoc2VsZi5iaXRnbywgcCwgc2VsZik7XG4gIH0pO1xufTtcblxuLy9cbi8vIGFwcHJvdmFsc1JlcXVpcmVkXG4vLyByZXR1cm5zIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzIHJlcXVpcmVkIHRvIGFwcHJvdmUgcGVuZGluZyBhcHByb3ZhbHMgaW52b2x2aW5nIHRoaXMgd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkIHx8IDE7XG59O1xuXG4vL1xuLy8gZ2V0XG4vLyBSZWZldGNoZXMgdGhpcyB3YWxsZXQgYW5kIHJldHVybnMgaXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogUHJvbWlzZTxhbnk+IHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoKSlcbiAgICAgIC5yZXN1bHQoKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBzZWxmLndhbGxldCA9IHJlcztcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9KVxuICApXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB1cGRhdGVBcHByb3ZhbHNSZXF1aXJlZFxuLy8gVXBkYXRlcyB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBvbiBhIHBlbmRpbmcgYXBwcm92YWwgaW52b2x2aW5nIHRoaXMgd2FsbGV0LlxuLy8gVGhlIGFwcHJvdmFscyByZXF1aXJlZCBpcyBieSBkZWZhdWx0IDEsIGJ1dCB0aGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZVxuLy8gbnVtYmVyIHN1Y2ggdGhhdCAxIDw9IGFwcHJvdmFsc1JlcXVpcmVkIDw9IHdhbGxldEFkbWlucy5sZW5ndGggLSAxXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51cGRhdGVBcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogUHJvbWlzZTxhbnk+IHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKFxuICAgIHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgIV8uaXNJbnRlZ2VyKHBhcmFtcy5hcHByb3ZhbHNSZXF1aXJlZCkgfHxcbiAgICBwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQgPCAxXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcHByb3ZhbHNSZXF1aXJlZDogbXVzdCBiZSBhIG5vbnplcm8gcG9zaXRpdmUgbnVtYmVyJyk7XG4gIH1cblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgY29uc3QgY3VycmVudEFwcHJvdmFsc1JlcXVpcmVkID0gdGhpcy5hcHByb3ZhbHNSZXF1aXJlZCgpO1xuICBpZiAoY3VycmVudEFwcHJvdmFsc1JlcXVpcmVkID09PSBwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQpIHtcbiAgICAvLyBuby1vcCwganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgd2FsbGV0XG4gICAgcmV0dXJuIHRyeVByb21pc2UoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYud2FsbGV0O1xuICAgIH0pXG4gICAgICAudGhlbihjYWxsYmFjaylcbiAgICAgIC5jYXRjaChjYWxsYmFjayk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCkpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjb3JyZWN0IGNoYWluIGZvciBjaGFuZ2UsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gc2Vnd2l0XG4gKi9cbldhbGxldC5wcm90b3R5cGUuZ2V0Q2hhbmdlQ2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGxldCB1c2VTZWd3aXRDaGFuZ2UgPSAhIXRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZW5hYmxlU2Vnd2l0O1xuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdENoYW5nZSkpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXRDaGFuZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NlZ3dpdENoYW5nZSBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICAgIH1cblxuICAgIC8vIGlmIHNlZ3dpdCBpcyBkaXNhYmxlZCB0aHJvdWdoIHRoZSBjb25zdGFudHMsIHNlZ3dpdCBjaGFuZ2Ugc2hvdWxkIHN0aWxsIG5vdCBiZSBjcmVhdGVkXG4gICAgdXNlU2Vnd2l0Q2hhbmdlID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5lbmFibGVTZWd3aXQgJiYgcGFyYW1zLnNlZ3dpdENoYW5nZTtcbiAgfVxuICByZXR1cm4gdXNlU2Vnd2l0Q2hhbmdlID8gZ2V0SW50ZXJuYWxDaGFpbkNvZGUoJ3Ayc2hQMndzaCcpIDogZ2V0SW50ZXJuYWxDaGFpbkNvZGUoJ3Ayc2gnKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVBZGRyZXNzXG4vLyBDcmVhdGVzIGEgbmV3IGFkZHJlc3MgZm9yIHVzZSB3aXRoIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlQWRkcmVzcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAodGhpcy50eXBlKCkgPT09ICdzYWZlJykge1xuICAgIHRocm93IG5ldyBFcnJvcignWW91IGFyZSB1c2luZyBhIGxlZ2FjeSB3YWxsZXQgdGhhdCBjYW5ub3QgY3JlYXRlIGEgbmV3IGFkZHJlc3MnKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgdG8gY2xpZW50LXNpZGUgYWRkcmVzcyB2YWxpZGF0aW9uIG9uLCBmb3Igc2FmZXR5LiBVc2UgdmFsaWRhdGU9ZmFsc2UgdG8gZGlzYWJsZS5cbiAgY29uc3Qgc2hvdWxkVmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy52YWxpZGF0ZSA6IHRoaXMuYml0Z28uZ2V0VmFsaWRhdGUoKTtcblxuICBjb25zdCBhbGxvd0V4aXN0aW5nID0gcGFyYW1zLmFsbG93RXhpc3Rpbmc7XG4gIGlmICh0eXBlb2YgYWxsb3dFeGlzdGluZyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgcGFyYW1zLmFsbG93RXhpc3RpbmcgPSBhbGxvd0V4aXN0aW5nID09PSAndHJ1ZSc7XG4gIH1cblxuICBjb25zdCBpc1NlZ3dpdCA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZW5hYmxlU2Vnd2l0O1xuICBjb25zdCBkZWZhdWx0Q2hhaW4gPSBpc1NlZ3dpdCA/IGdldEV4dGVybmFsQ2hhaW5Db2RlKCdwMnNoUDJ3c2gnKSA6IGdldEV4dGVybmFsQ2hhaW5Db2RlKCdwMnNoJyk7XG5cbiAgbGV0IGNoYWluID0gcGFyYW1zLmNoYWluO1xuICBpZiAoY2hhaW4gPT09IG51bGwgfHwgY2hhaW4gPT09IHVuZGVmaW5lZCkge1xuICAgIGNoYWluID0gZGVmYXVsdENoYWluO1xuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoJy9hZGRyZXNzLycgKyBjaGFpbikpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChhZGRyKSB7XG4gICAgICAgIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgICAgICAgIHNlbGYudmFsaWRhdGVBZGRyZXNzKGFkZHIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRyO1xuICAgICAgfSlcbiAgKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlIGFkZHJlc3MgbG9jYWxseSB3aXRob3V0IGNhbGxpbmcgc2VydmVyXG4gKiBAcGFyYW0gcGFyYW1zXG4gKlxuICovXG5XYWxsZXQucHJvdG90eXBlLmdlbmVyYXRlQWRkcmVzcyA9IGZ1bmN0aW9uICh7IHNlZ3dpdCwgcGF0aCwga2V5Y2hhaW5zLCB0aHJlc2hvbGQgfSkge1xuICBjb25zdCBpc1NlZ3dpdCA9ICEhc2Vnd2l0O1xuICBsZXQgc2lnbmF0dXJlVGhyZXNob2xkID0gMjtcbiAgaWYgKF8uaXNJbnRlZ2VyKHRocmVzaG9sZCkpIHtcbiAgICBzaWduYXR1cmVUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG4gICAgaWYgKHNpZ25hdHVyZVRocmVzaG9sZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBoYXMgdG8gYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXRoUmVnZXggPSAvXlxcLzE/WzAxXVxcL1xcZCskLztcbiAgaWYgKCFwYXRoLm1hdGNoKHBhdGhSZWdleCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIHBhdGg6ICcgKyBwYXRoKTtcbiAgfVxuXG4gIGxldCByb290S2V5cyA9IHRoaXMua2V5Y2hhaW5zO1xuICBpZiAoQXJyYXkuaXNBcnJheShrZXljaGFpbnMpKSB7XG4gICAgcm9vdEtleXMgPSBrZXljaGFpbnM7XG4gIH1cblxuICBjb25zdCBuZXR3b3JrID0gY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS5uZXR3b3JrO1xuXG4gIGNvbnN0IGRlcml2ZWRLZXlzID0gcm9vdEtleXMubWFwKGZ1bmN0aW9uIChrKSB7XG4gICAgY29uc3QgaGRub2RlID0gYmlwMzIuZnJvbUJhc2U1OChrLnhwdWIpO1xuICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gay5wYXRoICsgKGsud2FsbGV0U3ViUGF0aCB8fCAnJykgKyBwYXRoO1xuICAgIHJldHVybiBoZG5vZGUuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgoZGVyaXZhdGlvblBhdGgpKS5wdWJsaWNLZXk7XG4gIH0pO1xuXG4gIGNvbnN0IHBhdGhDb21wb25lbnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICBjb25zdCBub3JtYWxpemVkUGF0aENvbXBvbmVudHMgPSBfLm1hcChwYXRoQ29tcG9uZW50cywgKGNvbXBvbmVudCkgPT4ge1xuICAgIGlmIChjb21wb25lbnQgJiYgY29tcG9uZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBwYXJzZUludChjb21wb25lbnQsIDEwKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBwYXRoRGV0YWlscyA9IF8uZmlsdGVyKG5vcm1hbGl6ZWRQYXRoQ29tcG9uZW50cywgXy5pc0ludGVnZXIpO1xuXG4gIGNvbnN0IGFkZHJlc3NEZXRhaWxzOiBhbnkgPSB7XG4gICAgY2hhaW5QYXRoOiBwYXRoLFxuICAgIHBhdGg6IHBhdGgsXG4gICAgY2hhaW46IHBhdGhEZXRhaWxzWzBdLFxuICAgIGluZGV4OiBwYXRoRGV0YWlsc1sxXSxcbiAgICB3YWxsZXQ6IHRoaXMuaWQoKSxcbiAgfTtcblxuICBjb25zdCB7XG4gICAgc2NyaXB0UHViS2V5OiBvdXRwdXRTY3JpcHQsXG4gICAgcmVkZWVtU2NyaXB0LFxuICAgIHdpdG5lc3NTY3JpcHQsXG4gIH0gPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuY3JlYXRlT3V0cHV0U2NyaXB0Mm9mMyhkZXJpdmVkS2V5cywgaXNTZWd3aXQgPyAncDJzaFAyd3NoJyA6ICdwMnNoJyk7XG5cbiAgYWRkcmVzc0RldGFpbHMud2l0bmVzc1NjcmlwdCA9IHdpdG5lc3NTY3JpcHQ/LnRvU3RyaW5nKCdoZXgnKTtcbiAgYWRkcmVzc0RldGFpbHMucmVkZWVtU2NyaXB0ID0gcmVkZWVtU2NyaXB0Py50b1N0cmluZygnaGV4Jyk7XG4gIGFkZHJlc3NEZXRhaWxzLm91dHB1dFNjcmlwdCA9IG91dHB1dFNjcmlwdC50b1N0cmluZygnaGV4Jyk7XG4gIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3MgPSB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIGdldE5ldHdvcmsobmV0d29yaykpO1xuXG4gIHJldHVybiBhZGRyZXNzRGV0YWlscztcbn07XG5cbi8vXG4vLyB2YWxpZGF0ZUFkZHJlc3Ncbi8vIFZhbGlkYXRlcyBhbiBhZGRyZXNzIGFuZCBwYXRoIGJ5IGNhbGN1bGF0aW5nIGl0IGxvY2FsbHkgZnJvbSB0aGUga2V5Y2hhaW4geHB1YnNcbi8vXG5XYWxsZXQucHJvdG90eXBlLnZhbGlkYXRlQWRkcmVzcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJywgJ3BhdGgnXSwgW10pO1xuICBjb25zdCBpc1NlZ3dpdCA9ICEhcGFyYW1zLndpdG5lc3NTY3JpcHQgJiYgcGFyYW1zLndpdG5lc3NTY3JpcHQubGVuZ3RoID4gMDtcblxuICBjb25zdCBnZW5lcmF0ZWRBZGRyZXNzID0gdGhpcy5nZW5lcmF0ZUFkZHJlc3MoeyBwYXRoOiBwYXJhbXMucGF0aCwgc2Vnd2l0OiBpc1NlZ3dpdCB9KTtcbiAgaWYgKGdlbmVyYXRlZEFkZHJlc3MuYWRkcmVzcyAhPT0gcGFyYW1zLmFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiAnICsgcGFyYW1zLmFkZHJlc3MgKyAnIHZzLiAnICsgZ2VuZXJhdGVkQWRkcmVzcy5hZGRyZXNzKTtcbiAgfVxufTtcblxuLy9cbi8vIGFkZHJlc3Nlc1xuLy8gR2V0cyB0aGUgYWRkcmVzc2VzIG9mIGEgSEQgd2FsbGV0LlxuLy8gT3B0aW9ucyBpbmNsdWRlOlxuLy8gIGxpbWl0OiB0aGUgbnVtYmVyIG9mIGFkZHJlc3NlcyB0byBnZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFkZHJlc3NlcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgcXVlcnk6IGFueSA9IHt9O1xuICBpZiAocGFyYW1zLmRldGFpbHMpIHtcbiAgICBxdWVyeS5kZXRhaWxzID0gMTtcbiAgfVxuXG4gIGNvbnN0IGNoYWluID0gcGFyYW1zLmNoYWluO1xuICBpZiAoY2hhaW4gIT09IG51bGwgJiYgY2hhaW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoYWluKSkge1xuICAgICAgcXVlcnkuY2hhaW4gPSBfLnVuaXEoXy5maWx0ZXIoY2hhaW4sIF8uaXNJbnRlZ2VyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGFpbiAhPT0gMCAmJiBjaGFpbiAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2hhaW4gYXJndW1lbnQsIGV4cGVjdGluZyAwIG9yIDEnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWluID0gY2hhaW47XG4gICAgfVxuICB9XG4gIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgfVxuICBpZiAocGFyYW1zLnNraXApIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5za2lwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkuc2tpcCA9IHBhcmFtcy5za2lwO1xuICB9XG4gIGlmIChwYXJhbXMuc29ydCkge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuc29ydCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzb3J0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LnNvcnQgPSBwYXJhbXMuc29ydDtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzc2VzJyk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5xdWVyeShxdWVyeSkucmVzdWx0KCkpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuc3RhdHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdsaW1pdD0nICsgcGFyYW1zLmxpbWl0KTtcbiAgfVxuICBsZXQgcXVlcnkgPSAnJztcbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSAnPycgKyBhcmdzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvc3RhdHMnICsgcXVlcnkpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMge1dhbGxldH1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAvLyB3aGVuIHNldCB0byB0cnVlLCBncGsgcmV0dXJucyB0aGUgcHJpdmF0ZSBkYXRhIG9mIHNhZmUgd2FsbGV0c1xuICAgIGNvbnN0IHF1ZXJ5ID0gXy5leHRlbmQoe30sIF8ucGljayhwYXJhbXMsIFsnZ3BrJ10pKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCkpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHRoaXMud2FsbGV0ID0gcmVzO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gYWRkcmVzc1xuLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBhZGRyZXNzIG9uIGEgSEQgd2FsbGV0LlxuLy8gSW5mb3JtYXRpb24gaW5jbHVkZXMgaW5kZXgsIHBhdGgsIHJlZGVlbVNjcmlwdCwgc2VudCwgcmVjZWl2ZWQsIHR4Q291bnQgYW5kIGJhbGFuY2Vcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBhZGRyZXNzOiB0aGUgYWRkcmVzcyBvbiB0aGlzIHdhbGxldCB0byBnZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzc2VzLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEZyZWV6ZSB0aGUgd2FsbGV0IGZvciBhIGR1cmF0aW9uIG9mIGNob2ljZSwgc3RvcHBpbmcgQml0R28gZnJvbSBzaWduaW5nIGFueSB0cmFuc2FjdGlvbnMuXG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgVGhlIGR1cmF0aW9uIHRvIGZyZWV6ZSB0aGUgd2FsbGV0IGZvciBpbiBzZWNvbmRzLCBkZWZhdWx0cyB0byAzNjAwLlxuICovXG5XYWxsZXQucHJvdG90eXBlLmZyZWV6ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgIGlmICghXy5pc051bWJlcihwYXJhbXMuZHVyYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZHVyYXRpb24gLSBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ZyZWV6ZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVcbi8vIERlbGV0ZXMgdGhlIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gbGFiZWxzXG4vLyBMaXN0IHRoZSBsYWJlbHMgZm9yIHRoZSBhZGRyZXNzZXMgaW4gYSBnaXZlbiB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmxhYmVscyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgnbGFiZWxzJykpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVuYW1lIGEgd2FsbGV0XG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgLSBsYWJlbDogdGhlIHdhbGxldCdzIGludGVuZGVkIG5ldyBuYW1lXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnNldFdhbGxldE5hbWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnbGFiZWwnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2V0TGFiZWxcbi8vIFNldHMgYSBsYWJlbCBvbiB0aGUgcHJvdmlkZWQgYWRkcmVzc1xuLy9cbldhbGxldC5wcm90b3R5cGUuc2V0TGFiZWwgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdsYWJlbCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghc2VsZi5iaXRnby52ZXJpZnlBZGRyZXNzKHsgYWRkcmVzczogcGFyYW1zLmFkZHJlc3MgfSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcGFyYW1zLmFkZHJlc3MpO1xuICB9XG5cbiAgY29uc3QgdXJsID0gdGhpcy5iaXRnby51cmwoJy9sYWJlbHMvJyArIHRoaXMuaWQoKSArICcvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZCh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBkZWxldGVMYWJlbFxuLy8gRGVsZXRlcyB0aGUgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVMYWJlbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzZWxmLmJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuYWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpICsgJy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHVuc3BlbnRzXG4vLyBMaXN0IEFMTCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4vLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIHBhZ2VkIGxpc3Qgb2YgYWxsIHVuc3BlbnRzXG4vL1xuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICBsaW1pdDogIHRoZSBvcHRpb25hbCBsaW1pdCBvZiB1bnNwZW50cyB0byBjb2xsZWN0IGluIEJUQ1xuLy8gICBtaW5Db25mOiBvbmx5IGluY2x1ZGUgcmVzdWx0cyB3aXRoIHRoaXMgbnVtYmVyIG9mIGNvbmZpcm1hdGlvbnNcbi8vICAgdGFyZ2V0OiB0aGUgYW1vdW50IG9mIGJ0YyB0byBmaW5kIHRvIHNwZW5kXG4vLyAgIGluc3RhbnQ6IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuLy9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGFsbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBjb25zdCBnZXRVbnNwZW50c0JhdGNoID0gZnVuY3Rpb24gKHNraXAsIGxpbWl0Pykge1xuICAgIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcbiAgICBpZiAoc2tpcCA+IDApIHtcbiAgICAgIHF1ZXJ5T2JqZWN0LnNraXAgPSBza2lwO1xuICAgIH1cbiAgICBpZiAobGltaXQgJiYgbGltaXQgPiAwKSB7XG4gICAgICBxdWVyeU9iamVjdC5saW1pdCA9IGxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBzZWxmLnVuc3BlbnRzUGFnZWQocXVlcnlPYmplY3QpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgLy8gVGhlIEFQSSBoYXMgaXRzIG93biBsaW1pdCBoYW5kbGluZy4gRm9yIGV4YW1wbGUsIHRoZSBBUEkgZG9lcyBub3Qgc3VwcG9ydCBsaW1pdHMgYmlnZ2VyIHRoYW4gNTAwLiBJZiB0aGUgbGltaXRcbiAgICAgIC8vIHNwZWNpZmllZCBoZXJlIGlzIGJpZ2dlciB0aGFuIHRoYXQsIHdlIHdpbGwgaGF2ZSB0byBkbyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRoIG5lY2Vzc2FyeSBsaW1pdCBhZGp1c3RtZW50LlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudW5zcGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdW5zcGVudCA9IHJlc3VsdC51bnNwZW50c1tpXTtcbiAgICAgICAgYWxsVW5zcGVudHMucHVzaCh1bnNwZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gT3VyIGxpbWl0IGFkanVzdG1lbnQgbWFrZXMgc3VyZSB0aGF0IHdlIG5ldmVyIGZldGNoIG1vcmUgdW5zcGVudHMgdGhhbiB3ZSBuZWVkLCBtZWFuaW5nIHRoYXQgaWYgd2UgaGl0IHRoZVxuICAgICAgLy8gbGltaXQsIHdlIGhpdCBpdCBwcmVjaXNlbHlcbiAgICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gcGFyYW1zLmxpbWl0KSB7XG4gICAgICAgIHJldHVybiBhbGxVbnNwZW50czsgLy8gd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gYW55IGZ1cnRoZXIgdW5zcGVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG90YWxVbnNwZW50Q291bnQgPSByZXN1bHQudG90YWw7XG4gICAgICAvLyBpZiBubyB0YXJnZXQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgU0RLIGluZGljYXRlcyB0aGF0IHRoZXJlIGhhcyBiZWVuIGEgbGltaXQsIHdlIG5lZWQgdG8gZmV0Y2ggYW5vdGhlciBiYXRjaFxuICAgICAgaWYgKCFwYXJhbXMudGFyZ2V0ICYmIHRvdGFsVW5zcGVudENvdW50ICYmIHRvdGFsVW5zcGVudENvdW50ID4gYWxsVW5zcGVudHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZmV0Y2ggdGhlIG5leHQgYmF0Y2hcbiAgICAgICAgLy8gbGV0J3MganVzdCBvZmZzZXQgdGhlIGN1cnJlbnQgc2tpcCBieSB0aGUgY291bnRcbiAgICAgICAgY29uc3QgbmV3U2tpcCA9IHNraXAgKyByZXN1bHQuY291bnQ7XG4gICAgICAgIGxldCBuZXdMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobGltaXQgPiAwKSB7XG4gICAgICAgICAgLy8gd2Ugc2V0IHRoZSBuZXcgbGltaXQgdG8gYmUgcHJlY2lzZWx5IHRoZSBudW1iZXIgb2YgbWlzc2luZyB1bnNwZW50cyB0byBoaXQgb3VyIG93biBsaW1pdFxuICAgICAgICAgIG5ld0xpbWl0ID0gbGltaXQgLSBhbGxVbnNwZW50cy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2gobmV3U2tpcCwgbmV3TGltaXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWxsVW5zcGVudHM7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGdldFVuc3BlbnRzQmF0Y2goMCwgcGFyYW1zLmxpbWl0KS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIExpc3QgdGhlIHVuc3BlbnRzIChwYWdlZCkgZm9yIGEgZ2l2ZW4gd2FsbGV0LCByZXR1cm5pbmcgdGhlIHJlc3VsdCBhcyBhbiBvYmplY3Qgb2YgdW5zcGVudHMsIGNvdW50LCBza2lwIGFuZCB0b3RhbFxuICogVGhpcyBtZXRob2QgbWF5IG5vdCByZXR1cm4gYWxsIHRoZSB1bnNwZW50cyBhcyB0aGUgbGlzdCBpcyBwYWdlZCBieSB0aGUgQVBJXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcGFyYW0gcGFyYW1zLmxpbWl0IHRoZSBvcHRpb25hbCBsaW1pdCBvZiB1bnNwZW50cyB0byBjb2xsZWN0IGluIEJUQ1xuICogQHBhcmFtIHBhcmFtcy5za2lwIGluZGV4IGluIGxpc3Qgb2YgdW5zcGVudHMgdG8gc3RhcnQgcGFnaW5nIGZyb21cbiAqIEBwYXJhbSBwYXJhbXMubWluQ29uZmlybXMgb25seSBpbmNsdWRlIHJlc3VsdHMgd2l0aCB0aGlzIG51bWJlciBvZiBjb25maXJtYXRpb25zXG4gKiBAcGFyYW0gcGFyYW1zLnRhcmdldCB0aGUgYW1vdW50IG9mIGJ0YyB0byBmaW5kIHRvIHNwZW5kXG4gKiBAcGFyYW0gcGFyYW1zLmluc3RhbnQgb25seSBmaW5kIGluc3RhbnQgdHJhbnNhY3Rpb25zIChtdXN0IHNwZWNpZnkgYSB0YXJnZXQpXG4gKiBAcGFyYW0gcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzIGRlc2lyZWQgbnVtYmVyIG9mIHVuc3BlbnRzIHRvIGhhdmUgaW4gdGhlIHdhbGxldCBhZnRlciB0aGUgdHggZ29lcyB0aHJvdWdoIChyZXF1aXJlcyB0YXJnZXQpXG4gKiBAcGFyYW0gcGFyYW1zLm1pblNpemUgbWluaW11bSB1bnNwZW50IHNpemUgaW4gc2F0b3NoaXNcbiAqIEBwYXJhbSBwYXJhbXMuc2Vnd2l0IHJlcXVlc3Qgc2Vnd2l0IHVuc3BlbnRzIChkZWZhdWx0cyB0byB0cnVlIGlmIHVuZGVmaW5lZClcbiAqIEBwYXJhbSBwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQgYWxsb3cgc2Vnd2l0IHVuc3BlbnRzIGZvciBsZWRnZXIgZGV2aWNlcyAoZGVmYXVsdHMgdG8gZmFsc2UgaWYgdW5kZWZpbmVkKVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS51bnNwZW50c1BhZ2VkID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNraXApICYmICFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2tpcCAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pbkNvbmZpcm1zKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLm1pbkNvbmZpcm1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5Db25maXJtcyAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkgJiYgIV8uaXNOdW1iZXIocGFyYW1zLnRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdGFyZ2V0IC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuaW5zdGFudCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnN0YW50IGZsYWcgLSBzaG91bGQgYmUgYm9vbGVhbicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2Vnd2l0IGZsYWcgLSBzaG91bGQgYmUgYm9vbGVhbicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpICYmICFfLmlzSW50ZWdlcihwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcmdldFdhbGxldFVuc3BlbnRzIGZsYWcgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5TaXplKSAmJiAhXy5pc051bWJlcihwYXJhbXMubWluU2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQ6IG1pblNpemUgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuaW5zdGFudCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pbkNvbmZpcm1zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignb25seSBvbmUgb2YgaW5zdGFudCBhbmQgbWluQ29uZmlybXMgbWF5IGJlIGRlZmluZWQnKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXRXYWxsZXRVbnNwZW50cyBjYW4gb25seSBiZSBzcGVjaWZpZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIHRhcmdldCcpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuYWxsb3dMZWRnZXJTZWd3aXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50OiBhbGxvd0xlZGdlclNlZ3dpdCBtdXN0IGJlIGEgYm9vbGVhbicpO1xuICB9XG5cbiAgY29uc3QgcXVlcnlPYmplY3QgPSBfLmNsb25lRGVlcChwYXJhbXMpO1xuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSkge1xuICAgIC8vIHNraXAgYW5kIGxpbWl0IGFyZSB1bmF2YWlsYWJsZSB3aGVuIGEgdGFyZ2V0IGlzIHNwZWNpZmllZFxuICAgIGRlbGV0ZSBxdWVyeU9iamVjdC5za2lwO1xuICAgIGRlbGV0ZSBxdWVyeU9iamVjdC5saW1pdDtcbiAgfVxuXG4gIHF1ZXJ5T2JqZWN0LnNlZ3dpdCA9IHRydWU7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2Vnd2l0KSkge1xuICAgIHF1ZXJ5T2JqZWN0LnNlZ3dpdCA9IHBhcmFtcy5zZWd3aXQ7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSkge1xuICAgIHF1ZXJ5T2JqZWN0LmFsbG93TGVkZ2VyU2Vnd2l0ID0gcGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0O1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3Vuc3BlbnRzJykpLnF1ZXJ5KHF1ZXJ5T2JqZWN0KS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uc1xuLy8gTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuLy8gT3B0aW9ucyBpbmNsdWRlOlxuLy8gICAgIFRPRE86ICBBZGQgaXRlcmF0b3JzIGZvciBzdGFydC9jb3VudC9ldGNcbldhbGxldC5wcm90b3R5cGUudHJhbnNhY3Rpb25zID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdsaW1pdD0nICsgcGFyYW1zLmxpbWl0KTtcbiAgfVxuICBpZiAocGFyYW1zLnNraXApIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5za2lwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdza2lwPScgKyBwYXJhbXMuc2tpcCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5taW5IZWlnaHQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5IZWlnaHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluSGVpZ2h0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbWluSGVpZ2h0PScgKyBwYXJhbXMubWluSGVpZ2h0KTtcbiAgfVxuICBpZiAocGFyYW1zLm1heEhlaWdodCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1heEhlaWdodCkgfHwgcGFyYW1zLm1heEhlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtYXhIZWlnaHQgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbWF4SGVpZ2h0PScgKyBwYXJhbXMubWF4SGVpZ2h0KTtcbiAgfVxuICBpZiAocGFyYW1zLm1pbkNvbmZpcm1zKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWluQ29uZmlybXMpIHx8IHBhcmFtcy5taW5Db25maXJtcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtaW5Db25maXJtcyBhcmd1bWVudCwgZXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdtaW5Db25maXJtcz0nICsgcGFyYW1zLm1pbkNvbmZpcm1zKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmNvbXBhY3QpKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuY29tcGFjdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjb21wYWN0IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ2NvbXBhY3Q9JyArIHBhcmFtcy5jb21wYWN0KTtcbiAgfVxuICBsZXQgcXVlcnkgPSAnJztcbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgcXVlcnkgPSAnPycgKyBhcmdzLmpvaW4oJyYnKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvdHgnICsgcXVlcnkpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHRyYW5zYWN0aW9uXG4vLyBHZXQgYSB0cmFuc2FjdGlvbiBieSBJRCBmb3IgYSBnaXZlbiB3YWxsZXRcbldhbGxldC5wcm90b3R5cGUuZ2V0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3R4LycgKyBwYXJhbXMuaWQpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHBvbGxGb3JUcmFuc2FjdGlvblxuLy8gUG9sbCBhIHRyYW5zYWN0aW9uIHVudGlsIHN1Y2Nlc3NmdWwgb3IgdGltZXMgb3V0XG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBpZDogdGhlIHR4aWRcbi8vICAgZGVsYXk6IGRlbGF5IGJldHdlZW4gcG9sbHMgaW4gbXMgKGRlZmF1bHQ6IDEwMDApXG4vLyAgIHRpbWVvdXQ6IHRpbWVvdXQgaW4gbXMgKGRlZmF1bHQ6IDEwMDAwKVxuV2FsbGV0LnByb3RvdHlwZS5wb2xsRm9yVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG4gIGlmIChwYXJhbXMuZGVsYXkgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmRlbGF5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkZWxheSBwYXJhbWV0ZXInKTtcbiAgfVxuICBpZiAocGFyYW1zLnRpbWVvdXQgJiYgIV8uaXNOdW1iZXIocGFyYW1zLnRpbWVvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRpbWVvdXQgcGFyYW1ldGVyJyk7XG4gIH1cbiAgcGFyYW1zLmRlbGF5ID0gcGFyYW1zLmRlbGF5IHx8IDEwMDA7XG4gIHBhcmFtcy50aW1lb3V0ID0gcGFyYW1zLnRpbWVvdXQgfHwgMTAwMDA7XG5cbiAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpO1xuXG4gIGNvbnN0IGRvTmV4dFBvbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHNlbGZcbiAgICAgIC5nZXRUcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGVyci5zdGF0dXMgIT09IDQwNCB8fCBuZXcgRGF0ZSgpLnZhbHVlT2YoKSAtIHN0YXJ0LnZhbHVlT2YoKSA+IHBhcmFtcy50aW1lb3V0KSB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBwYXJhbXMuZGVsYXkpKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZG9OZXh0UG9sbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBkb05leHRQb2xsKCk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWRcbi8vIEdldCBhIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkIGZvciBhIGdpdmVuIHdhbGxldFxuV2FsbGV0LnByb3RvdHlwZS5nZXRXYWxsZXRUcmFuc2FjdGlvbkJ5U2VxdWVuY2VJZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eC9zZXF1ZW5jZS8nICsgcGFyYW1zLnNlcXVlbmNlSWQpO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodXJsKS5yZXN1bHQoKSkudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIEtleSBjaGFpbnNcbi8vIEdldHMgdGhlIHVzZXIga2V5IGNoYWluIGZvciB0aGlzIHdhbGxldFxuLy8gVGhlIHVzZXIga2V5IGNoYWluIGlzIHR5cGljYWxseSB0aGUgZmlyc3Qga2V5Y2hhaW4gb2YgdGhlIHdhbGxldCBhbmQgaGFzIHRoZSBlbmNyeXB0ZWQgeHByaXYgc3RvcmVkIG9uIEJpdEdvLlxuLy8gVXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdXNlcnMnIGtleWNoYWluIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgZGVjcnlwdGluZyB0byBzaWduIGEgdHJhbnNhY3Rpb24uXG5XYWxsZXQucHJvdG90eXBlLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB0cnlLZXlDaGFpbihpbmRleCkge1xuICAgICAgaWYgKCFzZWxmLmtleWNoYWlucyB8fCBpbmRleCA+PSBzZWxmLmtleWNoYWlucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignTm8gZW5jcnlwdGVkIGtleWNoYWlucyBvbiB0aGlzIHdhbGxldC4nKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdub19lbmNyeXB0ZWRfa2V5Y2hhaW5fb25fd2FsbGV0JztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgeHB1Yjogc2VsZi5rZXljaGFpbnNbaW5kZXhdLnhwdWIgfTtcblxuICAgICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCBzZWxmLmJpdGdvLmtleWNoYWlucygpLmdldChwYXJhbXMpO1xuICAgICAgLy8gSWYgd2UgZmluZCB0aGUgeHBydiwgdGhlbiB0aGlzIGlzIHByb2JhYmx5IHRoZSB1c2VyIGtleWNoYWluIHdlJ3JlIGxvb2tpbmcgZm9yXG4gICAgICBrZXljaGFpbi53YWxsZXRTdWJQYXRoID0gc2VsZi5rZXljaGFpbnNbaW5kZXhdLnBhdGg7XG4gICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ5S2V5Q2hhaW4oMCk7XG4gIH1cbiAgICAuY2FsbCh0aGlzKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlVHJhbnNhY3Rpb25cbi8vIENyZWF0ZSBhIHRyYW5zYWN0aW9uICh1bnNpZ25lZCkuIFRvIHNpZ24gaXQsIGRvIHNpZ25UcmFuc2FjdGlvblxuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIG9iamVjdCBvZiByZWNpcGllbnQgYWRkcmVzc2VzIGFuZCB0aGUgYW1vdW50IHRvIHNlbmQgdG8gZWFjaCBlLmcuIHthZGRyZXNzOjE1MDAsIGFkZHJlc3MyOjE1MDB9XG4vLyAgIGZlZSAgICAgIC0gdGhlIGJsb2NrY2hhaW4gZmVlIHRvIHNlbmQgKG9wdGlvbmFsKVxuLy8gICBmZWVSYXRlICAtIHRoZSBmZWUgcGVyIGtiIHRvIHNlbmQgKG9wdGlvbmFsKVxuLy8gICBtaW5Db25maXJtcyAtIG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1zIHRvIHVzZSB3aGVuIGdhdGhlcmluZyB1bnNwZW50c1xuLy8gICBmb3JjZUNoYW5nZUF0RW5kIC0gZm9yY2UgY2hhbmdlIGFkZHJlc3MgdG8gYmUgbGFzdCBvdXRwdXQgKG9wdGlvbmFsKVxuLy8gICBub1NwbGl0Q2hhbmdlIC0gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4vLyAgIGNoYW5nZUFkZHJlc3MgLSBvdmVycmlkZSB0aGUgY2hhbmdlIGFkZHJlc3MgKG9wdGlvbmFsKVxuLy8gICB2YWxpZGF0ZSAtIGV4dHJhIHZlcmlmaWNhdGlvbiBvZiBjaGFuZ2UgYWRkcmVzc2VzICh3aGljaCBhcmUgYWx3YXlzIHZlcmlmaWVkIHNlcnZlci1zaWRlKSAoZGVmYXVsdHMgdG8gZ2xvYmFsIGNvbmZpZylcbi8vIFJldHVybnM6XG4vLyAgIGNhbGxiYWNrKGVyciwgeyB0cmFuc2FjdGlvbkhleDogc3RyaW5nLCB1bnNwZW50czogW2lucHV0c10sIGZlZTogc2F0b3NoaXMgfSlcbldhbGxldC5wcm90b3R5cGUuY3JlYXRlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKFxuICAgICghXy5pc051bWJlcihwYXJhbXMuZmVlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlKSkgfHxcbiAgICAoIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSkgfHxcbiAgICAoIV8uaXNOdW1iZXIocGFyYW1zLm1pbkNvbmZpcm1zKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMubWluQ29uZmlybXMpKSB8fFxuICAgICghXy5pc0Jvb2xlYW4ocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kKSkgfHxcbiAgICAoIV8uaXNTdHJpbmcocGFyYW1zLmNoYW5nZUFkZHJlc3MpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSkgfHxcbiAgICAoIV8uaXNCb29sZWFuKHBhcmFtcy52YWxpZGF0ZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLnZhbGlkYXRlKSkgfHxcbiAgICAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuaW5zdGFudCkpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgb2JqZWN0Jyk7XG4gIH1cblxuICBwYXJhbXMudmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgIT09IHVuZGVmaW5lZCA/IHBhcmFtcy52YWxpZGF0ZSA6IHRoaXMuYml0Z28uZ2V0VmFsaWRhdGUoKTtcbiAgcGFyYW1zLndhbGxldCA9IHRoaXM7XG5cbiAgLy8gQXBwbHkgUFNCVCByb2xsb3V0IGxvZ2ljIChyZXNwZWN0cyBleHBsaWNpdCB1c2VQc2J0IGlmIHNldClcbiAgY29uc3Qgd2FudHNQc2J0ID0gc2hvdWxkVXNlUHNidCh0aGlzLmJpdGdvLCBwYXJhbXMudXNlUHNidCk7XG5cbiAgaWYgKHdhbnRzUHNidCkge1xuICAgIC8vIFRyeSBQU0JUIGZpcnN0LCBmYWxsIGJhY2sgdG8gbGVnYWN5IG9uIGZhaWx1cmVcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB1c2VQc2J0OiB0cnVlIH0pXG4gICAgICAudGhlbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgcmVzdWx0LnBzYnRBdHRlbXB0ID0geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChwc2J0RXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIC8vIFBTQlQgZmFpbGVkIC0gZmFsbCBiYWNrIHRvIGxlZ2FjeSBhbmQgY2FwdHVyZSBlcnJvciBmb3IgYmFja2VuZCByZXBvcnRpbmdcbiAgICAgICAgY29uc29sZS53YXJuKCdQU0JUIHRyYW5zYWN0aW9uIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGxlZ2FjeScpO1xuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uKHsgLi4ucGFyYW1zLCB1c2VQc2J0OiBmYWxzZSB9KS50aGVuKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIHJlc3VsdC5wc2J0QXR0ZW1wdCA9IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgc3RhY2s6IHBzYnRFcnJvci5zdGFjaz8uc3BsaXQoJ1xcbicpLnNsaWNlKDAsIDUpLmpvaW4oJ1xcbicpLCAvLyBGaXJzdCA1IGxpbmVzIG9ubHlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBwYXRoXG4gIHBhcmFtcy51c2VQc2J0ID0gZmFsc2U7XG4gIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2lnblRyYW5zYWN0aW9uXG4vLyBTaWduIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYW5zYWN0aW9uIHdpdGggYSBrZXljaGFpblxuLy8gUGFyYW1ldGVyczpcbi8vIHRyYW5zYWN0aW9uSGV4IC0gc2VyaWFsaXplZCBmb3JtIG9mIHRoZSB0cmFuc2FjdGlvbiBpbiBoZXhcbi8vIHVuc3BlbnRzIC0gYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoXG4vLyAgICAgICAgICAgIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZSBpbmRleCBhcyB0aGUgaW5wdXRzIGluIHRoZVxuLy8gICAgICAgICAgICB0cmFuc2FjdGlvbkhleFxuLy8ga2V5Y2hhaW4gLSBLZXljaGFpbiBjb250YWluaW5nIHRoZSB4cHJ2IHRvIHNpZ24gd2l0aC5cbi8vIHNpZ25pbmdLZXkgLSBGb3IgbGVnYWN5IHNhZmUgd2FsbGV0cywgdGhlIHByaXZhdGUga2V5IHN0cmluZy5cbi8vIHZhbGlkYXRlIC0gZXh0cmEgdmVyaWZpY2F0aW9uIG9mIHNpZ25hdHVyZXMgKHdoaWNoIGFyZSBhbHdheXMgdmVyaWZpZWQgc2VydmVyLXNpZGUpIChkZWZhdWx0cyB0byBnbG9iYWwgY29uZmlnKVxuLy8gUmV0dXJuczpcbi8vICAgY2FsbGJhY2soZXJyLCB0cmFuc2FjdGlvbilcbldhbGxldC5wcm90b3R5cGUuc2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG5cbiAgLy8gUm91dGUgdG8gUFNCVCBzaWduaW5nIGlmIHBhcmFtcy5wc2J0IGV4aXN0cyBPUiBpZiB0cmFuc2FjdGlvbkhleCBjb250YWlucyBhIFBTQlRcbiAgLy8gVXNlIHV0eG9saWIuYml0Z28uaXNQc2J0KCkgdG8gYXV0by1kZXRlY3QgUFNCVCBmb3JtYXQgaW4gdHJhbnNhY3Rpb25IZXhcbiAgaWYgKHBhcmFtcy5wc2J0IHx8IChwYXJhbXMudHJhbnNhY3Rpb25IZXggJiYgdXR4b2xpYi5iaXRnby5pc1BzYnQocGFyYW1zLnRyYW5zYWN0aW9uSGV4KSkpIHtcbiAgICBjb25zdCBwc2J0SGV4ID0gcGFyYW1zLnBzYnQgfHwgcGFyYW1zLnRyYW5zYWN0aW9uSGV4O1xuICAgIHJldHVybiB0cnlQcm9taXNlKCgpID0+IHNpZ25Qc2J0UmVxdWVzdCh7IHBzYnQ6IHBzYnRIZXgsIGtleWNoYWluOiBwYXJhbXMua2V5Y2hhaW4gfSkpXG4gICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiB7IHR4OiByZXN1bHQucHNidCB9O1xuICAgICAgfSlcbiAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgLmNhdGNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHJhbnNhY3Rpb25IZXgnXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkocGFyYW1zLnVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHRoZSB1bnNwZW50cyBhcnJheScpO1xuICB9XG5cbiAgaWYgKCghXy5pc09iamVjdChwYXJhbXMua2V5Y2hhaW4pIHx8ICFwYXJhbXMua2V5Y2hhaW4ueHBydikgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnNpZ25pbmdLZXkpKSB7XG4gICAgLy8gYWxsb3cgcGFzc2luZyBpbiBhIFdJRiBwcml2YXRlIGtleSBmb3IgbGVnYWN5IHNhZmUgd2FsbGV0IHN1cHBvcnRcbiAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3Rpbmcga2V5Y2hhaW4gb2JqZWN0IHdpdGggeHBydiBvciBzaWduaW5nS2V5IFdJRicpO1xuICAgIGVycm9yLmNvZGUgPSAnbWlzc2luZ19rZXljaGFpbl9vcl9zaWduaW5nS2V5JztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHBhcmFtcy52YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLnZhbGlkYXRlIDogdGhpcy5iaXRnby5nZXRWYWxpZGF0ZSgpO1xuICBwYXJhbXMuYml0Z28gPSB0aGlzLmJpdGdvO1xuICByZXR1cm4gVHJhbnNhY3Rpb25CdWlsZGVyLnNpZ25UcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHg6IHJlc3VsdC50cmFuc2FjdGlvbkhleCxcbiAgICAgIH07XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRcbi8vIFNlbmQgYSB0cmFuc2FjdGlvbiB0byB0aGUgQml0Y29pbiBuZXR3b3JrIHZpYSBCaXRHby5cbi8vIE9uZSBvZiB0aGUga2V5cyBpcyB0eXBpY2FsbHkgc2lnbmVkLCBhbmQgQml0R28gd2lsbCBzaWduIHRoZSBvdGhlciAoaWYgYXBwcm92ZWQpIGFuZCByZWxheSBpdCB0byB0aGUgUDJQIG5ldHdvcmsuXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICB0eCAgLSB0aGUgaGV4IGVuY29kZWQsIHNpZ25lZCB0cmFuc2FjdGlvbiB0byBzZW5kXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4J10sIFsnbWVzc2FnZScsICdvdHAnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcvdHgvc2VuZCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGJvZHkpIHtcbiAgICAgIGlmIChib2R5LnBlbmRpbmdBcHByb3ZhbCkge1xuICAgICAgICByZXR1cm4gXy5leHRlbmQoYm9keSwgeyBzdGF0dXM6ICdwZW5kaW5nQXBwcm92YWwnIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm9keS5vdHApIHtcbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKGJvZHksIHsgc3RhdHVzOiAnb3RwJyB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiAnYWNjZXB0ZWQnLFxuICAgICAgICB0eDogYm9keS50cmFuc2FjdGlvbixcbiAgICAgICAgaGFzaDogYm9keS50cmFuc2FjdGlvbkhhc2gsXG4gICAgICAgIGluc3RhbnQ6IGJvZHkuaW5zdGFudCxcbiAgICAgICAgaW5zdGFudElkOiBib2R5Lmluc3RhbnRJZCxcbiAgICAgIH07XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBTaGFyZSB0aGUgd2FsbGV0IHdpdGggYW4gZXhpc3RpbmcgQml0R28gdXNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIFRoZSByZWNpcGllbnQncyB1c2VyIGlkLCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHVzZXIgcmVjb3JkIGluIG91ciBkYXRhYmFzZS5cbiAqIEBwYXJhbSB7a2V5Y2hhaW59IGtleWNoYWluIFRoZSBrZXljaGFpbiB0byBiZSBzaGFyZWQgd2l0aCB0aGUgcmVjaXBpZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb25zIEEgY29tbWEtc2VwYXJhdGVkIHZhbHVlIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgcmVjaXBpZW50J3MgcGVybWlzc2lvbnMgaWYgdGhlIHNoYXJlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhpcyBzaGFyZS5cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVTaGFyZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1c2VyJywgJ3Blcm1pc3Npb25zJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICBpZiAoXG4gICAgICAhcGFyYW1zLmtleWNoYWluLnhwdWIgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnRvUHViS2V5IHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLnBhdGhcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZXMga2V5Y2hhaW4gcGFyYW1ldGVycyAtIHhwdWIsIGVuY3J5cHRlZFhwcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zaGFyZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVJbnZpdGVcbi8vIGludml0ZSBhIG5vbiBCaXRHbyBjdXN0b21lciB0byBqb2luIGEgd2FsbGV0XG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBlbWFpbCAtIHRoZSByZWNpcGllbnQncyBlbWFpbCBhZGRyZXNzXG4vLyAgIHBlcm1pc3Npb25zIC0gdGhlIHJlY2lwaWVudCdzIHBlcm1pc3Npb25zIGlmIHRoZSBzaGFyZSBpcyBhY2NlcHRlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUludml0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IG9wdGlvbnM6IGFueSA9IHtcbiAgICB0b0VtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgfTtcblxuICBpZiAocGFyYW1zLm1lc3NhZ2UpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvaW52aXRlJykpLnNlbmQob3B0aW9ucykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjb25maXJtSW52aXRlQW5kU2hhcmVXYWxsZXRcbi8vIGNvbmZpcm0gbXkgaW52aXRlIG9uIHRoaXMgd2FsbGV0IHRvIGEgcmVjaXBpZW50IHdobyBoYXNcbi8vIHN1YnNlcXVlbnRseSBzaWduZWQgdXAgYnkgY3JlYXRpbmcgdGhlIGFjdHVhbCB3YWxsZXQgc2hhcmVcbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHdhbGxldEludml0ZUlkIC0gdGhlIHdhbGxldCBpbnZpdGUgaWRcbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHJlcXVpcmVkIGlmIHRoZSB3YWxsZXQgc2hhcmUgc3VjY2VzcyBpcyBleHBlY3RlZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNvbmZpcm1JbnZpdGVBbmRTaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd3YWxsZXRJbnZpdGVJZCddLCBbJ3dhbGxldFBhc3NwaHJhc2UnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC53YWxsZXRzKClcbiAgICAubGlzdEludml0ZXMoKVxuICAgIC50aGVuKGZ1bmN0aW9uIChpbnZpdGVzKSB7XG4gICAgICBjb25zdCBvdXRnb2luZyA9IGludml0ZXMub3V0Z29pbmc7XG4gICAgICBjb25zdCBpbnZpdGUgPSBfLmZpbmQob3V0Z29pbmcsIGZ1bmN0aW9uIChvdXQpIHtcbiAgICAgICAgcmV0dXJuIG91dC5pZCA9PT0gcGFyYW1zLndhbGxldEludml0ZUlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoIWludml0ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldCBpbnZpdGUgbm90IGZvdW5kJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVtYWlsOiBpbnZpdGUudG9FbWFpbCxcbiAgICAgICAgcGVybWlzc2lvbnM6IGludml0ZS5wZXJtaXNzaW9ucyxcbiAgICAgICAgbWVzc2FnZTogaW52aXRlLm1lc3NhZ2UsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHNlbGYuc2hhcmVXYWxsZXQob3B0aW9ucyk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgcmV0dXJuIHRoaXMuYml0Z28ucHV0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0aW52aXRlLycgKyBwYXJhbXMud2FsbGV0SW52aXRlSWQpKTtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2VuZENvaW5zXG4vLyBTZW5kIGNvaW5zIHRvIGEgZGVzdGluYXRpb24gYWRkcmVzcyBmcm9tIHRoaXMgd2FsbGV0IHVzaW5nIHRoZSB1c2VyIGtleS5cbi8vIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJpdlxuLy8gMi4gRGVjcnlwdHMgdXNlciBrZXlcbi8vIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbi8vIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4vLyAzLiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBhZGRyZXNzIC0gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Ncbi8vICAgYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcyB0byBiZSBzZW50XG4vLyAgIG1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kQ29pbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBwYXJhbXMucmVjaXBpZW50cyA9IHt9O1xuICBwYXJhbXMucmVjaXBpZW50c1twYXJhbXMuYWRkcmVzc10gPSBwYXJhbXMuYW1vdW50O1xuXG4gIHJldHVybiB0aGlzLnNlbmRNYW55KHBhcmFtcykudGhlbihjYWxsYmFjaykuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIHNlbmRNYW55XG4vLyBTZW5kIGNvaW5zIHRvIG11bHRpcGxlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBmcm9tIHRoaXMgd2FsbGV0IHVzaW5nIHRoZSB1c2VyIGtleS5cbi8vIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJpdlxuLy8gMi4gRGVjcnlwdHMgdXNlciBrZXlcbi8vIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbi8vIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4vLyAzLiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gYXJyYXkgb2YgeyBhZGRyZXNzOiBzdHJpbmcsIGFtb3VudDogbnVtYmVyLCB0cmF2ZWxJbmZvOiBvYmplY3QgfSB0byBzZW5kIHRvXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIHhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0sIGlmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRNYW55ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydtZXNzYWdlJywgJ290cCddLCBjYWxsYmFjayk7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlUmF0ZSAtIG51bWJlciBleHBlY3RlZCcpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGluc3RhbnQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gIH1cblxuICBsZXQgYml0Z29GZWU7XG4gIGxldCB0cmF2ZWxJbmZvcztcbiAgbGV0IGZpbmFsUmVzdWx0O1xuICBsZXQgdW5zcGVudHNVc2VkO1xuXG4gIGNvbnN0IGFjY2VwdGVkQnVpbGRQYXJhbXMgPSBbXG4gICAgJ251bUJsb2NrcycsXG4gICAgJ2ZlZVJhdGUnLFxuICAgICdtaW5Db25maXJtcycsXG4gICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgJ3RhcmdldFdhbGxldFVuc3BlbnRzJyxcbiAgICAnbWVzc2FnZScsXG4gICAgJ21pblZhbHVlJyxcbiAgICAnbWF4VmFsdWUnLFxuICAgICdub1NwbGl0Q2hhbmdlJyxcbiAgICAnY29tbWVudCcsXG4gIF07XG4gIGNvbnN0IHByZXNlcnZlZEJ1aWxkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgYWNjZXB0ZWRCdWlsZFBhcmFtcyk7XG5cbiAgLy8gR2V0IHRoZSB1c2VyIGtleWNoYWluXG4gIGNvbnN0IHJldFByb21pc2UgPSB0aGlzLmNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpXG4gICAgLnRoZW4oZnVuY3Rpb24gKHRyYW5zYWN0aW9uKSB7XG4gICAgICAvLyBTZW5kIHRoZSB0cmFuc2FjdGlvblxuICAgICAgYml0Z29GZWUgPSB0cmFuc2FjdGlvbi5iaXRnb0ZlZTtcbiAgICAgIHRyYXZlbEluZm9zID0gdHJhbnNhY3Rpb24udHJhdmVsSW5mb3M7XG4gICAgICB1bnNwZW50c1VzZWQgPSB0cmFuc2FjdGlvbi51bnNwZW50cztcbiAgICAgIHJldHVybiBzZWxmLnNlbmRUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4OiB0cmFuc2FjdGlvbi50eCxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgICAgb3RwOiBwYXJhbXMub3RwLFxuICAgICAgICAvLyBUaGUgYmVsb3cgcGFyYW1zIGFyZSBmb3IgbG9nZ2luZyBvbmx5LCBhbmQgZG8gbm90IGltcGFjdCB0aGUgQVBJIGNhbGxcbiAgICAgICAgZXN0aW1hdGVkU2l6ZTogdHJhbnNhY3Rpb24uZXN0aW1hdGVkU2l6ZSxcbiAgICAgICAgYnVpbGRQYXJhbXM6IHByZXNlcnZlZEJ1aWxkUGFyYW1zLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBjb25zdCB0eCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHJlc3VsdC50eCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICAgIGNvbnN0IGlucHV0c1N1bSA9IF8uc3VtQnkodW5zcGVudHNVc2VkLCAndmFsdWUnKTtcbiAgICAgIGNvbnN0IG91dHB1dHNTdW0gPSBfLnN1bUJ5KHR4Lm91dHMsICd2YWx1ZScpO1xuICAgICAgY29uc3QgZmVlVXNlZCA9IGlucHV0c1N1bSAtIG91dHB1dHNTdW07XG4gICAgICBpZiAoaXNOYU4oZmVlVXNlZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZlZVVzZWQnKTtcbiAgICAgIH1cbiAgICAgIChyZXN1bHQuZmVlID0gZmVlVXNlZCksIChyZXN1bHQuZmVlUmF0ZSA9IChmZWVVc2VkICogMTAwMCkgLyB0eC52aXJ0dWFsU2l6ZSgpKTtcbiAgICAgIHJlc3VsdC50cmF2ZWxJbmZvcyA9IHRyYXZlbEluZm9zO1xuICAgICAgaWYgKGJpdGdvRmVlKSB7XG4gICAgICAgIHJlc3VsdC5iaXRnb0ZlZSA9IGJpdGdvRmVlO1xuICAgICAgfVxuICAgICAgZmluYWxSZXN1bHQgPSByZXN1bHQ7XG5cbiAgICAgIC8vIEhhbmRsZSBzZW5kaW5nIHRyYXZlbCBpbmZvcyBpZiB0aGV5IGV4aXN0LCBidXQgbWFrZSBzdXJlIHdlIG5ldmVyIGZhaWwgaGVyZS5cbiAgICAgIC8vIEVycm9yIG9yIHJlc3VsdCAod2l0aCBwb3NzaWJsZSBzdWItZXJyb3JzKSB3aWxsIGJlIHByb3ZpZGVkIGluIHRyYXZlbFJlc3VsdFxuICAgICAgaWYgKHRyYXZlbEluZm9zICYmIHRyYXZlbEluZm9zLmxlbmd0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBzZWxmXG4gICAgICAgICAgICAucG9sbEZvclRyYW5zYWN0aW9uKHsgaWQ6IHJlc3VsdC5oYXNoIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmLmJpdGdvLnRyYXZlbFJ1bGUoKS5zZW5kTWFueShyZXN1bHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0gcmVzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgIC8vIGNhdGNoIGFzeW5jIGVycm9yc1xuICAgICAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSB7IGVycm9yOiBlcnIubWVzc2FnZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIGNhdGNoIHN5bmNocm9ub3VzIGVycm9yc1xuICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHsgZXJyb3I6IGVyci5tZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmaW5hbFJlc3VsdDtcbiAgICB9KTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXRQcm9taXNlKS50aGVuKGNhbGxiYWNrKS5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEFjY2VsZXJhdGUgYSBzdHVjayB0cmFuc2FjdGlvbiB1c2luZyBDaGlsZC1QYXlzLUZvci1QYXJlbnQgKENQRlApLlxuICpcbiAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc3R1Y2sgdHJhbnNhY3Rpb25zIHdoaWNoIGhhdmUgbm8gdW5jb25maXJtZWQgaW5wdXRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBJbnB1dCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRyYW5zYWN0aW9uSUQgLSBJRCBvZiB0cmFuc2FjdGlvbiB0byBhY2NlbGVyYXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBOZXcgZWZmZWN0aXZlIGZlZSByYXRlIGZvciBzdHVjayB0cmFuc2FjdGlvbiAoc2F0IHBlciAxMDAwIGJ5dGVzKVxuICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgLSBNYXhpbXVtIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlIGZyb20gdGhlIHdhbGxldCB0byBjb3ZlciBhbnkgY2hpbGQgZmVlcyB0aGF0IHRoZSBwYXJlbnQgdW5zcGVudCBvdXRwdXQgY2Fubm90IGNvdmVyLiBEZWZhdWx0cyB0byAxMDAuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSBUaGUgcGFzc3BocmFzZSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB3YWxsZXQgcHJpdmF0ZSBrZXkuIE9uZSBvZiBlaXRoZXIgd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGlzIHJlcXVpcmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gVGhlIHByaXZhdGUga2V5IGZvciB0aGUgd2FsbGV0LiBPbmUgb2YgZWl0aGVyIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBpcyByZXF1aXJlZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyBSZXN1bHQgb2Ygc2VuZFRyYW5zYWN0aW9uKCkgb24gdGhlIGNoaWxkIHRyYW5zYWN0aW9uXG4gKi9cbldhbGxldC5wcm90b3R5cGUuYWNjZWxlcmF0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gYWNjZWxlcmF0ZVRyYW5zYWN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXN0aW1hdGUgYSB0cmFuc2FjdGlvbnMgc2l6ZSBpbiB2aXJ0dWFsIGJ5dGVzLlxuICAgKiBBY3R1YWwgdHJhbnNhY3Rpb25zIG1heSBiZSBzbGlnaHRseSBmZXdlciB2aXJ0dWFsIGJ5dGVzLCBkdWUgdG9cbiAgICogdGhlIGZhY3QgdGhhdCB2YWxpZCBFQ1NEQSBzaWduYXR1cmVzIGhhdmUgYSB2YXJpYWJsZSBsZW5ndGhcbiAgICogYmV0d2VlbiA4IGFuZCA3MyB2aXJ0dWFsIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzLnNlZ3dpdCBUaGUgbnVtYmVyIG9mIHNlZ3dpdCBpbnB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBpbnB1dHMuUDJTSCBUaGUgbnVtYmVyIG9mIFAyU0ggaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gaW5wdXRzLlAyUEtIIFRoZSBudW1iZXIgb2YgUDJQS0ggaW5wdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgY29uc3QgZXN0aW1hdGVUeFZTaXplID0gKGlucHV0cykgPT4ge1xuICAgIGNvbnN0IHNlZ3dpdCA9IGlucHV0cy5zZWd3aXQgfHwgMDtcbiAgICBjb25zdCBQMlNIID0gaW5wdXRzLlAyU0ggfHwgMDtcbiAgICBjb25zdCBQMlBLSCA9IGlucHV0cy5QMlBLSCB8fCAwO1xuXG4gICAgY29uc3QgY2hpbGRGZWVJbmZvID0gVHJhbnNhY3Rpb25CdWlsZGVyLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyh7XG4gICAgICBuUDJzaElucHV0czogUDJTSCxcbiAgICAgIG5QMnBraElucHV0czogUDJQS0gsXG4gICAgICBuUDJzaFAyd3NoSW5wdXRzOiBzZWd3aXQsXG4gICAgICBuT3V0cHV0czogMSxcbiAgICAgIGZlZVJhdGU6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2hpbGRGZWVJbmZvLnNpemU7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoYXQgc2hvdWxkIGJlIHBhaWQgaW4gZmVlcyBieSB0aGUgY2hpbGQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIGlucHV0cyBJbnB1dHMgdG8gdGhlIGNoaWxkIHRyYW5zYWN0aW9uIHdoaWNoIGFyZSBwYXNzZWQgdG8gZXN0aW1hdGVUeFZTaXplXG4gICAqIEBwYXJhbSBwYXJlbnRGZWUgVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgcGFyZW50IHR4IG9yaWdpbmFsbHkgcGFpZCBpbiBmZWVzXG4gICAqIEBwYXJhbSBwYXJlbnRWU2l6ZSBUaGUgbnVtYmVyIG9mIHZpcnR1YWwgYnl0ZXMgaW4gdGhlIHBhcmVudCB0eFxuICAgKiBAcGFyYW0gZmVlUmF0ZSBUaGUgbmV3IGZlZSByYXRlIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5IHRoZSBjb21iaW5lZCBDUEZQIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhlIGNoaWxkIHR4IHNob3VsZCBwYXkgaW4gZmVlc1xuICAgKi9cbiAgY29uc3QgZXN0aW1hdGVDaGlsZEZlZSA9ICh7IGlucHV0cywgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgZmVlUmF0ZSB9KSA9PiB7XG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIG1vcmUgd2UgKnNob3VsZCogaGF2ZSBwYWlkIGluIHBhcmVudCBmZWVzLFxuICAgIC8vIGhhZCB0aGUgcGFyZW50IGJlZW4gb3JpZ2luYWxseSBzZW50IHdpdGggdGhlIG5ldyBmZWUgcmF0ZVxuICAgIGNvbnN0IGFkZGl0aW9uYWxQYXJlbnRGZWUgPSBfLmNlaWwoKHBhcmVudFZTaXplICogZmVlUmF0ZSkgLyAxMDAwKSAtIHBhcmVudEZlZTtcblxuICAgIC8vIGNhbGN1bGF0ZSBob3cgbXVjaCB3ZSB3b3VsZCBwYXkgaW4gZmVlcyBmb3IgdGhlIGNoaWxkLFxuICAgIC8vIGlmIGl0IHdlcmUgb25seSBwYXlpbmcgZm9yIGl0c2VsZiBhdCB0aGUgbmV3IGZlZSByYXRlXG4gICAgY29uc3QgY2hpbGRGZWUgPSAoZXN0aW1hdGVUeFZTaXplKGlucHV0cykgKiBmZWVSYXRlKSAvIDEwMDA7XG5cbiAgICByZXR1cm4gXy5jZWlsKGNoaWxkRmVlICsgYWRkaXRpb25hbFBhcmVudEZlZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlIHRvIHBheSB0aGUgY2hpbGQgdHggZmVlcy5cbiAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdGhlIHBhcmVudCB0eCBvdXRwdXQgaXMgbm90IHN1ZmZpY2llbnQgdG9cbiAgICogY292ZXIgdGhlIHRvdGFsIGZlZXMgd2hpY2ggc2hvdWxkIGJlIHBhaWQgYnkgdGhlIGNoaWxkIHR4LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIElucHV0cyB0byB0aGUgY2hpbGQgdHJhbnNhY3Rpb24gd2hpY2ggYXJlIHBhc3NlZCB0byBlc3RpbWF0ZVR4VlNpemVcbiAgICogQHBhcmFtIHBhcmVudE91dHB1dFZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgb3V0cHV0IGZyb20gdGhlIHBhcmVudCB0eCB3aGljaCB3ZSBhcmUgdXNpbmcgYXMgYW4gaW5wdXQgdG8gdGhlIGNoaWxkIHR4XG4gICAqIEBwYXJhbSBwYXJlbnRGZWUgVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgcGFyZW50IHR4IG9yaWdpbmFsbHkgcGFpZCBpbiBmZWVzXG4gICAqIEBwYXJhbSBwYXJlbnRWU2l6ZSBUaGUgbnVtYmVyIG9mIHZpcnR1YWwgYnl0ZXMgaW4gdGhlIHBhcmVudCB0eFxuICAgKiBAcGFyYW0gbWF4VW5zcGVudHMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZGl0aW9uYWwgdW5zcGVudHMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gY292ZXIgdGhlIHJlbWFpbmluZyBjaGlsZCBmZWVzXG4gICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIHVzZSwgdGhlIHVwZGF0ZWQgbnVtYmVyIG9mIHNhdG9zaGlzIHdoaWNoIHNob3VsZCBiZSBwYWlkIGJ5XG4gICAqICAgICAgICAgIHRoZSBjaGlsZCB0eCwgYW5kIHRoZSB1cGRhdGVkIGlucHV0cyBmb3IgdGhlIGNoaWxkIHR4LlxuICAgKi9cbiAgY29uc3QgZmluZEFkZGl0aW9uYWxVbnNwZW50cyA9ICh7IGlucHV0cywgcGFyZW50T3V0cHV0VmFsdWUsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIG1heFVuc3BlbnRzIH0pID0+IHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY29GaW5kQWRkaXRpb25hbFVuc3BlbnRzKCkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAvLyBhc2sgdGhlIHNlcnZlciBmb3IgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWUsIGFzc3VtaW5nXG4gICAgICAvLyB0aGF0IGl0IGNhbiBiZSBkb25lIHdpdGhvdXQgYWRkaXRpb25hbCB1bnNwZW50cyAod2hpY2ggaXMgbm90IHBvc3NpYmxlLFxuICAgICAgLy8gc2luY2UgaWYgdGhhdCB3ZXJlIHRoZSBjYXNlLCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzIHdvdWxkIG5vdCBoYXZlIGJlZW5cbiAgICAgIC8vIGNhbGxlZCBpbiB0aGUgZmlyc3QgcGxhY2UuIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgYmVmb3JlIHJldHVybmluZylcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgbGV0IHVuY292ZXJlZENoaWxkRmVlID0gY3VycmVudENoaWxkRmVlRXN0aW1hdGUgLSBwYXJlbnRPdXRwdXRWYWx1ZTtcblxuICAgICAgd2hpbGUgKHVuY292ZXJlZENoaWxkRmVlID4gMCAmJiBhZGRpdGlvbmFsVW5zcGVudHMubGVuZ3RoIDwgbWF4VW5zcGVudHMpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGdldCBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkIGZlZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9IChhd2FpdCB0aGlzLnVuc3BlbnRzKHtcbiAgICAgICAgICBtaW5Db25maXJtczogMSxcbiAgICAgICAgICB0YXJnZXQ6IHVuY292ZXJlZENoaWxkRmVlLFxuICAgICAgICAgIGxpbWl0OiBtYXhVbnNwZW50cyAtIGFkZGl0aW9uYWxVbnNwZW50cy5sZW5ndGgsXG4gICAgICAgIH0pKSBhcyBhbnk7XG5cbiAgICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgdW5zcGVudHMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFkZGl0aW9uYWxVbnNwZW50VmFsdWUgPSAwO1xuXG4gICAgICAgIC8vIGNvbnN1bWUgYWxsIHVuc3BlbnRzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIsIGV2ZW4gaWYgd2UgZG9uJ3QgbmVlZFxuICAgICAgICAvLyBhbGwgb2YgdGhlbSB0byBjb3ZlciB0aGUgY2hpbGQgZmVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNlcnZlciB3aWxsXG4gICAgICAgIC8vIHJldHVybiBlbm91Z2ggdW5zcGVudCB2YWx1ZSB0byBlbnN1cmUgdGhhdCB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50XG4gICAgICAgIC8vIGlzIGFjaGlldmVkIGZvciB0aGUgY2hpbGQgdHgsIGFuZCB3ZSBjYW4ndCBsZWF2ZSBvdXQgdGhvc2UgdW5zcGVudHNcbiAgICAgICAgLy8gb3IgZWxzZSB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50IGNvbnN0cmFpbnQgY291bGQgYmUgdmlvbGF0ZWRcbiAgICAgICAgXy5mb3JFYWNoKHVuc3BlbnRzLCAodW5zcGVudCkgPT4ge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY2hpbGQgdHggaW5wdXRzXG4gICAgICAgICAgY29uc3QgdW5zcGVudENoYWluID0gZ2V0Q2hhaW4odW5zcGVudCk7XG4gICAgICAgICAgaWYgKGlzQ2hhaW5Db2RlKHVuc3BlbnRDaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnRDaGFpbikgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICAgICAgICBpbnB1dHMuc2Vnd2l0Kys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0cy5QMlNIKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRzLnB1c2godW5zcGVudCk7XG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRWYWx1ZSArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgICB1bmNvdmVyZWRDaGlsZEZlZSA9IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlIC0gcGFyZW50T3V0cHV0VmFsdWUgLSBhZGRpdGlvbmFsVW5zcGVudFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5jb3ZlcmVkQ2hpbGRGZWUgPiAwKSB7XG4gICAgICAgIC8vIFVuYWJsZSB0byBmaW5kIGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgY2hpbGQgZmVlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdWZmaWNpZW50IGNvbmZpcm1lZCB1bnNwZW50cyBhdmFpbGFibGUgdG8gY292ZXIgdGhlIGNoaWxkIGZlZWApO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3VuZCBlbm91Z2ggdW5zcGVudHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZGl0aW9uYWw6IGFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgbmV3Q2hpbGRGZWU6IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlLFxuICAgICAgICBuZXdJbnB1dHM6IGlucHV0cyxcbiAgICAgIH07XG4gICAgfS5jYWxsKHRoaXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGEgZnVsbCBjb3B5IChpbmNsdWRpbmcgd2l0bmVzcyBkYXRhKSBvZiBhbiBhcmJpdHJhcnkgdHggdXNpbmcgb25seSB0aGUgdHggaWQuXG4gICAqXG4gICAqIFdlIGhhdmUgdG8gdXNlIGFuIGV4dGVybmFsIHNlcnZpY2UgZm9yIHRoaXMgKGN1cnJlbnRseSBibG9ja3N0cmVhbS5pbmZvKSwgc2luY2VcbiAgICogdGhlIHYxIGluZGV4ZXIgc2VydmljZSAoYmFzZWQgb24gYml0Y29pbmopIGRvZXMgbm90IGhhdmUgc2Vnd2l0IHN1cHBvcnQgYW5kXG4gICAqIGRvZXMgbm90IHJldHVybiBhbnkgc2Vnd2l0IHJlbGF0ZWQgZmllbGRzIGluIHRoZSB0eCBoZXguXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnRUeElkIFRoZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gZ2V0IHRoZSBmdWxsIGhleCBvZlxuICAgKiBAcmV0dXJucyB7Qmx1ZWJpcmQ8YW55Pn0gVGhlIGZ1bGwgaGV4IGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRQYXJlbnRUeEhleCh7IHBhcmVudFR4SWQgfTogeyBwYXJlbnRUeElkOiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgZXhwbG9yZXJCYXNlVXJsID0gY29tbW9uLkVudmlyb25tZW50c1tzZWxmLmJpdGdvLmdldEVudigpXS5idGNFeHBsb3JlckJhc2VVcmw7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVxdWVzdC5nZXQoYCR7ZXhwbG9yZXJCYXNlVXJsfS90eC8ke3BhcmVudFR4SWR9L2hleGApO1xuXG4gICAgaWYgKCFyZXN1bHQudGV4dCB8fCAhLyhbYS1mMC05XXsyfSkrLy50ZXN0KHJlc3VsdC50ZXh0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBzdWNjZXNzZnVsbHkgcmVjZWl2ZSBwYXJlbnQgdHggaGV4LiBSZWNlaXZlZCAnJHtfLnRydW5jYXRlKHJlc3VsdC50ZXh0LCB7IGxlbmd0aDogMTAwIH0pfScgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjaGFpbiBmcm9tIGFuIHVuc3BlbnQgb3IgdHggb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0gb3V0cHV0T3JVbnNwZW50IFRoZSBvdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBjaGFpbiBzaG91bGQgYmUgZGV0ZXJtaW5lZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgY2hhaW4gZm9yIHRoZSBnaXZlbiBvdXRwdXQgb3IgdW5zcGVudFxuICAgKi9cbiAgY29uc3QgZ2V0Q2hhaW4gPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgaWYgKG91dHB1dE9yVW5zcGVudC5jaGFpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LmNoYWluO1xuICAgIH1cblxuICAgIGlmIChvdXRwdXRPclVuc3BlbnQuY2hhaW5QYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBfLnRvTnVtYmVyKG91dHB1dE9yVW5zcGVudC5jaGFpblBhdGguc3BsaXQoJy8nKVsxXSk7XG4gICAgfVxuXG4gICAgLy8gbm8gd2F5IHRvIHRlbGwgdGhlIGNoYWluLCBsZXQncyBqdXN0IGJsb3cgdXAgbm93IGluc3RlYWRcbiAgICAvLyBvZiBibG93aW5nIHVwIGxhdGVyIHdoZW4gdGhlIHVuZGVmaW5lZCByZXR1cm4gdmFsdWUgaXMgdXNlZC5cbiAgICAvLyBOb3RlOiBmb3IgdW5zcGVudHMgdGhlIGZpZWxkIHRvIHVzZSBpcyAnYWRkcmVzcycsIGJ1dCBmb3Igb3V0cHV0c1xuICAgIC8vIHRoZSBmaWVsZCB0byB1c2UgaXMgJ2FjY291bnQnXG4gICAgdGhyb3cgRXJyb3IoYENvdWxkIG5vdCBnZXQgY2hhaW4gZm9yIG91dHB1dCBvbiBhY2NvdW50ICR7b3V0cHV0T3JVbnNwZW50LmFjY291bnQgfHwgb3V0cHV0T3JVbnNwZW50LmFkZHJlc3N9YCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCB2YWx1ZSBjb250cmlidXRpb24gYW4gb3V0cHV0IG9yIHVuc3BlbnQgd2lsbFxuICAgKiBjb250cmlidXRlIHRvIGEgdHJhbnNhY3Rpb24sIHdlcmUgaXQgdG8gYmUgdXNlZC4gRWFjaCB0eXBlIG9mIG91dHB1dCBvciB1bnNwZW50XG4gICAqIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBjb250cmlidXRpb24gc2luY2UgZWFjaCB0eXBlIGhhcyBhIGRpZmZlcmVudCBudW1iZXJcbiAgICogb2YgdmlydHVhbCBieXRlcywgYW5kIHRodXMgd2lsbCBjYXVzZSBhIGRpZmZlcmVudCBmZWUgdG8gYmUgcGFpZC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dE9yVW5zcGVudCBPdXRwdXQgb3IgdW5zcGVudCB3aG9zZSBlZmZlY3RpdmUgdmFsdWUgc2hvdWxkIGJlIGRldGVybWluZWRcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGFjdHVhbCBudW1iZXIgb2Ygc2F0b3NoaXMgdGhhdCB0aGlzIHVuc3BlbnQgb3Igb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgIHdvdWxkIGNvbnRyaWJ1dGUgdG8gYSB0cmFuc2FjdGlvbiwgd2VyZSBpdCB0byBiZSB1c2VkLlxuICAgKi9cbiAgY29uc3QgZWZmZWN0aXZlVmFsdWUgPSAob3V0cHV0T3JVbnNwZW50KSA9PiB7XG4gICAgY29uc3QgY2hhaW4gPSBnZXRDaGFpbihvdXRwdXRPclVuc3BlbnQpO1xuICAgIGlmIChpc0NoYWluQ29kZShjaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKGNoYWluKSA9PT0gJ3Ayc2hQMndzaCcpIHtcbiAgICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSBpcyBpbiBieXRlcywgc28gd2UgbmVlZCB0byBjb252ZXJ0IHRvIGtCXG4gICAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LnZhbHVlIC0gKFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gICAgfVxuICAgIC8vIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgaXMgaW4gYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrQlxuICAgIHJldHVybiBvdXRwdXRPclVuc3BlbnQudmFsdWUgLSAoVmlydHVhbFNpemVzLnR4UDJzaElucHV0U2l6ZSAqIHBhcmFtcy5mZWVSYXRlKSAvIDEwMDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvcm91dGluZSB3aGljaCBhY3R1YWxseSBpbXBsZW1lbnRzIHRoZSBhY2NlbGVyYXRlVHJhbnNhY3Rpb24gYWxnb3JpdGhtXG4gICAqXG4gICAqIERlc2NyaWJlZCBhdCBhIGhpZ2ggbGV2ZWwsIHRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czpcbiAgICogMSkgRmluZCBhcHByb3ByaWF0ZSBvdXRwdXQgZnJvbSBwYXJlbnQgdHJhbnNhY3Rpb24gdG8gdXNlIGFzIGNoaWxkIHRyYW5zYWN0aW9uIGlucHV0XG4gICAqIDIpIEZpbmQgdW5zcGVudCBjb3JyZXNwb25kaW5nIHRvIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXQuIElmIG5vdCBmb3VuZCwgcmV0dXJuIHRvIHN0ZXAgMS5cbiAgICogMykgRGV0ZXJtaW5lIGlmIHBhcmVudCB0cmFuc2FjdGlvbiB1bnNwZW50IGNhbiBjb3ZlciBlbnRpcmUgY2hpbGQgZmVlLCBwbHVzIG1pbmltdW0gY2hhbmdlXG4gICAqIDQpIElmIHllcywgZ28gdG8gc3RlcCA2XG4gICAqIDUpIE90aGVyd2lzZSwgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIGZyb20gdGhlIHdhbGxldCB0byB1c2UgdG8gY292ZXIgdGhlIHJlbWFpbmluZyBjaGlsZCBmZWVcbiAgICogNikgQ3JlYXRlIGFuZCBzaWduIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiwgdXNpbmcgdGhlIHBhcmVudCB0cmFuc2FjdGlvbiBvdXRwdXRcbiAgICogICAgKGFuZCwgaWYgbmVjZXNzYXJ5LCBhZGRpdGlvbmFsIHdhbGxldCB1bnNwZW50cykgYXMgaW5wdXRzXG4gICAqIDcpIEJyb2FkY2FzdCB0aGUgbmV3IGNoaWxkIHRyYW5zYWN0aW9uXG4gICAqL1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY29BY2NlbGVyYXRlVHJhbnNhY3Rpb24oKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndHJhbnNhY3Rpb25JRCddLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgLy8gdmFsaWRhdGUgZmVlIHJhdGVcbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNGaW5pdGUocGFyYW1zLmZlZVJhdGUpIHx8IHBhcmFtcy5mZWVSYXRlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIgZm9yIHBhcmFtZXRlcjogZmVlUmF0ZScpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG1heFVuc3BlbnRzXG4gICAgaWYgKHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYnkgZGVmYXVsdCwgdXNlIGF0IG1vc3QgMTAwIGFkZGl0aW9uYWwgdW5zcGVudHMgKG5vdCBpbmNsdWRpbmcgdGhlIHVuc3BlbnQgb3V0cHV0IGZyb20gdGhlIHBhcmVudCB0eClcbiAgICAgIHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMgPSAxMDA7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzKSB8fCBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzIDw9IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdFeHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlciBmb3IgcGFyYW1ldGVyOiBtYXhBZGRpdGlvbmFsVW5zcGVudHMnKTtcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHBhcmVudFR4ID0gYXdhaXQgdGhpcy5nZXRUcmFuc2FjdGlvbih7IGlkOiBwYXJhbXMudHJhbnNhY3Rpb25JRCB9KTtcbiAgICBpZiAocGFyZW50VHguY29uZmlybWF0aW9ucyA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gJHtwYXJhbXMudHJhbnNhY3Rpb25JRH0gaXMgYWxyZWFkeSBjb25maXJtZWQgYW5kIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgb3V0cHV0cyBmcm9tIHRoZSBwYXJlbnQgdHggd2hpY2ggYXJlIHRvIG91ciB3YWxsZXRcbiAgICBjb25zdCB3YWxsZXRPdXRwdXRzID0gXy5maWx0ZXIocGFyZW50VHgub3V0cHV0cywgKG91dHB1dCkgPT4gb3V0cHV0LmlzTWluZSk7XG5cbiAgICBpZiAod2FsbGV0T3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9IGNvbnRhaW5zIG5vIG91dHB1dHMgdG8gdGhpcyB3YWxsZXQsIGFuZCB0aHVzIGNhbm5vdCBiZSBhY2NlbGVyYXRlZGBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdXNlIGFuIG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgd2l0aCBsYXJnZXN0IGVmZmVjdGl2ZSB2YWx1ZSxcbiAgICAvLyBidXQgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBvdXRwdXQgaXMgYWN0dWFsbHkgdW5zcGVudC5cbiAgICAvLyBBbiBvdXRwdXQgY291bGQgYmUgc3BlbnQgYWxyZWFkeSBpZiB0aGUgb3V0cHV0IHdhcyB1c2VkIGluIGFcbiAgICAvLyBjaGlsZCB0eCB3aGljaCBpdHNlbGYgaGFzIGJlY29tZSBzdHVjayBkdWUgdG8gbG93IGZlZXMgYW5kIGlzXG4gICAgLy8gYWxzbyB1bmNvbmZpcm1lZC5cbiAgICBjb25zdCBzb3J0ZWRPdXRwdXRzID0gXy5zb3J0Qnkod2FsbGV0T3V0cHV0cywgZWZmZWN0aXZlVmFsdWUpO1xuICAgIGxldCBwYXJlbnRVbnNwZW50VG9Vc2U7XG4gICAgbGV0IG91dHB1dFRvVXNlO1xuXG4gICAgd2hpbGUgKHNvcnRlZE91dHB1dHMubGVuZ3RoID4gMCAmJiBwYXJlbnRVbnNwZW50VG9Vc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0cHV0VG9Vc2UgPSBzb3J0ZWRPdXRwdXRzLnBvcCgpO1xuXG4gICAgICAvLyBmaW5kIHRoZSB1bnNwZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYXJ0aWN1bGFyIG91dHB1dFxuICAgICAgLy8gVE9ETzogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzIHVuc3BlbnQ/XG4gICAgICAvLyBUT0RPOiBUaGUgYmVzdCB3ZSBjYW4gZG8gaGVyZSBpcyBzZXQgbWluU2l6ZSA9IG1heFNpemUgPSBvdXRwdXRUb1VzZS52YWx1ZVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHVuc3BlbnRzUmVzdWx0ID0gYXdhaXQgdGhpcy51bnNwZW50cyh7XG4gICAgICAgIG1pblNpemU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgICBtYXhTaXplOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBwYXJlbnRVbnNwZW50VG9Vc2UgPSBfLmZpbmQodW5zcGVudHNSZXN1bHQsICh1bnNwZW50KSA9PiB7XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB1bnNwZW50IGJlbG9uZ3MgdG8gdGhlIGdpdmVuIHR4aWRcbiAgICAgICAgaWYgKHVuc3BlbnQudHhfaGFzaCAhPT0gcGFyYW1zLnRyYW5zYWN0aW9uSUQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFrZSBzdXJlIHVuc3BlbnQgaGFzIGNvcnJlY3Qgdl9vdXQgaW5kZXhcbiAgICAgICAgcmV0dXJuIHVuc3BlbnQudHhfb3V0cHV0X24gPT09IG91dHB1dFRvVXNlLnZvdXQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50VW5zcGVudFRvVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdW5zcGVudCBvdXRwdXQgZnJvbSBwYXJlbnQgdHggdG8gdXNlIGFzIGNoaWxkIGlucHV0YCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRoZSBmdWxsIGhleCBmb3IgdGhlIHBhcmVudCB0eCBhbmQgZGVjb2RlIGl0IHRvIGdldCBpdHMgdnNpemVcbiAgICBjb25zdCBwYXJlbnRUeEhleCA9IGF3YWl0IGdldFBhcmVudFR4SGV4KHsgcGFyZW50VHhJZDogcGFyYW1zLnRyYW5zYWN0aW9uSUQgfSk7XG4gICAgY29uc3QgZGVjb2RlZFBhcmVudCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHBhcmVudFR4SGV4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgIGNvbnN0IHBhcmVudFZTaXplID0gZGVjb2RlZFBhcmVudC52aXJ0dWFsU2l6ZSgpO1xuXG4gICAgLy8gbWFrZSBzdXJlIGlkIGZyb20gZGVjb2RlZCB0eCBhbmQgZ2l2ZW4gdHggaWQgbWF0Y2hcbiAgICAvLyB0aGlzIHNob3VsZCBjYXRjaCBwcm9ibGVtcyBlbWFuYXRpbmcgZnJvbSB0aGUgdXNlIG9mIGFuIGV4dGVybmFsIHNlcnZpY2VcbiAgICAvLyBmb3IgZ2V0dGluZyB0aGUgY29tcGxldGUgcGFyZW50IHR4IGhleFxuICAgIGlmIChkZWNvZGVkUGFyZW50LmdldElkKCkgIT09IHBhcmFtcy50cmFuc2FjdGlvbklEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWNvZGVkIHRyYW5zYWN0aW9uIGlkIGlzICR7ZGVjb2RlZFBhcmVudC5nZXRJZCgpfSwgd2hpY2ggZG9lcyBub3QgbWF0Y2ggZ2l2ZW4gdHhpZCAke3BhcmFtcy50cmFuc2FjdGlvbklEfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIG5ldyBmZWUgcmF0ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHBhcmVudCdzIGN1cnJlbnQgZmVlIHJhdGVcbiAgICAvLyB2aXJ0dWFsU2l6ZSBpcyByZXR1cm5lZCBpbiB2Ynl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrdkJcbiAgICBjb25zdCBwYXJlbnRSYXRlID0gKDEwMDAgKiBwYXJlbnRUeC5mZWUpIC8gcGFyZW50VlNpemU7XG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlIDw9IHBhcmVudFJhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBsb3dlciBmZWUgcmF0ZSEgKFBhcmVudCB0eCBmZWUgcmF0ZSBpcyAke3BhcmVudFJhdGV9IHNhdC9rQiwgYW5kIHJlcXVlc3RlZCBmZWUgcmF0ZSB3YXMgJHtwYXJhbXMuZmVlUmF0ZX0gc2F0L2tCKWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZGV0ZXJtaW5lIGlmIHBhcmVudCBvdXRwdXQgY2FuIGNvdmVyIGNoaWxkIGZlZVxuICAgIGNvbnN0IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID1cbiAgICAgIGlzQ2hhaW5Db2RlKG91dHB1dFRvVXNlLmNoYWluKSAmJiBzY3JpcHRUeXBlRm9yQ2hhaW4ob3V0cHV0VG9Vc2UuY2hhaW4pID09PSAncDJzaFAyd3NoJztcblxuICAgIGxldCBjaGlsZElucHV0cyA9IHtcbiAgICAgIHNlZ3dpdDogaXNQYXJlbnRPdXRwdXRTZWd3aXQgPyAxIDogMCxcbiAgICAgIFAyU0g6IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID8gMCA6IDEsXG4gICAgfTtcblxuICAgIGxldCBjaGlsZEZlZSA9IGVzdGltYXRlQ2hpbGRGZWUoe1xuICAgICAgaW5wdXRzOiBjaGlsZElucHV0cyxcbiAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgZmVlUmF0ZTogcGFyYW1zLmZlZVJhdGUsXG4gICAgICBwYXJlbnRWU2l6ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVuc3BlbnRzVG9Vc2UgPSBbcGFyZW50VW5zcGVudFRvVXNlXTtcblxuICAgIC8vIHRyeSB0byBnZXQgdGhlIG1pbiBjaGFuZ2Ugc2l6ZSBmcm9tIHRoZSBzZXJ2ZXIsIG90aGVyd2lzZSBkZWZhdWx0IHRvIDAuMSBCVENcbiAgICAvLyBUT0RPOiBtaW5DaGFuZ2VTaXplIGlzIG5vdCBjdXJyZW50bHkgYSBjb25zdGFudCBkZWZpbmVkIG9uIHRoZSBjbGllbnQgYW5kIHNob3VsZCBiZSBhZGRlZFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgbWluQ2hhbmdlU2l6ZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluQ2hhbmdlU2l6ZSB8fCAxZTc7XG5cbiAgICBpZiAob3V0cHV0VG9Vc2UudmFsdWUgPCBjaGlsZEZlZSArIG1pbkNoYW5nZVNpemUpIHtcbiAgICAgIC8vIHBhcmVudCBvdXRwdXQgY2Fubm90IGNvdmVyIGNoaWxkIGZlZSBwbHVzIHRoZSBtaW5pbXVtIGNoYW5nZSxcbiAgICAgIC8vIG11c3QgZmluZCBhZGRpdGlvbmFsIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBkaWZmZXJlbmNlXG4gICAgICBjb25zdCB7IGFkZGl0aW9uYWwsIG5ld0NoaWxkRmVlLCBuZXdJbnB1dHMgfSA9IGF3YWl0IGZpbmRBZGRpdGlvbmFsVW5zcGVudHMoe1xuICAgICAgICBpbnB1dHM6IGNoaWxkSW5wdXRzLFxuICAgICAgICBwYXJlbnRPdXRwdXRWYWx1ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICAgIHBhcmVudEZlZTogcGFyZW50VHguZmVlLFxuICAgICAgICBtYXhVbnNwZW50czogcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgcGFyZW50VlNpemUsXG4gICAgICB9KTtcbiAgICAgIGNoaWxkRmVlID0gbmV3Q2hpbGRGZWU7XG4gICAgICBjaGlsZElucHV0cyA9IG5ld0lucHV0cztcbiAgICAgIHVuc3BlbnRzVG9Vc2UucHVzaCguLi5hZGRpdGlvbmFsKTtcbiAgICB9XG5cbiAgICAvLyBzYW5pdHkgY2hlY2sgdGhlIGZlZSByYXRlIHdlJ3JlIHBheWluZyBmb3IgdGhlIGNvbWJpbmVkIHR4XG4gICAgLy8gdG8gbWFrZSBzdXJlIGl0J3MgdW5kZXIgdGhlIG1heCBmZWUgcmF0ZS4gT25seSB0aGUgY2hpbGQgdHhcbiAgICAvLyBjYW4gYnJlYWsgdGhpcyBsaW1pdCwgYnV0IHRoZSBjb21iaW5lZCB0eCBzaGFsbCBub3RcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IG1heEZlZVJhdGUgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLm1heEZlZVJhdGU7XG4gICAgY29uc3QgY2hpbGRWU2l6ZSA9IGVzdGltYXRlVHhWU2l6ZShjaGlsZElucHV0cyk7XG4gICAgY29uc3QgY29tYmluZWRWU2l6ZSA9IGNoaWxkVlNpemUgKyBwYXJlbnRWU2l6ZTtcbiAgICBjb25zdCBjb21iaW5lZEZlZSA9IHBhcmVudFR4LmZlZSArIGNoaWxkRmVlO1xuICAgIC8vIGNvbWJpbmVkIGZlZSByYXRlIG11c3QgYmUgaW4gc2F0L2tCLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnRcbiAgICBjb25zdCBjb21iaW5lZEZlZVJhdGUgPSAoMTAwMCAqIGNvbWJpbmVkRmVlKSAvIGNvbWJpbmVkVlNpemU7XG5cbiAgICBpZiAoY29tYmluZWRGZWVSYXRlID4gbWF4RmVlUmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJhbnNhY3Rpb24gY2Fubm90IGJlIGFjY2VsZXJhdGVkLiBDb21iaW5lZCBmZWUgcmF0ZSBvZiAke2NvbWJpbmVkRmVlUmF0ZX0gc2F0L2tCIGV4Y2VlZHMgbWF4aW11bSBmZWUgcmF0ZSBvZiAke21heEZlZVJhdGV9IHNhdC9rQmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgbmV3IGNoYW5nZSBhZGRyZXNzIGFuZCBkZXRlcm1pbmUgY2hhbmdlIGFtb3VudC5cbiAgICAvLyB0aGUgdHggYnVpbGRlciB3aWxsIHJlamVjdCB0cmFuc2FjdGlvbnMgd2hpY2ggaGF2ZSBubyByZWNpcGllbnRzLFxuICAgIC8vIGFuZCBzdWNoIHplcm8tb3V0cHV0IHRyYW5zYWN0aW9ucyBhcmUgZm9yYmlkZGVuIGJ5IHRoZSBCaXRjb2luIHByb3RvY29sLFxuICAgIC8vIHNvIHdlIG5lZWQgYXQgbGVhc3QgYSBzaW5nbGUgcmVjaXBpZW50IGZvciB0aGUgY2hhbmdlIHdoaWNoIHdvbid0IGJlIHBydW5lZC5cbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSBfLnN1bUJ5KHVuc3BlbnRzVG9Vc2UsICh1bnNwZW50KSA9PiB1bnNwZW50LnZhbHVlKSAtIGNoaWxkRmVlO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSB0aGlzLmdldENoYW5nZUNoYWluKHt9KTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSBhd2FpdCB0aGlzLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4gfSk7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGNoaWxkIHR4IGFuZCBicm9hZGNhc3RcbiAgICAvLyBVc2UgbGVnYWN5IGZvcm1hdCAtIFBTQlQgcm9sbG91dCBhcHBsaWVzIHRvIHVzZXItZmFjaW5nIGNyZWF0ZVRyYW5zYWN0aW9uIG9ubHlcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy5jcmVhdGVBbmRTaWduVHJhbnNhY3Rpb24oe1xuICAgICAgdW5zcGVudHM6IHVuc3BlbnRzVG9Vc2UsXG4gICAgICByZWNpcGllbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBjaGFuZ2VBbW91bnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZmVlOiBjaGlsZEZlZSxcbiAgICAgIGJpdGdvRmVlOiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgYWRkcmVzczogJycsXG4gICAgICB9LFxuICAgICAgeHBydjogcGFyYW1zLnhwcnYsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHVzZVBzYnQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gY2hpbGQgZmVlIHJhdGUgbXVzdCBiZSBpbiBzYXQva0IsIHNvIHdlIG5lZWQgdG8gY29udmVydFxuICAgIGNvbnN0IGNoaWxkRmVlUmF0ZSA9ICgxMDAwICogY2hpbGRGZWUpIC8gY2hpbGRWU2l6ZTtcbiAgICBpZiAoY2hpbGRGZWVSYXRlID4gbWF4RmVlUmF0ZSkge1xuICAgICAgLy8gY29tYmluZWQgdHggaXMgd2l0aGluIG1heCBmZWUgcmF0ZSBsaW1pdHMsIGJ1dCB0aGUgY2hpbGQgdHggaXMgbm90LlxuICAgICAgLy8gaW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgaWdub3JlTWF4RmVlUmF0ZSBmbGFnIHRvIGdldCB0aGUgY2hpbGQgdHggdG8gYmUgYWNjZXB0ZWRcbiAgICAgIHR4Lmlnbm9yZU1heEZlZVJhdGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgcmV0dXJuIHRoaXMuc2VuZFRyYW5zYWN0aW9uKHR4KTtcbiAgfVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVBbmRTaWduVHJhbnNhY3Rpb25cbi8vIElOVEVSTkFMIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgc2lnbiBhIHRyYW5zYWN0aW9uXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAgcmVjaXBpZW50cyAtIGFycmF5IG9mIHsgYWRkcmVzcywgYW1vdW50IH0gdG8gc2VuZCB0b1xuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICAoU2VlIHRyYW5zYWN0aW9uQnVpbGRlci5jcmVhdGVUcmFuc2FjdGlvbiBmb3Igb3RoZXIgcGFzc3Rocm91Z2ggcGFyYW1zKVxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZVJhdGUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmR5bmFtaWNGZWVDb25maXJtVGFyZ2V0ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5keW5hbWljRmVlQ29uZmlybVRhcmdldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgY29uZmlybVRhcmdldCAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGluc3RhbnQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiAobGVnYWN5IGZvcm1hdCBieSBkZWZhdWx0LCBQU0JUIHdoZW4gdXNlUHNidDogdHJ1ZSlcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcbiAgICBjb25zdCBmZWUgPSB0cmFuc2FjdGlvbi5mZWU7XG4gICAgY29uc3QgZmVlUmF0ZSA9IHRyYW5zYWN0aW9uLmZlZVJhdGU7XG4gICAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IHRyYW5zYWN0aW9uLmVzdGltYXRlZFNpemU7XG4gICAgY29uc3QgYml0Z29GZWUgPSB0cmFuc2FjdGlvbi5iaXRnb0ZlZTtcbiAgICBjb25zdCB0cmF2ZWxJbmZvcyA9IHRyYW5zYWN0aW9uLnRyYXZlbEluZm9zO1xuICAgIGNvbnN0IHVuc3BlbnRzID0gdHJhbnNhY3Rpb24udW5zcGVudHM7XG5cbiAgICAvLyBTaWduIHRoZSB0cmFuc2FjdGlvblxuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3Qga2V5Y2hhaW4gPSBhd2FpdCB0aGlzLmdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW4ocGFyYW1zKTtcbiAgICAgIHRyYW5zYWN0aW9uLmtleWNoYWluID0ga2V5Y2hhaW47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gJ25vX2VuY3J5cHRlZF9rZXljaGFpbl9vbl93YWxsZXQnKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIG1pZ2h0IGJlIGEgc2FmZSB3YWxsZXQsIHNvIGxldCdzIHJldHJpZXZlIHRoZSBwcml2YXRlIGtleSBpbmZvXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHsgZ3BrOiB0cnVlIH0pO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHNhZmVVc2VyS2V5ID0gXy5nZXQodGhpcy53YWxsZXQsICdwcml2YXRlLnVzZXJQcml2S2V5Jyk7XG4gICAgICBpZiAoXy5pc1N0cmluZyhzYWZlVXNlcktleSkgJiYgXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgICAgdHJhbnNhY3Rpb24uc2lnbmluZ0tleSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHtcbiAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgaW5wdXQ6IHNhZmVVc2VyS2V5LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNhY3Rpb24uZmVlU2luZ2xlS2V5V0lGID0gcGFyYW1zLmZlZVNpbmdsZUtleVdJRjtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIC8vIHNpZ25UcmFuc2FjdGlvbiBhdXRvLWRldGVjdHMgUFNCVCB2cyBsZWdhY3kgZnJvbSB0cmFuc2FjdGlvbkhleFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gXy5leHRlbmQocmVzdWx0LCB7XG4gICAgICBmZWUsXG4gICAgICBmZWVSYXRlLFxuICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsXG4gICAgICBiaXRnb0ZlZSxcbiAgICAgIHRyYXZlbEluZm9zLFxuICAgICAgZXN0aW1hdGVkU2l6ZSxcbiAgICAgIHVuc3BlbnRzLFxuICAgICAgcHNidEF0dGVtcHQ6IHRyYW5zYWN0aW9uLnBzYnRBdHRlbXB0LCAvLyBQcm9wYWdhdGUgUFNCVCBhdHRlbXB0IGluZm8gZm9yIGVycm9yIHJlcG9ydGluZ1xuICAgIH0pO1xuICB9XG4gICAgLmNhbGwodGhpcylcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW5cbi8vIElOVEVSTkFMIGZ1bmN0aW9uIHRvIGdldCB0aGUgdXNlciBrZXljaGFpbiBmb3Igc2lnbmluZy5cbi8vIENhbGxlciBtdXN0IHByb3ZpZGVyIGVpdGhlciBhIGtleWNoYWluLCBvciB3YWxsZXRQYXNzcGhyYXNlIG9yIHhwcnYgYXMgYSBzdHJpbmdcbi8vIElmIHRoZSBjYWxsZXIgcHJvdmlkZXMgdGhlIGtleWNoYWluIHdpdGggeHBydiwgaXQgaXMgc2ltcGx5IHJldHVybmVkLlxuLy8gSWYgdGhlIGNhbGxlciBwcm92aWRlcyB0aGUgZW5jcnlwdGVkIHhwcnYgKHdhbGxldFBhc3NwaHJhc2UpLCB0aGVuIGZldGNoIHRoZSBrZXljaGFpbiBvYmplY3QgYW5kIGRlY3J5cHRcbi8vIE90aGVyd2lzZSBpZiB0aGUgeHBydiBpcyBwcm92aWRlZCwgZmV0Y2ggdGhlIGtleWNoYWluIG9iamVjdCBhbmQgYXVnbWVudCBpdCB3aXRoIHRoZSB4cHJ2LlxuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIGtleWNoYWluIC0ga2V5Y2hhaW4gd2l0aCB4cHJ2XG4vLyAgIHhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm1cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vIFJldHVybnM6XG4vLyAgIEtleWNoYWluIG9iamVjdCBjb250YWluaW5nIHhwcnYsIHhwdWIgYW5kIHBhdGhzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5nZXRBbmRQcmVwYXJlU2lnbmluZ0tleWNoYWluID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuXG4gIC8vIElmIGtleWNoYWluIHdpdGggeHBydiBpcyBhbHJlYWR5IHByb3ZpZGVkLCB1c2UgaXRcbiAgaWYgKF8uaXNPYmplY3QocGFyYW1zLmtleWNoYWluKSAmJiBwYXJhbXMua2V5Y2hhaW4ueHBydikge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGFyYW1zLmtleWNoYWluKTtcbiAgfVxuXG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddLCBjYWxsYmFjayk7XG4gIGlmICgocGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgcGFyYW1zLnhwcnYpIHx8ICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgIXBhcmFtcy54cHJ2KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIHhwcnYgb3Igd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gQ2FsbGVyIHByb3ZpZGVkIGEgd2FsbGV0IHBhc3NwaHJhc2VcbiAgaWYgKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkudGhlbihhc3luYyBmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICB0cnkge1xuICAgICAgICBrZXljaGFpbi54cHJ2ID0gYXdhaXQgc2VsZi5iaXRnby5kZWNyeXB0QXN5bmMoe1xuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgICBpbnB1dDoga2V5Y2hhaW4uZW5jcnlwdGVkWHBydixcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGRlY3J5cHQgdXNlciBrZXljaGFpbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5Y2hhaW4ueHB1YiAmJiBiaXAzMi5mcm9tQmFzZTU4KGtleWNoYWluLnhwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKSAhPT0ga2V5Y2hhaW4ueHB1Yikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Rlcml2ZWQgeHB1YiBkb2VzIG5vdCBtYXRjaCBzdG9yZWQgeHB1YicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2FsbGVyIHByb3ZpZGVkIGFuIHhwcnYgLSB2YWxpZGF0ZSBhbmQgY29uc3RydWN0IGtleWNoYWluIG9iamVjdFxuICBsZXQgeHB1YjtcbiAgdHJ5IHtcbiAgICB4cHViID0gYmlwMzIuZnJvbUJhc2U1OChwYXJhbXMueHBydikubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgdGhlIHhwcnYnKTtcbiAgfVxuXG4gIGlmICh4cHViID09PSBwYXJhbXMueHBydikge1xuICAgIHRocm93IG5ldyBFcnJvcigneHBydiBwcm92aWRlZCB3YXMgbm90IGEgcHJpdmF0ZSBrZXkgKGZvdW5kIHhwdWIgaW5zdGVhZCknKTtcbiAgfVxuXG4gIGNvbnN0IHdhbGxldFhwdWJzID0gXy5tYXAoc2VsZi5rZXljaGFpbnMsICd4cHViJyk7XG4gIGlmICghXy5pbmNsdWRlcyh3YWxsZXRYcHVicywgeHB1YikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3hwcnYgcHJvdmlkZWQgd2FzIG5vdCBhIGtleWNoYWluIG9uIHRoaXMgd2FsbGV0IScpO1xuICB9XG5cbiAgLy8gZ2V0IHRoZSBrZXljaGFpbiBvYmplY3QgZnJvbSBiaXRnbyB0byBmaW5kIHRoZSBwYXRoIGFuZCAocG90ZW50aWFsKSB3YWxsZXQgc3RydWN0dXJlXG4gIHJldHVybiBzZWxmLmJpdGdvXG4gICAgLmtleWNoYWlucygpXG4gICAgLmdldCh7IHhwdWI6IHhwdWIgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIGtleWNoYWluLnhwcnYgPSBwYXJhbXMueHBydjtcbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogVGFrZXMgYSB3YWxsZXQncyB1bnNwZW50cyBhbmQgZmFucyB0aGVtIG91dCBpbnRvIGEgbGFyZ2VyIG51bWJlciBvZiBlcXVhbGx5IHNpemVkIHVuc3BlbnRzXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiAgdGFyZ2V0OiBzZXQgaG93IG1hbnkgdW5zcGVudHMgeW91IHdhbnQgdG8gaGF2ZSBpbiB0aGUgZW5kXG4gKiAgbWluQ29uZmlybXM6IG1pbmltdW0gbnVtYmVyIG9mIGNvbmZpcm1zIHRoZSB1bnNwZW50cyBtdXN0IGhhdmVcbiAqICB4cHJ2OiBwcml2YXRlIGtleSB0byBzaWduIHRyYW5zYWN0aW9uXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0IHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUgd2FsbGV0J3MgcHJpdmF0ZSBrZXlcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuZmFuT3V0VW5zcGVudHMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICAvLyAod2hlbiBmYW5uaW5nIG91dCwgd2UgdGFrZSBhbGwgdGhlIHVuc3BlbnRzIGFuZCBtYWtlIGEgYmlnZ2VyIG51bWJlciBvZiBvdXRwdXRzKVxuICAgIGNvbnN0IE1BWF9GQU5PVVRfSU5QVVRfQ09VTlQgPSA4MDtcbiAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBNQVhfRkFOT1VUX09VVFBVVF9DT1VOVCA9IDMwMDtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCB0d28sIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMiB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCA+IE1BWF9GQU5PVVRfT1VUUFVUX0NPVU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IHRvbyBoaWdoJyk7XG4gICAgfVxuXG4gICAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICAgIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaW5Db25maXJtcyA9IDE7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgPj0gMCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwbGl0IGEgbmF0dXJhbCBudW1iZXIgTiBpbnRvIG4gYWxtb3N0IGVxdWFsbHkgc2l6ZWQgKMKxMSkgbmF0dXJhbCBudW1iZXJzLlxuICAgICAqIEluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZXMgb2YgdGhlIHBhcnRzLCB3ZSBjYWxjdWxhdGUgZmxvb3IoTi9uKSwgYW5kIHRodXMgaGF2ZSB0aGUgYmFzZSBzaXplIG9mIGFsbCBwYXJ0cy5cbiAgICAgKiBJZiBOICUgbiAhPT0gMCwgdGhpcyBsZWF2ZXMgdXMgd2l0aCBhIHJlbWFpbmRlciByIHdoZXJlIHIgPCBuLiBXZSBkaXN0cmlidXRlIHIgZXF1YWxseSBhbW9uZyB0aGUgbiBwYXJ0cyBieVxuICAgICAqIGFkZGluZyAxIHRvIHRoZSBmaXJzdCByIHBhcnRzLlxuICAgICAqIEBwYXJhbSB0b3RhbFxuICAgICAqIEBwYXJhbSBwYXJ0Q291bnRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3Qgc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyA9IGZ1bmN0aW9uICh0b3RhbCwgcGFydENvdW50KSB7XG4gICAgICBjb25zdCBwYXJ0U2l6ZSA9IE1hdGguZmxvb3IodG90YWwgLyBwYXJ0Q291bnQpO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWwgLSBwYXJ0U2l6ZSAqIHBhcnRDb3VudDtcbiAgICAgIC8vIGluaXRpYWxpemUgcGxhY2Vob2xkZXIgYXJyYXlcbiAgICAgIGNvbnN0IGFsbW9zdEVxdWFsUGFydHMgPSBuZXcgQXJyYXkocGFydENvdW50KTtcbiAgICAgIC8vIGZpbGwgdGhlIGZpcnN0IHJlbWFpbmRlciBwYXJ0cyB3aXRoIHRoZSB2YWx1ZSBwYXJ0U2l6ZSsxXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUgKyAxLCAwLCByZW1haW5kZXIpO1xuICAgICAgLy8gZmlsbCB0aGUgcmVtYWluaW5nIHBhcnRzIHdpdGggdGhlIHZhbHVlIHBhcnRTaXplXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUsIHJlbWFpbmRlcik7XG4gICAgICAvLyBhc3NlcnQgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhbG1vc3QgZXF1YWwgcGFydHNcbiAgICAgIC8vIFRPRE86IGFkZCBjaGVjayBmb3IgdGhlIGJpZ2dlc3QgZGV2aWF0aW9uIGJldHdlZW4gYW55IHR3byBwYXJ0cyBhbmQgbWFrZSBzdXJlIGl0J3MgPD0gMVxuICAgICAgaWYgKF8oYWxtb3N0RXF1YWxQYXJ0cykuc3VtKCkgIT09IHRvdGFsIHx8IF8oYWxtb3N0RXF1YWxQYXJ0cykuc2l6ZSgpICE9PSBwYXJ0Q291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0IHN1bSBvciBwYXJ0IGNvdW50IG1pc21hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxtb3N0RXF1YWxQYXJ0cztcbiAgICB9O1xuXG4gICAgLy8gZmlyc3QsIGxldCdzIHRha2UgYWxsIHRoZSB3YWxsZXQncyB1bnNwZW50cyAod2l0aCBtaW4gY29uZmlybXMgaWYgbmVjZXNzYXJ5KVxuICAgIGNvbnN0IGFsbFVuc3BlbnRzID0gKGF3YWl0IHNlbGYudW5zcGVudHMoeyBtaW5Db25maXJtczogbWluQ29uZmlybXMgfSkpIGFzIGFueTtcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1bnNwZW50cyB0byBicmFuY2ggb3V0Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25zb2xpZGF0aW9uIGlzIGVzc2VudGlhbGx5IGp1c3QgYSB3YXN0ZSBvZiBtb25leVxuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IGhhcyB0byBiZSBiaWdnZXIgdGhhbiBjdXJyZW50IG51bWJlciBvZiB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgYXQgdGhlIHZlcnkgbWluaW11bSA4MSBpbnB1dHMsIGFuZCA4MSBvdXRwdXRzLiBUaGF0IHRyYW5zYWN0aW9uIHdpbGwgYmUgYmlnXG4gICAgLy8gaW4gdGhlIG1lZGl1bSBydW4sIHRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIHJld29ya2VkIHRvIG9ubHkgd29yayB3aXRoIGEgc3Vic2V0IG9mIHRoZSB0cmFuc2FjdGlvbnNcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoID4gTUFYX0ZBTk9VVF9JTlBVVF9DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYWxsIHRoZSBtb25leSB0aGF0IGlzIGN1cnJlbnRseSBpbiB0aGUgd2FsbGV0XG4gICAgY29uc3QgZ3Jvc3NBbW91bnQgPSBfKGFsbFVuc3BlbnRzKS5tYXAoJ3ZhbHVlJykuc3VtKCk7XG5cbiAgICAvLyBpbiBvcmRlciB0byBub3QgbW9kaWZ5IHRoZSBwYXJhbXMgb2JqZWN0LCB3ZSBjcmVhdGUgYSBjb3B5XG4gICAgY29uc3QgdHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGFsbFVuc3BlbnRzO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcblxuICAgIC8vIGNyZWF0ZSB0YXJnZXQgYW1vdW50IG9mIG5ldyBhZGRyZXNzZXMgZm9yIHRoaXMgd2FsbGV0XG4gICAgY29uc3QgbmV3QWRkcmVzc1Byb21pc2VzID0gXy5yYW5nZSh0YXJnZXQpLm1hcCgoKSA9PlxuICAgICAgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IHNlbGYuZ2V0Q2hhbmdlQ2hhaW4ocGFyYW1zKSwgdmFsaWRhdGU6IHZhbGlkYXRlIH0pXG4gICAgKTtcbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChuZXdBZGRyZXNzUHJvbWlzZXMpO1xuICAgIC8vIGxldCdzIGZpbmQgYSBuaWNlLCBlcXVhbCBkaXN0cmlidXRpb24gb2Ygb3VyIFNhdG9zaGlzIGFtb25nIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgY29uc3Qgc3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhncm9zc0Ftb3VudCwgdGFyZ2V0KTtcbiAgICAvLyBtYXAgdGhlIG5ld2x5IGNyZWF0ZWQgYWRkcmVzc2VzIHRvIHRoZSBhbG1vc3QgY29tcG9uZW50cyBhbW91bnRzIHdlIGp1c3QgY2FsY3VsYXRlZFxuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHNwbGl0QW1vdW50cyk7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG4gICAgLy8gYXR0ZW1wdCB0byBjcmVhdGUgYSB0cmFuc2FjdGlvbi4gQXMgaXQgaXMgYSB3YWxsZXQtc3dlZXBpbmcgdHJhbnNhY3Rpb24gd2l0aCBubyBmZWUsIHdlIGV4cGVjdCBpdCB0byBmYWlsXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBhcyBleHBlY3RlZCwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIGRpZCBpbmRlZWQgZmFpbCBkdWUgdG8gaW5zdWZmaWNpZW50IGZlZXNcbiAgICAgIC8vIHRoZSBlcnJvciBzdWdnZXN0cyBhIGZlZSB2YWx1ZSB3aGljaCB3ZSB0aGVuIHVzZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAvLyBob3dldmVyLCBsZXQncyBtYWtlIHN1cmUgaXQgd2Fzbid0IHNvbWV0aGluZyBlbHNlXG4gICAgICBpZiAoIWVycm9yLmZlZSAmJiAoIWVycm9yLnJlc3VsdCB8fCAhZXJyb3IucmVzdWx0LmZlZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIGVycm9yIGRvZXMgbm90IGNvbnRhaW4gYSBmZWUgcHJvcGVydHksIGl0IGlzIHNvbWV0aGluZyBlbHNlIHRoYXQgaGFzIGdvbmUgYXdyeSwgYW5kIHdlIHRocm93IGl0XG4gICAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhc2VGZWUgPSBlcnJvci5mZWUgfHwgZXJyb3IucmVzdWx0LmZlZTtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgdG90YWxGZWUgKz0gZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudDtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIE5lZWQgdG8gY2xlYXIgdGhlc2Ugb3V0IHNpbmNlIG9ubHkgMSBtYXkgYmUgc2V0XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlO1xuICAgICAgdHhQYXJhbXMub3JpZ2luYWxGZWVSYXRlID0gdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldDtcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGJhc2VGZWU7XG4gICAgICAvLyBpbiBvcmRlciB0byBtYWludGFpbiB0aGUgZXF1YWwgZGlzdHJpYnV0aW9uLCB3ZSBuZWVkIHRvIHN1YnRyYWN0IHRoZSBmZWUgZnJvbSB0aGUgY3VtdWxhdGl2ZSBmdW5kc1xuICAgICAgLy8gaW4gY2FzZSBzb21lIHVuc3BlbnRzIGdvdCBwcnVuZWQsIHdlIG5lZWQgdG8gdXNlIGVycm9yLnJlc3VsdC5hdmFpbGFibGVcbiAgICAgIGNvbnN0IG5ldEFtb3VudCA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSB0b3RhbEZlZTsgLy8gYWZ0ZXIgZmVlc1xuICAgICAgLy8gdGhhdCBtZWFucyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaGFzIHRvIGJlIHJlY2FsY3VsYXRlZFxuICAgICAgY29uc3QgcmVtYWluaW5nU3BsaXRBbW91bnRzID0gc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyhuZXRBbW91bnQsIHRhcmdldCk7XG4gICAgICAvLyBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBhZ2FpbiBtYXBwZWQgdG8gdGhlIG5ldyBhZGRyZXNzZXNcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSBfLnppcE9iamVjdChfLm1hcChuZXdBZGRyZXNzZXMsICdhZGRyZXNzJyksIHJlbWFpbmluZ1NwbGl0QW1vdW50cyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB0aW1lLCB0aGUgdHJhbnNhY3Rpb24gY3JlYXRpb24gc2hvdWxkIHdvcmtcbiAgICBsZXQgZmFub3V0VHg7XG4gICAgdHJ5IHtcbiAgICAgIGZhbm91dFR4ID0gYXdhaXQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFub3V0VHgpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbiAgfSkoKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRvIGZhbiBvdXQgb3IgY29hbGVzY2UgYSB3YWxsZXQncyB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7UmVxdWVzdHxQcm9taXNlLjxUPnwqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZ3JvdXBVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMSB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCBvbmUsIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWluQ29uZmlybXMgPSAxO1xuICB9XG4gIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5Db25maXJtcyBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDAnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gc2VsZi51bnNwZW50cyh7IG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyB9KS50aGVuKGZ1bmN0aW9uICh1bnNwZW50cykge1xuICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHVuc3BlbnRzO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoID4gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5jb25zb2xpZGF0ZVVuc3BlbnRzKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoIDwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5mYW5PdXRVbnNwZW50cyhwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb25zb2xpZGF0ZSBhIHdhbGxldCdzIHVuc3BlbnRzIGludG8gZmV3ZXIgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtYXhJbnB1dENvdW50UGVyQ29uc29saWRhdGlvbjogc2V0IGhvdyBtYW55IG1heGltdW0gaW5wdXRzIGFyZSB0byBiZSBwZXJtaXR0ZWQgcGVyIGNvbnNvbGlkYXRpb24gYmF0Y2hcbiAqICB4cHJ2OiBwcml2YXRlIGtleSB0byBzaWduIHRyYW5zYWN0aW9uXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0IHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUgd2FsbGV0J3MgcHJpdmF0ZSBrZXlcbiAqICBtYXhJdGVyYXRpb25Db3VudDogbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdW50aWwgZnVuY3Rpb24gc3RvcHNcbiAqICBwcm9ncmVzc0NhbGxiYWNrOiBtZXRob2QgdG8gYmUgY2FsbGVkIHdpdGggb2JqZWN0IG91dGxpbmluZyBjdXJyZW50IHByb2dyZXNzIGRldGFpbHNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuY29uc29saWRhdGVVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG5cbiAgbGV0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRhcmdldCA9IDE7XG4gIH0gZWxzZSBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAxIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubWF4U2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWF4U2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLm1pblNpemUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5TaXplIHNob3VsZCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIHBlciB0cmFuc2FjdGlvbiBmb3IgY29uc29saWRhdGlvblxuICBjb25zdCBNQVhfSU5QVVRfQ09VTlQgPSAyMDA7XG4gIGxldCBtYXhJbnB1dENvdW50ID0gcGFyYW1zLm1heElucHV0Q291bnRQZXJDb25zb2xpZGF0aW9uO1xuICBpZiAobWF4SW5wdXRDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbnVsbCBvciB1bmlkZW50aWZpZWQsIGJlY2F1c2UgZXF1YWxpdHkgdG8gemVybyByZXR1cm5zIHRydWUgaW4gaWYoISBjbGF1c2VcbiAgICBtYXhJbnB1dENvdW50ID0gTUFYX0lOUFVUX0NPVU5UO1xuICB9XG4gIGlmICh0eXBlb2YgbWF4SW5wdXRDb3VudCAhPT0gJ251bWJlcicgfHwgbWF4SW5wdXRDb3VudCA8IDIgfHwgbWF4SW5wdXRDb3VudCAlIDEgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gY29uc29saWRhdGlvbiBpbnB1dCBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDInKTtcbiAgfSBlbHNlIGlmIChtYXhJbnB1dENvdW50ID4gTUFYX0lOUFVUX0NPVU5UKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGNvbnNvbGlkYXRpb24gaW5wdXQgY291bnQgY2Fubm90IGJlIGJpZ2dlciB0aGFuICcgKyBNQVhfSU5QVVRfQ09VTlQpO1xuICB9XG5cbiAgY29uc3QgbWF4SXRlcmF0aW9uQ291bnQgPSBwYXJhbXMubWF4SXRlcmF0aW9uQ291bnQgfHwgLTE7XG4gIGlmIChcbiAgICAocGFyYW1zLm1heEl0ZXJhdGlvbkNvdW50ICYmICghXy5pc051bWJlcihtYXhJdGVyYXRpb25Db3VudCkgfHwgbWF4SXRlcmF0aW9uQ291bnQgPCAxKSkgfHxcbiAgICBtYXhJdGVyYXRpb25Db3VudCAlIDEgIT09IDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGl0ZXJhdGlvbiBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDEnKTtcbiAgfVxuXG4gIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5Db25maXJtcyA9IDE7XG4gIH1cbiAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMCcpO1xuICB9XG5cbiAgbGV0IG1pblNpemUgPSBwYXJhbXMubWluU2l6ZSB8fCAwO1xuICBpZiAocGFyYW1zLmZlZVJhdGUpIHtcbiAgICAvLyBmZWUgcmF0ZSBpcyBpbiBzYXRvc2hpcyBwZXIga0IsIGlucHV0IHNpemUgaW4gYnl0ZXNcbiAgICBjb25zdCBmZWVCYXNlZE1pblNpemUgPSBNYXRoLmNlaWwoKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwKTtcbiAgICBpZiAocGFyYW1zLm1pblNpemUgJiYgbWluU2l6ZSA8IGZlZUJhc2VkTWluU2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm92aWRlZCBtaW5TaXplIHRvbyBsb3cgZHVlIHRvIHRvbyBoaWdoIGZlZSByYXRlJyk7XG4gICAgfVxuICAgIG1pblNpemUgPSBNYXRoLm1heChmZWVCYXNlZE1pblNpemUsIG1pblNpemUpO1xuXG4gICAgaWYgKCFwYXJhbXMubWluU2l6ZSkge1xuICAgICAgLy8gZmVlIHJhdGUtYmFzZWQgbWluIHNpemUgbmVlZHMgbm8gbG9nZ2luZyBpZiBpdCB3YXMgc2V0IGV4cGxpY2l0bHlcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnT25seSBjb25zb2xpZGF0aW5nIHVuc3BlbnRzIGxhcmdlciB0aGFuICcgK1xuICAgICAgICAgIG1pblNpemUgK1xuICAgICAgICAgICcgc2F0b3NoaXMgdG8gYXZvaWQgd2FzdGluZyBtb25leSBvbiBmZWVzLiBUbyBjb25zb2xpZGF0ZSBzbWFsbGVyIHVuc3BlbnRzLCB1c2UgYSBsb3dlciBmZWUgcmF0ZS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBpdGVyYXRpb25Db3VudCA9IDA7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBjb25zb2xpZGF0aW9uSW5kZXggPSAwO1xuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBvbmUgYmF0Y2ggb2YgdXAgdG8gTUFYX0lOUFVUX0NPVU5UIHVuc3BlbnRzLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bk5leHRDb25zb2xpZGF0aW9uKCkge1xuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnM6IGFueVtdID0gW107XG4gICAgbGV0IGlzRmluYWxDb25zb2xpZGF0aW9uID0gZmFsc2U7XG4gICAgaXRlcmF0aW9uQ291bnQrKztcbiAgICAvKlxuICAgICBXZSB0YWtlIGEgbWF4aW11bSBvZiB1bnNwZW50QnVsa1NpemVMaW1pdCB1bnNwZW50cyBmcm9tIHRoZSB3YWxsZXQuIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3dpcGUgdGhlIHdhbGxldFxuICAgICBjbGVhbiBvZiBhbGwgZXhjZXNzaXZlIHVuc3BlbnRzLCBzbyB3ZSBhZGQgMSB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnQgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nLlxuICAgICBJbiBjYXNlIHRoZXJlIGFyZSBldmVuIG1vcmUgdW5zcGVudHMgdGhhbiB0aGF0LCB0byBtYWtlIHRoZSBjb25zb2xpZGF0aW9uIGFzIGZhc3QgYXMgcG9zc2libGUsIHdlIGV4cGFuZCBvdXJcbiAgICAgc2VsZWN0aW9uIHRvIGluY2x1ZGUgYXMgbWFueSBhcyB0aGUgbWF4aW11bSBwZXJtaXNzaWJsZSBudW1iZXIgb2YgaW5wdXRzIHBlciBjb25zb2xpZGF0aW9uIGJhdGNoLlxuICAgICBTaG91bGQgdGhlIHRhcmdldCBudW1iZXIgb2YgdW5zcGVudHMgYmUgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIGlmIGlucHV0cyBwZXIgY29uc29saWRhdGlvbixcbiAgICAgd2Ugc3RpbGwgd2FudCB0byBmZXRjaCB0aGVtIGFsbCBzaW1wbHkgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBjb25zb2xpZGF0aW9uIGNhbiBiZSBwZXJmb3JtZWRcbiAgICAgYXQgYWxsLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIG51bWJlciBvZiBhbGwgdW5zcGVudHMgYmVpbmcgaGlnaGVyIHRoYW4gdGhlIHRhcmdldC5cbiAgICAgSW4gdGhlIG5leHQgdmVyc2lvbiBvZiB0aGUgdW5zcGVudHMgdmVyc2lvbiBTREssIHdlIHdpbGwga25vdyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIHdpdGhvdXQgaGF2aW5nIHRvIGZldGNoXG4gICAgIHRoZW0sIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBhYmxlIHRvIHNpbXBsaWZ5IHRoaXMgbWV0aG9kLlxuICAgICAqL1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IGFueSA9IHtcbiAgICAgIGxpbWl0OiB0YXJnZXQgKyBtYXhJbnB1dENvdW50LFxuICAgICAgbWluQ29uZmlybXM6IG1pbkNvbmZpcm1zLFxuICAgICAgbWluU2l6ZTogbWluU2l6ZSxcbiAgICB9O1xuICAgIGlmIChwYXJhbXMubWF4U2l6ZSkge1xuICAgICAgcXVlcnlQYXJhbXMubWF4U2l6ZSA9IHBhcmFtcy5tYXhTaXplO1xuICAgIH1cbiAgICBjb25zdCBhbGxVbnNwZW50cyA9IChhd2FpdCBzZWxmLnVuc3BlbnRzKHF1ZXJ5UGFyYW1zKSkgYXMgYW55O1xuICAgIC8vIHRoaXMgY29uc29saWRhdGlvbiBpcyBlc3NlbnRpYWxseSBqdXN0IGEgd2FzdGUgb2YgbW9uZXlcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDw9IHRhcmdldCkge1xuICAgICAgaWYgKGl0ZXJhdGlvbkNvdW50IDw9IDEpIHtcbiAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgaXRlcmF0aW9uLCBzbyB0aGUgbWV0aG9kIGlzIGluY29ycmVjdFxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Zld2VyIHVuc3BlbnRzIHRoYW4gY29uc29saWRhdGlvbiB0YXJnZXQuIFVzZSBmYW5PdXRVbnNwZW50cyBpbnN0ZWFkLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaXQncyBhIGxhdGVyIGl0ZXJhdGlvbiwgc28gdGhlIHRhcmdldCBtYXkgaGF2ZSBiZWVuIHN1cnBhc3NlZCAoZHVlIHRvIGNvbmZpcm1hdGlvbnMgaW4gdGhlIGJhY2tncm91bmQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFsbFVuc3BlbnRzQ291bnQgPSBhbGxVbnNwZW50cy5sZW5ndGg7XG5cbiAgICAvLyBob3cgbWFueSBvZiB0aGUgdW5zcGVudHMgZG8gd2Ugd2FudCB0byBjb25zb2xpZGF0ZT9cbiAgICAvLyB0aGUgKzEgaXMgYmVjYXVzZSB0aGUgY29uc29saWRhdGVkIGJsb2NrIGJlY29tZXMgYSBuZXcgdW5zcGVudCBsYXRlclxuICAgIGxldCB0YXJnZXRJbnB1dENvdW50ID0gYWxsVW5zcGVudHNDb3VudCAtIHRhcmdldCArIDE7XG4gICAgdGFyZ2V0SW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIGFsbFVuc3BlbnRzLmxlbmd0aCk7XG5cbiAgICAvLyBpZiB0aGUgdGFyZ2V0SW5wdXRDb3VudCByZXF1aXJlcyBtb3JlIGlucHV0cyB0aGFuIHdlIGFsbG93IHBlciBiYXRjaCwgd2UgcmVkdWNlIHRoZSBudW1iZXJcbiAgICBjb25zdCBpbnB1dENvdW50ID0gTWF0aC5taW4odGFyZ2V0SW5wdXRDb3VudCwgbWF4SW5wdXRDb3VudCk7XG5cbiAgICAvLyBpZiBlaXRoZXIgdGhlIG51bWJlciBvZiBpbnB1dHMgbGVmdCB0byBjb2FsZXNjZSBlcXVhbHMgdGhlIG51bWJlciB3ZSB3aWxsIGNvYWxlc2NlIGluIHRoaXMgaXRlcmF0aW9uXG4gICAgLy8gb3IgaWYgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG1hdGNoZXMgdGhlIG1heGltdW0gcGVybWl0dGVkIG51bWJlclxuICAgIGlzRmluYWxDb25zb2xpZGF0aW9uID0gaW5wdXRDb3VudCA9PT0gdGFyZ2V0SW5wdXRDb3VudCB8fCBpdGVyYXRpb25Db3VudCA9PT0gbWF4SXRlcmF0aW9uQ291bnQ7XG5cbiAgICBjb25zdCBjdXJyZW50Q2h1bmsgPSBhbGxVbnNwZW50cy5zcGxpY2UoMCwgaW5wdXRDb3VudCk7XG4gICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBzZWxmLmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgY29uc3QgbmV3QWRkcmVzcyA9IChhd2FpdCBzZWxmLmNyZWF0ZUFkZHJlc3MoeyBjaGFpbjogY2hhbmdlQ2hhaW4sIHZhbGlkYXRlOiB2YWxpZGF0ZSB9KSkgYXMgYW55O1xuICAgIGNvbnN0IHR4UGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gICAgY29uc3QgY3VycmVudEFkZHJlc3MgPSBuZXdBZGRyZXNzO1xuICAgIC8vIHRoZSB0b3RhbCBhbW91bnQgdGhhdCB3ZSBhcmUgY29uc29saWRhdGluZyB3aXRoaW4gdGhpcyBiYXRjaFxuICAgIGNvbnN0IGdyb3NzQW1vdW50ID0gXyhjdXJyZW50Q2h1bmspLm1hcCgndmFsdWUnKS5zdW0oKTsgLy8gYmVmb3JlIGZlZXNcblxuICAgIHR4UGFyYW1zLnVuc3BlbnRzID0gY3VycmVudENodW5rO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBncm9zc0Ftb3VudDtcbiAgICB0eFBhcmFtcy5ub1NwbGl0Q2hhbmdlID0gdHJ1ZTtcblxuICAgIGlmICh0eFBhcmFtcy51bnNwZW50cy5sZW5ndGggPD0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb25lJyk7XG4gICAgfVxuXG4gICAgLy8gbGV0J3MgYXR0ZW1wdCB0byBjcmVhdGUgdGhpcyB0cmFuc2FjdGlvbi4gV2UgZXhwZWN0IGl0IHRvIGZhaWwgYmVjYXVzZSBubyBmZWUgaXMgc2V0LlxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gdGhpcyBlcnJvciBzaG91bGQgb2NjdXIgZHVlIHRvIGluc3VmZmljaWVudCBmdW5kc1xuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgYml0Z29GZWUgPSAwO1xuICAgICAgbGV0IHRvdGFsRmVlID0gYmFzZUZlZTtcbiAgICAgIGlmIChlcnJvci5yZXN1bHQuYml0Z29GZWUgJiYgZXJyb3IucmVzdWx0LmJpdGdvRmVlLmFtb3VudCkge1xuICAgICAgICBiaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHRvdGFsRmVlICs9IGJpdGdvRmVlO1xuICAgICAgICB0eFBhcmFtcy5iaXRnb0ZlZSA9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIG5ldCBhbW91bnQgaXMgbmVnYXRpdmUsIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIHRoZSBtaW5pbXVtIG91dHB1dCBzaXplXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBNYXRoLm1heChlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWUsIHNlbGYuYml0Z28uZ2V0Q29uc3RhbnRzKCkubWluT3V0cHV0U2l6ZSk7XG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG5cbiAgICAgIC8vIHdlIHNldCB0aGUgZmVlIGV4cGxpY2l0bHlcbiAgICAgIHR4UGFyYW1zLmZlZSA9IGVycm9yLnJlc3VsdC5hdmFpbGFibGUgLSBuZXRBbW91bnQgLSBiaXRnb0ZlZTtcbiAgICAgIHR4UGFyYW1zLnJlY2lwaWVudHNbbmV3QWRkcmVzcy5hZGRyZXNzXSA9IG5ldEFtb3VudDtcbiAgICB9XG4gICAgLy8gdGhpcyB0cmFuc2FjdGlvbiwgb24gdGhlIG90aGVyIGhhbmQsIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggbm8gaXNzdWVzLCBiZWNhdXNlIGFuIGFwcHJvcHJpYXRlIGZlZSBpcyBzZXRcbiAgICBsZXQgc2VudFR4O1xuICAgIHRyeSB7XG4gICAgICBzZW50VHggPSBhd2FpdCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICBlLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaChzZW50VHgpO1xuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLnByb2dyZXNzQ2FsbGJhY2spKSB7XG4gICAgICBwYXJhbXMucHJvZ3Jlc3NDYWxsYmFjayh7XG4gICAgICAgIHR4aWQ6IHNlbnRUeC5oYXNoLFxuICAgICAgICBkZXN0aW5hdGlvbjogY3VycmVudEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogZ3Jvc3NBbW91bnQsXG4gICAgICAgIGZlZTogc2VudFR4LmZlZSxcbiAgICAgICAgaW5wdXRDb3VudDogaW5wdXRDb3VudCxcbiAgICAgICAgaW5kZXg6IGNvbnNvbGlkYXRpb25JbmRleCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uSW5kZXgrKztcbiAgICBpZiAoIWlzRmluYWxDb25zb2xpZGF0aW9uKSB7XG4gICAgICAvLyB0aGlzIGxhc3QgY29uc29saWRhdGlvbiBoYXMgbm90IHlldCBicm91Z2h0IHRoZSB1bnNwZW50cyBjb3VudCBkb3duIHRvIHRoZSB0YXJnZXQgdW5zcGVudCBjb3VudFxuICAgICAgLy8gdGhlcmVmb3JlLCB3ZSBwcm9jZWVkIGJ5IGNvbnNvbGlkYXRpbmcgeWV0IGFub3RoZXIgYmF0Y2hcbiAgICAgIC8vIGJlZm9yZSB3ZSBkbyB0aGF0LCB3ZSB3YWl0IDEgc2Vjb25kIHNvIHRoYXQgdGhlIG5ld2x5IGNyZWF0ZWQgdW5zcGVudCB3aWxsIGJlIGZldGNoZWQgaW4gdGhlIG5leHQgYmF0Y2hcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCguLi4oKGF3YWl0IHJ1bk5leHRDb25zb2xpZGF0aW9uKCkpIGFzIGFueSkpO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHRoZSBmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLiBXZSByZXR1cm4gYWxsIHRoZSBvbmVzIHdlJ3ZlIGhhZCBzbyBmYXJcbiAgICByZXR1cm4gY29uc29saWRhdGlvblRyYW5zYWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBydW5OZXh0Q29uc29saWRhdGlvbigpXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ0RvbmUnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9KVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnNoYXJlV2FsbGV0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2VtYWlsJywgJ3Blcm1pc3Npb25zJ10sIFsnd2FsbGV0UGFzc3BocmFzZScsICdtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNoYXJlIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBza2lwS2V5Y2hhaW4gdG8gYmUgYSBib29sZWFuLiAnKTtcbiAgfVxuICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zLmluZGV4T2YoJ3NwZW5kJykgIT09IC0xO1xuXG4gIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBkaXNhYmxlRW1haWwgdG8gYmUgYSBib29sZWFuLicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBzaGFyaW5nO1xuICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gIHJldHVybiB0aGlzLmJpdGdvXG4gICAgLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBzaGFyaW5nID0gcmVzdWx0O1xuXG4gICAgICBpZiAobmVlZHNLZXljaGFpbikge1xuICAgICAgICByZXR1cm4gc2VsZi5nZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4oe30pLnRoZW4oYXN5bmMgZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAgICAgLy8gRGVjcnlwdCB0aGUgdXNlciBrZXkgd2l0aCBhIHBhc3NwaHJhc2VcbiAgICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkWHBydikge1xuICAgICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgd2FsbGV0UGFzc3BocmFzZSBhcmd1bWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAga2V5Y2hhaW4ueHBydiA9IGF3YWl0IHNlbGYuYml0Z28uZGVjcnlwdEFzeW5jKHtcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFhwcnYsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWNrZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFhwcnYgPSBhd2FpdCBzZWxmLmJpdGdvLmVuY3J5cHRBc3luYyh7IHBhc3N3b3JkOiBzZWNyZXQsIGlucHV0OiBrZXljaGFpbi54cHJ2IH0pO1xuXG4gICAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgICAgeHB1Yjoga2V5Y2hhaW4ueHB1YixcbiAgICAgICAgICAgICAgZW5jcnlwdGVkWHBydjogbmV3RW5jcnlwdGVkWHBydixcbiAgICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgICAgdG9QdWJLZXk6IHNoYXJpbmcucHVia2V5LFxuICAgICAgICAgICAgICBwYXRoOiBzaGFyaW5nLnBhdGgsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gICAgICAgIHVzZXI6IGFueTtcbiAgICAgICAgcGVybWlzc2lvbnM6IHN0cmluZztcbiAgICAgICAgcmVzaGFyZTogYm9vbGVhbjtcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgICBkaXNhYmxlRW1haWw6IGFueTtcbiAgICAgICAga2V5Y2hhaW4/OiBhbnk7XG4gICAgICAgIHNraXBLZXljaGFpbj86IGJvb2xlYW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wdGlvbnM6IE9wdGlvbnMgPSB7XG4gICAgICAgIHVzZXI6IHNoYXJpbmcudXNlcklkLFxuICAgICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgICByZXNoYXJlOiBwYXJhbXMucmVzaGFyZSxcbiAgICAgICAgbWVzc2FnZTogcGFyYW1zLm1lc3NhZ2UsXG4gICAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICAgIH07XG4gICAgICBpZiAoc2hhcmVkS2V5Y2hhaW4pIHtcbiAgICAgICAgb3B0aW9ucy5rZXljaGFpbiA9IHNoYXJlZEtleWNoYWluO1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSB7fTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gICAgfSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVVc2VyID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5kZWwodGhpcy51cmwoJy91c2VyLycgKyBwYXJhbXMudXNlcikpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KClcbiAgKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmdldFBvbGljeSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeScpKS5zZW5kKCkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZ2V0UG9saWN5U3RhdHVzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcG9saWN5L3N0YXR1cycpKS5zZW5kKCkucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuc2V0UG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUubGlzdFdlYmhvb2tzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZCgpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNhY3Rpb24gYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIC0gd2ViaG9va0lkIChyZXF1aXJlZCk6IGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICogLSB0eEhhc2ggKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNhY3Rpb24gd2ViaG9va3MpIGhhc2ggb2YgdGhlIHNpbXVsYXRlZCB0cmFuc2FjdGlvblxuICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuc2ltdWxhdGVXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgaGFzVHhIYXNoID0gISFwYXJhbXMudHhIYXNoO1xuICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuXG4gIGlmICgoaGFzVHhIYXNoICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB8fCAoIWhhc1R4SGFzaCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIYXNoIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgfVxuXG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQsIHRoZSB0eEhhc2ggaGFzIHRvIGFkaGVyZSB0byBpdHMgcmVzcGVjdGl2ZSBmb3JtYXRcbiAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgLy8gb25seSB0YWtlIHRoZSB0eEhhc2ggYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MvJyArIHdlYmhvb2tJZCArICcvc2ltdWxhdGUnKSlcbiAgICAgIC5zZW5kKGZpbHRlcmVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5hZGRXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlV2ViaG9vayA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnLCAndHlwZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oY2FsbGJhY2spXG4gICAgLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZXN0aW1hdGVGZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmFtb3VudCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBhbW91bnQgYXMgd2VsbCBhcyByZWNpcGllbnRzJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVjaXBpZW50cyBtdXN0IGJlIGFycmF5IG9mIHsgYWRkcmVzczogYWJjLCBhbW91bnQ6IDEwMDAwMCB9IG9iamVjdHMnKTtcbiAgfVxuICBpZiAocGFyYW1zLmFtb3VudCAmJiAhXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJlY2lwaWVudHMgPSBwYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcblxuICBpZiAocGFyYW1zLmFtb3VudCkge1xuICAgIC8vIG9ubHkgdGhlIGFtb3VudCB3YXMgcGFzc2VkIGluLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBmYWxzZSByZWNpcGllbnQgdG8gcnVuIGNyZWF0ZVRyYW5zYWN0aW9uIHdpdGhcbiAgICByZWNpcGllbnRzLnB1c2goe1xuICAgICAgYWRkcmVzczogY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmJpdGdvLmVudl0uc2lnbmluZ0FkZHJlc3MsIC8vIGFueSBhZGRyZXNzIHdpbGwgZG9cbiAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIHRyYW5zYWN0aW9uUGFyYW1zLmFtb3VudCA9IHVuZGVmaW5lZDtcbiAgdHJhbnNhY3Rpb25QYXJhbXMucmVjaXBpZW50cyA9IHJlY2lwaWVudHM7XG5cbiAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHR4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVzdGltYXRlZFNpemU6IHR4LmVzdGltYXRlZFNpemUsXG4gICAgICBmZWU6IHR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHR4LmZlZVJhdGUsXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vLyBOb3QgZnVsbHkgaW1wbGVtZW50ZWQgLyByZWxlYXNlZCBvbiBTREsuIFRlc3RpbmcgZm9yIG5vdy5cbldhbGxldC5wcm90b3R5cGUudXBkYXRlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihjYWxsYmFjaylcbiAgICAuY2F0Y2goY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldEJpdEdvRmVlXG4vLyBHZXQgdGhlIHJlcXVpcmVkIG9uLXRyYW5zYWN0aW9uIEJpdEdvIGZlZVxuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0Qml0R29GZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYW1vdW50IGFyZ3VtZW50Jyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9iaWxsaW5nL2ZlZScpKS5xdWVyeShwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKlxuICogQHBhcmFtc1xuICogIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2Ugb2Ygd2FsbGV0IHVzZWQgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleXNcbiAqICB1bnNwZW50czogYXJyYXkgb2YgdW5zcGVudHMgdG8gcmVjb3ZlclxuICogIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyB0b1xuICogIGZlZVJhdGU6IGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gKiAgdXNlcktleTogZW5jcnlwdGVkIHVzZXIga2V5XG4gKiAgYmFja3VwS2V5OiBlbmNyeXB0ZWQgYmFja3VwIGtleVxuICogKi9cbldhbGxldC5wcm90b3R5cGUucmVjb3ZlciA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVuc3BlbnRzJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlUmF0ZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1c2VyS2V5Jyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFja3VwS2V5Jyk7XG4gIH1cblxuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gQmlnSW50KHV0eG9saWIuYml0Z28udW5zcGVudFN1bShwYXJhbXMudW5zcGVudHMpKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcigpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZTtcbiAgY29uc3QgYXBwcm94aW1hdGVTaXplID1cbiAgICBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMudW5zcGVudHMubGVuZ3RoO1xuICBjb25zdCBhcHByb3hpbWF0ZVR4RmVlID0gQmlnSW50KGFwcHJveGltYXRlU2l6ZSAqIHBhcmFtcy5mZWVSYXRlKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVUeEZlZTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IE51bWJlcihyZWNvdmVyeUFtb3VudCkgfV07XG5cbiAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgcmVjaXBpZW50cyxcbiAgICBmZWU6IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSxcbiAgfSk7XG5cbiAgY29uc3QgcGFyc2VkVW5zaWduZWRUeCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHVuc2lnbmVkVHgudHJhbnNhY3Rpb25IZXgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lmlucy5sZW5ndGggPT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5vdXRzLmxlbmd0aCA9PT0gMSk7XG4gIGFzc2VydChfLnN1bUJ5KHBhcmFtcy51bnNwZW50cywgJ3ZhbHVlJykgLSBfLnN1bUJ5KHBhcnNlZFVuc2lnbmVkVHgub3V0cywgJ3ZhbHVlJykgPT09IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSk7XG5cbiAgY29uc3QgcGxhaW5Vc2VyS2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0QXN5bmMoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBwYXJhbXMudXNlcktleSB9KTtcbiAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oeyAuLi51bnNpZ25lZFR4LCBzaWduaW5nS2V5OiBwbGFpblVzZXJLZXkgfSk7XG5cbiAgY29uc3QgcGxhaW5CYWNrdXBLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHRBc3luYyh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IHBhcmFtcy5iYWNrdXBLZXkgfSk7XG4gIGNvbnN0IGZ1bGxTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHtcbiAgICAuLi51bnNpZ25lZFR4LFxuICAgIHRyYW5zYWN0aW9uSGV4OiBoYWxmU2lnbmVkVHgudHgsXG4gICAgc2lnbmluZ0tleTogcGxhaW5CYWNrdXBLZXksXG4gIH0pO1xuICByZXR1cm4gZnVsbFNpZ25lZFR4LnR4O1xufTtcblxuLypcbiAqIEBwYXJhbXNcbiAqICB3YWxsZXRQYXNzcGhyYXNlOiBwYXNzcGhyYXNlIG9mIHdhbGxldCB1c2VkIHRvIGRlY3J5cHQgdGhlIGVuY3J5cHRlZCBrZXlzXG4gKiAgdW5zcGVudHM6IGFycmF5IG9mIHVuc3BlbnRzIHRvIHJlY292ZXJcbiAqICByZWNvdmVyeURlc3RpbmF0aW9uOiBkZXN0aW5hdGlvbiBhZGRyZXNzIHRvIHJlY292ZXIgZnVuZHMgdG9cbiAqICBmZWVSYXRlOiBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICogIHVzZXJLZXk6IGVuY3J5cHRlZCB1c2VyIGtleVxuICogKi9cbldhbGxldC5wcm90b3R5cGUuc3dlZXAgPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXRQYXNzcGhyYXNlJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1bnNwZW50cycpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByZWNvdmVyeURlc3RpbmF0aW9uJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZlZVJhdGUnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlcktleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdXNlcktleScpO1xuICB9XG5cbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IEJpZ0ludCh1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW0ocGFyYW1zLnVuc3BlbnRzKSk7XG4gIGlmICh0b3RhbElucHV0QW1vdW50IDw9IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBFcnJvck5vSW5wdXRUb1JlY292ZXIoKTtcbiAgfVxuXG4gIGNvbnN0IG91dHB1dFNpemUgPSBWaXJ0dWFsU2l6ZXMudHhQMndzaE91dHB1dFNpemU7XG4gIGNvbnN0IGFwcHJveGltYXRlU2l6ZSA9XG4gICAgVmlydHVhbFNpemVzLnR4U2VnT3ZlcmhlYWRWU2l6ZSArIG91dHB1dFNpemUgKyBWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplICogcGFyYW1zLnVuc3BlbnRzLmxlbmd0aDtcbiAgY29uc3QgYXBwcm94aW1hdGVUeEZlZSA9IEJpZ0ludChhcHByb3hpbWF0ZVNpemUgKiBwYXJhbXMuZmVlUmF0ZSk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlVHhGZWU7XG4gIGNvbnN0IHJlY2lwaWVudHMgPSBbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiBOdW1iZXIocmVjb3ZlcnlBbW91bnQpIH1dO1xuXG4gIGNvbnN0IHVuc2lnbmVkVHggPSBhd2FpdCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHtcbiAgICB1bnNwZW50czogcGFyYW1zLnVuc3BlbnRzLFxuICAgIHJlY2lwaWVudHMsXG4gICAgZmVlOiBOdW1iZXIoYXBwcm94aW1hdGVUeEZlZSksXG4gIH0pO1xuXG4gIGNvbnN0IHBhcnNlZFVuc2lnbmVkVHggPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleCh1bnNpZ25lZFR4LnRyYW5zYWN0aW9uSGV4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5pbnMubGVuZ3RoID09PSBwYXJhbXMudW5zcGVudHMubGVuZ3RoKTtcbiAgYXNzZXJ0KHBhcnNlZFVuc2lnbmVkVHgub3V0cy5sZW5ndGggPT09IDEpO1xuICBhc3NlcnQoXy5zdW1CeShwYXJhbXMudW5zcGVudHMsICd2YWx1ZScpIC0gXy5zdW1CeShwYXJzZWRVbnNpZ25lZFR4Lm91dHMsICd2YWx1ZScpID09PSBOdW1iZXIoYXBwcm94aW1hdGVUeEZlZSkpO1xuXG4gIGNvbnN0IHBsYWluVXNlcktleSA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLnVzZXJLZXkgfSk7XG4gIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHsgLi4udW5zaWduZWRUeCwgc2lnbmluZ0tleTogcGxhaW5Vc2VyS2V5IH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLnNlbmRUcmFuc2FjdGlvbih7XG4gICAgdHg6IGhhbGZTaWduZWRUeC50eCxcbiAgICBzdXBwcmVzc0Jyb2FkY2FzdDogdHJ1ZSxcbiAgICBvdHA6IHBhcmFtcy5vdHAsXG4gIH0pO1xufTtcblxuZXhwb3J0ID0gV2FsbGV0O1xuIl19
|