@bitgo-beta/sdk-api 1.10.1-beta.181 → 1.10.1-beta.1811

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.
Files changed (79) hide show
  1. package/dist/package.json +20 -27
  2. package/dist/src/api.d.ts +8 -5
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +130 -71
  5. package/dist/src/bitgoAPI.d.ts +133 -16
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +786 -303
  8. package/dist/src/encrypt.d.ts +23 -4
  9. package/dist/src/encrypt.d.ts.map +1 -1
  10. package/dist/src/encrypt.js +86 -13
  11. package/dist/src/encryptV2.d.ts +68 -0
  12. package/dist/src/encryptV2.d.ts.map +1 -0
  13. package/dist/src/encryptV2.js +202 -0
  14. package/dist/src/encryptionSession.d.ts +34 -0
  15. package/dist/src/encryptionSession.d.ts.map +1 -0
  16. package/dist/src/encryptionSession.js +95 -0
  17. package/dist/src/index.d.ts +2 -0
  18. package/dist/src/index.d.ts.map +1 -1
  19. package/dist/src/index.js +8 -2
  20. package/dist/src/types.d.ts +64 -44
  21. package/dist/src/types.d.ts.map +1 -1
  22. package/dist/src/types.js +4 -2
  23. package/dist/src/util.d.ts +12 -0
  24. package/dist/src/util.d.ts.map +1 -1
  25. package/dist/src/util.js +57 -4
  26. package/dist/src/v1/blockchain.js +25 -12
  27. package/dist/src/v1/keychains.js +39 -26
  28. package/dist/src/v1/markets.js +10 -5
  29. package/dist/src/v1/pendingapproval.d.ts.map +1 -1
  30. package/dist/src/v1/pendingapproval.js +57 -18
  31. package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
  32. package/dist/src/v1/pendingapprovals.js +41 -7
  33. package/dist/src/v1/signPsbt.d.ts +14 -0
  34. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  35. package/dist/src/v1/signPsbt.js +69 -0
  36. package/dist/src/v1/transactionBuilder.js +214 -90
  37. package/dist/src/v1/travelRule.js +163 -66
  38. package/dist/src/v1/verifyAddress.d.ts +6 -0
  39. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  40. package/dist/src/v1/verifyAddress.js +50 -0
  41. package/dist/src/v1/wallet.d.ts.map +1 -1
  42. package/dist/src/v1/wallet.js +498 -230
  43. package/dist/src/v1/wallets.js +118 -53
  44. package/dist/test/unit/api.d.ts +2 -0
  45. package/dist/test/unit/api.d.ts.map +1 -0
  46. package/dist/test/unit/api.js +307 -0
  47. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  48. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  49. package/dist/test/unit/bitgoAPI.js +957 -0
  50. package/dist/test/unit/encrypt.d.ts +2 -0
  51. package/dist/test/unit/encrypt.d.ts.map +1 -0
  52. package/dist/test/unit/encrypt.js +415 -0
  53. package/dist/test/unit/hmacStrategy.d.ts +2 -0
  54. package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
  55. package/dist/test/unit/hmacStrategy.js +136 -0
  56. package/dist/test/unit/utils.d.ts +2 -0
  57. package/dist/test/unit/utils.d.ts.map +1 -0
  58. package/dist/test/unit/utils.js +65 -0
  59. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  60. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  61. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  62. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  63. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  64. package/dist/test/unit/v1/fixtures/index.js +24 -0
  65. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  66. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  67. package/dist/test/unit/v1/signPsbt.js +53 -0
  68. package/dist/test/unit/v1/travelRule.d.ts +2 -0
  69. package/dist/test/unit/v1/travelRule.d.ts.map +1 -0
  70. package/dist/test/unit/v1/travelRule.js +173 -0
  71. package/dist/test/unit/v1/wallet.d.ts +2 -0
  72. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  73. package/dist/test/unit/v1/wallet.js +1603 -0
  74. package/dist/tsconfig.tsbuildinfo +1 -0
  75. package/package.json +20 -27
  76. package/.eslintignore +0 -5
  77. package/CHANGELOG.md +0 -555
  78. package/dist/web/main.js +0 -2
  79. package/dist/web/main.js.LICENSE.txt +0 -110
@@ -2,6 +2,42 @@
2
2
  /**
3
3
  * @hidden
4
4
  */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
5
41
  Object.defineProperty(exports, "__esModule", { value: true });
6
42
  /**
7
43
  */
@@ -12,13 +48,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
48
  // Copyright 2014, BitGo, Inc. All Rights Reserved.
13
49
  //
14
50
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
15
- const Bluebird = require("bluebird");
16
- const utxolib = require("@bitgo-beta/utxo-lib");
17
- const _ = require("lodash");
51
+ const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
52
+ const lodash_1 = __importDefault(require("lodash"));
18
53
  const unspents_1 = require("@bitgo-beta/unspents");
19
54
  const debugLib = require("debug");
20
55
  const debug = debugLib('bitgo:v1:txb');
21
56
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
57
+ const verifyAddress_1 = require("./verifyAddress");
58
+ const util_1 = require("../util");
59
+ /**
60
+ * Parse chainPath like "/0/13" into { chain: 0, index: 13 }
61
+ */
62
+ function parseChainPath(chainPath) {
63
+ const parts = chainPath.split('/').filter((p) => p.length > 0);
64
+ if (parts.length !== 2) {
65
+ throw new Error(`Invalid chainPath: ${chainPath}`);
66
+ }
67
+ return { chain: parseInt(parts[0], 10), index: parseInt(parts[1], 10) };
68
+ }
69
+ /**
70
+ * Create RootWalletKeys from v1 wallet keychains.
71
+ * v1 keychains have a structure like { xpub, path: 'm', walletSubPath: '/0/0' }
72
+ */
73
+ function createRootWalletKeysFromV1Keychains(keychains) {
74
+ if (keychains.length !== 3) {
75
+ throw new Error('Expected 3 keychains for v1 wallet');
76
+ }
77
+ const bip32Keys = keychains.map((k) => utxo_lib_1.bip32.fromBase58(k.xpub));
78
+ // v1 wallets typically have walletSubPath like '/0/0' which we convert to derivation prefixes like '0/0'
79
+ const derivationPrefixes = keychains.map((k) => {
80
+ const walletSubPath = k.walletSubPath || '/0/0';
81
+ // Remove leading slash if present
82
+ return walletSubPath.startsWith('/') ? walletSubPath.slice(1) : walletSubPath;
83
+ });
84
+ return new utxolib.bitgo.RootWalletKeys(bip32Keys, derivationPrefixes);
85
+ }
22
86
  //
23
87
  // TransactionBuilder
24
88
  // @params:
@@ -38,6 +102,7 @@ const sdk_core_1 = require("@bitgo-beta/sdk-core");
38
102
  // feeSingleKeySourceAddress: Use this single key address to pay fees
39
103
  // feeSingleKeyWIF: Use the address based on this private key to pay fees
40
104
  // unspentsFetchParams: Extra parameters to use for fetching unspents for this transaction
