@bitgo/sdk-core 2.0.0-rc.8 → 2.0.0-rc.9
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/CHANGELOG.md +16 -0
- package/dist/src/bitgo/staking/iStakingWallet.d.ts +32 -0
- package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/iStakingWallet.js +10 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts +9 -1
- package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
- package/dist/src/bitgo/staking/stakingWallet.js +18 -3
- package/dist/src/bitgo/wallet/wallet.d.ts +1 -2
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +3 -6
- package/dist/tsconfig.tsbuildinfo +8 -8
- package/package.json +3 -3
|
@@ -2031,9 +2031,8 @@ class Wallet {
|
|
|
2031
2031
|
* Signs and sends a single unsigned token enablement transaction
|
|
2032
2032
|
* @param params
|
|
2033
2033
|
* @returns
|
|
2034
|
-
* - The response from sending the transaction for hot wallets
|
|
2034
|
+
* - The response from sending the transaction for hot/cold wallets
|
|
2035
2035
|
* - The response from initiating the transaction for custodial wallets
|
|
2036
|
-
* - The included prebuilt transaction for cold wallets
|
|
2037
2036
|
*/
|
|
2038
2037
|
async sendTokenEnablement(params = {}) {
|
|
2039
2038
|
var _a, _b;
|
|
@@ -2050,11 +2049,9 @@ class Wallet {
|
|
|
2050
2049
|
else {
|
|
2051
2050
|
switch (this._wallet.type) {
|
|
2052
2051
|
case 'hot':
|
|
2052
|
+
case 'cold':
|
|
2053
2053
|
const signedPrebuild = await this.prebuildAndSignTransaction(params);
|
|
2054
2054
|
return await this.submitTransaction(signedPrebuild);
|
|
2055
|
-
case 'cold':
|
|
2056
|
-
// Don't sign or send and just return the built transaction
|
|
2057
|
-
return params.txPrebuild;
|
|
2058
2055
|
case 'custodial':
|
|
2059
2056
|
const url = this.baseCoin.url('/wallet/' + this.id() + '/tx/initiate');
|
|
2060
2057
|
return await this.bitgo.post(url).send(params.prebuildTx.buildParams).result();
|
|
@@ -2211,4 +2208,4 @@ class Wallet {
|
|
|
2211
2208
|
}
|
|
2212
2209
|
}
|
|
2213
2210
|
exports.Wallet = Wallet;
|
|
2214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsK0NBQXlDO0FBQ3pDLDBDQUE0QjtBQUM1QixxREFBdUM7QUFRdkMsd0NBQTJDO0FBRTNDLGtDQUEwQztBQUMxQyxzQ0FBOEU7QUFDOUUsK0RBQWlEO0FBQ2pELGlEQUFrRDtBQUVsRCx3REFBdUU7QUFDdkUsOERBQTJEO0FBQzNELG9DQUEwRztBQStDMUcsNERBQXlEO0FBQ3pELDRDQUF5QztBQUN6QywrREFBNEM7QUFDNUMsOENBQWdEO0FBQ2hELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQWEsTUFBTTtJQU9qQixZQUFZLEtBQWdCLEVBQUUsUUFBbUIsRUFBRSxVQUFlO1FBQ2hFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN0QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFR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QXY3RUQsd0JBdTdFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cblxuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHtcbiAgSUJhc2VDb2luLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbn0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgbWFrZVJhbmRvbUtleSB9IGZyb20gJy4uL2JpdGNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHsgQWRkcmVzc0dlbmVyYXRpb25FcnJvciwgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgKiBhcyBpbnRlcm5hbCBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcm5hbCc7XG5pbXBvcnQgeyBkcmF3S2V5Y2FyZCB9IGZyb20gJy4uL2ludGVybmFsL2tleWNhcmQnO1xuaW1wb3J0IHsgS2V5Y2hhaW4gfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBJUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWwgfSBmcm9tICcuLi9wZW5kaW5nQXBwcm92YWwnO1xuaW1wb3J0IHsgVHJhZGluZ0FjY291bnQgfSBmcm9tICcuLi90cmFkaW5nL3RyYWRpbmdBY2NvdW50JztcbmltcG9ydCB7IGluZmVyQWRkcmVzc1R5cGUsIFJlcXVlc3RUcmFjZXIsIFRzc1V0aWxzLCBUeFJlcXVlc3QsIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEFkZHJlc3Nlc09wdGlvbnMsXG4gIEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zLFxuICBDaGFuZ2VGZWVPcHRpb25zLFxuICBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyxcbiAgQ3JlYXRlQWRkcmVzc09wdGlvbnMsXG4gIENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBDcmVhdGVTaGFyZU9wdGlvbnMsXG4gIERlcGxveUZvcndhcmRlcnNPcHRpb25zLFxuICBEb3dubG9hZEtleWNhcmRPcHRpb25zLFxuICBGYW5vdXRVbnNwZW50c09wdGlvbnMsXG4gIEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zLFxuICBGcmVlemVPcHRpb25zLFxuICBHZXRBZGRyZXNzT3B0aW9ucyxcbiAgR2V0UHJ2T3B0aW9ucyxcbiAgR2V0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBHZXRUcmFuc2Zlck9wdGlvbnMsXG4gIEdldFVzZXJQcnZPcHRpb25zLFxuICBJV2FsbGV0LFxuICBNYXhpbXVtU3BlbmRhYmxlLFxuICBNYXhpbXVtU3BlbmRhYmxlT3B0aW9ucyxcbiAgTW9kaWZ5V2ViaG9va09wdGlvbnMsXG4gIFBhZ2luYXRpb25PcHRpb25zLFxuICBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0LFxuICBSZWNvdmVyVG9rZW5PcHRpb25zLFxuICBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgUmVtb3ZlVXNlck9wdGlvbnMsXG4gIFNlbmRNYW55T3B0aW9ucyxcbiAgU2VuZE9wdGlvbnMsXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBTd2VlcE9wdGlvbnMsXG4gIFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyxcbiAgVHJhbnNmZXJDb21tZW50T3B0aW9ucyxcbiAgVHJhbnNmZXJzT3B0aW9ucyxcbiAgVW5zcGVudHNPcHRpb25zLFxuICBVcGRhdGVBZGRyZXNzT3B0aW9ucyxcbiAgV2FsbGV0Q29pblNwZWNpZmljLFxuICBXYWxsZXREYXRhLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICcuL2lXYWxsZXQnO1xuaW1wb3J0IHsgU3Rha2luZ1dhbGxldCB9IGZyb20gJy4uL3N0YWtpbmcvc3Rha2luZ1dhbGxldCc7XG5pbXBvcnQgeyBMaWdodG5pbmcgfSBmcm9tICcuLi9saWdodG5pbmcnO1xuaW1wb3J0IEVkZHNhVXRpbHMgZnJvbSAnLi4vdXRpbHMvdHNzL2VkZHNhJztcbmltcG9ydCB7IEVjZHNhVXRpbHMgfSBmcm9tICcuLi91dGlscy90c3MvZWNkc2EnO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdiaXRnbzp2Mjp3YWxsZXQnKTtcblxudHlwZSBNYW5hZ2VVbnNwZW50cyA9ICdjb25zb2xpZGF0ZScgfCAnZmFub3V0JztcblxuZXhwb3J0IGNsYXNzIFdhbGxldCBpbXBsZW1lbnRzIElXYWxsZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG4gIHByaXZhdGUgX3dhbGxldDogV2FsbGV0RGF0YTtcbiAgcHJpdmF0ZSByZWFkb25seSB0c3NVdGlsczogRWNkc2FVdGlscyB8IEVkZHNhVXRpbHMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Blcm1pc3Npb25zPzogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbiwgd2FsbGV0RGF0YTogYW55KSB7XG4gICAgdGhpcy5iaXRnbyA9IGJpdGdvO1xuICAgIHRoaXMuYmFzZUNvaW4gPSBiYXNlQ29pbjtcbiAgICB0aGlzLl93YWxsZXQgPSB3YWxsZXREYXRhO1xuICAgIGNvbnN0IHVzZXJJZCA9IF8uZ2V0KGJpdGdvLCAnX3VzZXIuaWQnKTtcbiAgICBpZiAoXy5pc1N0cmluZyh1c2VySWQpKSB7XG4gICAgICBjb25zdCB1c2VyRGV0YWlscyA9IF8uZmluZCh3YWxsZXREYXRhLnVzZXJzLCB7IHVzZXI6IHVzZXJJZCB9KTtcbiAgICAgIHRoaXMuX3Blcm1pc3Npb25zID0gXy5nZXQodXNlckRldGFpbHMsICdwZXJtaXNzaW9ucycpO1xuICAgIH1cbiAgICBpZiAoYmFzZUNvaW4/LnN1cHBvcnRzVHNzKCkpIHtcbiAgICAgIHN3aXRjaCAoYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkpIHtcbiAgICAgICAgY2FzZSAnZWNkc2EnOlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSBuZXcgRWNkc2FVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGRzYSc6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFZGRzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBVUkwgdXNpbmcgdGhpcyB3YWxsZXQncyBpZCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgQml0R28gQVBJIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGV4dHJhIEFQSSBzcGVjaWZpYyBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSB3YWxsZXQgaWRcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArIGV4dHJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhpcyB3YWxsZXQncyBpZFxuICAgKi9cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBmb3Igc3BlbmRpbmcgZnVuZHMgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYXBwcm92YWxzUmVxdWlyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlO1xuICB9XG5cbiAgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdhZGRyZXNzVHlwZScsXG4gICAgICAnY2hhbmdlQWRkcmVzcycsXG4gICAgICAnY29uc29saWRhdGVBZGRyZXNzZXMnLFxuICAgICAgJ2NwZnBGZWVSYXRlJyxcbiAgICAgICdjcGZwVHhJZHMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnZ2FzTGltaXQnLFxuICAgICAgJ2dhc1ByaWNlJyxcbiAgICAgICdpZGZTaWduZWRUaW1lc3RhbXAnLFxuICAgICAgJ2lkZlVzZXJJZCcsXG4gICAgICAnaWRmVmVyc2lvbicsXG4gICAgICAnaW5zdGFudCcsXG4gICAgICAnbGFzdExlZGdlclNlcXVlbmNlJyxcbiAgICAgICdsZWRnZXJTZXF1ZW5jZURlbHRhJyxcbiAgICAgICdtYXhGZWUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd0cmFuc2ZlcklkJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ25vU3BsaXRDaGFuZ2UnLFxuICAgICAgJ251bUJsb2NrcycsXG4gICAgICAnbm9uY2UnLFxuICAgICAgJ3JlY2lwaWVudHMnLFxuICAgICAgJ3Jlc2VydmF0aW9uJyxcbiAgICAgICdzZXF1ZW5jZUlkJyxcbiAgICAgICdzdHJhdGVneScsXG4gICAgICAndGFyZ2V0V2FsbGV0VW5zcGVudHMnLFxuICAgICAgJ3RydXN0bGluZXMnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3Vuc3BlbnRzJyxcbiAgICAgICdub25QYXJ0aWNpcGF0aW9uJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdtZXNzYWdlS2V5JyxcbiAgICAgICdzdGFraW5nT3B0aW9ucycsXG4gICAgICAnZWlwMTU1OScsXG4gICAgICAna2V5cmVnVHhCYXNlNjQnLFxuICAgICAgJ2Nsb3NlUmVtYWluZGVyVG8nLFxuICAgICAgJ3Rva2VuTmFtZScsXG4gICAgICAnZW5hYmxlVG9rZW5zJyxcbiAgICAgIC8vIHBhcmFtIHRvIHNldCBlbWVyZ2VuY3kgZmxhZyBvbiBhIGN1c3RvZGlhbCB0cmFuc2FjdGlvbi5cbiAgICAgIC8vIFRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBpbiBsZXNzIHRoYW4gMSBob3VyIG9yIGl0IHdpbGwgZmFpbC5cbiAgICAgICdlbWVyZ2VuY3knLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHN0cmljdCBzdWItc2V0IG9mIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXNcbiAgICovXG4gIHByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydjb25zb2xpZGF0ZUFkZHJlc3NlcycsICdmZWVSYXRlJywgJ21heEZlZVJhdGUnLCAnbWVtbycsICd2YWxpZEZyb21CbG9jaycsICd2YWxpZFRvQmxvY2snLCAncHJldmlldyddO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBiYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29pbiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBjb2luIHRoaXMgd2FsbGV0IGhvbGRzXG4gICAqL1xuICBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFiZWwgKG5hbWUpIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5sYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBvYmplY3QgaWRzIGZvciB0aGUga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LlxuICAgKi9cbiAgcHVibGljIGtleUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5rZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlY2VpdmUgYWRkcmVzcyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlQWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucmVjZWl2ZUFkZHJlc3MuYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAtIHR4SGFzaCB0aGUgdHJhbnNhY3Rpb24gaGFzaCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24ocGFyYW1zOiBHZXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eEhhc2gnXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoJy90eC8nICsgcGFyYW1zLnR4SGFzaCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNmZXJzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJzKHBhcmFtczogVHJhbnNmZXJzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogVHJhbnNmZXJzT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoTGFiZWwpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuc2VhcmNoTGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWFyY2hMYWJlbCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2VhcmNoTGFiZWwgPSBwYXJhbXMuc2VhcmNoTGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICBwYXJhbXMuYWRkcmVzcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlR3RlKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlR3RlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlR3RlID0gcGFyYW1zLmRhdGVHdGU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlTHQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUx0IGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlTHQgPSBwYXJhbXMuZGF0ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlR3RlID0gcGFyYW1zLnZhbHVlR3RlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlTHQgPSBwYXJhbXMudmFsdWVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVIZXggPSBwYXJhbXMuaW5jbHVkZUhleDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnN0YXRlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICBwYXJhbXMuc3RhdGUuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBzdGF0ZSBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudHlwZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVVuc3BlbnRzKFxuICAgIHJvdXRlTmFtZTogTWFuYWdlVW5zcGVudHMsXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyB8IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heEZlZVBlcmNlbnRhZ2UnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG5cbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAndGFyZ2V0QWRkcmVzcycsXG5cbiAgICAgIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJyA/ICdsaW1pdCcgOiAnbWF4TnVtSW5wdXRzVG9Vc2UnLFxuICAgICAgJ251bVVuc3BlbnRzVG9NYWtlJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3JvdXRlTmFtZX1VbnNwZW50c2ApKVxuICAgICAgLnNlbmQoZmlsdGVyZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgLmtleWNoYWlucygpXG4gICAgICAuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHB1YnM6IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSxcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY29tbWVudCcsICdvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCB7IHR5cGU6IHJvdXRlTmFtZSB9KTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKGZpbmFsVHhQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2NvbnNvbGlkYXRlJywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnZmFub3V0JywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoZSB3YWxsZXQuIFVwZGF0ZXMgdGhlIHdhbGxldC5cbiAgICogVG9rZW5zIHdpbGwgb25seSBiZSBmbHVzaGVkIGZyb20gZm9yd2FyZGVyIGNvbnRyYWN0cyBpZiB0aGUgYmFsYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkZWZpbmVkIGhlcmUuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRzIHtPYmplY3R9IC0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkIH0gKGJhc2UgdW5pdHMpXG4gICAqL1xuICBhc3luYyB1cGRhdGVUb2tlbkZsdXNoVGhyZXNob2xkcyh0aHJlc2hvbGRzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB0b2tlbkZsdXNoVGhyZXNob2xkczogdGhyZXNob2xkcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbiAgLyoqXG4gICAgICAqIFVwZGF0ZXMgdGhlIHdhbGxldC4gU2V0cyBmbGFncyBmb3IgZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5IGFuZCBmbHVzaEZvcndhcmRlcnNNYW51YWxseSBvZiB0aGUgd2FsbGV0LlxuICAgICAgKiBAcGFyYW0gZm9yd2FyZGVyRmxhZ3Mge09iamVjdH0gLSB7XG4gICAgICAgIFwiY29pblNwZWNpZmljXCI6IHtcbiAgICAgICAgICBbY29pbk5hbWVdOiB7XG4gICAgICAgICAgICBcImRlcGxveUZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn0sXG4gICAgICAgICAgICBcImZsdXNoRm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgYXN5bmMgdXBkYXRlRm9yd2FyZGVycyhmb3J3YXJkZXJGbGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKGZvcndhcmRlckZsYWdzKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBkZXBsb3kgYW4gRVRIIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGRlcGxveUZvcndhcmRlcnMocGFyYW1zOiBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L2RlcGxveW1lbnRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBmb3J3YXJkIHRva2VucyBmcm9tIGFuIEVUSCBvciBDRUxPIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gTmFtZSBvZiB0b2tlbiB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZ2FzUHJpY2VdIC0gRXhwbGljaXQgZ2FzIHByaWNlIHRvIHVzZSB3aGVuIGZvcndhcmRpbmcgdG9rZW4gZnJvbSB0aGUgZm9yd2FyZGVyIGNvbnRyYWN0IChFVEggYW5kIENlbG8gb25seSkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZXN0aW1hdGVkIG5ldHdvcmsgZ2FzIHByaWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5laXAxNTU5XSAtIFNwZWNpZnkgZWlwMTU1OSBmZWUgcGFyYW1ldGVycyBpbiB0b2tlbiBmb3J3YXJkaW5nIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBmbHVzaEZvcndhcmRlclRva2VuKHBhcmFtczogRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS90b2tlbmZvcndhcmRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2VlcCBmdW5kcyBmb3IgYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHNlbmQgYWxsIHRoZSBmdW5kcyBpbiB0aGUgd2FsbGV0IHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIEVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGhpbiB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhGZWVSYXRlXSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hbGxvd1BhcnRpYWxTd2VlcF0gLSBhbGxvd3Mgc3dlZXBpbmcgMjAwIHVuc3BlbnRzIHdoZW4gdGhlIHdhbGxldCBoYXMgbW9yZSB0aGFuIHRoYXRcbiAgICogQHJldHVybnMgdHhIZXgge1N0cmluZ30gdGhlIHR4SGV4IG9mIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIHN3ZWVwKHBhcmFtczogU3dlZXBPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnLCAnb3RwJ10pO1xuXG4gICAgLy8gVGhlIHN3ZWVwIEFQSSBlbmRwb2ludCBpcyBvbmx5IGF2YWlsYWJsZSB0byB1dHhvLWJhc2VkIGNvaW5zXG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3dlZXBXaXRoU2VuZE1hbnkoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpICE9PSB0aGlzLmJhbGFuY2VTdHJpbmcoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzd2VlcCB3aGVuIHVuY29uZmlybWVkIGZ1bmRzIGV4aXN0IG9uIHRoZSB3YWxsZXQsIHBsZWFzZSB3YWl0IHVudGlsIGFsbCBpbmJvdW5kIHRyYW5zYWN0aW9ucyBjb25maXJtJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpO1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpIHx8IHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmdW5kcyB0byBzd2VlcCcpO1xuICAgICAgfVxuICAgICAgKHBhcmFtcyBhcyBhbnkpLnJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkocGFyYW1zKTtcbiAgICB9XG4gICAgLy8gdGhlIGZvbGxvd2luZyBmbG93IHdvcmtzIGZvciBhbGwgVVRYTyBjb2luc1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2FkZHJlc3MnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG4gICAgICAnYWxsb3dQYXJ0aWFsU3dlZXAnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zd2VlcFdhbGxldCcpKS5zZW5kKGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIC8vIFRPRE8oQkctMzU4OCk6IGFkZCB0eEhleCB2YWxpZGF0aW9uIHRvIHByb3RlY3QgbWFuIGluIHRoZSBtaWRkbGUgYXR0YWNrcyByZXBsYWNpbmcgdGhlIHR4SGV4XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIGFueTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHJ2OiBwYXJhbXMueHBydixcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChmaW5hbFR4UGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uOiBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZnJlZXplJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbWVudCBvZiBhIHRyYW5zZmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckNvbW1lbnQocGFyYW1zOiBUcmFuc2ZlckNvbW1lbnRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydjb21tZW50J10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQgKyAnL2NvbW1lbnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXMocGFyYW1zOiBBZGRyZXNzZXNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5taW5lKSB7XG4gICAgICBxdWVyeS5taW5lID0gISFwYXJhbXMubWluZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sYWJlbENvbnRhaW5zKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsQ29udGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsYWJlbENvbnRhaW5zIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5sYWJlbENvbnRhaW5zID0gcGFyYW1zLmxhYmVsQ29udGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIG51bWJlcnMnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWlucyA9IHBhcmFtcy5jaGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlQmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZXMgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2VzO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRva2VucyA9IHBhcmFtcy5pbmNsdWRlVG9rZW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50ID0gcGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJldHVybkJhbGFuY2VzRm9yVG9rZW4gYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJldHVybkJhbGFuY2VzRm9yVG9rZW4gPSBwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZW5kaW5nRGVwbG95bWVudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnBlbmRpbmdEZXBsb3ltZW50ID0gcGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3NlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB3YWxsZXQgYWRkcmVzcyBieSBpdHMgaWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldEFkZHJlc3MocGFyYW1zOiBHZXRBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydhZGRyZXNzJywgJ2lkJ10pO1xuICAgIGxldCBxdWVyeTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5fd2FsbGV0LmlkfS9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb25lIG9yIG1vcmUgbmV3IGFkZHJlc3MoZXMpIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbiAgICpcbiAgICogSWYgdGhlIGBjb3VudGAgZmllbGQgaXMgZGVmaW5lZCBhbmQgZ3JlYXRlciB0aGFuIDEsIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlXG4gICAqIGFycmF5IHByb3BlcnR5IG5hbWVkIGBhZGRyZXNzZXNgIGNvbnRhaW5pbmcgYGNvdW50YCBhZGRyZXNzIG9iamVjdHNcbiAgICogd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHNpbmdsZSBhZGRyZXNzIG9iamVjdCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNoYWluIG9uIHdoaWNoIHRoZSBuZXcgYWRkcmVzcyBzaG91bGQgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0geyhOdW1iZXJ8U3RyaW5nKX0gcGFyYW1zLmdhc1ByaWNlIGdhcyBwcmljZSBmb3IgbmV3IGFkZHJlc3MgY3JlYXRpb24sIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5sYWJlbCBsYWJlbCBmb3IgdGhlIG5ldyBhZGRyZXNzKGVzKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmRlcml2ZWRBZGRyZXNzXSAgRGVyaXZlZCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLmluZGV4XSBJbmRleCBvZiB0aGUgZGVyaXZlZCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLnBhc3NwaHJhc2VdIHBhc3NwaHJhc2VcbiAgICogQWRkcmVzcyB2ZXJpZmljYXRpb24gY2FuIGJlIHNraXBwZWQgd2hlbiBmb3J3YXJkZXJWZXJzaW9uIGlzIDAgYW5kIHBlbmRpbmdDaGFpbkluaXRpYWxpemF0aW9uIGlzIHRydWUgT1JcbiAgICogaWYgJ2NvaW5TcGVjaWZpYycgaXMgbm90IHBhcnQgb2YgdGhlIHJlc3BvbnNlIGZyb20gYXBpIGNhbGwgdG8gY3JlYXRlIGFkZHJlc3NcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFkZHJlc3MocGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzUGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNoYWluLFxuICAgICAgZ2FzUHJpY2UsXG4gICAgICBsYWJlbCxcbiAgICAgIGxvd1ByaW9yaXR5LFxuICAgICAgZm9yd2FyZGVyVmVyc2lvbixcbiAgICAgIGZvcm1hdCxcbiAgICAgIGNvdW50ID0gMSxcbiAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyA9IHRydWUsXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChjaGFpbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoY2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW4gaGFzIHRvIGJlIGFuIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZ2FzUHJpY2UpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGdhc1ByaWNlKSAmJiAoaXNOYU4oTnVtYmVyKGdhc1ByaWNlKSkgfHwgIV8uaXNTdHJpbmcoZ2FzUHJpY2UpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dhc1ByaWNlIGhhcyB0byBiZSBhbiBpbnRlZ2VyIG9yIG51bWVyaWMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2U7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcndhcmRlclZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGZvcndhcmRlclZlcnNpb24pIHx8IGZvcndhcmRlclZlcnNpb24gPCAwIHx8IGZvcndhcmRlclZlcnNpb24gPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyVmVyc2lvbiBoYXMgdG8gYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb247XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYXNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhiYXNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4oYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGxvd1NraXBWZXJpZnlBZGRyZXNzIGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGNvdW50KSB8fCBjb3VudCA8PSAwIHx8IGNvdW50ID4gMjUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdW50IGhhcyB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDI1MCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsb3dQcmlvcml0eSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4obG93UHJpb3JpdHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbG93UHJpb3JpdHkgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sb3dQcmlvcml0eSA9IGxvd1ByaW9yaXR5O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3JtYXQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cblxuICAgIC8vIGdldCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fd2FsbGV0LmtleXMubWFwKChrKSA9PiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrLCByZXFJZCB9KSkpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gXy5nZXQodGhpcy5fd2FsbGV0LCAncmVjZWl2ZUFkZHJlc3MuYWRkcmVzcycpO1xuXG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gXy50aW1lcyhjb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzJykpXG4gICAgICAgIC5zZW5kKGFkZHJlc3NQYXJhbXMpXG4gICAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgICAvLyBpbmZlciBpdHMgYWRkcmVzcyB0eXBlXG4gICAgICBpZiAoXy5pc09iamVjdChuZXdBZGRyZXNzLmNvaW5TcGVjaWZpYykpIHtcbiAgICAgICAgbmV3QWRkcmVzcy5hZGRyZXNzVHlwZSA9IGluZmVyQWRkcmVzc1R5cGUobmV3QWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIG5ld0FkZHJlc3Mua2V5Y2hhaW5zID0ga2V5Y2hhaW5zO1xuICAgICAgbmV3QWRkcmVzcy5iYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzID8/IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ2NvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcycpO1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25EYXRhOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyA9IF8ubWVyZ2Uoe30sIG5ld0FkZHJlc3MsIHsgcm9vdEFkZHJlc3MgfSk7XG5cbiAgICAgIGlmICh2ZXJpZmljYXRpb25EYXRhLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbiA/PyB2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYz8uZm9yd2FyZGVyVmVyc2lvbjtcbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHdlYmhvb2tzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rcyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB3YWxsZXQgd2ViaG9vaywgY3VycmVudGx5IGZvciB3ZWJob29rcyBvZiB0eXBlIHRyYW5zZmVyIGFuZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKSBpZCBvZiB0aGUgd2ViaG9vayB0byBiZSBzaW11bGF0ZWRcbiAgICogLSB0cmFuc2ZlcklkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHRyYW5zZmVyIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zZmVyXG4gICAqIC0gcGVuZGluZ0FwcHJvdmFsSWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgcGVuZGluZyBhcHByb3ZhbCB3ZWJob29rcykgaWQgb2YgdGhlIHNpbXVsYXRlZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogU2ltdWxhdGVXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCBoYXNUcmFuc2ZlcklkID0gISFwYXJhbXMudHJhbnNmZXJJZDtcbiAgICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuICAgIGlmICghaGFzVHJhbnNmZXJJZCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHRyYW5zZmVySWQgb3IgcGVuZGluZ0FwcHJvdmFsSWQnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVHJhbnNmZXJJZCAmJiBoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAgIC8vIGJ1dCB0aGUgc2VydmVyIHRha2VzIGNhcmUgb2YgdGhhdFxuXG4gICAgLy8gb25seSB0YWtlIHRoZSB0cmFuc2ZlcklkIGFuZCBwZW5kaW5nQXBwcm92YWxJZCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB3ZWJob29rIHRvIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgd2ViaG9vayBmcm9tIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhlIHVzZXIga2V5IGNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVuY3J5cHRlZCBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgaWQ6IHRoaXMuX3dhbGxldC5rZXlzW2luZGV4XSB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSBwcnYsIHRoZW4gdGhpcyBpcyBwcm9iYWJseSB0aGUgdXNlciBrZXljaGFpbiB3ZSdyZSBsb29raW5nIGZvclxuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW4gYXMgeyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyeUtleUNoYWluKGluZGV4ICsgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmb3IgdGhpcyB3YWxsZXQgKGJlIGNhcmVmdWwhKVxuICAgKiBSZXF1aXJlcyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRQcnYocGFyYW1zOiBHZXRQcnZPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAncHJ2J10pO1xuXG4gICAgLy8gUHJlcGFyZSBzaWduaW5nIGtleVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgZWl0aGVyIHByb3ZpZGUgcHJ2IG9yIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5wcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcnYpIHtcbiAgICAgIHJldHVybiBwYXJhbXMucHJ2O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IChhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG5cbiAgICBsZXQgdXNlclBydjtcbiAgICB0cnkge1xuICAgICAgdXNlclBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBkZWNyeXB0aW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBlbmNyeXB0ZWQgd2FsbGV0IHNoYXJlIHRvIEJpdEdvLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZShwYXJhbXM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInLCAncGVybWlzc2lvbnMnXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4udG9QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlcyBrZXljaGFpbiBwYXJhbWV0ZXJzIC0gcHViLCBlbmNyeXB0ZWRQcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSB0aGlzIHdhbGxldCB3aXRoIGFub3RoZXIgQml0R28gdXNlci5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNoYXJlV2FsbGV0KHBhcmFtczogU2hhcmVXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlc2hhcmUgdG8gYmUgYSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHNraXBLZXljaGFpbiB0byBiZSBhIGJvb2xlYW4uICcpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICAgIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGRpc2FibGVFbWFpbCB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5lbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGVtYWlsJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZyA9IChhd2FpdCB0aGlzLmJpdGdvLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleWNoYWluID0gKGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KSkgYXMgYW55O1xuICAgICAgICAvLyBEZWNyeXB0IHRoZSB1c2VyIGtleSB3aXRoIGEgcGFzc3BocmFzZVxuICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFBydiB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ucHJ2IH0pO1xuICAgICAgICAgIC8vIE9ubHkgb25lIG9mIHB1Yi9jb21tb25QdWIvY29tbW9uS2V5Y2hhaW4gc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGtleWNoYWluXG4gICAgICAgICAgbGV0IHB1YiA9IGtleWNoYWluLnB1YiA/PyBrZXljaGFpbi5jb21tb25QdWI7XG4gICAgICAgICAgaWYgKGtleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICAgICAgICBwdWIgPSBUc3NVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgIHB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgIHBhdGg6IHNoYXJpbmcucGF0aCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpIHtcbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHt9O1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICB9O1xuXG4gICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0gc2hhcmVkS2V5Y2hhaW47XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVzZXIgZnJvbSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHVzZXJJZCBJZCBvZiB0aGUgdXNlciB0byByZW1vdmVcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVVzZXIocGFyYW1zOiBSZW1vdmVVc2VyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1c2VySWQgPSBwYXJhbXMudXNlcklkO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3VzZXIvJyArIHVzZXJJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgKHVuc2lnbmVkIHRyYW5zYWN0aW9uKSBmcm9tIEJpdEdvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gTWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyB1bnNwZW50cyBnb2luZyBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIG9uIGNoYW5nZSAoaW50ZXJuYWwpIGlucHV0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXQuIElmIHRoZSB3YWxsZXTigJlzIGN1cnJlbnQgdW5zcGVudCBjb3VudCBpcyBsb3dlciB0aGFuIHRoZSB0YXJnZXQsIHVwIHRvIGZvdXIgYWRkaXRpb25hbCBjaGFuZ2Ugb3V0cHV0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heFZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIGxhcmdlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc0xpbWl0IC0gQ3VzdG9tIGdhcyBsaW1pdCB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub25QYXJ0aWNpcGF0aW9uIC0gKEFsZ29yYW5kKSBOb24gcGFydGljaXBhdGluZyBrZXkgcmVnIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRGcm9tQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtaW5pbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZFRvQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtYXhpbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIEJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gdG8gY29uZm9ybSB3aXRoIGluc3RhbnQgc2VuZGluZyBjb2luLXNwZWNpZmljIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtLnRyYW5zZmVySWQgLSB0cmFuc2ZlciBJZCB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBjYXNwZXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzc1R5cGUgLSBUaGUgdHlwZSBvZiBhZGRyZXNzIHRvIGNyZWF0ZSBmb3IgY2hhbmdlLiBPbmUgb2YgYHAyc2hgLCBgcDJzaFAyd3NoYCwgYW5kIGBwMndzaGAuIENhc2Utc2Vuc2l0aXZlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ob3AgLSBCdWlsZCB0aGlzIGFzIGFuIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLnJlc2VydmF0aW9uIC0gT2JqZWN0IHRvIHJlc2VydmUgdGhlIHVuc3BlbnRzIHRoYXQgdGhpcyB0eCBidWlsZCB1c2VzLiBGb3JtYXQgaXMgcmVzZXJ2YXRpb24gPSB7IGV4cGlyZVRpbWU6IElTT0RhdGVTdHJpbmcsIHBlbmRpbmdBcHByb3ZhbElkOiBTdHJpbmcgfVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgVGhlIHBhc3NwaHJhc2UgdG8gdGhlIHdhbGxldCB1c2VyIGtleSwgdG8gc2lnbiBjb21taXRtZW50IGRhdGEgZm9yIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyB1c2VkIGFzIHRoZSBcInRvXCIgZmllbGQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uVHNzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIGRlYnVnKCdwcmVidWlsZGluZyB0cmFuc2FjdGlvbjogJU8nLCB3aGl0ZWxpc3RlZFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG4gICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICBPYmplY3QuYXNzaWduKHdoaXRlbGlzdGVkUGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7XG4gICAgICBvZmZsaW5lVmVyaWZpY2F0aW9uOiBwYXJhbXMub2ZmbGluZVZlcmlmaWNhdGlvbiA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWxkUXVlcnkgPSB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9idWlsZCcpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5UGFyYW1zKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBjb25zdCBibG9ja0hlaWdodFF1ZXJ5ID0gXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZ2V0TGF0ZXN0QmxvY2tIZWlnaHQpXG4gICAgICA/ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZ2V0TGF0ZXN0QmxvY2tIZWlnaHQocGFyYW1zLnJlcUlkKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBjb25zdCBxdWVyaWVzID0gW2J1aWxkUXVlcnksIGJsb2NrSGVpZ2h0UXVlcnldO1xuICAgIGNvbnN0IFtidWlsZFJlc3BvbnNlLCBibG9ja0hlaWdodF0gPSAoYXdhaXQgUHJvbWlzZS5hbGwocXVlcmllcykpIGFzIGFueTtcbiAgICBkZWJ1ZygncG9zdHByb2Nlc3NpbmcgdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgYnVpbGRSZXNwb25zZSk7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJsb2NrSGVpZ2h0KSkge1xuICAgICAgYnVpbGRSZXNwb25zZS5ibG9ja0hlaWdodCA9IGJsb2NrSGVpZ2h0O1xuICAgIH1cbiAgICBsZXQgcHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5wb3N0UHJvY2Vzc1ByZWJ1aWxkKFxuICAgICAgT2JqZWN0LmFzc2lnbihidWlsZFJlc3BvbnNlLCB7IHdhbGxldDogdGhpcywgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zIH0pXG4gICAgKSkgYXMgYW55O1xuICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgaWYgKHRoaXMuX3dhbGxldCAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljICYmICFwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzKSB7XG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MgfSk7XG4gICAgfVxuICAgIGRlYnVnKCdmaW5hbCB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG4gICAgcmV0dXJuIHByZWJ1aWxkIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eFByZWJ1aWxkXG4gICAqIC0gW2tleWNoYWluIC8ga2V5XSAob2JqZWN0KSBvciBwcnYgKHN0cmluZylcbiAgICogLSB3YWxsZXRQYXNzcGhyYXNlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyB0eFByZWJ1aWxkIH0gPSBwYXJhbXM7XG4gICAgaWYgKCF0eFByZWJ1aWxkIHx8IHR5cGVvZiB0eFByZWJ1aWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3MoeyAuLi5wcmVzaWduLCBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSB9KTtcbiAgICB9XG5cbiAgICBsZXQgeyBwdWJzIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwdWJzICYmIHRoaXMuYmFzZUNvaW4ua2V5SWRzRm9yU2lnbmluZygpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBwdWJzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnByZXNpZ24sXG4gICAgICB0eFByZWJ1aWxkLFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHNpZ25UcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIgcHJpdmF0ZSBrZXkgZnJvbSBlaXRoZXIgYSBkZXJpdmF0aW9uIG9yIGFuIGVuY3J5cHRlZCBrZXljaGFpblxuICAgKiBAcGFyYW0gW3BhcmFtcy5rZXljaGFpbiAvIHBhcmFtcy5rZXldIChvYmplY3QpIG9yIHBhcmFtcy5wcnYgKHN0cmluZylcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIChzdHJpbmcpXG4gICAqL1xuICBnZXRVc2VyUHJ2KHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIHVzZSB0aGUgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIHByb3BlcnR5IGZyb20gdGhlIHVzZXIga2V5Y2hhaW4gYXMgdGhlIGBjb2xkRGVyaXZhdGlvblNlZWRgXG4gICAgLy8gaWYgbm8gb3RoZXIgYGNvbGREZXJpdmF0aW9uU2VlZGAgd2FzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID0gcGFyYW1zLmtleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgfVxuXG4gICAgaWYgKHVzZXJQcnYgJiYgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgLy8gdGhlIGRlcml2YXRpb24gb25seSBtYWtlcyBzZW5zZSB3aGVuIGEga2V5IGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBkZXJpdmF0aW9uID0gdGhpcy5iYXNlQ29pbi5kZXJpdmVLZXlXaXRoU2VlZCh7IGtleTogdXNlclBydiwgc2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCB9KTtcbiAgICAgIHVzZXJQcnYgPSBkZXJpdmF0aW9uLmtleTtcbiAgICB9IGVsc2UgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmICghdXNlckVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBwcm9wZXJ0eSBtaXNzaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogdXNlckVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBmcm9tIEJpdEdvLCB2YWxpZGF0ZSBpdCwgYW5kIHRoZW4gZGVjcnlwdCB0aGUgdXNlciBrZXkgYW5kIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5ICYmIHBhcmFtcy5nYXNQcmljZSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcGFyYW1zLmVpcDE1NTkgYW5kIHBhcmFtcy5nYXNQcmljZSBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfZ2FzUHJpY2VfYW5kX2VpcDE1NTlnYXNNb2RlbF9zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcmVidWlsZFR4ICYmIHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwcmVidWlsZFR4IGFuZCByZWNpcGllbnRzIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9wcmVidWlsZHR4X2FuZF9yZWNpcGllbnRzX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBhcnJheScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuX3Blcm1pc3Npb25zKSAmJiAhdGhpcy5fcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ25vIHNwZW5kIHBlcm1pc3Npb24gb24gdGhpcyB3YWxsZXQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAndXNlcl9ub3RfYWxsb3dlZF90b19zcGVuZF9mcm9tX3dhbGxldCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBjYWxsIHByZWJ1aWxkVHJhbnNhY3Rpb24gYW5kIGtleWNoYWlucy1nZXQgaW4gcGFyYWxsZWxcbiAgICAvLyB0aGUgcHJlYnVpbGQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuIGV4cGxpY2l0IHR4XG4gICAgY29uc3QgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuXG4gICAgY29uc3QgdHhQcmVidWlsZCA9IChhd2FpdCB0eFByZWJ1aWxkUXVlcnkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zIHx8IHBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZCBmYWlsZWQgbG9jYWwgdmFsaWRhdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ3RyYW5zYWN0aW9uIHBhcmFtczonLFxuICAgICAgICBfLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkOicsIHR4UHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDoge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBtdWx0aXNpZyBhZGRyZXNzIGF0IHdhbGxldCBjcmVhdGlvbiB0aW1lXG4gICAgICAgIGFkZHJlc3NWZXJzaW9uOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmFkZHJlc3NWZXJzaW9uLFxuICAgICAgfSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViczoga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2luc3VmZmljaWVudCBmdW5kcycpKSB7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnaW5zdWZmaWNpZW50X2Z1bmRzJztcbiAgICAgICAgZXJyb3Iud2FsbGV0QmFsYW5jZXMgPSB7XG4gICAgICAgICAgYmFsYW5jZVN0cmluZzogdGhpcy5iYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZVN0cmluZzogdGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZzogdGhpcy5zcGVuZGFibGVCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgYmFsYW5jZTogdGhpcy5iYWxhbmNlKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZTogdGhpcy5jb25maXJtZWRCYWxhbmNlKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZTogdGhpcy5zcGVuZGFibGVCYWxhbmNlKCksXG4gICAgICAgIH07XG4gICAgICAgIGVycm9yLnR4UGFyYW1zID0gXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleSddKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlbGVyYXRlIGEgdHJhbnNhY3Rpb24ncyBjb25maXJtYXRpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhY2NlbGVyYXRlVHJhbnNhY3Rpb24ocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIFRPRE8oQkctOTM0OSk6IGNoYW5nZSB0aGUgbGFzdCBjaGVjayB0byA+IDAgYW5kIHRoZSBlcnJvciBtZXNzYWdlIG9uY2UgcGxhdGZvcm0gYWxsb3dzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyB0b1xuICAgIC8vICAgICAgICAgICAgICAgIGJlIGJ1bXBlZCBpbiB0aGUgc2FtZSBDUEZQIHRyYW5zYWN0aW9uXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmNwZnBUeElkcykgfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zLmNwZnBUeElkcykgfHwgcGFyYW1zLmNwZnBUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBjcGZwVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuY3BmcEZlZVJhdGUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vQ3BmcEZlZVJhdGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vQ3BmcEZlZVJhdGUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5jcGZwRmVlUmF0ZSkgfHwgcGFyYW1zLmNwZnBGZWVSYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vTWF4RmVlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9NYXhGZWUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4RmVlKSB8fCBwYXJhbXMubWF4RmVlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykgfHwgcGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBmb3IgJ3JlY2lwaWVudHMnOiBtdXN0IGJlIGVtcHR5IGFycmF5IHdoZW4gc2V0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyYW1zLnJlY2lwaWVudHMgPSBbXTtcblxuICAgIC8vIFdlIG11c3QgcGFzcyB0aGUgYnVpbGQgcGFyYW1zIHRocm91Z2ggdG8gc3VibWl0IGluIGNhc2UgdGhlIENQRlAgdHggZXZlciBoYXMgdG8gYmUgcmVidWlsdC5cbiAgICBjb25zdCBzdWJtaXRQYXJhbXMgPSBPYmplY3QuYXNzaWduKHBhcmFtcywgYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKTtcbiAgICBkZWxldGUgKHN1Ym1pdFBhcmFtcyBhcyBhbnkpLndhbGxldDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzdWJtaXRQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eEhleDogdHJhbnNhY3Rpb24gaGV4IHRvIHN1Ym1pdFxuICAgKiAtIGhhbGZTaWduZWQ6IG9iamVjdCBjb250YWluaW5nIHRyYW5zYWN0aW9uICh0eEhleCBvciB0eEJhc2U2NCkgdG8gc3VibWl0XG4gICAqL1xuICBhc3luYyBzdWJtaXRUcmFuc2FjdGlvbihwYXJhbXM6IFN1Ym1pdFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydvdHAnLCAndHhIZXgnLCAndHhSZXF1ZXN0SWQnXSk7XG4gICAgY29uc3QgaGFzVHhIZXggPSAhIXBhcmFtcy50eEhleDtcbiAgICBjb25zdCBoYXNIYWxmU2lnbmVkID0gISFwYXJhbXMuaGFsZlNpZ25lZDtcblxuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKGhhc1R4SGV4IHx8IGhhc0hhbGZTaWduZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGV4YWN0bHkgb25lIG9mIHR4UmVxdWVzdElkLCB0eEhleCwgb3IgaGFsZlNpZ25lZCcpO1xuICAgIH0gZWxzZSBpZiAoIXBhcmFtcy50eFJlcXVlc3RJZCAmJiAoKGhhc1R4SGV4ICYmIGhhc0hhbGZTaWduZWQpIHx8ICghaGFzVHhIZXggJiYgIWhhc0hhbGZTaWduZWQpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIZXggb3IgaGFsZlNpZ25lZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGNvaW5zIHRvIGEgcmVjaXBpZW50XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIC0gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtcy5hbW91bnQgLSB0aGUgYW1vdW50IGluIHNhdG9zaGlzL3dlaS9iYXNlIHZhbHVlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5kYXRhIC0gW0V0aGVyZXVtIFNwZWNpZmljXSBvcHRpb25hbCBkYXRhIHRvIHBhc3MgdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkIC0gW0V0aGVyZXVtL01NSSBTcGVjaWZpY10gaWQgb2YgdHJhbnNhY3Rpb24gY3JlYXRlZCB2aWEgbWV0YW1hc2tcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSwgaWYgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSBwYXJhbXMubWluQ29uZmlybXMgLSB0aGUgbWluaW11bSBjb25maXJtYXRpb24gdGhyZXNob2xkIGZvciBpbnB1dHNcbiAgICogQHBhcmFtIHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSB3aGV0aGVyIHRvIGVuZm9yY2UgbWluQ29uZmlybXMgZm9yIGNoYW5nZSBpbnB1dHNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kKHBhcmFtczogU2VuZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnbWVzc2FnZScsICdkYXRhJ10pO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luID0gdGhpcy5iYXNlQ29pbjtcblxuICAgIGNvbnN0IGFtb3VudCA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmFtb3VudCk7XG4gICAgaWYgKGFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGFtb3VudC5pc1plcm8oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhbW91bnQgLSBwb3NpdGl2ZSBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgcmVjaXBpZW50czogU2VuZE1hbnlPcHRpb25zWydyZWNpcGllbnRzJ10gPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgICB9LFxuICAgIF07XG4gICAgaWYgKHBhcmFtcy50b2tlbk5hbWUpIHtcbiAgICAgIHJlY2lwaWVudHNbMF0udG9rZW5OYW1lID0gcGFyYW1zLnRva2VuTmFtZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5kYXRhICYmIGNvaW4udHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpKSB7XG4gICAgICByZWNpcGllbnRzWzBdLmRhdGEgPSBwYXJhbXMuZGF0YTtcbiAgICB9XG4gICAgY29uc3Qgc2VuZE1hbnlPcHRpb25zOiBTZW5kTWFueU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMsIHsgcmVjaXBpZW50cyB9KTtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgbW9uZXkgdG8gbXVsdGlwbGUgcmVjaXBpZW50c1xuICAgKiAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgcHJ2XG4gICAqIDIuIERlY3J5cHRzIHVzZXIga2V5XG4gICAqIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbiAgICogNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbiAgICogNS4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG90aGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNvbW1lbnQgLSBBbnkgYWRkaXRpb25hbCBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gU2VuZCB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIGNvaW4tc3BlY2lmaWMgaW5zdGFudCBzZW5kaW5nIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eXBlIC0gVHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gdHJ1c3RsaW5lKVxuICAgKiBAcGFyYW0ge3t0b2tlbjogcGFyYW1zLCBhY3Rpb246IFN0cmluZywgbGltaXQ6IFN0cmluZ31bXX0gb3B0aW9ucy50cnVzdGxpbmVzIC0gQXJyYXkgb2YgdHJ1c3RsaW5lcyB0byBtYW5hZ2UgKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmRNYW55KHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGRlYnVnKCdzZW5kTWFueSBjYWxsZWQnKTtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG4gICAgaWYgKF8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBwYXJhbXMucmVjaXBpZW50cy5tYXAoZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgICBpZiAoYW1vdW50LmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGFtb3VudC5pc1plcm8oKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ3JlY2lwaWVudHMnLFxuICAgICAgJ251bUJsb2NrcycsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAndGFyZ2V0V2FsbGV0VW5zcGVudHMnLFxuICAgICAgJ21lc3NhZ2UnLFxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnc2VxdWVuY2VJZCcsXG4gICAgICAnbGFzdExlZGdlclNlcXVlbmNlJyxcbiAgICAgICdsZWRnZXJTZXF1ZW5jZURlbHRhJyxcbiAgICAgICdnYXNQcmljZScsXG4gICAgICAnbm9TcGxpdENoYW5nZScsXG4gICAgICAndW5zcGVudHMnLFxuICAgICAgJ2NvbW1lbnQnLFxuICAgICAgJ290cCcsXG4gICAgICAnY2hhbmdlQWRkcmVzcycsXG4gICAgICAnaW5zdGFudCcsXG4gICAgICAnbWVtbycsXG4gICAgICAndHlwZScsXG4gICAgICAndHJ1c3RsaW5lcycsXG4gICAgICAndHJhbnNmZXJJZCcsXG4gICAgICAnc3Rha2luZ09wdGlvbnMnLFxuICAgIF0pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3R4L3NlbmQnKSkuc2VuZChmaW5hbFR4UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGFuIHVuc3VwcG9ydGVkIHRva2VuIGZyb20gYSBCaXRHbyBtdWx0aXNpZyB3YWxsZXRcbiAgICogcGFyYW1zIGFyZSB2YWxpZGF0ZWQgaW4gRXRoLnByb3RvdHlwZS5yZWNvdmVyVG9rZW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB1bnN1cHBvcnRlZCB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY2lwaWVudCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyByZWNvdmVyZWQgdG9rZW5zIHNob3VsZCBiZSBzZW50IHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgdGhlIHhwcnZcbiAgICovXG4gIGFzeW5jIHJlY292ZXJUb2tlbihwYXJhbXM6IFJlY292ZXJUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHJlY292ZXJ5IG9ubHkgc3VwcG9ydGVkIGZvciBldGggd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodG9rZW5Db250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciB0b2tlbkNvbnRyYWN0QWRkcmVzcycpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlY2lwaWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHJlY2lwaWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJUb2tlbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9LCBwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnJlY292ZXJUb2tlbihyZWNvdmVyVG9rZW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gbWV0YWRhdGEgZm9yIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nIG9yIGF0dGVtcHRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHR4aWQsIHdhbGxldElkLCB0eCwgYW5kIGZlZSAoaWYgc3VwcG9ydGVkIGZvciBjb2luKVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGludGVybmFsLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LCB0aGlzLmJhc2VDb2luLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGZlZSBvbiB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB0eGlkIHRvIHRoZSBnaXZlbiBuZXcgZmVlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eGlkIFRoZSB0cmFuc2FjdGlvbiBJZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2FjdGlvbiB3aG9zZSBmZWUgaXMgdG8gYmUgY2hhbmdlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5mZWVdIE9wdGlvbmFsIC0gVGhlIG5ldyBmZWUgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZWlwMTU1OV0gT3B0aW9uYWwgLSB0aGUgZWlwMTU1OSB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBuZXcgdHJhbnNhY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGZlZSByYXRlXG4gICAqL1xuICBhc3luYyBjaGFuZ2VGZWUocGFyYW1zOiBDaGFuZ2VGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMuZmVlKSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnLCAnZmVlJ10sIFtdKTtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMuZWlwMTU1OSwgWydtYXhGZWVQZXJHYXMnLCAnbWF4UHJpb3JpdHlGZWVQZXJHYXMnXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2NoYW5nZUZlZScpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm8gZnJvbSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVybCBUaGUgVXJsIHRvIHJldHJpZXZlIGluZm8gZnJvbVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFBheW1lbnRJbmZvKHBhcmFtczogeyB1cmw/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcGF5bWVudEluZm8nKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGpzb24gcGF5bWVudCByZXNwb25zZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucGF5bWVudFVybCAtIFRoZSB1cmwgdG8gc2VuZCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IG9mIHRoZSBwYXltZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVtbyB7U3RyaW5nfSAtIEEgbWVtbyBzdXBwbGllZCBieSB0aGUgbWVyY2hhbnQsIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRyYW5zZmVyIGFzIHRoZSBjb21tZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZXhwaXJlcyB7U3RyaW5nfSAtIElTTyBEYXRlIGZvcm1hdCBvZiB3aGVuIHRoZSBwYXltZW50IHJlcXVlc3QgZXhwaXJlc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXIgUGF5bWVudCBBY2tcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNlbmRQYXltZW50UmVzcG9uc2UocGFyYW1zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NlbmRQYXltZW50JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvbGljeVJ1bGUocGFyYW1zOiBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZXRQb2xpY3lSdWxlKHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgUG9saWN5IFJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBvbGljeVJ1bGUocGFyYW1zOiBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhIEpTT04gcmVwcmVzZW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0pTT04oKTogV2FsbGV0RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0cmFkaW5nIGFjY291bnQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9UcmFkaW5nQWNjb3VudCgpOiBUcmFkaW5nQWNjb3VudCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IGNvbnZlcnQgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IHRvIGEgdHJhZGluZyBhY2NvdW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhZGluZ0FjY291bnQodGhpcy5fd2FsbGV0LmVudGVycHJpc2UsIHRoaXMsIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YWtpbmcgd2FsbGV0IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvU3Rha2luZ1dhbGxldCgpOiBTdGFraW5nV2FsbGV0IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNTdGFraW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3Rha2luZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuY29pbigpfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN0YWtpbmdXYWxsZXQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZG93bmxvYWRzIFBERiBrZXljYXJkIGZvciB3YWxsZXQgKHJlcXVpcmVzIHJlc3BvbnNlIGZyb20gd2FsbGV0cy5nZW5lcmF0ZVdhbGxldClcbiAgICpcbiAgICogTm90ZTogdGhpcyBpcyBleGFtcGxlIGNvZGUgYW5kIGlzIG5vdCB0aGUgdmVyc2lvbiB1c2VkIG9uIGJpdGdvLmNvbVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgKiBqc1BERiAtIGFuIGluc3RhbmNlIG9mIHRoZSBqc1BERiBsaWJyYXJ5XG4gICAqICAgKiBRUkNvZGUgLSBhbiBpbnN0YW5jZSBvZiB0aGUgUVJpb3VzIGxpYnJhcnlcbiAgICogICAqIHVzZXJLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSB1c2VyIGtleWNoYWluXG4gICAqICAgKiBiYWNrdXBLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiYWNrdXAga2V5Y2hhaW5cbiAgICogICAqIGJpdGdvS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYml0Z28ga2V5Y2hhaW5cbiAgICogICAqIHBhc3NwaHJhc2UgLSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogICAqIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgLSB0aGUgZW5jcnlwdGlvbiBzZWNyZXQgdXNlZCBmb3IgQm94IERcbiAgICogICAqIGFjdGl2YXRpb25Db2RlIC0gYSByYW5kb21seSBnZW5lcmF0ZWQgc2l4LWRpZ2l0IGFjdGl2YXRpb24gY29kZVxuICAgKiAgICogd2FsbGV0S2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBzaWduaW5nIGtleVxuICAgKiAgICogYmFja3VwS2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBiYWNrdXAga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZG93bmxvYWRLZXljYXJkKHBhcmFtczogRG93bmxvYWRLZXljYXJkT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cgfHwgIXdpbmRvdy5sb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZG93bmxvYWRLZXljYXJkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGFibGUgd2l0aGluIGEgYnJvd3Nlci4nKTtcbiAgICB9XG5cbiAgICAvLyBHcmFiIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IGZvciBhY3RpdmF0aW9uQ29kZVxuICAgIGNvbnN0IHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgICAgYWN0aXZhdGlvbkNvZGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5MDAwMDAgKyAxMDAwMDApLnRvU3RyaW5nKCksXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghanNQREYgfHwgdHlwZW9mIGpzUERGICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwYXNzIGluIGEgdmFsaWQganNQREYgaW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBrZXljaGFpbnNcbiAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXYWxsZXQga2V5Y2hhaW4gbXVzdCBoYXZlIGEgJ3VzZXInIHByb3BlcnR5YCk7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrdXBLZXljaGFpbiB8fCB0eXBlb2YgYmFja3VwS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhY2t1cCBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4gfHwgdHlwZW9mIGJpdGdvS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdGdvIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICh3YWxsZXRLZXlJRCAmJiB0eXBlb2Ygd2FsbGV0S2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYmFja3VwS2V5SUQgJiYgdHlwZW9mIGJhY2t1cEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWNrdXBLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYWN0aXZhdGlvbiBjb2RlIGlmIHByb3ZpZGVkXG4gICAgaWYgKHR5cGVvZiBhY3RpdmF0aW9uQ29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBDb2RlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZhdGlvbkNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gY29kZSBtdXN0IGJlIHNpeCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pblNob3J0TmFtZSA9IHRoaXMuYmFzZUNvaW4udHlwZTtcbiAgICBjb25zdCBjb2luTmFtZSA9IHRoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKTtcbiAgICBjb25zdCB3YWxsZXRMYWJlbCA9IHRoaXMuX3dhbGxldC5sYWJlbDtcblxuICAgIGNvbnN0IGRvYyA9IGRyYXdLZXljYXJkKHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgZW5jcnlwdDogdGhpcy5iaXRnby5lbmNyeXB0LFxuICAgICAgY29pblNob3J0TmFtZSxcbiAgICAgIGNvaW5OYW1lLFxuICAgICAgYWN0aXZhdGlvbkNvZGUsXG4gICAgICB3YWxsZXRMYWJlbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICB9KTtcblxuICAgIC8vIFNhdmUgdGhlIFBERiBvbiB0aGUgdXNlcidzIGJyb3dzZXJcbiAgICBkb2Muc2F2ZShgQml0R28gS2V5Y2FyZCBmb3IgJHt3YWxsZXRMYWJlbH0ucGRmYCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIGJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zKFxuICAgIHBhcmFtczogQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbjogJU8nLCB3aGl0ZWxpc3RlZFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNvdWxkIHJldHVybiAxMDAgYnVpbGQgdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgYnVpbGRSZXNwb25zZSA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKSlcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICAvLyB3ZSBuZWVkIHRvIHN0ZXAgb3ZlciBlYWNoIHByZWJ1aWxkIG5vdyAtIHNob3VsZCBiZSBpbiBhbiBhcnJheSBpbiB0aGUgYm9keVxuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25zOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkIG9mIGJ1aWxkUmVzcG9uc2UpIHtcbiAgICAgIGxldCBwcmVidWlsZDogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29uc29saWRhdGVBY2NvdW50QnVpbGQsIHsgd2FsbGV0OiB0aGlzLCBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMgfSlcbiAgICAgICkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG5cbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgICBkZWJ1ZygnZmluYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG5cbiAgICAgIGNvbnNvbGlkYXRpb25zLnB1c2gocHJlYnVpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zb2xpZGF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgcHJlYnVpbGRUeCAgIC0gdGhpcyBpcyB0aGUgcHJlLWJ1aWxkIGNvbnNvbGlkYXRpb24gdHguIHRoaXMgaXMgYSBub3JtYWxseSBidWlsdCB0eCB3aXRoXG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvZiBjb25zb2xpZGF0ZUlkLlxuICAgKiAgICAgdmVyaWZpY2F0aW9uIC0gbm9ybWFsIGtleWNoYWlucywgZXRjLiBmb3IgdmVyaWZpY2F0aW9uXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIG9uZSBvZiBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLnByZWJ1aWxkVHggPT09ICdzdHJpbmcnIHx8IHBhcmFtcy5wcmVidWlsZFR4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIGNvbnNvbGlkYXRpb24gaWQgb24gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHgudHhSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zb2xpZGF0aW9uIHJlcXVlc3QgbWlzc2luZyB0eFJlcXVlc3RJZC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcblxuICAgIC8vIGRlY29yYXRlIHdpdGggb3VyIGNvbnNvbGlkYXRpb24gaWRcbiAgICBzaWduZWRQcmVidWlsZC5jb25zb2xpZGF0ZUlkID0gcGFyYW1zLnByZWJ1aWxkVHguY29uc29saWRhdGVJZDtcblxuICAgIGRlbGV0ZSBzaWduZWRQcmVidWlsZC53YWxsZXQ7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzaWduZWRQcmVidWlsZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb25zLiBUaGlzIGlzIGludGVuZGVkIHRvIGZsdXNoIG1hbnkgYmFsYW5jZXMgdG8gdGhlIHJvb3Qgd2FsbGV0IGJhbGFuY2UuXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMocGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZ2l2ZXMgdXMgYSBzZXQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRzID0gKGF3YWl0IHRoaXMuYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMocGFyYW1zKSkgYXMgYW55O1xuICAgIGlmICh1bnNpZ25lZEJ1aWxkcyAmJiB1bnNpZ25lZEJ1aWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgZmFpbGVkVHhzID0gbmV3IEFycmF5PEVycm9yPigpO1xuICAgICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICAgIC8vIGZvbGQgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIHdlIHVzZWQgdG8gYnVpbGQgdGhpcyB0cmFuc2FjdGlvbiBpbnRvIHRoZSB1bnNpZ25lZEJ1aWxkXG4gICAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKTtcbiAgICAgICAgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zLnByZWJ1aWxkVHggPSB1bnNpZ25lZEJ1aWxkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZEFjY291bnRDb25zb2xpZGF0aW9uKHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmRpcihlKTtcbiAgICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBzdWNjZXNzZnVsVHhzLFxuICAgICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzZXQgb2YgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKiBAcGFyYW0gcGFyYW1zIC1cbiAgICogICAgZW5hYmxlVG9rZW5zOiBUb2tlbiBlbmFibGVtZW50IG9wZXJhdGlvbnMgd2Ugd2FudCB0byBwZXJmb3JtXG4gICAqIEByZXR1cm5zIFVuc2lnbmVkIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBidWlsZFRva2VuRW5hYmxlbWVudHMoXG4gICAgcGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBpZiAoIXRlQ29uZmlnLnJlcXVpcmVzVG9rZW5FbmFibGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCByZXF1aXJlIHRva2VuIGVuYWJsZW1lbnRzYCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB0b2tlbnMgYXJlIGJlaW5nIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBzcGVjaWZ5IHJlY2lwaWVudHMgZm9yIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgcXVlcnkgaWYgd2UgY2FuJ3QgZW5hYmxlIG11bHRpcGxlIHRva2VucyBpbiBvbmUgdHhcbiAgICBpZiAoIXRlQ29uZmlnLnN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzICYmIHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKGFzeW5jIChlbmFibGVUb2tlbikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRva2VuRW5hYmxlbWVudHMoe1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICBlbmFibGVUb2tlbnM6IFtlbmFibGVUb2tlbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcmllcyk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5mbGF0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIGJ1aWxkUGFyYW1zLnR5cGUgPSAnZW5hYmxldG9rZW4nO1xuICAgIC8vIENoZWNrIGlmIHdlIGJ1aWxkIHdpdGggaW50ZW50XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gW2F3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXdyaXRlIHRva2VucyBpbnRvIHJlY2lwaWVudHMgZm9yIGJ1aWxkVHJhbnNhY3Rpb25cbiAgICAgIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgPSBwYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRva2VuLmFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3M7XG4gICAgICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgYmFzZSBhZGRyZXNzLCBtdXN0IHNwZWNpZnkgd2l0aCB0b2tlbiBwYXJhbScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBidWlsZFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgICAgIHByZWJ1aWxkVHguYnVpbGRQYXJhbXMgPSBidWlsZFBhcmFtcztcbiAgICAgIHJldHVybiBbcHJlYnVpbGRUeF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHNpbmdsZSB1bnNpZ25lZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBob3Qgd2FsbGV0c1xuICAgKiAgIC0gVGhlIHJlc3BvbnNlIGZyb20gaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gZm9yIGN1c3RvZGlhbCB3YWxsZXRzXG4gICAqICAgLSBUaGUgaW5jbHVkZWQgcHJlYnVpbHQgdHJhbnNhY3Rpb24gZm9yIGNvbGQgd2FsbGV0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnQocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdGVDb25maWcgPSB0aGlzLmJhc2VDb2luLmdldFRva2VuRW5hYmxlbWVudENvbmZpZygpO1xuICAgIGlmICghdGVDb25maWcucmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IHJlcXVpcmUgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbnNgKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5wcmVidWlsZFR4ID09PSAnc3RyaW5nJyB8fCBwYXJhbXMucHJlYnVpbGRUeD8uYnVpbGRQYXJhbXM/LnR5cGUgIT09ICdlbmFibGV0b2tlbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoICh0aGlzLl93YWxsZXQudHlwZSkge1xuICAgICAgICBjYXNlICdob3QnOlxuICAgICAgICAgIGNvbnN0IHNpZ25lZFByZWJ1aWxkID0gYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN1Ym1pdFRyYW5zYWN0aW9uKHNpZ25lZFByZWJ1aWxkKTtcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgLy8gRG9uJ3Qgc2lnbiBvciBzZW5kIGFuZCBqdXN0IHJldHVybiB0aGUgYnVpbHQgdHJhbnNhY3Rpb25cbiAgICAgICAgICByZXR1cm4gcGFyYW1zLnR4UHJlYnVpbGQ7XG4gICAgICAgIGNhc2UgJ2N1c3RvZGlhbCc6XG4gICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArICcvdHgvaW5pdGlhdGUnKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHVybCkuc2VuZChwYXJhbXMucHJlYnVpbGRUeC5idWlsZFBhcmFtcykucmVzdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgY2hhaW5zIHJlcXVpcmUgdG9rZW5zIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHJlY2VpdmVkL3NlbnQuXG4gICAqIFRoaXMgaXMgYSBkZWRpY2F0ZWQgZnVuY3Rpb24gdGhhdCBlbmFibGVzIHRva2Vucy5cbiAgICpcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgc2V0IG9mIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtXG4gICAqICAgIGVuYWJsZVRva2VuczogVG9rZW4gZW5hYmxlbWVudCBvcGVyYXRpb25zIHdlIHdhbnQgdG8gcGVyZm9ybVxuICAgKiBAcmV0dXJuXG4gICAqICAgIHN1Y2Nlc3M6IFN1Y2Nlc3NmdWwgcmVzcG9uc2VzIGZyb20gc2VuZFRva2VuRW5hYmxlbWVudFxuICAgKiAgICBmYWlsdXJlOiBFcnJvcnMgZnJvbSBmYWlsZWQgdHJhbnNhY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFRva2VuRW5hYmxlbWVudHMocGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfSk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGFueVtdO1xuICAgIGZhaWx1cmU6IEVycm9yW107XG4gIH0+IHtcbiAgICBjb25zdCB1bnNpZ25lZEJ1aWxkcyA9IGF3YWl0IHRoaXMuYnVpbGRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtcyk7XG5cbiAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGZhaWxlZFR4cyA9IG5ldyBBcnJheTxFcnJvcj4oKTtcbiAgICBmb3IgKGNvbnN0IHVuc2lnbmVkQnVpbGQgb2YgdW5zaWduZWRCdWlsZHMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHByZWJ1aWxkVHg6IHVuc2lnbmVkQnVpbGQsXG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VuZFR4ID0gYXdhaXQgdGhpcy5zZW5kVG9rZW5FbmFibGVtZW50KHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgIHN1Y2Nlc3NmdWxUeHMucHVzaChzZW5kVHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2Vzczogc3VjY2Vzc2Z1bFR4cyxcbiAgICAgIGZhaWx1cmU6IGZhaWxlZFR4cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBsaWdodG5pbmcgZm9yIGJ0Yy90YnRjIGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyBsaWdodG5pbmcoKTogTGlnaHRuaW5nIHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNMaWdodG5pbmcoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaWdodG5pbmcgbm90IHN1cHBvcnRlZCBmb3IgJHt0aGlzLmNvaW4oKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExpZ2h0bmluZyh0aGlzLmJpdGdvLCB0aGlzKTtcbiAgfVxuXG4gIC8qIE1BUks6IFRTUyBIZWxwZXJzICovXG5cbiAgLyoqXG4gICAqIFByZWJ1aWxkcyBhIHRyYW5zYWN0aW9uIGZvciBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgcHJlYnVpbGQgdHJhbnNhY3Rpb24gb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcmVidWlsZFRyYW5zYWN0aW9uVHNzKHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8UHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHJlcUlkID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICBjb25zdCBhcGlWZXJzaW9uID0gdGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnID8gJ2Z1bGwnIDogJ2xpdGUnO1xuXG4gICAgbGV0IHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHN3aXRjaCAocGFyYW1zLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RyYW5zZmVyJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgICAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICAgIG5vbmNlOiBwYXJhbXMubm9uY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcGlWZXJzaW9uLFxuICAgICAgICAgIHBhcmFtcy5wcmV2aWV3XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW5hYmxldG9rZW4nOlxuICAgICAgICB0eFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5wcmVidWlsZFR4V2l0aEludGVudChcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXFJZCxcbiAgICAgICAgICAgIGludGVudFR5cGU6ICdlbmFibGVUb2tlbicsXG4gICAgICAgICAgICByZWNpcGllbnRzOiBwYXJhbXMucmVjaXBpZW50cyB8fCBbXSxcbiAgICAgICAgICAgIGVuYWJsZVRva2VuczogcGFyYW1zLmVuYWJsZVRva2VucyxcbiAgICAgICAgICAgIG1lbW86IHBhcmFtcy5tZW1vLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAke3BhcmFtcy50eXBlfWApO1xuICAgIH1cblxuICAgIGxldCB1bnNpZ25lZFR4OiBFZGRzYVVuc2lnbmVkVHJhbnNhY3Rpb247XG5cbiAgICBpZiAodHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJykge1xuICAgICAgaWYgKHR4UmVxdWVzdC50cmFuc2FjdGlvbnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHVuc2lnbmVkVHggPSB0eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudW5zaWduZWRUeHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBzaW5nbGUgdW5zaWduZWQgdHggZm9yIHR4IHJlcXVlc3Qgd2l0aCBpZDogJHt0eFJlcXVlc3QudHhSZXF1ZXN0SWR9YCk7XG4gICAgICB9XG4gICAgICB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnVuc2lnbmVkVHhzWzBdO1xuICAgIH1cblxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIHJldHVybiB7XG4gICAgICB3YWxsZXRJZDogdGhpcy5pZCgpLFxuICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgdHhSZXF1ZXN0SWQ6IHR4UmVxdWVzdC50eFJlcXVlc3RJZCxcbiAgICAgIHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCxcbiAgICAgIGJ1aWxkUGFyYW1zOiB3aGl0ZWxpc3RlZFBhcmFtcyxcbiAgICAgIGZlZUluZm86IHVuc2lnbmVkVHguZmVlSW5mbyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2lnbmluZyBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNpZ25UcmFuc2FjdGlvblRzcyhwYXJhbXM6IFdhbGxldFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UHJlYnVpbGQgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy50eFByZWJ1aWxkLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4UmVxdWVzdElkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduZWRUeFJlcXVlc3QgPSBhd2FpdCB0aGlzLnRzc1V0aWxzIS5zaWduVHhSZXF1ZXN0KHtcbiAgICAgICAgdHhSZXF1ZXN0OiBwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCxcbiAgICAgICAgcHJ2OiBwYXJhbXMucHJ2LFxuICAgICAgICByZXFJZDogcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4UmVxdWVzdElkOiBzaWduZWRUeFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMsIHNpZ25zLCBhbmQgc2VuZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGEgVFNTIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBzZW5kIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZE1hbnlUc3MocGFyYW1zOiBTZW5kTWFueU9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKSBhcyBTaWduZWRUcmFuc2FjdGlvblJlcXVlc3Q7XG4gICAgaWYgKCFzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCBtaXNzaW5nIGZyb20gc2lnbmVkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogQkctNTExMjIgUmVtb3ZlIGNvbmRpdGlvbmFsIHdoZW4gbW92ZWQgdG8gdHhSZXF1ZXN0RnVsbCBmb3IgZXZlcnl0aGluZ1xuICAgIGlmICh0aGlzLl93YWxsZXQudHlwZSA9PT0gJ2N1c3RvZGlhbCcpIHtcbiAgICAgIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgICAgLnBvc3QoXG4gICAgICAgICAgdGhpcy5iaXRnby51cmwoXG4gICAgICAgICAgICAnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eHJlcXVlc3RzLycgKyBzaWduZWRUcmFuc2FjdGlvbi50eFJlcXVlc3RJZCArICcvdHJhbnNmZXJzJyxcbiAgICAgICAgICAgIDJcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnNlbmQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHNzVXRpbHM/LnNlbmRUeFJlcXVlc3Qoc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpO1xuICB9XG59XG4iXX0=
|
|
2211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3dhbGxldC93YWxsZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsK0NBQXlDO0FBQ3pDLDBDQUE0QjtBQUM1QixxREFBdUM7QUFRdkMsd0NBQTJDO0FBRTNDLGtDQUEwQztBQUMxQyxzQ0FBOEU7QUFDOUUsK0RBQWlEO0FBQ2pELGlEQUFrRDtBQUVsRCx3REFBdUU7QUFDdkUsOERBQTJEO0FBQzNELG9DQUEwRztBQStDMUcsNERBQXlEO0FBQ3pELDRDQUF5QztBQUN6QywrREFBNEM7QUFDNUMsOENBQWdEO0FBQ2hELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBSWxELE1BQWEsTUFBTTtJQU9qQixZQUFZLEtBQWdCLEVBQUUsUUFBbUIsRUFBRSxVQUFlO1FBQ2hFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN0QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsSUFBSSxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsV0FBVyxFQUFFLEVBQUU7WUFDM0IsUUFBUSxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQUU7Z0JBQ2xDLEtBQUssT0FBTztvQkFDVixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksa0JBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUN0RCxNQUFNO2dCQUNSLEtBQUssT0FBTztvQkFDVixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBVSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3RELE1BQU07Z0JBQ1I7b0JBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7YUFDN0I7U0FDRjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUU7UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsRUFBRTtRQUNBLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsT0FBTztZQUNMLGFBQWE7WUFDYixlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLGFBQWE7WUFDYixXQUFXO1lBQ1gsNkJBQTZCO1lBQzdCLFNBQVM7WUFDVCxVQUFVO1lBQ1YsVUFBVTtZQUNWLG9CQUFvQjtZQUNwQixXQUFXO1lBQ1gsWUFBWTtZQUNaLFNBQVM7WUFDVCxvQkFBb0I7WUFDcEIscUJBQXFCO1lBQ3JCLFFBQVE7WUFDUixZQUFZO1lBQ1osVUFBVTtZQUNWLE1BQU07WUFDTixZQUFZO1lBQ1osU0FBUztZQUNULGFBQWE7WUFDYixVQUFVO1lBQ1YsZUFBZTtZQUNmLFdBQVc7WUFDWCxPQUFPO1lBQ1AsWUFBWTtZQUNaLGFBQWE7WUFDYixZQUFZO1lBQ1osVUFBVTtZQUNWLHNCQUFzQjtZQUN0QixZQUFZO1lBQ1osTUFBTTtZQUNOLFVBQVU7WUFDVixrQkFBa0I7WUFDbEIsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCxZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLFNBQVM7WUFDVCxnQkFBZ0I7WUFDaEIsa0JBQWtCO1lBQ2xCLFdBQVc7WUFDWCxjQUFjO1lBQ2QsMERBQTBEO1lBQzFELDRFQUE0RTtZQUM1RSxXQUFXO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILGdDQUFnQztRQUM5QixPQUFPLENBQUMsc0JBQXNCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hILENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUs7UUFDVixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDSCxvQkFBb0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUMzRCxPQUFPLElBQUksaUNBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQWdDLEVBQUU7UUFDOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQTRCLEVBQUU7UUFDL0MsTUFBTSxLQUFLLEdBQXNCLEVBQUUsQ0FBQztRQUVwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7YUFDOUQ7WUFDRCxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDOUI7UUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDaEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDN0Q7WUFDRCxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDNUI7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUs7YUFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQzthQUM1RCxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ1osTUFBTSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQWdDLEVBQUU7UUFDckQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU5QyxNQUFNLEtBQUssR0FBc0IsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RDtZQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUM5QjtRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQzthQUN2RTtZQUNELEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUM1QjtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSzthQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JDLEtBQUssQ0FBQyxLQUFLLENBQUM7YUFDWixNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUEyQixFQUFFO1FBQzNDLE1BQU0sS0FBSyxHQUFxQixFQUFFLENBQUM7UUFDbkMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO2FBQzlEO1lBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzdEO1lBQ0QsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7YUFDeEU7WUFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO3FCQUNqRjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO2FBQzlEO1lBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO2FBQ2hFO1lBQ0QsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7YUFDdEU7WUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUM3QixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO3FCQUM3RTtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2FBQzVEO1lBQ0QsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQzFCO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBNkIsRUFBRTtRQUMvQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFNBQXNDLEVBQUU7UUFDakUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM5RixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7UUFDekQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDcEMsNkJBQTZCO1lBQzdCLFNBQVM7WUFDVCxPQUFPO1lBQ1AsWUFBWTtZQUNaLFVBQVU7WUFDVixhQUFhO1lBQ2IsV0FBVztZQUNYLFVBQVU7WUFDVixhQUFhO1lBQ2Isa0JBQWtCO1lBQ2xCLFFBQVE7U0FDVCxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzVGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUEwQixFQUFFO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzNCLFFBQVE7WUFDUixPQUFPO1lBQ1AsVUFBVTtZQUNWLGFBQWE7WUFDYixXQUFXO1lBQ1gsVUFBVTtZQUNWLFFBQVE7WUFDUixRQUFRO1lBQ1IsUUFBUTtTQUNULENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E0Qkc7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUMxQixTQUF5QixFQUN6QixTQUE2RCxFQUFFO1FBRS9ELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxxQkFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDcEMsU0FBUztZQUNULFlBQVk7WUFDWixrQkFBa0I7WUFDbEIsb0JBQW9CO1lBRXBCLFVBQVU7WUFDVixVQUFVO1lBQ1YsV0FBVztZQUNYLGFBQWE7WUFDYiw2QkFBNkI7WUFDN0IsZUFBZTtZQUVmLFNBQVMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CO1lBQzNELG1CQUFtQjtTQUNwQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUs7YUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTLFVBQVUsQ0FBQyxDQUFDO2FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUM7YUFDcEIsTUFBTSxFQUFFLENBQUM7UUFFWixNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVE7YUFDbkMsU0FBUyxFQUFFO2FBQ1gsaUJBQWlCLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLENBQUM7UUFFeEUsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixHQUFHLE1BQU07WUFDVCxVQUFVLEVBQUUsUUFBUTtZQUNwQixRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNsQyxDQUFDO1FBQ0YsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRXpGLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7YUFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQzthQUNuQixNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFxQyxFQUFFO1FBQy9ELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFnQyxFQUFFO1FBQ3JELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsMEJBQTBCLENBQUMsYUFBa0IsRUFBRTtRQUNuRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztTQUNsRDtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSzthQUM1QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ2YsSUFBSSxDQUFDO1lBQ0osb0JBQW9CLEVBQUUsVUFBVTtTQUNqQyxDQUFDO2FBQ0QsTUFBTSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7VUFVTTtJQUNOLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBc0IsRUFBRTtRQUM3QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBK0I7UUFDcEQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUM3RCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7U0FDdEQ7UUFDRCxJQUFJLEtBQUssQ0FBQztRQUNWLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQixLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztTQUN4QjthQUFNO1lBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7U0FDbkI7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksa0JBQWtCLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxNQUFrQztRQUMxRCxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksS0FBSyxDQUFDO1FBQ1YsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1NBQ3hCO2FBQU07WUFDTCxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztTQUNuQjtRQUNELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQXVCLEVBQUU7UUFDbkMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWhGLCtEQUErRDtRQUUvRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO1lBQ3RDLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUMxRCxNQUFNLElBQUksS0FBSyxDQUNiLDZHQUE2RyxDQUM5RyxDQUFDO2FBQ0g7WUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLEdBQUcsRUFBRTtnQkFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2FBQ3RDO1lBQ0EsTUFBYyxDQUFDLFVBQVUsR0FBRztnQkFDM0I7b0JBQ0UsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO29CQUN2QixNQUFNLEVBQUUsS0FBSztpQkFDZDthQUNGLENBQUM7WUFFRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUI7UUFDRCw4Q0FBOEM7UUFFOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxxQkFBYSxFQUFFLENBQUM7UUFDbEMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDcEMsU0FBUztZQUNULFNBQVM7WUFDVCxZQUFZO1lBQ1osb0JBQW9CO1lBQ3BCLG1CQUFtQjtTQUNwQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUUvRiwrRkFBK0Y7UUFFL0YsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQVEsQ0FBQztRQUV0RyxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLEdBQUcsTUFBTTtZQUNULFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzFCLGNBQWMsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQzFELGFBQWEsRUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQ3pELEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSTtTQUNqQixDQUFDO1FBQ0YsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV4RSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQzthQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQ25CLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQXdCLEVBQUU7UUFDckMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXRDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQzthQUNsRTtTQUNGO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlDLEVBQUU7UUFDdkQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFbkQsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLO2FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUM7YUFDN0YsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNaLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQTJCLEVBQUU7UUFDM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXRDLE1BQU0sS0FBSyxHQUFxQixFQUFFLENBQUM7UUFFbkMsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2YsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQzthQUM5RDtZQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUM5QjtRQUVELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUNmLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2FBQzVEO1lBQ0QsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQzFCO1FBRUQsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzdEO1lBQ0QsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzVCO1FBRUQsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO2FBQ3JFO1lBQ0QsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1NBQzVDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO2FBQ3hFO1lBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO2FBQ3hFO1lBQ0QsS0FBSyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO2FBQ3RFO1lBQ0QsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1NBQzVDO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQzthQUNqRjtZQUNELEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUM7U0FDbEU7UUFFRCxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRTtZQUNqQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsRUFBRTtnQkFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO2FBQzlFO1lBQ0QsS0FBSyxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztTQUM5RDtRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7YUFDMUU7WUFDRCxLQUFLLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1NBQ3BEO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSzthQUNkLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7YUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQzthQUNaLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQTRCLEVBQUU7UUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxLQUFLLENBQUM7UUFDVixJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztTQUN0RDtRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQixLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztTQUN4QjthQUFNO1lBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7U0FDbkI7UUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0M7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3pGLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0JHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUErQixFQUFFO1FBQ25ELE1BQU0sYUFBYSxHQUF5QixFQUFFLENBQUM7UUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxxQkFBYSxFQUFFLENBQUM7UUFFbEMsTUFBTSxFQUNKLEtBQUssRUFDTCxRQUFRLEVBQ1IsS0FBSyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLEtBQUssR0FBRyxDQUFDLEVBQ1QsV0FBVyxFQUNYLHNCQUFzQixHQUFHLElBQUksR0FDOUIsR0FBRyxNQUFNLENBQUM7UUFFWCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsYUFBYSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtnQkFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO2FBQ3BFO1lBQ0QsYUFBYSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDbkM7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRTtnQkFDbEYsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsYUFBYSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1NBQ25EO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQzthQUM3QztZQUNELGFBQWEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQzthQUNuRDtTQUNGO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7YUFDL0Q7U0FDRjtRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtZQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDL0Q7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsYUFBYSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsYUFBYSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDL0I7UUFFRCx5Q0FBeUM7UUFDekMsTUFBTSxTQUFTLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ILE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1FBRWxFLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFFOztZQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSztpQkFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQztpQkFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQztpQkFDbkIsTUFBTSxFQUFFLENBQVEsQ0FBQztZQUVwQix5QkFBeUI7WUFDekIsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDdkMsVUFBVSxDQUFDLFdBQVcsR0FBRyx3QkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUN2RDtZQUVELFVBQVUsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ2pDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsV0FBVyxhQUFYLFdBQVcsY0FBWCxXQUFXLEdBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLDBCQUEwQixDQUFDLENBQUM7WUFFeEYsTUFBTSxnQkFBZ0IsR0FBeUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUV4RixJQUFJLGdCQUFnQixDQUFDLEtBQUssRUFBRTtnQkFDMUIsTUFBTSxJQUFJLCtCQUFzQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFEO1lBRUQsZ0JBQWdCLENBQUMsdUJBQXVCLEdBQUcsZ0JBQWdCLGFBQWhCLGdCQUFnQixjQUFoQixnQkFBZ0IsR0FBSSxNQUFBLGdCQUFnQixDQUFDLFlBQVksMENBQUUsZ0JBQWdCLENBQUM7WUFDL0csK0xBQStMO1lBQy9MLGtJQUFrSTtZQUNsSSxJQUNFLGdCQUFnQixDQUFDLFlBQVk7Z0JBQzdCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLElBQUksZ0JBQWdCLENBQUMsdUJBQXVCLEtBQUssQ0FBQyxDQUFDLEVBQzdHO2dCQUNBLDBGQUEwRjtnQkFDMUYsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO2dCQUM1QixJQUFJO29CQUNGLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUNuRTtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDVixJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksa0NBQXlCLENBQUMsRUFBRTt3QkFDN0MsTUFBTSxDQUFDLENBQUM7cUJBQ1Q7b0JBQ0QsNENBQTRDO29CQUM1QyxlQUFlLEdBQUcsSUFBSSxDQUFDO2lCQUN4QjtnQkFDRCxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7aUJBQ3pDO2FBQ0Y7aUJBQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1lBRUQsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzdCLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hCO1FBRUQsT0FBTztZQUNMLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1NBQzNDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBK0IsRUFBRTtRQUNuRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBRS9CLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUM5RDtRQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWhFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQTRCLEVBQUU7UUFDL0MsTUFBTSxLQUFLLEdBQXNCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7YUFDOUQ7WUFDRCxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDOUI7UUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDaEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7YUFDN0Q7WUFDRCxLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDNUI7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlDLEVBQUU7UUFDdkQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFFbEYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDMUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ3hELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLGFBQWEsSUFBSSxvQkFBb0IsRUFBRTtZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUM7U0FDckY7UUFFRCw4RkFBOEY7UUFDOUYsb0NBQW9DO1FBRXBDLDREQUE0RDtRQUM1RCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQyxLQUFLO2FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQzthQUN0RCxJQUFJLENBQUMsY0FBYyxDQUFDO2FBQ3BCLE1BQU0sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBK0IsRUFBRTtRQUNoRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVuRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBK0IsRUFBRTtRQUNuRCxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVuRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxTQUFnQyxFQUFFO1FBQy9ELE1BQU0sV0FBVyxHQUFHLEtBQUssRUFBRSxLQUFhLEVBQXFDLEVBQUU7WUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQzthQUMzRDtZQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFFaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3RCxnRkFBZ0Y7WUFDaEYsSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFO2dCQUN6QixPQUFPLFFBQW9DLENBQUM7YUFDN0M7WUFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDO1FBRUYsT0FBTyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUF3QixFQUFFO1FBQ3JDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFL0Qsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUN2RSxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7U0FDakU7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDbkYsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1NBQ3REO1FBRUQsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ2QsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ25CO1FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFRLENBQUM7UUFDcEUsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO1FBRW5ELElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSTtZQUNGLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztTQUM5RjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBNkIsRUFBRTtRQUMvQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUzRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNsRCxJQUNFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHO2dCQUNwQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWTtnQkFDN0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVU7Z0JBQzNCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRO2dCQUN6QixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUNyQjtnQkFDQSxNQUFNLElBQUksS0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUM7YUFDakc7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBNkIsRUFBRTs7UUFDL0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRXpGLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDMUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFL0csSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztTQUMzRDtRQUVELElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDNUQ7UUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQVEsQ0FBQztRQUMvRixJQUFJLGNBQWMsQ0FBQztRQUNuQixJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJO2dCQUNGLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQVEsQ0FBQztnQkFDbEUseUNBQXlDO2dCQUN6QyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7b0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7d0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztxQkFDdEQ7b0JBQ0QsSUFBSTt3QkFDRixRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7cUJBQ3hHO29CQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztxQkFDcEQ7b0JBRUQsTUFBTSxLQUFLLEdBQUcsdUJBQWEsRUFBRSxDQUFDO29CQUM5QixNQUFNLE1BQU0sR0FBRyxzQkFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzFGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQ3RGLDZFQUE2RTtvQkFDN0UsSUFBSSxHQUFHLEdBQUcsTUFBQSxRQUFRLENBQUMsR0FBRyxtQ0FBSSxRQUFRLENBQUMsU0FBUyxDQUFDO29CQUM3QyxJQUFJLFFBQVEsQ0FBQyxjQUFjLEVBQUU7d0JBQzNCLEdBQUcsR0FBRyxnQkFBUSxDQUFDLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDeEU7b0JBQ0QsY0FBYyxHQUFHO3dCQUNmLEdBQUc7d0JBQ0gsWUFBWSxFQUFFLGVBQWU7d0JBQzdCLFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7d0JBQzNDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTTt3QkFDeEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO3FCQUNuQixDQUFDO2lCQUNIO2FBQ0Y7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssd0NBQXdDLEVBQUU7b0JBQzFELGNBQWMsR0FBRyxFQUFFLENBQUM7b0JBQ3BCLDBEQUEwRDtpQkFDM0Q7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLENBQUM7aUJBQ1Q7YUFDRjtTQUNGO1FBRUQsTUFBTSxPQUFPLEdBQXVCO1lBQ2xDLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTTtZQUNwQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7U0FDbEMsQ0FBQztRQUVGLElBQUksY0FBYyxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDO1NBQ25DO2FBQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUE0QixFQUFFO1FBQzdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM3QixPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWlDRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFxQyxFQUFFO1FBQy9ELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVDO1FBRUQsK0JBQStCO1FBQy9CLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQztRQUMzRSxLQUFLLENBQUMsNkJBQTZCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUV4RCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0M7UUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDOUMsTUFBTSxXQUFXLEdBQUc7WUFDbEIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVM7U0FDbkUsQ0FBQztRQUVGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLO2FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDO2FBQzdELEtBQUssQ0FBQyxXQUFXLENBQUM7YUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3ZCLE1BQU0sRUFBRSxDQUFDO1FBRVosTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFFLElBQUksQ0FBQyxRQUFnQixDQUFDLG9CQUFvQixDQUFDO1lBQ2hGLENBQUMsQ0FBRSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQzNELENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBUSxDQUFDO1FBQ3pFLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMvQixhQUFhLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztTQUN6QztRQUNELElBQUksUUFBUSxHQUF3QixDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDMUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQy9FLENBQVEsQ0FBQztRQUNWLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN2QixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDNUIsUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRTtZQUM5RSxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUNyRztRQUNELEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNsRCxPQUFPLFFBQXFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQXVDLEVBQUU7UUFDN0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUM5QixJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDakQ7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUM7WUFDckQsR0FBRyxNQUFNO1lBQ1QsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDLENBQUM7UUFFSCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTtZQUN2QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQTRCLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDcEc7UUFFRCxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEYsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQztRQUVELE1BQU0scUJBQXFCLEdBQUc7WUFDNUIsR0FBRyxPQUFPO1lBQ1YsVUFBVTtZQUNWLElBQUk7WUFDSixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDcEIsQ0FBQztRQUVGLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUM5QyxPQUFPLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUNuQyxHQUFHLHFCQUFxQjtZQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUE0QixDQUFDO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLFNBQTRCLEVBQUU7UUFDdkMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ25ELElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDekIsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztTQUN6QztRQUVELGtHQUFrRztRQUNsRywyREFBMkQ7UUFDM0QsSUFDRSxNQUFNLENBQUMsa0JBQWtCLEtBQUssU0FBUztZQUN2QyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVM7WUFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsS0FBSyxTQUFTLEVBQ3ZEO1lBQ0EsTUFBTSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7U0FDdkU7UUFFRCxJQUFJLE9BQU8sSUFBSSxNQUFNLENBQUMsa0JBQWtCLEVBQUU7WUFDeEMsNERBQTREO1lBQzVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO1NBQzFCO2FBQU0sSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRTtnQkFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDO1lBQ25ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO2FBQ2pFO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2FBQ3REO1lBRUQsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1NBQzlGO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxTQUE0QyxFQUFFOztRQUM3RSxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUNyQyxNQUFNLEtBQUssR0FBUSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFDO1lBQ2hHLEtBQUssQ0FBQyxJQUFJLEdBQUcsNkNBQTZDLENBQUM7WUFDM0QsTUFBTSxLQUFLLENBQUM7U0FDYjtRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQzFDLE1BQU0sS0FBSyxHQUFRLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDdkYsS0FBSyxDQUFDLElBQUksR0FBRywwQ0FBMEMsQ0FBQztZQUN4RCxNQUFNLEtBQUssQ0FBQztTQUNiO1FBRUQsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDMUQsTUFBTSxLQUFLLEdBQVEsSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUMzRCxLQUFLLENBQUMsSUFBSSxHQUFHLHNCQUFzQixDQUFDO1lBQ3BDLE1BQU0sS0FBSyxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEUsTUFBTSxLQUFLLEdBQVEsSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUNuRSxLQUFLLENBQUMsSUFBSSxHQUFHLHVDQUF1QyxDQUFDO1lBQ3JELE1BQU0sS0FBSyxDQUFDO1NBQ2I7UUFFRCx5REFBeUQ7UUFDekQsNkRBQTZEO1FBQzdELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEgsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFM0csTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FBOEIsQ0FBQztRQUV4RSxJQUFJO1lBQ0YsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUNwQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFdBQVcsSUFBSSxNQUFNO2dCQUMxQyxVQUFVO2dCQUNWLE1BQU0sRUFBRSxJQUFJO2dCQUNaLFlBQVksRUFBRSxNQUFBLE1BQU0sQ0FBQyxZQUFZLG1DQUFJLEVBQUU7Z0JBQ3ZDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzthQUNwQixDQUFDLENBQUM7U0FDSjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUUsT0FBTyxDQUFDLEtBQUssQ0FDWCxxQkFBcUIsRUFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FDdkYsQ0FBQztZQUNGLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbkQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLENBQUMsQ0FBQztTQUNUO1FBQ0Qsc0JBQXNCO1FBQ3RCLE1BQU0sYUFBYSxHQUFHO1lBQ3BCLEdBQUcsTUFBTTtZQUNULFVBQVUsRUFBRSxVQUFVO1lBQ3RCLE1BQU0sRUFBRTtnQkFDTixzRUFBc0U7Z0JBQ3RFLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjO2FBQ3pEO1lBQ0QsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsY0FBYyxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDMUQsYUFBYSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDekQsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1NBQ3BCLENBQUM7UUFFRixJQUFJO1lBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDbEQ7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsRUFBRTtnQkFDaEQsS0FBSyxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztnQkFDbEMsS0FBSyxDQUFDLGNBQWMsR0FBRztvQkFDckIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQ25DLHNCQUFzQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDckQsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFO29CQUNyRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDdkIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO29CQUN6QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7aUJBQzFDLENBQUM7Z0JBQ0YsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDL0Y7WUFDRCxNQUFNLEtBQUssQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUF1QyxFQUFFO1FBQ25FLGtIQUFrSDtRQUNsSCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4RyxNQUFNLEtBQUssR0FBUSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQy9FLEtBQUssQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7WUFDbkMsTUFBTSxLQUFLLENBQUM7U0FDYjtRQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDckMsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtnQkFDakMsTUFBTSxLQUFLLEdBQVEsSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztnQkFDcEYsS0FBSyxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztnQkFDbkMsTUFBTSxLQUFLLENBQUM7YUFDYjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7Z0JBQzlELE1BQU0sS0FBSyxHQUFRLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7Z0JBQzNFLEtBQUssQ0FBQyxJQUFJLEdBQUcscUNBQXFDLENBQUM7Z0JBQ25ELE1BQU0sS0FBSyxDQUFDO2FBQ2I7U0FDRjtRQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDaEMsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDNUIsTUFBTSxLQUFLLEdBQVEsSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztnQkFDMUUsS0FBSyxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztnQkFDOUIsTUFBTSxLQUFLLENBQUM7YUFDYjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3BELE1BQU0sS0FBSyxHQUFRLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7Z0JBQ3RFLEtBQUssQ0FBQyxJQUFJLEdBQUcsZ0NBQWdDLENBQUM7Z0JBQzlDLE1BQU0sS0FBSyxDQUFDO2FBQ2I7U0FDRjtRQUVELElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdkUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO2FBQ2pGO1NBQ0Y7UUFFRCxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUV2Qiw4RkFBOEY7UUFDOUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUMxRixPQUFRLFlBQW9CLENBQUMsTUFBTSxDQUFDO1FBQ3BDLE9BQU8sTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFNBQW1DLEVBQUU7UUFDM0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ2hDLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBRTFDLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUMsRUFBRTtZQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7U0FDakY7YUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFO1lBQ2hHLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztTQUN6RTtRQUVELE9BQU8sSUFBSSxDQUFDLEtBQUs7YUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQzthQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ1osTUFBTSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBc0IsRUFBRTtRQUNqQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7U0FDdEQ7UUFFRCxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN2RDtRQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFM0IsTUFBTSxNQUFNLEdBQUcsSUFBSSx3QkFBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDRGQUE0RixDQUFDLENBQUM7U0FDL0c7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsNEZBQTRGLENBQUMsQ0FBQztTQUMvRztRQUNELE1BQU0sVUFBVSxHQUFrQztZQUNoRDtnQkFDRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87Z0JBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTthQUN0QjtTQUNGLENBQUM7UUFDRixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDcEIsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1NBQzVDO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFO1lBQ2hELFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztTQUNsQztRQUNELE1BQU0sZUFBZSxHQUFvQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BZ0NHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUEwQixFQUFFO1FBQ3pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxxQkFBYSxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxTQUFTO2dCQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLHdCQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RkFBNEYsQ0FBQyxDQUFDO2lCQUMvRztnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUN2RCxNQUFNLElBQUksS0FBSyxDQUFDLDRGQUE0RixDQUFDLENBQUM7aUJBQy9HO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUVELE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDbEMsWUFBWTtZQUNaLFdBQVc7WUFDWCxTQUFTO1lBQ1QsWUFBWTtZQUNaLGFBQWE7WUFDYiw2QkFBNkI7WUFDN0Isc0JBQXNCO1lBQ3RCLFNBQVM7WUFDVCxVQUFVO1lBQ1YsVUFBVTtZQUNWLFlBQVk7WUFDWixvQkFBb0I7WUFDcEIscUJBQXFCO1lBQ3JCLFVBQVU7WUFDVixlQUFlO1lBQ2YsVUFBVTtZQUNWLFNBQVM7WUFDVCxLQUFLO1lBQ0wsZUFBZTtZQUNmLFNBQVM7WUFDVCxNQUFNO1lBQ04sTUFBTTtZQUNOLFlBQVk7WUFDWixZQUFZO1lBQ1osZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLHFCQUFxQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRXhFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQThCLEVBQUU7UUFDakQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLEtBQUssRUFBRTtZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDbEU7UUFFRCxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBRW5ELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztTQUMzRTtRQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDaEU7UUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsMEJBQTBCLENBQUMsU0FBZ0MsRUFBRTtRQUNqRSxPQUFPLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBMkIsRUFBRTtRQUMzQyxJQUFJLE1BQU0sQ0FBQyxHQUFHO1lBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLENBQUMsT0FBTztZQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7UUFDcEcsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLO2FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDO2FBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDWixNQUFNLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQTJCLEVBQUU7UUFDaEQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUzQyxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFNBQWMsRUFBRTtRQUN4QyxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7UUFDekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDekQ7UUFFRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBYyxFQUFFO1FBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUzRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQ3pEO1FBRUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDtRQUVELE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFNBQWtDLEVBQUU7UUFDekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFbkQsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQWdDLEVBQUU7UUFDN0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxLQUFLLEVBQUU7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1NBQ25GO1FBQ0QsT0FBTyxJQUFJLCtCQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM3RDtRQUNELE9BQU8sSUFBSSw2QkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpQkc7SUFDSCxlQUFlLENBQUMsU0FBaUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7U0FDcEY7UUFFRCxrREFBa0Q7UUFDbEQsTUFBTSxFQUNKLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGNBQWMsRUFDZCxhQUFhLEVBQ2IsVUFBVSxFQUNWLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsV0FBVyxFQUNYLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQ3hFLEdBQUcsTUFBTSxDQUFDO1FBRVgsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUU7WUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1NBQzFEO1FBRUQscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO1lBQ3JELE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUNoRTtRQUVELElBQUksQ0FBQyxjQUFjLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztTQUN0RTtRQUVELElBQUksQ0FBQyxhQUFhLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO1lBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztTQUNyRTtRQUVELElBQUksV0FBVyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRTtZQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDakQ7UUFFRCxJQUFJLFdBQVcsSUFBSSxPQUFPLFdBQVcsS0FBSyxRQUFRLEVBQUU7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsdUNBQXVDO1FBQ3ZDLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1NBQzNEO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUV2QyxNQUFNLEdBQUcsR0FBRyxxQkFBVyxDQUFDO1lBQ3RCLEtBQUs7WUFDTCxNQUFNO1lBQ04sT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTztZQUMzQixhQUFhO1lBQ2IsUUFBUTtZQUNSLGNBQWM7WUFDZCxXQUFXO1lBQ1gsVUFBVTtZQUNWLHNCQUFzQjtZQUN0QixZQUFZO1lBQ1osY0FBYztZQUNkLGFBQWE7WUFDYixXQUFXO1lBQ1gsV0FBVztTQUNaLENBQUMsQ0FBQztRQUVILHFDQUFxQztRQUNyQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixXQUFXLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLDBCQUEwQixDQUM5QixTQUErQyxFQUFFO1FBRWpELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEVBQUU7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7U0FDMUY7UUFFRCwrQkFBK0I7UUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRXRFLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQztRQUVELDJDQUEyQztRQUMzQyxNQUFNLGFBQWEsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUs7YUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsMkJBQTJCLENBQUMsQ0FBQzthQUM3RSxJQUFJLENBQUMsaUJBQWlCLENBQUM7YUFDdkIsTUFBTSxFQUFFLENBQVEsQ0FBQztRQUVwQiw2RUFBNkU7UUFDN0UsTUFBTSxjQUFjLEdBQWdDLEVBQUUsQ0FBQztRQUN2RCxLQUFLLE1BQU0sdUJBQXVCLElBQUksYUFBYSxFQUFFO1lBQ25ELElBQUksUUFBUSxHQUE4QixDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FDaEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FDekYsQ0FBOEIsQ0FBQztZQUVoQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDdkIsT0FBTyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBRTVCLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRCxLQUFLLENBQUMsOENBQThDLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFaEUsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvQjtRQUVELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQUMsU0FBNEMsRUFBRTtRQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxFQUFFO1lBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSx5Q0FBeUMsQ0FBQyxDQUFDO1NBQzFGO1FBRUQsNkNBQTZDO1FBQzdDLElBQUksT0FBTyxNQUFNLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDNUQ7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1NBQ2xGO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7YUFDL0Q7WUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2QztRQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQVEsQ0FBQztRQUU5RSxxQ0FBcUM7UUFDckMsY0FBYyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUUvRCxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFFN0IsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxTQUErQyxFQUFFO1FBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEVBQUU7WUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7U0FDMUY7UUFFRCw0REFBNEQ7UUFDNUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBUSxDQUFDO1FBQzlFLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9DLE1BQU0sYUFBYSxHQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBUyxDQUFDO1lBQ3JDLEtBQUssTUFBTSxhQUFhLElBQUksY0FBYyxFQUFFO2dCQUMxQyxzRkFBc0Y7Z0JBQ3RGLE1BQU0sd0JBQXdCLEdBQXNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM5Rix3QkFBd0IsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO2dCQUNwRCxJQUFJO29CQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLENBQUM7b0JBQzdFLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQzVCO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2YsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkI7YUFDRjtZQUVELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLE9BQU8sRUFBRSxTQUFTO2FBQ25CLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxxQkFBcUIsQ0FDaEMsU0FBc0MsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO1FBRTFELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1NBQ3RGO1FBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztTQUNqRjtRQUVELElBQUksTUFBTSxDQUFDLEtBQUssRUFBRTtZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQztRQUVELDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoRixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUU7Z0JBQzVELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO29CQUNoQyxHQUFHLE1BQU07b0JBQ1QsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO2lCQUM1QixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN2QjtRQUVELE1BQU0sV0FBVyxHQUErQixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLFdBQVcsQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1FBQ2pDLGdDQUFnQztRQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRTtZQUN2QyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0wsc0RBQXNEO1lBQ3RELFdBQVcsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7Z0JBQ3pELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLEtBQUksTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksMENBQUUsV0FBVyxDQUFBLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO2lCQUNyRjtnQkFDRCxPQUFPO29CQUNMLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDckIsT0FBTztvQkFDUCxNQUFNLEVBQUUsR0FBRztpQkFDWixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFdBQVcsQ0FBQyxZQUFZLENBQUM7WUFDaEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0QsVUFBVSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDckMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUE0QyxFQUFFOztRQUM3RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsaURBQWlELENBQUMsQ0FBQztTQUNsRztRQUVELElBQUksT0FBTyxNQUFNLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFBLE1BQUEsTUFBQSxNQUFNLENBQUMsVUFBVSwwQ0FBRSxXQUFXLDBDQUFFLElBQUksTUFBSyxhQUFhLEVBQUU7WUFDbkcsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7WUFDdkMsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNMLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQ3pCLEtBQUssS0FBSyxDQUFDO2dCQUNYLEtBQUssTUFBTTtvQkFDVCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDckUsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDdEQsS0FBSyxXQUFXO29CQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFDLENBQUM7b0JBQ3ZFLE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNsRjtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsU0FBc0MsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO1FBSTFGLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhFLE1BQU0sYUFBYSxHQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBUyxDQUFDO1FBQ3JDLEtBQUssTUFBTSxhQUFhLElBQUksY0FBYyxFQUFFO1lBQzFDLE1BQU0sd0JBQXdCLEdBQXNDO2dCQUNsRSxHQUFHLE1BQU07Z0JBQ1QsVUFBVSxFQUFFLGFBQWE7YUFDMUIsQ0FBQztZQUNGLElBQUk7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDeEUsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbkI7U0FDRjtRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsYUFBYTtZQUN0QixPQUFPLEVBQUUsU0FBUztTQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMvRDtRQUVELE9BQU8sSUFBSSxxQkFBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELHVCQUF1QjtJQUV2Qjs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQXFDLEVBQUU7UUFDMUUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLHFCQUFhLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFdkUsSUFBSSxTQUFvQixDQUFDO1FBQ3pCLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRTtZQUNuQixLQUFLLFVBQVU7Z0JBQ2IsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVMsQ0FBQyxvQkFBb0IsQ0FDbkQ7b0JBQ0UsS0FBSztvQkFDTCxVQUFVLEVBQUUsU0FBUztvQkFDckIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO29CQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87b0JBQ3ZCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUU7b0JBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDakIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2lCQUNwQixFQUNELFVBQVUsRUFDVixNQUFNLENBQUMsT0FBTyxDQUNmLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssYUFBYTtnQkFDaEIsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVMsQ0FBQyxvQkFBb0IsQ0FDbkQ7b0JBQ0UsS0FBSztvQkFDTCxVQUFVLEVBQUUsYUFBYTtvQkFDekIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRTtvQkFDbkMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO29CQUNqQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7aUJBQ2xCLEVBQ0QsVUFBVSxFQUNWLE1BQU0sQ0FBQyxPQUFPLENBQ2YsQ0FBQztnQkFDRixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7U0FDckU7UUFFRCxJQUFJLFVBQW9DLENBQUM7UUFFekMsSUFBSSxTQUFTLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUNuQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDbkc7WUFFRCxVQUFVLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7U0FDbkQ7YUFBTTtZQUNMLElBQUksU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUNuRztZQUNELFVBQVUsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLE9BQU87WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNuQixNQUFNLEVBQUUsSUFBSTtZQUNaLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztZQUNsQyxLQUFLLEVBQUUsVUFBVSxDQUFDLGVBQWU7WUFDakMsV0FBVyxFQUFFLGlCQUFpQjtZQUM5QixPQUFPLEVBQUUsVUFBVSxDQUFDLE9BQU87U0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUFDLFNBQXVDLEVBQUU7UUFDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztTQUN2RTtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1NBQy9EO1FBRUQsSUFBSTtZQUNGLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3pELFNBQVMsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVc7Z0JBQ3hDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztnQkFDZixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLHFCQUFhLEVBQUU7YUFDM0MsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxXQUFXLEVBQUUsZUFBZSxDQUFDLFdBQVc7YUFDekMsQ0FBQztTQUNIO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQTBCLEVBQUU7O1FBQ3BELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBNkIsQ0FBQztRQUN0RyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUNoRTtRQUVELCtFQUErRTtRQUMvRSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUNyQyxNQUFNLElBQUksQ0FBQyxLQUFLO2lCQUNiLElBQUksQ0FDSCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FDWixVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsY0FBYyxHQUFHLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxZQUFZLEVBQzVGLENBQUMsQ0FDRixDQUNGO2lCQUNBLElBQUksRUFBRSxDQUFDO1NBQ1g7UUFDRCxPQUFPLE1BQUEsSUFBSSxDQUFDLFFBQVEsMENBQUUsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQXA3RUQsd0JBbzdFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cblxuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHtcbiAgSUJhc2VDb2luLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbn0gZnJvbSAnLi4vYmFzZUNvaW4nO1xuaW1wb3J0IHsgbWFrZVJhbmRvbUtleSB9IGZyb20gJy4uL2JpdGNvaW4nO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGdldFNoYXJlZFNlY3JldCB9IGZyb20gJy4uL2VjZGgnO1xuaW1wb3J0IHsgQWRkcmVzc0dlbmVyYXRpb25FcnJvciwgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgKiBhcyBpbnRlcm5hbCBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcm5hbCc7XG5pbXBvcnQgeyBkcmF3S2V5Y2FyZCB9IGZyb20gJy4uL2ludGVybmFsL2tleWNhcmQnO1xuaW1wb3J0IHsgS2V5Y2hhaW4gfSBmcm9tICcuLi9rZXljaGFpbic7XG5pbXBvcnQgeyBJUGVuZGluZ0FwcHJvdmFsLCBQZW5kaW5nQXBwcm92YWwgfSBmcm9tICcuLi9wZW5kaW5nQXBwcm92YWwnO1xuaW1wb3J0IHsgVHJhZGluZ0FjY291bnQgfSBmcm9tICcuLi90cmFkaW5nL3RyYWRpbmdBY2NvdW50JztcbmltcG9ydCB7IGluZmVyQWRkcmVzc1R5cGUsIFJlcXVlc3RUcmFjZXIsIFRzc1V0aWxzLCBUeFJlcXVlc3QsIEVkZHNhVW5zaWduZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIEFjY2VsZXJhdGVUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEFkZHJlc3Nlc09wdGlvbnMsXG4gIEJ1aWxkQ29uc29saWRhdGlvblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zLFxuICBDaGFuZ2VGZWVPcHRpb25zLFxuICBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyxcbiAgQ3JlYXRlQWRkcmVzc09wdGlvbnMsXG4gIENyZWF0ZVBvbGljeVJ1bGVPcHRpb25zLFxuICBDcmVhdGVTaGFyZU9wdGlvbnMsXG4gIERlcGxveUZvcndhcmRlcnNPcHRpb25zLFxuICBEb3dubG9hZEtleWNhcmRPcHRpb25zLFxuICBGYW5vdXRVbnNwZW50c09wdGlvbnMsXG4gIEZsdXNoRm9yd2FyZGVyVG9rZW5PcHRpb25zLFxuICBGcmVlemVPcHRpb25zLFxuICBHZXRBZGRyZXNzT3B0aW9ucyxcbiAgR2V0UHJ2T3B0aW9ucyxcbiAgR2V0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBHZXRUcmFuc2Zlck9wdGlvbnMsXG4gIEdldFVzZXJQcnZPcHRpb25zLFxuICBJV2FsbGV0LFxuICBNYXhpbXVtU3BlbmRhYmxlLFxuICBNYXhpbXVtU3BlbmRhYmxlT3B0aW9ucyxcbiAgTW9kaWZ5V2ViaG9va09wdGlvbnMsXG4gIFBhZ2luYXRpb25PcHRpb25zLFxuICBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0LFxuICBSZWNvdmVyVG9rZW5PcHRpb25zLFxuICBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyxcbiAgUmVtb3ZlVXNlck9wdGlvbnMsXG4gIFNlbmRNYW55T3B0aW9ucyxcbiAgU2VuZE9wdGlvbnMsXG4gIFNoYXJlV2FsbGV0T3B0aW9ucyxcbiAgU2ltdWxhdGVXZWJob29rT3B0aW9ucyxcbiAgU3VibWl0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBTd2VlcE9wdGlvbnMsXG4gIFRyYW5zZmVyQnlTZXF1ZW5jZUlkT3B0aW9ucyxcbiAgVHJhbnNmZXJDb21tZW50T3B0aW9ucyxcbiAgVHJhbnNmZXJzT3B0aW9ucyxcbiAgVW5zcGVudHNPcHRpb25zLFxuICBVcGRhdGVBZGRyZXNzT3B0aW9ucyxcbiAgV2FsbGV0Q29pblNwZWNpZmljLFxuICBXYWxsZXREYXRhLFxuICBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICcuL2lXYWxsZXQnO1xuaW1wb3J0IHsgU3Rha2luZ1dhbGxldCB9IGZyb20gJy4uL3N0YWtpbmcvc3Rha2luZ1dhbGxldCc7XG5pbXBvcnQgeyBMaWdodG5pbmcgfSBmcm9tICcuLi9saWdodG5pbmcnO1xuaW1wb3J0IEVkZHNhVXRpbHMgZnJvbSAnLi4vdXRpbHMvdHNzL2VkZHNhJztcbmltcG9ydCB7IEVjZHNhVXRpbHMgfSBmcm9tICcuLi91dGlscy90c3MvZWNkc2EnO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdiaXRnbzp2Mjp3YWxsZXQnKTtcblxudHlwZSBNYW5hZ2VVbnNwZW50cyA9ICdjb25zb2xpZGF0ZScgfCAnZmFub3V0JztcblxuZXhwb3J0IGNsYXNzIFdhbGxldCBpbXBsZW1lbnRzIElXYWxsZXQge1xuICBwdWJsaWMgcmVhZG9ubHkgYml0Z286IEJpdEdvQmFzZTtcbiAgcHVibGljIHJlYWRvbmx5IGJhc2VDb2luOiBJQmFzZUNvaW47XG4gIHByaXZhdGUgX3dhbGxldDogV2FsbGV0RGF0YTtcbiAgcHJpdmF0ZSByZWFkb25seSB0c3NVdGlsczogRWNkc2FVdGlscyB8IEVkZHNhVXRpbHMgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Blcm1pc3Npb25zPzogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbiwgd2FsbGV0RGF0YTogYW55KSB7XG4gICAgdGhpcy5iaXRnbyA9IGJpdGdvO1xuICAgIHRoaXMuYmFzZUNvaW4gPSBiYXNlQ29pbjtcbiAgICB0aGlzLl93YWxsZXQgPSB3YWxsZXREYXRhO1xuICAgIGNvbnN0IHVzZXJJZCA9IF8uZ2V0KGJpdGdvLCAnX3VzZXIuaWQnKTtcbiAgICBpZiAoXy5pc1N0cmluZyh1c2VySWQpKSB7XG4gICAgICBjb25zdCB1c2VyRGV0YWlscyA9IF8uZmluZCh3YWxsZXREYXRhLnVzZXJzLCB7IHVzZXI6IHVzZXJJZCB9KTtcbiAgICAgIHRoaXMuX3Blcm1pc3Npb25zID0gXy5nZXQodXNlckRldGFpbHMsICdwZXJtaXNzaW9ucycpO1xuICAgIH1cbiAgICBpZiAoYmFzZUNvaW4/LnN1cHBvcnRzVHNzKCkpIHtcbiAgICAgIHN3aXRjaCAoYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkpIHtcbiAgICAgICAgY2FzZSAnZWNkc2EnOlxuICAgICAgICAgIHRoaXMudHNzVXRpbHMgPSBuZXcgRWNkc2FVdGlscyhiaXRnbywgYmFzZUNvaW4sIHRoaXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdlZGRzYSc6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IG5ldyBFZGRzYVV0aWxzKGJpdGdvLCBiYXNlQ29pbiwgdGhpcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy50c3NVdGlscyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBVUkwgdXNpbmcgdGhpcyB3YWxsZXQncyBpZCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgQml0R28gQVBJIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGV4dHJhIEFQSSBzcGVjaWZpYyBzdHJpbmcgdG8gYXBwZW5kIHRvIHRoZSB3YWxsZXQgaWRcbiAgICovXG4gIHVybChleHRyYSA9ICcnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArIGV4dHJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhpcyB3YWxsZXQncyBpZFxuICAgKi9cbiAgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBmb3Igc3BlbmRpbmcgZnVuZHMgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgYXBwcm92YWxzUmVxdWlyZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmFwcHJvdmFsc1JlcXVpcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICBiYWxhbmNlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlO1xuICB9XG5cbiAgcHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdhZGRyZXNzVHlwZScsXG4gICAgICAnY2hhbmdlQWRkcmVzcycsXG4gICAgICAnY29uc29saWRhdGVBZGRyZXNzZXMnLFxuICAgICAgJ2NwZnBGZWVSYXRlJyxcbiAgICAgICdjcGZwVHhJZHMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnZ2FzTGltaXQnLFxuICAgICAgJ2dhc1ByaWNlJyxcbiAgICAgICdpZGZTaWduZWRUaW1lc3RhbXAnLFxuICAgICAgJ2lkZlVzZXJJZCcsXG4gICAgICAnaWRmVmVyc2lvbicsXG4gICAgICAnaW5zdGFudCcsXG4gICAgICAnbGFzdExlZGdlclNlcXVlbmNlJyxcbiAgICAgICdsZWRnZXJTZXF1ZW5jZURlbHRhJyxcbiAgICAgICdtYXhGZWUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heFZhbHVlJyxcbiAgICAgICdtZW1vJyxcbiAgICAgICd0cmFuc2ZlcklkJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICdtaW5Db25maXJtcycsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ25vU3BsaXRDaGFuZ2UnLFxuICAgICAgJ251bUJsb2NrcycsXG4gICAgICAnbm9uY2UnLFxuICAgICAgJ3JlY2lwaWVudHMnLFxuICAgICAgJ3Jlc2VydmF0aW9uJyxcbiAgICAgICdzZXF1ZW5jZUlkJyxcbiAgICAgICdzdHJhdGVneScsXG4gICAgICAndGFyZ2V0V2FsbGV0VW5zcGVudHMnLFxuICAgICAgJ3RydXN0bGluZXMnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3Vuc3BlbnRzJyxcbiAgICAgICdub25QYXJ0aWNpcGF0aW9uJyxcbiAgICAgICd2YWxpZEZyb21CbG9jaycsXG4gICAgICAndmFsaWRUb0Jsb2NrJyxcbiAgICAgICdtZXNzYWdlS2V5JyxcbiAgICAgICdzdGFraW5nT3B0aW9ucycsXG4gICAgICAnZWlwMTU1OScsXG4gICAgICAna2V5cmVnVHhCYXNlNjQnLFxuICAgICAgJ2Nsb3NlUmVtYWluZGVyVG8nLFxuICAgICAgJ3Rva2VuTmFtZScsXG4gICAgICAnZW5hYmxlVG9rZW5zJyxcbiAgICAgIC8vIHBhcmFtIHRvIHNldCBlbWVyZ2VuY3kgZmxhZyBvbiBhIGN1c3RvZGlhbCB0cmFuc2FjdGlvbi5cbiAgICAgIC8vIFRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBpbiBsZXNzIHRoYW4gMSBob3VyIG9yIGl0IHdpbGwgZmFpbC5cbiAgICAgICdlbWVyZ2VuY3knLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBhIHN0cmljdCBzdWItc2V0IG9mIHByZWJ1aWxkV2hpdGVsaXN0ZWRQYXJhbXNcbiAgICovXG4gIHByZWJ1aWxkQ29uc29saWRhdGVBY2NvdW50UGFyYW1zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydjb25zb2xpZGF0ZUFkZHJlc3NlcycsICdmZWVSYXRlJywgJ21heEZlZVJhdGUnLCAnbWVtbycsICd2YWxpZEZyb21CbG9jaycsICd2YWxpZFRvQmxvY2snLCAncHJldmlldyddO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICovXG4gIGNvbmZpcm1lZEJhbGFuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0LmNvbmZpcm1lZEJhbGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldFxuICAgKi9cbiAgc3BlbmRhYmxlQmFsYW5jZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBiYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5iYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uZmlybWVkIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBjb25maXJtZWRCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb25maXJtZWRCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlbmRhYmxlIGJhbGFuY2Ugb2YgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhpcyBpcyB1c2VmdWwgd2hlbiBiYWxhbmNlcyBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gb3ZlcmZsb3cgc3RhbmRhcmQgamF2YXNjcmlwdCBudW1iZXJzXG4gICAqL1xuICBzcGVuZGFibGVCYWxhbmNlU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5zcGVuZGFibGVCYWxhbmNlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29pbiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBjb2luIHRoaXMgd2FsbGV0IGhvbGRzXG4gICAqL1xuICBjb2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFiZWwgKG5hbWUpIGZvciB0aGlzIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGxhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5sYWJlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHB1YmxpYyBvYmplY3QgaWRzIGZvciB0aGUga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LlxuICAgKi9cbiAgcHVibGljIGtleUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5rZXlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHJlY2VpdmUgYWRkcmVzcyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyByZWNlaXZlQWRkcmVzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucmVjZWl2ZUFkZHJlc3MuYWRkcmVzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHdhbGxldCBpZCBvZiB0aGUgd2FsbGV0IHRoYXQgdGhpcyB3YWxsZXQgd2FzIG1pZ3JhdGVkIGZyb20uXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiB0aGlzIGlzIGEgQkNIIHdhbGxldCB0aGF0IHdhcyBjcmVhdGVkIGZyb20gYSBCVEMgd2FsbGV0LFxuICAgKiB0aGUgQkNIIHdhbGxldCBtaWdyYXRlZCBmcm9tIGZpZWxkIHdvdWxkIGhhdmUgdGhlIEJUQyB3YWxsZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgbWlncmF0ZWRGcm9tKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5taWdyYXRlZEZyb207XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB0b2tlbiBmbHVzaCB0aHJlc2hvbGRzIGZvciB0aGlzIHdhbGxldFxuICAgKiBAcmV0dXJuIHsqfE9iamVjdH0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkcyB9IGJhc2UgdW5pdHNcbiAgICovXG4gIHRva2VuRmx1c2hUaHJlc2hvbGRzKCk6IGFueSB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLnRva2VuRmx1c2hUaHJlc2hvbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB3YWxsZXQgcHJvcGVydGllcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gY2VydGFpbiBjb2luIGltcGxlbWVudGF0aW9uc1xuICAgKi9cbiAgY29pblNwZWNpZmljKCk6IFdhbGxldENvaW5TcGVjaWZpYyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwZW5kaW5nIGFwcHJvdmFscyBvbiB0aGlzIHdhbGxldFxuICAgKi9cbiAgcGVuZGluZ0FwcHJvdmFscygpOiBJUGVuZGluZ0FwcHJvdmFsW10ge1xuICAgIHJldHVybiB0aGlzLl93YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoKGN1cnJlbnRBcHByb3ZhbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQZW5kaW5nQXBwcm92YWwodGhpcy5iaXRnbywgdGhpcy5iYXNlQ29pbiwgY3VycmVudEFwcHJvdmFsLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSB3YWxsZXQgb2JqZWN0IGJ5IHN5bmNpbmcgd2l0aCB0aGUgYmFjay1lbmRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7V2FsbGV0fVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgpKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbnMocGFyYW1zOiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogUGFnaW5hdGlvbk9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4JykpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAtIHR4SGFzaCB0aGUgdHJhbnNhY3Rpb24gaGFzaCB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24ocGFyYW1zOiBHZXRUcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eEhhc2gnXSwgW10pO1xuXG4gICAgY29uc3QgcXVlcnk6IFBhZ2luYXRpb25PcHRpb25zID0ge307XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcmV2SWQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmxpbWl0KSkge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpIHx8IHBhcmFtcy5saW1pdCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5nZXQodGhpcy51cmwoJy90eC8nICsgcGFyYW1zLnR4SGFzaCkpXG4gICAgICAucXVlcnkocXVlcnkpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdHJhbnNmZXJzIGZvciBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgdHJhbnNmZXJzKHBhcmFtczogVHJhbnNmZXJzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeTogVHJhbnNmZXJzT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuYWxsVG9rZW5zKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5hbGxUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbGxUb2tlbnMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hbGxUb2tlbnMgPSBwYXJhbXMuYWxsVG9rZW5zO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoTGFiZWwpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuc2VhcmNoTGFiZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWFyY2hMYWJlbCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc2VhcmNoTGFiZWwgPSBwYXJhbXMuc2VhcmNoTGFiZWw7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgICBpZiAoIV8uaXNBcnJheShwYXJhbXMuYWRkcmVzcykgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhZGRyZXNzIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nIG9yIGFycmF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoXy5pc0FycmF5KHBhcmFtcy5hZGRyZXNzKSkge1xuICAgICAgICBwYXJhbXMuYWRkcmVzcy5mb3JFYWNoKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgaWYgKCFfLmlzU3RyaW5nKGFkZHJlc3MpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYWRkcmVzcyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIGFkZHJlc3Mgc3RyaW5ncycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBxdWVyeS5hZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlR3RlKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmRhdGVHdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkYXRlR3RlIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlR3RlID0gcGFyYW1zLmRhdGVHdGU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kYXRlTHQpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMuZGF0ZUx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGF0ZUx0IGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5kYXRlTHQgPSBwYXJhbXMuZGF0ZUx0O1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVHdGUpKSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnZhbHVlR3RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFsdWVHdGUgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlR3RlID0gcGFyYW1zLnZhbHVlR3RlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMudmFsdWVMdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbHVlTHQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnZhbHVlTHQgPSBwYXJhbXMudmFsdWVMdDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLmluY2x1ZGVIZXgpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlSGV4KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZUhleCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmluY2x1ZGVIZXggPSBwYXJhbXMuaW5jbHVkZUhleDtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnN0YXRlKSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy5zdGF0ZSkgJiYgIV8uaXNTdHJpbmcocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcgb3IgYXJyYXknKTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLnN0YXRlKSkge1xuICAgICAgICBwYXJhbXMuc3RhdGUuZm9yRWFjaCgoc3RhdGUpID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNTdHJpbmcoc3RhdGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGUgYXJndW1lbnQsIGV4cGVjdGluZyBhcnJheSBvZiBzdGF0ZSBzdHJpbmdzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMudHlwZSkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHlwZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHR5cGUgYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnR5cGUgPSBwYXJhbXMudHlwZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2ZlcicpKS5xdWVyeShxdWVyeSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zZmVycyBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRUcmFuc2ZlcihwYXJhbXM6IEdldFRyYW5zZmVyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy90cmFuc2Zlci8nICsgcGFyYW1zLmlkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHRyYW5zZmVyQnlTZXF1ZW5jZUlkKHBhcmFtczogVHJhbnNmZXJCeVNlcXVlbmNlSWRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnc2VxdWVuY2VJZCddLCBbXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdHJhbnNmZXIvc2VxdWVuY2VJZC8nICsgcGFyYW1zLnNlcXVlbmNlSWQpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1heGltdW0gYW1vdW50IHlvdSBjYW4gc3BlbmQgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgLSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3RhYmxlIHVuc3BlbnRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluVmFsdWUgLSB0aGUgbWluaW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhWYWx1ZSAtIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkhlaWdodCAtIHRoZSBtaW5pbXVtIGhlaWdodCBvZiB1bnNwZW50cyBvbiB0aGUgYmxvY2sgY2hhaW4gdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gZmVlIHJhdGUgdG8gdXNlIGluIGNhbGN1bGF0aW9uIG9mIG1heGltdW0gc3BlbmRhYmxlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucmVjaXBpZW50QWRkcmVzcyAtIHJlY2lwaWVudCBhZGRyZXNzZXMgZm9yIGEgbW9yZSBhY2N1cmF0ZSBjYWxjdWxhdGlvbiBvZiB0aGUgbWF4aW11bSBhdmFpbGFibGUgdG8gc2VuZFxuICAgKiBAcmV0dXJucyB7e21heGltdW1TcGVuZGFibGU6IE51bWJlciwgY29pbjogU3RyaW5nfX1cbiAgICogTk9URSA6IGZlZVR4Q29uZmlybVRhcmdldCBvbWl0dGVkIG9uIHB1cnBvc2UgYmVjYXVzZSBnYXVnaW5nIHRoZSBtYXhpbXVtIHNwZW5kYWJsZSBhbW91bnQgd2l0aCBkeW5hbWljIGZlZXMgZG9lcyBub3QgbWFrZSBzZW5zZVxuICAgKi9cbiAgYXN5bmMgbWF4aW11bVNwZW5kYWJsZShwYXJhbXM6IE1heGltdW1TcGVuZGFibGVPcHRpb25zID0ge30pOiBQcm9taXNlPE1heGltdW1TcGVuZGFibGU+IHtcbiAgICBjb25zdCBmaWx0ZXJlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdlbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhGZWVSYXRlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3BsYWluVGFyZ2V0JyxcbiAgICAgICdyZWNpcGllbnRBZGRyZXNzJyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvbWF4aW11bVNwZW5kYWJsZScpKS5xdWVyeShmaWx0ZXJlZFBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgdW5zcGVudHMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB1bnNwZW50cyhwYXJhbXM6IFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBxdWVyeSA9IF8ucGljayhwYXJhbXMsIFtcbiAgICAgICdjaGFpbnMnLFxuICAgICAgJ2xpbWl0JyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluVmFsdWUnLFxuICAgICAgJ3ByZXZJZCcsXG4gICAgICAnc2Vnd2l0JyxcbiAgICAgICd0YXJnZXQnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlIG9yIGZhbm91dCB1bnNwZW50cyBvbiBhIHdhbGxldFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcm91dGVOYW1lIC0gZWl0aGVyIGBjb25zb2xpZGF0ZWAgb3IgYGZhbm91dGBcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqXG4gICAqIFdhbGxldCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB0aGUgdXNlcnMgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy54cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtIGlmIHRoZSB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogRmVlIHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBmZWUgcmF0ZSB0byB1c2UgZm9yIHRoZSBjb25zb2xpZGF0aW9uIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUGVyY2VudGFnZSAtIHRoZSBtYXhpbXVtIHJlbGF0aXZlIHBvcnRpb24gdGhhdCB5b3UncmUgd2lsbGluZyB0byBzcGVuZCB0b3dhcmRzIGZlZXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQgLSBlc3RpbWF0ZSB0aGUgZmVlcyB0byBhaW0gZm9yIGZpcnN0IGNvbmZpcm1hdGlvbiB3aXRoIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuICAgKlxuICAgKiBJbnB1dCBwYXJhbWV0ZXJzOlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2UgaW4gc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSBpZiB0cnVlLCBtaW5Db25maXJtcyBhbHNvIGFwcGxpZXMgdG8gY2hhbmdlIG91dHB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5saW1pdCAgICAgICAgICAgICAgICBmb3Igcm91dGVOYW1lID09PSAnY29uc29saWRhdGUnXG4gICAqICAgICAgICAgICAgICAgICBwYXJhbXMubWF4TnVtSW5wdXRzVG9Vc2UgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2Zhbm91dCdcbiAgICogICAgICAgICAgICAgICAgICAtIG1heGltdW0gbnVtYmVyIG9mIHVuc3BlbnRzIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogT3V0cHV0IHBhcmFtZXRlcnM6XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVVuc3BlbnRzKFxuICAgIHJvdXRlTmFtZTogTWFuYWdlVW5zcGVudHMsXG4gICAgcGFyYW1zOiBDb25zb2xpZGF0ZVVuc3BlbnRzT3B0aW9ucyB8IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ21heEZlZVBlcmNlbnRhZ2UnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG5cbiAgICAgICdtaW5WYWx1ZScsXG4gICAgICAnbWF4VmFsdWUnLFxuICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAndGFyZ2V0QWRkcmVzcycsXG5cbiAgICAgIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJyA/ICdsaW1pdCcgOiAnbWF4TnVtSW5wdXRzVG9Vc2UnLFxuICAgICAgJ251bVVuc3BlbnRzVG9NYWtlJyxcbiAgICBdKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy51cmwoYC8ke3JvdXRlTmFtZX1VbnNwZW50c2ApKVxuICAgICAgLnNlbmQoZmlsdGVyZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pblxuICAgICAgLmtleWNoYWlucygpXG4gICAgICAuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMsIHJlcUlkIH0pKSBhcyB1bmtub3duIGFzIEtleWNoYWluW107XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHJlc3BvbnNlLFxuICAgICAga2V5Y2hhaW46IGtleWNoYWluc1swXSxcbiAgICAgIHB1YnM6IGtleWNoYWlucy5tYXAoKGspID0+IGsucHViKSxcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIFsnY29tbWVudCcsICdvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zLCB7IHR5cGU6IHJvdXRlTmFtZSB9KTtcblxuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKGZpbmFsVHhQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGUgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVJhdGUgLSBUaGUgZmVlIHJhdGUgdG8gdXNlIGZvciB0aGUgY29uc29saWRhdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVJhdGUgLSB1cHBlciBsaW1pdCBmb3IgZmVlUmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSByZWxhdGl2ZSBwb3J0aW9uIHRoYXQgeW91J3JlIHdpbGxpbmcgdG8gc3BlbmQgdG93YXJkcyBmZWVzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0IC0gZXN0aW1hdGUgdGhlIGZlZXMgdG8gYWltIGZvciBmaXJzdCBjb25maXJtYXRpb24gd2l0aCB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5WYWx1ZSAtIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHVuc3BlbnRzIHRvIHVzZSBpbiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heFZhbHVlIC0gdGhlIG1heGltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlIGluIHNhdG9zaGlzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluSGVpZ2h0IC0gdGhlIG1pbmltdW0gaGVpZ2h0IG9mIHVuc3BlbnRzIG9uIHRoZSBibG9jayBjaGFpbiB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5Db25maXJtcyAtIGFsbCBzZWxlY3RlZCB1bnNwZW50cyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhpcyBtYW55IGNvbmZpcm1hdGlvbnNcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gaWYgdHJ1ZSwgbWluQ29uZmlybXMgYWxzbyBhcHBsaWVzIHRvIGNoYW5nZSBvdXRwdXRzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGltaXQgICAgICAgICAgICAgICAgZm9yIHJvdXRlTmFtZSA9PT0gJ2NvbnNvbGlkYXRlJ1xuICAgKiAgICAgICAgICAgICAgICAgcGFyYW1zLm1heE51bUlucHV0c1RvVXNlICAgIGZvciByb3V0ZU5hbWUgPT09ICdmYW5vdXQnXG4gICAqICAgICAgICAgICAgICAgICAgLSBtYXhpbXVtIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZVVuc3BlbnRzKHBhcmFtczogQ29uc29saWRhdGVVbnNwZW50c09wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubWFuYWdlVW5zcGVudHMoJ2NvbnNvbGlkYXRlJywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYW5vdXQgdW5zcGVudHMgb24gYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pblZhbHVlIC0gdGhlIG1pbmltdW0gdmFsdWUgb2YgdW5zcGVudHMgdG8gdXNlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4VmFsdWUgLSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB1bnNwZW50cyB0byB1c2VcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5IZWlnaHQgLSB0aGUgbWluaW11bSBoZWlnaHQgb2YgdW5zcGVudHMgb24gdGhlIGJsb2NrIGNoYWluIHRvIHVzZVxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gYWxsIHNlbGVjdGVkIHVuc3BlbnRzIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGlzIG1hbnkgY29uZmlybWF0aW9uc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEZlZVBlcmNlbnRhZ2UgLSB0aGUgbWF4aW11bSBwcm9wb3J0aW9uIG9mIGFuIHVuc3BlbnQgeW91IGFyZSB3aWxsaW5nIHRvIGxvc2UgdG8gZmVlc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIGVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGggdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIFRoZSBkZXNpcmVkIGZlZSByYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24gaW4gc2F0b3NoaXMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gVGhlIG1heCBsaW1pdCBmb3IgYSBmZWUgcmF0ZSBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heE51bUlucHV0c1RvVXNlIC0gdGhlIG51bWJlciBvZiB1bnNwZW50cyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtVW5zcGVudHNUb01ha2UgLSB0aGUgbnVtYmVyIG9mIG5ldyB1bnNwZW50cyB0byBtYWtlXG4gICAqL1xuICBhc3luYyBmYW5vdXRVbnNwZW50cyhwYXJhbXM6IEZhbm91dFVuc3BlbnRzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VVbnNwZW50cygnZmFub3V0JywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRva2VuIGZsdXNoIHRocmVzaG9sZHMgZm9yIHRoZSB3YWxsZXQuIFVwZGF0ZXMgdGhlIHdhbGxldC5cbiAgICogVG9rZW5zIHdpbGwgb25seSBiZSBmbHVzaGVkIGZyb20gZm9yd2FyZGVyIGNvbnRyYWN0cyBpZiB0aGUgYmFsYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBkZWZpbmVkIGhlcmUuXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRzIHtPYmplY3R9IC0gcGFpcnMgb2YgeyBbdG9rZW5OYW1lXTogdGhyZXNob2xkIH0gKGJhc2UgdW5pdHMpXG4gICAqL1xuICBhc3luYyB1cGRhdGVUb2tlbkZsdXNoVGhyZXNob2xkcyh0aHJlc2hvbGRzOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgd2FsbGV0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd2FsbGV0ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLnVybCgpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB0b2tlbkZsdXNoVGhyZXNob2xkczogdGhyZXNob2xkcyxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gIH1cbiAgLyoqXG4gICAgICAqIFVwZGF0ZXMgdGhlIHdhbGxldC4gU2V0cyBmbGFncyBmb3IgZGVwbG95Rm9yd2FyZGVyc01hbnVhbGx5IGFuZCBmbHVzaEZvcndhcmRlcnNNYW51YWxseSBvZiB0aGUgd2FsbGV0LlxuICAgICAgKiBAcGFyYW0gZm9yd2FyZGVyRmxhZ3Mge09iamVjdH0gLSB7XG4gICAgICAgIFwiY29pblNwZWNpZmljXCI6IHtcbiAgICAgICAgICBbY29pbk5hbWVdOiB7XG4gICAgICAgICAgICBcImRlcGxveUZvcndhcmRlcnNNYW51YWxseVwiOiB7Qm9vbGVhbn0sXG4gICAgICAgICAgICBcImZsdXNoRm9yd2FyZGVyc01hbnVhbGx5XCI6IHtCb29sZWFufVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgKi9cbiAgYXN5bmMgdXBkYXRlRm9yd2FyZGVycyhmb3J3YXJkZXJGbGFnczogYW55ID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmJhc2VDb2luLmdldEZhbWlseSgpICE9PSAnZXRoJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkIGZvciB0aGlzIHdhbGxldCcpO1xuICAgIH1cbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgpKS5zZW5kKGZvcndhcmRlckZsYWdzKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBkZXBsb3kgYW4gRVRIIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC0gYWRkcmVzc0lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmlkXSAtIGFkZHJlc3NJZCBjb3VsZCBiZSByZWNlaXZlZCBhbHNvIGFzIGlkXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEh0dHAgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIGRlcGxveUZvcndhcmRlcnMocGFyYW1zOiBEZXBsb3lGb3J3YXJkZXJzT3B0aW9ucyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIG9yIGlkIG9mIGFkZHJlc3MgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgbGV0IHF1ZXJ5O1xuICAgIGlmIChwYXJhbXMuYWRkcmVzcykge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuYWRkcmVzcztcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkgPSBwYXJhbXMuaWQ7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKGAvYWRkcmVzcy8ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9L2RlcGxveW1lbnRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBtYW51YWxseSBmb3J3YXJkIHRva2VucyBmcm9tIGFuIEVUSCBvciBDRUxPIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudG9rZW5OYW1lIC0gTmFtZSBvZiB0b2tlbiB0aGF0IG5lZWRzIHRvIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmFkZHJlc3NdIC1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuYWRkcmVzc10gLSBhZGRyZXNzSWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuaWRdIC0gYWRkcmVzc0lkIGNvdWxkIGJlIHJlY2VpdmVkIGFsc28gYXMgaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtwYXJhbXMuZ2FzUHJpY2VdIC0gRXhwbGljaXQgZ2FzIHByaWNlIHRvIHVzZSB3aGVuIGZvcndhcmRpbmcgdG9rZW4gZnJvbSB0aGUgZm9yd2FyZGVyIGNvbnRyYWN0IChFVEggYW5kIENlbG8gb25seSkuIElmIG5vdCBnaXZlbiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZXN0aW1hdGVkIG5ldHdvcmsgZ2FzIHByaWNlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5laXAxNTU5XSAtIFNwZWNpZnkgZWlwMTU1OSBmZWUgcGFyYW1ldGVycyBpbiB0b2tlbiBmb3J3YXJkaW5nIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBIdHRwIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBmbHVzaEZvcndhcmRlclRva2VuKHBhcmFtczogRmx1c2hGb3J3YXJkZXJUb2tlbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5hZGRyZXNzKSAmJiBfLmlzVW5kZWZpbmVkKHBhcmFtcy5pZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYWRkcmVzcyBvciBpZCBvZiBhZGRyZXNzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGxldCBxdWVyeTtcbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybChgL2FkZHJlc3MvJHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfS90b2tlbmZvcndhcmRgKTtcbiAgICB0aGlzLl93YWxsZXQgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodXJsKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2VlcCBmdW5kcyBmb3IgYSB3YWxsZXRcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtZXRlcnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHNlbmQgYWxsIHRoZSBmdW5kcyBpbiB0aGUgd2FsbGV0IHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHRoZSB1c2VycyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSB0aGUgcHJpdmF0ZSBrZXkgaW4gc3RyaW5nIGZvcm0gaWYgdGhlIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IGF2YWlsYWJsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLm90cCAtIFR3byBmYWN0b3IgYXV0aCBjb2RlIHRvIGVuYWJsZSBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAtIEVzdGltYXRlIHRoZSBmZWVzIHRvIGFpbSBmb3IgZmlyc3QgY29uZmlybWF0aW9uIHdpdGhpbiB0aGlzIG51bWJlciBvZiBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gVGhlIGRlc2lyZWQgZmVlIHJhdGUgZm9yIHRoZSB0cmFuc2FjdGlvbiBpbiBzYXRvc2hpcy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gW3BhcmFtcy5tYXhGZWVSYXRlXSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5hbGxvd1BhcnRpYWxTd2VlcF0gLSBhbGxvd3Mgc3dlZXBpbmcgMjAwIHVuc3BlbnRzIHdoZW4gdGhlIHdhbGxldCBoYXMgbW9yZSB0aGFuIHRoYXRcbiAgICogQHJldHVybnMgdHhIZXgge1N0cmluZ30gdGhlIHR4SGV4IG9mIHRoZSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIHN3ZWVwKHBhcmFtczogU3dlZXBPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnLCAnb3RwJ10pO1xuXG4gICAgLy8gVGhlIHN3ZWVwIEFQSSBlbmRwb2ludCBpcyBvbmx5IGF2YWlsYWJsZSB0byB1dHhvLWJhc2VkIGNvaW5zXG5cbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3dlZXBXaXRoU2VuZE1hbnkoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlybWVkQmFsYW5jZVN0cmluZygpICE9PSB0aGlzLmJhbGFuY2VTdHJpbmcoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Nhbm5vdCBzd2VlcCB3aGVuIHVuY29uZmlybWVkIGZ1bmRzIGV4aXN0IG9uIHRoZSB3YWxsZXQsIHBsZWFzZSB3YWl0IHVudGlsIGFsbCBpbmJvdW5kIHRyYW5zYWN0aW9ucyBjb25maXJtJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3BlbmRhYmxlQmFsYW5jZVN0cmluZygpO1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodmFsdWUpIHx8IHZhbHVlID09PSAnMCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBmdW5kcyB0byBzd2VlcCcpO1xuICAgICAgfVxuICAgICAgKHBhcmFtcyBhcyBhbnkpLnJlY2lwaWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgXTtcblxuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnkocGFyYW1zKTtcbiAgICB9XG4gICAgLy8gdGhlIGZvbGxvd2luZyBmbG93IHdvcmtzIGZvciBhbGwgVVRYTyBjb2luc1xuXG4gICAgY29uc3QgcmVxSWQgPSBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIGNvbnN0IGZpbHRlcmVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ2FkZHJlc3MnLFxuICAgICAgJ2ZlZVJhdGUnLFxuICAgICAgJ21heEZlZVJhdGUnLFxuICAgICAgJ2ZlZVR4Q29uZmlybVRhcmdldCcsXG4gICAgICAnYWxsb3dQYXJ0aWFsU3dlZXAnLFxuICAgIF0pO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9zd2VlcFdhbGxldCcpKS5zZW5kKGZpbHRlcmVkUGFyYW1zKS5yZXN1bHQoKTtcblxuICAgIC8vIFRPRE8oQkctMzU4OCk6IGFkZCB0eEhleCB2YWxpZGF0aW9uIHRvIHByb3RlY3QgbWFuIGluIHRoZSBtaWRkbGUgYXR0YWNrcyByZXBsYWNpbmcgdGhlIHR4SGV4XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5rZXljaGFpbnMoKS5nZXRLZXlzRm9yU2lnbmluZyh7IHdhbGxldDogdGhpcywgcmVxSWQgfSkpIGFzIGFueTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogcmVzcG9uc2UsXG4gICAgICBrZXljaGFpbjoga2V5Y2hhaW5zWzBdLFxuICAgICAgdXNlcktleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHJ2OiBwYXJhbXMueHBydixcbiAgICB9O1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgWydvdHAnXSk7XG4gICAgY29uc3QgZmluYWxUeFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBzaWduZWRUcmFuc2FjdGlvbiwgc2VsZWN0UGFyYW1zKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy90eC9zZW5kJykpXG4gICAgICAuc2VuZChmaW5hbFR4UGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSBhIGdpdmVuIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgZnJlZXplKHBhcmFtczogRnJlZXplT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5kdXJhdGlvbikge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGR1cmF0aW9uOiBzaG91bGQgYmUgbnVtYmVyIG9mIHNlY29uZHMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvZnJlZXplJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY29tbWVudCBvZiBhIHRyYW5zZmVyXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyB0cmFuc2ZlckNvbW1lbnQocGFyYW1zOiBUcmFuc2ZlckNvbW1lbnRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnaWQnXSwgWydjb21tZW50J10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL3RyYW5zZmVyLycgKyBwYXJhbXMuaWQgKyAnL2NvbW1lbnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBhZGRyZXNzZXMgZm9yIGEgZ2l2ZW4gd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBhZGRyZXNzZXMocGFyYW1zOiBBZGRyZXNzZXNPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgICBjb25zdCBxdWVyeTogQWRkcmVzc2VzT3B0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHBhcmFtcy5taW5lKSB7XG4gICAgICBxdWVyeS5taW5lID0gISFwYXJhbXMubWluZTtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucHJldklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJldklkIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5wcmV2SWQgPSBwYXJhbXMucHJldklkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc29ydCkge1xuICAgICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5zb3J0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuc29ydCA9IHBhcmFtcy5zb3J0O1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubGltaXQpIHtcbiAgICAgIGlmICghXy5pc051bWJlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsaW1pdCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgICAgfVxuICAgICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sYWJlbENvbnRhaW5zKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmxhYmVsQ29udGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBsYWJlbENvbnRhaW5zIGFyZ3VtZW50LCBleHBlY3Rpbmcgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5sYWJlbENvbnRhaW5zID0gcGFyYW1zLmxhYmVsQ29udGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzZWd3aXQgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhaW5zKSkge1xuICAgICAgaWYgKCFfLmlzQXJyYXkocGFyYW1zLmNoYWlucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWlucyBhcmd1bWVudCwgZXhwZWN0aW5nIGFycmF5IG9mIG51bWJlcnMnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmNoYWlucyA9IHBhcmFtcy5jaGFpbnM7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzTmlsKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICBpZiAoIV8uaXNCb29sZWFuKHBhcmFtcy5pbmNsdWRlQmFsYW5jZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlQmFsYW5jZXMgYXJndW1lbnQsIGV4cGVjdGluZyBib29sZWFuJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5pbmNsdWRlQmFsYW5jZXMgPSBwYXJhbXMuaW5jbHVkZUJhbGFuY2VzO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRva2VucykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmluY2x1ZGVUb2tlbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNsdWRlVG9rZW5zIGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRva2VucyA9IHBhcmFtcy5pbmNsdWRlVG9rZW5zO1xuICAgIH1cblxuICAgIGlmICghXy5pc05pbChwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50IGFyZ3VtZW50LCBleHBlY3RpbmcgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgcXVlcnkuaW5jbHVkZVRvdGFsQWRkcmVzc0NvdW50ID0gcGFyYW1zLmluY2x1ZGVUb3RhbEFkZHJlc3NDb3VudDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJldHVybkJhbGFuY2VzRm9yVG9rZW4pIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJldHVybkJhbGFuY2VzRm9yVG9rZW4gYXJndW1lbnQsIGV4cGVjdGluZyBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnJldHVybkJhbGFuY2VzRm9yVG9rZW4gPSBwYXJhbXMucmV0dXJuQmFsYW5jZXNGb3JUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNOaWwocGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50KSkge1xuICAgICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMucGVuZGluZ0RlcGxveW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwZW5kaW5nRGVwbG95bWVudCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LnBlbmRpbmdEZXBsb3ltZW50ID0gcGFyYW1zLnBlbmRpbmdEZXBsb3ltZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLl93YWxsZXQuaWQgKyAnL2FkZHJlc3NlcycpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB3YWxsZXQgYWRkcmVzcyBieSBpdHMgaWRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGdldEFkZHJlc3MocGFyYW1zOiBHZXRBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydhZGRyZXNzJywgJ2lkJ10pO1xuICAgIGxldCBxdWVyeTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuYWRkcmVzcykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMuaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkZHJlc3Mgb3IgaWQgb2YgYWRkcmVzcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmFkZHJlc3MpIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmFkZHJlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gcGFyYW1zLmlkO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucmVxSWQpIHtcbiAgICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihwYXJhbXMucmVxSWQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKGAvd2FsbGV0LyR7dGhpcy5fd2FsbGV0LmlkfS9hZGRyZXNzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gKSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb25lIG9yIG1vcmUgbmV3IGFkZHJlc3MoZXMpIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbiAgICpcbiAgICogSWYgdGhlIGBjb3VudGAgZmllbGQgaXMgZGVmaW5lZCBhbmQgZ3JlYXRlciB0aGFuIDEsIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlXG4gICAqIGFycmF5IHByb3BlcnR5IG5hbWVkIGBhZGRyZXNzZXNgIGNvbnRhaW5pbmcgYGNvdW50YCBhZGRyZXNzIG9iamVjdHNcbiAgICogd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIHNpbmdsZSBhZGRyZXNzIG9iamVjdCBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmNoYWluIG9uIHdoaWNoIHRoZSBuZXcgYWRkcmVzcyBzaG91bGQgYmUgY3JlYXRlZFxuICAgKiBAcGFyYW0geyhOdW1iZXJ8U3RyaW5nKX0gcGFyYW1zLmdhc1ByaWNlIGdhcyBwcmljZSBmb3IgbmV3IGFkZHJlc3MgY3JlYXRpb24sIGlmIGFwcGxpY2FibGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5sYWJlbCBsYWJlbCBmb3IgdGhlIG5ldyBhZGRyZXNzKGVzKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmxhYmVsIGxhYmVsIGZvciB0aGUgbmV3IGFkZHJlc3MoZXMpXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuY291bnQ9MSBudW1iZXIgb2YgbmV3IGFkZHJlc3NlcyB3aGljaCBzaG91bGQgYmUgY3JlYXRlZCAobWF4aW11bSAyNTApXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiBhZGRyZXNzIHRvIGNyZWF0ZSwgaWYgYXBwbGljYWJsZVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5sb3dQcmlvcml0eSBFdGhlcmV1bS1zcGVjaWZpYyBwYXJhbSB0byBjcmVhdGUgYWRkcmVzcyB1c2luZyBsb3cgcHJpb3JpdHkgZmVlIGFkZHJlc3NcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5iYXNlQWRkcmVzcyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHdhbGxldChvcHRpb25hbCBwYXJhbWV0ZXIpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmFsbG93U2tpcFZlcmlmeUFkZHJlc3MgV2hlbiBzZXQgdG8gZmFsc2UsIGl0IHRocm93cyBlcnJvciBpZiBhZGRyZXNzIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkIGZvciBhbnkgcmVhc29uLiBEZWZhdWx0IGlzIHRydWUuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLmRlcml2ZWRBZGRyZXNzXSAgRGVyaXZlZCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbcGFyYW1zLmluZGV4XSBJbmRleCBvZiB0aGUgZGVyaXZlZCBhZGRyZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyYW1zLnBhc3NwaHJhc2VdIHBhc3NwaHJhc2VcbiAgICogQWRkcmVzcyB2ZXJpZmljYXRpb24gY2FuIGJlIHNraXBwZWQgd2hlbiBmb3J3YXJkZXJWZXJzaW9uIGlzIDAgYW5kIHBlbmRpbmdDaGFpbkluaXRpYWxpemF0aW9uIGlzIHRydWUgT1JcbiAgICogaWYgJ2NvaW5TcGVjaWZpYycgaXMgbm90IHBhcnQgb2YgdGhlIHJlc3BvbnNlIGZyb20gYXBpIGNhbGwgdG8gY3JlYXRlIGFkZHJlc3NcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFkZHJlc3MocGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzUGFyYW1zOiBDcmVhdGVBZGRyZXNzT3B0aW9ucyA9IHt9O1xuICAgIGNvbnN0IHJlcUlkID0gbmV3IFJlcXVlc3RUcmFjZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGNoYWluLFxuICAgICAgZ2FzUHJpY2UsXG4gICAgICBsYWJlbCxcbiAgICAgIGxvd1ByaW9yaXR5LFxuICAgICAgZm9yd2FyZGVyVmVyc2lvbixcbiAgICAgIGZvcm1hdCxcbiAgICAgIGNvdW50ID0gMSxcbiAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcyA9IHRydWUsXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChjaGFpbikpIHtcbiAgICAgIGlmICghXy5pc0ludGVnZXIoY2hhaW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2hhaW4gaGFzIHRvIGJlIGFuIGludGVnZXInKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuY2hhaW4gPSBjaGFpbjtcbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoZ2FzUHJpY2UpKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGdhc1ByaWNlKSAmJiAoaXNOYU4oTnVtYmVyKGdhc1ByaWNlKSkgfHwgIV8uaXNTdHJpbmcoZ2FzUHJpY2UpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dhc1ByaWNlIGhhcyB0byBiZSBhbiBpbnRlZ2VyIG9yIG51bWVyaWMgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBhZGRyZXNzUGFyYW1zLmdhc1ByaWNlID0gZ2FzUHJpY2U7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGZvcndhcmRlclZlcnNpb24pKSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKGZvcndhcmRlclZlcnNpb24pIHx8IGZvcndhcmRlclZlcnNpb24gPCAwIHx8IGZvcndhcmRlclZlcnNpb24gPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZm9yd2FyZGVyVmVyc2lvbiBoYXMgdG8gYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9yd2FyZGVyVmVyc2lvbiA9IGZvcndhcmRlclZlcnNpb247XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGxhYmVsKSkge1xuICAgICAgaWYgKCFfLmlzU3RyaW5nKGxhYmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xhYmVsIGhhcyB0byBiZSBhIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChiYXNlQWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc1N0cmluZyhiYXNlQWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYXNlQWRkcmVzcyBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNVbmRlZmluZWQoYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4oYWxsb3dTa2lwVmVyaWZ5QWRkcmVzcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGxvd1NraXBWZXJpZnlBZGRyZXNzIGhhcyB0byBiZSBhIGJvb2xlYW4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIV8uaXNJbnRlZ2VyKGNvdW50KSB8fCBjb3VudCA8PSAwIHx8IGNvdW50ID4gMjUwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdW50IGhhcyB0byBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDI1MCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChsb3dQcmlvcml0eSkpIHtcbiAgICAgIGlmICghXy5pc0Jvb2xlYW4obG93UHJpb3JpdHkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbG93UHJpb3JpdHkgaGFzIHRvIGJlIGEgYm9vbGVhbicpO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1BhcmFtcy5sb3dQcmlvcml0eSA9IGxvd1ByaW9yaXR5O1xuICAgIH1cblxuICAgIGlmICghXy5pc1VuZGVmaW5lZChmb3JtYXQpKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcoZm9ybWF0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1hdCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICAgIH1cbiAgICAgIGFkZHJlc3NQYXJhbXMuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cblxuICAgIC8vIGdldCBrZXljaGFpbnMgZm9yIGFkZHJlc3MgdmVyaWZpY2F0aW9uXG4gICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fd2FsbGV0LmtleXMubWFwKChrKSA9PiB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldCh7IGlkOiBrLCByZXFJZCB9KSkpO1xuICAgIGNvbnN0IHJvb3RBZGRyZXNzID0gXy5nZXQodGhpcy5fd2FsbGV0LCAncmVjZWl2ZUFkZHJlc3MuYWRkcmVzcycpO1xuXG4gICAgY29uc3QgbmV3QWRkcmVzc2VzID0gXy50aW1lcyhjb3VudCwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5fd2FsbGV0LmlkICsgJy9hZGRyZXNzJykpXG4gICAgICAgIC5zZW5kKGFkZHJlc3NQYXJhbXMpXG4gICAgICAgIC5yZXN1bHQoKSkgYXMgYW55O1xuXG4gICAgICAvLyBpbmZlciBpdHMgYWRkcmVzcyB0eXBlXG4gICAgICBpZiAoXy5pc09iamVjdChuZXdBZGRyZXNzLmNvaW5TcGVjaWZpYykpIHtcbiAgICAgICAgbmV3QWRkcmVzcy5hZGRyZXNzVHlwZSA9IGluZmVyQWRkcmVzc1R5cGUobmV3QWRkcmVzcyk7XG4gICAgICB9XG5cbiAgICAgIG5ld0FkZHJlc3Mua2V5Y2hhaW5zID0ga2V5Y2hhaW5zO1xuICAgICAgbmV3QWRkcmVzcy5iYXNlQWRkcmVzcyA9IGJhc2VBZGRyZXNzID8/IF8uZ2V0KHRoaXMuX3dhbGxldCwgJ2NvaW5TcGVjaWZpYy5iYXNlQWRkcmVzcycpO1xuXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25EYXRhOiBWZXJpZnlBZGRyZXNzT3B0aW9ucyA9IF8ubWVyZ2Uoe30sIG5ld0FkZHJlc3MsIHsgcm9vdEFkZHJlc3MgfSk7XG5cbiAgICAgIGlmICh2ZXJpZmljYXRpb25EYXRhLmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBBZGRyZXNzR2VuZXJhdGlvbkVycm9yKHZlcmlmaWNhdGlvbkRhdGEuZXJyb3IpO1xuICAgICAgfVxuXG4gICAgICB2ZXJpZmljYXRpb25EYXRhLmltcGxpZWRGb3J3YXJkZXJWZXJzaW9uID0gZm9yd2FyZGVyVmVyc2lvbiA/PyB2ZXJpZmljYXRpb25EYXRhLmNvaW5TcGVjaWZpYz8uZm9yd2FyZGVyVmVyc2lvbjtcbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBmaXJzdCBwbGFjZSBiZWNhdXNlIGluIGNlbG8sIHdoZW4gdmVyaWZ5QWRkcmVzcyBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhZGRyZXNzZXMgd2hpY2ggd2VyZSBoYXZpbmcgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gYXMgdHJ1ZSwgaXQgdXNlZCB0byB0aHJvdyBzb21lIGVycm9yXG4gICAgICAvLyBJbiBjYXNlIG9mIGZvcndhcmRlciB2ZXJzaW9uIDEgZXRoIGFkZHJlc3NlcywgYWRkcmVzc2VzIG5lZWQgdG8gYmUgdmVyaWZpZWQgZXZlbiBpZiB0aGUgcGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gZmxhZyBpcyB0cnVlXG4gICAgICBpZiAoXG4gICAgICAgIHZlcmlmaWNhdGlvbkRhdGEuY29pblNwZWNpZmljICYmXG4gICAgICAgICghdmVyaWZpY2F0aW9uRGF0YS5jb2luU3BlY2lmaWMucGVuZGluZ0NoYWluSW5pdGlhbGl6YXRpb24gfHwgdmVyaWZpY2F0aW9uRGF0YS5pbXBsaWVkRm9yd2FyZGVyVmVyc2lvbiA9PT0gMSlcbiAgICAgICkge1xuICAgICAgICAvLyBjYW4ndCB2ZXJpZnkgYWRkcmVzc2VzIHdoaWNoIGFyZSBwZW5kaW5nIGNoYWluIGluaXRpYWxpemF0aW9uLCBhcyB0aGUgYWRkcmVzcyBpcyBoaWRkZW5cbiAgICAgICAgbGV0IGlzV2FsbGV0QWRkcmVzcyA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRoaXMuYmFzZUNvaW4uaXNXYWxsZXRBZGRyZXNzKHZlcmlmaWNhdGlvbkRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGSVhNRShCRy00MzIyNSk6IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseVxuICAgICAgICAgIGlzV2FsbGV0QWRkcmVzcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1dhbGxldEFkZHJlc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vdCBhIHdhbGxldCBhZGRyZXNzYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIWFsbG93U2tpcFZlcmlmeUFkZHJlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhZGRyZXNzIHZlcmlmaWNhdGlvbiBza2lwcGVkIGZvciBjb3VudCA9ICR7Y291bnR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdBZGRyZXNzO1xuICAgIH0pO1xuXG4gICAgaWYgKG5ld0FkZHJlc3Nlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBuZXdBZGRyZXNzZXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZHJlc3NlczogYXdhaXQgUHJvbWlzZS5hbGwobmV3QWRkcmVzc2VzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwcm9wZXJ0aWVzIG9uIGFuIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHVwZGF0ZUFkZHJlc3MocGFyYW1zOiBVcGRhdGVBZGRyZXNzT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBhZGRyZXNzID0gcGFyYW1zLmFkZHJlc3M7XG5cbiAgICBpZiAoIV8uaXNTdHJpbmcoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ2xhYmVsJ10pO1xuICAgIGNvbnN0IHVybCA9IHRoaXMudXJsKCcvYWRkcmVzcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFkZHJlc3MpKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQocHV0UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHdlYmhvb2tzIG9uIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGxpc3RXZWJob29rcyhwYXJhbXM6IFBhZ2luYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHF1ZXJ5OiBQYWdpbmF0aW9uT3B0aW9ucyA9IHt9O1xuICAgIGlmIChwYXJhbXMucHJldklkKSB7XG4gICAgICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLnByZXZJZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByZXZJZCBhcmd1bWVudCwgZXhwZWN0aW5nIHN0cmluZycpO1xuICAgICAgfVxuICAgICAgcXVlcnkucHJldklkID0gcGFyYW1zLnByZXZJZDtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICAgIH1cbiAgICAgIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSB3YWxsZXQgd2ViaG9vaywgY3VycmVudGx5IGZvciB3ZWJob29rcyBvZiB0eXBlIHRyYW5zZmVyIGFuZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB3ZWJob29rSWQgKHJlcXVpcmVkKSBpZCBvZiB0aGUgd2ViaG9vayB0byBiZSBzaW11bGF0ZWRcbiAgICogLSB0cmFuc2ZlcklkIChvcHRpb25hbCBidXQgcmVxdWlyZWQgZm9yIHRyYW5zZmVyIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHRyYW5zZmVyXG4gICAqIC0gcGVuZGluZ0FwcHJvdmFsSWQgKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgcGVuZGluZyBhcHByb3ZhbCB3ZWJob29rcykgaWQgb2YgdGhlIHNpbXVsYXRlZCBwZW5kaW5nIGFwcHJvdmFsXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgc2ltdWxhdGVXZWJob29rKHBhcmFtczogU2ltdWxhdGVXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCBoYXNUcmFuc2ZlcklkID0gISFwYXJhbXMudHJhbnNmZXJJZDtcbiAgICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuICAgIGlmICghaGFzVHJhbnNmZXJJZCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBzdXBwbHkgZWl0aGVyIHRyYW5zZmVySWQgb3IgcGVuZGluZ0FwcHJvdmFsSWQnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVHJhbnNmZXJJZCAmJiBoYXNQZW5kaW5nQXBwcm92YWxJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHJhbnNmZXJJZCBvciBwZW5kaW5nQXBwcm92YWxJZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgLy8gZGVwZW5kaW5nIG9uIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCwgdGhlIHR4SGFzaCBoYXMgdG8gYWRoZXJlIHRvIGl0cyByZXNwZWN0aXZlIGZvcm1hdFxuICAgIC8vIGJ1dCB0aGUgc2VydmVyIHRha2VzIGNhcmUgb2YgdGhhdFxuXG4gICAgLy8gb25seSB0YWtlIHRoZSB0cmFuc2ZlcklkIGFuZCBwZW5kaW5nQXBwcm92YWxJZCBwcm9wZXJ0aWVzXG4gICAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3RyYW5zZmVySWQnLCAncGVuZGluZ0FwcHJvdmFsSWQnXSk7XG5cbiAgICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSB3ZWJob29rIHRvIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGFkZFdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy93ZWJob29rcycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgd2ViaG9vayBmcm9tIHRoaXMgd2FsbGV0XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlbW92ZVdlYmhvb2socGFyYW1zOiBNb2RpZnlXZWJob29rT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdKTtcblxuICAgIHJldHVybiB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIGtleSBjaGFpbiBmb3IgdGhpcyB3YWxsZXRcbiAgICpcbiAgICogVGhlIHVzZXIga2V5IGNoYWluIGlzIHRoZSBmaXJzdCBrZXljaGFpbiBvZiB0aGUgd2FsbGV0IGFuZCB1c3VhbGx5IGhhcyB0aGUgZW5jcnlwdGVkIHBydiBzdG9yZWQgb24gQml0R28uXG4gICAqIFVzZWZ1bCB3aGVuIHRyeWluZyB0byBnZXQgdGhlIHVzZXJzJyBrZXljaGFpbiBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIGRlY3J5cHRpbmcgdG8gc2lnbiBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRFbmNyeXB0ZWRVc2VyS2V5Y2hhaW4ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBhc3luYyAoaW5kZXg6IG51bWJlcik6IFByb21pc2U8eyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9PiA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3dhbGxldC5rZXlzIHx8IGluZGV4ID49IHRoaXMuX3dhbGxldC5rZXlzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGVuY3J5cHRlZCBrZXljaGFpbnMgb24gdGhpcyB3YWxsZXQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IHsgaWQ6IHRoaXMuX3dhbGxldC5rZXlzW2luZGV4XSB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSBwcnYsIHRoZW4gdGhpcyBpcyBwcm9iYWJseSB0aGUgdXNlciBrZXljaGFpbiB3ZSdyZSBsb29raW5nIGZvclxuICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFBydikge1xuICAgICAgICByZXR1cm4ga2V5Y2hhaW4gYXMgeyBlbmNyeXB0ZWRQcnY6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRyeUtleUNoYWluKGluZGV4ICsgMSk7XG4gICAgfTtcblxuICAgIHJldHVybiB0cnlLZXlDaGFpbigwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmVuY3J5cHRlZCBwcml2YXRlIGtleSBmb3IgdGhpcyB3YWxsZXQgKGJlIGNhcmVmdWwhKVxuICAgKiBSZXF1aXJlcyB3YWxsZXQgcGFzc3BocmFzZVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBnZXRQcnYocGFyYW1zOiBHZXRQcnZPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAncHJ2J10pO1xuXG4gICAgLy8gUHJlcGFyZSBzaWduaW5nIGtleVxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmIF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgZWl0aGVyIHByb3ZpZGUgcHJ2IG9yIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5wcnYpICYmICFfLmlzU3RyaW5nKHBhcmFtcy5wcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BydiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSAmJiAhXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcnYpIHtcbiAgICAgIHJldHVybiBwYXJhbXMucHJ2O1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXljaGFpbiA9IChhd2FpdCB0aGlzLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbigpKSBhcyBhbnk7XG4gICAgY29uc3QgdXNlckVuY3J5cHRlZFBydiA9IHVzZXJLZXljaGFpbi5lbmNyeXB0ZWRQcnY7XG5cbiAgICBsZXQgdXNlclBydjtcbiAgICB0cnkge1xuICAgICAgdXNlclBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiB1c2VyRW5jcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBkZWNyeXB0aW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVzZXJQcnY7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBlbmNyeXB0ZWQgd2FsbGV0IHNoYXJlIHRvIEJpdEdvLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBjcmVhdGVTaGFyZShwYXJhbXM6IENyZWF0ZVNoYXJlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInLCAncGVybWlzc2lvbnMnXSwgW10pO1xuXG4gICAgaWYgKHBhcmFtcy5rZXljaGFpbiAmJiAhXy5pc0VtcHR5KHBhcmFtcy5rZXljaGFpbikpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wdWIgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5lbmNyeXB0ZWRQcnYgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5mcm9tUHViS2V5IHx8XG4gICAgICAgICFwYXJhbXMua2V5Y2hhaW4udG9QdWJLZXkgfHxcbiAgICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlcyBrZXljaGFpbiBwYXJhbWV0ZXJzIC0gcHViLCBlbmNyeXB0ZWRQcnYsIGZyb21QdWJLZXksIHRvUHViS2V5LCBwYXRoJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSB0aGlzIHdhbGxldCB3aXRoIGFub3RoZXIgQml0R28gdXNlci5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNoYXJlV2FsbGV0KHBhcmFtczogU2hhcmVXYWxsZXRPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ21lc3NhZ2UnXSk7XG5cbiAgICBpZiAocGFyYW1zLnJlc2hhcmUgIT09IHVuZGVmaW5lZCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLnJlc2hhcmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHJlc2hhcmUgdG8gYmUgYSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2tpcEtleWNoYWluICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5za2lwS2V5Y2hhaW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHNraXBLZXljaGFpbiB0byBiZSBhIGJvb2xlYW4uICcpO1xuICAgIH1cbiAgICBjb25zdCBuZWVkc0tleWNoYWluID0gIXBhcmFtcy5za2lwS2V5Y2hhaW4gJiYgcGFyYW1zLnBlcm1pc3Npb25zICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICAgIGlmIChwYXJhbXMuZGlzYWJsZUVtYWlsICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5kaXNhYmxlRW1haWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGRpc2FibGVFbWFpbCB0byBiZSBhIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzU3RyaW5nKHBhcmFtcy5lbWFpbCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIGVtYWlsJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hhcmluZyA9IChhd2FpdCB0aGlzLmJpdGdvLmdldFNoYXJpbmdLZXkoeyBlbWFpbDogcGFyYW1zLmVtYWlsLnRvTG93ZXJDYXNlKCkgfSkpIGFzIGFueTtcbiAgICBsZXQgc2hhcmVkS2V5Y2hhaW47XG4gICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGtleWNoYWluID0gKGF3YWl0IHRoaXMuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KSkgYXMgYW55O1xuICAgICAgICAvLyBEZWNyeXB0IHRoZSB1c2VyIGtleSB3aXRoIGEgcGFzc3BocmFzZVxuICAgICAgICBpZiAoa2V5Y2hhaW4uZW5jcnlwdGVkUHJ2KSB7XG4gICAgICAgICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGtleWNoYWluLnBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IGtleWNoYWluLmVuY3J5cHRlZFBydiB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlY2tleSA9IG1ha2VSYW5kb21LZXkoKTtcbiAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSB0aGlzLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ucHJ2IH0pO1xuICAgICAgICAgIC8vIE9ubHkgb25lIG9mIHB1Yi9jb21tb25QdWIvY29tbW9uS2V5Y2hhaW4gc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGtleWNoYWluXG4gICAgICAgICAgbGV0IHB1YiA9IGtleWNoYWluLnB1YiA/PyBrZXljaGFpbi5jb21tb25QdWI7XG4gICAgICAgICAgaWYgKGtleWNoYWluLmNvbW1vbktleWNoYWluKSB7XG4gICAgICAgICAgICBwdWIgPSBUc3NVdGlscy5nZXRQdWJsaWNLZXlGcm9tQ29tbW9uS2V5Y2hhaW4oa2V5Y2hhaW4uY29tbW9uS2V5Y2hhaW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHtcbiAgICAgICAgICAgIHB1YixcbiAgICAgICAgICAgIGVuY3J5cHRlZFBydjogbmV3RW5jcnlwdGVkUHJ2LFxuICAgICAgICAgICAgZnJvbVB1YktleTogZWNrZXkucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgIHBhdGg6IHNoYXJpbmcucGF0aCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLm1lc3NhZ2UgPT09ICdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpIHtcbiAgICAgICAgICBzaGFyZWRLZXljaGFpbiA9IHt9O1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2UgdGhpcyBsb29rcyBsaWtlIGEgY29sZCB3YWxsZXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQ3JlYXRlU2hhcmVPcHRpb25zID0ge1xuICAgICAgdXNlcjogc2hhcmluZy51c2VySWQsXG4gICAgICBwZXJtaXNzaW9uczogcGFyYW1zLnBlcm1pc3Npb25zLFxuICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgIGRpc2FibGVFbWFpbDogcGFyYW1zLmRpc2FibGVFbWFpbCxcbiAgICB9O1xuXG4gICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0gc2hhcmVkS2V5Y2hhaW47XG4gICAgfSBlbHNlIGlmIChwYXJhbXMuc2tpcEtleWNoYWluKSB7XG4gICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlU2hhcmUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVzZXIgZnJvbSB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHVzZXJJZCBJZCBvZiB0aGUgdXNlciB0byByZW1vdmVcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVVzZXIocGFyYW1zOiBSZW1vdmVVc2VyT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXJJZCddLCBbXSk7XG5cbiAgICBjb25zdCB1c2VySWQgPSBwYXJhbXMudXNlcklkO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3VzZXIvJyArIHVzZXJJZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgKHVuc2lnbmVkIHRyYW5zYWN0aW9uKSBmcm9tIEJpdEdvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIGJhc2UgdW5pdHMva0JcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhGZWVSYXRlIC0gdXBwZXIgbGltaXQgZm9yIGZlZVJhdGUgaW4gYmFzZSB1bml0cy9rQlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1pbkNvbmZpcm1zIC0gTWluaW11bSBudW1iZXIgb2YgY29uZmlybWF0aW9ucyB1bnNwZW50cyBnb2luZyBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gc2hvdWxkIGhhdmVcbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlIC0gRW5mb3JjZSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtYXRpb25zIG9uIGNoYW5nZSAoaW50ZXJuYWwpIGlucHV0cy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXQuIElmIHRoZSB3YWxsZXTigJlzIGN1cnJlbnQgdW5zcGVudCBjb3VudCBpcyBsb3dlciB0aGFuIHRoZSB0YXJnZXQsIHVwIHRvIGZvdXIgYWRkaXRpb25hbCBjaGFuZ2Ugb3V0cHV0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2YgYmFzZSB1bml0c1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heFZhbHVlIC0gSWdub3JlIHVuc3BlbnRzIGxhcmdlciB0aGFuIHRoaXMgYW1vdW50IG9mIGJhc2UgdW5pdHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5zZXF1ZW5jZUlkIC0gVGhlIHNlcXVlbmNlIElEIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxhc3RMZWRnZXJTZXF1ZW5jZSAtIEFic29sdXRlIG1heCBsZWRnZXIgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmxlZGdlclNlcXVlbmNlRGVsdGEgLSBSZWxhdGl2ZSBsZWRnZXIgaGVpZ2h0IChpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBsZWRnZXIpIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCBpbiwgd2hlcmVhZnRlciBpdCB3aWxsIGJlIHJlamVjdGVkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc1ByaWNlIC0gQ3VzdG9tIGdhcyBwcmljZSB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLmdhc0xpbWl0IC0gQ3VzdG9tIGdhcyBsaW1pdCB0byBiZSB1c2VkIGZvciBzZW5kaW5nIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub1NwbGl0Q2hhbmdlIC0gU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhdXRvbWF0aWMgY2hhbmdlIHNwbGl0dGluZyBmb3IgcHVycG9zZXMgb2YgdW5zcGVudCBtYW5hZ2VtZW50XG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhcmFtcy51bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uLiBFYWNoIHVuc3BlbnQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIHByZXZUeElkOm5PdXRwdXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ub25QYXJ0aWNpcGF0aW9uIC0gKEFsZ29yYW5kKSBOb24gcGFydGljaXBhdGluZyBrZXkgcmVnIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMudmFsaWRGcm9tQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtaW5pbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy52YWxpZFRvQmxvY2sgLSAoQWxnb3JhbmQpIFRoZSBtYXhpbXVtIHJvdW5kIHRoaXMgd2lsbCBydW4gb25cbiAgICogQHBhcmFtIHtCb29sZWFufSBwYXJhbXMuaW5zdGFudCAtIEJ1aWxkIHRoaXMgdHJhbnNhY3Rpb24gdG8gY29uZm9ybSB3aXRoIGluc3RhbnQgc2VuZGluZyBjb2luLXNwZWNpZmljIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtLnRyYW5zZmVySWQgLSB0cmFuc2ZlciBJZCB0byB1c2UgaW4gdHJhbnNhY3Rpb24gKHN1cHBvcnRlZCBieSBjYXNwZXIpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzc1R5cGUgLSBUaGUgdHlwZSBvZiBhZGRyZXNzIHRvIGNyZWF0ZSBmb3IgY2hhbmdlLiBPbmUgb2YgYHAyc2hgLCBgcDJzaFAyd3NoYCwgYW5kIGBwMndzaGAuIENhc2Utc2Vuc2l0aXZlLlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5ob3AgLSBCdWlsZCB0aGlzIGFzIGFuIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zLnJlc2VydmF0aW9uIC0gT2JqZWN0IHRvIHJlc2VydmUgdGhlIHVuc3BlbnRzIHRoYXQgdGhpcyB0eCBidWlsZCB1c2VzLiBGb3JtYXQgaXMgcmVzZXJ2YXRpb24gPSB7IGV4cGlyZVRpbWU6IElTT0RhdGVTdHJpbmcsIHBlbmRpbmdBcHByb3ZhbElkOiBTdHJpbmcgfVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgVGhlIHBhc3NwaHJhc2UgdG8gdGhlIHdhbGxldCB1c2VyIGtleSwgdG8gc2lnbiBjb21taXRtZW50IGRhdGEgZm9yIEV0aGVyZXVtIGhvcCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MgLSBUaGUgY29udHJhY3QgYWRkcmVzcyB1c2VkIGFzIHRoZSBcInRvXCIgZmllbGQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0PiB7XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uVHNzKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIGRlYnVnKCdwcmVidWlsZGluZyB0cmFuc2FjdGlvbjogJU8nLCB3aGl0ZWxpc3RlZFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG4gICAgY29uc3QgZXh0cmFQYXJhbXMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmdldEV4dHJhUHJlYnVpbGRQYXJhbXMoT2JqZWN0LmFzc2lnbihwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pKTtcbiAgICBPYmplY3QuYXNzaWduKHdoaXRlbGlzdGVkUGFyYW1zLCBleHRyYVBhcmFtcyk7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7XG4gICAgICBvZmZsaW5lVmVyaWZpY2F0aW9uOiBwYXJhbXMub2ZmbGluZVZlcmlmaWNhdGlvbiA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IGJ1aWxkUXVlcnkgPSB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy90eC9idWlsZCcpKVxuICAgICAgLnF1ZXJ5KHF1ZXJ5UGFyYW1zKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG5cbiAgICBjb25zdCBibG9ja0hlaWdodFF1ZXJ5ID0gXy5pc0Z1bmN0aW9uKCh0aGlzLmJhc2VDb2luIGFzIGFueSkuZ2V0TGF0ZXN0QmxvY2tIZWlnaHQpXG4gICAgICA/ICh0aGlzLmJhc2VDb2luIGFzIGFueSkuZ2V0TGF0ZXN0QmxvY2tIZWlnaHQocGFyYW1zLnJlcUlkKVxuICAgICAgOiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICBjb25zdCBxdWVyaWVzID0gW2J1aWxkUXVlcnksIGJsb2NrSGVpZ2h0UXVlcnldO1xuICAgIGNvbnN0IFtidWlsZFJlc3BvbnNlLCBibG9ja0hlaWdodF0gPSAoYXdhaXQgUHJvbWlzZS5hbGwocXVlcmllcykpIGFzIGFueTtcbiAgICBkZWJ1ZygncG9zdHByb2Nlc3NpbmcgdHJhbnNhY3Rpb24gcHJlYnVpbGQ6ICVPJywgYnVpbGRSZXNwb25zZSk7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKGJsb2NrSGVpZ2h0KSkge1xuICAgICAgYnVpbGRSZXNwb25zZS5ibG9ja0hlaWdodCA9IGJsb2NrSGVpZ2h0O1xuICAgIH1cbiAgICBsZXQgcHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQgPSAoYXdhaXQgdGhpcy5iYXNlQ29pbi5wb3N0UHJvY2Vzc1ByZWJ1aWxkKFxuICAgICAgT2JqZWN0LmFzc2lnbihidWlsZFJlc3BvbnNlLCB7IHdhbGxldDogdGhpcywgYnVpbGRQYXJhbXM6IHdoaXRlbGlzdGVkUGFyYW1zIH0pXG4gICAgKSkgYXMgYW55O1xuICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgZGVsZXRlIHByZWJ1aWxkLmJ1aWxkUGFyYW1zO1xuICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgaWYgKHRoaXMuX3dhbGxldCAmJiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljICYmICFwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzKSB7XG4gICAgICBwcmVidWlsZCA9IF8uZXh0ZW5kKHt9LCBwcmVidWlsZCwgeyB3YWxsZXRDb250cmFjdEFkZHJlc3M6IHRoaXMuX3dhbGxldC5jb2luU3BlY2lmaWMuYmFzZUFkZHJlc3MgfSk7XG4gICAgfVxuICAgIGRlYnVnKCdmaW5hbCB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG4gICAgcmV0dXJuIHByZWJ1aWxkIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eFByZWJ1aWxkXG4gICAqIC0gW2tleWNoYWluIC8ga2V5XSAob2JqZWN0KSBvciBwcnYgKHN0cmluZylcbiAgICogLSB3YWxsZXRQYXNzcGhyYXNlXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgeyB0eFByZWJ1aWxkIH0gPSBwYXJhbXM7XG4gICAgaWYgKCF0eFByZWJ1aWxkIHx8IHR5cGVvZiB0eFByZWJ1aWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlc2lnbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ucHJlc2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHdhbGxldERhdGE6IHRoaXMuX3dhbGxldCxcbiAgICAgIHRzc1V0aWxzOiB0aGlzLnRzc1V0aWxzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaWduVHJhbnNhY3Rpb25Uc3MoeyAuLi5wcmVzaWduLCBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSB9KTtcbiAgICB9XG5cbiAgICBsZXQgeyBwdWJzIH0gPSBwYXJhbXM7XG4gICAgaWYgKCFwdWJzICYmIHRoaXMuYmFzZUNvaW4ua2V5SWRzRm9yU2lnbmluZygpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGtleWNoYWlucyA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0S2V5c0ZvclNpZ25pbmcoeyB3YWxsZXQ6IHRoaXMgfSk7XG4gICAgICBwdWJzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ25UcmFuc2FjdGlvblBhcmFtcyA9IHtcbiAgICAgIC4uLnByZXNpZ24sXG4gICAgICB0eFByZWJ1aWxkLFxuICAgICAgcHVicyxcbiAgICAgIGNvaW46IHRoaXMuYmFzZUNvaW4sXG4gICAgfTtcblxuICAgIGlmIChfLmlzRnVuY3Rpb24ocGFyYW1zLmN1c3RvbVNpZ25pbmdGdW5jdGlvbikpIHtcbiAgICAgIHJldHVybiBwYXJhbXMuY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHNpZ25UcmFuc2FjdGlvblBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnNpZ25UcmFuc2FjdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwcnY6IHRoaXMuZ2V0VXNlclBydihwcmVzaWduIGFzIEdldFVzZXJQcnZPcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVzZXIgcHJpdmF0ZSBrZXkgZnJvbSBlaXRoZXIgYSBkZXJpdmF0aW9uIG9yIGFuIGVuY3J5cHRlZCBrZXljaGFpblxuICAgKiBAcGFyYW0gW3BhcmFtcy5rZXljaGFpbiAvIHBhcmFtcy5rZXldIChvYmplY3QpIG9yIHBhcmFtcy5wcnYgKHN0cmluZylcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIChzdHJpbmcpXG4gICAqL1xuICBnZXRVc2VyUHJ2KHBhcmFtczogR2V0VXNlclBydk9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlcktleWNoYWluID0gcGFyYW1zLmtleWNoYWluIHx8IHBhcmFtcy5rZXk7XG4gICAgbGV0IHVzZXJQcnYgPSBwYXJhbXMucHJ2O1xuICAgIGlmICh1c2VyUHJ2ICYmIHR5cGVvZiB1c2VyUHJ2ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIHVzZSB0aGUgYGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWRgIHByb3BlcnR5IGZyb20gdGhlIHVzZXIga2V5Y2hhaW4gYXMgdGhlIGBjb2xkRGVyaXZhdGlvblNlZWRgXG4gICAgLy8gaWYgbm8gb3RoZXIgYGNvbGREZXJpdmF0aW9uU2VlZGAgd2FzIGV4cGxpY2l0bHkgcHJvdmlkZWRcbiAgICBpZiAoXG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5rZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMua2V5Y2hhaW4uZGVyaXZlZEZyb21QYXJlbnRXaXRoU2VlZCAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBwYXJhbXMuY29sZERlcml2YXRpb25TZWVkID0gcGFyYW1zLmtleWNoYWluLmRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQ7XG4gICAgfVxuXG4gICAgaWYgKHVzZXJQcnYgJiYgcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCkge1xuICAgICAgLy8gdGhlIGRlcml2YXRpb24gb25seSBtYWtlcyBzZW5zZSB3aGVuIGEga2V5IGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBkZXJpdmF0aW9uID0gdGhpcy5iYXNlQ29pbi5kZXJpdmVLZXlXaXRoU2VlZCh7IGtleTogdXNlclBydiwgc2VlZDogcGFyYW1zLmNvbGREZXJpdmF0aW9uU2VlZCB9KTtcbiAgICAgIHVzZXJQcnYgPSBkZXJpdmF0aW9uLmtleTtcbiAgICB9IGVsc2UgaWYgKCF1c2VyUHJ2KSB7XG4gICAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VyRW5jcnlwdGVkUHJ2ID0gdXNlcktleWNoYWluLmVuY3J5cHRlZFBydjtcbiAgICAgIGlmICghdXNlckVuY3J5cHRlZFBydikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWluIGRvZXMgbm90IGhhdmUgcHJvcGVydHkgZW5jcnlwdGVkUHJ2Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignd2FsbGV0UGFzc3BocmFzZSBwcm9wZXJ0eSBtaXNzaW5nJyk7XG4gICAgICB9XG5cbiAgICAgIHVzZXJQcnYgPSB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogdXNlckVuY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdXNlclBydjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBmcm9tIEJpdEdvLCB2YWxpZGF0ZSBpdCwgYW5kIHRoZW4gZGVjcnlwdCB0aGUgdXNlciBrZXkgYW5kIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKHBhcmFtcy5laXAxNTU5ICYmIHBhcmFtcy5nYXNQcmljZSkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignT25seSBvbmUgb2YgcGFyYW1zLmVpcDE1NTkgYW5kIHBhcmFtcy5nYXNQcmljZSBtYXkgYmUgc3BlY2lmaWVkJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ2JvdGhfZ2FzUHJpY2VfYW5kX2VpcDE1NTlnYXNNb2RlbF9zcGVjaWZpZWQnO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5wcmVidWlsZFR4ICYmIHBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdPbmx5IG9uZSBvZiBwcmVidWlsZFR4IGFuZCByZWNpcGllbnRzIG1heSBiZSBzcGVjaWZpZWQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnYm90aF9wcmVidWlsZHR4X2FuZF9yZWNpcGllbnRzX3NwZWNpZmllZCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBhcnJheScpO1xuICAgICAgZXJyb3IuY29kZSA9ICdyZWNpcGllbnRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc0FycmF5KHRoaXMuX3Blcm1pc3Npb25zKSAmJiAhdGhpcy5fcGVybWlzc2lvbnMuaW5jbHVkZXMoJ3NwZW5kJykpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ25vIHNwZW5kIHBlcm1pc3Npb24gb24gdGhpcyB3YWxsZXQnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAndXNlcl9ub3RfYWxsb3dlZF90b19zcGVuZF9mcm9tX3dhbGxldCc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBjYWxsIHByZWJ1aWxkVHJhbnNhY3Rpb24gYW5kIGtleWNoYWlucy1nZXQgaW4gcGFyYWxsZWxcbiAgICAvLyB0aGUgcHJlYnVpbGQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuIGV4cGxpY2l0IHR4XG4gICAgY29uc3QgdHhQcmVidWlsZFF1ZXJ5ID0gcGFyYW1zLnByZWJ1aWxkVHggPyBQcm9taXNlLnJlc29sdmUocGFyYW1zLnByZWJ1aWxkVHgpIDogdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKHBhcmFtcyk7XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSBhd2FpdCB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpLmdldEtleXNGb3JTaWduaW5nKHsgd2FsbGV0OiB0aGlzLCByZXFJZDogcGFyYW1zLnJlcUlkIH0pO1xuXG4gICAgY29uc3QgdHhQcmVidWlsZCA9IChhd2FpdCB0eFByZWJ1aWxkUXVlcnkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5iYXNlQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UGFyYW1zOiB0eFByZWJ1aWxkLmJ1aWxkUGFyYW1zIHx8IHBhcmFtcyxcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgd2FsbGV0OiB0aGlzLFxuICAgICAgICB2ZXJpZmljYXRpb246IHBhcmFtcy52ZXJpZmljYXRpb24gPz8ge30sXG4gICAgICAgIHJlcUlkOiBwYXJhbXMucmVxSWQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd0cmFuc2FjdGlvbiBwcmVidWlsZCBmYWlsZWQgbG9jYWwgdmFsaWRhdGlvbjonLCBlLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ3RyYW5zYWN0aW9uIHBhcmFtczonLFxuICAgICAgICBfLm9taXQocGFyYW1zLCBbJ2tleWNoYWluJywgJ3BydicsICdwYXNzcGhyYXNlJywgJ3dhbGxldFBhc3NwaHJhc2UnLCAna2V5JywgJ3dhbGxldCddKVxuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkOicsIHR4UHJlYnVpbGQpO1xuICAgICAgY29uc29sZS50cmFjZShlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIC8vIHBhc3Mgb3VyIHRocmVlIGtleXNcbiAgICBjb25zdCBzaWduaW5nUGFyYW1zID0ge1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHhQcmVidWlsZDogdHhQcmVidWlsZCxcbiAgICAgIHdhbGxldDoge1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBtdWx0aXNpZyBhZGRyZXNzIGF0IHdhbGxldCBjcmVhdGlvbiB0aW1lXG4gICAgICAgIGFkZHJlc3NWZXJzaW9uOiB0aGlzLl93YWxsZXQuY29pblNwZWNpZmljLmFkZHJlc3NWZXJzaW9uLFxuICAgICAgfSxcbiAgICAgIGtleWNoYWluOiBrZXljaGFpbnNbMF0sXG4gICAgICBiYWNrdXBLZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDEgPyBrZXljaGFpbnNbMV0gOiBudWxsLFxuICAgICAgYml0Z29LZXljaGFpbjoga2V5Y2hhaW5zLmxlbmd0aCA+IDIgPyBrZXljaGFpbnNbMl0gOiBudWxsLFxuICAgICAgcHViczoga2V5Y2hhaW5zLm1hcCgoaykgPT4gay5wdWIpLFxuICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbihzaWduaW5nUGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2luc3VmZmljaWVudCBmdW5kcycpKSB7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnaW5zdWZmaWNpZW50X2Z1bmRzJztcbiAgICAgICAgZXJyb3Iud2FsbGV0QmFsYW5jZXMgPSB7XG4gICAgICAgICAgYmFsYW5jZVN0cmluZzogdGhpcy5iYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZVN0cmluZzogdGhpcy5jb25maXJtZWRCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZVN0cmluZzogdGhpcy5zcGVuZGFibGVCYWxhbmNlU3RyaW5nKCksXG4gICAgICAgICAgYmFsYW5jZTogdGhpcy5iYWxhbmNlKCksXG4gICAgICAgICAgY29uZmlybWVkQmFsYW5jZTogdGhpcy5jb25maXJtZWRCYWxhbmNlKCksXG4gICAgICAgICAgc3BlbmRhYmxlQmFsYW5jZTogdGhpcy5zcGVuZGFibGVCYWxhbmNlKCksXG4gICAgICAgIH07XG4gICAgICAgIGVycm9yLnR4UGFyYW1zID0gXy5vbWl0KHBhcmFtcywgWydrZXljaGFpbicsICdwcnYnLCAncGFzc3BocmFzZScsICd3YWxsZXRQYXNzcGhyYXNlJywgJ2tleSddKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlbGVyYXRlIGEgdHJhbnNhY3Rpb24ncyBjb25maXJtYXRpb24gdXNpbmcgQ2hpbGQtUGF5cy1Gb3ItUGFyZW50IChDUEZQKVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBhY2NlbGVyYXRlVHJhbnNhY3Rpb24ocGFyYW1zOiBBY2NlbGVyYXRlVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIFRPRE8oQkctOTM0OSk6IGNoYW5nZSB0aGUgbGFzdCBjaGVjayB0byA+IDAgYW5kIHRoZSBlcnJvciBtZXNzYWdlIG9uY2UgcGxhdGZvcm0gYWxsb3dzIG11bHRpcGxlIHRyYW5zYWN0aW9ucyB0b1xuICAgIC8vICAgICAgICAgICAgICAgIGJlIGJ1bXBlZCBpbiB0aGUgc2FtZSBDUEZQIHRyYW5zYWN0aW9uXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmNwZnBUeElkcykgfHwgIUFycmF5LmlzQXJyYXkocGFyYW1zLmNwZnBUeElkcykgfHwgcGFyYW1zLmNwZnBUeElkcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBjcGZwVHhJZHMgdG8gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDEnKTtcbiAgICAgIGVycm9yLmNvZGUgPSAnY3BmcHR4aWRzX25vdF9hcnJheSc7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuY3BmcEZlZVJhdGUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vQ3BmcEZlZVJhdGUgIT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcignY3BmcEZlZVJhdGUgbXVzdCBiZSBzZXQgdW5sZXNzIG5vQ3BmcEZlZVJhdGUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnY3BmcGZlZXJhdGVfbm90X3NldCc7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5jcGZwRmVlUmF0ZSkgfHwgcGFyYW1zLmNwZnBGZWVSYXRlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdjcGZwRmVlUmF0ZSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXInKTtcbiAgICAgICAgZXJyb3IuY29kZSA9ICdjcGZwZmVlcmF0ZV9ub3Rfbm9ubmVnYXRpdmVfaW50ZWdlcic7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICBpZiAocGFyYW1zLm5vTWF4RmVlICE9PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ21heEZlZSBtdXN0IGJlIHNldCB1bmxlc3Mgbm9NYXhGZWUgaXMgc2V0Jyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9zZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWF4RmVlKSB8fCBwYXJhbXMubWF4RmVlIDwgMCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdtYXhGZWUgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgIGVycm9yLmNvZGUgPSAnbWF4ZmVlX25vdF9ub25uZWdhdGl2ZV9pbnRlZ2VyJztcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMucmVjaXBpZW50cykgfHwgcGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBmb3IgJ3JlY2lwaWVudHMnOiBtdXN0IGJlIGVtcHR5IGFycmF5IHdoZW4gc2V0YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyYW1zLnJlY2lwaWVudHMgPSBbXTtcblxuICAgIC8vIFdlIG11c3QgcGFzcyB0aGUgYnVpbGQgcGFyYW1zIHRocm91Z2ggdG8gc3VibWl0IGluIGNhc2UgdGhlIENQRlAgdHggZXZlciBoYXMgdG8gYmUgcmVidWlsdC5cbiAgICBjb25zdCBzdWJtaXRQYXJhbXMgPSBPYmplY3QuYXNzaWduKHBhcmFtcywgYXdhaXQgdGhpcy5wcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbihwYXJhbXMpKTtcbiAgICBkZWxldGUgKHN1Ym1pdFBhcmFtcyBhcyBhbnkpLndhbGxldDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzdWJtaXRQYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eEhleDogdHJhbnNhY3Rpb24gaGV4IHRvIHN1Ym1pdFxuICAgKiAtIGhhbGZTaWduZWQ6IG9iamVjdCBjb250YWluaW5nIHRyYW5zYWN0aW9uICh0eEhleCBvciB0eEJhc2U2NCkgdG8gc3VibWl0XG4gICAqL1xuICBhc3luYyBzdWJtaXRUcmFuc2FjdGlvbihwYXJhbXM6IFN1Ym1pdFRyYW5zYWN0aW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWydvdHAnLCAndHhIZXgnLCAndHhSZXF1ZXN0SWQnXSk7XG4gICAgY29uc3QgaGFzVHhIZXggPSAhIXBhcmFtcy50eEhleDtcbiAgICBjb25zdCBoYXNIYWxmU2lnbmVkID0gISFwYXJhbXMuaGFsZlNpZ25lZDtcblxuICAgIGlmIChwYXJhbXMudHhSZXF1ZXN0SWQgJiYgKGhhc1R4SGV4IHx8IGhhc0hhbGZTaWduZWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3Qgc3VwcGx5IGV4YWN0bHkgb25lIG9mIHR4UmVxdWVzdElkLCB0eEhleCwgb3IgaGFsZlNpZ25lZCcpO1xuICAgIH0gZWxzZSBpZiAoIXBhcmFtcy50eFJlcXVlc3RJZCAmJiAoKGhhc1R4SGV4ICYmIGhhc0hhbGZTaWduZWQpIHx8ICghaGFzVHhIZXggJiYgIWhhc0hhbGZTaWduZWQpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIZXggb3IgaGFsZlNpZ25lZCwgYnV0IG5vdCBib3RoJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGNvaW5zIHRvIGEgcmVjaXBpZW50XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIC0gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAgICogQHBhcmFtIHBhcmFtcy5hbW91bnQgLSB0aGUgYW1vdW50IGluIHNhdG9zaGlzL3dlaS9iYXNlIHZhbHVlIHRvIGJlIHNlbnRcbiAgICogQHBhcmFtIHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5kYXRhIC0gW0V0aGVyZXVtIFNwZWNpZmljXSBvcHRpb25hbCBkYXRhIHRvIHBhc3MgdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5jdXN0b2RpYW5UcmFuc2FjdGlvbklkIC0gW0V0aGVyZXVtL01NSSBTcGVjaWZpY10gaWQgb2YgdHJhbnNhY3Rpb24gY3JlYXRlZCB2aWEgbWV0YW1hc2tcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuICAgKiBAcGFyYW0gcGFyYW1zLnBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSwgaWYgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4gICAqIEBwYXJhbSBwYXJhbXMubWluQ29uZmlybXMgLSB0aGUgbWluaW11bSBjb25maXJtYXRpb24gdGhyZXNob2xkIGZvciBpbnB1dHNcbiAgICogQHBhcmFtIHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgLSB3aGV0aGVyIHRvIGVuZm9yY2UgbWluQ29uZmlybXMgZm9yIGNoYW5nZSBpbnB1dHNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZW5kKHBhcmFtczogU2VuZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFsnbWVzc2FnZScsICdkYXRhJ10pO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgYW1vdW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2luID0gdGhpcy5iYXNlQ29pbjtcblxuICAgIGNvbnN0IGFtb3VudCA9IG5ldyBCaWdOdW1iZXIocGFyYW1zLmFtb3VudCk7XG4gICAgaWYgKGFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGFtb3VudC5pc1plcm8oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBhbW91bnQgLSBwb3NpdGl2ZSBudW1iZXIgZ3JlYXRlciB0aGFuIHplcm8gb3IgbnVtZXJpYyBzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgcmVjaXBpZW50czogU2VuZE1hbnlPcHRpb25zWydyZWNpcGllbnRzJ10gPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgICB9LFxuICAgIF07XG4gICAgaWYgKHBhcmFtcy50b2tlbk5hbWUpIHtcbiAgICAgIHJlY2lwaWVudHNbMF0udG9rZW5OYW1lID0gcGFyYW1zLnRva2VuTmFtZTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5kYXRhICYmIGNvaW4udHJhbnNhY3Rpb25EYXRhQWxsb3dlZCgpKSB7XG4gICAgICByZWNpcGllbnRzWzBdLmRhdGEgPSBwYXJhbXMuZGF0YTtcbiAgICB9XG4gICAgY29uc3Qgc2VuZE1hbnlPcHRpb25zOiBTZW5kTWFueU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMsIHsgcmVjaXBpZW50cyB9KTtcbiAgICByZXR1cm4gdGhpcy5zZW5kTWFueShzZW5kTWFueU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgbW9uZXkgdG8gbXVsdGlwbGUgcmVjaXBpZW50c1xuICAgKiAxLiBHZXRzIHRoZSB1c2VyIGtleWNoYWluIGJ5IGNoZWNraW5nIHRoZSB3YWxsZXQgZm9yIGEga2V5IHdoaWNoIGhhcyBhbiBlbmNyeXB0ZWQgcHJ2XG4gICAqIDIuIERlY3J5cHRzIHVzZXIga2V5XG4gICAqIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbiAgICogNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbiAgICogNS4gU2VuZHMgdGhlIHRyYW5zYWN0aW9uIHRvIEJpdEdvXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAgICogQHBhcmFtIHt7YWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZ319IHBhcmFtcy5yZWNpcGllbnRzIC0gbGlzdCBvZiByZWNpcGllbnRzIGFuZCBuZWNlc3NhcnkgcmVjaXBpZW50IGluZm9ybWF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubnVtQmxvY2tzIC0gRXN0aW1hdGVzIHRoZSBhcHByb3hpbWF0ZSBmZWUgcGVyIGtpbG9ieXRlIG5lY2Vzc2FyeSBmb3IgYSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gd2l0aGluIG51bUJsb2NrcyBibG9ja3NcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5mZWVSYXRlIC0gdGhlIGRlc2lyZWQgZmVlUmF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGluIHNhdG90aGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWF4RmVlUmF0ZSAtIHVwcGVyIGxpbWl0IGZvciBmZWVSYXRlIGluIHNhdG9zaGlzL2tCXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubWluQ29uZmlybXMgLSBhbGwgc2VsZWN0ZWQgdW5zcGVudHMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoaXMgbWFueSBjb25maXJtYXRpb25zXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAtIEVuZm9yY2VzIG1pbkNvbmZpcm1zIG9uIGNoYW5nZSBpbnB1dHNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyAtIFRoZSBkZXNpcmVkIGNvdW50IG9mIHVuc3BlbnRzIGluIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5tZXNzYWdlIC0gb3B0aW9uYWwgbWVzc2FnZSB0byBhdHRhY2ggdG8gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5taW5WYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBzbWFsbGVyIHRoYW4gdGhpcyBhbW91bnQgb2Ygc2F0b3NoaXNcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhcmFtcy5tYXhWYWx1ZSAtIElnbm9yZSB1bnNwZW50cyBsYXJnZXIgdGhhbiB0aGlzIGFtb3VudCBvZiBzYXRvc2hpc1xuICAgKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLnNlcXVlbmNlSWQgLSBUaGUgc2VxdWVuY2UgSUQgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGFzdExlZGdlclNlcXVlbmNlIC0gQWJzb2x1dGUgbWF4IGxlZGdlciB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMubGVkZ2VyU2VxdWVuY2VEZWx0YSAtIFJlbGF0aXZlIGxlZGdlciBoZWlnaHQgKGluIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IGxlZGdlcikgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGFjY2VwdGVkIGluLCB3aGVyZWFmdGVyIGl0IHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZ2FzUHJpY2UgLSBDdXN0b20gZ2FzIHByaWNlIHRvIGJlIHVzZWQgZm9yIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gcGFyYW1zLm5vU3BsaXRDaGFuZ2UgLSBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbiAgICogQHBhcmFtIHtBcnJheX0gcGFyYW1zLnVuc3BlbnRzIC0gVGhlIHVuc3BlbnRzIHRvIHVzZSBpbiB0aGUgdHJhbnNhY3Rpb24uIEVhY2ggdW5zcGVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gcHJldlR4SWQ6bk91dHB1dFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmNvbW1lbnQgLSBBbnkgYWRkaXRpb25hbCBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5vdHAgLSBUd28gZmFjdG9yIGF1dGggY29kZSB0byBlbmFibGUgc2VuZGluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5jaGFuZ2VBZGRyZXNzIC0gU3BlY2lmaWVzIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgY2hhbmdlIG91dHB1dFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHBhcmFtcy5pbnN0YW50IC0gU2VuZCB0aGlzIHRyYW5zYWN0aW9uIHVzaW5nIGNvaW4tc3BlY2lmaWMgaW5zdGFudCBzZW5kaW5nIG1ldGhvZCAoaWYgYXZhaWxhYmxlKVxuICAgKiBAcGFyYW0ge3t2YWx1ZTogU3RyaW5nLCB0eXBlOiBTdHJpbmd9fSBwYXJhbXMubWVtbyAtIE1lbW8gdG8gdXNlIGluIHRyYW5zYWN0aW9uIChzdXBwb3J0ZWQgYnkgU3RlbGxhcilcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eXBlIC0gVHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24gKGUuZy4gdHJ1c3RsaW5lKVxuICAgKiBAcGFyYW0ge3t0b2tlbjogcGFyYW1zLCBhY3Rpb246IFN0cmluZywgbGltaXQ6IFN0cmluZ31bXX0gb3B0aW9ucy50cnVzdGxpbmVzIC0gQXJyYXkgb2YgdHJ1c3RsaW5lcyB0byBtYW5hZ2UgKHN1cHBvcnRlZCBieSBTdGVsbGFyKVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHNlbmRNYW55KHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ2NvbW1lbnQnLCAnb3RwJ10pO1xuICAgIGRlYnVnKCdzZW5kTWFueSBjYWxsZWQnKTtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHBhcmFtcy5yZXFJZCA9IHJlcUlkO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgY29pbiA9IHRoaXMuYmFzZUNvaW47XG4gICAgaWYgKF8uaXNPYmplY3QocGFyYW1zLnJlY2lwaWVudHMpKSB7XG4gICAgICBwYXJhbXMucmVjaXBpZW50cy5tYXAoZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgICAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHJlY2lwaWVudC5hbW91bnQpO1xuICAgICAgICBpZiAoYW1vdW50LmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb2luLnZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpICYmIGFtb3VudC5pc1plcm8oKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gcG9zaXRpdmUgbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvIG9yIG51bWVyaWMgc3RyaW5nIGV4cGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYWxmU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgY29uc3Qgc2VsZWN0UGFyYW1zID0gXy5waWNrKHBhcmFtcywgW1xuICAgICAgJ3JlY2lwaWVudHMnLFxuICAgICAgJ251bUJsb2NrcycsXG4gICAgICAnZmVlUmF0ZScsXG4gICAgICAnbWF4RmVlUmF0ZScsXG4gICAgICAnbWluQ29uZmlybXMnLFxuICAgICAgJ2VuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZScsXG4gICAgICAndGFyZ2V0V2FsbGV0VW5zcGVudHMnLFxuICAgICAgJ21lc3NhZ2UnLFxuICAgICAgJ21pblZhbHVlJyxcbiAgICAgICdtYXhWYWx1ZScsXG4gICAgICAnc2VxdWVuY2VJZCcsXG4gICAgICAnbGFzdExlZGdlclNlcXVlbmNlJyxcbiAgICAgICdsZWRnZXJTZXF1ZW5jZURlbHRhJyxcbiAgICAgICdnYXNQcmljZScsXG4gICAgICAnbm9TcGxpdENoYW5nZScsXG4gICAgICAndW5zcGVudHMnLFxuICAgICAgJ2NvbW1lbnQnLFxuICAgICAgJ290cCcsXG4gICAgICAnY2hhbmdlQWRkcmVzcycsXG4gICAgICAnaW5zdGFudCcsXG4gICAgICAnbWVtbycsXG4gICAgICAndHlwZScsXG4gICAgICAndHJ1c3RsaW5lcycsXG4gICAgICAndHJhbnNmZXJJZCcsXG4gICAgICAnc3Rha2luZ09wdGlvbnMnLFxuICAgIF0pO1xuICAgIGNvbnN0IGZpbmFsVHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgaGFsZlNpZ25lZFRyYW5zYWN0aW9uLCBzZWxlY3RQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3R4L3NlbmQnKSkuc2VuZChmaW5hbFR4UGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIGFuIHVuc3VwcG9ydGVkIHRva2VuIGZyb20gYSBCaXRHbyBtdWx0aXNpZyB3YWxsZXRcbiAgICogcGFyYW1zIGFyZSB2YWxpZGF0ZWQgaW4gRXRoLnByb3RvdHlwZS5yZWNvdmVyVG9rZW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSB1bnN1cHBvcnRlZCB0b2tlblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY2lwaWVudCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyByZWNvdmVyZWQgdG9rZW5zIHNob3VsZCBiZSBzZW50IHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy5wcnYgdGhlIHhwcnZcbiAgICovXG4gIGFzeW5jIHJlY292ZXJUb2tlbihwYXJhbXM6IFJlY292ZXJUb2tlbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdldGgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuIHJlY292ZXJ5IG9ubHkgc3VwcG9ydGVkIGZvciBldGggd2FsbGV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQodG9rZW5Db250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciB0b2tlbkNvbnRyYWN0QWRkcmVzcycpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHJlY2lwaWVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBzdHJpbmcgcGFyYW1ldGVyIHJlY2lwaWVudCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJUb2tlbk9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHsgdG9rZW5Db250cmFjdEFkZHJlc3MsIHJlY2lwaWVudCB9LCBwYXJhbXMsIHsgd2FsbGV0OiB0aGlzIH0pO1xuICAgIHJldHVybiB0aGlzLmJhc2VDb2luLnJlY292ZXJUb2tlbihyZWNvdmVyVG9rZW5PcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gbWV0YWRhdGEgZm9yIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nIG9yIGF0dGVtcHRlZFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCB3aXRoIHR4aWQsIHdhbGxldElkLCB0eCwgYW5kIGZlZSAoaWYgc3VwcG9ydGVkIGZvciBjb2luKVxuICAgKi9cbiAgYXN5bmMgZ2V0Rmlyc3RQZW5kaW5nVHJhbnNhY3Rpb24ocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGludGVybmFsLmdldEZpcnN0UGVuZGluZ1RyYW5zYWN0aW9uKHsgd2FsbGV0SWQ6IHRoaXMuaWQoKSB9LCB0aGlzLmJhc2VDb2luLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGZlZSBvbiB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB0eGlkIHRvIHRoZSBnaXZlbiBuZXcgZmVlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eGlkIFRoZSB0cmFuc2FjdGlvbiBJZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFuc2FjdGlvbiB3aG9zZSBmZWUgaXMgdG8gYmUgY2hhbmdlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmFtcy5mZWVdIE9wdGlvbmFsIC0gVGhlIG5ldyBmZWUgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMuZWlwMTU1OV0gT3B0aW9uYWwgLSB0aGUgZWlwMTU1OSB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlIGRlbm90ZWQgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1N0cmluZ30gVGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZSBuZXcgdHJhbnNhY3Rpb24gdGhhdCBjb250YWlucyB0aGUgbmV3IGZlZSByYXRlXG4gICAqL1xuICBhc3luYyBjaGFuZ2VGZWUocGFyYW1zOiBDaGFuZ2VGZWVPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMuZmVlKSBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnLCAnZmVlJ10sIFtdKTtcbiAgICBpZiAocGFyYW1zLmVpcDE1NTkpIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMuZWlwMTU1OSwgWydtYXhGZWVQZXJHYXMnLCAnbWF4UHJpb3JpdHlGZWVQZXJHYXMnXSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2NoYW5nZUZlZScpKVxuICAgICAgLnNlbmQocGFyYW1zKVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm8gZnJvbSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBUaGUgcGFyYW1zIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnVybCBUaGUgVXJsIHRvIHJldHJpZXZlIGluZm8gZnJvbVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXJcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIGdldFBheW1lbnRJbmZvKHBhcmFtczogeyB1cmw/OiBzdHJpbmcgfSA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnXSwgW10pO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcGF5bWVudEluZm8nKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGpzb24gcGF5bWVudCByZXNwb25zZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbXMgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMucGF5bWVudFVybCAtIFRoZSB1cmwgdG8gc2VuZCB0aGUgZnVsbHkgc2lnbmVkIHRyYW5zYWN0aW9uIHRvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IG9mIHRoZSBwYXltZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMubWVtbyB7U3RyaW5nfSAtIEEgbWVtbyBzdXBwbGllZCBieSB0aGUgbWVyY2hhbnQsIHRvIGJlIGluc2VydGVkIGludG8gdGhlIHRyYW5zZmVyIGFzIHRoZSBjb21tZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuZXhwaXJlcyB7U3RyaW5nfSAtIElTTyBEYXRlIGZvcm1hdCBvZiB3aGVuIHRoZSBwYXltZW50IHJlcXVlc3QgZXhwaXJlc1xuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgaW5mbyByZXR1cm5lZCBmcm9tIHRoZSBtZXJjaGFudCBzZXJ2ZXIgUGF5bWVudCBBY2tcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGFzeW5jIHNlbmRQYXltZW50UmVzcG9uc2UocGFyYW1zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NlbmRQYXltZW50JykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwb2xpY3kgcnVsZVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMuY29uZGl0aW9uIGNvbmRpdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHBhcmFtcy5hY3Rpb24gYWN0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVBvbGljeVJ1bGUocGFyYW1zOiBDcmVhdGVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGEgcG9saWN5IHJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvbmRpdGlvbiBjb25kaXRpb24gb2JqZWN0XG4gICAqIEBwYXJhbSBwYXJhbXMuYWN0aW9uIGFjdGlvbiBvYmplY3RcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyBzZXRQb2xpY3lSdWxlKHBhcmFtczogYW55ID0ge30pIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJywgJ3R5cGUnXSwgWydtZXNzYWdlJ10pO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcGFyYW1ldGVyOiBjb25kaXRpb25zIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogYWN0aW9uIG9iamVjdCcpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLnB1dCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgUG9saWN5IFJ1bGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZVBvbGljeVJ1bGUocGFyYW1zOiBSZW1vdmVQb2xpY3lSdWxlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFsnbWVzc2FnZSddKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmJpdGdvLmRlbCh0aGlzLnVybCgnL3BvbGljeS9ydWxlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyB3YWxsZXRcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlbW92ZShwYXJhbXM6IFJlY29yZDxzdHJpbmcsIG5ldmVyPiA9IHt9KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5kZWwodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhIEpTT04gcmVwcmVzZW50YWJsZSB2ZXJzaW9uIG9mIHRoaXMgd2FsbGV0XG4gICAqL1xuICB0b0pTT04oKTogV2FsbGV0RGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhbGxldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0cmFkaW5nIGFjY291bnQgZnJvbSB0aGlzIHdhbGxldFxuICAgKi9cbiAgdG9UcmFkaW5nQWNjb3VudCgpOiBUcmFkaW5nQWNjb3VudCB7XG4gICAgaWYgKHRoaXMuYmFzZUNvaW4uZ2V0RmFtaWx5KCkgIT09ICdvZmMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhbiBvbmx5IGNvbnZlcnQgYW4gT2ZmY2hhaW4gKE9GQykgd2FsbGV0IHRvIGEgdHJhZGluZyBhY2NvdW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhZGluZ0FjY291bnQodGhpcy5fd2FsbGV0LmVudGVycHJpc2UsIHRoaXMsIHRoaXMuYml0Z28pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YWtpbmcgd2FsbGV0IGZyb20gdGhpcyB3YWxsZXRcbiAgICovXG4gIHRvU3Rha2luZ1dhbGxldCgpOiBTdGFraW5nV2FsbGV0IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uc3VwcG9ydHNTdGFraW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3Rha2luZyBub3Qgc3VwcG9ydGVkIGZvciAke3RoaXMuY29pbigpfWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFN0YWtpbmdXYWxsZXQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgZG93bmxvYWRzIFBERiBrZXljYXJkIGZvciB3YWxsZXQgKHJlcXVpcmVzIHJlc3BvbnNlIGZyb20gd2FsbGV0cy5nZW5lcmF0ZVdhbGxldClcbiAgICpcbiAgICogTm90ZTogdGhpcyBpcyBleGFtcGxlIGNvZGUgYW5kIGlzIG5vdCB0aGUgdmVyc2lvbiB1c2VkIG9uIGJpdGdvLmNvbVxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqICAgKiBqc1BERiAtIGFuIGluc3RhbmNlIG9mIHRoZSBqc1BERiBsaWJyYXJ5XG4gICAqICAgKiBRUkNvZGUgLSBhbiBpbnN0YW5jZSBvZiB0aGUgUVJpb3VzIGxpYnJhcnlcbiAgICogICAqIHVzZXJLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSB1c2VyIGtleWNoYWluXG4gICAqICAgKiBiYWNrdXBLZXljaGFpbiAtIGEgd2FsbGV0J3MgcHJpdmF0ZSBiYWNrdXAga2V5Y2hhaW5cbiAgICogICAqIGJpdGdvS2V5Y2hhaW4gLSBhIHdhbGxldCdzIHByaXZhdGUgYml0Z28ga2V5Y2hhaW5cbiAgICogICAqIHBhc3NwaHJhc2UgLSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogICAqIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUgLSB0aGUgZW5jcnlwdGlvbiBzZWNyZXQgdXNlZCBmb3IgQm94IERcbiAgICogICAqIGFjdGl2YXRpb25Db2RlIC0gYSByYW5kb21seSBnZW5lcmF0ZWQgc2l4LWRpZ2l0IGFjdGl2YXRpb24gY29kZVxuICAgKiAgICogd2FsbGV0S2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBzaWduaW5nIGtleVxuICAgKiAgICogYmFja3VwS2V5SUQgLSB0aGUgS2V5IElEIHVzZWQgZm9yIGRlcml2aW5nIGEgY29sZCB3YWxsZXQncyBiYWNrdXAga2V5XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZG93bmxvYWRLZXljYXJkKHBhcmFtczogRG93bmxvYWRLZXljYXJkT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cgfHwgIXdpbmRvdy5sb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZG93bmxvYWRLZXljYXJkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGFibGUgd2l0aGluIGEgYnJvd3Nlci4nKTtcbiAgICB9XG5cbiAgICAvLyBHcmFiIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IGZvciBhY3RpdmF0aW9uQ29kZVxuICAgIGNvbnN0IHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICB3YWxsZXRLZXlJRCxcbiAgICAgIGJhY2t1cEtleUlELFxuICAgICAgYWN0aXZhdGlvbkNvZGUgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA5MDAwMDAgKyAxMDAwMDApLnRvU3RyaW5nKCksXG4gICAgfSA9IHBhcmFtcztcblxuICAgIGlmICghanNQREYgfHwgdHlwZW9mIGpzUERGICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwYXNzIGluIGEgdmFsaWQganNQREYgaW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBrZXljaGFpbnNcbiAgICBpZiAoIXVzZXJLZXljaGFpbiB8fCB0eXBlb2YgdXNlcktleWNoYWluICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBXYWxsZXQga2V5Y2hhaW4gbXVzdCBoYXZlIGEgJ3VzZXInIHByb3BlcnR5YCk7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrdXBLZXljaGFpbiB8fCB0eXBlb2YgYmFja3VwS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhY2t1cCBrZXljaGFpbiBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAoIWJpdGdvS2V5Y2hhaW4gfHwgdHlwZW9mIGJpdGdvS2V5Y2hhaW4gIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdGdvIGtleWNoYWluIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cblxuICAgIGlmICh3YWxsZXRLZXlJRCAmJiB0eXBlb2Ygd2FsbGV0S2V5SUQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldEtleUlEIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYmFja3VwS2V5SUQgJiYgdHlwZW9mIGJhY2t1cEtleUlEICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWNrdXBLZXlJRCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYWN0aXZhdGlvbiBjb2RlIGlmIHByb3ZpZGVkXG4gICAgaWYgKHR5cGVvZiBhY3RpdmF0aW9uQ29kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aXZhdGlvbiBDb2RlIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZhdGlvbkNvZGUubGVuZ3RoICE9PSA2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGl2YXRpb24gY29kZSBtdXN0IGJlIHNpeCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pblNob3J0TmFtZSA9IHRoaXMuYmFzZUNvaW4udHlwZTtcbiAgICBjb25zdCBjb2luTmFtZSA9IHRoaXMuYmFzZUNvaW4uZ2V0RnVsbE5hbWUoKTtcbiAgICBjb25zdCB3YWxsZXRMYWJlbCA9IHRoaXMuX3dhbGxldC5sYWJlbDtcblxuICAgIGNvbnN0IGRvYyA9IGRyYXdLZXljYXJkKHtcbiAgICAgIGpzUERGLFxuICAgICAgUVJDb2RlLFxuICAgICAgZW5jcnlwdDogdGhpcy5iaXRnby5lbmNyeXB0LFxuICAgICAgY29pblNob3J0TmFtZSxcbiAgICAgIGNvaW5OYW1lLFxuICAgICAgYWN0aXZhdGlvbkNvZGUsXG4gICAgICB3YWxsZXRMYWJlbCxcbiAgICAgIHBhc3NwaHJhc2UsXG4gICAgICBwYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdXNlcktleWNoYWluLFxuICAgICAgYmFja3VwS2V5Y2hhaW4sXG4gICAgICBiaXRnb0tleWNoYWluLFxuICAgICAgd2FsbGV0S2V5SUQsXG4gICAgICBiYWNrdXBLZXlJRCxcbiAgICB9KTtcblxuICAgIC8vIFNhdmUgdGhlIFBERiBvbiB0aGUgdXNlcidzIGJyb3dzZXJcbiAgICBkb2Muc2F2ZShgQml0R28gS2V5Y2FyZCBmb3IgJHt3YWxsZXRMYWJlbH0ucGRmYCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIGJ1aWxkQWNjb3VudENvbnNvbGlkYXRpb25zKFxuICAgIHBhcmFtczogQnVpbGRDb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25PcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10+IHtcbiAgICBpZiAoIXRoaXMuYmFzZUNvaW4uYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmJhc2VDb2luLmdldEZ1bGxOYW1lKCl9IGRvZXMgbm90IGFsbG93IGFjY291bnQgY29uc29saWRhdGlvbnMuYCk7XG4gICAgfVxuXG4gICAgLy8gV2hpdGVsaXN0IHBhcmFtcyB0byBidWlsZCB0eFxuICAgIGNvbnN0IHdoaXRlbGlzdGVkUGFyYW1zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZENvbnNvbGlkYXRlQWNjb3VudFBhcmFtcygpKTtcbiAgICBkZWJ1ZygncHJlYnVpbGRpbmcgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbjogJU8nLCB3aGl0ZWxpc3RlZFBhcmFtcyk7XG5cbiAgICBpZiAocGFyYW1zLnJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIGNvdWxkIHJldHVybiAxMDAgYnVpbGQgdHJhbnNhY3Rpb25zXG4gICAgY29uc3QgYnVpbGRSZXNwb25zZSA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy5pZCgpICsgJy9jb25zb2xpZGF0ZUFjY291bnQvYnVpbGQnKSlcbiAgICAgIC5zZW5kKHdoaXRlbGlzdGVkUGFyYW1zKVxuICAgICAgLnJlc3VsdCgpKSBhcyBhbnk7XG5cbiAgICAvLyB3ZSBuZWVkIHRvIHN0ZXAgb3ZlciBlYWNoIHByZWJ1aWxkIG5vdyAtIHNob3VsZCBiZSBpbiBhbiBhcnJheSBpbiB0aGUgYm9keVxuICAgIGNvbnN0IGNvbnNvbGlkYXRpb25zOiBQcmVidWlsZFRyYW5zYWN0aW9uUmVzdWx0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNvbnNvbGlkYXRlQWNjb3VudEJ1aWxkIG9mIGJ1aWxkUmVzcG9uc2UpIHtcbiAgICAgIGxldCBwcmVidWlsZDogUHJlYnVpbGRUcmFuc2FjdGlvblJlc3VsdCA9IChhd2FpdCB0aGlzLmJhc2VDb2luLnBvc3RQcm9jZXNzUHJlYnVpbGQoXG4gICAgICAgIE9iamVjdC5hc3NpZ24oY29uc29saWRhdGVBY2NvdW50QnVpbGQsIHsgd2FsbGV0OiB0aGlzLCBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMgfSlcbiAgICAgICkpIGFzIFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGRlbGV0ZSBwcmVidWlsZC53YWxsZXQ7XG4gICAgICBkZWxldGUgcHJlYnVpbGQuYnVpbGRQYXJhbXM7XG5cbiAgICAgIHByZWJ1aWxkID0gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHdhbGxldElkOiB0aGlzLmlkKCkgfSk7XG4gICAgICBkZWJ1ZygnZmluYWwgY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbiBwcmVidWlsZDogJU8nLCBwcmVidWlsZCk7XG5cbiAgICAgIGNvbnNvbGlkYXRpb25zLnB1c2gocHJlYnVpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zb2xpZGF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIHNlbmRzIGEgc2V0IG9mIGNvbnNvbGlkYXRpb24gdHJhbnNhY3Rpb25zIGZvciBhIHdhbGxldC5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAgICAgcHJlYnVpbGRUeCAgIC0gdGhpcyBpcyB0aGUgcHJlLWJ1aWxkIGNvbnNvbGlkYXRpb24gdHguIHRoaXMgaXMgYSBub3JtYWxseSBidWlsdCB0eCB3aXRoXG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvZiBjb25zb2xpZGF0ZUlkLlxuICAgKiAgICAgdmVyaWZpY2F0aW9uIC0gbm9ybWFsIGtleWNoYWlucywgZXRjLiBmb3IgdmVyaWZpY2F0aW9uXG4gICAqL1xuICBhc3luYyBzZW5kQWNjb3VudENvbnNvbGlkYXRpb24ocGFyYW1zOiBQcmVidWlsZEFuZFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIG9uZSBvZiBhIHNldCBvZiBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLnByZWJ1aWxkVHggPT09ICdzdHJpbmcnIHx8IHBhcmFtcy5wcmVidWlsZFR4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBidWlsZCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMucHJlYnVpbGRUeC5jb25zb2xpZGF0ZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBmaW5kIGNvbnNvbGlkYXRpb24gaWQgb24gY29uc29saWRhdGlvbiB0cmFuc2FjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIGlmICghcGFyYW1zLnByZWJ1aWxkVHgudHhSZXF1ZXN0SWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zb2xpZGF0aW9uIHJlcXVlc3QgbWlzc2luZyB0eFJlcXVlc3RJZC4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZE1hbnlUc3MocGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRQcmVidWlsZCA9IChhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcblxuICAgIC8vIGRlY29yYXRlIHdpdGggb3VyIGNvbnNvbGlkYXRpb24gaWRcbiAgICBzaWduZWRQcmVidWlsZC5jb25zb2xpZGF0ZUlkID0gcGFyYW1zLnByZWJ1aWxkVHguY29uc29saWRhdGVJZDtcblxuICAgIGRlbGV0ZSBzaWduZWRQcmVidWlsZC53YWxsZXQ7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRUcmFuc2FjdGlvbihzaWduZWRQcmVidWlsZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBzZW5kcyBhIHNldCBvZiBhY2NvdW50IGNvbnNvbGlkYXRpb25zLiBUaGlzIGlzIGludGVuZGVkIHRvIGZsdXNoIG1hbnkgYmFsYW5jZXMgdG8gdGhlIHJvb3Qgd2FsbGV0IGJhbGFuY2UuXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICAgY29uc29saWRhdGVBZGRyZXNzZXMgLSB0aGVzZSBhcmUgdGhlIG9uLWNoYWluIHJlY2VpdmUgYWRkcmVzc2VzIHdlIHdhbnQgdG8gcGljayBhIGNvbnNvbGlkYXRpb24gYW1vdW50IGZyb21cbiAgICovXG4gIGFzeW5jIHNlbmRBY2NvdW50Q29uc29saWRhdGlvbnMocGFyYW1zOiBCdWlsZENvbnNvbGlkYXRpb25UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLmFsbG93c0FjY291bnRDb25zb2xpZGF0aW9ucygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCBhbGxvdyBhY2NvdW50IGNvbnNvbGlkYXRpb25zLmApO1xuICAgIH1cblxuICAgIC8vIHRoaXMgZ2l2ZXMgdXMgYSBzZXQgb2YgYWNjb3VudCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRzID0gKGF3YWl0IHRoaXMuYnVpbGRBY2NvdW50Q29uc29saWRhdGlvbnMocGFyYW1zKSkgYXMgYW55O1xuICAgIGlmICh1bnNpZ25lZEJ1aWxkcyAmJiB1bnNpZ25lZEJ1aWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzdWNjZXNzZnVsVHhzOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgZmFpbGVkVHhzID0gbmV3IEFycmF5PEVycm9yPigpO1xuICAgICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICAgIC8vIGZvbGQgYW55IG9mIHRoZSBwYXJhbWV0ZXJzIHdlIHVzZWQgdG8gYnVpbGQgdGhpcyB0cmFuc2FjdGlvbiBpbnRvIHRoZSB1bnNpZ25lZEJ1aWxkXG4gICAgICAgIGNvbnN0IHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9uczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1zKTtcbiAgICAgICAgdW5zaWduZWRCdWlsZFdpdGhPcHRpb25zLnByZWJ1aWxkVHggPSB1bnNpZ25lZEJ1aWxkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZEFjY291bnRDb25zb2xpZGF0aW9uKHVuc2lnbmVkQnVpbGRXaXRoT3B0aW9ucyk7XG4gICAgICAgICAgc3VjY2Vzc2Z1bFR4cy5wdXNoKHNlbmRUeCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmRpcihlKTtcbiAgICAgICAgICBmYWlsZWRUeHMucHVzaChlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBzdWNjZXNzZnVsVHhzLFxuICAgICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzZXQgb2YgdHJhbnNhY3Rpb25zIHRoYXQgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHRva2Vuc1xuICAgKiBAcGFyYW0gcGFyYW1zIC1cbiAgICogICAgZW5hYmxlVG9rZW5zOiBUb2tlbiBlbmFibGVtZW50IG9wZXJhdGlvbnMgd2Ugd2FudCB0byBwZXJmb3JtXG4gICAqIEByZXR1cm5zIFVuc2lnbmVkIHRyYW5zYWN0aW9ucyB0aGF0IGVuYWJsZXMgdGhlIHNwZWNpZmllZCB0b2tlbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBidWlsZFRva2VuRW5hYmxlbWVudHMoXG4gICAgcGFyYW1zOiBCdWlsZFRva2VuRW5hYmxlbWVudE9wdGlvbnMgPSB7IGVuYWJsZVRva2VuczogW10gfVxuICApOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHRbXT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBpZiAoIXRlQ29uZmlnLnJlcXVpcmVzVG9rZW5FbmFibGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCByZXF1aXJlIHRva2VuIGVuYWJsZW1lbnRzYCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZW5hYmxlVG9rZW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB0b2tlbnMgYXJlIGJlaW5nIHNwZWNpZmllZCcpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG5vdCBzcGVjaWZ5IHJlY2lwaWVudHMgZm9yIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5yZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgcXVlcnkgaWYgd2UgY2FuJ3QgZW5hYmxlIG11bHRpcGxlIHRva2VucyBpbiBvbmUgdHhcbiAgICBpZiAoIXRlQ29uZmlnLnN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzICYmIHBhcmFtcy5lbmFibGVUb2tlbnMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcXVlcmllcyA9IHBhcmFtcy5lbmFibGVUb2tlbnMubWFwKGFzeW5jIChlbmFibGVUb2tlbikgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZFRva2VuRW5hYmxlbWVudHMoe1xuICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICBlbmFibGVUb2tlbnM6IFtlbmFibGVUb2tlbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcmllcyk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5mbGF0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRQYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0gXy5waWNrKHBhcmFtcywgdGhpcy5wcmVidWlsZFdoaXRlbGlzdGVkUGFyYW1zKCkpO1xuICAgIGJ1aWxkUGFyYW1zLnR5cGUgPSAnZW5hYmxldG9rZW4nO1xuICAgIC8vIENoZWNrIGlmIHdlIGJ1aWxkIHdpdGggaW50ZW50XG4gICAgaWYgKHRoaXMuX3dhbGxldC5tdWx0aXNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICByZXR1cm4gW2F3YWl0IHRoaXMucHJlYnVpbGRUcmFuc2FjdGlvbihidWlsZFBhcmFtcyldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXdyaXRlIHRva2VucyBpbnRvIHJlY2lwaWVudHMgZm9yIGJ1aWxkVHJhbnNhY3Rpb25cbiAgICAgIGJ1aWxkUGFyYW1zLnJlY2lwaWVudHMgPSBwYXJhbXMuZW5hYmxlVG9rZW5zLm1hcCgodG9rZW4pID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRva2VuLmFkZHJlc3MgfHwgdGhpcy5fd2FsbGV0LmNvaW5TcGVjaWZpYz8uYmFzZUFkZHJlc3M7XG4gICAgICAgIGlmICghYWRkcmVzcykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgYmFzZSBhZGRyZXNzLCBtdXN0IHNwZWNpZnkgd2l0aCB0b2tlbiBwYXJhbScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGRlbGV0ZSBidWlsZFBhcmFtcy5lbmFibGVUb2tlbnM7XG4gICAgICBjb25zdCBwcmVidWlsZFR4ID0gYXdhaXQgdGhpcy5wcmVidWlsZFRyYW5zYWN0aW9uKGJ1aWxkUGFyYW1zKTtcbiAgICAgIHByZWJ1aWxkVHguYnVpbGRQYXJhbXMgPSBidWlsZFBhcmFtcztcbiAgICAgIHJldHVybiBbcHJlYnVpbGRUeF07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGFuZCBzZW5kcyBhIHNpbmdsZSB1bnNpZ25lZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICogICAtIFRoZSByZXNwb25zZSBmcm9tIHNlbmRpbmcgdGhlIHRyYW5zYWN0aW9uIGZvciBob3QvY29sZCB3YWxsZXRzXG4gICAqICAgLSBUaGUgcmVzcG9uc2UgZnJvbSBpbml0aWF0aW5nIHRoZSB0cmFuc2FjdGlvbiBmb3IgY3VzdG9kaWFsIHdhbGxldHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVG9rZW5FbmFibGVtZW50KHBhcmFtczogUHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlQ29uZmlnID0gdGhpcy5iYXNlQ29pbi5nZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTtcbiAgICBpZiAoIXRlQ29uZmlnLnJlcXVpcmVzVG9rZW5FbmFibGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5iYXNlQ29pbi5nZXRGdWxsTmFtZSgpfSBkb2VzIG5vdCByZXF1aXJlIHRva2VuIGVuYWJsZW1lbnQgdHJhbnNhY3Rpb25zYCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucHJlYnVpbGRUeCA9PT0gJ3N0cmluZycgfHwgcGFyYW1zLnByZWJ1aWxkVHg/LmJ1aWxkUGFyYW1zPy50eXBlICE9PSAnZW5hYmxldG9rZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYnVpbGQgb2YgdG9rZW4gZW5hYmxlbWVudC4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSA9PT0gJ3RzcycpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlbmRNYW55VHNzKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAodGhpcy5fd2FsbGV0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnaG90JzpcbiAgICAgICAgY2FzZSAnY29sZCc6XG4gICAgICAgICAgY29uc3Qgc2lnbmVkUHJlYnVpbGQgPSBhd2FpdCB0aGlzLnByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuc3VibWl0VHJhbnNhY3Rpb24oc2lnbmVkUHJlYnVpbGQpO1xuICAgICAgICBjYXNlICdjdXN0b2RpYWwnOlxuICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZUNvaW4udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkgKyAnL3R4L2luaXRpYXRlJyk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28ucG9zdCh1cmwpLnNlbmQocGFyYW1zLnByZWJ1aWxkVHguYnVpbGRQYXJhbXMpLnJlc3VsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIGNoYWlucyByZXF1aXJlIHRva2VucyB0byBiZSBlbmFibGVkIGJlZm9yZSB0aGV5IGNhbiBiZSByZWNlaXZlZC9zZW50LlxuICAgKiBUaGlzIGlzIGEgZGVkaWNhdGVkIGZ1bmN0aW9uIHRoYXQgZW5hYmxlcyB0b2tlbnMuXG4gICAqXG4gICAqIEJ1aWxkcywgc2lnbnMsIGFuZCBzZW5kcyBhIHNldCBvZiB0cmFuc2FjdGlvbnMgdGhhdCBlbmFibGVzIHRoZSBzcGVjaWZpZWQgdG9rZW5zXG4gICAqIEBwYXJhbSBwYXJhbXMgLVxuICAgKiAgICBlbmFibGVUb2tlbnM6IFRva2VuIGVuYWJsZW1lbnQgb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHBlcmZvcm1cbiAgICogQHJldHVyblxuICAgKiAgICBzdWNjZXNzOiBTdWNjZXNzZnVsIHJlc3BvbnNlcyBmcm9tIHNlbmRUb2tlbkVuYWJsZW1lbnRcbiAgICogICAgZmFpbHVyZTogRXJyb3JzIGZyb20gZmFpbGVkIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUb2tlbkVuYWJsZW1lbnRzKHBhcmFtczogQnVpbGRUb2tlbkVuYWJsZW1lbnRPcHRpb25zID0geyBlbmFibGVUb2tlbnM6IFtdIH0pOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBhbnlbXTtcbiAgICBmYWlsdXJlOiBFcnJvcltdO1xuICB9PiB7XG4gICAgY29uc3QgdW5zaWduZWRCdWlsZHMgPSBhd2FpdCB0aGlzLmJ1aWxkVG9rZW5FbmFibGVtZW50cyhwYXJhbXMpO1xuXG4gICAgY29uc3Qgc3VjY2Vzc2Z1bFR4czogYW55W10gPSBbXTtcbiAgICBjb25zdCBmYWlsZWRUeHMgPSBuZXcgQXJyYXk8RXJyb3I+KCk7XG4gICAgZm9yIChjb25zdCB1bnNpZ25lZEJ1aWxkIG9mIHVuc2lnbmVkQnVpbGRzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnM6IFByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBwcmVidWlsZFR4OiB1bnNpZ25lZEJ1aWxkLFxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNlbmRUeCA9IGF3YWl0IHRoaXMuc2VuZFRva2VuRW5hYmxlbWVudCh1bnNpZ25lZEJ1aWxkV2l0aE9wdGlvbnMpO1xuICAgICAgICBzdWNjZXNzZnVsVHhzLnB1c2goc2VuZFR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbGVkVHhzLnB1c2goZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NmdWxUeHMsXG4gICAgICBmYWlsdXJlOiBmYWlsZWRUeHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbGlnaHRuaW5nIGZvciBidGMvdGJ0YyBmcm9tIHRoaXMgd2FsbGV0XG4gICAqL1xuICBwdWJsaWMgbGlnaHRuaW5nKCk6IExpZ2h0bmluZyB7XG4gICAgaWYgKCF0aGlzLmJhc2VDb2luLnN1cHBvcnRzTGlnaHRuaW5nKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGlnaHRuaW5nIG5vdCBzdXBwb3J0ZWQgZm9yICR7dGhpcy5jb2luKCl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBMaWdodG5pbmcodGhpcy5iaXRnbywgdGhpcyk7XG4gIH1cblxuICAvKiBNQVJLOiBUU1MgSGVscGVycyAqL1xuXG4gIC8qKlxuICAgKiBQcmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmb3IgYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHByZWJ1aWxkIHRyYW5zYWN0aW9uIG9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlYnVpbGRUcmFuc2FjdGlvblRzcyhwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFByZWJ1aWxkVHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICBjb25zdCByZXFJZCA9IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFJZCk7XG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IHRoaXMuX3dhbGxldC50eXBlID09PSAnY3VzdG9kaWFsJyA/ICdmdWxsJyA6ICdsaXRlJztcblxuICAgIGxldCB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG4gICAgICBjYXNlICd0cmFuc2Zlcic6XG4gICAgICAgIHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMudHNzVXRpbHMhLnByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcUlkLFxuICAgICAgICAgICAgaW50ZW50VHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgICAgICAgIHJlY2lwaWVudHM6IHBhcmFtcy5yZWNpcGllbnRzIHx8IFtdLFxuICAgICAgICAgICAgbWVtbzogcGFyYW1zLm1lbW8sXG4gICAgICAgICAgICBub25jZTogcGFyYW1zLm5vbmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBpVmVyc2lvbixcbiAgICAgICAgICBwYXJhbXMucHJldmlld1xuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2VuYWJsZXRva2VuJzpcbiAgICAgICAgdHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEucHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVxSWQsXG4gICAgICAgICAgICBpbnRlbnRUeXBlOiAnZW5hYmxlVG9rZW4nLFxuICAgICAgICAgICAgcmVjaXBpZW50czogcGFyYW1zLnJlY2lwaWVudHMgfHwgW10sXG4gICAgICAgICAgICBlbmFibGVUb2tlbnM6IHBhcmFtcy5lbmFibGVUb2tlbnMsXG4gICAgICAgICAgICBtZW1vOiBwYXJhbXMubWVtbyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaVZlcnNpb24sXG4gICAgICAgICAgcGFyYW1zLnByZXZpZXdcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJHtwYXJhbXMudHlwZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgdW5zaWduZWRUeDogRWRkc2FVbnNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKHR4UmVxdWVzdC5hcGlWZXJzaW9uID09PSAnZnVsbCcpIHtcbiAgICAgIGlmICh0eFJlcXVlc3QudHJhbnNhY3Rpb25zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgc2luZ2xlIHVuc2lnbmVkIHR4IGZvciB0eCByZXF1ZXN0IHdpdGggaWQ6ICR7dHhSZXF1ZXN0LnR4UmVxdWVzdElkfWApO1xuICAgICAgfVxuXG4gICAgICB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHhSZXF1ZXN0LnVuc2lnbmVkVHhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgc2luZ2xlIHVuc2lnbmVkIHR4IGZvciB0eCByZXF1ZXN0IHdpdGggaWQ6ICR7dHhSZXF1ZXN0LnR4UmVxdWVzdElkfWApO1xuICAgICAgfVxuICAgICAgdW5zaWduZWRUeCA9IHR4UmVxdWVzdC51bnNpZ25lZFR4c1swXTtcbiAgICB9XG5cbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IF8ucGljayhwYXJhbXMsIHRoaXMucHJlYnVpbGRXaGl0ZWxpc3RlZFBhcmFtcygpKTtcbiAgICByZXR1cm4ge1xuICAgICAgd2FsbGV0SWQ6IHRoaXMuaWQoKSxcbiAgICAgIHdhbGxldDogdGhpcyxcbiAgICAgIHR4UmVxdWVzdElkOiB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICB0eEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsXG4gICAgICBidWlsZFBhcmFtczogd2hpdGVsaXN0ZWRQYXJhbXMsXG4gICAgICBmZWVJbmZvOiB1bnNpZ25lZFR4LmZlZUluZm8sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIGZyb20gYSBUU1Mgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIHNpZ25pbmcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduVHJhbnNhY3Rpb25Uc3MocGFyYW1zOiBXYWxsZXRTaWduVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFByZWJ1aWxkIHJlcXVpcmVkIHRvIHNpZ24gdHJhbnNhY3Rpb25zIHdpdGggVFNTJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJhbXMudHhQcmVidWlsZC50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCByZXF1aXJlZCB0byBzaWduIHRyYW5zYWN0aW9ucyB3aXRoIFRTUycpO1xuICAgIH1cblxuICAgIGlmICghcGFyYW1zLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcnYgcmVxdWlyZWQgdG8gc2lnbiB0cmFuc2FjdGlvbnMgd2l0aCBUU1MnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2lnbmVkVHhSZXF1ZXN0ID0gYXdhaXQgdGhpcy50c3NVdGlscyEuc2lnblR4UmVxdWVzdCh7XG4gICAgICAgIHR4UmVxdWVzdDogcGFyYW1zLnR4UHJlYnVpbGQudHhSZXF1ZXN0SWQsXG4gICAgICAgIHBydjogcGFyYW1zLnBydixcbiAgICAgICAgcmVxSWQ6IHBhcmFtcy5yZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eFJlcXVlc3RJZDogc2lnbmVkVHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaWduIHRyYW5zYWN0aW9uICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzLCBzaWducywgYW5kIHNlbmRzIGEgdHJhbnNhY3Rpb24gZnJvbSBhIFRTUyB3YWxsZXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgc2VuZCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRNYW55VHNzKHBhcmFtczogU2VuZE1hbnlPcHRpb25zID0ge30pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHRoaXMucHJlYnVpbGRBbmRTaWduVHJhbnNhY3Rpb24ocGFyYW1zKSkgYXMgU2lnbmVkVHJhbnNhY3Rpb25SZXF1ZXN0O1xuICAgIGlmICghc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgbWlzc2luZyBmcm9tIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEJHLTUxMTIyIFJlbW92ZSBjb25kaXRpb25hbCB3aGVuIG1vdmVkIHRvIHR4UmVxdWVzdEZ1bGwgZm9yIGV2ZXJ5dGhpbmdcbiAgICBpZiAodGhpcy5fd2FsbGV0LnR5cGUgPT09ICdjdXN0b2RpYWwnKSB7XG4gICAgICBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAgIC5wb3N0KFxuICAgICAgICAgIHRoaXMuYml0Z28udXJsKFxuICAgICAgICAgICAgJy93YWxsZXQvJyArIHRoaXMuX3dhbGxldC5pZCArICcvdHhyZXF1ZXN0cy8nICsgc2lnbmVkVHJhbnNhY3Rpb24udHhSZXF1ZXN0SWQgKyAnL3RyYW5zZmVycycsXG4gICAgICAgICAgICAyXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC5zZW5kKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRzc1V0aWxzPy5zZW5kVHhSZXF1ZXN0KHNpZ25lZFRyYW5zYWN0aW9uLnR4UmVxdWVzdElkKTtcbiAgfVxufVxuIl19
|