@bitgo/sdk-coin-iota 2.3.2 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"iota.d.ts","sourceRoot":"","sources":["../../src/iota.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"iota.d.ts","sourceRoot":"","sources":["../../src/iota.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,SAAS,EAGT,oBAAoB,EAKpB,OAAO,EACP,YAAY,EACZ,+BAA+B,EAC/B,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EAEX,MAAM,EAGN,YAAY,EAEZ,iBAAiB,EACjB,eAAe,EACf,oCAAoC,EAGpC,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EAGtB,uBAAuB,EAEvB,wBAAwB,EACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,UAAU,EAAS,MAAM,gBAAgB,CAAC;AAMhF,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EAGvB,MAAM,aAAa,CAAC;AAWrB,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;;GAGG;AACH,qBAAa,IAAK,SAAQ,QAAQ;IAChC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;IAE3D,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAU/E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAQ1F,aAAa,IAAI,MAAM,GAAG,MAAM;IAIhC,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,UAAU;IAIvB,WAAW,IAAI,MAAM;IAQrB,WAAW,IAAI,OAAO;IAItB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAQ/B;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;OAIG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,OAAO,CAAC;IAYxE;;;;;OAKG;IACG,kBAAkB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAM5F;;;;;;;OAOG;IACG,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAc3E;;;;OAIG;IACG,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkBvF;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO;IAcvC;;;OAGG;IACG,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAIjF;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAG,IAAI;IAOlF;;;;OAIG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D;;OAEG;IACH,2BAA2B,IAAI,OAAO;IAItC;;;;OAIG;IACH,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,oCAAoC,GAAG,IAAI;IAI1G;;;;;;;;;;OAUG;IACG,OAAO,CACX,MAAM,EAAE,mBAAmB,EAC3B,mBAAmB,CAAC,EAAE,oBAAoB,GACzC,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;IAoJhC;;OAEG;YACW,eAAe;IAY7B;;;;;;;;;;;;OAYG;IACG,qBAAqB,CAAC,MAAM,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC;IAmFnG;;;;;;;OAOG;YACW,UAAU;IAOxB;;;;;;;;OAQG;YACW,iBAAiB;IA4C/B;;;;;;;;OAQG;YACW,WAAW;IA8BzB;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;;;;;;;;;OAWG;YACW,oBAAoB;YAwCpB,gBAAgB;IA0G9B;;;OAGG;cACa,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAIjH;;;OAGG;cACa,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;YAIhG,uBAAuB;IAoErC;;;;;OAKG;YACW,aAAa;IAM3B;;;;;;OAMG;YACW,WAAW;YAWX,6BAA6B;IA+D3C;;;;;;OAMG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAM/B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAkBnC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAMvB;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IAQpC;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAgC9B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;;OAKG;YACW,kBAAkB;IAUhC,kBAAkB;IACZ,mCAAmC,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;CAwE5F"}
package/dist/src/iota.js CHANGED
@@ -264,7 +264,10 @@ class Iota extends sdk_core_1.BaseCoin {
264
264
  tokenObjects = await this.fetchOwnedObjects(senderAddress, params.fullnodeRpcUrl, params.tokenContractAddress);
265
265
  }
266
266
  catch (e) {
267
- continue;
267
+ if (e instanceof sdk_core_1.RecoveryProviderError) {
268
+ throw e;
269
+ }
270
+ throw new sdk_core_1.RecoveryProviderError(`Failed to fetch token objects for ${senderAddress}`, e);
268
271
  }
269
272
  if (tokenObjects.length === 0) {
270
273
  continue;
@@ -273,6 +276,9 @@ class Iota extends sdk_core_1.BaseCoin {
273
276
  return await this.recoverIotaToken(params, tokenObjects, senderAddress, derivationPath, derivedPublicKey, idx, bitgoKey, precomputedMaterial);
274
277
  }
275
278
  catch (e) {
279
+ if (e instanceof sdk_core_1.RecoveryProviderError) {
280
+ throw e;
281
+ }
276
282
  continue;
277
283
  }
278
284
  }
@@ -281,7 +287,10 @@ class Iota extends sdk_core_1.BaseCoin {
281
287
  ownedObjects = await this.fetchOwnedObjects(senderAddress, params.fullnodeRpcUrl);
282
288
  }
283
289
  catch (e) {
284
- continue;
290
+ if (e instanceof sdk_core_1.RecoveryProviderError) {
291
+ throw e;
292
+ }
293
+ throw new sdk_core_1.RecoveryProviderError(`Failed to fetch owned objects for ${senderAddress}`, e);
285
294
  }
286
295
  if (ownedObjects.length === 0) {
287
296
  continue;
@@ -329,7 +338,7 @@ class Iota extends sdk_core_1.BaseCoin {
329
338
  lastScanIndex: idx,
330
339
  };
331
340
  }
332
- throw new Error(`Did not find an address with sufficient funds to recover. ` +
341
+ throw new sdk_core_1.ErrorNoInputToRecover(`Did not find an address with sufficient funds to recover. ` +
333
342
  `Scanned addresses from index ${startIdx} to ${endIdx - 1}. ` +
334
343
  `Please start the next scan at address index ${endIdx}.`);
335
344
  }
@@ -342,7 +351,10 @@ class Iota extends sdk_core_1.BaseCoin {
342
351
  return balance > 0n;
343
352
  }
344
353
  catch (e) {
345
- return false;
354
+ if (e instanceof sdk_core_1.RecoveryProviderError) {
355
+ throw e;
356
+ }
357
+ throw new sdk_core_1.RecoveryProviderError(`Failed to query token balance for ${senderAddress}`, e);
346
358
  }
347
359
  }
348
360
  /**
@@ -394,7 +406,7 @@ class Iota extends sdk_core_1.BaseCoin {
394
406
  recoveryTransaction = await this.recover(recoverParams, signingMaterial);
395
407
  }
396
408
  catch (e) {
397
- if (e.message.startsWith('Did not find an address with sufficient funds to recover.')) {
409
+ if (e instanceof sdk_core_1.ErrorNoInputToRecover) {
398
410
  lastScanIndex = idx;
399
411
  continue;
400
412
  }
@@ -409,7 +421,7 @@ class Iota extends sdk_core_1.BaseCoin {
409
421
  lastScanIndex = idx;
410
422
  }
411
423
  if (consolidationTransactions.length === 0) {
412
- throw new Error(`Did not find an address with sufficient funds to recover. Please start the next scan at address index ${lastScanIndex + 1}.`);
424
+ throw new sdk_core_1.ErrorNoInputToRecover(`Did not find an address with sufficient funds to recover. Please start the next scan at address index ${lastScanIndex + 1}.`);
413
425
  }
414
426
  if (isUnsignedSweep) {
415
427
  consolidationTransactions[consolidationTransactions.length - 1].transactions[0].unsignedTx.coinSpecific.lastScanIndex = lastScanIndex;
@@ -485,22 +497,28 @@ class Iota extends sdk_core_1.BaseCoin {
485
497
  * @throws Error if RPC call fails
486
498
  */
487
499
  async makeRpcCall(url, method, params) {
488
- const response = await fetch(url, {
489
- method: 'POST',
490
- headers: { 'Content-Type': 'application/json' },
491
- body: JSON.stringify({
492
- jsonrpc: '2.0',
493
- id: 1,
494
- method,
495
- params,
496
- }),
497
- });
500
+ let response;
501
+ try {
502
+ response = await fetch(url, {
503
+ method: 'POST',
504
+ headers: { 'Content-Type': 'application/json' },
505
+ body: JSON.stringify({
506
+ jsonrpc: '2.0',
507
+ id: 1,
508
+ method,
509
+ params,
510
+ }),
511
+ });
512
+ }
513
+ catch (e) {
514
+ throw new sdk_core_1.RecoveryProviderError(`RPC call failed for ${method}: ${e.message}`, e);
515
+ }
498
516
  if (!response.ok) {
499
- throw new Error(`RPC call failed with status ${response.status}`);
517
+ throw new sdk_core_1.RecoveryProviderError(`RPC call failed with status ${response.status}`);
500
518
  }
501
519
  const json = await response.json();
502
520
  if (json.error) {
503
- throw new Error(`RPC error: ${json.error.message || JSON.stringify(json.error)}`);
521
+ throw new sdk_core_1.RecoveryProviderError(`RPC error: ${json.error.message || JSON.stringify(json.error)}`);
504
522
  }
505
523
  return json.result;
506
524
  }
@@ -568,17 +586,20 @@ class Iota extends sdk_core_1.BaseCoin {
568
586
  }));
569
587
  const tokenBalance = tokenObjectsWithBalance.reduce((sum, obj) => sum + BigInt(obj.balance), 0n);
570
588
  if (tokenBalance <= 0n) {
571
- throw new Error('Token balance is zero');
589
+ throw new sdk_core_1.ErrorNoInputToRecover('Token balance is zero');
572
590
  }
573
591
  let gasObjectsWithBalance;
574
592
  try {
575
593
  gasObjectsWithBalance = await this.fetchOwnedObjects(senderAddress, params.fullnodeRpcUrl);
576
594
  }
577
595
  catch (e) {
578
- throw new Error('Failed to fetch gas objects for token recovery');
596
+ if (e instanceof sdk_core_1.RecoveryProviderError) {
597
+ throw e;
598
+ }
599
+ throw new sdk_core_1.RecoveryProviderError('Failed to fetch gas objects for token recovery', e);
579
600
  }
580
601
  if (gasObjectsWithBalance.length === 0) {
581
- throw new Error('No gas objects found for token recovery');
602
+ throw new sdk_core_1.ErrorNoInputToRecover('No gas objects found for token recovery');
582
603
  }
583
604
  gasObjectsWithBalance = gasObjectsWithBalance.sort((a, b) => (BigInt(b.balance) > BigInt(a.balance) ? 1 : -1));