105
+ // unspents: array of unspent objects to use while constructing the transaction instead of fetching from the API
41
106
  exports.createTransaction = function (params) {
42
107
  const minConfirms = params.minConfirms || 0;
43
108
  const validate = params.validate === undefined ? true : params.validate;
@@ -47,29 +112,29 @@ exports.createTransaction = function (params) {
47
112
  let estTxSize;
48
113
  let travelInfos;
49
114
  // Sanity check the arguments passed in
50
- if (!_.isObject(params.wallet) ||
51
- (params.fee && !_.isNumber(params.fee)) ||
52
- (params.feeRate && !_.isNumber(params.feeRate)) ||
53
- !_.isInteger(minConfirms) ||
54
- (params.forceChangeAtEnd && !_.isBoolean(params.forceChangeAtEnd)) ||
55
- (params.changeAddress && !_.isString(params.changeAddress)) ||
56
- (params.noSplitChange && !_.isBoolean(params.noSplitChange)) ||
57
- (params.targetWalletUnspents && !_.isInteger(params.targetWalletUnspents)) ||
58
- (validate && !_.isBoolean(validate)) ||
59
- (params.enforceMinConfirmsForChange && !_.isBoolean(params.enforceMinConfirmsForChange)) ||
60
- (params.minUnspentSize && !_.isNumber(params.minUnspentSize)) ||
61
- (params.maxFeeRate && !_.isNumber(params.maxFeeRate)) ||
115
+ if (!lodash_1.default.isObject(params.wallet) ||
116
+ (params.fee && !lodash_1.default.isNumber(params.fee)) ||
117
+ (params.feeRate && !lodash_1.default.isNumber(params.feeRate)) ||
118
+ !lodash_1.default.isInteger(minConfirms) ||
119
+ (params.forceChangeAtEnd && !lodash_1.default.isBoolean(params.forceChangeAtEnd)) ||
120
+ (params.changeAddress && !lodash_1.default.isString(params.changeAddress)) ||
121
+ (params.noSplitChange && !lodash_1.default.isBoolean(params.noSplitChange)) ||
122
+ (params.targetWalletUnspents && !lodash_1.default.isInteger(params.targetWalletUnspents)) ||
123
+ (validate && !lodash_1.default.isBoolean(validate)) ||
124
+ (params.enforceMinConfirmsForChange && !lodash_1.default.isBoolean(params.enforceMinConfirmsForChange)) ||
125
+ (params.minUnspentSize && !lodash_1.default.isNumber(params.minUnspentSize)) ||
126
+ (params.maxFeeRate && !lodash_1.default.isNumber(params.maxFeeRate)) ||
62
127
  // this should be an array and its length must be at least 1
63
128
  (params.unspents && (!Array.isArray(params.unspents) || params.unspents.length < 1)) ||
64
- (params.feeTxConfirmTarget && !_.isInteger(params.feeTxConfirmTarget)) ||
65
- (params.instant && !_.isBoolean(params.instant)) ||
66
- (params.bitgoFee && !_.isObject(params.bitgoFee)) ||
67
- (params.unspentsFetchParams && !_.isObject(params.unspentsFetchParams))) {
129
+ (params.feeTxConfirmTarget && !lodash_1.default.isInteger(params.feeTxConfirmTarget)) ||
130
+ (params.instant && !lodash_1.default.isBoolean(params.instant)) ||
131
+ (params.bitgoFee && !lodash_1.default.isObject(params.bitgoFee)) ||
132
+ (params.unspentsFetchParams && !lodash_1.default.isObject(params.unspentsFetchParams))) {
68
133
  throw new Error('invalid argument');
69
134
  }
70
135
  const bitgo = params.wallet.bitgo;
71
136
  const constants = bitgo.getConstants();
72
- const network = sdk_core_1.getNetwork(sdk_core_1.common.Environments[bitgo.getEnv()].network);
137
+ const network = (0, sdk_core_1.getNetwork)(sdk_core_1.common.Environments[bitgo.getEnv()].network);
73
138
  // The user can specify a seperate, single-key wallet for the purposes of paying miner's fees
74
139
  // When creating a transaction this can be specified as an input address or the private key in WIF
75
140
  let feeSingleKeySourceAddress;
@@ -85,7 +150,7 @@ exports.createTransaction = function (params) {
85
150
  }
86
151
  if (params.feeSingleKeyWIF) {
87
152
  const feeSingleKey = utxolib.ECPair.fromWIF(params.feeSingleKeyWIF, network);
88
- feeSingleKeySourceAddress = sdk_core_1.getAddressP2PKH(feeSingleKey);
153
+ feeSingleKeySourceAddress = (0, sdk_core_1.getAddressP2PKH)(feeSingleKey);
89
154
  // If the user specifies both, check to make sure the feeSingleKeySourceAddress corresponds to the address of feeSingleKeyWIF
90
155
  if (params.feeSingleKeySourceAddress && params.feeSingleKeySourceAddress !== feeSingleKeySourceAddress) {
91
156
  throw new Error('feeSingleKeySourceAddress: ' +
@@ -94,23 +159,23 @@ exports.createTransaction = function (params) {
94
159
  feeSingleKeySourceAddress);
95
160
  }
96
161
  }
97
- if (!_.isObject(params.recipients)) {
162
+ if (!lodash_1.default.isObject(params.recipients)) {
98
163
  throw new Error('recipients must be array of { address: abc, amount: 100000 } objects');
99
164
  }
100
165
  let feeParamsDefined = 0;
101
- if (!_.isUndefined(params.fee)) {
166
+ if (!lodash_1.default.isUndefined(params.fee)) {
102
167
  feeParamsDefined++;
103
168
  }
104
- if (!_.isUndefined(params.feeRate)) {
169
+ if (!lodash_1.default.isUndefined(params.feeRate)) {
105
170
  feeParamsDefined++;
106
171
  }
107
- if (!_.isUndefined(params.feeTxConfirmTarget)) {
172
+ if (!lodash_1.default.isUndefined(params.feeTxConfirmTarget)) {
108
173
  feeParamsDefined++;
109
174
  }
110
175
  if (feeParamsDefined > 1) {
111
176
  throw new Error('cannot specify more than one of fee, feeRate and feeTxConfirmTarget');
112
177
  }
113
- if (_.isUndefined(params.maxFeeRate)) {
178
+ if (lodash_1.default.isUndefined(params.maxFeeRate)) {
114
179
  params.maxFeeRate = constants.maxFeeRate;
115
180
  }
116
181
  // Convert the old format of params.recipients (dictionary of address:amount) to new format: { destinationAddress, amount }
@@ -142,14 +207,11 @@ exports.createTransaction = function (params) {
142
207
  let fee = params.fee;
143
208
  let feeRate = params.feeRate;
144
209
  // Flag indicating whether this class will compute the fee
145
- const shouldComputeBestFee = _.isUndefined(fee);
210
+ const shouldComputeBestFee = lodash_1.default.isUndefined(fee);
146
211
  let totalOutputAmount = 0;
147
212
  recipients.forEach(function (recipient) {
148
- if (_.isString(recipient.address)) {
149
- try {
150
- utxolib.address.fromBase58Check(recipient.address, network);
151
- }
152
- catch (e) {
213
+ if (lodash_1.default.isString(recipient.address)) {
214
+ if (!(0, verifyAddress_1.verifyAddress)(recipient.address, network)) {
153
215
  throw new Error('invalid bitcoin address: ' + recipient.address);
154
216
  }
155
217
  if (!!recipient.script) {
@@ -159,7 +221,7 @@ exports.createTransaction = function (params) {
159
221
  }
160
222
  }
161
223
  }
162
- if (!_.isInteger(recipient.amount) || recipient.amount < 0) {
224
+ if (!lodash_1.default.isInteger(recipient.amount) || recipient.amount < 0) {
163
225
  throw new Error('invalid amount for ' + recipient.address + ': ' + recipient.amount);
164
226
  }
165
227
  totalOutputAmount += recipient.amount;
@@ -168,7 +230,7 @@ exports.createTransaction = function (params) {
168
230
  totalOutputAmount += opReturn.amount;
169
231
  });
170
232
  let bitgoFeeInfo = params.bitgoFee;
171
- if (bitgoFeeInfo && (!_.isInteger(bitgoFeeInfo.amount) || !_.isString(bitgoFeeInfo.address))) {
233
+ if (bitgoFeeInfo && (!lodash_1.default.isInteger(bitgoFeeInfo.amount) || !lodash_1.default.isString(bitgoFeeInfo.address))) {
172
234
  throw new Error('invalid bitgoFeeInfo');
173
235
  }
174
236
  // The total amount needed for this transaction.
@@ -184,11 +246,13 @@ exports.createTransaction = function (params) {
184
246
  // The sum of the input values for this transaction.
185
247
  let inputAmount;
186
248
  let changeOutputs = [];
249
+ // All outputs for the transaction (recipients, OP_RETURNs, change, fees)
250
+ let outputs = [];
187
251
  let containsUncompressedPublicKeys = false;
188
252
  // The transaction.
189
253
  let transaction = utxolib.bitgo.createTransactionBuilderForNetwork(network);
190
254
  const getBitGoFee = function () {
191
- return Bluebird.try(function () {
255
+ return (0, util_1.tryPromise)(function () {
192
256
  if (bitgoFeeInfo) {
193
257
  return;
194
258
  }
@@ -206,7 +270,7 @@ exports.createTransaction = function (params) {
206
270
  });
207
271
  };
208
272
  const getBitGoFeeAddress = function () {
209
- return Bluebird.try(function () {
273
+ return (0, util_1.tryPromise)(function () {
210
274
  // If we don't have bitgoFeeInfo, or address is already set, don't get a new one
211
275
  if (!bitgoFeeInfo || bitgoFeeInfo.address) {
212
276
  return;
@@ -254,14 +318,14 @@ exports.createTransaction = function (params) {
254
318
  })
255
319
  .catch(function (e) {
256
320
  // sanity check failed on tx size
257
- if (_.includes(e.message, 'invalid txSize')) {
258
- return Bluebird.reject(e);
321
+ if (lodash_1.default.includes(e.message, 'invalid txSize')) {
322
+ return Promise.reject(e);
259
323
  }
260
324
  else {
261
325
  // couldn't estimate the fee, proceed using the default
262
326
  feeRate = constants.fallbackFeeRate;
263
327
  console.log('Error estimating fee for send from ' + params.wallet.id() + ': ' + e.message);
264
- return Bluebird.resolve();
328
+ return Promise.resolve();
265
329
  }
266
330
  });
267
331
  }
@@ -274,10 +338,10 @@ exports.createTransaction = function (params) {
274
338
  return;
275
339
  }
276
340
  // Get enough unspents for the requested amount
277
- const options = _.merge({}, params.unspentsFetchParams || {}, {
341
+ const options = lodash_1.default.merge({}, params.unspentsFetchParams || {}, {
278
342
  target: totalAmount,
279
343
  minSize: params.minUnspentSize || 0,
280
- instant: params.instant,
344
+ instant: params.instant, // insist on instant unspents only
281
345
  targetWalletUnspents: params.targetWalletUnspents,
282
346
  });
283
347
  if (params.instant) {
@@ -299,7 +363,7 @@ exports.createTransaction = function (params) {
299
363
  throw Error('0 unspents available for transaction creation');
300
364
  }
301
365
  // create array of unconfirmed unspent ID strings of the form "txHash:outputIndex"
302
- zeroConfUnspentTxIds = _(results.unspents)
366
+ zeroConfUnspentTxIds = (0, lodash_1.default)(results.unspents)
303
367
  .filter(function (u) {
304
368
  return !u.confirmations;
305
369
  })
@@ -307,7 +371,7 @@ exports.createTransaction = function (params) {
307
371
  return u.tx_hash + ':' + u.tx_output_n;
308
372
  })
309
373
  .value();
310
- if (_.isEmpty(zeroConfUnspentTxIds)) {
374
+ if (lodash_1.default.isEmpty(zeroConfUnspentTxIds)) {
311
375
  // we don't want to pass an empty array of inputs to the server, because it assumes if the
312
376
  // inputs arguments exists, it contains values
313
377
  zeroConfUnspentTxIds = undefined;
@@ -347,9 +411,9 @@ exports.createTransaction = function (params) {
347
411
  }
348
412
  inputAmount = 0;
349
413
  // Calculate the cost of spending a single input, i.e. the smallest economical unspent value
350
- return Bluebird.try(function () {
351
- if (_.isNumber(params.feeRate) || _.isNumber(params.originalFeeRate)) {
352
- return !_.isUndefined(params.feeRate) ? params.feeRate : params.originalFeeRate;
414
+ return (0, util_1.tryPromise)(function () {
415
+ if (lodash_1.default.isNumber(params.feeRate) || lodash_1.default.isNumber(params.originalFeeRate)) {
416
+ return !lodash_1.default.isUndefined(params.feeRate) ? params.feeRate : params.originalFeeRate;
353
417
  }
354
418
  else {
355
419
  return bitgo
@@ -365,12 +429,12 @@ exports.createTransaction = function (params) {
365
429
  .then(function (feeRate) {
366
430
  // Don't spend inputs that cannot pay for their own cost.
367
431
  let minInputValue = 0;
368
- if (_.isInteger(params.minUnspentSize)) {
432
+ if (lodash_1.default.isInteger(params.minUnspentSize)) {
369
433
  minInputValue = params.minUnspentSize;
370
434
  }
371
435
  let prunedUnspentCount = 0;
372
436
  const originalUnspentCount = unspents.length;
373
- unspents = _.filter(unspents, function (unspent) {
437
+ unspents = lodash_1.default.filter(unspents, function (unspent) {
374
438
  const isSegwitInput = !!unspent.witnessScript;
375
439
  const currentInputSize = isSegwitInput ? unspents_1.VirtualSizes.txP2shP2wshInputSize : unspents_1.VirtualSizes.txP2shInputSize;
376
440
  const feeBasedMinInputValue = (feeRate * currentInputSize) / 1000;
@@ -385,14 +449,14 @@ exports.createTransaction = function (params) {
385
449
  inputSize: currentInputSize,
386
450
  unspent: unspent,
387
451
  };
388
- console.log(`pruning unspent: ${JSON.stringify(pruneDetails, null, 4)}`);
452
+ debug(`pruning unspent: ${JSON.stringify(pruneDetails, null, 4)}`);
389
453
  prunedUnspentCount++;
390
454
  return false;
391
455
  }
392
456
  return true;
393
457
  });
394
458
  if (prunedUnspentCount > 0) {
395
- console.log(`pruned ${prunedUnspentCount} out of ${originalUnspentCount} unspents`);
459
+ debug(`pruned ${prunedUnspentCount} out of ${originalUnspentCount} unspents`);
396
460
  }
397
461
  if (unspents.length === 0) {
398
462
  throw new Error('insufficient funds');
@@ -455,7 +519,7 @@ exports.createTransaction = function (params) {
455
519
  });
456
520
  if (shouldComputeBestFee) {
457
521
  const approximateFee = minerFeeInfo.fee;
458
- const shouldRecurse = _.isUndefined(fee) || approximateFee > fee;
522
+ const shouldRecurse = lodash_1.default.isUndefined(fee) || approximateFee > fee;
459
523
  fee = approximateFee;
460
524
  // Recompute totalAmount from scratch
461
525
  totalAmount = fee + totalOutputAmount;
@@ -471,7 +535,7 @@ exports.createTransaction = function (params) {
471
535
  }
472
536
  const totalFee = fee + (bitgoFeeInfo ? bitgoFeeInfo.amount : 0);
473
537
  if (feeSingleKeySourceAddress) {
474
- const summedSingleKeyUnspents = _.sumBy(feeSingleKeyUnspents, 'value');
538
+ const summedSingleKeyUnspents = lodash_1.default.sumBy(feeSingleKeyUnspents, 'value');
475
539
  if (totalFee > summedSingleKeyUnspents) {
476
540
  const err = new Error('Insufficient fee amount available in single key fee source: ' + summedSingleKeyUnspents);
477
541
  err.result = {
@@ -482,7 +546,7 @@ exports.createTransaction = function (params) {
482
546
  bitgoFee: bitgoFeeInfo,
483
547
  txInfo: txInfo,
484
548
  };
485
- return Bluebird.reject(err);
549
+ return Promise.reject(err);
486
550
  }
487
551
  }
488
552
  if (inputAmount < (feeSingleKeySourceAddress ? totalOutputAmount : totalAmount)) {
@@ -510,7 +574,7 @@ exports.createTransaction = function (params) {
510
574
  bitgoFee: bitgoFeeInfo,
511
575
  txInfo: txInfo,
512
576
  };
513
- return Bluebird.reject(err);
577
+ return Promise.reject(err);
514
578
  }
515
579
  });
516
580
  };
@@ -519,13 +583,14 @@ exports.createTransaction = function (params) {
519
583
  if (minerFeeInfo.size >= 90000) {
520
584
  throw new Error('transaction too large: estimated size ' + minerFeeInfo.size + ' bytes');
521
585
  }
522
- const outputs = [];
586
+ // Reset outputs array (use outer scope variable)
587
+ outputs = [];
523
588
  recipients.forEach(function (recipient) {
524
589
  let script;
525
- if (_.isString(recipient.address)) {
590
+ if (lodash_1.default.isString(recipient.address)) {
526
591
  script = utxolib.address.toOutputScript(recipient.address, network);
527
592
  }
528
- else if (_.isObject(recipient.script)) {
593
+ else if (lodash_1.default.isObject(recipient.script)) {
529
594
  script = recipient.script;
530
595
  }
531
596
  else {
@@ -533,7 +598,7 @@ exports.createTransaction = function (params) {
533
598
  }
534
599
  // validate travelInfo if it exists
535
600
  let travelInfo;
536
- if (!_.isEmpty(recipient.travelInfo)) {
601
+ if (!lodash_1.default.isEmpty(recipient.travelInfo)) {
537
602
  travelInfo = recipient.travelInfo;
538
603
  // Better to avoid trouble now, before tx is created
539
604
  bitgo.travelRule().validateTravelInfo(travelInfo);
@@ -571,7 +636,7 @@ exports.createTransaction = function (params) {
571
636
  return result;
572
637
  });
573
638
  }
574
- let extraChangeTotal = _.sum(extraChangeAmounts);
639
+ let extraChangeTotal = lodash_1.default.sum(extraChangeAmounts);
575
640
  // Sanity check
576
641
  if (extraChangeTotal > changeAmount) {
577
642
  extraChangeAmounts = [];
@@ -586,7 +651,7 @@ exports.createTransaction = function (params) {
586
651
  if (!thisAmount) {
587
652
  return result;
588
653
  }
589
- return Bluebird.try(function () {
654
+ return (0, util_1.tryPromise)(function () {
590
655
  if (params.changeAddress) {
591
656
  // If user passed a change address, use it for all outputs
592
657
  return params.changeAddress;
@@ -607,7 +672,7 @@ exports.createTransaction = function (params) {
607
672
  return addChangeOutputs();
608
673
  };
609
674
  // Add change output(s) and instant fee output if applicable
610
- return Bluebird.try(function () {
675
+ return (0, util_1.tryPromise)(function () {
611
676
  return getChangeOutputs(inputAmount - totalAmount);
612
677
  }).then(function (result) {
613
678
  changeOutputs = result;
@@ -620,14 +685,14 @@ exports.createTransaction = function (params) {
620
685
  output.script = utxolib.address.toOutputScript(output.address, network);
621
686
  }
622
687
  // decide where to put the outputs - default is to randomize unless forced to end
623
- const outputIndex = params.forceChangeAtEnd ? outputs.length : _.random(0, outputs.length);
688
+ const outputIndex = params.forceChangeAtEnd ? outputs.length : lodash_1.default.random(0, outputs.length);
624
689
  outputs.splice(outputIndex, 0, output);
625
690
  });
626
691
  // Add all outputs to the transaction
627
692
  outputs.forEach(function (output) {
628
693
  transaction.addOutput(output.script, output.amount);
629
694
  });
630
- travelInfos = _(outputs)
695
+ travelInfos = (0, lodash_1.default)(outputs)
631
696
  .map(function (output, index) {
632
697
  const result = output.travelInfo;
633
698
  if (!result) {
@@ -640,14 +705,71 @@ exports.createTransaction = function (params) {
640
705
  .value();
641
706
  });
642
707
  };
708
+ // Build PSBT with all signing metadata embedded
709
+ const buildPsbt = function () {
710
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
711
+ // Need wallet keychains for PSBT metadata
712
+ const walletKeychains = params.wallet.keychains;
713
+ if (!walletKeychains || walletKeychains.length !== 3) {
714
+ throw new Error('Wallet keychains required for PSBT format');
715
+ }
716
+ const rootWalletKeys = createRootWalletKeysFromV1Keychains(walletKeychains);
717
+ utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
718
+ // Add multisig inputs with PSBT metadata
719
+ for (const unspent of unspents) {
720
+ const { chain, index } = parseChainPath(unspent.chainPath);
721
+ const walletUnspent = {
722
+ id: `${unspent.tx_hash}:${unspent.tx_output_n}`,
723
+ address: unspent.address,
724
+ chain,
725
+ index,
726
+ value: BigInt(unspent.value),
727
+ };
728
+ utxolib.bitgo.addWalletUnspentToPsbt(psbt, walletUnspent, rootWalletKeys, 'user', 'backup', {
729
+ skipNonWitnessUtxo: true,
730
+ });
731
+ }
732
+ // Fee single key inputs are not supported with PSBT yet - throw to trigger fallback to legacy
733
+ if (feeSingleKeyUnspentsUsed.length > 0) {
734
+ throw new Error('PSBT does not support feeSingleKey inputs - use legacy transaction format');
735
+ }
736
+ // Add outputs (recipients, change, fees, OP_RETURNs) - already calculated in outputs array
737
+ for (const output of outputs) {
738
+ psbt.addOutput({
739
+ script: output.script,
740
+ value: BigInt(output.amount),
741
+ });
742
+ }
743
+ return psbt;
744
+ };
643
745
  // Serialize the transaction, returning what is needed to sign it
644
746
  const serialize = function () {
747
+ // Build and return PSBT format when usePsbt is explicitly true
748
+ // PSBT hex is returned in transactionHex field for backward compatibility
749
+ // Use utxolib.bitgo.isPsbt() to detect if transactionHex contains PSBT or legacy tx
750
+ if (params.usePsbt === true) {
751
+ const psbt = buildPsbt();
752
+ return {
753
+ transactionHex: psbt.toHex(),
754
+ fee: fee,
755
+ changeAddresses: changeOutputs.map(function (co) {
756
+ return lodash_1.default.pick(co, ['address', 'path', 'amount']);
757
+ }),
758
+ walletId: params.wallet.id(),
759
+ feeRate: feeRate,
760
+ instant: params.instant,
761
+ bitgoFee: bitgoFeeInfo,
762
+ estimatedSize: minerFeeInfo.size,
763
+ travelInfos: travelInfos,
764
+ };
765
+ }
766
+ // Legacy format: return transactionHex with separate unspents array
645
767
  // only need to return the unspents that were used and just the chainPath, redeemScript, and instant flag
646
- const pickedUnspents = _.map(unspents, function (unspent) {
647
- return _.pick(unspent, ['chainPath', 'redeemScript', 'instant', 'witnessScript', 'script', 'value']);
768
+ const pickedUnspents = lodash_1.default.map(unspents, function (unspent) {
769
+ return lodash_1.default.pick(unspent, ['chainPath', 'redeemScript', 'instant', 'witnessScript', 'script', 'value']);
648
770
  });
649
- const prunedUnspents = _.slice(pickedUnspents, 0, transaction.tx.ins.length - feeSingleKeyUnspentsUsed.length);
650
- _.each(feeSingleKeyUnspentsUsed, function (feeUnspent) {
771
+ const prunedUnspents = lodash_1.default.slice(pickedUnspents, 0, transaction.tx.ins.length - feeSingleKeyUnspentsUsed.length);
772
+ lodash_1.default.each(feeSingleKeyUnspentsUsed, function (feeUnspent) {
651
773
  prunedUnspents.push({ redeemScript: false, chainPath: false }); // mark as false to signify a non-multisig address
652
774
  });
653
775
  const result = {
@@ -655,7 +777,7 @@ exports.createTransaction = function (params) {
655
777
  unspents: prunedUnspents,
656
778
  fee: fee,
657
779
  changeAddresses: changeOutputs.map(function (co) {
658
- return _.pick(co, ['address', 'path', 'amount']);
780
+ return lodash_1.default.pick(co, ['address', 'path', 'amount']);
659
781
  }),
660
782
  walletId: params.wallet.id(),
661
783
  walletKeychains: params.wallet.keychains,
@@ -668,15 +790,15 @@ exports.createTransaction = function (params) {
668
790
  };
669
791
  // Add for backwards compatibility
670
792
  if (result.instant && bitgoFeeInfo) {
671
- result.instantFee = _.pick(bitgoFeeInfo, ['amount', 'address']);
793
+ result.instantFee = lodash_1.default.pick(bitgoFeeInfo, ['amount', 'address']);
672
794
  }
673
795
  return result;
674
796
  };
675
- return Bluebird.try(function () {
797
+ return (0, util_1.tryPromise)(function () {
676
798
  return getBitGoFee();
677
799
  })
678
800
  .then(function () {
679
- return Bluebird.all([getBitGoFeeAddress(), getUnspents(), getUnspentsForSingleKey()]);
801
+ return Promise.all([getBitGoFeeAddress(), getUnspents(), getUnspentsForSingleKey()]);
680
802
  })
681
803
  .then(collectInputs)
682
804
  .then(collectOutputs)
@@ -694,19 +816,19 @@ exports.createTransaction = function (params) {
694
816
  * @returns size: estimated size of the transaction in bytes
695
817
  */
696
818
  const estimateTransactionSize = function (params) {
697
- if (!_.isInteger(params.nP2shInputs) || params.nP2shInputs < 0) {
819
+ if (!lodash_1.default.isInteger(params.nP2shInputs) || params.nP2shInputs < 0) {
698
820
  throw new Error('expecting positive nP2shInputs');
699
821
  }
700
- if (!_.isInteger(params.nP2pkhInputs) || params.nP2pkhInputs < 0) {
822
+ if (!lodash_1.default.isInteger(params.nP2pkhInputs) || params.nP2pkhInputs < 0) {
701
823
  throw new Error('expecting positive nP2pkhInputs to be numeric');
702
824
  }
703
- if (!_.isInteger(params.nP2shP2wshInputs) || params.nP2shP2wshInputs < 0) {
825
+ if (!lodash_1.default.isInteger(params.nP2shP2wshInputs) || params.nP2shP2wshInputs < 0) {
704
826
  throw new Error('expecting positive nP2shP2wshInputs to be numeric');
705
827
  }
706
828
  if (params.nP2shInputs + params.nP2shP2wshInputs < 1) {
707
829
  throw new Error('expecting at least one nP2shInputs or nP2shP2wshInputs');
708
830
  }
709
- if (!_.isInteger(params.nOutputs) || params.nOutputs < 1) {
831
+ if (!lodash_1.default.isInteger(params.nOutputs) || params.nOutputs < 1) {
710
832
  throw new Error('expecting positive nOutputs');
711
833
  }
712
834
  // The size of an uncompressed public key is 32 bytes more than the compressed key,
@@ -771,19 +893,19 @@ exports.signTransaction = function (params) {
771
893
  let keychain = params.keychain; // duplicate so as to not mutate below
772
894
  const validate = params.validate === undefined ? true : params.validate;
773
895
  let privKey;
774
- if (!_.isString(params.transactionHex)) {
896
+ if (!lodash_1.default.isString(params.transactionHex)) {
775
897
  throw new Error('expecting the transaction hex as a string');
776
898
  }
777
899
  if (!Array.isArray(params.unspents)) {
778
900
  throw new Error('expecting the unspents array');
779
901
  }
780
- if (!_.isBoolean(validate)) {
902
+ if (!lodash_1.default.isBoolean(validate)) {
781
903
  throw new Error('expecting validate to be a boolean');
782
904
  }
783
- let network = sdk_core_1.getNetwork();
784
- const enableBCH = _.isBoolean(params.forceBCH) && params.forceBCH === true;
785
- if (!_.isObject(keychain) || !_.isString(keychain.xprv)) {
786
- if (_.isString(params.signingKey)) {
905
+ let network = (0, sdk_core_1.getNetwork)();
906
+ const enableBCH = lodash_1.default.isBoolean(params.forceBCH) && params.forceBCH === true;
907
+ if (!lodash_1.default.isObject(keychain) || !lodash_1.default.isString(keychain.xprv)) {
908
+ if (lodash_1.default.isString(params.signingKey)) {
787
909
  privKey = utxolib.ECPair.fromWIF(params.signingKey, network);
788
910
  keychain = undefined;
789
911
  }
@@ -806,12 +928,12 @@ exports.signTransaction = function (params) {
806
928
  throw new Error('length of unspents array should equal to the number of transaction inputs');
807
929
  }
808
930
  // decorate transaction with input values for TransactionBuilder instantiation
809
- const isUtxoTx = _.isObject(transaction) && Array.isArray(transaction.ins);
810
- const areValidUnspents = _.isObject(params) && Array.isArray(params.unspents);
931
+ const isUtxoTx = lodash_1.default.isObject(transaction) && Array.isArray(transaction.ins);
932
+ const areValidUnspents = lodash_1.default.isObject(params) && Array.isArray(params.unspents);
811
933
  if (isUtxoTx && areValidUnspents) {
812
934
  // extend the transaction inputs with the values
813
- const inputValues = _.map(params.unspents, (u) => _.pick(u, 'value'));
814
- transaction.ins.map((currentItem, index) => _.extend(currentItem, inputValues[index]));
935
+ const inputValues = lodash_1.default.map(params.unspents, (u) => lodash_1.default.pick(u, 'value'));
936
+ transaction.ins.map((currentItem, index) => lodash_1.default.extend(currentItem, inputValues[index]));
815
937
  }
816
938
  let rootExtKey;
817
939
  if (keychain) {
@@ -837,7 +959,7 @@ exports.signTransaction = function (params) {
837
959
  const chainPath = currentUnspent.chainPath;
838
960
  if (rootExtKey) {
839
961
  const { walletSubPath = '/0/0' } = keychain;
840
- const path = sdk_core_1.sanitizeLegacyPath(keychain.path + walletSubPath + chainPath);
962
+ const path = (0, sdk_core_1.sanitizeLegacyPath)(keychain.path + walletSubPath + chainPath);
841
963
  debug('derived user key path "%s" using keychain path "%s", walletSubPath "%s", keychain walletSubPath "%s" and chainPath "%s"', path, keychain.path, walletSubPath, keychain.walletSubPath, chainPath);
842
964
  privKey = rootExtKey.derivePath(path);
843
965
  }
@@ -854,12 +976,13 @@ exports.signTransaction = function (params) {
854
976
  const witnessScript = currentUnspent.witnessScript ? Buffer.from(currentUnspent.witnessScript, 'hex') : undefined;
855
977
  const sigHash = utxolib.bitgo.getDefaultSigHash(network);
856
978
  txb.sign(index, privKey, subscript, sigHash, currentUnspent.value, witnessScript);
979
+ debug(`Signed transaction input ${index}`);
857
980
  }
858
981
  catch (e) {
859
982
  // try fallback derivation path (see BG-46497)
860
983
  let fallbackSigningSuccessful = false;
861
984
  try {
862
- const fallbackPath = sdk_core_1.sanitizeLegacyPath(keychain.path + chainPath);
985
+ const fallbackPath = (0, sdk_core_1.sanitizeLegacyPath)(keychain.path + chainPath);
863
986
  debug('derived fallback user key path "%s" using keychain path "%s" and chainPath "%s"', fallbackPath, keychain.path, chainPath);
864
987
  privKey = rootExtKey.derivePath(fallbackPath);
865
988
  const witnessScript = currentUnspent.witnessScript
@@ -879,7 +1002,7 @@ exports.signTransaction = function (params) {
879
1002
  };
880
1003
  e.message = `Failed to sign input #${index} - ${e.message} - ${JSON.stringify(e.result, null, 4)} - \n${e.stack}`;
881
1004
  debug('input sign failed: %s', e.message);
882
- return Bluebird.reject(e);
1005
+ return Promise.reject(e);
883
1006
  }
884
1007
  }
885
1008
  }
@@ -889,6 +1012,7 @@ exports.signTransaction = function (params) {
889
1012
  const signatureCount = utxolib.bitgo
890
1013
  .getSignatureVerifications(partialTransaction, index, params.unspents[index].value)
891
1014
  .filter((v) => v.signedBy !== undefined).length;
1015
+ debug(`Signature count for input ${index}: ${signatureCount}`);
892
1016
  if (signatureCount < 1) {
893
1017
  throw new Error('expected at least one valid signature');
894
1018
  }
@@ -897,8 +1021,8 @@ exports.signTransaction = function (params) {
897
1021
  }
898
1022
  });
899
1023
  }
900
- return Bluebird.resolve({
1024
+ return Promise.resolve({
901
1025
  transactionHex: partialTransaction.toHex(),
902
1026
  });
903
1027
  };
904
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixxQkFBcUI7QUFDckIsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLG1EQUE2QztBQUM3QyxxQ0FBcUM7QUFDckMsZ0RBQWdEO0FBQ2hELDRCQUE0QjtBQUM1QixtREFBb0Q7QUFDcEQsa0NBQW1DO0FBQ25DLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2QyxtREFBK0Y7QUF1Qi9GLEVBQUU7QUFDRixxQkFBcUI7QUFDckIsV0FBVztBQUNYLDBDQUEwQztBQUMxQyw4TUFBOE07QUFDOU0sc0dBQXNHO0FBQ3RHLGtJQUFrSTtBQUNsSSw2SEFBNkg7QUFDN0gsdUdBQXVHO0FBQ3ZHLCtFQUErRTtBQUMvRSxxRUFBcUU7QUFDckUsNkVBQTZFO0FBQzdFLHdHQUF3RztBQUN4RyxpSUFBaUk7QUFDakksd0lBQXdJO0FBQ3hJLDRJQUE0STtBQUM1SSx1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDRGQUE0RjtBQUM1RixPQUFPLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxNQUFNO0lBQzFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDeEUsSUFBSSxVQUFVLEdBQTZFLEVBQUUsQ0FBQztJQUM5RixJQUFJLFNBQVMsR0FBMEMsRUFBRSxDQUFDO0lBQzFELElBQUksa0JBQWtCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLElB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QUFDLENBQUM7YUFDMUQ7WUFDRCxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7YUFDakY7UUFDSCxDQUFDLENBQUMsQ0FBQztLQUNKO0lBRUQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3RCLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7S0FDM0MsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBUcmFuc2FjdGlvbkJ1aWxkZXJcbi8vIEEgdXRpbGl0eSBmb3IgYnVpbGRpbmcgYW5kIHNpZ25pbmcgdHJhbnNhY3Rpb25zXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cblxuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyBCbHVlYmlyZCBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFZpcnR1YWxTaXplcyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcbmltcG9ydCBkZWJ1Z0xpYiA9IHJlcXVpcmUoJ2RlYnVnJyk7XG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2MTp0eGInKTtcbmltcG9ydCB7IGNvbW1vbiwgZ2V0QWRkcmVzc1AyUEtILCBnZXROZXR3b3JrLCBzYW5pdGl6ZUxlZ2FjeVBhdGggfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmludGVyZmFjZSBCYXNlT3V0cHV0IHtcbiAgYW1vdW50OiBudW1iZXI7XG4gIHRyYXZlbEluZm8/OiBhbnk7XG59XG5cbmludGVyZmFjZSBBZGRyZXNzT3V0cHV0IGV4dGVuZHMgQmFzZU91dHB1dCB7XG4gIGFkZHJlc3M6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFNjcmlwdE91dHB1dCBleHRlbmRzIEJhc2VPdXRwdXQge1xuICBzY3JpcHQ6IEJ1ZmZlcjtcbn1cblxudHlwZSBPdXRwdXQgPSBBZGRyZXNzT3V0cHV0IHwgU2NyaXB0T3V0cHV0O1xuXG5pbnRlcmZhY2UgQml0R29VbnNwZW50IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdHhfaGFzaDogQnVmZmVyO1xuICB0eF9vdXRwdXRfbjogbnVtYmVyO1xufVxuXG4vL1xuLy8gVHJhbnNhY3Rpb25CdWlsZGVyXG4vLyBAcGFyYW1zOlxuLy8gICB3YWxsZXQ6ICBhIHdhbGxldCBvYmplY3QgdG8gc2VuZCBmcm9tXG4vLyAgIHJlY2lwaWVudHM6IGFycmF5IG9mIHJlY2lwaWVudCBvYmplY3RzIGFuZCB0aGUgYW1vdW50IHRvIHNlbmQgdG8gZWFjaCBlLmcuIFt7YWRkcmVzczogJzM4QktETlpiUGNMb2d2VmJjeDJla0o5RTZWdjk0RHFEcXcnLCBhbW91bnQ6IDE1MDB9LCB7YWRkcmVzczogJzM2ZUw4eVFxQ24xSE1SbVZGRm80OXQyUEozcGFpOHdRYW0nLCBhbW91bnQ6IDIwMDB9XVxuLy8gICBmZWU6IHRoZSBmZWUgdG8gdXNlIHdpdGggdGhpcyB0cmFuc2FjdGlvbi4gIGlmIG5vdCBwcm92aWRlZCwgYSBkZWZhdWx0LCBtaW5pbXVtIGZlZSB3aWxsIGJlIHVzZWQuXG4vLyAgIGZlZVJhdGU6IHRoZSBhbW91bnQgb2YgZmVlIHBlciBraWxvYnl0ZSAtIG9wdGlvbmFsIC0gc3BlY2lmeSBlaXRoZXIgZmVlLCBmZWVSYXRlLCBvciBmZWVUeENvbmZpcm1UYXJnZXQgYnV0IG5vdCBtb3JlIHRoYW4gb25lXG4vLyAgIGZlZVR4Q29uZmlybVRhcmdldDogY2FsY3VsYXRlIHRoZSBmZWVzIHBlciBraWxvYnl0ZSBzdWNoIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgY29uZmlybWVkIGluIHRoaXMgbnVtYmVyIG9mIGJsb2Nrc1xuLy8gICBtYXhGZWVSYXRlOiBUaGUgbWF4aW11bSBmZWUgcGVyIGtiIHRvIHVzZSBpbiBzYXRvc2hpcywgZm9yIHNhZmV0eSBwdXJwb3NlcyB3aGVuIHVzaW5nIGR5bmFtaWMgZmVlc1xuLy8gICBtaW5Db25maXJtczogdGhlIG1pbmltdW0gY29uZmlybWF0aW9ucyBhbiBvdXRwdXQgbXVzdCBoYXZlIGJlZm9yZSBzcGVuZGluZ1xuLy8gICBmb3JjZUNoYW5nZUF0RW5kOiBmb3JjZSB0aGUgY2hhbmdlIGFkZHJlc3MgdG8gYmUgdGhlIGxhc3Qgb3V0cHV0XG4vLyAgIGNoYW5nZUFkZHJlc3M6IHNwZWNpZnkgdGhlIGNoYW5nZSBhZGRyZXNzIHJhdGhlciB0aGFuIGdlbmVyYXRlIGEgbmV3IG9uZVxuLy8gICBub1NwbGl0Q2hhbmdlOiBzZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpYyBjaGFuZ2Ugc3BsaXR0aW5nIGZvciBwdXJwb3NlcyBvZiB1bnNwZW50IG1hbmFnZW1lbnRcbi8vICAgdGFyZ2V0V2FsbGV0VW5zcGVudHM6IHNwZWNpZnkgYSBudW1iZXIgb2YgdGFyZ2V0IHVuc3BlbnRzIHRvIG1haW50YWluIGluIHRoZSB3YWxsZXQgKGN1cnJlbnRseSBkZWZhdWx0ZWQgdG8gOCBieSB0aGUgc2VydmVyKVxuLy8gICB2YWxpZGF0ZTogZXh0cmEgdmVyaWZpY2F0aW9uIG9mIHRoZSBjaGFuZ2UgYWRkcmVzc2VzLCB3aGljaCBpcyBhbHdheXMgZG9uZSBzZXJ2ZXItc2lkZSBhbmQgaXMgcmVkdW5kYW50IGNsaWVudC1zaWRlIChkZWZhdWx0cyB0cnVlKVxuLy8gICBtaW5VbnNwZW50U2l6ZTogVGhlIG1pbmltdW0gc2l6ZSBpbiBzYXRvc2hpcyBvZiB1bnNwZW50IHRvIHVzZSAodG8gcHJldmVudCBzcGVuZGluZyB1bnNwZW50cyB3b3J0aCBsZXNzIHRoYW4gZmVlIGFkZGVkKS4gRGVmYXVsdHMgdG8gMC5cbi8vICAgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzczogVXNlIHRoaXMgc2luZ2xlIGtleSBhZGRyZXNzIHRvIHBheSBmZWVzXG4vLyAgIGZlZVNpbmdsZUtleVdJRjogVXNlIHRoZSBhZGRyZXNzIGJhc2VkIG9uIHRoaXMgcHJpdmF0ZSBrZXkgdG8gcGF5IGZlZXNcbi8vICAgdW5zcGVudHNGZXRjaFBhcmFtczogRXh0cmEgcGFyYW1ldGVycyB0byB1c2UgZm9yIGZldGNoaW5nIHVuc3BlbnRzIGZvciB0aGlzIHRyYW5zYWN0aW9uXG5leHBvcnRzLmNyZWF0ZVRyYW5zYWN0aW9uID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb25zdCBtaW5Db25maXJtcyA9IHBhcmFtcy5taW5Db25maXJtcyB8fCAwO1xuICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcbiAgbGV0IHJlY2lwaWVudHM6IHsgYWRkcmVzczogc3RyaW5nOyBhbW91bnQ6IG51bWJlcjsgc2NyaXB0Pzogc3RyaW5nOyB0cmF2ZWxJbmZvPzogYW55IH1bXSA9IFtdO1xuICBsZXQgb3BSZXR1cm5zOiB7IG1lc3NhZ2U6IHN0cmluZzsgYW1vdW50OiBudW1iZXIgfVtdID0gW107XG4gIGxldCBleHRyYUNoYW5nZUFtb3VudHM6IG51bWJlcltdID0gW107XG4gIGxldCBlc3RUeFNpemU6IG51bWJlcjtcbiAgbGV0IHRyYXZlbEluZm9zO1xuXG4gIC8vIFNhbml0eSBjaGVjayB0aGUgYXJndW1lbnRzIHBhc3NlZCBpblxuICBpZiAoXG4gICAgIV8uaXNPYmplY3QocGFyYW1zLndhbGxldCkgfHxcbiAgICAocGFyYW1zLmZlZSAmJiAhXy5pc051bWJlcihwYXJhbXMuZmVlKSkgfHxcbiAgICAocGFyYW1zLmZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpKSB8fFxuICAgICFfLmlzSW50ZWdlcihtaW5Db25maXJtcykgfHxcbiAgICAocGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kKSkgfHxcbiAgICAocGFyYW1zLmNoYW5nZUFkZHJlc3MgJiYgIV8uaXNTdHJpbmcocGFyYW1zLmNoYW5nZUFkZHJlc3MpKSB8fFxuICAgIChwYXJhbXMubm9TcGxpdENoYW5nZSAmJiAhXy5pc0Jvb2xlYW4ocGFyYW1zLm5vU3BsaXRDaGFuZ2UpKSB8fFxuICAgIChwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMgJiYgIV8uaXNJbnRlZ2VyKHBhcmFtcy50YXJnZXRXYWxsZXRVbnNwZW50cykpIHx8XG4gICAgKHZhbGlkYXRlICYmICFfLmlzQm9vbGVhbih2YWxpZGF0ZSkpIHx8XG4gICAgKHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5lbmZvcmNlTWluQ29uZmlybXNGb3JDaGFuZ2UpKSB8fFxuICAgIChwYXJhbXMubWluVW5zcGVudFNpemUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1pblVuc3BlbnRTaXplKSkgfHxcbiAgICAocGFyYW1zLm1heEZlZVJhdGUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLm1heEZlZVJhdGUpKSB8fFxuICAgIC8vIHRoaXMgc2hvdWxkIGJlIGFuIGFycmF5IGFuZCBpdHMgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgMVxuICAgIChwYXJhbXMudW5zcGVudHMgJiYgKCFBcnJheS5pc0FycmF5KHBhcmFtcy51bnNwZW50cykgfHwgcGFyYW1zLnVuc3BlbnRzLmxlbmd0aCA8IDEpKSB8fFxuICAgIChwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0ICYmICFfLmlzSW50ZWdlcihwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0KSkgfHxcbiAgICAocGFyYW1zLmluc3RhbnQgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5pbnN0YW50KSkgfHxcbiAgICAocGFyYW1zLmJpdGdvRmVlICYmICFfLmlzT2JqZWN0KHBhcmFtcy5iaXRnb0ZlZSkpIHx8XG4gICAgKHBhcmFtcy51bnNwZW50c0ZldGNoUGFyYW1zICYmICFfLmlzT2JqZWN0KHBhcmFtcy51bnNwZW50c0ZldGNoUGFyYW1zKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFyZ3VtZW50Jyk7XG4gIH1cblxuICBjb25zdCBiaXRnbyA9IHBhcmFtcy53YWxsZXQuYml0Z287XG4gIGNvbnN0IGNvbnN0YW50cyA9IGJpdGdvLmdldENvbnN0YW50cygpO1xuICBjb25zdCBuZXR3b3JrID0gZ2V0TmV0d29yayhjb21tb24uRW52aXJvbm1lbnRzW2JpdGdvLmdldEVudigpXS5uZXR3b3JrKTtcblxuICAvLyBUaGUgdXNlciBjYW4gc3BlY2lmeSBhIHNlcGVyYXRlLCBzaW5nbGUta2V5IHdhbGxldCBmb3IgdGhlIHB1cnBvc2VzIG9mIHBheWluZyBtaW5lcidzIGZlZXNcbiAgLy8gV2hlbiBjcmVhdGluZyBhIHRyYW5zYWN0aW9uIHRoaXMgY2FuIGJlIHNwZWNpZmllZCBhcyBhbiBpbnB1dCBhZGRyZXNzIG9yIHRoZSBwcml2YXRlIGtleSBpbiBXSUZcbiAgbGV0IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M7XG4gIGxldCBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA9IDA7XG4gIGlmIChwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgIHRyeSB7XG4gICAgICB1dHhvbGliLmFkZHJlc3MuZnJvbUJhc2U1OENoZWNrKHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAgIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPSBwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJhbXMuZmVlU2luZ2xlS2V5V0lGKSB7XG4gICAgY29uc3QgZmVlU2luZ2xlS2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMuZmVlU2luZ2xlS2V5V0lGLCBuZXR3b3JrIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29yayk7XG4gICAgZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA9IGdldEFkZHJlc3NQMlBLSChmZWVTaW5nbGVLZXkpO1xuICAgIC8vIElmIHRoZSB1c2VyIHNwZWNpZmllcyBib3RoLCBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgY29ycmVzcG9uZHMgdG8gdGhlIGFkZHJlc3Mgb2YgZmVlU2luZ2xlS2V5V0lGXG4gICAgaWYgKHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzICYmIHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzICE9PSBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzOiAnICtcbiAgICAgICAgICBwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyArXG4gICAgICAgICAgJyBkaWQgbm90IGNvcnJlc3BvbmQgdG8gYWRkcmVzcyBvZiBmZWVTaW5nbGVLZXlXSUY6ICcgK1xuICAgICAgICAgIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFfLmlzT2JqZWN0KHBhcmFtcy5yZWNpcGllbnRzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVjaXBpZW50cyBtdXN0IGJlIGFycmF5IG9mIHsgYWRkcmVzczogYWJjLCBhbW91bnQ6IDEwMDAwMCB9IG9iamVjdHMnKTtcbiAgfVxuXG4gIGxldCBmZWVQYXJhbXNEZWZpbmVkID0gMDtcbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWUpKSB7XG4gICAgZmVlUGFyYW1zRGVmaW5lZCsrO1xuICB9XG5cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSkge1xuICAgIGZlZVBhcmFtc0RlZmluZWQrKztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0KSkge1xuICAgIGZlZVBhcmFtc0RlZmluZWQrKztcbiAgfVxuXG4gIGlmIChmZWVQYXJhbXNEZWZpbmVkID4gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBvZiBmZWUsIGZlZVJhdGUgYW5kIGZlZVR4Q29uZmlybVRhcmdldCcpO1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLm1heEZlZVJhdGUpKSB7XG4gICAgcGFyYW1zLm1heEZlZVJhdGUgPSBjb25zdGFudHMubWF4RmVlUmF0ZTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgdGhlIG9sZCBmb3JtYXQgb2YgcGFyYW1zLnJlY2lwaWVudHMgKGRpY3Rpb25hcnkgb2YgYWRkcmVzczphbW91bnQpIHRvIG5ldyBmb3JtYXQ6IHsgZGVzdGluYXRpb25BZGRyZXNzLCBhbW91bnQgfVxuICBpZiAoIShwYXJhbXMucmVjaXBpZW50cyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgIHJlY2lwaWVudHMgPSBbXTtcbiAgICBPYmplY3Qua2V5cyhwYXJhbXMucmVjaXBpZW50cykuZm9yRWFjaChmdW5jdGlvbiAoZGVzdGluYXRpb25BZGRyZXNzKSB7XG4gICAgICBjb25zdCBhbW91bnQgPSBwYXJhbXMucmVjaXBpZW50c1tkZXN0aW5hdGlvbkFkZHJlc3NdO1xuICAgICAgcmVjaXBpZW50cy5wdXNoKHsgYWRkcmVzczogZGVzdGluYXRpb25BZGRyZXNzLCBhbW91bnQ6IGFtb3VudCB9KTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZWNpcGllbnRzID0gcGFyYW1zLnJlY2lwaWVudHM7XG4gIH1cblxuICBpZiAocGFyYW1zLm9wUmV0dXJucykge1xuICAgIGlmICghKHBhcmFtcy5vcFJldHVybnMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgIG9wUmV0dXJucyA9IFtdO1xuICAgICAgT2JqZWN0LmtleXMocGFyYW1zLm9wUmV0dXJucykuZm9yRWFjaChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgICAgICBjb25zdCBhbW91bnQgPSBwYXJhbXMub3BSZXR1cm5zW21lc3NhZ2VdO1xuICAgICAgICBvcFJldHVybnMucHVzaCh7IG1lc3NhZ2UsIGFtb3VudCB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcFJldHVybnMgPSBwYXJhbXMub3BSZXR1cm5zO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZWNpcGllbnRzLmxlbmd0aCA9PT0gMCAmJiBvcFJldHVybnMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHJlY2lwaWVudCcpO1xuICB9XG5cbiAgbGV0IGZlZSA9IHBhcmFtcy5mZWU7XG4gIGxldCBmZWVSYXRlID0gcGFyYW1zLmZlZVJhdGU7XG5cbiAgLy8gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBjbGFzcyB3aWxsIGNvbXB1dGUgdGhlIGZlZVxuICBjb25zdCBzaG91bGRDb21wdXRlQmVzdEZlZSA9IF8uaXNVbmRlZmluZWQoZmVlKTtcblxuICBsZXQgdG90YWxPdXRwdXRBbW91bnQgPSAwO1xuXG4gIHJlY2lwaWVudHMuZm9yRWFjaChmdW5jdGlvbiAocmVjaXBpZW50KSB7XG4gICAgaWYgKF8uaXNTdHJpbmcocmVjaXBpZW50LmFkZHJlc3MpKSB7XG4gICAgICB0cnkge1xuICAgICAgICB1dHhvbGliLmFkZHJlc3MuZnJvbUJhc2U1OENoZWNrKHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGNvaW4gYWRkcmVzczogJyArIHJlY2lwaWVudC5hZGRyZXNzKTtcbiAgICAgIH1cbiAgICAgIGlmICghIXJlY2lwaWVudC5zY3JpcHQpIHtcbiAgICAgICAgLy8gQSBzY3JpcHQgd2FzIHByb3ZpZGVkIGFzIHdlbGwgLSB2YWxpZGF0ZSB0aGF0IHRoZSBhZGRyZXNzIGNvcnJlc3BvbmRzIHRvIHRoYXRcbiAgICAgICAgaWYgKHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNpcGllbnQuYWRkcmVzcywgbmV0d29yaykudG9TdHJpbmcoJ2hleCcpICE9PSByZWNpcGllbnQuc2NyaXB0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2JvdGggc2NyaXB0IGFuZCBhZGRyZXNzIHByb3ZpZGVkIGJ1dCB0aGV5IGRpZCBub3QgbWF0Y2g6ICcgKyByZWNpcGllbnQuYWRkcmVzcyArICcgJyArIHJlY2lwaWVudC5zY3JpcHRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghXy5pc0ludGVnZXIocmVjaXBpZW50LmFtb3VudCkgfHwgcmVjaXBpZW50LmFtb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhbW91bnQgZm9yICcgKyByZWNpcGllbnQuYWRkcmVzcyArICc6ICcgKyByZWNpcGllbnQuYW1vdW50KTtcbiAgICB9XG4gICAgdG90YWxPdXRwdXRBbW91bnQgKz0gcmVjaXBpZW50LmFtb3VudDtcbiAgfSk7XG5cbiAgb3BSZXR1cm5zLmZvckVhY2goZnVuY3Rpb24gKG9wUmV0dXJuKSB7XG4gICAgdG90YWxPdXRwdXRBbW91bnQgKz0gb3BSZXR1cm4uYW1vdW50O1xuICB9KTtcblxuICBsZXQgYml0Z29GZWVJbmZvID0gcGFyYW1zLmJpdGdvRmVlO1xuICBpZiAoYml0Z29GZWVJbmZvICYmICghXy5pc0ludGVnZXIoYml0Z29GZWVJbmZvLmFtb3VudCkgfHwgIV8uaXNTdHJpbmcoYml0Z29GZWVJbmZvLmFkZHJlc3MpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBiaXRnb0ZlZUluZm8nKTtcbiAgfVxuXG4gIC8vIFRoZSB0b3RhbCBhbW91bnQgbmVlZGVkIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICBsZXQgdG90YWxBbW91bnQgPSB0b3RhbE91dHB1dEFtb3VudCArIChmZWUgfHwgMCk7XG5cbiAgLy8gVGhlIGxpc3Qgb2YgdW5zcGVudCB0cmFuc2FjdGlvbnMgYmVpbmcgdXNlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLlxuICBsZXQgdW5zcGVudHM7XG5cbiAgLy8gdGhlIHRvdGFsIG51bWJlciBvZiB1bnNwZW50cyBvbiB0aGlzIHdhbGxldFxuICBsZXQgdG90YWxVbnNwZW50c0NvdW50O1xuXG4gIC8vIHRoZSBudW1iZXIgb2YgdW5zcGVudHMgd2UgZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIsIGJlZm9yZSBmaWx0ZXJpbmdcbiAgbGV0IGZldGNoZWRVbnNwZW50c0NvdW50O1xuXG4gIC8vIFRoZSBsaXN0IG9mIHVuc3BlbnQgdHJhbnNhY3Rpb25zIGJlaW5nIHVzZWQgd2l0aCB6ZXJvLWNvbmZpcm1hdGlvbnNcbiAgbGV0IHplcm9Db25mVW5zcGVudFR4SWRzO1xuXG4gIC8vIFRoZSBzdW0gb2YgdGhlIGlucHV0IHZhbHVlcyBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgbGV0IGlucHV0QW1vdW50O1xuXG4gIGxldCBjaGFuZ2VPdXRwdXRzOiBPdXRwdXRbXSA9IFtdO1xuXG4gIGxldCBjb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMgPSBmYWxzZTtcblxuICAvLyBUaGUgdHJhbnNhY3Rpb24uXG4gIGxldCB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yayhuZXR3b3JrKTtcblxuICBjb25zdCBnZXRCaXRHb0ZlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChiaXRnb0ZlZUluZm8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcmFtcy53YWxsZXQuZ2V0Qml0R29GZWUoeyBhbW91bnQ6IHRvdGFsT3V0cHV0QW1vdW50LCBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQuZmVlID4gMCkge1xuICAgICAgICAgIGJpdGdvRmVlSW5mbyA9IHtcbiAgICAgICAgICAgIGFtb3VudDogcmVzdWx0LmZlZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChiaXRnb0ZlZUluZm8gJiYgYml0Z29GZWVJbmZvLmFtb3VudCA+IDApIHtcbiAgICAgICAgdG90YWxBbW91bnQgKz0gYml0Z29GZWVJbmZvLmFtb3VudDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBnZXRCaXRHb0ZlZUFkZHJlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGJpdGdvRmVlSW5mbywgb3IgYWRkcmVzcyBpcyBhbHJlYWR5IHNldCwgZG9uJ3QgZ2V0IGEgbmV3IG9uZVxuICAgICAgaWYgKCFiaXRnb0ZlZUluZm8gfHwgYml0Z29GZWVJbmZvLmFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJpdGdvLmdldEJpdEdvRmVlQWRkcmVzcygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBiaXRnb0ZlZUluZm8uYWRkcmVzcyA9IHJlc3VsdC5hZGRyZXNzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gR2V0IGEgZHluYW1pYyBmZWUgZXN0aW1hdGUgZnJvbSB0aGUgQml0R28gc2VydmVyIGlmIGZlZVR4Q29uZmlybVRhcmdldFxuICAvLyBpcyBzcGVjaWZpZWQgb3IgaWYgbm8gZmVlLXJlbGF0ZWQgcGFyYW1zIGFyZSBzcGVjaWZpZWRcbiAgY29uc3QgZ2V0RHluYW1pY0ZlZVJhdGVFc3RpbWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCB8fCAhZmVlUGFyYW1zRGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGJpdGdvXG4gICAgICAgIC5lc3RpbWF0ZUZlZSh7XG4gICAgICAgICAgbnVtQmxvY2tzOiBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0LFxuICAgICAgICAgIG1heEZlZTogcGFyYW1zLm1heEZlZVJhdGUsXG4gICAgICAgICAgaW5wdXRzOiB6ZXJvQ29uZlVuc3BlbnRUeElkcyxcbiAgICAgICAgICB0eFNpemU6IGVzdFR4U2l6ZSxcbiAgICAgICAgICBjcGZwQXdhcmU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRGZWVSYXRlID0gcmVzdWx0LmNwZnBGZWVQZXJLYjtcbiAgICAgICAgICBjb25zdCBtaW5pbXVtID0gcGFyYW1zLmluc3RhbnRcbiAgICAgICAgICAgID8gTWF0aC5tYXgoY29uc3RhbnRzLm1pbkZlZVJhdGUsIGNvbnN0YW50cy5taW5JbnN0YW50RmVlUmF0ZSlcbiAgICAgICAgICAgIDogY29uc3RhbnRzLm1pbkZlZVJhdGU7XG4gICAgICAgICAgLy8gNSBzYXRvc2hpcyBwZXIgYnl0ZVxuICAgICAgICAgIC8vIGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBwYWRkaW5nIG9ubHkgYXBwbGllcyB3aGVuIHRoZSB0aHJlc2hvbGQgaXMgY3Jvc3NlZCwgYnV0IG5vdCB3aGVuIHRoZSBkZWx0YSBpcyBsZXNzIHRoYW4gdGhlIHBhZGRpbmdcbiAgICAgICAgICBjb25zdCBwYWRkaW5nID0gNTAwMDtcbiAgICAgICAgICBpZiAoZXN0aW1hdGVkRmVlUmF0ZSA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSgpICtcbiAgICAgICAgICAgICAgICAnOiBFcnJvciB3aGVuIGVzdGltYXRpbmcgZmVlIGZvciBzZW5kIGZyb20gJyArXG4gICAgICAgICAgICAgICAgcGFyYW1zLndhbGxldC5pZCgpICtcbiAgICAgICAgICAgICAgICAnLCBpdCB3YXMgdG9vIGxvdyAtICcgK1xuICAgICAgICAgICAgICAgIGVzdGltYXRlZEZlZVJhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmZWVSYXRlID0gbWluaW11bSArIHBhZGRpbmc7XG4gICAgICAgICAgfSBlbHNlIGlmIChlc3RpbWF0ZWRGZWVSYXRlID4gcGFyYW1zLm1heEZlZVJhdGUpIHtcbiAgICAgICAgICAgIGZlZVJhdGUgPSBwYXJhbXMubWF4RmVlUmF0ZSAtIHBhZGRpbmc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZlZVJhdGUgPSBlc3RpbWF0ZWRGZWVSYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmVlUmF0ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgLy8gc2FuaXR5IGNoZWNrIGZhaWxlZCBvbiB0eCBzaXplXG4gICAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5tZXNzYWdlLCAnaW52YWxpZCB0eFNpemUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIEJsdWViaXJkLnJlamVjdChlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY291bGRuJ3QgZXN0aW1hdGUgdGhlIGZlZSwgcHJvY2VlZCB1c2luZyB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgZmVlUmF0ZSA9IGNvbnN0YW50cy5mYWxsYmFja0ZlZVJhdGU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3IgZXN0aW1hdGluZyBmZWUgZm9yIHNlbmQgZnJvbSAnICsgcGFyYW1zLndhbGxldC5pZCgpICsgJzogJyArIGUubWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIEdldCB0aGUgdW5zcGVudHMgZm9yIHRoZSBzZW5kaW5nIHdhbGxldC5cbiAgY29uc3QgZ2V0VW5zcGVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBhcmFtcy51bnNwZW50cykge1xuICAgICAgLy8gd2UganVzdCB3YW5uYSB1c2UgY3VzdG9tIHVuc3BlbnRzXG4gICAgICB1bnNwZW50cyA9IHBhcmFtcy51bnNwZW50cztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgZW5vdWdoIHVuc3BlbnRzIGZvciB0aGUgcmVxdWVzdGVkIGFtb3VudFxuICAgIGNvbnN0IG9wdGlvbnMgPSBfLm1lcmdlKHt9LCBwYXJhbXMudW5zcGVudHNGZXRjaFBhcmFtcyB8fCB7fSwge1xuICAgICAgdGFyZ2V0OiB0b3RhbEFtb3VudCxcbiAgICAgIG1pblNpemU6IHBhcmFtcy5taW5VbnNwZW50U2l6ZSB8fCAwLFxuICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsIC8vIGluc2lzdCBvbiBpbnN0YW50IHVuc3BlbnRzIG9ubHlcbiAgICAgIHRhcmdldFdhbGxldFVuc3BlbnRzOiBwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMsXG4gICAgfSk7XG4gICAgaWYgKHBhcmFtcy5pbnN0YW50KSB7XG4gICAgICBvcHRpb25zLmluc3RhbnQgPSBwYXJhbXMuaW5zdGFudDsgLy8gaW5zaXN0IG9uIGluc3RhbnQgdW5zcGVudHMgb25seVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMud2FsbGV0LnVuc3BlbnRzUGFnZWQob3B0aW9ucykudGhlbihmdW5jdGlvbiAocmVzdWx0cykge1xuICAgICAgY29uc29sZS5sb2coYFVuc3BlbnRzIGZldGNoZWRcXG46ICAke0pTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpfWApO1xuICAgICAgdG90YWxVbnNwZW50c0NvdW50ID0gcmVzdWx0cy50b3RhbDtcbiAgICAgIGZldGNoZWRVbnNwZW50c0NvdW50ID0gcmVzdWx0cy5jb3VudDtcbiAgICAgIHVuc3BlbnRzID0gcmVzdWx0cy51bnNwZW50cy5maWx0ZXIoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgY29uc3QgY29uZmlybXMgPSB1LmNvbmZpcm1hdGlvbnMgfHwgMDtcbiAgICAgICAgaWYgKCFwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlICYmIHUuaXNDaGFuZ2UpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uZmlybXMgPj0gbWluQ29uZmlybXM7XG4gICAgICB9KTtcblxuICAgICAgLy8gYWJvcnQgZWFybHkgaWYgdGhlcmUncyBubyB2aWFibGUgdW5zcGVudHMsIGJlY2F1c2UgaXQgd29uJ3QgYmUgcG9zc2libGUgdG8gY3JlYXRlIHRoZSB0eG4gbGF0ZXJcbiAgICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJzAgdW5zcGVudHMgYXZhaWxhYmxlIGZvciB0cmFuc2FjdGlvbiBjcmVhdGlvbicpO1xuICAgICAgfVxuXG4gICAgICAvLyBjcmVhdGUgYXJyYXkgb2YgdW5jb25maXJtZWQgdW5zcGVudCBJRCBzdHJpbmdzIG9mIHRoZSBmb3JtIFwidHhIYXNoOm91dHB1dEluZGV4XCJcbiAgICAgIHplcm9Db25mVW5zcGVudFR4SWRzID0gXyhyZXN1bHRzLnVuc3BlbnRzKVxuICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgcmV0dXJuICF1LmNvbmZpcm1hdGlvbnM7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgICAgICByZXR1cm4gdS50eF9oYXNoICsgJzonICsgdS50eF9vdXRwdXRfbjtcbiAgICAgICAgfSlcbiAgICAgICAgLnZhbHVlKCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KHplcm9Db25mVW5zcGVudFR4SWRzKSkge1xuICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHBhc3MgYW4gZW1wdHkgYXJyYXkgb2YgaW5wdXRzIHRvIHRoZSBzZXJ2ZXIsIGJlY2F1c2UgaXQgYXNzdW1lcyBpZiB0aGVcbiAgICAgICAgLy8gaW5wdXRzIGFyZ3VtZW50cyBleGlzdHMsIGl0IGNvbnRhaW5zIHZhbHVlc1xuICAgICAgICB6ZXJvQ29uZlVuc3BlbnRUeElkcyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCByZXNwZWN0IHRoZSBvbGQgc3BsaXRDaGFuZ2VTaXplPTAgcGFyYW1ldGVyXG4gICAgICBpZiAoIXBhcmFtcy5ub1NwbGl0Q2hhbmdlICYmIHBhcmFtcy5zcGxpdENoYW5nZVNpemUgIT09IDApIHtcbiAgICAgICAgZXh0cmFDaGFuZ2VBbW91bnRzID0gcmVzdWx0cy5leHRyYUNoYW5nZUFtb3VudHMgfHwgW107XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gR2V0IHRoZSB1bnNwZW50cyBmb3IgdGhlIHNpbmdsZSBrZXkgZmVlIGFkZHJlc3NcbiAgbGV0IGZlZVNpbmdsZUtleVVuc3BlbnRzOiBCaXRHb1Vuc3BlbnRbXSA9IFtdO1xuICBjb25zdCBnZXRVbnNwZW50c0ZvclNpbmdsZUtleSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgbGV0IGZlZVRhcmdldCA9IDAuMDFlODtcbiAgICAgIGlmIChwYXJhbXMuaW5zdGFudCkge1xuICAgICAgICBmZWVUYXJnZXQgKz0gdG90YWxBbW91bnQgKiAwLjAwMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiaXRnb1xuICAgICAgICAuZ2V0KGJpdGdvLnVybCgnL2FkZHJlc3MvJyArIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgKyAnL3Vuc3BlbnRzP3RhcmdldD0nICsgZmVlVGFyZ2V0KSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmJvZHkudG90YWwgPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB1bnNwZW50cyBhdmFpbGFibGUgaW4gc2luZ2xlIGtleSBmZWUgc291cmNlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZlZVNpbmdsZUtleVVuc3BlbnRzID0gcmVzcG9uc2UuYm9keS51bnNwZW50cztcbiAgICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGxldCBtaW5lckZlZUluZm86IGFueSA9IHt9O1xuICBsZXQgdHhJbmZvOiBhbnkgPSB7fTtcblxuICAvLyBJdGVyYXRlIHVuc3BlbnRzLCBzdW0gdGhlIGlucHV0cywgYW5kIHNhdmUgX2lucHV0cyB3aXRoIHRoZSB0b3RhbFxuICAvLyBpbnB1dCBhbW91bnQgYW5kIGZpbmFsIGxpc3Qgb2YgaW5wdXRzIHRvIHVzZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgbGV0IGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZDogQml0R29VbnNwZW50W10gPSBbXTtcblxuICBjb25zdCBjb2xsZWN0SW5wdXRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdW5zcGVudHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHVuc3BlbnRzIGF2YWlsYWJsZSBvbiB3YWxsZXQnKTtcbiAgICB9XG4gICAgaW5wdXRBbW91bnQgPSAwO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBjb3N0IG9mIHNwZW5kaW5nIGEgc2luZ2xlIGlucHV0LCBpLmUuIHRoZSBzbWFsbGVzdCBlY29ub21pY2FsIHVuc3BlbnQgdmFsdWVcbiAgICByZXR1cm4gQmx1ZWJpcmQudHJ5KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSB8fCBfLmlzTnVtYmVyKHBhcmFtcy5vcmlnaW5hbEZlZVJhdGUpKSB7XG4gICAgICAgIHJldHVybiAhXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkgPyBwYXJhbXMuZmVlUmF0ZSA6IHBhcmFtcy5vcmlnaW5hbEZlZVJhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYml0Z29cbiAgICAgICAgICAuZXN0aW1hdGVGZWUoe1xuICAgICAgICAgICAgbnVtQmxvY2tzOiBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0LFxuICAgICAgICAgICAgbWF4RmVlOiBwYXJhbXMubWF4RmVlUmF0ZSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChmZWVSYXRlRXN0aW1hdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmZWVSYXRlRXN0aW1hdGUuZmVlUGVyS2I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAgIC50aGVuKGZ1bmN0aW9uIChmZWVSYXRlKSB7XG4gICAgICAgIC8vIERvbid0IHNwZW5kIGlucHV0cyB0aGF0IGNhbm5vdCBwYXkgZm9yIHRoZWlyIG93biBjb3N0LlxuICAgICAgICBsZXQgbWluSW5wdXRWYWx1ZSA9IDA7XG4gICAgICAgIGlmIChfLmlzSW50ZWdlcihwYXJhbXMubWluVW5zcGVudFNpemUpKSB7XG4gICAgICAgICAgbWluSW5wdXRWYWx1ZSA9IHBhcmFtcy5taW5VbnNwZW50U2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwcnVuZWRVbnNwZW50Q291bnQgPSAwO1xuICAgICAgICBjb25zdCBvcmlnaW5hbFVuc3BlbnRDb3VudCA9IHVuc3BlbnRzLmxlbmd0aDtcbiAgICAgICAgdW5zcGVudHMgPSBfLmZpbHRlcih1bnNwZW50cywgZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICBjb25zdCBpc1NlZ3dpdElucHV0ID0gISF1bnNwZW50LndpdG5lc3NTY3JpcHQ7XG4gICAgICAgICAgY29uc3QgY3VycmVudElucHV0U2l6ZSA9IGlzU2Vnd2l0SW5wdXQgPyBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgOiBWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplO1xuICAgICAgICAgIGNvbnN0IGZlZUJhc2VkTWluSW5wdXRWYWx1ZSA9IChmZWVSYXRlICogY3VycmVudElucHV0U2l6ZSkgLyAxMDAwO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRNaW5JbnB1dFZhbHVlID0gTWF0aC5tYXgobWluSW5wdXRWYWx1ZSwgZmVlQmFzZWRNaW5JbnB1dFZhbHVlKTtcbiAgICAgICAgICBpZiAoY3VycmVudE1pbklucHV0VmFsdWUgPiB1bnNwZW50LnZhbHVlKSB7XG4gICAgICAgICAgICAvLyBwcnVuaW5nIHVuc3BlbnRcbiAgICAgICAgICAgIGNvbnN0IHBydW5lRGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgZ2VuZXJhbE1pbklucHV0VmFsdWU6IG1pbklucHV0VmFsdWUsXG4gICAgICAgICAgICAgIGZlZUJhc2VkTWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgY3VycmVudE1pbklucHV0VmFsdWUsXG4gICAgICAgICAgICAgIGZlZVJhdGUsXG4gICAgICAgICAgICAgIGlucHV0U2l6ZTogY3VycmVudElucHV0U2l6ZSxcbiAgICAgICAgICAgICAgdW5zcGVudDogdW5zcGVudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgcHJ1bmluZyB1bnNwZW50OiAke0pTT04uc3RyaW5naWZ5KHBydW5lRGV0YWlscywgbnVsbCwgNCl9YCk7XG4gICAgICAgICAgICBwcnVuZWRVbnNwZW50Q291bnQrKztcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChwcnVuZWRVbnNwZW50Q291bnQgPiAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYHBydW5lZCAke3BydW5lZFVuc3BlbnRDb3VudH0gb3V0IG9mICR7b3JpZ2luYWxVbnNwZW50Q291bnR9IHVuc3BlbnRzYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnN1ZmZpY2llbnQgZnVuZHMnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2Vnd2l0SW5wdXRDb3VudCA9IDA7XG4gICAgICAgIHVuc3BlbnRzLmV2ZXJ5KGZ1bmN0aW9uICh1bnNwZW50KSB7XG4gICAgICAgICAgaWYgKHVuc3BlbnQud2l0bmVzc1NjcmlwdCkge1xuICAgICAgICAgICAgc2Vnd2l0SW5wdXRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnB1dEFtb3VudCArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICAgIHRyYW5zYWN0aW9uLmFkZElucHV0KHVuc3BlbnQudHhfaGFzaCwgdW5zcGVudC50eF9vdXRwdXRfbiwgMHhmZmZmZmZmZik7XG5cbiAgICAgICAgICByZXR1cm4gaW5wdXRBbW91bnQgPCAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IHRvdGFsT3V0cHV0QW1vdW50IDogdG90YWxBbW91bnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpZiBwYXlpbmcgZmVlcyBmcm9tIGFuIGV4dGVybmFsIHNpbmdsZSBrZXkgd2FsbGV0LCBhZGQgdGhlIGlucHV0c1xuICAgICAgICBpZiAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIGFtb3VudCB1c2VkIGluIHRoZSBmZWUgaW5wdXRzIHNvIHdlIGNhbiBnZXQgY2hhbmdlIGxhdGVyXG4gICAgICAgICAgZmVlU2luZ2xlS2V5SW5wdXRBbW91bnQgPSAwO1xuICAgICAgICAgIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZCA9IFtdO1xuICAgICAgICAgIGZlZVNpbmdsZUtleVVuc3BlbnRzLmV2ZXJ5KGZ1bmN0aW9uICh1bnNwZW50KSB7XG4gICAgICAgICAgICBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICAgICAgaW5wdXRBbW91bnQgKz0gdW5zcGVudC52YWx1ZTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmFkZElucHV0KHVuc3BlbnQudHhfaGFzaCwgdW5zcGVudC50eF9vdXRwdXRfbik7XG4gICAgICAgICAgICBmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQucHVzaCh1bnNwZW50KTtcbiAgICAgICAgICAgIC8vIHVzZSB0aGUgZmVlIHdhbGxldCB0byBwYXkgbWluZXIgZmVlcyBhbmQgcG90ZW50aWFsbHkgaW5zdGFudCBmZWVzXG4gICAgICAgICAgICByZXR1cm4gZmVlU2luZ2xlS2V5SW5wdXRBbW91bnQgPCBmZWUgKyAoYml0Z29GZWVJbmZvID8gYml0Z29GZWVJbmZvLmFtb3VudCA6IDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHhJbmZvID0ge1xuICAgICAgICAgIG5QMnNoSW5wdXRzOiB0cmFuc2FjdGlvbi50eC5pbnMubGVuZ3RoIC0gKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyAxIDogMCkgLSBzZWd3aXRJbnB1dENvdW50LFxuICAgICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHNlZ3dpdElucHV0Q291bnQsXG4gICAgICAgICAgblAycGtoSW5wdXRzOiBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gMSA6IDAsXG4gICAgICAgICAgLy8gYWRkIHNpbmdsZSBrZXkgc291cmNlIGFkZHJlc3MgY2hhbmdlXG4gICAgICAgICAgbk91dHB1dHM6XG4gICAgICAgICAgICByZWNpcGllbnRzLmxlbmd0aCArXG4gICAgICAgICAgICAxICsgLy8gcmVjaXBpZW50cyBhbmQgY2hhbmdlXG4gICAgICAgICAgICBleHRyYUNoYW5nZUFtb3VudHMubGVuZ3RoICsgLy8gZXh0cmEgY2hhbmdlIHNwbGl0dGluZ1xuICAgICAgICAgICAgKGJpdGdvRmVlSW5mbyAmJiBiaXRnb0ZlZUluZm8uYW1vdW50ID4gMCA/IDEgOiAwKSArIC8vIGFkZCBvdXRwdXQgZm9yIGJpdGdvIGZlZVxuICAgICAgICAgICAgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyAxIDogMCksXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQXMgcGVyIHRoZSByZXNwb25zZSBvZiBnZXQgdW5zcGVudHMgQVBJLCBmb3IgdjEgc2FmZSB3YWxsZXRzIHJlZGVlbVNjcmlwdCBpcyByZXR1cm5lZFxuICAgICAgICAvLyBpbiB0aGUgcmVzcG9uc2UgaW4gaGV4IGZvcm1hdFxuICAgICAgICBjb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMgPSB1bnNwZW50cy5zb21lKFxuICAgICAgICAgICh1KSA9PiB1LnJlZGVlbVNjcmlwdC5sZW5ndGggPT09IDIwMSAqIDIgLyogaGV4IGxlbmd0aCBpcyB0d2ljZSB0aGUgbGVuZ3RoIGluIGJ5dGVzICovXG4gICAgICAgICk7XG5cbiAgICAgICAgZXN0VHhTaXplID0gZXN0aW1hdGVUcmFuc2FjdGlvblNpemUoe1xuICAgICAgICAgIGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyxcbiAgICAgICAgICBuUDJzaElucHV0czogdHhJbmZvLm5QMnNoSW5wdXRzLFxuICAgICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHR4SW5mby5uUDJzaFAyd3NoSW5wdXRzLFxuICAgICAgICAgIG5QMnBraElucHV0czogdHhJbmZvLm5QMnBraElucHV0cyxcbiAgICAgICAgICBuT3V0cHV0czogdHhJbmZvLm5PdXRwdXRzLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAudGhlbihnZXREeW5hbWljRmVlUmF0ZUVzdGltYXRlKVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBtaW5lckZlZUluZm8gPSBleHBvcnRzLmNhbGN1bGF0ZU1pbmVyRmVlSW5mbyh7XG4gICAgICAgICAgYml0Z286IHBhcmFtcy53YWxsZXQuYml0Z28sXG4gICAgICAgICAgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzLFxuICAgICAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICAgICAgblAyc2hJbnB1dHM6IHR4SW5mby5uUDJzaElucHV0cyxcbiAgICAgICAgICBuUDJzaFAyd3NoSW5wdXRzOiB0eEluZm8ublAyc2hQMndzaElucHV0cyxcbiAgICAgICAgICBuUDJwa2hJbnB1dHM6IHR4SW5mby5uUDJwa2hJbnB1dHMsXG4gICAgICAgICAgbk91dHB1dHM6IHR4SW5mby5uT3V0cHV0cyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNob3VsZENvbXB1dGVCZXN0RmVlKSB7XG4gICAgICAgICAgY29uc3QgYXBwcm94aW1hdGVGZWUgPSBtaW5lckZlZUluZm8uZmVlO1xuICAgICAgICAgIGNvbnN0IHNob3VsZFJlY3Vyc2UgPSBfLmlzVW5kZWZpbmVkKGZlZSkgfHwgYXBwcm94aW1hdGVGZWUgPiBmZWU7XG4gICAgICAgICAgZmVlID0gYXBwcm94aW1hdGVGZWU7XG4gICAgICAgICAgLy8gUmVjb21wdXRlIHRvdGFsQW1vdW50IGZyb20gc2NyYXRjaFxuICAgICAgICAgIHRvdGFsQW1vdW50ID0gZmVlICsgdG90YWxPdXRwdXRBbW91bnQ7XG4gICAgICAgICAgaWYgKGJpdGdvRmVlSW5mbykge1xuICAgICAgICAgICAgdG90YWxBbW91bnQgKz0gYml0Z29GZWVJbmZvLmFtb3VudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNob3VsZFJlY3Vyc2UpIHtcbiAgICAgICAgICAgIC8vIGlmIGZlZSBjaGFuZ2VkLCByZS1jb2xsZWN0IGlucHV0c1xuICAgICAgICAgICAgaW5wdXRBbW91bnQgPSAwO1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcmsobmV0d29yayk7XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdElucHV0cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsRmVlID0gZmVlICsgKGJpdGdvRmVlSW5mbyA/IGJpdGdvRmVlSW5mby5hbW91bnQgOiAwKTtcblxuICAgICAgICBpZiAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgICAgIGNvbnN0IHN1bW1lZFNpbmdsZUtleVVuc3BlbnRzID0gXy5zdW1CeShmZWVTaW5nbGVLZXlVbnNwZW50cywgJ3ZhbHVlJyk7XG4gICAgICAgICAgaWYgKHRvdGFsRmVlID4gc3VtbWVkU2luZ2xlS2V5VW5zcGVudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnSW5zdWZmaWNpZW50IGZlZSBhbW91bnQgYXZhaWxhYmxlIGluIHNpbmdsZSBrZXkgZmVlIHNvdXJjZTogJyArIHN1bW1lZFNpbmdsZUtleVVuc3BlbnRzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXJyLnJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgZmVlOiBmZWUsXG4gICAgICAgICAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICAgICAgICAgIGVzdGltYXRlZFNpemU6IG1pbmVyRmVlSW5mby5zaXplLFxuICAgICAgICAgICAgICBhdmFpbGFibGU6IGlucHV0QW1vdW50LFxuICAgICAgICAgICAgICBiaXRnb0ZlZTogYml0Z29GZWVJbmZvLFxuICAgICAgICAgICAgICB0eEluZm86IHR4SW5mbyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gQmx1ZWJpcmQucmVqZWN0KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlucHV0QW1vdW50IDwgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyB0b3RhbE91dHB1dEFtb3VudCA6IHRvdGFsQW1vdW50KSkge1xuICAgICAgICAgIC8vIFRoZSB1bnNwZW50cyB3ZSdyZSB1c2luZyBmb3IgaW5wdXRzIGRvIG5vdCBoYXZlIHN1ZmZpY2llbnQgdmFsdWUgb24gdGhlbSB0b1xuICAgICAgICAgIC8vIHNhdGlzZnkgdGhlIHVzZXIncyByZXF1ZXN0ZWQgc3BlbmQgYW1vdW50LiBUaGF0IG1heSBiZSBiZWNhdXNlIHRoZSB3YWxsZXQncyBiYWxhbmNlXG4gICAgICAgICAgLy8gaXMgc2ltcGx5IHRvbyBsb3csIG9yIGl0IG1pZ2h0IGJlIHRoYXQgdGhlIHdhbGxldCdzIGJhbGFuY2UgaXMgc3VmZmljaWVudCBidXRcbiAgICAgICAgICAvLyB3ZSBkaWRuJ3QgZmV0Y2ggZW5vdWdoIHVuc3BlbnRzLiBUb28gZmV3IHVuc3BlbnRzIGNvdWxkIHJlc3VsdCBmcm9tIHRoZSB3YWxsZXRcbiAgICAgICAgICAvLyBoYXZpbmcgbWFueSBzbWFsbCB1bnNwZW50cyBhbmQgd2UgaGl0IG91ciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGlucHV0cyB3ZSBjYW4gdXNlXG4gICAgICAgICAgLy8gaW4gYSB0eG4sIG9yIGl0IG1pZ2h0IGhhdmUgYmVlbiB0aGF0IHRoZSBmaWx0ZXJzIHRoZSB1c2VyIHBhc3NlZCBpbiAobGlrZSBtaW5Db25maXJtcylcbiAgICAgICAgICAvLyBkaXNxdWFsaWZpZWQgdG9vIG1hbnkgb2YgdGhlIHVuc3BlbnRzXG4gICAgICAgICAgbGV0IGVycjtcbiAgICAgICAgICBpZiAodG90YWxVbnNwZW50c0NvdW50ID09PSBmZXRjaGVkVW5zcGVudHNDb3VudCkge1xuICAgICAgICAgICAgLy8gd2UgZmV0Y2hlZCBldmVyeSB1bnNwZW50IHRoZSB3YWxsZXQgaGFkLCBidXQgaXQgc3RpbGwgd2Fzbid0IGVub3VnaFxuICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgZnVuZHMnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2Ugd2VyZW4ndCBhYmxlIHRvIGZldGNoIGFsbCB0aGUgdW5zcGVudHMgb24gdGhlIHdhbGxldFxuICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVHJhbnNhY3Rpb24gc2l6ZSB0b28gbGFyZ2UgZHVlIHRvIHRvbyBtYW55IHVuc3BlbnRzLiBDYW4gc2VuZCBvbmx5ICR7aW5wdXRBbW91bnR9IHNhdG9zaGlzIGluIHRoaXMgdHJhbnNhY3Rpb25gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlcnIucmVzdWx0ID0ge1xuICAgICAgICAgICAgZmVlOiBmZWUsXG4gICAgICAgICAgICBmZWVSYXRlOiBmZWVSYXRlLFxuICAgICAgICAgICAgZXN0aW1hdGVkU2l6ZTogbWluZXJGZWVJbmZvLnNpemUsXG4gICAgICAgICAgICBhdmFpbGFibGU6IGlucHV0QW1vdW50LFxuICAgICAgICAgICAgYml0Z29GZWU6IGJpdGdvRmVlSW5mbyxcbiAgICAgICAgICAgIHR4SW5mbzogdHhJbmZvLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIEJsdWViaXJkLnJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfTtcblxuICAvLyBBZGQgdGhlIG91dHB1dHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGNvbnN0IGNvbGxlY3RPdXRwdXRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChtaW5lckZlZUluZm8uc2l6ZSA+PSA5MDAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0cmFuc2FjdGlvbiB0b28gbGFyZ2U6IGVzdGltYXRlZCBzaXplICcgKyBtaW5lckZlZUluZm8uc2l6ZSArICcgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRzOiBPdXRwdXRbXSA9IFtdO1xuXG4gICAgcmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgIGxldCBzY3JpcHQ7XG4gICAgICBpZiAoXy5pc1N0cmluZyhyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgICAgc2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChyZWNpcGllbnQuc2NyaXB0KSkge1xuICAgICAgICBzY3JpcHQgPSByZWNpcGllbnQuc2NyaXB0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWl0aGVyIHJlY2lwaWVudCBhZGRyZXNzIG5vciBzY3JpcHQgd2FzIHByb3ZpZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkYXRlIHRyYXZlbEluZm8gaWYgaXQgZXhpc3RzXG4gICAgICBsZXQgdHJhdmVsSW5mbztcbiAgICAgIGlmICghXy5pc0VtcHR5KHJlY2lwaWVudC50cmF2ZWxJbmZvKSkge1xuICAgICAgICB0cmF2ZWxJbmZvID0gcmVjaXBpZW50LnRyYXZlbEluZm87XG4gICAgICAgIC8vIEJldHRlciB0byBhdm9pZCB0cm91YmxlIG5vdywgYmVmb3JlIHR4IGlzIGNyZWF0ZWRcbiAgICAgICAgYml0Z28udHJhdmVsUnVsZSgpLnZhbGlkYXRlVHJhdmVsSW5mbyh0cmF2ZWxJbmZvKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgc2NyaXB0OiBzY3JpcHQsXG4gICAgICAgIGFtb3VudDogcmVjaXBpZW50LmFtb3VudCxcbiAgICAgICAgdHJhdmVsSW5mbzogdHJhdmVsSW5mbyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgb3BSZXR1cm5zLmZvckVhY2goZnVuY3Rpb24gKHsgbWVzc2FnZSwgYW1vdW50IH0pIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IHV0eG9saWIuc2NyaXB0LmZyb21BU00oJ09QX1JFVFVSTiAnICsgQnVmZmVyLmZyb20obWVzc2FnZSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIG91dHB1dHMucHVzaCh7IHNjcmlwdCwgYW1vdW50IH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZ2V0Q2hhbmdlT3V0cHV0cyA9IGZ1bmN0aW9uIChjaGFuZ2VBbW91bnQ6IG51bWJlcik6IE91dHB1dFtdIHwgQmx1ZWJpcmQ8T3V0cHV0W10+IHtcbiAgICAgIGlmIChjaGFuZ2VBbW91bnQgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbmVnYXRpdmUgY2hhbmdlIGFtb3VudDogJyArIGNoYW5nZUFtb3VudCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdDogT3V0cHV0W10gPSBbXTtcbiAgICAgIC8vIGlmIHdlIHBhaWQgZmVlcyBmcm9tIGEgc2luZ2xlIGtleSB3YWxsZXQsIHJldHVybiB0aGUgZmVlIGNoYW5nZSBmaXJzdFxuICAgICAgaWYgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICAgICAgY29uc3QgZmVlU2luZ2xlS2V5V2FsbGV0Q2hhbmdlQW1vdW50ID1cbiAgICAgICAgICBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCAtIChmZWUgKyAoYml0Z29GZWVJbmZvID8gYml0Z29GZWVJbmZvLmFtb3VudCA6IDApKTtcbiAgICAgICAgaWYgKGZlZVNpbmdsZUtleVdhbGxldENoYW5nZUFtb3VudCA+PSBjb25zdGFudHMubWluT3V0cHV0U2l6ZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcywgYW1vdW50OiBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQgfSk7XG4gICAgICAgICAgY2hhbmdlQW1vdW50ID0gY2hhbmdlQW1vdW50IC0gZmVlU2luZ2xlS2V5V2FsbGV0Q2hhbmdlQW1vdW50O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VBbW91bnQgPCBjb25zdGFudHMubWluT3V0cHV0U2l6ZSkge1xuICAgICAgICAvLyBHaXZlIGl0IHRvIHRoZSBtaW5lcnNcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmFtcy53YWxsZXQudHlwZSgpID09PSAnc2FmZScpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtcy53YWxsZXQuYWRkcmVzc2VzKCkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7IGFkZHJlc3M6IHJlc3BvbnNlLmFkZHJlc3Nlc1swXS5hZGRyZXNzLCBhbW91bnQ6IGNoYW5nZUFtb3VudCB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGV4dHJhQ2hhbmdlVG90YWwgPSBfLnN1bShleHRyYUNoYW5nZUFtb3VudHMpO1xuICAgICAgLy8gU2FuaXR5IGNoZWNrXG4gICAgICBpZiAoZXh0cmFDaGFuZ2VUb3RhbCA+IGNoYW5nZUFtb3VudCkge1xuICAgICAgICBleHRyYUNoYW5nZUFtb3VudHMgPSBbXTtcbiAgICAgICAgZXh0cmFDaGFuZ2VUb3RhbCA9IDA7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvcHkgYW5kIGFkZCByZW1haW5pbmcgY2hhbmdlIGFtb3VudFxuICAgICAgY29uc3QgYWxsQ2hhbmdlQW1vdW50cyA9IGV4dHJhQ2hhbmdlQW1vdW50cy5zbGljZSgwKTtcbiAgICAgIGFsbENoYW5nZUFtb3VudHMucHVzaChjaGFuZ2VBbW91bnQgLSBleHRyYUNoYW5nZVRvdGFsKTtcblxuICAgICAgLy8gUmVjdXJzaXZlIGFzeW5jIGZ1bmMgdG8gYWRkIGFsbCBjaGFuZ2Ugb3V0cHV0c1xuICAgICAgY29uc3QgYWRkQ2hhbmdlT3V0cHV0cyA9IGZ1bmN0aW9uICgpOiBPdXRwdXRbXSB8IEJsdWViaXJkPE91dHB1dFtdPiB7XG4gICAgICAgIGNvbnN0IHRoaXNBbW91bnQgPSBhbGxDaGFuZ2VBbW91bnRzLnNoaWZ0KCk7XG4gICAgICAgIGlmICghdGhpc0Ftb3VudCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSB7XG4gICAgICAgICAgICAvLyBJZiB1c2VyIHBhc3NlZCBhIGNoYW5nZSBhZGRyZXNzLCB1c2UgaXQgZm9yIGFsbCBvdXRwdXRzXG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zLmNoYW5nZUFkZHJlc3M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgYWRkcmVzcyBwZXIgb3V0cHV0LCBmb3IgcHJpdmFjeVxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHNlZ3dpdCBvciBub3RcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZUNoYWluID0gcGFyYW1zLndhbGxldC5nZXRDaGFuZ2VDaGFpbihwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy53YWxsZXQuY3JlYXRlQWRkcmVzcyh7IGNoYWluOiBjaGFuZ2VDaGFpbiwgdmFsaWRhdGU6IHZhbGlkYXRlIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmFkZHJlc3M7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGFkZHJlc3MpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh7IGFkZHJlc3M6IGFkZHJlc3MsIGFtb3VudDogdGhpc0Ftb3VudCB9KTtcbiAgICAgICAgICByZXR1cm4gYWRkQ2hhbmdlT3V0cHV0cygpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhZGRDaGFuZ2VPdXRwdXRzKCk7XG4gICAgfTtcblxuICAgIC8vIEFkZCBjaGFuZ2Ugb3V0cHV0KHMpIGFuZCBpbnN0YW50IGZlZSBvdXRwdXQgaWYgYXBwbGljYWJsZVxuICAgIHJldHVybiBCbHVlYmlyZC50cnkoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldENoYW5nZU91dHB1dHMoaW5wdXRBbW91bnQgLSB0b3RhbEFtb3VudCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBjaGFuZ2VPdXRwdXRzID0gcmVzdWx0O1xuICAgICAgY29uc3QgZXh0cmFPdXRwdXRzID0gY2hhbmdlT3V0cHV0cy5jb25jYXQoW10pOyAvLyBjb3B5IHRoZSBhcnJheVxuICAgICAgaWYgKGJpdGdvRmVlSW5mbyAmJiBiaXRnb0ZlZUluZm8uYW1vdW50ID4gMCkge1xuICAgICAgICBleHRyYU91dHB1dHMucHVzaChiaXRnb0ZlZUluZm8pO1xuICAgICAgfVxuICAgICAgZXh0cmFPdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICBpZiAoKG91dHB1dCBhcyBBZGRyZXNzT3V0cHV0KS5hZGRyZXNzKSB7XG4gICAgICAgICAgKG91dHB1dCBhcyBTY3JpcHRPdXRwdXQpLnNjcmlwdCA9IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCgob3V0cHV0IGFzIEFkZHJlc3NPdXRwdXQpLmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGVjaWRlIHdoZXJlIHRvIHB1dCB0aGUgb3V0cHV0cyAtIGRlZmF1bHQgaXMgdG8gcmFuZG9taXplIHVubGVzcyBmb3JjZWQgdG8gZW5kXG4gICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gcGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQgPyBvdXRwdXRzLmxlbmd0aCA6IF8ucmFuZG9tKDAsIG91dHB1dHMubGVuZ3RoKTtcbiAgICAgICAgb3V0cHV0cy5zcGxpY2Uob3V0cHV0SW5kZXgsIDAsIG91dHB1dCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGFsbCBvdXRwdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgICAgb3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChvdXRwdXQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uYWRkT3V0cHV0KChvdXRwdXQgYXMgU2NyaXB0T3V0cHV0KS5zY3JpcHQsIG91dHB1dC5hbW91bnQpO1xuICAgICAgfSk7XG5cbiAgICAgIHRyYXZlbEluZm9zID0gXyhvdXRwdXRzKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChvdXRwdXQsIGluZGV4KSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3V0cHV0LnRyYXZlbEluZm87XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5vdXRwdXRJbmRleCA9IGluZGV4O1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKVxuICAgICAgICAudmFsdWUoKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBTZXJpYWxpemUgdGhlIHRyYW5zYWN0aW9uLCByZXR1cm5pbmcgd2hhdCBpcyBuZWVkZWQgdG8gc2lnbiBpdFxuICBjb25zdCBzZXJpYWxpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gb25seSBuZWVkIHRvIHJldHVybiB0aGUgdW5zcGVudHMgdGhhdCB3ZXJlIHVzZWQgYW5kIGp1c3QgdGhlIGNoYWluUGF0aCwgcmVkZWVtU2NyaXB0LCBhbmQgaW5zdGFudCBmbGFnXG4gICAgY29uc3QgcGlja2VkVW5zcGVudHM6IGFueSA9IF8ubWFwKHVuc3BlbnRzLCBmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgcmV0dXJuIF8ucGljayh1bnNwZW50LCBbJ2NoYWluUGF0aCcsICdyZWRlZW1TY3JpcHQnLCAnaW5zdGFudCcsICd3aXRuZXNzU2NyaXB0JywgJ3NjcmlwdCcsICd2YWx1ZSddKTtcbiAgICB9KTtcbiAgICBjb25zdCBwcnVuZWRVbnNwZW50cyA9IF8uc2xpY2UocGlja2VkVW5zcGVudHMsIDAsIHRyYW5zYWN0aW9uLnR4Lmlucy5sZW5ndGggLSBmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQubGVuZ3RoKTtcbiAgICBfLmVhY2goZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkLCBmdW5jdGlvbiAoZmVlVW5zcGVudCkge1xuICAgICAgcHJ1bmVkVW5zcGVudHMucHVzaCh7IHJlZGVlbVNjcmlwdDogZmFsc2UsIGNoYWluUGF0aDogZmFsc2UgfSk7IC8vIG1hcmsgYXMgZmFsc2UgdG8gc2lnbmlmeSBhIG5vbi1tdWx0aXNpZyBhZGRyZXNzXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICB0cmFuc2FjdGlvbkhleDogdHJhbnNhY3Rpb24uYnVpbGRJbmNvbXBsZXRlKCkudG9IZXgoKSxcbiAgICAgIHVuc3BlbnRzOiBwcnVuZWRVbnNwZW50cyxcbiAgICAgIGZlZTogZmVlLFxuICAgICAgY2hhbmdlQWRkcmVzc2VzOiBjaGFuZ2VPdXRwdXRzLm1hcChmdW5jdGlvbiAoY28pIHtcbiAgICAgICAgcmV0dXJuIF8ucGljayhjbywgWydhZGRyZXNzJywgJ3BhdGgnLCAnYW1vdW50J10pO1xuICAgICAgfSksXG4gICAgICB3YWxsZXRJZDogcGFyYW1zLndhbGxldC5pZCgpLFxuICAgICAgd2FsbGV0S2V5Y2hhaW5zOiBwYXJhbXMud2FsbGV0LmtleWNoYWlucyxcbiAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICBlc3RpbWF0ZWRTaXplOiBtaW5lckZlZUluZm8uc2l6ZSxcbiAgICAgIHR4SW5mbzogdHhJbmZvLFxuICAgICAgdHJhdmVsSW5mb3M6IHRyYXZlbEluZm9zLFxuICAgIH07XG5cbiAgICAvLyBBZGQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKHJlc3VsdC5pbnN0YW50ICYmIGJpdGdvRmVlSW5mbykge1xuICAgICAgcmVzdWx0Lmluc3RhbnRGZWUgPSBfLnBpY2soYml0Z29GZWVJbmZvLCBbJ2Ftb3VudCcsICdhZGRyZXNzJ10pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIEJsdWViaXJkLnRyeShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldEJpdEdvRmVlKCk7XG4gIH0pXG4gICAgLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIEJsdWViaXJkLmFsbChbZ2V0Qml0R29GZWVBZGRyZXNzKCksIGdldFVuc3BlbnRzKCksIGdldFVuc3BlbnRzRm9yU2luZ2xlS2V5KCldKTtcbiAgICB9KVxuICAgIC50aGVuKGNvbGxlY3RJbnB1dHMpXG4gICAgLnRoZW4oY29sbGVjdE91dHB1dHMpXG4gICAgLnRoZW4oc2VyaWFsaXplKTtcbn07XG5cbi8qKlxuICogRXN0aW1hdGUgdGhlIHNpemUgb2YgYSB0cmFuc2FjdGlvbiBpbiBieXRlcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mXG4gKiBpbnB1dHMgYW5kIG91dHB1dHMgcHJlc2VudC5cbiAqIEBwYXJhbXMgcGFyYW1zIHtcbiAqICAgblAyc2hJbnB1dHM6IG51bWJlciBvZiBQMlNIIChtdWx0aXNpZykgaW5wdXRzXG4gKiAgIG5QMnBraElucHV0czogbnVtYmVyIG9mIFAyUEtIIChzaW5nbGUgc2lnKSBpbnB1dHNcbiAqICAgbk91dHB1dHM6IG51bWJlciBvZiBvdXRwdXRzXG4gKiB9XG4gKlxuICogQHJldHVybnMgc2l6ZTogZXN0aW1hdGVkIHNpemUgb2YgdGhlIHRyYW5zYWN0aW9uIGluIGJ5dGVzXG4gKi9cbmNvbnN0IGVzdGltYXRlVHJhbnNhY3Rpb25TaXplID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJzaElucHV0cykgfHwgcGFyYW1zLm5QMnNoSW5wdXRzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5QMnNoSW5wdXRzJyk7XG4gIH1cbiAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMublAycGtoSW5wdXRzKSB8fCBwYXJhbXMublAycGtoSW5wdXRzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5QMnBraElucHV0cyB0byBiZSBudW1lcmljJyk7XG4gIH1cbiAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMublAyc2hQMndzaElucHV0cykgfHwgcGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAyc2hQMndzaElucHV0cyB0byBiZSBudW1lcmljJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5uUDJzaElucHV0cyArIHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIGF0IGxlYXN0IG9uZSBuUDJzaElucHV0cyBvciBuUDJzaFAyd3NoSW5wdXRzJyk7XG4gIH1cbiAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubk91dHB1dHMpIHx8IHBhcmFtcy5uT3V0cHV0cyA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBwb3NpdGl2ZSBuT3V0cHV0cycpO1xuICB9XG5cbiAgLy8gVGhlIHNpemUgb2YgYW4gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXkgaXMgMzIgYnl0ZXMgbW9yZSB0aGFuIHRoZSBjb21wcmVzc2VkIGtleSxcbiAgLy8gYW5kIGhlbmNlLCBuZWVkcyB0byBiZSBhY2NvdW50ZWQgZm9yIGluIHRoZSB0cmFuc2FjdGlvbiBzaXplIGVzdGltYXRpb24uXG4gIGNvbnN0IHVuY29tcHJlc3NlZFB1YmxpY0tleXNUcmlwbGVDb3JyZWN0aW9uRmFjdG9yID0gMzIgKiAzO1xuXG4gIHJldHVybiAoXG4gICAgLy8gVGhpcyBpcyBub3QgcXVpdGUgYWNjdXJhdGUgLSBpZiB0aGVyZSBpcyBhIG1peCBvZiBpbnB1dHMgc2NyaXB0cyB3aGVyZSBzb21lIHVzZWRcbiAgICAvLyBjb21wcmVzc2VkIGtleXMgYW5kIHNvbWUgdXNlZCB1bmNvbXByZXNzZWQga2V5cywgd2Ugd291bGQgb3ZlcmVzdGltYXRlIHRoZSBzaXplLlxuICAgIC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgbWl4ZWQgaW5wdXQgc2V0cywgdGhpcyBzaG91bGQgbm90IGJlIGFuIGlzc3VlIGluIHByYWN0aWNlLlxuICAgIChWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplICtcbiAgICAgIChwYXJhbXMuY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzID8gdW5jb21wcmVzc2VkUHVibGljS2V5c1RyaXBsZUNvcnJlY3Rpb25GYWN0b3IgOiAwKSkgKlxuICAgICAgcGFyYW1zLm5QMnNoSW5wdXRzICtcbiAgICBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgKiAocGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgfHwgMCkgK1xuICAgIFZpcnR1YWxTaXplcy50eFAycGtoSW5wdXRTaXplVW5jb21wcmVzc2VkS2V5ICogKHBhcmFtcy5uUDJwa2hJbnB1dHMgfHwgMCkgK1xuICAgIFZpcnR1YWxTaXplcy50eFAycGtoT3V0cHV0U2l6ZSAqIHBhcmFtcy5uT3V0cHV0cyArXG4gICAgLy8gaWYgdGhlIHR4IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBzZWd3aXQgaW5wdXQsIHRoZSB0eCBvdmVyaGVhZCBpcyBpbmNyZWFzZWQgYnkgMVxuICAgIFZpcnR1YWxTaXplcy50eE92ZXJoZWFkU2l6ZSArXG4gICAgKHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzID4gMCA/IDEgOiAwKVxuICApO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGZlZSBhbmQgZXN0aW1hdGVkIHNpemUgaW4gYnl0ZXMgZm9yIGEgdHJhbnNhY3Rpb24uXG4gKiBAcGFyYW1zIHBhcmFtcyB7XG4gKiAgIGJpdGdvOiBiaXRnbyBvYmplY3RcbiAqICAgZmVlUmF0ZTogc2F0b3NoaXMgcGVyIGtpbG9ieXRlXG4gKiAgIG5QMnNoSW5wdXRzOiBudW1iZXIgb2YgUDJTSCAobXVsdGlzaWcpIGlucHV0c1xuICogICBuUDJwa2hJbnB1dHM6IG51bWJlciBvZiBQMlBLSCAoc2luZ2xlIHNpZykgaW5wdXRzXG4gKiAgIG5PdXRwdXRzOiBudW1iZXIgb2Ygb3V0cHV0c1xuICogfVxuICpcbiAqIEByZXR1cm5zIHtcbiAqICAgc2l6ZTogZXN0aW1hdGVkIHNpemUgb2YgdGhlIHRyYW5zYWN0aW9uIGluIGJ5dGVzXG4gKiAgIGZlZTogZXN0aW1hdGVkIGZlZSBpbiBzYXRvc2hpcyBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gKiAgIGZlZVJhdGU6IGZlZSByYXRlIHRoYXQgd2FzIHVzZWQgdG8gZXN0aW1hdGUgdGhlIGZlZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gKiB9XG4gKi9cbmV4cG9ydHMuY2FsY3VsYXRlTWluZXJGZWVJbmZvID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb25zdCBmZWVSYXRlVG9Vc2UgPSBwYXJhbXMuZmVlUmF0ZSB8fCBwYXJhbXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZmFsbGJhY2tGZWVSYXRlO1xuICBjb25zdCBlc3RpbWF0ZWRTaXplID0gZXN0aW1hdGVUcmFuc2FjdGlvblNpemUocGFyYW1zKTtcblxuICByZXR1cm4ge1xuICAgIHNpemU6IGVzdGltYXRlZFNpemUsXG4gICAgZmVlOiBNYXRoLmNlaWwoKGVzdGltYXRlZFNpemUgKiBmZWVSYXRlVG9Vc2UpIC8gMTAwMCksXG4gICAgZmVlUmF0ZTogZmVlUmF0ZVRvVXNlLFxuICB9O1xufTtcblxuLypcbiAqIEdpdmVuIGEgdHJhbnNhY3Rpb24gaGV4LCB1bnNwZW50IGluZm9ybWF0aW9uIChjaGFpbiBwYXRoIGFuZCByZWRlZW0gc2NyaXB0cyksIGFuZCB0aGUga2V5Y2hhaW4geHBydixcbiAqIHBlcmZvcm0ga2V5IGRlcml2YXRpb24gYW5kIHNpZ24gdGhlIGlucHV0cyBpbiB0aGUgdHJhbnNhY3Rpb24gYmFzZWQgb24gdGhlIHVuc3BlbnQgaW5mb3JtYXRpb24gcHJvdmlkZWRcbiAqXG4gKiBAcGFyYW1zOlxuICogIHRyYW5zYWN0aW9uSGV4IHNlcmlhbGl6ZWQgZm9ybSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gaGV4XG4gKiAgdW5zcGVudHMgYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZVxuICogIGluZGV4IGFzIHRoZSBpbnB1dHMgaW4gdGhlIHRyYW5zYWN0aW9uSGV4XG4gKiAga2V5Y2hhaW4gS2V5Y2hhaW4gY29udGFpbmluZyB0aGUgeHBydiB0byBzaWduIHdpdGguIEZvciBsZWdhY3kgc3VwcG9ydCBvZiBzYWZlIHdhbGxldHMsIGtleWNoYWluIGNhblxuIGFsc28gYmUgYSBXSUYgcHJpdmF0ZSBrZXkuXG4gKiAgc2lnbmluZ0tleSBwcml2YXRlIGtleSBpbiBXSUYgZm9yIHNhZmUgd2FsbGV0cywgd2hlbiBrZXljaGFpbiBpcyB1bmF2YWlsYWJsZVxuICogIHZhbGlkYXRlIGNsaWVudC1zaWRlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gLSBjYW4gYmUgZGlzYWJsZWQgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlIChzaWduYXR1cmVzXG4gKiAgICAgICAgICAgYXJlIHN0aWxsIHZhbGlkYXRlZCBzZXJ2ZXItc2lkZSkuXG4gKiAgZmVlU2luZ2xlS2V5V0lGIFVzZSB0aGUgYWRkcmVzcyBiYXNlZCBvbiB0aGlzIHByaXZhdGUga2V5IHRvIHBheSBmZWVzXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0cy5zaWduVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGxldCBrZXljaGFpbiA9IHBhcmFtcy5rZXljaGFpbjsgLy8gZHVwbGljYXRlIHNvIGFzIHRvIG5vdCBtdXRhdGUgYmVsb3dcblxuICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcbiAgbGV0IHByaXZLZXk7XG4gIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHJhbnNhY3Rpb25IZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdGhlIHRyYW5zYWN0aW9uIGhleCBhcyBhIHN0cmluZycpO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdGhlIHVuc3BlbnRzIGFycmF5Jyk7XG4gIH1cbiAgaWYgKCFfLmlzQm9vbGVhbih2YWxpZGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB2YWxpZGF0ZSB0byBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuICBsZXQgbmV0d29yayA9IGdldE5ldHdvcmsoKTtcbiAgY29uc3QgZW5hYmxlQkNIID0gXy5pc0Jvb2xlYW4ocGFyYW1zLmZvcmNlQkNIKSAmJiBwYXJhbXMuZm9yY2VCQ0ggPT09IHRydWU7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KGtleWNoYWluKSB8fCAhXy5pc1N0cmluZygoa2V5Y2hhaW4gYXMgYW55KS54cHJ2KSkge1xuICAgIGlmIChfLmlzU3RyaW5nKHBhcmFtcy5zaWduaW5nS2V5KSkge1xuICAgICAgcHJpdktleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYocGFyYW1zLnNpZ25pbmdLZXksIG5ldHdvcmsgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgICAgIGtleWNoYWluID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUga2V5Y2hhaW4gb2JqZWN0IHdpdGggeHBydicpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBmZWVTaW5nbGVLZXk7XG4gIGlmIChwYXJhbXMuZmVlU2luZ2xlS2V5V0lGKSB7XG4gICAgZmVlU2luZ2xlS2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMuZmVlU2luZ2xlS2V5V0lGLCBuZXR3b3JrIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29yayk7XG4gIH1cblxuICBkZWJ1ZygnTmV0d29yazogJU8nLCBuZXR3b3JrKTtcblxuICBpZiAoZW5hYmxlQkNIKSB7XG4gICAgZGVidWcoJ0VuYWJsaW5nIEJDSOKApicpO1xuICAgIG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5jYXNoO1xuICAgIGRlYnVnKCdOZXcgbmV0d29yazogJU8nLCBuZXR3b3JrKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgocGFyYW1zLnRyYW5zYWN0aW9uSGV4LCBuZXR3b3JrKTtcbiAgaWYgKHRyYW5zYWN0aW9uLmlucy5sZW5ndGggIT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2xlbmd0aCBvZiB1bnNwZW50cyBhcnJheSBzaG91bGQgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiBpbnB1dHMnKTtcbiAgfVxuXG4gIC8vIGRlY29yYXRlIHRyYW5zYWN0aW9uIHdpdGggaW5wdXQgdmFsdWVzIGZvciBUcmFuc2FjdGlvbkJ1aWxkZXIgaW5zdGFudGlhdGlvblxuICBjb25zdCBpc1V0eG9UeCA9IF8uaXNPYmplY3QodHJhbnNhY3Rpb24pICYmIEFycmF5LmlzQXJyYXkoKHRyYW5zYWN0aW9uIGFzIGFueSkuaW5zKTtcbiAgY29uc3QgYXJlVmFsaWRVbnNwZW50cyA9IF8uaXNPYmplY3QocGFyYW1zKSAmJiBBcnJheS5pc0FycmF5KChwYXJhbXMgYXMgYW55KS51bnNwZW50cyk7XG4gIGlmIChpc1V0eG9UeCAmJiBhcmVWYWxpZFVuc3BlbnRzKSB7XG4gICAgLy8gZXh0ZW5kIHRoZSB0cmFuc2FjdGlvbiBpbnB1dHMgd2l0aCB0aGUgdmFsdWVzXG4gICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBfLm1hcCgocGFyYW1zIGFzIGFueSkudW5zcGVudHMsICh1KSA9PiBfLnBpY2sodSwgJ3ZhbHVlJykpO1xuICAgIHRyYW5zYWN0aW9uLmlucy5tYXAoKGN1cnJlbnRJdGVtLCBpbmRleCkgPT4gXy5leHRlbmQoY3VycmVudEl0ZW0sIGlucHV0VmFsdWVzW2luZGV4XSkpO1xuICB9XG5cbiAgbGV0IHJvb3RFeHRLZXk7XG4gIGlmIChrZXljaGFpbikge1xuICAgIHJvb3RFeHRLZXkgPSBiaXAzMi5mcm9tQmFzZTU4KGtleWNoYWluLnhwcnYpO1xuICB9XG5cbiAgY29uc3QgdHhiID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGcm9tVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0eGIudHguaW5zLmxlbmd0aDsgKytpbmRleCkge1xuICAgIGNvbnN0IGN1cnJlbnRVbnNwZW50ID0gcGFyYW1zLnVuc3BlbnRzW2luZGV4XTtcbiAgICBpZiAoY3VycmVudFVuc3BlbnQucmVkZWVtU2NyaXB0ID09PSBmYWxzZSkge1xuICAgICAgLy8gdGhpcyBpcyB0aGUgaW5wdXQgZnJvbSBhIHNpbmdsZSBrZXkgZmVlIGFkZHJlc3NcbiAgICAgIGlmICghZmVlU2luZ2xlS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2luZ2xlIGtleSBhZGRyZXNzIHVzZWQgaW4gaW5wdXQgYnV0IGZlZVNpbmdsZUtleVdJRiBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZUJDSCkge1xuICAgICAgICBmZWVTaW5nbGVLZXkubmV0d29yayA9IG5ldHdvcms7XG4gICAgICB9XG5cbiAgICAgIHR4Yi5zaWduKGluZGV4LCBmZWVTaW5nbGVLZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQgJiYgZW5hYmxlQkNIKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JDSCBkb2VzIG5vdCBzdXBwb3J0IHNlZ3dpdCBpbnB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFpblBhdGggPSBjdXJyZW50VW5zcGVudC5jaGFpblBhdGg7XG4gICAgaWYgKHJvb3RFeHRLZXkpIHtcbiAgICAgIGNvbnN0IHsgd2FsbGV0U3ViUGF0aCA9ICcvMC8wJyB9ID0ga2V5Y2hhaW47XG4gICAgICBjb25zdCBwYXRoID0gc2FuaXRpemVMZWdhY3lQYXRoKGtleWNoYWluLnBhdGggKyB3YWxsZXRTdWJQYXRoICsgY2hhaW5QYXRoKTtcbiAgICAgIGRlYnVnKFxuICAgICAgICAnZGVyaXZlZCB1c2VyIGtleSBwYXRoIFwiJXNcIiB1c2luZyBrZXljaGFpbiBwYXRoIFwiJXNcIiwgd2FsbGV0U3ViUGF0aCBcIiVzXCIsIGtleWNoYWluIHdhbGxldFN1YlBhdGggXCIlc1wiIGFuZCBjaGFpblBhdGggXCIlc1wiJyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAga2V5Y2hhaW4ucGF0aCxcbiAgICAgICAgd2FsbGV0U3ViUGF0aCxcbiAgICAgICAga2V5Y2hhaW4ud2FsbGV0U3ViUGF0aCxcbiAgICAgICAgY2hhaW5QYXRoXG4gICAgICApO1xuICAgICAgcHJpdktleSA9IHJvb3RFeHRLZXkuZGVyaXZlUGF0aChwYXRoKTtcbiAgICB9XG5cbiAgICBwcml2S2V5Lm5ldHdvcmsgPSBuZXR3b3JrO1xuXG4gICAgLy8gc3Vic2NyaXB0IGlzIHRoZSBwYXJ0IG9mIHRoZSBvdXRwdXQgc2NyaXB0IGFmdGVyIHRoZSBPUF9DT0RFU0VQQVJBVE9SLlxuICAgIC8vIFNpbmNlIHdlIGFyZSBvbmx5IGV2ZXIgc2lnbmluZyBwMnNoIG91dHB1dHMsIHdoaWNoIGRvIG5vdCBoYXZlXG4gICAgLy8gT1BfQ09ERVNFUEFSQVRPUlMsIGl0IGlzIGFsd2F5cyB0aGUgb3V0cHV0IHNjcmlwdC5cbiAgICBjb25zdCBzdWJzY3JpcHQgPSBCdWZmZXIuZnJvbShjdXJyZW50VW5zcGVudC5yZWRlZW1TY3JpcHQsICdoZXgnKTtcbiAgICBjdXJyZW50VW5zcGVudC52YWxpZGF0aW9uU2NyaXB0ID0gc3Vic2NyaXB0O1xuXG4gICAgLy8gSW4gb3JkZXIgdG8gc2lnbiB3aXRoIGJpdGNvaW5qcy1saWIsIHdlIG11c3QgdXNlIGl0cyB0cmFuc2FjdGlvblxuICAgIC8vIGJ1aWxkZXIsIGNvbmZ1c2luZ2x5IG5hbWVkIHRoZSBzYW1lIGV4YWN0IHRoaW5nIGFzIG91ciB0cmFuc2FjdGlvblxuICAgIC8vIGJ1aWxkZXIsIGJ1dCB3aXRoIGluZXF1aXZhbGVudCBiZWhhdmlvci5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2l0bmVzc1NjcmlwdCA9IGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQgPyBCdWZmZXIuZnJvbShjdXJyZW50VW5zcGVudC53aXRuZXNzU2NyaXB0LCAnaGV4JykgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzaWdIYXNoID0gdXR4b2xpYi5iaXRnby5nZXREZWZhdWx0U2lnSGFzaChuZXR3b3JrKTtcbiAgICAgIHR4Yi5zaWduKGluZGV4LCBwcml2S2V5LCBzdWJzY3JpcHQsIHNpZ0hhc2gsIGN1cnJlbnRVbnNwZW50LnZhbHVlLCB3aXRuZXNzU2NyaXB0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB0cnkgZmFsbGJhY2sgZGVyaXZhdGlvbiBwYXRoIChzZWUgQkctNDY0OTcpXG4gICAgICBsZXQgZmFsbGJhY2tTaWduaW5nU3VjY2Vzc2Z1bCA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tQYXRoID0gc2FuaXRpemVMZWdhY3lQYXRoKGtleWNoYWluLnBhdGggKyBjaGFpblBhdGgpO1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAnZGVyaXZlZCBmYWxsYmFjayB1c2VyIGtleSBwYXRoIFwiJXNcIiB1c2luZyBrZXljaGFpbiBwYXRoIFwiJXNcIiBhbmQgY2hhaW5QYXRoIFwiJXNcIicsXG4gICAgICAgICAgZmFsbGJhY2tQYXRoLFxuICAgICAgICAgIGtleWNoYWluLnBhdGgsXG4gICAgICAgICAgY2hhaW5QYXRoXG4gICAgICAgICk7XG4gICAgICAgIHByaXZLZXkgPSByb290RXh0S2V5LmRlcml2ZVBhdGgoZmFsbGJhY2tQYXRoKTtcbiAgICAgICAgY29uc3Qgd2l0bmVzc1NjcmlwdCA9IGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHRcbiAgICAgICAgICA/IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQsICdoZXgnKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzaWdIYXNoID0gdXR4b2xpYi5iaXRnby5nZXREZWZhdWx0U2lnSGFzaChuZXR3b3JrKTtcbiAgICAgICAgdHhiLnNpZ24oaW5kZXgsIHByaXZLZXksIHN1YnNjcmlwdCwgc2lnSGFzaCwgY3VycmVudFVuc3BlbnQudmFsdWUsIHdpdG5lc3NTY3JpcHQpO1xuICAgICAgICBmYWxsYmFja1NpZ25pbmdTdWNjZXNzZnVsID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGZhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgZGVidWcoJ2lucHV0IHNpZ24gZmFpbGVkIGZvciBmYWxsYmFjayBwYXRoOiAlcycsIGZhbGxiYWNrRXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICAvLyB3ZSBuZWVkIHRvIGtub3cgd2hhdCdzIGNhdXNpbmcgdGhpc1xuICAgICAgaWYgKCFmYWxsYmFja1NpZ25pbmdTdWNjZXNzZnVsKSB7XG4gICAgICAgIGUucmVzdWx0ID0ge1xuICAgICAgICAgIHVuc3BlbnQ6IGN1cnJlbnRVbnNwZW50LFxuICAgICAgICB9O1xuICAgICAgICBlLm1lc3NhZ2UgPSBgRmFpbGVkIHRvIHNpZ24gaW5wdXQgIyR7aW5kZXh9IC0gJHtlLm1lc3NhZ2V9IC0gJHtKU09OLnN0cmluZ2lmeShlLnJlc3VsdCwgbnVsbCwgNCl9IC0gXFxuJHtcbiAgICAgICAgICBlLnN0YWNrXG4gICAgICAgIH1gO1xuICAgICAgICBkZWJ1ZygnaW5wdXQgc2lnbiBmYWlsZWQ6ICVzJywgZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIEJsdWViaXJkLnJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwYXJ0aWFsVHJhbnNhY3Rpb24gPSB0eGIuYnVpbGRJbmNvbXBsZXRlKCk7XG5cbiAgaWYgKHZhbGlkYXRlKSB7XG4gICAgcGFydGlhbFRyYW5zYWN0aW9uLmlucy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZUNvdW50ID0gdXR4b2xpYi5iaXRnb1xuICAgICAgICAuZ2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9ucyhwYXJ0aWFsVHJhbnNhY3Rpb24sIGluZGV4LCBwYXJhbXMudW5zcGVudHNbaW5kZXhdLnZhbHVlKVxuICAgICAgICAuZmlsdGVyKCh2KSA9PiB2LnNpZ25lZEJ5ICE9PSB1bmRlZmluZWQpLmxlbmd0aDtcbiAgICAgIGlmIChzaWduYXR1cmVDb3VudCA8IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBhdCBsZWFzdCBvbmUgdmFsaWQgc2lnbmF0dXJlJyk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmZ1bGxMb2NhbFNpZ25pbmcgJiYgc2lnbmF0dXJlQ291bnQgPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZnVsbExvY2FsU2lnbmluZyBzZXQ6IGV4cGVjdGVkIGF0IGxlYXN0IHR3byB2YWxpZCBzaWduYXR1cmVzJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh7XG4gICAgdHJhbnNhY3Rpb25IZXg6IHBhcnRpYWxUcmFuc2FjdGlvbi50b0hleCgpLFxuICB9KTtcbn07XG4iXX0=
1028
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL3RyYW5zYWN0aW9uQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixxQkFBcUI7QUFDckIsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLG1EQUE2QztBQUM3Qyw4REFBZ0Q7QUFDaEQsb0RBQXVCO0FBQ3ZCLG1EQUFvRDtBQUNwRCxrQ0FBbUM7QUFDbkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZDLG1EQUErRjtBQUMvRixtREFBZ0Q7QUFDaEQsa0NBQXFDO0FBVXJDOztHQUVHO0FBQ0gsU0FBUyxjQUFjLENBQUMsU0FBaUI7SUFDdkMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQzFFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLG1DQUFtQyxDQUFDLFNBQXVCO0lBQ2xFLElBQUksU0FBUyxDQUFDLE1B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QUNILENBQUM7SUFFRCxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUVqRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2Isa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUM5QyxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSztpQkFDakMseUJBQXlCLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNsRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2xELEtBQUssQ0FBQyw2QkFBNkIsS0FBSyxLQUFLLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDL0QsSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7WUFDbEYsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNyQixjQUFjLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFO0tBQzNDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGhpZGRlblxuICovXG5cbi8qKlxuICovXG4vL1xuLy8gVHJhbnNhY3Rpb25CdWlsZGVyXG4vLyBBIHV0aWxpdHkgZm9yIGJ1aWxkaW5nIGFuZCBzaWduaW5nIHRyYW5zYWN0aW9uc1xuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgVmlydHVhbFNpemVzIH0gZnJvbSAnQGJpdGdvLWJldGEvdW5zcGVudHMnO1xuaW1wb3J0IGRlYnVnTGliID0gcmVxdWlyZSgnZGVidWcnKTtcbmNvbnN0IGRlYnVnID0gZGVidWdMaWIoJ2JpdGdvOnYxOnR4YicpO1xuaW1wb3J0IHsgY29tbW9uLCBnZXRBZGRyZXNzUDJQS0gsIGdldE5ldHdvcmssIHNhbml0aXplTGVnYWN5UGF0aCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IHZlcmlmeUFkZHJlc3MgfSBmcm9tICcuL3ZlcmlmeUFkZHJlc3MnO1xuaW1wb3J0IHsgdHJ5UHJvbWlzZSB9IGZyb20gJy4uL3V0aWwnO1xuXG50eXBlIFRyaXBsZTxUPiA9IFtULCBULCBUXTtcblxuaW50ZXJmYWNlIFYxS2V5Y2hhaW4ge1xuICB4cHViOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHdhbGxldFN1YlBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyc2UgY2hhaW5QYXRoIGxpa2UgXCIvMC8xM1wiIGludG8geyBjaGFpbjogMCwgaW5kZXg6IDEzIH1cbiAqL1xuZnVuY3Rpb24gcGFyc2VDaGFpblBhdGgoY2hhaW5QYXRoOiBzdHJpbmcpOiB7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfSB7XG4gIGNvbnN0IHBhcnRzID0gY2hhaW5QYXRoLnNwbGl0KCcvJykuZmlsdGVyKChwKSA9PiBwLmxlbmd0aCA+IDApO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYWluUGF0aDogJHtjaGFpblBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHsgY2hhaW46IHBhcnNlSW50KHBhcnRzWzBdLCAxMCksIGluZGV4OiBwYXJzZUludChwYXJ0c1sxXSwgMTApIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIFJvb3RXYWxsZXRLZXlzIGZyb20gdjEgd2FsbGV0IGtleWNoYWlucy5cbiAqIHYxIGtleWNoYWlucyBoYXZlIGEgc3RydWN0dXJlIGxpa2UgeyB4cHViLCBwYXRoOiAnbScsIHdhbGxldFN1YlBhdGg6ICcvMC8wJyB9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RXYWxsZXRLZXlzRnJvbVYxS2V5Y2hhaW5zKGtleWNoYWluczogVjFLZXljaGFpbltdKTogdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyB7XG4gIGlmIChrZXljaGFpbnMubGVuZ3RoICE9PSAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCAzIGtleWNoYWlucyBmb3IgdjEgd2FsbGV0Jyk7XG4gIH1cblxuICBjb25zdCBiaXAzMktleXMgPSBrZXljaGFpbnMubWFwKChrKSA9PiBiaXAzMi5mcm9tQmFzZTU4KGsueHB1YikpIGFzIFRyaXBsZTx1dHhvbGliLkJJUDMySW50ZXJmYWNlPjtcblxuICAvLyB2MSB3YWxsZXRzIHR5cGljYWxseSBoYXZlIHdhbGxldFN1YlBhdGggbGlrZSAnLzAvMCcgd2hpY2ggd2UgY29udmVydCB0byBkZXJpdmF0aW9uIHByZWZpeGVzIGxpa2UgJzAvMCdcbiAgY29uc3QgZGVyaXZhdGlvblByZWZpeGVzID0ga2V5Y2hhaW5zLm1hcCgoaykgPT4ge1xuICAgIGNvbnN0IHdhbGxldFN1YlBhdGggPSBrLndhbGxldFN1YlBhdGggfHwgJy8wLzAnO1xuICAgIC8vIFJlbW92ZSBsZWFkaW5nIHNsYXNoIGlmIHByZXNlbnRcbiAgICByZXR1cm4gd2FsbGV0U3ViUGF0aC5zdGFydHNXaXRoKCcvJykgPyB3YWxsZXRTdWJQYXRoLnNsaWNlKDEpIDogd2FsbGV0U3ViUGF0aDtcbiAgfSkgYXMgVHJpcGxlPHN0cmluZz47XG5cbiAgcmV0dXJuIG5ldyB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzKGJpcDMyS2V5cywgZGVyaXZhdGlvblByZWZpeGVzKTtcbn1cblxuaW50ZXJmYWNlIEJhc2VPdXRwdXQge1xuICBhbW91bnQ6IG51bWJlcjtcbiAgdHJhdmVsSW5mbz86IGFueTtcbn1cblxuaW50ZXJmYWNlIEFkZHJlc3NPdXRwdXQgZXh0ZW5kcyBCYXNlT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU2NyaXB0T3V0cHV0IGV4dGVuZHMgQmFzZU91dHB1dCB7XG4gIHNjcmlwdDogQnVmZmVyO1xufVxuXG50eXBlIE91dHB1dCA9IEFkZHJlc3NPdXRwdXQgfCBTY3JpcHRPdXRwdXQ7XG5cbmludGVyZmFjZSBCaXRHb1Vuc3BlbnQge1xuICB2YWx1ZTogbnVtYmVyO1xuICB0eF9oYXNoOiBCdWZmZXI7XG4gIHR4X291dHB1dF9uOiBudW1iZXI7XG59XG5cbi8vXG4vLyBUcmFuc2FjdGlvbkJ1aWxkZXJcbi8vIEBwYXJhbXM6XG4vLyAgIHdhbGxldDogIGEgd2FsbGV0IG9iamVjdCB0byBzZW5kIGZyb21cbi8vICAgcmVjaXBpZW50czogYXJyYXkgb2YgcmVjaXBpZW50IG9iamVjdHMgYW5kIHRoZSBhbW91bnQgdG8gc2VuZCB0byBlYWNoIGUuZy4gW3thZGRyZXNzOiAnMzhCS0ROWmJQY0xvZ3ZWYmN4MmVrSjlFNlZ2OTREcURxdycsIGFtb3VudDogMTUwMH0sIHthZGRyZXNzOiAnMzZlTDh5UXFDbjFITVJtVkZGbzQ5dDJQSjNwYWk4d1FhbScsIGFtb3VudDogMjAwMH1dXG4vLyAgIGZlZTogdGhlIGZlZSB0byB1c2Ugd2l0aCB0aGlzIHRyYW5zYWN0aW9uLiAgaWYgbm90IHByb3ZpZGVkLCBhIGRlZmF1bHQsIG1pbmltdW0gZmVlIHdpbGwgYmUgdXNlZC5cbi8vICAgZmVlUmF0ZTogdGhlIGFtb3VudCBvZiBmZWUgcGVyIGtpbG9ieXRlIC0gb3B0aW9uYWwgLSBzcGVjaWZ5IGVpdGhlciBmZWUsIGZlZVJhdGUsIG9yIGZlZVR4Q29uZmlybVRhcmdldCBidXQgbm90IG1vcmUgdGhhbiBvbmVcbi8vICAgZmVlVHhDb25maXJtVGFyZ2V0OiBjYWxjdWxhdGUgdGhlIGZlZXMgcGVyIGtpbG9ieXRlIHN1Y2ggdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb25maXJtZWQgaW4gdGhpcyBudW1iZXIgb2YgYmxvY2tzXG4vLyAgIG1heEZlZVJhdGU6IFRoZSBtYXhpbXVtIGZlZSBwZXIga2IgdG8gdXNlIGluIHNhdG9zaGlzLCBmb3Igc2FmZXR5IHB1cnBvc2VzIHdoZW4gdXNpbmcgZHluYW1pYyBmZWVzXG4vLyAgIG1pbkNvbmZpcm1zOiB0aGUgbWluaW11bSBjb25maXJtYXRpb25zIGFuIG91dHB1dCBtdXN0IGhhdmUgYmVmb3JlIHNwZW5kaW5nXG4vLyAgIGZvcmNlQ2hhbmdlQXRFbmQ6IGZvcmNlIHRoZSBjaGFuZ2UgYWRkcmVzcyB0byBiZSB0aGUgbGFzdCBvdXRwdXRcbi8vICAgY2hhbmdlQWRkcmVzczogc3BlY2lmeSB0aGUgY2hhbmdlIGFkZHJlc3MgcmF0aGVyIHRoYW4gZ2VuZXJhdGUgYSBuZXcgb25lXG4vLyAgIG5vU3BsaXRDaGFuZ2U6IHNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0b21hdGljIGNoYW5nZSBzcGxpdHRpbmcgZm9yIHB1cnBvc2VzIG9mIHVuc3BlbnQgbWFuYWdlbWVudFxuLy8gICB0YXJnZXRXYWxsZXRVbnNwZW50czogc3BlY2lmeSBhIG51bWJlciBvZiB0YXJnZXQgdW5zcGVudHMgdG8gbWFpbnRhaW4gaW4gdGhlIHdhbGxldCAoY3VycmVudGx5IGRlZmF1bHRlZCB0byA4IGJ5IHRoZSBzZXJ2ZXIpXG4vLyAgIHZhbGlkYXRlOiBleHRyYSB2ZXJpZmljYXRpb24gb2YgdGhlIGNoYW5nZSBhZGRyZXNzZXMsIHdoaWNoIGlzIGFsd2F5cyBkb25lIHNlcnZlci1zaWRlIGFuZCBpcyByZWR1bmRhbnQgY2xpZW50LXNpZGUgKGRlZmF1bHRzIHRydWUpXG4vLyAgIG1pblVuc3BlbnRTaXplOiBUaGUgbWluaW11bSBzaXplIGluIHNhdG9zaGlzIG9mIHVuc3BlbnQgdG8gdXNlICh0byBwcmV2ZW50IHNwZW5kaW5nIHVuc3BlbnRzIHdvcnRoIGxlc3MgdGhhbiBmZWUgYWRkZWQpLiBEZWZhdWx0cyB0byAwLlxuLy8gICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzOiBVc2UgdGhpcyBzaW5nbGUga2V5IGFkZHJlc3MgdG8gcGF5IGZlZXNcbi8vICAgZmVlU2luZ2xlS2V5V0lGOiBVc2UgdGhlIGFkZHJlc3MgYmFzZWQgb24gdGhpcyBwcml2YXRlIGtleSB0byBwYXkgZmVlc1xuLy8gICB1bnNwZW50c0ZldGNoUGFyYW1zOiBFeHRyYSBwYXJhbWV0ZXJzIHRvIHVzZSBmb3IgZmV0Y2hpbmcgdW5zcGVudHMgZm9yIHRoaXMgdHJhbnNhY3Rpb25cbi8vICAgdW5zcGVudHM6IGFycmF5IG9mIHVuc3BlbnQgb2JqZWN0cyB0byB1c2Ugd2hpbGUgY29uc3RydWN0aW5nIHRoZSB0cmFuc2FjdGlvbiBpbnN0ZWFkIG9mIGZldGNoaW5nIGZyb20gdGhlIEFQSVxuZXhwb3J0cy5jcmVhdGVUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgY29uc3QgbWluQ29uZmlybXMgPSBwYXJhbXMubWluQ29uZmlybXMgfHwgMDtcbiAgY29uc3QgdmFsaWRhdGUgPSBwYXJhbXMudmFsaWRhdGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBwYXJhbXMudmFsaWRhdGU7XG4gIGxldCByZWNpcGllbnRzOiB7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBudW1iZXI7IHNjcmlwdD86IHN0cmluZzsgdHJhdmVsSW5mbz86IGFueSB9W10gPSBbXTtcbiAgbGV0IG9wUmV0dXJuczogeyBtZXNzYWdlOiBzdHJpbmc7IGFtb3VudDogbnVtYmVyIH1bXSA9IFtdO1xuICBsZXQgZXh0cmFDaGFuZ2VBbW91bnRzOiBudW1iZXJbXSA9IFtdO1xuICBsZXQgZXN0VHhTaXplOiBudW1iZXI7XG4gIGxldCB0cmF2ZWxJbmZvcztcblxuICAvLyBTYW5pdHkgY2hlY2sgdGhlIGFyZ3VtZW50cyBwYXNzZWQgaW5cbiAgaWYgKFxuICAgICFfLmlzT2JqZWN0KHBhcmFtcy53YWxsZXQpIHx8XG4gICAgKHBhcmFtcy5mZWUgJiYgIV8uaXNOdW1iZXIocGFyYW1zLmZlZSkpIHx8XG4gICAgKHBhcmFtcy5mZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5mZWVSYXRlKSkgfHxcbiAgICAhXy5pc0ludGVnZXIobWluQ29uZmlybXMpIHx8XG4gICAgKHBhcmFtcy5mb3JjZUNoYW5nZUF0RW5kICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZm9yY2VDaGFuZ2VBdEVuZCkpIHx8XG4gICAgKHBhcmFtcy5jaGFuZ2VBZGRyZXNzICYmICFfLmlzU3RyaW5nKHBhcmFtcy5jaGFuZ2VBZGRyZXNzKSkgfHxcbiAgICAocGFyYW1zLm5vU3BsaXRDaGFuZ2UgJiYgIV8uaXNCb29sZWFuKHBhcmFtcy5ub1NwbGl0Q2hhbmdlKSkgfHxcbiAgICAocGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzICYmICFfLmlzSW50ZWdlcihwYXJhbXMudGFyZ2V0V2FsbGV0VW5zcGVudHMpKSB8fFxuICAgICh2YWxpZGF0ZSAmJiAhXy5pc0Jvb2xlYW4odmFsaWRhdGUpKSB8fFxuICAgIChwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlICYmICFfLmlzQm9vbGVhbihwYXJhbXMuZW5mb3JjZU1pbkNvbmZpcm1zRm9yQ2hhbmdlKSkgfHxcbiAgICAocGFyYW1zLm1pblVuc3BlbnRTaXplICYmICFfLmlzTnVtYmVyKHBhcmFtcy5taW5VbnNwZW50U2l6ZSkpIHx8XG4gICAgKHBhcmFtcy5tYXhGZWVSYXRlICYmICFfLmlzTnVtYmVyKHBhcmFtcy5tYXhGZWVSYXRlKSkgfHxcbiAgICAvLyB0aGlzIHNob3VsZCBiZSBhbiBhcnJheSBhbmQgaXRzIGxlbmd0aCBtdXN0IGJlIGF0IGxlYXN0IDFcbiAgICAocGFyYW1zLnVuc3BlbnRzICYmICghQXJyYXkuaXNBcnJheShwYXJhbXMudW5zcGVudHMpIHx8IHBhcmFtcy51bnNwZW50cy5sZW5ndGggPCAxKSkgfHxcbiAgICAocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCAmJiAhXy5pc0ludGVnZXIocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCkpIHx8XG4gICAgKHBhcmFtcy5pbnN0YW50ICYmICFfLmlzQm9vbGVhbihwYXJhbXMuaW5zdGFudCkpIHx8XG4gICAgKHBhcmFtcy5iaXRnb0ZlZSAmJiAhXy5pc09iamVjdChwYXJhbXMuYml0Z29GZWUpKSB8fFxuICAgIChwYXJhbXMudW5zcGVudHNGZXRjaFBhcmFtcyAmJiAhXy5pc09iamVjdChwYXJhbXMudW5zcGVudHNGZXRjaFBhcmFtcykpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBhcmd1bWVudCcpO1xuICB9XG5cbiAgY29uc3QgYml0Z28gPSBwYXJhbXMud2FsbGV0LmJpdGdvO1xuICBjb25zdCBjb25zdGFudHMgPSBiaXRnby5nZXRDb25zdGFudHMoKTtcbiAgY29uc3QgbmV0d29yayA9IGdldE5ldHdvcmsoY29tbW9uLkVudmlyb25tZW50c1tiaXRnby5nZXRFbnYoKV0ubmV0d29yayk7XG5cbiAgLy8gVGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBzZXBlcmF0ZSwgc2luZ2xlLWtleSB3YWxsZXQgZm9yIHRoZSBwdXJwb3NlcyBvZiBwYXlpbmcgbWluZXIncyBmZWVzXG4gIC8vIFdoZW4gY3JlYXRpbmcgYSB0cmFuc2FjdGlvbiB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgYW4gaW5wdXQgYWRkcmVzcyBvciB0aGUgcHJpdmF0ZSBrZXkgaW4gV0lGXG4gIGxldCBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzO1xuICBsZXQgZmVlU2luZ2xlS2V5SW5wdXRBbW91bnQgPSAwO1xuICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICB0cnkge1xuICAgICAgdXR4b2xpYi5hZGRyZXNzLmZyb21CYXNlNThDaGVjayhwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcywgbmV0d29yayk7XG4gICAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID0gcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3M7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGNvaW4gYWRkcmVzczogJyArIHBhcmFtcy5mZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFyYW1zLmZlZVNpbmdsZUtleVdJRikge1xuICAgIGNvbnN0IGZlZVNpbmdsZUtleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYocGFyYW1zLmZlZVNpbmdsZUtleVdJRiwgbmV0d29yayBhcyB1dHhvbGliLkJpdGNvaW5KU05ldHdvcmspO1xuICAgIGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPSBnZXRBZGRyZXNzUDJQS0goZmVlU2luZ2xlS2V5KTtcbiAgICAvLyBJZiB0aGUgdXNlciBzcGVjaWZpZXMgYm90aCwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzIGNvcnJlc3BvbmRzIHRvIHRoZSBhZGRyZXNzIG9mIGZlZVNpbmdsZUtleVdJRlxuICAgIGlmIChwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyAmJiBwYXJhbXMuZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyAhPT0gZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzczogJyArXG4gICAgICAgICAgcGFyYW1zLmZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgK1xuICAgICAgICAgICcgZGlkIG5vdCBjb3JyZXNwb25kIHRvIGFkZHJlc3Mgb2YgZmVlU2luZ2xlS2V5V0lGOiAnICtcbiAgICAgICAgICBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmICghXy5pc09iamVjdChwYXJhbXMucmVjaXBpZW50cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY2lwaWVudHMgbXVzdCBiZSBhcnJheSBvZiB7IGFkZHJlc3M6IGFiYywgYW1vdW50OiAxMDAwMDAgfSBvYmplY3RzJyk7XG4gIH1cblxuICBsZXQgZmVlUGFyYW1zRGVmaW5lZCA9IDA7XG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlKSkge1xuICAgIGZlZVBhcmFtc0RlZmluZWQrKztcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuZmVlUmF0ZSkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoIV8uaXNVbmRlZmluZWQocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCkpIHtcbiAgICBmZWVQYXJhbXNEZWZpbmVkKys7XG4gIH1cblxuICBpZiAoZmVlUGFyYW1zRGVmaW5lZCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb2YgZmVlLCBmZWVSYXRlIGFuZCBmZWVUeENvbmZpcm1UYXJnZXQnKTtcbiAgfVxuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5tYXhGZWVSYXRlKSkge1xuICAgIHBhcmFtcy5tYXhGZWVSYXRlID0gY29uc3RhbnRzLm1heEZlZVJhdGU7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRoZSBvbGQgZm9ybWF0IG9mIHBhcmFtcy5yZWNpcGllbnRzIChkaWN0aW9uYXJ5IG9mIGFkZHJlc3M6YW1vdW50KSB0byBuZXcgZm9ybWF0OiB7IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50IH1cbiAgaWYgKCEocGFyYW1zLnJlY2lwaWVudHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICByZWNpcGllbnRzID0gW107XG4gICAgT2JqZWN0LmtleXMocGFyYW1zLnJlY2lwaWVudHMpLmZvckVhY2goZnVuY3Rpb24gKGRlc3RpbmF0aW9uQWRkcmVzcykge1xuICAgICAgY29uc3QgYW1vdW50ID0gcGFyYW1zLnJlY2lwaWVudHNbZGVzdGluYXRpb25BZGRyZXNzXTtcbiAgICAgIHJlY2lwaWVudHMucHVzaCh7IGFkZHJlc3M6IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50OiBhbW91bnQgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmVjaXBpZW50cyA9IHBhcmFtcy5yZWNpcGllbnRzO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5vcFJldHVybnMpIHtcbiAgICBpZiAoIShwYXJhbXMub3BSZXR1cm5zIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICBvcFJldHVybnMgPSBbXTtcbiAgICAgIE9iamVjdC5rZXlzKHBhcmFtcy5vcFJldHVybnMpLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgYW1vdW50ID0gcGFyYW1zLm9wUmV0dXJuc1ttZXNzYWdlXTtcbiAgICAgICAgb3BSZXR1cm5zLnB1c2goeyBtZXNzYWdlLCBhbW91bnQgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BSZXR1cm5zID0gcGFyYW1zLm9wUmV0dXJucztcbiAgICB9XG4gIH1cblxuICBpZiAocmVjaXBpZW50cy5sZW5ndGggPT09IDAgJiYgb3BSZXR1cm5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSByZWNpcGllbnQnKTtcbiAgfVxuXG4gIGxldCBmZWUgPSBwYXJhbXMuZmVlO1xuICBsZXQgZmVlUmF0ZSA9IHBhcmFtcy5mZWVSYXRlO1xuXG4gIC8vIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY2xhc3Mgd2lsbCBjb21wdXRlIHRoZSBmZWVcbiAgY29uc3Qgc2hvdWxkQ29tcHV0ZUJlc3RGZWUgPSBfLmlzVW5kZWZpbmVkKGZlZSk7XG5cbiAgbGV0IHRvdGFsT3V0cHV0QW1vdW50ID0gMDtcblxuICByZWNpcGllbnRzLmZvckVhY2goZnVuY3Rpb24gKHJlY2lwaWVudCkge1xuICAgIGlmIChfLmlzU3RyaW5nKHJlY2lwaWVudC5hZGRyZXNzKSkge1xuICAgICAgaWYgKCF2ZXJpZnlBZGRyZXNzKHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYml0Y29pbiBhZGRyZXNzOiAnICsgcmVjaXBpZW50LmFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgaWYgKCEhcmVjaXBpZW50LnNjcmlwdCkge1xuICAgICAgICAvLyBBIHNjcmlwdCB3YXMgcHJvdmlkZWQgYXMgd2VsbCAtIHZhbGlkYXRlIHRoYXQgdGhlIGFkZHJlc3MgY29ycmVzcG9uZHMgdG8gdGhhdFxuICAgICAgICBpZiAodXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKS50b1N0cmluZygnaGV4JykgIT09IHJlY2lwaWVudC5zY3JpcHQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnYm90aCBzY3JpcHQgYW5kIGFkZHJlc3MgcHJvdmlkZWQgYnV0IHRoZXkgZGlkIG5vdCBtYXRjaDogJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJyAnICsgcmVjaXBpZW50LnNjcmlwdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFfLmlzSW50ZWdlcihyZWNpcGllbnQuYW1vdW50KSB8fCByZWNpcGllbnQuYW1vdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFtb3VudCBmb3IgJyArIHJlY2lwaWVudC5hZGRyZXNzICsgJzogJyArIHJlY2lwaWVudC5hbW91bnQpO1xuICAgIH1cbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSByZWNpcGllbnQuYW1vdW50O1xuICB9KTtcblxuICBvcFJldHVybnMuZm9yRWFjaChmdW5jdGlvbiAob3BSZXR1cm4pIHtcbiAgICB0b3RhbE91dHB1dEFtb3VudCArPSBvcFJldHVybi5hbW91bnQ7XG4gIH0pO1xuXG4gIGxldCBiaXRnb0ZlZUluZm8gPSBwYXJhbXMuYml0Z29GZWU7XG4gIGlmIChiaXRnb0ZlZUluZm8gJiYgKCFfLmlzSW50ZWdlcihiaXRnb0ZlZUluZm8uYW1vdW50KSB8fCAhXy5pc1N0cmluZyhiaXRnb0ZlZUluZm8uYWRkcmVzcykpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJpdGdvRmVlSW5mbycpO1xuICB9XG5cbiAgLy8gVGhlIHRvdGFsIGFtb3VudCBuZWVkZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB0b3RhbEFtb3VudCA9IHRvdGFsT3V0cHV0QW1vdW50ICsgKGZlZSB8fCAwKTtcblxuICAvLyBUaGUgbGlzdCBvZiB1bnNwZW50IHRyYW5zYWN0aW9ucyBiZWluZyB1c2VkIGluIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGxldCB1bnNwZW50cztcblxuICAvLyB0aGUgdG90YWwgbnVtYmVyIG9mIHVuc3BlbnRzIG9uIHRoaXMgd2FsbGV0XG4gIGxldCB0b3RhbFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB1bnNwZW50cyB3ZSBmZXRjaGVkIGZyb20gdGhlIHNlcnZlciwgYmVmb3JlIGZpbHRlcmluZ1xuICBsZXQgZmV0Y2hlZFVuc3BlbnRzQ291bnQ7XG5cbiAgLy8gVGhlIGxpc3Qgb2YgdW5zcGVudCB0cmFuc2FjdGlvbnMgYmVpbmcgdXNlZCB3aXRoIHplcm8tY29uZmlybWF0aW9uc1xuICBsZXQgemVyb0NvbmZVbnNwZW50VHhJZHM7XG5cbiAgLy8gVGhlIHN1bSBvZiB0aGUgaW5wdXQgdmFsdWVzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICBsZXQgaW5wdXRBbW91bnQ7XG5cbiAgbGV0IGNoYW5nZU91dHB1dHM6IE91dHB1dFtdID0gW107XG5cbiAgLy8gQWxsIG91dHB1dHMgZm9yIHRoZSB0cmFuc2FjdGlvbiAocmVjaXBpZW50cywgT1BfUkVUVVJOcywgY2hhbmdlLCBmZWVzKVxuICBsZXQgb3V0cHV0czogT3V0cHV0W10gPSBbXTtcblxuICBsZXQgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzID0gZmFsc2U7XG5cbiAgLy8gVGhlIHRyYW5zYWN0aW9uLlxuICBsZXQgdHJhbnNhY3Rpb24gPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uQnVpbGRlckZvck5ldHdvcmsobmV0d29yayk7XG5cbiAgY29uc3QgZ2V0Qml0R29GZWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRyeVByb21pc2UoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5nZXRCaXRHb0ZlZSh7IGFtb3VudDogdG90YWxPdXRwdXRBbW91bnQsIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50IH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5mZWUgPiAwKSB7XG4gICAgICAgICAgYml0Z29GZWVJbmZvID0ge1xuICAgICAgICAgICAgYW1vdW50OiByZXN1bHQuZmVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGJpdGdvRmVlSW5mbyAmJiBiaXRnb0ZlZUluZm8uYW1vdW50ID4gMCkge1xuICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGdldEJpdEdvRmVlQWRkcmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJ5UHJvbWlzZShmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGJpdGdvRmVlSW5mbywgb3IgYWRkcmVzcyBpcyBhbHJlYWR5IHNldCwgZG9uJ3QgZ2V0IGEgbmV3IG9uZVxuICAgICAgaWYgKCFiaXRnb0ZlZUluZm8gfHwgYml0Z29GZWVJbmZvLmFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJpdGdvLmdldEJpdEdvRmVlQWRkcmVzcygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBiaXRnb0ZlZUluZm8uYWRkcmVzcyA9IHJlc3VsdC5hZGRyZXNzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gR2V0IGEgZHluYW1pYyBmZWUgZXN0aW1hdGUgZnJvbSB0aGUgQml0R28gc2VydmVyIGlmIGZlZVR4Q29uZmlybVRhcmdldFxuICAvLyBpcyBzcGVjaWZpZWQgb3IgaWYgbm8gZmVlLXJlbGF0ZWQgcGFyYW1zIGFyZSBzcGVjaWZpZWRcbiAgY29uc3QgZ2V0RHluYW1pY0ZlZVJhdGVFc3RpbWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocGFyYW1zLmZlZVR4Q29uZmlybVRhcmdldCB8fCAhZmVlUGFyYW1zRGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGJpdGdvXG4gICAgICAgIC5lc3RpbWF0ZUZlZSh7XG4gICAgICAgICAgbnVtQmxvY2tzOiBwYXJhbXMuZmVlVHhDb25maXJtVGFyZ2V0LFxuICAgICAgICAgIG1heEZlZTogcGFyYW1zLm1heEZlZVJhdGUsXG4gICAgICAgICAgaW5wdXRzOiB6ZXJvQ29uZlVuc3BlbnRUeElkcyxcbiAgICAgICAgICB0eFNpemU6IGVzdFR4U2l6ZSxcbiAgICAgICAgICBjcGZwQXdhcmU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRGZWVSYXRlID0gcmVzdWx0LmNwZnBGZWVQZXJLYjtcbiAgICAgICAgICBjb25zdCBtaW5pbXVtID0gcGFyYW1zLmluc3RhbnRcbiAgICAgICAgICAgID8gTWF0aC5tYXgoY29uc3RhbnRzLm1pbkZlZVJhdGUsIGNvbnN0YW50cy5taW5JbnN0YW50RmVlUmF0ZSlcbiAgICAgICAgICAgIDogY29uc3RhbnRzLm1pbkZlZVJhdGU7XG4gICAgICAgICAgLy8gNSBzYXRvc2hpcyBwZXIgYnl0ZVxuICAgICAgICAgIC8vIGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBwYWRkaW5nIG9ubHkgYXBwbGllcyB3aGVuIHRoZSB0aHJlc2hvbGQgaXMgY3Jvc3NlZCwgYnV0IG5vdCB3aGVuIHRoZSBkZWx0YSBpcyBsZXNzIHRoYW4gdGhlIHBhZGRpbmdcbiAgICAgICAgICBjb25zdCBwYWRkaW5nID0gNTAwMDtcbiAgICAgICAgICBpZiAoZXN0aW1hdGVkRmVlUmF0ZSA8IG1pbmltdW0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSgpICtcbiAgICAgICAgICAgICAgICAnOiBFcnJvciB3aGVuIGVzdGltYXRpbmcgZmVlIGZvciBzZW5kIGZyb20gJyArXG4gICAgICAgICAgICAgICAgcGFyYW1zLndhbGxldC5pZCgpICtcbiAgICAgICAgICAgICAgICAnLCBpdCB3YXMgdG9vIGxvdyAtICcgK1xuICAgICAgICAgICAgICAgIGVzdGltYXRlZEZlZVJhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmZWVSYXRlID0gbWluaW11bSArIHBhZGRpbmc7XG4gICAgICAgICAgfSBlbHNlIGlmIChlc3RpbWF0ZWRGZWVSYXRlID4gcGFyYW1zLm1heEZlZVJhdGUpIHtcbiAgICAgICAgICAgIGZlZVJhdGUgPSBwYXJhbXMubWF4RmVlUmF0ZSAtIHBhZGRpbmc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZlZVJhdGUgPSBlc3RpbWF0ZWRGZWVSYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmVlUmF0ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgLy8gc2FuaXR5IGNoZWNrIGZhaWxlZCBvbiB0eCBzaXplXG4gICAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5tZXNzYWdlLCAnaW52YWxpZCB0eFNpemUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb3VsZG4ndCBlc3RpbWF0ZSB0aGUgZmVlLCBwcm9jZWVkIHVzaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICBmZWVSYXRlID0gY29uc3RhbnRzLmZhbGxiYWNrRmVlUmF0ZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBlc3RpbWF0aW5nIGZlZSBmb3Igc2VuZCBmcm9tICcgKyBwYXJhbXMud2FsbGV0LmlkKCkgKyAnOiAnICsgZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyBHZXQgdGhlIHVuc3BlbnRzIGZvciB0aGUgc2VuZGluZyB3YWxsZXQuXG4gIGNvbnN0IGdldFVuc3BlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChwYXJhbXMudW5zcGVudHMpIHtcbiAgICAgIC8vIHdlIGp1c3Qgd2FubmEgdXNlIGN1c3RvbSB1bnNwZW50c1xuICAgICAgdW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IGVub3VnaCB1bnNwZW50cyBmb3IgdGhlIHJlcXVlc3RlZCBhbW91bnRcbiAgICBjb25zdCBvcHRpb25zID0gXy5tZXJnZSh7fSwgcGFyYW1zLnVuc3BlbnRzRmV0Y2hQYXJhbXMgfHwge30sIHtcbiAgICAgIHRhcmdldDogdG90YWxBbW91bnQsXG4gICAgICBtaW5TaXplOiBwYXJhbXMubWluVW5zcGVudFNpemUgfHwgMCxcbiAgICAgIGluc3RhbnQ6IHBhcmFtcy5pbnN0YW50LCAvLyBpbnNpc3Qgb24gaW5zdGFudCB1bnNwZW50cyBvbmx5XG4gICAgICB0YXJnZXRXYWxsZXRVbnNwZW50czogcGFyYW1zLnRhcmdldFdhbGxldFVuc3BlbnRzLFxuICAgIH0pO1xuICAgIGlmIChwYXJhbXMuaW5zdGFudCkge1xuICAgICAgb3B0aW9ucy5pbnN0YW50ID0gcGFyYW1zLmluc3RhbnQ7IC8vIGluc2lzdCBvbiBpbnN0YW50IHVuc3BlbnRzIG9ubHlcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zLndhbGxldC51bnNwZW50c1BhZ2VkKG9wdGlvbnMpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBVbnNwZW50cyBmZXRjaGVkXFxuOiAgJHtKU09OLnN0cmluZ2lmeShyZXN1bHRzLCBudWxsLCAyKX1gKTtcbiAgICAgIHRvdGFsVW5zcGVudHNDb3VudCA9IHJlc3VsdHMudG90YWw7XG4gICAgICBmZXRjaGVkVW5zcGVudHNDb3VudCA9IHJlc3VsdHMuY291bnQ7XG4gICAgICB1bnNwZW50cyA9IHJlc3VsdHMudW5zcGVudHMuZmlsdGVyKGZ1bmN0aW9uICh1KSB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm1zID0gdS5jb25maXJtYXRpb25zIHx8IDA7XG4gICAgICAgIGlmICghcGFyYW1zLmVuZm9yY2VNaW5Db25maXJtc0ZvckNoYW5nZSAmJiB1LmlzQ2hhbmdlKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpcm1zID49IG1pbkNvbmZpcm1zO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGFib3J0IGVhcmx5IGlmIHRoZXJlJ3Mgbm8gdmlhYmxlIHVuc3BlbnRzLCBiZWNhdXNlIGl0IHdvbid0IGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSB0aGUgdHhuIGxhdGVyXG4gICAgICBpZiAodW5zcGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IEVycm9yKCcwIHVuc3BlbnRzIGF2YWlsYWJsZSBmb3IgdHJhbnNhY3Rpb24gY3JlYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgLy8gY3JlYXRlIGFycmF5IG9mIHVuY29uZmlybWVkIHVuc3BlbnQgSUQgc3RyaW5ncyBvZiB0aGUgZm9ybSBcInR4SGFzaDpvdXRwdXRJbmRleFwiXG4gICAgICB6ZXJvQ29uZlVuc3BlbnRUeElkcyA9IF8ocmVzdWx0cy51bnNwZW50cylcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgICAgICAgIHJldHVybiAhdS5jb25maXJtYXRpb25zO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgICAgICAgcmV0dXJuIHUudHhfaGFzaCArICc6JyArIHUudHhfb3V0cHV0X247XG4gICAgICAgIH0pXG4gICAgICAgIC52YWx1ZSgpO1xuICAgICAgaWYgKF8uaXNFbXB0eSh6ZXJvQ29uZlVuc3BlbnRUeElkcykpIHtcbiAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBwYXNzIGFuIGVtcHR5IGFycmF5IG9mIGlucHV0cyB0byB0aGUgc2VydmVyLCBiZWNhdXNlIGl0IGFzc3VtZXMgaWYgdGhlXG4gICAgICAgIC8vIGlucHV0cyBhcmd1bWVudHMgZXhpc3RzLCBpdCBjb250YWlucyB2YWx1ZXNcbiAgICAgICAgemVyb0NvbmZVbnNwZW50VHhJZHMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcmVzcGVjdCB0aGUgb2xkIHNwbGl0Q2hhbmdlU2l6ZT0wIHBhcmFtZXRlclxuICAgICAgaWYgKCFwYXJhbXMubm9TcGxpdENoYW5nZSAmJiBwYXJhbXMuc3BsaXRDaGFuZ2VTaXplICE9PSAwKSB7XG4gICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cyA9IHJlc3VsdHMuZXh0cmFDaGFuZ2VBbW91bnRzIHx8IFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIC8vIEdldCB0aGUgdW5zcGVudHMgZm9yIHRoZSBzaW5nbGUga2V5IGZlZSBhZGRyZXNzXG4gIGxldCBmZWVTaW5nbGVLZXlVbnNwZW50czogQml0R29VbnNwZW50W10gPSBbXTtcbiAgY29uc3QgZ2V0VW5zcGVudHNGb3JTaW5nbGVLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MpIHtcbiAgICAgIGxldCBmZWVUYXJnZXQgPSAwLjAxZTg7XG4gICAgICBpZiAocGFyYW1zLmluc3RhbnQpIHtcbiAgICAgICAgZmVlVGFyZ2V0ICs9IHRvdGFsQW1vdW50ICogMC4wMDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gYml0Z29cbiAgICAgICAgLmdldChiaXRnby51cmwoJy9hZGRyZXNzLycgKyBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzICsgJy91bnNwZW50cz90YXJnZXQ9JyArIGZlZVRhcmdldCkpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5ib2R5LnRvdGFsIDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gdW5zcGVudHMgYXZhaWxhYmxlIGluIHNpbmdsZSBrZXkgZmVlIHNvdXJjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmZWVTaW5nbGVLZXlVbnNwZW50cyA9IHJlc3BvbnNlLmJvZHkudW5zcGVudHM7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBsZXQgbWluZXJGZWVJbmZvOiBhbnkgPSB7fTtcbiAgbGV0IHR4SW5mbzogYW55ID0ge307XG5cbiAgLy8gSXRlcmF0ZSB1bnNwZW50cywgc3VtIHRoZSBpbnB1dHMsIGFuZCBzYXZlIF9pbnB1dHMgd2l0aCB0aGUgdG90YWxcbiAgLy8gaW5wdXQgYW1vdW50IGFuZCBmaW5hbCBsaXN0IG9mIGlucHV0cyB0byB1c2Ugd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gIGxldCBmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQ6IEJpdEdvVW5zcGVudFtdID0gW107XG5cbiAgY29uc3QgY29sbGVjdElucHV0cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXVuc3BlbnRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyB1bnNwZW50cyBhdmFpbGFibGUgb24gd2FsbGV0Jyk7XG4gICAgfVxuICAgIGlucHV0QW1vdW50ID0gMDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgY29zdCBvZiBzcGVuZGluZyBhIHNpbmdsZSBpbnB1dCwgaS5lLiB0aGUgc21hbGxlc3QgZWNvbm9taWNhbCB1bnNwZW50IHZhbHVlXG4gICAgcmV0dXJuIHRyeVByb21pc2UoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF8uaXNOdW1iZXIocGFyYW1zLmZlZVJhdGUpIHx8IF8uaXNOdW1iZXIocGFyYW1zLm9yaWdpbmFsRmVlUmF0ZSkpIHtcbiAgICAgICAgcmV0dXJuICFfLmlzVW5kZWZpbmVkKHBhcmFtcy5mZWVSYXRlKSA/IHBhcmFtcy5mZWVSYXRlIDogcGFyYW1zLm9yaWdpbmFsRmVlUmF0ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBiaXRnb1xuICAgICAgICAgIC5lc3RpbWF0ZUZlZSh7XG4gICAgICAgICAgICBudW1CbG9ja3M6IHBhcmFtcy5mZWVUeENvbmZpcm1UYXJnZXQsXG4gICAgICAgICAgICBtYXhGZWU6IHBhcmFtcy5tYXhGZWVSYXRlLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGVFc3RpbWF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZlZVJhdGVFc3RpbWF0ZS5mZWVQZXJLYjtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KVxuICAgICAgLnRoZW4oZnVuY3Rpb24gKGZlZVJhdGUpIHtcbiAgICAgICAgLy8gRG9uJ3Qgc3BlbmQgaW5wdXRzIHRoYXQgY2Fubm90IHBheSBmb3IgdGhlaXIgb3duIGNvc3QuXG4gICAgICAgIGxldCBtaW5JbnB1dFZhbHVlID0gMDtcbiAgICAgICAgaWYgKF8uaXNJbnRlZ2VyKHBhcmFtcy5taW5VbnNwZW50U2l6ZSkpIHtcbiAgICAgICAgICBtaW5JbnB1dFZhbHVlID0gcGFyYW1zLm1pblVuc3BlbnRTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBydW5lZFVuc3BlbnRDb3VudCA9IDA7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVW5zcGVudENvdW50ID0gdW5zcGVudHMubGVuZ3RoO1xuICAgICAgICB1bnNwZW50cyA9IF8uZmlsdGVyKHVuc3BlbnRzLCBmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgICAgIGNvbnN0IGlzU2Vnd2l0SW5wdXQgPSAhIXVuc3BlbnQud2l0bmVzc1NjcmlwdDtcbiAgICAgICAgICBjb25zdCBjdXJyZW50SW5wdXRTaXplID0gaXNTZWd3aXRJbnB1dCA/IFZpcnR1YWxTaXplcy50eFAyc2hQMndzaElucHV0U2l6ZSA6IFZpcnR1YWxTaXplcy50eFAyc2hJbnB1dFNpemU7XG4gICAgICAgICAgY29uc3QgZmVlQmFzZWRNaW5JbnB1dFZhbHVlID0gKGZlZVJhdGUgKiBjdXJyZW50SW5wdXRTaXplKSAvIDEwMDA7XG4gICAgICAgICAgY29uc3QgY3VycmVudE1pbklucHV0VmFsdWUgPSBNYXRoLm1heChtaW5JbnB1dFZhbHVlLCBmZWVCYXNlZE1pbklucHV0VmFsdWUpO1xuICAgICAgICAgIGlmIChjdXJyZW50TWluSW5wdXRWYWx1ZSA+IHVuc3BlbnQudmFsdWUpIHtcbiAgICAgICAgICAgIC8vIHBydW5pbmcgdW5zcGVudFxuICAgICAgICAgICAgY29uc3QgcHJ1bmVEZXRhaWxzID0ge1xuICAgICAgICAgICAgICBnZW5lcmFsTWluSW5wdXRWYWx1ZTogbWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlQmFzZWRNaW5JbnB1dFZhbHVlLFxuICAgICAgICAgICAgICBjdXJyZW50TWluSW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZSxcbiAgICAgICAgICAgICAgaW5wdXRTaXplOiBjdXJyZW50SW5wdXRTaXplLFxuICAgICAgICAgICAgICB1bnNwZW50OiB1bnNwZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlYnVnKGBwcnVuaW5nIHVuc3BlbnQ6ICR7SlNPTi5zdHJpbmdpZnkocHJ1bmVEZXRhaWxzLCBudWxsLCA0KX1gKTtcbiAgICAgICAgICAgIHBydW5lZFVuc3BlbnRDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBydW5lZFVuc3BlbnRDb3VudCA+IDApIHtcbiAgICAgICAgICBkZWJ1ZyhgcHJ1bmVkICR7cHJ1bmVkVW5zcGVudENvdW50fSBvdXQgb2YgJHtvcmlnaW5hbFVuc3BlbnRDb3VudH0gdW5zcGVudHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1bnNwZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luc3VmZmljaWVudCBmdW5kcycpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWd3aXRJbnB1dENvdW50ID0gMDtcbiAgICAgICAgdW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICBpZiAodW5zcGVudC53aXRuZXNzU2NyaXB0KSB7XG4gICAgICAgICAgICBzZWd3aXRJbnB1dENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uLCAweGZmZmZmZmZmKTtcblxuICAgICAgICAgIHJldHVybiBpbnB1dEFtb3VudCA8IChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gdG90YWxPdXRwdXRBbW91bnQgOiB0b3RhbEFtb3VudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGlmIHBheWluZyBmZWVzIGZyb20gYW4gZXh0ZXJuYWwgc2luZ2xlIGtleSB3YWxsZXQsIGFkZCB0aGUgaW5wdXRzXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgLy8gY29sbGVjdCB0aGUgYW1vdW50IHVzZWQgaW4gdGhlIGZlZSBpbnB1dHMgc28gd2UgY2FuIGdldCBjaGFuZ2UgbGF0ZXJcbiAgICAgICAgICBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkID0gW107XG4gICAgICAgICAgZmVlU2luZ2xlS2V5VW5zcGVudHMuZXZlcnkoZnVuY3Rpb24gKHVuc3BlbnQpIHtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50ICs9IHVuc3BlbnQudmFsdWU7XG4gICAgICAgICAgICBpbnB1dEFtb3VudCArPSB1bnNwZW50LnZhbHVlO1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24uYWRkSW5wdXQodW5zcGVudC50eF9oYXNoLCB1bnNwZW50LnR4X291dHB1dF9uKTtcbiAgICAgICAgICAgIGZlZVNpbmdsZUtleVVuc3BlbnRzVXNlZC5wdXNoKHVuc3BlbnQpO1xuICAgICAgICAgICAgLy8gdXNlIHRoZSBmZWUgd2FsbGV0IHRvIHBheSBtaW5lciBmZWVzIGFuZCBwb3RlbnRpYWxseSBpbnN0YW50IGZlZXNcbiAgICAgICAgICAgIHJldHVybiBmZWVTaW5nbGVLZXlJbnB1dEFtb3VudCA8IGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0eEluZm8gPSB7XG4gICAgICAgICAgblAyc2hJbnB1dHM6IHRyYW5zYWN0aW9uLnR4Lmlucy5sZW5ndGggLSAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSAtIHNlZ3dpdElucHV0Q291bnQsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogc2Vnd2l0SW5wdXRDb3VudCxcbiAgICAgICAgICBuUDJwa2hJbnB1dHM6IGZlZVNpbmdsZUtleVNvdXJjZUFkZHJlc3MgPyAxIDogMCxcbiAgICAgICAgICAvLyBhZGQgc2luZ2xlIGtleSBzb3VyY2UgYWRkcmVzcyBjaGFuZ2VcbiAgICAgICAgICBuT3V0cHV0czpcbiAgICAgICAgICAgIHJlY2lwaWVudHMubGVuZ3RoICtcbiAgICAgICAgICAgIDEgKyAvLyByZWNpcGllbnRzIGFuZCBjaGFuZ2VcbiAgICAgICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cy5sZW5ndGggKyAvLyBleHRyYSBjaGFuZ2Ugc3BsaXR0aW5nXG4gICAgICAgICAgICAoYml0Z29GZWVJbmZvICYmIGJpdGdvRmVlSW5mby5hbW91bnQgPiAwID8gMSA6IDApICsgLy8gYWRkIG91dHB1dCBmb3IgYml0Z28gZmVlXG4gICAgICAgICAgICAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcyA/IDEgOiAwKSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBBcyBwZXIgdGhlIHJlc3BvbnNlIG9mIGdldCB1bnNwZW50cyBBUEksIGZvciB2MSBzYWZlIHdhbGxldHMgcmVkZWVtU2NyaXB0IGlzIHJldHVybmVkXG4gICAgICAgIC8vIGluIHRoZSByZXNwb25zZSBpbiBoZXggZm9ybWF0XG4gICAgICAgIGNvbnRhaW5zVW5jb21wcmVzc2VkUHVibGljS2V5cyA9IHVuc3BlbnRzLnNvbWUoXG4gICAgICAgICAgKHUpID0+IHUucmVkZWVtU2NyaXB0Lmxlbmd0aCA9PT0gMjAxICogMiAvKiBoZXggbGVuZ3RoIGlzIHR3aWNlIHRoZSBsZW5ndGggaW4gYnl0ZXMgKi9cbiAgICAgICAgKTtcblxuICAgICAgICBlc3RUeFNpemUgPSBlc3RpbWF0ZVRyYW5zYWN0aW9uU2l6ZSh7XG4gICAgICAgICAgY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzLFxuICAgICAgICAgIG5QMnNoSW5wdXRzOiB0eEluZm8ublAyc2hJbnB1dHMsXG4gICAgICAgICAgblAyc2hQMndzaElucHV0czogdHhJbmZvLm5QMnNoUDJ3c2hJbnB1dHMsXG4gICAgICAgICAgblAycGtoSW5wdXRzOiB0eEluZm8ublAycGtoSW5wdXRzLFxuICAgICAgICAgIG5PdXRwdXRzOiB0eEluZm8ubk91dHB1dHMsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKGdldER5bmFtaWNGZWVSYXRlRXN0aW1hdGUpXG4gICAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1pbmVyRmVlSW5mbyA9IGV4cG9ydHMuY2FsY3VsYXRlTWluZXJGZWVJbmZvKHtcbiAgICAgICAgICBiaXRnbzogcGFyYW1zLndhbGxldC5iaXRnbyxcbiAgICAgICAgICBjb250YWluc1VuY29tcHJlc3NlZFB1YmxpY0tleXMsXG4gICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICBuUDJzaElucHV0czogdHhJbmZvLm5QMnNoSW5wdXRzLFxuICAgICAgICAgIG5QMnNoUDJ3c2hJbnB1dHM6IHR4SW5mby5uUDJzaFAyd3NoSW5wdXRzLFxuICAgICAgICAgIG5QMnBraElucHV0czogdHhJbmZvLm5QMnBraElucHV0cyxcbiAgICAgICAgICBuT3V0cHV0czogdHhJbmZvLm5PdXRwdXRzLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2hvdWxkQ29tcHV0ZUJlc3RGZWUpIHtcbiAgICAgICAgICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IG1pbmVyRmVlSW5mby5mZWU7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkUmVjdXJzZSA9IF8uaXNVbmRlZmluZWQoZmVlKSB8fCBhcHByb3hpbWF0ZUZlZSA+IGZlZTtcbiAgICAgICAgICBmZWUgPSBhcHByb3hpbWF0ZUZlZTtcbiAgICAgICAgICAvLyBSZWNvbXB1dGUgdG90YWxBbW91bnQgZnJvbSBzY3JhdGNoXG4gICAgICAgICAgdG90YWxBbW91bnQgPSBmZWUgKyB0b3RhbE91dHB1dEFtb3VudDtcbiAgICAgICAgICBpZiAoYml0Z29GZWVJbmZvKSB7XG4gICAgICAgICAgICB0b3RhbEFtb3VudCArPSBiaXRnb0ZlZUluZm8uYW1vdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2hvdWxkUmVjdXJzZSkge1xuICAgICAgICAgICAgLy8gaWYgZmVlIGNoYW5nZWQsIHJlLWNvbGxlY3QgaW5wdXRzXG4gICAgICAgICAgICBpbnB1dEFtb3VudCA9IDA7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbiA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25CdWlsZGVyRm9yTmV0d29yayhuZXR3b3JrKTtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0SW5wdXRzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxGZWUgPSBmZWUgKyAoYml0Z29GZWVJbmZvID8gYml0Z29GZWVJbmZvLmFtb3VudCA6IDApO1xuXG4gICAgICAgIGlmIChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzKSB7XG4gICAgICAgICAgY29uc3Qgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHMgPSBfLnN1bUJ5KGZlZVNpbmdsZUtleVVuc3BlbnRzLCAndmFsdWUnKTtcbiAgICAgICAgICBpZiAodG90YWxGZWUgPiBzdW1tZWRTaW5nbGVLZXlVbnNwZW50cykge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnN1ZmZpY2llbnQgZmVlIGFtb3VudCBhdmFpbGFibGUgaW4gc2luZ2xlIGtleSBmZWUgc291cmNlOiAnICsgc3VtbWVkU2luZ2xlS2V5VW5zcGVudHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIucmVzdWx0ID0ge1xuICAgICAgICAgICAgICBmZWU6IGZlZSxcbiAgICAgICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICAgICAgZXN0aW1hdGVkU2l6ZTogbWluZXJGZWVJbmZvLnNpemUsXG4gICAgICAgICAgICAgIGF2YWlsYWJsZTogaW5wdXRBbW91bnQsXG4gICAgICAgICAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICAgICAgICAgIHR4SW5mbzogdHhJbmZvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnB1dEFtb3VudCA8IChmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzID8gdG90YWxPdXRwdXRBbW91bnQgOiB0b3RhbEFtb3VudCkpIHtcbiAgICAgICAgICAvLyBUaGUgdW5zcGVudHMgd2UncmUgdXNpbmcgZm9yIGlucHV0cyBkbyBub3QgaGF2ZSBzdWZmaWNpZW50IHZhbHVlIG9uIHRoZW0gdG9cbiAgICAgICAgICAvLyBzYXRpc2Z5IHRoZSB1c2VyJ3MgcmVxdWVzdGVkIHNwZW5kIGFtb3VudC4gVGhhdCBtYXkgYmUgYmVjYXVzZSB0aGUgd2FsbGV0J3MgYmFsYW5jZVxuICAgICAgICAgIC8vIGlzIHNpbXBseSB0b28gbG93LCBvciBpdCBtaWdodCBiZSB0aGF0IHRoZSB3YWxsZXQncyBiYWxhbmNlIGlzIHN1ZmZpY2llbnQgYnV0XG4gICAgICAgICAgLy8gd2UgZGlkbid0IGZldGNoIGVub3VnaCB1bnNwZW50cy4gVG9vIGZldyB1bnNwZW50cyBjb3VsZCByZXN1bHQgZnJvbSB0aGUgd2FsbGV0XG4gICAgICAgICAgLy8gaGF2aW5nIG1hbnkgc21hbGwgdW5zcGVudHMgYW5kIHdlIGhpdCBvdXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBpbnB1dHMgd2UgY2FuIHVzZVxuICAgICAgICAgIC8vIGluIGEgdHhuLCBvciBpdCBtaWdodCBoYXZlIGJlZW4gdGhhdCB0aGUgZmlsdGVycyB0aGUgdXNlciBwYXNzZWQgaW4gKGxpa2UgbWluQ29uZmlybXMpXG4gICAgICAgICAgLy8gZGlzcXVhbGlmaWVkIHRvbyBtYW55IG9mIHRoZSB1bnNwZW50c1xuICAgICAgICAgIGxldCBlcnI7XG4gICAgICAgICAgaWYgKHRvdGFsVW5zcGVudHNDb3VudCA9PT0gZmV0Y2hlZFVuc3BlbnRzQ291bnQpIHtcbiAgICAgICAgICAgIC8vIHdlIGZldGNoZWQgZXZlcnkgdW5zcGVudCB0aGUgd2FsbGV0IGhhZCwgYnV0IGl0IHN0aWxsIHdhc24ndCBlbm91Z2hcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcignSW5zdWZmaWNpZW50IGZ1bmRzJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdlIHdlcmVuJ3QgYWJsZSB0byBmZXRjaCBhbGwgdGhlIHVuc3BlbnRzIG9uIHRoZSB3YWxsZXRcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRyYW5zYWN0aW9uIHNpemUgdG9vIGxhcmdlIGR1ZSB0byB0b28gbWFueSB1bnNwZW50cy4gQ2FuIHNlbmQgb25seSAke2lucHV0QW1vdW50fSBzYXRvc2hpcyBpbiB0aGlzIHRyYW5zYWN0aW9uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyLnJlc3VsdCA9IHtcbiAgICAgICAgICAgIGZlZTogZmVlLFxuICAgICAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgICAgIGVzdGltYXRlZFNpemU6IG1pbmVyRmVlSW5mby5zaXplLFxuICAgICAgICAgICAgYXZhaWxhYmxlOiBpbnB1dEFtb3VudCxcbiAgICAgICAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICAgICAgICB0eEluZm86IHR4SW5mbyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfTtcblxuICAvLyBBZGQgdGhlIG91dHB1dHMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gIGNvbnN0IGNvbGxlY3RPdXRwdXRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChtaW5lckZlZUluZm8uc2l6ZSA+PSA5MDAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0cmFuc2FjdGlvbiB0b28gbGFyZ2U6IGVzdGltYXRlZCBzaXplICcgKyBtaW5lckZlZUluZm8uc2l6ZSArICcgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBvdXRwdXRzIGFycmF5ICh1c2Ugb3V0ZXIgc2NvcGUgdmFyaWFibGUpXG4gICAgb3V0cHV0cyA9IFtdO1xuXG4gICAgcmVjaXBpZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWNpcGllbnQpIHtcbiAgICAgIGxldCBzY3JpcHQ7XG4gICAgICBpZiAoXy5pc1N0cmluZyhyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgICAgc2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBuZXR3b3JrKTtcbiAgICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChyZWNpcGllbnQuc2NyaXB0KSkge1xuICAgICAgICBzY3JpcHQgPSByZWNpcGllbnQuc2NyaXB0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWl0aGVyIHJlY2lwaWVudCBhZGRyZXNzIG5vciBzY3JpcHQgd2FzIHByb3ZpZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkYXRlIHRyYXZlbEluZm8gaWYgaXQgZXhpc3RzXG4gICAgICBsZXQgdHJhdmVsSW5mbztcbiAgICAgIGlmICghXy5pc0VtcHR5KHJlY2lwaWVudC50cmF2ZWxJbmZvKSkge1xuICAgICAgICB0cmF2ZWxJbmZvID0gcmVjaXBpZW50LnRyYXZlbEluZm87XG4gICAgICAgIC8vIEJldHRlciB0byBhdm9pZCB0cm91YmxlIG5vdywgYmVmb3JlIHR4IGlzIGNyZWF0ZWRcbiAgICAgICAgYml0Z28udHJhdmVsUnVsZSgpLnZhbGlkYXRlVHJhdmVsSW5mbyh0cmF2ZWxJbmZvKTtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgc2NyaXB0OiBzY3JpcHQsXG4gICAgICAgIGFtb3VudDogcmVjaXBpZW50LmFtb3VudCxcbiAgICAgICAgdHJhdmVsSW5mbzogdHJhdmVsSW5mbyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgb3BSZXR1cm5zLmZvckVhY2goZnVuY3Rpb24gKHsgbWVzc2FnZSwgYW1vdW50IH0pIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IHV0eG9saWIuc2NyaXB0LmZyb21BU00oJ09QX1JFVFVSTiAnICsgQnVmZmVyLmZyb20obWVzc2FnZSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICAgIG91dHB1dHMucHVzaCh7IHNjcmlwdCwgYW1vdW50IH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZ2V0Q2hhbmdlT3V0cHV0cyA9IGZ1bmN0aW9uIChjaGFuZ2VBbW91bnQ6IG51bWJlcik6IE91dHB1dFtdIHwgUHJvbWlzZTxPdXRwdXRbXT4ge1xuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWdhdGl2ZSBjaGFuZ2UgYW1vdW50OiAnICsgY2hhbmdlQW1vdW50KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0OiBPdXRwdXRbXSA9IFtdO1xuICAgICAgLy8gaWYgd2UgcGFpZCBmZWVzIGZyb20gYSBzaW5nbGUga2V5IHdhbGxldCwgcmV0dXJuIHRoZSBmZWUgY2hhbmdlIGZpcnN0XG4gICAgICBpZiAoZmVlU2luZ2xlS2V5U291cmNlQWRkcmVzcykge1xuICAgICAgICBjb25zdCBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQgPVxuICAgICAgICAgIGZlZVNpbmdsZUtleUlucHV0QW1vdW50IC0gKGZlZSArIChiaXRnb0ZlZUluZm8gPyBiaXRnb0ZlZUluZm8uYW1vdW50IDogMCkpO1xuICAgICAgICBpZiAoZmVlU2luZ2xlS2V5V2FsbGV0Q2hhbmdlQW1vdW50ID49IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyBhZGRyZXNzOiBmZWVTaW5nbGVLZXlTb3VyY2VBZGRyZXNzLCBhbW91bnQ6IGZlZVNpbmdsZUtleVdhbGxldENoYW5nZUFtb3VudCB9KTtcbiAgICAgICAgICBjaGFuZ2VBbW91bnQgPSBjaGFuZ2VBbW91bnQgLSBmZWVTaW5nbGVLZXlXYWxsZXRDaGFuZ2VBbW91bnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZUFtb3VudCA8IGNvbnN0YW50cy5taW5PdXRwdXRTaXplKSB7XG4gICAgICAgIC8vIEdpdmUgaXQgdG8gdGhlIG1pbmVyc1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLndhbGxldC50eXBlKCkgPT09ICdzYWZlJykge1xuICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5hZGRyZXNzZXMoKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogcmVzcG9uc2UuYWRkcmVzc2VzWzBdLmFkZHJlc3MsIGFtb3VudDogY2hhbmdlQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBsZXQgZXh0cmFDaGFuZ2VUb3RhbCA9IF8uc3VtKGV4dHJhQ2hhbmdlQW1vdW50cyk7XG4gICAgICAvLyBTYW5pdHkgY2hlY2tcbiAgICAgIGlmIChleHRyYUNoYW5nZVRvdGFsID4gY2hhbmdlQW1vdW50KSB7XG4gICAgICAgIGV4dHJhQ2hhbmdlQW1vdW50cyA9IFtdO1xuICAgICAgICBleHRyYUNoYW5nZVRvdGFsID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gY29weSBhbmQgYWRkIHJlbWFpbmluZyBjaGFuZ2UgYW1vdW50XG4gICAgICBjb25zdCBhbGxDaGFuZ2VBbW91bnRzID0gZXh0cmFDaGFuZ2VBbW91bnRzLnNsaWNlKDApO1xuICAgICAgYWxsQ2hhbmdlQW1vdW50cy5wdXNoKGNoYW5nZUFtb3VudCAtIGV4dHJhQ2hhbmdlVG90YWwpO1xuXG4gICAgICAvLyBSZWN1cnNpdmUgYXN5bmMgZnVuYyB0byBhZGQgYWxsIGNoYW5nZSBvdXRwdXRzXG4gICAgICBjb25zdCBhZGRDaGFuZ2VPdXRwdXRzID0gZnVuY3Rpb24gKCk6IE91dHB1dFtdIHwgUHJvbWlzZTxPdXRwdXRbXT4ge1xuICAgICAgICBjb25zdCB0aGlzQW1vdW50ID0gYWxsQ2hhbmdlQW1vdW50cy5zaGlmdCgpO1xuICAgICAgICBpZiAoIXRoaXNBbW91bnQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnlQcm9taXNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocGFyYW1zLmNoYW5nZUFkZHJlc3MpIHtcbiAgICAgICAgICAgIC8vIElmIHVzZXIgcGFzc2VkIGEgY2hhbmdlIGFkZHJlc3MsIHVzZSBpdCBmb3IgYWxsIG91dHB1dHNcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXMuY2hhbmdlQWRkcmVzcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBhZGRyZXNzIHBlciBvdXRwdXQsIGZvciBwcml2YWN5XG4gICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgc2Vnd2l0IG9yIG5vdFxuICAgICAgICAgICAgY29uc3QgY2hhbmdlQ2hhaW4gPSBwYXJhbXMud2FsbGV0LmdldENoYW5nZUNoYWluKHBhcmFtcyk7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1zLndhbGxldC5jcmVhdGVBZGRyZXNzKHsgY2hhaW46IGNoYW5nZUNoYWluLCB2YWxpZGF0ZTogdmFsaWRhdGUgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuYWRkcmVzcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYWRkcmVzcykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHsgYWRkcmVzczogYWRkcmVzcywgYW1vdW50OiB0aGlzQW1vdW50IH0pO1xuICAgICAgICAgIHJldHVybiBhZGRDaGFuZ2VPdXRwdXRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFkZENoYW5nZU91dHB1dHMoKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNoYW5nZSBvdXRwdXQocykgYW5kIGluc3RhbnQgZmVlIG91dHB1dCBpZiBhcHBsaWNhYmxlXG4gICAgcmV0dXJuIHRyeVByb21pc2UoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldENoYW5nZU91dHB1dHMoaW5wdXRBbW91bnQgLSB0b3RhbEFtb3VudCk7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBjaGFuZ2VPdXRwdXRzID0gcmVzdWx0O1xuICAgICAgY29uc3QgZXh0cmFPdXRwdXRzID0gY2hhbmdlT3V0cHV0cy5jb25jYXQoW10pOyAvLyBjb3B5IHRoZSBhcnJheVxuICAgICAgaWYgKGJpdGdvRmVlSW5mbyAmJiBiaXRnb0ZlZUluZm8uYW1vdW50ID4gMCkge1xuICAgICAgICBleHRyYU91dHB1dHMucHVzaChiaXRnb0ZlZUluZm8pO1xuICAgICAgfVxuICAgICAgZXh0cmFPdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dCkge1xuICAgICAgICBpZiAoKG91dHB1dCBhcyBBZGRyZXNzT3V0cHV0KS5hZGRyZXNzKSB7XG4gICAgICAgICAgKG91dHB1dCBhcyBTY3JpcHRPdXRwdXQpLnNjcmlwdCA9IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdCgob3V0cHV0IGFzIEFkZHJlc3NPdXRwdXQpLmFkZHJlc3MsIG5ldHdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGVjaWRlIHdoZXJlIHRvIHB1dCB0aGUgb3V0cHV0cyAtIGRlZmF1bHQgaXMgdG8gcmFuZG9taXplIHVubGVzcyBmb3JjZWQgdG8gZW5kXG4gICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gcGFyYW1zLmZvcmNlQ2hhbmdlQXRFbmQgPyBvdXRwdXRzLmxlbmd0aCA6IF8ucmFuZG9tKDAsIG91dHB1dHMubGVuZ3RoKTtcbiAgICAgICAgb3V0cHV0cy5zcGxpY2Uob3V0cHV0SW5kZXgsIDAsIG91dHB1dCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGFsbCBvdXRwdXRzIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgICAgb3V0cHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChvdXRwdXQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uYWRkT3V0cHV0KChvdXRwdXQgYXMgU2NyaXB0T3V0cHV0KS5zY3JpcHQsIG91dHB1dC5hbW91bnQpO1xuICAgICAgfSk7XG5cbiAgICAgIHRyYXZlbEluZm9zID0gXyhvdXRwdXRzKVxuICAgICAgICAubWFwKGZ1bmN0aW9uIChvdXRwdXQsIGluZGV4KSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3V0cHV0LnRyYXZlbEluZm87XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5vdXRwdXRJbmRleCA9IGluZGV4O1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKVxuICAgICAgICAudmFsdWUoKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyBCdWlsZCBQU0JUIHdpdGggYWxsIHNpZ25pbmcgbWV0YWRhdGEgZW1iZWRkZWRcbiAgY29uc3QgYnVpbGRQc2J0ID0gZnVuY3Rpb24gKCk6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICAgIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcblxuICAgIC8vIE5lZWQgd2FsbGV0IGtleWNoYWlucyBmb3IgUFNCVCBtZXRhZGF0YVxuICAgIGNvbnN0IHdhbGxldEtleWNoYWlucyA9IHBhcmFtcy53YWxsZXQua2V5Y2hhaW5zO1xuICAgIGlmICghd2FsbGV0S2V5Y2hhaW5zIHx8IHdhbGxldEtleWNoYWlucy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGtleWNoYWlucyByZXF1aXJlZCBmb3IgUFNCVCBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByb290V2FsbGV0S2V5cyA9IGNyZWF0ZVJvb3RXYWxsZXRLZXlzRnJvbVYxS2V5Y2hhaW5zKHdhbGxldEtleWNoYWlucyk7XG4gICAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCByb290V2FsbGV0S2V5cyk7XG5cbiAgICAvLyBBZGQgbXVsdGlzaWcgaW5wdXRzIHdpdGggUFNCVCBtZXRhZGF0YVxuICAgIGZvciAoY29uc3QgdW5zcGVudCBvZiB1bnNwZW50cykge1xuICAgICAgY29uc3QgeyBjaGFpbiwgaW5kZXggfSA9IHBhcnNlQ2hhaW5QYXRoKHVuc3BlbnQuY2hhaW5QYXRoKSBhcyB7IGNoYWluOiB1dHhvbGliLmJpdGdvLkNoYWluQ29kZTsgaW5kZXg6IG51bWJlciB9O1xuXG4gICAgICBjb25zdCB3YWxsZXRVbnNwZW50OiB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8YmlnaW50PiA9IHtcbiAgICAgICAgaWQ6IGAke3Vuc3BlbnQudHhfaGFzaH06JHt1bnNwZW50LnR4X291dHB1dF9ufWAsXG4gICAgICAgIGFkZHJlc3M6IHVuc3BlbnQuYWRkcmVzcyxcbiAgICAgICAgY2hhaW4sXG4gICAgICAgIGluZGV4LFxuICAgICAgICB2YWx1ZTogQmlnSW50KHVuc3BlbnQudmFsdWUpLFxuICAgICAgfTtcblxuICAgICAgdXR4b2xpYi5iaXRnby5hZGRXYWxsZXRVbnNwZW50VG9Qc2J0KHBzYnQsIHdhbGxldFVuc3BlbnQsIHJvb3RXYWxsZXRLZXlzLCAndXNlcicsICdiYWNrdXAnLCB7XG4gICAgICAgIHNraXBOb25XaXRuZXNzVXR4bzogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEZlZSBzaW5nbGUga2V5IGlucHV0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFBTQlQgeWV0IC0gdGhyb3cgdG8gdHJpZ2dlciBmYWxsYmFjayB0byBsZWdhY3lcbiAgICBpZiAoZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUFNCVCBkb2VzIG5vdCBzdXBwb3J0IGZlZVNpbmdsZUtleSBpbnB1dHMgLSB1c2UgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIEFkZCBvdXRwdXRzIChyZWNpcGllbnRzLCBjaGFuZ2UsIGZlZXMsIE9QX1JFVFVSTnMpIC0gYWxyZWFkeSBjYWxjdWxhdGVkIGluIG91dHB1dHMgYXJyYXlcbiAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICBwc2J0LmFkZE91dHB1dCh7XG4gICAgICAgIHNjcmlwdDogKG91dHB1dCBhcyBTY3JpcHRPdXRwdXQpLnNjcmlwdCxcbiAgICAgICAgdmFsdWU6IEJpZ0ludChvdXRwdXQuYW1vdW50KSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwc2J0O1xuICB9O1xuXG4gIC8vIFNlcmlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24sIHJldHVybmluZyB3aGF0IGlzIG5lZWRlZCB0byBzaWduIGl0XG4gIGNvbnN0IHNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBCdWlsZCBhbmQgcmV0dXJuIFBTQlQgZm9ybWF0IHdoZW4gdXNlUHNidCBpcyBleHBsaWNpdGx5IHRydWVcbiAgICAvLyBQU0JUIGhleCBpcyByZXR1cm5lZCBpbiB0cmFuc2FjdGlvbkhleCBmaWVsZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIC8vIFVzZSB1dHhvbGliLmJpdGdvLmlzUHNidCgpIHRvIGRldGVjdCBpZiB0cmFuc2FjdGlvbkhleCBjb250YWlucyBQU0JUIG9yIGxlZ2FjeSB0eFxuICAgIGlmIChwYXJhbXMudXNlUHNidCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHNidCA9IGJ1aWxkUHNidCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNhY3Rpb25IZXg6IHBzYnQudG9IZXgoKSxcbiAgICAgICAgZmVlOiBmZWUsXG4gICAgICAgIGNoYW5nZUFkZHJlc3NlczogY2hhbmdlT3V0cHV0cy5tYXAoZnVuY3Rpb24gKGNvKSB7XG4gICAgICAgICAgcmV0dXJuIF8ucGljayhjbywgWydhZGRyZXNzJywgJ3BhdGgnLCAnYW1vdW50J10pO1xuICAgICAgICB9KSxcbiAgICAgICAgd2FsbGV0SWQ6IHBhcmFtcy53YWxsZXQuaWQoKSxcbiAgICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgICAgaW5zdGFudDogcGFyYW1zLmluc3RhbnQsXG4gICAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICAgIGVzdGltYXRlZFNpemU6IG1pbmVyRmVlSW5mby5zaXplLFxuICAgICAgICB0cmF2ZWxJbmZvczogdHJhdmVsSW5mb3MsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBmb3JtYXQ6IHJldHVybiB0cmFuc2FjdGlvbkhleCB3aXRoIHNlcGFyYXRlIHVuc3BlbnRzIGFycmF5XG4gICAgLy8gb25seSBuZWVkIHRvIHJldHVybiB0aGUgdW5zcGVudHMgdGhhdCB3ZXJlIHVzZWQgYW5kIGp1c3QgdGhlIGNoYWluUGF0aCwgcmVkZWVtU2NyaXB0LCBhbmQgaW5zdGFudCBmbGFnXG4gICAgY29uc3QgcGlja2VkVW5zcGVudHM6IGFueSA9IF8ubWFwKHVuc3BlbnRzLCBmdW5jdGlvbiAodW5zcGVudCkge1xuICAgICAgcmV0dXJuIF8ucGljayh1bnNwZW50LCBbJ2NoYWluUGF0aCcsICdyZWRlZW1TY3JpcHQnLCAnaW5zdGFudCcsICd3aXRuZXNzU2NyaXB0JywgJ3NjcmlwdCcsICd2YWx1ZSddKTtcbiAgICB9KTtcbiAgICBjb25zdCBwcnVuZWRVbnNwZW50cyA9IF8uc2xpY2UocGlja2VkVW5zcGVudHMsIDAsIHRyYW5zYWN0aW9uLnR4Lmlucy5sZW5ndGggLSBmZWVTaW5nbGVLZXlVbnNwZW50c1VzZWQubGVuZ3RoKTtcbiAgICBfLmVhY2goZmVlU2luZ2xlS2V5VW5zcGVudHNVc2VkLCBmdW5jdGlvbiAoZmVlVW5zcGVudCkge1xuICAgICAgcHJ1bmVkVW5zcGVudHMucHVzaCh7IHJlZGVlbVNjcmlwdDogZmFsc2UsIGNoYWluUGF0aDogZmFsc2UgfSk7IC8vIG1hcmsgYXMgZmFsc2UgdG8gc2lnbmlmeSBhIG5vbi1tdWx0aXNpZyBhZGRyZXNzXG4gICAgfSk7XG4gICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICB0cmFuc2FjdGlvbkhleDogdHJhbnNhY3Rpb24uYnVpbGRJbmNvbXBsZXRlKCkudG9IZXgoKSxcbiAgICAgIHVuc3BlbnRzOiBwcnVuZWRVbnNwZW50cyxcbiAgICAgIGZlZTogZmVlLFxuICAgICAgY2hhbmdlQWRkcmVzc2VzOiBjaGFuZ2VPdXRwdXRzLm1hcChmdW5jdGlvbiAoY28pIHtcbiAgICAgICAgcmV0dXJuIF8ucGljayhjbywgWydhZGRyZXNzJywgJ3BhdGgnLCAnYW1vdW50J10pO1xuICAgICAgfSksXG4gICAgICB3YWxsZXRJZDogcGFyYW1zLndhbGxldC5pZCgpLFxuICAgICAgd2FsbGV0S2V5Y2hhaW5zOiBwYXJhbXMud2FsbGV0LmtleWNoYWlucyxcbiAgICAgIGZlZVJhdGU6IGZlZVJhdGUsXG4gICAgICBpbnN0YW50OiBwYXJhbXMuaW5zdGFudCxcbiAgICAgIGJpdGdvRmVlOiBiaXRnb0ZlZUluZm8sXG4gICAgICBlc3RpbWF0ZWRTaXplOiBtaW5lckZlZUluZm8uc2l6ZSxcbiAgICAgIHR4SW5mbzogdHhJbmZvLFxuICAgICAgdHJhdmVsSW5mb3M6IHRyYXZlbEluZm9zLFxuICAgIH07XG5cbiAgICAvLyBBZGQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKHJlc3VsdC5pbnN0YW50ICYmIGJpdGdvRmVlSW5mbykge1xuICAgICAgcmVzdWx0Lmluc3RhbnRGZWUgPSBfLnBpY2soYml0Z29GZWVJbmZvLCBbJ2Ftb3VudCcsICdhZGRyZXNzJ10pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgcmV0dXJuIHRyeVByb21pc2UoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXRCaXRHb0ZlZSgpO1xuICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbZ2V0Qml0R29GZWVBZGRyZXNzKCksIGdldFVuc3BlbnRzKCksIGdldFVuc3BlbnRzRm9yU2luZ2xlS2V5KCldKTtcbiAgICB9KVxuICAgIC50aGVuKGNvbGxlY3RJbnB1dHMpXG4gICAgLnRoZW4oY29sbGVjdE91dHB1dHMpXG4gICAgLnRoZW4oc2VyaWFsaXplKTtcbn07XG5cbi8qKlxuICogRXN0aW1hdGUgdGhlIHNpemUgb2YgYSB0cmFuc2FjdGlvbiBpbiBieXRlcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mXG4gKiBpbnB1dHMgYW5kIG91dHB1dHMgcHJlc2VudC5cbiAqIEBwYXJhbXMgcGFyYW1zIHtcbiAqICAgblAyc2hJbnB1dHM6IG51bWJlciBvZiBQMlNIIChtdWx0aXNpZykgaW5wdXRzXG4gKiAgIG5QMnBraElucHV0czogbnVtYmVyIG9mIFAyUEtIIChzaW5nbGUgc2lnKSBpbnB1dHNcbiAqICAgbk91dHB1dHM6IG51bWJlciBvZiBvdXRwdXRzXG4gKiB9XG4gKlxuICogQHJldHVybnMgc2l6ZTogZXN0aW1hdGVkIHNpemUgb2YgdGhlIHRyYW5zYWN0aW9uIGluIGJ5dGVzXG4gKi9cbmNvbnN0IGVzdGltYXRlVHJhbnNhY3Rpb25TaXplID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHBhcmFtcy5uUDJzaElucHV0cykgfHwgcGFyYW1zLm5QMnNoSW5wdXRzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5QMnNoSW5wdXRzJyk7XG4gIH1cbiAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMublAycGtoSW5wdXRzKSB8fCBwYXJhbXMublAycGtoSW5wdXRzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIHBvc2l0aXZlIG5QMnBraElucHV0cyB0byBiZSBudW1lcmljJyk7XG4gIH1cbiAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMublAyc2hQMndzaElucHV0cykgfHwgcGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgcG9zaXRpdmUgblAyc2hQMndzaElucHV0cyB0byBiZSBudW1lcmljJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy5uUDJzaElucHV0cyArIHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0aW5nIGF0IGxlYXN0IG9uZSBuUDJzaElucHV0cyBvciBuUDJzaFAyd3NoSW5wdXRzJyk7XG4gIH1cbiAgaWYgKCFfLmlzSW50ZWdlcihwYXJhbXMubk91dHB1dHMpIHx8IHBhcmFtcy5uT3V0cHV0cyA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBwb3NpdGl2ZSBuT3V0cHV0cycpO1xuICB9XG5cbiAgLy8gVGhlIHNpemUgb2YgYW4gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXkgaXMgMzIgYnl0ZXMgbW9yZSB0aGFuIHRoZSBjb21wcmVzc2VkIGtleSxcbiAgLy8gYW5kIGhlbmNlLCBuZWVkcyB0byBiZSBhY2NvdW50ZWQgZm9yIGluIHRoZSB0cmFuc2FjdGlvbiBzaXplIGVzdGltYXRpb24uXG4gIGNvbnN0IHVuY29tcHJlc3NlZFB1YmxpY0tleXNUcmlwbGVDb3JyZWN0aW9uRmFjdG9yID0gMzIgKiAzO1xuXG4gIHJldHVybiAoXG4gICAgLy8gVGhpcyBpcyBub3QgcXVpdGUgYWNjdXJhdGUgLSBpZiB0aGVyZSBpcyBhIG1peCBvZiBpbnB1dHMgc2NyaXB0cyB3aGVyZSBzb21lIHVzZWRcbiAgICAvLyBjb21wcmVzc2VkIGtleXMgYW5kIHNvbWUgdXNlZCB1bmNvbXByZXNzZWQga2V5cywgd2Ugd291bGQgb3ZlcmVzdGltYXRlIHRoZSBzaXplLlxuICAgIC8vIFNpbmNlIHdlIGRvbid0IGhhdmUgbWl4ZWQgaW5wdXQgc2V0cywgdGhpcyBzaG91bGQgbm90IGJlIGFuIGlzc3VlIGluIHByYWN0aWNlLlxuICAgIChWaXJ0dWFsU2l6ZXMudHhQMnNoSW5wdXRTaXplICtcbiAgICAgIChwYXJhbXMuY29udGFpbnNVbmNvbXByZXNzZWRQdWJsaWNLZXlzID8gdW5jb21wcmVzc2VkUHVibGljS2V5c1RyaXBsZUNvcnJlY3Rpb25GYWN0b3IgOiAwKSkgKlxuICAgICAgcGFyYW1zLm5QMnNoSW5wdXRzICtcbiAgICBWaXJ0dWFsU2l6ZXMudHhQMnNoUDJ3c2hJbnB1dFNpemUgKiAocGFyYW1zLm5QMnNoUDJ3c2hJbnB1dHMgfHwgMCkgK1xuICAgIFZpcnR1YWxTaXplcy50eFAycGtoSW5wdXRTaXplVW5jb21wcmVzc2VkS2V5ICogKHBhcmFtcy5uUDJwa2hJbnB1dHMgfHwgMCkgK1xuICAgIFZpcnR1YWxTaXplcy50eFAycGtoT3V0cHV0U2l6ZSAqIHBhcmFtcy5uT3V0cHV0cyArXG4gICAgLy8gaWYgdGhlIHR4IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBzZWd3aXQgaW5wdXQsIHRoZSB0eCBvdmVyaGVhZCBpcyBpbmNyZWFzZWQgYnkgMVxuICAgIFZpcnR1YWxTaXplcy50eE92ZXJoZWFkU2l6ZSArXG4gICAgKHBhcmFtcy5uUDJzaFAyd3NoSW5wdXRzID4gMCA/IDEgOiAwKVxuICApO1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGZlZSBhbmQgZXN0aW1hdGVkIHNpemUgaW4gYnl0ZXMgZm9yIGEgdHJhbnNhY3Rpb24uXG4gKiBAcGFyYW1zIHBhcmFtcyB7XG4gKiAgIGJpdGdvOiBiaXRnbyBvYmplY3RcbiAqICAgZmVlUmF0ZTogc2F0b3NoaXMgcGVyIGtpbG9ieXRlXG4gKiAgIG5QMnNoSW5wdXRzOiBudW1iZXIgb2YgUDJTSCAobXVsdGlzaWcpIGlucHV0c1xuICogICBuUDJwa2hJbnB1dHM6IG51bWJlciBvZiBQMlBLSCAoc2luZ2xlIHNpZykgaW5wdXRzXG4gKiAgIG5PdXRwdXRzOiBudW1iZXIgb2Ygb3V0cHV0c1xuICogfVxuICpcbiAqIEByZXR1cm5zIHtcbiAqICAgc2l6ZTogZXN0aW1hdGVkIHNpemUgb2YgdGhlIHRyYW5zYWN0aW9uIGluIGJ5dGVzXG4gKiAgIGZlZTogZXN0aW1hdGVkIGZlZSBpbiBzYXRvc2hpcyBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gKiAgIGZlZVJhdGU6IGZlZSByYXRlIHRoYXQgd2FzIHVzZWQgdG8gZXN0aW1hdGUgdGhlIGZlZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gKiB9XG4gKi9cbmV4cG9ydHMuY2FsY3VsYXRlTWluZXJGZWVJbmZvID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb25zdCBmZWVSYXRlVG9Vc2UgPSBwYXJhbXMuZmVlUmF0ZSB8fCBwYXJhbXMuYml0Z28uZ2V0Q29uc3RhbnRzKCkuZmFsbGJhY2tGZWVSYXRlO1xuICBjb25zdCBlc3RpbWF0ZWRTaXplID0gZXN0aW1hdGVUcmFuc2FjdGlvblNpemUocGFyYW1zKTtcblxuICByZXR1cm4ge1xuICAgIHNpemU6IGVzdGltYXRlZFNpemUsXG4gICAgZmVlOiBNYXRoLmNlaWwoKGVzdGltYXRlZFNpemUgKiBmZWVSYXRlVG9Vc2UpIC8gMTAwMCksXG4gICAgZmVlUmF0ZTogZmVlUmF0ZVRvVXNlLFxuICB9O1xufTtcblxuLypcbiAqIEdpdmVuIGEgdHJhbnNhY3Rpb24gaGV4LCB1bnNwZW50IGluZm9ybWF0aW9uIChjaGFpbiBwYXRoIGFuZCByZWRlZW0gc2NyaXB0cyksIGFuZCB0aGUga2V5Y2hhaW4geHBydixcbiAqIHBlcmZvcm0ga2V5IGRlcml2YXRpb24gYW5kIHNpZ24gdGhlIGlucHV0cyBpbiB0aGUgdHJhbnNhY3Rpb24gYmFzZWQgb24gdGhlIHVuc3BlbnQgaW5mb3JtYXRpb24gcHJvdmlkZWRcbiAqXG4gKiBAcGFyYW1zOlxuICogIHRyYW5zYWN0aW9uSGV4IHNlcmlhbGl6ZWQgZm9ybSBvZiB0aGUgdHJhbnNhY3Rpb24gaW4gaGV4XG4gKiAgdW5zcGVudHMgYXJyYXkgb2YgdW5zcGVudCBpbmZvcm1hdGlvbiwgd2hlcmUgZWFjaCB1bnNwZW50IGlzIGEgY2hhaW5QYXRoIGFuZCByZWRlZW1TY3JpcHQgd2l0aCB0aGUgc2FtZVxuICogIGluZGV4IGFzIHRoZSBpbnB1dHMgaW4gdGhlIHRyYW5zYWN0aW9uSGV4XG4gKiAga2V5Y2hhaW4gS2V5Y2hhaW4gY29udGFpbmluZyB0aGUgeHBydiB0byBzaWduIHdpdGguIEZvciBsZWdhY3kgc3VwcG9ydCBvZiBzYWZlIHdhbGxldHMsIGtleWNoYWluIGNhblxuIGFsc28gYmUgYSBXSUYgcHJpdmF0ZSBrZXkuXG4gKiAgc2lnbmluZ0tleSBwcml2YXRlIGtleSBpbiBXSUYgZm9yIHNhZmUgd2FsbGV0cywgd2hlbiBrZXljaGFpbiBpcyB1bmF2YWlsYWJsZVxuICogIHZhbGlkYXRlIGNsaWVudC1zaWRlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gLSBjYW4gYmUgZGlzYWJsZWQgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlIChzaWduYXR1cmVzXG4gKiAgICAgICAgICAgYXJlIHN0aWxsIHZhbGlkYXRlZCBzZXJ2ZXItc2lkZSkuXG4gKiAgZmVlU2luZ2xlS2V5V0lGIFVzZSB0aGUgYWRkcmVzcyBiYXNlZCBvbiB0aGlzIHByaXZhdGUga2V5IHRvIHBheSBmZWVzXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZXhwb3J0cy5zaWduVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIGxldCBrZXljaGFpbiA9IHBhcmFtcy5rZXljaGFpbjsgLy8gZHVwbGljYXRlIHNvIGFzIHRvIG5vdCBtdXRhdGUgYmVsb3dcblxuICBjb25zdCB2YWxpZGF0ZSA9IHBhcmFtcy52YWxpZGF0ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHBhcmFtcy52YWxpZGF0ZTtcbiAgbGV0IHByaXZLZXk7XG4gIGlmICghXy5pc1N0cmluZyhwYXJhbXMudHJhbnNhY3Rpb25IZXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdGhlIHRyYW5zYWN0aW9uIGhleCBhcyBhIHN0cmluZycpO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMudW5zcGVudHMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdGhlIHVuc3BlbnRzIGFycmF5Jyk7XG4gIH1cbiAgaWYgKCFfLmlzQm9vbGVhbih2YWxpZGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB2YWxpZGF0ZSB0byBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuICBsZXQgbmV0d29yayA9IGdldE5ldHdvcmsoKTtcbiAgY29uc3QgZW5hYmxlQkNIID0gXy5pc0Jvb2xlYW4ocGFyYW1zLmZvcmNlQkNIKSAmJiBwYXJhbXMuZm9yY2VCQ0ggPT09IHRydWU7XG5cbiAgaWYgKCFfLmlzT2JqZWN0KGtleWNoYWluKSB8fCAhXy5pc1N0cmluZygoa2V5Y2hhaW4gYXMgYW55KS54cHJ2KSkge1xuICAgIGlmIChfLmlzU3RyaW5nKHBhcmFtcy5zaWduaW5nS2V5KSkge1xuICAgICAgcHJpdktleSA9IHV0eG9saWIuRUNQYWlyLmZyb21XSUYocGFyYW1zLnNpZ25pbmdLZXksIG5ldHdvcmsgYXMgdXR4b2xpYi5CaXRjb2luSlNOZXR3b3JrKTtcbiAgICAgIGtleWNoYWluID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyB0aGUga2V5Y2hhaW4gb2JqZWN0IHdpdGggeHBydicpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBmZWVTaW5nbGVLZXk7XG4gIGlmIChwYXJhbXMuZmVlU2luZ2xlS2V5V0lGKSB7XG4gICAgZmVlU2luZ2xlS2V5ID0gdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMuZmVlU2luZ2xlS2V5V0lGLCBuZXR3b3JrIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29yayk7XG4gIH1cblxuICBkZWJ1ZygnTmV0d29yazogJU8nLCBuZXR3b3JrKTtcblxuICBpZiAoZW5hYmxlQkNIKSB7XG4gICAgZGVidWcoJ0VuYWJsaW5nIEJDSOKApicpO1xuICAgIG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5jYXNoO1xuICAgIGRlYnVnKCdOZXcgbmV0d29yazogJU8nLCBuZXR3b3JrKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zYWN0aW9uID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXgocGFyYW1zLnRyYW5zYWN0aW9uSGV4LCBuZXR3b3JrKTtcbiAgaWYgKHRyYW5zYWN0aW9uLmlucy5sZW5ndGggIT09IHBhcmFtcy51bnNwZW50cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2xlbmd0aCBvZiB1bnNwZW50cyBhcnJheSBzaG91bGQgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiBpbnB1dHMnKTtcbiAgfVxuXG4gIC8vIGRlY29yYXRlIHRyYW5zYWN0aW9uIHdpdGggaW5wdXQgdmFsdWVzIGZvciBUcmFuc2FjdGlvbkJ1aWxkZXIgaW5zdGFudGlhdGlvblxuICBjb25zdCBpc1V0eG9UeCA9IF8uaXNPYmplY3QodHJhbnNhY3Rpb24pICYmIEFycmF5LmlzQXJyYXkoKHRyYW5zYWN0aW9uIGFzIGFueSkuaW5zKTtcbiAgY29uc3QgYXJlVmFsaWRVbnNwZW50cyA9IF8uaXNPYmplY3QocGFyYW1zKSAmJiBBcnJheS5pc0FycmF5KChwYXJhbXMgYXMgYW55KS51bnNwZW50cyk7XG4gIGlmIChpc1V0eG9UeCAmJiBhcmVWYWxpZFVuc3BlbnRzKSB7XG4gICAgLy8gZXh0ZW5kIHRoZSB0cmFuc2FjdGlvbiBpbnB1dHMgd2l0aCB0aGUgdmFsdWVzXG4gICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBfLm1hcCgocGFyYW1zIGFzIGFueSkudW5zcGVudHMsICh1KSA9PiBfLnBpY2sodSwgJ3ZhbHVlJykpO1xuICAgIHRyYW5zYWN0aW9uLmlucy5tYXAoKGN1cnJlbnRJdGVtLCBpbmRleCkgPT4gXy5leHRlbmQoY3VycmVudEl0ZW0sIGlucHV0VmFsdWVzW2luZGV4XSkpO1xuICB9XG5cbiAgbGV0IHJvb3RFeHRLZXk7XG4gIGlmIChrZXljaGFpbikge1xuICAgIHJvb3RFeHRLZXkgPSBiaXAzMi5mcm9tQmFzZTU4KGtleWNoYWluLnhwcnYpO1xuICB9XG5cbiAgY29uc3QgdHhiID0gdXR4b2xpYi5iaXRnby5jcmVhdGVUcmFuc2FjdGlvbkJ1aWxkZXJGcm9tVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0eGIudHguaW5zLmxlbmd0aDsgKytpbmRleCkge1xuICAgIGNvbnN0IGN1cnJlbnRVbnNwZW50ID0gcGFyYW1zLnVuc3BlbnRzW2luZGV4XTtcbiAgICBpZiAoY3VycmVudFVuc3BlbnQucmVkZWVtU2NyaXB0ID09PSBmYWxzZSkge1xuICAgICAgLy8gdGhpcyBpcyB0aGUgaW5wdXQgZnJvbSBhIHNpbmdsZSBrZXkgZmVlIGFkZHJlc3NcbiAgICAgIGlmICghZmVlU2luZ2xlS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2luZ2xlIGtleSBhZGRyZXNzIHVzZWQgaW4gaW5wdXQgYnV0IGZlZVNpbmdsZUtleVdJRiBub3QgcHJvdmlkZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVuYWJsZUJDSCkge1xuICAgICAgICBmZWVTaW5nbGVLZXkubmV0d29yayA9IG5ldHdvcms7XG4gICAgICB9XG5cbiAgICAgIHR4Yi5zaWduKGluZGV4LCBmZWVTaW5nbGVLZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQgJiYgZW5hYmxlQkNIKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JDSCBkb2VzIG5vdCBzdXBwb3J0IHNlZ3dpdCBpbnB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFpblBhdGggPSBjdXJyZW50VW5zcGVudC5jaGFpblBhdGg7XG4gICAgaWYgKHJvb3RFeHRLZXkpIHtcbiAgICAgIGNvbnN0IHsgd2FsbGV0U3ViUGF0aCA9ICcvMC8wJyB9ID0ga2V5Y2hhaW47XG4gICAgICBjb25zdCBwYXRoID0gc2FuaXRpemVMZWdhY3lQYXRoKGtleWNoYWluLnBhdGggKyB3YWxsZXRTdWJQYXRoICsgY2hhaW5QYXRoKTtcbiAgICAgIGRlYnVnKFxuICAgICAgICAnZGVyaXZlZCB1c2VyIGtleSBwYXRoIFwiJXNcIiB1c2luZyBrZXljaGFpbiBwYXRoIFwiJXNcIiwgd2FsbGV0U3ViUGF0aCBcIiVzXCIsIGtleWNoYWluIHdhbGxldFN1YlBhdGggXCIlc1wiIGFuZCBjaGFpblBhdGggXCIlc1wiJyxcbiAgICAgICAgcGF0aCxcbiAgICAgICAga2V5Y2hhaW4ucGF0aCxcbiAgICAgICAgd2FsbGV0U3ViUGF0aCxcbiAgICAgICAga2V5Y2hhaW4ud2FsbGV0U3ViUGF0aCxcbiAgICAgICAgY2hhaW5QYXRoXG4gICAgICApO1xuICAgICAgcHJpdktleSA9IHJvb3RFeHRLZXkuZGVyaXZlUGF0aChwYXRoKTtcbiAgICB9XG5cbiAgICBwcml2S2V5Lm5ldHdvcmsgPSBuZXR3b3JrO1xuXG4gICAgLy8gc3Vic2NyaXB0IGlzIHRoZSBwYXJ0IG9mIHRoZSBvdXRwdXQgc2NyaXB0IGFmdGVyIHRoZSBPUF9DT0RFU0VQQVJBVE9SLlxuICAgIC8vIFNpbmNlIHdlIGFyZSBvbmx5IGV2ZXIgc2lnbmluZyBwMnNoIG91dHB1dHMsIHdoaWNoIGRvIG5vdCBoYXZlXG4gICAgLy8gT1BfQ09ERVNFUEFSQVRPUlMsIGl0IGlzIGFsd2F5cyB0aGUgb3V0cHV0IHNjcmlwdC5cbiAgICBjb25zdCBzdWJzY3JpcHQgPSBCdWZmZXIuZnJvbShjdXJyZW50VW5zcGVudC5yZWRlZW1TY3JpcHQsICdoZXgnKTtcbiAgICBjdXJyZW50VW5zcGVudC52YWxpZGF0aW9uU2NyaXB0ID0gc3Vic2NyaXB0O1xuXG4gICAgLy8gSW4gb3JkZXIgdG8gc2lnbiB3aXRoIGJpdGNvaW5qcy1saWIsIHdlIG11c3QgdXNlIGl0cyB0cmFuc2FjdGlvblxuICAgIC8vIGJ1aWxkZXIsIGNvbmZ1c2luZ2x5IG5hbWVkIHRoZSBzYW1lIGV4YWN0IHRoaW5nIGFzIG91ciB0cmFuc2FjdGlvblxuICAgIC8vIGJ1aWxkZXIsIGJ1dCB3aXRoIGluZXF1aXZhbGVudCBiZWhhdmlvci5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2l0bmVzc1NjcmlwdCA9IGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQgPyBCdWZmZXIuZnJvbShjdXJyZW50VW5zcGVudC53aXRuZXNzU2NyaXB0LCAnaGV4JykgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzaWdIYXNoID0gdXR4b2xpYi5iaXRnby5nZXREZWZhdWx0U2lnSGFzaChuZXR3b3JrKTtcbiAgICAgIHR4Yi5zaWduKGluZGV4LCBwcml2S2V5LCBzdWJzY3JpcHQsIHNpZ0hhc2gsIGN1cnJlbnRVbnNwZW50LnZhbHVlLCB3aXRuZXNzU2NyaXB0KTtcbiAgICAgIGRlYnVnKGBTaWduZWQgdHJhbnNhY3Rpb24gaW5wdXQgJHtpbmRleH1gKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB0cnkgZmFsbGJhY2sgZGVyaXZhdGlvbiBwYXRoIChzZWUgQkctNDY0OTcpXG4gICAgICBsZXQgZmFsbGJhY2tTaWduaW5nU3VjY2Vzc2Z1bCA9IGZhbHNlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tQYXRoID0gc2FuaXRpemVMZWdhY3lQYXRoKGtleWNoYWluLnBhdGggKyBjaGFpblBhdGgpO1xuICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAnZGVyaXZlZCBmYWxsYmFjayB1c2VyIGtleSBwYXRoIFwiJXNcIiB1c2luZyBrZXljaGFpbiBwYXRoIFwiJXNcIiBhbmQgY2hhaW5QYXRoIFwiJXNcIicsXG4gICAgICAgICAgZmFsbGJhY2tQYXRoLFxuICAgICAgICAgIGtleWNoYWluLnBhdGgsXG4gICAgICAgICAgY2hhaW5QYXRoXG4gICAgICAgICk7XG4gICAgICAgIHByaXZLZXkgPSByb290RXh0S2V5LmRlcml2ZVBhdGgoZmFsbGJhY2tQYXRoKTtcbiAgICAgICAgY29uc3Qgd2l0bmVzc1NjcmlwdCA9IGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHRcbiAgICAgICAgICA/IEJ1ZmZlci5mcm9tKGN1cnJlbnRVbnNwZW50LndpdG5lc3NTY3JpcHQsICdoZXgnKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzaWdIYXNoID0gdXR4b2xpYi5iaXRnby5nZXREZWZhdWx0U2lnSGFzaChuZXR3b3JrKTtcbiAgICAgICAgdHhiLnNpZ24oaW5kZXgsIHByaXZLZXksIHN1YnNjcmlwdCwgc2lnSGFzaCwgY3VycmVudFVuc3BlbnQudmFsdWUsIHdpdG5lc3NTY3JpcHQpO1xuICAgICAgICBmYWxsYmFja1NpZ25pbmdTdWNjZXNzZnVsID0gdHJ1ZTtcbiAgICAgIH0gY2F0Y2ggKGZhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgZGVidWcoJ2lucHV0IHNpZ24gZmFpbGVkIGZvciBmYWxsYmFjayBwYXRoOiAlcycsIGZhbGxiYWNrRXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICAvLyB3ZSBuZWVkIHRvIGtub3cgd2hhdCdzIGNhdXNpbmcgdGhpc1xuICAgICAgaWYgKCFmYWxsYmFja1NpZ25pbmdTdWNjZXNzZnVsKSB7XG4gICAgICAgIGUucmVzdWx0ID0ge1xuICAgICAgICAgIHVuc3BlbnQ6IGN1cnJlbnRVbnNwZW50LFxuICAgICAgICB9O1xuICAgICAgICBlLm1lc3NhZ2UgPSBgRmFpbGVkIHRvIHNpZ24gaW5wdXQgIyR7aW5kZXh9IC0gJHtlLm1lc3NhZ2V9IC0gJHtKU09OLnN0cmluZ2lmeShlLnJlc3VsdCwgbnVsbCwgNCl9IC0gXFxuJHtcbiAgICAgICAgICBlLnN0YWNrXG4gICAgICAgIH1gO1xuICAgICAgICBkZWJ1ZygnaW5wdXQgc2lnbiBmYWlsZWQ6ICVzJywgZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhcnRpYWxUcmFuc2FjdGlvbiA9IHR4Yi5idWlsZEluY29tcGxldGUoKTtcblxuICBpZiAodmFsaWRhdGUpIHtcbiAgICBwYXJ0aWFsVHJhbnNhY3Rpb24uaW5zLmZvckVhY2goKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlQ291bnQgPSB1dHhvbGliLmJpdGdvXG4gICAgICAgIC5nZXRTaWduYXR1cmVWZXJpZmljYXRpb25zKHBhcnRpYWxUcmFuc2FjdGlvbiwgaW5kZXgsIHBhcmFtcy51bnNwZW50c1tpbmRleF0udmFsdWUpXG4gICAgICAgIC5maWx0ZXIoKHYpID0+IHYuc2lnbmVkQnkgIT09IHVuZGVmaW5lZCkubGVuZ3RoO1xuICAgICAgZGVidWcoYFNpZ25hdHVyZSBjb3VudCBmb3IgaW5wdXQgJHtpbmRleH06ICR7c2lnbmF0dXJlQ291bnR9YCk7XG4gICAgICBpZiAoc2lnbmF0dXJlQ291bnQgPCAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIHZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5mdWxsTG9jYWxTaWduaW5nICYmIHNpZ25hdHVyZUNvdW50IDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Z1bGxMb2NhbFNpZ25pbmcgc2V0OiBleHBlY3RlZCBhdCBsZWFzdCB0d28gdmFsaWQgc2lnbmF0dXJlcycpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgdHJhbnNhY3Rpb25IZXg6IHBhcnRpYWxUcmFuc2FjdGlvbi50b0hleCgpLFxuICB9KTtcbn07XG4iXX0=