@bitgo/abstract-cosmos 11.2.4 → 11.2.6

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.
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
37
  };
@@ -800,4 +810,4 @@ class CosmosUtils {
800
810
  exports.CosmosUtils = CosmosUtils;
801
811
  const utils = new CosmosUtils();
802
812
  exports.default = utils;
803
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBTXlCO0FBQ3pCLHlDQUFnRjtBQUNoRiwrQ0FBb0Y7QUFDcEYseURBUytCO0FBQy9CLCtDQUE4RDtBQUM5RCxnRUFBcUM7QUFDckMsMERBQW1FO0FBRW5FLHlEQUFzRTtBQUN0RSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsS0FBSyxDQUFDO0FBRWpFLG1DQUEwQztBQUMxQyx1REFBeUM7QUFXekMsdUNBQXFEO0FBRXJELE1BQWEsV0FBVztJQUd0QjtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSx3QkFBUSxDQUFDLENBQUMsR0FBRywrQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHlCQUF5QixFQUFFLHVCQUFrQixDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixjQUFjLENBQUMsSUFBWTtRQUN6QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLElBQUk7WUFDRixJQUFJLHVCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztTQUNiO1FBQUMsTUFBTTtZQUNOLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsSUFB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dGlscyxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZW5jb2RlU2VjcDI1NmsxUHVia2V5LCBlbmNvZGVTZWNwMjU2azFTaWduYXR1cmUgfSBmcm9tICdAY29zbWpzL2FtaW5vJztcbmltcG9ydCB7IGZyb21CYXNlNjQsIGZyb21CZWNoMzIsIGZyb21IZXgsIHRvSGV4LCB0b0JlY2gzMiB9IGZyb20gJ0Bjb3NtanMvZW5jb2RpbmcnO1xuaW1wb3J0IHtcbiAgRGVjb2RlZFR4UmF3LFxuICBFbmNvZGVPYmplY3QsXG4gIFJlZ2lzdHJ5LFxuICBkZWNvZGVQdWJrZXksXG4gIGRlY29kZVR4UmF3LFxuICBlbmNvZGVQdWJrZXksXG4gIG1ha2VBdXRoSW5mb0J5dGVzLFxuICBtYWtlU2lnbkRvYyxcbn0gZnJvbSAnQGNvc21qcy9wcm90by1zaWduaW5nJztcbmltcG9ydCB7IENvaW4sIGRlZmF1bHRSZWdpc3RyeVR5cGVzIH0gZnJvbSAnQGNvc21qcy9zdGFyZ2F0ZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBTaWduRG9jLCBUeFJhdyB9IGZyb20gJ2Nvc21qcy10eXBlcy9jb3Ntb3MvdHgvdjFiZXRhMS90eCc7XG5pbXBvcnQgeyBBbnkgfSBmcm9tICdjb3NtanMtdHlwZXMvZ29vZ2xlL3Byb3RvYnVmL2FueSc7XG5pbXBvcnQgeyBNc2dFeGVjdXRlQ29udHJhY3QgfSBmcm9tICdjb3NtanMtdHlwZXMvY29zbXdhc20vd2FzbS92MS90eCc7XG5jb25zdCB7IE1zZ1NlbmQgfSA9IHJlcXVpcmUoJy4uLy4uL3Jlc291cmNlcy9Nc2dDb21waWxlZCcpLnR5cGVzO1xuXG5pbXBvcnQgeyBIYXNoLCBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24sXG4gIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSxcbiAgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSxcbiAgRmVlRGF0YSxcbiAgTWVzc2FnZURhdGEsXG4gIFJlZGVsZWdhdGVNZXNzYWdlLFxuICBTZW5kTWVzc2FnZSxcbiAgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBDb3Ntb3NLZXlQYWlyIGFzIEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuXG5leHBvcnQgY2xhc3MgQ29zbW9zVXRpbHMgaW1wbGVtZW50cyBCYXNlVXRpbHMge1xuICBwcm90ZWN0ZWQgcmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeShbLi4uZGVmYXVsdFJlZ2lzdHJ5VHlwZXNdKTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKGNvbnN0YW50cy5leGVjdXRlQ29udHJhY3RNc2dUeXBlVXJsLCBNc2dFeGVjdXRlQ29udHJhY3QpO1xuICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXIoJy90eXBlcy5Nc2dTZW5kJywgTXNnU2VuZCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVCbGFrZTJiKGhhc2gpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQcml2YXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgS2V5UGFpcih7IHB1Yjoga2V5IH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFNpZ25hdHVyZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUJsYWtlMmIodHhJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRyYW5zYWN0aW9uIGhhc2ggaXMgaW4gdmFsaWQgYmxhY2syYiBmb3JtYXRcbiAgICovXG4gIHZhbGlkYXRlQmxha2UyYihoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoaGFzaD8ubGVuZ3RoICE9PSA2NCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaC5tYXRjaCgvXlthLXpBLVowLTldKyQvKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbW91bnRzIGFyZSBpbiByYW5nZVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcltdfSBhbW91bnRzIC0gdGhlIGFtb3VudHMgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQW1vdW50cyhhbW91bnRzOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgYW1vdW50IG9mIGFtb3VudHMpIHtcbiAgICAgIGlmICghdGhpcy5pc1ZhbGlkQW1vdW50KGFtb3VudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbW91bnQgaXMgaW4gcmFuZ2VcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFtb3VudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQW1vdW50KGFtb3VudDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICAgIGlmICghYmlnTnVtYmVyQW1vdW50LmlzSW50ZWdlcigpIHx8IGJpZ051bWJlckFtb3VudC5pc0xlc3NUaGFuT3JFcXVhbFRvKDApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgcmF3IHR4IGRhdGEgaW50byBtZXNzYWdlcywgc2lnbmluZyBpbmZvLCBhbmQgZmVlIGRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR4SGV4IC0gcmF3IGJhc2U2NCB0eFxuICAgKiBAcmV0dXJucyB7RGVjb2RlZFR4UmF3fSBEZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqL1xuICBnZXREZWNvZGVkVHhGcm9tUmF3QmFzZTY0KHR4UmF3OiBzdHJpbmcpOiBEZWNvZGVkVHhSYXcge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZGVjb2RlVHhSYXcoZnJvbUJhc2U2NCh0eFJhdykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0Vycm9yIGRlY29kaW5nIFR4UmF3IGJhc2U2NCBlbmNvZGVkIHN0cmluZzogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIG1lc3NhZ2VzIGluIHRoZSBib2R5IG9mIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge0VuY29kZU9iamVjdFtdfSBtZXNzYWdlcyBhbG9uZyB3aXRoIHR5cGUgdXJsXG4gICAqL1xuICBwcml2YXRlIGdldEVuY29kZWRNZXNzYWdlc0Zyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBFbmNvZGVPYmplY3RbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGUgdHhuIHNlcXVlbmNlIGlzIHZhbGlkIG9yIG5vdFxuICAgKiBAcGFyYW0ge251bWJlcn0gc2VxdWVuY2VcbiAgICovXG4gIHZhbGlkYXRlU2VxdWVuY2Uoc2VxdWVuY2U6IG51bWJlcikge1xuICAgIGlmIChzZXF1ZW5jZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBzZXF1ZW5jZTogbGVzcyB0aGFuIHplcm8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVsbHMgdGhlIHNlcXVlbmNlIG51bWJlciBmcm9tIGEgRGVjb2RlZFR4UmF3IEF1dGhJbmZvIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge251bWJlcn0gc2VxdWVuY2VcbiAgICovXG4gIGdldFNlcXVlbmNlRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IG51bWJlciB7XG4gICAgcmV0dXJuIE51bWJlcihkZWNvZGVkVHguYXV0aEluZm8uc2lnbmVySW5mb3NbMF0uc2VxdWVuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIHRoZSB0eXBlVXJsIGZyb20gdGhlIGVuY29kZWQgbWVzc2FnZSBvZiBhIERlY29kZWRUeFJhd1xuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IGNvc21vcyBwcm90byB0eXBlIHVybFxuICAgKi9cbiAgZ2V0VHlwZVVybEZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVuY29kZWRNZXNzYWdlID0gdGhpcy5nZXRFbmNvZGVkTWVzc2FnZXNGcm9tRGVjb2RlZFR4KGRlY29kZWRUeClbMF07XG4gICAgcmV0dXJuIGVuY29kZWRNZXNzYWdlLnR5cGVVcmw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZmVlIGRhdGEgZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtGZWVEYXRhfSBmZWUgZGF0YVxuICAgKi9cbiAgZ2V0R2FzQnVkZ2V0RnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IEZlZURhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBhbW91bnQ6IGRlY29kZWRUeC5hdXRoSW5mby5mZWU/LmFtb3VudCBhcyBDb2luW10sXG4gICAgICBnYXNMaW1pdDogTnVtYmVyKGRlY29kZWRUeC5hdXRoSW5mby5mZWU/Lmdhc0xpbWl0KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHB1YmxpY0tleSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gcHVibGljS2V5IGluIGhleCBmb3JtYXQgaWYgaXQgZXhpc3RzLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBnZXRQdWJsaWNLZXlGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwdWJsaWNLZXlVSW50OEFycmF5ID0gZGVjb2RlZFR4LmF1dGhJbmZvLnNpZ25lckluZm9zPy5bMF0ucHVibGljS2V5Py52YWx1ZTtcbiAgICBpZiAocHVibGljS2V5VUludDhBcnJheSkge1xuICAgICAgcmV0dXJuIHRvSGV4KGZyb21CYXNlNjQoZGVjb2RlUHVia2V5KGRlY29kZWRUeC5hdXRoSW5mby5zaWduZXJJbmZvcz8uWzBdLnB1YmxpY0tleSk/LnZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IFNlbmQgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0U2VuZE1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhW10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGZyb21BZGRyZXNzOiB2YWx1ZS5mcm9tQWRkcmVzcyxcbiAgICAgICAgICB0b0FkZHJlc3M6IHZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gRGVsZWdhdGUgb2YgdW5kZWxlZ2F0ZSB0cmFuc2FjdGlvbiBtZXNzYWdlIGRhdGFcbiAgICovXG4gIGdldERlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdmFsdWUuYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBSZWRlbGVnYXRlIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0UmVkZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhW10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yU3JjQWRkcmVzczogdmFsdWUudmFsaWRhdG9yU3JjQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JEc3RBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JEc3RBZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdmFsdWUuYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHMgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBnZXRXaXRoZHJhd1Jld2FyZHNNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YVtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBkZWxlZ2F0b3JBZGRyZXNzOiB2YWx1ZS5kZWxlZ2F0b3JBZGRyZXNzLFxuICAgICAgICAgIHZhbGlkYXRvckFkZHJlc3M6IHZhbHVlLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IERlbGVnYXRlIG9mIHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBnZXRXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YVtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBkZWxlZ2F0b3JBZGRyZXNzOiB2YWx1ZS5kZWxlZ2F0b3JBZGRyZXNzLFxuICAgICAgICAgIHZhbGlkYXRvckFkZHJlc3M6IHZhbHVlLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgY29zbW9zIGNoYWluIGFkZHJlc3MgZnJvbSBpdHMgZXF1aXZhbGVudCBoZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc0hleFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0Q29zbW9zTGlrZUFkZHJlc3NGcm9tSGV4KHByZWZpeDogc3RyaW5nLCBhZGRyZXNzSGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChhZGRyZXNzSGV4LmluZGV4T2YoJzB4JykgPT09IDApIHtcbiAgICAgIGFkZHJlc3NIZXggPSBhZGRyZXNzSGV4LnNsaWNlKDIpO1xuICAgIH1cbiAgICByZXR1cm4gdG9CZWNoMzIocHJlZml4LCBmcm9tSGV4KGFkZHJlc3NIZXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBFVk0gY2hhaW4gYWRkcmVzcyBmcm9tIGl0cyBlcXVpdmFsZW50IGhleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzSGV4XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRFdm1MaWtlQWRkcmVzc0Zyb21Db3Ntb3MoY29zbW9zTGlrZUFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcweCcgKyB0b0hleChmcm9tQmVjaDMyKGNvc21vc0xpa2VBZGRyZXNzKS5kYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gRXhlY3V0ZSBjb250cmFjdCB0cmFuc2FjdGlvbiBtZXNzYWdlIGRhdGFcbiAgICovXG4gIGdldEV4ZWN1dGVDb250cmFjdE1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhW10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHNlbmRlcjogdmFsdWUuc2VuZGVyLFxuICAgICAgICAgIGNvbnRyYWN0OiB2YWx1ZS5jb250cmFjdCxcbiAgICAgICAgICBtc2c6IHZhbHVlLm1zZyxcbiAgICAgICAgICBmdW5kczogdmFsdWUuZnVuZHMsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBiaXRnbyB0cmFuc2FjdGlvbiB0eXBlIGJhc2VkIG9uIGNvc21vcyBwcm90byB0eXBlIHVybFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVVybFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25UeXBlIHwgdW5kZWZpbmVkfSBUcmFuc2FjdGlvblR5cGUgaWYgdXJsIGlzIHN1cHBvcnRlZCBlbHNlIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwodHlwZVVybDogc3RyaW5nKTogVHJhbnNhY3Rpb25UeXBlIHwgdW5kZWZpbmVkIHtcbiAgICBzd2l0Y2ggKHR5cGVVcmwpIHtcbiAgICAgIGNhc2UgY29uc3RhbnRzLnNlbmRNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICBjYXNlIGNvbnN0YW50cy5zZW5kTXNnVHlwZTpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgICAgY2FzZSBjb25zdGFudHMuZGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLnVuZGVsZWdhdGVNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlO1xuICAgICAgY2FzZSBjb25zdGFudHMud2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdztcbiAgICAgIGNhc2UgY29uc3RhbnRzLmV4ZWN1dGVDb250cmFjdE1zZ1R5cGVVcmw6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgICAgY2FzZSBjb25zdGFudHMucmVkZWxlZ2F0ZVR5cGVVcmw6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1JlZGVsZWdhdGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIGhleCBlbmNvZGVkIHB1YmtleSwgY29udmVydHMgaXQgdG8gdGhlIEFtaW5vIEpTT04gcmVwcmVzZW50YXRpb24gKHR5cGUvdmFsdWUgd3JhcHBlcilcbiAgICogYW5kIHJldHVybnMgaXQgYXMgcHJvdG9idWYgYEFueWBcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YmtleSBoZXggZW5jb2RlZCBjb21wcmVzc2VkIHNlY3AyNTZrMSBwdWJsaWMga2V5XG4gICAqIEByZXR1cm5zIHtBbnl9IHB1YmtleSBlbmNvZGVkIGFzIHByb3RvYnVmIGBBbnlgXG4gICAqL1xuICBnZXRFbmNvZGVkUHVia2V5KHB1YmtleTogc3RyaW5nKTogQW55IHtcbiAgICByZXR1cm4gZW5jb2RlUHVia2V5KGVuY29kZVNlY3AyNTZrMVB1YmtleShmcm9tSGV4KHB1YmtleSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHhSYXcgZnJvbSBhbiBjb3Ntb3MgbGlrZSB0cmFuc2FjdGlvbiBAc2VlIENvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKiBAUHJlY29uZGl0aW9uIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5wdWJsaWNLZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqIEBwYXJhbSB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSBjb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1R4UmF3fSBVbnNpZ25lZCByYXcgdHJhbnNhY3Rpb25cbiAgICovXG4gIGNyZWF0ZVR4UmF3RnJvbUNvc21vc0xpa2VUcmFuc2FjdGlvbihjb3Ntb3NMaWtlVHJhbnNhY3Rpb246IENvc21vc0xpa2VUcmFuc2FjdGlvbik6IFR4UmF3IHtcbiAgICBpZiAoIWNvc21vc0xpa2VUcmFuc2FjdGlvbi5wdWJsaWNLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncHVibGljS2V5IGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHR4UmF3Jyk7XG4gICAgfVxuICAgIGNvbnN0IGVuY29kZWRQdWJsaWNLZXk6IEFueSA9IHRoaXMuZ2V0RW5jb2RlZFB1YmtleShjb3Ntb3NMaWtlVHJhbnNhY3Rpb24ucHVibGljS2V5KTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IGNvc21vc0xpa2VUcmFuc2FjdGlvbi5zZW5kTWVzc2FnZXMgYXMgdW5rbm93biBhcyBBbnlbXTtcbiAgICBsZXQgdHhCb2R5VmFsdWU7XG4gICAgaWYgKGNvc21vc0xpa2VUcmFuc2FjdGlvbi5tZW1vKSB7XG4gICAgICB0eEJvZHlWYWx1ZSA9IHtcbiAgICAgICAgbWVtbzogY29zbW9zTGlrZVRyYW5zYWN0aW9uLm1lbW8sXG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4Qm9keVZhbHVlID0ge1xuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHR4Qm9keUJ5dGVzID0gdGhpcy5yZWdpc3RyeS5lbmNvZGVUeEJvZHkodHhCb2R5VmFsdWUpO1xuICAgIGNvbnN0IHNlcXVlbmNlID0gY29zbW9zTGlrZVRyYW5zYWN0aW9uLnNlcXVlbmNlO1xuICAgIGNvbnN0IGF1dGhJbmZvQnl0ZXMgPSBtYWtlQXV0aEluZm9CeXRlcyhcbiAgICAgIFt7IHB1YmtleTogZW5jb2RlZFB1YmxpY0tleSwgc2VxdWVuY2UgfV0sXG4gICAgICBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uZ2FzQnVkZ2V0LmFtb3VudCxcbiAgICAgIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5nYXNCdWRnZXQuZ2FzTGltaXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuICAgIHJldHVybiBUeFJhdy5mcm9tUGFydGlhbCh7XG4gICAgICBib2R5Qnl0ZXM6IHR4Qm9keUJ5dGVzLFxuICAgICAgYXV0aEluZm9CeXRlczogYXV0aEluZm9CeXRlcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIGEgc2lnbmF0dXJlIGludG8gYSB0eFJhd1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcHVibGljS2V5SGV4IHB1YmxpY0tleSBpbiBoZXggZW5jb2RlZCBzdHJpbmcgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmVIZXggc2lnbmF0dXJlIGluIGhleCBlbmNvZGVkIHN0cmluZyBmb3JtYXRcbiAgICogQHBhcmFtIHtUeFJhd30gdW5zaWduZWRUeCByYXcgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1R4UmF3fSBTaWduZWQgcmF3IHRyYW5zYWN0aW9uXG4gICAqL1xuICBjcmVhdGVTaWduZWRUeFJhdyhcbiAgICBwdWJsaWNLZXlIZXg6IHN0cmluZyxcbiAgICBzaWduYXR1cmVIZXg6IHN0cmluZyxcbiAgICB1bnNpZ25lZFR4OiB7IGJvZHlCeXRlczogVWludDhBcnJheTsgYXV0aEluZm9CeXRlczogVWludDhBcnJheSB9XG4gICk6IFR4UmF3IHtcbiAgICBjb25zdCBzdGRTaWduYXR1cmUgPSBlbmNvZGVTZWNwMjU2azFTaWduYXR1cmUoZnJvbUhleChwdWJsaWNLZXlIZXgpLCBmcm9tSGV4KHNpZ25hdHVyZUhleCkpO1xuICAgIHJldHVybiBUeFJhdy5mcm9tUGFydGlhbCh7XG4gICAgICBib2R5Qnl0ZXM6IHVuc2lnbmVkVHguYm9keUJ5dGVzLFxuICAgICAgYXV0aEluZm9CeXRlczogdW5zaWduZWRUeC5hdXRoSW5mb0J5dGVzLFxuICAgICAgc2lnbmF0dXJlczogW2Zyb21CYXNlNjQoc3RkU2lnbmF0dXJlLnNpZ25hdHVyZSldLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSByYXcgdHJhbnNhY3Rpb24gaW50byBhIERlY29kZWRUeFJhdyBhbmQgY2hlY2tzIGlmIGl0IGhhcyBub24gZW1wdHkgc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3VHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdHJhbnNhY3Rpb24gaXMgc2lnbmVkIGVsc2UgZmFsc2VcbiAgICovXG4gIGlzU2lnbmVkUmF3VHgocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlY29kZWRUeCA9IHRoaXMuZ2V0RGVjb2RlZFR4RnJvbVJhd0Jhc2U2NChyYXdUcmFuc2FjdGlvbik7XG4gICAgaWYgKGRlY29kZWRUeC5zaWduYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgcHJvdG9jb2wgcHVibGljIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gcHVibGljS2V5IC0gdGhlICBwdWJsaWMga2V5IHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgdmFsaWRhdGVQdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAocHVibGljS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBLZXlQYWlyKHsgcHViOiBwdWJsaWNLZXkgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIFB1YmxpYyBLZXlgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNpZ24gZG9jIGZyb20gYW4gY29zbW9zIGxpa2UgdHJhbnNhY3Rpb24gQHNlZSBDb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICogQFByZWNvbmRpdGlvbiBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uYWNjb3VudE51bWJlciBhbmQgY29zbW9zTGlrZVRyYW5zYWN0aW9uLmNoYWluSWQgbXVzdCBiZSBkZWZpbmVkXG4gICAqIEBwYXJhbSB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSBjb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge1NpZ25Eb2N9IHNpZ24gZG9jXG4gICAqL1xuICBjcmVhdGVTaWduRG9jKFxuICAgIGNvc21vc0xpa2VUcmFuc2FjdGlvbjogQ29zbW9zTGlrZVRyYW5zYWN0aW9uLFxuICAgIGFjY291bnROdW1iZXI6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBjaGFpbklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogU2lnbkRvYyB7XG4gICAgaWYgKCFhY2NvdW50TnVtYmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FjY291bnROdW1iZXIgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgc2lnbiBkb2MnKTtcbiAgICB9XG4gICAgaWYgKCFjaGFpbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NoYWluSWQgaXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgc2lnbiBkb2MnKTtcbiAgICB9XG4gICAgaWYgKCFjb3Ntb3NMaWtlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29zbW9zTGlrZVRyYW5zYWN0aW9uIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHNpZ24gZG9jJyk7XG4gICAgfVxuICAgIGNvbnN0IHR4UmF3ID0gdGhpcy5jcmVhdGVUeFJhd0Zyb21Db3Ntb3NMaWtlVHJhbnNhY3Rpb24oY29zbW9zTGlrZVRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gbWFrZVNpZ25Eb2ModHhSYXcuYm9keUJ5dGVzLCB0eFJhdy5hdXRoSW5mb0J5dGVzLCBjaGFpbklkLCBhY2NvdW50TnVtYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBoZXhcbiAgICogQHBhcmFtIGhleFN0cmluZyAtIGhleCBzdHJpbmcgZm9ybWF0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHN0cmluZyBpcyBoZXggZWxzZSBmYWxzZVxuICAgKi9cbiAgaXNWYWxpZEhleFN0cmluZyhoZXhTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvXlswLTlBLUZhLWZdKiQvLnRlc3QoaGV4U3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2VcbiAgICogQHBhcmFtIHtXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlfSB3aXRoZHJhd1Jld2FyZHNNZXNzYWdlIC0gVGhlIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHZhbGlkYXRvckFkZHJlc3Mgb3IgZGVsZWdhdG9yQWRkcmVzcyBpcyBpbnZhbGlkIG9yIG1pc3NpbmcuXG4gICAqL1xuICB2YWxpZGF0ZVdpdGhkcmF3UmV3YXJkc01lc3NhZ2Uod2l0aGRyYXdSZXdhcmRzTWVzc2FnZTogV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSkge1xuICAgIGlmIChcbiAgICAgICF3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3MgfHxcbiAgICAgICF0aGlzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UudmFsaWRhdG9yQWRkcmVzcylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSB2YWxpZGF0b3JBZGRyZXNzOiBgICsgd2l0aGRyYXdSZXdhcmRzTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXdpdGhkcmF3UmV3YXJkc01lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyh3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UgZGVsZWdhdG9yQWRkcmVzczogYCArIHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0IGFyZSBtaXNzaW5nIG9yIG51bGwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSBUaGUgb2JqZWN0IHRvIGNoZWNrLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBrZXlzIC0gQW4gYXJyYXkgb2YgcHJvcGVydHkga2V5cyB0byBjaGVjay5cbiAgICogQHRocm93cyB7RXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiBhbnkgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzIGFyZSBtaXNzaW5nIG9yIG51bGwuXG4gICAqL1xuICBpc09ialByb3BlcnR5TnVsbChvYmo6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGtleXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAob2JqW2tleV0gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgbnVsbCB2YWx1ZSBmb3IgcHJvcGVydHkgJHtrZXl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlXG4gICAqIEBwYXJhbSB7RGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlfSBkZWxlZ2F0ZU1lc3NhZ2UgLSBUaGUgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB2YWxpZGF0b3JBZGRyZXNzLCBkZWxlZ2F0b3JBZGRyZXNzLCBvciBhbW91bnQgaXMgaW52YWxpZCBvciBtaXNzaW5nLlxuICAgKi9cbiAgdmFsaWRhdGVEZWxlZ2F0ZU9yVW5kZWxlZ2F0ZU1lc3NhZ2UoZGVsZWdhdGVNZXNzYWdlOiBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UpIHtcbiAgICB0aGlzLmlzT2JqUHJvcGVydHlOdWxsKGRlbGVnYXRlTWVzc2FnZSwgWyd2YWxpZGF0b3JBZGRyZXNzJywgJ2RlbGVnYXRvckFkZHJlc3MnXSk7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MoZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSB2YWxpZGF0b3JBZGRyZXNzOiBgICsgZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhkZWxlZ2F0ZU1lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlIGRlbGVnYXRvckFkZHJlc3M6IGAgKyBkZWxlZ2F0ZU1lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudChkZWxlZ2F0ZU1lc3NhZ2UuYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIFJlZGVsZWdhdGVNZXNzYWdlXG4gICAqIEBwYXJhbSB7RGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlfSByZWRlbGVnYXRlTWVzc2FnZSAtIFRoZSBSZWRlbGVnYXRlTWVzc2FnZSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgdmFsaWRhdG9yU3JjQWRkcmVzcywgdmFsaWRhdG9yRHN0QWRkcmVzcywgZGVsZWdhdG9yQWRkcmVzcywgb3IgYW1vdW50IGlzIGludmFsaWQgb3IgbWlzc2luZy5cbiAgICovXG4gIHZhbGlkYXRlUmVkZWxlZ2F0ZU1lc3NhZ2UocmVkZWxlZ2F0ZU1lc3NhZ2U6IFJlZGVsZWdhdGVNZXNzYWdlKSB7XG4gICAgdGhpcy5pc09ialByb3BlcnR5TnVsbChyZWRlbGVnYXRlTWVzc2FnZSwgWyd2YWxpZGF0b3JTcmNBZGRyZXNzJywgJ3ZhbGlkYXRvckRzdEFkZHJlc3MnLCAnZGVsZWdhdG9yQWRkcmVzcyddKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhyZWRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JTcmNBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBSZWRlbGVnYXRlTWVzc2FnZSB2YWxpZGF0b3JTcmNBZGRyZXNzOiBgICsgcmVkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yU3JjQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKHJlZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvckRzdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFJlZGVsZWdhdGVNZXNzYWdlIHZhbGlkYXRvckRzdEFkZHJlc3M6IGAgKyByZWRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JEc3RBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MocmVkZWxlZ2F0ZU1lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlIGRlbGVnYXRvckFkZHJlc3M6IGAgKyByZWRlbGVnYXRlTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlQW1vdW50KHJlZGVsZWdhdGVNZXNzYWdlLmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBNZXNzYWdlRGF0YVxuICAgKiBAcGFyYW0ge01lc3NhZ2VEYXRhfSBtZXNzYWdlRGF0YSAtIFRoZSBNZXNzYWdlRGF0YSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgbWVzc2FnZURhdGEgaXMgaW52YWxpZCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy5cbiAgICovXG4gIHZhbGlkYXRlTWVzc2FnZURhdGEobWVzc2FnZURhdGE6IE1lc3NhZ2VEYXRhKTogdm9pZCB7XG4gICAgaWYgKG1lc3NhZ2VEYXRhID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBNZXNzYWdlRGF0YTogdW5kZWZpbmVkYCk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlRGF0YS50eXBlVXJsID09IG51bGwgfHwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybChtZXNzYWdlRGF0YS50eXBlVXJsKSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgTWVzc2FnZURhdGEgdHlwZXVybDogYCArIG1lc3NhZ2VEYXRhLnR5cGVVcmwpO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZUZyb21UeXBlVXJsKG1lc3NhZ2VEYXRhLnR5cGVVcmwpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIFNlbmRNZXNzYWdlO1xuICAgICAgICB0aGlzLnZhbGlkYXRlU2VuZE1lc3NhZ2UodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlO1xuICAgICAgICB0aGlzLnZhbGlkYXRlRGVsZWdhdGVPclVuZGVsZWdhdGVNZXNzYWdlKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXNzYWdlRGF0YS52YWx1ZSBhcyBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlO1xuICAgICAgICB0aGlzLnZhbGlkYXRlV2l0aGRyYXdSZXdhcmRzTWVzc2FnZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZUV4ZWN1dGVDb250cmFjdE1lc3NhZ2UodmFsdWUsIFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdSZWRlbGVnYXRlOiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgUmVkZWxlZ2F0ZU1lc3NhZ2U7XG4gICAgICAgIHRoaXMudmFsaWRhdGVSZWRlbGVnYXRlTWVzc2FnZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIE1lc3NhZ2VEYXRhIFR5cGVVcmwgaXMgbm90IHN1cHBvcnRlZDogYCArIG1lc3NhZ2VEYXRhLnR5cGVVcmwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIENvc21vcy1saWtlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gdHggLSBUaGUgdHJhbnNhY3Rpb24gdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHRyYW5zYWN0aW9uIGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuXG4gICAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHR4OiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlU2VxdWVuY2UodHguc2VxdWVuY2UpO1xuICAgIHRoaXMudmFsaWRhdGVHYXNCdWRnZXQodHguZ2FzQnVkZ2V0KTtcbiAgICB0aGlzLnZhbGlkYXRlUHVibGljS2V5KHR4LnB1YmxpY0tleSk7XG4gICAgaWYgKHR4LnNlbmRNZXNzYWdlcyA9PT0gdW5kZWZpbmVkIHx8IHR4LnNlbmRNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWVzc2FnZXMgaXMgcmVxdWlyZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHguc2VuZE1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHRoaXMudmFsaWRhdGVNZXNzYWdlRGF0YShtZXNzYWdlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlIC0gVGhlIHNlbmRlciBhZGRyZXNzIHNlcXVlbmNlIG51bWJlciBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge01lc3NhZ2VEYXRhW119IG1lc3NhZ2VzIC0gVGhlIGFycmF5IG9mIG1lc3NhZ2UgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0ZlZURhdGF9IGdhc0J1ZGdldCAtIFRoZSBmZWUgZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3B1YmxpY0tleV0gLSBUaGUgcHVibGljIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbmRlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZW1vXSAtIFRoZSBtZW1vIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IFJldHVybnMgdGhlIGNyZWF0ZWQgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24uXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNyZWF0ZWQgdHJhbnNhY3Rpb24gaXMgaW52YWxpZC5cbiAgICovXG4gIGNyZWF0ZVRyYW5zYWN0aW9uKFxuICAgIHNlcXVlbmNlOiBudW1iZXIsXG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VEYXRhW10sXG4gICAgZ2FzQnVkZ2V0OiBGZWVEYXRhLFxuICAgIHB1YmxpY0tleT86IHN0cmluZyxcbiAgICBtZW1vPzogc3RyaW5nXG4gICk6IENvc21vc0xpa2VUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgY29zbW9zTGlrZVR4biA9IHtcbiAgICAgIHNlcXVlbmNlOiBzZXF1ZW5jZSxcbiAgICAgIHNlbmRNZXNzYWdlczogbWVzc2FnZXMsXG4gICAgICBnYXNCdWRnZXQ6IGdhc0J1ZGdldCxcbiAgICAgIHB1YmxpY0tleTogcHVibGljS2V5LFxuICAgICAgbWVtbzogbWVtbyxcbiAgICB9O1xuICAgIHRoaXMudmFsaWRhdGVUcmFuc2FjdGlvbihjb3Ntb3NMaWtlVHhuKTtcbiAgICByZXR1cm4gY29zbW9zTGlrZVR4bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24gd2l0aCBhIGhhc2guXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZXF1ZW5jZSAtIFRoZSBzZW5kZXIgYWRkcmVzcyBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtNZXNzYWdlRGF0YVtdfSBtZXNzYWdlcyAtIFRoZSBhcnJheSBvZiBtZXNzYWdlIGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtGZWVEYXRhfSBnYXNCdWRnZXQgLSBUaGUgZmVlIGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwdWJsaWNLZXldIC0gVGhlIHB1YmxpYyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtzaWduYXR1cmVdIC0gVGhlIHNpZ25hdHVyZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lbW9dIC0gVGhlIG1lbW8gZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHJldHVybnMge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gUmV0dXJucyB0aGUgY3JlYXRlZCBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBoYXNoIGFuZCBzaWduYXR1cmUgaWYgcHJvdmlkZWQuXG4gICAqL1xuICBjcmVhdGVUcmFuc2FjdGlvbldpdGhIYXNoKFxuICAgIHNlcXVlbmNlOiBudW1iZXIsXG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VEYXRhW10sXG4gICAgZ2FzQnVkZ2V0OiBGZWVEYXRhLFxuICAgIHB1YmxpY0tleT86IHN0cmluZyxcbiAgICBzaWduYXR1cmU/OiBCdWZmZXIsXG4gICAgbWVtbz86IHN0cmluZ1xuICApOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGNvc21vc0xpa2VUeG4gPSB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uKHNlcXVlbmNlLCBtZXNzYWdlcywgZ2FzQnVkZ2V0LCBwdWJsaWNLZXksIG1lbW8pO1xuICAgIGxldCBoYXNoID0gY29uc3RhbnRzLlVOQVZBSUxBQkxFX1RFWFQ7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gdGhpcy5jcmVhdGVUeFJhd0Zyb21Db3Ntb3NMaWtlVHJhbnNhY3Rpb24oY29zbW9zTGlrZVR4bik7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IFR4UmF3LmZyb21QYXJ0aWFsKHtcbiAgICAgICAgYm9keUJ5dGVzOiB1bnNpZ25lZFR4LmJvZHlCeXRlcyxcbiAgICAgICAgYXV0aEluZm9CeXRlczogdW5zaWduZWRUeC5hdXRoSW5mb0J5dGVzLFxuICAgICAgICBzaWduYXR1cmVzOiBbc2lnbmF0dXJlXSxcbiAgICAgIH0pO1xuICAgICAgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAgIC51cGRhdGUoVHhSYXcuZW5jb2RlKHNpZ25lZFR4KS5maW5pc2goKSlcbiAgICAgICAgLmRpZ2VzdCgpXG4gICAgICAgIC50b1N0cmluZygnaGV4JylcbiAgICAgICAgLnRvTG9jYWxlVXBwZXJDYXNlKCdlbi1VUycpO1xuICAgICAgcmV0dXJuIHsgLi4uY29zbW9zTGlrZVR4biwgaGFzaDogaGFzaCwgc2lnbmF0dXJlOiBzaWduYXR1cmUgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgLi4uY29zbW9zTGlrZVR4biwgaGFzaDogaGFzaCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBiYXNlNjQgZW5vY2RlZCByYXcgdHJhbnNhY3Rpb24gc3RyaW5nIGludG8gQHNlZSBDb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1R4IGJhc2U2NCBlbm9jZGVkIHJhdyB0cmFuc2FjdGlvbiBzdHJpbmdcbiAgICogQHJldHVybnMge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gRGVzZXJpYWxpemVkIGNvc21vc0xpa2VUcmFuc2FjdGlvblxuICAgKi9cbiAgZGVzZXJpYWxpemVUcmFuc2FjdGlvbihyYXdUeDogc3RyaW5nKTogQ29zbW9zTGlrZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBkZWNvZGVkVHggPSB0aGlzLmdldERlY29kZWRUeEZyb21SYXdCYXNlNjQocmF3VHgpO1xuICAgIGNvbnN0IHR5cGVVcmwgPSB0aGlzLmdldFR5cGVVcmxGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3QgdHlwZTogVHJhbnNhY3Rpb25UeXBlIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybCh0eXBlVXJsKTtcbiAgICBsZXQgc2VuZE1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YVtdO1xuICAgIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU2VuZCkge1xuICAgICAgc2VuZE1lc3NhZ2VEYXRhID0gdGhpcy5nZXRTZW5kTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlIHx8IHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSkge1xuICAgICAgc2VuZE1lc3NhZ2VEYXRhID0gdGhpcy5nZXREZWxlZ2F0ZU9yVW5kZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdykge1xuICAgICAgc2VuZE1lc3NhZ2VEYXRhID0gdGhpcy5nZXRXaXRoZHJhd1Jld2FyZHNNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGwpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0RXhlY3V0ZUNvbnRyYWN0TWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1JlZGVsZWdhdGUpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0UmVkZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZDogJyArIHR5cGVVcmwpO1xuICAgIH1cbiAgICBjb25zdCBzZXF1ZW5jZSA9IHRoaXMuZ2V0U2VxdWVuY2VGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3QgZ2FzQnVkZ2V0ID0gdGhpcy5nZXRHYXNCdWRnZXRGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3QgcHVibGljS2V5ID0gdGhpcy5nZXRQdWJsaWNLZXlGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgY29uc3Qgc2lnbmF0dXJlID0gZGVjb2RlZFR4LnNpZ25hdHVyZXM/LlswXSAhPT0gdW5kZWZpbmVkID8gQnVmZmVyLmZyb20oZGVjb2RlZFR4LnNpZ25hdHVyZXNbMF0pIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uV2l0aEhhc2goXG4gICAgICBzZXF1ZW5jZSxcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSxcbiAgICAgIGdhc0J1ZGdldCxcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHNpZ25hdHVyZSxcbiAgICAgIGRlY29kZWRUeC5ib2R5Py5tZW1vXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW4gYXJyYXkgb2YgY29pbiBhbW91bnRzLlxuICAgKiBAcGFyYW0ge0NvaW5bXX0gYW1vdW50QXJyYXkgLSBUaGUgYXJyYXkgb2YgY29pbiBhbW91bnRzIHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIC0gb3B0aW9uYWwgZmllbGQgZm9yIHRyYW5zYWN0aW9uIHR5cGVcbiAgICovXG4gIHZhbGlkYXRlQW1vdW50RGF0YShhbW91bnRBcnJheTogQ29pbltdLCB0cmFuc2FjdGlvblR5cGU/OiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBhbW91bnRBcnJheS5mb3JFYWNoKChjb2luQW1vdW50KSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlQW1vdW50KGNvaW5BbW91bnQsIHRyYW5zYWN0aW9uVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBnYXMgbGltaXQgYW5kIGdhcyBhbW91bnQgZm9yIGEgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7RmVlRGF0YX0gZ2FzQnVkZ2V0IC0gVGhlIGdhcyBidWRnZXQgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGdhcyBidWRnZXQgaXMgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlR2FzQnVkZ2V0KGdhc0J1ZGdldDogRmVlRGF0YSk6IHZvaWQge1xuICAgIGlmIChnYXNCdWRnZXQuZ2FzTGltaXQgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGdhcyBsaW1pdCAnICsgZ2FzQnVkZ2V0Lmdhc0xpbWl0KTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudERhdGEoZ2FzQnVkZ2V0LmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgc2VuZCBtZXNzYWdlIGZvciBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge1NlbmRNZXNzYWdlfSBzZW5kTWVzc2FnZSAtIFRoZSBzZW5kIG1lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNlbmQgbWVzc2FnZSBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGVTZW5kTWVzc2FnZShzZW5kTWVzc2FnZTogU2VuZE1lc3NhZ2UpIHtcbiAgICBpZiAoIXNlbmRNZXNzYWdlLnRvQWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhzZW5kTWVzc2FnZS50b0FkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgU2VuZE1lc3NhZ2UgdG9BZGRyZXNzOiBgICsgc2VuZE1lc3NhZ2UudG9BZGRyZXNzKTtcbiAgICB9XG4gICAgaWYgKCFzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcyB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBTZW5kTWVzc2FnZSBmcm9tQWRkcmVzczogYCArIHNlbmRNZXNzYWdlLmZyb21BZGRyZXNzKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudERhdGEoc2VuZE1lc3NhZ2UuYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBjb2luIGFtb3VudC5cbiAgICogQHBhcmFtIHtDb2lufSBhbW91bnQgLSBUaGUgY29pbiBhbW91bnQgdG8gdmFsaWRhdGUuXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgLSBvcHRpb25hbCBmaWVsZCBmb3IgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjb2luIGFtb3VudCBpcyBpbnZhbGlkLlxuICAgKi9cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBDb2luLCB0cmFuc2FjdGlvblR5cGU/OiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcigndmFsaWRhdGVBbW91bnQgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgY29zbW9zIGxpa2UgQmVjaDMyIGFkZHJlc3MgbWF0Y2hlcyBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gYW5kXG4gICAqIHZhbGlkYXRlcyBtZW1vSWQgaWYgcHJlc2VudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnRXhwIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byB2YWxpZGF0ZSB0aGUgcm9vdCBhZGRyZXNzIGFnYWluc3QgYWZ0ZXIgdHJpbW1pbmcgdGhlIG1lbW9JZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZENvc21vc0xpa2VBZGRyZXNzV2l0aE1lbW9JZChhZGRyZXNzOiBzdHJpbmcsIHJlZ0V4cDogUmVnRXhwKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBhZGRyZXNzICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGFkZHJlc3NBcnJheSA9IGFkZHJlc3Muc3BsaXQoJz9tZW1vSWQ9Jyk7XG4gICAgaWYgKFxuICAgICAgIVsxLCAyXS5pbmNsdWRlcyhhZGRyZXNzQXJyYXkubGVuZ3RoKSB8fCAvLyBzaG91bGQgaGF2ZSBhdCBtb3N0IG9uZSBvY2N1cnJlbmNlIG9mICdtZW1vSWQ9J1xuICAgICAgIXRoaXMuaXNWYWxpZEJlY2gzMkFkZHJlc3NNYXRjaGluZ1JlZ2V4KGFkZHJlc3NBcnJheVswXSwgcmVnRXhwKSB8fFxuICAgICAgKGFkZHJlc3NBcnJheVsxXSAmJiAhdGhpcy5pc1ZhbGlkTWVtb0lkKGFkZHJlc3NBcnJheVsxXSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhZGRyZXNzIGlzIHZhbGlkIEJlY2gzMiBhbmQgbWF0Y2hlcyBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ0V4cCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgdGhlIGFkZHJlc3MgYWdhaW5zdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZEJlY2gzMkFkZHJlc3NNYXRjaGluZ1JlZ2V4KGFkZHJlc3M6IHN0cmluZywgcmVnRXhwOiBSZWdFeHApOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgZnJvbUJlY2gzMihhZGRyZXNzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZWdFeHAudGVzdChhZGRyZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBtZW1vIGlkIGlzIHZhbGlkXG4gICAqXG4gICAqIEBwYXJhbSBtZW1vSWQgbWVtbyBpZFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIG1lbW8gaWQgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRNZW1vSWQobWVtb0lkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgbWVtb0lkTnVtYmVyOiBCaWdOdW1iZXI7XG4gICAgdHJ5IHtcbiAgICAgIG1lbW9JZE51bWJlciA9IG5ldyBCaWdOdW1iZXIobWVtb0lkKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtZW1vSWROdW1iZXIuZ3RlKDApICYmIG1lbW9JZE51bWJlci5pc0ludGVnZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIGFkZHJlc3MgbWF0Y2hlcyB3aXRoIHJlZ2V4IEBzZWUgYWNjb3VudEFkZHJlc3NSZWdleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdpc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIGFkZHJlc3MgbWF0Y2hlcyB3aXRoIHJlZ2V4IEBzZWUgYWNjb3VudEFkZHJlc3NSZWdleFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0aGUgdmFsaWRhdGlvbiByZXN1bHRcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdpc1ZhbGlkQWRkcmVzcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgaWYgdGhlIGFkZHJlc3MgbWF0Y2hlcyB3aXRoIHJlZ2V4IEBzZWUgY29udHJhY3RBZGRyZXNzUmVnZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQ29udHJhY3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdpc1ZhbGlkQ29udHJhY3RBZGRyZXNzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIGV4ZWN1dGUgY29udHJhY3QgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0V4ZWN1dGVDb250cmFjdE1lc3NhZ2V9IG1lc3NhZ2UgLSBUaGUgZXhlY3V0ZSBjb250cmFjdCBtZXNzYWdlIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgLSBvcHRpb25hbCBmaWVsZCBmb3IgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBtZXNzYWdlIGlzIGludmFsaWRcbiAgICovXG4gIHZhbGlkYXRlRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZShtZXNzYWdlOiBFeGVjdXRlQ29udHJhY3RNZXNzYWdlLCB0cmFuc2FjdGlvblR5cGU/OiBUcmFuc2FjdGlvblR5cGUpIHtcbiAgICBpZiAoIW1lc3NhZ2UuY29udHJhY3QgfHwgIXRoaXMuaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhtZXNzYWdlLmNvbnRyYWN0KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UgY29udHJhY3QgYWRkcmVzczogYCArIG1lc3NhZ2UuY29udHJhY3QpO1xuICAgIH1cbiAgICBpZiAoIW1lc3NhZ2Uuc2VuZGVyIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKG1lc3NhZ2Uuc2VuZGVyKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2Ugc2VuZGVyIGFkZHJlc3M6IGAgKyBtZXNzYWdlLnNlbmRlcik7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZS5tc2cpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBFeGVjdXRlQ29udHJhY3RNZXNzYWdlIG1zZzogYCArIG1lc3NhZ2UubXNnKTtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2UuZnVuZHMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBbW91bnREYXRhKG1lc3NhZ2UuZnVuZHMsIHRyYW5zYWN0aW9uVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2luIHNwZWNpZmljIGhhc2ggZnVuY3Rpb25cbiAgICogQHJldHVybnMge0hhc2h9IFRoZSBoYXNoIGZ1bmN0aW9uXG4gICAqL1xuICBnZXRIYXNoRnVuY3Rpb24oKTogSGFzaCB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpO1xuICB9XG59XG5cbmNvbnN0IHV0aWxzID0gbmV3IENvc21vc1V0aWxzKCk7XG5cbmV4cG9ydCBkZWZhdWx0IHV0aWxzO1xuIl19
813
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQU15QjtBQUN6Qix5Q0FBZ0Y7QUFDaEYsK0NBQW9GO0FBQ3BGLHlEQVMrQjtBQUMvQiwrQ0FBOEQ7QUFDOUQsZ0VBQXFDO0FBQ3JDLDBEQUFtRTtBQUVuRSx5REFBc0U7QUFDdEUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUVqRSxtQ0FBMEM7QUFDMUMsdURBQXlDO0FBV3pDLHVDQUFxRDtBQUVyRCxNQUFhLFdBQVc7SUFHdEI7UUFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksd0JBQVEsQ0FBQyxDQUFDLEdBQUcsK0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRSx1QkFBa0IsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsY0FBYyxDQUFDLElBQVk7UUFDekIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsaUJBQWlCLENBQUMsR0FBVztRQUMzQixJQUFJLENBQUM7WUFDSCxJQUFJLHVCQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lB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LE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzVELE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxpREFBaUQsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLHNDQUFzQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlO1FBQ2IsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBbjFCRCxrQ0FtMUJDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUVoQyxrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlVXRpbHMsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBOb3RJbXBsZW1lbnRlZEVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGVuY29kZVNlY3AyNTZrMVB1YmtleSwgZW5jb2RlU2VjcDI1NmsxU2lnbmF0dXJlIH0gZnJvbSAnQGNvc21qcy9hbWlubyc7XG5pbXBvcnQgeyBmcm9tQmFzZTY0LCBmcm9tQmVjaDMyLCBmcm9tSGV4LCB0b0hleCwgdG9CZWNoMzIgfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCB7XG4gIERlY29kZWRUeFJhdyxcbiAgRW5jb2RlT2JqZWN0LFxuICBSZWdpc3RyeSxcbiAgZGVjb2RlUHVia2V5LFxuICBkZWNvZGVUeFJhdyxcbiAgZW5jb2RlUHVia2V5LFxuICBtYWtlQXV0aEluZm9CeXRlcyxcbiAgbWFrZVNpZ25Eb2MsXG59IGZyb20gJ0Bjb3NtanMvcHJvdG8tc2lnbmluZyc7XG5pbXBvcnQgeyBDb2luLCBkZWZhdWx0UmVnaXN0cnlUeXBlcyB9IGZyb20gJ0Bjb3NtanMvc3RhcmdhdGUnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgU2lnbkRvYywgVHhSYXcgfSBmcm9tICdjb3NtanMtdHlwZXMvY29zbW9zL3R4L3YxYmV0YTEvdHgnO1xuaW1wb3J0IHsgQW55IH0gZnJvbSAnY29zbWpzLXR5cGVzL2dvb2dsZS9wcm90b2J1Zi9hbnknO1xuaW1wb3J0IHsgTXNnRXhlY3V0ZUNvbnRyYWN0IH0gZnJvbSAnY29zbWpzLXR5cGVzL2Nvc213YXNtL3dhc20vdjEvdHgnO1xuY29uc3QgeyBNc2dTZW5kIH0gPSByZXF1aXJlKCcuLi8uLi9yZXNvdXJjZXMvTXNnQ29tcGlsZWQnKS50eXBlcztcblxuaW1wb3J0IHsgSGFzaCwgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQ29zbW9zTGlrZVRyYW5zYWN0aW9uLFxuICBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UsXG4gIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2UsXG4gIEZlZURhdGEsXG4gIE1lc3NhZ2VEYXRhLFxuICBSZWRlbGVnYXRlTWVzc2FnZSxcbiAgU2VuZE1lc3NhZ2UsXG4gIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgQ29zbW9zS2V5UGFpciBhcyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcblxuZXhwb3J0IGNsYXNzIENvc21vc1V0aWxzIGltcGxlbWVudHMgQmFzZVV0aWxzIHtcbiAgcHJvdGVjdGVkIHJlZ2lzdHJ5O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoWy4uLmRlZmF1bHRSZWdpc3RyeVR5cGVzXSk7XG4gICAgdGhpcy5yZWdpc3RyeS5yZWdpc3Rlcihjb25zdGFudHMuZXhlY3V0ZUNvbnRyYWN0TXNnVHlwZVVybCwgTXNnRXhlY3V0ZUNvbnRyYWN0KTtcbiAgICB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyKCcvdHlwZXMuTXNnU2VuZCcsIE1zZ1NlbmQpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRCbG9ja0lkKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQmxha2UyYihoYXNoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkUHJpdmF0ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBuZXcgS2V5UGFpcih7IHBydjoga2V5IH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRQdWJsaWNLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwdWI6IGtleSB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2lzVmFsaWRTaWduYXR1cmUgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGVCbGFrZTJiKHR4SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0cmFuc2FjdGlvbiBoYXNoIGlzIGluIHZhbGlkIGJsYWNrMmIgZm9ybWF0XG4gICAqL1xuICB2YWxpZGF0ZUJsYWtlMmIoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGhhc2g/Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2gubWF0Y2goL15bYS16QS1aMC05XSskLykgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW1vdW50cyBhcmUgaW4gcmFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gYW1vdW50cyAtIHRoZSBhbW91bnRzIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudHMoYW1vdW50czogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGFtb3VudCBvZiBhbW91bnRzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZEFtb3VudChhbW91bnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW1vdW50IGlzIGluIHJhbmdlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZEFtb3VudChhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJpZ051bWJlckFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KTtcbiAgICBpZiAoIWJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSB8fCBiaWdOdW1iZXJBbW91bnQuaXNMZXNzVGhhbk9yRXF1YWxUbygwKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHJhdyB0eCBkYXRhIGludG8gbWVzc2FnZXMsIHNpZ25pbmcgaW5mbywgYW5kIGZlZSBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eEhleCAtIHJhdyBiYXNlNjQgdHhcbiAgICogQHJldHVybnMge0RlY29kZWRUeFJhd30gRGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKi9cbiAgZ2V0RGVjb2RlZFR4RnJvbVJhd0Jhc2U2NCh0eFJhdzogc3RyaW5nKTogRGVjb2RlZFR4UmF3IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGRlY29kZVR4UmF3KGZyb21CYXNlNjQodHhSYXcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFcnJvciBkZWNvZGluZyBUeFJhdyBiYXNlNjQgZW5jb2RlZCBzdHJpbmc6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBtZXNzYWdlcyBpbiB0aGUgYm9keSBvZiB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtFbmNvZGVPYmplY3RbXX0gbWVzc2FnZXMgYWxvbmcgd2l0aCB0eXBlIHVybFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbmNvZGVkTWVzc2FnZXNGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogRW5jb2RlT2JqZWN0W10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIHR4biBzZXF1ZW5jZSBpcyB2YWxpZCBvciBub3RcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNlcXVlbmNlXG4gICAqL1xuICB2YWxpZGF0ZVNlcXVlbmNlKHNlcXVlbmNlOiBudW1iZXIpIHtcbiAgICBpZiAoc2VxdWVuY2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgc2VxdWVuY2U6IGxlc3MgdGhhbiB6ZXJvJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIHRoZSBzZXF1ZW5jZSBudW1iZXIgZnJvbSBhIERlY29kZWRUeFJhdyBBdXRoSW5mbyBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHNlcXVlbmNlXG4gICAqL1xuICBnZXRTZXF1ZW5jZUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBudW1iZXIge1xuICAgIHJldHVybiBOdW1iZXIoZGVjb2RlZFR4LmF1dGhJbmZvLnNpZ25lckluZm9zWzBdLnNlcXVlbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxscyB0aGUgdHlwZVVybCBmcm9tIHRoZSBlbmNvZGVkIG1lc3NhZ2Ugb2YgYSBEZWNvZGVkVHhSYXdcbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBjb3Ntb3MgcHJvdG8gdHlwZSB1cmxcbiAgICovXG4gIGdldFR5cGVVcmxGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogc3RyaW5nIHtcbiAgICBjb25zdCBlbmNvZGVkTWVzc2FnZSA9IHRoaXMuZ2V0RW5jb2RlZE1lc3NhZ2VzRnJvbURlY29kZWRUeChkZWNvZGVkVHgpWzBdO1xuICAgIHJldHVybiBlbmNvZGVkTWVzc2FnZS50eXBlVXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZlZSBkYXRhIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7RmVlRGF0YX0gZmVlIGRhdGFcbiAgICovXG4gIGdldEdhc0J1ZGdldEZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBGZWVEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW1vdW50OiBkZWNvZGVkVHguYXV0aEluZm8uZmVlPy5hbW91bnQgYXMgQ29pbltdLFxuICAgICAgZ2FzTGltaXQ6IE51bWJlcihkZWNvZGVkVHguYXV0aEluZm8uZmVlPy5nYXNMaW1pdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwdWJsaWNLZXkgZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IHB1YmxpY0tleSBpbiBoZXggZm9ybWF0IGlmIGl0IGV4aXN0cywgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgZ2V0UHVibGljS2V5RnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHVibGljS2V5VUludDhBcnJheSA9IGRlY29kZWRUeC5hdXRoSW5mby5zaWduZXJJbmZvcz8uWzBdLnB1YmxpY0tleT8udmFsdWU7XG4gICAgaWYgKHB1YmxpY0tleVVJbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiB0b0hleChmcm9tQmFzZTY0KGRlY29kZVB1YmtleShkZWNvZGVkVHguYXV0aEluZm8uc2lnbmVySW5mb3M/LlswXS5wdWJsaWNLZXkpPy52YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBTZW5kIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFNlbmRNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YVtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBmcm9tQWRkcmVzczogdmFsdWUuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgdG9BZGRyZXNzOiB2YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiB2YWx1ZS5hbW91bnQsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGVVcmw6IG1lc3NhZ2UudHlwZVVybCxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IERlbGVnYXRlIG9mIHVuZGVsZWdhdGUgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBnZXREZWxlZ2F0ZU9yVW5kZWxlZ2F0ZU1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHg6IERlY29kZWRUeFJhdyk6IE1lc3NhZ2VEYXRhW10ge1xuICAgIHJldHVybiBkZWNvZGVkVHguYm9keS5tZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWdpc3RyeS5kZWNvZGUobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGRlbGVnYXRvckFkZHJlc3M6IHZhbHVlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdmFsdWUudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gUmVkZWxlZ2F0ZSB0cmFuc2FjdGlvbiBtZXNzYWdlIGRhdGFcbiAgICovXG4gIGdldFJlZGVsZWdhdGVNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YVtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBkZWxlZ2F0b3JBZGRyZXNzOiB2YWx1ZS5kZWxlZ2F0b3JBZGRyZXNzLFxuICAgICAgICAgIHZhbGlkYXRvclNyY0FkZHJlc3M6IHZhbHVlLnZhbGlkYXRvclNyY0FkZHJlc3MsXG4gICAgICAgICAgdmFsaWRhdG9yRHN0QWRkcmVzczogdmFsdWUudmFsaWRhdG9yRHN0QWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHZhbHVlLmFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVVybDogbWVzc2FnZS50eXBlVXJsLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBNZXNzYWdlRGF0YVtdIGZyb20gdGhlIGRlY29kZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtEZWNvZGVkVHhSYXd9IGRlY29kZWRUeFxuICAgKiBAcmV0dXJucyB7TWVzc2FnZURhdGFbXX0gV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0V2l0aGRyYXdSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIE1lc3NhZ2VEYXRhW10gZnJvbSB0aGUgZGVjb2RlZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRUeFJhd30gZGVjb2RlZFR4XG4gICAqIEByZXR1cm5zIHtNZXNzYWdlRGF0YVtdfSBEZWxlZ2F0ZSBvZiB1bmRlbGVnYXRlIHRyYW5zYWN0aW9uIG1lc3NhZ2UgZGF0YVxuICAgKi9cbiAgZ2V0V2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeDogRGVjb2RlZFR4UmF3KTogTWVzc2FnZURhdGFbXSB7XG4gICAgcmV0dXJuIGRlY29kZWRUeC5ib2R5Lm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlZ2lzdHJ5LmRlY29kZShtZXNzYWdlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZGVsZWdhdG9yQWRkcmVzczogdmFsdWUuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICB2YWxpZGF0b3JBZGRyZXNzOiB2YWx1ZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNvc21vcyBjaGFpbiBhZGRyZXNzIGZyb20gaXRzIGVxdWl2YWxlbnQgaGV4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NIZXhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldENvc21vc0xpa2VBZGRyZXNzRnJvbUhleChwcmVmaXg6IHN0cmluZywgYWRkcmVzc0hleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoYWRkcmVzc0hleC5pbmRleE9mKCcweCcpID09PSAwKSB7XG4gICAgICBhZGRyZXNzSGV4ID0gYWRkcmVzc0hleC5zbGljZSgyKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvQmVjaDMyKHByZWZpeCwgZnJvbUhleChhZGRyZXNzSGV4KSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgRVZNIGNoYWluIGFkZHJlc3MgZnJvbSBpdHMgZXF1aXZhbGVudCBoZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzc0hleFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RXZtTGlrZUFkZHJlc3NGcm9tQ29zbW9zKGNvc21vc0xpa2VBZGRyZXNzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnMHgnICsgdG9IZXgoZnJvbUJlY2gzMihjb3Ntb3NMaWtlQWRkcmVzcykuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgTWVzc2FnZURhdGFbXSBmcm9tIHRoZSBkZWNvZGVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFR4UmF3fSBkZWNvZGVkVHhcbiAgICogQHJldHVybnMge01lc3NhZ2VEYXRhW119IEV4ZWN1dGUgY29udHJhY3QgdHJhbnNhY3Rpb24gbWVzc2FnZSBkYXRhXG4gICAqL1xuICBnZXRFeGVjdXRlQ29udHJhY3RNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4OiBEZWNvZGVkVHhSYXcpOiBNZXNzYWdlRGF0YVtdIHtcbiAgICByZXR1cm4gZGVjb2RlZFR4LmJvZHkubWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVnaXN0cnkuZGVjb2RlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBzZW5kZXI6IHZhbHVlLnNlbmRlcixcbiAgICAgICAgICBjb250cmFjdDogdmFsdWUuY29udHJhY3QsXG4gICAgICAgICAgbXNnOiB2YWx1ZS5tc2csXG4gICAgICAgICAgZnVuZHM6IHZhbHVlLmZ1bmRzLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlVXJsOiBtZXNzYWdlLnR5cGVVcmwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgYml0Z28gdHJhbnNhY3Rpb24gdHlwZSBiYXNlZCBvbiBjb3Ntb3MgcHJvdG8gdHlwZSB1cmxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVVcmxcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZH0gVHJhbnNhY3Rpb25UeXBlIGlmIHVybCBpcyBzdXBwb3J0ZWQgZWxzZSB1bmRlZmluZWRcbiAgICovXG4gIGdldFRyYW5zYWN0aW9uVHlwZUZyb21UeXBlVXJsKHR5cGVVcmw6IHN0cmluZyk6IFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoICh0eXBlVXJsKSB7XG4gICAgICBjYXNlIGNvbnN0YW50cy5zZW5kTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgICAgY2FzZSBjb25zdGFudHMuc2VuZE1zZ1R5cGU6XG4gICAgICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgIGNhc2UgY29uc3RhbnRzLmRlbGVnYXRlTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU7XG4gICAgICBjYXNlIGNvbnN0YW50cy51bmRlbGVnYXRlTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTtcbiAgICAgIGNhc2UgY29uc3RhbnRzLndpdGhkcmF3RGVsZWdhdG9yUmV3YXJkTXNnVHlwZVVybDpcbiAgICAgICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc7XG4gICAgICBjYXNlIGNvbnN0YW50cy5leGVjdXRlQ29udHJhY3RNc2dUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbDtcbiAgICAgIGNhc2UgY29uc3RhbnRzLnJlZGVsZWdhdGVUeXBlVXJsOlxuICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdSZWRlbGVnYXRlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBoZXggZW5jb2RlZCBwdWJrZXksIGNvbnZlcnRzIGl0IHRvIHRoZSBBbWlubyBKU09OIHJlcHJlc2VudGF0aW9uICh0eXBlL3ZhbHVlIHdyYXBwZXIpXG4gICAqIGFuZCByZXR1cm5zIGl0IGFzIHByb3RvYnVmIGBBbnlgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWJrZXkgaGV4IGVuY29kZWQgY29tcHJlc3NlZCBzZWNwMjU2azEgcHVibGljIGtleVxuICAgKiBAcmV0dXJucyB7QW55fSBwdWJrZXkgZW5jb2RlZCBhcyBwcm90b2J1ZiBgQW55YFxuICAgKi9cbiAgZ2V0RW5jb2RlZFB1YmtleShwdWJrZXk6IHN0cmluZyk6IEFueSB7XG4gICAgcmV0dXJuIGVuY29kZVB1YmtleShlbmNvZGVTZWNwMjU2azFQdWJrZXkoZnJvbUhleChwdWJrZXkpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHR4UmF3IGZyb20gYW4gY29zbW9zIGxpa2UgdHJhbnNhY3Rpb24gQHNlZSBDb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICogQFByZWNvbmRpdGlvbiBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24ucHVibGljS2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKiBAcGFyYW0ge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gY29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtUeFJhd30gVW5zaWduZWQgcmF3IHRyYW5zYWN0aW9uXG4gICAqL1xuICBjcmVhdGVUeFJhd0Zyb21Db3Ntb3NMaWtlVHJhbnNhY3Rpb24oY29zbW9zTGlrZVRyYW5zYWN0aW9uOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24pOiBUeFJhdyB7XG4gICAgaWYgKCFjb3Ntb3NMaWtlVHJhbnNhY3Rpb24ucHVibGljS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YmxpY0tleSBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSB0eFJhdycpO1xuICAgIH1cbiAgICBjb25zdCBlbmNvZGVkUHVibGljS2V5OiBBbnkgPSB0aGlzLmdldEVuY29kZWRQdWJrZXkoY29zbW9zTGlrZVRyYW5zYWN0aW9uLnB1YmxpY0tleSk7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uc2VuZE1lc3NhZ2VzIGFzIHVua25vd24gYXMgQW55W107XG4gICAgbGV0IHR4Qm9keVZhbHVlO1xuICAgIGlmIChjb3Ntb3NMaWtlVHJhbnNhY3Rpb24ubWVtbykge1xuICAgICAgdHhCb2R5VmFsdWUgPSB7XG4gICAgICAgIG1lbW86IGNvc21vc0xpa2VUcmFuc2FjdGlvbi5tZW1vLFxuICAgICAgICBtZXNzYWdlczogbWVzc2FnZXMsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0eEJvZHlWYWx1ZSA9IHtcbiAgICAgICAgbWVzc2FnZXM6IG1lc3NhZ2VzLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0eEJvZHlCeXRlcyA9IHRoaXMucmVnaXN0cnkuZW5jb2RlVHhCb2R5KHR4Qm9keVZhbHVlKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IGNvc21vc0xpa2VUcmFuc2FjdGlvbi5zZXF1ZW5jZTtcbiAgICBjb25zdCBhdXRoSW5mb0J5dGVzID0gbWFrZUF1dGhJbmZvQnl0ZXMoXG4gICAgICBbeyBwdWJrZXk6IGVuY29kZWRQdWJsaWNLZXksIHNlcXVlbmNlIH1dLFxuICAgICAgY29zbW9zTGlrZVRyYW5zYWN0aW9uLmdhc0J1ZGdldC5hbW91bnQsXG4gICAgICBjb3Ntb3NMaWtlVHJhbnNhY3Rpb24uZ2FzQnVkZ2V0Lmdhc0xpbWl0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkXG4gICAgKTtcbiAgICByZXR1cm4gVHhSYXcuZnJvbVBhcnRpYWwoe1xuICAgICAgYm9keUJ5dGVzOiB0eEJvZHlCeXRlcyxcbiAgICAgIGF1dGhJbmZvQnl0ZXM6IGF1dGhJbmZvQnl0ZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlcyBhIHNpZ25hdHVyZSBpbnRvIGEgdHhSYXdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleUhleCBwdWJsaWNLZXkgaW4gaGV4IGVuY29kZWQgc3RyaW5nIGZvcm1hdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlSGV4IHNpZ25hdHVyZSBpbiBoZXggZW5jb2RlZCBzdHJpbmcgZm9ybWF0XG4gICAqIEBwYXJhbSB7VHhSYXd9IHVuc2lnbmVkVHggcmF3IHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtUeFJhd30gU2lnbmVkIHJhdyB0cmFuc2FjdGlvblxuICAgKi9cbiAgY3JlYXRlU2lnbmVkVHhSYXcoXG4gICAgcHVibGljS2V5SGV4OiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlSGV4OiBzdHJpbmcsXG4gICAgdW5zaWduZWRUeDogeyBib2R5Qnl0ZXM6IFVpbnQ4QXJyYXk7IGF1dGhJbmZvQnl0ZXM6IFVpbnQ4QXJyYXkgfVxuICApOiBUeFJhdyB7XG4gICAgY29uc3Qgc3RkU2lnbmF0dXJlID0gZW5jb2RlU2VjcDI1NmsxU2lnbmF0dXJlKGZyb21IZXgocHVibGljS2V5SGV4KSwgZnJvbUhleChzaWduYXR1cmVIZXgpKTtcbiAgICByZXR1cm4gVHhSYXcuZnJvbVBhcnRpYWwoe1xuICAgICAgYm9keUJ5dGVzOiB1bnNpZ25lZFR4LmJvZHlCeXRlcyxcbiAgICAgIGF1dGhJbmZvQnl0ZXM6IHVuc2lnbmVkVHguYXV0aEluZm9CeXRlcyxcbiAgICAgIHNpZ25hdHVyZXM6IFtmcm9tQmFzZTY0KHN0ZFNpZ25hdHVyZS5zaWduYXR1cmUpXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIGEgcmF3IHRyYW5zYWN0aW9uIGludG8gYSBEZWNvZGVkVHhSYXcgYW5kIGNoZWNrcyBpZiBpdCBoYXMgbm9uIGVtcHR5IHNpZ25hdHVyZXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1RyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRyYW5zYWN0aW9uIGlzIHNpZ25lZCBlbHNlIGZhbHNlXG4gICAqL1xuICBpc1NpZ25lZFJhd1R4KHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBkZWNvZGVkVHggPSB0aGlzLmdldERlY29kZWRUeEZyb21SYXdCYXNlNjQocmF3VHJhbnNhY3Rpb24pO1xuICAgIGlmIChkZWNvZGVkVHguc2lnbmF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHByb3RvY29sIHB1YmxpYyBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHB1YmxpY0tleSAtIHRoZSAgcHVibGljIGtleSB0byBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHZhbGlkYXRlUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHB1YmxpY0tleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgS2V5UGFpcih7IHB1YjogcHVibGljS2V5IH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBQdWJsaWMgS2V5YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBzaWduIGRvYyBmcm9tIGFuIGNvc21vcyBsaWtlIHRyYW5zYWN0aW9uIEBzZWUgQ29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEBQcmVjb25kaXRpb24gY29zbW9zTGlrZVRyYW5zYWN0aW9uLmFjY291bnROdW1iZXIgYW5kIGNvc21vc0xpa2VUcmFuc2FjdGlvbi5jaGFpbklkIG11c3QgYmUgZGVmaW5lZFxuICAgKiBAcGFyYW0ge0Nvc21vc0xpa2VUcmFuc2FjdGlvbn0gY29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtTaWduRG9jfSBzaWduIGRvY1xuICAgKi9cbiAgY3JlYXRlU2lnbkRvYyhcbiAgICBjb3Ntb3NMaWtlVHJhbnNhY3Rpb246IENvc21vc0xpa2VUcmFuc2FjdGlvbixcbiAgICBhY2NvdW50TnVtYmVyOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgY2hhaW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFNpZ25Eb2Mge1xuICAgIGlmICghYWNjb3VudE51bWJlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhY2NvdW50TnVtYmVyIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHNpZ24gZG9jJyk7XG4gICAgfVxuICAgIGlmICghY2hhaW5JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGFpbklkIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHNpZ24gZG9jJyk7XG4gICAgfVxuICAgIGlmICghY29zbW9zTGlrZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nvc21vc0xpa2VUcmFuc2FjdGlvbiBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSBzaWduIGRvYycpO1xuICAgIH1cbiAgICBjb25zdCB0eFJhdyA9IHRoaXMuY3JlYXRlVHhSYXdGcm9tQ29zbW9zTGlrZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUcmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIG1ha2VTaWduRG9jKHR4UmF3LmJvZHlCeXRlcywgdHhSYXcuYXV0aEluZm9CeXRlcywgY2hhaW5JZCwgYWNjb3VudE51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaGV4XG4gICAqIEBwYXJhbSBoZXhTdHJpbmcgLSBoZXggc3RyaW5nIGZvcm1hdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBzdHJpbmcgaXMgaGV4IGVsc2UgZmFsc2VcbiAgICovXG4gIGlzVmFsaWRIZXhTdHJpbmcoaGV4U3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bMC05QS1GYS1mXSokLy50ZXN0KGhleFN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlXG4gICAqIEBwYXJhbSB7V2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZX0gd2l0aGRyYXdSZXdhcmRzTWVzc2FnZSAtIFRoZSBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB2YWxpZGF0b3JBZGRyZXNzIG9yIGRlbGVnYXRvckFkZHJlc3MgaXMgaW52YWxpZCBvciBtaXNzaW5nLlxuICAgKi9cbiAgdmFsaWRhdGVXaXRoZHJhd1Jld2FyZHNNZXNzYWdlKHdpdGhkcmF3UmV3YXJkc01lc3NhZ2U6IFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UpIHtcbiAgICBpZiAoXG4gICAgICAhd2l0aGRyYXdSZXdhcmRzTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzIHx8XG4gICAgICAhdGhpcy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyh3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3MpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2UgdmFsaWRhdG9yQWRkcmVzczogYCArIHdpdGhkcmF3UmV3YXJkc01lc3NhZ2UudmFsaWRhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3Mod2l0aGRyYXdSZXdhcmRzTWVzc2FnZS5kZWxlZ2F0b3JBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlIGRlbGVnYXRvckFkZHJlc3M6IGAgKyB3aXRoZHJhd1Jld2FyZHNNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBhcmUgbWlzc2luZyBvciBudWxsLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqIC0gVGhlIG9iamVjdCB0byBjaGVjay5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0ga2V5cyAtIEFuIGFycmF5IG9mIHByb3BlcnR5IGtleXMgdG8gY2hlY2suXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgYW55IG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcyBhcmUgbWlzc2luZyBvciBudWxsLlxuICAgKi9cbiAgaXNPYmpQcm9wZXJ0eU51bGwob2JqOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBrZXlzOiBBcnJheTxzdHJpbmc+KSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKG9ialtrZXldID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIG51bGwgdmFsdWUgZm9yIHByb3BlcnR5ICR7a2V5fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZVxuICAgKiBAcGFyYW0ge0RlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZX0gZGVsZWdhdGVNZXNzYWdlIC0gVGhlIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSB0byB2YWxpZGF0ZS5cbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgdmFsaWRhdG9yQWRkcmVzcywgZGVsZWdhdG9yQWRkcmVzcywgb3IgYW1vdW50IGlzIGludmFsaWQgb3IgbWlzc2luZy5cbiAgICovXG4gIHZhbGlkYXRlRGVsZWdhdGVPclVuZGVsZWdhdGVNZXNzYWdlKGRlbGVnYXRlTWVzc2FnZTogRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlKSB7XG4gICAgdGhpcy5pc09ialByb3BlcnR5TnVsbChkZWxlZ2F0ZU1lc3NhZ2UsIFsndmFsaWRhdG9yQWRkcmVzcycsICdkZWxlZ2F0b3JBZGRyZXNzJ10pO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKGRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBEZWxlZ2F0ZU9yVW5kZWxlZ2V0ZU1lc3NhZ2UgdmFsaWRhdG9yQWRkcmVzczogYCArIGRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoZGVsZWdhdGVNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSBkZWxlZ2F0b3JBZGRyZXNzOiBgICsgZGVsZWdhdGVNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBbW91bnQoZGVsZWdhdGVNZXNzYWdlLmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBSZWRlbGVnYXRlTWVzc2FnZVxuICAgKiBAcGFyYW0ge0RlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZX0gcmVkZWxlZ2F0ZU1lc3NhZ2UgLSBUaGUgUmVkZWxlZ2F0ZU1lc3NhZ2UgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHZhbGlkYXRvclNyY0FkZHJlc3MsIHZhbGlkYXRvckRzdEFkZHJlc3MsIGRlbGVnYXRvckFkZHJlc3MsIG9yIGFtb3VudCBpcyBpbnZhbGlkIG9yIG1pc3NpbmcuXG4gICAqL1xuICB2YWxpZGF0ZVJlZGVsZWdhdGVNZXNzYWdlKHJlZGVsZWdhdGVNZXNzYWdlOiBSZWRlbGVnYXRlTWVzc2FnZSkge1xuICAgIHRoaXMuaXNPYmpQcm9wZXJ0eU51bGwocmVkZWxlZ2F0ZU1lc3NhZ2UsIFsndmFsaWRhdG9yU3JjQWRkcmVzcycsICd2YWxpZGF0b3JEc3RBZGRyZXNzJywgJ2RlbGVnYXRvckFkZHJlc3MnXSk7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MocmVkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yU3JjQWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYEludmFsaWQgUmVkZWxlZ2F0ZU1lc3NhZ2UgdmFsaWRhdG9yU3JjQWRkcmVzczogYCArIHJlZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvclNyY0FkZHJlc3NcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhyZWRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JEc3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCBSZWRlbGVnYXRlTWVzc2FnZSB2YWxpZGF0b3JEc3RBZGRyZXNzOiBgICsgcmVkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yRHN0QWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKHJlZGVsZWdhdGVNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZSBkZWxlZ2F0b3JBZGRyZXNzOiBgICsgcmVkZWxlZ2F0ZU1lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzc1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudChyZWRlbGVnYXRlTWVzc2FnZS5hbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgTWVzc2FnZURhdGFcbiAgICogQHBhcmFtIHtNZXNzYWdlRGF0YX0gbWVzc2FnZURhdGEgLSBUaGUgTWVzc2FnZURhdGEgdG8gdmFsaWRhdGUuXG4gICAqIEB0aHJvd3Mge0ludmFsaWRUcmFuc2FjdGlvbkVycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG1lc3NhZ2VEYXRhIGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuXG4gICAqL1xuICB2YWxpZGF0ZU1lc3NhZ2VEYXRhKG1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YSk6IHZvaWQge1xuICAgIGlmIChtZXNzYWdlRGF0YSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgTWVzc2FnZURhdGE6IHVuZGVmaW5lZGApO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZURhdGEudHlwZVVybCA9PSBudWxsIHx8IHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwobWVzc2FnZURhdGEudHlwZVVybCkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIE1lc3NhZ2VEYXRhIHR5cGV1cmw6IGAgKyBtZXNzYWdlRGF0YS50eXBlVXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tVHlwZVVybChtZXNzYWdlRGF0YS50eXBlVXJsKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXNzYWdlRGF0YS52YWx1ZSBhcyBTZW5kTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVNlbmRNZXNzYWdlKHZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZToge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZURlbGVnYXRlT3JVbmRlbGVnYXRlTWVzc2FnZSh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZURhdGEudmFsdWUgYXMgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZVdpdGhkcmF3UmV3YXJkc01lc3NhZ2UodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbDoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2U7XG4gICAgICAgIHRoaXMudmFsaWRhdGVFeGVjdXRlQ29udHJhY3RNZXNzYWdlKHZhbHVlLCBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nUmVkZWxlZ2F0ZToge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1lc3NhZ2VEYXRhLnZhbHVlIGFzIFJlZGVsZWdhdGVNZXNzYWdlO1xuICAgICAgICB0aGlzLnZhbGlkYXRlUmVkZWxlZ2F0ZU1lc3NhZ2UodmFsdWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBNZXNzYWdlRGF0YSBUeXBlVXJsIGlzIG5vdCBzdXBwb3J0ZWQ6IGAgKyBtZXNzYWdlRGF0YS50eXBlVXJsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBDb3Ntb3MtbGlrZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IHR4IC0gVGhlIHRyYW5zYWN0aW9uIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBpbnZhbGlkIG9yIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLlxuICAgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0eDogQ29zbW9zTGlrZVRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZVNlcXVlbmNlKHR4LnNlcXVlbmNlKTtcbiAgICB0aGlzLnZhbGlkYXRlR2FzQnVkZ2V0KHR4Lmdhc0J1ZGdldCk7XG4gICAgdGhpcy52YWxpZGF0ZVB1YmxpY0tleSh0eC5wdWJsaWNLZXkpO1xuICAgIGlmICh0eC5zZW5kTWVzc2FnZXMgPT09IHVuZGVmaW5lZCB8fCB0eC5zZW5kTWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1lc3NhZ2VzIGlzIHJlcXVpcmVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4LnNlbmRNZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlKSA9PiB0aGlzLnZhbGlkYXRlTWVzc2FnZURhdGEobWVzc2FnZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZXF1ZW5jZSAtIFRoZSBzZW5kZXIgYWRkcmVzcyBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtNZXNzYWdlRGF0YVtdfSBtZXNzYWdlcyAtIFRoZSBhcnJheSBvZiBtZXNzYWdlIGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtGZWVEYXRhfSBnYXNCdWRnZXQgLSBUaGUgZmVlIGRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwdWJsaWNLZXldIC0gVGhlIHB1YmxpYyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZW5kZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVtb10gLSBUaGUgbWVtbyBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBAcmV0dXJucyB7Q29zbW9zTGlrZVRyYW5zYWN0aW9ufSBSZXR1cm5zIHRoZSBjcmVhdGVkIENvc21vcy1saWtlIHRyYW5zYWN0aW9uLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcmVhdGVkIHRyYW5zYWN0aW9uIGlzIGludmFsaWQuXG4gICAqL1xuICBjcmVhdGVUcmFuc2FjdGlvbihcbiAgICBzZXF1ZW5jZTogbnVtYmVyLFxuICAgIG1lc3NhZ2VzOiBNZXNzYWdlRGF0YVtdLFxuICAgIGdhc0J1ZGdldDogRmVlRGF0YSxcbiAgICBwdWJsaWNLZXk/OiBzdHJpbmcsXG4gICAgbWVtbz86IHN0cmluZ1xuICApOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IGNvc21vc0xpa2VUeG4gPSB7XG4gICAgICBzZXF1ZW5jZTogc2VxdWVuY2UsXG4gICAgICBzZW5kTWVzc2FnZXM6IG1lc3NhZ2VzLFxuICAgICAgZ2FzQnVkZ2V0OiBnYXNCdWRnZXQsXG4gICAgICBwdWJsaWNLZXk6IHB1YmxpY0tleSxcbiAgICAgIG1lbW86IG1lbW8sXG4gICAgfTtcbiAgICB0aGlzLnZhbGlkYXRlVHJhbnNhY3Rpb24oY29zbW9zTGlrZVR4bik7XG4gICAgcmV0dXJuIGNvc21vc0xpa2VUeG47XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENvc21vcy1saWtlIHRyYW5zYWN0aW9uIHdpdGggYSBoYXNoLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2VxdWVuY2UgLSBUaGUgc2VuZGVyIGFkZHJlc3Mgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7TWVzc2FnZURhdGFbXX0gbWVzc2FnZXMgLSBUaGUgYXJyYXkgb2YgbWVzc2FnZSBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7RmVlRGF0YX0gZ2FzQnVkZ2V0IC0gVGhlIGZlZSBkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcHVibGljS2V5XSAtIFRoZSBwdWJsaWMga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBbc2lnbmF0dXJlXSAtIFRoZSBzaWduYXR1cmUgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttZW1vXSAtIFRoZSBtZW1vIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEByZXR1cm5zIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IFJldHVybnMgdGhlIGNyZWF0ZWQgQ29zbW9zLWxpa2UgdHJhbnNhY3Rpb24gd2l0aCB0aGUgaGFzaCBhbmQgc2lnbmF0dXJlIGlmIHByb3ZpZGVkLlxuICAgKi9cbiAgY3JlYXRlVHJhbnNhY3Rpb25XaXRoSGFzaChcbiAgICBzZXF1ZW5jZTogbnVtYmVyLFxuICAgIG1lc3NhZ2VzOiBNZXNzYWdlRGF0YVtdLFxuICAgIGdhc0J1ZGdldDogRmVlRGF0YSxcbiAgICBwdWJsaWNLZXk/OiBzdHJpbmcsXG4gICAgc2lnbmF0dXJlPzogQnVmZmVyLFxuICAgIG1lbW8/OiBzdHJpbmdcbiAgKTogQ29zbW9zTGlrZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBjb3Ntb3NMaWtlVHhuID0gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbihzZXF1ZW5jZSwgbWVzc2FnZXMsIGdhc0J1ZGdldCwgcHVibGljS2V5LCBtZW1vKTtcbiAgICBsZXQgaGFzaCA9IGNvbnN0YW50cy5VTkFWQUlMQUJMRV9URVhUO1xuICAgIGlmIChzaWduYXR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdW5zaWduZWRUeCA9IHRoaXMuY3JlYXRlVHhSYXdGcm9tQ29zbW9zTGlrZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUeG4pO1xuICAgICAgY29uc3Qgc2lnbmVkVHggPSBUeFJhdy5mcm9tUGFydGlhbCh7XG4gICAgICAgIGJvZHlCeXRlczogdW5zaWduZWRUeC5ib2R5Qnl0ZXMsXG4gICAgICAgIGF1dGhJbmZvQnl0ZXM6IHVuc2lnbmVkVHguYXV0aEluZm9CeXRlcyxcbiAgICAgICAgc2lnbmF0dXJlczogW3NpZ25hdHVyZV0sXG4gICAgICB9KTtcbiAgICAgIGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKVxuICAgICAgICAudXBkYXRlKFR4UmF3LmVuY29kZShzaWduZWRUeCkuZmluaXNoKCkpXG4gICAgICAgIC5kaWdlc3QoKVxuICAgICAgICAudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgIC50b0xvY2FsZVVwcGVyQ2FzZSgnZW4tVVMnKTtcbiAgICAgIHJldHVybiB7IC4uLmNvc21vc0xpa2VUeG4sIGhhc2g6IGhhc2gsIHNpZ25hdHVyZTogc2lnbmF0dXJlIH07XG4gICAgfVxuICAgIHJldHVybiB7IC4uLmNvc21vc0xpa2VUeG4sIGhhc2g6IGhhc2ggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgYmFzZTY0IGVub2NkZWQgcmF3IHRyYW5zYWN0aW9uIHN0cmluZyBpbnRvIEBzZWUgQ29zbW9zTGlrZVRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdUeCBiYXNlNjQgZW5vY2RlZCByYXcgdHJhbnNhY3Rpb24gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtDb3Ntb3NMaWtlVHJhbnNhY3Rpb259IERlc2VyaWFsaXplZCBjb3Ntb3NMaWtlVHJhbnNhY3Rpb25cbiAgICovXG4gIGRlc2VyaWFsaXplVHJhbnNhY3Rpb24ocmF3VHg6IHN0cmluZyk6IENvc21vc0xpa2VUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgZGVjb2RlZFR4ID0gdGhpcy5nZXREZWNvZGVkVHhGcm9tUmF3QmFzZTY0KHJhd1R4KTtcbiAgICBjb25zdCB0eXBlVXJsID0gdGhpcy5nZXRUeXBlVXJsRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IHR5cGU6IFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwodHlwZVVybCk7XG4gICAgbGV0IHNlbmRNZXNzYWdlRGF0YTogTWVzc2FnZURhdGFbXTtcbiAgICBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlNlbmQpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0U2VuZE1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZSB8fCB0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0RGVsZWdhdGVPclVuZGVsZWdhdGVNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpIHtcbiAgICAgIHNlbmRNZXNzYWdlRGF0YSA9IHRoaXMuZ2V0V2l0aGRyYXdSZXdhcmRzTWVzc2FnZURhdGFGcm9tRGVjb2RlZFR4KGRlY29kZWRUeCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsKSB7XG4gICAgICBzZW5kTWVzc2FnZURhdGEgPSB0aGlzLmdldEV4ZWN1dGVDb250cmFjdE1lc3NhZ2VEYXRhRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdSZWRlbGVnYXRlKSB7XG4gICAgICBzZW5kTWVzc2FnZURhdGEgPSB0aGlzLmdldFJlZGVsZWdhdGVNZXNzYWdlRGF0YUZyb21EZWNvZGVkVHgoZGVjb2RlZFR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyB0eXBlVXJsKTtcbiAgICB9XG4gICAgY29uc3Qgc2VxdWVuY2UgPSB0aGlzLmdldFNlcXVlbmNlRnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IGdhc0J1ZGdldCA9IHRoaXMuZ2V0R2FzQnVkZ2V0RnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IHRoaXMuZ2V0UHVibGljS2V5RnJvbURlY29kZWRUeChkZWNvZGVkVHgpO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGRlY29kZWRUeC5zaWduYXR1cmVzPy5bMF0gIT09IHVuZGVmaW5lZCA/IEJ1ZmZlci5mcm9tKGRlY29kZWRUeC5zaWduYXR1cmVzWzBdKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVUcmFuc2FjdGlvbldpdGhIYXNoKFxuICAgICAgc2VxdWVuY2UsXG4gICAgICBzZW5kTWVzc2FnZURhdGEsXG4gICAgICBnYXNCdWRnZXQsXG4gICAgICBwdWJsaWNLZXksXG4gICAgICBzaWduYXR1cmUsXG4gICAgICBkZWNvZGVkVHguYm9keT8ubWVtb1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuIGFycmF5IG9mIGNvaW4gYW1vdW50cy5cbiAgICogQHBhcmFtIHtDb2luW119IGFtb3VudEFycmF5IC0gVGhlIGFycmF5IG9mIGNvaW4gYW1vdW50cyB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSAtIG9wdGlvbmFsIGZpZWxkIGZvciB0cmFuc2FjdGlvbiB0eXBlXG4gICAqL1xuICB2YWxpZGF0ZUFtb3VudERhdGEoYW1vdW50QXJyYXk6IENvaW5bXSwgdHJhbnNhY3Rpb25UeXBlPzogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgYW1vdW50QXJyYXkuZm9yRWFjaCgoY29pbkFtb3VudCkgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZUFtb3VudChjb2luQW1vdW50LCB0cmFuc2FjdGlvblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgZ2FzIGxpbWl0IGFuZCBnYXMgYW1vdW50IGZvciBhIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge0ZlZURhdGF9IGdhc0J1ZGdldCAtIFRoZSBnYXMgYnVkZ2V0IHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBnYXMgYnVkZ2V0IGlzIGludmFsaWQuXG4gICAqL1xuICB2YWxpZGF0ZUdhc0J1ZGdldChnYXNCdWRnZXQ6IEZlZURhdGEpOiB2b2lkIHtcbiAgICBpZiAoZ2FzQnVkZ2V0Lmdhc0xpbWl0IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBnYXMgbGltaXQgJyArIGdhc0J1ZGdldC5nYXNMaW1pdCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBbW91bnREYXRhKGdhc0J1ZGdldC5hbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHNlbmQgbWVzc2FnZSBmb3IgYSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtTZW5kTWVzc2FnZX0gc2VuZE1lc3NhZ2UgLSBUaGUgc2VuZCBtZXNzYWdlIHRvIHZhbGlkYXRlLlxuICAgKiBAdGhyb3dzIHtJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcn0gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzZW5kIG1lc3NhZ2UgaXMgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlU2VuZE1lc3NhZ2Uoc2VuZE1lc3NhZ2U6IFNlbmRNZXNzYWdlKSB7XG4gICAgaWYgKCFzZW5kTWVzc2FnZS50b0FkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3Moc2VuZE1lc3NhZ2UudG9BZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIFNlbmRNZXNzYWdlIHRvQWRkcmVzczogYCArIHNlbmRNZXNzYWdlLnRvQWRkcmVzcyk7XG4gICAgfVxuICAgIGlmICghc2VuZE1lc3NhZ2UuZnJvbUFkZHJlc3MgfHwgIXRoaXMuaXNWYWxpZEFkZHJlc3Moc2VuZE1lc3NhZ2UuZnJvbUFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgU2VuZE1lc3NhZ2UgZnJvbUFkZHJlc3M6IGAgKyBzZW5kTWVzc2FnZS5mcm9tQWRkcmVzcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVBbW91bnREYXRhKHNlbmRNZXNzYWdlLmFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgY29pbiBhbW91bnQuXG4gICAqIEBwYXJhbSB7Q29pbn0gYW1vdW50IC0gVGhlIGNvaW4gYW1vdW50IHRvIHZhbGlkYXRlLlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIC0gb3B0aW9uYWwgZmllbGQgZm9yIHRyYW5zYWN0aW9uIHR5cGVcbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29pbiBhbW91bnQgaXMgaW52YWxpZC5cbiAgICovXG4gIHZhbGlkYXRlQW1vdW50KGFtb3VudDogQ29pbiwgdHJhbnNhY3Rpb25UeXBlPzogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ3ZhbGlkYXRlQW1vdW50IG5vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGNvc21vcyBsaWtlIEJlY2gzMiBhZGRyZXNzIG1hdGNoZXMgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIGFuZFxuICAgKiB2YWxpZGF0ZXMgbWVtb0lkIGlmIHByZXNlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ0V4cCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gdmFsaWRhdGUgdGhlIHJvb3QgYWRkcmVzcyBhZ2FpbnN0IGFmdGVyIHRyaW1taW5nIHRoZSBtZW1vSWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRDb3Ntb3NMaWtlQWRkcmVzc1dpdGhNZW1vSWQoYWRkcmVzczogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgYWRkcmVzcyAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhZGRyZXNzQXJyYXkgPSBhZGRyZXNzLnNwbGl0KCc/bWVtb0lkPScpO1xuICAgIGlmIChcbiAgICAgICFbMSwgMl0uaW5jbHVkZXMoYWRkcmVzc0FycmF5Lmxlbmd0aCkgfHwgLy8gc2hvdWxkIGhhdmUgYXQgbW9zdCBvbmUgb2NjdXJyZW5jZSBvZiAnbWVtb0lkPSdcbiAgICAgICF0aGlzLmlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzQXJyYXlbMF0sIHJlZ0V4cCkgfHxcbiAgICAgIChhZGRyZXNzQXJyYXlbMV0gJiYgIXRoaXMuaXNWYWxpZE1lbW9JZChhZGRyZXNzQXJyYXlbMV0pKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYWRkcmVzcyBpcyB2YWxpZCBCZWNoMzIgYW5kIG1hdGNoZXMgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdFeHAgUmVndWxhciBleHByZXNzaW9uIHRvIHZhbGlkYXRlIHRoZSBhZGRyZXNzIGFnYWluc3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgYWRkcmVzcyBpcyB2YWxpZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRCZWNoMzJBZGRyZXNzTWF0Y2hpbmdSZWdleChhZGRyZXNzOiBzdHJpbmcsIHJlZ0V4cDogUmVnRXhwKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGZyb21CZWNoMzIoYWRkcmVzcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcmVnRXhwLnRlc3QoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgbWVtbyBpZCBpcyB2YWxpZFxuICAgKlxuICAgKiBAcGFyYW0gbWVtb0lkIG1lbW8gaWRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBtZW1vIGlkIGlzIHZhbGlkXG4gICAqL1xuICBpc1ZhbGlkTWVtb0lkKG1lbW9JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgbGV0IG1lbW9JZE51bWJlcjogQmlnTnVtYmVyO1xuICAgIHRyeSB7XG4gICAgICBtZW1vSWROdW1iZXIgPSBuZXcgQmlnTnVtYmVyKG1lbW9JZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWVtb0lkTnVtYmVyLmd0ZSgwKSAmJiBtZW1vSWROdW1iZXIuaXNJbnRlZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGFjY291bnRBZGRyZXNzUmVnZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZFZhbGlkYXRvckFkZHJlc3Mgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGFjY291bnRBZGRyZXNzUmVnZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gdGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gICAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZEFkZHJlc3Mgbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlmIHRoZSBhZGRyZXNzIG1hdGNoZXMgd2l0aCByZWdleCBAc2VlIGNvbnRyYWN0QWRkcmVzc1JlZ2V4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICAgKi9cbiAgaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignaXNWYWxpZENvbnRyYWN0QWRkcmVzcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBleGVjdXRlIGNvbnRyYWN0IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtFeGVjdXRlQ29udHJhY3RNZXNzYWdlfSBtZXNzYWdlIC0gVGhlIGV4ZWN1dGUgY29udHJhY3QgbWVzc2FnZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIC0gb3B0aW9uYWwgZmllbGQgZm9yIHRyYW5zYWN0aW9uIHR5cGVcbiAgICogQHRocm93cyB7SW52YWxpZFRyYW5zYWN0aW9uRXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgbWVzc2FnZSBpcyBpbnZhbGlkXG4gICAqL1xuICB2YWxpZGF0ZUV4ZWN1dGVDb250cmFjdE1lc3NhZ2UobWVzc2FnZTogRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSwgdHJhbnNhY3Rpb25UeXBlPzogVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgaWYgKCFtZXNzYWdlLmNvbnRyYWN0IHx8ICF0aGlzLmlzVmFsaWRDb250cmFjdEFkZHJlc3MobWVzc2FnZS5jb250cmFjdCkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBFeGVjdXRlQ29udHJhY3RNZXNzYWdlIGNvbnRyYWN0IGFkZHJlc3M6IGAgKyBtZXNzYWdlLmNvbnRyYWN0KTtcbiAgICB9XG4gICAgaWYgKCFtZXNzYWdlLnNlbmRlciB8fCAhdGhpcy5pc1ZhbGlkQWRkcmVzcyhtZXNzYWdlLnNlbmRlcikpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBFeGVjdXRlQ29udHJhY3RNZXNzYWdlIHNlbmRlciBhZGRyZXNzOiBgICsgbWVzc2FnZS5zZW5kZXIpO1xuICAgIH1cbiAgICBpZiAoIW1lc3NhZ2UubXNnKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgRXhlY3V0ZUNvbnRyYWN0TWVzc2FnZSBtc2c6IGAgKyBtZXNzYWdlLm1zZyk7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlLmZ1bmRzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlQW1vdW50RGF0YShtZXNzYWdlLmZ1bmRzLCB0cmFuc2FjdGlvblR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29pbiBzcGVjaWZpYyBoYXNoIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtIYXNofSBUaGUgaGFzaCBmdW5jdGlvblxuICAgKi9cbiAgZ2V0SGFzaEZ1bmN0aW9uKCk6IEhhc2gge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBDb3Ntb3NVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==