584
605
  if (gasObjectsWithBalance.length >= constants_1.MAX_GAS_OBJECTS) {
@@ -587,7 +608,7 @@ class Iota extends sdk_core_1.BaseCoin {
587
608
  const { gasBudget, gasPrice, gasObjects, totalBalance } = await this.prepareGasAndObjects(gasObjectsWithBalance, senderAddress, params, tokenObjects);
588
609
  const netGasBalance = totalBalance - BigInt(gasBudget);
589
610
  if (netGasBalance <= 0n) {
590
- throw new Error('Insufficient gas balance for token recovery');
611
+ throw new sdk_core_1.ErrorNoInputToRecover('Insufficient gas balance for token recovery');
591
612
  }
592
613
  const recoveryAmount = tokenBalance.toString();
593
614
  const factory = this.getTxBuilderFactory();
@@ -964,4 +985,4 @@ class Iota extends sdk_core_1.BaseCoin {
964
985
  }
965
986
  }
966
987
  exports.Iota = Iota;
967
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQWtDeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQUN6QiwwREFBNkI7QUFVN0I7OztHQUdHO0FBQ0gsTUFBYSxJQUFLLFNBQVEsbUJBQVE7SUFHaEMsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELDJDQUEyQztJQUMzQyw2QkFBNkI7SUFDN0IsMkNBQTJDO0lBRTNDLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFD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Q2hDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxtQkFBb0I7Z0JBQ2pELGNBQWMsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFO2FBQ3hDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxZQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3BFLGFBQWEsR0FBRyxXQUFXLENBQUMsWUFBYSxDQUFDLGFBQXVCLENBQUM7WUFDcEUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3BFLENBQUM7Q0FDRjtBQXpwQ0Qsb0JBeXBDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBFRERTQU1ldGhvZHMsXG4gIEVERFNBTWV0aG9kVHlwZXMsXG4gIEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBFbnZpcm9ubWVudHMsXG4gIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsIGFzIHNoYXJlZEdldEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBpc0VkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBLZXlQYWlyLFxuICBNUENBbGdvcml0aG0sXG4gIE1QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1JlY292ZXJ5T3B0aW9ucyxcbiAgTVBDU3dlZXBSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1N3ZWVwVHhzLFxuICBNUENUeCxcbiAgTVBDVHhzLFxuICBNUENUeXBlLFxuICBNUENVbnNpZ25lZFR4LFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQb3B1bGF0ZWRJbnRlbnQsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyxcbiAgUmVjb3ZlcnlUeFJlcXVlc3QsXG4gIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeCxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIFRzc1ZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgQ29pbkZhbWlseSwgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBJb3RhS2V5UGFpciwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQnVpbGRlciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vbGliJztcbmltcG9ydCB7IGF1ZGl0RWRkc2FQcml2YXRlS2V5LCBnZXREZXJpdmF0aW9uUGF0aCB9IGZyb20gJ0BiaXRnby9zZGstbGliLW1wYyc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zLFxuICBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyVHhEYXRhLFxuICBUcmFuc2FjdGlvbk9iamVjdElucHV0LFxufSBmcm9tICcuL2xpYi9pZmFjZSc7XG5pbXBvcnQgeyBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBERUZBVUxUX0dBU19PVkVSSEVBRCxcbiAgREVGQVVMVF9TQ0FOX0ZBQ1RPUixcbiAgTUFYX0dBU19CVURHRVQsXG4gIE1BWF9HQVNfT0JKRUNUUyxcbiAgTUFYX09CSkVDVF9MSU1JVCxcbn0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCBuYWNsIGZyb20gJ3R3ZWV0bmFjbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW90YVJlY292ZXJ5T3B0aW9ucyBleHRlbmRzIE1QQ1JlY292ZXJ5T3B0aW9ucyB7XG4gIGZ1bGxub2RlUnBjVXJsPzogc3RyaW5nOyAvLyBPdmVycmlkZSBkZWZhdWx0IFJQQyBVUkxcbn1cblxuaW50ZXJmYWNlIElvdGFPYmplY3RXaXRoQmFsYW5jZSBleHRlbmRzIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQge1xuICBiYWxhbmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSU9UQSBjb2luIGltcGxlbWVudGF0aW9uLlxuICogU3VwcG9ydHMgVFNTIChUaHJlc2hvbGQgU2lnbmF0dXJlIFNjaGVtZSkgd2l0aCBFRERTQSBhbGdvcml0aG0uXG4gKi9cbmV4cG9ydCBjbGFzcyBJb3RhIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYW4gSU9UQSBjb2luIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IElvdGEoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29pbiBDb25maWd1cmF0aW9uIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4ubmFtZTtcbiAgfVxuXG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZnVsbE5hbWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE11bHRpLVNpZ25hdHVyZSBhbmQgVFNTIFN1cHBvcnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIGdldE1QQ0FsZ29yaXRobSgpOiBNUENBbGdvcml0aG0ge1xuICAgIHJldHVybiBNUENUeXBlLkVERFNBO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZGRyZXNzIGFuZCBQdWJsaWMgS2V5IFZhbGlkYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gSU9UQSBhZGRyZXNzLlxuICAgKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlICg2NC1jaGFyYWN0ZXIgaGV4IHN0cmluZylcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWIgLSBUaGUgcHVibGljIGtleSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwdWJsaWMga2V5IGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkUHViKHB1Yjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkocHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiBhbiBhZGRyZXNzIGJlbG9uZ3MgdG8gYSBUU1Mgd2FsbGV0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHdhbGxldCBhZGRyZXNzIGFuZCB1c2VyL2JhY2t1cCBwdWJsaWMga2V5c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIHdhbGxldFxuICAgKi9cbiAgYXN5bmMgaXNXYWxsZXRBZGRyZXNzKHBhcmFtczogVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdmVyaWZ5RWRkc2FUc3NXYWxsZXRBZGRyZXNzKFxuICAgICAgcGFyYW1zLFxuICAgICAgKGFkZHJlc3MpID0+IHRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksXG4gICAgICAocHVibGljS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gRXhwbGFuYXRpb24gYW5kIFZlcmlmaWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNhY3Rpb24gYnkgcGFyc2luZyBpdHMgaGV4IHJlcHJlc2VudGF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZyBvciB0cmFuc2FjdGlvbiBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHBhcmFtcy50eEhleCwgJ2V4cGxhaW4nKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMucmVidWlsZFRyYW5zYWN0aW9uKHJhd1R4KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIHRyYW5zYWN0aW9uIHByZWJ1aWxkIG1hdGNoZXMgdGhlIG9yaWdpbmFsIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIEVuc3VyZXMgcmVjaXBpZW50cyBhbmQgYW1vdW50cyBhbGlnbiB3aXRoIHRoZSBpbnRlbmRlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgcHJlYnVpbGQgYW5kIG9yaWdpbmFsIHBhcmFtc1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZlcmlmaWNhdGlvbiBzdWNjZWVkc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcmlmaWNhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UHJlYnVpbGQsIHR4UGFyYW1zIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcmF3VHggPSB0aGlzLnZhbGlkYXRlQW5kRXh0cmFjdFR4SGV4KHR4UHJlYnVpbGQudHhIZXgsICd2ZXJpZnknKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb24pO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy52ZXJpZnlUcmFuc2FjdGlvblJlY2lwaWVudHModHJhbnNhY3Rpb24gYXMgVHJhbnNmZXJUcmFuc2FjdGlvbiwgdHhQYXJhbXMucmVjaXBpZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNhY3Rpb24gYW5kIGV4dHJhY3RzIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZXMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBQYXJzZWQgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMsIG91dHB1dHMsIGFuZCBmZWUgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBJb3RhUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6IHBhcmFtcy50eEhleCB9KTtcblxuICAgIGlmICghdHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB8fCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eVBhcnNlZFRyYW5zYWN0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gdGhpcy5jYWxjdWxhdGVUcmFuc2FjdGlvbkZlZSh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcbiAgICBjb25zdCBpbnB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25JbnB1dHModHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgZmVlKTtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy5idWlsZFRyYW5zYWN0aW9uT3V0cHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uKTtcblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgZmVlIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEtleSBHZW5lcmF0aW9uIGFuZCBTaWduaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEga2V5IHBhaXIgZm9yIElPVEEgdHJhbnNhY3Rpb25zLlxuICAgKiBAcGFyYW0gc2VlZCAtIE9wdGlvbmFsIHNlZWQgdG8gZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBrZXkgcGFpclxuICAgKiBAcmV0dXJucyBLZXkgcGFpciB3aXRoIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiBmYWlsc1xuICAgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBJb3RhS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSW90YUtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGtleXMucHViLFxuICAgICAgcHJ2OiBrZXlzLnBydixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gKG5vdCBpbXBsZW1lbnRlZCBmb3IgSU9UQSkuXG4gICAqIElPVEEgdHJhbnNhY3Rpb25zIGFyZSBzaWduZWQgZXh0ZXJuYWxseSB1c2luZyBUU1MuXG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdWRpdHMgYSBkZWNyeXB0ZWQgcHJpdmF0ZSBrZXkgdG8gZW5zdXJlIGl0J3MgdmFsaWQgZm9yIHRoZSBnaXZlbiBwdWJsaWMga2V5LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIG11bHRpU2lnVHlwZSwgcHJpdmF0ZSBrZXksIGFuZCBwdWJsaWMga2V5XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbXVsdGlTaWdUeXBlIGlzIG5vdCBUU1Mgb3IgaWYga2V5IHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyk6IHZvaWQge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09IG11bHRpc2lnVHlwZXMudHNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cbiAgICBhdWRpdEVkZHNhUHJpdmF0ZUtleShwcnYsIHB1YmxpY0tleSA/PyAnJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIHNpZ25hYmxlIHBheWxvYWQgZnJvbSBhIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHggLSBUaGUgc2VyaWFsaXplZCB0cmFuc2FjdGlvbiBoZXhcbiAgICogQHJldHVybnMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hYmxlIHBheWxvYWRcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hYmxlUGF5bG9hZChzZXJpYWxpemVkVHg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVidWlsdFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24oc2VyaWFsaXplZFR4KTtcbiAgICByZXR1cm4gcmVidWlsdFRyYW5zYWN0aW9uLnNpZ25hYmxlUGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYWxsb3dzQWNjb3VudENvbnNvbGlkYXRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIHRyYW5zYWN0aW9uIGludGVudC5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IG9iamVjdCB0byBtb2RpZnlcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB1bnNwZW50cyBkYXRhXG4gICAqL1xuICBzZXRDb2luU3BlY2lmaWNGaWVsZHNJbkludGVudChpbnRlbnQ6IFBvcHVsYXRlZEludGVudCwgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMpOiB2b2lkIHtcbiAgICBpbnRlbnQudW5zcGVudHMgPSBwYXJhbXMudW5zcGVudHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uKHMpIHdpdGhvdXQgQml0R29cbiAgICpcbiAgICogQHBhcmFtIHtJb3RhUmVjb3ZlcnlPcHRpb25zfSBwYXJhbXMgcGFyYW1ldGVycyBuZWVkZWQgdG8gY29uc3RydWN0IGFuZFxuICAgKiAobWF5YmUpIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RWRkc2FTaWduaW5nTWF0ZXJpYWx9IFtwcmVjb21wdXRlZE1hdGVyaWFsXSBzaWduaW5nIG1hdGVyaWFsIGRldGVjdGVkIG9uY2UgYnkgdGhlXG4gICAqIGNhbGxlciAoZS5nLiByZWNvdmVyQ29uc29saWRhdGlvbnMpIHRvIGF2b2lkIHJlLWRlY3J5cHRpbmcgdGhlIGtleWNhcmQgb24gZXZlcnkgbG9vcCBpdGVyYXRpb25cbiAgICpcbiAgICogQHJldHVybnMge01QQ1R4IHwgTVBDU3dlZXBUeHN9IGFycmF5IG9mIHRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleCBzdHJpbmdzIGFuZCBpbmRpY2VzXG4gICAqIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcgc3dlcHRcbiAgICovXG4gIGFzeW5jIHJlY292ZXIoXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHByZWNvbXB1dGVkTWF0ZXJpYWw/OiBFZGRzYVNpZ25pbmdNYXRlcmlhbFxuICApOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBiaXRnb0tleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24gYWRkcmVzcycpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SWR4ID0gdXRpbHMuZ2V0U2FmZU51bWJlcigwLCAnSW52YWxpZCBzdGFydGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMnLCBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXgpO1xuICAgIGNvbnN0IG51bUl0ZXJhdGlvbnMgPSB1dGlscy5nZXRTYWZlTnVtYmVyKERFRkFVTFRfU0NBTl9GQUNUT1IsICdJbnZhbGlkIHNjYW5uaW5nIGZhY3RvcicsIHBhcmFtcy5zY2FuKTtcbiAgICBjb25zdCBlbmRJZHggPSBzdGFydElkeCArIG51bUl0ZXJhdGlvbnM7XG4gICAgY29uc3QgYml0Z29LZXkgPSBwYXJhbXMuYml0Z29LZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBNUEMgPSBhd2FpdCBFRERTQU1ldGhvZHMuZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSgpO1xuXG4gICAgZm9yIChsZXQgaWR4ID0gc3RhcnRJZHg7IGlkeCA8IGVuZElkeDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gKHBhcmFtcy5zZWVkID8gZ2V0RGVyaXZhdGlvblBhdGgocGFyYW1zLnNlZWQpIDogJ20nKSArIGAvJHtpZHh9YDtcbiAgICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXkgPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiaXRnb0tleSwgZGVyaXZhdGlvblBhdGgpLnNsaWNlKDAsIDY0KTtcbiAgICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkUHVibGljS2V5KTtcblxuICAgICAgLy8gVG9rZW4gcmVjb3ZlcnkgcGF0aDogcmVjb3ZlciB0aGUgdG9rZW4gcHJvdmlkZWQgYnkgdXNlclxuICAgICAgaWYgKHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcykge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmhhc1Rva2VuQmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRva2VuT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9rZW5PYmplY3RzID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhcbiAgICAgICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgICAgICBwYXJhbXMuZnVsbG5vZGVScGNVcmwsXG4gICAgICAgICAgICBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3NcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW5PYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWNvdmVySW90YVRva2VuKFxuICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgdG9rZW5PYmplY3RzLFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIGJpdGdvS2V5LFxuICAgICAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXAgb2JqZWN0cyB0byBwcmV2ZW50IG92ZXJzaXplZCB0cmFuc2FjdGlvbnMgKElPVEEgbWF4IHR4IHNpemUgPSAxMjggS2lCKVxuICAgICAgaWYgKG93bmVkT2JqZWN0cy5sZW5ndGggPiBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgICAgb3duZWRPYmplY3RzID0gb3duZWRPYmplY3RzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSlcbiAgICAgICAgICAuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICAgIG93bmVkT2JqZWN0cyxcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgcGFyYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXRCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG5cbiAgICAgIGlmIChuZXRCYWxhbmNlIDw9IDBuKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSBuZXRCYWxhbmNlLnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgICAuZ2FzRGF0YSh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc1BheW1lbnRPYmplY3RzOiBnYXNPYmplY3RzIH0pO1xuXG4gICAgICAvLyBSZXR1cm4gdW5zaWduZWQgdHJhbnNhY3Rpb24gZm9yIGNvbGQvY3VzdG9keSB3YWxsZXRzXG4gICAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKHR4QnVpbGRlciwgc2VuZGVyQWRkcmVzcywgYml0Z29LZXksIGlkeCwgZGVyaXZhdGlvblBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiBmb3Igc2lnbmluZ1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQga2V5c1xuICAgICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgdW5zaWduZWRUeCxcbiAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHJldHVybiBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGlkIG5vdCBmaW5kIGFuIGFkZHJlc3Mgd2l0aCBzdWZmaWNpZW50IGZ1bmRzIHRvIHJlY292ZXIuIGAgK1xuICAgICAgICBgU2Nhbm5lZCBhZGRyZXNzZXMgZnJvbSBpbmRleCAke3N0YXJ0SWR4fSB0byAke2VuZElkeCAtIDF9LiBgICtcbiAgICAgICAgYFBsZWFzZSBzdGFydCB0aGUgbmV4dCBzY2FuIGF0IGFkZHJlc3MgaW5kZXggJHtlbmRJZHh9LmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhZGRyZXNzIGhvbGRzIGEgcG9zaXRpdmUgYmFsYW5jZSBvZiB0aGUgc3BlY2lmaWVkIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYXNUb2tlbkJhbGFuY2Uoc2VuZGVyQWRkcmVzczogc3RyaW5nLCBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IHRoaXMuZ2V0QmFsYW5jZShzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwsIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzcyk7XG4gICAgICByZXR1cm4gYmFsYW5jZSA+IDBuO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGZ1bmRzIGZyb20gbXVsdGlwbGUgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gdGhlIGJhc2UgYWRkcmVzcyAoaW5kZXggMCkuXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3Igb2ZmbGluZSBzaWduaW5nXG4gICAqIChjb2xkL2N1c3RvZHkgd2FsbGV0IHJlY292ZXJ5KS4gT3RoZXJ3aXNlLCByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zb2xpZGF0aW9uIHJlY292ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleSAtIFRoZSBjb21tb25LZXljaGFpbiAoY29tYmluZWQgVFNTIHB1YmxpYyBrZXkpXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggLSBTdGFydGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IDEpXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IC0gRW5kaW5nIGFkZHJlc3MgaW5kZXggdG8gc2NhbiAoZGVmYXVsdDogc3RhcnRpbmdTY2FuSW5kZXggKyAyMClcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gT3B0aW9uYWwgcGFzc3BocmFzZSBmb3Igc2lnbmluZyAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBNUENUeHMgKHNpZ25lZCkgb3IgTVBDU3dlZXBUeHMgKHVuc2lnbmVkKSBjb250YWluaW5nIGFsbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGFkZHJlc3NlcyB3aXRoIGZ1bmRzIGFyZSBmb3VuZCBpbiB0aGUgc2NhbiByYW5nZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckNvbnNvbGlkYXRpb25zKHBhcmFtczogTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMSwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBlbmRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKFxuICAgICAgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICAgICAgJ0ludmFsaWQgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsXG4gICAgICBwYXJhbXMuZW5kaW5nU2NhbkluZGV4XG4gICAgKTtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleT8ucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIERldGVjdCBzaWduaW5nIG1hdGVyaWFsIG9uY2UgdG8gYXZvaWQgcmUtZGVjcnlwdGluZyB0aGUga2V5Y2FyZCBvbiBldmVyeSBsb29wIGl0ZXJhdGlvbi5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgdXNlcktleSAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZVxuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyAnLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRCYXNlUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGJhc2VQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkQmFzZVB1YmxpY0tleSk7XG5cbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBsYXN0U2NhbkluZGV4ID0gc3RhcnRJZHg7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBiYXNlQWRkcmVzcywgLy8gQ29uc29saWRhdGUgdG8gYmFzZSBhZGRyZXNzXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiBpZHgsXG4gICAgICAgIHNjYW46IDEsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVjb3ZlcnlUcmFuc2FjdGlvbjogTVBDVHhzIHwgTVBDU3dlZXBUeHM7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWNvdmVyKHJlY292ZXJQYXJhbXMsIHNpZ25pbmdNYXRlcmlhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgoZSBhcyBFcnJvcikubWVzc2FnZS5zdGFydHNXaXRoKCdEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4nKSkge1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goKHJlY292ZXJ5VHJhbnNhY3Rpb24gYXMgTVBDU3dlZXBUeHMpLnR4UmVxdWVzdHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5wdXNoKChyZWNvdmVyeVRyYW5zYWN0aW9uIGFzIE1QQ1R4cykudHJhbnNhY3Rpb25zWzBdKTtcbiAgICAgIH1cbiAgICAgIGxhc3RTY2FuSW5kZXggPSBpZHg7XG4gICAgfVxuXG4gICAgaWYgKGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAke1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggKyAxXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zW1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFcbiAgICAgIF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLmxhc3RTY2FuSW5kZXggPSBsYXN0U2NhbkluZGV4O1xuICAgICAgcmV0dXJuIHsgdHhSZXF1ZXN0czogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRvdGFsIGNvaW4gYmFsYW5jZSBmb3IgYW4gYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgVG90YWwgYmFsYW5jZSBhcyBhIGJpZ2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRCYWxhbmNlKGFkZHJlc3M6IHN0cmluZywgcnBjVXJsPzogc3RyaW5nLCBjb2luVHlwZT86IHN0cmluZyk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0QmFsYW5jZScsIFthZGRyZXNzLCBub3JtYWxpemVkQ29pblR5cGVdKTtcbiAgICByZXR1cm4gQmlnSW50KHJlc3BvbnNlLnRvdGFsQmFsYW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBvd25lZCBvYmplY3RzIGZvciBhbiBhZGRyZXNzIHZpYSBmdWxsbm9kZSBSUEMuXG4gICAqIEhhbmRsZXMgcGFnaW5hdGlvbiB0byByZXRyaWV2ZSBhbGwgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIHRvIGZpbHRlciBvYmplY3RzIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygb3duZWQgb2JqZWN0cyB3aXRoIGJhbGFuY2UgaW5mb3JtYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hPd25lZE9iamVjdHMoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHJwY1VybD86IHN0cmluZyxcbiAgICBjb2luVHlwZT86IHN0cmluZ1xuICApOiBQcm9taXNlPElvdGFPYmplY3RXaXRoQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IGFsbE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdID0gW107XG4gICAgY29uc3QgaW5uZXJDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCBzdHJ1Y3RUeXBlID0gYDB4Mjo6Y29pbjo6Q29pbjwke2lubmVyQ29pblR5cGV9PmA7XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgICBjb25zdCBNQVhfUEFHRVMgPSA1MDA7XG4gICAgbGV0IHBhZ2VDb3VudCA9IDA7XG4gICAgd2hpbGUgKGhhc05leHRQYWdlICYmIHBhZ2VDb3VudCA8IE1BWF9QQUdFUykge1xuICAgICAgcGFnZUNvdW50Kys7XG4gICAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgICAgZmlsdGVyOiB7IFN0cnVjdFR5cGU6IHN0cnVjdFR5cGUgfSxcbiAgICAgICAgb3B0aW9uczogeyBzaG93Q29udGVudDogdHJ1ZSwgc2hvd1R5cGU6IHRydWUgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRPd25lZE9iamVjdHMnLCBbYWRkcmVzcywgcXVlcnksIGN1cnNvciwgNTBdKTtcbiAgICAgIGNvbnN0IHsgZGF0YSwgbmV4dEN1cnNvciwgaGFzTmV4dFBhZ2U6IG1vcmUgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSB8fCBbXSkge1xuICAgICAgICBjb25zdCB7IG9iamVjdElkLCB2ZXJzaW9uLCBkaWdlc3QgfSA9IGl0ZW0uZGF0YTtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IGl0ZW0uZGF0YS5jb250ZW50Py5maWVsZHM/LmJhbGFuY2UgfHwgJzAnO1xuICAgICAgICBpZiAoQmlnSW50KGJhbGFuY2UpID4gMG4pIHtcbiAgICAgICAgICBhbGxPYmplY3RzLnB1c2goeyBvYmplY3RJZCwgdmVyc2lvbjogdmVyc2lvbi50b1N0cmluZygpLCBkaWdlc3QsIGJhbGFuY2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRDdXJzb3IgPT09IGN1cnNvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGhhc05leHRQYWdlID0gbW9yZTtcbiAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2VDb3VudCA+PSBNQVhfUEFHRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgZmV0Y2hPd25lZE9iamVjdHM6IEhpdCBtYXggcGFnZSBsaW1pdCAoJHtNQVhfUEFHRVN9KSBmb3IgJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsT2JqZWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBKU09OLVJQQyBjYWxsIHRvIElPVEEgZnVsbG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBGdWxsbm9kZSBSUEMgVVJMXG4gICAqIEBwYXJhbSBtZXRob2QgLSBSUEMgbWV0aG9kIG5hbWVcbiAgICogQHBhcmFtIHBhcmFtcyAtIFJQQyBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIFJQQyByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBSUEMgY2FsbCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUnBjQ2FsbCh1cmw6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJQQyBjYWxsIGZhaWxlZCB3aXRoIHN0YXR1cyAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgaWYgKGpzb24uZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUlBDIGVycm9yOiAke2pzb24uZXJyb3IubWVzc2FnZSB8fCBKU09OLnN0cmluZ2lmeShqc29uLmVycm9yKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNvbi5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcHVibGljIG5vZGUgUlBDIFVSTCBmcm9tIHRoZSBjZW50cmFsaXplZCBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBSUEMgVVJMIGZvciB0aGUgY3VycmVudCBCaXRHbyBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFB1YmxpY05vZGVVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLmlvdGFOb2RlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG5hdGl2ZSBjb2luIHR5cGUgaWRlbnRpZmllciBmb3IgZmlsdGVyaW5nIG93bmVkIG9iamVjdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIE5hdGl2ZSBjb2luIHR5cGUgc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIGdldE5hdGl2ZUNvaW5UeXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcweDI6OmlvdGE6OklPVEEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmVzIGdhcyBjb25maWd1cmF0aW9uIGZvciBhIHJlY292ZXJ5IHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBHYXMgZXN0aW1hdGlvbiBpcyBkb25lIHZpYSBhIGRyeS1ydW4gb2YgYSB0ZW1wb3JhcnkgdHJhbnNhY3Rpb24sIHRoZW5cbiAgICogbXVsdGlwbGllZCBieSBERUZBVUxUX0dBU19PVkVSSEVBRCAoMS4xeCkgYXMgYSBzYWZldHkgYnVmZmVyLlxuICAgKlxuICAgKiBAcGFyYW0gb3duZWRPYmplY3RzIC0gTmF0aXZlIElPVEEgY29pbiBvYmplY3RzIHRvIHVzZSBhcyBnYXMgcGF5bWVudFxuICAgKiBAcGFyYW0gc2VuZGVyQWRkcmVzcyAtIFNlbmRlciBhZGRyZXNzIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyAtIFJlY292ZXJ5IHBhcmFtZXRlcnMgKGluY2x1ZGVzIHJlY292ZXJ5RGVzdGluYXRpb24sIHJwY1VybClcbiAgICogQHBhcmFtIHBheW1lbnRPYmplY3RzIC0gT3B0aW9uYWwgdG9rZW4gb2JqZWN0cyBmb3IgdG9rZW4gcmVjb3ZlcnlcbiAgICogQHJldHVybnMgR2FzIGJ1ZGdldCwgZ2FzIHByaWNlLCBnYXMgb2JqZWN0cyBhcnJheSwgYW5kIHRvdGFsIG5hdGl2ZSBiYWxhbmNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByZXBhcmVHYXNBbmRPYmplY3RzKFxuICAgIG93bmVkT2JqZWN0czogSW90YU9iamVjdFdpdGhCYWxhbmNlW10sXG4gICAgc2VuZGVyQWRkcmVzczogc3RyaW5nLFxuICAgIHBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyxcbiAgICBwYXltZW50T2JqZWN0cz86IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXVxuICApOiBQcm9taXNlPHtcbiAgICBnYXNCdWRnZXQ6IG51bWJlcjtcbiAgICBnYXNQcmljZTogbnVtYmVyO1xuICAgIGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXTtcbiAgICB0b3RhbEJhbGFuY2U6IGJpZ2ludDtcbiAgfT4ge1xuICAgIGNvbnN0IGdhc09iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IG93bmVkT2JqZWN0cy5tYXAoKG9iaikgPT4gKHtcbiAgICAgIG9iamVjdElkOiBvYmoub2JqZWN0SWQsXG4gICAgICB2ZXJzaW9uOiBvYmoudmVyc2lvbixcbiAgICAgIGRpZ2VzdDogb2JqLmRpZ2VzdCxcbiAgICB9KSk7XG4gICAgY29uc3QgdG90YWxCYWxhbmNlID0gb3duZWRPYmplY3RzLnJlZHVjZSgoc3VtLCBvYmopID0+IHN1bSArIEJpZ0ludChvYmouYmFsYW5jZSksIDBuKTtcblxuICAgIGNvbnN0IGdhc1ByaWNlID0gYXdhaXQgdGhpcy5mZXRjaEdhc1ByaWNlKHBhcmFtcy5mdWxsbm9kZVJwY1VybCk7XG5cbiAgICAvLyBCdWlsZCB0ZW1wIHRyYW5zYWN0aW9uIGZvciBlc3RpbWF0aW9uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHRlbXBCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICBjb25zdCBlc3RpbWF0aW9uQW1vdW50ID0gdG90YWxCYWxhbmNlID4gMG4gPyAnMScgOiAnMCc7XG5cbiAgICB0ZW1wQnVpbGRlci5zZW5kZXIoc2VuZGVyQWRkcmVzcykucmVjaXBpZW50cyhbeyBhZGRyZXNzOiBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgYW1vdW50OiBlc3RpbWF0aW9uQW1vdW50IH1dKTtcblxuICAgIGlmIChwYXltZW50T2JqZWN0cyAmJiBwYXltZW50T2JqZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0ZW1wQnVpbGRlci5wYXltZW50T2JqZWN0cyhwYXltZW50T2JqZWN0cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRlbXBCdWlsZGVyLnBheW1lbnRPYmplY3RzKGdhc09iamVjdHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBUeCA9IGF3YWl0IHRlbXBCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgZXN0aW1hdGVkR2FzID0gYXdhaXQgdGhpcy5lc3RpbWF0ZUdhcyhhd2FpdCB0ZW1wVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICBjb25zdCBnYXNCdWRnZXQgPSBNYXRoLm1pbihNQVhfR0FTX0JVREdFVCwgTWF0aC50cnVuYyhlc3RpbWF0ZWRHYXMgKiBERUZBVUxUX0dBU19PVkVSSEVBRCkpO1xuXG4gICAgcmV0dXJuIHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzT2JqZWN0cywgdG90YWxCYWxhbmNlIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXJJb3RhVG9rZW4oXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSxcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgaWR4OiBudW1iZXIsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxNUENUeHMgfCBNUENTd2VlcFR4cz4ge1xuICAgIHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAodG9rZW5PYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID4gTUFYX09CSkVDVF9MSU1JVCkge1xuICAgICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfT0JKRUNUX0xJTUlUKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbk9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b2tlbkJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5yZWR1Y2UoKHN1bSwgb2JqKSA9PiBzdW0gKyBCaWdJbnQob2JqLmJhbGFuY2UpLCAwbik7XG4gICAgaWYgKHRva2VuQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBiYWxhbmNlIGlzIHplcm8nKTtcbiAgICB9XG5cbiAgICBsZXQgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICB0cnkge1xuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoIGdhcyBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBnYXMgb2JqZWN0cyBmb3VuZCBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+PSBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGdhc09iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSxcbiAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICBwYXJhbXMsXG4gICAgICB0b2tlbk9iamVjdHNcbiAgICApO1xuICAgIGNvbnN0IG5ldEdhc0JhbGFuY2UgPSB0b3RhbEJhbGFuY2UgLSBCaWdJbnQoZ2FzQnVkZ2V0KTtcbiAgICBpZiAobmV0R2FzQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgZ2FzIGJhbGFuY2UgZm9yIHRva2VuIHJlY292ZXJ5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b2tlbkJhbGFuY2UudG9TdHJpbmcoKTtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcblxuICAgIHR4QnVpbGRlclxuICAgICAgLnNlbmRlcihzZW5kZXJBZGRyZXNzKVxuICAgICAgLnJlY2lwaWVudHMoW3sgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sIGFtb3VudDogcmVjb3ZlcnlBbW91bnQgfV0pXG4gICAgICAucGF5bWVudE9iamVjdHModG9rZW5PYmplY3RzKVxuICAgICAgLmdhc0RhdGEoeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNQYXltZW50T2JqZWN0czogZ2FzT2JqZWN0cyB9KTtcblxuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9ICFwYXJhbXMud2FsbGV0UGFzc3BocmFzZTtcbiAgICBjb25zdCB0b2tlbkNvaW4gPSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MgfHwgdGhpcy5nZXRDaGFpbigpO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRVbnNpZ25lZFN3ZWVwVHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGlkeCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuXG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICB0eEJ1aWxkZXIsXG4gICAgICBwYXJhbXMsXG4gICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgIGRlcml2ZWRQdWJsaWNLZXksXG4gICAgICB1bnNpZ25lZFR4LFxuICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICk7XG5cbiAgICBjb25zdCBmaW5hbFR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IGZpbmFsVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgIHJlY292ZXJ5QW1vdW50LFxuICAgICAgICAgIHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgY29pbjogdG9rZW5Db2luLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGxhc3RTY2FuSW5kZXg6IGlkeCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdHMgTVBDdjEgdnMgTVBDdjIga2V5Y2FyZCBmb3JtYXQgYW5kIHJldHVybnMgdHlwZWQgc2lnbmluZyBtYXRlcmlhbC5cbiAgICogV3JhcHBlZCBhcyBhIHByb3RlY3RlZCBtZXRob2Qgc28gc2lub24gY2FuIHN0dWIgaXQgaW4gdGVzdHMgKG1hdGNoaW5nIERPVC9TVUkpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsKHVzZXJLZXk6IHN0cmluZywgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nKTogUHJvbWlzZTxFZGRzYVNpZ25pbmdNYXRlcmlhbD4ge1xuICAgIHJldHVybiBzaGFyZWRHZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCB3YWxsZXRQYXNzcGhyYXNlLCB0aGlzLmJpdGdvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBNUEN2MiAoTVBTKSByZWNvdmVyeSBzaWduaW5nIGZsb3cgYW5kIHJldHVybnMgdGhlIHJhdyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLlxuICAgKiBXcmFwcGVkIGFzIGEgcHJvdGVjdGVkIG1ldGhvZCBzbyBzaW5vbiBjYW4gc3R1YiBpdCBpbiB0ZXN0cyAobWF0Y2hpbmcgRE9UL1NVSSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2lnbklvdGFNcGNWMlJlY292ZXJ5KHBhcmFtczogUGFyYW1ldGVyczx0eXBlb2Ygc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4PlswXSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgcmV0dXJuIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeChwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVjb3ZlcnlUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZyxcbiAgICBkZXJpdmVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBwcmVjb21wdXRlZE1hdGVyaWFsPzogRWRkc2FTaWduaW5nTWF0ZXJpYWxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXBhcmFtcy51c2VyS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5iYWNrdXBLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBiYWNrdXBLZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMud2FsbGV0UGFzc3BocmFzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPSBpc0VkZHNhU2lnbmluZ01hdGVyaWFsKHByZWNvbXB1dGVkTWF0ZXJpYWwpXG4gICAgICA/IHByZWNvbXB1dGVkTWF0ZXJpYWxcbiAgICAgIDogYXdhaXQgdGhpcy5nZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5LCBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSk7XG5cbiAgICBsZXQgc2lnbmF0dXJlQnVmZmVyOiBCdWZmZXI7XG5cbiAgICBpZiAoc2lnbmluZ01hdGVyaWFsLnZlcnNpb24gPT09ICd2MicpIHtcbiAgICAgIHNpZ25hdHVyZUJ1ZmZlciA9IGF3YWl0IHRoaXMuc2lnbklvdGFNcGNWMlJlY292ZXJ5KHtcbiAgICAgICAgbWVzc2FnZTogdW5zaWduZWRUeC5zaWduYWJsZVBheWxvYWQsXG4gICAgICAgIHVzZXJLZXk6IHNpZ25pbmdNYXRlcmlhbC5lbmNyeXB0ZWRVc2VyS2V5LFxuICAgICAgICBiYWNrdXBLZXksXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICBiaXRnb0tleSxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIGJpdGdvOiB0aGlzLmJpdGdvLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHVzZXJTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKHNpZ25pbmdNYXRlcmlhbC51c2VyUHJ2KSBhcyBFRERTQU1ldGhvZFR5cGVzLlVzZXJTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICAgIGxldCBiYWNrdXBQcnY6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIGJhY2t1cFBydiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBiYWNrdXBLZXksIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIGJhY2t1cCBrZXljaGFpbjogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cFNpZ25pbmdNYXRlcmlhbCA9IEpTT04ucGFyc2UoYmFja3VwUHJ2KSBhcyBFRERTQU1ldGhvZFR5cGVzLkJhY2t1cFNpZ25pbmdNYXRlcmlhbDtcblxuICAgICAgLy8gR2VuZXJhdGUgVFNTIHNpZ25hdHVyZVxuICAgICAgc2lnbmF0dXJlQnVmZmVyID0gYXdhaXQgRUREU0FNZXRob2RzLmdldFRTU1NpZ25hdHVyZShcbiAgICAgICAgdXNlclNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgYmFja3VwU2lnbmluZ01hdGVyaWFsLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgdW5zaWduZWRUeFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBmdWxsIHNpZ25hdHVyZTogc2NoZW1lX2ZsYWcgKDEgYnl0ZSkgKyBzaWduYXR1cmUgKDY0IGJ5dGVzKSArIHB1YmxpY19rZXkgKDMyIGJ5dGVzKVxuICAgIGNvbnN0IHNjaGVtZUZsYWcgPSBCdWZmZXIuYWxsb2MoMSwgMHgwMCk7IC8vIEVkMjU1MTkgc2NoZW1lXG4gICAgY29uc3QgcHVibGljS2V5Qnl0ZXMgPSBCdWZmZXIuZnJvbShkZXJpdmVkUHVibGljS2V5LCAnaGV4Jyk7XG4gICAgY29uc3QgZnVsbFNpZ25hdHVyZSA9IEJ1ZmZlci5jb25jYXQoW3NjaGVtZUZsYWcsIHNpZ25hdHVyZUJ1ZmZlciwgcHVibGljS2V5Qnl0ZXNdKTtcblxuICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IGRlcml2ZWRQdWJsaWNLZXkgfSwgc2lnbmF0dXJlQnVmZmVyKTtcblxuICAgIHJldHVybiBmdWxsU2lnbmF0dXJlLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGN1cnJlbnQgcmVmZXJlbmNlIGdhcyBwcmljZSBmcm9tIGZ1bGxub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gcnBjVXJsIC0gT3B0aW9uYWwgUlBDIFVSTCBvdmVycmlkZVxuICAgKiBAcmV0dXJucyBDdXJyZW50IGdhcyBwcmljZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEdhc1ByaWNlKHJwY1VybD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0UmVmZXJlbmNlR2FzUHJpY2UnLCBbXSk7XG4gICAgcmV0dXJuIHBhcnNlSW50KHJlc3VsdCwgMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlcyBnYXMgZm9yIGEgdHJhbnNhY3Rpb24gdmlhIGRyeSBydW4uXG4gICAqXG4gICAqIEBwYXJhbSB0eEJhc2U2NCAtIFRyYW5zYWN0aW9uIGluIGJhc2U2NCBmb3JtYXRcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgRXN0aW1hdGVkIGdhcyBjb3N0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVzdGltYXRlR2FzKHR4QmFzZTY0OiBzdHJpbmcsIHJwY1VybD86IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YV9kcnlSdW5UcmFuc2FjdGlvbkJsb2NrJywgW3R4QmFzZTY0XSk7XG5cbiAgICBjb25zdCBjb21wdXRhdGlvbkNvc3QgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLmNvbXB1dGF0aW9uQ29zdCwgMTApO1xuICAgIGNvbnN0IHN0b3JhZ2VDb3N0ID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5zdG9yYWdlQ29zdCwgMTApO1xuICAgIGNvbnN0IHN0b3JhZ2VSZWJhdGUgPSBwYXJzZUludChyZXN1bHQuZWZmZWN0cy5nYXNVc2VkLnN0b3JhZ2VSZWJhdGUsIDEwKTtcblxuICAgIHJldHVybiBNYXRoLm1heChjb21wdXRhdGlvbkNvc3QgKyBzdG9yYWdlQ29zdCAtIHN0b3JhZ2VSZWJhdGUsIGNvbXB1dGF0aW9uQ29zdCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKFxuICAgIHR4QnVpbGRlcjogVHJhbnNhY3Rpb25CdWlsZGVyLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBiaXRnb0tleTogc3RyaW5nLFxuICAgIHNjYW5JbmRleDogbnVtYmVyLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgdG9rZW5Db250cmFjdEFkZHJlc3M/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNUENTd2VlcFR4cz4ge1xuICAgIGNvbnN0IHVuc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gYXdhaXQgdW5zaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZWRUeCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBwYXJzZWRUeCA9IGF3YWl0IHRoaXMucGFyc2VUcmFuc2FjdGlvbih7IHR4SGV4OiBzZXJpYWxpemVkVHhIZXggfSk7XG4gICAgY29uc3Qgd2FsbGV0Q29pbiA9IHRva2VuQ29udHJhY3RBZGRyZXNzIHx8IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICBjb25zdCBwYXJzZWRPdXRwdXRzID0gcGFyc2VkVHgub3V0cHV0cyBhcyBBcnJheTx7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBzdHJpbmcgfT47XG4gICAgY29uc3Qgb3V0cHV0ID0gcGFyc2VkT3V0cHV0c1swXTtcblxuICAgIC8vIEJ1aWxkIHBhcnNlZCB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgZnJvbSBwYXJzZWQgZGF0YVxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG91dHB1dC5hbW91bnQsXG4gICAgICAgIHZhbHVlOiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLFxuICAgICAgfSxcbiAgICBdO1xuICAgIGNvbnN0IG91dHB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICB2YWx1ZVN0cmluZzogb3V0cHV0LmFtb3VudCxcbiAgICAgICAgY29pbk5hbWU6IHdhbGxldENvaW4sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBjb25zdCBjb21wbGV0ZWRQYXJzZWRUeCA9IHtcbiAgICAgIGlucHV0czogaW5wdXRzLFxuICAgICAgb3V0cHV0czogb3V0cHV0cyxcbiAgICAgIHNwZW5kQW1vdW50OiBvdXRwdXQuYW1vdW50LFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlNlbmQsXG4gICAgfTtcblxuICAgIGNvbnN0IGZlZSA9IHBhcnNlZFR4LmZlZSBhcyBCaWdOdW1iZXI7XG4gICAgY29uc3QgZmVlSW5mbyA9IHsgZmVlOiBmZWUudG9OdW1iZXIoKSwgZmVlU3RyaW5nOiBmZWUudG9TdHJpbmcoKSB9O1xuICAgIGNvbnN0IGNvaW5TcGVjaWZpYyA9IHsgY29tbW9uS2V5Y2hhaW46IGJpdGdvS2V5IH07XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbjogTVBDVHggPSB7XG4gICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeEhleCxcbiAgICAgIHNjYW5JbmRleCxcbiAgICAgIGNvaW46IHdhbGxldENvaW4sXG4gICAgICBzaWduYWJsZUhleDogdW5zaWduZWRUcmFuc2FjdGlvbi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBwYXJzZWRUeDogY29tcGxldGVkUGFyc2VkVHgsXG4gICAgICBmZWVJbmZvOiBmZWVJbmZvLFxuICAgICAgY29pblNwZWNpZmljOiBjb2luU3BlY2lmaWMsXG4gICAgfTtcblxuICAgIGNvbnN0IHVuc2lnbmVkVHhXcmFwcGVyOiBNUENVbnNpZ25lZFR4ID0geyB1bnNpZ25lZFR4OiB0cmFuc2FjdGlvbiwgc2lnbmF0dXJlU2hhcmVzOiBbXSB9O1xuICAgIGNvbnN0IHR4UmVxdWVzdDogUmVjb3ZlcnlUeFJlcXVlc3QgPSB7IHRyYW5zYWN0aW9uczogW3Vuc2lnbmVkVHhXcmFwcGVyXSwgd2FsbGV0Q29pbiB9O1xuICAgIHJldHVybiB7IHR4UmVxdWVzdHM6IFt0eFJlcXVlc3RdIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByaXZhdGUgSGVscGVyIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGV4dHJhY3RzIHRyYW5zYWN0aW9uIGhleCBmcm9tIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChmb3IgZXJyb3IgbWVzc2FnZXMpXG4gICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHhIZXggaXMgbWlzc2luZ1xuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEV4dHJhY3RUeEhleCh0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIHJlcXVpcmVkIHR4IHByZWJ1aWxkIHByb3BlcnR5IHR4SGV4IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uYCk7XG4gICAgfVxuICAgIHJldHVybiB0eEhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgYSBUcmFuc2ZlclRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNhY3Rpb24gdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBFcnJvciBpZiB0cmFuc2FjdGlvbiBpcyBub3QgYSBUcmFuc2ZlclRyYW5zYWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICghKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNmZXJUcmFuc2FjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggbm90IGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0cmFuc2FjdGlvbiByZWNpcGllbnRzIG1hdGNoIHRoZSBleHBlY3RlZCByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFJlY2lwaWVudHMgLSBUaGUgZXhwZWN0ZWQgcmVjaXBpZW50cyBmcm9tIHRyYW5zYWN0aW9uIHBhcmFtc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHJlY2lwaWVudHMgZG9uJ3QgbWF0Y2hcbiAgICovXG4gIHByaXZhdGUgdmVyaWZ5VHJhbnNhY3Rpb25SZWNpcGllbnRzKFxuICAgIHRyYW5zYWN0aW9uOiBUcmFuc2ZlclRyYW5zYWN0aW9uLFxuICAgIGV4cGVjdGVkUmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSB0cmFuc2FjdGlvbi50b0pzb24oKSBhcyBUcmFuc2ZlclR4RGF0YTtcblxuICAgIGlmICghdHhEYXRhLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3R1YWxSZWNpcGllbnRzID0gdGhpcy5ub3JtYWxpemVSZWNpcGllbnRzKHR4RGF0YS5yZWNpcGllbnRzKTtcbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyhleHBlY3RlZFJlY2lwaWVudHMpO1xuXG4gICAgaWYgKCF0aGlzLnJlY2lwaWVudHNNYXRjaChleHBlY3RlZCwgYWN0dWFsUmVjaXBpZW50cykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHggcmVjaXBpZW50cyBkb2VzIG5vdCBtYXRjaCB3aXRoIGV4cGVjdGVkIHR4UGFyYW1zIHJlY2lwaWVudHMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyByZWNpcGllbnRzIGJ5IGV4dHJhY3Rpbmcgb25seSByZWxldmFudCBmaWVsZHMuXG4gICAqIEBwYXJhbSByZWNpcGllbnRzIC0gUmVjaXBpZW50cyB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCByZWNpcGllbnRzIHdpdGggYWRkcmVzcywgYW1vdW50LCBhbmQgdG9rZW5OYW1lIG9ubHlcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplUmVjaXBpZW50cyhyZWNpcGllbnRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdKTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSB7XG4gICAgcmV0dXJuIHJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IF8ucGljayhyZWNpcGllbnQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZXhwZWN0ZWQgcmVjaXBpZW50cyBtYXRjaCBhY3R1YWwgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIGV4cGVjdGVkIC0gRXhwZWN0ZWQgcmVjaXBpZW50c1xuICAgKiBAcGFyYW0gYWN0dWFsIC0gQWN0dWFsIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFsbCBleHBlY3RlZCByZWNpcGllbnRzIGFyZSBmb3VuZCBpbiBhY3R1YWwgcmVjaXBpZW50c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQ6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10sIGFjdHVhbDogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleHBlY3RlZC5ldmVyeSgoZXhwZWN0ZWRSZWNpcGllbnQpID0+XG4gICAgICBhY3R1YWwuc29tZSgoYWN0dWFsUmVjaXBpZW50KSA9PiBfLmlzRXF1YWwoZXhwZWN0ZWRSZWNpcGllbnQsIGFjdHVhbFJlY2lwaWVudCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHBhcnNlZCB0cmFuc2FjdGlvbiByZXN1bHQuXG4gICAqIFVzZWQgd2hlbiB0cmFuc2FjdGlvbiBoYXMgbm8gb3V0cHV0cy5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRW1wdHlQYXJzZWRUcmFuc2FjdGlvbigpOiBQYXJzZWRUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZTogbmV3IEJpZ051bWJlcigwKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBmcm9tIHRoZSBleHBsYW5hdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIFRoZSBmZWUgYXMgYSBCaWdOdW1iZXJcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVHJhbnNhY3Rpb25GZWUoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBCaWdOdW1iZXIge1xuICAgIGlmIChleHBsYW5hdGlvbi5mZWUuZmVlID09PSAnJykge1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKGV4cGxhbmF0aW9uLmZlZS5mZWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgaW5wdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogSW5jbHVkZXMgc2VuZGVyIGlucHV0IGFuZCBvcHRpb25hbGx5IHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEBwYXJhbSBmZWUgLSBUaGUgY2FsY3VsYXRlZCB0cmFuc2FjdGlvbiBmZWVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gaW5wdXRzXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVHJhbnNhY3Rpb25JbnB1dHMoXG4gICAgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gICAgZmVlOiBCaWdOdW1iZXJcbiAgKTogQXJyYXk8e1xuICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICBhbW91bnQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHNlbmRlckFkZHJlc3MgPSBleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3M7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5vdXRwdXRBbW91bnQpO1xuXG4gICAgLy8gSWYgdGhlcmUncyBhIHNwb25zb3IsIHNlbmRlciBvbmx5IHBheXMgZm9yIG91dHB1dHNcbiAgICAvLyBPdGhlcndpc2UsIHNlbmRlciBwYXlzIGZvciBvdXRwdXRzICsgZmVlXG4gICAgY29uc3Qgc2VuZGVyQW1vdW50ID0gZXhwbGFuYXRpb24uc3BvbnNvciA/IG91dHB1dEFtb3VudC50b0ZpeGVkKCkgOiBvdXRwdXRBbW91bnQucGx1cyhmZWUpLnRvRml4ZWQoKTtcblxuICAgIGNvbnN0IGlucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBzZW5kZXJBbW91bnQsXG4gICAgICB9LFxuICAgIF07XG5cbiAgICAvLyBBZGQgc3BvbnNvciBpbnB1dCBpZiBwcmVzZW50XG4gICAgaWYgKGV4cGxhbmF0aW9uLnNwb25zb3IpIHtcbiAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgYWRkcmVzczogZXhwbGFuYXRpb24uc3BvbnNvcixcbiAgICAgICAgYW1vdW50OiBmZWUudG9GaXhlZCgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG91dHB1dHMgYXJyYXkgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0gZXhwbGFuYXRpb24gLSBUaGUgdHJhbnNhY3Rpb24gZXhwbGFuYXRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgdHJhbnNhY3Rpb24gb3V0cHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uT3V0cHV0cyhleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICByZXR1cm4gZXhwbGFuYXRpb24ub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBuZXcgQmlnTnVtYmVyKG91dHB1dC5hbW91bnQpLnRvRml4ZWQoKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmFjdG9yeSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSBmb3IgdGhpcyBjb2luXG4gICAqL1xuICBwcml2YXRlIGdldFR4QnVpbGRlckZhY3RvcnkoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkcyBhIHRyYW5zYWN0aW9uIGZyb20gaXRzIGhleCByZXByZXNlbnRhdGlvbi5cbiAgICogQHBhcmFtIHR4SGV4IC0gVGhlIHRyYW5zYWN0aW9uIGhleCB0byByZWJ1aWxkXG4gICAqIEByZXR1cm5zIFRoZSByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gY2Fubm90IGJlIHJlYnVpbHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVidWlsZFRyYW5zYWN0aW9uKHR4SGV4OiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhCdWlsZGVyRmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0eEJ1aWxkZXJGYWN0b3J5LmZyb20odHhIZXgpO1xuICAgICAgcmV0dXJuIChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNhY3Rpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZWJ1aWxkIHRyYW5zYWN0aW9uOiAke2Vyci50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhc3luYyBjcmVhdGVCcm9hZGNhc3RhYmxlU3dlZXBUcmFuc2FjdGlvbihwYXJhbXM6IE1QQ1N3ZWVwUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxNUENUeHM+IHtcbiAgICBjb25zdCByZXEgPSBwYXJhbXMuc2lnbmF0dXJlU2hhcmVzO1xuICAgIGNvbnN0IGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnM6IE1QQ1R4W10gPSBbXTtcbiAgICBsZXQgbGFzdFNjYW5JbmRleCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVxW2ldLnR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeDtcbiAgICAgIGNvbnN0IG92YyA9IHJlcVtpXS5vdmM/LlswXTtcbiAgICAgIGNvbnN0IG1wY3YyU2lnbmF0dXJlSGV4ID0gb3ZjPy5lZGRzYU1wY3YyU2lnbmF0dXJlO1xuICAgICAgaWYgKCFvdmMgfHwgKCFtcGN2MlNpZ25hdHVyZUhleCAmJiAhb3ZjLmVkZHNhU2lnbmF0dXJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmF0dXJlKHMpJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLnNpZ25hYmxlSGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBzaWduYWJsZSBoZXgnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbi5zaWduYWJsZUhleCEsICdoZXgnKTtcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uY29pblNwZWNpZmljPy5jb21tb25LZXljaGFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgY29tbW9uIGtleWNoYWluJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjb21tb25LZXljaGFpbiA9IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEuY29tbW9uS2V5Y2hhaW4hIGFzIHN0cmluZztcbiAgICAgIGlmICghdHJhbnNhY3Rpb24uZGVyaXZhdGlvblBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGRlcml2YXRpb24gcGF0aCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSB0cmFuc2FjdGlvbi5kZXJpdmF0aW9uUGF0aCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBkZXJpdmVkUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW4sIGRlcml2YXRpb25QYXRoKS5zbGljZSgwLCA2NCk7XG5cbiAgICAgIGxldCBzaWduYXR1cmVIZXg6IEJ1ZmZlcjtcbiAgICAgIGlmIChtcGN2MlNpZ25hdHVyZUhleCkge1xuICAgICAgICAvLyBNUEN2MiAoT1ZDIDUtcGFzcyk6IHJhdyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlLiBWZXJpZnkgYWdhaW5zdCB0aGVcbiAgICAgICAgLy8gc2FtZSBkZXJpdmVkIHB1YmxpYyBrZXkgdGhlIHRyYW5zYWN0aW9uIGlzIHNpZ25lZCB1bmRlciwgdGhlbiBlbWJlZCBhcy1pcy5cbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gQnVmZmVyLmZyb20obXBjdjJTaWduYXR1cmVIZXgsICdoZXgnKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZCA9IG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkoXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkobWVzc2FnZUJ1ZmZlciksXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSxcbiAgICAgICAgICBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbShkZXJpdmVkUHVibGljS2V5LCAnaGV4JykpXG4gICAgICAgICk7XG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYXR1cmVIZXggPSBzaWduYXR1cmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBNUEMudmVyaWZ5KG1lc3NhZ2VCdWZmZXIsIG92Yy5lZGRzYVNpZ25hdHVyZSk7XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgICB9XG4gICAgICAgIHNpZ25hdHVyZUhleCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICAgIEJ1ZmZlci5mcm9tKG92Yy5lZGRzYVNpZ25hdHVyZS5SLCAnaGV4JyksXG4gICAgICAgICAgQnVmZmVyLmZyb20ob3ZjLmVkZHNhU2lnbmF0dXJlLnNpZ21hLCAnaGV4JyksXG4gICAgICAgIF0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKS5mcm9tKHRyYW5zYWN0aW9uLnNlcmlhbGl6ZWRUeCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBkZXJpdmVkUHVibGljS2V5IH0sIHNpZ25hdHVyZUhleCk7XG4gICAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IHNpZ25lZFRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBzaWduZWRUcmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKS5vdXRwdXRBbW91bnQ7XG5cbiAgICAgIGJyb2FkY2FzdGFibGVUcmFuc2FjdGlvbnMucHVzaCh7XG4gICAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LFxuICAgICAgICBzY2FuSW5kZXg6IHRyYW5zYWN0aW9uLnNjYW5JbmRleCxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduZWRUcmFuc2FjdGlvbi5zZXJpYWxpemVkU2lnbmF0dXJlISxcbiAgICAgICAgcmVjb3ZlcnlBbW91bnQ6IG91dHB1dEFtb3VudC50b1N0cmluZygpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChpID09PSByZXEubGVuZ3RoIC0gMSAmJiB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmxhc3RTY2FuSW5kZXgpIHtcbiAgICAgICAgbGFzdFNjYW5JbmRleCA9IHRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYyEubGFzdFNjYW5JbmRleCBhcyBudW1iZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgdHJhbnNhY3Rpb25zOiBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLCBsYXN0U2NhbkluZGV4IH07XG4gIH1cbn1cbiJdfQ==
988
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW90YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pb3RhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQW9DeUI7QUFDekIsNENBQWdGO0FBQ2hGLHdEQUFnQztBQUNoQywrQkFBMkc7QUFDM0csb0RBQTZFO0FBQzdFLGdFQUFxQztBQUNyQywwQ0FBNEI7QUFRNUIsbUVBQWdFO0FBQ2hFLCtDQU15QjtBQUN6QiwwREFBNkI7QUFVN0I7OztHQUdHO0FBQ0gsTUFBYSxJQUFLLFNBQVEsbUJBQVE7SUFHaEMsWUFBc0IsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELDJDQUEyQztJQUMzQyw2QkFBNkI7SUFDN0IsMkNBQTJDO0lBRTNDLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFD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QUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0NBQ0Y7QUE3cUNELG9CQTZxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBdWRpdERlY3J5cHRlZEtleVBhcmFtcyxcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgRUREU0FNZXRob2RzLFxuICBFRERTQU1ldGhvZFR5cGVzLFxuICBFZGRzYVNpZ25pbmdNYXRlcmlhbCxcbiAgRW52aXJvbm1lbnRzLFxuICBFcnJvck5vSW5wdXRUb1JlY292ZXIsXG4gIGdldEVkZHNhU2lnbmluZ01hdGVyaWFsIGFzIHNoYXJlZEdldEVkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBpc0VkZHNhU2lnbmluZ01hdGVyaWFsLFxuICBLZXlQYWlyLFxuICBNUENBbGdvcml0aG0sXG4gIE1QQ0NvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1JlY292ZXJ5T3B0aW9ucyxcbiAgTVBDU3dlZXBSZWNvdmVyeU9wdGlvbnMsXG4gIE1QQ1N3ZWVwVHhzLFxuICBNUENUeCxcbiAgTVBDVHhzLFxuICBNUENUeXBlLFxuICBNUENVbnNpZ25lZFR4LFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQb3B1bGF0ZWRJbnRlbnQsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyxcbiAgUmVjb3ZlcnlQcm92aWRlckVycm9yLFxuICBSZWNvdmVyeVR4UmVxdWVzdCxcbiAgc2lnbkVkZHNhTXBjVjJSZWNvdmVyeVR4LFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIHZlcmlmeUVkZHNhVHNzV2FsbGV0QWRkcmVzcyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBDb2luRmFtaWx5LCBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL2xpYi91dGlscyc7XG5pbXBvcnQgeyBLZXlQYWlyIGFzIElvdGFLZXlQYWlyLCBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25CdWlsZGVyLCBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHsgYXVkaXRFZGRzYVByaXZhdGVLZXksIGdldERlcml2YXRpb25QYXRoIH0gZnJvbSAnQGJpdGdvL3Nkay1saWItbXBjJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIElvdGFQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVHJhbnNmZXJUeERhdGEsXG4gIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQsXG59IGZyb20gJy4vbGliL2lmYWNlJztcbmltcG9ydCB7IFRyYW5zZmVyVHJhbnNhY3Rpb24gfSBmcm9tICcuL2xpYi90cmFuc2ZlclRyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIERFRkFVTFRfR0FTX09WRVJIRUFELFxuICBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICBNQVhfR0FTX0JVREdFVCxcbiAgTUFYX0dBU19PQkpFQ1RTLFxuICBNQVhfT0JKRUNUX0xJTUlULFxufSBmcm9tICcuL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IG5hY2wgZnJvbSAndHdlZXRuYWNsJztcblxuZXhwb3J0IGludGVyZmFjZSBJb3RhUmVjb3ZlcnlPcHRpb25zIGV4dGVuZHMgTVBDUmVjb3ZlcnlPcHRpb25zIHtcbiAgZnVsbG5vZGVScGNVcmw/OiBzdHJpbmc7IC8vIE92ZXJyaWRlIGRlZmF1bHQgUlBDIFVSTFxufVxuXG5pbnRlcmZhY2UgSW90YU9iamVjdFdpdGhCYWxhbmNlIGV4dGVuZHMgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCB7XG4gIGJhbGFuY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJT1RBIGNvaW4gaW1wbGVtZW50YXRpb24uXG4gKiBTdXBwb3J0cyBUU1MgKFRocmVzaG9sZCBTaWduYXR1cmUgU2NoZW1lKSB3aXRoIEVERFNBIGFsZ29yaXRobS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvdGEgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBJT1RBIGNvaW4gaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5zdGFuY2UoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KTogQmFzZUNvaW4ge1xuICAgIHJldHVybiBuZXcgSW90YShiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb2luIENvbmZpZ3VyYXRpb24gTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZ2V0QmFzZUZhY3RvcigpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLnBvdygxMCwgdGhpcy5fc3RhdGljc0NvaW4uZGVjaW1hbFBsYWNlcyk7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IENvaW5GYW1pbHkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTXVsdGktU2lnbmF0dXJlIGFuZCBUU1MgU3VwcG9ydFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgc3VwcG9ydHNUc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMudHNzO1xuICB9XG5cbiAgZ2V0TVBDQWxnb3JpdGhtKCk6IE1QQ0FsZ29yaXRobSB7XG4gICAgcmV0dXJuIE1QQ1R5cGUuRUREU0E7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkZHJlc3MgYW5kIFB1YmxpYyBLZXkgVmFsaWRhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhbiBJT1RBIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGFkZHJlc3MgdG8gdmFsaWRhdGUgKDY0LWNoYXJhY3RlciBoZXggc3RyaW5nKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgcHVibGljIGtleS5cbiAgICogQHBhcmFtIHB1YiAtIFRoZSBwdWJsaWMga2V5IHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHB1YmxpYyBrZXkgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIGFuIGFkZHJlc3MgYmVsb25ncyB0byBhIFRTUyB3YWxsZXQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBWZXJpZmljYXRpb24gcGFyYW1ldGVycyBpbmNsdWRpbmcgd2FsbGV0IGFkZHJlc3MgYW5kIHVzZXIvYmFja3VwIHB1YmxpYyBrZXlzXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgYmVsb25ncyB0byB0aGUgd2FsbGV0XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB2ZXJpZnlFZGRzYVRzc1dhbGxldEFkZHJlc3MoXG4gICAgICBwYXJhbXMsXG4gICAgICAoYWRkcmVzcykgPT4gdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSxcbiAgICAgIChwdWJsaWNLZXkpID0+IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBUcmFuc2FjdGlvbiBFeHBsYW5hdGlvbiBhbmQgVmVyaWZpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwbGFpbnMgYSB0cmFuc2FjdGlvbiBieSBwYXJzaW5nIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBEZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHRocm93cyBFcnJvciBpZiB0eEhleCBpcyBtaXNzaW5nIG9yIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSBleHBsYWluZWRcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgocGFyYW1zLnR4SGV4LCAnZXhwbGFpbicpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWJ1aWxkVHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gcGFyYW1ldGVycy5cbiAgICogRW5zdXJlcyByZWNpcGllbnRzIGFuZCBhbW91bnRzIGFsaWduIHdpdGggdGhlIGludGVuZGVkIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmVyaWZpY2F0aW9uIHBhcmFtZXRlcnMgY29udGFpbmluZyBwcmVidWlsZCBhbmQgb3JpZ2luYWwgcGFyYW1zXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdmVyaWZpY2F0aW9uIHN1Y2NlZWRzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmVyaWZpY2F0aW9uIGZhaWxzXG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgdHhQcmVidWlsZCwgdHhQYXJhbXMgfSA9IHBhcmFtcztcbiAgICBjb25zdCByYXdUeCA9IHRoaXMudmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhQcmVidWlsZC50eEhleCwgJ3ZlcmlmeScpO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihyYXdUeCk7XG4gICAgdGhpcy52YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbik7XG5cbiAgICBpZiAodHhQYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyh0cmFuc2FjdGlvbiBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uLCB0eFBhcmFtcy5yZWNpcGllbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSB0cmFuc2FjdGlvbiBhbmQgZXh0cmFjdHMgaW5wdXRzLCBvdXRwdXRzLCBhbmQgZmVlcy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgY29udGFpbmluZyB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAqIEByZXR1cm5zIFBhcnNlZCB0cmFuc2FjdGlvbiB3aXRoIGlucHV0cywgb3V0cHV0cywgYW5kIGZlZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IElvdGFQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uID0gYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oeyB0eEhleDogcGFyYW1zLnR4SGV4IH0pO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbkV4cGxhbmF0aW9uIHx8IHRyYW5zYWN0aW9uRXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTtcbiAgICB9XG5cbiAgICBjb25zdCBmZWUgPSB0aGlzLmNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuICAgIGNvbnN0IGlucHV0cyA9IHRoaXMuYnVpbGRUcmFuc2FjdGlvbklucHV0cyh0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBmZWUpO1xuICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLmJ1aWxkVHJhbnNhY3Rpb25PdXRwdXRzKHRyYW5zYWN0aW9uRXhwbGFuYXRpb24pO1xuXG4gICAgcmV0dXJuIHsgaW5wdXRzLCBvdXRwdXRzLCBmZWUgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gS2V5IEdlbmVyYXRpb24gYW5kIFNpZ25pbmdcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBrZXkgcGFpciBmb3IgSU9UQSB0cmFuc2FjdGlvbnMuXG4gICAqIEBwYXJhbSBzZWVkIC0gT3B0aW9uYWwgc2VlZCB0byBnZW5lcmF0ZSBkZXRlcm1pbmlzdGljIGtleSBwYWlyXG4gICAqIEByZXR1cm5zIEtleSBwYWlyIHdpdGggcHVibGljIGFuZCBwcml2YXRlIGtleXNcbiAgICogQHRocm93cyBFcnJvciBpZiBwcml2YXRlIGtleSBnZW5lcmF0aW9uIGZhaWxzXG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IElvdGFLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBJb3RhS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXMoKTtcblxuICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcnYgaW4ga2V5IGdlbmVyYXRpb24uJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiAobm90IGltcGxlbWVudGVkIGZvciBJT1RBKS5cbiAgICogSU9UQSB0cmFuc2FjdGlvbnMgYXJlIHNpZ25lZCBleHRlcm5hbGx5IHVzaW5nIFRTUy5cbiAgICovXG4gIGFzeW5jIHNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1ZGl0cyBhIGRlY3J5cHRlZCBwcml2YXRlIGtleSB0byBlbnN1cmUgaXQncyB2YWxpZCBmb3IgdGhlIGdpdmVuIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGNvbnRhaW5pbmcgbXVsdGlTaWdUeXBlLCBwcml2YXRlIGtleSwgYW5kIHB1YmxpYyBrZXlcbiAgICogQHRocm93cyBFcnJvciBpZiBtdWx0aVNpZ1R5cGUgaXMgbm90IFRTUyBvciBpZiBrZXkgdmFsaWRhdGlvbiBmYWlsc1xuICAgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHBydiwgcHVibGljS2V5IH06IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgaWYgKG11bHRpU2lnVHlwZSAhPT0gbXVsdGlzaWdUeXBlcy50c3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgbXVsdGlTaWdUeXBlJyk7XG4gICAgfVxuICAgIGF1ZGl0RWRkc2FQcml2YXRlS2V5KHBydiwgcHVibGljS2V5ID8/ICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgc2lnbmFibGUgcGF5bG9hZCBmcm9tIGEgc2VyaWFsaXplZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHNlcmlhbGl6ZWRUeCAtIFRoZSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmFibGUgcGF5bG9hZFxuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmFibGVQYXlsb2FkKHNlcmlhbGl6ZWRUeDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCByZWJ1aWx0VHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnJlYnVpbGRUcmFuc2FjdGlvbihzZXJpYWxpemVkVHgpO1xuICAgIHJldHVybiByZWJ1aWx0VHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhbGxvd3NBY2NvdW50Q29uc29saWRhdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjb2luLXNwZWNpZmljIGZpZWxkcyBpbiB0aGUgdHJhbnNhY3Rpb24gaW50ZW50LlxuICAgKiBAcGFyYW0gaW50ZW50IC0gVGhlIHBvcHVsYXRlZCBpbnRlbnQgb2JqZWN0IHRvIG1vZGlmeVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBjb250YWluaW5nIHVuc3BlbnRzIGRhdGFcbiAgICovXG4gIHNldENvaW5TcGVjaWZpY0ZpZWxkc0luSW50ZW50KGludGVudDogUG9wdWxhdGVkSW50ZW50LCBwYXJhbXM6IFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyk6IHZvaWQge1xuICAgIGludGVudC51bnNwZW50cyA9IHBhcmFtcy51bnNwZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24ocykgd2l0aG91dCBCaXRHb1xuICAgKlxuICAgKiBAcGFyYW0ge0lvdGFSZWNvdmVyeU9wdGlvbnN9IHBhcmFtcyBwYXJhbWV0ZXJzIG5lZWRlZCB0byBjb25zdHJ1Y3QgYW5kXG4gICAqIChtYXliZSkgc2lnbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtFZGRzYVNpZ25pbmdNYXRlcmlhbH0gW3ByZWNvbXB1dGVkTWF0ZXJpYWxdIHNpZ25pbmcgbWF0ZXJpYWwgZGV0ZWN0ZWQgb25jZSBieSB0aGVcbiAgICogY2FsbGVyIChlLmcuIHJlY292ZXJDb25zb2xpZGF0aW9ucykgdG8gYXZvaWQgcmUtZGVjcnlwdGluZyB0aGUga2V5Y2FyZCBvbiBldmVyeSBsb29wIGl0ZXJhdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7TVBDVHggfCBNUENTd2VlcFR4c30gYXJyYXkgb2YgdGhlIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24gaGV4IHN0cmluZ3MgYW5kIGluZGljZXNcbiAgICogb2YgdGhlIGFkZHJlc3NlcyBiZWluZyBzd2VwdFxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlcihcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgcHJlY29tcHV0ZWRNYXRlcmlhbD86IEVkZHNhU2lnbmluZ01hdGVyaWFsXG4gICk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBpZiAoIXBhcmFtcy5iaXRnb0tleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGJpdGdvS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbiBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKDAsICdJbnZhbGlkIHN0YXJ0aW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsIHBhcmFtcy5zdGFydGluZ1NjYW5JbmRleCk7XG4gICAgY29uc3QgbnVtSXRlcmF0aW9ucyA9IHV0aWxzLmdldFNhZmVOdW1iZXIoREVGQVVMVF9TQ0FOX0ZBQ1RPUiwgJ0ludmFsaWQgc2Nhbm5pbmcgZmFjdG9yJywgcGFyYW1zLnNjYW4pO1xuICAgIGNvbnN0IGVuZElkeCA9IHN0YXJ0SWR4ICsgbnVtSXRlcmF0aW9ucztcbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgZGVyaXZhdGlvblBhdGggPSAocGFyYW1zLnNlZWQgPyBnZXREZXJpdmF0aW9uUGF0aChwYXJhbXMuc2VlZCkgOiAnbScpICsgYC8ke2lkeH1gO1xuICAgICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGJpdGdvS2V5LCBkZXJpdmF0aW9uUGF0aCkuc2xpY2UoMCwgNjQpO1xuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGRlcml2ZWRQdWJsaWNLZXkpO1xuXG4gICAgICAvLyBUb2tlbiByZWNvdmVyeSBwYXRoOiByZWNvdmVyIHRoZSB0b2tlbiBwcm92aWRlZCBieSB1c2VyXG4gICAgICBpZiAocGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaGFzVG9rZW5CYWxhbmNlKHNlbmRlckFkZHJlc3MsIHBhcmFtcykpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdG9rZW5PYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0b2tlbk9iamVjdHMgPSBhd2FpdCB0aGlzLmZldGNoT3duZWRPYmplY3RzKFxuICAgICAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgICAgIHBhcmFtcy5mdWxsbm9kZVJwY1VybCxcbiAgICAgICAgICAgIHBhcmFtcy50b2tlbkNvbnRyYWN0QWRkcmVzc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY292ZXJ5UHJvdmlkZXJFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFJlY292ZXJ5UHJvdmlkZXJFcnJvcihgRmFpbGVkIHRvIGZldGNoIHRva2VuIG9iamVjdHMgZm9yICR7c2VuZGVyQWRkcmVzc31gLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbk9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlY292ZXJJb3RhVG9rZW4oXG4gICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICB0b2tlbk9iamVjdHMsXG4gICAgICAgICAgICBzZW5kZXJBZGRyZXNzLFxuICAgICAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgYml0Z29LZXksXG4gICAgICAgICAgICBwcmVjb21wdXRlZE1hdGVyaWFsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVjb3ZlcnlQcm92aWRlckVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG93bmVkT2JqZWN0cyA9IGF3YWl0IHRoaXMuZmV0Y2hPd25lZE9iamVjdHMoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWNvdmVyeVByb3ZpZGVyRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBSZWNvdmVyeVByb3ZpZGVyRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBvd25lZCBvYmplY3RzIGZvciAke3NlbmRlckFkZHJlc3N9YCwgZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvd25lZE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXAgb2JqZWN0cyB0byBwcmV2ZW50IG92ZXJzaXplZCB0cmFuc2FjdGlvbnMgKElPVEEgbWF4IHR4IHNpemUgPSAxMjggS2lCKVxuICAgICAgaWYgKG93bmVkT2JqZWN0cy5sZW5ndGggPiBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgICAgb3duZWRPYmplY3RzID0gb3duZWRPYmplY3RzXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChCaWdJbnQoYi5iYWxhbmNlKSA+IEJpZ0ludChhLmJhbGFuY2UpID8gMSA6IC0xKSlcbiAgICAgICAgICAuc2xpY2UoMCwgTUFYX0dBU19PQkpFQ1RTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfSA9IGF3YWl0IHRoaXMucHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgICAgIG93bmVkT2JqZWN0cyxcbiAgICAgICAgc2VuZGVyQWRkcmVzcyxcbiAgICAgICAgcGFyYW1zXG4gICAgICApO1xuXG4gICAgICBjb25zdCBuZXRCYWxhbmNlID0gdG90YWxCYWxhbmNlIC0gQmlnSW50KGdhc0J1ZGdldCk7XG5cbiAgICAgIGlmIChuZXRCYWxhbmNlIDw9IDBuKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSBuZXRCYWxhbmNlLnRvU3RyaW5nKCk7XG5cbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHNlbmRlckFkZHJlc3MpXG4gICAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgICAuZ2FzRGF0YSh7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc1BheW1lbnRPYmplY3RzOiBnYXNPYmplY3RzIH0pO1xuXG4gICAgICAvLyBSZXR1cm4gdW5zaWduZWQgdHJhbnNhY3Rpb24gZm9yIGNvbGQvY3VzdG9keSB3YWxsZXRzXG4gICAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKHR4QnVpbGRlciwgc2VuZGVyQWRkcmVzcywgYml0Z29LZXksIGlkeCwgZGVyaXZhdGlvblBhdGgpO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCB0cmFuc2FjdGlvbiBmb3Igc2lnbmluZ1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgICAgLy8gU2lnbiB0aGUgdHJhbnNhY3Rpb24gd2l0aCBkZWNyeXB0ZWQga2V5c1xuICAgICAgY29uc3QgZnVsbFNpZ25hdHVyZUJhc2U2NCA9IGF3YWl0IHRoaXMuc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgICAgIHR4QnVpbGRlcixcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgZGVyaXZlZFB1YmxpY0tleSxcbiAgICAgICAgdW5zaWduZWRUeCxcbiAgICAgICAgcHJlY29tcHV0ZWRNYXRlcmlhbFxuICAgICAgKTtcblxuICAgICAgLy8gQnVpbGQgYW5kIHJldHVybiBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGZpbmFsVHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNjYW5JbmRleDogaWR4LFxuICAgICAgICAgICAgcmVjb3ZlcnlBbW91bnQsXG4gICAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgICBzaWduYXR1cmU6IGZ1bGxTaWduYXR1cmVCYXNlNjQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbGFzdFNjYW5JbmRleDogaWR4LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKFxuICAgICAgYERpZCBub3QgZmluZCBhbiBhZGRyZXNzIHdpdGggc3VmZmljaWVudCBmdW5kcyB0byByZWNvdmVyLiBgICtcbiAgICAgICAgYFNjYW5uZWQgYWRkcmVzc2VzIGZyb20gaW5kZXggJHtzdGFydElkeH0gdG8gJHtlbmRJZHggLSAxfS4gYCArXG4gICAgICAgIGBQbGVhc2Ugc3RhcnQgdGhlIG5leHQgc2NhbiBhdCBhZGRyZXNzIGluZGV4ICR7ZW5kSWR4fS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgYWRkcmVzcyBob2xkcyBhIHBvc2l0aXZlIGJhbGFuY2Ugb2YgdGhlIHNwZWNpZmllZCB0b2tlbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFzVG9rZW5CYWxhbmNlKHNlbmRlckFkZHJlc3M6IHN0cmluZywgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCB0aGlzLmdldEJhbGFuY2Uoc2VuZGVyQWRkcmVzcywgcGFyYW1zLmZ1bGxub2RlUnBjVXJsLCBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3MpO1xuICAgICAgcmV0dXJuIGJhbGFuY2UgPiAwbjtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlY292ZXJ5UHJvdmlkZXJFcnJvcikge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFJlY292ZXJ5UHJvdmlkZXJFcnJvcihgRmFpbGVkIHRvIHF1ZXJ5IHRva2VuIGJhbGFuY2UgZm9yICR7c2VuZGVyQWRkcmVzc31gLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29uc29saWRhdGVzIGZ1bmRzIGZyb20gbXVsdGlwbGUgcmVjZWl2ZSBhZGRyZXNzZXMgdG8gdGhlIGJhc2UgYWRkcmVzcyAoaW5kZXggMCkuXG4gICAqIElmIHdhbGxldFBhc3NwaHJhc2UgaXMgbm90IHByb3ZpZGVkLCByZXR1cm5zIHVuc2lnbmVkIHRyYW5zYWN0aW9ucyBmb3Igb2ZmbGluZSBzaWduaW5nXG4gICAqIChjb2xkL2N1c3RvZHkgd2FsbGV0IHJlY292ZXJ5KS4gT3RoZXJ3aXNlLCByZXR1cm5zIHNpZ25lZCB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBDb25zb2xpZGF0aW9uIHJlY292ZXJ5IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy5iaXRnb0tleSAtIFRoZSBjb21tb25LZXljaGFpbiAoY29tYmluZWQgVFNTIHB1YmxpYyBrZXkpXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhcnRpbmdTY2FuSW5kZXggLSBTdGFydGluZyBhZGRyZXNzIGluZGV4IHRvIHNjYW4gKGRlZmF1bHQ6IDEpXG4gICAqIEBwYXJhbSBwYXJhbXMuZW5kaW5nU2NhbkluZGV4IC0gRW5kaW5nIGFkZHJlc3MgaW5kZXggdG8gc2NhbiAoZGVmYXVsdDogc3RhcnRpbmdTY2FuSW5kZXggKyAyMClcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gT3B0aW9uYWwgcGFzc3BocmFzZSBmb3Igc2lnbmluZyAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBNUENUeHMgKHNpZ25lZCkgb3IgTVBDU3dlZXBUeHMgKHVuc2lnbmVkKSBjb250YWluaW5nIGFsbCBjb25zb2xpZGF0aW9uIHRyYW5zYWN0aW9uc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vIGFkZHJlc3NlcyB3aXRoIGZ1bmRzIGFyZSBmb3VuZCBpbiB0aGUgc2NhbiByYW5nZVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlckNvbnNvbGlkYXRpb25zKHBhcmFtczogTVBDQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzIHwgTVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG5cbiAgICBjb25zdCBzdGFydElkeCA9IHV0aWxzLmdldFNhZmVOdW1iZXIoMSwgJ0ludmFsaWQgc3RhcnRpbmcgaW5kZXggdG8gc2NhbiBmb3IgYWRkcmVzc2VzJywgcGFyYW1zLnN0YXJ0aW5nU2NhbkluZGV4KTtcbiAgICBjb25zdCBlbmRJZHggPSB1dGlscy5nZXRTYWZlTnVtYmVyKFxuICAgICAgc3RhcnRJZHggKyBERUZBVUxUX1NDQU5fRkFDVE9SLFxuICAgICAgJ0ludmFsaWQgZW5kaW5nIGluZGV4IHRvIHNjYW4gZm9yIGFkZHJlc3NlcycsXG4gICAgICBwYXJhbXMuZW5kaW5nU2NhbkluZGV4XG4gICAgKTtcblxuICAgIGlmIChzdGFydElkeCA8IDEgfHwgZW5kSWR4IDw9IHN0YXJ0SWR4IHx8IGVuZElkeCAtIHN0YXJ0SWR4ID4gMTAgKiBERUZBVUxUX1NDQU5fRkFDVE9SKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIHN0YXJ0aW5nIG9yIGVuZGluZyBpbmRleCB0byBzY2FuIGZvciBhZGRyZXNzZXMuIHN0YXJ0aW5nU2NhbkluZGV4OiAke3N0YXJ0SWR4fSwgZW5kaW5nU2NhbkluZGV4OiAke2VuZElkeH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleT8ucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIERldGVjdCBzaWduaW5nIG1hdGVyaWFsIG9uY2UgdG8gYXZvaWQgcmUtZGVjcnlwdGluZyB0aGUga2V5Y2FyZCBvbiBldmVyeSBsb29wIGl0ZXJhdGlvbi5cbiAgICBjb25zdCBzaWduaW5nTWF0ZXJpYWwgPVxuICAgICAgdXNlcktleSAmJiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZVxuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgTVBDID0gYXdhaXQgRUREU0FNZXRob2RzLmdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IChwYXJhbXMuc2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5zZWVkKSA6ICdtJykgKyAnLzAnO1xuICAgIGNvbnN0IGRlcml2ZWRCYXNlUHVibGljS2V5ID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoYml0Z29LZXksIGJhc2VQYXRoKS5zbGljZSgwLCA2NCk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkQmFzZVB1YmxpY0tleSk7XG5cbiAgICBjb25zdCBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zOiBhbnlbXSA9IFtdO1xuICAgIGxldCBsYXN0U2NhbkluZGV4ID0gc3RhcnRJZHg7XG5cbiAgICBmb3IgKGxldCBpZHggPSBzdGFydElkeDsgaWR4IDwgZW5kSWR4OyBpZHgrKykge1xuICAgICAgY29uc3QgcmVjb3ZlclBhcmFtczogSW90YVJlY292ZXJ5T3B0aW9ucyA9IHtcbiAgICAgICAgdXNlcktleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleTogcGFyYW1zLmJhY2t1cEtleSxcbiAgICAgICAgYml0Z29LZXk6IHBhcmFtcy5iaXRnb0tleSxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBiYXNlQWRkcmVzcywgLy8gQ29uc29saWRhdGUgdG8gYmFzZSBhZGRyZXNzXG4gICAgICAgIHN0YXJ0aW5nU2NhbkluZGV4OiBpZHgsXG4gICAgICAgIHNjYW46IDEsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVjb3ZlcnlUcmFuc2FjdGlvbjogTVBDVHhzIHwgTVBDU3dlZXBUeHM7XG4gICAgICB0cnkge1xuICAgICAgICByZWNvdmVyeVRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5yZWNvdmVyKHJlY292ZXJQYXJhbXMsIHNpZ25pbmdNYXRlcmlhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3JOb0lucHV0VG9SZWNvdmVyKSB7XG4gICAgICAgICAgbGFzdFNjYW5JbmRleCA9IGlkeDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICAgIGNvbnNvbGlkYXRpb25UcmFuc2FjdGlvbnMucHVzaCgocmVjb3ZlcnlUcmFuc2FjdGlvbiBhcyBNUENTd2VlcFR4cykudHhSZXF1ZXN0c1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLnB1c2goKHJlY292ZXJ5VHJhbnNhY3Rpb24gYXMgTVBDVHhzKS50cmFuc2FjdGlvbnNbMF0pO1xuICAgICAgfVxuICAgICAgbGFzdFNjYW5JbmRleCA9IGlkeDtcbiAgICB9XG5cbiAgICBpZiAoY29uc29saWRhdGlvblRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvck5vSW5wdXRUb1JlY292ZXIoXG4gICAgICAgIGBEaWQgbm90IGZpbmQgYW4gYWRkcmVzcyB3aXRoIHN1ZmZpY2llbnQgZnVuZHMgdG8gcmVjb3Zlci4gUGxlYXNlIHN0YXJ0IHRoZSBuZXh0IHNjYW4gYXQgYWRkcmVzcyBpbmRleCAke1xuICAgICAgICAgIGxhc3RTY2FuSW5kZXggKyAxXG4gICAgICAgIH0uYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zW1xuICAgICAgICBjb25zb2xpZGF0aW9uVHJhbnNhY3Rpb25zLmxlbmd0aCAtIDFcbiAgICAgIF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLmxhc3RTY2FuSW5kZXggPSBsYXN0U2NhbkluZGV4O1xuICAgICAgcmV0dXJuIHsgdHhSZXF1ZXN0czogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucyB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogY29uc29saWRhdGlvblRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRvdGFsIGNvaW4gYmFsYW5jZSBmb3IgYW4gYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgVG90YWwgYmFsYW5jZSBhcyBhIGJpZ2ludFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRCYWxhbmNlKGFkZHJlc3M6IHN0cmluZywgcnBjVXJsPzogc3RyaW5nLCBjb2luVHlwZT86IHN0cmluZyk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubWFrZVJwY0NhbGwodXJsLCAnaW90YXhfZ2V0QmFsYW5jZScsIFthZGRyZXNzLCBub3JtYWxpemVkQ29pblR5cGVdKTtcbiAgICByZXR1cm4gQmlnSW50KHJlc3BvbnNlLnRvdGFsQmFsYW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBvd25lZCBvYmplY3RzIGZvciBhbiBhZGRyZXNzIHZpYSBmdWxsbm9kZSBSUEMuXG4gICAqIEhhbmRsZXMgcGFnaW5hdGlvbiB0byByZXRyaWV2ZSBhbGwgb2JqZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBJT1RBIGFkZHJlc3MgdG8gcXVlcnlcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHBhcmFtIGNvaW5UeXBlIC0gT3B0aW9uYWwgY29pbiB0eXBlIHRvIGZpbHRlciBvYmplY3RzIChkZWZhdWx0cyB0byBuYXRpdmUgSU9UQSlcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygb3duZWQgb2JqZWN0cyB3aXRoIGJhbGFuY2UgaW5mb3JtYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hPd25lZE9iamVjdHMoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHJwY1VybD86IHN0cmluZyxcbiAgICBjb2luVHlwZT86IHN0cmluZ1xuICApOiBQcm9taXNlPElvdGFPYmplY3RXaXRoQmFsYW5jZVtdPiB7XG4gICAgY29uc3QgdXJsID0gcnBjVXJsIHx8IHRoaXMuZ2V0UHVibGljTm9kZVVybCgpO1xuICAgIGNvbnN0IGFsbE9iamVjdHM6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdID0gW107XG4gICAgY29uc3QgaW5uZXJDb2luVHlwZSA9IGNvaW5UeXBlIHx8IHRoaXMuZ2V0TmF0aXZlQ29pblR5cGUoKTtcbiAgICBjb25zdCBzdHJ1Y3RUeXBlID0gYDB4Mjo6Y29pbjo6Q29pbjwke2lubmVyQ29pblR5cGV9PmA7XG4gICAgbGV0IGN1cnNvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGhhc05leHRQYWdlID0gdHJ1ZTtcbiAgICBjb25zdCBNQVhfUEFHRVMgPSA1MDA7XG4gICAgbGV0IHBhZ2VDb3VudCA9IDA7XG4gICAgd2hpbGUgKGhhc05leHRQYWdlICYmIHBhZ2VDb3VudCA8IE1BWF9QQUdFUykge1xuICAgICAgcGFnZUNvdW50Kys7XG4gICAgICBjb25zdCBxdWVyeSA9IHtcbiAgICAgICAgZmlsdGVyOiB7IFN0cnVjdFR5cGU6IHN0cnVjdFR5cGUgfSxcbiAgICAgICAgb3B0aW9uczogeyBzaG93Q29udGVudDogdHJ1ZSwgc2hvd1R5cGU6IHRydWUgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlUnBjQ2FsbCh1cmwsICdpb3RheF9nZXRPd25lZE9iamVjdHMnLCBbYWRkcmVzcywgcXVlcnksIGN1cnNvciwgNTBdKTtcbiAgICAgIGNvbnN0IHsgZGF0YSwgbmV4dEN1cnNvciwgaGFzTmV4dFBhZ2U6IG1vcmUgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSB8fCBbXSkge1xuICAgICAgICBjb25zdCB7IG9iamVjdElkLCB2ZXJzaW9uLCBkaWdlc3QgfSA9IGl0ZW0uZGF0YTtcbiAgICAgICAgY29uc3QgYmFsYW5jZSA9IGl0ZW0uZGF0YS5jb250ZW50Py5maWVsZHM/LmJhbGFuY2UgfHwgJzAnO1xuICAgICAgICBpZiAoQmlnSW50KGJhbGFuY2UpID4gMG4pIHtcbiAgICAgICAgICBhbGxPYmplY3RzLnB1c2goeyBvYmplY3RJZCwgdmVyc2lvbjogdmVyc2lvbi50b1N0cmluZygpLCBkaWdlc3QsIGJhbGFuY2UgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5leHRDdXJzb3IgPT09IGN1cnNvcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGhhc05leHRQYWdlID0gbW9yZTtcbiAgICAgIGN1cnNvciA9IG5leHRDdXJzb3I7XG4gICAgfVxuXG4gICAgaWYgKHBhZ2VDb3VudCA+PSBNQVhfUEFHRVMpIHtcbiAgICAgIGNvbnNvbGUud2FybihgZmV0Y2hPd25lZE9iamVjdHM6IEhpdCBtYXggcGFnZSBsaW1pdCAoJHtNQVhfUEFHRVN9KSBmb3IgJHthZGRyZXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsT2JqZWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBKU09OLVJQQyBjYWxsIHRvIElPVEEgZnVsbG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBGdWxsbm9kZSBSUEMgVVJMXG4gICAqIEBwYXJhbSBtZXRob2QgLSBSUEMgbWV0aG9kIG5hbWVcbiAgICogQHBhcmFtIHBhcmFtcyAtIFJQQyBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIFJQQyByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBSUEMgY2FsbCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUnBjQ2FsbCh1cmw6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCByZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgUmVjb3ZlcnlQcm92aWRlckVycm9yKGBSUEMgY2FsbCBmYWlsZWQgZm9yICR7bWV0aG9kfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gLCBlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgUmVjb3ZlcnlQcm92aWRlckVycm9yKGBSUEMgY2FsbCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIGlmIChqc29uLmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgUmVjb3ZlcnlQcm92aWRlckVycm9yKGBSUEMgZXJyb3I6ICR7anNvbi5lcnJvci5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGpzb24uZXJyb3IpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBqc29uLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwdWJsaWMgbm9kZSBSUEMgVVJMIGZyb20gdGhlIGNlbnRyYWxpemVkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFJQQyBVUkwgZm9yIHRoZSBjdXJyZW50IEJpdEdvIGVudmlyb25tZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UHVibGljTm9kZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0uaW90YU5vZGVVcmw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmF0aXZlIGNvaW4gdHlwZSBpZGVudGlmaWVyIGZvciBmaWx0ZXJpbmcgb3duZWQgb2JqZWN0cy5cbiAgICpcbiAgICogQHJldHVybnMgTmF0aXZlIGNvaW4gdHlwZSBzdHJpbmdcbiAgICovXG4gIHByaXZhdGUgZ2V0TmF0aXZlQ29pblR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJzB4Mjo6aW90YTo6SU9UQSc7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgZ2FzIGNvbmZpZ3VyYXRpb24gZm9yIGEgcmVjb3ZlcnkgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEdhcyBlc3RpbWF0aW9uIGlzIGRvbmUgdmlhIGEgZHJ5LXJ1biBvZiBhIHRlbXBvcmFyeSB0cmFuc2FjdGlvbiwgdGhlblxuICAgKiBtdWx0aXBsaWVkIGJ5IERFRkFVTFRfR0FTX09WRVJIRUFEICgxLjF4KSBhcyBhIHNhZmV0eSBidWZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvd25lZE9iamVjdHMgLSBOYXRpdmUgSU9UQSBjb2luIG9iamVjdHMgdG8gdXNlIGFzIGdhcyBwYXltZW50XG4gICAqIEBwYXJhbSBzZW5kZXJBZGRyZXNzIC0gU2VuZGVyIGFkZHJlc3MgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUmVjb3ZlcnkgcGFyYW1ldGVycyAoaW5jbHVkZXMgcmVjb3ZlcnlEZXN0aW5hdGlvbiwgcnBjVXJsKVxuICAgKiBAcGFyYW0gcGF5bWVudE9iamVjdHMgLSBPcHRpb25hbCB0b2tlbiBvYmplY3RzIGZvciB0b2tlbiByZWNvdmVyeVxuICAgKiBAcmV0dXJucyBHYXMgYnVkZ2V0LCBnYXMgcHJpY2UsIGdhcyBvYmplY3RzIGFycmF5LCBhbmQgdG90YWwgbmF0aXZlIGJhbGFuY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZUdhc0FuZE9iamVjdHMoXG4gICAgb3duZWRPYmplY3RzOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXSxcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIHBheW1lbnRPYmplY3RzPzogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdXG4gICk6IFByb21pc2U8e1xuICAgIGdhc0J1ZGdldDogbnVtYmVyO1xuICAgIGdhc1ByaWNlOiBudW1iZXI7XG4gICAgZ2FzT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdO1xuICAgIHRvdGFsQmFsYW5jZTogYmlnaW50O1xuICB9PiB7XG4gICAgY29uc3QgZ2FzT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdID0gb3duZWRPYmplY3RzLm1hcCgob2JqKSA9PiAoe1xuICAgICAgb2JqZWN0SWQ6IG9iai5vYmplY3RJZCxcbiAgICAgIHZlcnNpb246IG9iai52ZXJzaW9uLFxuICAgICAgZGlnZXN0OiBvYmouZGlnZXN0LFxuICAgIH0pKTtcbiAgICBjb25zdCB0b3RhbEJhbGFuY2UgPSBvd25lZE9iamVjdHMucmVkdWNlKChzdW0sIG9iaikgPT4gc3VtICsgQmlnSW50KG9iai5iYWxhbmNlKSwgMG4pO1xuXG4gICAgY29uc3QgZ2FzUHJpY2UgPSBhd2FpdCB0aGlzLmZldGNoR2FzUHJpY2UocGFyYW1zLmZ1bGxub2RlUnBjVXJsKTtcblxuICAgIC8vIEJ1aWxkIHRlbXAgdHJhbnNhY3Rpb24gZm9yIGVzdGltYXRpb25cbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdGVtcEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIGNvbnN0IGVzdGltYXRpb25BbW91bnQgPSB0b3RhbEJhbGFuY2UgPiAwbiA/ICcxJyA6ICcwJztcblxuICAgIHRlbXBCdWlsZGVyLnNlbmRlcihzZW5kZXJBZGRyZXNzKS5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IGVzdGltYXRpb25BbW91bnQgfV0pO1xuXG4gICAgaWYgKHBheW1lbnRPYmplY3RzICYmIHBheW1lbnRPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRlbXBCdWlsZGVyLnBheW1lbnRPYmplY3RzKHBheW1lbnRPYmplY3RzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcEJ1aWxkZXIucGF5bWVudE9iamVjdHMoZ2FzT2JqZWN0cyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcFR4ID0gYXdhaXQgdGVtcEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRHYXMgPSBhd2FpdCB0aGlzLmVzdGltYXRlR2FzKGF3YWl0IHRlbXBUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIGNvbnN0IGdhc0J1ZGdldCA9IE1hdGgubWluKE1BWF9HQVNfQlVER0VULCBNYXRoLnRydW5jKGVzdGltYXRlZEdhcyAqIERFRkFVTFRfR0FTX09WRVJIRUFEKSk7XG5cbiAgICByZXR1cm4geyBnYXNCdWRnZXQsIGdhc1ByaWNlLCBnYXNPYmplY3RzLCB0b3RhbEJhbGFuY2UgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVjb3ZlcklvdGFUb2tlbihcbiAgICBwYXJhbXM6IElvdGFSZWNvdmVyeU9wdGlvbnMsXG4gICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2U6IElvdGFPYmplY3RXaXRoQmFsYW5jZVtdLFxuICAgIHNlbmRlckFkZHJlc3M6IHN0cmluZyxcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIGRlcml2ZWRQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBpZHg6IG51bWJlcixcbiAgICBiaXRnb0tleTogc3RyaW5nLFxuICAgIHByZWNvbXB1dGVkTWF0ZXJpYWw/OiBFZGRzYVNpZ25pbmdNYXRlcmlhbFxuICApOiBQcm9taXNlPE1QQ1R4cyB8IE1QQ1N3ZWVwVHhzPiB7XG4gICAgdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UgPSB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5zb3J0KChhLCBiKSA9PiAoQmlnSW50KGIuYmFsYW5jZSkgPiBCaWdJbnQoYS5iYWxhbmNlKSA/IDEgOiAtMSkpO1xuICAgIGlmICh0b2tlbk9iamVjdHNXaXRoQmFsYW5jZS5sZW5ndGggPiBNQVhfT0JKRUNUX0xJTUlUKSB7XG4gICAgICB0b2tlbk9iamVjdHNXaXRoQmFsYW5jZSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLnNsaWNlKDAsIE1BWF9PQkpFQ1RfTElNSVQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuT2JqZWN0czogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdID0gdG9rZW5PYmplY3RzV2l0aEJhbGFuY2UubWFwKChvYmopID0+ICh7XG4gICAgICBvYmplY3RJZDogb2JqLm9iamVjdElkLFxuICAgICAgdmVyc2lvbjogb2JqLnZlcnNpb24sXG4gICAgICBkaWdlc3Q6IG9iai5kaWdlc3QsXG4gICAgfSkpO1xuICAgIGNvbnN0IHRva2VuQmFsYW5jZSA9IHRva2VuT2JqZWN0c1dpdGhCYWxhbmNlLnJlZHVjZSgoc3VtLCBvYmopID0+IHN1bSArIEJpZ0ludChvYmouYmFsYW5jZSksIDBuKTtcbiAgICBpZiAodG9rZW5CYWxhbmNlIDw9IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCdUb2tlbiBiYWxhbmNlIGlzIHplcm8nKTtcbiAgICB9XG5cbiAgICBsZXQgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlOiBJb3RhT2JqZWN0V2l0aEJhbGFuY2VbXTtcbiAgICB0cnkge1xuICAgICAgZ2FzT2JqZWN0c1dpdGhCYWxhbmNlID0gYXdhaXQgdGhpcy5mZXRjaE93bmVkT2JqZWN0cyhzZW5kZXJBZGRyZXNzLCBwYXJhbXMuZnVsbG5vZGVScGNVcmwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVjb3ZlcnlQcm92aWRlckVycm9yKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgUmVjb3ZlcnlQcm92aWRlckVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggZ2FzIG9iamVjdHMgZm9yIHRva2VuIHJlY292ZXJ5JywgZSk7XG4gICAgfVxuICAgIGlmIChnYXNPYmplY3RzV2l0aEJhbGFuY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3JOb0lucHV0VG9SZWNvdmVyKCdObyBnYXMgb2JqZWN0cyBmb3VuZCBmb3IgdG9rZW4gcmVjb3ZlcnknKTtcbiAgICB9XG5cbiAgICBnYXNPYmplY3RzV2l0aEJhbGFuY2UgPSBnYXNPYmplY3RzV2l0aEJhbGFuY2Uuc29ydCgoYSwgYikgPT4gKEJpZ0ludChiLmJhbGFuY2UpID4gQmlnSW50KGEuYmFsYW5jZSkgPyAxIDogLTEpKTtcbiAgICBpZiAoZ2FzT2JqZWN0c1dpdGhCYWxhbmNlLmxlbmd0aCA+PSBNQVhfR0FTX09CSkVDVFMpIHtcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSA9IGdhc09iamVjdHNXaXRoQmFsYW5jZS5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMgLSAxKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdhc0J1ZGdldCwgZ2FzUHJpY2UsIGdhc09iamVjdHMsIHRvdGFsQmFsYW5jZSB9ID0gYXdhaXQgdGhpcy5wcmVwYXJlR2FzQW5kT2JqZWN0cyhcbiAgICAgIGdhc09iamVjdHNXaXRoQmFsYW5jZSxcbiAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICBwYXJhbXMsXG4gICAgICB0b2tlbk9iamVjdHNcbiAgICApO1xuICAgIGNvbnN0IG5ldEdhc0JhbGFuY2UgPSB0b3RhbEJhbGFuY2UgLSBCaWdJbnQoZ2FzQnVkZ2V0KTtcbiAgICBpZiAobmV0R2FzQmFsYW5jZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yTm9JbnB1dFRvUmVjb3ZlcignSW5zdWZmaWNpZW50IGdhcyBiYWxhbmNlIGZvciB0b2tlbiByZWNvdmVyeScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG9rZW5CYWxhbmNlLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0VHhCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG5cbiAgICB0eEJ1aWxkZXJcbiAgICAgIC5zZW5kZXIoc2VuZGVyQWRkcmVzcylcbiAgICAgIC5yZWNpcGllbnRzKFt7IGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHJlY292ZXJ5QW1vdW50IH1dKVxuICAgICAgLnBheW1lbnRPYmplY3RzKHRva2VuT2JqZWN0cylcbiAgICAgIC5nYXNEYXRhKHsgZ2FzQnVkZ2V0LCBnYXNQcmljZSwgZ2FzUGF5bWVudE9iamVjdHM6IGdhc09iamVjdHMgfSk7XG5cbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLndhbGxldFBhc3NwaHJhc2U7XG4gICAgY29uc3QgdG9rZW5Db2luID0gcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzIHx8IHRoaXMuZ2V0Q2hhaW4oKTtcblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFRyYW5zYWN0aW9uKFxuICAgICAgICB0eEJ1aWxkZXIsXG4gICAgICAgIHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGJpdGdvS2V5LFxuICAgICAgICBpZHgsXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcblxuICAgIGNvbnN0IGZ1bGxTaWduYXR1cmVCYXNlNjQgPSBhd2FpdCB0aGlzLnNpZ25SZWNvdmVyeVRyYW5zYWN0aW9uKFxuICAgICAgdHhCdWlsZGVyLFxuICAgICAgcGFyYW1zLFxuICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICBkZXJpdmVkUHVibGljS2V5LFxuICAgICAgdW5zaWduZWRUeCxcbiAgICAgIHByZWNvbXB1dGVkTWF0ZXJpYWxcbiAgICApO1xuXG4gICAgY29uc3QgZmluYWxUeCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVHJhbnNmZXJUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBmaW5hbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzY2FuSW5kZXg6IGlkeCxcbiAgICAgICAgICByZWNvdmVyeUFtb3VudCxcbiAgICAgICAgICBzZXJpYWxpemVkVHgsXG4gICAgICAgICAgc2lnbmF0dXJlOiBmdWxsU2lnbmF0dXJlQmFzZTY0LFxuICAgICAgICAgIGNvaW46IHRva2VuQ29pbixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsYXN0U2NhbkluZGV4OiBpZHgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIE1QQ3YxIHZzIE1QQ3YyIGtleWNhcmQgZm9ybWF0IGFuZCByZXR1cm5zIHR5cGVkIHNpZ25pbmcgbWF0ZXJpYWwuXG4gICAqIFdyYXBwZWQgYXMgYSBwcm90ZWN0ZWQgbWV0aG9kIHNvIHNpbm9uIGNhbiBzdHViIGl0IGluIHRlc3RzIChtYXRjaGluZyBET1QvU1VJKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRFZGRzYVNpZ25pbmdNYXRlcmlhbCh1c2VyS2V5OiBzdHJpbmcsIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyk6IFByb21pc2U8RWRkc2FTaWduaW5nTWF0ZXJpYWw+IHtcbiAgICByZXR1cm4gc2hhcmVkR2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleSwgd2FsbGV0UGFzc3BocmFzZSwgdGhpcy5iaXRnbyk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgTVBDdjIgKE1QUykgcmVjb3Zlcnkgc2lnbmluZyBmbG93IGFuZCByZXR1cm5zIHRoZSByYXcgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZS5cbiAgICogV3JhcHBlZCBhcyBhIHByb3RlY3RlZCBtZXRob2Qgc28gc2lub24gY2FuIHN0dWIgaXQgaW4gdGVzdHMgKG1hdGNoaW5nIERPVC9TVUkpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNpZ25Jb3RhTXBjVjJSZWNvdmVyeShwYXJhbXM6IFBhcmFtZXRlcnM8dHlwZW9mIHNpZ25FZGRzYU1wY1YyUmVjb3ZlcnlUeD5bMF0pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIHJldHVybiBzaWduRWRkc2FNcGNWMlJlY292ZXJ5VHgocGFyYW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2lnblJlY292ZXJ5VHJhbnNhY3Rpb24oXG4gICAgdHhCdWlsZGVyOiBUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gICAgcGFyYW1zOiBJb3RhUmVjb3ZlcnlPcHRpb25zLFxuICAgIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsXG4gICAgZGVyaXZlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIHVuc2lnbmVkVHg6IFRyYW5zZmVyVHJhbnNhY3Rpb24sXG4gICAgcHJlY29tcHV0ZWRNYXRlcmlhbD86IEVkZHNhU2lnbmluZ01hdGVyaWFsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFwYXJhbXMudXNlcktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHVzZXJLZXknKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuYmFja3VwS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBiaXRnb0tleSA9IHBhcmFtcy5iaXRnb0tleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuXG4gICAgY29uc3Qgc2lnbmluZ01hdGVyaWFsID0gaXNFZGRzYVNpZ25pbmdNYXRlcmlhbChwcmVjb21wdXRlZE1hdGVyaWFsKVxuICAgICAgPyBwcmVjb21wdXRlZE1hdGVyaWFsXG4gICAgICA6IGF3YWl0IHRoaXMuZ2V0RWRkc2FTaWduaW5nTWF0ZXJpYWwodXNlcktleSwgcGFyYW1zLndhbGxldFBhc3NwaHJhc2UpO1xuXG4gICAgbGV0IHNpZ25hdHVyZUJ1ZmZlcjogQnVmZmVyO1xuXG4gICAgaWYgKHNpZ25pbmdNYXRlcmlhbC52ZXJzaW9uID09PSAndjInKSB7XG4gICAgICBzaWduYXR1cmVCdWZmZXIgPSBhd2FpdCB0aGlzLnNpZ25Jb3RhTXBjVjJSZWNvdmVyeSh7XG4gICAgICAgIG1lc3NhZ2U6IHVuc2lnbmVkVHguc2lnbmFibGVQYXlsb2FkLFxuICAgICAgICB1c2VyS2V5OiBzaWduaW5nTWF0ZXJpYWwuZW5jcnlwdGVkVXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5LFxuICAgICAgICB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgYml0Z29LZXksXG4gICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICBiaXRnbzogdGhpcy5iaXRnbyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1c2VyU2lnbmluZ01hdGVyaWFsID0gSlNPTi5wYXJzZShzaWduaW5nTWF0ZXJpYWwudXNlclBydikgYXMgRUREU0FNZXRob2RUeXBlcy5Vc2VyU2lnbmluZ01hdGVyaWFsO1xuXG4gICAgICBsZXQgYmFja3VwUHJ2OiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICBiYWNrdXBQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogYmFja3VwS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBTaWduaW5nTWF0ZXJpYWwgPSBKU09OLnBhcnNlKGJhY2t1cFBydikgYXMgRUREU0FNZXRob2RUeXBlcy5CYWNrdXBTaWduaW5nTWF0ZXJpYWw7XG5cbiAgICAgIC8vIEdlbmVyYXRlIFRTUyBzaWduYXR1cmVcbiAgICAgIHNpZ25hdHVyZUJ1ZmZlciA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRUU1NTaWduYXR1cmUoXG4gICAgICAgIHVzZXJTaWduaW5nTWF0ZXJpYWwsXG4gICAgICAgIGJhY2t1cFNpZ25pbmdNYXRlcmlhbCxcbiAgICAgICAgZGVyaXZhdGlvblBhdGgsXG4gICAgICAgIHVuc2lnbmVkVHhcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgZnVsbCBzaWduYXR1cmU6IHNjaGVtZV9mbGFnICgxIGJ5dGUpICsgc2lnbmF0dXJlICg2NCBieXRlcykgKyBwdWJsaWNfa2V5ICgzMiBieXRlcylcbiAgICBjb25zdCBzY2hlbWVGbGFnID0gQnVmZmVyLmFsbG9jKDEsIDB4MDApOyAvLyBFZDI1NTE5IHNjaGVtZVxuICAgIGNvbnN0IHB1YmxpY0tleUJ5dGVzID0gQnVmZmVyLmZyb20oZGVyaXZlZFB1YmxpY0tleSwgJ2hleCcpO1xuICAgIGNvbnN0IGZ1bGxTaWduYXR1cmUgPSBCdWZmZXIuY29uY2F0KFtzY2hlbWVGbGFnLCBzaWduYXR1cmVCdWZmZXIsIHB1YmxpY0tleUJ5dGVzXSk7XG5cbiAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiBkZXJpdmVkUHVibGljS2V5IH0sIHNpZ25hdHVyZUJ1ZmZlcik7XG5cbiAgICByZXR1cm4gZnVsbFNpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjdXJyZW50IHJlZmVyZW5jZSBnYXMgcHJpY2UgZnJvbSBmdWxsbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHJwY1VybCAtIE9wdGlvbmFsIFJQQyBVUkwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgQ3VycmVudCBnYXMgcHJpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hHYXNQcmljZShycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGF4X2dldFJlZmVyZW5jZUdhc1ByaWNlJywgW10pO1xuICAgIHJldHVybiBwYXJzZUludChyZXN1bHQsIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZXMgZ2FzIGZvciBhIHRyYW5zYWN0aW9uIHZpYSBkcnkgcnVuLlxuICAgKlxuICAgKiBAcGFyYW0gdHhCYXNlNjQgLSBUcmFuc2FjdGlvbiBpbiBiYXNlNjQgZm9ybWF0XG4gICAqIEBwYXJhbSBycGNVcmwgLSBPcHRpb25hbCBSUEMgVVJMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIEVzdGltYXRlZCBnYXMgY29zdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlc3RpbWF0ZUdhcyh0eEJhc2U2NDogc3RyaW5nLCBycGNVcmw/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHVybCA9IHJwY1VybCB8fCB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1ha2VScGNDYWxsKHVybCwgJ2lvdGFfZHJ5UnVuVHJhbnNhY3Rpb25CbG9jaycsIFt0eEJhc2U2NF0pO1xuXG4gICAgY29uc3QgY29tcHV0YXRpb25Db3N0ID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5jb21wdXRhdGlvbkNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlQ29zdCA9IHBhcnNlSW50KHJlc3VsdC5lZmZlY3RzLmdhc1VzZWQuc3RvcmFnZUNvc3QsIDEwKTtcbiAgICBjb25zdCBzdG9yYWdlUmViYXRlID0gcGFyc2VJbnQocmVzdWx0LmVmZmVjdHMuZ2FzVXNlZC5zdG9yYWdlUmViYXRlLCAxMCk7XG5cbiAgICByZXR1cm4gTWF0aC5tYXgoY29tcHV0YXRpb25Db3N0ICsgc3RvcmFnZUNvc3QgLSBzdG9yYWdlUmViYXRlLCBjb21wdXRhdGlvbkNvc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFVuc2lnbmVkU3dlZXBUcmFuc2FjdGlvbihcbiAgICB0eEJ1aWxkZXI6IFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgICBzZW5kZXJBZGRyZXNzOiBzdHJpbmcsXG4gICAgYml0Z29LZXk6IHN0cmluZyxcbiAgICBzY2FuSW5kZXg6IG51bWJlcixcbiAgICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIHRva2VuQ29udHJhY3RBZGRyZXNzPzogc3RyaW5nXG4gICk6IFByb21pc2U8TVBDU3dlZXBUeHM+IHtcbiAgICBjb25zdCB1bnNpZ25lZFRyYW5zYWN0aW9uID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUcmFuc2ZlclRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IGF3YWl0IHVuc2lnbmVkVHJhbnNhY3Rpb24udG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBCdWZmZXIuZnJvbShzZXJpYWxpemVkVHgsICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBhd2FpdCB0aGlzLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogc2VyaWFsaXplZFR4SGV4IH0pO1xuICAgIGNvbnN0IHdhbGxldENvaW4gPSB0b2tlbkNvbnRyYWN0QWRkcmVzcyB8fCB0aGlzLmdldENoYWluKCk7XG4gICAgY29uc3QgcGFyc2VkT3V0cHV0cyA9IHBhcnNlZFR4Lm91dHB1dHMgYXMgQXJyYXk8eyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nIH0+O1xuICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlZE91dHB1dHNbMF07XG5cbiAgICAvLyBCdWlsZCBwYXJzZWQgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGZyb20gcGFyc2VkIGRhdGFcbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIHZhbHVlU3RyaW5nOiBvdXRwdXQuYW1vdW50LFxuICAgICAgICB2YWx1ZTogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgICBjb25zdCBvdXRwdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgdmFsdWVTdHJpbmc6IG91dHB1dC5hbW91bnQsXG4gICAgICAgIGNvaW5OYW1lOiB3YWxsZXRDb2luLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgY29tcGxldGVkUGFyc2VkVHggPSB7XG4gICAgICBpbnB1dHM6IGlucHV0cyxcbiAgICAgIG91dHB1dHM6IG91dHB1dHMsXG4gICAgICBzcGVuZEFtb3VudDogb3V0cHV0LmFtb3VudCxcbiAgICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgIH07XG5cbiAgICBjb25zdCBmZWUgPSBwYXJzZWRUeC5mZWUgYXMgQmlnTnVtYmVyO1xuICAgIGNvbnN0IGZlZUluZm8gPSB7IGZlZTogZmVlLnRvTnVtYmVyKCksIGZlZVN0cmluZzogZmVlLnRvU3RyaW5nKCkgfTtcbiAgICBjb25zdCBjb2luU3BlY2lmaWMgPSB7IGNvbW1vbktleWNoYWluOiBiaXRnb0tleSB9O1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IE1QQ1R4ID0ge1xuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHhIZXgsXG4gICAgICBzY2FuSW5kZXgsXG4gICAgICBjb2luOiB3YWxsZXRDb2luLFxuICAgICAgc2lnbmFibGVIZXg6IHVuc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgcGFyc2VkVHg6IGNvbXBsZXRlZFBhcnNlZFR4LFxuICAgICAgZmVlSW5mbzogZmVlSW5mbyxcbiAgICAgIGNvaW5TcGVjaWZpYzogY29pblNwZWNpZmljLFxuICAgIH07XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4V3JhcHBlcjogTVBDVW5zaWduZWRUeCA9IHsgdW5zaWduZWRUeDogdHJhbnNhY3Rpb24sIHNpZ25hdHVyZVNoYXJlczogW10gfTtcbiAgICBjb25zdCB0eFJlcXVlc3Q6IFJlY292ZXJ5VHhSZXF1ZXN0ID0geyB0cmFuc2FjdGlvbnM6IFt1bnNpZ25lZFR4V3JhcHBlcl0sIHdhbGxldENvaW4gfTtcbiAgICByZXR1cm4geyB0eFJlcXVlc3RzOiBbdHhSZXF1ZXN0XSB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBleHRyYWN0cyB0cmFuc2FjdGlvbiBoZXggZnJvbSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gdHhIZXggLSBUaGUgdHJhbnNhY3Rpb24gaGV4IHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAoZm9yIGVycm9yIG1lc3NhZ2VzKVxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIHRyYW5zYWN0aW9uIGhleFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHR4SGV4IGlzIG1pc3NpbmdcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVBbmRFeHRyYWN0VHhIZXgodHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgb3BlcmF0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbmApO1xuICAgIH1cbiAgICByZXR1cm4gdHhIZXg7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGEgVHJhbnNmZXJUcmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdHJhbnNhY3Rpb24gaXMgbm90IGEgVHJhbnNmZXJUcmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoISh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zZmVyVHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG5vdCBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdHJhbnNhY3Rpb24gcmVjaXBpZW50cyBtYXRjaCB0aGUgZXhwZWN0ZWQgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIC0gVGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZXhwZWN0ZWRSZWNpcGllbnRzIC0gVGhlIGV4cGVjdGVkIHJlY2lwaWVudHMgZnJvbSB0cmFuc2FjdGlvbiBwYXJhbXNcbiAgICogQHRocm93cyBFcnJvciBpZiByZWNpcGllbnRzIGRvbid0IG1hdGNoXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeVRyYW5zYWN0aW9uUmVjaXBpZW50cyhcbiAgICB0cmFuc2FjdGlvbjogVHJhbnNmZXJUcmFuc2FjdGlvbixcbiAgICBleHBlY3RlZFJlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W11cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gdHJhbnNhY3Rpb24udG9Kc29uKCkgYXMgVHJhbnNmZXJUeERhdGE7XG5cbiAgICBpZiAoIXR4RGF0YS5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsUmVjaXBpZW50cyA9IHRoaXMubm9ybWFsaXplUmVjaXBpZW50cyh0eERhdGEucmVjaXBpZW50cyk7XG4gICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLm5vcm1hbGl6ZVJlY2lwaWVudHMoZXhwZWN0ZWRSZWNpcGllbnRzKTtcblxuICAgIGlmICghdGhpcy5yZWNpcGllbnRzTWF0Y2goZXhwZWN0ZWQsIGFjdHVhbFJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IHJlY2lwaWVudHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgcmVjaXBpZW50cyBieSBleHRyYWN0aW5nIG9ubHkgcmVsZXZhbnQgZmllbGRzLlxuICAgKiBAcGFyYW0gcmVjaXBpZW50cyAtIFJlY2lwaWVudHMgdG8gbm9ybWFsaXplXG4gICAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgcmVjaXBpZW50cyB3aXRoIGFkZHJlc3MsIGFtb3VudCwgYW5kIHRva2VuTmFtZSBvbmx5XG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZVJlY2lwaWVudHMocmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSk6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10ge1xuICAgIHJldHVybiByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiBfLnBpY2socmVjaXBpZW50LCBbJ2FkZHJlc3MnLCAnYW1vdW50JywgJ3Rva2VuTmFtZSddKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGV4cGVjdGVkIHJlY2lwaWVudHMgbWF0Y2ggYWN0dWFsIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSBleHBlY3RlZCAtIEV4cGVjdGVkIHJlY2lwaWVudHNcbiAgICogQHBhcmFtIGFjdHVhbCAtIEFjdHVhbCByZWNpcGllbnRzIGZyb20gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgZXhwZWN0ZWQgcmVjaXBpZW50cyBhcmUgZm91bmQgaW4gYWN0dWFsIHJlY2lwaWVudHNcbiAgICovXG4gIHByaXZhdGUgcmVjaXBpZW50c01hdGNoKGV4cGVjdGVkOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdLCBhY3R1YWw6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoKGV4cGVjdGVkUmVjaXBpZW50KSA9PlxuICAgICAgYWN0dWFsLnNvbWUoKGFjdHVhbFJlY2lwaWVudCkgPT4gXy5pc0VxdWFsKGV4cGVjdGVkUmVjaXBpZW50LCBhY3R1YWxSZWNpcGllbnQpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlbXB0eSBwYXJzZWQgdHJhbnNhY3Rpb24gcmVzdWx0LlxuICAgKiBVc2VkIHdoZW4gdHJhbnNhY3Rpb24gaGFzIG5vIG91dHB1dHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVtcHR5UGFyc2VkVHJhbnNhY3Rpb24oKTogUGFyc2VkVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IFtdLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBmZWU6IG5ldyBCaWdOdW1iZXIoMCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSB0cmFuc2FjdGlvbiBmZWUgZnJvbSB0aGUgZXhwbGFuYXRpb24uXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcmV0dXJucyBUaGUgZmVlIGFzIGEgQmlnTnVtYmVyXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVRyYW5zYWN0aW9uRmVlKGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogQmlnTnVtYmVyIHtcbiAgICBpZiAoZXhwbGFuYXRpb24uZmVlLmZlZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBuZXcgQmlnTnVtYmVyKDApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJpZ051bWJlcihleHBsYW5hdGlvbi5mZWUuZmVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGlucHV0cyBhcnJheSBmb3IgYSBwYXJzZWQgdHJhbnNhY3Rpb24uXG4gICAqIEluY2x1ZGVzIHNlbmRlciBpbnB1dCBhbmQgb3B0aW9uYWxseSBzcG9uc29yIGlucHV0IGlmIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsYW5hdGlvbiAtIFRoZSB0cmFuc2FjdGlvbiBleHBsYW5hdGlvblxuICAgKiBAcGFyYW0gZmVlIC0gVGhlIGNhbGN1bGF0ZWQgdHJhbnNhY3Rpb24gZmVlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIGlucHV0c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRyYW5zYWN0aW9uSW5wdXRzKFxuICAgIGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIGZlZTogQmlnTnVtYmVyXG4gICk6IEFycmF5PHtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gICAgYW1vdW50OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoZXhwbGFuYXRpb24ub3V0cHV0QW1vdW50KTtcblxuICAgIC8vIElmIHRoZXJlJ3MgYSBzcG9uc29yLCBzZW5kZXIgb25seSBwYXlzIGZvciBvdXRwdXRzXG4gICAgLy8gT3RoZXJ3aXNlLCBzZW5kZXIgcGF5cyBmb3Igb3V0cHV0cyArIGZlZVxuICAgIGNvbnN0IHNlbmRlckFtb3VudCA9IGV4cGxhbmF0aW9uLnNwb25zb3IgPyBvdXRwdXRBbW91bnQudG9GaXhlZCgpIDogb3V0cHV0QW1vdW50LnBsdXMoZmVlKS50b0ZpeGVkKCk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHNlbmRlckFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogc2VuZGVyQW1vdW50LFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gQWRkIHNwb25zb3IgaW5wdXQgaWYgcHJlc2VudFxuICAgIGlmIChleHBsYW5hdGlvbi5zcG9uc29yKSB7XG4gICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6IGV4cGxhbmF0aW9uLnNwb25zb3IsXG4gICAgICAgIGFtb3VudDogZmVlLnRvRml4ZWQoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbnB1dHM7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBvdXRwdXRzIGFycmF5IGZvciBhIHBhcnNlZCB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIGV4cGxhbmF0aW9uIC0gVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHRyYW5zYWN0aW9uIG91dHB1dHNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUcmFuc2FjdGlvbk91dHB1dHMoZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiBBcnJheTx7XG4gICAgYWRkcmVzczogc3RyaW5nO1xuICAgIGFtb3VudDogc3RyaW5nO1xuICB9PiB7XG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uLm91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgIGFtb3VudDogbmV3IEJpZ051bWJlcihvdXRwdXQuYW1vdW50KS50b0ZpeGVkKCksXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0cmFuc2FjdGlvbiBidWlsZGVyIGZhY3RvcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgZm9yIHRoaXMgY29pblxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUeEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZHMgYSB0cmFuc2FjdGlvbiBmcm9tIGl0cyBoZXggcmVwcmVzZW50YXRpb24uXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gcmVidWlsZFxuICAgKiBAcmV0dXJucyBUaGUgcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRyYW5zYWN0aW9uIGNhbm5vdCBiZSByZWJ1aWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYnVpbGRUcmFuc2FjdGlvbih0eEhleDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4QnVpbGRlckZhY3RvcnkgPSB0aGlzLmdldFR4QnVpbGRlckZhY3RvcnkoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdHhCdWlsZGVyRmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICAgIHJldHVybiAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmVidWlsZCB0cmFuc2FjdGlvbjogJHtlcnIudG9TdHJpbmcoKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXN5bmMgY3JlYXRlQnJvYWRjYXN0YWJsZVN3ZWVwVHJhbnNhY3Rpb24ocGFyYW1zOiBNUENTd2VlcFJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8TVBDVHhzPiB7XG4gICAgY29uc3QgcmVxID0gcGFyYW1zLnNpZ25hdHVyZVNoYXJlcztcbiAgICBjb25zdCBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zOiBNUENUeFtdID0gW107XG4gICAgbGV0IGxhc3RTY2FuSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IE1QQyA9IGF3YWl0IEVERFNBTWV0aG9kcy5nZXRJbml0aWFsaXplZE1wY0luc3RhbmNlKCk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHJlcVtpXS50eFJlcXVlc3QudHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHg7XG4gICAgICBjb25zdCBvdmMgPSByZXFbaV0ub3ZjPy5bMF07XG4gICAgICBjb25zdCBtcGN2MlNpZ25hdHVyZUhleCA9IG92Yz8uZWRkc2FNcGN2MlNpZ25hdHVyZTtcbiAgICAgIGlmICghb3ZjIHx8ICghbXBjdjJTaWduYXR1cmVIZXggJiYgIW92Yy5lZGRzYVNpZ25hdHVyZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHNpZ25hdHVyZShzKScpO1xuICAgICAgfVxuICAgICAgaWYgKCF0cmFuc2FjdGlvbi5zaWduYWJsZUhleCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3Npbmcgc2lnbmFibGUgaGV4Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmZyb20odHJhbnNhY3Rpb24uc2lnbmFibGVIZXghLCAnaGV4Jyk7XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLmNvaW5TcGVjaWZpYz8uY29tbW9uS2V5Y2hhaW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGNvbW1vbiBrZXljaGFpbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tbW9uS2V5Y2hhaW4gPSB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmNvbW1vbktleWNoYWluISBhcyBzdHJpbmc7XG4gICAgICBpZiAoIXRyYW5zYWN0aW9uLmRlcml2YXRpb25QYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBkZXJpdmF0aW9uIHBhdGgnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gdHJhbnNhY3Rpb24uZGVyaXZhdGlvblBhdGggYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleWNoYWluLCBkZXJpdmF0aW9uUGF0aCkuc2xpY2UoMCwgNjQpO1xuXG4gICAgICBsZXQgc2lnbmF0dXJlSGV4OiBCdWZmZXI7XG4gICAgICBpZiAobXBjdjJTaWduYXR1cmVIZXgpIHtcbiAgICAgICAgLy8gTVBDdjIgKE9WQyA1LXBhc3MpOiByYXcgNjQtYnl0ZSBFZDI1NTE5IHNpZ25hdHVyZS4gVmVyaWZ5IGFnYWluc3QgdGhlXG4gICAgICAgIC8vIHNhbWUgZGVyaXZlZCBwdWJsaWMga2V5IHRoZSB0cmFuc2FjdGlvbiBpcyBzaWduZWQgdW5kZXIsIHRoZW4gZW1iZWQgYXMtaXMuXG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IEJ1ZmZlci5mcm9tKG1wY3YyU2lnbmF0dXJlSGV4LCAnaGV4Jyk7XG4gICAgICAgIGNvbnN0IGlzVmFsaWQgPSBuYWNsLnNpZ24uZGV0YWNoZWQudmVyaWZ5KFxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KG1lc3NhZ2VCdWZmZXIpLFxuICAgICAgICAgIG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSksXG4gICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oZGVyaXZlZFB1YmxpY0tleSwgJ2hleCcpKVxuICAgICAgICApO1xuICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2lnbmF0dXJlJyk7XG4gICAgICAgIH1cbiAgICAgICAgc2lnbmF0dXJlSGV4ID0gc2lnbmF0dXJlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gTVBDLnZlcmlmeShtZXNzYWdlQnVmZmVyLCBvdmMuZWRkc2FTaWduYXR1cmUpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgICAgfVxuICAgICAgICBzaWduYXR1cmVIZXggPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgICBCdWZmZXIuZnJvbShvdmMuZWRkc2FTaWduYXR1cmUuUiwgJ2hleCcpLFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKG92Yy5lZGRzYVNpZ25hdHVyZS5zaWdtYSwgJ2hleCcpLFxuICAgICAgICBdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUeEJ1aWxkZXJGYWN0b3J5KCkuZnJvbSh0cmFuc2FjdGlvbi5zZXJpYWxpemVkVHgpO1xuICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogZGVyaXZlZFB1YmxpY0tleSB9LCBzaWduYXR1cmVIZXgpO1xuICAgICAgY29uc3Qgc2lnbmVkVHJhbnNhY3Rpb24gPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRyYW5zZmVyVHJhbnNhY3Rpb247XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHggPSBhd2FpdCBzaWduZWRUcmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gc2lnbmVkVHJhbnNhY3Rpb24uZXhwbGFpblRyYW5zYWN0aW9uKCkub3V0cHV0QW1vdW50O1xuXG4gICAgICBicm9hZGNhc3RhYmxlVHJhbnNhY3Rpb25zLnB1c2goe1xuICAgICAgICBzZXJpYWxpemVkVHg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgc2NhbkluZGV4OiB0cmFuc2FjdGlvbi5zY2FuSW5kZXgsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmVkVHJhbnNhY3Rpb24uc2VyaWFsaXplZFNpZ25hdHVyZSEsXG4gICAgICAgIHJlY292ZXJ5QW1vdW50OiBvdXRwdXRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaSA9PT0gcmVxLmxlbmd0aCAtIDEgJiYgdHJhbnNhY3Rpb24uY29pblNwZWNpZmljIS5sYXN0U2NhbkluZGV4KSB7XG4gICAgICAgIGxhc3RTY2FuSW5kZXggPSB0cmFuc2FjdGlvbi5jb2luU3BlY2lmaWMhLmxhc3RTY2FuSW5kZXggYXMgbnVtYmVyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHRyYW5zYWN0aW9uczogYnJvYWRjYXN0YWJsZVRyYW5zYWN0aW9ucywgbGFzdFNjYW5JbmRleCB9O1xuICB9XG59XG4iXX0=