@bitgo/sdk-api 1.49.3 → 1.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,14 +12,14 @@
12
12
  //
13
13
  const unspents_1 = require("@bitgo/unspents");
14
14
  const assert = require("assert");
15
- const utxo_lib_1 = require("@bitgo/utxo-lib");
16
- const TransactionBuilder = require('./transactionBuilder');
17
15
  const utxolib = require("@bitgo/utxo-lib");
18
- const PendingApproval = require('./pendingapproval');
16
+ const utxo_lib_1 = require("@bitgo/utxo-lib");
19
17
  const sdk_core_1 = require("@bitgo/sdk-core");
20
18
  const Bluebird = require("bluebird");
21
- const co = Bluebird.coroutine;
22
19
  const _ = require("lodash");
20
+ const TransactionBuilder = require('./transactionBuilder');
21
+ const PendingApproval = require('./pendingapproval');
22
+ const co = Bluebird.coroutine;
23
23
  const { getExternalChainCode, getInternalChainCode, isChainCode, scriptTypeForChain } = utxolib.bitgo;
24
24
  const request = require('superagent');
25
25
  //
@@ -2151,5 +2151,55 @@ Wallet.prototype.recover = async function (params) {
2151
2151
  });
2152
2152
  return fullSignedTx.tx;
2153
2153
  };
2154
+ /*
2155
+ * @params
2156
+ * walletPassphrase: passphrase of wallet used to decrypt the encrypted keys
2157
+ * unspents: array of unspents to recover
2158
+ * recoveryDestination: destination address to recover funds to
2159
+ * feeRate: fee rate to use for the recovery transaction
2160
+ * userKey: encrypted user key
2161
+ * */
2162
+ Wallet.prototype.sweep = async function (params) {
2163
+ if (_.isUndefined(params.walletPassphrase)) {
2164
+ throw new Error('missing walletPassphrase');
2165
+ }
2166
+ if (_.isUndefined(params.unspents)) {
2167
+ throw new Error('missing unspents');
2168
+ }
2169
+ if (_.isUndefined(params.recoveryDestination)) {
2170
+ throw new Error('invalid recoveryDestination');
2171
+ }
2172
+ if (_.isUndefined(params.feeRate)) {
2173
+ throw new Error('invalid feeRate');
2174
+ }
2175
+ if (_.isUndefined(params.userKey)) {
2176
+ throw new Error('invalid userKey');
2177
+ }
2178
+ const totalInputAmount = BigInt(utxolib.bitgo.unspentSum(params.unspents));
2179
+ if (totalInputAmount <= BigInt(0)) {
2180
+ throw new sdk_core_1.ErrorNoInputToRecover();
2181
+ }
2182
+ const outputSize = unspents_1.VirtualSizes.txP2wshOutputSize;
2183
+ const approximateSize = unspents_1.VirtualSizes.txSegOverheadVSize + outputSize + unspents_1.VirtualSizes.txP2shInputSize * params.unspents.length;
2184
+ const approximateTxFee = BigInt(approximateSize * params.feeRate);
2185
+ const recoveryAmount = totalInputAmount - approximateTxFee;
2186
+ const recipients = [{ address: params.recoveryDestination, amount: Number(recoveryAmount) }];
2187
+ const unsignedTx = await this.createTransaction({
2188
+ unspents: params.unspents,
2189
+ recipients,
2190
+ fee: Number(approximateTxFee),
2191
+ });
2192
+ const parsedUnsignedTx = utxolib.bitgo.createTransactionFromHex(unsignedTx.transactionHex, utxolib.networks.bitcoin);
2193
+ assert(parsedUnsignedTx.ins.length === params.unspents.length);
2194
+ assert(parsedUnsignedTx.outs.length === 1);
2195
+ assert(_.sumBy(params.unspents, 'value') - _.sumBy(parsedUnsignedTx.outs, 'value') === Number(approximateTxFee));
2196
+ const plainUserKey = this.bitgo.decrypt({ password: params.walletPassphrase, input: params.userKey });
2197
+ const halfSignedTx = await this.signTransaction({ ...unsignedTx, signingKey: plainUserKey });
2198
+ return await this.sendTransaction({
2199
+ tx: halfSignedTx.tx,
2200
+ suppressBroadcast: true,
2201
+ otp: params.otp,
2202
+ });
2203
+ };
2154
2204
  module.exports = Wallet;
2155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsOENBQStDO0FBQy9DLGlDQUFpQztBQUVqQyw4Q0FBd0M7QUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUMzRCwyQ0FBMkM7QUFDM0MsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsOENBT3lCO0FBQ3pCLHFDQUFxQztBQUNyQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO0FBQzlCLDRCQUE0QjtBQUM1QixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN0RyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFdEMsRUFBRTtBQUNGLGNBQWM7QUFDZCxFQUFFO0FBQ0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxLQUFLLEVBQUUsTUFBTTtJQUNwQyxzQ0FBc0M7SUFDckMsSUFBSSxDQUFDLEtBQWEsR0FBRyxLQUFLLENBQUM7SUFDNUIsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLHNDQUFzQztJQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUVwQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDbEIsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDM0M7QUFDSCxDQUFDLENB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S0FDckQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7S0FDcEQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7S0FDM0Q7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNsRSxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7S0FDN0Q7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7S0FDNUQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9C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LENBQUM7QUFDekIsQ0FBQyxDQUFDO0FBRUYsaUJBQVMsTUFBTSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBXYWxsZXQgT2JqZWN0XG4vLyBCaXRHbyBhY2Nlc3NvciBmb3IgYSBzcGVjaWZpYyB3YWxsZXRcbi8vXG4vLyBDb3B5cmlnaHQgMjAxNCwgQml0R28sIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vL1xuXG5pbXBvcnQgeyBWaXJ0dWFsU2l6ZXMgfSBmcm9tICdAYml0Z28vdW5zcGVudHMnO1xuaW1wb3J0ICogYXMgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmNvbnN0IFRyYW5zYWN0aW9uQnVpbGRlciA9IHJlcXVpcmUoJy4vdHJhbnNhY3Rpb25CdWlsZGVyJyk7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5jb25zdCBQZW5kaW5nQXBwcm92YWwgPSByZXF1aXJlKCcuL3BlbmRpbmdhcHByb3ZhbCcpO1xuXG5pbXBvcnQge1xuICBjb21tb24sXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0TmV0d29yayxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBCbHVlYmlyZCBmcm9tICdibHVlYmlyZCc7XG5jb25zdCBjbyA9IEJsdWViaXJkLmNvcm91dGluZTtcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmNvbnN0IHsgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUsIGdldEludGVybmFsQ2hhaW5Db2RlLCBpc0NoYWluQ29kZSwgc2NyaXB0VHlwZUZvckNoYWluIH0gPSB1dHhvbGliLmJpdGdvO1xuY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoJ3N1cGVyYWdlbnQnKTtcblxuLy9cbi8vIENvbnN0cnVjdG9yXG4vL1xuY29uc3QgV2FsbGV0ID0gZnVuY3Rpb24gKGJpdGdvLCB3YWxsZXQpIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgKHRoaXMuYml0Z28gYXMgYW55KSA9IGJpdGdvO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICB0aGlzLndhbGxldCA9IHdhbGxldDtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy5rZXljaGFpbnMgPSBbXTtcblxuICBpZiAod2FsbGV0LnByaXZhdGUpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHRoaXMua2V5Y2hhaW5zID0gd2FsbGV0LnByaXZhdGUua2V5Y2hhaW5zO1xuICB9XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0O1xufTtcblxuLy9cbi8vIGlkXG4vLyBHZXQgdGhlIGlkIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5pZDtcbn07XG5cbi8vXG4vLyBsYWJlbFxuLy8gR2V0IHRoZSBsYWJlbCBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmxhYmVsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQubGFiZWw7XG59O1xuXG4vL1xuLy8gYmFsYW5jZVxuLy8gR2V0IHRoZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuYmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmJhbGFuY2U7XG59O1xuXG4vL1xuLy8gYmFsYW5jZVxuLy8gR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vIFRoaXMgaXMgdGhlIHRvdGFsIG9mIGFsbCB1bnNwZW50cyBleGNlcHQgdGhvc2UgdGhhdCBhcmUgdW5jb25maXJtZWQgYW5kIGV4dGVybmFsXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zcGVuZGFibGVCYWxhbmNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbn07XG5cbi8vXG4vLyBjb25maXJtZWRCYWxhbmNlXG4vLyBHZXQgdGhlIGNvbmZpcm1lZEJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jb25maXJtZWRCYWxhbmNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuY29uZmlybWVkQmFsYW5jZTtcbn07XG5cbi8vXG4vLyBjYW5TZW5kSW5zdGFudFxuLy8gUmV0dXJucyBpZiB0aGUgd2FsbGV0IGNhbiBzZW5kIGluc3RhbnQgdHJhbnNhY3Rpb25zXG4vLyBUaGlzIGlzIGltcGFjdGVkIGJ5IHRoZSBjaG9pY2Ugb2YgYmFja3VwIGtleSBwcm92aWRlclxuLy9cbldhbGxldC5wcm90b3R5cGUuY2FuU2VuZEluc3RhbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldCAmJiB0aGlzLndhbGxldC5jYW5TZW5kSW5zdGFudDtcbn07XG5cbi8vXG4vLyBpbnN0YW50IGJhbGFuY2Vcbi8vIEdldCB0aGUgaW5zdGFudCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy8gVGhpcyBpcyB0aGUgdG90YWwgb2YgYWxsIHVuc3BlbnRzIHRoYXQgbWF5IGJlIHNwZW50IGluc3RhbnRseS5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmluc3RhbnRCYWxhbmNlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY2FuU2VuZEluc3RhbnQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGFuIGluc3RhbnQgd2FsbGV0Jyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMud2FsbGV0Lmluc3RhbnRCYWxhbmNlO1xufTtcblxuLy9cbi8vIHVuY29uZmlybWVkU2VuZHNcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB1bmNvbmZpcm1lZFNlbmRzIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUudW5jb25maXJtZWRTZW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnVuY29uZmlybWVkU2VuZHM7XG59O1xuXG4vL1xuLy8gdW5jb25maXJtZWRSZWNlaXZlc1xuLy8gR2V0IHRoZSBiYWxhbmNlIG9mIHVuY29uZmlybWVkUmVjZWl2ZXMgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuY29uZmlybWVkUmVjZWl2ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC51bmNvbmZpcm1lZFJlY2VpdmVzO1xufTtcblxuLy9cbi8vIHR5cGVcbi8vIEdldCB0aGUgdHlwZSBvZiB0aGlzIHdhbGxldCwgZS5nLiAnc2FmZWhkJ1xuLy9cbldhbGxldC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnR5cGU7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnVybCA9IGZ1bmN0aW9uIChleHRyYSkge1xuICBleHRyYSA9IGV4dHJhIHx8ICcnO1xuICByZXR1cm4gdGhpcy5iaXRnby51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArIGV4dHJhKTtcbn07XG5cbi8vXG4vLyBwZW5kaW5nQXBwcm92YWxzXG4vLyByZXR1cm5zIHRoZSBwZW5kaW5nIGFwcHJvdmFscyBsaXN0IGZvciB0aGlzIHdhbGxldCBhcyBwZW5kaW5nIGFwcHJvdmFsIG9iamVjdHNcbi8vXG5XYWxsZXQucHJvdG90eXBlLnBlbmRpbmdBcHByb3ZhbHMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy53YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gbmV3IFBlbmRpbmdBcHByb3ZhbChzZWxmLmJpdGdvLCBwLCBzZWxmKTtcbiAgfSk7XG59O1xuXG4vL1xuLy8gYXBwcm92YWxzUmVxdWlyZWRcbi8vIHJldHVybnMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgdG8gYXBwcm92ZSBwZW5kaW5nIGFwcHJvdmFscyBpbnZvbHZpbmcgdGhpcyB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFwcHJvdmFsc1JlcXVpcmVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuYXBwcm92YWxzUmVxdWlyZWQgfHwgMTtcbn07XG5cbi8vXG4vLyBnZXRcbi8vIFJlZmV0Y2hlcyB0aGlzIHdhbGxldCBhbmQgcmV0dXJucyBpdFxuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spOiBCbHVlYmlyZDxhbnk+IHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMudXJsKCkpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgc2VsZi53YWxsZXQgPSByZXM7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfSlcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB1cGRhdGVBcHByb3ZhbHNSZXF1aXJlZFxuLy8gVXBkYXRlcyB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBvbiBhIHBlbmRpbmcgYXBwcm92YWwgaW52b2x2aW5nIHRoaXMgd2FsbGV0LlxuLy8gVGhlIGFwcHJvdmFscyByZXF1aXJlZCBpcyBieSBkZWZhdWx0IDEsIGJ1dCB0aGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZVxuLy8gbnVtYmVyIHN1Y2ggdGhhdCAxIDw9IGFwcHJvdmFsc1JlcXVpcmVkIDw9IHdhbGxldEFkbWlucy5sZW5ndGggLSAxXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51cGRhdGVBcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogQmx1ZWJpcmQ8YW55PiB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmIChcbiAgICBwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICFfLmlzSW50ZWdlcihwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQpIHx8XG4gICAgcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkIDwgMVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXBwcm92YWxzUmVxdWlyZWQ6IG11c3QgYmUgYSBub256ZXJvIHBvc2l0aXZlIG51bWJlcicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGNvbnN0IGN1cnJlbnRBcHByb3ZhbHNSZXF1aXJlZCA9IHRoaXMuYXBwcm92YWxzUmVxdWlyZWQoKTtcbiAgaWYgKGN1cnJlbnRBcHByb3ZhbHNSZXF1aXJlZCA9PT0gcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkKSB7XG4gICAgLy8gbm8tb3AsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHdhbGxldFxuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYud2FsbGV0O1xuICAgIH0pLm5vZGVpZnkoY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29ycmVjdCBjaGFpbiBmb3IgY2hhbmdlLCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIHNlZ3dpdFxuICovXG5XYWxsZXQucHJvdG90eXBlLmdldENoYW5nZUNoYWluID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBsZXQgdXNlU2Vnd2l0Q2hhbmdlID0gISF0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdDtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXRDaGFuZ2UpKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuc2Vnd2l0Q2hhbmdlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWd3aXRDaGFuZ2UgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgICB9XG5cbiAgICAvLyBpZiBzZWd3aXQgaXMgZGlzYWJsZWQgdGhyb3VnaCB0aGUgY29uc3RhbnRzLCBzZWd3aXQgY2hhbmdlIHNob3VsZCBzdGlsbCBub3QgYmUgY3JlYXRlZFxuICAgIHVzZVNlZ3dpdENoYW5nZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZW5hYmxlU2Vnd2l0ICYmIHBhcmFtcy5zZWd3aXRDaGFuZ2U7XG4gIH1cbiAgcmV0dXJuIHVzZVNlZ3dpdENoYW5nZSA/IGdldEludGVybmFsQ2hhaW5Db2RlKCdwMnNoUDJ3c2gnKSA6IGdldEludGVybmFsQ2hhaW5Db2RlKCdwMnNoJyk7XG59O1xuXG4vL1xuLy8gY3JlYXRlQWRkcmVzc1xuLy8gQ3JlYXRlcyBhIG5ldyBhZGRyZXNzIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKHRoaXMudHlwZSgpID09PSAnc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhcmUgdXNpbmcgYSBsZWdhY3kgd2FsbGV0IHRoYXQgY2Fubm90IGNyZWF0ZSBhIG5ldyBhZGRyZXNzJyk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHRvIGNsaWVudC1zaWRlIGFkZHJlc3MgdmFsaWRhdGlvbiBvbiwgZm9yIHNhZmV0eS4gVXNlIHZhbGlkYXRlPWZhbHNlIHRvIGRpc2FibGUuXG4gIGNvbnN0IHNob3VsZFZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG5cbiAgY29uc3QgYWxsb3dFeGlzdGluZyA9IHBhcmFtcy5hbGxvd0V4aXN0aW5nO1xuICBpZiAodHlwZW9mIGFsbG93RXhpc3RpbmcgIT09ICdib29sZWFuJykge1xuICAgIHBhcmFtcy5hbGxvd0V4aXN0aW5nID0gYWxsb3dFeGlzdGluZyA9PT0gJ3RydWUnO1xuICB9XG5cbiAgY29uc3QgaXNTZWd3aXQgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdDtcbiAgY29uc3QgZGVmYXVsdENoYWluID0gaXNTZWd3aXQgPyBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaFAyd3NoJykgOiBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xuXG4gIGxldCBjaGFpbiA9IHBhcmFtcy5jaGFpbjtcbiAgaWYgKGNoYWluID09PSBudWxsIHx8IGNoYWluID09PSB1bmRlZmluZWQpIHtcbiAgICBjaGFpbiA9IGRlZmF1bHRDaGFpbjtcbiAgfVxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL2FkZHJlc3MvJyArIGNoYWluKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGFkZHIpIHtcbiAgICAgICAgaWYgKHNob3VsZFZhbGlkYXRlKSB7XG4gICAgICAgICAgc2VsZi52YWxpZGF0ZUFkZHJlc3MoYWRkcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZHI7XG4gICAgICB9KVxuICApLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhZGRyZXNzIGxvY2FsbHkgd2l0aG91dCBjYWxsaW5nIHNlcnZlclxuICogQHBhcmFtIHBhcmFtc1xuICpcbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5nZW5lcmF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAoeyBzZWd3aXQsIHBhdGgsIGtleWNoYWlucywgdGhyZXNob2xkIH0pIHtcbiAgY29uc3QgaXNTZWd3aXQgPSAhIXNlZ3dpdDtcbiAgbGV0IHNpZ25hdHVyZVRocmVzaG9sZCA9IDI7XG4gIGlmIChfLmlzSW50ZWdlcih0aHJlc2hvbGQpKSB7XG4gICAgc2lnbmF0dXJlVGhyZXNob2xkID0gdGhyZXNob2xkO1xuICAgIGlmIChzaWduYXR1cmVUaHJlc2hvbGQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgaGFzIHRvIGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGF0aFJlZ2V4ID0gL15cXC8xP1swMV1cXC9cXGQrJC87XG4gIGlmICghcGF0aC5tYXRjaChwYXRoUmVnZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBwYXRoOiAnICsgcGF0aCk7XG4gIH1cblxuICBsZXQgcm9vdEtleXMgPSB0aGlzLmtleWNoYWlucztcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Y2hhaW5zKSkge1xuICAgIHJvb3RLZXlzID0ga2V5Y2hhaW5zO1xuICB9XG5cbiAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0ubmV0d29yaztcblxuICBjb25zdCBkZXJpdmVkS2V5cyA9IHJvb3RLZXlzLm1hcChmdW5jdGlvbiAoaykge1xuICAgIGNvbnN0IGhkbm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoay54cHViKTtcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGsucGF0aCArIChrLndhbGxldFN1YlBhdGggfHwgJycpICsgcGF0aDtcbiAgICByZXR1cm4gaGRub2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKGRlcml2YXRpb25QYXRoKSkucHVibGljS2V5O1xuICB9KTtcblxuICBjb25zdCBwYXRoQ29tcG9uZW50cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGhDb21wb25lbnRzID0gXy5tYXAocGF0aENvbXBvbmVudHMsIChjb21wb25lbnQpID0+IHtcbiAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY29tcG9uZW50LCAxMCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcGF0aERldGFpbHMgPSBfLmZpbHRlcihub3JtYWxpemVkUGF0aENvbXBvbmVudHMsIF8uaXNJbnRlZ2VyKTtcblxuICBjb25zdCBhZGRyZXNzRGV0YWlsczogYW55ID0ge1xuICAgIGNoYWluUGF0aDogcGF0aCxcbiAgICBwYXRoOiBwYXRoLFxuICAgIGNoYWluOiBwYXRoRGV0YWlsc1swXSxcbiAgICBpbmRleDogcGF0aERldGFpbHNbMV0sXG4gICAgd2FsbGV0OiB0aGlzLmlkKCksXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIHNjcmlwdFB1YktleTogb3V0cHV0U2NyaXB0LFxuICAgIHJlZGVlbVNjcmlwdCxcbiAgICB3aXRuZXNzU2NyaXB0LFxuICB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoZGVyaXZlZEtleXMsIGlzU2Vnd2l0ID8gJ3Ayc2hQMndzaCcgOiAncDJzaCcpO1xuXG4gIGFkZHJlc3NEZXRhaWxzLndpdG5lc3NTY3JpcHQgPSB3aXRuZXNzU2NyaXB0Py50b1N0cmluZygnaGV4Jyk7XG4gIGFkZHJlc3NEZXRhaWxzLnJlZGVlbVNjcmlwdCA9IHJlZGVlbVNjcmlwdD8udG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5vdXRwdXRTY3JpcHQgPSBvdXRwdXRTY3JpcHQudG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0LCBnZXROZXR3b3JrKG5ldHdvcmspKTtcblxuICByZXR1cm4gYWRkcmVzc0RldGFpbHM7XG59O1xuXG4vL1xuLy8gdmFsaWRhdGVBZGRyZXNzXG4vLyBWYWxpZGF0ZXMgYW4gYWRkcmVzcyBhbmQgcGF0aCBieSBjYWxjdWxhdGluZyBpdCBsb2NhbGx5IGZyb20gdGhlIGtleWNoYWluIHhwdWJzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS52YWxpZGF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdwYXRoJ10sIFtdKTtcbiAgY29uc3QgaXNTZWd3aXQgPSAhIXBhcmFtcy53aXRuZXNzU2NyaXB0ICYmIHBhcmFtcy53aXRuZXNzU2NyaXB0Lmxlbmd0aCA+IDA7XG5cbiAgY29uc3QgZ2VuZXJhdGVkQWRkcmVzcyA9IHRoaXMuZ2VuZXJhdGVBZGRyZXNzKHsgcGF0aDogcGFyYW1zLnBhdGgsIHNlZ3dpdDogaXNTZWd3aXQgfSk7XG4gIGlmIChnZW5lcmF0ZWRBZGRyZXNzLmFkZHJlc3MgIT09IHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogJyArIHBhcmFtcy5hZGRyZXNzICsgJyB2cy4gJyArIGdlbmVyYXRlZEFkZHJlc3MuYWRkcmVzcyk7XG4gIH1cbn07XG5cbi8vXG4vLyBhZGRyZXNzZXNcbi8vIEdldHMgdGhlIGFkZHJlc3NlcyBvZiBhIEhEIHdhbGxldC5cbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBsaW1pdDogdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgdG8gZ2V0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hZGRyZXNzZXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHF1ZXJ5OiBhbnkgPSB7fTtcbiAgaWYgKHBhcmFtcy5kZXRhaWxzKSB7XG4gICAgcXVlcnkuZGV0YWlscyA9IDE7XG4gIH1cblxuICBjb25zdCBjaGFpbiA9IHBhcmFtcy5jaGFpbjtcbiAgaWYgKGNoYWluICE9PSBudWxsICYmIGNoYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFpbikpIHtcbiAgICAgIHF1ZXJ5LmNoYWluID0gXy51bmlxKF8uZmlsdGVyKGNoYWluLCBfLmlzSW50ZWdlcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhaW4gIT09IDAgJiYgY2hhaW4gIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWluIGFyZ3VtZW50LCBleHBlY3RpbmcgMCBvciAxJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5jaGFpbiA9IGNoYWluO1xuICAgIH1cbiAgfVxuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gIH1cbiAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LnNraXAgPSBwYXJhbXMuc2tpcDtcbiAgfVxuICBpZiAocGFyYW1zLnNvcnQpIHtcbiAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2FkZHJlc3NlcycpO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnN0YXRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbGltaXQ9JyArIHBhcmFtcy5saW1pdCk7XG4gIH1cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3N0YXRzJyArIHF1ZXJ5KTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVmcmVzaCB0aGUgd2FsbGV0IG9iamVjdCBieSBzeW5jaW5nIHdpdGggdGhlIGJhY2stZW5kXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtXYWxsZXR9XG4gKi9cbldhbGxldC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBjbyhmdW5jdGlvbiogKCkge1xuICAgIC8vIHdoZW4gc2V0IHRvIHRydWUsIGdwayByZXR1cm5zIHRoZSBwcml2YXRlIGRhdGEgb2Ygc2FmZSB3YWxsZXRzXG4gICAgY29uc3QgcXVlcnkgPSBfLmV4dGVuZCh7fSwgXy5waWNrKHBhcmFtcywgWydncGsnXSkpO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgdGhpcy53YWxsZXQgPSByZXM7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICByZXR1cm4gdGhpcztcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBhZGRyZXNzXG4vLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGFkZHJlc3Mgb24gYSBIRCB3YWxsZXQuXG4vLyBJbmZvcm1hdGlvbiBpbmNsdWRlcyBpbmRleCwgcGF0aCwgcmVkZWVtU2NyaXB0LCBzZW50LCByZWNlaXZlZCwgdHhDb3VudCBhbmQgYmFsYW5jZVxuLy8gT3B0aW9ucyBpbmNsdWRlOlxuLy8gIGFkZHJlc3M6IHRoZSBhZGRyZXNzIG9uIHRoaXMgd2FsbGV0IHRvIGdldFxuLy9cbldhbGxldC5wcm90b3R5cGUuYWRkcmVzcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzZXMvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRnJlZXplIHRoZSB3YWxsZXQgZm9yIGEgZHVyYXRpb24gb2YgY2hvaWNlLCBzdG9wcGluZyBCaXRHbyBmcm9tIHNpZ25pbmcgYW55IHRyYW5zYWN0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgZHVyYXRpb24gdG8gZnJlZXplIHRoZSB3YWxsZXQgZm9yIGluIHNlY29uZHMsIGRlZmF1bHRzIHRvIDM2MDAuXG4gKi9cbldhbGxldC5wcm90b3R5cGUuZnJlZXplID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkdXJhdGlvbiAtIHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ZyZWV6ZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGRlbGV0ZVxuLy8gRGVsZXRlcyB0aGUgd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBsYWJlbHNcbi8vIExpc3QgdGhlIGxhYmVscyBmb3IgdGhlIGFkZHJlc3NlcyBpbiBhIGdpdmVuIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUubGFiZWxzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgnbGFiZWxzJykpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZW5hbWUgYSB3YWxsZXRcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICAtIGxhYmVsOiB0aGUgd2FsbGV0J3MgaW50ZW5kZWQgbmV3IG5hbWVcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuc2V0V2FsbGV0TmFtZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydsYWJlbCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkpO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZXRMYWJlbFxuLy8gU2V0cyBhIGxhYmVsIG9uIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZXRMYWJlbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJywgJ2xhYmVsJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzZWxmLmJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuYWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpICsgJy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZCh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGRlbGV0ZUxhYmVsXG4vLyBEZWxldGVzIHRoZSBsYWJlbCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGFkZHJlc3Ncbi8vXG5XYWxsZXQucHJvdG90eXBlLmRlbGV0ZUxhYmVsID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBpZiAoIXNlbGYuYml0Z28udmVyaWZ5QWRkcmVzcyh7IGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzIH0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJpdGNvaW4gYWRkcmVzczogJyArIHBhcmFtcy5hZGRyZXNzKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKCcvbGFiZWxzLycgKyB0aGlzLmlkKCkgKyAnLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdW5zcGVudHNcbi8vIExpc3QgQUxMIHRoZSB1bnNwZW50cyBmb3IgYSBnaXZlbiB3YWxsZXRcbi8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgcGFnZWQgbGlzdCBvZiBhbGwgdW5zcGVudHNcbi8vXG4vLyBQYXJhbWV0ZXJzIGluY2x1ZGU6XG4vLyAgIGxpbWl0OiAgdGhlIG9wdGlvbmFsIGxpbWl0IG9mIHVuc3BlbnRzIHRvIGNvbGxlY3QgaW4gQlRDXG4vLyAgIG1pbkNvbmY6IG9ubHkgaW5jbHVkZSByZXN1bHRzIHdpdGggdGhpcyBudW1iZXIgb2YgY29uZmlybWF0aW9uc1xuLy8gICB0YXJnZXQ6IHRoZSBhbW91bnQgb2YgYnRjIHRvIGZpbmQgdG8gc3BlbmRcbi8vICAgaW5zdGFudDogb25seSBmaW5kIGluc3RhbnQgdHJhbnNhY3Rpb25zIChtdXN0IHNwZWNpZnkgYSB0YXJnZXQpXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgYWxsVW5zcGVudHM6IGFueVtdID0gW107XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGNvbnN0IGdldFVuc3BlbnRzQmF0Y2ggPSBmdW5jdGlvbiAoc2tpcCwgbGltaXQ/KSB7XG4gICAgY29uc3QgcXVlcnlPYmplY3QgPSBfLmNsb25lRGVlcChwYXJhbXMpO1xuICAgIGlmIChza2lwID4gMCkge1xuICAgICAgcXVlcnlPYmplY3Quc2tpcCA9IHNraXA7XG4gICAgfVxuICAgIGlmIChsaW1pdCAmJiBsaW1pdCA+IDApIHtcbiAgICAgIHF1ZXJ5T2JqZWN0LmxpbWl0ID0gbGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGYudW5zcGVudHNQYWdlZChxdWVyeU9iamVjdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAvLyBUaGUgQVBJIGhhcyBpdHMgb3duIGxpbWl0IGhhbmRsaW5nLiBGb3IgZXhhbXBsZSwgdGhlIEFQSSBkb2VzIG5vdCBzdXBwb3J0IGxpbWl0cyBiaWdnZXIgdGhhbiA1MDAuIElmIHRoZSBsaW1pdFxuICAgICAgLy8gc3BlY2lmaWVkIGhlcmUgaXMgYmlnZ2VyIHRoYW4gdGhhdCwgd2Ugd2lsbCBoYXZlIHRvIGRvIG11bHRpcGxlIHJlcXVlc3RzIHdpdGggbmVjZXNzYXJ5IGxpbWl0IGFkanVzdG1lbnQuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC51bnNwZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB1bnNwZW50ID0gcmVzdWx0LnVuc3BlbnRzW2ldO1xuICAgICAgICBhbGxVbnNwZW50cy5wdXNoKHVuc3BlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBPdXIgbGltaXQgYWRqdXN0bWVudCBtYWtlcyBzdXJlIHRoYXQgd2UgbmV2ZXIgZmV0Y2ggbW9yZSB1bnNwZW50cyB0aGFuIHdlIG5lZWQsIG1lYW5pbmcgdGhhdCBpZiB3ZSBoaXQgdGhlXG4gICAgICAvLyBsaW1pdCwgd2UgaGl0IGl0IHByZWNpc2VseVxuICAgICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA+PSBwYXJhbXMubGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGFsbFVuc3BlbnRzOyAvLyB3ZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBhbnkgZnVydGhlciB1bnNwZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3RhbFVuc3BlbnRDb3VudCA9IHJlc3VsdC50b3RhbDtcbiAgICAgIC8vIGlmIG5vIHRhcmdldCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBTREsgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaGFzIGJlZW4gYSBsaW1pdCwgd2UgbmVlZCB0byBmZXRjaCBhbm90aGVyIGJhdGNoXG4gICAgICBpZiAoIXBhcmFtcy50YXJnZXQgJiYgdG90YWxVbnNwZW50Q291bnQgJiYgdG90YWxVbnNwZW50Q291bnQgPiBhbGxVbnNwZW50cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBmZXRjaCB0aGUgbmV4dCBiYXRjaFxuICAgICAgICAvLyBsZXQncyBqdXN0IG9mZnNldCB0aGUgY3VycmVudCBza2lwIGJ5IHRoZSBjb3VudFxuICAgICAgICBjb25zdCBuZXdTa2lwID0gc2tpcCArIHJlc3VsdC5jb3VudDtcbiAgICAgICAgbGV0IG5ld0xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChsaW1pdCA+IDApIHtcbiAgICAgICAgICAvLyB3ZSBzZXQgdGhlIG5ldyBsaW1pdCB0byBiZSBwcmVjaXNlbHkgdGhlIG51bWJlciBvZiBtaXNzaW5nIHVuc3BlbnRzIHRvIGhpdCBvdXIgb3duIGxpbWl0XG4gICAgICAgICAgbmV3TGltaXQgPSBsaW1pdCAtIGFsbFVuc3BlbnRzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0VW5zcGVudHNCYXRjaChuZXdTa2lwLCBuZXdMaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGxVbnNwZW50cztcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gZ2V0VW5zcGVudHNCYXRjaCgwLCBwYXJhbXMubGltaXQpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSB1bnNwZW50cyAocGFnZWQpIGZvciBhIGdpdmVuIHdhbGxldCwgcmV0dXJuaW5nIHRoZSByZXN1bHQgYXMgYW4gb2JqZWN0IG9mIHVuc3BlbnRzLCBjb3VudCwgc2tpcCBhbmQgdG90YWxcbiAqIFRoaXMgbWV0aG9kIG1heSBub3QgcmV0dXJuIGFsbCB0aGUgdW5zcGVudHMgYXMgdGhlIGxpc3QgaXMgcGFnZWQgYnkgdGhlIEFQSVxuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIHBhcmFtcy5saW1pdCB0aGUgb3B0aW9uYWwgbGltaXQgb2YgdW5zcGVudHMgdG8gY29sbGVjdCBpbiBCVENcbiAqIEBwYXJhbSBwYXJhbXMuc2tpcCBpbmRleCBpbiBsaXN0IG9mIHVuc3BlbnRzIHRvIHN0YXJ0IHBhZ2luZyBmcm9tXG4gKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIG9ubHkgaW5jbHVkZSByZXN1bHRzIHdpdGggdGhpcyBudW1iZXIgb2YgY29uZmlybWF0aW9uc1xuICogQHBhcmFtIHBhcmFtcy50YXJnZXQgdGhlIGFtb3VudCBvZiBidGMgdG8gZmluZCB0byBzcGVuZFxuICogQHBhcmFtIHBhcmFtcy5pbnN0YW50IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuICogQHBhcmFtIHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyBkZXNpcmVkIG51bWJlciBvZiB1bnNwZW50cyB0byBoYXZlIGluIHRoZSB3YWxsZXQgYWZ0ZXIgdGhlIHR4IGdvZXMgdGhyb3VnaCAocmVxdWlyZXMgdGFyZ2V0KVxuICogQHBhcmFtIHBhcmFtcy5taW5TaXplIG1pbmltdW0gdW5zcGVudCBzaXplIGluIHNhdG9zaGlzXG4gKiBAcGFyYW0gcGFyYW1zLnNlZ3dpdCByZXF1ZXN0IHNlZ3dpdCB1bnNwZW50cyAoZGVmYXVsdHMgdG8gdHJ1ZSBpZiB1bmRlZmluZWQpXG4gKiBAcGFyYW0gcGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0IGFsbG93IHNlZ3dpdCB1bnNwZW50cyBmb3IgbGVkZ2VyIGRldmljZXMgKGRlZmF1bHRzIHRvIGZhbHNlIGlmIHVuZGVmaW5lZClcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHNQYWdlZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5saW1pdCkgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5za2lwKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5Db25maXJtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluQ29uZmlybXMgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpICYmICFfLmlzTnVtYmVyKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcmdldCAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBmbGFnIC0gc2hvdWxkIGJlIGJvb2xlYW4nKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBmbGFnIC0gc2hvdWxkIGJlIGJvb2xlYW4nKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXJnZXRXYWxsZXRVbnNwZW50cyBmbGFnIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubWluU2l6ZSkgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50OiBtaW5TaXplIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgb25lIG9mIGluc3RhbnQgYW5kIG1pbkNvbmZpcm1zIG1heSBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0V2FsbGV0VW5zcGVudHMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluIGNvbmp1bmN0aW9uIHdpdGggYSB0YXJnZXQnKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudDogYWxsb3dMZWRnZXJTZWd3aXQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkpIHtcbiAgICAvLyBza2lwIGFuZCBsaW1pdCBhcmUgdW5hdmFpbGFibGUgd2hlbiBhIHRhcmdldCBpcyBzcGVjaWZpZWRcbiAgICBkZWxldGUgcXVlcnlPYmplY3Quc2tpcDtcbiAgICBkZWxldGUgcXVlcnlPYmplY3QubGltaXQ7XG4gIH1cblxuICBxdWVyeU9iamVjdC5zZWd3aXQgPSB0cnVlO1xuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICBxdWVyeU9iamVjdC5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkpIHtcbiAgICBxdWVyeU9iamVjdC5hbGxvd0xlZGdlclNlZ3dpdCA9IHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdDtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnlPYmplY3QpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB0cmFuc2FjdGlvbnNcbi8vIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICAgICBUT0RPOiAgQWRkIGl0ZXJhdG9ycyBmb3Igc3RhcnQvY291bnQvZXRjXG5XYWxsZXQucHJvdG90eXBlLnRyYW5zYWN0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbGltaXQ9JyArIHBhcmFtcy5saW1pdCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnc2tpcD0nICsgcGFyYW1zLnNraXApO1xuICB9XG4gIGlmIChwYXJhbXMubWluSGVpZ2h0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWluSGVpZ2h0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkhlaWdodCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21pbkhlaWdodD0nICsgcGFyYW1zLm1pbkhlaWdodCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5tYXhIZWlnaHQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhIZWlnaHQpIHx8IHBhcmFtcy5tYXhIZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4SGVpZ2h0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21heEhlaWdodD0nICsgcGFyYW1zLm1heEhlaWdodCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5taW5Db25maXJtcykge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1pbkNvbmZpcm1zKSB8fCBwYXJhbXMubWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluQ29uZmlybXMgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbWluQ29uZmlybXM9JyArIHBhcmFtcy5taW5Db25maXJtcyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jb21wYWN0KSkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmNvbXBhY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29tcGFjdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdjb21wYWN0PScgKyBwYXJhbXMuY29tcGFjdCk7XG4gIH1cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3R4JyArIHF1ZXJ5KTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB0cmFuc2FjdGlvblxuLy8gR2V0IGEgdHJhbnNhY3Rpb24gYnkgSUQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG5XYWxsZXQucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eC8nICsgcGFyYW1zLmlkKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBwb2xsRm9yVHJhbnNhY3Rpb25cbi8vIFBvbGwgYSB0cmFuc2FjdGlvbiB1bnRpbCBzdWNjZXNzZnVsIG9yIHRpbWVzIG91dFxuLy8gUGFyYW1ldGVyczpcbi8vICAgaWQ6IHRoZSB0eGlkXG4vLyAgIGRlbGF5OiBkZWxheSBiZXR3ZWVuIHBvbGxzIGluIG1zIChkZWZhdWx0OiAxMDAwKVxuLy8gICB0aW1lb3V0OiB0aW1lb3V0IGluIG1zIChkZWZhdWx0OiAxMDAwMClcbldhbGxldC5wcm90b3R5cGUucG9sbEZvclRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuICBpZiAocGFyYW1zLmRlbGF5ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5kZWxheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGVsYXkgcGFyYW1ldGVyJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy50aW1lb3V0ICYmICFfLmlzTnVtYmVyKHBhcmFtcy50aW1lb3V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0aW1lb3V0IHBhcmFtZXRlcicpO1xuICB9XG4gIHBhcmFtcy5kZWxheSA9IHBhcmFtcy5kZWxheSB8fCAxMDAwO1xuICBwYXJhbXMudGltZW91dCA9IHBhcmFtcy50aW1lb3V0IHx8IDEwMDAwO1xuXG4gIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKTtcblxuICBjb25zdCBkb05leHRQb2xsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzZWxmXG4gICAgICAuZ2V0VHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQgfHwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydC52YWx1ZU9mKCkgPiBwYXJhbXMudGltZW91dCkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmx1ZWJpcmQuZGVsYXkocGFyYW1zLmRlbGF5KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZG9OZXh0UG9sbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBkb05leHRQb2xsKCk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWRcbi8vIEdldCBhIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkIGZvciBhIGdpdmVuIHdhbGxldFxuV2FsbGV0LnByb3RvdHlwZS5nZXRXYWxsZXRUcmFuc2FjdGlvbkJ5U2VxdWVuY2VJZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eC9zZXF1ZW5jZS8nICsgcGFyYW1zLnNlcXVlbmNlSWQpO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIEtleSBjaGFpbnNcbi8vIEdldHMgdGhlIHVzZXIga2V5IGNoYWluIGZvciB0aGlzIHdhbGxldFxuLy8gVGhlIHVzZXIga2V5IGNoYWluIGlzIHR5cGljYWxseSB0aGUgZmlyc3Qga2V5Y2hhaW4gb2YgdGhlIHdhbGxldCBhbmQgaGFzIHRoZSBlbmNyeXB0ZWQgeHByaXYgc3RvcmVkIG9uIEJpdEdvLlxuLy8gVXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdXNlcnMnIGtleWNoYWluIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgZGVjcnlwdGluZyB0byBzaWduIGEgdHJhbnNhY3Rpb24uXG5XYWxsZXQucHJvdG90eXBlLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBjbyhmdW5jdGlvbiogKCkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBjbyhmdW5jdGlvbiogKGluZGV4KSB7XG4gICAgICBpZiAoIXNlbGYua2V5Y2hhaW5zIHx8IGluZGV4ID49IHNlbGYua2V5Y2hhaW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ25vX2VuY3J5cHRlZF9rZXljaGFpbl9vbl93YWxsZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyB4cHViOiBzZWxmLmtleWNoYWluc1tpbmRleF0ueHB1YiB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IHlpZWxkIHNlbGYuYml0Z28ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSB4cHJ2LCB0aGVuIHRoaXMgaXMgcHJvYmFibHkgdGhlIHVzZXIga2V5Y2hhaW4gd2UncmUgbG9va2luZyBmb3JcbiAgICAgIGtleWNoYWluLndhbGxldFN1YlBhdGggPSBzZWxmLmtleWNoYWluc1tpbmRleF0ucGF0aDtcbiAgICAgIGlmIChrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnlLZXlDaGFpbihpbmRleCArIDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9KVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLmFzQ2FsbGJhY2soY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZVRyYW5zYWN0aW9uXG4vLyBDcmVhdGUgYSB0cmFuc2FjdGlvbiAodW5zaWduZWQpLiBUbyBzaWduIGl0LCBkbyBzaWduVHJhbnNhY3Rpb25cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHJlY2lwaWVudHMgLSBvYmplY3Qgb2YgcmVjaXBpZW50IGFkZHJlc3NlcyBhbmQgdGhlIGFtb3VudCB0byBzZW5kIHRvIGVhY2ggZS5nLiB7YWRkcmVzczoxNTAwLCBhZGRyZXNzMjoxNTAwfVxuLy8gICBmZWUgICAgICAtIHRoZSBibG9ja2NoYWluIGZlZSB0byBzZW5kIChvcHRpb25hbClcbi8vICAgZmVlUmF0ZSAgLSB0aGUgZmVlIHBlciBrYiB0byBzZW5kIChvcHRpb25hbClcbi8vICAgbWluQ29uZmlybXMgLSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtcyB0byB1c2Ugd2hlbiBnYXRoZXJpbmcgdW5zcGVudHNcbi8vICAgZm9yY2VDaGFuZ2VBdEVuZCAtIGZvcmNlIGNoYW5nZSBhZGRyZXNzIHRvIGJlIGxhc3Qgb3V0cHV0IChvcHRpb25hbClcbi8vICAgbm9TcGxpdENoYW5nZSAtIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuLy8gICBjaGFuZ2VBZGRyZXNzIC0gb3ZlcnJpZGUgdGhlIGNoYW5nZSBhZGRyZXNzIChvcHRpb25hbClcbi8vICAgdmFsaWRhdGUgLSBleHRyYSB2ZXJpZmljYXRpb24gb2YgY2hhbmdlIGFkZHJlc3NlcyAod2hpY2ggYXJlIGFsd2F5cyB2ZXJpZmllZCBzZXJ2ZXItc2lkZSkgKGRlZmF1bHRzIHRvIGdsb2JhbCBjb25maWcpXG4vLyBSZXR1cm5zOlxuLy8gICBjYWxsYmFjayhlcnIsIHsgdHJhbnNhY3Rpb25IZXg6IHN0cmluZywgdW5zcGVudHM6IFtpbnB1dHNdLCBmZWU6IHNhdG9zaGlzIH0pXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChcbiAgICAoIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZSkpIHx8XG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHx8XG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5taW5Db25maXJtcykgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pbkNvbmZpcm1zKSkgfHxcbiAgICAoIV8uaXNCb29sZWFuKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkpIHx8XG4gICAgKCFfLmlzU3RyaW5nKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhbmdlQWRkcmVzcykpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMudmFsaWRhdGUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy52YWxpZGF0ZSkpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICB9XG5cbiAgcGFyYW1zLnZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG4gIHBhcmFtcy53YWxsZXQgPSB0aGlzO1xuXG4gIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzaWduVHJhbnNhY3Rpb25cbi8vIFNpZ24gYSBwcmV2aW91c2x5IGNyZWF0ZWQgdHJhbnNhY3Rpb24gd2l0aCBhIGtleWNoYWluXG4vLyBQYXJhbWV0ZXJzOlxuLy8gdHJhbnNhY3Rpb25IZXggLSBzZXJpYWxpemVkIGZvcm0gb2YgdGhlIHRyYW5zYWN0aW9uIGluIGhleFxuLy8gdW5zcGVudHMgLSBhcnJheSBvZiB1bnNwZW50IGluZm9ybWF0aW9uLCB3aGVyZSBlYWNoIHVuc3BlbnQgaXMgYSBjaGFpblBhdGhcbi8vICAgICAgICAgICAgYW5kIHJlZGVlbVNjcmlwdCB3aXRoIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBpbnB1dHMgaW4gdGhlXG4vLyAgICAgICAgICAgIHRyYW5zYWN0aW9uSGV4XG4vLyBrZXljaGFpbiAtIEtleWNoYWluIGNvbnRhaW5pbmcgdGhlIHhwcnYgdG8gc2lnbiB3aXRoLlxuLy8gc2lnbmluZ0tleSAtIEZvciBsZWdhY3kgc2FmZSB3YWxsZXRzLCB0aGUgcHJpdmF0ZSBrZXkgc3RyaW5nLlxuLy8gdmFsaWRhdGUgLSBleHRyYSB2ZXJpZmljYXRpb24gb2Ygc2lnbmF0dXJlcyAod2hpY2ggYXJlIGFsd2F5cyB2ZXJpZmllZCBzZXJ2ZXItc2lkZSkgKGRlZmF1bHRzIHRvIGdsb2JhbCBjb25maWcpXG4vLyBSZXR1cm5zOlxuLy8gICBjYWxsYmFjayhlcnIsIHRyYW5zYWN0aW9uKVxuV2FsbGV0LnByb3RvdHlwZS5zaWduVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0cmFuc2FjdGlvbkhleCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdGhlIHVuc3BlbnRzIGFycmF5Jyk7XG4gIH1cblxuICBpZiAoKCFfLmlzT2JqZWN0KHBhcmFtcy5rZXljaGFpbikgfHwgIXBhcmFtcy5rZXljaGFpbi54cHJ2KSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuc2lnbmluZ0tleSkpIHtcbiAgICAvLyBhbGxvdyBwYXNzaW5nIGluIGEgV0lGIHByaXZhdGUga2V5IGZvciBsZWdhY3kgc2FmZSB3YWxsZXQgc3VwcG9ydFxuICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBrZXljaGFpbiBvYmplY3Qgd2l0aCB4cHJ2IG9yIHNpZ25pbmdLZXkgV0lGJyk7XG4gICAgZXJyb3IuY29kZSA9ICdtaXNzaW5nX2tleWNoYWluX29yX3NpZ25pbmdLZXknO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcGFyYW1zLnZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG4gIHBhcmFtcy5iaXRnbyA9IHRoaXMuYml0Z287XG4gIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXIuc2lnblRyYW5zYWN0aW9uKHBhcmFtcylcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eDogcmVzdWx0LnRyYW5zYWN0aW9uSGV4LFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kXG4vLyBTZW5kIGEgdHJhbnNhY3Rpb24gdG8gdGhlIEJpdGNvaW4gbmV0d29yayB2aWEgQml0R28uXG4vLyBPbmUgb2YgdGhlIGtleXMgaXMgdHlwaWNhbGx5IHNpZ25lZCwgYW5kIEJpdEdvIHdpbGwgc2lnbiB0aGUgb3RoZXIgKGlmIGFwcHJvdmVkKSBhbmQgcmVsYXkgaXQgdG8gdGhlIFAyUCBuZXR3b3JrLlxuLy8gUGFyYW1ldGVyczpcbi8vICAgdHggIC0gdGhlIGhleCBlbmNvZGVkLCBzaWduZWQgdHJhbnNhY3Rpb24gdG8gc2VuZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eCddLCBbJ21lc3NhZ2UnLCAnb3RwJ10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby51cmwoJy90eC9zZW5kJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihmdW5jdGlvbiAoYm9keSkge1xuICAgICAgaWYgKGJvZHkucGVuZGluZ0FwcHJvdmFsKSB7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZChib2R5LCB7IHN0YXR1czogJ3BlbmRpbmdBcHByb3ZhbCcgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5Lm90cCkge1xuICAgICAgICByZXR1cm4gXy5leHRlbmQoYm9keSwgeyBzdGF0dXM6ICdvdHAnIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdhY2NlcHRlZCcsXG4gICAgICAgIHR4OiBib2R5LnRyYW5zYWN0aW9uLFxuICAgICAgICBoYXNoOiBib2R5LnRyYW5zYWN0aW9uSGFzaCxcbiAgICAgICAgaW5zdGFudDogYm9keS5pbnN0YW50LFxuICAgICAgICBpbnN0YW50SWQ6IGJvZHkuaW5zdGFudElkLFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogU2hhcmUgdGhlIHdhbGxldCB3aXRoIGFuIGV4aXN0aW5nIEJpdEdvIHVzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgcmVjaXBpZW50J3MgdXNlciBpZCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyB1c2VyIHJlY29yZCBpbiBvdXIgZGF0YWJhc2UuXG4gKiBAcGFyYW0ge2tleWNoYWlufSBrZXljaGFpbiBUaGUga2V5Y2hhaW4gdG8gYmUgc2hhcmVkIHdpdGggdGhlIHJlY2lwaWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9ucyBBIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHJlY2lwaWVudCdzIHBlcm1pc3Npb25zIGlmIHRoZSBzaGFyZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHVzZWQgZm9yIHRoaXMgc2hhcmUuXG4gKi9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlU2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgaWYgKFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi54cHViIHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFhwcnYgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4uZnJvbVB1YktleSB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSB4cHViLCBlbmNyeXB0ZWRYcHJ2LCBmcm9tUHViS2V5LCB0b1B1YktleSwgcGF0aCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlSW52aXRlXG4vLyBpbnZpdGUgYSBub24gQml0R28gY3VzdG9tZXIgdG8gam9pbiBhIHdhbGxldFxuLy8gUGFyYW1ldGVyczpcbi8vICAgZW1haWwgLSB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzc1xuLy8gICBwZXJtaXNzaW9ucyAtIHRoZSByZWNpcGllbnQncyBwZXJtaXNzaW9ucyBpZiB0aGUgc2hhcmUgaXMgYWNjZXB0ZWRcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVJbnZpdGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgdG9FbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgIHBlcm1pc3Npb25zOiBwYXJhbXMucGVybWlzc2lvbnMsXG4gIH07XG5cbiAgaWYgKHBhcmFtcy5tZXNzYWdlKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9pbnZpdGUnKSkuc2VuZChvcHRpb25zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY29uZmlybUludml0ZUFuZFNoYXJlV2FsbGV0XG4vLyBjb25maXJtIG15IGludml0ZSBvbiB0aGlzIHdhbGxldCB0byBhIHJlY2lwaWVudCB3aG8gaGFzXG4vLyBzdWJzZXF1ZW50bHkgc2lnbmVkIHVwIGJ5IGNyZWF0aW5nIHRoZSBhY3R1YWwgd2FsbGV0IHNoYXJlXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICB3YWxsZXRJbnZpdGVJZCAtIHRoZSB3YWxsZXQgaW52aXRlIGlkXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSByZXF1aXJlZCBpZiB0aGUgd2FsbGV0IHNoYXJlIHN1Y2Nlc3MgaXMgZXhwZWN0ZWRcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jb25maXJtSW52aXRlQW5kU2hhcmVXYWxsZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0SW52aXRlSWQnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAud2FsbGV0cygpXG4gICAgLmxpc3RJbnZpdGVzKClcbiAgICAudGhlbihmdW5jdGlvbiAoaW52aXRlcykge1xuICAgICAgY29uc3Qgb3V0Z29pbmcgPSBpbnZpdGVzLm91dGdvaW5nO1xuICAgICAgY29uc3QgaW52aXRlID0gXy5maW5kKG91dGdvaW5nLCBmdW5jdGlvbiAob3V0KSB7XG4gICAgICAgIHJldHVybiBvdXQuaWQgPT09IHBhcmFtcy53YWxsZXRJbnZpdGVJZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpbnZpdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXQgaW52aXRlIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlbWFpbDogaW52aXRlLnRvRW1haWwsXG4gICAgICAgIHBlcm1pc3Npb25zOiBpbnZpdGUucGVybWlzc2lvbnMsXG4gICAgICAgIG1lc3NhZ2U6IGludml0ZS5tZXNzYWdlLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzZWxmLnNoYXJlV2FsbGV0KG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldGludml0ZS8nICsgcGFyYW1zLndhbGxldEludml0ZUlkKSk7XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2VuZENvaW5zXG4vLyBTZW5kIGNvaW5zIHRvIGEgZGVzdGluYXRpb24gYWRkcmVzcyBmcm9tIHRoaXMgd2FsbGV0IHVzaW5nIHRoZSB1c2VyIGtleS5cbi8vIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJpdlxuLy8gMi4gRGVjcnlwdHMgdXNlciBrZXlcbi8vIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbi8vIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4vLyAzLiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBhZGRyZXNzIC0gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Ncbi8vICAgYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcyB0byBiZSBzZW50XG4vLyAgIG1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kQ29pbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBwYXJhbXMucmVjaXBpZW50cyA9IHt9O1xuICBwYXJhbXMucmVjaXBpZW50c1twYXJhbXMuYWRkcmVzc10gPSBwYXJhbXMuYW1vdW50O1xuXG4gIHJldHVybiB0aGlzLnNlbmRNYW55KHBhcmFtcykubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2VuZE1hbnlcbi8vIFNlbmQgY29pbnMgdG8gbXVsdGlwbGUgZGVzdGluYXRpb24gYWRkcmVzc2VzIGZyb20gdGhpcyB3YWxsZXQgdXNpbmcgdGhlIHVzZXIga2V5LlxuLy8gMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHhwcml2XG4vLyAyLiBEZWNyeXB0cyB1c2VyIGtleVxuLy8gMy4gQ3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWZhdWx0IGZlZVxuLy8gNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbi8vIDMuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHJlY2lwaWVudHMgLSBhcnJheSBvZiB7IGFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBudW1iZXIsIHRyYXZlbEluZm86IG9iamVjdCB9IHRvIHNlbmQgdG9cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vICAgeHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSwgaWYgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4vLyAgIChTZWUgdHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uIGZvciBvdGhlciBwYXNzdGhyb3VnaCBwYXJhbXMpXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZE1hbnkgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ21lc3NhZ2UnLCAnb3RwJ10sIGNhbGxiYWNrKTtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgb2JqZWN0Jyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWVSYXRlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmluc3RhbnQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaW5zdGFudCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGxldCBiaXRnb0ZlZTtcbiAgbGV0IHRyYXZlbEluZm9zO1xuICBsZXQgZmluYWxSZXN1bHQ7XG4gIGxldCB1bnNwZW50c1VzZWQ7XG5cbiAgY29uc3QgYWNjZXB0ZWRCdWlsZFBhcmFtcyA9IFtcbiAgICAnbnVtQmxvY2tzJyxcbiAgICAnZmVlUmF0ZScsXG4gICAgJ21pbkNvbmZpcm1zJyxcbiAgICAnZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlJyxcbiAgICAndGFyZ2V0V2FsbGV0VW5zcGVudHMnLFxuICAgICdtZXNzYWdlJyxcbiAgICAnbWluVmFsdWUnLFxuICAgICdtYXhWYWx1ZScsXG4gICAgJ25vU3BsaXRDaGFuZ2UnLFxuICAgICdjb21tZW50JyxcbiAgXTtcbiAgY29uc3QgcHJlc2VydmVkQnVpbGRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBhY2NlcHRlZEJ1aWxkUGFyYW1zKTtcblxuICAvLyBHZXQgdGhlIHVzZXIga2V5Y2hhaW5cbiAgY29uc3QgcmV0UHJvbWlzZSA9IHRoaXMuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcylcbiAgICAudGhlbihmdW5jdGlvbiAodHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIFNlbmQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICBiaXRnb0ZlZSA9IHRyYW5zYWN0aW9uLmJpdGdvRmVlO1xuICAgICAgdHJhdmVsSW5mb3MgPSB0cmFuc2FjdGlvbi50cmF2ZWxJbmZvcztcbiAgICAgIHVuc3BlbnRzVXNlZCA9IHRyYW5zYWN0aW9uLnVuc3BlbnRzO1xuICAgICAgcmV0dXJuIHNlbGYuc2VuZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHg6IHRyYW5zYWN0aW9uLnR4LFxuICAgICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgICBvdHA6IHBhcmFtcy5vdHAsXG4gICAgICAgIC8vIFRoZSBiZWxvdyBwYXJhbXMgYXJlIGZvciBsb2dnaW5nIG9ubHksIGFuZCBkbyBub3QgaW1wYWN0IHRoZSBBUEkgY2FsbFxuICAgICAgICBlc3RpbWF0ZWRTaXplOiB0cmFuc2FjdGlvbi5lc3RpbWF0ZWRTaXplLFxuICAgICAgICBidWlsZFBhcmFtczogcHJlc2VydmVkQnVpbGRQYXJhbXMsXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IHR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgocmVzdWx0LnR4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgY29uc3QgaW5wdXRzU3VtID0gXy5zdW1CeSh1bnNwZW50c1VzZWQsICd2YWx1ZScpO1xuICAgICAgY29uc3Qgb3V0cHV0c1N1bSA9IF8uc3VtQnkodHgub3V0cywgJ3ZhbHVlJyk7XG4gICAgICBjb25zdCBmZWVVc2VkID0gaW5wdXRzU3VtIC0gb3V0cHV0c1N1bTtcbiAgICAgIGlmIChpc05hTihmZWVVc2VkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlVXNlZCcpO1xuICAgICAgfVxuICAgICAgKHJlc3VsdC5mZWUgPSBmZWVVc2VkKSwgKHJlc3VsdC5mZWVSYXRlID0gKGZlZVVzZWQgKiAxMDAwKSAvIHR4LnZpcnR1YWxTaXplKCkpO1xuICAgICAgcmVzdWx0LnRyYXZlbEluZm9zID0gdHJhdmVsSW5mb3M7XG4gICAgICBpZiAoYml0Z29GZWUpIHtcbiAgICAgICAgcmVzdWx0LmJpdGdvRmVlID0gYml0Z29GZWU7XG4gICAgICB9XG4gICAgICBmaW5hbFJlc3VsdCA9IHJlc3VsdDtcblxuICAgICAgLy8gSGFuZGxlIHNlbmRpbmcgdHJhdmVsIGluZm9zIGlmIHRoZXkgZXhpc3QsIGJ1dCBtYWtlIHN1cmUgd2UgbmV2ZXIgZmFpbCBoZXJlLlxuICAgICAgLy8gRXJyb3Igb3IgcmVzdWx0ICh3aXRoIHBvc3NpYmxlIHN1Yi1lcnJvcnMpIHdpbGwgYmUgcHJvdmlkZWQgaW4gdHJhdmVsUmVzdWx0XG4gICAgICBpZiAodHJhdmVsSW5mb3MgJiYgdHJhdmVsSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGZcbiAgICAgICAgICAgIC5wb2xsRm9yVHJhbnNhY3Rpb24oeyBpZDogcmVzdWx0Lmhhc2ggfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYml0Z28udHJhdmVsUnVsZSgpLnNlbmRNYW55KHJlc3VsdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSByZXM7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gY2F0Y2ggYXN5bmMgZXJyb3JzXG4gICAgICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHsgZXJyb3I6IGVyci5tZXNzYWdlIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gY2F0Y2ggc3luY2hyb25vdXMgZXJyb3JzXG4gICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0geyBlcnJvcjogZXJyLm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0O1xuICAgIH0pO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShyZXRQcm9taXNlKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQWNjZWxlcmF0ZSBhIHN0dWNrIHRyYW5zYWN0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUCkuXG4gKlxuICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzdHVjayB0cmFuc2FjdGlvbnMgd2hpY2ggaGF2ZSBubyB1bmNvbmZpcm1lZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIElucHV0IHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHJhbnNhY3Rpb25JRCAtIElEIG9mIHRyYW5zYWN0aW9uIHRvIGFjY2VsZXJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIE5ldyBlZmZlY3RpdmUgZmVlIHJhdGUgZm9yIHN0dWNrIHRyYW5zYWN0aW9uIChzYXQgcGVyIDEwMDAgYnl0ZXMpXG4gKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyAtIE1heGltdW0gYWRkaXRpb25hbCB1bnNwZW50cyB0byB1c2UgZnJvbSB0aGUgd2FsbGV0IHRvIGNvdmVyIGFueSBjaGlsZCBmZWVzIHRoYXQgdGhlIHBhcmVudCB1bnNwZW50IG91dHB1dCBjYW5ub3QgY292ZXIuIERlZmF1bHRzIHRvIDEwMC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHdhbGxldCBwcml2YXRlIGtleS4gT25lIG9mIGVpdGhlciB3YWxsZXRQYXNzcGhyYXNlIG9yIHhwcnYgaXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSBUaGUgcHJpdmF0ZSBrZXkgZm9yIHRoZSB3YWxsZXQuIE9uZSBvZiBlaXRoZXIgd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGlzIHJlcXVpcmVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIFJlc3VsdCBvZiBzZW5kVHJhbnNhY3Rpb24oKSBvbiB0aGUgY2hpbGQgdHJhbnNhY3Rpb25cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5hY2NlbGVyYXRlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBhY2NlbGVyYXRlVHJhbnNhY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBlc3RpbWF0ZSBhIHRyYW5zYWN0aW9ucyBzaXplIGluIHZpcnR1YWwgYnl0ZXMuXG4gICAqIEFjdHVhbCB0cmFuc2FjdGlvbnMgbWF5IGJlIHNsaWdodGx5IGZld2VyIHZpcnR1YWwgYnl0ZXMsIGR1ZSB0b1xuICAgKiB0aGUgZmFjdCB0aGF0IHZhbGlkIEVDU0RBIHNpZ25hdHVyZXMgaGF2ZSBhIHZhcmlhYmxlIGxlbmd0aFxuICAgKiBiZXR3ZWVuIDggYW5kIDczIHZpcnR1YWwgYnl0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMuc2Vnd2l0IFRoZSBudW1iZXIgb2Ygc2Vnd2l0IGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGlucHV0cy5QMlNIIFRoZSBudW1iZXIgb2YgUDJTSCBpbnB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBpbnB1dHMuUDJQS0ggVGhlIG51bWJlciBvZiBQMlBLSCBpbnB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBjb25zdCBlc3RpbWF0ZVR4VlNpemUgPSAoaW5wdXRzKSA9PiB7XG4gICAgY29uc3Qgc2Vnd2l0ID0gaW5wdXRzLnNlZ3dpdCB8fCAwO1xuICAgIGNvbnN0IFAyU0ggPSBpbnB1dHMuUDJTSCB8fCAwO1xuICAgIGNvbnN0IFAyUEtIID0gaW5wdXRzLlAyUEtIIHx8IDA7XG5cbiAgICBjb25zdCBjaGlsZEZlZUluZm8gPSBUcmFuc2FjdGlvbkJ1aWxkZXIuY2FsY3VsYXRlTWluZXJGZWVJbmZvKHtcbiAgICAgIG5QMnNoSW5wdXRzOiBQMlNILFxuICAgICAgblAycGtoSW5wdXRzOiBQMlBLSCxcbiAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHNlZ3dpdCxcbiAgICAgIG5PdXRwdXRzOiAxLFxuICAgICAgZmVlUmF0ZTogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjaGlsZEZlZUluZm8uc2l6ZTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhhdCBzaG91bGQgYmUgcGFpZCBpbiBmZWVzIGJ5IHRoZSBjaGlsZCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIElucHV0cyB0byB0aGUgY2hpbGQgdHJhbnNhY3Rpb24gd2hpY2ggYXJlIHBhc3NlZCB0byBlc3RpbWF0ZVR4VlNpemVcbiAgICogQHBhcmFtIHBhcmVudEZlZSBUaGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoZSBwYXJlbnQgdHggb3JpZ2luYWxseSBwYWlkIGluIGZlZXNcbiAgICogQHBhcmFtIHBhcmVudFZTaXplIFRoZSBudW1iZXIgb2YgdmlydHVhbCBieXRlcyBpbiB0aGUgcGFyZW50IHR4XG4gICAqIEBwYXJhbSBmZWVSYXRlIFRoZSBuZXcgZmVlIHJhdGUgd2hpY2ggc2hvdWxkIGJlIHBhaWQgYnkgdGhlIGNvbWJpbmVkIENQRlAgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgY2hpbGQgdHggc2hvdWxkIHBheSBpbiBmZWVzXG4gICAqL1xuICBjb25zdCBlc3RpbWF0ZUNoaWxkRmVlID0gKHsgaW5wdXRzLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBmZWVSYXRlIH0pID0+IHtcbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggbW9yZSB3ZSAqc2hvdWxkKiBoYXZlIHBhaWQgaW4gcGFyZW50IGZlZXMsXG4gICAgLy8gaGFkIHRoZSBwYXJlbnQgYmVlbiBvcmlnaW5hbGx5IHNlbnQgd2l0aCB0aGUgbmV3IGZlZSByYXRlXG4gICAgY29uc3QgYWRkaXRpb25hbFBhcmVudEZlZSA9IF8uY2VpbCgocGFyZW50VlNpemUgKiBmZWVSYXRlKSAvIDEwMDApIC0gcGFyZW50RmVlO1xuXG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIHdlIHdvdWxkIHBheSBpbiBmZWVzIGZvciB0aGUgY2hpbGQsXG4gICAgLy8gaWYgaXQgd2VyZSBvbmx5IHBheWluZyBmb3IgaXRzZWxmIGF0IHRoZSBuZXcgZmVlIHJhdGVcbiAgICBjb25zdCBjaGlsZEZlZSA9IChlc3RpbWF0ZVR4VlNpemUoaW5wdXRzKSAqIGZlZVJhdGUpIC8gMTAwMDtcblxuICAgIHJldHVybiBfLmNlaWwoY2hpbGRGZWUgKyBhZGRpdGlvbmFsUGFyZW50RmVlKTtcbiAgfTtcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyB0byB1c2UgdG8gcGF5IHRoZSBjaGlsZCB0eCBmZWVzLlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB0aGUgcGFyZW50IHR4IG91dHB1dCBpcyBub3Qgc3VmZmljaWVudCB0b1xuICAgKiBjb3ZlciB0aGUgdG90YWwgZmVlcyB3aGljaCBzaG91bGQgYmUgcGFpZCBieSB0aGUgY2hpbGQgdHguXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXRzIHRvIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiB3aGljaCBhcmUgcGFzc2VkIHRvIGVzdGltYXRlVHhWU2l6ZVxuICAgKiBAcGFyYW0gcGFyZW50T3V0cHV0VmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBvdXRwdXQgZnJvbSB0aGUgcGFyZW50IHR4IHdoaWNoIHdlIGFyZSB1c2luZyBhcyBhbiBpbnB1dCB0byB0aGUgY2hpbGQgdHhcbiAgICogQHBhcmFtIHBhcmVudEZlZSBUaGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoZSBwYXJlbnQgdHggb3JpZ2luYWxseSBwYWlkIGluIGZlZXNcbiAgICogQHBhcmFtIHBhcmVudFZTaXplIFRoZSBudW1iZXIgb2YgdmlydHVhbCBieXRlcyBpbiB0aGUgcGFyZW50IHR4XG4gICAqIEBwYXJhbSBtYXhVbnNwZW50cyBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWRkaXRpb25hbCB1bnNwZW50cyB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBjb3ZlciB0aGUgcmVtYWluaW5nIGNoaWxkIGZlZXNcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlLCB0aGUgdXBkYXRlZCBudW1iZXIgb2Ygc2F0b3NoaXMgd2hpY2ggc2hvdWxkIGJlIHBhaWQgYnlcbiAgICogICAgICAgICAgdGhlIGNoaWxkIHR4LCBhbmQgdGhlIHVwZGF0ZWQgaW5wdXRzIGZvciB0aGUgY2hpbGQgdHguXG4gICAqL1xuICBjb25zdCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzID0gKHsgaW5wdXRzLCBwYXJlbnRPdXRwdXRWYWx1ZSwgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgbWF4VW5zcGVudHMgfSkgPT4ge1xuICAgIHJldHVybiBjbyhmdW5jdGlvbiogY29GaW5kQWRkaXRpb25hbFVuc3BlbnRzKCkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAvLyBhc2sgdGhlIHNlcnZlciBmb3IgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWUsIGFzc3VtaW5nXG4gICAgICAvLyB0aGF0IGl0IGNhbiBiZSBkb25lIHdpdGhvdXQgYWRkaXRpb25hbCB1bnNwZW50cyAod2hpY2ggaXMgbm90IHBvc3NpYmxlLFxuICAgICAgLy8gc2luY2UgaWYgdGhhdCB3ZXJlIHRoZSBjYXNlLCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzIHdvdWxkIG5vdCBoYXZlIGJlZW5cbiAgICAgIC8vIGNhbGxlZCBpbiB0aGUgZmlyc3QgcGxhY2UuIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgYmVmb3JlIHJldHVybmluZylcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgbGV0IHVuY292ZXJlZENoaWxkRmVlID0gY3VycmVudENoaWxkRmVlRXN0aW1hdGUgLSBwYXJlbnRPdXRwdXRWYWx1ZTtcblxuICAgICAgd2hpbGUgKHVuY292ZXJlZENoaWxkRmVlID4gMCAmJiBhZGRpdGlvbmFsVW5zcGVudHMubGVuZ3RoIDwgbWF4VW5zcGVudHMpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGdldCBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkIGZlZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9ICh5aWVsZCB0aGlzLnVuc3BlbnRzKHtcbiAgICAgICAgICBtaW5Db25maXJtczogMSxcbiAgICAgICAgICB0YXJnZXQ6IHVuY292ZXJlZENoaWxkRmVlLFxuICAgICAgICAgIGxpbWl0OiBtYXhVbnNwZW50cyAtIGFkZGl0aW9uYWxVbnNwZW50cy5sZW5ndGgsXG4gICAgICAgIH0pKSBhcyBhbnk7XG5cbiAgICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgdW5zcGVudHMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFkZGl0aW9uYWxVbnNwZW50VmFsdWUgPSAwO1xuXG4gICAgICAgIC8vIGNvbnN1bWUgYWxsIHVuc3BlbnRzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIsIGV2ZW4gaWYgd2UgZG9uJ3QgbmVlZFxuICAgICAgICAvLyBhbGwgb2YgdGhlbSB0byBjb3ZlciB0aGUgY2hpbGQgZmVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNlcnZlciB3aWxsXG4gICAgICAgIC8vIHJldHVybiBlbm91Z2ggdW5zcGVudCB2YWx1ZSB0byBlbnN1cmUgdGhhdCB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50XG4gICAgICAgIC8vIGlzIGFjaGlldmVkIGZvciB0aGUgY2hpbGQgdHgsIGFuZCB3ZSBjYW4ndCBsZWF2ZSBvdXQgdGhvc2UgdW5zcGVudHNcbiAgICAgICAgLy8gb3IgZWxzZSB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50IGNvbnN0cmFpbnQgY291bGQgYmUgdmlvbGF0ZWRcbiAgICAgICAgXy5mb3JFYWNoKHVuc3BlbnRzLCAodW5zcGVudCkgPT4ge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY2hpbGQgdHggaW5wdXRzXG4gICAgICAgICAgY29uc3QgdW5zcGVudENoYWluID0gZ2V0Q2hhaW4odW5zcGVudCk7XG4gICAgICAgICAgaWYgKGlzQ2hhaW5Db2RlKHVuc3BlbnRDaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnRDaGFpbikgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICAgICAgICBpbnB1dHMuc2Vnd2l0Kys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0cy5QMlNIKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRzLnB1c2godW5zcGVudCk7XG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRWYWx1ZSArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgICB1bmNvdmVyZWRDaGlsZEZlZSA9IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlIC0gcGFyZW50T3V0cHV0VmFsdWUgLSBhZGRpdGlvbmFsVW5zcGVudFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5jb3ZlcmVkQ2hpbGRGZWUgPiAwKSB7XG4gICAgICAgIC8vIFVuYWJsZSB0byBmaW5kIGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgY2hpbGQgZmVlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdWZmaWNpZW50IGNvbmZpcm1lZCB1bnNwZW50cyBhdmFpbGFibGUgdG8gY292ZXIgdGhlIGNoaWxkIGZlZWApO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3VuZCBlbm91Z2ggdW5zcGVudHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZGl0aW9uYWw6IGFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgbmV3Q2hpbGRGZWU6IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlLFxuICAgICAgICBuZXdJbnB1dHM6IGlucHV0cyxcbiAgICAgIH07XG4gICAgfSkuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhIGZ1bGwgY29weSAoaW5jbHVkaW5nIHdpdG5lc3MgZGF0YSkgb2YgYW4gYXJiaXRyYXJ5IHR4IHVzaW5nIG9ubHkgdGhlIHR4IGlkLlxuICAgKlxuICAgKiBXZSBoYXZlIHRvIHVzZSBhbiBleHRlcm5hbCBzZXJ2aWNlIGZvciB0aGlzIChjdXJyZW50bHkgYmxvY2tzdHJlYW0uaW5mbyksIHNpbmNlXG4gICAqIHRoZSB2MSBpbmRleGVyIHNlcnZpY2UgKGJhc2VkIG9uIGJpdGNvaW5qKSBkb2VzIG5vdCBoYXZlIHNlZ3dpdCBzdXBwb3J0IGFuZFxuICAgKiBkb2VzIG5vdCByZXR1cm4gYW55IHNlZ3dpdCByZWxhdGVkIGZpZWxkcyBpbiB0aGUgdHggaGV4LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyZW50VHhJZCBUaGUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uIHRvIGdldCB0aGUgZnVsbCBoZXggb2ZcbiAgICogQHJldHVybnMge0JsdWViaXJkPGFueT59IFRoZSBmdWxsIGhleCBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UGFyZW50VHhIZXgoeyBwYXJlbnRUeElkIH06IHsgcGFyZW50VHhJZDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGV4cGxvcmVyQmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbc2VsZi5iaXRnby5nZXRFbnYoKV0uYnRjRXhwbG9yZXJCYXNlVXJsO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcXVlc3QuZ2V0KGAke2V4cGxvcmVyQmFzZVVybH0vdHgvJHtwYXJlbnRUeElkfS9oZXhgKTtcblxuICAgIGlmICghcmVzdWx0LnRleHQgfHwgIS8oW2EtZjAtOV17Mn0pKy8udGVzdChyZXN1bHQudGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3Qgc3VjY2Vzc2Z1bGx5IHJlY2VpdmUgcGFyZW50IHR4IGhleC4gUmVjZWl2ZWQgJyR7Xy50cnVuY2F0ZShyZXN1bHQudGV4dCwgeyBsZW5ndGg6IDEwMCB9KX0nIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgY2hhaW4gZnJvbSBhbiB1bnNwZW50IG9yIHR4IG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dE9yVW5zcGVudCBUaGUgb3V0cHV0IG9yIHVuc3BlbnQgd2hvc2UgY2hhaW4gc2hvdWxkIGJlIGRldGVybWluZWRcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGNoYWluIGZvciB0aGUgZ2l2ZW4gb3V0cHV0IG9yIHVuc3BlbnRcbiAgICovXG4gIGNvbnN0IGdldENoYWluID0gKG91dHB1dE9yVW5zcGVudCkgPT4ge1xuICAgIGlmIChvdXRwdXRPclVuc3BlbnQuY2hhaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG91dHB1dE9yVW5zcGVudC5jaGFpbjtcbiAgICB9XG5cbiAgICBpZiAob3V0cHV0T3JVbnNwZW50LmNoYWluUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gXy50b051bWJlcihvdXRwdXRPclVuc3BlbnQuY2hhaW5QYXRoLnNwbGl0KCcvJylbMV0pO1xuICAgIH1cblxuICAgIC8vIG5vIHdheSB0byB0ZWxsIHRoZSBjaGFpbiwgbGV0J3MganVzdCBibG93IHVwIG5vdyBpbnN0ZWFkXG4gICAgLy8gb2YgYmxvd2luZyB1cCBsYXRlciB3aGVuIHRoZSB1bmRlZmluZWQgcmV0dXJuIHZhbHVlIGlzIHVzZWQuXG4gICAgLy8gTm90ZTogZm9yIHVuc3BlbnRzIHRoZSBmaWVsZCB0byB1c2UgaXMgJ2FkZHJlc3MnLCBidXQgZm9yIG91dHB1dHNcbiAgICAvLyB0aGUgZmllbGQgdG8gdXNlIGlzICdhY2NvdW50J1xuICAgIHRocm93IEVycm9yKGBDb3VsZCBub3QgZ2V0IGNoYWluIGZvciBvdXRwdXQgb24gYWNjb3VudCAke291dHB1dE9yVW5zcGVudC5hY2NvdW50IHx8IG91dHB1dE9yVW5zcGVudC5hZGRyZXNzfWApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBhY3R1YWwgdmFsdWUgY29udHJpYnV0aW9uIGFuIG91dHB1dCBvciB1bnNwZW50IHdpbGxcbiAgICogY29udHJpYnV0ZSB0byBhIHRyYW5zYWN0aW9uLCB3ZXJlIGl0IHRvIGJlIHVzZWQuIEVhY2ggdHlwZSBvZiBvdXRwdXQgb3IgdW5zcGVudFxuICAgKiB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgY29udHJpYnV0aW9uIHNpbmNlIGVhY2ggdHlwZSBoYXMgYSBkaWZmZXJlbnQgbnVtYmVyXG4gICAqIG9mIHZpcnR1YWwgYnl0ZXMsIGFuZCB0aHVzIHdpbGwgY2F1c2UgYSBkaWZmZXJlbnQgZmVlIHRvIGJlIHBhaWQuXG4gICAqXG4gICAqIEBwYXJhbSBvdXRwdXRPclVuc3BlbnQgT3V0cHV0IG9yIHVuc3BlbnQgd2hvc2UgZWZmZWN0aXZlIHZhbHVlIHNob3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBhY3R1YWwgbnVtYmVyIG9mIHNhdG9zaGlzIHRoYXQgdGhpcyB1bnNwZW50IG9yIG91dHB1dFxuICAgKiAgICAgICAgICAgICAgICAgICB3b3VsZCBjb250cmlidXRlIHRvIGEgdHJhbnNhY3Rpb24sIHdlcmUgaXQgdG8gYmUgdXNlZC5cbiAgICovXG4gIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gKG91dHB1dE9yVW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IGNoYWluID0gZ2V0Q2hhaW4ob3V0cHV0T3JVbnNwZW50KTtcbiAgICBpZiAoaXNDaGFpbkNvZGUoY2hhaW4pICYmIHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbikgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICAvLyBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgaXMgaW4gYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrQlxuICAgICAgcmV0dXJuIG91dHB1dE9yVW5zcGVudC52YWx1ZSAtIChWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwO1xuICAgIH1cbiAgICAvLyBWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplIGlzIGluIGJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8ga0JcbiAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LnZhbHVlIC0gKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb3JvdXRpbmUgd2hpY2ggYWN0dWFsbHkgaW1wbGVtZW50cyB0aGUgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uIGFsZ29yaXRobVxuICAgKlxuICAgKiBEZXNjcmliZWQgYXQgYSBoaWdoIGxldmVsLCB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gICAqIDEpIEZpbmQgYXBwcm9wcmlhdGUgb3V0cHV0IGZyb20gcGFyZW50IHRyYW5zYWN0aW9uIHRvIHVzZSBhcyBjaGlsZCB0cmFuc2FjdGlvbiBpbnB1dFxuICAgKiAyKSBGaW5kIHVuc3BlbnQgY29ycmVzcG9uZGluZyB0byBwYXJlbnQgdHJhbnNhY3Rpb24gb3V0cHV0LiBJZiBub3QgZm91bmQsIHJldHVybiB0byBzdGVwIDEuXG4gICAqIDMpIERldGVybWluZSBpZiBwYXJlbnQgdHJhbnNhY3Rpb24gdW5zcGVudCBjYW4gY292ZXIgZW50aXJlIGNoaWxkIGZlZSwgcGx1cyBtaW5pbXVtIGNoYW5nZVxuICAgKiA0KSBJZiB5ZXMsIGdvIHRvIHN0ZXAgNlxuICAgKiA1KSBPdGhlcndpc2UsIGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyBmcm9tIHRoZSB3YWxsZXQgdG8gdXNlIHRvIGNvdmVyIHRoZSByZW1haW5pbmcgY2hpbGQgZmVlXG4gICAqIDYpIENyZWF0ZSBhbmQgc2lnbiB0aGUgY2hpbGQgdHJhbnNhY3Rpb24sIHVzaW5nIHRoZSBwYXJlbnQgdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqICAgIChhbmQsIGlmIG5lY2Vzc2FyeSwgYWRkaXRpb25hbCB3YWxsZXQgdW5zcGVudHMpIGFzIGlucHV0c1xuICAgKiA3KSBCcm9hZGNhc3QgdGhlIG5ldyBjaGlsZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgcmV0dXJuIGNvKGZ1bmN0aW9uKiBjb0FjY2VsZXJhdGVUcmFuc2FjdGlvbigpOiBhbnkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3RyYW5zYWN0aW9uSUQnXSwgW10sIGNhbGxiYWNrKTtcblxuICAgIC8vIHZhbGlkYXRlIGZlZSByYXRlXG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXI6IGZlZVJhdGUnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRmluaXRlKHBhcmFtcy5mZWVSYXRlKSB8fCBwYXJhbXMuZmVlUmF0ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyIGZvciBwYXJhbWV0ZXI6IGZlZVJhdGUnKTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBtYXhVbnNwZW50c1xuICAgIGlmIChwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGJ5IGRlZmF1bHQsIHVzZSBhdCBtb3N0IDEwMCBhZGRpdGlvbmFsIHVuc3BlbnRzIChub3QgaW5jbHVkaW5nIHRoZSB1bnNwZW50IG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgdHgpXG4gICAgICBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzID0gMTAwO1xuICAgIH1cblxuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cykgfHwgcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyA8PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignRXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXIgZm9yIHBhcmFtZXRlcjogbWF4QWRkaXRpb25hbFVuc3BlbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBwYXJlbnRUeCA9IHlpZWxkIHRoaXMuZ2V0VHJhbnNhY3Rpb24oeyBpZDogcGFyYW1zLnRyYW5zYWN0aW9uSUQgfSk7XG4gICAgaWYgKHBhcmVudFR4LmNvbmZpcm1hdGlvbnMgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9IGlzIGFscmVhZHkgY29uZmlybWVkIGFuZCBjYW5ub3QgYmUgYWNjZWxlcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIG91dHB1dHMgZnJvbSB0aGUgcGFyZW50IHR4IHdoaWNoIGFyZSB0byBvdXIgd2FsbGV0XG4gICAgY29uc3Qgd2FsbGV0T3V0cHV0cyA9IF8uZmlsdGVyKHBhcmVudFR4Lm91dHB1dHMsIChvdXRwdXQpID0+IG91dHB1dC5pc01pbmUpO1xuXG4gICAgaWYgKHdhbGxldE91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2FjdGlvbiAke3BhcmFtcy50cmFuc2FjdGlvbklEfSBjb250YWlucyBubyBvdXRwdXRzIHRvIHRoaXMgd2FsbGV0LCBhbmQgdGh1cyBjYW5ub3QgYmUgYWNjZWxlcmF0ZWRgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHVzZSBhbiBvdXRwdXQgZnJvbSB0aGUgcGFyZW50IHdpdGggbGFyZ2VzdCBlZmZlY3RpdmUgdmFsdWUsXG4gICAgLy8gYnV0IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgb3V0cHV0IGlzIGFjdHVhbGx5IHVuc3BlbnQuXG4gICAgLy8gQW4gb3V0cHV0IGNvdWxkIGJlIHNwZW50IGFscmVhZHkgaWYgdGhlIG91dHB1dCB3YXMgdXNlZCBpbiBhXG4gICAgLy8gY2hpbGQgdHggd2hpY2ggaXRzZWxmIGhhcyBiZWNvbWUgc3R1Y2sgZHVlIHRvIGxvdyBmZWVzIGFuZCBpc1xuICAgIC8vIGFsc28gdW5jb25maXJtZWQuXG4gICAgY29uc3Qgc29ydGVkT3V0cHV0cyA9IF8uc29ydEJ5KHdhbGxldE91dHB1dHMsIGVmZmVjdGl2ZVZhbHVlKTtcbiAgICBsZXQgcGFyZW50VW5zcGVudFRvVXNlO1xuICAgIGxldCBvdXRwdXRUb1VzZTtcblxuICAgIHdoaWxlIChzb3J0ZWRPdXRwdXRzLmxlbmd0aCA+IDAgJiYgcGFyZW50VW5zcGVudFRvVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dHB1dFRvVXNlID0gc29ydGVkT3V0cHV0cy5wb3AoKTtcblxuICAgICAgLy8gZmluZCB0aGUgdW5zcGVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFydGljdWxhciBvdXRwdXRcbiAgICAgIC8vIFRPRE86IGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBnZXQgdGhpcyB1bnNwZW50P1xuICAgICAgLy8gVE9ETzogVGhlIGJlc3Qgd2UgY2FuIGRvIGhlcmUgaXMgc2V0IG1pblNpemUgPSBtYXhTaXplID0gb3V0cHV0VG9Vc2UudmFsdWVcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBjb25zdCB1bnNwZW50c1Jlc3VsdCA9IHlpZWxkIHRoaXMudW5zcGVudHMoe1xuICAgICAgICBtaW5TaXplOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgICAgbWF4U2l6ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICB9KTtcblxuICAgICAgcGFyZW50VW5zcGVudFRvVXNlID0gXy5maW5kKHVuc3BlbnRzUmVzdWx0LCAodW5zcGVudCkgPT4ge1xuICAgICAgICAvLyBtYWtlIHN1cmUgdW5zcGVudCBiZWxvbmdzIHRvIHRoZSBnaXZlbiB0eGlkXG4gICAgICAgIGlmICh1bnNwZW50LnR4X2hhc2ggIT09IHBhcmFtcy50cmFuc2FjdGlvbklEKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB1bnNwZW50IGhhcyBjb3JyZWN0IHZfb3V0IGluZGV4XG4gICAgICAgIHJldHVybiB1bnNwZW50LnR4X291dHB1dF9uID09PSBvdXRwdXRUb1VzZS52b3V0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudFVuc3BlbnRUb1VzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHVuc3BlbnQgb3V0cHV0IGZyb20gcGFyZW50IHR4IHRvIHVzZSBhcyBjaGlsZCBpbnB1dGApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgZnVsbCBoZXggZm9yIHRoZSBwYXJlbnQgdHggYW5kIGRlY29kZSBpdCB0byBnZXQgaXRzIHZzaXplXG4gICAgY29uc3QgcGFyZW50VHhIZXggPSB5aWVsZCBnZXRQYXJlbnRUeEhleCh7IHBhcmVudFR4SWQ6IHBhcmFtcy50cmFuc2FjdGlvbklEIH0pO1xuICAgIGNvbnN0IGRlY29kZWRQYXJlbnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChwYXJlbnRUeEhleCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICBjb25zdCBwYXJlbnRWU2l6ZSA9IGRlY29kZWRQYXJlbnQudmlydHVhbFNpemUoKTtcblxuICAgIC8vIG1ha2Ugc3VyZSBpZCBmcm9tIGRlY29kZWQgdHggYW5kIGdpdmVuIHR4IGlkIG1hdGNoXG4gICAgLy8gdGhpcyBzaG91bGQgY2F0Y2ggcHJvYmxlbXMgZW1hbmF0aW5nIGZyb20gdGhlIHVzZSBvZiBhbiBleHRlcm5hbCBzZXJ2aWNlXG4gICAgLy8gZm9yIGdldHRpbmcgdGhlIGNvbXBsZXRlIHBhcmVudCB0eCBoZXhcbiAgICBpZiAoZGVjb2RlZFBhcmVudC5nZXRJZCgpICE9PSBwYXJhbXMudHJhbnNhY3Rpb25JRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGVjb2RlZCB0cmFuc2FjdGlvbiBpZCBpcyAke2RlY29kZWRQYXJlbnQuZ2V0SWQoKX0sIHdoaWNoIGRvZXMgbm90IG1hdGNoIGdpdmVuIHR4aWQgJHtwYXJhbXMudHJhbnNhY3Rpb25JRH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSBuZXcgZmVlIHJhdGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBwYXJlbnQncyBjdXJyZW50IGZlZSByYXRlXG4gICAgLy8gdmlydHVhbFNpemUgaXMgcmV0dXJuZWQgaW4gdmJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8ga3ZCXG4gICAgY29uc3QgcGFyZW50UmF0ZSA9ICgxMDAwICogcGFyZW50VHguZmVlKSAvIHBhcmVudFZTaXplO1xuICAgIGlmIChwYXJhbXMuZmVlUmF0ZSA8PSBwYXJlbnRSYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgbG93ZXIgZmVlIHJhdGUhIChQYXJlbnQgdHggZmVlIHJhdGUgaXMgJHtwYXJlbnRSYXRlfSBzYXQva0IsIGFuZCByZXF1ZXN0ZWQgZmVlIHJhdGUgd2FzICR7cGFyYW1zLmZlZVJhdGV9IHNhdC9rQilgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGRldGVybWluZSBpZiBwYXJlbnQgb3V0cHV0IGNhbiBjb3ZlciBjaGlsZCBmZWVcbiAgICBjb25zdCBpc1BhcmVudE91dHB1dFNlZ3dpdCA9XG4gICAgICBpc0NoYWluQ29kZShvdXRwdXRUb1VzZS5jaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKG91dHB1dFRvVXNlLmNoYWluKSA9PT0gJ3Ayc2hQMndzaCc7XG5cbiAgICBsZXQgY2hpbGRJbnB1dHMgPSB7XG4gICAgICBzZWd3aXQ6IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID8gMSA6IDAsXG4gICAgICBQMlNIOiBpc1BhcmVudE91dHB1dFNlZ3dpdCA/IDAgOiAxLFxuICAgIH07XG5cbiAgICBsZXQgY2hpbGRGZWUgPSBlc3RpbWF0ZUNoaWxkRmVlKHtcbiAgICAgIGlucHV0czogY2hpbGRJbnB1dHMsXG4gICAgICBwYXJlbnRGZWU6IHBhcmVudFR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlLFxuICAgICAgcGFyZW50VlNpemUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB1bnNwZW50c1RvVXNlID0gW3BhcmVudFVuc3BlbnRUb1VzZV07XG5cbiAgICAvLyB0cnkgdG8gZ2V0IHRoZSBtaW4gY2hhbmdlIHNpemUgZnJvbSB0aGUgc2VydmVyLCBvdGhlcndpc2UgZGVmYXVsdCB0byAwLjEgQlRDXG4gICAgLy8gVE9ETzogbWluQ2hhbmdlU2l6ZSBpcyBub3QgY3VycmVudGx5IGEgY29uc3RhbnQgZGVmaW5lZCBvbiB0aGUgY2xpZW50IGFuZCBzaG91bGQgYmUgYWRkZWRcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IG1pbkNoYW5nZVNpemUgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLm1pbkNoYW5nZVNpemUgfHwgMWU3O1xuXG4gICAgaWYgKG91dHB1dFRvVXNlLnZhbHVlIDwgY2hpbGRGZWUgKyBtaW5DaGFuZ2VTaXplKSB7XG4gICAgICAvLyBwYXJlbnQgb3V0cHV0IGNhbm5vdCBjb3ZlciBjaGlsZCBmZWUgcGx1cyB0aGUgbWluaW11bSBjaGFuZ2UsXG4gICAgICAvLyBtdXN0IGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyB0byBjb3ZlciB0aGUgZGlmZmVyZW5jZVxuICAgICAgY29uc3QgeyBhZGRpdGlvbmFsLCBuZXdDaGlsZEZlZSwgbmV3SW5wdXRzIH0gPSB5aWVsZCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzKHtcbiAgICAgICAgaW5wdXRzOiBjaGlsZElucHV0cyxcbiAgICAgICAgcGFyZW50T3V0cHV0VmFsdWU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgICBwYXJlbnRGZWU6IHBhcmVudFR4LmZlZSxcbiAgICAgICAgbWF4VW5zcGVudHM6IHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMsXG4gICAgICAgIHBhcmVudFZTaXplLFxuICAgICAgfSk7XG4gICAgICBjaGlsZEZlZSA9IG5ld0NoaWxkRmVlO1xuICAgICAgY2hpbGRJbnB1dHMgPSBuZXdJbnB1dHM7XG4gICAgICB1bnNwZW50c1RvVXNlLnB1c2goLi4uYWRkaXRpb25hbCk7XG4gICAgfVxuXG4gICAgLy8gc2FuaXR5IGNoZWNrIHRoZSBmZWUgcmF0ZSB3ZSdyZSBwYXlpbmcgZm9yIHRoZSBjb21iaW5lZCB0eFxuICAgIC8vIHRvIG1ha2Ugc3VyZSBpdCdzIHVuZGVyIHRoZSBtYXggZmVlIHJhdGUuIE9ubHkgdGhlIGNoaWxkIHR4XG4gICAgLy8gY2FuIGJyZWFrIHRoaXMgbGltaXQsIGJ1dCB0aGUgY29tYmluZWQgdHggc2hhbGwgbm90XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBtYXhGZWVSYXRlID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5tYXhGZWVSYXRlO1xuICAgIGNvbnN0IGNoaWxkVlNpemUgPSBlc3RpbWF0ZVR4VlNpemUoY2hpbGRJbnB1dHMpO1xuICAgIGNvbnN0IGNvbWJpbmVkVlNpemUgPSBjaGlsZFZTaXplICsgcGFyZW50VlNpemU7XG4gICAgY29uc3QgY29tYmluZWRGZWUgPSBwYXJlbnRUeC5mZWUgKyBjaGlsZEZlZTtcbiAgICAvLyBjb21iaW5lZCBmZWUgcmF0ZSBtdXN0IGJlIGluIHNhdC9rQiwgc28gd2UgbmVlZCB0byBjb252ZXJ0XG4gICAgY29uc3QgY29tYmluZWRGZWVSYXRlID0gKDEwMDAgKiBjb21iaW5lZEZlZSkgLyBjb21iaW5lZFZTaXplO1xuXG4gICAgaWYgKGNvbWJpbmVkRmVlUmF0ZSA+IG1heEZlZVJhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uIGNhbm5vdCBiZSBhY2NlbGVyYXRlZC4gQ29tYmluZWQgZmVlIHJhdGUgb2YgJHtjb21iaW5lZEZlZVJhdGV9IHNhdC9rQiBleGNlZWRzIG1heGltdW0gZmVlIHJhdGUgb2YgJHttYXhGZWVSYXRlfSBzYXQva0JgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhIG5ldyBjaGFuZ2UgYWRkcmVzcyBhbmQgZGV0ZXJtaW5lIGNoYW5nZSBhbW91bnQuXG4gICAgLy8gdGhlIHR4IGJ1aWxkZXIgd2lsbCByZWplY3QgdHJhbnNhY3Rpb25zIHdoaWNoIGhhdmUgbm8gcmVjaXBpZW50cyxcbiAgICAvLyBhbmQgc3VjaCB6ZXJvLW91dHB1dCB0cmFuc2FjdGlvbnMgYXJlIGZvcmJpZGRlbiBieSB0aGUgQml0Y29pbiBwcm90b2NvbCxcbiAgICAvLyBzbyB3ZSBuZWVkIGF0IGxlYXN0IGEgc2luZ2xlIHJlY2lwaWVudCBmb3IgdGhlIGNoYW5nZSB3aGljaCB3b24ndCBiZSBwcnVuZWQuXG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gXy5zdW1CeSh1bnNwZW50c1RvVXNlLCAodW5zcGVudCkgPT4gdW5zcGVudC52YWx1ZSkgLSBjaGlsZEZlZTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGNoYW5nZUNoYWluID0gdGhpcy5nZXRDaGFuZ2VDaGFpbih7fSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0geWllbGQgdGhpcy5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluIH0pO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBjaGlsZCB0eCBhbmQgYnJvYWRjYXN0XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCB0eCA9IHlpZWxkIHRoaXMuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIHVuc3BlbnRzOiB1bnNwZW50c1RvVXNlLFxuICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogY2hhbmdlQWRkcmVzcy5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZlZTogY2hpbGRGZWUsXG4gICAgICBiaXRnb0ZlZToge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGFkZHJlc3M6ICcnLFxuICAgICAgfSxcbiAgICAgIHhwcnY6IHBhcmFtcy54cHJ2LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICAvLyBjaGlsZCBmZWUgcmF0ZSBtdXN0IGJlIGluIHNhdC9rQiwgc28gd2UgbmVlZCB0byBjb252ZXJ0XG4gICAgY29uc3QgY2hpbGRGZWVSYXRlID0gKDEwMDAgKiBjaGlsZEZlZSkgLyBjaGlsZFZTaXplO1xuICAgIGlmIChjaGlsZEZlZVJhdGUgPiBtYXhGZWVSYXRlKSB7XG4gICAgICAvLyBjb21iaW5lZCB0eCBpcyB3aXRoaW4gbWF4IGZlZSByYXRlIGxpbWl0cywgYnV0IHRoZSBjaGlsZCB0eCBpcyBub3QuXG4gICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdXNlIHRoZSBpZ25vcmVNYXhGZWVSYXRlIGZsYWcgdG8gZ2V0IHRoZSBjaGlsZCB0eCB0byBiZSBhY2NlcHRlZFxuICAgICAgdHguaWdub3JlTWF4RmVlUmF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24odHgpO1xuICB9KVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLmFzQ2FsbGJhY2soY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvblxuLy8gSU5URVJOQUwgZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCBzaWduIGEgdHJhbnNhY3Rpb25cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gYXJyYXkgb2YgeyBhZGRyZXNzLCBhbW91bnQgfSB0byBzZW5kIHRvXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIChTZWUgdHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uIGZvciBvdGhlciBwYXNzdGhyb3VnaCBwYXJhbXMpXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGNvKGZ1bmN0aW9uKiAoKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZVJhdGUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmR5bmFtaWNGZWVDb25maXJtVGFyZ2V0ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5keW5hbWljRmVlQ29uZmlybVRhcmdldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgY29uZmlybVRhcmdldCAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGluc3RhbnQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9ICh5aWVsZCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcbiAgICBjb25zdCBmZWUgPSB0cmFuc2FjdGlvbi5mZWU7XG4gICAgY29uc3QgZmVlUmF0ZSA9IHRyYW5zYWN0aW9uLmZlZVJhdGU7XG4gICAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IHRyYW5zYWN0aW9uLmVzdGltYXRlZFNpemU7XG4gICAgY29uc3QgYml0Z29GZWUgPSB0cmFuc2FjdGlvbi5iaXRnb0ZlZTtcbiAgICBjb25zdCB0cmF2ZWxJbmZvcyA9IHRyYW5zYWN0aW9uLnRyYXZlbEluZm9zO1xuICAgIGNvbnN0IHVuc3BlbnRzID0gdHJhbnNhY3Rpb24udW5zcGVudHM7XG5cbiAgICAvLyBTaWduIHRoZSB0cmFuc2FjdGlvblxuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3Qga2V5Y2hhaW4gPSB5aWVsZCB0aGlzLmdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW4ocGFyYW1zKTtcbiAgICAgIHRyYW5zYWN0aW9uLmtleWNoYWluID0ga2V5Y2hhaW47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gJ25vX2VuY3J5cHRlZF9rZXljaGFpbl9vbl93YWxsZXQnKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIG1pZ2h0IGJlIGEgc2FmZSB3YWxsZXQsIHNvIGxldCdzIHJldHJpZXZlIHRoZSBwcml2YXRlIGtleSBpbmZvXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgeWllbGQgdGhpcy5yZWZyZXNoKHsgZ3BrOiB0cnVlIH0pO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHNhZmVVc2VyS2V5ID0gXy5nZXQodGhpcy53YWxsZXQsICdwcml2YXRlLnVzZXJQcml2S2V5Jyk7XG4gICAgICBpZiAoXy5pc1N0cmluZyhzYWZlVXNlcktleSkgJiYgXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgICAgdHJhbnNhY3Rpb24uc2lnbmluZ0tleSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IHNhZmVVc2VyS2V5IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbi5mZWVTaW5nbGVLZXlXSUYgPSBwYXJhbXMuZmVlU2luZ2xlS2V5V0lGO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgcmVzdWx0ID0geWllbGQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBfLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIGZlZSxcbiAgICAgIGZlZVJhdGUsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgIGJpdGdvRmVlLFxuICAgICAgdHJhdmVsSW5mb3MsXG4gICAgICBlc3RpbWF0ZWRTaXplLFxuICAgICAgdW5zcGVudHMsXG4gICAgfSk7XG4gIH0pXG4gICAgLmNhbGwodGhpcylcbiAgICAuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpblxuLy8gSU5URVJOQUwgZnVuY3Rpb24gdG8gZ2V0IHRoZSB1c2VyIGtleWNoYWluIGZvciBzaWduaW5nLlxuLy8gQ2FsbGVyIG11c3QgcHJvdmlkZXIgZWl0aGVyIGEga2V5Y2hhaW4sIG9yIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBhcyBhIHN0cmluZ1xuLy8gSWYgdGhlIGNhbGxlciBwcm92aWRlcyB0aGUga2V5Y2hhaW4gd2l0aCB4cHJ2LCBpdCBpcyBzaW1wbHkgcmV0dXJuZWQuXG4vLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVzIHRoZSBlbmNyeXB0ZWQgeHBydiAod2FsbGV0UGFzc3BocmFzZSksIHRoZW4gZmV0Y2ggdGhlIGtleWNoYWluIG9iamVjdCBhbmQgZGVjcnlwdFxuLy8gT3RoZXJ3aXNlIGlmIHRoZSB4cHJ2IGlzIHByb3ZpZGVkLCBmZXRjaCB0aGUga2V5Y2hhaW4gb2JqZWN0IGFuZCBhdWdtZW50IGl0IHdpdGggdGhlIHhwcnYuXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAga2V5Y2hhaW4gLSBrZXljaGFpbiB3aXRoIHhwcnZcbi8vICAgeHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybVxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gUmV0dXJuczpcbi8vICAgS2V5Y2hhaW4gb2JqZWN0IGNvbnRhaW5pbmcgeHBydiwgeHB1YiBhbmQgcGF0aHNcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG5cbiAgLy8gSWYga2V5Y2hhaW4gd2l0aCB4cHJ2IGlzIGFscmVhZHkgcHJvdmlkZWQsIHVzZSBpdFxuICBpZiAoXy5pc09iamVjdChwYXJhbXMua2V5Y2hhaW4pICYmIHBhcmFtcy5rZXljaGFpbi54cHJ2KSB7XG4gICAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUocGFyYW1zLmtleWNoYWluKTtcbiAgfVxuXG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddLCBjYWxsYmFjayk7XG4gIGlmICgocGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgcGFyYW1zLnhwcnYpIHx8ICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgIXBhcmFtcy54cHJ2KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIHhwcnYgb3Igd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gQ2FsbGVyIHByb3ZpZGVkIGEgd2FsbGV0IHBhc3NwaHJhc2VcbiAgaWYgKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICB0cnkge1xuICAgICAgICBrZXljaGFpbi54cHJ2ID0gc2VsZi5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDoga2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXljaGFpbi54cHViICYmIGJpcDMyLmZyb21CYXNlNTgoa2V5Y2hhaW4ueHBydikubmV1dGVyZWQoKS50b0Jhc2U1OCgpICE9PSBrZXljaGFpbi54cHViKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGVyaXZlZCB4cHViIGRvZXMgbm90IG1hdGNoIHN0b3JlZCB4cHViJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSk7XG4gIH1cblxuICAvLyBDYWxsZXIgcHJvdmlkZWQgYW4geHBydiAtIHZhbGlkYXRlIGFuZCBjb25zdHJ1Y3Qga2V5Y2hhaW4gb2JqZWN0XG4gIGxldCB4cHViO1xuICB0cnkge1xuICAgIHhwdWIgPSBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy54cHJ2KS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSB0aGUgeHBydicpO1xuICB9XG5cbiAgaWYgKHhwdWIgPT09IHBhcmFtcy54cHJ2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd4cHJ2IHByb3ZpZGVkIHdhcyBub3QgYSBwcml2YXRlIGtleSAoZm91bmQgeHB1YiBpbnN0ZWFkKScpO1xuICB9XG5cbiAgY29uc3Qgd2FsbGV0WHB1YnMgPSBfLm1hcChzZWxmLmtleWNoYWlucywgJ3hwdWInKTtcbiAgaWYgKCFfLmluY2x1ZGVzKHdhbGxldFhwdWJzLCB4cHViKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigneHBydiBwcm92aWRlZCB3YXMgbm90IGEga2V5Y2hhaW4gb24gdGhpcyB3YWxsZXQhJyk7XG4gIH1cblxuICAvLyBnZXQgdGhlIGtleWNoYWluIG9iamVjdCBmcm9tIGJpdGdvIHRvIGZpbmQgdGhlIHBhdGggYW5kIChwb3RlbnRpYWwpIHdhbGxldCBzdHJ1Y3R1cmVcbiAgcmV0dXJuIHNlbGYuYml0Z29cbiAgICAua2V5Y2hhaW5zKClcbiAgICAuZ2V0KHsgeHB1YjogeHB1YiB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAga2V5Y2hhaW4ueHBydiA9IHBhcmFtcy54cHJ2O1xuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBUYWtlcyBhIHdhbGxldCdzIHVuc3BlbnRzIGFuZCBmYW5zIHRoZW0gb3V0IGludG8gYSBsYXJnZXIgbnVtYmVyIG9mIGVxdWFsbHkgc2l6ZWQgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtaW5Db25maXJtczogbWluaW11bSBudW1iZXIgb2YgY29uZmlybXMgdGhlIHVuc3BlbnRzIG11c3QgaGF2ZVxuICogIHhwcnY6IHByaXZhdGUga2V5IHRvIHNpZ24gdHJhbnNhY3Rpb25cbiAqICB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXQgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSB3YWxsZXQncyBwcml2YXRlIGtleVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5mYW5PdXRVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gQmx1ZWJpcmQuY29yb3V0aW5lKGZ1bmN0aW9uKiAoKSB7XG4gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICAvLyAod2hlbiBmYW5uaW5nIG91dCwgd2UgdGFrZSBhbGwgdGhlIHVuc3BlbnRzIGFuZCBtYWtlIGEgYmlnZ2VyIG51bWJlciBvZiBvdXRwdXRzKVxuICAgIGNvbnN0IE1BWF9GQU5PVVRfSU5QVVRfQ09VTlQgPSA4MDtcbiAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBNQVhfRkFOT1VUX09VVFBVVF9DT1VOVCA9IDMwMDtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCB0d28sIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMiB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCA+IE1BWF9GQU5PVVRfT1VUUFVUX0NPVU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IHRvbyBoaWdoJyk7XG4gICAgfVxuXG4gICAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICAgIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaW5Db25maXJtcyA9IDE7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgPj0gMCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwbGl0IGEgbmF0dXJhbCBudW1iZXIgTiBpbnRvIG4gYWxtb3N0IGVxdWFsbHkgc2l6ZWQgKMKxMSkgbmF0dXJhbCBudW1iZXJzLlxuICAgICAqIEluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZXMgb2YgdGhlIHBhcnRzLCB3ZSBjYWxjdWxhdGUgZmxvb3IoTi9uKSwgYW5kIHRodXMgaGF2ZSB0aGUgYmFzZSBzaXplIG9mIGFsbCBwYXJ0cy5cbiAgICAgKiBJZiBOICUgbiAhPT0gMCwgdGhpcyBsZWF2ZXMgdXMgd2l0aCBhIHJlbWFpbmRlciByIHdoZXJlIHIgPCBuLiBXZSBkaXN0cmlidXRlIHIgZXF1YWxseSBhbW9uZyB0aGUgbiBwYXJ0cyBieVxuICAgICAqIGFkZGluZyAxIHRvIHRoZSBmaXJzdCByIHBhcnRzLlxuICAgICAqIEBwYXJhbSB0b3RhbFxuICAgICAqIEBwYXJhbSBwYXJ0Q291bnRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3Qgc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyA9IGZ1bmN0aW9uICh0b3RhbCwgcGFydENvdW50KSB7XG4gICAgICBjb25zdCBwYXJ0U2l6ZSA9IE1hdGguZmxvb3IodG90YWwgLyBwYXJ0Q291bnQpO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWwgLSBwYXJ0U2l6ZSAqIHBhcnRDb3VudDtcbiAgICAgIC8vIGluaXRpYWxpemUgcGxhY2Vob2xkZXIgYXJyYXlcbiAgICAgIGNvbnN0IGFsbW9zdEVxdWFsUGFydHMgPSBuZXcgQXJyYXkocGFydENvdW50KTtcbiAgICAgIC8vIGZpbGwgdGhlIGZpcnN0IHJlbWFpbmRlciBwYXJ0cyB3aXRoIHRoZSB2YWx1ZSBwYXJ0U2l6ZSsxXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUgKyAxLCAwLCByZW1haW5kZXIpO1xuICAgICAgLy8gZmlsbCB0aGUgcmVtYWluaW5nIHBhcnRzIHdpdGggdGhlIHZhbHVlIHBhcnRTaXplXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUsIHJlbWFpbmRlcik7XG4gICAgICAvLyBhc3NlcnQgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhbG1vc3QgZXF1YWwgcGFydHNcbiAgICAgIC8vIFRPRE86IGFkZCBjaGVjayBmb3IgdGhlIGJpZ2dlc3QgZGV2aWF0aW9uIGJldHdlZW4gYW55IHR3byBwYXJ0cyBhbmQgbWFrZSBzdXJlIGl0J3MgPD0gMVxuICAgICAgaWYgKF8oYWxtb3N0RXF1YWxQYXJ0cykuc3VtKCkgIT09IHRvdGFsIHx8IF8oYWxtb3N0RXF1YWxQYXJ0cykuc2l6ZSgpICE9PSBwYXJ0Q291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0IHN1bSBvciBwYXJ0IGNvdW50IG1pc21hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxtb3N0RXF1YWxQYXJ0cztcbiAgICB9O1xuXG4gICAgLy8gZmlyc3QsIGxldCdzIHRha2UgYWxsIHRoZSB3YWxsZXQncyB1bnNwZW50cyAod2l0aCBtaW4gY29uZmlybXMgaWYgbmVjZXNzYXJ5KVxuICAgIGNvbnN0IGFsbFVuc3BlbnRzID0gKHlpZWxkIHNlbGYudW5zcGVudHMoeyBtaW5Db25maXJtczogbWluQ29uZmlybXMgfSkpIGFzIGFueTtcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1bnNwZW50cyB0byBicmFuY2ggb3V0Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25zb2xpZGF0aW9uIGlzIGVzc2VudGlhbGx5IGp1c3QgYSB3YXN0ZSBvZiBtb25leVxuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IGhhcyB0byBiZSBiaWdnZXIgdGhhbiBjdXJyZW50IG51bWJlciBvZiB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgYXQgdGhlIHZlcnkgbWluaW11bSA4MSBpbnB1dHMsIGFuZCA4MSBvdXRwdXRzLiBUaGF0IHRyYW5zYWN0aW9uIHdpbGwgYmUgYmlnXG4gICAgLy8gaW4gdGhlIG1lZGl1bSBydW4sIHRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIHJld29ya2VkIHRvIG9ubHkgd29yayB3aXRoIGEgc3Vic2V0IG9mIHRoZSB0cmFuc2FjdGlvbnNcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoID4gTUFYX0ZBTk9VVF9JTlBVVF9DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYWxsIHRoZSBtb25leSB0aGF0IGlzIGN1cnJlbnRseSBpbiB0aGUgd2FsbGV0XG4gICAgY29uc3QgZ3Jvc3NBbW91bnQgPSBfKGFsbFVuc3BlbnRzKS5tYXAoJ3ZhbHVlJykuc3VtKCk7XG5cbiAgICAvLyBpbiBvcmRlciB0byBub3QgbW9kaWZ5IHRoZSBwYXJhbXMgb2JqZWN0LCB3ZSBjcmVhdGUgYSBjb3B5XG4gICAgY29uc3QgdHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGFsbFVuc3BlbnRzO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcblxuICAgIC8vIGNyZWF0ZSB0YXJnZXQgYW1vdW50IG9mIG5ldyBhZGRyZXNzZXMgZm9yIHRoaXMgd2FsbGV0XG4gICAgY29uc3QgbmV3QWRkcmVzc1Byb21pc2VzID0gXy5yYW5nZSh0YXJnZXQpLm1hcCgoKSA9PlxuICAgICAgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IHNlbGYuZ2V0Q2hhbmdlQ2hhaW4ocGFyYW1zKSwgdmFsaWRhdGU6IHZhbGlkYXRlIH0pXG4gICAgKTtcbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSB5aWVsZCBCbHVlYmlyZC5hbGwobmV3QWRkcmVzc1Byb21pc2VzKTtcbiAgICAvLyBsZXQncyBmaW5kIGEgbmljZSwgZXF1YWwgZGlzdHJpYnV0aW9uIG9mIG91ciBTYXRvc2hpcyBhbW9uZyB0aGUgbmV3IGFkZHJlc3Nlc1xuICAgIGNvbnN0IHNwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMoZ3Jvc3NBbW91bnQsIHRhcmdldCk7XG4gICAgLy8gbWFwIHRoZSBuZXdseSBjcmVhdGVkIGFkZHJlc3NlcyB0byB0aGUgYWxtb3N0IGNvbXBvbmVudHMgYW1vdW50cyB3ZSBqdXN0IGNhbGN1bGF0ZWRcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCBzcGxpdEFtb3VudHMpO1xuICAgIHR4UGFyYW1zLm5vU3BsaXRDaGFuZ2UgPSB0cnVlO1xuICAgIC8vIGF0dGVtcHQgdG8gY3JlYXRlIGEgdHJhbnNhY3Rpb24uIEFzIGl0IGlzIGEgd2FsbGV0LXN3ZWVwaW5nIHRyYW5zYWN0aW9uIHdpdGggbm8gZmVlLCB3ZSBleHBlY3QgaXQgdG8gZmFpbFxuICAgIHRyeSB7XG4gICAgICB5aWVsZCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gYXMgZXhwZWN0ZWQsIHRoZSB0cmFuc2FjdGlvbiBjcmVhdGlvbiBkaWQgaW5kZWVkIGZhaWwgZHVlIHRvIGluc3VmZmljaWVudCBmZWVzXG4gICAgICAvLyB0aGUgZXJyb3Igc3VnZ2VzdHMgYSBmZWUgdmFsdWUgd2hpY2ggd2UgdGhlbiB1c2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgdG90YWxGZWUgPSBiYXNlRmVlO1xuICAgICAgaWYgKGVycm9yLnJlc3VsdC5iaXRnb0ZlZSAmJiBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50KSB7XG4gICAgICAgIHRvdGFsRmVlICs9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHR4UGFyYW1zLmJpdGdvRmVlID0gZXJyb3IucmVzdWx0LmJpdGdvRmVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG4gICAgICB0eFBhcmFtcy5mZWUgPSBiYXNlRmVlO1xuICAgICAgLy8gaW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGVxdWFsIGRpc3RyaWJ1dGlvbiwgd2UgbmVlZCB0byBzdWJ0cmFjdCB0aGUgZmVlIGZyb20gdGhlIGN1bXVsYXRpdmUgZnVuZHNcbiAgICAgIC8vIGluIGNhc2Ugc29tZSB1bnNwZW50cyBnb3QgcHJ1bmVkLCB3ZSBuZWVkIHRvIHVzZSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWU7IC8vIGFmdGVyIGZlZXNcbiAgICAgIC8vIHRoYXQgbWVhbnMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGhhcyB0byBiZSByZWNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1NwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMobmV0QW1vdW50LCB0YXJnZXQpO1xuICAgICAgLy8gYW5kIHRoZSBkaXN0cmlidXRpb24gYWdhaW4gbWFwcGVkIHRvIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCByZW1haW5pbmdTcGxpdEFtb3VudHMpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgdGltZSwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIHNob3VsZCB3b3JrXG4gICAgbGV0IGZhbm91dFR4O1xuICAgIHRyeSB7XG4gICAgICBmYW5vdXRUeCA9IHlpZWxkIHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgIGUubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShmYW5vdXRUeCkuYXNDYWxsYmFjayhjYWxsYmFjayk7XG4gIH0pKCkuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRvIGZhbiBvdXQgb3IgY29hbGVzY2UgYSB3YWxsZXQncyB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7UmVxdWVzdHxQcm9taXNlLjxUPnwqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZ3JvdXBVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMSB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCBvbmUsIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWluQ29uZmlybXMgPSAxO1xuICB9XG4gIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5Db25maXJtcyBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDAnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gc2VsZi51bnNwZW50cyh7IG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyB9KS50aGVuKGZ1bmN0aW9uICh1bnNwZW50cykge1xuICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHVuc3BlbnRzO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoID4gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5jb25zb2xpZGF0ZVVuc3BlbnRzKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoIDwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5mYW5PdXRVbnNwZW50cyhwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb25zb2xpZGF0ZSBhIHdhbGxldCdzIHVuc3BlbnRzIGludG8gZmV3ZXIgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtYXhJbnB1dENvdW50UGVyQ29uc29saWRhdGlvbjogc2V0IGhvdyBtYW55IG1heGltdW0gaW5wdXRzIGFyZSB0byBiZSBwZXJtaXR0ZWQgcGVyIGNvbnNvbGlkYXRpb24gYmF0Y2hcbiAqICB4cHJ2OiBwcml2YXRlIGtleSB0byBzaWduIHRyYW5zYWN0aW9uXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0IHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUgd2FsbGV0J3MgcHJpdmF0ZSBrZXlcbiAqICBtYXhJdGVyYXRpb25Db3VudDogbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdW50aWwgZnVuY3Rpb24gc3RvcHNcbiAqICBwcm9ncmVzc0NhbGxiYWNrOiBtZXRob2QgdG8gYmUgY2FsbGVkIHdpdGggb2JqZWN0IG91dGxpbmluZyBjdXJyZW50IHByb2dyZXNzIGRldGFpbHNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuY29uc29saWRhdGVVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG5cbiAgbGV0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRhcmdldCA9IDE7XG4gIH0gZWxzZSBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAxIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubWF4U2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWF4U2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLm1pblNpemUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5TaXplIHNob3VsZCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIHBlciB0cmFuc2FjdGlvbiBmb3IgY29uc29saWRhdGlvblxuICBjb25zdCBNQVhfSU5QVVRfQ09VTlQgPSAyMDA7XG4gIGxldCBtYXhJbnB1dENvdW50ID0gcGFyYW1zLm1heElucHV0Q291bnRQZXJDb25zb2xpZGF0aW9uO1xuICBpZiAobWF4SW5wdXRDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbnVsbCBvciB1bmlkZW50aWZpZWQsIGJlY2F1c2UgZXF1YWxpdHkgdG8gemVybyByZXR1cm5zIHRydWUgaW4gaWYoISBjbGF1c2VcbiAgICBtYXhJbnB1dENvdW50ID0gTUFYX0lOUFVUX0NPVU5UO1xuICB9XG4gIGlmICh0eXBlb2YgbWF4SW5wdXRDb3VudCAhPT0gJ251bWJlcicgfHwgbWF4SW5wdXRDb3VudCA8IDIgfHwgbWF4SW5wdXRDb3VudCAlIDEgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gY29uc29saWRhdGlvbiBpbnB1dCBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDInKTtcbiAgfSBlbHNlIGlmIChtYXhJbnB1dENvdW50ID4gTUFYX0lOUFVUX0NPVU5UKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGNvbnNvbGlkYXRpb24gaW5wdXQgY291bnQgY2Fubm90IGJlIGJpZ2dlciB0aGFuICcgKyBNQVhfSU5QVVRfQ09VTlQpO1xuICB9XG5cbiAgY29uc3QgbWF4SXRlcmF0aW9uQ291bnQgPSBwYXJhbXMubWF4SXRlcmF0aW9uQ291bnQgfHwgLTE7XG4gIGlmIChcbiAgICAocGFyYW1zLm1heEl0ZXJhdGlvbkNvdW50ICYmICghXy5pc051bWJlcihtYXhJdGVyYXRpb25Db3VudCkgfHwgbWF4SXRlcmF0aW9uQ291bnQgPCAxKSkgfHxcbiAgICBtYXhJdGVyYXRpb25Db3VudCAlIDEgIT09IDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGl0ZXJhdGlvbiBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDEnKTtcbiAgfVxuXG4gIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5Db25maXJtcyA9IDE7XG4gIH1cbiAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMCcpO1xuICB9XG5cbiAgbGV0IG1pblNpemUgPSBwYXJhbXMubWluU2l6ZSB8fCAwO1xuICBpZiAocGFyYW1zLmZlZVJhdGUpIHtcbiAgICAvLyBmZWUgcmF0ZSBpcyBpbiBzYXRvc2hpcyBwZXIga0IsIGlucHV0IHNpemUgaW4gYnl0ZXNcbiAgICBjb25zdCBmZWVCYXNlZE1pblNpemUgPSBNYXRoLmNlaWwoKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwKTtcbiAgICBpZiAocGFyYW1zLm1pblNpemUgJiYgbWluU2l6ZSA8IGZlZUJhc2VkTWluU2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm92aWRlZCBtaW5TaXplIHRvbyBsb3cgZHVlIHRvIHRvbyBoaWdoIGZlZSByYXRlJyk7XG4gICAgfVxuICAgIG1pblNpemUgPSBNYXRoLm1heChmZWVCYXNlZE1pblNpemUsIG1pblNpemUpO1xuXG4gICAgaWYgKCFwYXJhbXMubWluU2l6ZSkge1xuICAgICAgLy8gZmVlIHJhdGUtYmFzZWQgbWluIHNpemUgbmVlZHMgbm8gbG9nZ2luZyBpZiBpdCB3YXMgc2V0IGV4cGxpY2l0bHlcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnT25seSBjb25zb2xpZGF0aW5nIHVuc3BlbnRzIGxhcmdlciB0aGFuICcgK1xuICAgICAgICAgIG1pblNpemUgK1xuICAgICAgICAgICcgc2F0b3NoaXMgdG8gYXZvaWQgd2FzdGluZyBtb25leSBvbiBmZWVzLiBUbyBjb25zb2xpZGF0ZSBzbWFsbGVyIHVuc3BlbnRzLCB1c2UgYSBsb3dlciBmZWUgcmF0ZS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBpdGVyYXRpb25Db3VudCA9IDA7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBjb25zb2xpZGF0aW9uSW5kZXggPSAwO1xuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBvbmUgYmF0Y2ggb2YgdXAgdG8gTUFYX0lOUFVUX0NPVU5UIHVuc3BlbnRzLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGNvbnN0IHJ1bk5leHRDb25zb2xpZGF0aW9uID0gY28oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGZhbHNlO1xuICAgIGl0ZXJhdGlvbkNvdW50Kys7XG4gICAgLypcbiAgICAgV2UgdGFrZSBhIG1heGltdW0gb2YgdW5zcGVudEJ1bGtTaXplTGltaXQgdW5zcGVudHMgZnJvbSB0aGUgd2FsbGV0LiBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN3aXBlIHRoZSB3YWxsZXRcbiAgICAgY2xlYW4gb2YgYWxsIGV4Y2Vzc2l2ZSB1bnNwZW50cywgc28gd2UgYWRkIDEgdG8gdGhlIHRhcmdldCB1bnNwZW50IGNvdW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IG1pc3NlZCBhbnl0aGluZy5cbiAgICAgSW4gY2FzZSB0aGVyZSBhcmUgZXZlbiBtb3JlIHVuc3BlbnRzIHRoYW4gdGhhdCwgdG8gbWFrZSB0aGUgY29uc29saWRhdGlvbiBhcyBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBleHBhbmQgb3VyXG4gICAgIHNlbGVjdGlvbiB0byBpbmNsdWRlIGFzIG1hbnkgYXMgdGhlIG1heGltdW0gcGVybWlzc2libGUgbnVtYmVyIG9mIGlucHV0cyBwZXIgY29uc29saWRhdGlvbiBiYXRjaC5cbiAgICAgU2hvdWxkIHRoZSB0YXJnZXQgbnVtYmVyIG9mIHVuc3BlbnRzIGJlIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBpZiBpbnB1dHMgcGVyIGNvbnNvbGlkYXRpb24sXG4gICAgIHdlIHN0aWxsIHdhbnQgdG8gZmV0Y2ggdGhlbSBhbGwgc2ltcGx5IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgY29uc29saWRhdGlvbiBjYW4gYmUgcGVyZm9ybWVkXG4gICAgIGF0IGFsbCwgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBudW1iZXIgb2YgYWxsIHVuc3BlbnRzIGJlaW5nIGhpZ2hlciB0aGFuIHRoZSB0YXJnZXQuXG4gICAgIEluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIHVuc3BlbnRzIHZlcnNpb24gU0RLLCB3ZSB3aWxsIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiB1bnNwZW50cyB3aXRob3V0IGhhdmluZyB0byBmZXRjaFxuICAgICB0aGVtLCBhbmQgdGhlcmVmb3JlIHdpbGwgYmUgYWJsZSB0byBzaW1wbGlmeSB0aGlzIG1ldGhvZC5cbiAgICAgKi9cblxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7XG4gICAgICBsaW1pdDogdGFyZ2V0ICsgbWF4SW5wdXRDb3VudCxcbiAgICAgIG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyxcbiAgICAgIG1pblNpemU6IG1pblNpemUsXG4gICAgfTtcbiAgICBpZiAocGFyYW1zLm1heFNpemUpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLm1heFNpemUgPSBwYXJhbXMubWF4U2l6ZTtcbiAgICB9XG4gICAgY29uc3QgYWxsVW5zcGVudHMgPSAoeWllbGQgc2VsZi51bnNwZW50cyhxdWVyeVBhcmFtcykpIGFzIGFueTtcbiAgICAvLyB0aGlzIGNvbnNvbGlkYXRpb24gaXMgZXNzZW50aWFsbHkganVzdCBhIHdhc3RlIG9mIG1vbmV5XG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA8PSB0YXJnZXQpIHtcbiAgICAgIGlmIChpdGVyYXRpb25Db3VudCA8PSAxKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IGl0ZXJhdGlvbiwgc28gdGhlIG1ldGhvZCBpcyBpbmNvcnJlY3RcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXdlciB1bnNwZW50cyB0aGFuIGNvbnNvbGlkYXRpb24gdGFyZ2V0LiBVc2UgZmFuT3V0VW5zcGVudHMgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGl0J3MgYSBsYXRlciBpdGVyYXRpb24sIHNvIHRoZSB0YXJnZXQgbWF5IGhhdmUgYmVlbiBzdXJwYXNzZWQgKGR1ZSB0byBjb25maXJtYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvbmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxVbnNwZW50c0NvdW50ID0gYWxsVW5zcGVudHMubGVuZ3RoO1xuXG4gICAgLy8gaG93IG1hbnkgb2YgdGhlIHVuc3BlbnRzIGRvIHdlIHdhbnQgdG8gY29uc29saWRhdGU/XG4gICAgLy8gdGhlICsxIGlzIGJlY2F1c2UgdGhlIGNvbnNvbGlkYXRlZCBibG9jayBiZWNvbWVzIGEgbmV3IHVuc3BlbnQgbGF0ZXJcbiAgICBsZXQgdGFyZ2V0SW5wdXRDb3VudCA9IGFsbFVuc3BlbnRzQ291bnQgLSB0YXJnZXQgKyAxO1xuICAgIHRhcmdldElucHV0Q291bnQgPSBNYXRoLm1pbih0YXJnZXRJbnB1dENvdW50LCBhbGxVbnNwZW50cy5sZW5ndGgpO1xuXG4gICAgLy8gaWYgdGhlIHRhcmdldElucHV0Q291bnQgcmVxdWlyZXMgbW9yZSBpbnB1dHMgdGhhbiB3ZSBhbGxvdyBwZXIgYmF0Y2gsIHdlIHJlZHVjZSB0aGUgbnVtYmVyXG4gICAgY29uc3QgaW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIG1heElucHV0Q291bnQpO1xuXG4gICAgLy8gaWYgZWl0aGVyIHRoZSBudW1iZXIgb2YgaW5wdXRzIGxlZnQgdG8gY29hbGVzY2UgZXF1YWxzIHRoZSBudW1iZXIgd2Ugd2lsbCBjb2FsZXNjZSBpbiB0aGlzIGl0ZXJhdGlvblxuICAgIC8vIG9yIGlmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBtYXRjaGVzIHRoZSBtYXhpbXVtIHBlcm1pdHRlZCBudW1iZXJcbiAgICBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGlucHV0Q291bnQgPT09IHRhcmdldElucHV0Q291bnQgfHwgaXRlcmF0aW9uQ291bnQgPT09IG1heEl0ZXJhdGlvbkNvdW50O1xuXG4gICAgY29uc3QgY3VycmVudENodW5rID0gYWxsVW5zcGVudHMuc3BsaWNlKDAsIGlucHV0Q291bnQpO1xuICAgIGNvbnN0IGNoYW5nZUNoYWluID0gc2VsZi5nZXRDaGFuZ2VDaGFpbihwYXJhbXMpO1xuICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoeWllbGQgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkpIGFzIGFueTtcbiAgICBjb25zdCB0eFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIGNvbnN0IGN1cnJlbnRBZGRyZXNzID0gbmV3QWRkcmVzcztcbiAgICAvLyB0aGUgdG90YWwgYW1vdW50IHRoYXQgd2UgYXJlIGNvbnNvbGlkYXRpbmcgd2l0aGluIHRoaXMgYmF0Y2hcbiAgICBjb25zdCBncm9zc0Ftb3VudCA9IF8oY3VycmVudENodW5rKS5tYXAoJ3ZhbHVlJykuc3VtKCk7IC8vIGJlZm9yZSBmZWVzXG5cbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGN1cnJlbnRDaHVuaztcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0ge307XG4gICAgdHhQYXJhbXMucmVjaXBpZW50c1tuZXdBZGRyZXNzLmFkZHJlc3NdID0gZ3Jvc3NBbW91bnQ7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG5cbiAgICBpZiAodHhQYXJhbXMudW5zcGVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgIH1cblxuICAgIC8vIGxldCdzIGF0dGVtcHQgdG8gY3JlYXRlIHRoaXMgdHJhbnNhY3Rpb24uIFdlIGV4cGVjdCBpdCB0byBmYWlsIGJlY2F1c2Ugbm8gZmVlIGlzIHNldC5cbiAgICB0cnkge1xuICAgICAgeWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIHRoaXMgZXJyb3Igc2hvdWxkIG9jY3VyIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHNcbiAgICAgIC8vIGhvd2V2ZXIsIGxldCdzIG1ha2Ugc3VyZSBpdCB3YXNuJ3Qgc29tZXRoaW5nIGVsc2VcbiAgICAgIGlmICghZXJyb3IuZmVlICYmICghZXJyb3IucmVzdWx0IHx8ICFlcnJvci5yZXN1bHQuZmVlKSkge1xuICAgICAgICAvLyBpZiB0aGUgZXJyb3IgZG9lcyBub3QgY29udGFpbiBhIGZlZSBwcm9wZXJ0eSwgaXQgaXMgc29tZXRoaW5nIGVsc2UgdGhhdCBoYXMgZ29uZSBhd3J5LCBhbmQgd2UgdGhyb3cgaXRcbiAgICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgICBlcnJvci5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFzZUZlZSA9IGVycm9yLmZlZSB8fCBlcnJvci5yZXN1bHQuZmVlO1xuICAgICAgbGV0IGJpdGdvRmVlID0gMDtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50O1xuICAgICAgICB0b3RhbEZlZSArPSBiaXRnb0ZlZTtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBuZXQgYW1vdW50IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbWluaW11bSBvdXRwdXQgc2l6ZVxuICAgICAgY29uc3QgbmV0QW1vdW50ID0gTWF0aC5tYXgoZXJyb3IucmVzdWx0LmF2YWlsYWJsZSAtIHRvdGFsRmVlLCBzZWxmLmJpdGdvLmdldENvbnN0YW50cygpLm1pbk91dHB1dFNpemUpO1xuICAgICAgLy8gTmVlZCB0byBjbGVhciB0aGVzZSBvdXQgc2luY2Ugb25seSAxIG1heSBiZSBzZXRcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWU7XG4gICAgICB0eFBhcmFtcy5vcmlnaW5hbEZlZVJhdGUgPSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0O1xuXG4gICAgICAvLyB3ZSBzZXQgdGhlIGZlZSBleHBsaWNpdGx5XG4gICAgICB0eFBhcmFtcy5mZWUgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gbmV0QW1vdW50IC0gYml0Z29GZWU7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBuZXRBbW91bnQ7XG4gICAgfVxuICAgIC8vIHRoaXMgdHJhbnNhY3Rpb24sIG9uIHRoZSBvdGhlciBoYW5kLCBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIG5vIGlzc3VlcywgYmVjYXVzZSBhbiBhcHByb3ByaWF0ZSBmZWUgaXMgc2V0XG4gICAgbGV0IHNlbnRUeDtcbiAgICB0cnkge1xuICAgICAgc2VudFR4ID0geWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goc2VudFR4KTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5wcm9ncmVzc0NhbGxiYWNrKSkge1xuICAgICAgcGFyYW1zLnByb2dyZXNzQ2FsbGJhY2soe1xuICAgICAgICB0eGlkOiBzZW50VHguaGFzaCxcbiAgICAgICAgZGVzdGluYXRpb246IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGdyb3NzQW1vdW50LFxuICAgICAgICBmZWU6IHNlbnRUeC5mZWUsXG4gICAgICAgIGlucHV0Q291bnQ6IGlucHV0Q291bnQsXG4gICAgICAgIGluZGV4OiBjb25zb2xpZGF0aW9uSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc29saWRhdGlvbkluZGV4Kys7XG4gICAgaWYgKCFpc0ZpbmFsQ29uc29saWRhdGlvbikge1xuICAgICAgLy8gdGhpcyBsYXN0IGNvbnNvbGlkYXRpb24gaGFzIG5vdCB5ZXQgYnJvdWdodCB0aGUgdW5zcGVudHMgY291bnQgZG93biB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnRcbiAgICAgIC8vIHRoZXJlZm9yZSwgd2UgcHJvY2VlZCBieSBjb25zb2xpZGF0aW5nIHlldCBhbm90aGVyIGJhdGNoXG4gICAgICAvLyBiZWZvcmUgd2UgZG8gdGhhdCwgd2Ugd2FpdCAxIHNlY29uZCBzbyB0aGF0IHRoZSBuZXdseSBjcmVhdGVkIHVuc3BlbnQgd2lsbCBiZSBmZXRjaGVkIGluIHRoZSBuZXh0IGJhdGNoXG4gICAgICB5aWVsZCBCbHVlYmlyZC5kZWxheSgxMDAwKTtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCguLi4oKHlpZWxkIHJ1bk5leHRDb25zb2xpZGF0aW9uKCkpIGFzIGFueSkpO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHRoZSBmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLiBXZSByZXR1cm4gYWxsIHRoZSBvbmVzIHdlJ3ZlIGhhZCBzbyBmYXJcbiAgICByZXR1cm4gY29uc29saWRhdGlvblRyYW5zYWN0aW9ucztcbiAgfSk7XG5cbiAgcmV0dXJuIHJ1bk5leHRDb25zb2xpZGF0aW9uKHRoaXMsIHRhcmdldClcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnRG9uZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5yZXNoYXJlICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5yZXNoYXJlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLnNraXBLZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2tpcEtleWNoYWluKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gIH1cbiAgY29uc3QgbmVlZHNLZXljaGFpbiA9ICFwYXJhbXMuc2tpcEtleWNoYWluICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICBpZiAocGFyYW1zLmRpc2FibGVFbWFpbCAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUVtYWlsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBsZXQgc2hhcmluZztcbiAgbGV0IHNoYXJlZEtleWNoYWluO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC5nZXRTaGFyaW5nS2V5KHsgZW1haWw6IHBhcmFtcy5lbWFpbC50b0xvd2VyQ2FzZSgpIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgc2hhcmluZyA9IHJlc3VsdDtcblxuICAgICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KS50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGtleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWNrZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFhwcnYgPSBzZWxmLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ueHBydiB9KTtcblxuICAgICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgICAgIHhwdWI6IGtleWNoYWluLnhwdWIsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZFhwcnY6IG5ld0VuY3J5cHRlZFhwcnYsXG4gICAgICAgICAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgICAgcGF0aDogc2hhcmluZy5wYXRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgICAgICB1c2VyOiBhbnk7XG4gICAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICAgIHJlc2hhcmU6IGJvb2xlYW47XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgZGlzYWJsZUVtYWlsOiBhbnk7XG4gICAgICAgIGtleWNoYWluPzogYW55O1xuICAgICAgICBza2lwS2V5Y2hhaW4/OiBib29sZWFuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuICAgICAgICB1c2VyOiBzaGFyaW5nLnVzZXJJZCxcbiAgICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICAgICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICB9O1xuICAgICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSBzaGFyZWRLZXljaGFpbjtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNraXBLZXljaGFpbikge1xuICAgICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVVc2VyID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMudXJsKCcvdXNlci8nICsgcGFyYW1zLnVzZXIpKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmdldFBvbGljeSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wb2xpY3knKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZ2V0UG9saWN5U3RhdHVzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeS9zdGF0dXMnKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuc2V0UG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUubGlzdFdlYmhvb2tzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQoKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNhY3Rpb24gYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIC0gd2ViaG9va0lkIChyZXF1aXJlZCk6IGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICogLSB0eEhhc2ggKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNhY3Rpb24gd2ViaG9va3MpIGhhc2ggb2YgdGhlIHNpbXVsYXRlZCB0cmFuc2FjdGlvblxuICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuc2ltdWxhdGVXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgaGFzVHhIYXNoID0gISFwYXJhbXMudHhIYXNoO1xuICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuXG4gIGlmICgoaGFzVHhIYXNoICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB8fCAoIWhhc1R4SGFzaCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIYXNoIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgfVxuXG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQsIHRoZSB0eEhhc2ggaGFzIHRvIGFkaGVyZSB0byBpdHMgcmVzcGVjdGl2ZSBmb3JtYXRcbiAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgLy8gb25seSB0YWtlIHRoZSB0eEhhc2ggYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKVxuICApLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5hZGRXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlV2ViaG9vayA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnLCAndHlwZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZXN0aW1hdGVGZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmFtb3VudCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBhbW91bnQgYXMgd2VsbCBhcyByZWNpcGllbnRzJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVjaXBpZW50cyBtdXN0IGJlIGFycmF5IG9mIHsgYWRkcmVzczogYWJjLCBhbW91bnQ6IDEwMDAwMCB9IG9iamVjdHMnKTtcbiAgfVxuICBpZiAocGFyYW1zLmFtb3VudCAmJiAhXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJlY2lwaWVudHMgPSBwYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcblxuICBpZiAocGFyYW1zLmFtb3VudCkge1xuICAgIC8vIG9ubHkgdGhlIGFtb3VudCB3YXMgcGFzc2VkIGluLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBmYWxzZSByZWNpcGllbnQgdG8gcnVuIGNyZWF0ZVRyYW5zYWN0aW9uIHdpdGhcbiAgICByZWNpcGllbnRzLnB1c2goe1xuICAgICAgYWRkcmVzczogY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmJpdGdvLmVudl0uc2lnbmluZ0FkZHJlc3MsIC8vIGFueSBhZGRyZXNzIHdpbGwgZG9cbiAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIHRyYW5zYWN0aW9uUGFyYW1zLmFtb3VudCA9IHVuZGVmaW5lZDtcbiAgdHJhbnNhY3Rpb25QYXJhbXMucmVjaXBpZW50cyA9IHJlY2lwaWVudHM7XG5cbiAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHR4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVzdGltYXRlZFNpemU6IHR4LmVzdGltYXRlZFNpemUsXG4gICAgICBmZWU6IHR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHR4LmZlZVJhdGUsXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vLyBOb3QgZnVsbHkgaW1wbGVtZW50ZWQgLyByZWxlYXNlZCBvbiBTREsuIFRlc3RpbmcgZm9yIG5vdy5cbldhbGxldC5wcm90b3R5cGUudXBkYXRlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldEJpdEdvRmVlXG4vLyBHZXQgdGhlIHJlcXVpcmVkIG9uLXRyYW5zYWN0aW9uIEJpdEdvIGZlZVxuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0Qml0R29GZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYW1vdW50IGFyZ3VtZW50Jyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvYmlsbGluZy9mZWUnKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKlxuICogQHBhcmFtc1xuICogIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2Ugb2Ygd2FsbGV0IHVzZWQgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleXNcbiAqICB1bnNwZW50czogYXJyYXkgb2YgdW5zcGVudHMgdG8gcmVjb3ZlclxuICogIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyB0b1xuICogIGZlZVJhdGU6IGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gKiAgdXNlcktleTogZW5jcnlwdGVkIHVzZXIga2V5XG4gKiAgYmFja3VwS2V5OiBlbmNyeXB0ZWQgYmFja3VwIGtleVxuICogKi9cbldhbGxldC5wcm90b3R5cGUucmVjb3ZlciA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVuc3BlbnRzJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlUmF0ZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1c2VyS2V5Jyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFja3VwS2V5Jyk7XG4gIH1cblxuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gQmlnSW50KHV0eG9saWIuYml0Z28udW5zcGVudFN1bShwYXJhbXMudW5zcGVudHMpKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcigpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZTtcbiAgY29uc3QgYXBwcm94aW1hdGVTaXplID1cbiAgICBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMudW5zcGVudHMubGVuZ3RoO1xuICBjb25zdCBhcHByb3hpbWF0ZVR4RmVlID0gQmlnSW50KGFwcHJveGltYXRlU2l6ZSAqIHBhcmFtcy5mZWVSYXRlKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVUeEZlZTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IE51bWJlcihyZWNvdmVyeUFtb3VudCkgfV07XG5cbiAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgcmVjaXBpZW50cyxcbiAgICBmZWU6IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSxcbiAgfSk7XG5cbiAgY29uc3QgcGFyc2VkVW5zaWduZWRUeCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHVuc2lnbmVkVHgudHJhbnNhY3Rpb25IZXgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lmlucy5sZW5ndGggPT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5vdXRzLmxlbmd0aCA9PT0gMSk7XG4gIGFzc2VydChfLnN1bUJ5KHBhcmFtcy51bnNwZW50cywgJ3ZhbHVlJykgLSBfLnN1bUJ5KHBhcnNlZFVuc2lnbmVkVHgub3V0cywgJ3ZhbHVlJykgPT09IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSk7XG5cbiAgY29uc3QgcGxhaW5Vc2VyS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLnVzZXJLZXkgfSk7XG4gIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHsgLi4udW5zaWduZWRUeCwgc2lnbmluZ0tleTogcGxhaW5Vc2VyS2V5IH0pO1xuXG4gIGNvbnN0IHBsYWluQmFja3VwS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLmJhY2t1cEtleSB9KTtcbiAgY29uc3QgZnVsbFNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgIC4uLnVuc2lnbmVkVHgsXG4gICAgdHJhbnNhY3Rpb25IZXg6IGhhbGZTaWduZWRUeC50eCxcbiAgICBzaWduaW5nS2V5OiBwbGFpbkJhY2t1cEtleSxcbiAgfSk7XG4gIHJldHVybiBmdWxsU2lnbmVkVHgudHg7XG59O1xuXG5leHBvcnQgPSBXYWxsZXQ7XG4iXX0=
2205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGdCQUFnQjtBQUNoQix1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYsOENBQStDO0FBQy9DLGlDQUFpQztBQUVqQywyQ0FBMkM7QUFDM0MsOENBQXdDO0FBQ3hDLDhDQU95QjtBQUN6QixxQ0FBcUM7QUFDckMsNEJBQTRCO0FBRTVCLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFDM0QsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFckQsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUM5QixNQUFNLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN0RyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFdEMsRUFBRTtBQUNGLGNBQWM7QUFDZCxFQUFFO0FBQ0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxLQUFLLEVBQUUsTUFBTTtJQUNwQyxzQ0FBc0M7SUFDckMsSUFBSSxDQUFDLEtBQWEsR0FBRyxLQUFLLENBQUM7SUFDNUIsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLHNDQUFzQztJQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUVwQixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDbEIsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDM0M7QUFDSCxDQUFDLENB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S0FDckQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM1RCxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7S0FDcEQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUMxRSxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7S0FDM0Q7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNsRSxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7S0FDN0Q7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNoRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7S0FDNUQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLG9C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Z0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdEcsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxVQUFVLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFFN0YsT0FBTyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDaEMsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFO1FBQ25CLGlCQUFpQixFQUFFLElBQUk7UUFDdkIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO0tBQ2hCLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLGlCQUFTLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gV2FsbGV0IE9iamVjdFxuLy8gQml0R28gYWNjZXNzb3IgZm9yIGEgc3BlY2lmaWMgd2FsbGV0XG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cblxuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvL3Vuc3BlbnRzJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQge1xuICBjb21tb24sXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0TmV0d29yayxcbiAgZ2V0U2hhcmVkU2VjcmV0LFxuICBtYWtlUmFuZG9tS2V5LFxuICBzYW5pdGl6ZUxlZ2FjeVBhdGgsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBCbHVlYmlyZCBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IFRyYW5zYWN0aW9uQnVpbGRlciA9IHJlcXVpcmUoJy4vdHJhbnNhY3Rpb25CdWlsZGVyJyk7XG5jb25zdCBQZW5kaW5nQXBwcm92YWwgPSByZXF1aXJlKCcuL3BlbmRpbmdhcHByb3ZhbCcpO1xuXG5jb25zdCBjbyA9IEJsdWViaXJkLmNvcm91dGluZTtcbmNvbnN0IHsgZ2V0RXh0ZXJuYWxDaGFpbkNvZGUsIGdldEludGVybmFsQ2hhaW5Db2RlLCBpc0NoYWluQ29kZSwgc2NyaXB0VHlwZUZvckNoYWluIH0gPSB1dHhvbGliLmJpdGdvO1xuY29uc3QgcmVxdWVzdCA9IHJlcXVpcmUoJ3N1cGVyYWdlbnQnKTtcblxuLy9cbi8vIENvbnN0cnVjdG9yXG4vL1xuY29uc3QgV2FsbGV0ID0gZnVuY3Rpb24gKGJpdGdvLCB3YWxsZXQpIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgKHRoaXMuYml0Z28gYXMgYW55KSA9IGJpdGdvO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICB0aGlzLndhbGxldCA9IHdhbGxldDtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy5rZXljaGFpbnMgPSBbXTtcblxuICBpZiAod2FsbGV0LnByaXZhdGUpIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIHRoaXMua2V5Y2hhaW5zID0gd2FsbGV0LnByaXZhdGUua2V5Y2hhaW5zO1xuICB9XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0O1xufTtcblxuLy9cbi8vIGlkXG4vLyBHZXQgdGhlIGlkIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuaWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC5pZDtcbn07XG5cbi8vXG4vLyBsYWJlbFxuLy8gR2V0IHRoZSBsYWJlbCBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmxhYmVsID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQubGFiZWw7XG59O1xuXG4vL1xuLy8gYmFsYW5jZVxuLy8gR2V0IHRoZSBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUuYmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LmJhbGFuY2U7XG59O1xuXG4vL1xuLy8gYmFsYW5jZVxuLy8gR2V0IHRoZSBzcGVuZGFibGUgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vIFRoaXMgaXMgdGhlIHRvdGFsIG9mIGFsbCB1bnNwZW50cyBleGNlcHQgdGhvc2UgdGhhdCBhcmUgdW5jb25maXJtZWQgYW5kIGV4dGVybmFsXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zcGVuZGFibGVCYWxhbmNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuc3BlbmRhYmxlQmFsYW5jZTtcbn07XG5cbi8vXG4vLyBjb25maXJtZWRCYWxhbmNlXG4vLyBHZXQgdGhlIGNvbmZpcm1lZEJhbGFuY2Ugb2YgdGhpcyB3YWxsZXQuXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jb25maXJtZWRCYWxhbmNlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuY29uZmlybWVkQmFsYW5jZTtcbn07XG5cbi8vXG4vLyBjYW5TZW5kSW5zdGFudFxuLy8gUmV0dXJucyBpZiB0aGUgd2FsbGV0IGNhbiBzZW5kIGluc3RhbnQgdHJhbnNhY3Rpb25zXG4vLyBUaGlzIGlzIGltcGFjdGVkIGJ5IHRoZSBjaG9pY2Ugb2YgYmFja3VwIGtleSBwcm92aWRlclxuLy9cbldhbGxldC5wcm90b3R5cGUuY2FuU2VuZEluc3RhbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldCAmJiB0aGlzLndhbGxldC5jYW5TZW5kSW5zdGFudDtcbn07XG5cbi8vXG4vLyBpbnN0YW50IGJhbGFuY2Vcbi8vIEdldCB0aGUgaW5zdGFudCBiYWxhbmNlIG9mIHRoaXMgd2FsbGV0LlxuLy8gVGhpcyBpcyB0aGUgdG90YWwgb2YgYWxsIHVuc3BlbnRzIHRoYXQgbWF5IGJlIHNwZW50IGluc3RhbnRseS5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmluc3RhbnRCYWxhbmNlID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY2FuU2VuZEluc3RhbnQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IGFuIGluc3RhbnQgd2FsbGV0Jyk7XG4gIH1cbiAgcmV0dXJuIHRoaXMud2FsbGV0Lmluc3RhbnRCYWxhbmNlO1xufTtcblxuLy9cbi8vIHVuY29uZmlybWVkU2VuZHNcbi8vIEdldCB0aGUgYmFsYW5jZSBvZiB1bmNvbmZpcm1lZFNlbmRzIG9mIHRoaXMgd2FsbGV0LlxuLy9cbldhbGxldC5wcm90b3R5cGUudW5jb25maXJtZWRTZW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnVuY29uZmlybWVkU2VuZHM7XG59O1xuXG4vL1xuLy8gdW5jb25maXJtZWRSZWNlaXZlc1xuLy8gR2V0IHRoZSBiYWxhbmNlIG9mIHVuY29uZmlybWVkUmVjZWl2ZXMgYmFsYW5jZSBvZiB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLnVuY29uZmlybWVkUmVjZWl2ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLndhbGxldC51bmNvbmZpcm1lZFJlY2VpdmVzO1xufTtcblxuLy9cbi8vIHR5cGVcbi8vIEdldCB0aGUgdHlwZSBvZiB0aGlzIHdhbGxldCwgZS5nLiAnc2FmZWhkJ1xuLy9cbldhbGxldC5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMud2FsbGV0LnR5cGU7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnVybCA9IGZ1bmN0aW9uIChleHRyYSkge1xuICBleHRyYSA9IGV4dHJhIHx8ICcnO1xuICByZXR1cm4gdGhpcy5iaXRnby51cmwoJy93YWxsZXQvJyArIHRoaXMuaWQoKSArIGV4dHJhKTtcbn07XG5cbi8vXG4vLyBwZW5kaW5nQXBwcm92YWxzXG4vLyByZXR1cm5zIHRoZSBwZW5kaW5nIGFwcHJvdmFscyBsaXN0IGZvciB0aGlzIHdhbGxldCBhcyBwZW5kaW5nIGFwcHJvdmFsIG9iamVjdHNcbi8vXG5XYWxsZXQucHJvdG90eXBlLnBlbmRpbmdBcHByb3ZhbHMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gdGhpcy53YWxsZXQucGVuZGluZ0FwcHJvdmFscy5tYXAoZnVuY3Rpb24gKHApIHtcbiAgICByZXR1cm4gbmV3IFBlbmRpbmdBcHByb3ZhbChzZWxmLmJpdGdvLCBwLCBzZWxmKTtcbiAgfSk7XG59O1xuXG4vL1xuLy8gYXBwcm92YWxzUmVxdWlyZWRcbi8vIHJldHVybnMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMgcmVxdWlyZWQgdG8gYXBwcm92ZSBwZW5kaW5nIGFwcHJvdmFscyBpbnZvbHZpbmcgdGhpcyB3YWxsZXRcbi8vXG5XYWxsZXQucHJvdG90eXBlLmFwcHJvdmFsc1JlcXVpcmVkID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy53YWxsZXQuYXBwcm92YWxzUmVxdWlyZWQgfHwgMTtcbn07XG5cbi8vXG4vLyBnZXRcbi8vIFJlZmV0Y2hlcyB0aGlzIHdhbGxldCBhbmQgcmV0dXJucyBpdFxuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spOiBCbHVlYmlyZDxhbnk+IHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMudXJsKCkpXG4gICAgICAucmVzdWx0KClcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgc2VsZi53YWxsZXQgPSByZXM7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfSlcbiAgKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB1cGRhdGVBcHByb3ZhbHNSZXF1aXJlZFxuLy8gVXBkYXRlcyB0aGUgbnVtYmVyIG9mIGFwcHJvdmFscyByZXF1aXJlZCBvbiBhIHBlbmRpbmcgYXBwcm92YWwgaW52b2x2aW5nIHRoaXMgd2FsbGV0LlxuLy8gVGhlIGFwcHJvdmFscyByZXF1aXJlZCBpcyBieSBkZWZhdWx0IDEsIGJ1dCB0aGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZVxuLy8gbnVtYmVyIHN1Y2ggdGhhdCAxIDw9IGFwcHJvdmFsc1JlcXVpcmVkIDw9IHdhbGxldEFkbWlucy5sZW5ndGggLSAxXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51cGRhdGVBcHByb3ZhbHNSZXF1aXJlZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKTogQmx1ZWJpcmQ8YW55PiB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG4gIGlmIChcbiAgICBwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICFfLmlzSW50ZWdlcihwYXJhbXMuYXBwcm92YWxzUmVxdWlyZWQpIHx8XG4gICAgcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkIDwgMVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXBwcm92YWxzUmVxdWlyZWQ6IG11c3QgYmUgYSBub256ZXJvIHBvc2l0aXZlIG51bWJlcicpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGNvbnN0IGN1cnJlbnRBcHByb3ZhbHNSZXF1aXJlZCA9IHRoaXMuYXBwcm92YWxzUmVxdWlyZWQoKTtcbiAgaWYgKGN1cnJlbnRBcHByb3ZhbHNSZXF1aXJlZCA9PT0gcGFyYW1zLmFwcHJvdmFsc1JlcXVpcmVkKSB7XG4gICAgLy8gbm8tb3AsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHdhbGxldFxuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNlbGYud2FsbGV0O1xuICAgIH0pLm5vZGVpZnkoY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29ycmVjdCBjaGFpbiBmb3IgY2hhbmdlLCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIHNlZ3dpdFxuICovXG5XYWxsZXQucHJvdG90eXBlLmdldENoYW5nZUNoYWluID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBsZXQgdXNlU2Vnd2l0Q2hhbmdlID0gISF0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdDtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5zZWd3aXRDaGFuZ2UpKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbihwYXJhbXMuc2Vnd2l0Q2hhbmdlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWd3aXRDaGFuZ2UgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgICB9XG5cbiAgICAvLyBpZiBzZWd3aXQgaXMgZGlzYWJsZWQgdGhyb3VnaCB0aGUgY29uc3RhbnRzLCBzZWd3aXQgY2hhbmdlIHNob3VsZCBzdGlsbCBub3QgYmUgY3JlYXRlZFxuICAgIHVzZVNlZ3dpdENoYW5nZSA9IHRoaXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZW5hYmxlU2Vnd2l0ICYmIHBhcmFtcy5zZWd3aXRDaGFuZ2U7XG4gIH1cbiAgcmV0dXJuIHVzZVNlZ3dpdENoYW5nZSA/IGdldEludGVybmFsQ2hhaW5Db2RlKCdwMnNoUDJ3c2gnKSA6IGdldEludGVybmFsQ2hhaW5Db2RlKCdwMnNoJyk7XG59O1xuXG4vL1xuLy8gY3JlYXRlQWRkcmVzc1xuLy8gQ3JlYXRlcyBhIG5ldyBhZGRyZXNzIGZvciB1c2Ugd2l0aCB0aGlzIHdhbGxldC5cbi8vXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgaWYgKHRoaXMudHlwZSgpID09PSAnc2FmZScpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBhcmUgdXNpbmcgYSBsZWdhY3kgd2FsbGV0IHRoYXQgY2Fubm90IGNyZWF0ZSBhIG5ldyBhZGRyZXNzJyk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHRvIGNsaWVudC1zaWRlIGFkZHJlc3MgdmFsaWRhdGlvbiBvbiwgZm9yIHNhZmV0eS4gVXNlIHZhbGlkYXRlPWZhbHNlIHRvIGRpc2FibGUuXG4gIGNvbnN0IHNob3VsZFZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG5cbiAgY29uc3QgYWxsb3dFeGlzdGluZyA9IHBhcmFtcy5hbGxvd0V4aXN0aW5nO1xuICBpZiAodHlwZW9mIGFsbG93RXhpc3RpbmcgIT09ICdib29sZWFuJykge1xuICAgIHBhcmFtcy5hbGxvd0V4aXN0aW5nID0gYWxsb3dFeGlzdGluZyA9PT0gJ3RydWUnO1xuICB9XG5cbiAgY29uc3QgaXNTZWd3aXQgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLmVuYWJsZVNlZ3dpdDtcbiAgY29uc3QgZGVmYXVsdENoYWluID0gaXNTZWd3aXQgPyBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaFAyd3NoJykgOiBnZXRFeHRlcm5hbENoYWluQ29kZSgncDJzaCcpO1xuXG4gIGxldCBjaGFpbiA9IHBhcmFtcy5jaGFpbjtcbiAgaWYgKGNoYWluID09PSBudWxsIHx8IGNoYWluID09PSB1bmRlZmluZWQpIHtcbiAgICBjaGFpbiA9IGRlZmF1bHRDaGFpbjtcbiAgfVxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL2FkZHJlc3MvJyArIGNoYWluKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGFkZHIpIHtcbiAgICAgICAgaWYgKHNob3VsZFZhbGlkYXRlKSB7XG4gICAgICAgICAgc2VsZi52YWxpZGF0ZUFkZHJlc3MoYWRkcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZHI7XG4gICAgICB9KVxuICApLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhZGRyZXNzIGxvY2FsbHkgd2l0aG91dCBjYWxsaW5nIHNlcnZlclxuICogQHBhcmFtIHBhcmFtc1xuICpcbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5nZW5lcmF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAoeyBzZWd3aXQsIHBhdGgsIGtleWNoYWlucywgdGhyZXNob2xkIH0pIHtcbiAgY29uc3QgaXNTZWd3aXQgPSAhIXNlZ3dpdDtcbiAgbGV0IHNpZ25hdHVyZVRocmVzaG9sZCA9IDI7XG4gIGlmIChfLmlzSW50ZWdlcih0aHJlc2hvbGQpKSB7XG4gICAgc2lnbmF0dXJlVGhyZXNob2xkID0gdGhyZXNob2xkO1xuICAgIGlmIChzaWduYXR1cmVUaHJlc2hvbGQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgaGFzIHRvIGJlIHBvc2l0aXZlJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGF0aFJlZ2V4ID0gL15cXC8xP1swMV1cXC9cXGQrJC87XG4gIGlmICghcGF0aC5tYXRjaChwYXRoUmVnZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBwYXRoOiAnICsgcGF0aCk7XG4gIH1cblxuICBsZXQgcm9vdEtleXMgPSB0aGlzLmtleWNoYWlucztcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Y2hhaW5zKSkge1xuICAgIHJvb3RLZXlzID0ga2V5Y2hhaW5zO1xuICB9XG5cbiAgY29uc3QgbmV0d29yayA9IGNvbW1vbi5FbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0ubmV0d29yaztcblxuICBjb25zdCBkZXJpdmVkS2V5cyA9IHJvb3RLZXlzLm1hcChmdW5jdGlvbiAoaykge1xuICAgIGNvbnN0IGhkbm9kZSA9IGJpcDMyLmZyb21CYXNlNTgoay54cHViKTtcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGsucGF0aCArIChrLndhbGxldFN1YlBhdGggfHwgJycpICsgcGF0aDtcbiAgICByZXR1cm4gaGRub2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKGRlcml2YXRpb25QYXRoKSkucHVibGljS2V5O1xuICB9KTtcblxuICBjb25zdCBwYXRoQ29tcG9uZW50cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGhDb21wb25lbnRzID0gXy5tYXAocGF0aENvbXBvbmVudHMsIChjb21wb25lbnQpID0+IHtcbiAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnQoY29tcG9uZW50LCAxMCk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcGF0aERldGFpbHMgPSBfLmZpbHRlcihub3JtYWxpemVkUGF0aENvbXBvbmVudHMsIF8uaXNJbnRlZ2VyKTtcblxuICBjb25zdCBhZGRyZXNzRGV0YWlsczogYW55ID0ge1xuICAgIGNoYWluUGF0aDogcGF0aCxcbiAgICBwYXRoOiBwYXRoLFxuICAgIGNoYWluOiBwYXRoRGV0YWlsc1swXSxcbiAgICBpbmRleDogcGF0aERldGFpbHNbMV0sXG4gICAgd2FsbGV0OiB0aGlzLmlkKCksXG4gIH07XG5cbiAgY29uc3Qge1xuICAgIHNjcmlwdFB1YktleTogb3V0cHV0U2NyaXB0LFxuICAgIHJlZGVlbVNjcmlwdCxcbiAgICB3aXRuZXNzU2NyaXB0LFxuICB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoZGVyaXZlZEtleXMsIGlzU2Vnd2l0ID8gJ3Ayc2hQMndzaCcgOiAncDJzaCcpO1xuXG4gIGFkZHJlc3NEZXRhaWxzLndpdG5lc3NTY3JpcHQgPSB3aXRuZXNzU2NyaXB0Py50b1N0cmluZygnaGV4Jyk7XG4gIGFkZHJlc3NEZXRhaWxzLnJlZGVlbVNjcmlwdCA9IHJlZGVlbVNjcmlwdD8udG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5vdXRwdXRTY3JpcHQgPSBvdXRwdXRTY3JpcHQudG9TdHJpbmcoJ2hleCcpO1xuICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzID0gdXR4b2xpYi5hZGRyZXNzLmZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0LCBnZXROZXR3b3JrKG5ldHdvcmspKTtcblxuICByZXR1cm4gYWRkcmVzc0RldGFpbHM7XG59O1xuXG4vL1xuLy8gdmFsaWRhdGVBZGRyZXNzXG4vLyBWYWxpZGF0ZXMgYW4gYWRkcmVzcyBhbmQgcGF0aCBieSBjYWxjdWxhdGluZyBpdCBsb2NhbGx5IGZyb20gdGhlIGtleWNoYWluIHhwdWJzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS52YWxpZGF0ZUFkZHJlc3MgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcycsICdwYXRoJ10sIFtdKTtcbiAgY29uc3QgaXNTZWd3aXQgPSAhIXBhcmFtcy53aXRuZXNzU2NyaXB0ICYmIHBhcmFtcy53aXRuZXNzU2NyaXB0Lmxlbmd0aCA+IDA7XG5cbiAgY29uc3QgZ2VuZXJhdGVkQWRkcmVzcyA9IHRoaXMuZ2VuZXJhdGVBZGRyZXNzKHsgcGF0aDogcGFyYW1zLnBhdGgsIHNlZ3dpdDogaXNTZWd3aXQgfSk7XG4gIGlmIChnZW5lcmF0ZWRBZGRyZXNzLmFkZHJlc3MgIT09IHBhcmFtcy5hZGRyZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogJyArIHBhcmFtcy5hZGRyZXNzICsgJyB2cy4gJyArIGdlbmVyYXRlZEFkZHJlc3MuYWRkcmVzcyk7XG4gIH1cbn07XG5cbi8vXG4vLyBhZGRyZXNzZXNcbi8vIEdldHMgdGhlIGFkZHJlc3NlcyBvZiBhIEhEIHdhbGxldC5cbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICBsaW1pdDogdGhlIG51bWJlciBvZiBhZGRyZXNzZXMgdG8gZ2V0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5hZGRyZXNzZXMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHF1ZXJ5OiBhbnkgPSB7fTtcbiAgaWYgKHBhcmFtcy5kZXRhaWxzKSB7XG4gICAgcXVlcnkuZGV0YWlscyA9IDE7XG4gIH1cblxuICBjb25zdCBjaGFpbiA9IHBhcmFtcy5jaGFpbjtcbiAgaWYgKGNoYWluICE9PSBudWxsICYmIGNoYWluICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFpbikpIHtcbiAgICAgIHF1ZXJ5LmNoYWluID0gXy51bmlxKF8uZmlsdGVyKGNoYWluLCBfLmlzSW50ZWdlcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hhaW4gIT09IDAgJiYgY2hhaW4gIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNoYWluIGFyZ3VtZW50LCBleHBlY3RpbmcgMCBvciAxJyk7XG4gICAgICB9XG4gICAgICBxdWVyeS5jaGFpbiA9IGNoYWluO1xuICAgIH1cbiAgfVxuICBpZiAocGFyYW1zLmxpbWl0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubGltaXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgICB9XG4gICAgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gIH1cbiAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIHF1ZXJ5LnNraXAgPSBwYXJhbXMuc2tpcDtcbiAgfVxuICBpZiAocGFyYW1zLnNvcnQpIHtcbiAgICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLnNvcnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc29ydCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBxdWVyeS5zb3J0ID0gcGFyYW1zLnNvcnQ7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL2FkZHJlc3NlcycpO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLnN0YXRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbGltaXQ9JyArIHBhcmFtcy5saW1pdCk7XG4gIH1cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3N0YXRzJyArIHF1ZXJ5KTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogUmVmcmVzaCB0aGUgd2FsbGV0IG9iamVjdCBieSBzeW5jaW5nIHdpdGggdGhlIGJhY2stZW5kXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtXYWxsZXR9XG4gKi9cbldhbGxldC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBjbyhmdW5jdGlvbiogKCkge1xuICAgIC8vIHdoZW4gc2V0IHRvIHRydWUsIGdwayByZXR1cm5zIHRoZSBwcml2YXRlIGRhdGEgb2Ygc2FmZSB3YWxsZXRzXG4gICAgY29uc3QgcXVlcnkgPSBfLmV4dGVuZCh7fSwgXy5waWNrKHBhcmFtcywgWydncGsnXSkpO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgcmVzID0geWllbGQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgdGhpcy53YWxsZXQgPSByZXM7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICByZXR1cm4gdGhpcztcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBhZGRyZXNzXG4vLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGFkZHJlc3Mgb24gYSBIRCB3YWxsZXQuXG4vLyBJbmZvcm1hdGlvbiBpbmNsdWRlcyBpbmRleCwgcGF0aCwgcmVkZWVtU2NyaXB0LCBzZW50LCByZWNlaXZlZCwgdHhDb3VudCBhbmQgYmFsYW5jZVxuLy8gT3B0aW9ucyBpbmNsdWRlOlxuLy8gIGFkZHJlc3M6IHRoZSBhZGRyZXNzIG9uIHRoaXMgd2FsbGV0IHRvIGdldFxuLy9cbldhbGxldC5wcm90b3R5cGUuYWRkcmVzcyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy9hZGRyZXNzZXMvJyArIHBhcmFtcy5hZGRyZXNzKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogRnJlZXplIHRoZSB3YWxsZXQgZm9yIGEgZHVyYXRpb24gb2YgY2hvaWNlLCBzdG9wcGluZyBCaXRHbyBmcm9tIHNpZ25pbmcgYW55IHRyYW5zYWN0aW9ucy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCBUaGUgZHVyYXRpb24gdG8gZnJlZXplIHRoZSB3YWxsZXQgZm9yIGluIHNlY29uZHMsIGRlZmF1bHRzIHRvIDM2MDAuXG4gKi9cbldhbGxldC5wcm90b3R5cGUuZnJlZXplID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmR1cmF0aW9uKSB7XG4gICAgaWYgKCFfLmlzTnVtYmVyKHBhcmFtcy5kdXJhdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBkdXJhdGlvbiAtIHNob3VsZCBiZSBudW1iZXIgb2Ygc2Vjb25kcycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2ZyZWV6ZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGRlbGV0ZVxuLy8gRGVsZXRlcyB0aGUgd2FsbGV0XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCkpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBsYWJlbHNcbi8vIExpc3QgdGhlIGxhYmVscyBmb3IgdGhlIGFkZHJlc3NlcyBpbiBhIGdpdmVuIHdhbGxldFxuLy9cbldhbGxldC5wcm90b3R5cGUubGFiZWxzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgnbGFiZWxzJykpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBSZW5hbWUgYSB3YWxsZXRcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICAtIGxhYmVsOiB0aGUgd2FsbGV0J3MgaW50ZW5kZWQgbmV3IG5hbWVcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuc2V0V2FsbGV0TmFtZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydsYWJlbCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLmlkKCkpO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnB1dCh1cmwpLnNlbmQoeyBsYWJlbDogcGFyYW1zLmxhYmVsIH0pLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZXRMYWJlbFxuLy8gU2V0cyBhIGxhYmVsIG9uIHRoZSBwcm92aWRlZCBhZGRyZXNzXG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZXRMYWJlbCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydhZGRyZXNzJywgJ2xhYmVsJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFzZWxmLmJpdGdvLnZlcmlmeUFkZHJlc3MoeyBhZGRyZXNzOiBwYXJhbXMuYWRkcmVzcyB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBiaXRjb2luIGFkZHJlc3M6ICcgKyBwYXJhbXMuYWRkcmVzcyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLmJpdGdvLnVybCgnL2xhYmVscy8nICsgdGhpcy5pZCgpICsgJy8nICsgcGFyYW1zLmFkZHJlc3MpO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHVybCkuc2VuZCh7IGxhYmVsOiBwYXJhbXMubGFiZWwgfSkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGRlbGV0ZUxhYmVsXG4vLyBEZWxldGVzIHRoZSBsYWJlbCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGFkZHJlc3Ncbi8vXG5XYWxsZXQucHJvdG90eXBlLmRlbGV0ZUxhYmVsID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2FkZHJlc3MnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcblxuICBpZiAoIXNlbGYuYml0Z28udmVyaWZ5QWRkcmVzcyh7IGFkZHJlc3M6IHBhcmFtcy5hZGRyZXNzIH0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJpdGNvaW4gYWRkcmVzczogJyArIHBhcmFtcy5hZGRyZXNzKTtcbiAgfVxuXG4gIGNvbnN0IHVybCA9IHRoaXMuYml0Z28udXJsKCcvbGFiZWxzLycgKyB0aGlzLmlkKCkgKyAnLycgKyBwYXJhbXMuYWRkcmVzcyk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodXJsKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdW5zcGVudHNcbi8vIExpc3QgQUxMIHRoZSB1bnNwZW50cyBmb3IgYSBnaXZlbiB3YWxsZXRcbi8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGEgcGFnZWQgbGlzdCBvZiBhbGwgdW5zcGVudHNcbi8vXG4vLyBQYXJhbWV0ZXJzIGluY2x1ZGU6XG4vLyAgIGxpbWl0OiAgdGhlIG9wdGlvbmFsIGxpbWl0IG9mIHVuc3BlbnRzIHRvIGNvbGxlY3QgaW4gQlRDXG4vLyAgIG1pbkNvbmY6IG9ubHkgaW5jbHVkZSByZXN1bHRzIHdpdGggdGhpcyBudW1iZXIgb2YgY29uZmlybWF0aW9uc1xuLy8gICB0YXJnZXQ6IHRoZSBhbW91bnQgb2YgYnRjIHRvIGZpbmQgdG8gc3BlbmRcbi8vICAgaW5zdGFudDogb25seSBmaW5kIGluc3RhbnQgdHJhbnNhY3Rpb25zIChtdXN0IHNwZWNpZnkgYSB0YXJnZXQpXG4vL1xuV2FsbGV0LnByb3RvdHlwZS51bnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgYWxsVW5zcGVudHM6IGFueVtdID0gW107XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGNvbnN0IGdldFVuc3BlbnRzQmF0Y2ggPSBmdW5jdGlvbiAoc2tpcCwgbGltaXQ/KSB7XG4gICAgY29uc3QgcXVlcnlPYmplY3QgPSBfLmNsb25lRGVlcChwYXJhbXMpO1xuICAgIGlmIChza2lwID4gMCkge1xuICAgICAgcXVlcnlPYmplY3Quc2tpcCA9IHNraXA7XG4gICAgfVxuICAgIGlmIChsaW1pdCAmJiBsaW1pdCA+IDApIHtcbiAgICAgIHF1ZXJ5T2JqZWN0LmxpbWl0ID0gbGltaXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGYudW5zcGVudHNQYWdlZChxdWVyeU9iamVjdCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAvLyBUaGUgQVBJIGhhcyBpdHMgb3duIGxpbWl0IGhhbmRsaW5nLiBGb3IgZXhhbXBsZSwgdGhlIEFQSSBkb2VzIG5vdCBzdXBwb3J0IGxpbWl0cyBiaWdnZXIgdGhhbiA1MDAuIElmIHRoZSBsaW1pdFxuICAgICAgLy8gc3BlY2lmaWVkIGhlcmUgaXMgYmlnZ2VyIHRoYW4gdGhhdCwgd2Ugd2lsbCBoYXZlIHRvIGRvIG11bHRpcGxlIHJlcXVlc3RzIHdpdGggbmVjZXNzYXJ5IGxpbWl0IGFkanVzdG1lbnQuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC51bnNwZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB1bnNwZW50ID0gcmVzdWx0LnVuc3BlbnRzW2ldO1xuICAgICAgICBhbGxVbnNwZW50cy5wdXNoKHVuc3BlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBPdXIgbGltaXQgYWRqdXN0bWVudCBtYWtlcyBzdXJlIHRoYXQgd2UgbmV2ZXIgZmV0Y2ggbW9yZSB1bnNwZW50cyB0aGFuIHdlIG5lZWQsIG1lYW5pbmcgdGhhdCBpZiB3ZSBoaXQgdGhlXG4gICAgICAvLyBsaW1pdCwgd2UgaGl0IGl0IHByZWNpc2VseVxuICAgICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA+PSBwYXJhbXMubGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGFsbFVuc3BlbnRzOyAvLyB3ZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBhbnkgZnVydGhlciB1bnNwZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3RhbFVuc3BlbnRDb3VudCA9IHJlc3VsdC50b3RhbDtcbiAgICAgIC8vIGlmIG5vIHRhcmdldCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBTREsgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaGFzIGJlZW4gYSBsaW1pdCwgd2UgbmVlZCB0byBmZXRjaCBhbm90aGVyIGJhdGNoXG4gICAgICBpZiAoIXBhcmFtcy50YXJnZXQgJiYgdG90YWxVbnNwZW50Q291bnQgJiYgdG90YWxVbnNwZW50Q291bnQgPiBhbGxVbnNwZW50cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gd2UgbmVlZCB0byBmZXRjaCB0aGUgbmV4dCBiYXRjaFxuICAgICAgICAvLyBsZXQncyBqdXN0IG9mZnNldCB0aGUgY3VycmVudCBza2lwIGJ5IHRoZSBjb3VudFxuICAgICAgICBjb25zdCBuZXdTa2lwID0gc2tpcCArIHJlc3VsdC5jb3VudDtcbiAgICAgICAgbGV0IG5ld0xpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChsaW1pdCA+IDApIHtcbiAgICAgICAgICAvLyB3ZSBzZXQgdGhlIG5ldyBsaW1pdCB0byBiZSBwcmVjaXNlbHkgdGhlIG51bWJlciBvZiBtaXNzaW5nIHVuc3BlbnRzIHRvIGhpdCBvdXIgb3duIGxpbWl0XG4gICAgICAgICAgbmV3TGltaXQgPSBsaW1pdCAtIGFsbFVuc3BlbnRzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0VW5zcGVudHNCYXRjaChuZXdTa2lwLCBuZXdMaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGxVbnNwZW50cztcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gZ2V0VW5zcGVudHNCYXRjaCgwLCBwYXJhbXMubGltaXQpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBMaXN0IHRoZSB1bnNwZW50cyAocGFnZWQpIGZvciBhIGdpdmVuIHdhbGxldCwgcmV0dXJuaW5nIHRoZSByZXN1bHQgYXMgYW4gb2JqZWN0IG9mIHVuc3BlbnRzLCBjb3VudCwgc2tpcCBhbmQgdG90YWxcbiAqIFRoaXMgbWV0aG9kIG1heSBub3QgcmV0dXJuIGFsbCB0aGUgdW5zcGVudHMgYXMgdGhlIGxpc3QgaXMgcGFnZWQgYnkgdGhlIEFQSVxuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIHBhcmFtcy5saW1pdCB0aGUgb3B0aW9uYWwgbGltaXQgb2YgdW5zcGVudHMgdG8gY29sbGVjdCBpbiBCVENcbiAqIEBwYXJhbSBwYXJhbXMuc2tpcCBpbmRleCBpbiBsaXN0IG9mIHVuc3BlbnRzIHRvIHN0YXJ0IHBhZ2luZyBmcm9tXG4gKiBAcGFyYW0gcGFyYW1zLm1pbkNvbmZpcm1zIG9ubHkgaW5jbHVkZSByZXN1bHRzIHdpdGggdGhpcyBudW1iZXIgb2YgY29uZmlybWF0aW9uc1xuICogQHBhcmFtIHBhcmFtcy50YXJnZXQgdGhlIGFtb3VudCBvZiBidGMgdG8gZmluZCB0byBzcGVuZFxuICogQHBhcmFtIHBhcmFtcy5pbnN0YW50IG9ubHkgZmluZCBpbnN0YW50IHRyYW5zYWN0aW9ucyAobXVzdCBzcGVjaWZ5IGEgdGFyZ2V0KVxuICogQHBhcmFtIHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cyBkZXNpcmVkIG51bWJlciBvZiB1bnNwZW50cyB0byBoYXZlIGluIHRoZSB3YWxsZXQgYWZ0ZXIgdGhlIHR4IGdvZXMgdGhyb3VnaCAocmVxdWlyZXMgdGFyZ2V0KVxuICogQHBhcmFtIHBhcmFtcy5taW5TaXplIG1pbmltdW0gdW5zcGVudCBzaXplIGluIHNhdG9zaGlzXG4gKiBAcGFyYW0gcGFyYW1zLnNlZ3dpdCByZXF1ZXN0IHNlZ3dpdCB1bnNwZW50cyAoZGVmYXVsdHMgdG8gdHJ1ZSBpZiB1bmRlZmluZWQpXG4gKiBAcGFyYW0gcGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0IGFsbG93IHNlZ3dpdCB1bnNwZW50cyBmb3IgbGVkZ2VyIGRldmljZXMgKGRlZmF1bHRzIHRvIGZhbHNlIGlmIHVuZGVmaW5lZClcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUudW5zcGVudHNQYWdlZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5saW1pdCkgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5saW1pdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbGltaXQgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5za2lwKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnNraXApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNraXAgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy5taW5Db25maXJtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluQ29uZmlybXMgLSBzaG91bGQgYmUgbnVtYmVyJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXQpICYmICFfLmlzTnVtYmVyKHBhcmFtcy50YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHRhcmdldCAtIHNob3VsZCBiZSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBmbGFnIC0gc2hvdWxkIGJlIGJvb2xlYW4nKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5zZWd3aXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlZ3dpdCBmbGFnIC0gc2hvdWxkIGJlIGJvb2xlYW4nKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSAmJiAhXy5pc0ludGVnZXIocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0YXJnZXRXYWxsZXRVbnNwZW50cyBmbGFnIC0gc2hvdWxkIGJlIG51bWJlcicpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMubWluU2l6ZSkgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50OiBtaW5TaXplIG11c3QgYmUgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5taW5Db25maXJtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgb25lIG9mIGluc3RhbnQgYW5kIG1pbkNvbmZpcm1zIG1heSBiZSBkZWZpbmVkJyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykgJiYgXy5pc1VuZGVmaW5lZChwYXJhbXMudGFyZ2V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0V2FsbGV0VW5zcGVudHMgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluIGNvbmp1bmN0aW9uIHdpdGggYSB0YXJnZXQnKTtcbiAgfVxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmFsbG93TGVkZ2VyU2Vnd2l0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudDogYWxsb3dMZWRnZXJTZWd3aXQgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5T2JqZWN0ID0gXy5jbG9uZURlZXAocGFyYW1zKTtcblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnRhcmdldCkpIHtcbiAgICAvLyBza2lwIGFuZCBsaW1pdCBhcmUgdW5hdmFpbGFibGUgd2hlbiBhIHRhcmdldCBpcyBzcGVjaWZpZWRcbiAgICBkZWxldGUgcXVlcnlPYmplY3Quc2tpcDtcbiAgICBkZWxldGUgcXVlcnlPYmplY3QubGltaXQ7XG4gIH1cblxuICBxdWVyeU9iamVjdC5zZWd3aXQgPSB0cnVlO1xuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLnNlZ3dpdCkpIHtcbiAgICBxdWVyeU9iamVjdC5zZWd3aXQgPSBwYXJhbXMuc2Vnd2l0O1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdCkpIHtcbiAgICBxdWVyeU9iamVjdC5hbGxvd0xlZGdlclNlZ3dpdCA9IHBhcmFtcy5hbGxvd0xlZGdlclNlZ3dpdDtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvdW5zcGVudHMnKSkucXVlcnkocXVlcnlPYmplY3QpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB0cmFuc2FjdGlvbnNcbi8vIExpc3QgdGhlIHRyYW5zYWN0aW9ucyBmb3IgYSBnaXZlbiB3YWxsZXRcbi8vIE9wdGlvbnMgaW5jbHVkZTpcbi8vICAgICBUT0RPOiAgQWRkIGl0ZXJhdG9ycyBmb3Igc3RhcnQvY291bnQvZXRjXG5XYWxsZXQucHJvdG90eXBlLnRyYW5zYWN0aW9ucyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKHBhcmFtcy5saW1pdCkge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLmxpbWl0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGxpbWl0IGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbGltaXQ9JyArIHBhcmFtcy5saW1pdCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5za2lwKSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2tpcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBza2lwIGFyZ3VtZW50LCBleHBlY3RpbmcgbnVtYmVyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnc2tpcD0nICsgcGFyYW1zLnNraXApO1xuICB9XG4gIGlmIChwYXJhbXMubWluSGVpZ2h0KSB7XG4gICAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubWluSGVpZ2h0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbkhlaWdodCBhcmd1bWVudCwgZXhwZWN0aW5nIG51bWJlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21pbkhlaWdodD0nICsgcGFyYW1zLm1pbkhlaWdodCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5tYXhIZWlnaHQpIHtcbiAgICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5tYXhIZWlnaHQpIHx8IHBhcmFtcy5tYXhIZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4SGVpZ2h0IGFyZ3VtZW50LCBleHBlY3RpbmcgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgIH1cbiAgICBhcmdzLnB1c2goJ21heEhlaWdodD0nICsgcGFyYW1zLm1heEhlaWdodCk7XG4gIH1cbiAgaWYgKHBhcmFtcy5taW5Db25maXJtcykge1xuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1pbkNvbmZpcm1zKSB8fCBwYXJhbXMubWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluQ29uZmlybXMgYXJndW1lbnQsIGV4cGVjdGluZyBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gICAgfVxuICAgIGFyZ3MucHVzaCgnbWluQ29uZmlybXM9JyArIHBhcmFtcy5taW5Db25maXJtcyk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5jb21wYWN0KSkge1xuICAgIGlmICghXy5pc0Jvb2xlYW4ocGFyYW1zLmNvbXBhY3QpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY29tcGFjdCBhcmd1bWVudCwgZXhwZWN0aW5nIGJvb2xlYW4nKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKCdjb21wYWN0PScgKyBwYXJhbXMuY29tcGFjdCk7XG4gIH1cbiAgbGV0IHF1ZXJ5ID0gJyc7XG4gIGlmIChhcmdzLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gJz8nICsgYXJncy5qb2luKCcmJyk7XG4gIH1cblxuICBjb25zdCB1cmwgPSB0aGlzLnVybCgnL3R4JyArIHF1ZXJ5KTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB0cmFuc2FjdGlvblxuLy8gR2V0IGEgdHJhbnNhY3Rpb24gYnkgSUQgZm9yIGEgZ2l2ZW4gd2FsbGV0XG5XYWxsZXQucHJvdG90eXBlLmdldFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eC8nICsgcGFyYW1zLmlkKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh1cmwpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBwb2xsRm9yVHJhbnNhY3Rpb25cbi8vIFBvbGwgYSB0cmFuc2FjdGlvbiB1bnRpbCBzdWNjZXNzZnVsIG9yIHRpbWVzIG91dFxuLy8gUGFyYW1ldGVyczpcbi8vICAgaWQ6IHRoZSB0eGlkXG4vLyAgIGRlbGF5OiBkZWxheSBiZXR3ZWVuIHBvbGxzIGluIG1zIChkZWZhdWx0OiAxMDAwKVxuLy8gICB0aW1lb3V0OiB0aW1lb3V0IGluIG1zIChkZWZhdWx0OiAxMDAwMClcbldhbGxldC5wcm90b3R5cGUucG9sbEZvclRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbXSwgY2FsbGJhY2spO1xuICBpZiAocGFyYW1zLmRlbGF5ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5kZWxheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZGVsYXkgcGFyYW1ldGVyJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy50aW1lb3V0ICYmICFfLmlzTnVtYmVyKHBhcmFtcy50aW1lb3V0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0aW1lb3V0IHBhcmFtZXRlcicpO1xuICB9XG4gIHBhcmFtcy5kZWxheSA9IHBhcmFtcy5kZWxheSB8fCAxMDAwO1xuICBwYXJhbXMudGltZW91dCA9IHBhcmFtcy50aW1lb3V0IHx8IDEwMDAwO1xuXG4gIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoKTtcblxuICBjb25zdCBkb05leHRQb2xsID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBzZWxmXG4gICAgICAuZ2V0VHJhbnNhY3Rpb24ocGFyYW1zKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIuc3RhdHVzICE9PSA0MDQgfHwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydC52YWx1ZU9mKCkgPiBwYXJhbXMudGltZW91dCkge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmx1ZWJpcmQuZGVsYXkocGFyYW1zLmRlbGF5KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZG9OZXh0UG9sbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBkb05leHRQb2xsKCk7XG59O1xuXG4vL1xuLy8gdHJhbnNhY3Rpb24gYnkgc2VxdWVuY2UgaWRcbi8vIEdldCBhIHRyYW5zYWN0aW9uIGJ5IHNlcXVlbmNlIGlkIGZvciBhIGdpdmVuIHdhbGxldFxuV2FsbGV0LnByb3RvdHlwZS5nZXRXYWxsZXRUcmFuc2FjdGlvbkJ5U2VxdWVuY2VJZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydzZXF1ZW5jZUlkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgdXJsID0gdGhpcy51cmwoJy90eC9zZXF1ZW5jZS8nICsgcGFyYW1zLnNlcXVlbmNlSWQpO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIEtleSBjaGFpbnNcbi8vIEdldHMgdGhlIHVzZXIga2V5IGNoYWluIGZvciB0aGlzIHdhbGxldFxuLy8gVGhlIHVzZXIga2V5IGNoYWluIGlzIHR5cGljYWxseSB0aGUgZmlyc3Qga2V5Y2hhaW4gb2YgdGhlIHdhbGxldCBhbmQgaGFzIHRoZSBlbmNyeXB0ZWQgeHByaXYgc3RvcmVkIG9uIEJpdEdvLlxuLy8gVXNlZnVsIHdoZW4gdHJ5aW5nIHRvIGdldCB0aGUgdXNlcnMnIGtleWNoYWluIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgZGVjcnlwdGluZyB0byBzaWduIGEgdHJhbnNhY3Rpb24uXG5XYWxsZXQucHJvdG90eXBlLmdldEVuY3J5cHRlZFVzZXJLZXljaGFpbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBjbyhmdW5jdGlvbiogKCkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgdHJ5S2V5Q2hhaW4gPSBjbyhmdW5jdGlvbiogKGluZGV4KSB7XG4gICAgICBpZiAoIXNlbGYua2V5Y2hhaW5zIHx8IGluZGV4ID49IHNlbGYua2V5Y2hhaW5zLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdObyBlbmNyeXB0ZWQga2V5Y2hhaW5zIG9uIHRoaXMgd2FsbGV0LicpO1xuICAgICAgICBlcnJvci5jb2RlID0gJ25vX2VuY3J5cHRlZF9rZXljaGFpbl9vbl93YWxsZXQnO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1zID0geyB4cHViOiBzZWxmLmtleWNoYWluc1tpbmRleF0ueHB1YiB9O1xuXG4gICAgICBjb25zdCBrZXljaGFpbiA9IHlpZWxkIHNlbGYuYml0Z28ua2V5Y2hhaW5zKCkuZ2V0KHBhcmFtcyk7XG4gICAgICAvLyBJZiB3ZSBmaW5kIHRoZSB4cHJ2LCB0aGVuIHRoaXMgaXMgcHJvYmFibHkgdGhlIHVzZXIga2V5Y2hhaW4gd2UncmUgbG9va2luZyBmb3JcbiAgICAgIGtleWNoYWluLndhbGxldFN1YlBhdGggPSBzZWxmLmtleWNoYWluc1tpbmRleF0ucGF0aDtcbiAgICAgIGlmIChrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2KSB7XG4gICAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnlLZXlDaGFpbihpbmRleCArIDEpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyeUtleUNoYWluKDApO1xuICB9KVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLmFzQ2FsbGJhY2soY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZVRyYW5zYWN0aW9uXG4vLyBDcmVhdGUgYSB0cmFuc2FjdGlvbiAodW5zaWduZWQpLiBUbyBzaWduIGl0LCBkbyBzaWduVHJhbnNhY3Rpb25cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHJlY2lwaWVudHMgLSBvYmplY3Qgb2YgcmVjaXBpZW50IGFkZHJlc3NlcyBhbmQgdGhlIGFtb3VudCB0byBzZW5kIHRvIGVhY2ggZS5nLiB7YWRkcmVzczoxNTAwLCBhZGRyZXNzMjoxNTAwfVxuLy8gICBmZWUgICAgICAtIHRoZSBibG9ja2NoYWluIGZlZSB0byBzZW5kIChvcHRpb25hbClcbi8vICAgZmVlUmF0ZSAgLSB0aGUgZmVlIHBlciBrYiB0byBzZW5kIChvcHRpb25hbClcbi8vICAgbWluQ29uZmlybXMgLSBtaW5pbXVtIG51bWJlciBvZiBjb25maXJtcyB0byB1c2Ugd2hlbiBnYXRoZXJpbmcgdW5zcGVudHNcbi8vICAgZm9yY2VDaGFuZ2VBdEVuZCAtIGZvcmNlIGNoYW5nZSBhZGRyZXNzIHRvIGJlIGxhc3Qgb3V0cHV0IChvcHRpb25hbClcbi8vICAgbm9TcGxpdENoYW5nZSAtIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuLy8gICBjaGFuZ2VBZGRyZXNzIC0gb3ZlcnJpZGUgdGhlIGNoYW5nZSBhZGRyZXNzIChvcHRpb25hbClcbi8vICAgdmFsaWRhdGUgLSBleHRyYSB2ZXJpZmljYXRpb24gb2YgY2hhbmdlIGFkZHJlc3NlcyAod2hpY2ggYXJlIGFsd2F5cyB2ZXJpZmllZCBzZXJ2ZXItc2lkZSkgKGRlZmF1bHRzIHRvIGdsb2JhbCBjb25maWcpXG4vLyBSZXR1cm5zOlxuLy8gICBjYWxsYmFjayhlcnIsIHsgdHJhbnNhY3Rpb25IZXg6IHN0cmluZywgdW5zcGVudHM6IFtpbnB1dHNdLCBmZWU6IHNhdG9zaGlzIH0pXG5XYWxsZXQucHJvdG90eXBlLmNyZWF0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChcbiAgICAoIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZSkpIHx8XG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHx8XG4gICAgKCFfLmlzTnVtYmVyKHBhcmFtcy5taW5Db25maXJtcykgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLm1pbkNvbmZpcm1zKSkgfHxcbiAgICAoIV8uaXNCb29sZWFuKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkpIHx8XG4gICAgKCFfLmlzU3RyaW5nKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSAmJiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuY2hhbmdlQWRkcmVzcykpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMudmFsaWRhdGUpICYmICFfLmlzVW5kZWZpbmVkKHBhcmFtcy52YWxpZGF0ZSkpIHx8XG4gICAgKCFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkgJiYgIV8uaXNVbmRlZmluZWQocGFyYW1zLmluc3RhbnQpKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyByZWNpcGllbnRzIG9iamVjdCcpO1xuICB9XG5cbiAgcGFyYW1zLnZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG4gIHBhcmFtcy53YWxsZXQgPSB0aGlzO1xuXG4gIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24ocGFyYW1zKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzaWduVHJhbnNhY3Rpb25cbi8vIFNpZ24gYSBwcmV2aW91c2x5IGNyZWF0ZWQgdHJhbnNhY3Rpb24gd2l0aCBhIGtleWNoYWluXG4vLyBQYXJhbWV0ZXJzOlxuLy8gdHJhbnNhY3Rpb25IZXggLSBzZXJpYWxpemVkIGZvcm0gb2YgdGhlIHRyYW5zYWN0aW9uIGluIGhleFxuLy8gdW5zcGVudHMgLSBhcnJheSBvZiB1bnNwZW50IGluZm9ybWF0aW9uLCB3aGVyZSBlYWNoIHVuc3BlbnQgaXMgYSBjaGFpblBhdGhcbi8vICAgICAgICAgICAgYW5kIHJlZGVlbVNjcmlwdCB3aXRoIHRoZSBzYW1lIGluZGV4IGFzIHRoZSBpbnB1dHMgaW4gdGhlXG4vLyAgICAgICAgICAgIHRyYW5zYWN0aW9uSGV4XG4vLyBrZXljaGFpbiAtIEtleWNoYWluIGNvbnRhaW5pbmcgdGhlIHhwcnYgdG8gc2lnbiB3aXRoLlxuLy8gc2lnbmluZ0tleSAtIEZvciBsZWdhY3kgc2FmZSB3YWxsZXRzLCB0aGUgcHJpdmF0ZSBrZXkgc3RyaW5nLlxuLy8gdmFsaWRhdGUgLSBleHRyYSB2ZXJpZmljYXRpb24gb2Ygc2lnbmF0dXJlcyAod2hpY2ggYXJlIGFsd2F5cyB2ZXJpZmllZCBzZXJ2ZXItc2lkZSkgKGRlZmF1bHRzIHRvIGdsb2JhbCBjb25maWcpXG4vLyBSZXR1cm5zOlxuLy8gICBjYWxsYmFjayhlcnIsIHRyYW5zYWN0aW9uKVxuV2FsbGV0LnByb3RvdHlwZS5zaWduVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0cmFuc2FjdGlvbkhleCddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdGhlIHVuc3BlbnRzIGFycmF5Jyk7XG4gIH1cblxuICBpZiAoKCFfLmlzT2JqZWN0KHBhcmFtcy5rZXljaGFpbikgfHwgIXBhcmFtcy5rZXljaGFpbi54cHJ2KSAmJiAhXy5pc1N0cmluZyhwYXJhbXMuc2lnbmluZ0tleSkpIHtcbiAgICAvLyBhbGxvdyBwYXNzaW5nIGluIGEgV0lGIHByaXZhdGUga2V5IGZvciBsZWdhY3kgc2FmZSB3YWxsZXQgc3VwcG9ydFxuICAgIGNvbnN0IGVycm9yOiBhbnkgPSBuZXcgRXJyb3IoJ2V4cGVjdGluZyBrZXljaGFpbiBvYmplY3Qgd2l0aCB4cHJ2IG9yIHNpZ25pbmdLZXkgV0lGJyk7XG4gICAgZXJyb3IuY29kZSA9ICdtaXNzaW5nX2tleWNoYWluX29yX3NpZ25pbmdLZXknO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcGFyYW1zLnZhbGlkYXRlID0gcGFyYW1zLnZhbGlkYXRlICE9PSB1bmRlZmluZWQgPyBwYXJhbXMudmFsaWRhdGUgOiB0aGlzLmJpdGdvLmdldFZhbGlkYXRlKCk7XG4gIHBhcmFtcy5iaXRnbyA9IHRoaXMuYml0Z287XG4gIHJldHVybiBUcmFuc2FjdGlvbkJ1aWxkZXIuc2lnblRyYW5zYWN0aW9uKHBhcmFtcylcbiAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eDogcmVzdWx0LnRyYW5zYWN0aW9uSGV4LFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBzZW5kXG4vLyBTZW5kIGEgdHJhbnNhY3Rpb24gdG8gdGhlIEJpdGNvaW4gbmV0d29yayB2aWEgQml0R28uXG4vLyBPbmUgb2YgdGhlIGtleXMgaXMgdHlwaWNhbGx5IHNpZ25lZCwgYW5kIEJpdEdvIHdpbGwgc2lnbiB0aGUgb3RoZXIgKGlmIGFwcHJvdmVkKSBhbmQgcmVsYXkgaXQgdG8gdGhlIFAyUCBuZXR3b3JrLlxuLy8gUGFyYW1ldGVyczpcbi8vICAgdHggIC0gdGhlIGhleCBlbmNvZGVkLCBzaWduZWQgdHJhbnNhY3Rpb24gdG8gc2VuZFxuLy8gUmV0dXJuczpcbi8vXG5XYWxsZXQucHJvdG90eXBlLnNlbmRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd0eCddLCBbJ21lc3NhZ2UnLCAnb3RwJ10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby51cmwoJy90eC9zZW5kJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihmdW5jdGlvbiAoYm9keSkge1xuICAgICAgaWYgKGJvZHkucGVuZGluZ0FwcHJvdmFsKSB7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZChib2R5LCB7IHN0YXR1czogJ3BlbmRpbmdBcHByb3ZhbCcgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChib2R5Lm90cCkge1xuICAgICAgICByZXR1cm4gXy5leHRlbmQoYm9keSwgeyBzdGF0dXM6ICdvdHAnIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6ICdhY2NlcHRlZCcsXG4gICAgICAgIHR4OiBib2R5LnRyYW5zYWN0aW9uLFxuICAgICAgICBoYXNoOiBib2R5LnRyYW5zYWN0aW9uSGFzaCxcbiAgICAgICAgaW5zdGFudDogYm9keS5pbnN0YW50LFxuICAgICAgICBpbnN0YW50SWQ6IGJvZHkuaW5zdGFudElkLFxuICAgICAgfTtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogU2hhcmUgdGhlIHdhbGxldCB3aXRoIGFuIGV4aXN0aW5nIEJpdEdvIHVzZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgcmVjaXBpZW50J3MgdXNlciBpZCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyB1c2VyIHJlY29yZCBpbiBvdXIgZGF0YWJhc2UuXG4gKiBAcGFyYW0ge2tleWNoYWlufSBrZXljaGFpbiBUaGUga2V5Y2hhaW4gdG8gYmUgc2hhcmVkIHdpdGggdGhlIHJlY2lwaWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9ucyBBIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHJlY2lwaWVudCdzIHBlcm1pc3Npb25zIGlmIHRoZSBzaGFyZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIHVzZWQgZm9yIHRoaXMgc2hhcmUuXG4gKi9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlU2hhcmUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsndXNlcicsICdwZXJtaXNzaW9ucyddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGlmIChwYXJhbXMua2V5Y2hhaW4gJiYgIV8uaXNFbXB0eShwYXJhbXMua2V5Y2hhaW4pKSB7XG4gICAgaWYgKFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi54cHViIHx8XG4gICAgICAhcGFyYW1zLmtleWNoYWluLmVuY3J5cHRlZFhwcnYgfHxcbiAgICAgICFwYXJhbXMua2V5Y2hhaW4uZnJvbVB1YktleSB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi50b1B1YktleSB8fFxuICAgICAgIXBhcmFtcy5rZXljaGFpbi5wYXRoXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVzIGtleWNoYWluIHBhcmFtZXRlcnMgLSB4cHViLCBlbmNyeXB0ZWRYcHJ2LCBmcm9tUHViS2V5LCB0b1B1YktleSwgcGF0aCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL3NoYXJlJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlSW52aXRlXG4vLyBpbnZpdGUgYSBub24gQml0R28gY3VzdG9tZXIgdG8gam9pbiBhIHdhbGxldFxuLy8gUGFyYW1ldGVyczpcbi8vICAgZW1haWwgLSB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzc1xuLy8gICBwZXJtaXNzaW9ucyAtIHRoZSByZWNpcGllbnQncyBwZXJtaXNzaW9ucyBpZiB0aGUgc2hhcmUgaXMgYWNjZXB0ZWRcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jcmVhdGVJbnZpdGUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnZW1haWwnLCAncGVybWlzc2lvbnMnXSwgWydtZXNzYWdlJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgdG9FbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgIHBlcm1pc3Npb25zOiBwYXJhbXMucGVybWlzc2lvbnMsXG4gIH07XG5cbiAgaWYgKHBhcmFtcy5tZXNzYWdlKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2U7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9pbnZpdGUnKSkuc2VuZChvcHRpb25zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY29uZmlybUludml0ZUFuZFNoYXJlV2FsbGV0XG4vLyBjb25maXJtIG15IGludml0ZSBvbiB0aGlzIHdhbGxldCB0byBhIHJlY2lwaWVudCB3aG8gaGFzXG4vLyBzdWJzZXF1ZW50bHkgc2lnbmVkIHVwIGJ5IGNyZWF0aW5nIHRoZSBhY3R1YWwgd2FsbGV0IHNoYXJlXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICB3YWxsZXRJbnZpdGVJZCAtIHRoZSB3YWxsZXQgaW52aXRlIGlkXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSByZXF1aXJlZCBpZiB0aGUgd2FsbGV0IHNoYXJlIHN1Y2Nlc3MgaXMgZXhwZWN0ZWRcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5jb25maXJtSW52aXRlQW5kU2hhcmVXYWxsZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnd2FsbGV0SW52aXRlSWQnXSwgWyd3YWxsZXRQYXNzcGhyYXNlJ10sIGNhbGxiYWNrKTtcblxuICBjb25zdCBzZWxmID0gdGhpcztcbiAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAud2FsbGV0cygpXG4gICAgLmxpc3RJbnZpdGVzKClcbiAgICAudGhlbihmdW5jdGlvbiAoaW52aXRlcykge1xuICAgICAgY29uc3Qgb3V0Z29pbmcgPSBpbnZpdGVzLm91dGdvaW5nO1xuICAgICAgY29uc3QgaW52aXRlID0gXy5maW5kKG91dGdvaW5nLCBmdW5jdGlvbiAob3V0KSB7XG4gICAgICAgIHJldHVybiBvdXQuaWQgPT09IHBhcmFtcy53YWxsZXRJbnZpdGVJZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpbnZpdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3YWxsZXQgaW52aXRlIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlbWFpbDogaW52aXRlLnRvRW1haWwsXG4gICAgICAgIHBlcm1pc3Npb25zOiBpbnZpdGUucGVybWlzc2lvbnMsXG4gICAgICAgIG1lc3NhZ2U6IGludml0ZS5tZXNzYWdlLFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzZWxmLnNoYXJlV2FsbGV0KG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIHJldHVybiB0aGlzLmJpdGdvLnB1dCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldGludml0ZS8nICsgcGFyYW1zLndhbGxldEludml0ZUlkKSk7XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2VuZENvaW5zXG4vLyBTZW5kIGNvaW5zIHRvIGEgZGVzdGluYXRpb24gYWRkcmVzcyBmcm9tIHRoaXMgd2FsbGV0IHVzaW5nIHRoZSB1c2VyIGtleS5cbi8vIDEuIEdldHMgdGhlIHVzZXIga2V5Y2hhaW4gYnkgY2hlY2tpbmcgdGhlIHdhbGxldCBmb3IgYSBrZXkgd2hpY2ggaGFzIGFuIGVuY3J5cHRlZCB4cHJpdlxuLy8gMi4gRGVjcnlwdHMgdXNlciBrZXlcbi8vIDMuIENyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGVmYXVsdCBmZWVcbi8vIDQuIFNpZ25zIHRyYW5zYWN0aW9uIHdpdGggZGVjcnlwdGVkIHVzZXIga2V5XG4vLyAzLiBTZW5kcyB0aGUgdHJhbnNhY3Rpb24gdG8gQml0R29cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICBhZGRyZXNzIC0gdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Ncbi8vICAgYW1vdW50IC0gdGhlIGFtb3VudCBpbiBzYXRvc2hpcyB0byBiZSBzZW50XG4vLyAgIG1lc3NhZ2UgLSBvcHRpb25hbCBtZXNzYWdlIHRvIGF0dGFjaCB0byB0cmFuc2FjdGlvblxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gICB4cHJ2IC0gdGhlIHByaXZhdGUga2V5IGluIHN0cmluZyBmb3JtLCBpZiB3YWxsZXRQYXNzcGhyYXNlIGlzIG5vdCBhdmFpbGFibGVcbi8vICAgKFNlZSB0cmFuc2FjdGlvbkJ1aWxkZXIuY3JlYXRlVHJhbnNhY3Rpb24gZm9yIG90aGVyIHBhc3N0aHJvdWdoIHBhcmFtcylcbi8vIFJldHVybnM6XG4vL1xuV2FsbGV0LnByb3RvdHlwZS5zZW5kQ29pbnMgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnYWRkcmVzcyddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIGlmICghXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgYW1vdW50IC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBwYXJhbXMucmVjaXBpZW50cyA9IHt9O1xuICBwYXJhbXMucmVjaXBpZW50c1twYXJhbXMuYWRkcmVzc10gPSBwYXJhbXMuYW1vdW50O1xuXG4gIHJldHVybiB0aGlzLnNlbmRNYW55KHBhcmFtcykubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gc2VuZE1hbnlcbi8vIFNlbmQgY29pbnMgdG8gbXVsdGlwbGUgZGVzdGluYXRpb24gYWRkcmVzc2VzIGZyb20gdGhpcyB3YWxsZXQgdXNpbmcgdGhlIHVzZXIga2V5LlxuLy8gMS4gR2V0cyB0aGUgdXNlciBrZXljaGFpbiBieSBjaGVja2luZyB0aGUgd2FsbGV0IGZvciBhIGtleSB3aGljaCBoYXMgYW4gZW5jcnlwdGVkIHhwcml2XG4vLyAyLiBEZWNyeXB0cyB1c2VyIGtleVxuLy8gMy4gQ3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWZhdWx0IGZlZVxuLy8gNC4gU2lnbnMgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQgdXNlciBrZXlcbi8vIDMuIFNlbmRzIHRoZSB0cmFuc2FjdGlvbiB0byBCaXRHb1xuLy9cbi8vIFBhcmFtZXRlcnM6XG4vLyAgIHJlY2lwaWVudHMgLSBhcnJheSBvZiB7IGFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBudW1iZXIsIHRyYXZlbEluZm86IG9iamVjdCB9IHRvIHNlbmQgdG9cbi8vICAgd2FsbGV0UGFzc3BocmFzZSAtIHRoZSBwYXNzcGhyYXNlIHRvIGJlIHVzZWQgdG8gZGVjcnlwdCB0aGUgdXNlciBrZXkgb24gdGhpcyB3YWxsZXRcbi8vICAgeHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybSwgaWYgd2FsbGV0UGFzc3BocmFzZSBpcyBub3QgYXZhaWxhYmxlXG4vLyAgIChTZWUgdHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uIGZvciBvdGhlciBwYXNzdGhyb3VnaCBwYXJhbXMpXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuc2VuZE1hbnkgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ21lc3NhZ2UnLCAnb3RwJ10sIGNhbGxiYWNrKTtcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHJlY2lwaWVudHMgb2JqZWN0Jyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgZmVlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWVSYXRlIC0gbnVtYmVyIGV4cGVjdGVkJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLmluc3RhbnQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgaW5zdGFudCAtIGJvb2xlYW4gZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIGxldCBiaXRnb0ZlZTtcbiAgbGV0IHRyYXZlbEluZm9zO1xuICBsZXQgZmluYWxSZXN1bHQ7XG4gIGxldCB1bnNwZW50c1VzZWQ7XG5cbiAgY29uc3QgYWNjZXB0ZWRCdWlsZFBhcmFtcyA9IFtcbiAgICAnbnVtQmxvY2tzJyxcbiAgICAnZmVlUmF0ZScsXG4gICAgJ21pbkNvbmZpcm1zJyxcbiAgICAnZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlJyxcbiAgICAndGFyZ2V0V2FsbGV0VW5zcGVudHMnLFxuICAgICdtZXNzYWdlJyxcbiAgICAnbWluVmFsdWUnLFxuICAgICdtYXhWYWx1ZScsXG4gICAgJ25vU3BsaXRDaGFuZ2UnLFxuICAgICdjb21tZW50JyxcbiAgXTtcbiAgY29uc3QgcHJlc2VydmVkQnVpbGRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBhY2NlcHRlZEJ1aWxkUGFyYW1zKTtcblxuICAvLyBHZXQgdGhlIHVzZXIga2V5Y2hhaW5cbiAgY29uc3QgcmV0UHJvbWlzZSA9IHRoaXMuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uKHBhcmFtcylcbiAgICAudGhlbihmdW5jdGlvbiAodHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIFNlbmQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICBiaXRnb0ZlZSA9IHRyYW5zYWN0aW9uLmJpdGdvRmVlO1xuICAgICAgdHJhdmVsSW5mb3MgPSB0cmFuc2FjdGlvbi50cmF2ZWxJbmZvcztcbiAgICAgIHVuc3BlbnRzVXNlZCA9IHRyYW5zYWN0aW9uLnVuc3BlbnRzO1xuICAgICAgcmV0dXJuIHNlbGYuc2VuZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHg6IHRyYW5zYWN0aW9uLnR4LFxuICAgICAgICBtZXNzYWdlOiBwYXJhbXMubWVzc2FnZSxcbiAgICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LFxuICAgICAgICBvdHA6IHBhcmFtcy5vdHAsXG4gICAgICAgIC8vIFRoZSBiZWxvdyBwYXJhbXMgYXJlIGZvciBsb2dnaW5nIG9ubHksIGFuZCBkbyBub3QgaW1wYWN0IHRoZSBBUEkgY2FsbFxuICAgICAgICBlc3RpbWF0ZWRTaXplOiB0cmFuc2FjdGlvbi5lc3RpbWF0ZWRTaXplLFxuICAgICAgICBidWlsZFBhcmFtczogcHJlc2VydmVkQnVpbGRQYXJhbXMsXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIGNvbnN0IHR4ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgocmVzdWx0LnR4LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgY29uc3QgaW5wdXRzU3VtID0gXy5zdW1CeSh1bnNwZW50c1VzZWQsICd2YWx1ZScpO1xuICAgICAgY29uc3Qgb3V0cHV0c1N1bSA9IF8uc3VtQnkodHgub3V0cywgJ3ZhbHVlJyk7XG4gICAgICBjb25zdCBmZWVVc2VkID0gaW5wdXRzU3VtIC0gb3V0cHV0c1N1bTtcbiAgICAgIGlmIChpc05hTihmZWVVc2VkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlVXNlZCcpO1xuICAgICAgfVxuICAgICAgKHJlc3VsdC5mZWUgPSBmZWVVc2VkKSwgKHJlc3VsdC5mZWVSYXRlID0gKGZlZVVzZWQgKiAxMDAwKSAvIHR4LnZpcnR1YWxTaXplKCkpO1xuICAgICAgcmVzdWx0LnRyYXZlbEluZm9zID0gdHJhdmVsSW5mb3M7XG4gICAgICBpZiAoYml0Z29GZWUpIHtcbiAgICAgICAgcmVzdWx0LmJpdGdvRmVlID0gYml0Z29GZWU7XG4gICAgICB9XG4gICAgICBmaW5hbFJlc3VsdCA9IHJlc3VsdDtcblxuICAgICAgLy8gSGFuZGxlIHNlbmRpbmcgdHJhdmVsIGluZm9zIGlmIHRoZXkgZXhpc3QsIGJ1dCBtYWtlIHN1cmUgd2UgbmV2ZXIgZmFpbCBoZXJlLlxuICAgICAgLy8gRXJyb3Igb3IgcmVzdWx0ICh3aXRoIHBvc3NpYmxlIHN1Yi1lcnJvcnMpIHdpbGwgYmUgcHJvdmlkZWQgaW4gdHJhdmVsUmVzdWx0XG4gICAgICBpZiAodHJhdmVsSW5mb3MgJiYgdHJhdmVsSW5mb3MubGVuZ3RoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGZcbiAgICAgICAgICAgIC5wb2xsRm9yVHJhbnNhY3Rpb24oeyBpZDogcmVzdWx0Lmhhc2ggfSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYml0Z28udHJhdmVsUnVsZSgpLnNlbmRNYW55KHJlc3VsdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAgICAgICBmaW5hbFJlc3VsdC50cmF2ZWxSZXN1bHQgPSByZXM7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gY2F0Y2ggYXN5bmMgZXJyb3JzXG4gICAgICAgICAgICAgIGZpbmFsUmVzdWx0LnRyYXZlbFJlc3VsdCA9IHsgZXJyb3I6IGVyci5tZXNzYWdlIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gY2F0Y2ggc3luY2hyb25vdXMgZXJyb3JzXG4gICAgICAgICAgZmluYWxSZXN1bHQudHJhdmVsUmVzdWx0ID0geyBlcnJvcjogZXJyLm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0O1xuICAgIH0pO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShyZXRQcm9taXNlKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQWNjZWxlcmF0ZSBhIHN0dWNrIHRyYW5zYWN0aW9uIHVzaW5nIENoaWxkLVBheXMtRm9yLVBhcmVudCAoQ1BGUCkuXG4gKlxuICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzdHVjayB0cmFuc2FjdGlvbnMgd2hpY2ggaGF2ZSBubyB1bmNvbmZpcm1lZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIElucHV0IHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudHJhbnNhY3Rpb25JRCAtIElEIG9mIHRyYW5zYWN0aW9uIHRvIGFjY2VsZXJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBwYXJhbXMuZmVlUmF0ZSAtIE5ldyBlZmZlY3RpdmUgZmVlIHJhdGUgZm9yIHN0dWNrIHRyYW5zYWN0aW9uIChzYXQgcGVyIDEwMDAgYnl0ZXMpXG4gKiBAcGFyYW0ge051bWJlcn0gcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyAtIE1heGltdW0gYWRkaXRpb25hbCB1bnNwZW50cyB0byB1c2UgZnJvbSB0aGUgd2FsbGV0IHRvIGNvdmVyIGFueSBjaGlsZCBmZWVzIHRoYXQgdGhlIHBhcmVudCB1bnNwZW50IG91dHB1dCBjYW5ub3QgY292ZXIuIERlZmF1bHRzIHRvIDEwMC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIFRoZSBwYXNzcGhyYXNlIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHdhbGxldCBwcml2YXRlIGtleS4gT25lIG9mIGVpdGhlciB3YWxsZXRQYXNzcGhyYXNlIG9yIHhwcnYgaXMgcmVxdWlyZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnhwcnYgLSBUaGUgcHJpdmF0ZSBrZXkgZm9yIHRoZSB3YWxsZXQuIE9uZSBvZiBlaXRoZXIgd2FsbGV0UGFzc3BocmFzZSBvciB4cHJ2IGlzIHJlcXVpcmVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIFJlc3VsdCBvZiBzZW5kVHJhbnNhY3Rpb24oKSBvbiB0aGUgY2hpbGQgdHJhbnNhY3Rpb25cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5hY2NlbGVyYXRlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBhY2NlbGVyYXRlVHJhbnNhY3Rpb24ocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiB0byBlc3RpbWF0ZSBhIHRyYW5zYWN0aW9ucyBzaXplIGluIHZpcnR1YWwgYnl0ZXMuXG4gICAqIEFjdHVhbCB0cmFuc2FjdGlvbnMgbWF5IGJlIHNsaWdodGx5IGZld2VyIHZpcnR1YWwgYnl0ZXMsIGR1ZSB0b1xuICAgKiB0aGUgZmFjdCB0aGF0IHZhbGlkIEVDU0RBIHNpZ25hdHVyZXMgaGF2ZSBhIHZhcmlhYmxlIGxlbmd0aFxuICAgKiBiZXR3ZWVuIDggYW5kIDczIHZpcnR1YWwgYnl0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMuc2Vnd2l0IFRoZSBudW1iZXIgb2Ygc2Vnd2l0IGlucHV0cyB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIGlucHV0cy5QMlNIIFRoZSBudW1iZXIgb2YgUDJTSCBpbnB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBpbnB1dHMuUDJQS0ggVGhlIG51bWJlciBvZiBQMlBLSCBpbnB1dHMgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBjb25zdCBlc3RpbWF0ZVR4VlNpemUgPSAoaW5wdXRzKSA9PiB7XG4gICAgY29uc3Qgc2Vnd2l0ID0gaW5wdXRzLnNlZ3dpdCB8fCAwO1xuICAgIGNvbnN0IFAyU0ggPSBpbnB1dHMuUDJTSCB8fCAwO1xuICAgIGNvbnN0IFAyUEtIID0gaW5wdXRzLlAyUEtIIHx8IDA7XG5cbiAgICBjb25zdCBjaGlsZEZlZUluZm8gPSBUcmFuc2FjdGlvbkJ1aWxkZXIuY2FsY3VsYXRlTWluZXJGZWVJbmZvKHtcbiAgICAgIG5QMnNoSW5wdXRzOiBQMlNILFxuICAgICAgblAycGtoSW5wdXRzOiBQMlBLSCxcbiAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHNlZ3dpdCxcbiAgICAgIG5PdXRwdXRzOiAxLFxuICAgICAgZmVlUmF0ZTogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiBjaGlsZEZlZUluZm8uc2l6ZTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2F0b3NoaXMgdGhhdCBzaG91bGQgYmUgcGFpZCBpbiBmZWVzIGJ5IHRoZSBjaGlsZCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIElucHV0cyB0byB0aGUgY2hpbGQgdHJhbnNhY3Rpb24gd2hpY2ggYXJlIHBhc3NlZCB0byBlc3RpbWF0ZVR4VlNpemVcbiAgICogQHBhcmFtIHBhcmVudEZlZSBUaGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoZSBwYXJlbnQgdHggb3JpZ2luYWxseSBwYWlkIGluIGZlZXNcbiAgICogQHBhcmFtIHBhcmVudFZTaXplIFRoZSBudW1iZXIgb2YgdmlydHVhbCBieXRlcyBpbiB0aGUgcGFyZW50IHR4XG4gICAqIEBwYXJhbSBmZWVSYXRlIFRoZSBuZXcgZmVlIHJhdGUgd2hpY2ggc2hvdWxkIGJlIHBhaWQgYnkgdGhlIGNvbWJpbmVkIENQRlAgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBzYXRvc2hpcyB0aGUgY2hpbGQgdHggc2hvdWxkIHBheSBpbiBmZWVzXG4gICAqL1xuICBjb25zdCBlc3RpbWF0ZUNoaWxkRmVlID0gKHsgaW5wdXRzLCBwYXJlbnRGZWUsIHBhcmVudFZTaXplLCBmZWVSYXRlIH0pID0+IHtcbiAgICAvLyBjYWxjdWxhdGUgaG93IG11Y2ggbW9yZSB3ZSAqc2hvdWxkKiBoYXZlIHBhaWQgaW4gcGFyZW50IGZlZXMsXG4gICAgLy8gaGFkIHRoZSBwYXJlbnQgYmVlbiBvcmlnaW5hbGx5IHNlbnQgd2l0aCB0aGUgbmV3IGZlZSByYXRlXG4gICAgY29uc3QgYWRkaXRpb25hbFBhcmVudEZlZSA9IF8uY2VpbCgocGFyZW50VlNpemUgKiBmZWVSYXRlKSAvIDEwMDApIC0gcGFyZW50RmVlO1xuXG4gICAgLy8gY2FsY3VsYXRlIGhvdyBtdWNoIHdlIHdvdWxkIHBheSBpbiBmZWVzIGZvciB0aGUgY2hpbGQsXG4gICAgLy8gaWYgaXQgd2VyZSBvbmx5IHBheWluZyBmb3IgaXRzZWxmIGF0IHRoZSBuZXcgZmVlIHJhdGVcbiAgICBjb25zdCBjaGlsZEZlZSA9IChlc3RpbWF0ZVR4VlNpemUoaW5wdXRzKSAqIGZlZVJhdGUpIC8gMTAwMDtcblxuICAgIHJldHVybiBfLmNlaWwoY2hpbGRGZWUgKyBhZGRpdGlvbmFsUGFyZW50RmVlKTtcbiAgfTtcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyB0byB1c2UgdG8gcGF5IHRoZSBjaGlsZCB0eCBmZWVzLlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB0aGUgcGFyZW50IHR4IG91dHB1dCBpcyBub3Qgc3VmZmljaWVudCB0b1xuICAgKiBjb3ZlciB0aGUgdG90YWwgZmVlcyB3aGljaCBzaG91bGQgYmUgcGFpZCBieSB0aGUgY2hpbGQgdHguXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXRzIHRvIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiB3aGljaCBhcmUgcGFzc2VkIHRvIGVzdGltYXRlVHhWU2l6ZVxuICAgKiBAcGFyYW0gcGFyZW50T3V0cHV0VmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBvdXRwdXQgZnJvbSB0aGUgcGFyZW50IHR4IHdoaWNoIHdlIGFyZSB1c2luZyBhcyBhbiBpbnB1dCB0byB0aGUgY2hpbGQgdHhcbiAgICogQHBhcmFtIHBhcmVudEZlZSBUaGUgbnVtYmVyIG9mIHNhdG9zaGlzIHRoZSBwYXJlbnQgdHggb3JpZ2luYWxseSBwYWlkIGluIGZlZXNcbiAgICogQHBhcmFtIHBhcmVudFZTaXplIFRoZSBudW1iZXIgb2YgdmlydHVhbCBieXRlcyBpbiB0aGUgcGFyZW50IHR4XG4gICAqIEBwYXJhbSBtYXhVbnNwZW50cyBUaGUgbWF4aW11bSBudW1iZXIgb2YgYWRkaXRpb25hbCB1bnNwZW50cyB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBjb3ZlciB0aGUgcmVtYWluaW5nIGNoaWxkIGZlZXNcbiAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIGFkZGl0aW9uYWwgdW5zcGVudHMgdG8gdXNlLCB0aGUgdXBkYXRlZCBudW1iZXIgb2Ygc2F0b3NoaXMgd2hpY2ggc2hvdWxkIGJlIHBhaWQgYnlcbiAgICogICAgICAgICAgdGhlIGNoaWxkIHR4LCBhbmQgdGhlIHVwZGF0ZWQgaW5wdXRzIGZvciB0aGUgY2hpbGQgdHguXG4gICAqL1xuICBjb25zdCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzID0gKHsgaW5wdXRzLCBwYXJlbnRPdXRwdXRWYWx1ZSwgcGFyZW50RmVlLCBwYXJlbnRWU2l6ZSwgbWF4VW5zcGVudHMgfSkgPT4ge1xuICAgIHJldHVybiBjbyhmdW5jdGlvbiogY29GaW5kQWRkaXRpb25hbFVuc3BlbnRzKCkge1xuICAgICAgY29uc3QgYWRkaXRpb25hbFVuc3BlbnRzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAvLyBhc2sgdGhlIHNlcnZlciBmb3IgZW5vdWdoIHVuc3BlbnRzIHRvIGNvdmVyIHRoZSBjaGlsZCBmZWUsIGFzc3VtaW5nXG4gICAgICAvLyB0aGF0IGl0IGNhbiBiZSBkb25lIHdpdGhvdXQgYWRkaXRpb25hbCB1bnNwZW50cyAod2hpY2ggaXMgbm90IHBvc3NpYmxlLFxuICAgICAgLy8gc2luY2UgaWYgdGhhdCB3ZXJlIHRoZSBjYXNlLCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzIHdvdWxkIG5vdCBoYXZlIGJlZW5cbiAgICAgIC8vIGNhbGxlZCBpbiB0aGUgZmlyc3QgcGxhY2UuIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgYmVmb3JlIHJldHVybmluZylcbiAgICAgIGxldCBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgbGV0IHVuY292ZXJlZENoaWxkRmVlID0gY3VycmVudENoaWxkRmVlRXN0aW1hdGUgLSBwYXJlbnRPdXRwdXRWYWx1ZTtcblxuICAgICAgd2hpbGUgKHVuY292ZXJlZENoaWxkRmVlID4gMCAmJiBhZGRpdGlvbmFsVW5zcGVudHMubGVuZ3RoIDwgbWF4VW5zcGVudHMpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGdldCBlbm91Z2ggdW5zcGVudHMgdG8gY292ZXIgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkIGZlZVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgICBjb25zdCB1bnNwZW50cyA9ICh5aWVsZCB0aGlzLnVuc3BlbnRzKHtcbiAgICAgICAgICBtaW5Db25maXJtczogMSxcbiAgICAgICAgICB0YXJnZXQ6IHVuY292ZXJlZENoaWxkRmVlLFxuICAgICAgICAgIGxpbWl0OiBtYXhVbnNwZW50cyAtIGFkZGl0aW9uYWxVbnNwZW50cy5sZW5ndGgsXG4gICAgICAgIH0pKSBhcyBhbnk7XG5cbiAgICAgICAgaWYgKHVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vIG5vIG1vcmUgdW5zcGVudHMgYXJlIGF2YWlsYWJsZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFkZGl0aW9uYWxVbnNwZW50VmFsdWUgPSAwO1xuXG4gICAgICAgIC8vIGNvbnN1bWUgYWxsIHVuc3BlbnRzIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIsIGV2ZW4gaWYgd2UgZG9uJ3QgbmVlZFxuICAgICAgICAvLyBhbGwgb2YgdGhlbSB0byBjb3ZlciB0aGUgY2hpbGQgZmVlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNlcnZlciB3aWxsXG4gICAgICAgIC8vIHJldHVybiBlbm91Z2ggdW5zcGVudCB2YWx1ZSB0byBlbnN1cmUgdGhhdCB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50XG4gICAgICAgIC8vIGlzIGFjaGlldmVkIGZvciB0aGUgY2hpbGQgdHgsIGFuZCB3ZSBjYW4ndCBsZWF2ZSBvdXQgdGhvc2UgdW5zcGVudHNcbiAgICAgICAgLy8gb3IgZWxzZSB0aGUgbWluaW11bSBjaGFuZ2UgYW1vdW50IGNvbnN0cmFpbnQgY291bGQgYmUgdmlvbGF0ZWRcbiAgICAgICAgXy5mb3JFYWNoKHVuc3BlbnRzLCAodW5zcGVudCkgPT4ge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY2hpbGQgdHggaW5wdXRzXG4gICAgICAgICAgY29uc3QgdW5zcGVudENoYWluID0gZ2V0Q2hhaW4odW5zcGVudCk7XG4gICAgICAgICAgaWYgKGlzQ2hhaW5Db2RlKHVuc3BlbnRDaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKHVuc3BlbnRDaGFpbikgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICAgICAgICBpbnB1dHMuc2Vnd2l0Kys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0cy5QMlNIKys7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRzLnB1c2godW5zcGVudCk7XG4gICAgICAgICAgYWRkaXRpb25hbFVuc3BlbnRWYWx1ZSArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjdXJyZW50Q2hpbGRGZWVFc3RpbWF0ZSA9IGVzdGltYXRlQ2hpbGRGZWUoeyBpbnB1dHMsIHBhcmVudEZlZSwgcGFyZW50VlNpemUsIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlIH0pO1xuICAgICAgICB1bmNvdmVyZWRDaGlsZEZlZSA9IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlIC0gcGFyZW50T3V0cHV0VmFsdWUgLSBhZGRpdGlvbmFsVW5zcGVudFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5jb3ZlcmVkQ2hpbGRGZWUgPiAwKSB7XG4gICAgICAgIC8vIFVuYWJsZSB0byBmaW5kIGVub3VnaCB1bnNwZW50cyB0byBjb3ZlciB0aGUgY2hpbGQgZmVlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW5zdWZmaWNpZW50IGNvbmZpcm1lZCB1bnNwZW50cyBhdmFpbGFibGUgdG8gY292ZXIgdGhlIGNoaWxkIGZlZWApO1xuICAgICAgfVxuXG4gICAgICAvLyBmb3VuZCBlbm91Z2ggdW5zcGVudHNcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFkZGl0aW9uYWw6IGFkZGl0aW9uYWxVbnNwZW50cyxcbiAgICAgICAgbmV3Q2hpbGRGZWU6IGN1cnJlbnRDaGlsZEZlZUVzdGltYXRlLFxuICAgICAgICBuZXdJbnB1dHM6IGlucHV0cyxcbiAgICAgIH07XG4gICAgfSkuY2FsbCh0aGlzKTtcbiAgfTtcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBhIGZ1bGwgY29weSAoaW5jbHVkaW5nIHdpdG5lc3MgZGF0YSkgb2YgYW4gYXJiaXRyYXJ5IHR4IHVzaW5nIG9ubHkgdGhlIHR4IGlkLlxuICAgKlxuICAgKiBXZSBoYXZlIHRvIHVzZSBhbiBleHRlcm5hbCBzZXJ2aWNlIGZvciB0aGlzIChjdXJyZW50bHkgYmxvY2tzdHJlYW0uaW5mbyksIHNpbmNlXG4gICAqIHRoZSB2MSBpbmRleGVyIHNlcnZpY2UgKGJhc2VkIG9uIGJpdGNvaW5qKSBkb2VzIG5vdCBoYXZlIHNlZ3dpdCBzdXBwb3J0IGFuZFxuICAgKiBkb2VzIG5vdCByZXR1cm4gYW55IHNlZ3dpdCByZWxhdGVkIGZpZWxkcyBpbiB0aGUgdHggaGV4LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyZW50VHhJZCBUaGUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uIHRvIGdldCB0aGUgZnVsbCBoZXggb2ZcbiAgICogQHJldHVybnMge0JsdWViaXJkPGFueT59IFRoZSBmdWxsIGhleCBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UGFyZW50VHhIZXgoeyBwYXJlbnRUeElkIH06IHsgcGFyZW50VHhJZDogc3RyaW5nIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGV4cGxvcmVyQmFzZVVybCA9IGNvbW1vbi5FbnZpcm9ubWVudHNbc2VsZi5iaXRnby5nZXRFbnYoKV0uYnRjRXhwbG9yZXJCYXNlVXJsO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcXVlc3QuZ2V0KGAke2V4cGxvcmVyQmFzZVVybH0vdHgvJHtwYXJlbnRUeElkfS9oZXhgKTtcblxuICAgIGlmICghcmVzdWx0LnRleHQgfHwgIS8oW2EtZjAtOV17Mn0pKy8udGVzdChyZXN1bHQudGV4dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3Qgc3VjY2Vzc2Z1bGx5IHJlY2VpdmUgcGFyZW50IHR4IGhleC4gUmVjZWl2ZWQgJyR7Xy50cnVuY2F0ZShyZXN1bHQudGV4dCwgeyBsZW5ndGg6IDEwMCB9KX0nIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgY2hhaW4gZnJvbSBhbiB1bnNwZW50IG9yIHR4IG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dE9yVW5zcGVudCBUaGUgb3V0cHV0IG9yIHVuc3BlbnQgd2hvc2UgY2hhaW4gc2hvdWxkIGJlIGRldGVybWluZWRcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIGNoYWluIGZvciB0aGUgZ2l2ZW4gb3V0cHV0IG9yIHVuc3BlbnRcbiAgICovXG4gIGNvbnN0IGdldENoYWluID0gKG91dHB1dE9yVW5zcGVudCkgPT4ge1xuICAgIGlmIChvdXRwdXRPclVuc3BlbnQuY2hhaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG91dHB1dE9yVW5zcGVudC5jaGFpbjtcbiAgICB9XG5cbiAgICBpZiAob3V0cHV0T3JVbnNwZW50LmNoYWluUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gXy50b051bWJlcihvdXRwdXRPclVuc3BlbnQuY2hhaW5QYXRoLnNwbGl0KCcvJylbMV0pO1xuICAgIH1cblxuICAgIC8vIG5vIHdheSB0byB0ZWxsIHRoZSBjaGFpbiwgbGV0J3MganVzdCBibG93IHVwIG5vdyBpbnN0ZWFkXG4gICAgLy8gb2YgYmxvd2luZyB1cCBsYXRlciB3aGVuIHRoZSB1bmRlZmluZWQgcmV0dXJuIHZhbHVlIGlzIHVzZWQuXG4gICAgLy8gTm90ZTogZm9yIHVuc3BlbnRzIHRoZSBmaWVsZCB0byB1c2UgaXMgJ2FkZHJlc3MnLCBidXQgZm9yIG91dHB1dHNcbiAgICAvLyB0aGUgZmllbGQgdG8gdXNlIGlzICdhY2NvdW50J1xuICAgIHRocm93IEVycm9yKGBDb3VsZCBub3QgZ2V0IGNoYWluIGZvciBvdXRwdXQgb24gYWNjb3VudCAke291dHB1dE9yVW5zcGVudC5hY2NvdW50IHx8IG91dHB1dE9yVW5zcGVudC5hZGRyZXNzfWApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBhY3R1YWwgdmFsdWUgY29udHJpYnV0aW9uIGFuIG91dHB1dCBvciB1bnNwZW50IHdpbGxcbiAgICogY29udHJpYnV0ZSB0byBhIHRyYW5zYWN0aW9uLCB3ZXJlIGl0IHRvIGJlIHVzZWQuIEVhY2ggdHlwZSBvZiBvdXRwdXQgb3IgdW5zcGVudFxuICAgKiB3aWxsIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgY29udHJpYnV0aW9uIHNpbmNlIGVhY2ggdHlwZSBoYXMgYSBkaWZmZXJlbnQgbnVtYmVyXG4gICAqIG9mIHZpcnR1YWwgYnl0ZXMsIGFuZCB0aHVzIHdpbGwgY2F1c2UgYSBkaWZmZXJlbnQgZmVlIHRvIGJlIHBhaWQuXG4gICAqXG4gICAqIEBwYXJhbSBvdXRwdXRPclVuc3BlbnQgT3V0cHV0IG9yIHVuc3BlbnQgd2hvc2UgZWZmZWN0aXZlIHZhbHVlIHNob3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBhY3R1YWwgbnVtYmVyIG9mIHNhdG9zaGlzIHRoYXQgdGhpcyB1bnNwZW50IG9yIG91dHB1dFxuICAgKiAgICAgICAgICAgICAgICAgICB3b3VsZCBjb250cmlidXRlIHRvIGEgdHJhbnNhY3Rpb24sIHdlcmUgaXQgdG8gYmUgdXNlZC5cbiAgICovXG4gIGNvbnN0IGVmZmVjdGl2ZVZhbHVlID0gKG91dHB1dE9yVW5zcGVudCkgPT4ge1xuICAgIGNvbnN0IGNoYWluID0gZ2V0Q2hhaW4ob3V0cHV0T3JVbnNwZW50KTtcbiAgICBpZiAoaXNDaGFpbkNvZGUoY2hhaW4pICYmIHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbikgPT09ICdwMnNoUDJ3c2gnKSB7XG4gICAgICAvLyBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgaXMgaW4gYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY29udmVydCB0byBrQlxuICAgICAgcmV0dXJuIG91dHB1dE9yVW5zcGVudC52YWx1ZSAtIChWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwO1xuICAgIH1cbiAgICAvLyBWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplIGlzIGluIGJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8ga0JcbiAgICByZXR1cm4gb3V0cHV0T3JVbnNwZW50LnZhbHVlIC0gKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb3JvdXRpbmUgd2hpY2ggYWN0dWFsbHkgaW1wbGVtZW50cyB0aGUgYWNjZWxlcmF0ZVRyYW5zYWN0aW9uIGFsZ29yaXRobVxuICAgKlxuICAgKiBEZXNjcmliZWQgYXQgYSBoaWdoIGxldmVsLCB0aGUgYWxnb3JpdGhtIGlzIGFzIGZvbGxvd3M6XG4gICAqIDEpIEZpbmQgYXBwcm9wcmlhdGUgb3V0cHV0IGZyb20gcGFyZW50IHRyYW5zYWN0aW9uIHRvIHVzZSBhcyBjaGlsZCB0cmFuc2FjdGlvbiBpbnB1dFxuICAgKiAyKSBGaW5kIHVuc3BlbnQgY29ycmVzcG9uZGluZyB0byBwYXJlbnQgdHJhbnNhY3Rpb24gb3V0cHV0LiBJZiBub3QgZm91bmQsIHJldHVybiB0byBzdGVwIDEuXG4gICAqIDMpIERldGVybWluZSBpZiBwYXJlbnQgdHJhbnNhY3Rpb24gdW5zcGVudCBjYW4gY292ZXIgZW50aXJlIGNoaWxkIGZlZSwgcGx1cyBtaW5pbXVtIGNoYW5nZVxuICAgKiA0KSBJZiB5ZXMsIGdvIHRvIHN0ZXAgNlxuICAgKiA1KSBPdGhlcndpc2UsIGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyBmcm9tIHRoZSB3YWxsZXQgdG8gdXNlIHRvIGNvdmVyIHRoZSByZW1haW5pbmcgY2hpbGQgZmVlXG4gICAqIDYpIENyZWF0ZSBhbmQgc2lnbiB0aGUgY2hpbGQgdHJhbnNhY3Rpb24sIHVzaW5nIHRoZSBwYXJlbnQgdHJhbnNhY3Rpb24gb3V0cHV0XG4gICAqICAgIChhbmQsIGlmIG5lY2Vzc2FyeSwgYWRkaXRpb25hbCB3YWxsZXQgdW5zcGVudHMpIGFzIGlucHV0c1xuICAgKiA3KSBCcm9hZGNhc3QgdGhlIG5ldyBjaGlsZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgcmV0dXJuIGNvKGZ1bmN0aW9uKiBjb0FjY2VsZXJhdGVUcmFuc2FjdGlvbigpOiBhbnkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3RyYW5zYWN0aW9uSUQnXSwgW10sIGNhbGxiYWNrKTtcblxuICAgIC8vIHZhbGlkYXRlIGZlZSByYXRlXG4gICAgaWYgKHBhcmFtcy5mZWVSYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXI6IGZlZVJhdGUnKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzRmluaXRlKHBhcmFtcy5mZWVSYXRlKSB8fCBwYXJhbXMuZmVlUmF0ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGluZyBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyIGZvciBwYXJhbWV0ZXI6IGZlZVJhdGUnKTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBtYXhVbnNwZW50c1xuICAgIGlmIChwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGJ5IGRlZmF1bHQsIHVzZSBhdCBtb3N0IDEwMCBhZGRpdGlvbmFsIHVuc3BlbnRzIChub3QgaW5jbHVkaW5nIHRoZSB1bnNwZW50IG91dHB1dCBmcm9tIHRoZSBwYXJlbnQgdHgpXG4gICAgICBwYXJhbXMubWF4QWRkaXRpb25hbFVuc3BlbnRzID0gMTAwO1xuICAgIH1cblxuICAgIGlmICghXy5pc0ludGVnZXIocGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cykgfHwgcGFyYW1zLm1heEFkZGl0aW9uYWxVbnNwZW50cyA8PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignRXhwZWN0aW5nIHBvc2l0aXZlIGludGVnZXIgZm9yIHBhcmFtZXRlcjogbWF4QWRkaXRpb25hbFVuc3BlbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBwYXJlbnRUeCA9IHlpZWxkIHRoaXMuZ2V0VHJhbnNhY3Rpb24oeyBpZDogcGFyYW1zLnRyYW5zYWN0aW9uSUQgfSk7XG4gICAgaWYgKHBhcmVudFR4LmNvbmZpcm1hdGlvbnMgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uICR7cGFyYW1zLnRyYW5zYWN0aW9uSUR9IGlzIGFscmVhZHkgY29uZmlybWVkIGFuZCBjYW5ub3QgYmUgYWNjZWxlcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIG91dHB1dHMgZnJvbSB0aGUgcGFyZW50IHR4IHdoaWNoIGFyZSB0byBvdXIgd2FsbGV0XG4gICAgY29uc3Qgd2FsbGV0T3V0cHV0cyA9IF8uZmlsdGVyKHBhcmVudFR4Lm91dHB1dHMsIChvdXRwdXQpID0+IG91dHB1dC5pc01pbmUpO1xuXG4gICAgaWYgKHdhbGxldE91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmFuc2FjdGlvbiAke3BhcmFtcy50cmFuc2FjdGlvbklEfSBjb250YWlucyBubyBvdXRwdXRzIHRvIHRoaXMgd2FsbGV0LCBhbmQgdGh1cyBjYW5ub3QgYmUgYWNjZWxlcmF0ZWRgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIHVzZSBhbiBvdXRwdXQgZnJvbSB0aGUgcGFyZW50IHdpdGggbGFyZ2VzdCBlZmZlY3RpdmUgdmFsdWUsXG4gICAgLy8gYnV0IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgb3V0cHV0IGlzIGFjdHVhbGx5IHVuc3BlbnQuXG4gICAgLy8gQW4gb3V0cHV0IGNvdWxkIGJlIHNwZW50IGFscmVhZHkgaWYgdGhlIG91dHB1dCB3YXMgdXNlZCBpbiBhXG4gICAgLy8gY2hpbGQgdHggd2hpY2ggaXRzZWxmIGhhcyBiZWNvbWUgc3R1Y2sgZHVlIHRvIGxvdyBmZWVzIGFuZCBpc1xuICAgIC8vIGFsc28gdW5jb25maXJtZWQuXG4gICAgY29uc3Qgc29ydGVkT3V0cHV0cyA9IF8uc29ydEJ5KHdhbGxldE91dHB1dHMsIGVmZmVjdGl2ZVZhbHVlKTtcbiAgICBsZXQgcGFyZW50VW5zcGVudFRvVXNlO1xuICAgIGxldCBvdXRwdXRUb1VzZTtcblxuICAgIHdoaWxlIChzb3J0ZWRPdXRwdXRzLmxlbmd0aCA+IDAgJiYgcGFyZW50VW5zcGVudFRvVXNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG91dHB1dFRvVXNlID0gc29ydGVkT3V0cHV0cy5wb3AoKTtcblxuICAgICAgLy8gZmluZCB0aGUgdW5zcGVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGFydGljdWxhciBvdXRwdXRcbiAgICAgIC8vIFRPRE86IGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBnZXQgdGhpcyB1bnNwZW50P1xuICAgICAgLy8gVE9ETzogVGhlIGJlc3Qgd2UgY2FuIGRvIGhlcmUgaXMgc2V0IG1pblNpemUgPSBtYXhTaXplID0gb3V0cHV0VG9Vc2UudmFsdWVcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgICBjb25zdCB1bnNwZW50c1Jlc3VsdCA9IHlpZWxkIHRoaXMudW5zcGVudHMoe1xuICAgICAgICBtaW5TaXplOiBvdXRwdXRUb1VzZS52YWx1ZSxcbiAgICAgICAgbWF4U2l6ZTogb3V0cHV0VG9Vc2UudmFsdWUsXG4gICAgICB9KTtcblxuICAgICAgcGFyZW50VW5zcGVudFRvVXNlID0gXy5maW5kKHVuc3BlbnRzUmVzdWx0LCAodW5zcGVudCkgPT4ge1xuICAgICAgICAvLyBtYWtlIHN1cmUgdW5zcGVudCBiZWxvbmdzIHRvIHRoZSBnaXZlbiB0eGlkXG4gICAgICAgIGlmICh1bnNwZW50LnR4X2hhc2ggIT09IHBhcmFtcy50cmFuc2FjdGlvbklEKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG1ha2Ugc3VyZSB1bnNwZW50IGhhcyBjb3JyZWN0IHZfb3V0IGluZGV4XG4gICAgICAgIHJldHVybiB1bnNwZW50LnR4X291dHB1dF9uID09PSBvdXRwdXRUb1VzZS52b3V0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudFVuc3BlbnRUb1VzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHVuc3BlbnQgb3V0cHV0IGZyb20gcGFyZW50IHR4IHRvIHVzZSBhcyBjaGlsZCBpbnB1dGApO1xuICAgIH1cblxuICAgIC8vIGdldCB0aGUgZnVsbCBoZXggZm9yIHRoZSBwYXJlbnQgdHggYW5kIGRlY29kZSBpdCB0byBnZXQgaXRzIHZzaXplXG4gICAgY29uc3QgcGFyZW50VHhIZXggPSB5aWVsZCBnZXRQYXJlbnRUeEhleCh7IHBhcmVudFR4SWQ6IHBhcmFtcy50cmFuc2FjdGlvbklEIH0pO1xuICAgIGNvbnN0IGRlY29kZWRQYXJlbnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleChwYXJlbnRUeEhleCwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgICBjb25zdCBwYXJlbnRWU2l6ZSA9IGRlY29kZWRQYXJlbnQudmlydHVhbFNpemUoKTtcblxuICAgIC8vIG1ha2Ugc3VyZSBpZCBmcm9tIGRlY29kZWQgdHggYW5kIGdpdmVuIHR4IGlkIG1hdGNoXG4gICAgLy8gdGhpcyBzaG91bGQgY2F0Y2ggcHJvYmxlbXMgZW1hbmF0aW5nIGZyb20gdGhlIHVzZSBvZiBhbiBleHRlcm5hbCBzZXJ2aWNlXG4gICAgLy8gZm9yIGdldHRpbmcgdGhlIGNvbXBsZXRlIHBhcmVudCB0eCBoZXhcbiAgICBpZiAoZGVjb2RlZFBhcmVudC5nZXRJZCgpICE9PSBwYXJhbXMudHJhbnNhY3Rpb25JRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGVjb2RlZCB0cmFuc2FjdGlvbiBpZCBpcyAke2RlY29kZWRQYXJlbnQuZ2V0SWQoKX0sIHdoaWNoIGRvZXMgbm90IG1hdGNoIGdpdmVuIHR4aWQgJHtwYXJhbXMudHJhbnNhY3Rpb25JRH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSBuZXcgZmVlIHJhdGUgaXMgZ3JlYXRlciB0aGFuIHRoZSBwYXJlbnQncyBjdXJyZW50IGZlZSByYXRlXG4gICAgLy8gdmlydHVhbFNpemUgaXMgcmV0dXJuZWQgaW4gdmJ5dGVzLCBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdG8ga3ZCXG4gICAgY29uc3QgcGFyZW50UmF0ZSA9ICgxMDAwICogcGFyZW50VHguZmVlKSAvIHBhcmVudFZTaXplO1xuICAgIGlmIChwYXJhbXMuZmVlUmF0ZSA8PSBwYXJlbnRSYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgbG93ZXIgZmVlIHJhdGUhIChQYXJlbnQgdHggZmVlIHJhdGUgaXMgJHtwYXJlbnRSYXRlfSBzYXQva0IsIGFuZCByZXF1ZXN0ZWQgZmVlIHJhdGUgd2FzICR7cGFyYW1zLmZlZVJhdGV9IHNhdC9rQilgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGRldGVybWluZSBpZiBwYXJlbnQgb3V0cHV0IGNhbiBjb3ZlciBjaGlsZCBmZWVcbiAgICBjb25zdCBpc1BhcmVudE91dHB1dFNlZ3dpdCA9XG4gICAgICBpc0NoYWluQ29kZShvdXRwdXRUb1VzZS5jaGFpbikgJiYgc2NyaXB0VHlwZUZvckNoYWluKG91dHB1dFRvVXNlLmNoYWluKSA9PT0gJ3Ayc2hQMndzaCc7XG5cbiAgICBsZXQgY2hpbGRJbnB1dHMgPSB7XG4gICAgICBzZWd3aXQ6IGlzUGFyZW50T3V0cHV0U2Vnd2l0ID8gMSA6IDAsXG4gICAgICBQMlNIOiBpc1BhcmVudE91dHB1dFNlZ3dpdCA/IDAgOiAxLFxuICAgIH07XG5cbiAgICBsZXQgY2hpbGRGZWUgPSBlc3RpbWF0ZUNoaWxkRmVlKHtcbiAgICAgIGlucHV0czogY2hpbGRJbnB1dHMsXG4gICAgICBwYXJlbnRGZWU6IHBhcmVudFR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHBhcmFtcy5mZWVSYXRlLFxuICAgICAgcGFyZW50VlNpemUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB1bnNwZW50c1RvVXNlID0gW3BhcmVudFVuc3BlbnRUb1VzZV07XG5cbiAgICAvLyB0cnkgdG8gZ2V0IHRoZSBtaW4gY2hhbmdlIHNpemUgZnJvbSB0aGUgc2VydmVyLCBvdGhlcndpc2UgZGVmYXVsdCB0byAwLjEgQlRDXG4gICAgLy8gVE9ETzogbWluQ2hhbmdlU2l6ZSBpcyBub3QgY3VycmVudGx5IGEgY29uc3RhbnQgZGVmaW5lZCBvbiB0aGUgY2xpZW50IGFuZCBzaG91bGQgYmUgYWRkZWRcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IG1pbkNoYW5nZVNpemUgPSB0aGlzLmJpdGdvLmdldENvbnN0YW50cygpLm1pbkNoYW5nZVNpemUgfHwgMWU3O1xuXG4gICAgaWYgKG91dHB1dFRvVXNlLnZhbHVlIDwgY2hpbGRGZWUgKyBtaW5DaGFuZ2VTaXplKSB7XG4gICAgICAvLyBwYXJlbnQgb3V0cHV0IGNhbm5vdCBjb3ZlciBjaGlsZCBmZWUgcGx1cyB0aGUgbWluaW11bSBjaGFuZ2UsXG4gICAgICAvLyBtdXN0IGZpbmQgYWRkaXRpb25hbCB1bnNwZW50cyB0byBjb3ZlciB0aGUgZGlmZmVyZW5jZVxuICAgICAgY29uc3QgeyBhZGRpdGlvbmFsLCBuZXdDaGlsZEZlZSwgbmV3SW5wdXRzIH0gPSB5aWVsZCBmaW5kQWRkaXRpb25hbFVuc3BlbnRzKHtcbiAgICAgICAgaW5wdXRzOiBjaGlsZElucHV0cyxcbiAgICAgICAgcGFyZW50T3V0cHV0VmFsdWU6IG91dHB1dFRvVXNlLnZhbHVlLFxuICAgICAgICBwYXJlbnRGZWU6IHBhcmVudFR4LmZlZSxcbiAgICAgICAgbWF4VW5zcGVudHM6IHBhcmFtcy5tYXhBZGRpdGlvbmFsVW5zcGVudHMsXG4gICAgICAgIHBhcmVudFZTaXplLFxuICAgICAgfSk7XG4gICAgICBjaGlsZEZlZSA9IG5ld0NoaWxkRmVlO1xuICAgICAgY2hpbGRJbnB1dHMgPSBuZXdJbnB1dHM7XG4gICAgICB1bnNwZW50c1RvVXNlLnB1c2goLi4uYWRkaXRpb25hbCk7XG4gICAgfVxuXG4gICAgLy8gc2FuaXR5IGNoZWNrIHRoZSBmZWUgcmF0ZSB3ZSdyZSBwYXlpbmcgZm9yIHRoZSBjb21iaW5lZCB0eFxuICAgIC8vIHRvIG1ha2Ugc3VyZSBpdCdzIHVuZGVyIHRoZSBtYXggZmVlIHJhdGUuIE9ubHkgdGhlIGNoaWxkIHR4XG4gICAgLy8gY2FuIGJyZWFrIHRoaXMgbGltaXQsIGJ1dCB0aGUgY29tYmluZWQgdHggc2hhbGwgbm90XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBtYXhGZWVSYXRlID0gdGhpcy5iaXRnby5nZXRDb25zdGFudHMoKS5tYXhGZWVSYXRlO1xuICAgIGNvbnN0IGNoaWxkVlNpemUgPSBlc3RpbWF0ZVR4VlNpemUoY2hpbGRJbnB1dHMpO1xuICAgIGNvbnN0IGNvbWJpbmVkVlNpemUgPSBjaGlsZFZTaXplICsgcGFyZW50VlNpemU7XG4gICAgY29uc3QgY29tYmluZWRGZWUgPSBwYXJlbnRUeC5mZWUgKyBjaGlsZEZlZTtcbiAgICAvLyBjb21iaW5lZCBmZWUgcmF0ZSBtdXN0IGJlIGluIHNhdC9rQiwgc28gd2UgbmVlZCB0byBjb252ZXJ0XG4gICAgY29uc3QgY29tYmluZWRGZWVSYXRlID0gKDEwMDAgKiBjb21iaW5lZEZlZSkgLyBjb21iaW5lZFZTaXplO1xuXG4gICAgaWYgKGNvbWJpbmVkRmVlUmF0ZSA+IG1heEZlZVJhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyYW5zYWN0aW9uIGNhbm5vdCBiZSBhY2NlbGVyYXRlZC4gQ29tYmluZWQgZmVlIHJhdGUgb2YgJHtjb21iaW5lZEZlZVJhdGV9IHNhdC9rQiBleGNlZWRzIG1heGltdW0gZmVlIHJhdGUgb2YgJHttYXhGZWVSYXRlfSBzYXQva0JgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhIG5ldyBjaGFuZ2UgYWRkcmVzcyBhbmQgZGV0ZXJtaW5lIGNoYW5nZSBhbW91bnQuXG4gICAgLy8gdGhlIHR4IGJ1aWxkZXIgd2lsbCByZWplY3QgdHJhbnNhY3Rpb25zIHdoaWNoIGhhdmUgbm8gcmVjaXBpZW50cyxcbiAgICAvLyBhbmQgc3VjaCB6ZXJvLW91dHB1dCB0cmFuc2FjdGlvbnMgYXJlIGZvcmJpZGRlbiBieSB0aGUgQml0Y29pbiBwcm90b2NvbCxcbiAgICAvLyBzbyB3ZSBuZWVkIGF0IGxlYXN0IGEgc2luZ2xlIHJlY2lwaWVudCBmb3IgdGhlIGNoYW5nZSB3aGljaCB3b24ndCBiZSBwcnVuZWQuXG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gXy5zdW1CeSh1bnNwZW50c1RvVXNlLCAodW5zcGVudCkgPT4gdW5zcGVudC52YWx1ZSkgLSBjaGlsZEZlZTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGNoYW5nZUNoYWluID0gdGhpcy5nZXRDaGFuZ2VDaGFpbih7fSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBjaGFuZ2VBZGRyZXNzID0geWllbGQgdGhpcy5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluIH0pO1xuXG4gICAgLy8gY3JlYXRlIHRoZSBjaGlsZCB0eCBhbmQgYnJvYWRjYXN0XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCB0eCA9IHlpZWxkIHRoaXMuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uKHtcbiAgICAgIHVuc3BlbnRzOiB1bnNwZW50c1RvVXNlLFxuICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzczogY2hhbmdlQWRkcmVzcy5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZlZTogY2hpbGRGZWUsXG4gICAgICBiaXRnb0ZlZToge1xuICAgICAgICBhbW91bnQ6IDAsXG4gICAgICAgIGFkZHJlc3M6ICcnLFxuICAgICAgfSxcbiAgICAgIHhwcnY6IHBhcmFtcy54cHJ2LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICAvLyBjaGlsZCBmZWUgcmF0ZSBtdXN0IGJlIGluIHNhdC9rQiwgc28gd2UgbmVlZCB0byBjb252ZXJ0XG4gICAgY29uc3QgY2hpbGRGZWVSYXRlID0gKDEwMDAgKiBjaGlsZEZlZSkgLyBjaGlsZFZTaXplO1xuICAgIGlmIChjaGlsZEZlZVJhdGUgPiBtYXhGZWVSYXRlKSB7XG4gICAgICAvLyBjb21iaW5lZCB0eCBpcyB3aXRoaW4gbWF4IGZlZSByYXRlIGxpbWl0cywgYnV0IHRoZSBjaGlsZCB0eCBpcyBub3QuXG4gICAgICAvLyBpbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gdXNlIHRoZSBpZ25vcmVNYXhGZWVSYXRlIGZsYWcgdG8gZ2V0IHRoZSBjaGlsZCB0eCB0byBiZSBhY2NlcHRlZFxuICAgICAgdHguaWdub3JlTWF4RmVlUmF0ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICByZXR1cm4gdGhpcy5zZW5kVHJhbnNhY3Rpb24odHgpO1xuICB9KVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLmFzQ2FsbGJhY2soY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZUFuZFNpZ25UcmFuc2FjdGlvblxuLy8gSU5URVJOQUwgZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCBzaWduIGEgdHJhbnNhY3Rpb25cbi8vXG4vLyBQYXJhbWV0ZXJzOlxuLy8gICByZWNpcGllbnRzIC0gYXJyYXkgb2YgeyBhZGRyZXNzLCBhbW91bnQgfSB0byBzZW5kIHRvXG4vLyAgIHdhbGxldFBhc3NwaHJhc2UgLSB0aGUgcGFzc3BocmFzZSB0byBiZSB1c2VkIHRvIGRlY3J5cHQgdGhlIHVzZXIga2V5IG9uIHRoaXMgd2FsbGV0XG4vLyAgIChTZWUgdHJhbnNhY3Rpb25CdWlsZGVyLmNyZWF0ZVRyYW5zYWN0aW9uIGZvciBvdGhlciBwYXNzdGhyb3VnaCBwYXJhbXMpXG4vLyBSZXR1cm5zOlxuLy9cbldhbGxldC5wcm90b3R5cGUuY3JlYXRlQW5kU2lnblRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGNvKGZ1bmN0aW9uKiAoKSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gICAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcmVjaXBpZW50cyBvYmplY3QnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50IGZvciBmZWUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGZlZVJhdGUgLSBudW1iZXIgZXhwZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmR5bmFtaWNGZWVDb25maXJtVGFyZ2V0ICYmICFfLmlzTnVtYmVyKHBhcmFtcy5keW5hbWljRmVlQ29uZmlybVRhcmdldCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCBmb3IgY29uZmlybVRhcmdldCAtIG51bWJlciBleHBlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuaW5zdGFudCAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLmluc3RhbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYXJndW1lbnQgZm9yIGluc3RhbnQgLSBib29sZWFuIGV4cGVjdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9ICh5aWVsZCB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHBhcmFtcykpIGFzIGFueTtcbiAgICBjb25zdCBmZWUgPSB0cmFuc2FjdGlvbi5mZWU7XG4gICAgY29uc3QgZmVlUmF0ZSA9IHRyYW5zYWN0aW9uLmZlZVJhdGU7XG4gICAgY29uc3QgZXN0aW1hdGVkU2l6ZSA9IHRyYW5zYWN0aW9uLmVzdGltYXRlZFNpemU7XG4gICAgY29uc3QgYml0Z29GZWUgPSB0cmFuc2FjdGlvbi5iaXRnb0ZlZTtcbiAgICBjb25zdCB0cmF2ZWxJbmZvcyA9IHRyYW5zYWN0aW9uLnRyYXZlbEluZm9zO1xuICAgIGNvbnN0IHVuc3BlbnRzID0gdHJhbnNhY3Rpb24udW5zcGVudHM7XG5cbiAgICAvLyBTaWduIHRoZSB0cmFuc2FjdGlvblxuICAgIHRyeSB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgY29uc3Qga2V5Y2hhaW4gPSB5aWVsZCB0aGlzLmdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW4ocGFyYW1zKTtcbiAgICAgIHRyYW5zYWN0aW9uLmtleWNoYWluID0ga2V5Y2hhaW47XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuY29kZSAhPT0gJ25vX2VuY3J5cHRlZF9rZXljaGFpbl9vbl93YWxsZXQnKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICAvLyB0aGlzIG1pZ2h0IGJlIGEgc2FmZSB3YWxsZXQsIHNvIGxldCdzIHJldHJpZXZlIHRoZSBwcml2YXRlIGtleSBpbmZvXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgICAgeWllbGQgdGhpcy5yZWZyZXNoKHsgZ3BrOiB0cnVlIH0pO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgIGNvbnN0IHNhZmVVc2VyS2V5ID0gXy5nZXQodGhpcy53YWxsZXQsICdwcml2YXRlLnVzZXJQcml2S2V5Jyk7XG4gICAgICBpZiAoXy5pc1N0cmluZyhzYWZlVXNlcktleSkgJiYgXy5pc1N0cmluZyhwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICAgICAgdHJhbnNhY3Rpb24uc2lnbmluZ0tleSA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSwgaW5wdXQ6IHNhZmVVc2VyS2V5IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbi5mZWVTaW5nbGVLZXlXSUYgPSBwYXJhbXMuZmVlU2luZ2xlS2V5V0lGO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3QgcmVzdWx0ID0geWllbGQgdGhpcy5zaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiBfLmV4dGVuZChyZXN1bHQsIHtcbiAgICAgIGZlZSxcbiAgICAgIGZlZVJhdGUsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgIGJpdGdvRmVlLFxuICAgICAgdHJhdmVsSW5mb3MsXG4gICAgICBlc3RpbWF0ZWRTaXplLFxuICAgICAgdW5zcGVudHMsXG4gICAgfSk7XG4gIH0pXG4gICAgLmNhbGwodGhpcylcbiAgICAuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0QW5kUHJlcGFyZVNpZ25pbmdLZXljaGFpblxuLy8gSU5URVJOQUwgZnVuY3Rpb24gdG8gZ2V0IHRoZSB1c2VyIGtleWNoYWluIGZvciBzaWduaW5nLlxuLy8gQ2FsbGVyIG11c3QgcHJvdmlkZXIgZWl0aGVyIGEga2V5Y2hhaW4sIG9yIHdhbGxldFBhc3NwaHJhc2Ugb3IgeHBydiBhcyBhIHN0cmluZ1xuLy8gSWYgdGhlIGNhbGxlciBwcm92aWRlcyB0aGUga2V5Y2hhaW4gd2l0aCB4cHJ2LCBpdCBpcyBzaW1wbHkgcmV0dXJuZWQuXG4vLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVzIHRoZSBlbmNyeXB0ZWQgeHBydiAod2FsbGV0UGFzc3BocmFzZSksIHRoZW4gZmV0Y2ggdGhlIGtleWNoYWluIG9iamVjdCBhbmQgZGVjcnlwdFxuLy8gT3RoZXJ3aXNlIGlmIHRoZSB4cHJ2IGlzIHByb3ZpZGVkLCBmZXRjaCB0aGUga2V5Y2hhaW4gb2JqZWN0IGFuZCBhdWdtZW50IGl0IHdpdGggdGhlIHhwcnYuXG4vL1xuLy8gUGFyYW1ldGVyczpcbi8vICAga2V5Y2hhaW4gLSBrZXljaGFpbiB3aXRoIHhwcnZcbi8vICAgeHBydiAtIHRoZSBwcml2YXRlIGtleSBpbiBzdHJpbmcgZm9ybVxuLy8gICB3YWxsZXRQYXNzcGhyYXNlIC0gdGhlIHBhc3NwaHJhc2UgdG8gYmUgdXNlZCB0byBkZWNyeXB0IHRoZSB1c2VyIGtleSBvbiB0aGlzIHdhbGxldFxuLy8gUmV0dXJuczpcbi8vICAgS2V5Y2hhaW4gb2JqZWN0IGNvbnRhaW5pbmcgeHBydiwgeHB1YiBhbmQgcGF0aHNcbi8vXG5XYWxsZXQucHJvdG90eXBlLmdldEFuZFByZXBhcmVTaWduaW5nS2V5Y2hhaW4gPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG5cbiAgLy8gSWYga2V5Y2hhaW4gd2l0aCB4cHJ2IGlzIGFscmVhZHkgcHJvdmlkZWQsIHVzZSBpdFxuICBpZiAoXy5pc09iamVjdChwYXJhbXMua2V5Y2hhaW4pICYmIHBhcmFtcy5rZXljaGFpbi54cHJ2KSB7XG4gICAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUocGFyYW1zLmtleWNoYWluKTtcbiAgfVxuXG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddLCBjYWxsYmFjayk7XG4gIGlmICgocGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgcGFyYW1zLnhwcnYpIHx8ICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgJiYgIXBhcmFtcy54cHJ2KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIG9mIHhwcnYgb3Igd2FsbGV0UGFzc3BocmFzZScpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgLy8gQ2FsbGVyIHByb3ZpZGVkIGEgd2FsbGV0IHBhc3NwaHJhc2VcbiAgaWYgKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKCkudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICB0cnkge1xuICAgICAgICBrZXljaGFpbi54cHJ2ID0gc2VsZi5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDoga2V5Y2hhaW4uZW5jcnlwdGVkWHBydiB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGVjcnlwdCB1c2VyIGtleWNoYWluJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXljaGFpbi54cHViICYmIGJpcDMyLmZyb21CYXNlNTgoa2V5Y2hhaW4ueHBydikubmV1dGVyZWQoKS50b0Jhc2U1OCgpICE9PSBrZXljaGFpbi54cHViKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZGVyaXZlZCB4cHViIGRvZXMgbm90IG1hdGNoIHN0b3JlZCB4cHViJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSk7XG4gIH1cblxuICAvLyBDYWxsZXIgcHJvdmlkZWQgYW4geHBydiAtIHZhbGlkYXRlIGFuZCBjb25zdHJ1Y3Qga2V5Y2hhaW4gb2JqZWN0XG4gIGxldCB4cHViO1xuICB0cnkge1xuICAgIHhwdWIgPSBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy54cHJ2KS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSB0aGUgeHBydicpO1xuICB9XG5cbiAgaWYgKHhwdWIgPT09IHBhcmFtcy54cHJ2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd4cHJ2IHByb3ZpZGVkIHdhcyBub3QgYSBwcml2YXRlIGtleSAoZm91bmQgeHB1YiBpbnN0ZWFkKScpO1xuICB9XG5cbiAgY29uc3Qgd2FsbGV0WHB1YnMgPSBfLm1hcChzZWxmLmtleWNoYWlucywgJ3hwdWInKTtcbiAgaWYgKCFfLmluY2x1ZGVzKHdhbGxldFhwdWJzLCB4cHViKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigneHBydiBwcm92aWRlZCB3YXMgbm90IGEga2V5Y2hhaW4gb24gdGhpcyB3YWxsZXQhJyk7XG4gIH1cblxuICAvLyBnZXQgdGhlIGtleWNoYWluIG9iamVjdCBmcm9tIGJpdGdvIHRvIGZpbmQgdGhlIHBhdGggYW5kIChwb3RlbnRpYWwpIHdhbGxldCBzdHJ1Y3R1cmVcbiAgcmV0dXJuIHNlbGYuYml0Z29cbiAgICAua2V5Y2hhaW5zKClcbiAgICAuZ2V0KHsgeHB1YjogeHB1YiB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAga2V5Y2hhaW4ueHBydiA9IHBhcmFtcy54cHJ2O1xuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pO1xufTtcblxuLyoqXG4gKiBUYWtlcyBhIHdhbGxldCdzIHVuc3BlbnRzIGFuZCBmYW5zIHRoZW0gb3V0IGludG8gYSBsYXJnZXIgbnVtYmVyIG9mIGVxdWFsbHkgc2l6ZWQgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtaW5Db25maXJtczogbWluaW11bSBudW1iZXIgb2YgY29uZmlybXMgdGhlIHVuc3BlbnRzIG11c3QgaGF2ZVxuICogIHhwcnY6IHByaXZhdGUga2V5IHRvIHNpZ24gdHJhbnNhY3Rpb25cbiAqICB3YWxsZXRQYXNzcGhyYXNlOiB3YWxsZXQgcGFzc3BocmFzZSB0byBkZWNyeXB0IHRoZSB3YWxsZXQncyBwcml2YXRlIGtleVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuV2FsbGV0LnByb3RvdHlwZS5mYW5PdXRVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gQmx1ZWJpcmQuY29yb3V0aW5lKGZ1bmN0aW9uKiAoKSB7XG4gICAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICAvLyAod2hlbiBmYW5uaW5nIG91dCwgd2UgdGFrZSBhbGwgdGhlIHVuc3BlbnRzIGFuZCBtYWtlIGEgYmlnZ2VyIG51bWJlciBvZiBvdXRwdXRzKVxuICAgIGNvbnN0IE1BWF9GQU5PVVRfSU5QVVRfQ09VTlQgPSA4MDtcbiAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXRzIGZvciBmYW5vdXQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBNQVhfRkFOT1VUX09VVFBVVF9DT1VOVCA9IDMwMDtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gICAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcblxuICAgIGNvbnN0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCB0d28sIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMiB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgICB9XG4gICAgaWYgKHRhcmdldCA+IE1BWF9GQU5PVVRfT1VUUFVUX0NPVU5UKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IHRvbyBoaWdoJyk7XG4gICAgfVxuXG4gICAgbGV0IG1pbkNvbmZpcm1zID0gcGFyYW1zLm1pbkNvbmZpcm1zO1xuICAgIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBtaW5Db25maXJtcyA9IDE7XG4gICAgfVxuICAgIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgPj0gMCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwbGl0IGEgbmF0dXJhbCBudW1iZXIgTiBpbnRvIG4gYWxtb3N0IGVxdWFsbHkgc2l6ZWQgKMKxMSkgbmF0dXJhbCBudW1iZXJzLlxuICAgICAqIEluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZXMgb2YgdGhlIHBhcnRzLCB3ZSBjYWxjdWxhdGUgZmxvb3IoTi9uKSwgYW5kIHRodXMgaGF2ZSB0aGUgYmFzZSBzaXplIG9mIGFsbCBwYXJ0cy5cbiAgICAgKiBJZiBOICUgbiAhPT0gMCwgdGhpcyBsZWF2ZXMgdXMgd2l0aCBhIHJlbWFpbmRlciByIHdoZXJlIHIgPCBuLiBXZSBkaXN0cmlidXRlIHIgZXF1YWxseSBhbW9uZyB0aGUgbiBwYXJ0cyBieVxuICAgICAqIGFkZGluZyAxIHRvIHRoZSBmaXJzdCByIHBhcnRzLlxuICAgICAqIEBwYXJhbSB0b3RhbFxuICAgICAqIEBwYXJhbSBwYXJ0Q291bnRcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAgICovXG4gICAgY29uc3Qgc3BsaXROdW1iZXJJbnRvQ2xvc2VOYXR1cmFsTnVtYmVycyA9IGZ1bmN0aW9uICh0b3RhbCwgcGFydENvdW50KSB7XG4gICAgICBjb25zdCBwYXJ0U2l6ZSA9IE1hdGguZmxvb3IodG90YWwgLyBwYXJ0Q291bnQpO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWwgLSBwYXJ0U2l6ZSAqIHBhcnRDb3VudDtcbiAgICAgIC8vIGluaXRpYWxpemUgcGxhY2Vob2xkZXIgYXJyYXlcbiAgICAgIGNvbnN0IGFsbW9zdEVxdWFsUGFydHMgPSBuZXcgQXJyYXkocGFydENvdW50KTtcbiAgICAgIC8vIGZpbGwgdGhlIGZpcnN0IHJlbWFpbmRlciBwYXJ0cyB3aXRoIHRoZSB2YWx1ZSBwYXJ0U2l6ZSsxXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUgKyAxLCAwLCByZW1haW5kZXIpO1xuICAgICAgLy8gZmlsbCB0aGUgcmVtYWluaW5nIHBhcnRzIHdpdGggdGhlIHZhbHVlIHBhcnRTaXplXG4gICAgICBfLmZpbGwoYWxtb3N0RXF1YWxQYXJ0cywgcGFydFNpemUsIHJlbWFpbmRlcik7XG4gICAgICAvLyBhc3NlcnQgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBhbG1vc3QgZXF1YWwgcGFydHNcbiAgICAgIC8vIFRPRE86IGFkZCBjaGVjayBmb3IgdGhlIGJpZ2dlc3QgZGV2aWF0aW9uIGJldHdlZW4gYW55IHR3byBwYXJ0cyBhbmQgbWFrZSBzdXJlIGl0J3MgPD0gMVxuICAgICAgaWYgKF8oYWxtb3N0RXF1YWxQYXJ0cykuc3VtKCkgIT09IHRvdGFsIHx8IF8oYWxtb3N0RXF1YWxQYXJ0cykuc2l6ZSgpICE9PSBwYXJ0Q291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwYXJ0IHN1bSBvciBwYXJ0IGNvdW50IG1pc21hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxtb3N0RXF1YWxQYXJ0cztcbiAgICB9O1xuXG4gICAgLy8gZmlyc3QsIGxldCdzIHRha2UgYWxsIHRoZSB3YWxsZXQncyB1bnNwZW50cyAod2l0aCBtaW4gY29uZmlybXMgaWYgbmVjZXNzYXJ5KVxuICAgIGNvbnN0IGFsbFVuc3BlbnRzID0gKHlpZWxkIHNlbGYudW5zcGVudHMoeyBtaW5Db25maXJtczogbWluQ29uZmlybXMgfSkpIGFzIGFueTtcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1bnNwZW50cyB0byBicmFuY2ggb3V0Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBjb25zb2xpZGF0aW9uIGlzIGVzc2VudGlhbGx5IGp1c3QgYSB3YXN0ZSBvZiBtb25leVxuICAgIGlmIChhbGxVbnNwZW50cy5sZW5ndGggPj0gdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhbiBvdXQgdGFyZ2V0IGhhcyB0byBiZSBiaWdnZXIgdGhhbiBjdXJyZW50IG51bWJlciBvZiB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHdlIGhhdmUgYXQgdGhlIHZlcnkgbWluaW11bSA4MSBpbnB1dHMsIGFuZCA4MSBvdXRwdXRzLiBUaGF0IHRyYW5zYWN0aW9uIHdpbGwgYmUgYmlnXG4gICAgLy8gaW4gdGhlIG1lZGl1bSBydW4sIHRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIHJld29ya2VkIHRvIG9ubHkgd29yayB3aXRoIGEgc3Vic2V0IG9mIHRoZSB0cmFuc2FjdGlvbnNcbiAgICBpZiAoYWxsVW5zcGVudHMubGVuZ3RoID4gTUFYX0ZBTk9VVF9JTlBVVF9DT1VOVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSB1bnNwZW50cycpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgaXMgYWxsIHRoZSBtb25leSB0aGF0IGlzIGN1cnJlbnRseSBpbiB0aGUgd2FsbGV0XG4gICAgY29uc3QgZ3Jvc3NBbW91bnQgPSBfKGFsbFVuc3BlbnRzKS5tYXAoJ3ZhbHVlJykuc3VtKCk7XG5cbiAgICAvLyBpbiBvcmRlciB0byBub3QgbW9kaWZ5IHRoZSBwYXJhbXMgb2JqZWN0LCB3ZSBjcmVhdGUgYSBjb3B5XG4gICAgY29uc3QgdHhQYXJhbXMgPSBfLmV4dGVuZCh7fSwgcGFyYW1zKTtcbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGFsbFVuc3BlbnRzO1xuICAgIHR4UGFyYW1zLnJlY2lwaWVudHMgPSB7fTtcblxuICAgIC8vIGNyZWF0ZSB0YXJnZXQgYW1vdW50IG9mIG5ldyBhZGRyZXNzZXMgZm9yIHRoaXMgd2FsbGV0XG4gICAgY29uc3QgbmV3QWRkcmVzc1Byb21pc2VzID0gXy5yYW5nZSh0YXJnZXQpLm1hcCgoKSA9PlxuICAgICAgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IHNlbGYuZ2V0Q2hhbmdlQ2hhaW4ocGFyYW1zKSwgdmFsaWRhdGU6IHZhbGlkYXRlIH0pXG4gICAgKTtcbiAgICBjb25zdCBuZXdBZGRyZXNzZXMgPSB5aWVsZCBCbHVlYmlyZC5hbGwobmV3QWRkcmVzc1Byb21pc2VzKTtcbiAgICAvLyBsZXQncyBmaW5kIGEgbmljZSwgZXF1YWwgZGlzdHJpYnV0aW9uIG9mIG91ciBTYXRvc2hpcyBhbW9uZyB0aGUgbmV3IGFkZHJlc3Nlc1xuICAgIGNvbnN0IHNwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMoZ3Jvc3NBbW91bnQsIHRhcmdldCk7XG4gICAgLy8gbWFwIHRoZSBuZXdseSBjcmVhdGVkIGFkZHJlc3NlcyB0byB0aGUgYWxtb3N0IGNvbXBvbmVudHMgYW1vdW50cyB3ZSBqdXN0IGNhbGN1bGF0ZWRcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCBzcGxpdEFtb3VudHMpO1xuICAgIHR4UGFyYW1zLm5vU3BsaXRDaGFuZ2UgPSB0cnVlO1xuICAgIC8vIGF0dGVtcHQgdG8gY3JlYXRlIGEgdHJhbnNhY3Rpb24uIEFzIGl0IGlzIGEgd2FsbGV0LXN3ZWVwaW5nIHRyYW5zYWN0aW9uIHdpdGggbm8gZmVlLCB3ZSBleHBlY3QgaXQgdG8gZmFpbFxuICAgIHRyeSB7XG4gICAgICB5aWVsZCBzZWxmLnNlbmRNYW55KHR4UGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gYXMgZXhwZWN0ZWQsIHRoZSB0cmFuc2FjdGlvbiBjcmVhdGlvbiBkaWQgaW5kZWVkIGZhaWwgZHVlIHRvIGluc3VmZmljaWVudCBmZWVzXG4gICAgICAvLyB0aGUgZXJyb3Igc3VnZ2VzdHMgYSBmZWUgdmFsdWUgd2hpY2ggd2UgdGhlbiB1c2UgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gaG93ZXZlciwgbGV0J3MgbWFrZSBzdXJlIGl0IHdhc24ndCBzb21ldGhpbmcgZWxzZVxuICAgICAgaWYgKCFlcnJvci5mZWUgJiYgKCFlcnJvci5yZXN1bHQgfHwgIWVycm9yLnJlc3VsdC5mZWUpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBlcnJvciBkb2VzIG5vdCBjb250YWluIGEgZmVlIHByb3BlcnR5LCBpdCBpcyBzb21ldGhpbmcgZWxzZSB0aGF0IGhhcyBnb25lIGF3cnksIGFuZCB3ZSB0aHJvdyBpdFxuICAgICAgICBjb25zdCBkZWJ1Z1BhcmFtcyA9IF8ub21pdCh0eFBhcmFtcywgWyd3YWxsZXRQYXNzcGhyYXNlJywgJ3hwcnYnXSk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgKz0gYFxcblxcblRYIFBBUkFNUzpcXG4gJHtKU09OLnN0cmluZ2lmeShkZWJ1Z1BhcmFtcywgbnVsbCwgNCl9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYXNlRmVlID0gZXJyb3IuZmVlIHx8IGVycm9yLnJlc3VsdC5mZWU7XG4gICAgICBsZXQgdG90YWxGZWUgPSBiYXNlRmVlO1xuICAgICAgaWYgKGVycm9yLnJlc3VsdC5iaXRnb0ZlZSAmJiBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50KSB7XG4gICAgICAgIHRvdGFsRmVlICs9IGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQ7XG4gICAgICAgIHR4UGFyYW1zLmJpdGdvRmVlID0gZXJyb3IucmVzdWx0LmJpdGdvRmVlO1xuICAgICAgfVxuXG4gICAgICAvLyBOZWVkIHRvIGNsZWFyIHRoZXNlIG91dCBzaW5jZSBvbmx5IDEgbWF5IGJlIHNldFxuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZTtcbiAgICAgIHR4UGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSA9IHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlUmF0ZTtcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQ7XG4gICAgICB0eFBhcmFtcy5mZWUgPSBiYXNlRmVlO1xuICAgICAgLy8gaW4gb3JkZXIgdG8gbWFpbnRhaW4gdGhlIGVxdWFsIGRpc3RyaWJ1dGlvbiwgd2UgbmVlZCB0byBzdWJ0cmFjdCB0aGUgZmVlIGZyb20gdGhlIGN1bXVsYXRpdmUgZnVuZHNcbiAgICAgIC8vIGluIGNhc2Ugc29tZSB1bnNwZW50cyBnb3QgcHJ1bmVkLCB3ZSBuZWVkIHRvIHVzZSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlXG4gICAgICBjb25zdCBuZXRBbW91bnQgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gdG90YWxGZWU7IC8vIGFmdGVyIGZlZXNcbiAgICAgIC8vIHRoYXQgbWVhbnMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGhhcyB0byBiZSByZWNhbGN1bGF0ZWRcbiAgICAgIGNvbnN0IHJlbWFpbmluZ1NwbGl0QW1vdW50cyA9IHNwbGl0TnVtYmVySW50b0Nsb3NlTmF0dXJhbE51bWJlcnMobmV0QW1vdW50LCB0YXJnZXQpO1xuICAgICAgLy8gYW5kIHRoZSBkaXN0cmlidXRpb24gYWdhaW4gbWFwcGVkIHRvIHRoZSBuZXcgYWRkcmVzc2VzXG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0gXy56aXBPYmplY3QoXy5tYXAobmV3QWRkcmVzc2VzLCAnYWRkcmVzcycpLCByZW1haW5pbmdTcGxpdEFtb3VudHMpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgdGltZSwgdGhlIHRyYW5zYWN0aW9uIGNyZWF0aW9uIHNob3VsZCB3b3JrXG4gICAgbGV0IGZhbm91dFR4O1xuICAgIHRyeSB7XG4gICAgICBmYW5vdXRUeCA9IHlpZWxkIHNlbGYuc2VuZE1hbnkodHhQYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IGRlYnVnUGFyYW1zID0gXy5vbWl0KHR4UGFyYW1zLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAneHBydiddKTtcbiAgICAgIGUubWVzc2FnZSArPSBgXFxuXFxuVFggUEFSQU1TOlxcbiAke0pTT04uc3RyaW5naWZ5KGRlYnVnUGFyYW1zLCBudWxsLCA0KX1gO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShmYW5vdXRUeCkuYXNDYWxsYmFjayhjYWxsYmFjayk7XG4gIH0pKCkuYXNDYWxsYmFjayhjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIHRvIGZhbiBvdXQgb3IgY29hbGVzY2UgYSB3YWxsZXQncyB1bnNwZW50c1xuICogQHBhcmFtIHBhcmFtc1xuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7UmVxdWVzdHxQcm9taXNlLjxUPnwqfVxuICovXG5XYWxsZXQucHJvdG90eXBlLnJlZ3JvdXBVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29uc3QgdGFyZ2V0ID0gcGFyYW1zLnRhcmdldDtcbiAgaWYgKCFfLmlzTnVtYmVyKHRhcmdldCkgfHwgdGFyZ2V0IDwgMSB8fCB0YXJnZXQgJSAxICE9PSAwKSB7XG4gICAgLy8gdGhlIHRhcmdldCBtdXN0IGJlIGRlZmluZWQsIGJlIGEgbnVtYmVyLCBiZSBhdCBsZWFzdCBvbmUsIGFuZCBiZSBhIG5hdHVyYWwgbnVtYmVyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdUYXJnZXQgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyJyk7XG4gIH1cblxuICBsZXQgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXM7XG4gIGlmIChtaW5Db25maXJtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWluQ29uZmlybXMgPSAxO1xuICB9XG4gIGlmICghXy5pc051bWJlcihtaW5Db25maXJtcykgfHwgbWluQ29uZmlybXMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5Db25maXJtcyBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDAnKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICByZXR1cm4gc2VsZi51bnNwZW50cyh7IG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyB9KS50aGVuKGZ1bmN0aW9uICh1bnNwZW50cykge1xuICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIHVuc3BlbnRzO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoID4gdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5jb25zb2xpZGF0ZVVuc3BlbnRzKHBhcmFtcywgY2FsbGJhY2spO1xuICAgIH0gZWxzZSBpZiAodW5zcGVudHMubGVuZ3RoIDwgdGFyZ2V0KSB7XG4gICAgICByZXR1cm4gc2VsZi5mYW5PdXRVbnNwZW50cyhwYXJhbXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDb25zb2xpZGF0ZSBhIHdhbGxldCdzIHVuc3BlbnRzIGludG8gZmV3ZXIgdW5zcGVudHNcbiAqIEBwYXJhbSBwYXJhbXNcbiAqICB0YXJnZXQ6IHNldCBob3cgbWFueSB1bnNwZW50cyB5b3Ugd2FudCB0byBoYXZlIGluIHRoZSBlbmRcbiAqICBtYXhJbnB1dENvdW50UGVyQ29uc29saWRhdGlvbjogc2V0IGhvdyBtYW55IG1heGltdW0gaW5wdXRzIGFyZSB0byBiZSBwZXJtaXR0ZWQgcGVyIGNvbnNvbGlkYXRpb24gYmF0Y2hcbiAqICB4cHJ2OiBwcml2YXRlIGtleSB0byBzaWduIHRyYW5zYWN0aW9uXG4gKiAgd2FsbGV0UGFzc3BocmFzZTogd2FsbGV0IHBhc3NwaHJhc2UgdG8gZGVjcnlwdCB0aGUgd2FsbGV0J3MgcHJpdmF0ZSBrZXlcbiAqICBtYXhJdGVyYXRpb25Db3VudDogbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgdW50aWwgZnVuY3Rpb24gc3RvcHNcbiAqICBwcm9ncmVzc0NhbGxiYWNrOiBtZXRob2QgdG8gYmUgY2FsbGVkIHdpdGggb2JqZWN0IG91dGxpbmluZyBjdXJyZW50IHByb2dyZXNzIGRldGFpbHNcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuY29uc29saWRhdGVVbnNwZW50cyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10sIGNhbGxiYWNrKTtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG5cbiAgbGV0IHRhcmdldCA9IHBhcmFtcy50YXJnZXQ7XG4gIGlmICh0YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRhcmdldCA9IDE7XG4gIH0gZWxzZSBpZiAoIV8uaXNOdW1iZXIodGFyZ2V0KSB8fCB0YXJnZXQgPCAxIHx8IHRhcmdldCAlIDEgIT09IDApIHtcbiAgICAvLyB0aGUgdGFyZ2V0IG11c3QgYmUgZGVmaW5lZCwgYmUgYSBudW1iZXIsIGJlIGF0IGxlYXN0IG9uZSwgYW5kIGJlIGEgbmF0dXJhbCBudW1iZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhcmdldCBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIGludGVnZXInKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMubWF4U2l6ZSAmJiAhXy5pc051bWJlcihwYXJhbXMubWF4U2l6ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLm1pblNpemUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblNpemUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaW5TaXplIHNob3VsZCBiZSBhIG51bWJlcicpO1xuICB9XG5cbiAgLy8gbWF4aW11bSBudW1iZXIgb2YgaW5wdXRzIHBlciB0cmFuc2FjdGlvbiBmb3IgY29uc29saWRhdGlvblxuICBjb25zdCBNQVhfSU5QVVRfQ09VTlQgPSAyMDA7XG4gIGxldCBtYXhJbnB1dENvdW50ID0gcGFyYW1zLm1heElucHV0Q291bnRQZXJDb25zb2xpZGF0aW9uO1xuICBpZiAobWF4SW5wdXRDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gbnVsbCBvciB1bmlkZW50aWZpZWQsIGJlY2F1c2UgZXF1YWxpdHkgdG8gemVybyByZXR1cm5zIHRydWUgaW4gaWYoISBjbGF1c2VcbiAgICBtYXhJbnB1dENvdW50ID0gTUFYX0lOUFVUX0NPVU5UO1xuICB9XG4gIGlmICh0eXBlb2YgbWF4SW5wdXRDb3VudCAhPT0gJ251bWJlcicgfHwgbWF4SW5wdXRDb3VudCA8IDIgfHwgbWF4SW5wdXRDb3VudCAlIDEgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01heGltdW0gY29uc29saWRhdGlvbiBpbnB1dCBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDInKTtcbiAgfSBlbHNlIGlmIChtYXhJbnB1dENvdW50ID4gTUFYX0lOUFVUX0NPVU5UKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGNvbnNvbGlkYXRpb24gaW5wdXQgY291bnQgY2Fubm90IGJlIGJpZ2dlciB0aGFuICcgKyBNQVhfSU5QVVRfQ09VTlQpO1xuICB9XG5cbiAgY29uc3QgbWF4SXRlcmF0aW9uQ291bnQgPSBwYXJhbXMubWF4SXRlcmF0aW9uQ291bnQgfHwgLTE7XG4gIGlmIChcbiAgICAocGFyYW1zLm1heEl0ZXJhdGlvbkNvdW50ICYmICghXy5pc051bWJlcihtYXhJdGVyYXRpb25Db3VudCkgfHwgbWF4SXRlcmF0aW9uQ291bnQgPCAxKSkgfHxcbiAgICBtYXhJdGVyYXRpb25Db3VudCAlIDEgIT09IDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNYXhpbXVtIGl0ZXJhdGlvbiBjb3VudCBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9yIGJpZ2dlciB0aGFuIDEnKTtcbiAgfVxuXG4gIGxldCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcztcbiAgaWYgKG1pbkNvbmZpcm1zID09PSB1bmRlZmluZWQpIHtcbiAgICBtaW5Db25maXJtcyA9IDE7XG4gIH1cbiAgaWYgKCFfLmlzTnVtYmVyKG1pbkNvbmZpcm1zKSB8fCBtaW5Db25maXJtcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbkNvbmZpcm1zIG5lZWRzIHRvIGJlIGFuIGludGVnZXIgZXF1YWwgdG8gb3IgYmlnZ2VyIHRoYW4gMCcpO1xuICB9XG5cbiAgbGV0IG1pblNpemUgPSBwYXJhbXMubWluU2l6ZSB8fCAwO1xuICBpZiAocGFyYW1zLmZlZVJhdGUpIHtcbiAgICAvLyBmZWUgcmF0ZSBpcyBpbiBzYXRvc2hpcyBwZXIga0IsIGlucHV0IHNpemUgaW4gYnl0ZXNcbiAgICBjb25zdCBmZWVCYXNlZE1pblNpemUgPSBNYXRoLmNlaWwoKFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMuZmVlUmF0ZSkgLyAxMDAwKTtcbiAgICBpZiAocGFyYW1zLm1pblNpemUgJiYgbWluU2l6ZSA8IGZlZUJhc2VkTWluU2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm92aWRlZCBtaW5TaXplIHRvbyBsb3cgZHVlIHRvIHRvbyBoaWdoIGZlZSByYXRlJyk7XG4gICAgfVxuICAgIG1pblNpemUgPSBNYXRoLm1heChmZWVCYXNlZE1pblNpemUsIG1pblNpemUpO1xuXG4gICAgaWYgKCFwYXJhbXMubWluU2l6ZSkge1xuICAgICAgLy8gZmVlIHJhdGUtYmFzZWQgbWluIHNpemUgbmVlZHMgbm8gbG9nZ2luZyBpZiBpdCB3YXMgc2V0IGV4cGxpY2l0bHlcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAnT25seSBjb25zb2xpZGF0aW5nIHVuc3BlbnRzIGxhcmdlciB0aGFuICcgK1xuICAgICAgICAgIG1pblNpemUgK1xuICAgICAgICAgICcgc2F0b3NoaXMgdG8gYXZvaWQgd2FzdGluZyBtb25leSBvbiBmZWVzLiBUbyBjb25zb2xpZGF0ZSBzbWFsbGVyIHVuc3BlbnRzLCB1c2UgYSBsb3dlciBmZWUgcmF0ZS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGxldCBpdGVyYXRpb25Db3VudCA9IDA7XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGxldCBjb25zb2xpZGF0aW9uSW5kZXggPSAwO1xuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZSBvbmUgYmF0Y2ggb2YgdXAgdG8gTUFYX0lOUFVUX0NPVU5UIHVuc3BlbnRzLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGNvbnN0IHJ1bk5leHRDb25zb2xpZGF0aW9uID0gY28oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGZhbHNlO1xuICAgIGl0ZXJhdGlvbkNvdW50Kys7XG4gICAgLypcbiAgICAgV2UgdGFrZSBhIG1heGltdW0gb2YgdW5zcGVudEJ1bGtTaXplTGltaXQgdW5zcGVudHMgZnJvbSB0aGUgd2FsbGV0LiBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN3aXBlIHRoZSB3YWxsZXRcbiAgICAgY2xlYW4gb2YgYWxsIGV4Y2Vzc2l2ZSB1bnNwZW50cywgc28gd2UgYWRkIDEgdG8gdGhlIHRhcmdldCB1bnNwZW50IGNvdW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IG1pc3NlZCBhbnl0aGluZy5cbiAgICAgSW4gY2FzZSB0aGVyZSBhcmUgZXZlbiBtb3JlIHVuc3BlbnRzIHRoYW4gdGhhdCwgdG8gbWFrZSB0aGUgY29uc29saWRhdGlvbiBhcyBmYXN0IGFzIHBvc3NpYmxlLCB3ZSBleHBhbmQgb3VyXG4gICAgIHNlbGVjdGlvbiB0byBpbmNsdWRlIGFzIG1hbnkgYXMgdGhlIG1heGltdW0gcGVybWlzc2libGUgbnVtYmVyIG9mIGlucHV0cyBwZXIgY29uc29saWRhdGlvbiBiYXRjaC5cbiAgICAgU2hvdWxkIHRoZSB0YXJnZXQgbnVtYmVyIG9mIHVuc3BlbnRzIGJlIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBpZiBpbnB1dHMgcGVyIGNvbnNvbGlkYXRpb24sXG4gICAgIHdlIHN0aWxsIHdhbnQgdG8gZmV0Y2ggdGhlbSBhbGwgc2ltcGx5IHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGEgY29uc29saWRhdGlvbiBjYW4gYmUgcGVyZm9ybWVkXG4gICAgIGF0IGFsbCwgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBudW1iZXIgb2YgYWxsIHVuc3BlbnRzIGJlaW5nIGhpZ2hlciB0aGFuIHRoZSB0YXJnZXQuXG4gICAgIEluIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlIHVuc3BlbnRzIHZlcnNpb24gU0RLLCB3ZSB3aWxsIGtub3cgdGhlIHRvdGFsIG51bWJlciBvZiB1bnNwZW50cyB3aXRob3V0IGhhdmluZyB0byBmZXRjaFxuICAgICB0aGVtLCBhbmQgdGhlcmVmb3JlIHdpbGwgYmUgYWJsZSB0byBzaW1wbGlmeSB0aGlzIG1ldGhvZC5cbiAgICAgKi9cblxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7XG4gICAgICBsaW1pdDogdGFyZ2V0ICsgbWF4SW5wdXRDb3VudCxcbiAgICAgIG1pbkNvbmZpcm1zOiBtaW5Db25maXJtcyxcbiAgICAgIG1pblNpemU6IG1pblNpemUsXG4gICAgfTtcbiAgICBpZiAocGFyYW1zLm1heFNpemUpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLm1heFNpemUgPSBwYXJhbXMubWF4U2l6ZTtcbiAgICB9XG4gICAgY29uc3QgYWxsVW5zcGVudHMgPSAoeWllbGQgc2VsZi51bnNwZW50cyhxdWVyeVBhcmFtcykpIGFzIGFueTtcbiAgICAvLyB0aGlzIGNvbnNvbGlkYXRpb24gaXMgZXNzZW50aWFsbHkganVzdCBhIHdhc3RlIG9mIG1vbmV5XG4gICAgaWYgKGFsbFVuc3BlbnRzLmxlbmd0aCA8PSB0YXJnZXQpIHtcbiAgICAgIGlmIChpdGVyYXRpb25Db3VudCA8PSAxKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IGl0ZXJhdGlvbiwgc28gdGhlIG1ldGhvZCBpcyBpbmNvcnJlY3RcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZXdlciB1bnNwZW50cyB0aGFuIGNvbnNvbGlkYXRpb24gdGFyZ2V0LiBVc2UgZmFuT3V0VW5zcGVudHMgaW5zdGVhZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGl0J3MgYSBsYXRlciBpdGVyYXRpb24sIHNvIHRoZSB0YXJnZXQgbWF5IGhhdmUgYmVlbiBzdXJwYXNzZWQgKGR1ZSB0byBjb25maXJtYXRpb25zIGluIHRoZSBiYWNrZ3JvdW5kKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvbmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxVbnNwZW50c0NvdW50ID0gYWxsVW5zcGVudHMubGVuZ3RoO1xuXG4gICAgLy8gaG93IG1hbnkgb2YgdGhlIHVuc3BlbnRzIGRvIHdlIHdhbnQgdG8gY29uc29saWRhdGU/XG4gICAgLy8gdGhlICsxIGlzIGJlY2F1c2UgdGhlIGNvbnNvbGlkYXRlZCBibG9jayBiZWNvbWVzIGEgbmV3IHVuc3BlbnQgbGF0ZXJcbiAgICBsZXQgdGFyZ2V0SW5wdXRDb3VudCA9IGFsbFVuc3BlbnRzQ291bnQgLSB0YXJnZXQgKyAxO1xuICAgIHRhcmdldElucHV0Q291bnQgPSBNYXRoLm1pbih0YXJnZXRJbnB1dENvdW50LCBhbGxVbnNwZW50cy5sZW5ndGgpO1xuXG4gICAgLy8gaWYgdGhlIHRhcmdldElucHV0Q291bnQgcmVxdWlyZXMgbW9yZSBpbnB1dHMgdGhhbiB3ZSBhbGxvdyBwZXIgYmF0Y2gsIHdlIHJlZHVjZSB0aGUgbnVtYmVyXG4gICAgY29uc3QgaW5wdXRDb3VudCA9IE1hdGgubWluKHRhcmdldElucHV0Q291bnQsIG1heElucHV0Q291bnQpO1xuXG4gICAgLy8gaWYgZWl0aGVyIHRoZSBudW1iZXIgb2YgaW5wdXRzIGxlZnQgdG8gY29hbGVzY2UgZXF1YWxzIHRoZSBudW1iZXIgd2Ugd2lsbCBjb2FsZXNjZSBpbiB0aGlzIGl0ZXJhdGlvblxuICAgIC8vIG9yIGlmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBtYXRjaGVzIHRoZSBtYXhpbXVtIHBlcm1pdHRlZCBudW1iZXJcbiAgICBpc0ZpbmFsQ29uc29saWRhdGlvbiA9IGlucHV0Q291bnQgPT09IHRhcmdldElucHV0Q291bnQgfHwgaXRlcmF0aW9uQ291bnQgPT09IG1heEl0ZXJhdGlvbkNvdW50O1xuXG4gICAgY29uc3QgY3VycmVudENodW5rID0gYWxsVW5zcGVudHMuc3BsaWNlKDAsIGlucHV0Q291bnQpO1xuICAgIGNvbnN0IGNoYW5nZUNoYWluID0gc2VsZi5nZXRDaGFuZ2VDaGFpbihwYXJhbXMpO1xuICAgIGNvbnN0IG5ld0FkZHJlc3MgPSAoeWllbGQgc2VsZi5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkpIGFzIGFueTtcbiAgICBjb25zdCB0eFBhcmFtcyA9IF8uZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIGNvbnN0IGN1cnJlbnRBZGRyZXNzID0gbmV3QWRkcmVzcztcbiAgICAvLyB0aGUgdG90YWwgYW1vdW50IHRoYXQgd2UgYXJlIGNvbnNvbGlkYXRpbmcgd2l0aGluIHRoaXMgYmF0Y2hcbiAgICBjb25zdCBncm9zc0Ftb3VudCA9IF8oY3VycmVudENodW5rKS5tYXAoJ3ZhbHVlJykuc3VtKCk7IC8vIGJlZm9yZSBmZWVzXG5cbiAgICB0eFBhcmFtcy51bnNwZW50cyA9IGN1cnJlbnRDaHVuaztcbiAgICB0eFBhcmFtcy5yZWNpcGllbnRzID0ge307XG4gICAgdHhQYXJhbXMucmVjaXBpZW50c1tuZXdBZGRyZXNzLmFkZHJlc3NdID0gZ3Jvc3NBbW91bnQ7XG4gICAgdHhQYXJhbXMubm9TcGxpdENoYW5nZSA9IHRydWU7XG5cbiAgICBpZiAodHhQYXJhbXMudW5zcGVudHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9uZScpO1xuICAgIH1cblxuICAgIC8vIGxldCdzIGF0dGVtcHQgdG8gY3JlYXRlIHRoaXMgdHJhbnNhY3Rpb24uIFdlIGV4cGVjdCBpdCB0byBmYWlsIGJlY2F1c2Ugbm8gZmVlIGlzIHNldC5cbiAgICB0cnkge1xuICAgICAgeWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIHRoaXMgZXJyb3Igc2hvdWxkIG9jY3VyIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHNcbiAgICAgIC8vIGhvd2V2ZXIsIGxldCdzIG1ha2Ugc3VyZSBpdCB3YXNuJ3Qgc29tZXRoaW5nIGVsc2VcbiAgICAgIGlmICghZXJyb3IuZmVlICYmICghZXJyb3IucmVzdWx0IHx8ICFlcnJvci5yZXN1bHQuZmVlKSkge1xuICAgICAgICAvLyBpZiB0aGUgZXJyb3IgZG9lcyBub3QgY29udGFpbiBhIGZlZSBwcm9wZXJ0eSwgaXQgaXMgc29tZXRoaW5nIGVsc2UgdGhhdCBoYXMgZ29uZSBhd3J5LCBhbmQgd2UgdGhyb3cgaXRcbiAgICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgICBlcnJvci5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFzZUZlZSA9IGVycm9yLmZlZSB8fCBlcnJvci5yZXN1bHQuZmVlO1xuICAgICAgbGV0IGJpdGdvRmVlID0gMDtcbiAgICAgIGxldCB0b3RhbEZlZSA9IGJhc2VGZWU7XG4gICAgICBpZiAoZXJyb3IucmVzdWx0LmJpdGdvRmVlICYmIGVycm9yLnJlc3VsdC5iaXRnb0ZlZS5hbW91bnQpIHtcbiAgICAgICAgYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWUuYW1vdW50O1xuICAgICAgICB0b3RhbEZlZSArPSBiaXRnb0ZlZTtcbiAgICAgICAgdHhQYXJhbXMuYml0Z29GZWUgPSBlcnJvci5yZXN1bHQuYml0Z29GZWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBuZXQgYW1vdW50IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbWluaW11bSBvdXRwdXQgc2l6ZVxuICAgICAgY29uc3QgbmV0QW1vdW50ID0gTWF0aC5tYXgoZXJyb3IucmVzdWx0LmF2YWlsYWJsZSAtIHRvdGFsRmVlLCBzZWxmLmJpdGdvLmdldENvbnN0YW50cygpLm1pbk91dHB1dFNpemUpO1xuICAgICAgLy8gTmVlZCB0byBjbGVhciB0aGVzZSBvdXQgc2luY2Ugb25seSAxIG1heSBiZSBzZXRcbiAgICAgIGRlbGV0ZSB0eFBhcmFtcy5mZWU7XG4gICAgICB0eFBhcmFtcy5vcmlnaW5hbEZlZVJhdGUgPSB0eFBhcmFtcy5mZWVSYXRlO1xuICAgICAgZGVsZXRlIHR4UGFyYW1zLmZlZVJhdGU7XG4gICAgICBkZWxldGUgdHhQYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0O1xuXG4gICAgICAvLyB3ZSBzZXQgdGhlIGZlZSBleHBsaWNpdGx5XG4gICAgICB0eFBhcmFtcy5mZWUgPSBlcnJvci5yZXN1bHQuYXZhaWxhYmxlIC0gbmV0QW1vdW50IC0gYml0Z29GZWU7XG4gICAgICB0eFBhcmFtcy5yZWNpcGllbnRzW25ld0FkZHJlc3MuYWRkcmVzc10gPSBuZXRBbW91bnQ7XG4gICAgfVxuICAgIC8vIHRoaXMgdHJhbnNhY3Rpb24sIG9uIHRoZSBvdGhlciBoYW5kLCBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIG5vIGlzc3VlcywgYmVjYXVzZSBhbiBhcHByb3ByaWF0ZSBmZWUgaXMgc2V0XG4gICAgbGV0IHNlbnRUeDtcbiAgICB0cnkge1xuICAgICAgc2VudFR4ID0geWllbGQgc2VsZi5zZW5kTWFueSh0eFBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZGVidWdQYXJhbXMgPSBfLm9taXQodHhQYXJhbXMsIFsnd2FsbGV0UGFzc3BocmFzZScsICd4cHJ2J10pO1xuICAgICAgZS5tZXNzYWdlICs9IGBcXG5cXG5UWCBQQVJBTVM6XFxuICR7SlNPTi5zdHJpbmdpZnkoZGVidWdQYXJhbXMsIG51bGwsIDQpfWA7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goc2VudFR4KTtcbiAgICBpZiAoXy5pc0Z1bmN0aW9uKHBhcmFtcy5wcm9ncmVzc0NhbGxiYWNrKSkge1xuICAgICAgcGFyYW1zLnByb2dyZXNzQ2FsbGJhY2soe1xuICAgICAgICB0eGlkOiBzZW50VHguaGFzaCxcbiAgICAgICAgZGVzdGluYXRpb246IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGdyb3NzQW1vdW50LFxuICAgICAgICBmZWU6IHNlbnRUeC5mZWUsXG4gICAgICAgIGlucHV0Q291bnQ6IGlucHV0Q291bnQsXG4gICAgICAgIGluZGV4OiBjb25zb2xpZGF0aW9uSW5kZXgsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc29saWRhdGlvbkluZGV4Kys7XG4gICAgaWYgKCFpc0ZpbmFsQ29uc29saWRhdGlvbikge1xuICAgICAgLy8gdGhpcyBsYXN0IGNvbnNvbGlkYXRpb24gaGFzIG5vdCB5ZXQgYnJvdWdodCB0aGUgdW5zcGVudHMgY291bnQgZG93biB0byB0aGUgdGFyZ2V0IHVuc3BlbnQgY291bnRcbiAgICAgIC8vIHRoZXJlZm9yZSwgd2UgcHJvY2VlZCBieSBjb25zb2xpZGF0aW5nIHlldCBhbm90aGVyIGJhdGNoXG4gICAgICAvLyBiZWZvcmUgd2UgZG8gdGhhdCwgd2Ugd2FpdCAxIHNlY29uZCBzbyB0aGF0IHRoZSBuZXdseSBjcmVhdGVkIHVuc3BlbnQgd2lsbCBiZSBmZXRjaGVkIGluIHRoZSBuZXh0IGJhdGNoXG4gICAgICB5aWVsZCBCbHVlYmlyZC5kZWxheSgxMDAwKTtcbiAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCguLi4oKHlpZWxkIHJ1bk5leHRDb25zb2xpZGF0aW9uKCkpIGFzIGFueSkpO1xuICAgIH1cbiAgICAvLyB0aGlzIGlzIHRoZSBmaW5hbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uLiBXZSByZXR1cm4gYWxsIHRoZSBvbmVzIHdlJ3ZlIGhhZCBzbyBmYXJcbiAgICByZXR1cm4gY29uc29saWRhdGlvblRyYW5zYWN0aW9ucztcbiAgfSk7XG5cbiAgcmV0dXJuIHJ1bk5leHRDb25zb2xpZGF0aW9uKHRoaXMsIHRhcmdldClcbiAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVyci5tZXNzYWdlID09PSAnRG9uZScpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5zaGFyZVdhbGxldCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydlbWFpbCcsICdwZXJtaXNzaW9ucyddLCBbJ3dhbGxldFBhc3NwaHJhc2UnLCAnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKHBhcmFtcy5yZXNoYXJlICE9PSB1bmRlZmluZWQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5yZXNoYXJlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgcmVzaGFyZSB0byBiZSBhIGJvb2xlYW4uJyk7XG4gIH1cblxuICBpZiAocGFyYW1zLnNraXBLZXljaGFpbiAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuc2tpcEtleWNoYWluKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgc2tpcEtleWNoYWluIHRvIGJlIGEgYm9vbGVhbi4gJyk7XG4gIH1cbiAgY29uc3QgbmVlZHNLZXljaGFpbiA9ICFwYXJhbXMuc2tpcEtleWNoYWluICYmIHBhcmFtcy5wZXJtaXNzaW9ucy5pbmRleE9mKCdzcGVuZCcpICE9PSAtMTtcblxuICBpZiAocGFyYW1zLmRpc2FibGVFbWFpbCAhPT0gdW5kZWZpbmVkICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZGlzYWJsZUVtYWlsKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZGlzYWJsZUVtYWlsIHRvIGJlIGEgYm9vbGVhbi4nKTtcbiAgfVxuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuICBsZXQgc2hhcmluZztcbiAgbGV0IHNoYXJlZEtleWNoYWluO1xuICByZXR1cm4gdGhpcy5iaXRnb1xuICAgIC5nZXRTaGFyaW5nS2V5KHsgZW1haWw6IHBhcmFtcy5lbWFpbC50b0xvd2VyQ2FzZSgpIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgc2hhcmluZyA9IHJlc3VsdDtcblxuICAgICAgaWYgKG5lZWRzS2V5Y2hhaW4pIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0RW5jcnlwdGVkVXNlcktleWNoYWluKHt9KS50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgICAgIC8vIERlY3J5cHQgdGhlIHVzZXIga2V5IHdpdGggYSBwYXNzcGhyYXNlXG4gICAgICAgICAgaWYgKGtleWNoYWluLmVuY3J5cHRlZFhwcnYpIHtcbiAgICAgICAgICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UgYXJndW1lbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGtleWNoYWluLnhwcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsIGlucHV0OiBrZXljaGFpbi5lbmNyeXB0ZWRYcHJ2IH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZWNyeXB0IHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWNrZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gICAgICAgICAgICBjb25zdCBzZWNyZXQgPSBnZXRTaGFyZWRTZWNyZXQoZWNrZXksIEJ1ZmZlci5mcm9tKHNoYXJpbmcucHVia2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VuY3J5cHRlZFhwcnYgPSBzZWxmLmJpdGdvLmVuY3J5cHQoeyBwYXNzd29yZDogc2VjcmV0LCBpbnB1dDoga2V5Y2hhaW4ueHBydiB9KTtcblxuICAgICAgICAgICAgc2hhcmVkS2V5Y2hhaW4gPSB7XG4gICAgICAgICAgICAgIHhwdWI6IGtleWNoYWluLnhwdWIsXG4gICAgICAgICAgICAgIGVuY3J5cHRlZFhwcnY6IG5ld0VuY3J5cHRlZFhwcnYsXG4gICAgICAgICAgICAgIGZyb21QdWJLZXk6IGVja2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgICAgIHRvUHViS2V5OiBzaGFyaW5nLnB1YmtleSxcbiAgICAgICAgICAgICAgcGF0aDogc2hhcmluZy5wYXRoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgICAgICB1c2VyOiBhbnk7XG4gICAgICAgIHBlcm1pc3Npb25zOiBzdHJpbmc7XG4gICAgICAgIHJlc2hhcmU6IGJvb2xlYW47XG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgZGlzYWJsZUVtYWlsOiBhbnk7XG4gICAgICAgIGtleWNoYWluPzogYW55O1xuICAgICAgICBza2lwS2V5Y2hhaW4/OiBib29sZWFuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuICAgICAgICB1c2VyOiBzaGFyaW5nLnVzZXJJZCxcbiAgICAgICAgcGVybWlzc2lvbnM6IHBhcmFtcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgcmVzaGFyZTogcGFyYW1zLnJlc2hhcmUsXG4gICAgICAgIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICAgICAgICBkaXNhYmxlRW1haWw6IHBhcmFtcy5kaXNhYmxlRW1haWwsXG4gICAgICB9O1xuICAgICAgaWYgKHNoYXJlZEtleWNoYWluKSB7XG4gICAgICAgIG9wdGlvbnMua2V5Y2hhaW4gPSBzaGFyZWRLZXljaGFpbjtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNraXBLZXljaGFpbikge1xuICAgICAgICBvcHRpb25zLmtleWNoYWluID0ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmLmNyZWF0ZVNoYXJlKG9wdGlvbnMpO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5yZW1vdmVVc2VyID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VzZXInXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMudXJsKCcvdXNlci8nICsgcGFyYW1zLnVzZXIpKVxuICAgICAgLnNlbmQoKVxuICAgICAgLnJlc3VsdCgpXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5XYWxsZXQucHJvdG90eXBlLmdldFBvbGljeSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wb2xpY3knKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZ2V0UG9saWN5U3RhdHVzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3BvbGljeS9zdGF0dXMnKSkuc2VuZCgpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuc2V0UG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFsnbWVzc2FnZSddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5jb25kaXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHBhcmFtZXRlcjogY29uZGl0aW9ucyBvYmplY3QnKTtcbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMuYWN0aW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwYXJhbWV0ZXI6IGFjdGlvbiBvYmplY3QnKTtcbiAgfVxuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucHV0KHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCddLCBbJ21lc3NhZ2UnXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvcG9saWN5L3J1bGUnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUubGlzdFdlYmhvb2tzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3dlYmhvb2tzJykpLnNlbmQoKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNpbXVsYXRlIHdhbGxldCB3ZWJob29rLCBjdXJyZW50bHkgZm9yIHdlYmhvb2tzIG9mIHR5cGUgdHJhbnNhY3Rpb24gYW5kIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBwYXJhbXNcbiAqIC0gd2ViaG9va0lkIChyZXF1aXJlZCk6IGlkIG9mIHRoZSB3ZWJob29rIHRvIGJlIHNpbXVsYXRlZFxuICogLSB0eEhhc2ggKG9wdGlvbmFsIGJ1dCByZXF1aXJlZCBmb3IgdHJhbnNhY3Rpb24gd2ViaG9va3MpIGhhc2ggb2YgdGhlIHNpbXVsYXRlZCB0cmFuc2FjdGlvblxuICogLSBwZW5kaW5nQXBwcm92YWxJZCAob3B0aW9uYWwgYnV0IHJlcXVpcmVkIGZvciBwZW5kaW5nIGFwcHJvdmFsIHdlYmhvb2tzKSBpZCBvZiB0aGUgc2ltdWxhdGVkIHBlbmRpbmcgYXBwcm92YWxcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9XG4gKi9cbldhbGxldC5wcm90b3R5cGUuc2ltdWxhdGVXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3dlYmhvb2tJZCddLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddLCBjYWxsYmFjayk7XG5cbiAgY29uc3QgaGFzVHhIYXNoID0gISFwYXJhbXMudHhIYXNoO1xuICBjb25zdCBoYXNQZW5kaW5nQXBwcm92YWxJZCA9ICEhcGFyYW1zLnBlbmRpbmdBcHByb3ZhbElkO1xuXG4gIGlmICgoaGFzVHhIYXNoICYmIGhhc1BlbmRpbmdBcHByb3ZhbElkKSB8fCAoIWhhc1R4SGFzaCAmJiAhaGFzUGVuZGluZ0FwcHJvdmFsSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IHN1cHBseSBlaXRoZXIgdHhIYXNoIG9yIHBlbmRpbmdBcHByb3ZhbElkLCBidXQgbm90IGJvdGgnKTtcbiAgfVxuXG4gIC8vIGRlcGVuZGluZyBvbiB0aGUgY29pbiB0eXBlIG9mIHRoZSB3YWxsZXQsIHRoZSB0eEhhc2ggaGFzIHRvIGFkaGVyZSB0byBpdHMgcmVzcGVjdGl2ZSBmb3JtYXRcbiAgLy8gYnV0IHRoZSBzZXJ2ZXIgdGFrZXMgY2FyZSBvZiB0aGF0XG5cbiAgLy8gb25seSB0YWtlIHRoZSB0eEhhc2ggYW5kIHBlbmRpbmdBcHByb3ZhbElkIHByb3BlcnRpZXNcbiAgY29uc3QgZmlsdGVyZWRQYXJhbXMgPSBfLnBpY2socGFyYW1zLCBbJ3R4SGFzaCcsICdwZW5kaW5nQXBwcm92YWxJZCddKTtcblxuICBjb25zdCB3ZWJob29rSWQgPSBwYXJhbXMud2ViaG9va0lkO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dlYmhvb2tzLycgKyB3ZWJob29rSWQgKyAnL3NpbXVsYXRlJykpXG4gICAgICAuc2VuZChmaWx0ZXJlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKVxuICApLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5hZGRXZWJob29rID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3VybCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUucmVtb3ZlV2ViaG9vayA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd1cmwnLCAndHlwZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZGVsKHRoaXMudXJsKCcvd2ViaG9va3MnKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKS5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbldhbGxldC5wcm90b3R5cGUuZXN0aW1hdGVGZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICBpZiAocGFyYW1zLmFtb3VudCAmJiBwYXJhbXMucmVjaXBpZW50cykge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCBhbW91bnQgYXMgd2VsbCBhcyByZWNpcGllbnRzJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5yZWNpcGllbnRzICYmICFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVjaXBpZW50cyBtdXN0IGJlIGFycmF5IG9mIHsgYWRkcmVzczogYWJjLCBhbW91bnQ6IDEwMDAwMCB9IG9iamVjdHMnKTtcbiAgfVxuICBpZiAocGFyYW1zLmFtb3VudCAmJiAhXy5pc051bWJlcihwYXJhbXMuYW1vdW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgYXJndW1lbnQsIGV4cGVjdGluZyBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IHJlY2lwaWVudHMgPSBwYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcblxuICBpZiAocGFyYW1zLmFtb3VudCkge1xuICAgIC8vIG9ubHkgdGhlIGFtb3VudCB3YXMgcGFzc2VkIGluLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBmYWxzZSByZWNpcGllbnQgdG8gcnVuIGNyZWF0ZVRyYW5zYWN0aW9uIHdpdGhcbiAgICByZWNpcGllbnRzLnB1c2goe1xuICAgICAgYWRkcmVzczogY29tbW9uLkVudmlyb25tZW50c1t0aGlzLmJpdGdvLmVudl0uc2lnbmluZ0FkZHJlc3MsIC8vIGFueSBhZGRyZXNzIHdpbGwgZG9cbiAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uUGFyYW1zID0gXy5leHRlbmQoe30sIHBhcmFtcyk7XG4gIHRyYW5zYWN0aW9uUGFyYW1zLmFtb3VudCA9IHVuZGVmaW5lZDtcbiAgdHJhbnNhY3Rpb25QYXJhbXMucmVjaXBpZW50cyA9IHJlY2lwaWVudHM7XG5cbiAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25QYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHR4KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVzdGltYXRlZFNpemU6IHR4LmVzdGltYXRlZFNpemUsXG4gICAgICBmZWU6IHR4LmZlZSxcbiAgICAgIGZlZVJhdGU6IHR4LmZlZVJhdGUsXG4gICAgfTtcbiAgfSk7XG59O1xuXG4vLyBOb3QgZnVsbHkgaW1wbGVtZW50ZWQgLyByZWxlYXNlZCBvbiBTREsuIFRlc3RpbmcgZm9yIG5vdy5cbldhbGxldC5wcm90b3R5cGUudXBkYXRlUG9saWN5UnVsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydpZCcsICd0eXBlJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wdXQodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuV2FsbGV0LnByb3RvdHlwZS5kZWxldGVQb2xpY3lSdWxlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2lkJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5kZWwodGhpcy51cmwoJy9wb2xpY3kvcnVsZScpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGdldEJpdEdvRmVlXG4vLyBHZXQgdGhlIHJlcXVpcmVkIG9uLXRyYW5zYWN0aW9uIEJpdEdvIGZlZVxuLy9cbldhbGxldC5wcm90b3R5cGUuZ2V0Qml0R29GZWUgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLmFtb3VudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYW1vdW50IGFyZ3VtZW50Jyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdGFudCBhcmd1bWVudCcpO1xuICB9XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvYmlsbGluZy9mZWUnKSkucXVlcnkocGFyYW1zKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKlxuICogQHBhcmFtc1xuICogIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2Ugb2Ygd2FsbGV0IHVzZWQgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleXNcbiAqICB1bnNwZW50czogYXJyYXkgb2YgdW5zcGVudHMgdG8gcmVjb3ZlclxuICogIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyB0b1xuICogIGZlZVJhdGU6IGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gKiAgdXNlcktleTogZW5jcnlwdGVkIHVzZXIga2V5XG4gKiAgYmFja3VwS2V5OiBlbmNyeXB0ZWQgYmFja3VwIGtleVxuICogKi9cbldhbGxldC5wcm90b3R5cGUucmVjb3ZlciA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVuc3BlbnRzJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlUmF0ZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1c2VyS2V5Jyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFja3VwS2V5Jyk7XG4gIH1cblxuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gQmlnSW50KHV0eG9saWIuYml0Z28udW5zcGVudFN1bShwYXJhbXMudW5zcGVudHMpKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcigpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZTtcbiAgY29uc3QgYXBwcm94aW1hdGVTaXplID1cbiAgICBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMudW5zcGVudHMubGVuZ3RoO1xuICBjb25zdCBhcHByb3hpbWF0ZVR4RmVlID0gQmlnSW50KGFwcHJveGltYXRlU2l6ZSAqIHBhcmFtcy5mZWVSYXRlKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVUeEZlZTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IE51bWJlcihyZWNvdmVyeUFtb3VudCkgfV07XG5cbiAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgcmVjaXBpZW50cyxcbiAgICBmZWU6IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSxcbiAgfSk7XG5cbiAgY29uc3QgcGFyc2VkVW5zaWduZWRUeCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHVuc2lnbmVkVHgudHJhbnNhY3Rpb25IZXgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lmlucy5sZW5ndGggPT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5vdXRzLmxlbmd0aCA9PT0gMSk7XG4gIGFzc2VydChfLnN1bUJ5KHBhcmFtcy51bnNwZW50cywgJ3ZhbHVlJykgLSBfLnN1bUJ5KHBhcnNlZFVuc2lnbmVkVHgub3V0cywgJ3ZhbHVlJykgPT09IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSk7XG5cbiAgY29uc3QgcGxhaW5Vc2VyS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLnVzZXJLZXkgfSk7XG4gIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHsgLi4udW5zaWduZWRUeCwgc2lnbmluZ0tleTogcGxhaW5Vc2VyS2V5IH0pO1xuXG4gIGNvbnN0IHBsYWluQmFja3VwS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLmJhY2t1cEtleSB9KTtcbiAgY29uc3QgZnVsbFNpZ25lZFR4ID0gYXdhaXQgdGhpcy5zaWduVHJhbnNhY3Rpb24oe1xuICAgIC4uLnVuc2lnbmVkVHgsXG4gICAgdHJhbnNhY3Rpb25IZXg6IGhhbGZTaWduZWRUeC50eCxcbiAgICBzaWduaW5nS2V5OiBwbGFpbkJhY2t1cEtleSxcbiAgfSk7XG4gIHJldHVybiBmdWxsU2lnbmVkVHgudHg7XG59O1xuXG4vKlxuICogQHBhcmFtc1xuICogIHdhbGxldFBhc3NwaHJhc2U6IHBhc3NwaHJhc2Ugb2Ygd2FsbGV0IHVzZWQgdG8gZGVjcnlwdCB0aGUgZW5jcnlwdGVkIGtleXNcbiAqICB1bnNwZW50czogYXJyYXkgb2YgdW5zcGVudHMgdG8gcmVjb3ZlclxuICogIHJlY292ZXJ5RGVzdGluYXRpb246IGRlc3RpbmF0aW9uIGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyB0b1xuICogIGZlZVJhdGU6IGZlZSByYXRlIHRvIHVzZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uXG4gKiAgdXNlcktleTogZW5jcnlwdGVkIHVzZXIga2V5XG4gKiAqL1xuV2FsbGV0LnByb3RvdHlwZS5zd2VlcCA9IGFzeW5jIGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldFBhc3NwaHJhc2UnKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVuc3BlbnRzJyk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmVlUmF0ZScpO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy51c2VyS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1c2VyS2V5Jyk7XG4gIH1cblxuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gQmlnSW50KHV0eG9saWIuYml0Z28udW5zcGVudFN1bShwYXJhbXMudW5zcGVudHMpKTtcbiAgaWYgKHRvdGFsSW5wdXRBbW91bnQgPD0gQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcigpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IFZpcnR1YWxTaXplcy50eFAyd3NoT3V0cHV0U2l6ZTtcbiAgY29uc3QgYXBwcm94aW1hdGVTaXplID1cbiAgICBWaXJ0dWFsU2l6ZXMudHhTZWdPdmVyaGVhZFZTaXplICsgb3V0cHV0U2l6ZSArIFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemUgKiBwYXJhbXMudW5zcGVudHMubGVuZ3RoO1xuICBjb25zdCBhcHByb3hpbWF0ZVR4RmVlID0gQmlnSW50KGFwcHJveGltYXRlU2l6ZSAqIHBhcmFtcy5mZWVSYXRlKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVUeEZlZTtcbiAgY29uc3QgcmVjaXBpZW50cyA9IFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IE51bWJlcihyZWNvdmVyeUFtb3VudCkgfV07XG5cbiAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHRoaXMuY3JlYXRlVHJhbnNhY3Rpb24oe1xuICAgIHVuc3BlbnRzOiBwYXJhbXMudW5zcGVudHMsXG4gICAgcmVjaXBpZW50cyxcbiAgICBmZWU6IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSxcbiAgfSk7XG5cbiAgY29uc3QgcGFyc2VkVW5zaWduZWRUeCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4KHVuc2lnbmVkVHgudHJhbnNhY3Rpb25IZXgsIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gIGFzc2VydChwYXJzZWRVbnNpZ25lZFR4Lmlucy5sZW5ndGggPT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpO1xuICBhc3NlcnQocGFyc2VkVW5zaWduZWRUeC5vdXRzLmxlbmd0aCA9PT0gMSk7XG4gIGFzc2VydChfLnN1bUJ5KHBhcmFtcy51bnNwZW50cywgJ3ZhbHVlJykgLSBfLnN1bUJ5KHBhcnNlZFVuc2lnbmVkVHgub3V0cywgJ3ZhbHVlJykgPT09IE51bWJlcihhcHByb3hpbWF0ZVR4RmVlKSk7XG5cbiAgY29uc3QgcGxhaW5Vc2VyS2V5ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLCBpbnB1dDogcGFyYW1zLnVzZXJLZXkgfSk7XG4gIGNvbnN0IGhhbGZTaWduZWRUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uKHsgLi4udW5zaWduZWRUeCwgc2lnbmluZ0tleTogcGxhaW5Vc2VyS2V5IH0pO1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLnNlbmRUcmFuc2FjdGlvbih7XG4gICAgdHg6IGhhbGZTaWduZWRUeC50eCxcbiAgICBzdXBwcmVzc0Jyb2FkY2FzdDogdHJ1ZSxcbiAgICBvdHA6IHBhcmFtcy5vdHAsXG4gIH0pO1xufTtcblxuZXhwb3J0ID0gV2FsbGV0O1xuIl19