@bitgo-beta/sdk-coin-tempo 1.0.1-beta.669 → 1.0.1-beta.670

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":"tempo.d.ts","sourceRoot":"","sources":["../../src/tempo.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAG3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,SAAS,EAGT,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EAEjB,eAAe,EACf,oCAAoC,EAKrC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAazE,qBAAa,KAAM,SAAQ,uBAAuB;IAChD,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAI/E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB,kBAAkB;IAClB,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAaxC;;;;;;OAMG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAsDnG;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BrG;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyBnF;;;OAGG;IACG,iBAAiB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;IAyE9E;;;;;OAKG;IACH,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,oCAAoC,GAAG,IAAI;IAQ1G;;;OAGG;IACG,+BAA+B,CACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAWnC;;;;;;;OAOG;YACW,aAAa;IAkD3B;;;;;;;OAOG;YACW,iBAAiB;IA8C/B;;;;;;OAMG;cACa,UAAU,CACxB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,YAAY,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;IA2CpE;;;OAGG;cACa,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IAkDpH;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,OAAO,GAAG,kBAAkB;CAGpF"}
1
+ {"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/tempo.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAG3B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACzD,OAAO,EACL,QAAQ,EACR,SAAS,EAGT,YAAY,EACZ,uBAAuB,EACvB,iBAAiB,EAEjB,eAAe,EACf,oCAAoC,EAKrC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,qBAAqB,CAAC;AAazE,qBAAa,KAAM,SAAQ,uBAAuB;IAChD,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAI/E;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB,kBAAkB;IAClB,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAaxC;;;;;;OAMG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAsDnG;;;;OAIG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC;;;;OAIG;IACG,eAAe,CAAC,MAAM,EAAE,uBAAuB,GAAG,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BrG;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAyBnF;;;OAGG;IACG,iBAAiB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC;IAyE9E;;;;;OAKG;IACH,6BAA6B,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,oCAAoC,GAAG,IAAI;IAQ1G;;;OAGG;IACG,+BAA+B,CACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAWnC;;;;;;;OAOG;YACW,aAAa;IAkD3B;;;;;;;OAOG;YACW,iBAAiB;IA8C/B;;;;;;OAMG;cACa,UAAU,CACxB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,YAAY,GAAG,kBAAkB,GAAG,oBAAoB,CAAC;IA4CpE;;;OAGG;cACa,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IA0DpH;;OAEG;IACH,SAAS,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,OAAO,GAAG,kBAAkB;CAGpF"}
package/dist/src/tempo.js CHANGED
@@ -412,8 +412,8 @@ class Tempo extends abstract_eth_1.AbstractEthLikeNewCoins {
412
412
  */
413
413
  async recoverTSS(params) {
414
414
  this.validateRecoveryParams(params);
415
- const userKey = params.userKey.replace(/\s/g, '');
416
- const backupKey = params.backupKey.replace(/\s/g, '');
415
+ const userKey = (params.userKey ?? '').replace(/\s/g, '');
416
+ const backupKey = (params.backupKey ?? '').replace(/\s/g, '');
417
417
  if ((0, sdk_core_1.getIsUnsignedSweep)({ userKey, backupKey, isTss: params.isTss })) {
418
418
  return this.buildUnsignedSweepTxnTSS(params);
419
419
  }
@@ -423,6 +423,7 @@ class Tempo extends abstract_eth_1.AbstractEthLikeNewCoins {
423
423
  const derivedCommonKeyChain = MPC.deriveUnhardened(commonKeyChain, 'm/0');
424
424
  const backupKeyPair = new abstract_eth_1.KeyPair({ pub: derivedCommonKeyChain.slice(0, 66) });
425
425
  const baseAddress = backupKeyPair.getAddress();
426
+ this.assertTssBaseAddressMatchesWallet(baseAddress, params);
426
427
  const { tx: unsignedTx } = await this.buildTempoSweepTx(baseAddress, params);
427
428
  const serializedHex = await unsignedTx.serialize();
428
429
  // Hash the unsigned 0x76 tx — matches Tip20TransactionBuilder's own signing logic
@@ -444,12 +445,20 @@ class Tempo extends abstract_eth_1.AbstractEthLikeNewCoins {
444
445
  * Called by recoverTSS when plain public key shares are provided.
445
446
  */
446
447
  async buildUnsignedSweepTxnTSS(params) {
447
- const backupKey = params.backupKey.replace(/\s/g, '');
448
+ const backupKey = this.getTssCommonKeychain(params);
449
+ if (!backupKey) {
450
+ throw new Error('missing commonKeyChain');
451
+ }
448
452
  const derivationPath = params.derivationSeed ? (0, sdk_lib_mpc_1.getDerivationPath)(params.derivationSeed) : 'm/0';
449
453
  const MPC = new sdk_core_1.Ecdsa();
450
454
  const derivedCommonKeyChain = MPC.deriveUnhardened(backupKey, derivationPath);
451
455
  const backupKeyPair = new abstract_eth_1.KeyPair({ pub: derivedCommonKeyChain.slice(0, 66) });
452
456
  const baseAddress = backupKeyPair.getAddress();
457
+ // Fail closed on a wrong keychain, as the base class does. A derivationSeed sweeps a
458
+ // pseudorandom child the caller cannot predict, so there is nothing to compare against.
459
+ if (!params.derivationSeed) {
460
+ this.assertTssBaseAddressMatchesWallet(baseAddress, params);
461
+ }
453
462
  const { tx, nonce, sweepAmount, gasMarginUnits } = await this.buildTempoSweepTx(baseAddress, params);
454
463
  const serializedHex = await tx.serialize();
455
464
  const serializedTxHex = serializedHex.replace('0x', '');
@@ -498,4 +507,4 @@ class Tempo extends abstract_eth_1.AbstractEthLikeNewCoins {
498
507
  }
499
508
  }
500
509
  exports.Tempo = Tempo;
501
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCwyREFZa0M7QUFFbEMsbURBZThCO0FBQzlCLHlEQUE0RDtBQUM1RCxpREFBeUU7QUFDekUsbUNBQWdDO0FBQ2hDLCtCQUFrRTtBQUNsRSx1Q0FLcUI7QUFDckIsK0NBQStGO0FBQy9GLHlDQUEyQjtBQUMzQix5REFBMkM7QUFFM0MsTUFBYSxLQUFNLFNBQVEsc0NBQXVCO0lBQ2hELFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGFBQWE7UUFDWCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxPQUFPLE9B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Y0FBYyxFQUFFLFNBQVMsRUFBRTtnQ0FDM0MsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dDQUN2Qix1QkFBdUIsRUFBRSxNQUFNLENBQUMsdUJBQXVCOzZCQUN4RDs0QkFDRCxLQUFLOzRCQUNMLGVBQWUsRUFBRSxFQUFFO3lCQUNwQjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNPLHFCQUFxQixDQUFDLE1BQThCO1FBQzVELE9BQU8sSUFBSSw2QkFBdUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFrQyxDQUFDO0lBQ3RHLENBQUM7Q0FDRjtBQXpoQkQsc0JBeWhCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7XG4gIEFic3RyYWN0RXRoTGlrZU5ld0NvaW5zLFxuICBSZWNvdmVyT3B0aW9ucyxcbiAgT2ZmbGluZVZhdWx0VHhJbmZvLFxuICBVbnNpZ25lZFN3ZWVwVHhNUEN2MixcbiAgUmVjb3ZlcnlJbmZvLFxuICBUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5RXRoQWRkcmVzc09wdGlvbnMsXG4gIFRzc1ZlcmlmeUV0aEFkZHJlc3NPcHRpb25zLFxuICBvcHRpb25hbERlcHMsXG4gIEtleVBhaXIsXG59IGZyb20gJ0BiaXRnby1iZXRhL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgdHlwZSAqIGFzIEV0aExpa2VDb21tb24gZnJvbSAnQGV0aGVyZXVtanMvY29tbW9uJztcbmltcG9ydCB7XG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIEludmFsaWRNZW1vSWRFcnJvcixcbiAgTVBDQWxnb3JpdGhtLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IsXG4gIFBvcHVsYXRlZEludGVudCxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICBjb21tb24sXG4gIEVjZHNhLFxuICBFQ0RTQVV0aWxzLFxuICBnZXRJc1Vuc2lnbmVkU3dlZXAsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGdldERlcml2YXRpb25QYXRoIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgZXRoZXJzIH0gZnJvbSAnZXRoZXJzJztcbmltcG9ydCB7IFRpcDIwVHJhbnNhY3Rpb24sIFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHtcbiAgYW1vdW50VG9UaXAyMFVuaXRzLFxuICB0aXAyMFVuaXRzVG9BbW91bnQsXG4gIGlzVGlwMjBUcmFuc2FjdGlvbixcbiAgaXNWYWxpZE1lbW9JZCBhcyBpc1ZhbGlkTWVtb0lkVXRpbCxcbn0gZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgTUFJTk5FVF9DT0lOLCBQQVRIX1VTRF9UT0tFTl9NQUlOTkVULCBQQVRIX1VTRF9UT0tFTl9URVNUTkVUIH0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCAqIGFzIHVybCBmcm9tICd1cmwnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5leHBvcnQgY2xhc3MgVGVtcG8gZXh0ZW5kcyBBYnN0cmFjdEV0aExpa2VOZXdDb2lucyB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBUZW1wbyBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IFRlbXBvKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjaGFpbiBpZGVudGlmaWVyXG4gICAqL1xuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbj8ubmFtZSB8fCAndGVtcG8nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZnVsbCBjaGFpbiBuYW1lXG4gICAqL1xuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnVGVtcG8nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMWU2O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhbHVlLWxlc3MgdHJhbnNmZXJzIGFyZSBhbGxvd2VkXG4gICAqIEVWTS1iYXNlZCBjaGFpbnMgYWxsb3cgemVyby12YWx1ZSB0cmFuc2ZlcnMgZm9yIHNtYXJ0IGNvbnRyYWN0IGludGVyYWN0aW9uc1xuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIFRTUyBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgTVBDIGFsZ29yaXRobSAoRUNEU0EgZm9yIEVWTSBjaGFpbnMpXG4gICAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VjZHNhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgd2hldGhlciBhbiBhZGRyZXNzIHN0cmluZyBpcyB2YWxpZCBmb3IgVGVtcG9cbiAgICogU3VwcG9ydHMgYWRkcmVzc2VzIHdpdGggb3B0aW9uYWwgbWVtb0lkIHF1ZXJ5IHBhcmFtZXRlciAoZS5nLiwgMHguLi4/bWVtb0lkPTEyMylcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFkZHJlc3MgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgYWRkcmVzcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBiYXNlQWRkcmVzcyB9ID0gdGhpcy5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcbiAgICAgIHJldHVybiBvcHRpb25hbERlcHMuZXRoVXRpbC5pc1ZhbGlkQWRkcmVzcyhvcHRpb25hbERlcHMuZXRoVXRpbC5hZGRIZXhQcmVmaXgoYmFzZUFkZHJlc3MpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFkZHJlc3MgaW50byBiYXNlIGFkZHJlc3MgYW5kIG9wdGlvbmFsIG1lbW9JZFxuICAgKiBUaHJvd3MgSW52YWxpZEFkZHJlc3NFcnJvciBmb3IgaW52YWxpZCBhZGRyZXNzIGZvcm1hdHNcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBBZGRyZXNzIHN0cmluZywgcG90ZW50aWFsbHkgd2l0aCA/bWVtb0lkPVggc3VmZml4XG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGFkZHJlc3MsIGJhc2VBZGRyZXNzLCBhbmQgbWVtb0lkIChudWxsIGlmIG5vdCBwcmVzZW50KVxuICAgKiBAdGhyb3dzIEludmFsaWRBZGRyZXNzRXJyb3IgaWYgYWRkcmVzcyBmb3JtYXQgaXMgaW52YWxpZFxuICAgKi9cbiAgZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzczogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IGJhc2VBZGRyZXNzOiBzdHJpbmc7IG1lbW9JZDogc3RyaW5nIHwgbnVsbCB9IHtcbiAgICBpZiAodHlwZW9mIGFkZHJlc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdGluYXRpb25EZXRhaWxzID0gdXJsLnBhcnNlKGFkZHJlc3MpO1xuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gZGVzdGluYXRpb25EZXRhaWxzLnBhdGhuYW1lIHx8ICcnO1xuXG4gICAgLy8gTm8gcXVlcnkgc3RyaW5nIC0ganVzdCBhIHBsYWluIGFkZHJlc3NcbiAgICBpZiAoZGVzdGluYXRpb25EZXRhaWxzLnBhdGhuYW1lID09PSBhZGRyZXNzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzLFxuICAgICAgICBiYXNlQWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgbWVtb0lkOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYXMgcXVlcnkgc3RyaW5nIC0gbXVzdCBjb250YWluIG1lbW9JZFxuICAgIGlmICghZGVzdGluYXRpb25EZXRhaWxzLnF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlEZXRhaWxzID0gcXVlcnlzdHJpbmcucGFyc2UoZGVzdGluYXRpb25EZXRhaWxzLnF1ZXJ5KTtcblxuICAgIC8vIFF1ZXJ5IHN0cmluZyBtdXN0IGNvbnRhaW4gbWVtb0lkXG4gICAgaWYgKCFxdWVyeURldGFpbHMubWVtb0lkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9LCB1bmtub3duIHF1ZXJ5IHBhcmFtZXRlcnNgKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IG9uZSBtZW1vSWQgYWxsb3dlZFxuICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5RGV0YWlscy5tZW1vSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihcbiAgICAgICAgYG1lbW9JZCBtYXkgb25seSBiZSBnaXZlbiBhdCBtb3N0IG9uY2UsIGJ1dCBmb3VuZCAke3F1ZXJ5RGV0YWlscy5tZW1vSWQubGVuZ3RofSBpbnN0YW5jZXMgaW4gYWRkcmVzcyAke2FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZWplY3QgaWYgdGhlcmUgYXJlIG90aGVyIHF1ZXJ5IHBhcmFtZXRlcnMgYmVzaWRlcyBtZW1vSWRcbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhxdWVyeURldGFpbHMpO1xuICAgIGlmIChxdWVyeUtleXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9LCBvbmx5IG1lbW9JZCBxdWVyeSBwYXJhbWV0ZXIgaXMgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1lbW9JZCBmb3JtYXRcbiAgICBpZiAoIXRoaXMuaXNWYWxpZE1lbW9JZChxdWVyeURldGFpbHMubWVtb0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRNZW1vSWRFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAnJHthZGRyZXNzfScsIG1lbW9JZCBpcyBub3QgdmFsaWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzcyxcbiAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgbWVtb0lkOiBxdWVyeURldGFpbHMubWVtb0lkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIG1lbW9JZCBpcyBhIHZhbGlkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHN0cmluZ1xuICAgKiBAcGFyYW0gbWVtb0lkIC0gVGhlIG1lbW9JZCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkTWVtb0lkKG1lbW9JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRNZW1vSWRVdGlsKG1lbW9JZCk7XG4gIH1cblxuICAvKipcbiAgICogVGVtcG8gdXNlcyBtZW1vSWQtYmFzZWQgYWRkcmVzc2VzIHJhdGhlciB0aGFuIGZvcndhcmRlciBjb250cmFjdHMuXG4gICAqIFZlcmlmeSB0aGF0IHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhpcyB3YWxsZXQgYnkgY2hlY2tpbmcgdGhhdCB0aGVcbiAgICogYmFzZSAoRVZNKSBwb3J0aW9uIG1hdGNoZXMgdGhlIHdhbGxldCdzIGJhc2UgYWRkcmVzcy5cbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUV0aEFkZHJlc3NPcHRpb25zIHwgVHNzVmVyaWZ5RXRoQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGFkZHJlc3MsIGJhc2VBZGRyZXNzIH0gPSBwYXJhbXM7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSAocGFyYW1zIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJvb3RBZGRyZXNzIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghYWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoJ2FkZHJlc3MgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGJhc2VBZGRyZXNzOiBhZGRyZXNzQmFzZSB9ID0gdGhpcy5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcblxuICAgIGNvbnN0IHdhbGxldEJhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3MgfHwgcm9vdEFkZHJlc3M7XG4gICAgaWYgKCF3YWxsZXRCYXNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoJ2Jhc2VBZGRyZXNzIG9yIHJvb3RBZGRyZXNzIGlzIHJlcXVpcmVkIGZvciB2ZXJpZmljYXRpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGJhc2VBZGRyZXNzOiB3YWxsZXRCYXNlIH0gPSB0aGlzLmdldEFkZHJlc3NEZXRhaWxzKHdhbGxldEJhc2VBZGRyZXNzKTtcblxuICAgIGlmIChhZGRyZXNzQmFzZS50b0xvd2VyQ2FzZSgpICE9PSB3YWxsZXRCYXNlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogZXhwZWN0ZWQgJHt3YWxsZXRCYXNlfSBidXQgZ290ICR7YWRkcmVzc0Jhc2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBzZXJpYWxpc2VkIFRlbXBvIHRyYW5zYWN0aW9uIGFuZCByZXR1cm4gaXRzIG9wZXJhdGlvbnMgYXMgU0RLIG91dHB1dHMuXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhIZXggPSAocGFyYW1zLnR4SGV4IHx8IChwYXJhbXMgYXMgYW55KS5oYWxmU2lnbmVkPy50eEhleCkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCFpc1RpcDIwVHJhbnNhY3Rpb24odHhIZXgpKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZyb20odHhIZXgpO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IHR4LmlucHV0cy5tYXAoKGlucHV0KSA9PiAoe1xuICAgICAgICBhZGRyZXNzOiBpbnB1dC5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGlucHV0LnZhbHVlLFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICB9KSksXG4gICAgICBvdXRwdXRzOiB0eC5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBvdXRwdXQudmFsdWUsXG4gICAgICAgIGNvaW46IHRoaXMuZ2V0Q2hhaW4oKSxcbiAgICAgIH0pKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgVGVtcG8gdHJhbnNhY3Rpb24gbWF0Y2hlcyB0aGUgaW50ZW5kZWQgcmVjaXBpZW50cyBhbmQgYW1vdW50cy5cbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gc2lnbmFibGVIZXggbWF5IGFycml2ZSB3aXRob3V0IHRoZSAweCBwcmVmaXggKGUuZy4gZnJvbSB0aGUgVFNTIHNpZ25pbmcgZmxvdykuXG4gICAgY29uc3QgdHhIZXggPSB0eFByZWJ1aWxkLnR4SGV4LnN0YXJ0c1dpdGgoJzB4JykgPyB0eFByZWJ1aWxkLnR4SGV4IDogJzB4JyArIHR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCFpc1RpcDIwVHJhbnNhY3Rpb24odHhIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVGVtcG8gdHJhbnNhY3Rpb24gaGV4OiBleHBlY3RlZCBhIDB4NzYgVElQLTIwIHRyYW5zYWN0aW9uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHR4LmdldE9wZXJhdGlvbnMoKTtcbiAgICBjb25zdCByYXdDYWxscyA9IHR4LmdldFJhd0NhbGxzKCk7XG5cbiAgICAvLyBJZiB0aGUgY2FsbGVyIHNwZWNpZmllZCBleHBsaWNpdCByZWNpcGllbnRzLCB2ZXJpZnkgdGhleSBtYXRjaCB0aGUgdHJhbnNhY3Rpb24uXG4gICAgLy8gQSB0cmFuc2FjdGlvbiBpcyBlaXRoZXIgYWxsIHRva2VuIHRyYW5zZmVyIG9wZXJhdGlvbnMgT1IgYSBzaW5nbGUgcmF3IGNvbnRyYWN0IGNhbGwg4oCUIG5ldmVyIG1peGVkLlxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eFBhcmFtcz8ucmVjaXBpZW50cztcbiAgICBpZiAocmVjaXBpZW50cyAmJiByZWNpcGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChyYXdDYWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIENvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24g4oCUIHNpbmdsZSByYXcgY2FsbCwgc2luZ2xlIHJlY2lwaWVudCB3aXRoIGRhdGFcbiAgICAgICAgaWYgKHJhd0NhbGxzLmxlbmd0aCAhPT0gcmVjaXBpZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNhY3Rpb24gaGFzICR7cmF3Q2FsbHMubGVuZ3RofSBjYWxsKHMpIGJ1dCAke3JlY2lwaWVudHMubGVuZ3RofSByZWNpcGllbnQocykgd2VyZSByZXF1ZXN0ZWRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0NhbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmF3Q2FsbCA9IHJhd0NhbGxzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbaV07XG4gICAgICAgICAgaWYgKHJhd0NhbGwudG8udG9Mb3dlckNhc2UoKSAhPT0gcmVjaXBpZW50LmFkZHJlc3Muc3BsaXQoJz8nKVswXS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhdyBjYWxsICR7aX0gYWRkcmVzcyBtaXNtYXRjaDogZXhwZWN0ZWQgJHtyZWNpcGllbnQuYWRkcmVzc30sIGdvdCAke3Jhd0NhbGwudG99YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmVjaXBpZW50LmRhdGEgfHwgcmF3Q2FsbC5kYXRhLnRvTG93ZXJDYXNlKCkgIT09IHJlY2lwaWVudC5kYXRhLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmF3IGNhbGwgJHtpfSBjYWxsZGF0YSBtaXNtYXRjaGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24g4oCUIG9wZXJhdGlvbnMgbWF0Y2hlZCAxLXRvLTEgYWdhaW5zdCByZWNpcGllbnRzXG4gICAgICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCAhPT0gcmVjaXBpZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNhY3Rpb24gaGFzICR7b3BlcmF0aW9ucy5sZW5ndGh9IG9wZXJhdGlvbihzKSBidXQgJHtyZWNpcGllbnRzLmxlbmd0aH0gcmVjaXBpZW50KHMpIHdlcmUgcmVxdWVzdGVkYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb3AgPSBvcGVyYXRpb25zW2ldO1xuICAgICAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbaV07XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50QmFzZUFkZHJlc3MgPSByZWNpcGllbnQuYWRkcmVzcy5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgIGlmIChvcC50by50b0xvd2VyQ2FzZSgpICE9PSByZWNpcGllbnRCYXNlQWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke2l9IHJlY2lwaWVudCBtaXNtYXRjaDogZXhwZWN0ZWQgJHtyZWNpcGllbnQuYWRkcmVzc30sIGdvdCAke29wLnRvfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvcEFtb3VudEJhc2VVbml0cyA9IGFtb3VudFRvVGlwMjBVbml0cyhvcC5hbW91bnQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKG9wQW1vdW50QmFzZVVuaXRzICE9PSByZWNpcGllbnQuYW1vdW50LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7aX0gYW1vdW50IG1pc21hdGNoOiBleHBlY3RlZCAke3JlY2lwaWVudC5hbW91bnR9LCBnb3QgJHtvcEFtb3VudEJhc2VVbml0c31gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgZmVlIHRva2VuIGlmIHNwZWNpZmllZFxuICAgIGlmICh0eFBhcmFtcz8uZmVlVG9rZW4pIHtcbiAgICAgIGNvbnN0IHR4RmVlVG9rZW4gPSB0eC5nZXRGZWVUb2tlbigpO1xuICAgICAgaWYgKHR4RmVlVG9rZW4/LnRvTG93ZXJDYXNlKCkgIT09IHR4UGFyYW1zLmZlZVRva2VuLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGZWUgdG9rZW4gbWlzbWF0Y2g6IGV4cGVjdGVkICR7dHhQYXJhbXMuZmVlVG9rZW59LCBnb3QgJHt0eEZlZVRva2VuIHx8ICdub25lJ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIGludGVudCBmb3IgVGVtcG8gVFNTIHRyYW5zYWN0aW9ucy5cbiAgICogRW5zdXJlcyBmZWVUb2tlbiBpcyBwcm9wZXJseSB3aXJlZCB0aHJvdWdoIHRoZSBpbnRlbnQgZm9yIFRlbXBvIHRyYW5zYWN0aW9ucy5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IHRvIG1vZGlmeVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgY29udGFpbmluZyBmZWVUb2tlblxuICAgKi9cbiAgc2V0Q29pblNwZWNpZmljRmllbGRzSW5JbnRlbnQoaW50ZW50OiBQb3B1bGF0ZWRJbnRlbnQsIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5mZWVUb2tlbikge1xuICAgICAgaW50ZW50LmZlZU9wdGlvbnMgPSBpbnRlbnQuZmVlT3B0aW9uc1xuICAgICAgICA/IHsgLi4uaW50ZW50LmZlZU9wdGlvbnMsIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4gfVxuICAgICAgICA6IHsgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbiB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSB0aGUgVGVtcG8gQWxjaGVteSBSUEMgZm9yIHJlY292ZXJ5IGJhbGFuY2Uvbm9uY2UgaW5mb3JtYXRpb24uXG4gICAqIFJvdXRlcyB0aHJvdWdoIHF1ZXJ5VGVtcG9ScGMgdXNpbmcgdGhlIFVSTCBmcm9tIGVudmlyb25tZW50cy50cy5cbiAgICovXG4gIGFzeW5jIHJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoXG4gICAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgYXBpS2V5Pzogc3RyaW5nXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBldm1Db25maWcgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLmV2bTtcbiAgICBjb25zdCBjb2luRmFtaWx5ID0gdGhpcy5nZXRGYW1pbHkoKTtcbiAgICBpZiAoIWV2bUNvbmZpZyB8fCAhKGNvaW5GYW1pbHkgaW4gZXZtQ29uZmlnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbnYgY29uZmlnIG1pc3NpbmcgZm9yICR7Y29pbkZhbWlseX0gaW4gJHt0aGlzLmJpdGdvLmdldEVudigpfWApO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGFwaUtleSB8fCBldm1Db25maWdbY29pbkZhbWlseV0uYXBpVG9rZW47XG4gICAgY29uc3QgcnBjVXJsID0gZXZtQ29uZmlnW2NvaW5GYW1pbHldLmJhc2VVcmw7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlUZW1wb1JwYyhxdWVyeSwgcnBjVXJsLCB0b2tlbik7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlcyBFdGhlcnNjYW4tc3R5bGUgcmVjb3ZlcnkgcXVlcmllcyBpbnRvIFRlbXBvIEFsY2hlbXkgSlNPTi1SUEMgY2FsbHMuXG4gICAqXG4gICAqIFN1cHBvcnRlZDpcbiAgICogICBhY2NvdW50L2JhbGFuY2UgICAgICDihpIgcmV0dXJucyB7IHJlc3VsdDogJzAnIH0gKG5vIG5hdGl2ZSBjb2luIG9uIFRlbXBvKVxuICAgKiAgIGFjY291bnQvdG9rZW5iYWxhbmNlIOKGkiBldGhfY2FsbCAoYmFsYW5jZU9mIHNlbGVjdG9yIDB4NzBhMDgyMzEpIOKGkiB7IHJlc3VsdDogZGVjaW1hbFN0cmluZyB9XG4gICAqICAgYWNjb3VudC90eGxpc3QgICAgICAg4oaSIGV0aF9nZXRUcmFuc2FjdGlvbkNvdW50IOKGkiB7IG5vbmNlOiBudW1iZXIgfVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBxdWVyeVRlbXBvUnBjKFxuICAgIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHJwY1VybDogc3RyaW5nLFxuICAgIGFwaUtleT86IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBhcGlLZXkgPyBgJHtycGNVcmx9JHthcGlLZXl9YCA6IHJwY1VybDtcbiAgICBjb25zdCB7IG1vZHVsZSwgYWN0aW9uLCBhZGRyZXNzLCBjb250cmFjdGFkZHJlc3MsIHRhZyB9ID0gcXVlcnk7XG5cbiAgICBsZXQgbWV0aG9kOiBzdHJpbmc7XG4gICAgbGV0IHBhcmFtczogdW5rbm93bltdO1xuXG4gICAgaWYgKG1vZHVsZSA9PT0gJ2FjY291bnQnICYmIGFjdGlvbiA9PT0gJ2JhbGFuY2UnKSB7XG4gICAgICByZXR1cm4geyByZXN1bHQ6ICcwJyB9O1xuICAgIH0gZWxzZSBpZiAobW9kdWxlID09PSAnYWNjb3VudCcgJiYgYWN0aW9uID09PSAndG9rZW5iYWxhbmNlJykge1xuICAgICAgY29uc3QgcGFkZGVkQWRkciA9IChhZGRyZXNzID8/ICcnKS5yZXBsYWNlKC9eMHgvLCAnJykucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICBtZXRob2QgPSAnZXRoX2NhbGwnO1xuICAgICAgcGFyYW1zID0gW3sgdG86IGNvbnRyYWN0YWRkcmVzcywgZGF0YTogJzB4NzBhMDgyMzEnICsgcGFkZGVkQWRkciB9LCB0YWcgPz8gJ2xhdGVzdCddO1xuICAgIH0gZWxzZSBpZiAobW9kdWxlID09PSAnYWNjb3VudCcgJiYgYWN0aW9uID09PSAndHhsaXN0Jykge1xuICAgICAgbWV0aG9kID0gJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JztcbiAgICAgIHBhcmFtcyA9IFthZGRyZXNzLCAnbGF0ZXN0J107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnlUZW1wb1JwYzogdW5zdXBwb3J0ZWQgbW9kdWxlPSR7bW9kdWxlfSBhY3Rpb249JHthY3Rpb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goZW5kcG9pbnQsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGpzb25ycGM6ICcyLjAnLCBtZXRob2QsIHBhcmFtcywgaWQ6IDEgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhY2ggVGVtcG8gUlBDIGVuZHBvaW50IChIVFRQICR7cmVzLnN0YXR1c30pYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogeyBtZXNzYWdlOiBzdHJpbmcgfSB9O1xuICAgIGlmIChib2R5LmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbXBvIFJQQyBlcnJvcjogJHtib2R5LmVycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgaWYgKG1vZHVsZSA9PT0gJ2FjY291bnQnICYmIGFjdGlvbiA9PT0gJ3R4bGlzdCcpIHtcbiAgICAgIHJldHVybiB7IG5vbmNlOiBwYXJzZUludChib2R5LnJlc3VsdCBhcyBzdHJpbmcsIDE2KSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyByZXN1bHQ6IEJpZ0ludChib2R5LnJlc3VsdCBhcyBzdHJpbmcpLnRvU3RyaW5nKCkgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHJlc3VsdDogJzAnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBoZWxwZXI6IHF1ZXJpZXMgdGhlIHRva2VuIGJhbGFuY2UsIGNvbXB1dGVzIHN3ZWVwIGFtb3VudCwgYW5kIGJ1aWxkc1xuICAgKiBhbiB1bnNpZ25lZCBUSVAtMjAgdHJhbnNmZXIgdHJhbnNhY3Rpb24uIFVzZWQgYnkgYm90aCByZWNvdmVyeSBwYXRocy5cbiAgICpcbiAgICogLSB0b2tlbkNvbnRyYWN0QWRkcmVzczogdGhlIHRva2VuIHRvIHN3ZWVwIChkZWZhdWx0cyB0byBwYXRoVVNEKVxuICAgKiAtIGZlZVRva2VuOiBhbHdheXMgcGF0aFVTRFxuICAgKiAtIElmIHN3ZWVwaW5nIHBhdGhVU0QgaXRzZWxmLCByZXNlcnZlcyBnYXNMaW1pdCDDlyBtYXhGZWVQZXJHYXMgLyAxMF4xMiBwYXRoVVNEIHVuaXRzIGZvciBmZWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFRlbXBvU3dlZXBUeChcbiAgICB3YWxsZXRBZGRyZXNzOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvdmVyT3B0aW9uc1xuICApOiBQcm9taXNlPHsgdHg6IFRpcDIwVHJhbnNhY3Rpb247IG5vbmNlOiBudW1iZXI7IHN3ZWVwQW1vdW50OiBiaWdpbnQ7IGdhc01hcmdpblVuaXRzOiBiaWdpbnQgfT4ge1xuICAgIGlmICghcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuQ29udHJhY3RBZGRyZXNzIGlzIHJlcXVpcmVkIGZvciBzd2VlcCcpO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3M7XG5cbiAgICBjb25zdCBwYXRoVXNkVG9rZW5OYW1lID0gdGhpcy5nZXRDaGFpbigpID09PSBNQUlOTkVUX0NPSU4gPyBQQVRIX1VTRF9UT0tFTl9NQUlOTkVUIDogUEFUSF9VU0RfVE9LRU5fVEVTVE5FVDtcbiAgICBjb25zdCBwYXRoVXNkQWRkcmVzcyA9IChjb2lucy5nZXQocGF0aFVzZFRva2VuTmFtZSkgYXMgdW5rbm93biBhcyB7IGNvbnRyYWN0QWRkcmVzczogc3RyaW5nIH0pLmNvbnRyYWN0QWRkcmVzcztcblxuICAgIGNvbnN0IHJhd0JhbGFuY2UgPSBhd2FpdCB0aGlzLnF1ZXJ5QWRkcmVzc1Rva2VuQmFsYW5jZSh0b2tlbkFkZHJlc3MsIHdhbGxldEFkZHJlc3MsIHBhcmFtcy5hcGlLZXkpO1xuICAgIGNvbnN0IGJhbGFuY2UgPSBCaWdJbnQocmF3QmFsYW5jZS50b1N0cmluZygpKTtcblxuICAgIGNvbnN0IGlzUGF0aFVzZCA9IHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSBwYXRoVXNkQWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGdhc0xpbWl0QmlnID0gQmlnSW50KHBhcmFtcy5nYXNMaW1pdCA/PyA3MDBfMDAwKTtcbiAgICBjb25zdCBtYXhGZWVQZXJHYXNCaWcgPSBCaWdJbnQocGFyYW1zLmVpcDE1NTk/Lm1heEZlZVBlckdhcyA/PyAyMF8wMDBfMDAwXzAwMCk7XG4gICAgLy8gNzUlIGJ1ZmZlciBvbiB0b3Agb2YgZ2FzTGltaXQgw5cgbWF4RmVlUGVyR2FzIHRvIGNvdmVyIGFjdHVhbCBvbi1jaGFpbiBnYXMgdmFyaWFuY2VcbiAgICBjb25zdCBnYXNNYXJnaW5Vbml0cyA9IChnYXNMaW1pdEJpZyAqIG1heEZlZVBlckdhc0JpZyAqIDE3NW4pIC8gKDEwbiAqKiAxMm4gKiAxMDBuKTtcbiAgICBjb25zdCBzd2VlcEFtb3VudCA9IGlzUGF0aFVzZCA/IGJhbGFuY2UgLSBnYXNNYXJnaW5Vbml0cyA6IGJhbGFuY2U7XG5cbiAgICBpZiAoc3dlZXBBbW91bnQgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluc3VmZmljaWVudCBiYWxhbmNlIGluICR7dG9rZW5BZGRyZXNzfTogJHtiYWxhbmNlfSB1bml0cyAobWluaW11bSByZXF1aXJlZDogJHtcbiAgICAgICAgICBpc1BhdGhVc2QgPyBnYXNNYXJnaW5Vbml0cyArIDFuIDogMW5cbiAgICAgICAgfSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN3ZWVwQW1vdW50SHVtYW4gPSB0aXAyMFVuaXRzVG9BbW91bnQoc3dlZXBBbW91bnQpO1xuICAgIGNvbnN0IG5vbmNlID0gYXdhaXQgdGhpcy5nZXRBZGRyZXNzTm9uY2Uod2FsbGV0QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIHVua25vd24gYXMgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IHRva2VuQWRkcmVzcywgdG86IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHN3ZWVwQW1vdW50SHVtYW4gfSlcbiAgICAgIC5mZWVUb2tlbihwYXRoVXNkQWRkcmVzcylcbiAgICAgIC5ub25jZShub25jZSlcbiAgICAgIC5nYXMoZ2FzTGltaXRCaWcpXG4gICAgICAubWF4RmVlUGVyR2FzKG1heEZlZVBlckdhc0JpZylcbiAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhCaWdJbnQocGFyYW1zLmVpcDE1NTk/Lm1heFByaW9yaXR5RmVlUGVyR2FzID8/IDEwXzAwMF8wMDBfMDAwKSk7XG5cbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVGlwMjBUcmFuc2FjdGlvbjtcbiAgICByZXR1cm4geyB0eCwgbm9uY2UsIHN3ZWVwQW1vdW50LCBnYXNNYXJnaW5Vbml0cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgYmFzZS1jbGFzcyByZWNvdmVyVFNTIHRvIHVzZSBUSVAtMjAgdHJhbnNhY3Rpb25zIGluc3RlYWQgb2Ygc3RhbmRhcmQgRVRILlxuICAgKlxuICAgKiBUd28gcGF0aHM6XG4gICAqICAgLSBVbnNpZ25lZCBzd2VlcCAocGxhaW4gcHVibGljIGtleSBzaGFyZXMpOiBkZWxlZ2F0ZXMgdG8gYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTXG4gICAqICAgLSBTaWduZWQgc3dlZXAgKGVuY3J5cHRlZCBrZXlzICsgcGFzc3BocmFzZSk6IGJ1aWxkcyBhbmQgc2lnbnMgYSBUSVAtMjAgdHggdmlhIE1QQ1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlY292ZXJUU1MoXG4gICAgcGFyYW1zOiBSZWNvdmVyT3B0aW9uc1xuICApOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IE9mZmxpbmVWYXVsdFR4SW5mbyB8IFVuc2lnbmVkU3dlZXBUeE1QQ3YyPiB7XG4gICAgdGhpcy52YWxpZGF0ZVJlY292ZXJ5UGFyYW1zKHBhcmFtcyk7XG4gICAgY29uc3QgdXNlcktleSA9IHBhcmFtcy51c2VyS2V5LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuXG4gICAgaWYgKGdldElzVW5zaWduZWRTd2VlcCh7IHVzZXJLZXksIGJhY2t1cEtleSwgaXNUc3M6IHBhcmFtcy5pc1RzcyB9KSkge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgLy8gU2lnbmVkIHN3ZWVwOiBkZWNyeXB0IE1QQyB2MiBrZXkgc2hhcmVzXG4gICAgY29uc3QgeyB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbiB9ID0gYXdhaXQgRUNEU0FVdGlscy5nZXRNcGNWMlJlY292ZXJ5S2V5U2hhcmVzKFxuICAgICAgdXNlcktleSxcbiAgICAgIGJhY2t1cEtleSxcbiAgICAgIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgdGhpcy5iaXRnb1xuICAgICk7XG5cbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBkZXJpdmVkQ29tbW9uS2V5Q2hhaW4gPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXlDaGFpbiwgJ20vMCcpO1xuICAgIGNvbnN0IGJhY2t1cEtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHB1YjogZGVyaXZlZENvbW1vbktleUNoYWluLnNsaWNlKDAsIDY2KSB9KTtcbiAgICBjb25zdCBiYXNlQWRkcmVzcyA9IGJhY2t1cEtleVBhaXIuZ2V0QWRkcmVzcygpO1xuXG4gICAgY29uc3QgeyB0eDogdW5zaWduZWRUeCB9ID0gYXdhaXQgdGhpcy5idWlsZFRlbXBvU3dlZXBUeChiYXNlQWRkcmVzcywgcGFyYW1zKTtcbiAgICBjb25zdCBzZXJpYWxpemVkSGV4ID0gYXdhaXQgdW5zaWduZWRUeC5zZXJpYWxpemUoKTtcblxuICAgIC8vIEhhc2ggdGhlIHVuc2lnbmVkIDB4NzYgdHgg4oCUIG1hdGNoZXMgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIncyBvd24gc2lnbmluZyBsb2dpY1xuICAgIGNvbnN0IG1zZ0hhc2hIZXggPSBldGhlcnMudXRpbHMua2VjY2FrMjU2KGV0aGVycy51dGlscy5hcnJheWlmeShzZXJpYWxpemVkSGV4KSk7XG4gICAgY29uc3QgbWVzc2FnZUhhc2ggPSBCdWZmZXIuZnJvbShtc2dIYXNoSGV4LnJlcGxhY2UoJzB4JywgJycpLCAnaGV4Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBFQ0RTQVV0aWxzLnNpZ25SZWNvdmVyeU1wY1YyKG1lc3NhZ2VIYXNoLCB1c2VyS2V5U2hhcmUsIGJhY2t1cEtleVNoYXJlLCBjb21tb25LZXlDaGFpbik7XG5cbiAgICAvLyBFQ0RTQU1ldGhvZFR5cGVzLlNpZ25hdHVyZS5yL3MgYXJlIDY0LWNoYXIgaGV4IFdJVEhPVVQgMHggcHJlZml4XG4gICAgdW5zaWduZWRUeC5zZXRTaWduYXR1cmUoe1xuICAgICAgcjogYDB4JHtzaWduYXR1cmUucn1gLFxuICAgICAgczogYDB4JHtzaWduYXR1cmUuc31gLFxuICAgICAgeVBhcml0eTogc2lnbmF0dXJlLnJlY2lkLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmVkSGV4ID0gYXdhaXQgdW5zaWduZWRUeC5zZXJpYWxpemUoKTtcbiAgICBjb25zdCB0eElkID0gZXRoZXJzLnV0aWxzLmtlY2NhazI1NihldGhlcnMudXRpbHMuYXJyYXlpZnkoc2lnbmVkSGV4KSk7XG4gICAgcmV0dXJuIHsgaWQ6IHR4SWQsIHR4OiBzaWduZWRIZXggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gdW5zaWduZWQgVElQLTIwIHN3ZWVwIHRyYW5zYWN0aW9uIGZvciB0aGUgb2ZmbGluZSB2YXVsdCAodW5zaWduZWQgc3dlZXAgcGF0aCkuXG4gICAqIENhbGxlZCBieSByZWNvdmVyVFNTIHdoZW4gcGxhaW4gcHVibGljIGtleSBzaGFyZXMgYXJlIHByb3ZpZGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyhwYXJhbXM6IFJlY292ZXJPcHRpb25zKTogUHJvbWlzZTxPZmZsaW5lVmF1bHRUeEluZm8gfCBVbnNpZ25lZFN3ZWVwVHhNUEN2Mj4ge1xuICAgIGNvbnN0IGJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IHBhcmFtcy5kZXJpdmF0aW9uU2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5kZXJpdmF0aW9uU2VlZCkgOiAnbS8wJztcbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBkZXJpdmVkQ29tbW9uS2V5Q2hhaW4gPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiYWNrdXBLZXksIGRlcml2YXRpb25QYXRoKTtcbiAgICBjb25zdCBiYWNrdXBLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IGRlcml2ZWRDb21tb25LZXlDaGFpbi5zbGljZSgwLCA2NikgfSk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSBiYWNrdXBLZXlQYWlyLmdldEFkZHJlc3MoKTtcblxuICAgIGNvbnN0IHsgdHgsIG5vbmNlLCBzd2VlcEFtb3VudCwgZ2FzTWFyZ2luVW5pdHMgfSA9IGF3YWl0IHRoaXMuYnVpbGRUZW1wb1N3ZWVwVHgoYmFzZUFkZHJlc3MsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEhleCA9IGF3YWl0IHR4LnNlcmlhbGl6ZSgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEhleCA9IHNlcmlhbGl6ZWRIZXgucmVwbGFjZSgnMHgnLCAnJyk7XG4gICAgY29uc3Qgc2lnbmFibGVIZXggPSBldGhlcnMudXRpbHMua2VjY2FrMjU2KGV0aGVycy51dGlscy5hcnJheWlmeShzZXJpYWxpemVkSGV4KSkucmVwbGFjZSgnMHgnLCAnJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHhSZXF1ZXN0czogW1xuICAgICAgICB7XG4gICAgICAgICAgd2FsbGV0Q29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICAgIHRyYW5zYWN0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1bnNpZ25lZFR4OiB7XG4gICAgICAgICAgICAgICAgc2VyaWFsaXplZFR4SGV4LFxuICAgICAgICAgICAgICAgIHNpZ25hYmxlSGV4LFxuICAgICAgICAgICAgICAgIGRlcml2YXRpb25QYXRoLFxuICAgICAgICAgICAgICAgIGZlZUluZm86IHtcbiAgICAgICAgICAgICAgICAgIGZlZTogTnVtYmVyKGdhc01hcmdpblVuaXRzKSxcbiAgICAgICAgICAgICAgICAgIGZlZVN0cmluZzogdGlwMjBVbml0c1RvQW1vdW50KGdhc01hcmdpblVuaXRzKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhcnNlZFR4OiB7XG4gICAgICAgICAgICAgICAgICBzcGVuZEFtb3VudDogdGlwMjBVbml0c1RvQW1vdW50KHN3ZWVwQW1vdW50KSxcbiAgICAgICAgICAgICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGNvaW5OYW1lOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWVTdHJpbmc6IHRpcDIwVW5pdHNUb0Ftb3VudChzd2VlcEFtb3VudCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29pblNwZWNpZmljOiB7IGNvbW1vbktleUNoYWluOiBiYWNrdXBLZXkgfSxcbiAgICAgICAgICAgICAgICBlaXAxNTU5OiBwYXJhbXMuZWlwMTU1OSxcbiAgICAgICAgICAgICAgICByZXBsYXlQcm90ZWN0aW9uT3B0aW9uczogcGFyYW1zLnJlcGxheVByb3RlY3Rpb25PcHRpb25zLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub25jZSxcbiAgICAgICAgICAgICAgc2lnbmF0dXJlU2hhcmVzOiBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdHJhbnNhY3Rpb24gYnVpbGRlciBmb3IgVGVtcG8uXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKGNvbW1vbj86IEV0aExpa2VDb21tb24uZGVmYXVsdCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQodGhpcy5nZXRCYXNlQ2hhaW4oKSkpIGFzIHVua25vd24gYXMgVHJhbnNhY3Rpb25CdWlsZGVyO1xuICB9XG59XG4iXX0=
510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCwyREFZa0M7QUFFbEMsbURBZThCO0FBQzlCLHlEQUE0RDtBQUM1RCxpREFBeUU7QUFDekUsbUNBQWdDO0FBQ2hDLCtCQUFrRTtBQUNsRSx1Q0FLcUI7QUFDckIsK0NBQStGO0FBQy9GLHlDQUEyQjtBQUMzQix5REFBMkM7QUFFM0MsTUFBYSxLQUFNLFNBQVEsc0NBQXVCO0lBQ2hELFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGFBQWE7UUFDWCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE9BQWU7UUFDNUIsSUFBSSxPQUFPLE9B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O29DQUMzQixTQUFTLEVBQUUsSUFBQSwwQkFBa0IsRUFBQyxjQUFjLENBQUM7aUNBQzlDO2dDQUNELFFBQVEsRUFBRTtvQ0FDUixXQUFXLEVBQUUsSUFBQSwwQkFBa0IsRUFBQyxXQUFXLENBQUM7b0NBQzVDLE9BQU8sRUFBRTt3Q0FDUDs0Q0FDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTs0Q0FDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7NENBQ25DLFdBQVcsRUFBRSxJQUFBLDBCQUFrQixFQUFDLFdBQVcsQ0FBQzt5Q0FDN0M7cUNBQ0Y7aUNBQ0Y7Z0NBQ0QsWUFBWSxFQUFFLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRTtnQ0FDM0MsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dDQUN2Qix1QkFBdUIsRUFBRSxNQUFNLENBQUMsdUJBQXVCOzZCQUN4RDs0QkFDRCxLQUFLOzRCQUNMLGVBQWUsRUFBRSxFQUFFO3lCQUNwQjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNPLHFCQUFxQixDQUFDLE1BQThCO1FBQzVELE9BQU8sSUFBSSw2QkFBdUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFrQyxDQUFDO0lBQ3RHLENBQUM7Q0FDRjtBQWxpQkQsc0JBa2lCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7XG4gIEFic3RyYWN0RXRoTGlrZU5ld0NvaW5zLFxuICBSZWNvdmVyT3B0aW9ucyxcbiAgT2ZmbGluZVZhdWx0VHhJbmZvLFxuICBVbnNpZ25lZFN3ZWVwVHhNUEN2MixcbiAgUmVjb3ZlcnlJbmZvLFxuICBUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIFZlcmlmeUV0aFRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5RXRoQWRkcmVzc09wdGlvbnMsXG4gIFRzc1ZlcmlmeUV0aEFkZHJlc3NPcHRpb25zLFxuICBvcHRpb25hbERlcHMsXG4gIEtleVBhaXIsXG59IGZyb20gJ0BiaXRnby1iZXRhL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgdHlwZSAqIGFzIEV0aExpa2VDb21tb24gZnJvbSAnQGV0aGVyZXVtanMvY29tbW9uJztcbmltcG9ydCB7XG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIEludmFsaWRNZW1vSWRFcnJvcixcbiAgTVBDQWxnb3JpdGhtLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IsXG4gIFBvcHVsYXRlZEludGVudCxcbiAgUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICBjb21tb24sXG4gIEVjZHNhLFxuICBFQ0RTQVV0aWxzLFxuICBnZXRJc1Vuc2lnbmVkU3dlZXAsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGdldERlcml2YXRpb25QYXRoIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgZXRoZXJzIH0gZnJvbSAnZXRoZXJzJztcbmltcG9ydCB7IFRpcDIwVHJhbnNhY3Rpb24sIFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHtcbiAgYW1vdW50VG9UaXAyMFVuaXRzLFxuICB0aXAyMFVuaXRzVG9BbW91bnQsXG4gIGlzVGlwMjBUcmFuc2FjdGlvbixcbiAgaXNWYWxpZE1lbW9JZCBhcyBpc1ZhbGlkTWVtb0lkVXRpbCxcbn0gZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgTUFJTk5FVF9DT0lOLCBQQVRIX1VTRF9UT0tFTl9NQUlOTkVULCBQQVRIX1VTRF9UT0tFTl9URVNUTkVUIH0gZnJvbSAnLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCAqIGFzIHVybCBmcm9tICd1cmwnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5leHBvcnQgY2xhc3MgVGVtcG8gZXh0ZW5kcyBBYnN0cmFjdEV0aExpa2VOZXdDb2lucyB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBUZW1wbyBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IFRlbXBvKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjaGFpbiBpZGVudGlmaWVyXG4gICAqL1xuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbj8ubmFtZSB8fCAndGVtcG8nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZnVsbCBjaGFpbiBuYW1lXG4gICAqL1xuICBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnVGVtcG8nO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMWU2O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHZhbHVlLWxlc3MgdHJhbnNmZXJzIGFyZSBhbGxvd2VkXG4gICAqIEVWTS1iYXNlZCBjaGFpbnMgYWxsb3cgemVyby12YWx1ZSB0cmFuc2ZlcnMgZm9yIHNtYXJ0IGNvbnRyYWN0IGludGVyYWN0aW9uc1xuICAgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIFRTUyBpcyBzdXBwb3J0ZWRcbiAgICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgTVBDIGFsZ29yaXRobSAoRUNEU0EgZm9yIEVWTSBjaGFpbnMpXG4gICAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VjZHNhJztcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgd2hldGhlciBhbiBhZGRyZXNzIHN0cmluZyBpcyB2YWxpZCBmb3IgVGVtcG9cbiAgICogU3VwcG9ydHMgYWRkcmVzc2VzIHdpdGggb3B0aW9uYWwgbWVtb0lkIHF1ZXJ5IHBhcmFtZXRlciAoZS5nLiwgMHguLi4/bWVtb0lkPTEyMylcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGFkZHJlc3MgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgYWRkcmVzcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBiYXNlQWRkcmVzcyB9ID0gdGhpcy5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcbiAgICAgIHJldHVybiBvcHRpb25hbERlcHMuZXRoVXRpbC5pc1ZhbGlkQWRkcmVzcyhvcHRpb25hbERlcHMuZXRoVXRpbC5hZGRIZXhQcmVmaXgoYmFzZUFkZHJlc3MpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFkZHJlc3MgaW50byBiYXNlIGFkZHJlc3MgYW5kIG9wdGlvbmFsIG1lbW9JZFxuICAgKiBUaHJvd3MgSW52YWxpZEFkZHJlc3NFcnJvciBmb3IgaW52YWxpZCBhZGRyZXNzIGZvcm1hdHNcbiAgICogQHBhcmFtIGFkZHJlc3MgLSBBZGRyZXNzIHN0cmluZywgcG90ZW50aWFsbHkgd2l0aCA/bWVtb0lkPVggc3VmZml4XG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGFkZHJlc3MsIGJhc2VBZGRyZXNzLCBhbmQgbWVtb0lkIChudWxsIGlmIG5vdCBwcmVzZW50KVxuICAgKiBAdGhyb3dzIEludmFsaWRBZGRyZXNzRXJyb3IgaWYgYWRkcmVzcyBmb3JtYXQgaXMgaW52YWxpZFxuICAgKi9cbiAgZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzczogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IGJhc2VBZGRyZXNzOiBzdHJpbmc7IG1lbW9JZDogc3RyaW5nIHwgbnVsbCB9IHtcbiAgICBpZiAodHlwZW9mIGFkZHJlc3MgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdGluYXRpb25EZXRhaWxzID0gdXJsLnBhcnNlKGFkZHJlc3MpO1xuICAgIGNvbnN0IGJhc2VBZGRyZXNzID0gZGVzdGluYXRpb25EZXRhaWxzLnBhdGhuYW1lIHx8ICcnO1xuXG4gICAgLy8gTm8gcXVlcnkgc3RyaW5nIC0ganVzdCBhIHBsYWluIGFkZHJlc3NcbiAgICBpZiAoZGVzdGluYXRpb25EZXRhaWxzLnBhdGhuYW1lID09PSBhZGRyZXNzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhZGRyZXNzLFxuICAgICAgICBiYXNlQWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgbWVtb0lkOiBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIYXMgcXVlcnkgc3RyaW5nIC0gbXVzdCBjb250YWluIG1lbW9JZFxuICAgIGlmICghZGVzdGluYXRpb25EZXRhaWxzLnF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlEZXRhaWxzID0gcXVlcnlzdHJpbmcucGFyc2UoZGVzdGluYXRpb25EZXRhaWxzLnF1ZXJ5KTtcblxuICAgIC8vIFF1ZXJ5IHN0cmluZyBtdXN0IGNvbnRhaW4gbWVtb0lkXG4gICAgaWYgKCFxdWVyeURldGFpbHMubWVtb0lkKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9LCB1bmtub3duIHF1ZXJ5IHBhcmFtZXRlcnNgKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IG9uZSBtZW1vSWQgYWxsb3dlZFxuICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5RGV0YWlscy5tZW1vSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihcbiAgICAgICAgYG1lbW9JZCBtYXkgb25seSBiZSBnaXZlbiBhdCBtb3N0IG9uY2UsIGJ1dCBmb3VuZCAke3F1ZXJ5RGV0YWlscy5tZW1vSWQubGVuZ3RofSBpbnN0YW5jZXMgaW4gYWRkcmVzcyAke2FkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZWplY3QgaWYgdGhlcmUgYXJlIG90aGVyIHF1ZXJ5IHBhcmFtZXRlcnMgYmVzaWRlcyBtZW1vSWRcbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhxdWVyeURldGFpbHMpO1xuICAgIGlmIChxdWVyeUtleXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9LCBvbmx5IG1lbW9JZCBxdWVyeSBwYXJhbWV0ZXIgaXMgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1lbW9JZCBmb3JtYXRcbiAgICBpZiAoIXRoaXMuaXNWYWxpZE1lbW9JZChxdWVyeURldGFpbHMubWVtb0lkKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRNZW1vSWRFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAnJHthZGRyZXNzfScsIG1lbW9JZCBpcyBub3QgdmFsaWRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzcyxcbiAgICAgIGJhc2VBZGRyZXNzLFxuICAgICAgbWVtb0lkOiBxdWVyeURldGFpbHMubWVtb0lkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIG1lbW9JZCBpcyBhIHZhbGlkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHN0cmluZ1xuICAgKiBAcGFyYW0gbWVtb0lkIC0gVGhlIG1lbW9JZCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkTWVtb0lkKG1lbW9JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRNZW1vSWRVdGlsKG1lbW9JZCk7XG4gIH1cblxuICAvKipcbiAgICogVGVtcG8gdXNlcyBtZW1vSWQtYmFzZWQgYWRkcmVzc2VzIHJhdGhlciB0aGFuIGZvcndhcmRlciBjb250cmFjdHMuXG4gICAqIFZlcmlmeSB0aGF0IHRoZSBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhpcyB3YWxsZXQgYnkgY2hlY2tpbmcgdGhhdCB0aGVcbiAgICogYmFzZSAoRVZNKSBwb3J0aW9uIG1hdGNoZXMgdGhlIHdhbGxldCdzIGJhc2UgYWRkcmVzcy5cbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUV0aEFkZHJlc3NPcHRpb25zIHwgVHNzVmVyaWZ5RXRoQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IGFkZHJlc3MsIGJhc2VBZGRyZXNzIH0gPSBwYXJhbXM7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSAocGFyYW1zIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJvb3RBZGRyZXNzIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghYWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoJ2FkZHJlc3MgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGJhc2VBZGRyZXNzOiBhZGRyZXNzQmFzZSB9ID0gdGhpcy5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcblxuICAgIGNvbnN0IHdhbGxldEJhc2VBZGRyZXNzID0gYmFzZUFkZHJlc3MgfHwgcm9vdEFkZHJlc3M7XG4gICAgaWYgKCF3YWxsZXRCYXNlQWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoJ2Jhc2VBZGRyZXNzIG9yIHJvb3RBZGRyZXNzIGlzIHJlcXVpcmVkIGZvciB2ZXJpZmljYXRpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGJhc2VBZGRyZXNzOiB3YWxsZXRCYXNlIH0gPSB0aGlzLmdldEFkZHJlc3NEZXRhaWxzKHdhbGxldEJhc2VBZGRyZXNzKTtcblxuICAgIGlmIChhZGRyZXNzQmFzZS50b0xvd2VyQ2FzZSgpICE9PSB3YWxsZXRCYXNlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogZXhwZWN0ZWQgJHt3YWxsZXRCYXNlfSBidXQgZ290ICR7YWRkcmVzc0Jhc2V9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSBzZXJpYWxpc2VkIFRlbXBvIHRyYW5zYWN0aW9uIGFuZCByZXR1cm4gaXRzIG9wZXJhdGlvbnMgYXMgU0RLIG91dHB1dHMuXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhIZXggPSAocGFyYW1zLnR4SGV4IHx8IChwYXJhbXMgYXMgYW55KS5oYWxmU2lnbmVkPy50eEhleCkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCFpc1RpcDIwVHJhbnNhY3Rpb24odHhIZXgpKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHR4QnVpbGRlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLmZyb20odHhIZXgpO1xuICAgIGNvbnN0IHR4ID0gKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKSBhcyBUaXAyMFRyYW5zYWN0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IHR4LmlucHV0cy5tYXAoKGlucHV0KSA9PiAoe1xuICAgICAgICBhZGRyZXNzOiBpbnB1dC5hZGRyZXNzLFxuICAgICAgICBhbW91bnQ6IGlucHV0LnZhbHVlLFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICB9KSksXG4gICAgICBvdXRwdXRzOiB0eC5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiBvdXRwdXQudmFsdWUsXG4gICAgICAgIGNvaW46IHRoaXMuZ2V0Q2hhaW4oKSxcbiAgICAgIH0pKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgVGVtcG8gdHJhbnNhY3Rpb24gbWF0Y2hlcyB0aGUgaW50ZW5kZWQgcmVjaXBpZW50cyBhbmQgYW1vdW50cy5cbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHBhcmFtczogVmVyaWZ5RXRoVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0eFByZWJ1aWxkPy50eEhleCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gc2lnbmFibGVIZXggbWF5IGFycml2ZSB3aXRob3V0IHRoZSAweCBwcmVmaXggKGUuZy4gZnJvbSB0aGUgVFNTIHNpZ25pbmcgZmxvdykuXG4gICAgY29uc3QgdHhIZXggPSB0eFByZWJ1aWxkLnR4SGV4LnN0YXJ0c1dpdGgoJzB4JykgPyB0eFByZWJ1aWxkLnR4SGV4IDogJzB4JyArIHR4UHJlYnVpbGQudHhIZXg7XG4gICAgaWYgKCFpc1RpcDIwVHJhbnNhY3Rpb24odHhIZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVGVtcG8gdHJhbnNhY3Rpb24gaGV4OiBleHBlY3RlZCBhIDB4NzYgVElQLTIwIHRyYW5zYWN0aW9uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdHhCdWlsZGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIuZnJvbSh0eEhleCk7XG4gICAgY29uc3QgdHggPSAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpIGFzIFRpcDIwVHJhbnNhY3Rpb247XG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IHR4LmdldE9wZXJhdGlvbnMoKTtcbiAgICBjb25zdCByYXdDYWxscyA9IHR4LmdldFJhd0NhbGxzKCk7XG5cbiAgICAvLyBJZiB0aGUgY2FsbGVyIHNwZWNpZmllZCBleHBsaWNpdCByZWNpcGllbnRzLCB2ZXJpZnkgdGhleSBtYXRjaCB0aGUgdHJhbnNhY3Rpb24uXG4gICAgLy8gQSB0cmFuc2FjdGlvbiBpcyBlaXRoZXIgYWxsIHRva2VuIHRyYW5zZmVyIG9wZXJhdGlvbnMgT1IgYSBzaW5nbGUgcmF3IGNvbnRyYWN0IGNhbGwg4oCUIG5ldmVyIG1peGVkLlxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eFBhcmFtcz8ucmVjaXBpZW50cztcbiAgICBpZiAocmVjaXBpZW50cyAmJiByZWNpcGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChyYXdDYWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIENvbnRyYWN0IGNhbGwgdHJhbnNhY3Rpb24g4oCUIHNpbmdsZSByYXcgY2FsbCwgc2luZ2xlIHJlY2lwaWVudCB3aXRoIGRhdGFcbiAgICAgICAgaWYgKHJhd0NhbGxzLmxlbmd0aCAhPT0gcmVjaXBpZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNhY3Rpb24gaGFzICR7cmF3Q2FsbHMubGVuZ3RofSBjYWxsKHMpIGJ1dCAke3JlY2lwaWVudHMubGVuZ3RofSByZWNpcGllbnQocykgd2VyZSByZXF1ZXN0ZWRgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0NhbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmF3Q2FsbCA9IHJhd0NhbGxzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbaV07XG4gICAgICAgICAgaWYgKHJhd0NhbGwudG8udG9Mb3dlckNhc2UoKSAhPT0gcmVjaXBpZW50LmFkZHJlc3Muc3BsaXQoJz8nKVswXS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhdyBjYWxsICR7aX0gYWRkcmVzcyBtaXNtYXRjaDogZXhwZWN0ZWQgJHtyZWNpcGllbnQuYWRkcmVzc30sIGdvdCAke3Jhd0NhbGwudG99YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghcmVjaXBpZW50LmRhdGEgfHwgcmF3Q2FsbC5kYXRhLnRvTG93ZXJDYXNlKCkgIT09IHJlY2lwaWVudC5kYXRhLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmF3IGNhbGwgJHtpfSBjYWxsZGF0YSBtaXNtYXRjaGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24g4oCUIG9wZXJhdGlvbnMgbWF0Y2hlZCAxLXRvLTEgYWdhaW5zdCByZWNpcGllbnRzXG4gICAgICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCAhPT0gcmVjaXBpZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNhY3Rpb24gaGFzICR7b3BlcmF0aW9ucy5sZW5ndGh9IG9wZXJhdGlvbihzKSBidXQgJHtyZWNpcGllbnRzLmxlbmd0aH0gcmVjaXBpZW50KHMpIHdlcmUgcmVxdWVzdGVkYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb3AgPSBvcGVyYXRpb25zW2ldO1xuICAgICAgICAgIGNvbnN0IHJlY2lwaWVudCA9IHJlY2lwaWVudHNbaV07XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50QmFzZUFkZHJlc3MgPSByZWNpcGllbnQuYWRkcmVzcy5zcGxpdCgnPycpWzBdO1xuICAgICAgICAgIGlmIChvcC50by50b0xvd2VyQ2FzZSgpICE9PSByZWNpcGllbnRCYXNlQWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wZXJhdGlvbiAke2l9IHJlY2lwaWVudCBtaXNtYXRjaDogZXhwZWN0ZWQgJHtyZWNpcGllbnQuYWRkcmVzc30sIGdvdCAke29wLnRvfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvcEFtb3VudEJhc2VVbml0cyA9IGFtb3VudFRvVGlwMjBVbml0cyhvcC5hbW91bnQpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKG9wQW1vdW50QmFzZVVuaXRzICE9PSByZWNpcGllbnQuYW1vdW50LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uICR7aX0gYW1vdW50IG1pc21hdGNoOiBleHBlY3RlZCAke3JlY2lwaWVudC5hbW91bnR9LCBnb3QgJHtvcEFtb3VudEJhc2VVbml0c31gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJpZnkgZmVlIHRva2VuIGlmIHNwZWNpZmllZFxuICAgIGlmICh0eFBhcmFtcz8uZmVlVG9rZW4pIHtcbiAgICAgIGNvbnN0IHR4RmVlVG9rZW4gPSB0eC5nZXRGZWVUb2tlbigpO1xuICAgICAgaWYgKHR4RmVlVG9rZW4/LnRvTG93ZXJDYXNlKCkgIT09IHR4UGFyYW1zLmZlZVRva2VuLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGZWUgdG9rZW4gbWlzbWF0Y2g6IGV4cGVjdGVkICR7dHhQYXJhbXMuZmVlVG9rZW59LCBnb3QgJHt0eEZlZVRva2VuIHx8ICdub25lJ31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY29pbi1zcGVjaWZpYyBmaWVsZHMgaW4gdGhlIGludGVudCBmb3IgVGVtcG8gVFNTIHRyYW5zYWN0aW9ucy5cbiAgICogRW5zdXJlcyBmZWVUb2tlbiBpcyBwcm9wZXJseSB3aXJlZCB0aHJvdWdoIHRoZSBpbnRlbnQgZm9yIFRlbXBvIHRyYW5zYWN0aW9ucy5cbiAgICogQHBhcmFtIGludGVudCAtIFRoZSBwb3B1bGF0ZWQgaW50ZW50IHRvIG1vZGlmeVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgY29udGFpbmluZyBmZWVUb2tlblxuICAgKi9cbiAgc2V0Q29pblNwZWNpZmljRmllbGRzSW5JbnRlbnQoaW50ZW50OiBQb3B1bGF0ZWRJbnRlbnQsIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHBhcmFtcy5mZWVUb2tlbikge1xuICAgICAgaW50ZW50LmZlZU9wdGlvbnMgPSBpbnRlbnQuZmVlT3B0aW9uc1xuICAgICAgICA/IHsgLi4uaW50ZW50LmZlZU9wdGlvbnMsIGZlZVRva2VuOiBwYXJhbXMuZmVlVG9rZW4gfVxuICAgICAgICA6IHsgZmVlVG9rZW46IHBhcmFtcy5mZWVUb2tlbiB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSB0aGUgVGVtcG8gQWxjaGVteSBSUEMgZm9yIHJlY292ZXJ5IGJhbGFuY2Uvbm9uY2UgaW5mb3JtYXRpb24uXG4gICAqIFJvdXRlcyB0aHJvdWdoIHF1ZXJ5VGVtcG9ScGMgdXNpbmcgdGhlIFVSTCBmcm9tIGVudmlyb25tZW50cy50cy5cbiAgICovXG4gIGFzeW5jIHJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoXG4gICAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gICAgYXBpS2V5Pzogc3RyaW5nXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBjb25zdCBldm1Db25maWcgPSBjb21tb24uRW52aXJvbm1lbnRzW3RoaXMuYml0Z28uZ2V0RW52KCldLmV2bTtcbiAgICBjb25zdCBjb2luRmFtaWx5ID0gdGhpcy5nZXRGYW1pbHkoKTtcbiAgICBpZiAoIWV2bUNvbmZpZyB8fCAhKGNvaW5GYW1pbHkgaW4gZXZtQ29uZmlnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbnYgY29uZmlnIG1pc3NpbmcgZm9yICR7Y29pbkZhbWlseX0gaW4gJHt0aGlzLmJpdGdvLmdldEVudigpfWApO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGFwaUtleSB8fCBldm1Db25maWdbY29pbkZhbWlseV0uYXBpVG9rZW47XG4gICAgY29uc3QgcnBjVXJsID0gZXZtQ29uZmlnW2NvaW5GYW1pbHldLmJhc2VVcmw7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlUZW1wb1JwYyhxdWVyeSwgcnBjVXJsLCB0b2tlbik7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlcyBFdGhlcnNjYW4tc3R5bGUgcmVjb3ZlcnkgcXVlcmllcyBpbnRvIFRlbXBvIEFsY2hlbXkgSlNPTi1SUEMgY2FsbHMuXG4gICAqXG4gICAqIFN1cHBvcnRlZDpcbiAgICogICBhY2NvdW50L2JhbGFuY2UgICAgICDihpIgcmV0dXJucyB7IHJlc3VsdDogJzAnIH0gKG5vIG5hdGl2ZSBjb2luIG9uIFRlbXBvKVxuICAgKiAgIGFjY291bnQvdG9rZW5iYWxhbmNlIOKGkiBldGhfY2FsbCAoYmFsYW5jZU9mIHNlbGVjdG9yIDB4NzBhMDgyMzEpIOKGkiB7IHJlc3VsdDogZGVjaW1hbFN0cmluZyB9XG4gICAqICAgYWNjb3VudC90eGxpc3QgICAgICAg4oaSIGV0aF9nZXRUcmFuc2FjdGlvbkNvdW50IOKGkiB7IG5vbmNlOiBudW1iZXIgfVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBxdWVyeVRlbXBvUnBjKFxuICAgIHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICAgIHJwY1VybDogc3RyaW5nLFxuICAgIGFwaUtleT86IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBhcGlLZXkgPyBgJHtycGNVcmx9JHthcGlLZXl9YCA6IHJwY1VybDtcbiAgICBjb25zdCB7IG1vZHVsZSwgYWN0aW9uLCBhZGRyZXNzLCBjb250cmFjdGFkZHJlc3MsIHRhZyB9ID0gcXVlcnk7XG5cbiAgICBsZXQgbWV0aG9kOiBzdHJpbmc7XG4gICAgbGV0IHBhcmFtczogdW5rbm93bltdO1xuXG4gICAgaWYgKG1vZHVsZSA9PT0gJ2FjY291bnQnICYmIGFjdGlvbiA9PT0gJ2JhbGFuY2UnKSB7XG4gICAgICByZXR1cm4geyByZXN1bHQ6ICcwJyB9O1xuICAgIH0gZWxzZSBpZiAobW9kdWxlID09PSAnYWNjb3VudCcgJiYgYWN0aW9uID09PSAndG9rZW5iYWxhbmNlJykge1xuICAgICAgY29uc3QgcGFkZGVkQWRkciA9IChhZGRyZXNzID8/ICcnKS5yZXBsYWNlKC9eMHgvLCAnJykucGFkU3RhcnQoNjQsICcwJyk7XG4gICAgICBtZXRob2QgPSAnZXRoX2NhbGwnO1xuICAgICAgcGFyYW1zID0gW3sgdG86IGNvbnRyYWN0YWRkcmVzcywgZGF0YTogJzB4NzBhMDgyMzEnICsgcGFkZGVkQWRkciB9LCB0YWcgPz8gJ2xhdGVzdCddO1xuICAgIH0gZWxzZSBpZiAobW9kdWxlID09PSAnYWNjb3VudCcgJiYgYWN0aW9uID09PSAndHhsaXN0Jykge1xuICAgICAgbWV0aG9kID0gJ2V0aF9nZXRUcmFuc2FjdGlvbkNvdW50JztcbiAgICAgIHBhcmFtcyA9IFthZGRyZXNzLCAnbGF0ZXN0J107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgcXVlcnlUZW1wb1JwYzogdW5zdXBwb3J0ZWQgbW9kdWxlPSR7bW9kdWxlfSBhY3Rpb249JHthY3Rpb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goZW5kcG9pbnQsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGpzb25ycGM6ICcyLjAnLCBtZXRob2QsIHBhcmFtcywgaWQ6IDEgfSksXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhY2ggVGVtcG8gUlBDIGVuZHBvaW50IChIVFRQICR7cmVzLnN0YXR1c30pYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7IHJlc3VsdD86IHVua25vd247IGVycm9yPzogeyBtZXNzYWdlOiBzdHJpbmcgfSB9O1xuICAgIGlmIChib2R5LmVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbXBvIFJQQyBlcnJvcjogJHtib2R5LmVycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgaWYgKG1vZHVsZSA9PT0gJ2FjY291bnQnICYmIGFjdGlvbiA9PT0gJ3R4bGlzdCcpIHtcbiAgICAgIHJldHVybiB7IG5vbmNlOiBwYXJzZUludChib2R5LnJlc3VsdCBhcyBzdHJpbmcsIDE2KSB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyByZXN1bHQ6IEJpZ0ludChib2R5LnJlc3VsdCBhcyBzdHJpbmcpLnRvU3RyaW5nKCkgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IHJlc3VsdDogJzAnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBoZWxwZXI6IHF1ZXJpZXMgdGhlIHRva2VuIGJhbGFuY2UsIGNvbXB1dGVzIHN3ZWVwIGFtb3VudCwgYW5kIGJ1aWxkc1xuICAgKiBhbiB1bnNpZ25lZCBUSVAtMjAgdHJhbnNmZXIgdHJhbnNhY3Rpb24uIFVzZWQgYnkgYm90aCByZWNvdmVyeSBwYXRocy5cbiAgICpcbiAgICogLSB0b2tlbkNvbnRyYWN0QWRkcmVzczogdGhlIHRva2VuIHRvIHN3ZWVwIChkZWZhdWx0cyB0byBwYXRoVVNEKVxuICAgKiAtIGZlZVRva2VuOiBhbHdheXMgcGF0aFVTRFxuICAgKiAtIElmIHN3ZWVwaW5nIHBhdGhVU0QgaXRzZWxmLCByZXNlcnZlcyBnYXNMaW1pdCDDlyBtYXhGZWVQZXJHYXMgLyAxMF4xMiBwYXRoVVNEIHVuaXRzIGZvciBmZWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFRlbXBvU3dlZXBUeChcbiAgICB3YWxsZXRBZGRyZXNzOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvdmVyT3B0aW9uc1xuICApOiBQcm9taXNlPHsgdHg6IFRpcDIwVHJhbnNhY3Rpb247IG5vbmNlOiBudW1iZXI7IHN3ZWVwQW1vdW50OiBiaWdpbnQ7IGdhc01hcmdpblVuaXRzOiBiaWdpbnQgfT4ge1xuICAgIGlmICghcGFyYW1zLnRva2VuQ29udHJhY3RBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rva2VuQ29udHJhY3RBZGRyZXNzIGlzIHJlcXVpcmVkIGZvciBzd2VlcCcpO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbkFkZHJlc3MgPSBwYXJhbXMudG9rZW5Db250cmFjdEFkZHJlc3M7XG5cbiAgICBjb25zdCBwYXRoVXNkVG9rZW5OYW1lID0gdGhpcy5nZXRDaGFpbigpID09PSBNQUlOTkVUX0NPSU4gPyBQQVRIX1VTRF9UT0tFTl9NQUlOTkVUIDogUEFUSF9VU0RfVE9LRU5fVEVTVE5FVDtcbiAgICBjb25zdCBwYXRoVXNkQWRkcmVzcyA9IChjb2lucy5nZXQocGF0aFVzZFRva2VuTmFtZSkgYXMgdW5rbm93biBhcyB7IGNvbnRyYWN0QWRkcmVzczogc3RyaW5nIH0pLmNvbnRyYWN0QWRkcmVzcztcblxuICAgIGNvbnN0IHJhd0JhbGFuY2UgPSBhd2FpdCB0aGlzLnF1ZXJ5QWRkcmVzc1Rva2VuQmFsYW5jZSh0b2tlbkFkZHJlc3MsIHdhbGxldEFkZHJlc3MsIHBhcmFtcy5hcGlLZXkpO1xuICAgIGNvbnN0IGJhbGFuY2UgPSBCaWdJbnQocmF3QmFsYW5jZS50b1N0cmluZygpKTtcblxuICAgIGNvbnN0IGlzUGF0aFVzZCA9IHRva2VuQWRkcmVzcy50b0xvd2VyQ2FzZSgpID09PSBwYXRoVXNkQWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGdhc0xpbWl0QmlnID0gQmlnSW50KHBhcmFtcy5nYXNMaW1pdCA/PyA3MDBfMDAwKTtcbiAgICBjb25zdCBtYXhGZWVQZXJHYXNCaWcgPSBCaWdJbnQocGFyYW1zLmVpcDE1NTk/Lm1heEZlZVBlckdhcyA/PyAyMF8wMDBfMDAwXzAwMCk7XG4gICAgLy8gNzUlIGJ1ZmZlciBvbiB0b3Agb2YgZ2FzTGltaXQgw5cgbWF4RmVlUGVyR2FzIHRvIGNvdmVyIGFjdHVhbCBvbi1jaGFpbiBnYXMgdmFyaWFuY2VcbiAgICBjb25zdCBnYXNNYXJnaW5Vbml0cyA9IChnYXNMaW1pdEJpZyAqIG1heEZlZVBlckdhc0JpZyAqIDE3NW4pIC8gKDEwbiAqKiAxMm4gKiAxMDBuKTtcbiAgICBjb25zdCBzd2VlcEFtb3VudCA9IGlzUGF0aFVzZCA/IGJhbGFuY2UgLSBnYXNNYXJnaW5Vbml0cyA6IGJhbGFuY2U7XG5cbiAgICBpZiAoc3dlZXBBbW91bnQgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluc3VmZmljaWVudCBiYWxhbmNlIGluICR7dG9rZW5BZGRyZXNzfTogJHtiYWxhbmNlfSB1bml0cyAobWluaW11bSByZXF1aXJlZDogJHtcbiAgICAgICAgICBpc1BhdGhVc2QgPyBnYXNNYXJnaW5Vbml0cyArIDFuIDogMW5cbiAgICAgICAgfSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN3ZWVwQW1vdW50SHVtYW4gPSB0aXAyMFVuaXRzVG9BbW91bnQoc3dlZXBBbW91bnQpO1xuICAgIGNvbnN0IG5vbmNlID0gYXdhaXQgdGhpcy5nZXRBZGRyZXNzTm9uY2Uod2FsbGV0QWRkcmVzcywgcGFyYW1zLmFwaUtleSk7XG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVpbGRlcigpIGFzIHVua25vd24gYXMgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuYWRkT3BlcmF0aW9uKHsgdG9rZW46IHRva2VuQWRkcmVzcywgdG86IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBhbW91bnQ6IHN3ZWVwQW1vdW50SHVtYW4gfSlcbiAgICAgIC5mZWVUb2tlbihwYXRoVXNkQWRkcmVzcylcbiAgICAgIC5ub25jZShub25jZSlcbiAgICAgIC5nYXMoZ2FzTGltaXRCaWcpXG4gICAgICAubWF4RmVlUGVyR2FzKG1heEZlZVBlckdhc0JpZylcbiAgICAgIC5tYXhQcmlvcml0eUZlZVBlckdhcyhCaWdJbnQocGFyYW1zLmVpcDE1NTk/Lm1heFByaW9yaXR5RmVlUGVyR2FzID8/IDEwXzAwMF8wMDBfMDAwKSk7XG5cbiAgICBjb25zdCB0eCA9IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkgYXMgVGlwMjBUcmFuc2FjdGlvbjtcbiAgICByZXR1cm4geyB0eCwgbm9uY2UsIHN3ZWVwQW1vdW50LCBnYXNNYXJnaW5Vbml0cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgYmFzZS1jbGFzcyByZWNvdmVyVFNTIHRvIHVzZSBUSVAtMjAgdHJhbnNhY3Rpb25zIGluc3RlYWQgb2Ygc3RhbmRhcmQgRVRILlxuICAgKlxuICAgKiBUd28gcGF0aHM6XG4gICAqICAgLSBVbnNpZ25lZCBzd2VlcCAocGxhaW4gcHVibGljIGtleSBzaGFyZXMpOiBkZWxlZ2F0ZXMgdG8gYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTXG4gICAqICAgLSBTaWduZWQgc3dlZXAgKGVuY3J5cHRlZCBrZXlzICsgcGFzc3BocmFzZSk6IGJ1aWxkcyBhbmQgc2lnbnMgYSBUSVAtMjAgdHggdmlhIE1QQ1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlY292ZXJUU1MoXG4gICAgcGFyYW1zOiBSZWNvdmVyT3B0aW9uc1xuICApOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IE9mZmxpbmVWYXVsdFR4SW5mbyB8IFVuc2lnbmVkU3dlZXBUeE1QQ3YyPiB7XG4gICAgdGhpcy52YWxpZGF0ZVJlY292ZXJ5UGFyYW1zKHBhcmFtcyk7XG4gICAgY29uc3QgdXNlcktleSA9IChwYXJhbXMudXNlcktleSA/PyAnJykucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSAocGFyYW1zLmJhY2t1cEtleSA/PyAnJykucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIGlmIChnZXRJc1Vuc2lnbmVkU3dlZXAoeyB1c2VyS2V5LCBiYWNrdXBLZXksIGlzVHNzOiBwYXJhbXMuaXNUc3MgfSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyhwYXJhbXMpO1xuICAgIH1cblxuICAgIC8vIFNpZ25lZCBzd2VlcDogZGVjcnlwdCBNUEMgdjIga2V5IHNoYXJlc1xuICAgIGNvbnN0IHsgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW4gfSA9IGF3YWl0IEVDRFNBVXRpbHMuZ2V0TXBjVjJSZWNvdmVyeUtleVNoYXJlcyhcbiAgICAgIHVzZXJLZXksXG4gICAgICBiYWNrdXBLZXksXG4gICAgICBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIHRoaXMuYml0Z29cbiAgICApO1xuXG4gICAgY29uc3QgTVBDID0gbmV3IEVjZHNhKCk7XG4gICAgY29uc3QgZGVyaXZlZENvbW1vbktleUNoYWluID0gTVBDLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Q2hhaW4sICdtLzAnKTtcbiAgICBjb25zdCBiYWNrdXBLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IGRlcml2ZWRDb21tb25LZXlDaGFpbi5zbGljZSgwLCA2NikgfSk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSBiYWNrdXBLZXlQYWlyLmdldEFkZHJlc3MoKTtcbiAgICB0aGlzLmFzc2VydFRzc0Jhc2VBZGRyZXNzTWF0Y2hlc1dhbGxldChiYXNlQWRkcmVzcywgcGFyYW1zKTtcblxuICAgIGNvbnN0IHsgdHg6IHVuc2lnbmVkVHggfSA9IGF3YWl0IHRoaXMuYnVpbGRUZW1wb1N3ZWVwVHgoYmFzZUFkZHJlc3MsIHBhcmFtcyk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEhleCA9IGF3YWl0IHVuc2lnbmVkVHguc2VyaWFsaXplKCk7XG5cbiAgICAvLyBIYXNoIHRoZSB1bnNpZ25lZCAweDc2IHR4IOKAlCBtYXRjaGVzIFRpcDIwVHJhbnNhY3Rpb25CdWlsZGVyJ3Mgb3duIHNpZ25pbmcgbG9naWNcbiAgICBjb25zdCBtc2dIYXNoSGV4ID0gZXRoZXJzLnV0aWxzLmtlY2NhazI1NihldGhlcnMudXRpbHMuYXJyYXlpZnkoc2VyaWFsaXplZEhleCkpO1xuICAgIGNvbnN0IG1lc3NhZ2VIYXNoID0gQnVmZmVyLmZyb20obXNnSGFzaEhleC5yZXBsYWNlKCcweCcsICcnKSwgJ2hleCcpO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgRUNEU0FVdGlscy5zaWduUmVjb3ZlcnlNcGNWMihtZXNzYWdlSGFzaCwgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW4pO1xuXG4gICAgLy8gRUNEU0FNZXRob2RUeXBlcy5TaWduYXR1cmUuci9zIGFyZSA2NC1jaGFyIGhleCBXSVRIT1VUIDB4IHByZWZpeFxuICAgIHVuc2lnbmVkVHguc2V0U2lnbmF0dXJlKHtcbiAgICAgIHI6IGAweCR7c2lnbmF0dXJlLnJ9YCxcbiAgICAgIHM6IGAweCR7c2lnbmF0dXJlLnN9YCxcbiAgICAgIHlQYXJpdHk6IHNpZ25hdHVyZS5yZWNpZCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNpZ25lZEhleCA9IGF3YWl0IHVuc2lnbmVkVHguc2VyaWFsaXplKCk7XG4gICAgY29uc3QgdHhJZCA9IGV0aGVycy51dGlscy5rZWNjYWsyNTYoZXRoZXJzLnV0aWxzLmFycmF5aWZ5KHNpZ25lZEhleCkpO1xuICAgIHJldHVybiB7IGlkOiB0eElkLCB0eDogc2lnbmVkSGV4IH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIHVuc2lnbmVkIFRJUC0yMCBzd2VlcCB0cmFuc2FjdGlvbiBmb3IgdGhlIG9mZmxpbmUgdmF1bHQgKHVuc2lnbmVkIHN3ZWVwIHBhdGgpLlxuICAgKiBDYWxsZWQgYnkgcmVjb3ZlclRTUyB3aGVuIHBsYWluIHB1YmxpYyBrZXkgc2hhcmVzIGFyZSBwcm92aWRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZFVuc2lnbmVkU3dlZXBUeG5UU1MocGFyYW1zOiBSZWNvdmVyT3B0aW9ucyk6IFByb21pc2U8T2ZmbGluZVZhdWx0VHhJbmZvIHwgVW5zaWduZWRTd2VlcFR4TVBDdjI+IHtcbiAgICBjb25zdCBiYWNrdXBLZXkgPSB0aGlzLmdldFRzc0NvbW1vbktleWNoYWluKHBhcmFtcyk7XG4gICAgaWYgKCFiYWNrdXBLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBjb21tb25LZXlDaGFpbicpO1xuICAgIH1cbiAgICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IHBhcmFtcy5kZXJpdmF0aW9uU2VlZCA/IGdldERlcml2YXRpb25QYXRoKHBhcmFtcy5kZXJpdmF0aW9uU2VlZCkgOiAnbS8wJztcbiAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcbiAgICBjb25zdCBkZXJpdmVkQ29tbW9uS2V5Q2hhaW4gPSBNUEMuZGVyaXZlVW5oYXJkZW5lZChiYWNrdXBLZXksIGRlcml2YXRpb25QYXRoKTtcbiAgICBjb25zdCBiYWNrdXBLZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IGRlcml2ZWRDb21tb25LZXlDaGFpbi5zbGljZSgwLCA2NikgfSk7XG4gICAgY29uc3QgYmFzZUFkZHJlc3MgPSBiYWNrdXBLZXlQYWlyLmdldEFkZHJlc3MoKTtcbiAgICAvLyBGYWlsIGNsb3NlZCBvbiBhIHdyb25nIGtleWNoYWluLCBhcyB0aGUgYmFzZSBjbGFzcyBkb2VzLiBBIGRlcml2YXRpb25TZWVkIHN3ZWVwcyBhXG4gICAgLy8gcHNldWRvcmFuZG9tIGNoaWxkIHRoZSBjYWxsZXIgY2Fubm90IHByZWRpY3QsIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAgIGlmICghcGFyYW1zLmRlcml2YXRpb25TZWVkKSB7XG4gICAgICB0aGlzLmFzc2VydFRzc0Jhc2VBZGRyZXNzTWF0Y2hlc1dhbGxldChiYXNlQWRkcmVzcywgcGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHR4LCBub25jZSwgc3dlZXBBbW91bnQsIGdhc01hcmdpblVuaXRzIH0gPSBhd2FpdCB0aGlzLmJ1aWxkVGVtcG9Td2VlcFR4KGJhc2VBZGRyZXNzLCBwYXJhbXMpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRIZXggPSBhd2FpdCB0eC5zZXJpYWxpemUoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBzZXJpYWxpemVkSGV4LnJlcGxhY2UoJzB4JywgJycpO1xuICAgIGNvbnN0IHNpZ25hYmxlSGV4ID0gZXRoZXJzLnV0aWxzLmtlY2NhazI1NihldGhlcnMudXRpbHMuYXJyYXlpZnkoc2VyaWFsaXplZEhleCkpLnJlcGxhY2UoJzB4JywgJycpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4UmVxdWVzdHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHdhbGxldENvaW46IHRoaXMuZ2V0Q2hhaW4oKSxcbiAgICAgICAgICB0cmFuc2FjdGlvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdW5zaWduZWRUeDoge1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRUeEhleCxcbiAgICAgICAgICAgICAgICBzaWduYWJsZUhleCxcbiAgICAgICAgICAgICAgICBkZXJpdmF0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICBmZWVJbmZvOiB7XG4gICAgICAgICAgICAgICAgICBmZWU6IE51bWJlcihnYXNNYXJnaW5Vbml0cyksXG4gICAgICAgICAgICAgICAgICBmZWVTdHJpbmc6IHRpcDIwVW5pdHNUb0Ftb3VudChnYXNNYXJnaW5Vbml0cyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYXJzZWRUeDoge1xuICAgICAgICAgICAgICAgICAgc3BlbmRBbW91bnQ6IHRpcDIwVW5pdHNUb0Ftb3VudChzd2VlcEFtb3VudCksXG4gICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb2luTmFtZTogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU3RyaW5nOiB0aXAyMFVuaXRzVG9BbW91bnQoc3dlZXBBbW91bnQpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvaW5TcGVjaWZpYzogeyBjb21tb25LZXlDaGFpbjogYmFja3VwS2V5IH0sXG4gICAgICAgICAgICAgICAgZWlwMTU1OTogcGFyYW1zLmVpcDE1NTksXG4gICAgICAgICAgICAgICAgcmVwbGF5UHJvdGVjdGlvbk9wdGlvbnM6IHBhcmFtcy5yZXBsYXlQcm90ZWN0aW9uT3B0aW9ucyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbm9uY2UsXG4gICAgICAgICAgICAgIHNpZ25hdHVyZVNoYXJlczogW10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRyYW5zYWN0aW9uIGJ1aWxkZXIgZm9yIFRlbXBvLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFRyYW5zYWN0aW9uQnVpbGRlcihjb21tb24/OiBFdGhMaWtlQ29tbW9uLmRlZmF1bHQpOiBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgIHJldHVybiBuZXcgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIoY29pbnMuZ2V0KHRoaXMuZ2V0QmFzZUNoYWluKCkpKSBhcyB1bmtub3duIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgfVxufVxuIl19
@@ -7,6 +7,7 @@ const sinon_1 = __importDefault(require("sinon"));
7
7
  const should_1 = __importDefault(require("should"));
8
8
  const sdk_api_1 = require("@bitgo-beta/sdk-api");
9
9
  const sdk_test_1 = require("@bitgo-beta/sdk-test");
10
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
11
  const statics_1 = require("@bitgo-beta/statics");
11
12
  const tempo_1 = require("../../src/tempo");
12
13
  const PATH_USD_ADDRESS = '0x20c0000000000000000000000000000000000000';
@@ -14,6 +15,9 @@ const PATH_USD_ADDRESS = '0x20c0000000000000000000000000000000000000';
14
15
  const TEST_BACKUP_KEY = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798' +
15
16
  '0000000000000000000000000000000000000000000000000000000000000001';
16
17
  const TEST_RECOVERY_DESTINATION = '0x80151ebf635e6ec8a5455258f617be6cda1fbd7e';
18
+ // the m/0 address TEST_BACKUP_KEY derives; recover() always supplies this, so these direct
19
+ // calls to the protected builder must too
20
+ const TEST_WALLET_BASE_ADDRESS = '0x19332ae0650de6a555f096057603fdc0c821c1f0';
17
21
  describe('Tempo Recovery', function () {
18
22
  let bitgo;
19
23
  let basecoin;
@@ -128,6 +132,7 @@ describe('Tempo Recovery', function () {
128
132
  const result = (await basecoin.buildUnsignedSweepTxnTSS({
129
133
  backupKey: TEST_BACKUP_KEY,
130
134
  recoveryDestination: TEST_RECOVERY_DESTINATION,
135
+ walletContractAddress: TEST_WALLET_BASE_ADDRESS,
131
136
  tokenContractAddress: PATH_USD_ADDRESS,
132
137
  gasLimit: 1000000,
133
138
  eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
@@ -142,6 +147,7 @@ describe('Tempo Recovery', function () {
142
147
  const result = (await basecoin.buildUnsignedSweepTxnTSS({
143
148
  backupKey: TEST_BACKUP_KEY,
144
149
  recoveryDestination: TEST_RECOVERY_DESTINATION,
150
+ walletContractAddress: TEST_WALLET_BASE_ADDRESS,
145
151
  tokenContractAddress: PATH_USD_ADDRESS,
146
152
  gasLimit: 500000,
147
153
  eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
@@ -155,6 +161,7 @@ describe('Tempo Recovery', function () {
155
161
  .buildUnsignedSweepTxnTSS({
156
162
  backupKey: TEST_BACKUP_KEY,
157
163
  recoveryDestination: TEST_RECOVERY_DESTINATION,
164
+ walletContractAddress: TEST_WALLET_BASE_ADDRESS,
158
165
  tokenContractAddress: PATH_USD_ADDRESS,
159
166
  gasLimit: 1000000,
160
167
  eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
@@ -167,6 +174,7 @@ describe('Tempo Recovery', function () {
167
174
  const result = (await basecoin.buildUnsignedSweepTxnTSS({
168
175
  backupKey: TEST_BACKUP_KEY,
169
176
  recoveryDestination: TEST_RECOVERY_DESTINATION,
177
+ walletContractAddress: TEST_WALLET_BASE_ADDRESS,
170
178
  tokenContractAddress: otherToken,
171
179
  gasLimit: 1000000,
172
180
  eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
@@ -179,6 +187,7 @@ describe('Tempo Recovery', function () {
179
187
  const result = (await basecoin.buildUnsignedSweepTxnTSS({
180
188
  backupKey: TEST_BACKUP_KEY,
181
189
  recoveryDestination: TEST_RECOVERY_DESTINATION,
190
+ walletContractAddress: TEST_WALLET_BASE_ADDRESS,
182
191
  tokenContractAddress: PATH_USD_ADDRESS,
183
192
  gasLimit: 1000000,
184
193
  eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
@@ -189,6 +198,27 @@ describe('Tempo Recovery', function () {
189
198
  tx.signatureShares.should.deepEqual([]);
190
199
  tx.nonce.should.equal(0);
191
200
  });
201
+ it('fails closed with RecoveryKeyMismatchError when the keychain is for another wallet', async function () {
202
+ stubBalanceAndNonce('1000000');
203
+ await basecoin
204
+ .buildUnsignedSweepTxnTSS({
205
+ backupKey: TEST_BACKUP_KEY,
206
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
207
+ walletContractAddress: '0xe740412ab65efdbdbe2a5e4c6e01d7bbc54a38a9',
208
+ tokenContractAddress: PATH_USD_ADDRESS,
209
+ gasLimit: 1000000,
210
+ eip1559: { maxFeePerGas: 20000000000, maxPriorityFeePerGas: 10000000000 },
211
+ })
212
+ .should.be.rejectedWith(sdk_core_1.RecoveryKeyMismatchError);
213
+ });
214
+ it('rejects a sweep with no key material rather than deriving from an empty keychain', async function () {
215
+ await basecoin
216
+ .buildUnsignedSweepTxnTSS({
217
+ recoveryDestination: TEST_RECOVERY_DESTINATION,
218
+ walletContractAddress: TEST_WALLET_BASE_ADDRESS,
219
+ })
220
+ .should.be.rejectedWith('missing commonKeyChain');
221
+ });
192
222
  });
193
223
  describe('recoverTSS — unsigned sweep dispatch', function () {
194
224
  it('routes to buildUnsignedSweepTxnTSS when keys are plain public keys', async function () {
@@ -199,9 +229,10 @@ describe('Tempo Recovery', function () {
199
229
  backupKey: TEST_BACKUP_KEY,
200
230
  isTss: true,
201
231
  recoveryDestination: TEST_RECOVERY_DESTINATION,
232
+ walletContractAddress: TEST_WALLET_BASE_ADDRESS,
202
233
  });
203
234
  buildStub.calledOnce.should.equal(true);
204
235
  });
205
236
  });
206
237
  });
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLGlEQUErQztBQUMvQyxtREFBK0Q7QUFFL0QsaURBQThFO0FBQzlFLDJDQUF3QztBQUN4QyxNQUFNLGdCQUFnQixHQUFHLDRDQUE0QyxDQUFDO0FBRXRFLHlHQUF5RztBQUN6RyxNQUFNLGVBQWUsR0FDbkIsb0VBQW9FO0lBQ3BFLGtFQUFrRSxDQUFDO0FBQ3JFLE1BQU0seUJBQXlCLEdBQUcsNENBQTRDLENBQUM7QUFFL0UsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLElBQUksS0FBbUIsQ0FBQztJQUN4QixJQUFJLFFBQWUsQ0FBQztJQUNwQixJQUFJLE9BQTJCLENBQUM7SUFFaEMsTUFBTSxDQUFDO1FBQ0wsS0FBSyxHQUFHLG9CQUFTLENBQUMsUUFBUSxDQUFDLGtCQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQVksRUFBRSxFQUFFO1lBQzNDLE1BQU0sZUFBZSxHQUE4QjtnQkFDakQsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE1BQU0sRUFBRSxvQkFBVSxDQUFDLEtBQUs7Z0JBQ3hCLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQzVCLFFBQVEsRUFBRSxFQUFFO2FBQ04sQ0FBQztZQUNULE9BQU8sYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQVUsQ0FB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QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0NBQXNDLEVBQUU7UUFDL0MsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEtBQUs7WUFDNUUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFlLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQWUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUzRSxNQUFPLFFBQWdCLENBQUMsVUFBVSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsU0FBUyxFQUFFLGVBQWU7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2dCQUNYLG1CQUFtQixFQUFFLHlCQUF5QjthQUMvQyxDQUFDLENBQUM7WUFFSCxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgQ29pbkZhbWlseSB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVGVtcG8gfSBmcm9tICcuLi8uLi9zcmMvdGVtcG8nO1xuY29uc3QgUEFUSF9VU0RfQUREUkVTUyA9ICcweDIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuXG4vLyBzZWNwMjU2azEgZ2VuZXJhdG9yIHBvaW50IEcgKDMzIGJ5dGVzKSArIDMyLWJ5dGUgY2hhaW5jb2RlIOKAlCB2YWxpZCBjb21tb25LZXlDaGFpbiBmb3IgZGVyaXZlVW5oYXJkZW5lZFxuY29uc3QgVEVTVF9CQUNLVVBfS0VZID1cbiAgJzAyNzliZTY2N2VmOWRjYmJhYzU1YTA2Mjk1Y2U4NzBiMDcwMjliZmNkYjJkY2UyOGQ5NTlmMjgxNWIxNmY4MTc5OCcgK1xuICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSc7XG5jb25zdCBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OID0gJzB4ODAxNTFlYmY2MzVlNmVjOGE1NDU1MjU4ZjYxN2JlNmNkYTFmYmQ3ZSc7XG5cbmRlc2NyaWJlKCdUZW1wbyBSZWNvdmVyeScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGVtcG87XG4gIGxldCBzYW5kYm94OiBzaW5vbi5TaW5vblNhbmRib3g7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RlbXBvJywgKGI6IEJpdEdvQmFzZSkgPT4ge1xuICAgICAgY29uc3QgbW9ja1N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+ID0ge1xuICAgICAgICBuYW1lOiAndGVtcG8nLFxuICAgICAgICBmdWxsTmFtZTogJ1RlbXBvJyxcbiAgICAgICAgZmFtaWx5OiBDb2luRmFtaWx5LlRFTVBPLFxuICAgICAgICBuZXR3b3JrOiB7IHR5cGU6ICdtYWlubmV0JyB9LFxuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICB9IGFzIGFueTtcbiAgICAgIHJldHVybiBUZW1wby5jcmVhdGVJbnN0YW5jZShiLCBtb2NrU3RhdGljc0NvaW4pO1xuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKSBhcyBUZW1wbztcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3F1ZXJ5VGVtcG9ScGMgKHZpYSByZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KScsIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBtb2NrRmV0Y2gocmVzcG9uc2VCb2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHNpbm9uLlNpbm9uU3R1YiB7XG4gICAgICByZXR1cm4gc2FuZGJveC5zdHViKGdsb2JhbCwgJ2ZldGNoJyBhcyBhbnkpLnJlc29sdmVzKHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGpzb246IGFzeW5jICgpID0+IHJlc3BvbnNlQm9keSxcbiAgICAgIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSBmb3IgYWNjb3VudC9iYWxhbmNlIHdpdGhvdXQgY2FsbGluZyBSUEMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goe30pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICdiYWxhbmNlJyxcbiAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICAgIGZldGNoU3R1Yi5jYWxsZWQuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBldGhfY2FsbCB3aXRoIGJhbGFuY2VPZiBzZWxlY3RvciBmb3IgYWNjb3VudC90b2tlbmJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDRlMjAnIH0pOyAvLyAyMDAwMCBkZWNpbWFsXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIHRhZzogJ2xhdGVzdCcsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMjAwMDAnIH0pO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZmV0Y2hTdHViLmZpcnN0Q2FsbC5hcmdzWzFdLmJvZHkpO1xuICAgICAgYm9keS5tZXRob2Quc2hvdWxkLmVxdWFsKCdldGhfY2FsbCcpO1xuICAgICAgYm9keS5wYXJhbXNbMF0uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDcwYTA4MjMxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgZXRoX2dldFRyYW5zYWN0aW9uQ291bnQgZm9yIGFjY291bnQvdHhsaXN0IGFuZCBwYXJzZXMgbm9uY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDUnIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0eGxpc3QnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IG5vbmNlOiA1IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgeyByZXN1bHQ6IFwiMFwiIH0gd2hlbiBSUEMgcmV0dXJucyBudWxsIGJvZHkucmVzdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0ZldGNoKHsgcmVzdWx0OiBudWxsIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0b2tlbmJhbGFuY2UnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSB3aGVuIFJQQyByZXR1cm5zIG1hbGZvcm1lZCBib2R5LnJlc3VsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tGZXRjaCh7IHJlc3VsdDogJ25vdC1hLW51bWJlcicgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweGFiYycsXG4gICAgICAgIGNvbnRyYWN0YWRkcmVzczogUEFUSF9VU0RfQUREUkVTUyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiB0aGUgUlBDIHJldHVybnMgYW4gZXJyb3IgZmllbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyBlcnJvcjogeyBtZXNzYWdlOiAnZXhlY3V0aW9uIHJldmVydGVkJyB9IH0pO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoe1xuICAgICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUZW1wbyBSUEMgZXJyb3I6IGV4ZWN1dGlvbiByZXZlcnRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBmb3IgdW5zdXBwb3J0ZWQgbW9kdWxlL2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHsgbW9kdWxlOiAncHJveHknLCBhY3Rpb246ICdldGhfYmxvY2tOdW1iZXInIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdxdWVyeVRlbXBvUnBjOiB1bnN1cHBvcnRlZCBtb2R1bGU9cHJveHkgYWN0aW9uPWV0aF9ibG9ja051bWJlcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTIOKAlCBnYXMgbWFyZ2luIGNhbGN1bGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHN0dWJCYWxhbmNlQW5kTm9uY2UoYmFsYW5jZTogc3RyaW5nLCBub25jZSA9IDApIHtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdxdWVyeUFkZHJlc3NUb2tlbkJhbGFuY2UnKS5yZXNvbHZlcyhiYWxhbmNlKTtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdnZXRBZGRyZXNzTm9uY2UnKS5yZXNvbHZlcyhub25jZSk7XG4gICAgfVxuXG4gICAgaXQoJ2RlZHVjdHMgZ2FzTGltaXQgw5cgbWF4RmVlUGVyR2FzIC8gMTBeMTIgZnJvbSBwYXRoVVNEIGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSAxXzAwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAqIDEuNzUgLyAxMF4xMiA9IDM1XzAwMFxuICAgICAgLy8gc3dlZXBBbW91bnQgPSAxXzAwMF8wMDAgLSAzNV8wMDAgPSA5NjVfMDAwXG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogMV8wMDBfMDAwLFxuICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgfSkpIGFzIGFueTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQudHhSZXF1ZXN0cyk7XG4gICAgICByZXN1bHQudHhSZXF1ZXN0c1swXS50cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnc2VyaWFsaXplZFR4SGV4Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBzbWFsbGVyIG1hcmdpbiB3aGVuIGdhc0xpbWl0IGlzIGhhbHZlZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGdhc01hcmdpbiA9IDUwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAqIDEuNzUgLyAxMF4xMiA9IDE3XzUwMFxuICAgICAgLy8gc3dlZXBBbW91bnQgPSA1MF8wMDAgLSAxN181MDAgPSAzMl81MDBcbiAgICAgIHN0dWJCYWxhbmNlQW5kTm9uY2UoJzUwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogNTAwXzAwMCxcbiAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgIH0pKSBhcyBhbnk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyB3aGVuIGJhbGFuY2UgZXhhY3RseSBlcXVhbHMgdGhlIGdhcyBtYXJnaW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSAxXzAwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAvIDEwXjEyID0gMjBfMDAwOyBiYWxhbmNlID0gMjBfMDAwIOKGkiBzd2VlcEFtb3VudCA9IDBcbiAgICAgIHN0dWJCYWxhbmNlQW5kTm9uY2UoJzIwMDAwJyk7XG4gICAgICBhd2FpdCAoYmFzZWNvaW4gYXMgYW55KVxuICAgICAgICAuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICAgIGdhc0xpbWl0OiAxXzAwMF8wMDAsXG4gICAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0luc3VmZmljaWVudCBiYWxhbmNlLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3QgZGVkdWN0IG1hcmdpbiB3aGVuIHN3ZWVwaW5nIGEgbm9uLXBhdGhVU0QgdG9rZW4nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvdGhlclRva2VuID0gJzB4MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSc7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCc1MDAnKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IChhd2FpdCAoYmFzZWNvaW4gYXMgYW55KS5idWlsZFVuc2lnbmVkU3dlZXBUeG5UU1Moe1xuICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogVEVTVF9SRUNPVkVSWV9ERVNUSU5BVElPTixcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IG90aGVyVG9rZW4sXG4gICAgICAgIGdhc0xpbWl0OiAxXzAwMF8wMDAsXG4gICAgICAgIGVpcDE1NTk6IHsgbWF4RmVlUGVyR2FzOiAyMF8wMDBfMDAwXzAwMCwgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IDEwXzAwMF8wMDBfMDAwIH0sXG4gICAgICB9KSkgYXMgYW55O1xuICAgICAgLy8gRnVsbCBiYWxhbmNlIG9mIDUwMCBzd2VwdDsgbm8gbWFyZ2luIGRlZHVjdGVkXG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBVbnNpZ25lZFN3ZWVwVHhNUEN2MiBzdHJ1Y3R1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiBQQVRIX1VTRF9BRERSRVNTLFxuICAgICAgICBnYXNMaW1pdDogMV8wMDBfMDAwLFxuICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgfSkpIGFzIGFueTtcbiAgICAgIGNvbnN0IHR4ID0gcmVzdWx0LnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdO1xuICAgICAgdHgudW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aC5zaG91bGQuZXF1YWwoJ20vMCcpO1xuICAgICAgdHgudW5zaWduZWRUeC5jb2luU3BlY2lmaWMuY29tbW9uS2V5Q2hhaW4uc2hvdWxkLmVxdWFsKFRFU1RfQkFDS1VQX0tFWSk7XG4gICAgICB0eC5zaWduYXR1cmVTaGFyZXMuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gICAgICB0eC5ub25jZS5zaG91bGQuZXF1YWwoMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZWNvdmVyVFNTIOKAlCB1bnNpZ25lZCBzd2VlcCBkaXNwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgncm91dGVzIHRvIGJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyB3aGVuIGtleXMgYXJlIHBsYWluIHB1YmxpYyBrZXlzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYnVpbGRTdHViID0gc2FuZGJveC5zdHViKGJhc2Vjb2luIGFzIGFueSwgJ2J1aWxkVW5zaWduZWRTd2VlcFR4blRTUycpLnJlc29sdmVzKHsgdHhSZXF1ZXN0czogW10gfSk7XG4gICAgICBzYW5kYm94LnN0dWIoYmFzZWNvaW4gYXMgYW55LCAndmFsaWRhdGVSZWNvdmVyeVBhcmFtcycpLnJldHVybnModW5kZWZpbmVkKTtcblxuICAgICAgYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkucmVjb3ZlclRTUyh7XG4gICAgICAgIHVzZXJLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIGlzVHNzOiB0cnVlLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkU3R1Yi5jYWxsZWRPbmNlLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdGVtcG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLGlEQUErQztBQUMvQyxtREFBK0Q7QUFDL0QsbURBQTJFO0FBQzNFLGlEQUE4RTtBQUM5RSwyQ0FBd0M7QUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyw0Q0FBNEMsQ0FBQztBQUV0RSx5R0FBeUc7QUFDekcsTUFBTSxlQUFlLEdBQ25CLG9FQUFvRTtJQUNwRSxrRUFBa0UsQ0FBQztBQUNyRSxNQUFNLHlCQUF5QixHQUFHLDRDQUE0QyxDQUFDO0FBQy9FLDJGQUEyRjtBQUMzRiwwQ0FBMEM7QUFDMUMsTUFBTSx3QkFBd0IsR0FBRyw0Q0FBNEMsQ0FBQztBQUU5RSxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7SUFDekIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBZSxDQUFDO0lBQ3BCLElBQUksT0FBMkIsQ0FBQztJQUVoQyxNQUFNLENBQUM7UUFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBWSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxlQUFlLEdBQThCO2dCQUNqRCxJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLG9CQUFVLENBQUMsS0FBSztnQkFDeEIsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtnQkFDNUIsUUFBUSxFQUFFLEVBQUU7YUFDTixDQUFDO1lBQ1QsT0FBTyxhQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNILEtB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QyxvRUFBb0UsRUFBRSxLQUFLO1lBQzVFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBZSxFQUFFLDBCQUEwQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFlLEVBQUUsd0JBQXdCLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFM0UsTUFBTyxRQUFnQixDQUFDLFVBQVUsQ0FBQztnQkFDakMsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLFNBQVMsRUFBRSxlQUFlO2dCQUMxQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxtQkFBbUIsRUFBRSx5QkFBeUI7Z0JBQzlDLHFCQUFxQixFQUFFLHdCQUF3QjthQUNoRCxDQUFDLENBQUM7WUFFSCxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWFwaSc7XG5pbXBvcnQgeyBUZXN0Qml0R28sIFRlc3RCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay10ZXN0JztcbmltcG9ydCB7IEJpdEdvQmFzZSwgUmVjb3ZlcnlLZXlNaXNtYXRjaEVycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luLCBDb2luRmFtaWx5IH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUZW1wbyB9IGZyb20gJy4uLy4uL3NyYy90ZW1wbyc7XG5jb25zdCBQQVRIX1VTRF9BRERSRVNTID0gJzB4MjBjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG5cbi8vIHNlY3AyNTZrMSBnZW5lcmF0b3IgcG9pbnQgRyAoMzMgYnl0ZXMpICsgMzItYnl0ZSBjaGFpbmNvZGUg4oCUIHZhbGlkIGNvbW1vbktleUNoYWluIGZvciBkZXJpdmVVbmhhcmRlbmVkXG5jb25zdCBURVNUX0JBQ0tVUF9LRVkgPVxuICAnMDI3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4JyArXG4gICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJztcbmNvbnN0IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04gPSAnMHg4MDE1MWViZjYzNWU2ZWM4YTU0NTUyNThmNjE3YmU2Y2RhMWZiZDdlJztcbi8vIHRoZSBtLzAgYWRkcmVzcyBURVNUX0JBQ0tVUF9LRVkgZGVyaXZlczsgcmVjb3ZlcigpIGFsd2F5cyBzdXBwbGllcyB0aGlzLCBzbyB0aGVzZSBkaXJlY3Rcbi8vIGNhbGxzIHRvIHRoZSBwcm90ZWN0ZWQgYnVpbGRlciBtdXN0IHRvb1xuY29uc3QgVEVTVF9XQUxMRVRfQkFTRV9BRERSRVNTID0gJzB4MTkzMzJhZTA2NTBkZTZhNTU1ZjA5NjA1NzYwM2ZkYzBjODIxYzFmMCc7XG5cbmRlc2NyaWJlKCdUZW1wbyBSZWNvdmVyeScsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gIGxldCBiYXNlY29pbjogVGVtcG87XG4gIGxldCBzYW5kYm94OiBzaW5vbi5TaW5vblNhbmRib3g7XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICdtb2NrJyB9KTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3RlbXBvJywgKGI6IEJpdEdvQmFzZSkgPT4ge1xuICAgICAgY29uc3QgbW9ja1N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+ID0ge1xuICAgICAgICBuYW1lOiAndGVtcG8nLFxuICAgICAgICBmdWxsTmFtZTogJ1RlbXBvJyxcbiAgICAgICAgZmFtaWx5OiBDb2luRmFtaWx5LlRFTVBPLFxuICAgICAgICBuZXR3b3JrOiB7IHR5cGU6ICdtYWlubmV0JyB9LFxuICAgICAgICBmZWF0dXJlczogW10sXG4gICAgICB9IGFzIGFueTtcbiAgICAgIHJldHVybiBUZW1wby5jcmVhdGVJbnN0YW5jZShiLCBtb2NrU3RhdGljc0NvaW4pO1xuICAgIH0pO1xuICAgIGJpdGdvLmluaXRpYWxpemVUZXN0VmFycygpO1xuICAgIGJhc2Vjb2luID0gYml0Z28uY29pbigndGVtcG8nKSBhcyBUZW1wbztcbiAgfSk7XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveCA9IHNpbm9uLmNyZWF0ZVNhbmRib3goKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3F1ZXJ5VGVtcG9ScGMgKHZpYSByZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KScsIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBtb2NrRmV0Y2gocmVzcG9uc2VCb2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHNpbm9uLlNpbm9uU3R1YiB7XG4gICAgICByZXR1cm4gc2FuZGJveC5zdHViKGdsb2JhbCwgJ2ZldGNoJyBhcyBhbnkpLnJlc29sdmVzKHtcbiAgICAgICAgb2s6IHRydWUsXG4gICAgICAgIGpzb246IGFzeW5jICgpID0+IHJlc3BvbnNlQm9keSxcbiAgICAgIH0gYXMgYW55KTtcbiAgICB9XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSBmb3IgYWNjb3VudC9iYWxhbmNlIHdpdGhvdXQgY2FsbGluZyBSUEMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goe30pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICdiYWxhbmNlJyxcbiAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICAgIGZldGNoU3R1Yi5jYWxsZWQuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdjYWxscyBldGhfY2FsbCB3aXRoIGJhbGFuY2VPZiBzZWxlY3RvciBmb3IgYWNjb3VudC90b2tlbmJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmZXRjaFN0dWIgPSBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDRlMjAnIH0pOyAvLyAyMDAwMCBkZWNpbWFsXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIHRhZzogJ2xhdGVzdCcsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMjAwMDAnIH0pO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoZmV0Y2hTdHViLmZpcnN0Q2FsbC5hcmdzWzFdLmJvZHkpO1xuICAgICAgYm9keS5tZXRob2Quc2hvdWxkLmVxdWFsKCdldGhfY2FsbCcpO1xuICAgICAgYm9keS5wYXJhbXNbMF0uZGF0YS5zaG91bGQuc3RhcnRXaXRoKCcweDcwYTA4MjMxJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2FsbHMgZXRoX2dldFRyYW5zYWN0aW9uQ291bnQgZm9yIGFjY291bnQvdHhsaXN0IGFuZCBwYXJzZXMgbm9uY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyByZXN1bHQ6ICcweDUnIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0eGxpc3QnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgfSk7XG4gICAgICByZXN1bHQuc2hvdWxkLmRlZXBFcXVhbCh7IG5vbmNlOiA1IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgeyByZXN1bHQ6IFwiMFwiIH0gd2hlbiBSUEMgcmV0dXJucyBudWxsIGJvZHkucmVzdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0ZldGNoKHsgcmVzdWx0OiBudWxsIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4ucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeSh7XG4gICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICBhY3Rpb246ICd0b2tlbmJhbGFuY2UnLFxuICAgICAgICBhZGRyZXNzOiAnMHhhYmMnLFxuICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKHsgcmVzdWx0OiAnMCcgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyB7IHJlc3VsdDogXCIwXCIgfSB3aGVuIFJQQyByZXR1cm5zIG1hbGZvcm1lZCBib2R5LnJlc3VsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tGZXRjaCh7IHJlc3VsdDogJ25vdC1hLW51bWJlcicgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBiYXNlY29pbi5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHtcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgIGFkZHJlc3M6ICcweGFiYycsXG4gICAgICAgIGNvbnRyYWN0YWRkcmVzczogUEFUSF9VU0RfQUREUkVTUyxcbiAgICAgIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwoeyByZXN1bHQ6ICcwJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCd0aHJvd3Mgd2hlbiB0aGUgUlBDIHJldHVybnMgYW4gZXJyb3IgZmllbGQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrRmV0Y2goeyBlcnJvcjogeyBtZXNzYWdlOiAnZXhlY3V0aW9uIHJldmVydGVkJyB9IH0pO1xuICAgICAgYXdhaXQgYmFzZWNvaW5cbiAgICAgICAgLnJlY292ZXJ5QmxvY2tjaGFpbkV4cGxvcmVyUXVlcnkoe1xuICAgICAgICAgIG1vZHVsZTogJ2FjY291bnQnLFxuICAgICAgICAgIGFjdGlvbjogJ3Rva2VuYmFsYW5jZScsXG4gICAgICAgICAgYWRkcmVzczogJzB4YWJjJyxcbiAgICAgICAgICBjb250cmFjdGFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdUZW1wbyBSUEMgZXJyb3I6IGV4ZWN1dGlvbiByZXZlcnRlZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Rocm93cyBmb3IgdW5zdXBwb3J0ZWQgbW9kdWxlL2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC5yZWNvdmVyeUJsb2NrY2hhaW5FeHBsb3JlclF1ZXJ5KHsgbW9kdWxlOiAncHJveHknLCBhY3Rpb246ICdldGhfYmxvY2tOdW1iZXInIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdxdWVyeVRlbXBvUnBjOiB1bnN1cHBvcnRlZCBtb2R1bGU9cHJveHkgYWN0aW9uPWV0aF9ibG9ja051bWJlcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTIOKAlCBnYXMgbWFyZ2luIGNhbGN1bGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIHN0dWJCYWxhbmNlQW5kTm9uY2UoYmFsYW5jZTogc3RyaW5nLCBub25jZSA9IDApIHtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdxdWVyeUFkZHJlc3NUb2tlbkJhbGFuY2UnKS5yZXNvbHZlcyhiYWxhbmNlKTtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICdnZXRBZGRyZXNzTm9uY2UnKS5yZXNvbHZlcyhub25jZSk7XG4gICAgfVxuXG4gICAgaXQoJ2RlZHVjdHMgZ2FzTGltaXQgw5cgbWF4RmVlUGVyR2FzIC8gMTBeMTIgZnJvbSBwYXRoVVNEIGJhbGFuY2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSAxXzAwMF8wMDAgKiAyMF8wMDBfMDAwXzAwMCAqIDEuNzUgLyAxMF4xMiA9IDM1XzAwMFxuICAgICAgLy8gc3dlZXBBbW91bnQgPSAxXzAwMF8wMDAgLSAzNV8wMDAgPSA5NjVfMDAwXG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogVEVTVF9XQUxMRVRfQkFTRV9BRERSRVNTLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogUEFUSF9VU0RfQUREUkVTUyxcbiAgICAgICAgZ2FzTGltaXQ6IDFfMDAwXzAwMCxcbiAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgIH0pKSBhcyBhbnk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdHNbMF0udHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguc2hvdWxkLmhhdmUucHJvcGVydHkoJ3NlcmlhbGl6ZWRUeEhleCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VzZXMgc21hbGxlciBtYXJnaW4gd2hlbiBnYXNMaW1pdCBpcyBoYWx2ZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBnYXNNYXJnaW4gPSA1MDBfMDAwICogMjBfMDAwXzAwMF8wMDAgKiAxLjc1IC8gMTBeMTIgPSAxN181MDBcbiAgICAgIC8vIHN3ZWVwQW1vdW50ID0gNTBfMDAwIC0gMTdfNTAwID0gMzJfNTAwXG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCc1MDAwMCcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IChiYXNlY29pbiBhcyBhbnkpLmJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyh7XG4gICAgICAgIGJhY2t1cEtleTogVEVTVF9CQUNLVVBfS0VZLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFRFU1RfV0FMTEVUX0JBU0VfQUREUkVTUyxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgIGdhc0xpbWl0OiA1MDBfMDAwLFxuICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgfSkpIGFzIGFueTtcbiAgICAgIHNob3VsZC5leGlzdChyZXN1bHQudHhSZXF1ZXN0cyk7XG4gICAgfSk7XG5cbiAgICBpdCgndGhyb3dzIHdoZW4gYmFsYW5jZSBleGFjdGx5IGVxdWFscyB0aGUgZ2FzIG1hcmdpbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGdhc01hcmdpbiA9IDFfMDAwXzAwMCAqIDIwXzAwMF8wMDBfMDAwIC8gMTBeMTIgPSAyMF8wMDA7IGJhbGFuY2UgPSAyMF8wMDAg4oaSIHN3ZWVwQW1vdW50ID0gMFxuICAgICAgc3R1YkJhbGFuY2VBbmROb25jZSgnMjAwMDAnKTtcbiAgICAgIGF3YWl0IChiYXNlY29pbiBhcyBhbnkpXG4gICAgICAgIC5idWlsZFVuc2lnbmVkU3dlZXBUeG5UU1Moe1xuICAgICAgICAgIGJhY2t1cEtleTogVEVTVF9CQUNLVVBfS0VZLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgICAgd2FsbGV0Q29udHJhY3RBZGRyZXNzOiBURVNUX1dBTExFVF9CQVNFX0FERFJFU1MsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgICAgZ2FzTGltaXQ6IDFfMDAwXzAwMCxcbiAgICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW5zdWZmaWNpZW50IGJhbGFuY2UvKTtcbiAgICB9KTtcblxuICAgIGl0KCdkb2VzIG5vdCBkZWR1Y3QgbWFyZ2luIHdoZW4gc3dlZXBpbmcgYSBub24tcGF0aFVTRCB0b2tlbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG90aGVyVG9rZW4gPSAnMHgxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJztcbiAgICAgIHN0dWJCYWxhbmNlQW5kTm9uY2UoJzUwMCcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IChiYXNlY29pbiBhcyBhbnkpLmJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyh7XG4gICAgICAgIGJhY2t1cEtleTogVEVTVF9CQUNLVVBfS0VZLFxuICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFRFU1RfV0FMTEVUX0JBU0VfQUREUkVTUyxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IG90aGVyVG9rZW4sXG4gICAgICAgIGdhc0xpbWl0OiAxXzAwMF8wMDAsXG4gICAgICAgIGVpcDE1NTk6IHsgbWF4RmVlUGVyR2FzOiAyMF8wMDBfMDAwXzAwMCwgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IDEwXzAwMF8wMDBfMDAwIH0sXG4gICAgICB9KSkgYXMgYW55O1xuICAgICAgLy8gRnVsbCBiYWxhbmNlIG9mIDUwMCBzd2VwdDsgbm8gbWFyZ2luIGRlZHVjdGVkXG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0LnR4UmVxdWVzdHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgY29ycmVjdCBVbnNpZ25lZFN3ZWVwVHhNUEN2MiBzdHJ1Y3R1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgKGJhc2Vjb2luIGFzIGFueSkuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgYmFja3VwS2V5OiBURVNUX0JBQ0tVUF9LRVksXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogVEVTVF9XQUxMRVRfQkFTRV9BRERSRVNTLFxuICAgICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogUEFUSF9VU0RfQUREUkVTUyxcbiAgICAgICAgZ2FzTGltaXQ6IDFfMDAwXzAwMCxcbiAgICAgICAgZWlwMTU1OTogeyBtYXhGZWVQZXJHYXM6IDIwXzAwMF8wMDBfMDAwLCBtYXhQcmlvcml0eUZlZVBlckdhczogMTBfMDAwXzAwMF8wMDAgfSxcbiAgICAgIH0pKSBhcyBhbnk7XG4gICAgICBjb25zdCB0eCA9IHJlc3VsdC50eFJlcXVlc3RzWzBdLnRyYW5zYWN0aW9uc1swXTtcbiAgICAgIHR4LnVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGguc2hvdWxkLmVxdWFsKCdtLzAnKTtcbiAgICAgIHR4LnVuc2lnbmVkVHguY29pblNwZWNpZmljLmNvbW1vbktleUNoYWluLnNob3VsZC5lcXVhbChURVNUX0JBQ0tVUF9LRVkpO1xuICAgICAgdHguc2lnbmF0dXJlU2hhcmVzLnNob3VsZC5kZWVwRXF1YWwoW10pO1xuICAgICAgdHgubm9uY2Uuc2hvdWxkLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhaWxzIGNsb3NlZCB3aXRoIFJlY292ZXJ5S2V5TWlzbWF0Y2hFcnJvciB3aGVuIHRoZSBrZXljaGFpbiBpcyBmb3IgYW5vdGhlciB3YWxsZXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzdHViQmFsYW5jZUFuZE5vbmNlKCcxMDAwMDAwJyk7XG4gICAgICBhd2FpdCAoYmFzZWNvaW4gYXMgYW55KVxuICAgICAgICAuYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTKHtcbiAgICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgICByZWNvdmVyeURlc3RpbmF0aW9uOiBURVNUX1JFQ09WRVJZX0RFU1RJTkFUSU9OLFxuICAgICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogJzB4ZTc0MDQxMmFiNjVlZmRiZGJlMmE1ZTRjNmUwMWQ3YmJjNTRhMzhhOScsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IFBBVEhfVVNEX0FERFJFU1MsXG4gICAgICAgICAgZ2FzTGltaXQ6IDFfMDAwXzAwMCxcbiAgICAgICAgICBlaXAxNTU5OiB7IG1heEZlZVBlckdhczogMjBfMDAwXzAwMF8wMDAsIG1heFByaW9yaXR5RmVlUGVyR2FzOiAxMF8wMDBfMDAwXzAwMCB9LFxuICAgICAgICB9KVxuICAgICAgICAuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChSZWNvdmVyeUtleU1pc21hdGNoRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlamVjdHMgYSBzd2VlcCB3aXRoIG5vIGtleSBtYXRlcmlhbCByYXRoZXIgdGhhbiBkZXJpdmluZyBmcm9tIGFuIGVtcHR5IGtleWNoYWluJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgKGJhc2Vjb2luIGFzIGFueSlcbiAgICAgICAgLmJ1aWxkVW5zaWduZWRTd2VlcFR4blRTUyh7XG4gICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogVEVTVF9SRUNPVkVSWV9ERVNUSU5BVElPTixcbiAgICAgICAgICB3YWxsZXRDb250cmFjdEFkZHJlc3M6IFRFU1RfV0FMTEVUX0JBU0VfQUREUkVTUyxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ21pc3NpbmcgY29tbW9uS2V5Q2hhaW4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlY292ZXJUU1Mg4oCUIHVuc2lnbmVkIHN3ZWVwIGRpc3BhdGNoJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdyb3V0ZXMgdG8gYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTIHdoZW4ga2V5cyBhcmUgcGxhaW4gcHVibGljIGtleXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZFN0dWIgPSBzYW5kYm94LnN0dWIoYmFzZWNvaW4gYXMgYW55LCAnYnVpbGRVbnNpZ25lZFN3ZWVwVHhuVFNTJykucmVzb2x2ZXMoeyB0eFJlcXVlc3RzOiBbXSB9KTtcbiAgICAgIHNhbmRib3guc3R1YihiYXNlY29pbiBhcyBhbnksICd2YWxpZGF0ZVJlY292ZXJ5UGFyYW1zJykucmV0dXJucyh1bmRlZmluZWQpO1xuXG4gICAgICBhd2FpdCAoYmFzZWNvaW4gYXMgYW55KS5yZWNvdmVyVFNTKHtcbiAgICAgICAgdXNlcktleTogVEVTVF9CQUNLVVBfS0VZLFxuICAgICAgICBiYWNrdXBLZXk6IFRFU1RfQkFDS1VQX0tFWSxcbiAgICAgICAgaXNUc3M6IHRydWUsXG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IFRFU1RfUkVDT1ZFUllfREVTVElOQVRJT04sXG4gICAgICAgIHdhbGxldENvbnRyYWN0QWRkcmVzczogVEVTVF9XQUxMRVRfQkFTRV9BRERSRVNTLFxuICAgICAgfSk7XG5cbiAgICAgIGJ1aWxkU3R1Yi5jYWxsZWRPbmNlLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==